OmniAICreator/Qiita-1.07M huggingface dataset:
Railsのremotipartのresponseをjavascriptではなくjsonにする方法

https://github.com/JangoSteve/remotipart のReadmeにはRailsでejsでJavaScriptをレスポンスで返してブラウザで実行する例が上げられていますが、そうではなくjsonを返したくて調査しました。

結論としては以下の対応でOKです。

* formタグに```data-type="json"```属性を指定する。
* railsのコントローラではrespond_toのブロック内でformat.jsではなくformat.jsonでjsonを返す。
* formのajax:successイベントのハンドラfunction (evt, data, status, xhr)のdataにjsonオブジェクトが受け取れます。

## 関連ソースでdataTypeを扱っている箇所
remotipart側は未設定ならscriptにするようになっています。
https://github.com/JangoSteve/remotipart/blob/v1.2.1/vendor/assets/javascripts/jquery.remotipart.js#L44-L45

```js:jquery.remotipart.js
          // Modify some settings to integrate JS request with rails helpers and middleware
          if (settings.dataType === undefined) { settings.dataType = 'script *'; }
```

jquery-railsのjquery_ujs.jsではdata-type属性に設定されていればそれを使うようになっています。
https://github.com/rails/jquery-rails/blob/v3.0.4/vendor/assets/javascripts/jquery_ujs.js#L90

```js:jquery_ujs.js
        dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
```
betterprint.pprint()の勧め (pprint.pprint()、var_dump.var_dump()より良い)

pip search pprint、pip search var_dump で見つかったものを検証した結果、betterprint.pprint() が一番優れていると感じました。

betterprint.pprint()の長所
----
* betterprint.pprint() は pprint.pprint() とは違い、キーに色がつきます。

var_dump.var_dump()
----
* var_dump.var_dump() というのも調べて見ましたが、pprintでは表示できるものも表示できなかったりしました。

使い方
====

```py:
import sys
from betterprint import pprint
pprint(sys.modules)
```
今日rbenvでinstallが出来ない人向け

## 今日はrbenvの調子が悪いので・・・
rubyのダウンロードサイトの不調っぽい？ので、（wgetで404が返ってくる）


`~/.rbenv/plugins/ruby-build/share/ruby-build/2.0.0-p247`
の設定ファイル内を一部書き換え


`http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz`
から 
`http://ftp.iij.ad.jp/pub/lang/ruby/2.0/ruby-2.0.0-p247.tar.gz`
 って感じにミラーに書き換えて乗り切った。

### こんな感じ
```:2.0.0-p247
install_package "openssl-1.0.1e" "https://www.openssl.org/source/openssl-1.0.1e.tar.gz#66bf6f10f060d561929de96f9dfe5b8c" mac_openssl --if has_broken_mac_openssl
install_package "ruby-2.0.0-p247" "http://ftp.iij.ad.jp/pub/lang/ruby/2.0/ruby-2.0.0-p247.tar.gz#c351450a0bed670e0f5ca07da3458a5b" standard verify_openssl

```

欲しいバージョン（ミラーに）に要所書き換えれば、役立つ人もいるかも？
駄メモで、失礼します。
【HTML】iframeの高さを動的に設定する！

iframeの高さをiframe内のコンテンツの高さに自動で合わせたい時があるかと思います。

その時は読み込むhtml内で親のiframeの高さを設定してあげましょう。

以下がサンプルコードです。

```html:親側HTML
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<iframe id="parent-iframe" src="children.html"></iframe>
</body>
</html>
```

```html:子ども側HTML
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#parent-iframe", window.parent.document).height(document.body.scrollHeight);
});
</script>   
</head>
<body style="height:500px;background-color:yellow;">
This is a children.
</body>
</html>
```
chef-ruby_buildで入れたruby-buildを更新する


chefでrbenvを使ってrubyをインストールしようとしたところ以下のようなエラーに。

```
STDERR: Downloading ruby-2.0.0-p247.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
/usr/local/bin/ruby-build: line 144: pushd: ruby-2.0.0-p247: No such file or directory

BUILD FAILED
```

どうやらruby-buildでソースをダウンロードする際に ftp.ruby-lang.org にhttpでアクセスできなくなったのが原因のようです。
現在はftpで取得するよう修正されています。

しかし、chef-ruby_buildを利用している場合、既にruby-buildがインストールされていると更新がかからないようになっているので、以下のようにruby_buildのattributeにupgrade設定をする必要があります。

```nodes/{host_name}.json
{
  "ruby_build": {
    "upgrade": "sync"
  },
  "rbenv": {
    "user_installs": [
      {
        "user": "app",
        "rubies": ["2.0.0-p247"],
        "global": "2.0.0-p247",
        "gems": {
          "2.0.0-p247": [
            { "name": "bundler" }
          ]
        }
      }
    ]
  },
  "run_list": [
    "recipe[ruby_build]",
    "recipe[rbenv::user]"
  ]
}
```

upgrade設定をしたあとにcookすると正しくインストールできました。

```
knife solo cook {host_name}
```

