2013年5月27日月曜日

女の娘できた。

ちょっとうp遅れたけどできますた。
いろいろ書きたい事はあるけれど今は忙しいのでまた今度。
とりあえずむずいことは十分すぎるほどわかったw
これでオリジナルキャラとか作ろうと思ったらいったいどうすればいいのだろうか…。



2013年5月18日土曜日

macでAnkPixivToolsでダウンロードした漫画の画像の連番ファイル名をリネームする。

パッと目についたGotomsさんを参考用に使用。
Pixivの画像を保存するときにはFirefoxのプラグインである「Ank Pixiv Tools」なんてのを使わせてもらってて。
普通の画像はもちろん、漫画形式のファイルとかもダウンロードできるわけです。(ジェスチャにも登録できるからサックサク)
設定でダウンロードしたときのファイル名をいじれるからすごく管理が楽になって便利なんで愛用させてもらってる。

ただ、漫画形式のファイルは「作者名 - 作品タイトル」ってフォルダと、その中に「01.jpg(png)」から始まる連番ファイル名の画像が生成されるのね。
確認してみても、この連番ファイル名を変えるような設定はないっぽい…。
自分的にはこの連番ファイル名にも作者名とかつけたくて、「作者名 - 作品タイトル 01.jpg」みたいにしたいわけ。

ってなわけであれこれ策を弄して自分でリネームすることに。
以下、事の経緯をだらだらと書き連ねる。
例によって先に結論をいっておくと、「Automator」とシェルスクリプトで満足のいく動作を実現できた。

自分が求める動きは、とにかく手軽にできること。
なるべく自動化したい。ワンクリックで済むならgoodってとこ。
漫画フォルダを選択して、ワンクリックでリネームって流れね。

まず第一候補。リネームってんだからリネーマーアプリを使うのを考える。
が、MountainLionで動くリネーマーアプリって良く知らないのよね(´・ω・`)
それにソフトの起動を含めると「ワンクリック」とは行かなそう。断念。

第二候補。本命「Automator」。
こいつはmacのいろんなバッチ処理を作成できるアプリ。
まさしくリネーム作業に向いてるアプリなんだけど、 だめ…。
というのもリネームするときにフォルダの名前から作者名とタイトルを拾ってくるさいに、複数のフォルダを同時に処理すると、そこでつまづいちゃう…。
「A」フォルダの中身を「A xx.jpg」にしてから「B」フォルダの中身を「B xx.jpg」にするようにしてほしかったのに、うまくいかない。「AB xx.jpg」とかになっちゃう。
Appleスクリプトを途中で噛ましたりすればいけそうだったけど、なにやら先行き不安なので断念。

第三候補。シェルスクリプト。
前回Blenderの定期スクリーンショットで撮るのに使ったように、これまたリネーム作業に向いてると言えるんじゃないかな。
ただシェルスクリプトはターミナルを一度開かないといけないし、以前のようにapp化したスクリプトに選択したフォルダを渡す方法ってのがないと思ってた。
だからちょっと望み薄かなあと考えてたわけ。
しかし「Automator」のライブラリを見てたら、シェルスクリプトが使えることが判明!

ってなわけで「Automator」で選択したフォルダを受け取りつつ、シェルスクリプトでリネームする方向に決定。
まずはググる。参考になったのはこちら
ネックは「入力の引き渡し方法」。これが第二候補で詰んでた原因だしね。
どうやら入力を「引数として」受け取るようにすれば各フォルダごとに処理ができるらしい。
引き渡し方法を選択した時点で最低限のシェルスクリプト(ループ処理)が自動で書かれるのは親切親切。
あとはトライアンドエラーでいじくり回していく。
「Automator」の設定は以下の画像の通りシンプルきわまりない。
保存設定は「アプリケーション」で。「.app」ファイルをアプリケーションフォルダでもどこでも適当なところに置いて、Finderのツールバーに登録すればおk。
ちなみに保存方法を「サービス」にすれば右クリックメニューからも使えるし、「選択されたFinder項目を取得」を無くせば「フォルダアクション」としてつかうこともできた。
肝心のシェルスクリプトは以下の通り。
リネームした画像は「mv」で移動させてるので、「~/Downloads」はお好みで変えてくだしゃー。
元の漫画フォルダ内に残したい場合は「mv」の行そのものを削除で。
万が一を考えて「cp」で元のファイルは残して処理してるけど、それがいやなら「cp」を「mv」に変えて、もともと書いてある「mv」の行を削除すれば期待どおりになる…はず。

OD=$PWD
for f in "$@"
do
    #if directory doesn't exist, exit.
    if [ ! -d "$f" ]; then
 echo Not found \"$f\"
 exit
    fi

    ESHI=`basename "$f"`
    cd "$f"

    #if there is any folder inside directory, exit.
    if [ `ls -F | grep / | wc -l` -gt 0 ]; then
 echo ERROR! may be not PixivMangaFolder
 exit
    fi

    for image in `ls -F | grep -v /`
    do
 cp $image "$ESHI"\ "$image"
 mv "$ESHI"* ~/Downloads
    done

    cd "$OD"
done
処理の簡単さのわりに意外と長い。
実は、試行錯誤を繰り返してる最中に「mv」コマンドや「rm」コマンドの指定をミスって、ホームフォルダを吹き飛ばしそうになったりしたから、そこらへんを慎重に処理するために、if分を2回ほど挟む事になっちゃった。
見れば分かると思うけど、指定したフォルダがなかった場合と、そのフォルダの中にフォルダが入っている場合(漫画フォルダは中身は画像ファイルだけのはず)には終了するようになってる。
前者は「Automator」でアプリケーション化したらあり得ない条件になるから、いらないかも。
後者は間違ってダウンロードフォルダとか、別のフォルダをリネームしようとしたときに一応ストッパーになるはず。
当然、中身にフォルダを持たないフォルダは全部漫画フォルダって認識しちゃうから、あまり信用できたものじゃないYO。
連番ファイルの認識がよー分からなかったよ。正規表現とかでやるのかなあ。
他に案としては「grep」で「jpg」「png」「gif」だけを拾って処理とか考えたんだけど、これ以外の画像フォーマットが来た場合とか(あるわけないのにw)考慮して無条件で拾ってきてる。
(それらのおかげと言っちゃなんだけど、「フォルダ名を中身のファイルに付与するリネーマー」としても使えちゃったりする。以前にAnkPixivToolsを使わずにDLした画像もこれでリネームするとちょっとすっきりする。)

とまあ、こんな感じ。4、5時間経過しとるわw
できる人からみたら結構めんどくさかったり、危ないことしてるんだろうなあ。
自分の思うままの機能をもったアプリを作るのはやっぱりおもしろいね。
そういう意味ではシェルスクリプトはすごく手が出しやすいと思う。
「Automator」を使えばスクリプトからアプリケーションに早変わりするのも良い。

2013年5月6日月曜日

MacでBlenderのスクリーンショットを定期的に撮るTIPS

自分がBlenderで作業しているときは、定期的にスクリーンショットを撮るようにしてるんだけど、
これが結構忘れがち。
自動で撮るようにできんかなあとあれこれ調べて一応できたからメモメモ。
(ちなみにショートカットはcmd+shift+3 or 4 or 4+spaceね。)

先に言っておくとBlenderは画面最大で使ってること前提ね。
ただたんに画面全体撮るだけだから、他に開いてるウィンドウも映ることあるっす。

使ったのはシェルスクリプト。
いじるのも初めてだったので結構ハマったね。

参考にしたサイト様は2つあって、ひとつはcrontabを使ってる人のページ。
ここではcrontabを使って定期的にスクリーンショットを撮る方法を紹介してるんだけど、
「Blenderが起動している間」っていう条件の付与の仕方が分からなかった(´・ω・`)

