paloma blog

NWエンジニアやってます。技術の備忘など。Pythonもちょっと。タイトルは好きなカクテルから。

python製英英辞書"pyvoc"がいい感じ

我々エンジニアは英語のマニュアルを読む場面が多々ありますが、私なんか翻訳ツールに頼ってしまいます。
とは言っても全く読めないわけではなく、わからない単語が数個出てきたのでついでに文ごと翻訳かけるって言うやり方です。

そんな折、ostechnixでpyvocなるツールを見つけました。
いわゆる英英辞典です。

www.ostechnix.com

helpを調べる"pydoc"じゃないですよ、"pyvoc"です。
cli辞書&ボキャブラリビルドツールとありますね。

非ネイティブ英語スピーカーの学習に使えるようなツールのようです。

オックスフォードの辞書APIを使用しているようです。

インストール

年末に買った持ち運びに便利なノートPC(Windows10 Pro)にインストールしてみます。
このPCにはWSLもインストール済みですが、気軽に使えるようwindows側にインストールします。

pythonは3.7.2をインストール済み。
powershellから実行します。

PS C:\Users\masashi> python --version
Python 3.7.2

インストールはpipで一発。
windowsだとpipモジュールを呼び出して実行します。

PS C:\Users\masashi> python -m pip install pyvoc
Collecting pyvoc
  Downloading https://files.pythonhosted.org/packages/7c/34/15b2e3bce4d04d8e41dffe563f441330bff9bb526e25e45e337482826639/pyvoc-1.1.0-py3-none-any.whl

()

Successfully installed colorama-0.4.1 pyvoc-1.1.0 termcolor-1.1.0

OK。

さっそく"python"でも引いてみます。
初回はAPI Keyのセッティングが走ります。

PS C:\Users\masashi> pyvoc python
 -Creating necessary config files
 -getting api keys. please handle with care!
 \

python
Noun:            large heavy-bodied non-venomous snake occurring throughout Old World tropics
example:         None

品詞と例を表示してくれるのがいいですね。
Nounは名詞です。
"python"だと例はないようです。

"古くから熱帯地方に生息する非毒性の大型の蛇"とでも訳せますかね…?
違ってたら恥ずかしいです。

プログラミング言語としての役は入って無い様ですね。

意味も英語で表示されるので、調べていくうちに言い回しの勉強も出来そうです。
再帰的に調べていったら収集つかなくなりそうですね。

いくつか単語を調べましょう。
好きなバイク関係でも。

PS C:\Users\masashi> pyvoc motircycle
 \
No definition found. Please check the spelling!!
PS C:\Users\masashi> pyvoc motorcycle
 |

motorcycle
Noun:            two-wheeled vehicle that is powered by motor and has no pedals
example:         None

PS C:\Users\masashi> pyvoc vehicle
 \

vehicle
Noun:            thing used for transporting people or goods
example:         the vehicle was sent skidding across the road

PS C:\Users\masashi>
PS C:\Users\masashi> pyvoc bike
 |

bike
Noun:            bicycle or motorcycle
example:         I'm going by bike

Verb:            ride bicycle or motorcycle
example:         Danny bikes to the park and back every day

いいですね。しかもコマンドなんで早いし、サクッと調べられます。
"Verb”は動詞です。

ボキャブラリーグループ

どういう括りかわかりませんが、ボキャブラリーグループというのがあって単語をグルーピングしてあるみたいです。

-aオプションで自分でも辞書を追加できるみたいですが、このグループの内容がよくわかっていません。

ホームディレクトリにはデフォルトでそれっぽいファイルが作成されています。

PS C:\Users\masashi> ls C:\Users\masashi\.pyvoc\


    ディレクトリ: C:\Users\masashi\.pyvoc


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/01/22     23:23              2 all_words.json
-a----       2019/01/22     23:23              9 defaultgroups.json
-a----       2019/01/22     23:23          68023 group101.json
-a----       2019/01/22     23:23          66113 group102.json
-a----       2019/01/22     23:23          60768 group103.json
-a----       2019/01/22     23:23              2 group51.json
-a----       2019/01/22     23:23          47059 options.json
-a----       2019/01/22     23:23             72 pyvoc.config
-a----       2019/01/22     23:23              2 usergroups.json

