OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリを開発する前に読んでくべきドキュメント


Appleの開発者用ドキュメントは実によくまとまっています。
うれしいことに日本語訳も用意されていますが、残念ながら翻訳が必要なためすべてが最新であるというわけではありません。
しかし根底の部分についてかかれているものに関しては最新でなくてもさほど影響はないでしょう。

# [Objective-C プログラミングの概念](https://developer.apple.com/jp/devcenter/ios/library/documentation/CocoaEncyclopedia.pdf)

Objective-CとCocoa / Cocoa Touchフレームワークを使う上でのデザインパターンについて書かれています。
MVC(Model-View-Controller)はもちろんのこと、Foundationフレームワークで多用されているクラスクラスタについても記述があります。
アプリケーションを作る上で必要となるほぼすべての基礎が記述されていますが、実に様々なデザインパターンや手法があるため必要最低限のもののみ記述されていると思って下さい。
もちろんポイントは押さえられているので、概念的なものを頭に入れておくくらいの気持ちでまず最初に読んでみてください。
もしよくわからない部分が出てきたら、他の書籍を読んだり調べたりして知識を深めましょう。

# [Cocoa向けコーディングガイドライン](https://developer.apple.com/jp/devcenter/ios/library/documentation/CodingGuidelines.pdf)
Appleが薦める命名規約が載っています。
AppleのサンプルコードやAPIのメソッド名などをみると一定の規則に則って書かれているのがわかるでしょう。
この命名規約を守る義務はありません。守らなくともプログラムは動きます。
しかしある一定の規模になった場合や、他の人にソースを公開する必要が出てきたときにソースが読みづらくなったりして困ることになります。
Appleがオープンにこの命名規約を用意しているということは、開発者全員がこれに準拠するかたちでコーディングをすることにより、誰がみても混乱することなくソースをみる、もしくはライブラリのAPIを使うことができるということです。
このドキュメントで提示されていない規則については他人のソースをみたり、あるいは自分で一定のルールを作りコーディングすると良いでしょう。

# [キー値監視プログラミングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/KeyValueObserving.pdf)
KVO (Key-Value Observing)について書かれています。
プロパティの値が変わったときに、通知をして欲しいときに使う仕組みです。
たとえばModelのプロパティが変わった時点でControllerがその状態を知りたいときなどに使います。
それほど難しいものでもありませんので、目を通しておいてください。

# [iOS View Controller プログラミングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/ViewControllerPGforiOS.pdf)
View Controllerの概念やView Controllerで処理すべきことなどが書かれています。
今のiOSのプログラミングで欠かすことのできないストーリーボードについてもここで簡単に書かれています。
View Controllerはストーリーボードを使わずともインスタンスは生成できますが、そういう部分についても記載されています。
View Controllerではなにをすべきなのか？という基礎部分についてしっかり書かれていますのでMVCに沿ってコーディングする上で必要な知識となるでしょう。

# [iOS View プログラミングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/ViewPG_iPhoneOS.pdf)
MVCのVにあたるViewの概念や操作方法、アニメーションについて書かれています。iOSのアプリでは普段あまり気にすることの無いWindowについての記述もあり、どのような構成でViewが表示されているのかという部分についても知ることができるでしょう。

