AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

作者別: 清水幸佑

混ぜるな危険!? ユニケージとxonshの融合

Pocket

はじめに

こんにちは清水です!
この記事は、Xonsh Advent Calendar 2018 – Qiitaの6日目の記事です。

ユニケージとは

個人的な解釈ですがawkで頑張らずともユニケージコマンドを使用することで比較的楽にshell芸ができます。

一例ですがこんなことができます。

このファイルの2列目の値だけ欲しい。
awkで書くとこんな感じ。

ユニケージコマンド(self)を使用するとこのようにかけます。

僕はまだユニケージ初心者なのでより詳細な情報は以下の記事を参照してください。

xonshとは

Pythonで作られたクロスプラットフォームのUnixライクなシェル言語とコマンドプロンプトです。
Pythonの対話モードとUnixコマンドが合体したみたいなものです。

個人的にshellなるべく書きたくないマンなのでPythonで書けるのは衝撃でした。

pipで入ります。使用するときはターミナルでxonshと打つと起動します。

ライブラリも使用できます

詳しくはこのアドベントカレンダーのリーダーである@vaaaaanquishの記事をご覧ください。

今回紹介すること

今回は謎技術ユニケージとxonshを組み合わせた「ひょっとしたら、これ使えるかもしれない(笑)」的なものを紹介していきます。

selfとのコラボ

先ほど使用したselfコマンド。このコマンドはawk '{print $1 $3}'のように出力したいフィールドを指定することでそのフィールドを表示します。

xonshと組み合わせる

いつ使うかよくわかりませんが、まぁ便利そう(pandas使ってもいいんですけどね)

殺人的なワンライナーも書けます。

mdateとのコラボ

こののコマンドは開始日から終了日を全てスペース区切りで表示します。
mdate -e <開始日(yyyymmdd)> <終了日(yyyymmdd)>

xonshと組み合わせる

split関数がいい感じにスペース区切り文字列を分割してくれるので20181201から20181231までのリストを生成できます。これは割と使えるのでなないかと個人的に思っています

dayslashとのコラボ

説明するよりも見た方が早いです。

いい感じに/を入れてくれます。 1はフィールド指定です。

xonshと組み合わせる

date_listから受け取ったdateをdayslashで/を入れてslash_dateに格納します。\nが入ってしまうのは勘弁。

Jupyter Notebookで使用する

いつものようにJupyter Notebookを使用して新規ファイルを作成しようとしたら,Xonshが入っていることに気付く。
どうやらpip install xonshするだけでJupyterのカーネルに追加されるそうです。

ユニケージコマンドは果たして使用できるのか?

実行できた!どうやらローカルのコマンドも使用できるようです。

ちなみにGoで作成したコマンドも使用できました。

Pocket

Go言語 初心者向けハンズオンに行って来た

Pocket

はじめに

こんにちはハンズラボの清水です。
株式会社メディアドゥさんのGo言語 初心者向けハンズオンに参加させていただきました。

清水の最近の経験言語

  • Python: 大学からの付き合い(軽く機械学習の真似事ができるくらい)
  • javascript : Node, jQuery 研修でやりました
  • PHP : 業務で使ってます

Go言語の知識

  • 関数を使ったら戻り値とerror値が返ってくる
  • if err != nil をとりあえず沢山書くらしい
  • メルカリさんが使っている

会場に到着


サイバー感すごい!

手塚治虫作品が沢山!

勉強会開始

資料


事前にスライドが公開されているので手元のPCでも見ながら確認できるのでとてもよかったです。

練習問題がある

私も勉強会には月2~3回ほど参加していますが練習問題がある勉強会は初めてでした。
ハンズオン形式の勉強会は多くありますが、練習問題があることによって、自分で考えて実装するのでより意欲が湧いて来ます。(スライドの後半に課題があります)
資料:Go言語でシンプルなWebAPIサーバーを実装する
練習問題は全部6問あり、資料を参考に解いていきました。時間制限もあったので全部解くぐらいの意気込みで挑戦したら、思いの他1問目で手こずってしまい3問目までしか解くことができました。(相当ググりまくっていました)
そして、想像通り if err != nil を結構描きました。

一部を紹介

これは1問目のコードの一部ですが、strconv.Atoiを使用して文字列を数値に変換するのですが数値だけでなくerror値も帰ってくるのでGoではこのようにエラーハンドリングを行うようです。

勉強会を終えてGo言語に私が思った感想は

  • ところどころC言語的なものを感じる(変数宣言、ポインタとか)
  • go get便利
  • 色々と覚えることが多いが学ぶのが楽しそう
  • 並列処理やってみたい(goroutine, channel)

最後に

今回の株式会社メディアドゥさんの勉強会はとても楽しく、練習問題で自分がどこまで実装できるのかといった挑戦もあるので次の学習のきっかけになる勉強会でした。
機会があるのであれば次回も参加したいと思っています。

ハンズラボはエンジニアを募集中です。 https://www.wantedly.com/companies/hands-lab

Pocket

見よう見まねで機械学習をやってみた(ポケモン編)

