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)→今の所マズイところが見当たらない

 

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

Windows10でいくつかのアプリケーションが落ちる

例えば、

・まめFile5SE

・桜時計

・Exact Audio Copy

・StepMania

あたり。

まめFile5SEはぶっちゃけただのファイラーだしExplorerで代用できる(というか本来はExplorerの代用として使う立場なんだけど、Explorerあんま使い勝手良くないので)し、桜時計もWindows標準の時刻合わせに頼る事にすれば(数分くらいのズレを許容すれば(許容できないでしょ))使わなくても良い。ただ、EACは代替ソフトがあんま見つからなかったし、StepManiaなんかゲームなんだし代替ソフトもクソもねーよ。

いつからこうなったのか記憶がはっきりしないけど、OSバージョンはWin10 Pro 1703。

まめFileでは起動後タブリストが復元されて、ファイルリストが表示された直後に「動作を停止しました」エラー。

桜時計はタスクトレイにいる間は何も言わないんだけど、ウィンドウを開くと「動作を停止しました」エラー。

EACはCDの読み込みまでは良くて、リッピングを開始しようと(Alt+F7)すると「動作を停止しました」エラー。

StepManiaはそもそも起動もしてくれなくて、「エラー起こったよ!詳しくはログ見てね!」なメッセージが表示されるのみ。ログ眺めると「なんか知らんがデータ無かったわwwwww」みたいな感じ。

 

最初はHyperThreadingのエラーかなと思って(使用CPUはIntel Core i7 6700KなのでSkylakeだ)、HTTをオフにしてみたりもしたけど状況変わらず。使用マザーボードはASRock Z170 Gaming K4だけどマイクロコードアップデート降ってないかなと思ったら、7.10が最新(既に適用済み)、ベータ版の7.12ではHTTについてのマイクロコードアップデートが入ってるらしいが、ベータ版を迂闊に適用できるほど人柱ではないので敬遠。

 

もうちょっとちゃんと調べようと思って、イベントビューアを見てみる事にした。EACを起動して落ちたタイミングのイベントを見てみると、エラー情報が。

障害が発生しているアプリケーション名はEAC.exeで良いんだけど、障害が発生しているモジュール名にMacType.dllの文字…

 

取り敢えずMacTypeを無効にしてみると、今まで落ちまくってたアプリケーションが全く問題なく動作するように。

フォントレンダリングの汚さがWindows10でも改善されてなかったから、Windowsインストール直後にMacTypeを入れていたんだけど、それが悪さをしていたみたい。

最近のWindows Updateで降ってきた更新とMacTypeが競合するような内容だったのかもしれない。

 

 

最近ノートPCがサイズ変更無しに1366×768から1920×1080に変わった(どちらも13インチモデルなので寸法はあまり変わってないはず)お陰で画素密度が向上して、文字が随分見やすくなった。というわけで、23インチとか21インチの面積にFullHDを放り込む状況、いい加減やめにして、もうちょっと高解像度な世界で生きていけば、文字もなんとなく見やすくなるんじゃなかろか、という気持ちだ。

4Kモニタ買うなら40インチ前後にして、外形寸法あんま変わらないようにしようと思ってたけど、30インチ切りとかでも綺麗さで言えば向上するはずだから、そういう手もあるんだよな、と思ったりした。4Kモニタでも小さいサイズなら手を伸ばしやすい価格帯になるし。

この辺ワンチャンありそうじゃない?まぁお金無いけど。

シェルで直前の入力を使う

なんか使いたくなったときはいつも忘れてるのでメモ。

まず、直前に入力した引数を使いまわすには!$を使う。

$ mkdir hoge
$ cd !$

直前に入力したコマンドそのものを使いまわすには!!を。

$ pacman -Syu
$ sudo !!

!!が直前の入力に置き換わるような感じなので、次のような使い方もできる。

$ sudo eject
$ !! -t

ejectコマンドは-t, –traycloseをつけると光学ドライブのトレイを閉じてくれる。

Linuxで音楽CDをリッピング

今メインに使ってるWindows PCにディスクドライブが装備されていないので、リッピング部分のみLinuxマシンにやらせて、あとの変換とか再生行程は従来どおりにやりたい的な感じ。

当初/dev/sr0からddで引っ張り出せばいいだろと思ってたけどダメらしい。てきとうにぐぐった結果できそうだったのでやってみる。

 

