ナガモト の blog

Full Cycle Developerを目指すエンジニアが有用そうな技術記事や、ポエムのようなよしなしごとを投稿するブログです。

Python3系でスクレイピングするコンテナ構築

簡単なアプリを作るためにスクレイピングする必要があり、勉強がてらコンテナ上にPythonを使って構築しました。

Yahoo!ニューストップのaタグのリンク先URLを出力するサンプルをGitHubにアップロードしています。

docker-sample/scraping at master · nagamoto/docker-sample · GitHub

概要

  • dockerのベースimageはPython公式のものを利用
  • スクレイピングに利用するライブラリはrequests, beautifulsoup4, lxml

構築やライブラリ選定にあたって以下の記事を参考にしています。

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.com

redash.io

個人情報へのアクセスを管理・制限する方法

  1. Metabase利用を会社用Googleアカウントのみに制限
  2. 特定データについてMetabaseからアクセス不可設定
  3. DBへのアクセスをユーザグループ毎に制限
  4. テーブルへのアクセスをユーザグループ毎に制限

これらはすべてMetabaseアプリから実現可能*2で、非常に簡単です。実際の画面とともに説明します。

Metabase利用を会社用Googleアカウントのみに制限

「外出先でもMetabaseを確認したいので社内LANやIPで制限をかけたくない」

こんな要望ありますよね。そんなときは特定ドメインGoogleアカウントからしかアプリのユーザ登録ができないようにしましょう。

アプリの画面は次の通りです。わかりやすすぎて説明することがありませんね。

f:id:ngmt83:20190906004723p:plain
特定ドメインに制限
便利なシングルサインオンを利用しながら不正なユーザ登録を防ぐこともできて一石二鳥なので、会社でGoogleアカウントを使っているならぜひ設定しましょう。

特定データについてMetabaseからアクセス不可設定

「データ分析には使わないし、ユーザの住所が入ってるカラムは見えないようにしたい」

よくある話ではないでしょうか。Metabaseなら簡単に設定できます。

MetabaseからアクセスしたくないカラムのあるDB、テーブルを選択し、

f:id:ngmt83:20190906005129p:plain
カラムアクセス不可設定1
カラムを取得しないように設定して完了です。
f:id:ngmt83:20190906005334p:plain
カラムアクセス不可設定2

DBへのアクセスをユーザグループ毎に制限

「カスタマーサポートへ必要に応じて個人情報を共有できるようにしたい」

これもよくある話ですね。Metabaseならグループ毎の細かい権限設定もGUIで簡単に設定できます。 ユーザグループの設定画面は次の通りです。

f:id:ngmt83:20190906085201p:plain
ユーザグループ設定画面
管理者とAll Usersはデフォルトで存在するグループです。

データ権限の設定画面は次の通りです。

f:id:ngmt83:20190906085400p:plain
データ権限設定画面
画像は次のような設定になっています。

  • 基本的に必要なユーザにのみ権限を与えるため、All UsersはSQLを書くこともデータアクセスもできない
  • 個人情報を見てはいけないグループはSQLは書けないが、データへのアクセスは部分的に許可
  • 個人情報を見ていいグループはSQLを書くこともデータアクセスも許可

テーブルへのアクセスをユーザグループ毎に制限

テーブル単位のより細かい制限を課すこともできます。テーブル毎の詳細な権限設定は次の通りです。

f:id:ngmt83:20190906085447p:plain
テーブル権限設定画面

画像では個人情報を見てはいけないグループに対して、個人情報が入るであろうPeopleテーブルのみをデータアクセス禁止に設定しています。

ちなみに、グループと呼んでいますが1ユーザに対して複数のグループを設定できるため、イメージとしてはタグが近いです。

f:id:ngmt83:20190906091305p:plain
ユーザへのグループ設定

最後に

MetabaseはDocker imageが作成されていて、すぐに手元で試すことができるのでぜひ試してみてください。 本番環境のDB(リードレプリカ推奨)と接続する際も、AWSであれば公式に用意されたElastic Beanstalkの設定から簡単に環境構築できるので、とりあえず使ってみるのにおすすめです。

ツールを上手く使い、データ出しのコストを下げて、効果的な施策をどんどん試していきましょう。

*1:誰が個人情報にアクセスできるか、組織が把握している必要がある

*2:Metabaseの管理者権限を持っているユーザのみ

Visual Studio CodeからDockerで作ったコンテナ内を操作する

少し前までは、Dockerで開発環境を作る場合 「ホストマシンとコンテナのディレクトリやファイルをsyncさせてコンテナに反映されるのを待ってから動作確認。」 みたいな煩わしさがありましたが、今ではほぼストレスなくコンテナに変更を加えることができます。

