OmniAICreator/Qiita-1.07M huggingface dataset:
iOS アプリのステータスバーに現在のブランチ名を表示する

=============================================

あれこれブランチを切り替えながらひたすら[アプリ](https://itunes.apple.com/jp/app/voice-droplet/id597143085?mt=8)のバグの再現テストをしていると、いまどのブランチのコードを実行しているんだっけ？　と分からなくなりわりと焦ります。そこでステータスバーにブランチ名を常時表示させることにして、脳みその負荷をちょこっと下げてみます。

![status bar ss](http://f.cl.ly/items/283P403m2t3h0u2x1m1Z/branch_statusbar_ss.png)

Xcode にスクリプトを追加する
------------------------

メニューから Editor -> Add Build Phase -> Ad Run Script Build Phase を選び、アプリのターゲットに新しい `Run Script` を追加します。

![xcode ss](http://cl.ly/image/3z3q383c2p3Z/branch_statusbar_xcode1.png)

次のようなコードを書いて Branch.h を生成するようにします。場所はお好みで。

```bash:run_script
branch_file="${SRCROOT}/path/to/Branch.h"
branch=`git branch | grep '^\*' | cut -b 3-`
echo -n '#define CURRENT_BRANCH @"' > $branch_file
echo -n $branch >> $branch_file
echo '"' >> $branch_file
```

ただし！　スクリプトはコードがコンパイルされる**前に**実行されないといけないので、ドラッグ＆ドロップで必ず `Compile Sources` フェーズの上に持ってきます。

![xcode ss](http://cl.ly/image/2p0z3A11462j/branch_statusbar_xcode2.png)

ついでに .gitignore にも追記しておくとよいでしょう。

```plain:.gitignore
path/to/Branch.h
```

KGStatusBar を導入する
--------------------

github から [KGStatusBar](https://github.com/kevingibbon/KGStatusBar) のソースをダウンロードしてプロジェクトに取り込んでおきます。

	git clone https://github.com/kevingibbon/KGStatusBar.git

表示用のコードを書く
-----------------

プロジェクトに Branch.h を追加して、次のようなコードをどこかに書いておきます。

```objectivec:AppDelegate.m
#import "Branch.h"
#import "KGStatusBar.h"

- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {    
	...
#ifdef DEBUG
	[[[KGStatusBar alloc] init] showWithStatus: CURRENT_BRANCH barColor: [UIColor grayColor] textColor: [UIColor whiteColor]];
#endif
	...
}
```

ついでにバージョン番号も表示する例です。

```objectivec:
	NSString *statusString = [NSString stringWithFormat: @"%@ (%@)", CURRENT_BRANCH, [[[NSBundle mainBundle] infoDictionary] objectForKey: @"CFBundleShortVersionString"]];
	[[KGStatusBar sharedView] showWithStatus: statusString barColor: [UIColor grayColor] textColor: [UIColor whiteColor]];

```

まとめ
-----

* Run Script フェーズを利用してコンパイル前に最新の Branch.h を作る
* KGStatusBar を使ってお手軽に表示する
Skypeで通話開始のショートカットを無効化する

# 通話開始のショートカット
Skypeではデフォルトで Ctrl + R に通話開始のショートカットが割り当てられてます。
通話をよく使うユーザーにとっては便利なのでしょうが、
チャットメインで使っていると、チャット画面でこれを押した途端
Skypeの通話がスタートしてしまいます。
グループチャットの場合でも同様に通話が始まり、
グループ全員の画面に着信のポップアップがあらわれます。
通話する目的がない場合、かなりのテロ行為になってしまいます。

# ショートカットを無効化する
Ctrl + R というショートカットはブラウザではリロードに割り当てられているので、
開発中などWebページをリロードしたつもりが、Skypeにフォーカスがあたっていて、
グループ全員に着信テロを起こす、みたいな事がしばしば発生してしまいました。
これを防ぐためにはショートカットを無効にするしかありません。

### ショートカットが設定にない
Skypeの設定を見てみたところ、ショートカットの変更的なものはあったのですが、
肝心の発信(Ctrl + R)のショートカット変更が見当たりませんでした。
※ ツール　→　設定　→　詳細　→　ショートカット

｢ショートカットを有効化｣というチェックボックスを外してもCtrl Rは無効化されません。

### 苦肉の無効化
打つ手なしかと思いましたが、苦肉の策をみつけました。
それは使わないショートカットで上書きするという策です。
基本通話系の機能は使わないので、試しに

```
変更可能な｢ミュートにする｣ショートカットに Ctrl + Rを割り当て
```
てみたところ、無事発信のショートカットを上書きして無効化できました。

これで誤爆テロを心配する必要がなくなりました。
めでたしめでたし
time.Timeから日付だけを取り出す

現在時刻から日付だけを取り出す(今日の0:00)を作りたい時の話です。

# Truncate()を使う
Time型にはTruncateメソッドが用意されていて、指定した大きさ以下の時刻を切り捨ててくれます。
>
**func (t Time) Truncate(d Duration) Time**
Truncate returns the result of rounding t down to a multiple of d (since the zero time). If d <= 0, Truncate returns t unchanged.

これに1日(24時間)を指定すれば簡単に日付を取り出せる気がします。

```go:truncate1.go
package main

import (
        "time"
)

func main() {
        t, _ := time.Parse( time.ANSIC, "Fri Feb 7 13:58:00 2014" )
        println(t.Truncate( 24 * time.Hour ).Format(time.ANSIC))
}
```

```shell-session:output(truncate1.go)
Fri Feb  7 00:00:00 2014
```

上手く行っているように見えますが、これはあまりおすすめしません。なぜなら、

```go:truncate2.go
package main

import (
        "time"
)

func main() {
        t := time.Now()
        println(t.Truncate( 24 * time.Hour ).Format(time.ANSIC))
}
```

```shell-session:output(truncate1.go)
Fri Feb  7 09:00:00 2014
```

こんな感じでタイムゾーンがUTCで無い時は時差分が残ってしまうからです。(Now()はLocationとして"Local"、Linuxの場合は/etc/localtimeを持ちます。Parse()はUTCになります。)
他のメソッドと違い、Truncateはタイムゾーンを考慮してくれないんですね。これは実装のdiv()あたりを読むとそんな感じになっていることがわかります。

# Add()を併用する
そんな訳で、こんな感じにしないと上手く行きません。

```go:truncate3.go
package main

import (
        "time"
)

func main() {
        t := time.Now()
        t = t.Truncate( time.Hour ).Add( - time.Duration(t.Hour()) * time.Hour )
        println(t.Format(time.ANSIC))
}
```

Hourはタイムゾーンを意識した値が帰るので、これを併用すれば意図通りに時刻を切り捨てることが出来ます。

Timeはタイムゾーンとあわせて抽象化したオブジェクトだと理解しているので、出来ればTruncateもUNIXタイムで単純に計算するのではなくてタイムゾーンを意識して動いて欲しい気もします。個人的には。
CygwinでのEmacsの表示が崩れる（一行ずれるとか）場合はTERMを変える

CygwinでのEmacsの表示が崩れる（一行ずれるとか）場合はTERMを変える

Cygwin上でのEmacsで表示が崩れる（一行ずれるとか）は、
TERMがcygwinになっているのが原因かもしれない
その場合はTERMを xterm とか xterm-256color にすると治る

ただ、Cygwinのvimは逆にTERMがcygwinじゃないと表示が崩れるので、TERMをcygwinから変えたくない場合には、

```
alias emacs='TERM=xterm-256color /usr/bin/emacs'
```

みたいにaliasを作ってしまおう（もちろん逆もあり）
Ubuntuサーバー管理チートシート

Ubuntu 12.04LTS を使いながら調べたことをメモしてます。

# ユーザーの追加や削除
## ユーザー追加
```bash
$ sudo adduser USER
```

`useradd` というコマンドもあるが、こちらだとオプションで指定しないとホームディレクトリや `.bashrc` などが作られない。

## ユーザー削除
```bash
$ sudo userdel -r USER
```
`-r` はホームディレクトリとメールスプールも削除するオプション。

## ユーザーをサブグループに追加

```bash
$ sudo gpasswd -a USER GROUP
```

`usermod -G GROUP USER` は危険なので使わない。[(参考)](http://d.hatena.ne.jp/hirokiky/20120218/1329546810)

## 管理ユーザーを追加する

```bash
$ sudo adduser NEWADMIN
$ sudo gpasswd -a NEWADMIN sudo
$ sudo gpasswd -a NEWADMIN adm
$ sudo gpasswd -a NEWADMIN admin
```

## ログインできないユーザーを追加する
```bash
$ sudo useradd -s /bin/false
```

一般ユーザーとして使われない特殊なユーザーを作りたい場合は /bin/false をログインシェルに指定する。

# パスワードなしで sudo
`/etc/sudoers` を書き換えるのだが、普通に vi とかで書き換えると危険なので `visudo` を使う。[(参考)](http://d.hatena.ne.jp/LukeSilvia/20080716/p1)

```bash
$ sudo EDITOR=vi visudo
```

`admin` グループに属すユーザーがパスワードなしで sudo できるようにするには、こんな感じで書き換える。

```
# Members of the admin group may gain root privileges
%admin ALL=(ALL) NOPASSWD:ALL
```

# パッケージ
## パッケージリストの更新
```bash
$ sudo apt-get update
```

## パッケージのインストール
```bash
$ sudo apt-get install PACKAGENAME
```

## パッケージのアンインストール
```bash
$ sudo apt-get remove PACKAGENAME
```

## パッケージの検索
正規表現で検索できる。

```bash
$ sudo apt-cache search REGEX
```

## パッケージの情報表示
```bash
$ sudo apt-cache show PACKAGENAME
```

## どのバージョンがインストールされるか知りたい
```bash
$ sudo apt-cache policy PACKAGENAME
```

## インストール済みパッケージのリスト表示
```bash
$ dpkg -l
```

## インストール済みパッケージに含まれるファイルを表示
```bash
$ dpkg -L PACKAGENAME
```

## パッケージファイル(*.deb)に含まれるファイルを表示
```bash
$ dpkg -c DEBFILENAME
```

インストールしたパッケージの *.deb は `/var/cache/apt/archives` にキャッシュされている。

# サービスの状態表示
```bash
$ sudo service --status-all
```

upstart という仕組みで管理されているサービスの状態は次のコマンドで。

```bash
$ sudo initctl list
```

# ホスト名の変更
`/etc/hostname` と `/etc/hosts` を変更して再起動。
再起動しない方法はわからない。

# ネットワーク設定(静的IP,DNSサーバー,ルーティングの設定)
`/etc/network/interfaces` に書く。
`post-up` を使うと任意のコマンドを実行できるので、ルーティング設定はそれでしている。

```
# とあるNIC2枚挿しサーバーの設定例

# The loopback network interface
auto lo
iface lo inet loopback

# LAN
auto eth0
iface eth0 inet static
    address 192.168.17.10
    network 192.168.17.0
    netmask 255.255.255.0
    dns-nameservers 192.168.1.1  # 使用するDNSサーバー名
    dns-search example.org       # DNSサフィックス
    post-up route add -net 192.168.0.0/20 gw 192.168.17.253 # ルート設定

# WAN
auto eth1
iface eth1 inet static
    address 192.168.16.10
    network 192.168.16.0
    netmask 255.255.255.0
    gateway 192.168.16.253
```

書き換えたら、ネットワークを再起動する。

```bash
$ sudo ifdown -a
$ sudo ifup   -a
$ sudo service resolvconf restart    # /etc/resolv.conf に反映
```

ssh でリモートからネットワークを再起動したいときは、こんな感じでできる。

```bash
sudo nohup sh -c "ifdown -a; ifup -a"
```

失敗するとマシンの場所までいかないと復帰できなくなる。

# タイムゾーンの設定
`/etc/localtime` というファイルがタイムゾーンの設定らしい。[(参考)](http://blog.designrecipe.jp/2011/06/04/ubuntu-initial-setup-locale-timezone/)

```bash
$ ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

GUIもどきでやるなら次のように。

```bash
$ sudo dpkg-reconfigure tzdata
```
通信テストしたいときのワンライナー

さくっと通信テストしたいときのワンライナー

HTTP

```bash
$ while true; do echo `date +%X`" | "`curl -s http://127.0.0.1/`; sleep 1; done
```

PING

```bash
$ while true; do echo `date +%X`" | "`ping -c 1 127.0.0.1`; sleep 1; done
```

他にあれば追記していく
Prevent Private Gem Being Published to RubyGems.org

Usually we make gems with Bundler like `bundle gem` or `rails plugin new`. Bundler provides several useful rake tasks, including `rake release` to publish it to RubyGems.org. 

This is good for Open Source gems, but when you're building a gem for private use only, it would be very bad if you accidentally release it to RubyGems.org: you cannot remove it immediately, instead you can only "yank" it from the index, and you have to ask the admin to remove it completely.

["Yank"](http://help.rubygems.org/kb/gemcutter/removing-a-published-rubygem) only removes it from index, so that others cannot find it anymore, but if any other existing gems depends on it, it can still be installed, which means that the package is still on RubyGems.org and is downloadable. I did once released a private gem to RubyGems.org accidentally, and it took 2 months until it was pulled down since I sent a removal request.

So can we prevent it being published to RubyGems.org? Yes. Starting from [Bundler 1.3.0](https://github.com/bundler/bundler/blob/master/CHANGELOG.md#130pre3-dec-21-2012) there is a `gem_push` environment variable you can use. Set it to falsy *string* and the gem won't be published onto RubyGems.org:

```rb
# Add this line at the top of Rakefile in your gem
ENV['gem_push'] = 'off' # Never Push to Rubygems
```

Note: I tried setting it to `false` (boolean lexical value) but it didn't work; the error message would be "no implicit conversion of false into String."
PHPのパッケージ管理システム Composerをインストールする


次のコマンドでインストール

```shell
curl -sS https://getcomposer.org/installer | php
```

ダウンロードされたファイルを、簡単にコマンドが打ち込めるように移動。

```shell
sudo mv composer.phar /usr/local/bin/composer
```

これで、次のコマンドで起動できる

```shell
composer ...
```

- [Composer](https://getcomposer.org/)
monitで手軽にプロセスの監視を行う


今回の記事はUbuntuでの設定を想定しています。
他の環境をお使いの方は適宜読み替えてください。 
## インストール  

````sh
$ sudo aptitude install monit
````


## monitの設定

/etc/monit/monitrcにて監視タイミングなどの設定を行います。

#### 監視の実行タイミング

監視を行う間隔を秒単位で設定します。

```/etc/monit/monitrc
set daemon 120
```

#### ログの出力先

syslogなどにも出力できるそうですが、とりあえず別ファイルに。

````/etc/monit/monitrc
set logfile /var/log/monit.log
````

#### アラートメールを送信するときに使用するSMTPサーバ

````/etc/monit/monitrc
set mailserver localhost
````

#### アラートメールのフォーマット

フォーマットには変数も埋め込めます。詳細は公式サイトでご確認ください。

```/etc/monit/monitrc
set mail-format {
      from: monit@$HOST
   subject: monit alert --  $EVENT $SERVICE
   message: $EVENT Service $SERVICE
                 Date:        $DATE
                 Action:      $ACTION
                 Host:        $HOST
                 Description: $DESCRIPTION

            Your faithful employee,
            Monit
 }
```

#### アラートメールの送信先

下記のように複数行で設定することでアラートメールの送信先を複数設定できます。

```/etc/monit/monitrc
set alert admin@foo.bar
set alert operator@foo.bar
set alert alert@foo.bar not on { INSTANCE }
```

メールアドレスの後ろに`not on { INSTANCE }`をつけると、monitの設定変更などの通知がこなくなります。

#### 監視項目の読み込み

監視項目は別ファイルにしておいた方が管理がしやすいので。

```/etc/monit/monitrc
include /etc/monit/conf.d/*
```


## 監視項目の設定

/etc/monit/conf.d配下に監視項目を定義したテキストファイルを置いていきます。

#### Unicornのプロセス監視を行う場合

ただしunicornは`/etc/init.d/unicorn`という名前でinitスクリプトが作成されているものとします。

```/etc/monit/conf.d/unicorn
check process unicorn
  with pidfile /path/for/pids/unicorn.pid
  start program = "/bin/sh -l -c '/etc/init.d/unicorn start'"
  stop program = "/bin/sh -l -c '/etc/init.d/unicorn stop'"

  group unicorn
```

## 参考にしたサイト

http://mmonit.com/monit/
http://shanon-tech.blogspot.jp/2011/11/15monit.html
http://blog.twiwt.org/e/232155
http://ex-cloud.jp/techblog/?p=28
プロセスに紐付いたttyを取得する

現在の端末デバイス名（/dev/pts/1とか）を取得するには通常は`tty`というコマンドで探せるが、これはあくまで現在入力中プロセスの端末名しか取得できない。つまりスクリプト内などで起動元プロセスの端末名を取得するのには使えない。

なので自分で親プロセスを辿ってttyを探すスクリプトを作ってみた。

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

# プロセスに紐付いたttyを取得する https://qiita.com/kawaz/items/bd33fe1e29876939dddb
function search_tty() {
  local pid=${1:-$$} tty=""
  while [[ 1 -lt $pid ]]; do
    [[ -d /proc/$pid/fd ]] || break
    tty=$(readlink /proc/$pid/fd/1 2>/dev/null | awk '{print $1}')
    [[ -c $tty ]] && { echo "$tty"; return 0; }
    pid=$(perl -pe 's/\(.*\)/()/' /proc/$pid/stat | awk '{print $4}')
  done
  return 1
}

search_tty $1
```

これは第1引数に指定されたプロセスIDに紐付いたttyを探すスクリプトです。
PIDが渡されなかった場合は現在のプロセスIDを元にttyを探します。
他でコピペ利用しやすいようBash関数にしてからに実行してます。


# 利用例
- [Linux - 既存プロセスの標準出力と標準エラーを奪う - Qiita [キータ]](http://qiita.com/kawaz/items/96af6fa59fdf999b94bd)
UIView.frame 用の便利カテゴリ

# 概要

例えば frame 幅を10にしたいとき、

```objc
CGRect rect = view.frame;
rect.size.width = 10;
view.frame = rect;
```
という毎回のお約束がたるいので、それを1行で書けるようにするカテゴリを作りました。
bounds はあまりいじらないと思うので対応しません。

https://gist.github.com/usagimaru/31ae16e943995a8d3abd

# 使い方

次のような感じに書けるようになります。

```objc
view.x = 10;
[view setX:10];
view.y = 20;
[view setY:10];

view.width = 100;
view.height = 200;

view.size = CGSizeZero;
[view setSize:CGSizeZero];

view.xRelative = -4;
view.heightRelative = 50;
```

UIViewAnimation Block 内でも使えます。

# UIView+ViewFrame

setter と getter がプロパティに対応するように実装するだけです。
具体的には `-setHoge:` `-hoge` の対です。

```objc:.h
@interface UIView (ViewFrame)

// frame.origin を取得
- (CGPoint)origin;
- (CGFloat)x;
- (CGFloat)y;

// frame.size を取得
- (CGSize)size;
- (CGFloat)width;
- (CGFloat)height;

// frame.origin を設定
- (void)setOrigin:(CGPoint)p;
- (void)setX:(CGFloat)x;
- (void)setY:(CGFloat)y;

// frame.size を設定
- (void)setSize:(CGSize)s;
- (void)setWidth:(CGFloat)w;
- (void)setHeight:(CGFloat)h;

// frame.origin を相対的に設定
- (void)setOriginRelative:(CGPoint)p;
- (void)setXRelative:(CGFloat)x;
- (void)setYRelative:(CGFloat)y;

// frame.size を相対的に設定
- (void)setSizeRelative:(CGSize)s;
- (void)setWidthRelative:(CGFloat)w;
- (void)setHeightRelative:(CGFloat)h;

@end
```

```objc:.m
@implementation UIView (ViewFrame)

- (CGPoint)origin
{
	return self.frame.origin;
}
- (CGFloat)x
{
	return self.origin.x;
}
- (CGFloat)y
{
	return self.origin.y;
}

- (CGSize)size
{
	return self.frame.size;
}
- (CGFloat)width
{
	return self.size.width;
}
- (CGFloat)height
{
	return self.size.height;
}

// frame.origin を設定
- (void)setOrigin:(CGPoint)p
{
	CGRect r = self.frame;
	r.origin = p;
	self.frame = r;
}
- (void)setX:(CGFloat)x
{
	CGRect r = self.frame;
	r.origin.x = x;
	self.frame = r;
}
- (void)setY:(CGFloat)y
{
	CGRect r = self.frame;
	r.origin.y = y;
	self.frame = r;
}

// frame.size を設定
- (void)setSize:(CGSize)s
{
	CGRect r = self.frame;
	r.size = s;
	self.frame = r;
}
- (void)setWidth:(CGFloat)w
{
	CGRect r = self.frame;
	r.size.width = w;
	self.frame = r;
}
- (void)setHeight:(CGFloat)h
{
	CGRect r = self.frame;
	r.size.height = h;
	self.frame = r;
}

// frame.origin を相対的に設定
- (void)setOriginRelative:(CGPoint)p
{
	CGRect r = self.frame;
	CGPoint point = r.origin;
	point.x += p.x;
	point.y += p.y;
	r.origin = point;
	self.frame = r;
}
- (void)setXRelative:(CGFloat)x
{
	CGRect r = self.frame;
	CGPoint point = r.origin;
	point.x += x;
	r.origin = point;
	self.frame = r;
}
- (void)setYRelative:(CGFloat)y
{
	CGRect r = self.frame;
	CGPoint point = r.origin;
	point.y += y;
	r.origin = point;
	self.frame = r;
}

// frame.size を相対的に設定
- (void)setSizeRelative:(CGSize)s
{
	CGRect r = self.frame;
	r.size.width += s.width;
	r.size.height += s.height;
	self.frame = r;
}
- (void)setWidthRelative:(CGFloat)w
{
	CGRect r = self.frame;
	r.size.width += w;
	self.frame = r;
}
- (void)setHeightRelative:(CGFloat)h
{
	CGRect r = self.frame;
	r.size.height += h;
	self.frame = r;
}

@end
```
Scalaで"\\server\directory" 形式のpathを "smb://server/directory" に変換してみる


Windowsのネットワーク上にあるフォルダにアクセスするときの、\\\\server で始まるパスはMacだと使えないので、 smb://で始まるpathに変換する必要がある。
これをscalaで実装してみる

# match を使う
matchとはswith文みたいなもので、値がcase文にマッチしたらその処理を行う。

```scala
x match {
  case 1 => println("one")
  case 2 => println("two")
  case _ => println("other")
}
```

マッチさせる値はintegerじゃなくてもStringとかでも使える。

# match使ったスクリプト

``` ConvartPath.scala
object Main {
    def main(args: Array[String]) = {
        val arg = args(0)
        print("smb:")
        for (x <- arg) {
            x match {
               case '\\' => print("/")
               case _ => print(value)
            }
         }
	 println("")
    }
}
```

これを下記のように使う。(引数はバックスラッシュがあるせいで''で囲まないと行けない。""で囲むのはだめ)

```bash
$ scala ConvertPath.scala '\\test\test'
smb://test/test
```

上記は
printlnとか多用してちょっとイケテナイ。
もっとよいスクリプトを書けるはず…。

# JavaのAPIを使う

```ConvartPath2.scala
object Main {
    def main(args: Array[String]) = {
        val arg = args(0)
        val path = "smb:" + arg.replaceAll("$\\$", "/")
        println(path)
    }
}
```

JavaのStrigのAPIを使ったほうがシンプルに書ける。
こっちの方がいいかも。
Xcode の "Arguments Passed On Lanuch" で dictionary を与える方法

json 形式の `-Foo {bar: "abc"}` とかだとエラーになる

> CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon or value in dictionary on line 1. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolonOrValue to debug.


Arguments Passed On Lanuch

```:
-Foo {bar = "abc";}
```

```objc:lldb
(lldb) po [NSUserDefaults standardUserDefaults] objectForKey:@"Foo"]
{
    foo = abc;
}
```

po してみるとほぼその形式でプリントされてますね。
Modelのchangeイベント時の処理に悩んだ結果

Backbone.jsで書き始めて3日目ぐらいです。どうも。

唐突ですが、以下のようなモデルが存在するとします。

```js
var HogeModel = Backbone.Model.extend({
  defaults: {
    foo: 0,
    bar: 0
  },
  increment: function(){
    // 変更の通知を1回だけにしたい…
    this.set('foo', this.get('foo') + 1, {silent: true});
    this.set('bar', this.get('bar') + 1, {silent: true});
    this.trigger('change');
  }
});
```

簡単なHogeModelです。
続いて、これまた唐突にViewを作ります。HogeViewでいいや。

```js
var HogeView = Backbone.View.extend({
  initialize: function(){
    _.bindAll(this, 'render');
    this.model.on('change', this.render);
  },
  render: function(){
    this.model.increment();  // この段階で、render()が無限ループ
    this.$el.html(this.template(this.model.toJSON()));
  }
});
```

さらりと書き、実行したら動きませんでした。
何でだろうと思ったら、以下の通り。

* HogeModelのプロパティをset()で更新
* HogeViewでrender()される前に、パラメーターを+1する
* increment()でtrigger('change')で一気に更新しようとする
* HogeModelにchangeイベントが走るのでHogeViewのrender()が走る
* 無限ループの完成
* そして考えるのをやめた

なんで `silent:false` だと上手くいっていたんだろう…。と思ったら、
`trigger('change:foo')` 、`trigger('change:bar')` という形のイベントを発火しているという感じでした。
どうしようと思って直した（ように見える）コードがこちら。

```js
var HogeView = Backbone.View.extend({
  initialize: function(){
    _.bindAll(this, 'render');
    this.model.on('change', this.render);
  },
  render: function(){
    this.model.off('change', this.render);
    this.model.increment();  // 無限ループにならない！！
    this.model.on('change', this.render);
    this.$el.html(this.template(this.model.toJSON()));
  }
});
```

一旦Modelのイベントを削除、処理して更新後に、イベントを再設定しました。
まぁ、なんのことはない感じなわけですが、これにそこそこ（1時間）ぐらい悩んでた気がします。
似たようなことがあった人はお試しあれ、です。


// そもそも、もっとうまい書き方があるんではなかろうか？
NSURLSessionのsharedSessionでは、completionHandlerはmain threadで実行されない

iOS7からNSURLSessionという新しいクラスが追加された。
通信周りの処理がNSURLConnectionより充実簡単になったのと、バックグラウンド処理が使えるようになったらしい。
ということで、試しに使ってみたらつまらないところでハマったのでメモ。

completionHandlerの中でUITableView:reloadを走らせようとしたら挙動がおかしくなった。
cellForRowAtIndexPathがすぐに呼ばれず、テーブルビューがスクロールされるタイミングで呼ばれる。

```objc
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://hogefuga.com"];
[[session dataTaskWithURL:url
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            [_tableView reloadData];
        }] resume];
```

原因は、completionHandlerがmain threadで実行されてなかったからでした。
UIに変更を加える処理はmain threadで実行する必要があります。

blockの中にブレークポイントしかけると
![スクリーンショット 2014-02-07 11.09.38.png](https://qiita-image-store.s3.amazonaws.com/0/8748/f3fe31d9-32d5-5a4f-eede-601394a36111.png)
SerialQueueですね。

取り急ぎ、dispatch_get_main_queueで囲ってやればmain threadで実行されるようになる。

```objc
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://hogefuga.com"];
[[session dataTaskWithURL:url
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [_tableView reloadData];
            });
        }] resume];
```

そういえば、NSURLConnectionはどうだったっけ？と思い振り返ると

```objc
NSURL *URL = [NSURL URLWithString:@"http://hogefuga.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                           [_tableView reloadData];
                       }];
```

[NSOperationQueue mainQueue]で指定していました。
では、NSURLSessionでも指定できるのでは無いかと思い、調べたらありました。

```objc
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSURL *url = [NSURL URLWithString:@"http://hogefuga.com"];
[[session dataTaskWithURL:url
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            [_tableView reloadData];
        }] resume];
```
[sharedSessionはデフォルトの設定が適用されるらしいです](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html)。
仕組みを理解してから使うべきでした。
反省しました。
jQuery①


## jQueryの読み込み

ここでは、jQueryを使うときの、読み込み方法を「body要素」に「hellw, world」とh1タグ出力することで確認してみる。

以下の様になる↓

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test01</title>
</head>
<body>


<script type="text/javascript">

$(function() {
	$('body').html('<h1>hello, world</h1>');
});

</script>

</html>

```

![jq003.png](https://qiita-image-store.s3.amazonaws.com/0/35975/11913891-9095-4a69-6f06-8e72e7ac9ce1.png "jq003.png")


## $ ---- jQueryという関数の別名

jQueryでは`$`という記号がたくさん出てきます。

例えば、、

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test02</title>
</head>
<body>

<div class="box">美浜ちよです。</div>

<script type="text/javascript">

$('.box').css('color', 'red');

</script>

</html>


```

![jq002.png](https://qiita-image-store.s3.amazonaws.com/0/35975/b330d8e5-a402-afe6-ea00-51feb1a6c053.png "jq002.png")


* `$('.box').css('color', 'red');`の部分は以下と全く同じ意味になります。


* `jQuery('.box').css('color', 'red');`

違いは`$`が`jQuery`になっている点です。jQueryを読み込むと`jQuery`という関数が使える様になります。この`jQuery`という関数の別名が`$`のことです。

ただ、ほとんどすべての場合で`$`を使っています。


## $(function)() {}) ----- HTMLの読み込みを待って処理する

JavaScriptの場合`window.onload`や`DOMContentLoaded`で要素を取得できたが、複数の処理を設定するのに`addEventListener`を使うため、クロスブラウザ対応が出来ない弱点があった。

jQueryの場合`$(function)() {})`の記述で以下のような挙動が可能になる。

* クロスブラウザで動作する
* 画像のロードなどは待たずに、HTMLの構築が終わった時点で処理を開始する
* 複数の処理を設定できる。
.NET Frameworkのバージョン判定とInnosetup


仕事でインストーラーを作っていて、「.NETを入れてくれ」という要望があって作業したのでメモ

##.NET Frameworkのバージョン

@ITの下記の記事がすばらしくよくまとまっている

[.NET Frameworkのバージョンを整理する](http://www.atmarkit.co.jp/ait/articles/1211/16/news093.html)

その中でもこのラインタイムの図が綺麗にOS毎のプレインストールの状況が示されている

※久しぶりに確認したらWindows10対応がされて更新されていたので画像を変更しました(16/6/16)

![wi-fig01.png](https://qiita-image-store.s3.amazonaws.com/0/14768/cef6829f-1a08-f473-cd14-e630c4483675.png)

サーバーOSや画像の情報詳細については上記サイトを直接ご確認ください。

## .NET Frameworkのバージョン確認

Microsoftの情報もあるが、下記がまとまっていてわかりやすい

[インストールされているMicrosoft.NET Framework のバージョンとサービス パックのレベルを確認する方法](http://support.microsoft.com/kb/318785/ja)

[.NET Frameworkのバージョンを確認する方法](http://www.atmarkit.co.jp/ait/articles/1210/26/news086.html)

## InnoSetupへの組み込み

上を参考に自分でいろいろコード書いていたのだが、参考になるコードを見つけたので、リンクしておきます。

[InnoSetup with .NET installer x86/x64 sample](http://www.codeproject.com/Tips/506096/InnoSetup-with-NET-installer-x86-x64-sample)

##ごにょごにょ

もっと簡単に判定できるような関数とかシステム変数を作っておくべきだと思いますが、互換性とか考えるとやっぱりレジストリーしかないような気もします。

でも、１箇所見ればいいような感じにはできると思うんだが...
メモ：NSTextAlignmentとUITextAlignmentについて

# メモ

_非公式・未確認情報_

iOS 5マデ：UITextAlignment
iOS 6以降：NSTextAlignment

両者別のenumとなっているので、マクロ等で対策したりする人が多いみたい。

```
#ifdef NSTextAlignmentCenter // iOS6 and later
#   define kLabelAlignmentCenter    NSTextAlignmentCenter
#   define kLabelAlignmentLeft      NSTextAlignmentLeft
#   define kLabelAlignmentRight     NSTextAlignmentRight
#   define kLabelTruncationTail     NSLineBreakByTruncatingTail 
#   define kLabelTruncationMiddle   NSLineBreakByTruncatingMiddle
#else // older versions
#   define kLabelAlignmentCenter    UITextAlignmentCenter
#   define kLabelAlignmentLeft      UITextAlignmentLeft
#   define kLabelAlignmentRight     UITextAlignmentRight
#   define kLabelTruncationTail     UILineBreakModeTailTruncation
#   define kLabelTruncationMiddle   UILineBreakModeMiddleTruncation
#endif
```


でも Stackoverflow 先生にこんな記述アリ。

> http://stackoverflow.com/questions/11920321/label-alignment-in-ios-6-uitextalignment-deprecated/14248125#14248125
> You don't have to do either of these. Xcode 4.5 will compile the NSTextAlignmentCenter, etc. fine in iOS 5.

Xcode 4.5 以降ではコンパイラが良きに計らってくれるので、マクロとかやらなくても素直に NSTextAlignment で書いとけばいいよとのこと。

追記：ほんまかいな
Gitメモ

# Tips

## git logをdiff付きで見る
```
$ git log -p
```

## ゴミ掃除
```
$ git gc --prune=now
```

## 編集中のファイルを今のブランチじゃないところにコミットしたい
```
$ git stash save
$ git stash branch tmp-hoge <stash>
(これでstashに退避した修正がブランチとして作成される)
```
あとはmergeするなりなんなりすればいい

# ブランチ操作

## ブランチを作成
```
$ git checkout -b <branch>
```

## ブランチをリモートに送信
```
$ git push origin <branch>
```

## ブランチを master にマージ
```
$ git checkout master
$ git merge --squash <branch>
$ git diff master
$ git commit -m 'comment'
```

## ブランチを削除
```
$ git branch -D <branch>
$ git push origin :<branch>
```

## ブランチをリネーム
```
$ git branch -m '新しいブランチ名'
リモートからブランチを取得
$ git pull origin <branch>
$ git checkout <branch>
```

# タグ
## tag からブランチを作る
```
$ git chekout -b <branch> <tag>
```

```
$ git branch <branch> <tag>
$ git checkout <branch>
```

## tagを新しく作る
$ git tag -a 1.0.0 -m 'v1.0.0'

## タグをremoteにpushする
$ git push origin 1.0.0

## タグを表示する
```
$ git tag
```

## tagをremoteから取得する
```
$ git fetch --tags
   or
$ git pull --tags
```

## tagを削除する
```
$ git tag -d 1.0.0
```

## remoteにも反映させる。(タグ名に':'をつける)
```
$ git push origin :1.0.0
```
面白そうなやつ_20140207

Boxen

http://qiita.com/yuku_t/items/c6f20de0e4f4c352046c

Hubot

http://tech-sketch.jp/2013/12/hubot-install-heroku.html

方痴民

http://obarasu.com/houchimin/

Git::SVN
http://notnil-creative.com/blog/archives/2431
http://lambdasakura.hatenablog.com/entry/2013/02/01/175811
http://d.hatena.ne.jp/idesaku/20090323/1237825080
macでGLUTを触ってみた vol.2


前回、ウィンドウを描画した所で、
終了したので今回はその続きから。

まず、先に前回のコンパイルオプションの指定で、
間違いがありましたので訂正。
まずは、前回と今回のコマンドを載せます。

GLUT API リファレンス(日本語)
http://www.asahi-net.or.jp/~yw3t-trns/opengl/glut/glut.htm#init

OpenGL 4 Reference 
http://www.opengl.org/sdk/docs/man4/xhtml/

コンパイル

*(前回)*

```
gcc sample01.cpp -o sample01.out -Wall -framework GLUT -framework OpenGL
```

*(今回)*


```
gcc sample02.cpp -o sample02.out -Wall -framework GLUT -framework OpenGL -lstdc++
```


**-lstdc++** を追加しています。

詳細はこの辺を参考にしてください。
[gccの使い方メモ#03 gccとg++(其の弐)](http://pokotsun.mydns.jp/?p=1049)

---

さて、今回のサンプルプログラムはこちら。

[sample02.cpp]

```
#include <OpenGL/gl.h>
#include <GLUT/glut.h>

/**
 * 描画
 **/
void draw( void )
{
  // 背景色指定(R:Red,G:Green:B:Blue,A:Alpha)
  glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );  
  
  // バッファをクリア
  glClear( GL_COLOR_BUFFER_BIT );

  // 強制描画
  glFlush();
}

/**
 * 更新
 **/
void update(void)
{
}


/**
 * メイン関数
 **/
int main( int argc, char* argv[] )
{
  // 初期化
  glutInit( &argc, argv );

  // ウィンドウサイズの設定(640x480)
  glutInitWindowSize( 640, 480 );

  // ウィンドウの作成
  glutCreateWindow( "ウィンドウの初期化" );

  // 描画
  glutDisplayFunc( draw );

  // ループ処理
  glutMainLoop();

  return 0;
}
```

**※新たに使用している関数について説明**

| オプション | 説明 | 引数 |
|:----------:|:------------:|:------------:|
| GLUTAPI void APIENTRY glutInitWindowSize(int width, int height); | ウィンドウサイズの指定 | width：幅、height：高さ |
| GLUTAPI int GLUTAPIENTRY glutCreateWindow(const char *title); | ウィンドウの作成 | title：ウィンドウタイトルバーに表示する文字列 |
| void glClearColor(	GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); | 画面クリア時の色指定 | red：赤、green：緑、blue：青、 alpha：透明度 |
| void glClear( GLbitfield mask ); | クリアのバッファを指定 | mask：マスクの設定 |
| void glFlush( void ); | 強制実行 | - |




```
  // ウィンドウサイズの設定(640x480)
  glutInitWindowSize( 640, 480 );
```

ウィンドウのサイズを **幅：640**、 **高さ：480** に設定。
640 x 480 なのは、画面解像度を調べてください。


```
  // ウィンドウの作成
  glutCreateWindow( "ウィンドウの初期化" );
```

「ウィンドウの初期化」というのをタイトルバーに設定。

```
  // 背景色指定(R:Red,G:Green:B:Blue,A:Alpha)
  glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );  
```

**RGBAカラーとは、PCで色を表現する際に用いられる表記法の一つ。**
それぞれ **0.0 〜 1.0** の間で指定。
RGBの値が大きいほど明るくなり、値が小さいほど暗くなります。
Aの値は **アルファ値** と呼び、アルファ値を保存するデータ領域は **アルファチャンネル** と呼びます。

今回の場合は、全て **0** を指定しているので、 **黒** となります。
※RGB全てを **1** に指定すると、 **白** となります。

  
```
  // バッファをクリア
  glClear( GL_COLOR_BUFFER_BIT );
```

[マスク値の説明]
GL_COLOR_BUFFER_BIT：カラーバッファ
GL_DEPTH_BUFFER_BIT：深度バッファ
GL_STENCIL_BUFFER_BIT：ステンシルバッファ

※ちなみにマスク値を複数設定する場合には、パイプ（｜）で接続します。

```
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
```

```
  // 強制描画
  glFlush();
```
gnuplotで配列変数（っぽいの）を使う


gnuplotの`value`と`sprintf`を組み合わせて擬似的に配列変数っぽいのを作れます．

***Example***
具体例を挙げます．例えば，
>$ pwd
~/test/Directory1
>$ ls ..
> Directory1 Directory2 Directory3

となっていいる状態で，各Directory1,2,3には2列分のデータが入っているoutput.datが入っているものとします．

```gnuplot:test.gp
dir1= Directory1
dir2= Directory2
dir3= Directory3

ti1 = test1
ti2 = test2
ti3 = test3

num = 3

plot for [i=1:num]\
	"../".value(sprintf("dir%i",i))."/output.dat" using 1:2 with lines title value(sprintf("ti%i",i))
```

`value(sprintf("dir%i",i))`の部分で`dir(数字)`の部分を配列のように振る舞わせる事ができ,forループでグラフ化することが出来ます．

また，`dir1,2,3`や`ti1,2,3`などの"擬似"配列変数の部分を，`plot`する部分とは別のファイルで保存しておくと使い回しができます．

もっと簡単な方法を知っている方いらっしゃいましたらご教授願ますm(_ _)m
[sed] 指定した行をコメントアウトする。

メモ

```bash:22行目～25行目のコメントアウト
sed -i.orig "22,25s/^/#/ig" httpd.conf
```

```bash:22行目～25行目のコメントアウト解除
sed -i.orig "22,25s/^#//ig" httpd.conf
```
numpyで作成した行列の可視化

interpolation='nearest'で境界がくっきりする。
origin='lower'で縦軸の向きを変えられる。

```py
#coding:utf-8
from pylab import *
import numpy

matrixW = numpy.zeros( (6, 11) )
    
# matrixWに適宜値を入れる
    
# 可視化
#figure(1)
im = imshow(matrixW, interpolation='nearest') # origin='lower'
title('$W_j$')
colorbar(im) # 色と値の対応を示すカラーバー
grid(True)
gray() # 無記入, gray(), hot()によって色合いが変わる
show()
```
    
![w_j.jpg](https://qiita-image-store.s3.amazonaws.com/0/32910/745f3c89-3e30-3b2d-01f7-ff9dab8c1b36.jpeg)
[iOS] CALayerが便利そう


まだまだ知らないことがたくさんあります。
色々調べ物をしていて、`CALayer`なるものを知りました。

めっちゃざっくり言うと、HTMLでいうDOMに似てるなーという感想。
なにはともあれコードを見てもらうと、レイヤーに対してCSS当ててる感じで行けます。


```objc
//レイヤーを新規作成
CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor blueColor].CGColor;
sublayer.shadowOffset = CGSizeMake(0, 3);
sublayer.shadowRadius = 5.0;
sublayer.shadowColor = [UIColor blackColor].CGColor;
sublayer.shadowOpacity = 0.8;
sublayer.frame = CGRectMake(30, 30, 120, 150);
sublayer.borderColor = [UIColor blackColor].CGColor;
sublayer.borderWidth = 2.0;
sublayer.cornerRadius = 10.0;
[self.view.layer addSublayer:sublayer];
```

なんだかDOMのstyleプロパティに色々設定している見たいな感じですね。
元々UIViewは`layer`プロパティを持っていて、そこに`addSublayer:`することでどんどんレイヤーを追加していけるようです。
位置指定はこれまたDOMと同じように、親となるレイヤーとの相対位置になると。
ちょっとした角丸のアイコンとか、画像を使わずにさくっとできそうでいい感じです。

ちなみに画像を設定することも簡単で、以下のようにすることで画像を表示させることができます。

```objc
//上記生成の後
sublayer.contents = (id)[UIImage imageNamed:@"hoge.jpg"].CGImage;
```

注意点としては、カラーやイメージすべて`CG****`というプロパティを設定している点です。（<del>Core Foundationのオブジェクト？ なんでCGってプレフィクスなんだろ</del> CGは`CoreGraphics`の略のようです。ちなみにCAは`CoreAnimation`。コメント頂きました）
【教えて】traitとcase classのcopy


case class の `copy` メソッドで作られた新しいオブジェクトは、traitの `version` の値を引き継ぎませんが、Scala 2.10ではこれを引き継ぐようにできるのでしょうか?

```scala
trait Version {
	var version = 1
}

case class Item(name : String) extends Version

val foo = Item("Foo")
foo.version = 2

println(foo)
println(foo.version) // 2

val bar = foo.copy()
println(bar.version) // 1 (ここが2になるようにしたい)
```
Dart でユニットテストを書いてみる

## pubspec.yaml を書く

こんな感じ.

```yaml
# pubspec.yaml

name: hello_unittest
dev_dependencies:
  unittest: any
```

これを作業ディレクトリにおいて `pub get` とコマンドを打つと, `unittest` ライブラリと依存するライブラリがダウンロードされる.

Refs: http://pub.dartlang.org/doc/

```bash
$ pub get
Resolving dependencies.................
Got dependencies!
$ ls -R
packages        pubspec.lock    pubspec.yaml

./packages:
path            stack_trace     unittest
```

## テスト対象のコードを書く

ここでは `lib/hello.dart` に記述する.

```dart
// lib/hello.dart

library hello_unittest;

helloUnittest() => 'Hello, Unit Test';
```

## テストコードを書く

`test/` 以下に `<テスト対象>_test.dart` という名前で書くのが慣例のようだ.

```dart
// test/hello_test.dart

import 'package:unittest/unittest.dart';
import 'package:hello_unittest/hello.dart';

main() {
  test('This is my first unit test.', () {
    expect(helloUnittest(), equals('Hello, Unit Test'));
  });
}
```

`test/` ディレクトリを作成した時点で, もう一度 `pub get` しておく.
こうすることでシンボリックリンクが生成され, `test/` 以下のコードから `packages/` 内のライブラリをインポートできるようになる.

```bash
$ pub get
Resolving dependencies...
Got dependencies!
$ ls -l test/
total 16
-rw-r--r--  1 kkohtaka  staff  204 Feb  7 03:13 hello_test.dart
lrwxr-xr-x  1 kkohtaka  staff   11 Feb  7 03:13 packages -> ../packages
```

Refs: https://www.dartlang.org/articles/dart-unit-tests/

## テストを実行する

コマンドラインから次のように実行する.

```bash
$ dart --checked test/hello_test.dart 
unittest-suite-wait-for-done
PASS: This is my first unit test.

All 1 tests passed.
unittest-suite-success
```

失敗する場合は次のような感じに表示される.

```bash
$ dart --checked test/hello_test.dart 
unittest-suite-wait-for-done
FAIL: This is my first unit test.
  Expected: 'Hello, Unit Test'
    Actual: 'Bye, Unit Test'
     Which: is different.
  Expected: Hello, Uni ...
    Actual: Bye, Unit  ...
            ^
   Differ at offset 0
  
...
```
情報科学を学んだ人っぽい感じのRuby on Railsでのサービス構築


## 1.サービスの概要ページを作成
[Liveweave](http://liveweave.com/)やPhotoshopなどのデザインツールで簡単にページデザインを作成

## 2.データベースの属性を抽出
ページデザインを元に、必要なデータベースの属性をリストアップする。
e.g.) ブログを作成したいなら、「投稿者名、投稿日時、内容、...」が必要だな。といった感じですべて抽出する。

## 3.データベースのスキーマを作成
抽出したデータベースの属性を、とりあえず全部1つのリレーションスキーマとして、それを第1正規形(1NF)とする。続いて候補キーや関数従属性、結合従属性ウンタラカンタラによって第5正規形(5NF)になるようにリレーショナルスキーマを設計していく。

## 4.UMLの作成
データベーススキーマの設計によりモデルの属性(attributes)が決定したら、そのモデルのクラスメゾッドやコンストラクターなどを決定する。この時にオブジェクト指向のデザインパターンの知識があると良い。

こうして設計されたモデルをUMLに記述する。MacユーザーならVisual Paradigm for UMLがオススメ。web上でやるなら[draw.io](https://www.draw.io/)を使ってもいいかも。

## 5.モデルの属性やメゾッドに関するテストをリストアップ
データのモデルやメゾッドが決まったら、バリデーションなどを考えていきます。データベースの授業で出てきた一貫性記述とか参考にしながらテストを考えるとやりやすい。

## 6.実際にコーディングしていく
以上でUMLやテストが設計出来たので、まずはspecなどでモデルのテストを書いていきましょう。テストがすべて書けたら、UMLの通りにModelをgenerate, generate,...しまくります。クラスメゾッドも書きまくります。

最後にコントローラからデータにアクセスしたり保存したりするコードを書いて、ビューにhamlとかerbとかでデータを表示できる用にしたりしておしまいです。

####このようにRDBスキーマやテストの設計を先にしっかりやれば、最後の6のコーディングの部分の手間はかなり省けます。(RoRならでは！)
#### 情報科学を勉強して何に使えるねん！と思っていらっしゃる学生は、Ruby on Railsを使って、手軽に情報科学の知識を存分に発揮してみましょう！
CandyBarをMavericksで使う

###アイコン変更ソフトであるCandyBarがmavericksで使えるようになるという情報を得たので早速試した。

詳しくは[ブログ](http://blog.digital-bot.com/blog/2014/02/07/use-candybar-with-mavericks/)に書いたけど、元記事は英語の[このサイト](http://idevicedailys.com/os-x/howto-use-candybar-os-x-mavericks/)。

なんか無理やり対応してる感がすごいけど、まぁ使えるから良いか。
写真/動画をアプリ領域に保存する方法


UIImagePickerControllerで選択した写真/動画をアプリ領域に保存する方法です。

UIImagePickerControllerDelegateのdidFinishPickingMediaWithInfoを実装します。
ここでパラメータのpickerInfoに選択した写真/動画の情報が渡ってきます。

```objc:
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)pickerInfo {
	...
}
```

## まずは写真のみの場合を考えたシンプルな例
AssetsLibraryを使用して画像データにアクセスします。
生画像を取得したい場合はALAssetRepresentationのfullResolutionImageを、編集後の画像を取得したい場合はfullScreenImageを使います。

```objc:
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
NSURL *url = [pickerInfo objectForKey:UIImagePickerControllerReferenceURL];
	
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
	ALAssetRepresentation *rep = [asset defaultRepresentation];
	NSString *path = [NSString stringWithFormat:@"%@/%@.png", dir, fileName];
	
	// 写真アプリで編集後の画像取得（編集前の画像はfullResolutionImage）
	UIImage *image = [UIImage imageWithCGImage:rep.fullScreenImage];
	
	[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
	...
} failureBlock:^(NSError *error) {
	...
}];

```

## 巨大な動画が選択されても落ちないようにする

動画が選択された場合も考慮したケースです。
数十分の動画で数GBになったりすると、何も考えずに実装すると落ちてしまいます。
データを少しずつ読み込んでは開放を繰り返すように工夫してやる必要があります。

```objc:
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
NSURL *url = [pickerInfo objectForKey:UIImagePickerControllerReferenceURL];
	
NSString *extension = url.pathExtension.lowercaseString;
NSString *path = [NSString stringWithFormat:@"%@/%@.%@", dir, fileName, extension];
	
[assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
	ALAssetRepresentation *rep = [asset defaultRepresentation];
			
	[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
	NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:path];

	int partSize = 8 * 1024 * 1024;
	NSUInteger offset = 0;

	@try {
		while (true) {
			@autoreleasepool {
				NSError *error = nil;

				// 少しずつ読み込む
				Byte *buffer = (Byte*)malloc(partSize);
				NSUInteger readByteLength = [rep getBytes:buffer fromOffset:offset length:partSize error:&error];
				if (error != nil) {
					...
				}
				if (readByteLength <= 0) {
					free(buffer);
					break;
				}
				offset += readByteLength;
					
				NSData *data = [NSData dataWithBytesNoCopy:buffer length:readByteLength freeWhenDone:YES];
				[output writeData:data];
			}
		}
		...
	}
	@catch (NSException *exception) {
		...
	}
	@finally {
		[output closeFile];
	}
} failureBlock:^(NSError *error) {
	...
}];
```
getElementsByClassName("...")に対してforEachを行う方法


getElementsByClassName("...")はforEachメソッドを持っていないので，for文で回さないとダメなのかなーと思っていたのですが，`[].forEach.call()`か`Array.prototype.forEach.call()`で回せるんですね．

```html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
</head>
<body>
<script language="javascript">
window.onload = function(){
  [].forEach.call(document.getElementsByClassName("btn"),function(x){
    x.addEventListener('click',hi);
      });
}
function hi(){
  alert("hi");
}
</script>
<form>
  <input type="button" class="btn"/>
  <input type="button" class="btn"/>
</form>
</body>
</html>
```

* [document.getElementsByClassName( "myclass" ).forEach( function(element, index, a - Pastebin.com ](http://pastebin.com/9N6x1YCZ)
Xcode のプラグイン Alcatraz を Xcode5 で使ってみた


最近 Xcode に触るようになって下記のエントリが大変参考になりました。

- [Xcode の便利プラグインまとめ](http://qiita.com/CarmineScarlet/items/59745e26584a00ddfba3)
- [iOSアプリ開発が捗るXcodeプラグイン](http://qiita.com/cutmail/items/d8614d72c8f4a9e8348d)

で、[Alcatraz](http://mneorr.github.io/Alcatraz/
) なるパッケージマネージャーが大変便利そうだけど、なんか Xcode5 だとうまくいかないらしい？
とりあえず手前でビルドしたら使えるみたいだったので、そのメモを下記に残します。

Alcatraz

- http://mneorr.github.io/Alcatraz/
- https://github.com/mneorr/Alcatraz

### git clone → build

```bash
$ git clone https://github.com/mneorr/Alcatraz.git
$ cd Alcatraz
$ gem install xcpretty  # 入ってなかったら入れる
$ gem install cocoapods # 入ってなかったらいれる
$ rbenv rehash # rbenv 使ってたら rehash しましょう
$ pod install
$ make test
```

これでテスト通れば

```bash
$ make build
```

`make: *** [build] Error 1`とかでましたがなんかビルドは成功しているらしい。

### build 結果を確認

```bash
$ ls -la build/Release
total 8
drwxr-xr-x  4 luckypool  staff  136  2  6 23:41 .
drwxr-xr-x@ 4 luckypool  staff  136  2  6 23:41 ..
lrwxr-xr-x  1 luckypool  staff   94  2  6 23:41 Alcatraz.xcplugin -> /Users/luckypool/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin
drwxr-xr-x  3 luckypool  staff  102  2  6 23:41 Alcatraz.xcplugin.dSYM
```

どうやら設置されているらしい。

### Xcode 再起動

これで捗る。とりあえずはエディタのカラーとか変えてみた。良い。

![スクリーンショット 2014-02-07 00.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/17133/f1535114-7380-10da-dc46-1b05c052913b.png "スクリーンショット 2014-02-07 00.08.58.png")
awkへシェルスクリプトの変数を渡す


## awkの基本形
    $ awk 'パターン {アクション}' ファイル名

シェル変数として渡したいのは、「パターン」もしくは「アクション」です。

###1. パターンをシェル変数として渡す場合  
`/'"${shell_pattern}"'/`のように、変数をシングル、ダブル、<シェル変数>、ダブル、シングルクォーテーションで括ればよい。  
###2. アクション(パターン以外)にシェル変数を渡す場合  
-vオプションを使う
`-v awk_action_val="${shell_action_val}"`

---
###1,2.を組み合わせたサンプル

```csv:captain.csv
Taniguchi Third,Pitcher
Marui Second
Igarashi Third,Pitcher
Kondo Pitcher
```

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

shell_file="$1"
shell_pattern="$2"

awk -v awk_file="${shell_file}" '/'"${shell_pattern}"'/ {print  awk_file "(" NR "):" $0}' ${shell_file}
```

実行例

    $ ./awkval_test.sh captain.csv Marui
    captain.csv(2):Marui Second

---
### メモ
* シェル変数を渡すオプション`--assign`はMacのawkだと使えない。GNU Awkは`--assign`が使える
* NR:行番号、$0:行全体
MacでPlay Frameworkを使ってみる


Play Frameworkを使ってみたのでメモ
なんかrailsっぽい。

# インストール
homebrewでインストール

```bash
$ brew install play
```

# プロジェクトの作り方

```bash
$ play new hello-play
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.1 built with Scala 2.10.2 (running Java 1.6.0_65), http://www.playframework.com

The new application will be created in /Users/hogehoge/dev/scala/hello-play

What is the application name? [hello-play]
> 

Which template do you want to use for this new application? 

  1             - Create a simple Scala application
  2             - Create a simple Java application

> 1
OK, application hello-play is created.

Have fun!
```

# サーバーの起動し方

```bash
$ cd hello-play
$ play
[hello-play] $ run
```

で、 http://localhost:9000/ へアクセス

# 試しにHello World

* app/controllers/ 以下がcontroller
* app/views/ 以下がview
* conf/routes にルーティングの内容が書いてある

routesには

```routes
GET     /                           controllers.Application.index
```

と書いてあるので、 controllers/Application.scala と views/index.scala.html を編集して Hello Worldを出力してみる

```Application.scala
package controllers
import play.api._
import play.api.mvc._
object Application extends Controller {
  def index = Action {
    Ok(views.html.index("Hello World"))
  }
}
```

```index.scala.html
@(message: String)

@main(
    "test page") {
    <h1>test</h1>
    <div>@message</div>
}
```

で http://localhost:9000/ にアクセスすると、 testとHello Worldが表示されるはず
rosmakeが終わった後に通知する

`.bashrc`とかに以下を追加。

```bash
alias alert_helper='history|tail -n1|sed -e "s/^\s*[0-9]\+\s*//" -e "s/;\s*alert$//"'
alias alert='notify-send -i /usr/share/icons/gnome/32x32/apps/gnome-terminal.png "[$?] $(alert_helper) finished."'

function rosmake(){
                 `which rosmake` $@; alert
}
```

rosmakeが終わると画面右上に通知がでる。
よくビルド中に他の作業をしていて、ビルドしていたのを忘れるので。
zshのプロンプトにgitのブランチ名を色付きで表示する

`vcs_info`を使ってプロンプトに`git`のブランチ名を表示させる時に、ブランチ名の部分に色づけをしてみました。

    # vcs_infoロード    
    autoload -Uz vcs_info    
    # PROMPT変数内で変数参照する    
    setopt prompt_subst    

    # vcsの表示    
    zstyle ':vcs_info:*' formats '%s][* %F{green}%b%f'    
    zstyle ':vcs_info:*' actionformats '%s][* %F{green}%b%f(%F{red}%a%f)'    
    # プロンプト表示直前にvcs_info呼び出し    
    precmd() { vcs_info }    
    # プロンプト表示    
    PROMPT='[${vcs_info_msg_0_}]:%~/%f '    

結果は以下

![プロンプト_1_324_44.png](https://qiita-image-store.s3.amazonaws.com/0/30947/261c5f8c-b6d6-5600-a17a-cafa5bed67bc.png)

また、コンフリクトが起きた時など`action name`が出るときは、その部分が赤く表示されます。

![プロンプト_2_324_44.png](https://qiita-image-store.s3.amazonaws.com/0/30947/59551a9e-03f0-b6aa-a902-f513291b662a.png)
ホストマシンからAPK指定でAndroidスマホアプリを起動する♥

＜前提＞
Androidスマホ実機は有線か何かでホスト側と接続中。adb devices したらIDが表示される状態。
指定するAPKは既にスマホ実機側にインストール済み。

さて、ツールとしては aapt、awk、adb shell を使う。

- aapt     : 指定したAPKのパッケージ名とかアクティビティ名などのアプリ情報を表示する
- awk      : aaptが出したアプリ情報を整形する。ここではパッケージとアクティビティの名前を抽出。
- adb shell: awkが整形したアプリ情報を受け取りスマホ実機でアプリ起動

次のような感じ。長いので改行した。

```
aapt d badging <APKファイルのパス> | \
awk -F'[ =\047]' '
 /^package/{
  pk=$4
 } 
 /^launchable/{
  system("adb shell am start -a android.intent.action.MAIN -n " pk "/" $4);exit
 }'
```

多分もっと良い方法があるのでは？　とりあえず使えるからいいや。

以上

※ 追記：2014-02-22
Android OS 4.3 ではadb shell am startに失敗するかも？ 
package.listのパーミッションが変わっていてパッケージ起動ができないケースがあるとか。未確認。
ちなみに、package.listが読めないとrun-asで失敗する。ndk-gdbはrun-asを使うので、つまるところ4.3ではネイティブデバッグが出来なかったりするかも？
＜参考URL：4.3のpackage.list問題について＞
　http://stackoverflow.com/questions/18032234/run-as-says-package-is-unknown-after-upgrading-android-to-4-3
　http://code.google.com/p/android/issues/detail?id=58373
　http://stackoverflow.com/questions/17219906/run-as-package-a-b-c-is-unknown-galaxy-s4-jellybean-or-android-4-3

※ 追記：2015-07-04
awkを使わずActivity名をとってみる。かんたん。
```
aapt d badging <APKファイルのパス> | grep launchable | cut -d"'" -f 2
```
Merging SSL Certificates

```rb:pemmerge.rb
#!/usr/bin/ruby

#PEMMerge: concatenate PEMs in a file.
#Output formatting is based on:
#http://wiki.cementhorizon.com/display/CH/Convert+PEM+Certificate+to+ca-bundle.crt+format

require 'openssl'
certs=[]
cert_str=''
in_cert=false
$<.each{|line|
	if line.chomp=='-----BEGIN CERTIFICATE-----'
		in_cert=true
	end
	cert_str<<line if in_cert
	if line.chomp=='-----END CERTIFICATE-----'
		certs<<cert_str
		in_cert=false
		cert_str=''
	end
}
certs.uniq{|e|e[1...-1].tr("\n",'')}.each{|e|
	cert=OpenSSL::X509::Certificate.new(e)
	h=Hash[*cert.issuer.to_a.map{|a,b,*c|[a,b]}.flatten(1)]
	name=h['CN']||h['OU']||h['O']
	puts name
	puts '='*name.size
	#puts 'MD5 Fingerprint: '+Digest::MD5.hexdigest(cert.to_der).upcase.scan(/../).join(':')
	#puts 'SHA1 Fingerprint: '+Digest::SHA1.hexdigest(cert.to_der).upcase.scan(/../).join(':')
	#puts 'PEM Data:'
	puts cert.to_s
	#puts cert.to_text.sub('Certificate:','Certificate Ingredients:')
	puts
}
```

```
#In (at least) Vine Linux, this merged curl-ca-bundle.crt is required to support both bitbucket and codebreak.
wget http://curl.haxx.se/ca/cacert.pem
wget -O novell.crt http://support.novell.com/products/desktop/curl-ca-bundle.crt
ruby pemmerge.rb cacert.pem novell.crt > curl-ca-bundle.crt
```
coffee-modeのインデントをタブ文字にする

coffee-modeに取り込んでもらえました。
[syohexさん](http://qiita.com/syohex)ありがとうございます。
2014-2-8 追記


----------------------------------

スペース派ばっかりなのかな…
後生ですからインデントをタブでもできるようにしてもらいたい><;

とりあえず[フォークして改造してみた](https://github.com/atomita/coffee-mode)ものの、init-loaderで呼ばれるところでも、なんとかやれそうな気がしてやってみた。

```el
(add-hook 'coffee-mode-hook
	'(lambda ()
		(make-local-variable 'coffee-indent-tabs-mode)
		(set (make-local-variable 'indent-tabs-mode) coffee-indent-tabs-mode)
))

(defcustom coffee-indent-tabs-mode indent-tabs-mode
	"Indentation can insert tabs if this is t. (coffee-mode)"
	:group 'coffee)

(defadvice coffee-insert-spaces (around coffee-insert-spaces-or-tabs (count))
	"Insert spaces or tabs"
	(if coffee-indent-tabs-mode
		(insert-char ?\t (floor count coffee-tab-width))
		(insert-char ?  count)))

(ad-activate 'coffee-insert-spaces)
```

coffee-mode.el が評価された後に、上記が評価されれば、たぶん大丈夫。

indent-tabs-mode の値に左右されます。
PHPのドットとアンスコ

[外部から来る変数](http://www.php.net/manual/ja/language.variables.external.php)

```
注意:
変数名のドットやスペースはアンダースコアに変換されます。 たとえば <input name="a.b" /> は $_REQUEST["a_b"] となります。
```

これは了解した。
でもどうしてもドットを使いたい時はどうするかというと、第一に思い付くのが **$_SERVER['QUERY_STRING']** では無いでしょうか。

そしてこの文字列を便利に処理してくれる関数も用意されている。
それが [parse-str](http://jp1.php.net/manual/ja/function.parse-str.php) というわけで早速使ってみる。

```php
parse_str($_SERVER['QUERY_STRING'], $request);
```

よし、これで目的は果たせたはず！
...
...
...

いえ、これでも無理なんです。
恐らく parse_str は第2引数無しの場合は key をそのまま変数名とする為、 **変数名のドットはアンスコに置換** という制約に該当してしまうと。

結局

```php
$pairs = explode("&", $_SERVER['QUERY_STRING']);
foreach ($pairs as $pair) {
```

な感じで解析しましたとさ。
おしまい。