min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash pdftoppmコマンドでPDFを高画質JPG画像に変換する → AmazonCloudDrive(容量無制限)に保存

PDFファイルをJPG画像に変換するLinuxコマンド pdftoppm がかなり便利。

 

「PDFはPDFのまま持っておけばいいじゃん?なんでワザワザ画像に変換するの?意味あるの?」と思うかもしれないが、これが意味がある。なぜなら 画像ならAmazon Cloud Drive に容量無制限で保存できるから。

nelog.jp

 

自分のブログ記事すべてのPDFを丸ごとJPG画像に変換してAmazon Cloud Driveに バックアップなんてことができたりする。

f:id:min117:20181211055057p:plain


コマンドはこれ。input.pdfを食わせるとOUT-画像番号.jpg を出力する。

 

$ pdftoppm -r 300 -jpeg input.pdf OUT


オプションに -r 300 -jpeg を指定するところがミソ。

f:id:min117:20181211053233p:plain

 

PDFの1ページごとに1画像になる。

f:id:min117:20181211053310p:plain

 

もともとこんなだったPDF

f:id:min117:20181211053804p:plain

f:id:min117:20181211054209p:plain

 

各ページに分割されて画像になる。

f:id:min117:20181211054314p:plain

f:id:min117:20181211053926p:plain

 

tohka383.hatenablog.jp

 

f:id:min117:20181123110600p:plain

 


引数にpdfを取って、画像に出力するスクリプトにした。 

f:id:min117:20181123134135p:plain

 

 

 

なお、ImageMagick(という有名な画像変換ソフトウェア)に含まれる「convert」コマンドでも「PDF→JPG」変換はできるが、画質がよくないみたい。

f:id:min117:20181123102452p:plain

firegoby.jp

mieki256's diary - ImageMagick convert のオプション

Amazon FireTV 寒い冬は「みんなで筋肉体操」でストーブいらず

急に寒くなった。2018年の冬は突然きた。先週(2018/12/3-7)は、夏のような暑さから翌日には秋が来て、突然の冬。

燃料代も無駄に上がっていて。札束を燃やすように消費する。できるだけ内燃で暖まりたい。寒い時は筋トレに限る

みんなで筋肉体操」が超実用的。

www.youtube.com

たった12回の運動なのに、一気に身体に火が付く。さすがは筋肉指導。

f:id:min117:20181209210819p:plain

 

Amazon FireTVを使えば、テレビで見ながら運動できる。

min117.hatenablog.com

 

音声リモコンで「みんなで筋肉体操」と話すだけ。認識率はかなり良い。

f:id:min117:20181209212216j:plain


昨年(2017年)の12月頃は「FireTVでYouTubeが見られなくなる」なんてニュースも流れたけど、そんなはずがないわけで。アプリでバッチリ再生できる。

f:id:min117:20181209212139j:plain

f:id:min117:20181209212406j:plain

f:id:min117:20181209212418j:plain

 

あまりの使いやすさに、結局AppleTVは購入せず。オンデマンドは Amazon FireTV一択になった。レジューム再生で、いつでも一時停止してフォームを見ながら腕立てができる。

min117.hatenablog.com

www.youtube.com

 

腹筋もガッチガチになる。

www.youtube.com

 

実は「みんなで筋肉体操」はGYAOでも見られる。そして Amazon FireTV ならGYAOも見られる(AppleTVだと見られない。ここもFireTVの大きなアドバンテージ)。

f:id:min117:20181209212546j:plain

f:id:min117:20181209212550j:plain

f:id:min117:20181209212555j:plain

f:id:min117:20181209212600j:plain

筋トレと映画が並ぶという。この節操のなさが最高。さすがはAndroid優等生のAppleTVにはできない技だ。

f:id:min117:20181209212849j:plain

 

サイバーマンデーだし。別の部屋用にもいっこ買うかな。

f:id:min117:20181209213451p:plain

f:id:min117:20181209213430p:plain

 

コンソールの文字列をクリップボードにコピーする(Windows→clip、Mac→pbcopy、Linux→xsel)

