それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

正規表現の最短マッチを知ってると便利

正規表現は最長マッチ

正規表現って最長でマッチする。。。ちょっと不便

そこで、正規表現で最短マッチ

.+? 

? を付記することで最短マッチになる。

または[.*?]のように、条件に* を使うことも出来る。

正規表現で最短マッチできたら便利ですよね

最短マッチの例

'[2016-09-19][済][TODO]提出資料を作る.txt'.match(/\[(.+?)\]/)
#=> #<MatchData "[2016-09-19]" 1:"2016-09-19">

もし最短マッチしないとどうなるか.

'[2016-09-19][済][TODO]提出資料を作る.txt'.match(/\[(.+)\]/)
#=> #<MatchData "[2016-09-19][済][TODO]" 1:"2016-09-19][済][TODO">

最短マッチをしない場合は、最長マッチになる。。。不便

最短マッチを知らないとnot 地獄

最短マッチを知らなくても、not を使えば、最短マッチを実現することが出来るけど。。。。

'[2016-09-19][済][TODO]提出資料を作る.txt'.match(/\[([^\]]+)\]/)
#=> #<MatchData "[2016-09-19]" 1:"2016-09-19">

not を使ってマッチさせてもイイんだけど、最短マッチの方が圧倒的に読みやすいですね。

参考資料

http://qiita.com/ha_g1/items/d41febac011df4601544

http://d.hatena.ne.jp/cloned/20061110

サムネイルの生成を超高速にするオプション -define

imagemagick の画像縮小を超速にする記事を読んだので試してみた

blog.mirakui.com

-define をつけると早くなる。

いつもの convert に「-define jpeg:size=...」をつけるだけで10倍速くなる

まじか。早くなるならやってみるぞ

測定しました。

-define あり

takuya@~/Desktop$ time for i in {1..100}; do  convert -define jpeg:size=800x600 IMG_2592.jpg out.jpg ; done

real    0m6.588s
user    0m5.199s
sys 0m1.061s

通常の -resize

takuya@~/Desktop$ time for i in {1..100}; do  convert -resize 800x600 IMG_2592.jpg out.jpg ; done

real    0m59.158s
user    0m49.801s
sys 0m8.475s

オプション違いの比較

| 時間 | -define | -resize | 率 | | 100回 | 0m6.588s | 0m59.158s | 約 9 倍 | | 10回 | 0m0.647s | 0m6.335s | 約10 倍 |

バイくらい早い。

測定環境

f:id:takuya_1st:20160922231015j:plain:w200

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro11,1
      Processor Name: Intel Core i5
      Processor Speed: 2.4 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 3 MB
      Memory: 8 GB
      Boot ROM Version: MBP111.0138.B17
      SMC Version (system): 2.16f68

ただちょっとわからないのが・・・サイズ

800x600 で指定したはずなのに、出力は816x612になってるんだよねぇ。

IMG_2592.jpg JPEG 3264x2448 3264x2448+0+0 8-bit sRGB 966KB 0.000u 0:00.000
defined_out.jpg JPEG 816x612 816x612+0+0 8-bit sRGB 117KB 0.000u 0:00.000
resized_out.jpg JPEG 800x600 800x600+0+0 8-bit sRGB 111KB 0.000u 0:00.000

ImageMagickで利用しているJPEGライブラリのlibjpegでは、1/2、1/4、1/8のサイズへの縮小は高速に計算できるのです。

つまり、元サイズが3264x2448なので、1/4 が適用されているわけですね。

なので、-define したときは、1/2,/1/4 の近いサイズが採用されるようですね。

実験画像

f:id:takuya_1st:20160922233221j:plain:w300

上に書いたように、1/4 になってるので 800x600と816x612 になってるので若干サイズが違うね。

参考資料

本当は速いImageMagick: サムネイル画像生成を10倍速くする方法 - 昼メシ物語

netatalk がシンボリックリンクを辿らない?

netatalkシンボリックリンクが辿ない

netatalkシンボリックリンクを辿らず、単なるファイルに見えてしまう。

設定を見直してみた

follow symlinks = trueが必要

マニュアルを見直してみると、symlinkはデフォルトで無効になっている。

    follow symlinks = true

この設定を、global かボリュームに記述すればイイんだろう。

コレで解決

でも注意点があった。

