OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 051

2017年1月7日のAtCoderの記録。言語はRubyです。

問題はこちら：[AtCoder Beginner Contest 051](http://abc051.contest.atcoder.jp/)
私の回答一覧はこちら：[自分の結果](http://abc051.contest.atcoder.jp/submissions/all?user_screen_name=Linus)

難易度は、A<<B≒C<<<<<<<<<<Dくらいに感じた。D問題だけやけに辛くないですか。

#A問題
問題文には色々と条件があるが、要するに","を" "に置換すれば良い。

```ruby
puts gets.gsub( ",", " ")
```

#B問題
一般的でない解法で解いたけど、普通に解いたほうが良かった気がする。
「$(0 \leq x,y,z \leq K)$っていう条件がなかったら、S個を3つの部分に分けるから$ {}_{n+2}\mathrm{C}_2$で済むのになー」と最初に思った。
数学的には、XYZ空間上の立方体$(0 \leq x,y,z \leq K)$と、平面$x+y+z=S$ との共通部分となる。で、この共通部分はSを0から増やしていくと、正三角形→六角形→正三角形と変化する。この上の格子点の個数を求めれば良い。

最初の正三角形は、条件$S \leq K$のとき。 このときは$(0 \leq x,y,z \leq K)$が無意味である。したがって、$ {}_{n+2}\mathrm{C}_2$で求まる。(三角数)
次の六角形は、正三角形から3つの正三角形を切り落とした形である。……という感じで場合分け。

```ruby
k,s = gets.split(" ").map{|v|
	v.to_i
}
if k >= s then
	puts (s+2)*(s+1)/2
	exit
end
if s >= 2*k then
	t = 3*k - s
	puts (t+2)*(t+1)/2
	exit
end
puts (s+2)*(s+1)/2 - (s-k)*(s-k+1) /2*3
```

#C問題
解法は解説そのままだったので特に説明はしない。
文字列の繰り返しは*演算子でできることを学んだ。

```ruby
sx, sy, tx, ty = gets.split(" ").map{|v|
	v.to_i
}

x = tx-sx
y = ty-sy

ans = ""
ans << "R"*x
ans << "U"*y
ans << "L"*x
ans << "D"*y

ans << "D"
ans << "R"*(x+1)
ans << "U"*(y+1)
ans << "L"

ans << "U"
ans << "L"*(x+1)
ans << "D"*(y+1)
ans << "R"

puts ans
```

#D問題
各頂点からダイクストラ法で他の全長店までの最短路を求める。で、どの最短経路にも含まれない辺の個数を出力。アルゴリズムは書き終わったけどコンパイルエラーが取れなくて、直しているうちに時間切れになった。ダイクストラ法のアルゴリズムを綺麗に忘れていて焦ったし、アルゴリズムを思い出しても全然コードに直せなかった。
Laravel open source project で参考になりそうなもの

参考になりそうなLaravel製のオープンソースプロジェクトを集めた。

Railsの時はGitLabを見ていれば安心できたので、Laravelにもそのような存在を求めたという感じ。

参考 https://github.com/chiraggude/awesome-laravel

# Koel

https://github.com/phanan/koel

多分これが最大です。

個人的な音楽ストリーミングサイトです。

[綺麗なサイト](http://koel.phanan.net)もありますし、GitHubでのスター数も2017年4月8日時点で7400以上です。

Laravel 5.4, Vue.js 2.1, Yarn などを使っておりモダンな印象。アップデートにも追随しています。

特にWeb APIベースでVue.jsと一緒にLaravelを利用する場合、これに従っておけば間違いないと思います。

`Vuex` は使ってないので、その参考にはならないかも。

ちなみに、Vue.jsの作者のブログで知りました。

http://blog.evanyou.me/2015/12/20/vuejs-2015-in-review/

# Laracom

Laravel FREE E-Commerce Software です。

Laravel Cashier とかも使っていて、 Laravel で決済系のサービスを作りたい方には参考になるかと。

テストもしっかり書いているので、迷ったら見てみると良いと思います。

https://github.com/Laracommerce/laracom

# Vuedo

https://github.com/Vuedo/vuedo

名前の通り、Vue.jsを使ったブログシステム。
Vueを使った場合にどう書くか、参考になるかもしれない。

あと、ちゃんとテストも書いてあった。
Laravel界隈ではRailsに比べてテストを書いている場合が少ないような気がする。

[作者のブログ](https://m.dotdev.co/announcing-vuedo-an-open-source-project-built-with-laravel-and-vue-js-84f371409401) によると、Vue.js Feed はこれで作られているらしい。

# October CMS

https://github.com/octobercms/october

Laravelを使ったCMS。個人的にWordpressの代替になってほしい。

複数のモジュール（バックエンド、CMS、管理者）に分割するスタイル。

# Laravel.io

https://github.com/laravelio/portal

調べ物をしていると、よく引っかかるサイト。

Envoyer + Circle CI 2.0 でのデプロイや、 `dispatchNow` を使ったコントローラーの書き方などが参考になる。

# Monica

https://github.com/monicahq/monica

> Intuitive web application to remember everything about your friends and family.

月額500円のサービスとして提供しているので、コードには信頼を置いていいだろう。
2段階認証を設定しているので、その部分は特に参考になりそう。

個人的には `readme.md` にある、オープンソースへのアツい想いが好き。

# Laravel Project with Vue2 and Element

https://github.com/ElementUI/element-in-laravel-starter

Element というUIライブラリを使った例。

# LavaLite

https://github.com/LavaLite/cms

CMS
5.3の書き方と、APIのルーティングとWEBのルーティングを別にしているので、その参考になる。
5.4からはデフォルトでルーティングが別になっているが、それ以前だと手動で設定する必要があるので。

# Larasocial

https://github.com/msalom28/Larasocial

これはsimple but richなSNSである。

キャッシュファイルや `bower_components` がコミットされていたりするなど、いかにも個人開発っぽい印象。
ただしコントローラーのテストが書いてあるので、その参考になるかもしれない。

# Fully CMS

https://github.com/sseffa/fullycms

`config/fully.php` に設定を色々書けるみたいなので、その書き方が参考になるかもしれない。

多言語対応のCMSなので、中国語（繁体字）の言語設定があった。

技術には関係ないが、 ch はあっても zh はあんまり無いので面白い。

**個人の見解**
中国は拼音、台湾は注音文字 という入力方法を選択したが、中国が拼音を選んだのはかなり賢い選択だと思う。
アルファベットで漢字入力できるというのは、中国語学習者にとってあまりにありがたい。
一方の注音文字はかなり独特な記号だし、かな入力同様ホームポジションから遠い。
今後、中国語のコミュニティは拡大していくだろうし、その時に注音入力を使う人は台湾（という地域に住む）人々だけだろう。

# faveo-helpdesk

https://github.com/ladybirdweb/faveo-helpdesk

チケット管理ツール。発展途上で更新が止まっている。

- ルーティングやシードファイルが長い
- テストが皆無
- `vendor/` 以下がコミットされている

# flarum

https://github.com/flarum/flarum

ソースコードがどこにあるかわからず、今Composerでインストールしているところなので割愛。



# Laravel Best Practices

プロジェクトではないが、ベストプラクティスが書いてある。

http://www.laravelbestpractices.com/

※ 見つけたら、随時追加していく。他にあったら教えて下さい。
vim プラグインで試したもの(for mac)

- [MacVim インストール](http://shinogasa.hatenablog.com/entry/2015/11/09/234044)
<br>

- [MacVim 透過設定](http://melborne.github.io/2010/03/15/Applescript-Ruby/)
<br>

- [MacVim 文字色変更](http://qiita.com/mochizukikotaro/items/def041700846adb903fe)
<br>

- [MacVim 新しいウィンドウを開く方向を設定](http://vim-jp.org/vim-users-jp/2011/01/31/Hack-198.html)
<br>

- VimShell インストール・設定
https://kwakita.wordpress.com/2014/05/01/vimshell-on-macvim/
http://qiita.com/cuminseed/items/162730d678b18adcec67
http://blog.ryoana.com/entry/2014/01/10/013524
<br>

- [NeoBundle.vim：Vimプラグインのパッケージマネージャー](http://qiita.com/kazu0620/items/819679ef006d973c6c22)
<br>

- [VimFiler コマンド・設定](http://d.hatena.ne.jp/h1mesuke/20100611/p1)
<br>

- [VimFiler ウィンドウ設定](https://github.com/Shougo/vimfiler.vim/issues/82)
<br>

- [Vim デフォルトのウィンドウサイズを変更する](http://d.hatena.ne.jp/ykmbpp/20080901/1220263829)
<br>

- [Vim-fugitive](http://qiita.com/hyshhryk/items/4936c4412daa866daf7d)
<br>

- [Vimに関するまとめサイト](https://mba-hack.blogspot.jp/2013/02/vim.html)
<br>

- [キーマッピング チートシート](http://vim.rtorr.com/lang/ja/)
<br>

（おまけ）こんな風に楽しんでやってるブログ見るとやる気出る。
http://blog.neknote.com/
開発環境構築の自動化(Mac版)

最近また環境構築やり直したので、[こちら](http://qiita.com/mtake6212/items/720a051b51470fa294fd)の最新版

Anacondaはそのまま入れるとシステムのpythonのパスを変えてしまったりでHomeBrewとも相性がよろしくないので、pyenvを使います。
以下ではAnacondaがいつも最新版が入るようにしている
(bashrcの中身は前回のもの参照)
## 環境
- macOS Sierra(10.12.2)

## インストールするもの
- vagrant
- virtualbox
- googlechrome
- Google日本語入力
- pycharm
- pyenv
- Anaconda
- Xcode


```sh:install.sh
#!/bin/sh
source .bashrc
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew cask install vagrant
brew cask install virtualbox
brew cask install google-chrome
brew install Caskroom/cask/googlce-japanese-ime 

# python
brew cask install pycharm
brew install python
brew install pyenv
ANACONDA=`pyenv install -l | grep anaconda | tail -1`
pyenv install $ANACONDA
pyenv global $ANACONDA

# Xcode
brew install mas
mas install 497799835 # Xcode
```

## おまけ
HomeBrew便利なのだけど、書き方が上のやつだけで３種類あるのがややこい
brew で色々インストールする

【Fuelphp】
ディレクトリを移動し、 一部ディレクトリのパーミッションを変更する．
ブラウザにアクセス(localhost:8000)してトップページが表示されればインストール完了．

```
$ cd test_service
$ composer install
$ php oil refine install
$ php oil server
```

composer install とコマンドを打ち、下記エラーが表示される場合
`-bash: composer: command not found`

composer.pharをインストールしたフォルダをカレントディレクトリにし、次のコマンドを入力.
これでどこからでも composerコマンドが使えるようになる。
`$ mv composer.phar/usr/local/bin/composer`

Couchbase と MySQL は下記サイトを参考にインストールした。

【Couchbase】
http://hasen.hatenablog.com/entry/2015/12/12/173408

【MySQL】
http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d
Git 導入までの流れ

### 導入までの流れ(for Mac)

1, git のユーザー情報を設定するため、下記コマンドをターミナルに打ち込む

```
git config --global user.name “[user_name]"
git config --global user.email “[user_email]"
```

2, git管理したいディレクトリを作成し、テストでadd,commit,pushしてみる。

```
$ mkdir testproject
$ cd testproject
$ git init
$ echo "git test" > readme
$ git add .
$ git commit -m "first commit"
$ git remote add origin git@github.com:[user_name]/test.git
$ git push origin master
```

↓こんなエラーが出た時は ssh key を作成する(下記参考サイトを参照)
`Error: Permission denied (publickey)`

```
$ cd ~/.ssh
$ ssh-keygen -t rsa -C “[user_email]"

※ password聞かれるからそこは任意のパスを入れる。
```

3, id_rsa.pubをコピーしてgitに登録する
`$ pbcopy < ~/.ssh/id_rsa.pub`

[ssh key の設定画面にペーストする](https://github.com/settings/ssh)

これでpushできるようになるはず。


【参考サイト】
・push時にBad owner or permissions と表示された。
http://qiita.com/satomyumi/items/837810ef6176b3b6f4cc
http://kik.xii.jp/archives/179

・gitの使い方を知りたい
http://qiita.com/syougun360/items/013229aeddec08121474
http://www.yoheim.net/blog.php?q=20140104

・公開鍵と秘密鍵 -作成方法
https://joppot.info/2014/07/13/1722
_snprintf_s の動作


`_snprintf_s`の動作について自信がもてなかったので整理した。

### まずは定義

[本物](https://msdn.microsoft.com/ja-jp/library/f30dzcf6.aspx)とは引数名を変えて、自分用にわかりやすく書いてみる。

```c
int _snprintf_s(
  char       *buf,
  size_t      buf_size,
  size_t      limit_size,
  const char *format,
  ...
);
```

以降、上記を前提に書く。

## limit_size の働き
**`limit_size != _TRUNCATE`**を指定すると、生成文字列の長さが`limit_size`を越えた場合は`limit_size`までで切り詰められて`'\0'`が付与される。
それでも`buf_size`を越える場合はエラー[^1]になるが、これは`buf_size - 1`よりも大きな`limit_size`を指定してしまったマヌケなケースということになる。

**`limit_size == _TRUNCATE`**を指定すると、生成文字列の長さが`buf_size`に収まらない場合に`buf_size - 1`までで切り詰められて`'\0'`が付与される。
**つまり`limit_size == buf_size - 1`としたのと同じ動作**だ。

## 戻り値
切り詰め不要の場合、戻り値は生成文字列の長さ(`\0`を含まない)になる。
切り詰めが発生した場合、戻り値は`-1`になる。

## つまり一般的な使い方は
`limit_size`に`_TRUNCATE`を指定しておき[^2]、`-1`が返った場合に切り詰められたことを知ればよい[^3]。のだと思う。

ちなみに、`limit_size`の無い`sprintf_s(char *buf, size_t buf_size, format, ...)`では生成文字列の長さが`buf_size`を越えた時点でエラー[^1]になる。切り詰めるなりして復帰してくれればよさそうなものなのに。「末尾`_s`付きはセキュア関数」などと言ってもそれは「他人様の領域を壊さない」というだけで、本人は死んでいくのだ。

## ところで _TRUNCATE とは
`_TRUNCATE`の実体は`size_t`型にキャストされた`-1`
つまり64bit環境なら`0xFFFFFFFFFFFFFFFF`

---

[^1]: 無効なパラメタに対応するエラーハンドラが呼ばれる。デフォルトだとたぶんダイアログが出て死ぬ
[^2]: どうせ大概`limit_size == buf_size - 1`で事足りるだろう
[^3]: 死ぬことなく知ることができる
Memcachedの30days problemとはなんなのか

# 今北産業

Memcachedではexpiration timeに絶対指定と相対指定をすることができる
expiration timeに30日を超える秒数を指定すると絶対指定(epoch)として扱われる
つまりexpiration timeに30日を超える秒数を相対指定のつもりで指定した場合、絶対指定として処理されて大抵の場合は死に至る

# Memcachedのexpiration

Memcachedのexpirationには無効値とするまでの相対的な時間を秒数で指定する方法が一般的だ。
だが、実はMemcachedはepochによる絶対指定によるexpirationもサポートしている。
https://github.com/memcached/memcached/wiki/Commands#standard-protocol

ドキュメントを引用:

> An expiration time, in seconds. '0' means never expire. Can be up to 30 days. After 30 days, is treated as a unix timestamp of an exact date.

ざっくり適当に和訳するとこう:

> expiration time(有効期間)は秒数で指定します。0は無限を意味します。30日が上限です。30日以上はUNIX時間(epoch)による絶対指定として扱われます。

30日以上のexpiration timeはepochとして扱うとある。

ソースコードもみてみよう:
https://github.com/memcached/memcached/blob/1.4.34/memcached.c#L155
https://github.com/memcached/memcached/blob/1.4.34/memcached.c#L167-L177

`REALTIME_MAXDELTA` という定数をもとに判定している。
memcachedは内部的にはサーバーの起動時刻からの起動秒数(process_started)からの秒数でexpiration timeを管理しているのでこのような処理となる。

つまり、expiration timeに30日を超える秒数を相対指定のつもりで指定した場合、絶対指定として処理されることになる。
大抵の場合は現在時刻よりはるかに前の時刻を指定した扱いとなるため、即座にexpireされる（ように見える）。

expiration timeを動的に計算する場合など、長い時間を指定する可能性がある場合は気をつけると良い。

# 宣伝

YAPC::Kansai 2017 OSAKAが3/4(土)に新大阪のMOTEX HALLで開催されます。

http://yapcjapan.org/2017kansai/

絶賛トークプロポーザルを募集中です。チケットも残りわずか。ぜひぜひ。
Cousera - Andrew Ng 先生の Machine Learning Week 1

さて始まりました。無料で機械学習が学べるともっぱらの Coursera、評判の高い Andrew Ng 先生の授業を受講してみました。
丁度 Week 1 が終わったので軽くまとめることにします。

## Coursera についての所感

通勤中に iPhone で Coursera アプリで動画を見ながら evernote にメモしつつ進めています。
動画は1本10分未満くらいなのでスキマ時間にやるには丁度いいと思いました。

### アプリの不便な点

- アプリを行ったり来たりしてるとトップ画面に戻ってしまう
- 途中から動画を再生するとクイズが変な位置で連続して表示されたりする
- 字幕がどんどんずれていく

電車の騒音の中でイヤホンで聞いていると、声が小さいところが全然きこえなかったり、音量あげすぎるとサ行がメチャクチャ耳に痛かったりしたので字幕を表示していますが、これもずれていくので英語が苦手な私にとってはかなり辛かったです。

結局日本語字幕を表示するようにしてすごく楽になりました。

### 内容について

そこから説明するんだってくらい丁寧に説明していてとても分かりやすいです。クイズも寝てなければとける出席確認みたいな感じでした。
Week 1 の最後のテストみたいなやつはノートに書いてやらないとできないなと思ったんですが、計算が簡単に解けるようにできていたので大丈夫でした。 

## 講義メモ

### Supervised Learning

regression 出力は実数

回帰を Classification problem として捉えることもできる

### Unsupervised Learning

clustering で解く

### データセットの用語

m サンプル数

### Linear regression

変数が１つだと univariate linear regression (単回帰) という

### hypothesis

regression をする関数を hypothesis 仮説 と言う 慣習的な言い方で深い意味はない

### hypothesis の用語

θ パラメータ

### cost function

minimize 〜  〜の関数を最小化するパラメータを求める

square error function ほとんどの線形回帰に最適

cost function は等高線で可視化する

### gradient descent 最急降下法

適当な地点から始めて最も急な方向へ進む

学習率を変えなくても local minimum の近くでは傾きがゼロに近くので勝手に収束する

### Batch Gradient Descent

Batch: 最急降下法のように1ステップの計算に全体を使うアルゴリズムのこと

### 英単語

converge 収束
convex 凸
Intuition 直観

## 疑問点

最急降下法は微分が 0 になる極小値に収束するが、初期値が最大値や平らなところで始まった場合でも降下しなくなるんじゃないかと思いました
js 数字の並びを個別に平方して返す

##お題
数字の並びを個別に平方して返す。
例えば`9119`が与えられた場合は`811181`を返す。

```js
function squareDigits(num){
  //write your code.
}
squareDigits(9119)// 811181
```

##使ったもの
toString()
for文
join()


##考え方
・toString()で数字を文字列にして個別に扱えるようにする
・変換後の値を入れる配列を用意する
・for文で個別に数字を平方して用意した配列にいれていく。
・join（）で一緒にしておわり。


##コード
```js
function squareDigits(num){
    var string = num.toString();
    var results = [];
    for (var i = 0; i < string.length; i++){
        results[i] = string[i] * string[i];
    }
    return Number(results.join(''));
};
```

##ES6
```js
const squareDigits = (num) => Number((num + '').split("").map(v => v *v).join(""));
```

###他にもコードが浮かんだ方、コメントお待ちしております。
65歳を過ぎても脳機能は20代、「スーパープログラマー」たちが習慣にするかもしれないアクティビティ4つ

　プログラマたるもの、いつまでもプログラマでいたいものです。60歳を超えてもプログラミングしてたいなーと日頃から思っているところ、lifehackerさんで次の記事をみつけたので、アレンジしてみました。

　オリジナルの記事:[65歳を過ぎても脳機能は20代、「スーパーエイジャー」たちが習慣にしているアクティビティ4つ](http://www.lifehacker.jp/2017/01/170115_superager.html)


## 1. 新しいガジェットを買う
　今まで見たことのないガジェットを選び、家族や友人や同僚の前で機能を使いこなしてるのを見せつけることを目標にしましょう。他の人に先を越されないようにすれば、自分へのプレッシャーがさらに増します。

## 2. 未知の言語を学ぶ
　知らない言語ならhello worldを書くとこまではやってみましょう。言語の特徴を学ぶのは良いことです。少し知っている言語なら、もう一段上のレベルまで上達するようにしてもいいでしょう。
　よく知っている言語なら、その言語が使われている動作するアプリケーションで休暇を過ごすことにするなどして、それがrubyでコードを書かれていても、自分はそれをpythonで書いてみる事に挑戦してみましょう。

## 3. top coderなどに参加する（難易度の高い他のイベントでも可）
　自分の限界まで挑戦できるtop coderなどに参加しましょう。翻訳環境も整える事も必要ですが、問題を理解するのに30分かかってもいいのです。それならば、5分でコードを書いて実行してみましょう。

## 4. 人前でパフォーマンスする
　周囲の人に学んだ事をプレゼンしてみましょう。
　周囲に適切な人がいないなら、qiitaやはてなブログを書き、ソースコードをgithubで公開する事に挑戦してください。ここで覚えておくべきことは、何であれ自分にとって大きな挑戦でなければならないということです。難しくもなければ背伸びをする必要もないことなら、全然効果はありません。


* * *
うーん。身内からほとんど[プログラマが知るべき97のこと]
(https://ja.m.wikisource.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D97%E3%81%AE%E3%81%93%E3%81%A8)のパクリだという指摘が…。
Swift3.0対応 CoreGraphicsで円グラフを描く

#はじめに
Swift3で、円グラフのサンプルを作成しました。
以前、作成しましたPieの描き方の応用です。
[Qiita Swift3.0対応 CoreGraphicsでPieを描く](http://qiita.com/Masataka-Dev/items/e348353ac0e553143fc2)

<img width="150" alt="Simulator Screen Shot 2017.01.16 22.33.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/159175/049372ad-ee5e-1d98-b208-a17cc5d1f590.png">

#円グラフの描画
```swift:PieChartView.swift
struct Segment {
    
    var color: UIColor
    var angle: CGFloat
    
}
```
円グラフの1区分を構造体で表します。色と角度を指定します。

```swift:PieChartView.swift
var segments = [Segment]() {
        didSet {
            setNeedsDisplay()
        }
    }
```
上述した構造体"Segment"の配列を用意します。
値を設定すると再描画するようにしてあります。
サンプルではViewControllerで値を設定しています。

```swift:PieChartView.swift
private func drawPieChart(rect: CGRect) {
        // コンテキストを取得
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        
        // Pieの中心位置
        let center = CGPoint(x: rect.width * 0.5, y: rect.height * 0.5)
        
        // Pieの半径
        let radius = min(rect.width, rect.height) * 0.5
        
        // 開始角度(ラジアン) 右回りにするため-90度
        var startAngle = CGFloat(-90.0 * .pi/180)
        
        self.segments.forEach { (segment) in
            // Pieの色を設定
            context.setFillColor(segment.color.cgColor)
            
            // 終了角度(ラジアン) 右回りにするため-90度
            let endAngle = (segment.angle - 90.0) * .pi/180
            
            // 描画位置を移動
            context.move(to: center)
            
            // Pieを追加
            context.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false)
            context.fillPath()
            
            startAngle = endAngle
        }
    }
```
構造体"Segment"の配列から一つずつデータを取り出して、描画の開始角度と終了角度を設定してPieを描画していきます。

#サンプル
Githubにサンプルプロジェクトをあげました。

[Github PieChart](https://github.com/Masataka-Dev/PieChart)
自分用のレイマーチングチートシートを作ってみた。

# 初心者ながらいきなりレイマーチングは難しい…
レイマーチングをするにあたって、いきなり書こうとすると、何を書けばいいかわからないので、以前受けた、[GLSLスクール2016](https://webgl.souhonzan.org/entry/?v=0703) のサンプルコードから、自分用のチートシートを作ってみました。

# というか
頭では、分かっていても体がついてこない…
ということで、とにかく基本に公式的なものを自分で作ってみました。

# というか…
サンプルコードとほぼ変わらないですが…

* 図形の距離関数を書く
* 法線を定義
* カメラワークを定義
* レイが進む処理
* レイとオブジェクトの衝突処理を書く

の流れだけを書き出してみました。

```c++
/*
*******************************************************************************
レイマーチングチートシート
*******************************************************************************
*/

/* 精度修飾子の宣言 */
precision mediump float;

/* WebGLで受け渡された変数 */
// 解像度 (512.0, 512.0)
uniform vec2  resolution;
// mouse (-1.0 ~ 1.0)
uniform vec2  mouse;
// time (1second == 1.0)
uniform float time;
// previous scene texture
uniform sampler2D prevScene;


/* 距離関数の定義 */
float dGraphic01(vec3 p){
	// ここに図形の距離関数を書く
	return length(p) - 0.5;
}
float dGraphic02(vec3 p){
	// ここに図形の距離関数を書く
	return length(p) - 0.5;
}
// 二つの図形を合成するの距離関数
float distanceHub(vec3 p){
	// 二つの図形の描く距離関数を書く
	return min(dGraphic01(p), dGraphic02(p));
}

/* シェーディング */
// 法線の生成
vec3 genNormal(vec3 p){
	float d = 0.001;
	return normalize(vec3(
		distanceHub(p + vec3(  d, 0.0, 0.0)) - distanceHub(p + vec3( -d, 0.0, 0.0)),
		distanceHub(p + vec3(0.0,   d, 0.0)) - distanceHub(p + vec3(0.0,  -d, 0.0)),
		distanceHub(p + vec3(0.0, 0.0,   d)) - distanceHub(p + vec3(0.0, 0.0,  -d))
	));
}
// シェーディング(色など)
vec3 doColor(vec3 p){
	float e = 0.001;
	// レイとオブジェクトの距離を確認
	if (dGraphic01(p)<e){
		// 法線を算出
		vec3 normal = genNormal(p);
		// ライトベクトルの定義（マウスの影響を受けるように）
		vec3 light  = normalize(vec3(1.0, 1.0, 1.0));
		// ライトベクトルとの内積を取る
		float diff  = max(dot(normal, light), 0.1);
		return vec3(diff, diff, diff);
		// スペキュラーを定義する
		// float spec = pow(diff*diff, 15.0);
		// return vec3(diff+spec, diff+spec, diff+spec);
	}
	// 衝突しなかった場合はそのまま黒
	return vec3(0.0);
}

/* カメラのワーク */
void main(){
	// スクリーンスペースを考慮して座標を正規化
	vec2 p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);

	/* カメラを定義 */
	// カメラの位置
	vec3 cPos         = vec3(0.0,  0.0,  3.0);
	// カメラの向き(視線)
	vec3 cDir         = vec3(0.0,  0.0, -1.0);
	// カメラの上方向
	vec3 cUp          = vec3(0.0,  1.0,  0.0);
	// 外積を使って横方向を算出
	vec3 cSide        = cross(cDir, cUp);
	// フォーカスする深度
	float targetDepth = 1.0;

	// カメラの情報からレイを定義
	vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir * targetDepth);

	/* マーチングループを組む */
	// レイとオブジェクト間の最短距離
	float dist = 0.0;
	// レイに継ぎ足す長さ
	float rLen = 0.0;
	// レイの先端位置(初期位置)
	vec3  rPos = cPos;
	// レイが進む処理(マーチングループ)
	for(int i = 0; i < 32; ++i){
		dist = distanceHub(rPos);
		rLen += dist;
		rPos = cPos + ray * rLen;
	}

	// レイとオブジェクトの距離を確認
	vec3 color = doColor(rPos);
	gl_FragColor = vec4(color, 1.0);
}
```

ほぼコピペですが…

![gazou.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/c7b36418-4e62-2462-6ca5-0c2fba05e501.png)


これをもとに明日から、レイマーチングの記事を書こうと思います。
Cognos Event Studioの式の記述例

Cognos Event Studioでの、意外と迷う「式」の書き方をメモレベルですが共有しておきます。
Event Studioとは、Cognosの機能で、あるクエリー条件に指定した条件にデータがヒットした場合に、特定のタスクを実行する機能です。
タスクとは、メールで通知したり、レポートを実行したり、等です。

例えば、Great Outdoorsのサンプルで、以下のように、
製品ライン＝ゴルフ用品 & 年＝2010 & 数量 > 1,000,000
の時に、それを通知するようなイベントを仕掛けたいとします。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/38e13e36-e9e8-5c0d-e099-4c0eb051091b.png)

マニュアル等で調べると、こんな風に書けば良さそうなので、書いてやってみると、
「詳細タブで [製品ライン]='ゴルフ用品' and [年]='2010' and [数量] > 1000000」
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_10.2.0/com.ibm.swg.ba.cognos.wig_cr.10.2.0.doc/t_gtstd_ex_manage_event_es.html
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f8e01b07-cb55-313d-88a5-6998da1e8ee4.png)

こんな風に「イベントの条件が満たされていません」と怒られます。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8a15d9e6-b3ad-be98-2162-144d8a8dc0c1.png)

おかしいなと思い、集計タブでやってみると、これは成功します。
「集計タブで [製品ライン]='ゴルフ用品' and [年]='2010' and [数量] > 1000000」
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/01c15045-2081-9581-30ec-4467febd115e.png)

しかしながら、以下でも成功してしまいます。※数量が1,100,000以上で成功して欲しくない。
「集計タブで [製品ライン]='ゴルフ用品' and [年]='2010' and [数量] > 1100000」
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ced1a1c2-cbf1-f933-1c6f-1c9ea568931e.png)

これはつまり、この「数量」の全合計の値で判定されているようで、製品ラインや年の指定は無視されます。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6471b5f0-b880-7a00-e538-f1aa61c078d8.png)

では、どうすれば良いかというと、詳細タブで以下のように指定してください。
※数量をtotal()で囲んでいるのが重要です。
「詳細タブで [製品ライン]='ゴルフ用品' and [年]='2010' and total([数量]) > 1000000」
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/62da380d-5f54-af10-083c-001025423b22.png)

ちなみに、以下にすると、ちゃんと「イベントの条件が満たされていません」と言われます。
「詳細タブで [製品ライン]='ゴルフ用品' and [年]='2010' and total([数量]) > 1100000」

まあ、これだけの情報なのですが、マニュアルとか見て記載されている通りにやっても何かできないので、フィードバックしておきます。
Windows向け：特定のディレクトリ以下のディレクトリおよびファイルの一覧を取得する。

ちょっと、捜し物をしたくて
WindowsPCの端末のディレクトリを一斉走査するスクリプトを書きました。

下記、スクリプトの(1)の
```python
mainDirList = os.listdir();
```
上記の引数に、対象のディレクトリを指定して実行するだけで
ユーザーディレクトリに一覧を書き出すように処理を書いています。
そのうちアップデートするかもしれません。

```python
import os
from io import StringIO
from io import BytesIO
import datetime


#ioオブジェクトの作成
#出力内容をバッファリングする
i = StringIO()
#実行時のディレクトリを取得
path = os.getcwd()

#スキャン開始元ディレクトリ(1)
mainDirList = os.listdir("C:\\")

separate = "\\"
tab = "    "

def checkAllData(fileName, path, fp, tab = "    "):

    """当該関数に渡された第一引数がディレクトリの場合のみ実行"""
    """この場合、一旦プロセスを停止して、当該のディレクトリを再帰的にスキャン"""
    if os.path. isdir(path) == True:
        fp.write(tab + fileName + "\n")
        directoryList = os.listdir(path)
        for __temp__ in directoryList :
            if os.path.isdir( path + separate + __temp__) == True:
                """親ディレクトリを出力"""
                fp.write(tab + __temp__ + "\n");
                res = (checkAllData(__temp__, path + separate + __temp__, fp, tab + "    "));
            else:
                fp.write(tab + "->" +__temp__ + "\n")
    else :
        """当該関数に渡された第一引数がファイルの場合、そのまま出力"""
        fp.write(tab + "->" + fileName + "\n")


"""ディレクトリ構造をファイルへ書き込み"""
try:
    #スキャンしたディレクトリ一覧をファイルへ出力する。
    fp = open("C:\\Users\\太郎\\test.dat", "w", encoding="CP932")

    #ディレクトリのスキャン開始
    for tempLine in mainDirList:
        try:
            """現在のディレクトリ階層をループ"""
            path = "C:" + separate + tempLine
            if os.path.exists(path):
                fp.write(tempLine + "\n");
                checkAllData(tempLine, path, fp, "    " )
            else :
                fp.write("->" + tempLine + "\n");
        except Exception as e:
            print(str(e))
        except :
            fp.write("握り潰す" + "\n");
    fp.close()
except Exception as e:
    print(str(e))
```
OpenCVでの型違い代入

# OpenCVでの代入
いい感じに処理してくれるところとそうでないところが混ざっているため、少しわかりにくいです。今回は型違いの代入についてメモ。


```cpp

#include <iostream>
#include <opencv2/core/core.hpp>


int main(void) {

	cv::Mat matdouble = (cv::Mat_<double>(3, 3) << 2, 2, 3, 4, 5, 6, 7, 8, 9);
	std::cout << "matdouble:" << std::endl << matdouble << std::endl << std::endl;

	// 違う型のMatにキャストしながら代入する
	cv::Mat matuchar = (cv::Mat_<uchar>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1);

	// 只の代入ではうまく行っているように見えて、データごとには間違っている
	matuchar = matdouble;
	std::cout << std::endl << "matuchar:" << std::endl << matuchar << std::endl << std::endl;
	std::cout << "matuchar[0]:" << (double)matuchar.data[0] << std::endl; // matuchar[0]: 0

	// こちらが正しい
	matdouble.convertTo(matuchar, CV_8UC1); //CV_8UC1: 8bit unsigned char channel 1
	std::cout << std::endl << "matuchar:" << std::endl << matuchar << std::endl << std::endl;
	std::cout << "matuchar[0]:" << (double)matuchar.data[0] << std::endl; // matucahr[0]: 2

	return 0;
}

```
Hyper-Vの音の再生

#tl;dr
Hyper-V上でwindows仮想マシンのオーディオを再生するために、仮想オーディオデバイスのインストールとリモートデスクトップ接続でなんとかしたときのまとめ

##VMWare、VirtualBox vs Hyper-V
windows10でDocker on windowsのためにHyper-Vを有効にするとVirtualBoxやVMWareが動かなくなる。Hyper-V有効のままでWindows仮想マシン(以下、仮想マシン)を作れないかを試してみた。

##リモートデスクトップ接続時の設定
↓参考にした記事。
[hyper-v-上の-windows-server-2008-r2-でリモート-オーディオ再生を使用](http://blog.engineer-memo.com/2011/01/22/hyper-v-%E4%B8%8A%E3%81%AE-windows-server-2008-r2-%E3%81%A7%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88-%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E5%86%8D%E7%94%9F%E3%82%92%E4%BD%BF%E7%94%A8/)
仮想マシンの音声再生はリモートデスクトップしない限りできなかった。
仮想マシンにサービスがありAudioサービスを開始できればリモートデスクトップだけで可能になった。

##仮想オーディオデバイスのインストール
↓参考記事のフォーラム
[Sound Card Emulation in Hyper-V?](https://social.technet.microsoft.com/Forums/windowsserver/en-US/a060720c-833e-4855-921b-6d5c79dc98d9/sound-card-emulation-in-hyperv?forum=winserverhyperv)

仮想マシン内にデバイスもサービスもないとき、フォーラムを参考にしつつ下記の仮想オーディオデバイスをインストールすると音声再生できた。

[Virtual Audio Cable](http://software.muzychenko.net/eng/vac.htm)
Windows XP/2003/Vista/Server 2008/Win7/8/8.1/10 platforms, 32-bit or 64-bit
trial version(32bit, 64bit)あり。full版(25-50ドル)

##総括
VMWareやVirtualBoxのほうが自由度が高いし設定しやすいと思う。
リモートデスクトップとの親和性や起動の速さはなかなか良いので
Hyper-Vを使う場合に、仮想マシンの使い勝手向上の一助になれば。
複数行のUILabelを上によせる

<img width="358" alt="Screen Shot 2017-01-16 at 22.29.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/15144/afee6daf-6903-a0e8-71bd-d2e322d160c0.png">

## やりたいこと

複数行のUILabelを中央ではなくできるだけ上によせる

## 必要条件

AutoLayout

## やりかた

<img width="252" alt="Screen Shot 2017-01-16 at 22.31.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/15144/1d823728-9f34-0977-77c9-15a272cc9fc6.png">

AutoLayoutで、UILabelの `height` の等号を `≦` にします。
これで勝手に上によせてくれるようになります。

<img width="360" alt="Screen Shot 2017-01-16 at 22.32.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/15144/39142afa-1b8a-3004-00e4-8155387f2830.png">

応用すると、好きな方向に寄せることができると思われます。:+1:
Angular2で書いたコードをElectronで動かしたら値がバインドできなかった話 

## 概要

開発中、以下のような状況が発生した。

- Angular2 でアプリ作って
- Webpack でバンドルして
- Electron で動かした
	- ら、値がバインドされなかった

このとき、Electron で動かす Angular のアプリには Canvas を使ったものやら NodeJS のモジュールを利用したものやらを実装していた。なので、Webpack の設定は下記のようになっていた。

```webpack.config.js
let config = {
	...
	target: "electron-renderer",
	externals: [
		"canvas",
		"jsdom"
	],
	...
}

```

このような設定をしておくと、Electron から NodeJS を利用しつつ、Canvas もきちんと動いてくれる。実は、件のアプリは元々 AngularJS 1.5 で作っていたもので、そのときは問題なく動いていた。Angular2 のリリースを受けて移行作業を行っていたとき、問題に遭遇したわけだ。


## 原因

色々試してみたら原因が分かった。Electron や Angular2 の問題ではなく、Webpack の設定のせいだった。上記の設定から `target` の記述を除く（＝ `target:'web'` の状態にする）と、値がバインドされる。

つまり、Web をターゲットにすると動き、Electron をターゲットにすると動かない。Web 向けと Electron 向けできっと差異があるんだろう、と思って Webpack のソースを弄って試してみても特に動いたりしなかった。何かしら違いはあるんだろうけど。。。

まぁでも、Web 向けにバンドルすれば Angular2 がちゃんと動くのだから、その設定にしておけばいいという話だろう。

---

……ところで、本稿で試したアプリには `target:web` と相性の良い Canvas と `target:electron` じゃないと動かない NodeJS モジュールを利用した機能が混在している。Angular2 は `target:web` にしないと値をバインドしてくれない。

さてどうしようか。

とはいうものの、問題となっている部分は切り分けができるので、回答は至ってシンプルだ。


## コンポーネントとサービスを別々にバンドルする

`target` の違うものを組み合わせるなら、別々にバンドルしたものを Webpack を使って連携させればいい。幸いにも Webpack にはそういう機能があるし、探せば色々記事はあるはず。

NodeJS モジュールを利用している機能をまとめたサービスだけを `target:electron` の設定で別にバンドルする。その際の設定は下記のようになる。

```webpack.lib.config.js
const path = require('path');
const webpack = require('webpack');

let config = {
	// バンドル対象のファイル
	entry: {
		service: [
			path.join(__dirname, 'service/external.service.ts')
		]
	},
	// 出力先の指定
	output: {
		path: path.join(__dirname, 'dist'),
		filename: '[name].lib.js',
		library: '[name]_lib'
	},
	// ビルド対象の拡張子
	resolve: {
		extensions: ['', '.ts', '.webpack.js', '.web.js', '.js', '.json']
	},
	target: 'electron',
	externals: [
		"canvas",
		"jsdom"
	],
	module: {
		loaders: [
			{
				test: /\.ts$/,
				loaders: ['awesome-typescript-loader', 'angular2-template-loader'],
				exclude: [/\.(spec|e2e)\.ts$/]
			}
		]
	},
	plugins: [
		// manifest ファイルを作るプラグイン
		new webpack.DllPlugin({
			path: path.join(__dirname, '[name]-manifest.json'),
			name: '[name]_lib'
		})
	]
};

module.exports = config;
```

この設定ファイルを `webpck --config` で渡してやれば、指定したファイルがバンドルされる。

ちなみに、この設定だとメインのバンドルファイルとサービスのバンドルファイルに Angular2 などのベンダーモジュールが重複して入ってしまうので、それを避けるために `npm install` などでインストールしたモジュールも別のバンドルにしておくことをおすすめする。

そうした場合、resolve 以下を消して、plugins に次のプラグインを追加する。

```
	plugins: [
		...
		new webpack.DllReferencePlugin({
			context: __dirname,
			manifest: require('./hoge-manifest.json')
		})
		...
	]
```

同じように、元々のバンドルファイルにも作成したバンドルファイルのマニフェストファイルを読み込むように設定し、`target:web` としてバンドルすればよい。

後は index.html で双方を読み込んでやれば動作するはずだ（ただしサービスのバンドルを先に読み込むこと・非同期で読み込まないこと）。


## 最後に

これ、結局 Webpack, Angular2, Electron のどれのせいなのかよく分からんし、バグなのか仕様なのかも分からないっすね……。

なんかちょっと泥臭いやり方になっちゃったように感じるし、もうちょっとスマートに解決する方法あったりしないかな。。。

あと、バンドルの分割の話、分かりにくかったら[こちらの記事](http://qiita.com/pirosikick/items/c77db84dbed4c447a6fe)をどうぞ。私の説明よりもっとずっと分かりやすいです。
Git コマンド

#Gitコマンドのメモ

## コミット系

### 全てコミット(追跡してないファイルがある場合はAddしろって言われる)
```
$ git commit -am "commit comment"
```

### 前のコミットに追加する。(前のコミットがプッシュされている場合にはしない)
```
git commit --amend -m "commit comment"
```


### 空コミット
```
git commit --allow-empty -m "first commit"
```


## ログ出力

### 樹形図付き、1列コミットコメントでログを出力
```
$ git log --oneline --graph
```

### logを一列で表示
```
git log --pretty=oneline
```

## 差分確認

### 2つのブランチの差分を表示(masterとdevelopの差分を表示)
```
git diff master develop
```

### ステージングしてあるファイルの差分を見る
```
git diff --staged
```

### index.htmlの編集履歴を1列毎に確認出来る
```
git blame index.html --date short
```

## コミット取り消し、削除

### 追跡をやめる(-rは再帰的。この場合ファイルも消える)
```
git rm -r target.file
```

### 追跡をやめるがファイルは残す場合(-rは再帰的。この場合ファイルも消える)
```
git rm -r --cached target.file
```

### 1つ前のコミットと編集を全て取消(プッシュしてあるコミットにはしない)
```
git reset --hard HEAD^
```

### 2つ前のコミットを取り消すが、編集内容は保持つまりステージングしてある状態(プッシュしてあるコミットにはしない)
```
git reset --soft HEAD^^
```

## Gitコマンドのカスタム(エイリアス)

### mylogというコマンドで""内が実行されるようになる。(デフォルトコマンドは書き換え不可能)
```
git config --global alias.mylog "log --pretty=format:'%h %s [%an]' --graph"
```

### stというコマンドでstatusが実行される。
```
git config --global alias.st status
```
スクリプト言語でプログレスバーを仮実装する方法

# はじめに

スクリプトを実行していて途中経過がよく分からない時、Print文を多用するのですが、これが結構かっこ悪いので、「#」を使ったプログレスバーを実装する。

# Ruby

```rb:test.rb
(0..10).each do |i|
  sleep(1)
  print "\r" + "%3d" % (100.0 * i.to_f / 10.0) + "% " + "#" * i
end

puts "\nEND"
```

# Python

```py3:test.py
import time

for i in range(11):
    time.sleep(1)
    print("\r{0:3d}%".format(int(100.0 * i / 10)), "#" * i , end='')
    
print('\nEND')
```

# 結果

コマンドを実行。

```sh:
$ ruby test.rb
100% ##########
END
$ python test.py
100% ##########
END
```

結果だけ見てもわかりませんが、時間の経過とともに「#」が増えていきました(^_^;)
結構、便利かも...

ちなみに、Jupyter notebookでも使えますよ。
ただし、Pythonの場合は専用のライブラリが用意されているから使うことは無いかもしれません（汗）

使い方は以下の記事にてご確認下さい。
http://qiita.com/mix_dvd/items/e613c2714c7ea0e81be9
pandasを使い読み込んだ複数のエクセルファイルを1つにまとめる

#こう書きます

```
df_all = pd.concat([df_xxx,df_yyy,df_zzz],axis=0)
```

#メモ
第二引数：Axis=0で縦方向の結合であることを指定する。
エクセルは同じ列名をつけます

http://qiita.com/hik0107/items/d991cc44c2d1778bb82e
Dockerでbitnami/redmineを"/redmine"で動かす

# サブディレクトリ化のための設定項目
## 前提
- bitnami/redmine:latest (2017/01/16現在)
- --volume /srv/redmine/redmine:/bitnami/redmine

 Rubyを触ったことはありません。
 調べてできた結果をメモしておきます。


## (1)設定その1
この設定により、[http://example.com:3000/redmine](http://example.com:3000/redmine)で開くことができますが、cssやjsなどのURLが変わっていません。

``` /srv/redmine/redmine/conf/environment.rb
...

# 追加
RedmineApp::Application.routes.default_scope = "/redmine"

# Initialize the Rails application
Rails.application.initialize!
```

## (2)設定その2
この設定により、cssやjsなどのURLもサブディレクトリを向きます。
しかしファイルがないため変わりません。

``` /srv/redmine/redmine/conf/routes.rb
...

# 追加
Redmine::Utils::relative_url_root = "/redmine"

Rails.application.routes.draw do
  root :to => 'welcome#index', :as => 'home'

...
```

## (3)設定その3
ここまで設定することで、作業は完了のはずです。
できなければ、何かが違うのかもしれません。

``` console
$ ln -s /opt/bitnami/redmine/public /opt/bitnami/redmine/public/redmine
```

## 最後に
以上でできるはずです。
なお、設定反映のための再起動コマンドは下記です。

``` console
$ /opt/bitnami/redmine/bin/passenger-config restart-app
```

## 参考にしたページ
http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI
http://n.blueblack.net/articles/2012-07-30_01_nginx_unicorn_redmine_03/
深層学習 第3章 確率的勾配降下法

[第2章](http://qiita.com/enufranz/items/3890f92849ce55bdfade)に引き続き、機械学習プロフェッショナルシリーズ（MLP）の第3章を読み進めていきます。
本投稿(連載)を一緒に読めば事前知識なしでも読み進められる...といったものを目指しています．

# 本章の内容

前章で定義した誤差関数からパラメータを導くための方法である、
確率的勾配法のアルゴリズムにまず触れます。
その後、過適合（overfit)の問題とその対策について述べます。

# 本文詳細

## 勾配降下法ではどのパラメータに対して勾配を計算する？

すべてのパラメータに対する勾配を計算し、
誤差関数を最小化するように、パラメータを更新していく。

## 非線形関数の最小化手法の中から勾配降下法を使う場合とは？

非線形関数の最小化手法の中では，
勾配降下法は単純なアルゴリズムで，収束が遅い．
またハイパーパラメータの設定により，収束が大きく変化するという使いにくい点も持つ。

他にも目的関数の二次微分を利用するニュートン法などがあるのだから、
通常は勾配降下法をわざわざ使わない．
使うとしたら，問題の規模が大きく，目的関数の二次微分の計算が難しい場合など．
DNNはその場合に相当する．

## バッチ学習と比較して、確率的勾配降下法（SGD）の利点は？

訓練データに冗長性がある場合、
計算効率が向上し、学習を速く実行できる。

また、局所解にトラップされるリスクを低減できる。
バッチ学習の場合、最小化する目的関数はつねに同じなので、望まない局所解にトラップされると、二度とそこから抜け出せない。
しかし、SGDでは目的関数が更新ごとに異なるため、そのようなリスクが小さくなる。

## じゃあなんでミニバッチ学習をするのか？

SGDには欠点もあるため。
たとえばある更新で、利用する訓練データが外れ値の場合、おかしな方向にパラメータを調整してしまう。
なので、複数の訓練データをサンプルとして利用することで、「大体正しい方向にパラメータを動かす」ことを目指す。
ただし、バッチで使う訓練データを増やしすぎると、上記で述べたような極小解にトラップされるので、
そのハイパーパラメータの調整は必要。

## ネットワークの自由度が高いほど、学習時に誤差関数の浅い局所解にトラップされやすくなるのはなぜ？

ネットワークの自由度が大きいときというのは、パラメータが多いとき。

定性的に考えてみるとわかる。
1変数のときでも局所解にはまる恐れはある。
でも2変数のときは1変数のときよりももっと局所解にはまりやすい。
局所解を浅い穴、最適解を深い穴とすると、変数が増えるにつれ、浅い穴が増えるイメージ。

パラメータが多いとそれだけ、浅い穴にハマる可能性が高くなる。

## 過適合（局所解にトラップされるの）を防ぐための重みの正則化とは？

過適合を防ぐために重みの正則化を行う。
最も簡単な正則化は、重みになんらかの制約を加えること。
よく使われるのが次のように、誤差関数に重みの二乗和を加えて、これを最小化すること。

```math
E_t(w) \equiv \frac{1}{N_t}\sum_{n \in D_t} E_n(w) + \frac{\lambda}{2} || w ||^2
```

$\lambda$は正則化の強さを制御するハイパーパラメータで、一般に$\lambda=0.01や0.00001$程度から選ぶ。

重みが極端な値になってしまうと、そのノードの影響が支配的になってしまい、層を重ねて表現力を上げる目的が達せなくなってしまう。
この状態を防ぐために、重みを大きくならないようにすれば過適合を防げるという理屈（と理解した）

## 白色化とはなにか？

成分間の相関を0にする変換のこと

## Adagradとはなにか？

ニューラルネットの学習では学習係数${\eta}$の調整が重要
学習係数の減衰（learning rate decay）が常套手段
最初は大きく学習して、次第に小さく学習するようにする

学習係数の減衰をさらに発展させたのがAdaGrad
Adagradでは**1つ1つのパラメータに対して，オーダーメイドの値を設定する**

```math
h \leftarrow h + \frac{\partial L}{\partial W} \odot \frac{\partial L}{\partial W} \\\
W \leftarrow W - \eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial W} 
```

${h}$は，これまで経験した勾配の二乗和を保持
パラメータ更新の際に，$\frac{1}{\sqrt{h}}$を乗算することで学習のスケールを調整
パラメータの要素の中でよく動いた要素は，学習係数が小さくなる．

## 重みの初期化はどうすればよい？

学習開始時に重みの初期値を決める必要があるが、その一般的な方法は正規分布から生成したランダム値を初期値とする方法。
ただその場合にガウス分布の標準偏差 $\sigma$ をどう選ぶかで学習結果に影響を与える。
この $ \sigma $をちょうどよい大きさでないと、活性化関数の出力がその値域の中でちょうどよい範囲にこなくなるから。

基準としては、
あるユニットへの総入力 $ u_j = \sum_i w_{ji} x_i $がちょうどよい分散を持つように $\sigma$ を決めるのがよいといえる。
あるユニットへの挿入力の分散を $\sigma_u^2 $にしたいときには、

$$
\sigma =
\sigma_u / M^{1/2}
$$

とするように値をとるのがよい。ただしMはあるユニットへの入力結合の数。

次は...
ggplot2でアレやコレを消す

背景色の消し方をよく忘れるのでメモ。

# ベース

データセットはmpgを使う。

```r
## エンジン排気量(displ)と高速燃費(hwy)で散布図を描き、
## 駆動方式(drv: f...前輪駆動 r...後輪駆動 4...四輪駆動)をpchにマッピングし
## メーカー(manufacturer)別に分割
p <- ggplot(mpg, aes(x = displ, y = hwy, pch = drv)) +
  geom_point() +
  facet_wrap(~manufacturer)
p
```

![Rplot001.png](https://qiita-image-store.s3.amazonaws.com/0/109348/6832c237-0736-d54d-99db-b60fb86f2132.png)

# アイツを消し去りたい場合

各要素を個別に操作するには`theme()`を使い、`theme(axis.line=...)`のように指定する。どのような要素に指定できるかは`?theme`で確認。
このとき、直接値を指定する要素もあるが、多くは`element_`関数を介して指定する。
とりあえず、要素を消してしまいたいときは`element_blank()`を使う。

```r
p + theme(
  panel.background = element_blank(),
  panel.grid = element_blank()
)
```

![Rplot002.png](https://qiita-image-store.s3.amazonaws.com/0/109348/a8de8f34-015b-30d0-68ba-259c72c22792.png)

# 本気で消すつもりは無かった場合

`element_`シリーズには`blank`以外に`rect`, `line`, `text`があり、背景のように長方形っぽいものを細かく操作するには`element_rect()`を使う。

```r
p + theme(
  panel.background = element_rect(fill = "transparent", colour = "black"),
  panel.grid = element_blank()
)
```

![Rplot003.png](https://qiita-image-store.s3.amazonaws.com/0/109348/9f6279ca-812c-695f-c6ef-6b603e7121b5.png)

# アレの名前が分からない

facetで分割した時のそれぞれのグラフの上につくラベルは`strip`という。

```r
p + theme(
  panel.background = element_rect(fill = "transparent", colour = "black"),
  panel.grid = element_blank(),
  strip.background = element_blank()
)
```

![Rplot004.png](https://qiita-image-store.s3.amazonaws.com/0/109348/bbe81825-3feb-7ed3-0564-039861e4566b.png)

# コレの名前が分からない

legendのそれぞれの要素の背景部分は`key`で指定する。

```r
p + theme(
  panel.background = element_rect(fill = "transparent", colour = "black"),
  panel.grid = element_blank(),
  strip.background = element_blank(),
  legend.key = element_blank()
)
```

![Rplot005.png](https://qiita-image-store.s3.amazonaws.com/0/109348/e67fb4c4-b6d4-df2b-b533-2d9a366f9b4a.png)
シャットダウン時にIEを起動し、IEを終了するとシャットダウンが実行される仕組み

クラウドを使用した勤怠管理システムで、終業時の打刻漏れが多いです。
PCをシャットダウンする過程でブラウザが起動して、勤怠管理システムを表示できるような仕組みを考えましょう。
方法は２つあります。

1. シャットダウンのプロセスをPowerScriptで記述する  
fuga.ps1
<pre>
$IE = new-object -com internetexplorer.application
$IE.navigate("http://www.google.co.jp/")
$IE.visible = $true
# IEが終了するのを待つ
Wait-Process -Name iexplore | out-Null
# シャットダウン
Stop-Computer
</pre>

fuga.ps1をダブルクリックするとエディタが起動してしまいます。
PowerShellで実行させるために、以下のように細工をします。
(1) fuga.ps1 のショートカットを作成する
(2) ショートカットのプロパティを開く
(3) リンク先で、パスの先頭に powershell と明記する
(4) ショートカットアイコンが変わります。

2.ActiveDirectoryのグループポリシーで、ログオフスクリプトを定義する
hoge.ps1

<pre>
# Internet Explorerを起動する。
$ie = New-Object -ComObject InternetExplorer.Application
# Internet Explorerを表示する。
$ie.Visible = $true
# URLを指定する(サンプルとしてGoogleを使用しました)
$ie.Navigate('http://www.google.co.jp/')
# IEが終了するのを待つ
Wait-Process -Name iexplore | out-Null
</pre>
axios超簡易サンプル

#概要
[郵便番号-住所検索API](https://zipaddress.net/)を利用し、axiosを使って郵便番号から住所を検索した結果をconsole.log()出力するだけの超簡易サンプルです。

#開発環境
node.js : v6.9.1
npm : 3.10.8
webpack : 1.13.2

#ソースプログラム構成
[プロジェクトルートフォルダ]
├── dist
├── src
│    └── index.js
├── index.html
├── package.json
└── webpack.config.js

#手順概要
1. ソースコード・設定ファイル記述
+ 依存パッケージインストール（ダウンロード）
+ ビルド
+ 実行

#手順詳細
##ソースコード・設定ファイル記述
```src\index.js
import axios from 'axios';

let zipcode = '9071801';
axios.get(`https://api.zipaddress.net/?zipcode=${zipcode}`)
    .then(function (response) {
        console.log(response);
    })
    .catch(function (response) {
        console.log(response);
    });
```

```index.html
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>axios sample</title>
</head>
<body>
axios sample
<script src="dist/index.js"></script>
</body>
</html>
```

```package.json
{
  "name": "axios_sample",
  "dependencies": {
    "axios": "^0.15.3"
  },
  "devDependencies": {
    "babel-core": "^6.21.0",
    "babel-loader": "^6.2.10",
    "babel-preset-es2015": "^6.18.0"
  }
}
```

```webpack.config.js
module.exports = {
    context: __dirname + '/src',
    entry: {
        javascript: './index.js'
    },
    output: {
        path: __dirname + '/dist',
        filename: 'index.js'
    },
    resolve: {
        extensions: ['', '.js']
    },
    module: {
        loaders: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'babel',
                query: {
                    cacheDirectory: true,
                    presets: ['es2015']
                }
            }
        ]
    }
}
```

##依存パッケージインストール（ダウンロード）
下記コマンド実行。
>
cd [プロジェクトルートフォルダ]
npm install

##ビルド
下記コマンド実行。
>
cd [プロジェクトルートフォルダ]
webpack

##実行
Chrome等でindex.htmlを開いて [F12]-[Console]で検索結果が表示されます。
![axios_sample.png](https://qiita-image-store.s3.amazonaws.com/0/115750/b597f102-1f04-6c24-b2b4-b904aba3e56f.png)

#完了
以上です。
Bashディレクトリのブックマークについて

ブラウザのブックマークを整理しつつ、サイトの過去記事を見返していたら、以下の記事を見つけました。

[CIOを目指しつつの8makiのアレ](http://blog.8maki.jp/)
> **Quick Zsh Tip: ディレクトリのブックマーク**
> Y CombinatorのHacker Newsを見てたら、Bashにおけるディレクトリのブックマーク方法について書かれてました。
> これでcdの手間がすごい省ける！
> [Quick Bash Tip : Directory Bookmarks](https://www.huyng.com/posts/quick-bash-tip-directory-bookmarks)

"これでcdの手間がすごい省ける！"という言葉に惹かれました。Link先ではzsh版の修正内容が記載されておりますが、ここではBash環境での導入方法をメモとして記します。Bashユーザの間では有名だと言われている**Bashmarks**です。

# Bashmarks

[Bashmarks - directory bookmarks for the shell](https://www.huyng.com/projects/bashmarks)
[Github huyng/bashmarks](https://github.com/huyng/bashmarks)
ディレクトリをブックマークすることで、ディレクトリ間の移動が簡単・快適になります。

## 導入手順
上記ページのinstallationに従ってコマンドを打ちます。

```
$ git clone https://github.com/huyng/bashmarks
$ cd bashmarks
$ make install
$ vim .bashrc
// .bashrc or .bash_profileに"source ~/.local/bin/bashmarks.sh"を追記します
+    # Bashmarks
+    source ~/.local/bin/bashmarks.sh
$ source .bashrc
```


## 使用例
Shell Commandsを確認します。

```
$ s <bookmark_name> - Saves the current directory as "bookmark_name"
$ g <bookmark_name> - Goes (cd) to the directory associated with "bookmark_name"
$ p <bookmark_name> - Prints the directory associated with "bookmark_name"
$ d <bookmark_name> - Deletes the bookmark
$ l                 - Lists all available bookmarks
```

`s <bookmark_name>`で保存、cdしたいときは`g <bookmark_name>`で移動、
`p <bookmark_name`はpwdと一緒、`d <bookmark_name>`は保存したブックマークの削除、
`l`でブックマークのリストを表示します。

```
$ cd /var/www/
$ s webfolder
$ cd /usr/local/lib/
$ s locallib

$ l
webfolder   /var/www/
locallib    /usr/local/lib/

$ g web<tab>    // tab補完が効きます
$ g webfolder
```

リスト表示の"l"は、aliasの設定がしてあるかもしれませんので、必要に応じてコメントアウトするといいと思います。

```.bash
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
# alias l='ls -CF'
```

ブックマークしたものは、HOMEディレクトリの`.sdirs`にあります。

```vim
$ vim .sdirs
export DIR_webfolder="/var/www/"
export DIR_locallib="/usr/local/lib/"
```
thymeleaf の th:field th:each th:object のあたりのメモ

thymeleaf-spring4-2.1.5.RELEASE で

```html
<select th:field="*{income}">
  <option th:each="item : ${income_list}" th:object="${item}" th:value="*{code}">
    <span th:text="*{name}"></span>
  </option>
</select>
```

が

```
ERROR 44072 --- [nio-8091-exec-1] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8091-exec-1] Exception processing template "hoge/index": Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringOptionFieldAttrProcessor' (hoge/index)
ERROR 44072 --- [nio-8091-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringOptionFieldAttrProcessor' (hoge/index)] with root cause

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'item' available as request attribute
```

というエラーになる。前から？

```html
<select th:field="*{income}">
  <option th:each="item : ${income_list}" th:value="${item.code}">
    <span th:text="${item.name}"></span>
  </option>
</select>
```

と治したら動いた。

ちなみに、select の th:field="*{income}" を外すと動く。

メモで。
Windows10でvimのCommonLisp環境を作る

#準備
##Steel Bank Common Lispのダウンロード
以下のサイトからSteel Bank Common Lispをダウンロードします。
[SteelBankCommonLispのサイト](http://www.sbcl.org/platform-table.html)

私はSBCLはvimでしか使わないので、vimのディレクトリ$VIMの下に保存しています。またSteel Bank Common Lispというファイル名は長いので
SBCLに改名しています。

以下のような感じです。
C:\Program Files\vim74-kaoriya-win64\SBCL\1.3.12\contrib
C:\Program Files\vim74-kaoriya-win64\SBCL\1.3.12\sbcl.core
C:\Program Files\vim74-kaoriya-win64\SBCL\1.3.12\sbcl.exe

またWindowsの「環境変数→システム環境変数」に下記を追加します。
変数：SBCL_HOME
値：C:\Program Files\vim74-kaoriya-win64\SBCL\1.3.12\

##Pythonのインストール
Pythonをインストールされていない方は
下記をご参考にしてください。
[Pythonをインストールする（for Windows）](http://qiita.com/taipon_rock/items/f574dd2cddf8851fb02c)

システム環境変数のPathにPython.exeのディレクトリが含まれていることを確認してください。

#vimrcに記載する内容
まずNeoBundleを使ってkovisoft/slimvをインストールしてください。

```vim:vimrc
NeoBundle 'https://github.com/kovisoft/slimv'
```
 
NeoBundleを使ったことがない方は下記をご参考にください。
[Windows10でvimのNeoBundleを使用する](http://qiita.com/Airmk/items/78ef1041a8f2392718a6)


さらにvimrcに次のように記載ください。

```vim:vimrc
let g:slimv_swank_cmd = '!start "C:/Program Files/vim74-kaoriya-win64/SBCL/1.3.12/sbcl.exe" --load "C:/Program Files/vim74-kaoriya-win64/.vim/bundle/slimv/slime/start-swank.lisp"'
```

#test.lispで試す
次の内容を記述したtest.lispを作成してください。
保存先はどこでもよいです。

```lisp:test.lisp
(print "hello lisp")
(+ 1 10)
```
このファイルをvimで開いている状態で、
ノーマルモードにて次のように入力してください。
`,c`

うまくいけば次のようにsbcl.exeが起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/159523/2a82a38d-f1c5-c319-5748-44e7b6c9f487.png)

さらにvimの画面が次のように変わります。
![image](https://qiita-image-store.s3.amazonaws.com/0/159523/27a7eba6-16b4-2789-b4ac-8bd60478c515.png)

続けて
ノーマルモードにて次のように入力してください。
`,b`

上半分の画面に"hello lisp" と計算結果の11が出力されていれば成功です。

![image](https://qiita-image-store.s3.amazonaws.com/0/159523/fe08b38a-a284-149b-5f58-416b420be1fa.png)


#参考
下記ページを参考にさせていただきました。

[Slimv Tutorial](http://kovisoft.bitbucket.org/tutorial.html)
[ブログ 情報観測研究所](http://iolabo.blogspot.jp/2013/04/common-lisp-sbcl-windows.html)
nvidia-dockerを導入して手軽に深層学習環境を作る

Ubuntu14.04で深層学習を行うべく、NVIDIAドライバを入れたり、CUDAを入れたりとしていましたが、事あるごとにトラブルに見舞われていました。

ubuntuにてNVIDIAドライバが認識されない
http://qiita.com/moroku0519/items/234f1c53a3187e32bae5

UbuntuでNICを認識しない場合の対処法
http://qiita.com/moroku0519/items/06ac708f08d9570f2b93

最終的にCUDAがうまくインストールできなくなり、OSを再インストールしたのですが、ついでに16.04アップグレードしました。
その際、以前nvidia-docker使うといいよと教えてもらったことがあるので、試しに導入することにしました。

#Dockerとは
まず、Dockerについて整理します。
Dockerはいわゆるコンテナという軽量な仮想環境です。
仮想環境というと、VertualBoxやVMWareなどがありますが、より軽量なので起動が早いのが特徴です。
仮想環境なのでうまくいかなくなったら気軽に破棄してやり直しが効きます。
（詳しいことは割愛します）
#nvidia-dockerとは
dockerは仮想環境ですが、ゲストOSからホストOSのGPUにアクセスできるようにしてくれるのがnvidia-dockerです。
つまり、仮想環境下でGPUが利用できるので、nvidiaドライバ関係でx serverが起動しなくなってしまった！というトラブルが起きても、またイメージを引っ張ってきてやり直すことができます。（そもそもCUIなので関係ないですが）

#インストール方法
GitHubに書いてあるとおりです。
https://github.com/NVIDIA/nvidia-docker

```
# Install nvidia-docker and nvidia-docker-plugin
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc.3/nvidia-docker_1.0.0.rc.3-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
```

その後、次のコマンドで動作確認

```
Using default tag: latest
latest: Pulling from nvidia/cuda
16da43b30d89: Pull complete 
1840843dafed: Pull complete 
91246eb75b7d: Pull complete 
7faa681b41d7: Pull complete 
97b84c64d426: Pull complete 
c9e83805074f: Pull complete 
d6df64031bb5: Pull complete 
6708c6ed44a1: Pull complete 
e18866fd24c5: Pull complete 
13a64a148a09: Pull complete 
Digest: sha256:ba934c84905ac5f7f678cbe8dc359996e3897f9618028631b9da2f066da74e31
Status: Downloaded newer image for nvidia/cuda:latest
Mon Jan 16 10:22:12 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.57                 Driver Version: 367.57                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 750 Ti  Off  | 0000:01:00.0      On |                  N/A |
| 30%   25C    P8     1W /  38W |    287MiB /  1997MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

```

~~なお、ホスト側にはNVIDIAドライバとCUDAを予めインストールしておく必要があります。~~

※訂正（2016/01/19）
入れておくのはドライバとDockerのみで，CUDAはコンテナで管理します．（コンテナごとにCUDAやcuDNNのバージョンを管理できるのが売りなのにホストにCUDAが入っている前提なのはおかしいですね，普通に考えて）
ちなみにNVIDIAドライバだけは仕様なのでホストに入れなければいけません．

以上です。

#参考

https://github.com/NVIDIA/nvidia-docker
http://blog.engineer.adways.net/entry/2016/09/03/012940
Watson STT でカスタマイズ辞書(1)



カスタマイズの一覧をリスト

java-sdk-3.5.3-jar-with-dependencies.jar を利用。

```java

package stt;

import java.util.List;

import com.ibm.watson.developer_cloud.http.ServiceCall;
import com.ibm.watson.developer_cloud.speech_to_text.v1.SpeechToText;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.Customization;

public class Customize01ListMain {

	public static void main(String[] args) throws Exception {

		String username = "username";
		String password = "password";

		SpeechToText service = new SpeechToText();
		service.setUsernameAndPassword(username, password);

		ServiceCall<List<Customization>> o = service.getCustomizations("ja-JP");

		List<Customization> list = o.execute();
		for (Customization c : list) {
			System.err.println(c.getId());
		}

	}

}

```