OmniAICreator/Qiita-1.07M huggingface dataset:
iOS + Heroku(Rails / Grape)でシンプルにApi連携


## 前提条件

- ローカルでRailsプロジェクトが動く
- HerokuにRailsプロジェクトがアップ済


## Heroku側

Gemfileに追記：

```ruby:Gemfile
# API
gem 'grape'
```

gemインストール：

```shell:
$ bundle install
```

{プロジェクト名}/app/直下にapiフォルダを作成する。

apiフォルダのファイルを参照するようapplication.rbに記述：

```ruby:application.rb
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
```

ルート設定：

```ruby:routes.rb
mount API_v1::API => '/'
```

{プロジェクト名}/app/api/に以下のファイルを用意：

```ruby:api_v1.rb
module API_v1
  class API < Grape::API
    version 'v1', using: :path
    format :json
    prefix :api

    # responses
    SUCCESS = 0
    FAILURE = 400
 
    helpers do
      def response(ret, obj=nil)
        if obj.nil?
          return {ret: ret}
        else
          return {ret: ret, obj: obj}
        end
      end
    end

    resource :test do
      get :rettest do
        response(SUCCESS, {foo: "bar"})
      end
    end
  end
end
```

以上の内容でHerokuへpush、ページを開く：

```shell:
$ git add -A
$ git commit -m "Grape実装"
$ git push heroku master
$ heroku open
```

heroku openのURLに「/api/v1/test/rettest」を追加して叩く：

```
$ curl {HeokuのアプリURL}/api/v1/test/rettest
{"ret":0,"obj":{"foo":"bar"}}
```

JSON返ってきてるのでHeroku側はOK。


## iOS側

さくっとAFNetworkingで実装する。
今回はPPNetworkManagerというファイルを用意、以下記述した：

```ObjC:PPNetworkManager.h
@interface PPNetworkManager : NSObject

+ (instancetype)sharedManager;
- (void)responseTest;

@end
```


```ObjC:PPNetworkManager.m
#import "PPNetworkManager.h"
#import "AFNetworking.h"

@implementation PPNetworkManager

static PPNetworkManager *sharedManager = nil;
+ (instancetype)sharedManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[PPNetworkManager alloc] init];
    });
    return sharedManager;
}

- (void)responseTest
{
    AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
    
    // URL変更予定
    [manager GET:@"{HeokuのアプリURL}/api/v1/test/rettest"
      parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@"response: %@", responseObject);
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"Error: %@", error);
      }];
}

@end
```

あとはViewControllerなりAppDelegateなりで呼び出し：

```ObjC:
#import "PPNetworkManager.h"

// -- 中略 -- 

[[PPNetworkManager sharedManager] responseTest];
```
BetterTouch ToolのWindow Resize & Movieがよかった

Mac使っている人は殆どの人が使ってるtoolだと思う。


http://macwin.org/mac/bettertouchtool/

この辺に一通りの説明は書いてあるんだけど、

Windowを左側半分や右側半分にリサイズしたり、別モニタに移動させたり出来るの知らなかった。
しかもショートカットキーでそれが設定できる。


