OmniAICreator/Qiita-1.07M huggingface dataset:
u (PCRE_UTF8) オプションをつけないと \h、\s、\v で想定しない文字を破壊するおそれがある

PCRE 関数の[エスケープシーケンス](http://php.net/manual/ja/regexp.reference.escape.php)のうち、`\h` (水平方向の空白文字)、`\s` (空白文字)、`\v` (垂直方向の空白文字) を使う場合、UTF-8 のオプション (u)をつけないと、preg_replace などで不要な文字を削除する際に想定しない文字を破壊するおそれがあります。

次のコードはひらがなの「だ」(U+3060) が破壊される様子を示したものです。「だ」の3番目のバイト (0xA0) がノーブレークスペース (U+00A0) と誤検出されてしまいます。

```php
<?php

$str = "だ";

var_dump(
  "\xE3\x81\xA0" === $str,
  "\xE3\x81" === preg_replace("/\h/", "", $str),
  "e381" === bin2hex(preg_replace("/\h/", "", $str)),
  $str === preg_replace("/\h/u", "", $str)
);
```

Unicode で定義されるすべての文字 (U+0000 から U+10FFFF) に対してこれらのエスケープシーケンスを試すと、膨大な数の文字がマッチすることがわかります。u オプションをつけた場合でも、複数の文字がマッチしますので、それらの1つ1つが本当に想定した種類の文字であるのかどうかを検討する必要があります。u オプションをつけると、次の文字がマッチします。

```
U+0009 U+0020 U+00A0 U+1680 U+180E U+2000
U+2001 U+2002 U+2003 U+2004 U+2005 U+2006
U+2007 U+2008 U+2009 U+200A U+202F U+205F
U+3000 
```

```php
<?php

print_matched_chars(function($char) {
    return preg_match('/\h/', $char);
});

function print_matched_chars(callable $callable) {

    for ($i = 0; $i < 0x110000; ++$i) {

        if ($i > 0xD7FF && $i < 0xE000) {
            continue;
        }

        $char = utf8_chr($i);
        $hex = strtoupper(dechex($i));

        if ($callable($char)) {
            echo 'U+',
            $i < 0x1000 ? str_repeat('0', 4 - strlen($hex)) : '',
            $hex, ': ' , $char, PHP_EOL;
        }

    }
}

function utf8_chr($cp) {

    if (!is_int($cp)) {
        exit("$cp is not integer\n");
    }

    if ($cp < 0 || (0xD7FF < $cp && $cp < 0xE000) || 0x10FFFF < $cp) {
        exit("$cp is out of range\n");
    }

    return mb_decode_numericentity('&#'.$cp.';', [0, 0x10FFFF, 0, 0x10FFFF], 'UTF-8');
}
```
Nginx:[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)

私はNginxをインストールして、起動すると、下記のエラーメッセージが出てきました。

```
[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
```

Nginxを停止しても、`sudo lsof -i:80`ですると、nginxは動いてるみたいです。

下記のコマンドで80のプロセスを全部殺す

`sudo fuser -k 80/tcp`  


再度起動すると、無地に起動できました。
service nginx start

トラブル再発のため、簡単にメモしました。
botoでS3の署名付きURLを生成する


PythonのAWS SDKである[boto](https://github.com/boto/boto)を使ってS3の署名付きURLを生成する。

# URLだけを生成する

1つのアイテムのURLを生成するだけならコネクションから直接生成するのがお手軽な方法。

```python
conn = boto.connect_s3(aws_access_key_id, aws_secret_access_key)
url = conn.generate_url(expire_second, method='GET',
					    bucket='bucket_name', key='path/to/file')
```

# Bucketオブジェクトを生成してから生成する

バケットの中のアイテムを探しながらの場合はこちらの方が楽。

```python
conn = boto.connect_s3(aws_access_key_id, aws_secret_access_key)
bucket = conn.get_bucket('bucket_name')
key = bucket.get_key('path/to/file')
url = key.generate_url(expire_second)
```

全リストならこんな感じ。

```python
bucket = (boto.connect_s3(aws_access_key_id, aws_secret_access_key)
          .get_bucket('bucket_name'))
for key in bucket.get_all_keys():
	print(key.generate_url(60))
```


# 参考

* [S3 - boto online document](http://boto.readthedocs.org/en/latest/ref/s3.html)
CodeDeploy AgentをAmazon Linuxに手動でインストールする


AWSの新しいサービスとして[AWS CodeDeploy](http://aws.amazon.com/jp/codedeploy/)がリリースされました。
どんなサービスなのかはインターネットに色々な方が書いているので、そちらを見てもらえればと思いますが、デプロイ対象のEC2インスタンスにはCode Deploy Agentなるものをインストールしないみたい。
Amazon Linuxにインストールしてみたメモを残しておく。後できちんとまとめる。
といっても、やり方は[こちら](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent.html#how-to-run-agent-install-linux)に書いているまま。

## AWS CodeDeploy AgentがサポートするAMI

- Amazon Linux 2014.09.1
- Ubuntu Server 12.04 LTS and 14.04 LTS
- Windows Server 2008 R2 and 2012 R2

## Amazon Linuxでの動作確認

インストールする対象のAmazon LinuxはIAM Roleをつけておく。

### インストール

```
$ sudo yum update
$ sudo yum install aws-cli
$ cd /home/ec2-user
$ aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1
$ chmod +x ./install
$ sudo ./install auto
```

### 動作確認

```
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 2505

$ sudo yum info codedeploy-agent
読み込んだプラグイン:priorities, update-motd, upgrade-helper
インストール済みパッケージ
名前                : codedeploy-agent
アーキテクチャー    : noarch
バージョン          : 1.0
リリース            : 1.643
容量                : 5.8 M
リポジトリー        : installed
提供元リポジトリー  : /codedeploy-agent-1.0-1.643.noarch
要約                : Provides the required files for CodeDeploy agent to run in EC2 instances
ライセンス          : Amazon.com Internal
説明                : CodeDeploy instance agent is responsible for doing the actual work of deploying software
                    : on an EC2 instance.
```


設定ファイルとかもあるっぽいので、何かしらの設定が必要かも
Yahoo!ニュースWeb APIの終了と、代替手段としてのRSSについて

お世話になっております。

Yahoo!ニュースWeb APIの終了についてAPIのサイト上でも拝見しております。
同じようにニュースを配信できる機能がないかと検討していたところ、本サービスで以下のような投稿を見つけたしだいです。

http://qiita.com/kgo/items/b429323db8eaa32523f8
にて別の質問者さんがヤフーニュースのAPIの代替手段として、RSSを利用されることを質問されており、
返答内容を確認しています。

これは商用利用のモバイルアプリケーションでも同様のことが言えますでしょうか？
・無料アプリの無料機能として提供する（広告やニュースに関係しない機能の課金は搭載する可能性があります。）
・ヤフートピックスなどのRSSファイルへのリンク情報をあらかじめアプリに組み込み、記事タイトルのみをアプリ内に表示する
以上のような態様を検討しています。

先述のリンク内ではRSSを自前のサイトなどに組み込むことは許容されるという旨でしたが、
「モバイルアプリ」に「商用利用」で、利用するとなった場合はどのように検討されておりますでしょうか。

以上、ご確認のほどよろしくお願いいたします。
[Objective-C] [iOS] CoreAnimation後のFrame（position）移動ができない場合

animation後も、viewが元に戻らないように`removedOnComletion=NO`を設定していることが原因

animationの前に`layer.position = (animation後のpostion）`を設定してやれば、removedOnComleteとfillModeの設定は必要ない。

参考： http://mythosil.hatenablog.com/entry/20110617/1308325011
Macのターミナルからメールサーバの受信メールを確認


超基本的なところ。備忘録です...

`telnet`コマンドを使う。
プロトコルはPOP（110番ポート）だと想定。

```
$ telnet <メールサーバ名> 110
Trying <IPアドレス>...
Connected to <メールサーバ名>.
Escape character is '^]'.
+OK Dovecot ready.
```

受信サーバとして利用しているDovecotに接続し、応答待ちの状態になる。

`user <ユーザー名>`, `pass <パスワード>`と、順次入力。

```
（さっきの続き）
user <ユーザー名>
+OK
pass <パスワード>
+OK Logged in.
```

これで受信サーバへのログインが完了し、受信メールを閲覧したり削除したりできる。
簡単な操作は以下のコマンドで。

- `list`でメールのリストを表示
- `retr <リスト番号>`でメールの内容表示
- `dele <リスト番号>`でメール削除

```
（さらに続き）
list
+OK 8 messages:
1 1726
2 1728
3 1739
4 1782
5 1770
6 1778
7 2028
8 878
.

retr 3
+OK 1739 octets
Return-Path: ...
X-Original-To: ...
Delivered-To: ...
（以下略）

dele 7
+OK Marked to be deleted.
```

以上、簡単なメモでした
HTMLテンプレート

普段使ってるテンプレ晒し

https://gist.github.com/Orleika/313eda54d55b0b8ac2fb

```html:index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="description" content="">
  <meta property="og:type" content="">
  <meta property="og:title" content="">
  <meta property="og:description" content="">
  <meta property="og:site_name" content="">
  <meta property="og:url" content="">
  <meta property="og:image" content="">
  <meta name="twitter:card" content="">
  <meta name="twitter:site" content="">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  <link rel="shortcut icon" href="favicon.ico">
  <link rel="apple-touch-icon" href="apple-touch-icon.png">
  <link rel="stylesheet" href="css/bootstrap.css">
  <link rel="stylesheet" href="css/style.css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
  <title>title</title>
</head>

<body>
  <header role="banner">
    <h1 class="page-header">title</h1>
    <nav role="navigation">
      <ul>
        <li></li>
      </ul>
    </nav>
  </header>

  <main role="main" class="container">
    <article role="article">
      <section></section>
    </article>
  </main>

  <footer role="contentinfo">
    <small>&copy; 2015 xxx inc.</small>
  </footer>

  <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', '', 'auto');
    ga('send', 'pageview');

  </script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
  <script src="js/bootstrap.min.js"></script>
</body>

</html>
```
SwiftのカスタムクラスArray操作その1（フィルター）【メモ】

#SwiftのカスタムクラスArrayでフィルター

SwiftのArray内に以下の様なクラスのオブジェクトが入っていたとして、プロパティの値でフィルターするときのメモ。

**※末尾にNSPredicateでの記法も書いておきます。
（データベース的にコーディングするなら、機能が豊富なNSPredicateの方が楽かも）**


##使用するカスタムクラス（!無しのプロパティに修正）

```swift:Cat.swift
class Cat:NSObject{
    var name:String
    var color:String
    var age:Int
    var score:Int
    
    init(data: (String,String,Int,Int)){
        name = data.0
        color = data.1
        age = data.2
        score = data.3
    }
}
```

##テストデータ

テストデータを準備しておきます。

```swift:UseCat.swift
var all_cats:[Cat] = [Cat]()
all_cats.append(Cat(data:("タマ","白",10,10)))
all_cats.append(Cat(data:("コトロ","茶トラ",2,10)))
all_cats.append(Cat(data:("ミケ","三毛",3,10)))
all_cats.append(Cat(data:("チビトラ","茶トラ",4,10)))
all_cats.append(Cat(data:("タケチヨ","キジトラ",7,10)))
all_cats.append(Cat(data:("マリアンヌ","白",7,10)))

```

##フィルター処理

###正式な記法
まず、正式な記法だと以下のとおり。

```swift:UseCat.swift
var whitle_cats = all_cats.filter({

    //filterメソッドは引数として配列内のオブジェクトを受け取れます
    //また戻り値はBool型
    (cat: Cat) -> Bool in
    
    //フィルター結果として、残したい要素だけtrueを返す（検索条件）
    return cat.color == "白"
})
```

結果を確認すると以下のとおり

```swift:UseCat.swift
for cat in whitle_cats{
    println(cat.name + ":" + cat.color)
}
```


```vim:【実行結果】
タマ:白
マリアンヌ:白
```

###※省略した記法

Swiftでは関数パラメータを渡すときに、引数の記述を省略して＄0,＄1として値を受け取ることができます。またreturn文を省略して直接処理結果をreturnすることができます。

```swift:UseCat.swift
var whitle_cats2
   = all_cats.filter( { $0.color == "白" })

//結果確認
for cat in whitle_cats2{
    println(cat.name + ":" + cat.color)
}
```

```vim:【実行結果】
タマ:白
マリアンヌ:白
```

##Objective-Cと同様にNSPredicateを使う場合

NSPredicateはCoreDataなどでも利用されているように、非常に強力なパターンマッチングやグループ化の機能を持っています。Array内の抽出を行うならこちらを活用するのもありだと思います。（Swiftの配列上に同様の機能が盛り込まれるのかは不明であるため）

```swift:UseCat.swift
//検索条件をNSPredicateで作成
let pred:NSPredicate = NSPredicate(format: "color contains '茶'")!

//Swiftの配列にはNSPredicateを使うメソッドが無いため、NSArrayにキャストして呼び出す
let white_cats3 = (all_cats as NSArray).filteredArrayUsingPredicate(pred)

//結果確認
for cat in white_cats3{
    println(cat.name + ":" + cat.color)
}
```

```vim:【実行結果】
コトロ:茶トラ
チビトラ:茶トラ
```

**※SwiftのArrayからNSArrayの変換をどうするのかと思いましたが、キャストだけで良いのは楽ですね！**
nkfのメモ


###オプション

--url-input　URLの%エンコードを元に戻してくれる。
--overwrite 上書き
-w UTF8に変換
--guess 文字コードの推測

-s Shift_JIS
-Lw CRLF(Windows風の改行)


###コマンド例
とりあえずUTF8に変更したければ以下のコマンドで。

nkf --overwrite -w hoge.txt

Windows風にしたければ以下のコマンド

nkf --overwrite -s -Lw
Hubot の標準的な権限管理 (hubot-auth)

# 問題

Hubot 2.9.x 時代の標準的な権限管理についての日本語リソースが少ない。

# 解決策

ぼくが書く。覚え書きをかねて。

ここでは `hubot-auth@1.1.2` について説明する。

## github/hubot-scripts の auth.coffee

https://github.com/github/hubot-scripts/blob/master/src/scripts/auth.coffee

deprecated。忘れろ。

## hubot-auth

https://github.com/hubot-scripts/hubot-auth

Hubot 2.9.x 現在で、標準的な権限管理の仕組み。以下の機能を提供する。

- Hubot の User 向けの Auth クラスの提供
- それを操作するコマンドの提供

### インストール

一般的な Hubot スクリプトと同様。

`npm install --save hubot-auth` からの `external-scripts.json` への追記。

### 設定

`HUBOT_AUTH_ADMIN` ... 管理者を設定する。カンマ区切りで `user.id` を設定する。これは adapter 依存の値なので一概には言えない。

### コマンド

https://github.com/hubot-scripts/hubot-auth/blob/v1.1.2/src/auth.coffee#L7-L12

```coffeescript
# Commands:
# hubot <user> has <role> role - Assigns a role to a user
# hubot <user> doesn't have <role> role - Removes a role from a user
# hubot what roles does <user> have - Find out what roles a user has
# hubot what roles do I have - Find out what roles you have
# hubot who has <role> role - Find out who has the given role
```

- hubot \<user> has \<role> role - ロールをユーザーに割り当てる。管理者しか実行できない。
- hubot \<user> doesn't have \<role> role - ロールをユーザーから取り除く。管理者しか実行できない。
- hubot what roles does \<user> have - ユーザーに割り当てられたロールを返す。
- hubot what roles do I have - 発言者自身に割り当てられたロールを返す。
- hubot who has \<role> role - ロールの割り当てられたユーザーを返す。

### Auth クラス

https://github.com/hubot-scripts/hubot-auth/blob/v1.1.2/src/auth.coffee#L38-L65

```coffeescript
  class Auth
    isAdmin: (user) ->
      user.id.toString() in admins

    hasRole: (user, roles) ->
      userRoles = @userRoles(user)
      if userRoles?
        roles = [roles] if typeof roles is 'string'
        for role in roles
          return true if role in userRoles
      return false

    usersWithRole: (role) ->
      users = []
      for own key, user of robot.brain.data.users
        if @hasRole(user, role)
          users.push(user.name)
      users

    userRoles: (user) ->
      roles = []
      if user? and robot.auth.isAdmin user
        roles.push('admin')
      if user.roles?
        roles = roles.concat user.roles
      roles

  robot.auth = new Auth
```

### 他のスクリプトからの使いかた

https://github.com/hubot-scripts/hubot-auth/blob/v1.1.2/src/auth.coffee#L15-L16

```coffeescript
#   * Call the method: robot.auth.hasRole(msg.envelope.user,'<role>')
#   * returns bool true or false
```

`robot.auth.hasRole(msg.envelope.user, '<role>')` でロールの有無をチェックできる。

### 具体例

管理者には `'Sir! Yes! Sir!'` を返し、
`developer` ロールを持っているユーザーには `Hi.` を返し、
それ以外には `'???'` を返す例。

```coffeescript
module.exports = (robot) ->
  robot.respond /hello/, (msg) ->
    # 権限チェック
    if robot.auth.isAdmin(msg.envelope.user)
      msg.send 'Sir! Yes! Sir!'
    else if robot.auth.hasRole(msg.envelope.user, 'developer')
      msg.send 'Hi.'
    else
      msg.send '???'
```

# その他注意事項

- 管理者権限の書き換えはできない。環境変数のみで設定できる。
- 設定した権限は永続化していないと再起動などで消えてしまう。hubot-redis-brain などの brain 系スクリプトで、永続化しておくこと。

# 関連 Qiita 投稿

- http://qiita.com/dtaniwaki/items/d89f7c1ed714f50497ed ... 簡易な権限実装。特定ユーザーを完全に無視する。
- http://qiita.com/cooldaemon/items/5b846423b788e037881a ... hubot-auth で足りない人向け。
Fabric For IntelliJ/AndroidStudio でサインアウトする(mac)

twitter fabricのアカウントを諸事情により2個持っているのだが、IntellJ IDEA/Android StudioにインストールしたFabric Pluginは一度サインインすると、サインインすることがパッと見てできなかった。

散々調べた挙句、この手段で解決したのでメモ

``` bash
$ rm -rf ~/Library/Caches/com.crashlytics/
```

これだけ。
LESSのmixinで特定の場所だけに!imporantをつける

そもそも`!important`なんてつけないで済むほうがいいのですが、元のmixinに書かなくてもできたのでメモ。

## LESS
```scss
.foo(@color: #333) {
    color: @color;
} 
.bar {
    .foo() !important;
}
```
## CSS
```css
.bar {
    color: #333 !important;
}
```
上記のmixinの`color:@color`の箇所に`!important`をつけなくても、mixinを使用する際に`!important`をつければその箇所だけ付与してくれます。
ruby-opencvを使って画像認識


#概要
##opencvってなんぞや
Open Source Computer Vision Libraryの略
インテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリ
公式のサポート言語：C、C++、Python、Java
*コンピュータービジョン：画像・映像を分析する分野

##opencvで解析できること
・行列演算
・フィルター処理・オブジェクト検出
・特徴点抽出
・オブジェクトトラッキング
・カメラキャリブレーション
・機械学習
・パノラマ合成
・GUI（ウィンドウ表示、画像ファイル、動画ファイルの入出力、カメラキャプチャ）

#試しに顔認識をしてみました。
##下準備

```
brew search opencv
brew tap homebrew/science
brew info opencv
brew install opencv
gem install ruby-opencv
```
##コード

``` ruby:face_tracking.rb
require 'opencv'

window = OpenCV::GUI::Window.new "face detect"
capture = OpenCV::CvCapture.open
detector = OpenCV::CvHaarClassifierCascade::load "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"

loop do
  image = capture.query
  image = image.resize OpenCV::CvSize.new 640, 360
  detector.detect_objects(image).each do |rect|
    puts "detect!! : #{rect.top_left}, #{rect.top_right}, #{rect.bottom_left}, #{rect.bottom_right}"
    image.rectangle! rect.top_left, rect.bottom_right, :color => OpenCV::CvColor::Red
  end
  window.show image
  break if OpenCV::GUI::wait_key(100)
end
```

参考資料
・[OpenCVとは？ その機能概要／構成技術／主要モジュール ](http://www.buildinsider.net/small/opencv/01)
・[ruby-opencvをインストールして顔認識した](http://shokai.org/blog/archives/8627)
iOSとHTML5とWebSocketと画面ロックと

※ *`visibilitychange`への言及を修正いたしました。*

※ *iOS 8.1以降の変更かもしれませんが、いつの間にか、Safariをバックグラウンドに移したり、端末がスリープしたりするくらいでは、WebSocketが勝手に切られたりはしなくなったようですね...。何のために苦労してこんな記事を書いてしまったのだろう...*

# はじめに

iOS向けにWebSocketを使うWebアプリを書いていたら、端末放置中にロック画面になったのでロック解除してSafariに戻ってみたら...**問答無用でWebSocketが切断されましたとさ**、という目に遭ってムッとしてしまったので、せっかくなので色々とまとめてみようかと思いまして。

Safariを使う場合とUIWebViewでの埋め込みWebアプリでの両方について書いてみます。(後者は条件によって色々変わるかもしれませんが...)

# WebSocket

* **Safariの場合**: 先程述べた通り、Safariではブラウザがバックグラウンドに移ったり画面ロックされたりすると、ネットワークの状態にかかわらずWebSocketが切断されます。また、別のタブにフォーカスしてもWebSocketは切断されてしまいます。
* **UIWebViewの場合**: UIWebViewでも、画面ロック時にWebSocketが切断されてしまいます。なお、親アプリがバックグラウンドに移っても、直ちにWebSocketが切断されるわけではないようです。(親アプリ側の挙動に依存します。)

# 状態変更の検出

WebSocketの切断自体は、`WebSocket`オブジェクトの`close`イベントで検出できます。となると、再接続が可能になるタイミングを検出する方法があれば、Webアプリ復帰時にWebSocketを再接続するなどの対処ができることになりますが...

なお、単にネットワーク接続自体の切り替わりについては`window`オブジェクトの`online`,`offline`イベントで検出できますが、今回の場合はネットワーク接続がオンラインであっても、問答無用でWebSocketが切断されてしまう現象への対処ですので、Webアプリがフォアグラウンドに復帰した時に再接続する方法を考える必要がありそうです。

* **Safariの場合**: タブの復帰、バックグラウンドからの復帰、画面ロック解除については、いずれも`window`の`pageshow`イベントで検出できます。なお、`pageshow`イベントはWebアプリのロード完了時にも発生しますので、その場合には余計な再接続等を行わないように注意が必要です。例えば、次のサンプルコードのような対処が考えられるのではないでしょうか。

```js:サンプルコード
var ws = new WebSocket();

ws.addEventListener('open', function() {
  window.addEventListener('pageshow', function() {
    // WebSocketが切断されていれば、再接続を試みる
    if(ws.readyState != WebSocket.OPEN)
      connect();
  }, false);
}, false);

function connect() {
  ws.open('ws://foo.bar/ws');
  ...
}
```

* **UIWebViewの場合**: UIWebViewが曲者で、**`pageshow`イベントも`pagehide`イベントも発生しません**。よって、UIWebViewで対処するには、WebSocketが切断されてしまった時にユーザの操作で再接続を開始できるように、UIを表示する等の工夫が必要なように思われます。(他に何かいい方法があれば是非お寄せ下さい。)

なお、UIWebViewの場合、親アプリの画面から見ると表向きには埋め込みWebアプリを閉じているように見えてもまだWebアプリ自体が動いている場合があったりするので、さらに厄介です。ただ、この場合は`document`の`visibilitychange`イベントでアプリが隠れてしまったことを検知できる場合もあるようです。
iStat serverでError Domain=kCFStreamErrorDomainSSL

いつの間にかiStat for iOSでserverに接続出来ない。
ログ見るとError Domain=kCFStreamErrorDomainSSLとありますが、SettingのSSL Enabledのチェック外すと接続出来るようになります。

http://www.clien.net/cs2/bbs/board.php?bo_table=cm_mac&wr_id=858789
なぜかこんなところに書いてありました。
moment.js の使い方

## moment.js で日付け計算をしてみます。

## 説明
javascriptの標準機能では補えない機能を簡単に使えるライブラリです。
例題を交えて使い方を説明します。

### 使い方
今日が2014年11月12日（水曜日）という前提で、

:one: 今日を算出 
```moment();```
[ result ] Wed Nov 12 2014 23:30:03 GMT+0900 (東京 (標準時))


:two: 日付けをフォーマットする
` moment().format('YYYY月MM年DD日'); `
[ result ] 2014月11年12日


:three: 今日は何曜日？ 
`moment.lang('ja', {weekdays: ["日","月","火","水","木","金","土"]});
moment().format('dddd曜日'); `
[ result ] 水曜日


:four: 今週の月曜日の日付けは？
`moment().day(1).format('YYYY月MM年DD日 dddd曜日'); `
[ result ] 2014月11年10日月曜日

// moment().day(1);は今週の月曜を指します。
// 日:0, 月:1, 火:2, 水:3, 木:4, 金:5, 土:6


:five: 今月の末日は？
// 日数だけなら moment().daysInMonth(); // 30
`moment().endOf("month").format('YYYY月MM年DD日 dddd曜日');`
[ result ] 2014月11年30日 日曜日


:six: 3年前の今日は？
`moment().subtract(3, 'years').format('YYYY月MM年DD日 dddd曜日');`
[ result ] 2011月11年12日 土曜日

// 2日前は、moment().subtract(2, 'days');
// 2月前は、moment().subtract(2, 'months');


:seven: 3年後の今日は？
`lmoment().add(3, 'years').format('YYYY月MM年DD日 dddd曜日');`
[ result ] 2017月11年12日 日曜日

// 2日後は、moment().add(2, 'days');
// 2月後は、moment().add(2, 'months');


:eight: A （2011/9/1） は、B （2015/3/1） より前か？
`var dateA = moment([2011, 9, 1]);
var dateB = moment([2015, 3, 1]);
dateA.isBefore(dateB);`
[ result ] true


:nine: A （2011/9/1） は、B （2015/3/1） より後か？
`var dateA = moment([2011, 9, 1]);
var dateB = moment([2015, 3, 1]);
dateA.isAfter(dateB);`
[ result ] false


:keycap_ten: A （2011/9/1） から、B （2015/3/1） までは何年間？
`var dateA = moment([2011, 9, 1]);
var dateB = moment([2015, 3, 1]);
dateA.diff(dateB, 'years');`
[ result ] -3

// 〇日間は、dateA.diff(dateB, 'days');
// 〇月間は、dateA.diff(dateB, 'months');
Mac Yosemite にてRVMでのRubyのコンパイル時クラッシュを解消

Yosemiteが原因かはっきりしないですが、RVMでRubyをインストールしようとすると、Macごとクラッシュするようになってしまいました。

```
$ rvm install ruby-2.1.4
ruby-2.1.4 - #removing src/ruby-2.1.4..
Searching for binary rubies, this might take some time.
No binary rubies available for: osx/10.10/x86_64/ruby-2.1.4.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for osx.
Updating certificates in '/usr/local/etc/openssl/cert.pem'.
Requirements installation successful.
Installing Ruby from source to: /Users/user/.rvm/rubies/ruby-2.1.4, this may take a while depending on your cpu(s)...
ruby-2.1.4 - #downloading ruby-2.1.4, this may take a while depending on your connection...
ruby-2.1.4 - #extracting ruby-2.1.4 to /Users/user/.rvm/src/ruby-2.1.4....
ruby-2.1.4 - #configuring...................................\
  [復元されました]
```

色々試したんですが、結果だけ言うと、下記のステップのどこかで直りました。
1. ``brew update`` ``brew doctor`` ``brew upgrade``
2. OS X Command Line Toolsのインストール(XCode 6.1) <= おそらくココが一番重要！
3. .bashrcに一部行追加(rvmを再インストールしたら``rvm use``がnot workedになったので)

.bashrcに追加した内容

```
if test -f ~/.rvm/scripts/rvm; then
    [ "$(type -t rvm)" = "function" ] || source ~/.rvm/scripts/rvm
fi
```

ついでに、Rubyのgem、therubyracerとlibv8(v8)の依存関係問題にもぶつかりました。こちらは下記のような形で対応しました。

```
$ gem uninstall libv8
$ gem install therubyracer
$ gem install libv8 -v '3.16.14.3' -- --with-system-v8
```

``brew install v8``コマンドも実施したんですが、これはたぶん意味が無い(インストールしただけでたぶん使ってない...)と思いますが、一応備忘録として記録。

これできちんとMac OS X YosemiteにアップグレードしたMacでRVMでRubyを正しくインストール出来ると思います。
jQueryで文字数チェッカーの作り方

Javascipt初心者で、最近バグ対応などでJavascriptのコードを見ることが多く、これは自主的に触らないと話にならないと、コツコツ触り始めました。

そこで、今回はチュートリアル的な感覚で文字数チェッカーを作成しました。

まず、HTMLから

```html:string_count.html
<!doctype html>
<html lang="ja">
<html>
  <head>
    <meta charset="utf-8" />
	<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>	<script src="./string_count.js"></script>
</head>
<body>
	<textarea id="field" cols ="30" rows="3"></textarea>
  	<p id="strlength">140</p>＃入力数を表示
</body>
</html>
```
質素なテキストエリアです。
<body>
	<textarea id="field" cols ="30" rows="3"></textarea>
  	<p id="strlength">140</p>
</body>
</html>

続いてjQueryを見てみます。

```javascript:string_count.js
$(function(){
	$("#field").on('keyup', function(){ #HTMLで記載したfieldというID上でキーがあがったとき、
      var strCount = $(this).val().length; #field内での文字数をカウント
      var leftCount = 140 - strCount; #Twitterのように、140字を基準にカウントした数を引いていく。
      $("#strlength").text(leftCount);＃結果をテキストで表示
      if(leftCount < 0){  #140字以上のときの挙動
      	$("#field").css({
      		fontSize: '30px'
      	});
      }else{
      	$("#field").css({　##140字以内のときの挙動
      		fontSize: '10px'
      	});
      }
  	});
 });
```
以上でかなり簡単ですが、文字数チェッカーを作成できました。
autocomplete で入力中に候補を選択した場合、フォームにセットされない

autocomplete 便利ですね。
でも日本語だと、入力中でもサジェストが表示されて「あら便利」と候補を選択してもフォームにセットされません。
場合によっては選択した候補と入力中の文字が混ざったりと変なことになります。

そういった場合の対応方法。

select メソッドでフォーカスを外してあげるといい感じに動きます。

```js:javascript
  select: function( event, ui ) {
    // フォーカスを外す
    $(this).blur();
  }
```

http://jsfiddle.net/wvf7r06z/
AppCode 3.0.6 を試してみたメモ


[AppCode](https://www.jetbrains.com/objc/) は `iOS/OS X` のアプリケーションを作るための、JetBrains社の IDE です。有償で、個人ライセンスの場合は現時点では ＄99 です。

`OS X Mavericks` に、現時点での AppCode の最新バージョンである `3.0.6` を導入してみたメモです。
（恐らくというかきっと、事前に Xcode を導入しておく必要があると思います。）

## 導入

GUIのインストーラを利用してもいいのですが、Homebrew Cask で入れてみます。

```
$ brew cask install appcode
```

次のようにインストールされました。

![screen4.png](https://qiita-image-store.s3.amazonaws.com/0/35733/3ed2b549-7bb9-d94b-f693-f4d46578f049.png "screen4.png")

アプリケーション一覧にも表示されています。

![screen5.png](https://qiita-image-store.s3.amazonaws.com/0/35733/52f067c9-6e42-861e-39ed-b59f2226e8cd.png "screen5.png")

## 試してみる

とりあえずテーマは御馴染み？の `Darcula` に変更しました。

![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/35733/4bbd965b-25de-91d1-a59e-552c51883b27.png "screen3.png")

`New Project` メニューから適当にプロジェクトを作成してみます。言語に Swift も選べますが、コード補完がまだ不十分ぽい？（ちゃんと試していない。）

> 追記：Swift のサポートは次期バージョンで強化される？
> http://blog.jetbrains.com/objc/

![screen6.png](https://qiita-image-store.s3.amazonaws.com/0/35733/7a3bf676-509e-bb7c-adac-c37c94a2f0b6.png "screen6.png")

こんな感じ。ストーリボードは Xcodeっぽい。

![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/35733/5bc675dc-9889-e1e5-fe36-d2ccc7492c8d.png "screen2.png")

シミュレータもちゃんと起動できました^^

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d4efdd35-bc79-536e-e4f2-7bb2bd69aff1.png "screen1.png")

個人的にはどうも Xcode のUIが好きでなく（慣れなの問題かもしれないですが..）、また WebStorm や RubyMine 等に慣れてる方は、これは嬉しいかも。
チャンネルに送信可能かどうか判断する

Goのチャンネルはクローズされていることが受信時には判断できますが送信時にはできません。
そのため、送信可能か判断できないチャンネルに送信する場合は一工夫必要になります。

## 問題のあるコード

以下の``` ImpatientPrinter ``` は入力された文字列を出力する機能を持っています。
ただし、１秒間入力がないと自動的に入力を閉じます。

http://play.golang.org/p/OGTVbpPRrz

```go
package main

import (
	"fmt"
	"time"
)

type ImpatientPrinter struct {
	write chan string
}

func NewImpatientPrinter() ImpatientPrinter {
	w := make(chan string)

	go func() {
		for {
			select {
			case s := <-w:
				fmt.Println(s)
			case <-time.After(time.Second):
				close(w)
				return
			}
		}
	}()

	return ImpatientPrinter{
		write: w,
	}
}

func (p ImpatientPrinter) Write(s string) {
	p.write <- s
}

func main() {
	w := NewImpatientPrinter()
	w.Write("Hello, playground")

	time.Sleep(time.Second * 1)
	w.Write("Hello, playground")

	time.Sleep(time.Second * 1)
	w.Write("Hello, playground")
}
```

このコードの問題は、チャンネルに送信可能かどうかが外部から判別できないということです。
チャンネルを閉じた後にWriteしようとすると当然ながらpanicが発生します。
チャンネルをクローズしない場合でも、チャンネルを受信しているgoroutineが存在しないためデッドロックしてしまいます。

## 修正したコード

受信専用チャンネルをもう一つ追加し、そのチャンネルを代わりにクローズするのがシンプルな解決方法です。
送信が不可能になった後は受信専用チャンネルの受信がブロックしないため、Writeがどのgoroutineから実行されていても、送信可能かどうかが確実に判断できます。

http://play.golang.org/p/LSvwXCxRv5

```go
package main

import (
	"errors"
	"fmt"
	"time"
)

type ImpatientPrinter struct {
	write  chan string
	closed chan int
}

func NewImpatientPrinter() ImpatientPrinter {
	w := make(chan string)
	c := make(chan int)

	go func() {
		for {
			select {
			case s := <-w:
				fmt.Println(s)
			case <-time.After(time.Second):
				close(c)
				return
			}
		}
	}()

	return ImpatientPrinter{
		write:  w,
		closed: c,
	}
}

func (p ImpatientPrinter) Write(s string) error {
	select {
	case p.write <- s:
	case <-p.closed:
		return errors.New("closed")
	}
	return nil
}

func main() {
	w := NewImpatientPrinter()
	w.Write("Hello, playground")

	time.Sleep(time.Second * 1)
	w.Write("Hello, playground")

	time.Sleep(time.Second * 1)
	w.Write("Hello, playground")
}
```

## おまけ

*禁断のrecover*

http://play.golang.org/p/cePkHwCOez

```go
package main

import (
	"errors"
	"fmt"
	"time"
)

type ImpatientPrinter struct {
	write chan string
}

func NewImpatientPrinter() ImpatientPrinter {
	w := make(chan string)

	go func() {
		for {
			select {
			case s := <-w:
				fmt.Println(s)
			case <-time.After(time.Second):
				close(w)
				return
			}
		}
	}()

	return ImpatientPrinter{
		write: w,
	}
}

func (p ImpatientPrinter) Write(s string) (e error) {
	defer func() {
		if r := recover(); r != nil {
			e = errors.New("closed")
		}
	}()
	p.write <- s
	return nil
}

func main() {
	w := NewImpatientPrinter()
	w.Write("Hello, playground")

	time.Sleep(time.Second * 1)
	w.Write("Hello, playground")

	time.Sleep(time.Second * 1)
	w.Write("Hello, playground")
}
```
sortable での並び替えで、helper に clone 指定していると、ラジオボタンの選択状態が外れる

考えれば当たり前の話なんですが、ヘルパーでclone した際、ラジオボタンの選択状態が奪われます。

ドラッグ中はヘルパーが表示されているので問題無いように見えるんですが、並び替えが完了するとヘルパーが消えて元の行が表示されるので、ラジオボタンの選択状態がリセットされたように見える、と。

beforeStop メソッドで、選択状態のラジオボタンと同名のラジオボタンに checked を設定すれば解決します。

```js:javascript
    beforeStop: function (event, ui) {
        $.each($(ui.helper).find(":input:radio:checked"), function () {
            var name = $(this).prop('name');
            $(ui.item).find(":input:radio[name='" + name + "']").prop("checked", true);
        });
    }
```

http://jsfiddle.net/7mwx5c5y/1/
2014/11/18 ソースが一部おかしかったので修正しました。
[Shader] floatをfixedに変換し、RGBAに格納する


シェーダについて学んでいると、テクスチャに色以外のデータを保持する必要が出てくるケースが多々ある。
そんなとき目にするのが、通常のfloatの値を8bitのRGBAそれぞれに格納する、という方法。

[こちらの記事](http://www.gamedev.net/topic/486847-encoding-16-and-32-bit-floating-point-value-into-rgba-byte-texture/
)の計算を参考に、JSに書き直してみました。

（実際に動くサンプルを[jsdo.it](http://jsdo.it/edo_m18/Fm3T)に上げてあります）

```js
function floatToInt(floatValue) {
    var toFixed = 255.0 / 256;
    return {
        r: frac(floatValue * toFixed * 1),
        g: frac(floatValue * toFixed * 255),
        b: frac(floatValue * toFixed * 255 * 255),
        a: frac(floatValue * toFixed * 255 * 255 * 255)
    };
}

function intToFloat(intValue) {
    var fromFixed = 256.0 / 255;
    return (intValue.r * fromFixed / (1)
          + intValue.g * fromFixed / (255)
          + intValue.b * fromFixed / (255 * 255)
          + intValue.a * fromFixed / (255 * 255 * 255));
}
        
function frac(x) {
    return x - Math.floor(x);
    // Instead you can use below.
    // return x % 1;
}
```

`toFixed`は固定小数点の精度に変換するための計算を事前に行っているところ。
*（しっかりとした理由はまだ理解しきれていないのだけど・・・）*

要は、この「固定小数点」へ変換する処理を行い、RGBAそれぞれの成分に保存している、ということだと思う。

変換と復元はやっている処理を逆転しているだけ。

ちなみに、この処理は`0.0〜1.0`の間の数値を想定している。
シェーダでは`-1.0〜1.0`の間で数値がやりとりされ、特に色などは`0.0〜1.0`の間での計算となるため、シェーダで使われる手法なんだと思います。
SwiftでもRubyの"!!"演算子を再現したい

Swiftを触っていると、Rubyではお馴染みの`!!`演算子を使いたくなることが度々あるので即興で作ってみました。

簡単に`!!`演算子の説明をすると、オブジェクトが`nil`かどうかを`Bool`で返してくれるようになるため、if構文などで`object != nil`の代わりに`!!object`と記述できるようになります。
SwiftではObjective-Cと違い、分岐条件は論理値であることが求められるため、素直に`nil`を条件としたい場合などに有用かと思います。

```swift
prefix operator !! {}
prefix func !!<T> (object: T?) -> Bool {
    if let bool = object as? Bool {
        return bool
    }
    return object != nil
}
```

結果

```swift
!!NSObject() // => true
!!true       // => true
!!false      // => false

var str1: String?
!!str1       // => false
str1 = "foo"
!!str1       // => true
```

この結果をさらに反転させるには`!(!!NSObject())`のような書き方をしますが、気持ち悪いので`!!!`演算子も定義します。

```swift
prefix operator !!! {}
prefix func !!!<T> (object: T?) -> Bool {
    return !(!!object)
}

// 結果
!!!NSObject() // => false
!!!true       // => false
!!!false      // => true

var str2: String?
!!!str2       // => true
str2 = "foo"
!!!str2       // => false
```

ただ反転させてるだけです。

### 使用例

```swift
var array: [AnyObject]?
array?.isEmpty   // => nil
!!array?.isEmpty // => false

if !!array?.isEmpty {
    // arrayがnilか空の場合
}

// 同上
if array == nil || array!.isEmpty {
    // arrayがnilか空の場合
}
```

上記の例では`array`は`nil`となっているため、2行目は通常のオプショナルチェーンなので`nil`を返します。
一方、`!!`演算子をつけた場合は`nil`の代わりに`false`が返されるため、このままif文で使用できます。

テストはしていないので何かあればコメント歓迎です。

__2014.11.17 追記__

* プリミティブ型に対応するため引数を`AnyObject?`から`Any?`に変更

__2015.1.5 追記__

* 引数をジェネリックス化
* 使用例を追加
Nexus7(2012) をAndroid5.0にしてみる

# 遅ればせながら
全くroot化やbootloaderのunlockもしていない
クリーン（？）な状態のnexus7をAndroid5.0にしてみた。
忘れないようにメモ代わりに。

# 手順
1. PCを用意する。Windowsマシンを使用しましたが、Macでも良い。
2. driverのインストール。[Nexus7_USB_Driver](http://www.asus.com/Tablets_Mobile/Nexus_7/HelpDesk_Download/)
3. AndroidのSDKをダウンロードして適当な場所に配置。[Android SDK](https://developer.android.com/sdk/index.html)
4. Android developerからFactory ImageをDL
[Android5.0 FactoryImage](https://developers.google.com/android/nexus/images)
5. DLしたFactory Imageは.tgzを解凍しておく
(image-nakasi-lrx21p.zipは解凍しなくてよい)
6. Nexus7をPCに繋ぎ、cmdでコマンドプロンプトを起動。(この時adb devicesで端末が認識できる事。)
7. コマンドプロンプトからadb.exe reboot bootloaderでbootloaderを起動
8. Nexus7がbootloaderで起動する。
9. その状態でコマンドプロンプトからfastboot.exe oem unlock でbootloaderをunlockする。
(すいません、ここちょっと曖昧です。bootloader状態じゃなくていいのかも？)
9. 一旦Nexus7を再起動して、unlock状態でPCに認識させておく
10. 二回目のadb.exe reboot bootloaderでbootloaderを起動
11. **bootloaderモードで起動している状態で、Factory Imageから解凍した、flash-all.batをPCから実行する**
12. OSのインストールが始まる
13. インストールが終わると自動的にNexus7が再起動する。
14. 起動に時間が非常にかかるため、しばらく待つ。中々起動しなくてハラハラしますが、大丈夫です。落ち着いて30分ぐらい待ちましょう
15. Android5.0で起動しました、おめでとうございます！

# Q.adb , fastbootってどこにあるの？
Android SDKのplatform-toolsの中にあります。
(古くてちょっと恥ずかしい…普段Macなもので…)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/26453/39cf5f1a-4a78-7da4-ec86-448ae89cdb26.png)

# Q. USB driverはどこに置くの？
手動で認識させてもいいし、android sdk/extras/google/usb_driverを上書きしてしまってもOK。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/26453/c93642e5-bdc2-8bb2-8836-35ffe7e96cbc.png)

# Q.fastboot oem unlockすると端末初期化される？
ほんとにされます。事前にバックアップを取るなりしましょう。

# adb devicesで端末認識するってどういうこと？
adb devicesでコマンドを送った時に以下のように出ればOK。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/26453/9787e70c-d83b-589a-51d4-8ffe22c2ddfc.png)

もし出ない場合は、以下をチェックしてみてください・
・開発者向けオプション → USBデバッグ → ON
・USBでパソコンに接続 → メディアデバイス(MTP) → ON

開発者向けオプションが出ていない人は
設定→タブレット情報→ビルド番号のビルド番号カラムを7回タップして下さい。「デベロッパーになりました」とメッセージと共に出てくるはず。
(Nexus7専用)

# おわり
すんごい簡単にメモってしまった。
もっとスクリーンショット取りながらやればよかったなーとちょっと後悔。
ほんとに最後の再起動で時間がかかったので、ドキドキしながら待ちました。
Swift を CLI から実行するまでのメモ（Xcode6.1版）


## 私の環境

- 手元のOS：`Mac OS X 10.9.5 (Mavericks)`
- Xcode：`6.1`

## 手順

- Swift のパスを確認

	```shell:
	$ find /Applications/Xcode.app/ -name swift

	/Applications/Xcode.app//Contents/Developer/Documentation/DocSets/com.apple.adc.documentation.AppleiOS8.1.iOSLibrary.docset/Contents/Resources/Tokens/swift
	/Applications/Xcode.app//Contents/Developer/Documentation/DocSets/com.apple.adc.documentation.AppleOSX10.10.CoreReference.docset/Contents/Resources/Tokens/swift
	/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift
	/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift
	```

	この中だと、恐らく `/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift` がそう。

- パスを通す

	```shell:	
	$ export PATH=/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/:$PATH
	```

	> もしくは `~/.bash_profile` 等に追記

## 使ってみる

### ヘルプの表示

```shell:
$ swift --help

OVERVIEW: Swift compiler

USAGE: swift [options] <inputs>

OPTIONS:
  -assert-config <value> Specify the assert_configuration replacement. Possible values are Debug, Release, Replacement.
  -D <value>             Specifies one or more build configuration options
  -framework <value>     Specifies a framework which should be linked against
  -F <value>             Add directory to framework search path

〜
```

### スクリプトファイルの実行

```swift:hello.swift
println("hello world")
```

ファイルを保存したら、コマンドラインから実行。

> `-i` オプションは Xcode 6.1 から？不要になったぽい。

```shell:
$ swift hello.swift

hello world
```

## ほか

学習するには、Appleの公式リファレンスを読めばよい。
⇒ [The Swift Programming Language](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/)

おわり。
コマンド対応表：SVN vs Git（書きかけ）

SVNとGitのコマンド名が似ていて理解しづらい！


「[Git の基礎勉強 ~ Git によるバージョン管理 ~](http://tracpath.com/bootcamp/learning_git_firststep.html)」で勉強しながら「[svnコマンドから探すgitコマンド](http://qiita.com/koto/items/5dc15af9636231feb046)」も参考にしつつ、ここではGitを使っていく流れに沿ってコマンドを対応させたいと思います。


最近はTortioseSVNに頼りっきりで、コマンド名を覚えていないものが多々・・・

##新規作成→作業→追加→反映
マスターのリポジトリと作業ディレクトリを作って編集して、マスターのリポジトリに反映する。
###リポジトリを新規作成
* git init
* svn ???

みんなで触る、マスターなリポジトリを作る。

###作業ディレクトリを作る
（※ここの説明には多分に憶測と誤解が含まれる可能性があります）

* git clone
 * マスターのリポジトリ情報を完全コピー。
* svn checkout
 * マスターの最新状態をコピー。

マスターなリポジトリから、自分が作業（作成・編集・削除）するためのローカルな環境を作成する。

###作業内容を管理対象に追加する
* git add
* svn add

作業ディレクトリ上で新しく作ったファイルを、バージョン管理対象として認識させる。
Gitだと、編集するたびにAddしなきゃいけない気がしてるんだけど、勘違いかな？

###作業内容をローカルリポジトリに反映する
* git commit
* （対応するSVNコマンドなし）

Gitがいいなと思う一番のポイントは、ローカルでコミット履歴を管理できること。
短い周期で修正→コミットを気兼ねなく繰り返すことが可能。

###作業内容をマスターのリポジトリに反映する
* git push
* svn commit

SVNからの乗り換えで一番混乱するのがcommitとpushだと思う。
pushしてコミットするとか説明されてるしね。
あと、branchなのにmaster?とかmasterとHEADの違いとか。
同じ用語で意味が違うって混乱のもとね。

##更新→衝突！→修正→反映
マスターのリポジトリから変更を取り込んだらコンフリクトしたので直す。
###作業ディレクトリを更新して、ほかの人の変更を取り込む
* git pull
* svn update

git pullはfetchしてmergeしているらしいけど、まだそんなこと知らないので説明は省略。
svn updateも実は同じようなことしてるよね。

###衝突を修正する
単独のコマンドはない。

|1||2||3||4||5|
|---|:-:|---|:-:|---|:-:|---|:-:|---|
|git status|→|修正|→|git add|→|git commit|→|git push|
|svn status|→|修正|→|svn resolve|→|対応コマンドなし|→|svn commit|
|衝突状況の確認||手動修正||衝突解消を通知||ローカルコミット||マスターコミット|

##ブランチ→修正→反映
ブランチを作って、何か修正して、マスターのリポジトリに反映する

##ログ確認

##作業→戻す
Symfony2 よく使うコマンドあれこれ

#はじめに

私自身がよく忘れるので、備忘録的な感じで記載したいと思います。
Symfony2を使ってアプリケーション作成する際、いろいろとコマンドライン操作が発生します。
そのコマンドをよく忘れます。。。
`php app/console`を実行すれば、コマンド一覧が表示されますが、
なにをどう使うのかを忘れるんです。
そんな、忘れっぽい私のよく使っているのに忘れるリストです。

#インストール

`php composer.phar create-project symfony/framework-standard-edition <インストール先ディレクトリー> 2.3.0`

※　現時点では、バージョンが2.3.0を使用していますので、2.3.0です。

#バンドルインストール

1. composer.pharを作業ディレクトリーにコピーします。
2. `php composer.phar install`

バンドル追加時は、

`php composer.phar update`

#バンドルに対して行う作業
##ディレクトリーのロール変更

`chmod 777 -R app/cache`
`chmod 777 -R app/logs`

##バンドル作成

`php app/console generate:bundle`

##エンティティの作成

`php app/console doctrine:generate:entity`

The Entity shortcut name: <バンドル名>:<エンティティ名>

##crud作成

`php app/console doctrine:generate:crud`

The Entity shortcut name: <バンドル名>:<エンティティ名>

Do you want to generate the "write" actions [no]? yes

##エンティティ更新時

`php app/console doctrine:generate:entities <バンドル名>:<エンティティ名>`

##スキーマ作成

`php app/console doctrine:schema:create`

アップデートのときは、

`php app/console doctrine:schema:update --force`

※　インストール時に設定したdatabase_nameをMySQLなどで事前に作成しておくこと

##よくするキャッシュのクリア

`php app/console cache:clear`

##ルーティングの確認

`php app/console router:debug`

##各ファイルのパス確認（CSSやJSなど）

`php app/console assetic:dump`

##FOSUserBundleバンドル　ユーザー作成

`php app/console fos:user:create`

admin権限ユーザーを作成するときは、

`php app/console fos:user:create <ユーザー名> --super-admin`

#おわりに

これだけ覚えれば何とかなると思います。
これだけなんだけど忘れるんだよなぁ。
数値の変化を範囲内で留める方法

ある数値を変化させるとき上限と下限を付けたい場合があります
例えば、画面外に飛び出ないようにするとか、HPみたいな範囲がある数値とかです

HPはMaxHPを超えることはないですし、0未満になることもないです
下限以下なら下限に、上限以上なら上限にしたいんですが、if文を書くのは煩わしいです
std::minとstd::maxを組み合わせた方法もあるんですが、いまいち直感的じゃないです

自分で作ってもいいんですが、boostにすでにあるのでこれ使いましょう
boost::algorithm::clampです

使い方はこんな感じ

```C++:clamp.cpp
#include <boost/algorithm/clamp.hpp>

void hpchange(int addhp){
  hp = boost::algorithm::clamp(hp + addhp, 0, maxHp);
}

```
ちなみに、std::minmaxってのがあってあるじゃん！と思っていたら、
これはコンテナみたいな複数の要素の中から最小と最大を同時に見つける関数です
用途が違うので注意しましょう
Jenkinsの変数をPHPで確認する方法

[Jenkins CI]:http://jenkins-ci.org/

今回は短く

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

さて、すっかり[Jenkins CI]プログラマーと化している筆者ですが、
これほど色々できて、色々できないのも珍しいなと思う。

Continuous Integrationなどと後付っぽいカテゴリに含まれているが、
要するに巨大な時限式に動くバッチシステム。
あらかじめセットしておけば、
勝手にセットした作業をしておいてくれる。
「～自動化」といった話には大概登場するわけで、
シェルに組み込めるものではたいてい実行できる。

反面、ちょっとしたことですらプラグインが必要で、
変数の定義やら文字列置換やらすら頑張らないとできないという柔軟性はもう一つな仕組みでもある。
[Jenkins CI]をうまく使っていくには裏側で生成されている変数を想像しながら使っていくことになるわけだが、
まともにやるととても時間がかかってしまう。

そこで、まずは生成されているであろう変数類を可視化するところから始める。
私は(良くも悪くも)PHPerなので、
今回はPHPにて表示してみよう。

ちなみに[Jenkins CI]のインストールは省略、PHPは入っている前提。

------------------- ↑ 余談はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

### ジョブの作成

まぁ、作っといて。「フリースタイル・プロジェクトのビルド」でいいと思う。

### シェルの登録

「ビルド手順の追加」欄にシェルの実行を追加

![jenkins01.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/c8410516-3bda-a835-9c4b-38ea0d158dc2.png)

「シェルの実行」に以下のコードを貼り付けて「保存」

```php
#!/bin/env php
<?php
print_r($_SERVER);
```

![jenkins02.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/7b23c80c-3bd2-829c-7c6e-d67e38194772.png)

### 変数確認

「ビルド実行」後、ビルド結果の詳細を確認。
「Console Output」に内容が表示されている。(画像右下)

![jenkins03.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/cc8353e3-afc8-1ba3-3c20-85461d723ee2.png)

------------------- ↑ 本題はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 補足はここから ↓-------------------

大体想像はつくかもしれないが、
要するに環境変数を取回しているだけということだ。

(ﾟДﾟ)ﾊｧ?

まぁ、そりゃそうだよね。
けど、この記事だけ読むとナニソレとなるが、
今後プラグインなどを組み込んでいくと、
ある日突然変数が表れてそれを使えと迫ってくる。
こうやって可視化しておくのは如何に重要かというのが使っていけばわかるだろう。
DBテーブルに性別カラムを作るなら、男=1, 女=2が標準

性別の表現方法には国際基準があってJISとも互換なので、特に理由がないなら従っておくと合理的ですよという件。

["ISO/IEC 5218:2004 Codes for the representation of human sexes"](http://www.iso.org/iso/catalogue_detail.htm?csnumber=36266)

* 0 = not known（不明）
* 1 = male（男性）
* 2 = female（女性）
* 9 = not applicable（適用不能）

これは4値論理と同じ構造ですね。人間の性別が男女の2種だけなのかという議論はおいておいて、

* 「そもそも性別という概念が存在しない」法人や、root, guestのような仮想的ユーザー
* 「性別が未入力なだけ」の自然人

を区別して扱っています。

not applicableが3でなく9なのは、拡張性を意識していると言えましょう。自然人の性別が男女の二通りしかないかと言われるとそれはおかしいわけで。

表題に"sexes"とある通りgenderではなく生物学的な性別を意識してはいるようで、じゃあ生物学的な性別は男女の二通りで表現できるのかというと、稀少な染色体型（性染色体のモノソミーとか過剰とか、モザイク染色体とか）や稀少な表現型（アンドロゲン不応症とか）など、生物学的な性別も無数にあるわけです。

議論を拡散させずに拡張性を残しつつ規格に落とし込んでいるのは妥当な判断と言えましょう。

SNSなどならsexでなくgenderを扱っているはずですが、genderについて同様の規格があるかというと、このISO5218をそのまま流用というのが現時点の正解っぽいです。
Hubot の読みかた

# 問題

Hubot の読みかたが分からない。また、その質問が繰り返されている。

# 解決策

公式に確認する。

公式サポートの回答では「"hue-bot"」。カタカナで書くなら「ヒューボット」。

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/brandonmartinez">@brandonmartinez</a> “hue-bot”</p>&mdash; GitHub Support (@GitHubHelp) <a href="https://twitter.com/GitHubHelp/status/301469384491298816">2013, 2月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考

https://twitter.com/GitHubHelp/status/301469384491298816
Rictyフォントをインストールする２つの方法(OS X Yosemite‎編)


MacのOSをYosemite‎にアップグレードしましたので、Rictyフォントを入れ直してみました。  
![スクリーンショット 2014-11-13 15.14.33.png](https://qiita-image-store.s3.amazonaws.com/0/4784/afb32e5f-0dbb-9693-5f0c-d4e9c0e3dbba.png)


## Rictyフォントとは

>[Ricty (リクティ) は Linux 環境での研究・開発に適したフリーなプログラミング用 TrueType フォントです。 Emacs や Vim を用いた C、C++、FORTRAN、Python、Perl、Ruby、AWK、sed、シェルスクリプト、LaTeX などのコーディングにおける使用を想定しています。 以下の 2 つの等幅フォントの合成、および、プログラミング用フォントとしてのいくつかのチューニングを行う生成スクリプトの配布を行なっています。](https://github.com/yascentur/Ricty)

また、姉妹フォントの**Ricty Diminished**もあります。

>[Ricty Diminished (リクティ・ディミニッシュト) は Ricty の姉妹フォントであり、Inconsolata と Migu 1M ではなく、Inconsolata と Circle M+ 1m を Ricty 生成スクリプトで合成したフォントです。 IPA ゴシックのグリフを含まないため、使用可能な漢字グリフの数が少ない代わり、SIL Open Font License の下で配布が可能です。](https://github.com/yascentur/RictyDiminished)

ライセンスの関係で以下の違いがあります。

- Rictyは自分でフォントの生成をする必要がある
- Ricty Diminishedは生成済のフォントが配布されている

## インストールの方法１:Ricty

[Rictyのインストール]で検索してよく出てくるのはHomeBrewを使った方法です。  

参照:[プログラムに最適なフォント『Ricty』を超簡単にインストール[Mac限定] ](http://morizyun.github.io/blog/ricty-font-homebrew-mac/)

```
brew tap sanemat/font
brew install ricty
# (ゴニョゴニョ)
cp -f /usr/local/Cellar/ricty/3.2.2/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf
```

HomeBrewさえインストール済みならこの4行で終わるはずなのですが、Yosemiteでは無理でした。

#### 問題その１:XQuartzが必要

XQuartzって何？って言われたらぶっちゃけ知りませんけど、とにかく必要みたいです。  
インストーラーをダウンロードして入れる必要があります。  
参照:[Mac に X11 (XQuartz) をインストール](http://macperson.net/mac-x11-xquartz/)

#### 問題その２:autoconf,automakeが必要

昔はxcodeが勝手に入れてくれてたビルドツールが、
今は入ってないらしいので手動で入れる必要があります。  
参照:[Xcode4.3, Mac OS X Lionの環境でhomebrewからautoconf、automakeをインストールする - 日々是鍛錬](http://yoppi.hatenablog.com/entry/20120414/setting_build_tools_on_mac_osx_lion)

#### つまり
HomeBrew使っても超簡単とは行かない

## インストールの方法２:Ricty Diminished

Diminishedの方は前述の通り、生成されたものが配布されているのでホントに超簡単です。  

#### STEP1:ダウンロード
[yascentur/RictyDiminished](https://github.com/yascentur/RictyDiminished)からダウンロードします。  
Gitを使っている人はcloneでもいいですが、「Gitって何？」という方は右端の[Download ZIP]をポチッとするだけでもOKです。
ダウンロードが完了したらFinderからタブルクリックして解凍します。
#### STEP2:インストール
STEP1のフォルダを開くと[.ttf]という拡張子が付いたファイルがいくつか入っています。
一つのファイルが一つのフォントになります。  
これをダブルクリックするとインストールの確認画面が出ますので、
「フォントをインストール」と書いてあるボタンをクリックするとインストールされます。  
太字や斜体などのバリエーションがいくつかありますので、
好きなのをインストールすれば完了です。

#### つまり
ホントに超簡単です。


## まとめ
Ricty DiminishedはRictyのライト版ですが、
問題なければ**インストールの方法２**がオススメです。
Genymotion 2.3.0にGooglePlayServiceをインストールする方法

GenymotionにGooglePlayServiceをインストールするために、
gapps-jb-20130812-signed.zipをGenymotionのVMにドラッグ&ドロップしてインストールしようとしたところ、
「Failed to flash file gapps-jb-20130812-signed.zip」というエラーが出てインストールができず。。。
  
別の方法でインストールできたのでその方法をメモ。
appsはAndroid 4.2.2用なので、バージョンに合わせて読み替えてください。


## インストール方法
1.Genymotionを起動する。
2.コマンドプロンプトを開き、adb.exeのあるディレクトリに移動する。

```cmd
cd C:\Program Files\Genymobile\Genymotion\tools
```
3.VMの /sdcard/Download にzipファイルをコピー。 

```cmd
adb push C:\Download\Genymotion\Genymotion-ARM-Translation_v1.1.zip /sdcard/Download/
adb push C:\Download\Genymotion\gapps-jb-20130812-signed.zip /sdcard/Download/
```
4.ARM-Translationをインストール

```cmd
adb shell flash-archive.sh /sdcard/Download/Genymotion-ARM-Translation_v1.1.zip
```
5.Genymotionを再起動
  
6.gappsをインストール

```cmd
adb shell flash-archive.sh /sdcard/Download/gapps-jb-20130812-signed.zip
```
7.Genymotionを再起動
  
8.インストール完了！
　  
インストールが終わったら、VMにコピーした
zipファイルは必要ないので、削除する場合は下記コマンドで。

```cmd
adb shell rm /sdcard/Download/Genymotion-ARM-Translation_v1.1.zip
adb shell rm /sdcard/Download/gapps-jb-20130812-signed.zip
```
はじめてのRでジバニャン書いてみる


なかなか手を出せなかったRですが、とあるツイートが気にやってみました。

環境はMacなのでRを以下からダウンロードします。

http://cran.md.tsukuba.ac.jp/bin/macosx/

R-3.1.2-snowleopard.pkgをダウンロードして、ダウンロードしたファイルをダブルクリックしてインストールします。

アプリケーションからRを起動します。Rコンソールが表示されるので、以下をコピペします。

https://gist.github.com/Akiyah/4da6d04cf7c0f6e33f94

私の環境だと数秒するとウィンドウが開いて以下が表示されます。

![ジバニャン.png](https://qiita-image-store.s3.amazonaws.com/0/4116/00b51002-cb47-0cf7-fe59-b7f2dc56d6bb.png "ジバニャン.png")

ジバニャンだ！この数式考えた人すごすぎる。
選択時にセパレータが消えないUITableViewCell

iOS7以降のUITableViewCellはセルの選択時に上下のセパレータが消えます。
なので消えないようなカスタムセルを作りました。
iOS7とiOS8で確認しました。SingleLineしか動かないかも。

```
import UIKit

class SeparatorVisibleCell: UITableViewCell {

	required init(coder aDecoder: NSCoder) {
		super.init(coder: aDecoder)
	}
	
	private lazy var separatorNotificationName = "CellSeparatorNotification"
	private var registered = false
	private lazy var separatorHeight: CGFloat = {
		return 1.0 / UIScreen.mainScreen().scale
		/*
		for v in self.contentView.superview!.subviews as [UIView] {
			println("setShowsSeparator: \(NSStringFromClass(v.dynamicType))")
			if NSStringFromClass(v.dynamicType).hasSuffix("SeparatorView") {
				return v.frame.size.height
			}
		}
		abort()
		return 1.0 / UIScreen.mainScreen().scale
		*/
	}()
	
	deinit {
		if registered {
			NSNotificationCenter.defaultCenter().removeObserver(self, name: separatorNotificationName, object: nil)
		}
	}
	
	override func layoutSubviews() {
		super.layoutSubviews()
		
		if !registered {
			NSNotificationCenter.defaultCenter().addObserver(self, selector: "separatorNotification:", name: separatorNotificationName, object: nil)
			registered = true
		}
		
		if let bg = selectedBackgroundView {
			var r = frame
			r.origin = CGPointMake(0, separatorHeight)
			r.size.height -= separatorHeight
			bg.frame = r
		}
	}
		
	override func setHighlighted(highlighted: Bool, animated: Bool) {
		super.setHighlighted(highlighted, animated: animated)
		setShowsSeparator()
		NSNotificationCenter.defaultCenter().postNotificationName(separatorNotificationName, object: self, userInfo: ["max_y": CGRectGetMinY(frame)])
	}
	
	private func setShowsSeparator() {
		println("setShowsSeparator: \(NSStringFromCGRect(frame))")
		for v in contentView.superview!.subviews as [UIView] {
			println("setShowsSeparator: \(NSStringFromClass(v.dynamicType))")
			if NSStringFromClass(v.dynamicType).hasSuffix("SeparatorView") {
				v.hidden = false
			}
		}
	}
	
	func separatorNotification(notif: NSNotification) {
		var y = notif.userInfo?["max_y"] as CGFloat
		
		println("separatorNotification: \(y), \(NSStringFromCGRect(self.frame)) -> \(abs(CGRectGetMaxY(frame) - y))")
		if abs(CGRectGetMaxY(frame) - y) < 1 {
			setShowsSeparator()
		}
	}
}
```
CapybaraでのHoverEvent

Capybaraにて、hoverイベントの使い方が分からなかったので調べた。


###### JavaScriptで実行

```rb:Capybara

page.execute_script '$("#element").trigger("mouseover")'

```

###### Triggerメソッド

```rb:Capybara

find('#element').trigger(:mouseover)

```

###### hover メソッド
比較的新しいwebdriverバージョンは、hoverメソッドでも利用可。

```rb:Capybara

find('#element').hover

```
いまさらながら、Basic認証のつけかた

久々にBasic認証をつけようとしたらやり方が全くわからなくなってたことに気づいたのでメモしておきます。

# 簡単なレシピ

1. .htaccessファイルを作る
2. .htaccess用のパスワード作成ツール（[ここ](http://www.luft.co.jp/cgi/htpasswd.php)や[ここ](http://www.shtml.jp/htaccess/make_htpasswd.html)など）で.htpasswdファイルを作る
3. 1と2をアップする。パーミッションは604 。

```lang:.htaccess
AuthUserfile /フルパス/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
```

# もっとくわしく

<dl>
<dt>AuthUserfile /フルパス/.htpasswd</dt>
<dd>サーバーのルートディレクトリからの.htpasswdへのパスを指定する。/usr/local/...とか/home/pass/...とかそういうの。</dd>
<dt>AuthGroupfile /dev/null</dt>
<dd>グループごとにアクセスを許可する、という指定。「/dev/null」とは、そのようなファイルは存在しないという意味。つまりグループごとでのアクセス制限はしないという意味。</dd>
<dt>AuthName "Please enter your ID and password"</dt>
<dd>ダイアログに表示される文章を指定。日本語だと文字化けするようだ。</dd>
<dt>AuthType Basic</dt>
<dd>AuthTypeを指定。「Basic（ベーシック認証）」と「Digest（ダイジェスト認証）」の2種類があって、Digestのほうが<a href="http://www.pasokuma.net/linux/server/httpd/httpdauth.html">安全らしい</a>。</dd>
<dt>require valid-user</dt>
<dd>ユーザーが誰であろうと、入力したIDとパスワードが合っていればアクセスできるという意味。特定ユーザーだけにアクセスさせたい場合は「require user xxx」とかする。</dd>
<dt>.htpasswd</dt>
<dd>IDとパスワードを書きこむファイル。.htpasswdというファイル名で作るらないといけないらしい。.htaccess用のパスワード作成ツールがネットにたくさん出回っているのでそこでコードを生成。例えばID/username,PASS/hogehogeとしたいとすると、username:us3HhKtHHqM0Uというコードを書けばよい。</dd>
<dt>パーミッション</dt>
<dd>パーミッションは604！これでだめなら644？</dd>
<dt>その他注意事項</dt>
<dd>ファイルの最後では改行したほうがいいかもしらんね。</dd>
</dl>


# いろいろな悩み

## アップする場所

* .htpasswdのファイルは、DocumentRootより上に設置すること。
* それが無理な場合は.htaccessファイルに「AddHandler cgi-script htpasswd」の一行を加える。
* もしくは.htaccess ファイルに.htaccessと.htpasswdにアクセスできなくさせる下記のようなコードを書く。

```lang:.htaccess
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
```

## 500 Internal Server Error (T_T)

.htaccess ファイルに文法誤りがあると、500 Internal Server Error となる。再度チェックしてみること。

サーバーの設定によっては、.htaccessファイルの設定が無効になっていたり、設置場所が限定されていたり、ディレクティブの限定的な使用しか出来ない場合があって、その場合 500Internal Server Error が発生するとのこと。見たことないですが。そんなところは潔く諦めて他のサーバーを使うこと。

## Authorization Required (T_T)

ID・パスワードには、記号は使えないかもしれないと思っている。今のところ使えた経験無し。使わなかったらうまくいくこと多し。なので記号を使わないで数字と英字だけでやってみてください。それでもだめなら単に記述間違いではと思います。

## 特定のIPからのみアクセスできるようにするには

下記を.htaccessに追加する。

```lang:.htaccess
Satisfy any

order deny,allow
allow from xx.xx.xx.xxx/xx.xx.xxx.xxx

deny from all
```

# とても参考になったページ

* [ミケネコの htaccess リファレンス](http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/)
* [.htaccess実践活用術](http://www.shtml.jp/htaccess/)
* [Basic認証でのログアウト](http://shorindo.com/research/1307411586)
* [簡単ログイン【BASIC認証】](http://nakamura.noblog.net/blog/d/10018386.writeback)