OmniAICreator/Qiita-1.07M huggingface dataset:
Grunt で Hello World

# 概要
タスク自動化ツール [Grunt](http://gruntjs.com/) (v0.4.5) の使い方メモとして、Hello World と表示するタスクの書き方を説明します。

※ 自作タスクをつくるサンプルです。プラグインは出てきません。
※ Grunt（grunt-cli）のインストール方法については他の記事を参照してください。

# ファイルの準備
`~/grunt-project` という名前のディレクトリを今回の作業ディレクトリとします。

1. `cd ~/grunt-project`
1. `npm init`
    * 出てきた質問に答えます。Enterでスキップできます
    * package.json というファイルが作られます
1. `npm install grunt --save-dev`
    * package.json の devDependencies に grunt が追加されます
    * node_modules に grunt ディレクトリが追加されます
1. `touch Gruntfile.js`
    * Windows では右クリックメニューなどからGruntfile.jsを新規作成

# 本編

いろいろな方法で、コンソールにHello Worldと表示させるタスクを定義します。
それぞれの書き方で同じ動作をしますが、下に行くほど保守性が高まります。

## 最小限
最小限の記述で動かしてみます。

```js:Gruntfile.js
module.exports = function(grunt) {
  
  grunt.registerTask('default', function() {
    console.log('Hello World');
  });

};
```

`grunt default` または `grunt` を実行してください。
下記が表示されれば成功です。

```
Running "default" task
Hello World

Done, without errors.
```

## タスクに名前を付ける

Hello World を表示するというタスクに hello という名前を付けます。

```js:Gruntfile.js
module.exports = function(grunt) {

  grunt.registerTask('hello', function() {
    console.log('Hello World');
  });

};
```

これで `grunt hello` と入力すると、先ほどと同じ結果が得られます。
ただし、`grunt` 単体だとdefaultのタスクがないよという旨の警告（Warning: Task "default" not found. Use --force to continue.）とともに失敗します。
`grunt` 単体で動作させたい場合は、下記のようにdefaultタスクに登録します。

```js:Gruntfile.js
module.exports = function(grunt) {

  grunt.registerTask('hello', function() {
    console.log('Hello World');
  });

  //grunt.registerTask('default', 'hello');
  grunt.registerTask('default', ['hello']);

};
```

コメントアウトした書き方でも動きますが、今後複数のタスクを登録することを考えて配列にしています。

## モジュール化する
今後のことを考えて、タスクの定義を他のファイルで行います。タスク定義ファイル用のディレクトリがあると便利なので、同時に作ります。

1. `mkdir tasks`
1. `touch tasks/hello.js`


```js:tasks/hello.js
module.exports = function(grunt) {
  
  grunt.registerTask('hello', function() {
    console.log('Hello World');
  });

};

```
```js:Gruntfile.js
module.exports = function(grunt) {

  // tasksディレクトリ以下のタスクをすべて読み込む
  grunt.loadTasks('./tasks');

  grunt.registerTask('default', ['hello']);

};
```

# 参考

* ドットインストール Grunt入門 [[Link]](http://dotinstall.com/lessons/basic_grunt)
* Getting Started with Grunt: The JavaScript Task Runner / Jaime Pillora [[Link]](http://www.packtpub.com/getting-started-with-grunt-the-javascript-task-runner/book)

# ひとこと

Grunt は最初コンパイルのためのツールかと思っていたのですが、node.jsでできることはなんでもタスク化できるのですね。
秘密鍵の設定(SSH)-鍵の作成-

//備忘録

#秘密鍵の設定(SSH)-鍵の作成-
##作り方
<li>コマンド入力
`$ ssh-keygen -t rsa`
<li>Enter file…と聞かれるのでENTER(保存場所聞かれてる)

<li>passphraseの作成(秘密鍵を使用するパスワード)

<li>下記内容が出れば作成完了(pubが公開鍵)
`…/.ssh/id_rsaと…/.ssh/id_rsa.pub`
<li>下記コマンドを入力して作成できているか確認(lはL≠I)
`$ ls -la ~/.ssh`

下のような奴が出てればOK
-rw-------   1 入力した鍵名  staff   1679  6  7 23:32 id_rsa
-rw-r--r--   1 入力した鍵名  staff    398  6  7 23:32 id_rsa.pub

<li>作成した公開鍵をサーバーにコピー
`$ scp id-rsa.pub サーバー名:送りたい場所(/home/…)`

<li>サーバー内に.sshディレクトリ作成
`$ mkdir ~./ssh` 

<li>sshディレクトリのパーミッション(読み取り専用とか)を読書可能に変更
$ chmod 700 ~./ssh

<li>.sshに入った後、コピーした公開鍵を~/.ssh/authorized_keysへ登録
`$ cd .ssh → $ cat ../id_rsa.pub >> autorized_keys`

<li>ユーザーのみ読み書きOKとする
-rw------------------となれば完了(ディレクトリならdrw…)
`$ zhmod 600 authorized_keys`

<li>ユーザー認証の方法をパスワード認証から公開鍵暗号方式へ変換
コマンドで設定ファイルへ移動
`$ cd /etc/ssh/`

<li>設定ファイルの編集(viコマンド)を行う
`$ vi sshd_config` 
<li>公開鍵はOKで、パスワードはNoに変更(//は便宜上付けてるだけで本来は無い)
//#PubkeyAuthentication yes→PubkeyAuthentication yes
//#PasswordAuthentication yes→PasswordAuthentication no
<li>再起動を行う→以下が出れば完了
`$ /etc/init.d/sshd restart`
Stopping sshd:  [OK]
Starting sshd:  [OK]

<li>確認
別ターミナルから $ ssh サーバー名でパスフレーズ聞かれたらOK
gitの初期設定まとめ


gitの勉強会をする機会があったのでその設定等をまとめました。

##windows
###msysgitの導入
今回は最も手軽に初期設定ができる[msysgit](http://msysgit.github.io/)で作業します。
サイトに行ってダウンロードしてきたら、インストーラを起動して基本的にdefaultで大丈夫ですが、

「Select Components」の中で「Additional icons」を選んでおくと便利かと思います。

また、「Adjusting your PATH environment」で「Run Git from the Windows Command Prompt」にするとコマンドプロンプト(comd.exe)やパワーシェル(PowerShell.exe)等でもGitコマンドを使えるようになります。

環境変数についてはお好みで変更してください(丸投げ)

######参考URL
[WindowsにおけるGit利用環境は整った： Git for Windows と SourceTree for Windows](http://d.hatena.ne.jp/m-hiyama/20140203/1391381365)



##Mac

###Homebrewのインストール
Java JREとXcodeのCommand Toolsもインストール(していなかったら参照)


```
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```

######参考URL [Mac OS X Mavericks にHomebrewをインストールする方法](http://maezono.info/2013/12/14/1350)

###gitのインストール
```
$ brew install git
```

##ubuntu
###sourceからインストールする方法
Git依存ライブラリーのインストール
####Fedora系
```
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
```

####Debianベース
```
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
```

ライブラリがそろったら[スナップショット](http://git-scm.com/download)を持ってきてコンパイルしてインストール

```
$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
```

これでインストールした後にgitを通してgitの最新版を持ってくることができるようになります。べんり〜

```
$ git clone git://git.kernel.org/pub/scm/git/git.git
```

###パッケージマネジメントツール(yum, apt-get)でインストールする方法
####・yumの場合
```
$ yum install git-core
```
####・apt-getの場合
```
$ apt-get install git
```
######参考URL
・[使い始める-Gitのインストール](http://git-scm.com/book/ja/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

ここまででインストールは終了

```
$ git --version
```
等で自分の環境にgitがインストール出来ているか確認してください。


##名前、メール、色等の初期設定
gitに関する設定は基本的に.gitconfigに直打ちでも対応できます。

```
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
$ git config --global color.ui true
```

###現在の設定を確認する
```
$ git config --list
```

###commit log編集用エディタの指定
```
git config --global core.editor 'emacs'
```
最近はやりのSublime Textにも設定できます。
######参照
・[Sublime Text2 を Git のコミットエディタにするには](http://www.devlog.alt-area.org/?p=1366)
・[How to use Sublime Text as Git commit message editor?](http://www.sublimetext.com/forum/viewtopic.php?f=3&t=3257)


##gitの基本的なコマンド
###status
現在の状況を確認

```
$ git status
```

###add
fileをステージングエリアに追加

```
$ git add <file>
```

###commit
fileをローカルリポジトリに追加、コミットメッセージの追加

```
$ git commit 
```

###reset 
直前のコミットを打ち消す

```
$ git reset HEAD
```

###revert 
作業ツリーを指定したコミット時点の状態にまで戻す

```
$ git revert <HashTag>
```

###log
コミットログの表示

```
$ git log
```

###merge 
ローカルブランチのマージ

```
$ git merge 
```

###rebase
ブランチの派生元の変更

```
$ git rebase <branch>
```

###stash
現在の作業ツリーの状態を一時的に保管

```
$ git stash
```
###reflog, cherry-pick
HEADのログを表示、commitの抽出

```
$ git reflog
$ git cherry-pick <HashTag>
```

##スライド
勉強会に使った資料をSlideShareにアップロードしたので、よければいいねしてシェアしてツイートしてセーブしてやってください笑

・[Git, Github超入門](http://www.slideshare.net/tomokis2/git-practice)
秘密鍵の設定(SSH)-秘密鍵って？-

//備忘録
##◆秘密鍵とは
情報送信の際、第三者に情報を盗み見されないよう暗号化する必要がある。
暗号化を行う方式に公開鍵暗号方式というのがあり、
その際に使用されるのが秘密鍵である⇆公開鍵

##◆暗号化の方式(そもそも)
1. 共通鍵暗号方式

暗号化と復号化に同じ鍵を使う方式
受信側で暗号化・復号化用の鍵を作成し、そのうち1つの鍵を送信者側に渡す。
そして自分宛にデータを送信する場合は、渡した鍵で暗号化して送信してもらう。
データを送信する時にはまず送信側で鍵を使ってデータを暗号化します。
受信側では、受けとったデータを鍵を使って復号化する。

※問題点

* 鍵をどのようにして渡すのか
同じ鍵を使用いるので、作成した鍵を相手に渡す必要がある。
しかし鍵をインターネット経由で渡した場合、
**鍵は暗号化されておらず** 鍵を悪意のある第三者に見られてしまう可能性がある
→結局情報は解析されてしまう。
* 複数人とやり取りする場合、鍵の管理が大変
皆共通の鍵を利用するとどの情報も見放題になるため、
やり取りする相手毎に鍵の管理が必要になる。
そのため大規模になると、管理コストが必要になる。

2.公開鍵暗号方式

公開鍵暗号方式は公開鍵と秘密鍵という2つの鍵を使って暗号化と復号化を行う。
どちらの鍵も暗号化にも復号化にも使用可能
以下の決まりがあるだけ

* 公開鍵で暗号化したデータは秘密鍵でしか復号できない
* 秘密鍵で暗号化したデータは公開鍵でしか復号できない

**受信する側** で公開鍵と秘密鍵を作成
秘密鍵は誰にも見せない⇆公開鍵は誰でもダウンロード可能
送信側は公開鍵を取得し暗号化→ネットで送信→受信側は秘密鍵で復号化
公開鍵で作成されたデータを盗み見しても、秘密鍵でしか復号できないので安全

※問題点

* 送信元から先への一方通行な使用しかできない
* 処理が複雑なため、遅い
Emacsの複数起動（MacOS）


#Emacsの複数起動

２つの実行ファイルを平行してデバッグしたい場合など，Emacsを複数起動する必要がある。そのときは，以下のように起動するとよい。

```bash
$ /Applications/Emacs.app/Contents/MacOS/Emacs &
```

# 参考サイト
- http://ongaeshi.hatenablog.com/entry/emacs-options-q-l
Raspberry Piはじめました。

# 必要もの
- Raspberry Pi Type B
- ケース（クリア）
- SDカード
- HDMIケーブル
- モニタ
- microUSB，電源
- USBキーボード，マウス

![Raspberry Pi](https://qiita-image-store.s3.amazonaws.com/0/35980/7cdebc15-7e64-e813-6752-9cb9132f0aad.jpeg "Raspberry Pi")

買ったのは、Raspberry Pi本体とケースのみ。Amazonで5000~6000円くらいでした。

# 準備
1. [ここ](http://www.raspberrypi.org/downloads/)からRaspbianをダウンロード
2. [Win32DiskImager](http://sourceforge.jp/projects/sfnet_win32diskimager/)で先ほどDLしたファイルをSDカードに書き込む
3. HDMI, LAN, USBキーボード, SDカードをさす
4. 最後に、電源ケーブル（microUSB）をさす。自動的に電源がはいる。

# 初期起動

電源を入れると、画面にいろいろ表示されて、raspi-configがたちがるので、設定する

``` raspi-config
1 Expand Filesystem
  => SDカードを4GB以上認識するようにする
2 Change User Password
3 Enable Boot to Desktop/Scratch
4 Internationalisation Options
  => Change TimezoneでAsia -> Tokyo
     Change Keyboard Layout Set ...で Generic 105-key (Intl) PC → Other → Japanese
5 Enable Camera
6 Add to Rastrack
7 Overclock
8 Advanced Options
9 About raspi-config
```

4 Internationalisation OptionsのChange Localで日本語（ja_JP.UTF-8）を設定すると文字化けするので、jfbtermを入れる。

``` bash
$ sudo aptitude -y install jfbterm
$ jfbterm
```

しかし、フォントが汚いのと、日本語なくてもいいかなと思ったので、結局日本語は諦めました。。

次に、パッケージを更新します。

``` bash
$ sudo apt-get update
$ sudo apt-get upgrade
```

また、startxコマンドをたたくと、GUIで操作できます。

``` bash
$ sudo startx
```

# シャットダウン
$ sudo shutdown -h nowでシャットダウンしたあとに、電源コードを抜く。電源ボタンはない。
 

# 参考にしたサイト
- http://www.lifehacker.jp/2013/02/130226raspberry_pi_guide.html
- http://www.slideshare.net/tominagamichiya/raspberry-pi-20130818
- http://openrtm.org/openrtm/ja/node/266
ローカル環境の設定ファイルをgitの対象から外す

ローカルで作業をするときに、

```
fuel/app/config/development/db.php
```

で設定を変更しました。
また、
http://qiita.com/maximum80/items/729af0392a84a3196088
で書かれているように、composerのアップデートを行いました。

その後にリモートの最新状態をpullしようとすると、

```
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.
```

とgitに怒られてしまいます。

でも、ローカルでの開発用に設定しているファイルなので、この子達はコミットしたくありません。
そんな時の対処法です。

#1. git rm --cached ファイル名

まず、

```
$ git status
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   composer.phar
	modified:   fuel/app/config/development/db.php

```

と、ステージングをしていないファイルが2つあります。
これらのファイルの変更履歴をgitから削除しましょう。

```
$ git rm --cached fuel/app/config/development/db.php
$ git rm --cached composer.phar
```

これで、変更をしたという履歴がgitから削除されます。

#2. .gitignoreに指定のファイルを追記
.gitignoreは、
gitに無視をさせるファイル（変更をしても無視をする）ファイルを指定するファイルのことです。

```
$ vim .gitignore
```

```.gitignore
/fuel/app/config/development/db.php
composer.phar
```
と、変更を無視したいファイルを追記すればオーケー。

```
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 131 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working directory clean
```

となっていれば完了。

[参考URL]
http://www.omakase.org/misc/gitignore.html
Sprite KitでFlappy Birdを作る(Swift版)

Swiftの発表直後に作られたFlappy Birdが話題になりました。そんなに早くできませんでしたが、私もSwiftの勉強がてら、以前書いた[記事](http://qiita.com/oinariman/items/dc0296aee10aadeb50cd "Sprite KitでFlappy Birdを作る")のObjective-C版を移植してみました。

**追記(2016/3/23)**

最近のXcodeでビルドできるように、2年ぶりくらいにコード修正しました。ついでに効果音を付けて、ボールを絵文字に変えました。ご笑覧ください。
https://github.com/oinariman/RMSwiftFlappyBall

![demo.gif](https://raw.githubusercontent.com/oinariman/RMSwiftFlappyBall/master/demo.gif)

内容はObjective-C版と変わりありません。(画面サイズの違い(4インチ or 3.5インチ)
によって通り抜ける隙間の幅が変わる問題は直しました。)

# Swift雑感

(※Swift発表直後の感想です。)

* ほぼ、逐語訳的に置き換えていけばよいだけでした。もともとCで書かれたCore Graphicsは、Swift版が用意されていました。
* おもしろ半分で一部変数名を絵文字にしました。見た目かわいいし、読みやすい気がしないでもないです。Chrome上ではトーフになるので悲しいです。
![tofu.png](https://qiita-image-store.s3.amazonaws.com/0/2503/f3da5d2b-bf92-d6b2-34d8-31193351b2c4.png)
* クラス変数/定数がまだの件: http://stackoverflow.com/questions/24015207/class-variables-not-yet-supported
【C言語】_popenで別プログラムを実行する win7 32bit


```c:hello.c

#include <stdio.h>

int main (){

	printf("hello world 2014\n");

 	return 0;
}

```

```c:001.c

#include <stdio.h>

int main (){

    int ret=0;//
	FILE *fp=NULL;
	char *cmdline="hello.exe";

	fp=_popen(cmdline,"w");

    if(NULL == fp)
	{
	 //_pclose(fp);←ここにpcloseを書くとダメ、書くとバグ扱いになる
	 printf("file open error ! \n");
	 return 1;
	}

	_pclose(fp);

 	return 0;
}

```


##環境
OS:windows7 32bit (自作機)
コンパイラ:Borland C++ 5.5.1 for Win32

##解説
_popenで別プログラムhello.exeを実行する。
_popenと_pcloseなのは、popenとpcloseではエラーが出るからである。

```
Error: 外部シンボル '_popen' が未解決（C:\2014\0601\003.OBJ が参照）
Error: 外部シンボル '_pclose' が未解決（C:\2014\0601\003.OBJ が参照）
```

##コンパイルと実行結果
上記ソースをそれぞれ
C:\2014\0608\hello.c
C:\2014\0608\001.c
としてコンパイルして実行する。

```
c:\2014\0608>bcc32 001.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
001.c:
警告 W8004 001.c 22: 'ret' に代入した値は使われていない(関数 main )
警告 W8004 001.c 7: 'fp' に代入した値は使われていない(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\2014\0608>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\2014\0608>hello.exe
hello world 2014

c:\2014\0608>001.exe
hello world 2014

c:\2014\0608>
```

##関連
【C言語】_popenでdirコマンドを実行する win7 32bit 
http://qiita.com/kyoshiro-obj/items/b406f54d82786c2b190a
SwiftのenumでWeekdayとか書いてみたメモ


Swiftのenumには関数が定義できるようなので、ちょっと試してみた。

```swift:Weekday.swift
enum Weekday {
    case Sun, Mon, Tue, Wed, Thu, Fri, Sat
    
    func isHoliday() -> Bool {
        switch(self){
        case Sun, Sat:
            return true
        default:
            return false
        }
    }
    
    func isWorkday() -> Bool {
        return !self.isHoliday()
    }
}

var day : Weekday = .Sun
var p = day.isHoliday()
println(p) // -> true
p = day.isWorkday()
println(p) // -> false

day = Weekday.Mon // あえて、Weekday. をつけてみた。
p = day.isHoliday()
println(p) // -> false
p = day.isWorkday()
println(p) // -> true


println(Weekday.Sat.isHoliday()) // -> true
println(Weekday.Sat.isWorkday()) // -> false
println(Weekday.Wed.isHoliday()) // -> false
println(Weekday.Wed.isWorkday()) // -> true

// println(.Wed.isHoliday()) // <- こうは書けない。
```

結構おもしろい。
git logで文字化けした時の対処法

git log 文字化け とかでぐぐるとlvインストールしたり色々めんどくさい事してるけどそれ以外にも解消する方法がある。
コマンド一つでだ。

```script:ShellScript
$ sudo localedef -f UTF-8 -i ja_JP ja_JP
```

vagrantの公式サイトからcentos6.5のboxイメージを作成するとほぼ素の状態で、日本語対応なんぞしてくれてないのでgit logすると以下のように文字化けする。
![スクリーンショット 2014-06-08 3.54.52.png](https://qiita-image-store.s3.amazonaws.com/0/35451/42895bc1-eb1d-ec67-82e7-cba03fee3c30.png)

コマンドを打ったあとgit logして日本語がきちんと表示されていれば成功
yumリポジトリをローカルに設定する方法


商用環境だと、外に接続できないときがあります。
そんなときにISOイメージをyumのリポジトリとして使う方法があります。

では早速設定してみます。
動作環境は、以下の通り
Scientific Linux 6.4

### リポジトリ設定

```/etc/yum.repos.d/sl-media.repo
[sl-media]
Name=Scientific Linux $releasever $basearch Media
baseurl=file:///mnt
gpgcheck=1
enable=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-sl file:///etc/pki/rpm-gpg/RPM-GPG-KEY-sl6 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-cern
```

### IOSのマウント

```:bash
# mount -o loop /var/kvm/iso/SL-64-x86_64-2013-03-18-Install-DVD.iso /mnt/
```

### 確認

```:bash
# yum repolist
Loaded plugins: security
repo id                                      repo name                                                              status
sl-media                                     Scientific Linux 6.4 x86_64 Media                                      4,003
repolist: 4,003
```

### yum installしてみる

```:bash
# yum install sysstat
Loaded plugins: security
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package sysstat.x86_64 0:9.0.4-20.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================================================
 Package                    Arch                      Version                           Repository                   Size
==========================================================================================================================
Installing:
 sysstat                    x86_64                    9.0.4-20.el6                      sl-media                    224 k

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

Total download size: 224 k
Installed size: 807 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : sysstat-9.0.4-20.el6.x86_64                                                                            1/1
  Verifying  : sysstat-9.0.4-20.el6.x86_64                                                                            1/1

Installed:
  sysstat.x86_64 0:9.0.4-20.el6

Complete!
```
auto-completeの補完候補をorg-modeで消えなくする


auto-completeって便利ですよね。org-modeも便利ですよね。

両方、大変便利に使わせて頂いてるのですが、org-modeでファイルを編集中に折り畳んだ項目近くで補完すると補完候補が見えなくなります。
これを解決するために昔の[patch](https://github.com/auto-complete/popup-el/pull/8)を今のpopup.elに適用しました。

まだ、下のようにメニューの形が崩れてしまうバグが残っていますが、見えないよりはいいかなという感じです。
補完前
![スクリーンショット 2014-06-08 12.53.33.png](https://qiita-image-store.s3.amazonaws.com/0/7738/963820cf-fc0b-7028-5b43-4d610b56a657.png)
補完中(patch適用前)
![スクリーンショット 2014-06-12 17.47.50.png](https://qiita-image-store.s3.amazonaws.com/0/7738/5eca5d9d-1d43-5d02-4783-e020bcb9c83c.png)

補完中(patch適用後)
![スクリーンショット 2014-06-08 12.53.23.png](https://qiita-image-store.s3.amazonaws.com/0/7738/4a27b52b-f469-8c66-fd0f-261a962664ca.png)

patchを適用したpopup.elは以下にあります。
https://github.com/kenbeese/popup-el/tree/fixed-display-with-invisible-overlays

誰かメニューの形も崩れないようにしてくれないかな...
SwiftでAVFoundationを使ったカメラアプリのサンプル


SwiftでAVFoundationを使ってみた。
カメラデバイス（背面カメラ）の初期化とプレビューだけ。

## 環境

OS X 10.9.3
Xcode 6 Beta
iOS 7.1.1
iPhone 5

## 実機じゃないと動かない

背面カメラ、というかAVCaptureDviceが無いiOSシミュレーターでは"Missing Camera"と出るだけです。
こちらを参考に実機にデプロイしてください。

[iOS - Swiftアプリを実機のiPhone 5にデプロイするまでの手順 - Qiita](http://qiita.com/syokenz/items/b048dc0f03146e012036)

iPhone 5, iOS 7.1.1で動作確認済み。


## Github

https://github.com/syokenz/swift-camera-sample


## CODE

```ViewController.m
//
//  ViewController.swift
//  swift-camera-sample
//
//  Created by Shoken Fujisaki on 6/8/14.
//  Copyright (c) 2014 Shoken Fujisaki. All rights reserved.
//

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var stillImageOutput: AVCaptureStillImageOutput!
    var session: AVCaptureSession!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // Start Camera
        self.configureCamera()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func configureCamera() -> Bool {
        // init camera device
        var captureDevice: AVCaptureDevice?
        var devices: NSArray = AVCaptureDevice.devices()
        
        // find back camera
        for device: AnyObject in devices {
            if device.position == AVCaptureDevicePosition.Back {
                captureDevice = device as? AVCaptureDevice
            }
        }

        if captureDevice {
            // Debug
            println(captureDevice!.localizedName)
            println(captureDevice!.modelID)
        } else {
            println("Missing Camera")
            return false
        }
        
        // init device input
        var error: NSErrorPointer!
        var deviceInput: AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as AVCaptureInput
        
        self.stillImageOutput = AVCaptureStillImageOutput()
        
        // init session
        self.session = AVCaptureSession()
        self.session.sessionPreset = AVCaptureSessionPresetPhoto
        self.session.addInput(deviceInput as AVCaptureInput)
        self.session.addOutput(self.stillImageOutput)
        
        // layer for preview
        var previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(self.session) as AVCaptureVideoPreviewLayer
        previewLayer.frame = self.view.bounds
        self.view.layer.addSublayer(previewLayer)
        
        self.session.startRunning()
        
        return true
    }

}
```
Assignment and Copy Behavior for Arrays

SwiftではDictionary型とArray型で参照渡しなのか値渡しなのか混乱しやすそうな部分がある。

## Dictionary
Swiftの場合、多くの言語と同じようにClassやObjectが参照渡しでStructやInt,Stringなどは値がコピーされる。DictionaryはStructとして内部では実装されているらしいので値渡しとなる。例えば以下のコード

```objc
var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
var copiedAges = ages
```

Dictionaryを他の変数に代入している。ここでDictionaryは値渡しでコピーされるので`copiedAges`と`ages`は別物。

```objc
copiedAges["Peter"] = 24
println(ages["Peter"])
// prints "23"
```
実際`copiedAges`に変更を加えてもagesには影響がない。

## Array

Arrayの場合は話がもう少し複雑。ArrayもDictionaryと同じようにStructで実装されているので基本的には値渡しかと思いきや、こちらは参照が渡されてしまう。

```objc
var a = [1, 2, 3]
var b = a
var c = a

a[0] = 42
println(a[0])
// 42
println(b[0])
// 42
println(c[0])
// 42
```

何故か`b`や`c`まで変わっている。なるほどArrayの場合は参照渡しになっているのねと思いきや、そうならない場合もある。実はArrayの長さを変更するような操作を行う場合には新しいArrayが作られてしまう。

```objc
a.append(4) // <- ここで長さが変わる
a[0] = 777
println(a[0])  // <- そうするとaには新しいArrayが入るみたい
// 777
println(b[0])
// 42
println(c[0])
// 42
```

というわけでaの参照する先とb,cが参照する先は異なるようになるので値が変更されないことになる。
基本的にはArrayは参照渡しになってしまう。

## 参照を渡したくない
勝手に他の変数を通じてArrayが書き換えられるのはあまり気分のいいものではない。そこでArrayの代入を行っても別の参照を持ってくれるようにする方法がある。

```objc
b.unshare()
b[0] = 100
println(b[0])
// 100
println(c[0])
// 42
```

`unshare`を呼ぶと、bにはcと異なるArrayを持ってくれることになる。

でも個人的には`copy`を使う方がわかりやすい。

```objc
var b = a.copy()
```

とやっておくとbにはaのコピーが入る。

参照：[The Swift Programming Language -Classes and Strucures-](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_94)
Test Target の Link Error 解消



アプリの Product Name を変更すると Test target の build で link error になる．

    ld: file not found: /path/to/old-product-name.app/old-procuct-name

Test target の以下の build 設定に Link 対象が記述されているので，新しい Product Name に修正する．

* Linking -> Bundle Loader -> Debug/Release
第22回オフラインリアルタイムどう書く 上と左の合計 の実装例と若干の解題


問題 : http://nabetani.sakura.ne.jp/hena/ord22irrpas/
解答リンク集 : http://qiita.com/Nabetani/items/34bf2a05099a47e193b6
イベント : http://yhpg.doorkeeper.jp/events/11378

当日お見せした実装。
ruby です。
参加者の感想を伺うと難しかったようです。

```ruby
def find_cell( x, y, cells )
  cells.find{ |cell|
    cell[0]<=x && x-cell[0] < cell[2] && cell[1]<=y && y-cell[1] < cell[3]
  }
end

def value_impl(x, y, cells)
  return 0 if x<0 || y<0
  return 1 if x==0 && y==0
  c=find_cell( x, y, cells )
  return 1 if c && c[0]==0 && c[1]==0
  if c
    lefts = (c[0]...(c[0]+c[2])).map{ |xx|
      find_cell( xx, c[1]-1, cells ) || [ xx, c[1]-1, 1, 1, ]
    }
    tops = (c[1]...(c[1]+c[3])).map{ |yy|
      find_cell( c[0]-1, yy, cells ) || [ c[0]-1, yy, 1, 1 ]
    }
    (lefts+tops).uniq.map{ |cell |
      value( cell[0], cell[1], cells )
    }.inject(&:+)
  else
    value( x-1, y, cells ) + value( x, y-1, cells )
  end
end

def value(x, y, cells)
  @memo ||= {}
  @memo[ [x,y,cells].join("|") ] ||= value_impl( x, y, cells )
end

def solve( s )
  w,h=s.split(":").first.split("x").map(&:to_i)
  cells=s.split(":").last.split(",").map{ |x| x.chars.map(&:to_i) }
  "%02d" % ( value(w-1,h-1,cells) % 100 )
end

$stdout.sync=true
DATA.map do |line|
  num, src, exp = line.split(/\s+/)
  actual = solve( src )
  ok = actual==exp
  if ok
    puts( "ok : %s" % src )
  else
    puts( "%d %s\n   A:%s\n   E:%s\n" % [ num, src, actual.inspect, exp.inspect ] )
  end
  ok
end.all?{ |x| x }.tap{ |x| puts( x ? "Okay!" : "**NG**" ) }

__END__
0 8x6:6214,3024,5213,5022,0223,7115 32  
1 1x1:  01  
2 2x3:  03  
3 9x7:  03  
4 2x3:0021  03  
5 2x3:1012  03  
6 2x3:0022  02  
7 9x9:1177  98  
8 7x7:2354  02   
```

いつも通り、テストデータの大半は省略。

出題者としては、メモ化つき再帰 一択 という気分だったんだけど、当日メモ化つき再帰で来た方はおらず、意外だった。

上記のコードの肝を擬似コードで書くと

``` 擬似コード
value_at(cell){
  return 0 if ( cell の上端か左端のどちらかが負 )
  return 1 if ( cell が左上隅である )
  neibours := cell の 上隣と左隣のセル全部
  sum := 0
  foreach( neibour_cell in neibours ){
    sum += value_at(neibour_cell)
  }
  return sum
}

```

こんな感じ。

これだけだと膨大な時間がかかって処理が終わらないのでメモ化する。
上記の ruby で `@memo` と書いてある場所がそれ。

メモ化については
[google:メモ化再帰](https://www.google.co.jp/?q=%E3%83%A1%E3%83%A2%E5%8C%96%E5%86%8D%E5%B8%B0#q=%E3%83%A1%E3%83%A2%E5%8C%96%E5%86%8D%E5%B8%B0)
で探して下さい。
ターミナルを利用するアプリをEmacsで作るときの注意点

やりたいこと
　・GDBを使用する
　・ステップ実行をEmacs上で可視化する

使用した環境
　・Mac OS Lion
　・Emacs 24.3
　・GDB 6.3.5

アプリを作成する際にGDBを起動したターミナルとソースコードを編集するEmacsを行き来していたが，ソースが増えてくるに連れて限界に。Emacs上でステップ実行を可視化できるよう以下の環境を用意した。

[attachによるデバッグ]
ターミナルを利用するアプリを作成する際に最も気にするのが，Emacsのバッファ上だと動作が変化してしまう。このため，attachを使用する。
GDBのバージョン7以降でattachをするとエラーが発生してステップ実行できない。このため，バージョン6を使用する。また，Emacs上でGDBを起動するときは，M-x gud-gdbを使用する。M-x gdbで必須となる-i=miへの対応がバージョン6だと不十分らしく，Emacsの画面が崩れてしまう。

[実際の実行方法]
 1.開発中のアプリを実行（仮にappとする）
 2.EmacsでM-x gud-gdbを実行。このときに指定するコマンドは，
   gdb --fullname app [pid]
 3.実行されたら，ブレークポイントを用意する。countinueコマンドを使うとエディタ画面が起動して，可視的にステップ実行が可能となる。
Ruby on Rails 4 - 前のページにリダイレクト

一般的に前のページにリダイレクトするには、以下のように書く。

```rb
redirect_to :back 
```


直接URLを入力してページ移動した時にはエラーがでてうまくいかない場合があるので、application_controller.rbに、下記を追加する

***

**1.`before_filter`でリクエスト保存用のメソッド`set_request_from`が実行されるように設定しておく**

```rb:app/controllers/application_controller.rb
before_filter :set_request_from
```


**2.前のページを保存しておく用のメソッド`set_request_from`を追記する。**

```rb:app/controllers/application_controller.rb
  # どこのページからリクエストが来たか保存しておく
  def set_request_from
    if session[:request_from]
      @request_from = session[:request_from]
    end
    # 現在のURLを保存しておく
    session[:request_from] = request.original_url
  end
```


**3.前のページに戻る用のメソッド`return_back`を追記する。**

```rb:app/controllers/application_controller.rb
  # 前の画面に戻る
  def return_back
    if request.referer
      redirect_to :back and return true
    elsif @request_from
      redirect_to @request_from and return true
    end
  end
```
> ※2016年2月9日修正
> 前の画面に戻った時は`true`を返してあげる。これでコントローラー内で

```rb
return_back and return
```
> のような書き方ができる。


前のページに戻るには下記の`return_back`メソッドを使用するようにする

`request.referer`がある場合には`:back`が使用できるので、その場合のみ使用するようになっています。
スタートアップ企業ってこんな感じだよー


[Lemonade Lab, Inc.](http://lemona.de) というスタートアップ企業に転職しました。

起業して2年ほどの会社で、開発メンバーは自分も含めて5名。全体で10名位です。
サービス内容は、健康志向な人、特に走る人や自転車乗りのための[ライフログ](http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%83%AD%E3%82%B0)サービスです。
アプリは現在、オープンβといった位置づけで、ストアには出していますが次のバージョン
に向けて絶賛開発中です。

今まで [Silicon Graphics](http://www.sgi.co.jp/)、[スクウェア・エニックス](http://www.jp.square-enix.com/)、[楽天](http://www.rakuten.co.jp/) といった
そこそこ大きな企業を渡り歩いて来たので、自分の中ではちょっとした挑戦でした。

1週間ほど働いた所感をKPT風にまとめてみましたので、
他の企業の様子を知りたい人や、スタートアップで働き始めるとどんな事を感じるかなど、
参考にしていただければと思います。

## Keep
- 初コミットDone！（Keepの方に書いて良いか迷ったが、まずは第一歩と言う事で。）  
少しずつスピードあげつつ着実にコミット増やしていきたいす。。。
- 開発するのに最高な職場環境でした！具体的には、
	- 一つの部屋の中に、開発に必要な備品が全て揃っている。
	- 関係者も全員揃っていてコミュニケーションし易い。
	- 全員が会社に対する責任を直接背負っているため意識が高い。
	- コーヒー、お茶、炭酸水、水がタダで飲める。自販機がない（結構重要ですｗ）
- ConfluenceやDropboxでドキュメントを管理し、AWSでサーバ管理、  
git-flowでプログラムを共有する今どきの環境。メイン言語はpython(DJango)。  
前の職場でもConfluenceやgitは使っていたのでありがたい。
- 自分のノートPCで仕事するのは非常に効率が良い！  
（※今までは会社支給のノートPCを使っていた。）  
家でも同じ環境に向き合えるので、脳がリセットされない。
- うちのサービスの性質上、週一で職場の人達と一緒に代々木公園を走ることになっているｗ  
定期的に健康な汗をかける機会のある職場というのは非常に良い事だと思う。
- 個人的なKeepだが、先月辺りからMacをまともに使い始めた結果、、、凄くｲｲ！(・∀・)  
Windowsは3.1以降、LinuxはRedhat7.2以降から使用してきたが、  
Macには何度か移ろうとしては「Windowsの〜機能がないから。。」と諦めていた。  
今はそんな事なさそうなので、完全にマカーになれそう。時代は進歩したものだ。
- 今まで社食だったので、色々な所でお昼食べられるの楽しいｗ（お金かかるけど）

## Problem
- 当然の事だが、スタートアップには研修期間というものが存在しない。  
即戦力を期待されて入っているはずなので、スプリントの真っ最中に投入される。  
なのでちょっと焦る。（真面目な人は大変かもｗ）
- 上記の事もあり、自分の足手まとい感が半端ない。。orz  
色々と覚えるべき事が多く、予習がまだまだ足りていなかったと反省。  
特にフレームワーク構成やワークフローをキャッチアップするのに悪戦苦闘した。
- あとサービス仕様についても全然理解が足りていため、色々と質問攻めになってしまった。  
特に、メンター的な事をしていただいている方には、結構忙しい時期にも関わらず、  
かなり時間を割いてもらった気がする。。今度奢らせて貰いたいな。。
- タバコ吸う人が他にいないので、タバコ休憩が若干申し訳ない気持ちになる。。

## Try
- 今後新しく入ってくる人がすぐに開発フローに乗れるよう、  
今回で得た経験をフィードバックするような資料を作りたい。  
開発のワークフローやサービス用語をチュートリアル的に学べるような資料。
- 自分の経験を活かせるような方向に徐々に持っていく。特に、環境周りの改善提案。
- サービスについても、いくつか思うところがあるので、提案していこうと思う。
- スタートアップはとにかく人が足りないので、優秀な人材を常に求めている。  
なので、こういったOutputを少しずつ積み重ねて、人脈を呼び込んでいきたい。

## その他
という訳でTryでも書きましたが、開発メンバー募集中ですｗ
特に、アプリ(iOS/Android)開発者が足りないです！
気になった方がいましたら、hirotaka0426@gmail.com までコンタクトお願いします！！
捨てアカの作成

# いまどき言わないかｗ
捨てアカのって、いまどき古い言い方かもしれませんが、３０分だけ有効なメールアカウントを作成する方法です。買い物サイトでメールアカウントを入れたくないけど必須な場合とかに使うとよろし。

### 連絡in
[連絡in](http://renraku.in/howto_text.php) が便利
Andoroid Studioで外部ライブラリを使う　メモ

前置きはじめ
Android Studioをつかいはじめて、まず最初に戸惑ったのは外部ライブラリの使い方でした。
Eclipseの場合は、外部ライブラリを使う方法は２種類しかなく、

１　Jarファイルを直接libsの下に置く
２　AndoridLibraryプロジェクトとして参照する

この２つだけだったと思います。（ソースコードを直接入れるのは論外）

AndoridStudioの場合、１の方法は試行錯誤すれすぐわかるとおもいます。
とはいっても、これでもちょっと苦労したのだけど。この話は置いといて。

AndroidLibraryProjectを導入する方法はチンプンカンプンでした。
それに、AndroidStudioはGradleというビルドシステムがあって、それをつかうとネットワークから自動でプロジェクトあるいはライブラリをダウンロードし依存関係をみて必要なライブラリもあつめてくれるらしい。

すごい！と思いました。
だけどやり方がわからない。

自動で追加する導入方法はケースバイケースがあるため、全部が全部これでいけるという説明はしにくいです。
なので、このメモは、気が向いた時にこの場合はこの方法でやるという感じのメモになります。
前置き終わり

**[pom.xmlというファイルがはいったプロジェクト、つまりmavenプロジェクトの場合]**

導入したいプロジェクトの中にあるpom.xmlの中をみると
<groupId>com.nostra13.universalimageloader</groupId>
<artifactId>universal-image-loader</artifactId>

というタグがあります。
まずはこのartifactIdの名前で maven　リポジトリから公開されているバージョンを調べます。

例えば、このサイト

http://search.maven.org/#search%7Cga%7C1%7C

ここで、上記の例だと　universal-image-loader　この文字で検索し
でてきた結果からバージョンをメモします。
たとえば、ここでバージョンが1.9.2だということがわかったら、
AndoridStudioの、導入したいモジュールにある build.gradle の　 dependenciesタグに次のように追加記述します。

```build.gradle
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.2@jar'
compile '[groupId]:[artifactId]:[version]@jar'
```

@jarをつけとくと、AndroidManifest.xmlがぶつからないようになるようです。


編集後build.gradleをSyncするのを忘れないでください。


この情報は　 Masahiro Wakame より教えていただきました。ありがとう
The Swift Programming Language "String and Character"

The Swift Programming LanguageのLanguage Guideの"String and Characte"の章をざっとまとめたものです。
Objective-Cを始め、既に他の言語を習得されてる方向けです。

[前章 Basic Operators](http://qiita.com/hmu29/items/9c88f775211cb0507438)
[次章 Collection 配列](http://qiita.com/hmu29/items/1cb7a12c056894925567)

- String型は、Character型の連なり
- 文字コードはUnicode

# 初期化と空文字

```Swift
var emptyString = ""
var anotherEmptyString = String()

emptyString == anotherEmptyString // true
```

# String Mutability, String are Value Type.

```Swift
var str = "abc"
str += "def"
str = str + "ghi"
```

stringは値型なので、別の変数に文字列を代入すると、値コピーされる。
ただし常に値コピーをするのではなく、必要に応じて(おそらく文字列の値が変化するときに)コピーするよう最適化される。

```Swift
var a = "abc"

var b = a
a == b // true
a === b // false

a === a // ...これもfalseになってしまった
```

# Character

"一文字"がCharacterとして扱える.

```Swift
let yen:Character = "¥"
```

## for in loop

```Swift

for ch in "STRING" {
 println(ch)
}
```

# 文字列長

countElements関数を用いる。

※ ...毎回文字列探索する???

```Swift
var a = "あいうえお"
countElements(a) // 5
```

# String Interpolation(書き入れ)

Ruby での "abc#{var}" のように文字列中に値をする。
Swiftでは、\\(var)で文字列に展開する。

```Swift
let error = 3
let message = "error=\(error)" 
```

# 比較

完全一致(==)、接頭辞一致(var.hasPrefix("prefix")、末尾時一致(var.hasSuffix("suffix")を提供する.

```Swift
var test="abc def ghi"
test == "abc def ghi" // true
test.hasPrefx("abc") // true
test.hasSuffix("ghi") // true
```

# Unicode

- utf8でUInt8の連なりでUnicodeにアクセスできる
- utf16でUInt16の連なりでUnicodeにアクセスできる
- unicodeScalarsでUnicodeScalarの連なりでUnicodeにアクセスできる

```Swift
var str = "あいうえお"

for ch in str.utf8 {
  ch // Uint8の1byteコード.
}

for ch in str.utf16 {
  ch // UInt16の2byteコード
}

for ch in str.unicodeScalars {
  println("\(ch.value)") // コードとして出力
  println("\(ch)") // 文字として出力
}
```
[次章 Collection 配列](http://qiita.com/hmu29/items/1cb7a12c056894925567)
Shorthand Argument Names

SwiftではClosureを作るときに、束縛変数のエイリアスが組み込まれている。
Scalaではプレースホルダーをつかうやつ。

Closureを一番丁寧に書くとこう

```objc
let reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 < s2}
```

でも型推論にまかせて型は書かなくてもいいとして、変数自体も別に名前を付けたくない場合がある。
どうせスコープ小さいし。そういう場合には`$0`とかを使う。シェル変数みたい。

```objc
let reversed = sort(names, { $0 > $1 } )
```

これは一番目の変数が二番目の変数よりも後ろに来ますよということを表すClosure。Scalaだと`_`なので各変数は一度しか使えないけど、Swiftでは区別されているので何度も使えるみたい。

参照：[The Swift Programming language](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-XID_117)
Shorthand External Parameter Names in Swift

Swiftでは名前付きパラメタが使える。

```objc
func sayHello(name name: String, age age: Int) -> String {
    return "Hello, \(name). Are you \(age) years old?"
}

sayHello(name: "Test", age: 14)
```

でも基本的に外から見えるパラメタの名前と関数内で使う変数名は同じ場合が多いような気がするので
そういう場合は以下のように簡単に書くこともできる。

```objc
func sayHello(#name: String, #age: Int) -> String {
    return "Hello, \(name). Are you \(age) years old?"
}

sayHello(name: "Test", age: 14)
```

自動的にnameとageという名前付きパラメタを作ってくれる
UnityのSceneViewの操作

### シーンビューの操作
* ヒエラルキビューでオブジェクトを選択して「F」

### カメラの視点移動
* Alt + 左ボタンドラック　→　回転移動
* Alt + Ctrl(Command) →　平行移動
* ホイール →　ズーム
Rを使ったGitHub contribution graph「芝生」の可視化


## 草生やしていますか？

GitHubに作成したリポジトリに対して、コミットやissuesの作成などを行うとプロフィールページに表示されるcontribution↓

![contributions-private.png](https://qiita-image-store.s3.amazonaws.com/0/19462/43207385-f3e4-1c96-b288-78802beee357.png "contributions-private.png")


どこかの界隈ではこれを「草」と呼ぶみたいです（納得?）。個人的には、コミットなどの総称して「草を生やす」と言い、このcontribution graphを「**芝生**」と呼びたい。

これをGitHub以外の場所でも表示させたい時には、javascriptモジュールの[Cal-HeatMap](http://kamisama.github.com/cal-heatmap/)（[kamisama::cal-heatmap@GitHub](https://github.com/kamisama/cal-heatmap)
）を使うと楽。可視化に必要なデータは`json`, `csv`, `tsv`, `txt`に対応しています。

## 問題

1. プライベートリポジトリへのcontributionsが見えない
1. データをどこから取ってくるか
2. cal-heatmapが読み込める形式に変換

### プライベートリポジトリへのcontributionsが見えない

ログインしていると自分のcontribution graphはプライベートリポジトリへのcontributionsが表示されますが、他のユーザーからは見えません↓。プライベートリポジトリにばかり貢献している人だと、ほとんど草が生えていない状態になります。

![contributions-public.png](https://qiita-image-store.s3.amazonaws.com/0/19462/c13b721f-8264-b62f-fc27-d6a5100654ac.png "contributions-public.png")

どうせならプライベートリポジトリを含んだcontribution graphを表示させたいところです。

### データをどこから取ってくるか

GitHubから取得します。URLはprivateのcontributionsを含んだものになっています。`username`の場所はそれぞれ置換してください。

URL: `https://github.com/users/{username}/contributions_calendar_data`

### cal-heatmapが読み込める形式に変換 (with R)

先ほどのURLをcal-heatmap.jsで参照しても表示されません。cal-heatmapが読み込める形式（unix time stamp）に変換する必要があります。

変換には`R`と`jsonlite`および`httr`という２つのパッケージを使います。

ref) [Calendar Heatmap with rCharts](http://rcharts.io/viewer/?7979341#.U5OimhZLeA8)

```{r get-cal-heatmap-format-json.r}
library(jsonlite)
library(httr)
 
data1 <- fromJSON("https://github.com/users/uribo/contributions_calendar_data")
 
colnames(data1) <- c("Date", "Value")
data2 <- transform(data1, Date = as.numeric(as.POSIXct(Date)))
 
myjson <- toJSON(data2, pretty=TRUE)
cat(myjson)
 
write(myjson, "myjson.json")
```

https://gist.github.com/uribo/2b02830e809c91879578

`myjson.json`というファイルが変換したファイルになります。これを読み込むように指定します。

Enjoy!?

## ちらしのうら

もう少し賢い方法がきっとある...。

## 参考

* [Why are my contributions not showing up on my profile? · GitHub Help](https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile)
* [GitHubでいつYour Contributionに反映されるのか | tech-tec](http://tech-tec.com/archives/1011)
* [cal-heatmap](https://github.com/kamisama/cal-heatmap)
* [rChartsCalendar](https://github.com/ramnathv/rChartsCalendar)
Swift Language Guide "Basic Operators"

The Swift Programming LanguageのLanguage Guideの"Basic Operators"の章をざっとまとめたものです。
Objective-Cを始め、既に他の言語を習得されてる方向けです。

[前章 The Basics](http://qiita.com/hmu29/items/ce76da172999165358bc)
[次章 String and Character](http://qiita.com/hmu29/items/e7f2ebbb9ea3dd25171b)

※ Swift Language Guideのまとめ･･･ってすでにn番煎じみたい(汗。まぁ自分向けの整理ということでお許しを。

# 代入

- タプルへの代入が可能.
- 値を返さない

```Swift
var a = 3
let (x, y) = (1,2)

if x = y { // これはNG.
}

if x = true { // これもNG.
}

```

# 算術演算

- +,-*では、オーバーフローを検出する.
- オーバーフローを検出したくない時は、&+や&-を利用する

文字列同士も足せる.
※ 文字列+や*整数はコンパイルエラーになりました.

```Swift
var str = "Hello " + "World!"

var str2 = "123" + 456 // NG
var str3 = "abc" * 3 // NG. abcabcabcとはなってくれない...
```

# 比較演算

- == や =! はC#やJavaのようにBool型として評価される。(objective-cでは0か!0か)
- 文字列同士の比較も==,!=で行う事ができる
- 同一のオブジェクトかを比較するために===と!==が追加されている。

# Range Operators(範囲)

※ Operatorなので、rubyとは異なりRangeオブジェクトが存在するわけではない...?

## Closed Range Operator a...b

範囲にaとbを含む

for i in 1...5 {
  println("i=\(i)") // 1 2 3 4 5が出力される
}


## Half Closed Range Operator a..b

aからb-1までを含む

for i in 0..5 {
  println("i=\(i)") // 0 1 2 3 4が出力される
}

-----
[次章 String and Character](http://qiita.com/hmu29/items/e7f2ebbb9ea3dd25171b)
既存リポジトリにgit-flowを導入

### 1.git-flowインストール

Linuxなら

```bash
yum install git-flow
```

Linux(Ubunts)の場合:

```bash
bash
$ sudo apt-get install git-flow
```

Macなら

```
brew install git-flow
```
とかする。

***
### 2.事前にブランチ「develop」を作成しておく

```bash
$ git checkout master
Already on 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch develop
```

```
git checkout master
```
で、現在のブランチを「master」に合わせて

```
git branch develop
```
で、ブランチ「develop」を作成します。

***
### 3.既存リポジトリにgit-flowを導入

```bash
$ git flow init

Which branch should be used for bringing forth production releases?
   - develop
   - master
Branch name for production releases: [master]

Which branch should be used for integration of the "next release"?
   - develop
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
$
```
なんか色々聞かれますが、全部デフォルトでいいと思うので、Enterを押しておきます。

***
### 4.GitHubと連動

GitHubのIssueを作成し、そのIssue番号ごとにブランチ「feature/{issue_id}」を作成していけば、GitHubと連動することが出来ます。

なので、適当にIssueを作って
（ここではIssue番号1のIssueを作成したものとします）

```bash
git flow feature start 1
```
とかすると、ブランチ「feature/1」が作成され、これをコミット・プッシュすることにより、該当するIssue番号のfeatureブランチを作成することが出来ます。

ただし、 **実際はcommitコメントが連動するだけのようなので**（ちゃんとチェックしてませんが、動きを見ると多分そう）、コミットする際に

```
message #{issue_id}
```
という形式でコメントし、コミットしていきましょう。

例えば、Issue番号が1の場合は

```bash
git commit -m "修正内容 #1"
```
等とします。


そうすると下図のように、GitHub上のIssueにコミットごとの差分がリンクされるので、ブラウザ上でコードレビューしたり、変更点を確認したりすることが出来ます。

![xx.png](https://qiita-image-store.s3.amazonaws.com/0/40418/24a6ec17-1290-b92d-6b0c-1ca678ce026c.png)

***
※ただし、ブランチ「feature/xx」をブランチ「develop」にマージするようにプルリクエストを使って他の人に依頼する場合には、Issue番号とブランチ「feature/xx」の名前はIssue番号と合わせて作っておくのがいいでしょう。
理由としては
・「feature」ブランチに分けておかないとプルリクエストが出来ない
・番号を合わせておくと、このIssueに対するプルリクエストだよっていうのが分かる
があります。

***
### 5.developブランチにマージ

featureブランチを終了して、変更点をdevelopブランチに反映するには

```bash
git flow feature finish {issue_id}
```
というコマンドを使います。

Issue番号が1とすると

```bash
git flow feature finish 1
```
というコマンドになります。

これをすると、ブランチ「feature/1」での変更点がブランチ「develop」にマージされます。

***
### 6.developブランチをプッシュする
ブランチ「develop」にマージされたので、プッシュします。

```bash
git push origin develop
```
でブランチ「develop」の内容をプッシュすることが出来ます。

***
### 7.現在のブランチ確認
現在のブランチがどこにセットされているかは

```
git status
```
や

```
git branch
```
などのコマンドで知ることが出来ます。
Mockitoによる非同期処理のテスト

Javaのユニットテストで非同期処理をテストしたい場合、
[Mockito](https://github.com/mockito/mockito)の[VerificationWithTimeout](http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/verification/VerificationWithTimeout.html)を使うと簡潔にテストを記述できます。

例として、非同期処理`Foo#request`とそのテストコードを示します。
このテストは`Foo#request`の中で`Callback#onSuccess`が10秒以内に呼ばれることを確認します。

`timeout`メソッドが肝です。`timeout`の引数にはタイムアウト値をミリ秒単位で指定します。

```java:Foo.java
public class Foo {
	public static void request(Callback callback) {
		new Thread() {
			...
			callback.onSuccess();
		}.start();
	}
}
```

```java:FooTest.java
import static org.mockito.Mockito.*;

public class FooTest {
	@Test
	public void test() {
		Callback callbackMock = mock(Callback.class);
		Foo.request(callbackMock);

		verify(callbackMock, timeout(10000)).onSuccess();
	}
}
```

更に、`times`を指定することもできます。

```java:FooTest.java
import static org.mockito.Mockito.*;

public class FooTest {
	@Test
	public void test() {
		Callback callbackMock = mock(Callback.class);
		Foo.request(callbackMock);

		verify(callbackMock, timeout(10000).times(2)).onSuccess();
	}
}
```
GPUImageでカメラアプリ作成をはじめて１時間経過。やはりハマる


##フィルタ処理された画像を取り出すのにハマる
よーしまずは画像をセピア色にしよう！と思って、チュートリアル的なサイトを探して参考にさせていただいた。
[「蜷川実花監修カメラアプリcameranのエンジニアが教える高速フィルターカメラアプリの作り方」のレジュメを公開します](http://blog.kasajei.com/entry/2013/03/09/「蜷川実花監修カメラアプリcameranのエンジニアが教)
その他いくつかのサイトでもここを参考に、類似の実装を行っているようだし、はじめの一歩なのでさすがに簡単そうに見えた。

さくさくと進めるかと思いきや、`imageFromCurrentlyProcessedOutput`セレクタが見つからず、？？？となってしまった。

そこで、[githubのページ](https://github.com/BradLarson/GPUImage#processing-a-still-image)をきちんと読み直したら解決策を見つけた。

```objectivec
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];

[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture] //imageFromCurrentlyProcessedOutputを使うならその前にこれを呼び出す
[stillImageSource processImage];

UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; //以前はimageFromCurrentlyProcessedOutput
```

[githubのissues](https://github.com/BradLarson/GPUImage/issues/1467)や、[本家サイト](http://www.sunsetlakesoftware.com/2014/03/17/switching-gpuimage-use-cached-framebuffers)を確認してみると、

- フレームワークのメモリ利用量の削減
* メモリ関連のクラッシュ回避

などの観点から変更した模様。
この件、日本語の情報はまだ少ないな・・。


##GPUImageView は UIImageViewではない?でハマる
次に、githubのサンプルを活用してみようと、[SimpleImageFilter](https://github.com/BradLarson/GPUImage#simpleimagefilter)を弄ってみることにした。
サンプルはloadViewでGPUImageViewを初期化しているが、自分はstroyboardでUIImageViewを使ってプレースホルダ画像を活用したいと思っている。
しかし、下記の実装だと実行時エラーが出てしまう。


```objectivec
    /***
      ここで登場するself.imageViewはstoryboardにて接続したUIImageViewのこと。
     実装は、UIViewControllerのviewDidLoad内の処理。
    ***/

    //GUIで設定した画像を取得する
    UIImage *inputImage = nil;
    inputImage = self.imageView.image;

    //画像をGPUImageのフォーマットに変換する
    GPUImagePicture *sourcePicture;
    sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];

    //セピアフィルターを作る
    GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
    GPUImageView *theImageView = (GPUImageView *)self.imageView; //キャストしてるんだけど・・。
    [self.sepiaFilter forceProcessingAtSize:theImageView.sizeInPixels];

    //ターゲット設定する
    [sourcePicture addTarget:sepiaFilter];
    [self.sepiaFilter addTarget:theImageView]

    //フィルターを実行
    [sourcePicture processImage];
```
エラーログの一部はこのような感じで、キャストしているんだけどGPUImageVIewのアクセサメソッドが認識されないようだ。ログを見れば`[UIImageView sizeInPixels]`とあり、確かにこの文字列だけ見たら通らないな、とは思うのだけど・・。

```log
-[UIImageView sizeInPixels]: unrecognized selector sent to instance ...
```

直接関係ないが、 http://stackoverflow.com/a/23747248 にライブラリ作者様のコメントがある。
>GPUImageView is not a subclass of UIImageView.

今回の件は、サブクラスではないけど一応ダウンキャスト（サブクラスへのキャスト）としてコンパイルできるものの、結局は定義していないメソッドの実行箇所で落ちる、ということだろうか。
そもそもダウンキャスト自体が危険なアプローチになることが多いらしいので注意が必要だ。
カメラアプリの開発を進める中で、もう少し深堀できると良い。
第15回オフラインリアルタイム どう書くの問題をpythonで解いてみた

どう書くの問題
https://codeiq.jp/magazine/2013/11/1559/

```python
d = {'1011':'L', '1110':'R', '0111':'J', '111010':'T', '101111':'U', '111101':'N', '011110':'S', '110011':'Z'}
def f(s1, s2, s3):
    t1, t2 = [bin(int(s, 16))[2:].rjust(32, '0') for s in (s1, s2)]
    r = []
    while t1:
        for i in [3, 2]:
            c = d.get(t1[:i] + t2[:i], None)
            if c:
                r.append(c)
                t1, t2 = t1[i - 1:], t2[i - 1:]
                break
        t1, t2 = t1[1:], t2[1:]
    return s3 == ''.join(r)
all([f(*s.split('/')) for s in """
2ed8aeed/34b0ea5b/LTRSUNTSJ
00000200/00000300/L
00018000/00010000/R
00002000/00006000/J
00000700/00000200/T
01400000/01c00000/U
00003800/00002800/N
000c0000/00180000/S
00003000/00001800/Z
132eae6c/1a64eac6/LRJTUNSZ
637572d0/36572698/ZSNUTJRL
baddb607/d66b6c05/LTJZTSSSN
db74cd75/6dac6b57/ZZZTJZRJNU
3606c2e8/1b0d8358/ZZSSLTJ
ad98c306/e6cc6183/UZZZZZZ
4a4aaee3/db6eeaa6/JJLLUUNNS
ecd9bbb6/598cd124/TSSZZTTRR
e0000002/40000003/TL
a0000007/e0000005/UN
c0000003/80000006/RS
40000006/c0000003/JZ
01da94db/00b3b6b2/TSUJLRSR
76eeaaea/24aaeeae/TRNNUUNU
1dacaeee/1566e444/NRJZUTTT
26c9ac60/6c6d66c0/JSZLRJZS
6c977620/36da5360/ZZLLTNZJ
069aeae6/0db34eac/SJSLTUNS
06d53724/049da56c/RRULRNJJ
069b58b0/04d66da0/RLRSLZJR
1b6eced4/11b46a9c/RZZTZNRU
522e8b80/db6ad900/JLLJNLJT
6546cdd0/376c6898/ZULSZRTL
4e6d5b70/6ad9d620/LNSSURST
37367772/65635256/SNSZNTNJ
25535d58/377669cc/LUUSLTUZ
0ae6a55d/0eacedcb/UNSUJUTJ
76762edc/23536a88/TZNZJNRT
""".strip().split('\n')])
```
便利なnode.jsモジュール - parse-rss

## Summary
便利なモジュールをメモがてら簡単な使い方を交えて紹介していきます。

## How to use
```
$ npm install parse-rss
```

```coffeescript
parser = require 'parse-rss'
parser "http://rss的な何か", (err, res)=>
            if err        
                console.log err
                return
            for value in res
                console.log res
```
ライブラリ自体もCoffeeScriptで書かれています。
仕組みとしては内部でrequestとfeedparserをラップしているだけです。
自分で実装しても良いですが、手間が少し省けます。
Swiftの名前空間は暗黙的、アクセス制限修飾子は将来追加されるかも

### 名前空間
> 「Swiftにおいて名前空間は暗黙のうちに提供される。すべてのクラスはそのモジュール (Xcode上のターゲット)によって暗黙のうちにスコープが制限される。クラスプレフィックスはもはや不要」
原文: Namespacing is implicit in swift, all classes (etc) are implicitly scoped by the module (Xcode target) they are in. no class prefixes needed 
https://twitter.com/clattner_llvm/status/474730716941385729 (Swiftの作者 Chris Lattnerのツイート)

### アクセス制限修飾子 (public, private, etc..)
現状public, privateなどの予約語は存在しない、しかし

> Apple Developer ForumsでAppleのエンジニア曰く
> 「将来の約束は一般的にしてないんだけど、今回は例外。Swiftにはアクセス制限のための仕組みを追加予定です」とのこと
原文: "We don't usually promise anything for the future, but in this case we are making an exception. Swift will have access control mechanisms."
情報元: http://stackoverflow.com/questions/24003918/does-swift-have-access-modifiers
MariaDBのParallel Replicationの粒度

ざっくりとしたメモ

マスターとスレーブが1:1の場合はテーブル単位での粒度で並列化を行う
仕組みとしてはグループコミットをcidを利用して、同じcid内だったらお互いに競合しないから異なるワーカースレッドによって並列化する。
違うcidだったら（テーブル内の同じ行を更新したり）競合する可能性があるので順番待ちする、という戦略


マルチソースレプリケーション等を行う場合はGTIDを用いて並列化する。
GTIDの最初のブロックであるdomain IDを見て、domain IDの粒度で並列化を行う。
あちらのサーバのDBにdomain id1を割り当てて、こちらのサーバのDBにdomain id2を割り当てると
domain id1内で行われたトランザクションの順序(e.g. T1->T2->T3)と
domain id2内で行われたトランザクションの順序(e.g. T4->T5->T6)は保つが
双方のレプリケーション適応は任意の順で挟まれた形で適応される（e.g.1  T1->T2->T4->T5->T3->T6,  e.g.2 T1->T4->T5->T2->T6->T3）

どちらにしてもeventual consistencyなので必ず最新のデータにアクセスしたいならマスターにアクセスが必要


MySQL5.6のslave-parallel-workersの設定で並列化される粒度はDB毎なのでテーブル単位での並列化は行えない
Re: 境界線分 〜 横へな 2013.12.7（第16回オフラインリアルタイムどう書く）

第16回オフラインリアルタイムどう書くの問題だそう。

http://nabetani.sakura.ne.jp/hena/ord16boseg/

こんな感じ。
富豪感ある。

```rb
#! /bin/env ruby
=begin
http://nabetani.sakura.ne.jp/hena/ord16boseg/
6×6のマス目を白と黒で塗り分ける。
白と黒の境界に線を引く。線は折れ線なので、線分の集まりだ。
線分の長さは1〜6の6通りが考えられる。
それぞれ何本ずつあるか、数えよ。 

線分を抽出する
060276724276

緑の線が、境界線。境界線を構成する線分は、
長さ 1 の線分が 6 本、 長さ 2 の線分が 2 本、 長さ 3 の線分が 1 本、 長さ 4 の線分が 1 本、 長さ 5 の線分が 0 本、 長さ 6 の線分が 1 本、
となっているので、 6,2,1,1,0,1 を出力すればよい。 

入力と出力

入力は、12桁の8進数。最初の2桁が最初の行、次の2桁が次の行、と続く。
上図では。
一番上の行の左3マスは真っ白なので、入力の最初の桁は0。
一番上の行の右3マスは、黒黒白。2進数で 110 。8進数にすると 6 なので、入力の二桁目は6になっている。
12桁になるように、必要に応じてゼロが詰めてある。
060276724276 こんな感じ。

出力は 6,2,1,1,0,1 こんな感じで、長さ1から長さ6までの線分が何本あるかをコンマでつなげたもの。こちらは10進数。 
=end

class Ord16

  def initialize(inf)
    bin=inf.scan(/../).map(&:oct)
    # bitmapに変換
    bin.map! do |line|
      ret = []
      6.times{|i| ret.unshift(line & (1 << i) != 0)} 
      ret
    end
    # eachで回すのにtransposeが欲しかった。イマイチ。
    @vbin = bin.map{|l| boundry(l) }.transpose
    @hbin = bin.transpose.map{|l| boundry(l) }.transpose
  end

  def put
    # 縦横別に数える
    ret = @vbin.inject({}){|ret,b|count(ret,b)}
    ret = @hbin.inject(ret){|ret,b|count(ret,b)}
    str = ''
    (1..6).each do |i|
      str += (ret[i]||0).to_s + ','
    end
    puts str.chop
  end

  private

  # 境界を検出する(0<->1)の部分を1とする
  def boundry(l)
    b = []
    (l.size-1).times do |i|
      b.push(l[i]!=l[i+1] ? 1 : 0)
    end
    b
  end

  # 1行中の境界線分を数える
  def count(ret,b)
    # Array::chunkは便利(String::splitみたいなもの)
    b.chunk{|i|!i.zero?}.find_all{|k,v| k}.map do |a|
      ch = a[1]
      ret[ch.size] ||= 0
      ret[ch.size] += 1
    end
    ret
  end
end


if $0 == __FILE__
  o = Ord16.new(ARGV[0])
  o.put
end
```
外付けキーボードを接続したときだけ MacBook の内蔵キーボードを無効化する


最近 [HHKB Professional 2](http://www.amazon.co.jp/gp/product/B000EXZ0VC?tag=skagawa-22) を買いました。音が何とも言えずいいですね。

最初は MacBook の前やトラックパッドの上に置いて使っていましたが、トラックパッドが使えなくなるためマウスも必要になり、何かと不便です。

そこで、外付けキーボードを内蔵キーボードの上に置けないかと考えました。しかし、ただ置くだけだと外付けキーボードが下のキーを押してしまって問題です。

この記事では [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) というソフトを使って、外付けキーボードを接続したときだけ内蔵キーボードを無効化します。以前は [ControlPlane](http://www.controlplaneapp.com/) と `kextunload`/`kextload`を使って行う方法を紹介していましたが、新しい Macbook では動かないことと Karabiner を使った方法の方が圧倒的に簡単なため改めました。

## Karabiner の設定

[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) は、Macbook のキーマッピングを自由自在にカスタマイズできるソフトです。例えば日本語配列のキーボードを US 配列に置き換えたりとか、Vim で ESC を押した時に IME をオフにしたりとか。入れて損はない優れ物です。

その Karabiner に、まさにやりたいことそのままの設定がありました。Karabiner の設定画面で「internal keyboard」と検索して出てくる「Disable an internal keyboard while external keyboards are connected.」という項目です。このチェックボックスをチェックするだけ。

![Screen Shot 2015-08-15 at 9.21.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3732/53a7dc6a-d3e4-5fc2-abc8-294c6e1e0b03.png)

簡単ですね！

## おわり

以上の設定で、外付けキーボードをつなぐと内蔵キーボードが無効化され、外すと有効化されるようになったはずです。これで、外出先でキーボードが使えずログインできない！ということもなくなりますね。

MacBook の前にキーボードを置いていた時に比べて、省スペースでだいぶ快適になりました。

## おまけ

[L 型の mini USB アダプタ](http://www.amazon.co.jp/gp/product/B002RPJ106?tag=skagawa-22)があると、写真のようにケーブルを綺麗におさめられておすすめです。

![IMG_1898.JPG](https://qiita-image-store.s3.amazonaws.com/0/3732/f98e46db-0da4-ccd1-573e-b25b3f70d9e5.jpeg "IMG_1898.JPG")