Quantcast
Channel: ぷちのいず
Viewing all 87 articles
Browse latest View live

RaspberryPiで据置型MP3プレーヤを作る(妄想)

$
0
0

ずっと前に買って以来、全く使われていなかった Raspberry Pi を使って MP3 プレーヤを作ってみようと妄想中。

きっかけは 日経Linux 2013年9月号 に載っていた、Raspberry Pi と 秋月電子USB DAC キットを使ったミュージックサーバの記事でした。

秋月の USBDAC は安いのに音がいいと好評らしく、これを使って家で使える MP3 プレーヤを作れないか考えてます。

妄想としてはこんな感じ。

mp3プレーヤの構想

  • 音楽はUSBメモリに入れる
  • 音楽はUSBDAC経由でアナログ出力する
  • USB のリモコン受光器も繋げておいて、赤外線リモコンで操作を行う
  • 再生曲などの表示はバックライト付きLCDか、OLEDで行う

常用できるものを作りたいので、とりあえず家電っぽく使えるのを目指したいと思います。
AirPlay とかもやってみたいけど、まずは欲張らずに基本機能を作ります。

表示部は LCD より OLED が使いたいな。緑色のOLEDは蛍光表示管みたいでかっこいいし。使うなら Strawberry Linuxグラフィック有機ELモジュール が良さそう。

赤外線リモコン部にはビットトレードワンの USB接続 赤外線リモコン キット を使う予定。
これはリモコン受信だけじゃなくて送信もできるスグレモノで、HID デバイスとして認識され、リモコン操作がキー入力として扱えるみたい。
USB PICを使ってて、ソースコードも公開されていて改造もできてしまうらしい。太っ腹。
うまく作れば、このモジュールだけ別電源にしておいて、電源ON/OFF制御をさせることもできちゃうかも。

 

久しぶりにビットトレードワン覗いたら電流帰還式ポータブルヘッドフォンアンプなんて発売してたんだ・・・。据置型の方すごく評判いいみたいで気になってたんだよな。くそー欲しいじゃないか。


電流帰還式ヘッドフォンアンプAD00031を作ってみた

$
0
0

先日の投稿でMP3プレーヤを作ろうと書いたものの、調査のついでに見つけた電流帰還式ヘッドフォンアンプ AD00031

ポタアンにも興味があったので衝動買いしてしまいました。

買ってみた&作ってみた

140422-ad00031
AD00031 を衝動買い

 さてはやる気持ちを抑えつつ内容物を確認します。

140422-ad00031-2開梱したところ

カラー印刷の説明書はとても丁寧に手順が書いてあります。部品点数もそれほど多くなく、狭い部分もないので作るのは比較的簡単だと思います。

ケースに当たらないように部品の足を短めに心がけたくらいでしょうか。

で、1時間もかからないくらいで完成。

140422-ad00031-3完成したところ(OPアンプ未搭載)

ケースに入れるとこんなかんじです。

140422-ad00031-4

アルミケースとフロントマスクがかっこいいですね。キットとは言わなければわからないくらいの高級感です。

早速聴いてみた

早速 iPod touch とイヤホン(SHURE SE215) とヘッドホン(SONY MDR-XB600)を繋げて聴いてみました。

第一印象は・・・無音時のスーというホワイトノイズ(?)が多い、でした。ボリュームの大きさに関わらず一定のホワイトノイズが鳴っています。半田不良や部品の付け間違えがあるのではないかと思って見なおしてみたのですが、問題は見つからず・・・。

インピーダンス調整用の抵抗も SE215 の 20 Ωに合わせたあと、上下にある程度振ってみたのですがホワイトノイズについてはあまり変化がありませんでした。MDR-XB600 でも同様にホワイトノイズは気になるレベルでした。

こういうものなのか、キット作製時のミスなのかわからないのでなんとも言えませんが、値段が値段だけにちょっと残念でした。キットですが回路図が公開されていないので(見つけられてないだけ?)、試行錯誤することも難しいですし。(素人に試行錯誤で改善できるのかという疑念もありますが)

あとできるとしたらオペアンプの交換ですね。あとで秋葉原行った時にでも買ってきてみます。

他の方のブログや、Amazonのレビューを見るとオーディオマニアやプロの業界の人が高く評価されていたので、私のハンダ付けの腕が悪かったのかもしれません。

 

音については・・・ド素人の私にはあまり違いがわかりませんでした。正確には違いがあることはなんとか分かるのですが、どう違うのかよくわからないというか。

SE215MDR-XB600 もどちらも明確な音の変化は感じられず・・・というよりも聞き分けられるほどの耳を持っていないんでしょうね。きっと。

 

総合すると、オーディオ素人の私にとってはちょっと残念な結果になりました。曲間のホワイトノイズが気になってしまって、結局 iPod から直接イヤホン・ヘッドホンを繋げた方が私の好みのようです。

そういえば、昔にもポタアンが欲しくなってヨドバシで試聴機を聴きまくったことがあったのを思い出しました。その時も iPod のドックコネクタから Line Out を取り出すと音が良くなるとネットで読んで、ドックコネクタ接続可能なポタアンを片っ端から繋いで視聴したのですが、今ひとつ値段分の音質向上を感じることができず、諦めたのでした。

やっぱり、オーディオのディープな世界に、素人が安易に手を出すとヤケドしますね。いい勉強になりました。

AD00031のホワイトノイズをやっつける(その1)

$
0
0

個人的にはちょっとガッカリだった AD00031 ですが、1 万円も出したのでもう少し無駄あがきしてみることにしました。

一番のネックはホワイトノイズなので、これをどうにかできないか素人ながら試行錯誤してみたいと思います。

いろいろググって得た情報をもとに、まずは簡単なところから試してみます。

インピーダンス調整用の抵抗を変えてみる

どこかのサイトでインピーダンス調整用の抵抗を大きくするとホワイトノイズが減ると書かれていたので試してみました。

今までは調整値 ±2 位の上下を試しただけでしたが、一番変化があるであろう最小値(2.0Ω = 16Ωのヘッドホン用)と最大値 (8.2Ω = 66Ωのヘッドホン用) で聴き比べてみました。

音質の変化はやはりヘボ耳では感じ取れませんでしたが、音楽の音の大きさは違っていて、抵抗値が大きい方が若干音が小さかったです。音楽の音が小さくなるのと一緒にノイズも小さくなるようです。音楽が小さくなった分ボリュームをあげるので、相対的にノイズが小さく感じられるようでした。

考えてみれば、電流帰還をするための電流測定用の抵抗でしょうからスピーカーと直列に入っているんでしょうね。そりゃ抵抗値を大きくすれば音は小さくなりますね。

ただノイズが小さくなったとはいえ、付属の抵抗値の最大の 8.2Ω では気にならないレベルまで小さくなるわけではないです。普通にノイズが聞こえます。

ホワイトノイズ対策にアッテネータ(減衰器)をアンプとヘッドホンの間にはさむと良いと書いてあるサイトもありましたが、同じ理屈なのでしょうね。ただ高いアッテネータを使わないと周波数特性により音の傾向が変わってしまうようです。

出力に直列に入っている抵抗をむやみに大きくすると、電流帰還部分の定数も変更しないといけないでしょうし、ここをいじるのは素人にはちょっとハードルが高いです。

結果

  • 抵抗による音質の違いは分からなかった
  • 抵抗値を大きくするとホワイトノイズが減った
  • でもノイズは気になるレベル
  • 無闇に抵抗値を大きくすることは難しそう

電池を変えてみる

また、これもどこかのサイトで、電池によっても音が変わるといった事が書かれていたので、これも試してみました。

確かに内部抵抗の小さい電池なら信号の立ち上がりを早くような気もします。ただ、大電流を駆動するならまだしも、イヤホン/ヘッドホンを駆動するくらいの電流なら電池の内部抵抗なんて関係ないんじゃないのかなとも思います。電源ラインにコンデンサも入ってることですし。

試したのは以下の 3 種です。

結果は・・・私のヘボ耳では違いがわかりませんでした。

ボリュームも大きめにしてみたり、低音の多い曲、高音の多い曲も聞いてみたのですが、全く違いは感じられず。やっぱり電池では変わらないのでしょうかね。

