OmniAICreator/Qiita-1.07M huggingface dataset:
素人の言語処理100本ノック:10


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第2章: UNIXコマンドの基礎
>hightemp.txtは，日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，hightemp.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．

###まず`man`の日本語化

この章からはUNIXコマンドの勉強になります。
UNIXコマンドの調べ方がよく分からず職場の同僚に聞いたところ、「まずはmanで調べるクセをつけなさい」とアドバイスをもらい、さっそく端末で`man wc`とやってみました。

![Kobito.W1nTgc.png](https://qiita-image-store.s3.amazonaws.com/0/139624/66fc847b-0eb7-53f1-dd6c-b692a5fa92ff.png "Kobito.W1nTgc.png")

やはり英語でしたか><

でも、ありがたいことに日本語化されたパッケージがありました。
`sudo apt-get install manpages-ja`
でインストールできます。有志のみなさん、感謝です。

これで無事、日本語になりました。

![Kobito.z0ZAzE.png](https://qiita-image-store.s3.amazonaws.com/0/139624/3c91167f-ba06-ec85-1105-1ceb69747993.png "Kobito.z0ZAzE.png")


さっそく問題に進みます。

###10.行数のカウント
>行数をカウントせよ．確認にはwcコマンドを用いよ．


出来上がったコード：

```python:main.py
# coding: utf-8

fname = 'hightemp.txt'
count = 0
with open(fname) as data_file:
	for line in data_file:
		count += 1
print(count)
```

実行結果：

```console:端末
24
```

UNIXコマンドでの確認は、シェルスクリプトの勉強も兼ねてスクリプトでやってみます。

```bash:test.sh
#!/bin/sh

wc --line hightemp.txt
```

実行結果：

```console:端末
24 hightemp.txt
```

無事、同じ行数になりました。

###シェルスクリプト実行時の注意（Windowsバッチファイルとの違い）
シェルスクリプトを直接実行する際は、スクリプトファイルに実行権限を付けておく必要があります。`chmod +x test.sh`などで権限を付与してください。またUNIXは、パスが通っていないとカレントの実行ファイルを見つけてくれません。実行時は`./test.sh`といった感じで場所の指定が必要です。
UNIXとWindowsを行ったり来たりしてると、いろいろ混乱しますね。慣れの問題なのでしょうけど、時々Windowsで`ls`って打っちゃったりとかしてます^^;
　
11本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
Adobe XD ✕ Prott - プロトタイピングの愉しみ方

あれこれ浮気してやっぱXDが私の嫁だと言うために、
Prottを使ってみるとあらやだステキ機能満載。

ということで浮気した結果の雑感です。

# 画作り

![xp01.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/96d7c337-1bc1-2c5d-bf08-494bb87a476b.gif)


ブラウザベースのProttだとどうしても迫られるオフラインの壁。
軽やかな画作りに特化したXDと比較すると、
若干のはがゆさ感じてしまう今日このごろ。

もういいよと言うくらい語り尽くされているリピートグリッドや、
背景のぼかしによるそれっぽい画作りなど
デザイナー寄りの効果＆演出で、
画としての魅力はXDの方が作りやすいと思ったり。思わなかったり。

# プレビュー

![xp02.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/0ea840e4-c3de-1f65-0692-c8b7b9d5e67c.gif)

モックアップやワイヤーフレームは
レビュー→バック→レビュー以下略により、
精度を上げていくのが大切と個人的には思っております。
XDだとPDFに書き出すあたりが、
Adobe環境の無いクライアントへの主なレビューにどうしてもなってしまいます。

いちいちメールを書く手間や、
どこの何に対してのフィードバックかを説明する工程が発生するのでちょっと負荷が多い印象。
その点Prottはコメント機能があるので、
アカウント（無料）を作る手間はありますが、
特にレビューする側に専用の環境がなくても意見交換がしやすいのは非常に魅力。
スマホでのレビューもさくっとできちゃうのもベネ。モールトベネ。

# 遷移図

![xp03-2.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/6c0aa14b-f7a9-a8ba-5c00-18dbf8e5d361.gif)

BETA版ですがPrott搭載の遷移図自動生成はまさに夢ツール。
導線を定義してポチッと押すだけで遷移図できちゃうなんて、
未来の世界の猫型義体に
土下座してようやく叶うのではないかと思うくらいの逸品。
まだまだBETA版なので粗い部分もありますが、
この機能のためだけにPrott使いたいすらある。

# まとめ
ということで、今現在で個人的に快適なモックアップ制作環境として、
XDで画作り！PNGで書き出し！Prottに読み込み！導線設定！プレビューッ！！！
ってのが浮気をして真実の愛に気がついたどころか、
結局二股でいいんじゃんよ！っていうハーレムEND。

新人のXDたんはプレビュー版なので
これからの開発でどう化けるか超期待ですし、
Prott嬢は安定安心どころかオプションまで豊富。
どちらを選ぶみたいなことはせずに、
おとなしく使いたい機能だけ使えばいいじゃない！が
まだまだ発展途上のプロトタイプ業界の愉しみ方の一つじゃないでしょうか。
両方知るとそれぞれの良さを再認識できるので、
ぜひとも両方おさわりしていただけたらと思いますデス！
How to install Emacs 25.1.1 with Inline-patch on OS X

この項、古くなりました。

[Emacs-25.3/26.3(Mojave, Catalina)/27.x にインラインパッチをあてて使う（macOS） - Qiita](https://qiita.com/takaxp/items/e07bb286d80fa9dd8e05) のシェルスクリプトに頼ったほうがヨサゲです。homebrew による管理は諦めましたorz

デフォルトの `makeinfo` (つまり `/usr/bin/makeinfo`) は古いので注意！

---

[こちら](https://www.naney.org/diki/d/2015-07-24-Emacs.html)を参考に、僕なりにやってみました。

```shell-session
% brew update
% EDITOR=emacs brew edit emacs
```

```rb
class Emacs < Formula
  desc "GNU Emacs text editor"
  homepage "https://www.gnu.org/software/emacs/"
  url "https://ftpmirror.gnu.org/emacs/emacs-25.1.tar.xz"
  mirror "https://ftp.gnu.org/gnu/emacs/emacs-25.1.tar.xz"
  sha256 "19f2798ee3bc26c95dca3303e7ab141e7ad65d6ea2b6945eeba4dbea7df48f33"

  # ここから追加
  patch :p1 do
    url "https://raw.githubusercontent.com/suzuki/emacs-inline-patch/master/emacs-inline.patch"
  end

  depends_on "autoconf" => :build
  depends_on "automake" => :build
  # ここまで追加

  bottle do
    sha256 "6022295cbbad123db684cef19029d6100e711e29c160ac9ba1bb7a38304655da" => :sierra
    sha256 "013398eb1c8030b31423484bc0c316245cbab523c70452f200814950c98b1f44" =>
 :el_capitan
    sha256 "fa3f4f8f6050072e2032c7dc04d3289ec82847bb2ea507c1444bbc385f375eda" =>
 :yosemite
  end
```

```shell-session
% brew install --with-cocoa --with-gnutls --with-modules emacs
% brew linkapps emacs
```

```elisp:init.el
;; Mac の設定
(when (string-equal system-type "darwin")
  ;; Emacs とシェルの変数共有
  ;; http://d.hatena.ne.jp/kiririmode/20130804/p1
  ;; https://github.com/syl20bnr/spacemacs/issues/3920
  (when (functionp 'exec-path-from-shell-initialize)
    (setq exec-path-from-shell-arguments '("-l"))
    (exec-path-from-shell-initialize))

  (mac-input-method-mode) ; 日本語入力

  ;; カーソルの色の設定
  ;; http://blog.n-z.jp/blog/2013-11-12-cocoa-emacs-ime.html
  (mapc
   (lambda (param)
     (let ((name (car param)))
       (when (string-match "Japanese\\(\\.base\\)?\\'" name)
         (mac-set-input-method-parameter name 'cursor-color "red"))))
   mac-input-method-parameters)
  (mac-set-input-method-parameter "com.apple.keylayout.US"
                                  'cursor-color "white"))
```

[Naney様](https://twitter.com/Naney)、[suzuki様](https://github.com/suzuki)に感謝いたします。

c.f. [遅まきながらEmacs25.1をインストールしてみました](http://emacs.rubikitch.com/emacs251-install/)
CocoaPodsでSwift 3.0へのアップデートが別ブランチで進んでいるライブラリに対応する

ObjectMapperの`swift-3`ブランチを使いたかったので色々いじってたらCocoaPodsはブランチを指定できるということを知った。
ので、Podfileにて

```
pod 'ObjectMapper', :git => 'https://github.com/Hearst-DD/ObjectMapper.git', :commit => '6ba230a'
```

とかしてあげることで、最新の変更を利用することができました。

（2016/09/23追記：[cocoapodsにSwiftのバージョンを伝えてあげる必要がありそう](https://github.com/CocoaPods/CocoaPods/issues/5521#issuecomment-226328062)です。Podfileに以下を追加します）

```ruby
...

target 'hoge-app' do

  ...

  post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['SWIFT_VERSION'] = '3.0'
      end
    end
  end

end
```
HTMLファイルをコマンドラインから開く

いや、別にHTMLに限らず、どんなファイルでもデフォルトアプリケーションで開く方法かと思うのですが、MarkdownやDoxygenなどで生成されたHTMLファイルを開くときに、私はこんな感じでやってますって事で。

使用例
- AtomでMarkdownをプレビューしながら書いて、最終確認を下のターミナルウィンドウから開く
- make docsでDoxygenのドキュメント生成し、html/index.htmlをブラウザで開く

# MacOSX

```shell-session
$ open hoge.html
```

# Windows

```shell-session
> start hoge.html
```
あるいは

```shell-session
> explorer hoge.html
```

# Unix系OS(Linux,FreeBSD他)
### ブラウザ
firefox,chrome,opera,...ですが...

```shell-session
$ firefox hoge.html &
$ chrome hoge.html &
$ opera hoge.html &
```
などなど
### デスクトップ環境
#### LXDE/PCManFM
```shell-session
$ pcmanfm hoge.html
```
#### GNOME/nautilus
```shell-session
$ nautilus hoge.html
```
私の環境だとファイルのあるディレクトリがnautilusで開くだけでしたが
#### KDE
不明
#### Xfce
不明

### うーん
ブラウザとウィンドウマネージャー/ファイルマネージャの組み合わせで色々あるのかな？~~パス
汎用的に使える方法があったら教えてください。
というか自分の使うブラウザのコマンド打つのが一番ですね。~~

汎用的にはfreedesktop.orgのxdg-utils/xdg-openを使うのが良さそうです。
[Linux/WindowsでもMacOSXみたいにopenでファイルを開きたい](http://qiita.com/hkato/items/95e4e0ec5c0e57508d7e)
sourcetreeを新規インストールしたらエラーが出て使えなかったのを解決した話

# 概要
windows10 32bit でsourcetreeを公式サイトからダウンロードして
インストールしたものの、リポジトリのクローン時やローカルリポジトリを
リモートにpushしたりするときにエラーが出て全然使えなかったのを解決した話。

# エラーの内容
-  warning: templates not found
-  libcurl-4.dll がない
-  libssh2-1.dll がない

# 解決策
[ここ](https://answers.atlassian.com/questions/32972886/git-remote-https.exe-libcurl-4.dll-the-procedure-entry-point-sslctxsetalpnprotos-could-not-be-located-in-the-dll)の英語のページのってました。

- 引用  

```
C:\Users\myName\AppData\Local\Atlassian\SourceTree\git_local\mingw32\bin

But they should also be found at:
C:\Users\myName\AppData\Local\Atlassian\SourceTree\git_local\mingw32\libexec\git-core

After a Copy 'n' paste of all 37 DLL's into the git-core folder and it is now working. Hope this helps someone.
```
 - 超適当訳  
 *C:\Users\myName\AppData\Local\Atlassian\SourceTree\git_local\mingw32\bin* にある.dllのファイル（総数37個）を、
*C:\Users\myName\AppData\Local\Atlassian\SourceTree\git_local\mingw32\libexec\git-core*　にコピーすればいいんだぜ。

# 結果
ちゃんと動くようになりました。
これはバグなのかなぁ。。。
elixirでspawn, channel

前の投稿では、Crystalをやってみる
http://qiita.com/tabetomo/items/754308a6cd48bcf56585

```crystal:spawn3.cr
ch1 = Channel(String).new(1)
ch2 = Channel(String).new(1)
done = Channel(Bool).new()

spawn do
  puts ch1.receive
  puts ch2.receive
  puts ch1.receive
  done.send(true) # end
end

spawn do
  ch1.send("apple")
  ch2.send("orange")
end
ch1.send("grape")

done.receive
```

と言って、Crystal上でspawnで送受信する例をやってみました。このページでは同じことを~~golang~~でやってみます。


注意、上記は、前投稿のコメント欄でいただいた修正版コードを利用させていただきました :smile: 。＞karupanerura様ありがとうございます！。
（cristalではメッセージのバッファのサイズを指定できる。というので使っている）

# elixirでのspawn + send/receive例
同じことをgolangでやる予定でしたが、先にelixirでやってみることにしました。elixirでは、こんな感じ。

```elixir:contest.ex
defmodule Contest do
   # 関数を使っていないのでモジュールは空
end

pid1 = spawn fn -> 
        receive do 
            {sender, msg} -> IO.puts(msg)
        end
        receive do 
            {sender, msg} -> IO.puts(msg)
        end
        receive do 
            {sender, msg} -> IO.puts(msg)
            send(sender, "done")
        end
    end

send(pid1, {self, "apple"})
send(pid1, {self, "orange"})
send(pid1, {self, "grape"})

pid2 = spawn fn ->
         send(pid1, {self, "apple"})
         send(pid1, {self, "orange"})
         receive do
             msg -> IO.puts("pid2, " <> msg)
         after
             1_000 -> IO.puts("time out in pid2")
         end
     end

send(pid1, {self, "grape"})
receive do
    msg -> IO.puts("parent, " <> msg)
after
    1_000 -> IO.puts("time out in parent")
end
```

（解説）pid1へのsendでは、{self, "contents"}のタプルにして、自分のpid=selfを送っています。このpidは返信に使われます。pid1では、３通うけとると、sender宛に"done"を送ることにしています。pid2は、基本pid1にメッセージを送るだけですが、ここでも{self, "contents"}として返信先を書いています。３通受信後、pid1からの返信"done"が、pid2に届くのかparentに届くのか未定なので、ここではどちらでもメッセージを受け取るようにしています。pid2かparentかどちらか一方受け取れないので（受け取れない方がいつまでも待たないように）受信にタイムアウトを入れています。


実行例は、以下の通り

```bash:terminal
$ bash-3.2$ iex -S mix                                  
Erlang/OTP 19 [erts-8.0.2] [source] [64-bit] [smp:4:4]
[hipe] [kernel-poll:false] [dtrace]                   
                                                      
Compiling 1 file (.ex)                                
grape                                                 
apple                                                 
orange                                                
pid2, done                                            
time out in parent                                    
Interactive Elixir (1.3.2) - press Ctrl+C to exit (typ
)                     
iex(1)> 
```

elixirでは１つのspawnで１つのチャネル（のはず）ということで、cystalの例のように１つのspawnで２つのチェネル（ch1, ch2）を受信！とはいかなかったですが、なんとか近いものは動作させることができました。Elixlirでは100万個のspawnを作ってもすぐ終了する（高速！）。らしいので、ぜひ今度は是非やってみたいですね。

最後にvscodeでの画面イメージを載せておきます。
![elixir.png](https://qiita-image-store.s3.amazonaws.com/0/93734/2f981215-89b9-4ea9-623f-9428825d37d2.png)

Ctrl｀で、terminalが立ちあがって作業できるので、vscodeは便利。
Homebrew でインストールした PostgreSQL に接続できない時に確認すべきこと

たまに起きては 5 分ほど時間を無駄にしてしまうので。
これを書くことで次回はすんなり解決できますように。

`brew services start postgresql` とかしても `postgres` プロセスがいない場合用。
(だいたい OS が異常終了した後の再起動時に起こるけど何故か毎回忘れてしまっている)

## とりあえずエラーログを見る

Homebrew でインストールした場合のエラーログはここに保存されている。

`/usr/local/var/postgres/server.log`

おもむろに `tail` するとこんなログが出ていたりする。

```
FATAL:  lock file "postmaster.pid" already exists
```

## postmaster.pid を消す

一応先に書いておくと、本来あまり良いやり方ではないです。
開発環境で、最悪データが全部消えても問題ない、という前提です。

ファイルはここにある。

`/usr/local/var/postgres/postmaster.pid`

## tmux の中からだと何故かプロセスが起動できない

tmux の中からだと何故か `brew services start postgresql` してもうまく起動してくれないので tmux の外でやってみましょう。

おしまい
サバティカらないゲーム開発改めVJ製作ブログ4日目

あれからいろいろ考えた。
Unityで作るシーンのモチーフもだが、主に実際VJする時の態勢について。

- ネタの不足をフォローするために、GLSLSandboxとかのシェーダーをばんばんつっこみたい
- Unityがまれによく落ちるので、落ちた時のフェールセーフ(別の映像に切り替わるなど)を用意したい

で、思った。 *これ普通にVJソフト使った方がよくね？* と。

# VJソフトとは

そもそもVJとは日本だと宇川直宏先生がビデオデッキ2台とビデオミキサーを使って映像をミックスしてパフォーマンスしたのが初め(たぶん)でありデュフフww、それがPCの性能が上がって動画の処理ができるようになり、Flashベースのソフト(motion diveとかが有名)が出てきてPCでパフォーマンスを行うのが主流になったという歴史がある(ここらへん適当。ちゃんと知りたい人はちゃんと調べてね。ちなみに今でも色セロハンとスポットライトでVJするアーティストもいる。最新のテクノロジーが常に最高のパフォーマンスを生むわけではないのでござる。おっとこれでは拙者まるでVJオタクみたいwww)。

最近ではCPU・GPUの性能もあがってVJのソフトウェアもいろんなのが出てきていて、ここらへんが有名みたい。
- Resolute
- VDMX
- Modul8

で、このうちのVDMXを何年か前のセールで買っていたのを思い出した(まったく使ってなかった)ので、これを使うことにする。

このソフト、いまいち操作が独特で使ってなかったのだが、このソフトの機能を全部Unityで再現するよりは操作を覚えた方が間違いなく楽だろう。ちょうど先日会社の有志の合宿があって時間があったので丸1日練習したところ、結構手ごたえを感じることができた。

# MIDIコントローラ

ちなみにVJソフトというのはだいたいMIDIコントローラと連携できる(物理的なツマミとかスライダーとかで操作する)。MIDIコンのどのツマミが画面上のこのパラメータでー、と紐付けていくわけだが、これが結構面倒臭い。と思っていたところでVDMXのプロジェクトテンプレートの中に[APC mini](http://akai-pro.jp/apcmini/)というのがあったので「これ使えばええんやな！」と思ってそれを買った (金で解決するスタイル)。

ちなみにUnityだけでVJやろうと思ってた時に[こんなMIDIコン](https://www.keithmcmillen.com/products/quneo/)も買った。
こいつは入力だけでなくMIDI信号を送信することでLEDを光らせることができるので、こんなプログラムも作ってみた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">MIDIコンを光らせる<a href="https://t.co/qw6p0vqe6A">https://t.co/qw6p0vqe6A</a></p>&mdash; tnayuki (@tnayuki) <a href="https://twitter.com/tnayuki/status/778233762979024896">2016年9月20日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

が、とりあえず使わないのでお蔵入り。

というわけで今のところVJの製作すらしておらず、だいぶ意識が低い感じになっているが、ぼくのモットーは「最大限の努力を払って最大限楽をする」なのでこれでよいのだ。
dashDBを普通のRDBとして使用する


# はじめに
Bluemixから利用できるRDBのサービスとしてSQL Databaseがありましたが、残念ながらサービス終了となり、2016年9月時点では新規サービスを作成できなくなっています。作成済みのサービスも年内には廃止となります。

BluemixアプリケーションでRDBを使おうとすると、PostgreSQL by ComposeやClearDB MySQL Database、ElephantSQLを利用することとなりますが、別途アカウント作成が必要があります。他に手段はないかなということで探してみると・・・。ありました！アナリティクス用と思われているdashDBです。ということで、dashDBを普通のRDBとして利用する方法について記載します。

# おまじないは「ORGANIZE BY ROW」
ここで記載する手順ですが、実はSQL Databaseのサービス終了を告げるブログ記事にもしっかりと記載されています。ところが、思いの外この事実が知られていないのですよね・・・。

ブログ記事「[SQLDB Deprecation Notice](https://developer.ibm.com/bluemix/2016/08/09/sqldb-premium-service-deprecation-notice/)」をみてみましょう。ページの最後のほうに以下の記載があります。

> What’s the Difference Between IBM dashDB™ for Analytics and IBM dashDB™ for Transaction? Can I use the free IBM dashDB™ for Analytics Entry plan?
IBM dashDB™ for Transactions is optimized for general purpose transactions and web workloads. However, IBM dashDB™ for Analytics is optimized for analytics, and has all tables as columnar (“ORGANIZE BY COLUMN”). If you choose to try the IBM dashDB™ for Analytics free Entry plan, remember that you must organize tables by row, using “CREATE TABLE… ORGANIZE BY ROW” to get the typical DB2 SQL functionality.

簡単にまとめると、「dashDB for Transactionsは列指向（ORGANAIZED BY COLUMN）なので、Entry planのdashDBを普通のDBとして使いたかったら、テーブルを作成するときに行指向（ORGANIZE BY ROW）を指定してね」ということですね。

# dashDBを普通のRDBとして使うまでの流れ

手順をまとめると以下となります。

1. dashDBのサービスを作成する
2. dashDBの管理コンソールを開く
3. 管理コンソールの左側のメニューから「RUN SQL」を選択する
4. CREATE TABLE ~ ORGANIZE BY ROWを実行する
5. （必要があれば）管理コンソールの左側のメニューから「LOAD」を選択し、初期データを投入する

テーブル作成の画面キャプチャです。

![dashDB01.png](https://qiita-image-store.s3.amazonaws.com/0/73397/12ab9351-f7d2-b9f2-6341-fa61cee68b30.png "dashDB01.png")

「Run SQL」をクリックすると、SQL文を入力する画面が開きますので、そこにテーブル定義のSQL文を記述してください。 __ORGANIZE BY ROW__ の記述をお忘れなく。「RUN」をクリックした後、しばらくするとSQL文入力用テキストフィールドの下に実行結果が表示されますので、「Succeeded」と表示されることを確認してください。手順は以上です。


# さいごに
dashDBのEntryプランは、1GBまでは無料ですが、それを超えると月額5,250円が課金されます（2016年9月20日時点）。データの上限は20GBまでです。ご注意を。
スマートフォン関連情報

■スマートフォン関連情報（国内）—————–
スマートフォンのマーケティングニュースまとめ！
http://matome.naver.jp/odai/2134642039221484301

【Special Edition】スマートフォンのマーケティングニュースまとめ！
http://matome.naver.jp/odai/2137236835833848301

スマートフォン市場動向まとめ（日本・海外）
http://matome.naver.jp/odai/2139676670780913301

アプリ市場（主にゲーム）動向まとめ（国内・海外）
http://matome.naver.jp/odai/2139677011983961501

スマートフォンアプリ開発関連情報まとめ
http://matome.naver.jp/odai/2139676846482464901

スマートフォンゲームアプリ事前予約（登録）サービスまとめ
http://matome.naver.jp/odai/2139677072284436901

スマートフォン動画広告まとめ
http://matome.naver.jp/odai/2139220507685359701

DMP（Data Management Platform）まとめ
http://matome.naver.jp/odai/2137199150445294101

スマートフォン対応SSP一覧
http://matome.naver.jp/odai/2134598072882397001

スマートフォン対応DSP・RTB一覧
http://matome.naver.jp/odai/2134593900378782101

スマートフォン対応アドネットワーク（クリック課金）一覧
http://matome.naver.jp/odai/2134658395935629601

日本のリワード広告（スマートフォン）一覧
http://matome.naver.jp/odai/2134658695336106901

スマートフォン対応ノンインセンティブアフィリエイト一覧
http://matome.naver.jp/odai/2134668164645803001

クロスプロモーション一覧
http://matome.naver.jp/odai/2137972529849322401

ASO（アプリストア最適化）サービス一覧
http://matome.naver.jp/odai/2137510294115565001

Androidアプリのレビュー媒体一覧
http://matome.naver.jp/odai/2134676608453552701

iPhoneアプリのレビュー媒体一覧
http://matome.naver.jp/odai/2134691321366350001

リアル（店舗）アフィリエイト一覧
http://matome.naver.jp/odai/2134706303279326301

アプリレコメンド・検索サービスのまとめ
http://matome.naver.jp/odai/2135865948569982301

リターゲティング広告まとめ
http://matome.naver.jp/odai/2136176433595592901

Android端末検証サービスまとめ
http://matome.naver.jp/odai/2135874723677700601

アプリの広告収入マネタイズ事例まとめ
http://matome.naver.jp/odai/2138892190422217201

■スマートフォン関連情報（海外）—————–
海外DSP・DMP一覧
http://matome.naver.jp/odai/2138166392223475701

海外アプリレビューサイトまとめ
http://matome.naver.jp/odai/2135082363451609801

海外のApple・Androidニュースサイトまとめ
http://matome.naver.jp/odai/2135082478451811401
アクセス先のサブドメインに応じてnginxのログの出力先を変更する方法

#背景
負荷テストを実施し、kataribeを用いてnginxのログ解析を行う必要がありました。
ただデフォルトだと、すべてのアクセスログが同じファイルに集約されてしまうため、対象のログだけを解析するのは結構めんどくさそうやなーと思っていました。

そこで、特定のサブドメインに対するアクセスのみ、そのログの出力先を別のファイルにできればええんちゃう？という助言をいただいたので、やり方を調べてみました。

#やりたいこと
特定のサブドメインに対するアクセスがあった場合に、そのアクセスログの出力先を別のファイルに向けてやること

#やり方

nginx.confのhttp{}のブロックに以下のコードを追加します。

```
  map $request $test {
    ~.*dummy.* 1;
    default 0;
  }

  map $request $normal {
    ~.*dummy.* 0;
    default 1;
  }
```

正規表現を用いて、dummyというサブドメインへのアクセスか否かを判定しています。
$requestがdummyというサブドメインを含んでいるか否かで、それぞれ対応した結果が変数testとnormalに格納されます。
この二つの変数を用いてログの出力先を調整します。


次に、アプリケーションのconfファイルのserver{}ブロックに以下のコードを追加します。

```
access_log  /hogehoge/logs/access.log main if=$normal;
access_log  /hogehoge/logs/dummy/access.log main if=$test;
```

このように設定すれば、サブドメインdummyへのアクセスのログはdummyディレクトリ下のaccess.logに書き込まれます。
これで特定のサブドメインに対するアクセスログだけを別ファイルに抽出できたので、思う存分ログ解析できそうです。

他にも$user_agentなどを指定すれば、特定のユーザエージェントからのアクセスのみうんたらかんたらとかもできそうですね。

#注意点

```
access_log  /hogehoge/nginx/logs/access.log main if=$normal;
access_log  /hogehoge/nginx/logs/dummy/access.log main if=$test;
```

こういうif文が使えるのはnginxの1.7系以上だそうです。
shellで短縮URL生成 

#ここの方が素晴らしいスクリプト作ってくれてるhttp://hole.sugutsukaeru.jp/archives/585

#perlの部分はうまく動かなかったけど、そこはshekkで適当にパースした

#必要なもの　
google API 
google api consoleで検索して自分のプロジェクトを作成する。
そして、API keyの作成をする
ここで、生成したAPI keyを先ほどのスクリプトの該当部分に挿入する

twitterなどの文字制限がある場合に短縮URL作成できると便利です。
UnlimitedHandのUnity用Arduinoコードを更新する

前回はとりあえず動かしただけなので、今回はちゃんとUnlimitedHandのUnity用のArduinoのコードを更新してみる。
手順は基本的にはDevサイトの下記のページ通り。
http://dev.unlimitedhand.com/unity/update.html
環境はWindows10 x64。

# Arduino IDEをインストールする
下記にアクセスして、対象OSのインストーラ(または圧縮ファイル)を取得する。
https://www.arduino.cc/en/Main/Software  

現在、バージョンは1.6.11だった。
インストール(または展開)して、Arduino IDEを起動させる。
ここでは起動確認だけ。この後Libraryを読み込みたいので、閉じておく。

# Arduino Libraryを配置する
Arduino Libraryを下記から取得する。
http://dev.unlimitedhand.com/download.html  

展開して、中にあるUHフォルダを、Arduino IDEのインストール先(展開先)にあるlibrariesディレクトリに配置する。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/e079d22f-b8f9-0954-0aec-09068c9f3246.png)

Arduino IDEを起動させる。
メニューの ファイル > スケッチの例 > UH が存在していることを確認する。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/0cffb45d-442b-669b-162a-7ce2e6c03317.png)

# UnlimitedHandに書き込む
UnlimitedHandをPCにUSB接続し、電源を入れる。
COMポートを確認しておく。他に何もつながってなかったらCOM3だと思う。(Macなら/dev/cu/usbserial-xになるっぽい)

余談だけど、あの付属の謎のシートはこんな感じでUnlimitedHandを乗せて使うためのものみたい。シートのフィルムははがさないとジェルがくっついてはがれるよ。
![IMG_20160920_220254.jpg](https://qiita-image-store.s3.amazonaws.com/0/141310/c26caddb-eb3c-d57e-89ab-dcab7586dbde.jpeg)


Arduino IDEのメニューから ファイル > スケッチの例 > Serial_4Unity_4Processing を選択する。

メニューの ツール > シリアルポート > COMx(さっき確認したCOMポート) を選択する。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/240e704f-3f9c-af24-ca8c-3a4b96beaf97.png)

メニューの ツール > ボード > Arduino/Genuino Uno を選択する。
たぶんデフォルトで選択されてると思う。
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/5ff6f330-9f0b-eac9-9c88-27ba721c96d8.png)

「マイコンボードに書き込む」の矢印アイコン(赤枠で囲んでるやつ)を押下する。
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/8a58b338-a9da-652c-e17e-3c933d8ae018.png)

書き込んでいる間、UnlimitedHandがぶるぶる震えだす。書き込みが終わると止まる。
Arduino IDEの方には「ボードへの書き込みが完了しました」と表示される。
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/a7ecd8ea-0cd9-4568-3550-4cd49886880a.png)

これで完了みたい。
正直面倒くさいなって思ってたけど、サクッと終わった。
ExceptとIntersect

#ExceptとIntersect

```csharp
List<string> doneList = new List<string>{ "買い物", "掃除", "洗濯"};
List<string> toDoList = new List<string> { "買い物", "掃除", "洗濯", "通院" };

// 済んでいないアクション項目
foreach (var a in toDoList.Except(doneList))
{
    Debug.WriteLine(a); // 通院
}

// 済んだアクション項目
foreach (var a in toDoList.Intersect(doneList))
{
    Debug.WriteLine(a); // 買い物 掃除 洗濯
}
```
SEIL で OPEN IPv6 DDNS for NGN の DDNS 機能だけを使う

残念ながら、SEILでは IPsec や L2TPv3 にてホスト名(FQDN)を用いることができないため本家ページに記載されている Cisco や YAMAHA のように OPEN IPv6 DDNS を使った L3-VPN 構築といったことはできません。
がしかし、簡単便利な DDNS サービスの部分のみを活用することは可能です。IPoEを契約していれば、名前をさくっと振って簡単メンテの上でお外のIPv6環境からSSHなどでホスト名を用いてアクセスすることができます。

> [SEILテクニカルマニュアル - 設定・運用 - モニタ](http://www.seil.jp/doc/index.html#fn/monitor/monitor.html)
> [SEILテクニカルマニュアル - 設定・運用 - モニタ - 監視対象のイベントの詳細](http://www.seil.jp/doc/index.html#fn/monitor/description.html)

ここに記載されている__"任意のホストのping応答"__の監視機能を用いて、あるホスト名のIPv6アドレスを定期的に更新するようにしてみます。以下の手順では、[SEIL で NGN IPv6 ネイティブ (IPoE) 接続を試す](https://www.seil.jp/blog/10.html)などを参照して既に IPoE な IPv6 環境の設定がなされているものとして話を進めます。

まずは適当に名前を登録しましょう. その際に「更新専用アドレス」を控えておきます(赤枠部分)。
![renew_ipv6_addr.png](https://qiita-image-store.s3.amazonaws.com/0/2226/6dc644fe-98a5-def9-61d3-c80cf4c2ab3c.png)

これに従って、SEILに以下の設定を追加します。

```
monitor enable
monitor source add OPENIPv6 type ping target-host ${"専用更新アドレス"をここに埋める} description "renew openipv6" watch-interval 60 trigger up event enable
monitor source-group-name add OPENIPv6_mongrp
monitor source-group OPENIPv6_mongrp source add OPENIPv6
monitor binding add OPENIPv6_bind source-group OPENIPv6_mongrp
```

更新間隔を変えたい場合は、__watch-interval__ を __60__ (秒)としている部分を任意の値に変えると良いでしょう。 本来この設定は、監視した結果をログやらSNMP Trapで飛ばすための機能ですが、ここでは定期的にICMPv6 Echo Requestを送る機能のみを流用します。

最初の1発目の ping が送信されると以下のログが出力され、更新は開始されたことを確認できます。1回目以降は特にログは出ないため Web UI にて確認が必要です。

```
# show log
(中略)
593 Sep 20 21:09:20    info system evstatmgrd: info: monitor source ping: host 2409:11:c0e0:4b2:XXXX:XXXX:XXXX:XXXX is unknown->up
(中略)
```

OPEN IPv6 DDNS の WebUIでも以下の様に更新されているのが確認できます。ここでは末尾":1299"のIPv6アドレスを持つSEILからmonitor機能を用いて正しくホスト情報を更新できていることが確認できます。

![renewed_ipv6_addr.png](https://qiita-image-store.s3.amazonaws.com/0/2226/641626f4-b52e-2988-3961-d7d786efe1dd.png)
> 末尾":aa40"はテスト・登録用の別端末。この端末から更新専用アドレスに ping6 を打って上書き→1分程度後に":1299"に更新されるかを見て動作確認
tmux の動作メモ: デーモンとクライアントプロセスで動いている

ps axjf とか見ていると tmux をひとつだけ起動してもプロセスが２つ存在していたのでメモ。
tmux は、それが動いている際には、対象ホストにおいてひとつデーモンを起動する。
デーモンはそれまで存在しなければ新規に作成され、既存のものがあればそれが利用される。
すべての tmux (クライアントプロセス) が終了した際には、デーモンも終了する。
実際のシェルなどはそのデーモンが作成するが、表示はクライアントプロセスで行われる様子。
Windows7 でPython3のインストールおよびpipを使った時のメモ

作業メモです。

# Python3のインストール

公式ページを開く。

[python](https://www.python.org/)

今回はPython3.5.1のダウンロードページを表示。

[Python 3.5.1](https://www.python.org/downloads/release/python-351/)

こちらの　Windows x86-64 executable installer　をダウンロードし、管理者権限で実行。
これでインストールされた。

パスとしては`D:\Users\xxxx\AppData\Local\Programs\Python\Python35\`に配置されていた。


# Python のバージョンを確認

コマンドプロンプトを起動し、上記のパスへcdコマンドで移動

```
python.ext --version
Python 3.5.1
```
# pip の実行

`pip`はpython.exeが配置されたフォルダのScriptsフォルダ配下に存在する

```
pip --version
```

# PATHの設定について

環境変数Pathを設定すればいちいち対象ディレクトリまで移動しなくて良い。

必要に応じて以下を参照して設定すると便利。

[Python for Windows インストールメモ](http://www.aoki.ecei.tohoku.ac.jp/~ito/python_windows.html)
よく使うcurlコマンドのオプションまとめ（14個）

個人的によく使うcurlコマンドのオプションをまとめました


#### 認証情報の付与
``` sh
# basic認証のかかったサイトにアクセス（-uもしくは--user）
$ curl --user USER_ID:PASSWORD http://www.example.com/

# NTLM認証もしくはDigest認証のかかったサイトにアクセス（--anyauth）
$ curl --anyauth --user USERID:PASSWORD http://www.example.com/
```

#### データの付与
``` sh
# フォームの送信（-dもしくは--data）
$ curl --data FORM_ID=VALUE http://www.example.com/

# フォームからファイルのアップロード（-Fもしくは--form）
$ curl --form FORM_ID=@example.png http://www.example.com/

# User-Agentを付与（-A）
$ curl -A "USER_AGENT" http://www.example.com

# クッキーの送信（-b）、保存（-c）
$ curl -b cookie.txt -c cookie.txt http://www.example.com/

# HTTPヘッダーの指定（-headもしくは--head）
$ curl -H "KEY: VALUE" http://www.example.com/

# HTTPBodyにパラメーターを設定してPOST、ファイルで指定する場合は@ファイル名とする
$ curl -d "KEY=VALUE"
$ curl -d @FILE_NAME
```

#### 動作の指定

``` sh
# HTTPメソッドの指定（-X）
$ curl -X PUT http://www.example.com/

# SSLのエラーを無視して処理を継続（-k）
# （サーバー側証明書が不正、クライアント側のルート証明書が不正など）
$ curl -k http://www.example.com/

# リダイレクトさせる（-L）
$ curl -L http://www.example.com/
```
#### 情報確認（デバッグ系）

``` sh
# HTTPレスポンスヘッダーの取得（-I）
$ curl -I http://www.example.com/

# 詳細をログ出力（-vもしくは--verbose）
$ curl -v http://www.example.com/

# 進捗やエラーを表示しない（-sもしくは--silent）
# （curlの結果をパイプで次のコマンドに渡す際に、通信時間のデータなどが邪魔にならないようにする）
$ curl -s http://www.example.com/
```


#### 参考
 - [curlコマンドから HTTP POST する方法](http://qiita.com/letsspeak/items/8c7266742371699ab45e)
 - [Cocoaはやっぱり!
インターネットにアクセスしよう
番外編 : curlの使い方](http://sitearo.com/cocoa/0800_internet/curl/)
 - [curl(1) で POST する際の --data と --form の違いについて](http://d.hatena.ne.jp/a666666/20110427/1303838381)
C#:友愛数を求める


## 友愛数

「[完全数](http://qiita.com/gushwell/items/7d4468bd3db972ae9b08)」と共に小説『博士の愛した数式』に登場する「友愛数」を求めるプログラムです。

友愛数(Amicable Numbers)とは、２つの異なる自然数の組(ペア)になっていて、自分自身を除いた約数の和が、もう片方の数と等しくなるような数を言います。「親和数」とも呼ばれているようです。

例えば、一番小さな友愛数の組は(220, 284)です。

220の自分自身を除いた約数の和は、1+2+4+5+10+11+20+22+44+55+110 = 284 で、
284の自分自身を除いた約数の和は、1+2+4+71+142 = 220 となります。

ちなみに、今までに見つかった友愛数の組は、すべて偶数同士または奇数同士の組だそうです。
ただ、すべてでそうなるのかは、未解決の問題のようです。

## C#のコード

「友愛数」の組を求める何らかの式を使えば求められる、というわけではなさそうなので、このプログラムでは、約数の和を計算することで、友愛数を求めています。


```cshapr:AmicableNumbers.cs
class Program {
    public static void Main(string[] args) {
        AmicableNumbers an = new AmicableNumbers();
        var numbers = an.GetNumbers()
                        .Take(20);
        foreach (var pair in numbers) {
            Console.WriteLine("({0} , {1})", pair.Value1, pair.Value2);
        }
    }
}

public class Pair {
    public long Value1 { get; set; }
    public long Value2 { get; set; }
}

public class AmicableNumbers {
    // long の範囲で、友愛数を列挙する
    public IEnumerable<Pair> GetNumbers() {
        for (long i = 2; i < long.MaxValue; i++) {
            long x = Divisors(i).Sum();
            if (i >= x)
                continue;
            long y = Divisors(x).Sum();
            if (i == y)
                yield return new Pair { Value1 = i, Value2 = x };
        }
    }

    // 真の約数を求める n は、2以上の整数
    private IEnumerable<long> Divisors(long n) {
        yield return 1;
        long m = (long)Math.Sqrt(n);
        if (m * m == n) {
            yield return m;
            m--;
        }
        for (long i = 2; i <= m; i++) {
            if (n % i == 0) {
                yield return i;
                yield return n / i;
            }
        }
    }
}
```

クラス AmicableNumbersが、友愛数を求めるクラスで、GetNumbersメソッドで、友愛数の組を順に取り出せるようにしています。「いくつまで」という制限は設けていないので、GetNumbersメソッドを呼び出す側で、Take(n)とかして、組を取りだす個数を指定します。もちろん取り出せるのは、longで表せる数の範囲です。

ソースコードは、[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection)で公開しています。

## 実行結果

<pre>
(220 , 284)
(1184 , 1210)
(2620 , 2924)
(5020 , 5564)
(6232 , 6368)
(10744 , 10856)
(12285 , 14595)
(17296 , 18416)
(63020 , 76084)
(66928 , 66992)
(67095 , 71145)
(69615 , 87633)
(79750 , 88730)
(100485 , 124155)
(122265 , 139815)
(122368 , 123152)
(141664 , 153176)
(142310 , 168730)
(171856 , 176336)
(176272 , 180848)
</pre>



-------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
【SQL】LIKE句

**20190504追記**

- わかりにくい表現を修正しました。

****

SQLで`LIKE`句を使用すると、対象の列(カラム)に対して文字列検索を行うことができます。


##完全一致

```sql
SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '検索文字';
```
`LIKE '検索文字'` で、文字列検索を行うことができます。
この場合は、`検索文字`に完全に一致した場合のみ、結果として表示されます。
`検索文字`を含む場合を検索したい、というような場合はワイルドカードを使用します。


##ワイルドカード検索(部分一致)
ワイルドカードを使用して部分一致検索を行うことができます。

| ワイルドカード文字 | 意味 |
|:-:|:-:|
| % | 0文字以上の任意の文字列 |
| _ | 任意の1文字 |


例　以下のProductテーブルがあるとします。

| id | name | price |
|:-:|:-:|:-:|
| 1 | 本A | 1000 |
| 2 | 本B | 1200 |
| 3 | 本AB | 1200 |

```sql
SELECT * FROM  WHERE name LIKE '%A';
/*
本Aのレコードがヒット
________________
id |name |price
1  |本A  |1000
________________
*/


SELECT * FROM  WHERE name LIKE '本%';
/*
本A、本B、本ABのレコードがヒット
________________
id |name |price
1  |本A  |1000
2  |本B  |1200
3  |本AB |1200
________________
*/


SELECT * FROM  WHERE name LIKE '本_';
/*
本Aと本Bのレコードがヒット
________________
id |name |price
1  |本A  |1000
2  |本B  |1200
________________
*/
```
継承とメソッドの実行

#動物クラスと犬クラス

```csharp:Animal.cs
public class Animal
{
    public Animal() { }

    // virtual
    public virtual void Naku()
    {
        Debug.WriteLine("naku");
    }

    public void Naku2()
    {
        Debug.WriteLine("naku2");
    }
}
```

```csharp:Dog.cs
public class Dog : Animal
{
    public Dog() : base() { }
   
    // override
    public override void Naku()
    {
        Debug.WriteLine("わん");
    }

    // new
    public new void Naku2()
    {
        Debug.WriteLine("わん わん");
    }
}
```

#メソッドの実行

```csharp
// アップキャスト virtual-override
Animal dog1 = new Dog();
dog1.Naku(); // わん
            
// アップキャスト new
Animal dog2 = new Dog();
dog2.Naku2(); // naku2

// virtual-override
Dog dog3 = new Dog();
dog3.Naku();    // わん

// new
Dog dog4 = new Dog();
dog4.Naku2();   // わん わん
```
ruby tempfile

```bash
vagrant@precise64:~/data/indexes_collection_v2$ rvm use 2.3.1
Using /home/vagrant/.rvm/gems/ruby-2.3.1
vagrant@precise64:~/data/indexes_collection_v2$ pry
[1] pry(main)> Tempfile.new("png").class
=> Tempfile
[2] pry(main)> Tempfile.new("png").binmode.class
=> File
[3] pry(main)> a = Tempfile.new("png")
=> #<File:/tmp/png20160920-23048-kqoi93>
[4] pry(main)> b = Tempfile.new("png").binmode   
=> #<File:/tmp/png20160920-23048-1425o5r>
[5] pry(main)> a.class
=> Tempfile
[6] pry(main)> b.class
=> File
[7] pry(main)> a.close
=> nil
[8] pry(main)> a.unlink
=> true
[9] pry(main)> b.close
=> nil
[10] pry(main)> b.unlink
NoMethodError: undefined method `unlink' for #<File:/tmp/png20160920-23048-1425o5r (closed)>
from (pry):10:in `__pry__'
[11] pry(main)> File.unlink(b)
=> 1
[12] pry(main)> a = Tempfile.new("png")
=> #<File:/tmp/png20160920-23048-jfytju>
[13] pry(main)> a.close
=> nil
[14] pry(main)> File.unlink(a)
=> 1
```


https://makandracards.com/makandra/11113-ruby-tempfiles
そうそうSwift 2(Xcode 7.3.1)をSwift 3(Xcode 8.0)へコンバート

Xcode 8.0を起動、Swift 2作成プロジェクトを開くとコンバートするか確認されます。
そのまま進めればいいのですが、一度キャンセルしてた場合どうすればいいのか？

メニューからコンバートを実行できます。
メニュー：「Edit」-「Convert」-「To Current Swift Syntax…」
![toSwift3_01.png](https://qiita-image-store.s3.amazonaws.com/0/23378/7a3a49f1-f3ff-4e9a-55b0-ac772d052634.png)

「Convert to Swift 3」「Convert to Swift 2.3」「Convert Later」の選択候補が表示されます。
コンバートを止めたい場合は「Convert Later」でOKです。Cancel釦が押せずにちょっと焦ります。
![toSwift3_02.png](https://qiita-image-store.s3.amazonaws.com/0/23378/a2c9e346-7193-3ea2-7eff-db36a5dbfa78.png)

コンバート候補が表示されます。
Testsだけしないとかはあまりないと思いますが。。。
![toSwift3_03.png](https://qiita-image-store.s3.amazonaws.com/0/23378/cf21d3f0-4958-fdba-2f73-59fb29fdb68e.png)

コンバートプレビューが表示されます。プロジェクトの大きさ、マシン性能によっては時間がかかります。
コンバート内容が表示されます。
コンバートする場合Save釦を押下、止める場合Cancel釦押下。
![toSwift3_04.png](https://qiita-image-store.s3.amazonaws.com/0/23378/77665d91-72cb-649b-a08b-05edacac4dea.png)
![toSwift3_05.png](https://qiita-image-store.s3.amazonaws.com/0/23378/44e4863f-44eb-9924-635d-32f6ee71adc5.png)
ISUCON6に参加したのでその雑記

## ISUCONとは

http://isucon.net/
WEBサービスのチューニングのうまさを点数化して全国で競い合うコンテスト

## 今回の問題

今回ははてぶのようなwikipediaのような、百科事典登録・閲覧サービスのようなものでした

* キーワードとコンテンツが登録できること
* キーワードとコンテンツが閲覧できること
* コンテンツの中身にキーワードが含まれていたらリンクにすること

アプリケーションが2つ、DBも2つの構成でした。
テーブルは全部で3つ（user,コンテンツ,お気に入りの星）

## チーム

去年と同じチームで再挑戦してみました（[去年の記事](http://qiita.com/yamamoto_hiroya/items/b8e7e6619ea09cf1f885)）
ミドルウェア担当・アプリケーション担当・DB担当の分担を行い、私はDB担当での参加でした。
言語も去年と同じく`Ruby`

## やったこと

* ミドルウェア担当がボトルネックを調べるためにログを仕込んでる間にアプリケーションの作りを把握
* アプリケーション担当「てかなんでアプリケーションとDB2つに分かれてんの、統合したい」
* 私はDB担当だったのでアプリケーションで叩かれるクエリを見つつDBのインデックスまわり、データの持ち方を見る
* descriptionという記事のコンテンツを格納しているカラムがあり、どうやらこれがボトルネックだと悟る
* キーワードの取得処理がN+1のクエリが走っていたのでアプリケーション担当がサクッと改修（この時点で5000アップ、瞬間最高5位!）
* 昼過ぎくらいにボトルネック調査の結果が上がってきたのでチェック、トップ画面とログイン処理が遅いことが判明
* 記事の投稿者を示すauthor_idを保持していたが使っていなかったので削除（使ってないのでスコア変わらず）
* updated_atでorder byしているクエリがあったのでupdated_atにインデックス付与（大してスコア伸びず）
* ミドルウェア担当が静的ファイルの返し方を変更
* キーワードの長さでorder byしているクエリがあったのでクエリでやらずにアプリケーション側で行なうように改修（アプリケーションの改修にやや手間取り、しかもスコアも全然伸びず）
* 記事の表示の度に正規表現で記事内のキーワードをリンク化している処理がめちゃ重だったのでキャッシュ化（ここで1万点を超える）
* `select*`で全てとっているところが無駄だったので必要なもののみを取得するように変更（ちょっとアップ）

瞬間最高5位の図
![スクリーンショット 2016-09-17 12.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/67471/20f546e1-b85c-7881-041f-968b59496544.png)

## 結果

|初期スコア|12:00|16:30|最終スコア|
|:-:|:-:|:-:|:-:|
|0|6000|15500|14400|

## 感想と反省

まず反省としては、レギュレーションを勘違いしていたこと。
initializeの処理でDBの構成等も全て5秒以内に作り上げ、そこからスタートだと勘違いをしてしまった。
キーワードの文字列長をDBのカラムとして持ち、そこにインデックス貼ってソートしたら速いのでは？という案は出ていたのに「いや、initializeの5秒では終わらないね」ってことで断念してしまった。
レギュレーションをちゃんと理解してなかったのがとてもとても反省でした。
また今回はアプリケーション層での改修の比重がとても大きかったのでDBの構成がシンプルなのを見て、アプリケーション側にすぐに手伝いに入ればよかった。
あと初めから「アプリケーションとDB1つにしたい」って話が上がっていたものの結局行わなかったのでそこはチャレンジすべきだった。
今回は初めから役割分担をしていたのですぐに自分の分担の作業に取り掛かれたのはとても良かったが、全体像を眺め終わった後に作戦会議と改修方向の認識合わせを行えば良かった。

## おわりに

直接点数での比較はできないですが、去年は1800点で手も足も出なかったのに対して今年は15000まで上げることができたので確実に成長しているのを感じた。
参加すること自体に意味があると思っているしとても楽しかったので参加の意義はあった。
チームの2人がとても悔しがっていたので来年は予選突破を本気で狙いにいきますかね！:smile:
ちょっとでも興味が湧いた人は来年は是非参加しましょう！
plenv でハマった


`VirtualBox` 上の `CentOS7` で `plenv install-cpanm` しようとしたら、肝心の `cpanm` が `${HOME}/perl5/bin` 以下に入る。

```
$ env | grep PERL
PERL5LIB=/home/bunzaemon/perl5/lib/perl5:
PERL_MB_OPT=--install_base /home/bunzaemon/perl5
PERL_LOCAL_LIB_ROOT=:/home/bunzaemon/perl5
PERL_MM_OPT=INSTALL_BASE=/home/bunzaemon/perl5
```

調べたら、身に覚えのない `/etc/profile.d/perl-homedir.sh` なるファイルが原因。

```
$ cat /etc/profile.d/perl-homedir.sh
（略）
        eval `perl -Mlocal::lib`
（略）
```


デフォルトで入っていたのか、後から入れたのについてきたのか？
検証する気力もわかない。
何に使ってるかわからないから、一応残して、手元の *shrc の先頭に

```
unset PERL5LIB
unset PERL_MB_OPT
unset PERL_LOCAL_LIB_ROOT
unset PERL_MM_OPT
```

を書いて対処


#追加メモ

20161024

追加の方が長いけど。

## まず結論。

結局、調査してもしなくても、同じ結論。

普通に殺せばいい。
つか、丁寧に除去は出来ない。


```
$ cd /etc/profile.d
$ sudo mv perl-homedir.sh perl-homedir.sh.bak
```

もしくは、OSのインストール時に、Perlの設定を後回しにして、自分でセットアップする。


## 出所

`perl-homedir.sh` が含まれているのは、↓

https://www.rpmfind.net/linux/RPM/centos/7.2.1511/x86_64/Packages/perl-homedir-1.008010-3.el7.noarch.html

の `perl-local-lib-1.008010-3.el7.src.rpm`

これは、`local::lib` とラッパ、パッチのパッケージ

```
$ rpm2cpio ../perl-local-lib-1.008010-3.el7.src.rpm| cpio -idv
local-lib-1.008009-Append-semicolon-to-setenv.patch
local-lib-1.008010-Fix-setting-undefined-variable-in-CSH.patch
local-lib-1.008010.tar.gz
perl-homedir.csh
perl-homedir.sh
perl-local-lib.spec
135 blocks
```

## インストールした日付

```
$ rpm -qa --last | grep perl-home
```

私の場合、`CentOS7` をインストールしたその日の日付。

要するに、インストールのときに全乗せでインストールした、自業自得の結果。


## 依存関係

```
$ rpm  -qpR  perl-local-lib-1.008010-3.el7.src.rpm 
perl(Carp)
perl(Cwd)
perl(CPAN) >= 1.82
perl(ExtUtils::Install) >= 1.43
perl(ExtUtils::MakeMaker) >= 6.42
perl(File::Path)
perl(File::Spec)
perl(inc::Module::Install)
perl(Module::Build) >= 0.36
perl(Capture::Tiny)
perl(File::Temp)
perl(Test::More)
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
```

## アンインストール

出来ないのは百も承知の上で、コマンドを叩いてみる。

```
$ sudo rpm -e perl-local-lib-1.008010-3.el7       
エラー: 依存性の欠如:
	perl(local::lib) は (インストール済み)perl-CPAN-0:1.9800-286.el7.noarch に必要とされています
	perl-local-lib = 1.008010-3.el7 は (インストール済み)perl-homedir-1.008010-3.el7.noarch に必要とされています
```
Node-REDでAmbientにデーター送信して可視化する


Node-REDからAmbientにデーターを送信して、可視化(グラフ化)する方法を説明します。

## Ambient

[Ambient](https://ambidata.io)は、マイコンから送られるセンサーデーターなどを受信し、蓄積し、可視化(グラフ化)するIoTデーター可視化サービスです。

![Ambient structure](https://ambidata.io/wp/wp-content/uploads/2016/09/AmbientStructure.jpg)

Ambientを使うには[ユーザー登録(無料)](https://ambidata.io/usr/signup.html)が必要です。ユーザー登録し、ログイン後のページで「チャネルを作る」ボタンをクリックするとチャネルが生成され、「チャネルId」と「ライトキー」が設定されます。Ambientにデーターを送信する時は、この「チャネルId」と「ライトキー」を使います。

![channel create](http://ambidata.io/wp/wp-content/uploads/2016/09/fig2-3.jpg)

Ambientの使い方の大まかな流れは[「Ambientを使ってみる」](https://ambidata.io/docs/gettingstarted/)をご覧ください。

## Ambientノードのインストールと初期設定

Node-REDのルートディレクトリーで次のようにAmbientパッケージをインストールします。

```sh
$ cd $HOME/.node-red
$ npm install node-red-contrib-ambient

```

インストールすると、Node-REDのパレットの「advanced」カテゴリーにAmbientノードが追加されます。

Ambientにデーターを送信するために、まずAmbientノードをパレットからワークスペースにドラッグし、パレット上でAmbientノードをダブルクリックして、データーを送信するチャネルの「チャネルId」と「ライトキー」を設定します。

![edit node](http://ambidata.io/wp/wp-content/uploads/2016/09/fig3-2.jpg)

## 擬似データーを送って動作確認

Ambientにデーターを送信する時は、データーを次のようなJSON形式でmsg.payloadにセットします。

```javascript
{"d1":データー1, "d2":データー2, "d3":データー3, ...}

```

データーは8種類、"d1"から"d8"まで送ることができます。Ambientはデーターを受信すると、受信時刻と合わせてデーターを蓄積します。Ambientサイトを見ると送信したデーターをグラフ化して見ることができます。グラフはデーターを受信するとリアルタイムに更新されます。


擬似データーを使ってAmbientの動作確認をしてみます。次のような簡単なflowを作りました。

![sample flow](http://ambidata.io/wp/wp-content/uploads/2016/09/fig4-1.jpg)

Functionノードで次のように"d1"、"d2"それぞれに0から99までの乱数をセットして次に送る関数を書きました。

```javascript
msg.payload={
    "d1": Math.floor(Math.random()*100),
    "d2": Math.floor(Math.random()*100)
};
return msg;

```

Injectノードをクリックすると"d1"と"d2"に乱数がセットされ、Ambientに送られてグラフ化されます。ただし、Ambientの最短受信間隔は5秒ですので、5秒未満で次のデーターを送っても受信されません。

[Ambientサイト](https://ambidata.io)で見ると、このようにグラフ化されるのが確認できます。

![chart](http://ambidata.io/wp/wp-content/uploads/2016/09/fig5-1.jpg)
ネットワークロードバランサ Maglevメモ

以下の記事を読んだ際のメモとポイントを引用。

http://www.school.ctc-g.co.jp/columns/nakai2/nakai201.html
http://www.school.ctc-g.co.jp/columns/nakai2/nakai202.html

ネットワークロードバランサMaglevについて解説されたもの。
DNSをスケールする際に難しい「コネクショントラッキング」と「DSR（Direct Server Return）」をどのようにして解決しているかわかりやすく解説してある。

### コネクショントラッキング
1つのセッションに伴うパケットを同じWebサーバーに転送する機能。

- 疑問
どのようにして複数のMaglevサーバーで情報を共有することなく、間違いなく同じWebサーバーを選択しているのか？

- 解決方法
「コンシステントハッシング」（5tupleの値を元に転送先Webサーバを計算する手法）により、どのパケットがどのMaglevサーバーに届いたとしても、同一の5tupleを持つパケットは、必ず同じWebサーバーに転送されるようにしている。転送先のWebサーバーが増減した場合にも対応するため、Maglevでは「Maglevハッシング」という独自のアルゴリズムを利用している。これにより特定のWebサーバが停止しても、残ったWebサーバに対して均等にパケットが再配分される。

### DSR
Webサーバーから返送されるパケットは、ロードバランサーを経由せずに、クライアントに直接送る仕組み。

- 疑問
DSRの構成でロードバランサーから転送先のWebサーバーにパケットを送信する際は、L2レイヤーでの転送が必要。小規模な環境では、すべてのWebサーバーを同一のサブネットに配置すれば、L2レイヤーでの転送が可能だが、複数のデータセンターにまたがって負荷分散するような際は、現実的な構成ではない。どうすればよいか？

- 解決方法
GRE(（Generic Routing Encapsulation）)トンネルによるオーバーレイネットワークを用いて、L3ネットワーク上でL2接続を実現。
※GREは、任意のネットワーク層プロトコルパケットを、別のネットワーク層プロトコルパケットに包み込んで送信する汎用のトンネリングプロトコル。
https://www.allied-telesis.co.jp/support/list/router/ar415s/docs/gre.pdf
vi vim を初めて使う人の為のとりあえずの手引

vi vimは初めてさわるとかなり癖がある。

私自身も最初は使い方が全く分からずイライラした。

初めて使う人の為に、手引をまとめたい。

下記を理解すれば、とりあえずは使えるようになるはず。

## vimの考え方
まず理解しなければいけないのは、

- カーソルの移動モード（カーソルが移動するだけ）
- 入力モード（文字入力ができる）

二つのモードがあるということだ。
（ヴィジュアルモードもあるが、それはvimの理解が深まってからでいいと思う）

通常のテキストエディタはいつでも入力できるが、vimは入力モードでないと入力できない。

この考え方のせいで、私は最初にvimを使った時、文字入力が全然できずに混乱した。

## カーソル移動の基本の基本
| キー| 動作 |
|:-----------:|:------------:|
| h | 左 |
| l | 右 |
| k | 上 |
| j | 下 |
| gg | 最上行 (goto) |
| G | 最下行 |

## カーソル移動モードから入力モードへの切替方法
| キー| 動作 |
|:-----------:|:------------:|
| a | カーソルの直後から入力 (append) |
| i | カーソルの位置から入力 (insert) |

## 入力モードからカーソル移動モードへの切替方法
| キー| 動作 |
|:-----------:|:------------:|
| esc | カーソル移動モードへ切替 |

## 削除方法
| キー| 動作 |
|:-----------:|:------------:|
| x | 1文字削除 (バッテン：抹殺、抹消) |
| dd | カーソルがある行を削除 (delete、同じキーを続けると行) |

※ddは削除した際に、コピーされる。（切取りのイメージ）

## コピー 貼付
| キー| 動作 |
|:-----------:|:------------:|
| yy | カーソルがある行をコピー (yank、同じキーを続けると行) |
| p | 貼付 (paste) |

##　参照元
[株式会社ジーライブblog　vim入門](http://blog.geelive-inc.com/archives/7)
Taskを使った非同期処理

#画面をフリーズさせない
非同期処理を使って、5秒カウント中も画面操作（画面の移動等）を受け付けるようにする。

```csharp
delegate void DelBar (int i);

private void SetBarValue(int i)
{
    progressBar1.Value = i;
}

private async void button1_Click(object sender, EventArgs e)
{
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 5;
    progressBar1.Value = 0;

    await Task.Run(() =>
    {
        for (int i = 1; i <= 5; i++)
        {
            Thread.Sleep(1000);

            // コントロールを生成したスレッドではないスレッドから操作することはできない
            // progressBar1.Value = i;

            // Invokeメソッドを使う
            progressBar1.Invoke(new DelBar(SetBarValue), new object[] { i });
        }
    });

    // 5秒後に実行
    Debug.WriteLine("done.");
}
```

#非同期処理の実装方法
調査したところ、下記の3つの方法で実装できるようだ。

```csharp
private void button2_Click(object sender, EventArgs e)
{
    // .NET4.0～使用可
    Task t1 = Task.Factory.StartNew(Worker);

    // .NET4.0～使用可
    Task t2 = new Task(Worker);
    t2.Start();

    // .NET4.5～使用可
    Task t3 = Task.Run(() => Worker());

    // 全てのタスクが終了するまで待機
    Task.WaitAll(t1, t2, t3);
}

/// <summary>
/// ワーカスレッドで実行されるメソッドです。
/// </summary>
private void Worker()
{
    for(int i=0; i<10; i++)
    {
        Debug.WriteLine(i);
        Thread.Sleep(1000);
    }
}
```
t3、t1、t2 の順に、使用を検討すればよいようだ。
t3 で実装するのが最も望ましいと判断した。

#参照
■"Task.Factory.StartNew" vs "new Task(…).Start"
　https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/

In general, I always recommend using Task.Factory.StartNew unless the particular situation provides a compelling reason to use the constructor followed by Start.


■連載! とことん C#: 第 32 回 並列 (Parallel) で行こう
https://code.msdn.microsoft.com/windowsdesktop/32-Parallel-af4950ae
簡易なpostgresテスト環境を作る手順

手元で簡易なテスト用PostgreSQL環境作る手順を簡単にまとめておきます。

DockerでPostgreSQLサービス起動：

```
$ docker run --name postgres -d -p 5432:5432 postgres
```


コンテナーの中に入る：

```
$ docker exec -it postgres bash
```


`psql`でユーザとデータベースを作る：

```
# su - postgres
No directory, logging in with HOME=/

$ psql  
psql (9.5.4)
Type "help" for help.

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# CREATE ROLE foobar LOGIN CREATEDB PASSWORD 'foobar';
CREATE ROLE

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 foobar      | Create DB                                                  | {}

postgres=# CREATE DATABASE foobar OWNER foobar;
CREATE DATABASE

```
イベントハンドラの実装方法

#ノーマルな書き方

```csharp
button1.Click += new EventHandler(Button1_Click);
```

#省略した書き方

```csharp
button1.Click += new Button1_Click;
```

#匿名メソッドを使った書き方

```csharp
button1.Click += delegate(object sender, EventArgs e){
  // 処理
}
```

#ラムダ式を使った書き方

```csharp
button1.Click += (sender, e) => {
 // 処理 
}

```
gitを使いやすくする

まんま参考元なんだけど自分用に置いておかないと忘れる

```
$ vim ~/.bashrc
```

下記を追加

```bash:.bashrc
# gitの補完する
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash

# gitのブランチ名表示する
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\h\[\033[00m\]:\W\[\033[32m\]$(__git_ps1 [%s])\[\033[00m\]\n\$ '

# hubをgitで使えるようにする
eval "$(hub alias -s)"
```



参考元
http://qiita.com/koyopro/items/3fce94537df2be6247a3
トラブルシューティング | Googlemap.js


Googlemap.jsを使っていて、本番環境などだけエラーがでるとき。

![image](https://qiita-image-store.s3.amazonaws.com/0/17342/40082754-d32a-4b2a-98ec-a58ba5bb42b4.png)

- ここからドメインを追加する
  - https://console.developers.google.com/apis/credentials?project=mindful-acre-142405&hl=ja
  - https://console.developers.google.com/apis/credentials/key/0?project=compact-record-142414&hl=ja

---

カテゴリ別に仕分けした目次を用意しております。
合わせてご利用下さい。

[技術ノート目次](https://docs.google.com/document/d/1AMkiC57DkmFMMMHS-78vw23T_7G1yXn_n5RuCXnrwoE/edit)
電子工作 > 電圧変動 60Hz

```txt:動作環境
某基板
Tektronix TDS2024C
```

12V駆動の某基板。
その基板のあるコネクタの電圧をデジボルで測定していたらマイナス10Vやマイナス6Vなどどうもよく分からない電圧が立つ。
その電圧も測る度に違う。

TDS2024Cが使える環境だったので測定してみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ebc1add2-d9c1-aaf8-df5c-357f4a614fcb.png)

周期59.9522Hzとなっており、60Hzのノイズを拾っているようだ。
コネクタからケーブルを伸ばして測定していたが、それがノイズを拾うアンテナになっていたようだ。

ケーブルの具合により振幅が変化する。

事象の理由が分かった。
XCode8によるiTunesConnectアップロード成功後にバイナリが消える

- 今まではアップロードに失敗するケースはあったが、成功したのにバイナリが消える現象にはであったことがない！
- 証明書周り色々弄ってたからそこが怪しそうだと踏んでいたが、Appleから下記のissueメールが届いてた。

```
This app attempts to access privacy-sensitive data without a usage description.
The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
```

### 解決法

- info.plistに【Privacy - Camera Usage Description】キーを作成して、カメラ撮影する理由を記述する
- 例）カメラ撮影に必要です

他にも色々対象操作があるが、何故カメラだけ記述しなければならなかったのかは今のところ謎・・・。
Apple申請も無事通ったので、多分これで大丈夫・・・と思いたい。

参考URL:
[[iOS 10] 各種ユーザーデータへアクセスする目的を記述することが必須になるようです](http://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/)
[iOS10ではカメラアクセスなどの目的を明示しないと強制終了する](http://qiita.com/Takumi_Mori/items/f53c6eec1676d3df59dc)
UnityプロジェクトをJenkinsを使用してXCode8対応した

XCode7で正常にビルドできていたところからどう修正したかの備忘録です。

環境
- Unity5.3.5f1
- XCode8.0
 
## xcodebuildコマンドでめっちゃエラーでる

```bash:シェルスクリプト
xcodebuild -project "${XCODE_PROJECT_FILE}" \
  -configuration "${CONFIGURATION}" \
  CODE_SIGN_IDENTITY="${CODESIGN_NAME}" \
  PROVISIONING_PROFILE="${PROVISIONING_PROFILE}"
```

```
Signing for Unity-iPhone requires a development team. Select a development team in the project editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.0'
```

このような感じでビルドが成功しない。

- どうやらXCode8からCodesign/ProvisioningProfileは **Automatic** にすることが推奨されている
- xcodeprojectの設定とxcodebuildによる指定が異なる場合、Archive化できない

### 解決法

xcodeproj(project.pbxproj)の設定をUnityの **XCodeAPI** で上書き

```csharp:XCodeProjectUpdater.cs

  [PostProcessBuild]
  static void OnPostProcessBuild(BuildTarget buildTarget, string path)
  {
    string projPath = buildPath + "/Unity-iPhone.xcodeproj/project.pbxproj";

    PBXProject proj = new PBXProject();
    proj.ReadFromString(File.ReadAllText(projPath));

    string target = proj.TargetGuidByName("Unity-iPhone");

    // 色々設定更新(実際はJenkinsのオプション引数で各種情報を取得)
    proj.SetBuildProperty(target, "DEVELOPMENT_TEAM", teamPrefix); // チーム名はADCで確認できるPrefix値を設定する
    proj.SetBuildProperty(target, "CODE_SIGN_IDENTITY", codesignName);
    proj.SetBuildProperty(target, "PROVISIONING_PROFILE_SPECIFIER", provisioningProfileName); // XCode8からProvisioning名で指定できる

    proj.WriteToFile(projPath);
  }
```

Jenkins側のシェルではオプションを指定せずにビルドを行う

```bash:シェルスクリプト
xcodebuild -project "${XCODE_PROJECT_FILE}" -configuration "${CONFIGURATION}"
```

上記処置でビルドは無事成功したが、
Unity Cloud Buildを利用することになる日は近い・・・！


参考:
[Xcode 8: xcodebuildで、Automatic Signingに対応する](http://qiita.com/SCENEE/items/c170bca6b8e8bcb2769f)
[[iOS 10] Xcode 8 の新しい Signing 機能について](http://dev.classmethod.jp/smartphone/xcode-8-signing/)
[What’s New in Xcode](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/introduction.html)
MacのMongoDB2.4系を3.2にバージョンアップした

## WARNING!!

3.2にあげるには3.0.7以降にしといたほうがいいっぽい
>
To upgrade an existing MongoDB deployment to 3.2, you must be running 3.0.7 or later.
>
To upgrade from version 2.6-series, you must upgrade to version 3.0.7 or later before upgrading to 3.2. For the procedure to upgrade from 2.6-series to 3.0-series, see Upgrade MongoDB to 3.0.

https://docs.mongodb.org/manual/release-notes/3.2-upgrade/


3.0にあげるには2.6以降にしといたほうがいいっぽい
>
To upgrade an existing MongoDB deployment to 3.0, you must be running 2.6. If you’re running a version of MongoDB before 2.6, you must upgrade to 2.6 before upgrading to 3.0. See Upgrade MongoDB to 2.6 for the procedure to upgrade from 2.4 to 2.6. Once upgraded to MongoDB 2.6, you cannot downgrade to any version earlier than MongoDB 2.4.

https://docs.mongodb.org/manual/release-notes/3.0-upgrade/

とりあえず2.4から直接3.2にあげてみて、動いたの確認したからいいかなぁって。

## インストールと既存の置き換え

mongod動いてたら止めとく

```console:
$ cd ~/.bin/
$ mv mongodb/ mongodb24/
$ wget https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.2.0.tgz
$ tar xvfz mongodb-osx-x86_64-3.2.0.tgz
$ mv mongodb-osx-x86_64-3.2.0/bin/ mongodb32/
$ ln -s mongodb32/ mongodb
$ mongod -version
db version v3.2.0
git version: 45d947729a0315accb6d4f15a6b06be6d9c19fe7
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64
```


## ストレージエンジンを変更する
```sh:
$ cd ~/Document
$ mkdir mongodb_bk
$ cd mongodb_bk/
$ cp -r /usr/local/var/mongodb .
$ mongodump --out mongodb_dump
$ rm -rf /usr/local/var/mongodb/*
$ cp /usr/local/etc/mongod.conf /usr/local/etc/mongod.conf.24org
$ vim /usr/local/etc/mongod.conf
```

```:mongod.conf
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
  engine: "wiredTiger"
net:
  bindIp: 127.0.0.1
```

mongod立ち上げたあとに

```sh:
$ mongorestore mongodb_dump
```

参考
http://qiita.com/ymmtmdk/items/78110898daa7bbbf9c64
http://qiita.com/kuwa_tw/items/0a5704e9e505cffeae34
http://qiita.com/shibacow/items/603237da73710bab29f0