# その他のドキュメント
日本語のドキュメントは[こちら](https://developer.apple.com/jp/devcenter/ios/library/japanese.html)にあります。
英語とセットになっており公開日も表示されているので、翻訳前なのかどうかがわかりやすいです。
また上記であげたドキュメントの他にも沢山公開されています。
どれも有用なドキュメントですが全部読まなくちゃ！と思っても辛いだけです。自分のアプリで使う技術や興味のあるものから順に読んでいき、知識を付けていきましょう。
SDK7.1 + iOS7.1でUILabelのcornerRadiusの挙動が変わった


UILabelの角を丸くするために`cornerRadius`を設定していたのですが、SDK7.1を使ってコンパイルしてiOS7.1の環境で動作させると挙動が変わるようです。

```objectivec:サンプルコード
	UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 45, 130, 30)];
    label.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8];
    label.textColor = [UIColor whiteColor];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = @"Takabo Soft";
    label.layer.cornerRadius = 15; // ←角丸
    [self.view addSubview:label];
```

各OSでの実行結果：
![label.png](https://qiita-image-store.s3.amazonaws.com/0/31347/173e5785-7719-8bc8-87e1-2cc054b0e8f1.png "label.png")

回避方法：
クリップしてやれば良さそうです。

```objectivec:サンプルコード
	UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, 45, 130, 30)];
    label.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8];
    label.textColor = [UIColor whiteColor];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = @"Takabo Soft";
    label.layer.cornerRadius = 15;
    label.clipsToBounds = YES;	// ←これ
    [self.view addSubview:label];
```

参考：http://stackoverflow.com/questions/22348353/corner-radius-property-of-uilabel-is-not-working-in-ios-7-1

ちなみに過去のアプリ（SDK7.0でコンパイルしたアプリ）はiOS7.1で実行しても角丸になっていました。
iOS7.1でのiBeaconが改善されまくった話

さくっと本題に入りますね。
#どこが改善されたの？
1. Backgroundで起動していなくても反応するようになった
2. 応答速度が向上した

##Backgroundで起動していなくても反応するようになった
正直なところ、iBeaconってO2Oでものすごく注目を浴びて、もてはやされてきましたが、アプリをフォアグラウンドもしくはバックグラウンドで立ち上げていないといけないなど、色々な制限があり、はいはい解散解散、なムードがあったと思うんですよ。特に最近。
しかし！iOS7.1では、アプリがiBeaconのMonitoringを開始していれば、その後ユーザがアプリを終了させても反応するようになりました。
つまり、

* 一度起動して、そのまま封印していても、
* 意図的、もしくはフリーズなどで再起動しても、
* 電源をオフにして、その後オンにした後でも、

上記のような場合でも、アプリはiBeaconを検知します。すばらしい！

具体的にどのような処理の流れになるかというと、

####アプリが起動していない状態の場合
1. デバイスがregionに入る/出る
2. アプリが自動的にBackgroundで起動する
3. 処理が実行される

####アプリがサスペンド状態の場合
1. デバイスがregionに入る/出る
2. wake upする
3. 10秒程度のイベントをハンドルする処理時間が与えられる。なお、この時間は```beginBackgroundTaskWithExpirationHandler:```で増やせる


##応答速度が向上した
iBeacon検知後、体感でだいたい10秒から30秒ぐらいしないと通知を投げてくれなかったのですが、体感でちょっと何となく早くなったような気がしました。
しかし、appleのドキュメントを読み直すと、スパムや乱雑な通知を避けるための閾値としてOSで定められている、20秒以上境界線の中もしくは外にいないと通知はされないようになっているようです。

##アプリを作る上で逆に考えないといけない事
アップルはiOSユーザ向けの発表にはこれらの変更点を載せていません。
（http://support.apple.com/kb/DL1732 参照の限りは、です。）
よって、全くアプリを起動していない状態なのにいきなり通知が来たりすると「ん？なんだこのアプリは。スパムか？？」というような憶測などにより、アプリ自体の評価を下げてしまったりするかもしれません。
このような事態を引き起こさないように、適度な通知を行なう、ユーザに周知するなどの工夫が必要そうです。

##参考
[Location and Maps Programming Guide](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html)
1ファイルのCSSセレクタの数が4096個以上になるとIE9以下でスタイル定義が無視される

タイトル通り、半日ハマった。。。

SassとかLess使ってると割りとおちいりやすいかも。

いずれはGruntタスクで4096個以上になればエラー出すとか仕込めればと。

## 参考リンク

昔見たことはあったけど、ねーよｗｗと思ってた。

http://less.carbonfairy.org/post/18072493708
curlコマンドから HTTP POST する方法


## 普通のname/valueペアをPOSTする

```bash
curl -F "name1=value1" -F "name2=value2" http://yourdomain/execute.script
```

これが

```html
<form method="POST" action="http://yourdomain/execute.script">
<input type="hidden" name="name1" value="value1">
<input type="hidden" name="name2" value="value2">
<input type="submit" value="submit">
</form>
```

みたいな感じになります。

## 普通のname/valueペアに加えてファイルをPOSTする

```bash
curl -F "name1=value1" -F "name2=value2" -F "profile_icon=@path/to/file.png" -F "zip_file=@path/to/zipfile.zip" http://yourdomain/execute.script
```

これが

```html
<form method="POST" action="http://yourdomain/execute.script" enctype="multipart/form-data">
<input type="hidden" name="name1" value="value1">
<input type="hidden" name="name2" value="value2">
<input type="file" name="profile_icon">
<input type="file" name="zip_file">
<input type="submit" value="submit">
</form>
```

みたいな感じになります。

## みたいな感じとは？

multipart/form-dataなど、フォーム送信する際の方式がいくつかあり、厳密に同じか確認していません。
しかも、データを受け取って保存するところまで確認していません！がきっと大丈夫。と思いたい。

## TIPS

ファイル送信時、受け取り側のphpで`var_dump($_FILES);`のみを出力し、

```bash
curl -F "name1=value1" -F "name2=value2" http://yourdomain/execute.script > path/to/public/web/directory/result.html
```

などと指定しておくと、curlの結果がわかりやすかったです。
apacheユーザーが git clone をするまでの手順

Webアプリケーション上から git clone をする際にはまったのでメモしておきます。
ちなみにgitコマンドはphp上からパイプで実行しました。

今日もニコニコ [カチャカチャカチャ・・・ッターン！](http://jigokuno.com/?eid=306)

## 手順

### 1.デプロイ用アクセスのためのssh秘密鍵/公開鍵を生成します。

```bash
ssh-keygen -t rsa
```

### 2.公開鍵をGitHub/GitLabリポジトリの Deploy Key に登録します。

### 3.秘密鍵の所有者をapache、パーミッション600に設定します。

```bash
chown apache:apache deploy_key
chmod 600 deploy_key
```
必要ならsudoを使います。

### 4.git-ssh.sh を作成します。

```bash:git-ssh.sh
#!/bin/sh
exec ssh -i /path/to/deploy/key "$@"
```

```bash
chmod 755 git-ssh.sh
```

### 5.clone用のシェルスクリプトも作成しておきます。

```bash:clone.sh
#!/bin/sh
# cloneの準備, 引数でパスを受け取ったり...
CLONE_TARGET=git@github.com:youraccount/yourrepository.git
export GIT_SSH=/path/to/git-ssh.sh
git clone ${CLONE_TARGET}
```

### 6.いずれのシェルスクリプトもapacheユーザーが実行できるようにしておきます。

```bash
chmod 755 git-ssh.sh
chmod 755 clone.sh
```

### 7.apacheユーザーになってssh接続します。

```bash
sudo -u apache ssh -i path/to/deploy/key -T git@github.com
```

### 8.きっと怒られます。

```bash:stderr
Could not create directory '/path/to/apache/homge/.ssh'.
Host key verification failed.
fatal: The remote end hung up unexpectedly
```

## 解決策1:.ssh ディレクトリを作成する場合

上記で怒られた場所に.sshディレクトリを作成し、再度手順7を行います。

```bash
mkdir /path/to/apache/homge/.ssh
chmod 755 /path/to/apache/homge/.ssh
sudo -u apache ssh -i path/to/deploy/key -T git@github.com
```

## 解決策2:.ssh ディレクトリを作成したくない場合

一時的に.sshディレクトリを作成するか、別のリポジトリ認証済みのPCにて、`~/.ssh/known_hosts` に登録されている *接続先の指紋* をapacheさんが稼動するPCの`/etc/ssh/ssh_known_hosts`にコピペします。

## 解決後

Webページのスクリプトからapacheさんの権限でclone.shを実行します。
動いたら成功！
もし動かない場合はstderrをしっかり出力して原因を確かめてみましょう！

## さいごに

はまっている時に助けてくれた神こと l3msh0@github氏 に感謝。
インナーフォーム（Inner Form）

Web Application OSでは、変換前のHTMLが持つ特殊な情報として
インナー○○○という考え方があります。

インナーフォームはサーバ内で擬似的に送信されるフォーム、
インナースクリプトはサーバ内で実行されるスクリプトといった感じです。
この項ではインナーフォームについての説明をします。

```html:例1
<form id="table_name" data-wao-action="/table_name/list/">
  <input type="hidden" name="author_id" value="_SES.member.id">
</form>
```

```html:例2
<form id="table_name" data-wao-action="/table_name/list/">
  <input type="hidden" name="author_id" value="_SES.member.id">
</form>
```

|属性名|指定値|
|:--|:--|
|id|取得したデータの識別子（テーブル名またはalias名）|
|data-wao-action|対象のテーブル名とメソッドをURL化したもの|

* list
** 特定の条件でデータの一覧を取得する
* detail
** idを指定してデータを一件取得する
* insert
** データを新規登録する
* update
** 指定の対象データを任意の値で更新する
* delete
** 指定の対象データを削除する
Google App Engine/Goの環境をIDEA Community Editionで構築する(Linux版)

grapswizさんの[こちらの記事](http://qiita.com/grapswiz@github/items/fac71cadc6616317bb70)で、MacでのGAE/GのプロジェクトをIntelliJ IDEA Community Editionで作成できるようにする方法が紹介されてます。
Ultimateでしか出来ないと思っていたところに光明が！！と思いLinux環境(LinuxMint 16 x64)で同じようにやるとうまく行かなかったのですが、grapswizさんに手伝ってもらいながら解決しましたので同じようにまとめておきます。

# IDEAの導入
これは普通にLinux用のパッケージをDLして展開するだけです。

# Google Cloud SDKの導入
Mac版では[これ](http://qiita.com/grapswiz@github/items/fac71cadc6616317bb70#3-2)でいいんですが、Linuxではlinux用のGoogle Cloud SDKをダウンロード、インストールした後、
`gcloud components update gae-go-darwin-x86_64`ではなく、
<del>gcloud components update gae-go-linux-x86_64を実行してください。</del>
`gcloud components update gae-go`で良いです。
SDKのインストールの途中で言語を選ばされたときにGoを選んでいれば最初から入っています。

# IDEAにGolangプラグインを導入
これは元記事と変わりません。[こちら](https://www.dropbox.com/sh/kzcmavr2cmqqdqw/j8wjp8SdNH)のDropboxからプラグインのjarをDLします。複数あるときは更新が新しい方にすればいいと思います。
導入はPlugins>Install plugin from disk...で。

# 環境変数の追加
ここがミソでした。まずターミナルの設定ファイル(.bashrcもしくは.prifile、.zshrcなど)で、`GOROOT`と`GOPATH`の2つの環境変数をexportします

```shell-session
# GOPATH:作業ディレクトリ。空でよい
export GOPATH=$YOUR_GO_WORKSPACE_DIR
# GOROOT:GAE/Gで用いるGoのrootパス
export GOROOT=$GC_SDK_DIR/platform/google_appengine/goroot
```

GOPATHはhome以下などに適当に作業用のディレクトリを作ってあれば空でいいです。
GOROOTは、google-cloud-sdkを展開したディレクトリのパスを`$GC_SDK_DIR`に使ってください
次に、これと同じ値になるように、`/etc/environment`にも環境変数を追加します。
Ubuntu系なら`sudo gedit /etc/environment`とかで編集できると思います

```
PATH=...
GOPATH=$YOUR_GO_WORKSPACE_DIR
GOROOT=$GC_SDK_DIR/platform/google_appengine/goroot
```

ここまでかけたら、環境変数を読みこませるために一度マシンを再起動します。

# IDEAを起動してSDKを追加
IDEAの起動画面からConfigure>Project Default>Project Structureで、SDKを追加します
`+`ボタンから`Go AppEngine SDK`を選択。フォルダ選択ダイアログから、`$GC_SDK_DIR/platform/google_appengine`を選択します。GOPATHとGOROOTが正しく宣言されていればこれでSDKが追加されます。
あとは新しいプロジェクトを作るときにこのSDKを選択すればいいだけです。

ようやく環境が作れたのでgrapswizさんとgolangプラグインメンテナの方々に感謝しながらGAE/Gを始めようと思います。みなさんもぜひ！
Heroku で既存の本番環境をコピーしてステージング環境を作る


すでに本番環境がHerokuにあって、ステージング環境もHerokuに作りたい場合

## 既にある Heroku の本番環境を fork してコピーする

[Forking Existing Apps | Heroku Dev Center](https://devcenter.heroku.com/articles/fork-app)

```
heroku fork -a APPNAME APPNAME-stg
```

- これだけでいろんなアドオンや DB の中身もコピーされて、ステージング環境が出来上がる。アラ簡単。（http://APPNAME-stg.herokuapp.com でもう確認できる状態になってる）
- Collaborator 権限はコピーされないので、新たに追加し直す必要がある
- hook もコピーされないので、新たに追加する必要がある

## お手元のローカル環境に git remote add する
ちょっと余談なのだが、このとき、```heroku```とか```heroku-stg```とかではなく、そのアプリケーションの名前でgit add しておくと、デプロイがプロジェクトによって違うコマンドになるので、例えば慌ててウッカリ違うプロジェクトのディレクトリで ```git push heroku master``` って打ってしまって、違うプロジェクトをデプロイしちゃった…という悲しい事故を防止できる。

```
cd APPNAME
git remote add APPNAME-stg git@heroku.com:APPNAME-stg.git
```

これで、デプロイするときは

```
git push APPNAME-stg master
```

てな感じになる

ステージングだけではなく、本番のリモートリポジトリもアプリケーションの名前に変えておくとよい。
既に、「heroku」とかになってるリモートリポジトリをリネームするには、

```
git remote rename heroku APPNAME
```

て、やるといい。
これでデプロイする時は、

```
git push APPNAME master
```

てな感じになり、この世から悲しみが減る。

## Basic認証つけたければ

```
heroku config:set BASIC_AUTH_USERNAME="id" BASIC_AUTH_PASSWORD="password" --app APPNAME-stg
```
ってやればできるよ( ˘ω˘)"
fswatch でディレクトリを監視して、変更があったら何かする(rspecとか)

fswatch が便利。ディレクトリを監視して、変更があったら何かするということが出来る。

https://github.com/alandipert/fswatch

```
$ brew install fswatch
$ fswatch /var/www/some_directory:/var/www/some_other_directory "rspec ./spec/hoge_spec.rb"
```

のように、"監視対象のディレクトリ" "実行したい何か" を引数に指定する。

監視対象ディレクトリは「:」で複数指定できる。

rspec や spec だったら他の方法でもなにかあるやろうけど。(タグ、不適切かな…)

サクッと何かを監視して何かを実行したい時とかは便利。
rails console で行える処理をコマンドラインから実行する。


Rails での DB に対して、内容チェックや内容変更の操作を shell スクリプトにしようと思った。

ネットで次の情報をみつけた。
- http://stackoverflow.com/questions/10313181/pass-ruby-script-file-to-rails-console
 > Pass ruby script file to rails console

1. rails console -s で、手作業で行いたい操作を実行して動作を確認する。
2. 上で入力したスクリプトを foo.rb に記載する。
3. コマンドラインから
    $ bundle exec rails runner "eval(File.read 'foo.rb')"
  として実行することで、 foo.rb の内容を実行して、動作を確認する。
4. コマンドラインで実行できるようになれば、
　 それを shell スクリプトから実行したり、 ruby から system() や open3() で実行することができる。

 例：
=====
  * devise でユーザー管理をしている rails アプリで、 特定のユーザーを削除する処理をコマンドライン化する。
 
  1. $ rails console -s  で
  
```js
    u = User.where('username=?', 'katoy')
    => ...
    u[0].delete
    => ...
    u = User.where('usernme=?', 'katoy')
    => [] 
```

　　　として、動作を確認する。

  2. foo.rb に処理を記載する。

```js 
    u = User.where('username=?', 'katoy')
    u.each {|user| user.delete }
    puts User.where('username=?', 'katoy').size
```

  3. コマンドラインで実行する。

```js  
    $ bundle exec rails runner "eval(File.read 'foo.rb')"
```
VagrantでDigitalOceanのドロップレットを作成する


参考:

* [1円クラウド・ホスティングDigitalOceanを、Vagrantから使ってみる](http://d.hatena.ne.jp/m-hiyama/20140301/1393669079)
* [smdahlen/vagrant-digitalocean](https://github.com/smdahlen/vagrant-digitalocean)
* [Vagrant Fabricで簡単プロビジョニング](http://www.ryuzee.com/contents/blog/6769)

## 作成するドロップレットのスペック

イメージ: Arch Linux 2013.05 x64
リージョン: Singapore 1
サイズ: 512MB

## ファイル

Vagrantfile

```ruby
Vagrant.configure('2') do |config|

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = '~/.ssh/digitalocean_vagrant'
    override.vm.box = 'digital_ocean'
    override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

    provider.client_id = "... CLIENT ID ..."
    provider.api_key = "... API KEY ..."

	provider.size = "512MB"
    provider.region = "Singapore 1"
    provider.image = "Arch Linux 2013.05 x64"
  end

  config.vm.provision :fabric do |fabric|
    fabric.fabfile_path = "./fabfile.py"
    fabric.tasks = ["hello"]
  end
end
```

fabfile.py

```
from fabric.api import run

def hello():
    run("echo hello")
```

## 手順

vagrantでドロップレットを作成し、fabricのプロビジョニング結果を確認
pythonのSimpleHTTPServerモジュールを使ってブラウザからアクセスしてみる
http://192.***.***.***:8000/index.html

```
$ vagrant plugin install vagrant-digitalocean
$ vagrant plugin install vagrant-fabric
$ vagrant up --provider=digital_ocean --provision
Bringing machine 'default' up with 'digital_ocean' provider...
[default] Using existing SSH key: Vagrant
[default] Creating a new droplet...
[default] Assigned IP address: 192.***.***.***
[default] Rsyncing folder: /path/vagrant/directory/ => /vagrant...
[default] Running provisioner: fabric...
[192.***.***.***] Executing task 'hello'
[192.***.***.***] run: echo hello
[192.***.***.***] out: hello
[192.***.***.***] out:


Done.
Disconnecting from 192.***.***.***... done.
$ vagrant ssh
[root@default ~]# mkdir hello
[root@default ~]# cd hello
[root@default hello]# cat >> index.html << EOF
<h1>Hello, Digital Ocean!</h1>
EOF
[root@default ~]# sed -i -e "s/^Server/#Server/g" /etc/pacman.d/mirrorlist
[root@default ~]# echo "Server = http://mirror.nus.edu.sg/archlinux/$repo/os/$arch" >> /etc/pacman.d/mirrorlist
[root@default ~]# pacman -Syu
[root@default ~]# pacman -S python2
[root@default ~]# python2 -m SimpleHTTPServer
```

ドロップレットの停止/削除

```
$ vagrant halt
[default] Powering off the droplet...
$ vagrant destroy
Are you sure you want to destroy the 'default' VM? [y/N] y
[default] Destroying the droplet...
[default] Running cleanup tasks for 'fabric' provisioner...
```

メモ

* ~/.ssh/known_hostsに注意. 削除したdropletのIPと新しく作成したdropletのIPが同じだとfabricが失敗する
	* コマンド `$ ssh-keygen -R 192.***.***.***`
SQALEでRails consoleを使う


```shell
% ssh -p 2222 sqale@gateway.sqale.jp
```

sshでログインして、ログインディレクトリにcurrentというディレクトリがあるのでそこで実行できる

```shell
% pwd
/home/sqale
% cd current
% bundle exec rails console
Loading production environment (Rails 4.0.3)
irb(main):001:0>
```

自動でproduction環境で立ち上がるようだ
Containerとの値やり取り方法

ViewControllerとCotainerViewの値やり取り方法に関して考察します。
完全に分離して表示や処理をする場合は問題ないですが、連携して操作する場合は値や状態のやり取りが必要になります。そこで以下のような方法でやり取りを実装しました。

1. ContainerViewでdelegateを作成(SubViewDelegateとします)
2. MainViewControllerでSubViewDelegateを実装します

そうすると、値のやり取りが可能です。

```objectivec:SubViewController.h
@protocol SubViewController

@required
- (void)testValue:(NSString *)testPhrase;
@end

@interface SubViewController : UIViewController

// ------- delegate --------
@property (weak, nonatomic) id<SubViewController> delegate;

...

@end
```

```objectivec:MainViewController.m

@interface MainViewController ()
<
SubViewController
>

@end

@implementation MainViewController

- (void)testValue:(NSString *)testPhrase{
...
}

@end
```

ここではまったのがdelegate=selfをどこに書くかです。
自分の思うような動作は、viewDidLoadに書いた場合実現できませんでした。。。
そこで、Storyboard上でContainerとのsegueにid名をつけて

```objectivec:MainViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
   if ([segue.identifier isEqualToString:@"subViewSegue"]) {
        SubViewController *subView = segue.destinationViewController;
		 subView.delegate = self;
   }
}
```
とするとうまく動作しました。
ハッシュからオブジェクトを生成する際に、名前が微妙なのを解決する


# 例えば
Jsonをハッシュに変換して、viewにアサインするオブジェクトを生成する際に、どうも名前が微妙なやつがあるが、大体はそのままアサインしてもいいかな〜って時

# 入力のHash
```
{
	'foo'=>'Jonathan', 'age'=>'21'
}
```

# fooをnameに変換したいな〜
ハッシュを受け取ってkeyをpropertyに、valueをその値にセットするが、もし、変換テーブルに該当した場合はprooerty名をそちらに差し替えてみる。
## モジュール
```
module HashConverter
  def initialize(hash = {})
    hash.each do |k,v|
      # インスタンス変数を設定
      key = converted_key(k)
      self.instance_variable_set("@#{key}", v)
      # 変換されたkeyのアクセッサを定義
      class_eval <<-EOS
          attr_reader :#{key}
      EOS
    end
  end

  def converted_key(key)
    convert_table.key?(key)? convert_table[key] : key
  end
end
```

## 使い方
```
Class Person
  include HashConverter
	
  def convert_table
    {'foo'=>'name'}
  end
end

person = Person.new({'foo': 'Jonathan', 'age': '21'})
#<Person: @name="Jonathan", @age="21">
person.name
# "Jonathan"
person.age
# "21"
```
jenkinsでweb.xmlを編修した場合に再デプロイでエラーにさせない方法


jenkinsで`JENKINS_HOME`を変更するのは、以下の3つの方法があるのは周知の通りです。

```
1.Webコンテナの管理ツールから環境エントリJENKINS_HOMEを設定すること。
2.Webコンテナを起動する前に，環境変数JENKINS_HOMEを設定すること。
3.（推奨しない）Jenkins.war（または，Webコンテナで展開されたJenkinsディレクトリ）のweb.xmlを更新すること。
```

いつもは1か2で行なうのですが、同一コンテナ内でjenkinsを複数分けて起動する必要があったため、今回は3の方法で`JENKINS_HOME`を書き換えました。

その際にちょっとハマったので、共有しておきます。

warファイルなので、基本的には`unzip`なり`jar xvf`で溶かした後、再度固めれば問題ありません。
面倒ならば`jar uvf jenkins.war WEB-INF/web.xml`で置き換えても良いでしょう。

但し単純に固め直しても、こんなエラーが出てしまいます。
> java.lang.SecurityException: SHA1 digest error for WEB-INF/web.xml 

これは署名の検証が行なわれて編修された事によりSHA-Digestがずれてエラーになっています。
そのため、参考サイトを参照して署名のチェックを外すために以下のように作業しました。

```shell
# 解凍
jar xvf jenkins.war
# web.xmlにJENKINS_HOMEを記載
vim WEB-INF/web.xml
# デジタル署名を削除
rm -rf META-INF/JENKINS.*
# 再度war化
jar cvf jenkins.war .
```

あとは、これをデプロイすれば同一コンテナでも異なる`JENKINS_HOME`を参照する事が出来ます。

＃ 気軽にupdateできない...

以上です。

### 参考
* [Building War file after modifying web.xml](http://jenkins-ci.361315.n4.nabble.com/Building-War-file-after-modifying-web-xml-td365047.html)
* [JARファイルの仕様 - デジタル署名](http://docs.oracle.com/javase/jp/1.5.0/guide/jar/jar.html#Digital%20Signatures)
Scala: String.lengthがマルチバイトでどうなるか調べてみた


# シングルバイト

`"a"`の文字数は1になるはず

```scala
"a".length
//> res0: Int = 1
```

1でした

# マルチバイト

`"あ"`の文字数は1になる? もしくは3?


```scala
"あ".length
//> res1: Int = 1
```

1でした。

# Unicodeサロゲートペア

`"?"`の文字数は1? もしくは2? それとも4??


```
"?".length
//> res2: Int = 1
```

1でした…!

次は、NFC、NFDの違いも調べたい

# 参考までに他の言語も調べてみた

## Java

```java
class Untitled {
	public static void main(String[] args) {
		System.out.println("a".length()); // 1
		System.out.println("あ".length()); // 1
		System.out.println("?".length()); // 2
	}
}
```

JavaがScalaと違うということは、Scala側でサロゲートペアを吸収してるってことかな

## PHP

```php
<?php

var_dump(strlen("a")); // 1
var_dump(strlen("あ")); // 3
var_dump(strlen("?")); // 4

// マルチバイト対応関数
mb_internal_encoding("UTF-8");
var_dump(mb_strlen("a")); // 1
var_dump(mb_strlen("あ")); // 1
var_dump(mb_strlen("?")); // 1
```

## Node.js


```javascript
console.log("a".length); // 1
console.log("あ".length); // 1
console.log("?".length); // 2
```

## Go

```go
package main

func main() {
	println(len("a")) // 1
	println(len("あ")) // 3
	println(len("?")) // 4
}
```

## Ruby

```ruby
puts "a".length # 1
puts "あ".length # 3
puts "?".length # 4
```

Node.js、Go、Rubyもマルチバイト対応の関数があるかもしれないが、そこまでは調べてない。
AngularJSのアプリケーションで画像の遅延読み込み(レイジーロード)を導入したメモ


※別にAngularJSに依存していないので、この方法はAngularJS以外でも大丈夫です。

## 目的

- スマホサイトなどでページ表示の体感速度を早めたい
	- ⇒ブラウザスクロールで表示領域にはいったタイミングで画像をロードさせる

## デモ

- http://hkusu.github.io/AngularJS_lazyload_demo/
	- 初期表示でブラウザに収まってる画像は、スクロールしないと取得しにいかないようだ（仕様？）
	- 開発ツールでHTTPリクエストをみてみると、確かに画像が必要になったタイミングで取得しにいっている

## 導入したもの

- このJavaScriptライブラリ
	- https://github.com/jmmerino/jquery-lazyload
- ほかのJSライブラリとして [Lazy Load Plugin for jQuery](http://www.appelsiini.net/projects/lazyload) があり、そちらの方がメジャーのようだが、AngularJSかBootstrapと競合するのか、うまく動かなかった。
	- 私が導入した環境は[こちら](http://qiita.com/hkusu/items/7d748b55ba73cc8a3675)。
		- ただ特に環境に依存しないので、下記の手順でどの環境にも適用できると思われる。

## 導入手順

**① Bower で JSのライブラリをローカルに取得**

```
$ bower install jquery-lazyload --save
```

- もしjQueryもまだ未取得の場合は `bower install jquery --save` で取得する

**② 対象ページのHTMLでJSライブラリをインクルード**

```html:
<script src="bower_components/jquery/jquery.js"></script>
<script src="bower_components/jquery-lazyload/jquery.lazyload.js"></script>
```

**③ 対象ページのimgタグを修正**

```html:
<img src="images/dummy-1px.png" data-src="images/big.jpg" width="600" height="400" class="lazy">
```

- `data-src`の方に 本当の画像パスを指定。`dummy-1px.png` は実在しなくてもよい模様。
- `width` と `height` をちゃんと指定しておかないと、ブラウザスクロール時にガタガタするので指定すること。
	- ダミー画像もその横幅縦幅で表示される。

## ほか

- AngularJS の `ng-src` だと動かなかったので普通に `img src` タグを利用。
- わりとライトなJSライブラリなので、必要に応じて処理は変更できそう。
ValuedomainでSQALEのCNAME設定


`example-app.sqale.jp`というアプリに対して
Value Domainで管理している`http://example.com/`でアクセスできるようにしたい。

```
cname @ example-app.sqale.jp
```

とだけ設定すれば良い
`http://www.example.com/`なら

```
cname www example-app.sqale.jp
```
Facebookいいね！ボタンのキャッシュクリア

## 陥りやすい状況
- 短縮URLなどでURLは変わらず、その先の遷移を変更するケース。
 - テスト環境URLから本番環境URLへ切り替えた
 - コンテンツ更新で別URLへ切り替えた

## 起こりうる現象
旧遷移先のOpen Graphタグの内容が **キャッシュされたまま更新されない。**

## 解決策
※Facebookいいね！ボタンは、指定URLが変えられないため、どうしようもない。

```html
<fb:like href="短縮URL" width="126" layout="button_count" action="like" show_faces="false" share="false"></fb:like>
```

1. [Open Graph Object Debugger](https://developers.facebook.com/tools/debug)へアクセス。
2. テキストエリアに短縮URLを入力し、デバッグを押下。

## 結果
対象URLのオブジェクトのプロパティを確認するため、 **Open Graphタグが最新の内容に更新される（キャッシュがクリアされる）**
# はやりに乗って、Boxen止めてBrewfile+brew-caskにした

[元ネタ](http://masutaka.net/chalow/2014-01-25-1.html)です。

![brew](http://masutaka.net/chalow/image/homebrew.png)

boxenは色々不便だったりした、rubyのversionで引っかかったり、、まぁ組織で管理しないなら、boxenのメリットは弱いかなと

## Brewfileのいいところ

* Brewfileファイルにインストールしたいパッケージを書く
* homebrewさえあればOK

## Boxenを消す

リンク貼ってたりして、邪魔なのでバイバイ

```
script/nuke --all --force
```

## Homebrewを入れる

[Homebrew公式サイト](http://brew.sh/)にも書いてるけど、以下のコマンドを実行して、Homebrewを入れるよ

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

## Brewfileを書くよ

### まずはじめに、brewだけでできる事

```
$ cat Brewfile
update
install wget
```

実行

```
$ brew bundle
```

実行すると色々やってくれます。
ええ色々
終わったらwgetが使えるはずです

### brew以外のパッケージも入れれるよ

このままだと結局brew installで入れれる物だけなの？って感じですが
brew-caskを入れると、chromeとかもいけます

```
tap phinze/homebrew-cask
install brew-cask
cask install google-chrome
```

を書いて実行すると
/usr/local/Library/Taps以下にクローンされて
/usr/local/Library/Formula以下にシンボリックリンクが作られる。
第19回オフラインリアルタイムどう書く groovy で


オフラインでリアルタイムに「どう書く」
　http://atnd.org/events/47670
の問題「不良セクタの隣」
　http://nabetani.sakura.ne.jp/hena/ord19nebasec/
の、実装例。

他の方の解答は
http://qiita.com/Nabetani/items/9810b301648099028bf0
から辿れると思います。

で。
groovy で。

```groovy
NEIBS=[
  100:[101,107,200,201,215],
  200:[100,201,215,300,301,323],
  201:[100,101,200,202,301,302],
  300:[200,301,323,400,401,431],
  301:[200,201,300,302,401,402],
  302:[201,202,301,303,402,403],
  400:[300,401,431],
  401:[300,301,400,402],
  402:[301,302,401,403],
  403:[302,303,402,404],
]

def divmod(a,b){ 
  [(int)(a/b),a % b] /// comment to fix syntax hi-light 
}

def getNeibs(b){
  (r,t)=divmod(b.toInteger(),100)
  (s,d)=divmod(t,r)
  NEIBS[r*100+d].collect{
    (a,b)=divmod(it,100)
    (a*100+(b+s*a) % (a*8)).toString()
  }
}

def solve( s ){
  bads=s.split(",") as Set
  neibs = bads.collect{ ( getNeibs(it) as Set )- bads }
  r=((100..107)+(200..215)+(300..323)+(400..431)).findAll{ t->
    1<neibs.count{ neib->
      0<neib.count(t.toString())
    }
  }
  r ? r.join(",") : "none"
}

def test( src, expected )
{
  actual = solve( src )
  if ( actual == expected ){
    println "ok"
  } else {
    printf( "%s->%s / %s\n", src, actual, expected )
  }
}

/*0*/ test( "400,401,302", "300,301,402" );    
/*1*/ test( "105,100,306,414", "none" );  
```

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

出題時点で想定していた戦略なんだけど、だれも書いてくれないので仕方なく自分で書いた。

8回回転対称なので、全体の 1/8 について隣接関係を記述してしまえば良い、というもの。

groovy なので、空の配列が false になるとか、(1..10) のようなものを加算できるとかいう辺りで ruby らしくなさをアピールしたつもり。

それにしても groovy に divmod がないのが納得いかない。
rvm install 2.1.1 で失敗する問題への対処 for Arch linux

## 事のあらまし

* arch linux で、
* rvm install 2.1.1 をやってみたところ
* エラーになってインストールに失敗する

## 少し細かく見てみると

* rvm install 2.0.0 でも同様に失敗する
* それ以下のバージョンをインストールしてみると問題ない
* どうやら途中でコンパイルエラーになっている模様。以下コンパイルエラー時のログ。

```
readline.c: In function 'Init_readline':
readline.c:1886:26: error: 'Function' undeclared (first use in this function)
     rl_pre_input_hook = (Function *)readline_pre_input_hook;
                          ^
readline.c:1886:26: note: each undeclared identifier is reported only once for each function it appears in
readline.c:1886:36: error: expected expression before ')' token
     rl_pre_input_hook = (Function *)readline_pre_input_hook;
                                    ^
readline.c: At top level:
readline.c:530:1: warning: 'readline_pre_input_hook' defined but not used [-Wunused-function]
 readline_pre_input_hook(void)
 ^
Makefile:227: recipe for target 'readline.o' failed
make[2]: *** [readline.o] Error 1
make[2]: Leaving directory '/home/aka/.rvm/src/ruby-2.0.0-p451/ext/readline'
exts.mk:180: recipe for target 'ext/readline/all' failed
make[1]: *** [ext/readline/all] Error 2
make[1]: Leaving directory '/home/aka/.rvm/src/ruby-2.0.0-p451'
uncommon.mk:179: recipe for target 'build-ext' failed
make: *** [build-ext] Error 2

```

## 解決策

↓の投稿では rbenv で同様ことが起こっている模様。
[rbenv installで失敗する問題を解消 on Arch Linux](http://qiita.com/xorphitus/items/5ccd93d9dab30363d722)
参考にさせていただきました。ありがとうございました。

以下、rvm を使っている場合の修正方法。

1. パッチを入手してあてる
以下にて修正パッチが公開されているので、あててもよし、見ながら直してもよし
https://projects.archlinux.org/svntogit/packages.git/tree/ruby/trunk/0001-Fix-undeclared-identifier-error-by-using-the-actual-.patch?id=d54cc2645013754f6a303075eb22df1eecb7676a

2. あらためてビルドするとおそらく通る
```
  $ cd [ソースがダウンロードされているディレクトリ]/src
  $ make
  $ make install
```
3. ビルドが通っても、rvm use 2.1.1 とやって使う対象に設定しようとするとgemsetがどうのと言われて設定できない
4. 何とかする。 rvm use 2.1.1@newgemset --create --default とやると gemset がよしなに作られる。
5. rvm use 2.1.1 を改めて実行。今度はきっとうまく行く。
6. Ruby -v で Rubyのバージョンを確認
7. 2.1.1 になっていたらあとはEnjoy。
npmはinstallだけじゃなくisntallでもinstall出来る。


[npm "isntall" #2933](https://github.com/npm/npm/issues/2933)

npmのヘルプを見てたら、installの右隣に「isntall」があってなんだこれはと思ったら、installのエイリアスだったみたいです。
installをタイプミスして「isntall」と入力してもエラーにならずに、ライブラリーがインストール出来るように配慮されているみたいですね。


```

$ npm -h

Usage: npm <command>

where <command> is one of:
    add-user, adduser, apihelp, author, bin, bugs, c, cache,
    completion, config, ddp, dedupe, deprecate, docs, edit,
    explore, faq, find, find-dupes, get, help, help-search,
    home, i, info, init, install, isntall, issues, la, link,
    list, ll, ln, login, ls, outdated, owner, pack, prefix,
    prune, publish, r, rb, rebuild, remove, repo, restart, rm,
    root, run-script, s, se, search, set, show, shrinkwrap,
    star, stars, start, stop, submodule, tag, test, tst, un,
    uninstall, unlink, unpublish, unstar, up, update, v,
    version, view, whoami

npm <cmd> -h     quick help on <cmd>
npm -l           display full usage info
npm faq          commonly asked questions
npm help <term>  search for help on <term>
npm help npm     involved overview

Specify configs in the ini-formatted file:
    /Users/daichi/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config

npm@1.4.3 /Users/daichi/.nvm/v0.10.26/lib/node_modules/npm

```
「===」は本当に速いのか？

一般に「===」は型変換をしない分「==」より速いと言われているが、
本当に速いんかテストしてみた。


* 条件

for-loopで10,000,000回テスト
if文で比較
num = 1000   : 数値
str = "1000" :文字列


* 結果

|比較       | 処理時間[sec] |
|:----------|:----------------|
|str == str | 1.9021899700165 |
|str === str| 0.62406301498413|
|num == num | 0.64606380462646|
|num === num| 0.65006494522095|
|str == num | 1.3471341133118 |
|str === num| 0.68006801605225|

文字列同士の比較であれば「===」の方が速い。
数値同士の比較であれば「==」の方がちょっと速い。(意外!)
文字列数値の比較であれば「===」の方が速い。

基本「===」で比較で問題ないみたい。

環境によっては違う結果になる可能性も・・・。


```php
<?php

// 試行回数
const MAX = 10000000;


$num = 1000;
$str = "1000";


//
$begin = microtime(true);
for ($i=0; $i<MAX; $i++){
  if ($str=="10000"){
    ;
  }
}
$finish = microtime(true);

echo "str == str ".($finish - $begin)."[sec]\n";


//
$begin = microtime(true);
for ($i=0; $i<MAX; $i++){
  if ($str==="10000"){
    ;
  }
}
$finish = microtime(true);

echo "str === str ".($finish - $begin)."[sec]\n";


//
$begin = microtime(true);
for ($i=0; $i<MAX; $i++){
  if ($num==10000){
    ;
  }
}
$finish = microtime(true);

echo "num == num ".($finish - $begin)."[sec]\n";


//
$begin = microtime(true);
for ($i=0; $i<MAX; $i++){
  if ($num===10000){
    ;
  }
}
$finish = microtime(true);

echo "num === num ".($finish - $begin)."[sec]\n";


//
$begin = microtime(true);
for ($i=0; $i<MAX; $i++){
  if ($str==$num){
    ;
  }
}
$finish = microtime(true);

echo "str == num ".($finish - $begin)."[sec]\n";


//
$begin = microtime(true);
for ($i=0; $i<MAX; $i++){
  if ($str===$num){
    ;
  }
}
$finish = microtime(true);

echo "str === num ".($finish - $begin)."[sec]\n";
MySQLで末尾からN文字前までを切り出す

うまい手が見つからなかったので、以下のようにしています。

```mysql
select
  substring(col, 1, length(col) - N)
from table_schema.table
;
```

めんどくさくて公式のドキュメント見ていないですが、もしかしてちゃんとメソッドがあるのだろうか…
Xamarin.Android でメモリを大量に確保したら落ちた話


例えば、複数の画像を読み込んで加工して…みたいな処理を行うときに気をつけなきゃいけない話。

```csharp:MainActivity.cs
[Activity(Label = "AllocTestDroid", MainLauncher = true)]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        
        FindViewById<Button>(Resource.Id.myButton).Click += (_, e) => 
        {
            using (var stream = new MemoryStream())
            {
                var size = 1024 * 1024 * 100; // 100Mbyte
                stream.Write(new byte[size], 0, size);
            }

            Console.WriteLine("GC.GetTotalMemory:" + GC.GetTotalMemory(true).ToString());
        };
    }
}
```

ボタンを押した時に、``MemoryStream`` に 100Mbytes のデータを追加して、すぐ (using のスコープを抜けて) ``Dispose`` する処理なんですけども。

実機(初代HTC J)では、5回くらいボタンを押すと **アプリが落ちました** 。

``GC.GetTotalMemory`` の結果は↓の通り。
Dispose してるから、メモリ使用量は増えないのかなーと思ったんですけど。ガベージコレクションについて全然詳しくないので分かってないです。
（``GC.Collect()`` とか ``Java.Lang.Runtime.GetRuntime().Gc()`` を呼んでみたけど変わらず。）

```
GC.GetTotalMemory:214005592
GC.GetTotalMemory:423742528
GC.GetTotalMemory:633457864
GC.GetTotalMemory:843173096
```

## 10Mbytes の場合

``size`` を ``1024 * 1024 * 10`` にして試すと、まったく落ちなくなりました。

``GC.GetTotalMemory`` の結果も、

```
GC.GetTotalMemory:25202264
GC.GetTotalMemory:25283616
GC.GetTotalMemory:25283720
GC.GetTotalMemory:25283720
GC.GetTotalMemory:25283720
GC.GetTotalMemory:25283720
…
```

と安定しているようです。

モバイルで 100Mbytes も使う処理自体が異常だと思いますが、複数のタスクに分割してあげれば大丈夫なのかな、と。

### 追記 2014.03.13

@atsushieno さんより、

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/amay077">@amay077</a> GCまわりはランタイムチームに丸投げしている部分なので詳しくないですが、100MBっていうのは <a href="http://t.co/Z6gPA29NO2">http://t.co/Z6gPA29NO2</a> の&quot;Configurationの節にあるMONO_GC_PARAMSを設定しないといけないサイズなんじゃないかと思います</p>&mdash; Atsushi Eno (@atsushieno) <a href="https://twitter.com/atsushieno/statuses/443724103002779648">2014, 3月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

との情報を頂きました。（まだ試してない…）
UIViewの移動やリサイズに便利なCGRect関連の関数を作りました


## 目的
Autolayoutのお陰でUIViewのframeを変更することは少なくなったはずですが、なんやかんや面倒なこともあります。

* viewをsuperviewの右上に配置したい
* 左右中心・下端に沿って設置しているviewを下端に沿ったままリサイズしたい
* AspectFitさせる時のframeを取得したい

こんなことを少し便利に行うために関数を作りました。  

この関数を使うと **CGRectの右上の座標を{320,0}にしたい** とか **右端の位置は固定で、幅を変更したい** などが簡単にかけます。


## github
https://github.com/siagency/SIATools/tree/master/SIATools/SIATools/Extensions
ここのSIAGeometry.{h,m}です。



## インタフェース
```objc
CGRect SIACGRectMove(CGRect rect, CGFloat x, CGFloat y, CGFloat relativeX, CGFloat relativeY);

CGRect SIACGRectExpand(CGRect rect, CGFloat widthAmount, CGFloat heightAmount, CGFloat relativeX, CGFloat relativeY);
CGRect SIACGRectResize(CGRect rect, CGFloat width, CGFloat height, CGFloat relativeX, CGFloat relativeY);

CGPoint SIACGRectGetPoint(CGRect rect, CGFloat relativeX, CGFloat relativeY);

CGRect SIACGRectContentMode(CGRect rect, CGRect parentRect, UIViewContentMode contentMode);

```

他にもありますが今回は上記の関数をみていきます。

## 使い方
SIACGRectContentMode以外で指定しているrelativeX/relativeYは、それぞれ注目する位置を0.0-1.0で指定します。

* relativeX  
左端を0.0/右端を1.0として指定する。
* relativeY  
上端を0.0/下端を1.0として指定する。

### SIACGRectMove
* rect  
基準となるCGRectを指定する。
* x/y  
移動後のx座標/y座標。
* relativeX, relativeY
rectのどの位置を{x,y}に移動するか指定する。  
`0.0,0.0`を指定した場合、rectの左上の座標が{x,y}となるように移動する。  
`1.0,1.0`を指定した場合、rectの右下の座標が{x,y}となるように移動する。  
`0.2,0.8`を指定した場合、rectの`x+w*0.2` `y+h*0.8`の位置がx,yとなるように移動する。

### SIACGRectExpand
* rect  
基準となるCGRectを指定する。
* widthAmount/heightAmount  
rectの幅と高さに対しwidthAmount/heightAmountを追加する。
* relativeX/relativeY  
拡縮する時の中心になる位置を指定する。  
`0.0,0.0`を指定した場合、rectの左上の位置が変わらず、大きさが変更される。  
`1.0,1.0`を指定した場合、rectの右下の位置が変わらず、大きさが変更される。  
`0.2,0.8`を指定した場合、rectの`x+w*0.2` `y+h*0.8`の位置が変わらず、大きさが変更される。
x軸では、`widthAmount*0.2`分左に移動した状態で幅が変更される。

### SIACGRectResize
SIACGRectExpandと異なり、変更量ではなくリサイズ後の幅と高さを指定する。

### SIACGRectGetPoint
* rect  
基準となるCGRect。
* relativeX  
`0.0`を指定した場合、戻り値のCGPointのxはCGRectGetMinXの値になる。`0.5`ならCGRectGetMidX、`1.0`ならCGRectGetMaxXと同等。`0.2`や`0.3`と言った数値も指定可能。
* relativeY  
relativeXのY軸版。

### SIACGRectContentMode
* rect  
基準となるCGRectを指定する。
* parentRect  
UIViewでcontentModeを指定する場合の、superviewに相当するUIViewのboundsに相当。
* contentMode  
parentRectのsuperviewに、rectのviewをaddSubview:し、contentModeを指定した場合のviewのframeに相当する値を返す。  
なおUIViewContentModeRedrawを指定した場合は無視されます(rectがそのまま返る)。

## 最後に
わりとよくやる計算だと思うんだけど……　標準では用意してくれないのか。
grepコマンドの -A -B オプション

## grep

```
grep -r hoge ./
```

とやるとカレントディレクトリ以下の中から `hoge` という文字列が含まれるファイルとその行を表示してくれる｡

grepをかけるときは

* どのファイルだったか

を調べるとともに､

* 前後に何が書いてるか

を調べたい！！！ そんなときの `-A` & `-B` オプション！！



## -A オプション

```
grep -r -A 10 hoge ./
```

とやるとカレントディレクトリ以下の中から `hoge` という文字列が含まれるファイルと後ろ10行も見れる！

便利！！

前10行がみたい！ って時は...

## -B オプション

```
grep -r -B 10 hoge ./
```

とやるとカレントディレクトリ以下の中から `hoge` という文字列が含まれるファイルとまえ10行も見れる！

便利！！

## 前後10行は...

```
grep -r -10 hoge ./
```

とやるとカレントディレクトリ以下の中から `hoge` という文字列が含まれるファイルと前後10行も見れる！

便利！！！！！
インストール済みのモジュール一覧を得る方法


簡単に書くと以下のようなかんじ。

```perl:collect-modules.pl
#!/usr/bin/env perl
use strict;
use warnings;

use File::Find;
use File::Spec;

my %modules = ();
my %inc = map { $_ => $_ } map { File::Spec->canonpath($_) } grep { -d $_ && $_ ne '.' } @INC;

for my $path (keys %inc) {
    find(+{
        wanted => sub {
            my $name = $File::Find::fullname;
            if (-d $name) {
                if (exists $inc{$name} && $inc{$name} ne $path) {
                    $File::Find::prune = 1;
                }
                return;
            }
            return unless $name =~ s/\.pm\z//;

	    $name = File::Spec->abs2rel($name, $path);
            my $module = join('::', File::Spec->splitdir($name));
            $modules{$module}++;
        },
        follow => 1,
        follow_skip => 2,
    }, $path);
}
print "$_\n" for sort keys %modules;
```
`@INC`以下(カレントディレクトリは除外)を`File::Find::find`でフルパス探索し、

- 拡張子で`*.pm`なファイルのみ抽出
- `@INC`の別要素に含まれているディレクトリ以下は探索を打ち切る
 - `$Config{archname}`以下のものなど複数のpath起点で抽出されるのを防ぐため
- `File::Spec->abs2rel`を使って抽出されたファイルの相対パスを取得
- `/`を`::`に置換

することで得られる。
[helm-perldoc](https://github.com/syohex/emacs-helm-perldoc)ではこの方式でモジュール一覧を取得している。

## 参照
- `perldoc perlfaq3` ["How do I find which modules are installed on my system?" Section](http://perldoc.perl.org/5.18.2/perlfaq3.html#How-do-I-find-which-modules-are-installed-on-my-system%3f)

`cpan -l`は`File::Find::find`を使って`@INC`以下の*.pmファイルのパスを取得した後、若干強引にモジュール名に変換している。`cpan -a`はCPAN Indexからモジュール一覧を取得して その中からインストール済みのものをリストアップする、という方式。

`ExtUtils::Installed`を使うとインストール済みの"ディストリビューション名"の一覧を取るには便利。ただし各ディストリビューションに含まれるモジュール一覧までは取得できない。

- [Perl - マシンにインストールされているCPANモジュール一覧を出す - Qiita](http://qiita.com/Cside_/items/12828bc5cbe43651c037)
- [Perlでインストールされているモジュールを全部リストアップする - (ひ)メモ](http://d.hatena.ne.jp/hirose31/20140127/1390824249)
- [Perl のパッケージを一覧するスクリプト - NaN days - subtech](http://subtech.g.hatena.ne.jp/motemen/20120801/1343817669)
[HTML5] input要素まとめ【2014/2/14版勧告候補】


# 新Type

## search
検索語

```HTML:HTML5
<input type='search'>
```

<input type='search'>

## tel
電話番号

```HTML:HTML5
<input type='tel'>
```

<input type='tel'>

## url
URL

```HTML:HTML5
<input type='url'>
```

<input type='url'>

## email
メールアドレス
multiple属性を指定するとカンマ区切りで複数指定できる。

```HTML:HTML5
<input type='email'>
```

<input type='email'>

## datetime/date/month/week/time/datetime-local
日付と時間
min属性とmax属性で指定できる範囲を決める。
step属性で指定できる最少の単位を指定。
datetime-localタイプはタイムゾーンを持たないので日本向けのサイトで使いやすい。

```HTML:HTML5
<input type='datetime-local'>
```

<input type='datetime-local'>

## number
数値
step属性で指定できる最少の単位を指定。

```HTML:HTML5
<input type='number'>
```

<input type='number'>

## range
数値の範囲
min属性とmax属性で指定できる範囲を決める。
step属性で指定できる最少の単位を指定。

```HTML:HTML5
<input type='range'>
```

<input type='range'>

## color
色コード

```HTML:HTML5
<input type='color'>
```

<input type='color'>


## [memo]hiddenの特別な値
hiddenタイプのnameを"_charset_"とすると、フォームがsubmitされた際、valueにはそのフォームのcharsetが入ります。

# 新共通属性

## form
フォーム部品にひもづくform要素を指定する。

```HTML:HTML5
<form action'/post' id='frm'></form>
<input type='text' form='frm'>
```

## autocomplete
オートコンプリートを有効に

## list
サジェストに仕様するdatalist要素のidを指定

## readonly
読み取り専用に

## pattern
指定可能な値を正規表現で指定

## required
必須項目であることを指定。
この属性が指定されている場合、値を空の時はsubmitできなくなる。

## placeholder
プレースホルダー

## autofocus
ページのロード時にフォーカスを当てる。

## min/max
最小値と最大値を指定

## step
指定できる値の精度を指定

# その他の要素についてはこちら

[[HTML5] 新要素まとめ【2014/2/14版勧告候補】 - Qiita](http://qiita.com/maccotsan/items/20c6ea274b0190dc2c05)
tableView endUpdatesの終了タイミングを取る

もしやと思ってやったらとれた。
良いやり方あれば是非に。

```objc:
[CATransaction begin];
[CATransaction setCompletionBlock:^{
    NSLog(@"finish!!!");
}];
[tableView beginUpdates];
//code code code
[tableView endUpdates];
[CATransaction commit];
```
[HTML5] 新しい属性が増えた要素まとめ【2014/2/14版勧告候補】


## iframe

### srcdoc
フレームに組み込みたいHTMLマークアップを直接記述します。

### sandbox
フレームをsandbox化してセキュリティを強化。
http://www.html5.jp/tag/elements/iframe.html#attr-iframe-sandbox

### seamless
フレームのコンテンツをシームレスにDOMに組み込む。

## a
以下を参照
[[HTML5] 変更になった要素まとめ【2014/2/14版勧告候補】](http://qiita.com/maccotsan/items/d25fa38f122e1175bb81)

# フォーム関連

## 共通属性

### form
フォーム部品にひもづくform要素を指定する。
- fieldsetにform属性を指定すると、中のフォーム全て関連づけられる。
- label要素にform属性を指定しても、中のフォーム部品までは関連づけられない。

```HTML:HTML5
<form action'/post' id='frm'></form>
<button type='submit' form='frm'>
```

### autofocus
ページのロード時にフォーカスを当てる。

### required
必須項目であることを指定。
この属性が指定されている場合、値を空の時はsubmitできなくなる。

### placeholder
プレースホルダー

## form

### novalidate
フォームのバリデーションを停止します。

## button

### formaction
このボタンのフォームの送信先を指定

### formenctype
このボタンでフォーム送信時のMIMEタイプを指定

### formmethod
このボタンでフォーム送信時のHTTPメソッドを指定

### formnovalidate
このボタンでフォーム送信時はバリデートをしない

### formtarget
このボタンでフォーム送信時のtargetを指定
[HTML5] 新グローバル属性まとめ【2014/2/14版勧告候補】


## contenteditable
要素のコンテンツを直接編集できるようにする

```HTML:HTML5
<p contenteditable='true'>ここは編集できます。</p>
```

<p contenteditable='true'>ここは編集できます。</p>

## draggable
要素をドラッグ可能にする。
img要素と、hrefが指定されたa要素はデフォルトでtrue

```HTML:HTML5
<p draggable='true'>ここはドラッグできます。</p>
```

<p draggable='true'>ここはドラッグできます。</p>

## dropzone

```HTML:HTML5
<p dropzone='copy string:text/plain'>ここへドロップできます。</p>
```

## hidden
要素のコンテンツがセマンティクス上、無関係/無意味であることを示す。
デフォルトではレンダリングされない。

```HTML:HTML5
<p hidden>無意味なコンテンツ</p>
```

## spellcheck
フォームなどでスペルチェックを有効にする。

## data-*
独自データ属性を定義する。

## contextmenu
要素をmenu要素に結びつけるためにmenu要素のidを指定する
（※menu要素がHTML5.1に移動した後もcontextmenuは残っている？用途は不明）


# マイクロデータ関連

## itemid/itemprop/itemref/itemscope/itemtype

>HTML文書中（head要素中に限らず）に簡明にメタデータを埋め込むための規格。 もともとはHTML5仕様の一部だったが、策定途中で分離された。
*via [各要素にかかわる共通事項：HTML5.1各要素別メモ](http://mtrootyy.web5.jp/htmllint/html5memo/0kyotu.html#waiaria)*

参考:
[Microdata を使ってみよう。サンプルソースで学ぶ Microdata | WWW WATCH](http://hyper-text.org/archives/2012/12/html5_microdata_getstarted.shtml)

# WAI-ARIA関連

## role/media-*

支援テクノロジー向け注記。

>WAI-ARIA は W3C の Web Accessibility Initiative (WAI) が公開している技術仕様で、Web コンテントや Web アプリケーションのアクセシビリティを強化することを目的としています。具体的には、Web ブラウザや支援技術 (AT) がコンテントのセマンティクスをより適切に認識できるよう、HTML ドキュメントに要素の「役割」や「状態」といった詳細な情報を付与するものです。
*via [HTML5 + WAI-ARIA: 入門篇 · terkel.jp](http://terkel.jp/archives/2010/08/beginning-html5-and-wai-aria/)*

参考：
[HTML5とWAI-ARIAでマルチデバイスに対応したアクセシブルなサイトを作ろう「HTML5 Conference 2013」 | HTML5Experts.jp](http://html5experts.jp/miyuki-baba/3764/)
耐衝撃性の充電式懐中電灯

[SA11000701.jpg](https://qiita-image-store.s3.amazonaws.com/0/39498/f6aab179-b216-7ef5-5590-f50c8aeaeccc.jpeg)
照明としては主に白熱電球や蛍光灯などが用いられてきましたが、

LEDには、①消費電力が少ない、②寿命が長い、③量産技術が確立され大 量生産が可能、などの長所があることから、照明用の光源はLEDに切り替わってきています。

白熱電球と比べて消費電力が極めて少なく、かつ長寿命のLED懐中電灯です。

 

光線透過率が高く、効率良く光を拡散可能

表面に微細な凹凸処理を施したマットシートは、光線透過率は高いものの光をほとんど拡散しません。一方、乳白シートは、光を拡散するものの光線透過 率が低く、これまで、最適な拡散シートはありませんでした。当社は独自のポリマー混合技術と製膜技術を駆使することで、光線透過率が高く、効率良く光を拡 散できるフィルムを開発しました。

ＬＥＤ電球は節電と急な停電に備えて、また停電の多い(海外)地域の必需品

普段使用している電球が停電時、そのまま３時間以上点灯するから安心、停電時の40Wは明るく不安を感じません。

常時電球として使用しているため、いざという時、懐中電灯のようにどこにあるか捜す必要がありません。

 http://www.buycheaplaser.com/led-handy-light-bright-black.html

足元などの近い距離を照らすのに適した明るさ。レンズで効率よく光を集約した照射パターン。ボディ表面には、手触りの良いソフトラバーをコーティング。持ち運びに便利、軽量ボディ。球切れしないＬＥＤ懐中電灯。

ＬＥＤ電球４０Ｗの明るさに加え、低発熱のため紫外線が出ませんからキャンプなど野外で使用しても虫が寄って来ないというＬＥＤ電球の特徴があります。

また、見やすい均一なスポット光　と　持ちやすいコンパクト設計の長所があります。
apache log の LTSV化


```
LogFormat "time:%{%Y-%m-%d %H:%M:%S %z}t\tdomain:%V\thost:%h\tserver:%A\tident:%l\tuser:%u\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time:%D\tcookie:%{cookie}i\tset_cookie:%{Set-Cookie}o" ltsv
```

日付は、 YYYY-mm-dd HH:ii:ss 形式に。
ソフトウェアエンジニアが文化的な最低限度の開発を営むためのツール

ウェブ、ゲーム、組み込みなどの業務にかかわらず必要なツールの知識をまとめておきたい。概ね若い人を教育するときのためのまとめ。

「この業界はじめてなのは仕方ないけど、せめてこれくらいわかっていておくれよ」というレベルなので言語などには踏み込まない。プログラムの作法的なことは別レイヤーでまとめた方が良いと思うし良書、良エントリはたくさんある。

長期的に更新するので気長にお付き合い下さい。

# SSH

どこまでできればよいか。

* リモートサーバにログインして違うマシンで作業するという概念の理解。
* 鍵ペアの作成、公開鍵認証を行うことができる。
* 「アカウント作ったから公開鍵ちょうだい」「え？」とならない。 

# Git (バージョン管理)

Gitである必要はないがバージョン管理をして共同で開発するという概念の理解。
開発の履歴を残し、ひとつのリポジトリが開発物の正本となることが理解できればVSSでも構わない。

# イシュートラッキング、バグトラッキング

課題を明文化してそれに取り組むという概念の理解。

# エディタ

「そのメモ帳でコーディングするのをやめなさい」

コーディングのためのエディタがあるということを理解すること。

コーディングではないがサーバや組み込みLinuxに触るため最低限度のviの操作法（"i", ":w", ":q", ":q!"）は覚えていたほうが良い。

# IDE / GUIデバッガ

IDEが便利だということを知ること。IDE、プロジェクトの設定により柔軟な対応ができることを知ること。

GUIデバッガが便利だという事を知ること（printfデバッグ以外の方法があることを知ること）。

# シェルとコマンドラインツール

自分がLinuxなのでbashなどを推すが、Windowsのシェルでも良い（どんなのがあるのか知らんが）。

コマンドラインツールとシェルで強力に作業を自動化、マクロ化できることを理解すること。

# Linux(あるいはUNIX的なOS)

現在どの分野においても一連の業務においてLinuxが一切関与しないということは稀だと思う。

到達目標がよくわからない。
buttonでsubmitさせない方法


単なるボタンとして使う場合は、type="button"を指定する。
省略すると、type="submit"で解釈されsubmitされる。

```html
<form>
  <!-- ただのボタンのため、submitされない。 -->
  <button type="button">ボタン</button>

  <!-- type="submit"と解釈されsubmitされる。-->
  <button>ボタン</button>
</form>
```
mecab-pythonをMacにインストールする

すんなり行かなかったのでメモしておく。

mecabはbrewでインストールすると楽だった。
(後述のmecab-pythonが上手くインストールできず、試行錯誤の過程でコンパイルして入れちゃったけど）

```
$ brew install mecab
$ brew install mecab-ipadic
```

こっからが本番。mecab-pythonのインストール。
普通にeasy_install https://mecab.googlecode.com/files/mecab-python-0.996.tar.gzとかやると、
clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
error: command '/usr/bin/gcc' failed with exit status 1
ってエラーが出てくる。

上手くいかなくていろいろ調べた結果、環境変数をセットすると上手くいった。

```
$ wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
$ tar zxfv mecab-python-0.996.tar.gz
$ cd mecab-python-0.996
$
$ export CFLAGS=-Qunused-arguments
$ export CPPFLAGS=-Qunused-arguments
$ python setup.py build
$ python setup.py install
```

おわり。
JavaScriptのオブジェクトのキーに配列が使える

# オブジェクトのキーに配列を使う

```js
var a = {};
a[['key']] = 1;
a[['key']]; //1が取れる
```

オブジェクトリテラル中でキーに配列を使うと構文エラー

```js
var a = {['key'], 1};
```

# 種明かし
配列が文字列化されてキーになっています。

`['key']`を文字列化すると "key" になります。

```js
String(['key']) // "key"が返る
```

実際はkeyプロパティが設定されています。

```js
var a = {};
a[['key']] = 1;
a.key; //1が取れる
```

# 仕様確認
[Working with Objects - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects) に

> オブジェクトプロパティの名前には、正しい JavaScript 文字列か、空文字列を含む、文字列に変換できるあらゆるものを使えます。
SVGでtext要素のサイズを測る


D3でグラフ描画なんかをやっているとSVGのtext要素を枠線で囲ったりしたくなります。どのような文字列の入力にも対応できるようにするためには、text要素の縦横幅を取得して装飾を行う必要があるため、この稿ではその方法を紹介します。

SVG要素の描画領域の短形範囲が`getBBox()`メソッドで取得できます。text要素のgetBBoxを呼ぶことでtextの縦横幅を取得することができます。

# ソースコード

```html
<svg width="300px" height="300px">
    <rect width="300" height="300" fill="lightgray"/>
    <text id="text1" x="50" y="30">text</text>
    <text id="text2" x="50" y="60" font-size="2em">text</text>
    <text id="text3" transform="translate(50, 90)rotate(45)">text</text>
    <text id="text4" x="50" y="120" style="visibility: hidden;">text</text>
    <text id="text5" x="50" y="150" style="display: none;">text</text>
</svg>
<table id="output">
    <tr>
        <th>id</th>
        <th>width</th>
        <th>height</th>
        <th>x</th>
        <th>y</th>
    </tr>
</table>
<script>
var output = document.getElementById('output');

function getSize(id) {
    var bbox = document.getElementById(id).getBBox();
    var tr = document.createElement('tr');
    var tdId = document.createElement('td');
    tdId.innerHTML = id;
    tr.appendChild(tdId);
    var tdWidth = document.createElement('td');
    tdWidth.innerHTML = bbox.width;
    tr.appendChild(tdWidth);
    var tdHeight = document.createElement('td');
    tdHeight.innerHTML = bbox.height;
    tr.appendChild(tdHeight);
    var tdX = document.createElement('td');
    tdX.innerHTML = bbox.x;
    tr.appendChild(tdX);
    var tdY = document.createElement('td');
    tdY.innerHTML = bbox.y;
    tr.appendChild(tdY);
    output.appendChild(tr);
}

getSize('text1');
getSize('text2');
getSize('text3');
getSize('text4');
getSize('text5');
</script>
```

# 実行結果

http://jsfiddle.net/likr/6wHfp/

実行結果を見ると、text要素のwidth、height、x、yの値が取得できていることがわかると思います。text2のように、font-sizeを指定するとそれに応じてwidth、heightが変化しています。text3では、transformでtranslate、rotateをかけていますが、transformを使っていないtext1と同じ結果になっています。text4は、styleで`visibility: hidden;`を指定していますが、上と同様にサイズを取得することができます。一方で、text5のように`display: none;`を指定した場合、これらの値が0になることを注意してください。

# D3への応用

以上をふまえて、D3.jsでtextを枠線で囲うプログラムは以下のようになります。

```javascript
var texts = [{text: 'spam'}, {text: 'ham'}, {text: 'egg'}];

var textsSelection = d3.select('svg')
    .selectAll('text')
    .data(texts)
    .enter()
    .append('g')
    .attr('transform', function(_, i) {
        return 'translate(50,' + (50 * i) + ')';    
    });
textsSelection.append('text')
    .text(function(d) {
        return d.text;
    })
    .attr('font-size', '2em')
    .each(function(d) {
        var bbox = this.getBBox();
        d.width = bbox.width;
        d.height = bbox.height;
        d.x = bbox.x;
        d.y = bbox.y;
    })
    .attr('dy', function(d) {
        return -d.y;
    });
textsSelection.append('rect')
    .attr({
        width: function(d) {
            return d.width;
        },
        height: function(d) {
            return d.height;
        },
        fill: 'none',
        stroke: 'black'
    });
```

jsfiddle上での実行結果はこちら。
http://jsfiddle.net/likr/kJuUE/

textのサイズを決定するような属性などを与えたあと、eachの中でgetBBoxを呼び(ここでthisがtext要素を指します)、selectionで結びついているデータにサイズの情報を格納しておきます。
また、text要素のy=0の位置はベースラインになりますので、getBBoxで取得したyを使ってtext要素の上端がy=0となるように補正しています。
iOS エンタープライズ版 Web 配布アプリが iOS7.1 でインストールできない場合の対処方法

iOS7.1 にアップデートした直後から、社内Webサーバを経由した、エンタープライズ版のアプリ配布ができなくなりました。

Webブラウザから配布用リンクを踏むと、しょっぱなにアラートがでてダウンロード動作自体がスタートしません。
詳細未確認ですが、下記リンク先の情報などを見ると、iOS7.1 からは、ダウンロード用のスキーマがHTTPではダメになったようです。HTTPSが動くサーバ環境としないとダメなのでしょうか・・・

[Stackoverflow 関連情報](http://stackoverflow.com/questions/20276907/enterprise-app-deployment-doesnt-work-on-ios-7-1 "関連情報")

***

続報

やはり答えは、HTTPSでした。Apache に SSL の設定を施したことと、サーバを稼働させていたAWS　EC2マシンのセキュリティグループを修正して、443 ポートを通すようにしたら上手くいきました。