今回は私が一番わかりやすいと思っているVisual Studio Code(以下VSCode)でコンテナ内のファイルを直接編集する方法を紹介します。

概要

  1. VSCodeアップデート
  2. Dockerエクステンションをインストール
  3. 起動中のコンテナを選択し、attach

簡単すぎて説明しなくてもいい気がするほどです。

VSCodeアップデート

VSCodeは頻繁に更新されますし、Remote Development機能などは最近追加された機能なのでアップデートしておきましょう。 公式サイトはこちら。

code.visualstudio.com

Dockerエクステンションをインストール

Microsoftが提供しているDocker利用を便利にするエクステンションです。Preview版であることは理解の上でインストールしましょう。

marketplace.visualstudio.com

起動中のコンテナを選択し、attach

次の画像の通り、GUIから直感的な操作でコンテナへ接続できます。

f:id:ngmt83:20190830113235p:plain
VSCode操作画面例

何がすごいのか

何よりこの簡便さが素晴らしいです。

Dockerのエクステンションは何もせずともイメージやコンテナの一覧を表示してくれますし、接続もGUI操作でよしなに接続コマンドを実行してくれます。VSCodeでコンテナを編集するために必要な準備もattach時に勝手にやってくれます。*1

気をつけることはDockerエクステンションがまだPreview版であることと、Alpineなど一部未対応のOSがあることです。*2

AlpineについてはVSCode Insider版を利用すると同様のことができます。

code.visualstudio.com

きっと近いうちに安定版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のルール機能で解決できます。

ルール機能は大きくトリガーとコントロールに分かれます。トリガーがルールの発動条件で、コントロールが条件を満たした時に行われる操作です。

f:id:ngmt83:20190827064859j:plain
トリガーの種類

朝ドラを視聴する場合の日時トリガーはこのようになります。

f:id:ngmt83:20190827064902j:plain
朝ドラ視聴のトリガー

コントロールを設定したルールは次の通りです。

f:id:ngmt83:20190827064855j:plain
朝ドラ視聴のルール

日曜以外の朝8時に、テレビの電源をつけ、1chに変更することがわかりやすいですね。このUIのわかりやすさがNature Remoを気に入っている理由の1つです。

あと1つ例をあげます。

帰宅前にエアコンをつける

夏場、帰宅時に部屋が冷えていたら最高だと思いませんか?でも帰宅時間が読めないのでタイマーでは難しい…なんてことありますよね?Nature Remoなら簡単です。

スマホの位置情報をトリガーにしたルールを設定すると最寄駅についたときにエアコンを起動できます。

f:id:ngmt83:20190827064850j:plain
帰宅前にエアコンを起動するルール

Nature Remoの良いところまとめ

  • リモコンをスマホに一本化できる
  • 遠隔地から家電を操作できる
  • 古い家電でも対応している
  • シンプルなUIでわかりやすい
  • ルール機能で便利に自動化できる

Nature Remo APIも公開されているので、エンジニアとしてはもっと色んなことができそうですね。上手く使えたらまた記事にしたいと思います。

*1:子供にテレビのリモコンを破壊されたので代わりにRemoを使っています

Dlibで顔認識できるDockerコンテナを作る

ngmt83.hatenablog.com

Pythonに学ばされたこと、DockerでDlibの環境構築をしたこと、Falconの実装例なども近いうちに記事にしたいと思います。

こちらの記事に予告*1していた通り、Dockerコンテナ上でDlib(特にface_recognition)を使うための環境構築の記事です。

Dlibとは

DlibはC++のライブラリ(OSS)です。機械学習を行う際に必要なアルゴリズムやツール群を持っています。 また、Python用のAPIも用意されているため、機械学習関連では人気のライブラリです。 詳細は公式サイトを確認してください。

dlib.net

作成した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ヶ月以上経過しています…

転職活動中にかけられて嬉しかった言葉

退職・転職エントリや、エンジニア流出に繋がるアンチパターンといった良くない例にまつわる情報はかなり出回ってきたように思います。

優秀な技術者を追い出してしまう方法 - Qiita

また、採用担当者向けのノウハウも情報が出揃ってきたように感じています。

エンジニア採用がぐんぐん進む求人票の書き方|末本充洋|note

「エンジニア採用したい」と言う割には面接が下手な企業が多すぎるという話 - paiza開発日誌

それらとは違った個人視点のポジティブフィードバック(転職活動中にかけられて嬉しかった言葉)を理由と共に書き残しておきます。