そんでアップルスクリプトやらシェルスクリプトやら、そっちでやろうと思ったのさ。
そこでこんなページを見つける。
つまり、このプロセス監視で「Blenderが起動している間」という条件をつけつつ
「screencapture」コマンドを使ってSSが撮れるって寸法SA。

で、できたコードが以下。
見れば分かとこは自分で変えていってね><
アプリケーションフォルダにBlenderフォルダ置いてない人とかね。
撮影は15分間隔毎に設定してます。変えたい人はssintervalの式をいじろう。
#!/bin/sh

#Blenderの起動
open /Applications/Blender/blender.app
#起動するまでちょっと待つ
sleep 2

#撮影間隔(秒)
ssinterval=$((60*15))
echo $ssinterval '秒ごとに撮るでー'

while true
do
    ALIVE=`ps -ef | grep "/blender.app" | grep -v grep | wc -l`
    if [ ${ALIVE} = 0 ]; then
 echo '撮り終わったで。'
 break;
    else
 echo '撮るでー'
 # -x つけると音がしなくなる
 /usr/sbin/screencapture -m -C -T0 ~/ss/スクリーンショット\ `date +%Y-%m-%d`\ `date +%H.%M.%S`.png
    fi

    sleep $ssinterval
done
…すごい時間かけた割にはあっさりしたコードだね。
これをemacsでもmiでもいいからコピペして保存して、拡張子を「.sh」に変えて。
「sh」コマンドで走らせれば動くはず。
いちいちターミナル起動するのたるい!って人はこちら。
「.sh」ファイルを「.app」ファイルにする「.app」を作ったらしい。うmややこしい。
しかし、「.app」にして実行すると、このアプリのアイコンがDockでぴょんぴょん跳ねるのよね。邪魔。これなら潔くTerminalが開いてくれるほうがいいかなあと思って、
自分は最初に書いてある、実行権限を与えて「.command」に拡張子を変更する方法で留めてる。
あ、一応書いておくと実行権限は「chmod」コマンドで下のとおりに打てばいいはず。
chmod -x hoge.sh

作った「.command」ファイルはDockにいれといてもいいし、Alfredでスペース叩いてから指定してもいい。
ここらへんもうちょい改善していきたいんだけどね。
Blender側から起動できればいいんだけど…できんのかな?

以上、MacのBlenderでスクリーンショットを自動で撮るTIPSでしたとさ。
「screencapture」コマンドさえ代用できればwinでもいけるかも。
一番いいのはアドオンで実装されることなんだけどなー。