OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-CでCSVをパースする


[NTYCSVTable](https://github.com/naoty/NTYCSVTable)というライブラリを使うと簡単にパースできる。名前の通りCSVをテーブル構造のオブジェクトにパースしてくれるので直感的に扱いやすい。Rubyの`CSV::Table`クラスを参考に開発されている。

## インストール

CocoaPodsに公開されているのでPodfileにこのように書いて`pod install`すればインストールできる。

```ruby:Podfile
pod "NTYCSVTable"
```

## 使い方

このようなCSVのパースを想定する。

```csv:users.csv
id,name,age
1,Alice,18
2,Bob,19
3,Charlie,20
```

これをパースするにはこうすればいい。

```objective-c
NSURL *csvURL = [NSURL URLWithString:@"users.csv"];
NTYCSVTable *table = [[NTYCSVTable alloc] initWithContentsOfURL:csvURL];

// Rows
NSArray *rows = table.rows;
NSArray *headers = table.headers;    //=> @[@"id", @"name", @"age"]
NSDictionary *alice = table.rows[0]; //=> @{@"id": @1, @"name": @"Alice", @"age": @18}
NSDictionary *bob = table.rows[1];   //=> @{@"id": @2, @"name": @"Bob", @"age": @19}

// Columns
NSDictionary *columns = table.columns;
NSArray *names = table.columns[@"name"]; //=> @[@"Alice", @"Bob", @"Charlie"]
NSArray *ages = table.columns[@"age"];   //=> @[@18, @19, @20]
```

また、あるヘッダーに特定の値を持つ列を検索するためにこのようなメソッドも用意されている。

```objective-c
[table rowsOfValue:@1 forHeader:@"id"];  //=> @[@{@"id": @1, @"name": @"Alice", @"age": @18}]
[table rowsOfValue:@20 forHeader:@"age"] //=> @[@{@"id": @3, @"name": @"Charlie", @"age": @20}]
```

---

以上、ステマでした。
ubuntu で RMagick を bundle install しようとしたらエラーがでた！

今更だけど、rubyでRMagickを使いたくて
rubygemsからインストールしようとしました。

ubuntu 12.04
ruby2.1.0

するとこんなエラーが・・・

```
ERROR:  Error installing rmagick:
    ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for gcc... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

Can't install RMagick 2.13.2. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/home/16bit_idol/.rvm/rubies/ruby-2.1.0/bin/ruby
```


` MagickWand.h.`　がないらしい（・３・）

`locate wand/MagickWand.h`　したら確かに無かった。
ImageMagickはインストール済みって確認したんだけどねぇ

なので、下記をインストール。

```
sudo apt-get install libmagickwand-dev
```

この後、問題なく RMagick が `bundle install` できましたとさ、おしまい。
crontabでRVMを使う書き方

### やりたかったこと

* EC2インスタンス上でRVMを使いたかった(デフォルトでruby2系がはいっているので)
 * RVMはruby-1.9.3-p545をいれている
* 以下のようなhoge.shをcrontabで実行しようとしたらbashコマンドを使ってねと言われたのでその書き方を記録

```:hoge.sh
rvm use ruby-1.9.3-p545
ruby hoge.rb
```

### こう書けばできた

* 以下のようにすればhoge.shをcrontabで実行できる(RVMで入れている指定したバージョンが使える)

```:hoge.sh
bash -l -c "/home/ec2-user/.rvm/bin/rvm ruby-1.9.3-p545 exec ruby hoge.rb"
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
svnのdiffをvimで見る

複数差分があったらいっぱい開くので便利
ちなみに私はMacvimの方を使う。
もともと入っている方を使う場合は、そっちのvimdiffのパスを書けばいける。

```bash:どこかに.shを置く（~/bin/svnvimdiff.shとか？）
#!/bin/sh
DIFF="/Applications/MacVim.app/Contents/MacOS/vimdiff"
$DIFF $6 $7                                                                
```

~/.subversion/config　の中に[helpers] というところがあるので、その下に追記

```bash:~/.subversion/config
[helpers]
#diff-cmd = どこかに.shを置く（~/bin/svnvimdiff.shとか？）のパス
diff-cmd = ~/bin/svnvimdiff.sh
```


gitのvimdiffは他の方が書いてたのであとでやろう。
http://qiita.com/datsuns/items/da4d9b48c452c54791c0

タイトルは真似した。後悔はしていない。
Git リポジトリの特定のリビジョンを別のディレクトリにコピーする

Capistrano 3 の挙動を追っていたら見つけた。

https://github.com/capistrano/capistrano/blob/master/lib/capistrano/git.rb#L32-L34

```bash
$ git archive foo-branch | tar -x -f - -C /path/to/target
```

* http://linux.die.net/man/1/git-archive
* http://linuxjm.sourceforge.jp/html/GNU_tar/man1/tar.1.html
rails link_toで任意のリクエストパラメータを渡す

他により良い方法があるかも知れないけど、次のようにすると渡せる.

tests_controllerのindexにrequestパラメータcompany_id(この場合は3)を付与する例

```rb
<%= link_to 'test', controller: "tests", action: "index", company_id: 3>
```

もっとシンプルに渡せる方法があれば教えて頂きたいです。。。

----
2014/4/30追記
```erb
<%# # test.id=1 %>
<%= link_to 'test', test_path(test, company_id: 3) %>
```

上記のように記述すると、
http://~~~~/tests/1?company_id=3
が出来上がる。
VirtualBox + CentOS にはまった


バイト先でrpm環境が必要になったので、windows上ホストのvirtualboxにCentOSをいれて試験。
ネットワークが動かない。firewallの問題か、あるいはipが割り当てられてない、DNSが見つけられない、etc.
DHGPが動いていないからDNSをみつけられないのだとわかって、google public DNSを '/etc/resolv.conf'にぶち込んだらつながった。
これでようやくyumでいろいろとインストールが可能になる。
標準でemacs入っていないのでつらみがやばぃ。いちぉうviれんしゅうした。
でもこれってじつはコンプライアンスかぃひしてる・・・。
ありえない。
こてぃIPわりあててもらぉ。
rubyのaws-sdkでEC2のイベント情報を取得する

EC2のイベントを1日1回監視してIRCに通知するようにしている(管理者ではないのでメールが飛んでこない)。
そのスクリプトのイベント取得部分を記録する。

## イベント情報取得スクリプト

* Gemfile
 * aws-sdk (1.38.0) で 動作確認 

```rb
source "https://rubygems.org"

gem "aws-sdk"
```

* 全てのリージョンのイベントを表示するスクリプト

```rb
# -*- encoding: utf-8 -*-
require 'aws-sdk'

ec2 = AWS::EC2.new(proxy_uri: ENV['HTTP_PROXY'] || ENV['http_proxy'])
# 各リージョンのEC2全て取得対象
ec2.regions.each do |region|
  reg = ec2.regions[region.name]
  reg.instances.each do |instance|
    # イベント取得
    status = reg.client.describe_instance_status({"instance_ids" => [ instance.id ]})
    events = status.data[:instance_status_set][0][:events_set] rescue nil
    events = [] unless events
    next if events.empty?

    events.each do |event|
      next if event[:description] =~ /^\[Completed\]/ # 完了したイベントはスキップ
      puts "EC2[#{instance.tags["Name"] || instance.dns_name}](#{region.name})のイベント #{event}"
   end
  end
end
```

## 出力サンプル

```bash
EC2[test](us-east-1)のイベント {:code=>"instance-stop", :description=>"The instance is running on degraded hardware", :not_before=>2014-05-02 00:00:00 UTC}
```
* Completedのイベントサンプル

```bash
{:code=>"instance-stop", :description=>"[Completed] The instance is running on degraded hardware", :not_before=>2013-09-05 00:00:00 UTC}
```
facebook graph APIを使った友人リストのPublishing

graph apiの説明では
https://developers.facebook.com/docs/graph-api/reference/user/friendlists/

Publishing時のアクセス権に
manage_friendlists
が必要とだけ書いてるが、
(user_friendsも当然必要)

read_friendlists
も必要なので注意

javascriptを使った場合
```js:main.js
/* make the API call */
FB.api(
    "/me/friendlists",
    "POST",
    {
        "object": {
            "name": "Test Friendlist"
        }
    },
    function (response) {
      if (response && !response.error) {
        /* handle the result */
      }
    }
);
```


と書いているが、
```js:main.js
/* make the API call */
FB.api(
    "/me/friendlists",
    "POST",
    {
       "name": "Test Friendlist"
    },
    function (response) {
      if (response && !response.error) {
        /* handle the result */
      }
    }
);
```

でないと動かなかった。
UITextField 以外をタップしたときにキーボードを閉じるお手軽な方法

UITextFieldをタップしたときはキーボードを表示 or フォーカスを当てて、それ以外のViewをタップしたときはキーボードを閉じたい、という要件、よくあると思います。

[andreamazz/UITextField-Shake](https://github.com/andreamazz/UITextField-Shake) のサンプルの実装が参考になりました。

```objective-c
// UIViewController

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
		if ([obj isKindOfClass:[UITextField class]]) {
			[obj resignFirstResponder];
		}
	}];
}
```
【iOS】UIButtonでカラーボタンを作成する

## カスタムクラスを定義
カスタムクラスの作成時`Subclass of`をUIButtonに変更し作成を行う。
ここでは作成するカスタムクラスを`ColorBkgButton`とする。

```objc:ColorBkgButton.m
#import "ColorBkgButton.h"

