[Python] 344 MySQL自動検索 全テーブル対象

[M1 Mac, Big Sur 11.7.2, Python 3.10.4, MySQL 8.0.31]

前の記事は1つのテーブルを対象とする自動検索でしたが、今回は全テーブルを対象にしました。

これまでネット情報を見渡してきて、データベース技術者の方々には案外プログラミングが苦手な方が多いのではないかと感じました。修得すべきスキルが広範なためプログラミングまで手が回らないのでしょうか。

import time,datetime,subprocess,os
import MySQLdb

# MySQLの起動確認
proc = subprocess.run("mysqladmin ping", shell=True, stdout= subprocess.PIPE, stderr = subprocess.PIPE)
ping_result = proc.stdout.decode('UTF-8')
print(ping_result)

# 起動していなければ起動
detect = "alive" in ping_result
if detect == False:
    os.system('mysql.server start')
else:
    print("MySQLは起動しています")

# MySQLに接続
conn = MySQLdb.connect(user='root')
cur = conn.cursor()

# 処理時間測定開始
start = time.time()

# データベースdataを選択
select_db = f"use data"
cur.execute(select_db)

# 全テーブルを取得
search_tables = f"show tables"
cur.execute(search_tables)
tables = cur.fetchall()
# print(f"tables : {tables}")

# 検索
for table in tables:
    print(f"table : {table}")
    table2 = str(table).replace('(','').replace(')','').replace(",",'').replace("'",'`')
    search = f"SELECT * FROM {table2} WHERE `Name` LIKE '%suzuki%'"
    cur.execute(search)
    rows = cur.fetchall()
    for row in rows:
        print(row)

    # 処理時間算出(秒)
    process_time = time.time() - start
    td = datetime.timedelta(seconds = process_time).total_seconds()

    # 小数点第2位まで表示
    td_2f = f'{td:.2f}'
    print(td_2f)

conn.close()
os.system('mysql.server stop')

[Python] 343 MySQL自動検索

[M1 Mac, Big Sur 11.7.2, Python 3.10.4, MySQL 8.0.31]

MySQLを起動、ログイン、データベース選択、検索まで自動的に行うスクリプトを作成しました。

処理時間はphpMyAdminよりも24%長く掛かってしまいました。

データベースを作ってしまえばあとは検索するだけなので、開発環境Aの方が総合的に優れていると取りあえず判断しました。

ターミナルでのMySQL管理に期待したのですが、なんとも残念な結果です。

ただ全テーブル内検索の場合は対象テーブルが400以上あってハードにかなり負荷をかけるため、単純に処理時間が比例するとも限りません。

もう少し検討が必要かもしれません。

import time,datetime,subprocess,os
import MySQLdb

# MySQLの起動確認
proc = subprocess.run("mysqladmin ping", shell=True, stdout= subprocess.PIPE, stderr = subprocess.PIPE)
ping_result = proc.stdout.decode('UTF-8')
print(ping_result)

# 起動していなければ起動
detect = "alive" in ping_result
if detect == False:
    os.system('mysql.server start')
else:
    print("MySQLは起動しています")

# MySQLに接続
conn = MySQLdb.connect(user='root')
cur = conn.cursor()

# 処理時間測定開始
start = time.time()

# データベースtestを選択
select_db = f"use test"
cur.execute(select_db)

# 検索
search = f"SELECT * FROM `TableA` WHERE `Address` LIKE '%東京都%'"
cur.execute(search)
rows = cur.fetchall()
for row in rows:
    print(row)

# 処理時間算出(秒)
process_time = time.time() - start
td = datetime.timedelta(seconds = process_time).total_seconds()

# 小数点第2位まで表示
td_2f = f'{td:.2f}'
print(td_2f)

conn.close()
os.system('mysql.server stop')

[Python] 342 MySQL自動起動 ターミナルコマンド

[M1 Mac, Big Sur 11.7.2, Python 3.10.4, MySQL 8.0.31]

HomebrewからインストールしたMySQLを自動起動させるスクリプトを書きました。パスワード入力は無効にしています。

Pythonはデータ型を意識しなくてもいいのでメモ感覚で楽に書けますね。

import time,datetime,subprocess,os

start = time.time()

# MySQLの起動確認
proc = subprocess.run("mysqladmin ping", shell=True, stdout= subprocess.PIPE, stderr = subprocess.PIPE)
ping_result = proc.stdout.decode('UTF-8')
print(ping_result)

