Make it possible with Python.

最近Pythonから離れ気味、その他物作りに寄り気味です。

タイムマシンカメラをつくる1(構想と作り始め)

このカメラ、コンセプトを含めて、まさに自分がほしいと思っていたカメラだったので、Linux、プログラミング初心者の自分が、試行錯誤して創ろうとしています。

kenkawakenkenke.hateblo.jp

このページは、そのカメラができあがるまでの勉強&トラブルシューティング記録です。

つくる物の構想

機能

上記ページの物と基本的に同じ物がほしいです。 ただし、音声アシスタントに家の音を持って行かれるのに抵抗があるので、音声でなく、ボタンで撮影開始したいです。そして、下記Daisoのワイヤレスボタンは、ボタンが2つあるので、それぞれに10秒さかのぼりと、60秒さかのぼりとかをのこせるといいなと思います。 Daisoのこのボタンは、少し置くとスリープに入るそうで、それを運用でカバーできるかが肝だと思っています。

ハード

  • RaspberryPi2
  • Daiso bluetoothシャッター
  • Microsoft Lifecam HD-5000

ソフト

  • ffmpeg

試行錯誤メモ

USBカメラが認識されない

RaspberryPiを起動したまま差し手も認識されず、再起動し直したら認識されました。

Anacondaにnode.jsをインストールするとエラーになる

Windows10で、Anacondaにnode.jsをインストールするとエラーになったので、対策を調べました。

ちなみに一度エラーになると、Anacondaをアンインストールしてもnodejsのファイルが一部残ってしまうので、主導で削除したほうがいいかもしれません。

原因はここに記載されていました https://github.com/conda/conda/issues/7203

python がWindows環境だと、node.jsの生成する長いパスを処理できない的なことが書かれています。

対策としては、バージョン9.9を指定してインストール。

conda install -c conda-forge nodejs==9.9

これでうまく、、、あれ、またエラーになってしまった、、、。

node.jsが使えると、JupyterLabで、Variant inspectorの、アドオンを使うことができるのですが、一旦諦めようと思います。

と思いきや、続いて、Anaconda Navigatorからnode.jsを検索して出てきた、ver.8.9.3をインストールすると、、、やはりダメでした。

なにか手はありそうですが、一旦、あきらめます。

RaspberryPiと Pythonスクレイピング前下調べ結果

Raspberrypiでスクレイピングを仕様としたときの記録。

パーサはlxmlを使う

Pythonでhtmlを取り扱う際は、「htmllib(標準モジュール)」や 「Beautiful Soup」 といったモジュールがあります。 しかし、高速で柔軟な操作がしたい場合は、 「lxml」がいい

Gentleちゃれんじ Tips -lxmlでhtmlを処理する-

lxmlはC言語で書かれているので高速だそうです。

Xpathで要素を指定する

Xpathは、CSSSelectorより高度な表現が可能

十章第一回 XPathとは — JavaScript初級者から中級者になろう — uhyohyo.net

どうせ覚えるなら、ということで。

Javascript使用ページを取得するにはSelenium+PhantomJS

JavascriptでのSingle Page Application(SPA)になっていると、htmlを取得するだけだと、コンテンツが読み込まれない。

その際、Selenium+PhantomJS でブラウザをもした読み込みを行う。

PhantomJSはWebkitベースのブラウザ。画面描画がないので通常のブラウザよりは高速、軽量。

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

この教科書から引用。

ここで1つ問題。seleniumは pipでraspberrypiでもインストールできたが、PhantomJSはインストールできない・・・。

(試しに pip install phantomjs と打ってみたら、RasPiが固まって数時間放置したら、何も動かなくなってしまった・・・)

上記参考書には、Ubuntu向けに公式のbitbucketからVer.1.9.8のバイナリを持ってくる方法が書いてあるけど、同じ流れですすめても、RaspberryPiでは動かなかった。

入力

 $ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
 $ tar xvf phantomjs-1.9.8-linux-x86_64.tar.bz2
 $ sudo cp phantomjs-1.9.8-linux-x86_64/bin/phantomjs /usr/local/bin/
 $ sudo apt-get install -y libfontconfig1 fonts-migmix

出力

-bash: /usr/local/bin/phantomjs: cannot execute binary file: 実行形式エラー

RaspberryPiはARM CPUだからかな。ということで、ARM向けのバイナリを持っている人を探した結果、このページを発見。

RaspberryPiにPhantomJSをインストールする - uepon日々の備忘録

このページの、以下の部分をもらった。

$ git clone https://github.com/mecrazy/phantomjs-binaries.git
$ chmod 755 phantomjs-2.1.1-linux-armhf

上の教科書に沿って初めに作ったX86_64向けのバイナリを削除して、

$ sudo rm /usr/local/bin/phantomjs

gitから持ってきたバイナリをコピーして(バイナリをリンクじゃなくてそのままコピーするのは、問題ないんだろうか。)

$ sudo cp phantomjs-binaries/bin/phantomjs-2.1.1-linux-armhf /usr/local/bin/

名前を変えたら、

$ sudo mv /usr/local/bin/phantomjs-2.1.1-linux-armhf /usr/local/bin/phantomjs
$ phantomjs --version
2.1.1

正しくバージョンを返してくれるようになった。

教科書とはバージョンは違うが、今後、問題なく動くだろうか。

もう眠いので今日は寝ます。。

※正解がわかるまで微妙に不要なコマンドをいろいろ打っているので、この流れだけで成功するかは不確実です。

’’’(トリプルクォート)はコメント以外でも複数行の入力に使える

