黒い画面を素早く出す
黒い画面を素早く出す
CodeRunnerなんて要らなかったんや(たぶん)
困ったこと
スクリプト系のプログラミングをしていて、毎回ターミナルから実行するのが面倒くさい
前提
- Mac OSX
- Subline Text 3
解決方法(基本)
Cmd + b
を押す。
解決方法(応用)
環境の指定や実行引数を与えたいなど、やっぱりターミナルから起動したいというケースもある。その場合は、Terminal
という拡張パケージを導入する。
パッケージのインストール
Cmd + Shift + p
でコマンドパレットを起動Package Controll: Install Package
を選択Terminal
を選択
確認
Cmd + Shift + T
で現在の作業ファイルの場所をカレントとして、ターミナルが起動する
以上
ユニケージしてみた。(その4:LV3MAKE編)
ユニケージしてみた。(その4:LV3MAKE編)
「すごいですね、やってることばかですけど」は最高の褒め言葉
Input(LV2データ)
前回のLV2MAKEで作成されたフォーマットされたデータ
mba:YOKIN 7010oncajon$ cat DATA/LV2/YOKIN/20870301_20870331 20870301 60000 _ カード_ENET000000 500000 20870307 30000 _ カード_ENET000001 470000 20870316 5000 _ 電気料 465000 20870319 _ 200000 給料振込_会社名 665000 20870327 3000 _ ガスダイ3ガツ 662000 20870328 1000 _ ゲスイドウ_シヨウリヨウ 661000 20870328 _ 9000 交通費振込_会社名 670000
Process(LV3MAKE)
正規化された月別のデータを作成する。ポイントは以下。
- LV2データの重複を除外する
- 年月単位でファイルを分割する。ユニケージコマンドの
keycut
が便利
mba:YOKIN 7010oncajon$ cat SHELL/LV3MAKE.YOKIN #!/bin/bash -vx # # LV3MAKE.YOKIN 預金データのLV3MAKE # # usage: LV3MAKE.YOKIN # # writen by 7010onCajon / Date: 20140709 # ホームディレクトリ homed=/Users/7010oncajon/Documents/Programing/UNICAGE/YOKIN # ログディレクトリ logd=${homed}/LOG mkdir -p ${logd} logf=${logd}/LOG.$(basename $0).$(date +%Y%m%d) exec 2> ${logf} # tmpディレクトリ tmpd=${homed}/TMP mkdir -p ${tmpd} tmp=${tmpd}/$$.$(basename $0).$(date +%Y%m%d).$(date +%H%M%S) # LV2データディレクトリ lv2d=${homed}/DATA/LV2/YOKIN mkdir -p ${lv2d} # LV3データディレクトリ lv3d=${homed}/DATA/LV3/YOKIN mkdir -p ${lv3d} # エラー処理 ERROR_EXIT(){ echo ERROR__ $(basename $0) rm -f ${tmp}-* exit 1 } # LV2データの読み込み tgt_file=${lv2d}/????????_???????? # 1:年月日 2:お引出し 3:お預入れ 4:お取り扱い内容 5:残高 cat ${tgt_file} | # 年月日でソート LANG=C sort -k1,1 | # 重複列の除外 uniq | # 年月の追加 # 1:年月 2:年月日 3:お引出し 4:お預入れ 5:お取り扱い内容 6:残高 awk '{print substr($1,1,6), $0}' | # 年月単位でファイルの分割 # 1:年月日 2:お引出し 3:お預入れ 4:お取り扱い内容 5:残高 keycut -d ${lv3d}/%1 [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT echo SUCCESS $(basename $0) rm -f ${tmp}-* exit 0
keycut
ユニケージコマンドはman2
というコマンドで仕様を確認できる。
mba:YOKIN 7010oncajon$ man2 keycut Tukubaiオンラインコマンドマニュアル keycut(1) 【名前】 keycut : キーでファイルを分割 【書式】 Usage : keycut [options] <filename> <file> Options : -d : キーの削除 : -a : ファイル追記 : -z : 圧縮 Version : Thu Dec 15 13:46:38 JST 2011 (Version: zlib-1.2.3 ) 【説明】 <file>を読み込み、分割先ファイル名<filename>で指定したキーフィールドの値が同一 の行でファイルを分割する。例えば、第2フィールドが同じ値を持つ行でファイルを分割 したいときは、data.%2のように<filename>を指定する。この時、分割先ファイル名は data.(第2フィールドの値)となる。
Output(LV3データ)
このデータだけでも十分利用価値はありそうだな。
mba:YOKIN 7010oncajon$ cat DATA/LV3/YOKIN/208703 | keta 20870301 60000 _ カード_ENET000000 500000 20870307 30000 _ カード_ENET000001 470000 20870316 5000 _ 電気料 465000 20870319 _ 200000 給料振込_会社名 665000 20870327 3000 _ ガスダイ3ガツ 662000 20870328 1000 _ ゲスイドウ_シヨウリヨウ 661000 20870328 _ 9000 交通費振込_会社名 670000
以上。次回はLV4MAKEです。
ユニケージしてみた。(その3:LV2MAKE編)
ユニケージしてみた。(その3:LV2MAKE編)
和暦表記はなくなればいいのに。
Input(LV1データ)
入力のデータはWeb通帳からダウンロードできるCSVファイルとする。ファイル名や中身に和暦表現が含まれているのが面倒である。なお、以下のデータはダミーです。
mba:YOKIN 7010oncajon$ cat DATA/CSV/平成\ 99年\ 3月\ 1日から平成\ 99年\ 3月\ 31日.csv "年月日(和暦)","お引出し","お預入れ","お取り扱い内容","残高" H99.03.01,60000,,"カード ENET000000",500000 H99.03.07,30000,,"カード ENET000001",470000 H99.03.16,5000,,"電気料",465000 H99.03.19,,200000,"給料振込 会社名",665000 H99.03.27,3000,,"ガスダイ3ガツ",662000 H99.03.28,1000,,"ゲスイドウ シヨウリヨウ",661000 H99.03.28,,9000,"交通費振込 会社名”,670000
Process(LV2MAKE)
LV2データを生成するシェルです。主な処理は以下。
あっ、ユニケージコマンドを使っていない。。。awkバンザイ、sedバンザイ
mba:YOKIN 7010oncajon$ cat SHELL/LV2MAKE.YOKIN #!/bin/bash -vx # # LV2MAKE.YOKIN 預金データのLV2MAKE # # usage: LV2MAKE.YOKIN # # writen by 7010onCajon / Date: 20140707 # ホームディレクトリ homed=/Users/7010oncajon/Documents/Programing/UNICAGE/YOKIN # ログディレクトリ logd=${homed}/LOG mkdir -p ${logd} logf=${logd}/LOG.$(basename $0).$(date +%Y%m%d) exec 2> ${logf} # tmpディレクトリ tmpd=${homed}/TMP mkdir -p ${tmpd} tmp=${tmpd}/$$.$(basename $0).$(date +%Y%m%d).$(date +%H%M%S) # LV1データディレクトリ lv1d=${homed}/DATA/CSV mkdir -p ${lv1d} # LV2データディレクトリ lv2d=${homed}/DATA/LV2/YOKIN mkdir -p ${lv2d} # エラー処理 ERROR_EXIT(){ echo ERROR__ $(basename $0) rm -f ${tmp}-* exit 1 } # LV1データ(CSVファイルの読み込み) export LANG=C ls ${lv1d}/平成*年*月*日から平成*年*月*日.csv | while read csv_file; do # LV2データのファイル名を取得 # yyyymmdd_yyyymmdd lv2_file=$( echo "${csv_file}" | sed -e 's/.*平成 \(.*\)年 \(.*\)月 \(.*\)日から平成 \(.*\)年 \(.*\)月 \(.*\)日.csv/\1 \2 \3 \4 \5 \6/' | awk '{printf("%04s%02s%02s_%04s%02s%02s\n", $1+1988, $2, $3, $4+1988, $5, $6)}' [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT ) # LV2データの作成 # 1:"年月日(和暦)",2:"お引出し",3:"お預入れ",4:"お取り扱い内容",5:"残高" cat "${csv_file}" | # 文字コードの変換 nkf -wLux | # 先頭のcsvヘッダを除去する tail -n +2 | # (末尾の)空行を除去する sed '/^$/d' | # nullを_に置換 sed 's/^,/_,/g' | sed 's/,,/,_,/g' | sed 's/,$/_,/g' | # 半角および全角スペースを_および_に変換する sed 's/ /_/g' | sed 's/ /_/g' | # "(ダブルクォート)を除去する sed 's/^"//g' | sed 's/,"/,/g' | sed 's/",/,/g' | sed 's/"$//g' | # ,(カンマ)を半角スペースに変換する sed 's/,/ /g' | # 和暦(平成)を西暦に変換 awk '{ y=substr($1,2,2)+1988; m=substr($1,5,2); d=substr($1,8,2); $1=sprintf("%04s%02s%02s", y, m, d); print; }' | # ファイル出力 # 1:年月日(西暦) 2:お引出し 3:お預入れ 4:お取り扱い内容 5:残高 cat > ${lv2d}/${lv2_file} [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT done echo SUCCESS $(basename $0) rm -f ${tmp}-* exit 0
Output(LV2データ)
だいぶスッキリとしたデータになりました。なおketa
コマンドは桁揃えをしてくれるユニケージコマンドです。
mba:YOKIN 7010oncajon$ cat DATA/LV2/YOKIN/20870301_20870331 | keta 20870301 60000 _ カード_ENET000000 500000 20870307 30000 _ カード_ENET000001 470000 20870316 5000 _ 電気料 465000 20870319 _ 200000 給料振込_会社名 665000 20870327 3000 _ ガスダイ3ガツ 662000 20870328 1000 _ ゲスイドウ_シヨウリヨウ 661000 20870328 _ 9000 交通費振込_会社名 670000
以上
ユニケージしてみた。(その2:基本設計編)
ユニケージしてみた。(その2:基本設計編)
ニーズに応えるためなんかじゃない。ただ作りたいから作るんだ。
ユニケージの環境ができあがったので、簡単な預金データ可視化アプリを作ってみる。
要件
- Web通帳が出力するcsvデータを取得する。この際にはデータがダブっていても可とする。
- 年月単位に集計しデータを保管する。この際にはデータはダブりなくなっている。
- D3.jsを用いて年単位または月単位でグラフ化をする。DropBoxに保管し、各種デバイスから閲覧を可能にする。
データフロー
ユニケージの考え方に則り各種データを定義する
データフロー図
データの流れは以下のとおり。各種データを作成する専用のシェルスクリプト(LV?MAKE)を作成する。
LV1
入力データとする。本アプリではWeb通帳が出力するcsvファイルとし、ファイル単位は任意とする。
平成 24年 3月 1日から平成 24年 3月 31日.csv 平成 24年 4月 1日から平成 24年 4月 30日.csv 平成 24年 5月 1日から平成 24年 5月 31日.csv 平成 24年 6月 1日から平成 24年 6月 30日.csv 平成 24年 7月 1日から平成 24年 7月 31日.csv 平成 24年 8月 1日から平成 24年 12月 29日.csv 平成 25年 1月 1日から平成 25年 7月 31日.csv
LV2
LV1データをクレンジングしたものとする。ファイル単位はLV1と同じとする。
20120301_20120331 20120401_20120430 20120501_20120531 20120601_20120630 20120701_20120731 20120801_20121229 20130101_20130731
LV3
LV2を元にダブりなく正規化されたデータとする。ファイル単位は年月(YYYYMM)とする。
201203 201204 201205 201206 201207 201208 201209 201210 201211 201212 201301 201302 201303 201304 201305 201306 201307
LV4
グラフ出力用に準備がなされたデータとする。グラフの種類に合わせて複数用意し、ファイル単位もグラフの種類に依る。以下は月別収支を表示するグラフ用のLV4データを想定。
201203.csv 201204.csv 201205.csv 201206.csv 201207.csv 201208.csv 201209.csv 201210.csv 201211.csv 201212.csv 201301.csv 201302.csv 201303.csv 201304.csv 201305.csv 201306.csv 201307.csv
以上
3の倍数と3が付く数字の時だけ世界のナベアツになります。
3の倍数と3が付く数字の時だけ世界のナベアツになります。
ただのFizzBuzzです。Shellだとかなり簡単だったり。
世界のナベアツ by Shell
数え上げて、剰余算して、置換して。
seq 1 100 | gawk '{print $1%3==0?"おもろー!":$1}' | sed "s/.*3.*/おもろー!/g" 1 2 おもろー! 4 5 おもろー! 7 8 おもろー! 10 11 おもろー! おもろー! 14 おもろー! 16 17 おもろー! 19 20 おもろー! 22 おもろー! おもろー! 25 26 おもろー! 28 29 おもろー! おもろー! おもろー! おもろー! おもろー! おもろー! おもろー! おもろー! おもろー! おもろー! 40 41 おもろー! おもろー! 44 おもろー! 46 47 おもろー! 49 50 おもろー! 52 おもろー! おもろー! 55 56 おもろー! 58 59 おもろー! 61 62 おもろー! 64 65 おもろー! 67 68 おもろー! 70 71 おもろー! おもろー! 74 おもろー! 76 77 おもろー! 79 80 おもろー! 82 おもろー! おもろー! 85 86 おもろー! 88 89 おもろー! 91 92 おもろー! 94 95 おもろー! 97 98 おもろー! 100
gawkのインストール
ちなみにgawkが入ってなかったの入れといた。
brew install gawk … which gaw /usr/local/bin/gawk
以上
MacOSXへのnkfインストール
MacOSXへのnkfインストール
困ったこと
Macでnkfが利用できなかった。デフォルトでは入っていないようだ。
環境
- OS X 10.9.3
解決方法
パッケージ管理ツールを用いてインストールする
nkfのインストール by MacPorts
すでにインストール済みであるMacPortsを利用する。以下のコマンドを実行
mba:~ 7010oncajon$ sudo port install nkf Password: Warning: xcodebuild exists but failed to execute Portfile changed since last build; discarding previous state. Warning: Xcode does not appear to be installed; most ports will likely fail to build. ---> Fetching archive for nkf ---> Attempting to fetch nkf-2.1.3_3.darwin_13.x86_64.tbz2 from http://nue.de.packages.macports.org/macports/packages/nkf ---> Attempting to fetch nkf-2.1.3_3.darwin_13.x86_64.tbz2.rmd160 from http://nue.de.packages.macports.org/macports/packages/nkf ---> Installing nkf @2.1.3_3 ---> Activating nkf @2.1.3_3 ---> Cleaning nkf ---> Updating database of binaries ---> Scanning binaries for linking errors ---> No broken files found.
なんか失敗した。
Commad Line Toolsがないから?
どうやらXcodeから取得するCommand Line Toolsがないことが原因。そういえばXcodeのサイズが大きいすぎて、MBAからは除外したのであった。Xcodeを入れるのはいやなのでCommand Line Toolsを単独でインストールする。
pkgなのでインストーラの指示に従う。
気を撮り直して、再度nkfのインストールを実施。結果、またしても失敗。ファック!!
どうやらMacPortsはXcodeがインストールされていることを前提なようである。いろいろと試してみたが、諦めた。(別に方法はあるかもしれないが。。。)
僕のMBAはディスクが常にギリギリです。Xcode(9Gくらい)の空き容量なんてねーよ。僕はただnkfをインストールしたいだけなんです。
Homebrewのインストール
気を撮り直して、別の管理ソフト(Homebrew)を利用する。インストールは公式サイトに従う。
mba:~ 7010oncajon$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" ==> This script will install: /usr/local/bin/brew /usr/local/Library/... /usr/local/share/man/man1/brew.1 … Further help: man brew brew home
nkfのインストール by Homebrew
ようやくnkfのインストールまで辿り着いた。
mba:~ 7010oncajon$ brew install nkf ==> Downloading http://dl.sourceforge.jp/nkf/59912/nkf-2.1.3.tar.gz ######################################################################## 100.0% ==> make CC=clang ==> make install prefix=/usr/local/Cellar/nkf/2.1.3 MKDIR=mkdir -p 🍺 /usr/local/Cellar/nkf/2.1.3: 4 files, 348K, built in 5 second > mba:~ 7010oncajon$ which nk > /usr/local/bin/nkf
やったね。ビールでも飲みますか。
MacPortsのアンインストール
Homebrewの導入に伴いMacPortsは要らない子になったので削除する。公式サイトに従う。
mba:~ 7010oncajon$ sudo port -fp uninstall installed Password: Warning: xcodebuild exists but failed to execute ---> Uninstalling apple-gcc42 @5666.3_11 ---> Cleaning apple-gcc42 ---> Deactivating apple-gcc42 @5666.3_13
mba:~ 7010oncajon$ sudo rm -rf \ > /opt/local \ > /Applications/DarwinPorts \ > /Applications/MacPorts \ > /Library/LaunchDaemons/org.macports.* \ > /Library/Receipts/DarwinPorts*.pkg \ > /Library/Receipts/MacPorts*.pkg \ > /Library/StartupItems/DarwinPortsStartup \ > /Library/Tcl/darwinports1.0 \ > /Library/Tcl/macports1.0 \ > ~/.macports
Commad Line Toolsは残しておいてやるか。。。
以上。
ユニケージしてみた。(その1:環境構築編)
ユニケージしてみた。(その1:環境構築編)
UNIXはユーザフレンドリーだ。誰かれ構わずフレンドリーになるわけではないだけだ。
USP研究所が推進するユニケージ開発手法というものを試してみる。なかなかにファンキーな思想だ。もちろん良い意味で。
UEC - usp engineers' community site
ダウンロード
以下のサイトよりopen-usp-tukubai-2014061402.tar.bz2
を取得。適当に解凍をしておく。
Open usp Tukubaiダウンロード
インストール
以下を参考にインストール。 Open usp Tukubai インストール
ポイントは2つ。
mba:open-usp-tukubai-2014061402 7010oncajon$ pwd /Users/7010oncajon/Desktop/open-usp-tukubai-2014061402 mba:open-usp-tukubai-2014061402 7010oncajon$ sudo make install WARNING: Improper use of the sudo command could lead to data loss or the deletion of important system files. Please double-check your typing when using sudo. Type "man sudo" for more information. To proceed, enter your password, or type Ctrl-C to abort. Password: /bin/mkdir -p /usr/local/bin /usr/bin/install -m 555 COMMANDS/calclock /usr/local/bin /usr/bin/install -m 555 COMMANDS/cgi-name /usr/local/bin /usr/bin/install -m 555 COMMANDS/check_attr_name /usr/local/bin ... /usr/bin/install -m 444 MANUALHTML/COMMON/IMG/BACKGROUND.JPG /usr/local/share/open-usp-tukubai/devel/html/COMMON/IMG/ /usr/bin/install -m 444 MANUALHTML/COMMON/IMG/TUKUBAI_LOGO.JPG /usr/local/share/open-usp-tukubai/devel/html/COMMON/IMG/ /usr/bin/install -m 444 MANUALHTML/COMMON/JS/MENU.JS /usr/local/share/open-usp-tukubai/devel/html/COMMON/JS/ /bin/mkdir -p /usr/local/share/open-usp-tukubai/devel/pdf /usr/bin/install -m 444 MANUALPDF/all.pdf /usr/local/share/open-usp-tukubai/devel/pdf
確認
mba:open-usp-tukubai-2014061402 7010oncajon$ join0 Usage : join0 [+ng<fd>] key=<n> <master> <tran> Version : Fri Oct 21 11:26:06 JST 2011 Open usp Tukubai (LINUX+FREEBSD/PYTHON2.4/UTF-8)
今後やりたいこと
預金データを可視化してみようか
以上