CDを挿入後lsblkにエントリが追加される

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 256M 0 part /boot
├─sda3 8:3 0 111G 0 part /
└─sda4 8:4 0 7.8G 0 part [SWAP]
sdb 8:16 0 3.7T 0 disk /mnt/r_array
sdc 8:32 0 1.8T 0 disk
sr0 11:0 1 324.2M 0 rom

ケツにあるsr0がそうだ。cdrdaoでリッピング。

$ sudo cdrdao read-cd --device /dev/sr0 --read-raw --datafile ZMCZ-11306.{bin,toc}
Cdrdao version 1.2.3 - (C) Andreas Mueller <andreas@daneb.de>
/dev/sr0: HL-DT-ST DVDRAM GH24NS50      Rev: XP01
Using driver: Generic SCSI-3/MMC - Version 2.0 (options 0x0000)

Reading toc and track data...
~以下略

tocファイルをcueシートに変換。

$ toc2cue ZMCZ-11306.{toc,cue}

できあがったbinファイルはエンディアンが異なるっぽいのでddで変換する。このまま再生するとホワイトノイズにしかならない。

$ dd conv=swab if=./ZMCZ-11306.bin of=./ZMCZ-11306.bin.swap

以上でリッピングは終了。

 

ここまででbin+cueな状態にできたので、完了ということで。あとはてきとうに、煮るなり焼くなり。

 

ちなみに上記で使っていたZMCZ-11306はメイドインアビスのED。

あとOPも買ったよ

原作コミックスも全部買った。最高に心がきゅうっとするのでおすすめです(?)

ひどい広告記事になってしまった…

Windows10でアプリケーションが管理者権限で動いてるかチェック

メイプルなんちゃらとかいうゲームでSteam Controllerを使うためには、管理者権限で起動したSteamからクライアントを呼び出さないといけないらしい。

PC起動しっぱなしで、管理者権限だったかどうか思い出せない時、まぁ再起動すればいいんだけど、チェックできればいいよね、という話。

 

タスクマネージャの詳細タブで、「管理者特権」つー列を追加すればおしまい。

しょーもな。

 

こないだのSteamサマーセールで安くなってたから思わずSteam Controller買っちゃったけど、L2, R2が半押しと全押しとか、各ボタンの二回押しとか長押しとかで違うキーがマップできるとか、モードシフトの設定をすれば1つのボタンに複数キーマップできるとか、これが凄い良い

2次職3次職4次職とかまで進めばスキル数がガンガン増えていくので、通常のジョイパッドでのプレイはかなり厳しい、それ用にボタンが多いものを用意しないといかんなと思っていたけど、大凡普通のボタン数+ちょっとしかない状況でも全く問題ない。どのスキルをどこにあてるかはかなり考えないといけないし、慣れるまで難しいけど、まぁオンラインゲームってそういうものだよね。

ちなみに、見た目から一番わかりやすい、マウスを操作できるってのもなんだかんだ便利、狩りしながらインベントリの中確認とか余裕

 

ゆかり鯖でまったりやってるので暇だったら声かけてくれると喜びます

$(window).load(function() {});の形が廃止された

今更なはなし。

要素のロードが完了したら実行してくれるのを考えて、Webページのロードが完了したらJS関数を実行して欲しいというのを書いたけど、$(window).loadの形が、廃止されたらしい。

今の形はまた違うようだ。

 

以下が廃止された形

$(window).load(function() {
ほにゃらら
});

以下が今使える形

$(window).on('load', function() {
ほにゃらら
});

 

そもそもdeprecatedだったらしいので、まぁいつかはこうなる運命だったんだな

特定文字列を含むファイルを検索する

NOMP(node-open-mining-portal)を使ってオレオレプールをつくってひっそりとソロマイニングしていたけど、恐らくsegwitが有効化されてから、getblocktemplateがエラーでこけるようになってしまった(全然気づかなかった)

ぐぐってみると、bitcointalkにドンピシャの話が。getblocktemplateの引数に”rules”:[“segwit”]を追加しなさい、と。

なるほど~と思ってgit pullとかnpm updateとかしてみたけど、なんだかうまく取り込まれなかった気がした…ので、自分でなんとかしてみることにした。

 

というわけで、getblocktemplateという文字列を含むファイルを検索する。

grep一発でおk

$ grep -rnw hoge -e "PATTERN"

今回は「カレントディレクトリ内にgetblocktemplateという文字列があるファイルを検索する」のが目的なので、

