Goalist Developers Blog

Study tips for JLPT N2

What??? You may ask, this is a developer blog and what JLPT N2 has to do with it.

Well, you'll agree with the fact that communication is of utmost importance at any workplace... don't you?
However good you are at your work skills, it will be of no use if you fail to communicate properly with your colleagues.

So that being said, I would like to share my study techniques to learn Japanese and prepare for JLPT N2 examination in a fun way.

My name is Vivek and this blog post is intended for those who are preparing for JLPT N2
(Japanese Language Proficiency Test N2) (日本語能力試験 N2)

Let's get started...

I believe following are the major types of communication

f:id:vivek081166:20181129130903p:plain

f:id:vivek081166:20181129161634g:plain Verbal f:id:vivek081166:20181129161631g:plain Non-Verbal f:id:vivek081166:20181129161620g:plainWritten


If you observe carefully more than 70% of the time you need some language to communicate. Whether you write something or speak of/about something.
So, to sum up here... I would say
Language is essentially a means of communication among the members of a society. You need to master the language (in which you are communicating) to communicate effectively.
In my case, being in Japan IT industry for more than 4 years now, I had to learn Japanese for my work. And you must agree with this.. it is one of the most difficult languages in the world.

During my Japanese Language study I tried various method and tools and here I would like to share those with all of you.

Learn using Memrise

www.memrise.com

I absolutely love this tool!

The most difficult part of learning any language is to memorize alphabets and vocabulary. Memrise as per its name, it helps to memorize things which you have to learn by heart.

It uses mems to help you form vivid, sensory memories. It tests you continuously, always making sure to give your brain just the right workout. It also reminds you of what you've learned at scientifically optimized times so your memories are always growing stronger and never forgotten.

I'm currently undertaking the following courses on Memrise

1) JLPT N2 from Memrise Beta

www.memrise.com

By the time you visit this course, it would have been released in full version but currently, it is βeta version but still the best.

2) JLPT N2 Target 2000 Vocabulary

www.memrise.com

The previous course has detailed words but this short course will help you study and revise only specific words for the examination. Keep this course in mind and soon I'll share with you a trick to effectively use this course.

3) N2 Kanji

www.memrise.com

It will be hard to stick to this course but if you are patient, eventually you'll master kanji for everyday use in Japan.

Learn using YouTube

You read it right! Learn using YouTube.
Imagine how great it is to learn from good teachers by watching video anywhere anytime without even have to go to School.
I'm a visual learner and hence YouTube has always been a great place for me to learn anything.

I would like to recommend the following courses to prepare for JLPT N2 exam from Nihongo no Mori.
And again, believe me, you need not go to any School if you take these video courses

www.youtube.com

Believe me you need not to waste money on any school if you watch these videos and learn from them.

1) VS JLPT N2 Grammar

www.youtube.com

She is my favorite teacher till now... her explanation will help you remember and learn Japanese Grammar intended for JLPT N2 exam.

2) Kanji N2

www.youtube.com

Here 覚え方 of (Logic to remember) Kanji taught by 先生 (teacher) will help you remember Kanji fast and never forget... it's fun :)

3) JLPT N2 ことば

www.youtube.com

Remember I told you keep JLPT N2 Target 2000 Vocabulary - Memrise course in mind. You can use this video lecture combined with Memrise course and your efforts to memorize vocabulary will be drastically reduced.

4) 耳から覚える語彙 N2

www.youtube.com

In two hours you will be going on a ride of 1200 words with examples... isn't it awesome!!


Well, folks that all I have for now...
See you soon with some technical blog till then
Happy Learning... :)

Play Frameworkでテストを書く

チナパです! 最近新しいことを学んだので、書いてみようかなと思いました。

なぜテストを書く?

f:id:c-pattamada:20181129134919p:plain
Why do we need tests...?

複雑なプログラムを作るほど、ディバッグ、テスティングも大変になるのが一般的に知られてます。今日作ったソフトを6ヶ月間後編集しようとしますと、なかなか何が何に影響されるのを覚えるのも大変だと思います。

この二つの問題を対応するのに、テスティングをある程度まで(頑張ったら、完全に?)自動化できます。今日はサーバー側の話にします。

ご存知かもしれませんが、ゴーリストではPlay Framworkをよく使ってますので、Playの環境でやってみました。便利なHelperクラスもいくつかありますので、割と簡単にできるかと思います。

なので、Play Frameworkの基本知識が持ってる方が理解するのに楽だと思いますが、少しだけその辺も説明しますので、ご安心ください。