# 起動していなければ起動
detect = "alive" in ping_result
if detect == False:
    os.system('mysql.server start')
else:
    print("MySQLは起動しています")

# 処理時間算出(秒)
process_time = time.time() - start
td = datetime.timedelta(seconds = process_time).total_seconds()

# 小数点第2位まで表示
td_2f = f'{td:.2f}'
print(td_2f)

[Python] 341 MySQL高速化 非Webサーバ環境

[M1 Mac, Big Sur 11.7.2, Python 3.10.4, MySQL 8.0.31]

MySQL高速化のため非Webサーバ環境でデータベースを作成してみました。

その結果、テーブルの作成時間を3割削減できました。

クエリやテーブルの最適化など他の方法についても試していきます。

import MySQLdb
import pandas as pd
import time,datetime,glob,csv

start = time.time()

num = 1
for file in glob.glob(f'/*.csv'):
    # CSVファイル名を抽出しtable名にする
    tablename = file[-12:-4]
    # print(tablename)

    column_title = ['A', 'B', 'C', 'D', 'E']
    column_type = ['varchar(256)','varchar(512)','varchar(512)','int(9)','int(8)']

    # SQL文に使う列名&データ型の文字列を作成する
    column_l = []
    for ti,ty in zip(column_title,column_type):
        column = ti + ' ' + str(ty)
        column_l.append(column)

    # print(column_l)

    # SQL仕様に整形
    column_l_str = str(column_l).replace('[','(').replace(']',')').replace("'",'')

    # print(column_l_str)

    # MySQLに接続
    conn = MySQLdb.connect(user='root')
    cur = conn.cursor()

    # データベースdataにtableを作成する
    sql = f"create table test.{tablename} {column_l_str} CHARACTER SET utf8mb4"
    cur.execute(sql)
    cur.execute('begin')

    # CSVファイルを読み込み、各行をtableに挿入する
    with open(file, 'rt', encoding='UTF-8') as f:
        reader = csv.reader(f)
        for i,row in enumerate(reader):
            # print(f'row {row}')
            if i != 0:
                row_str = str(row).replace('[','(').replace(']',')')
                # print(f'{i+1}:{row_str}')
                sql = f'insert into test.{tablename} values {row_str}'
                cur.execute(sql)

    cur.execute('commit')
    conn.close()

    # 処理時間算出(秒)
    process_time = time.time() - start
    td = datetime.timedelta(seconds = process_time).total_seconds()

    # 小数点第2位まで表示
    td_2f = f'{td:.2f}'
    print(f'{num}:{td_2f}')

    num = num + 1

[Python] 340 MySQLによるDB作成 Apple Silicon, MAMP

[M1 Mac, Big Sur 11.7.2, Python 3.10.4, MAMP 6.7, MySQL 5.7.39]

数千万件の巨大データベースを作成するため久しぶりにMySQLをいじっています。MAMPの設定は2021年4月以来なので1年9ヶ月ぶりになります。

Intel Macでは問題なかったMAMPのポート設定(Apache:80, MySQL:3306)では下図のエラーになるためデフォルト設定(Apache:8888, MySQL:8889)で使っています。

phpMyAdminで管理していますが、データが大きすぎるからか動作が重いように感じます。オラクルが開発しているMySQL Workbenchを試してみたいです。

# /etc/apache2/httpd.confに以下を追記

ServerName localhost:80
~ $ sudo httpd -k restart
~ $ sudo lsof -i:80
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
httpd   37303 root    4u  IPv6 0xf22e6e946f960a71      0t0  TCP *:http (LISTEN)
httpd   41597 _www    4u  IPv6 0xf22e6e946f960a71      0t0  TCP *:http (LISTEN)

# httpdは正常に動作しているがMAMPはエラー。MAMPの不具合?
デフォルト設定
import csv, mysql.connector
import pandas as pd
import time,datetime,glob

# 処理時間を測定
start = time.time()

config = {
    'user': 'root',
    'password': 'root',
    'host': 'localhost',
    'port': 8889,
    'raise_on_warnings': True
}

