OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript入門 ３.数値を使う <個人メモ>

JavaScriptの数値
64ビット、浮動小数点。
整数値と浮動小数点値を区別しない。
`
<!DOCTYPE html>
<html lang="ja">
<head>
　　<meta charset="utf-8">
　　<title>JavaScript</title>
</head>
<body>
　　<script>
　　　　var num = 10;
　　　　num += 5;
　　　　alert(num);
　　</script>
</body>
</html>
`
Ammonite-REPLを試してみよう

## はじめに

Ammonite-REPLというScala REPLを再実装したものがあります。

それを紹介します。

## Install

次のようなコマンドでインストールできるようです。

```
$ curl -L -o amm http://git.io/vBTzM; chmod +x amm; ./amm
```

私は、[こちら](https://github.com/lihaoyi/Ammonite/releases)からダウンロードして、権限を付けて、実行しました。

aliasを使うなら、`alias amm=/path/to/ammonite-repl-0.5.0-2.11.7`でしょうか。

## おためし

![スクリーンショット 2015-12-03 1.02.32.png](https://qiita-image-store.s3.amazonaws.com/0/29884/f55c5fdc-15d4-ee93-e26b-1efea9c341e7.png)

まず、カラフルなこと！楽しい！

![スクリーンショット 2015-12-03 1.15.27.png](https://qiita-image-store.s3.amazonaws.com/0/29884/cfe15344-e78c-ccfa-44d5-b973a4c7d203.png)

次に、Scala REPLでもTabで補完できますが、Ammonite-REPLでは`def last: A`のようなものまで表示されます。スゴイ！

最後に、Ctrl+wが１つのワードを削除すること。便利！

でも、Ctrl+rで履歴を辿ることはできないようです。

![スクリーンショット 2015-12-03 1.30.14.png](https://qiita-image-store.s3.amazonaws.com/0/29884/efc0c7f1-8d9e-96fb-d893-e2801fc7fd23.png)

あと、こういう微妙なものはダメみたいです。

## まとめ

カラフルなことやCtrl+wで１つのワードを削除できることは強みだと思います。

自作したクラスやオブジェクトをimportできないようなので、その辺ができるようになると更に便利になるんじゃないかと思います。(libraryDependenciesに追加したものはimportできるようです)

## もっと詳しく知りたい

[Ammonite](http://lihaoyi.github.io/Ammonite/)
OS X で任意のアプリケーションのウィンドウの座標・サイズを設定する

ウィンドウ左上の座標を `(start_x, start_y)` 、右下を `(end_x, end_y)` とすると

```applescript
tell application <Application Name> to set the bounds of the front window to {start_x, start_y, end_x, end_y}
```

という感じ。

例えば、Safari を `(30, 30)` の位置からサイズ 1920*1080 にするには

```applescript
tell application "Safari" to set the bounds of the front window to {30, 30, 1950, 1110}
```
Swift for tweak.


この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の2日目の記事です。
1日目は[History of software for jailbroken env.](http://qiita.com/r_plus/items/c7ed6b97c7319ba5860e)でした。

### jailbreak的なtweakとは何か知らない人向けの前説明

Jailbreak界におけるtweakとはOS XにおけるSIMBLのようにダイナミックライブラリ(dylib)を作成しローダー(SIMBL)所定のパスに配置しておく事で特定のプロセスがたちあがったタイミングでローダーがそのライブラリをdlopenして読み込ませる事でそのプロセスの挙動を変更するソフトウェアを指します。

iOSにおいてはSIMBLではなくCydiaSubstrateがその役割を担っています。

### ObjC

究極的にはdylibが作成出来れば良いため、Objective-Cでの作成を追ってみましょう。
こんなコードを用意しました。mainの引数は省略しました。

````objc:main.m
#include <stdio.h>

int main()
{
    printf("test");
    return 0;
}
````

ここから直でdylibを作成するならこう

    clang -dynamiclib -ObjC main.m -o main.dylib

一旦オブジェクトファイルを経由する場合は

    clang -c -ObjC main.m -o main.o

のようにした後

    libtool -dynamic main.o -lSystem.B -o main.dylib
    
これでmain.dylibが出来ます。

### Swift

さてSwiftです。こんなコードから

````swift:main.swift
print("test")
````

swiftファイルのコンパイラである`swiftc`を使ってオブジェクトファイルを作ってみます。（直で作る方法はよくわからなかった）

    swiftc -c swift.swift -o swift.o
    
オブジェクトファイルが出来ました。同様にlibtoolしましょう。

````
$ libtool -dynamic swift.o -lSystem.B -o swift.dylib
ld: warning: -macosx_version_min not specified, assuming 10.9
ld: warning: object file (swift.o) was built for newer OSX version (10.11) than being linked (10.9)
ld: library not found for -lswiftCore for architecture x86_64
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: internal link edit command failed
````

おっとlibswiftCore.dylibがないと怒られました。適当なdylibを持ってきてみましょう。

````
$ cp /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/libswiftCore.dylib .
$ libtool -dynamic -L. swift.o -lSystem.B -o swift.dylib
ld: warning: -macosx_version_min not specified, assuming 10.9
ld: warning: object file (swift.o) was built for newer OSX version (10.11) than being linked (10.9)
ld: warning: ObjC dylib (./libswiftCore.dylib) was compiled for iOS Simulator, but dylibs others were compiled for MacOSX
````
    
いくつか警告は出てますが無事dylibが出来ました。リンクは・・・

````
$ otool -L swift.dylib 
swift.dylib:
	swift.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)
	@rpath/libswiftCore.dylib (compatibility version 0.0.0, current version 0.0.0)
````

というわけでlibswiftCore.dylibが必要です。このswiftランタイムはiOSにデフォルトで入っていないので持っていく必要がありますが、Appleの著作物ですので再配布（redistribute）となると勝手には出来ません。

光明はSwiftをオープンソース化する事をAppleが宣言している事。OSI承認ライセンスと採用するようなので、パッケージ化して再配布が出来る。そのパッケージを依存パッケージとして設定すればユーザに自前でランタイムを持って行ってもらうような苦痛はない。

### 現実的には

Swiftのバージョンが変わるとコンパイル出来なくなるような変更がまだ入っているのでなかなか厳しそうです。枯れる頃にはiOSにデフォルトで入りそうだし。
加えて、どこまでOSSになるのかという問題もあります。Swiftでまともに書こうと思ったらlibswiftUIKit.dylibとかlibswiftFoundation.dylibとかが欠かせません。このあたりのモジュールまでOSSになるかといえば・・・ならないでしょう。
OSS Swiftで使えるのがlibswiftCore.dylibだけという事になるとサーバサイド用途であれば問題なさそうですがiOSで使っていくには力不足です。

### そんなわけで

いまのところのは今後もtweakはObjective-C/C++の方向だと思ってます。
・・・Appleさん、iOSにデフォルトではやくのせないかなぁ。
Groongaの管理ツールの表示を自動更新するには


# Groongaの管理ツールの表示を自動更新するには

この記事は、Groonga Advent Calendar 2015の三日目の記事です。

[Groongaの細かいことを知らなくても使えるWebブラウザー上で動く管理ツール]
(http://qiita.com/groonga/items/1a4bf4e69a3bfb8a0663)としてGroonga Adminがあります。

この記事を書いている時点の最新版である0.9.4では、表示内容をリフレッシュする機能がはいりました。
というわけでその紹介をします。

まずは、テーブルの検索画面をみてみてください。
「Auto Refresh」というのがありますね。こいつです。

![groonga-advent-calendar-2015.png](https://qiita-image-store.s3.amazonaws.com/0/13564/37c0066e-7049-9e43-8971-1b71bd8a4ce7.png)

ここで任意の秒数を指定すれば、指定した秒数ごとに画面が更新されます。
適当な条件で絞り込んで、時間経過とともに追加されるデータを眺めたりするのに使えます。
たとえば、大量の監査ログの中から特定のユーザーなり、アクションをした記録を監視したりしなかったりとか。

というわけで、Groonga Admin 0.9.4ではいった、表示の自動更新機能を紹介しました。
明日は、@cosmo0920さんです。
bash read コマンドを利用する場合には、基本的に -r オプションを使うべき。

read コマンドは、 \ があると基本的にそれを無視してしまう。

    (read line <<< 'hello\nworld'; echo $line)
    # => hellonworld

-r オプションを付与すると、バックスラッシュの特殊な挙動を抑制し、ただの文字として扱うことができる。

    (read -r line <<< 'hello\nworld'; echo $line)
    # => hello\nworld


-r オプションで抑制される特殊な挙動は何があるかというと、 line continuation と、IFSの抑制がある模様。

    (read line <<EOF; echo $line)
    hello \
    world
    EOF
    # => hello world

    (read x y <<< 'foo\ bar baz'; echo "<$x><$y>")
    # => <foo bar><baz>


参考: http://wiki.bash-hackers.org/commands/builtin/read
RaspberryPi 上のFreeBSDで GPIO をコマンドとシェルでお手軽操作

#GPIOとは

GPIOについては、馴染みまくっている人もいれば、あまり組み込み的なことをやってない人だと名前だけ知ってるけど……という人も多いと思われますので念の為説明します。

GPIO は General purpose input/output の略で、ジェネラルなパーパスでインプットやアウトプットが出来る端子です。ってまぁようするに目的が限定されていない、とにかく電圧上げ下げを出力したり入力したり出来る口ということです。出力だけならGPO 、入力だけなら GPI と限定した呼称をすることもあります。
上げ下げする電圧は一定値で、RaspberryPiの場合は 3.3V です。中間的な電圧を出力したり、検知したりということはできず、ON/OFFのデジタル入出力です。ただし、出力に関しては、擬似的に中間的な電圧を生成することを、ミリ秒単位で ON/OFF することで実現する PWM という手法が使えます。
電圧上げ下げの出力があれば、LEDを光らせたり、スイッチを入切したり、また上記の PWM を使えばサーボモーターを動かすということも出来ます。

#Raspberry Pi のGPIO
実際 RaspberryPi の GPIO はこんな感じで生えてます。
![RaspberryPI-GPIO-PIN.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/8bcf0a43-45ba-4d9d-a596-dad25f71f4ad.jpeg)
剣山風なのが GPIO の PIN

![Raspberry_Pi_GPIO.png](https://qiita-image-store.s3.amazonaws.com/0/103137/b6aba983-14aa-b7fc-5310-3371ed5650bd.png)
(http://www.orsx.net/blog/archives/4126 の画像をありがたく使用)
といってもすべてのピンが GPIO というわけではなく上記の図でGPIO XX となっているのがGPIO。その他 5V/3.3V は電源供給用、GNDは 基準の0V電圧で、GPIO PINを+とした時の-側としてつなぎます。
GPIO に番号がついていますが後ほどの操作でこの番号を使ってどのPINを使うか指定します。配置がカオスなので、上記のような図が必須です。

#FreeBSD で GPIO
で、FreeBSD で GPIO 操作ですが、ドライバを書いたりする必要はなくて、標準でコマンドがあります。その名も「gpioctl」。コマンドの詳細はお約束の man gpioctl に書いてあります。

GPIO 操作用のデバイスノードは /dev/gpioc0 です。gpioctl コマンドの -f オプションで指定しますが、gpioc0 しかないので、指定しなくてもデフォルトでこいつを使ってくれます。

現在の GPIO 各 PIN の状態は gpioctl の -l オプションで参照できます。

\# gpioctl -l 
pin 00: 0       pin 0<>
pin 01: 0       pin 1<>
pin 02: 1       pin 2<>
pin 03: 1       pin 3<>
pin 04: 1       pin 4<IN>
〜〜〜〜〜（中略）〜〜〜〜〜
pin 51: 1       pin 51<>
pin 52: 1       pin 52<>
pin 53: 1       pin 53<>

<IN>が入力、<OUT>が出力、<>が無指定です。
では GPIO 18 に LED を繋いで光らせてみます。

GND(GPIO18の横使用) - 抵抗(1kΩ) - (-)LED(+) - GPIO18
としてつなぎました。下の写真が抵抗とLEDをブレッドボードに刺したものとRaspberryPi の GPIO18とGNDを繋いだ状態です。

![RaspberryPI-LED.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/2a7b215f-3f95-0889-f0d7-afe55d95a330.jpeg)
光が見えづらいしケーブルがごちゃごちゃで失礼。つながってるのは二本の線だけです。

GPIO 18 を OUT に設定するには、　

gpioctl -c 18 OUT

とします。
gpioctl -l で調べると、設定前は

pin 18:	0	pin 18<IN>

だったのが、

pin 18:	0	pin 18<OUT>

となります。0というのは現在出力値が0ですよということです。LEDは消灯状態だと思います。
LEDを点灯させるには、これを 1 にすればいいわけです。1 にするには、　

gpioctl 18 1

とします。これで LEDが点灯します。
再度消灯するには当然 0 にしてやればいいわけです。

gpioctl 18 0

これをスクリプトで繰り返せば、LEDチカチカも楽勝ですね。他の PIN にLEDをつなげば、複数チカチカさせてクリスマス気分、も夢ではないというわけです。

今回は出力でしたが、入力は gpioctl の -l で出てくる0/1の値で取得できます。センサーのデジタル入力の検知がこれでできます。

こんな感じで、簡単な GPIO 操作は FreeBSD 標準の gpioctl コマンドでプログラミング不要で取り扱えます。

#「LEDなんてねーけどGPIOを体感したい」という方は
代わりにRaspberryPiボード上のLEDをいじってみましょう。実は上記と同様の操作でRaspberryPi ボード上のLEDが操作できます。gpioctl -l のリストに

pin 35:	0	gpioled0<OUT>
pin 47:	0	gpioled1<OUT>

という PIN があるのですが、これがボード上のLED操作用の PIN です。つまり２つのLEDが操作できるわけです。

gpioctl 35 1

とか実行すればボードの端っこにある赤いLEDが点灯するので探してみてください。
みつけたら

gpioctl 35 0

で消灯するか確かめてみてください。
JavaScriptだけで言葉をしゃべらせてみた

※ JavaScript for Robotics or Hardware Advent Calendar 2015 12/2用　
http://qiita.com/advent-calendar/2015/jsrobotics

ロボットなどでコミュニケーションを取る場合には、人間との会話が必要になることが多いです。
そのため、これら会話するために機械的に合成音声を出す必要があります。
これらを実現するためには、高度なライブラリやWeb上のサービスでのAPI、はたまた専用の基板などが存在したりします。
ですが、実はこの合成音声のためのものがW3Cで仕様が策定されています。
Web Speech API Specification
https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html
ということは・・・ブラウザで実装されています。
なので、もちろんJavaScriptのみで利用可能です！
現段階ではブラウザのChromeとSafariなどが対応しています。
http://caniuse.com/#feat=speech-synthesis

この二つが対応してるということは・・スマホだとほぼ対応してるという事です。

使い方は簡単！以下のコードだけでOK

```javascript:speach.js
var ssu = new SpeechSynthesisUtterance();
ssu.text = 'クリスマスにはサンタさん来てくれるかな？';
ssu.lang = 'ja-JP';
speechSynthesis.speak(ssu);
```
実際に動作してるのはこちら。
http://jsdo.it/wakasamasao/webspeachapi1

このように簡単にブラウザを経由することで合成音声を生成することができます。
そして、このWebSpeachAPIは発音するのにはネットワークが必要無いというのも魅力です。
Application CacheやService Workerなど使えば完全にOfflineでも利用が可能ということです。
実際合成音声のAPIサービスなどは多数あり、合成音声を音声データで送ってきてそれを再生するなどもあったりしますが、こちらはそういう通信さえも必要がありません。
そして、発音も悪くないレベルです。
声のピッチなども変更が可能なので、男性っぽい声と女性っぽい声などで状態を切り分けるなど、ある程度の細かい設定も可能です。
気持ちChromeの日本語は語尾がなまり気味な気はしますが・・・。

で、音声が読み上げられるということは
- Twitterから取得したツィートを音声で読み上げ
- ログなどの解析結果で何かイベントがあると注意のために読み上げる
- WebRTCなどで音声チャットしてるが、僕だけしゃべることができない環境にいるのでテキストをいれると相手には音声で伝えれる
などなどいろいろな事ができるようになります。
私は社内ツールではありますが、ブラウザを立ち上げっぱなしでサーバにポーリングし、何か気になる状態が確認されたらスピーカーから音声でみんなに警告を知らせるなどのものを使っていたりします。
このあたりはネットワークに強いブラウザならではですね。

Web MIDI APIを使えばブラウザ単体でArduino等のハードウェアも連携できますので、完全に独立してしゃべって動くようなロボットも作る事が可能です。

そう、ブラウザなら。
Couchbaseの導入検討（前編）

## **はじめに**
この記事は[株式会社アイスタイルアドベントカレンダー](http://qiita.com/advent-calendar/2015/istyle) 3日目の記事です。
やっと入社2年目に突入したインフラエンジニア @imaiy がゆるい感じで2回に分けてお届けします。

# **導入の背景**

弊社 アイスタイルグループで運営しているWebサイトは、
@cosme上とそこで姉妹サイトと表示されているものだけでも15、その他も含めると20程度のサイトを運営しています。

サイト数が多い分、サーバも用途や言語・バージョンが異なるものも多いため、そこそこ数があります。
**サイトごとにMemcachedが乱立**していたり、**Webサーバ内に同居しつつMemcachedクラスタ化**していたり、日に日にメンテナンス性が損なわれていく状態です。。。

ココで一念発起して、サイト横断で使えるKVSクラスタを作ろう！ というのが事の始まりでした。

しかしCouchbaseを本当に導入するのかどうかは決まっていません。
検証中のため間違ったことも書いているかもしれません、予めご承知おきください。

# **Couchbaseについて**
Couchbase公式(http://www.couchbase.com/)
Developerサイト(http://developer.couchbase.com/)

オープンソースの分散型NoSQLドキュメント指向データベースです。
JSON形式のドキュメントでスキーマレスにデータベースを利用できます。

ドキュメントのキャッシュ方式はメモリとディスクのハイブリッドで、利用頻度に応じて使い分けます。
すべてのデータをディスクに保管することで永続性も確保できます。

個人的に面白いなーと思ったのはそのままMemcachedのClientライブラリが利用出来る点です。
残念ながらMemcacheのほうは対応していなさそうで、うまく動かせていません。

# **導入の検討**

では「なぜCouchbaseなのか」という点についてですが、主に3つの理由が挙げられます。

**1. 構築・運用が容易であること**
 - 特にデータのReplicationやログ出力とローテート周り
 - 運用に必要な情報が幅広く取得できること(クラスタやバケットの情報など)
**2. オンラインで大きな影響なくクラスタノードを増減出来ること**
 - 多少キャッシュ側の処理速度が落ちたとしても、ヒットレートが下がらない方が良い
 - ヒットレートが落ちてバックエンド側に大きな負荷がかかる想定でシステムを組むと無駄が増える
**3. 開発側のメンバーが取っ付き易いこと**
 - 基本CLIでステータス見る運用はなかなか浸透しない
 - でもすべて可視化していくプロセスは結構面倒くさい
 - 最初からBucket毎にグラフ化されていたり、アクセスの多いKeyが見れたりするのは助かる

特に、Memcachedはログ出力やそのローテートにも癖があり、トラブルシューティングは割と面倒くさい傾向にあります。
主に使う情報も大体はSTATSなどで、Couchbaseのようにリアルタイムに更新されるグラフなどが予め可視化されていて簡単に確認出来るのは結構嬉しい。
あとでデータの取り方を調べて弊社内のリソース監視に統合しないと行けないって考えると結構大変ですが。。。

また、以下のスクリプトを利用することでコマンドラインベースの運用も可能です。
出力はJSON形式なので管理者の方々はGUIが使えない時のために慣れておくと良いです。

```lang:couchbase-cli
root@couch-test01 ~]# /opt/couchbase/bin/couchbase-cli help
couchbase-cli - command-line cluster administration tool

CLUSTER:
  --cluster=HOST[:PORT] or -c HOST[:PORT]

OPTIONS:
  -u USERNAME, --user=USERNAME      admin username of the cluster
  -p PASSWORD, --password=PASSWORD  admin password of the cluster
  -o KIND, --output=KIND            KIND is json or standard
  -d, --debug
  -s, --ssl                         uses SSL for communication with secure servers

NOTE:
  USERNAME can be set in environment variable CB_REST_USERNAME and/or
  PASSWORD can be set in environment variable CB_REST_PASSWORD instead

COMMAND:
  bucket-compact        compact database and index data
  bucket-create         add a new bucket to the cluster
  bucket-delete         delete an existing bucket
  bucket-edit           modify an existing bucket
  bucket-flush          flush all data from disk for a given bucket
...(長過ぎるので割愛)...

```

デメリットは今のところ以下の様な感じでしょうか。。。検証が進むと増える恐れがあります。
- Enterprise向けらしいのである程度大規模な構成からスタートしないとメリットが出ない。
    - 他サイトの比較を見る限りレスポンス速度自体はMemcachedのほうが速い。
- どうも公式に乗っているドキュメントにデメリットみたいのが載っていないのが気になる。
- Memcachedに比べるとどうしても一般的なノウハウは少ない。公式の英語ドキュメントを頑張って読みましょう。
    - でも読んでてもう少しわかりやすく書いて欲しい面もある。
- Memcached互換のBucketを作成・削除する際に、そのBucket周りの動作が不安定なことがある。（再現性はなし）

# 予告

後編では、実際にデータベースにクエリ(NiQL)を発行してみたり、
PHPに組み込んでアクセスログ解析を試行した際のテストコードを公開していきます。
Ryuを動かそう！ 第ニ回 SimpleSwitchを起動

# はじめに
今回は、[Ryu Bookのスウィッチングハブ](http://osrg.github.io/ryu-book/ja/html/switching_hub.html)からmininet上で仮想ホストからpingを通すところまで解説します。
本記事ではとりあえず、ryuにて仮想ネットワークを動かすことを目的として解説します。
詳細はRyu Bookを読んでもらえばと思います。

# 手順
1. [前回](http://qiita.com/kojisato118/items/ad8667266c846eb5e642)を参考にVMを立て、eth1を設定しておく。
2. `$ssh -X ryu@192.168.56.101`(macのターミナル)
3.  `$sudo mn --topo single,3 --mac --switch ovsk --controller remote -x` (ssh上)
4.  `$ovs-vsctl set Bridge s1 protocols=OpenFlow13` (起動したswitch:s1と書かれたxterm)
5.  `$ryu-manager --verbose ryu.app.simple_switch_13`     
     or     
     `$ryu-manager --verbose ryu/ryu/app/simple_switch_13.py`    
     (起動したcontroller:c0と書かれたxterm)

# pingの実行
## xterm上のhost(1 ~ 3)から
- `$ping 10.0.0.1` (to h1)
- `$ping 10.0.0.2` (to h2)
- `$ping 10.0.0.3` (to h3)

## mininet上から
`$h1 ping h2`

# 終わりに
こんな感じで、簡単に仮想ネットワークにSDNを導入できます。
今後は、各コマンドの解説や、simple_switchないの解説などをしようと思っています。」
ConoHaでUbuntu+Apache+Ruby on Railsのセットアップ

ConoHa VPSを借りて、サーバにしたときの作業メモです。
ここでは、本番環境として利用します。

環境はクライアントがMacBook、サーバがUbuntuです。
ConoHaのサーバ再構築でUbuntu14.04を選択しました。

この作業のあと、Passengerをインストールして公開までの手順は別途記載します。

# 事前準備

## ユーザ作成

sudoグループのユーザを作成(例：usernameというユーザを作成する)

`$ adduser username`

sudo権限を付与する

`$ gpasswd -a username sudo`

## セキュリティ設定

ファイアウォールを有効にする(デフォルトを全部アクセス不許可にする)
`$ sudo ufw enable`
`$ sudo ufw default DENY`

## SSHの接続設定

SSHのインストール
`$sudo apt-get install ssh`

SSHの設定を変更する

`sudo vi /etc/ssh/sshd_config`

```bash:/etc/ssh/sshd_config
# SSH接続Portを10000に変更
Port 10000
# Password認証を有効
PasswordAuthentication yes
# チャレンジレスポンス認証を有効
ChallengeResponseAuthentication yes
# rootログイン許可
PermitRootLogin no
```

sshdを再起動

`$ sudo /etc/init.d/ssh restart`

configで指定したポート番号を許可に設定

`$ sudo ufw allow xxxxx`

Port指定でSSH接続する(サーバのIPアドレスが192.168.11.1、ユーザ名がusernameの前提)

`$ ssh -p 10000 -l username 192.168.11.1`

接続できることを確認したら、ログアウト

`$ exit`

## 公開鍵・秘密鍵を作成

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

デフォルトで良ければEnterで進めます。
※私はpassphaseだけ入れました。

```text:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx username@Computer.local
The key's randomart image is:
```
## 公開鍵をアップロード

仮でユーザのhomeディレクトリ配下に公開鍵をアップロードする

`$ scp -P 10000 /Users/username/.ssh/id_rsa.pub username@192.168.11.1:~/authorized_keys`

ユーザでログインし、/root配下に格納し直す

`$ su`
`# mv /home/username/authorized_keys /root/.ssh/authorized_keys`

sshに接続し、問題なければパスワード認証をnoにしてsshdを再起動する

```bash:/etc/ssh/sshd_config
# Password認証を無効
PasswordAuthentication no
# チャレンジレスポンス認証を無効
ChallengeResponseAuthentication no
```

# Apache+Rails+Passenger環境のインストール

こちらを大いに参考にしました。
http://www.oiax.jp/rails/zakkan/rails_4_2_installation_on_ubunt.html

## railsのインストール

apt-getを全部アップデートしてから、いろいろインストール

`$ sudo apt-get update`
`$ sudo apt-get install git`
`$ sudo apt-get install curl g++ make`
`$ sudo apt-get install zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev`
`$ sudo apt-get install sqlite3 libsqlite3-dev nodejs`
`$ git clone git://github.com/sstephenson/rbenv.git .rbenv`
`$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc`
`$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc`
`$ exec $SHELL`

rbenvをインストール

`$ mkdir -p ~/.rbenv/plugins`
`$ cd ~/.rbenv/plugins`
`$ git clone git://github.com/sstephenson/ruby-build.git`
`$ rbenv install 2.2.2`
`$ rbenv global 2.2.2`

railsをインストール

```bash:~/.gemrc
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
```

`$ gem install rails --version="~> 4.2"`
`$ rbenv rehash`
ConoHaに独自ドメインを設定

ConoHaにムームードメインで取得した独自ドメインを設定したので、作業メモ

# ドメイン取得
ムームードメインで好みのドメインを取得します。

# ドメインのDNS登録
ConoHaのコントロールパネルからDNS→ドメインを選択し、取得したドメインを登録します。
また、下記を追加します。

```text
タイプ：A(通常)
名称：www
値：<ConoHaのコントロールパネルで、サーバ→サーバを選択→ネットワーク情報→IPアドレスで出てくるIPアドレスを設定>
```

# ムームードメインへの登録
ムームードメインのコントロールパネルで、ドメイン管理→ドメイン操作→ネームサーバ設定変更を選択し、取得したドメインの「ネームサーバ設定変更」を選択します。
GMOペパボ以外のネームサーバを選択し、ConoHaのドメイン追加時に出てきたNSのアドレスを設定します。

# apacheに設定

```bash:/etc/hosts
192.168.11.1 www.name.com server-name
```

apacheを再起動

`$ sudo /etc/init.d/apache2 restart`
【iOS】配列の要素をユニークにしてみる


## 初めに

[今どきのiAd実装 - Qiita](http://qiita.com/koogawa/items/cf34d8e45527c8c1831e)を拝見いたしまして、3日目で途切れるのも嫌だったので、急遽書かせていただきます。

仕事終わりに見て次の日空いてたら極力書こうかなと思っています。

全ては[iOS Second Stage Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/ios-2)のためです。

**Advent Calendar**に空きを作りたくないです。

## 本題

何書こうか迷いましたが、今回は **iOS**というよりは **Swift**について書きます。

書いていいか正直迷いましたが、書いてから怒られようと思います。

ということで **Swift**のジェネリックを使って配列(`Array`)をユニークにする方法を紹介します。

`Set`使えばいいじゃんっていうのは許してください。

ジェネリックやら`protocol extension`っていうのに触れてみたかったんです。

## ソースコード

できるだけ **Swift2**の記法に合わせたくて以下の形でできました。

```swift:Uniq.swift
import Foundation

extension SequenceType where Generator.Element: Equatable {
    
    public func uniq() -> [Generator.Element] {
        var result: [Generator.Element] = []
        for element in self {
            if !result.contains(element) {
                result.append(element)
            }
        }
        return result
    }
}

let names = ["hoge", "fuga", "foo", "bar", "fuga"].uniq()
print("names = \(names)")
// names = ["hoge", "fuga", "foo", "bar"]
```

## 解説

`Array`を拡張せずに`SequenceType`を拡張しました。

`SequeceType`についてですが、以下の記事がとってもわかりやすいので参考にしてみてください。

[Swift - GeneratorとSequence - Qiita](http://qiita.com/naoty_k/items/970796fe56b4ab083278)

## おまけ

独自に組んだクラス（例えばAPIから取得したEntity）などで重複なしの配列に変えたい時があるかと思います。（自分がそうでしたので）

例えば以下のようなクラスを保持していたとします。

```swift:Cat.swift
class Cat {
    let name: String
    
    init(name: String) {
        self.name = name
    }
}
```

ですが同じクラス（猫）の重複を削除したい場合（上記で言えば同じ名前を持つ猫を外したい）どうしましょうという話です。

答えは簡単で`Cat`クラスが`Equatable`を継承すれば大丈夫です。

### Equatable

`Equatable`を継承すると同じ型同士を`==`で評価できるように実装しなければなりません。

以下のようにします。

```swift:Cat.swift
class Cat: Equatable {
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

// これを実装します
func ==(lhs: Cat, rhs: Cat) -> Bool {
    return lhs.name == rhs.name
}
```

上記のように実装すれば先ほど作成した`uniq()`関数も使えます。

また`switch`文での`case`での分岐でも使えるので結構重宝します。

## 終わりに

と短めではありますが、結構これをかけるようになった時に`Swift`に近づけたなって思えたので紹介しました。

最後に僕の苦悩を紹介して、終わりにします。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">アドベントカレンダー、登録少ないから書こうかな！&#10;<a href="https://t.co/NPr7BI2Gw0">https://t.co/NPr7BI2Gw0</a></p>&mdash; ryokosuge (@ryo_kosuge) <a href="https://twitter.com/ryo_kosuge/status/672047159538114561">2015, 12月 2</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/ryo_kosuge">@ryo_kosuge</a> iOSと書いてあるけどSwiftの事書いて良いのかな...</p>&mdash; ryokosuge (@ryo_kosuge) <a href="https://twitter.com/ryo_kosuge/status/672063240323489793">2015, 12月 2</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/ryo_kosuge">@ryo_kosuge</a> いいや、書いてから怒られよう</p>&mdash; ryokosuge (@ryo_kosuge) <a href="https://twitter.com/ryo_kosuge/status/672064745260711936">2015, 12月 2</a></blockquote>

5分も悩んでませんでした。

以上になります。

## 参考

- [Swift - GeneratorとSequence - Qiita](http://qiita.com/naoty_k/items/970796fe56b4ab083278)
WebKit系ブラウザでforeignObject下に構築したMathJaxのsvgが表示されない

## 概要
多分こういうのが動かない.(特に条件を詳しく調べたわけではない)

```html
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG"></script>
<svg>
  <g transform="translate(100, 0)">
    <foreignObject width="300" height="300">
      $$e^{i\theta} = \cos\theta + i\sin\theta$$
    </foreignObject>
  </g>
</svg>
```
原因はレンダラがforeignObjectの上にある要素に指定されたtransformを全部無視してしまうからぽい. WebKit系エンジン特有のバグ.単にtranslateが無視されるだけならいいが, 最初何も表示されないのにCtrl+Tabとかでタブを移動して戻ってくると(0,0)に表示されてたりしてかなり混乱させられた.

## 解決策
```css
.MathJax_SVG_Display {
       position: static !important;
}
```

## まとめ
やっぱinline svgはつらい.

## 参考
- https://github.com/mathjax/MathJax/issues/279
- https://bugs.webkit.org/show_bug.cgi?id=93358
Unity uGUIs -ウグイス- Auto Binding編

# Unity uGUIs -ウグイス- 1人でがんばりますカレンダー Advent Calendar 2015

この記事は[Unity uGUIs -ウグイス- 1人でがんばりますカレンダー Advent Calendar 2015](http://qiita.com/advent-calendar/2015/unity-uguis)の3日目の記事です。

カレンダーの購読をしてくださる方がちょいちょい出てきてくれていて本当にありがたい限りです。
すでにネタ切れが見えていて辛い部分しかないんですが、書ける限りはがんばりますのでよろしくお願いします。

それでは、本編へ

# 基本機能というかおさらい的なお話

[2日目の記事](http://qiita.com/Kogarasi/items/36b51f292de41a869370)及び、その中にあるサンプルプロジェクトをご覧になった方にはおわかり頂けるのかなと思うのですが、
例えばボタンを利用するためには"対象のボタンオブジェクトの名前"と"uGUIs.UI.Buttonクラスの継承"の二点をクリアすれば利用できます。
**単純に押さえておいて欲しい点はそれだけ**ですね。

あ、後この機能ですがボタンだけに限らずUIコンポーネント色々準備をしています！ToggleだったりSliderだったり！
他のUIコンポーネントであってもあまり書き方は変わらずです。

とりあえずボタンではこのような感じになります↓

```csharp:SampleButton.cs
public class SampleButton : uGUIs.UI.Button<SampleButton> {
  public void OnClick(){
    Debug.Log( "ボタンがクリックされたよ！" );
  }
}
```

上記ようなコードを書いて、空っぽでも既存のでも良いですがGameObjectへアタッチ。
後はCanvas内に"SampleButton"があれば自動的に紐付けされます。
その結果、細かい事に意識をすることなくボタンというUIを利用することが出来るようになります。

という部分までは前回お話しした内容と同じ部分です。

# Attributeによる対象の変更

さて、みなさん心の中で思うことがあると思います。

**対象のボタンの名前と同じクラス名じゃないとダメなのか？**
**コールバックはOnClickじゃないとダメなのか？**

もちろん変更できるような仕組みにしてあります。
その際には対象のクラス及び関数に対して必要なAttributeを設定することで変更できるようになっています。
例えばこんな感じです

```csharp:SampleButton2.cs

[uGUIs.Attribute.TargetBind( "紐付けたいボタンの名前" )]
public class SampleButton2 : uGUIs.UI.Button<SampleButton2> {

  [uGUIs.Attribute.CallbackBind( "OnClick" )]
  public void DoSomething(){
    Debug.Log( "何かする" );
  }
}
```

TargetBindとCallbackBindというAttributeを用いることで上記のように任意の設定を行うことが出来ます。
まあ、自分で付けておいてこの機能ってさほど重要ではないだろうなという感じです。

# 終わりに

今回もかるーくかるーくな説明で終わってしまいましたが、実装とかどうやってるのみたいな話は後日出来たらなーという感じで。
まだまだAuto Bindingも足りない機能というのがあるのでそれも追加していかないとですね・・・。

明日はコンポーネント装飾関連の説明記事を書いていきます！
【Linux】ユーザID/グループIDを指定してパッケージインストール

## Linux Tips ##
Linuxに関するちょっとした豆知識です。

rpmやyumでパッケージをインストールする場合、登録されるサービスのユーザIDやグループIDは通常は自動的に割り当てられる(※)。空いているところに連番だったり、あるいはデフォルトで決まっていたりする。
※ソースからコンパイルしてインストールする場合は、事前に指定できる場合はあります。

ユーザID/グループIDを全てのサーバで共通の値とするようにシステム設計をしている場合、自動的に割り当てられると、他サーバと異なってしまうことが多々ある。後からの変更は、アプリケーションによっては、苦労するケースが多々ある。

これを解消するには、事前にユーザ/グループを作成してから、rpmやyumをインストールすれば、事前に指定したユーザID/グループIDとすることができます。

# 検証 #

apacheで検証してみます。
apacheの場合、rpmでインストールすると、デフォルトでは、48:48になります。

■デフォルト
apache: x :48:48:Apache:/var/www:/sbin/nologin

```

事前に以下のようにユーザ作成
# grep -i apache /etc/passwd
apache:x:2001:2001:Apache:/var/www:/sbin/nologin

yum 実施(この環境は、apacheがインストールされていたので、一度強制アンインストールしてから、インストールし直しました)。
# yum install -y httpd
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.kddilabs.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.2.15-47.el6.centos will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package      Arch          Version                        Repository      Size
================================================================================
Installing:
 httpd        x86_64        2.2.15-47.el6.centos           updates        830 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 830 k
Installed size: 2.9 M
Downloading Packages:
httpd-2.2.15-47.el6.centos.x86_64.rpm                    | 830 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
** Found 3 pre-existing rpmdb problem(s), 'yum check' output follows:
httpd-devel-2.2.15-47.el6.centos.x86_64 has missing requires of httpd = ('0', '2.2.15', '47.el6.centos')
php-5.3.3-27.el6_5.x86_64 has missing requires of httpd
php-5.3.3-27.el6_5.x86_64 has missing requires of httpd-mmn = ('0', '20051115', None)
  Installing : httpd-2.2.15-47.el6.centos.x86_64                            1/1
  Verifying  : httpd-2.2.15-47.el6.centos.x86_64                            1/1

Installed:
  httpd.x86_64 0:2.2.15-47.el6.centos

Complete!
# 
# grep -i apache /etc/passwd
apache:x:2001:2001:Apache:/var/www:/sbin/nologin
→2001:2001のままである！！！

```

ユーザID/グループIDを指定したい場合は、ご活用ください！！
RxとPromise: 「RxJavaでPromiseしたい！！！１１」

## TL;DR
* Promiseは単一イベントを扱うよ！
* Rxは複数イベントの流れ（ストリーム）を扱うよ！
* Rxで逐次処理させたいときは`flatMap()`で都度Observableを作っていくよ！


## Introduction
RxJava大流行時代，その導入の理由（建前）としてよく語られるのは次のようなものが多い気がする．

* **Promise**（っぽいもの
  - 複数の逐次 or 並行な非同期処理をいい感じに捌きたい
* **データバインディング**（的な
  - Modelの変更をいい感じにViewに通知したい
* **リスト処理**

特に，非同期まわりでつらさMAXになるAndroid界においては，1つ目のPromiseっぽいのが結構需要高い気がしている．ただ，「Rxを使ってPromiseみたいなことができるよ！」と書いてある記事はあっても具体的な考え方等に触れているものはあまり見た記憶が無いので，本稿ではそこに着目していく．


## RxとPromise
そもそも「RxとPromiseは扱う対象が異なる」ということを知ってないと混乱を招く．

* Promise / Future
  - 「単一の非同期イベント」を扱う
* Rx
  - 「複数イベントのストリーム」を扱う

Rxは（順番がある）複数のイベントが次々に流れてくるものを処理していく．また，完了/エラー通知（`onComplete`/`onError`）がない限りはそのストリームは無限に続く．Rxになれた人からすれば至極当然であるが，はじめてRxに手を出した人がこれに気付くことができないと無限ストリームを漂流するハメになる．


## どうやってRxでPromiseするの？
JSのPromise，jQueryの[deferred](https://api.jquery.com/category/deferred-object/)や[JDeferred](http://jdeferred.org/)に出てくる各種用語や概念っぽいものとの対応はだいたい以下のとおり．

| | Promise | Deferred | Rx |
| --- | --- | --- | --- |
| 返り値 | `Promise` | `deferred.promise()` | Observable |
| 処理完了通知 | `resolve()` | `resolve()` | `onNext()` / `onComplete()` |
| エラー通知 | `reject()` | `reject()` | `onError()` |
| 逐次処理 | `then()` | `then()` | `flatMap()` |

「Promiseの代わりにObservableで非同期処理を包んだクラスを作ろう！」みたいなときに気をつけるのは，RxはPromiseと違って複数イベントを扱うものなので「処理の完了（`onComplete()`）」を流さないといけない，ということ．

また，`flatMap()`についてだが，ググると大体は「`flatten`と`map`を同時にやってくれるやつ！」みたいなのが出てくる．が，Promise的に使いたいときは「`Observable`を別の`Observable`に変換する」と考える．`map`が単なる値の変換（写像）をするのに対して，`flatMap`は「値から新しく`Observable`を生成して放流する」．ちょうどJDeferredの`DonePipe`に近い感じ（`DonePipe`は前の結果からあたらしく`Promise`作って返す）．


## Rxのトラップ: ストリームを稼働させる
たとえばPromiseやJDeferredなら何もせずとも処理が始まる．一方，Rxの場合は`Observable`を`subscribe()`（購読？）してあげないと処理が始まらない．もしくはObservableをHotなObservableに変換してあげればストリームの強制起動が出来る．このHot/Cold Observableの概念はややこしいが，慣れると何となく感覚で理解できるようになる．『[RxのHotとColdについて - Qiita][hot-cold]』の解説がかなり分かりやすい．

## Conclusion
* Promiseは単一イベントを扱うよ！
* Rxは複数イベントの流れ（ストリーム）を扱うよ！
* Rxで逐次処理させたいときは`flatMap()`で都度Observableを作っていくよ！


[hot-cold]: http://qiita.com/toRisouP/items/f6088963037bfda658d3
実験計画法と組合せ最適化

これは、[アルゴリズム Advent Calendar 2015](http://qiita.com/advent-calendar/2015/algorithms)の3日目の記事です。

# はじめに
実験計画法の簡単な紹介と、その発展として組合せ最適化によるアプローチを紹介します。

# 背景
- センサー情報からある解析をしたいとします。
- センサーは、1万円のものと3万円のものがあり、置かないこともあるので、3種類の選択があります。
- センサーの設置場所は、20カ所の候補があります。
- 全センサーの総購入費用は5万円以下に抑えないといけません。
- どこにいくらのセンサーを置いたら、効率よく検証できるのかを知りたいものとします。

ケースの例としては、「A地点とB地点に1万円のセンサー、C地点に3万円のセンサーを配置」となります。

# 用語
下記の用語を使います。

- 要因：水準を決めたい検討対象。今回は、センサーの配置候補。
- 水準：要因の取り得る値。今回は、センサーの費用で、0万円、1万円、3万円の3種類。
- 交互作用：ある要因の与える影響が他の要因の水準によって変わること。
- ラテン方陣：数字の行列で、その行やどの列にも同じ数字がないもの。
- 実験計画法：効率のよい実験を行う方法。ここでは、ケース数の削減を目指します。

今回は、交互作用はないものとします。

# 実験計画法を用いたケース数の求め方。
背景の話とは別に一般論として、要因が3種類、水準が3種類の例を示します。単純に考えると$3^3 = 27$通りのケース数が必要になります。

実験計画法では、ラテン方陣(下図)を元にケース数を作成することができます。

1|2|3
:--|:--|:--
2|3|1
3|1|2

ラテン方陣を使うと以下のように9ケースで効率よく行うことができます。この9ケースは、全ての要因・水準の組合せを含んでいて、どの要因・水準の数も同じになっています。

選択された9ケース(各要因ごとの水準)

- 1,1,1
- 1,2,2
- 1,3,3
- 2,1,2
- 2,2,3
- 2,3,1
- 3,1,3
- 3,2,1
- 3,3,2

ラテン方陣の9マスそれぞれがケースに対応するので、行番号を要因1、列番号を要因2、マスの数字を要因3の水準と考えます。

# 実験計画法の欠点
実験計画法では、以下の欠点があります。

- 特定の要因数、水準数しかできません。
- 追加の条件があっても考慮できません。

# 組合せ最適化による考え方
実験計画法では、要因・水準の組みを一定数確保した上で、なるべく少ないケース数になるように選んでいました。
同じことを最適化問題として考えることができます。
具体的には、各要因の各水準を含むケースの最低数を指定して、ケースの選択方法を混合整数最適化によって求めます。

定式化

目的関数|$\sum_i{v_i}$|必要ケース数
--:|:--|:--
制約条件|$\sum_i{\\{C_{ij} v_i ｜ C_{ij} = k\\}} \ge N$ $\forall j \lt 3, \forall k \in \\{0, 1, 3\\}$|各要因、各水準ごとにケース数が最低数以上あること
変数|$v_i \in \\{0, 1\\} \forall i \lt 総ケース数$|各ケースごとに選択するかどうか

$C_{ij}$は$i$番目のケースの$j$番目の水準を、$N$は最低数を表します。

Pythonを用いると以下のように求めることができます。(変数casesに、購入費用が5万円以下の総ケースが入っているものとします。)

```py3:python
from pulp import *
r = [0, 1, 3] # 水準
for N in [20, 40, 60, 120]: # 最低数
    m = LpProblem()
    v = [LpVariable('v%d'%i, cat=LpBinary) for i in range(len(cases))]
    m += lpSum(v)
    for j in range(len(cases[0])):
        for k in r:
            m += lpSum(v[i] for i in range(len(cases)) if cases[i][j] == k) >= N
    m.solve()
    print(N, LpStatus[m.status], value(m.objective)) # 最低数、ステータス、ケース数
```

## 結果
ランダムサンプリングの場合と比較してみます。ランダムサンプリングの最低数はシミュレーションで出したおおよその値です。
組合せ最適化を用いることで効率よくケースを選択できたことがわかります。

最低数|組合せ最適化|ランダムサンプリング
--:|--:|--:
20|400ケース|3200ケース
40|800ケース|5700ケース
60|1200ケース|7900ケース
120|2400ケース|14400ケース
fishにしたらrvmが動かなくなったけどなんとかなった話

## あらまし
### どうした
fishにしたら、rvmがうごかぬ。

### それで？
[こうした][1]でござる。

### ・・・・・英語やん
いいか、３行にすると、

1. `curl -L --create-dirs -o ~/.config/fish/functions/rvm.fish https://raw.github.com/lunks/fish-nuggets/master/functions/rvm.fish`
2. `~/.config/fish/config.fish` に `rvm default` を追加
3. Terminalを再起動。

以上だ！！！！


## なにがどうなっていやがる！！！
これは、rvm use などを使って、

`RVM is not a function, ....`

って起こられてしまうときの対処法。

## なぜ？？？
rvmのスクリプト群が読み込まれていないのが原因らしい。

`source` 

でいけるっていうソースをちらほら見かけるけど、bashの場合の対処法のようで、fishには通用しない。

そこで上記先人の知恵を借りる。
ちなみに中身を見ると結局bash経由で

`source ~/.rvm/scripts/rvm`

してたりする。fishは辛いよ。

## 参考文献
[Fish Shell -RVM][1]


[1]:https://rvm.io/integration/fish
ちょっと素敵なHaxeのoverride

ActionScript3.0やC#などと異なる挙動なので、ちょっと見落としがちなHaxeのoverrideの挙動についての話です。

# 戻り値はより狭い型を指定しても良い

Haxeでは以下のように、関数の戻り値に元の型より狭い型を指定してもエラーになりません。

```hx
class A{
    public static function main() {}

    public function a():Float {
        return 0.5;
    }
}

class B extends A {
    public override function a():Int {
        return 1;
    }
}
```

見慣れないとこれがコンパイルエラーにならないのは問題がありそうにみえますが、深く考えてみれば問題がないことがわかります。

あるAのインスタンスについての関数aの呼び出しを考えてみます。

```hx
var number:Float = a.a();
```

この関数の返り値はFloatです。そして、HaxeではIntはFloatに含まれる型なので**返り値がIntでも問題無い**わけです。

何の矛盾も生じないのですからコンパイルエラーにする必要がありません。

このように戻り値の型を元の型よりも限定された型に変えるのを**共変戻り値型**と言います。

では、逆の場合はどうでしょう？

```hx
class A {
    public static function main() {}

    public function a():Int {
        return 1;
    }
}

class B extends A {
    public override function a():Float {
        return 0.5;
    }
}
```

**逆はコンパイルエラーになります**。FloatにIntを代入することはできません。

# 引数はより広い型を指定しても良い

関数の引数に元の型より広い型を指定してもエラーになりません。

```hx
class A {
    public static function main() {}

    public function a(number:Int) {}
}

class B extends A {
    public override function a(number:Float) {}
}
```

考え方は戻り値の時と同じです。

```hx
a.a(1);
```

上記のような呼び出しでは、関数aの引数の受け取り側がFloatであったとしても矛盾は生じないのでエラーになりません。

このように引数の型を元の型よりも抽象的な型に変えるのを**反変引数型**と言います。

もちろん逆に、引数をより限定的な型に変えようとするとエラーになります。

# privateをpublicでoverrideしても良い

上記の2つと同じで、矛盾は生じないのでコンパイルエラーになりません。

```hx
class A {
    public static function main() {}

    private function a() {}
}

class B extends A {
    public override function a() {}
}
```

逆にpublicをprivateでoverrideすることはできません。

以上、Haxeは矛盾しない範囲でなら寛容なoverrideができて、ちょっとうれしいよという話でした。
slackのinline code blockを便利にするグリモンスクリプト

slackは [slack でのいろんな表記方法](http://qiita.com/amanoiverse/items/186c71af92c9494ab26f) にも書かれているように、一部ではありますがMarkdownライクな記述に対応しています。
しかし、この機能は日本語まじりで使うと問題が出ることがあります。

問題点
-------------
実例を見てみましょう。

```text:入力した文字列
@slackbot あ、`SomeBuilder#build`の`ensure`で不要なファイルは削除しておいてねー。
```
![japanese1.png](https://qiita-image-store.s3.amazonaws.com/0/27861/2a26a7e1-82f0-e51e-0ad0-7263c909b075.png)
はい、コードブロックになるべきバッククォートで囲まれた部分がそのまま表示されてしまい、うまくいきません。

英語に代表される、単語をスペースで区切る言語であれば特に問題にはなりません。

```text:入力した文字列
@slackbot Please delete unnecessary files in `ensure` block of `SomeBuilder#build`.
```

![english1.png](https://qiita-image-store.s3.amazonaws.com/0/27861/0f9fdc43-cb50-dd64-f141-287bd2b46ae1.png)

どうもバッククォートの前にスペース（や一部の半角記号）が無いとうまく動かないようです。

対応方法
-------------
手動でスペースを入れれば動くのですが、面倒ですね。面倒なことは自動化しましょう。

ということでこんな[Greasemonkey](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/)用のScriptを書きました。
Chrome環境であれば[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)で使えるかと思います。

インストールは[こちら](https://gist.github.com/Sheile/56834fb8e76fbb54ae11/raw/f9ab6c825b2a6c9dbd212c8a30fd58089107e3e1/insert_space_before_backquote.user.js)からどうぞ。

```js:insert_space_before_backquote.user.js
// ==UserScript==
// @name        Insert space before backquote
// @namespace   net.sheile.dev.slack-backquote
// @include     https://*.slack.com/*
// @version     1
// @grant       none
// ==/UserScript==
(function() {
  $('#message-input').bind('keydown', function(e) {
    if(e.keyCode == 13 && !e.shiftKey) {
      var message = $(this).val();
      message = message.replace(/(^|.)(`([^`\r\n]+?)`)/g, function(match, pre, entire) {
        if(pre.match(/^$|[\s,.!"#$%&(-={?:;<>^\[]/)) return match;
        return pre + ' ' + entire;
      });
      $(this).val(message);
    }
  });
})();
```

動作確認
-----------------
```text:入力した文字列
@slackbot あ、`SomeBuilder#build`の`ensure`で不要なファイルは削除しておいてねー。
```

![japanese2.png](https://qiita-image-store.s3.amazonaws.com/0/27861/992c3f42-108a-dfb3-268d-4aa36437e0c7.png)

良いですね！

JavaScriptの正規表現は後読みに対応していないので、二連続のバッククォートとかには対応できていませんが、普通に使う分には困らないかと思います。
なお、強調や斜体、取り消し線については前だけではなく、後ろにもスペースが必要なようですが、自分の場合はほとんど使わないので、誤マッチを考えると手動で良いかな、と思っています。

明日は@ara_ta3さんで「Slackに新しいチャンネルができたら特定のチャンネルに通知を送るスクリプトを組んだ話」のようです。
【FileMaker】リストレイアウトで枠線を表示する

今日も小ネタです。

リストのレイアウトに限りませんが、データの枠線、現在選択しているレコードしか枠線が出てこなくてちょっと見栄えが良くないな。。。と思う時ありませんか？

こんな↓感じで。
![スクリーンショット 2015-12-02 16.14.56.png](https://qiita-image-store.s3.amazonaws.com/0/60538/256dbd1d-2467-4741-1d65-8d2b39e6d375.png)

これが↓原因です。
![スクリーンショット 2015-12-02 16.15.21.png](https://qiita-image-store.s3.amazonaws.com/0/60538/86028905-2e76-dc84-36b0-31681afeb0b8.png)

外してみましょう。
![スクリーンショット 2015-12-02 16.15.46.png](https://qiita-image-store.s3.amazonaws.com/0/60538/3b46a108-5d9c-a03b-c93a-c59485fbe187.png)

ほら！選択していないレコードでも枠線が出てきましたね。
![スクリーンショット 2015-12-02 16.16.05.png](https://qiita-image-store.s3.amazonaws.com/0/60538/a072b4b6-b98f-4c3a-bfcb-27bf84c24474.png)

小さいことですが、見た目的に「入力できるのか」「できないのか」はわかった方がいいですもんね。
レイアウトモードで枠線をひく前に、レイアウトの設定、ぜひとも見直してみてください！
Sketch のファイル形式

何気に Sketch 3 のファイルをテキストエディタで開いてみて気付きました。

Sketch 2 ・Sketch 3 で保存ファイルに利用されているファイル形式は専用のものではなく、汎用的なフォーマットです。

# Sketch 3 のファイルフォーマット

SQLite 3 なので、SQLite ビューワなどで開いてあげると見ることができます。

<img width="400" alt="Screen Shot 2015-12-02 at 18.47.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/17936/e52d8d85-bb39-67e8-5caf-7d99e47854e2.png">

SQLite ビューワ [Base](http://menial.co.uk/base/) で Sketch のファイルを開いてみたところ。

基本的にデータは blob で保存されているようです。どの程度まで読み取ることできるかは解析していません。

# Sketch 2 のファイルフォーマット

Sketch 2 のファイルはパッケージ形式で、実態はフォルダです。

<img width="400" alt="Screen Shot 2015-12-02 at 18.52.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/17936/b414f43f-d063-554c-467d-ccd4a701b9e9.png">

Finder で「Show Package Contents ...」（日本語だと「パッケージの内容を表示」でしょうか）を選ぶと中身が確認できて、

* Data
* metadata
* version

という 3 つのファイルが格納されています。

`metadata` は XML ファイル、`version` は plain text なので、そのままテキストエディタで開いて確認できます。

<img width="400" alt="Screen Shot 2015-12-02 at 18.58.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/17936/2c2c9ccd-d005-8ac2-495f-ef798aaa4245.png">

`Data` はバイナリな plist ファイルなので、Property List Editor で開くことができます。

もし Property List Editor がなければ、`Data` を `Data.plist` と拡張子をつけて Xcode で開いて確認することができます。
git sadaコマンドを打つとどうなるか

## はじめに

さだまさしさんの作る曲の魅力とは何でしょうか？
もちろんメロディもすばらしいのですが、やはり歌詞のすばらしさを挙げる人が多いのではないでしょうか。
この時期に聴く「遥かなるクリスマス」とか本当にいいですよね。

というわけで、さださんの魅力のひとつである歌詞をファン以外の人にも伝えるための`git sada`コマンドを作ってみました。

## こうなります

gitのコミットメッセージがすべて「北の国から」の歌詞に変わります。

![スクリーンショット 2015-12-02 20.41.44.png](https://qiita-image-store.s3.amazonaws.com/0/37435/469c8568-5651-f665-67b2-0ffe02e1d808.png "スクリーンショット 2015-12-02 20.41.44.png")

実際に[git-lfsのfork](https://github.com/shibukk/git-lfs/commits/master)で試しにやってみました。
あたかも「北の国から」の歌詞の魅力が海外の方にも伝わったように見えますね。

## やり方

`.git/config`にこんな感じでエイリアスを設定します。
たったこれだけで`git sada`コマンドが使えるようになります。

```git:.git/config
[alias]
	sada = filter-branch -f --msg-filter 'ruby -e \"puts \\\"アーア アアアア アーアー,アアー アアアア アー,ンンー ンンンン ンーンン,ンンン ンンン ンン,ラララララ ラー ララララー,ララララー ラララー ララ,ラララララ ラー ウウウ フフフ,ンンンンン ンンンン,ンンンン ン,アー アアアア アーアー,アアー アアアア アーアア\\\".split(\\\",\\\").sample\"'
```

実行した後にforce pushすれば全てのコミットメッセージが「北の国から」の歌詞に変わります。
**※大変危険なコマンドなので、ちゃんとしたリポジトリでは絶対にやらないでください**

## git filter-branch

ここで`git sada`で使用している、`git filter-branch`コマンドについてちょっとだけ説明したいと思います。
このコマンドは過去のコミットに対してまとめて特定の処理を実行できるとても便利なやつです。

たとえばアップしたくなかったログファイルをいっぺんに削除したり、

```shell
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch debug.log" --prune-empty -- --all
```

特定のメッセージを置き換えたりすることができます。

```shell
git filter-branch -f --msg-filter 'sed "s/release\sv1.1.0/develop/g"' --tag-name-filter cat -- --all
```

filterは他にも種類があるようなので、いろんなシチュエーションで使えそうですね。

今回は`--msg-filter`を利用して、コミットメッセージを「北の国から」の歌詞にランダムで書き換えました。
もともとこの歌詞は即興で考えたものなので、ランダムでも本来の歌詞っぽい感じに仕上がります。

> さだは、北海道の広大な台地をイメージしたメロディーラインを「♪ああーあああああーあ（語尾下げて）」と発したところ、倉本が「それいいね。で、その続きは？」と言い、「♪ああーあああああー（語尾上げて）」と発した。さらに倉本の「続けて」に対して、さだは「♪んんーんんんんんーん、んんん、んんんんんー」と呼応。これを聞いた倉本が「いいね。これでいこう」とそのまま決定。メロディーラインを即興で考え発しただけのつもりが、イントロのギターからAメロ・Bメロと、その時の即興メロディー案がそのまま採用され、わずか10分ほどで基本が出来上がったという。
>
> 「北の国から〜遥かなる大地より〜」『フリー百科事典　ウィキペディア日本語版』より

## おわりに
構文解析とかまったく関係ない内容なので申し訳ない気持ちでいっぱいですが、`git filter-branch`を知ってもらう機会を作っていただき、@moaikidsさん本当にありがとうございました。

まだまだ枠は空いているみたいなので、みなさんも是非このAdvent Calendarに参加してみてはいかがでしょうか。
毎日お茶会をする開発環境 〜休憩による開発効率の改善〜

TL;DR: 休憩をとるついでに情報交換しよう

---

皆さん、人間との会話してますか？

プログラマって黙々とパソコンに向かってますよね。

もしくはツイッターとかしてますよね。

そのため人間との会話は少なくなりがちです。

色々悩んでたけど、人に相談したら一瞬で解決した経験って無いですか？

- 5時間悩んでたけど相談したらいい方法を教えてもらえた
- むしろ相談した瞬間にアイディア思いついた :bulb:

もしくは、「先に聞いとけばよかった〜」って経験無いですか？

- 頑張って実装したけど、実はライブラリ使うと簡単にできるやつだったことをコードレビューの段階で知った
- コードレビューでめっちゃ良い書き方を知った
- 自分は重要だと考えた機能だったけど、実はそんなに重要じゃないことがプルリク出した時に判明した

それらの気付きってもっと早い段階で得られなかったですか？

「こういう事したいんだけどいい方法しらない？」とか「この機能どう思う？」とか普段から相談しておけばそういう風にならないですよね。

また、それらに早い段階で気がつくことで手戻りを減らすことができ開発効率を上げることができます。

そんな気づきを早期に得るために弊社が行っていることを紹介したいと思います。

### お茶会 :tea:

弊社では毎日 16:30 からお茶会という名の休憩タイムを設けています。

時間になると slack の bot がその時間であることをお知らせしてくれます。

このようにしないと我々は定時まで黙って集中して作業を続けてしまうので、強制的に休憩タイムを作りました。

そしてこの時に何か困っていることを共有します。

何にも困っていることが無くても今やっていることなどについて適当に最低15分ぐらいはダラダラと話します。

### お茶会の良さ

このような効果が出ます。

- 休憩できる
- わりと問題が解決する
- だべるだけでも気づきが得られる

休憩をとるだけでこんないいことが起こるのって凄くないですか？

休憩大事です。

みんなもっと休憩しよう。
何を武器にする？

フリーランスになった時、前職がすごい職歴の人なら困りませんが、
特に平凡なエンジニアだった場合、何を武器にして良いか困ります。

まあ、なんとなく、フリーランスで仕事がありそうな案件を並べてみました。

# 普通のWebアプリケーションの開発

　意外と多そうで、多くないのがWebアプリケーションの開発案件。
　Webアプリケーション程度だと、自社のエンジニアで開発できてしまうからね。
　外注に出そうとする会社は、自社にエンジニアがいないか、自社のエンジニアが逃げ出したか、
　のどちらかがほとんど。自社にエンジニアがいて外注に出すケースは希。
　地雷も埋まっているので、結構リスクが高かったりします。

# ネイティブアプリの開発

　一番ニーズが未だ衰えないのが、ネイティブアプリの開発案件。
　Unityやcocos-2dなんか出て来たし、SwiftやAndroid Studioなんかあるので、一昔前の
　フルスクラッチでコードを書く必要が無いから楽と言えば楽。
　でも、Webアプリだと簡単だけど、ネイティブアプリだと難し事や、A社様の審査を通らないと
　いけないiOSのリリース修羅場があったりして、これも地雷が埋まっている率は結構高いです。
　しかし、得意な言語やこの言語を使わないと死んでしまう、特定の言語絶対主義者でなければ、
　ネイティブアプリの開発をこれから覚えても、十分戦える。
　ただし、iOSとandroidの２種類が開発出来ないと、市場のニーズも少ないので、
　２倍の頑張りが必要。

# ソーシャルゲームの開発

　ちょっと前までは、バブル状態だったこのジャンル。今はレッドオーシャンの葬式状態
　なので、この分野で一山当てようとか、この分野の仕事で１０年食っていこうなんて考えは
　やめた方が良い。これから参加しようとする人はね。
　
　このジャンルも意外に裏側は泥臭いことになっていて、フレームワーク無しのPHPが動いていたり、
　自社開発の独自フレームワークで動くPHPだったりして、結構修羅場は修羅場。
　PHPだけでなく、Ruby on Railsもバージョンが古かったり、独自のライブラリ使っていて
　結構カオス。
　昔のバージョンが大好きな人は、止めないから頑張って！

# Wordpressのカスタマイズ開発

　正直、フルスクラッチでCMSを作るくらいのヘビーなカスタマイズ案件が待ち受けるかも。
　確かに、決まったパターンのCMSならWordpressを使うのは正解なんだけど、Wordpressの
　全機能は使わないし、カスタマイズで機能を潰すなら、フルスクラッチでCMSを作った方が
　早いかもしれないという葛藤に見舞われる。
　Wordpressはブログ系のCMSだと思っていたら、結構痛い目を見る。まあ、一つのフレーム
　ワーク級に、Wordpressというライブラリを軸に何でもカスタマイズ出来てしまう。
　案件の内容をきちんと把握しないと、フルスクラッチで開発するより大変かもｗ

# ECサイトの開発

　ECサイトと言っても様々なタイプがあり、商品が並んでいるフロントサイドの開発から、
　CMS部分のバックエンド部分、決済管理をするタイプ、外部のクレジット決済サービスとの連携、
　配送管理もするタイプ、在庫管理もするタイプとバックエンド側は底なし沼並みに深い。
　あと、お金をシステムで扱うので、結構クリティカルなバグが出ると、リアルに損害賠償を
　くらったり、個人情報がダダ漏れでＴ丸先生に怒られたり、教材に晒されたりするので要注意！
　気軽に引き受けると地獄を見る。

# インフラ構築

　24時間365日、電話やメールが来ることを気にしなければ、意外と楽な案件。
　サービスイン直後やアクセス増加中、マスメディアへの露出時は一番大変だが、
　安定期に入ると一番楽かもｗ
　インフラ構築は、運用保守とセット販売なので、運用保守が付いてこない案件は、
　後々面倒なことになるから、最初から受注しない方が良い。
　しかし、１回構築と運用保守で受注が取れると、長期間の案件が多いので、不労所得感覚で
　非常に楽。
　運用保守は掛け捨ての保険のようなものなので、何も起きなかった月は「良かったですね」と
　思って下さいｗ

# ユーザ（フロント）インターフェイスの開発

　システム開発ではなく、ユーザ（フロント）インターフェイスの開発は、Webデザイナーでは
　なく、HTMLコーダーやエレクターなんか呼ばれる職種。
　JavaScriptがメインの言語になるので、コードの書き方とか考え方が特殊な傾向も。
　結局、デザインもやらなくちゃいけなくなることもあるので、Webデザイナー兼任の方が多い。
　JavaScript地獄やCSS地獄、いろんな地獄があるけれど、最近はライブラリやフレームワークが
　増えているので、昔みたいに数千行クラスのフルスクラッチでコードを書く必要がないので、
　幸せかもね。
　ただ、技術のトレンドの流れが速いので、キャッチアップだけでも一苦労だと思う。

# 自社サービス（コンテンツ）の開発
　
　やはり、一番やるべき。
　自社サービスは今はダメでも、最後は１つ以上は作ったモン勝ち。
　自社サービスは小さいものでも、作りましょう。
　営業の武器にもなるし、自分のウリにもなるし、Githubで注目されれば自分の武器にもなる。


自分にあった武器を見つけて、仕事の受注に結びつけるしかないんですけどね。フリーランスは。
お互いがんばろう！
脱！ゆるふわMySQL


[dots girls Advent Calendar 2015](http://qiita.com/advent-calendar/2015/dots_girls)の出だしからしゃしゃってる吉澤です！

何も考えないで現時点で最新のMySQL5.7.9を開発環境にインストールしたところ、今までみたことの無いエラーが出てしまいました。

```bash:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ’*.*' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```

なんだこれは！と思いググったら、5.7以降でsql_modeの初期設定が変わったとのことでした。

```sql:
select @@SQL_MODE;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```

以前書いていたソースは、`ONLY_FULL_GROUP_BY`で引っかかってしまっていました。

# ONLY_FULL_GROUP_BYを設定していると

`GROUP BY`を使っていると、非集約カラムを`SELECT`で参照できなくなります。
つまり`GROUP BY`使っている場合は`SELECT`するものを全部`GROUP BY`に書け、とのことです。

本来であれば難しい対応はありませんが、エラーは一つだけではありませんでした。
全部直すのはちょっと面倒臭いです。

# my.cnfを書き換えて強制突破

アンインストールして入れ直すのでもいいと思いましたが、sql_modeの設定を上書きする方法が一番楽かと思います。
my.cnfの位置はhelpで見ると出てきます。

```bash:
mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
```

デフォルトのmy.cnfはこんなかんじです。

```bash:my.cnf
[mysqld]
user = mysql
port = 3306
datadir = /var/lib/mysql
socket  = /var/lib/mysql/mysql.sock
symbolic-links = 0
character-set-server = utf8
skip-character-set-client-handshake
sql_mode = ""

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```

空っぽにするのはやはりよくないので、`sql_mode = ""`のブランクは本番環境のsql_modeなどに合わせて下さい。
MySQLを再起動するとエラーが起こらなくなると思います。
そもそも本番と開発のバージョンが違うことが良くないので時間がある時にVagrantなどに移して環境を整えましょう。

# ゆるふわMySQLとは

いろいろ調べている途中に、こんな記事を見つけました。

[ルーク！MySQLではkamipo TRADITIONALを使え！](http://www.songmu.jp/riji/entry/2015-07-08-kamipo-traditional.html)

なるほど、いままではMySQLがゆるふわだったからなんとかなってたんですね。
たしかに、予期せぬ動きしてたこともあったような気がします。
ブログの引用の[kamipo](http://qiita.com/kamipo)さんの提示している`TRADITIONAL`、`NO_AUTO_VALUE_ON_ZERO`、`ONLY_FULL_GROUP_BY`を全部理解したほうがいいと思ったので調べてみました。

# TRADITIONALを設定していると

int型の数値オーバーの丸めや、適当なdatetime型が今まで自動で更新されていたところがエラーになるようです。
各フレームワークが便利すぎてなんでもやってくれるこの時代、適当なクエリのバグは選出が大変そうなので、これは設定した方がいいです。

# NO_AUTO_VALUE_ON_ZEROを設定していると

値が0でも`AUTO_INCREMENT`にデータが入る挙動を阻止するそうです。
idに0が入るってことですよね？
これは今までの開発時に見たことがないような気がしますがこういう挙動もあるんですね。

# ONLY_FULL_GROUP_BYを設定していると

5.7と互換性が無くなり今回みたいなエラーが出てしまうのを防ぐことができます。

5.7以下でもmy.cnfにsql_modeを設定して、脱ゆるふわクエリを目指しましょう＼(^o^)／

dots.女子部では見た目がゆるふわでも、コードはゆるふわしてないそんな向上心の高い部活を目指しています！
一緒にスキルアップしたい女子は下記をチェックしてみて下さい！
[Twitter](https://twitter.com/dotsgirls)
[Facebook](https://www.facebook.com/dots%E5%A5%B3%E5%AD%90%E9%83%A8-457992851057604/)

明日は[kyrieleison](http://qiita.com/kyrieleison)さんよろしくお願いいたします！
変換キーをBSキーに

Dvorak Advent Calendar 3日目．

## 変換キーをBSキーに

前回同様JIS配列キーボードのスペースバーの左側にある変換キー，
このキーを使っていないのであればBackSpaceキーに割り当てると
文字削除時に右手小指を目一杯伸ばしてBSキーを押下する必要がなくなりますのでオススメです．
Visual Studio CodeでMarkdownを書くときに覚えておきたい4個のショートカット

　この投稿はVisual Studio / Visual Studio Code Advent Calendar 2015の3日目です。

# はじめに

　2015年も残すところ1ヶ月をきり、アドベントカレンダーのシーズンがはじまりましたね！みなさん進捗どうですか？

　ところでQiitaやはてなブログなど、Markdownで記事を書かれている人が多いのではないでしょうか？みなさんEditor、何を使っていますか？

　自分は以前Markdownで文書を書く際、Kobitoを使っていました。ところが業務・趣味でVisual Studio Codeを使い始めてから、Markdownでの執筆でもVisual Studio Codeを用いるようになりました。Visual Studio Codeは、ショートカットを駆使することで大変効率良く作業を行うことが可能です。Markdownでの記事執筆の際も、キーボードショットカットによる円滑な操作・切り替えなどにより、大変快適に執筆することができました。

　本投稿では、Visual Studio Codeを用いてMarkdownで執筆する際、覚えておきたい4つのショートカットを紹介します。

* 編集画面とプレビュー画面を切り替える
* エディタを分割する
* アクティブなエディタを切り替える
* アクティブなエディタを閉じる

# 編集画面とプレビュー画面を切り替える

　Markdownファイルを編集中、マウスカーソルを動かして`Open Preview`のアイコンをクリックせずとも、キーボードショートカットで即座にプレビュー画面に切り替えることが可能です。

* Mac : `Command + Shift + v`
* Win : `Ctrl + Shift + v`

　以下は編集画面です。

![編集画面のスクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/4125/0f7398af-722f-cd12-2452-c96dcf92e36b.png "プレビュー画面のスクリーンショット")

　以下はプレビュー画面です。

![プレビュー画面のスクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/4125/11bd4580-21c0-0b75-46ec-9329a6acc542.png "プレビュー画面のスクリーンショット")


　また、同じコマンドで編集画面に戻すことが可能です。

# エディタを分割する

 編集画面とプレビュー画面を両方で同時に見たくありませんか？

* Mac : `Command + \`
* Win : `Ctrl + \`

　上記コマンドを入力した回数だけ、エディタが分割されます。

　分割前です。

![編集画面のスクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/4125/0f7398af-722f-cd12-2452-c96dcf92e36b.png "プレビュー画面のスクリーンショット")

　分割後です。

![分割後のスクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/4125/aeb59e86-ef93-a306-fe8d-715c8ffcd63e.png "分割後のスクリーンショット")

　先ほどの「編集画面とプレビュー画面を切り替えるコマンド」を用いて、片方を編集画面に、他方をプレビュー画面にしてみましょう。

![片方編集・片方プレビュー](https://qiita-image-store.s3.amazonaws.com/0/4125/3ab84fb8-3ab6-3b7f-0961-dee5edf0751e.png "片方編集・片方プレビュー")


# アクティブなエディタを切り替える

　エディタを分割しているとアクティブな画面が編集・操作対象になります。キーボードショートカットでアクティブなエディタを切り替えましょう。

* Mac : `Command + 1`, `Command + 2`, ...
* Win : `Ctrl + 1`, `Ctrl + 2`, ...

　画面左から、1番、2番とエディタ番号が振られています。`Command or Ctrl + 「エディタ番号」`のキーボードショートカットでアクティブなエディタを切り替えることができます。

# アクティブなエディタを閉じる

　わざわざカーソルを動かして閉じるアイコンをクリックせずとも、エディタを閉じることができます。

* Mac : Command + w
* Win : Ctrl + w

　複数のエディタを開いている場合は、アクティブなエディタが閉じる対象になります。先ほどの「アクティブなエディタを切り替える」キーボードショットカットで、閉じたいエディタをアクティブにしてください。

# 練習してみましょう！！！

1. Markdownファイルを、Visual Studio Codeで開いてみましょう
2. プレビュー画面を表示してみましょう
3. 編集画面に戻しましょう
4. エディタを分割してみましょう
5. 片方をプレビュー画面にしてみましょう
6. 編集画面の方をアクティブにしてみましょう
7. アクティブな画面を閉じてみましょう

# さいごに

　業務・趣味でViaul Studio Codeを利用している方、よかったらMarkdownによる記事執筆にもVisual Studio Codeを活用してはどうでしょう？
git rebase --onto を使って、まずは自分だけ幸せになる

## git rebase --onto とは?
+ 指定したコミットに、あるブランチの指定した範囲をつなげるコマンド

```
                    G - H - I(target-branch)
                   /
          D - E - F
         /
A - B - C (このコミットの後ろに GHI を繋げたい！)
```
のような形になっている時に、
`git rebase --onto C F target-branch` と実行すると、

```
          D - E - F
         /
A - B - C - G' - H' - I'(target-branch)
```
のような形になるようにブランチを操作してくれるコマンド


## どんな場面で使えるの？(個人的な感想です)
1. テストの経験が浅いが、単体テストを導入したい
2. 自分の開発用ブランチに続けてテスト用のブランチを作成し、まずは自分の環境でだけテストできるようにした
3. (自分でも手探りなところがあるため)共有されているリポジトリにはテスト用のコミットはpushできない
4. 諸事情で`develop`ブランチが`master`にmergeできなくなったときや、`develop`ブランチでの検証が終わったので、`unit-test`ブランチを`master`ブランチの後ろに持って行きたい

というようなケースで便利に使えます。具体的すぎる気もしますが、似たようなケースはたくさんあるのではないかと思います。

```
2が完了した状態
                    G - H - I(unit-test)
                   /
          D - E - F (develop)
         /
A - B - C (master)
```

このような形で、なんとなく`unit-test`ブランチでのテストはうまく行ったけど、まだmasterにpushできるほどではない、という時に、「せっかく作った`unit-test`ブランチを、再利用可能な形で残しておきたい！」と大半の人が思うことかと思います。
そのようなときこそ、`git rebase --onto` の出番です！
`unit-test`ブランチを`master`ブランチの後ろにもっていきましょう。

```
# unit-test ブランチで、
git rebase --onto master develop unit-test
のコマンドを実行した状態

          D - E - F (develop)
         /         
A - B - C - (master) - G' - H' - I'(unit-test)
```

`unit-test`ブランチが、`master`ブランチの後ろにくっつきました。やったー！
最初の例と同じ形になりました！

(もし、引き続き`develop2`の開発が始まりまって、そこでも`unit-test`ブランチの検証がしたいと思った時には、`unit-test`ブランチ上で普通に、`git rebase develop2` を実行すればOKです！
なれてきたら、最初の
`git rebase --onto master develop unit-test`実行時に、
`git rebase --onto develop2 develop unit-test` と実行しても大丈夫です！)

## まとめ
+ `git rebase --onto` を使うとブランチを自由に移動させられる
+ 新しい技術や手法の検証のために、`git rebase --onto`を使うことができる
+ ローカル環境で色々試しやすくなって幸せになれる
+ ある程度検証が終わったら、`master`にマージしてチーム全体が幸せになれる

## 注意点
上記のような使い方で、`git rebase --onto` が必要なブランチを大量に作っていると、大量にコンフリクトが発生してrebase作業だけで半日たっていた！等、本末転倒なことが起こる可能性がありますのでご注意ください！