pg_constraint の内部キー、外部キーは、pg_class、pg_attribute にアクセスしないと取得できない。
・contype = 'f' ・conrelid(内部テーブル):smallint ・confrelid(外部テーブル):smallint ・conkey(内部キー): smallint[] ・confkey(外部キー): smallint[]
まず、内部キーテーブルを作成して、副問い合わせで外部キーも連結させる。 内部キー、内部キーは数値配列なので抽出に「ANY」を利用する。
[sql] SELECT origin.*, pg_class.oid as foreign_class_id, pg_class.relname as foreign_relname, pg_attribute.attnum as foreign_attnum, pg_attribute.attname as foreign_attname FROM ( SELECT pg_constraint.conrelid , pg_class.oid as pg_class_id , pg_class.relname , pg_attribute.attnum , pg_attribute.attname , pg_constraint.confrelid , pg_constraint.confkey , pg_constraint.contype FROM pg_constraint LEFT JOIN pg_attribute ON pg_constraint.conrelid = pg_attribute.attrelid AND pg_attribute.attnum = ANY(pg_constraint.conkey) LEFT JOIN pg_class ON pg_constraint.conrelid = pg_class.oid WHERE pg_constraint.contype = 'f' AND pg_constraint.conrelid = 'pg_classのID' ) AS origin LEFT JOIN pg_attribute ON origin.confrelid = pg_attribute.attrelid AND pg_attribute.attnum = ANY(origin.confkey) LEFT JOIN pg_class ON origin.confrelid = pg_class.oid ; [/sql]
テーブル一覧は「pg_tables」で 取得できるが、relfilenode などの細かい情報まではわからない。
「pg_class」「pg_tables」「pg_namespace」を利用するとある程度細かい情報まで取得できる。
*「relkind = 'r'」テーブル指定
$ pip install --upgrade pip
$ pip install chainer
chainer/chainerからサンプルをダウンロード
$ brew tap caskroom/cask
機械学習のHello-World「train_mnist.py 」を動かしてみる。 *初回時は画像素材をダウンロード *デフォルト設定だと20回学習
$ python3 train_mnist.py
GPU: -1
# unit: 1000
# Minibatch-size: 100
# epoch: 20
Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.191203 0.107441 0.942 0.9668 20.6231
2 0.0746089 0.0724309 0.9769 0.9779 43.3326
3 0.0483745 0.0715516 0.9848 0.9798 66.719
4 0.0341754 0.0789327 0.988833 0.9795 89.0281
5 0.0292061 0.0925641 0.9908 0.9752 109.421
6 0.0256707 0.0715148 0.991683 0.9806 132.37
7 0.0188833 0.0750383 0.993767 0.9808 153.467
8 0.0178651 0.0916148 0.993967 0.9798 173.683
9 0.0190301 0.0876899 0.9941 0.9805 194.203
10 0.0147034 0.0869119 0.995183 0.9813 217.873
11 0.0140121 0.088435 0.995817 0.9802 242.648
12 0.0151053 0.0939939 0.99495 0.9823 268.818
13 0.0103742 0.0957632 0.996717 0.9829 292.792
14 0.00854318 0.0905123 0.997467 0.9821 317.834
15 0.00866289 0.118263 0.99745 0.9766 343.89
16 0.0151463 0.0986677 0.99545 0.9817 368.499
17 0.00866498 0.0853589 0.99735 0.9842 395.06
18 0.00716674 0.131718 0.997883 0.9776 421.821
19 0.00858464 0.111747 0.997567 0.9834 448.749
20 0.0127154 0.103087 0.996683 0.9814 474.769
運よくNVIDIA製のグラボを積んだマシンを持っていたらGPUモードで計算させられます。 (自分は持ってない・・・) NVIDIAからCUDAダウンロード
$ brew tap homebrew/science
$ brew install opencv3 --with-contrib --with-python3 --without-python
$ vi .bashrc
export PATH=/Developer/NVIDIA/CUDA-8.0/bin:$PATH
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-7.5/lib:$DYLD_LIBRARY_PATH
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
$ ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so ~/.pyenv/versions/3.6.1/lib/python3.6/site-packages/
$ ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so ~/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/
$ python
>>import cv2
>>
最近では pkg でインストールできるので、そちらを利用しても良いかもしれない。 Download the latest version for Mac OS X
*brew、pipインストール済み *.bash_profileでpyenvのパスを通しておく
Xcodeをインストールしていると zlib がないとかで怒られる時がある。
$ xcode-select --install
$ brew update
$ brew install pyenv
$ pyenv --version
pyenv 1.1.0
*既に pyenv がインストールされている場合はアップグレード
$ brew update && brew upgrade pyenv
Mojave の場合さらに zlib がうまくインストールされていない(?)ので、手動でインストール
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
後述のAnacondaをインストールした方が楽なような気がするが、とりあえず3.x系をインストール *2019/08/25 Anaconda は別系統のため、利用目的以外インストールしない方が良い
$ pyenv install --list
$ pyenv install 3.6.1
$ pyenv versions
* system
3.6.1 (set by /Users/yoo/.python-version)
~/.python-version にファイルが作成されていると強制的に読まれるので削除しておく
$ rm ~/.python-version
$ pyenv global python3.6.1
$ pyenv local python3.6.1
$ pyenv rehash
$ pyenv versions
system
* 3.6.1 (set by /Users/yoo/.python-version)
バージョンを確認して、
pip -V
pip 9.0.1 from /Users/yoo/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages (python 3.6)
お好みで
$ pip install numpy scipy six pandas matplotlib scikit-image
*2019/8/25 pythonが衝突する事があるので Anaconda インストールには注意
$ pyenv install anaconda3-4.4.0
$ pyenv global anaconda3-4.4.0
$ pyenv local anaconda3-4.4.0
$ pyenv rehash
$ pyenv versions
system
3.6.1
* anaconda3-4.4.0 (set by /Users/yoo/.python-version)
$ python -V
Python 3.6.1 :: Anaconda 4.4.0 (x86_64)
$ conda -V
conda 4.3.21
$ conda list
get_defined_constants() そのままだと全ての define値を取得される。 引数に「true」指定すると、連想配列の「user」にユーザ指定した define値を取得できる。
$defined_constants = get_defined_constants(true);
$this->defined_constants = $defined_constants['user'];
Macのbashはデフォルトで rename がないため、for ; do を利用して一括変換する
for f in *.m4a.mp3; do mv "$f" "${f/.mp3/}"; done
f は任意の変数で、結果は「"$f"」とダブルクォートでくくって扱う
for 変数 in ファイル検索文字; do mv "$変数" "${変数/置換対象文字/置換文字}"; done
JavaScriptでAPIからデータ取得・処理する際、ネスト地獄で複雑なコードになりがち。 かと言って、AngularやReactなどのフレームワークを使うと勉強コスト、スパゲティー設計など本末転倒な結果になりやすい。
フレームワークの最大のデメリットは、
中で何が行われているか?ソースを解読しないとわからない
と言うことで、こみいった実装をせずシンプルに実装してみる。
(1) APIリクエストの配列設定 (2) Ajax処理の抽象化 (3) 並列処理の抽象化 (4) コールバック処理の考慮
$(document).on('click', '.action-api', function() {
//API設定(抽象化する必要あり)
var requests = [
{
url: 'https://xxxx/api/user',
params: {'user_id': 394},
callback: callbackUser
},
{
url: 'https://xxxx/api/order',
params: {'user_id': 394, 'item_id': 31},
callback: callbackApplication
},
];
//並列処理実行
parallelAjax(requests, doneCallback);
//各APIリクエストのコールバック
function callbackUser(results) {
console.log(results);
}
function callbackApplication(results) {
console.log(results);
}
//並列処理完了後のコールバック
function doneCallback(results) {
console.log(results);
}
});
var requestAjax = function(values){
var $ajax = $.ajax(values);
var defer = new $.Deferred();
$ajax.done(function(data, status, $ajax){
defer.resolveWith(this, arguments);
});
$ajax.fail(function(data, status, $ajax){
defer.resolveWith(this, arguments);
});
return $.extend({}, $ajax, defer.promise());
};
function parallelAjax(requests, callback) {
var results = [];
$.each (requests, function(index, value) {
var $ajax = requestAjax({url: value.url, data: value.params}).done(function(res, status) {
if (value.callback) {
value.callback(res);
}
});
results.push($ajax);
});
$.when.apply(null, results).done(function(){
if (callback) callback(results);
});
$.when.apply(null, results).fail(function(){
});
}
並列処理は後々ループで実行ため、オブジェクト配列で設定しておく。 差し当たり以下の項目で設定 ・URL ・URLパラメータ ・API処理後のコールバック (その他、POST/GETやデータ型なども設定できると良い?)
var requests = [
{
url: 'https://xxxx/api/user',
params: {'user_id': 394},
callback: callbackUser
},
{
url: 'https://xxxx/api/application',
params: {'user_id': 394},
callback: callbackApplication
},
];
こうすることで、callbackを別モデル、ファイルなどに分離して記述できるかと。 実用レベルだと、APIリクエスト設定も動的に抽象化が必要ですが。。。
並列処理をする際「jQuery.Deferred」を利用 ざっとした流れは、 (1) Deferredオブジェクトを作成 (2) Ajaxリクエスト (3) Ajax処理後返り値を Deferred.resolveWith() でコールバック
詳しくは、 ・「爆速でわかるjQuery.Deferred超入門」 ・「結局jQuery.Deferredの何が嬉しいのか分からない、という人向けの小話」を参照
var requestAjax = function(values) {
var $ajax = $.ajax(values);
var defer = new $.Deferred();
$ajax.done(function(data, status, $ajax) {
defer.resolveWith(this, arguments);
});
$ajax.fail(function(data, status, $ajax) {
defer.resolveWith(this, arguments);
});
return $.extend({}, $ajax, defer.promise());
};
(1) 配列化したリクエストをループで処理 (2) Ajax実行 (3) APIリクエストで設定したコールバックを実行 (3) $.whenで並列処理完了後の処理
function parallelAjax(requests, callback) {
var results = [];
$.each (requests, function(index, value) {
var $ajax = requestAjax({url: value.url, data: value.params}).done(function(res, status) {
if (value.callback) {
value.callback(res);
}
});
results.push($ajax);
});
$.when.apply(null, results).done(function(){
if (callback) callback(results);
});
$.when.apply(null, results).fail(function(){
});
}
SublimeTextの文字コードはUTF8のため、基本的にその他エンコードファイルは文字化けしてしまうが、以下をインストールすることでShift-JISファイルを開くことができる。
・「ConvertToUTF8」 ・「Codecs33」
SublimeTextのパッケージインストールコマンドでインストール
Codecs33-osx.zipをダウンロードし、
~/Library/Application Support/Sublime Text 3/Packages
に「Codecs33」として展開
SublimeTextを再起動すると、SJISファイルを開くことができる。
SJISで開いているだけなので、実際にUTF-8で保存するには、「File > Save with Encoding > UTF-8」を選択する。