WordPress5でAmazonJSを使う

気付いたらエディタが前のやつからブロックエディタに変わっていてびびった上に、AmazonJSをどこで呼び出すのかわからなかったのでメモ。

Wordpress5になって、以前はプラグイン扱いだったGutenbergというのがデフォルトで使われるようになったらしい。まぁ使い勝手も良いし楽しいので良いのだけど、AmazonJSが使えなくなるのはかなしい。というわけで使い方。

つかいかた

  1. ブロックを用意する
  2. ブロックタイプを「クラシック」にする
  3. 以前まで使えていたエディタが表示される
  4. AmazonJSを呼び出せそうなアイコンがあると思うので、あとは従来どおりに
単純な話でした。ブロックエディタを使いたくてこんな記事を書いているというのもある。

自宅ネットワークの設定

転居したのだが、転居先のインターネット回線工事が終わるより先に機材を用意して、その設定も済ましておきたい。工事が終わったら即座に利用が開始できる事を目指す。

利用機材・前提

最後にPPPoEの設定をするだけでそれとなく使えるようにする。回線工事を終えるまで固定回線は使えないが、モバイルネットワークを通してそれとなくインターネットには接続できるようにする。ネットワークの利用機材は以下の通り。
モバイルネットワーク:NETGEAR AC785
ルータ:Ubiquiti Networks EdgeRouter X
Wi-Fi AP:TP-LINK deco M5
それから、先に最終的なネットワークを示す。ネットワークアドレスについては下図参照。
最終的なネットワーク
最終的なネットワーク
インターネットへの接続はメインのlaptop、これを経由してEdgeRouter XをWANに接続する。あとはLAN側てきとうに作って、Wi-FiはTP-LINK deco M5をブリッジモードで動作させて使う。

手順とか

EdgeRouter Xの初期設定

WAN側はぶっちゃけどうでも良いのでDHCPで。LAN側は192.168.0.0/24でDHCPをセットアップしておく。
この段階でLAN側は一応出来上がっているので、sub-laptopとTVが通信できるようになっている。ただ、decoの初期セットアップにインターネット接続が必要らしく、このままでは有線系しか使えない。laptopをルータとしてセットアップして、どうにかインターネットへの経路を確保する。

laptopをルータ化する

laptop(ArchLinux)をルータとして振る舞わせ、EdgeRouter XとAC785の間に立ってインターネットへと接続させる。ひとまずlaptopは素直にAC785に接続しておく。

DHCPサーバのセットアップ

てきとうにセットアップする。

$ sdo pacman -S dhcp
$ cat /etc/dhcpd.conf
option dmain-name-servers 192.168.1.1;

subnet 192.168.11.0 netmask 255.255.255.0 {
  default-lease-time 600;
  max-lease-time 7200;
  option routers 192.168.11.1;
  range 192.168.11.2 192.168.11.250;
}

subnet 192.168.1.0 netmask 255.255.255.0 {
}
$ cat /etc/systmd/systm/dhcpd4@.service
[Unit]
Description=IPv4 DHCP srver on $I
Wants=network.target
After=network.target

[Service]
Type=forking
PIDFile=/run/dhcpd4.pid
ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid $I
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target
$ sudo systmctl start dhcpd4@hogefuga.service

IPフォワードとiptables


$ cat /proc/sys/net/ipv4/ip_forward
0
$ sudo sh -c 'echo 1 >/proc/sys/net/ipv4/ip_forward'
$ sudo iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -j MASQUERADE
$ sudo iptbles -t nat -L
〜略

疎通確認とか

まぁ、てきとうに。deco M5のセットアップが継続できるようになっているので、セットアップを完了させ、その後スマホアプリからブリッジモードに変更する。

その他

以上で作業終了である。中古PCをルータとして振る舞うようセットアップするっていうのを過去やったことがあって、それがそのまま活きた。あとEdgeRouter Xは取り敢えずクソ詰まらん普通の設定になっているけど、インターネット回線工事が終了して落ち着いたら色々弄ってみる予定。今はダッシュボード眺めてるだけでも楽しい。