タイトル通りのことを、今更ながら知りました。

例えばこの本のP71にある

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

この部分、1行目の「'‘'」の意味と、2行目の「…」の意味がわからずしばし検索をしましたが、 (この記号たちは検索がちょっと大変でした)

>>> html = lxml.html.fromstring('''
... <html>
... <head><title>八百屋オンライン</title></head>
... <body>
... <h1 id="main">今日のくだもの</h1>
... <ul>
... <li>りんご</li>
... <li class="featured">みかん</li>
... <li>ぶどう</li>
... </ul>
... </body>
... </html>''')

「'‘'」はコメント以外でも、とにかく2行以上にわたって、改行もエスケープせずに文字列を書きたいときに使う物で、

「…」はインタプリタ内で複数行にわたる入力が必要になったときに出てくる物

ということがわかりました。

以上です。

ファイル名、ファイル内テキスト一括置換スクリプト 2 (Python2/3対応, その他改善版)

過去に作ったテキスト置換スクリプトを、手直ししました。

過去スクリプト:ファイル名とファイル内テキストを置換するpythonスクリプト - Make it possible with Python.

photo by Mathias L.

このスクリプトは、ファイル名、拡張子の指定条件に一致する複数のテキストファイルのファイル名と内容の一括置換してくれます。

今回改善した点は以下です。

  • Python3 / 2.7 両対応(のはず)
  • 文字コードをShift-JISから、Windows用Shift-JISコードであるcp932に変更
  • 出力ファイルが元ファイルと混在しないよう、リネームファイルは新規フォルダ内に生成
  • 出力ファイル上書き防止のため、同一ファイル名作成時にはエラーと、ファイル名先頭にduplicatedを付与
  • .iniファイルに条件、置換文字列を記載(exeにして配布時のため)

いままでは特定の条件で出力ファイルが空になったりして、人には勧められませんでしたが、これで実用になるのではと思います。

コードはこちら。

続きを読む

エラー AttributeError: 'module' object has no attribute 'html' に対処

相変わらず月に1回くらい、長期記憶を鍛えるかのように一進一退のpythonのコーディングに取り組んでいます。

これからGWくらいで、某アカウントアグリゲーションサービスのスクレイピングをしようとしています。 Webサービスにするとセキュリティが問題になるので、ローカルだけで動かすツールにします。

このサイトを参考に基礎から勉強中。うまく行くのでしょうか。

qiita.com

今日の引っかかりはこんなエラー。

AttributeError: 'module' object has no attribute 'html'

なんか・・・1年くらい前に見た記憶がありますが、原因と対処を思い出せません。

エラー発生時のコードはこれ。

import lxml

a= open(r"201502.htm", "r", encoding='utf-8')

target_html = a.read()

root = lxml.html.fromstring(target_html)

調べた結果、原因は下記URLにあるように、importの記載ミスでした。

python import statement semantics - Stack Overflow

lxmlは moduleだけど、html のattributeは読み込み忘れていたので、moduleに存在しないといわれているエラーでした。

1行目を

import lxml.html

に直して、module内に.htmlを取り込む(?)ことで解決。

すっきり。

BaaSサービスのParse.com の使い方と、危険性について

photo by Abllo™

BaaSとParse.comの利点について

Webサービスを作る場合、BaaSサービスを使わないと初心者では敷居が高すぎると聞いたので、BaaSについて調べてみた。 BaaSというのは、バックエンド処理を提供してくれるサービスで、例えば有名なParse.comというサービスだと、以下のことができるらしい。

Parse.com で出来ること レコードの参照・登録・更新 ユーザ管理(スケルトンが用意されていて、Facebook・Twitter 連携も) 奥の手として、各APIにJavaScriptでサーバサイド処理を書ける(Cloud code) プッシュ通知 Parse.com を Backbone.js のバックエンドとして使ってみる - akiyoko blog

Parse.comを実際に使ってみた

便利そうなので実際に使ってみた。このサイトのチュートリアルが非常にわかりやすかった。

Parse.com を Backbone.js のバックエンドとして使ってみる - akiyoko blog

昨日できたてのVirtualBox環境で、実際に公式チュートリアルのTodoリストを動作させてみた。

BaaSがどうというより、初めてテキスト以外の動的サービスがVirtualBox上で動いてちょっと嬉しかった。

1点だけ詰まったのは、httpサーバーのURLについて。 SSHでcdを使ってディレクトリを移動すると、"python -m CGIHTTPServer" でhttpサーバーを動かす(?)際に、現在のディレクトリが最上位URLになるんですね。

Parse.comにはセキュリティリスクがある

その一方で、こんな指摘を見つけた。

超簡単にできるぐらいなので、そのままだとかなり危険。データベースをネットにさらしているようなもの。MySQLとかPostgreSQLとかOracleの入口をID、パスワードを公開してネットにさらしてる感じと、まずは理解する。 例) 保存されたユーザーのメールアドレスを誰でも閲覧可能 データの一覧は取り放題 誰でもデータも消せちゃう クライアント側からSQLで言うところの、SELECT, UPDATE, INSERT, DELETE 呼べてるんだから、当然。

Parse.com を導入する際に気を付けること:セキュリティの甘さについて - Qiita

これはちょっと怖い。正式サービス前にセキュリティ有識者へのヒアリングと対策が必須な様子。 何もかもうまくいくほど、成熟はしていない様子。

それにしても、BaaSで一番有名なParse.comがこのレベルだと、BaaSを使ったサービスには危険なものも含まれているんじゃないかと気になる。