お仕事メモ帳
こんにちは。開発系( InDesign、Illustrator、AppleScript、JavaScript、Ruby)、セミナーのレポートなどについて書いています。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


[Illustrator][AppleScript][Ruby]Illustratorを開かずに配置ファイルを収集する 続編(2014.02.10更新)
[Illustrator][AppleScript][Ruby]Illustratorを開かずに配置ファイルを収集するの続編です。

-----2014.02.10更新
10.9対応しました。
同時に過去のバージョンの配布を終了します。
おそらく10.9対応版で過去のOSも対応できていると思います。
ついでにコードの公開も終了します。
-----おわり


-----2012.10.5更新
ドロップしたファイルを1つのフォルダにまとめて収集する「1folder」版を同梱しました。
AppleScriptのコードを書き換えていますが、コードのアップはしません。
微妙に変えただけなので…。
-----おわり


-----2012.09.24更新
配置ファイルがないファイルの場合もデスクトップにコピーするように修正しました。
-----おわり


上記エントリで公開したAppleScriptは結構たくさんの方から評価をしてもらっているようです。
Twitterなり勉強会なりで「使ってます!」「助かってます!」というお言葉も頂戴しており、嬉しい限りです。
ただ、いろいろな不具合も起きてしまっているようで、「早く修正してー」と言われてしまうこともしばしばありました。
直そう直そうと思ってはいたものの、仕事やレノくんもふもふするのが忙しくて延び延びになってしまっていました。
フィードバックしていただいた方々、申し訳ないです。

ということで、今日頑張って修正しました!
Rubyのコードを大幅に書き換えて、AppleScriptのほうもいろいろリファクタリングしました。
この数ヶ月、暇を見つけては会社でいろんなスクリプト(Ruby含む)を書きまくっていたので、その辺の経験と知識を反映したつもりです。

修正した箇所は
●バージョン判別をRuby内で行うように修正(Adobe Illustrator CS2という文字があるかどうか)
●XMPだけを取得するように修正
●XMPのフルパスが存在しないときは次にIllustratorの同階層の画像を複製できるか試すように修正
●Windows環境で作成されたファイルの配置画像収集も可能なように修正
●同じような処理を行うサブルーチンを一つに統合した
●AppleScriptにRubyをバンドルさせるのをやめた

まず重いIllustratorファイル対応のためXMPだけを変数に代入して、その中で文字列操作することにしました。
ただしXMPの終了タグを検知して例外を発生させているためCS2以降のファイルでしか効果はでません。
次に不安定だったAppleScriptでのIllustratorのバージョン判定をやめて、Rubyで処理することにしました。
判定方法はXMPの中に「Adobe Illustrator CS2」という文字があったら例外を発生させて処理を中止するというものです。
バージョンダウンしたファイルだとうまく動かないかもしれませんが、バージョンダウンしないよね?
次にXMPから取得したフルパスが存在しないときはIllustratorファイルと同階層にあるファイルを複製するようにして、それでも見つからないものだけエラーログに書き出すようにしました。
次にざっくりとではありますがWindows環境で作成されたIllustratorファイルからも配置画像を複製できるようにしました。
Windowsのフルパスの中にバックスラッシュが入っていることを利用しているのでWindowsのバージョンや環境によってはうまく動かないと思います。
おまけ程度の機能追加だと思ってもらえれば。
次にサブルーチンを整理しました。
最後にRubyのバンドルをやめました。
ついでにAppleScriptの名前も変えました。

今回の修正でだいぶ完成に近づいたと思います。
不具合などあればコメントなどでお知らせください。
ご自分で直せるのであれば、どこを直したか教えていただけるとうれしいです。

以下のコードでは10.9には対応できていません、。
更新が面倒になったのでコードを読みたい方はダウンロードして読んでください。

Ruby
#! ruby -Ku

require 'CGI'
require 'kconv'

temp = ""
linkFilePath = "" ; #リンクファイルのパスの入れ物

#XMP情報を抽出して変数に代入
def xmpRead(fileObj, temp)
begin
while line = fileObj.gets
line = CGI.unescapeHTML(line)#HTMLエスケープされてるのでアンエスケープ
line = line.toutf8

#XMP終了時に例外を発生させる
if /^<\/x:xmpmeta>/ =~ line then
raise "loop stop" #raiseで例外を発生できる
end