それから、サブのlaptopをdeco M5にぶら下げて使おうと思ったらやたらめったら通信が遅くて困った。最初はdeco M5がクソ遅いんじゃないかと疑っていたけど、iperfを色んなところでやってみたら見えてきた。サブlaptop〜laptopでは30Mbpsくらいしか出ないが、TV〜laptopは250Mbpsくらい出る。Androidスマホからiperfするとやっぱり250Mbpsくらい出るので、サブlaptopの無線デバイスが死んでいるんだと思う。(laptopのNICはUSB接続でちゃんとしたものじゃないので、その辺のおかげでギガビットとも言いづらい速度になっているのだろうと思う)。 LANケーブルこまごま買い足すのクソめんどくさいので、いっそこういうの買っちゃったほうが楽なのでは?と思いながら、いつもこまごま買い足してしまっている自分がいる… はやくインターネット回線工事来ないかな〜

印刷禁止サイトを印刷する

下書きにおいてあったけど公開してなかったシリーズ。

 

日本電気技術者協会の解説講座、学生時代は結構お世話になったんだけど、研究で何度も見に行くうちに、あーこれ印刷して机にでも貼り付けておきたいなと思うようになった。

でもここ印刷禁止なのよね。

 

当時は大学でやってる研究が目的で印刷したかったんだけど、著作権法を眺めてると「授業の過程における使用に供することを目的とする場合には、必要と認められる限度において、公表された著作物を複製することができる」って記述があるんだよね。

研究も、履修登録を要する仕組みなので、「授業」の一環だよね!と解釈すれば、複製可能なはず。あくまで個人の勝手な解釈です。あと当該サイトに印刷に関する記述がぱっと見つけられないのも怖い。

 

という訳で、てきとうにソースコード眺めてると、window.onbeforeprintとかいうものが。

これ、最初はerase関数を実行するようになっているので、これを別ので再定義してしまえば良いのでは?と発想。

CSSでbodyにdisplay:noneを設定しているみたいなので、これをblockにしてしまえ

というわけで

window.onbeforeprint=function(){
document.body.style.display='block';
};

これであとは印刷し放題

 

ソース読めばそれとなくわかるし、大して難しい事もしてないけど、本当におkなのかは知りません。JSが読み書きできると、Webに関するいろんな事ができるよ、の一例でした。

Kumanの3.5インチモニタを回転させる

これ

今回はRaspberry pi 3 model Bに挿してつかう。

付属のCDにそのまま使えるRaspbianのイメージが入っているが、これを使うのは何されるのかわからんな?という声もよく見る。しかしまぁ、どのネットワークにも接続しないで使う予定だったので、ドライバ等の自前導入はせず、付属のイメージを使うことにした。

で、用途上はモニタを90度回転させると丁度良い感じなので、回転させる。

 

類似の商品が多いのでてきとうに調べていたら、2種類の情報があって、/boot/config.txtに

・display_rotate=90

・lcd_rotate=90

とかを書くとかいうのを得た。

ただし、前者だと画面は回転するがタッチスクリーンが回らなくて操作しんどい、後者だといい感じ!みたいな論調ばっかり。この口ぶりから分かる通り、うまくいきませんでした。lcd_rotateだとそもそも画面が回転しなかった。(要は別製品の情報なのかね)

 

Kumanのこの製品はWaveshareの3.5inch RPi LCD (A), 320×480 – waveshareのコピー製品、という情報を得たので(下の方にAnti-PiracyとかThis product is protected by patentとか書いてあるけど気にしない…)、Waveshareのそれっぽいサイトを眺めることにする。

5inch HDMI LCD -Waveshare Wiki

Screen orientation settings及びTouch screen calibrationの項で全てが解決した。キャリブレーションはメニューにも選択肢が最初からあったのでそっちを使っても良いかも。

 

きちんと一次情報を当たろうねとか、自前できちんと環境構築しようねとか、思いました(いつもの事では?)

Raspberry Pi 3 Model BでBrother HL-L2300を使う

環境はRaspbian(久々のDebian系だ)

 

一先ずCUPSを入れておく

$ sudo apt-get install cups

brotherから公式に提供されているドライバはi386なのでRaspberry piでは使えない…

という訳でぐぐってみたところ、それっぽいものをgithubで発見。

pdewacht/brlaser – github

対応プリンタ一覧にHL-L2300は無いが、HL-L2300Dがある。同一モデルのロケール違いっぽいのでそのまま突っ込む。

ビルドに必要なものをインストールしてから、REAMD.mdの通りに操作

