この記事は何?
私の妄想のうち、まあやる気と時間があればやるんじゃないかな、くらいのものを、晒しておくものです。
適宜、新たに妄想したものや思い出したものを追加したり、妄想が進んだり状況が変わったりしたものを更新したり、するつもりです。
たぶん、誰かの役に立つものではないと思います。
【ToyBaby】SyncToy2.1 の設定ファイルエディタ [SyncToy][Node.js]
概要
Microsoft 謹製のファイル同期ツール SyncToy の設定ファイルを編集するツール。
正直、GUI でちまちまと入力しないといけないのは辛いですよね。複数台のマシンに同じ設定を何度もやったり、あるいはちょっとした修正をしたりとか。SyncToy では folder pair の left/riget folder のパスが変わったら一から作らないといけないんです。既存の folder pair の設定の編集はできないんです。やってらんないでしょ。
状況
- github にリポジトリ作った
- 何でもかんでも好きなようにいじる、ところまでは行ってないですが、最低限必要な、(1) 必要な数だけ folder pair を作れる。(2) folder pair の名前を好きに決められる。(3) action (synchronize/echo/contribute の別) を決められる。(4) Left/Right Folder のパスを決められる。というのはできました。
- emacs の hexl-mode でいじって済んじゃっているので、なかなか進まない
その他情報
- SyncToy の設定ファイルは「C:\Users{ユーザ名}\AppData\Local\Microsoft\SyncToy\2.0\SyncToyDirPairs.bin」にあるよ
- よくわからないけれど、.NET の何かで serialize/deserialize すればもっとずっと簡単なんじゃないかな、調べてないけど。
hexl-mode (とかバイナリエディタ) とかで編集する際のヒント
(1) については、HEX表記で 0001000
から始まり 01010001000b
で終わる一連のブロックをまるっとコピーすればおっけー。 そのうえで (2) ~ (4) をいじるわけですが、よくあるシリアライズドデータと同じで、文字列データの先頭にはその文字列長が埋め込まれているんですね。たとえば Left Folder のパスを "C:\Users\Public\Pictures
" に変更するとしたら、echo -n "C:\Users\Public\Pictures" | wc -c
で文字列長を知って、該当箇所で hexl-insert-decimal-char
でその長さを埋め込めばおっけー。 勝ったも同然ですな。 まあ、Emacs でいじれることがわかれば、他の LL を使ってこのファイルを自由にいじり倒して出力することができますね。
【華の舞】Googleスプレッドシートでのケータイアドレス帳管理システム [Google Apps Script]
概要
ケータイのアドレス帳を表管理アプリ (Google スプレッドシート) で管理する仕組み。次のような不満を解決するためのものです。
- 複数のケータイでアドレス帳を同期するの面倒でしょ。au だとサーバ上にアドレス帳をバックアップするサービスがあるけど、バックアップ/リストアのたびにパケット代かかるのがね。
- そもそも、ケータイの限定された UI で住所入れたり、ちょっとした修正を加えたりって面倒すぎてやってられない。
- 使っているのはもちろん、ガラケー。一択です。
状況
- Google スプレッドシートで管理しているアドレス帳をうちの代表 (妻) のケータイと土木作業員 (私) のケータイ、二つのケータイに取り込むのはできて、もう使っているよ
- ケータイのアドレス帳を Google スプレッドシートに反映させる、という逆方法については、まだ「Windows 上で動く VCard -> CSV 変換ツールで CSV 化したものを Google ドライブにアップロードして Google スプレッドシートのアドレス帳に手動でマージ」という泥臭い手作業をしているので、VCard のパーサを作りたい
仕組み
- Google Apps Script で、Google スプレッドシートなアドレス帳を VCard 形式でダウンロードする WEB API を作成
- WEB API のフレームワーク的なものは自前ライブラリを使っているよ
- クライアントはなんでもいいけど、今は cygwin 上の shell script で wget を使って WEB API を叩いてるよ
使い勝手
- Google スプレッドシートでアドレス帳を管理
- hananomai スクリプトを実行し、全アドレスが載った VCF 形式ファイルがダウンロードされる
- 以下の作業をケータイごとに実行
- ケータイを「外部メモリ転送モード」でパソコンに USB 接続
- ダウンロードされた VCF ファイルをケータイのバックアップ保存領域にコピー
- ケータイをパソコンからはずす
- ケータイのアドレス帳バックアップ機能を使って最新の VCF ファイルでアドレス帳を全書換え
さらなる妄想
- ライブラリもしくはアプリとして公開したいな
- GAS でいじってるんで、ケータイごとに載せるアドレスを選択したり、情報を調整したり、ってのはやりたい放題でもうやってるけど、ライブラリに組み込む部分と個々人がカスタマイズする部分の切り分けが(ライブラリとしての設計上)まだ迷ってる
- Gmail の「連絡先」との連携も難しくない。んだけど、うちの運用としては、マスターデータはオフィス LAN 内サーバの RDBMS で管理する顧客データ (未実装) で、「Google スプレッドシートをフロントエンドとして使う」「Gmail の『連絡先』の情報を選択的に取り込み、書き出し」「ケータイのアドレス帳の情報を選択的に取り込み、書き出し」としたい
- ケータイのアドレス帳をアップロードすると Google スプレッドシートに反映するところははやく作りたい
【Almost Humbler Gmail】Gmail でときならぬ時間帯にケータイにメールを送るのを防止する仕組み [user script][Tampermonkey]
概要
お客さまにメールで連絡することも多いわけですが、うっかり深夜とかにケータイ宛てにメール送っちゃったりしてしまうこともあるわけです。
なんで、Gmail においてときならぬ時間帯にメールを送ろうとしたときに、「え、ほんとうにいいの?」という確認ポップアップを出すものであります。
状況
- もう使っているよ
- user script において、公開してもいい部分と、個々人がカスタマイズできる設定ファイルを分離できたら公開してもいいんだけど
- デベロッパーモードでローカルの extension が使えることがわかったので、extension 化して Chrome ウェブストアにアップすることを検討中。てか作業中
仕組み
- Tampermokey, Google Chrome, Gmail
【iptables.sh】いろいろ覚えていられないダメ管理者向け iptables 設定ツール [iptables]
【multidawn】名刺用紙にあうように作った画像を複製して並べる Inkscape 拡張 [Inkscape][Python]
概要
次からは名刺を Inkscape で作ろうかな、と思ったわけですよ。名刺の用紙は A4 に 10枚並んでいるのがすでにあったわけで。で、一枚画像を作ったら一発でその名刺用紙にぴったりはまるように複製してくれるものを Inkscape の拡張で作るかな、と。
状況
- それっぽく動くようにはなった
- けど、画像ファイルまで作ってあとは ImageMagick で複製でいいんじゃね、とか思ったり。ま、印刷設定は Inkscape 使うのがいいかな。
- 実用的にするにはもうちょっと時間がかかるかな
つぶやき
Inkscape の拡張メカニズムはよいですね。拡張プログラムは Inkscape がもっているデータを svg 形式で stdin から受け取って、加工したものを stdout に吐く、という作りにすればいい、という超簡単仕様。外部プロセスの起動ですから速度的にはまあまあ、っ てとこですが、自由度が高くていいですよね。デバッグも容易だし。 まあ、そんなんですから、拡張プログラムは何で書いてもいいんですが、普通は python で書くことが多いようです。てのも、拡張プログラム用のベースクラスがデフォでついてくるので、それを継承したクラスを書くってのがセオリーなんでしょう。svg すなわち xml の扱いも楽になっているようで。
【fbshot】プロフィール写真とカバー写真を切り出す GIMP 拡張 [GIMP][Python]
概要
facebook のプロフィール画面。うまくやるとプロフィール写真とカバー写真がつながっている感じの表示なりますが、一枚の画像からうまいことプロフィール写真とカバー写真を切り出すような GIMP の拡張があるといいな、と。
状況
- 手作業で作れてしまったのですぐには必要ないけど
- 必要な情報がまだ揃っていない、まさに妄想の段階
【仮称:Gmail遅延発送】指定した時刻にメールを送信する仕組み [Gmail][Google Apps Scirpt]
概要
まあ、今メール書くけど、送るのはあとがいい、というとき、ありますよね。それを Gmail で実現するものです。
状況
- もうできてて、普通に使ってます。便利
- 公開できるといいんだけど、Gmail のラベルが大量発生するという問題と、ソースがきれいでないという問題で公開できてません
使い方の説明 ... 組織内部の業務連絡から抜粋
Gmail で時間を指定した遅延送信できるようになりました。テストお願いします。
これでケータイ宛てのメールを夜中に書いておいて、朝になったら自動送信とかできますね。
件名に時刻指定をつけて下書き保存すると(Gmail では送信しない限り勝手に下書き保存されますが)、その時刻にメールを送信します。 「{7:00} Re: 先日はお世話になりました」という件名の場合、 次にやってくる 7:00、すなわち下書き保存の時刻が 7:00 前ならその日の 7:00 に、そうでなければ翌日の 7:00 に「Re: 先日はお世話になりました」という件名で送られます。 CC, BCC, 添付ファイルにも対応しているはずです。
例えば、 難点としては、下書きがスレッド内のメールへの返信だったとしても、送られるメールは別スレッドになってしまう、ということがあります。
「ちゃんと遅延送信の対象として認識されているかしら」と心配な場合は、下書きトレイをチェックしてみてください。対象となる下書きには、スクリーンショットのようにいつ送信するか、それまでおよそどれくらいの時間があるのか、がラベルとして表示されます。 (+2.2min というのは 2.2 分後に送信、+13.6hours というのは 13.6 時間後に送信) 日付を指定した送信もできます。「{2014-08-30 7:15} お待たせしました!!」みたいな件名で下書きに放り込んでおきます。 まだ送信していない「遅延送信メール」のキャンセルは、当該下書きの件名をいじって遅延送信の対象からはずしてやれば大丈夫です。たとえば、先頭の "{" を取るだけでも対象からはずれます。 対象から外した場合に自動的にラベルの削除もやってくれるといいのですが、まだここはできていません。
あ、あと、注意事項として、「送信時刻指定ラベル」がすでについている場合、件名に含まれる時刻をいじっても発送の対象にする時刻はラベルの方の時刻だけです。つまり、送信したい時刻を変更する場合は件名をいじったうえ、ラベルを消去する必要があります。 うーん、ここもいいユーザインタフェースじゃないなあ。
とりあえず、「下書きトレイをなめて必要なら送信する」関数を 5 分ごとに起動しています。 で、下書きが 64 件ある場合の処理時間は 94.4 秒でした。要らない下書きは削除しておくといいでしょうね。 あ、自動送信した下書きはゴミ箱に移動する仕様です。 もう少し refine したら完全に公開しますが、今のままのコードでも欲しい方はどうぞ。「完全に公開」の意味は、GAS のライブラリとして公開する、という意味です。そうなったら、バージョンアップとかも安全に行えますし、設定も簡単になりますし。
つぶやき
「ちゃんと遅延送信の対象として認識されているかしら」を示すには、 「正規化された送信予定時刻、および、それまでおよそどれくらいの時間があるのか」を件名に書き戻すのがベストだと考えていたのですが、GAS の Gmail 関係 API では、メッセージの件名を変更するというメソッドが用意されていませんでした。
正規化した件名の別の下書きメッセージを作成して中身をコピー、というのも考えましたが、新たに下書きメッセージを作成するというメソッドも用意されていません。
いろいろ考えましたが、自由につけたりはずしたりできる、ということでラベルを使うことにしました。 ラベルはスレッドにつけるものなので、同一スレッド内に複数の遅延送信メッセージがある場合も考慮した設計としました。
ほとんど完成してから、なかなか取れないバグがあったので、かなり今さら感があったものの、テスト用のダミーオブジェクトを作ってテストできるようにしました。 GAS のクラスライブラリで提供されるオブジェクトの提供するメソッドのうち、今回のプログラムで使うメソッドだけを追加したやっつけ duck typing。
おかげで、次のようにテストコードを書けるようになりました。ちなみに、sendTimedMail()
の方が実際に 5 分に一度起動している関数、testTimedMail()
の方がテスト用のコードです。RealStorage
のほうは実際に Gmail の API にアクセスします。
TimedMail.getManager = function(storage) {
if (! storage) storage = new TimedMail.RealStorage();
return new TimedMail.Manager(storage);
};
function sendTimedMail() {
return TimedMail.getManager().fire();
}
function testTimedMail() {
var storage = new TimedMail.DummyStorage();
var manager = TimedMail.getManager(storage);
storage
.clear()
.add({subject: 'テストです', mid: 11})
.add({subject: '{20:15}テストその2です', mid: 12, to: 'aa@example.com',
plainBody: 'this is a test.'})
.add({subject: '{19:02}テストその3です', mid: 41,
label: '{[+23.9hours S] 2013-06-15 19:02 [41]}',
to: 'aa@example.com', plainBody: 'this is a test.'})
.add({subject: '{19:30}テストその4です', mid: 45,
label: '{[+23.9hours S] 2013-06-15 19:30 [45]}',
to: 'aa@example.com', plainBody: 'this is a test.'})
;
manager.setNow(MatomeDate.parse('2013-06-15 19:08')).fire();
storage.dumpto();
}
【gmx】オレオレ gas-manager 的なにか [Google Apps Script][Node.js]
概要
gas-manager 便利。
で、あれこれ俺様用にカスタマイズしようとして、gas-manager の CLI を活用して shell script でツールを組もうとしたんだけどうまくいかないので、gas-manager の提供する Node モジュールを利用して四角い車輪を再発明しているもの。
つまり、Google Apps Script をローカルで開発できるよう、import/export するツールです。
gas-manager をそのまま使ってうまくいかない理由
おそらく、Node.js を Windows ネイティブで入れて、それを cygwin な CLI から使っていることが問題なんですが、これをクリアする方法が全然わからない。
cygwin でソースから Node.js を build するとか、cygwin という work around をやめて virtual machine とか coLinux (今もあるのかな) とか使うとか、そういうのもありかも知れないけれど、メモリが潤沢でないのでね。
状況
- gmx 自体をサクサク開発できる環境が整ったところ
- github に上げてみた。まだまだオレオレリポジトリであり、誰かが git clone して使いやすいリポジトリじゃないけど。https://github.com/unau/gmx
構成
- gmxd : ローカルな http を喋るサーバ (on Node.js)
** front : http でリスンしてて実処理を worker に投げるプロセス
** worker : 実際に Google にアクセスしたりローカルファイルシステムにアクセスしたりするプロセス - gmx : gmxd にリクエストを投げるだけの shell script
front と worker に分かれているのは、サーバを立ち上げたまま実処理のコードを差し替えるため。
メモ
- jshint も使えるようにできるようにしたい
【仮称 : CcBidipo】Google スプレッドシートに import/export する CandyCane プラグイン [CandyCane][CakePHP][Google スプレッドシート]
概要
Redmine の CakePHP 実装である CandyCane、使おうとしていますが、チケットの管理が通常の UI では面倒で使っていない状態なので、Google スプレッドシートに export して編集、そして import というのができるといいな、と。
状態
- CandyCane のプラグイン作成に必要な情報は、すでいあるプラグインを解析するしかないのですよね、で、ガワだけ作ってみてある状態
- これができたら CandyCane ももっと活用するんだろうけれど ...
- だいぶ放置中
【MailFunnel】メール駆動アプリフレームワーク [PHP]
概要
特定のメールアドレスに送るとなんか処理が走って、結果をまたメールで返す、みたいなアプリケーションを作るためのフレームワーク。
状況
- 一応、特定のメールアドレスに送ると対応した処理が走って結果をメールで返す、という基本的な動きはできてる
- その後なかなか進まないのは、最近 PHP で書くとなんかフラストレーションがたまっていくことと無縁ではないと思う
- 使いたい用途が複数あるので、早く続きをやりたい
【旅人 & 旅の途中】Google スプレッドシートの情報から Excel な納品書を生成するシステム [Googleスプレッドシート][Google Apps Script][VBA]
概要
表題のまんま。「旅の途中」というのが GAS な WEB API で json で納品書に載せるべき情報を返す。でもって「旅人」が VBA で書かれた納品書生成スクリプト。
状況
- もう実用的に使ってる
- 帳票を Excel じゃなくて PDF にしようと思っているので、「旅人」の方はそのうち使わなくなる予定。
- PDF 直接 (これは Ruby + Cairo でやろうと思ってた) の他に、ちょっとだけ Google 文書も試そうかと思っている。まあ、帳票の美しさでは Ruby + Cairo の方が上かな、とは思うものの
【作業記録88】作業ごとの時間を記録する Google スプレッドシートアプリ [Googleスプレッドシート][Google Apps Script]
概要
表題のまんま。
状況
- 実用的に使えるレベルだが、あまり使わないのは、うーん、怠惰
- 公開してもいいけどやっていないな
【ゆすらんめ - 仕訳帳】Google スプレッドシート上での仕訳帳記入とそこからの総勘定元帳作成 [Googleスプレッドシート][Google Apps Script]
概要
複式簿記でつける仕訳帳を記録しやすくするいろいろな仕組みと、そこからの総勘定元帳作成するツール。顧客管理や商品(農産物)管理や栽培管理なんかの統合したシステムである「ゆすらんめ」の一角。
状況
- まあ、仕訳帳から総勘定元帳を生成、がだいたいできてて、今回の確定申告はこれでいけるっしょ。まだまだ書かないといけないけどね。
- 決算書の類までいければベストだけど
- さすがに e-tax のシステムと連動ってのは難しいだろうな
- こいつを作る過程で GAS なオレオレライブラリが相当充実していってる
【ScriptMumbler】特定のページを表示するときにだけ必要な css, js を出力する WordPress プラグイン [WordPress]
概要
まあ、あれだ、WordPress でプラグイン入れると、その機能を使っていないのに全ページでそのプラグインで使う css や js が link されるわけ(たとえば問合せフォーム用プラグインを入れると、そいつが使う css が問合せフォームのあるページ以外でもブラウザに送り込まれる)だけど、それがいやんな感じがするんで、カスタムフィールドに明示的に書いたときにだけ該当 css, js が link されるような仕組み。
状況
- 普通に使っている
- オレオレ拡張をなんでもかんでも詰め込んでいる MatomePack プラグインの一角
- これを MatomePack から分離して公開してもいいのか悪いのか
【mauthkey 拡張】URL に事前に設定したキーを明示的に書かない限り内容が表示されない WordPress プラグイン
状況
- 普通に使ってる
使い方、とか
特定のキーが指定されないと固定ページの内容が表示されない仕組みを作りました。
目的は、正しい URL を知っている人だけ内容を見ることが可能で、検索エンジンにも内容がインデックスされないページを作る、というものです。
このようなページを作るには、固定ページの編集画面でカスタムフィールド matome_auth_key
に推測困難なキーを指定します。
URL に明示的に mauthkey=
でここで指定したキーを書いたときにだけ該当ページの内容が表示される、という仕組みです。キーが適切でないときは「Ooops!」と表示されます。
キーが適切でないときのコンテンツはカスタムフィールドで matome_unauthorized_content が指定されていればそれが使われます。
この仕組みを有効にするには、テーマ中の固定ページ表示スクリプト (たとえば page.php
) も変更する必要があります。
たとえば、もともと次のコードだったときには、
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', 'page' ); ?>
<?php comments_template( '', true ); ?>
<?php endwhile; // end of the loop. ?>
コンテンツを実際に出力している箇所を if
で括ります。
<?php while ( have_posts() ) : the_post(); ?>
<?php if ( is_null($unauthorized_content = MatomePack::get_unauthorized_content()) ) : ?>
<?php get_template_part( 'content', 'page' ); ?>
<?php comments_template( '', true ); ?>
<?php else: ?>
<?php echo $unauthorized_content; ?>
<?php endif; ?>
<?php endwhile; // end of the loop. ?>
MatomePack::get_unauthorized_content()
関数はコンテンツを表示すべきとき(元々キーの指定がないとき、正しいキー付きでリクエストされたとき)に null
を返し、表示すべきでないときにはその際に代わりに表示する文字列が返ります。
【matome-tab】ページ内にタブを表示する WordPress プラグイン [WordPress]
概要
タブ UI を表示して、でもってタブがクリックされたときに内容を ajax で取ってくるってのをやりたかったんで、それができるような拡張。
状況
- オレオレプラグイン MatomePack に入ってる。
- 単体でプラグイン化してもいいんだけど、そしたら公開できるんだけど、さて、どうするかな。
使い方の例
まあ、固定ページをこんな風に書いておくと、JQuery UI 使ってタブが表示されるんだけど、タブの中身はタブをクリックしたときに ajax で持ってくるんだな、これが。
[matome-tabs begin /]
[matome-tab id="mtab1" tilte="あ"]
あいうえお
[/matome-tab]
[matome-tab id="mtab2" tilte="か"]
かきくけこ
[/matome-tab]
[matome-tabs end /]
その他こまごました妄想
- Google スプレッドシートのデータを (インターネットから直接はアクセスできない) ローカルの mysql に適宜反映させるようなフレームワーク
- 何でもかんでも同じディレクトリの下で開発して、github にもガンガンあげておく、というようなディレクトリ構成設計
- WiMAX なオフィス内の常時稼動サーバに外部から ssh 接続できるようにする仕組み作り。公開サーバ上にセキュアなトンネル作って、そこを逆向きに通そうかな、って思ってるけど。