コマンド操作(CLI)でコンソール文字列をクリップボードにコピーしたい。

Windowsだと「clip」コマンドでできる。

f:id:min117:20181207065219p:plain

 

macだと「pbcopy」Linuxだと「xsel」になる。

qiita.com

 

Windows7にて

cmd> echo echo I_AM_A_FATHER | clip

f:id:min117:20181207064942p:plain

f:id:min117:20181207065031p:plain

 

ファイルの内容を丸ごとクリップボードにコピーしたいときはリダイレクトを使う。

f:id:min117:20181207070104p:plain

f:id:min117:20181207070128p:plain

 

.htaccessを利用しない理由まとめ

拡張子htmlファイル内にphpコードを書いて動作させるには、やり方が2つあって

① /etc/httpd/conf/httpd.conf の設定を変える方法

② コンテンツを置いた各フォルダに .htaccess ファイルを置く方法

が選べる。前回記事では①を採用した。

min117.hatenablog.com

 

①と②のどちらがいいか。結論は①httpd.confを使った方が圧倒的に良さそうだ。理由をまとめておく。といっても、こちらの優れた記事が全てを語っていた。

qiita.com

 

理由1.

confファイルをいじれる権限さえあれば、.htaccessを作成する必要はないから。

f:id:min117:20181206045649p:plain

自宅サーバの場合はサーバの全権限は自分の手の内にあるわけで、当然 /etc/httpd/conf/httpd.conf もいじれるわけだから、.htaccess を使う必要がない。

 

 

 

理由2.

.htaccessを使うと、ユーザーにサーバの設定変更を許可することになるから。

Apache チュートリアル: .htaccess ファイル - Apache HTTP サーバ バージョン 2.2

f:id:min117:20181206050112p:plain自宅サーバだから、外部の他人からアクセスされることは(ログを見てても)まず無い。使うのは自分だけ、壊すのも自分だけだ。

そんな状況で、各コンテンツフォルダごとに.htaccessなんて設定したら「あれ?このフォルダはアクセスできるのに、こっちはできない」「あ、こっちだけ.htaccess効いてるじゃん」みたいな。設定のとっ散らかりが発生する。自分を騙すのは自分。結局そうなるから、各フォルダごとに設定がバラバラなんてゴメンだ。

 

理由3.

隠しファイルだから。

f:id:min117:20181206051551p:plain

単純に嫌なんだよね。設定ファイルのような重要なファイルが隠し属性で存在するということ自体が。全てを自己管理できる自宅サーバにおいて、これをする理由がない。設定ミスの原因になるだけだ。

 

.htaccessって「なんか気持ち悪い」という理由で極力避けてきたけど、今回しっかりドキュメントに当たってみて避けてた理由が納得できた。他人のサーバをレンタルするのでも無い限り自分には縁が無さそう。

拡張子htmlファイル内にphpコードを書いて動作させる

拡張子がhtmlのファイルの中にphpコードを書いて動作させたい。

f:id:min117:20181205063450p:plain

 

できた。httpd.conf の <IfModule mime_moduleの記述追加すればいける。ソース.html は末尾。

 

参考になった記事。

qiita.com

 

<やり方>

$ sudo -s

$ vim /etc/httpd/conf/httpd.conf

f:id:min117:20181205062820p:plain

以下を追記する。

<IfModule mime_module>
   AddType application/x-httpd-php .html
</IfModule>

f:id:min117:20181205062910p:plain

 

設定反映させるためにhttpdを再起動する。

# systemctl restart httpd.service

f:id:min117:20181205064604p:plain

 

動かしてみる。ICONTXT.pngという画像があるフォルダに phpline.html を置いてブラウザから開いてみる。

f:id:min117:20181205064530p:plain

 

うまく動いた。
f:id:min117:20181205062955p:plain

「phpline」は(末尾のソースの9行目の)phpの中で出ているから、これが見えていればphpコードが動いているということだ。

 

 

 

複数の画像を入れて試してみる。
f:id:min117:20181205063400p:plain