$ grep -rnw . -e "getblocktemplate"

あとは適当に修正していけばなんとかなった。よかったよかった。

動かせないデータを隣のストレージに動かしてなんとかする

Windowsの話。

C:\Windows\Installerが死ぬほど肥大化して死んで欲しい場合とか、あと今回はMinerGateでETH掘ってるときのDAGデータが大きいとか

要は、その大きすぎるデータを隣のストレージに移動させたいが、そこに移動させたという設定をアプリケーション側で行うのが面倒、というパターン。

 

JunctionというのがMSから提供されているので、これを使う。

 

今回はDAGデータを移動させる。DAGデータ本体はC:\Users\user\AppData\Local\minergate\.ethash-minergate以下にあるので、これを事前に他のストレージに(今回はE:\.ethash-minergateとして)移動させておいてから、以下のような感じで

E:\>junction.exe C:\Users\user\AppData\Local\minergate\.ethash-minergate E:\.ethash-minergate

Junction v1.07 - Creates and lists directory links
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Created: C:\Users\user\AppData\Local\minergate\.ethash-minergate
Targetted at: E:\.ethash-minergate

 

要はシンボリックリンクみたいなものを張っているだけ。これでいくらでも移動させられるぜ

ちなみにC:\Windows\Installerが60GBくらいになってるマシンもあったんだけど、普通に使っているだけでここまでOSを肥大化させられちゃうOSってのも、なんだかなぁという感じだよね

multerを使ってアップロードしたときのファイル名

Node.js + Expressでなんか作ってるとき、multerを使ってファイルをアップロードしたときのファイル名の操作

githubに書いてある通りなのだけど、メモ

 

「filenameを指定しないと拡張子を一切含まないランダムな名前が付加されるぜ!」

 

つーわけで以下のような感じでfilenameを指定する

const multer = require('multer');

const multerStorage = multer.diskStorage({
destination (req, file, cb) {
cb(null, './public/uploads/');
},
filename (req, file, cb) {
cb(null, Date.now() + file.originalname);
}
});
const upload = multer({ storage: multerStorage });

 

cbの第二引数(ここではDate.now() + file.originalname)でファイル名を指定する。file.originalnameを付けているので拡張子も保持されるはず

Webページのロードが完了したらJS関数を実行して欲しい

Masonryを使ってレイアウトさせてたりとかしたんだけど、画像読込のタイミング、ないしはWebフォント読み込み完了のタイミングでもう一度位置計算して欲しいというお話。

HTMLデータ読込→Masonryによる位置計算、配置→画像が読込完了(Webフォント読み込み完了)になると、Masonryの枠が重なっちゃうんですよね。なので、それぞれ読込が完了したときに位置計算して欲しい。

前者、画像とかについては、$(window).load()みたいなノリでやればおk

後者、Webフォントについては、FontLoaderを使う事にした

 

ひとまずは以下のような感じで、Masonryの位置計算部分を関数の形で記述しておく。(再計算用のメソッドとかありそうだけどし〜らない)

function mason(){
$('article').masonry(){
〜Masonryのオプション〜
});
}

 

・画像とか

よく見るサンプルコードは(上記のように関数の形で用意しておいたなら)

$(function(){
mason();
〜その他やりたいこと〜
});

という感じだけど、$(function(){ほにゃらら})の形は、HTMLを読み込み終えたら実行されてしまうらしい。

やることは簡単。$(window).load()をに差し替えればおk

$(window).load(function(){
mason();
〜その他やりたいこと〜
});

 

・Webフォント

WebFontLoaderを使えば良いらしい。文字幅の変化を検知してWebフォント読み込み完了をキャッチするとかいう手法も見かけたけど、面倒そうなのでやめとく()

WebFontLoaderはGoogle Fonts, Typekit, Fonts.com, Fontdeckを読み込める…らしいが、他のものも使えるようで、今回はそっちの記述で。

<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
var fontconfig = {
custom:{
families:['フォント名'],
urls:['WebフォントCSSのURL']
},
active: function(){mason();},
inactive: function(){mason();}
};
WebFont.load(fontconfig);

active:Webフォントの読み込みが完了(レンダリングが完了)したら実行したい内容

inactive:ブラウザでWebフォントが有効でない場合もしくはフォントが読み込めなかった時に実行したい内容

 

そもそもJavascriptとか全く勉強しないで触ってるんだけどすげえつらい(基礎くらい勉強しような)