@implementation ColorBkgButton

//デフォルトで出来るファイル
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

//背景とタイトルの編集が出来るようにする
- (id)initWithFrame:(CGRect)frame label:(NSString *)title bkgcolor:(UIColor *)rgba
{
    self = [super initWithFrame:frame];
    if(self){
        //背景色
        self.backgroundColor = rgba;
        //輪郭線を描く
        [self.layer setCornerRadius:10.0];
        [self.layer setBorderColor:[UIColor lightGrayColor].CGColor];
        [self.layer setBorderWidth:1.0];
        //タイトルの設定
        self.titleLabel.font = [UIFont boldSystemFontOfSize:18];
        [self setTitle:title forState:UIControlStateNormal];
        
        //通常時のボタンの色
        [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        //押下時のボタンの色
        [self setTitleColor:[UIColor darkGrayColor] forState:UIControlStateHighlighted];
        //タイトルシャドウの設定
        [self setTitleShadowColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
        self.titleLabel.shadowOffset = CGSizeMake(1, 1);
    }
    return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end
```

## RGBAを定義する関数を作成
`define`で宣言

```objc:ViewController.m
//RGBカラーを作る関数を定義
#define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]
```

## あとはひたすらボタンを作成

```objc:ViewController.m

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    // CGRectMake(X座標, Y座標, 横幅, 高さ)
    ColorBkgButton *button1 = [[ColorBkgButton alloc] initWithFrame:CGRectMake(50, 50, 120, 120) label:@"Hello World!" bkgcolor:RGBA(200, 200, 50, 1.0)];

    // ボタンをビューに追加
    [self.view addSubview:button1];

}
```
SNSボタンでオリジナルの画像を使いたいとき


##オリジナルの画像を使いたいとき

snsのボタンをデザイン上どうしても画像を用意して設置しなければならないことがありました。
その時の対応をまとめました。


■twitter
```<a href="http://twitter.com/share?url=[共有したいURL]&text=[ツイート内テキスト]&via=[ツイート内に含むユーザー名]&related=[ツイート後に表示されるユーザー]&hashtags=[ツイート内に含まれるハッシュタグ]"
<img src="[画像パス]" /></a>
```

■facebook　(シェアする)
```<a href="http://www.facebook.com/sharer.php?u=[シェアしたいURL]" target="_blank"><img src="[画像パス]" /></a>
```


■Lineで送る
```<a href="line://msg/text/[送りたいテキスト(UTF-8エンコード)]"><img src="[画像パス]" /></a>```


※Lineでは使用できる画像がガイドラインに基づいているので、気をつけてください。




参照サイト
https://developers.facebook.com/docs/plugins/share-button/
http://ideahacker.net/2014/02/15/7599/
http://media.line.me/howto/ja/
NSStringで複数の正規表現マッチを置換する

## もっと良い方法がありました！

**普通に標準SDKに含まれているメソッドで出来るようです。詳しくはコメント欄をご覧ください**

正規表現(NSRegularExpression)や、NSDataDetectorによるマッチでは、NSTextCheckingResultのNSArrayが取得できます。

```
    NSString *pattern = @"[a-z0-9]{1,10}";
    NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                           options:0
                                                                             error:&error];

NSArray * matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
```

こいつを普通にループして処理するのはバグを生むので、逆順に走査しましょうお話。

置換するなら

```
[matches enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSTextCheckingResult* match, NSUInteger idx, BOOL *stop) {
        [workString replaceCharactersInRange:match.range withString:string];
    }];
```

削除するなら

```
    [matches enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSTextCheckingResult* match, NSUInteger idx, BOOL *stop) {
        [workString deleteCharactersInRange:match.range];
    }];
```

## なぜ普通にループするとバグるのか

削除のケースに関して言うと

```
NSString *string = @"abc|efg";
```

のとき、上記にある英数字にのみマッチする正規表現を使って削除しようとすると。

まず、各NSTextCheckingResultが持つrangeは以下の様になります。

- (0,3)
- (4,3)

一回目のループでは`abc|`になりますね。
二回目のループでは、この中で `(4,3)`を置換しようとするので、Exceptionが発生してしまうわけです。
これは、後ろから走査すれば発生しない問題です。

勿論、毎回rangeのlengthの総和を取って、開始地点から引き算することでも実現出来ますが、処理が重いだけでメリットはないでしょう。

簡単ですが、以上です。
DataSourceにzeroDateTimeBehaviorプロパティを渡す

java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.timestamp
なエラーがでた場合にデータの代わりに NULL を戻してExceptionを回避する

JDBCのURLで

```sql
jdbc:mysql://localhost:3306/mydb?user=mydb&password=mydb&zeroDateTimeBehavior=convertToNull
```

と渡せるが、この情報をDataSourceで管理するときは
dataSource.setConnectionPropertiesの引数で渡す
引数はStringで、「propatyName=value;」のフォーマットで渡す。

```java
BasicDataSource dataSource = new BasicDataSource();
dataSource.setConnectionProperties("zeroDateTimeBehavior=convertToNull;");
```
Railsでスコープやactive_recordの配列をエクセル出力しちゃうgem

# やりたかったこと

スコープ（ActiveRecord::Relation）やActiveRecordインスタンスの配列を、Excel（スプレッドシート）に出力するっていう処理は、管理画面まわりではちょいちょい必要になりますよね。それを簡単に済ませたいと思ってgemを作ってみました。

# Spreadsheetable 使い方

[github](https://github.com/dongoon/spreadsheetable)のREADMEに書いたあっさり説明で分かると思うのですが、こんな感じで使います。

```rb:Gemfile
gem 'spreadsheetable'
```

```irb
> bundle
```

```rb
# スコープかactive_recordの配列に使えます
scope = AModel.all
# 1. 拡張して
scope.extend Spreadsheetable
# 2. Excelに出力したいプロパティを指定して
scope.sheet_columns = %w(id name other parent_model.name)
# 3. xlsかto_spreadsheetでTempfileに保存されます。あらヤダ簡単
xls_file = scope.xls
```
* 出力列はparent_model.name のような指定もできますが、改善の余地あり（後述）
* ヘッダ行はI18n対応しています

検索条件に応じたExcelファイルを出力するアクションも、こんな感じでOKです。（諸々目を瞑れば）

```hoges_controller.rb
# 極簡単に済ませれば
def easy_xls
  result = Model.where(params).extend(Spreadsheetable)
  result.sheet_columns = %w(id name other)
  send_download_file result.xls, "easy.xls"
end

# 現実的にはこんな感じかな
def search
  @result = Model.where(params.slice(:property_a, :property_b))
  respond_to do |format|
     format.html
     format.xls{
       @result.extend(Spreadsheetable)
       @result.sheet_columns = %w(id name other)
       send_download_file(@result.xls, "search_result.xls")
     }
  end
end
```

# TODO
依存している[Spreadsheet](https://github.com/zdavatz/spreadsheet)が0.9系なのを差し置いてV1.0.0をリリースしていますが、以下のように直したいところがあります。 _「こんなことも出来てないのか、しょうがねぇな。直してやるか」_ ってな方いましたら、是非[pull req](https://github.com/dongoon/spreadsheetable)お願いしますー。

* 大量データ時の考慮として、スコープの時はfind_each使う。
* 列指定（#sheet_columns)に合わせて、スコープの時はselectしてあげる。
* 列指定（#sheet_columns)で parent_model.name のようにすると ParentModel があれば解決できるけど、classifyしているだけなのでfirstやクラス名と紐づかない名前だとダメ。これを直す。
* decoratorと連携したテストを書いてダメなら直す。
fail2banでブルートフォースアタックを防ぐ

fail2banはログを監視し、マッチしたらiptablesでDROPする仕組み。
マッチの正規表現は自分で書く。

# 前準備

```bash:インストール(deb系)
$ sudo apt-get install -y fail2ban
```

```bash:インストール(CentOS5)
$ wget -q http://dl.fedoraproject.org/pub/epel/5/x86_64/fail2ban-0.8.10-4.el5.noarch.rpm
$ wget -q http://dl.fedoraproject.org/pub/epel/5/x86_64/python-inotify-0.9.1-1.el5.noarch.rpm
$ wget -q http://dl.fedoraproject.org/pub/epel/5/x86_64/python-ctypes-1.0.2-2.el5.x86_64.rpm
$ sudo rpm -ivh [fp]*rpm
```

```bash:監視したいログを確認。
$ grep "LOGIN FAILED" /var/log/mail.log
Apr 23 18:24:13 localhost courierpop3login: LOGIN FAILED, user=test1, ip=[::ffff:22.33.44.55]
```

# 設定記述

ignoreipの追記を忘れずに。

```diff:/etc/fail2ban/jail.conf
-ignoreip = 127.0.0.1
+ignoreip = 127.0.0.1 10.0.0.0/8 192.168.0.0/16 11.22.33.44/28