$ sudo apt-get install build-essential
$ sudo apt-get install cmake libcups2-dev libcupsimage2-dev
$ git clone https://github.com/pdewacht/brlaser.git && cd brlaser
$ cmake .
$ make
$ sudo make install
$ sudo service cups restart

プリンターを接続し、CUPSのWebインターフェイスからプリンターを追加。

brlaserをインストールすると、モデル一覧にBrother HL-L2300D, using brlaser v4が出現するので、ここから追加すればおk

 

このままlprコマンドから印刷しようとすると怒られる。

$ lpr -o fit-to-page ./test.pdf
lpr: エラー - 利用可能なデフォルトの宛先がありません。

登録してやれば良い。一覧をlpstatで表示して、これをlpoptionsで指定する。

$ lpstat -p
プリンター Brother_HL-L2300_series は待機中です。2018年03月02日 00時55分09秒 以来有効です
$ lpoptions -d Brother_HL-L2300_series
copies=1 device-uri=usb://Brother/HL-L2300………(以下略)

あとはlprコマンドで普通に印刷できる。

PhantomJSで遊ぶ

Javascriptでいじれる、webkitベースのヘッドレスブラウザであるPhantomJSでスクレイピングを行う。

だいぶ前に、ファミマTなクレジットカードのログイン画面がクソ認証を導入したのでログインにマウス操作が必要になってしまった。どうせ見に行く情報も限られているし、この際スクレイピングしてしまおう。

クソな画像認証

 

 

まずはログイン画面の仕組みを探す。いじってみると、正解の記号(ここでは星)のみ掴めるようになっていて、他はただ置いてあるだけ。droppable関係を見てみれば良いのかな?とか思いながらソースコードやインスペクタとにらめっこしていると、「画像認証に必要なJS」とかいういかにもなコメントの下にjsファイルが3つくっついていた。

これを見てみる(HTMLにもJSにも丁寧にコメントが書いてあるので解釈が捗る)と、droppableの設定の下にdropした時の挙動が書いてあり、その辺の動作を真似てしまえば画像認証を突破できるのでは?という気持ちに。…突破も何も、ただソース読めば誰にだってわかる内容である、難読の工夫は見られないし、ご丁寧にコメントで可読性もバシバシ向上。

 

という訳でPhantomJSのお話。

てきとうなjsファイルを作成して、それをphantomjsに食わせると動く。

$ sudo pacman -S phantomjs
$ cat hello.js
console.log('hello phantom');
phantom.exit();
$ phantomjs hello.js
hello phantom

 

 

取り敢えずログイン画面を表示してスクショをとってみるのが以下。

var page = require('webpage').create();
page.open('https://wis.pocketcard.co.jp/netservice/login?type=ft', function(status) {
 console.log("Status: " + status);
 if(status === "success") {
  page.render('screen_shot.png');
 }
 phantom.exit();
});

 

実際にはページ遷移を挟むので参考URLを見ながらそれらしいものを書いたのが以下。今月の請求額をぴょろっと吐き出して終了する。

var page = require('webpage').create();

page.onInitialized = function() 
 page.evaluate(function() {
  document.addEventListener('DOMContentLoaded', function() {
   window.callPhantom('DOMContentLoaded');
  }, false);
 });
};

var funcs = function(funcs) {
 this.funcs = funcs;
 this.init();
};
funcs.prototype = {
 init: function() {
  var self = this;
  page.onCallback = function(data) {
   if(data === 'DOMContentLoaded') self.next();
  }
 },
 next: function() {
  var func = this.funcs.shift();
  if(func !== undefined) {
   func();
  } else {
   page.onCallback = function(){};
  }
 }
};

new funcs([
 function() {
  page.open('https://wis.pocketcard.co.jp/netservice/login?type=ft');
 },
 function() {
  page.evaluate(function() {
   $('#username').val('USERNAME');
   $('#password').val('PASSWORD');
   $('#imgCertf').val('1');
   $('#command').submit();
  });
 },
 function() {
  page.render('out.png');
  var seikyu = page.evaluate(function() {
   return $.trim($('div.table-cell-width501:first div span.bold').text());
  });
  console.log("seikyu:" + seikyu);
  phantom.exit();
 }
]).next();

 

 

 

ページ内でJSな処理を行うには、page.evaluate(function(){処理});みたいな感じでやれば良く、データを取り出すには、その処理からreturnしてあげれば良い。単純だ。

 