改定

グループを指定して-rオプションで内容を改定?できるんですかね。
この辺はいじってませんがEnterを押すと単語がどんどん出てきます

PS C:\Users\masashi> pyvoc 101 -r
 |

 Press <enter> for next. q<enter> to exit

balk           a roughly squared timber beam
1. >

connecting     joining or linking things together
2. >

ennui          feeling of listlessness and dissatisfaction arising from lack of occupation or excitement
3. >

avenge         inflict harm in return for
4. >

vex            angry; annoyed
5. >

motivation     a reason or reasons for acting or behaving in a particular way
6. >

クイズ

グループ指定でーqオプションで4択クイズもできます。

途中でやめちゃいましたが、10問クイズが出ます。

PS C:\Users\masashi> pyvoc 101 -q 10
 |
                Starting Quiz

1 point for every correct answer. q<enter> to exit


emend
[1] make corrections and revisions to (a text)
[2] a written character that represents a syllable
[3] a person who is proficient
[4] joint in legs of animals, equivalent to knee in humans
1.>
enter a valid integer[1, 2, 3, 4]. q<enter> to exit
1.> 1
correct answer

forlorn
[1] pitifully sad and abandoned or lonely
[2] recurring every seven years.
[3] archaic variant of wizened
[4] (of a person or action) showing dedication and diligence
2.> 2
wrong answer

impudent
[1] the action of suppressing something such as an activity or publication
[2] give or make a long, high-pitched complaining cry or sound
[3] not showing due respect for another person; impertinent
[4] archaic variant of wizened
3.>

早くて楽しいツールです

コマンドでサクサク検索できるので、ストレスもなく楽しいツールです。
これを使って英語勉強ライフを進めていきたいと思います。

pyvocは初期開発らしくてこれからの機能追加が楽しみですね。

ちなみにオックスフォード辞書APIのサイトを見たら、フリーアカウントだと月3000リクエストの制約があるようですが、このツール経由だとどうなるんですかね。

developer.oxforddictionaries.com

使っていけばわかるか。

WordpressをLet's EncryptでHTTPS化した

世の中のWebサイトはHTTPSが主流となっていますので、自分のサイトもそろそろHTTPS化しようと思い実施しました。

認証局どうすっかなあと思っていたところDegital OceanにHow toがあったので、Let's Encryptにしました。
無料だし、助かります。

www.digitalocean.com

ちなみにサーバにログインするとこんなバナーも出ます。

If you'd like to use Let's Encrypt to create an SSL for this site,
please see: http://do.co/le-apache for instructions

ついにHTTPS化に手を出す

手順に沿って設定

masashi@wordpress-s-1vcpu-1gb-sgp1-01:~$ sudo add-apt-repository ppa:certbot/certbot
masashi@wordpress-s-1vcpu-1gb-sgp1-01:~$ sudo apt-get update
masashi@wordpress-s-1vcpu-1gb-sgp1-01:~$ sudo certbot --apache -d dayoff.palomablog.com

サーバネームも設定済みです。