num = 1
for file in glob.glob(f'/*.csv'):
    # CSVファイル名を抽出しtable名にする
    tablename = file[-12:-4]
    # print(tablename)

    column_title = ['A', 'B', 'C', 'D', 'E']
    column_type = ['varchar(256)','varchar(512)','varchar(512)','int(9)','int(8)']

    # SQL文に使う列名&データ型の文字列を作成する
    column_l = []
    for ti,ty in zip(column_title,column_type):
        column = ti + ' ' + str(ty)
        column_l.append(column)

    # print(column_l)

    # SQL仕様に整形
    column_l_str = str(column_l).replace('[','(').replace(']',')').replace("'",'')

    # print(column_l_str)

    # MySQLに接続
    conn = mysql.connector.connect(**config)
    cur = conn.cursor()

    # データベース名dataにtableを作成する(4バイト文字対応)
    sql = f"create table data.{tablename} {column_l_str} CHARACTER SET utf8mb4"
    cur.execute(sql)
    cur.execute('begin')

    # CSVファイルを読み込み、各行をtableに挿入する
    with open(file, 'rt', encoding='UTF-8') as f:
        reader = csv.reader(f)
        for i,row in enumerate(reader):
            # print(f'row {row}')
            if i != 0:
                row_str = str(row).replace('[','(').replace(']',')')
                # print(f'{i+1}:{row_str}')
                sql = f'insert into data.{tablename} values {row_str}'
                cur.execute(sql)

    cur.execute('commit')
    conn.close()

    # 処理時間算出(秒)
    process_time = time.time() - start
    td = datetime.timedelta(seconds = process_time).total_seconds()

    # 小数点第2位まで表示
    td_2f = f'{td:.2f}'
    print(f'{num}:{td_2f}')

    num = num + 1

[C++] 232 FLTK : ハイパーリンクの代替手段検討

[M1 Mac, Big Sur 11.7.2, clang 13.0.0, FLTK 3.8.1, NO IDE]

ダイアログ内のテキストから外部サイトへハイパーリンクさせたかったのですが難易度が高いため、Menuからの選択でコールバック関数によりリンク先がブラウザで開くようにしました。

Fl_Menu_ItemでHelpメニューを設定すると自動的にMacOSのHelp内を検索する窓が出現しました。これは不要なのでHelpをHELPに一時的に変更しています。検索窓が出ない方法が分かり次第、Helpに戻すつもりです。

今になって思い浮かんだのですが、テキスト部分をFl_Buttonにて枠なしで作成し前後に文字列をくっ付ければハイパーリンク風にできなくもないですね。

Helpの場合
HELPの場合
static Fl_Menu_Item	items[] = {
        { "★", 0, 0, 0, FL_SUBMENU },
        { "読込", 0, loadFavList, 0, 0 },
        { "保存", 0, 0, 0, FL_SUBMENU },
        { "名前を付けて保存", 0, saveFavList, 0, 0 },
        { "自動保存", 0, saveFavListAuto, 0, 0 },
        { 0 },
        { "消去", 0, deleteFavList, 0, 0 },
        { 0 },
        { "履歴", 0, 0, 0, FL_SUBMENU },
        { "消去", 0, deleteHistory, 0, 0 },
        { 0 },
        { "HELP", 0, 0, 0, FL_SUBMENU },
        { "Website", 0, openWebsite, 0, 0 },
        { 0 },
    #ifdef DEV
        { "開発", 0, 0, 0, FL_SUBMENU },
        { "開発モード", 0, showSubWindow, 0, 0 },
        { 0 },
        { 0 }
    #else
        { 0 },
    #endif
    };
void openWebsite(Fl_Widget*, void*){
    string cmd = "open \"リンク先のURL\"";
    system(cmd.c_str());
}

[C++] 231 wxWidgets : 外部サイトへのハイパーリンク

[M1 Mac, Big Sur 11.7.2, clang 13.0.0, wxWidgets 3.2.0, NO IDE]

ちょうどいいサンプルをGitHubに見つけ、早速活用させていただきました。見にくいですが青字部分がリンクになっています。

wxWidgetsに対する興味が増してきたので自分のFLTKアプリを移植しようか考えたものの、wxButtonの色設定ができないのであきらめました。OSのLook&Feelに依存している分、自由度は低いようです。

となるとFLTKにHyperLink機能実装となりますが、Fl_Widgetよりさらに上の概念を構築する必要がありハードルはかなり高そうです。

#include <wx/debug.h>
#include <wx/app.h>
#include <wx/frame.h>
#include <wx/hyperlink.h>
#include <wx/panel.h>
#include <wx/sizer.h>
#include <wx/stattext.h>