今回は満タンで試したので、電池が減ってくると違いが出てくるとかはあるかもしれないです。

結果

  • 電池による音質の違いは分からなかった
  • 電池を変えてもホワイトノイズは減らなかった

 

インピーダンス調整用の抵抗は効果があったので最終手段としてはありですね。

手軽に変えられる部分は試したので、次回はもっとドラスティックな変更を加えてみたいと思います。

AD00031のホワイトノイズをやっつける(その2)

$
0
0

ど素人が片足突っ込んでやけどした AD00031 ですが、どうせなら両足突っ込んで身の程を知ってみようと思います。

オーディオ(アナログ回路)系は憧れながらもほとんど手を出したことが無いので、勉強も兼ねてということで。

もう手軽に変えられる所は試したので、部品の交換とか派手にいじってみます。

と、その前に回路図がないといじりようが無いので基板から回路図を起こしてみました。黒いレジストは見た目は非常にカッコイイんですが、緑レジストと違いパターンを見えなくしてしまうので追うのに苦労しました。ハンダ付け後なので部品で隠れて見えない所はテスターで確認しました。

詳細を載せるのはまずいかもしれないので、ざっくりした回路としてはこんな感じでした。

AD00031の回路の概要AD00031の回路図の概要

オペアンプの出力に4つののトランジスタで構成された SEPP(Single Ended Push Pull) バッファがついていて、SEPP の出力を負帰還する形の構成になっていました。ここまでは普通のアンプのようです。

AD00031 ではさらに SEPP の出力に対し直列に電流測定用の抵抗がついていて、それを正帰還(?)しているようです。