手順

まずは、PlayのProject Directoryを見てみましょう。(私はIntellij IDEAを使ってますが、sbtターミナルが使える状態にできますと特に環境が影響しないと思います)

f:id:c-pattamada:20181129130951p:plain
Play project directory

こちら、testというdirectoryが見えますが、存在してない場合は作成してください。その中にcontrollersのパッケージを作成しましょう。(ちなみに、sbtのスタータープロジェクトを使用する場合に、ここまですでにできているかと思います。)

コード説明

public class HomeControllerTest extends WithApplication {

    @Override
    protected Application provideApplication() {
        return new GuiceApplicationBuilder().build();
    }
}

このようなクラスを作成しましょう。HomeControllerTestではなくても、クラス名はなんでもOKです。

provideApplication()はこのクラスにPlayのApplicationが使えるようになるためにあります。 なぜ必要なのか?

オッケー、このあたりで、一体何を使用としているのかを説明しましょう。

多動でwebサーバーのテストを行う時に、どうしますか?例えば、

http://localhost/my/test/route

がちゃんと動いているかを確認したい場合は、ブラウザーや、Postmanなどのツールを使って、リクエストを送って結果を確認しているかもしれません。

その行動を真似するコードを書きます。簡単に、行動がコードにしましょう。ね。

いかのメソッドを作成しましょう。

    @Test // 1
    public void testMyTestRoute() {
        Http.RequestBuilder request = new Http.RequestBuilder()
                .method(GET)
                .uri("/my/test/route"); // 2

        Result result = route(app, request); // 3
        assertEquals(OK, result.status()); // 4
    }

1) @Testがテストを実装する時に、何メソッドを確認すれば良いのかを知らせるannotationです。

2) HttpRequestBuilderを使って、appの/my/test/routeにGETリクエストを投げてます。(ちなみに、GETがヘルパーコンスタントです)

3) サーバーのレスポンスをもらいます。これはPlayのルーターを使って、どこかのコントローラのメソッドをテストしています。

4) Httpレスポンスがstatusコードを持つ、ここで、そのstatusが200なのかを確認しています。assertEqualsはJUnitのテスティングフレームワークのメソッドです。二つのパラメーターが同じではない場合に、テストが失敗します。

上記のメソッドでこのようなことをテストできます。宛先のuriがちゃんと壊れずにうまく行きますか?(バグが出てる場合に、result.status()はおそらく500<=なので、ここでテストが失敗します。)

複数な@Testメソッドをもちろん作成した方が良いです。 例として、

1)ユーザー登録成功のテスト(ちゃんと登録できる確認)

2)ユーザーが登録で誤ったリクエスト(例:すでに登録したユーザーが弾かれる確認)

3)ログイン

…などなど。つまり一つのuriが複数のメソッドでテストされてるのもおかしくありません。自分はだいたい成功のテストとエラーのテストを分ける趣味です。

実装

さて、テストが作成できましたら、どうやって実装しますか?

IDEAでは、画面の下にあるsbt shellが使えます。別な環境では、project ディレクトリをターミナルで開いて、 sbtを打てば同じ環境に入れます。

起動が終わりましたら、

test

を打ってエンター押せば@Testのメソッドが実装されます。

はい。簡単です。(大変な量のログが出た後で、というアウトプットが見れます)

f:id:c-pattamada:20181129131042p:plain
成功した時

うまくいってない場合は以下のようにエラーログが出て、何がどこに壊れてるのかの当てが掴みやすくなると思います。

f:id:c-pattamada:20181129131126p:plain
あらら

結論

今日作成しているプログラムが来年別な人にメンテされることもあるでしょう。自分がまだ対応している場合にも、なかなか覚えてないこともあるでしょう。

そこで、知らず知らずにバグを起こしたら、testの段階でわかりやすくなるし、すぐに原因の尻尾も掴むこともできますので、ぜひテストを利用してコードを書きましょう!

Azureの顔認識APIで感情分析!社内の幸福ランキングを作成する

こんにちは、開発部のイイオです。

機械学習、はやりですね。
ゴーリスト社内でもモデル作成に勤しむ青年の姿が見受けられます。
でもパンピ〜の我々は、機械学習でいったいどんなことできるのか、手っ取り早くその果実を味わいたいですよね。

というわけで
Microsoft Azure が提供している顔認識の分類器を使って、会社の人々の幸福度を測定してみました。

今回計測にかけたのは、採用のために人事がやってるブログのこちらの記事です

blog.goalist.co.jp