バッチリ動いた。

 

 

ソース(画像版)

f:id:min117:20181205065042p:plain

f:id:min117:20181205065102p:plain


ソース(テキスト版)

$ vim phpline.html

<!DOCTYPE html>

<html lang="ja">

<head>

        <meta charset="utf-8">

</head>

<body>

<p>test</p>

<?php

        print '<p>php line</p>';

 

    //エラーをhtml上に吐く

    ini_set( 'display_errors', 1);

    //記述上のエンコードを指定

//    mb_internal_encoding("UTF-8");

    //表示上のエンコード指定header

    header("Content-Type: text/html; charset=UTF-8");

// /// システム情報 ///

    $DATE = date("Ymd_His");

    // echo "アクセス日時:$DATE";

 

    $user_ip   = $_SERVER["REMOTE_ADDR"];

    //echo "<p>アクセス者:$user_ip</p>";

    $firstoctet = substr("$user_ip", 0, 3);

    //echo "第1オクテット:$firstoctet </p>";

 

    define('SCRIPT_DIR', dirname($_SERVER['SCRIPT_FILENAME']));

    define('IMAGES_DIR', SCRIPT_DIR);

    //print 'IMAGES_DIR:' . IMAGES_DIR . '<br>';

    $my_files = array();

    $imageDir  = opendir(IMAGES_DIR);

 

    while ($file = readdir($imageDir)) {

        if ($file == '.' || $file == '..'){

            continue;

        }

        // Mac _.IMG1234.JPG を読み飛ばす

        if (preg_match('/^._.*/', "$file")) {

            continue;

        }

        if (is_dir($file)){

            //echo "$file" . "_is dir<br>";

            continue;

        }

 

        // 拡張子を取得

        $info = new SplFileInfo($file);

        $ext = $info->getExtension();

        //echo "<p>$ext</p>";

 

            // 拡張子がmp4でなければ読み飛ばす

        if ($ext != 'jpg' &&

            $ext != 'JPG' &&

            $ext != 'png' &&

            $ext != 'PNG' &&

            $ext != 'gif' &&

            $ext != 'GIF'

            ){

            continue;

        }

 

        $files[] = $file;

    }

 

    foreach ($files as $i) {

        echo "<a href=\"$i\"><img src=\"$i\" alt=\"$i\" width=\"200\"></a>";

        //echo "<br>";

        print ' ';

    }

 

    echo '<br><br>';

    echo "アクセス日時:$DATE";

    echo "<p>アクセス者:$user_ip</p>";

    echo "第1オクテット:$firstoctet </p>";

    print 'IMAGES_DIR:' . IMAGES_DIR . '<br>';

 

    print '<p>php line 2</p>';

 

?>

 

 

 

</body>

</html>

 

bash はてなブログのURLを指定したら「タイトル名.pdf」に出力するスクリプト

指定したURLをPDFに変換するスクリプトを、以前作った。

min117.hatenablog.com

 

指定したURLのタイトルをとってくるスクリプトも、さっき作った。

min117.hatenablog.com

 

これを組み合わせて、指定したURL(引数1)をPDFに変換て、「URLの<title>名.pdf」で保存してくれるスクリプトにする。

 

内部で「wkhtmltopdf」コマンドを使っているので、スクリプト名は頭にmyをつけて mywkhtmltopdf.sh でいいや。

 

こんな動き。

$ ./mywkhtmltopdf.sh URL名

f:id:min117:20181205051611p:plain

f:id:min117:20181205051505p:plain

 

出力されたファイルを開いてみる。

f:id:min117:20181205053927p:plain

 

バッチリpdfになっている。Linuxほんと最高。

f:id:min117:20181205054007p:plain

 

ソース 

#!/bin/bash

 

shopt -s expand_aliases

source ~/.bashrc

 

 

# 異常時にちゃんと止まるスクリプト

# http://fj.hatenablog.jp/entry/2017/05/20/192431

set -eu -o pipefail