+[courierpop3login]
+enabled  = true
+port	 = pop3
+filter   = courierpop3login
+logpath  = /var/log/mail.log
```

```bash:/etc/fail2ban/filter.d/courierpop3login.conf
[Definition]
failregex = LOGIN FAILED, user=.*, ip=\[<HOST>\]$
ignoreregex =
```

## リスタート

```bash:
$ sudo /etc/init.d/fail2ban restart
Restarting authentication failure monitor: fail2ban.
```

# 動作確認

リモートからpop3で存在しないアカウントでのログインを試す。

```bash:/var/log/mail.log
Apr 24 07:41:09 localhost courierpop3login: LOGIN FAILED, user=test1, ip=[::ffff:123.123.123.123]
Apr 24 07:41:16 localhost courierpop3login: LOGIN FAILED, user=test1, ip=[::ffff:123.123.123.123]
Apr 24 07:41:26 localhost courierpop3login: LOGIN FAILED, user=test1, ip=[::ffff:123.123.123.123]
```

4回目から/var/log/mail.logにログ出力されない。
これは3回の失敗時点でiptablesにDROP登録されるからです。

```diff:
 # iptables -L
 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination
 fail2ban-courierpop3login  tcp  --  anywhere             anywhere            tcp dpt:pop3
 
 Chain FORWARD (policy ACCEPT)
 target     prot opt source               destination
 
 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination
 
 Chain fail2ban-courierpop3login (1 references)
 target     prot opt source               destination
+DROP       0    --  123.123.123.123.sonet.ne.jp  anywhere
 RETURN     0    --  anywhere             anywhere
