OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4はattr_accessibleが使えない


Mass Assignment脆弱性(よくわかってないけれど大変そう)を突かれないようにするために、railsではattr_accessibleとかのメソッドが用意されています。

```ruby:user.rb
  attr_accessible :name, :email
```

rails3で作ったアプリを4に上げてみたら

```
undefined method `attr_accessible' 
```

エラーが発生。
「ないの？」と思って調べたら、attr_accessibleは非推奨になったらしい。
modelのattr_accesibleを削除して、代わりにcontrollerの方でStrongParameters(よくわかっていない)を設定するらしい。
一例だとこんな感じ。users/create

```ruby:users_controller.rb
def create
#attrのところはなんでもいい
  attr = params.require(:user).permit(:name, :email)
  @user = User.new(attr)
end
```

みたいな感じで。
今は値が２つだからそうでもないですけど多くなったらcontrollerの見た目が悪くはないですか、と思って
「おいおい改悪かよ」と初心者がほざいていましたが、scaffoldで遊んでいたら、いい感じの書き方を発見。

```ruby:users_controller.rb
def create
  @user = User.new(user_params)
end

def user_params
  params.require(:user).permit(:name, :email)
end
```

別のところに書いちゃえばすっきり。
こう書けばコードをぱっと見た時の意味も伝わりやすい気がする。
MySQL クエリーのキャッシュヒット率をSQLで求める方法

MySQLのクエリーキャッシュのヒット率を求めるSQLを作成しました。一般的にキャッシュのヒット率が二割以下の場合は、キャッシュを利用しない設定のほうがパフォーマンスを出すことができます。このクエリキャッシュヒット率をSQLで求められるように作成してみました。みなさまのMySQLローカルサーバで直接実行して結果を確認してみてください

以下がクエリーキャッシュのヒット率を求めるSQLです。基本的には、show status で計算することができます。私の場合は、それすらめんどくさいのでSQLで対応しました。クエリーキャッシュのヒット率を以下の計算で求めることができます。

```
@QCACHE_HITS/(@QCACHE_HITS+@QCACHE_INSERTS+@QCACHE_NOT_CACHED)*100
```

### 以下がクエリキャッシュヒット率を求めるSQLです。たぶん合ってます。

```
SELECT
@QCACHE_FREE_BLOCKS := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_FREE_BLOCKS';

SELECT
@QCACHE_FREE_MEMORY := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_FREE_MEMORY';

SELECT
@QCACHE_HITS := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_HITS';

SELECT
@QCACHE_INSERTS := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_INSERTS';

SELECT
@QCACHE_LOWMEM_PRUNES := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_LOWMEM_PRUNES';

SELECT
@QCACHE_NOT_CACHED := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_NOT_CACHED';

SELECT
@QCACHE_QUERIES_IN_CACHE := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_QUERIES_IN_CACHE';

SELECT
@QCACHE_TOTAL_BLOCKS := VARIABLE_VALUE
FROM
information_schema.`GLOBAL_STATUS`
where
VARIABLE_NAME = 'QCACHE_TOTAL_BLOCKS';

select @QCACHE_HITS/(@QCACHE_HITS+@QCACHE_INSERTS+@QCACHE_NOT_CACHED)*100 as CACHE_HIT_RATE;
```

## 動作確認

とあるデータベースのキャッシュヒット率を確認する

```
mysql> select @QCACHE_HITS/(@QCACHE_HITS+@QCACHE_INSERTS+@QCACHE_NOT_CACHED)*100 as CACHE_HIT_RATE;
+------------------+
| CACHE_HIT_RATE |
+------------------+
| 80.5282490931393 |
+------------------+
1 row in set (0.00 sec)
```

クエリキャッシュヒット率は80%でした。ストアドファンクションにしてもいいかもです。

## matsuuさんより一行SQLで直してもらいました。ありがとうございます

```
SELECT 
  (SELECT VARIABLE_VALUE 
  FROM 
     INFORMATION_SCHEMA.GLOBAL_STATUS 
WHERE 
  VARIABLE_NAME = 'QCACHE_HITS')/(SELECT SUM(VARIABLE_VALUE) 
FROM 
  INFORMATION_SCHEMA.GLOBAL_STATUS 
WHERE 
  VARIABLE_NAME IN ('QCACHE_HITS','QCACHE_INSERTS','QCACHE_NOT_CACHED'))*100 AS CACHE_HIT_RATE;
```
NSDataの中身を確認する方法


**[追記]**
コメントで指摘もらいました。
以下の関数の方法は文字列をひとつずつ取り出すにはいいですが、単に中身を確認するだけなら単純にNSString型に変換するメソッドを使ったほうがいいです。

**`NSString#initWithData:encoding:`メソッドを使う**

```objc
NSLog(@"%@", [[NSString alloc] initWithData:data
                                   encoding:NSUTF8StringEncoding]);
```

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