上記ブログの写真から人間の顔を検出し、以下の8つの感情に分類します。
anger, contempt, disgust, fear, happiness, neutral, sadness, surprise

手順

1. APIキーを取得

API利用のためのキーを取得します、無料のゲストでOK
1分あたり20回のリクエストが可能です。

azure.microsoft.com

2. プログラムを書く

こんなかんじで、、

Python界に生まれて3日目くらいの人間が書いているので、お作法的にnot goodかもしれません
間違ってる部分あったらこっそり教えてください〜

やってることは

  1. 人事ブログ記事をクロール
  2. スクレイプして画像のURLを入手
  3. Face API に投げる
  4. 顔認識された座標で画像を切り取ってローカル保存
  5. 感情分析の結果をCSV出力

プログラム全体はこちら

3. 実行する

画像フォルダに切り出されたみんなの顔が増えていくのは正直わろうた

結果

同率1位

喜び以外の感情が全く検出されない、
フルハピネスなお祭り野郎はこいつらだ!!!

f:id:y-iio:20181115165702j:plain HRogの顔、営業部を統括する男

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115165103j:plain お調子者の美女っていうのも良いですね

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115181623j:plain インドからの刺客

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115165800j:plain 石油王ではない ※参照

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115181642j:plain こう見えてムッッッッキムキの兄さん

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115181709j:plain ちからつよそう

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115181731j:plain 天パ

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0


f:id:y-iio:20181115181821j:plain ドラえもんかな?

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0



2位〜 ハピネス度92.8〜99.9%のみなさん

f:id:y-iio:20181115182643j:plain こんなに破顔しているのに0.1%の悲しみが検出される"闇"

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.999 0.0 0.001 0.0


f:id:y-iio:20181115182932j:plain ちょっと笑顔が足りなかったですかね

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.995 0.0 0.005 0.0


f:id:y-iio:20181115183101j:plain 見切れがたたったか

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.973 0.011 0.021 0.0


f:id:y-iio:20181115183436j:plain 曇りなき(まなこ)です

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.953 0.046 0.0 0.0


f:id:y-iio:20181115183706j:plain 知的な美女というのも良い

anger contempt disgust fear happiness neutral sadness surprise
0.001 0.0 0.0 0.0 0.928 0.071 0.0 0.0



喜び以外の感情と判定された中間層!

f:id:y-iio:20181115184120j:plain 心の中では全く笑っていないのかもしれません

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.004 0.0 0.0 0.202 0.794 0.0 0.0


f:id:y-iio:20181115184238j:plain あまり感情が表に出ない文系エンジニア

anger contempt disgust fear happiness neutral sadness surprise
0.001 0.001 0.0 0.0 0.122 0.866 0.011 0.0


f:id:y-iio:20181115184724j:plain 真面目な話をしているので…

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.049 0.938 0.012 0.0


f:id:y-iio:20181115184854j:plain 菩薩

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.002 0.981 0.016 0.0


f:id:y-iio:20181115185112j:plain 下向きの顔だとハピネス度が下がるのかもしれません

anger contempt disgust fear happiness neutral sadness surprise
0.001 0.0 0.0 0.0 0.0 0.833 0.166 0.0



最下位の中からPick UP!

f:id:y-iio:20181115182105j:plain 99.9%の無と0.1%の悲しみをたたえたフェイス

anger contempt disgust fear happiness neutral sadness surprise
0.0 0.0 0.0 0.0 0.0 0.999 0.001 0.0



感想

Pythonで何かしら動く、ふざけた楽しいプログラムを作りたいという気持ちで気軽に始めましたが
スクレイプ、画像処理、外部API利用、ファイル出力と色々試せて有意義でした。有意義でした!
決して、決して仕事の時間中に遊んでいたわけではないのですよ!

Gitをふんわり図解するシリーズ③ コンフリクト解決編

この前社内でGitのハンズオンを開催したので、コンフリクト解決に関する部分をまとめました。
基本的なコマンドは使えるけど、手元でコンフリクト解決したことないぜよな初心者向け。
基本用語解説編基本コマンド編とも合わせてドウゾ

何なの

まずはイメ〜ジの話なのですけど

f:id:y-iio:20181113184736p:plain
ロボを作っているラインがあるとします。
ある作業ブランチでは「左腕を武器に換装する」変更を、
ある作業ブランチでは「全身のカラーリングを赤にする」変更をしています。

f:id:y-iio:20181113184754p:plain
「左腕を武器に換装する」変更を先にマージし、後からカラー変更をあてようとすると
コンフリクトが発生します。