スクレイピングと言えば、コニカミノルタの強そうな複合機の消耗品残量を見れるWebページから情報を取り出してチャットツールに放り込むスクリプトを書いた事があるけど、その時はScrapyを使った。Python何もわからんところからスタートしてやっていくのとてもとてもしんどかったし、Scrapyなんだかんだ複雑だった…(しかもそのWebページはJavascriptで情報更新だったのでただ見に行くだけでは情報は得られず、ScrapinghubのSplashを使って情報を取得したのだった)

Javascriptは遊んだ経験が多少あったので、違和感なく簡単にコードが書けてよかった。

ただ、ES6の構文(アロー関数とか)を何も言わずに使うと処理も進まず思考停止みたいな感じになってしまってつらいことがあった。しょうがないのでES6の構文は使わずに上記コードを書いていたけど、github(ariya/phantomjs)では

Hi. Answering to your questions:

  1. When we solve all issues listed here #14458
  2. Yes. 2.5 will have full support for ES2015.

とある。pacmanで降ってきたのは2.1.1だったし、gihubの最新Releaseも2.1.3ということで、まだのようだ。

それからエラーを何も吐いてくれない感じだったので(ここでは閉じカッコの対応を間違えるというただのSyntax errorだったけど)参考URLの通り、nodeに読み込ませるとスッと教えてくれた。なんなんだろ。

 

 

参考URL:

PhantomJS でログインが必要なページでも自由自在にスクレイピング – 凹みTips

CasperJS/PhantomJSでシンタックスエラー行を取得する方法 – yohgaki’s blog

 

 

蛇足:

研究室では今までMajestouch NINJA(茶軸)を使っていたんだけど、追加で自分用にリアフォ(104UB-S)を買った。本当は少しお値段ケチって静音モデルでない方(104UB)が欲しかったんだけど、どこにも在庫が無くてネット販売でも取り寄せだったので、諦めて静音の方。

打ち心地は勿論最高に良いです。ずっと触っていたくなる…という訳でこのキーボードは研究が落ち着くまで研究室に置きっぱなしにしておく()

んで、このリアフォで書く最初の(趣味の)プログラムがこれ、というわけ。最近ずっと研究関係のものしか書いてなかったので時間があいてしまった。これからよろしくね♡

AndroidStudioいじってたらjava.lang.IllegalStateException aapt2 is missingとか言われた

環境はArchLinux

Android Studio本体はパッケージ管理でインストールしたんだけど、それが必要とするコンポーネント(つーかAndroid SDK)はパッケージ管理だったりAndroid StudioのSDK Managerだったりあやふやな状態でした。Android – ArchWikiにある通り、

Android Studio をインストールして IDE を使って SDK を管理する場合、以下のパッケージをインストールする必要はありません。

以下のパッケージってのは、android-platform, android-sdk, android-sdk-platform-tools, android-sdk-build-toolsの事。

大抵の手順指南サイトではSDK Managerを利用して管理するので、それに倣うなら、環境構築の時にパッケージ管理で上記パッケージたちをインストールするべきではなかったのだ(ArchWikiはちゃんと読みましょう)。

まぁそれはともかく、結局パッケージ管理で導入しちゃって、更新が競合したっぽくて、環境が壊れてしまった。それが原因で、開発したアプリケーションを実行するときに、Execution failedとかなんとか。java.lang.IllegalStateException aapt2 is missing的なエラーが出たのだと思われる。

aapt2が無いよ、と言っているんだけど本当に無いのかfindで検索すると、/opt/android-sdk/build-tools/27.0.0以下とかに見つかる。

Android Studio側のメッセージを見ると、26.0.2以下を探している雰囲気がしたので、それを入れなおしてみる。

具体的には、

SDK Manager→SDK Toolsのタブ→Show Package Detailsにチェックを入れる→Android SDK Build-Toolsの26.0.2が見つかるので、これのチェックを外してApply(一旦削除)→チェックを付けてApply(インストール)

みたいな感じでなんとかなった。一旦削除する意味があるかは微妙だけど、結局うまくいったのでまぁいいや。

 

なんかノリでAndroidアプリを作ってみてるんだけど(勿論Javaは何一つ勉強してないです)、なんかAndroidStudioの動作が大変鈍重だし(比較対象はQt Creator)、UIはちっちゃくて見えないし、中々厳しい世界だなと思いました。まる。

NASからうっかり消してしまったデータを復元する

