tec memo

メモです。

散らかった写真を整理したい方へ

数年前に家族が撮影した未整理の写真データが出てきた。 変更した日は出ているが、写真名からはいつのものか判断できない。さらにはよく見ると同じ写真がファイル名が違うものであったりと、かなり状態としては悲惨だった。 それをサクッと整理したお話です。

以下、finderで表示した場合、こんな感じだった。

f:id:atani:20161201230148p:plain

整理するためにやるべきこと

用件としては二つ

  • 重複したデータは取り除く
  • それぞれの写真の日付が一目でわかるようにする

やったこと

重複データを取り除く。

お金を出せば有料のアプリで一気にできるのだが、どちらもコマンドを使って解決した。

まず、重複データを取り除く。

fdupes というコマンドを利用した。mac標準では入っていないので、brew を使ってインストールする。

brew install fdupes

※ なお、brew が何ものかについては MacにHomebrewをインストールする あたりを参照のこと。

これでfdupes が使える状態になった。

# fdupes -r フォルダ名

これで、重複しているファイルリストが出てくる。

# fdupes -r backup/ | head
backup/SH3E0154.jpg
backup/SH3E0154_0001.jpg

backup/SH3E0090.jpg
backup/SH3E0090_0001.jpg

backup/PAP_0222.JPG
backup/PAP_0223.JPG
backup/PAP_0224.JPG
backup/PAP_0225.JPG

fdupesに重複ファイルを消すオプションがついているけれど、消してしまったら元に戻せないので、一度対象のファイル名をテキストに出力する。

fdupes -rf backup/ | sort | uniq | grep -v '^$' > duplicate.list

中身を確認し、問題なければ削除する。

while read file; do rm "$file"; done < duplicate.list

この時、rmだとこれまた問答無用で消えてしまうので、それでも怖い方はrmtrashなどを利用する。 そうすると、重複ファイルは、ゴミ箱に入る。確認が終わったらゴミ箱を空にすればOK!

ファイルがいつに撮影されたものか一目でわかるように。

ファイル名が日付になれば、一目でわかる。 jhead コマンドを利用する。

brewで一発で入る。

brew install jhead

ファイル名を変換するには以下のとおり。

jhead -nf%Y-%m-%d-%H%M%S [ファイル名]

正規表現が使えるので、

jhead -nf%Y-%m-%d-%H%M%S *.jpg

f:id:atani:20161201232106p:plain

あとは、年月日のディレクトリごとに整理するなりしたらスッキリ。

smtpの負荷試験

postfixサーバでの負荷試験をするために、smtp-source(postfixに内包されている) を用いた。 メールを配送したくないのであれば、smtp-sinkを使うと良い(ここでは割愛)

  • 例:

    smtp-source -s100 -m10000 -l 4194304 -f info@example.com -t info@hogehoge.com -M "example.com" -S "test mail" smtp.example.com

  • オプション

    オプション 説明
    -s SMTPセッションの並列数
    -m 送信数
    -l 送信サイズ
    -f 送信元メールアドレス
    -t 送信先メールアドレス
    -M HELOコマンドのホスト名
    -S 件名

送信元サーバが非力だと思った性能が出せないので、気をつける。

Go Lunch はじめました。

社内でGoの機運が高まってきたので、GoLangをもくもくとやる、GoLunchを毎週金曜日のランチタイムに集まってやることにしました。

第1回目は、9名の参加。 以下の書籍をみんなで買って、それぞれが好きなスピードで進めていくようにしてます。かなりゆるいです。

スターティングGo言語

スターティングGo言語

mac book airで環境構築。 Goのインストールから。バージョン変わった時にさくっと変えたいので、anyenvから、goenvをインストールしたのち、

# goenv install 1.6
# goenv global 1.6
# goenv rehash
# go version
go version go1.6 darwin/amd64

無事入りました。 anyenvのインストール方法や使い方は以下のリンクで。

qiita.com

頭のなかでgo buildができると豪語している @pyama 氏がvim-goが便利だという情報を聞きつけ、以下を参考にいれてみました。

qiita.com

加えて、.vimrcgoimportsを自動でやってくれるように設定します。

$ vi ~/.vimrc

let g:go_fmt_command = "goimports"

以下のようなコードを書いてみます。fmtがインポートされてないので、当然エラーになります。

package main

func main() {
        fmt.Println("Hello Golang")

}

が、vim-go入っていると、以下の通りファイルを保存する際に、自動で足りないパッケージをimportしてくれます!

f:id:atani:20160909135111g:plain

すごい!

スターティングGO言語本までいきつかずに本日はここまで。

C言語: NULLポイント

ポインタ変数は宣言直後はでたらめな値が格納されているので、このまま利用するのはバグとなり危険。 これを防ぐために、アドレスを代入したかどうかを区別する必要がある。 NULL をポインタ変数に代入しておくことで、区別をつけることができる。

  • 書き方

int *p = NULL;

  • サンプル
  1 #include <stdio.h>
  2
  3 int main(void)
  4 {
  5     int *p = NULL;
  6     if (! p) {
  7         printf("p = Null\n");
  8     }
  9     int i;
 10     p = &i;
 11     if (p) {
 12         printf("p = Not null\n");
 13         printf("p = %p\n", p);
 14     }
 15     return 0;
 16 }
  • 実行結果
# ./a.out
p = Null
p = Not null
&i = 0x7fff5690b83c

C言語: ポインタ、事はじめ

  • ポインタ型

    アドレスを記憶する変数の型。 他の型と合体して型を生成する。

  • ポインタ値

    変数のアドレスの値のこと。

  • ポインタ変数の宣言

int *p;
int* p;

どちらも同じ。

int* p1, p2;

と書いた場合、p2はint型になる。そのため、変数の前に*をつけて明示してあげたほうが良さそう。

アドレスを代入

#include <stdio.h>

int main(void)
{
    int *p, i;
    p = &i;
    printf("p = %p\n", p);
    printf("&i = %p\n", &i);
    return 0;
}

上記をコンパイルして実行すると以下の通りとなる。

# ./a.out
p = 0x7fff535df83c
&i = 0x7fff535df83c