namespace Examples {
  class Frame : public wxFrame {
  public:
    Frame() : wxFrame(nullptr, wxID_ANY, "HyperlinkCtrl example") {
      panel->SetSizer(boxSizerLinks);
      boxSizerLinks->Add(staticText1, 0, wxSTRETCH_NOT, 0);
      boxSizerLinks->Add(hyperlinkCtrl1, 0, wxSTRETCH_NOT, 0);
      boxSizerLinks->Add(staticText2, 0, wxSTRETCH_NOT, 0);
      boxSizerLinks->Add(hyperlinkCtrl2, 0, wxSTRETCH_NOT, 0);
    }
    
  private:
    wxPanel* panel = new wxPanel(this);
    wxBoxSizer* boxSizerLinks = new wxBoxSizer(wxVERTICAL);
    wxStaticText* staticText1 = new wxStaticText(panel, wxID_ANY, " Googleへのリンク");
    wxHyperlinkCtrl* hyperlinkCtrl1 = new wxHyperlinkCtrl(panel, wxID_ANY, "Google", "https://www.google.com/");
    wxStaticText* staticText2 = new wxStaticText(panel, wxID_ANY, " Yahoo!へのリンク");
    wxHyperlinkCtrl* hyperlinkCtrl2 = new wxHyperlinkCtrl(panel, wxID_ANY, "Yahoo!", "https://www.yahoo.co.jp/");
  };

  class Application : public wxApp {
    bool OnInit() override {
      (new Frame())->Show();
      return true;
    }
  };
}

wxIMPLEMENT_APP(Examples::Application);

参考サイト

[C++] 230 ウィジェットツールキットwxWidgetsを試す Makefile

[M1 Mac, Big Sur 11.7.2, clang 13.0.0, wxWidgets 3.2.0, NO IDE]

FLTKにはハイパーリンク機能がないことが判明したため、wxWidgetsからの機能移植を模索しています。

wxWidgets導入自体は今年8月に済ませていたので、参考サイトから簡単なコードを拝借してMakefileを自作しビルドしてみました。

GitHubのソースからビルドしたwxWidgetsが不完全であることが分かり、Homebrew版に切り替えました。ただHomebrew版はdylibしかなく、静的ライブラリは別途ビルドする必要があるようです。

マクロが多くて初心者泣かせのサンプルコードでしたが、まあそのうち慣れるでしょう。

FLTKに比べてかなり多機能なのにこれもまたクセが強すぎるためか、ユーザー数はさほど多くないようです。

# コンパイラ
COMPILER = clang++
DEBUG = -g

# フラグ
CPPFLAGS = $(shell wx-config --inplace --cxxflags) -std=c++17
LDFLAGS = $(shell wx-config --inplace  --libs) -lc++

# includeパス(-I)
INCLUDE = -I./include -I/Volumes/DATA_m1/code/cpp/mylib/include \
-I/opt/homebrew/Cellar/wxwidgets/3.2.0_1/include/wx-3.2

# ライブラリ(-l)
LIBRARY0 =

# ライブラリパス(-L)
LIBRARY = -L/opt/homebrew/Cellar/wxwidgets/3.2.0_1/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = test

# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY0) $(LDFLAGS) $(LIBRARY)
	cp $(TARGETDIR)/$(TARGET) $(TARGET)
	rm -f $(TARGET)

# 全ソース強制コンパイル
.PHONY:all
all: clean $(TARGET)

# 全ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET)

参考サイト

[C++] 229 Visual C++ : StoreAppLicense内データを取得

[Windows11, Visual C++2017, FLTK 1.3.8, NO IDE]

ストアアプリ起動時にアドオンライセンスの取得状況をチェックする仕組みを作りました。

StoreAppLicenseデータをJSON型で入手し、これを解析してアドオンライセンスのbool値を取得します。

json11というライブラリを使って解析しました。

#include "json11.hpp"
#include <winrt/Windows.Services.Store.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>

using namespace winrt;
using namespace winrt::Windows::Services::Store;
using namespace winrt::Windows::Foundation::Collections;

bool AddOn1_bool;
bool AddOn2_bool;