masashi@wordpress-s-1vcpu-1gb-sgp1-01:~$ sudo find /etc/apache2/* -type f | xargs grep ServerName
/etc/apache2/sites-available/000-default.conf: ServerName dayoff.palomablog.com
/etc/apache2/sites-available/000-default.conf.dpkg-dist:   # The ServerName directive sets the request scheme, hostname and port that
/etc/apache2/sites-available/000-default.conf.dpkg-dist:   # redirection URLs. In the context of virtual hosts, the ServerName
/etc/apache2/sites-available/000-default.conf.dpkg-dist:   #ServerName www.example.com

これだけ。

  • CSR書いて、
  • 認証局から購入して、
  • サーバの証明書パス書いて…

といった作業は一切なく、コマンド数発で完了です。
認証の際にLet's Encryptのサーバからドメイン名の名前解決ができることが条件のようなので、ワイルドカードとかはできなさそうです。

  • palomablog.comの証明書も入れておこうと思たらエラーになった。
 masashi@wordpress-s-1vcpu-1gb-sgp1-01:~$ sudo certbot --apache -d palomablog.com -d dayoff.palomablog.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): smasa619@gmail.com
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

()

(Y)es/(N)o: y
Starting new HTTPS connection (1): supporters.eff.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for dayoff.palomablog.com
http-01 challenge for palomablog.com
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. palomablog.com (http-01): urn:ietf:params:acme:error:unknownHost :: The server could not resolve a domain name :: No valid IP addresses found for palomablog.com

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: palomablog.com
   Type:   unknownHost
   Detail: No valid IP addresses found for palomablog.com

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

Let's Encryptの有効期限は90日なので期限切れまでに更新が必要なのですが、これも大丈夫かな?

本来はcronに書いておくらしいのですが、これたたけばOKらしいです。

masashi@wordpress-s-1vcpu-1gb-sgp1-01:~$ sudo certbot renew --dry-run

インストールしたcertbotがsystemdタイマーを使ってrenewを1日2回実行してくれる、と書いてありますね。

不具合は期日が来てみないとわかりませんね。
(ログ見れば確認できそうですが別途)

httpからのリダイレクトをONにするかとあったので、有効にしておきました。
本当は不要となる80ポートは閉じるべきですが、影響が見切れず、壊れるのも嫌なので一旦ONにしています。

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://dayoff.palomablog.com

アクセスしてみる

アクセスしてみたところ、レイアウトが崩れてしまいました。 f:id:paloma69:20190110112022p:plain

サーバが参照するパスも変えないといけないのでそりゃそうですね。
URLをHTTPSに変更。 f:id:paloma69:20190110112244p:plain

画像周りのパスは特に変えなくても動きに問題ありませんでしたが、これはリダイレクトが効いているのかな? ちなみに画像拡大の処理が遅いのもこれが怪しいですね。

とりあえず無事にHTTPS化できてよかったです。
(と思ったら、ヘッダ画像が表示されていない…後で直します) f:id:paloma69:20190110113529p:plain

コマンド数ステップで簡単でした

個人の趣味サイトだからできることですが、Let's Encryptを使って無料かつ簡単に証明書取得&配置ができました。
今どきのVPSはこういう作業も自動化で便利にできるようになっていますが、
だからこそ仕組みを知っておかないとトラブル時に対処できなくなってしまいますね。

Wordpressのローカル開発環境をDuplicatorでつくる

あけましておめでとうございます。

昨年をいろいろ振り返りたい思いはありますが、

とりあえず本年一発目のエントリです。


昨年Degital oceanのVPSを契約しましてゲーム日記など細々書いています。

プレイ中の画像も載せているのですが、サイズが小さく拡大機能もないのでちょっとデザインを変更することにしました。

とは言っても本番一発勝負は怖いのでローカル開発環境を作ります。

Wordpressの複製はいろんな方法がありますが、Duplicatorというプラグインが簡単そうだったのでこれで複製することにしました。 design-plus1.com

まずはSnapshot取得

プラグイン入れるので万一の際戻せるようにSnapshot取っておきます。 手順に沿ってマシンをHalt。

www.digitalocean.com

Snapshotボタンをポチ。 f:id:paloma69:20190108233207j:plain

これで完了。(リストア試験ができていませんが、マシンが一機しかないのでそのときが来るまで放っておきます)

ローカル開発環境

帰省中に弄くっていた買ったばかりのノートPC上に作ります。

ローカル環境は * VMware Workstation * Turnkey Linux Wordpress OVA で一発で構築します。

VPSUbuntuでローカルがDebianというインフラ屋にあるまじき環境の作りですが、 プラグインの導入手順が確認できればよいので今回はこれでいいことにします。

Duplicator インストール 本番機

プラグインからDuplicatorをインストール。 インストール後、Create NewでArchiveを作成します。 f:id:paloma69:20190108234543p:plain

Archve作成後はinstaller.phpとzipファイルをダウンロードします。 f:id:paloma69:20190108234651p:plain

Duplicator インストール ローカル機

ローカルのWordpressにも同じくDuplicatorをインストールします。 インストール後は本番機からダウンロードしたinstaller.phpとzipファイルをローカルWordpressのパスに配置します。

配置後はブラウザからinstaller.phpにアクセス。 Duplicatorの画面が現れます。 f:id:paloma69:20190108234846p:plain フォームに沿って入力。

DBの接続もOKです。 f:id:paloma69:20190108234942j:plain

サイト名も変更できるので、間違えないように -local- という名前を足しておきます。 f:id:paloma69:20190108235110p:plain

あとは開発環境にログインしてみます。 f:id:paloma69:20190108235128p:plain

OK!クローンができました。 f:id:paloma69:20190108235159p:plain

ローカル環境をいじる

アクセス解析してみようとJetpackも入れたのですが、サーバのクローンだとマスターのサーバしか使えないみたいですね。 まあいいでしょう。

  • 画像サイズ変更

投稿時に画像を中サイズにしていましたが、小さすぎるので大サイズにしました。 HDフルサイズもできるのですが、拡大機能をつけるので大にしておきます。

  • 拡大機能追加

画像拡大もEasy Fancyboxというプラグインで簡単にできるそうです。

techacademy.jp

画像選択時に「メディアファイル」に設定すれば拡大できるようになります。
すごい仕組みですね。どうやっているんでしょうか。
JavaScriptがどうのってどこかに書いてあった気がしますが、時間があればソースを見てみようと思います。

というわけで本番機の画像周りを変更しました

ローカル環境の変更いじりらへんは割愛しまして、
そのまま同じ手順で本番機の変更を行いました。

GTAオンラインというゲームの物件サイト購入画面なんですが、拡大して見れるようになりました。
最近のゲームはゲーム内にもウェブがあったりと非常に凝ってます。

ちなみにこの時飛行機格納庫を購入しましたw f:id:paloma69:20190108235620p:plain

拡大できるようになるとブログの振り返りが楽しくなりますね。


長いこと直したかった画像周りをようやく直せました。
この時同時にHTTPS化もしたので、その辺は次回書きたいと思います。

ノートPCを買った -HP EliteBook Folio 1020 G1-

気づけば11月、12月は一回もエントリを書いていませんでした。
炎上気味の案件に巻き込まれてしまい、記事を書く気力がなく今年最終日となってしまいました。
まあ、ずっとGTAオンラインをやっていたというのもあるのですが…。

買ったもの

帰省や数泊の旅行に行く時のお供としてタブレットは持って行ったのですが、物足りなくてノートPCが欲しいと思っていました。
この度ようやくいい感じのやつを購入できました。

持ち歩くため小さいのがいいので、

  • 10~11インチ
  • 薄い
  • かっこいい

という条件で探していました。

そんな中Twitterでこんな情報が流れてきました。

12.5インチとちょっと画面が大きそうですが、8GBというのはうれしいですね。
仮想マシンもいくつか動かせそうです。 CPUはInter Core M-5Y71 1.20GHzという省電力系のCPUのようです。 あまり知らない方版ですが、今日日のCPUは問題ないでしょう。4コアだし。

また、金属ボディも金属でスタイリッシュ&頑丈そうです。

jp.ext.hp.com

というわけでTweetを発見したその日に秋葉原まで買いに行きました

実物はこんな感じ

f:id:paloma69:20181231215043j:plain

f:id:paloma69:20181231215106j:plain

そんなに大きくなくいいですね。

本当はThinkpadのXシリーズを狙っていたのですが、
実物を見てThinkpad(X240)が意外と分厚かったのと、こちらの金属ボディに惹かれてこっちを購入してしまいました。

使ってみた感じとしては動作も遅くなく、普通のノートPCといった感想です。 キーボードのレイアウトも普通で特に使いづらいところはないですね。

この機種は発売の記事を見ると2014~2015年頃のモデルなんですかね?
バッテリーもへたってなくてまだ6~7時間は持ちそうです。

このブログ記事も購入したPCで書きました。
これから旅先ではこいつを使っていろいろ触りたいですね。

ノートPCといえばMac Bookの小さいのが最高にかっこいいと思いますが、
いつか買う日を夢見てしばらくこの子で頑張ります。

冬のボーナスで今度こそ自宅サーバを買うつもりでしたが、ノートPCを買ってしまいました。 まあ、これも中古なんでまだ予算はあるんですけどね…。

nwdiagでNW構成図を自動生成

日付変わって10月最終日です。
今月全然記事書いてない!
というわけで最終日に1つ書きます。


本ブログはNWエンジニアの技術ブログとして始めましたが、業務の関係上設計や資料の持ち出しがNGでNW関連のことがあまり書けませんでした。
そんな中やっとNW系で面白そうなものを発見しました。

nwdiag

ブロック図生成ツール blockdiag — blockdiag 1.0 ドキュメント

python製の自動ブロック図生成パッケージです。
NW構成図のほかにも別タイプの描画ができるようです。

最近NW界隈でもConfigのオートメーションとか色々話題に出ていますが、構成図も自動で作れたら楽ですよね。

今の現場は担当しているシステムの規模も大きく、担当がはっきり分かれており構成図もNW屋の成果物となっています。
(SIはどこもそうかもしれないけど)

SIerだとvisioで書くのが主流ですかね。
PJみんなで共有する資料になるので、なるべくかっこよく書かなければいけません。 見栄え上線の傾き、オブジェクト位置のずれなども気にする必要があります。

しかしnwdiagを使えば自動でいい感じに生成できるので試してみます。

インストール

サブ機ubuntu desktopにいれます。

masashi@PC-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

専用コンテナ立てるか…とおもったけどサーバでもないしわざわざ作らなくてもいいかな。

というわけでpython仮想環境にインストール

masashi@PC-ubuntu:~$  python3 -m venv homenwdiag
masashi@PC-ubuntu:~$ 
masashi@PC-ubuntu:~$ cd homenwdiag/
masashi@PC-ubuntu:~/homenwdiag$ source bin/activate
(homenwdiag) masashi@PC-ubuntu:~/homenwdiag$ 
(homenwdiag) masashi@PC-ubuntu:~/homenwdiag$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (o
r define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)

公式に前提パッケージが乗っていますが、pipで一緒に入るようです。

(homenwdiag) masashi@PC-ubuntu:~/homenwdiag$ pip install nwdiag
Collecting nwdiag
  Downloading https://files.pythonhosted.org/packages/8e/06/42e672cc4b0efddd40f0c0de412dda7c29f8a971afb54b3d77579c
28aa29/nwdiag-1.0.4-py2.py3-none-any.whl (7.7MB)(homenwdiag) masashi@PC-ubuntu:~/homenwdiag$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (o
r define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
blockdiag (1.5.4)
funcparserlib (0.3.6)
nwdiag (1.0.4)
Pillow (5.3.0)
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)
webcolors (1.8.1)

これで準備OK。

自宅環境を書いてみる

そろそろdraw.ioでも使って自宅環境書くかーと思っていたところ、

という素晴らしい要素がそろっていたので、これでメンテしていきます。
as codeとしてバージョン管理できるしね。

インプットファイルを書く

diagファイルに書いてコマンドでアウトプットします。

  • home.diag
nwdiag {

  Internet [shape=cloud]
  Internet -- RT
  
  network HomeNW {
      address = "192.168.0.0/24"

      RT [address = "192.168.0.1"];
      Windows10 [address = "192.168.0.23"];
      Ubuntu18.04 [address = "192.168.0.10"];
      TVRecodeSV [address = "192.168.0.13"];
      RaspberryNAS [address = "192.168.0.19"]
  }
}

出力!

nwdiagコマンドで出力します。
オプションはいろいろありますが、困るまではデフォルトで行きます。

(homenwdiag) masashi@PC-ubuntu:~/homenwdiag$ nwdiag home.diag 
(homenwdiag) masashi@PC-ubuntu:~/homenwdiag$ ll
合計 60
drwxr-xr-x  6 masashi masashi  4096 1031 00:51 ./
drwxr-xr-x 42 masashi masashi 16384 1031 00:51 ../
drwxr-xr-x  2 masashi masashi  4096 1031 00:20 bin/
-rw-r--r--  1 masashi masashi   331 1031 00:51 home.diag
-rw-r--r--  1 masashi masashi 12769 1031 00:52 home.png  # これが出力される
drwxr-xr-x  2 masashi masashi  4096 1031 00:20 include/
drwxr-xr-x  3 masashi masashi  4096 1031 00:20 lib/
lrwxrwxrwx  1 masashi masashi     3 1031 00:20 lib64 -> lib/
-rw-r--r--  1 masashi masashi    69 1031 00:20 pyvenv.cfg
drwxr-xr-x  3 masashi masashi  4096 1031 00:20 share/

開いてみる

Linuxだと透明色は市松模様で出るらしくちょっと見にくいですね。
背景色の記述がなく変更方法がわかりませんでした。
Windowsで試したときは背景白で綺麗に見えたのですが・・・。

自分用にはギリ許容できますが、人様に見せるには色とフォントを改良する必要がありますね。

f:id:paloma69:20181031005352p:plain

それにしてもセグメントすくねーw
図面に起こすレベルじゃないですねw

お恥ずかしながらNWエンジニアの身であるにも関わらず自宅環境は1セグメントしかありません。
しかもISPのレンタルルータのみという体たらく。
主要マシンにしかAnti Virusは入れてないので、この環境にウイルス入っちゃったらやばいですね。

いいわけ

サーバ環境やpythonに興味が移っているだけで、
家でOpenflow走らせるとか、VXLAN使いたいとか野望はあるんですよ。

NW機器って単体だけだと役に立たないんで、最低でもルータ、スイッチの2台は無いといけません。
冗長構成組みたいならその倍・・・。

でもNW機器買うならサーバとかにお金使いたいよね。
ルータも仮想ルータで事足りるし。

今静音サーバ購入を検討中なので、サーバ買ったら仮想NWをバンバン作ろうと思います。

感想

NW構成図を自動で生成できるということですごい便利なツールだと思いますが、
ファイルの記述法はそんなに難しくなく、さくっと図が作れてしまいました。

大規模NW等をこれで制御するのは難しそうですが、小規模オフィスとかなら十分間に合いそうです。

急成長企業など、設計が追いつかなくて複雑になってしまったNW環境のconfigからIPを抜いて、
これで再作成してドキュメントの答え合わせみたいな使い方もできそうです。

今日はnwdiagコマンドだけですが、別のコマンドで別のブロック図が作れるようなので、また時間があれば試してみたいと思います。

こういう可視化のツールを作れる人は本当に天才だと思います。私は頑張ってもこの領域には届かなそう。

カーセンサーAPIを使って取得結果をHTMLで表示してみる

早いものでもう10月になってしまいました。

先月末にキャンプに行ったのですが、遠出するとマイカーが欲しくなります。
私は千葉に住んでいて普段は電車移動なのでいつもレンタカー借りていくんですが、
返却の時間とか気にしないといけないので自分の車があるといいですよね。

中古車サイトなんか見るのが好きなんですが、APIとか提供されてないかなと思い調べてみたらカーセンサーAPIというものを見つけました。

http://www.carsensorlab.net/webservice/files/webapidoc_ver2.2.pdf

というわけでこのAPIを使ってさくっと探せないかなーということでAPIを使った検索をやってみます。
取るだけだとつまらないので、ブラウザで見れるように連携も行います。
HTMLの勉強もしたいので。


やること

  • APIで中古車情報を取得する
  • 取得した方法をブラウザで表示する

やらないこと

やらなきゃいけないことは死ぬほどあると思いますが、今回は上記の機能確認のみするので、下記のことはやりません。
(技術的にも作れない…)

  • 検索機能
  • 条件機能
    • 簡単な条件はつけますが、POST系の実装は今回作りません。
  • ページング
    • 検索系には必須だと思いますが、ロジックがわかりません…

環境

サブ機のUbuntu18.04で動かしてみます。

masashi@PC-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

プログラミング言語Pythonをやり続けてきたので今回もPythonでやります。
Webの部分はFlaskを使います。
Djangoは多機能すぎるので私にはまだ早そう。

venv(python3)で作った環境です。

(carsearch) masashi@PC-ubuntu:~/carsearch/app$ python --version
Python 3.6.5
(carsearch) masashi@PC-ubuntu:~/carsearch/app$ 
(carsearch) masashi@PC-ubuntu:~/carsearch/app$ pip list
# 抜粋
beautifulsoup4 (4.6.3)
Flask (1.0.2)
Flask-Bootstrap (3.3.7.1)
Jinja2 (2.10)
lxml (4.2.5)

使用パッケージの詳細

  • 検索処理

    • requests
    • Beautifulsoup
      • レスポンスはxmlで返ってくるので使い慣れているBeautifulsoupでパースします。
      • リファレンス上にはjsonも使えると書いてあったのですが、返ってこないのでxmlで進めます
    • lxml
      • xmlをパースするには必要? インポートしないとパースエラーになりました
  • 表示部分

    • Flask
      • HTMLの仕組みを理解するためスクラッチで作るつもりでFlaskを使います。
    • Bootstrap
      • 1人だとCSSまでは手が回らないので利用します。
      • サーバ側にファイル置かなくていいCDN版もあるみたいです(知らなかった)
      • Flask内で書けるflask-bootstrapというライブラリを使います

構成

├── app.py
├── carsearch.py
├── requests.txt
└── templates
    └── index.html

app.py

  • Flaskの実行部分
    • よく見るtutorial的な書き方です
    • carsearch.pyをインポートして取得結果をindex.htmlに渡します
(carsearch) masashi@PC-ubuntu:~/carsearch/app$ cat app.py 
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from carsearch import CarSearch

app = Flask(__name__)
bootstrap = Bootstrap(app)


@app.route('/')
def index():
    # CarSearch()
    return render_template('index.html', S=CarSearch())

if __name__ == '__main__':
    app.run(debug=True)

carsearch.py

  • API取得部分
    • 簡単な条件を入れています。(千葉県、20個取得、100万円以下)
    • これもBeautifulSoupのtutorialな書き方です
(carsearch) masashi@PC-ubuntu:~/carsearch/app$ cat carsearch.py 
import requests
from bs4 import BeautifulSoup
import lxml

URL = 'http://www.carsensorlab.net/webapi/V2/usedCarSearch/'

# car conditions
condition = {
    'area': 'chiba',
    'count': 20,
    'price': ';1000000'
    }

def CarSearch():
    r = requests.get(URL, params=condition)
    soup = BeautifulSoup(r.text, 'xml')
    return soup

requests.txt

  • パッケージファイル
    • あとでどこかにデプロイしたくなったときのために書いておきます
(carsearch) masashi@PC-ubuntu:~/carsearch/app$ cat requests.txt 
requests
bs4
lxml
flask
flask-bootstrap

index.html

(carsearch) masashi@PC-ubuntu:~/carsearch/app$ cat templates/index.html 
{% extends "bootstrap/base.html" %}

{% block title %}UsedCar Search{% endblock %}

{% block content %}
<div class="container">
    <div class="page-header">
    <h1>Hello World!</h1>
    </div>
</div>

<!-- 県 -->
<h1>{{ S.find('Prefecture').text }}</h1>

<!-- 車出力 -->
<div class="container">
  <div class="row">
      {% for a in S.select('UsedCar') %}
            <div class="col-md-4">
               <div class="panel panel-default">
                メーカー: {{ a.Brand.text }} 車種: {{ a.Model.text }} </br>価格: {{ a.Price.text }} </br>
                {{ a.Meter.text }} {{ a.Color.text }}  </br>
                <img src="{{ a.ImageSUrl.text }}"></br>
                <a href="{{ a.DetailURL.text }}">{{ a.DetailURL.text }}</a>
               </div>
            </div>
      {% endfor %}
    </div>
</div>

{% endblock %}

アクセスしてみます

  • Flask起動
(carsearch) masashi@PC-ubuntu:~/carsearch/app$ python app.py 
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 211-547-104
  • アクセス

f:id:paloma69:20181013163051p:plain

なんかそれっぽい感じに表示されました!
メーカ指定しないとレクサスが最初に取得されるようですね。

感想

Bootstrapに頼ってはいますが、しっかりとしたHTMLまで自分で書いたのは初めてだと思います。
頭の中ではレイアウトはできているんですが、いざ実装しようとするとかなり難しいですね。
デザインもそうですが、アプリケーションと連携しようとするとコードが混乱します。

私は本業はNWエンジニアのため、仕事でHTMLを書くことは無いのですが、
Webアプリの仕事してる人はさくっと書けちゃうんでしょうか。

でもこういう見えるものを作るのはすごく楽しいですね。
NW機器はEnd-Endの環境が揃うか、キャプチャでもしないと実際の動きは見えないので。

これを基礎に特定条件専用の中古車検索サイトでも作って公開してみようと思います。

目標:年内!

ubuntu16.04LTS -> 18.04LTSにアップデート

自宅のサブ機はubuntuを使ってます。
16.04をずっと使ってきたのですが、今年18.04がリリースされました。
ずっとやりたかったアップデートをようやく実施したので手順をメモしておきます。
といっても手順通りにやっただけですが。

事前バックアップ

ちょろちょろ簡単なコードを書いているのとコンテナにDokuwikiがいますので、消えたら困るデータは事前にバックアップ取っておきます。
以前Baculaで取っていたのもあるのですが、Baculaサーバのディスクがいっぱいになり止まってしまっていたので、一応取っておきました。
tarで固めて別のディスクにコピーしただけなので割愛します。

手順に沿ってアップデート

ZDnetのサイトを参考にしました。

www.zdnet.com

サイトのコマンドの通りですが、ログ取れてませんでした…

Update前のUnity

ここ最近のUbuntuではお馴染みですね。
18.04はGNOMEになるということでUnityは見納めですね。

wallpaperはロサンゼルスではなく、GTAⅤのロスサントスです。
ディスプレイもサブなので、4:3の画面です。

f:id:paloma69:20180916235153p:plain

historyに残っていましたが、実行コマンドはこれです。

sudo apt update
sudo apt upgrade 
sudo apt autoremove 
sudo apt dist-upgrade
sudo apt install update-manager-core
sudo do-release-upgrade -c # Updateできるバージョンチェック
sudo do-release-upgrade

最後のコマンドを打ってからアプデートが始まります。
結局アップデートするのに1時間30分程かかりました。

パッケージアップデート作業が完了したら再起動。
再起動後の画面はこちらです。
デスクトップがGNOMEになっていますね。

f:id:paloma69:20180916235613p:plain

バージョンチェック

masashi@PC-ubuntu:~$ sudo cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
masashi@PC-ubuntu:~$ 
masashi@PC-ubuntu:~$ uname -a
Linux PC-ubuntu 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
masashi@PC-ubuntu:~$ 

18.04になってます。

コンテナも無事自動起動していました。

masashi@PC-ubuntu:~$ lxc list
+--------------+---------+---------------------+------+------------+-----------+
|     NAME     |  STATE  |        IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+--------------+---------+---------------------+------+------------+-----------+
| cent7-wp     | RUNNING | 10.94.47.228 (eth0) |      | PERSISTENT | 1         |
+--------------+---------+---------------------+------+------------+-----------+
| transmission | RUNNING | 10.94.47.174 (eth0) |      | PERSISTENT | 0         |
+--------------+---------+---------------------+------+------------+-----------+
| ubuntu-pr    | RUNNING | 10.94.47.71 (eth0)  |      | PERSISTENT | 0         |
+--------------+---------+---------------------+------+------------+-----------+
| ubuntu16     | RUNNING | 10.94.47.134 (eth0) |      | PERSISTENT | 2         |
+--------------+---------+---------------------+------+------------+-----------+
``

### 無事にバージョンアップできました。

ログが取れていなかったのは残念ですが、無事にアップデートできてよかったです。  
データの破損もありませんでした。

GNOMEということでGNOME Shellが使えるようになりますので、テスクトップを便利にカッコよくしていきたいですね。    
他の機能的な違いはリリースノートを読みつつ使いながら調べます。