```

## ログ

* CentOSだと初期値はsyslog(messages)に出力される。

```bash:/var/log/fail2ban.log
2014-04-24 07:57:16,154 fail2ban.actions: WARNING [courierpop3login] Ban 123.123.123.123
2014-04-24 08:07:16,760 fail2ban.actions: WARNING [courierpop3login] Unban 123.123.123.123
```

fail2banをrestartしてもDROP状態は維持される。(初期化されない。)

デフォルトは3回失敗で10分間ドロップ
MacBookのネジが固くて外れないと思ったら簡単に外れた話

## MacBook Proのメモリを4GBから16GBに増設したときの話
公式には8GBまでとされていますが、16GBまで認識します。 **モデルによりますが**。

### 一本だけどうしても外れない
[MacBook Pro：メモリの取り外し方法と取り付け方法: Apple](http://support.apple.com/kb/HT1270?viewlocale=ja_JP)

上のリンクの通り、裏ぶたのネジを外して換装するだけなのですが、ネジが一本だけどうしても開きません。↓こいつ。
![IMG_0077.JPG](https://qiita-image-store.s3.amazonaws.com/0/40758/fb652a34-bf87-5872-0a8f-fb2cb062c2aa.jpeg)

かなり小さなネジなので精密ドライバーを使ったのですがピクリとも動かない上に、じゃっかんねじ山をなめてしまいました。
非力を嘆きながらどうしたものかとググると[仲間がたくさん。](https://www.google.co.jp/#newwindow=1&q=mac%20%E3%83%8D%E3%82%B8%20%E5%9B%BA%E3%81%84&safe=off)Appleさんどうにかしてください...。

その後も精密ドライバーとペンチを組み合わせたり、ゴムを巻いてみたりいろいろ試すも撃沈。
こちらが使った精密ドライバー。#0のプラスドライバーです。
![IMG_0230.JPG](https://qiita-image-store.s3.amazonaws.com/0/40758/6a53ed1e-a7e4-3446-2083-2b781c89a5b2.jpeg)


### からのご開帳（あっさり）
これ以上なめたらAppleに高い金を払う羽目になりそうだったので、[あきらめてネジすべり止め剤](http://www.amazon.co.jp/gp/product/B0016VCIP2)を買うことしたのですが、買う前にもう一度だけ...と、下の写真のドライバーで試したら、あっさりご開帳。
![IMG_0226.JPG](https://qiita-image-store.s3.amazonaws.com/0/40758/c1d58ad4-d8b5-445c-fc48-921b3d8c3e30.jpeg)


精密ドライバーは垂直方向の力が入らな過ぎたんですね。精密ドライバーでないといけないと思い込んでいたのが敗因です。思い込みって怖い。

![IMG_0224.JPG](https://qiita-image-store.s3.amazonaws.com/0/40758/6e8de240-5e35-6b85-f335-5b02bbf2b985.jpeg)


**[注意！！]**
**ねじ山に合ったドライバーを使うことが大前提です。**
**これを見て普通のドライバーで試したらねじ山なめちゃったじゃねーかとか言われても一切責任は負えませんので自己責任でお試しを。**

Σ(ﾟДﾟ)よくみたら「普通のドライバー」と思っていたドライバーのパッケージに「精密ドライバー入」と書いてあるじゃないか。
![IMG_0223.JPG](https://qiita-image-store.s3.amazonaws.com/0/40758/4df16e26-f370-e449-a025-5c1573c94123.jpeg)
bash で ファイルの絶対パスを得る

bash で ファイルの絶対パスを得る必要があり、調査してみた。

## 参考
See 

- http://sonicnotes.tumblr.com/post/50644984477
　　シェルスクリプトで相対パスを絶対パスに変換する

- http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
　　How can I get the behavior of GNU's readlink -f on a Mac?
	
- http://unix.stackexchange.com/questions/101080/realpath-command-not-found
　　realpath command not found

## 方法１

```` 1.sh
#!/bin/bash
abspath=$(cd $(dirname $1) && pwd)/$(basename $1)
echo ${abspath}
````

### 実行例

````
$ ./1.sh 1.sh
/Users/katoy/tools/1.sh

$ ./1.sh /usr/local/bin/ack
/usr/local/bin/ack

$ ./1.sh /tmp
//tmp
````

/tmp となって欲しいけど, //tmp になってしまうなぁ ...

## 方法2

```` 2.sh
#!/bin/bash
abspath=`greadlink -f $1`
echo ${abspath}
````

greadlink  は brew install coreutils でインストールできる。


### 実行例

````
$ ./2.sh 2.sh
/Users/katoy/tools/2.sh

$ ./2.sh /usr/local/bin/ack
/usr/local/Cellar/ack/2.12/bin/ack

$ ./2.sh /tmp
/private/tmp

````

//tmp となることはない。　
/tmp でなく、シンボリックリンク先が得られる。 まあそのほうが都合が良いかもしれない。

## 方法3

すこし行数が多くなるけど。

```` 3.sh
#!/bin/bash

# See http://unix.stackexchange.com/questions/101080/realpath-command-not-found
realpath ()
{
    f=$@;
    if [ -d "$f" ]; then
        base="";
        dir="$f";
    else
        base="/$(basename "$f")";
        dir=$(dirname "$f");
    fi;
    dir=$(cd "$dir" && /bin/pwd);
    echo "$dir$base"
}

echo $(realpath $1)
````

### 実行例

````
$ ./3.sh 3.sh
/Users/katoy/tools/3.sh

$ ./3.sh /usr/local/bin/ack
/usr/local/Cellar/ack/2.12/bin/ack

$ ./3.sh /tmp
/tmp
````

この方法では //tmp のようになることはない。

## 求む 他の実装
/tmp に対して /tmp が得られる簡単な実装は無いだろうか？ 
情報がえられれば、この投稿を編集して更新していきたいと思います。
$_FILESのあつかいに関して

__ドットインストール__ - PHPで作る「画像掲示板」から参照

## ファイルのエラー処理

    if ( $_FILES['ねーむ']['error'] != UPLOAD_ERR_OK ) 
    {
		echo 'エラーがはっせい！';
		exit;
	}

これ ↑ を使ってエラーをチェックできるよ！
エラーがなければエラーコードは０
2はファイルサイズがおおきすぎるとき？


***


## アップされたファイルの拡張子をswitchでばあいわけ

	$imagesize = getimagesize($_FILES['ねーむ']['tmp_name']); 

	switch($imagesize['mime']){
		case 'images/gif':
			$ext = '.gif';
			break;
		case 'imagse/jpeg':
			$ext = '.jpg';
			break;
		default:
			echo 'gif/jpeg only/!!';
			exit;

	}

getimagesize()はイメージにアクセスできない場合、FALSEをリターンするよ！
アクセスできるとファイルサイズを教えてくれるよ！

***

## ファイルをほぞん！

	$imageFileName = sha1( time().mt_rand() ). $ext;

	// 元画像を保存
	$imageFilePath = IMAGES_DIR. '/' . $imageFileName;
	
	$rs = move_uploaded_file( $_FILES['ねーむ']['tmp_name'], $imageFilePath );
	if ( !$rs ) {
		echo 'あっぷしっぱい！';
		exit;
	}

これでアップロードが成功したらIMAGES_DIR/のなかに入っているよ！
※ IMAGES_DIR は定数です

よし、きょうはおわり！
MariaDBのサイトにSQL99（SQLの規格）解説が載ってるので読むと良いよ

https://mariadb.com/kb/en/sql-99-complete-really/
sql99, complete,really というSQL99の解説書の全ページがMariaDBのサイトに掲載されている。
10年以上前の書物になるけど、RDBMSの枯れた知識を得たいときなんかは読んでみてもいんじゃないかと思いました！
一行野郎：ディレクトリ構造付きでコピー

###効果
ファイル名が特定パターンにマッチするやつを、ディレクトリ構造付きでコピーする。
ソースツリーから、まるっとヘッダだけ抜き出したり、HDDにddでMBRこぴってファイルシステム作ったあと、HDD丸ごとコピーしたりできる。

###一行野郎
`find /usr/local/src/hoge -name "*.h" | cpio -pdm /tmp/work`
hogeソース群から、ヘッダファイルをディレクトリ構造保持して、/tmp/workにコピー。他には、cpio的には、ディレクトリ構造保持してgzipしたり。まぁ、tarでもいいんですけど。

###必要な物
* cpio
Xcode のカラー設定をSolarized にする

以前、[「Mac Terminal のカラー設定をSolarized にする」](http://qiita.com/Humangas/items/848f0318dfc3c6f5b8e2)という記事を書きましたが、最近はXcodeを触る機会が増えたので、そっちもSolarizedにしてみました。その手順を備忘のため書いときます。

Solarizedって？ いう場合は、[こちら](http://qiita.com/Humangas/items/848f0318dfc3c6f5b8e2)でも見てみて下さい。

# 手順実施後：Xcodeエディタのカラー設定がSolarizedになる
![result.png](https://qiita-image-store.s3.amazonaws.com/0/26565/815c5249-6b67-e669-7124-1d2e324c79de.png)

# コレを実施した環境
* Mac OSX: 10.9.2
* Xcode: 5.1.1

# やり方は簡単
1. テーマ入手
2. テーマ配置
3. Xcodeの設定からテーマ選択

## テーマを入手
1. [「Solarized Dark Theme for Xcode 5」](https://github.com/ArtSabintsev/Solarized-Dark-for-Xcode) からテーマをダウンロード（git clone でももちろん良いです）ちなみに、試してませんが、Xcode4用は[「solarized / apple-xcode4-solarized」](https://github.com/brianmichel/solarized/tree/master/apple-xcode4-solarized)から入手出来るようです。
  ![download.png](https://qiita-image-store.s3.amazonaws.com/0/26565/95deb69f-3c92-e07c-097b-af75d25e0f5d.png)
</br>

2. 「Solarized-Dark-for-Xcode-master.zip」というファイルがDLされるはずなので、解凍して「Solarized Dark @ArtSabintsev.dvtcolortheme」というファイルがあることを確認しとく。これがエディタのテーマファイルです。

## テーマ配置
1. 「Solarized Dark @ArtSabintsev.dvtcolortheme」ファイルを`~/Library/Developer/Xcode/UserData/FontAndColorThemes`に配置

## Xcodeの設定からテーマ選択
1. Xcode起動（※既に起動していた場合は再起動して下さい）
2. メニューバーより、Xcode> Preference を選択
![xcodeope.png](https://qiita-image-store.s3.amazonaws.com/0/26565/d9d08cd5-df25-0506-555e-4fdf527cc6bd.png)
</br>

3. Fonts & Colors> Solarized Dark@・・・ を選択
![select.png](https://qiita-image-store.s3.amazonaws.com/0/26565/9da1e732-c919-75bf-4985-1440ec66f8a4.png)
</br>

ちなみに、ここで選択するSolarized Dark@・・・は配置したファイル名そのままです。表示名称を変更したい場合は、配置するファイル名の拡張子前までを変更すればOKです。

</br>
以上で、Xcodeエディタ が美しい色になる。
[Grails]SpringSecurityCoreを導入してdbconsoleが使えなくなった際の対応

webベースでデータベースの確認が行える便利なdbconsoleですが、SpringSecurityCoreを導入すると、アノテーションの宣言されていないコントローラにアクセスするとAccess Deniedとなってしまい、dbconsoleが使えなくなってしまいます。

じゃあdbconsoleのコントローラにアノテーションを。。。と思いましたが、 **grails-app/conf/Config.groovy** の`grails.plugin.springsecurity.controllerAnnotations.staticRules`に、dbconsoleへのアクセスの際の動作を記述することで回避出来ました。
（回避できたというか、そもそもそうするべきものですね。。。）

```groovy:grails-app/conf/Config.groovy
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
	'/':                              ['permitAll'],
	'/index':                         ['permitAll'],
	'/index.gsp':                     ['permitAll'],
	'/**/js/**':                      ['permitAll'],
	'/**/css/**':                     ['permitAll'],
	'/**/images/**':                  ['permitAll'],
	'/**/favicon.ico':                ['permitAll'],
    '/**/dbconsole/**':                ['isAuthenticated()']    // これを追加
]
```

SpringSecurityCoreを導入すると、アクセスされた際の挙動を指定していないと問答無用でAccess Deniedとなります。
上記のように **isAuthenticated()** で、ログインしている必要があるよ、という指定をしてあげればＯＫ。
[公式ドキュメントはこのあたり](http://grails-plugins.github.io/grails-spring-security-core/docs/manual/guide/requestMappings.html#configGroovyMap)
Eclipse MarketPlaceに自作のPluginを登録する


自作のEclipse Pluginの登録は簡単です。

# Eclipse.org accountのアカウントを作成する
以下のサイトから辿ってサインアップする。(login → Create Account)    
http://marketplace.eclipse.org/

アカウント作成するとメールが来るので本登録を終わらせて、ログインする.

# コンテンツを追加する
1.ログイン後のメニューに「Add Content」があるのでそれを叩く。
2.「Add a new Solutions Listing」リンクを叩く。
3. 登録するPluginの情報を記述

Solution Name　: Eclipse MarketPlaceに表示される名前
Product URL　:　プロジェクトのURLとか、自分はgithubレポジトリのURLを書いた
Version: Eclipse MarketPlaceに表示されるバージョン
Update Site URL: 自分はbintrayに作ったのでそのURL
Supported Eclipse Version: 例えば 4.3.2
Feature IDs: 以下のid

```feature.xml
<feature url="path/to/feature.jar" id="feature.to.install" version="1.x.x.x">
```

Support URL: issue tracking systemのURL。自分はgithubのissues
Status : Eclipse MarketPlaceに表示されるDevelopment Status
Solution Type : This product requires an existing Eclipse installation to functionをチェック
Solution Description : Eclipse MarketPlaceに表示される説明
Categories : タグ。5個まで
Markets : 検索対象のマーケット

saveボタンで終了。

# 審査とMy Marketplaceに表示されるのを待つ
これは一日以上待った気がする。上記save後のメッセージなどが地味なので、本当にsaveできたのかが不安になるが、待っていれば、登録される。
sandboxie で実行するプログラムのショートカットを作成する

私的メモ

1. [メニュー]構成 → Windows シェル統合
2. ショートカットアイコンの欄から、さらに他のショートカットアイコンをデスクトップに追加[ショートカットアイコンを追加]ボタン
【GooglePlayGameServices】実績、リーダーボードをリセットする方法

GitHubにGoogle製の管理ツールが用意されていますが、自分なりに実験した手順をまとめてみました。

* **管理ツール**
[playgameservices/management-tools](https://github.com/playgameservices/management-tools)

* **まとめ**
[実績、リーダーボードをリセットする方法](http://seesaawiki.jp/w/bokkuri_orz/d/Unity3D%20-%20Google%20Play%20Game%20Services#content_4)


* **Google Play Game Services ドキュメント**
https://developers.google.com/games/services/
hair_triggerはもはや死んだプロジェクトで、モダンな環境では使えない。

# HairTrigger
Activerecordに経由でトリガーを付与するgemっぽい。

#感想
もはや死んだプロジェクトで、モダンな環境では使えない。
普通にmigrationファイルにトリガー書いた方がよさげ

```
execute <<-SQL
        CREATE TRIGGER my_trigger ...
    SQL
```

#蛇足：リドミの和訳
## Compatibility

* Ruby 1.8.7+
* Rails 2.3+
* Postgres 8.0+
* MySQL 5.0.10+
* SQLite 3.3.8+

古そう。心配。

## インストール
Gemfileに `gem 'hairtrigger'` 

## 使い方

### Models

models でトリガーを定義、rake taskでmigrationを作成する。

```ruby
class AccountUser < ActiveRecord::Base
  trigger.after(:insert) do
    "UPDATE accounts SET user_count = user_count + 1 WHERE id = NEW.account_id;"
  end