シンボリックリンクは、共有パス外部へのリンクをチェックしない

たとえば、/etc/passwd のファイルにリンクされちゃうと丸見えになるよってことで。

ApacheSambaなどは外部へのsymリンクはPermissionチェックで弾くもんな。

まぁ、おもにタイムマシーン用なので気にしないことにするか

作った設定は次の通り。

[Global]
    uam list = uams_dhx.so uams_dhx2_passwd.so
    mac charset = MAC_JAPANESE
    hostname = acid-afp
    vol preset = default_for_all_volumes
    log file = /var/log/netatalk.log
    #log level = default:maxdebug
    log level = default
    cnid scheme = cdb

    dbus daemon = /usr/bin/dbus-daemon

    mimic model = MacPro
    ;mimic model = RackMac

    dsireadbuf = 120 ; default 12
    dircachesize = 16384

[default_for_all_volumes]
    file perm = 0600
    directory perm = 0700

[Homes]
    basedir regex = /home
    follow symlinks = true
    time machine = no
    spotlight = true
    home name = $u's home(afp)
[My Time Machine Volume]
    path = /home/takuya/.backups/time_capsule/
    time machine = yes
    vol size limit = 450000

ターミナルの起動がやたら遅いときに試すこと

ターミナルの起動がやたら遅い。

最近のmacOS はターミナルの起動が本当に遅くなった。

以前であれば、tmux や screen を使わなくてもiTerm2でタブを開いておけば、十分使えた。

でも最近は、なぜかlogin -fp takuya / bash の初回起動が遅くて使い物にならない。

最初に見直す項目

シェルは、設定を読み込むので設定を外してみる

  • /etc/profile
  • /etc/bash_profile
  • ~/.bash_profile
  • ~/.bashrc

の順で読み込まれていくので、最後に読み込まれるものから無効化していって、非常に遅くなっている箇所を探す。

私の場合 rbenv init - がくっそ遅い。ruby 関連が遅いので、出来る限り外してる。

それでも、今回は遅かった。5秒位かかる。

asl のログ関連 がめっちゃ遅い

調べみたら。asl 関連のファイルを消せば早くなるという眉唾っぽい情報を見かけてダメモトで試してみたら

すごく早くなった!

