OmniAICreator/Qiita-1.07M huggingface dataset:
Angular アプリをクラススタイルで書いていて DI される引数が多い場合


そもそも一つのコンポーネントでいろいろやりすぎるのが良くないというのはわかりますが・・・、それでもついつい多くなってしまうもの。

`class` が書ける言語だとついつい `class` を使いたくなりますが、DI されてきた引数を各メソッドで使いたい場合 `this` のプロパティとして保持しておく必要があり面倒です（`controllerAs` を使っているとします）。

例は ES6。これはつらい。使ってないのでよく知りませんが TypeScript や CoffeeScript でもこうなるのかな？

```js
class AwesomeController {
  constructor(a, b, c, d, e, f, g, h) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    this.e = e;
    this.f = f;
    this.g = g;
    this.h = h;
  }

  foo() {
    this.a.doSomething();
    this.b.doAnotherThing();
    // ...
  }
}
```

Angular アプリでよく使われるコストラクタ内でメソッドを定義するスタイルだと、こういう問題はありませんね。

```js
function AwesomeController(a, b, c, d, e, f, g, h) {
  this.foo = function() {
    this.a.doSomething();
    this.b.doAnotherThing();
    // ...
  };
}
```

しかし、一度手に入れた文法を手放したくないのが人情というもの。

Object リテラルでもメソッド風にかけるのでそんなに悪くはない気はするけど、少し悲しい。

```js
function AwesomeController(a, b, c, d, e, f, g, h) {
  angular.extend(this, {
    foo() {
      this.a.doSomething();
      this.b.doAnotherThing();
      // ...
    }
  });
}
```

そこで `$inject` アノテーションを利用して・・・。（手書きか ng-annotate などによって設定されているものとします。）

```js
function bindArguments(instance, arguments) {
  var ctor = instance.constructor;
  if (!angular.isArray(ctor.$inject)) {
    return;
  }
  ctor.$inject.forEach((argName, i) => {
    instance[argName] = arguments[i];
  });
}

class AwesomeController {
  constructor(a, b, c, d, e, f, g, h) {
    bindArguments(this, arguments);
  }
  
  foo() {
    this.a.doSomething();
    this.b.doAnotherThing();
    // ...
  }
}
AwesomeController.$inject = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
```

これなら DI し放題？
Macで　GLUT + OpenGL のんびりいこう#3 Draw Line2D


#前提
Mac OSX 10.7.5
Developer Tool

#目標
直線描画

#line.cpp
```cpp:line.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

void Line2D(int x1,int y1,int x2, int y2,float size){
	glLineWidth(size);
	glBegin(GL_LINES);
	glVertex2i(x1,y1);
	glVertex2i(x2,y2);
	glEnd();
}
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//glColor4f(0.0f,0.0f,0.0f,1.0f);
	glColor4f(1.0f,1.0f,1.0f,1.0f);
	Line2D(20,40,400,180,1.0);
	glColor4f(0.0f,1.0f,0.0f,1.0f);
	Line2D(20,80,400,80,3.0);
	glColor4f(0.0f,0.0f,1.0f,1.0f);
	Line2D(20,120,400,120,5.0);
	glFlush();
}
void Init(){
	//glClearColor(1.0, 1.0, 1.0, 1.0);
	glClearColor(0.0, 0.0, 0.0, 1.0);
	glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
}
int main(int argc, char *argv[])
{
glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow("線を描画");
	glutDisplayFunc(display);
	Init();
	glutMainLoop();
	return 0;
}
```

#コンパイル
framework指定が要点です。
g++ -o line line.cpp -framework GLUT -framework OpenGL

