OmniAICreator/Qiita-1.07M huggingface dataset:
ニューラルネットワークとは

前回に引き続き、深層学習について私が勉強していることをメモしていきます。
今回はニューラルネットワークについてです。

相変わらず自分でも書いてて「？？？」となることがあるので誤ったことが書いてあったら訂正していただけたら幸いです。

#ニューラルネットワーク概要
![ニューラルネットワーク.png](https://qiita-image-store.s3.amazonaws.com/0/28622/38364563-eef6-259b-93f8-6d0531dad801.png)


上の図は簡単なニューラルネットワークの構成図です。
-入力層
-隠れ層
-出力層
から構成されます。入力層と出力層は１層だけですが、隠れ層の数は任意です。（この隠れ層の数をパラメータとして最適な数を割り当てることも、精度向上の鍵となる）

各層はノードと呼ばれる任意の数の変数から構成されています。これらのノードが入力層から始まって隠れ層を通過していき、最終的に出力層へ到達します。（活性化関数によって通過しないノードのことも考えると少し適切な言い方ではないかもしれませんが）

まとめると、ニューラルネットワークとは、
__m次元のベクトルxをn次元yに移す関数fを推定する方法__
と表現することができます。

#ノード間のやりとり
では、どのように各ノードは値をやりとりしているのでしょうか？

下の図を見てください。

![素子モデル.png](https://qiita-image-store.s3.amazonaws.com/0/28622/7d27356b-49da-2264-ab2a-b97f089e44a2.png)


１対１のノードのやりとりを表しています。
出発するノードはaという値を持っており、aに対して重みwを掛けます。重みwは正負どちらの値もとるため、aは増幅も減衰もします。
そして、到着点であるノードには閾値rが設けられています。
この閾値rをawが超えるのであれば次のノードへawを伝達、超えなければ伝達しないこととします。

なお、この次のノードへ伝達するかしないかの判定をするのは**活性化関数**という関数の役割です。

#誤差逆伝播法
こうしていくつものノードがやりとりを行っていくうちに、m次元だった入力データはn次元のデータへと変換されます。それが出力結果です。
その出力結果は教師データと比較されます。教師データとの誤差が大きい場合は、隠れ層にてかけてきた重みが不適切だったということなので、重みwを更新しなければいけません。

※現時点で筆者は出力データの中身が具体的に何なのか恥ずかしながら理解していません。実際に深層学習フレームワークなどで実装する際にデータを出力させながら確かめていく予定です。

では、どのように重みwを更新すればいいのでしょうか？
そのための手法が**誤差逆伝播法**です。

得られた出力結果から、教師データとの誤差を算出して、パラメータとしての重みを調整し、調整された値を元にまた後ろのノードへと更新を伝えていきます。

![誤差逆伝播法.png](https://qiita-image-store.s3.amazonaws.com/0/28622/57fa5158-4d14-b27c-d6d6-ca7c12b58c9a.png)

では、具体的にはどのようにして更新していくのでしょうか？

#勾配降下法
重みを調整する方法の一つとして、**勾配降下法**があります。

これは、誤差が誤差関数を利用して算出されることを利用します。この誤差関数は
-出力と教師データとの差が大きければ大きいほど返り値が大きくなるもの
-微分可能であるものであることが
であることが求められます。

例えば、誤差関数をグラフにすると以下の図になるとします。

![勾配降下法.png](https://qiita-image-store.s3.amazonaws.com/0/28622/e76af992-3949-490f-ef35-4ad4642dadcf.png)

誤差は重みwによって決まります。
ここで、微分可能であるということは、最小値を求めることができます。そこが最適なwであるwoptです。
なお、傾き0なのが最小値であることを保証するために下に凸になるよう誤差関数を選ぶ必要があるようです。（このあたりはまだ不安）

更新量Δwは、以下の式で求められます。

```math
Δw = -η\frac{δE}{δw}

```

誤差が大きいほど傾きは大きくなるため、傾きだけ誤差を更新させます。マイナスをとるのは傾きが正であればwを減少、負であれば増加させるためです。
ηは学習係数で、さすがに傾きをそのまま使ってもうまくwoptを求めることはできないため、誤差を元にどの程度更新するかを決める値です。

この学習係数も精度向上のためにうまく設定する必要があります。

#おわりに
今回はここまでにします。
ところどころおかしな点もあると思うので勉強を進めていく中で追記、編集していきます。

#参考
山下隆義
イラストでわかるディープラーニング 講談社
新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社

高卒でもわかる機械学習 (2) 単純パーセプトロン
http://hokuts.com/2015/11/25/ml2_perceptron/
Chainerで始めるニューラルネットワーク
http://qiita.com/icoxfog417/items/96ecaff323434c8d677b
JavaScriptでフォネティックコードを表示するプログラムを書いてみた！

完全に備忘録の自己満足です。
そして初心者なので悪いところ改善すべきところがあればご指摘お願いします。

全体のコードがこちら。

````code.js
function outputMoji(){
 var n = document.inputform.moji.value;
 var str = new String(n);
 var code = {
  a:"Alpha",
  b:"Bravo",
  c:"Charlie",
  d:"Delta",
  e:"Echo",
  f:"Foxtrot",
  g:"Golf",
  h:"Hotel",
  i:"India",
  j:"Juliet",
  k:"Kilo",
  l:"Lima",
  m:"Mike",
  n:"November",
  o:"Oscar",
  p:"Papa"
};
var a = new String;

for(var i = 0; i < str.length; i++){
 a += code[str.charAt(i)] + "<br>";
}
document.getElementById("result").innerHTML = a;

````

```code.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <script type="text/javascript" src="code.js"></script>
  <title>フォネティックコード</title>
</head>
<body>
  <form name="inputform">
    <p>
      文字の入力：<input type="text" name="moji" /><br />
      <input type="button" onclick="outputMoji()" value="入力" />
    </p>
  </form>
  <p id="result">
    文字を入力してください。
  </p>
</body>
</html>
```



まずJavascriptファイルを上から順に追っていくと…

```code.js
function outputMoji()
```
でフォネティックコードを作っている。
次に

```code.js
var n = document.inputform.moji.value;
var str = new String(n);
```
が外からの入力nをstrに代入していることを表している。
代入された値は次のhtmlファイルの位置

```code.html
<body>
  <form name="inputform">
    <p>
      文字の入力：<input type="text" name="moji" /><br />
```
inputformにあるmojiの値をnに代入しますよ～っつーこと。
outputMoji()関数の中に入ってるcodeはフォネティックコードです、途中までしかないのはめんどくさ(ry

次に行きます。
JavaScriptファイルの

```code.js
for(var i = 0; i < str.length; i++){
 a += code[str.charAt(i)] + "<br>";
}
document.getElementById("result").innerHTML = a;
```
は、入力されたstrの長さstr.lengthだけfor文を実行。
str.charAt(i)はstrのi番目を取り出すという意味。
それをfor文で動かすことで、順に文字を取ってくることができる。
んで、code[]は連想配列だから、str.char[i]をそのままcode[]に入れていけば、対応するフォネティックコードが出てくることになる。(akiを入力したらcode[a]、code[k]、code[i]が表示されるってゆーこと。)

さて、終盤ですね。

```code.js
document.getElementById("result").innerHTML = a;
```
この記事を書いてやり直すまで、これの意味がさっぱりわからなかった…。

JavaScriptのdocument.getElementById()は、ドキュメント内にある、指定したidを持つ要素を1つ取得するメソッドです。存在しない場合はnullが返ります。
(リファレンスを参照　https://syncer.jp/javascript-reference/document-getelementbyid)
ということらしいので、これを使ったみたいです。。。

.innerHTMLはこちらを参考にしました。(http://wp-p.info/tpl_rep.php?cat=js-biginner&fl=r13)

つまり、

```code.html
<p id="result">
文字を入力してください。
</p>
```
を入力した後に出て来るフォネティックコードに置き換えてるってことになります。多分。

実際のページがこちらです。

**実行前**
![名称未設定 1のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/145671/edfd5810-a055-605e-4549-93521b6faa22.jpeg)
**実行後**
![code.jpg](https://qiita-image-store.s3.amazonaws.com/0/145671/13d3d2ea-a00c-7c89-e7b0-8a368a0d9e0f.jpeg)
ページが白いので見にくいですが、気にしない気にしない。

これを書いてておもったのが、入力した文字に大文字が含まれていたらどうしよう…ということです。
正規表現を使うべきなのか…。
それはまたいつかできるときにやりたいと思います。

できれば毎日書いていきたいなあ…。
iMac (27-inch, Late 2013) macOS Sierra でAtlas SoC

#1. Virtual COM Port Driversのインストールと接続
USBポートを仮想COMポートとして使用する
http://www.ftdichip.com/Drivers/VCP.html
からVer.2.3をダウンロードしてインストール

ターミナルから
<pre>
ls /dev/tty.*
</pre>
tty.usbserial-A504RXSK がある。これか。

<pre>
screen /dev/tty.usbserial-A504RXSK 115200
</pre>
でAtlas SoCに接続できた。

screenじゃなくて、minicomというのもあるらしい。
macportsで、minicomをインストール
<pre>
sudo port install minicom
</pre>

minicomの設定はこちらを参照しました。
http://cat-s-tail.blogspot.jp/2013/10/Mac-OS-X-Mountain-Lion-RaspberryPi-serial.html

<pre>
minicom
</pre>
これでも接続できた。こちらの方が使いやすそう。

ログインはroot
<pre>
atlas_sockit login: root
</pre>

#2. macとAtlas Socのイーサーネット接続
ハブで接続。ターミナルから
<pre>
ifconfig
</pre>
Atlas Socは192.168.1.11だ。
macを192.168.1.12に設定。
safariでhttp://192.168.1.11
おお。Atlas Socのページが開けた。

#3. USB tethering driverで接続

USB tethering driver使えば、イーサネット接続せずに、USBケーブルでAtlas SoCとIP接続できるらしい。以下から最新版をダウンロードしてインストール。
http://joshuawise.com/horndis#available_versions
PC再起動。
safariでhttp://192.168.7.1
が開けた。

VNC Viewerをダウンロードしてインストール。
https://www.realvnc.com/download/viewer/
192.168.7.1とか192.168.1.11を指定するとGUIが使える。

#4. 付属のSDカードをもう１枚作成
macにSDカードを抜き差ししながら、デバイスの場所を確認。
<pre>
ls -l /dev/disk*
</pre>
disk3がSDだった。
アンマウントしないと書き込みできなかったので、
<pre>
sudo diskutil umount "/volumes/no name"
</pre>
イメージはこちらからダウンロード
https://rocketboards.org/foswiki/view/Documentation/AtlasSoCSdCardImage

イメージを焼く
<pre>
sudo dd if=/Users/xxxx/Desktop/AtlasSOC_SDCard/atlas_sdcard_v1.1.img of=/dev/disk3 bs=1024000
</pre>

随分書き込みに時間がかかったが、こちらのSDカードでもきちんと起動できた。
Wordpressをサブディレクトリに入れ mod_rewrite

さくらのVPSにWordpressをインストールした。
いくつかサイトを設定している。
ルートには静的なページがあり、そこはいじらない。
サブディレクトリのまま、運営する。

ユーザ sub の public_html 内にWordpressをインストールして、Wordpressのディレクトリ名を pacific に変更した。

URL を見やすい形式で表示させるため、
htaccess を設定したが、Not Found になる。
どうも RewriteBase のパスがおかしいようだ。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /~sub/pacific/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>

このように設定したら、できた。

RewriteBase に相対パスを指定していたのだが、
RewriteBase ~sub/pacific/

だと Internal Server Error となる。
正しくは、先頭にスラッシュが入っている、

RewriteBase /~sub/pacific/

のようだ。
Python + AWS Lambda + API GatewayでLINE BOT

![title.png](https://qiita-image-store.s3.amazonaws.com/0/29989/2306a470-0bd2-7e56-3ca4-41904f65c130.png)

API Gateway + AWS Lambdaで遊ぶために、LINE BOTを作っていたので紹介。
LINE BOTの作り方とかは、公式のドキュメントやPythonのSDKが充実しているので省きます。

ソースコードは、Githubで公開してるのでよければ参考にしてください。

- https://github.com/c-bata/chalice-linebot

## 機能一覧

#### 実装済みの機能

`news` と `weather` コマンドは話のネタにいいらしく、知り合いが実際にグループで使ってくれているらしい。
あと意外と `choice` コマンドも結構使われている。

| 機能       | 様子                                  |
|-----------|---------------------------------------|
| Greeting  | ![greeting.png](https://qiita-image-store.s3.amazonaws.com/0/29989/997299ae-8954-8fe6-68fc-0772073f3b0f.png) |
| Choice    | ![choice.png](https://qiita-image-store.s3.amazonaws.com/0/29989/736424f9-c4f6-425b-2649-ccba27ca9186.png) |
| Shuffle   | ![shuffle.png](https://qiita-image-store.s3.amazonaws.com/0/29989/a611674d-10ab-c372-fbd7-88e0dced0e28.png) |
| Weather   | ![weather.png](https://qiita-image-store.s3.amazonaws.com/0/29989/a919b097-1d50-e5ec-49f3-190103395576.png) |
| News      | ![news.png](https://qiita-image-store.s3.amazonaws.com/0/29989/1d02740c-4d4d-b528-ab05-529b3fd618e8.png) |

ニュースは最初Yahoo NEWSのRSSからとっていたのですが、Google NEWSはサムネイル画像がとれるものがあったため、置き換えました。

#### やってみたいこと

- [ ] 呼ばれた回数とかも、記録して可視化できると面白いかも
- [ ] 日報をLINEで管理してみたい
    - Slackよりもスマホからサッと開ける
    - これもどこかで見れるといいかも

こういうのあれば、便利そうっていうのがあれば、コメントとかお待ちしてます。

## PythonのServerless Framework

ここからはちょっと技術的な話。
Lambdaだけならフレームワークは使わなくてもAWS CLIから簡単に扱えるのですが、API Gatewayの方はAWS CLIで操作するのがかなり大変です。まだブラウザでAWSのWebサイトを開いて手動で操作したほうが簡単かなという印象でした。
エンドポイントが増えてくると、API Gatewayの設定をうまくやってくれるフレームワークが無いと厳しいです。

調べてみたら、Pythonで人気のServerless Frameworkは2つあります。

- https://github.com/Miserlou/Zappa
- https://github.com/awslabs/chalice

#### Zappa

最初はZappaのコードを見てみたのですが、API GatewayからLambdaに渡されるEventをWSGI Environに変換していて、FlaskやDjangoのようなWSGIフレームワークが動かせます。あとはデプロイ時に各フレームワークのURL定義からAWS CloudFormation用のファイルを生成して、API Gatewayの設定をやってくれているみたいです。

#### Chalice

Chaliceの方はZappaとは違ってWSGIに変換せず、API Gatewayに特化しています。 無駄なことしていないだけあって、ソースコードも分かりやすいですね。 Zappaの場合は、Flaskの機能でもAPI Gatewayを通して本当に動くのか考えないといけませんが、chaliceのドキュメンテーションに書いてある機能はちゃんと動く安心感もありますね。

今回はChaliceを採用してみましたが、こちらはコードもシンプルでかなり扱いやすいです。


## まとめ

- LINE BOTつくってみた
- LINE BOTの機能、こういうのあれば便利そうとかあればコメントとかください
- chaliceとてもいい
- API GatewayもJSONのWeb APIとかならサッと作れたりする
    - リクエストやレスポンスのpayloadが10MBまでという制約があるのでファイル・画像のアップロードとかしたい場合は気をつけてください

おわり
backpropagation memo

- 岡谷貴之「深層学習」のBPのメモ
- scalaのMLP実装用


```math
E_n=E({\bf W}^{(1)},{\bf W}^{(2)},{\bf W}^{(3)},\cdots, {\bf W}^{(n)})
```

- n layer MLP
- $E$はloss function　ｏｒ　目的関数
- $W$はweight matrix

```math
\begin{eqnarray}
{\bf u}^{(l+1} 
 &=& {\bf W}^{(l+1)} \cdot {\bf z}^{(l)} \\
 &=& {\bf W}^{(l+1)} \cdot f({\bf u}^{(l)})
\end{eqnarray}
```
ここで $f$はactivation function


```math
\begin{eqnarray}
\frac{ \partial{E} }{ \partial {\bf W}^{(l)} } 
 &=& \frac{ \partial{E} }{ \partial {\bf u}^{(l)} }
  \frac{ \partial {\bf u}^{(l)} }{ \partial {\bf W}^{(l)}} \\       
 &=& \frac{ \partial{E} }{ \partial {\bf u}^{(l)} }
  {\bf z}^{(l-1)} \\       
\end{eqnarray}
```

ここで， 

```math
\begin{eqnarray}
 \frac{ \partial{E} }{ \partial {\bf u}^{(l)} }
  &=& \frac{ \partial{E} }{ \partial {\bf u}^{(l+1)} } 
   \frac{ \partial {\bf u}^{(l+1)} }{ \partial {\bf u}^{(l)} } \\
  &=& \frac{ \partial{E} }{ \partial {\bf u}^{(l+1)} } 
   \left\{ {\bf W}^{(l+1)} \odot f^{'}( {\bf u}^{(l)} ) \right\} 
\end{eqnarray}
```

ここで

```math
{\bf \delta}^{(l)} =  \frac{ \partial{E} }{ \partial {\bf u}^{(l)} }
```
とすると


```math
\begin{eqnarray}
\frac{ \partial{E} }{ \partial {\bf W}^{(l)} } 
 &=& {\bf \delta}^{(l)} {\bf z}^{(l-1)} \\       

{\bf \delta}^{(l)} &=& {\bf \delta}^{(l+1)} 
 \left\{ {\bf W}^{(l+1)} \odot f^{'}( {\bf u}^{(l)} ) \right\}  
\end{eqnarray}
```

となる．

これが逆伝播法
Alamofireでオフライン判定をする方法

#前置き
iOSアプリを開発していたら、通信状況を確認することがよくあります。
有名なライブラリとしてはReachabilityがありますが、本日はAlamofireでもそういったことができるので紹介します。

#方法

```swift:
let net = NetworkReachabilityManager()
net?.startListening()
        if  net?.isReachable ?? false {
            
            if ((net?.isReachableOnEthernetOrWiFi) != nil) {
                //do some
                print("isReachableOnEthernetOrWiFi")
                
                
            }else if(net?.isReachableOnWWAN)! {
                //do some
                print("isReachableOnWWAN")
 
            }
        } else {
            //オフライン
            print("no connection")

        }
```

上記の方法で、Alamofireで通信状況を確認できます。
OpenCVをVisualStudioで使えるようにするまでのメモ

#はじめに
OpenCVをVisualStudioを使ってプログラミングしていくのに必要な設定をまとめておきます。なんでかというと、私自身がすぐに忘れちゃうので、ここでやるべきことだけ書いてまとめておきます。

CMakeを用いてOpenCVの元ファイルはコンパイル済みの状態であるとします。CMakeを用いたOpenCVのコンパイル方法は今回は記述しません。

#迷う部分の説明
まず、VisualStudioのWin32コンソールアプリケーションを作成します。
その後に、プロジェクトのプロパティからC/C++の追加のインクルードディレクトリに
C:\OpenCV3.1.0\build\include;
と記入します。
ここが１点目です。

次に、リンカーの追加のライブラリディレクトリに
C:\OpenCV3.1.0\build\x64\vc14\lib;
と記入します。
64bit環境で、VisualStudio2015の場合はvc14となります。

この２点でOKです。

#追記
CMakeの
cocos2d-x 3.x Xcodeでソースコードをreferenced(参照)で管理したい時

Windowsとソースコードを共有したい時にはまったので、対処方法をメモ

cocos2d-xのコマンドでxcodeのプロジェクトファイルを作った時を前提に記載します。

###以下の設定を行う。以上！！！

{自分のプロジェクト名}.xcodeproj > Target の　{自分のプロジェクト名}を選択 > Build Settings >　header search paths

``` text:memo
 $(SRCROOT)/../Classes/

```
PowerShell で簡易的なパフォーマンスログを取得する

[ブログからの転載](http://1bed.allright.life/?p=2279)

## 経緯

PowerShell 楽しいし、あまり深く考えずに「パフォーマンスモニターを PowerShell でやってみよう」という感じです。

気力が続けば、ここから Excel 出力してグラフ化(Excel 苦手だけど)まで行きたいと思います。

## 概要設計

* CPU
* Memory
* Disk

上記 3 つの情報を定期的にログに落とす

ココではまずはテキストに TAB 区切りでログを落とすことにする。TAB 区切りは Excel に噛ますのが楽なので採用した。

## CPU 情報の設計と取得

CPU 情報の条件としては次の内容で検討

* CPU 全体、コアごと等の情報を取得できる
* 使用率は 42.2% のように小数点以下も取得できる

上記の事を踏まえてデータレイアウトは次の通りとした

> name(一意の名前) &lt;TAB> persent(使用率) &lt;TAB> get_datetime(取得日時)

```ps1
$data = Get-Counter -Counter "\Processor Information(*)\% Processor Time"
$datetime = $data.Timestamp
foreach($item in $data.CounterSamples) {
    Write-Output(@($item.InstanceName.ToString(), $item.CookedValue, $datetime) -join "`t")
}

_total  3.80632670560463        2016/10/04 0:12:10
0,_total        3.80632670560463        2016/10/04 0:12:10
0,3     1.49767854653915        2016/10/04 0:12:10
0,2     1.49767854653915        2016/10/04 0:12:10
0,1     7.65407363738045        2016/10/04 0:12:10
0,0     4.5758760919598 2016/10/04 0:12:10
```


## Memory の設計と取得

Memory 情報の条件としては次の内容で検討

* 物理メモリ、仮想メモリ(swap)の情報を取得できる
* 全体の容量と使用している容量(又は空き容量)を取得できる

上記の事を踏まえてデータレイアウトは次の通りとした

> name(Physical or Virtual) &lt;TAB> free(空き容量) &lt;TAB> total(全体容量) &lt;TAB> get_datetime(取得日時)

```ps1
$data = Get-WmiObject Win32_OperatingSystem
$datetime = Get-Date

Write-Output(@('PhysicalMemory', $data.FreePhysicalMemory, $data.TotalVisibleMemorySize, $datetime) -join "`t")
Write-Output(@('VirtualMemory', $data.FreeVirtualMemory, $data.TotalVirtualMemorySize, $datetime) -join "`t")
PhysicalMemory  9727032 16676748        2016/10/04 0:34:53
VirtualMemory   9497996 19167116        2016/10/04 0:34:53
```

## Disk の設計と取得

Disk 情報の条件としては次の内容で検討

* 接続されている物理ディスクの情報を取得できる
* 全体の容量と使用している容量(又は空き容量)を取得できる

上記の事を踏まえてデータレイアウトは次の通りとした

> name(Device ID) &lt;TAB> free(空き容量) &lt;TAB> total(全体容量) &lt;TAB> get_datetime(取得日時)

```ps1
$data = Get-WmiObject -Class win32_logicaldisk
$datetime = Get-Date
foreach($item in $data) {
    Write-Output(@($item.DeviceID, $item.FreeSpace, $item.Size, $datetime) -join "`t")
}
C:      117137235968    254993756160    2016/10/04 0:52:09
D:      120767868928    259676696576    2016/10/04 0:52:09
```


## 考察

仕様とデータの設計、データの取得までをサーッと作りました。

このままでも Windows タスクスケジューラーに設定してテキストファイルを吐き続けられますが、それでは面白みに欠けるので次回は Excel ファイルに吐くところを作ってみたいと思います。
[LINE Messaging API]Buttons、Carouselの検証

先日LINE Messaging APIが公開され、Template Messageを検証しています。

JSONの形式が似ているButtons、CarouselあたりでAPI Referenceに記載されていないことを残しておきます。（2016/10/23時点）

## API Reference
https://devdocs.line.me/ja/?shell#template-message

## Request Body
| Field |   |
|:------|:--|
| to    | 旧APIは配列だったが新APIはString |

## Template Message
| Field |   |
|:------|:--|
| altText | 必須、400文字以内 |

## Buttons、Carousel
| Field |   |
|:------|:--|
| thumbnailImageUrl | 1000文字以内。<br>JPEGまたはPNGとなっているがGIFもアップできる。<br>縦横比 1:1.51でないと中央配置でトリミングされる。<br>縦横最大1024px、最大1MBを超えてもアップできる。|

## Template Action
| Field |   |
|:------|:--|
| uri | 1000文字以内|


現時点でcurlを叩いての結果ですので運用するなら正式な確認をとったほうが良いと思います。
.zshenvと.zshrcの役割


## .zshenv
`.zshenv` はzshを起動したときに必ず読み込まれるファイル。
ログインシェルとして起動したときだけでなく、zshのシェルスクリプトを実行したときや、コマンドラインから直接zshを起動したときも含まれる。

例：シェルスクリプトの中から呼び出される可能性のあるコマンド。環境変数PATHやRuby,Javaなどの開発に関する初期設定など。

## .zshrc
`.zshrc` もzshを起動したときに読み込まれるが、シェルスクリプトを実行したときは読み込まれない。

例：エイリアスやキーバインドの設定、zshのオプションなど対話的に使用するための設定を書く。

（※）対話的に使用するための設定を`.zshenv`に書いてしまうとzshをシェルスクリプトとして実行したときにデフォルト設定と異なっているため誤動作を引き起こす可能性がある。zshの設定は基本的には`.zshrc`に記述するものと思えばよい。



### 参考
[WEB+DB PRESS vol.83](http://mollifier.hatenablog.com/entry/2014/10/20/191511)
UI > SourceTree v1.8以降 > UIが悪くなったと感じた

```txt:動作環境
Windows 7 pro
```

SourceTree v1.6.2からSourceTree v1.9.6へのアップデートした。

5分後。
なかったことにして、SourceTree v1.6.2からSourceTree v1.7へのアップデートにした。

### v1.9.6 (v1.8以降)のUIの問題点

- 多くのUIの変更
- 必要かどうか不明なUIの変更
  - stagingの仕方
     - チェックボックスをなくす
     - stage selectedボタン追加
     - stage allボタン追加
     - マウスだけでstagingする時に手間
  - コミットメッセージのキャンセルボタンの削除
     - コミット作業中断時はどうするのか不明
- 見た目の改悪
  - ボタンの色を削除
  - 全部似たような表示
  - ボタンの押し間違えを誘発する
  - ショートカットを強制したいのだろうか?
  
他にも色々ありそうだがそれを知ったところで得ることはないので、v1.8以前のバージョンとしてv1.7にした。

慣れれば新しいUIでも使えなくはなさそうだが、快適ではない。

[atlassianのフォーラムでも議論されている](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjU0YWxqfDPAhViylQKHacRDb8QFggfMAA&url=https%3A%2F%2Fanswers.atlassian.com%2Fquestions%2F36182163%2Fdid-anyone-really-think-that-the-new-ui-was-an-improvement&usg=AFQjCNEgdy3d3ZnUmU6nzSstOsjW-LEYVQ&sig2=-3ENG0V149pXSTrX8u4xWA&bvm=bv.136593572,d.dGo&cad=rja)

利用者が多いシステムにおいてUIを大幅に変更する場合、明らかに使用者が「使いやすくなった」と説得できるようなものを作成して欲しい。

その自信がない場合は、「UIを変更しない」という選択肢もあってもいいのではと思う。

「使いやすくなった」と思えるようなものを作り上げるには、現ユーザから多くの意見を集めて、その中から核となるものを抽出して実装する。難しいとは思うが、そういうことをできる人は居ることはいる。
【TechShop Tokyo】大判プリンターのプリント

# 本Qiitaについて

TechShop Tokyoに置いてあるMutoh ValueJet(VJ1617H)のプリントに関して記載しています。

# 関連Qiita

[【TechShop Tokyo】大判プリンターのプリント Tips集](http://qiita.com/akira-sasaki/items/37642f152d54e8f999a8)

# PhotoPRINT EDITOR Cloudを起動

PhotoPRINT EDITOR Cloudアイコンをクリックし、起動する。

![print001.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/ec7344f2-0a1a-9f6d-f246-ada9021b9015.jpeg)

# データに輪郭線をつける

印刷したいAI形式のオブジェクトを読み込み、オブジェクト一式を選択する。

![print002.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/59999b22-25b4-0d5c-0a12-bb5ea3e3dc78.jpeg)

メニューから[特殊効果]-[輪郭カット...]を選択。

![print003.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/3fd0b63e-098e-cf8a-515d-5cd8d9bced60.jpeg)

輪郭線の場所を設定し、[デザインセントラル]ダイアログボックスのチェックマークをいれる(この作業を忘れない)

![print004.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/21a75049-d971-308c-5c27-44b34b973302.jpeg)

# 機材の設定

大判プリンターの蓋をあける。

![machine001.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/40806939-1f76-c619-802a-adc6ff40251e.jpeg)

![cover001.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/874bede3-98de-598f-b2f7-137b62b15486.jpeg)


印刷する素材を設定する。

![machine002.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/150ac60e-8293-8d0d-ae2f-1548e598437d.jpeg)

印刷する素材を、右側、左側にある金属で押さえて固定する。

![machine003.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/bd2922f5-48eb-99a6-c07c-9c6b20529624.jpeg)

![machine004.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/cdf21dda-bb04-f9e1-0f4c-d3991ce03750.jpeg)

カバーを閉じると、メニューは、「メディアヲセットシテクダサイ」の表示。

![machine006.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/78e26a9e-3b44-8c1e-619f-8ad1b7d62a5d.jpeg)

![reber.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/472606a3-982b-e442-18b4-3b3488095671.jpeg)

「ユーザ: Type 1 OK?」の表示になるので、Enterを押す。

![user001.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/3d221c9c-33d0-88eb-4566-ac3cd430dbc2.jpeg)

「メディアイニシャルチュウ」の表記になる。

![machine007.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/8af745f0-f48d-4d80-f305-cf83c78cb9d8.jpeg)

幅の計測に成功すると「メディアハバ: **cm」の表記になる。

![haba001.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/c41bc0ab-cb77-d6e1-c248-9f384ed97e4b.jpeg)


# 印刷データを作成する

メニューから[ファイル]-[RIP&プリント...]を選択。

![print005.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/ef1c7945-539f-04ed-6a29-f9d274866c23.jpeg)

表示される[RIP&プリント]ダイアログボッキウスで、[?]をクリックし、素材のサイズを取り込む。ステッカーシートならば、62cmぐらいのサイズになっていればOK。

![print007.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/4fbf613d-49e0-8257-05c2-388a1d3dbdb9.jpeg)

![print008.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/2a1dc4ac-701a-1634-7b7d-b9f4e990991c.jpeg)

![print009.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/02f572df-49d6-5ced-6295-a0dab180072f.jpeg)
OctoberCMSプラグインのインストール方法３つ(GUI, Composer, 手動)

プラグインのインストール方法は３つ。

1. GUI：CMS管理画面（OctoberCMSではバックエンドと言う）からプラグインを見つけてインストールする
2. Composer：composer.jsonの`require`にプラグイン名を追加して、`composer update`する
3. 手動：プラグインのソースコードをダウンロードしてプラグインディレクトリに格納する

インストール後のOctoberCMSはあえて最小構成で、ブログ機能などもプラグインとなっている。ブログプラグインを例に、プラグインを使用するまでを説明する。

OctoberCMSの[マーケットプレイス](http://octobercms.com/plugins)で公開されているプラグインは1の方法でインストールできる。後から簡単にcomposer管理にできるので、ローカル環境へはとりあえず1の方法でも構わない。

GUI：管理画面（バックエンド）からプラグインをインストールする
--------------------------------------------------
#### 1. ブログプラグインのインストール
バックエンドの「設定」メニューから「システム」->「アップデート」を開き、「Install plugins」ボタンを押す。
![0892751D-E08A-472D-8ED2-875BF92C35D5.png](https://qiita-image-store.s3.amazonaws.com/0/138322/8bd7719e-cae4-8422-3ddb-d9720f25dc56.png)

検索ボックスで「blog」と入れると、OctoberCMS開発チーム製の標準ブログプラグインがでてくる。
それを選択するだけでインストールが自動的に始まる。
![12AD1493-2797-4CC9-9BEA-0E16A549D09E.png](https://qiita-image-store.s3.amazonaws.com/0/138322/f0c87b8c-b9ff-e30d-d03b-22f1b3673235.png)

#### 2. 対応したテーマのインストール
プラグイン管理画面で「THEMES」タブを選択すれば、同様にテーマをインストールできる。
とりあえず、Vanillaテーマが標準でBlogプラグインをサポートしているので、これを入れてみる。
（実際には、テーマが依存するプラグインは自動でインストールされるので、Vanillaを入れるだけでBlogなどのプラグインもインストールされる。）
<img width="750" alt="Screen Shot 2016-10-23 at 11.30.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/c233401c-3cca-e064-c441-75d4c96027ba.png">

「設定」 -> 「CMS」 -> 「フロントエンドのテーマ」でインストールしたテーマがアクティブになっているか確認する。
![902CC3A9-965F-411C-9886-BD0DB71EB7FC.png](https://qiita-image-store.s3.amazonaws.com/0/138322/765bced8-8136-76a2-2426-73aa10137cd4.png)

これで、バックエンドの上のナビゲーションバーに「ブログ」が追加されて、ブログが使えるようになった。
バックエンドのブログメニューから試しに投稿して、フロントエンドでちゃんと表示されるか確認する。

composerでプラグインをインストールする
------------------------------------
composerを使ってインストールする場合も簡単（OctoberCMSをComposerを使ってインストールしていることが前提）。

#### 1. パッケージのインストール
```
composer require rainlab/blog-plugin
```

これだけで、パッケージがpluginディレクトリにインストールされ、composer.jsonに下記のように追記される。上記コマンドは、下記を追記して`composer update`を実行するのと同じ効果がある。

```json:composer.json
{
    ...
    "require": {
        ...
        "rainlab/blog-plugin": "dev-master",
        ...
    },
    ...
}
```

パッケージ名はプラグインのソースコードに含まれるcomposer.jsonのルートにある`name`にあたる。
ソースコードは[OctoberCMSのプラグインページ](http://octobercms.com/plugin/rainlab-blog)左下のリンクから[GitHubのページ](https://github.com/rainlab/blog-plugin)を辿れるので、そこで確認するか、一旦GUIでインストールしてしまってplugins下のソースコードを確認するという手もある。

もし、[Packagist](https://packagist.org/)に登録されていない場合、[こちらの記事](http://qiita.com/pikanji/items/e28e83edce542794c4ec)のようにcomposer.jsonにレポジトリを登録してやる必要がある。また、もしプラグインがcomposer.jsonをソースに含んでいなければ、それも依存する側で定義してやることができるが、それはまた別の話。


#### 3. データベースマイグレーションを適用する
下記を実行することで、未実行のマイグレーションが適用されるので、ブログプラグインに含まれるマイグレーションファイルが適用されてテーブルが作成される。

```bash
$ php artisan october:up
```

以上で、ブログが使えるようになる。

この方法はローカルで開発してサーバにデプロイする手法で便利。
composer.lockにインストールしたプラグインも記録されるので、デプロイ先で`composer install`とするとローカルでインストールしたものと同じバージョンがインストールされるので、デプロイを自動化するのに便利になる。


マニュアルでプラグインをインストールする
------------------------------------
ソースコードをマニュアルでダウンロードして、pluginsディレクトリに格納し、前述のように`artisan october:up`するだけでも、プラグインは使えるようになる。

この方法のメリットはあまりないが、このくらい疎結合にできているというのが分かる。
YAMAHA RTX1210でDS-Lite接続

YAMAHA RTX1210でIIJmio(transix)にDS-Lite接続してみました。
フレッツのPPPoEは混雑していることが多く、DS-Lite(IPoE)に切り替えることで
高速化する場合が多いようです。（我が家の場合は20Mbps→85Mbpsに改善しました）

# 環境
* フレッツ光ネクスト(ひかり電話なし)
* IIJmio FiberAccess/NF
* YAMAHAルータ RTX1210

# 設定概要
RTX1210とIIJmio(transix)間でIPIPトンネルを作成後、IPv4の接続先として指定します。
AFTRアドレスを置き換えることで、他サービスのDS-Liteにも接続可能(なはず)です。

```config:config
tunnel select [NUM]
tunnel encapsulation ipip
tunnel endpoint address [AFTRアドレス]
tunnel enable [NUM]
ip route default gateway tunnel [NUM]
```

# 設定詳細

設定時にIIJmio(transix)側のIPv6アドレスを指定する必要があります。
東日本/西日本でアドレスが異なるため、事前に確認しましょう。
https://www.mfeed.ad.jp/transix/dslite/yamaha.html

トンネルインタフェースを選択します。(未使用の番号を指定)
`# tunnel select 2`

IPIPトンネルとして設定します。
`tunnel2# tunnel encapsulation ipip`

transix側のIPv6アドレスを指定します。
`tunnel2# tunnel endpoint address 2404:8e00:feed::100`

トンネルを有効化します。
`tunnel2# tunnel enable 2`

ここでひとまず接続確認。
`# show status tunnel 2`
>TUNNEL[2]:
Description:
  Interface type: IP over IP
  <b>Current status is Online.</b>
  from 2016/10/22 23:35:06.
  1 minute 55 seconds  connection.
  Received:    (IPv4) 0 packet [0 octet]
               (IPv6) 0 packet [0 octet]
  Transmitted: (IPv4) 0 packet [0 octet]
               (IPv6) 0 packet [0 octet]

IPv4の接続先を変更します。
`# ip route default gateway tunnel 2`

# 接続確認
`traceroute` や [確認くん](http://www.ugtop.com/spill.shtml) などでtransix経由となっていることを確認します。


# 外部からの直接接続は不可（余談）
DS-Lite では外部からの接続を受け付けられないため、外から VPN を貼りたい場合は「フィルタ型ルーティング」を設定する必要があります。

YAMAHA RTX1210 で用途に応じてインターネット回線を使い分ける
https://blog.yuu26.com/entry/20180528/1527514246

# 参考サイト
[DS-Lite 接続確認機種情報 NVR500](https://www.mfeed.ad.jp/transix/dslite/yamaha.html)
プログラマにとっての心技体

#はじめに
　プログラマたるもの業務をスマートに行うためには、何が重要かと考えてみたところ３つ思い浮かびました。
　スポーツ選手にとって心技体を鍛えるのが重要と言われるように、プログラマもこれらの要素をまんべんなく鍛えないといけないのじゃないでしょうか。

#1.言語力
+ 複雑な仕組みをいかに、今使用している言語の仕様にそって簡潔に表現できるかという能力。例えばCでプログラムを書く場合は「やさしいC」を読むと多少身につく[^1]。
+ qiitaではこれに関する記事が圧倒的に多い。技術者が自分自身を評価するときに、この能力しか用いないのではないかと心配になる。
+ 新しいプログラミング言語を取得するたびに、勉強し直す必要がある。しかし、ある程度使いまわしが可能。覚えることが多く勉強のしがいがある部分。
+ よくプログラミング適性がない[^2]とプログラマは厳しいと言われるが、プログラミング適性はこの部分しか関係してこないんじゃないかと思う。

#2.設計力
+ 概要設計書とか詳細設計書とかを書く能力のことではない。
+ クラスのインタフェースのデザインであったり、クラス間の関係の構築であったり、プログラミング領域全体の設計を考える能力。
+ 典型的な悪い例は一つのメソッドに全ての処理が詰め込まれているパターン。
+ 勉強の仕方がいまいちわからないせいか、現場で軽視されている気がする。この部分についての知識がないと誰かが考えた構成を何も考えず持ってきて、なにも手を加えられない状態におちいる。

#3.業務知識
+ 作りたいシステムに関する業務知識。例えば銀行業務なら、入出金のフローを知っておく必要があるといったようなこと。
+ 現場独自のマイルールが企業には存在している、それをうまく汲み取って作業しないといいシステムはできない。現場でシステムを見ていると、わけわからないことが多々ある。1レコードに所在地が2箇所入っていたりと。
+ 概要設計書、詳細設計書を記述する際に重要なのは上2つよりこちらの方ではないかと思う。
+ 学校の勉強と同じで、やっただけ身につく。プログラミング適正とかいらない、上２つより覚えるのは簡単。ただし、異動で業務内容が変わった場合、上2つと違って全く使い物にならなくなる可能性あり。

#おわりに
+ プロならどれもある程度できていないとダメ。「プログラミングできないから、業務知識でカバー」という風に、どこかで補えるものではない。
+ 業務知識は時間を書けて勉強すれば誰でも覚えられるので差がつきにくい。言語力や設計力は意外と日常業務で身につかない。

[^1]: あくまで一例にすぎず、読めと言っているわけではありません
[^2]: プログラミング適性がなにかは私も分かっていません
Google翻訳のコツ

#Google翻訳のコツ

Google翻訳を使う際、私がよくやっている、ちょっとしたコツをご紹介します。
翻訳機の気持ちになるのが大切です。
翻訳機は文法的に近い言語だとほとんど文字列置換して終わりなので、結構正しく訳せます。
しかし、文法的に遠い言語だと、複雑な文法解釈が入るので、なかなかうまく訳してくれません。

## 日本語を他の言語の言葉に訳す場合
翻訳機が解釈に困らないような文章を与えましょう。
簡単に言えば、日本語が教科書的な日本語であればあるほど、正しく訳されます。
**更に、翻訳機が正しく訳してくれる日本語は、外国人の日本語初学者が理解しやすい言い回しでもあります。**

たとえば、

```
プログラミングって楽しいね！
```

を英語に訳すと、

```
I fun I programming!
```

になります。

これが正しい訳なのかどうか判定するためには、Google翻訳で、今度は英語から日本語に戻してみます。

すると、
```
私の楽しみ私はプログラミング！
```

となります。
これでは意味不明なので、正しくないと判断できます。

```
プログラミングは楽しいです。
```

にすると、

```
Programming is fun.
```

となり、戻してみても、

```
プログラミングは楽しいです。
```

となるので、自然な言い回しかどうかまでは分からないですが、おそらく通じるだろう、と判断できます。

それでも不安であれば、

"Programming is fun"とGoogle検索してみましょう。
検索してみてこの言い回しを使っている人がある程度いれば良いことにしましょう。だいたい通じれば良いんです。
このとき、必ずダブルクォート(`"`)をつけてください。つけると完全一致になります。


##ヨーロッパ圏の言語の場合

スペイン語とかポルトガル語とかドイツ語とかイタリア語とか、まだまだいっぱいありますが、そのあたりの言語は、日本語ではなく英語に訳しましょう。

うまく訳せるのは、文法が似通っているためです。ほぼ置換するだけなので、翻訳機の精度がそれほど高くなくともうまく訳せるのです。

たとえば私はこの記事を読もうと思っていました。
http://pawel-michalski-javnie.blogspot.jp/2012/04/gettery-settery-enkapsulacja-czy.html

アルファベットや、アルファベットっぽい文字が並んでいるので英語に近い言語だと思うのですが、何語かも分かりません。
そこで、Google翻訳の言語自動検出を使います。

Google先生によると、この記事はポーランド語らしいので、やっぱり英語に訳すと良さそうです。

[Getters and Setters 英語版 - the good parts
](https://translate.google.co.jp/translate?sl=auto&tl=en&js=y&prev=_t&hl=ja&ie=UTF-8&u=http%3A%2F%2Fpawel-michalski-javnie.blogspot.jp%2F2012%2F04%2Fgettery-settery-enkapsulacja-czy.html&edit-text=&authuser=0)

これなら頑張れば読めます！

試しに日本語版も。

[Getters and setters 日本語版](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=http%3A%2F%2Fpawel-michalski-javnie.blogspot.jp%2F2012%2F04%2Fgettery-settery-enkapsulacja-czy.html)

うーん、どうしても文法が崩壊してしまうので、やっぱり意味不明の部分は出てきてしまいます。（それでも何も無いより数億倍マシですが）

## 韓国語の場合

ヨーロッパ圏の言語が、英語に訳す場合はうまくいくと申し上げましたが、この感覚を日本語で味わえるのが韓国語です。

翻訳するという意味で言えば、韓国語は大変都合の良い言語です。
文字が独特なので、とっつきにくい印象があるかもしれませんが、驚いたことに日本語とほとんど同じ文法です。
翻訳機を作る難しさというのは、文法の解釈を完全に網羅することが難しい点にあります。
しかし、韓国語と日本語では文法がほぼ同じなので、単純に単語を置換していけばだいたい終わりです。
試しに韓国語のWikipediaをGoogle翻訳してみました。
[한국어 - 위키백과](https://translate.google.co.jp/translate?sl=ko&tl=ja&js=y&prev=_t&hl=ja&ie=UTF-8&u=https%3A%2F%2Fko.wikipedia.org%2Fwiki%2F%25ED%2595%259C%25EA%25B5%25AD%25EC%2596%25B4&edit-text=&act=url&authuser=0)

大体うまいこと訳せているのがわかるかと思います。
おそらく日本語を韓国語に訳すのも、うまくいくはずです。

余談ですが、もし学習する場合としても、英語を学習する1/10くらいの労力で学べます。
ゆるーく学べるので第二外国語としてはオススメですよ。
【Xcode】ファイルをフォルダ分けする方法【手動】

フォルダ構成をXcode上のグループ構成と同期する[synx](https://github.com/venmo/synx)という便利なツールがありますが、今回は手動でフォルダ分けしていきます。
今回は「Storyboard」というフォルダを作って、そこにstoryboardファイルを入れていく形とします。

# 手順
1. Xcodeのプロジェクトがあるフォルダに移動し、「Storyboard」というフォルダを作成します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/135478/a3c5e0b9-e45e-bef9-1144-cf304fb49458.png)
<br>

2. 先程作った「Storyboard」フォルダをドラッグ＆ドロップでXcodeプロジェクトに追加します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/135478/f1a6cc6f-9d99-b976-df36-91a246a2390e.png)
<br>

3. 「Storyboard」グループを選択した状態で新しくファイルを作成していきます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/135478/e13c564c-3b1d-d4cb-08ab-e6478e62e8d1.png)
<br>

4. 作成先を先程作った「Storyboard」フォルダに指定し、「Create」で作成。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/135478/fc837a40-e965-3de5-6e4a-388b4e59f909.png)
内容を追加するようなUPDATE文

## 参考

* [内容を追加するようなUPDATEの仕方というのはあるでしょうか？ - PHPプロ！Q&A掲示板](http://www.phppro.jp/qa/935)

## 方法

* MySQL 4.0 でも動作することを確認。

```sql:先頭に付ける場合
UPDATE table1 SET column1 = concat('VIP-', column1) 
 WHERE column1 NOT LIKE 'VIP-%';
```


```sql:末尾に付ける場合
UPDATE table1 SET column1 = concat(column1, '-VIP') 
 WHERE column1 NOT LIKE '%-VIP';
```
【Haskell】リストをシャッフルする関数

```hs
module Main where

import Control.Monad
import Data.Array.IO
import System.Random

main :: IO ()
main = do
    print =<< shuffle [1..10]   -- [7,8,5,1,6,2,4,9,10,3]
    print =<< shuffle [1..10]   -- [8,4,10,3,1,5,9,7,2,6]
    print =<< shuffle [1..10]   -- [7,8,6,3,5,2,9,1,4,10]
    print =<< shuffle [1..10]   -- [1,4,2,3,9,10,6,7,8,5]
    print =<< shuffle [1..10]   -- [5,8,3,6,2,10,9,7,1,4]

shuffle :: [Int] -> IO [Int]
shuffle list = do
    let l = length list
    arr <- newListArray (1, l) list
    forM_ [l,(l-1)..1] $ \i ->
        swap arr i =<< getStdRandom (randomR (1, i))
    getElems arr

swap :: IOUArray Int Int -> Int -> Int -> IO ()
swap arr i j = do
    t <- readArray arr i
    writeArray arr i =<< readArray arr j
    writeArray arr j t
```

`shuffle`関数にリストを渡すと、シャッフルされたリストがIOモナドに包まれて返ってくる。シャッフルの時間を測ったところ、家のパソコンでは要素数100万のリストのシャッフルに4～5秒かかり、1000万だと40～50秒かかった。もっと縮めたいところ。
0からはじめるRuboCop

[Dentoo.LT #15 : ATND](https://atnd.org/events/81655) での発表資料です


------


自己紹介
----------





Masataka Kuwabara (Pocke)

- Engineer at Actcat Inc. :cat: 
- :heart: Ruby
- :heart: RuboCop
- :heart: 奥華子

--------


## 質問



- Ruby 知ってる人 :hand: 
- Ruby 書いたことある人 :hand: 
- RuboCop 使ったことある人 :hand: 



---


RuboCopとは
-----


> RuboCop is a Ruby static code analyzer. 
>
> [bbatsov/rubocop](https://github.com/bbatsov/rubocop)

- [Style] コーディング規約に沿わないようなスタイルのコード
- [Lint] バグの温床になりうるコード
- [Performance] パフォーマンス上問題のあるコード
- [Metrics] 定量的な値がしきい値を超えるようなコード
- 他にも、Rails や Security など

Rubyのコードを静的に解析して、上記のような問題点を指摘します。


--------------

### 例1 Style

コーディングスタイルに関する問題を検出します。


```ruby
# Bad. メソッド名はsnake_caseであるべき
def doSomething
  # ...
end

# Good
def do_something
  # ...
end
```


---------


### 例2 Lint

バグになるような問題を指摘します。

```ruby
# Bad. foo() は実行されない
def do_something
  return
  foo()
end
```

--------

### 例3 Performance

パフォーマンス上問題のあるコードを指摘します。

```ruby
# Bad ab から始まる文字列、というだけをチェックするのには正規表現は遅い
'abc' =~ /\Aab/
'abc'.match(/\Aab/)

# Good start_with? を使えばもっと速い!
'abc' =~ /ab/
'abc' =~ /\A\w*/
```

-------

### 例4 Metrics

- ものすごく長い行
- ものすごく長いメソッド定義

等を検出


---


## 実用性

試しに、 [mikutter/mikutter](https://github.com/mikutter/mikutter) で走らせてみると…

```
$ cd mikutter/
$ rubocop
....
259 files inspected, 16199 offenses detected
```

-----

## 16199 offences :innocent: :innocent: :innocent: 

----

- 何も考えずに導入すると大量のエラーが出てｳｯってなる
- プロジェクトに沿った設定を作ることもできるが、温かみのある手作業が必要

よくあるケース: 疲れてしまって導入できない :cry: 


----

## そこで、MeowCop


---


## MeowCop

[sideci/meowcop](https://github.com/sideci/meowcop)

- 汎用的に使えるルールのみを抽出したRuboCopの設定ファイル
- バグの発見などにフォーカスしてRuboCopを使える
- RuboCopwを使い始めるのに便利!


---




## MeowCop の導入


```bash
$ gem install meowcop
```

```yaml
# In .rubocop.yml
inherit_gem:
  meowcop:
    - config/rubocop.yml
```

以上!


---


適用してみると…

```bash
$ rubocop
259 files inspected, 460 offenses detected
```

まだ多いけど、460 offenses 

---


## なんとかなる!!! (気合)


---


## DEMO

---

## Auto Correction

- RuboCop で問題が出た箇所を自動的に修正可能
- ※ただし、完全に正しい修正結果が出てくることを期待してはいけない


-----

## DEMO

----


## 今日覚えて帰って欲しいこと


- MeowCop を使うとRuboCopの導入が簡単 :star:

(次回予告: 1からはじめるRuboCop やりたい)

ご清聴ありがとうございました :bow:
Androidでマナーモード（バイブモード）にならないときにチェックすること

少しハマったので書いておきます。

## x.まず結論

バイブレーターが搭載されてるかチェックしろ！！

```
$ adb shell dumpsys audio | grep mHasVibrator
  mHasVibrator=true
```

このmHasVibratorがtrue/falseでわかります。

## 1.なぜバイブモードにならないか

OpenGrokで公開しているAndroidのソースコードサービスから参照。
おもっきしバイブレーター搭載されてなかったら
RING_MODE_VIBRATE を RING_MODE_SILENT にしとる

``` AudioService#setRingerMode()
   2069     private void setRingerMode(int ringerMode, String caller, boolean external) {
   2070         if (mUseFixedVolume || isPlatformTelevision()) {
   2071             return;
   2072         }
   2073         if (caller == null || caller.length() == 0) {
   2074             throw new IllegalArgumentException("Bad caller: " + caller);
   2075         }
   2076         ensureValidRingerMode(ringerMode);
   2077         if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
   2078             ringerMode = AudioManager.RINGER_MODE_SILENT;
   2079         }
   2080         final long identity = Binder.clearCallingIdentity();
   2081         try {
   2082             synchronized (mSettingsLock) {
   2083                 final int ringerModeInternal = getRingerModeInternal();
   2084                 final int ringerModeExternal = getRingerModeExternal();
   2085                 if (external) {
   2086                     setRingerModeExt(ringerMode);
   2087                     if (mRingerModeDelegate != null) {
   2088                         ringerMode = mRingerModeDelegate.onSetRingerModeExternal(ringerModeExternal,
   2089                                 ringerMode, caller, ringerModeInternal, mVolumePolicy);
   2090                     }
   2091                     if (ringerMode != ringerModeInternal) {
   2092                         setRingerModeInt(ringerMode, true /*persist*/);
   2093                     }
   2094                 } else /*internal*/ {
   2095                     if (ringerMode != ringerModeInternal) {
   2096                         setRingerModeInt(ringerMode, true /*persist*/);
   2097                     }
   2098                     if (mRingerModeDelegate != null) {
   2099                         ringerMode = mRingerModeDelegate.onSetRingerModeInternal(ringerModeInternal,
   2100                                 ringerMode, caller, ringerModeExternal, mVolumePolicy);
   2101                     }
   2102                     setRingerModeExt(ringerMode);
   2103                 }
   2104             }
   2105         } finally {
   2106             Binder.restoreCallingIdentity(identity);
   2107         }
   2108     }
```

## 2.なぜ引っかかったのか

エミュレータで確認していたのですが、Android6.x台ではこれtrueなんです。
ところがAndroid7.0のエミュレータだとfalseになっているのです。

これを知らず「え！なんで！！」ってなりAndriodのソースコードを解析しておりました…

## 3.おまけ（SILENT指定時の挙動）

AudioManager#setRingMode()でMODE_SILENTを指定した時の挙動は以下のとおり

|AndroidVersion |Act |
|:--|:--|
|〜4.4 |Silent Mode|
|5.x |Important Notification only Mode|
|6.0〜 |Alarm only Mode|
Video要素の縦横比を変更する

# 検証環境
Chrome 54.0.2840.59

# 問題点
Video要素のwidth, heightを変更しても要素の縦横比がキープされた状態で大きさが変更されてしまうため、Video要素は縦横比を変えることが出来ない。グーグル先生は解決方法を教えてくれない（と、ある勉強会で聞いた）

# 原因
Video要素の`object-fit`がデフォルトで`contain`になっている。
※Image要素とかは、`fill`

# 解決方法
`object-fit: fill`を指定する。

``` css
video {
    object-fit: fill;
    width: 75%;
}
```

# 解決方法２
transformでも一応大丈夫そう

``` css
video {
    transform: scale(0.75, 1);
}
```

# グーグル先生向け

アスペクト比 変わらない　width height
簡単なガチャの実装について考える

これは[ガチャ勉強会](http://connpass.com/event/39751/)で発表した資料である。

勉強会資料に使うので自己紹介付き。

---

## 自己紹介

![icon](https://dl.dropboxusercontent.com/u/57478758/pbsk.jpg)

* なかやん・ゆーき / ぺんぎん / もみあげ / ぽけば
* @pocketberserker / id:pocketberserker
* その辺で倒れているプログラマ

---

## 今回の想定

* ガチャの対象となるアイテムは1種類
  * "武器"、”防具”という複数ではなく”カード”みたいな単一のもの
  * 複雑になることを避ける
  * 世の中の大半は1種類なので問題ないはず
* ガチャはモジュールとして分離可能
  * テストを容易にする
  * クライアントのことは考えない
* データベースにいれることを想定
  * 特に深い意味はない
  * メンテナンスツールを考えると必要か？
  * メモリに全部のせる富豪的なノリでも問題ない？
* 汎用的な作りにする
  * 凝ったものは面倒

---

## ガチャシステム（？）に要求されること

* ガチャ一覧の取得
* 各ガチャで提供されるアイテム一覧
  * 何が入手できるのア重要な要素である
* 価格
* 提供割合（オプション）
  * 最近増えてきた
* 提供時期
* 何個アイテムを手に入れられるか
  * n連というやつ
* 履歴

---

## テーブル

必要そうなものをささっと書いてみる。

---

### ガチャ

| カラム | 概要 |
|:--:|:--:|
| ガチャId | 一意に識別できる何か |
| 説明文 | プレイヤーがじゃぶじゃぶ（検閲されました）|
| 価格 | 一回回すのに必要なお金 |
| 個数 | n連（nは1以上の自然数） |
| 開始日時 | |
| 終了日時 | |

---

### レート

| カラム | 概要 |
|:--:|:--:|
| ガチャId | |
| アイテムId | |
| 確率 | 重みづけ |

---

### 履歴

| カラム | 概要 |
|:--:|:--:|
| ユーザId | |
| ガチャId | |
| アイテムId | |
| 入手日時 | |

---

### アイテム（参考）

| カラム | 概要 |
|:--:|:--:|
| アイテムId | |
| 名前 | |
| 説明文 | |
| レア度 | |

---

## 提供割合を算出する

各アイテムにはレア度が設定されていると仮定する。

1. レア度でgroupBy
1. 各レア度ごとにsum

これで各レア度の重みがわかる。

---

## アイテムを選択する（C++11）

C++11には`std::discrete_distribution`という関数がある。
指定した確率テーブルを基にインデックスを返すので、インデックスに対応するアイテムを取得すればよい。

---

### n連

`for`とかで回せば良い。

---

### テスト

時間とメモリが潤沢なら、n連ガチャ（nは大きな数）を用意して実行し、各アイテムの出現率が誤差範囲内に収まれば良い。

---

## ガチャを実装することの問題点

* レアのありがたみが無くなる
  * 百万連ガチャをつくればだいたい全部引ける
  * ↑はたしてそれはガチャなのか……？

---

## まとめ

* ガチャは簡単に実装できる（簡単なものなら）
  * 複雑なガチャもあるらしい
  * ユーザの入手履歴を見ながら出現率を制御するのはコストに見合わないのではないか
* 問題はだいたいガチャを引く以外の部分だと思う
  * 価格問題
  * 確率表示
  * n回引いてレアがでなければ1個確実に提供
Rails on WSL

Windows Subsystem for Linux(WSL)でRails開発できるのでは？と思って環境構築してみました。

今はVagrantで開発してるので、これが使えそうなら面倒くささが少し軽減するかなーと思ってます。
なお、この記事ではDBはSQLiteのつもりということで、MySQLは入れてません。



## WSLの環境準備など

WSLのインストールはこのあたりを参考に。
http://qiita.com/Aruneko/items/c79810b0b015bebf30bb

Gitはインストールしておきます。

```
sudo apt install git
```

Railsで要求されるのでNode.jsもインストールします。

```
sudo apt install nodejs
```

umask設定しておかないとRailsが警告を出すので設定しておきます。

```
echo 'umask 022' >> ~/.bash_profile
source ~/.bash_profile
```



## RubyとRailsのインストール

rbenvをインストールします。
aptでインストールするとRubyのバージョンが古いのでGitHubから。

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

Rubyは何も考えず2.3.0をインストール。

```
rbenv install 2.3.0
rbenv global 2.3.0
```

Railsをインストール。

```
gem install bundler
gem install rails
rbenv rehash
```



## Railsプロジェクト作成

前提として、RailsのプロジェクトをWindows上の``C:\Users\hoge\RailsProjects``以下に置くことにします。
WSLから扱いやすいようにシンボリックリンクを作っておきます。

```
ln -s /mnt/c/Users/hoge/RailsProjects projects

cd projects
```

Railsプロジェクトを作成します。

```
rails new example

cd example

bundle install
```


WSLのファイルシステムはEventedFileUpdateChecker対応してないようなので修正します。

```:config/environments/development.rb
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
↓
config.file_watcher = ActiveSupport::FileUpdateChecker
```

起動します。

```
rails s
```

起動できた！

![startedrails.png](https://qiita-image-store.s3.amazonaws.com/0/47389/1b816b94-d464-04c8-b4c2-db08e5ecec71.png)

いったんここまで。



## 引っかかったポイントまとめ

### umask

WSLインストールしてデフォルトの状態だとumask 002っぽい。
そのまま進めていったRailsから警告が出ました。
``
/home/hoge/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/app_loader.rb:40: warning: Insecure world writable dir /home/hoge/.rbenv/versions in PATH, mode 040777
``
これは後で``chmod -R go-w ~/.rbenv``しても大丈夫です。


### JavaScriptランタイム

何も考えずに進めたらjsのランタイムが無いよって怒られました。
``
/home/hoge/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.13.5/lib/bundler/runtime.rb:94:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.
``
Node.jsをインストールして解決。


### EventedFileUpdateChecker

file_watcherがEventedFileUpdateCheckerのまま起動したら怒られました。
``
/home/hoge/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/watcher.rb:74:in `initialize': Invalid argument - Failed to watch "/home/hoge/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/locale": the given event mask contains no legal events; or fd is not an inotify file descriptor. (Errno::EINVAL)
``
Bash on WindowsはFilesystem watchに対応していないためらしい。

同じようにWSLでRailsしてる記事がありましたので、参考にさせていただきました。
http://qiita.com/nisshiee/items/9a3b01ac558dabf408ae
サイボウズAPIを使ってPHPで施設を予約する

前回はサイボウズAPIをPHPから利用して設備の予約状況を取得した。

今回は、施設IDが1の施設に対し2016年1月1日10時～11時の予約を入れてみる。
参加者はユーザーID100の社員とする。


```php:sample.php(前半)
// 施設ID
$fid="1";

// 参加者ユーザID
$mid="100";

// 送信先
$url='http://(インストール先)/ag.cgi?page=PApiSchedule';
 
// ヘッダ
$headers = array(
'Content-Type: application/soap+xml; charset=UTF-8; action="ScheduleAddEvents"',
);
 
// リクエスト内容
$postdata =<<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
<Action xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">
ScheduleAddEvents</Action>
<Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
<UsernameToken>
<Username>xxxxx</Username>
<Password>xxxxx</Password>
</UsernameToken>
</Security>
<Timestamp xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility">
<Created>2013-06-01T00:00:00Z</Created>
<Expires>2037-12-31T00:00:00Z</Expires>
</Timestamp>
</soapenv:Header>
<soapenv:Body>
<tns:ScheduleAddEvents xmlns:tns="http://wsdl.cybozu.co.jp/base/2008">
<parameters>
<schedule_event
xmlns=""
id="dummy"
event_type="normal"
version="dummy"
public_type="public"
plan=""
detail="自動予約"
description="スクリプトから登録."
timezone="Asia/Tokyo"
end_timezone="Asia/Tokyo"
allday="true"
start_only="false">
<members>
<member>
<facility id="{$fid}"></facility>
</member>
<member>
<user id="{$mid}"></user>
</member>
</members>
<when>
<datetime start="2016-01-01T10:00:00" end="2016-01-01T11:00:00"></datetime>
</when>
</schedule_event>
</parameters>
</tns:ScheduleAddEvents>
</soapenv:Body>
</soapenv:Envelope>
EOF;
```

parameters内で最初のほうに出てくるidとversionは、予約登録時に自動で割り振られるため、リクエスト時にはdummyデータを入れている。

plan、detail、description、membersの中は任意に設定する。
`<members>～</members>`の中が予約対象で、入れ子になっている`<member>～</member>`を増やすことで複数の施設・参加者を登録できる。





```php:sample.php(後半)
// 送信内容生成
$options=array('http' => array(
'method'=>'POST',
'content'=>$postdata,
'header'=>implode("\n",$headers),
));
 
// 送信して、結果を格納
$contents = file_get_contents($url,false,stream_context_create($options));
$reader = new XMLReader();
$reader->XML($contents);

// 結果出力
while($reader->read()) {
    if($reader->nodeType == XMLReader::SIGNIFICANT_WHITESPACE || $reader->nodeType == XMLReader::END_ELEMENT){
        continue;
    }else{  
        // 予約IDを表示する
        if ($reader->name=="schedule_event") {
            echo "予約しました。id：".$reader->getAttribute("id")."<br />";
        }
    }
}
$reader->close();
```

後半は取得の場合とほとんど変わらないが、レスポンスのXMLを読んで予約に成功したかをチェックしている。
予約idに値が入った＝予約成功と判断する。
【Swift】ロード中に使うクルクル(Activity Indicator)を表示する方法

# デモ 
![AI.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/8f178508-226a-2109-92cd-00f3d5f7f14b.gif)


# コード

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    var ActivityIndicator: UIActivityIndicatorView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ActivityIndicatorを作成＆中央に配置
        ActivityIndicator = UIActivityIndicatorView()
        ActivityIndicator.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        ActivityIndicator.center = self.view.center
        
        // クルクルをストップした時に非表示する
        ActivityIndicator.hidesWhenStopped = true
        
        // 色を設定
        ActivityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
        
        //Viewに追加
        self.view.addSubview(ActivityIndicator)
    }
    
    @IBAction func start(_ sender: AnyObject) {
        // クルクルスタート
        ActivityIndicator.startAnimating()
    }
    @IBAction func stop(_ sender: AnyObject) {
        // クルクルストップ
        ActivityIndicator.stopAnimating()
    }

}

```
ExoPlayer(ver2)でローカルのビデオを再生

ExoPlayerばっか記事にしてるし技術力無いのに暇かよって言われそうですがこのまえちょっとわからなかった事あったのでメモ

使うタイミングほとんど無いと思うのですが、この前メディアをrawファイルから再生しようとしてどうやるのか困った事がありました。まあそもそもビデオをrawファイルに入れる意味がわからないんですがとりあえずそんな特殊事例があった場合のやりかた。
実は作者さんはそんな特殊事例のためのコードを最近作ったそうです。

```java

 RawResourceDataSource.Factory rawResourceDataSourceFactory = new RawResourceDataSource.Factory() {
            @Override
            public DataSource createDataSource() {
               return new RawResourceDataSource(context);
            }
        };

            // This is the MediaSource representing the media to be played.
MediaSource videoSource = new ExtractorMediaSource(RawResourceDataSource.buildRawResourceUri(R.raw.[ファイル名]),
                    rawResourceDataSourceFactory, extractorsFactory, null, null);

```

`RawResourceDataSource.Factory`っていうインターフェイスを作ってあげます。多分この通り`createDataSource()`で`RawResourceDataSource`を返すだけでいいと思います。（適当に作ってみたら動いたので正解かはわかりません。）
そしたらふつうの`MediaSource`の第２引数に入れてあげます。以上。

さらに`RawResourceDataSource.buildRawResourceUri()`って言うメソッドでリソースIDを簡単にURIに変換できるようにしてくれてます。
SpringMVCでRedirectAttributesを使用せずにリダイレクト先に値を渡す

Interceptorでリダイレクトを行い、リダイレクト先に値を渡したかったので色々試した結果、
以下のような方法で値を渡すことができた。

```java
public class TestInterceptor extends HandlerInterceptorAdapter {

	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws IOException {
		// リダイレクト先のパス
		String redirectPath = request.getContextPath() + "/redirectPath";

		// FlashMapを作成
		FlashMap flashMap = new FlashMap();

		// 渡したい値とキーを設定する
		flashMap.put("key", "リダイレクト先に値を渡す。");

		// リダイレクト先のパスを設定する
		flashMap.setTargetRequestPath(redirectPath);

		// FlashMapManagerを利用して、FlashScopeに値をセット
		FlashMapManager flashMapManager = RequestContextUtils
				.getFlashMapManager(request);
		flashMapManager.saveOutputFlashMap(flashMap, request, response);

		// リダイレクト
		response.sendRedirect(redirectPath);

		return false;
	}
}
```

結局、RedirectViewが行っている処理を実装すればよい。

# FlashScopeとは
リダイレクト先まで値を保持するスコープ。
リダイレクトは2度リクエストが発生するので、リクエストスコープでは値を保持できない。

# SpringMVCでの仕組み
SpringMVCではFlashMapというオブジェクトを利用してFlashScopeを実現している。
FlashMapオブジェクトには、key、value形式のMapに加えて、リダイレクト先のパスとパラメータを保持するフィールドがある。
RedirectViewでは、RedirectAttributesに設定された値と、リダイレクト先のパス、パラメータを設定したFlashMapを作成し、FlashMapManagerを利用してセッションスコープにそのFlashMapを保存している。

セッションスコープに保存されたFlashMapはDispatcherServlet内でController処理に入る前に、取得処理が行われ、パスとパラメータが一致するFlashMapがある場合は、中身を取り出し、リクエストスコープに格納される。
また、このタイミングでFlashMapオブジェクトは破棄される。

# まとめ
RedirectAttributesを利用せずにFlashScopeを利用するためには、
1. FlashMapオブジェクトにkey、value形式で渡したい値を設定する。
2. リダイレクト先のパスと、リクエストパラメータ（必要なときだけ）をFlashMapに設定する。
3. FlashMapManagerで作成したFlashMapを保存する。
4. リダイレクトする。