![超便利！「BetterTouchTool」を使いたおすための7つの設定。_Mac____MacWin_Ver_1_0.jpg](https://qiita-image-store.s3.amazonaws.com/0/6878/ea2a0371-a662-a220-6ada-3a12c6bbc3bc.jpeg)


どういう時に便利かというと、

- ブラウザとiterm2を左右に並べてちょっと写経したいという時
- ディスプレイを２つ使ってる時に、移動させる時

いちいちTrackpadでドラッグ＆ドロップする必要がないから楽。


vimっぽく、`control + shift + h`で左側半分に寄せるとかしてショートカットを割り当てています。
こういう時どういう割り当てにするのが、
他のアプリと被らずに、なおかつ押しやすいやつになるんだろうかー。
私がQiitaを使わなくなった理由

Qiitaは、利用者の良識と善意があれば、素晴らしいサービスである。しかし、今、その前提にある「利用者の良識と善意」が危機的な状況にある。

Qiitaの記事の一つのステータスとして「ストック数」がある。その名前の通り、「あとで読む/使う」「ためになりそう」といった感覚で押せば、ユーザーのストックのリストに追加されるという仕組みだ。まったく同じ感覚で、はてなブックマークやTwitterでリンクを共有する人も多い。しかし、これは一つの問題を孕んでいる。

人々が「あとで読む/使う」「ためになりそう」と判断するのは、記事の__印象__であり、__内容__ではない。したがって、たとえ用語をでたらめに使っていたとしても、好奇心を煽ってさえいれば共有され、__評価のバブル__が生まれるのだ。

もちろん、知的好奇心は尊ぶべきものであり、それを侵害するようなことがあってはならない。ところが、無意味に長いでたらめな文章を餌に、人々を釣る悪質な存在がいる。多くの読者は、それが誰であるかはご存じだろう。

不適切であっても、不当に高い評価を得た記事は、Googleの検索でも上位になりがちである。また、SNSでも、連鎖的に「この記事は参考になる」と評価が広まったり、あるいは「この分野はおかしい人が多い」といった評価が生まれたりしているのが現状だ。結果として、執筆者とその分野の人々の間で不毛な争いが発生している。

Twitter、はてなブックマーク、ストック数に共通する、「あとで読む/使う」「ためになりそう」という評価方法は原因の一つとなりうる。「読んだ」「有用だった」という評価基準ならば、評価のバブルをいくらか解消できるだろう。私はストック数のようなむなしい基準を好まないため、基本的にQiitaを技術情報の共有には使わなくなった。

Qiitaは技術とは関係ない記事を排除する方針のようだが(https://twitter.com/camloeba/status/558669170225590272, https://twitter.com/yuku_t/status/558670957011664897 )、もはやQiitaは独裁的な方法が通用するほど規模は小さくないのではないだろうか。このような姑息(誤用ではない)な方法では何の問題も解決できないだろう。運営のこの対応には心底銷魂した。

この記事はどのようにしてもかまわない。事実とともに何らかの形で共有すればいいのだから。

最後に、有名なセリフを引用して記事を締めくくろう。

> 「ブッ殺す」…そんな言葉は使う必要がねーんだ
> なぜなら、オレや、オレたちの仲間は
> その言葉を頭の中に思い浮かべた時には！
> 実際に相手を殺っちまって_もうすでに_終わってるからだッ！
> だから使った事がねェーッ

> ペッシ、オマエも_そうなるよな_ァ～～～ オレたちの仲間なら…
> わかるか？オレの言ってる事…え？

> 『ブッ殺した』なら、使ってもいいッ！

ここからが本題で、最近私はHaskellで[拡張可能レコードとバリアントを実装するためのライブラリ](https://github.com/fumieval/extensible)を開発しています。こんな感じでレコードを表現できます。

```hs
{-# LANGUAGE TemplateHaskell, DataKinds, TypeOperators, KindSignatures, TypeFamilies, FlexibleContexts #-}
import Data.Extensible.Record

mkField "foo" [t|String|]
mkField "bar" [t|String|]
mkField "baz" [t|Int|]

hoge = foo @= "lorem"
   <: bar @= "ipsum"
   <: baz @= 42
   <: Nil
```

興味がある方はぜひ試してみてください。コントリビューションやバグ報告も歓迎です。

レコードの実装については、[ぼくのかんがえた最強の拡張可能レコード](http://fumieval.hatenablog.com/entry/2015/01/21/175227)で解説しています。近々、対数時間で検索できる、要素の型が異なるコレクションの仕組みについても執筆する予定です。
圏論の考え方でつくられていない、JavaScriptで動作する spinoza (スピノザ) - (4)

[前回](http://qiita.com/sct/items/ef9802cab9f98f3b99bc)までは[関数、値、圏論、モナド、評価戦略、純粋関数型、その辺りの「数学的基礎」を教える](http://qiita.com/kenokabe/items/3e167c6742f14af7756d)というエントリについて議論を進めてきました。今回はこのシリーズのタイトルのインスパイア元である、[圏論の考え方でつくられた、JavaScriptで動作する純粋関数型プログラミング言語 spinoza (スピノザ)](http://qiita.com/kenokabe/items/98f4efac4029f0b2b419) の圏論について書かれた部分の内容について検証していきます。

> 圏論とは、
> 【数】というものの代数的構造を論じるための数学理論です。

誤りです。圏論について説明するときに【数】を強調するのは適切ではありません。

> 【数】＝【数への操作】
>
> と、無限に自己参照する再帰構造になっている「何か」であり、
> こういう代数構造を論じるのが「圏論」なのです。

誤りです。

> 【数】が【数への操作】とまったく区別がつかない「何か」であることを論じる
> 「圏論」

誤りです。

> 圏論において、
> 【集合】
> と
> 【写像】
> というのが、同じものなんだから

誤りです。そのような事実はありません。

> より抽象化した言葉遣いで、それぞれ
> 
> 【対象(object)】
> と
> 【射(arrow)】
> 
> と呼ぶ

正しい呼び方です。また、対象が集合とは限らないことも筆者は理解していると想像できます。

> 【対象(object)】のオブジェクト、
> ファーストクラス・オブジェクトとしての【関数】として考えられます。
> ここでは、オブジェクト指向のオブジェクトではありません。

「ファーストクラス・オブジェクト」の「オブジェクト」は「オブジェクト指向のオブジェクト」ですので、誤りです。「ファーストクラス・オブジェクト」の「オブジェクト」と圏論の対象(object)は別の言葉です。

## ここまでの訳注

このシリーズのほかのエントリと同様に、圏論について書かれていない部分については言及していません。

圏論の考え方でつくられたプログラミング言語には、[萩野先生が論文にまとめたCPLの実装](https://github.com/msakai/cpl)がgithubに上がっています。論文のリンクは切れていますが、ネット上のどこからかは入手可能ではないかと思います。詳細は読んでいませんが、意味論を圏論で作って簡約も圏論の枠組の規則で行うって話じゃないかと予想しています。その辺りの真偽は各自で確認してみてください。

ということで、このシリーズはこれでおしまいです。
berks install 先のディレクトリを指定する

問題: berkshelf 3 の話。berks vendor には PATH 引数があるのに、berks install にはオプションがない。`~/.berkshelf/cookbooks` 固定になってしまう。パスを指定したい。

## rake install (berks install)

`berks install` 先のディレクトリを指定するには Rakefile に以下のようなタスクを記述するとできる。`rake install` で `vendor/cookbooks` にインストールできる。

```rb
# berks install to vendor/cookbooks
desc "berks install (download cookbooks)"
task :install do
  require 'berkshelf'
  puts 'berks install to vendor/cookbooks'
  Berkshelf.ui.mute do
    ENV['BERKSHELF_PATH'] = 'vendor'
    Berkshelf::Berksfile.from_file('Berksfile').install
  end
end
```

## rake vendor (berks vendor)

ついでに `berks vendor` の vendor 先を `vendor/cookbooks` に変更した `rake vendor` タスクも書いてみると以下のようになる。

ちなみに berks vendor では、berks install と異なり、Berksfile でローカルパス指定したクックブックや、自分自身でさえも vendor/cookbooks にコピーされる。

```rb
desc "berks vendor (sync all cookbooks of even local paths and self)"
task :vendor do
  require 'berkshelf'
  puts 'berks vendor to vendor/cookbooks'
  Berkshelf.ui.mute do
    berksfile = Berkshelf::Berksfile.from_file('Berksfile')
    berksfile.vendor('vendor/cookbooks')
  end
end
```

## まとめ

最終的な Rakefile は次のようになった

```ruby:Rakefile
# berks install to vendor/cookbooks
desc "berks install (download cookbooks)"
task :install do
  require 'berkshelf'
  puts 'berks install to vendor/cookbooks'
  Berkshelf.ui.mute do
    ENV['BERKSHELF_PATH'] = 'vendor'
    Berkshelf::Berksfile.from_file('Berksfile').install
  end
end

# berks vendor to vendor/cookbooks
desc "berks vendor (sync all cookbooks of even local paths and self)"
task :vendor do
  require 'berkshelf'
  puts 'berks vendor to vendor/cookbooks'
  Berkshelf.ui.mute do
    berksfile = Berkshelf::Berksfile.from_file('Berksfile')
    berksfile.vendor('vendor/cookbooks')
  end
end

task :clean do
  FileUtils.rm_rf('vendor/cookbooks') if File.exist?('vendor/cookbooks')
end
```

chef から vendor/cookbooks を参照するには、cookbook_path を設定すればよい。ツールによって指定方法が違う(chef-solo なら solo.rb だし、chefspec なら spec_helper.rb) のでここでは省略する。
Pythonでvim pluginを書く

# やりたいこと

- vimのプラグイン作りたい

- でもvimscriptわからん！！

- Pythonで書きたい！！！！

# つくるもの

- `MyNameIs <name>` と入力すると、`Hello <name>`と表示される

- 実装はpythonに逃がして、vimscriptはpythonラッパーのような形で使う

# VimScriptでのPython

よく使うのは、`python` と `pyfile`

pythonとpyfileは本質的には同じで、ソースが直書きされているかファイルに分離されているかの違い。たとえば、次の２つのコードは同じ

python:

```vim
python print('Hello')
```

pyfile

```vim
pyfile hello.py
```

```py:hello.py
print('Hello')
```

pythonと書いたらその行は既にPythonの世界であることに注意する。次のように書いて随分と悩んだ。

```vim
function! hello#hello(name)
  python hello_hello(a:name)
endfuncion
```

これが間違いであることは、次のように書き換えてみるとわかりやすい

```vim
function! hello#hello(name)
  python << endpython
hello(a:name)
endpython
endfuncion
```

また、`pydo` ものもある。`pydo <body>`と書くと、

```py
def _vim_pydo(line, linenr):
  <body>
```

という関数が作られ、選択範囲に対して１行ごとに、lineに行の内容が、linenrに行番号が渡されて呼び出される。値を返すとその値で行が置換されるが、関数なので当然returnと書かなければいけない。なのでちょっと長くなってダサい。こういうのはrubyのほうが綺麗に書けそう。

例えば、下のコードを実行すれば選択範囲の行頭に行番号が挿入される

```vim
pydo return str(linenr) + line 
```

# 実装

# ディレクトリ構成

```
plugin/
  hello.vim
autoload/
  hello.vim
src/
  hello.py
```

# hello.py

vimとか気にせずに、関数を作る。

1/25 追記:
名前が衝突する可能性について@thnkaさんにご指摘いただきました。グローバル空間を汚染するため、プレフィックスをつけたりクラスの中に入れたりする必要があります。

```py:src/hello.py
def hello_hello(name):
  print('Hello {0}'.format(name))
```

# autoload/hello.vim

ここが肝

やることは3つ。

1. 作ったpythonスクリプトを読み込む。
1. pythonないでvimをインポートする
1. pluginから呼び出される関数を作り、関数内でpythonの関数を叩く

まず、作ったpythonスクリプトを読み込む。スクリプトのパスの取得方法に注意。

```vim:autoload/hello.vim
pyfile <sfile>:h:h/src/hello.py
```

次に、vimをインポートする。これをやらないと値のやり取りができない。

```vim:autoload/hello.vim
python import vim
```

最後に、plugin側から呼び出される関数を作り、関数内でpythonの関数を叩く。pythonと欠いた行は既にpythonの世界なので、vimモジュールを通して引数を渡す。

```vim:autoload/hello.vim
function! hello#hello(name)
  python hello(vim.eval('a:name'))
endfunction
```

## plugin/hello.vim

ここは普通のプラグインとなにも変わらず。autoloadに記述した関数と、コマンドの橋渡し

```vim:plugin/hello.vim
command! -nargs=1 MyNameIs call hello#hello(<f-args>)
```

## 完成形

```py:src/hello.py
def hello_hello(name):
  print('Hello {0}'.format(name))
```

```vim:autoload/hello.vim
let s:save_cpo = &cpo
set cpo&vim

pyfile <sfile>:h:h/src/hello.py
python import vim

function! hello#hello(name)
  python hello_hello(vim.eval('a:name'))
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo
```

```vim:plugin/hello.vim
if exists("g:loaded_hello")
  finish
endif
let g:loaded_hello = 1

let s:save_cpo = &cpo
set cpo&vim

command! -nargs=1 MyNameIs call hello#hello(<f-args>)

let &cpo = s:save_cpo
unlet s:save_cpo
```

# 参考

- [Vim documentation: if_pyth](http://vim-jp.org/vimdoc-ja/if_pyth.html)

- [Vimプラグインが出来るまで - ぼっち勉強会](http://kannokanno.hatenablog.com/entry/20120403/1333462565)

# その他

実際に作ったのは[httpstatus.vim](https://github.com/zakuro9715/httpstatus.vim)というプラグイン。VimからHTTPステータスコードがどんな意味だったか確認できる。テキストはPythonの`BaseHTTPServer.BaseHTTPRequestHandler.responses`を使用している。

意気揚々と作ってしまったが、どうやら[mattnさんが既に作っていたらしい](http://mattn.kaoriya.net/software/vim/20130221123856.htm)。さらに、今回作ったものよりも高機能っぽい(ステータスコードだけじゃなくてメッセージでも調べられる)けど、どうせ私はステータスコードからしか調べないので十分なのでした。
プログラマになること#12 「食」を軽んじてはいけない２


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#学習能力
基本的に「脳」がうまく働いていないと、「学習」そのものが継続しません。
「脳が」働くには、色んな物質が必要です。
要約すると「正しい食べ物」をバランス良く食べること。とても大事なことです。

#現場で良く見るもの
ここでは、現場で良くみるものを列挙していきます。

##Red Bull
少々ましなだけです。
元気でるように感じるのは、エネルギー、カフェインのおかげ。
![スクリーンショット 2015-01-24 11.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/33317/49317c85-5d16-629d-a879-5af20dd551b2.png "スクリーンショット 2015-01-24 11.51.47.png")

##お菓子
![スクリーンショット 2015-01-24 11.42.51.png](https://qiita-image-store.s3.amazonaws.com/0/33317/9ef9b8f0-d678-8f54-49b0-1bdd0a927c26.png "スクリーンショット 2015-01-24 11.42.51.png")

##組成
お菓子としては、意外にまともです。
![スクリーンショット 2015-01-24 11.42.06.png](https://qiita-image-store.s3.amazonaws.com/0/33317/c5501a02-875d-ec72-9d99-cc81f39166dd.png "スクリーンショット 2015-01-24 11.42.06.png")

#やってはいけないこと
確かに、長時間作業で「脳」が疲れると糖分が欲しくなります。
お菓子ポリポリ、コーラごくごく、エナジードリンクで頑張る。
更にストレス解消で飲酒。習慣化すると、確実に頭悪くなります。
そして、肥満。
scalaz - Liskov

## Liskov

リスコフの置換原則を表したものだ。scalaの `<:<` もそうだが、これの強化版が `<~<` だ。

使う前にまず確認用の型を定義してみよう。

```scala
trait Space
trait Earth extends Space
trait Japan extends Earth
trait Tokyo extends Japan
```

### 早速つかってみよう。

```scala
implicitly[Earth <~< Space]
```

Earth(地球)は、Space(宇宙)からの派生物だ。

もちろん逆にするとエラーになる。

```scala
implicitly[Space <~< Earth]
```

`<:<`も関数になるが、`<~<`も同じだ。

```scala
implicitly[Earth <:< Space] apply (new Earth{})
// Space
implicitly[Earth <~< Space] apply (new Earth{})
// Space
```

ここまではscalaの`<:<`と同じで`<:<`にはこれ以上の機能はない。

### 合成してみよう。

```scala
implicitly[Earth <~< Space] compose implicitly[Japan <~< Earth]
// Liskov[Japan,Space]
```

JapanはSpaceからの派生物に合成できた。もちろんEarthでもある。

composeは`Liskov.trans`を使っている。

transはtransitiveで推移律の意味だ。たしかにそうなっている。

ちなみに`<~<`の逆で`>~>`もある。

```scala
implicitly[Space >~> Earth] compose implicitly[Earth >~> Japan]
```

こっちのほうがA=>Cになっているのがよく分かる。

### lift

liftすることもできる。

試しに平行世界へliftしてみよう。

```scala
Liskov.co[ParSeq, Earth, Space](implicitly[Earth <~< Space])
// Liskov[ParSeq[Earth], ParSeq[Space]]
```

これがパラレルワールドかっ。

とにかくliftできた。`Liskov.co` のcoは、covariant(共変)のことだ。

Liskov.contra(反変)もある。

型を2つとる型もいけるみたいだ。

```scala
def co2[T[+_, _], Z, A, B](a: A <~< Z): T[A, B] <~< T[Z, B]
```

1つ目の型のみ共変だ。なので1つ目の型だけ変えられるようだ。

```scala
Liskov.co2[Either, Space, Earth, String](implicitly[Earth <~< Space])
// Liskov[Either[Earth,String],Either[Space,String]]
```

1つ目の型は固定で、2つ目はA(Japan) <~< Z(Space)

今のは1つめの型が共変だったが2つ目の型が共変であるというのもある。

`Liskov.co2_2` だ。

```scala
def co2_2[T[_, +_], Z, A, B](a: B <~< Z): T[A, B] <~< T[A, Z]
```

今度はA固定で、BはZの派生物である必要があるようだ。

2つ目の型が共変といえばMapだ。

```scala
Liskov.co2_2[Map, Space, String, Earth](implicitly[Earth <~< Space])
// Liskov[Map[String,Earth],Map[String,Space]]
```

keyは固定で、valueが`B(Earth) <~< Z(Space)`と。

co3, co4まであるようだ。

### lift2

lift2をみてみよう。型を2つとる型を合成する関数のようだ。

```scala
def lift2[T[+_, +_], A, A2, B, B2](
  a: A <~< A2,
  b: B <~< B2
): (T[A, B] <~< T[A2, B2])}
```

AとBは、A2とB2の派生物である必要があるようだ。

```scala
Liskov.lift2[Either, Earth, Space, Tokyo, Japan](implicitly[Earth <~< Space], implicitly[Tokyo <~< Japan])
// Liskov[Either[Earth,Tokyo],Either[Space,Japan]]
```

うまく合成できている。

型を3つとるlift3, lift4まである。

### liftF1

Function1のように、反変と共変の2つをとるものもliftできる関数があった。

```scala
def liftF1[F[-_, +_], A, A2, R, R2](
  a: A <~< A2,
  r: R <~< R2
): (F[A2, R] <~< F[A, R2])
```

なのでFunction1で合成してみる。

```scala
Liskov.liftF1[Function1, Earth, Space, Tokyo, Japan](implicitly[Earth <~< Space], implicitly[Tokyo <~< Japan])
// Liskov[Space => Tokyo,Earth => Japan]
```

おお。これはおもしろい。

これもliftF4まであるようだ。

### unlift

unliftのようなことする関数があった。

```scala
def unco[F[_] : Injective, Z, A](
  a: F[A] <~< F[Z]
): (A <~< Z) = force[A, Z]
```

```scala
Liskov.unco[Option, Space, Earth](implicitly[Option[Earth] <~< Option[Space]])
// Liskov[Earth,Space]
```

今日はここまで。

次回はLeibnizをみてみることにしよう。
完璧なプルリクエストの書き方("How to write the perfect pull request" by  Keavy McMinn@GitHub)

GitHub に勤める Keavy McMinn さんのブログの記事「[How to write the perfect pull request](https://github.com/blog/1943-how-to-write-the-perfect-pull-request)」の紹介を見たのですが、これは良いなぁと感じたので、翻訳してみました。

間違いもあると思いますので、ご指摘いただけると嬉しいです。

----


完璧なプルリクエストの書き方
===========
会社が大きくなるにつれて、社員とプロジェクトは変わっていきます。我々は、GitHubに必要な文化を保ち続けるためには、コミュニケーションする際に、その目的を自覚することが大切であるということを発見しました。そこで、プルリクエストでの共同作業において、自分達が最高の自分達でいられるように、近年、次のガイドラインを導入しています。

プルリクエストを書く際の手引
--------

* プルリクエストの目的を書きましょう。例えば：

```
～を調査する技術検証
～の表示の簡素化
～の取り回しの修正
```
* なぜ現在の仕事をしているのかという概要が書かれてるか確認しましょう（参考リンク付きで）；今までの経緯が周知されていることを仮定してはいけません。
* 全社員がプルリクエストを見れることを覚えておきましょう。内容や雰囲気は、現在、参加していない人にも有益です。
* もしあるなら、欲しいフィードバックを明確に書きましょう：コードに:eyes:を通してほしい。技術アプローチの議論をしたい。設計についての批評が欲しい。草稿のレビュー。
* もし、出したプルリクエストが途中の段階なら、_いつ_フィードバックが欲しいか伝えましょう。タイトルに「[WIP]」の接頭辞を付けるのは、その事を示すための、単純で一般的なパターンです。(訳注：Work In Progressの略で、意味は仕掛品)
* 議論してほしい人を指定するには、個人に対する**@mention**をして、後ろに論点を書きます。(「/cc **@jesseplusplus** このロジックを明確にしたいのですが」)
* 議論したいチームへの **@mention** も、後ろに論点を記述します。(「/cc @github/security, このアプローチに懸念点はある?」)

フィードバックの提供
--------

* 課題の背景や制約と、このプルリクエストが投げられた理由を熟知しましょう。
* 明らかに納得できない際は、答える前に数分間は熟考しましょう; 口に出す前によく考える。
* 一方的に話すのではなく尋ねましょう。（「...をするな」よりも「...してみてはどうですか？」）
* なぜ、コードを変更する必要があるか理由を説明しましょう。（[スタイルガイド](https://github.com/styleguide "スタイルガイド")に沿っていないのではないですか？個人的な好みでしょうか？）
* コードの単純化や改善する方法を提供しましょう。
* 他の人の仕事を引用する際は、「愚か」などの軽蔑的な用語を使用しない。
* 謙虚であれ。（「確信はないのですが、...を試してみてください」）
* 誇張を避けてください。 （「死しても...するな」）
* グループでの評論を通して、専門的なスキル、集合知と製品品質を養うことを目指しましょう。
* オンラインでのコミュニケーションではネガティブなバイアスに注意してください。（内容が中立なときに、私たちはネガティブな雰囲気を仮定します。）中立的ではなく、ポジティブな言葉を使ってみませんか？
* 雰囲気を明確にするために絵文字を使用してください。「:sparkles: :sparkles:よさそう :+1: :sparkles: :sparkles:」 と 「よさそう」を見比べてみてください。

フィードバックへの対応
--------

* 感謝の気持ちを表しながら進行しましょう。特にフィードバックが白熱したときには重要です。
* 明確にすることを求めましょう。 （「理解できていないので、もう少し説明してもらえませんか？」）
* 明確にするよう求められたら、問題の解決策にたどり着くまでにあなたが行った判断の説明をしましょう。
* すべてのコメントに反応してみてください。
* 元のコミットやプルリクエストへのリンクを付けてください。(「やったぜ! 1682851 が完了」)
* 炎上している時は、コメントのやり取りを続けるのがコミュニケーションの形として現時点で適切か考えてみてください。（仮想的にでも）フェイス·トゥ·フェイスで話してみて、その後にオフラインでの議論を要約するフォローアップを相互に投稿することを検討してください。（投稿は、後で読む人たちに有益です）

これらのガイドラインの一部は、Thoughtbotの[コードレビューガイド](https://github.com/thoughtbot/guides/tree/master/code-review "コードレビューガイド")に触発されています。

私たちのガイドラインは、自分たちの仕事のやり方や育成したい文化に適応させています。皆様のお役に立てれば幸いです。

ハッピーコミュニケーション！

オリジナル
----
"How to write the perfect pull request", Keavy McMinn, January 22, 2015. https://github.com/blog/1943-how-to-write-the-perfect-pull-request
圏論の考え方でつくられていない、JavaScriptで動作する spinoza (スピノザ) - (3)

[前回](http://qiita.com/sct/items/44ed6fedb3c315e80705)に続き、[関数、値、圏論、モナド、評価戦略、純粋関数型、その辺りの「数学的基礎」を教える](http://qiita.com/kenokabe/items/3e167c6742f14af7756d)の圏論について言及している部分について、内容を検証していきます。

> 「数」というものは、
> 数と論理操作が、まったく同一である、ということ、
> 「数」そのものが無限に自分を参照して自分自身となっている構造、
> 無限自己参照構造体とも表現できる「何か」です。

誤りです。圏論で扱うトピックではありません。

> この非常に精緻な構造をガチで語ろうとするのが圏論なんですね。
> まあだから、圏論の圏の定義とかどうでも良いです。

誤りです。むしろ圏論から定義をとると何も残りません。

> 今わたしがこうやって話したことを
> 難しい言葉で表現すると、
> ..以下略..

wikipediaの引用ですが、正しい内容です。

> 「数」というものは、
> 数と論理操作が、まったく同一である、
> 操作と数、数と操作の区別が一切ないっていう構造、
> 「数」そのものが無限に自分を参照して自分自身となっている構造、
> 無限自己参照構造体とも表現できる「何か」です。

誤りです。圏論で扱うトピックではありません。

> 数っていうのが何か？っていう本質的議論こそが「圏論」です。

誤りです。圏論で扱うトピックではありません。

> って、数の本質を語ること＝圏論を語ることと同値なんです。

誤りです。

> 数と操作の区別なんてない、同じものだ、
> それを論じるのが圏論で、

誤りです。

> プログラミングの「ことば」、論理的にはまったく同じものを
> 勝手に違う言葉でいってるだけなんですが、言い換えると、
> 
> 値と関数の区別なんてない、同じものだ、
> 
> ってことになります。

誤りです。圏論の適用による結果ではありません。

> 関数型プログラミングの根本である「集合写像」の数学概念が、
> そのままコンピュータによる計算という「物質化」にそのまま当てはめることが不可能であるから、
> より「集合写像」をより抽象化した「圏論」をもってその
> 「計算」＝「物質化」を扱う必要があるということですね。

抽象化した、という記述は正しい内容です。圏論を利用する動機については誤りです。

> を完全に論理的対象として扱えるようにした解決策としての「圏論」の具現化するならば、
> 実装は遅延評価でなければいけないし、遅延評価と不可分です。

誤りです。「a program is NOT a mapping」の解決策がモナドです。また、遅延評価にする必要はありませんし、圏論とは無関係です。

> この圏論の導入は、
> コンピュータのプログラミングが、
> 真に数学的と一致するような目的、
> 真に宣言的に記述できるようにするために導入されたのであり、
> 圏論を導入したコードというのであれば、宣言的にかけてアタリマエなんです。

誤りです。これは圏論ではなく、モナドを意味論に採用する理由です。

> 先行評価なら無限なんて宣言的に書けないんだから、そんなもんは圏論の実装ではない、ってことだし、

誤りです。遅延評価と圏論は無関係です。

> 純粋関数型を圏論が数学的基礎にあると語りながら、

純粋関数型と圏論は無関係です。Haskellが圏論の概念を多用しているだけに過ぎません。

> これは、まさに圏論のことに他なりませんから、

遅延評価と圏論に関連はないため、誤りです。

> IOモナドの理論的背景は圏論だ、ってことになります。

moggiの論文を元に実装されたものですから、正しい表明です。

## ここまでの訳注

論理に対する記述は、圏論と直接関係があるわけではないので言及を避けています。

著者が頻繁に主張している「関数とは値」は、型無しラムダ計算のことを指していると考えられます。圏論の文脈ではCCCに $X \simeq X^X$ の同型を入れて作れますが、少なくともHaskellの理論的背景になっていません。

[次回](http://qiita.com/sct/items/baf9e80e70c28b51185b)以降に続きます。
Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料

by @mixiappwchr
![スクリーンショット 2015-01-24 22.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/37731/056174ca-bc5a-4d87-3da9-1fd080277905.png)

swiftがでてしばらく経ち、実際の現場でswiftを使うかどうか検討されているところもおおいでしょう。

まだ出たばかりなので、本当に現場でつかっても大丈夫かどうか悩んでいる人もいるかもしれませんので、実際に現場で直面したはまりどころを共有したいと思います。


# ビルドが遅い
ビルドに関してはSwiftだと遅くなりました。Androidに比べてビルドが早い点が良かったんですが今後に期待。これをダシに新しいMacを買おうと思います！


# リファクタリングができない
![スクリーンショット 2015-01-24 22.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/37731/056174ca-bc5a-4d87-3da9-1fd080277905.png)

これは地味にきついです。クラス名をやっぱりこっちにしたい！とかアプリを作り始めとかちょいちょいあるのですが、いちいち手で治すという。。
プロジェクトが長期化したら目に見えて厳しいので早めに対応していただきたいところ。


# Swift CompilerのOptimize のbug
これは結構こわいです。
実装終わって申請したらreleaseビルドだけ謎のエラーでrejectとかあり得えます。

自分が当たったのはrequestのコールバックが全く別のクラスに書かれているコールバックをよんでくれるという考えられないbugでした。

他にもいろいろ挙動がおかしくなる点がありそうなので、一旦optimizeなしにしていますが、、
* http://nafuruby.hatenablog.com/entry/2014/12/20/235224

# 追記
無事にこのバグでクラッシュがおこりAppleからRejectされました。。。


# 終わりに
その他定常的にSourceKitServiceのクラッシュのポップアップが出まくったり、IDEが認識しなくなったり(Objective-Cでもあるけど）などなど挙げればきりがありませんが、
言語仕様的にはとても良いので使いたいのですが、個人的にはまだ様子見で、現場では使わずに個人開発アプリでいろいろ地雷を踏んでいくのがいいかなーと感じました。
swiftで書くこと自体はとても楽しいです！
またみなさんも実際に直面したバグを共有していくと幸せになりそうですね。

##### appwchr post
----

[まだTestFlight使ってたの？急げ！終了目前のTestFlightから,今すぐにiOSもDeployGateに移行しよう！移行パターンも紹介するよ。](http://qiita.com/appwatcher/items/632460e15fbdb81b7a71)

[Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料](http://qiita.com/appwatcher/items/50295e82ab0095902aaa)

[iOSの開発をする上で絶対に使うべき！外せない！webサービス、開発ツール集【完全版】](http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ！作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ！]
(http://qiita.com/appwatcher/items/b02255026a3ee6d95142)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)
VirtualGuest.frontendRoutersはリストを返さない

なんで```VirtualGuest.frontRouters```だけリストで返してくれないのですか。ベアメタルは返してくれるのに(泣)
仮想サーバーとベアメタルを一覧するときちょっと面倒じゃないの。

```text:実行結果
vgs.frontendRouters : {'hostname': 'fcr01a.sng01'}
vgs.backendRouters : [{'hostname': 'bcr01a.sng01'}, {'hostname': 'bcr01b.sng01'}]
hws.frontendRouters : [{'hostname': 'fcr01a.hkg02'}, {'hostname': 'fcr01b.hkg02'}]
hws.backendRouters : [{'hostname': 'bcr01a.hkg02'}, {'hostname': 'bcr01b.hkg02'}]
```

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import SoftLayer
import sluser

SL_USERNAME = sluser.SL_USERNAME
SL_API_KEY = sluser.SL_API_KEY

client = SoftLayer.Client(username=SL_USERNAME, api_key=SL_API_KEY)
vgs = client['Account'].getVirtualGuests(mask='hostname, frontendRouters.hostname, backendRouters.hostname')
hws = client['Account'].getHardware(mask='hostname, frontendRouters.hostname, backendRouters.hostname')

print("vgs.frontendRouters : %s" % vgs[0]['frontendRouters'])
print("vgs.backendRouters : %s" % vgs[0]['backendRouters'])
print("hws.frontendRouters : %s" % hws[0]['frontendRouters'])
print("hws.backendRouters : %s" % hws[0]['backendRouters'])

exit()
```
圏論の考え方でつくられていない、JavaScriptで動作する spinoza (スピノザ) - (2)

[前回](http://qiita.com/sct/items/2935b6614a98212609c4)に続き、[関数、値、圏論、モナド、評価戦略、純粋関数型、その辺りの「数学的基礎」を教える](http://qiita.com/kenokabe/items/3e167c6742f14af7756d)の圏論に関する部分の記述に対し、検証していきます。

> 数、あるいは数のまとまり集合のことをもうちょっと抽象化して、
> 対象（objects）
> として捉えることにします。

> 論理操作、写像のことをもうちょっと抽象化して、
> 射（morphisms）
> として捉えることにします。

この記述のコンテキストから判断すれば、正しいと言えるでしょう。

> ところが、
> この数と論理操作が、相互にコロコロと入れ替わるんですね。
> だって同じものだから。

このような事実はありません。誤りです。

> 対象（objects）
> と
> 射（morphisms）
> というのは絶対的な区別もありません。

誤りです。明確に区別されます。

> 対象（objects）
> と
> 射（morphisms）
> という「何か」はお互いにころころと入れ交わる「何か」なんです。
> だって、「もともと同じもの」を別々に語ろうとした「何か」なんだから。

誤りです。このような事実はありません。

> 対象（objects）　＝　射（morphisms）

誤りです。このような事実はありません。

> こういう「もともと同じもの」でも
> お互いにころころと入れ替わる関係性を構成している「何か」であるのを
> 語るのが圏論です。

誤りです。

> だから当然「圏」ってなに？っていうのを語るのは非常に難しいわけです。
> そんなもんを明確に定義するのは土台無理な試みでしょう。

誤りです。きちんとした定義が存在します。

なお、ここでのwikipediaの引用は、現在は編集されて別の記述になっているようですが、流し読みした印象では編集前の記述でも特に大きな誤りはないかと思いました。

> なんと、数学という厳密な理論体系において、
> 圏論においては、
> 
> 圏はあくまで補足的なものという位置づけ
> だの
> 定義は大きく変換している
> だの
> もっとも無難な定義
> だの
> この定義を採用するほかない
> 
> などと大変混乱しているのは、それが根本的な理由です。

誤りです。wikipediaの記載内容にも混乱は見られません。

> 圏論とは、「数」というもの自体の根源を語ること、

誤りです。

> 自分自身の足元をみつめるような理論なんで、

この一文については正しいことを言っています。最近の圏論は論理学と関係が深く、メタ理論の側面が強いです。

> 外形的な世界観の定義が非常に困難なのです。

誤りです。定義は明確です。

## ここまでの訳注

圏論の定義において、クラスと集合の違いは重要です。が、計算機科学で応用する場合は小さな圏、つまり集合を定義に用いることで議論を簡略化することがほとんどです。

[次回](http://qiita.com/sct/items/ef9802cab9f98f3b99bc)に続きます。
圏論の考え方でつくられていない、JavaScriptで動作する spinoza (スピノザ) - (1)

qiitaに圏論について事実ではないことを書いたエントリが何個か挙げられています。本シリーズではその内容について吟味していこうと思います。

[関数、値、圏論、モナド、評価戦略、純粋関数型、その辺りの「数学的基礎」を教える](http://qiita.com/kenokabe/items/3e167c6742f14af7756d)の圏論について書かれている部分で、誤っている部分、正しい部分を解説していきます。

> 私が使う「評価」つまり「計算」っていう言葉遣いが、
> ..中略..
> そしてその彼らの理論的背景は数学だそうです。
> 圏論とか。
> 彼らがそう思っている数学的理論背景である「圏論」には、
> もちろんそんな決意表明を後押しするような
> 理論、考え方なんてあるわけもなく、

「彼ら」の議論を追えていないのでコンテキストが不明ですが、引用した部分に関しては正しいです。圏論はプログラミング意味論を扱う分野ではありません。

> 圏論では「値」とか「関数」みたいな絶対的存在はありません。

「りんごは空を飛ばない」と同程度に無意味な表明ですが、内容は正しいです。

> 値は関数となり、
> 関数は値となり、
> 相互にコロコロと立場が入れ替わります。
> 値とは関数であり、
> 関数とは値なのです。

そのような事実はなく、誤りです。ある圏の射を別の圏の対象と見なす、ということはやります。

> 両者を渾然一体として扱えるような理論体系がどうしても必要だ、
> そこで颯爽と登場するのが「圏論」である、というわけです。
> 操作と数、数と操作の区別が一切ないっていう構造について
> 明示的に論じたのが「圏論」です。

誤りです。そのような事実はありません。

> 圏論では単に「関係性」を論じます。

「関係性」が何を指すかにもよりますが、字面的には正しいといえる表明だと思います。

> 操作は、数になり
> 数は、操作となり、入り乱れる、
> そういう関係性を数学的に論証したのが圏論です。

正しくありません。

## ここまでの訳注

途中の虚数の議論については、圏論とまったく関係がないので言及していません。

[次回](http://qiita.com/sct/items/44ed6fedb3c315e80705)以降に続きます。
【jQuery】$.ajax()


```js:基本形
$.ajax({
  url: 'http://user-domain/hoge.php',
  type: 'POST',
  data: {
    id: 1,
    mode: 'hoge'
  },
  dataType: 'html'
}).done(function( data, textStatus, jqXHR ) {
  //成功
}).fail(function( jqXHR, textStatus, errorThrown) {
  //失敗
}).always(function( jqXHR, textStatus) {
  //通信完了
});
```

###getメソッドでdataを設定するとクエリストリングになる。
```
$.ajax({
    type: 'GET',
    url: 'http://user-domain/hoge.php',
    data: {
        id: 1,
        mode: 'hoge',
        type: 'entry'
    },

//=>http://user-domain/hoge.php?id=1&mode=hoge&type=entry
```


参考：[jQuery.ajax()のまとめ](http://www.koikikukan.com/archives/2012/10/02-005555.php)
Go by Example: Constants


(この記事は [Go by Example: Constants](https://gobyexample.com/constants) を翻訳したものです。)

Goはcharacter, string, booleanと数学的値の定数をサポートしている。


```go
package main

import "fmt"

import "math"

//　定数は constで宣言される。
const s string = "constant"

func main() {
    fmt.Println(s)

	// 定数宣言はvarでの宣言のようにどこでも現れる事ができる。
    const n = 500000000

	// 定数宣言は任意精度演算を行うことができる。
    const d = 3e20 / n
    fmt.Println(d)

	//　数の定数は明示的なキャストなどがされるまでは型が決まっていない。
    fmt.Println(int64(d))

	// 変数の代入や、関数の呼び出しよのうなコンテキストを使うことによって方が与えられる。
	// math.Sin はfloat64を引数をして取る。
    fmt.Println(math.Sin(n))
}

```
Go by Example: Variables


(この記事は [Go by Example: Variables](https://gobyexample.com/vriables) を翻訳したものです。)


Goにおいては、変数は明示的に宣言されコンパイラーでは関数が呼ばれる時、型のチェックなどに使われる。

```go
package main

import "fmt"

func main() {

    // 1個以上の変数を宣言することができる。
    var a string = "initial"
    fmt.Println(a)

    //　複数の変数を一度に宣言することもできる。
    var b, c int = 1, 2
    fmt.Println(b, c)

	// Goは初期の変数の値によって型を推定する。
    var d = true
    fmt.Println(d)

	// 初期化を宣言しない変数は、zero-valueとして宣言される。
	// 例えばintのzero valueは0である。
    var e int
    fmt.Println(e)

	// :=は初期化して宣言するための省略表記である。
	// var f string = "short" を書きを同様である。
    f := "short"
    fmt.Println(f)
}

```


```
$ go run variables.go
initial
1 2
true
0
short
```


----

stringのzero value = ""

```
package main

import "fmt"

func main() {
	var a string
	fmt.Println(a)
	fmt.Println(a == "")
}

```


```

▶ go run str-zero.go

true
```

ゼロ値って？
初期化をしない場合に入っている値

|型  | 値 |
|----|----|
|bool| false
|整数型| 0
|浮動小数点型| 0.0
|string| ""
|ポインタ、関数、インタフェース、スライス、チャネル、マップ型| nil
|構造体、配列| 各要素がそのゼロ値|ゼロ値って？


ref:http://qiita.com/jca02266/items/56a4fb7b07b692a6bf34
Go by Example: Hello World


Goを学ぶための gobyexample.comの和訳とメモです。

Install go

```
brew update
brew install go
```

Set Environment vairable in .bashrc or .zshrc

```
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
```

hello-world.go

``` go
package main

import "fmt"

func main() {
	fmt.Println("hello world")
}

```

プログラムを実行するためには、上記のコードをhello-world.goに書き、`go run`を使う。

バイナリにコンパイルしたいときは、`go build`を使う。バイナリは直接実行できる。

```
$ go run hello-world.go
hello world

$ go build hello-world.go
$ ls
hello-world hello-world.go

$./hello-world
hello world

```


ref:
https://gobyexample.com/hello-world
Go by Example: Values


(この記事は [Go by Example: Values](https://gobyexample.com/values) を翻訳したものです。)


Goにはstring, integer, float, booleanなどのさまざまな方があるが、ここでは例を少し紹介する。


```go
package main

import "fmt"

func main() {
    // Stringsは＋で足すことができる。
    fmt.Println("go" + "lang")
    
	// intgers と float
    fmt.Println("1+1 =", 1+1)
    fmt.Println("7.0/3.0 =", 7.0/3.0)
    
	// Booleansとあなたがいつも使っているようなオペレータ
    fmt.Println(true && false)
    fmt.Println(true || false)
    fmt.Println(!true)
}


```


```
	
$ go run values.go
golang
1+1 = 2
7.0/3.0 = 2.3333333333333335
false
true
false


```



-----


int - float

```
package main

import "fmt"

func main() {
	// int / int
	fmt.Println("1/3 =", 1/3)
	// int / float
	fmt.Println("1/3.0 =", 1/3.0)
}
```


```
$ go run int-float.go
1/3 = 0
1/3.0 = 0.3333333333333333
```

pythonの2系と同じ結果
int / intはfloatにならない。
mysqlを入れて動かす前に調整しておくところ（個人的に）

##mysqlを入れて動かす前に設定しておくところ
#####✱触るのはmy.cnfだけです(InnoDB前提)
vim /etc/my.cnf

を開いて

####・innodb_buffer_pool_size
実メモリの80%くらいの値を割り当てる。
この値が小さいと極端に遅くなる場合があるので、必ず設定する。

####・innodb_log_file_size
ログファイルのサイズ。増やすとパフォーマンスが良くなるが、増やしすぎると復旧やサービス起動が遅くなる。

####・innodb_log_buffer_size
メモリ上やログバッファサイズ。16MBくらいまでなら増やしても良い。

####・max_connections
MySQLはセッション毎のリソース消費が少ないので、1000くらい設定してしまって、いけるところまで行ってもってもいいと思います。

####・slow_query_log
slow_query_logは遅いクエリのログ出力をするかどうかを決める。

####・slow_query_log_file
slow_qurey_logを吐き出すログファイルの場所を指定する。

####・long_query_time
long_query_timeは遅いクエリとみなすた、えのしきい値を秒数で設定。

###・設定例
innodb_buffer_pool_size = 512M
innodb_log_file_size=512M
innodb_log_buffer_size = 8M
max_connections=450
slow_query_log = 1(1がON、0がOFF)
slow_query_log_file = /path/to/mysql-slow.log
long_query_time = 1(1秒未満でも設定できる)

<hr>
mysqlをインストールして本格的に動かす前に設定しておく項目です。
mysqlｈは他にもクエリキャッシュなども機能もあり様々な設定ができますが、動かす前に設定するのは個人的にこれくらいかなと。
L2SWにIPを設定する最短手順

## Vlan 1 に 192.168.2.251/24 を割り当てる例

### コマンド

```go
interface Vlan1
 ip address 192.168.2.251 255.255.255.0
 no shutdown
```

### 標準出力

```go
         --- System Configuration Dialog ---

Enable secret warning
----------------------------------
In order to access the device manager, an enable secret is required
If you enter the initial configuration dialog, you will be prompted for the enable secret
If you choose not to enter the intial configuration dialog, or if you exit setup without setting the enable secret,
please set an enable secret using the following CLI in configuration mode-
enable secret 0 <cleartext password>
----------------------------------
Would you like to enter the initial configuration dialog? [yes/no]: no
Switch>en
Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#
*Mar  1 00:25:56.413: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to up
Switch(config)#
Switch(config)#interface Vlan1
Switch(config-if)# ip address 192.168.2.251 255.255.255.0
Switch(config-if)# no shutdown
```

### 確認

```go
ping 192.168.2.251
```

### 2つ目のIPをつける方法

```go
ip address 192.168.2.250 255.255.255.0 secondary
```


## 注意点

Vlan 1 に 192.168.2.251/24 を割り当てて、
他のVlanに 同じく 192.168.2.251/24 を割り当てることはIOSの制限でできない。

> overlaps with

* 参考: [設定できないIPアドレスがあることを知る](http://jukenki.com/contents/cisco/ccna-lab-scenario/lab1-cannot-set-ipaddress.html)
Synergyを使ってWindowsに繋いだHHKBLite2でMacを操作する


http://qiita.com/kikuchy/items/7c0933f2727a0b619db4
こちらに書いてあるのとだいたい同じなんだけど、自分の備忘録として。

#環境

* Desktop Windows 8.1 （synergy server）
* macbook air OS X Yosemite（synergy client）
* Synergy Version 1.6.2（$10）

#導入

synergyの公式からpaypalかなんかで支払ってDL、インストール。
ふるいバージョンのやつはIP入力しないとダメだった気がするのだが、起動したら勝手に接続されるようになってた。これなら金払った価値があるような気がする。

ただし、Macはどうも勝手にスタートアップには登録されないみたい？ とりあえずMac起動時に自動起動するようにしておいた。windowsはまだ再起動していないのでしらない。

#キーボードの設定

マウスはスムーズに動くのだが、キーボードがひどい。まず何も効かない。
http://qiita.com/kikuchy/items/7c0933f2727a0b619db4
を参考に、US入力以外を全部削除して再起動、そのあとGoogle IMEを有効にしなおしたら日本語入力できるようにはなった。

あと、ぶっちゃけ意味がなさそうなんだけど、HHKB Lite2用のMacドライバを入れてみた。キーコンとかいろいろ試したが全然うまくいってなさそうなので、たぶん不要。試してみたい人はググってください。そんでうまくいったら教えて下さい。


でまあ、そんなわけで一応は動くのだけど、問題が山積みである。

#問題点

###記号がおかしい、無変換、変換キーが効かない
http://qiita.com/kikuchy/items/7c0933f2727a0b619db4
に書いてある通り。なんか色々配列がクソだけど、頑張ったら慣れそう。

###windows→Macに日本語をコピペすると文字化けする（逆はOK）
わりと結構致命的。
これも軽くググったのだけど、解決方法は見当たらなかった。
直してくれるhacker求む。
SQL だけで100万行 のテストデータを用意する方法

軽量プログラミング言語を使ってデータ生成してもいいのだけど接続情報書くのが面倒なので SQL だけでサクッとやりたい。そんなときは SQL の直積を利用すると楽である。今回動作検証に用いた環境は Mac に入っている MySQL 5.6.13。

## 準備

まずはテーブルの作成とデータ生成のためのデータ用意。
用意するものは0から9の数字が入ったテーブル1つだけ。

```sql
CREATE TABLE digit(num integer);
INSERT INTO digit VALUES
(0),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9);
```

## 早速 100 万行のデータ生成

実際の SQL。このサンプルでは動作確認のため ORDER BY を使っているが無くてもよい。

```sql
SELECT
    d1.num + d2.num*10 + d3.num*100 + d4.num*1000 + d5.num*10000 + d6.num*100000 as num
FROM
    digit d1, digit d2, digit d3, digit d4, digit d5, digit d6
ORDER BY
    num;
```

## 応用

`users` テーブルにユニークなEメールアドレスを100万行追加したいという場合は以下のような SQL を記載する。ただし、この方法だと最初のユーザIDは0になる。

```sql
CREATE TEMPORARY TABLE foo(
    SELECT
        d1.num + d2.num*10 + d3.num*100 + d4.num*1000 + d5.num*10000 + d6.num*100000 as num
    FROM
        digit d1, digit d2, digit d3, digit d4, digit d5, digit d6
    ORDER BY
        num
);
INSERT INTO users(id, email)
SELECT num, CONCAT("user+", num, "@example.com") FROM foo;
```

## まとめ

この方法は7年ぐらい前に SQL に詳しいおじさんから教えてもらった。私はパフォーマンステストでテストデータを用意する際にこのような SQL をよく書く。
凝ったテストデータが要求されないならばこの方法は SQL のみで完結しとても高速に動くのでおすすめである。
Swift - 再帰的enumの書き方

その日は来ないと弾言しちゃいます。

[Swiftで気になった所]
> 代数的データ構造を彷彿とさせる魔改造を施されたenumですが、再帰的データ構造が出来そうで出来ないのでガッカリ感が有ります。

> ````swift
enum List { // (!) Recursive value type 'List' is not allowed
    case Car(AnyObject)
    case Cdr(List?)
}
````

> 正座して実装される日を待ちます。

[Swiftで気になった所]: http://qiita.com/ykst/items/3aba08ba1bf8955004d1

なぜなら、それが出来るようにするということはSwiftの型システムのありようを根本から崩壊させてしまうことになるからです。

結論を述べる前に、上記のコードをあえてCで書いたらどうなるのか見てみましょう。

````C
typedef void *AnyObject;
typedef union List {
    AnyObject  car;
    union List cdr;
} List;
````

どこがおかしいかおわかりになるでしょうか?

そうです。`union List cdr`がおかしい。試しにコンパイルしてみると、clangでは`definition of 'union List' is not complete until the closing '}'`というエラーが出ます。`List`の中に`List`を入れることは、数学的にはできても物理学的にはできないのです。

なので、再帰的データ構造は、データそのものの代わりにデータへの参照を入れることで実現されています。マトリョーシカではなくロケット鉛筆なわけですね。

Cにおける参照とはポインターのことなので、上記コードは

````C
typedef void *AnyObject;
typedef union List {
    AnyObject   car;
    union List *cdr;
} List;
````

として、`*`を`cdr`の前に加えるだけでいいわけです。

ところが、Swiftにポインターはありません[^0]。どうしたらよいでしょうか?

[^0]: Cのポインターの読み書きはできますが、あくまでもポインターではなく`UnsafePointer<Type>`などの`Struct`としてそれを実現しています。

## 参照型なのは`Class`だけ

[The Swift Programming Language]にはこう明記されています。

[The Swift Programming Language]: https://itun.es/jp/jEUH0.l

"Classes Are Reference Types”

そうです。`Class`を使えばいいのです。

````swift
import Foundation
class List {
    var car:AnyObject = NSNull()
    var cdr:List? = nil
}
````

これは問題なく動きます。

以下のようにすれば、さらによいでしょう。

````swift
class Atom<T> {
    var value:T
    init(_ value:T) {
        self.value = value
    }
}

enum Node<T> {
    case None
    case Data(Atom<T>)
    case Link(Pair<T>)
}

class Pair<T> {
    var car:Node<T> = .None
    var cdr:Node<T> = .None
}
````

`enum`と`class`が相互参照することで、再帰的な`enum`が実現しました。

## `struct`と`enum`は実体型

上記のコードは、こう書きたくなる誘惑に駆られます。

````swift
enum Node<T> {
    case None
    case Data(T)
    case Link(Pair<T>)
}
````

ところが、これは動きません。なぜかといえば、[The Swift Programming Language]にも"Structures and Enumerations Are Value Types"とあるように、`enum`は実体型だから。実体型ということは、実際に必要なメモリーの量を割り出して確保しなければならないということですが、上記のコードでは`T`の大きさがわからないと必要なメモリーの量もわかりません。

そこで`Atom`という`class`で包んでいる(wrap)わけです。`class`は参照型なので、`sizeof(Atom<T>)`は必ずCにおけるポインターのサイズと一致します[^1]。

実は、サイズが固定であれば包装は`class`でなくても構いません。`Atom<T>`のかわりに`[T]`でも`()->T`でも動きます。が、一番メモリーを食わないのはラッパークラスを使う方法。見た目もこれが一番すっきりしていると思います。

[^1]: 64bit環境なら8、32bit環境なら4。

## マシン語が透けて見える

モダンな言語のほとんどは、ポインターを追放しています。その代償としてデータ構造の実装もまた隠蔽されているのですが、[@shi3zがポエムに歌ったように]、Swiftはポインターを追放したにも関わらずマシン語が透けて見える言語でもあります。型が`struct`、`enum`、`class`と分かれているのは透明度が一番高い部分ではないでしょうか。

[@shi3zがポエムに歌ったように]: https://twitter.com/shi3z/status/473627881055485952

## まとめ

* 再帰的データ構造を有限のメモリーで実現するには、参照が必要
* Swiftにおける唯一の参照型は`class`
* `class`と`enum`を相互再帰することで、再帰的`enum`が実現できる。

Dan the Self-Referential Coder
プログラマになること#11 「食」を軽んじてはいけない


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#学習能力
基本的に「脳」がうまく働いていないと、「学習」そのものが継続しません。
「脳が」働くには、色んな物質が必要です。
要約すると「正しい食べ物」をバランス良く食べること。とても大事なことです。
最強の組み合わせを紹介しときます。
ご飯、納豆、卵、味噌汁（アサリ、わかめ入りが尚良い）、アジ、ひじき。
日本食は偉大ですね。
参考までに
http://www.endokoro.jp/blog/?page_id=2273

#症例
ここでは、専門教育、社会人教育のなかで典型的だった例をあげておきます。

##ケース１：毎日500円
父（市会議員）、母（校長）、共に家庭に寄り付かん。家庭崩壊。
毎日500円を渡されてはいたそうです。
朝食無し、昼は給食、晩は500円で…
そりゃ、子供はさみしいから、マンガ、ゲームを買いたくなる。
マンガ買ったら、お弁当は買えない。
毎日カップラーメンだったと。時にはコーラだけ。
ほぼ１10年間、そんな食生活だったそうです。
とにかく忘れちゃう。

##ケース２：偏食の少食
肉、魚、卵を一切食べない。豆腐、味噌も少量。
ご飯も茶碗半分程しか食べれない。
「餓鬼」のような顔つき、体つきでした。
集中力が持続しない。

##ケース３：コーラ依存
ポテトチップス＋コーラが大好き。
まともなご飯を食べる環境、習慣が無い。
小学生並の知識。
体はガリガリ、筋力なし、スタミナ無し。若年性糖尿病。
軽い躁鬱。
HomebrewでインストールしたPostgreSQLを9.3から9.4.0にアップグレード with PostGIS


* メジャーバージョンアップなのでデータのアップグレード作業をやらないといけない
* PostGISを導入している場合は注意が必要

# 環境

* MacOSX Yosemite 10.10.1
* homebrew 0.9.5


# 注意点

pg_upgrade実行前に `brew reinstall postgis` を実行しろ


# 手順

## PostgreSQLのアップグレード

```bash
brew upgrade postgresql
```

## PostGISの再インストール

```bash
brew reinstall postgis
```

これやっとくと新たにインストールされたPostgreSQLにpostgisをインストールしてくれる。
やっとかないとpg_upgradeの途中でライブラリが見当たらないみたいなエラーが出る。

```bash
# エラー例
$ pg_upgrade -b /usr/local/Cellar/postgresql/9.3.5_1/bin -B /usr/local/Cellar/postgresql/9.4.0/bin -d /usr/local/var/postgres-9.3 -D /usr/local/var/postgres
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is a superuser                       ok
Checking for prepared transactions                          ok
Checking for reg* system OID user data types                ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for invalid "line" user columns                    ok
Creating dump of global objects                             ok
Creating dump of database schemas
                                                            ok
Checking for presence of required libraries                 fatal

Your installation references loadable libraries that are missing from the
new installation.  You can add these libraries to the new installation,
or remove the functions using them from the old installation.  A list of
problem libraries is in the file:
    loadable_libraries.txt

Failure, exiting

$ cat loadable_libraries.txt 
Could not load library "$libdir/rtpostgis-2.1"
ERROR:  could not access file "$libdir/rtpostgis-2.1": No such file or directory

Could not load library "$libdir/postgis-2.1"
ERROR:  could not access file "$libdir/postgis-2.1": No such file or directory
```


## データのアップグレード

いままで使用していたデータディレクトリをコピー

```bash
cp -r /usr/local/var/postgres /usr/local/var/postgres-9.3
```

データディレクトリを初期化

```bash
rm -rf /usr/local/var/postgres/*
initdb /usr/local/var/postgres
```

pg_upgradeでデータを移行

```bash
pg_upgrade -b /usr/local/Cellar/postgresql/9.3.5_1/bin -B /usr/local/Cellar/postgresql/9.4.0/bin -d /usr/local/var/postgres-9.3 -D /usr/local/var/postgres
```
コンピュータ将棋製作記 その4

# コンピュータ将棋製作記 その4（2015年1月23日）

## 進捗どうですか？

### 昨日の課題

- floodgateでランダムプログラムを走らせる

### 今日進んだ所

- floodgateでランダムプログラムを走らせた

http://wdoor.c.u-tokyo.ac.jp/shogi/view/show-player.cgi?event=LATEST&filter=floodgate&show_self_play=1&user=randomwalker_with_bugs

## TCPクライアントとランダムプログラムの連結

TCPクライアントで、サーバから送られてくる文字列をパースして、それをランダムプログラムとつなげてやればいい。

サーバから送られてくるデータのプロトコルは次のページに定義されている。

CSAサーバ プロトコル ver.1.1.2: http://www.computer-shogi.org/protocol/tcp_ip_server_112.html

色々と詳細に送られてくるが、今回は馬鹿正直にそれらに対応する必要はない。今回対応したのは次の2つのコマンドのみ

- Your_Turn:+
- END Game_Summary

自分のターンが先手か後手かを判断するのと、サーバがデータを送り終わったことを判定するのが必要だったのでそれだけを実装した。

END Game_Summaryを受信したら、とにかくAGREEを返して試合開始待ちにし、STARTを受信したら先手だったらとにかく指す。相手の手を見て指す。それだけ

とにかく動作チェックが30分に1回しか出来ないので、バグを出して動かないと30分待ちというつらい状況だった。4回失敗したので2時間無為に過ごした。自分で簡易サーバを作って、そこでテストすればよかったかもしれない。

## C言語の開発効率の悪さ

昨日も書いたけれど、C言語で書くのが間違いという思いをさらに強くしている。恐らく何らかのスクリプト言語で1から書き直すつもりでいる。

## 雑感

- CSAに対応させる必要はあまりなかった
  - USI等に対応させて、何らかのソフトでCSAに変換してもらえばよかったと考えている
- ランダムで動かす最弱ソフトをfloodgateに入れていいのだろうか

- 全くのランダムにせよ、自分の書いた将棋プログラムが動いているのは嬉しいものだ

## 次回予定

### TODO

- CSA、USIの状況について調べてみる。Windowsでの開発が必須か？
- （気合が乗れば）Pythonもしくはnode.jsを使って書き直しはじめる
  - どのような設計で作るかについても考えておきたい

### 短期目標

- 金曜夜（30日夜）までに、minimaxなりα-βなりで何らかの思考ルーチンを組む
PHPフレームワークのPhalconのTransactionでハマったこと


Phalconで開発をしているのですが、トランザクションを使ってたらMySQLのコネクション数が一気に上限を越えたので、起こったことと解決したことを書いていきます。

## 問題が発生したコード

こんな感じのコードを書いていると、DBからToo many connectionsエラーが返ってきました。

```
try{

	use Phalcon\Mvc\Model\Transaction\Manager as TransactionManager;

	for($i = 0; $i < 200; $i++){
		$transactionManager = new TransactionManager();
		$transaction = $transactionManager->get();
		
		// DB更新処理など

		$transaction->commit();
	}
} catch(Phalcon\Mvc\Model\Transaction\Failed $e) {
	error_log($e->getMessage());
}
```

コメントでDB更新処理と書いていますが、特に処理を書いてなくてもToo many connectionsエラーとなります。

## 解決したコード

至極単純な話でした(^_^;)
ループの中でTransactionManagerをnewしてたのが原因でした。。

```
try{

	use Phalcon\Mvc\Model\Transaction\Manager as TransactionManager;

	// ループの外にTransactionManagerを出す
	$transactionManager = new TransactionManager();
	for($i = 0; $i < 200; $i++){
		$transaction = $transactionManager->get();
		
		// DB更新処理など

		$transaction->commit();
	}
} catch(Phalcon\Mvc\Model\Transaction\Failed $e) {
	error_log($e->getMessage());
}
```

とりあえず解決したと共に肩から脱力しました。
日々精進します。
hetemlで公開鍵を使う方法


hetemlダサいけど使う場面が来たけど公開鍵方式のSSHログインがやっぱりダサかったので書いとく。

# 0. 下準備
コントロールパネルからSSHを有効にしとく
https://admin.heteml.jp/web/ssh/

# 1. SSHホストを追加【ローカル】
```.ssh/config
Host heteml
	HostName sshXXX.heteml.jp
	User YOUSERNAME
	Port 2222
IdentitiesOnly yes
PreferredAuthentications password
```

# 2. 公開鍵生成【ローカル】
ローカルで公開鍵を作成。すでにある場合はスキップ。

```
$ cd ~/.ssh
$ ssh-keygen -t rsa
```

heteml上にコピー。いったんユーザールートに。
```
$ scp ~/.ssh/id_rsa.pub heteml:~/
```

# 3. 公開鍵を設置【heteml】

まずログイン。

```
$ ssh heteml
```
パスワードを聞かれるので入力。ログイン完了。

先ほどの鍵を`authorized_keys`に変更し、一旦ログアウト。

```
$ mkdir .ssh
$ mv id_rsa.pub .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ exit
```

# 4. パスワード接続を解除【ローカル】

先ほどのホスト設定から`PreferredAuthentications `部分をコメントアウト。

```.ssh/config
Host heteml
	HostName sshXXX.heteml.jp
	User YOUSERNAME
	Port 2222
IdentitiesOnly yes
# PreferredAuthentications password //コメントアウト or 削除
```

これでSSHログインでパスワードを聞かれることはなくなります。

```
$ ssh heteml
```
Bluetooth端末の情報をスマホで受信して何か面白いことしたい！(1/2) 〜Bluetoothの基礎知識〜


基礎知識なんて偉そうなことを言っていますが、社内のIT知嚢の方から聞きかじったことです。間違っていたら指摘お願いします！

# iPhoneではBluetooth 3.x/2.xをアプリから自由に使えない

## 使うとするiPhone Accessory Protocol（通称 **iAP**）に対応したデバイスを製造する必要がある

- Made For iPhone認証を取る必要がある(通称 **MFi**)
	- Appleのデバイス審査が必要
- MFi認証取得デバイスを製造する為に工場側もMFiを取得している必要がある
	- MFiのManufacture Licenseの取得が必要
		- ベンダーが限られている
	- MFi認証取得と共に、iAPを喋るために認証チップが必要になるこのコストが上積みされる

## MFiを取らないでBT 3.x/2.xで実装しようとした場合

- Human Interface Device（**HID**と呼ばれてるタイプのデバイス: キーボードなど）とする事で、MFiは不要
	- BT端末からの情報をソフトウェアキーボードやハードウェアキーに割り当てることで、擬似的に他の操作を行わせる。
	- 例えば、[とあるシャッターリモコン](http://www.amazon.co.jp/dp/B00JMBS9XI/ref=as_sl_pc_tf_lc?tag=midomido05095-22&camp=243&creative=1615&linkCode=as1&creativeASIN=B00JMBS9XI&adid=09CA7F6YNKK8V1D0NK77&&ref-refURL=http%3A%2F%2Fmidomido050952.seesaa.net%2Farticle%2F404978293.html)は、Enterキーや音量UPハードキーに割り当てて、カメラ起動時にシャッターが切れるようにしている。
	- **iOSの注意点**
		- HIDとしてiOSデバイスに接続すると、外部キーボード接続されたと認識する
		- iOSのソフトウェアキーボードが動作しなくなる（画面に出てこなくなる）
		- ソフトウェアキーボードを使いたいシーンで使えなくなる

# Bluetooth 4.0

## 最近の端末はだいたい対応している

- iOS端末 : iPhone 4S〜、第3世代iPad〜
- Android : Ver4.3〜
	- アプリから自由に使えるのでBT3.0での問題を解決できる。独自のプロトコル構築も可能。

# まとめ

- iOS
	- Bluetooth 3.0の信号はアプリ上で使えない。
	- OSが処理して、それに割り当てられた操作がアプリ上で実行されるだけ。
- Android
	- 例えばキーボードとして連携されたBT端末からのインプットを検知して、他のアクションに使える。
		- [キーイベントを取得する](http://techbooster.jpn.org/andriod/device/1427/)

# 次回

- iOSに関してはBluetooth 3.0と連携して何かすることはできないので、 Bluetooth 4.0何かできないか探索してみる。
Androidの署名情報(signingConfigs)を外出しよう

Androidでgradleファイルを記述するときに、build.gradleのsigningConfigsの欄に直でパスワードを書いていませんか？

パスワードを直に書かない方法だとgradle.propertiesに設定を書いてそれを利用する方法、標準入力から毎度入力する方法もあります。ですがあまりスマートとはいえません。

しかし`apply from`で外部のgradleファイルとして読み込むととても簡単に設定情報が外部ファイルに切り出せます。

やりかたは簡単で以下のとおり。

app/build.gradle

    android {
        // ...

        // signingConfigs
        apply from: 'signingConfigs/debug.gradle', to: android
        apply from: 'signingConfigs/release.gradle', to: android

        buildTypes {
            debug {
                debuggable true
                signingConfig signingConfigs.debug
            }

            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.release
            }
        }
    }

app/signingConfigs/debug.gradle

    signingConfigs {
        debug {
            storeFile file("debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }

debug.gradleなどをプロジェクト間で共通にしておけば、署名ファイルが一意に使いまわせてよいです。

この方法は、signingConfigsだけでなくbuildTypesなどにも利用できるので、決まりきった設定は外部ファイルに切り出すと楽です。

app/build.gradle

    android {
        // ...

        // signingConfigs
        apply from: 'signingConfigs/debug.gradle', to: android
        apply from: 'signingConfigs/release.gradle', to: android

        // buildTypes
        apply from: 'buildTypes/debug.gradle', to: android
        apply from: 'buildTypes/release.gradle', to: android
    }

app/buildTypes/debug.gradle

    buildTypes {
        debug {
            debuggable true
            signingConfig signingConfigs.debug
        }
    }

簡単なサンプル作ったので実行確認にどぞ

- https://github.com/mattak/android-SigningExportSample
Oracle 「select * from v$sql;」の出力をExcelにする方法


## 内容
「すぐに"select * from v$sql;"の結果をExcelにして出して」と言われ、とりあえずやった技のメモ。

## 手順

1. 以下のコマンドを実行してHTML形式で出力する。

    ```console
    $ echo 'select * from v$sql;' | sqlplus -S -M "HTML ON TABLE 'BORDER="2"'" ユーザ名/パスワード > v_sql.html
    ```

2. 出力したHTMLをウェブブラウザで表示。表示内容をコピーしてテキストエディタに貼り付けたところ、TSVになったのでそのままExcelに貼り付け。
Windows Server のメモリリーク原因調査

## Windows Server のメモリリーク発生原因と考えられる要素をまとめてみた。
### Windows Update が当たっていない
最新のパッチが当たっていないとWindowsのバグによりメモリリークが発生する可能性がある。
WSUSが導入されている場合は自動アップデート等が可能だがローカル環境だとついついアップデートを見逃しがち。
ローカル環境でのアップデート方法は右記が詳しい。　http://dolls.orz.hm/?p=6166

### アプリケーション・コードのバグ
導入しているアプリケーションによってはメモリリークのバグを含んでいることがある。
例えば下記のアプリケーションでメモリリークのバグが報告されている。
* Zabbix Agent　http://www.zabbix.jp/node/3000
* ウィルスバスター　http://esupport.trendmicro.com/solution/ja-jp/1312161.aspx

### 仮想環境特有の動作
メモリバルーニング（VMWare Esxi, Hyper-Vなどで実装されている）
メモリリークとは直接関係はないがメモリ使用率の急激な変化などの原因となりえる　http://www.climb.co.jp/blog_vmware/vmware-6057

## メモリリーク調査方法
公式サイトにメモリ使用率の見方が掲載されていた、1回読んだだけでは実感がわかないので実機で見るなどして、確認したい。
Windows アプリケーションにおけるメモリ リークの防止　https://msdn.microsoft.com/ja-jp/library/dd744766(v=vs.85).aspx
  
Microsoft RAMMap などのツールを用いることでメモリ状況を調べられるとのこと。
Windows Server 2008 R2のメモリで質問　http://q.hatena.ne.jp/1398208193
Rammapツールでメモリの詳細な利用状況を調査する　http://www.atmarkit.co.jp/fwin2k/win2ktips/1358rammap/rammap.html

* [RAMMap](https://technet.microsoft.com/en-us/sysinternals/ff700229.aspx)
* [VMMap](https://technet.microsoft.com/en-us/sysinternals/dd535533.aspx)
* [Process Explorer](https://technet.microsoft.com/ja-jp/sysinternals/bb896653)


### reference
* [メモリリークの原因特定方法](http://qa.atmarkit.co.jp/q/1797)
* [windows zabbix agent のバージョン確認方法](https://www.zabbix.com/documentation/2.0/jp/manual/concepts/agent)
* [windows パフォーマンスのメトリクス](https://sophiakunii.wordpress.com/2013/09/30/%E3%80%90101%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E3%80%91%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%A2%E3%83%8B%E3%82%BF%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-%EF%BD%9E-2/)
* [「svchost.exe」の正体を探る](http://gigazine.net/news/20061009_svchost/)
* [あやしい「svchost.exe」にご用心――3つの“素性確認”ソフト](http://www.itmedia.co.jp/bizid/articles/1009/13/news063.html)