min117の日記

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

IPA に情報処理技術者試験を申し込む

 

7月6日から、IPAが秋季の情報処理技術者試験の受付を開始したようだ。

www.ipa.go.jp

f:id:min117:20170708181553p:plain

クレジットカードだけで申し込みできる。

f:id:min117:20170708183534p:plain

受験料は 5,700円。まあ、ケジメには良い。受ける。

f:id:min117:20170708183703p:plain

 

RaspberryPi vi の閲覧専用モード(viewコマンド)について今さら知る

 

仕事でやりとりしたお客さんとこの SE が使っていたコマンド「view」。古めの Redhat で叩いていたので「ほぅ、こんなコマンドもあるんだ」と思って調べたら、なんてことはない、vi そのものだった。

d.hatena.ne.jp

手元の RaspberryPi にも最初からインストールされていたので、Redhat系でもDebian系でも両方で使えるらしい。

ヘルプを見てみる。

f:id:min117:20170708083459p:plain

-d Diffモード 調べる。

-b バイナリモード。何かで使うかも。

-l Lispモード。試してみたい。

fedora Apache(httpd)で cgi-bin が動かない場合の対処(permissionエラー)

 

Apache から直接 pythonスクリプトを実行したいが、どうしてもエラーになる。

You don't have permission to access /test.py on this server.

f:id:min117:20170702120200p:plain

環境は以下。

fedora 20