保存していた録画データを操作ミスで消してしまった。あまりにもつらい。

まとめ。

・extundelete:exFATに対応していない

・testdisk:目的ファイルは復元されたっぽいがデータが完全に壊れている

・photorec:死ぬほど時間がかかるが復元される、ただし目的のファイルがどれかは不明(最終的に目的データは復元できなかった)

 

 

以下、雑多な記録。

 

extundeleteが良さげだったけど、exFATに対応していないようなので別の手を探すと、testdiskが見つかる。どうだろ?

取り敢えずインストールして実行してみる。十字キーとEnterキーで操作できる。

$ sudo pacman -S testdisk
$ sudo testdisk

起動するとまずログを保存するか聞かれるので、取り敢えずCreateを選んでおく。

次にディスク選択画面に入るので、目的のディスクを選ぶ。

Select a media (use Arrow keys, then press Enter):
>Disk /dev/sda - 128 GB / 119 GiB - PLEXTOR PX-128M5S
Disk /dev/sdb - 4000 GB / 3725 GiB - MARVELL Raid VD
Disk /dev/sdc - 2000 GB / 1863 GiB - WDC WD20EZRX-00D8PB0

NASとして使っているのは/dev/sdbなのでこれを選択。するとPartition TableのTypeを選ぶ段になるが、正解がどれだかよーわからん…

Please select the partition table type, press Enter when done.
[Intel ] Intel/PC partition
[EFI GPT] EFI GPT partition map (Mac i386, some x86_64...)
[Humax ] Humax partition table
[Mac ] Apple partition map
>[None ] Non partitioned media
[Sun ] Sun Solaris partition
[XBox ] XBox partition
[Return ] Return to disk selection

Noneが自動選択されていたので、そのまま進んでみると、なんかコマンドメニューみたいなのが表示されるので、

[ Analyse ] Analyse current partition structure and search for lost partitions
>[ Advanced ] Filesystem Utils
 [ Geometry ] Change disk geometry
 [ Options ] Modify options
 [ Quit ] Return to disk selection

Analyseする。

Analyseが終わると、Quick Searchが選べるようになるので、取り敢えずそれを選ぶ→Structure:Okの表記が出る

パーティションが正しく発見されたっぽい

Disk /dev/sdb - 4000 GB / 3725 GiB - CHS 486382 255 63
 Partition Start End Size in sectors
 >P exFAT 0 0 1 486382 59 13 7813730560

ので、Pを押してファイルリストに入って、そのまま目的のファイルを探す。

見つけたら画面の指示に従ってコピーすると復元されるはずだ…………

 

しかし、復元された動画データは、完全に壊れていた…(再生できなかった)

 

もうひとつ、testdiskと一緒に入ってきたPhotoRecというものがある。どうも、testdiskはファイルではなくディスクの破損を修復するのがメインの目的で、ファイルについてはPhotoRecを使えという事みたい。ArchWikiには「ファイルシステムは無視して素のデータを探し当てるので、再フォーマットされたり完全に破壊されたファイルシステムやパーティションテーブルでも動作」とのことで、強い(こなみ)

それから、どうやらこのソフト、復元できるファイルを手当たり次第に復元しまくるらしい。また、このソフトが知っているファイル形式に限って復元可能である…とは言え、File Formats Recovered By PhotoRec – CGSecurityによれば大抵のファイルは問題なく復元可能である。中にはNintendo DSのゲームイメージであるnds形式なんかもあるし、結構強そう。

しかし、4TBのボリュームを選択しているからか、FilesystemAnalysisで異常に時間がかかった。ファイルが存在しない領域のみにしぼって復元するはずだが、結局5~10時間くらいかかっていたっぽい。

その後はドカドカ復元されていくので、保存先容量がいっぱいいっぱいにならないように順次チェック。

というのも、復元されたものはファイル名が無いので一つ一つ再生してみて確認しないといけないのだ。結構めんどい。

再生可能ファイルと再生不可能ファイルがそれぞれあったが、多分普通にデータが壊れている。空き容量に対して復元されたデータ量が3倍くらいあったので、一部分しか復元できなかったんだろう(ファイルサイズはそれらしいサイズだったので、重複したゴミデータでも含みまくっているのだろうか、と)

