2013/05/08: レイヤーごとにPDF書き出しするJavascript(2)
4年前のスクリプトレイヤーごとにPDF書き出しするJavascript 。これがなんと、いまだに現役で結構多くの人に使われているようなので、今更感は半端ありませんが、ちょっとアップデートしました。
PDFプリセットへの対応は、時間がなくて間に合いませんでした。すみません、また今度・・・
SaveAsPDFByLayers2.zip
↓ もし気に入ったらお願いします!
Get this for 120 yen
↓ もし開発手伝ってくださる方いたらよろしくお願いします。
https://github.com/naokazuterada/SaveAsPDFByLayers
新機能
・レイヤーの書出し順序の設定
・PDFのオプション設定
・前回設定の保存
特徴
・ページをレイヤー分けしておくと、自動でPDFに書き出してくれます
・不要なレイヤーは毎回削除するので、無駄にデータが増えません
・レイヤーの並び順に従い、ファイル名の頭に番号がつきます
(後は、Acrobatで連結してください)
機能
・最上位階層のレイヤーを上(または下)から順にPDFで保存します
・ロックされているレイヤーは操作の対象になりません
・ヘッダーなどの共通部分を含むレイヤーは「表示」&「ロック」しておくと便利です
・下位階層のレイヤーは操作の対象になりません。また、最上位階層でも「非表示」&「ロック」状態のレイヤーも非表示のまま書き出し対象になりますので、不必要なレイヤーはあらかじめ破棄しておくことをお勧めします(これを活用してください)
・書き出されたPDFのファイル名の接頭数字は3桁でつくので、Acrobatで一気に読みこんだ時に順番の入替作業が不要で便利です
インストール
ダウンロードしたZipファイルを解凍したら「レイヤー毎にPDFとして保存.jsx」を/Applications/Adobe Illustrator/preset/script/以下に移動。その後、Illustratorを起動します。
使い方
1. Illustratorを起動
2. PDFとして書き出したいAIファイルを開く
3. ファイル>スクリプトから、レイヤー毎にPDFとして保存を選択
4. ダイアログから並び順や保存先、各オプションを設定してOK
動作確認済の環境
Illustrator CS5.1 on MacOSX10.8.3
※ 上記以外の環境で動いたよって人は、コメントなどもらえると嬉しいです。多分CS2以降大体大丈夫なはず。
PDFプリセットへの対応は、時間がなくて間に合いませんでした。すみません、また今度・・・
SaveAsPDFByLayers2.zip
↓ もし気に入ったらお願いします!
Get this for 120 yen
↓ もし開発手伝ってくださる方いたらよろしくお願いします。
https://github.com/naokazuterada/SaveAsPDFByLayers
新機能
・レイヤーの書出し順序の設定
・PDFのオプション設定
・前回設定の保存
特徴
・ページをレイヤー分けしておくと、自動でPDFに書き出してくれます
・不要なレイヤーは毎回削除するので、無駄にデータが増えません
・レイヤーの並び順に従い、ファイル名の頭に番号がつきます
(後は、Acrobatで連結してください)
機能
・最上位階層のレイヤーを上(または下)から順にPDFで保存します
・ロックされているレイヤーは操作の対象になりません
・ヘッダーなどの共通部分を含むレイヤーは「表示」&「ロック」しておくと便利です
・下位階層のレイヤーは操作の対象になりません。また、最上位階層でも「非表示」&「ロック」状態のレイヤーも非表示のまま書き出し対象になりますので、不必要なレイヤーはあらかじめ破棄しておくことをお勧めします(これを活用してください)
・書き出されたPDFのファイル名の接頭数字は3桁でつくので、Acrobatで一気に読みこんだ時に順番の入替作業が不要で便利です
インストール
ダウンロードしたZipファイルを解凍したら「レイヤー毎にPDFとして保存.jsx」を/Applications/Adobe Illustrator/preset/script/以下に移動。その後、Illustratorを起動します。
使い方
1. Illustratorを起動
2. PDFとして書き出したいAIファイルを開く
3. ファイル>スクリプトから、レイヤー毎にPDFとして保存を選択
4. ダイアログから並び順や保存先、各オプションを設定してOK
動作確認済の環境
Illustrator CS5.1 on MacOSX10.8.3
※ 上記以外の環境で動いたよって人は、コメントなどもらえると嬉しいです。多分CS2以降大体大丈夫なはず。
2013/03/14: TransmitDiskの再インストール
Transmit 4.3.3 にアップデートしてから(の、気がするのですが)、FTPサーバーをディスクとしてマウントできる「Disk機能」が突然動作しなくなりました。
マウントしようとすると「操作を完了できませんでした。(POSIX エラー -1 -Unknown error: -1)」という内容のポップアップが出て、マウントできない状態。
再インストールや、AppStoreで3.3.2を再度購入してみたりと試してみましたが、うまくいかずサポートに連絡したところ、下記のようなお返事。
I think we've got this sorted out in 4.3.3.
First, quit Transmit and drag the Application to the Trash. Then delete "Transmit Disk" from ~/Library/Application Support/Transmit/. Now download a fresh copy of Transmit 4.3.3 and reinstall it.
4.3.3で解決したと書いてあって「?」となりましたが、とりあえずこのヒントで
1:Applications/Transmit.appの削除
2:「~/Library/Application Support/」内の「TransmitDisk」「TransmitDisk」(他にもいくつかTransmit◯◯というディレクトリがあったのでそれら全て)を削除し
3:再インストール
で問題解決しました。3の再インストールはMacAppStoreの4.3.2でも大丈夫でした。
やれやれ、この機能に相当依存していたのでほっと一安心。
でも、これが使えない間に試していたSublimeText2のSFTP/FTPプラグインも便利でした。Sassなどの外部コンパイル系で生成されるファイルが自動ではファイル監視されないのがちょっと難ありだけど、ローカルにリポジトリを置けるので、そういう意味では今までのTransmitDiskを使った開発よりも良いです。
マウントしようとすると「操作を完了できませんでした。(POSIX エラー -1 -Unknown error: -1)」という内容のポップアップが出て、マウントできない状態。
再インストールや、AppStoreで3.3.2を再度購入してみたりと試してみましたが、うまくいかずサポートに連絡したところ、下記のようなお返事。
I think we've got this sorted out in 4.3.3.
First, quit Transmit and drag the Application to the Trash. Then delete "Transmit Disk" from ~/Library/Application Support/Transmit/. Now download a fresh copy of Transmit 4.3.3 and reinstall it.
4.3.3で解決したと書いてあって「?」となりましたが、とりあえずこのヒントで
1:Applications/Transmit.appの削除
2:「~/Library/Application Support/」内の「TransmitDisk」「TransmitDisk」(他にもいくつかTransmit◯◯というディレクトリがあったのでそれら全て)を削除し
3:再インストール
で問題解決しました。3の再インストールはMacAppStoreの4.3.2でも大丈夫でした。
やれやれ、この機能に相当依存していたのでほっと一安心。
でも、これが使えない間に試していたSublimeText2のSFTP/FTPプラグインも便利でした。Sassなどの外部コンパイル系で生成されるファイルが自動ではファイル監視されないのがちょっと難ありだけど、ローカルにリポジトリを置けるので、そういう意味では今までのTransmitDiskを使った開発よりも良いです。
2012/11/20: Alfredから簡単にSublimeで開く
MacのランチャーソフトAlfredからファイルやフォルダを検索して、そのままSublimeText2で開けるようにします。
名前は"Open Terminal Here"をもじって"Open Subl Here"にしてますが、なんでもいいです。
Actionにチェックを入れておかないと、まずフォルダを探してから・・・っていう使い方ができないので気をつけましょう。
Command部分は下記
名前は"Open Terminal Here"をもじって"Open Subl Here"にしてますが、なんでもいいです。
Actionにチェックを入れておかないと、まずフォルダを探してから・・・っていう使い方ができないので気をつけましょう。
Command部分は下記
cd {query}
/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl .
2012/10/17: [MODX] 入力オプションをListBoxにしてリソース一覧取得しつつ、未設定も可能にする
長ったらしい表題ですみません・・・。
つまりは、入力タイプをListBoxにして、オプション値を下記のように設定すると、
ID123のドキュメント以下のリソース一覧の中から1つのIDを設定できるようなテンプレート変数が作れますが、
これだと、未設定、つまり何も値が設定されていない状態で保存することができないので、
これを何とかしたいということです。
答えは、オプション値に下記を設定します。
これで、先頭に「0」を値に持つ「なし」という項目が追加できましたので、規定値を「0」にするなどしておくと目的が達成できます。
@EVALを使うとPHPコードが実行できるので、いろいろ柔軟ですね。
つまりは、入力タイプをListBoxにして、オプション値を下記のように設定すると、
ID123のドキュメント以下のリソース一覧の中から1つのIDを設定できるようなテンプレート変数が作れますが、
これだと、未設定、つまり何も値が設定されていない状態で保存することができないので、
これを何とかしたいということです。
@SELECT `pagetitle` AS `name`,`id` FROM `[[+PREFIX]]site_content` WHERE `parent` = 123
答えは、オプション値に下記を設定します。
@EVAL return 'なし==0'.$modx->runSnippet('getResources',array('parents'=>'123','limit'=>'0','tpl'=>'@INLINE ||[[+pagetitle]]==[[+id]]'));
これで、先頭に「0」を値に持つ「なし」という項目が追加できましたので、規定値を「0」にするなどしておくと目的が達成できます。
@EVALを使うとPHPコードが実行できるので、いろいろ柔軟ですね。
2012/07/16: RSpecのオプション設定
2012/06/18: Contact Form 7 で、on_sent_ok が動かない
Wordpressのお問い合わせフォームプラグイン「 Contact Form 7 」で、2重投稿を防ぐ目的で、on_sent_ok を使って、Thank youページへ飛ばそうとしていたのですが、なぜかJSが動いていないことに気づいて、変だなーと思っていたら、
wp_footer();
を
footer.php に書いていないことが原因でした。
Contact Form 7 では、
wp_head()
でCSSと、jQueryを、
wp_footer()
で、フォームを制御する js を読み込んでいるようで、
この wp_footer() を実行しないと、
on_sent_ok で設定する jsが実行されないということが分かりました。
おそらく、Google Analyticsが動かないとか、色々言っている皆さんはだいたい、wp_footer(); が抜けてるのでは?と思いました。
他のプラグインでも、同じ原因で動かなくなることもあるかもなので、テーマを自作している人は注意ですね。
wp_footer();
を
footer.php に書いていないことが原因でした。
Contact Form 7 では、
wp_head()
でCSSと、jQueryを、
wp_footer()
で、フォームを制御する js を読み込んでいるようで、
この wp_footer() を実行しないと、
on_sent_ok で設定する jsが実行されないということが分かりました。
おそらく、Google Analyticsが動かないとか、色々言っている皆さんはだいたい、wp_footer(); が抜けてるのでは?と思いました。
他のプラグインでも、同じ原因で動かなくなることもあるかもなので、テーマを自作している人は注意ですね。
2012/06/18: wp_head(); から jQueryだけ読み込まないようにする
以下のように書けば、header.php などで、wp_headを実行する前に、wp_deregister_script('jquery')と書けば
jQueryだけ、wp_headの読み込みから削除できます。
jQueryだけ、wp_headの読み込みから削除できます。
<?php wp_deregister_script('jquery'); ?>
<?php wp_head(); ?>
2012/05/11: git-ftp.pyを使ってGitで管理しているFTP経由でローカルとリモートのファイルを同期
既にリモートサーバー上に配置されたプロジェクトを、今後Gitでバージョン管理していきたい場合、どうするのが一番いいのでしょうか?
こちらに書いたTransmitのディスク機能を使って、リモート側にリポジトリを作って・・・というやり方だと、addしたときに下記のようなエラーが出てうまく行きませんでした。
GitのドキュメントにはFTP経由でもいけそうに書いてあるのですが、マウント以外の方法でも自分が試した限りでは駄目でした。cloneなどはいいけど、書込み系のコマンドは駄目なのかもしれません。よくわかりませんが。
個人的にはこれだというところまでは行っていませんが、備忘録がてらひとつの方法の手順をまとめておきます。
git-ftp.pyを使って同期させる方法です。
上記GithubのサイトからソースコードをDLして、フォルダ毎ローカルのどこかに配置します(ZipでDLした人は、「git-ftp」にリネームしておくと良いでしょう)。
git-ftp.pyを実行可能にします。
リモートにあるファイルをローカルにDLして、プロジェクトディレクトリにリポジトリを作成します。
作成されたリポジトリ内に2つのファイルを追加します。
.git/ftpdata
.git/hooks/post-commit
post-commitを実行可能にします。
ここまでの設定を済ませておけば、あとはgit commit を実行した時に、post-commitがgit-ftp.pyを叩き、変更箇所をリモート側に反映してくれます。とりあえず、FTPでしか繋げないリモートのプロジェクトファイルをGitで管理できるようになりました。が、準備がちょっと面倒くさい、もっといい方法ないのだろうか...。
参考:
[Git]git で push したファイルを FTP 経由で差分アップロードするよ
こちらに書いたTransmitのディスク機能を使って、リモート側にリポジトリを作って・・・というやり方だと、addしたときに下記のようなエラーが出てうまく行きませんでした。
error: file write error (Input/output error)
fatal: unable to write sha1 file
GitのドキュメントにはFTP経由でもいけそうに書いてあるのですが、マウント以外の方法でも自分が試した限りでは駄目でした。cloneなどはいいけど、書込み系のコマンドは駄目なのかもしれません。よくわかりませんが。
個人的にはこれだというところまでは行っていませんが、備忘録がてらひとつの方法の手順をまとめておきます。
git-ftp.pyを使って同期させる方法です。
上記GithubのサイトからソースコードをDLして、フォルダ毎ローカルのどこかに配置します(ZipでDLした人は、「git-ftp」にリネームしておくと良いでしょう)。
git-ftp.pyを実行可能にします。
chmod +x /path/to/git-ftp/git-ftp.py
リモートにあるファイルをローカルにDLして、プロジェクトディレクトリにリポジトリを作成します。
cd /pa/th/to/project
git init
作成されたリポジトリ内に2つのファイルを追加します。
.git/ftpdata
[master]
username=ユーザー名
password=パスワード
hostname=FTPアドレス
remotepath=リモート上のプロジェクトディレクトリへのパス
ssl=no
.git/hooks/post-commit
#!/bin/sh
/path/to/git-ftp/git-ftp.py
post-commitを実行可能にします。
chmod +x /pa/th/to/project/.git/hooks/post-commit
ここまでの設定を済ませておけば、あとはgit commit を実行した時に、post-commitがgit-ftp.pyを叩き、変更箇所をリモート側に反映してくれます。とりあえず、FTPでしか繋げないリモートのプロジェクトファイルをGitで管理できるようになりました。が、準備がちょっと面倒くさい、もっといい方法ないのだろうか...。
参考:
[Git]git で push したファイルを FTP 経由で差分アップロードするよ
2012/05/11: リモートでもCompassを使いたい!
Sassとても便利ですね。Compassをインストールして、watchを走らせておけばローカルファイルを監視して変更があれば瞬時にコンパイルしてくれるので、もう通常のCSSなんて使いたくないと思うほどです・・・。
ただ、ローカルで作業している場合はいいのですが、ひとつ問題だったのがリモートホスト上にあるファイルをwatchすることができない点。案件ごとに変わるリモートのサーバーに毎回環境を整備するのは非常に面倒です(sshでログインすることすら面倒だし・・・)。ローカルのマシンにインストールしているCompassで、なんとかリモートのファイルを監視できないのか、色々調べてみました。
最初に見つかったのが、sshfsを使ってサーバーをローカルマシンにマウントする方法。依存関係やコマンドラインからの実行で多少面倒ではある物の、これを使えばマウントしたディレクトリをローカルのCompassでwatchできました。
→ sshでリモートサーバーをマウント、便利にsshfs / Unix的なアレ
素晴らしい!・・・と思ったのですが、10分も繋げているといきなり接続が切れたりして非常に不安定で、実用レベルには達しませんでした(Macへの移植の過程で何か問題が発生したのかな?)。sshfs関係はいくつかGUIアプリも出ていたのですが、どれも結局同じ不具合があり、開発が止まっているプロジェクトとかもあって、なんだか不安な感じでした。
あー、駄目なのかなぁ。と諦めかけた時、Transmitをいじっているとふと、「お気に入り>ディスクとしてマウント」というメニューがあることに気付きました。要は、上記のsshfsと同じようにリモートをマウントする機能なので、同じことができました。そして接続が切れません!素晴らしい。しかも、sshは不要でftpでログインできていればOK。ツールバーに常駐しているTransmitアイコンからも直接ディスクにマウント機能が使えます。この「ディスク機能」は、今回の件以外でもかなり役に立ちそうです。ありがたい!
Thank you, Transmit !!
ただ、ローカルで作業している場合はいいのですが、ひとつ問題だったのがリモートホスト上にあるファイルをwatchすることができない点。案件ごとに変わるリモートのサーバーに毎回環境を整備するのは非常に面倒です(sshでログインすることすら面倒だし・・・)。ローカルのマシンにインストールしているCompassで、なんとかリモートのファイルを監視できないのか、色々調べてみました。
最初に見つかったのが、sshfsを使ってサーバーをローカルマシンにマウントする方法。依存関係やコマンドラインからの実行で多少面倒ではある物の、これを使えばマウントしたディレクトリをローカルのCompassでwatchできました。
→ sshでリモートサーバーをマウント、便利にsshfs / Unix的なアレ
素晴らしい!・・・と思ったのですが、10分も繋げているといきなり接続が切れたりして非常に不安定で、実用レベルには達しませんでした(Macへの移植の過程で何か問題が発生したのかな?)。sshfs関係はいくつかGUIアプリも出ていたのですが、どれも結局同じ不具合があり、開発が止まっているプロジェクトとかもあって、なんだか不安な感じでした。
あー、駄目なのかなぁ。と諦めかけた時、Transmitをいじっているとふと、「お気に入り>ディスクとしてマウント」というメニューがあることに気付きました。要は、上記のsshfsと同じようにリモートをマウントする機能なので、同じことができました。そして接続が切れません!素晴らしい。しかも、sshは不要でftpでログインできていればOK。ツールバーに常駐しているTransmitアイコンからも直接ディスクにマウント機能が使えます。この「ディスク機能」は、今回の件以外でもかなり役に立ちそうです。ありがたい!
Thank you, Transmit !!
2012/04/03: localStorage の値を削除したいときはremoveItemを使う
こんな基本的なことで、つまずいてしまいました。
localStorageのあるキーの値を削除したいときは localStorage.removeItem を使いましょう。
nullやundefinedを代入しても、文字列扱いになってしまい条件分岐等に使ってると、気づきにくいです。。。
間違った方法
正しい方法
localStorageのあるキーの値を削除したいときは localStorage.removeItem を使いましょう。
nullやundefinedを代入しても、文字列扱いになってしまい条件分岐等に使ってると、気づきにくいです。。。
間違った方法
localStorage.hoge = 'buuu';
localStorage.hoge = null; // 'null' が代入されてしまう
localStorage.hoge = undefined; // 'undefined' が代入されてしまう
正しい方法
localStorage.hoge = 'buuu';
localStorage.removeItem('hoge');