私にはこの正帰還部分の動作がまだ理解できてません(^^; 雰囲気的には、OUTに流れる電流が小さいと測定用抵抗での電圧降下が下がる→OUT の電圧が上がる→正帰還されてアンプのゲインを上げる→流れる電流を増やすという感じでフィードバックされる・・・のかな?

抵抗を変えてみる

まず抵抗を変えてみます。抵抗にも音響用のものがあり、「抵抗 音質」などで検索すると色々なページが表示されます。

一般的な抵抗は巻線抵抗なので、ものによってコイル成分が変わり、確かに音に影響しそうな感じはします。

また、ホワイトノイズの原因は熱雑音であるらしく、熱雑音は抵抗などの部品から発生するとも書かれているサイトがありました。そういった意味では、抵抗を変えるとホワイトノイズの具合も変わるかもしれません。

変更するのは、回路図に出てくる抵抗と、SEPP 内にある2本の抵抗です。結果的に LED 点灯用の抵抗以外は全て置き換える形になります。

これを差し替えるわけですが、試行錯誤できるようにしたいと思ってこんな感じにしちゃいました。

抵抗をソケット化!!抵抗を全てソケット化!!!

地味に大変でした。はじめは IC ソケットを付けてしまえばいいじゃんと思っていましたが、微妙に抵抗の間隔が 2.54mm より広くてソケットが刺さらず、結局秋月で買った丸ピンICソケットを 1 つ 1 つ切り離してハンダ付けという気の遠くなる作業を行いました。

ただ、このおかげで回路を変更しやすくなったのでやってよかったです。

右側の抵抗は千石電商で買ったタクマンのオーディオ用金属皮膜抵抗 REY (青緑色のやつ)です。1kΩ だけ品切れだったのでオーディオ用カーボン抵抗 REX (1本だけピンク色のやつ) にしました。

素人が聞いても判別しやすいように、モノラル入力にして(下側のジャンパーみたいな抵抗でやってます)、右だけ REY/REX に置き換えて聞いてみました。

結果は・・・全くわかりません(泣)

イヤホンを左右入れ替えてみたり、シャッフルしてブラインドテストしても全く違いが分からず。私の耳には抵抗の違いを感じることができませんでした。

結果

  • 普通のカーボン抵抗と音響用抵抗の違いは分からなかった
  • 抵抗を変えてもホワイトノイズは減らなかった

 

SEPP部のコンデンサを変えてみる

続いて、オーディオ系で改造といえばまっ先に出てくるコンデンサです。

AD00031 では売り文句の通り、出力に直列にコンデンサが入っていません。コンデンサは電源ラインと SEPP のバイアス生成部に使われているだけです。なので、一般的な回路よりコンデンサによる音の変化は少ないかもしれません。

SEPP 部ではちょっと変わった使われ方をしています。素人なのでこういう回路は見たことがないのですが、よくあるのでしょうか。

SEPP部の回路図SEPP部の回路図

正直このコンデンサがどういう役割をしているのかわかりません。
電源投入直後のポップノイズ軽減・・・なのかな? 電源投入直後に後段のトランジスタを確実に OFF にするため・・・とか?

基本的には前段のトランジスタの VBE が変わらない限り、一定の電圧がかかっているだけなので信号の上下(音質の変化)には影響しないのではないかと思いますが、モノは試しです。

これも右側だけ先に交換して違いを聞いてみました。

SEPP部のコンデンサを FineGold に変更右側の SEPP 部のコンデンサを FineGold (金色のコンデンサ)に変更

使用したのはルビコンの Fine Gold です。金色のボディがカッコイイですね。
音響用のコンデンサとしては、とびきりいい訳ではないけど音響用としては安いのでコスパ的によい、という感じの位置づけのようです。

結果は・・・全く違いが分からず(苦笑)

やはりここのコンデンサはあまり音質に影響しないんですかねぇ。

結果

  • SEPP部のコンデンサの違いによる音の変化は感じられなかった
  • ホワイトノイズも変化なし

長くなってきたのでまた次回。

AD00031のホワイトノイズをやっつける(その3)

$
0
0

前回前々回に引き続き、AD00031 の部品を取っ替え引っ替えしてノイズや音質が変わるか調べてみます。

電源ラインのコンデンサを変えてみる

前回のSEPP部のコンデンサに続いて、電源ラインのコンデンサです。

AC 電源の機器なら、リップルの除去効果や、スイッチングノイズの除去効果が変わるため、コンデンサを変えると電源ノイズが減って信号のノイズが減る・・・というのは分かりますが・・・リップルやスイッチングノイズが皆無の電池ですからねぇ。

電池を変えて違いが分からなかったのに、電源コンデンサの違いがわかると思えませんが、試してみます。

電源ラインのコンデンサは左右別にすることはできないのですが、いちいちハンダ付けしていてはどんな音か忘れてしまうので、ソケット式にして交換しながら聞いてみました。

電源コンデンサも交換可能に電源コンデンサも交換可能に

さすがにソケットのままではケースに収まらないので確認が終わったら戻します。

交換したコンデンサもルビコンの Fine Gold です。

結果は・・・当然違いはわかりません

というか、コンデンサ無しとの違いすらわかりませんでした。コンデンサいらねーんじゃねーの?(ぉぃ

いやいや、さすがに電源ラインには 100uF くらいは入れておきたいので、しっかりハンダ付けしておきました。金色のやつを。
中身の違いはわかりませんが、カッコイイので。(開き直り)

結果

  • 電池駆動のためか、電源ラインのコンデンサによる音の違いは分からなかった
  • ホワイトノイズも変化なし

 

オペアンプを変えてみる

いよいよ本丸です。AD00031 はオペアンプを差し替えることができるようになっています。
オペアンプといえば、アンプの心臓部ですね。ここを変えればさすがに音は変わるでしょ。
オペアンプの高いものは 1個数千円もするものもあり、音質の変化に期待がもてます。

という事で、秋月で互換性のあるオペアンプをいくつか買ってきました。
元々付属だったオペアンプNJM4580DD (秋月で50円)含めると 5 種類になりました。

揃えたオペアンプ左からLME49860NA、LM358N、LM4562NA、MUSES8920、NJM4580DD

LM385NはHTC製やJRC製などいくつかのメーカが出しているようなのでメーカまで書いています。
オペアンプの足を痛めないように、また簡単に交換できるように8 PIN のソケットに挿して、このソケットごと基板のソケットに挿します。

早速聞き比べてみたところ・・・お、違いがありそう (^^)

一番安い LM358N はさすがに1個20円の安物だけあって、ホワイトノイズが明らかに増えました。感覚的には 2 倍くらいかな? 曲中でもノイズが分かるくらいです。こりゃダメだ。

ホワイトノイズについては他のオペアンプはほぼ同じでした。
ホワイトノイズはオペアンプから出てるのかなと思っていたので、変化がなかったのは残念でした。

音質については・・・違いわからず
えぇ。そうです。わかりませんでした。残念。

「ちょっと音の輪郭がぼやけてるかな」とか、「音像がハッキリしたヌケのいい音です」とか書きたかったんですが、さっぱり違いがわかりませんでした。

えー。そんなにおれの耳ってしょぼいの?
自分には違いが分かると無意識で信じてたんですが、全く分からないようです。

結果

  • LM358N (フェアチャイルド製) はホワイトノイズが多く、AD00031には向かない
  • 他のオペアンプはどれも違いが分からなかった

 

結論

前回前々回、今回で色々部品を変えてみた結論をまとめてみます。

  • 私の耳では抵抗、コンデンサ、オペアンプの質をあげることでの音質向上は聞き分けられない
  • オペアンプはLM358N だけはホワイトノイズが明らかに増えた
  • LM358N以外のオペアンプ差は聞き分けられない
  • インピーダンス調整用の抵抗を大きくするとホワイトノイズが減る傾向にある

結果的にホワイトノイズに効き目がありそうなのはインピーダンス調整用抵抗の変更だけでした。うーん。

で、完成した(?)、違いがわからないのに無駄にお金をかけた基板がこちら。

無駄な努力の結果
見た目はかなり高級感を増しました。いかにも良い音がしそうです。私にはわかりませんが。

次は回路をいじってみます。もうここまで来たら恐いものはないのでダメもとで。

AD00031のホワイトノイズをやっつける(その4)

$
0
0

すでにこのシリーズ4回目。 また AD00031 のホワイトノイズを減らすべく試行錯誤していきます。

前回までの検証で色々と部品を変更しても自分の耳では聞き分けられないという、ガッカリな耳の持ち主だったという結果でしたが、今回は部品の変更ではなく、回路をいじってみます。

ということでこの回路です。

AD00031の回路の概要

とりあえずよくわからない電流帰還部を取っ払ってみます。上側のループの抵抗です。基板上ではR4とR6です。

取り外して聞いてみると・・・。お、ホワイトノイズ減ってる
若干は残るもののほとんど気にならないレベルまでホワイトノイズが減りました。

そうなると電流測定用の抵抗(回路図一番右の抵抗)もいらないので外してジャンパーでショートさせます。

こんな感じ。

普通の電圧アンプ化AD00031 を電圧アンプ化(笑)

5つ並んでいる抵抗の真ん中を取り外し、上部のインピーダンス調整用の抵抗を抵抗の足でショートさせています。

おー。こりゃいいや。曲間のホワイトノイズが気にならない!!

でも電流帰還をしないとこのアンプの意味が・・・。

もともと AD00031 通して聴くのと iPod touch 直で聴くのとであまり違いがわからなかったので、これでもいいのかなぁ。いや、ますます iPod 直で良くなってしまうような・・・。

それにしても電流帰還するとなぜノイズが増えるんでしょうね。そこが分かれば解決の道も見いだせそうなんですが。

正帰還してるから?? ノイズとか誤差が正帰還されて増幅されちゃうのかなぁ。

とりあえず、しばらく電圧アンプ化した AD00031 で聞いてみようと思います。

AD00031のネジを手回し式に交換

$
0
0

ここのところ AD00031 のネタが続いていますが、今回も AD00031 です。

秋葉原にオペアンプなどのパーツを買いに行ったついでに AD00031 の前面パネル用のネジを買ってきました。

いろいろなサイトで不評な前面パネルのネジですが、これを手回し式に変更します。電池交換するためにドライバーが必要になるためです。

ちなみに、電池交換の際にボリュームツマミの六角ネジは緩める必要はありません。ツマミがついたまま基板を引き出せます。

ということで秋葉原の西川電子部品(西川ネジ)で買ってきました。

ローレットネジ2種割付き段付きローレットねじ2種 (綾目、平目)

こういう手で回せるようのネジをローレットねじというそうです。
ツマミの滑り止めの加工の種類により綾目(菱型模様のもの)、平目(縦線模様のもの)の2種類があり、更にドライバーで回せるようなスリットがあるものは「割付き」というそうです。また、つまみ部分とネジ部分の間に段があるものは「段付き」というそうです。

ということで、M3x6mm の綾目、平目の割付き段付きローレットネジを2つづつ買ってきました。

計4つで税込 192 円でした。安いですね。

実はローレットネジですが、これで2個目なんです。最初に10mm の割なしのローレットネジを買ったのですが、2つの失敗がありました。

1つ目は、長すぎたこと。
AD00031 にもともと付いているネジは12mm くらいあるのですが、タッピングネジということもあり、ネジ山間が広いので少ない回転数で取り付けられます。しかし、このネジはネジ山が狭いので 10mm あるといくら回しても進まなくて大変でした。

2つ目は、割なしだったこと。
ケースのかみ合わせの部分をネジ止めする関係で、AD00031 を落としたり衝撃を加えるとネジが固く締まってしまい、手では回せなくなります。なのでそういう時でもドライバーで回せる割付きにしました。まぁペンチで回ばいいんですけどね。

ということで、6mm くらいの割付きのローレットネジをおすすめします。

装着するとこんな感じになります。

ローレットねじに交換ローレットネジに交換しました

平目より綾目のほうがカッコよかったので綾目にしました。

うーん、カッコイイ!! 高級感が増した気がします (^^)

ただ見て分かるとおり、AUDIO OUT とネジの距離が近いので、プラグ部分が大きいヘッドホンだと干渉してしまうかもしれません。ご注意ください。

ZeroPlus LAP-C の EEPROM を Linux から書き換える

$
0
0

なんの脈略もなくロジアナの改造ネタです。

ZEROPLUS 社製のロジアナ LAP-C の型番を書き換えるために Windows を起動したものの Windows7 では書き換え用のドライバがインストールできず、悔しくて Linux 用の書き換えツールを探したが、ちょっと使いにくかったので改造して github で公開したぜという話です。

 

だいぶ前に買って以来、部屋に技術者っぽい雰囲気を漂わせるためのオブジェとして大活躍だったロジアナの LAP-C16032 ですが、最近使いたい用途が出てきたので引っ張り出してきました。

それでふと、LAP-C16032 の内蔵 EEPROM を書き換えることで上位機種相当に改造できることを思い出して、本来の用途そっちのけでまず改造をすることにしました。

情報元は Illegal function call さんの以下のエントリです。

# Illegal function call とは何て懐かしい響き・・・

早速EEPROMを書き換えようとしたのですが、Windows 7 では上記エントリで配布されている libusb のドライバがインストールできませんでした。

Windows XP 機なんて持ってないし、XP mode インストールするのも面倒なので、Linux で書き換えることにしました。

上記エントリに

『今回はGL660USBを解析した外人さんがいるが、
元はLinux用だったり、ちょっと扱いが面倒なので、こんなソフトを作ってみた。』

って書いてあったので、元になる Linux のコードがあるんだろうと探してみたところ・・・見つけました。

zerominus という Linux から LAP-C を叩いて計測データを取り出そうというプロジェクトのようです。

そのプロジェクトの中に  zeroprog という EEPROM を読み書きするツールがあります。きっとこれが元ネタだと思います。

早速ビルドして使ってみました。

一応使えるのは使えるのですが、すんなりビルドできなかったり、バックアップはできるのにリストアができなかったり、バックアップファイルのエンディアンの問題でダンプが読みにくかったりと、いろいろ使いにくかったのでチャチャッと改良してみました。改造したコードは github で公開しています。

ビルド方法などは上記ベージの README.md に書いてあるので割愛します。

リトルエンディアンに変更しているのでバックアップファイルを hexdump すると、文字列が普通に読めます。

オリジナル zeroprog

00000010 5a 1b 52 45 50 4f 55 4c 20 53 65 54 68 63 6f 6e |Z.REPOUL SeThcon|
00000020 6f 6c 79 67 43 20 2c 4f 4c 2e 44 54 ff ff ff ff |olygC ,OL.DT....|

改造後 zeroprog

00000010 1b 5a 45 52 4f 50 4c 55 53 20 54 65 63 68 6e 6f |.ZEROPLUS Techno|
00000020 6c 6f 67 79 20 43 4f 2c 2e 4c 54 44 ff ff ff ff |logy CO,.LTD....|

また、一番重要な restore コマンド (-r) を実装したのでいくらでも失敗ができます。

–help で resutore コマンドが出てきていたのでてっきり使えると思って安心して書き換えていたのですが、いざ restore コマンドを使ったら

// not yet implemented, sorry

なんて冷たくあしらわれてしまったので、仕方なく実装しました。

で、結果的に Product ID と Model string を変更することで LAP-C16128 として問題なく動作させることができましたとさ。めでたしめでたし。


Raspberry Pi 2 やっと届いた

$
0
0

先々週に発売されて話題の Raspberry Pi 2。 早速買ってしまいました。

Raspberry Pi 2Raspberry Pi2 買っちゃいました

発売されてすぐの2/3に注文したんですが、在庫切れで届いたのは今日でした。

早くも秋月千石電商Amazonでも販売されています。RSコンポーネンツに注文するより小売店で買ったほうが早く入手できたようです。

旧機種と新機種旧機種のRaspbery Pi model B(左) と新機種の Radpberry Pi 2 model B(右)

こう見ると違結構違いますが、基板の形状やコネクタ位置は旧機種の model B+ と同じだそうです。

CPU は ARM11 (ARMv6 アーキテクチャ) から Cortex-A7 x 4 core (ARMv7 アーキテクチャ) と大幅変更になり、RAM も 1GB に増量されたそうです。

ARMv7 アーキテクチャであれば Android も(実用的かどうかはわかりませんが)動くでしょうし、いろいろ遊びの幅が広がりそうです。

個人的には Cortex-A7, A15 などで搭載された Virtualization Extention (VE:仮想化支援) が気になっていたのでこれでいろいろと遊んでみようと思います。(実は Cortex-A7 搭載の Cubieboard2 を持っていたのですが半年近く死蔵したまま・・)

最近の Linux kernel の kvm は VE に対応しているそうなので、kvm も動かしてみたいですし。

ただ、まだデータシート類は公開されていないようですので、本格的にいじれるのはもうちょっと先ですかね。

とりあえずは買った報告だけ。

サイト復旧完了?

$
0
0

ずっとブログを更新してませんでしたが、実はここ3ヶ月位 wordpress の不調でログインが全くできない状態でした。特に更新するネタがあったわけではないんですが・・・。

ようやく時間が取れたので WordPress のインストールからやり直して、なんとか復旧が完了(?)しました。

記事もコメントも一応復元できているはず・・・。

Downloadの一覧をどうすれば表示できるかすっかり覚えてなくて、一から調べなおしてしまいました。
category-スラッグ名.php でカテゴリ別の表示ができたんですね。
プラグインで実現していると思ってたどり着くのにかなり時間がかかってしまいました。

もしかすると一部リンクが前とは違うかもしれません。ちょいちょい確認して直していきます。

独自ドメインが使えるブログに移行しようかなぁ。
こういうの結構手間なんですよね・・・。
いっそ独自ドメイン辞めちゃおうかなぁ。あんまり更新してないしなぁ。

https化してみた

$
0
0

サイト復旧がてら、https 化をしてみました。
最近では https に対応してないサイトに入力フォームがあると、それだけで危険なサイトのように表示するブラウザがあるんですよね。世知辛い世の中になったなぁ。

個人ブログ程度でSSL証明書を取得するのは、お金かかるし、無料だと更新が面倒とか色々とハードル高いんですよね。

ただありがたいことに、このブログを運用している coreserver では今年の8月に独自ドメインでの無料SSLを提供してくれるようになりました。更新も自動でやってくれる!

2つ目のページと見ると Let’s Encrypt の証明書のようです。

早速試そうとしたんですが、1つ面倒な点が。それは、「サイト管理」画面上のMainサイト (~/public_html 直下に置いているサイト) ではSSL設定ができないということ。

Subサイトにするには一回Mainサイトを削除しなくてはいけないんですが、ファイルが消えそうで怖くて怖くて・・・。
一応バックアップとって試しましたが、サイト設定を消してもファイルが削除されることはありませんでした。

Subサイトとして新たに petit-noise.net を作成すると、public_html/petit-noise.net/ 以下が公開ディレクトリになるので、ファイルを移動させれば完了です。

ただ、ファイルを移動させるときは ssh でログインして作業したほうが良いです。コントロールパネルのWebのファイルマネージャ (net-ftp)で行うと、やたら時間がかかってタウムアウトして移動が中途半端な状態で終わります。
mv コマンドなんて同一ファイルシステム内なら一瞬のはずなのに、1つ1つご丁寧にディレクトリ作って移動してディレクトリ削除してって実行しているみたい。おかげで中途半端な状態から移動させるのが大変でした。

SSL設定直後に https:// でアクセスすると、証明書が違うとエラーが表示されますが、一日後にアクセスしたら正しく petit-noise.net の証明書になっていました。

あとは、以下のページを参考に、画像ファイルなどのリンクを https に変更しました。

search regexというプラグインで、記事内の http://petit-noise.net を一括で https://petit-noise.net に置き換えました。

これをやらないと、Firefoxでは「この接続は安全ではありません」「このサイトには安全ではないコンテンツ(画像など)が含まれています」と余計に不安を煽るようなメッセージが表示されてしまいます。
この文言なんとかならないものか・・。
http だろうが https だろうが悪意があるサイトなら安全ではない画像が置けるでしょ。httpsなら安全っていう短絡的な考えが最も危ないような気がするけど。

ともかく、petit-noise.net も世の中の流れに乗って https 化できました。
しばらくサイトメンテはお腹いっぱいです。

ファイルを消さずにUbuntu18.04をクリーンインストール

$
0
0

Ubuntu 18.04 LTS がリリースされて時間が経ち、そろそろこなれた頃かなと思い Ubuntu 18.04 に環境を移すことにしました。

今使っている Ubuntu が 16.04 LTS と古いので、今回はクリーンインストールすることにします。ただ、いちいちファイルをリストアするのが面倒なので、インストールされているパーテーションを消さずに(ファイルを残したまま)、新規インストールしてみます。こういう柔軟な運用ができるのもLinuxのいいところの1つです。

※操作を間違えると全部削除されますので面倒ですがバックアップは取っておきましょう
※少しだけ上級者向けなので、手順を読んで意味がわからない人はやめておきましょう
※現環境を消さずにインストールするので、空き容量には十分注意しましょう

1. USBメモリの作成

DVDを焼くのが面倒なので、USBメモリからインストールします。

Ubuntu Japanese Team のサイトから Ubuntu 18.04LTS の日本語 Remix ISOイメージをダウンロードしてUSBメモリに書き込みます。Ubuntuを使っている人であれば、メニューから「ブータブルUSBの作成」でUbuntuのISOイメージをUSBメモリに書き込むことができます。

2. インストールイメージを起動

1.で作成した USB メモリから起動させます。起動させたら「Try ubuntu without install」を選び、Live USBとしてUbuntuを起動させます。インストール前に操作が必要なためです。

ちょっと話はそれますが、私の Vaio Pro11 では Live 環境起動後、やたら重くカクカク状態でした。top コマンドで確認すると、snapd というプロセスが CPU を 100% 専有してました。

ググってみたら

$ sudo systemctl stop snapd

を実行すれば良いとの記事を見つけ、ひとまず普通に使えるようになりました。

3. 既存環境を退避する

インストール済みのLinuxパーテーションを維持したまま新規にUbuntuをインストールするのですが、同名のディレクトリは上書きや消去されてしまうので、ルートに適当なディレクトリを作成し、そこに全てのディレクトリを移動して退避します。

/usr, /home などを /backup/usr, /backup/home と言うように1階層下に移動させます。

以下の例では /backup というディレクトリに現在の rootfs をすべて移動させています。

私の環境では /dev/sda7 が rootfs なので、適宜読み替えてください。

ubuntu@ubuntu:~$ sudo mount /dev/sda7 /mnt/
ubuntu@ubuntu:~$ cd /mnt/
ubuntu@ubuntu:/mnt$ ls
bin    dev   initrd.img      lib64       mnt   root  snap  tmp  vmlinuz
boot   etc   initrd.img.old  lost+found  opt   run   srv   usr  vmlinuz.old
cdrom  home  lib             media       proc  sbin  sys   var
↑インストール済みの / に相当します
ubuntu@ubuntu:/mnt$ sudo mkdir backup
ubuntu@ubuntu:/mnt$ sudo mv * backup/
mv: 'backup' を自分自身のサブディレクトリ 'backup/backup' に移動できません
ubuntu@ubuntu:/mnt$

ものぐさして mv * backup/ と実行したため backup 自身を移動できないとエラーが出ていますが、想定通りです。気持ち悪い場合は1つ1つ移動させてください。

確認してみると、今までの rootfs には backup/ というディレクトリのみになり、元々あったディレクトリは全て backup/ 以下に移動されています。

ubuntu@ubuntu:/mnt$ ls -l
合計 4
drwxr-xr-x 24 root root 4096 7月 1 12:44 backup
ubuntu@ubuntu:/mnt$ ls backup/
bin    dev   initrd.img      lib64       mnt   root  snap  tmp  vmlinuz
boot   etc   initrd.img.old  lost+found  opt   run   srv   usr  vmlinuz.old
cdrom  home  lib             media       proc  sbin  sys   var
ubuntu@ubuntu:/mnt$

一度アンマウントして準備完了です。

ubuntu@ubuntu:/mnt$ cd
ubuntu@ubuntu:~$ sudo umount /mnt
ubuntu@ubuntu:~$

4. 既存環境を残したままインストール

デスクトップにあるインストーラのアイコンをダブルクリックしてインストーラを起動します。

インストールオプションを選んでいきます。

↑今まで「最小インストール」ってありましたっけ? 結構いらないアプリもあるので、今回は最小インストールを選んでみます。「通常インストール」でも問題ないです。

↑ここが今回のポイントです。必ず「それ以外」を選んでください。他の設定だとファイルが消える可能性があります。

↑パーテーションの設定画面になるので、既存環境が入っているパーテーション(今回はsda7)のマウントポイントを / にします。間違っても「パーテーションの初期化」にチェックを入れてはいけません!

↑他は特に設定不要です。スワップは勝手に認識して設定してくれます。マウントポイントに他の設定をしている場合はここで設定しておきます。

「インストール」を押下すると

↑のようなちょっと怖いメッセージが表示されますが、構わず「続ける」を押すとインストールが始まります。

しばらくするとインストールが完了し、再起動すると・・・

はい。Ubuntu 18.04 がインストールできました。

最小構成でインストールしたのでアプリは数えるほどしかインストールされていません。

5. 前の環境からファイルを移す

端末から /backup を確認すると、インストール前の環境がまるごと残っていることがわかります。

ubuntu@ubuntu:~$ ls /backup/
bin    dev   initrd.img      lib64       mnt   root  snap  tmp  vmlinuz
boot   etc   initrd.img.old  lost+found  opt   run   srv   usr  vmlinuz.old
cdrom  home  lib             media       proc  sbin  sys   var

あとはここから少しずつ現環境にファイルを移していけばOKです。

大胆にホームディレクトリをまるごと戻しても、大体は動くと思いますが、わかる範囲で少しづつ戻していったほうが良いと思います。

$ mv /backup/home/xxxx/.thunerbird ~/

のように .thunderbird を戻せば、メール環境もそのまま復元できます。

Ubuntu 18.04 でハイバネーション

$
0
0

前回の記事で Ubutntu 16.04 から 18.04 へ環境を移行させたと書きましたが、なぜ 16.04 を使い続けたかというと、17.04 や 17.10 ではなぜかハイバネーションがうまく動かなかったからです。普段ノートPCを使っているのでサスペンドさせておけばよいのですが、思いのほかサスペンドがバッテリを消耗するので、大体ハイバネーションで電源を切っています。私が使っている Vaio Pro11 は SSD なのでハイバネーションによる保存/復帰も高速なので重宝しています。

Ubuntu 18.04 でのハイバネーションの設定方法をメモがてら残しておきます。

1. swapの設定

ハイバネーションするには swap の容量が物理メモリの2倍程度必要です。

容量が少ない場合は gparted などを使って拡張してください。

2. initramfs 内の設定を確認

クリーンインストールした環境であれば、initramfs 内の以下のファイルに swap パーテーションの UUID が設定されています。私の場合は以下のようにすでに設定されていました。

$ cat /etc/initramfs-tools/conf.d/resume
RESUME=UUID=a512140c-c031-4c8c-956d-169143008d70

ファイルがなかったり、UUIDが違っていた場合は変更しておきます。

ファイルを変更した場合は、忘れずに initramfs イメージを更新しておきます。

$ sudo update-initramfs -u -k all

3. grub の設定を変更

/etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT 変数の最後に swap パーテーションのUUIDを指定します。赤字が追加部分です。

$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=a512140c-c031-4c8c-956d-169143008d70"

ここで注意なのは、initramfs の resume ファイルに設定したものと同じ文字列を設定する必要があります。同じパーテーションだからといって、resume=/dev/sdaX のように違う指定の方法をすると動作しません。initramfs の方で UUID で指定したら、grub の設定も UUID で指定してください。(私はここでハマりました)

変更したら、こちらもupdate-grubを実行して変更を反映させます。

$ sudo update-grub

ここまで設定できたら一旦再起動します。

4. ハイバネーションのテスト

再起動後に、以下のコマンドを実行してテストをします

$ sudo systemctl hibernate

しばらくすると電源が切れるので、再度電源を入れてUbuntuを起動させます。

うまく行けば上記コマンド実行時の状況に戻っているはずです。

Ubuntu 16.04 以前では、無線LANが使えなくなったり、フリーズしたり色々と問題が発生したのですが、Ubuntu 18.04 と私の Vaio Pro11 では特に追加設定なくハイバネーションができました。

5. メニューの追加

デフォルトではメニューにハイバネーションボタンが無いため、コマンドからしかハイバネーションができません。これでは不便なので、メニューを追加します。

$ sudo vi /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

以下の内容をコピペします。

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

続いて、gnome shell の extention 「Hibernate Status Button」をインストールします。

右上のスイッチを「ON」にすればインストール完了です。

右上端のメニューを開くと

いままでは↑こんな感じだったメニューに

↑こんな感じでハイバネーションボタンが追加されます。

これでいつでも簡単にハイバネーションさせることができるようになります。

お疲れ様でした。

Xubuntuに乗り換えました

$
0
0

Ubuntu 18.04 を入れたばっかりですが、Xubuntu に乗り換えました。

以前から Unity が肌に合わなくて、Ubuntu を入れてもすぐに gnome-fallback/flashback を入れて Gnome2 相当で使っていたのですが、Unity から Gnome3 に変わったのでしばらく使ってみたところ、Unity の頃の Ubuntu に比べて格段に使いやすくなりましたね。

デフォルトの Alt + Tab のアプリケーション切り替えが変態仕様だったり、細かいところは気に入らないところもありますが、カスタマイズすれば違和感ない使い勝手になってくれるので気に入りました。

ただ・・・。
Gnome3 の UI は JavaScript で動作する Web ベースに近いとは聞いていたのですが、やはりメモリを非常に食うようで・・・。

起動直後の時点で1.3GBも使ってる!!!!
アプレットを色々動かしているとはいえ、この消費量はちょっと・・・。
メモリが潤沢ならまだしも、私の Vaio は 4GB しかメモリが載っていないので、1/3 が無駄(?)に OS に食われるのはいただけません。

ということで、Ubuntuの軽量フレーバーを色々と試してみました。

今回試したのは、Lubuntu、Ubuntu MATE、Xubuntu の 3 つです。軽量のデスクトップ環境は他にもあるのですが、別にウインドウマネージャマニアではないので、環境構築に手間を取られたくなかったのが一番の理由です。

まず最初に試したのは Lubuntu。ウィンドウマネージャに LXDE を使っています。
LXDE は Windows のような自然な使い勝手ながら、軽量であることで有名です。
CPUパワーもメモリもあまり必要としないため、一昔前の PC でもサクサク動きます。

使用メモリ量は・・・。

350MB!! Ubuntu(Gnome3)の1/4ですね。素晴らしい。

続いて、Ubuntu MATE。「メイト」ではなく「マテ」と読みます。
こちらは Gnome3 に違和感を感じた人たちが Gnome2 環境を維持するために、Gnome からフォークしたという経緯で作られた環境のため、Gnome2 がベースになっており、gnome-fallback/flashback 環境とほぼ同じです。
Unity になる前の昔の Ubuntu に慣れている人なら違和感なく使えます。

メモリ使用量は約500MB。LXDE に比べると多いですが、Gnome3 に比べれば半分以下です。

最後は Xubuntu。ウインドウマネージャに xfce を使っています。LXDEと同様、軽量なのが特徴です。

メモリ使用量は・・・。

430MB。LXDE と MATE の中間くらいですね。

MATEは使ったことがあったので、Lubuntu と Xubuntu をしばらく使ってみたのですが、Xubuntu を使うことにしました。

Lubuntu は非常に軽量なのですが、良くも悪くも軽量デスクトップで、一昔前のデスクトップ環境という感じでした。

Xubuntu も Lubuntu と同じくらい軽快な操作感ながらも、コンポジションが使えたり、今風のDockを備えていたりと、軽量ながらもワクワク感がありました。

Ubuntu MATE は Gnome2 に使い慣れているため非常に使いやすく、多機能で安心感があります。LXDE, Xfce に比べると少しだけ重いですが、Gnome3 に比べれば非常に軽快です。

MATE は選択肢として悪くないのですが、今回はワクワク感をとって Xubuntu (xfce) にしました。

本格的に使い込んでみようと思います。

ちなみに、メモリが豊富なデスクトップは Ubuntu (Gnome3) で行こうと思います。
一昔前とは違い、常用できそうと思えるくらい素の Ubuntu は使いやすくなったと思います。

アカウントアグリゲーション作ってみようかな

$
0
0

Python と Selenium を使うと比較的簡単にスクレイピングができるということを知ったので、アカウントアグリゲーションのアプリを作ってみようと思い立ちました。

Pythonは初心者だし、Selenium なんて使ったことなかったけど、世の中の流れについていくためにも、勉強がてら作ってみようかなと。

アカウントアグリゲーションの説明はWikipediaに任せるとして、なぜこんなものを作りたいのかというと、私はスタンドアロン型のアカウントアグリゲーション・アプリを使いたいのですが、現時点で主要なアカウントアグリゲーションサービス/アプリはすべてサーバ型(クラウド型)なのです。

もともとこういうサービスを知ったのは、クラウドどころかWeb2.0なんて言葉すらなかった15年くらい前に Yahoo! プレミアムのユーザに無料で提供されていた「MoneyLook with Yahoo!」でした。当時の MoneyLook はスタンドアロンアプリだったので、パスワードも、資産状況もすべてPC内に格納されていて、アプリの開発会社にこれらの情報を提供する必要がなかったんです。当時、サーバのリソースは貴重だったので、ユーザのPCのCPUとHDDを使ってサービスを提供するのは当然の流れだったのだと思います。

一方、現在はというと個人向け(会計用ではなく家計簿的な使い方の)サービスとしてはMoney Forward, Zaim, Moneytree, MoneyLook あたりが有名どころですが、どれもこれもクラウド型です。昔使っていた MoneyLook もスタンドアロン型からクラウド型に変わってしまいました。

クラウド型にもメリットがあることはわかります。PCでもスマホでもどこでも口座情報にアクセスできますし、バージョンアップもサーバサイドで完結するのでユーザが意識する必要がありません。逆にスタンドアロンアプリの場合、PCから情報を収集されるのでは?といった疑念もあるでしょう。

しかし、私にはログイン情報を第三者に預けなければならないのと、口座情報(残高や取引内容など)を第三者に開示することの気持ち悪さが払拭できず、どうにもクラウド型のサービスを使う気になれませんでした。
お金を勝手に引き出したり、振り込んだりできないとはいえ、銀行以外の第三者に通帳を常に開示するんですよ? なんか嫌じゃないですか? 悪意のある社員によって総資産のランク別の個人名簿が流出する可能性だってありますし。

ということで、オレオレ money forward を作ってみたいと思います。

よくよく考えると、アカウントアグリゲーションアプリこそ、オープンソースでしかもスクリプト言語が向いていると思うんですよね。スクリプト言語だから、パスワードを別のサーバに送ったりといった悪意のあるコードがあってもすぐバレちゃうし。オープンソースでもコンパイルする言語の場合、ソースとバイナリが一致しているかは自分でビルドしない限りわからないですからね。

ざっと要求/願望を挙げてみます。

  • 対象
    • まずは自分だけが使えるレベルをめざし、普通のユーザは対象としない
      → 最終的には普通の人にも使ってもらえるといいけど、セキュリティとかマニュアルとか考えると、趣味の開発でそこに労力を割くのは難しい。
  •  言語
    • コードの透明性を確保したい (悪意のあるコードを混入しにくく)
      →スクリプト言語が良さそう
    • 開発の敷居を下げたい (私以外の人でも作りやすくしたい)
      → スクレイピング部は独自言語ではなく、汎用的な実装が良い
  • 取得情報
    • 預金種別
      • 普通預金 [MUST]
      • 定期預金 [MUST]
      • 外貨預金 [WANT]
      • 投資信託 [MUST]
      • FX [WANT]
      • 株式 [WANT]
    • 取引明細
      • 普通預金の明細は[MUST]
      • 投資信託、FXなど日々評価額が変わるものについては
        • スクレイピング時の時価が取得できる [MUST]
        • 過去の時価が取得できる [WANT]
  • 暗号化/セキュリティ
    • ログイン情報、取得したデータは暗号化して保存 [WANT]
      →ひとまずセキュリティは後回し。当面は平文で格納
  • ソフト構成
    • スクレイピングとデータ表示はアプリを分離 [MUST]
      → スクレイピングだけ定期実行とかしたい
    • データ表示アプリはスタンドアロン [MUST]
      →ブラウザをUIに使いたいが、容易に外部サーバにアクセスできるため、不正アクセスの疑念を払拭しにくい?
      →ただ、ブラウザを使うと後述のスマホアプリは作りやすいかも?
      →スタンドアロンアプリの場合はスクリプト言語が好ましい
      →表示だけならネイティブアプリでもいいか?
    • データ表示のみのスマホアプリも将来的には作りたい [WANT]
      →スクレイピングしたデータを Dropbox に置いておくと、スマホでも表示ができるとか
      →かなり後回しになりそう
      →Androidだけ
      →iPhoneもMacも持ってないから作れない

とりあえずこんなイメージですかね。要求は壮大ですが、実際どこまで実現できるものやら・・。

まずは、スクレイピングして CSV 形式で出力するくらいのシンプルなものから作ってみたいと思います。


Python + Selenium でスクレイピングしてみる

$
0
0

Python と Selenium でスクレイピングのお勉強です。

Selenium は外部プログラムから Web ブラウザを操作することができる仕組みで、元々は Web アプリケーションのテスト自動化のためのツールだったようです。クリック、キー操作を外部アプリから操作できるので、技術的にはWebブラウザでできる全てのことを自動化するが可能です。

Selenium を使える言語としては Java, ruby, C#, Python, JavaScript のバインディングがあるのですが、Web を探してみるとスクレイピングの使い方としては Python + Selenium の情報量が圧倒的に多いため、Python で使ってみたいと思います。一般的には、Python + Selenium(ブラウザ制御) + Beautiful Soup(HTMLパーサ) の構成が多いようです。

概要をサラッと知るには Web よりも本のほうが良さそうなので、以下の書籍を買ってみました。

Pythonによるスクレイピング&機械学習 開発テクニックみんなのPython です。みんなのPythonは 3 年くらい前に買ったものの読んでなかったやつなので、1つ前の第 3 版ですが、現在は新版の第4版が出ているようです。

本を参考に環境を構築します。

Python は pip というパッケージマネージャがあり、簡単にパッケージのインストールやアップデートができるようです。グローバルにインストールしなくても、ユーザローカルにライブラリをインストールできるのが便利です。

ということで、まずは python3 と pip をインストールします。その後、pip を使って selenium をインストールします。Ubuntu 18.04 には deb パッケージとしても python3-selenium というパッケージが用意されているのですが、最新を使いたいので pip でインストールしました。

$ sudo apt-get install python3 python3-pip
$ pip3 install selenium

続いて、WebDriver の準備です。外部から制御できるような細工の入ったブラウザ本体のことです。Selenium の download のページにリンクがまとまっています。Firefox, Chrome などのオープンソースなものだけでなく、Internet Exproler, Safari, Opera のようなプロプライエタリなブラウザの webdriver もあるようです。Selenium が Web 自動テストのデファクトスタンダードになっているということでしょう。

WebDriver の中で異色なのが PhantomJS です。これはヘッドレス(画面のない)ブラウザで、ウインドウを表示せずにスクレイピングが可能です。開発中は画面のあるブラウザの方がデバッグしやすそうですが、安定したあとの実運用ではヘッドレスのほうが余計なウインドウが表示されないので便利そうです。リソースが許せばレンタルサーバ上でスクレイピングというのも可能かもしれません。メモリ, CPU をガッツリ使うので怒られそうですが。

環境が整ったので、本を見ながら見様見真似で作ってみたのが以下のコードです。
三井住友銀行に自動でログインするスクリプトです。コード中の USRID1, USRID2, PASSWORD を合わせればひとまず動作すると思います。

WebDriver には Firefox を使っています。geckodriver にパスが通っていれば、executable_pathの指定はいらないようです。

実行すると Firefox が立ち上がり、三井住友銀行のページを開いて、自動で契約者番号とパスワードを入力し、「ログイン」ボタンを押下します。見ていてちょっと面白いです。

#!/usr/bin/python3

from time import sleep
from selenium import webdriver

URL = "https://direct.smbc.co.jp/aib/aibgsjsw5001.jsp"
USRID1 = "12345"
USRID2 = "67890"
PASSWORD = "1111"

browser = webdriver.Firefox(executable_path="path/to/geckodriver")
#browser = webdriver.Chrome()
#browser = webdriver.PhantomJS()

# open URL
browser.get(URL)

# enter
browser.find_element_by_id("USRID1").send_keys(USRID1)
browser.find_element_by_id("USRID2").send_keys(USRID2)

# wait for input USRID2
sleep(1)

# Password
browser.find_element_by_id("PASSWORD").send_keys(PASSWORD)
sleep(1)

# Click login
browser.find_element_by_name("bLogon.y").click();

#browser.quit()

sleep() でタイミング合わせているのが汚いですね。
待ち合わせがいまいちよくわかっていないので、時間でタイミングをとってしまいましたが、おいおいキレイにしていきたいと思います。

最後に browser.quit() を実行するとブラウザが閉じるのですが、開いたままのほうが Firefox の開発ツール(インスペクタなど)を使って入力フォームの id や name を確認できるので便利です。

こんな感じで作っていきたいと思います。

みんなのPython 第4版
  • 価格   ¥ 2,916
  • メーカー柴田 淳
  • 販売者 Amazon.co.jp

 

Python + selenium で銀行の明細が取得できた

$
0
0

間が空いてしまいましたが、三井住友銀行の取引履歴を取得できるようになりました。

最初は真面目にHTMLをパースしようかと思ったのですが、三井住友銀行では取引履歴を CSV ファイルとして取得する機能があったので、CSV を取得して解析することで手抜きしています。

selenium の webdriver をより便利に使えるように、 webdriver クラスを継承した Browser というクラスを用意しました。webdriver に関してよく使うようなユーティティ関数を追加していこうと思ってます。

クラス図的にはこんな感じ?

仕事ではクラス図をほとんど書かないので、書けるようになるように練習がてらクラス図も書いていこうと思います。途中で投げ出すかもしれませんが。

苦労したのは CSV のダウンロードです。webdriver で CSV をクリックすると、ダウンロードのダイアログが表示されてしまいます。ダイアログの制御は webdriver では難しいらしく、色々調べた結果、webdriver を使わずに requests でダウンロードする方法が見つかりました。

ログイン情報を引き継ぐため、webdriver の cookie をすべて読み出して、requests に設定するのがポイントのようです。ただこの方法のままではうまく動かず、User-Agentも設定してあげる必要がありました。requests での User-Agent の設定は以下の記事を参考にしました。

また、前のブログでは sleep で待ち合わせしていたのですが、キー入力後に値が反映されるまで待つ sync_send_keys() という関数を用意しました。

ソースコードを以下に貼っておきます。main.py の USRID1, USRID2, PASSWORD を書き換えれば動作するはずです。

実行すると、Firefoxが起動してログインし、残高表示ページに遷移して CSV ファイルをダウンロードして表示します。

まずは明細情報を取得することができました。小さな一歩ですが少しだけ進むことができました。Python と Selenium を使うと簡単にスクレイピングできてしまうんですね。実際使ってみてコーディング量の少なさに驚きました。Python 初心者なのでここまでたどり着くのにも非常に時間がかかってしまいましたが、自由に使えるようになったらかなり便利そうです。

#!/usr/bin/python3

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException

from browser import Browser
import csv

URL = "https://direct.smbc.co.jp/aib/aibgsjsw5001.jsp"
USRID1 = "12345"
USRID2 = "67890"
PASSWORD = "1111"

browser = Browser(webdriver.Firefox())
#browser = webdriver.Chrome()
#browser = webdriver.PhantomJS()
browser.implicitly_wait(3)

# open URL
browser.get(URL)

# enter
browser.sync_send_keys((By.ID, "USRID1"), USRID1)
browser.sync_send_keys((By.ID, "USRID2"), USRID2)

# Password
browser.sync_send_keys((By.ID, "PASSWORD"), PASSWORD)

# Click login
browser.find_element_by_name("bLogon.y").click();

# 期限切れなら次へをクリック
try:
    es = browser.find_elements_by_name("imgNext.y")
except NoSuchElementException:
    print("no entry")
else:
    es[0].click()

# ログイン後画面

# 明細照会をクリック
browser.find_element_by_css_selector(".detailsBtn > a").click()

# csv形式でダウンロード
resp = browser.download(browser.find_element_by_id("DownloadCSV")
                        .get_attribute("href"))

# 先頭行を抜いて csv.reader に渡す
rows = csv.reader(resp.decode("shift_jis").split("\r\n")[1:])

for row in rows:
    if len(row) != 5:
        continue
    print(row)

browser.quit()
# coding: utf-8

import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class Browser(object):
    def __init__(self, webdriver):
        self.driver = webdriver

    # webdriver のメソッドはそのまま透過
    def __getattr__(self, name):
        if hasattr(self.driver, name):
            return getattr(self.driver, name)
        raise AttributeError

    def download(self, url):
        ua = {'User-agent': self.execute_script("return navigator.userAgent")}
        #print(ua)

        session = requests.Session()
        cookies = self.get_cookies()

        for cookie in cookies:
            session.cookies.set(cookie['name'], cookie['value'])
            #print(cookie['name'], cookie['value'])

        #print(url)
        response = session.get(url, headers = ua)
        #print(response.status_code)
        #print(response.content)
        #print(response.headers)
        return response.content

    def sync_send_keys(self, locator, key):
        # wait for element
        WebDriverWait(self, 120).until(
            EC.element_to_be_clickable(locator)
        )
        # send keys
        self.find_element(locator[0], locator[1]).send_keys(key)
        # wait for update
        WebDriverWait(self, 30).until(
            EC.text_to_be_present_in_element_value(locator, key)
        )

accagg開発日記: クラス分けとCSV形式での保存

$
0
0

開発しているとリポジトリ名とか何かとプロジェクトに名前が必要になるので、Account Aggregator を縮めて accagg と名付けました。

前回まででとりあえず三井住友銀行の取引明細を取得することができたので、データを正規化してCSV形式に保存することを考えます。セキュリティを考えると平文のCSV形式なんて論外なのですが、そこは後々実装します。試す場合は個人の責任でお願いします。

前回は main にすべての処理を書いていたので、今後のことを考えてクラス分けしてみます。作ってみたクラス図は以下です。

正直クラス図が合ってるかわかりません(汗 なんとなくやりたいことが伝わればいいかな。

スクレイピングする処理は銀行ごとに異なるため、abstract.Aggregator という抽象クラスを作って、それを継承した smbc.Aggregator で三井住友銀行用の処理を実装するようにしてみました。将来的には Factory パターン? Factory Methodパターン? みたいなもので、どの銀行用の Aggregator でも統一された方法でインスタンスを生成するようにできるといいなと思ってます。(デザインパターンも勉強中・・)

もう1つ、PassBookクラスを作りました。明細のデータを保存するクラスです。今の所は CSV 形式で保存する実装にしますが、将来的にはセキュアな実装にしようと思います。PassBookは 1 種類の口座の明細を記録します。例えば、普通預金と定期預金のように別の種類の明細は、それぞれPassBookを持つイメージです。なので 1 つの銀行口座に対して複数のPassBookが関連します。本当はこの辺も多重度などを使ってクラス図で表せると良いのですけどね。ドメインモデルも作ればこの辺スッキリするのかなぁ。

最初は Aggregator が PassBook に直接データを渡すような構成を考えていたのですが、Aggregator はユーザが自由に作成できるようにするつもりなので、悪意のある Aggregator が PassBook のデータを抜き出せないように、間に main を挟んで直接の関係しない形にしました。Aggregator はネットアクセスしても怪しまれないクラスなので、余計なデータにアクセスできないほうが良さそうだからです。

PassBookItem はクラスの形をしていますが、Python の dictionary で実装します。Pythonの dictionary をクラス図で表すにはどうすればいいんでしょうか・・。

ちなみに Aggregator の run() 関数の戻り値は

{
  'ordinary': #普通預金
  [
    {'date': datetime.date(2018,8,20), 'deposit': 1234, 'balance': 1234, 'desc': '入金'},
    {'date': datetime.date(2018,8,28), 'deposit': -1234, 'balance': 0, 'desc': '払い戻し'},
  ]
  'time-deposit': #定期預金
  [
    {'date': datetime.date(2018,8,20), 'deposit': 1234, 'balance': 1234, 'desc': '入金'},
    {'date': datetime.date(2018,8,28), 'deposit': -1234, 'balance': 0, 'desc': '払い戻し'},  
  ]
}

のような形式を考えていて、1行1行が PassBookItem を意味してるつもりです。これはクラス図上どう表したらいいものか・・。PassBookItemの配列を持つ PassBookItemList を作って、その配列を返すべきか?

こんな感じ? でも、これだと同じ name を持つ PassBookItemList も許容してしまうし。どうするんだろう。

ひとまずクラス図の正当性は置いておいて、作成したコードを置いておきます。クラス分けしてパッケージも作ってファイルが増えてきたのでアーカイブしました。そのうち github にリポジトリを置いて公開したいけど、まだまだそんなレベルではないので、とりあえずここで公開します。

実行ファイルは main.py から accagg.py に名前を変更しました。相変わらず ID とパスワードは直書きなので書き換えてください。うまく動作すれば、SMBC-ordinary.csv というファイルが作られるはずです。

accagg開発日記: パスワード管理とFactoryの導入

$
0
0

ちょっと間が空いてしまいましたが、ほそぼそと開発中です。

今まではパスワードをコードに直書きだったのですが、外部ファイルから読み出すようにしました。そのために PasswordManager というクラスを追加しました。PasswordManager.get(“アカウント名”) でパスワードなどの情報を Dictionary で返します。

また、Aggregatorクラスを生成するFactoryパターンを見様見まねで導入してみました。Factory.aggregator(“BANKID”) で、IDに応じた Aggregator を生成します。BANKIDはそのまま python のモジュール名にして BANKID.Aggregator のインスタンスを生成するようにしたので、Aggregator を追加しても Factory クラスに手を入れる必要はなく、簡単に Aggregator を追加できるようにしてみました。

例によって練習中のクラス図です。

今までは PlantUML を使っていたのですが、配置が思うように行かないのと、関連端名(ロール)が書けないので、astah* community で書いてみました。astah* community は 9/26 で配布終了なので astah* community を使いたい人は早めにダウンロードしておいたほうがいいですよ。

ちょっと脱線しますが、練習のためUMLを書いてみているのですが、無料で使いやすいツールってないですね。astah* community も公開停止ですし。ブラウザ上で描く Web 版のドローツールはいくつかあるようなのですが、Wifiがない環境で書くこともあるので、できればスタンドアロンアプリがいいんですよね。有料でも買いきりで数千円なら出してもいいんですけど、astah* professional は \28,000 円なので、個人ではとても買う気になれません。

PlantUMLのソースを改造して自分好みにするしかないか・・・。テキストからUMLが生成できるので git で差分管理もしやすいので、コンセプトはすごくいいんですけどね。ちょっと複雑な図を書こうとすると、なかなか思い通りに書けなくて・・。。

 

さて、クラス図の中身ですが、今までは class method と instance method みたいに場合分けで書いていましたが、class method は static 関数だということに気づいて下線表記にしました。また、Python の dictionary (連想配列) は勝手に <<dictionary>> というステレオタイプをつけて表現することにしました。完全に我流ですが、なんとなく伝わるかなと思います。

また、今回 PassworkManager クラスを追加しました(図中の左下)。Pythonの標準ライブラリの ConfigParser を使って実装していて、いわゆる INI ファイル形式でパスワードなどのアカウント情報を記述します。

accagg.dat というファイル名で以下のような INI ファイル形式の口座情報を記載しておきます。

[SMBC]
BANKID=smbc
USRID1=01234
USRID2=56789
PASSWORD=1111

[ ]の中はアカウント名(任意)としていて、BANKID が Aggregator の ID、USRID1, 2, PASSWORD がログイン情報です。これでパスワードをソース中に埋め込まなくて済むようになりました。平文なのは変わっていないので、相変わらず扱いには注意が必要です。

今回は githubリポジトリを作って公開しました。今後はここにコミットしていこうと思います。

周りの環境は揃ってきたので、次は対応銀行を増やしていこうかなと思います。

accagg開発日記: 銀行追加と投資信託

$
0
0

ブログの更新は久しぶりですが、githubのリポジトリへのコミットはたまにしていまして、現在以下の銀行に対応するようになりました。

  • 三井住友銀行
  • イオン銀行
  • SBIネット銀行
  • 新生銀行

ちょっとずつ増えています。csvなので excel で見れるのですが、そろそろ専用ビューワーが欲しくなってきました。こっちも開発始めようかな・・。

今後の追加予定としては、以下の銀行を考えています。

  • ゆうちょ銀行
  • ソニー銀行
  • 中央労働金庫 (ろうきん)
  • Welthnavi
  • THEO

今回、新生銀行で投資信託の情報も取れるようにしてみたのですが、過去の変動を見たいと考えると今までの円預金用のデータ構造では対応が難しくなってきました。

今までは

日付, 入出金額(円), 残高(円), メモ

といったフォーマットだったのですが、投資信託や外貨預金では、保有している投資信託/外貨は円ではないため、保有数と基準価額/レートを分けて考える必要があります。また、投資信託であれば、購入金額と評価額を比較して損得の差額も見たいですし、円預金より情報量を増やす必要があります。

この辺はいずれデータフォーマットを変更して対応していく必要がありそうです。具体的には、今までの明細情報を円単位ではなく口数という形にして、もう一つ別に対円のレートの情報を保持する形になると思います。

明細

日付, 入出金口数, 残高(口数), メモ

レート情報

日付, レート(円/口数)

この辺は真面目に考えないといけないので、とりあえず今は対応銀行を増やして、ビューワーを作るところに注力したいと思います。私がほしいのは、とりあえず円での資産管理なので。

新生銀行での投資信託情報ですが、口座番号とパスワードのみで取得できる情報が現在の評価額のみで、購入履歴や口数などの詳細は取得できなかったため、ひとまず取得した時点の評価額のみを取得するようにしています。

セキュリティカード(乱数表)を全てデータとして与えれば、投資信託の購入履歴などの詳細も取得できるのですが、余計な権限も増えてしまうため、このくらいが程よいのかなとも思っています。購入時の金額が取得できない(=騰落額が取得できない)のは痛いですが・・。

Viewing all 87 articles
Browse latest View live