左腕を赤く塗ろうと思ってたのになんか知らない武器付いてるよ!
親方〜〜〜これ塗っちゃって良いんすか確認お願いします!!!

的な状況です。

いつもならGit職人くんが特に確認なくうまいことマージしてくれるのですが
同じ箇所を変更するような場合は判断できないので人間の親方の出番です。

f:id:y-iio:20181113184832p:plain
武器はやっぱツヤ消しの黒色がいい…
カラー変更は上腕まででよし…

親方こだわりのディテールを職人に教えてあげる

f:id:y-iio:20181113184914p:plain
完成!つよそうですね

やってみよう

実際に手を動かすとこんなかんじです

こんなテキストファイルconf.txt があったとする

ロボを作るよ

branch1ではこう変更

ロボを作るよ
左腕を武器に換装する

branch2ではこう変更

ロボを作るよ
機体を赤く塗る

branch1の変更をマージ後、branch2をマージしようとすると…コンフリクト発生!

$ git merge branch2
Auto-merging conf.txt
CONFLICT (content): Merge conflict in conf.txt
Automatic merge failed; fix conflicts and then commit the result.

とりあえずは状況の確認をする
conf.txtがboth modifiedですって

$ git status
On branch confex
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   conf.txt

no changes added to commit (use "git add" and/or "git commit -a")

conf.txtの中身を見てみると
職人からの確認部分に「<<<<<<< HEAD」とか書き足されている

ロボを作るよ
<<<<<<< HEAD
左腕を武器に換装する
=======
機体を赤く塗る
>>>>>>> branch2

「=======」を境界にどっち側使うの〜と聞かれてるのでどっちもだ!と教えてあげる

ロボを作るよ
<<<<<<< HEAD ←消す
左腕を武器に換装する
======= ←消す
機体を赤く塗る
>>>>>>> branch2 ←消す

ロボを作るよ
左腕を武器に換装する
機体を赤く塗る

変更を保存してコミット

$ git add conf.txt
$ git commit -m "fix: conflict"

解決!

気軽にコンフリクト解決していきましょう٩( ‘ω’ )و

こんなのもあります

developers.goalist.co.jp

developers.goalist.co.jp

Gitをふんわり図解するシリーズ② 基本コマンド編

最近社内でGitの勉強会を開催したので、 図解部分をまとめました。
いつもなんとなくコマンド使ってるけど実際のとこあんまりイメージ湧かないぜ〜みたいな時に使えるTipsです。
基本用語解説編と合わせてドウゾ〜

git clone

f:id:y-iio:20181030193011g:plain
共有されてる保管場所をコピってきて、同じ形した自分のための保管場所を手元のPC内に作る

git init

f:id:y-iio:20181030194014g:plain
手元で製造工場を作ってから共有する場合もある

git log

f:id:y-iio:20181030193429p:plain
いつ誰がどんな意図でこの変更をしたのかを確認します

git add

f:id:y-iio:20181030193604p:plain
自分の変更部分を包みます

git commit

f:id:y-iio:20181030194142p:plain
包んだ変更をまとめてセーブ!

git push

f:id:y-iio:20181030194424p:plain
リモートリポジトリにブランチを作成
または、ブランチに変更内容を反映

git fetch

…の前に

f:id:y-iio:20181030195010p:plain ローカルリポジトリには2種類のブランチがあります

f:id:y-iio:20181030195043p:plain

・リモート追跡ブランチ
リモートリポジトリのブランチを参照するだけのブランチ
手元でいじれない
git branch -aでremotes/origin/xxxx とかなってるやつ

・ローカル作業ブランチ
手元での作業用
いつも使ってるやつ

f:id:y-iio:20181030195224g:plain
リモートリポジトリの上流ブランチを参照して、リモート追跡ブランチを更新すること
それがフェッチです

git merge

ブランチ上の変更を統合します

f:id:y-iio:20181030195514p:plain
作業ブランチ同士で、、とか

f:id:y-iio:20181030195438p:plain
リモート追跡ブランチから作業ブランチに、、とか
リモートリポジトリでの変更を作業ブランチにも反映させたい、そんなときはこの形です

git pull

f:id:y-iio:20181030200034p:plain
フェッチしたリモート追跡ブランチの変更をローカル作業ブランチにマージする、のをいっぺんにやるのがプルです。

pullで何も引数に指定しないと、上流ブランチが指定されてる作業ブランチ全てに対し
リモートリポジトリでの変更が反映されてしまうので、
けっこう予想外のマージが起こってあたふたしちゃったりします。

