Author: Igarashi

  • DockerでKaggle環境を構築して機械学習に入門してみる

    DockerでKaggle環境を構築して機械学習に入門してみる

    案件で機械学習の知識が必要になりましたのでDockerで環境を構築し、試してみようと思います。 以下の手順で進めます。 Dockerでの環境構築 Kaggleから訓練データ、テストデータをダウンロード データの整形 予測結果の出力 私は機械学習についての知識が皆無ですので間違っている箇所もあるかもしれません。。。 環境構築 環境はDockerで構築します。 Kaggle公式のDockerImageがあるらしいのでそちらを利用します。 docker-compose.yml kaggle/pythonでなくpythonのみのイメージでも良いのですがkaggle/pythonであればpandasなどのライブラリもインストール済みなのでオススメです。 これで環境構築は完了です。 Kaggle Kaggleは機械学習、データサイエンスのコミュニティサイトです。機械学習のための「訓練データ」と予測を分析する「テストデータ」をダウンロードすることができ、それを元に機械学習で結果を導き、Kaggleに提出するとScoreが表示されます。 今回は機械学習初心者向けである「タイタニック号の生存者予測」を試してみようと思います。 まず以下のページから訓練データである「train.csv」とテストデータである「test.csv」をダウンロードします。 https://www.kaggle.com/c/titanic/data# それぞれ中身を確認してみます。 乗客ID, 生存可否, Passenger’s class, 名前, 性別, 年齢, 乗船した兄弟/配偶者の数, 乗船した親/子の数, チケット番号, 運賃, 船室番号, 乗船港となっています。 Passenger’s classは1, 2, 3の数値データで1がファーストクラスとなる船室クラスの数値のようです。Embarkedは乗客が乗船した港で、C, Q, Sの3種類、それぞれCherbourg, Queenstown, Southamptonとなります。 test.csvを確認してみるとSurvivedのデータがありません。train.csvのデータで機械学習モデルを作成し、test.csvの乗客の生存可否(Survived)を求める。という課題のようです。 データの整形 欠損しているデータもあり、そのままでは使用できないので平均値などで埋めます。そもそもどのくらい欠損しているのか見てみましょう。 Age, Cabinが多く欠損していますがそれ以外のデータは問題なさそうです。 欠損値を埋める Age(年齢)の欠損値を埋めます。とりあえず中央値を使うように実装してみます。 medianで中央値を得ることができます。 これでAgeの欠損値は埋まりました。CabinとEmbrakedも欠損していますが今回は使用しないのでこのままで進めます。 数値化とtest.csvデータの整形 次にデータの整形を行います。今回使用する「決定木分析」では文字列を扱うことができませんので性別のデータを数値に変換します。 male(男性)を0、female(女性)を1に変換しました。 test.csvのデータも同様に整形します。 test.csvについてはFareデータも一部欠損していましたので中央値で埋めています。 決定木分析…

  • Dockerでvimを使う方法(Python有効化も)

    Dockerでvimを使う方法(Python有効化も)

    オンプレのサーバにVimをインストールする際に、ビルド手順(主にconfigure内容)を忘れてググることが多いので自分の備忘録として残したいと思います。 また、一口にVimと言ってもVim8、NeoVimをyumやらaptやらでインストールするパターンと、ソースコードからコンパイルするパターンがあると思いますので、今回はDockerコンテナ上で以下の4パターンを試してみたいと思います。 Vim8をパッケージマネージャでインストールするパターン NeoVimをパッケージマネージャでインストールするパターン Vim8をソースからビルドしてPython2, 3を有効にしたパターン NeoVimをパッケージマネージャからインストールしてPython2, 3を有効にしたパターン Dockerコンテナのベースイメージは軽量化のためAlipneLinuxを使用していますがCentOSでもUbuntuでも手順はほぼ変わらないと思います。 1. Vim8 まずはVim8のみ、Pythonを有効にしていない状態であれば以下のように簡単にインストールすることができます。 Dockerfileを用意したらbuildコマンドを実行し、コンテナを起動します。 コンテナを起動したらvimを起動できることを確認します。 2. NeoVim 次にNeoVimを試します。こちらもVim8同様、簡単にインストールすることができます。 先ほどとほぼ同じ手順でNeoVimがインストールできます。 3. Vim8 + Python 次にプラグインを使用するためにPythonを有効化したVim8をインストールします。先ほどの方法でもPython3は有効になっているのですが一応Python2も有効にしてみます。Dockerfileは少し複雑になります。 まずVim8のソースコードをcloneするためのgitや、ビルドするためのgccなど必要なパッケージをインストールします。 その後、git cloneしてcdでディレクトリに移動してからビルドしますがDockerでは以下のようにRUN cd vimとしてもconfigureが実行できません。 Dockerはコマンド1つ毎にカレントディレクトリに戻りますのでcdした後に&&で続けてビルドを実行しないとカレントディレクトリに戻って実行してしまうのでエラーになります。 configureが終わったらmake installして完了です。 コンテナを立ち上げてVimを確認します。 Vimの確認は以下のコマンドです。 +pythonとなっているのでPython2, Python3が有効になっています。 Vimを起動して確認してみましょう。 ノーマルモードで以下のコマンドを実行して1が表示されればPythonは有効になっています。 4. NeoVim + Python 最後にNeoVim+Pythonを試します。Pythonをインストールし、pipでneovimパッケージをインストールするだけですので前述のVim8ほど複雑ではありません。 Python3のpipはneovimをインストールする前にupgradeしないと怒られるのでupgradeしてからneovim installとしています。 こちらもコンテナを起動して確認します。 NeoVimはヘルスチェックができるので起動後、ノーマルモードでヘルスチェックコマンドを実行しましょう。 Python2, Python3のどちらもOKとなっているので有効であることが確認できました。 まとめ DockerでのVimのインストール方法をまとめてみました。Dockerを使う場合はファイル共有にしてローカルのVimで開発するのでDocker上でVimを使用することは少ないのですが、Dockerfileを作成しておくことは無駄ではないかな、と思い作成してみました。 Docker上で開発を行うVimmerの役に立てれば幸いです。 今回作成したDockerfileはこちら。https://github.com/aizulab-igarashi/docker_vim

  • [Go + Travis]Go言語でTDDを体験してみる

    [Go + Travis]Go言語でTDDを体験してみる

    テスト駆動開発(TDD)に興味があり、Goのテストも勉強中でしたのでCIを利用してモダンな開発環境を試してみようと思いつきました。 DockerでGo環境を構築し、Githubでソース管理、Travis CIでテストを実行してTDDする、という構成で試してみます。 仕様するツール、サービス Docker Github Travis CI ディレクトリ構成 Docker まずはdocker-composeでGo環境を作成します。 docker-compose.yml これでGoが使用できる環境となりました。 テストを失敗させる まずはテストを失敗させるところまで実装します。 今回はフィボナッチ数を求める関数を作成してテストしてみます。 sample_test.go 8のフィボナッチ数は21なのでそれ以外の数値が返ってきた場合にはfailedとなるテストを作成しました。 テストが通るようにmain.goとsample.goも実装します。 main.go sample.go 現状は受け取ったintを返却しているだけなのでテストは失敗します。 ローカルで実行してみましょう。 sample_test.go:9 failedとなっているのでテストが失敗していることがわかります。 Travis CI 続いてTravisでのCI環境を作ってみます。 まずはTravisにアクセスしGithubアカウントと連携します。 アカウントが連携できるとリポジトリを選択できるので、今回使用するリポジトリにチェックをつけます。 次にTravisの設定ファイルを作成します。 .travis.yml 内容はほぼ公式のコピペです。。。 これでTravisを使用する準備ができたので、変更をGithubにpushします。 pushが完了するとTravisでテストが実行され以下のように失敗が確認できます。 テストを成功させる 次にテストが成功するように関数を実装します。 sample.go フィボナッチ数で調べるとこの数式が出てくるのでそれをそのまま実装した形です。 これをGithubにpushしてTravisを確認してみます。 テストの成功が確認できました。 まとめ 今回はDocker,Github,Travisを使用しましたが、この構成でもかなりシンプルな環境と思います。 本番環境にデプロイするためにKubernetesを利用したり、Gitにpushする前に(pre-push)テストを実行するように設定したり、など、身につけるべきスキルはたくさんありますので少しずつ学んで最適な開発環境にしたいです。

  • [Golang + Docker]GinをDocker上で試してみる

    [Golang + Docker]GinをDocker上で試してみる

    先日、社外のエンジニアと話す機会がありました。その中でGo言語の話になり、Go言語に対しての良い印象を受けたのでそろそろバックエンド開発をGo言語にシフトしようかな、と思いました。 私はGoほぼ未経験ですので今回はDocker上にGo言語環境を容易し、Webサーバで「HelloWorld」を返す程度のものを作成してみようと思います。 ディレクトリ構成 ディレクトリの中身は以下の2ファイルのみです。それぞれ見ていきましょう。 docker-compose.yml Dockerイメージとしてgolangの最新版を使用します。 これだけでGo言語環境が使用できます。 ポートフォワードの設定は8080、コンテナ名は任意ですが今回はgo_containerとしました。 また、ディレクトリ直下のファイルをすべてコンテナ内の/go以下に配置しています。 実装はローカルのVim上で行い、実行をDockerコンテナ内で行う形で進めます。 main.go main.goを実装していきます。 その前に今回使用するGoパッケージをインストールします。 まず以下のコマンドでDockerコンテナを起動してアタッチします。 無事コンテナに入ることができたらGoのWebアプリケーションフレームワークのGinをインストールします。 インストールが完了したらmain.goを実装していきます。 git.Defaultでrouterを作成し、 routerにGETの/helloAPIを追加します。レスポンスは「Hello World!!」とします。 最後にポート8080を指定して起動します。 起動が確認できたらブラウザでlocalhost:8080/helloにアクセスしてみます。 レスポンスが確認できました。 まとめ Dockerを利用することで環境構築に時間をかけずにGo言語へ入門することができました。まずはGinを利用してCRUDのAPI開発を行なってみて少しずつGo言語での開発に慣れていきたいと思います。

  • ElmでBootstrapを使う[elm-bootstrap]

    ElmでBootstrapを使う[elm-bootstrap]

    以前にElmで簡単なTodoリストを作成しました。 【elm】2019年にわざわざ学ばなくてもいい言語でTodoアプリを作る 今回はこのTodoリストの見栄えを良くしたいと思うのですが私はあまりスタイルが得意ではありません。。。ですのでBootstrapを利用してスタイルを整えたいと思います。 Elmにはelm-bootstrapというBootstrapのパッケージがありますのでこちらを使います。 http://elm-bootstrap.info/ インストール パッケージをインストールします。 インストールコマンドはelm installなので以下のようにパッケージ名を指定してインストールします。 インストールが無事完了するとelm.jsonにパッケージ名が追加されているかと思います。 Button まずはボタンから。 View.elmを編集します。 以下を追加してBootstrapパッケージをimportしましょう。 次にview関数のdivタグを修正します。 CDN.stylesheetを追加し、ボタンをBootstrapのButtonに変更しています。 Buttonの記述は少し複雑ですがBootstrapを使ったことがある人であれば意味は通じると思います。 インラインスタイルなどはonClickと同じようにButton.attrsに追加することで反映されます。 ElmReactorを起動して結果を確認しましょう。 http://localhost:3000/src/Main.elm にアクセスし、結果を確認します。 ボタンが見慣れたBootstrapのものに変更されています。 Table 次にTableをBootstrap化します。 先ほどと同じようにまずはimportを行います。 テーブルを表示する関数はviewTableと、tbodyを表示するviewTrに分けていますので、まずはviewTableから変更します。 Buttonの時と同じようにTable.tableとし、BootstrapのTableを使用します。 optionとしてstripedとhoverを設定していますが不要であれば削除しましょう。 ほぼElmの記述と同じですのでここで詰まることはないかと思います。 続いてviewTr関数です。 こちらもほとんどElmの記述のままです。 変更が完了したらElmReactorで確認します。 Bootstrapのテーブルが反映されています。 まとめ ElmでのBootstrap適用についてご紹介致しました。 elm-bootstrapを利用することでElmの記述からかけ離れることなく、Bootstrapを採用することができると思います。 ぜひ試してみてはいかがでしょうか。

  • [translate-shell]コマンドラインからGoogle翻訳を使う

    [translate-shell]コマンドラインからGoogle翻訳を使う

    私はvimを使ったり、gitのCLIを使ったり、ターミナルで作業することが多いのですが、関数名に使用する英単語が合っているか調べたい時があります。 Google翻訳で確認したいのですが、それだけのためにブラウザを起動するのは億劫なのでコマンドラインから翻訳できるtranslate-shellを使うようにしています。 https://www.soimort.org/translate-shell/ インストールと使用方法 MacではHomebrewでインストールできます。 インストールが完了したらtransコマンドが使用できます。 transコマンドはオプションとして言語と単語が指定してGoogle翻訳を行います。 試しに会津ラボの「ラボラトリー」という単語を翻訳してみましょう。 {en=ja}とすることで英語から日本語への翻訳になります。もちろん逆も可能です。 まとめ 長文の翻訳はできませんがスペルのチェックなどのちょっとした用途にはブラウザを開く手間が減るので使い勝手が良いです。普段ターミナルで作業している方はぜひ試してみてください。

  • [Mac]便利なopenコマンドをご紹介

    [Mac]便利なopenコマンドをご紹介

    Mac固有のopenというコマンドをご存知でしょうか? このコマンドは汎用性が高く便利なコマンドですのでご紹介します。 フォルダ、ファイルを開く まずはフォルダについて、cdコマンドでフォルダを移動して作業している中で、「このフォルダをFinderで表示したい」という時があります。せっかくターミナルでその作業フォルダに居るのにFinderを開いてフォルダを掘り下げていくのは二度手間です。そんなとき、openコマンドが役に立ちます。 以下のように作業フォルダ、もしくはフォルダのパスを指定してopenコマンドを実行するとFinderで開くことができます。 さらにopen対象をファイルにすれば適切なアプリケーションでファイルを開くことができます。 URLを開く フォルダ、ファイルでも十分便利ですが、URLも開くことができます。 URLを指定すればブラウザを起動し、そのページを開きます。私はあまり使いませんが一応ご紹介まで。 アプリケーションを開く 前述の通り、txtファイルを指定することでテキストエディタで開くことは出来ましたが、「別のエディタで開きたい」ということもあると思います。 その際はopenコマンドに-aオプションを指定することでアプリケーションを開くことができます。 エイリアスを設定する コマンドラインからCotEditorでテキストファイルを開くことはできましたが、毎回CotEditorのパスを入力するのは手間ので、エイリアスを設定しましょう。 ホームディレクトリにある.bashrcにエイリアス設定を追加します。 これでエイリアスの設定ができましたのでcotコマンドでCotEditorを開くことができます。 まとめ いかがだったでしょうか。私はマークダウンエディタで開くためにTyporaのエイリアスを設定したり、VSCodeのエイリアスを設定したりしています。非常に便利ですのでMacをお使いのユーザーはぜひお試しください。

  • JWT(JsonWebToken)を使った認証付きGraphQL APIを作る

    JWT(JsonWebToken)を使った認証付きGraphQL APIを作る

    以前にGraphQL+MongoDB+graphql-composeという構成のGraphQL APIの実装についてご紹介させていただきました。 この構成のGraphQL APIにユーザ認証が必要になりましたのでJWT(JsonWebToken)を使った認証機構を追加しました。 JWT認証を作る JWTのパッケージをインストールします。 auth.jsを作成しJWT認証を実装していきます。 内容を見ていきます。まず、/login以外のURLで認証が必要になるように設定します。 JWTをリクエストヘッダに含んだ状態でアクセスしてもらうのでヘッダにトークンが存在しない(もしくはフォーマットが違う)場合はフォーマットエラーを返します。 ヘッダにトークンが含まれていればトークンをチェックして、可否を返します。今回は”secret”をシークレットワードとしています。 server.js server.jsを修正します。 先ほど実装したauth.jsをimportしましょう。 /loginをPOSTで設定し、リクエストパラメータ(user_id, password)を受け取って認証します。 今回はサンプルなので固定値でチェックし、ログインできればJWTを作成して返却します。 authentication(app)をgraphqlの前に追加することで/graphqlはログインが必要となります。 サーバを起動しPostmanからログインAPIを叩いてみますが・・・。 パラメータが取得できません。。。 bodyParser 毎回忘れるのですが、bodyParserのurlencodedを設定しないとパラメータ取得ができません。以下をserver.jsに追加します。 もう一度Postmanで試します。 これでログイン認証に成功し、JWTを取得することができました。 取得したJWTをヘッダに設定してGraphQLのQueryをPOSTしてみます。 無事、データを取得することができました。 ヘッダを設定しない場合は以下のようにエラーとなりますので、これで認証付きGraphQL APIの完成です。 まとめ GraphQLにアクセスする前にログインAPIを叩くのではなくGraphQLで認証する方法もあるようです。 そちらについても機会があれば検証を行い、記事にしてみたいと思います。 今回使用したコードはこちらです。 https://github.com/aizulab-igarashi/graphql_compose_auth

  • ログインShellをfishにして作業効率を改善する

    ログインShellをfishにして作業効率を改善する

    こんにちは、ソリューションの五十嵐です。 ログインShellとしてzshを使用しているのですがイマイチzshを使いこなせておらず、bashと比べても作業効率が良くなっているようには思えませんでした。 そんな中fishの記事を拝見して興味を持ったので試してみました。 ちなみにGoogleでfishについて調べるとfishがなんとなく良いものだとわかります。 インストール 私はMac環境ですのでHomebrewでインストールします。 ログインShellに設定できるように/etc/shellsの末尾に/usr/local/bin/fishを追加します。 以下のコマンドでログインShellに設定します。 ターミナルを開いてfishになっていればOKです。 プラグイン管理 プラグイン管理のためFishermanをインストールします。 他にoh-my-fishというプラグインマネージャもありましたが、zshの時に使用していたoh-my-zshがイマイチ使いこなせていなかったので似た名前のこちらは選択肢から外しました。oh-my-zshとの関係性は無いと思いますが名前が受け付けなかったので。。。 テーマ変更 デフォルトでも良いのですがせっかくなのでテーマを変更します。 テーマは以下のページから選びましょう。 https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md 選んだテーマをfishermanでインストールします。 デフォルトでPowerlineフォントが有効になっているので以下のように表示が崩れます。 Powerlineフォントをインストールしても良いのですが元々使用していたRictyフォントを使用したかったのでPowerlineフォントを無効にします。 このままでは再起動時に元にもどってしまうので.config/fish/fish_configに追加しましょう。fish_configが存在しない場合には作成してください。 テーマについては以下のコマンドを実行することでブラウザから変更することもできます。 使用感 fishはコマンド入力中に履歴から補完してくれる機能があります。試しに以下のような階層ディレクトリに対してcdコマンドを実行してみます。 cdのパスに対しての補完でしたがコマンドのオプションなども補完してくれるので以下のようにdockerコマンドのオプションも補完してくれます。dockerコマンドにシンタックスハイライトが効いているのもポイントですね。 このシンタックスハイライトは以下のようにコマンドが正しいかどうか実行前に判断することができます。 まとめ 実際にfishを使ってみてかなり良い印象を受けました。bashやzshよりも情報が少ないので設定でつまづくかな、と思ったのですがそもそも設定しなくても使えるほど優秀なので杞憂でした。 POSIX互換が無いというところで問題なることがあるかもしれませんがzshよりは使いやすい印象ですので、しばらくはfishをログインShellとして使ってみようと思います。

  • [Mac]環境変数PATHを削除する

    [Mac]環境変数PATHを削除する

    こんにちは、ソリューションの五十嵐です。 普段はMac純正のターミナルアプリを使用していますが、Hyperというターミナルアプリがおしゃれで気になっていました。 https://hyper.is/ 試しにインストールしてみましたが、Hyper上で起動したvimが重い。。。 調べたところによると「.bash_profileで不要なexportが多くなるとlsコマンドが遅くなる」との記事を発見。 これが原因かも、と思いPATHを確認・・・ こ、これは・・・ ちょっと試してみようと思ったGoやらScalaやらRustやらNimやらのPATH一度だけ使ったAndroidSDKのPATH何故か残っているrvmのPATHなどなど、明らかに不要なPATHがひしめき合っていました。 これが原因とは断定できませんが気持ち悪いので一旦すべてクリアしようと考えました。 まずは.bash_profileでexportしている部分をすべてコメントアウト。再度source .bash_profileして結果を確認します。 まだ少し残っていますね。 Rustのcargo、ImageMagick、Mono、Wireshark、そしてrvm /etc/paths.dを参照してみます。 git以外は必要なさそうなので削除。 さらに/etc/manpaths.dも同様に。 再度確認。 cargoとrvmが生き残り・・・。 Rust Rustをアンインストールして確認 まだ残っているので.bash_profileに以下を追加してPATHを初期化 Rustは消えましたがrvmが残りました。。。 rvm まずは.rvmを削除してみることに。 まだ残っているので、「アンインストール時に不備があり、PATHだけ残ったのでは?」と考えました。そこで、もう一度rvmをインストールしてからアンインストール。 変わらず。。。 もう一度.bash_profileを見返してみました。 ・・・これは? 完全に見落としていました・・・。.profile内を完全に削除して再度確認。 やっとPATHが初期化されました。 まとめ PATHを掃除してみましたがHyperの動作についてはあまり変化がありませんでした。それでもPATHが綺麗になったのでひとまずは満足といったところでしょうか。今後はDockerでそれぞれ開発環境を用意し、ホスト環境を汚染しないようにしようと思います。 今回記事にまとめたPATHについては私が入社した当初、知識も経験も無い状態でネットの情報をそのまま.bash_profileにコピペしたりexportコマンドを実行したことが原因です。 黒い画面が苦手で、とりあえずコマンドをコピペしている方もいると思いますが、私のようにPCが汚れていくことになりますのでexportに限らず、コマンドを理解した上で実行しましょう。