嬉しかった言葉たち

  • ぜひ一緒に働きたい
  • 転職したくないように見える
  • ブログ見たよ
  • 個人的なアドバイスなんですが〜
  • 希望する金額でオファーが出せない可能性があります
  • Xという理由でオファー金額をあげました
  • スプラトゥーン好きなの?うちにも好きなエンジニア何人もいるよ
  • うちはいつでも歓迎ですよ
  • 元同僚の言葉

ぜひ一緒に働きたい

当たり前ですがやはり嬉しいです。

さらに一緒に働きたいと考える具体的な理由が添えられているとより嬉しいです。具体的な理由としては、期待する役割や入社後に活躍するビジョン、組織文化のフィット感などがありました。

個人的な感覚ですが、単なる採用担当者の言う「内定を出したいと考えています」と、入社後に近しいポジションのメンバーが言う「ぜひ一緒に働きたい」とでは後者のほうが断然嬉しいです。

転職したくないように見える

できることなら転職せず中長期的にキャリアを形成と事業へのコミットを継続していきたい。そういった企業を希望している。

という私の意図を汲み取ってもらえたことが「転職したくないように見える」という言葉から伝わり、とても嬉しく感じました。

私の職務経歴は明らかにジョブホッパーのそれです。自業自得ではありますが、中長期的にコミットしていきたいという意図を汲み取ってもらうのは難しく、それが達成できると非常に嬉しいのです。

ブログ見たよ

単純に頑張って書いているブログを見てもらえるのは嬉しいです。また、時間を使ってブログを確認するという行為が自分という候補者に対して向き合っていることの証明でもあり、とてもありがたいです。

ブログに書いてある記事を見たからと、質疑を効率的に進めることもできたので、その面接ではとてもいい体験をしました。

個人的なアドバイスなんですが〜

「面接の評価とは一切関係ないけれど」と前置きをした上でアドバイスを受けたことがあります。シビアな言葉、優しい言葉色々ありましたが真剣に考えてもらえたからこそのアドバイスでした。転職活動における貴重なフィードバックでもあるため、自分のためになる嬉しい言葉でした。

希望する金額でオファーが出せない可能性があります

私は事前にレジュメに希望最低年収を記載していました。もちろん不足するオファーを出されること自体は望ましくありません。しかし、選考を通して想定よりオファー金額が下がる*1ことがありうると思います。その際に選考中でも早い段階で正直に共有してもらえるのはありがたいです。

詳しい事情を聞くことでフィードバックをもらえたり、場合によっては先に辞退して余計な時間を節約することができたりします。選考を最後まで終えてから何も言わず不足するオファーを出されるよりはよっぽど良いです。

Xという理由でオファー金額をあげました

金額が上がったらそりゃ嬉しいでしょ。と思われるかもしれませんが、それだけでは手離しで喜べません。自身の実力や期待値がミスマッチすることは望ましくないです。 例えば単に他社のオファーを上回るために上乗せしてくるのは少し危険だと感じます。出し惜しみして後出しジャンケンをする企業は信頼しにくいですし、過度な期待を受けて入社しては不幸になる可能性も高まります。

どういった経緯・判断をして上乗せしたかを教えてもらえるなら、それはオープンでいいと思いますし、納得できる理由であれば素直にガッツポーツできます。(心の中です)

スプラトゥーン好きなの?うちにも好きなエンジニア何人もいるよ

www.uniqlo.com

こんなTシャツを来ていたら、面接の途中で役員に言われました。フランクに会話できる雰囲気が嬉しいし、服装までしっかり見るし、役員がエンジニアメンバーのことをちゃんと把握していることも伝わりました。 スプラトゥーン仲間がいるということもシンプルに嬉しかったです笑

うちはいつでも歓迎ですよ

こんなツイート*2をしてしまった後にTwitterで繋がっていた一度内定を辞退した企業の採用担当者からメッセージを受けました。 それだけの気持ちを持って内定をくれていたこと、その後も気にされていること、どちらも光栄に感じました。また、この企業は採用活動に本当に力を入れていてすごいと感心させられました。

元同僚の言葉

先のツイートを受けて元同僚がくれたリプライはとても嬉しかったです。

「どんまい、がんばれ」のような精神的な応援だけではなく、実際の経験・知識に基づいていてとても納得感がありました。

最後に

整理してみると

  • 自分の伝えたいことが伝わること
  • 誠意を持って向き合ってもらうこと

これらが重要で嬉しく感じるのだと思いました。なんだかんだコミュニケーションの基本ですね。(ただし簡単ではない)

あと元同僚のありがたみを強く感じましたし、ジョブホッパーだろうがなんだろうが当たり前に同僚は大切したほうがいいし、SNSでもなんでも繋がり続けておきたいと思いました。