フェッチとマージができればプルを使う必要が全くないです、
プルして変にハマっちゃうくらいなら使わなくていいんじゃないのかな〜と思います

技術の図解もの

こんなのも書いてます

developers.goalist.co.jp

developers.goalist.co.jp

次回はコンフリクト解決についてまとめます

Gitをふんわり図解するシリーズ① 基本用語とチーム開発の流れ

最近社内でGitの勉強会を開催したので、
Git初学者向けの基本用語解説部分をまとめました。

リポジトリ

f:id:y-iio:20181029162159p:plain
リポジトリはプロジェクトに必要な複数のファイルを保持します。
また、これまでのすべての変更履歴を保持します。

f:id:y-iio:20181029162239p:plain
リポジトリはそれぞれブランチを持ってます。

ブランチ

f:id:y-iio:20181030192154g:plain
並行作業で開発するためにブランチが使われます。
やること別に作業ラインが分かれてたほうが、他の人の邪魔にならないし不具合の原因も見つけやすいですよね。

f:id:y-iio:20181029162343p:plain
ブランチとコミットオブジェクトはこんな感じで図にされることが多いです。
この玉みたいなやつをコミットってことにしますね。
セーブポイントが積み重なっているんだなあというよなイメージでお願いします。

チーム開発の基本的な流れ

f:id:y-iio:20181029185013g:plain
手元で開発する

みんなに共有する

みんなが最新の同じソースを使える

HAPPY

技術の図解もの

こんなのも書いてます

developers.goalist.co.jp

developers.goalist.co.jp

次回は基本コマンド編をお送りします。要チェックやで、です。

ラズパイで無駄なもの作るよシリーズ① 初期設定編

こんにちは、開発部のイイオです。

会社ではWebアプリを企画したり作ったり運用したりしています。
ユーザーが料金以上の価値を得られるような、そんな商品を目指して、、

しかしタイトルにもあるように、無駄なもの、そう無駄なものが作りたいのです私は
誰の役にも立たない、ただただ自分が楽しいだけの無駄なものが

そもそもコスパとか生産性とか、ビジネスで重要っぽく語られる諸々、
突き詰めたら今すぐ死ぬのが一番効率良い(個人の感想です)のに折り合いつけられるものかよ〜〜

そんなわけで休みの日は無駄なものを作って健康さを取り戻したいと思います。

ラズベリーパイというちっちゃなコンピュータ基盤を使って、なにがしかを作ろう
ワイワイ!

www.raspberrypi.org

とりあえずは初期設定を行います。

必要なもの

  • ラズパイ本体
  • ネット繋がってるPC
  • microSD 8GB以上
  • 有線キーボード
  • 有線マウス
  • 5VのマイクロUSB接続の電源
  • ディスプレイ

OSのインストール

1. microSDにOSデータを落とす

お手持ちのPCでNOOBSをダウンロード
データが重いので10分以上かかりました

Raspberry Pi Downloads - Software for the Raspberry Pi

f:id:y-iio:20181029160838p:plain

zipを展開したら、中身をゴッソリmicroSDに移動

2. ラズパイの接続

microSDをラズパイにさす

有線キーボードと有線マウスをラズパイにさす

ディスプレイのHDMIをラズパイにさす

電源をさす

f:id:y-iio:20181029155527j:plain

とりあえずさしまくる、電源が最後ならなんでもいい

すると

f:id:y-iio:20181029155647j:plain
デロロ....
CPUが1このやつは左上のアイコンも1こだそうです

3. OSのインストール

f:id:y-iio:20181029155743j:plain
インストールするOSの選択
Raspbianをチェックして、左上のインストールボタンを押す

f:id:y-iio:20181029155824j:plain
インストール中の様子

microSDけちってしょぼいやつ買ったので、20分近くかかりました

4. できあがり

f:id:y-iio:20181029160014j:plain
パスは初期設定のままでいいかな

user: pi
pass: raspberry

f:id:y-iio:20181029160115j:plain
日本語フォントも最初から入ってるみたい、そこはかとなくかわいらしいフォントです

f:id:y-iio:20181029160150j:plain
linuxのターミナルが使えます
ネットに繋いでないから時計は狂っとる

5. うわ〜〜〜

Scratchというプログラミングで猫を動かして遊べるやつ
もともと教育用コンテンツなのでこういうの入ってるんだね

f:id:y-iio:20181029160537g:plain
楽しい

次回はLEDをつないでチカらせます!