end
```
と記述したあと、

```bash
rake db:generate_trigger_migration
```

とやると下記のような命令がDBMSに対して実行されるらしい。

```sql
CREATE TRIGGER account_users_after_insert_row_tr AFTER INSERT ON account_users
FOR EACH ROW
BEGIN
    UPDATE accounts SET user_count = user_count + 1 WHERE id = NEW.account_id;
END
```
Vagrant base boxをいちから手動で構築する

chef入れるとか色々あるけど、基本的には以下のことができていればいいはず。
タグは一応、Ubuntu 14.04だけど、基本的には関係ない

#sudoers設定
```bash:
sudo sed -i -e '/Defaults\s\+env_reset/a Defaults\tenv_keep="SSH_AUTH_SOCK"' /etc/sudoers
sudo sed -i -e '/Defaults\s\+env_reset/a Defaults:vagrant !requiretty' /etc/sudoers
sudo sed -i -e '/Defaults\s\+env_reset/a Defaults\texempt_group=sudo' /etc/sudoers
sudo sed -i -e '/%sudo\s\ALL=(ALL:ALL) ALL/a %vagrant   ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
```

#SSHの設定
```bash:
echo "UseDNS no" | sudo tee -a /etc/ssh/sshd_config
```

#SSHの公開鍵設定
```bash:
mkdir /home/vagrant/.ssh
wget --no-check-certificate 'https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub' -O /home/vagrant/.ssh/authorized_keys
chown -R vagrant /home/vagrant/.ssh
chmod -R go-rwsx /home/vagrant/.ssh
```

#VirtualBox Guest Additionsのインストール
```bash:
# mount /dev/cdrom /media/cdrom
# sh /media/cdrom/VBoxLinuxAdditions.run
```

#ファイルサイズを小さくする
```bash:
sudo -s
apt autoremove --purge
apt autoclean
e4defrag /
dd if=/dev/zero of=/EMPTY bs=1M; sudo rm -f /EMPTY
find /var/log -type f | while read f; do sudo sh -c "echo -ne '' > $f"; done
exit
rm -rf /var/ww/html
rm ~/.bash_history
```

#仮想マシンがネットワークにつながらない対策(必要な場合にのみ)
```bash:
sudo sed -i -e 's|/etc/udev/rules.d/70-persistent-net.rules|/dev/null|g' /lib/udev/write_net_rules
```
Rで自然言語処理。ナイーブベイズで文書分類を試みる

#概要
[ショートショート](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88)を予め用意したカテゴリに自動分類する。
R環境を通して、MeCabで形態素解析しナイーブベイズを使ってカテゴリを推測する。

#環境設定
[ -> RMeCab のインストールと R を用いたテキスト処理（形態素解析など）](http://www.kkaneko.com/rinkou/textcommand/rmecab.html)
[ -> ニコニコ大百科データからMeCab辞書を生成する](http://qiita.com/nezuq/items/875ac806d9b1afb3798d)

#入力
フォルダにショートショートを格納する。

yyMMddhhmmss（フォルダ）
　|ーakga_01.txt（ショートショート）
　|ー  :
　|ー  :
　|ーakga_06.txt
　|ーnkmk_01.txt
　|ー  :
　|ー  :
　|ーnkmk_06.txt
　|ーxxxx_01.txt
　|ー  :
　|ー  :
　|ーxxxx_04.txt
※ファイルの接頭辞がカテゴリ名を表す。
　akga/nkmkファイルが訓練データ。xxxxファイルが検証データ。
　xxxx_01.txt,xxxx_02.txt=akga
　xxxx_03.txt,xxxx_04.txt=nkmk

#処理
```r:文書分類器.r
library(RMeCab)
library(e1071)

d <- as.data.frame(t(docMatrix2("<ショートショート格納フォルダ>", pos = c("名詞"), weight = "norm")))

d.train <- d[c(1:12),]
d.train["tag"] <- factor(sub("^([a-z]*?)_.*", "\\1", rownames(d.train), perl = T))
rownames(d.train)
d.test <- d[-c(1:12),]
rownames(d.test)

model <- naiveBayes(tag~., d.train, laplace = 0.5)

predict(model, d.test)
```

#出力イメージ
rownames(d.test)
[1] "xxxx_01.txt" "xxxx_02.txt" "xxxx_03.txt" "xxxx_04.txt"

predict(model, d.test)
[1] akga akga nkmk nkmk
Levels: akga nkmk

#感想
訓練データが少なく未知語が多数出る場合、
未知語へのペナルティを小さくしないと語彙の多いカテゴリに全て分類される気がする。

#参考サイト
[ -> バイオ・データ・マイニング/RでNaïve Bayesを使う - とうごろうぃき](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCwQFjAA&url=http%3A%2F%2Fxn--p8ja5bwe1i.jp%2Fwiki%2F%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25AA%25E3%2583%25BB%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E3%2583%25BB%25E3%2583%259E%25E3%2582%25A4%25E3%2583%258B%25E3%2583%25B3%25E3%2582%25B0%2FR%25E3%2581%25A7Na%25C3%25AFve%2520Bayes%25E3%2582%2592%25E4%25BD%25BF%25E3%2581%2586%2F&ei=nOVXU-fcEMGC8gXIr4GoCQ&usg=AFQjCNG63TY6oZcaFNo8sqC9dClvUmvdCA&sig2=SInd21lIzlJUFKgE1nL7xA&bvm=bv.65177938,d.dGc)
[ -> 10行でナイーブベイズ ～Rって便利だね！～ - あらびき日記](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0CDkQFjAC&url=http%3A%2F%2Fd.hatena.ne.jp%2Fa_bicky%2F20110130%2F1296379953&ei=nOVXU-fcEMGC8gXIr4GoCQ&usg=AFQjCNGjmyva8S6Zdd28MHAl2uV2bfN02Q&sig2=evkzMPs1dFf18D2L-49E0A&bvm=bv.65177938,d.dGc)
erb な Rails プロジェクトを一瞬で haml に移行する

既存の erb ファイルを html2haml で変換して、古い erb ファイルを全部削除する手順。

```sh
gem install html2haml
cd app/views
find . -name '*erb' | xargs ruby -e 'ARGV.each { |i| puts "html2haml -r #{i} #{i.sub(/erb$/,"haml")}"}' | bash
find . -name *.erb | xargs git rm -f
find . -name *.haml | xargs git add -v
```

そして、Gemfile に haml-rails を追加。

あとはテストが書いてあるはずなので `bin/bundle exec rspec spec` して全部パスすれば、ひとまず大丈夫そうですね。細かいところで表示が微妙に変わったりとかはあるのかもしれないので、ざっと見た方がいいですけど。
一行野郎：UTF8のBOMの追加/削除

###効果
BOMを追加/削除する。
gcc と VC++で、同じソースコードをコンパイルする時に、よくはまるUTF8のBOMさんを一括変換。

###一行野郎
追加
`uconv -f utf-8 -t utf-8 --add-signature hoge.c > hoge_bom.c`
削除
`uconv -f utf-8 -t utf-8 --remove-signature page.c > page_nobom.c`

####一括野郎
追加

    for i in `find ./ -name "*.c"`; do uconv -f utf-8 -t utf-8 --add-signature $i > $i.new && mv $i.new $i; done`

削除

    for i in `find ./ -name "*.c"`; do uconv -f utf-8 -t utf-8 --remove-signature $i > $i.new && mv $i.new $i; done

###必要な物
* uconv

uconvは、icu、libicu-dev とかに入ってる。
たぶん、こんな感じ。
`aptitude install libicu-dev`
`yum install icu`
入力しづらい丸英数字のメモ

http://ja.wikipedia.org/wiki/%E4%B8%B8%E6%95%B0%E5%AD%97

『丸囲み英数字』
⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 
⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ 
➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ 
➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ 
Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ 
ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ

『丸括弧囲み英数字』
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ 
⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ 
⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵

『ピリオド付き数字』
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ 
⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛

『単位記号英数字』
㎀ ㎁ ㎂ ㎃ ㎄ ㎅ ㎆ ㎇ ㎈ ㎉ ㎊ ㎋ ㎌ ㎍ ㎎ ㎏ 
㎐ ㎑ ㎒ ㎓ ㎔ ㎕ ㎖ ㎗ ㎘ ㎙ ㎚ ㎛ ㎜ ㎝ ㎞ ㎟ 
㎠ ㎡ ㎢ ㎣ ㎤ ㎥ ㎦ ㎧ ㎨ ㎩ ㎪ ㎫ ㎬ ㎭ ㎮ ㎯ 
㎰ ㎱ ㎲ ㎳ ㎴ ㎵ ㎶ ㎷ ㎸ ㎹ ㎺ ㎻ ㎼ ㎽ ㎾ ㎿ 
㏀ ㏁ ㏂ ㏃ ㏄ ㏅ ㏆ ㏇ ㏈ ㏉ ㏊ ㏋ ㏌ ㏍ ㏎ ㏏ 
㏐ ㏑ ㏒ ㏓ ㏔ ㏕ ㏖ ㏗ ㏘ ㏙ ㏚ ㏛ ㏝
㍱ ㍲ ㍳ ㍴ ㍵ ㍶
OCMockitoを使ったテスト