Pocket

こんにちは!新卒の清水です。
最近、勉強または趣味でやっていたPyQの機械学習・初級をやり終えたので自分でもやってみました。

題材

以前Kaggleのチュートリアルはやったことはありますが、用意されているデータの説明がやはり英語だったのでそれなりにハードルがありました。
なので今回はネットを放浪中にポケモンのcsvデータがあったので、これを使用して行きたいと思います。

何をする?

個人的にみずタイプのポケモンが好みなのでステータスからみずタイプかどうか判定しようと思います。

環境

OS: macOS High Sierra 10.13.5
Python: 3.6.5
scikit-learn : 0.19.1
jupyter notebook

とりあえずデータをみてみる

pandasを使用してcsvデータを読み込みます。

ポケモンが909体(メガ進化も含む)なのでどうやら第七世代(サン・ムーン)までのデータのようです。

データの選別

ポケモンの各ステータス(HP, こうげき, ぼうぎょ, とくこう, とくぼう, すばやさ)を説明変数X、タイプを目的変数yとして学習させていこうと思います。
みずタイプであるのか、そうでないのかで判断したいのでみずタイプのポケモンには1をそうでないものには0を付与します。

関数を用意

applyメソッドを使用すると指定した列データ全てに関数を実行してくれます。
データをみてみましょう。

みずタイプが含まれている行を出してみました。みずタイプには1が振られています。

学習させる

もちろんscikit-learnを使用して学習させます。
今回は目的変数が2値なのでロジスティック回帰で行います。

トレーニングデータとテストデータの割合は7:3で分割します。

C = 1000としていますがこのCはハイパーパラメータと呼び、Cの値が大きすぎるほど過学習しやすくなり、小さすぎると学習にならない問題があります。
今回はCの値を0.01, 0.1, 1, 10, 100, 1000とパラメータを変えて影響があるか確認し、特に影響がなかったので1000のまま放置してます。

およそ87%の割合で判定することができました。
ほぼ自分一人の力で機械学習をしたのは初めてなのでまぁまぁいいのではないかと思います。

考察

判定に失敗した例としてオーダイルをみずタイプではないと判定しました。
そんなにポケモンを知らなくても、見れば多くの人はみずタイプだろうと判断するでしょう。

しかし、オーダイルの進化前のアリゲイツはみずタイプと判定しました

改善案としてはステータスの族ごとに学習をさせることで改善することはできると思います。
ですが、より高い精度を求めるならポケモンの画像データを使用するのがいいと思いました(全体的に青っぽいとか)。

最後に

ポケモンの知識がないと難しいところがあるのでやはりデータのリサーチは必要だということを感じました。
全体的な機械学習の流れは覚えられてきたのでこれから色々と試していきたいと思います。

Pocket

FlaskのAjax通信でつまずいた話

Pocket

こんにちは2018年度新卒の清水です!
新人研修でHTML, CSS, JavaScriptを使いwebアプリを作っています。
私はフロントをあまり書いてこなかったので心機一転して学習しています。
ちなみに、学生のときサーバサイドをやってました(JavaとPythonはよく書いてました)。

やりたいこと

  • ブラウザをリフレッシュしてもデータが残るようにしたい
  • ローカルストレージはデータ構造が複雑になりそうなのでRDBでやりたい
  • サーバサイドを書きたい(できればPython)

 

方針

  • Ajax通信を使いロード時にデータを取得
  • RDBはMySQLを使用 理由:以前よく使っていた、SQL書きたい
  • サーバサイドはPythonのflaskを使用 理由:APIを作ったことがある

 

コード

Python

バージョンは3.6.5です
flaskをインストールします

MySQLからデータを取得するところは省きます

とりあえず curlコマンドでjsonが取得できるかテストします

ちゃんと取れました

HTML JavaScript

HTML

JavaScript

ボタンが押されたらajax通信をしてjsonを取得します
見た目はこのように

いざ実行

Chromeのデベロッパーツールを使用してテストを見ていきます
おや?エラーを吐きました

翻訳すると

なんだかよくわかりませんね

Access-Control-Allow-Origin + flask でググっていると以下のサイトを見つけました
Javascript – No ‘Access-Control-Allow-Origin’ header is present on the requested resource

どうやらPython3系以降は pip install flask-corsでflask-corsを使用して解決するそうです。
私はpip3 install flask-corsで入れました。

いざ実行(二度目)

解決していない…なぜだ

前記したサイトにはPython2系の解決法も記載されていたのでこちらもテスト

いざ実行(三度目の正直)

ついに成功!
なぜPython2系の解決法で成功したのかは不明

結局何が問題だったの?

  • Access-Control-Allow-Originがサーバ側で許可されないないのが問題だった
  • Access-Control-Allow-Origin', '*'を設定することにより、任意のドメインがサイト間でアクセスできるようになる

だんだん調べて行くとSame-Origin Policy(同一生成元ポリシー)やCORS(Cross-Origin Resource Sharing)制限などのネットワーク用語が出てきたので理解できるよう努力していきたいと思っています。

Pocket