NeverBlog::Likk::Unexistable;

見なかったことにして下さい

スマホで撮影した写真のファイル名が被る場合の整理方法

とある事情で写真の整理をしています。
大ざっぱだけどこんなディレクトリ状態。規則性あるようにも見えるけど実際の所規則性なんてのはない。

hoge/
hoge/2013/aaa.jpg
hoge/2013/bbb.jpg
hoge/2013/ccc.jpg
hoge/2014/05/aaa.jpg
hoge/2014/05/bbb.jpg
hoge/201405-2014-07/aaa.JPG
hoge/201405/マルチバイト文字列/aaa.JPG

大量にかつ複雑なディレクトリの中にあるファイルを一個ずつ見て回ると、どのディレクトリまでみたのか分からなくなって混乱してきた。
一覧でみたいんじゃあああと、直下に集約しようとすると今度はファイル名が被ってるので上書きしてしますか?とか聞いてきたので、ついカッとなって撮影日付で置換して直下に置くスクリプト書いた。

過去に書いた二つの記事の合わせ技


スクリプトは上記でいうhoge直下に置いて実行する。

use Image::ExifTool;
use Path::Class::Dir;
Path::Class::Dir->new("./")->recurse(
  callback => sub {
    my $f = shift->stringify;
    return if -d $f;
    return unless $f =~ m{\.jpg$}i;
    my $it = 'Image::ExifTool'->new;
    $it->ImageInfo($f);
    my $dt = $it->GetValue('DateTimeOriginal');
    $dt =~ s/[: ]//g;
    $dt = $dt . '.jpg';
    print $f . ' -> ' . $dt ."\n";
    rename($f, $dt);
  }
)

LOAD DATA INFILE を使った MySQLのデータインポート

一年に一回やるかやらないかぐらいの頻度で、毎回ググって回ってるので備忘録。

mysqldump -u user -p --default-character-set=utf8 --lock-tables --single-transaction database table > table.sql
gzip table.sql
scp table.sql.gz new-server:/tmp/
ssh new-server
cd /tmp
zcat table.sql.gz | mysql -u user -p database

基本この流れで問題ないんだけど、千万件辺りからいつまでたっても終わらなくなる感じになるので、LOAD DATA INFILE を使うようにする。

SELECT * INTO OUTFILE '/tmp/table.tsv' FROM table

で書き出して

LOAD DATA INFILE '/tmp/table.tsv' INTO TABLE table;

で読み込む。

必要であれば読み込む前に以下をやっておく

SET foreign_key_checks=0;
SET sql_log_bin=0;
SET unique_checks=0;
SET @@character_set_database=binary

あと、基本だけどこの手の時間がかかる作業はscreenなりtmuxなりやっておかないと、悲しい気持ちになります。

手元にあるデータは新たに更新されることは無いので、最近は昔に書きだしたtsvを再インポートするだけになっている。



参考元:

もっとクソでかいデータを扱う時:
参考先のmaatkitとfifoを使う



次に実行する時に、毎度参考サイトが有るとは限らないのでアーカイブしておきたい所。

数字を3桁ごとにカンマで区切るやつ

Perl 数値 三桁 とかでググると色々出てくるけど微妙に要件満たしてなかったりする。

正負の記号入れると動かなかったりとか、
小数点入れると動かなかったりとか、
小数点以下もご丁寧に3桁区切りになったりとか。

要件を言うと -7,654,321.0000001 と整形されるデータが欲しい。何に使うかは置いといて、Excel先生はそういう風に整形してくれるので挙動を合わせておきたい。

幾つか試した結果、 Number::Format::format_number(); が上記要件を満たしてくれた。
そのまま使うと小数点2桁以下は round されるので perldoc Number::Format して確認すると良いと思う。

今の best practice かどうかは分からないので、他にオススメありましたらよろしくお願いします。

「iine log - よかったことだけを書きのこすミニブログサービス」のクライアントライブラリ作った。


iine log | よかったことだけを書きのこすミニブログサービス

良かったことがあったら書き込むミニブログ iine log ができたので、例によってログインして発言・タイムラインを取得するクライアントライブラリ作った。Likk/WebService-Iinelog · GitHub

使い方は例によって ./example/ 配下にまとめておきました。

% example/show_timeline.pl

でタイムライン取得

% perl ./example/say.pl
ほげほげ

とかやると
f:id:likk:20141021203955p:plain
という感じでPOSTされます。

APIそのうち用意されるんじゃないですかね。

chatter に書き込みと、打刻以外の発言ログを抽出できるライブラリ作った。

主に関係者向けなのでとりあえず、分かる人にだけ分かればいいや。


chatter単体じゃなくて、勤怠管理 teamspiritの内包機能として、また管理者じゃなくてユーザとして使うのに、developerサイトに登録していいのかAPI使っていいのか、よく分からなかったので、ついカッとなって例によってscrapingしてゴリゴリpost と打刻以外の書き込みを取ってこれるツール作った。

Likk/WebService-TeamSpirit · GitHub

打刻する機能とか付けるつもり無いんでpull-reqとか送ってこないでください。

エロなクライアントライブラリ作った。

タイトル出落ちです。
最近出来たらしい SNS ello.co の招待メールを受け取ったので、ログインして発言するクライアントライブラリ作った。Likk/WebService-Ello · GitHub

タイムラインとかも持ってこれるように追加修正します。そのうち。ただHTML上にある情報が少なすぎて、発言者と名前ぐらいは持ってこれそうなんですが、発言時刻とか持ってこれなくてちょっと悲しい気持ち。

APIそのうち用意されるんじゃないですかね。

Greeにログイン出来なくなってたので直した

Greeのコミュニティの情報を定期的に持ってきたくてスクリプト書いていたんですが、先週ぐらいからログインに失敗して通知が止まっていたので直した。Likk/WebService-Gree-Community · GitHub

使い方は example 配下を見ればわかると思うけど

perl ./example/get_bbs_list.pl XXXXX(コミュニティID)

って感じでコミュニティID 指定すればコミュニティ内のスレッド一覧とスレッドIDとれるので

perl ./example/show_bbs.pl XXXXX(コミュニティID) NNNNNN(スレッドID)

という感じで書き込みの情報を取得することができます。

そろそろ追従するの疲れてきたのでAPIとか欲しいです。