if temp == ""
temp = line
else
temp = temp + line
end
end
rescue
return temp #tempを返す
end
end

def illustratorPackage(temp, linkFilePath)
if /Adobe Illustrator CS2/ =~ temp
raise "before CS2"
end

linkFilePath = temp.scan(/^\s+?(.+?)<\/stRef:filePath>/)
if linkFilePath == []
linkFilePath = "nil"
end
return linkFilePath #linkFilePathを返す
rescue

end

temp = xmpRead(ARGF, temp)
result = illustratorPackage(temp, linkFilePath)
puts result


AppleScript
on open thisList
tell application "Finder"
--Rubyのバージョンチェック
if exists ((home as text) & ".bash_profile") then
set ruby_version to do shell script "source ~/.bash_profile; ruby -e 'print \"ERROR\" if RUBY_VERSION <= \"1.8.1\"'"
else
set ruby_version to do shell script "ruby -e 'print \"ERROR\" if RUBY_VERSION <= \"1.8.1\"'"
end if
if ruby_version is "ERROR" then
display dialog "このスクリプトはRubyバージョンが1.8.2以上で動作します"
error number -128
end if

--変数初期化
set dPath to desktop as text --デスクトップのパス取得
set noExtractFileList to "" --エラーが出たリンクファイルのパスを入れる箱
set textFile to dPath & "収集できなかったリンクファイル.txt" --ログ書き出し 用のテキストファイルの名前
set errorFileLog to "" --エラーが出たファイルのパスを入れる箱
set skipFile to 0 --CS2以下のファイルのカウント用

--Rubyのファイルを取得
set my_script_name to "IllustratorPackage.rb"
set my_script_folder to parent of (path to me) as Unicode text
set my_script to my_script_folder & my_script_name
set my_script to (quoted form of POSIX path of my_script)

--ここからメイン処理
repeat with k in thisList

set input_file to (quoted form of POSIX path of contents of k) as Unicode text --Unicode textに変換しないとダメ

if exists ((home as text) & ".bash_profile") then
do shell script "source ~/.bash_profile; ruby " & my_script & " " & input_file --Rubyで処理して戻り値を取得
else
do shell script "ruby " & my_script & " " & input_file --Rubyで処理して戻り値を取得
end if
set outputList to result --変数に代入

--Rubyの戻り値がnilじゃなかったら(CS3以上でリンクファイルがあれば)
if outputList is not "nil" then

set linkFileList to my serchSplit(outputList, ASCII character (13)) --リストにする

--デスクトップにフォルダを作成しリンクファイルをコピーする処理へ
set resultList to my LinkFilePackage(linkFileList, noExtractFileList, k)

duplicate k to item 1 of resultList --デスクトップのbackFolに複製する

if (item 2 of resultList) is not "" then
set errorFilePath to k as string
set errorFile to last item of (my serchSplit(errorFilePath, ":"))
set errorFileLog to errorFileLog & "★" & errorFile & "で収集できなかったリンクファイル" & return & (item 2 of resultList) & return
end if

delay (0.5) --同名フォルダ作成のエラーを回避するため1秒待つ
else if outputList is "nil" then --2012.09.24追記--リンクファイルなしも収集するように変更
set linkFileList to my serchSplit(outputList, ASCII character (13)) --リストにする
set resultList to my LinkFilePackage(linkFileList, noExtractFileList, k)
duplicate k to item 1 of resultList
delay (0.5)
else
set skipFile to skipFile + 1
end if
end repeat

--エラーログの書き出し
if errorFileLog is not "" then
try
set OutPutText to open for access textFile with write permission
set eof OutPutText to 0
write "ここに書き出されたファイルは収集できませんでした。Illsutratorデータのリンク情報が正しくない可能性があります。Illustratorデータを再保存した後、再度スクリプトを使用してください。" & return & return to OutPutText
write errorFileLog to OutPutText
close access OutPutText
on error errMsg
display dialog errMsg
close access OutPutText
end try
end if
end tell

if ((count thisList) - skipFile) > 0 then
display dialog ((count thisList) as string) & "ファイル中の" & (((count thisList) - skipFile) as string) & "ファイルを収集しました"
else
display dialog "収集されませんでした"
end if
end open

