xyzzyとperlの連携でテキスト処理最強環境
こないだからごそごそいじってるxyzzyのマクロとそこから連携するperlのスクリプト。
xyzzyのあまりの便利さ、ラクチンさ、フロントとしての有能さに今さらながら驚いた。もう15年ぐらい使ってるっちゅーのに。
エディタはxyzzy一択だろう(主語:おれ)
自分環境・自分作業内容に特化したマクロなので、誰にとっても有用・便利に使えるものではないけど、備忘録としてメモしておこう。
lispは手強い、というか他とは別モノなので、今回ごそごそ作ってるようなわずか数行のものでもネットで検索しまくり、デフォルトのlispフォルダをgrepしまくってやっと。明日にはもう忘れているであろう自分のためにもメモが必要なのだ。
てことで、先日までのマクロの振り返り。。
1)編集中のバッファの内容をtempファイルに書き出して
2)perlのスクリプトで処理して
3)処理された内容をバッファに読み込む
てところがキモ。
(2)のところ。
今日までは、処理してほしい内容について
(interactive "s[D]elSpace [T]ab4Space [M]akeEPUB [C]heck")
などと、マクロを起動したらperlでどういう処理をして欲しいのか、ユーザー入力を取得してperlに引数として渡すようにしていた。
でも、このユーザー入力のひと手間がけっこう面倒くさい。
面倒くさいものは続かない。そのうち使わなくなるのが目に見えている。
20分ぐらい考えて、macのCotEditorが外部スクリプトの引数に編集中のファイル名(フルパスで)を渡すことを思い出した。この動作をそのままxyzzyのマクロでも使うことにした。
そもそも、マクロを起動したらば。
編集中のファイルの拡張子が.plとか.pmだったらperlのシンタックスチェックをして欲しいし、編集中のファイルがeasy_epubフォルダ以下の.txtファイルだったらeasy_epub.plでEPUB電子書籍を作ってくれ。自分としては、いちいちユーザー入力を待って判定する必要はない。
ファイルと結びつかない新規バッファや*scratch*バッファで作業しているものに関しては、空白の削除やタブを空白4つに変換するなど、その時その場の小ネタ処理で決めうちできないので、ここはユーザー入力で動作を振り分けてもらいたい。
・フルパスのファイル名がわかっているものに関しては、パス・ファイル名を処理・動作の判断にしてくれ。
・ファイル名がわからないものに関しては、指示するからちょっと待てよ。
という自分リクエストを満たしたxyzzyのマクロがこの10行。
やってることは。
01:関数
02:この関数はマクロで呼び出せますよ
03:バッファを書き出すためのtempファイル名の設定
04:編集中のバッファがファイルと結びついてなければどんな処理をするのかユーザー入力待ち
05:tempファイルの削除
06:編集中のバッファをtempファイルに書き出し
07:perlに渡すためのバッチファイル(WINDOWSのダセエところだ)
引数としてフルパスのファイル名と、04の場合の入力された文字。標準入力経由でtemp-file、perlが処理した内容を受けとるところとして「*scratch*」バッファを設定。
08:バッファ全体をマークして
09:バッファをクリップボードにコピー
受けとるperl側は以下。長いのでpackageについては端折るけど。
・フルパスファイル名がわかっているものは、ファイルを読み込んで処理。
・ファイル名がないものは、一行ずつ処理したり、全部読み込んでから処理したり。
(第一引数はファイル名。第二引数がマクロの04で入力した文字)
いやもうほんと滅茶苦茶最強のテキスト処理環境のできあがりだ。
どのぐらい最強かというと、今日まさに立川で観てきた爆音「マッドマックス FR」のお婆ちゃんズぐらい最強だ(実写版ジブリだったなあ)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
読者コミュニティ「趣味は読書2」の登録データ
「趣味は読書」というweb本棚サービスを2006/4/1から公開している。
今日時点
登録会員:310名
登録冊数:49,780冊
登録タイトル:38,851タイトル
登録著者:14,264人
【人気タイトル(会員10人以上が登録)】
17 | 空の中 |
15 | 太陽の塔, 陽気なギャングが地球を回す, 重力ピエロ, 告白, 夜のピクニック |
14 | 予知夢, しゃばけ, 死神の精度, 海の底 |
13 | 西の魔女が死んだ, アヒルと鴨のコインロッカー, 探偵ガリレオ, 夜は短し歩けよ乙女, 博士の愛した数式, 四畳半神話大系, 阪急電車, 華胥の幽夢(ゆめ)—十二国記 |
12 | 魔性の子, 容疑者Xの献身, オーデュボンの祈り, 終末のフール, 火車, ラッシュライフ |
11 | 光の帝国—常野物語, レインツリーの国, クジラの彼, グラスホッパー, 手紙 |
10 | 鴨川ホルモー, 天使, 夏への扉, 図書館戦争, アルジャーノンに花束を, 少女には向かない職業, 村田エフェンディ滞土録, 夏と花火と私の死体, 氷菓, 六番目の小夜子, ハサミ男, ゴールデンスランバー, 向日葵の咲かない夏 |
【人気著者ベスト20(登録された本の総数)】
376 | 恩田陸 |
345 | 東野圭吾 |
340 | 茅田砂胡 |
307 | 小野不由美 |
302 | 栗本薫 |
299 | 宮部みゆき |
229 | 田中芳樹 |
215 | 伊坂幸太郎 |
206 | 有川浩 |
178 | 藤子・F・不二雄 |
168 | 浦沢直樹 |
158 | 浅倉久志 |
157 | 村上春樹 |
156 | 西尾維新 |
153 | 秋本治 |
150 | CLAMP |
150 | 荒川弘 |
146 | 京極夏彦 |
144 | 桜庭一樹 |
142 | 大森望 |
141 | スティーヴンキング |
「趣味は読書2」
https://doncha.net/about.pl
図書館で本を借りて図書カードを見て
「あれ?あのコもこれ読んだのかぁ」とか「おっあいつこんなの読むんだ」と、ニマニマしたり
ひとんちに呼ばれたら、まず本棚を覗いて
「これ、わたしも読んだよ」と言いたくなったり
図書館とか本屋で、どの棚の前に立っているかで、そのひとの属性がわかって、うれしかったり
なんだか「ありきたり」な趣味なので履歴書にも書けない気がしたり
本を読んでも難しいことを考えたり感想文は面倒くさかったり
ヲタクだと思われそうで嫌だったり
でもって、だけど本好きとか本読みですが、なにか?
というようなことを、思ったことはありませんか? ぼくは、あります。なので、そんな本棚のようなサイトを作ってみました。
『読者のコミュニティ』
↑にも書いたけど。
東日本大震災の時、自宅サーバーで公開していたものを一度閉じて、レンタルサーバーで再開。
2006年公開当時、流行りのmixiもどきで掲示板や日記などつけたんだけど、利用パターンの8割以上が「本棚直行直帰」だったのでリニューアルして現在の形に。
現状は月に20人ぐらいのアクティブユーザーといったところ。
特に告知などしてなくて、ニュースサイトの古い記事や紹介されているブログ、twitter連携などから新規に登録・利用してくれている。
手前味噌。
設計もデザインも古くさくなってダサイのはすみませんだけど。
もともとわたしは「あれ?これ読んだっけ?持ってたっけ?」のトリ頭、重複買いがわりとあったのに、「既読・未読」フラグのあるこのweb本棚のおかげで重複買いはなくなった(ログインして検索、あるいは、twitterにリプを飛して本棚検索結果を返してもらう)
『「趣味は読書2」など読書記録WEBサービス』
2011年時点のWEB本棚サービスのリスト。なくなったサービスがけっこう多いけど。
本を読むひとの数を増やしたい、小説を面白がってくれるひとを増やしたい、たくさん面白い小説を読みたい、というのはどのサービス提供者にも共通することだと思うんで、みんなで盛り上げられればいいなあ、と思うですよ。
面白い小説はまだまだたくさんあるので、残り時間を有効に使わないとなあ、とあらためて初老はしみじみするのでありました。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
エクセルの表をHTMLのテーブルに
IT軽作業用のメモ。文字通り備忘録。
どこもかしこも、基本がエクセルやワード。MSというかオフィスソフトは好かんのだけど、小遣い稼ぎしないといけないので、泣く泣くエクセルも触ることになる。
以下のようなエクセルファイルが回ってきて、それをwebにアップしてくれ、というよくあるリクエスト。
セルを縦方向に繋げるrowspanがあちこちにあって、こんなtableをイチから書き起こすのは間違いの元だし集中力もない。
なので、エクセルで「別名で保存」→「Webページ」として、htmlで出力保存する。
(公開されてるデータなのでモザイクの必要もないんだけど、ちょっとだけ)
でも、出力されたhtmlをそのままアップするわけにはいかない。
サイズや色などスタイルをサイトに合わせる必要がある。
エクセルの吐き出すhtmlは決め打ちだらけ。エクセルの表をそのまま再現することが目的だから当然。
スクリプトやマクロで、決め打ちされたスタイルを全部剥ぎとって、サイトに合わせたスタイルを適用すればちょっとはラクチン(ていうか、本当に助かる。perl様々である)
元のエクセルは表が左右に並んでいたり、表と表の間に区切りの罫線がいくつも入っていたり「見栄え」が整えられていて、まずエクセル上で表以外の余計なものを削除する必要があるんだけどね。
エクセル方眼紙が何かとネタにされるように、エクセルは表計算ソフト。「見栄え」を作るのはやめて欲しい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ひとは間違いを犯すのだ
「絶対」なんてことはありえないんだけど、世の中これだけは「絶対」と副詞をつけても正しいのが「人間は絶対に間違いを犯す」
いや、別に倫理的とか哲学的なとかメタな話じゃなくて、単純なミスの話。だ。
人間のやることだ、ミスは必ず起こる・起こす。
ミスを起こさないための方法を100通り考えるヒマがあったら、ミスが起こった後にフォロー・リカバリする方法を10通り用意する方がよっぽど効率的で健全な判断だろう。
その方法はシステム的なことかも知れないし、担当者を温泉に連れこむような人的力技かも知れない。
わたしは自分の仕事を信用してないのでミスがあることを前提に、仕事の後のチェックやミスの早期発見の方法をまず考える(自分でやるのか、他人にまかせるのかはおいといて)
てことで、やっと今日の雑記の小ネタ本文はここから。無駄な前振りが長いのは年寄りなので勘弁してもらおう。
データベースへの登録作業。
登録したデータはサイトに表示されて…ネタは商品ページにありがちなスペック表みたいなシロモノ。
リンゴのページにはリンゴの表となって表示される。
名前 | リンゴ |
---|---|
値段 | 300円 |
産地 | 余市 |
ミカンのページにはミカンの表となって表示される。
名前 | ミカン |
---|---|
値段 | 200円 |
産地 | 愛媛 |
データベースを直接覗けるならSQL文一発で入力項目のチェックができるんだけど、いかんせん、管理画面でしか使えない。
入力したものを確認するにはリンゴのページを開いて確認し、ミカンのページを開いて確認し、とページの数だけ開いて確認する必要がある。
これはいくらなんでも面倒くさい。ミスを放置しろといわんばかりだ。
なもんで、あちこちのページにあるHTMLの単純なTableを一覧したい。ということで例によってperlの出番。
まとめてこんな表にすれば、いちいちページを開く必要がなく確認がらくちんだ。
名前 | 値段 | 産地 |
---|---|---|
リンゴ | 300円 | 余市 |
ミカン | 200円 | 愛媛 |
当然perl には HTMLを解析するモジュールが用意されていて
HTML::TreeBuilder
HTML::TagParser
Web::Scraper
ちょっと調べた限りではこの3つが定評もあって使いやすそう。
ただ、今回はTableの項目を引っ張りだしてひとつのTableにするだけ、タテのものをヨコにするだけなので現物合わせ「オレオレscript」で作った。
lwpで各ページのHTMLを取得してその中から必要なtableを探してバラしてhashに収納して一覧表にして表示する。
今日の雑記はここ。tableをバラして収納するところ、ていうかこれだけ。
perlの正規表現のeオプションは強力でいろんな状況で使える。てか、式に使えるんだからなんでもありだよなあ。
hashに入れてしまえば後はどうにでも加工できる。
…にしても、本当にperlはすげー。
私立文系まっしぐらでプログラムなんて全然知らない・経験や訓練もないわたしでもそれなりに使えてしまう。日々の仕事でなんでこんなこと、てな単純な繰り返しや、ちょっとした条件分岐を入れればすむだけ、というような場合にperlはスイス万能ナイフ的に使える。
人間が1000回コピペすると3回ぐらいはミスをするけど、perlでスクリプトにしてしまえば間違いは犯さない。
これから何かひとつプログラム言語でも、というかたにはperlをオススメ。
ぶっちゃけ、perlがあるおかげで仕事でも趣味でもいろいろ本当に助かっている。
競馬の、馬券のデータ集計のために使うようになったAWKからperlに辿りついたわけで、競馬に感謝するしかあるまい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
Android標準ブラウザでダウンロードできない現象
Android標準(?)のブラウザでPDFやzip、epubファイルのダウンロードができなくて吐血。
PCのブラウザやiphone(iOS)、AndroidでもChrome、Firefoxなどのブラウザだと意図通り問題なくダウンロードできるのに、Android標準(?)のブラウザだとダウンロードできない。というか、なぜか、ページのHTMLをダウンロードしてしまう。
謎な挙動のスマホ標準ブラウザに対応する必要があるのかという、そもそものところはまた別として。
調べてみたら、検索のしかたが悪いのか情報が錯綜していて正解が見えてこない。
スクリプトが吐くヘッダは定型。
このヘッダに続いて、epubファイルが標準出力に吐き出される。ほかのいろんなスクリプトで使っているやりかたで、Androidスマホ以外では問題なく意図通りダウンロードできている。
老眼血眼、しこたま検索しまくって、こちらのサイト
「コンピュータの日々 Android付属ブラウザのファイルダウンロードの動作」
AndroidのブラウザがPOSTメソッドでサーバにリクエストして、サーバからContent-Disposition:attachmentなヘッダを受け取ると、再びGETメソッドで同じURLにリクエストを送信するとのことです。
へ? と思ってアクセスログを見るとAndroidスマホのブラウザ(docomoのスマホ L-05E 、mobile safari)は、確かにPOSTでアクセスしてきた後、なぜかGETでアクセスしている。
ページのHTMLを取得してるので、最初はブラウザのキャッシュを疑ったんだけど、どうやら真相はこいつ。attachmentで渡してるはずのepubファイルではなくて、次のGETでページのHTMLをダウンロードしているご様子だ。
なんでやねん。
以上は、とりあえずのメモ。
これじゃ、スクリプトで吐き出させたんじゃダウンロードしてくれない、ということになる。
ダウンロードしてもらう方法としては、一度サーバーにファイルを書き出して、静的リンクをクリックしてもらうしかない…うーん、ほんまかいな。
スクリプトで直接ダウンロードする方法をもうちょっと調べてみる。たぶん、わたしのスキル不足だと思う(詠み人知らず)
[12/20 21:30:21] 追記。
現状、スマホ標準のブラウザは .epub ファイルにリンクしても、ブラウザが epub ファイルを開いて表示しやがる。
バイナリを文字化けした文字にしてブラウザにダアアアアッと表示する。なんじゃそりゃ状態。
なもんで、.htaccess で(httpd.confでもいいけど) MIME TYPE を指示(指定)してやる必要がある(epubという拡張子のファイルにアクセスされたらどうするのかの設定)
addType application/octet-stream .epub
…て、epub自体が最近なので、Android標準ブラウザに適切な対応を求めるのは可哀想、というか無理かもしれん。もう意味不明なブラウザを使うのではなくて、Firefoxなり、PCでも使われるブラウザとその挙動を標準にすべきだろう。
[2016/01/03 10:47:38] 追記。
どうやら現状のAndroidの「ダウンロード」(ダウンローダー)はSSLのページや認証が必要なページからはダウンロードできない困った仕様っぽい。
・ブラウザで閲覧→PDFやzipをタップ→ダウンローダーが起動してzipやPDFをダウンロード
という流れだとダウンロードできない。
・ブラウザで閲覧→PDFやzipをタップ→ブラウザがPDFやzipをダウンロード
だとダウンロードができる。Firefoxなどだとダウンロードができる、ということ。
スマホって、なんでまた「ダウンローダー」なんてのを噛ませることになったんだろう。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
epub制作に必須のArchive Zipのメモ
電子書籍作成ページの依頼があって久しぶりにスクリプトを眺めてみた。
(電子書籍の制作ではなくて、電子書籍を作成するページの作成)
エラーのないepubを作るのは手順の塊…というか手順だけなので面倒くさいんだけど難しいスクリプトでもない。
ユーザーの入力をどこまで自由にするのか、ページ移動はどうするのか、エラー処理は、ブラウザ対応は、などなどepub作成以外の部分で考えなきゃいけないことがいろいろあるのはwebだからしかたがないところ。
Archive::Zipのメモ1
てなことを考えながら見てたら、epubをパッケージするzipのモジュール、Archive::Zipでエラー。
他のスクリプトでは問題なく使えているモジュールで原因がわからないし、該当箇所を見てもよくわからない。
zipにファイルを追加していくところでエラーになってしまう。いろいろ試行錯誤。
結果。追加するファイルが見当たらない、pathが違ってたというだけのことだった。コンセントが抜けてますよレベルの話だった。
…でもなあ、このエラーメッセージじゃわからん。とほほ。
Archive::Zipのメモ2
前々からArchive::Zipで圧縮したらそれをファイルの書き出すのではなくて、標準出力にそのまま吐き出せればいいのにと思っていて、ついでなので調べてみたら、当たり前のように用意されていた。おのれの不勉強に愕然。そりゃそうだよなあ。
writeToFileHandleのファイルハンドルに標準出力を指定してやればOKだった。
これで正常なzipファイルを出力することができた。
久しぶりにこの手のことでグーグル様詣で。以前Archive::Zip について調べた時には見かけなかったepubがらみのQ&Aなんかが検索でひっかかってきてちょっとびっくり。
電子書籍を作る側は充実してきてるんだなあ、と変なところで実感した。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」