int main(int argc, char** argv) {
	// StoreContext取得
	StoreContext _storeContext = StoreContext::GetDefault();

	// StoreAppLicenseを非同期にて取得
	winrt::Windows::Foundation::IAsyncOperation<StoreAppLicense> _storeAppLicense = _storeContext.GetAppLicenseAsync();
	StoreAppLicense _storeAppLicense2 = _storeAppLicense.get();

	// StoreAppLicenseデータをJSON型で取得
	hstring data = _storeAppLicense2.ExtendedJsonData();
	string data_str = winrt::to_string(data);

	// JSONデータを解析
	string err, err1, err2;
    auto data_json = json11::Json::parse(data_str, err);

	// アドオン名とライセンスbool値を取得
	int num_addon = 1;
	for (auto &k : data_json["productAddOns"].array_items()) {
        cout << num_addon << ": " <<  k.dump() << endl;

		switch (num_addon){
			case 1:{
				auto data_json1 = json11::Json::parse(k.dump(), err1);
				string AddOnName1 = data_json1["inAppOfferToken"].string_value();
				AddOn1_bool = data_json1["isActive"].bool_value();
				cout << AddOnName1 << " : " << AddOn1_bool << endl;
				break;
			}
			case 2:{
				auto data_json2 = json11::Json::parse(k.dump(), err2);
				string AddOnName2 = data_json2["inAppOfferToken"].string_value();
				AddOn2_bool = data_json2["isActive"].bool_value();
				cout << AddOnName2 << " : " << AddOn2_bool << endl;
				break;
			}
		}
		num_addon++;
	}
	<以下略>
}

[C++] 228 Visual C++ : Makefile NMAKE版

[Windows11, Visual C++2017, FLTK 1.3.8, NMAKE 14.30, NO IDE]

カラーアプリのMakefileをGNU Make版からMicrosoft NMAKE版に書き換えました。

まずMakefileの文字コードをUTF-8からShift-JISに変更しました。変更しておかないと” U1033 fatal error : ‘:’ unexpected”という意味不明なエラーに悩まされます。

NMAKEではaddprefixやpatsubstのようなこじゃれた関数は用意されていなかったので元のもっさりした書き方に戻しました。あと全依存ファイルを意味する自動変数$^を$**に書き換えました。

修正はこの3点のみでした。これなら普段はGNU Makeで開発し、公開するときだけNMAKEを使っても良さそうです。

StackOverflow英語版ではNMAKEは低機能で使い物にならないなど散々な書かれようですが、ライセンス抵触回避のために存在してくれるだけありがたいです。

なおMacOSで製作したアプリをソースコード公開なしで頒布したい場合は修正BSDライセンスのCMakeでビルドするのが適切かと思われます。

今回のWindowsのケースでもCMakeを使うという選択肢はありましたが、手間を考えてNMAKEにしました。実際初めてでも1時間足らずで移行できました。コツを掴んだので次回からはものの数分でしょう。

# NMAKE版
# コンパイラ設定他
COMPILER = cl
DEBUG = /D "_DEBUG"
CONSOLE = /SUBSYSTEM:CONSOLE
WINDOWS = /SUBSYSTEM:WINDOWS
LINKER = LINK
RESOURCE = "ColorSampleJP.res"

# オプション設定
CPPFLAGS = /std:c++17 /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl  /Zc:inline /fp:precise /D "_UNICODE" \
/errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /c /diagnostics:column /EHsc
LDFLAGS = /DEBUG /MACHINE:X64 /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcmtd.lib /OPT:REF /INCREMENTAL:NO

# includeパス(-I)
INCLUDE = /I"C:\packages\fltk-1.3.8\include" \
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\atlmfc\include" \
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\cppwinrt" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared" \
/I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\Include\um" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um" \
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\include" \
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\winrt"

INCLUDE2 = /I"D:\code\VC++\Projects\ColorSampleJP\include" \
/I"D:\code\VC++\Projects\ColorConvert\ColorConvert" \
/I"D:\code\VC++\Projects\Split\Split" \
/I"D:\code\VC++\mylib_vc\include" \
/I"D:\code\VC++\Projects\ColorSampleJP\images" \

# ライブラリ(-l)
LIBRARY_l = /DYNAMICBASE "wsock32.lib" "comctl32.lib" \
"kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" \
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" \
"uuid.lib" "odbc32.lib" "odbccp32.lib" \
"CharExtract.lib" "Funcs.lib" "ColorConvert.lib" "Split.lib"