#Result
![スクリーンショット 2015-01-11 14.25.19.png](https://qiita-image-store.s3.amazonaws.com/0/33317/ef7ae353-4a7b-bca5-9ba4-026ce94aafda.png "スクリーンショット 2015-01-11 14.25.19.png")
L2のループ問題について知った

## 参考

[L2ループ対策 - ネットワークエンジニアを目指して](http://www.itbook.info/network/loop1.html)

## ループが発生する原因

* HUBが原因となる。STPを使えないので、HUB同士を接続してはいけない。
* L2SW同士を互いにつないでもSTPが有効なポートであれば問題なし。

## 対策

* 接続先がSTPを話せそうな場合、STPを有効にする。

## L2SW側のループ検知方法

* BPDU を受信するとループを検知し Blocking に遷移するためループにならない。
* keepaliveを有効にすることにより、L2SWとHUB間にLANケーブルが2本ささっていることによるループ発生を食い止められる。
Excel 2013でMS Queryを使ってOracle11gに接続する

ブログに書いたよ。
<a href="http://replication.hatenablog.com/entry/2014/09/16/100000">Excel 2013でMS Queryを使ってOracle11gに接続する - 小さい頃はエラ呼吸</a> <a href="http://b.hatena.ne.jp/entry/replication.hatenablog.com/entry/2014/09/16/100000"><img src="http://b.hatena.ne.jp/entry/image/http://replication.hatenablog.com/entry/2014/09/16/100000" alt="はてなブックマーク - Excel 2013でMS Queryを使ってOracle11gに接続する - 小さい頃はエラ呼吸" border="0" /></a>
Moment.jsを使う


去年にこれ（[日付フォーマットなど 日付系処理](http://qiita.com/osakanafish/items/c64fe8a34e7221e811d0)）
書いたんだけど（思いの外ストックされた）、
これはライブラリ使用承認プロセスがとても難儀な環境の時書いたもので、
もしそんな悲しい環境でないなら先人たちの素晴らしいライブラリを使ったほうがいい。
ライブラリを使ういいところは、コーダの独自実装になりにくいし、他のプロジェクトでも知見が使い回しできるところだと思う。

ということでMoment.jsの使い方について書いておく。

## [Moment.js](http://momentjs.com/)

[GitHubにおいて、現在(2015/1)日付を処理するライブラリの中で多分一番Starがついてる](https://github.com/moment/moment)日付系のライブラリ。人気が有るということは正義っぽい。
[Qiitaにもたくさん記事ある](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=tag%3Ajavascript+moment&sort=rel)。

公式ドキュメントはこちら。
http://momentjs.com/docs/

Moment.jsは`JavaScript`の`Date`オブジェクトをラップするオブジェクトを生成して、そのオブジェクトに日付処理を任せることが出来る。使い方は`Date`オブジェクトの代わりに`moment()`を呼び出して`Moment`オブジェクトを生成するだけ。

```js:Momentオブジェクト
var now = moment();
console.log(now.toDate()); // Dateオブジェクトが返される

// 文字列からも生成できるし
var shougatsu = moment('2015-01-01');
console.log(shougatsu.toString()); // "Thu Jan 01 2015 00:00:00 GMT+0900"

// もちろんDateオブジェクトからも生成できる
var kodomonohi = moment(new Date('2015-05-05'));
console.log(kodomonohi.toString()); // "Tue May 05 2015 09:00:00 GMT+0900"
```

### 日付をフォーマットする

```js:moment.format
var date = moment('2015-01-23');
date.format("MM月DD日"); // "01月23日"
```

フォーマットの書式は以下。
http://momentjs.com/docs/#/parsing/string-format/

### 日付を加算する

```js:moment.add
var date = moment('2015-01-23');
date.add(1, "months").format("YYYY-MM-DD"); // 2015-02-23
```

第二引数に指定するキー（'months'とか'days'）とかは以下。ショートハンドもある。
http://momentjs.com/docs/#/manipulating/add/

### ２つの日付の差を計算する

```js:moment.diff
var fromDate = moment('2014-01-01 0:00');
var toDate   = moment('2015-01-01 12:00');
toDate.diff(fromDate, 'days'); // 365

// 第三引数にtrueを渡すと少数まで計算してくれる
toDate.diff(fromDate, 'days', true); // 365.5

// 第二引数を省略するとmsを返す
toDate.diff(fromDate); // 31579200000
```
コンピュータサイエンスを学びなおす

# はじめに

この投稿を読んでくださる方の中には、すでにコンピュータサイエンスについてよく学んでいる方もおられるでしょう。もしくは、これから学ぼうと考えている学生の方、学生の頃は違う分野を学んでいたけれども興味がある方、もしくは仕事など必要に迫られて学ぼうという方もおられるでしょう。私自身はといえば、コンピュータとの付き合いは長く、学校でも情報工学を学んできました。社会人になってからもソフトウェアの設計・開発や携わる日々を過ごしております。

最近、そろそろ息子にコンピュータを教えたいという思いが強くなってきて、それではどうやって教えようかを考えはじめたところです。その中でたどりついた一つの答えは、まずは自分がしっかり学びなおした方がいい、ということでした。学校で学んだのは昔のこと、独学でなんとなく分かった気になっていることも多いし、どのように教えるかという観点でも学べることは多いはず・・・。

今年の目標として、そんな思いを実行に移すべく、自分自身を“プログラミング”しなおすために、[edX](http://www.edx.org/) の登録を行いました。

昨年末にQiitaで『[量子コンピュータが超高速である原理と量子論とそれに至るまでの科学哲学史をゼロからわかりやすく解説](http://qiita.com/kenokabe/items/92189d658011da808442)』という記事に出会い、西洋の科学・哲学の歴史を学びなおしたいという気持ちが生まれたように、この投稿が誰かの何かをはじめる一つのきっかけになれば、と思い投稿することにしました。

#edX

近年、MOOCs(Massive Open Online Courses)と呼ばれるオンライン学習環境が充実してきました。edXもそのうちの一つです。今まで大学に入学して出席しないと聴講できなかった授業もオープン化が進み、誰もがオンラインで授業を受けられる時代になりました。

自分が学生だった頃には考えられないことでした。学ぶ意欲さえあれば誰でも、年齢や住んでいる地域に関係なく、地球上のどこからでも、世界最高水準の講義を自宅で聴講でき、学ぶことができるのです。これはまさに教育革命ともいうべきことです。

そして、学ぶことができるのは学生だけではないということです。
社会人になって仕事を続けながらでも、空いた時間を利用して学ぶことができます。お金をかけずに無償で講義を受講することもできますし、有償でVerified Certificateを取得して転職などキャリアアップに役立てることも、もしかしたらできるかもしれません。

## 入学手続き

あれこれ悩んでいていても、何もはじまりません。
以下のサイトにアクセスしてまずはユーザ登録して、興味のある講義を見つけましょう。

https://www.edx.org/

![register.png](https://qiita-image-store.s3.amazonaws.com/0/58827/9263da5d-4e51-446d-1f45-03576f09f591.png)


英語があまり得意でない？　習うより慣れろ式で何とかなるでしょう、きっと。

人間誰もが生まれながら持っている『脳』というコンピュータは、“プログラミング”次第で驚くべき能力を発揮していくものです。はじめは分からなくても大丈夫、適度に負荷をかけつつ、“楽しい！”と感じるあの瞬間が訪れるまで、とにかく継続的にやってみてください。

## オリエンテーション

30分ほどでedXの使い方を学ぶことができます。はじめは分からなくても、使っていくうちにきっと慣れるでしょう。

![demo.png](https://qiita-image-store.s3.amazonaws.com/0/58827/c4620ded-7cd3-bc48-44e0-6560fa5b015a.png)

## CS50 (Introduction of Computer Science, HarvardX)

そして、私が最初に受講を決めた講義です。（まだはじめたばかりですが・・・）

これからもう一度勉強をはじめる出発点として、コンピュータサイエンスを学びなおすことにしました。自分の専門であれば得意でない英語でも何とかなるだろうという思いと、息子にコンピュータを教えるために、どうやって教えるかを学びたいという目的があったからです。

https://courses.edx.org/courses/HarvardX/CS50x3/2015/info

![CS50x3.png](https://qiita-image-store.s3.amazonaws.com/0/58827/d1e86213-b271-12e7-141b-6810acd430f5.png)


講義の内容は YouTubeでも公開されていますので、Week 0 の 様子を貼っておきます。
https://www.youtube.com/watch?v=lhlBWlhS7Vg

Harvard Universityの講義を自宅に居ながら受講できる。実際に講義を聴いてみて、これまで話として聞いていただけでは伝わらなかったほど、とても大きな衝撃を受けました。

最初のオープニングから鳥肌が立ちました。
そして、Harvard Universityという世界最高水準の大学で、実際に授業に参加している学生がうらやましいと思いました。もう戻ってこない学生時代へのノスタルジーもあるかもしれませんし、学生の頃にもっと頑張って勉強すればよかったという後悔もあるのかもしれません。

しかし何より、今こうして自宅に居ながらにして講義を受講できること、それだけでもとてもありがたいことです。学びたい気持ちさえあれば、いつでもどこでも何度でも、世界最高水準の講義で学ぶことができるのです。

# おわりに

自分の息子、そしてこれからの日本を担っていくすべての子供達に、もっともっと勉強に励んでほしいと思います。そして、日本の中だけではなく世界でも活躍していけるよう、日本語で学んでいくことはもちろんのこと、グローバルスタンダードである英語でもしっかり学んでいってほしいと考えています。

また、10年後、20年後の日本が今と同じように豊かな先進国としてあり続けるために、子供達の成長をただ見守るだけではなく、私達一人ひとりも同じように学び、成長していくことも大切だと考えております。
Mac YosemiteにGoのインストールからghq+pecoを使うまで


流行に乗り遅れた感があるけど、今更ながらghq+pecoを使った環境を整えてみたいと思います。

Mac yosemiteでやってみました。

## Goのインストール

まずはgoをインストールしましょう、

```
$ brew install go
```

簡単です。

## ghqのインストール

```
$ go get github.com/motemen/ghq
```

### ghqのパスを通す

`.zshrc`や`.bash_profile`などに以下を記述しましょう。

私はzshだったので.zshrcです。

```.zshrc
 ### GO PATH
 export GOPATH=$HOME/.go
 export PATH=$HOME/.go/bin:$PATH
```

sourceコマンドで適用します。

```
$ source ~/.zshrc
```

ghqコマンドが使えるようになります。

```
$ ghq
NAME:
   ghq - Manage GitHub repository clones

USAGE:
   ghq [global options] command [command options] [arguments...]

VERSION:
   HEAD

AUTHOR:
  motemen - <motemen@gmail.com>

COMMANDS:
   get		Clone/sync with a remote repository
   list		List local repositories
   look		Look into a local repository
   import	Bulk get repositories from stdin
   root		Show repositories' root
   help, h	Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h		show help
   --version, -v	print the version
```

場所はここです。

```
$ which ghq
/Users/ユーザー名/.go/bin/ghq
```

### ghqを使う

.gitconfigに追記します。

```.gitconfig
[ghq]
    root = ~/.ghq
    root = ~/.go/src
```

私の場合、~/n0bisukeに設置したかったので

```.gitconfig
[ghq]
    root = ~/n0bisuke
    root = ~/.go/src
```

としています。
ここに置いておけばFinderからも確認できるので便利かと思います。

![](http://i.gyazo.com/90576bcfdee283f6e839e8acad70af89.png)

`ghq get`でgit cloneできます。 ghq経由でcloneすることで、↑みたいにホスティング先やアカウントごとでリポジトリをいい感じ分類してくれます。

```
$ ghq get git@github.com:tolabl/HP.git

     clone ssh://git@github.com/tolabl/HP.git -> /Users/sugawara_nobisuke/.ghq/github.com/tolabl/HP
       git clone ssh://git@github.com/tolabl/HP.git /Users/sugawara_nobisuke/.ghq/github.com/tolabl/HP
Cloning into '/Users/sugawara_nobisuke/.ghq/github.com/tolabl/HP'...
remote: Counting objects: 280, done.
remote: Total 280 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (280/280), 4.70 MiB | 927.00 KiB/s, done.
Resolving deltas: 100% (68/68), done.
Checking connectivity... done.

```

#### 一覧を見る

```
$ ghq list

github.com/tolabl/HP
github.com/codegangsta/cli
github.com/daviddengcn/go-colortext
github.com/mitchellh/go-homedir
github.com/motemen/ghq
github.com/motemen/go-colorine
```

## peco

コマンドのログなどをインクリメントサーチしてくれるツール

###インストール

```
$ go get github.com/peco/peco/cmd/peco
```

簡単ですね。

## ghqと組み合わせるとリポジトリ移動がめちゃ便利

```
$ cd $(ghq list -p | peco)
```

![](http://i.gyazo.com/8a51b9b01a8b269a7d9a2cd1d33846d4.gif)

参考 : http://masteries.papix.net/entry/2014-06-30-ghq.html


##まとめ

流行に乗り遅れた感があるけどめちゃ便利ですね

とくにpecoはコマンドのhistoryとかと組み合わせるとかなり便利そうです。
プロジェクトに新たなPrefabを生成するためのEditor拡張コード

この投稿では、プロジェクトに新たなPrefabをEidtor拡張のコードから生成する方法を紹介します。

これはEditorUtilityクラスとPrefabUtilityを使うことで、簡単に実現できます。

# 空のGameObjectのPrefabを生成する

Editorディレクトリを作り、次のような`PrefabCreator.cs`を用意します。

`MenuItem`属性の機能により、メニューから`Assets>Create>New Prefab`を選択することでCreatePrefabメソッドが呼ばれ、空のGameObjectのPrefabが生成されます。

```csharp:空のGameObjectのプレファブを生成
using UnityEngine;
using UnityEditor;

public static class PrefabCreator
{
	[MenuItem("Assets/Create/New Prefab")]
	public static void CreatePrefab ()
	{
		string name = "target";
		string outputPath = "Assets/Prefab.prefab";
		
		GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags (name, HideFlags.HideInHierarchy);
		
		PrefabUtility.CreatePrefab (outputPath, gameObject);
		
		Editor.DestroyImmediate (gameObject);
	}
}
```


　コード中の[PrefabUtility.CreatePrefab](http://docs.unity3d.com/ScriptReference/PrefabUtility.CreatePrefab.html)は、出力するパスとPrafabにしたいGameObjectを引数に取って、Prefabをプロジェクト中に生成するメソッドです。(実際には第3引数を持ちます。後述)パスは、`Assets/`から始まって、拡張子は`.prefab`である必要があります。


```csharp:
GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags (name, HideFlags.HideInHierarchy);
```

# ちょっと補足

　少しだけ補足します。

　下記のコードは、RigidbodyコンポーネントとBoxColliderコンポーネントが付与されたPrefabをプロジェクト中に生成するコードです。

```csharp:空のGameObjectのプレファブを生成
[MenuItem("Assets/Create/New Prefab With Components")]
public static void CreatePrefabWithComponents ()
{
	string name = "target";
	string outputPath = "Assets/WithComponents.prefab";

	GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags (
		name,
		HideFlags.HideInHierarchy,
		typeof(Rigidbody), typeof(BoxCollider)
	);

	gameObject.rigidbody.isKinematic = true;
	(gameObject.collider as BoxCollider).size = 5.0F * Vector3.one;

	PrefabUtility.CreatePrefab (outputPath, gameObject, ReplacePrefabOptions.ReplaceNameBased);

	Editor.DestroyImmediate (gameObject);
}
```

　[EditorUtility.CreateGameObjectWithHideFlags](http://docs.unity3d.com/ScriptReference/EditorUtility.CreateGameObjectWithHideFlags.html)は3個の引数を持つメソッドです。第3引数はSystem.Type型を可変長引数としてとります。第3引数に可変長引数として渡したSystem.Type型のコンポーネントが生成されたGameObjectに付与されます。上記のコードだと2個のSytem.Type型を渡しています。そのため、上記のコードではRigidbody型とBoxCollider型が付与されています。


　[PrefabUtility.CreatePrefab](http://docs.unity3d.com/ScriptReference/PrefabUtility.CreatePrefab.html)も3個の引数を持つメソッドです。第3引数としてReplacePrefabOptions型をとり、これはオプショナル引数(他の言語ではデフォルト引数とも)になっています。第3引数により名前が衝突した際の挙動を設定できます。上記のコードでは、名前が衝突した際、上書きするようにしています。


　上記のコードでは、Rigidbodyコンポーネント・BoxColliderコンポーネントという組み込みのコンポーネントを付与したPrefabを生成していますが、もちろん自作のコンポーネントを付与することも可能です。

# 関連リンク

* [PrefabUtility.CreatePrefab](http://docs.unity3d.com/ScriptReference/PrefabUtility.CreatePrefab.html)
* [EditorUtility.CreateGameObjectWithHideFlags](http://docs.unity3d.com/ScriptReference/EditorUtility.CreateGameObjectWithHideFlags.html)

# 関連投稿

* [縦横の分割数を指定し一枚の画像をMultiple Spriteに分割するEditor拡張コード](http://qiita.com/RyotaMurohoshi/items/b01e3cdb91fea96f4574)
* [複数枚のSpriteからAnimationClipを生成するEditor拡張コード](http://qiita.com/RyotaMurohoshi/items/5cb865c23a50055cf92f)
* [非常に単純なAnimatorControllerを生成するEditor拡張コード](http://qiita.com/RyotaMurohoshi/items/c1f29f9afbce910c5438)
EmacsのBookmarkをZshで使用する

#bm-e-z
## 目的

emacsのブックマークも便利、zshでもブックマークも便利。

しかし、どちらも設定するのは面倒なので

プラグインを作成した。

zshのブックマークプラグインとして、

[cd-bookmark](https://github.com/mollifier/cd-bookmark.git)が必要です。


The original script is licensed under the [MIT License](http://mokemokechicken.mit-license.org/).

## CAUTION

*cd-bookmarkの保存ファイルはbm-e-zによって上書きされるので使用できなくなります。*

## How to install
  1. まずは cd-bookmark (see, https://github.com/mollifier/cd-bookmark.git)をインストールします。
  
  2. bm-e-zをパスの通ったところに置きます。
  
  3. もし必要なら_bm-e-zもパスの通ったところに置きます。
 
        $ ls .zsh/functions/
          bm-e-z _bm-e-z cd-bookmark/
 
  4. .zshrcに以下のコードを追加します。

     autoload -Uz bm-e-z
	 
  5. cd-bookmarkとemacsのブックマークファイルを指定します。直接bm-e-zを編集してください。

  6. 必要ならaliasを設定してください。

        $ alias bm='bm-e-z'

***

*default setting*

em='/Applications/Emacs24.app/Contents/MacOS/bin/emacsclient'

your bookmark files select

EMACS_BOOKMARK=~/.emacs.d/bookmarks

EMACS_BOOKMARK=~/.emacs.bmk

CDBOOKMARK=~/.cdbookmark

***

## Usage

+ ### カレントディレクトリをEmacsのブックマークに登録する

        $ bm-e-z -a


+ ### Emacsのブックマークを読み込み

        $ bm-e-z -u

+ ### ディレクトリ移動

        $ bm-e-z [TAB, select directory]

+ ### ブックマークリスト表示（同時にupdateする）

        $ bm-e-z -l

+ ### ヘルプ表示

        $ bm-e-z -h

+ ### もしブックマークファイルを編集したい場合はEmacsのブックマークを編集してください。
Qiita での見出しに対するリンク

見出しに対するリンクはどう書くのかな？　とちょっと調べてみた。
こんな感じでいいみたい。

* `## link`: `[link](#link)`
* `## link fuga`: `[link fuga](#link-fuga)`
* `## リンク`: `[リンク](#リンク)`

[link](#link)
[link fuga](#link-fuga)
[リンク](#リンク)


## link
## link fuga
## リンク
[Materialデザイン] Android5.0未満でRipple effectを実装する


Ripple effectとは、Materialデザインのアニメーションの1つで、波紋が広がるような表現のことです。Googleの公開した[Material Designの動画](https://www.youtube.com/watch?v=Q8TXgCzxEnw)を見ると、タップした時のフィードバックだけでなく、ビューの切り替えや画面遷移などにも幅広く対応できるエフェクトのようです。

そのRippleエフェクトを、Android5.0未満でも動作するように実装してみました。

![ezgif.com-crop (4).gif](https://qiita-image-store.s3.amazonaws.com/0/15267/a564a230-e719-1835-821b-f0a10976c81c.gif "ezgif.com-crop (4).gif")

# ライブラリを使う
[material-ripple](https://github.com/balysv/material-ripple)というライブラリを使いました。
[RippleEffect](https://github.com/traex/RippleEffect)というのもあるんですが、material-rippleの方が使いやすかったです。
特に使いやすかったポイントは以下3点。

* エフェクト完了後に状態をそのままにするか（`app:ripplePersistent`）、タップした時にhoverエフェクトもつけるか（`app:rippleHover`）といったオプションが多い。
* タップ後に画面遷移が入る場合、デフォルトでRippleエフェクトが完了してから遷移してくれる。RippleEffectの方は、エフェクトが始まった瞬間に画面遷移してしまう。
* xmlだけでなく、コードでエフェクトをつけることもできる。
`MaterialRippleLayout.on(view).rippleColor(Color.BLACK).create();`

両方とも、Rippleをつけたい要素をViewで囲って実装する点では同じです。

```
<com.balysv.materialripple.MaterialRippleLayout
    android:id="@+id/ripple"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Button inside a ripple"/>

</com.balysv.materialripple.MaterialRippleLayout>
```

`MaterialRippleLayout`はFrameLayoutの拡張クラスなので、中に入る要素は1つでなければいけません。つまり、必ずネストが1つ増えます。パフォーマンスが気になるかもしれませんが、前に実験した限りそこまで問題なさそうだったので目をつむりました。
[Viewのネストはどのくらい遅いのか ー 12階層のレイアウトを5階層にして検証してみた](http://qiita.com/konifar/items/3c75f1fab0e0a10ebb14)

MaterialRippleLayoutで囲ってやればすぐエフェクトがつくようになるので、あとはReadMeを見ながら色や時間を調整すればOKです。

# そもそも対応すべきなのか？
一応できたんですが、正直Android5.0未満では対応しない方がいいんじゃないかなという意見です。

Google純正のアプリや他の有名なアプリはAndroid5.0以上で対応していて、5.0未満は諦めてます。というより、たぶんあえてやってないのだと思います。

[Materialデザインガイドライン](http://www.google.com/design/spec/material-design/introduction.html)の本質は、画面を似せることではなく、同じ基準で作ることによってユーザーが操作する時に頭を使わないですむようにすることだと思うので、Android5.0未満のRippleエフェクトが標準でない端末の場合はむしろ従来のタップフィードバックの方がいいよねという判断なのではないでしょうか。勘なので、本当はただめんどくさいだけかも。。。

とりあえず対応できることはわかったので、実際に対応するかはユーザーを元に判断しようと思います。
Macで　GLUT + OpenGL のんびりいこう#2 Draw Point

#前提
Mac OSX 10.12.1
Developer Tool

#目標
点の描画

#point.cpp
```cpp:point.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

//点の座標決定関数
void Point(int x,int y,float size){
	glPointSize(size);
	glBegin(GL_POINTS);
	glVertex2i(x , y);
	glEnd();
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor4f(0.0f,0.0f,1.0f,1.0f);
	Point(50,50,10.0);
	glColor4f(1.0f,0.0f,0.0f,1.0f);
	Point(250,150,10.0);
	glColor4f(0.0f,1.0f,0.0f,1.0f);
	Point(300,400,10.0);
	glFlush();
}
void Init(){
	//glClearColor(1.0, 1.0, 1.0, 1.0);
	glClearColor(0, 0, 0, 1.0);
	glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
}
int main(int argc, char *argv[])
{
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow("点を描画");
	glutDisplayFunc(display);
	Init();
	glutMainLoop();
	return 0;
}
```

#コンパイル
framework指定が要点です。
g++ -o point point.cpp -framework GLUT -framework OpenGL
ワーニング抑制
g++ -o point point.cpp -framework GLUT -framework OpenGL　-w

#Result
![スクリーンショット 2015-01-11 11.35.14.png](https://qiita-image-store.s3.amazonaws.com/0/33317/353d575b-824f-2b90-9c7a-7a538a466568.png "スクリーンショット 2015-01-11 11.35.14.png")
iTerm2でsshコマンド時に新しいウィンドウで開く


リモートログインしたターミナルは、ローカル操作との誤操作を防ぐため常に別の新しいウィンドウで開きたい


## 設定方法
1. AppleScriptを使って新しいウィンドウを開くスクリプトを作成

	```applescript:ssh_with_new_window.scpt
    on run argv

        -- use space
        set text item delimiters of AppleScript to space
        set cmd to argv as string

        -- set profile
        set profile to "ssh" as text

        tell application "iTerm"
            activate
            tell (make new terminal)
                launch session profile
                tell the last session
                    write text "/usr/bin/ssh " & cmd
                end tell
            end tell
        end tell
    end run
    ```

2. sshコマンドのエイリアスの設定
alias ssh='osascript ssh_with_new_window.scpt'


## 使用方法
```bash
ssh host_name
```
![iterm.png](https://qiita-image-store.s3.amazonaws.com/0/62029/42349c1a-c22b-c102-b5a9-56200d17869d.png "iterm.png")



## プロファイルを指定する
ホストネームに特定のキーワードが含まれていた場合などに、背景色、文字色を変えて気分を切り替えたい場合にお勧め

```applescript:適当な例
…
        -- set profile
        if cmd contains "production" then
            set profile to "production" as text
        else if cmd contains "pro" then
            set profile to "production" as text
        else
            set profile to "ssh" as text
        end if
…
```
Goでgoproxyを使って簡単なプロキシサーバを作る

##新年初めの投稿
今年はGo言語を勉強すると決めたので、新年最初の投稿はGoに決めていた。
オリジナルのプロキシサーバを作るのに興味があったので[goproxy](https://github.com/elazarl/goproxy)というライブラリを用いてサクッとProxyサーバを作ってみた。

##はじめにやること
何はともあれgoproxyをインストールしなければならない。初め少しここでハマった。
まずは```go get```でパッケージを取得する。

```
go get github.com/elazarl/goproxy
```

これで\$GOPATHが設定されていてフォルダ構成もちゃんとしていれば \$GOPATH/src にgoproxyのパッケージがインストールされる。
その状態でサンプルにもあるような以下のコードで実装する。

```go:proxy.go
package main

import (
	"github.com/elazarl/goproxy"
    "log"
	"net/http"
)

func main() {
	proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true

    log.Fatal(http.ListenAndServe(":8080", proxy))
}
```

これを実行するとポート8080でProxyサーバが動く。適当なブラウザにProxyの設定をし任意のページにアクセスするとログがコンソール上に表示される。

#所感
あまりにも簡単にプロキシサーバが作れるので驚いた。特定のリクエストをキャッチしてフィルタリングするのも簡単そうだ。
とりあえずブラウザ上でプロキシサーバの設定をいじれるようになるまでいろいろやってみようと思う。

#参考URL
プログラマブルなプロキシライブラリ goproxy
http://mattn.kaoriya.net/software/lang/go/20121023213646.htm
Macで　GLUT + OpenGL のんびりいこう#1 Create Window


#前提
Mac OSX 10.7.5
Developer Tool

#目標
サイズ指定のWindow作成まで

#mywin.cpp
```cpp:mywin.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

void display(void)
{
	//背景色黒で設定
	glClearColor(0.0, 0.0, 0.0, 1.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

int main(int argc, char *argv[])
{
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow("サイズ指定");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

```

#コンパイル
framework指定が要点です。
g++ -o mywin mywin.cpp -framework GLUT -framework OpenGL

#Result
![スクリーンショット 2015-01-11 11.14.24.png](https://qiita-image-store.s3.amazonaws.com/0/33317/358c2cb7-dcaf-e860-3789-266f45c82178.png "スクリーンショット 2015-01-11 11.14.24.png")
連続したコマンド投入をサポートするgemを作った。


## どんなの？
gifの紹介画像のっけました。
https://github.com/motsat/command_butler/

定義されたコマンド一覧(yamlファイル)を、インタラクティブに実行していくようなgemです。

```
coommand_butler execute my_commands.yml
```


## なんで作ったか
この辺りをなんとかしたかったのです。

- 決まったコマンドを投入する機会は意外に多いけど、だるい
- インタラクティブに実行したい
- 場合によってはスキップやジャンプ（いくつかコマンドを飛ばす）したい
- rakeのtask化する程でもない(生linuxコマンド叩くだけとか）
- ある標準出力をコピペして、他のコマンドのある場所にあてはめるくらいは自動化したかった（出力を変数に入れるのも良いけど、置き換え後のコマンドを簡単に見たかった）
- あるパラメータの置き換えと別のファイルで定義という事もしたかった（環境毎とか）

## このgemをもっとなんとかしたい所

### 「yaml」フォーマットよりもっと良いものないか
まず、yamlにしたのは
ls
pwd
みたいな元コマンドがあった場合、

    [yml]
      - pwd
      - ls


と、現状既に抱えているコマンド一覧の先頭に「- 」を挿入するだけで簡単にyamlとして配列構造になるのでなりを置き換えるのが楽だった。また、yamlなのでそれぞれにオプションを持たせるの事もできるし。

    [yml]
      - pwd
      -
        chdir: /Users
      - ls

でも、↑の上のオプション(chdir)の時の記述がなんか気持ち悪いし他に良いフォーマット無いかなと思っている（独自フォーマットはあんまり作りたくない）
Ruby: インスタンス変数とクラス変数

# インスタンス変数

インスタンス変数は「`@`」で始まる名前をしています。
インスタンス単位で持つ変数です。

```rb:sample-ivar.rb
class C
  def foo
    @count ||= 0
    @count += 1

    if @count < 3
      puts "foo は呼ばないでください."
    else
      puts "foo は呼ぶなッ！！#{@count} 度目！！"
    end
  end
end
                        
c1 = C.new
c1.foo
c1.foo
c1.foo

puts '-' * 8

c2 = C.new
c2.foo
c2.foo
c2.foo
```

実行結果

```shell-session
$ ruby sample-ivar.rb 
foo は呼ばないでください.
foo は呼ばないでください.
foo は呼ぶなッ！！3 度目！！
--------
foo は呼ばないでください.
foo は呼ばないでください.
foo は呼ぶなッ！！3 度目！！
```

c1 も c2 もそれぞれ 3度目でキレます。


# クラス変数

クラス変数は「`@@`」で始まる名前をしてます。
クラス単位で持つ変数です。

```rb:sample-cvar.rb
class C
  def foo
    @@count ||= 0
    @@count += 1

    if @@count < 3
      puts "foo は呼ばないでください."
    else
      puts "foo は呼ぶなッ！！#{@@count} 度目！！"
    end
  end
end

c1 = C.new
c1.foo
c1.foo
c1.foo

puts '-' * 8

c2 = C.new
c2.foo
c2.foo
c2.foo
```

実行結果

```shell-session
$ ruby sample-cvar.rb 
foo は呼ばないでください.
foo は呼ばないでください.
foo は呼ぶなッ！！3 度目！！
--------
foo は呼ぶなッ！！4 度目だ！！
foo は呼ぶなッ！！5 度目だ！！
foo は呼ぶなッ！！6 度目だ！！
```

c2 は最初からキレまくりです。(クラス通算3度目以降はキレます)

# 継承に関わるアレコレ

```rb:sample.rb
module M0
  @@v = :M0
  def foo ; "I am 'M0'" ; end
end

module MM
  @@v = :MM
  def foo ; "I am 'MM'" ; end
end

module M
  include MM
  @@v = :M
  def foo ; "I am 'M'" ; end
end

module PM
  @@v = :PM
  def foo ; "I am 'PM'" ; end
end

class A
  include M0
  @@v = :A
  def foo ; "I am 'A'" ; end
end

class B < A
  @@v = :B
  def foo ; "I am 'B'" ; end
end

class C < B
  @@v = :C
  def foo ; "I am 'C'" ; end
end

class D < C
  include M
  prepend PM
  @@v = :D

  def foo ; "I am 'D'" ; end

  def getv
    @@v
  end
end

d = D.new
p d.class.ancestors #=> [PM, D, M, MM, C, B, A, M0, Object, Kernel, BasicObject]
p d.getv
p d.foo
```

上のスクリプトを実行すると以下のようになります。

```shell-session
$ ruby sample.rb 
[PM, D, M, MM, C, B, A, M0, Object, Kernel, BasicObject]
:D                # メソッド getv の出力
"I am 'PM'"       # メソッド foo の出力
```

(もっともな話ですが) foo の出力は予想通りでした。
現在は PM の foo が呼ばれていますが、それをコメントアウトすると次は D の foo が呼ばれます。
それをコメントアウトすると次は M の.....としていくと継承順(下図の緑線)をたどって最後は M0 の foo が呼ばれます。
継承関係図を以下に示します。(青箱:クラス、橙二重線箱:モジュール、緑線:ancestors、青線:superclass)

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/60624/a6804b07-6165-8f7b-76d4-d4935fa2ff6a.png)

対して、「`@@v`」の値を出力する getv ですが、現在は D の`@@v`を参照しています。
これをコメントアウトすると......とやってみると以下の順番になります。

```shell-session
   D -> C -> B -> A -> M0 -> M -> MM -> PM   # クラス変数参照の順番
```

(これは図示しません。図を作ると美しくない図になります)

なんとなく、superclass をたどって折り返して来てインクルードされているモジュールを探索...、というようになっているようで、Ruby の仕様としては決まっているかも知れませんが、深く探求しません。
クラス変数に関しても、継承は複雑な問題をはらむようです。(で、強引にまとめます)

# おわりに
本稿内容の動作確認は以下の環境で行っています。

- Ruby 2.1.5 p273

## 付録
上の継承図のソース(Graphviz DOT形式)

```text:sample.dot
digraph {
    rankdir=LR;
    node [shape = box];
    node [color = blue] A B C D;
    node [color = orange, peripheries = 2] M0 M MM PM;
    D    [style = filled, fillcolor = cyan];

    D -> C [color = blue];
    C -> B [color = blue];
    B -> A [color = blue];

    PM -> D  [color = green];
    D  -> M  [color = green];
    M  -> MM [color = green];
    MM -> C  [color = green];
    C  -> B  [color = green];
    B  -> A  [color = green];
    A  -> M0 [color = green];
}
```
git resetでconflictを解消する

conflictした場合にcommitを取り消して対処するの手順

```bash
// conflict発生
$ git pull
 ! [rejected]        dev -> dev (fetch first)

// リモートとローカルのログ確認
$ git branch -a | grep dev
* dev
  remotes/origin/dev
$ git log --oneline origin/dev
14db302 fix
dc027bc third
$ git log --oneline dev
7692fd4 test
dc027bc third

// Auto-mergingされたファイルを捨てて自分の最新コミットに戻す
$ git checkout -f

// ファイルをバックアップ
$ cp 20150106.txt 20150106-1.txt

// 共通部分までコミットに戻る
$ git reset --hard dc027bc

// リモートのコミットをマージ
$ git pull

// 変更分を見ながらコミット、変更分をリモートにpush
$ diff -u 20150106-1.txt 20150106.txt
```

git reset --hard で指定した時点の履歴に戻る方法 | roundropブログ implements Programmable
http://blog.roundrop.jp/show/37
show logの時刻はちょっと変えられる

## 参考

[Ciscoデバイスの操作 - Ciscoルータ - 出力されたログにあわてない](http://www.infraexpert.com/study/ciscoios7.html)

* 設定前に出力されたログは変わらない。
  * 設定後に出力されたものから出力が変わる。
* `show log`での時刻の先頭に`*`が付いているのは`NTPサーバとの時刻同期前`だったか

## ミリ秒も表示

```bash:
service timestamps debug datetime msec
service timestamps log datetime msec
```

## timezone設定

```bash:
clock timezone JST 9 0
```

後ろの0はサマータイムを無効だったと思う

## ログの時間をローカルのtimezoneに合わせる

* これをしないとGMTで出力される

```bash:
service timestamps debug datetime msec localtime
service timestamps log datetime msec localtime
```

## timezoneも表示させる

```bash:
service timestamps debug datetime msec localtime show-timezone
service timestamps log datetime msec localtime show-timezone
```
MSYS2でパッケージのダウンロードに失敗するときの対処

# 現象

pacman コマンドで一部のパッケージのダウンロードに失敗する。

例:

```
$ pacman -S gcc
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (9) binutils-2.25-1  cloog-0.18.1-1  isl-0.12.1-1  mpc-1.0.2-3
               msys2-runtime-devel-2.0.16467.0bee699-1
               msys2-w32api-headers-4.0.0.4379.3403da3-1
               msys2-w32api-runtime-4.0.0.4379.3403da3-1
               windows-default-manifest-6.4-1  gcc-4.9.2-4

合計ダウンロード容量:    0.34 MiB
合計インストール容量:  232.47 MiB

:: インストールを行いますか？ [Y/n]
:: パッケージを取得します ...
エラー: ファイル 'isl-0.12.1-1-x86_64.pkg.tar.xz' を downloads.sourceforge.net から取得するのに失敗しました : Failed to connect to cznic.dl.sourceforge.net port 80: Network is unreachable
警告: 複数のファイルの取得に失敗しました
エラー: 処理を完了できませんでした (ダウンロードライブラリエラー)
エラーが発生したため、パッケージは更新されませんでした。
```

# 対処1

ダウンロードに失敗するファイルを手動でダウンロードする。
パッケージは、本体の msys とそれ以外の mingw32, mingw64 等のパッケージに分類されているので、それぞれ以下の場所からダウンロードする。

msys パッケージ:
64bit: https://mirror.msys2.org/msys/x86_64/
32bit: https://mirror.msys2.org/msys/i686/

それ以外:
mingw32: https://mirror.msys2.org/mingw/mingw32/
mingw64: https://mirror.msys2.org/mingw/mingw64/
clang32: https://mirror.msys2.org/mingw/clang32/
clang64: https://mirror.msys2.org/mingw/clang64/
ucrt64: https://mirror.msys2.org/mingw/ucrt64/

ダウンロードしたファイルは、`/var/cache/pacman/pkg` に格納する。
最後に、`pacman -S package-name` を再実行すればよい。

## コマンドラインからダウンロード

pacman がファイルをどこからダウンロードしてくるかは、`/etc/pacman.conf` および、そこからインクルードされている `/etc/pacman.d/mirrorlist.*` に記載されている。そこに記載された URL の末尾にファイル名を付けることで、ファイルを直接ダウンロードすることが出来る。

例:

```
$ cd /var/cache/pacman/pkg
$ wget http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/x86_64/isl-0.12.1-1-x86_64.pkg.tar.xz
$ pacman -S gcc
```

今回の場合、wget では正常にダウンロードできたが、代わりに curl を使うとダウンロードに失敗した。

```
$ curl -R -L -O http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/x86_64/isl-0.12.1-1-x86_64.pkg.tar.xz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   373    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (7) Failed to connect to cznic.dl.sourceforge.net port 80: Network is unreachable
```

# 対処2

pacman内蔵のダウンローダーではなく、外部コマンドを使ってダウンロードを行うようにする。

`/etc/pacman.conf` の `[options]` セクションに次のような行があるはずなので、使いたい外部コマンドに合わせて、先頭の `#` を削除して有効化すればよい。

```
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
```

当然この設定を行う前に、その外部コマンドをインストールしておく必要がある。
wget を使う場合は出力がかなり多いので、`-nv` または `-q` オプションを付けてもよい。

例:

```
XferCommand = /usr/bin/wget -nv --passive-ftp -c -O %o %u
```


# 参考

* [Pacman ヒント - ArchWiki #パフォーマンス](https://wiki.archlinux.jp/index.php/Pacman_%E3%83%92%E3%83%B3%E3%83%88#.E3.83.91.E3.83.95.E3.82.A9.E3.83.BC.E3.83.9E.E3.83.B3.E3.82.B9 "Pacman ヒント - ArchWiki")
* [pacman/Tips and tricks - ArchWiki #Performance](https://wiki.archlinux.org/title/Pacman/Tips_and_tricks#Performance "pacman/Tips and tricks - ArchWiki")
gcc -shared するときに -c をつけてはいけない

```shell-session
gcc -shared -fPIC -o libfunc.so -c func.c  -lpng
```

オブジェクトファイルになるが共有ライブラリにならない。実行バイナリのソースとのリンクは通るが依存ライブラリのリンクが通らなかったりわけがわからないことが起きる。

正しくは以下

```shell-session
gcc -shared -fPIC -o libfunc.so func.c  -lpng
```

共有ライブラリとして動かないのは他のオプションが原因なのかと思って3時間ぐらいハマった。
gitでconflictが起こった場合の練習

恐怖conflictを練習してみた。

ymko「GitBucketにsuzaki-nishiレポジトリ作ったからねー」
kana「あいよー」

```bash
kana $ ssh://kana@xxxxxxx:29418/pigs/suzaki-nishi.git
kana $ cd suzaki-nishi/
```

```bash
ymko $ ssh://ymko@xxxxxxx:29418/pigs/suzaki-nishi.git
ymko $ cd suzaki-nishi/
ymko $ git checkout -b dev
ymko $ vi 20150106.txt
ymko $ git add .
ymko $ git diff --cached
--- /dev/null
+++ b/20150106.txt
@@ -0,0 +1,2 @@
+洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
+西　「皆さん、あけましておめでとうございます。西明日香です。」
ymko $ git commit -m "first"
ymko $ git push --set-upstream origin dev
 * [new branch]      dev -> dev
```

ymko「devブランチ切ったからねー」
kana「あいよー」

```bash
kana $ git fetch
 * [new branch]      dev        -> origin/dev
kana $ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master
kana $ git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
kana $ cat 20150106.txt
洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
西　「皆さん、あけましておめでとうございます。西明日香です。」
```

kana（・・・ウォって言ってる）

```bash
kana $ vi 20150106.txt
kana $ git diff
@@ -1,2 +1,2 @@
 洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
-西　「皆さん、あけましておめでとうございます。西明日香です。」
+西　「皆さん、あけましてウォめでとうございます。西明日香です。」
kana $ git commit -am "お→ウォ"
kana $ git push
```

ymko「続き書くぜブヒィィィ」

```bash
ymko $ vi 20150106.txt
ymko $ git diff
@@ -1,2 +1,3 @@
 洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
 西　「皆さん、あけましておめでとうございます。西明日香です。」
+洲崎「なんでウォ！？」
ymko $ git commit -am "second"
ymko $ git push
 ! [rejected]        dev -> dev (fetch first)
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first merge the remote changes (e.g.,
hint: 'git pull') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

さぁ大変です。conflictが発生してしまいました。
ymko「ファッ！？」

```bash
ymko $ git pull
   3833632..3eaec1c  dev        -> origin/dev
Auto-merging 20150106.txt
CONFLICT (content): Merge conflict in 20150106.txt
Automatic merge failed; fix conflicts and then commit the result.
ymko $ git status
# You have unmerged paths.
#   (fix conflicts and run "git commit")
#
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
#       both modified:      20150106.txt
ymko $ cat 20150106.txt
洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
<<<<<<< HEAD
西　「皆さん、あけましておめでとうございます。西明日香です。」
洲崎「なんでウォ！？」
=======
西　「皆さん、あけましてウォめでとうございます。西明日香です。」
>>>>>>> 3eaec1c74361ccc65ff544fe5152eeb087238dca
ymko $ vi 20150106.txt
ymko $ git diff
@@@ -1,3 -1,2 +1,3 @@@
  洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
- 西　「皆さん、あけましておめでとうございます。西明日香です。」
+ 西　「皆さん、あけましてウォめでとうございます。西明日香です。」
 +洲崎「なんでウォ！？」
ymko $ git commit -am "fix conflicts"
ymko $ git push
```

関係ないけど何回も聴いた結果ここまで聞き取れたので残しておく。

```text
洲崎「皆さん、あけましておめでとうございます。洲崎綾です。」
西　「皆さん、あけましてウォめでとうございます。西明日香です。」
洲崎「なんでウォ！？和音のウォ？」
洲崎「洲崎西、80回目の放送がスタートしました。」
西　「い、い、やー！」
洲崎「やー！」
西　「やー！」
洲崎「はぅ！」
西　「はぅ！」
洲崎「はい！」
（あははは）
西　「この番組は私達二人が」
```

gitでリモートブランチをローカルにcheckoutする - Qiita
http://qiita.com/YusukeSuzuki@github/items/3bd5752783fd2c2f8805
プログラミング言語独学を行う際の方法

#プログラミング言語独学を行う際の方法
個人的なプログラミング学習手順のまとめメモ

#学習の導入的

##プログラミング学習サイトを見る
プログラミングのやり方を動画で紹介しているサイトでまずは取っ付いてみる。
説明を聞きながらなので、学習はし易い。海外のサイトではなく日本語のサイトを探してみる。
学習中は自分で手を動かしながら写経のように書いていくと覚えは早い。

###参考リンク
[ドットインストール - 3分動画でマスターする初心者向けプログラミング学習サイト](http://dotinstall.com/img/very_top_flatui.png)
[無料動画のオンライン学習サイト - schoo WEB-campus（スクー）](https://schoo.jp/)

##参考書本を読む
プログラミング学習サイトで大まかな知識を入れたら、下記の書籍を順番に読んでいく。
* リファレンス系（初心者向けの書籍。基礎の基礎から説明してくれているもの）
* 逆引き系（何をしたいかから探せる書籍）
* オライリー（応用、きちんとした書き方などを覚える）

##作りたいものを見つける
書籍を読んで基礎知識を強化するのと同時に、作りたいものを見つけておく。
現状自分で作れないものでもOK。こういうものどうやれば作れるんだろう・・・。っと思ったものを作り始める。
【失敗しても大丈夫。その失敗も自分の力になるはず。（きっと。）】

##公式リファレンスを読む
自分の作りたいものや、書籍を読み進めていくうちに自分ではわからないものが出てくると思います。
その場合は公式リファレンスで調べて解決していく癖を付ける。
書籍は水物のため、古くなってしまうことがある。
リファレンスはweb上で様々な人が日々更新していくので最新の手法・やり方が学べる。
###参考サイト
[JavaScript リファレンス - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference)
[PHP: PHP マニュアル - Manual](http://php.net/manual/ja/index.php)

##他のソースコードを読む
このコードどうなってるんだろう？この処理どうすればできるのか？っという視点を常に持つ。
気になったらソースコードを読んでみる。
他の人のコードを読むことも大切。
どのような意図で制作されているのか知ると面白い。

##競技プログラミング
遊びとして競技プログラミングというのも面白いかも。下記サイトにて腕試し的なことができる。
他の人の答えた回答などもあるので、同じ問題でも複数通りの回答が見れる。それぞれの考え方なども参考になりそうです。
[AIZU ONLINE JUDGE: Programming Challenge](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)
Atomエディタでide-haskellを使うまでの手順


## おことわり
この記事を書いておいてなんですが、筆者はide-haskellを使う事が出来ませんでした。原因と思わしきものは以下で
* インストールが悪い
* 設定が悪い
* cabal fileが入っているプロジェクトが作れない
まあ、ぶっちゃけ全部怪しい感じです。
どなたかご存知でしたら、ご教授頂きたいです。
後、時間があればまたからかってみたいと思ってます。
一応以下の内容はメモとしてそのままに残しておきます。

## インストール手順
最初は[Haskell IDE Leksah 入門 - Qiita](http://qiita.com/7shi/items/d1e5a0c22be6cf61d286)を参考にしてLeksahをインストールしたのだがエディタ的につらかったのでAtomのプラグインで無いか探したら普通にあった。
[ide-haskell](https://atom.io/packages/ide-haskell)が便利そうだから導入してみる。
Read_meに
> Requirements
> 
> ghc-mod
> stylish-haskell
> autocomplete-plus

とある。
ghc-modとstylish-haskellはHaskellのパッケージ。
autocomplete-plusはAtomのパッケージ。

そもそもHaskellの開発環境でHaskell Platformってヤツをインストールするのが良いらしい。
ちなみに、Haskell PlatformはLeksahをインストールする前に良く理解しないままインストールしてしまったのであっているのか不明。

Haskell Platform 2014.2.0.0 for Mac OS X, 64bit
参考：
[Haskell Platform のインストール方法](http://mew.org/~kazu/academic/2013/miyazaki-u/install.html)
[本物のプログラマはHaskellを使う - 第39回　一般向けの「Haskell Platform」とインストール・ツールの「cabalコマンド」：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20100406/346695/)

1. App Store から Xcode をインストール
2. 「アプリケーション」の下にインストールされた Xcode を立ち上げて、Xcode → Preference から Command Line Tools をインストール
3. [64bit用のHaskell Plaftform](https://www.haskell.org/platform/mac.html)をインストール
4. インストーラーの指示通りにインストール

> Haskell Platformは，その名の通りHaskellでプログラミングをするユーザー向けの開発プラットフォームです。Haskell Platformには，GHCに加え，GHCには含まれていないライブラリや，cabalコマンド（cabal-installライブラリ管理ツール）などのツールが収録されています。

インストールチェック。

``` ターミナル
$ ghc-pkg list
```
でパッケージのリストが表示される。


ghc-modは見渡しても無いのでインストールする
参考：[ghc-mod をインストールして夢のemacs上でhaskellプログラムを補完 - 計算機と戯れる日々](http://d.hatena.ne.jp/n9d/20100831/1283235161)

``` ターミナル
$ cabal install ghc-mod
```
ダウンロードして、ビルドして、インストールしてる模様。時間がかかるが待つ。。。

インストール終わったら`ghc-pkg list`で確認。ghc-modが追加されている。もちろんghc-modが必要とするパッケージも追加されている。

次はstylish-haskell
[jaspervdj/stylish-haskell · GitHub](https://github.com/jaspervdj/stylish-haskell)を参考にインストール

``` ターミナル
$ cabal install stylish-haskell
```
やっぱし待つ。

次はautocomplete-plusをインストール
Atomの設定画面でパッケージをインストール

ide-haskellもインストール

眠いので今日はここまで。
Amazon EC2 Container Service プレビュー版で実践編をがんばってみた結果

## まえがき
Amazon EC2 Container Service(以下ECS)で実践的な構成を作ってウェ～イしようと思ったんですが、
試していくにつれて理解が浅いことに気付いたため
結果的にポエムになりました:)

## Amazon EC2 Container Service(以下ECS)
ECSを動かしてみた系の記事はもうすでにいくつか公開されているので、
実際の運用を考えた構成にした時にどんな感じなんだろう？
という肌感を得るためにがんばってみました。
ちなみに現時点(2015/1/9)ではプレビュー版のため
正式版では変更される可能性大です。
生暖かい目で御覧ください。

<br>

## ECSがよくわからない方への補足
### 用語集
用語|説明
---|---
クラスタ|ECSを管理するための単位。ロールごとに用意する感じだと思う。
タスク|１インスタンス内で構成されるコンテナの定義。クラスタにかかわらずグローバルなもの。
実行中タスク|クラスタ内で実行されているタスクのこと。

### 仕様についてメモ
- １つのサーバは１つのクラスタにのみ属する。
- １サーバ内では１つのタスクのみ実行できる。別のタスクを実行しようとするとタスクが上書きされる。

<br>


## テスト構築しようとしていた構成
Appクラスタは **webアプリ／fluentd／sensuクライアント** の３つのコンテナで、
Redisクラスタは **redis／sensuクライアント** の２つのコンテナで、
Fluentdクラスタは **fluentdサーバ（Appからの受信用）／sensuクライアント** の２つのコンテナで、
Sensuクラスタは **sensuサーバ（各サーバのモニタリング）** の１つのコンテナで、
構成されています。
![スクリーンショット 2015-01-11 2.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/9099/e8e3946c-7a1d-fa3e-9808-661c0f673ced.png)


で、結論から言うと現時点ではムリ〜。

<br>

## ダメな理由
### プレビュー版制限事項
そもそも、プレビュー版の制限として
**クラスタは最大２つまで**
という縛りがあるため、上記構成は出来ませんでした。
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_limits.html


## いろいろ試しているうちに疑問がわいた
そもそもですよ、クラスタ間の連携について考えると
App -> Redis に接続したい場合、
**AppクラスタはどうやってRedisの情報を取得すればよいのでしょうか？**  
Appクラスタ内で ``aws ecs .. `` コマンドで取得して/etc/hostsに適用する仕組みを作る？
もしくはconsulを入れて、自動的に居場所がわかるようにする？  

ここで気付いた。ECSはここまではやってくれないのか〜


## CoreOSの技術と比べて見る
[CoreOSに入門した](http://deeeet.com/writing/2014/11/17/coreos/)

そうか、ECSはここでいうfleetの役割だけ提供しているのではないか？
つまりetcdのように複数サーバをクラスタする仕組みが
別途必要なのでは？

<br>

## ECSで出来ること(プレビュー版時点)
- クラスタ（サービス）毎に「どのクラスタにどのコンテナを起動するかのタスク定義／タスク実行／確認」などができる
- クラスタに参加しているEC2インスタンスがどれか？の確認ができる
- １サーバ内にコンテナをいくつ起動するか、をcountで指定できる
- CPU／メモリなどコンテナのリソース管理が出来る
- コンテナデプロイはコマンドで出来る


## ECSで出来ないこと(プレビュー版時点)
- EC2インスタンス自体のスケール。既存のAutoScalingなどと連携する必要がある。
- クラスタ間の連携。他のツール(consulなど)を使う必要がある。
- Volumeマウント（たぶん、正式版ではできるようになってるとおもう http://stackoverflow.com/questions/27557235/does-amazon-aws-ec2-container-service-support-volumes）
- ログをまとめるのは自前でやる。k8sのようにfluentdをバンドルしてくれると嬉しい


<br>

出来ないこと、については
正式版リリースと共にサポートしてくれるんじゃないかなーと期待してる。


<br>

以上、ポエムでした。
WebStromeなどからnode-supervisorを使いつつデバッグを行う

nodemonでも同じ方法でできた。
この場合,Runボタンから起動させても起動しなかったので注意する
![スクリーンショット 2015-01-11 1.19.57.png](https://qiita-image-store.s3.amazonaws.com/0/1765/2db2ebd9-0210-82d6-1413-fdeeedbd259b.png)
備忘録:SQLのINを複数列指定で使う

# 1:1 (列の数:条件の数)
列名=値で条件を指定
特定の値を持つ行を検索したい場合

```
select
    *
from
    table t
where
    t.col = "data";
```

普通。

# 1:n
列名 in (値...)
複数の値に一致する行を検索したい場合

```
select
    *
from
    table t
where
    t.col in ("data1", "data2");
```

あるいはorでつなげる。
割りと普通。
※INの中身が多くてSQLが長くてだめとかいうやつもいる

# n:n
(列名, 列名, ...) in (値, 値, ... )

```
select
    *
from
    table t
where
    (t.col1, t.col2) in (
        ("hoge", "fuga"),
        ("foo", "bar")
    )
```

あんま必要になる場面がないから記憶の砂漠に埋まる。

# その他
結合条件は`from`句に、検索条件は`where`句に書くのが個人的に好きです。「fromに検索条件書いてもいいやろ！！」という反論は受け付けた後にスルーします。

どうでもいいですが、テーブル名の別名をつけるのに毎回悩むのですが皆様はどうやってつけてるんですかね？。
リストとIOUArray

[Haskellの実験メモ](http://qiita.com/7shi/items/b6cbb7df2dd969c84f49)です。

別のリストを作り続ける方法と、IOUArrayで書き替える方法を比較しました。

※ UArrayの存在は知っていますが、意図的にリストを使いました。

# リスト

変更後のリストは作り直しているので`print`以外の副作用はありません。

```hs
writeList list index value =
    take index list ++ [value] ++ drop (index + 1) list

main = do
    let a = [1,2,3]
    print a
    
    let b = writeList a 0 9
    print b
    
    let c = writeList b 2 9
    print c
```
```text:実行結果
[1,2,3]
[9,2,3]
[9,2,9]
```

# IOUArray

書き換えで副作用が発生しています。

```hs
import Data.Array.IO

main = do
    a <- newListArray (0,2) [1,2,3] :: IO (IOUArray Int Int)
    print =<< getElems a
    
    writeArray a 0 9
    print =<< getElems a
    
    writeArray a 2 9
    print =<< getElems a
```
```text:実行結果
[1,2,3]
[9,2,3]
[9,2,9]
```
cocoapods-keysで設定値をプロジェクトから切り離す


## はじめに

APIの`ACCESS_KEY`や`SECRET_KEY`などの環境変数や、アプリ固有の設定値（KEY and VALUE）をソースコードやInfo.plistにハードコーディングせず、プロジェクトから切り離して管理できないかと常考えていました。

## 実行環境

+ Xcode 6.1.1 (6A2008a)
+ cocoapods 0.35.0
+ cocoapods-keys 1.0.0

## インストール

cocoapods-keysはcocoapodsのプラグインとして配布されています。
https://github.com/orta/cocoapods-keys

インストールはcocoapodsと同じくgemで行います。

```Shell
$ gem install cocoapods-keys
```

## 設定方法

プロジェクトルートディレクトリにおいて、以下のコマンドを行うと、KEYとVALUEを設定できます。

```Shell
$ pod keys set KEY VALUE
```

設定作業の具体例です。

```Shell
$ cd MyApplication
$ pod keys set "NetworkAPIToken" "AH2ZMiraGQbyUd9GkNTNfWEdxlwXcmHciEOH"
Saved NetworkAPIToken to MyApplication.

$ pod keys set "AnalyticsToken" "6TYKGVCn7sBSBFpwfSUCclzDoSBtEXw7"
Saved AnalyticsToken to MyApplication.

$ pod keys
Keys for MyApplication
  ├  NetworkAPIToken - AH2ZMiraGQbyUd9GkNTNfWEdxlwXcmHciEOH
  └  AnalyticsToken - 6TYKGVCn7sBSBFpwfSUCclzDoSBtEXw7

GIFs - /Users/orta/dev/mac/GIFs
  └ redditAPIToken & mixpanelAPIToken
```

## 参照方法

設定値を更新したら、`pod install`します。

```Shell
$ pod install or pod update
```

上記コマンドにより、動的に各設定値にアクセスするためにメソッドを持ったクラスが生成され以下のように参照できます。

```ObjC
#import "ORAppDelegate.h"
#import <CocoaPods-Keys/MyApplicationKeys.h>
#import <ARAnalytics/ARAnalytics.h>

@implementation ORAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    MyApplicationKeys *keys = [[MyApplicationKeys alloc] init];
    [ARAnalytics setupWithAnalytics:@{
        ARGoogleAnalyticsID : keys.analyticsToken;
    }];
}

@end
```

## 設定値はどこに保存されるの？

設定値はキーチェーンに保存されます。.envファイルのようにファイルにPlanTextで保存しないのでセキュアです。

 ![キーチェーンアクセス.png](https://qiita-image-store.s3.amazonaws.com/0/4943/f45ff75c-744d-233b-21f5-285b004f4b10.png "キーチェーンアクセス.png")

## PodfileにKEYの一覧を記載 via CocoaPods 0.36

CocoaPodsnのv0.36以上であれば、PodfileにKEYの一覧を記載できます。
`pod keys set`コマンドを実施しなくても、`pod install`を実施すると対話的に設定したKEYのVALUEを聞いてくれます。

```Podfile
plugin 'cocoapods-keys', {
  :project => "Eidolon",
  :keys => [
    "ArtsyAPIClientSecret",
    "ArtsyAPIClientKey",
    "HockeyProductionSecret",
    "HockeyBetaSecret",
    "MixpanelProductionAPIClientKey",
    ...
  ]}
```

```Shell
$ pod install
Analyzing dependencies
Downloading dependencies
Using ARAnalytics (2.8.0)
...
Generating Pods project
Integrating client project

 CocoaPods-Keys has detected a keys mismatch for your setup.
 What is the key for ArtsyAPIClientSecret
 > HOGE HOGE HOGE
```

## REF

実際に使用されているOSSのアプリがあります。

+ https://github.com/artsy/eidolon
hamlでリストを使うときに、HTML出力で改行されないようにする

# 課題
hamlでリストを使うと、<li>要素の中の物が改行されて出力されてしまいます。

```haml
%ul
  %li リスト1
  %li リスト2
  %li リスト3
```
と記述すると、

```html
<ul>
  <li>
    リスト1
  </li>
  <li>
    リスト2
  </li>
  <li>
    リスト3
  </li>
</ul>
```
と出力されます。

# 解決策
どうせならこうしたいです。

```html
<ul>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
```

%ulの後に不等号記号(<)をつけてやるとそのようになります。

```haml
%ul
  %li< リスト1
  %li< リスト2
  %li< リスト3
```

ちなみに(<>)をつけると、ulから全て１行で表示されます。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（２）キャラクターアニメーション

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

# キャラクターアニメーション
それでは、この雛形の処理を下記のように変更してみます。

```coffeescript
class enforceMain
    constructor:->
        bearobj = addObject
            motionObj: sample
            type: SPRITE
            x: SCREEN_WIDTH / 2
            y: SCREEN_HEIGHT / 2
            image: 'bear'
            width: 32
            height: 32
            animlist: [
                [50, [0, 0, 1, 1, 2, 2, 1, 1]]
                [50, [5, 5, 6, 6, 5, 5, 7, 7]]
            ]
```
変更した後にはCoffeeScriptをコンパイルする必要があります。
コンパイルは、ゲームディレクトリのトップ（srcの中とかでなく、game01ディレクトリ直下）で、
$ **enforce build**
を実行するとコンパイルされます。
しかし、変更するたびにコンパイルするのは効率が悪いので別のコンソールを開き、同じゲームディレクトリで、
$ **enforce build -w**
と実行すると、スクリプトの変更を検知し保存と同時にコンパイルが行われます。
コンパイルが終わりましたらWebブラウザで開いてみてください。
アニメーションしているクマが画面の中央に出るはずです。

それでは、このソースの後ろに、

```coffeescript
        bearobj.animnum = 1
```
と記述してください。
（別コンソールで監視コンパイルコマンドを実行していれば、保存と同時にコンパイルされます）
CoffeeScriptなのでインデントに注意してください。
コンパイルでエラーが出なければ、Webブラウザで表示しているページをリロードしてみてください。
画面中央でアニメーションしているキャラが白いクマになっているはずです。
これは、**addObject**のパラメータ、

```coffeescript
            animlist: [
                [50, [0, 0, 1, 1, 2, 2, 1, 1]]
                [50, [5, 5, 6, 6, 5, 5, 7, 7]]
            ]
```
の、下のアニメーションパターンを指定したので白いクマのアニメーションに変わりました。
（上のアニメーションパターンは「0」になります）

この配列の意味は、

**[表示時間, [画像番号、画像番号、画像番号・・・]]**

になります。
「表示時間」は一枚の画像を表示する時間になります。
「50」を指定するとアニメーションパターンのひとコマが50/1000秒になります。
その後の配列に羅列される「画像番号」がアニメーションに使われる画像の番号になります。
この番号は「**image**」で指定した、プリロードされた画像での画像番号になります。
このあたりはenchant.jsや、tmlib.jsの画像番号指定と同じなので、そちらを参照してください。
「**image**」で指定する名前（この例では「**bear**」）は「**environ.coffee**」に記述した、プリロードデータ一覧で設定したキーになります。

アニメーション関係の処理には他に、

指定したアニメーション番号のアニメーションを一回だけ表示した後にオブジェクトを削除する

```coffeescript
            bearobj.setAnimationToRemove(アニメーション番号）
```
アニメーション番号で指定したアニメーション1を一回だけ表示した後に、アニメーション番号2に変更する

```coffeescript
            bearobj.setAnimationToOnce(アニメーション番号1、アニメーション番号2）
```
などがあります。


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

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
grepの小ネタ

## CR+LFファイルを行末のパターンでマッチさせる
末尾が200で終わるものを抽出する例
```
$ grep '200\s*$' logfile
```

LFファイルなら単に`200$`でよかった。`\s`は制御文字を含めた空白。

## 検索結果に各ファイルのファイル名を含めないようにする
```
     -h, --no-filename
             Never print filename headers (i.e. filenames) with output lines.

```
Macの特殊文字を無効化

## 困ったこと

Karabinerを使って、IntelliJ IDEAをEmacsキーバインドにしてたけど、Optionを使ったキーバインドが意図したように動作したり、なかったり…

とりあえずは、FirstStroke:Escape + SecondStroke:xxx で使用していたけど、その設定をするとSearch Everywhereのダイアログを閉じられなくなった。
※たぶんFirstStrokeにEscapeが登録されているので、次のStrokeを待ち受けていると思われる。

原因はKarabinerの設定が間違ってたりとか、キーボードがRealforce(JIS配列)とかいろいろありそうだけど、自分の場合は特殊文字列を無効にすることで全て解決！！

## Ukelele Ver2で特殊文字を無効
1. 以下のサイトよりUkeleleをダウンロードしてインストール
http://scripts.sil.org/ukelele

2. 今使ってる英数字キーボードから、設定を作成
メニュー -> File -> New from Current Input

3. Optionボタンを押しながら、無効にしたい特殊文字をマウスでダブルクリックして空白にする。
![keylayout.png](https://qiita-image-store.s3.amazonaws.com/0/62029/0460c0dd-7270-dd8f-4a4a-a1a5e41d9023.png "keylayout.png")

自分の場合はほぼ消してみた

4. キーボードネームの設定
メニュー -> Keybord -> Set Keyboard Name

5. 設定ファイルの保存
メニュー -> Save as -> ~/Library/Keyboard\ Layouts/new.keylayout

6. 設定ファイルの読込
システム環境設定 -> キーボード -> 入力ソースから作成したレイアウトを追加
Google日本語入力とか使ってても、何故か作成したレイアウトが適当される(よくわかってない)
(2015-01-03 追記)Google日本語入力の英数モードに適応されるタイミングがよくわからないけど、自分の場合は1度作成したキーボードを手動で選択した後にGoogle日本語入力の英数を選択したら適応されていた。

7. あとはIntelliJ IDEAでKeymapの設定！！
KarabinerのEmacsModeも併用してるけどね。

## Ukelele Ver3について
2015-09-20にはVer3がリリースされています。
操作手順に違いはあるものの、上記の内容は問題なく設定できることを確認しています。
WebサーバにアクセスするとArduinoでLチカ

この手のは猫も杓子も作ってるかと思いますが、bottle.pyというWebフレームワークとpySerialを使って書いてみました。コンテンツはWeb、ハードウェアはlocalhostというケースも考えられるので、CORS(Cross-Origin Resource Sharing)対応として`Access-Control-Allow-Origin`ヘッダを付けています。

```py
import serial
import sys
from bottle import response,route,run

try:
    ser = serial.Serial('/dev/tty.usbmodem1451',9600)
except OSError:
    ser = False
except:
    print sys.exc_info()[0]
    raise

@route('/arduino/<command>')
def arduino(command):
    response.set_header('Access-Control-Allow-Origin','*')
    if ser:
        ser.write(command)
        line = ser.readline()
        return line
    else:
        return "arduino is not connected"

run(host="localhost",port=8946,debug=True)
```

arduino側はシリアルで文字列「１」を受け取ると１秒だけ光ります。

```java
byte c = 0;
 
void setup(){
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}
 
void loop(){
  while (Serial.available()){
    c = (int)Serial.read();
    //Serial.flush();
    switch(c){
      case 49://1
        digitalWrite(13,HIGH);
        delay(1000);
        digitalWrite(13,LOW);
        break;
    }
  }
}
```

bottle.pyもpySerialもMacならpipでインストールできます。

```
pip install bottle
pip install pyserial
```

※追記※
Githubに登録しました
https://github.com/usopyon/bottle_serial