傾向としては、ファイルサイズが500MB程度までのもの(小さすぎるものは除外)だと再生可能な事が多かったように感じる。GBのオーダーまでいくと大抵の場合再生できなかった。断片化とかしてるともうダメなんだろうか?ファイルシステムとか全然勉強してないのでよーわからん。

 

取り敢えず、ファイルの復元手段を得たのは良いが、目的のファイルは復元できなかった。testdiskの時点で復元したものが再生不可だったので、そもそも復元不可だったのかもしれない。残念。

AndroidStudioの初期セットアップが容量不足で死ぬ

環境はArch Linux(いつもの通りAntergos)

素直に諸々チェックして進んでいくと、Android APIとAVDのところで死亡する。原因は容量不足。

見ると/tmpが完全に食いつぶされてしまっている。AntergosのインストーラはRAMの半分を/tmpとして用意するので、8GBのRAMを積んでいる今の環境では4GBが/tmpに割り当てられる。

 

やってみると「容量不足で死んだわ」しか言ってくれないので、一挙にやらずに少しずつやろうという事で、まずAndroid APIだけインストールしてみると、これはうまくいく。

残りのAVDは?

これがダメ。Download→unzipの、unzipに入った途端に、瞬間的にRAMの使用量が4GBくらい増える(/tmpが瞬間的に食いつぶされる)

で、これが一杯一杯になって死亡してるっぽい。Component Installerのテンポラリディレクトリを変更できれば良さそうなんだけど、Component Installerには設定画面が見当たらないし、Android Studioの設定見ても全然それらしいのが無いし、自力じゃどうしようもないと結論をつけ、Google先生に聞いてみる。

 

ぐぐったらこちらを発見。

I keep running out of tmpfs when trying to install Android SDK component – Ask Fedora: Community Knowledge Base and Support Forum

tmpfsをそもそも無効にするか、Android Studioのテンポラリディレクトリを変更すれば良いのでは?ってレスがついてるけど、その下に、具体的にどうすれば良いかが書いてあった。

export _JAVA_OPTIONS=-Djava.io.tmpdir=/var/tmp

よーわからんが、これAndroid Studioの設定じゃなくて、Javaの設定なのでは?という気持ちになる

なんでAndroid Studio側で設定が無いんだろうね

 

空腹がしんどい

PDFからPNGへ変換

スキャナで生成されたPDFデータをPNGに変換したいと思った時。1ページ1ページを分離してそれぞれ1つの画像ファイルとして保存したい。

 

1.ImageMagickで

$ convert hoge.pdf hoge.png

一番単純。これは画質がガタ落ちになる。densityオプションで画質向上できるけど、上げれば上げるだけどんどんRAMを必要とする。高画質な状態で作業したい時には不向き。density上げすぎると死亡する。

$ convert -density 600 hoge.pdf hoge.png
zsh: abort (core dumped) convert -density 600 hoge.pdf hoge.png

 

2.pdfimagesで

$ pdfimages -png hoge.pdf hoge

結構時間かかるが画質を落とさず取り出せる。

ただしスキャナの設定によって、理想通りの動作にならないことも。pdfimagesはPDFに画像データが貼り付けられていたらそれを取り出す、という動作のため、スキャンデータが1枚の画像として取り扱われる場合には(ただの画像データを貼り付けただけのページが並ぶため)PDF→PNG変換のように見える。しかし一部を文字として認識したりすると、各ページは複数のパーツ画像と文字、のようなデータになるため、pdfimagesを使うと、そこにあるパーツ画像のみが取り出される。

 

3.xpdfで

xpdfはpdftopngというそのものズバリなコマンドを持っている。xpdfからフォークしたPopplerではpdftoppmがあるので、これで一度ppmで書き出してからpngにしても良いかも。

$ pdftopng -r 600 hoge.pdf hoge

画質を落としたくないという事でDPIを600に設定してみたが、サクサク処理が進んでいく。軽い。今まで知らなかったけどめちゃくちゃ良いじゃん。

 

まとめ

convert→何でもおk、ファイル種別も自動判別のお手軽仕様だが、今回の用途では画質に拘ると死ぬ

pdfimages→割と手軽に使えるが、PDFデータの状態によっては理想通りの動作にはならない

pdftopng(Popplerならpdftoppm)→今の所マズイところが見当たらない

 

いつか読もうと思ってた本だけどレビューはそんな評価高くなくて微妙な気持ちになってる(ならなぜこれのリンクを張るのだといのは置いといて)