[こちらの記事](http://kaneshin.hateblo.jp/entry/2013/01/03/050715)に書いてありました。

「APIを叩いてデータを取得」みたいなケースは普通にありますよね。
ただ、取得したデータ（NSData）をそのまま出力しても人間が分かる形になっていません。
そこで、`NSData`の中身を見る関数を、上記記事を使わせてもらって作りました。
以下の関数を定義して、`NSData`を渡すとログが出力されます。

```objc
void MQDumpNSData(NSData *data)
{
	// データ配列のポインタを得る
    const unsigned char *ptr = [data bytes];
    unsigned long length     = [data length];

	// 取得したデータ分の文字列配列を確保
    unsigned char s[length];

    for (int i = 0; i < length; i++) {
		 // ptrポインタから文字列を取り出し、ポインタアドレスを先に進める
        s[i] = *ptr++;
    }
    
    NSLog(@"%s", s); //=> 人間が分かる形で出力される
}
```

`*ptr++`はC言語では常套句？だと思いますが、「配列のアドレスを型のサイズ分先に進める」という処理です。（例だと`char`型）
つまり1文字ずつ取り出して配列に格納している、というわけですね。仕組み自体はとてもシンプルです。
MySQL 消費税率を求めるストアドファンクション

## 概要

いまさらだけど、消費税率を求めるストアドファンクション、別にデータベースを見に行っているわけではないので
速いっす


## ストアドファンクション

```
DELIMITER $$

DROP FUNCTION IF EXISTS taxrate ;

CREATE FUNCTION taxrate (_wdate date) RETURNS decimal(2,2)
NOT DETERMINISTIC
BEGIN

   IF _wdate >= '2014-04-01' THEN
     RETURN 0.08 ;
   ELSE
     RETURN 0.05 ;
   END IF ;
END $$

DELIMITER ;
```

## 利用例

```
mysql> select taxrate(current_date) ;
+-----------------------+
| taxrate(current_date) |
+-----------------------+
|                  0.05 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select taxrate('2014-04-01') ;
+-----------------------+
| taxrate('2014-04-01') |
+-----------------------+
|                  0.08 |
+-----------------------+
1 row in set (0.00 sec)
```
stdbufコマンドを使用してコマンドの標準出力にタイムスタンプを追加


stdbufコマンドは、標準入出力ストリームのバッファ動作を変更してしてコマンドを実行することが可能。
http://linuxjm.sourceforge.jp/html/GNU_coreutils/man1/stdbuf.1.html

# やりかた

```sh:
command | stdbuf -oL gawk '{print strftime("[%a %b %e %H:%M:%S %Z %Y] "), $0; }'
```


commandの標準出力をうばって、行の先頭に時刻を追加しているだけです。

## テストスクリプト

```sh:test.sh
echo "init"
sleep 1
echo "processing ..."
sleep 2
echo "done"
```

## 動作例

```
$ ./test.sh | stdbuf -oL gawk '{print strftime("[%a %b %e %H:%M:%S %Z %Y] "), $0; }'
[Sun Mar  9 16:04:06 UTC 2014]  init
[Sun Mar  9 16:04:07 UTC 2014]  processing ...
[Sun Mar  9 16:04:09 UTC 2014]  done
```
Mac上のEmacsでtrampを使ってSSH接続しようとすると"ControlPath too long"とエラーが出る件

OSXをMarvericksに上げたアップグレードしたあたりから表題の件が発生していて困ったので調べました。

OSXが環境変数$TMPDIRに`/var/folders/sr/mvasdf87b80ba7zcve0000gn/T/`のような値を設定するらしく、sshコマンド側でこれが長すぎてエラーになっているらしいです。

根本解決ではないですが、MacPortsのMLにあった投稿を参考に以下の記述をinit.elに追加して解決しました。

```el
(setenv "TMPDIR" "/tmp")
```

参考
 https://lists.macosforge.org/pipermail/macports-tickets/2011-June/084295.html

# 2014-03-10 01:15追記

わたしがbrewでインストールして使っているEmacsのHEADでは、trampでSSH接続する際にデフォルトで`ControlMaster=auto`が適用されるようになっており、そのためのUNIXドメインソケットを作成するタイミングで今回のエラーが発生しているようでした。

今後Emacs24.4がリリースされると同様の問題に遭遇する方が増えるかもしれないですね。
MySQLのインスタンス内全てのテーブルを最適化するshell

## 概要

インスタンス内の全てのテーブルの最適化を図る

## 補足事項

innodb のみ

## コード

```
#!/bin/bash

#--------------------------------------------------------
# MySQLのテーブルすべてに、OPTIMIZEを実施する Innodb Only
#--------------------------------------------------------

_DATE=`date +"%Y%m%d"`
_HOSTNAME=`hostname -s`

_START_DATE=`date +"%Y %m %d - %H %M %S"`
# DB Config
_DBHOST=hostname
_DBUSER=userid
_DBPASSWD=passwd
_TMPDIR=/tmp
mkdir -p ${_TMPDIR}/${_HOSTNAME}
_TMP=${_TMPDIR}/${_HOSTNAME}/OPTIMIZE_TABLE_${_HOSTNAME}_${_DATE}.sql
echo "-- ### MySQL OPTIMIZE START ${_START_DATE} ###" > ${_TMP}
mysql -N -h ${_DBHOST} -u ${_DBUSER} -p${_DBPASSWD}  << EOD >> ${_TMP}
select
  'OPTIMIZE TABLE ' ||
  TABLE_SCHEMA || 
  '.' || 
  TABLE_NAME ||
  ' ;'
from 
  INFORMATION_SCHEMA.TABLES
where
  TABLE_SCHEMA != 'mysql' and
  TABLE_SCHEMA != 'information_schema' and
  TABLE_SCHEMA != 'performance_schema' and
  TABLE_TYPE ='BASE TABLE' and
  ENGINE = 'innodb';
EOD

cat ${_TMP} | mysql -N -h ${_DBHOST} -u ${_DBUSER} -p${_DBPASSWD}

_END_DATE=`date +"%Y %m %d - %H %M %S"`

echo "-- ### MySQL OPTIMIZE END ${_END_DATE} ###" >> ${_TMP}
```
インスタンス内の全てのテーブルの統計情報を更新するshell

## 概要

インスタンス内の全てのテーブルの統計情報を更新する

## 補足事項
innodb のみ

## コード

```
#!/bin/bash

#--------------------------------------------------------
# MySQLのテーブルすべてに、ANALYZEを実施する Innodb Only
#--------------------------------------------------------

_DATE=`date +"%Y%m%d"`
_HOSTNAME=`hostname -s`

_START_DATE=`date +"%Y %m %d - %H %M %S"`
# DB Config
_DBHOST=hosuname
_DBUSER=dbuserid
_DBPASSWD=passwd
_TMPDIR=/tmp
mkdir -p ${_TMPDIR}/${_HOSTNAME}
_TMP=${_TMPDIR}/${_HOSTNAME}/ANALYZE_TABLE_${_HOSTNAME}_${_DATE}.sql
echo "-- *** MySQL ANALYZE START ${_START_DATE} ***" > ${_TMP}
mysql -N -h ${_DBHOST} -u ${_DBUSER} -p${_DBPASSWD}  << EOD >> ${_TMP}
select
  'ANALYZE TABLE ' ||
  TABLE_SCHEMA || 
  '.' || 
  TABLE_NAME ||
  ' ;'
from 
  INFORMATION_SCHEMA.TABLES
where
  TABLE_SCHEMA != 'mysql' and
  TABLE_SCHEMA != 'information_schema' and
  TABLE_SCHEMA != 'performance_schema' and
  TABLE_TYPE ='BASE TABLE' and
  ENGINE = 'innodb';
EOD

cat ${_TMP} | mysql -N -h ${_DBHOST} -u ${_DBUSER} -p${_DBPASSWD}

_END_DATE=`date +"%Y %m %d - %H %M %S"`

echo "-- *** MySQL ANALYZE END ${_END_DATE} ***" >> ${_TMP}

exit  0
```
form_for remote:true の時にajax:failure、ajax:loadingがコールされない

ハマりまくって時間を食ってしまったが、ようするにイベントの名前が違うらしい。この名前変更っていつ起きたものなのだろうか。読んだ資料が古かったんだろう。

http://stackoverflow.com/questions/6004189/rails-remote-form-callback-ajaxloading-does-not-fire-others-do
によるとajax:[jqueryでのイベント名]っぽい。実際のソースをたぐってみると下記のように書いてあった。

```js
       options = {
          type: method || 'GET', data: data, dataType: dataType,
          // stopping the "ajax:beforeSend" event will cancel the ajax request
          beforeSend: function(xhr, settings) {
            if (settings.dataType === undefined) {
              xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
            }
            return rails.fire(element, 'ajax:beforeSend', [xhr, settings]);
          },
          success: function(data, status, xhr) {
            element.trigger('ajax:success', [data, status, xhr]);
          },
          complete: function(xhr, status) {
            element.trigger('ajax:complete', [xhr, status]);
          },
          error: function(xhr, status, error) {
            element.trigger('ajax:error', [xhr, status, error]);
          },
          crossDomain: crossDomain
        };
```
Vagrantでhostのportをguestのportに転送する

# Vagrantでhostのportをguestのportに転送する

GuestOS側で起動しているサービスにHost側からアクセスしたい事が多々ある

vagrantfileの編集で可能です
以下は、ホストの8081ポートにアクセスすればゲストOS側の8080ポートにアクセスし
ホストの8001ポートにアクセスすればゲストOS側の8000ポートにアクセスする設定です。

```
config.vm.network :forwarded_port, guest: 8080, host: 8081
config.vm.network :forwarded_port, guest: 8000, host: 8001
```
【個人用メモ】discards qualifiers [-fpermissive]のエラーが発生した時

サンプルのソースコードは以下とする。

```cpp
class Hoge {
 public :
  Hoge();
  ~Hoge();

  int GetValue() const;
  int GetX();

 private:
  int X;
};

int GetValue() const {
  return GetX();
}

int GetX() {
  return X;
}
```

上記のソースビルド時に下記のエラーが発生する場合は、以下の対策をとる。
discards qualifiers [-fpermissive]

①メソッドGetValueのconstをとる。
②メソッドGetXをconstにする。
Java7のtry-with-resources構文でcloseし忘れを防ぐ

# Java7のtry-with-resources構文でcloseし忘れを防ぐ

DBやらfileやらにアクセスする際に

```java

        FileInputStream is = null;
        FileOutputStream os = null;
        try{
            is = new FileInputStream("hoge.txt");
            InputStreamReader ir = new InputStreamReader(is,"Shift_JIS");
            os = new FileOutputStream("hige.txt");
            OutputStreamWriter ow = new OutputStreamWriter(os,"UTF-8");
            int tmp;
            while((tmp = ir.read()) != -1){
                ow.write(tmp);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            is.close();
            os.close();
        }

```

こんな感じで書いていたが

```java

        try(FileInputStream is2 = new FileInputStream("hoge.txt");
                FileOutputStream os2 = new FileOutputStream("hige.txt")){
            InputStreamReader ir2 = new InputStreamReader(is2,"Shift_JIS");
            OutputStreamWriter ow2 = new OutputStreamWriter(os2,"UTF-8");
            int tmp;
            while((tmp = ir2.read()) != -1){
                ow2.write(tmp);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

```

こう書ける
AutoCloseableを実装したクラスであれば自動でcloseしてくれる
uupaa.task.jsでリクエストをリトライする

[uupaa.task.js](http://uupaa.github.io/Task.js/slide/#/)を少し使ってみたのです。

```json:package.json
{}
```

```js:server.js
var http = require('http'),
    server = http.createServer();

var fail = false;

server.on('request', function(req, res) {
  var response;

  fail = !fail;
  response = (fail)
      ? {code: 500, type: 'text/plain', body: 'error'}
      : {code: 200, type: 'application/json', body: '{"status": "success"}'};

  res.writeHead(response.code, {
    'Content-Type': response.type
  });
  res.end(response.body);
});
server.listen(8000);
```

```js:index.js
var request = require('request'),
    task = require('uupaa.task.js');

var t = new task(1, function(err, buffer) {
  console.log(buffer.status);
}).missable(2);

function req() {
  request('http://localhost:8000/', function(err, res, body) {
    if (res.statusCode === 500) {
      console.error('oh');
      t.miss();
      req();
    } else {
      t.set('status', JSON.parse(body).status).pass();
    }
  });
}
req();
```

```bash:Terminal
$ npm install request uupaa.task.js
```

```bash:Terminal1
$ npm start
```

```bash:Terminal2
$ node index.js
oh
success
```

なるほどー。いいかも。
日本語を含むZIPファイルを文字化けせず解凍する方法

日本語を含むZIPファイルを圧縮したのと違うのOSで解凍する際、文字化けが発生することがあります。
以下調べた対処法を書いていきます。

Windowsで圧縮したZIPをMac、Linuxで解凍する場合、逆にMac等で圧縮したZIPをWindowsで解凍する場合の両方で文字化けは起こりえます。

## 原因
Mac、Linuxではファイルを圧縮する際ファイル名をutf-8でエンコードするのに対し、Windowsではファイル名をCP932(Shift_JIS)でエンコードするのが原因。
[ZIP (ファイルフォーマット) - Wikipedia](http://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)#Windows_.E5.9C.A7.E7.B8.AE.E3.83.95.E3.82.A9.E3.83.AB.E3.83.80)

## 対処法
### Mac,Linux→Windows
Macで作られたファイルをWindowsで開く場合

Windows標準の解凍機能を用いる場合、修正プログラム( http://support.microsoft.com/kb/2704299/ja )を使うことでWindows 7 または Windows Server 2008 R2では文字化けせずに解凍できるようになります。
Windows 8からは何もせずとも解凍できるようになっているようです。その他の環境の場合、[Explzh](http://www.ponsoftware.com/)等のフリーソフトを使うことをオススメします。

### Windows→Mac,Linux
Windowsで作られたファイルをMac、Linuxで開く場合

Mac標準のファイルアーカイバー、Ubuntuの日本語Remixのunzipを使っている場合、文字コードを自動で判別してくれるため対策の必要はありません。
それ以外の環境の場合、(Linux想定)以下の様な対処法があります。

* patchが当たった修正版unzipを使う
* unarを使う
* 化けたファイル名をconvmvで修正する


### unzip
Ubuntuで化けるときはとりあえず http://www.ubuntulinux.jp/japanese の *Japanese Teamのパッケージレポジトリを追加する* に書いてあることを実行するのをオススメします。
unzipが修正され、ファイルアーカイバ等でShift_JISでファイル名がエンコードされたZIPファイルを開けるようになります。
他のディストリビューションだとソース落としてパッチを当ててビルドすることで修正版unzipを導入できますがそんなこと出来る人はこんなところきっと見ないので割愛。

### [unar](http://unarchiver.c3.cx/commandline)
文字コード判別機能付き解凍コマンド
WindowsのZIPファイルを解凍するだけでなく、色々な形式の圧縮ファイルを解凍できるコマンドです。
解凍するだけならunzipもtar xfももう要りません。
インストール方法は省略

### convmv
ファイル名をiconvを使ってOSのロケールに修正するコマンド
他の原因でファイル名が化けた際や、[Windows用にShift_JISで圧縮したファイルを作りたい場合](http://www.ftnk.jp/~fumi/cl/2007-06-29-2.html)にも
使えます。
使い方はこんな感じ

```
convmv -f utf8 -t shift_jis *.txt --notest
```
重複しないファイル名

ファイルやフォルダの書き出しをするとき、既に同名のファイルが存在していた場合は重複しないような名前を生成したい。

実はこの働きをする```-[NSFileManager _web_pathWithUniqueFilenameForPath:]```という隠しメソッドが存在するらしいのだが、なんとなく不安なのでこの程度ならいっそ書いてしまえ！
というわけで、NSFileManagerにカテゴリを追加。

```objc
@interface NSFileManager (NSFileManagerUniquePathExtention)
- (NSString *)pathWithUniqueFilenameForPath:(NSString *)path;
@end

@implementation NSFileManager (NSFileManagerUniquePathExtention)

- (NSString *)pathWithUniqueFilenameForPath:(NSString *)path {
    if (![self fileExistsAtPath:path]) return [path lastPathComponent];
    
    NSString *extention = [path pathExtension];
    NSString *base = [path stringByDeletingPathExtension];
    
    if (extention.length > 0) extention = [@"." stringByAppendingString:extention];
    
    NSString *prefixZero = @"";
    while ([path length] + [prefixZero length] < NSUIntegerMax) {
        for (NSUInteger i = 1; i < NSUIntegerMax; i++) {
            NSString *result = [NSString stringWithFormat:@"%@-%@%lu%@", base, prefixZero, i, extention];
            if (![self fileExistsAtPath:result]) return result;
        }
        
        prefixZero = [prefixZero stringByAppendingString:@"0"];
    }
    
    return nil;
}

@end
```

ファイル、フォルダのどちらでも使える。
「hoge.txt」が「hoge-1.txt」「hoge-2.txt」のようになる。
後ろの数値がNSUIntegerMaxまでいくとは思わないが、そのような場合は数字の前に0を追加する。
whileループを抜ける条件は適当。無限ループにならなければ良い。
AWS 勝手に用語集

# AWS のコンポーネント説明

* AWS を使用するにあたり、専用の用語が沢山出てくるため、頻度の多い用語を簡単にまとめてみました

## EC2
* いわゆる仮想サーバ
* OS には Ubuntu や Red Hat, Windows Server などが自由に選択できる
* 起動時に IP アドレスが自動で割り振られるが停止すると解放するため、再起動時には別の IP が振られる
* 停止時にはスペックの変更が可能になる

## EBS
* EC2 にマウントする形で使用する仮想ディスク
* 基本的に EC2 とは分離しているため、EC2 を停止してもデータは残る
* スナップショットととして保存する事もできる

## ELB
* ロードバランサ
* 複数の EC2 にトラフィックを振り分けることが可能

## EIP
* 固定のグローバル IP
* EC2 に割り振る形で使用
* EIP 自体は AWS のアカウントに紐付いているため、使用している EIP を別の EC2 に振り直すことも可能

## RDS
* RDBMS
* 使用可能なエンジンに MySQL, PostgreSQL, Oracle などがある
* 自動バックアップ機能があり、最大 31 日分まで保存可能

## S3
* ネットワーク接続されたストレージ
* 高い耐久性を謳っている
Android app をリリースする


##概要
Android appをリリースするまでの手順をメモります

[1] Google developper 登録（初回のみ）
[2] 署名付きAndroid appの作成
[3] マーケットに公開


 
##[1] Google developper 登録
ここから[Google Developper](https://play.google.com/apps/publish/signup)の登録をしてください。

2000円〜3000円くらいの金額がかかります。
え、金かかるの？て思うけどこれはむっちゃお得です。
一回登録すれば一生使えます。

Appleなら年間１万くらいかかりますので比べるとお得さが伝わると思います。

　
## [2] 署名付きAppの作成
公開するためには署名つきappファイルというのを作らなくてはいけません。

その作り方は

[1]
Eclipse上で該当するAndroidプロジェクトを右クリック
=>Androidツール
=>Export Signed Application Package
=>「Export Android Application」ダイアログ上でappの選択


[2]
 Create new keystorを選択
=>ロケーションとしては，好きな場所を選択。例えば「workspace/該当Androidプロジェクトのフォルダ/key/」というフォルダを作って，そのフォルダ上に key のようなファイル名を指定する。
(例 /Users/kento/Documents/FriendQuiz.keystore)
=>
電子署名のパスワードは基本的に，アプリケーションごとに管理する。新規パスワードを入力して，大事に控えておく。確認欄にも同じものを入力

[3]
エイリアス（電子署名の名前）は好きな名称を付けて良いが，例えば「key」などの名前を付ける。
=>
エイリアスに対応するパスワードを考案して入力する。エイリアス名とパスワードは，やはり大事に控えておく。
=>
validityには，署名の有効期間を年単位で入力する。「25」とか「50」とか。
=>
「At least one Certificate issuer field is required to be non-empty」と言われるので，リリース者の情報をとりあえず１か所以上入力する。例えば，「組織」の欄にhoge companyをとか。

[4]
Destination APK file（リリース用のAPKファイルの保存パス）を入力する。
=>
finish!

## [3] マーケットに公開

[1]
[Android developper console](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCoQFjAA&url=https%3A%2F%2Fplay.google.com%2Fapps%2Fpublish%2F&ei=6robU53TFoT5kAXxxYDACg&usg=AFQjCNEvG-AI0sojdmEeraO9D_b4Xtsn6g&sig2=UGw1UWpKXs9dCG8fXIHmgg&bvm=bv.62578216,d.dGI) を開く

[2]
新しいappを作るをクリック
=>
タイトル 言語 の欄を埋めた後apkのファイルをアップロード
=>
" * "のついた項目を全部埋める
=>
右上の「公開」をクリック
　
　
これでリリース完了です！お疲れさまでした！
androidは審査が緩いので、半日もすればマーケットにリリースされます！(iPhoneだと余裕で１週間超えます。ここもAndroidの良いとこ！)

##おわりに
Androidは本当にリリースのハードルが低いので私みたいな初心者にはお勧めです。
なんか上手くいかなかったときはぐぐれば絶対出てきます。
頑張ってください。

[参考] 「[主に言語とシステム開発に関して](http://d.hatena.ne.jp/language_and_engineering/20120310/AndroidMarketReleaseSteps)」様、ありがとうございました
Facebookを使用したAndroidAppリリースした瞬間に何故か動かなくなる問題



##始めに
Facebook SDKを使ったアプリを作って、いざAndroid marketにリリースしたらなぜかFacebook周辺が全くうごかなくなった・・・・

ということがあって解決にかなりの時間を使ったのでメモります。

##状況
自分の手元のEmulator, 実機では普通に動く。
但し、Google MarketからDLしたものは全く動かない。

デバックのときは普通に動くのでエラーの原因を探すのが凄い大変でした。

大量のLogを加えて、もう一回Marketにリリースした後にDLして、その実機をEclipseに繋いだ状態で起動・・・・的なことをしました。

その結果得たエラーコードは

```
UnknownError: ApiException:Key hash BGyx5d0rMOuY9aQqZK4B9q04+no does not match any stored key hashes
```
です。

まあエラーコード分かったのであとは調べるだけ

##解決法
原因としてはDebug用のKey HashesをFacebook Developperに書いていたってことです。
そもそもDebug用のHash keyとRelease用のHash keyは違うんですね。Release用のHash KeyはApplication毎に個別に設定しなくてはならないんです。
Release用のHash KeyはApplication毎に個別に設定しなくてはならないんです。
大事なことなので２度書きました。

Key Hashに必要なのは
ターミナルでこのコマンドを叩いてください

```bash:
#Macの人
$ keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

#Windowsの人
$　keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
```
コレを叩くとALIAS Keyのpasswordを聞かれるんで答えてください。

すると表示されます。

手に入れたKeyをFacebook Developprの自分のKeyのところに追加してください。これでちゃんと動くはずです。


##感想
Doucumentには普通に書いてあることです。
反省しました。

参考
本家該当ページ
https://developers.facebook.com/docs/android/getting-started/

Stack over flow
http://stackoverflow.com/questions/11615825/hash-key-facebook-api-android-for-release-mode-not-debug-mac-os

http://stackoverflow.com/questions/12958913/switching-between-facebook-apps-on-android

http://stackoverflow.com/questions/19576791/unknownerror-apiexceptionkey-hash-does-not-match-when-i-have-fb-app-in
Yokohama.rb #42 メモ


#rationalize

```ruby
1.333.to_r # => (6003298303284871/4503599627370496)
1.333.rationalize # => (1333/1000)
Math::PI.rationalize(0.2) # => (3/1)
Math::PI.rationalize(0.01) # => (22/7)
Math::PI.rationalize(1e-6) # => (355/113)
```

すげー。

#Vector の悪用

```ruby
Vector["a","b","c"] + Vector["x","y","z"]
# => Vector["ax", "by", "cz"]
```

#Matrix の罠

```ruby
a=[[1,2],[3,4]]

# 本来の使い方
Matrix[*a] # => Matrix[[1, 2], [3, 4]]
Matrix[*a].row_count # => 2

# 間違い
Matrix[a] # => Matrix[[[1, 2], [3, 4]]]
Matrix[a].row_count # => 1
```

`Matrix[a]` は、各要素が配列になっている、意味不明なものができてしまう。


#リテラルと文字列評価

```ruby
2i # => (0+2i)
2r # => (2/1)
"1.1@2.2".to_c # => (-0.6473512289808805+0.8893460442015492i)
"1.1@2.2".to_c.angle # => 2.2
"1.1@2.2".to_c.abs # => 1.1
2ir # => SyntaxError: unexpected tIDENTIFIER, expecting end-of-input
2ri # => (0+(2/1)*i)
2R #=> SyntaxError: unexpected tCONSTANT, expecting end-of-input
2I #=> SyntaxError: unexpected tCONSTANT, expecting end-of-input
```

ruby 2.1 からかな。
`@` を使って極座標を入れるのは、`to_c` の仕様で、リテラルにはならない。

#$SAFE=4 is obsolete

obsolete で、特に代わりの機能はない模様。
tmuxでのコピーを1キーで行う方法


例えば､1行コピーを1キーで行うなら､以下の様な感じです。

```~/.tmux.conf
bind -t vi-copy y copy-line
bind Y run 'tmux copy-mode\;' send-keys y\;
```

上の設定では､ `C-b, Y`で1行をコピーします。`C-b`は`prefix`です。念のため。


ちなみに、貼り付けは､ `C-b, ]`です。


tmuxは通常なら､ `copy-mode`を起動してからコピーすることになります。

デフォルトでは copy-mode の起動は､`C-b,[`です。更に､1行コピーは`Y`だった気がします。

しかし、上の設定では､`copy-modeの起動`と`1行コピー`を1キーに省略しています｡

このように、`send-keys`を使うことで､便利なキーバインドを設定できます｡

この辺りの設定はあまり見たことがないので、誰か、便利そうなキーバインド設定を作ってほしい…。

ちなみに、1行コピー`copy-line`がデフォルトで`y`だった場合は､`bind -t vi-copy y copy-line`の部分は不要です｡

デフォルトの設定は確認してないので､確実性を高めるために一応書くことにしました。
Error Shooting for rbenv and readline "Libraty not loaded"


## Things
### Env
- Mac 10.7
- `rbenv -v` rbenv 0.4.0
  - rbenv install 1.9.3-p545
- `brew -v` Homebrew 0.9.5

### Steps
After ruby install,

```
RUBY_CONFIGURE_OPTS="--enable-shared --with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl) --with-libyaml-dir=$(brew --prefix libyaml)" rbenv install 1.9.3-p545 -v
```

Library not loaded. :(

```
/Users/hogehoge/.rbenv/versions/1.9.3-p545/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': dlopen(/Users/hogehoge/.rbenv/versions/1.9.3-p545/lib/ruby/1.9.1/x86_64-darwin11.4.2/readline.bundle, 9): Library not loaded: @@HOMEBREW_PREFIX@@/opt/readline/lib/libreadline.6.2.dylib (LoadError)
  Referenced from: /Users/hoisjp/.rbenv/versions/1.9.3-p545/lib/ruby/1.9.1/x86_64-darwin11.4.2/readline.bundle
  Reason: image not found - /Users/hoisjp/.rbenv/versions/1.9.3-p545/lib/ruby/1.9.1/x86_64-darwin11.4.2/readline.bundle
```

## Solution
- 1. reinstall readline

```
$ brew list readline
/usr/local/Cellar/readline/6.2.4/include/readline/ (8 files)
/usr/local/Cellar/readline/6.2.4/lib/libhistory.6.2.dylib
/usr/local/Cellar/readline/6.2.4/lib/libreadline.6.2.dylib
/usr/local/Cellar/readline/6.2.4/lib/ (6 other files)
/usr/local/Cellar/readline/6.2.4/share/man/ (2 files)
/usr/local/Cellar/readline/6.2.4/share/readline/ (11 files)

$ brew uninstall readline
$ brew install readline
```

- 2. brew link (maybe no need.)

```
$ brew link --force readline
```

- 3. Resolved. :)
ディレクトリのかわりにその名前で始まるファイルを開くVim script

Vimでディレクトリを開こうとした時に、
開こうとした名前で始まるファイルがある場合は、
ディレクトリのかわりにそのファイルを開くスクリプトです。

1. `set wildmode=longest:full`と設定していて、
2. 'tcvime/'と'tcvime.vim'がある状況で、
3. 'tcvime.vim'を開こうとして、`:e tc<Tab>`と入力(補完)
4. `:e tcvime`まで補完される
5. ついそのままリターンキーを押すと'tcvime/'がnetrwで開かれる。

開きたい'tcvime.vim'が開けなくていらついたので、スクリプトを作りました。
個人的にはディレクトリを開きたい状況はほとんど無いですし。

なお、このスクリプトを入れると、上記状況に当てはまる場合に
ディレクトリがnetrwで開かれなくなりますが、netrwで開きたい場合は、
`:Explore directory`

以下スクリプト。
netrwの一部autocmdを上書きする必要があるので、~/.vim/after/pluginに置いています。

```vim:~/.vim/after/plugin/closediropenfile.vim
augroup CloseDirOpenFile
  au!
  autocmd BufEnter *	call s:CloseDirOpenFile(expand("<amatch>"))
augroup END
" netrwのLocalBrowserではなくCloseDirOpenFileが動くように、削除
if exists('#FileExplorer')
  autocmd! FileExplorer BufEnter *
endif

function s:CloseDirOpenFile(name)
  if !isdirectory(a:name)
    return
  endif
  let files = glob(a:name . '*', 1, 1)
  call filter(files, '!isdirectory(v:val)')
  if len(files) < 1
    sil! call netrw#LocalBrowseCheck(a:name)
    return
  endif
  "let nr = bufnr('')
  let nr = expand('<abuf>')
  execute 'e' files[0]
  " :eより先にbwipeoutすると:sp時に期待通りに動かないので
  execute nr . 'bwipeout!'
  " (BufAddにして:bw無しにするとnetrwのせいで(?)[RO]になる)
endfunction
```
Qiita書き方メモ

Qiitaはマークダウンの少し独自のやつで記述出来る。

![140309-0001.png](https://qiita-image-store.s3.amazonaws.com/0/26030/1daeaad0-052c-9744-e5ce-e6a2ecc48b78.png)


#エスケープ
バックスラッシュ \\を前に置いてエスケープ

\\#エスケープ
で下のような表示になる。
\#エスケープ

#引用
\>で引用
下に空行が必要

>引用

#コードの挿入
上下に空行をいれ、バッククオート3つ
```で囲む。

JIS配列なら　shift + @ で ' がでる

> (空行)
> \`\`\`ruby:qiita.rb
> puts 'おかしいと思いませんか？　あなた'
> \`\`\`
> (空行)

これでこうなる。

```ruby:qiita.rb
puts 'おかしいと思いませんか？　あなた'
```

文字列を囲むにはバッククオート \`　1つで囲む
\`囲むのです\`
`囲むのです`

#見出し
\#の数で表す。
#これはH1タグです(#)
##これはH2タグです(##)
###これはH3タグです(###)
####これはH4タグです(####)

#文字強調

前後に 半角スペース か 改行文字 が必要
##太字にする

> \<b>test\</b>

> \**太字にする**
> \__太字にする__

<b>test</b>
 **太字にする**
 __太字にする__


##イタリックにする。
\*か、\_で囲む。

> \*イタリック*
> \_イタリック_

 *イタリック*
 _イタリック_


#リンク
[]と()で囲む
[文のリンク]（リンク先アドレス）

ここを[こうyahoo!](http://www.yahoo.jp)

ここを\[こうyahoo!]\(http://www.yahoo.jp)

#リスト
##Disc型
上下に空間が必要。
* + - の後に半角が必要。
どのマークでも同じ・。

> \+ 1
> \* 2
> \- 3

+ 1
* 2
- 3

#水平線

>\* \* \*
>\*\*\*
>\*\*\*\*\*
>\- \- \-
>\---------------------------------------

* * *
***
*****
- - -
---------------------------------------


#テーブル

```
| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |
```

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |

これを適当に書き換えれば良い

```
| レフト | センター | 右 |
|:-----------|------------:|:------------:|
| aaa      |        This |     This     |
| ななな     |      column |   あああ   |
| ぬぬぬ  |    will |    ううう     |
```


| レフト | センター | 右 |
|:-----------|------------:|:------------:|
| aaa      |        This |     This     |
| ななな     |      column |   あああ   |
| ぬぬぬ  |    will |    ううう     |

#ページをマークダウンで見る
アドレスの最後に .md を付ける。
Qiita書き方メモ.md
http://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab.md


#参照元
Markdown記法 チートシート
http://qiita.com/Qiita/items/c686397e4a0f4f11683d
http://qiita.com/Qiita/items/c686397e4a0f4f11683d.md
CentOSでrbenvをシステムにインストールする

rbenvのよくあるインストール手順はユーザのホームディレクトリに入れるパターンが多いですが、複数ユーザで共有したかったのでシステムにインストールしてみることにしました。ここでは /usr/local/rbenv にインストールするものとして説明します。別の場所にインストールする場合は適宜よみかえてください。以下その手順です。

まずビルドに必要なパッケージを導入します。

```bash
# yum install -y git gcc gcc-c++ openssl-devel readline-devel
```

次にソースをとってきます。下記の例では `/usr/local` にインストールすることにします。

```bash
# cd /usr/local
# git clone git://github.com/sstephenson/rbenv.git rbenv
# git clone git://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
```

ぼくの環境のCentOS 6.5では、全ユーザの `.bashrc` の中で `/etc/profile.d/` 配下がロードされるようになっていました。なので、PATHの設定を全ユーザに反映させるため、 `/etc/profile.d/rbenv.sh` とかを作成し下記のように書きます。 `--no-rehash` をつけないとログインのたび rehash するので遅くなるようです。

```bash:/etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init --no-rehash -)"
```

上記をロードします。

```bash
# source /etc/profile.d/rbenv.sh
```

Rubyは下記のようにrootでインストールします。gemは、[システムにはbundlerだけ入れておいてあとはpathを指定して管理するのがよい](http://qiita.com/youcune/items/222777415f00d19cccb4)でしょう。

```bash
# rbenv install 2.1.0
# gem install bundler --no-ri --no-rdoc
```

## 参考文献

* [rbenvをシステムワイドにインストールする &raquo; つくば日記(仮)](http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv)
* [Ruby - オレオレ rbenv 運用 Tips - Qiita](http://qiita.com/sonots/items/a309520b9cce1b7631a5)
PHPの関数内static変数

PHPは、関数の中でstatic変数を宣言すると、その関数が初めて呼ばれた時にのみ初期化をし、それ以降は何度呼ばれても初期化処理をスキップしつつ、値を保持する機能があります。

```php
function staticVar() {
    static $var = 0;
    $var++;
    var_dump($var);
}

staticVar(); // 1
staticVar(); // 2
staticVar(); // 3
```

こんな感じで。
クラス化してメソッドにしても同様みたいです。
今のところ、良い使いドコロが思いつきませんけど・・・。
Mac仮想環境(Parallels)にSteamOSを導入できなかった


前から気になっていたSteamOS。
beta版公開当初に試した時には、持っていたMacがOSX 10.6.8 32bitでインストールできずに断念していました。

今回の導入環境：
Mac OSX 10.9.2 / Parallels Desktop 9

私が最初に挑戦した時には「自分でisoを作ってね！」という状態でしたが、今はもうisoファイルが配布されてるんですね。

[ダウンロード場所](http://repo.steampowered.com/download/)からSteamOSDVD.isoを落としてきます。

Parallels Desktopを起動し、落としてきたisoイメージを選択してインストールします。

OSのインストールが終わると、下の画面が表示されます。

![SteamOS画面](https://qiita-image-store.s3.amazonaws.com/0/23370/148c8767-98df-c483-ad39-2e3e36ad6720.png "SteamOS画面")

ライセンス等をよく読んで、OKをクリックすると自動でupdateしてくれるようです。

![アップデート中](https://qiita-image-store.s3.amazonaws.com/0/23370/1936db28-40e2-d5b2-e2d3-9e3b1173ce45.png "アップデート中")

そして、Steamへのアクセス画面へ！

![いざSteamへ](https://qiita-image-store.s3.amazonaws.com/0/23370/dd584e28-c2da-58c7-129e-2818b0cb8da8.png "いざSteamへ")

![140309-0004.png](https://qiita-image-store.s3.amazonaws.com/0/23370/a48bf1e6-d1b7-e39f-0d1f-56bc8b3869b0.png "140309-0004.png")

「じゃあ、アップデートしたから再起動してみよう！」と思い、再起動を実行。

・・・

上がってきたけど、真っ黒いまま。。。
[「SteamOS」がやってきた！ 2014年の本格展開を前に初期β版を動かしてみる](http://www.4gamer.net/games/038/G003821/20131219037/)
はい、まだdebianの状態でした。

このあと色々試しましたが、先に進めず。
後輩が実機で試してみるとの話をしていましたが、私も仮想環境でできないか継続して挑戦してみようと思います。
motionpodsでインストールしたものをuninstallする

今日、motionpodsにてinstallをしたものが、何回やってもundifinedエラーになったのでそのときの対処メモ。

①ReadMeを再度、ライブラリを読み直し理解する。
②Rake pod:installが上手く実行できているかを確認する。

今回は②が問題だった。
rakeの際のログを確認するとたまに** BUILD FAILED **になっていて以前、ちょっと独自でコネコネしたものがエラーになっている。。。
なので一度unistallしてから再度installする事に。

①一度Rakefileのapp.podsから削除する。
② Rake pod:install を実行すると無事 "Remove" された事がログから確認できる。

再度app.podsに追加し、上記を実行すると問題なく動いた。
Windowsでvimをビルド

## コマンドだけでもいけるんです。

* `対象者`:Windowsでvimをビルドしてみたい変態
* `終着点`:+lua,+pythonなvimを使える。

## とっととやろう

まずは必要なパッケージを`chocolateyで持ってきます。

```bat
> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object    net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
> rem .NETがない場合再起動が必要かも
> cinst git
> cinst curl
> cinst hg
> cinst mingw
> cinst mingw-get
> cinst python
```

パスを通すためにコマンドプロンプトを再起動
mingwでビルドするのでmingw32-gcc-g++などコンパイルに必要なものをインストールします。
msys-baseをインストールしたときに入ると思われるmsys-vimは邪魔なので消します。
msysにパスを通します。

```bat
> mingw-get install mingw-developer-toolkit
> mingw-get install mingw32-base
> mingw-get install mingw32-gcc-g++
> mingw-get install msys-base
> mingw-get remove msys-vim
> setx PATH %PATH%;"C:\MinGW\msys\1.0\bin"
```

パスを通すためにコマンドプロンプトを再起動
lua(5.2.3)とvimをビルドします。
筆者が行った時点(2014.03.09)ではvimのバージョンは7.4.193でした。

```bat
> mkdir src_temp
> cd src_temp
> curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz
> tar zxf lua-5.2.3.tar.gz
> cd lua-5.2.3
> make mingw
> make mingw install
> mkdir include
> cp src/*.h include
> cd ..
> hg clone https://vim.googlecode.com/hg/ vim
> set PYTHON_DIR=C:\Python27
> set PYTHON_VER=27
> set LUA_DIR=../../Lua-5.2.3
> set LUA_VER=52
> cd vim/src
> mingw32-make -f Make_ming.mak GUI=yes IME=yes MBYTE=yes ICONV=yes PYTHON=%PYTHON_DIR% DYNAMIC_PYTHON=yes PYTHON_VER=%PYTHON_VER% CSCOPE=yes NETBEANS=no LUA=%LUA_DIR% DYNAMIC_LUA=yes LUA_VER=%LUA_VER%
> mingw32-make -f Make_ming.mak GUI=no IME=yes MBYTE=yes ICONV=yes PYTHON=%PYTHON_DIR% DYNAMIC_PYTHON=yes PYTHON_VER=%PYTHON_VER% CSCOPE=yes NETBEANS=no LUA=%LUA_DIR% DYNAMIC_LUA=yes LUA_VER=%LUA_VER%
> cd ../
> cp ./src/*.exe ./runtime/
> cp ./src/*.dll ./runtime/
> cp ../lua-5.2.3/src/lua52.dll ./runtime
> cp c:/Python27/python27.dll ./runtime
> mkdir c:\vim
> mv runtime\* c:\vim
> setx PATH %PATH%;"C:\vim"
```

## 最後に
hg cloneする利点はパッチの当たった状態のほぼ最新のvimのソースを持ってこれる点です。
もしvimのソースが古いなら

```bat
> cd %HOMEPATH%/src_temp/vim
> hg pull
> hg update
```

しとけばオーケーです。
PHPのswitch

ifやswitchを使って場合分けをすると、バグを埋め込みやすくなるので最近は避けがちなのですが、たまーに使いたくなるときがあります。簡単なコードを書くときとか。
phpのswitchは、緩やかな比較を行っているようで、ちょっと意図しない結果になることがあるようです。

参考：[PHP 型の比較表](http://us1.php.net/manual/ja/types.comparisons.php)

```php
function switchTest($switchCase) {
    switch ($switchCase) {
        case 'ok':
            return 'ok';

        case 'ng':
            return 'ng';

        case true:
            return 'true';

        case false:
            return 'false';

        default:
            return 'default';
    }
}

var_dump(switchTest(true)); // ok
var_dump(switchTest(false)); // false
var_dump(switchTest('ng')); // ng
var_dump(switchTest(0)); // ok
```

まぁ、あまり無茶なswitchを使わないほうが良いなと思いました。
CAAnimationで正弦関数の変化を表現する


CALayerのプロパティをアニメーションをさせるとき、大抵の場合CABasicAnimationを使うと思いますが、CABasicAnimationは増加値が基本的に単調増加です。timingFunctionを設定すると二次ベジェ曲線で増加の振る舞いを変えることができますが、正弦波のような波の関数には出来ません。

正弦波は、たとえば、ホバリングやシェイクアニメーションを実装したい時に使います。
ぷかぷか浮いたり沈んだり、といった感じですね。

そこでCABasicAnimationではなく、CAKeyFrameAnimationを使います。

CAKeyFrameAnimationはその名のとおり、終了までのkeytimeとその時点での値を設定することで、より柔軟なアニメーション表現が可能になります。つまり、アニメーションの値を関数で表現することができるようになります。

ハイ、そこでこんなコードを書きました。

```objectivec

- (void)sinAnimation
{
	// アニメーションの開始点
    CGPoint start = CGPointMake(self.view.bounds.size.width/2, 100);
    // アニメーションの時間
    CFTimeInterval duration = 2;
    // fps
    NSUInteger fps = 24;
    // 実際のフレーム数
    NSUInteger frameCount = (NSUInteger)duration*fps;
    // keytimes
    NSMutableArray *keytimes = [NSMutableArray arrayWithCapacity:frameCount];
    // values
    NSMutableArray *values = [NSMutableArray arrayWithCapacity:frameCount];
    // 総フレーム数に対して正規化されたkeytimeの値を割り振る
    for (double i = 0, add = (double)1/frameCount; i <= 1.0; i+= add){
        [keytimes addObject:@(i)];
    }
    // 波長
    CGFloat amp = 50;
	// 加算するラジアン
    CGFloat add = M_PI*2/frameCount;
    // keytimesに対してサイン関数の値の座標を割り振る
    for (NSUInteger i = 0; i < frameCount; i++){
        CGFloat x = amp*sin((double)i*add);
        CGPoint p = CGPointMake(start.x+x, start.y);
        [values addObject:[NSValue valueWithCGPoint:p]];
    }
    // KeyFrameAnimationを作る
    CAKeyframeAnimation *kfa = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    kfa.duration = duration;
    kfa.keyTimes = keytimes;
    kfa.values = values;
    // サイクルアニメーションにする
    kfa.repeatCount = HUGE_VALF;
	// 実行
	[self.layer addAnimation:kfa forKey:nil]
}

```

これでこんな感じにアニメーションします

![](http://gyazo.com/2d3622b2d489a7c1c566c588b11934f5.gif)

ファンクショナルなアニメーションをしたいときはCAKeyFrameAnimationを使うといいと思います。
RSSリーダーにnewsbeuterを使ってみた

Feedlyを1時間使ってみたが、cliがいいと思った。
キャッシュすればオフラインでも閲覧できます。
(がしかしスマホから操作ができるのでFeedlyに戻った。)

FeedlyからOPMLをエクスポート
----------------

* Organize -> Save as OPML

newsbeuterのインストール
---------------

```bash:
$ brew install newsbeuter
```

```bash:opmlをインポート
$ newsbeuter -i ~/Downloads/feedly.opml.xml
```

```bash:保存したい記事がある場合の保存先を用意
$ mkdir ~/Documents/rss/
```

```bash:~/.profile
$ alias news='(cd ~/Documents/rss && newsbeuter)'
```

設定
-------

```bash:~/.newsbeuter/config
#browser open -a Google\ Chrome %u
#browser w3m %u
browser open -a Safari %u

save-path ~/Downloads/rss/

confirm-exit yes

refresh-on-startup yes
auto-reload yes

#bind-key k up
#bind-key j down
bind-key k prev
bind-key j next

##
articlelist-format "%4i %f %D  %?T?|%-17T| ?%t"
highlight feedlist    "^  *[0-9]+  *N  "                    color156 default
highlight articlelist "^  *[0-9]+  *N  "                    color156 default
highlight article     "^Title:.*"                           color156  default
highlight article     "(^Feed:.*|^Author:.*)"               color75  default
highlight article     "(^Link:.*|^Date:.*)"                 color75  default
highlight article     "^Links:"                             white    color240
highlight article     "\\[[0-9][0-9]*\\]"                   color72  default  bold
highlight article     "\\[image [0-9][0-9]*\\]"             color72  default  bold
color listnormal                                            white    default
color listfocus                                             default  color240
color info                                                  default  color240
```

その他
-------

* Save は `ctrl-g`でキャンセルできます。
[Angular]Twitterのtweet/followボタンがリンクになってしまう

Bootstrapのmodalを使った時にハマりました

http://stackoverflow.com/questions/16599105/twitter-follow-button-appears-as-link-in-angular-templates

modal内にTwitterのshareボタンを置いたが、2度他のモーダルを開くと2回目以降ただのリンクになってしまった

ボタンを生成するjsを見ると、id=twitter-wjsが無ければ、platform.twitter.com/widgets.jsを読み込む
scriptタグを生成してそれをtwitter-wjsとidを付けて、非同期で読み込む作りになっている

複数回このjsが叩かれる実装になっていると、2度目以降はtwitter-wjsが存在するのでplatform.twitter.com/widgets.jsが読み込まれないようだ
artisanコマンドを引数つきで作ってみる

日本語の記事がなかったのでたいしたことないけどメモってみる

参考記事
http://blog.e2info.com/2013/08/09/laravel_artisan/

とりあえずコマンド作成

```
php artisan command:make HelloCommand
```

上記コマンドで
app/commands/以下にHelloCommand.phpが作成される。

引数を渡すときはHelloCommand.phpのなかのgetArguments関数をいじる。

```php
protected function getArguments()
{
    return array(
          array('example', InputArgument::REQUIRED, 'An example argument.'),
      );
}
```

return するarrayの中に入れるarrayがひとつの引数の情報っぽい。
左から

* 引数の名前
* 必須かどうか
* 引数の説明

となる。

複数引数を持たせたいときは

```php
return array(
          array('example', InputArgument::REQUIRED, 'An example argument.'),
          array('example2', InputArgument::REQUIRED, 'An example2 argument.'),
      );
```

という感じで追加していく。

上記を実行するコマンドは

```
php artisan command:hello argument1 argument2
```

こんな感じ。

終わり。
iOSアプリの申請時にBundleエラーでアップロードできない問題を解決



![スクリーンショット 2014-03-09 15.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/21397/895437d3-9e40-82ef-126e-02a748b4477e.png "スクリーンショット 2014-03-09 15.48.02.png")


> Apple's web service operation was not successful
> Unable to authenticate the package: XXXXXXXXXX.itmsp
> ERROR ITMS-9000: "This bundle is invalid. Apps that include an armv7s architecture are required to include armv7 architecture." at SoftwareAssets/SoftwareAsset (MZItmspSoftwareAssetPackage)
> Could not start delivery: all transports failed diagnostics

もうなにこれ！！！
しかも、他のパソコンでArchiveするとサブミットに成功したりするので、原因が良くわかりません。

## Stackoverflowに解決策がありました
> Oh I got it, what you only need to do is to disconnect your device (remove the cable connection between your device and system).

> Now archive it and validate. You are good to go I believe. :)
> 
> [ios7 - IOS Application loader shows bundle error - Stack Overflow](http://stackoverflow.com/questions/19211654/ios-application-loader-shows-bundle-error)

#### iPhoneをパソコンから抜いて、それからArchiveしてください。その後サブミットすると成功します。

## もっと根本的な解決
そもそもの問題はArchiveビルド時にarmv7アーキテクチャが含まれていないことでした。
そこで設定を見てみると…。

![スクリーンショット 2014-03-09 16.12.20.png](https://qiita-image-store.s3.amazonaws.com/0/21397/cda5621d-53b4-372f-3926-2319ec823a2f.png "スクリーンショット 2014-03-09 16.12.20.png")

* プロジェクトをクリック→TARGETS→Build Settings→Build Active Architecture Only

が **YES** になっていました。
DevelopビルドとReleaseビルドでターゲットを分けている開発者の方も多いと思いますが、Developビルドだけでなく、ReleaseビルドでもBuild Active Architecture OnlyがYESになってました。
このプロパティにYESをセットすると、今アクティブ（つないでいるiPhone）のアーキテクチャしかビルドされないため（複数のアーキテクチャにビルドすると指定していても）、ビルドが高速になり、デバッグ時は非常に助かります。
しかしながら、今回はRelease向けの設定でもこのプロパティがYESになっていたため、armv7向けのビルドがされず、エラーとなってしまいました。
64bit向けにもビルドしよう！ということで、arm64を含めていても、デバッグ機が32bitの場合で、下記のプロパティがYESになっている場合は64bit向けにはビルドされないので注意してください。


## まとめ
設定はちゃんとしよう。
GitHubで複数アカウントを利用する（SSH Keys設定）

# ケース
プライベート用、仕事用でGitHubのアカウントを分けているが、
同じPC（接続元）からどちらのアカウントも利用したい。

※この場合、1台のPCで公開鍵を作成してGitHubの「SSH Keys」で設定するケースが多いが、同じ公開鍵を複数アカウントでは使うことはできない。

# 解決方法
接続元に複数のキーペアを作成し、.ssh/configで管理。
GitHub接続時に利用する鍵を指定する。

# 手順

## 公開鍵の生成、設定
接続元で必要な分のキーペアを作成し、GitHubのそれぞれのアカウントへ登録しておく。
※このとき、キーの名前を変えて生成する。
例）id_rsa.foo、id_rsa.bar
　→id_rsa.foo/id_rsa.foo.pub、id_rsa.bar/id_rsa.bar.pubというようにキーペアが作成される。

手順はGitHubのリファレンスの通り。
[Generating SSH Keys · GitHub Help](https://help.github.com/articles/generating-ssh-keys "Generating SSH Keys · GitHub Help")


## .ssh/configの作成、設定
ファイルが存在しない場合は、作成して下記の通りように設定する。
※パーミッション：600

.ssh/config

```
Host github-foo
 HostName github.com
 User git
 IdentityFile /pathToKey/id_rsa.foo

Host github-bar
 HostName github.com
 User git
 IdentityFile /pathToKey/id_rsa.bar

```

以上で完了。

# GitHub接続時

下記のように指定して接続する。

```
git clone git@github-foo:userName/repositoryName.git
git clone git@github-bar:userName/repositoryName.git
```
deviseで作成したUsersテーブル

memoです
こんなんができた

| name | type | description |
|:-----------|:------------|:------------|
| id       |        INTEGER |     PRIMARY KEY AUTOINCREMENT NOT NULL     |
| email     |      varchar(255) |    DEFAULT '' NOT NULL    |
| encrypted_password       | varchar(255) |    DEFAULT '' NOT NULL    |
| reset_password_token         |  varchar(255) ||
| remember_created_at    |     datetime ||
| sign_in_count    |     integer |DEFAULT 0 NOT NULL|
| current_sign_in_at    |     datetime |      |
| last_sign_in_at    |     datetime |     |
| current_sign_in_ip    |     varchar(255) |      |
| last_sign_in_ip    |     varchar(255) |      |
| created_at    |     datetime |      |
| updated_at    |     datetime |      |


蛇足:管理者ユーザーについて
webアプリケーションをつくるにあたって、ユーザーには管理者や管理代行者のような権限のつよいユーザーも作ると思う。devise のtipsにもそのようなケースへの対応方法があるようで、ネット上のリソースを見る限り、
is_adminのようなカラムを追加し、判断している例が多い。それだと目先の実装は楽だが、管理者ユーザーと一般ユーザーが同じモデルというのも気持ち悪い。一般ユーザーだけで持てば良い属性もあるだろうし、管理者だけが行える振る舞いなんかも出てきそうな感じがする。モデルが同じだと、あとあと権限制御まわりで色々と苦しくなりそう。（てかdeviseが作るデフォのUserは一般ユーザーを意識した内容だと思う。）多少面倒でも、最初にモデルを分けておくのが得策な気がする。AdminクラスをUserクラスと別に作るか、デフォのUserクラスを弄って、サブクラスとしてAdminクラスとNormalUserクラスを作るのがよいのかなーとか思った。


なおrails_adminのような管理画面を自動作成するgemでは、Userと並列なAdminクラスをつくるようだ。管理画面（とその機能）に求めるものを考慮して決めるのもよさげ
Androidのantビルド時に知っておくと便利なantタスク

Androidの開発においては大抵eclipseを使用してビルドをしていると思われますが、ときおりantを使用してビルドをする場面があります。

そんな時には`android update project`してから`ant debug`をするのが王道の手順ですが、`ant debug`以外にも便利なantタスクがAndroid SDKには用意されています。

**installタスク**

プロジェクトをビルドした後に、そのapkファイルを端末にインストールしてくれます。
ビルド後に`adb install Activity.apk`をしている人も多いと思いますが、installタスクを利用したほうがコマンドも減って楽です。

```
ant debug install     #debugビルド後インストール
ant release install   #releaseビルド後インストール
```

**installd, installrタスク**

ビルドせずにAPKの端末インストールのみを行います。

```
ant installd   #debugビルドしたapkをインストール
ant installr   #releaseビルドしたapkをインストール
```

**uninstallタスク**

端末にインストールしたアプリをアンインストールします。
こちらも`adb uninstall`でもできますが、パッケージ名を指定しなくても良いぶん楽です。

```
ant unsintall
```

**応用**

antタスクを並べれば順次実行されるので、色々な組み合わせが可能です。
よくやるのは、

プロジェクトをクリーンしてdebugビルド後、端末からアプリをアンインストールしてからインストール

```
ant clean debug uninstall install
```

こんなかんじです。


`ant help`すると使用可能なantタスクの一覧が見られます。
Packerを使ってCentOS6の公式AMIから、カスタマイズしたAMIを作成する


## 概要
[Packer](http://www.packer.io/)を使用すると、Amazon EC2や[Vagrant](http://www.vagrantup.com/)、[Docker](https://www.docker.io/)等で使用できるイメージをJSONで記述可能なコンフィグレーションから作成することができて便利です。

今回は、Packerを用いて、[CentOSが提供している公式AMI](https://aws.amazon.com/marketplace/pp/B00A6KUVBW/)からカスタマイズしたAMIを手軽に作成する方法を紹介します。

## Packerの導入

まず、Packerを導入します。Homebrewであれば、下記で導入可能です。その他の場合は[こちら](http://www.packer.io/intro/getting-started/setup.html)で説明されています。

```
$ brew tap homebrew/binary
$ brew install packer
```

## コンフィグレーションの作成

下記は、東京リージョン（`ap-northeast-1`）にて、CentOS公式AMI（`ami-31e86030`）を用いて、カスタマイズした独自AMIを作成する設定です。

Packerの[Shell Provisioner](http://www.packer.io/docs/provisioners/shell.html)を用いて、下記を行っています。

* YUMパッケージの更新
* [EPEL](https://fedoraproject.org/wiki/EPEL)の導入
* タイムゾーンをJSTに変更

```json:aws-centos6-tokyo.json
{
  "builders": [
    {
      "type": "amazon-ebs",
      "access_key": "XXXXXXXXXXXXXXXXXXXX",
      "secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "region": "ap-northeast-1",
      "source_ami": "ami-31e86030",
      "instance_type": "t1.micro",
      "ssh_username": "root",
      "ssh_timeout": "5m",
      "ami_name": "CentOS6_x64_ebs_{{isotime | clean_ami_name}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "yum -y update",
        "rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm",
        "ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime",
        "rm -f /root/.ssh/authorized_keys"
      ]
    }
  ]
}
```

また、CentOSのAMIイメージでは、記事執筆現在では、EC2でインスタンス作成時に指定するKey pairを、起動の際にrootユーザの`authorized_keys`にコピーすることで、指定したKey pairを使ってrootユーザでログインすることを可能にしています。

この処理は、既に`authorized_keys`ファイルがあると行われないため、`rm -f /root/.ssh/authorized_keys`として、削除しておく必要があります。

## AMIの名称の設定

`ami_name`には、テンプレート文字列を指定することができます。`{{timestamp}}`と記述するとUNIX timestamp、`{{isotime | clean_ami_name}}`のように記述すると、RFC-3339フォーマットの日付(例: 2014-03-08T16-29-43Z)の文字列を挿入することが可能です。また、`isotime`の場合、AMIの名称には指定できない文字列が含まれているため、`clean_ami_name`を指定する必要があります。

上記では、`CentOS6_x64_ebs_{{isotime | clean_ami_name}}`と指定しています。

* 参考: [Configuration Templates - Packer](http://www.packer.io/docs/templates/configuration-templates.html)

## AMIの作成

それでは、PackerでAMIを作成してみます。下記コマンドでAMIが自動的に生成されます。

```
% packer build aws-centos6-tokyo.json
amazon-ebs output will be in this color.

==> amazon-ebs: Creating temporary keypair: packer…
==> amazon-ebs: Creating temporary security group for this instance...
==> amazon-ebs: Authorizing SSH access on the temporary security group...
==> amazon-ebs: Launching a source AWS instance...
    amazon-ebs: Instance ID: i-XXXXXXXX
==> amazon-ebs: Waiting for instance (i-XXXXXXXX) to become ready...
==> amazon-ebs: Waiting for SSH to become available...
==> amazon-ebs: Connected to SSH!
==> amazon-ebs: Provisioning with shell script: …
…
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:

ap-northeast-1: ami-XXXXXXXX
```
twitterのaccess tokenを取得する

twitter APIを使って開発中にOAuthトークンを取得するのが面倒というかよくわからなかったのでメモ。

# 必要なもの
https://github.com/jugyo/get-twitter-oauth-token

# インストールする

```bash:
$ gem install get-twitter-oauth-token
```

# 使う

コマンドラインからget-twitter-oauth-token起動
対話形式でConsumer Key, Consumer Secretが聞かれるのでtwitterアプリのAPI Key, API Secretを入力。
入力すると、ブラウザが起動されて見慣れたtwitterの連携許可画面がでてくる。ここで許可した時に表示されるPINを"PIN:"に続いて入力する。
PIN入力されると、OAuthのToken, Secretが表示される。

```

Consumer Key: *input API Key*
Consumer Secret: *input API Secret*
PIN: *input PIN*
Token: *display OAuth token here*
Secret: *display OAuth secret here*
```
iOSで辞書をUIの一部として表示する方法

iOSで辞書を表示するにはUIReferenceLibraryViewControllerを使います。これがUIViewControllerのサブクラスであることからモーダルでしか使用できないと思い込んでいました。つまり、以下のようにしか使えないと思っていました。

```objc:Objective-C
UIReferenceLibraryViewController *controller
    = [[UIReferenceLibraryViewController alloc] initWithTerm:@"word"];
[self presentViewController:controller animated:YES completion:nil];
```
しかし、アップルのマニュアルに以下の記述がありました。
You can present this view controller modally or as part of another interface.
というわけで、以下のように既存のUIの一部として使えました。

```objc:Objective-C
[self.view addSubview:controller.view];
```
ただし、ナビゲーションバーにあるDoneボタンはそのままでは効きません。UIReferenceLibraryViewControllerのサブクラスを作ってdismissViewControllerAnimated:completion:メソッドをオーバーライドしましょう。Doneボタンが押されるとこのメソッドが呼ばれます。

```objc:Objective-C
@interface MyReferenceLibraryViewController : UIReferenceLibraryViewController
@end

@implementation MyReferenceLibraryViewController
-(void) dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    [super dismissViewControllerAnimated:flag completion:completion];
    [self.view removeFromSuperview];
}
@end
```
FTPS、SFTPの違いって? 

## FTPS、SFTPの違いって?

- **FTPS** : FTPの通信をSSL/TLSで暗号化 → FTPの拡張
- **SFTP** : SSHの通信を使って、FTPを行う → SSHで動作するアプリケーション

## FTPについておさらい

ファイルを転送するための通信プロトコル
FileTransferProtocol

コマンドの送受信と、ファイルの送受信で使用するポートが異なる

- 20 : FTPデータ転送ポート
- 21 : FTP制御ポート

### セキュリティの問題

- ユーザ名やパスワードが暗号化されていない
- 通信内容も暗号化されていない
- 他にも色々セキュリティ的な不具合が多い

なので、通信を暗号化するために出来たのが、FTPSと、SFTP

## FTPS

FTPで送受信するデータをSSLまたはTLSで暗号化するプロトコル
File Transfer Protocol over SSL/TLS

SSL/TSLセッションで通信を行う
HTTPSのFTP版とでも言うべき?

### RFC

- RFC 2228 - FTP Security Extensions
- RFC 4217 - Securing FTP with TLS

### 使用ポート

- 989 : FTPデータ転送ポート
- 990 : FTP制御ポート

## SFTP

SSHを介してファイル転送を行うプロトコル
SSH File Transfer Protocol

SSHログインをした後に、FTP風のコマンドでファイルの受け渡しを行う
なので内部的には、最初にSSHで接続を行っている

SSH で接続するので、別途 FTP サーバを建てる必要はなく
OpenSSH ならば、sshd_config に設定を追加するだけで、SFTPサーバとすることができる

### RFCは無いの?

SFTPと違ってプロトコルではなく、SSH上で動くアプリケーションにすぎないので、無いらしい
[RFC for Sftp?](http://www.linuxquestions.org/questions/linux-security-4/rfc-for-sftp-532514/)

### 使用ポート

22(SSH と同じ)

## 参考

SSL/TSL、SSH については、以下を参照
→ [公開鍵暗号について理解が足りていなかったのでメモ - かせいさんとこ](http://d.hatena.ne.jp/kasei_san/20120329/p1)

- [TCPやUDPにおけるポート番号の一覧 - Wikipedia](http://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7)
- [File Transfer Protocol - Wikipedia](http://ja.wikipedia.org/wiki/File_Transfer_Protocol)
- [FTP/SFTP/FTPSの違い | BlueHackers](http://bluehackers.com/?p=651)
スワイプで MasterView を表示させない (iPad, SplitViewController)


DetailView に ScrollView や スワイプジェスチャーなどを設定すると
MasterView が表示されたりしてうまく動作しない。
SplitViewController (Master-Detail Application) のスワイプで
MasterView を開かないようにするには以下のプロパティーを設定する。

``` objectivec
splitViewController.presentsWithGesture = NO;
```