OmniAICreator/Qiita-1.07M huggingface dataset:
My Swift Snipets


SwiftでMacアプリをつくっていて、
ちょっとハマった所。スニペットにしてまとめました。
随時更新予定。

## GCD

```swift:gcd_sample.swift

// dispatch_get_main_queueは廃止
// 5秒後に
let offset = 5.0
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(offset * Double(NSEC_PER_SEC))),dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{
	// TODO dispatch
})

// Background Task
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, {
  // Background
})

```

## デリゲート定義

とてもいいまとめ↓
http://fuckingclosuresyntax.com/

```swift:delegate_sample.swift
class TheDelegteSample {
	// 定義
	typealias JsonDelegate = (json:NSDictionary) -> ()
	
	// 変数
	var jsonDelegate:JsonDelegate?

	// 叩く
	func foo() {
		if jsonDelegate {
			jsonDelegate(json:theJson)
		}
	}
}
```

Obj-C側でswift用のデリゲートを定義するのはこちら。

```objc:delegate_sample.h

typedef void (^JsonDelegate)(NSDictionary json);

```

## シングルトン

```swift:file_sample.swift

class TheSingleton: NSObject {
	
	// スタティックgetter変数はclass var
	// structじゃないとスタティックプロパティは持てない
    class var instance : TheSingleton {
        struct Singleton {
            static let _instance = TheSingleton()
        }
        return Singleton._instance
    }
}

```

## 日にち

```swift:date_sample.swift

let date = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.setDateFormat("yyyy-MM-dd-HH-mm-ss")
let dateStr = dateFormatter.stringFromDate(date)

```

## ファイル

```swift:file_sample.swift

// デスクトップから取得。構造体になってるので注意
let directory = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DesktopDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let directoryStr = directory[0] as NSString
let path = NSString(format: "%@/%@.txt", directoryStr, "thefile")        
let url = NSURL(fileURLWithPath:path)

```

## 音再生(Mac)

```swift:SoundManager.swift

import Cocoa

class SoundManager {
    
    struct Cache {
        static let sound = Dictionary<String, NSSound>()
    }
    
    
    init() {
    }
    
    class func getSound(name:String) -> NSSound {
        var sound = Cache.sound[name]
        
        if sound == nil  {
            let soundpath = NSBundle.mainBundle().pathForResource(name, ofType:"aif")
            sound = NSSound(contentsOfFile: soundpath, byReference: false)
        }
        
        return sound!
    }
    
    class func play(name:String) {
        let sound = SoundManager.getSound(name)
        sound.play()
    }
}

```
Emacsでファイルを開いてもrecentfに即時反映されない時

# 概要
Emacsでファイルをオープンしても~/.recentfに追加されず，recentfの機能が使えない時の対処法．
# 解決策
.emacs, ~/.emacs.d/init.elに下記を記述する．
<pre> (recentf-mode 1) </pre>
カードにマウスオーバーした時に影をアニメーション表示する

```lang:CSS
.card{
  -webkit-transition: all .3s;
  transition: all .3s;
  &:hover{
    -webkit-box-shadow: 0 6px 6px -6px #777;
    -moz-box-shadow: 0 6px 6px -6px #777;
    box-shadow: 0 6px 6px -6px #777;
  }
}
```

`transition: all .3s;`は全ての要素について0.3秒間のアニメーションを行なうという指示。

`transition: box-shadow .3s;`にすれば`box-shadow`にだけアニメーションがかかり、
`hover`の際に`width`や`height`を変更してもアニメーションはかからない。
ELBを使ってnginxでアクセス制限をしたいときに気をつけること


ずいぶん長ったらしいかつ、いまさら感があるがメモとして書く。
別にELBじゃなくてLB全般な気もするけど。

##環境

```
$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)
```

* ELBの下に1台のEC2インスタンスがある。
* ELBにexample.comをcnameで設定した。（実際には無理だけど）

##やりたいこと
* 大したサービスでもないので、webhookを受けたら`git pull`させたい。
* webhookを受けて`git pull`するものはnode.jsで書いた。`http://localhost:9000`で待ち受けている。
* nginxで、

```
        location /webhook {
                proxy_pass http://localhost:9000;
                allow 192.30.252.0/22;
                deny all;
        }
```

　　はもう書いた。
　　192.30.252.0/22はgithub.comがwebhookをするために使うアドレス帯。
　　余談：https://twitter.com/morikuma_works/status/486754412241903616 (192.で始まっているからか「security group設定しますが、それはプライベートIPでは？」って言われた）

##どうなったか

```
2014/07/10 06:36:24 [error] 1948#0: *3458 access forbidden by rule, client: 172.30.x.x, server: localhost, request: "GET /webhook HTTP/1.1", host: "example.com"
2014/07/10 06:36:31 [error] 1948#0: *3458 access forbidden by rule, client: 172.30.x.x, server: localhost, request: "POST /webhook HTTP/1.1", host: "example.com"
```

まあそりゃそうっすよね
何故かと言うと、、ELBからのアクセス`172.30.x.x`になっているから、`allow`に引っかからないんですね。
ついでに、`access.log`も全てELBのプライベートIPになっていて使えたもんじゃない。


##解決法
`ngx_http_realip_module`の`set_real_ip_from`と`real_ip_header`を使う
http://nginx.org/en/docs/http/ngx_http_realip_module.html

```
        #ELB
        set_real_ip_from 172.16.0.0/12;
        real_ip_header  X-Forwarded-For;
```

`X-Forwarded-For: clientIPAddress`のように、
`X-Forwarded-For`ヘッダにクライアントのIPアドレスがあるらしい。
http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html

`172.16.0.0/12`で良いのかはちょっと不安だが、今のところ一件落着。
javascriptのチルダ演算子


javascriptの「~」チルダ演算子はビット反転演算子で、整数をビット反転させると符号を反転させて１引いた数になる  

```javascript
console.log(~-4); // 3
console.log(~-3); // 2
console.log(~-2); // 1
console.log(~-1); // 0
console.log(~0);  // -1
console.log(~1);  // -2
console.log(~2);  // -3
console.log(~3);  // -4
console.log(~4);  // -5
```

上記の通り、-1のときだけ0になる  
indexOfが値が存在しない場合に-1を返すので組み合わせると下記のようにできる  

```javascript
var arr = [1,2,3];
if (!~arr.indexOf(0)) {
  // indexが存在しない
}
```
カレントディレクトリのnode_modulesにインストールしたコマンドを実行する


`npm` に、`bundle exec` のようなコマンドはないようなので、
以下のように`npm-exec` というaliasを設定した。

```zsh:.zshrc
alias npm-exec='PATH=node_modules/.bin:$PATH'
```

コマンドの実行は、例えば以下のように行う。

```shell
$ npm install hubot coffee-script
$ npm-exec hubot --create myhubot
```
request_method という Cookie がセットされてしまう

Rails のコントローラが "request_method" という Cookie をセットしようとすることはないだろうか？

![スクリーンショット 2014-07-10 17.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/2108/74977c08-ce6f-3391-1971-82da1103e6ae.png)