sudo rm -rf /private/var/log/asl/*.asl

これをするだけで、bash起動が早くなったんだけど。。。なんでだ

asl は?

apple system log の意味らしい。

アレコレ調べてると、bashログインが遅くなった日、その日はアップデートがあって、その日のログだけがサイズ爆発(数GB)してるんですよね。ログファイルが大きくなりすぎて、パースや追記に時間がかかってた気がする。

参考資料

http://osxdaily.com/2010/05/06/speed-up-a-slow-terminal-by-clearing-log-files/

http://d.hatena.ne.jp/taku-o/20090315/1237122854

waifu2x をシェルスクリプトから呼び出す。

画像を拡大したときに、ギザギザにならないように

画像を拡大したときに、ギザギザにならないように補完してくれるサービスが有りました。

画面キャプチャやちょっと古い画像を拡大するときに、重宝しました。

curl コマンドから呼び出す。

WEBサイトから呼び出しているとキリがないので、コマンドから呼び出せるようにcurl コマンドから呼び出せると便利ですよね。

curl  http://waifu2x.udp.jp/api -F file=@/path/to/filename -F style=art -F noise=0 -F scale=2 > out.png

これで、for やxargs と組み合わで、コマンド呼び出しで使えるようになると便利ですよね。

でももっと簡単に使えると便利そう。

bash の関数か、コマンドファイルとして定義しておくと便利だと思うんですね。アスタリスクのシェル展開で使えるし。

シェルスクリプトから呼び出せるようにしておく。

function waifu2x(){
  for e in "$@" ; do
    name=$e
    basename=${name%.*}
    out_name=$basename.png
    echo $name
    curl  http://waifu2x.udp.jp/api -F file=@"$name" -F style=art -F noise=0 -F scale=2 > "$out_name"
  done
}

参考資料

http://waifu2x.udp.jp/index.ja.html

Evernoteのenexから添付ファイルをぱぱっと取出す

Evernote の添付ファイルを取出したいと思った。

Evernote で取り込んだWEBページの添付ファイルまるっと取り出したら楽かもと思った。

ruby でぱぱっと

gist.github.com

ファイル名を0埋めして数字の番号順に並べてファイル名を付け直す

0埋めされてないと結構面倒くさいですよね。

takuya@:2$ ll | head
合計 61404
-rw-r--r-- 1 takuya takuya 8014 2016-02-04 18:15 1.jpg
-rw-r--r-- 1 takuya takuya 3931 2016-02-04 18:15 10.jpg
-rw-r--r-- 1 takuya takuya 2852 2016-02-04 18:15 100.jpg
-rw-r--r-- 1 takuya takuya 3259 2016-02-04 18:15 101.jpg
-rw-r--r-- 1 takuya takuya 3596 2016-02-04 18:15 102.jpg
-rw-r--r-- 1 takuya takuya 3367 2016-02-04 18:15 103.jpg

ファイル名が0から始まらないと辞書順に並んじゃって 、数字順に並ばないと、とても不便です。

ls で並べるだけならカンタン。

ls -v 

ls に -v をつければ、数字順に解釈してくれる

takuya@:2$ ll  -v | head
合計 61404
-rw-r--r-- 1 takuya takuya 280140 2016-02-04 18:15 1.jpg
-rw-r--r-- 1 takuya takuya 131223 2016-02-04 18:15 2.jpg
-rw-r--r-- 1 takuya takuya 251102 2016-02-04 18:15 3.jpg
-rw-r--r-- 1 takuya takuya 223594 2016-02-04 18:15 4.jpg
-rw-r--r-- 1 takuya takuya 159563 2016-02-04 18:15 5.jpg
-rw-r--r-- 1 takuya takuya 403262 2016-02-04 18:15 6.jpg
-rw-r--r-- 1 takuya takuya 321086 2016-02-04 18:15 7.jpg

ファイル名を変更する

このソートを使ってファイル名を変更することにする。

 0埋めで ファイル名を付け直す。

毎回-v するのも面倒だし、プログラムが意図しない動作をしそうなので、ファイル名をゼロ始まりにしておいて、一括処理をしやすくしてお事にした。

cd $target
for i in $(ls -v ) ; do  mv $i  $(printf  '%05d.jpg' $( basename $i .jpg ) )   ; done

ポイント

printf で0うめしてる。

printf  '%05d' 100

sort -n で

sort を使っても良いんだけど・・・ ls -l の結果を並べようと思うとやっぱり面倒だよね

takuya@:2$ ls | sort -n  | head
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg

比較的大きなCSVファイルをぱぱっとSQLiteにインポートして楽をする

CSV ファイルを検索するのが面倒くさい。

Excelで開いて、集計関数なんて使ってるのめんどくさくないですか?私は面倒くさいです。

CSVファイルやデータログファイルをGrepするのも飽きてきました。sort して uniq して awk も良いんだけど、SQLで集計できたら楽だよね。

SQLiteでぱぱっと出来る。

CSVSQLiteで取り込んで、SQLで検索するなんて直ぐ出来る。

  1. 適当なCSVを用意して
  2. 適当なテーブルを用意して
  3. データを突っ込む
  4. sql で検索

sqlite3コマンドがあれば誰もカンタンに扱えて便利。

適当なCSVを用意する

本当に適当なCSVを用意する

1,a,b,ここは
2,b,c,あれは
3,d,e,そこは

SQLiteを開く

sqlite3 tekitou.db

テーブルを作る

sqlite> create table sample ( id , name1 , key , mm );

ココがポイント、テーブルの型定義はとりあえず要らない。だってSQLITEは全てが文字列型のテキストが前提だから。

インポートする

sqlite>.mode csv
sqlite>.import tekitou.csv sample

ここがポイント、 .import 直前で、.mode csv とすることで、csv モードになる。便利! *1

SQLで検索する

sqlite > select * from sample ;
sqlite > select sum(id) from sample ;

ああ、便利。便利すぎてヤバイ

注意点

CSVは「空白」や「クォート」文字があれば、ソレすらも取り込むので、取り込みすぎたら、sql側でupdate する必要がある。

もしくは、事前に区切り文字の後ろのクォートや空白を消しておく必要がある。

もし区切り文字を変えたいときは

現在の区切り文字を確認

sqlite > .show
     echo: off
      eqp: off
  explain: off
  headers: on
     mode: csv
nullvalue: ""
   output: stdout
separator: "," "\r\n"
    stats: off
    width:

このSeparator部分を任意に変更できる

sqlite > .separator ,
sqlite > .separator |
sqlite > .separator /

あぁ便利すぎる。find の結果を/ で取り込んだら、ファイル一覧をさくっとDBに作れて楽しかった。

これで快適SQL生活

手軽にSQLが使えるんだからどんどん使っていくべきだと思うんですよね。

JSONのように階層構造にうるさくないし、末尾のカンマ問題もないし。すげー楽。

しかもEXCEL職人芸も要らないし、ターミナルだけでぱぱっと出来る。楽しかった。

参考資料

Command Line Shell For SQLite

*1:正確には、csv モードで separator が , になってるんだとおもう

Spotlightが頻繁にフリーズするので再起動方法

Spotlightが頻繁にフリーズする。

現象は、HDMIで画面を切り替えた時にSpotlightのフリーズが頻発するのです。

SpotlightもDockもアクティブなデスクトップ上の、アクティブなモニタ上にでてくるので、モニタを超えておかしくなるHiDPIとの切り替えが上手く行ってない様子

再起動

killall Spotlight

これでSpotlightのUIは再起動するはず。

Mac でFuseマウントが出来なくなってた。

macOS X の 10.11 以降だと思うんだけど。

brew などでインストールした、FUSEExt4のマウントが出来なくなってた。

解決策

sudo ext4fuse -o allow_other /dev/disk4s2 mnt

allow other をすることで mount が出来ることを確認。

本当に不自由なOSですね。。。

その他の解決方法

chmod する。

問題は、FUSEしたときに別ユーザーになってしまうので、sudo chmod でPermissionを変えてやればイイはず。

参考資料

Unable to open ext4 mounted partition on El Captain · Issue #36 · gerard/ext4fuse · GitHub

Kindle の転送が失敗する。Dマガジンのほうがマシ。

とりあえずまともに、購入書籍が転送されてきたのはコレ。

f:id:takuya_1st:20160908055706j:plain:w300

このバージョン以外ではほぼ失敗した。

購入した本が届かないAmazon

購入した本が届きません。ええ、物理的なものじゃなくて、デジタルデータが届かないんですよ。頭にきた。

AmazonKindleって便利なのか不便なのか?

メチャクチャ不便です。

ファイルが転送されません。基本的にファイルの転送によく失敗します。

ダウンロード失敗するとはどういうことか?

Kindle.appでダウンロードを始めたら33%くらいまでは、ナンチャッテでバーが進むようです。。 ソコから先はダウンロード進捗次第なので、進まなくなります。

ダウンロードできなくなると、気付いたら転送が『キャンセル』されてます。

そうするとまたダウンロード開始させるのですが、数十分後にキャンセルされてます。この繰返し。もう切れていいよね。

Amazonに期待したら辛い

AmazonGoogleにはあまり期待しないほうが良いと思う。

Amazonに聞くと、別の本を購入して試してくれ(購入じの決済処理にエラーが有るかもしれないので、それか同じ本をもう一度買え)とのこと。無駄金使わせる気ですか。。。

数日に渡り、せっかく買った書籍が読めず、のべ5時間位格闘としてた。

Amazonでコミックや技術書を買ってから数日間あれこれ試したけど配信されず。

試したこと

実験1 Kindle のフォルダを全部消す。

rm -rf ~/Library/ApplicationSupport/Kindle

Kindleの初期化後に再度ダウンロード→だめ

別のバージョンで試す。

Kindleのフォルダを全部消す

rm -rf ~/Library/ApplicationSupport/Kindle
brew install kindle -v バージョン指定
open -a ~/Applications/Kindle.app

これもダメ。

アマゾン側で端末の登録を全部消す

全部消したPaperWhiteもIpadmaciphoneWindows PC もAndroidも全部消した。まっさらにした。

その後、KindleMacだけを登録

rm -rf ~/Library/ApplicationSupport/Kindle

Kindleを起動して登録。

Amazon側から配信。

まったくだめ。

全部消して、全部消して、バージョン違いで試して放置した。

あれこれKindle.app のバージョンを試した。

f:id:takuya_1st:20160908055706j:plain:w300

最終的にこれで約40分掛かってダウンロードができて、読めるようになった。

ふざけてる。。

Amazonと関わると面倒なことが多いよね。転送速度は我が家は11ac 300 で っフレッツプレミアムです。

Amazonが遅いねん

Dマガジンだと、数分ただず配信終わるし寝てる間にある程度キャッシュしててくれる。

昔買った本が、また読めると思うなよ。

昔買った本だって、ダウンロードボタン押した後に、数分で配信キャンセル何度も食らったぞ。

Amazon電子書籍は「ビューワへの転送が最悪」

遅くて遅くて、読みたい時に読めません。Kindle期待しちゃダメよ。ソフトウェアとインフラの完成度がひどいから。

もうAmazon関係で本を買うのが嫌気がしてきた。

JPEG1枚ずつ転送してくれたらソレでいいのにな。

ruby の URI で日本語を含むURIに対応する。

日本語URIを扱うという戦い

rubyURIで日本語を含む文字列が扱えなくなったので、何とかしないといけないとアレコレ模索した。

>> URI.parse  'http://example.com/あああ'
URI::InvalidURIError: URI must be ascii only "http://example.com/\u{3042}\u{3042}\u{3042}"
from /Users/takuya/.rbenv/versions/2.2.3/lib/ruby/2.2.0/uri/rfc3986_parser.rb:20:in `split'

URI.encode が使えることを知った。

>> URI.encode 'http://example.com/あああ'
=> "http://example.com/%E3%81%82%E3%81%82%E3%81%

parse encode と合わせて使うことでほとんどの問題は解決する。

>> URI.parse URI.encode 'http://example.com/あああ'
=> #<URI::HTTP http://example.com/%E3%81%82%E3%81%82%E3%81%82>

これで、エラーなく扱うことができる。

が、、、、encode を毎回指定するのはめんどくさくないかな。

参考資料

http://d.hatena.ne.jp/haroperi/20110405/1301959688

renameコマンドでぱぱっと連番付きファイルを作成する。

連番を付記したファイルを作るのが、めんどくさくなってきた

for ループと sprintf を組み合わせたり、ruby ワンライナーでヤってたけど、だんだんめんどくさくなってきた

rename Commandでぱぱっと作ることにした

rename -N 01 -X -e '$_ = "京都旅行-2016-08-27_$N"' *.jpg

これでぱぱっと、ファイルを連番にできて便利すぎてヤバイ。

-N : 引数のフォーマットと開始番号を指定する。例えば 0001 なら4桁0埋め、 100 なら開始番号が100
-X : 拡張子を置換対象にしない
-e : 出力するフォーマット $N が番号が入る所

先頭に連番を付ける場合

もとのファイル名をそのままにして 先頭に連番を付ける場合

./rename -n -N 001 -X  -e '$_="$N\_$_"' *

2017/01/11追記: 辞書順に並んでしまう時

すでに連番が振っていて、辞書順に並んでしまうときは、ちょっと工夫が必要かもしれない。

rename -N 0001 -X -e '$_ = "img-$N"' $( ls -v  *.jpg )

ls -v が使えないときはもうけっこう大変だと思う。何かいい方法あるのかな

2022-05-30 追加

インストールする方法。

wget http://plasmasturm.org/code/rename/rename
chmod +x rename
./rename -h

apt で入るものが変わってたのでインストールし直した。

rubyの置換でコールバックを使う。

JavaScript の String#replace はコールバックが使えて便利。

置換でコールバックの関数使えると便利なんですよね。

> a.replace(/a/, function(e){ console.log(e); return ''})
a
'bc'
>

js のこの仕様が結構過ぎで多用しまくっててクセになってた

ruby でもブロック渡せることを知った。

'abc'.gsub(/a/){ 'abc' } #=> "abcbc"

ブロック渡せるの便利だよね。大雑把な正規表現でも細かい部分を微調節できるし。正規表現をアレコレいじくり回して直感的じゃなくなったり、複雑になりすぎた正規表現を調整できる。

match でもブロック使える

>> 'abc'.match(/(.)/){|e|  p e ; nil   }
#<MatchData "a" 1:"a">
=> nil

正規表現が複雑になり過ぎないように、ブロックを使うのも悪くないよね。

参考資料

gsub, gsub! (String) - Rubyリファレンス