--デスクトップにフォルダを作成しリンクファイルをコピーする処理
to LinkFilePackage(linkFileList, noExtractFileList, k)
tell application "Finder"
--バックアップファイルのコピー用にデスクトップに現在時刻名のフォルダを作成する
set dPath to desktop as text --デスクトップのパス取得
set folName to (do shell script "date '+%Y-%m-%d %H-%M-%S'") --現在時刻取得
set backFol to make new folder at dPath with properties {name:folName} --デスクトップにフォルダ作成
set label index of backFol to 2 --ラベルを付ける

repeat with i from 1 to count linkFileList
try
set linkFilePath to (item i of linkFileList) as POSIX file --as POSIX fileで:区切りのパスに戻せる
set linkFilePath to file linkFilePath --file 〜ってしないとダメ(ファイル参照させないとダメ)
duplicate linkFilePath to backFol with replacing --デスクトップのbackFolに複製する(同名ファイルは上書き)
on error --複製できなかったファイルの処理(Illustratorファイルと同階層のファイルを複製)
--Windowsで作成されたデータもざっくり判別(パスの中に\があるかどうかで判別)
if "\\" is in (item i of linkFileList) then
set errorLinkName to last item of (my serchSplit((item i of linkFileList), "\\")) --ファイル名をサブルーチンで取得
else
set errorLinkName to last item of (my serchSplit(linkFilePath as Unicode text, ":")) --ファイル名をサブルーチンで取得
end if

--同一階層からリンクファイルをコピーする
try
set illFileFol to (container of k) as Unicode text --illustratorファイルの内包されているフォルダを取得
set linkFilePath2 to file (illFileFol & errorLinkName) as Unicode text --file 〜ってしないとダメ(ファイル参照させないとダメ)
duplicate linkFilePath2 to backFol with replacing --デスクトップのbackFolに複製する(同名ファイルは上書き)
on error
--同階層からもコピーできなければエラーログに代入する
set noExtractFileList to noExtractFileList & (errorLinkName as string) & return
end try
end try
end repeat
return {backFol, noExtractFileList} --メインルーチンにListで戻す
end tell
end LinkFilePackage


--分割サブルーチン
to serchSplit(targetStr, splitStr)
set str to targetStr as Unicode text
set OriginalDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to splitStr
set itemsList to text items of str
set AppleScript's text item delimiters to OriginalDelimiters
--itemsListにリストで代入されているからあとはご自由に
return itemsList
end serchSplit



ダウンロードはこちら。
IllustratorPackage
スポンサーサイト


今年もお世話になりました
大掃除…ではなく小掃除ぐらいのお片付けを終えて、ご飯食べて、コーヒー飲みながらブログを書いています。
レノくんですか?
キッチンでもっしゃもっしゃご飯を食べている音がしますw

さて。
今年もあと数時間で終わりますね。

昨年と同じく今年をいくつかのカテゴリにわけて振り返ってみましょうか。

●仕事

もうね、とにかく忙しかった。
これに尽きますね。
肉体的にも精神的にもこれまでになく疲弊した一年でした。
もちろん得たものも多かったのですが、とにかく疲れました。

そんな中、前期の成果を認められて表彰されたのは嬉しかった。
落ち込みがちな日々なので、褒められるととても救われますね。

新しいことへのチャレンジは…なにかしたかなぁ。
とにかくタスクをこなすことに追われ続けていたので、正直なにかできたかというと自信はないですね。


●資格、勉強会など

LPICレベル1をようやく取得できました。
仕事の忙しさにかまけて放置してましたが、さすがに勉強開始から一年経っても取得できないのはどうかと思い、無理矢理に時間を作って合格にこぎつけました。
いまはJava SE7 Silverの勉強を始めたところです。
でも休日はなかなか布団から起きられないので遅々として進まず。
どうしましょうね…。

勉強会関連は今年は大阪DTPの勉強部屋様で進行管理についてセッションをさせていただきました!
これは楽しかった!
会社に話を通して自社開発の校正ツールをインストールしてもらったり、原稿の草案を確認してもらったり、自社のウリを改めて探してみたり、普段あまりやらないようなことを経験出来ました。
また過去にショートセッション1回しかやったことがなかったので、原稿を書いたり、スライド作ったり、デモ用のスクリプトの準備をしたり、準備にも追われましたね。
でも楽しかったー。
DTP系の勉強会だとやはりアプリケーションの技術の話などが大半を占めることが多いので、アプリケーションにとらわれずに仕事をどううまく回すかといった観点でお話ができたのは、自分にとっても自分のやってきたことを再認識できるいい機会でした。
内容は…どうなったのでしょうか。
まぁ言いたいことは言えたし、個人的には満足の出来でした、うん。
声をかけていただいたえむさん、ありがとうございました!

