ひとり言掲示板:ところてんx10
ひとり言、メモ用掲示板を作ってみた。
・保存するのは100個まで。
・画像投稿はできない。
・検索機能はない。
・カテゴリづけもない。
・表示順は日付の新しいもの順だけ。
・一度書いたものを編集、削除することはできない。
投稿できるのはテキストだけ。
テキストの文字数制限はたしか80KBぐらいまでにしたのでけっこう長めのものも書き込める。
というなんかめちゃくちゃ手抜きのスクリプト。
一応RDFというかRSSは取得できるようにしてみたけど、これはおまけ。
スクリプト的には。公開はしてないけど、すでにメモ代わりのひとり言掲示板みたいなものは作って今も使っていて、ほぼそれの流用で、そこから検索機能やあれこれ機能を削っただけのシロモノ。
その、今すでに使ってるメモは、発注納品締切とか、スーパーでの買い物、ポケモンの対戦結果、医者、内科や歯医者、目医者の予約とかとか。
ほんとのメモ、めっちゃ個人的な備忘録。そんなものを公開の場に出すワケにもいかないし、そもそもそんなものわたし以外のひとには意味も価値もない。
ひとり言というなら、そのメモで勝手にやってりゃええやろ、というのはもっともな話。
とはいえ。
ツイッターにほとほと愛想が尽きて、みけさんもいないとなると、snsを利用することもない。
なので、この雑記帖に引きこもるぞー!てのは少し前に言ったけど、なかなか雑記帖に書くようなボリュームのネタもない。
なので、雑記帖の元ネタになりそうなことをメモする場所にしようかと。
それでも、今のその非公開のメモとやらでやってりゃええんとちゃうんか、は変わりないんだけどね。
人通りのほとんどないここ、辺境とはいえ、公開する、ひと目につく可能性があると、それを意識することになる。
少しはマシなもの、誰かにとって有用なものが出てくる、かもしれない。
底辺とはいえ、いちおう出版社で編集なんてのをやってた昭和平成の頃、痛感したのが、ひと目に晒してナンボ、ということ。ひと目に晒すことで面白いものになるというのは事実で真実。
そんなひとり言掲示板、せっかくだからちょっと考えて名前もつけた。
「ところてんx10」
ところてん式に古いものから押し出されてなくなっていく。
保持するのは100だけ。てことで「ところTENx10」という寒いおやじギャグをドヤ顔。
「ところてんx10」
てのはともかく、みけさんがいなくなると、時間を持て余すんでスクリプトをいじる時間に当ててるだけっちゃだけのそれだけの話でもあるなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ファイルの最後の行を取得する
perlを使ってテキストファイルの最後の行を取得したい、というネタ。
tailでええやんということだけど、外部コマンドを使わないでperlだけで完結させたい。
ファイルを全部読み込んで最後の行だけを取り出す。
open(FH, $file); my @buf=<FH>; close(FH); pop(@buf)
これが一番簡単だし、ファイルを配列に全部読み込むのでその後の展開も応用にも使える、ド定番なやりかた。
読み込む、処理したいのがテキストファイルなら、ファイルサイズもしれてるだろうから、これで十分。わたしもいつもは何をするにもこのやり方。
だけど、データベースに食わせる元ネタのcsvファイルとかログファイルだと、ファイルサイズがギガバイトサイズのものがあったりして頭が頭痛。
最終行だけを知りたいのに、そんな阿呆みたいにでかいファイルを全部読み込むのは流石にもったいなくて馬鹿馬鹿しい、という貧乏性、ていうかリアルでビンボなんだけど。
ぐーぐる先生に聞いてみたら、検索結果からそのものズバリは見つけられなかったけど、seek()を使うのが良いらしいということはわかったのでスクリプトを書いてみた。
seekはファイルハンドルのファイルポインタを任意の位置に設定する、つまり、開いてるファイルのどこを見るのかを指定できる。
ファイルサイズ=ファイルの末尾の位置から1バイトずつ先頭に向かってずらしていって、その位置から1バイト読み込んで、それが改行コードだったら、そこが最後の行の始まりということになる。
初期値をファイルサイズ-3としたのはファイル末尾に改行コードがあったらそこで終了してしまうから。
改行コードのバイト数はLFやCRだけなら1バイト、WINDOWSで一般的なCRLFは2バイト。なので、3バイト戻して1バイトを読むことで、最後の改行は無視できる。
まだ実際に大きなファイルに対して使ってないし、seek()で1バイトずつポインタをずらして1バイトずつ読み込んで、というのが本当に効率的なのかはよくわかってない。少なくとも、ファイルを頭っから順に読んでるわけじゃないのでファイルの大きさは関係ない、はず。
ファイルサイズが大きくなるにつれ、処理速度もそれにつれて遅くなるようなことにはならない。
とりあえずこいつを暫定首位に認定しておこう。
perlは本当にいろんなことをいろんなやり方でできるのが気持ち良い。
今回、ぐーぐる先生に聞いてみたら、古いエントリばかりが目立った、てことはもうあまり使われていない、ポピュラーな言語じゃなくなった、のかも知れない。
ていうか、この世界、あっという間に古びる。perlもすでに古代語となって、perl話者が少なくなってきたということかもしれない。ラテン語やサンスクリット語みたいなポジションになったのかもなあ。
だけど、perlはええぞ、マジで。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
WORDをテキスト保存した時のルビの捕捉
いや、あいかわらず雑なネタ。
.docx、ワードファイルではなくて、ワード文書を書式なしテキストで保存したテキストデータがたまにやってくる。基本的にシンプルなものが多くて流れ作業で済む。
…なんだけど、ルビのついたものがたまにあるのでその対応のメモ。
ワードの文書を書式なしtxtで書き出すとルビは
「これは漢字(かんじ)にルビがつく」
などと、ワード文書ではルビのところが、漢字と半角カッコでくくられたルビにわけられて保存されることになる。
そういや、以前もこんなことあったなあと思い出して、この雑記帖を検索したら出てきたのが
青空文庫のルビや傍点をHTMLタグに変換
https://t2aki.doncha.net/?id=1443167217
↑このエントリ。
青空文庫で使われている、青空記法は多くのひとに使われるように、よく練られているなあ、と感心した記事で、やっぱりさきほども改めて感心。
てことで、その時の記事からほぼ流用したのが以下のスクリプト。
perlで、Unicodeブロックを使った正規表現で漢字やかなを拾えるんで大助かり。
ただ、こいつはビミョーで、漢字に続いて半角カッコがあるのは、ワードが吐き出したルビだけとは限らないし、ルビの対象となる漢字の範囲がこれだけだと特定できない。
青空記法では問題にならないんだけど、ワードの吐き出しに多くは求められない。
なので、あくまでも初校作成時の手助け程度、かな。
にしても。
まだ5インチと3.5インチのフロッピーディスクが現役で、MSDOSは3.0が出た頃、NECの98シリーズが人気だった頃だからもう40年近く前の昭和の頃。日本ダービーでシンボリルドルフが皇帝になった頃。
Wizardryというゲームがやりたくてパソコンを買って、その後競馬データをこねくり回すために使いだしたawkやperl、unix環境。言ってしまえば、遊びでやってた当時の余録で、還暦すぎても小遣い稼ぎができるんだから、なにが役に立つのか立たないのかなんて、その時にはわからないもんだわな。
仙人の弟子の雑巾がけ庭掃除のネタは深いものがあるなあ(しみじみ)
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
初めてのchromebook購入
amazonのブラックフライデーという歳末大売り出しにつられて、ASUSのchromrbook (CX1101CMA-GJ0019)を購入。31000円ほど…て、これまたスマホより安いパソコンだ。これに追加でマイクロSDカードやBTマウス。
PCを新規に購入するなら、その最低必須条件は
・画面サイズが10〜11インチ
・CPUがインテル
で、安いに越したことはない、というのも入れると、Chromebookとなった。
必須条件の理由は。
自宅作業がローテーブルという名のちゃぶ台環境なので、デスクトップや大きなサイズのノパソは邪魔になるだけ。
インテルのCPU採用なら、メーカーのサポートが終わってもunix系OSをインストールして復活できる可能性があるから。
画面サイズで絞るとCPUがインテル以外のものばかりで、CPUで絞ると画面サイズが15とか巨大なものばかりが並んでた。
条件クリアしたのが、このASUS chromebook CX1。
画面:11.6インチ
CPU:intel Celeron N4020
メモリ:4G
ストレージ:64G(eMMC)
OS:ChromeOS
今、メインで使ってるのもASUSのvivobookというノートパソコン
「22980円のノートパソコンvivobook購入」
↑購入時のvivobookはWIN10だったけど、今はChromeOS Flexというgoogle謹製フリーのChromeOSで使ってる。
今回購入したCX1はキーボード配置などハードウエア的にも正規正統のchrombook。
これはフリーOSのFlexとは違ってgoogle playが使える。すべて対応してるかどうかはまだわからないけど、こちらの正規版(?)chromebookは、アンドロイドのアプリも使えるらしい。
さっそくlinuxをONにして、15Gほど割り当てて環境設定。
といっても、vivobookで使ってる設定ファイルをこっちに持ってくればほぼOK。
aptやcpanでインストールしたものも同じ。
「CloudReadyのバージョンアップ(94系から96に)」
↑メモっておいたことが珍しく役に立った。
CX1はストレージが64G。32Gのvivobookの倍だし、apache2もインストールしてローカルでWEBサーバーを立ち上げておくことにした。
vivobookでも最初は立ち上げてたんだけど、いろいろインストールするうちにディスク容量がちょっと心配になり、あまり利用する状況もなかったapacheは削除していた。
Chromebookのlinux環境(debian)のapache2はconfファイル(設定ファイル)が役割ごとに分けられてたり、以前もわりとハマったので、改めてメモ。
apache2のインストール
sudo apt install apache2
↑インストールはaptで一発。画面を眺めてるだけ。
インストールしたらまずやるべきこと。
・chromebook側
「設定」→「デベロッパー」→「linux開発環境」
→「ポート転送」
ここで、ポートを追加する。ポート番号は慣例的に「8080」が何かと無難。この設定はlinuxのコンテナを終了させるとOFFになるので立ち上げるたびにONにする必要がある。
・Apache2の設定
ターミナルでlinuxにログインして設定していく。
Apache2の設定ファイルは /etc/apache2/ 以下。
/etc/apache2/ports.conf
をエディタ(vim)で修正する。
Listen 80 → Listen 8080
変更したら、ターミナルでapache2を再起動。
sudo systemctl restart apache2
chromebook側で
https://localhost:8080
↑にアクセスして、デフォルトのスタートページが表示されたら問題なくapache2が動いている、というのを確認できてひと安心。
ここから以下、自分の環境に合わせてもろもろ設定していくことになる。
前提として。
・perlでCGIを使う
・任意のユーザーディレクトリでCGIを使う
・ローカルのサイトはSDカードで運用する
というのがあって、案の定ハマったりした。
・SDカードにシンボリックリンク
SDカードを差したらchromebookの「ファイル」アプリ
「USB Drive」という名前になっていてファイル名の半角空白は事故の元なので「USBDrive」に名前変更。
名前変更したら右クリックして「linuxと共有」する。
ターミナルで ls /mnt/chromeos/removable/USBDrive/
ができてたら、ローカルサイト用のディレクトリを作って、HOMEディレクトリにシンボリックリンクを作成すればOK。
・CGIを使うためのモジュールを設定
sudo a2enmod cgi
↑これでCGIが使えるようになる。
ちなみに。
apache2の設定ファイル群は「*-enabled」「*-available」というディレクトリに入っていて、
「enabled」が読み込まれている設定
「available」が利用できる設定
と分けられている。
利用したい設定をONにするのが
「a2enconf」「a2enmod」「a2ensite」
読み込まれている設定をOFFにするのが
「a2disconf」「a2dismod」「a2dissite」
(やってることはシンボリックリンクの作成/削除)
・apacheの実行ユーザーを変更
デフォルトだとapacheは「www-data」というユーザー、グループで実行する。このままでも問題はないんだけど、任意のユーザーディレクトリでCGIを実行するにはディレクトリやファイルの権限でひっかかって面倒くさい。
/etc/apache2/envvars
↑apache2の設定ファイルで使われる変数を設定しているファイルがある。
この中で実行ユーザー、グループが設定されているので
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
「www-data」を自分のユーザー名に変更すると、自分のHOMEディレクトリ以下でローカルサイトを展開できる(HOMEディレクトリ以下は、www-dataのままだと権限がないので、403エラーとなる)
・VirtualHostで設定
/etc/apache2/sites-enabled/
を見るとデフォルトの 000-default.conf
がONになっている。これを別名(mylocal.confとか)でコピーしてエディタで修正、編集していく。
修正が必須なのは以下の2点「VirtualHost」「DocumentRoot」を書き換える。
VirtualHost *:80 → 8080
DocumentRoot /var/www/html → /home/usrname/dir
8080番ポートに設定、ローカルサイトを展開するディレクトリを自分のHOMEディレクトリに設定。
公開するディレクトリの約束事をmylocal.confに追加記載する。
<Directory /home/usrname/dir/>
Options +ExecCGI -Indexes +FollowSymLinks
AddHandler cgi-script .cgi .pl
AllowOverride None
Require all granted
<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>
</Directory>
「+ExecCGI」
このディレクトリでCGIを実行できるようにする
「AddHandler」
cgiファイルの拡張子は「.cgi」と「.pl」
編集が終わった「mylocal.conf」を /etc/apache2/sites-available/
にコピーして、その設定をONに設定、apacheを再起動して完了となる。
sudo cp mylocal.conf /etc/apache2/sites-available/
sudo a2ensite mylocal
sudo systemctl restart apache2
エラーになったら以下の2つで確認。
sudo systemctl status apache2.service
sudo less /var/log/apache2/error.log
…て、ほぼほぼ、configファイルのエラーなので、設定ファイルを作ったら
sudo apache2ctl -t
で、設定ファイルのエラーを確認するのが吉。
とりあえず今日時点ここまで、かなあ。
公開してるサイトをコピーして、ローカルで動作確認ができるようにしておきたいところだ。
ホッカペに湯たんぽに電気毛布まで。寒さ対策の達人。
[11/30 15:22:42] 追記
lolipopと同じように使うためにいくつか必要で。
perl の場所が違う
→/uer/bin/perl を /usr/local/bin/perlにリンク
DocumentRootが違う(当然)
→/home/以下にディレクトリを作って、本体のあるSDカードのディレクトリにリンク
perlで足りないモジュールのインストール
JSON
→cpanでインストール
imagemagick
→cpanだとエラーになるので、apt install perlmagickで取得
DBD::SQLite
→cpanでインストール
とりあえず。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ブラウザでバーコードをスキャンしてISBNを取得する
2006年公開のWEB本棚「趣味は読書2」のスマホ版にバーコードをスキャンして本を登録できるようにしたのでメモ。
このWEB本棚は、なんだかんだ15年以上続けていて、最初は自宅で組んだパソコンをサーバーにして公開してたんだけど、東日本大震災があって、計画停電とかいつ停電してもおかしくない状況というのがあって、レンタルサーバーに引っ越し、現在にいたる。
WEB本棚「趣味は読書2」 https://doncha.net/
もともと自分で使うことを考えてたので、既読・未読がわかって、簡単なメモやカテゴリをつけられればいいので、機能的には十分足りてる。
ただ、1冊ずつISBNを手入力するのがちょっと面倒くさい。ガサツなわたしはISBNをタイプミスしてエラーになることも少なくないし。
なもんで、後づけで、アマゾンの検索結果を一覧にしてチェックしたものを本棚に登録できるようにして使ってたら、2019年のAPIの利用規定改定でアフィリエイトで売上のないアカウントはAPIを利用できないということになった。当然アフィリエイトの売上などないわたしは、APIを利用した検索結果からの一括登録ができなくなってしまった。
これを作った当初の状態に戻っただけなので、まあしょうがないな、ぐらいな感じ。本を買っては/読んでは、ちまちま本棚に登録していた。
てな昨今だったわけだけど。
イーロン・マスクがTwitterを買って、何かと騒がしいので、以前アカウントを作っていたマストドンに久しぶりにログイン。
ここは本好き、本読みのひとが集まるサーバー(インスタンス)で、流れてくる話も小説がらみが多くて静かに面白い。本の整理、積読なんかの話も流れてくる。
本好きの集まるマストドンはこちら
Bookwor.ms
それに刺激されて、ふたたびだかみたびよたびだか、WEB本棚の見直しをしてみた。
機能的には満足しちゃっていて、データベースの構造もシンプルで必要十分、昔の自分をちょっと褒めてもいいかもだった。
UIを含めたデザインが古臭くて気に入らない。でも、変更するとなると、かなり面倒くてさすがに手をつける気合気力体力がない…IE対応なんかのスタイルシートも混じってて、そのうち考えないとなあ。
スマホ版も見直しかな、とスマホでログインして触ってみて、そういやISBNの入力をバーコードスキャンでやりたいと思ってたんだと。
さっそく検索してみた。
…て、ここまで、自分でもびっくりするぐらい無駄なまえがき、無用なゴタクが長くてすまん。もう爺、老人なもので許してください。
ブラウザからスマホのカメラを使うためのjavascriptライブラリも公開されていた。
Quagga.jsというライブラリで、公式ページはこちら→ QuaggaJS
javascriptも詳しくないし、読み取り精度をあげるためには、HTML5あたりのcanvasも使う必要があるらしい。
あちこち実装されてるかたのサイトを拝見しては、ちょっとずつ試して試して、最終的にこちらのサイトに助けられて、どうにかISBNのバーコードスキャンに成功。
QuaggaJSを使ってブラウザでバーコードスキャン:なんぶ電子
ほんと、こちらのページには感謝しかない。
テストページでいろんなコードを試してまる一日。javascriptだけじゃだめで、canvasも使う必要があるのが大騒ぎで、javascriptが意図通りじゃないのか、それともHTML的な問題なのか切り分けるのに時間がかかった…って、どっちも自分のスキル不足が原因なんだけど。
WEB本棚「趣味は読書2」スマホ版 https://doncha.net/sp/
WEB本棚「趣味は読書2」ついて https://doncha.net/about.pl
WEB本棚「趣味は読書2」で出来ること https://doncha.net/about.pl?c=help
たぶん、小学校の頃、自動車文庫(移動図書館)がなければ、いまの自分はなかった。
ほんと、小説は面白いぞー!
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
perlでエクセルを読む
WINDOWSのActive perlでSpreadsheet、ParseExcel、ParseXLSXを使ってエクセルを読んで作業したのでメモ。
複数のフォルダに入っている、複数のエクセルファイル。
フォルダ名は五十音のひらがな。あかさたな~ってやつ。
ファイル名は日本語だったり乱数だったり、中身とはほぼ関係もなく意味不明なファイル名となっている。
エクセルファイルの特定箇所を確認して、別途登録されているものと違っていたら修正。
エクセルのファイル名を登録されているもの(日本語)にリネーム。
ざっくり、てな作業。
ひとつずつエクセルを開いて、ひとつずつ確認する、なんて手作業はやってられない。作業前から、見逃す・リネームを間違えるのが目に浮かぶようだ。
一覧表を作って確認して、そこから修正すべきものだけコピペする方が早くて確実。
エクセルファイルは「.xls」なので、使うのはSpreadsheet::ParseExcel
エクセルファイルを読み込んで、エクセルのファイル名と該当セルに記載されている名前をタブ区切りで出力するだけのスクリプトになる。
確認が必要なのは1枚目のシートにある3行目C列のセル内容
get_cell(2,2)で該当セル情報を取得(perlは0からなので3番目は2)
セル情報がHASHで入っている。必要なのは値なのでvalueで取得する。
取得する値はutfフラグ付きの日本語になるのでcp932(WINDOWSの文字コード)にして出力。
ここで気づかれると思うけど、このスクリプトは、複数のファイルを一度に処理するようにはできてない。引数に渡されたひとつのエクセルファイルを処理するだけ。
perlにはopendirがあるし、ファイル一覧を取得してループでSpreadsheet::ParseExcelに読み込ませるのが綺麗で正しいやり方。だけど、日本語フォルダ名、日本語ファイル名がうまく渡せない、読み込めなくてハマった。
たぶん文字コードの問題。utfフラグをつけてみたり何もしないまま渡してみたりしたんだけど、どうもうまくいかない。時間もあまりない。
そこでわたしの得意な現物合わせのやっつけ仕事の出番。
よくわかってない人間が間に入るからダメなわけで、だったら機械同士、ソフトウエア同士で直接やりとりしてもらおうとバッチファイルにした。
バッチファイルの for 文で /r をつけると再帰でサブディレクトリも拾ってくれるなんて、今回初めて知った。
このバッチファイルでperlにファイル名を渡すとエラーもなく意図通り読み込んでくれるようになった。いや、上記したように、本当だったらperlだけで済むはずなので、綺麗な解決方法じゃないけど、結果オーライ、だ。
出力されたtsv(タブ区切りファイル)を新しいエクセルに貼りつけ、別途正しい登録名を貼りつけ一覧表を作成する。
そうしたら、エクセルお得意のvlookupでエクセルの該当箇所と正しい登録名の相違を確認。登録名と違っているファイルだけ開いて該当セルを修正する。
また、修正作業には登録名をコピるのでついでに一覧表も修正。
エクセルのファイル名と登録名がこの一覧表の「.xlsx」ファイルに記載されることになるので、Spreadseet::ParseXLSXを使って読み込み、一括でリネームするようにした。
row_range()とcol_range()でシートに記載されている行数とカラム数を取得してループさせて全部読み込ませる。また、vlookupで N/A になっているところは正しい登録名を別セルに記載したので、そちらを読むようにさせた。
ここでもperlだけでリネームはできるんだけど、なんせ日本語のフォルダ名とファイル名。またうまくいかなかったら面倒くさいんで、perlでリネームするのではなく、system関数を使ってWINDOWSに仕事をさせることにした。
といいつつ、リネームは怖いので、別フォルダに同じディレクトリ構成で登録名ファイルをコピーすることにした小心者だ。
日本語のファイル名は見た目分かりやすいけど、スクリプトで扱うのはただただ面倒くさい。
それに、そもそもなことを言っちゃうと。
ファイル名や入力項目などなど、表記の揺れレベルじゃない間違いは、依頼する時点で入力するひとのことを考えて何か仕組みを作らないといかんよなあ。
あ。もうひとつ。
目grep手merge撲滅!ひとのやる手作業を信用しちゃいけない。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」