OmniAICreator/Qiita-1.07M huggingface dataset:
日付処理ライブラリ「date-fns」でプレミアムフライデー！

この記事は [J2complexed Advent Calendar 2017](http://qiita.com/advent-calendar/2017/j2complexed) の1日目の記事です。

# プレミアムフライデー！

今年の流行語大賞に「プレミアムフライデー」が受賞したという話を聞きました。
http://singo.jiyu.co.jp/award/award2017.html#prize08

ところで月末金曜日って微妙じゃないですか？
なにが微妙かというと、JavaScriptで月末金曜日が何日か出すのが微妙。

やり方はいろいろあるかと思いますが、今回は日付を処理をするときに便利なライブラリ「date-fns」を使ってやってみたいと思います。

## date-fns
日付処理をするときは大体の人がmoment.jsを使っていたかと思います。
公式でもmoment.jsとの違いを書いていました。
https://github.com/date-fns/date-fns/issues/275#issuecomment-264934189
要約すると、以下でしょうか。（英語も日本語も苦手です。編集リクエストお待ちしてます）

- moment.jsはmutableなので、バグが起こりやすい
- moment.jsはパフォーマンスよくない
- moment.jsはでかい

それに対してdate-fns.jsは以下だと言っています。

- date-fns.jsはImmutableだ。
- date-fns.jsは純粋な関数だから、必要なものだけ使えばいい。  
（つまり、オーバーヘッドが少ないし、サイズも小さい）

いい感じですね。関数も130種類以上あるそうですよ。
興味があれば、公式を見てください。
では、実際に使ってプレミアムフライデーを出してみましょう。

## 準備
公式にあるように準備します。ここらへんは普通なので、コマンドと用意したファイルだけご紹介します。
※ date-fnsとは関係ないのですが、babelを入れてます。

```zsh
~ $ mkdir premium-friday
~ $ premium-friday
~/premium-friday $ npm init
~/premium-friday $ npm i -D date-fns
~/premium-friday $ npm i -D babel-cli babel-preset-es2015
~/premium-friday $ vi package.json
~/premium-friday $ vi .babelrc
~/premium-friday $ mkdir src
```

```package.json
{
  "name": "premium-friday",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "babel src -d dest"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "date-fns": "^1.29.0"
  }
}
```

```.babelrc
{
  "presets": ["es2015"]
}
```

できましたか？



## プレミアムフライデー

で、書いてみました。

```src/index.js
import endOfMonth from 'date-fns/end_of_month'
import isFriday from 'date-fns/is_friday'
import addWeeks from 'date-fns/add_weeks'
import lastDayOfWeek from 'date-fns/last_day_of_week'
import format from 'date-fns/format'
import isToday from 'date-fns/is_today'

const today = new Date ()
// 月末を取得
const EndOfMonth = endOfMonth (today)

let premiumFriday

// 金曜日かどうか
if (isFriday (EndOfMonth)) {
  premiumFriday = EndOfMonth
} else {
  // 前の週を取得
  const previousWeek = addWeeks (EndOfMonth, -1)
  // その周の終わりを取得（週の始まりを土曜日にする）
  premiumFriday = lastDayOfWeek (previousWeek, {weekStartsOn: 6})
}
// フォーマット
const month = format (premiumFriday, 'MMMM')
const day   = format (premiumFriday, 'D')

console.log (`${month} Premium Friday is ${day}!`)

// もし今日がプレミアムフライデーなら
if (isToday(premiumFriday)) {
  console.log (`Today is Premium Friday! Yeah!`)
}
```

以下のようにコマンドを叩けば実行できます

```zsh
~/premium-friday $ npm run build
> babel src -d dest

src/index.js -> dest/index.js
~/premium-friday $ node dest
December Premium Friday is 29!
```

Premium Friday! Yeah!

プレミアムフライデーできましたでしょうか？
ちなみにdest/index.jsのファイルサイズは2KBでした。小さい。

## まとめ

date-fnsを使って、複雑な日付の処理を簡単に書けました。
もし機会があれば、いつものmoment.jsではなくdate-fns.jsを使ってみてはいかがでしょうか。

ところで、今月のプレミアムフライデーって29日なんですね。。。
微妙。

## 参考
- ドキュメント  
https://date-fns.org/
- Github  
https://github.com/date-fns/date-fns
ESP8266を使って周囲のアクセスポイントに接続しているデバイスを調査する

こんにちは。今年もAdvent Calendarの時期がやってきましたね。去年は[パソコンに差し込むだけで楽しいことがおこるデバイスの作り方](https://qiita.com/halt/items/9e7f5d4ccfd28f89a11b)を紹介しました。今年もハンダゴテなしで動かせる楽しいデバイスの作り方を紹介します。
(KLab Advent Calendar 2017 の2日目の記事になります)

# 概要
ESP8266 をモニターモードで動かし周囲のAPの間をとぶパケットを見て、各APにビーコンを飛ばしているデバイスのMacアドレスを調べるデバイスを作ります。

# 用意するもの
ESP8266を動かせる環境ならなんでも大丈夫ですが、国内で一番手っ取り早くデバイスを調達するのであれば秋月電子さんが販売している開発ボードがオススメです。1280円です。

ＥＳＰ－ＷＲＯＯＭ－０２開発ボード
http://akizukidenshi.com/catalog/g/gK-12236/

開発ボードはESP8266を動作させるために必要な回路がすべてのっているので、これを買えば他に買うものはありません。

# 早速動かす
細かい理屈はわかっていなくても以下のサイトからデータをとってきて書き込むだけで動かせます。とりあえず動かしてみましょう。

まずはプログラムの書き込みのために ArduinoIDE を用意します。
Arduino IDE は [公式サイト](https://www.arduino.cc/en/Main/Software) もしくは Windows Store からダウンロードできます。

ESP8266への書き込みを行うには関連するライブラリをインストールする必要があります。

ESP8266をArduinoIDEで使うには[Arduinoマイコンとしても使える小型WifiモジュールESP-WROOM-02を使ってみる(Arduino利用編) | Device Plus - デバプラ](http://deviceplus.jp/hobby/entry034/)が参考になります。

# 書き込みと動作確認
Arduino IDE の準備が整ったら、[ESP8266 Mini Sniff - Hackster.io](https://www.hackster.io/rayburne/esp8266-mini-sniff-f6b93a) にあるCODEのArduino Sketchをダウンロードします。zipファイルを展開するとソースコードがでてくるので Arduino IDE で開いて書き込めば完了です。

# 出力結果
シリアルモニタのバンドを57600bpsに設定して接続してしばらくすると、以下のような値が出力されていきます。

![ap.png](https://qiita-image-store.s3.amazonaws.com/0/34176/0d8072d7-5353-7e32-a7bc-b4dc85f3c5e6.png)

左から順にtype(DEVICEかBEACONか)、MACアドレス、SSID、MACアドレス、チャンネル、受信信号強度となっています。

# MACアドレスの変更について
今回作成したデバイスを使う事で、自分の周囲にあるデバイスやアクセスポイントについてたくさんの情報を得る事ができるようになりました。デバイス毎に設定されている検出したMACアドレスを記録すれば、自分の近くに、誰がいるのか、いつ離れたのか簡単に把握することができるようになります。

- macOS
    - [OSXのMACアドレスを変更する。 - それマグで！](http://takuya-1st.hatenablog.jp/entry/2015/05/24/184011) 追跡防止が目的かどうかは別として変更する方法自体はあるようです。
- Windows10
    - [Windows 10] ランダムハードウェアアドレスの設定方法 - VAIO サポート FAQ(https://solutions.vaio.com/2827) 毎日変更できる仕組みがあるようです。
- iPhone
    - 2014年からMACアドレスを変更する仕組みが入っているらしいです。
- Android
    - 2016年から変更できるようになっているそうです。

このように、追跡対策としてのMACアドレスの定期変更機能は最近のデバイスであればだいたい用意されているため、長期間に渡る追跡は難しくなっています(一方で [スマートフォンのMACアドレスランダム化、ハックされる - ごった日記](http://mokake.hatenablog.com/entry/2017/03/30/185949) にあるようにちょっとがんばれば追跡可能であるという話もあります)

# さいごに
このデバイスを使ってみると、高木先生が2007年に書かれている記事[高木浩光＠自宅の日記 - 無線LANのMACアドレス制限の無意味さがあまり理解されていない](http://takagi-hiromitsu.jp/diary/20071103.html)の意味がよくわかりますね。
[Docker] Dockerの不要なimage, containerなどを削除するのに "docker prune" が便利

ビルドや起動を繰り返していると溜まってくる不要なimage, containerなどを一括削除できる。

```
docker system prune -f
```

参考:
https://docs.docker.com/engine/reference/commandline/system_prune/
node.jsをアップデートする

#`n`のインストール

```
$npm install -g n
```

#アップデート

```
$sudo n stable //安定版
$sudo n latest //最新版
```
#バージョン確認

```
$node -v
v9.2.0
```

(参考)
https://parashuto.com/rriver/tools/updating-node-js-and-npm
サーバ管理・運用者のためのGNU Coreutils

# GNU CoreUtils
AWSなどでLinuxサーバを運用・管理していると、ログなどのテキストファイルを見たり調べたりすることが多い。
そのときに色々役に立つコマンドが幾つもあるのでメモ代わりに記述する。
これらの基本的なコマンドはGNU Coreutilsとしてまとめられて、標準的なプログラムとしてLinuxにインストールされている。
ファイルの操作など、よく使うものから、どこで使うかわからないものなど色々あるが、使いそうなコマンドを簡単な概要とともに、悪魔の辞典ふうに紹介する。実際にはこれらのコマンドを様々に組み合わせて使う。

これらのコマンドの詳細な情報は、こちらにある。
https://linuxjm.osdn.jp/info/GNU_coreutils/coreutils-ja.html

# cat [option] [file]…
* 標準出力に内容を出力する
* 単に出力するという意味ではlessにその座を奪われている
* ShellScriptでファイルの中身を変数に入れるときとかに使われたりする
* 名前からして本来は複数のファイルを連結して、合成出力する目的だったが、圧倒的にファイルの中身を表示する用途に使われることが多いという元の意図と違う用途で使われることが多い
* 良いユーザインタフェースと言われたり、悪いユーザインターフェースと言われたりするかわいそうなコマンド

# head [option]… [file]…
* ファイルの先頭部分を表示する
* 余り使われてない

# tail [option]… [file]…
* 圧倒的によく使われるコマンド
* ログファイルを `-f` オプションを付けて見てみるなど

# split [option] [input [prefix]]
* ファイルを行やバイトで分割する
* 分割された後のファイルがちょっといけてない

# csplit [option]… input pattern…
* 正規表現などを使って特定の場所でファイル分割をする
* 余り有名ではないけど、たまに使える
* 正規表現にちょっと癖があるので注意

# wc [option]… [file]…
* バイト数、文字数、行数などを表示する
* 圧倒的に行数を計算することに使われる

# md5sum [option]… [file]…
* ファイルの128-bit チェックサムを計算する。
* 使い所としてはファイルの同一性チェックなど、確認するときに使う
* コマンド名がながい（BSDではmd5）

# sort [option]… [file]…
* テキストファイルを並び替える
* 後ででる `uniq` をする前にsortを掛けるのがワンセット

# uniq [option]… [input [output]]
* 行の重複を省く
* ただし、きちんとsortされていないと、正しく動かないのでsortと組み合わせることがほとんど
* 出現回数なども出力できる

# cut option… [file]…
* 行をセパレータで区切って、部分的に取り出す
* cutしてsortしてuniqかけるのは鉄板操作

# paste [option]… [file]…
* 同じ行番号のものを指定したセパレータで連結する
* 意外と使える場面があるとおもうのだけど、このコマンドを思い出せない

# join [option]… file1 file2
* 共通のフィールドにマッチする行を連結する
* pasteとの違いは行ではなく同じフィールドで連結するところ
* これもなかなか思いだせないのでVimでなんとかしてしまうかなしみ

# tr [option]… set1 [set2]
* 文字の置換を行う
* なぜか標準入力からしか受け付けなくとっつきにく所もあって、頑張ってsedを使われてしまうことが多い

# ls
* ディレクトリの中身を表示する
* オプションが多くて誰も把握できないと思われる

# cp [option]… 
* ファイルのコピー
* これもやたらとオプションが多い
* cp source destination

# mv [option]… 
* ファイルの移動
* mv source destination
* まずコピーをしてから元を消す動きをする

# rm [option]… [file]…
* ファイルの削除
* 常に '-rf' のオプションを付けているといずれ痛い目を見る

# ln [option]… target… directory
* ファイル間のリンクを作成する
* hard linkかsymbolic linkかわからなくなって消すときに悩む

# chown [option]… 
* ファイルの所有者やグループを変更する
* 間違ってrootで書き込んだログファイルの所有者を変えるときなどに使う

# chmod [option]… 
* ファイルのアクセス権限を変更する
* chmod 777は嫌な予感しかしない

# touch [option]… file…
* ファイルのタイムスタンプを変える
* 空ファイルを作る目的で使われることが多い

# df [option]… [file]…
* ディスクの容量を表示する
* -h をつけるとよしなにしてくれる

# du [option]… [file]…
* ディレクトリの容量を計算する
* サーバのゴミデータを削除するときに使う

# echo [option]… [string]…
* テキストを１行表示する
* 環境変数を表示するときによく使う

# yes
* ただただ、ひたすらに `yes` を標準出力に表示する
* 高速化を目指して自己満足するためのコマンド
    * https://developers.srad.jp/story/17/11/11/0326244/
* もしくはCPUを100%張り付かせるために使われるコマンド
  
# pwd [option]…
* カレントディレクトリを表示する
* 迷子になったときに使う

# date [option]… 
* 日付を表示する
* フォーマットして様々な表示ができる
* 表示をするとともに変更もできてしまうので少し怖い

# uptime
* 起動してからの時間、load average、ログインユーザ数を表示する
* 何年も再起動してないサーバがいてびっくりするコマンド

# kill
* やんちゃなプロセスに退場いただくコマンド
* respawn設定されてるプロセスと格闘するためのコマンド

# あとがき

Unix系OSでは、パイプラインという偉大な仕組みがあり、上記のコマンドをパイプラインで組み合わせて、様々なことができる。ソフトウェアは工具だという思想があり、それを具現化させるための仕組みである。プログラムを書かなければいけないことを、コマンドの組み合わせでできてしまうことも多い。
考えて組み合わせる楽しみを体験してもらえればと。
振動について

# 振動について

音響について、なんか書こうと思ったけど、はじめは初歩中の初歩、なんか振動について、数学やプログラミングで説明しようと思います。てか、僕自身もなんか忘れている気がしたので思い出すために。

ちなみに、大学一年生ぐらいのレベルに合わせて書いてます。なんで、大学出たことある人は分かるはずです。

あと、数学アドベントカレンダーの一貫として書きます。**ほぼ、物理なんだけど!!!!**

## 単振動

### 単振動を解く

もう説明するよ。まずは単振動です。まぁ、単振動といえば、バネと質点の運動なので簡単に図を書きます。

![IMG_5749.JPG](https://qiita-image-store.s3.amazonaws.com/0/31381/cac380ed-873e-213b-7ec4-27261ac8c4f8.jpeg)


↑の図は、点Oを中心に振動する様子を書いてみました。ここでは、点Oを過ぎると、点Oに戻るように力が働いています。ここで、ばね定数を$k$と置くと、

```math
F = -kx
```

とばねに働く力が書けます。$F$は力で、$x$は振動の変位です。さて、ここで運動方程式をかくと

```math 
m\frac{d^{2}x}{dt^{2}} = - kx
```

とかけます。ただ、ここで、$m$で両辺を割って

```math 
\frac{d^{2}x}{dt^{2}} = - \omega^2 x  \quad (\omega=\sqrt{\frac{k}{m}})
```

とかいたものが、**単振動の運動方程式** となります。 じゃあこれを解いてみましょう。普通に積分しても解けません。しかし、これは線形な微分方程式なので、$x$を

```math 
x(t) = Ae^{\lambda t}
```

とします。$A$と$\lambda$は0ではない定数です。

これを、先程の運動方程式に代入すると

```math
(\lambda^2 + \omega^2)Ae^{\lambda t} = 0
``` 

ここで $e^{\lambda t}$は0でないため、$\lambda^2 + \omega^2 = 0 $、つまり、$\lambda = \pm{i\omega}$ です。

さて、ここで、$c_1$を任意定数とした、$x = c_1 e^{i\omega t}$は、運動方程式を満たすが、$c_2$を任意定数として、$x = c_2 e^{-i\omega t}$も運動方程式を満たす。これらを重ね合わせた式、

```math 
x = c_1 e^{i\omega t} + c_2^{-i\omega t} 
```

もまた、一般解です。さて、ここで、オイラーの公式$e^{\pm\theta} = \cos\theta \pm \sin\theta$を用い、$A$, $B$を任意定数と置き、

```math 
x = A\cos\theta + B\sin\theta 
```

と書くことができます。ここから、単振動を

```math 
x = C\cos{(\omega t + \phi)}
```

とかくことができます。ここで、$C$は振幅、$(\omega t + \phi)$は位相と呼びます、

### 単振動をシミュレーション

さて、プログラミング要素が無いといかんので、ここで、単振動のシミュレーションしてみます。

**scratch**でかきました。

https://scratch.mit.edu/projects/190179565/

# 減衰振動

それで、ですね、まぁ、普段の振動には単振動みたいな運動はなかなか無いわけでして、大抵、摩擦などの抵抗力が関係していて、まぁ、**減衰**するんですね。

んで、じゃあ、その抵抗力を、$f$とすると、比例定数を$b$とおき、

```math 
f = - b \frac{dx}{dy}
```

で与えられ運動方程式は、$b = 2m\gamma$とおき

```math 
m \frac{d^2 x}{dt^2} = - kx - 2m\gamma \frac{dx}{dt}
```

とおける。さて、$m$でわり、

```math 
\frac{d^2 x}{dt^2} = - \omega^2 x - 2 \gamma \frac{dx}{dt} \quad (\omega = \sqrt{\frac{k}{m}}
```

とする。先程と同じように、

```math 
x(t) = Ae^{\lambda t}
```

とするし、先程の式に代入すると

```math 
(\lambda^2 + 2\gamma\lambda + \omega^2)x = 0
```
を得る。 x = 0以外が解であるためには、

```math 
\lambda^2 + 2\gamma\lambda + \omega^2 = 0
```

を満たさなければいけません。$\lambda$ に関する、方程式の解は、判別式$D=\gamma^2 - \omega^2$を用いて、

```math 
\lambda = - \gamma \pm \sqrt{D}
```

のように与えられる。このDの値によって、減衰振動、過減衰、臨界減衰の3つに分かられる。

## 減衰振動のシミュレーション

Processingで書いた。

減衰振動

https://www.openprocessing.org/sketch/482493

過減衰

https://www.openprocessing.org/sketch/482500

臨界減衰

https://www.openprocessing.org/sketch/482509

## 続きはまたこんど、

まだまだ、強制振動やら、2質点系での振動、多質点での振動、弦の振動やら、いろいろ思い出しながら書くので気がむいたら。

# 参考

(参考図書: スタンダード力学 河辺 哲次 )
GitHub に リポジトリを移行する方法


リポジトリをGitHubにお引越しのやり方まとめです。
全てのブランチ & タグ もお引越しする方法になります。

# リモートリポジトリ の ミラーリングを作成

```
$ git clone --mirror [リモートリポジトリURL]
```

※ [clone する際に SSL証明書エラーで怒られたので、対処方法についても、残しています。参考にどうぞ](https://qiita.com/TKR/items/5f23fe5a341e228cf9b5)

# 新しく作成したGitHubリポジトリ URL を追加

ミラーリングで作成したリポジトリに移動

```
$ cd [ミラーリングで作成したリポジトリのpath]
```

```
$ git git remote add new-repository {移行先にリポジトリ URL}
```

※ `$ git remote set-url origin {移行先にリポジトリ URL}` で、origin の urlを変更してもよい

# リモートリポジトリにpush

```
$ git push -f --tags new-repository refs/heads/*:refs/heads/*
```

※ `origin` の url を変更した場合は、`new-repository` を `origin` にする
モブプロとプロダクトオーナー

この記事は[モブプロ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/mob)の2日目の記事です。

本日はモブプロにおけるプロダクトオーナーの振る舞いについて書きます。

# 状況設定

モブプロをやる動機は開発チームによってそれぞれだと思いますが、この記事では私の経験ベースで以下の前提で話を進めます。

* モブプロ導入前の課題
    * チームメンバーの業務知識やバックグラウンドに結構差がある状態
    * それぞれが別々のタスクを進めておりレビューコストが高い
    * タスクの技術的難易度が高く見積もりの精度が悪い
* モブプロの目的・期待
    * 業務知識の属人化排除
    * レビューコストの削減
    * 設計段階でのリスク洗い出しによる見積もり精度の向上
* モブプロの進め方
    * チームが取り組む開発はすべてモブプロ化
    * 分散開発やらない
    * チームはプロダクトオーナーの決めた施策を優先度順に開発していく

# モブプロによって起こった変化

* チーム全員の知識がひとつの課題に集中するため設計や実装の議論がとても活発になった
* その結果施策のあいまいさや矛盾点などの指摘がたくさん出るようになった
    * とくにそもそもの施策の仮説の立て方や、リリース後の仮説検証の方法、KPI設定の観点についての指摘が多かった
* これまでより数字という文脈で施策を考える観点がチーム内に生まれてきた
* 指摘をチェックリスト化してグルーミングやプランニング時点で精査することで施策自体のクオリティが向上した
* 手戻りによるリリース遅延や仮説の甘さからくる施策自体の失敗が減った

# 施策のあいまいさや矛盾点などの指摘をどうフィードバックしてもらったか

私の場合、施策は以下のようなフォーマットで書くことが多いです。

* ユーザーストーリー
    * 誰々として何々ができる。それは何のためだ。
* ビジネス価値
* 背景となる課題・仮説
* 受け入れ条件
* プラットフォーム
    - ウェブ（PC）
    - ウェブ（スマホ）
    - スマホアプリ
* デザイン
* KPI（検証クエリと目標値）
* リスク
* ステークホルダー

チームが開発に入る前にこれらをまとめたものを順に説明し矛盾点がないかをチェックしてもらいます。

当初は実際に開発に入ってから施策の問題点に気づくケースが多かったため、ふりかえりなどでその問題点の観点をリスト化していきました。

その結果できあがったチェックリストが以下になります。

```
# プランニングに進む前にチェックすることリスト

- [ ] その施策、目的と手段合ってる？
- [ ] 受け入れ基準を明確にする（絶対実装するライン、プランニング結果や実装途中でやらない判断ができるライン）
- [ ] KPIの計測方法が明確になっている
- [ ] 技術検証が必要か？（パフォーマンス懸念、新技術利用、構造的なリファクタリングなど）
- [ ] UIデザインをレビューは必要か？
- [ ] ユビキタス言語を決める（日本語）
- [ ] そのストーリー、見積り可能になってる？
- [ ] プランニング前までにやっておくことのSMARTなアクションを決める
```

この観点で施策をチェックすることであいまいさや矛盾を取り除くことができ、精度を向上させることができました。

# モブチームとプロダクトオーナーの接点

プランニング前のチェックの取り組みによってチームが施策そのものについて深く考えるようになると、次やる施策のクオリティが低かった場合グルーミングでメンバーから詰められるという事態が発生します笑

プロダクトオーナーとしてはなかなかプレッシャーのかかる状態にはなるのですが、正しい指摘は素直に受け入れ、間違った指摘はプロダクトオーナーの考えをしっかり伝えるというコミュニケーションがとても重要になります。

また、メンバーは数字の組み立て方まで指摘をするのでKPIを主体的にとらえることができるようになるというメリットがあります。定期的なKPI確認のイベントではプロダクトオーナーの説明がよりチームに理解してもらえる状態をつくることができます。

チーム全体として施策そのものへの関心が高まるので施策のブラッシュアップのアイデアなどの提案をもらえる機会も増えます。

開発の最中でも、モブプロの場合はつねに会話しながら開発を進めるのでプロダクトオーナーが近くに座っていれば状況を把握しながら進めることができ、チームもわからないところが出てきたときにすぐプロダクトオーナーに聞くことができるので分散しての開発よりかなり効率がいいと考えています。

# モブプロはグロースハック系の施策に向いている

モブプロの事例を見ていると新規開発やプロトタイピングでやってみたという話が多いように思いますが、個人的にはすでに運用しているサービスの数字をグロースハックするチームでこそモブプロの力を最大化できるのではと思っています。

長期スパンで数字を追いかけていくチームはモブプロで強いチームになれるのでぜひ試してみてください。
(2017年12月) PythonとOpenCVをこれからやってみる - 2 - マークを読取る

#はじめに
Python(パイソン)もOpenCV(オープンシーブイ)もこれまでまったく触れてこなかったけど、ちょっとやってみたいと思ってはじめたので、色々と試しているという状況です。
前回（[(2017年12月) PythonとOpenCVをこれからやってみる - 1 - Qiita](https://qiita.com/rrryutaro/items/4c40873d6b06096cfe93)）はとにかくOpenCVで画像を読取って表示するまでをやってみました。

今度は、試しにOCR(オーシーアール)的に文字認識をやってみようと思いましたが、その前にもっと簡単そうなマークを読取るOMR(オーエムアール)的なものを試してみます。

#OMRについて
OCR(Optical character recognition)(光学文字認識)に対して、OMR(Optical Mark RecognitionもしくはOptical Mark Reading)(光学式マーク認識)ですね。
マークシートや、アンケートなんかで、「はい・いいえ」でどちらかに○を付けるとかのアレの読み取りですね。
前回、画像の切抜きができましたから、用は、あらかじめ決めた範囲の領域について、グレースケールで考えれば、記入前の数値と記入後の数値が異なれば、指定されていると判断できと考えていいのでしょう。
では、その観点から試してみます。

#チェックシートのチェックを読取ってみる
とりあえず、適当に「チェックシート」で検索をかけて目に付いた画像をダウンロードしてきます。（一応その画像のうちのチェック部分のみ抜粋）
![チェック1.png](https://qiita-image-store.s3.amazonaws.com/0/156225/64241bf0-8588-0622-dcac-992f6ba3f7f4.png)


GIMPにて、チェック部分の座標を調べます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/b98ebcb1-0549-a79c-ed1e-0e47456f4ecb.png)

続いて、手書きで丸をしたかのように、○を付けます。
![チェック2.png](https://qiita-image-store.s3.amazonaws.com/0/156225/06f2b0bf-e461-0243-5cd4-01a5c0d169d4.png)

ちなみに、あらかじめ何か書かれてる上にチェックするようなものを、OCR業界？では「オーバライトチェックマーク」とか言ったりするみたいですね。

では、そのオーバーライトチェックマークを読取ってみるプログラムを作ってみます。

#オーバーライトチェックマークの判断（画像の塗りつぶれ度合いを判断する）

```py3:hoge.py
import cv2
import numpy as np

file1 = "hoge1.png"
file2 = "hoge2.png"

img1 = cv2.imread(file1, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(file2, cv2.IMREAD_GRAYSCALE)

img1_2 = img1[162:162+14, 467:467+32]
img2_2 = img2[162:162+14, 467:467+32]

print(np.mean(img1_2))
print(np.mean(img2_2))
```

```py3:コマンドプロンプト
> python hoge.py
224.147321429
202.017857143
```

最初の画像がテンプレート、次が記入したものとなります。
白が255、黒が0なので、何か記入されていれば、その分黒の領域が多くなる事で、元の画像よりも数値が低くなります。

後は閾値を考えて、どの程度の差異でもって記入があったかを判断するようにすればいいでしょう。

座標の入力など、実際にちゃんと作るとなると次のような感じになるでしょうか。

- Excelなどで枠を書いて、VBAでそのシェイプの座標を出力できるようにする
- Pythonで作るプログラムで、その情報を読み取れるようにする
- テンプレートの各座標のグレースケールの合計なり平均値を出力する
- 閾値を決める
- 実際の記入された画像を読込み、テンプレートとの差異を比べて、閾値を超える場合（下回る場合）、記入有りと判断して、何らかのデータを出力する

とすれば、単純なものなら、自動化できそうな気がします。
記入したものをスキャンするなりの工程で座標ズレが出てくる場合、ずれたことで影響する値を考慮して閾値を設定するか、座標ズレを補正する仕組みづくりも必要になってくるかもしれません。

う～ん、何か間違えているかもしれないと怖くなるくらいに、簡単にできてしまうものですね。

以上

#参考にした記事など
- [Pythonの数値計算ライブラリ NumPy入門 « Rest Term](http://rest-term.com/archives/2999/)

#これまでの記事
|前回|一覧|次回|
|:--|:--:|--:|
|[1 - はじめの一歩](https://qiita.com/rrryutaro/items/4c40873d6b06096cfe93)|[一覧](https://qiita.com/rrryutaro/items/933ec2ed754a9f3a2d3e)|[3 - 文字認識(1)](https://qiita.com/rrryutaro/items/0c0a7382560e1f67123b)|
演算子の結合性、右結合がどうとかの解説

#演算子の結合性、右結合がどうとかの解説


##想定する読者のレベル
なんかしらのプログラミングの入門書を1/3くらい理解しているレベル

##この記事の目標
http://www.bohyoh.com/CandCPP/C/operator.html
この表に演算子の結合性が右とか左とかあるのですが、その意味を説明することです。

##交換法則、結合法則とは
https://mathwords.net/koukanhousoku
交換法則：3+7=7+3、2×4=4×2 というように、順番を交換できるという法則。
結合法則：(2+3)+5=2+(3+5)、(3×6)×2=3×(6×2)というように、かっこをどこにつけても計算結果は同じという法則。
（引用）

当たり前すぎてわざわざ法則という必要がないような気がします。上で言っていることは、**数の足し算(+)は**交換法則と結合法則が成り立つ。**数の掛け算(×)は**交換法則と結合法則が成り立つ。ということです。
数の引き算、割り算については交換法則、結合法則ともに成立しません。例えば1-2と2-1は違う値なので引き算では交換法則が成立しません。また(1-2)-3と1-(2-3)は違う値なので結合法則が成立しません。
交換法則、結合法則が成り立つがどうかは演算の種類によって変わります。

###交換法則が成立しないが結合法則は成立する例
行列の掛け算は一般に交換法則が成立しませんが結合法則は成立します。
文字列の結合(+)は例えば
"aaa" + "bbb" は"aaabbb"になるが
"bbb" + "aaa"は"bbbaaa"で別のものになり交換法則が成立しません。
しかし、
("aaa" + "bbb") + "ccc" は"aaabbbccc"
"aaa" + ("bbb" + "ccc") も"aaabbbccc"
になります。どんな文字列でも一般に結合法則が成立することがわかると思います。

ややこしいですが文字列の結合と数の足し算で同じ記号（＋）を使っていますが別の演算です。

###交換法則が成立するが結合法則が成立しない例
NOR、NANDがそうです。
それぞれの定義はwikipediaなどを見ていただきたいです。
(偽 NOR 偽)NOR 真　 と　偽 NOR (偽 NOR 真)は異なる値
NORは(偽NOR偽)だけが真なので、左は偽、右は真

みんなに馴染みのある演算で交換法則が成立するが結合法則が成立しないものはあまりないと思います

##結合性が右とか左とか　とは
1-2-3。これを(1-2)-3と解釈するのか1-(2-3)と解釈するのかというのがあります。
実際1-2-3と書いたら常識でもプログラムでも(1-2)-3だと思われますが、これは引き算の演算(-)が左結合だということです。

一般化していうと、"なんかの演算記号"が左結合というのは
:sunny: "なんかの演算記号":cloud:"なんかの演算記号":umbrella2:
と書いた場合、ルールあるいは暗黙の了解として
(:sunny: "なんかの演算記号":cloud:)"なんかの演算記号":umbrella2:
とみなされることです。

同じように、"なんかの演算記号"が右結合というのは
:sunny: "なんかの演算記号":cloud:"なんかの演算記号":umbrella2:
と書いた場合、
:sunny: "なんかの演算記号"(:cloud:"なんかの演算記号":umbrella2:）
とみなされることです。

-とか割り算とかほとんどのは左結合ですね。

###右結合の演算子なんてあるか
代入(=)は右結合です。
int x = 0;
int y = 1;
int z = 2;
として
x = y = z;と書くと、
これは
x = (y = z)とみなされます。
C言語で(x = y) = z;と書くとエラーになります。(x = y)は右のyの値になるので、
(1) = z;と同じことになって代入できないだろってエラーになります。なので右結合でないといけない。
=は、変数の代入だけではなく、+とか-と同じように、値をとる演算で、例えばint w;w = (y = 30);printf("%d",w);と書くと、30と表示されます。
##群論について
プログラミングには役に立たないと思います。
##まとめ
ほとんど全ての２項演算子は結合法則が成り立つ、つまり一応結合性は決められているけどどちらにせよ値が変わらない。あるいは左結合。
技術師匠の教えを守った結果起こったこと

先日 [技術師匠の教えを記録する](https://qiita.com/TsuyoshiUshio@github/items/b9ae6e3a4ee63da66cd1)というポストを書いたが、その後どうなったかというと、正直いうと、生産性が圧倒的に下がって、フラストレーションがたまり、何も達成できなくなった。

# 生産性惨敗の振り返り

私の周りにいる技術の達人はそれはもう凄いレベルなので、彼らのプラクティスやアドバイスが間違っていたということではないと思う。ズバリいうと身の丈にあっていなかったり、有効だけど、今の自分に消化できなかったということだと思う。

最近あまりに出来ない自分にフラストレーションが溜まり、自分の中で爆発した。そういえば一番プロダクティブだったのはいつだろうと考えると８月頃で、仕事に余裕があり、５時で仕事を終えてたけど、仕事もうまくいき、帰ってからは、ハックしてブログも１日３本ぐらい書いている時もあった。

英語の習得のことを思い返して見ても、TOEIC が 400ぐらいのレベルの人にあうベストプラクティスと、900ぐらいの人に有効なベストプラクティスは全然違うけど、それは間違っているからではない。そのレベル感の時にうまくいくか？ということで、私が師匠の教えを全て実践しようとすると、TOEIC 400の人が、字幕なしで映画を見続けるような状態になってしまうのかもしれない。

# ハマり時間のながさ

　最近の自分を観察していると、自分がイライラすることが、物事が全く進まないというのを感じてしまう。今回も社内のハックイベントで、２つのよくわからない問題に遭遇して、ああでもない、こうでもないと悩みまくって、結局１日以上潰して、最終日に直接プロダクションチームに会いに行っても解決しなかった。面白くないので、最後にこれぐらい解決しようと思ったこと、すごく簡単なのだけど、それにもクソハマって、何も進まなかった。だから、他の重要なことをハックできず、何の新しい知識もえられなかった。

　よくよく考えると最初の問題は、プロダクションチームですらわからないのだから、解決できるはずがない。２つ目の問題も、一見簡単んそうな、Azure Functions で　Send Grid を使ってメールを送るのを、Sync ではなく、ASync で送りたいというだけなので、すぐできそうと思ってたができず、プロダクションチームにメールを投げて、何も終わらないイライラで爆発しそうだった。

　二つに共通するのは、諦めず頑張るという自分の性質が裏目に出ていて、どうでもいいことに時間を使っている。ハマりなど時間がかかればかかるほど、多分自分ではもともとも解けない問題なのかもしれない。ハマりそうな時はタイマーをかけて２時間たってもできなかったらメール投げて忘れるとかがいいかもしれない。

　もう一つの問題は、１つ目はクリティカルパスなので仕方ないかもしれんけど、２つめのものは、重要度は全く高くない。実はnode でも実装しているし、Sync なら実装できている。どう考えても優先順位は高くないし、代替え案があるし、実行されている。それでも、物事がコントロールできないイライラからか、突っ込んで調べてしまい、それに時間を使って、他の大切なことができていなかった。まさに無駄だ。

　多分ここは、自分の完璧主義的な性質があって、綺麗なコードを書かないといけないという思い込みが強すぎることがあるかもしれない。プロダクションチームの人も、すごく効率よく調査していたけど、ジタバタせず、さっと諦めていた。（１時間ぐらいで）これが重要かもしれない。

# 長年の出来ないというコンプレックス

私の長年のコンプレックスは、何も出来ないということ。自分がしないコンサルや、講演、講師みたいな仕事は強いのだが、自分がやるもので子供の頃から何一つ出来なかった。それが自分の最大のコンプレックス。遊びも勉強もなんでもそうだった。

英語みたいにある程度できるようになったものと比較すると、プログラミングとか、音楽とか顕著なのだけど、「うまくなりたい」という気持ちが強すぎて、うまくやろうとして、それが足かせになって前に進んでいないのでは？と思い始めた。英語でも、しょぼい頃に、いきなりTOEIC９００レベルのことは出来ないのは当たり前なのに、それになろうとして苦しんで、前に進まないみたいない。（文法をちゃんとしないと思って喋れない人みたいに）

そういう自分になかったものは、多分「目的」と「楽しむこと」なのではないかと思い始めた。しょぼくても、目的が達成されたらいいのだけど、「うまくなること」ばかり考えていると、前に進まない。なんでもいいけど「出来たらええやん」とわしは思う方がいいのではと思い始めた。英語だってそうで、ムッチャクチャなレベルだけど、とりあえず使っているうちにましになるみたいな感じ。コードもそうかもしれない。最初から、細かいことを気にしすぎたら何も出来ない。それよりも、あれやりたい、これやりたいをどうやって実現するか？の過程で学べばいいし、ある方法がうまくいかなくても、目的達成できたら違うのでいいはずだ。

自分が成果を出せたコードも全て「これやりたい」だった気がする。

# 楽しい状態とは？

ブログを色々読んでいて、どこか忘れたけど、一生遊んで暮らせる人が、仕事をしている理由について考察しているのがあって、その解析結果が、「何かを完璧にコントロールできる楽しみ」を得るためとあった。プログラムを始めたのも、ゲームを作りたかったからだった。（当時は知識がなさすぎて、写経ぐらいしかできなかったけど）マジシャンみたいに、どんなサービスでも一瞬で作れるようになったらどんな楽しいだろうな。って。ヴォーカルもそうだよな。あの歌がものすごくかっこよく歌えたらどんなに気持ちいいだろうって。

多分楽しくないのは、間違っているサインだ。達人のペースに合わせたらダメだ。自分が楽しいのを重視しよう。今回は達人のペースに合わせて、エンジョイできなかった。自分ができることをやるのだ。

# 今後やってみること

来週は新しいことを学ぶのをやめる。達人のペースに合わせるのをやめる。達人の教えを全て守ろうとせず、最初の１つだけを実行するのに戻す。あれはとてもうまく回っていた。「上達」を忘れて「やりたいこと」中心に考えてみて、「考えずとも何かを実行できる、コントロールされた状態」をできる範囲で作り出してそれを広げるということをやってみたい。

５時で仕事を終えて、そのあとハックにするけど、５時までの間は、目的ありき、スピード重視を心がけよう。何かやりたいことがあって何かをするようにする。先にテクノロジーを考えない。一方５時で家に帰ってのハックでは、ひたすら自分のペースで、Hello World レベルのものを試してブログ化する。そこでは、スピード重視ではなくて、ゆっくりと自分の消化できるペースで。

あとは、自分をコントロール配下以外に置かないようにしよう。すぐジタバタして深みにハマるので、紙に書いて整理して、一つづつ潰すとかしてみる。これは思考が発散する自分に向いている。

まずは、自分が技術的に TOEIC 400レベルであることを受け入れる。階段を一歩一歩登るんだ。
IFTTT x Google Homeで、ダイエット！

# お詫び

元上司と久しぶりに飲んで帰ったところ、地元の駅の**エスカレーターで、後ろに乗ってた若い女に頭からゲロをぶっかけられるという事案**が発生しました。**そのため更新が遅れましたことをお詫びいたします！**　




# 本題


[スマートスピーカーIFTTT 大喜利 アドベントカレンダー](https://qiita.com/advent-calendar/2017/ssifttt)2日目です。

体重を毎日測るとレコーディングダイエットで痩せると言いますが、何事も三日坊主で続かないので、面倒を極力排除するため、紙に書かないでもいいようにしようと思います。











# 概要

- 名前：Google HomeでGoogleスプレッドシートに体重を記録
- URL：https://ifttt.com/applets/mHLGTret-google-home-google
- 使ったもの：Google Home mini、Google スプレッドシート


## 使い方

- 上記のURLで、アプレットを「ON」にすると、どのGoogle IDにログインするかを聞かれるので、ログインする。
- Google Home に「OK グーグル、今日の体重は ◯◯キロ」と話しかける。
- 正常に認識した場合、「◯◯キロですね。了解しました。スプレッドシートに記録します。」と応答。
- 自分のGoogle IDで、非公開の「Google Assistant 体重記録シート」が生成され、体重が記録される。


Google Assistant 体重記録シートイメージ：
![スクリーンショット 2017-11-30 4.33.38.png](https://qiita-image-store.s3.amazonaws.com/0/173392/3ec0ccd1-e65d-f975-1dcf-1a6caaccefab.png)

## IFTTTのコンフィグ


![スクリーンショット 2017-12-01 1.32.57.png](https://qiita-image-store.s3.amazonaws.com/0/173392/899ef40e-a57b-3715-c05c-afb5a1682553.png)
![スクリーンショット 2017-12-01 1.33.12.png](https://qiita-image-store.s3.amazonaws.com/0/173392/3598acf9-e0af-1d9a-54a2-6f3db52983bc.png)


### Then

上のスクショではThenが見れないので書いときます。

- google Sheets
 - 「Add row to spreadsheet」
- Spreadsheet name
 - Google Assistant 体重記録シート
- Formatted row
 - {{CreatedAt}} ||| {{NumberField}}　　（デフォルトの設定のまま。）
- Drive folder path
 - Google/ 　　（デフォルトの設定のまま。）


# 大事な点

- IFTTTの連携をしてから2〜3分は、実は正常に連携できてない疑惑。なんどやっても失敗するので、しばらく茶でも飲んでまつ。
- Googleスプレッドシートのバグで、IFTTTから送っている日時が記入されない。そこでスプレッドシート側にスクリプトを書きました。→[Googleスプリプトを書いて、日時入力を自動化する方法](https://qiita.com/sitopp/items/66c432da6e33494d1db1)

# 酒は飲んでも飲まれるな！ 




以上です！
[PHP] 祝！PHP7.2.0リリース！

# PHP7.2.0

11月30日にPHP7.2.0がリリースとなりました！

今日は7.2.0で追加された、いくつかの新機能に注目したいと思います！

[http://php.net/manual/ja/migration72.php:title]

# object 型の追加
新たに object型 が追加されました。

そして、型宣言 / 返り値の型 に指定することが出来るようになりました。

## サンプルコード

```php

<?php

function test(object $obj) : object
{
    return new SplQueue();
}

test(new StdClass());

```

# abstractメソッドのオーバーライドが可能に
abstractメソッドのオーバーライドが可能になりました。

```php
<?php

abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}
```

# パスワードハッシュに「Argon2」追加
パスワードハッシュに「Argon2」が選択できるようになりました。

[https://ja.wikipedia.org/wiki/Argon2:title]

`password_` 系の関数で使用可能。

* PASSWORD_ARGON2I
* PASSWORD_ARGON2_DEFAULT_MEMORY_COST
* PASSWORD_ARGON2_DEFAULT_TIME_COST
* PASSWORD_ARGON2_DEFAULT_THREADS

# 型宣言の省略
継承したメソッドの型宣言を省略できるようになりました。

```php
<?php

interface A
{
    public function Test(array $input);
}

class B implements A
{
    public function Test($input){} // 型宣言の省力が可能
}
```

# 名前空間のuse宣言でカンマが使用可能に
PHP7.0で追加されたuse宣言をまとめて行える機能に、

「Trailing Comma」、つまり「最後に余分なコンマを打っても動く」ようになりました。

```php
<?php

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};
```

# number_format()に負数を渡した時の挙動の変化
number_format()に負数を与えた場合の挙動が変化しました。

例えば「-0.01」の負数の少数値を渡した時、以前なら「-0」が返されたが、

PHP7.2からは「0」が返されるようになりました。

```php
<?php

echo number_format(-0.01); // 0 が返されるようになった
```

# 配列からオブジェクトへのキャスト後で数値のキーにアクセス可能に
配列をオブジェクトにキャストした後、

数値キーに対してアクセス出来るようになりました。

以前は文字列のキーのみアクセス可能でした。

```php
<?php

// array to object
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
    $obj,
    $obj->{'0'}, // アクセス出来るようになった
    $obj->{0} // アクセス出来るようになった
);
```

# count()できない場合WARNINGを吐く
count()にカウント出来ない型を渡すとWARNINGが吐かれるようになった。


```php
count(1);  // WARNING
count("apple");  // WARNING
count([1, 2]);  // 2
```


今回調べたのは以上となります！

正直、PHP7.0やPHP7.1の時ほどの驚きは少ないですね。

PHP7.1から10%速度改善しているそうですが、いかほどのものか。

個人的にはプロパティの型宣言が出来るようになって欲しい！！
Windows Subsystem for Linux (WSL)を使ったWindows 10 上でのコンピュータ大貧民(UECda)開発(C言語版)準備(Ubuntu)メモ

#いいわけ
QiitaやMarkdownはじめましてなので読みづらいかも知れないです。
以降，読んでくれると思われる対象がLinux使える・使えないが混ざった説明になってますのですみません。。。
校正とかしてないです。

#コンピュータ大貧民？
電気通信大学で毎年調布祭のときにコンピュータ大貧民大会が行われている。
↓参照
http://www.tnlab.inf.uec.ac.jp/daihinmin/2017/
【重要！】私は運営さんではないので，質問には対応できません。

#Windows Subsystem for Linux？
Windows上でUbuntuとかが動くよ的なイメージ？
https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux

#ということで
##まずはUECda公式から開発キットのダウンロード&&解凍
TOP→開発者の方へ→ダウンロード→C言語版開発キット

##ストアからUbuntuのインストール
Microsoft Store→Ubuntuで検索→インストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/218990/b7b368e2-b382-d26c-0147-d78a77f03e40.png)
「アプリを入手する→Ubuntu」でも下の「Ubuntu」からでもどちらでもOK
インストール後にぴょこっと「インストールしました！」的なのが出てくるので，このときスタートにピン留めしておくと便利かも。

##起動
まず起動すると「Installing, This may take a few minutes...」と出てくるのでそれなりに待つ。それなりに待つ。
（私の場合，なんか待っても待っても次に進まないなぁと思ってEnter押したら進んでました。）

##ユーザの作成
- 「Installation successful!（略）Enter new UNIX username:」と出てくるので作成するユーザ名を入力→Enter。
- 「Enter new UNIX password:」と出てくるのでパスワードを入力→Enter。
- 「Retype new UNIX password:」はさっき入力したばかりのパスワード同じ物を入力→Enter。（sudoとかで使うので忘れないこと！）
→「ユーザ名@コンピュータ名:~\$」の表示になればOK。

##とりあえず$sudo apt-get update
「[sudo] password for ユーザ名:」→さっきのパスワードを入力
気長に待つとupdateされます。

##とりあえずコンパイル（とか）に必要そうなものをインストール
sudo apt-get install build-essential

##大貧民clientのコンパイル
1． cdで開発キットのダウンロード&&解凍した場所まで移動(Cドライブとかは/mnt/c/です。。。)
（～～/tndhm_devkit_c-20140627/とかですかね？）
2． 「\$ cd client」でclientのディレクトリまで移動
3． 「\$ ./configure」config.status: creating MakefileとでてくればOK
4． 「\$ make」
5． 「\$ ls」でclientがいればOK

##大貧民サーバコンパイル準備

###Xming X Server for Windowsのインストール
1. https://ja.osdn.net/projects/sfnet_xming/releases/
からXming，Xming-fontsの両方をダウンロード&&インストール。
2. X11を使うための設定（参考からそのまま）
「\$ vi ~/.bashrc」でexport DISPLAY=localhost:0.0の記述を追加。（viの使い方はググってくださいな）
3. Xming 起動用のショートカットを下の形で作成（参考からそのまま）
"C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow -xkbmodel jp106 -xkblayout jp -dpi 100
4. 一度Ubuntuのウィンドウを閉じ，先ほどのショートカットからXmingを起動し，Ubuntuを開き直す

### その他必要な物をインストール
\$ sudo apt-get install libxaw7-dev

##大貧民サーバコンパイル
1． cdで開発キットのダウンロード&&解凍した場所まで移動（～～/tndhm_devkit_c-20140627/とかですかね？さっきと同じ）
2. 「\$ cd server/src」でserverのディレクトリまで移動
3. 「\$ xmkmf -a」→「\$ make」

##大貧民サーバを立ち上げる
～～/tndhm_devkit_c-20140627/server/src/に移動し，「\$ ./tndhms」

##大貧民クライアントの起動
新しいUbuntuのウィンドウを開いて～～/tndhm_devkit_c-20140627/client/に移動し，「\$ client &」を5回入力→Enter。
最後の"&"を忘れないこと。

#無事起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/218990/4c6f2b1d-510d-1af2-6516-9f720b3e2c44.png)

#最後に
参加者増えるといいなぁ・・・

#参考
http://www.tnlab.inf.uec.ac.jp/daihinmin/2017/
https://qiita.com/shima_529/items/9e818af727fb936771b6
https://qiita.com/Yuichirou/items/38165af29ab1e2d307f6
http://game-informatics.blogspot.jp/2011/01/uecda.html
v0.4 から v0.6 への移行時に、注意したこと

## 概要
 - [Julia データサイエンス](http://www.nts-book.co.jp/item/detail/summary/it/20171001_35.html) (株)エヌ・ティー・エス を５章まで読みました
 - 上記の書籍は、v0.4 対応コードであり、 v0.6 では動かないコードがありました
 - jupyter notebook で v0.4 と v0.6 のカーネルを動かし、書籍のコードを検証しました
 - 勉強会で使った[リポジトリ](https://github.com/data-refinement/Julia-for-Data-Science) 
 - ページ数は上記書籍のものです

## 各論
### @formula(A ~ B + C) P49
v0.4 では、このように、formula を指定しました

```julia
ModelFrame(A ~ B + C, dataframe)
```

v0.6 では、このように ```@formula``` を利用します

```julia
ModelFrame(@formula(A ~ B + C), dataframe)
```
github 上のイシュー [Julia 0.6 Formula broken? #1176](https://github.com/JuliaData/DataFrames.jl/issues/1176#issuecomment-288289133)

### ModelMatrix P49
書籍の出力では、ModelMatrix 関数で、モデルマトリクス部分の表示は行列で表示されていますが
v0.6 では、一行に表示されてしまいます。

```julia
random_modelmatrix = ModelMatrix(ModelFrame(@formula(A ~ B + C), random_dataframe))
DataFrames.ModelMatrix{Array{Float64,2}}([1.0 -0.835347 0.939002; 1.0 0.317254 -1.83803; … ; 1.0 -0.222329 0.755704; 1.0 1.92363 1.48702], [0, 1, 2])
```

該当部分を表示するには、このようにします

```julia
random_modelmatrix.m
5×3 Array{Float64,2}:
 1.0  0.607134   -0.908529
 1.0  1.14795     0.380257
 1.0  2.10419     1.96638 
 1.0  1.5642     -0.191335
 1.0  0.0824698   1.13384 
```

[参考](https://stackoverflow.com/questions/41473164/how-to-do-matrix-multiplication-with-modelmatrix-object-in-julia)

### int(x) ５章 Gadfly のサンプルコード
v0.4 でこのように書いていた部分は、

```julia
plot((x,y) -> x*exp(-(x-int(x))^3-y^2), -10., 10, -3., 3)
```

v0.6 ではこのようになります。

```julia
plot((x,y) -> x*exp(-(x-round(Int,x))^3-y^2), -10., 10, -3., 3)
```

[参考](https://groups.google.com/forum/#!topic/julia-users/63jz1IOjCOQ)

### color("xxx") ５章 Gadfly のサンプルコード

v0.4 でこのように書いていた部分は、

```julia
plot(
 layer(x=x,y=y1,Geom.line,Theme(default_color=color("red"))),
 layer(x=x,y=y2,Geom.line,Theme(default_color=color("blue")))
)
```


v0.6 ではこのようになります

```julia
plot(
 layer(x=x,y=y1,Geom.line,Theme(default_color=colorant"red")),
 layer(x=x,y=y2,Geom.line,Theme(default_color=colorant"blue"))
)
```


### 要素ごとの処理 ５章 Gadfly のサンプルコード
v0.4 では、配列の要素ごとに二乗する処理をこのように書けた

```julia
[1:10].^2
WARNING: [a] concatenation is deprecated; use collect(a) instead
 in depwarn at deprecated.jl:73
 in oldstyle_vcat_warning at ./abstractarray.jl:29
 in vect at abstractarray.jl:32
while loading no file, in expression starting on line 0
10-element Array{Int64,1}:
   1
   4
   9
  16
  25
  36
  49
  64
  81
 100
```

warning に従い
v0.6 ではこのようになります

```julia
collect(1:10).^2
10-element Array{Int64,1}:
   1
   4
   9
  16
  25
  36
  49
  64
  81
 100
```


// 以下、追加予定
お名前.comで取得したドメインをHerokuアプリに設定するメモ

#やりたいこと
Herokuアプリはデフォルトだとこんなドメイン。
`https://boiling-atoll-43680.herokuapp.com/`
これを自分で取得したドメインに変更したい。
今回はお名前.comでドメインを取得したのでそれのやり方のメモ。

#前提
お名前.comでドメインを取得済み
Herokuにアプリをデプロイ済み
Heroku CLI をインストール済み

#手順
以下コマンドを実行

```
$ heroku domains:add www.example.com

Adding www.example.com to ⬢ example-app... done
 ▸    Configure your app's DNS provider to point to the DNS Target
 ▸    www.example.com.herokudns.com.
 ▸    For help, see https://devcenter.heroku.com/articles/custom-domains

The domain www.example.com has been enqueued for addition
 ▸    Run heroku domains:wait 'www.example.com' to wait for completion
```

次に以下コマンドでDNS Targetという情報を確認

```
$ heroku domains
```



ここからはお名前の管理画面
###DNS関連機能の設定

![スクリーンショット 2017-12-01 17.31.10.png](https://qiita-image-store.s3.amazonaws.com/0/112614/198ac27e-a50f-bcbf-d36f-f49d16e09130.png)


###DNSレコード設定を利用する -> 設定する


![スクリーンショット 2017-12-01 17.31.22.png](https://qiita-image-store.s3.amazonaws.com/0/112614/a835012c-2688-6600-be34-d4e55ccc091b.png)

### CNAMEレコードを設定
![スクリーンショット 2017-12-01 17.32.11 2.png](https://qiita-image-store.s3.amazonaws.com/0/112614/ddce48af-0089-936c-c47e-7cc8d18089a2.png)

以上。
数分したら反映されました。
Qtでキュートなツールを作る(導入編)

WindowsAPI(+VisualStudioリソースエディタ)でツールを作っていたけども
拡張性が低い事や、今後のサポートへの不安
そして何よりもスライドバー実装があり得ない程難解且つ面倒!

という訳で、何やら上位互換とも取れそうなQt(キュート)を触れていきます。
Windows,Macへのクロスプラットフォームは勿論の事
スマホへの対応も準備中との事で、期待が高まりますね。
ライセンスはLGPLおよびGPLと自由度も比較的高く、扱いやすそうです。

初回は自分も手探りの中で書いているので導入のみです。
要はWindowsAPIやってたけど、Qt(Qt Designer初心者)向けの解説です。

##0.今回の導入環境
Windows10 64bit
Visual Studio 2015 community
Qt 5.9.3
(なお、VS2015は既に導入しているものとします)

##1.ダウンロード
[Qtダウンロードページ](https://www1.qt.io/download-open-source/#section-2)
ここから本体を入手しましょう
![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/217330/d172db6b-4c0b-2aa6-2c4c-8d6204be79cf.png)
更にOther Downloadsをクリックするか
下の方へスクロールするとVS用アドインがあります
![ss02.png](https://qiita-image-store.s3.amazonaws.com/0/217330/f2f2bee3-3538-fc2a-d076-c2976bf332e9.png)

##2.インストール
###Qt本体
まずは本体(exe)を起動してみましょう

最初の画面は**next**
次はアカウントを聞かれますが**skip**で問題ありません。

続いてwelcomeと小さめの文字で言われるので、歓迎ありがとうの気持ちを込めて**次へ**を押します
(ここから少しの間リポジトリから引っ張ってくるため、待ちます)

続いてインストール先です。
デフォルトがCドライブ直下ですが、気に入らなければ変えると良いでしょう。
C++やhといった**ファイルと関連付けたく無い場合**は下のチェックを外し忘れないよう気を付けてください。

さて、アドベントカレンダーに突っ込まれたがために急遽用意した記事の為
実は自分でもよくわかってないけど、これだけはインストールしておけ!
というのがコレです。
全部突っ込んだら40GB消えるのは余裕なので、
とりあえずコレさえ突っ込んでおけば大丈夫なはずです。
(間違っていたらすぐ更新修正します)
![ss03.png](https://qiita-image-store.s3.amazonaws.com/0/217330/4cd57abc-5c75-5474-ad9d-46488959bcca.png)
Qt 5.9.3
- UWP x(開発環境のビット数) (VisualStudioのバージョン)
- msvc(VisualStudioのバージョン) (開発環境のビット数)
- Sources
- Qt Script (Deprecated)
Tools
- Qt Creator 4.4.1 CDB Debugger Support
- MinGW 4.9.2

ちなみに、万が一後々追加したり、削除したくなったり
あるいは更新したくなった場合は、アンインストールしようとするとメニューが出てきますよ
![ss09.png](https://qiita-image-store.s3.amazonaws.com/0/217330/1b15d610-10f3-a174-826f-dd3bec994e28.png)

減らしたとは言え、大容量で時間がかかります。
気長に待ちましょう。

###VisualStudio
vsix形式のインストーラーです。
こちらのインストーラーはとても簡単。
起動して、指示に従っていればすぐ終わります。

##3.VisualStudioに組み込む
VisualStudioのメニューバー、ツールから
拡張機能と更新プログラムを選択しましょう。
![ss04.png](https://qiita-image-store.s3.amazonaws.com/0/217330/7d50731b-248e-7482-24b2-3b072ccd6dc3.png)

オンラインから、Qtで検索すると一番上に出てきます。
この拡張機能をインストールしましょう。
![ss05.png](https://qiita-image-store.s3.amazonaws.com/0/217330/14880829-d197-af6b-1b5c-f0f4eba25f6b.png)

すると、先ほどのツールバーに**Qt VS Tools**が出現します。
(出なかったらVSを再起動してみましょう)
そのメニューのオプションより、Qtのファイルパスを指定します。
**Version name**は好きに設定できますが、Qtのバージョンを書くと良いでしょう。
そして**Path**はQtフォルダの中のmsvc(VisualStudioのバージョン)を選択します。
![ss06.png](https://qiita-image-store.s3.amazonaws.com/0/217330/c3aa5801-5bcf-e811-5bf0-823a5a807383.png)

これで一通り環境設定はできましたね!

##4.導入できたか確認
新しいプロジェクトを立ち上げ、Qtの欄が出現していれば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217330/ec3f6ab2-d93f-8142-31f1-e0ab020fb2d9.png)

##5.次回予告(?)
今回は導入まででしたが、次回からVSリソースエディタに置き換わる
Qt Designerに触れていけたらと思います。
これが出来ればかなりツール制作の幅は広がりそうです。

アドベントカレンダーの次の予定日が思ったより時間無いので
頑張って勉強します…
【Java】formとentityとdtoの違いって？【Bean】

新人さん＠Java研修中のソースコードレビューをしているときに、自分でもあやふやだったので調べてみました。

# formとentityとdtoの違い
**・・・見た目の違いはありません。**
ホントに、マジで。使い方が違うだけで、中身は（ほぼ）変わりません。
３つともただのBeanです。
新人さん:beginner:は、formとentityとdtoは「使い道を示すBeanのニックネーム」だと思ってもらえれば、とりあえず:ok:かと思います。

# Beanとは
だいたいこんな感じのクラスです。
いろんなプロパティがあって、そのプロパティに対するsetter/getterメソッドを持っています。

```Java:MemberBean.java
public class MemberBean {
    private String name;
    private int age;

    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
```
上記:arrow_up:の例では、クラス名を「MemberBean」としてますが、

- formの場合：MemberForm
- entityの場合：Member
- dtoの場合：MemberDto

とかになることが多いと思います。

## formの特徴

- HTTPのPOSTメソッドで送信された値(=formタグの中身)が入っている。
- なので、webサービス以外ではあまり使わないような気がする。
- formタグの中身なのでBeanの名前もform・・・って覚えておけばいいと思う。
- クラス名は「xxxForm」となることが多い。

## entityの特徴

- DBに登録・更新する値を入れておく。
- DBから取得した値を保持しておく。
- クラス名とテーブル名はたいてい同じになることが多い。

## dtoの特徴

- Data Transfer Objectの略がdto。
- その名の通り、データ交換用のBean。
- 新人研修レベルだと使わなくても十分・・・というか使う必要性が見当たらないことも多々ある？

データ交換とは、例えばformからentityへの変換をさします。
例えば、formでは年/月/日と入力を分割しているけど、DB上では生年月日をDate型で持っている場合、どこかのタイミングで結合する必要があります。
この場合、formやentityを直接編集すると、何かあった場合に元のデータに戻せなくなることがあります。
それを避けるために、一旦dtoに入れておく・・・という使い方をします。

# まとめ
**formとentityとdtoは３つともBean** で、目的が異なるが故に名前が分けられているだけでした。
個人的には、新人研修レベルのプログラムだと、３つもBeanを使い分ける意義が見出しにくいと思います。
だけど、規模の大きなシステムを作っていこうとすると、目的に応じたBeanがシステム全体の（プログラムレベルでの）統制を取ってくれているのかなぁと感じてます。
JavaScriptでGIS演算を容易に実現するturf.js

kochizufanです。
今年のFOSS4G Advent Calendarでは2番手を、初のFOSS4G TOKAI開催日というめでたい日に担当することとなりました。
よろしくお願いいたします。

取り上げる内容は、JavaScriptで種々のGIS演算を簡単に実現できるライブラリ、[turf.js](http://turfjs.org/)のご紹介なのですが、その前に内容にもかかわる自己紹介等を。
私、普段は余暇で、古地図や絵地図をGPSや正確な地図と組み合わせて、街歩きを楽しむサイトを作成できるオープンソースの[Maplat](https://github.com/code4nara/Maplat/wiki)というプロジェクトを主宰しています[^1]。
このMaplat、似たようなソリューションに[Stroly](https://stroly.com/)という製品がありますが、見た目は似ているものの内部の処理は全く異なる手法を採用しており、Maplatではデータを処理するのに対応点の三角形分割からのベクトル演算を行っています。
この結果、MaplatはStrolyの手法では実現できない、古地図と正確な地図の間でのトポロジーを維持した座標系の全単射(1対1)変換が実現できており[^2]、Stroly同様の観光等分野だけではなく、Strolyでは参入できない林業や不動産等の分野での引き合いもいただきはじめています。

私自身Stroly社の前身であるATR-Promotions社に在籍しており、Strolyの開発にも携わっていましたが、この対応点三角形分割からのベクトル演算による座標変換技術のアイデアはATR-Promotions合流前のマピオン在籍中から温めており、Strolyに関わっていた間も座標変換精度向上のためにStrolyに採用したいとずっと考えてきたアイデアでした。
が、三角形分割を行うロジックを自分で書くことができず(恥)、ずっと実現できませんでした。
それが実現できるようになったきっかけが、turf.jsの登場で三角形分割含む様々な地理情報演算がJavaScriptで簡単にできるようになったことです[^3]。
![MaplatEditor](https://qiita-image-store.s3.amazonaws.com/0/10108/0f05518d-bce9-df0a-9a60-65dfefc3564e.png)
この画像はMaplatのデータを編集する[MaplatEditor](https://github.com/code4nara/MaplatEditor/wiki)の編集画面ですが、地図上にバラまかれた無数の対応点が隙間ない三角形に分割されているのが見て取れると思います。
この複雑そうな処理が、[turf.tin](http://turfjs.org/Docs#tin)という関数一つであっという間に実現できます。
まさにMaplatを作ることができたのは9割方turf.jsのおかげ、turf.js様様といえるライブラリです。

turf.jsが提供するのは三角形分割だけではありません。
座標値の配列から簡単にGeoJsonオブジェクトを生成できる全ての基本のヘルパースクリプト群から、様々な計測を行う関数、変形を行う関数、ジオメトリ変換を行う関数、種々のグリッドを生成する関数、集計を行う関数、条件判定を行う関数など、最新のバージョン5.0.4で17カテゴリ138種類もの関数を提供しています。
実際Maplatでも、三角網生成の他にヘルパースクリプト群、凸包を求める[turf.convex](http://turfjs.org/Docs#convex)、ジオメトリ差分を求める[turf.difference](http://turfjs.org/Docs#difference)、ジオメトリ衝突を判定する[turf.intersect](http://turfjs.org/Docs#intersect)、ジオメトリ内の頂点群に全件処理を行う[turf.coordEach](http://turfjs.org/Docs#coordEach)、重心を求める[turf.centroid](http://turfjs.org/Docs#centroid)、ジオメトリの頂点の並びが時計回転か否かを判定する[turf.booleanClockwise](http://turfjs.org/Docs#booleanClockwise)等様々な関数を活用しています。
138種もの関数を眺めているだけでも、何か面白いことができそうだ、新しいサービスや作品のアイデアが湧いてきそうな気がしませんか?

でも、そんなにたくさんの機能がてんこ盛りなんて、さぞやライブラリサイズが巨大なんでしょう...?と思われるかもしれません。
実際、ライブラリサイズは[minified](https://npmcdn.com/@turf/turf@5.0.4/turf.min.js)して748KBで、下手なアプリケーションスクリプトくらいのサイズがあります。
が、これも心配無用です。
turfは徹底してモジュール化して作られているので、とりあえずフルバージョンでいろいろ試してみて使う関数がFIXしたら、欲しい関数だけを含んでいる自家版turfライブラリを簡単に作ることができます。
その方法はbrowserifyを使う方法が[こちら](http://turfjs.org/getting-started)に紹介されていますし、少しバージョンが古いライブラリ[^4]でよければ、[こちらのサイト](https://turfjs-builder.herokuapp.com/)でグラフィカルに欲しいものをピックアップして自家版を生成することもできます。
必要なものだけピックアップした自家版を使えば、ライブラリサイズもそうは大きくならないはずです。

機能ショーケースを見ているだけでワクワクしてくるこの138種もの関数群を使って、データの経緯度でピンを落とすだけのサービスや処理は卒業して、何かひねった面白いサービスや処理ができないか、この年末アイデアを練ってみてはいかがでしょうか。

[^1]: プロジェクト関連のURLを一覧しておきます<br>プロジェクトサイト: https://github.com/code4nara/Maplat/wiki<br>SlideShare: https://www.slideshare.net/kokogiko/maplat-historical-maps-viewer-guarantees-nonlinear-bijective-projection<br>動作サンプル(会津若松市): https://bit.ly/aizumap<br>データエディタのプロジェクトサイト: https://github.com/code4nara/MaplatEditor/wiki
[^2]: 特許出願中、特願2017-218223 
[^3]: 実際、5年越しで形にできなかったアイデアが、turf.jsの登場で三角形分割が簡単にできるようになった途端、1か月ちょっとで動くところまで形にできました。
[^4]: 記事執筆時点で4.7.3対応。
EffekseerをUnrealEngine4で使用する方法について


アドベントカレンダー1日目です。

# 概要
我々はEffekseerというエフェクト作成ツールを開発しています。
下に示したようなエフェクトを簡単に作成できます。
そして、様々な環境で使用できます。

ちなみに、すべて無料です！

今回はEffekseerで作成したエフェクトをUnrealEngine4で使用する話をします。

[![Movie](http://img.youtube.com/vi/JGMu5_opu5Y/0.jpg)](https://www.youtube.com/watch?v=JGMu5_opu5Y)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/210811/d73d7e23-6168-7fee-1b99-04b8216a38bd.png)

# Effekseerのメリット

UnrealEngine4にはカスケードがあります。それに対してEffekseerを使用するメリットは何でしょうか？

1つ目としては、作成したエフェクトを他のゲームエンジンで使用できることです。人によっては、いろんなゲームエンジンに対してエフェクトを提供したり、ゲームエンジンを行き来することもあるでしょう。専用のツールで作成したエフェクトだと、移行できないですがEffekseerなら移行できます。Unity、Cocos2d-x、DXライブラリ等に対応しています。

2つ目としては、お手軽さです。マテリアルを作成したりする必要はなく、数値調整で簡単にエフェクトを作成できます。よく使う円形のモデルもモデリングする必要はなく、ツール内で数値で生成できたりします。

# 使用方法

公式のドキュメントを見てください！

[公式ドキュメント](https://effekseer.github.io/Help_UE4/index_ja.html)

プラグインはこちらからダウンロードできます。

[プラグインのダウンロード](https://effekseer.github.io/jp/documentation.html)

特殊な手順は必要なく、ネイティブのコードプラグインを導入する方法でインストールできます。Windowsの場合、VisualStudio2015、Macの場合、XCodeがインストールされている必要があります。

プラグインに搭載されている ```EffekseerSystem_BP``` と ```EffekseerEmitter_BP``` をレベルに追加して、エフェクトのファイルを指定するだけで再生できます。

また、アニメーション通知にも対応しており、カスケードと同じようにEffekseerのエフェクトもモーションに指定できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/210811/e121f90c-ea3f-71c3-c631-492eb71da5a5.png)

# 注意点

歪みの挙動がEffekseerのツール上で作成した場合と異なります。
減算処理は疑似的に再現したものであり、色味がツール上と異なります。
(UnrealEngine4の負の色を復活させてほしいです)

リリースしたばっかりなので、足りない機能があるかもしれません。
ただ、既に一部のゲームでは使用されています。
もし、足りない機能がありましたら公式に連絡お願いします。

# Effekseerは使用しない人へ

EffekseerForUE4はgithub上で開発しています。
プロシージャルにメッシュを生成する方法やマテリアルを生成せずに、
一部の値を変更して描画する方法等のノウハウが含まれています。興味あったら見てみてください。

[Github](https://github.com/effekseer/EffekseerForUE4)

[公式サイト](https://effekseer.github.io/)
大学生のうちにやっておいてよかったこと、やっておけばよかったこと

# はじめに
早稲田大学アドベントカレンダー2017、1日目の投稿でございます。
人間科学部卒業生の@kuriiiimuです。
卒業生のくせに1日目でいいのかと思いつつ、勢いで書くことにしました。

私は今年の3月に卒業して現在某社で新卒エンジニアとして働いています。
人間科学部はちょっと特殊で、理系科目で受験することも文系科目で受験することもでき、入学後はどの学科のどの授業も原則受講ができます。
そんな環境から出発して新卒エンジニアとして半年くらいやってみて思うことを書いていきたいと思います。

業界にもよると思うので、ここに書くことはかなり偏っていることだと思いますので、読んだ皆さんも思い思いの意見を頂けると幸いです。

# 学生のうちにやっておいてよかったこと
## サーバー構築
すべては大学の授業「インターネットサーバ」の授業から始まりました。
人科はMac必携なのですが、そのMacにHomebrewをいれApacheをいれPHPをいれMySQLをいれ……みたいな授業でした。
課題だけ言われて何も教えられない授業でしたが、難しくもすごく熱中したのを覚えています。
この後、さくらのVPSでWordPressブログを構築したり、Minecraftのマルチサーバーを構築するなどしたわけですが、これくらいのことができないと開発環境の整備もできないしAWSも使えないし、セキュリティを意識することもなかったし。。。
一度やったことがあればアプリケーションに時間をかけることができるようになるので、やっておいてよかったです。

## Vagrant
ローカルを壊さずに開発するということを覚えました。Dockerもやっておけばよかった。

## Laravel
これはLaravelそのものというよりも、MVCモデルのアプリ構築って感じです。
やっぱりMVCって考え方はやってみないとわからないと思います。
私がサークルで使ってたLaravel5.0の頃は全然日本語の記事がなくて、英語で検索してみたり、ログ見てみたり、公式ドキュメント読んでみたりという、今なら当たり前のことを苦労してやっていた気がします。
そのおかげで、今になって英語で検索するのも当たり前だし、ドキュメント読もうと思うようになった気がします。
モジュールをうんうん唸りながらインストールしてやっとLaravel動かした、みたいな経験はバージョン依存の調査とか意識するきっかけになっている気がします。

## Git/Github
とっつきにくい概念だからこそ、経験してることが大事な気がしてます。
.gitignoreとかうまく使わないと社会人はいろいろアレですし。
これはサークルに入ってて本当によかったなという感じです。
個人でやってるとプルリクエスト送るみたいなのもないですし。

# 学生のうちにやっておけばよかったこと
## 数学 
機械学習やりたい！って思うときに、Σがあるだけで一瞬考えちゃう、みたいな感じなので、本当に残念という感じです。
全然できなくてもコード書くことはもちろんできるので、領域選べばいらない気もするけど、もしこれが理系学部だったらもう少し数学できるのかなとか思うと。

## 英語
残念ながら海外に行くというお仕事は当面なさそうですが、英語の本読まねばならなくなることは割とあります。とくにニッチな領域攻めようと思うと。

## 基本情報レベルの理論
会社には大学でそういう授業受けてきた人たちが大半なので、「そんなことも知らないのか」という感じになります。
大学で受けられるなら授業受けるのがよさそう。
僕はオープンのネットワークなんちゃらみたいな授業取りましたが、あれもっとちゃんと勉強しておけばよかった。TCP/IPとかいまだに何なのかわかってないです。
ただ、資格を取ったほうがいいということではないです。
会社にもよりますが、資格試験の受験料を出してくれる会社もあるし、受かるとお祝い金みたいなのがもらえる会社もあります。
お金がかかるものは社会人になってからでいい。

## JavaScript
Node.jsなりReactなり、もう覇権感がすごい。
そして、ウェブやる以上避けては通れない（と思う）し、非同期処理のクセがいまだに慣れない。

# おわりに
なんか忘れていることありそうなので思いついたときに追加しておきます。
基本的に、何もやったことがなくても何とかなることは間違いありません。
もちろんその分頑張ることもあるけど。

そんなことより、ビジネスのことを理解できるエンジニアとか、ビジネス側とコミュニケーションとって新たなビジネスチャンスを生み出せるエンジニアって結構求められている気がするので、文理融合・人科エンジニア志望のみなさんにもチャンスありますよ。

早稲田大学アドベントカレンダー、盛り上がらないかな～～。
楽しみにしています。
【Go】コンパイルが遅い時にやること

# コンパイルが遅い時にやること
複数のプロジェクトををGoで書いていたり、ライブラリをアップデートしたりしていると、
コンパイルに10秒ぐらいかかる時があります。

そんなときの解決法を見つけたので備忘として書いておきます。

pkg以下を削除してgo installを実行
たったこれだけで10秒かかっていたコンパイルが数秒に短縮されます

```
rm -rf $GOPATH/pkg
go install
```

[faster-golang-builds](https://ttboj.wordpress.com/2017/02/26/faster-golang-builds/)によれば、ビルド時にうまくキャッシュが効かないのが原因みたいです。(低英語力による読解)

ちなみに検証環境はGo 1.9.1
WindowsでのRails開発用にAptana Studioをインストールする手順

#はじめに
Ruby on railsでのIDEセットアップについて。
Ruby開発者はVimを好むという噂も耳にしたが、Eclipseに慣れていることもあるので、
ひとまずAptana Studio 3を試してみる。

[検証環境]
Windows 10(64bit)
Ruby 2.4.2
Rails 5.1.4

#Aptana Studioのダウンロード
こちらからダウンロードできる。

http://www.aptana.com/products/studio3/download.html

Windowsを選択してDownloadボタンを押す。
(Emailの入力は任意のようです)

![スクリーンショット 2017-12-01 23.59.25.png](https://qiita-image-store.s3.amazonaws.com/0/216980/2f333829-4852-de12-2d2f-c344f8e7ec20.png)

#インストール
ダウンロードしたインストーラを実行してインストールする。
この時、以下のようなエラーが出てインストールが失敗した。
(Windows10環境すべてで発生するのかは不明)

```
Failed to correctly acquire installer_nodejs_windows.msi
```

コマンドプロンプトで以下のようにオプション指定してインストーラを実行することでエラー回避できた。
```
Aptana_Studio_3_Setup_3.6.1 /passive /norestart
```
バグ? callbackを使うときの注意点

# はじめに
callbackを利用する際に自分が予想していた挙動と異なる動きをすることがあったのでメモとして残しておきます。

# 問題

今回扱う問題を簡単にまとめると、「callback内で子要素をアソシエーションを用いて作成すると子要素のbefore_updateが呼ばれる」というバグになります。

作成のみするので、子要素のbefore_createだけが呼ばれるのを期待していたところ、なんとbefore_updateまで呼ばれてしまったということです。

具体的なコードを見ながら確認したほうがわかりやすいので以下に示します。
※ 例は適当です

```ruby:point.rb
class Point < ApplicationRecord
  after_create do
    point_histories.create!
  end

  has_many :point_histories
end
```

```ruby:point_history.rb
class PointHistory < ApplicationRecord
  before_create do
    # この部分だけ呼ばれると予想していたが...
  end

  before_update do
    # この部分も呼ばれる
  end

  belongs_to :point
end
```

この状態で `Point.create` するとその子要素であるPointHistoryクラスのbefore_updateも呼ばれます。

updateなんてどこにも書いてないのになんでbefore_updateがよばれるんだろう...って感じですね。

# 原因
この動きになる原因なのですが、Railsにはモデル間がアソシエーションで関連付けられている際、関連づけられているモデルを自動で保存する機能があるのでそれが悪さをしているようでした。

(そもそもcallbackではなくこれをつかってcreateすればって感じですが割愛で笑)

こういうやつですね。

```ruby
point = Point.new
point.point_histories.build
point.save # pointとpoint_history両方作られる
```

これを今回の例にあてはめてみると、after_create内部でアソシエーションを用いて、関連づけられているモデルのレコードを作成しているのがわかります。

```ruby:point.rb
class Point < ApplicationRecord
  after_create do
    # アソシエーションを用いてレコードを作成
    point_histories.create!
  end

  has_many :point_histories
end
```

アソシエーションを用いてレコードを作成しているため、上記で説明した関連づけられたモデルを自動で保存する機能も動き、(すでにレコードがあるため)before_updateが呼ばれるということになります。

# 解決策

callbackを利用したい場合の解決策としては「アソシエーションを用いずレコードを作成する」、「autosave: falseオプションを使用する」方法があります。

## アソシエーションを用いずレコードを作成する

```ruby:point.rb
class Point < ApplicationRecord
  after_create do
    PointHistory.create!(point_id: id)
  end

  has_many :point_histories
end
```

## autosave: falseオプションを使用する

```ruby:point.rb
class Point < ApplicationRecord
  after_create do
    point_histories.create!
  end

  has_many :point_histories, autosave: false
end
```

# おわりに

考えてみればたしかにそうだなーという感じの挙動なのですが、意識していないとバグを生むことにもなるかもしれないのでみなさんも気をつけてください。


なお、本記事で扱ったバグはすでにRailsの[issue](https://github.com/rails/rails/issues/29864)にもあげられていますが修正には及ばずcloseされてしまったようです。
Azure Notebooks 活用の tips

# Azure Notebooks とは

[Azure Notebooks](https://notebooks.azure.com) は

- 無料で
- クラウド(Azure)のJupyter Notebook環境が利用できる

サービスです。
Azure Notebooks を使うと，手元のパソコン内にプログラミング環境が無くても
ウェブブラウザの中でインタラクティブなプログラミングができます。
(ただし，インターネットにつなぐことができれば，の話です。) 

プログラミング言語としては

* Python(ver2,3系両方)
* R
* F#

がサポートされています。

この記事ではAzure Notebooks活用のtipsをお伝えします。

# pipを用いたPython packageの追加
Azure Notebooksの環境中に使いたいPython packageが無い場合があるかと思います。
そのような場合でもpipコマンドで追加することが可能です。
NotebookのCell中で `!` を pipコマンドの前に付けると実行できます。
また，たとえC[++]拡張を含むpackageでも，whl形式で配布がされていればコンパイル不要で即座にinstallが完了します。
(whlはコンパイル済みの依存拡張ライブラリをPythonパッケージに詰め込んだものと考えてください。) 
ここでは例として
StanのPythonインターフェース [pystan](https://pypi.python.org/pypi/pystan) の追加を挙げてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/61f63457-7947-360b-0e64-9254e4865f10.png)

上記のように最初からAzure Notebooks内にそのPython packageが無い場合でも, (Linux用の) whlがPyPIにあれば
即座にインストール・利用が可能です。

# Github の repository の clone

Azure Notebooksのライブラリ (notebookの一まとまり，と考えてください) の追加方法として
githubのrepositoryのcloneがサポートされています。

これを使うと，オライリーの書籍のnotebook repositoryなどを自分のAzure Notebooksライブラリに容易にクローンできます。
例えば [Andreas Mueller](https://github.com/amueller)さんと [Sarah Guido](https://github.com/sarguido)さんの共著
[Introduction to Machine Learning with Python](https://www.amazon.com/Introduction-Machine-Learning-Python-Scientists/dp/1449369413) の [notebook repository](https://github.com/amueller/introduction_to_ml_with_python) をみなさんのAzure Notebooksのライブラリとしてimportしたいとしましょう。
その場合，下記のように入力することですばやく import できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/874d34e6-a300-cab3-9bc4-a1892e45a790.png)

また最近ではこの **From GitHub** 指定画面に導く badge がREADMEに用意されている GitHub repository も存在します。
例えば [Wes McKinney](https://github.com/wesm) さん著の [Python for Data Analysis, 2nd Edition](https://www.amazon.com/Python-Data-Analysis-Wrangling-IPython-ebook/dp/B075X4LT6K/) の https://github.com/wesm/pydata-book がそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/56a3fb2f-d8b8-a4de-d7a7-064fee39084e.png)

# notebook extensions の標準サポート

Azure Notebooks の環境には最初から notebook extensions が幾つかインストールされています。
menubar 中の **nbextensions config** からGUIで有効化できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/6ea3f739-2f58-4b6a-40c5-2be045a9f91e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/f39ff3ff-8ffa-e82f-80c0-9de7c1fd0d62.png)


# Jupyterlab の標準サポート

次世代版 Jupyter Notebook の Jupyterlab も Azure Notebooks 環境には最初からインストールされています。

下記の画像のようにURLを変更しjumpすることでJupyterlabがstartします。
(画像中のURLの **fDh168plrKc** の箇所は各notebook環境固有の文字列になります。適宜置き換えて考えてください。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/b0864ae4-8d2d-d907-ece6-77c797f4295b.png)

以上 Azure Notebooks 活用の tips でした。