LIBRARY_l_Debug = "fltkd.lib" "fltk_jpegd.lib" "fltk_imagesd.lib" "fltk_pngd.lib" "fltk_formsd.lib" "fltk_gld.lib" "fltk_zd.lib"
LIBRARY_l_Release = "fltk.lib" "fltk_jpeg.lib" "fltk_images.lib" "fltk_png.lib" "fltk_forms.lib" "fltk_gl.lib" "fltk_z.lib"

# ライブラリパス(-L)
LIBRARY_L = /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\ATLMFC\lib\x64" \
/LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\lib\x64" \
/LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" \
/LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64" \
/LIBPATH:"C:\Program Files (x86)\Windows Kits\10\\lib\10.0.22000.0\\um\x64" \
/LIBPATH:"D:\code\VC++\mylib_vc\lib"

LIBRARY_L_Debug = /LIBPATH:"C:\packages\fltk-1.3.8\lib\Debug" \
/LIBPATH:"D:\code\VC++\Projects\ColorConvert\x64\Debug" \
/LIBPATH:"D:\code\VC++\Projects\Split\x64\Debug"
LIBRARY_L_Release = /LIBPATH:"C:\packages\fltk-1.3.8\lib\Release" \
/LIBPATH:"D:\code\VC++\Projects\ColorConvert\x64\Release" \
/LIBPATH:"D:\code\VC++\Projects\Split\x64\Release"

# ソースファイル
SRCDIR = .\src
SRCS = $(SRCDIR)\btnAction.cpp $(SRCDIR)\FileChooser.cpp $(SRCDIR)\FileChooser2.cpp $(SRCDIR)\main.cpp \
$(SRCDIR)\modalDialog.cpp $(SRCDIR)\searchLocation.cpp $(SRCDIR)\csvProcessChar.cpp $(SRCDIR)\AddOn.cpp \
$(SRCDIR)\AddOnDialog.cpp $(SRCDIR)\AddOnPurchase.cpp

# オブジェクトファイル
OBJDIR = .\obj
OBJS = $(OBJDIR)\btnAction.obj $(OBJDIR)\FileChooser.obj $(OBJDIR)\FileChooser2.obj $(OBJDIR)\main.obj \
$(OBJDIR)\modalDialog.obj $(OBJDIR)\searchLocation.obj $(OBJDIR)\csvProcessChar.obj $(OBJDIR)\AddOn.obj \
$(OBJDIR)\AddOnDialog.obj $(OBJDIR)\AddOnPurchase.obj

# 実行ファイル
TARGETDIR = .\bin
TARGET = ColorSampleJP.exe

# cppファイルからobjファイル作成 $**:全依存ファイル
# デバッグ
$(OBJS): $(SRCS)
	$(COMPILER) $(CPPFLAGS) $(DEBUG) $(INCLUDE) $(INCLUDE2) $**
	move *.obj $(OBJDIR) >nul

# リリース
# $(OBJS): $(SRCS)
# 	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(INCLUDE2) $^
# 	move *.obj $(OBJDIR) >nul

# objファイルから実行ファイル作成
# デバッグ
$(TARGET):
	$(LINKER) $(CONSOLE) $(LIBRARY_l) $(LIBRARY_l_Debug) $(LIBRARY_L) $(LIBRARY_L_Debug) $(OBJS) $(LDFLAGS) $(RESOURCE)
	rename btnAction.exe $(TARGET)
	move $(TARGET) $(TARGETDIR) >nul

# リリース
# $(TARGET):
# 	$(LINKER) $(WINDOWS) $(RELEASE) $(LIBRARY_l) $(LIBRARY_l_Release) $(LIBRARY_L) $(LIBRARY_L_Release) $(OBJS) $(LDFLAGS) $(RESOURCE)
# 	rename btnAction.exe $(TARGET)
# 	move $(TARGET) $(TARGETDIR) >nul

# ビルド
.PHONY:all
all: obj $(TARGET)

.PHONY:all2
all2: clean obj $(TARGET)

# objファイル作成
.PHONY:obj
obj: $(OBJS)

# ファイル削除
.PHONY:clean
clean:
	del /Q $(TARGETDIR)\$(TARGET) $(OBJS) vc140.idb vc140.pdb btnAction.pdb

# 変数確認
.PHONY:var
var:
	echo $(SRCS)
	echo $(OBJS)