trap 'echo "ERROR: line no = $LINENO, exit status = $? > &2; exit 1' ERR 

 

mydate=`date +"%Y%m%d_%H%M%S"`

mypath=`pwd`

 

echo $mydate

 

# http://d.hatena.ne.jp/nattou_curry_2/20091103/1257262803

# Bashを使うなら理解しておきたいアルゴリズム - 抽出・ソート・結合・集計

 

# 関数

 

# function multi() { echo "数値を入力"; read ans; for i in $(seq 1 10); do echo "$i"; echo $*1; done; }

 

 

##### 処理開始

 

# pdfにしたいURLを引数でもらう(ARG1)

# スペースや日本語だったらどうするかの対策はいるけどそれは今後

# if $# -lt 2

if [[ $# -lt 1 ]]

then

    echo '引数不足 最低1個必要'

    echo '======================================================================'

    echo "$0 URL 出力ファイル名.pdf"

    echo '======================================================================'

    exit

fi

 

 

# 出力するpdfのファイル名を生成する

# htmlの<head>ここ</head>を捕捉してファイル名にする

 

# curl -s http://min117.hatenablog.com/entry/2017/07/18/213239 | egrep '.*<title>.*</title>.*' | awk -F\> '{print $2}' | awk -F\< '{print $1}' 

 

# OUT=$(curl -s http://min117.hatenablog.com/entry/2017/07/18/213239 | egrep '.*<title>.*</title>.*' | awk -F\> '{print $2}' | awk -F\< '{print $1}')

 

OUT1=$(curl -s "$1" | egrep '.*<title>.*</title>.*' | awk -F\> '{print $2}' | awk -F\< '{print $1}')

 

#出力ファイル名の半角スペースはアンダーバーにする

OUT2=$(echo "$OUT1" | sed -e s/" "/"_"/g)

 

# 画面に情報出力する

echo '======================================================================'

echo "URL:$1"

echo "OUT:$OUT2".pdf

echo '======================================================================'

 

# よろしいですか?を聞く

 

echo "よろしいですか? [y/n]? "

read ans 

# 大文字小文字変換 UPPERは${i^^} LOWERは${i,,} ← Linuxでしか使えない/Macbashではダメ

#echo ${ans,,}

#ans="${ans,,}"

#echo "$ans"

#echo "$ans" | tr "[A-Z]" "[a-z]" # upper to lower

ans=`echo "$ans" | tr "[A-Z]" "[a-z]"` # upper to lower

case "$ans" in

 

read ans 

# 大文字小文字変換 UPPERは${i^^} LOWERは${i,,} ← Linuxでしか使えない/Macbashではダメ

#echo ${ans,,}

#ans="${ans,,}"

#echo "$ans"

#echo "$ans" | tr "[A-Z]" "[a-z]" # upper to lower

ans=`echo "$ans" | tr "[A-Z]" "[a-z]"` # upper to lower

case "$ans" in

    y | yes )

        echo "yesです"

        # wkhtmltopdf URL 出力ファイル名.pdf

        # wkhtmltopdf http://min117.hatenablog.com/entry/2017/07/18/213239

        wkhtmltopdf "$1" "$OUT2"

        ;;

 

    n | no )

        echo "noです" ;;

esac

 

case文は久しぶりに使った。末尾の ;; いつも忘れるなぁ。

 

*1:ans*i

bash はてなブログの記事の<title>だけをワンライナーで取得する

はてなブログの記事のタイトル部分だけをワンライナーで取得したい。ちょっと作ったらできた。早起きは三文の徳。

 

$ curl -s http://min117.hatenablog.com/entry/2017/07/18/213239 | egrep '.*<title>.*</title>.*' | awk -F\> '{print $2}' | awk -F\< '{print $1}'

f:id:min117:20181205043727p:plain

ワンライナー最高。不恰好とか気にしない。実用性と即効性を重視。

 

curl -s オプションをつけるとヘッダというかプログレスバーというか(Averageとか)を表示させないことができるようだ。

u0sa0.hateblo.jp

 

min117.hatenablog.com