これは [Turbolinks](https://github.com/rails/turbolinks) という Gem が出力するもので、Web サイトのリンク遷移を速くするもの。ページにはよいが、 REST API のコントローラなどには全くもって不要なものである。

[before_action で挿入している](https://github.com/rails/turbolinks/blob/42285201dfb3365dfabe87b4b66a8c7569a07b48/lib/turbolinks.rb#L14) ようなので、以下のコードでスキップできる。

```rb
class APIController < ApplicationController
  skip_before_action :set_request_method_cookie
end
```
jsfiddleで、別タブで実行する

* http://jsfiddle.net/

![jsfiddle.png](https://qiita-image-store.s3.amazonaws.com/0/10765/98572266-972f-9062-6d7a-9b148e07f2bc.png)

`Ctrl+Return`でRunできるんだけど、`Ctrl+Shift+Return`したら別タブでRunされた。

これができると、JSにブレイクポイントを仕掛けつつDOMの状態確認したりが楽になる。（画面内で実行すると、いちいちiframe内documentから検索する事になる。）

地味だけど便利だー！
HTML5 File API で画像をアップロードしてプレビュー

1. `<input type='file'/>` で画像を選択させる
2. input.onchange が発火するのでコールバックをとる
3. File APIがあれば input.files[0] にFileオブジェクトが入ってるの抜き取る
4. FileReader の FileReader#readAsDataURL に Fileオブジェクトを渡す
5. FileRead#onload が発火するのでevent.target.result に Data uri が入ってる
6. imgのsrcにData uri ぶち込む

```html
<img class='image-preview'/>
<input type='file' class='file-selector'>upload</input>
```

```coffeescript
$preview = $('img.image-preview')
$file = $('input.file-selector')
$file.on 'change', =>
  [file] = $file.get(0).files
  fr = new FileReader
  fr.readAsDataURL(file)
  fr.onload = (event) =>
    $preview.attr src: event.target.result
```
お客様のAccess Control Service (ACS) 2.0 Namespaceの証明書およびキーの有効期限に関するお知らせ

Microsoft Azureから表題のメールが来たけどACSとか使ってないし……わけがわからないよ。

> お客様のAzure ACS 2.0 Namespaceに紐付いている証明書およびキーが、まもなく有効期限れになります。

Stackoverflowで質問している人を発見
[Certificates and keys associated with your Azure ACS 2.0 Namespace(s) are about to expire](http://stackoverflow.com/questions/24635619/certificates-and-keys-associated-with-your-azure-acs-2-0-namespaces-are-about)

MSDNのフォーラムの回答
[Certificate and Key Expiration information regarding your Access Control Service (ACS) 2.0 Namespace](http://social.msdn.microsoft.com/Forums/windowsazure/en-US/f97bdc09-01dc-4114-bdc2-d26531964028/certificate-and-key-expiration-information-regarding-your-access-control-service-acs-20-namespace?forum=windowsazuredata)

> You can safely ignore the email.

後の回答は長くて読んでないが、とりあえず無視して大丈夫なようだ:-)
アセットのロード方法メモ


[Unite Japan 2013 公開動画 - [Unite Japan 2013]シーン／メモリ／アセットバンドル](http://vimeopro.com/unity3djp/unite-japan-2013-for-the-public/video/64375290)

から抜粋

# WWW.LoadFromCacheOrDownload

* キャッシュに有ればキャッシュから読む、無ければダウンロード
* キャッシュへは圧縮を展開した状態で保存される（展開後の容量のストレージ消費）
* ロード処理の効率良い

# AssetBundle.CreateFromFile

* ローカルのストレージ上から読み込む
* 無圧縮形式のAssetBundleしか読めない
* ロード処理の効率良い

# WWW("http://...")

* 圧縮した状態、展開した状態の両方のAssetBundleのバイナリイメージがメモリ上に乗るためメモリ効率悪い
* ロード処理の効率悪い

※ WWW("file://.."), AssetBundle.CreateFromMemory も同様
cocos2d-jsにて、Resourcesディレクトリの以下にディレクトリを作成する方法


# 概要
iOS限定の話です。
create_project.pyで作成したプロジェクトのデフォルトの構成では、Resourcesディレクトリ以下は下記のようなディレクトリ構成になっています。

```bash
Resources
├── res
└── src
```

これを仮に次のようにしたい場合、Xcode上で設定を加える必要があります。

```bash
Resources
├── lib
├── res
└── src
```

# リソースファイルをフォルダ構造を維持させながらコピーさせる
（参照 http://eien.seesaa.net/article/238085999.html )Thanks!

適切にXcodeに設定を行わないと、バンドルリソースにコピーさせたときに、各ディレクトリにあるファイルをうまく参照できません。
上記のリンク先に詳しい解説が記述されていますが、Xcodeにlibディレクトリを追加するときに、
**Create folder references for any added folders**
を選択してやります。
すると、resディレクトリ、srcディレクトリを同様にlibディレクトリが青いフォルダアイコンになっていることが確認できると思います。

これにて、JavaScriptが通常のフォルダ同様にバンドルリソース内で各種ファイルを参照できるようになります。

ちなみにAndroidでは特にこういった設定は不要です。
そのまんまassetsディレクトリにコピーされて、動作します。
ただ、うまく実行できないことがあったのでディレクトリを追加したときにはクリーンビルドすることをオススメします。
AFNetworking2.xを利用して、HTMLやテキストを取得する

AFNetworkingを利用して、GETでプレーンテキストを取得しようとしたらエラーがでてハマったので、対応方法をメモに残します。

結論から述べると、AFHTTPSessionManagerのresponseSerializerにAFHTTPResponseSerializerを指定します。reponseSerializerは、デフォルトでJSON用になっており、JSON以外の文字列を取得すると次のようなエラーが発生するようです。

> Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request  failed: unacceptable content-type: text/html"

以下のようにする事で、プレーンテキストを読み込めるようになります。

```objc

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];

// ここでserializerをデフォルトから変更している。
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"http://192.168.169.170/get_data" parameters:nil success:^(NSURLSessionDataTask* task, id responseObject) {
    // responseをUTF-8に変換
    NSString* str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"task=%@, response = %@ %@", task, [responseObject class], str);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Login error: %@", error);
}];
```

AFNetworkingが予めJSON用のSerializerを用意しているのだから、レスポンスをプレーンテキストからJSONに変えた方が良いのかもしれません。。。

# 参考

http://dev.classmethod.jp/smartphone/iphone/ios-afnetworking2/
「おっぱい曲面」を3Dグラフで描く(2)

[『プログラミング言語 Julia でグラフを描画する』](http://qiita.com/akmiyoshi/items/a2aca5369c8e3c11ae59) でとりあえずサンプルを動かすことに成功したが、自分の(Julia言語の)プログラムで作ったデータを使ってグラフを描画するにはどうしたら良いかを調べることにした。

今回は[『おっぱい曲面方程式による長さ計算』](http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_315)を参考にして「おっぱい」を大きくする実験をしてみた。
Julia で求めた計算結果を Matplotlib でグラフ表示するようになっている。(環境を作って是非動かしてみてください)

* ソースコードを保存する際には文字エンコーディングは utf-8 にしておくこと。
* サンプルを起動するには、Oppai2.jl (Julia のソースコード) をエクスプローラーからダブルクリックする。
* ソースコード内の ALPHA を大きくすると「おっぱい」が大きくなります。BETA を大きくすると「乳首」が伸びます。
* カレントディレクトリに「Oppai2.png」というファイルができます。

> 注記：環境構築については、[『プログラミング言語 Julia でグラフを描画する』](http://qiita.com/akmiyoshi/items/a2aca5369c8e3c11ae59) を参照してください。
> 2014/07/04 に手順 4, 6, 11 を追加しました。**2014/07/04 以前に上記記事を見て環境を構築した方は手順 4, 6, 11 を追加実行してください。**よろしくお願いします。

↓$ALPHA=1$の例。「おっぱい」は小さい。左ボタンドラッグすると3Dグラフが回転します。右ボタンドラッグすると拡大・縮小ができます。
![alpha-1-beta-1.gif](https://qiita-image-store.s3.amazonaws.com/0/32879/31dbd87c-3543-e85f-36a3-10d8e87e2aa0.gif)

↓$ALPHA=3$の例。「おっぱい」は大きい。左ボタンドラッグすると3Dグラフが回転します。右ボタンドラッグすると拡大・縮小ができます。
![alpha-3-beta-1.gif](https://qiita-image-store.s3.amazonaws.com/0/32879/6a417dc8-0f97-0638-a194-d4fc9fa55291.gif)

```jl:Oppai2.jl
# -*- coding: utf-8 -*-

using PyPlot

using PyCall
@pyimport matplotlib.cm as cm
@pyimport matplotlib.font_manager as fm
@pyimport matplotlib.pyplot as plt
@pyimport numpy as np

ALPHA = 1.0
BETA  = 1.0
GAMMA = 1.0 / ALPHA

function bust(x, y)
ALPHA * (6 * exp(-((2 / 3 * abs(x) - 1) ^ 2 + (2 / 3 * y) ^ 2) - 1 / 3 * (2 / 3 * y + 0.5) ^ 3) 
+ BETA * 2 / 3 * exp(-2.818 ^ 11 * ((abs(2 / 3 * x) - 1) ^ 2 + (2 / 3 * y) ^ 2) ^ 2) 
- GAMMA * (2 / 3 * x) ^ 4) / 8
end

fig = plt.figure()
ax = fig[:gca](projection="3d")

nx = 201
ny = 201
x = linspace(-3, 3, nx)
y = linspace(-3, 3, ny)
z = zeros(Float64, length(y), length(x))

for iy = 1:length(y)
    for ix = 1:length(x)
        z[iy, ix] = bust(x[ix], y[iy])
    end
end

x, y = np.meshgrid(x, y)
sf = ax[:plot_surface](x, y, z, rstride=4, cstride=4, cmap=cm.coolwarm, linewidth=0.1, antialiased=true)
fig[:colorbar](sf, shrink=0.5, aspect=5)

ax[:set_zlim](-4, 3)
ax[:view_init](0, -90)

@windows? (
begin
    #fp = fm.FontProperties(fname="C:\\WINDOWS\\Fonts\\msgothic.ttc")
    fp = fm.FontProperties(fname="C:\\WINDOWS\\Fonts\\msmincho.ttc")
    plt.title("Julia+Matplotlib サンプル", fontproperties=fp, fontsize=25)
end
: begin
    plt.title("Julia+Matplotlib サンプル", fontsize=25)
end
)

plt.savefig("Oppai2")
plt.show(block=true)
```
ansibleでremote_user使わないでroot以外のユーザのコマンド実行

remote_userだと、そのユーザのssl-keyも配らないといけないのが面倒なので、```bash -l -c``` を使った。

```yaml
    - command: sudo -u rabbitmq bash -l -c 'rabbitmqctl {{ item }}'
      with_items:
        - 'add_vhost "/sensu"'
        - 'add_user sensu sensu'
        - 'set_permissions -p /sensu sensu ".*" ".*" ".*"'
```

## 追記

デフォルトではtty無しのsudoができないケースがあったので、事前にtty無しでもsudoができるように設定変更。

```yaml
    - lineinfile: dest=/etc/sudoers regexp='#?(?P<line_to_disable>Defaults\s+requiretty)' line='#\g<line_to_disable>' state=present backrefs=yes
```
AWS セキュリティグループを編集するスクリプト

#やりたいこと
AWSの複数リージョン構成でAutoScaleするEC2のZabbix自動登録をしたい。
自動登録時はZabbix-Agent→Zabbix-Serverに通信するので、Zabbix-Server側のセキュリティグループにZabbix-AgentのIPアドレスを許可する設定を記述する必要がある。

#できていること／できていないこと
◆できていること
　・IPアドレスの取得
　・セキュリティグループへの定義追加

◆出来ていない事
　・既に設定されている場合の除外
　　→今後検討予定です。

#スクリプト

例としてport 3306で実験しています。あとでzabbixのポートに修正予定です。

```test.ruby
#!/bin/env ruby

##ライブラリのロード
require 'rubygems'
require 'aws-sdk'
require 'yaml'

config = YAML.load(File.read("test.yaml"))

AWS.config(config)

##################################################################
##       EC2                                                     #
##################################################################
##EC2をNEWする
ec2 = AWS::EC2.new

##SecurityGroupの取得
sg = ec2.security_groups.filter('group-name', 'ここにセキュリティグループ名を記述').first

#EC2のインスタンス毎に処理を実行
ec2.instances.each do |instance|
        #puts "#{instance.ip_address}\t#{instance.public_dns_name}"

        #セキュリティグループへの定義追加
        #起動していないインスタンスはIPアドレスがnilになるようなので判定
        if instance.ip_address != nil then
                #                         port ipaddress
                #                           ↓      ↓
                sg.authorize_ingress(:tcp,3306,"#{instance.ip_address}/32")
        end

end

```

```test.yaml
access_key_id: アクセスKey
secret_access_key: シークレットアクセスKey
auto_scaling_endpoint: autoscaling.ap-northeast-1.amazonaws.com
cloud_front_endpoint: cloudfront.amazonaws.com
cloud_watch_endpoint: monitoring.ap-northeast-1.amazonaws.com
emr_endpoint: elasticmapreduce.ap-northeast-1.amazonaws.com
elasticache_endpoint: ec2.ap-northeast-1.amazonaws.com
elastic_beanstalk_endpoint: elasticbeanstalk.ap-northeast-1.amazonaws.com
elastic_load_balancing_endpoint: elasticloadbalancing.ap-northeast-1.amazonaws.com
elastic_transcoder_endpoint: elastictranscoder.ap-northeast-1.amazonaws.com
ec2_endpoint: ec2.ap-northeast-1.amazonaws.com
iam_endpoint: iam.amazonaws.com
s3_endpoint: s3.ap-northeast-1.amazonaws.com
rds_endpoint: rds.ap-northeast-1.amazonaws.com
```

他に良い方法をご存知の方がいらっしゃったら、お教えください・・・・
【CakePHP】HtmlHelper

参考：[Cookbook HtmlHelper]
(http://book.cakephp.org/2.0/ja/core-libraries/helpers/html.html)

## aタグを出力する→link

```php:フォーマット
$this->Html->link('Enter', '/pages/home', ['class' => 'button', 'target' => '_blank']);
//=>出力結果
//<a href="/pages/home" class="button" target="_blank">Enter</a>
```

※第二引数のURLの指定
第二引数は、Html->url()へ渡されてurlになる。
よって、文字列で、'/pages/home'もしくは、配列で、['controller'=>'pages','action'=>'home']と書く。

※サニタイズを無効にする方法
第三引数に以下を設定する。

```php
array('escape' => false)
```

## scriptタグを出力する→script

```php:フォーマット
$this->Html->script('scripts');
//=>出力結果
//<script type="text/javascript" href="/js/scripts.js"></script>
```

URLを直接指定することもできる。
jQueryのCDN使う場合は以下のような感じ。

```php
$this->Html->script('http://code.jquery.com/jquery.min.js');
//=>出力結果
//<script type="text/javascript" href="http://code.jquery.com/jquery.min.js"></script>
```

## urlを出力する→url

```php:フォーマット
echo $this->Html->url(array(
    "controller" => "posts",
    "action" => "view",
    "hoge",
    "?" => ["foo" => "bar"],
));

// 出力結果
/posts/view/hoge?foo=bar

```

?をキーにすると、クエリストリングを作ることができる。
Macでひらがなをカタカナに


Macを使い始めてはや二週間ようやくMacに慣れてきたかと思ったら思わぬところでひっかかったのでメモ
ちなみに、ことえり対象です。

##入力中にリアルタイムで変換

Shiftを押しながら入力するとリアルタイムでカタカナになる。

ついでも英字も大文字になる。

##入力後に確定するまでに変換

Control+Kでカタカナになる
Option＋Xでも可能。

##半角カタカナは？

まずシステム環境設定→キーボード→入力ソースで半角カタカナを選択![スクリーンショット 2014-07-10 16.12.32.png](https://qiita-image-store.s3.amazonaws.com/0/45617/e5725b00-f380-3e5d-80aa-6282bb13efe8.png "スクリーンショット 2014-07-10 16.12.32.png")

それからControl+;で半角ｶﾀｶﾅになります
Option＋Aでも可能

##おまけ
別のほかのコマンドでもできるけどあまり使わなそうな感じしたので割愛。
ことえりって聞くとラブライブのカップリングの言葉みたいっすね。
うみえり。にこまき。みたいな？な？
[Objective-C] [iOS] UILabelの行間調整とURLのリンク化

## 対応iOSが6以上の場合
UILabelクラスのattributedTextプロパティが利用できるのでそれを使えば良い。

## iOS5にも対応する場合、ライブラリを使う
- OHAttributedLabel
- TTTAttributedLabel

## OHAttributedLabel
https://github.com/AliSoftware/OHAttributedLabel
使いやすいライブラリだが、日本語の場合行間がおかしくなる問題が起こった。
http://eikatou.net/blog/2012/09/2019/
この辺りを参照。ここの解決策をやっても私の場合はうまくいかなかった。
TTTAttributedLabelを使ったほうが良い気がする。

## TTTAttributedLabel
https://github.com/mattt/TTTAttributedLabel
利用してて特に気になる点はない。

行間は以下のような感じで調整できる

```objc
label.lineSpacing = 2;
```

リンクは

```objc
label.enabledTextCheckingTypes = NSTextCheckingTypeLink;
```

としておけば勝手にURL部分を青くしてくれるので、あとは

```objc
label.delegate = self;
```

と delegate を指定し、指定したクラスに TTTAttributedLabelDelegate を設定した後

```objc
- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
    [[UIApplication sharedApplication] openURL:url];
}
```
上記のメソッドを定義しておくとリンクがクリックされたときに呼ばれる。
[tmlib.js]tmlib.jsだと簡単にポーズ画面を作れる

# ポーズ画面ってなに

よくゲームにある、画面止めて休憩とかするためのやつです。

# ソース

`pushScene`と`popScene`を使うと、シーンの上に重ねて別のシーンを乗っけることができる。
そのとき、後ろにあるシーンの動きは止まるのでそれを利用する。

```js
/*
 * MainScene
 */
tm.define("MainScene", {
    superClass: "tm.app.Scene",
    
    init: function () {
        var self = this;
        self.superInit();
        self.fromJSON({
            children: {
                label: {
                    type: "tm.display.Label",
                    init: ["仮ゲームシーン"],
                    x: SCREEN_CENTER_X,
                    y: 100,
                },
                objectGroup: {
                    type: "tm.display.CanvasElement",
                },
                pauseButton: {
                    type: "tm.ui.GlossyButton",
                    init: [150,50,"red","pause"],
                    x: SCREEN_CENTER_X,
                    y: SCREEN_HEIGHT-120,
                },
            },
        });

        // 動くテスト用オブジェクト
        [
            {x: 200, y: 200, color: "red"},
            {x: 400, y: 500, color: "green"},
        ].each(function (elm) {
            tm.display.RectangleShape(150,150,{fillStyle: elm.color})
                .setPosition(elm.x, elm.y)
                .addChildTo(self.objectGroup)
                .tweener.clear()
                    .setLoop(true)
                    .by({x:  100}, 400, "easeOutQuad")
                    .by({x: -100}, 400, "easeOutQuad");
        });

        // ボタン押下時の動作
        self.pauseButton.onpointingstart = function () {
            var scene = PauseScene();
            self.app.pushScene(scene);
        };
    },
});

/*
 * PauseScene
 */
 tm.define("PauseScene", {
     superClass:"tm.app.Scene",
 
     init: function(){
        var self = this;
        self.superInit();
        self.fromJSON({
            children: {
                filter: {
                    type: "tm.display.RectangleShape",
                    init: [
                        SCREEN_WIDTH,
                        SCREEN_HEIGHT,
                        {fillStyle: "rgba(0,0,0,0.7)"}
                    ],
                    originX: 0, originY: 0,
                },
                label: {
                    type: "tm.display.Label",
                    init: ["ポーズ中"],
                    x: SCREEN_CENTER_X,
                    y: 100,
                    fillStyle: "white",
                },
                closeButton: {
                    type: "tm.ui.GlossyButton",
                    init: [150,50,"green","pause"],
                    x: SCREEN_CENTER_X+150,
                    y: SCREEN_HEIGHT-120,
                },
            },
        });
        self.closeButton.onpointingstart = function () {
            self.app.popScene();
        };
     },
 });
```

# サンプル

[動くよ](http://jsdo.it/omatoro/p3qj)
[NeetMSTranslator] Microsoft Translator を iOS で簡単に使うライブラリを公開しました！

もう古いので[こちら](http://qiita.com/mironal/items/bab3070f24a899fd058a)を参照してください


<a href="http://www.bing.com/translator/" title="Microsoft Translator" target="_blank">Microsoft Translator</a> というマイクロソフトが提供している翻訳 API を iOS から簡単に使うためのライブラリを公開しました。

Microsoft Translator を iOS から使うためのライブラリは既存のものがあるのですが、メチャクチャシンプルに作ったので、翻訳するだけならこちらのほうが使いやすいと思います。


## インストール方法

CocoaPods に公開済みです。

`Podfile` に

```
pod 'NeetMSTranslator', '~>0.0.3
```
を追加して `pod install` するだけで導入できます。


<a href="https://github.com/neethouse/NeetMSTranslator" title="リポジトリはここです(https://github.com/neethouse/NeetMSTranslator)" target="_blank">リポジトリはここです(https://github.com/neethouse/NeetMSTranslator)</a>

スターやプルリク待ってます！

## サンプルコード

`NeetMSTranslator` が持っている メソッドは以下の3つだけです。 めちゃシンプル！！！！！

```objc

// シングルトンインスタンスを取得
 NMSTranslator *tra = [NMSTranslator sharedTranslator];

// 登録した ClientID と ClientSecret で初期化
 [tra initializeTranslatorWithClientID:@"your client ID"
                          clientSecret:@"your client secret"];

 [tra transrateWithText:@"hello" to:@"ja" success:^(NSHTTPURLResponse *response, NSString *string) {

     NSLog(@"succ: %@", string); // こんにちわ

 } failure:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {

     NSLog(@"err: %@", error);
 }];

```

## 注意

Microsoft Translator を利用するためには Microsoft Azure Marketplace にアカウントやらアプリケーションやらを登録する必要があります。

ググると出てくるので説明は省略します。


## 更に詳しい情報

[http://developer.covelline.com/2014/07/neetmstranslator/](http://developer.covelline.com/2014/07/neetmstranslator/)


---

ATS(https しか通信できないようにする奴)に対応させました。

https://github.com/neethouse/NeetMSTranslator/commit/9fb631c230f2eb76767783dc7c6cf0f61f1edb42
ChromeアプリをDartで書くためのyeomanジェネレータを作った

リポジトリはこちら
https://github.com/laco0416/generator-chromeapp-dart
使い方やその他もろもろはREADMEに書いてあります。  

初めてyeomanのジェネレータ自作したのでなんとなくの作業の流れと、作ってて困ったことや思ったことを忘れないように書いておきます

## 作り方

1. [generator-generator](https://github.com/yeoman/generator-generator)をインストールする  
```$ npm install -g generator-generator && yo generator-generator```
2. ```$ cd generator-hogehoge && npm link```  
これでシンボリックリンクが出来て、別の場所で```$ yo generator-hogehoge```することでローカルの作りかけのジェネレータの動作テストができる
3. `app/templates/`の中にテンプレートとして提供したいサンプルアプリを作る
4. Gruntのタスクを作ってあげる
5. いい感じに出来たらGithubとnpmに上げる

## 困ったこと

### Dart2jsで吐き出される*.dart.jsがChromeアプリで読み込めない
Dartネイティブで実行できるのはDartiumだけなので、Dartで書いてJSにコンパイルしてあげないといけませんが、hoge.dartに対してDart2jsが最終的に吐き出すhoge.dart.jsは[CSP](https://developer.chrome.com/extensions/contentSecurityPolicy)っていうものに引っかかるらしくて、普通のWebアプリとして実行すれば読み込めますが、Chromeアプリとして起動すると読み込めません。  
ですが途中で吐き出すhoge.dart.precompiled.jsならCSP safeとの事なので、Dartネイティブじゃない場合にはそちらを読み込むように`browser/dart.js`相当のものを使っています。（参考にしたのは[これです](https://github.com/GoogleChrome/chrome-app-samples/tree/master/dart))

## 思ったこと

### yeomanのテンプレートエンジンが便利
`index.js`内で定義した変数（appNameとか）が、index.htmlとか他のファイルのコピーの時に`<%= appName %>`でテンプレートに流し込めるのがすごく便利です

### シンボリックリンク最高
`npm link`でローカルのジェネレータを読み込めるっていうのがめっちゃ楽でした。捗った。  

### ジェネレータ作るの結構楽しい
yeomanのエントリポイントは`app/index.js`なんですが、思ってたよりもわかりやすい構造で、ファイルのコピーやテンプレートとか、直感的で書きやすかったです。

### Travis CIつよい
初めて使いましたがとても便利ですね。自分のリポジトリに`build:passing`が表示される快感がありました。

----

今後はAndroidへのデプロイもGruntタスクで提供できるようにしていく予定。（予定は未定）。ただのWebアプリのほうが自由度は高いですが、Chromeアプリとして作ることで盛り上がりつつあるChromeプラットフォームの波に乗りたいなーとか思ってます。
init-loader + helmの設定

# 概要
init-loaderでhelmをインストールして，inits以下で分割管理する方法．
# 設定
1. helm.elの作成
<pre>
$ touch ~/.emacs.d/inits/xx_helm.el
xxの数字はお好みで．
</pre>
2. xx_helm.elの中身
<pre>
(dolist (dir (split-string (shell-command-to-string "find ~/.emacs.d/elpa/helm* -type d") "\n"))
　(add-to-list 'load-path dir))
(require 'helm-config)
(helm-mode 1)
</pre>
3. 設定  
随時追記予定

# ハマった点
1. (helm-mode 1)の記述場所  
分割管理するために，inits/xx_helm.elに書いたが反映されなかった．  
[解決策] xx_helm.elの中でelpa以下のhelmをロードするようにし，(require 'helm-cofig)を宣言することで解決．
2. helmのアップデートへの追従  
load-pathする時に，ディレクトリをハードコーディングするとアップデートで名前が変わるたびに書き換える必要が出てくる．  
[解決策] [ここ](http://tototoshi.hatenablog.com/entry/20110517/1305650283) を参考に，動的に検出するようにして対応．

# 疑問
defaultでelpa以下をすべてロードしているのに，なんでinits以下で再度ロードし直さないとhelmの設定ができないのだろう。。。  謎だ．
ubuntu 14.04 でのapt-add-repositoryのインストール

vagrantに入れるときにど忘れしてまたはまったのでメモ。

世の中のBlogやWebではapt-add-repositoryをいれるのにpython-software-propertiesをインストールせよという記述があるが、これは14.04では正しくない。

14.04ではsoftware-properties-commonを入れること
ruby の ceil で罠にハマった。


こんなプログラムを書いていた。

```ruby
a = 11r/3 # 有理数型 3.666...
b = a.ceil -1 # a 未満の整数で最大
p b # 3 を期待。
```

ところが、`b` の値は 10 になる。

上記のソースは

```ruby
a = 11r/3 # 有理数型 3.666...
b = a.ceil( -1 )# 10 の位まで切り上げる
p b # 3.666... を 10 の位まで切り上げるので 10 になる
```

ということになっていた。
まあ不用意に空白を置いたのが直接の原因なんだけど、 `ceil` にこんな機能があったとは。

しかし、

```ruby
require 'bigdecimal'

BigDecimal.new(1).ceil(-1) # => BigDecimal の 10 になる
(1r).ceil(-1) # => 10

1.ceil(-1) # ArgumentError: wrong number of arguments (1 for 0)
(1.0).ceil(-1) # ArgumentError: wrong number of arguments (1 for 0)
```

という具合で、`Fixnum` と `Float` の `ceil` は引数を取れない。

なんでだろ。
Google よりも先に Android Studio 0.8.2 のリリースノートを書き出してみる

おおよそ、以下の URL を眺めることで、どんなリリースだったかが観測できます。

https://android-review.googlesource.com/#/q/status:merged+project:platform/tools/base,n,z

## Gradle 2.0 がサポートされるようになった

[これ](https://android-review.googlesource.com/#/c/99324/)とか[これ](https://android-review.googlesource.com/#/c/100195/)とか見ると、2.0 がサポートされるようになったようです。ぱっと見最低バージョンが2.0になった感じも受けるが、特に何もいじらなくても良かったので、開発者が何かをする必要はなさそう。

## Lint のバグフィクス

[これ](https://android-review.googlesource.com/#/c/100182/)

`SharedPreferences#commit()`と`SharedPreferences#apply()`の警告が逆だった件。

## 依存管理のバージョンの書き方についての改善

[これ](https://android-review.googlesource.com/#/c/99907/)

`+`つかって、自動で最新のを追っかけるようにすることも多いかと思いますが、予期せず最新のものを使ってしまって悲しい思いをすることもあるため、Google 的には非推奨にしているようです。
このとき、警告はでるけどバージョンを自動で補完して、バージョンを固定するような修正をしてくれるような事があれば楽だったのになー、という機能が入りました。

## `applicationId` をビルドスクリプトに書いてない時に自動で補完してくれる

[これ](https://android-review.googlesource.com/#/c/100103/)

AndroidManifest に書いてあるパッケージ名を取ってきて、applicationId の扱いにしてくれるので、うっかりプレースホルダだけ書いてた場合でもちゃんと動くようになる。

だいたいこんなかんじな気がします。
おそらく今回は、0.6.x 以前からのアップデートでない限りは問題なくすんなり事が運ぶはず。

ちゃんとした奴は、[公式のページ](http://tools.android.com/recent)でご確認ください（まだ出てないけど）。あるいは、[Google+](https://plus.google.com/+AndroidDevelopers/posts)みるのが早いかも（まだ出てないけど）。
puppetでOSのバージョン判定

[CentOS 6 - Puppet - facter 変数 ： Server World](http://www.server-world.info/query?os=CentOS_6&p=puppet&f=10)を参考

## facterを実行すると取得できる変数一覧が確認できる。

```sh:
facter
# 2.6.1では以下変数はまだ実装されていない
facter operatingsystemmajrelease
```

## 例

```bash:
if $operatingsystemrelease >= '5' {
  # centos 5以上
  file {
    '/etc/logwatch/conf/logfiles/http.conf':
      owner  => 'root',
      group  => 'root',
      mode   => 644,
      source => 'puppet:///www/etc/logwatch/conf/logfiles/http.conf';
  }
} else {
  # centos 4以下
  file {
    '/etc/log.d/conf/logfiles/http.conf':
      owner  => 'root',
      group  => 'root',
      mode   => 644,
      source => 'puppet:///www/etc/logwatch/conf/logfiles/http.conf';
  }
}
```
【Mac】SVNクライアント自分用まとめ

MacのSVNクライアントを調査したのでメモ。
[TortoiseSVN](http://sourceforge.net/projects/tortoisesvn/)のようないいかんじのないの？（´・ω・`）
オススメあったら教えてください！

#Versions
[Versions - Mac Subversion Client (SVN)](http://versionsapp.com/)
周りで評判がよろしい。$59（6,000円くらい）。

#RapidSVN
[RapidSVN](http://www.rapidsvn.org/)
無料の中では比較的使いやすい。でももうメンテされてないみたいで、バグがちらほら。
10.7以降では使えない。

#svnx
[svnx - An OS X open source GUI for most features of the svn client binary. - Google Project Hosting](https://code.google.com/p/svnx/)
無料だけど、使いにくい・・・

#SmartSVN
[SmartSVN | WANdisco](http://www.wandisco.com/smartsvn/home)
1-25ユーザ？までは、ユーザあたり$69。たかくね・・・

#Cornerstone
[Zennaware » Home of Cornerstone Subversion Client for Mac OS X](http://www.zennaware.com/cornerstone/index.php)
$59。差分表示機能は含まれている。

のんびり更新中：[Cornerstone使い方メモ - Qiita](http://qiita.com/ituki_b/items/d4bb662f195617700597)

#SourceTree
[Free Mercurial and Git Client for Windows and Mac | Atlassian SourceTree](http://www.sourcetreeapp.com/)
使えるようになるまでが長い・・・
s3fs-fuseでマウントしたらlibrary too oldとか怒られた

s3fs-fuseというのをつかってmountをしていたら、謎のエラーが出てハマった。

```
[root@centos lib64]# /usr/local/s3fs-fuse/bin/s3fs local-orfs /mnt/s3fs -o url=http://192.168.131.131:8080 -o passwd_file=/root/.passwd-s3fs -o default_acl=private -o allow_other,uid=501,gid=501 -o nomultipart
fuse: warning: library too old, some operations may not not work
```

調べると、libfuse.soとか言うのが古いらしいということが判明
[Issue 430 - s3fs - fuse: warning: library too old, some operations may not not work - FUSE-based file system backed by Amazon S3 - Google Project Hosting](https://code.google.com/p/s3fs/issues/detail?id=430)

しかし、見てみると、特に古くは無いことがわかった。

```
[root@centos lib64]# ls -l /usr/lib64 | grep libfuse
-rw-r--r--. 1 root root 1103130 Jul 9 15:56 libfuse.a
-rwxr-xr-x. 1 root root 933 Jul 9 15:56 libfuse.la
lrwxrwxrwx. 1 root root 16 Jul 9 15:56 libfuse.so -> libfuse.so.2.9.3
lrwxrwxrwx. 1 root root 16 Jul 9 15:56 libfuse.so.2 -> libfuse.so.2.9.3
-rwxr-xr-x. 1 root root 706380 Jul 9 15:56 libfuse.so.2.9.3
my library version is 2.9.3
```

先輩に相談して、依存ライブラリを確認してみる。

```
[root@centos lib64]# ldd /usr/local/s3fs-fuse/bin/s3fs | grep libfuse
libfuse.so.2 => /lib64/libfuse.so.2 (0x0000003110c00000)
```

ここで依存ライブラリが`/usr/lib64/libfuse.so.2`ではなく`/lib64/libfuse.so.2`となっていることがわかる。

```
[root@centos lib64]# rpm -qa | grep fuse
fuse-2.8.3-4.el6.x86_64
gvfs-fuse-1.4.3-15.el6.x86_64
fuse-devel-2.8.3-4.el6.x86_64
fuse-libs-2.8.3-4.el6.x86_64
```

こっちの古いのを消去する。

```
[root@centos lib64]# yum erase fuse-devel fuse-libs
[root@centos lib64]# fusermount -u /mnt/s3fs
[root@centos lib64]# /usr/local/s3fs-fuse/bin/s3fs local-orfs /mnt/s3fs -o url=http://192.168.131.131:8080 -o passwd_file=/root/.passwd-s3fs -o default_acl=private -o allow_other,uid=501,gid=501 -o nomultipart
```

これでいけた。
KeystoreファイルからKey Hashを生成


Key Hashの生成方法について、忘れそうなので備忘メモ。

<br>

それぞれ以下のコマンドを使用して生成。

- デバッグ用

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64


<br>

- リリース用

keytool -exportcert -alias "エイリアス名" -keystore "Keystoreファイルのパス" | openssl sha1 -binary | openssl base64
ansible 実行時に ControlPath too long エラーが出るのを回避する

AWS の public DNS に対して ansible を実行すると、`us-east-1`リージョンでは成功するのに、`ap-southeast-1`リージョンでは、`ControlPath too long` というエラーが発生するという現象に悩んでいた。

よくよく調べてみると、デフォルトが `%(directory)s/ansible-ssh-%%h-%%p-%%r` という設定になっていて、`ap-southeast-1`リージョン（*.ap-southeast-1.compute.amazonaws.com）のように長いホスト名だと108文字の限界を越えてしまうせいだった。

> The path to use for the ControlPath sockets. This defaults to
>  "%(directory)s/ansible-ssh-%%h-%%p-%%r", however on some systems with
>  very long hostnames or very long path names (caused by long user names > or
> deeply nested home directories) this can exceed the character limit on
> file socket names (108 characters for most platforms). In that case, you
> may wish to shorten the string below.
>
> Example:
> control_path = %(directory)s/%%h-%%r

参考: https://github.com/zimbatm/home-deploy/blob/master/ansible.cfg

ということで、`~/.ansible.cfg` あたりに以下を追加して解決した。

```
[ssh_connection]
control_path = %(directory)s/as-%%h-%%r
```
PHPExcelでxlsファイルをCSVに変換する

PHPExcelというライブラリを使うと、xlsからcsvへかんたんに変換できます。

```lang:excel2csv.php
<?php

//PHPExcelライブラリ読み込み
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';

//Excel読み込み
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$book = $objReader->load('hodade.xls');

//CSV保存
$writer = PHPExcel_IOFactory::createWriter($book, 'csv');
$writer->save('hodade.csv');
```

以上！

PHPExcel
https://phpexcel.codeplex.com/
mac でファイルをDLすると付加される＠（アットマーク）の消し方

# Extended Attribute
mac でファイルをダウンロードすると必ずついてくる「＠（アットマーク）」

```bash
$ ll
total 34864
-rw-r--r--@ 1 white_aspara25  staff   3958071  7  8 10:27 sample.pdf
...
```

正体はここ↓にも書いてありますが、EA (Extended Attributes)と呼ばれる付加情報で、Finder などの検索に使われるものとのこと。
http://d.hatena.ne.jp/kanonji/20100912/1284292517

消すには、``xattr`` というコマンドを使います。

## EAの確認
``xattr [file_name]``

```
$ xattr sample.pdf
com.apple.metadata:kMDItemWhereFroms
com.apple.quarantine
```

## 特定のEAを削除
``xattr -d [attr_name] [file_name]``

```
$ xattr -d com.apple.quarantine sample.pdf
$ xattr sample.pdf
com.apple.metadata:kMDItemWhereFroms
```

## 全EAを削除

``xattr -c [file_name]``

```
$ xattr -c sample.pdf
$ xattr sample.pdf
$
```
shields.ioでバッジをフラットデザインにする

[http://shields.io](http://shields.io)というサービスを使うとフラットデザインのバッジをSVG形式で返してくれるので、これを以下のような感じで使うだけです。

## Travis
[![Build Status](https://travis-ci.org/naoty/NTYCSVTable.svg?branch=master)](https://travis-ci.org/naoty/NTYCSVTable) -> [![Build Status](http://img.shields.io/travis/naoty/NTYCSVTable/master.svg?style=flat)](https://travis-ci.org/naoty/NTYCSVTable)

```diff
-[![Build Status](https://travis-ci.org/naoty/NTYCSVTable.svg?branch=master)](https://travis-ci.org/naoty/NTYCSVTable)
+[![Build Status](http://img.shields.io/travis/naoty/NTYCSVTable/master.svg?style=flat)](https://travis-ci.org/naoty/NTYCSVTable)
```

## CocoaPods
[![Version](http://cocoapod-badges.herokuapp.com/v/NTYCSVTable/badge.png)](http://cocoadocs.org/docsets/NTYCSVTable) -> [![Version](http://img.shields.io/cocoapods/v/NTYCSVTable.svg?style=flat)](http://cocoadocs.org/docsets/NTYCSVTable)
[![Platform](http://cocoapod-badges.herokuapp.com/p/NTYCSVTable/badge.png)](http://cocoadocs.org/docsets/NTYCSVTable) -> [![Platform](http://img.shields.io/cocoapods/p/NTYCSVTable.svg?style=flat)](http://cocoadocs.org/docsets/NTYCSVTable)

```diff
-[![Version](http://cocoapod-badges.herokuapp.com/v/NTYCSVTable/badge.png)](http://cocoadocs.org/docsets/NTYCSVTable)
-[![Platform](http://cocoapod-badges.herokuapp.com/p/NTYCSVTable/badge.png)](http://cocoadocs.org/docsets/NTYCSVTable)
+[![Version](http://img.shields.io/cocoapods/v/NTYCSVTable.svg?style=flat)](http://cocoadocs.org/docsets/NTYCSVTable)
+[![Platform](http://img.shields.io/cocoapods/p/NTYCSVTable.svg?style=flat)](http://cocoadocs.org/docsets/NTYCSVTable)
```

## その他
[http://shields.io](http://shields.io)を見ると、他にもcoverallとかcode climateなどよく使われるバッジが提供されているようです。
voiceText WebApiのはじめ

voiceText WebApiを始めるには公式行ってcloud.voicetext.jp/webapi
利用登録してAPIキーを貰う
サンプルは公式に例があったりするので実行するにはcurlが必要だがCulr公式に行かなくても
MACなら最初から入っているのでターミナル実行して実行するだけで問題なし。
ActiveAdminで誰でも登録ができるようにする

app/model/admin_user.rbにて、

```rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
```

のように、registerableを追加。

これで、ActiveAdminのログイン画面に、SignUpが出て来て登録出来るようになる。
なんて簡単!
自転車用ドライブレコーダーFly6まとめ

fly6についてまとめておきます。


#fly6って何？ 
サイクリスト用のリア用ライト兼用ドライブレコーダー。スイッチ入れると自動的に後方視界をどんどん録画して、容量がいっぱいになると古いやつから上書きしていく。

#公式サイト
[Fly6 Bicycle Camera and Rear-light](http://fly6.com/ "Fly6")

#こんな動画が撮れる
[Fly6で撮影しながら夜の国道サイクリング by Gigazine](http://youtu.be/d5kXbCo6FIQ "Gigazine")
[YouTubeでFly6を検索](https://www.youtube.com/results?search_query=fly6 "YouTube")

#仕様など
- 画質の設定とかはない。設定できるのは現在時刻のみ。漢仕様。
- 付属の8GBのmicroSDで2時間録画可能。32GBだと8時間いけるけどバッテリーは5時間ちょい
- miniUSB充電/PC接続。バッテリー交換はできない。
- 充電しながら撮影できる。ただし端子部露出するので防水じゃなくなると思う
- 通常の使用であれば完全防水
- 雨だとタイヤにつける泥除けがないとレンズに水が飛んでくる。撥水性はあるので見えなくはならないけど見づらい。
- フラッシュライト兼用。映像へのライトの映り込みは思ったよりない。
- ライトのパターンは3種類
しかない。それなりに明るい。
    - [ライトパターン](http://youtu.be/3-_IomuvYeo)
- いまのところリアタイプしか存在してない。同じ仕様でフロントにつけるライト兼用カメラが欲しい。
- 撮影したAVIの動画はCodecがないとそのままだと再生できない。（MacのQuicktimeはダメ）。無料で使えるVLCプレーヤーっていうのを使う。
    - [VLC media player](http://www.videolan.org/index.ja.html)
- YouTubeやFacebookへの投稿には書き出しが必要。VideoPad（同じく無料）を使うと全部できるよ、とFly6のCFOがメールで返事くれたｗ 
    - [VideoPad動画編集ソフト](http://www.nchsoftware.com/videopad/jp/)
※無料版がある

#感想など
個人的に前から言ってますが、ジテツウする人のドライブレコーダー装着は今後必須になると思ってるので、これはソリューションとしては最右翼。現時点では間違いなくオススメです。GoProも持ってるけど、あれは連続録画時間が主にバッテリー由来で短すぎるのと、自動的に古いのを上書きする機能がないのでドライブレコーダーとしては手間が増えます。専用デバイスなのでこの用途ではfly6が有利。

まぁヘルメットの上につけるGoProには視認性で負けるので車除け（運転する人ごめんなさいね。たまにヒドイのがいるのであくまでそういう人のことだけです）としてはまだまだこれから認知度あげてかないとだな。

今後の課題はフロント用カメラが欲しいのと、撮影してますよ〜っていうのが明確にわかる車へのアピール。今後もっと多くの自転車乗りが使うこと、そしてあまりうれしくないけど、事故の記録が残るようになることで、

1. ルールを守って安全に乗る自転車乗りが増えることと。自分も撮影されてるわけだからね。
2. いやらしい話だが録画されていることで車が無理な運転をしなくなって、結果として自転車乗りがより安全になること

ができるといいかな。
MercurialのPatchbombでパッチメールの送信作業を自動化

結構前に[nginxの開発MLにパッチを送る](http://qiita.com/cubicdaiya/items/f25ea6b37019ce187ec9)というエントリを書いたが、昨日またnginxの開発MLにパッチを投稿する機会があってその際にMercurialの[Patchbomb](http://mercurial.selenic.com/wiki/PatchbombExtension)という拡張を使うと便利なのが分かったので書いてみる([nginx本家でもパッチをこっちの方法を奨めている](http://nginx.org/en/docs/contributing_changes.html))。

## Patchbombを使わない場合

今まではコミット内容をテキストで出力してメール本文にコピー&ペースト&添付して送っていた。

```bash
$ hg export -r 5252 > patchfile
```

しかし、これは事故りやすい。特にメール本文にコミットテキストを貼り付ける際に事故りやすい。また、一連の作業を手動で行うので緊張してミスる可能性も高い。

## Patchbombを使う場合

これに対してPatchbombを使うとパッチメールを送る一連の作業を自動化できる。設定は手元の.hgrcに以下のように数行追記するだけでよい。ここでは送信する際にsendmailを使ってるが、特定のSMTPサーバを指定することもできる。詳しくは[Mercurial本家](http://mercurial.selenic.com/wiki/PatchbombExtension)の解説を参照。

```:.hgrc
[extensions]
hgext.patchbomb =

[email]
method = /usr/sbin/sendmail
```

あとは`hg email`で送信したいコミットのリビジョン番号や送信先を指定して実行する。

```bash
$ hg email --from "myemail at example.com" --to "target at example.com" -r 5252
```

`--test`を指定すると`--dry-run`的な動きをする。

```bash
$ hg email --test --from "myemail at example.com" --to "target at example.com" -r 5252
```

リビジョン番号を範囲指定するとその範囲分のコミットの数だけメールを送ってくれるので便利。

```bash
$ hg email --from "myemail at example.com" --to "target at example.com" -r 5763:5765
```

ちなみに今回実際に送ったパッチはこんな感じ。コマンド一発でいい感じのメールをまとめて送ってくれるのでとてもよい。

 * [[PATCH 1 of 3] Style: use ngx_strlen() instead of strlen()](http://mailman.nginx.org/pipermail/nginx-devel/2014-July/005591.html)
 * [[PATCH 2 of 3] Style: use ngx_str_null()](http://mailman.nginx.org/pipermail/nginx-devel/2014-July/005590.html)
 * [[PATCH 3 of 3] Style: use ngx_str_set()](http://mailman.nginx.org/pipermail/nginx-devel/2014-July/005592.html)
シェルプロンプトの色分け設定


CentOSのプロンプトの色を変更するときにやること。
本番環境と開発環境とで色を変えたりすると分かりやすいのでお勧めです。
6.5でやってますが旧バージョンや他のディストリビューションでも問題無いと思います。

## 環境

- CentOS 6.5

## 特定ユーザの色分け設定

特定のユーザのプロンプトを変更する場合には`~/.bashrc`を下記のように変更する。

```shell:~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

export PS1="\[\e[1;31m\][\u@\h \W]\\$\[\e[m\] "			⇐追記
```

それぞれの項目の意味は下記の通り

|項目|意味|
|:--|:--|
|\\[\e[1;31m\\]|色分けしたい文字の先頭に付ける記号|
|\\[\e[m\\]|色分けしたい文字の末尾に付ける記号|
|\u|ユーザ名|
|\h|ホスト名|
|\W|カレントディレクトリ|
|\$|一般ユーザーならドル記号、rootユーザーならシャープ記号になる|

注意が必要なのは`\$`で、`\\$`の様にバックスラッシュでエスケープしてあげないと常に`$`が表示されることになる。

## 全ユーザの色分け設定

全のユーザのプロンプトを変更する場合には`/etc/bashrc`を下記のように変更する。


```shell:/etc/bashrc　31行目　変更前
  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
```

```shell:/etc/bashrc　31行目　変更後
  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="\[\e[1;31m\][\u@\h \W]\\$\[\e[m\] "
```

## カラーコードについて

`1;31`みたいなカラーコードについてはまた別途。
[Node.js] npm の proxy と registry 設定

# npm の proxy と registry 設定

社内環境で、いつも問題になるので覚え書き。

proxy と https-proxy だけでだめなら registry を設定している。

※以下、プロキシサーバを `http://proxyserver:8080` と記述している。

```bash
$ npm -g config set proxy http://proxyserver:8080
$ npm -g config set https-proxy http://proxyserver:8080
$ npm -g config set registry http://registry.npmjs.org/
$ npm config list
```

Linux では proxy と https-proxy の設定だけで問題は起きていない。
Windows では registry も https から http に変更しないと動かない。

Windows では以下の様なBAT/CMDスクリプトファイルを用意すると良い。

```bat
call npm -g config set proxy http://proxyserver:8080
call npm -g config set https-proxy http://proxyserver:8080
call npm -g config set registry http://registry.npmjs.org/
call npm config list
pause
```
ビルド完了時に音を鳴らす(say, saykana, afplay)

#Macのterminalで音を鳴らす方法

jenkinsとか自動ビルドマシンとか置いておくと、ビルドが成功・失敗した時に音がならないと画面を確認しないといけなくて面倒くさい。


##say 
mac組み込みの音声発話コマンド。基本的には英語。ローマ字表記でそれなりにはしゃべる

```shell-session:hoge.command
say "resource finished. dokidoki purikyua desuyo"
```

-v G とかをつけると歌う。地味にウザい。

```shell-session:vocal.command
say -v G "dokidoki project scs build finished"
```

日本語をしゃべらせるなら、日本語ボイスをインストールする必要がある
システム設定 -> 音声入力と読み上げ -> テキスト読み上げ
から「システムの声」で追加可能
![スクリーンショット 0026-07-10 11.19.45.png](https://qiita-image-store.s3.amazonaws.com/0/8521/fefb7095-ffcf-7038-b89c-1ccccb8dd03f.png)

##afplay
ビルド失敗のテーマ曲とかを社内で決めて、鳴らすなら、外部音声ファイルをafplayで再生する

```shell-session:deathstar.command
afplay build_failed.mp3 
```

##saykana
ゆっくりボイスが使いたい人はsaykanaというソフトを落としてきて入れる
[Saykana](http://www.a-quest.com/quickware/saykana/)
まさに「ゆっくり」のボイスなので、適所で判断して使って下さい

```shell-session:redis.command
saykana -s 20 "レディスがはしったよ"
```
(20ぐらいの速度がゆっくりボイスっぽく聞こえる)


sayやsaykanaは, -o オプションを付けることで外部ファイルに音声を保存できるので、
音声を外部に保存して、他の人に受け渡しとかもできます。

##曲の選定
成功した時は嬉しくなる音を。
失敗した時は、すごい暗い音ではなくても、ちょっと残念な音を鳴らすほうが良い

成功時
・ドラクエのレベルアップ
・FFの戦闘勝利
etc...

失敗時
・ニコ動のFooさんの笛
etc...
PHPでダウンロードさせるファイル名がIEで文字化けする件

問題はどんな言語で書いても起こることですが、たまたま仕事でPHPつかってたときにぶつかったのでメモしておきます。

# 結論


HTTPのレスポンスヘッダで `Content-Disposition: attachment; filename*=UTF-8''URLエンコードされたファイル名`を送ってあげる。


# 追記

2017/11/02: Edgeでも通用するようです。https://github.com/netcommons/NetCommons2/issues/126

# ファイル名が化ける

PHPでファイルアップローダをつくっていました。

動作確認はUbuntu 14.04のFirefox30をつかっていましたが、社内ではIE11がデフォ。「一応やっとくか」とIE11で動かしたら、日本語のファイル名が見事に化けました。

またお前か、IE！チキショー

Slim Frameworkをつかっているので、こんなコードになっています。

```php
$app->response->setStatus(200);
$app->response->headers->set('Content-Type', $type);
$app->response->headers->set('Content-Disposition', 'attachment; filename='.$filename);
$app->response->headers->set('Content-Length', $size);
$app->response->setBody(file_get_contents($filepath));
```

# UTF-8からShift-JISに変換してやった

ならば、ということで、

```php
$app->response->headers->set('Content-Disposition', 'attachment; filename='.mb_convert_encoding($filename, 'SJIS-win', 'UTF-8');
```

などとしてやったわけですが、今度はLinuxで化けてしまって、会社のみんなはいいけど自分たちはすごく不便、という状況に。

ちくしょうめ。

# IEを使っているかどうか判断?

ググってみると、UserAgentの文字列をみてSJISかUTF-8か判断している記事が多く見つかったのですが、IE11になったときにUserAgentからMSIEの表記が消えてTridentになりましたよね。またそういうのがないとも限らないので、できるだけ避けたいものであります。

# 最終的に...

`Content-Disposition`を`attachment; filename*=UTF-8''URLエンコードされたファイル名`などとすれば良いことが判明。仕様はRFC6266だそうです。

RFC6266のこの書式をサポートしているのはIE9以上、(少なくとも)Firefox22以上、Safari6以上(Safari5はダメらしい)ということが、http://greenbytes.de/tech/tc2231/ からよめました。

最終的にはこんなコードになりました。一応動いています。

```php
$app->response->setStatus(200);
$app->response->headers->set('Content-Type', $type);
$app->response->headers->set('Content-Disposition', 'attachment; filename*=UTF-8\'\''.rawurlencode($filename);
$app->response->headers->set('Content-Length', $size);
$app->response->setBody(file_get_contents($filepath));
```


# 参考

http://support.microsoft.com/kb/436616/ja
http://tools.ietf.org/html/rfc6266
軽量・シンプルな思想でデータバインディングができるVue.jsの基礎まとめ

## はじめに
話題のVue.jsについて研究してます。
日本語のドキュメントが少なく苦戦しているため、思考錯誤しながら記事をアップデートしていく予定です。

### 追記（2016年12月1日）
この記事は公式日本語ドキュメントが無い時代に書いた記事です。
[公式の日本語ドキュメントができたので、今後はこちらをご覧ください。](https://jp.vuejs.org/)

## よく使う機能
`{{hoge}}` : バインディングさせたい変数
`v-for` : ループ
`v-model` : 入力フォームと連動したい場合
`v-on` : Click時などのイベントにひもづける

## Sample-1
変数をテンプレート内に表示させるだけのサンプル

### HTML
```html
<div id="item">
	<h1>{{title}}</h1>
</div>
```

### JavaScript
```js
var vue = new Vue({
	el: '#item',
	data: {
		title: 'タイトル'
	}
});
```

### 補足
`{{ aaa + bbb }}`というように四則演算も可能

### 出力結果
`タイトル`という文字が表示されます

## Sample-2
オブジェクトをループさせて表示させるサンプル

### オブジェクト
```js
var obj = {
    aaa: 111,
    bbb: 222,
    ccc: 333
};

```


### HTML
```html
<div id="item">
    <ul v-for="val in vals">
        <li>{{ val }}</li>
    </ul>
</div>
```

### Vue.js側
```js
var vue = new Vue({
    el: '#item',
    data: {
        vals: obj
    }
});
```


## Sample-3
`v-on`を使って、クリック時にアラートを表示。

### HTML
```html
<div id="item">
	<h1>{{title}}</h1>
	<a v-on:click="onFunc('hello!', $event)">Button</a>
</div>
```

`v-on:click`は`@click`と省略も可能。

### JavaScript
```js
var vue = new Vue({
	el: '#item',
	data: {
		title: 'test'
	},
	methods: {
		onFunc: function(msg, e) {
			console.log(e.target.tagName); //eはクリックした要素を取得できる
			alert(msg + 'クリックしました');
		}
	}
});
```

## バインディング中は変数を非表示にするやり方
意外にハマった（分からなかった）ので書きます。
通常だと、変数`{{hoge}}`がチラッと見えてかっこ悪いので、以下のようにすると、バインドするまでは非表示になります。

### HTML
紐付けているHTML要素に`v-cloak`をつける。

#### 例

```html
<div v-cloak>
```

### CSS
非表示にさせるため、以下を追加。

#### 例
```css
<style>[v-cloak] { display:none }</style>
```
Find GameObject

UnityのGameObjectを取得したい場合、
GameObjectの階層がわかっているのであればFindを使用する。

GameObject gameObject = GameObject.Find("MenuContainer/Spacer/Spacer/Attach/Layout/WidgetTabsBar");

if (gameObject != null) {
    gameObject.GetComponent<Widget>().Translate(0.0f, 3.0f, 0.0f);
}
rbenv 0.4.0 (ruby 2.1.2) install memo

# staff グループの追加

```shell-session
$ sudo /usr/sbin/groupadd staff
$ sudo gpasswd -a [user] staff
```

ログインし直さないとグループは反映されないので注意。

# rbenv を /opt にインストール

```shell-session
$ cd /opt
$ sudo git clone git://github.com/sstephenson/rbenv.git rbenv
$ sudo chgrp -R staff rbenv
$ sudo chmod -R g+rwxXs rbenv
```

# /etc/profile に設定追加

```shell-session
$ sudo sh -c 'cat >> /etc/profile'
export RBENV_ROOT=/opt/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

/etc/profile を書き換えたので、ログインし直す。

# ruby をインストール

```shell-session
$ mkdir /opt/rbenv/plugins
$ cd /opt/rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
$ chgrp -R staff ruby-build
$ chmod -R g+rwxs ruby-build
$ git clone git://github.com/sstephenson/rbenv-default-gems.git
$ cat > /opt/rbenv/default-gems
bundler
pry
rbenv-rehash
$ rbenv install 2.1.2
$ rbenv global 2.1.2
```

以下を参考にしました。
http://qiita.com/chezou/items/86ee6ded253c094a23b6
http://qiita.com/semind/items/8e973a544b592376a07e
http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032
vim キーボードマクロで連番(シーケンス) を生成する


概要
----

数値にカーソルを合わせてCtrl + a でのカウントアップを利用して
連番の文字列を生成する


8/16進数になっちゃう
----------------

デフォルトだと「01」等の0から始まる数値は8進数になってしまうため、(0x01だと16進)

```
:set nrformats=
```

によって、数値インクリメントオプションをクリアし、10進数としてカウントアップするようになる


キーボードマクロの作成
------------------

```
host01
host03
host02
host04
```
等の連番文字列を作る場合の例

まず1行目を普通に書く

```
host01
```

カーソルを1行目にあわせてキーボードマクロの記録を開始する
```qa``` でマクロ記録開始
次に、行をヤンク```yy```
次に、行をペースト```p```
次に、行末に移動```$```
次に、カウントアップ```Ctrl+a```

ここまでをマクロに保存 ```q```


キーボードマクロの再生
------------------

記録したマクロは```@a```で再生できる
再生する際に```10@a```とすると10回再生が繰り返される

```
host01
host02
host03
host04
host05
host06
host07
host08
host09
host10
host11
host12
```

ちなみに```host-01```をCtrl+aでカウントアップすると 
```host00``` になります。 -1が0になったという感じですね。
この回避方法は何かあるとは思うのだけど調べてません。
要約：iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い


はじめに
====

社内勉強会の資料をSlideShareのUPしました。
[iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い](http://www.slideshare.net/mokemokechicken/iosandroidmodel)
これについての要点をまとめます。


![iOS_Androidアプリエンジニアが理解すべき「Model」の振る舞い.png](https://qiita-image-store.s3.amazonaws.com/0/11124/82c234c1-1c1b-23d2-e559-27d6bd7b963a.png "iOS_Androidアプリエンジニアが理解すべき「Model」の振る舞い.png")

この資料はiOS/Androidのような **クライアントアプリケーションにおける「Model」とは何か**、という話です。


Modelとは何か？
====

Modelに「データやビジネスロジックを扱うコンポーネント」という役割を担わせるというのは多くの人がやっていることだと思います。しかし、サーバ側のWebアプリケーションとは異なり、クライアント側のiOS/AndroidアプリのModelには次の２つの振る舞いがとても重要です。

* **基本死なない**（Singleton的である）
* **「通知」で変更を伝える**（Callback的ではなく）

そのようなModelがなぜ必要か？
============

この2点の役割を持つコンポーネントがなく、特に何も考えずにスマホアプリを実装すると、次のような問題がたいてい起こります。

よくある問題点
----
### 危険な処理

一つ目は、 **既に無効になっているObjectに対してCallbackが返ってきて、無効な処理を行う危険** です。
例えばAndroidで、ActivityがDestroyされているのに、通信のCallbackが戻ってきて、ViewやDialogの操作を行おうとして落ちるような問題です。

###無駄な処理

同様に **既に意味的に行う必要がないCallbackの処理** を行ってしまう問題もあります。
無駄と言っても、
通信結果のデータをViewに表示するだけならまだマシですが、
そのデータを更に加工したり、その後更に通信を行ったりしていると結構響いてきます。

###画面を行ったり来たりしていると重くなる

無駄な処理や通信等を重複して実行してしまう可能性があり、 **ユーザが画面を行ったり来たししているうちに非常に遅くなったり、メモリが足りなくて落ちたりする問題** もあります。
これも通信が重複するくらいなら、まだ良いのかもしれませんが、センサーデバイスを起動したりLocalDBを一気に更新したりするような処理の場合かなり問題です。

解決方法
------

前述のModelの導入すると上手く解決できます。詳細は資料の方を見て頂ければと思います。

Webアプリ開発からスマホアプリ開発に移ってきた人ほど注意して欲しい
=====

私もそうだったのですが、
Webアプリケーションをよく開発していた人は **「Model」**というと **「ああ、あれね」**と思い浮かびますが、 **前述のような振る舞いの必要性が全く頭に浮かびません**（たぶん）。Webアプリでは **Objectのライフサイクル** とか **Singleton** とか **Observerパターン** とか **普通考えない**ですからね。私も以前師匠の[kaoru](http://qiita.com/kaoru)先生から色々教わりまして、そこで教えてもらったことを今回まとめてみました。なので、Webアプリの経験はあるからModelのことはわかっているけど、スマホアプリは日が浅い、という方は是非一読して頂けると何か得るものがあるんじゃないかと思います。

もちろん、単にアプリ開発を始めたばかりの人もこの辺の内容を理解しておくと、かっこいい設計のアプリが作れるようになると思います！

色々な設計はあると思いますが、少なくともこういう問題が起こりやすいことを認識しておくことと、
基本的にはこういう解法があるということを知っておいて損はないでしょう。
設計は議論をすると身に付くし深まりますので、みなさんも是非周囲の人と協議してみてください。
Swiftでdispatch_afterを使う


Swiftではちょいちょい書式が変わったりするのでメモ。

```swift
let delay = 3.0 * Double(NSEC_PER_SEC)
let time  = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
	println("dispatch after!")
})
```