書き方が好みっぽかったので使い始めてみたけど、やっぱりハマって困ってます。
というわけで備忘録を兼ねたメモ（こんなんばっか）。

# MOCKITO_SHORTHAND

MCMockitoが提供する`MTKMock*`クラス群を`mock()`など短い文字列に置き換えるマクロ。

```objectivec
#define HC_SHORTHAND
#import <OCHamcrest/OCHamcrest.h>

#define MOCKITO_SHORTHAND
#import <OCMockito/OCMockito.h>
```

# Delegateオブジェクトをモックする

```objectivec
- (void)testSomeProtocol
{
  // SomeProtocolを実装した（とみなす）モックオブジェクトを生成する
  id <SomeProtocol> mock = mockProtocol(@protocol(SomeProtocol));

  // オブザーバとして登録
  [manager addObserver:mock];
  [manager centralManagerDidUpdateState:manager.centralManager];

  // `centralManagerDidUpdateState:`が呼び出されたことを確認
  [verify(mock) centralManagerDidUpdateState:(id) anything()];
}
```
dockerを使って動作中のサーバーをホスティング会社間で移動する

dockerがどのくらいできるのか試してみました。
VPSなどは年々スペックがインフレするので時々契約を変更したくなりますが動いているものがあると移動できなかったりします。
これらができるとサーバー会社を移動したり、アクティブ率の下がったアプリケーションをスペックの低いサーバに移動したりと使いどころが多いですよね。

今回試したのはサーバー会社とディストリビューションの両方が違う環境です。

動かしているのは個人用のowncloudになります。
環境は以下

| サーバー会社 | ホスト OS | コンテナ OS |
|:-----------|:------------|:------------|
|さくらのクラウド| ubuntu 12.04 (64-bit) |ubuntu 13.04 (64-bit)|
|Amazon |Amazon Linux AMI (64-bit)||

まずは動いている状態のdockerからコンテナをエクスポートします。

docker psは以下のような状態

