黒い画面を素早く出す

黒い画面を素早く出す

CodeRunnerなんて要らなかったんや(たぶん)

困ったこと

スクリプト系のプログラミングをしていて、毎回ターミナルから実行するのが面倒くさい

前提

  • Mac OSX
  • Subline Text 3

解決方法(基本)

Cmd + bを押す。 

IMG01

解決方法(応用)

環境の指定や実行引数を与えたいなど、やっぱりターミナルから起動したいというケースもある。その場合は、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データを生成するシェルです。主な処理は以下。

  • 和暦を西暦に変換
  • 文字コードの変換
  • csvヘッダの除外
  • カンマ区切りを空白区切りに変更
  • 空のカラムを_(アンダーバー)に変更

あっ、ユニケージコマンドを使っていない。。。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)を作成する。 Flowchart

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インストール

困ったこと

Macnkfが利用できなかった。デフォルトでは入っていないようだ。

環境

解決方法

パッケージ管理ツールを用いてインストールする 

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を単独でインストールする。

Developersサイト

IMG01

pkgなのでインストーラの指示に従う。

気を撮り直して、再度nkfのインストールを実施。結果、またしても失敗。ファック!!

どうやらMacPortsXcodeがインストールされていることを前提なようである。いろいろと試してみたが、諦めた。(別に方法はあるかもしれないが。。。)

僕の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つ。

  • Xcodeがない場合はコマンドラインツールというのが必要。ダイアログが出るのでそれに従う。
  • 管理者権限がない場合は、sudoで実行すること。
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)

今後やりたいこと

預金データを可視化してみようか

  • 電子通帳からダウンロードしたcsvファイルを取り込む
  • 整形したデータとして保存
  • HTML5とD3.jsを用いて各種グラフ化

以上