OmniAICreator/Qiita-1.07M huggingface dataset:
TestFlight Beta Testing 内部テスト で PUSH通知を利用

## 概要
TestFlight Beta Testingの内部テスト時に、PUSH通知を利用するには、**Production用の証明書(Certificate)**が必要です。
Development用の証明書のみでは、PUSHが届きません。

## Production用証明書の設定方法
1. [Certificate List](https://developer.apple.com/account/ios/certificate/certificateList.action)を開く
2. 右上の「+」をクリック
3. Productionの「Apple Push Notification service SSL (Production)」を選択してContinue
4. 流れに従うと証明書が発行される
5. できた証明書をPUSHサーバーで利用する。今回は[Parse.com](https://parse.com/)を利用していたので、作ったProduction用の証明書から.p12ファイルを作成し、Parseにアップロードしました。
（ParseでのPUSHの使い方は[Parseの公式ドキュメント](https://parse.com/docs/push_guide#top/iOS)を参照してください。）

## 補足
- Production用の証明書が作成されていない場合、iTunes connectへのアップロード後、以下のようなメールが届きます。

> **Missing Push Notification Entitlement** - Your app appears to include API used to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the "aps-environment" entitlement. See "Provisioning and Development" in the Local and Push Notification Programming Guide for more information. If your app does not use the Apple Push Notification service, no action is required. You may remove the API from future submissions to stop this warning. If you use a third-party framework, you may need to contact the developer for information on removing the API.


- これは推測ですが、TestFlight Beta Testingでは、内部テストであっても、Sandboxではなく、ProductionのPUSHの仕組みを利用しているためだと考えられます。
Eclipseでtest/unitを使って動かなかった場合の対処法

Eclipseでtest-unitを使ったら，以下のようなエラーが出て動かなかった。解決方法を備忘のためにメモ
※環境はRuby2.2.0，test-unit3.0.9，Eclipse4.4.0(Luna)

```
略/dltk-testunit-runner.rb:252:in `block in <top (required)>': uninitialized constant Test::Unit::UI::SILENT (NameError)
```

調べたところ上記エラーメッセージのファイル，252行目を以下のように書き直せばよいとのこと。

```dltk-testunit-runner.rb
autoRunner.runner_options[:output_level] = Test::Unit::UI::Console::OutputLevel::SILENT
```

これで無事に動いた。
gollumのマクロを使って待ち時間を表示

gollumでは自分で定義したマクロを使うことができる。

[Macros · gollum/gollum Wiki](https://github.com/gollum/gollum/wiki/Macros)

某遊園地の待ち時間をNokigiriを使って表示してみた。

マクロの作成
-----------

上記サイト通り、Gollum::Macroクラスを継承し、renderメソッドをoverrideしたら完成だ。クラス名がそのままマクロ名となる。ちなみに、Nokogiriはgollumで使っているのでrequireせずともそのまま使える。

~~~ruby

class Gollum::Macro::WaitDisney < Gollum::Macro
    URL = "http://s.tokyodisneyresort.jp/tdl/atrc_list.htm"
    def render(*args)
        charset = nil
        html = open(URL) do |f|
            charset = f.charset # 文字種別を取得
            f.read # htmlを読み込んで変数htmlに渡す
        end

        # htmlをパース(解析)してオブジェクトを生成
        doc = Nokogiri::HTML.parse(html, nil, charset)
        #
        result  = "<table><thead><tr>"
        result += "<th align=\"center\">アトラクション名</th>"
        result += "<th align=\"center\">待ち時間</th>"
        result += "<th align=\"center\">更新時間</th>"
        result += "</tr></thead><tbody>"
        list_wait_atractions( doc, args ).each do |k ,v|
            result += "<tr>"
            result += "<td align=\"left\">#{k}（#{v[:run]}）</td>"
            result += "<td align=\"left\">#{v[:wait]}</td>"
            result += "<td align=\"left\">#{v[:update]}</td>"
            result += "</tr>"
        end
        result += "</tbody></table>"
        result
    end

    def list_wait_atractions doc, atractions
        lists = Hash.new
        atractions.each do |href|
            doc.xpath("//a[@href=\"#{href}\"]").each do |node|
                title      = node.xpath('div[@class="about"]/h3').inner_text
                run        = node.xpath('div[@class="about"]/p[@class="run"]').inner_text
                waittime   = node.xpath('div[@class="time"]/p[@class="waitTime"]/strong').text
                if waittime.nil? || waittime.empty?
                    waittime = "-"
                end
                updatetime = node.xpath('p[@class="update"]').text
                lists[title] = { wait: waittime, update: updatetime, run: run }
            end
        end
        lists
    end
end
~~~

使い方
-----

こんな感じでmarkdownに貼り付ける。

~~~

<<WaitDisney(
"/tdl/atrc/al_western.html",
"/tdl/atrc/al_carib.html",
"/tdl/atrc/tl_grand.html",
"/tdl/atrc/tl_jets.html",
"/tdl/atrc/tl_monster.html",
"/tdl/atrc/tt_minnie.html",
"/tdl/atrc/tt_toon.html",
"/tdl/greeting/tt_mickey.html",
"/tdl/atrc/wb_omnibus.html",
"/tdl/atrc/fl_philhar.html",
"/tdl/atrc/fl_small.html",
"/tdl/atrc/fl_castle.html",
"/tdl/atrc/fl_alice.html",
"/tdl/atrc/fl_pooh.html",
"/tdl/atrc/fl_pinocchio.html",
"/tdl/atrc/fl_snow.html",
"/tdl/atrc/wl_country.html",
)>>

~~~

公式ページが使いづらいと思って、行きたいところだけをリストアップするつもりで作ったが、作っているうちに公式ページに慣れてきてしまって結局ほとんどみなかった。
HTTP/2の特徴について

http://techblog.yahoo.co.jp/infrastructure/http2/introduction_to_http2/

の内容をまとめた。


## バイナリでの通信

通信データは従来のテキスト形式から、バイナリ形式で表現されるようになる。


## ストリームによる多重化

1コネクションで同時に複数コネクション(仮想的な)が張れる。


## ヘッダーの圧縮

現在のHTTP通信では、同じヘッダー情報が毎回送信されている。

これがヘッダーの差分情報だけ送信されるようになるとのこと。


## サーバープッシュ

例として、htmlページのリクエスト時挙動が紹介されている。

![img](http://i.yimg.jp/images/tecblog/2014-1H/http2/http2_server_push.png)

プッシュと聞いて "サーバー側でのイベント発生時にクライアントへ通知する" ようなものを想像していたが、そういう類のものではない？
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１２）Map機能を使う

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# キャラクターをタイル状に並べて表示する「Map」機能を使う
それでは、表示するコードを書いてみます。
前回と同じく、「**gameControl.coffee**」の「**when 1**」の最後にある「**@nextjob()**」の直前に、マップ定義の配列を作成します。

```coffeescript

                map = [ 
                    [0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 5, 5, 5, 5, 5, 5, 5, 0]
                    [0, 5, 5, 5, 0, 5, 5, 5, 0]
                    [0, 5, 5, 5, 0, 5, 5, 5, 0]
                    [0, 5, 5, 5, 0, 5, 5, 5, 0]
                    [0, 5, 5, 5, 0, 5, 5, 5, 0]
                    [0, 5, 5, 5, 5, 5, 5, 5, 0]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0]
                ]
```
Map配列の定義はenchant.jsそのままなので、地形データ作成ツールで作ったものをそのまま使えます。
この配列のデータで使っている数字は、後で**addObject**するときに指定する**image**のキャラ番号です。
通常キャラの**animlist**で指定するのと同じ数字です。
次にこの配列定義の真下に、下記のコードを追記してください。

```coffeescript
                mapobj = addObject
                    type: MAP 
                    map: map 
                    mapcollision: map 
                    x: SCREEN_WIDTH / 2 
                    y: SCREEN_HEIGHT / 2 
                    image: 'bear'
                    width: 32
                    height: 32
                GLOBAL['map'] = mapobj
```
「**type**」で「**MAP**」を指定しています。
これでこのオブジェクトはMAPオブジェクトになります。
「**map**」パラメータで先ほど作成した配列を渡しています。
「**mapcollision**」は、インスタンスメソッド「**@isCollision(x, y)**」で判定するための配列を指定します。
このCollision配列は、基本的には0と1で作成するのですが、「**0とそれ以外**」という動作をするので、mapで使用するために作成した配列をそのまま使用しても構いません。

次に、「**bearChara.coffee**」を開き、「**when 0**」の最後に、下記のコードを追記します。

```coffeescript
                map = GLOBAL['map']
                if (map.isCollision(@x, @y))
                    @animnum = 1
                else
                    @animnum = 0 
```
修正／追記が終わりましたら、保存してコンパイルしてください。
Webブラウザをリロードし、「z」キーを押すと左上に作成した配列と同じ形の絵が出ていると思います。
そして、クマをジャンプさせ白いクマの上に重なると自キャラの茶色いクマが白いクマに変わると思います。

# ExtendMapについて
enchant.jsのプラグインである「**extendMap.enchant.js**」もデフォルトで読み込まれるようになっています。
ExtendMapを使用する場合は「**type**」パラメータに「**EXMAP**」を指定し、ExtendMapで使用する2つのマップ配列のうち2つ目は、

```coffeescript
                    map2: map2
```
のように「**map2**」パラメータで指定します。
（当然ですが、ExtendMapはenchant.js使用時のみ利用可能です）

[Map機能サンプル](http://www.prominence.tv/~kow/enforce/game12/)

[チュートリアル（１１）](http://qiita.com/digitarhythm/items/382b836788c84eaf58f4) <--- ⬛︎ ---> [チュートリアル（１３）](http://qiita.com/digitarhythm/items/60b6df311fcb34d6752e)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
TeXをSublime Text2で使う(Mac編)【追記】

以前[TeXをSublime Text2で使いはじめる(Mac編)](http://qiita.com/poemn/items/cc39de2263b4cf00a57d)で、MacでSublime Text2でコンパイルする方法を紹介しました。
今回は、より新しいクラスドキュメントのTeXをコンパイルする方法を紹介します。

## TeXのクラスドキュメントについて
TeXではドキュメントクラスでクラスの種類を指定します。それぞれの用途と種類は以下のとおりです。

|    用途    |   欧文  |  和文(標準) | 和文(新)  |
| :--------: | :-----: | :---------: | :-------: |
|    論文    | article | (u) and | jsarticle |
| 長い報告書 |  report |  (u)jreport |     -     |
|     本     |   book  |   (u)jbook  |   jsbook  |

※(u)はunicodeに対応したtexのクラス
上記の表では、`*` < `j*` < `uj*` < `js`のように`js*`が新しくなっています。
今回はこの`js*`のクラスドキュメントがコンパイル出来るように設定を変更します。

## 「LaTeXTools」の設定
Users/ユーザ名/Library/Application Support/Sublime Text 2/Packages/LaTeXTools/builders にある「traditional.py」を開きます。
「traditional.py」の18行目にある

```Python:traditional.py
 DEFAULT_COMMAND_LATEXMK = ["latexmk", "-cd",
 				"-e", "$pdflatex = '%E -interaction=nonstopmode -synctex=1 %S %O'",
 				"-f", "-pdf"]
```
この部分をコメントアウトして、以下のように書き換えます。

```Python:traditional.py
DEFAULT_COMMAND_LATEXMK = ["latexmk", "-cd",
				"-e", "$latex = 'uplatex %O -interaction=nonstopmode -synctex=1 %S'",
				"-e", "$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B'",
				"-e", "$bibtex = 'upbibtex %O %B'",
				"-e", "$makeindex = 'mendex %O -U -o %D %S'",
				"-e", "$dvipdf = 'dvipdfmx %O -o %D %S'",
                "-e", "$pdf_mode = '3'",
                "-e", "$pdf_update_method = '0'",
                "-e", "$pdf_previewer = 'open -a preview.app'",
				"-f", "-norc", "-gg", "-pdfdvi"]
```


これでコンパイルが出来るようになります。

## 小ネタ
jsarticle とjsbook はありますが、jsreportはありません。
しかし、以下のように記述するとjsreportに相当します。

```tex:sample.tex
\documentclass[a4paper,report]{jsbook}
\begin{document}
これは新しいTeXのクラスドキュメントです。
\end{document}
```

上の図がオプションに"report"を記述しない場合の出力、下の図が記述した場合の出力になります。

![jsbook.png](https://qiita-image-store.s3.amazonaws.com/0/44446/f49d48f0-e898-02fb-6624-4e006a8e563e.png "jsbook.png")


![jsreport.png](https://qiita-image-store.s3.amazonaws.com/0/44446/594505e6-fde2-bc0e-1665-65f1b4d42167.png "jsreport.png")




## 参考
 * LATEX2ε 美文書作成入門 - 奥村晴彦/黒木裕介 著
 * Sublime Text の変更点 - TeX Wiki  
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?cmd=diff&page=Sublime%20Text
正規表現で論理積（AND）を実現する

##論理和（OR）の場合
ORは簡単にできます。例えば`'apple'`または`'orange'`が含まれているかどうか調べる場合は以下のようになります（コードはJavaScript）。

```js:
/apple|orange/
```

##論理積（AND）の場合
ANDは、例えば`'apple'`と`'orange'`の両方が含まれているかどうか調べる場合は以下のようにすればいいらしいです。

```js:
/^(?=.*apple)(?=.*orange)/
```

##なんで！？

`(?=)`は位置指定子というものの一つで、`x(?=y)`としたときは、`'x'`に`'y'`が続く場合のみ`'x'`にマッチします（肯定先読み）。
つまり、あくまでも位置を指定しているというわけです。
上の例の場合、まず先頭をスタート位置とし、`^`（先頭）→`.*`（何かしらの文字が0回以上）→`apple`と続いているかチェックします。さらにまた先頭から、`^`（先頭）→`.*`（何かしらの文字が0回以上）→`orange`と続いているかチェックします。

順を追って見ていくと、

```js:
"lemon, apple, grape, orange"
```

という文字列があったときに、`^`の時点で`l`の前にマッチします。

```js:
"【ここ】lemon, apple, grape, orange"
```

次に`(?=.*apple)`の時点で、`lemon, apple`がそれに該当します。

```js:
"【ここから】lemon, apple【ここまで】, grape, orange"
```

さらにその位置に対して、`(?=.*orange)`が成立するか見ます。

```js:
"【ここから】lemon, apple, grape, orange【ここまで】"
```

`.*`の部分は`lemon, apple, grape, `にあたり、その後`orange`が出てきて、この文字列（の先頭）は`/^(?=.*apple)(?=.*orange)/`にマッチするということになります。

これを利用して、3つ以上のANDを表現するのにも使えます。

```js:
/^(?=.*apple)(?=.*orange)(?=.*peach)/.test("lemon, apple, grape, orange"); //false
```
vimメモ

長らくWindowsでサクラエディタを使っていましたが、Linuxではvi、MacではCotEditorを申し訳程度に使っているだけでした。で、いい加減各プラットフォームでちゃんと使えるテキストエディタが欲しくなり、vimを使うことになりました。
ここでは、vimで自分がよく使う操作方法、各プラットフォームごとのツールをメモします。**まだ調査中で、使い慣れてきたら更新します。**

# 操作方法

## カーソル移動

- $…行末
- ^…行頭
- gg…ファイル先頭
- G…ファイル末尾
- Ctrl+f…1画面次
- Ctrl+b…1画面前
- Ctrl+g…現在位置を表示

## 編集

- u…アンドゥ
- Ctrl+r…リドゥ
- v…領域選択を開始
- Ctrl+v…矩形選択を開始
- Shift+v…行選択を開始
- y…コピー
- d…カット
- p…ペースト

## 検索・置換

- /word…wordを検索(n…次の候補、N…前の候補)
- ?word…wordを逆方向に検索

## キーマクロ

- qa…操作の記録を開始し、レジスタaに保存
- q…操作の記録を終了
- @a…レジスタaに保存された操作を再生
- 5@a…レジスタaに保存された操作を5回再生

## ウィンドウ分割

- :split…画面を上下に分割
- :vsplit…画面を左右に分割
- :q…ウィンドウを削除
- Ctrl+w w…別のウィンドウに移動

## その他設定

- :set tabstop=4…タブ幅を設定
- :set autoindent…自動インデントを設定
- :set fileencoding=utf-8…文字コードを設定
- :set fileformat=改行コードをdos(CR+LF)に設定
- :set number=行番号を表示

## プラグイン

ToDo これから調査
`NeoBundle`を使うらしい。

## 関連ファイル設定

ToDo これから調査

## 設定のエクスポート、インポート

ToDo これから調査
".vimrc"らしい。

# プラットフォームごとのツール

## Linux

- `vim`コマンド

## Windows

- [Vim](https://chocolatey.org/packages/vim)
  - `choco install vim`
- [GVim](http://www.vector.co.jp/soft/win95/writing/se117961.html)
- `cygwin`の`vim`コマンド

## Mac

- [macvim](https://code.google.com/p/macvim/)
  - Homebrewでインストールできるらしいが、情報が錯綜している？

# 参考

- [僕がサクラエディタからVimに乗り換えるまで](http://blog.jnito.com/entry/20120101/1325420213)
- [vimの使い方](http://seesaawiki.jp/w/yoynizi9691/d/vim%A4%CE%BB%C8%A4%A4%CA%FD)
- [チュートリアルでvimエディタの使い方を覚えよう](http://nanasi.jp/articles/howto/install/tutorial.html)
- [初心者でもわかるvimの使い方入門](http://matome.naver.jp/m/odai/2133561662251169101)
- [脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定](http://qiita.com/jnchito/items/5141b3b01bced9f7f48f)
- [NeoBundleの導入](http://qiita.com/puriketu99/items/1c32d3f24cc2919203eb)
- [そろそろしっかりvimを使う。dotfilesのgithub管理とvundleの導入。](http://holypp.hatenablog.com/entry/20110515/1305443997)
- [vimエディタで「文字コード、改行コードを変更して保存する。」](http://advweb.seesaa.net/article/3074705.html)
vagrantにRuby on Rails環境構築

### macにrails環境を構築したのでやったことと詰まったところをメモとして残します。

Ruby,RoR未経験なので、学習もかねてRoRで自分のサイトを作り直そうかと思い、とりあえず開発環境を構築しました。

全体の流れはこの記事を参考にしました。
http://qiita.com/yamagh/items/61e540765fa4d2152dc4

### やったこと
* vagrantインストール
* vagrant本体インストール
  * centOS box追加
* rubyインストール
* railsインストール

### 詰まったところ
* rbenvインストール 
  * fiddleでこける

```
    libffi.a: could not read symbols: Bad value
```
こちら参考にするとlibffi-develを別でインストールする必要があるようだ
http://shiro-16.hatenablog.com/

  * nokogiriでこける

libxml2を別途インストールする
http://www.e-mist.com/articles/libxml2_libxslt_for_nokogiri_install_on_centos

* rails起動
  * こけた！

```
rails s
`autodetect': Could not find a JavaScript runtime.
```
therubyracerをGemfileに追加しろとのこと。（正確にはコメントアウトを外す）
http://kiyotakagoto.hatenablog.com/entry/2013/05/28/235727

* 起動後
  * 起動してるが、localhost:3000にアクセスできない
  * Vagrantfileでポートフォワード設定
  * vagrant側でiptables穴開け
  * それでもダメ。
  * 4.2から```rails s```のデフォルトホストが変わったらしい。-bでバインドする必要がある。vagrantホストからアクセスしたいので、0.0.0.0をバインドする。

```
rails s -b 0.0.0.0
```
http://qiita.com/Salinger/items/20f466ffe7cc0c04b010#%E6%8E%A5%E7%B6%9A%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB

[Rails 4.2 リリースノート](http://railsguides.jp/4_2_release_notes.html)

### アクセスできた！とりあえずここまで
Retina Display向け.5pxのborderまとめ

# Retina Display向けCss小数点の扱いについて

Macbook ProやiPhoneなどRetina Displayで.5pxのborderでStyle定義すると綺麗な線が表現できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/47955/8e1ae54c-eec4-29e8-9d77-28259f1e36d5.png" width="320px" />


Macbook ProやiPhoneなどRetina Displayで.5pxのborderを表示しながら、非Retina向けには1pxのborderを敷きたい場合、以下の方法pxを指定するとRetina/非Retinaどちらとも1コードで対応可能です。

```
.hoge{
  border-bottom: .99px solid #eee;
}
```

こちらは以下のブラウザのみ.5pxに表示されます。それ以外は通常の1pxとなります。

## 対応ブラウザ

- Safari
- iOS Safari
- Firefox

Chrome, Operaについては1pxで表示されます。ちなみに.98pxではSafariやiPhoneでも1px表示になってしまいます。
**すべて最新版のみ確認しています。古いバージョンについては1pxで表示されるようです。**

ちなみに、

```
.hoge{
  border-bottom: .5px solid #eee;
}
```

とするとChromeとOperaではborderが0pxと同じ扱いになり表示されなくなるので気をつけましょう。とくに以下のようにpixel-ratioで高解像度向けのStyleを定義する際に、

```
@media screen and (-webkit-min-device-pixel-ratio: 2){
  div{
    border-width: .5px;
  }
}
```

としてしまうと、Android ChromeやRetina DisplayのMacbook pro Chromeなどでborderが消えてしまいます…。
この辺りpixel計算がデバイス・ブラウザによって異なるための現象だと思いますが、詳しくはこちらの記事などが参考になると思います。

- [いまさら聞けないRetina対応のための「ピクセル」の話](http://parashuto.com/rriver/development/pixel-related-info-for-coping-with-retina-displays)


#### 追記1:

``border-radius``や``border-style:dotted``を使うと.5pxのborderはどのブラウザでも1pxになってしまいます。
border-radiusの時は、box-shadowを代用することで.5pxが実現できます。dottedについては諦めて、そのつもりでデザインすることをお勧めします。

#### 追記2:

Desktop Safariでみると.99pxのままだと逆にborderが0px扱いになるようでした。この場合、以下のようにしておくと良いです。

```
@media screen and (-webkit-min-device-pixel-ratio: 1){
  div, button, li, aside, header, main, section{
    border-width: 1px;
  }
}
@media screen and (-webkit-min-device-pixel-ratio: 2){
  div, button, li, aside, header, main, section{
    border-width: .99px;
  }
}
```
Unityのシーン一覧を取得する

## EditorBuildSettingsから拾う
```
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class SceneFinder
{
    static SceneFinder ()
    {
        Debug.Log ("-----  EditorSettings -----");
        foreach (var scene in EditorBuildSettings.scenes) {
            Debug.Log (scene);
        }
    }
}
```

ただし、この方法だとビルド設定で登録してあるシーンしか拾えない

ので、

## AssetDatabaseから拾う
```
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class SceneFinder
{
    static SceneFinder ()
    {
        Debug.Log ("---- AssetDatabase ----");
        foreach (var guid in AssetDatabase.FindAssets("t:Scene")) {
            var path = AssetDatabase.GUIDToAssetPath (guid);
            Debug.Log (AssetDatabase.LoadMainAssetAtPath (path));
        }
    }
}
```

これならAssets配下に存在するシーンを全て取得できる。

他にはSystem.IO.Directoryを使ってシーンっぽいファイル名を検索しまくる、なんて方法もありそうですね。
Aerospike環境をローカルに構築してみる

#Aearospike とは？
ざっくりいうと、NoSQL型データベースです。
Yahoo! Cloud Serving Benchmark (YCSB)の結果だとCassandraとMongoDBより10倍ちかく早いらしいです。
英語ですが、情報源はこちら
http://www.aerospike.com/blog/thumbtack-ycsb-benchmark/

#ローカル環境
* Windows 7 64bit
* VM player 5.0.1
* Ubuntu 14.10

# download & Install
まずはサーバー

```
wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
tar -xvf aerospike.tgz
cd aerospike-server-community-*-ubuntu12
sudo ./asinstall # will install the .rpm packages
sudo service aerospike start
```

次に管理ツール

```
wget -O aerospike-amc.deb http://www.aerospike.com/download/amc/3.5.2/artifact/ubuntu12
sudo dpkg -i aerospike-amc.deb
sudo service amc start
```

#いざ動作確認！
http://54.173.217.121:8081/#dashboard
にアクセスすると、管理画面が見えるはず。
最初はNamespacesにtestだけが存在するはず


aql と呼ばれるsqlっぽいものでもDBにアクセスできます。

```
$ aql
Aerospike Query
Copyright 2013 Aerospike. All rights reserved.

aql> show namespaces
+------------+
| namespaces |
+------------+
| "test"     |
+------------+
```

1 rows in set (0.002 secs)

ちなみに、RDBMSと言葉が違うので対応表

| RDBMS| Aerospike | 
|-----------|------------|
| Database or Tablespace   |  Namespaces |
| Table      |  Set        |
| Row | Record |
| Column| Bin |

Binの型にはInteger,String,BLOB,List,Mapがあるらしい

次は/etc/aerospike/aerospike.confの中でも覗いてみようと思う。

#参考ページ
http://www.aerospike.com/docs/operations/install/linux/ubuntu/
http://www.aerospike.com/docs/amc/install/linux/ubuntu/
PHPバージョン確認コマンドとphpinfo情報表示コマンド

PHPバージョン確認コマンド
===

PHPの設定情報やバージョン情報を確認する際、phpinfo()を利用する事が多いと思いますが、phpコマンドでも確認出来ます。
以下コマンドを実行すると、PHPバージョンを確認出来ます。

```
$ php -v
PHP 5.X.X (cli) (built: XXX XX 20XX XX:XX:XX)
Copyright (c) 19XX-20XX The PHP Group
Zend Engine vX.X.X, Copyright (c) 19XX-20XX Zend Technologies
$
```

PHP設定情報の表示コマンド
===

以下コマンドを実行すると、phpinfo()をコールして、php.iniに設定されているPHP設定情報を表示出来ます。configureオプションを確認したり、php.iniの設定を変更した後、設定が反映されているか確認するのに利用出来ますね。configure行でPHPコンパイル時のオプションも確認出来ますね。

```
$ php -i | head
phpinfo()
PHP Version => 5.X.X

System => Linux XXXXXXXXXX 2.X.XX-XXXX.XXXX #1 SMP XXX XXX X XX:XX:XX EDT 20XX x86_64
Build Date => XXX XX 20XX XX:XX:XX
Configure Command =>  './configure'  '--with-apxs2=/usr/local/apache2/bin/apxs' '--enable-mbstring' ～
　(途中省略)
```

以下は特定のPHP設定情報(例えばmemory_limit)だけ表示する例です。

```
$ php -i | grep memory_limit
memory_limit => 128M => 128M
```

以上になります。
コマンドパスを自動で通し npm install -g しない

## 追記

- @hokaccha さんの指摘反映

## npm install -g cosidered harmful

何かコマンドラインツールなどが必要なために `npm install -g` を強要するリポジトリがたまにある。

もっと面倒なのは、依存するツールがあるくせに README とかに書いてない場合だ。リポジトリにある設定ファイルからこちらが察して入れてやらないといけない。

グローバルに入れるツールは package.json の管理外なので、そこのバージョンは指定できない。

入れれば済むなら良いけれど、同じコマンドを他のリポジトリでも使っているような場合、求められるバージョンが違ったりすると面倒だ。


```sh
$ npm install -g gulp
$ gulp test
```

一番最悪なのは以下のような場合だ。

```json
"scripts": {
  "postinstall": "npm install -g gulp"
}
```

npm install したのをフックして、否応無くグローバルに浸食する。こんなことができるからうかつに npm install も叩けない。駄目絶対。


## どうするか

そもそも依存は全て package.json に書くべきで、必要なツールは devDependencies に入れておくべきだ。
ただし npm install したらツールも含めて node_modules に入る。

このとき、もしモジュールが bin (コマンド) を持っているなら、npm はそれを node_modules/.bin に入るという決まりがある。グローバルには入らない。

したがって README にこんな記述を書いているリポジトリもある。
(以下 lint なのは例であって tsc でも browserify でもなんでもいい)

```sh
$ ./node_modules/.bin/gulp lint
```

ローカルに入っているコマンドを指定するので、まだお行儀が良い。
ちなみに npm bin というコマンドがこのパスを出力するので、こう書ける。

```sh
$ $(npm bin)/gulp lint
```

でもこれは、がっつりコントリビュートするならコマンドはいるかもしれないが、「とりあえず lint を流したい」のであれば、面倒なだけだ。がっつりやるのではなく、このモジュールに対してちょっとだけいじってみる興味/必要があるライトなユーザには、それは npm から実行できていいはずだ。


それが [以前のエントリで言いたかったこと](http://qiita.com/Jxck_/items/efaff21b977ddc782971) だ。

具体的には package.json にこう書く。

```json
"scripts": {
  "lint": "gulp lint"
}
```

ここでは node_modules/.bin へのパスが自動で通るので、コマンドを書くだけで良い。(もちろんコマンドは devDependencies に入れておく)

README に必要なのは以下の二行だ。package.json をきちんと使えばこれだけで済むというのは知っておきたい。


```sh
$ npm install
$ # ちょっとコードをいじる
$ npm run lint
```


## 開発者は？

ところが開発者、がっつりコントリビュートする人はそうはいかないだろう。
上の例はカジュアルな、ちょっと自分でビルドしたい、ちょっと PR したい程度のユーザへの負荷を減らす設定で、開発中は gulp を叩くことになる。がっつりやるなら、どっちにせよ入れないといけないのだ。

このリポジトリのみの開発に専念しているなら -g で入れればいいだろう。しかし、複数のリポジトリでツールを使い回していると、場合によっては同じ問題にぶつかり振り出しに戻る。


一番シンプルな考えは、こうだ。

```
「常に今いるリポジトリの $(npm bin) にパスを通す。」
```

これを解決するソリューションは npm にはない。
似た考え方は Python の virtualenv に由来する仮想環境ツールだけど、俺は env 系ツールは嫌いで、実環境のパスを把握できる範囲でいじる方が好きだ。(node 自体も nodebrew でパスを切り替えている)

なので PATH 設定でやっている。


```sh
export PATH=$PATH:./node_modules/.bin
```

常に今いる場所の相対パスで解決する方法。この場合は `$(npm bin)` にしてしまうと、一回しか解決されないので直接書く必要がある。

(補足: 最初 $(npm bin) をディレクトリ移動毎に実行する zsh 関数を書いていたが、相対パスを直接書けばそんなものは必要なかった。@hokaccha さんに [指摘](https://twitter.com/hokaccha/status/559723600773529600) されて気づいた、ありがとうございます!)

自分はこれで npm install -g のパスにある全てのモジュールを消したし、今のところ非常に快適。

かつ、この考えは `bundle exec rails` な環境とかでも同じように通用できるのではないかと思う。

複数のリポジトリを手がけたり追いかけたりするのが普通な時代なので、たかが一個のリポジトリにコントリビュートするために、開発者のローカル環境全体に影響を及ぼすようなことは、極力避けて行きたいという話。
わかりやすいAutoScaling資料

# クラウド・エヌのSlideShare資料
AWSのAutoScalingを調べていたら、以下のようなSlideShareの資料を見つけた。

[AutoScalingを無料で使い倒そう](http://www.slideshare.net/Cloudn_NTTCom/21cloudn-auto-scaling20150121)

英語のドキュメントしか無かったから四苦八苦してたけど、これは分かりやすい。
Linuxで4GBを超えたZIPファイルを作れるのか否か

なんかたまにこの問題にぶつかってそのたび調べてるのでメモ

結論から言うと**作れる**


以下はLinuxのzipコマンドでつくった4GBバイトを超えたZIPファイルをWindowsから見た時の絵

![CBIsfdsMG001.png](https://qiita-image-store.s3.amazonaws.com/0/36931/2819fa93-ac08-c2ba-0957-e5d0e9ec03af.png)
**Windows7エクスプローラーで見た時**



![CBIMGsz001.png](https://qiita-image-store.s3.amazonaws.com/0/36931/ede51808-0347-41fd-f177-d3a28986779b.png)
**7zipの情報ボタンを押したとき**


デフォルトのZIPファイルの制限は4GBだがLinux（またはOSX）に入っているZIPコマンドは64bit拡張に対応しており自動的に拡張ヘッダをつけて４GBを超えたZIPも取り扱えるようになっている。
ZIPコマンドはデフォルトで入ってるものが info-zip 16 June 2008 (v3.0) で結構古いのでどのUNIX系OSでもこのバージョンが今は入っているものと思われる。
古いWindowsなどでは64bit拡張のZIPにデフォルトで対応はしてないが、サーバー系のバッチでZIPファイルを作って処理する場合は問題にならないだろう。
helm-migemoでさらにはまった

```helm-migemo``` を使っていると ```helm-buffers-list``` がちゃんと動きません。
```helm-recentf``` などではちゃんと動くのに。なので、 ```helm-use-migemo``` は ```nil``` にして、 ```helm-migemize-command``` で個別に有効にしています。

2015年1月31日追記:
```helm-migemo.el``` を以下のように変更したら所望のことができました。

```el
`(match ,matcher helm-string-match-with-migemo))
              ; ,@(assoc-default 'match source)))
```

ソースを直に書き変えるなんて格好悪いですが、背に腹は変えられません。
いろいろhelmのスロットを書き変える方法など試してみたのですが、
うまくいきませんでした。
SpriteKitを試してみる２ 炎を飛ばしてみる


![iphonePlay_2015012601.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/e806771b-6180-e6a7-d7a9-fd3ef9053c1f.gif "iphonePlay_2015012601.gif")


[前回](http://qiita.com/rnsm504/items/b5ccb597da9a1aa491c8)で作成した炎をショットみたいに飛ばしてみました。

前回作成したソースを修正。

起動時に横向きになるように変更して（これは必須ではないけど）タップイベントの内容を修正

```
            let firePath = NSBundle.mainBundle().pathForResource("MyParticle", ofType: "sks")
            
            var fire = SKEmitterNode()
            fire = NSKeyedUnarchiver.unarchiveObjectWithFile(firePath!) as SKEmitterNode
            
            fire.xScale = CGFloat(0.5)
            fire.yScale = CGFloat(1.0) //yの大きさを2倍
            fire.position = location
            
            //飛ばすのと逆向きに外炎の方向を設定する
            let follow = SKAction.moveByX(-1000, y: -350, duration: 3.5)
            //飛ばす方向
            let follow2 = SKAction.moveByX(1000, y: 0, duration: 3.5)
            
            //炎の演出
            fire.particleAction = follow
            //炎のアクション
            fire.runAction(follow2)
            
            self.addChild(fire)
            

            /* ライトは無し
            let lightSprite = SKLightNode()
            lightSprite.position = location
            lightSprite.name = "lightSprite"
            lightSprite.categoryBitMask = 1
            lightSprite.lightColor = UIColor.blueColor()
            self.addChild(lightSprite)
            
            */
```

今回はシンプルに直線の動きですが、pathを使えばもっと複雑な動きを演出させられそうです。
SoftLayer APIで役に立ちそうなプロパティ

SoftLayer APIで役に立ちそうなプロパティを集めてみます。随時更新。

## サーバー関連 (VirtualGuest, Hardware)


|   Property   |     備考     |
|-------------|--------------|
| (VirtualGuest&#124;Hardware).fullyQualifiedDomainName | FQDN |
| (VirtualGuest&#124;Hardware).primaryIpAddress | Primary Public IP |
| (VirtualGuest&#124;Hardware).primaryBackendIpAddress | Primary Private IP |
| (VirtualGuest&#124;Hardware).datacenter.name | インスタンスの存在するデータセンター |
| (VirtualGuest&#124;Hardware).location.pathString | インスタンスの存在するロケーション(dc.serverroom.rack.slot) |
| (VirtualGuest&#124;Hardware).billingItem.orderItem.order.userRecord.username | インスタンスのオーナー |
| (VirtualGuest&#124;Hardware).frontendRouters.hostname, | インスタンスの接続されているPodのFrontend Customer Router |
| (VirtualGuest&#124;Hardware).backendRouters.hostname | インスタンスの接続されているPodのBackend Customer Router |
| (VirtualGuest&#124;Hardware).billingItem.orderItem.recurringFee | Monthly Billingの場合の月額料金 |
| (VirtualGuest&#124;Hardware).billingItem.orderItem.hourlyRecurringFee | Hourly Billingの場合の月額料金 |
| (VirtualGuest&#124;Hardware).hourlyBillingFlag| Hourly Billingかどうかのフラグ |
| Hardware.bareMetalInstanceFlag | ベアメタルかどうかのフラグ |


- [VirtualSoftLayer_Virtual_Guest | SoftLayer Development Network](http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Guest)
- [HardwareSoftLayer_Hardware | SoftLayer Development Network](http://sldn.softlayer.com/reference/datatypes/SoftLayer_Hardware)


こんな感じのコードで取得できる [^1]

```py
client = SoftLayer.Client(username=SL_USERNAME, api_key=SL_API_KEY)

# VirtualGuest
virtualGuests = client['Account'].getVirtualGuests(mask=_maskVirtualGuest)
for vg in virtualGuests:
    print(vg['datacenter']['name'])

# Hardware (Bare metal)
hardwares = client['Account'].getHardware(mask=_maskHardware)
for hw in hardwares:
    print(hw['datacenter']['name'])
```




## ネットワーク関連

|   Property   |     備考     |
|-------------|--------------|


## ストレージ関連

### ネットワークストレージ

|   Property   |     備考     |
|-------------|--------------|
| Network_Storage.nasType | ネットワークストレージの種類。EVAULT、ISCSI、NAS,、HUB (Object Storageの場合)など |
| Network_Storage.capacityGb | GB単位のサイズ |
| Network_Storage.iops | CPSの場合 |
| Network_Storage.serviceResourceName | ネットワークストレージのリソース名 |
| Network_Storage.serviceResource.type.type | ネットワークストレージのリソースの種類。EVAULT_VAULT 、ISCSI、NAS、HUBなど。 |
| Network_Storage.vendorName | ベンダー |
| Network_Storage.osTypeId | OSのID |

- [NetworkSoftLayer_Network_Storage | SoftLayer Development Network](http://sldn.softlayer.com/reference/datatypes/SoftLayer_Network_Storage)


[^1]: Local Property以外は、メソッドでデータ取得する際にObject Maskを指定する必要がある。
ApacheでPHP-FPMを動かすなら、ProxyPassMatchではなくSetHandlerを使うのがいいらしい


タイトルの通り。

Apacheで`mod_proxy_fcgi`を使ってPHP-FPMを動かす場合、`ProxyPassMatch`を使う方法がある。

```apache:httpd.conf
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/your/documentroot/$1
```

しかしこの設定ではDirectoryIndexが効かなかったりPATH_INFOがおかしかったりと、様々な問題がある。

[Ubuntu 14.04 の Apache mod_proxy_fcgi で php 動かすのは厳しい話 - はざまブログ](http://ymmt.hatenablog.com/entry/2014/10/24/154427)によると、Apache 2.4.10以降では以下の書き方ができるようになった。

```apache:httpd.conf
DirectoryIndex index.php index.html

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
```

ファイル名が`.php`で終わる場合、`127.0.0.1:9000`で起動するFastCGI（=PHP-FPM）に処理を任せる、となる。わかりやすいし簡潔な設定になった。DirectoryIndexもきちんと効く。

Unixソケットを使っている場合は以下のようになる。

```apache:httpd.conf
<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost"
</FilesMatch>
```

[HerokuのApache設定](https://github.com/heroku/heroku-buildpack-php/blob/master/conf/apache2/heroku.conf)でも同じような書き方がされている。

## 参考

- [Ubuntu 14.04 の Apache mod_proxy_fcgi で php 動かすのは厳しい話 - はざまブログ](http://ymmt.hatenablog.com/entry/2014/10/24/154427)
- [Apache HTTP Server (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Apache_HTTP_Server_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29#php-fpm_.E3.81.A8_mod_proxy_fcgi_.E3.81.A7_php5_.E3.82.92.E4.BD.BF.E3.81.86)
- [heroku-buildpack-php/heroku.conf at master · heroku/heroku-buildpack-php](https://github.com/heroku/heroku-buildpack-php/blob/master/conf/apache2/heroku.conf)
TitaniumMobileでファイルローテート処理

TitaniumMobileでファイルローテートの処理を書いてみました。

サーバからダウンロードしたファイルと、ローカルに保存されているファイルを入れ替える処理。
temp領域に保存してあるコンテンツファイルを、アプリの起動時にサーバ側へリクエストを行い、新しいコンテンツファイルを取得して入れ替えるような動きを想定。

## 処理の流れ

1.バックアップ処理

 - バックアップファイルの作成（ファイルのリネーム）

2.ダウンロード処理

 - ダウンロード失敗時に、ダウンロードしたファイルを削除し、バックアップファイルのリストア

3.バックアップファイルの削除

みたいな感じです。

## サンプルコード

``` filerotate.js

// tmp領域のパス
var temp = Ti.Filesystem.tempDirectory

// バックアップファイルオブジェクト保存用の配列
var oldfileList = [];

// ダウンロードファイルオブジェクト保存用の配列
var downloadfileList = [];

// ロールバック処理
var rollback = function(){
	rollback_deletefiles();	
	rollback_restorefiles();
};

// ダウンロードファイルの削除
var rollback_deletefiles = function(){
	if(downloadfileList.length > 0){
		for(var i=0 in downloadfileList){	
			var bResult = downloadfileList[i].deleteFile(); 
			if(bResult == true){
				console.log("Delete download files success");
			} else {
				console.log("Delete download files failure");
			}
		}
	}
};

// バックアップファイルのリストア
var rollback_restorefiles = function(){
	if(oldfileList.length > 0){
		for(var i=0 in oldfileList){
			var oldFileName = oldfileList[i].name;
			var fileName = oldFileName.replace(/.old_/, "");
			var bResult = oldfileList[i].rename(fileName);
			if(bResult == true){
				console.log("Restore file success");
			} else {
				console.log("Restore file failure");
			}
		}
	}
};

// バックアップファイルの作成
var backup_oldfiles = function(){
	var fileList = Ti.Filesystem.getFile(temp).getDirectoryListing();
	for(var i=0 in fileList){
		var file = Ti.Filesystem.getFile(temp,fileList[i]);
		var oldFileName = ".old_"+ file.name;
		var bResult = file.rename(oldFileName);
		var oldFile = Ti.Filesystem.getFile(temp,oldFileName);	
		if(bResult == true){
			console.log('Rename success');
			oldfileList[i] = oldFile;
		} else {
			console.log('Rename failure');
			rollback();
		}
	}
};

// バックアップファイル削除
var remove_oldfiles = function(){
	for (var i=0 in oldfileList){
		var bResult = oldfileList[i].deleteFile(); 
		if(bResult == true){
			console.log("Delete old files success");
		} else {
			console.log("Delete old files failure");
		}
	}
};
```

このコードですが、そのままでは動きません。
使う場合は、摘んでいただけると幸いです。

ソースは[こちら](https://github.com/takuhou/Ti-filerotate)に置いておきます。
データベースの勉強

http://www.ashisuto.co.jp/corporate/column/technical-column/detail/1195392_2274.html#01

##データベース
顧客に関するデータや商品の在庫数などさまざまなデータを共有利用するために1つにまとめたデータの集合体が「データベース」
「社員データ」「顧客データ」など業務上さまざまなデータを支店ごとに管理することができる。

##データベースとDBMSは異なる
データベースはデータの集合体。
そのため、 **同一データに対して同じタイミングで複数ユーザーから利用要望がでる可能性がある**

もしこの要望を無秩序に実行させてしまうと、データ変更処理に矛盾が発生する可能性がある。そのようなことがないように、データを使用する順序を制御し、「データ保護」を行う必要があります。
また、全ユーザーが全データにアクセスできてしまうと、個人情報など機密情報についても自由に参照、変更を行えてしまうので、 **ユーザーごとにアクセス制御** を行う必要がある。
また、データの復旧の仕組みも必要になる。

このようなデータベースを適切に使用するための管理を行ってくれるソフトウェアが **「データベース管理システム」(Database Management System: DBMS)** です。
ユーザーからのデータベースに対する要望は、必ずDBMSを介して行われます。
そのため、データを処理する前に、DBMSがユーザーのデータ利用の順番制御や権限確認を行ってくれる。

**特徴**
① アクセス権限の有無をチェックする
② アクセス権限がある場合: データベースにアクセス
③ アクセス権限がない場合: アクセス不可


##リレーショナルデーターベース
データベースには大きく分けて「階層型」「ネットワーク型」「リレーショナル型」がある。
(現在、主に使われているのはリレーショナル型)
リレーショナルデータベースを管理しているDBMSは **「リレーショナルデータベース管理システム」(RDBMS)** とよばれる

**[特徴]**
①データは2次元の表形式で表現される
②リレーションが可能

リレーショナルデータベースでは、すべてのデータを表形式で表現します。表は列と行で構成され、列は必ず1つの意味を保ちます。

リレーショナルデータベース内にあるデータの参照または変更は「SQL」(Structured Query Language)というデータベース言語によって行います。

##複数の表を組み合わせる
リレーショナルデータベースのもう１つの大きな特徴は **複数の表を結合(リレーション)を利用できることです**
このような場合に、リレーショナルデータベースでは共通の情報を持つ列を使用して表を一時的に結合(リレーション)することができる。複数の表のリレーションもSQLによって行うことができる。

##複数の表にする理由
ディスク領域の無駄や更新の手間という問題が発生を抑える。 => **正規化**

##トランザクションの仕組みと利点
トランザクションとは、データベースにおいて **「作業を完了するための一連の作業単位」** のこと

トランザクションは、ユーザーが明示的にSQLのCOMMITコマンドを実行することで終了すると、そのトランザクションで行った変更内容が完全にデータベースに確定される。
COMMIT前ならROLLBACKコマンドで変更を取り消すことができる。

####なぜトランザクション単位で確定しなければならないのか。
COMMITコマンド実行前にデータベースに障害が発生した場合などを考慮した安全策です。
office365 API メモ

# API仕様
以下のページにAPIの使い方が書いてある
https://msdn.microsoft.com/office/office365/APi/complex-types-for-mail-contacts-calendar#EventResource

# サンプル
カレンダーからイベントを取得する
https://outlook.office365.com/api/v1.0/me/calendarview/?startdatetime=2015-01-26t00:00:00z&enddatetime=2015-01-26t23:59:59z&$select=Subject,Start,End,Location&$orderby=Start&$filter=Start%20ge%202015-01-26T00:00:00Z%20and%20Start%20le%202015-01-26T01:30:00Z%20and%20IsCancelled%20eq%20false
Unity for PSMでVisual Studio 2013 Toolsを利用する

Unity for PSMでVisual Studio 2013 Toolsを利用するためのメモ。
Unity4.6.1がインストールされた状態でUnity for PSMをインストール、そこにVisual Studio 2013 ToolsをrepairかけてもPSM側にはインストールされない。

Unity4.60\Editor\Standard Packages\Visual Studio 2013 Tools.unitypackage
を
Unity PSM\Editor\Standard Packages
へコピーすれば使えるようになります。
ffmpegでogg形式の動画ファイルから音声をmp3に変換する

## はじめに

WordPress.tvの音声を取り出してスマホで聞きたかったので、ffmpegでmp3に変換してみた。

## 形式

```ffmpeg -ab 128k -i oggfile.ogv mp3file.mp3```

## 例

```ffmpeg -ab 128k -i 3-lightning-talks-copy-02_fmt1.ogv 3-lightning-talks-copy-02_fmt1.mp3```

## 補足

元ファイルは64kかも知れない。
ADコンバータ

mbed LPC1768を使用したADコンバータの動作チェック
１）3.3Vを可変抵抗器に通しADコンバータのpin15に接続
２）AD変換値を取得
３）変化があれば、その値をPWMのデューティー比としてLEDに出力
４）0〜3.3Vの電圧に対してAD変換で得た値を電圧と％で画面表示
５）0.1sec待機後２）に戻る。

```cpp:main.cpp
#include "mbed.h"

Serial pc(USBTX,USBRX);
AnalogIn level(p15);
PwmOut led1(LED1);
PwmOut led2(LED2);
PwmOut led3(LED3);
PwmOut led4(LED4);

int main() {
float buffer = 0;
float ratios = 0;

    while(true) {
        buffer = level.read();
        if (ratios != buffer) {
            ratios = buffer;
            led1 = ratios;
            led2 = ratios;
            led3 = ratios;
            led4 = ratios; 
            pc.printf("voltage= %3.3f%V (%3.3f%%)\n\r",(3.3*ratios),(ratios*100));
        }
        wait(0.1);
    }
} 
```
Deviseインストール済環境でActiveAdminの導入

#### 前提
- deviseがインストール済で、
- ユーザと管理者は同じ `Users` テーブルで管理します。 
- `role`は別テーブルで管理します。（cancancanを使用しない）

#### インストール方法抜粋：

```rb
# gemインストール
gem 'activeadmin'

# active admin初期設定生成(ユーザテーブルなど生成しないようにスキップオプション)
bundle exec rails g active_admin:install --skip-users

# 実行結果
create  config/initializers/active_admin.rb
      create  app/admin
      create  app/admin/dashboard.rb
       route  ActiveAdmin.routes(self)
    generate  active_admin:assets
      create  app/assets/javascripts/active_admin.js.coffee
      create  app/assets/stylesheets/active_admin.css.scss
      create  db/migrate/2015..._create_active_admin_comments.rb

```

- `config/intializers/active_admin.rb`ファイルの修正内容：

```rb

config.current_user_method = :current_admin_user
↓
config.current_user_method = :current_user

config.logout_link_path = :destroy_admin_user_session_path
↓
config.logout_link_path = :destroy_user_session_path
```

- app/application_controller.rbに以下を追加:

```rb

def authenticate_admin_user!
  authenticate_user!

  # current_userはdevise提供のメソッドです。
  # 権限ユーザのroleについては、好きな方法でよいです。（自分の場合、has_roleメソッドで実装）
  unless current_user.has_role 'admin'
    flash[:alert] = "管理者用ページです。権限があるアカウントでログインしてください。"
    redirect_to root_path
  end
end
```

- DB作成

```rb

 bundle exec rake db:migrate
```

- サーバ起動確認

```rb
 bundle exec rails s
```

- アクセス
下記のリンクを接続すると、ちゃんとユーザのログイン画面がでます。
`localhost:3000/admin`



参照リンク：
https://github.com/activeadmin/activeadmin/blob/master/docs/0-installation.md
ruby と rails のバージョン表 (ついでに関数プログラミング)


自動更新するやつ作ったった。
https://rails-versions.kbn.one/

以下解説。

# 手続き
最初に書いたコードがこれ。

```ruby
# gem install octokit
require 'octokit'
require 'yaml'

TARGET = 'rails/rails'

Octokit.auto_paginate = true
hash = {}
Octokit.tags(TARGET).each do |tag|
  next if tag['name'].include?('rc') || tag['name'].include?('beta')
  res = Net::HTTP.get(URI.parse("https://raw.githubusercontent.com/#{TARGET}/#{tag['commit']['sha']}/.travis.yml"))
  travis = YAML.load(res)
  break if travis.nil? || travis['rvm'].nil?
  hash[tag['name']] = travis['rvm'].map(&:to_s)
end
 
columns = hash.values.flatten.uniq.sort
puts "rails|#{columns.join('|')}"
puts (["---"] * (columns.length + 1)).join('|')
hash.each do |k,v|
  puts "#{k}|" + columns.map{|c| v.include?(c) ? 'o' : ''}.join('|')
end
```


# 関数型パラダイム
関数パラダイムを意識して書きなおしたのがこれ。
値の変化する変数を出来るだけ使わないように、変化する場合はスコープが出来るだけ小さくなるようにした。

```ruby
# gem install octokit
require 'octokit'
require 'yaml'
 
TARGET = 'rails/rails'
 
def main
  md_table 'rails', tags.lazy.map(&method(:pair)).take_while{|k,v| v}.to_h
end
def md_table(name, hash)
  columns = hash.values.flatten.uniq.sort
 
  lines = ["#{name}|#{columns.join('|')}"]
  lines << (["---"] * (columns.length + 1)).join('|')
  lines + hash.map{|k,v| "#{k}|" + columns.map{|c| v.include?(c) ? 'o' : ''}.join('|')}
end
def tags
  Octokit.auto_paginate = true
  Octokit.tags(TARGET).reject{|tag| tag['name'].include?('rc') || tag['name'].include?('beta') }
end
def pair(tag)
  [tag['name'], rvm_list_on(tag['commit']['sha'])]
end
def rvm_list_on(sha)
  travis = yaml("https://raw.githubusercontent.com/#{TARGET}/#{sha}/.travis.yml")
  return nil if travis.nil? || travis['rvm'].nil?
  travis['rvm'].map(&:to_s)
end
def yaml(url)
  YAML.load(Net::HTTP.get(URI.parse(url)))
end
 
puts main
```
各メソッドの役割が明確になり、独立していて、ユニットテストを書きやすくなった。
コード量は若干増えたが、読みやすく、保守性の高いコードになったと思う。

書き換えるにあたり、 kenokabe 氏の投稿が大いに参考になった。  http://qiita.com/kenokabe/items/618692858044a89adbc0
消されてしまって残念です。

# 課題
* ``map(&method(:pair)).take_while{|k,v| v}`` のとこはなんかもっと別の書き方がありそうな気がする
* 本当は ``md_table enum.to_h`` じゃなくて ``enum.to_h.to_md_table`` って書きたい気分だけど綺麗に書けない。

https://gist.github.com/kuboon/48f09d0bc2748db9e84a#file-generator-rb
Ruby文字列メソッド


##String#capitalize
文字列の先頭を大文字に、残りを小文字に変更

##String#upcase/downcase
upcaseで文字列を全て大文字に変更
downcaseで文字列を全て小文字に変更

##String#swapcase
文字列のアルファベットの大文字・小文字を入れ替え

##String#strip/#lstrip/#rstrip
空白文字の除去
strip 空白文字を全て削除
lstrip 後方の空白文字を削除
rstrip 前頭の空白文字

##String#each_char
文字列を1文字ずつ取り出す。

##String#each_line
文字列を1行ずつ取り出す。

##String#chars
文字列の分解・連結・挿入・逆転
文字列を文字ごとに分解して配列に直す

##String#lines
複数行の文字列を行ごとに分解して配列に直す

##+
演算子を使う文字列の連結方法
a-blog CMSの画面が真っ白な時に確認したいこと


* ioncubeのインストールが正しくできているか
* php-mysqlのインストールがされているか

# ioncubeのインストールが正しくできているか

https://www.ioncube.com/loaders.php にLoader Wizardというものがおいてあるので、これで確認できる。
phpファイルがあってウェブサーバに配置

# php-mysqlのインストールができているか

いつもこっちではまる。

```
$ php --info | grep 'mysql\.'
```

で出力があればインストールされている
「第26回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/8a973a47633558f54ba8
http://nabetani.sakura.ne.jp/hena/ord26tribo/
三種類の境界線

隣接をどう判断するかがポイントでしょう。
いろいろ方法はあると思いますが、まあ単純に隣接リストを持っておくのが楽です。

```php
<?php
	class TRIBO{
		
		private $pattern1 = [
			// 赤
			'/bc|ef|gh|jk|lm|no|qr|st|uv|wx/',
			// 緑
			'/cd|fg|hi|kl|mn|op|rs|tu|vw|xy/',
		];
		// 青
		private $pattern2 = [
			'/a.*c/', '/b.*f/', '/d.*h/', '/e.*k/', '/g.*m/',
			'/i.*o/', '/j.*r/', '/l.*t/', '/n.*v/', '/p.*x/'
		];
		
		/**
		* 三種類の境界線
		* @param String 「bdelmnouy」みたいな文字列
		* @return String 「5,7,9」みたいな文字列
		*/
		public function get($input){
			$ret = array_fill(0, 3, strlen($input));
			// 赤、緑
			foreach($this->pattern1 as $key=>$val){
				$ret[$key] -= preg_match_all($val, $input)*2;
			}
			// 青
			foreach($this->pattern2 as $key=>$val){
				$ret[2] -= preg_match($val, $input)*2;
			}
			return implode(',', $ret);
		}
	
	}
	
	// 以下はテスト
	$test = [
		['bdelmnouy', '5,7,9'],
		['a', '1,1,1'],
		['q', '1,1,1'],
		['t', '1,1,1'],
		['i', '1,1,1'],
		['fg', '2,0,2'],
		['gh', '0,2,2'],
		['gm', '2,2,0'],
		['fgh', '1,1,3'],
		['fghm', '2,2,2'],
		['fhm', '3,3,3'],
		['bdfhjprx', '8,8,0'],
		['abcdfghm', '4,4,0'],
		['jklmqrst', '0,4,4'],
		['klmntuvw', '4,0,4'],
		['abcdefghijklmnopqrstuvwxy', '5,5,5'],
		['abcdefghijklmnoqrtvwxy', '6,8,4'],
		['abdefhijklnoprstvwxy', '10,8,4'],
		['acegikmoqsuwy', '13,13,5'],
		['bdfhjlnprtvxy', '13,11,1'],
		['abdegijlnpqsuwy', '15,15,15'],
		['aefghiqrstuvwxy', '3,3,15'],
		['cfhkmoqrstuvwxy', '7,7,15'],
		['cfhkmortvx', '10,10,10'],
		['no', '0,2,2'],
		['pwy', '3,3,3'],
		['iqwy', '4,4,4'],
		['lopuv', '3,3,5'],
		['abdjtw', '6,6,6'],
		['fgpstux', '5,3,5'],
		['dijlnotv', '6,8,2'],
		['bdefkmpwx', '5,9,3'],
		['bfghjlmuwx', '4,8,6'],
		['befghlopqrw', '5,7,9'],
		['bfgjklmnqsux', '8,6,8'],
		['fijklnpqstvwy', '9,9,9'],
		['abcdfgilmnrsuv', '8,6,6'],
		['abcdegijklnpruw', '11,11,9'],
		['efgijkmnopqrtvwx', '6,8,4'],
		['abcdefghilopqrtwy', '9,9,7'],
		['abfghklmopqrsuvwxy', '8,6,12'],
		['abcdeghklmoprstuwxy', '9,7,7'],
		['abcdehijklmnopqrtwxy', '8,8,6'],
		['acdefghimnopqrstuvwxy', '7,3,9'],
		['abcfghijklmnopqrtuvwxy', '6,6,6'],
		['abcdefghijklmnoqrstuwxy', '5,7,7'],
		['abcdeghijklmnopqrstuvwxy', '6,6,6'],
	];

	$tribo = new TRIBO();
	foreach($test as $key=>$data){
		$answer = $tribo->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

最初は青も`preg_match_all('/a.*c|b.*f|d.*h|e.*k|g.*m|i.*o|j.*r|l.*t|n.*v|p.*x/')`一発でいけるかと思ったのですが、

http://php.net/manual/ja/function.preg-match-all.php
> 正規表現にマッチすると、そのマッチした文字列の後から 検索が続行されます。

のせいで、'bdfh'に2回マッチしてほしいところ1回しかマッチしませんでした。
そのため青だけ個別に算出しています。残念。

かかった時間は30分程度。
わりと簡単でした。
正規表現


##Rubyの正規表現はRegExpクラス

###|
この前後にある正規表現のどちらかと一致

###*
直前の正規表現の0回以上の繰り返しに一致

###+
直前の正規表現の1回以上の繰り返しに一致

###?
直前の正規表現の0回もしくは1回に一致

###{m,n}
直前の正規表現のm回以上n回以下の繰り返しに一致

###*?
直前の正規表現の0回以上の繰り返しに一致(最短)

###+?
直前の正規表現の1回以上の繰り返しに一致(最短)

###??
直前の正規表現に0回もしくは1回一致(最短)

###{m,n}?
直前の正規表現のm回以上n回以下の繰り返しに一致(最短)

###[]
[]内に指定した文字のどれかと一致

###[^]
[]内に指定した文字でない場合に一致

###.
任意の1文字と一致

###^
行頭と一致

###$
行末と一致

###()
正規表現をグループにまとめる

###\
メタ文字を打ち消す

###\A
文字列の先頭と一致

###\b
単語境界と一致
###\B
\B以外と一致

###\d
数字と一致

###\D
数字以外と一致

###\s
空白文字と一致

###\S
\s以外と一致

###\w
英数字とアンダースコアに一致

###\W
\w以外と一致

###\z
文字列の末尾と一致


##scan()
文字列の中で正規表現と一致した部分文字列をすべて求めたい場合に使うと有効。
重複しない一致部分文字列を配列に格納して返す。
```
b = "foo 10 bar 20 baz 30"
b.scan(/(\w+)\s+(\d)/)
=>[["foo", "10"],["bar", "20"],["baz", "30"]]
```

##マッチパターン
```
"文字列" =~ /正規表現リテラル/
"文字列".match(/正規表現リテラル/)
```

##split()
単語区切りを正規表現で指定することができる。
分割する個数を引数limitで指定することができる。
```
b = "foo bar baz"
b.split(\w+/, 2)
=>["foo", "bar baz"]
```

##emailの正規表現

```
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }
```
リモートブランチの整理

#### 削除されたリモートブランチの同期

誰かがリモートブランチが削除しても、自分のローカルブランチには残っている。以下のコマンドで整理ができる。

```rb
git remote prune origin
```
まはた

```rb
# pull時、リモートbranchを整理
git pull --prune
```
お固い組織に自動テストを書く文化をインストールしようとしている

※個人の見解です。所属する組織の意見を代表するものではありません。
未整理だけど一旦投下。

## なぜ自動テストなのか（見えているゴール）
- よい自動テストはプロダクトの健康に大きく寄与する
- プロダクトの健康は開発者を変更の恐ろしさから解放する
- よい自動テストはシステムの継続的な運用コスト削減に寄与する
- 今更なに言ってんの？という話だが、固い組織の現状認識は想像を絶する

## たくさんの壁がある
- 個人の壁
 - 「自動テストなんて書いたことありません」
 - 「妙な仕事増やさないでよ…」
- 組織の壁
 - 「そもそもユニットテストなんて書いたら、大幅に工数増えるじゃん。それどうするの？そんな工数見積に載せられるわけないでしょ？」
 - 「品質保証としてカバレッジの目標値どうすんの？ユニットテストというなら最低限C0カバレッジ100%だよね？」
 - 「ユニットテストのテスト仕様に問題ないことは、誰がどうやって担保するの？」
 - 「『俺も若いころやったことあるけど、テストコードがごちゃごちゃになってだんだん保守できなくなるんだよ』」
 - 「『みんな通る道だよ、みんな一回はやってみて、失敗するもんだよ、自動テストなんて』」
- 受託開発の壁
 - 「ユニットテストが効果を発揮するのは、長期的な開発が決まってるプロダクトだけだよね。1回だけの開発じゃペイするわけないでしょ？」
- 文化の壁
 - すべてのプロジェクトで自動テスト書くなんて、コストメリット面から考えてあり得ない。という思い込み
 - テスタビリティを考慮してプロダクトコード書いてる人がいない
 - ある程度めんどうくさいとすぐに形骸化してやらなくなる

## たしかに、よい自動テストを書くのはむずかしい
- アンチパターンの宝庫
- 丸腰で踏み込むとしぬ
- 自動テスト導入がそもそも大変なのに、さらにそれが失敗すると結構立ち直れない

## 少しずつ壁を崩す　←　イマココ
- 固い組織では失敗しないことが大事
- 組織・開発者それぞれに小さな成功体験を稼がせる
- 組織・開発者に「自動テストはこれからコミットする価値がある」と思わせる

## 組織の壁の崩しかた
（個人の見解です)
###「この自動テストはユニットテストではなく機能テストである」と強調する
- ユニットテストや単体テストという表現をすると不毛な議論になりやすい
 - 「全メソッド分の詳細設計書書いてレビューするんでしょ？」
 - 「そんな工数どっから調達するつもりなの？」
 - 「カバレッジ100%目指すんだよね？」
 - 「プログラマが勝手に書いたテストコードなんて何のエビデンスにもならないよ？」
 - 「全てのモデルクラスのpublicメソッドについてテストを書かないと品質がどうのこうの」
 - いくらでも揉められる
- 「今まで面倒をかけて手でやっていた機能テストを、テストコードに置き換えるだけです」という論理はすこしだけ説得に寄与する
 - 単体テストと違って、機能テストであればどんなプロジェクトでも必要性が認められる
 - 「手でしこしこテスト仕様書を書いてテスト実施する時間でテストコードを書きます。コードさえかけば、実行は一瞬なので、工数は変わりません」
 - 「コードのカバレッジは重視しません。なぜならこれは機能テストであって、機能テストの網羅性は従来と変わらないからです」
 - 「工数は変わらず、機能テストの網羅性も変わらず、リグレッションテストの工数がほぼゼロになります」

## 組織として、最初の自動テストがこんな結果になれば上々
- 「自動テストを導入したのに、今までと開発コストが変わらなかった」
- 「コストが変わらず、手でやってた機能テストが自動化されたので、保守開発が楽になった」

## 継続しなければ意味がない
- 一時的にテストブームになっても、それが失敗したという体験が多いと、すぐやめてしまう。

## 継続するためにどうするのか
- 形骸化しないよう、小さなコストで最大限の効果が得られる施策から着手する
- 開発者が、自発的に自動テストを改善していきたいと思う環境作り
- 自動テストを書くのは普通のことなんだ、という意識づけをする

## あらかじめ想定したアンチパターン
### 「プロダクトコードじゃなくてテストコードだし、ある程度コピペでいいよね」は許さない
- 仕様変更時にはコピペした箇所の分だけなおしが発生して超大変
- やっぱ自動テストはうまくいかないね、ってなる大きい要因
- 最低限、DRY(Don't repeat yourself)を保つ
- githubのロジック系の有名リポジトリが参考になる
- 高品質なテストコードは、コアとなるテストロジックが1つあって、各テスト項目はコアロジックに各種パターンのパラメータ引数を入力するだけになってる

### 「この見積工数はユニットテストを実施する工数です！」は通用しない
- 顧客に説明できないし、上司も納得させられない。
- 「そのユニットテスト、インプットは何？プログラマが勝手にやるの？クラスやメソッドの詳細設計書書いてレビューでもするの？すごい工数増えそうだよね！！」

### 「テスタビリティに配慮しないプロダクトコード」
- 状態遷移が複雑すぎる
- 高依存度、低凝集度
- 呼び出し順序に依存して動きが変わる
- プレゼンテーション層がビジネスロジックだらけ

### 「しばらく動かさないでいたら、テストコードの大部分が動かなくなってた。直すの大変…いつからこの状態なの…？」
- 自動テストを作っても、手で動かす仕組みにしてるとすぐ形骸化する
- 必ずCIで継続的に走らせて、フレッシュに保つ

### 「C0カバレッジ100%目指します」
- 異常系のテストがモックだらけになって作るのが大変。そのわりに、言うほど効果がない。仕様変更が大変になる
- 開発者は、明らかに重要ではないテストに多くの時間を割く体験をするため自動テストにコミットする意識が薄れる
- 重要というのは理解するが、自動テストをはじめてやる組織がいきなり目指すような目標ではない

### UIの自動テスト
- 現状まだ世界中が模索していてベストプラクティスがないという認識
- やりたいのはやまやまだけど失敗するよりは、やらないでおく

## いつか(5年後くらい)にたどり着きたいところ
- 「開発者はテストコードとプロダクトコードをコミットするだけの世界」
 - プロダクトコードとテストコードを書けば、CI環境が自動的に検証してくれる
 - いつでもフルテストができるから、保守開発によるデグレードがなくなる
 - 開発者に手動テストをさせるとモチベーション面に起因して効率が落ちるが、テストコードを書かせると目がかがやく
- 開発者は創造的な作業に専念できる
 - よりより機能の提案とか
 - 細かいUIの改善とか	
- 「コンピュータに仕事をさせるのがうまい集団」
 - 自分達の仕事を自動化できないで、どうして他人の仕事を楽にできるのか？
jQuery classの追加・削除

#クラス操作いろいろ

スタイルを変えたいとかそういった理由でクラスを追加したり削除したりといじりたくなる機会がある。
参考：[jQuery日本語リファレンス](http://semooh.jp/jquery/)

##クラスの追加 addClass(class)

```JS
$("要素").addClass("changed");
```

これで指定の要素にchangedクラスが追加される。

##クラスの削除 removeClass(class)

```JS
$("要素").removeClass("changed");
```

これで指定の要素からchangedクラスが削除される。

##クラスがなければ追加、あれば削除 toggleClass(class)

例えば、ある要素がクリックされたときに、clickedクラスがあればクラスを削除し、なければclickedクラスを追加する。という処理を想定すると、

addClass(class)とremoveClass(class)がわかった今なら、

```JS
$("要素").click(function(){
  if($(this).hasClass("clicked")){ // クリックされた要素がclickedクラスだったら
    $(this).removeClass("clicked");
  }else{
    $(this).addClass("clicked");
  }
});
```

という感じのコードが浮かぶかもしれない。自分は真っ先に浮かぶ。が、ここで、

```JS
$("要素").toggleClass("changed");
```

これだけでその要素にクラスがなければ追加し、あれば削除してくれる。つまり、

```JS
$("要素").click(function(){
  $(this).toggleClass("clicked");
});
```

スッキリ。
Emacsでコードを垂直方向に揃えたい

[【翻訳】私がコーディングで垂直方向にそろえるインデントをとる理由](http://postd.cc/why-i-vertically-align-my-code-and-you-should-too/)という記事を読んで、自分も早速コードを垂直に揃えるようにし始めたが自動でやるのは非生産的過ぎるので、Emacsで簡単に行える方法を調べました。

# M-x align-regexp を使う
以下のようなコードを垂直に揃えたいとします。

![スクリーンショット 2015-01-26 20.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/26205/ba8edc57-73f0-3cef-9c88-673fb23803e3.png)


json.result ~ image.updated_atまでを範囲選択します。

![スクリーンショット 2015-01-26 20.28.26.png](https://qiita-image-store.s3.amazonaws.com/0/26205/60365e79-d301-4492-6186-3fd16074f37e.png)



次にM-x align-regexp コマンドを実行して、どの文字を基準にして縦を揃えるかを決めます。今回の場合はspaceなのでspaceを押して、Enterを押します。
すると綺麗に縦に並びます。

![スクリーンショット 2015-01-26 20.28.41.png](https://qiita-image-store.s3.amazonaws.com/0/26205/38581d47-32de-82cc-f40d-39f4907f6247.png)


これで、楽して綺麗なコードの出来上がり！
複數の text 行を 1 行に まとむ

たとへば 1 行 1 項の text file ありぬると す。
連なる 10 項を 1 行に 水平 tab くぎりにて つなぐは

```sh:console
$ /usr/bin/paste - - - - - - - - - - < SOURCEFILE > DISTFILE
```

などゝす。 paste の parameters として - を 10 列べたる ものなり。
Rubyで無から[]を生み出す方法

[IQ1450で美少女JSの先輩から、Rubyで無から有を生み出す方法を教わった - Qiita](http://qiita.com/supermomonga/items/79d985f4dfd3603afffe)の読書感想文です

``` ruby
_, *a = a
p a
# => []

p ->*a{a}[]
# => []
```
mysqlでjoinした結果をupdate

mysqlでjoinした結果をupdateする場合の構文を忘れがちなので備忘録としてメモ。

## テーブル作成

```sql
--- ユーザーメインテーブル
CREATE TABLE `user_main`(
  `user_id` int,
  `name` text,
  PRIMARY KEY  (`user_id`)
);

--- ユーザーサブテーブル
CREATE TABLE `user_sub`(
  `user_id` int,
  `type` int,
  PRIMARY KEY  (`user_id`)
);
```

## データ登録

```sql
INSERT INTO user_main values(1, 'name1');
INSERT INTO user_main values(2, 'name2');
INSERT INTO user_main values(3, 'name3');

INSERT INTO user_sub values(1, 1);
INSERT INTO user_sub values(2, 2);
INSERT INTO user_sub values(3, 3);
```

## JOINでSELECT

```sql
mysql> SELECT a.user_id, a.name, b.type FROM user_main a
LEFT JOIN user_sub b
ON a.user_id = b.user_id
WHERE b.type = 2;

+---------+-------+------+
| user_id | name  | type |
+---------+-------+------+
|       2 | name2 |    2 |
+---------+-------+------+
1 row in set (0.00 sec)
```

## JOINでUPDATE!

ポイントはSET～をJOIN句のあと、WHERE句の前に書くこと。

```sql

mysql> UPDATE user_main a
LEFT JOIN user_sub b
ON a.user_id = b.user_id
SET a.name = "name2 new!"
WHERE b.type = 2;

Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM user_main;
+---------+------------+
| user_id | name       |
+---------+------------+
|       1 | name1      |
|       2 | name2 new! |
|       3 | name3      |
+---------+------------+
3 rows in set (0.00 sec)

```