あとはPerlの勉強会に何度か参加しました。
Twitterで兼ねてから一緒に参加しようと声をかけていただいていたので、意を決して参加してみたのですが、なかなか楽しかった。
Perll、楽しいですね。
参加したのはPerl入学式という勉強会なのですが、講師以外にサポーターが複数名いらっしゃって、分からないときは聞いたらすぐにサポートしてくれて助かりました。
ハンズオンの勉強会はほとんど行ったことがなかったので、みんなでコードを見せ合いながら勉強するのって楽しいなぁと実感しました。
年内最後の勉強会は資格取得の勉強で参加できなかったので、来年もあるなら参加したいなぁと思います。
他の言語でもこういう勉強会があれば参加したいなぁ。
コードが書きたいです…!


●プライベート

今年は昨年にもましてriskriskさんとchangeworldsさんに遊んでもらった一年でした。
気兼ねなく言いたいことがいえる友達って貴重ですね。

DTP関連の方々にも飲みに誘ってもらったりしてたくさんかまっていただき、感謝感謝です。
とても心配してくださる方が多くて出会いに恵まれているなぁと思いながら甘えることしばしば。

あー、あとは体調を崩すことが多い一年でした。
恒常的なめまいに頭痛に吐き気、それに親知らず、健康診断での胃の再検査など、いろいろありました。
こちらもたくさんの方にご心配かけてしまいましたね…。



●レノくん