![Screenshot_from_2014-04-23 23:16:39.png](https://qiita-image-store.s3.amazonaws.com/0/8707/d9a330e1-bb71-be17-ead7-91379bd966c2.png)

エクスポートコマンドを実行します。

```bash:command
sudo docker export 8a0cf0655e89 > img.tar
```

しばらくまつと何も言わず完了してカレントディレクトリにimg.tarができ上がっていますのでこれをscpなどでAWSに転送します。

転送が終わったら今度はAWSのdockerにインポートします。
[jessie:test]はインポートし終わったときのREPOSITORYとTAGになります。

```bash:command
cat img.tar |sudo  docker import - jessie:test
```

これで動作させる準備が整いました。
docker runコマンドで動作させます。
この時、Dockerfileを使って構築した時に指定したCMDがなくなってしまうようなので以下のようにコマンドを指定する必要がありました。
[-p 80:80]を指定してポートがフォワーディングされるようにしています。(httpでない場合は不要です)

```bash:command
sudo docker run -p 80:80 -d jessie:test /usr/sbin/apache2ctl -D FOREGROUND
```

以上で会社の移動が無事できました。
逆にAWSからさくらのクラウドなどの移動もスムーズにできると思います。

バックアップや他社VPSへの移動なども簡単にできるようになるので使わない手は無いですね。

では！
virtualedit=block時にyankしたときのおまけのスペース

```text hoge.txt
aaaaaaa$
bbbbbbbbb$
ccccccxxxxxx$
ddddddd$
```
を矩形選択で全て選択して5行目にペーストした時の
```text hoge.txt
aaaaaaa$
bbbbbbbbb$
ccccccxxxxxx$
ddddddd$
aaaaaaa　　　$
bbbbbbbbb　　$
ccccccxxxxxx$
ddddddd　　　$
```
となる挙動を
```text hoge.txt
aaaaaaa$
bbbbbbbbb$
ccccccxxxxxx$
ddddddd$
aaaaaaa$
bbbbbbbbb$
ccccccxxxxxx$
ddddddd$
```
こうしたい・・・
Powershellで共有フォルダにアクセス

```ps1
$server = "\\server\share"
#\\server\share\にすると認証通らない
Test-Path -Path $server #アクセス拒否
$cred = Get-Credential
New-PSDrive -Name "Z" -PSProvider FileSystem -Root $server -Credential $cred
Test-Path -Path $server #true
```
多段SSHの設定を.ssh/configにまとめる


# 概要
- 踏み台サーバを経由した多段SSHの設定をconfigにまとめる方法
- 接続するマシンは、WANやゲートウェイ内のネットワークのいずれにも属する可能性があると想定(ノートPC等)
 
# ネットワーク図
![network-image.png](https://qiita-image-store.s3.amazonaws.com/0/39736/641bf12d-2a61-3b2b-fd6b-fb2137127fc8.png)

- 図のようにゲートウェイ経由でしかアクセスできないネットワーク内にさらにゲートウェイがあるネットワークを想定

# 単純な多段SSHの書き方

```shell-session
host gateway
   HostName sshgate.hoge
   User hoge

Host RemoteHost-out
  HostName RemoteHost
  User fuga
  ProxyCommand ssh -W %h:%p gateway

```

上記の設定を~/.ssh/configに書いた後、
`ssh RemoteHost-out` 
でgateway経由でのアクセスが可能

#複数に同時に設定を適応する場合
.ssh/configには複数の設定をワイルドカードでまとめて書くことができる

例えば、以下の様なconfigを設定する。

```shell-session
host gateway
   HostName sshgate.hoge
   User hoge

Host RemoteHost*
  HostName RemoteHost
  User fuga

host *-none
   ProxyCommand none

Host *-out*
   ProxyCommand ssh -W %h:%p gateway
```

この時、上から順にヒットしたHostに記載されている項目だけ適応され、以下は適応されていない項目だけ適応される。
例えば、
`ssh RemoteHost-out`
と実行すると、gateway経由でRemoteHostに接続される。

* HostName,UserはHost RemoteHost\*から
* ProxyCommandはHost \*-out\*から

`ssh RemoteHost-out-none`
とすると、
直接、RemoteHostに接続される。

* HostName,UserはHost RemoteHost\*から
* ProxyCommandはHost \*-noneから
* \*-out\*のProxyCommandは\*-noneで設定済みなので無視される

#最終的な.ssh/config
上記を踏まえた上で、設定をまとめる。

```shell-session:~/.ssh/config
host gateway
   HostName sshgate.hoge
   User hoge

host *-none
   ProxyCommand none

Host LocalB-*-out
   ProxyCommand ssh -W %h:%p Bgateway-out

Host LocalC-*-out
   ProxyCommand ssh -W %h:%p Cgateway-out

Host LocalB-*
   ProxyCommand ssh -W %h:%p Bgateway

Host LocalC-*
   ProxyCommand ssh -W %h:%p Cgateway

Host *-out
   ProxyCommand ssh -W %h:%p gateway

Host *RemoteHost*
  HostName RemoteHost
  User fuga

Host *Bgateway*
  HostName Bgateway
  User hogehoge

Host *Cgateway*
  HostName Cgateway
  User hogehoge

Host *HostA*
  HostName HostA
  User hogehoge

Host *HostB*
  HostName HostB
  User hogehoge

Host *HostC*
  HostName HostC
  User hogehoge

Host *HostD*
  HostName HostD
  User hogehoge
```

ゲートウェイ間の通信の処理を書いておけば、これでどの経路のゲートウェイを通る設定も網羅できる。

##利用例
例えば、WANからHostAにアクセスする場合、
`ssh LocalB-HostA-out`
でgateway->Bgateway->HostAの多段SSHが可能

LocalAやLocalCのネットワークからHostBにアクセスする場合は、
`ssh LocalB-HostB`

LocalCのネットワークからHostDにアクセスする場合は、通常通り
`ssh HostD`
もしくは、
`ssh HostD-out-none`
のように最後に-noneをつけることでProxyCommandを無視する設定も可能

この書式で書けば、ホストを追加する時にgatewayの設定等を個別に書く必要がなく、ホスト名(+ユーザ名・鍵ファイル指定等必要情報)だけを指定することで、そのHostに対しても多段SSHを行うことができる。

##ホスト名補完用設定
ただし、この設定をするとzshのホスト名補完が聞かなくなったので、
私は、configの最初に以下のようによく利用するホスト名の補完用の空設定を書いている。

```shell-session
Host LocalB-HostA-out HostA LocalB-HostA-out RemoteHost-out

Host gateway
…
```

もっとスマートな方法があったら教えて下さい。
finally句でのreturn



finally句でのtry-catchについての動作検証メモ
catch句でreturnした後に、finally句でさらにreturnした場合の動作を確認。

###プログラム
```java:main.java
static String returnException() {

     try {
          // 例外発生したとする
          throw new Exception();
     } catch (Error e) {
          System.out.println("Error e");
          return "Error";
     } catch (Exception e) {
          System.out.println("Exception e");
          return "Exception";
     } finally {
          try {
               // 例外発生したとする
               throw new Exception();
          } catch (Exception e) {
               System.out.println("finally : Exception e");
               return "finally Exception";
          }
     }
     return "end";
}
```



###処理結果
```markdown
Exception e
finally : Exception e
finally Exception
```

###結論
最後にreturnしたものが返される。
<br>

#finally句で直接return（未検証）
以下のようにfinally句で直接returnすると
eclipseでは警告が表示されるため検証はしていない

```java:main.java
     try {
          // 何か処理
     } catch (Exception e) {
          // 何か処理
          return false;
     } finally {
          // 何か処理
          return true;
     }
```

まぁ、こうすると必ず true が返っちゃうよーっていうことをeclipseは言ってるんだろうな。
（検証していないので想像です）
<br>
<br>
<br>

まぁ個人的には、finally句でのtry-catchって・・・と思ったりもしますが
仕方ないんですかね。
rails レコードの取得方法まとめ




レコードの取得方法
----
###find(1)
コンソール画面で既に開発者がIDを知っている場合

###find(params[:hoge_id])
フォーム等で **パラメータ** が送られる場合

###find(user.hoge_id)
※userがhoge_idという **一つしかIDがない** ものを取る場合

※に対して下のようなパターンが必要になってくるのはモデルが多対多の場合など
中間テーブルを利用しているときなどの **IDが複数** ある場合
 
* ###where
    条件を指定する場合
リファレンス http://railsdoc.com/references/where

* ###スコープ

* ###first(last)
http://upsnap.jp/archives/show/41
http://www.atmarkit.co.jp/ait/articles/1104/12/news135.html
____
<pre>
rails db 
show tables;
select * from テーブル名;
</pre>
 
これでテーブルの具体的な中身を確認できる

***

annotate を使う
---
特徴:モデルにテーブルのカラム名など分かりやすく表示してくれる

<pre>
gem install annotate
</pre>

私は下記の様にしてモデルファイルにのみ反映されるようにしています

<pre>
annotate -e[tests,fixtures,factories] --exclude -i
</pre>
https://github.com/totoman/annotate_models
VirtualBoxで複製したCentOSがネットワークに繋がらない


複製したマシンはMACアドレスの初期化だけでなく、NICの細かい設定をしないといけない。

## NICの設定

ifconfig-eth0でNICのHWADDRの値を新しいMACアドレスに変更する。

```
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 
```

## ネットワークデバイスの名前の設定

ネットワークデバイスの名前の割り当てを変更する。

```
# vi /etc/udev/rules.d/70-persistent-net.rules
```

PCI device 0x8086:0x100e (e1000)という行が2つあるが、1つ目は古いので削除。

2つ目のMACアドレスを確認した上で、NAMEをeth0に変更する。
[Ruby] 日付をStringにしたりTimeにしたりUnixTimestampにしたり


API経由で取得した日付情報（String）を扱う時とか。
いつも忘れるのでメモ。


## String to Time

#### Time.parse()

```ruby
# Time to String
> str = Time.now.to_s
=> "2014-04-07 10:00:00"

# String to Time
> time = Time.parse(str)
=> 2014-04-07 10:00:00 +0900
```


## UnixTimestamp to Time

#### Time.at()

```ruby
# Time to UnixTimestamp
> unixtime = Time.now.to_i
=> 1396832400

# UnixTimestamp to Time
> time = Time.at(unixtime)
=> 2014-04-07 10:00:00 +0900
```
【ownCloud】AWSに専用オンラインストレージ構築


# ownCloudとは


* PHPベースのオープンソースプロダクト
* Dropboxのようなオンラインストレージを自前の環境に構築可能
* ブラウザの他、専用のWindows、Linux、Mac、Android、iPhone用クライアントから接続可能
* アドオン機構があるため、独自アプリを実装することが可能
* [リンク]
   * [owncloud.org](http://owncloud.org/)
   * [owncloud.jp](http://owncloud.jp/)
   * [github owncloud](https://github.com/owncloud)
   * [AWS MarketPlace](https://aws.amazon.com/marketplace/pp/B00F8I7IXG/ref=srh_res_product_title?ie=UTF8&sr=0-3&qid=1380794974138)
   * [Japan ownCloud User Group (JOUG)](http://owncloud.jp/forum/)

# AWS MarketPlaceから構築
AWS MarketPlaceに無料のAMIが公開されているので、わずか3ステップの一番お手軽な方法で構築する。

## １. AWS Marketplaceへのアクセス
　1. [AWS Marketplace](https://aws.amazon.com/marketplace/pp/B00F8I7IXG/ref=srh_res_product_title?ie=UTF8&sr=0-3&qid=1380794974138) にアクセスします。
　2. 「Continue」をクリックします。
　3. 自身のAWSアカウントでログインします。

## ２. ownCloud powered by owncloud.jp の起動

1. 以下の画面でVersion、Region、EC2 Instance Type、VPN Settings、Security Group、Key Pairに任意の値を設定します。（Security GroupにはhttpとsshのInboundアクセスが必要です。）
2. 「Accept Terms & Launch with 1-Click」をクリックします。
![AWS Marketplace](http://www.begood-tech.com/wp-content/uploads/2013/11/20131125_1-615x554.jpg)
3. 以下のダイアログが表示されたら、2-3分後にダイアログを閉じ、Your Software Subscriptions画面の当該インスタンスがactiveになっていることを確認します。
![AWS Marketplace3](https://qiita-image-store.s3.amazonaws.com/0/39596/218789b3-2926-1770-9847-9e0f6872aaa0.png "スクリーンショット 2014-04-29 14.32.23.png")


## ３．ownCloudへアクセス

1. 以下の画面で「Access Software」をクリックしてください。
![AWS Marketplace4](http://www.begood-tech.com/wp-content/uploads/2013/11/20131125_3-615x162.jpg)

2. 手順は以上です。adminユーザでログイン後のownCloudのトップ画面が表示されます。
![skitch.10.png](https://qiita-image-store.s3.amazonaws.com/0/39596/d07357cf-2d94-657e-2ffb-bc667c35f5ee.png "skitch.10.png")

 * この時点でadminユーザのパスワードが設定されています。再度ログインするためにパスワードを以下の方法で確認しておいてください。（ユーザ管理から新しい管理者ユーザを作成することで以下の作業は不要です。）

 	1.EC2ダッシュボードのインスタンス画面から対象のインスタンスを[右クリック]->[Instance Settings]->[Get System Log]を選択します。
![skitch.55.png](https://qiita-image-store.s3.amazonaws.com/0/39596/f7192776-a464-879c-6f99-72f9fe38a8c3.png "skitch.55.png")

 	2.ログウィンドウに表示される[owncloud admin password]の内容が初期パスワードです。
![skitch.54.png](https://qiita-image-store.s3.amazonaws.com/0/39596/4bfb54f1-e53f-1423-8f34-bb5252a69be6.png "skitch.54.png")

# 最後に
* 順次ownCloudとAWSに関する記事を投稿していきます。
* 独自アプリのコードも公開予定です。

# 更新履歴
* 2015/01/27 v7.0.3 からデプロイ後、adminパスワードが自動付与されるようになったので、adminパスワードの確認方法を追記しました。
jQueryメモ - Percentage Loader

Percentage Loaderは印象的な進行ウィジェットを表示できるjQueryプラグインです。コードはBitbucketで公開されています。ライセンスは「BSDライセンス」と記載がありました。

![スクリーンショット 2014-04-23 22.22.39.png](https://qiita-image-store.s3.amazonaws.com/0/8407/54b753b0-f483-8891-14f7-1bd3a538a5b7.png)


WebサイトはこちらのURLからアクセスできます。
http://widgets.better2web.com/loader/

BitbucketのURLはこちらです。
https://bitbucket.org/Better2Web/jquery.percentageloader
Backbone.jsのtemplateをgruntを使って外部ファイル化

Backbone.js（だけじゃないけど）の特徴の一つはDOMをtemplateとして保持できること。
一方でhtmlファイル内のtemplateが増えすぎるとごちゃごちゃしてしまうし、複数人開発の場合にも支障が発生する。

今回はgruntのプラグインである`contrib-jst`を使って、複数のtemplateを、1つの外部ファイルにまとめてゆく。

#contrib-jstのインストール
いつも通り、`npm`コマンドを使ってインストール。

```:cmd.exe
>npm install grunt-contrib-jst -save-dev
```

##contrib-jstの設定
今回はこのようなディレクトリ構造を例にして説明してゆく。
```
+--jst // 外部ファイル化されたtemplateが置かれる場所
|
+--template // 元のtemplateのファイルの場所
|
+Gruntfile.js
```

Gruntfile.jsには以下のように記述（一例）。

```js:Gruntfile.js
module.exports = function (grunt) {
    var pkg = grunt.file.readJSON('package.json');
    grunt.initConfig({
        jst: {
            options: {
                processName: function (filename) {
                    return filename.match(/templates\/(.+)\.tmpl$/)[1];
                },
                processContent: function (src) {
                    return src.replace(/(^\s+|\s+$)/gm, '');
                }
            },
            dev: {
                files: {
                    // 出力先、及びファイル名: [元ファイルのパターン。例では分かりやすくtmpl形式を対象としている]
                    'jst/template.js': ['templates/**/*.tmpl']
                }
            }
        }
    });
   
    grunt.loadNpmTasks('grunt-contrib-jst'); // プラグインの読み込み
    grunt.registerTask('build', ['jst']); // タスク登録
};
```

#実際の利用
##元となるtemplateファイルの用意
例として、以下の様なtemplateファイルを用意する。
（Gruntfile.jsでもコメントしたが、分かりやすくするためtmpl形式としている）

```template.tmpl
<li>listName <%- listName -></li>
```

ここでは通常のBackbone.jsのtempalteのように、htmlタグを`<script type="text/template"></script>`で括る必要はない。

##外部ファイル生成
先ほど用意したGruntfile.jsでのタスク名（build）をコマンドラインで呼び出す。

```:cmd.exe
>grunt build
Running "jst:dev" (jst) task
File jst/template.js created.

Done, without errors.
```

設定した通り、jstディレクトリにtemplate.jsファイルが生成されていることを確認する。

##生成されたtemplate.jsを利用する
templateを使いたいhtmlファイルに、template.jsを読み込ませる。

```html:example.html
<script src="js/template.js"></script>
```

そしてBackbone.jsのViewでは、

```js:exampleView.js
var exampleView = Backbone.View.Extend({
    template: JST['template'] // 元のファイル名から拡張子を省いたもの
});
```

このように呼び出せば利用することが出来る。
とっても楽ちん。楽しい✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

突っ込みどころ、盛大に間違っている部分等ありましたら是非ご指摘ください。
Go1.3beta1でappendの動きが変更されたようです

#内容
appendで追加されるキャパシティの量が変更されたようです。
具体的にはGo1.2.1では以下のコードで生成したスライスのキャパシティは「1」でしたが、Go1.3beta1では「8」になります。
`a := append([]byte{}, 0)`

また、Go1.2.1では以下のコードで生成したスライスのlen(a)とcap(a)が同じでしたが、Go1.3beta1では異なるようです。
`a := append([]byte{}, []byte{1,2,3,4,5}...)`

#サンプルコード
```go:unko.go
package main

import (
	"fmt"
)

func main() {
	buf := []byte{1,2,3,4,5,6,7,8,9}

	fmt.Println("===a===")
	a := make([]byte, len(buf))
	copy(a, buf)
	fmt.Printf("len:%d, cap:%d\n", len(a), cap(a))

	fmt.Println("===b===")
	b := make([]byte, 0, len(buf))
	b = append(b, buf...)
	fmt.Printf("len:%d, cap:%d\n", len(b), cap(b))

	fmt.Println("===c===")
	c := append([]byte{}, buf...)
	fmt.Printf("len:%d, cap:%d\n", len(c), cap(c))

	fmt.Println("===d===")
	d := []byte{}
	fmt.Printf("len:%d, cap:%d\n", len(d), cap(d))
	for i := 0; i < len(buf); i++ {
		d = append(d, buf[i])
		fmt.Printf("len:%d, cap:%d\n", len(d), cap(d))
	}
}
```

#Go1.2.1の結果
go version go1.2.1 windows/amd64
```
===a===
len:9, cap:9
===b===
len:9, cap:9
===c===
len:9, cap:9
===d===
len:0, cap:0
len:1, cap:1
len:2, cap:2
len:3, cap:4
len:4, cap:4
len:5, cap:8
len:6, cap:8
len:7, cap:8
len:8, cap:8
len:9, cap:16
```

#Go1.3beta1の結果
go version devel +f8b50ad4cac4 Mon Apr 21 17:00:27 2014 -0700 + windows/amd64
```
===a===
len:9, cap:9
===b===
len:9, cap:9
===c===
len:9, cap:16
===d===
len:0, cap:0
len:1, cap:8
len:2, cap:8
len:3, cap:8
len:4, cap:8
len:5, cap:8
len:6, cap:8
len:7, cap:8
len:8, cap:8
len:9, cap:16
```

#かんそう
realloc的な動作が減って速くなるのかな。
細かいスライスをappendで量産するようなプログラムには影響ありそう。
動作が明らかに変更されてるけど、特に資料がない気がする。英語力が低すぎて探せなかった。
BTKInjectorでProxyを注入

## Proxy注入を実装しました
BTKInjectorに今日いれた拡張(1.1.0）で、新たにproxyの注入に対応しました。cocoa pods登録済みです。

```objc
- (id) proxyForProtocol : (Protocol *)protocol;
```

## 何が便利なの？
BTKInjectorはオブジェクト生成時に依存関係を解決するため、循環参照があるとインスタンス注入が出来なくなります。Providerを注入することで初期化時には依存関係の解決を行わず、必要になってからgetすることは出来るのですが、正直書くのが面倒でした。

そして、今日思いついたのがProxy実装です。
Proxyオブジェクトは内部にproviderを注入してあり、必要に応じてproviderに処理を委譲します。ここで重要なのが、「必要になるまでproviderは呼ばれない」という点です。

これにより、インスタンスと同じプロトコルでそのまま使えて、Providerと同じように依存関係の解決を遅延することができます。さらば循環参照！

ちなみに、別記事で書いた[Double-Checked Lockingによる同期処理](http://qiita.com/tomohisaota/items/00a1fc68d98360af4013)は、このproxy実行時にパフォーマンスが落ちないように検討したものです。

## Where to find?
[BTKInjector](https://github.com/tomohisaota/BTKInjector) on github
herokuでamazon route53を使って独自ドメインを設定する。

ここに書いてある。
https://devcenter.heroku.com/articles/route-53

>>
As with any DNS provider, configuring your Heroku app’s DNS involves the following steps:
Create a CNAME record to map from www.example.com to example.herokuapp.com or your SSL endpoint if using SSL.
Establish a redirect from the root domain example.com to www.example.com to avoid the risks associated with root domains and A-records.
Set Route 53 servers as the nameservers for your domain.


1. ドメインを作る(Amazon53)
2. CNAMEを割り当てる
3. S3のバケットを作成する(example.com) リダイレクト設定で www.example.comとかにする。
4. route53にてエイリアスを割り当てる。選択先にs3のバケットが出て来る。
5. 取得したドメインサービスのネームサーバーを変える。(お名前.comとか)


ルートドメインは非推奨なので www.example.comに転送する様に設定。
無理してルートドメインを使う必要はないと思います。
mysqlのデータをsqliteに流し込む

# mysqlのデータをsqliteに流し込む

調べてみると`SHOW CREATE TABLE`で出力されたschemaを
ゴリゴリ直して流し込む方法ばっかりでてくるけど、
sqliteは型指定必要ないから`DESCRIBE`でいい気がするので試してみた。

```bash:bash
DB_NAME=some_database
TABLE_NAME=some_table
```

適宜読み替えてください。

## schemaの方

```bash:bash
COLUMNS=$(mysql -D${DB_NAME} -N -e "desc $TABLE_NAME" | awk '{print $1}')

(
echo "create table $TABLE_NAME("
set -- $COLUMNS; IFS=,; echo "$*"
echo ");"
) | sqlite3 $DB_NAME
```

### 確認

```bash:bash
sqlite3 $DB_NAME ".tables"
sqlite3 $DB_NAME ".schema $TABLE_NAME"
```

### 要点

* `COLUMNS=$(mysql -D${DB_NAME} -N -e "desc $TABLE_NAME" | awk '{print $1}')`

カラム名だけ抜き出して１行ずつ出力。

* `set -- $COLUMNS; IFS=,; echo "$*"`

`implode("," $array)` とか `arr.join(",")` っぽい処理をするbashの黒魔術的な書き方。
`IFS=,`に変えてるけど、サブプロセス内なので戻さなくていいと思う。括弧の中抜けたら戻る。

## dataの方

一時ファイル作るのはカッコ悪いのでそのまま流し込む方式。

`sqlite3`の`separator`オプションにはタブ文字を入力すること。
＃ vimで `C-v [TAB]` で入力できるやつ。
mysqlが吐き出すのがタブ区切りになってるので。

```bash:bash
mysql -D${DB_NAME} -N -e "select * from $TABLE_NAME" | \
    sqlite3 -separator '	' $DB_NAME ".import /dev/stdin $TABLE_NAME"
```

### 確認

```bash:bash
sqlite3 $DB_NAME "select * from $TABLE_NAME"
```