Apache/2.4.10(Fedora

ーーー

解決手順

① まずログをみる

$ sudo -s

# ls -sharlt /var/log/httpd/ | grep error | tail -n 5

f:id:min117:20170702115627p:plain

# vim virtual.host-error_log

f:id:min117:20170702115837p:plain

エラーがわかった。

because search permissions are missing on a component of the path

cgi-bin がどこにあるかを conf ファイルで確認する

$ sudo -s

# cd /etc/http/conf/

# vim httpd.conf

f:id:min117:20170702120600p:plain

cgi-bin という文字列で検索をかける。

f:id:min117:20170702120714p:plain

↑ このconfの行数でいうと

・756行目にScriptAlias

 ブラウザから http://test.com/cgi-bin/ と表記したときに、/var/www/cgi-bin にアクセスできるようにする(ショートカットを作る)機能。

・770行目のDirectory

 cgi実行権限を決める場所。Options +ExecCGI Require all granted が無いと pythonスクリプトが動かない。

なお、Apache は Ver2.4から「Require all granted」という表記になったらしい。Ver2.2だと表記方法が違う。

komeiy.hatenablog.com

cgi-bin フォルダの権限が「drwxr-xr-x」になっているか確認

f:id:min117:20170702123047p:plain

④ 実行するスクリプトファイル権限が「-rwxr-xr-x」になっているか確認

f:id:min117:20170702123226p:plain

cgi-bin フォルダ所有者httpd を実行しているユーザーになっているか確認

# ps aux | grep httpd

f:id:min117:20170702124348p:plain

実行ユーザーは「www-data」であることがわかった。③と④から、cgi-binフォルダも、test.pyスクリプトも、どちらも所有者が www-data なので、問題なし。

python スクリプトにヘッダ行があるか確認する

python スクリプト「 Content-type: text/html¥n 」の記述があるか確認する。これがないと(①の手順でログを見たときに)malformed header from script」というエラーが出てしまう。

http://www.futomi.com/lecture/apache/cgier

# vim test.py

f:id:min117:20170702122602p:plain

Apache を再起動する

ここまで設定したら、Apache を再起動する。

$ sudo -s

# systemctl restart httpd.service

f:id:min117:20170702122354p:plain

ーーー

ここまでの設定で cgi-bin は動くと思うが、VirtualHost を立てている(複数のWEBアドレスを使って運用している)ときはさらに /etc/httpd/conf.d/vhost.conf も見る。

$ sudo -s

# vim /etc/httpd/conf.d/vhost.conf

f:id:min117:20170702121623p:plain

f:id:min117:20170702121840p:plain

↑ このconfの Directory の設定を、上記の 756行目と770行目と同じにしないといけない。

設定を変えたので、もう一度 Apache を再起動する。

$ sudo -s

# systemctl restart httpd.service

f:id:min117:20170702122354p:plain

ブラウザ からアクセスして、動くか試してみる。

f:id:min117:20170702122739p:plain

 無事動いた。

ーーー

2017/7/16 追記

python3 から ヘッダーをprintしないとうまくいかないことがあることもわかった。

fedora の場合、エラーは /etc/httpd/logs/ の中にある。ログファイル名は環境によって違うので読み替える。

$ sudo -s

# vim /etc/httpd/logs/virtual.host-hoge-error_log

f:id:min117:20170716224039p:plain

実際に出たエラーごとに見てみる。

ーーー

エラー① python3 スクリプト内に日本語文字列が含まれている

# vim /etc/httpd/logs/virtual.host-hoge-error_log

f:id:min117:20170716224422p:plain

python3 の print文に、日本語文字列を含んでいたためにエラーになった。「u753b…」のような部分で、日本語がうまく処理できていないとわかる。pythonスクリプトを見てみる。

# vim twAllDL.py

f:id:min117:20170716224706p:plain

確かに日本語を出力しているが、処理するための記述(ヘッダでのutf8宣言)には問題なさそう。 ちゃんと # -*- coding:utf-8 -*- と書いているし。

f:id:min117:20170716224751p:plain

原因調査は面倒なので、日本語のところを英語にして対応しちゃう。

f:id:min117:20170716224849p:plain

これで エラー①は消えた。

ーーー

エラー② ヘッダ出力する print文を書いてない

# vim /etc/httpd/logs/virtual.host-hoge-error_log

f:id:min117:20170716225036p:plain

Bad header というエラーになるようだ。python3ソースを見てみる。

# vim twAllDL.py

f:id:min117:20170716225458p:plain

うむ。確かにヘッダのprint文が無い。print("Content-type: text/html¥n") を書き足してみる。 ← python3 なのでprint文にはカッコがつくので注意。

f:id:min117:20170716225649p:plain

ーーー

2017/7/17 追記

・ヘッダに注意

 #!/usr/bin/python3 ← python2か3か

・日本語をutf-8でラップする

 import io

 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print文の前行に必ず Content-type ヘッダ出力が必要

 http://ura22.sakura.ne.jp/pycgi/practice.html

f:id:min117:20170717065440p:plain

 ↑ 改行コードは ¥n だけでいけた。

f:id:min117:20170717073656p:plain

コマンドまとめ

(www-data は httpd の実行ユーザ)

$ sudo -s

# cd /var/www/

# sudo chmod www-data:www-data cgi-bin

# sudo chmod 755 cgi-bin

# cd cgi-bin

# sudo chmod www-data:www-data twAllDL.py

# sudo chmod 755 twAllDL.py

# vim twAllDL.py

print("Content-type: text/html¥n")

# systemctl restart httpd.service

# vim /etc/httpd/logs/virtual.host-hoge-error_log

ーーー

注意点まとめ

PythonスクリプトPython2か、3か(3なら、print文にカッコがついているはず)

Pythonスクリプト字下げは半角スペースかタブかどちらかで統一されているか

Pythonスクリプトにヘッダーを書いているか

 print("Content-type: text/html¥n")

 または

 print('Content-type: text/html; charset=UTF-8\r\n')

ーーー

参考(Python3 スクリプト

Python3で作る簡素なCGI

yxshipg.appspot.com

ーーー

参考(cgi-bin配下のhtml)

/cgi-bin/ディレクトリ配下の画像やHTMLが表示できない

f:id:min117:20170717075919p:plain

 

 

 

Python 3 で twitter の画像を一括取得する(お気に入り ❤️ を付けたツイートの画像の一括ダウンロード)

 

このサイトのコードそのままで動いた。最高すぎる。

prpr.hatenablog.jp

ーーー

スクリプトのファイル名は twAllDL.py(tweetAllDownLoad.py)にする。

$ vim twAllDL.py

f:id:min117:20170701204544p:plain

f:id:min117:20170701204936p:plain

f:id:min117:20170701205024p:plain

実行してみる。

$ python3 twAllDL.py

f:id:min117:20170701205319p:plain

ダーっと画像がダウンロードされる。最高だ。

f:id:min117:20170701205558p:plain

保存された画像を、自作の画像ビューアで見てみる。

f:id:min117:20170701211029p:plain

キレーに一括ダウンロードされてる。ホント素晴らしい。今回は fedora でやってみたが、RaspberryPi でも(Python 3 が入っていれば)うまくいく。

bash if文の中で正規表現を使う

 

RaspberryPi や fedorabash にて

あるフォルダの中の全てのファイルを調べて、ファイル名の頭が数字3桁のものだけ表示する」をやりたい。

ーーー

まず「あるフォルダの中の全てのファイルを調べる」のは、超簡単。毎日やっている。

$ for i in *; do echo "$i"; done

ーーー

これに、if文をつけて「ファイル名の頭が数字3桁だったら表示する」の条件をつける。

$ for i in *; do if [[ "$i" =~ ^[1-9]{3} ]]; then echo "$i"; fi; done

(全角のカッコ [ ]は実際は半角なんだけど、このブログの制限で全角表示にしてる)

f:id:min117:20170701202840p:plain

bash の if文の中の正規表現=~ で使える。

MacbookAir Python 3 をインストールする(OSX Sierra)

 

Mac へのPython 3のインストールは以前の記事で行ったが、もっと簡単な方法がないか試す。以前の記事では pyenv をインストールした。

http://min117.hatenablog.com/entry/2017/01/17/233852

今回は純粋に pip だけで python3 をインストールする(BeautifulSoup を使いたい)。参照はこのへん。

ottan.xyz

Sierra への対応を明示した記事がなかなか無くて困るが、この記事は明示しているので。

ーーー

$ sudo easy_install pip

f:id:min117:20170701170603p:plain

f:id:min117:20170701170516p:plain

RaspberryPi 音が出ないときは sudo vim /boot/config.txt に dtparam=autio=on を記述して解決

 

RaspberryPi(初代)の cron に radiko の起動スクリプトを設定して、毎日決まった時間にテレビのスピーカーからラジオが流れるようにしたつもりなのに、なぜか音が鳴らない

ーーー

RaspberryPi 3 のほうはうまくいっているので、比較して調べたら、音声デバイスを認識してなかった。初代のほうの /boot/config.txt を編集する。

$ sudo vim /boot/config.txt

f:id:min117:20170701093651p:plain

dtparam=audio=on

を記載して再起動したら、無事ラジオを聴けた。/boot/config.txt のデフォルトではこの記述があるんだけど。以前 MPEG の記述を入れる編集をした時に、まちがって消したのかもしれない。