*1:私の力不足が一因でもあるでしょう

*2:良くないツイートをしてしまったと反省はしています

「実践版GRIT やり抜く力を手に入れる」Chapter3 グリットを高めるための下準備

私は徹底的にやり抜いた経験、またそれによって成功を納めるといった経験に乏しいと感じています。 そんな思いからこの本を読んでいます。

実践版GRIT(グリット) やり抜く力を手に入れる

実践版GRIT(グリット) やり抜く力を手に入れる

本の内容

この本の内容は次の通りです。

今や、人間の集中力の持続時間は金魚以下 (人間は7秒、金魚は8秒)。 そんな注意力散漫な現代において、あらゆる成功を叶える究極の資質、 「GRIT=やり抜く力」を磨く方法を伝授。

販売ページ*1より引用

Chapter3 グリットを高めるための下準備

この章では「本物のグリット」を養う下準備とその重要性について述べられていました。そして章末には読者自身も下準備に取り組んだほうが良いと勧めながら、いくつか質問が記載されていました。 せっかくなのでその質問に回答し、自分と向き合い、書き留めておこうと思います。

今挑戦したいと思っていて、実際にやってみなければあとで後悔するだろうと思う夢は?(複数可)

  • 自分が携わった代表作とも言えるプロダクトを作る
    • 業務レベルで、0に近い段階から関わって10, 100まで痛みまで含めて関わり抜いてプロダクトを作る
    • 個人開発でどんな形であれ、リリースまでやりきる

あなたは何のために毎朝起きるのだろう?(あなたの生きがいは?)

子供が何不自由することなく育つため。

コンフォート・ゾーンから出るタイミングとして、今が適切だと思うのはなぜだろう?

まだ若く、失敗してもその経験を次に活かすことが十二分にできるため。コンフォートゾーンに長居しすぎた自覚があるため。

今までにやり遂げたことの中で、最も困難だった挑戦は何だろう?

高校時代の陸上部長距離キャプテン。また、陸上競技で県内トップレベルの選手と渡り合えるまでに成長できたこと。

その困難なチャレンジを、あなたはどうやって成し遂げたのだろう?

顧問の先生の厳しい指導、合宿・試合など成長機会を手配してもらえたため。先輩と同級生に手本となるトップレベルの選手がいて、悔しさを常に感じることができたため。

あなたの成功を喜んでくれる人は誰だろう?

嫁、娘、兄弟、元同僚。

あなたの「特徴的な強み」は何だろう?VIAの公式ウェブサイトでチェックしてみよう

  1. 慎重
  2. 判定
  3. 公平

自分が「最高の状態」にあったとき、あなたの強みはどのような形で発揮されていただろう?

陸上競技におけるベストレースでは、ペース配分を慎重に行う中でも、コース・天候・自身の体調など情報を常に意識し、スパートをかけるタイミングを判断していた。 コースは頭に叩き込み、最短距離、前後との差を測りやすいポイントなどレース展開に応じた予想を立て、レース中の判断をやりやすくした。

未来の理想の自分像とはどのようなものだろう?

「Xはわしが育てた(作った)」と知人に胸を張って自慢できる何かを持ち、生き生きと働く様から子供に自慢の親だと思ってもらえる自分。

「起こり得る最高の人生」を送るためには、今後どのような障害が想定されるだろう?

  • 実績・信頼を得られず、年を重ねた先にエンジニアとしてのキャリアが難しくなる
  • 転職など逃げ癖がついてしまう
  • 日本がさらなる不景気に陥り、やりたいこと、挑戦したいことを選択できなくなる
  • 家庭を支えるための短期的な金銭が不足し、仕事を選べなくなる
  • 実家の親の介護の問題

自分と向き合ってみて

  • 何のために朝起きるのか?
  • 最も困難だった挑戦
  • 私の成功を喜ぶ人

これらは特に考えることが難しかった。どうにか書き留めてみたけれど、まだ何か違う気がしているため、もう少しゆっくり考える必要がありそう。

また、これまでのやりきった経験をヒントにGRIDを身に付けようとしているけれど、そもそもやりきった経験の少なさを克服するためにGRIDを身につけたいという鶏卵問題を感じた。

余談 VIAの公式サイトについて

日本語ページも用意されているけれども、google翻訳よりよっぽどひどい出来の翻訳の上、Survey項目はすべて英語だったので最初から頑張って英語を読んだほうがいい。

でこれからGRIDは身につきそうなのか?

わからないけれど足掻く価値はありそう。まずは本を読み進めることから。