Python3系でスクレイピングするコンテナ構築
簡単なアプリを作るためにスクレイピングする必要があり、勉強がてらコンテナ上にPythonを使って構築しました。
Yahoo!ニューストップのaタグのリンク先URLを出力するサンプルをGitHubにアップロードしています。
docker-sample/scraping at master · nagamoto/docker-sample · GitHub
概要
構築やライブラリ選定にあたって以下の記事を参考にしています。
dockerfileについて
docker-sample/dockerfile at master · nagamoto/docker-sample · GitHub
ベースimageにはalpineではなくslim-busterのものを利用しています。VSCodeの拡張機能で便利にdockerコンテナに接続できるようになりましたが、alpineはサポートしていない*1ため、手元での取り回しやすさを優先しました。
ライブラリ使用例
Requestsライブラリ
headers = {"User-Agent": "your user agent"} URL = "https://news.yahoo.co.jp/" response = requests.get(URL, timeout=1, headers=headers)
docker-sample/app.py at master · nagamoto/docker-sample · GitHub
わかりやすすぎて特に言うことがないほどです
User-Agentについては、UserAgent調べる君でも利用して、実際に自分の環境のものを使用するとより安心です。
BeautifulSoupライブラリ
soup = BeautifulSoup(response.text, 'lxml') #要素を抽出 for a_tag in soup.find_all('a'): print(a_tag.get('href')) #リンクを表示
docker-sample/app.py at master · nagamoto/docker-sample · GitHub
aタグ要素をリストで取得して、そのhref属性を読み取っていることが直感的に理解できます。
使いやすいライブラリが充実しており、Pythonがスクレイピングに向いていると言われる理由がよくわかりました。
サンプルのdockerコンテナ利用方法
サンプルを起動する場合はCLIで次のように操作してください。
docker build -t scraping . # dockerfileがあるディレクトリで実行 docker run --rm --name scraping scraping
基本的なコマンドしか利用していませんが、ビルド時のタグ名指定と停止時にコンテナを破棄するオプションを設定しています。
最後に
スクレイピングを行う場合にPythonはとても便利だと感じてもらえたかと思います。Python学習の入り口としてはとてもとっつきやすいため、おすすめです。
また、スクレイピングをする場合には他にもRubyやNode.jsなど選択肢に上がります。*2基本的には実装・保守をするチームが扱いやすい言語を選べばいいでしょう。
ちなみに私はFirebaseと連携するためにCloud Functionsを利用したいと考えているので、Node.jsで実装し直す事になりそうです。*3
*1:insiders版であればalpineにも接続できます。
*2:比較参考記事: https://qiita.com/Octoparse_Japan/items/14304b5bd9fb84945ec3
*3:Cloud FunctionsはNode.js環境のみのため
Metabaseで個人情報を保護しながらデータ分析
データ分析ってとても重要ですよね、ツールを使ってデータ・ドリブンに質の高いPDCAを回していきたいものです。
とはいえ、個人情報へのアクセスを管理・制限できなければBIツールは導入できないといった話はよく聞きます。 私が直接聞いたのは、「プライバシーマーク取得にあたり、個人情報へのアクセスを管理・制限したい。」*1というものでした。
この記事ではMetabaseというアプリで個人情報へのアクセスを管理・制限する方法を説明します。
Metabaseとは
Redashに代表されるOSSダッシュボードツールの1つです。
CLIを利用して細く設定できるRedashに対して、GUIでわかりやすく操作できることを重視しているのがMetabaseという印象です。 Redashのほうができることは多いですが、Metabaseも十分な機能を備えているので特殊なデータソースを利用するでもない限りは、どちらを使ってもいいと思います。(私はMetabaseが好きです)
詳細は公式サイトを見てください。
個人情報へのアクセスを管理・制限する方法
- Metabase利用を会社用Googleアカウントのみに制限
- 特定データについてMetabaseからアクセス不可設定
- DBへのアクセスをユーザグループ毎に制限
- テーブルへのアクセスをユーザグループ毎に制限
これらはすべてMetabaseアプリから実現可能*2で、非常に簡単です。実際の画面とともに説明します。
Metabase利用を会社用Googleアカウントのみに制限
「外出先でもMetabaseを確認したいので社内LANやIPで制限をかけたくない」
こんな要望ありますよね。そんなときは特定ドメインのGoogleアカウントからしかアプリのユーザ登録ができないようにしましょう。
アプリの画面は次の通りです。わかりやすすぎて説明することがありませんね。 便利なシングルサインオンを利用しながら不正なユーザ登録を防ぐこともできて一石二鳥なので、会社でGoogleアカウントを使っているならぜひ設定しましょう。
特定データについてMetabaseからアクセス不可設定
「データ分析には使わないし、ユーザの住所が入ってるカラムは見えないようにしたい」
よくある話ではないでしょうか。Metabaseなら簡単に設定できます。
MetabaseからアクセスしたくないカラムのあるDB、テーブルを選択し、 カラムを取得しないように設定して完了です。
DBへのアクセスをユーザグループ毎に制限
「カスタマーサポートへ必要に応じて個人情報を共有できるようにしたい」
これもよくある話ですね。Metabaseならグループ毎の細かい権限設定もGUIで簡単に設定できます。 ユーザグループの設定画面は次の通りです。 管理者とAll Usersはデフォルトで存在するグループです。
データ権限の設定画面は次の通りです。 画像は次のような設定になっています。
- 基本的に必要なユーザにのみ権限を与えるため、All UsersはSQLを書くこともデータアクセスもできない
- 個人情報を見てはいけないグループはSQLは書けないが、データへのアクセスは部分的に許可
- 個人情報を見ていいグループはSQLを書くこともデータアクセスも許可
テーブルへのアクセスをユーザグループ毎に制限
テーブル単位のより細かい制限を課すこともできます。テーブル毎の詳細な権限設定は次の通りです。
画像では個人情報を見てはいけないグループに対して、個人情報が入るであろうPeopleテーブルのみをデータアクセス禁止に設定しています。
ちなみに、グループと呼んでいますが1ユーザに対して複数のグループを設定できるため、イメージとしてはタグが近いです。
最後に
MetabaseはDocker imageが作成されていて、すぐに手元で試すことができるのでぜひ試してみてください。 本番環境のDB(リードレプリカ推奨)と接続する際も、AWSであれば公式に用意されたElastic Beanstalkの設定から簡単に環境構築できるので、とりあえず使ってみるのにおすすめです。
ツールを上手く使い、データ出しのコストを下げて、効果的な施策をどんどん試していきましょう。
Visual Studio CodeからDockerで作ったコンテナ内を操作する
少し前までは、Dockerで開発環境を作る場合 「ホストマシンとコンテナのディレクトリやファイルをsyncさせてコンテナに反映されるのを待ってから動作確認。」 みたいな煩わしさがありましたが、今ではほぼストレスなくコンテナに変更を加えることができます。
今回は私が一番わかりやすいと思っているVisual Studio Code(以下VSCode)でコンテナ内のファイルを直接編集する方法を紹介します。
概要
- VSCodeアップデート
- Dockerエクステンションをインストール
- 起動中のコンテナを選択し、attach
簡単すぎて説明しなくてもいい気がするほどです。
VSCodeアップデート
VSCodeは頻繁に更新されますし、Remote Development機能などは最近追加された機能なのでアップデートしておきましょう。 公式サイトはこちら。
Dockerエクステンションをインストール
Microsoftが提供しているDocker利用を便利にするエクステンションです。Preview版であることは理解の上でインストールしましょう。
起動中のコンテナを選択し、attach
次の画像の通り、GUIから直感的な操作でコンテナへ接続できます。
何がすごいのか
何よりこの簡便さが素晴らしいです。
Dockerのエクステンションは何もせずともイメージやコンテナの一覧を表示してくれますし、接続もGUI操作でよしなに接続コマンドを実行してくれます。VSCodeでコンテナを編集するために必要な準備もattach時に勝手にやってくれます。*1
気をつけることはDockerエクステンションがまだPreview版であることと、Alpineなど一部未対応のOSがあることです。*2
AlpineについてはVSCode Insider版を利用すると同様のことができます。
きっと近いうちに安定版VSCodeも対応するでしょうし、どんどんアップデートされるVSCodeから目が離せませんね。
みなさんもVSCodeで快適に便利に開発を行いましょう!
*1:どういうコマンドを実行しているかはVSCodeのTerminalから確認できますし、勉強になります。
*2:2019/08/30 時点。参考: https://code.visualstudio.com/docs/remote/faq#_what-linux-packages-or-libraries-need-to-be-installed-on-a-host-to-use-remote-development
Nature Remoで楽々スマートホーム。~朝ドラ視聴を自動化~
私は楽をするのが大好きで、スマートホームにはとても期待しています。Google Homeに関しては以前このような記事を書きました。 ngmt83.hatenablog.com
今回はNature Remo(mini)の紹介です。 公式サイトは↓こちら↓ nature.global
Nature Remoの仕組み
Remoに搭載されたWi-Fiと赤外線通信機能により、スマホやスマートスピーカーからRemoを通じてエアコンやテレビなどの家電を操作することができます。
公式サイトより
ざっくり言うと、ネット接続された万能リモコンです。
遠隔操作するだけでも十分便利ですし、リモコンがスマホ1つでまとまるのもけっこうありがたいです。*1
さらにルールという機能を使い、便利になった実際のユースケースを紹介します。
ルールで朝ドラ視聴を自動化
我が家は朝のルーティンがある程度確立されており、毎日朝ドラを視聴しています。しかし子供が朝ごはんに集中しないなどの理由から朝ドラの時間以外はテレビはつけません。そうしていると朝ドラの時間に気づかずに見逃すこともあります。そういった悩みをNature Remoのルール機能で解決できます。
ルール機能は大きくトリガーとコントロールに分かれます。トリガーがルールの発動条件で、コントロールが条件を満たした時に行われる操作です。
朝ドラを視聴する場合の日時トリガーはこのようになります。
コントロールを設定したルールは次の通りです。
日曜以外の朝8時に、テレビの電源をつけ、1chに変更することがわかりやすいですね。このUIのわかりやすさがNature Remoを気に入っている理由の1つです。
あと1つ例をあげます。
帰宅前にエアコンをつける
夏場、帰宅時に部屋が冷えていたら最高だと思いませんか?でも帰宅時間が読めないのでタイマーでは難しい…なんてことありますよね?Nature Remoなら簡単です。
スマホの位置情報をトリガーにしたルールを設定すると最寄駅についたときにエアコンを起動できます。
Nature Remoの良いところまとめ
- リモコンをスマホに一本化できる
- 遠隔地から家電を操作できる
- 古い家電でも対応している
- シンプルなUIでわかりやすい
- ルール機能で便利に自動化できる
Nature Remo APIも公開されているので、エンジニアとしてはもっと色んなことができそうですね。上手く使えたらまた記事にしたいと思います。
*1:子供にテレビのリモコンを破壊されたので代わりにRemoを使っています
Dlibで顔認識できるDockerコンテナを作る
Pythonに学ばされたこと、DockerでDlibの環境構築をしたこと、Falconの実装例なども近いうちに記事にしたいと思います。
こちらの記事に予告*1していた通り、Dockerコンテナ上でDlib(特にface_recognition)を使うための環境構築の記事です。
Dlibとは
DlibはC++のライブラリ(OSS)です。機械学習を行う際に必要なアルゴリズムやツール群を持っています。 また、Python用のAPIも用意されているため、機械学習関連では人気のライブラリです。 詳細は公式サイトを確認してください。
作成したdockerfile
FROM python:alpine RUN apk add --no-cache make cmake gcc g++ zlib-dev jpeg-dev ENV PROJECT_DIR="/app/" ADD app/ $PROJECT_DIR WORKDIR $PROJECT_DIR RUN pip install -r requirements.txt
https://github.com/nagamoto/docker-sample/blob/master/dlib/dockerfile
解説
FROM python:alpine
Pythonが使用できる公式イメージを利用しています。中でも軽量とされているalpineを採用しました。
RUN apk add --no-cache make cmake gcc g++ zlib-dev jpeg-dev
必要なパッケージをインストールしています。
Dlibを使用するためにビルドするmake cmake。
コンパイルのためにgcc, g++。
ビルド・コンパイル時に圧縮・展開するためzlib-dev。
画像を扱うためjpeg-dev。
ENV PROJECT_DIR="/app/"
便宜上dockerfileから下の階層にアプリに関するデータ置くためです。
ADD app/ $PROJECT_DIR
appフォルダ内のファイルをコンテナに追加しています。
WORKDIR $PROJECT_DIR
コンテナ内でのチェンジディレクトリです。
RUN pip install -r requirements.txt
appフォルダ内にあるrequirements.txtに従ってPythonライブラリをインストールします。
face_recognition.pyにはdlibとnumpyをpip installする必要があると記載されていたので、requirements.txtにはdlibとnumpyを記述するといいでしょう。 http://dlib.net/face_recognition.py.html
最後に
できるだけ軽量に余計なものがないように構築したつもりですが、もっと軽量にする方法を知っていたら教えて欲しいです。
*1:近いうちという予告から4ヶ月以上経過しています…
転職活動中にかけられて嬉しかった言葉
退職・転職エントリや、エンジニア流出に繋がるアンチパターンといった良くない例にまつわる情報はかなり出回ってきたように思います。
また、採用担当者向けのノウハウも情報が出揃ってきたように感じています。
エンジニア採用がぐんぐん進む求人票の書き方|末本充洋|note
「エンジニア採用したい」と言う割には面接が下手な企業が多すぎるという話 - paiza開発日誌
それらとは違った個人視点のポジティブフィードバック(転職活動中にかけられて嬉しかった言葉)を理由と共に書き残しておきます。
嬉しかった言葉たち
- ぜひ一緒に働きたい
- 転職したくないように見える
- ブログ見たよ
- 個人的なアドバイスなんですが〜
- 希望する金額でオファーが出せない可能性があります
- Xという理由でオファー金額をあげました
- スプラトゥーン好きなの?うちにも好きなエンジニア何人もいるよ
- うちはいつでも歓迎ですよ
- 元同僚の言葉
ぜひ一緒に働きたい
当たり前ですがやはり嬉しいです。
さらに一緒に働きたいと考える具体的な理由が添えられているとより嬉しいです。具体的な理由としては、期待する役割や入社後に活躍するビジョン、組織文化のフィット感などがありました。
個人的な感覚ですが、単なる採用担当者の言う「内定を出したいと考えています」と、入社後に近しいポジションのメンバーが言う「ぜひ一緒に働きたい」とでは後者のほうが断然嬉しいです。
転職したくないように見える
できることなら転職せず中長期的にキャリアを形成と事業へのコミットを継続していきたい。そういった企業を希望している。
という私の意図を汲み取ってもらえたことが「転職したくないように見える」という言葉から伝わり、とても嬉しく感じました。
私の職務経歴は明らかにジョブホッパーのそれです。自業自得ではありますが、中長期的にコミットしていきたいという意図を汲み取ってもらうのは難しく、それが達成できると非常に嬉しいのです。
ブログ見たよ
単純に頑張って書いているブログを見てもらえるのは嬉しいです。また、時間を使ってブログを確認するという行為が自分という候補者に対して向き合っていることの証明でもあり、とてもありがたいです。
ブログに書いてある記事を見たからと、質疑を効率的に進めることもできたので、その面接ではとてもいい体験をしました。
個人的なアドバイスなんですが〜
「面接の評価とは一切関係ないけれど」と前置きをした上でアドバイスを受けたことがあります。シビアな言葉、優しい言葉色々ありましたが真剣に考えてもらえたからこそのアドバイスでした。転職活動における貴重なフィードバックでもあるため、自分のためになる嬉しい言葉でした。
希望する金額でオファーが出せない可能性があります
私は事前にレジュメに希望最低年収を記載していました。もちろん不足するオファーを出されること自体は望ましくありません。しかし、選考を通して想定よりオファー金額が下がる*1ことがありうると思います。その際に選考中でも早い段階で正直に共有してもらえるのはありがたいです。
詳しい事情を聞くことでフィードバックをもらえたり、場合によっては先に辞退して余計な時間を節約することができたりします。選考を最後まで終えてから何も言わず不足するオファーを出されるよりはよっぽど良いです。
Xという理由でオファー金額をあげました
金額が上がったらそりゃ嬉しいでしょ。と思われるかもしれませんが、それだけでは手離しで喜べません。自身の実力や期待値がミスマッチすることは望ましくないです。 例えば単に他社のオファーを上回るために上乗せしてくるのは少し危険だと感じます。出し惜しみして後出しジャンケンをする企業は信頼しにくいですし、過度な期待を受けて入社しては不幸になる可能性も高まります。
どういった経緯・判断をして上乗せしたかを教えてもらえるなら、それはオープンでいいと思いますし、納得できる理由であれば素直にガッツポーツできます。(心の中です)
スプラトゥーン好きなの?うちにも好きなエンジニア何人もいるよ
こんなTシャツを来ていたら、面接の途中で役員に言われました。フランクに会話できる雰囲気が嬉しいし、服装までしっかり見るし、役員がエンジニアメンバーのことをちゃんと把握していることも伝わりました。 スプラトゥーン仲間がいるということもシンプルに嬉しかったです笑
うちはいつでも歓迎ですよ
こんなツイート*2をしてしまった後にTwitterで繋がっていた一度内定を辞退した企業の採用担当者からメッセージを受けました。 それだけの気持ちを持って内定をくれていたこと、その後も気にされていること、どちらも光栄に感じました。また、この企業は採用活動に本当に力を入れていてすごいと感心させられました。苦渋の選択をし、泣く泣く辞退した内定を後悔しているアカウントがこちらになります。
— ナガモト@Glideエンジニア (@ngmt83) July 23, 2019
普通こんなことないけど、弱っているな自分。
元同僚の言葉
先のツイートを受けて元同僚がくれたリプライはとても嬉しかったです。
エンジニア採用をメインの仕事としているのですが、自分も一瞬「なんだこいつ」と思うでしょう。しかし、激烈な転職市場と内定の妥当な理由があれば「そういうこともあるやな...」って思うかなと思います。
— 星 直史@ピクスタの温泉番長 (@NaoshiHoshi) July 23, 2019
(とはいえ、心象に依るとは思いますが...)
つまり、ノーチャンではありません!!
ざっくり求人だしてる時に2パターンあって、「このポジションに N 人ほしい(N はメチャ少なく、回答期限が極端に短いケースはこれのことが多い)」、「良い人が居れば取れるだけ取りたい(枠という概念が実質無い)」で、もし後者なら事情話せばなんの問題もなく行けると思う。前者だと枠次第やね。
— 雀巽(じゃくそん) (@necojackarc) July 23, 2019
「どんまい、がんばれ」のような精神的な応援だけではなく、実際の経験・知識に基づいていてとても納得感がありました。
最後に
整理してみると
- 自分の伝えたいことが伝わること
- 誠意を持って向き合ってもらうこと
これらが重要で嬉しく感じるのだと思いました。なんだかんだコミュニケーションの基本ですね。(ただし簡単ではない)
あと元同僚のありがたみを強く感じましたし、ジョブホッパーだろうがなんだろうが当たり前に同僚は大切したほうがいいし、SNSでもなんでも繋がり続けておきたいと思いました。
「実践版GRIT やり抜く力を手に入れる」Chapter3 グリットを高めるための下準備
私は徹底的にやり抜いた経験、またそれによって成功を納めるといった経験に乏しいと感じています。 そんな思いからこの本を読んでいます。
- 作者: キャロライン・アダムス・ミラー,宇野カオリ,藤原弘美
- 出版社/メーカー: すばる舎
- 発売日: 2018/02/21
- メディア: 単行本
- この商品を含むブログを見る
本の内容
この本の内容は次の通りです。
今や、人間の集中力の持続時間は金魚以下 (人間は7秒、金魚は8秒)。 そんな注意力散漫な現代において、あらゆる成功を叶える究極の資質、 「GRIT=やり抜く力」を磨く方法を伝授。
販売ページ*1より引用
Chapter3 グリットを高めるための下準備
この章では「本物のグリット」を養う下準備とその重要性について述べられていました。そして章末には読者自身も下準備に取り組んだほうが良いと勧めながら、いくつか質問が記載されていました。 せっかくなのでその質問に回答し、自分と向き合い、書き留めておこうと思います。
今挑戦したいと思っていて、実際にやってみなければあとで後悔するだろうと思う夢は?(複数可)
- 自分が携わった代表作とも言えるプロダクトを作る
- 業務レベルで、0に近い段階から関わって10, 100まで痛みまで含めて関わり抜いてプロダクトを作る
- 個人開発でどんな形であれ、リリースまでやりきる
あなたは何のために毎朝起きるのだろう?(あなたの生きがいは?)
子供が何不自由することなく育つため。
コンフォート・ゾーンから出るタイミングとして、今が適切だと思うのはなぜだろう?
まだ若く、失敗してもその経験を次に活かすことが十二分にできるため。コンフォートゾーンに長居しすぎた自覚があるため。
今までにやり遂げたことの中で、最も困難だった挑戦は何だろう?
高校時代の陸上部長距離キャプテン。また、陸上競技で県内トップレベルの選手と渡り合えるまでに成長できたこと。
その困難なチャレンジを、あなたはどうやって成し遂げたのだろう?
顧問の先生の厳しい指導、合宿・試合など成長機会を手配してもらえたため。先輩と同級生に手本となるトップレベルの選手がいて、悔しさを常に感じることができたため。
あなたの成功を喜んでくれる人は誰だろう?
嫁、娘、兄弟、元同僚。
あなたの「特徴的な強み」は何だろう?VIAの公式ウェブサイトでチェックしてみよう
- 慎重
- 判定
- 公平
自分が「最高の状態」にあったとき、あなたの強みはどのような形で発揮されていただろう?
陸上競技におけるベストレースでは、ペース配分を慎重に行う中でも、コース・天候・自身の体調など情報を常に意識し、スパートをかけるタイミングを判断していた。 コースは頭に叩き込み、最短距離、前後との差を測りやすいポイントなどレース展開に応じた予想を立て、レース中の判断をやりやすくした。
未来の理想の自分像とはどのようなものだろう?
「Xはわしが育てた(作った)」と知人に胸を張って自慢できる何かを持ち、生き生きと働く様から子供に自慢の親だと思ってもらえる自分。
「起こり得る最高の人生」を送るためには、今後どのような障害が想定されるだろう?
- 実績・信頼を得られず、年を重ねた先にエンジニアとしてのキャリアが難しくなる
- 転職など逃げ癖がついてしまう
- 日本がさらなる不景気に陥り、やりたいこと、挑戦したいことを選択できなくなる
- 家庭を支えるための短期的な金銭が不足し、仕事を選べなくなる
- 実家の親の介護の問題
自分と向き合ってみて
- 何のために朝起きるのか?
- 最も困難だった挑戦
- 私の成功を喜ぶ人
これらは特に考えることが難しかった。どうにか書き留めてみたけれど、まだ何か違う気がしているため、もう少しゆっくり考える必要がありそう。
また、これまでのやりきった経験をヒントにGRIDを身に付けようとしているけれど、そもそもやりきった経験の少なさを克服するためにGRIDを身につけたいという鶏卵問題を感じた。
余談 VIAの公式サイトについて
日本語ページも用意されているけれども、google翻訳よりよっぽどひどい出来の翻訳の上、Survey項目はすべて英語だったので最初から頑張って英語を読んだほうがいい。
でこれからGRIDは身につきそうなのか?
わからないけれど足掻く価値はありそう。まずは本を読み進めることから。