レノくんは今年も怪我もなく元気に暮らしてくれました。
そしてなぜかより一層甘えん坊王子になりましたw
話しかけるとお返事したり、キッチンからダッシュで帰ってきてすりすりしたり、とてもかわいく育っております。
顔は怖いですけどね(ぼそっ


振り返りは以上かな。

最後に。
今年も皆様には大変お世話になりました。
来年も変わらずたくさんかまっていただけると嬉しいです。

あ、来年もTwitterではレノくんのファンを増やすべくたくさんの写真をアップしますので、そちらもよろしくお願いします。

それではよいお年を!


[雑談]FizzBuzzをいくつかの言語で書いてみた
新しい言語を触るときに、なにかお題がないと書くことができない私。
友達からFizzBuzzを教わってからは、とりあえずFizzBuzzを書くことにしている。
まー、ググって出てくるような「少ないコード数でいかに速度をあげるか」みたいなものではなくて、適当に関数作ってみたり、変数に入れてみたり、特にルールもなく思いつきで書いています。

せっかくなのでいくつか載せてみます。

Perl。
#!/usr/bin/env perl
use strict;
use warnings;

my $result;

for my $i (1..30) {
if ($i % 3 == 0 && $i % 5 == 0) {
$result = "FizzBuzz!\n";
} elsif ($i % 3 == 0) {
$result = "Fizz\n";
} elsif ($i % 5 == 0) {
$result = "Buzz\n";
} else {
$result = $i."\n";
}

print $result;

}


Perl(書き直した)。
#!/usr/bin/env perl
use strict;
use warnings;

my $result;

for my $i (1..30) {
$result = $i."\n";
$result = "Fizz\n" if ($i % 3 == 0);
$result = "Buzz\n" if ($i % 5 == 0);
$result = "FizzBuzz!\n" if ($i % 3 == 0 && $i % 5 == 0);
print $result;
}


Ruby。
# coding: utf-8

def printMessage(str)
puts str
end

for i in 1..100
fizz = 3
buzz = 5
if (i % (fizz * buzz) == 0)
printMessage("FizzBuzz")
elsif (i % fizz == 0)
printMessage("fizz")
elsif (i % buzz == 0)
printMessage("buzz")
else
printMessage(i)
end
end



AppleScript。
tell application "Finder"
repeat with i from 1 to 15
if i mod 3 is 0 and i mod 5 is 0 then
log "fizzbuzz"
else if i mod 3 is 0 then
log "fizz"
else if i mod 5 is 0 then
log "buzz"
else
log i
end if
end repeat
end tell


[AppleScript][Ruby][rbenv]rbenvで管理しているRubyをAppleScriptから呼ぶ
ブログにインストール手順のエントリを書き忘れているようですが、Macbook AirではHomebrewからインストールしたrbenvを使ってRubyを管理しています。
下記エントリで突然rbenvについて書いてますね…。

[Ruby]homebrew環境でrbenvにruby-2.0.0-p0を入れてみた

で、rbenvをインストールしたときからAppleScriptでrbenv管理下のRubyを呼べなくて困ってたんですよ。
原因はわかっていてrbenvをインストールしたときにbash_profileに書き込んだところでエラーになってました。

eval "$(rbenv init -)"

そしてAppleScript自体を最近書かなくなったので放置していたところ、全然別のことを調べていたら、うっかり解決方法に行き着いちゃいました。

launchdの作業ディレクトリ - 別館 子子子子子子(ねこのここねこ)

どうやらrbenvのところをフルパスで記述してあげれば良いみたい。

eval "$(/usr/local/bin/rbenv init -)"

試しにテスト用のAppleScriptを書いてみた。
do shell script "source ~/.bash_profile; ruby -v"

ふむ、ちゃんとrbenvで管理しているRubyを呼んでいるな。

まったく思いもしないところに答えは転がっているんだねぇ。

Ruby トラックバック0 コメント0 page top


[Ubuntu12.10][Vim][Perl]Vimの環境を設定しながらPerlの開発をしやすくしてみる
こんにちは、暑い日が続きますが、体重7キロ弱の黒猫レノくんにくっつかれて眠ることに喜びを感じる私は今日も元気です。
重いことを除けば非常に幸せです。
重くなければね(大事なことなので2回ry)

さてUbuntu12.10のVim環境を構築中です。
Vim自体はMacの環境設定のときにファイルを開いたり、LPICの勉強で少し使い方を覚えた程度の知識とスキルしかないです。
でもこれから開発のお仕事をやっていく上で使えるにこしたことはないのかなぁと思ったので、ググりながらパク…知識を拝借しながら環境を作っていこうと思っています。
関係ないけどUbuntuのIME的なものがなかなかおバカさんでイラっとしますね。
GoogleIMEでも入れましょうかね。

本題。
ひとまずの目標はプラグインを入れて補完やスニペットを使えるようにすることです。

最初の一歩としてneobundleを導入することにしました。

参考にしたのは下記のサイト。

Vimプラグインの導入#1 (neobundle, vim-quickrun) - No Bugs, No Life
Hack #238: neobundle.vim で plugin をモダンに管理する

ちょっとハマったのは.vimrcに書き込んだ中にneobundleのディレクトリパスを記述しなければいけなかったのを見落としていて、気づくのに一時間ぐらいかかりました…。
うーん、毎度環境構築のたびに似たようなミスを繰り返しているなぁ。

さてneobundleの導入とともにメジャーなプラグインは導入できたっぽいので、いろいろググって設定をしていきます。
下記を参考にしつつ、.vimrcの設定は作者のgithubを参考に記載してみた。

VimでPerl(に限らないけど)を書くときにこれだけはやってほしい設定 - Qiita [キータ]
Shougo (Shougo) · GitHub

とりあえずneosnippetでスニペットファイルの読み込みができるところまで設定できた。
先にhoge.plとかやって拡張子との関連付けをしておかないと<C-k>してもスニペットが展開されないことに気づくまでに数時間かかりましたよ…。
おバカすぎて疲労感が半端ない。

まぁおかげでvimfilerの使い方も微妙に分かったし、良しとするかなぁ。

ちなみにVimのショートカットは下記を参考に覚えながら使っています。
こういう情報を面倒がらずに公開してくれる方がいるのでとても助かります。

ise0615 blog: Vim チートシート

本を買えばいいんだけど、買っても読まなそうなので…。

うーん、Perlの勉強ができてない。
Perl入学式の当日は過去に書いたPerlを見ながら構文を思い出しつつになりそうだ。
書き始めたら思い出すかなぁ。

この際だからRubyもVimで書いてみようかなー。

今日はもう疲れたからMinecraftで別宅建築の続きでもやりますかね。




Copyright © お仕事メモ帳. all rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。