### 参考
* [fnichol/chef-ruby_build](https://github.com/fnichol/chef-ruby_build#-upgrade)
* [Change server protocol of the ruby-lang.org server in the MRI definitions from HTTP to FTP](https://github.com/sstephenson/ruby-build/pull/388)
nginx+php-fpm環境でのCakePHPで"Warning (2): session_start()"エラーが出る

##環境
OS: CentOS 6.4
Web: nginx 1.4.2
PHP: php-fpm 5.4.17
CakePHP: 2.3.8

##エラー内容
上記の環境下でCakeインスト後ダッシュボード(?)画面で

```
Warning (2): session_start(): open(/var/lib/php/session/sess_*******, O_RDWR) failed: No such file or directory (2) [CORE/Cake/Model/Datasource/CakeSession.php, line 618]
```

##調べてみる
```bash:
$ vim /etc/php.ini
; RPM note : session directory must be owned by process owner
; for mod_php, see /etc/httpd/conf.d/php.conf
; for php-fpm, see /etc/php-fpm.d/*conf
;session.save_path = "/tmp"

$ vim /etc/php-fpm.d/www.conf
php_value[session.save_path] = /var/lib/php/session

$ ls /var/lib/php

```
フォルダがない。

##解決策
```bash:
$ sudo mkdir /var/lib/php/session
$ sudo chown nginx.nginx /var/lib/php/session
```
railsでデータベース作成＆マイグレート（MySQL）

##アプリ作成時にMySQLを指定して作成
```
$ rails new アプリ名 -d mysql
```

##データベースを新規に作成

RailsでデフォルトデータベースのSQLiteはテーブル作成と同時にデータベースも作成してくれるが、MySQLはデータベースを作成した後に、テーブルを作成する必要がある。したがってデータベースがない状態でマイグレーションしてもエラー(rake aborted! Unknown database)が出る。

```
#データベース作成(development/test/productionのすべてを作成)
$ rake db:create:all

#作成したデータベースの消去
$ rake db:drop:all

#マイグレーション
$ rake db:migrate
```
iOS リリースビルド時にNSLogを消す方法


NSLogを残したままリリースするとXcodeのOrganizerのConsoleからログがみれてしまいます。

```objective-c:アプリ名-Prefix.pch
// Debbugログ出力切り替え
#ifdef DEBUG
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif
```
Sublime Text 2にSnippetを登録する


Sublime Text 2にカスタムSnippetを登録すると、作業中にSnippetを一発呼び出しできるようになり、楽しさが倍になる。
応用範囲は広そうだけど、自分はひとまずテンプレート呼び出し用に使っている。
登録にちょっとだけコツが要る。

#登録方法

1.1  Tools - New Snippetを実行。Snippetファイルが新規作成される。
![スクリーンショット 2013-08-06 14.09.04.png](https://qiita-image-store.s3.amazonaws.com/0/20266/b14bfd93-98c1-c0d1-f673-b02c6d1e3753.png "スクリーンショット 2013-08-06 14.09.04.png")

1.2 contentタグの CDATA[ と ]]>の間にあるサンプルコードを削除し、登録したいテンプレートを貼り付ける。CDATA内では改行も含めてそのまま扱われるので、余分な改行を残したりしないこと。

![スクリーンショット 2013-08-06 14.10.30.png](https://qiita-image-store.s3.amazonaws.com/0/20266/4641d13d-a4ac-2074-42a3-f89c1066bf88.png "スクリーンショット 2013-08-06 14.10.30.png")

貼りつけたところ。
![スクリーンショット 2013-08-06 14.12.11.png](https://qiita-image-store.s3.amazonaws.com/0/20266/1f86b4c6-56ba-59f5-a63b-68cfc9aee190.png "スクリーンショット 2013-08-06 14.12.11.png")

1.3 tabTriggerタグのコメントを外し、使用したいトリガーを登録する。ここではclearlineとした。なおコメントは⌘ + / で一発で外せる。

![スクリーンショット 2013-08-06 14.14.37.png](https://qiita-image-store.s3.amazonaws.com/0/20266/e6f3d14d-e8aa-5d2e-dd6b-b580ae909854.png "スクリーンショット 2013-08-06 14.14.37.png")

1.4 scopeタグのコメントを外し、スコープを指定する。text.htmlと書けば、このSnippetはhtmlファイルでしか呼び出されなくなる。なお、cssの場合はsource.cssと書くのが正しいらしい。
![スクリーンショット 2013-08-06 14.17.00.png](https://qiita-image-store.s3.amazonaws.com/0/20266/1d111b23-4912-802c-351c-74a899110262.png "スクリーンショット 2013-08-06 14.17.00.png")

1.5 ⌘ - S でSnippetを保存する。保存場所は以下に固定されている。

```~Library/Application Support/Sublime Text 2/Packages/User
```

ここで注意。**ファイル名は必ず「.sublime-snippet」で終わること**。それ以外の部分は何でもよい。

1.6 保存が終わったらSnippetを閉じてよい。Sublime Text 2の再起動は不要。

#使用方法

2.1 scopeが一致するファイル (ここではhtml] 上で、登録したトリガーを入力し、tabキーを押す。
![スクリーンショット 2013-08-06 14.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/20266/fcc1514d-4a6b-a156-b0d2-377835b51513.png "スクリーンショット 2013-08-06 14.24.47.png")

2.2 瞬時にSnippetが呼び出される。病み付きになる。
![スクリーンショット 2013-08-06 14.25.29.png](https://qiita-image-store.s3.amazonaws.com/0/20266/1a360f87-08e8-0741-c337-5c01f6f1b350.png "スクリーンショット 2013-08-06 14.25.29.png")

2.3 トリガーを忘れても大丈夫。おなじみの ⌘ + Shift + P でこのSnippetを呼び出すこともできる。キーコンビネーションもここで確認できる。
![スクリーンショット 2013-08-06 14.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/20266/1b017cc5-e197-61cc-15f5-7f1c7d9f8617.png "スクリーンショット 2013-08-06 14.29.37.png")

*余談: Qiitaでは記事中にCDATAタグをそのまま書くとそこから先が欠落してしまうことが判明。
ext3容量拡張

VMなどでLVM使わず適当に、

1. /dev/sda1 => /boot
2. /dev/sda2 => /
3. /dev/sda3 => swap

と作っちゃったときに、/の容量が足りなくなってきて、VMマネージャで容量を増やした時などの作業方法。
fdiskでパーティションを一度削除し、より大きなエリアを同じ位置に設定することで、容量拡張をします。


**※ちなみに作業は自己責任でお願いします。当方は作業結果の保証は、しませんので。**


## 状況確認

```
# df -h
# fdisk -l /dev/sda
```

出力された情報を控えておく。 **（特に各パーティションのシリンダ位置番号とブロック数）**


```サンプル出力
Disk /dev/sda: 171.7 GB, 171798691840 bytes
255 heads, 63 sectors/track, 20886 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         127     1020096   83  Linux
/dev/sda2             128        9920    78662272+  83  Linux
/dev/sda3            9921       10442     4192965   82  Linux swap / Solaris
```

## linux rescueで再起動
インストールＣＤから起動

* CentOS5/Debian等
起動時に`boot:`と表示されたら **`linux rescue`** と間違いなく入力する

* CentOS6等
起動時に選択メニューが現れるので、 **`Rescue installed system`** を選択する。

今回の作業ではネットワークは使用しないので、選択肢が出てきたらネットワーク無しでＯＫ。



## ディスクをマウントし作業

### マウント

```
# fdisk /dev/sda
```

### 現在のパーティションの状況を表示
**出力されたブロック数などの情報が最初に控えた物と相違無いことを確認。**

```
p
```

### 第3パーティションと第2パーティションを削除

```
d 3
d 2
```

### 第2パーティションを作成
新規パーティションの開始位置（start）は、削除前に第2パーティションのものとして控えた開始位置を入力する（内容後述）。
**※これを間違えると情報を失います**

```
n p 2
```

### 第3パーティションを作成

```
n p 3
```

### 第3パーティションをSWAPに変更

```
t 
82
```

### 書き込み

```
w
```


#### 終了位置（end）の数値の算出方法（...というほど大げさなものでは無く...）

当初控えた第3パーティション（swap）の容量を、そのまま最終シリンダ位置に移動する。
よって、

* 控えたfdisk情報の第3パーティションの終了位置シリンダ番号から開始位置シリンダ番号を引く。（第3パーティションのシリンダ数）
上記サンプルでは、10442-9921=521

* 控えたfdisk情報のディスクのシリンダ数（最終シリンダ番号）から、先の第3パーティションのシリンダ数を引く。（第3パーティションの開始シリンダ番号）
上記サンプルでは、20886-521=20365

* 第3パーティションの開始シリンダ番号から1を引いた数字が第2パーティションの終了位置となる。
上記サンプルでは、20365-1=20364

つまり、
第2パーティションは

* 開始位置 128
* 終了位置 20364


第3パーティションは

* 開始位置 20365
* 終了位置 20886（最終シリンダ）

となる。



## ファイルシステムのチェックと拡張

```
# e2fsck -f /dev/sda2
# resize2fs /dev/sda2
```

## 再起動
起動前にcdを出しておいてHDDから起動する。

```
reboot
```

## 作業後状況確認

```
# df -h
# fdisk -l /dev/sda
```

当初のサンプルの物が以下のようになればHappy End.

```作業後サンプル
Disk /dev/sda: 171.7 GB, 171798691840 bytes
255 heads, 63 sectors/track, 20886 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         127     1020096   83  Linux
/dev/sda2             128       20364   162553702+  83  Linux
/dev/sda3           20365       20886     4192965   82  Linux swap / Solaris
```

## おわり
たぶん問題無く/dev/sda2の容量が増えているはず。
smarty × underscore.js

smartyもundescore.jsも使いたい欲張りさんに

以下のようにtplに書いて

```html:
<script id="template" type="text/template">
  {if true}
    <p>hoge</p>
  {/if}
  <% if (true) {ldelim} %>
    <p>fuga</p>
  <% {rdelim} %>
</script>
```

あとは_.templateを適切に実行すればOK
rails g scaffoldで“could not find expected ':' ”のエラー対処 

##scaffoldジェネレーター実行でエラー
```
#scaffoldジェネレーター実行

$ rails g scaffold item name:string price:integer description:text
      invoke  active_record
/home/vagrant/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/psych.rb:203:in `parse': (<unknown>): could not find expected ':' while scanning a simple key at line 18 column 3 (Psych::SyntaxError)
```

##原因
database.ymlの定義内で、コロン(:)の後ろにスペースがなかったのが原因。usernameやpasswordなどユーザーが各自変更した部分が疑わしい。

```database.yml
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: sample_development
  pool: 5
  username: railsuser
  password: railspass
  host: localhost
```
railsでdb:migrate時に出るsql関連のエラー

##データベースマイグレート実行時のエラー
```
#dbマイグレート実行
$ rake db:migrate
rake aborted!
Access denied for user 'railsuser'@'localhost' to database 'sample_development'
/worktest/sample/config/environment.rb:5:in `<top (required)>'
Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)
```

##原因
ローカルユーザーの権限がない。権限変更が必要。

```mysql:
#ユーザー権限確認(user部分は'railsuser'@'localhost'など)
SHOW GRANT ALL PRIVILEGES ON *.* TO user 

#ユーザー権限変更（全権限付与）
GRANT ALL ON *.* TO user;
【質問】Scalaのcase classはグッドパーツですか?


下記の特性を踏まえた上で質問を2つさせてください。

## class と case class を比べたときに次のような特性があります

* `new` を書かなくても良い

```scala
scala> case class Foo()
defined class Foo

scala> class NoneCaseFoo()
defined class NoneCaseFoo

scala> Foo()
res0: Foo = Foo()

scala> new Foo()
res1: Foo = Foo()

scala> NoneCaseFoo()
<console>:8: error: not found: value NoneCaseFoo
              NoneCaseFoo()
```


* case class は `equals` メソッドを自動で実装してくれる

```scala
scala> case class Card(value:Int)
defined class Card

scala> class NoneCaseCard(value: Int)
defined class NoneCaseCard

scala> val card1 = new NoneCaseCard(3)
card1: NoneCaseCard = NoneCaseCard@58a0ee03

scala> val card2 = new NoneCaseCard(3)
card2: NoneCaseCard = NoneCaseCard@7e19c472

scala> card1 == card2
res2: Boolean = false

scala> Card(3) == Card(3)
res3: Boolean = true
```

* `match` キーワードで型+値のパターンマッチができる

```scala
scala> def name(card:Card) = card match {
     |   case Card(1) => "Alice"
     |   case Card(2) => "Bob"
     |   case Card(3) => "Carol"
     |   case Card(x:Int) => x.toString()
     | }
name: (card: Card)String

scala> name(Card(3))
res4: String = Carol
```

* `toString` を自動で実装してくれる

```scala
scala> println(Card(3))
Card(3)
```

* ゲッターを自動で実装してくれる

```scala
scala> Card(3).value
res6: Int = 3
```

* copyを自動で実装してくれる

```scala
scala> case class Product(name:String, price:Int)
defined class Product

scala> val product = Product("Bear", 200)
product: Product = Product(Bear,200)

scala> val productForSale = product.copy(price = 150)
productForSale: Product = Product(Bear,150)
```

## Q1: case class はグッドパーツですか?

私はPHPくらいしか知らないので、case classに馴染みがありません。case classは便利な点が多そうですが、classと同じように使っても問題ないのでしょうか? バッドパーツではないですよね?

## Q2: 全部 case class で書くべき?

case class は `new` を書かなくてよかったりと、普通の classより便利なのですが、全部 case class で書いたほうがいいのでしょうか? それとも、適材適所なのでしょうか? 使い分けがあれば教えて下さい。
homebrewでインストールしたmysqlとMAMPに同封されているphpMyAdminを接続する




###mysqlのインストールと設定

インストールは[ここ](http://satomacoto.blogspot.jp/2011/05/homebrewmysql-5510.html "HomebrewでMySQL 5.5.10をインストール")、mysql_secure_installationは[ここ](http://lightly.wjg.jp/wiki/858 "ぷちWiki - mysql_secure_installation")を参照

```
% brew install mysql
% unset TMPDIR
% mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

% mysql_secure_installation
```



###phpMyAdminの設定
`/Applications/MAMP/bin/`以下のphpMyAdminディレクトリをコピーして`/Applications/MAMP/htdocs`にコピー

コピーしたディレクトリ内のconfig.inc.phpを以下のように編集

```config.inc.php
//$cfg['blowfish_secret'] = '' //変更前
$cfg['blowfish_secret'] = '任意の文字列' //変更後

//$cfg['Servers'][$i]['connect_type'] = 'tcp'; //変更前
$cfg['Servers'][$i]['connect_type'] = 'socket'; //変更後

//homebrewでインストールしたmysqlのソケットファイルを設定
//$cfg['Servers'][$i]['socket'] = '' //変更前
$cfg['Servers'][$i]['socket'] = '/tmp/mysql.sock' //変更後

//$cfg['Servers'][$i]['user'] = '' //変更前
//$cfg['Servers'][$i]['password'] = '' //変更前
$cfg['Servers'][$i]['user'] = 'mysqlのユーザ名' //変更後
$cfg['Servers'][$i]['password'] = 'mysqlのパスワード' //変更後
```

※$cfg['blowfish_secret']について
[DBOnline](http://www.dbonline.jp/phpmyadmin/install/index4.html 'config.inc.phpの作成とパスフレーズの設定')では以下のように説明されています。

>詳しいことは分かりませがCookieを使った認証を行なう際にパスワードを暗号化するためのパスフレーズを設定するようです。デフォルトでは空になっていますので任意の文字列を入力して下さい。

###確認
・ターミナルで`mysql.server start`
・MAMPを立ち上げる（homebrewでインストールしたmysqlが起動してるので、Apacheのみが起動するはず）
・`localhost/phpMyAdmini`にアクセス


##参照
・[HomebrewでMySQL 5.5.10をインストール](http://satomacoto.blogspot.jp/2011/05/homebrewmysql-5510.html "HomebrewでMySQL 5.5.10をインストール")
・[ぷちWiki - mysql_secure_installation](http://lightly.wjg.jp/wiki/858 "ぷちWiki - mysql_secure_installation")
・[phpMyAdmin 設定マニュアル (アルファメール プラチナ)] (http://www.alpha-plt.jp/support/tool/php/step_03.htm "phpMyAdmin 設定マニュアル (アルファメール プラチナ)")
・[config.inc.phpの作成とパスフレーズの設定](http://www.dbonline.jp/phpmyadmin/install/index4.html "config.inc.phpの作成とパスフレーズの設定")
NSTimerの使い方


実行

```objectivec:
NSTimer *testTiemr = [NSTimer scheduledTimerWithTimeInterval:1.0f
													  target:self
												    selector:@selector(testTimerFired:)
												    userInfo:nil
													 repeats:YES];
```

呼び出されるメソッド

```objectivec:
- (void)testTimerFired:(NSTimer*)timer {
}
```

終了する

```objectivec:
[testTiemr invalidate];
 testTiemr = nil;
```

## Timerの破棄
TimerのtargetにViewControllerをセットしている場合、ViewControllerが保持されっぱなしになってしまうのでviewWillDisappearなどでinvalidateしましょう

```objectivec:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    myTimer = [NSTimer
                   scheduledTimerWithTimeInterval:1.0f
                   target:self
                   selector:@selector(myTimerFired:)
                   userInfo:nil
                   repeats:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    [myTimer invalidate];
    myTimer = nil;
}
```
macのターミナル(iTerm2)のプロンプトにランダムな色のリンゴマークを出してみた(zsh)

zshrcに一行追加でこんな感じになります！

![BQu9UU3Tusv.gif](https://qiita-image-store.s3.amazonaws.com/0/1210/b6a79535-8afb-a127-81ec-175f03ba4da2.gif)

殺風景なターミナルに疲れた方どうぞ〜＾＾

```zsh:zshrc
#色ランダムリンゴマーク
PROMPT=$'%{\e[$[32+$RANDOM % 5]m%}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
```

以下参考URL
[https://gist.github.com/STAR-ZERO/2901454](https://gist.github.com/STAR-ZERO/2901454)
[http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-enter-apple-logo-mark-with-mac-keyboard-shortcut.html](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-enter-apple-logo-mark-with-mac-keyboard-shortcut.html)
http ping 的なものを即興で

引数で `http://google.com` みたいな文字列を受け取ると、そこに 10回 http アクセスして結果と要した時間を表示します。

エラー処理はしてないし、末尾の / 補完もインターバルも設定できないけど、ひな形として置いておきます。

たまにこういうベタなスクリプトをちょっとだけカスタマイズしたものが単発でほしくなることがあるのです。

```ruby:http_ping.rb
#!/usr/bin/env ruby

require 'net/http'
require 'uri'

COUNT=10
INTERVAL=1

def ping(s)
  url = URI.parse(s)
  res = Net::HTTP.start(url.host, url.port) {|http|
       path = url.path.length != 0 ? url.path : "/"
       http.get(path)
  }
  res.body
  "#{res.code} #{res.msg}"
rescue => e
  "error #{e.message}"
end

target = ARGV[0]
COUNT.times do
  t0 = Time.now
  result = ping(target)
  t1 = Time.now
  puts "#{result}  #{t1 - t0} sec"
  sleep INTERVAL
end
```

実行結果は以下のようになります。

```
./http_ping.rb http://qiita.com

200 OK  0.835151 sec
200 OK  0.265178 sec
200 OK  0.22323 sec
200 OK  0.81516 sec
200 OK  0.147743 sec
200 OK  0.159017 sec
200 OK  0.255269 sec
200 OK  0.150393 sec
200 OK  0.173694 sec
200 OK  0.265928 sec
```
ddの進捗を確認

## gz圧縮しながらbackup

```bash:gz圧縮しながらbackup
dd if=/dev/sda | gzip -c  > sda_dd.gz
```

```bash:gz圧縮からリストア
gzip -dc < mmcblk0.img.gz | dd of=/dev/mmcblk0
```

## gz圧縮しながらbackup (2GBに分割)

```bash:バックアップ
dd if=/dev/sda | gzip -c | split -b 2000m - sda_gz.
```

```bash:リストア
cat sda_gz.* | gzip -dc | dd of=/dev/hda
```


## lzop圧縮しながらbackup (2GBに分割)

```bash:lzop圧縮しながらbackup
dd if=/dev/sda | lzop -c | split -b 2000m - sda_lzop.
```

```bash:lzop圧縮からリストア
cat sda_lzop.* | lzop -dc | dd of=/dev/hda
```

## 無圧縮

```bash:backup
dd if=/dev/sda of=sda_dd.dump
```

```bash:2GBの分割しながらbackup
dd if=/dev/sda  | split -b 2000m - sda_dd.
```

```bash:restore
cat sda_dd.* | dd of=/dev/sda
```


## 進捗を確認

* macは非対応（pkillするとddが終了する）

```bash:ddにUSR1シグナルを送る
$ sudo pkill -USR1 dd
```

もしくは

```bash:
# watch -n 60 pkill -USR1 dd
```

```bash:ddが進捗を教えてくれる
7331997+0 レコード入力
7331997+0 レコード出力
3753982464 バイト (3.8 GB) コピーされました、 47.4967 秒、 79.0 MB/秒
9861058+0 レコード入力
9861058+0 レコード出力
5048861696 バイト (5.0 GB) コピーされました、 63.5013 秒、 79.5 MB/秒
10405480+0 レコード入力
10405480+0 レコード出力
5327605760 バイト (5.3 GB) コピーされました、 65.1653 秒、 81.8 MB/秒
```

自分の経験では1GB/分程度。
定期的に送るにはwatch使うと簡単。

```bash:60秒間隔で実行
% watch -n 60 "pkill -USR1 dd"
```


## ddで作成したイメージをマウント

```bash:
$ fdisk -u -l sda_dd.dump

ディスク sda_dd.dump: 4012 MB, 4012900352 バイト
ヘッド 255, セクタ 63, シリンダ 487, 合計 7837696 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x00014d35

デバイス ブート 始点 終点 ブロック Id システム
sda_dd.dump1 8192 122879 57344 83 Linux
sda_dd.dump2 122880 7774207 3825664 83 Linux
```

```bash:offsetを指定する
$ sudo mount -o loop,offset=$((512*122880)) sda_dd.dump /mnt
```

```bash:エラーをスキップする場合
$ sudo dd if=/dev/sdd of=sdd.img bs=512 conv=noerror,sync
```

bsは読み取りエラーが発生した時スキップするサイズ。
cygwinで「`setup.ini' というファイルはありません。  Error updating setup.ini, reverting」の対処法

apt-cyg updateがエラーを吐くようになってしまいました。

`apt-cyg update -m ftp://ftp.jaist.ac.jp/pub/cygwin`

```
--2013-08-06 03:16:15--  ftp://ftp.jaist.ac.jp/pub/cygwin//setup.ini
           => `setup.ini'
==> CWD は必要ありません。
==> SIZE setup.ini ... 完了しました。
==> PASV ... 完了しました。    ==> RETR setup.ini ...
`setup.ini' というファイルはありません。

Error updating setup.ini, reverting
```

## 原因

恐らくですが、2013年7月ごろにCygwin64bit版がリリースされた関係で、32bit版と64bit版を別々に提供するためにレポジトリのURLが２つに分かれたのが原因と思われます。

* 旧 ftp://ftp.jaist.ac.jp/pub/cygwin/

↓

* 32bit版 ftp://ftp.jaist.ac.jp/pub/cygwin/x86/
* 64bit版 ftp://ftp.jaist.ac.jp/pub/cygwin/x86_64/


## 解決方法

apt-cygを下記のように書き換えたら解決しました。

なお、64bit版のCygwinをお使いの場合は"X86_64"にしてください。


```diff
--- apt-cyg.orig        2013-08-06 03:24:45.062574000 +0900
+++ apt-cyg     2013-08-06 03:22:53.877214600 +0900
@@ -95,14 +95,14 @@
   then
     touch setup.ini
     mv setup.ini setup.ini-save
-    wget -N $mirror/setup.bz2
+    wget -N $mirror/x86/setup.bz2
     if test -e setup.bz2 && test $? -eq 0
     then
       bunzip2 setup.bz2
       mv setup setup.ini
       echo Updated setup.ini
     else
-      wget -N $mirror/setup.ini
+      wget -N $mirror/x86/setup.ini
       if test -e setup.ini && test $? -eq 0
       then
         echo Updated setup.ini
```

## 参考記事

http://www.oki-osk.jp/esc/cyg/cygwin-27.html
nghttp2 を ubuntu でビルド

HTTP2.0 draft-4 対応の nghttp を使うと、 spdylay の http2.0/draft-4 版が試せます。
(さすが tatsuhiro-t さん仕事が早い。。)

で、これを ubuntu でビルドする際のメモ。

https://github.com/tatsuhiro-t/nghttp2


基本の依存は公式に書いてある通り

```shell-session:dependencies
sudo apt-get install -y \
  autoconf              \
  automake              \
  autotools-dev         \
  libtool               \
  pkg-config            \
  zlib1g-dev            \
  libcunit1-dev         \
  libssl-dev            \
  libxml2-dev           \
  libevent-dev
```

で、これでビルドすると src/nghttp2.0 コマンドが出なかった。
-std=c++11 周りでエラー。

単純に gcc を 4.6 から 4.7 に上げてあげればよさそう。

その方法がこの辺にあった。

http://charette.no-ip.com:81/programming/2011-12-24_GCCv47/

```shell-session:gcc4.7
sudo apt-get install -y python-software-properties
sudo apt-get update

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install -y gcc-4.7 g++-4.7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --list gcc
sudo update-alternatives --config gcc
```

それから、以下でビルドすると src 以下に nghttp, nghttpx, nghttpd ができる。

```shell-session:build
autoreconf -i
automake
autoconf
./configure
make
```

gcc-4.6 じゃないと不都合があるなら update-alternatives --config をもう一度やってもどせば良い。
RubyMotion+motion-cocoapodsでXcode5-DPを入れてる場合の注意

xcodebuildに使われるxcodeは確認しようねというメモ。

## 困ったこと
rakeした時に、SimulatorがiOS7になっていたため、configを確認した所、

```shell:
$ rake config
---省略---
xcode_dir              : "/Applications/Xcode5-DP.app/Contents/Developer"
---省略---
```
となっていた。
安直にRakefileに対して、

```ruby:
  app.xcode_dir = '/Applications/Xcode.app/Contents/Developer'
```
を追記したところrakeはうまく動いてくれたのだが、この後motion-cocoapodsを入れた際に10分くらいハマった。
何度rakeしても、

```shell:
$ rake
     Build ./build/iPhoneSimulator-6.1-Development
     Build vendor/Pods
xcodebuild: error: SDK "iphonesimulator6.1" cannot be located.
rake aborted!
Command failed with status (64): [/usr/bin/xcodebuild -project "Pods.xcodepr...]
/Library/RubyMotion/lib/motion/project/vendor.rb:178:in `block in build_xcode'
/Library/RubyMotion/lib/motion/project/vendor.rb:146:in `chdir'
/Library/RubyMotion/lib/motion/project/vendor.rb:146:in `build_xcode'
/Library/RubyMotion/lib/motion/project/vendor.rb:41:in `build'
/Library/RubyMotion/lib/motion/project/builder.rb:59:in `block in build'
/Library/RubyMotion/lib/motion/project/builder.rb:58:in `each'
/Library/RubyMotion/lib/motion/project/builder.rb:58:in `build'
/Library/RubyMotion/lib/motion/project/app.rb:76:in `build'
/Library/RubyMotion/lib/motion/project/template/ios.rb:42:in `block (2 levels) in <top (required)>'
/Library/RubyMotion/lib/motion/project/template/ios.rb:55:in `block in <top (required)>'
Tasks: TOP => build:simulator
(See full trace by running task with --trace)
```
と、iPhoneSimulator6.1を入れてるにもかかわらず見つからないと怒られる。

## 原因と解決策
Xcode5-DP版を入れているMacの場合、デフォルトのxcodeのパスがこのDP版に指定されている。
そのため、rakeした際、rubymotionのプロジェクト自体はXcode.app自体を見に行ってくれているが、cocoapods側はXcode5-DP.app側を見に行っていた模様。

解決策は簡単で、xcode-selectにてきちんとXcodeのパスを指定してあげようという事でした。

```shell:
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
```

Xcode5で開発してもいいんじゃないかという気もする。
bowerにパッケージを公開する方法

bower([http://bower.io/]) はtwitterが作成しているwebapp向けのパッケージ管理ツールです。

bowerへのパッケージ公開はかなり簡単に出来てしまいます。必要なものはgitのレポジトリのみです。
(今日時点(version 1.1.0時点)では、bowerにパッケージ公開するためにアカウント作成等は必要ないようです)

## bowerのインストール
インストールしていなければ、下記のコマンドでインストールしてください。
npm -g install bower

## githubにプロジェクトを作成する
解説不要ですね。ここでは、ユーザ名myAccount、プロジェクト名myProjectで作成したとしましょう。

## bower.jsonを作成する
プロジェクトディレクトリ配下にbower.jsonを作成します。node.jsにおけるpackage.jsonとほぼ同様の書式です。
例：

```json:
{
	"name": "my-project",
	"version": "1.0.0",
	"main": "myProject.js",
	"ignore": [
		".jshintrc",
		"package.json",
		"index.js",
		"test/**"
	],
	"dependencies": [
		"jquery": "latest"	
	]
}
```

必須となるのは、name, version属性のみです。versionはセマンティックバージョン[http://semver.org/] に従って付与する必要があるみたい。

mainには、このパッケージをインストールしたユーザへのエントリポイントとなるファイル名を指定します。JavaScriptのプロジェクトなら、プロジェクトフォルダにおけるライブラリスクリプトへのパスを記載しておけばよいでしょう。

ignoreは、公開する必要がないファイルの指定を行います(上記ではnpm系やテスト関連のファイルを除外する設定をしています)

## リリース準備
レポジトリにリリースしたいバージョン名でtagを作成しておく必要があります(bowerはパッケージのバージョン特定にgitのtagを用いている模様)。
git commit
git tag v1.0.0
git push origin v1.0.0

タグ名は, v(バージョン番号)とするのが正しいようです(ドキュメントからの確認ではないですが、angular.js等にならいました)。

## いざ、リリース!
bowerのregisterコマンドを利用します。引数1にパッケージ名称(bower.jsonのname属性値), 引数2にgitのエンドポイントを指定します。
bower register my-project git://github.com/myAccount/myProject.git

コマンドを実行すると、
Registering a package will make it visible and installable via the registry.
Proceed (y/n)? 

と入力を求められるので、素直にyを入力しましょう
## 確認してみる
bower serach パッケージ名

や

bower info パッケージ名

や

bower install パッケージ名

を使って確認してみましょう。registerコマンドが成功すれば、即時反映される模様です。
textレイヤーの数字を徐々に変化させるAEのexpression

AfterEffectsのjsをベースとしたスクリプト言語expressionにて
textレイヤー内の数字を次の数字まで徐々に加算or減算していくスクリプトです。
例えば500から徐々に700までいって、200に減ってくだとか。
アニメーションプリセットに見つからなかったので勉強がてら作成。


## 1.とりあえずexpression動かしてみる
タイムラインウィンドウにて
テキスト / ソーステキスト　横のタイムウォッチを option + click しexpression画面を出します。
簡単に言うとexpressionは最後の行の値がプロパティにリターンされます。
ここに

```js:
"200"
```

と入力するとtextレイヤーに200が表示されます。
returnしないんです。なかなか慣れません。


## 2.トリガー
起動トリガーを何にするか。
キーフレームやスクリプトに直で記入するのは調整作業が死ねるのでレイヤーのタイムマーカーをトリガーとします。
レイヤーのタイムラインにコメント付けれるやつです。

早速作ってみます。
お好みの時間でレイヤーを選び
　レイヤー / マーカーを追加
でタイムマーカーが作成できます。
その時、コメントにその時にゴールとなる数字を入れます。
試しにこんな感じに作りました。
![スクリーンショット 2013-08-06 0.01.14.png](https://qiita-image-store.s3.amazonaws.com/0/12153/eff69f8b-f98e-8e37-8981-3444a5237113.png)
かんたんかんたん。


## 3.骨組み
とりあえずマーカーを二つ取得して中間のタイムラインを徐々に変化させて行きましょう。

```js:
var layIn = thisLayer.marker.key(1);
var layOut = thisLayer.marker.key(2);
var dispText = Number(layIn.comment);

if(layIn.time < time && time <= layOut.time){
  var timeSpan = layOut.time - layIn.time;
  var timeStep = (time - layIn.time) / timeSpan;
  var numSpan = layOut.comment - layIn.comment;
  dispText = parseInt(Number(layIn.comment) + numSpan * timeStep);

}else if(layOut.time < time){
  dispText = layOut.comment;
}
dispText;
```

こんな感じになりました。
timeはglobal変数で現在の時間を示しています。
はじめのコメント100と500の中間のタイムラインで数字が変化しているはずです。



## 4.汎用化
何度か数字を変化させたいので、もうちょっといじります。

```js:
// 前マーカーのindexを取得
var getNowIndex =function(){
  // 今のタイムラインに一番近いマーカーを取得
  var m = thisLayer.marker.nearestKey(time);
  var nowIndex;
  // nearestKeyが前後関係なく近いマーカーを取ってしまうので、
  // 前のマーカーを返すようにごにょごにょする
  if(m.time < time){
   nowIndex = m.index;
  }else{
   nowIndex = m.index -1;
  }
  return nowIndex;
};

// 表示textを取得
var getDispText = function(nowIndex){
  var layIn = thisLayer.marker.key(nowIndex);
  var layOut = thisLayer.marker.key(nowIndex + 1);
  var dispText = layIn.comment;
  if(layIn.comment == layOut.comment){
    return dispText;
  }
  if(layIn.time < time && time <= layOut.time){
    var timeSpan = layOut.time - layIn.time;
    var timeStep = (time - layIn.time) / timeSpan;
    var numSpan = layOut.comment - layIn.comment;
    dispText = parseInt(Number(layIn.comment) + numSpan * timeStep);
  }else if(layOut.time < time){
    dispText = layOut.comment;
  }
  return dispText;
};

// main logic
var maxIndex = thisLayer.marker.numKeys;  // マーカーの総数を取得
if(1 < maxIndex){
  var nowIndex = getNowIndex();
  if(nowIndex < 1)nowIndex = 1;
  if(nowIndex < maxIndex){
    getDispText(nowIndex);
  }else{
    thisLayer.marker.key(maxIndex).comment;
  }
}
```

こんな感じになりました。
もーちょい綺麗に書けそう。

また今のスクリプトだと等速で数字が変化しているので

```js:
ease(t, tMin, tMax, value1, value2);
easeIn(t, tMin, tMax, value1, value2);
easeOut(t, tMin, tMax, value1, value2);
```

のような関数を使っていくと手軽にeaseかけれますのでお試しあれ。

はじめてタイムマーカーを使いましたが色々捗りそうな予感です。
おわり
アーカイブ済みバイナリのプロビジョニングを確認する


XcodeからAdHocビルドしてアーカイブした際にiPhone実機にアプリをインストール出来ないことがあった（実機上で＜アプリ名＞はインストール出来ません、というアラートが出てiTunesからのインストールが出来ない）。そういう時は大抵プロビジョニングプロファイルが間違っているとは思うけど、実際にアーカイブされたipaファイルのプロビジョニングを確認する方法をメモしておく。

まずipaファイルをunzipする。HogeApp_adhocというファイル名の場合は

    unzip HogeApp_adhoc.ipa


[ipaファイルはzip圧縮されたファイルでDRMにより保護された書庫ファイル、unzipコマンドでなくてもファイル拡張子を.zipなどにすればFinderから展開できるらしい](http://s.iwire.jp/news/2011/05/17/002/index.html)。しらんけど。

unzipするとPayloadディレクトリの下にappファイルがある。

Payload/HogeApp_adhoc.app


appファイルはアプリケーションパッケージなので、その下には画像などのリソースがあり、その中にあるembedded.mobileprovisionを開くとプロビジョニングが指定されている。例えばデバッグ用のプロビジョニングHogeApp_Debugを指定してビルドしていれば以下のようにXMLにより記述されている

	<string>HogeApp_Debug</string>
	<key>ProvisionedDevices</key>

非開発者端末にAdHocビルドしてアプリをインストールしたかったので、プロビジョニングはDevelopmentのHogeApp_DebugではなくDistributionのものを選ぶべきだった事に気づいてビルドしなおしたら解決。

Apple公式のリファレンス「iOS Code Signing Troubleshooting」が一番詳しく書いてた
http://developer.apple.com/library/ios/#technotes/tn2250/_index.html

上記これがどういう時に役立つかというと、自分以外の誰かにAdHocビルドをお願いしてipaファイルが送られてきた場合、それが正しいプロビジョニングプロファイル（具体的には証明書、AppID、デバイスの組み合わせ）であるかどうかを確認するのに役立つと思う。いや、そこまで出来るならソースコードもらってXcodeでビルドし直そうよと思わないでもない。しらんけど。

## 参考URL

“The executable was signed with invalid entitlements.” の対処方法
http://blog.fenrir-inc.com/jp/2012/02/the-executable-was-signed-with-invalid-entitlements.html

φ(.. )ﾒﾓｼﾃｵｺｳ　iOS、Androidバイナリに対してコード署名
http://kernhack.hatenablog.com/entry/2013/05/21/233009

iOS アプリのprovisioning profile差し替え方法
http://labs.septeni.co.jp/?p=815
標準入力から Bash script を実行する場合に引数を渡す方法

※正解はコメントの中にありますので、そちらもご確認ください。

Bash に標準入力からスクリプトを読ませた場合に引数を渡す方法

何も考えずに実行すると

```bash
$ echo 'echo $1; echo $2' | bash hoge fuga
bash: hoge: No such file or directory
```

と、「hoge」を開こうとして失敗する。なるほど、こんな場合は普通「-」だよねぇと知ったかぶりで実行すると

```bash
$ echo 'echo $1; echo $2' | bash - hoge fuga
bash: hoge: No such file or directory
```

ぇぇぇ！！
そうかぁ、これでもダメなのかぁ。
正解は /dev/stdin でした。

```bash
$ echo 'echo $1; echo $2' | bash /dev/stdin hoge fuga
hoge
fuga
```

以上 github から curl でそのまま bash に渡そうとしてハマった記録でした。
Rails アプリケーション設計の鉄則


別に Rails に限った話じゃないが．優先順位の高い順に.


* モデルとリレーション(つまりER図)を完成させる

そして，決して変更しない！カラムの改廃ぐらいは良いが，モデルには一切変更を加えない．理由は単純で，途中で変更すると Controller も View も大幅に変更したり捨てたりするロスが生じるため．

* UIを考える

デザインとか，画面遷移とか，入力フォームの使い勝手とか．
とりあえず実装方法は後で考えるとして，インターフェイスとして優れたものを考える．ここで妥協すると，プロダクトのクオリティの低さにもやる気が殺がれること夥しい．

* 欲しい機能を実現する Gem を考える

ここんところは純粋に情報収集力と経験則の問題になるが．プログラミングの省力化のために非常に重要な要素である．
Gaucheクラス定義

クラス定義と使い方  
少しずつ育てていきます

### define-class : クラス定義
```
#クラス名には<>を付けることが多い？
(define-class <Person>()
     ((first-name)
      (last-name)))
```

### make : インスタンス作成

```
(define myself (make <Person>)) 
```

### slot-set! : slotの設定

```
(slot-set! myself 'first-name "太郎")
```

### slot-ref : slotの参照

```
(slot-ref myself 'frist-name)
```
iPhoneアプリ リジェクト事例


## アプリがシンプルすぎる
### リジェクト理由
>2.12
>We found that your app only provides a very limited set of features. It only is a 3D image viewer app and there are no other user functionality. While we value simplicity, we consider simplicity to be uncomplicated - not limited in features and functionality.

>We understand that there are no hard and fast rules to define useful or entertaining, but Apple and Apple customers expect apps to provide a really great user experience. Apps should provide valuable utility or entertainment, draw people in by offering compelling capabilities or content, or enable people to do something they couldn't do before or in a way they couldn't do it before.

翻訳参考
http://okwave.jp/qa/q7782382.html

### 対応
アプリのコンセプトが理解されていないようなのでApp Review Boardで上告。Review Boardからは1週間程度で返事がくるようです。
現在返答待ち。

## iCloudへのバックアップファイルが大きすぎる
### リジェクト理由

>2.23
Additionally, we found that your app does not follow the iOS Data Storage Guidelines, which is required per the App Store Review Guidelines.

>In particular, we found that on launch and/or content download, your app stores 117.47 MB. To check how much data your app is storing:

>- Install and launch your app
- Go to Settings > iCloud > Storage & Backup > Manage Storage 
- If necessary, tap "Show all apps" 
- Check your app's storage

### 対応
保存するファイルをiCloudのバックアップ対象外にしました。

参考)
http://d.hatena.ne.jp/mmasashi/20111129/1322581820


## アプリが落ちる(審査ミス)
### リジェクト理由
アプリがクラッシュする
### 対応
アプリが落ちない状態を撮影した動画を自分のサイトにアップしResolution CenterにURLをアップ。
無事リリースできました。

## 曲を使ってカラオケするアプリはリジェクト
### リジェクト理由
うろ覚えです。

### 対応
Appleから電話がありました。Sonyのウォークマン等にも似たような機能はあり同様の機能をもったアプリが既にあることを説明して無事リリースできました。


## DRMの説明があるアプリはリジェクト
###リジェクト理由
DRMの説明ページ(Wikipedia)へのリンクをはっていたらリジェクトされました。
当時、iTunesの曲はDRMプロテクトされていてイメージが悪くなってしまうからかもしれません。

### 対応
リンクを削除


## 著作権によるリジェクト
### リジェクト理由
Google検索で歌詞を表示していた為にリジェクトされました。

### 対応
JASRAC、e-license、JRCと契約し独自に歌詞表示するようにしました。

## エロによるリジェクト
### リジェクト理由
アプリ内で使用する声が卑猥であるという理由でリジェクトされました。

### 対応
声をいくつか減らして対応。無事アプリをリリースできました。
iPhone端末とかのパケットキャプチャ

出来るとは聞いていたけど、やってみたら簡単さに感動したのでメモw
詳細は以下に書いてある。
[QA1176 Getting a Packet Trace](https://developer.apple.com/library/ios/#qa/qa1176/_index.html)

まとめると、以下

1. Macを用意する
1. Xcode(4.2以降)をインストールする
1. iPhoneやiPadなどの端末(iOS5以降)をMacに接続する
1. iPhoneデバイスの仮想インターフェイス(Remote Virtual Interface)を作成する
1. 仮想インターフェイスをキャプチャする
1. 仮想インターフェイスを破棄する

# 以下appleサイトからの引用

## 仮想インターフェイス作成

>$ # First get the current list of interfaces.
>$ ifconfig -l
>lo0 gif0 stf0 en0 en1 p2p0 fw0 ppp0 utun0
>$ # Then run the tool with the UDID of the device.
>$ rvictl -s 74bd53c647548234ddcef0ee3abee616005051ed
> 
>Starting device 74bd53c647548234ddcef0ee3abee616005051ed [SUCCEEDED]
> 
>$ # Get the list of interfaces again, and you can see the new virtual
>$ # network interface, rvi0, added by the previous command.
>$ ifconfig -l
>lo0 gif0 stf0 en0 en1 p2p0 fw0 ppp0 utun0 rvi0

* -sで指定しているのは端末のidentifier
 * 色々確認方法はあると思うが、今回はOrganizerで端末のidentifierを確認

## キャプチャ開始

>$ sudo tcpdump -i rvi0 -n

* 後で、wiresharkで読み込んだりするのなら、-wでファイルに書き出すと良いかも
* buffer sizeを変更してないとイケナイ場合は、-Bとか
  * パケットサイズが大きい時とか！

* 個人的には結局以下のコマンドを叩いた

```
$ sudo tcpdump -i rvi0 -n -w hoge.pcap
```

## 仮想インターフェイスの破棄

>$ rvictl -x 74bd53c647548234ddcef0ee3abee616005051ed
> 
>Stopping device 74bd53c647548234ddcef0ee3abee616005051ed [SUCCEEDED]

# まとめ

* すごい便利（´ω｀
* そして、これが出来るようになったら以下のような事を検索する事になるのかな〜？（＝w＝
 * [tcpdump + wireshark で https な通信を解読する](http://qiita.com/ywatai@github/items/baddcf6988ec1f6ac014)

僕は、未だに解読出来る事の方が少ないですけどね（＾q＾；
iOS ユニークなファイル名をつける


「hoge_file.txt」というファイル名が既にあった場合は「hoge_file-2.txt」になります。

```objectivec:呼び出し側

NSString *uniqueFileName = [HogeUtil getUniqueFileNameInDocumentDirectory:@"hoge_file" type:@"txt"];

```

```objectivec:HogeUtil.m
+ (NSString*)getUniqueFileNameInDocumentDirectory:(NSString*)_name type:(NSString*)_type {
    
    NSArray *filePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask,YES);
    NSString *documentDirectory = [filePaths objectAtIndex:0];
    
    NSString* fileName = [NSString stringWithFormat:@"%@.%@", _name, _type];
    
    NSString *filePath = [documentDirectory stringByAppendingPathComponent:fileName];
    
    int i = 1;
    
    while ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        ++i;
        filePath = [NSString stringWithFormat:@"%@/%@-%d.%@", documentDirectory, _name, i, _type];
        fileName = [NSString stringWithFormat:@"%@-%d.%@", _name, i, _type];
    }
    
    return fileName;
}
~~~
finishしたらリモートブランチは全部消す

git flowでpublishすることでコードレビューの流れを構築することができたわけだが、しかしgit flow finishしても一度publishしたブランチは消えはしない。手動で消す事はできるけど、まあ、忘れますよね。
そこで、すでにマージ済のブランチは容赦無く消えて頂く事にした。慈悲など無い。

もう既にマージされたが残っているリモートブランチに、順番に虚無を送り込んで消して行く

```bash:
git branch -r --merged | grep -o "feature\/.*" | while read BRANCH; do git push origin :${BRANCH}; done; unset BRANCH;
```

全部とか言いつつfeature/ブランチに限定しているわけですが。（masterとか消されても困る）

今回はgrepを省くとブランチ名が```origin/feature/***```のようになってしまい消せない。grepは対象の絞り込みのみならずこのorigin/というワードを取り除くのにも活用されます。
Ruby で FizzBuzz をがんばって短くしてみたが100バイトが限界だった件


```ruby:
s,e=ARGV.map(&:to_i)
s.upto(e){|x|{15=>"FizzBuzz",5=>"Fizz",3=>"Buzz",1=>x}.find{|k,v|x%k==0&&p(v)}}
```
かろうじて100バイト。
達人は60バイトを下回るという。

- http://qiita.com/mEGGrim/items/e69778ce6a6d40c361d0

恐るべし。
Ruby で無名 lambda 再帰


ラムダ式を再帰させたいと思ったことは誰にでもあると思います。

そんな時、以下のような Proc オブジェクト拡張を行います。

```ruby:
class Proc
  def self_curry
    self.curry.call(self)
  end
end
```

すると、lambda のオブジェクトに `sef_curry` メソッドが追加されるので、xの階乗を求める無名関数は以下のように書けます。

```ruby:
lambda{|f,x| x == 1 ? 1 : x * f.call(f, x-1) }.self_curry.call(5)
 => 120
```

すばらしい。

第一引数として「自分自身」を受け取る無名関数となっているのがポイントです。

`self_curry` の呼び出しによって python のメソッドっぽく自分自身が第一引数にバインドされるようになります。
Kobito と Qiita 導入


最近流行の Markdown エディタ Kobito と同期先の Qiita 導入してみた。

- http://kobito.qiita.com

Kobito で書いて、`Ctrl + Command + S` "Qiitaに投稿" で投稿される。

すごく便利だけど、ローカル側は管理機能がとても貧弱です。
phpdocumentorのcomposer install時のエラー解消

```javascript:composer.json
{
  "require-dev": {
    "phpdocumentor/phpdocumentor": "*"
  }
}
```

    $ composer install --dev
    Loading composer repositories with package information
    Installing dependencies (including require-dev)
    Your requirements could not be resolved to an installable set of packages.

      Problem 1
        - Installation request for phpdocumentor/phpdocumentor * -> satisfiable by phpdocumentor/phpdocumentor[v2.0.0].
        - phpdocumentor/phpdocumentor v2.0.0 requires phpdocumentor/graphviz 1.*@beta -> no matching package found.

    Potential causes:
     - A typo in the package name
     - The package is not available in a stable-enough version according to your minimum-stability setting
       see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details.

    Read <http://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.


```javascript:composer.json
{
  "require-dev": {
    "phpdocumentor/phpdocumentor": "*"
  },
  "minimum-stability": "dev"
}
```

    $ composer install --dev

追記

`"minimum-stability": "dev"`を使用すると全てのライブラリでバージョン指定していないと開発版が入ってしまう。
回避方法は以下。

```js:composer.json
{
  "require-dev": {
    "phpdocumentor/phpdocumentor": "*",
    "phpdocumentor/graphviz": "1.*@beta",
    "phpdocumentor/reflection-docblock": "~2.0@dev"
  }
}
```
iPhone5 4inch対応 メモ


Autolayoutは使わず、Autosizingで既存の3.5inchアプリを4inch対応する時のメモ

1. Default-568h@2x.pngの画像を入れると4inch対応済と認識される
 簡単なUIの場合、ほとんどAutosizingで対応できる。

2. アプリの MainWindow.xib → Windowを選択 → Attributes Inspector →　Windowの『Full Screen at Launch』にチェックを入れる。(Xcodeのバージョンによっては必要ない??)

3. 広告などの下部に表示するUIView対応
Xcodeの右のViewを表示→右から2番目の定規のようなタブを選択→Autosizingで位置を下から指定にする
![kobito.1375927417.005656.png](https://qiita-image-store.s3.amazonaws.com/0/27793/be236394-3d8a-495d-3702-af328d264040.png "kobito.1375927417.005656.png")


例) ソースで変更する場合

```objectivec:
    //iPhone5 4inch 縦長対応 左下隅に固定
    uiview = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

    //iPhone5 4inch 縦長対応 ソース上でピクセル固定で移動させることがある場合
    CGRect mainFrame = [[UIScreen mainScreen] bounds];
    BOOL is568h = mainFrame.size.height == 568.0;
    float offsetY = 0;
    if (is568h) {
        offsetY = 568.0 - 480.0;
    }
    CGRect frame = uiView.frame;
    frame.origin.y = POS_Y + offsetY;
    uiView.frame = frame;
```

1. 背景を引き延ばす
    背景画像を引き延ばす場合、Xcodeの右のViewを表示→右から2番目の定規のようなタブを選択→Autosizingの線を全て選択状態にする。

![kobito.1375927493.410007.png](https://qiita-image-store.s3.amazonaws.com/0/27793/316182a7-7d10-db71-da1e-768fb7581052.png "kobito.1375927493.410007.png")


2. 背景画像の引き延ばす領域を指定したい場合
    capInsetsを使う。

例)

```objectivec:
    //iPhone5 4inch 縦長対応
    UIImage *bgImage = [UIImage imageNamed:@"bg_image.png"];
    bgImage = [bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(113.0, 0, 430.5, 0)];
    [bgImageView setImage:bgImage];
```

1. 背景画面がドットやボーダーの場合
* 背景画像がドット柄などの場合、640x1136の画像のみ用意し、インターフェースビルダーでUIViewのModeを伸縮しないTopやAspect Fill等に変更する。
  ソースで変更する場合はUIView.autoresizingMaskを使う
![kobito.1375927578.072291.png](https://qiita-image-store.s3.amazonaws.com/0/27793/8c532c13-345a-35e6-2e32-b8ed22c968d1.png "kobito.1375927578.072291.png")



## 詳しくはここに書かれています
 *  アプリのiPhone5対応 - http://www.toyship.org/archives/916
 * アプリをiPhone5に対応する場合の地雷ポイント一覧 - http://fladdict.net/blog/2012/09/jirai.html


※注意点
AutolayoutはiOS6で追加された機能の為、使うとiOS5では落ちてしまう。
インターフェースビルダーでAutolayoutをONにする場合、xibを開き
Xcodeの右のViewを表示させ左のタブのUse AutolayoutをONにする
AdMobメディエーション作成手順




2013年7月5日作成

iOSにてAdmobのメディエーションでnend、i-mobile、adMob、iAdを切り替える方法

## サイト登録SDKの入手
* nendにてサイト登録をする
* nendの最新SDKを入手
* i-mobileにてサイト登録をする
* i-mobileの最新SDKを入手
* AdMobにてサイト登録をする
* AdMobにて最新SDKを入手

## AdMobSDKの組み込み 
バージョン GoogleAdMobAdsSdkiOS-6.4.2の場合

* Adというグループを作成
* AdMobというグループをAdグループの中に作成
* AdMobSDKのAdd-ones以外のソースをAdMobグループに追加
* Add-ones内のMediationをAdMobグループに追加
* 必要なlibraryを確認して追加 https://developers.google.com/mobile-ads-sdk/docs/
* TARGETSのBuild SettingsのOther Linker Flagsに-ObjCを追加
* ビルド時にエラーが発生しないことを確認

## NendSDKの組み込み
バージョン NendSDK_iOS_2.1.0の場合

* NendというグループをAdグループの中に作成
* NendAd内のソースをNendグループに追加
* AdSupport.framework、Security.frameworkを追加
* ビルド時にエラーが発せしないことを確認

## i-mobileの組み込み
バージョン 1.4.0_aの場合

* imobileというグループをAdグループの中に作成
* src以外のソース(フレームワーク)をimobileグループに追加
※既にASIHTTPRequest.frameworkやJSONKit.frameworkを入れている場合は取り除く
* CFNetwork.framework、libz.dylib、MobileCoreServices.framework、SystemConfiguraion.framework 、AdSupport.frameworkを追加
(前手順でたぶん全部入れている)
* TARGETSのBuild SettingsのOther Linker Flagsに-ObjCを追加 (AdMobの時に追加してるはず)

## iAdの取り込み
* iAd.frameworkを追加

## Mediation用Adapterの取り込み
https://developers.google.com/mobile-ads-sdk/docs/admob/mediation-networks

* 上記のURLからiAdのAdapterをダウンロード
* AdMob_iAdAdapterというグループをAdグループ内に作成
* libAdapterIAd.aをAdMob_iAdAdapterグループ内に追加

## Mediationの設定
* AdMobのサイトでMediationの設定を行う
  AdMob Network、Nend、i-mobile、iAd
  Publisher IDは追加したいアプリにする。日本語は文字化けしているので注意
  NendのSpot ID、API Key、i-mobileのPublisher ID、Media ID、Spot IDを追加(i-mobileのカテゴリの設定と広告枠の設定を行う)

## コード追加
* 以下をimport

```objectivec:
#import "GADBannerView.h"
#import <iAd/iAd.h>
```

* メンバ変数を追加

```objectivec:
GADBannerView *bannerView_;
```

* viewDidLoadに以下のソースを追加

```objectivec:
    //広告用 AdMobここから
    
    
    // Create a view of the standard size at the top of the screen.
    // Available AdSize constants are explained in GADAdSize.h.
    bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
    
    // Specify the ad's "unit identifier." This is your AdMob Publisher ID.
    bannerView_.adUnitID = @"パブリッシャーID";
    
    // Let the runtime know which UIViewController to restore after taking
    // the user wherever the ad goes and add it to the view hierarchy.
    bannerView_.rootViewController = self;
    
    CGRect frame = bannerView_.frame;
    CGRect viewFrame = [[UIScreen mainScreen] applicationFrame];
    frame.origin.y = viewFrame.size.height ## frame.size.height;
    bannerView_.frame = frame;
    
//    UIView *testView = [[UIView alloc] initWithFrame:frame];
//    [testView setBackgroundColor:[UIColor redColor]];
//    [self.view addSubview:testView];
    
    [self.view addSubview:bannerView_];
    
    // Initiate a generic request to load it with an ad.
    [bannerView_ loadRequest:[GADRequest request]];
    
    //広告用 AdMobここまで
```
【HTML】要素を画面の中央に表示する

よく忘れがちなのでメモメモ・・・

要素を水平に中央に表示するには、text-aling: centerがあるけど、垂直ってなるとなかなかこれといった方法がないですよねー。
今回、メモするのはいろいろと方法がある中ですごくシンプルな方法です。

```html:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html, body {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}
html {
  display: table;
}
body {
  display: table-cell;
  text-align: center;
  vertical-align: middle;
}
</style>
</head>
<body>
<div>
<p>中央？</p>
</div>
</body>
</html>
```
Unity3Dで、スクリプトからカメラを新規作成する

Projectビューで、Assetsを右クリック->Create->FolderでEditorというフォルダを作成して、
そこに以下の内容で、MyMenu.csというスクリプトファイルを作成する。


```csharp:MyMenu.cs
using UnityEditor;
using UnityEngine;

public class MyMenu : MonoBehaviour
{
	private  static Camera _cam;

	//  Add a menu item named "Create/Camera" to McGUI in the menu bar.
	[MenuItem ("MyMenu/Create/Camera")]
	static void CreateCamera ()
	{
		GameObject obj = UnityEditor.EditorUtility.CreateGameObjectWithHideFlags("Camera", HideFlags.None, typeof(Camera));
		_cam = obj.camera;
	}
}
```

すると、Unityのメニューに"MyMenu"が現れるので、
MyMenu->Create->Camera
を選択することによりカメラが作成される。
base64とbinの変換

```rb:
# 対象ファイルを読込バイナリで開き、pack('m')でBase64にし出力先に書きこむ
require 'pathname'
open(Pathname(ARGF.filename).sub_ext(".txt").to_s, "w").write([open(ARGF.filename, "rb").read].pack('m'))
```

```rb:
# 対象ファイルを開き、unpack('m')[0]でバイナリにし出力先に書きこむ
require 'pathname'
open(Pathname(ARGF.filename).sub_ext(".bin").to_s, "wb").write(File.read(ARGF.filename, :encoding => Encoding::UTF_8).unpack('m')[0])
```
UITableViewのページング(最下部セルまでスクロールしたら次の○件読み込んで表示)方法

![scroll.png](https://qiita-image-store.s3.amazonaws.com/0/27785/4cb912c4-aab0-5610-713b-8028f5ff2f37.png)
アプリで結構見かける？TableViewの最下部までスクロールしたら次の○件を自動で取得して表示するやつです。
次の○件を読み込むタイミングは一番下までスクロールしたかどうか判定すれば良いです。
これはUITableViewに内包されているUIScrollViewのデリゲートで判定します。

#実装
```objc::

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //一番下までスクロールしたかどうか
    if(self.tableView.contentOffset.y >= (self.tableView.contentSize.height - self.tableView.bounds.size.height))
    {   
      //まだ表示するコンテンツが存在するか判定し存在するなら○件分を取得して表示更新する
    }
}

```

#サンプルコード
[https://github.com/hachinobu/LoadMoreTableView](https://github.com/hachinobu/LoadMoreTableView "https://github.com/hachinobu/LoadMoreTableView")
FreeBSDからBitbucketを利用するための手順


## 1. はじめに

FreeBSDからBitbucketのリポジトリにアクセスするための手順について記述します。

## 2. 前提条件

* FreeBSDのバージョンが9.0であること。

* FreeBSDにgitがインストールされていること。(gitがインストールされていない場合はportsを使ってインストールすること。)

```sh
# cd /usr/ports/devel/git
# make install clean
```

## 3. 手順

(1)  以下のコマンドを実行して、公開鍵と秘密鍵を作成します。(パスフレーズの入力を2回求められるので、任意のパスフレーズを入力します。)

```sh
# cd ~/.ssh/
# ssh-keygen -t rsa -f bitbucket.org -C "(bitbucketに登録しているメールアドレス)"
Generating public/private rsa key pair.
```

(2) /etc/ssh/ssh_config に以下の内容を追加します。

```
Host bitbucket.org
  User git
  Port 22
  Hostname bitbucket.org
  IdentityFile ~/.ssh/bitbucket.org
  TCPKeepAlive yes
  IdentitiesOnly yes
```

(3) BitbucketのWebサイトにアクセスし、ログイン後、「Manage account」をクリックします。

(4) Account画面が表示されるので、「Account Settings」から「SSH keys」をクリックします。

(5) SSH keys画面が表示されるので、「Add key」をクリックします。

(6) Add SSH keyダイアログが表示されるので、「Key*」の項目に以下のコマンドを実行して表示された内容をコピーして貼付けます。

```sh
# cat ~/.ssh/bitbucket.org.pub
ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX... (bitbucketに登録しているメールアドレス)
```
(7) Add SSH keyダイアログで「Add key」をクリックします。

(8) 以下のコマンドを実行して、sshでの接続設定が正しいことを検証します。

```sh
# ssh -T git@bitbucket.org
```

実行後、以下のメッセージが表示されること。

```
conq: logged in as (Bitbucket上のユーザーID).
You can use git or hg to connect to Bitbucket. Shell access is disabled.
```

(9) 以下のコマンドを実行して、ssh-agent を起動します

```sh
# eval `ssh-agent`
```

(10) 以下のコマンドを実行して、ssh-agent が起動していることを確認する。

```sh
# ssh-agent
setenv SSH_AUTH_SOCK /tmp/ssh-LAdoXJd6xghL/agent.1765;
setenv SSH_AGENT_PID 1766;
echo Agent pid 1766;
```

*) PIDは任意となります。

(11) 以下のコマンドを実行して、秘密鍵とパスフレーズを登録します。(パスフレーズの入力を求められるので、(1)で入力したパスフレーズを入力します。)

```sh
# ssh-add ~/.ssh/butbucket.org 
```

(12) 以下のコマンドを実行して、秘密鍵とパスフレーズが登録されていることを確認します。

```sh
# ssh-add -l
```

(13) git clone コマンド等を使って、Bitbucketに作成したリポジトリにアクセスできるかを確認します。

## 4. その他

* ssh-agentの起動とssh-addを実行しないと、「Permission denied (publickey). fatal: The remote end hung up unexpectedly」というエラーがBitbucketのリポジトリ接続時に発生する。

(参考サイト)
http://sseze.hatenablog.com/entry/2013/01/03/155711
AWSのRegion間で共通なKey Pairを用いる

AWS EC2のKey PairはRegion間で別管理になるが、ImportすることでRegion間で共通なKey Pairを利用出来る。
ここではManagement ConsoleでRegion間で共通なKey Pairを用いるための手順をメモする。

## 利用手順

* あるRegionのEC2 Management ConsoleのKey PairsでCreate Key Pairし秘密鍵をダウンロードする
* ローカル環境で秘密鍵から公開鍵を生成する

```bash:
 $ ssh-keygen -y -f [ダウンロードした秘密鍵]
```

 * 別のRegionのEC2 Management ConsoleのKey PairsでImport Key Pairする
  * Keypair Nameには適当な名前を入れる
  * Public Key contentsには1つ前の手順で表示された文字列を入れる

 * ImportしたKeyを使用したEC2にダウンロードした秘密鍵でアクセス出来る