初めての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側で
http://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」
AmazonPA-API5に移行で大騒ぎや

amazonのAPIが2020年にバージョン5になります。
https://affiliate.amazon.co.jp/help/node/topic/GZBFW3F79Y7FADBL
…というのは薄っすら意識はあったものの、1/23に届いたメールタイトルに驚愕
「IMPORTANT UPDATE -
Upgrade to PA API 5.0 before PA API 4.0 shuts down on March 9, 2020」
この「PA API 4.0 shuts down on March 9,2020」はさすがに見逃さなかった。
これまでずっと使い続けていたAPIのまさかの終了のお知らせだ。
去年2019年は、売上のないアカウントはAPIの使用制限がかかるようになり(売上のないアカウントは実質使えなくなり)困ったなあ、と思いつつも、たまーーーに、ポツリとクリック→購入があって使える日もあったんだけど、今回のAPIの変更は、そんな呑気なことを言ってるヒマはない。
まったく使えなくなるのだ。
てことで対応しなきゃまずい。とてもまずい。かなりまずい。
慌ててamazonのwebサービスドキュメントページをざっくり確認。
https://webservices.amazon.com/paapi5/documentation/
ver4とver5ではまったく違う。別人となる。
https://webservices.amazon.com/paapi5/documentation/migration-guide/whats-new-in-paapi5.html
取得するデータが、今までずっと変わらずXMLだったのに、ver5からはJSONになる!!びっくりマークをつけてもつけたりないぐらい驚天動地だ。
…てことは、現状使っている自作のスクリプトは全面的に書き換えが必要となる。
SDKを使ってお手軽に、とか思って探してみたところ、ver5に用意されているSDKは、Java、Node.js、Python、PHPの4つ。なんでperlがないねんっ!!
確かamazonはフロントのWEB側はperlだったはずだろう。今どきのWEBサービスには珍しくperlのサンプルもずっと用意してくれていたってのに、だ(残るはPaypalぐらいか)
JavaもNode.jsもわからんちんだし、Pythonもこれからの主役はこれか、ぐらいの遠巻き。
PHPがどうにか少しはいじれるので、サンプルをダウンロードして、perlに移植してみた。
サンプルに入っているDefaultApi.phpでエンドポイントやオペレーション名を拾って、WithoutSDKのサンプルコードで署名込みのヘッダーを作れるようにした。
PHPはどこからグローバルというか、スコープというのか知らんけど、把握するのにあっちこっち行かなきゃわからないから好きじゃなかったんだ、てのを再認識。
さて、これでそれっぽいリクエストを作れるようになったはずなんだけど。
売上のないアカウントなので、試せない。
売上のないアカウントには用はないamazonだ。
作ったスクリプトを使って。
ローカルのPCでリクエストを投げると
439 TooManyRequests というステータスと、JSONでエラーメッセージが返ってくる。
試しにレンタルサーバーに上げてそこからリクエスト投げると
503 とHTMLのエラーページが返ってくる。
どうやらどちらも売上のないアカウントだから相手にされない、ということっぽい。
一応、レスポンスのサンプルは公式ページにある。
でもなあ、こういうのって実際に何が返ってくるのか確認できなきゃ難しいんだよなあ。
てことで、大慌てで昨日一日ごそごそやってみた感想というか所感というかなんちゅーかほんちゅーか。
APIとかクロールとかで検索するとPython本が上位にずらーっと。
インストールぐらいしていっちょかみしといたほうがええか…。
まあ、最悪はamazonのデータを利用してサービスを公開していて安定稼働している他サイトからデータをいただくというクズなことをすれば、わたしのサービスが止まることもないんだけどね。うーむ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
日本語ディレクトリ名で吐血

今さら、ハマったんでメモしておこう。
perl の ファイルテスト演算子 -d とかディレクトリを開くopendir()でディレクトリとして認識してくれず、そのディレクトリだけ見えない状態だった。
WINDOWS10で、ActivePerl。
日本語のディレクトリ名で、たぶんこいつだろう、という見当はついていた。
「―」←こいつ。
utf16 2015
utf8 E28095
euc A1BD
shiftjis 815c
罫線というか日本語のダーシ?ダッシュ?に使われる記号。
↓グーグル様を駆け巡ってたどり着いたのがこちら
http://nomenclator.la.coocan.jp/perl/shiftjis.htm
「Shift-JISテキストを正しく扱う」
助かりました。ありがとうございます。
「―」はshiftjisだと「815c」で、この「\x5c」がファイル名やパスの末尾にあるとperlはうまく扱えない、らしい。
回避するには
ディレクトリ名の末尾に「'/.'」path区切りをつけてカレントディレクトリのピリオドをつける。苦肉の策ではあるけど、これで無事ディレクトリを辿ることができた。
具体的には
-d dirname
てなことやってたところを
-d dirname . '/.'
などとやって無事perlからディレクトリが見えるようになった。
(再帰的にディレクトリを辿るサブルーチンにさっそく採用させていただいた)
ディレクトリ名に日本語を使いたくはないんだけど、仕様で必要とされるケースがあるので、しかたなく。
にしても、ほんと今さらなトラップに仰け反ったぞ。ほんとびっくりした。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
utf16からutf8に変換

管理ページからダウンロードしたデータがNNNNN.csvという名前なのに、中をみるとタブ区切りでびっくりしてたんだけど、perlでいつものようにごそごそやると文字化け。
エクセルに読み込んで別名保存すればいつもの意図通り。エクセルで保存すると文字コードはcp932、いつも通りになるからだ。
で、文字化けするタブ区切りのcsvファイルの文字コードを確認したらutf16LE BOM付き、でビックリ。ていうかなんでやねん。
これはperlで扱いにくい文字コードで、確か以前悶絶して諦めた記憶。結局一度エクセルなどに読み込ませて別名保存でcp932にしてからperlで処理していた。
今回、頻度ボリュームともけっこうあるので、こんなひと手間をかけたくない。perlだけで処理したい。
ということでぐーぐる様。
WindowsでPerlを使ってUnicode処理(1)
http://blog.livedoor.jp/numa2666/archives/52344850.html
↑こちらのサイトを参考にさせていただきました。ありがとうございます。
わたしの場合、汎用は必要なくて、入力はUTF16LE BOM付、出力はUTF8 BOMなしの決め打ち
UTF16LE BOM付を、UTF8 BOMなしに変換するサブルーチン
詳細は上記サイト参照。
ここではやってることの説明だけ。ちゃんと理解してるわけでなく、結果オーライでやってるので間違ってる可能性があるけど。
・入力はバイナリモードで読み込む必要がある。
・ファイル全部一気読みのために、入力レコードのセパレーターを殺す。
・データの頭のBOMを削除
・utf-16でデコード(スクリプトで処理するため)
perlの内部形式にデコードしてしまえば、あとはそのまま処理してもいいだろうし、他の文字コードにエンコードしてもいいし。
ここから先はいつも通り、となる。
…にしても、どうしてutf16なんてものがあるんだろう。
(perlで扱いにくいってだけなのかもしれないけど)スゲーめんどくさい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」