OmniAICreator/Qiita-1.07M huggingface dataset:
【Objective-C】UICollectionViewを使用する際によく使うデリゲートメソッド（テンプレート）やCustomCellの設定

はじめに
-
開発環境：Xcode5
iOS：7



UICollectionViewのDelegateとDataSourceをセット
-
Storyboard、xib等でセットしても良し

```objc:.m
	_collectionView.delegate = self;
	_collectionView.dataSource = self;
```


セルのカスタムクラスをUICollectionViewに登録
-

viewDidLoadやawakeFromNib等で記載

- nibを登録する場合

```objc:.m
    NSString *cellName = NSStringFromClass([CustomCell class]);
    [_collectionView registerNib:[UINib nibWithNibName:cellName bundle:nil] forCellWithReuseIdentifier:cellName];
```
- クラスを登録する場合

```objc:.m
    [_collectionView registerClass:[CustomCell class] forCellWithReuseIdentifier:NSStringFromClass([CustomCell class])];
```

- 標準セルを使用する場合

```objc:.m
     [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:NSStringFromClass([UICollectionViewCell class])];
```


UICollectionView Datasource（**実装必須**）
-


```objc:.m
/**
 *  対象CollectionViewのセクション内行数を設定します
 *
 *  @param collectionView 対象CollectionView
 *  @param section        対象Section
 *
 *  @return セクション内行数
 */
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 0;
}


/**
 *  セルを設定します
 *
 *  @param collectionView 対象CollectionView
 *  @param indexPath      対象IndexPath
 *
 *  @return 設定したセル
 */
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSString * cellName = NSStringFromClass([CustomCell class]);
    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellName forIndexPath:indexPath];
    return cell;
    
    /* 標準Cellを使用する場合
    NSString *cellName = NSStringFromClass([UICollectionViewCell class]);
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellName forIndexPath:indexPath];
    return cell;
     */
}
```

UICollectionView Datasource（**optional**）
-

```objc:.m
/**
 *  対象CollectionViewのセクション数を返します。
 *
 *  @param collectionView 対象collectionView
 *
 *  @return セクション数
 */
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}


```

UICollection Delegate（**optional**）
-
```objc:.m
/**
 *  セルタップ時に呼ばれます
 *
 *  @param collectionView 対象CollectionView
 *  @param indexPath      対象IndexPath
 */
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
}

```

UICollectionViewDelegateFlowLayout (**optional**)
-
UICollectionViewDelegateをセットしていればこのデリゲートも呼ばれます

```objc:.m
/**
 *  対象セルのサイズを設定します
 *
 *  @param collectionView       対象CollectionView
 *  @param collectionViewLayout 対象CollectionViewLayout
 *  @param indexPath            対象IndexPath
 *
 *  @return 設定サイズ
 */
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(100, 100);
}
```
BacklogAPIとHubotでSlackに課題通知を送る

前回
http://qiita.com/manabukk/private/158a2dd00ffc36bf5b98

#気づいたこと
new jobで追加したjobは一度Sleepしても保持される。
(11/25)

#外部サービスとの連携
Backlog API V2 を使って、課題を Slack に連携させる
http://qiita.com/matsuoshi/items/eb8479df3c10cf43269a
を参考に（ていうか丸コピ）してbacklogの更新を取得する。

ローカルで取得には成功していることを確認した。
herokuにpushしてみて様子を見る。

あと、
Hubot導入とhubot-script作成までやってみる
http://qiita.com/katsew/items/ce5795f2a945e7a46e59

Hubot:概要〜インストール〜実用的なモノが作れるまで
http://qiita.com/Kta-M/items/d7e0f371e40b4cefc38a

あたりを参考にcoffee scriptの勉強をしようかな。
(12/10)

##BacklogAPI
Heroku上では動作してくれなかった...
どうやらcronモジュールがうまく動作していないようなので、ネット上のサイトをいくつかあたってみたところどうやら文法が間違っていたみたい。

Hubotで定期タスクを動かす
http://qiita.com/mats116/items/0164b37ffaa90f03f2a0

最終的には以下の様に実装した。

```coffeescript:backlog.coffee

# Description:#   Backlog to Slack## Commands:#   None

cron = require('cron').CronJob

intervalMinutes = 10
buf_time = intervalMinutes*60*1000
backlogUrl = 'https://****.backlog.jp/'
apiKey = '****'
userName = '****'

module.exports = (robot) ->
    new cron "*/#{intervalMinutes} * * * *", () =>
        console.log "BacklogAPI start..."

        # APIアクセス
        robot.http("#{backlogUrl}api/v2/space/activities?apiKey=#{apiKey}")
        .get() (err, res, body) ->

            # 前回cron実行時刻
            now = new Date().currentTime.getHours()
            if 3 < now and now < 9
                buf_time = 9*60*60*1000
            else
                buf_time = intervalMinutes*60*1000
            lastTime = new Date - buf_time


            for feed in JSON.parse body
                # とりあえず出力
                console.log "since : #{lastTime}"
                # console.log "feed : #{feed}"

                # 前回cron実行時刻より古いものは処理しない
                if new Date(feed.created) < lastTime
                    continue

                console.log "feed created User : #{feed.createdUser.name}"
                if feed.createdUser.name == "#{userName}"
                    console.log "...skip send"
                    continue

                switch feed.type
                    when 1
                        label = '課題追加'
                    when 2
                        label = '課題更新'
                    when 3
                        label = '課題コメント'
                    else
                        # 課題関連以外はスルー
                        continue

                # 投稿メッセージを整形
                url = "#{backlogUrl}view/#{feed.project.projectKey}-#{feed.content.key_id}"
                if feed.content.comment?.id?
                    url += "#comment-#{feed.content.comment.id}"
                message = "[#{feed.project.projectKey}] #{label} - #{feed.content.summary} by #{feed.createdUser.name} #{url}"

                # Slack に投稿
                robot.send {room: '#backlog'}, message
    , null, true, "Asia/Tokyo"
```

あと、Coffee scriptの参考サイトとしては
http://memo.sappari.org/coffeescript/coffeescript-langref
とか見たらいいかも。
(12/11)

[次回](http://qiita.com/manabukk/private/4782443f41a26ff94d83)
vim-indent-guides を楽に使うには工夫が必要

コンソールの Vim は [vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) を導入しただけではインデントガイドを表示できません。いろいろなサイトを見ると手動で `IndentGuidesOdd` や `IndentGuidesEven` を設定しているようです。自分で色を決めたい場合はこれでよいのかもしれませんが、これを面倒だと思う人もいるでしょう。そこで [CSApprox](https://github.com/godlygeek/csapprox)[^approx] が使えます。

つまり、 `vim-indent-guides` が設定した値を `CSApprox` によってコンソールが使える値にすればよいわけです。

`NeoBundle` でプラグインを管理している場合は次のような最小[^minimal]の `.vimrc` が考えられます。(gvim は特殊な事情[^gvim] に由来する `vim-indent-guides` のバグ[^bug] によりこのままではダメです)

```vim:min.vimrc
augroup myvimrc
  au!
augroup END

if has('vim_starting')
  set rtp+=~/.vim/bundle/neobundle.vim
endif
call neobundle#begin()
NeoBundleFetch 'Shougo/neobundle.vim'

NeoBundle 'godlygeek/csapprox'
NeoBundle 'nathanaelkane/vim-indent-guides'

if neobundle#tap('csapprox')
  function neobundle#hooks.on_source(bundle)
    " Delay for adding after :IndentGuidesEnable or process_autocmds().
    au myvimrc VimEnter,BufEnter,WinEnter,FileType * :CSApprox!
  endfunction

  function neobundle#hooks.on_post_source(bundle)
    " Delay for adding after process_autocmds().
    au myvimrc ColorScheme * :CSApprox!
  endfunction

  call neobundle#untap()
endif

if neobundle#tap('vim-indent-guides')
  " 'let g:indent_guides_enable_on_vim_startup = 1' is almost equal to next
  " line but you needs to write next one. If you'd like to use with csapprox.
  " Because :IndentGuidesEnable should be called before :CSApprox!.
  au myvimrc VimEnter * :IndentGuidesEnable

  function! neobundle#hooks.on_post_source(bundle)
    " Override to force vim-indent-guides to calcuate appropriate colors.
    function! indent_guides#highlight_colors()
      call indent_guides#gui_highlight_colors()
    endfunction
  endfunction

  call neobundle#untap()
endif

call neobundle#end()

set tabstop=2
set softtabstop=2
set shiftwidth=2
colorscheme desert
syntax enable

if !has('vim_starting')
  call neobundle#call_hook('on_source')
  call neobundle#call_hook('on_post_source')
endif

filetype plugin indent on
```

[^approx]: [vim-jp » Hack #64: 256色ターミナルでVimを使用する](http://vim-jp.org/vim-users-jp/2009/08/29/Hack-64.html)
[^minimal]: [NeoBundleの使い方 - koturnの日記](http://koturn.hatenablog.com/entry/2015/08/07/233011)
[^gvim]: [Gvimのフォント設定に関するまとめ - 余白の書きなぐり](http://auewe.hatenablog.com/entry/2013/05/06/200425)
[^bug]: [Fix s:hi_normal initialization by Iazel · Pull Request #74 · nathanaelkane/vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides/pull/74)
C#で(1...10)みたいに書きたかった

[C# (1...10)という記法が欲しい](http://qiita.com/ToniTakekawa/items/e9a47a05e32e5b3cdcc1)を読んだので。
#はじめに
あまり実用性とかありません。


#1. 拡張メソッド

intにこんな拡張メソッドを定義すれば、

```csharp
public static IEnumerable<int> To(this int from, int to)
{
    return Enumerable.Range(from, to - from + 1);
}
```

こう書けます。

```csharp
1.To(2).Select(~
```

#2. 明示的型変換と演算子オーバーロード

[参考](http://hdmr.org/d/?e=7)
`(int)(2項演算子)(int)`みたいな記法でシーケンスを生成したいが、
C#は全く新しい2項演算子は作れないし、
今ある2項演算子(`+`とか`-`とか)をオーバーロードで潰すと困る。

というわけで`(int)(2項演算子)(変換演算子)(int)`とします。
今回は被験体となる2項演算子に`+`を使い、
変換演算子に`Range`を作ることにします。

```csharp
public struct Range
{
    int _right;
    public static implicit operator Range(int right)
    {
        return new Range() { _right = right };
    }

    public static IEnumerable<int> operator +(int left, Range right)
    {
        return Enumerable.Range(left, right._right -left + 1);
    }
}
```

こう書けます。

```csharp
(0+(Range)10).Select(~
```
<S>うん、キモい。</S>
RoswellのZsh補完関数を作った

RoswellのZsh補完関数を作ってみました．とりあえず動くと思いますが，無駄が多いかもしれません．

# インストール
補完関数は以下のGistにあります．
[_ros](https://gist.github.com/i-kiwamu/b21a9dc57ba7d2d7c40d)
これを `$fpath` の通ったディレクトリに入れます．典型的には `~/.zsh/functions` だと思います．以上です．

# TODO
- 各コマンドの補完関数の実装
- 長い説明文を短く（一行に収まらないと切られてる？）
CSSで見出しに連番を付ける（1つ目は除く）


```css
h2 {
	counter-increment: hn;
}
h2:before {
	content: counter(hn)". ";
}

/* 1つ目を除く */
h2:nth-of-type(1) {
	counter-increment: none;
}
h2:nth-of-type(1):before {
	content: '';
}
```

```html
<h2>もくじ</h2>
<ol>
	<li>見出し1</li>
	<li>見出し2</li>
	<li>見出し3</li>
	<li>見出し4</li>
</ol>

<h2>見出し1</h2>
<h2>見出し2</h2>
<h2>見出し3</h2>
<h2>見出し4</h2>
```

[デモ](http://codepen.io/tsukaguitar/pen/dYEaPZ)


## 雑感

今さら感全開ですが、もくじ（最初の見出し）除くというのは CMS がからむ案件で割と使いそうかな、と思ったのでスニペット化しておきました。

最初の1つ目みたいなルールがなく、特定の見出しに連番をふりたくない場合は、:nth-of-type(1) をクラス指定に変えればOK。

あと、CODEPEN をちょっと触ってみたかったというのも大きいです。クロスブラウザチェックできるとかなにこれすごい。以上、ご確認よろしくお願いいたします。
javascriptでapiのtestをする時に立ってるサーバーがphp -S localhost:8088だと動かない件

事の発端は、CakePHPでのファイルアップロードなんだよね。
ファイルアップロードはできるんだけど、これをどうやってテストしようかと。
CakePHPのControllerのテストで書いてみたり、Selenium入れてブラウザテストでやってみたり、したんだけど、どうもしっくり来ないのでJavaScriptでやろうかと。
なんかapiに対してpostデータを捏造して投げる（でしかも画像ファイルをpostできる）みたいなのnpmでありそうだよね、ということでいろいろ探してたら、
[supertest](https://www.npmjs.com/package/supertest)
 とか
[request](https://www.npmjs.com/package/request)
とかあることが分かった。

で、これをCakePHPの開発環境の `bin/cake server` で起動している
http://localhost:8765/
に対して実行すると、なんかエラーが返って来る。

```js
{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' }
```

一体なんなんだこりゃと悩むこと数ヶ月、やっと分かった。

localhost だとダメらしい。

```bash
bin/cake server -H 127.0.0.1 -p 8765
```

と起動しなおして

```js
request('http://127.0.0.1:8765').get('/').expect(200, done)
```
[（参照）](https://github.com/visionmedia/supertest)

とすれば動く。全く問題ない。
twitter gemでrate_limit_statusを叩きたいけどないので実装

# とりあえず実装

```rb
client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "..."
  config.consumer_secret     = "..."
end
res = Twitter::REST::Request.new(client, :get, '/1.1/application/rate_limit_status.json').perform
#ex.
p res[:resources][:search][:'/search/tweets'][:remaining]
```

# なぜ
[twitter gem](https://github.com/sferik/twitter)ではrate_limit_statusをサポートしていない。
以前は実装されていたが4.0.0で削除された様子。

なんで削除されたのかよくわからんと思ったら同様の人がいて
「TooManyRequestsをrescueすればよくね？」ということらしい。
>This feature has already been requested and rejected. Why do you need this method? Instead of checking your rate limit status, you could simply rescue Twitter::Error:TooManyRequests, as demonstrated on the wiki.
[Why was Twitter::API#rate_limit_status removed? #430](https://github.com/sferik/twitter/issues/430)

そうは言っても制限超える前にアラート上げたいようなときもある。
が、プルリク送ったところできっとrejectされるしHashのままでもそんなに困らないAPIなのでTwitter::REST::Request使って自前でお手軽に。
S3のファイルリストを取る方法

時々必要になるけど忘れがちな手順を共有します。この手順はコマンドラインから実行する方法です。Windowsでもできると思いますが、コマンド例などはMacのものです。

###必要なもの
- Python 2 version 2.6.5+ or Python 3 version 3.3+
- pip
- awscli

### How to install
- [ここ](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html)にある通りですが、
- `pip install awscli`

### How to get object list
- 表題ではファイルリストと書きましたが、S3上ではファイルはObjectと呼ばれます
- `aws s3 ls s3://<your bucket name>  --profile <your profile> --region ap-northeast-1 --recursive` 
- 上記コマンドでObjectのリストが以下のように、標準出力に出力されます

```
2015-05-22 17:35:08      15338 
2015/20150101/XXXXXXXXXXXXXX43/0000.jpg
2015-05-22 17:35:07      82694 
2015/20150102/XXXXXXXXXXX92043/0001.jpg
2015-05-22 17:35:02      82694 
2015/20150518/XXXXXXXXX5192043/1000.jpg
...
```

- JPGファイルだけを出力する場合の例:

```
aws s3 ls s3://<your bucket name> --profile <your profile> --region ap-northeast-1 --recursive | grep jpg | sed 's/[\t ]\+/\t/g' |  awk -F '/' '{ print $NF }'
```

### How to set profile
- `~/.aws/credentials` に以下の内容を定義

```
[your profilename]
aws_access_key_id = AXXXXXXXXXXX
aws_secret_access_key = PXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
Arduino LeonardでATmega328PにBootloaderを書き込む(IDE1.6.6)

Arudinoを自作したいと思い、手元にあったArduino LeonardでATmega328Pに書き込んでみました。

ネットの情報を色々調べてみたところ、すんなり出来ないかと思いきや、
Arudino IDE1.6.6になって簡単に出来たので記事にしてみます。

![thumb_IMG_0691_1024_edit.jpg](https://qiita-image-store.s3.amazonaws.com/0/35897/2354d0d5-1b39-1e4e-e0a4-4b52bf92ae92.jpeg "thumb_IMG_0691_1024_edit.jpg")


##用意するもの##

+ PC（私はMacですがWindowsでも同じかと思います）
+ Arduino Leonard（以降Arduinoと記載します）
+ Arduino IDE1.6.6
+ ATmega328P-PU
+ 水晶振動子 16MHz
+ セラミックコンデンサ 22pFを2個（私は18pFを2個を使用しました）
+ カーボン抵抗 10KΩ（私は22KΩを使用しました）
+ ブレッドボード
+ ジャンパワイヤ

##あるといいもの##
ArduinoでBootLoader書き込みプログラムが正常動作しているか
確認するために使用します。

+ LED 2.8〜3.6V 20mA
+ カーボン抵抗 300KΩ


##手順##

1. ArduinoにBootloader書き込み用のスケッチを書き込む
2. ブレッドボードに回路を組む
3. Arduinoとブレッドボードを接続する
4. ATmega328PにBootloaderを書き込む

###手順の詳細###

####1.ArduinoにBootloader書き込み用のスケッチを書き込む####
メニューから[ファイル]→[スケッチの例]→[11.ArduinoISP]→[ArduinoISP]を選択します。
![arduino_ide.png](https://qiita-image-store.s3.amazonaws.com/0/35897/8f90e57f-7462-985b-097c-be1eee58b160.png "arduino_ide.png")

ArduinoとPCをUSBケーブルで接続して、メニューの[ツール]から以下の項目を設定します。

+ マイコンボード → "Arduino Leonard"
+ シリアルポート → Arduinoを接続しているポート
+ 書き込み装置 → "AVRISP mkⅡ"

![arduino_toolmenu.png](https://qiita-image-store.s3.amazonaws.com/0/35897/3d0b75fe-c9ea-b259-6652-2598d756f2d3.png "arduino_toolmenu.png")



開いたスケッチをArduinoに書き込みます。

古いIDEではリセットピン番号の定義部分の記述を修正する必要があったみたいですが、
1.6.6では修正されているため不要です。


####2.ブレッドボードに回路を組む####
[Arduino Leonardo as ISP](http://www.instructables.com/id/Arduino-Leonardo-as-Isp/?ALLSTEPS)のStep 4の画像を参考にブレッドボード上で外部クロックを使用した回路を組みます。


注意点は外部クロックを使用することです。
IDEに手を入れれば外部クロックが無くても出来るみたいですが、私はうまくいきませんでした。。
詳細は[簡単！ATmega328Pにブートローダを書きこむ(第2弾)](http://blog-yama.a-quest.com/?eid=970164)を参照してください。


####3.Arduinoとブレッドボードを接続する####
[Arduino Leonardo as ISP](http://www.instructables.com/id/Arduino-Leonardo-as-Isp/?ALLSTEPS)のStep 5の画像を参考にArduinoとブレッドボードを配線します。

Leonardでは両サイドにあるピンではなく、USBコネクタと反対側にあるICSPの6ピンに接続します。


####4.ATmega328PにBootloaderを書き込む####
メニューの[ツール]から以下の項目を設定します。

+ マイコンボード → "Arduino Duemilanove or Dieclimila"
+ シリアルポート → Arduinoを接続しているポート
+ 書き込み装置 → "ATmega328"

![arduino_burn.png](https://qiita-image-store.s3.amazonaws.com/0/35897/9d925624-976a-8dbd-ee6f-ec038bce7edc.png "arduino_burn.png")

上記設定後、メニューの[ツール]→[ブートローダを書き込む]を選択すると書き込みが始まります。

うまくいけば、3秒ぐらいで書き込みが完了します。

以上で完了です。
誰かの参考になることを願ってます。

##おまけ##

書き込む度に配線するのが面倒くさいと思って、シールド化してみました。

| 表 | 裏 |
|:--:|:--:|
|![IMG_0699_edit.jpg](https://qiita-image-store.s3.amazonaws.com/0/35897/e6550f31-f3cd-3f8a-e591-09f7f03780c6.jpeg "IMG_0699_edit.jpg")|![IMG_0701_edit.jpg](https://qiita-image-store.s3.amazonaws.com/0/35897/7922fedc-cd47-638d-abd7-0eee7c000255.jpeg "IMG_0701_edit.jpg")|

間違ってanalog referenceのピンをハンダ付けしてしまいました。
普通はいらないです。
Array#each のブロック内で配列の長さを変更したらどうなる?


あまり使うシチュエーションもなさそうだが、興味があったので調べてみた。
Ruby のバージョンは下記の通り。

```bash
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 5Th0295) [x86_64-darwin14]
```

# 実験

```ruby
a = (0..9).to_a
b = (10..14).to_a
a.each do |i|
  if i == 0
    a.concat(b) # 1 回目のループで末尾に要素追加
  end
  puts i
end
```

```
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
```


末尾に追加した要素も列挙されるようだ。
最初のほうの要素を削除したらどうなるだろう。

```ruby
a = (0..9).to_a
a.each do |i|
  if i == 0
    a[0..1] = [] # 1 回目のループで最初の 2 要素を削除
  end
  puts i
end
```

```
0
3
4
5
6
7
8
9
```

1 度目のブロック実行後、a は `[2, 3, 4, 5, 6, 7, 8, 9]` になっている。
つまり 2 度目のブロックには `a[1]` が渡されているようだ。

これらの挙動から次のことが予想できる。

- ブロック実行毎にインデックスをインクリメントして、ブロック実行直前に要素を取り出している。
- 終了条件のチェックでは毎回、配列の長さを調べ直している。

実装を確認してみよう。

# 実装の確認

array.c というファイルがあるので、ここに実装がありそう。これかな。

```cpp
// https://github.com/ruby/ruby/blob/trunk/array.c#L1808
VALUE
rb_ary_each(VALUE ary)
{
    long i;

    RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
    for (i=0; i<RARRAY_LEN(ary); i++) {
	rb_yield(RARRAY_AREF(ary, i));
    }
    return ary;
}

// いちおう rb_define_method で Ruby のメソッドと対応してることを確認する。
// https://github.com/ruby/ruby/blob/trunk/array.c#L5810
    rb_define_method(rb_cArray, "each", rb_ary_each, 0);
```

`RETURN_SIZED_ENUMERATOR` は block がなければ Enumerator を返すマクロっぽい。
`RARRAY_LEN` は配列の要素数の取得、`RARRAY_AREF` はインデックスから要素を取得するマクロだろう (名称と文脈からの推測)。

Ruby で書けばこんな感じだ。
ただし、実際には length や size メソッドを呼んでいるわけではないので、これらのメソッドを上書きしても挙動は変わらない。

```ruby
class Array
  def each
    return enum_for unless block_given?
    i = 0
    while i < length
      yield self[i]
      i += 1
    end
  end
end
```

前節で予想した内容と一致した。
UIImage の画素データを Array で取得する方法

`UIImage` の画像は作りやすいです。適当に例えば `UIImage(named: "SomeImage.png")` で書けばとりあえず iOS や OS X で使う画像データをつくれます。ところが、時には画像そのものでなく。画像の中身のデータ、すなわち画素データを配列で欲しい時もあったりします。例えば画像解析する時とかですね。では、画素データをどうすれば取得できるでしょうか？結構いろいろググってみたけどなかなか最適解が見当たらなかったのですけど、一番手取り早く簡単かつ速い方法ですと下記のような感じですかね

```swift
func getByteArrayFromImage(imageRef: CGImageRef) -> [UInt8] {
	
	let data = CGDataProviderCopyData(CGImageGetDataProvider(imageRef))
	let length = CFDataGetLength(data)
	var rawData = [UInt8](count: length, repeatedValue: 0)
	CFDataGetBytes(data, CFRange(location: 0, length: length), &rawData)
	
	return rawData
	
}
```

上記の方法ですと、`CGImageRef` データを渡せば `[UInt8]` 形式で画素データを渡してくれます。`CGImageRef` は基本 `UIImageObject.CGImage` で取得できるので簡単です。あとは画像データと同じ大きさな仮の配列 `rawData` を用意すれば `CFDataGetBytes` で画像データを `rawData` に転送できます。C言語で言う `memcpy` と同じような動作（多分）なので `for` 文を回す必要がなく、`NSData` になおして一個ずつバイトデータを配列に書き込むより遥かに速いはずです。使い方は下記のように使えば OK です：

```swift
let imageRef = UIImage(named: "SomeImage.png")!.CGImage!
let imageData = getByteArrayFromImage(imageRef)
```

これで `imageData` と言う `[UInt8]` の配列が得られますので、あとはどのようにそのデータを使って解析するかだけです。

ちなみに、得られた `imageData` は、RGBA の順番でピクセルを表しています。つまり `imageData[0]` は 1 つ目のピクセルの `red` の値、`imageData[1]` は 1 つ目のピクセルの `green` の値、……そして `imageData[4]` は 2 つ目のピクセルの `red` の値、といった感じです。
attr_accessor は普通にメソッド定義するより速い


[Ruby のしくみ](http://tatsu-zine.com/books/ruby-under-a-microscope-ja) を読んでたら、attr_accessor、attr_reader、attr_writer で定義されるメソッドは最適化されるので、普通にメソッド定義した場合よりパフォーマンスがよい、との記述があった (pp. 108-109 "attr_reader と attr_writer におけるメソッドディスパッチの最適化") ので、調べてみた。

```ruby
# Comparison of attr_(accessor|reader|writer) and regular method

require "benchmark"

class Person
  attr_accessor :first_name

  def last_name
    @last_name
  end

  def last_name=(v)
    @last_name = v
  end
end

N = 10_000_000

puts "Writing:"
person = Person.new
Benchmark.bm do |x|
  x.report("attr_accessor") { N.times{ person.first_name = 1 } }
  x.report("def          ") { N.times{ person.last_name  = 1 } }
end

puts
puts "Reading:"
person = Person.new
Benchmark.bm do |x|
  x.report("attr_accessor") { N.times{ person.first_name } }
  x.report("def          ") { N.times{ person.last_name  } }
end

# ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
#
# Writing:
#        user     system      total        real
# attr_accessor  0.750000   0.000000   0.750000 (  0.756376)
# def            1.040000   0.000000   1.040000 (  1.038265)
#
# Reading:
#        user     system      total        real
# attr_accessor  0.720000   0.000000   0.720000 (  0.720550)
# def            1.020000   0.010000   1.030000 (  1.020958)
```

確かに速い。
複数の after_commit / after_rollback は定義と逆順で実行される


# 発端

ActiveRecord で `after_create` 使って処理を書いてたけど、ActiveJob で実行するように変更する、という状況で、トランザクション後に処理できるよう `after_commit` に書き換えていた。

すると、module を分けて複数コールバックを定義していた箇所で、テストが失敗していた。debugger で見てみると、以前と逆順でコールバックが実行されているようにみえる。

# 調査

下記のようなコードを書いて確かめた。

```bash
$ rails new callback_order
$ cd callback_order
$ rails g model book title
```

```ruby
class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.string :title, null: false

      t.timestamps null: false
    end
  end
end
```

```ruby
class Book < ActiveRecord::Base
  before_validation do
    puts "before_validation #1"
  end

  before_validation do
    puts "before_validation #2"
  end

  after_validation do
    puts "after_validation #1"
  end

  after_validation do
    puts "after_validation #2"
  end

  before_save do
    puts "before_save #1"
  end

  before_save do
    puts "before_save #2"
  end

  before_create do
    puts "before_create #1"
  end

  before_create do
    puts "before_create #2"
  end

  after_create do
    puts "after_create #1"
  end

  after_create do
    puts "after_create #2"
  end

  after_save do
    puts "after_save #1"
  end

  after_save do
    puts "after_save #2"
  end

  after_commit do
    puts "after_commit #1"
  end

  after_commit do
    puts "after_commit #2"
  end

  after_rollback do
    puts "after_rollback #1"
  end

  after_rollback do
    puts "after_rollback #2"
  end

  before_destroy do
    puts "before_destroy #1"
  end

  before_destroy do
    puts "before_destroy #2"
  end

  after_destroy do
    puts "after_destroy #1"
  end

  after_destroy do
    puts "after_destroy #2"
  end
end
```

```
# create and commit
$ rails runner 'Book.create(title: "Martian")'
before_validation #1
before_validation #2
after_validation #1
after_validation #2
before_save #1
before_save #2
before_create #1
before_create #2
after_create #1
after_create #2
after_save #1
after_save #2
after_commit #2
after_commit #1
```

```
# create and rollback
$ rails runner 'Book.create'
before_validation #1
before_validation #2
after_validation #1
after_validation #2
before_save #1
before_save #2
before_create #1
before_create #2
after_rollback #2
after_rollback #1
...
```

```
# create, destroy and commit
$ rails runner 'Book.create(title: "Martian").destroy'
before_validation #1
before_validation #2
after_validation #1
after_validation #2
before_save #1
before_save #2
before_create #1
before_create #2
after_create #1
after_create #2
after_save #1
after_save #2
after_commit #2
after_commit #1
before_destroy #1
before_destroy #2
after_destroy #1
after_destroy #2
after_commit #2
after_commit #1
```

こうしてみてみると、`after_commit` と `after_rollback` のみ、定義と逆順で実行されるようだ。

# issue

issue が上がっていた。

- [after_commit order inconsistent with other callbacks · Issue #20911 · rails/rails](https://github.com/rails/rails/issues/20911)

# 余談

ちなみに通常 after_commit を使ったテストで transactional fixture を使ってる場合は、test_after_commit gem を使う必要がある。
SonarQubeの設定

昔いれた、SonarQubeの設定手順。
大体は公式ドキュメントを見ながらやったはずだが、うろおぼえなので、若干まちがってるかも・・・

javadocコメントのカバレッジを見たくなったので、jenkinsともういちど連携させることにした。
jenkinsとの連携の手順を今回は省く。

# インストール

/usr/localに、sonar-3.7.4.zipとsonar-runner-dist-2.4.zipを展開

## sonar-server
Sonar用のDB（sonar）をあらかじめつくっておき、接続情報は/usr/local/sonar-3.7.4/conf/sonar.propertiesに記述。今回はMySQLを使用。PostgreやOracleも行ける模様。

他にも、webアプリのポート、パスなど、基本的なことはここで決めている。

以下、主要なところを抜粋

```lang:sonar.properties

# Listen host/port and context path (for example / or /sonar). Default values are 0.0.0.0:9000/.
sonar.web.host:                           0.0.0.0
sonar.web.port:                           9200
sonar.web.context:                        /sonar

# The schema must be created first.
sonar.jdbc.username:                       sonar
sonar.jdbc.password:                       sonar_pass

#----- MySQL 5.x
# Comment the embedded database and uncomment the following line to use MySQL
sonar.jdbc.url:                            jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
```

bin以下に、各OSごとに起動スクリプトがあるので、該当するのを/usr/binにコピー

`cp /usr/local/sonar-3.7.4/bin/linux-x86-64/sonar.sh /usr/bin/sonar`

そして、次のものを/etc/init.d/sonar　に作成してサービスとして登録

```lang:/etc/init.d/sonar
#!/bin/sh
#
# rc file for SonarQube
#
# chkconfig: 345 96 10
# description: SonarQube system (www.sonarsource.org)
#
### BEGIN INIT INFO
# Provides: sonar
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: SonarQube system (www.sonarsource.org)
# Description: SonarQube system (www.sonarsource.org)
### END INIT INFO

/usr/bin/sonar $*
```

これで、`service sonar start` でwebアプリが起動するはず。
sonar.propertiesに設定したアドレスにアクセスして確認。
http://localhost:9200/sonar

## sonar-runner 
runnerの方は、サーバとDBの接続情報を設定する。/usr/local/sonar-runner-2.4/conf/sonar-runner.propertiesがその設定ファイル。

```lang:sonar-runner.properties
#----- Default SonarQube server
sonar.host.url=http://localhost:9200/sonar

#----- MySQL
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8

#----- Global database settings
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar_pass
```

解析したいソースのルートディレクトリに、sonar-project.propertiesを作成し、ソースやバイナリのディレクトリなどを指定する。

```lang:sonar-project.properties
# Required metadata
sonar.projectKey=HogeKey
sonar.projectName=Hoge
sonar.projectVersion=0.1

# Path to the parent source code directory.
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional. If not set, SonarQube starts looking for source code
# from the directory containing the sonar-project.properties file.
sonar.sources=app
sonar.binaries=target
sonar.tests=test

# Encoding of the source code
sonar.sourceEncoding=UTF-8
```

上記がある場所でsonar-runnerを実行すれば、解析がはじまる。パスを通していない状態なら下記で実行。
`/usr/local/sonar-runner-2.4/bin/sonar-runner`

# 解析でわかること

標準でも

* LOC
* クラス数、メソッド数
* javadocコメントをつけたAPIの比率
* 重複率
* 複雑度

などがわかる。sonar-project.propertiesでバージョンを管理していれば、以前のバージョンとの比較ができる。
UITabBarControllerDelegateのdidSelectViewControllerが呼ばれない


## 原因
UITabBarController#selectedIndex= をつかって、プログラムからタブをスイッチすると、delegateのdidSelectViewControllerが呼ばれない。

## 対策
```swift
import UIKit

class MyTabBarController: UITabBarController {

    override var selectedIndex: Int {
        didSet {
            self.delegate?.tabBarController?(self, didSelectViewController: self.viewControllers![selectedIndex])
        }
    }
    
    override func viewDidLoad() {
        self.delegate = self
    }
}

extension MyTabBarController: UITabBarControllerDelegate {
        func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
            Log.d(nil, "タブがスイッチされました!")
        }
}
```

こうすることで、プログラムからスイッチする場合も、タブバーのItemをタップからスイッチする場合も、動揺にコールバックを呼ばせることができる

## 愚痴
なんで読んでくれないのだ。
しかし、iOSのVersionUPで、急に呼ぶようになったら死ぬアプリがかなりありそう。
swiftのswitch文で型で分岐する書き方

## 追記
こちらの書き方が可能のようです。
こっちで書きましょう
https://developers.eure.jp/event/10-tips-when-moving-from-objective-c-to-swift-ja/?utm_source=dlvr.it&utm_medium=twitter

## switch文
```swift
switch someValue {
case _ as Int:
    Log.d(nil, "This is Int")
case _ as String:
    Log.d(nil, "This is String")
case _ as Hoge:
    Log.d(nil, "This is Hoge")
default:
    // unknown case
    break
}
```

## if文で同じ処理
```swift
if someValue is Int {
    Log.d(nil, "This is Int")
}else if someValue is String {
    Log.d(nil, "This is String")
}else if someValue is Hoge {
    Log.d(nil, "This is Hoge")
}else {
    // unknown case
}
```
Linuxでプロセスが何のポート使っているかを調べる

Linux（CentOS）で何のプロセスが何のポート使っているかを調べることがあったので。
大抵のことは以下のコマンドでどうにかなるのではないでしょうか。

# lsof

## プロセスが使用しているポートを表示する

```
lsof -i
```

## ポート番号から使用しているプログラムを表示する

```
lsof -i:ポート番号
```

自分以外のプロセスに関しても調べる場合は、管理者権限で行う。

例）
80番のポートを調べる。

```
lsof -i:80
```

# ss or netstat

`netstat`コマンドは`CentOS 7`から非推奨となりました。
代わりに、`ss`コマンドが推奨されています。

## 接続待ちをしているTCP、UDPポートを表示する

```
ss -antu
netstat -antu
```

- -a：現在のすべての接続を表示する
- -n：一切の名前解決を行わない
- -t：TCPポートを表示する
- -u：UDPポートを表示する

## 通信が確立しているtcpポートの状況を調べる

```
ss -t
netstat -t
```

# 参考URL
- [Linuxのポート状況を確認する(netstat)](http://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html)
- [ポートを使用しているプロセスを確認する](http://linuxtips.biz/080/post_38.html)
- [CentOS7から変わったネットワーク系のコマンド](https://qiita.com/haisaihiroki/items/87fe137f00b5c625f607)
ResourceBundleでJPAユニットを切り替える

# はじめに
persistence.xmlに複数のpersistence-unitを用意して使用するセッション数を切り替えたいという要望があり、作ってみたのでその方法の紹介です。
といっても、そんなにたいしたことはしていません。あくまでやり方の一つとしてこんな方法もありますよ、というレベルのお話で、もっといい方法があれば教えてください。


# 前提となる状況
DAOやEntityの入っている共通プロジェクトにpersistence.xmlがあります。このpersistence.xmlには複数のpersistence-unitが記述されており、共通プロジェクトを利用するプロジェクトでユニットを切り替えたいという状況でした。なお、共通プロジェクトはビルド後にjarになり利用するプロジェクトに内包されます。また、ユニット名は各DAOのコンストラクタで定数で指定するようになっています。

# 実現方法
ResourceBundleを使い各利用するプロジェクトで異なるユニット名を指定したpropertiesファイルを用意し、共通プロジェクトで異なる設定内容をロードさせる。

利用するプロジェクトのクラスパス上にcommon.propertiesファイルを作成し、内容を以下のようにする。

```properties:common
persistence_unit_name=unit1
```

上記ファイルを読み込めるようにロードする以下のようなクラスを用意する

```java:CommonProperties
public class CommonProperties {
    private static ResourceBundle rb = ResourceBundle.getBundle("common");
    
    public static final String PERSISTENCE_UNIT_NAME = rb.getString("persistence_unit_name");
}
```

DAOのコンストラクタでユニット名をセットする

```java:HogeDao
public class HogeDao {
    private EntityManager em;
    public HogeDao() {
        try {
            InitialContext iContext = new initialContext();
            Context context = (Context) iContext.lookup("java:comp/env");
            em = (EntityManager) context.lookup(CommonProperties.PERSISTENCE_UNIT_NAME);
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
```

これで実装はOKです。これで他の利用するプロジェクトが違うユニットを使う場合はcommon.propertiesの値を変えてあげればユニットを切り替えて使うことが出来ます。

ただ、これだと利用するプロジェクトで必ずクラスパス上にcommon.propertiesが無いとエラーになります。その点ご注意を。
VagrantのShell Provisionerはrootで実行される

Vagrantのshellプロビジョニングでよくsudoを使ったスクリプトを見かけますが、Shell Provisionerはデフォルトでは`root`で実行されるので基本的にsudoは不要だったりします。
自分もつい最近まで`vagrant`ユーザで実行されるものだと思い込んでいて全部sudoで書いていました。
（`root`がsudoを使っても別にいいと思うので、どちらでも実行できるようにsudoで書いておくという考えもなくはないかもしれない）


[Shell Scripts - Provisioning - Vagrant Documentation](https://docs.vagrantup.com/v2/provisioning/shell.html) より：

    privileged (boolean) - Specifies whether to execute the shell script as a privileged user or not (sudo). By default this is "true". This has no effect for Windows guests.

`privileged`オプションが`true`だと`root`で実行されるようです。そしてデフォルトは`true`と。

この辺を見ると（スクリプト自体が）sudoで実行されそうな感じが伝わってきます。
https://github.com/mitchellh/vagrant/blob/master/plugins/provisioners/shell/provisioner.rb#L87

こんな実験。

```rb
config.vm.provision "shell", inline: <<-SHELL
  whoami      #=> root
  echo $HOME  #=> /root
SHELL
```

```rb
config.vm.provision "shell", privileged: false, inline: <<-SHELL
  whoami      #=> vagrant
  echo $HOME  #=> /home/vagrant
SHELL
```

`root`の時にsudoを実行してもたいして問題はありませんが、`$HOME`を参照する際は注意が必要そうですね。というか`/home/vagrant`だと思い込んでいたのではまりました。



たぶん、デフォルトでこんなのが書かれているのが原因なんじゃないですかね。
（2016-07-22現在、sudoがない形にコメントのサンプルが修正されていました）

```rb
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
#   sudo apt-get update
#   sudo apt-get install -y apache2
# SHELL
```

sudo使ってるし。
CarrierWave のストレージに fog を使い、S3にファイルを保存したい際に uninitialized constant CarrierWave::Storage::Fog というエラーが出る場合の対処

## 問題

CarrierWave のストレージに fog を使い、保存先を Amazon S3 にしたい場合、

CarrierWave のドキュメント [carrierwaveuploader/carrierwave](https://github.com/carrierwaveuploader/carrierwave#using-amazon-s3) の設定を参考に fog-aws を導入するとエラーとなります。

```rb
gem 'fog-aws'
```
↓

```
uninitialized constant CarrierWave::Storage::Fog
# backtrace line: ~/app/config/initializers/carrierwave.rb:4 (see below)
```

## 解決

fog-aws の代わりに fog を使いましょう。

```rb
gem 'fog'
```

fog 側で Issue となっています。
CarrierWave 側でファイルが require されていなく、fog側で fog-storage のような gem を提供するなど、別の対応を考えているようです。
https://github.com/fog/fog/issues/3429
入力フォームの郵便番号で入力補助

お世話になります。
内容はタイトル通りなのですが、現在入力フォームの郵便番号の入力補助機能を作成しているのですが、jqueryの読み込みでエラーが出てつまずいてしまいました、すごく初歩的なことでお恥ずかしいのですがご教授いただければ幸いです。

全体的な流れを記載します

1.郵政省からダウンロードしたCSVをコンバートして必要な情報だけにする←ここの実装はできています
2.入力フォームで入力された郵便番号をAJAXでapi.phpに渡し候補をコールバック

※1前提として、グーグル・マップAPI、ライブラリ等は使用しないことを考えています

```form.html
<!DOCTYPE html>
<html>
<head>
<title>郵便番号で住所入力補助</title>
<meta charset="utf-8">
<script src="../js/jquery-1.11.3.min.js"></script>
 
<script type="text/javascript">
$(document).ready(function(){
    $("#lookup").click(function(){
        var zip1 = $.trim($('#zip1').val());
        var zip2 = $.trim($('#zip2').val());
        var zipcode = zip1 + zip2;
 
        $.ajax({
            type: "post",
            url: "api.php",
            data: JSON.stringify(zipcode),
            crossDomain: false,
            dataType : "jsonp",
            scriptCharset: 'utf-8'
        }).done(function(data){
            if(data[0] == ""){
                alert('見つかりませんでした。');
            } else {
                $('#address').val(data[0] + data[1] + data[2]);
            }
        }).fail(function(XMLHttpRequest, textStatus, errorThrown){
            alert(errorThrown);
        });
     });
});
</script>
</head>
<body>
<form>
    <p>郵便番号：<input type="text" name="zip1" id="zip1" size="6">-<input type="text" name="zip2" id="zip2" size="6">
    <input type="button" id="lookup" value="郵便番号で検索"></p>
    <p>住所：<input size="50" type="text" name="address" id="address"></p>
</form>
</body>
</html>
```

```api.php
<?php
$dir = __DIR__ . '/zipcode';
 
// Ajax以外からのアクセスを遮断
$request = (string)filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH');
if(strtolower($request) !== 'xmlhttprequest') exit;
 
$json = file_get_contents('php://input');
$data = json_decode($json, true);
file_put_contents('test.log', print_r($data, true));
$zipcode = !empty($data) ? $data : '';
$zipcode = mb_convert_kana($zipcode, 'a', 'utf-8');
$zipcode = preg_replace('/[\sー-]/', '', $zipcode);
 
$callback  = (string)filter_input(INPUT_GET, 'callback');
$callback  = htmlspecialchars(strip_tags($callback));
 
$param = array('', '', '');
 
$file = $dir . DIRECTORY_SEPARATOR . substr($zipcode, 0, 1) . '.csv';
if(file_exists($file)){
    $spl = new SplFileObject($file);
    while (!$spl->eof()) {
        $columns = $spl->fgetcsv();
        if(isset($columns[0]) && $columns[0] == $zipcode){
            $param = array($columns[1], $columns[2], $columns[3]);
            break;
        }
    }
}
 
header('Content-type: application/javascript; charset=utf-8');
printf("{$callback}(%s)", json_encode( $param ));
```
デバッグ用プロキシをさくっと立ち上げるコマンド"replocal"を作った

# replocal
**[replocal](https://github.com/htanjo/replocal)**は、Webデバッグ用のローカルプロキシを起動するコマンドラインツールです。

replocalのプロキシサーバは、特定のHTTPリクエストをキャッチして、Webコンテンツをローカルファイルの内容に置き換えます。たとえば既存のWebサイトに対して、JSだけローカルの開発コードに差し替えて検証したい…といったときに役立ちます。

ちょっとしたデバッグの際、[Fiddler](http://www.telerik.com/fiddler)や[Charles](http://www.charlesproxy.com/)を使わずにコマンド一発で起動できるツールがあると便利かと思い作りました。

```
$ replocal example.com
```

直接接続だと本来のコンテンツ、プロキシを差すとローカルファイルが表示されます。

![replocal](https://qiita-image-store.s3.amazonaws.com/0/67488/790759b1-ab1f-0b0a-a207-7125157791e1.png)

## インストール
Node.jsを使っています。npmでインストールします。

```
$ npm install -g replocal
```

## 使い方
```sh
$ replocal example.com
```

コマンドを実行すると、`localhost:8888`にプロキシサーバが立ち上がります。

このプロキシを差して`http://example.com/`にアクセスすると、本来のページの代わりにカレントディレクトリ内の`index.html`が表示されます。
ローカルに`index.html`がない場合は、元のページがそのまま見えます。

もちろんCSSやJavaScript、画像などを置き換えることもできます。ディレクトリの階層も反映されます。

## コマンド詳細
```sh
replocal [options] <hostname> [<directory>]
```

デフォルトの設定では、カレントディレクトリが対象サイトのドキュメントルートに対応します。
第2引数`<directory>`を指定すると、他のローカルフォルダをドキュメントルートにマッピングできます。

また、`-p`, `--port`オプションを使って、プロキシサーバの起動ポートを変更できます。

### 例
```sh
$ replocal --port=9999 example.com path/to/docroot

# Proxy server is running on http://localhost:9999
#   Target website : example.com
#   Document root  : path/to/docroot
```

オプションの一覧は、`replocal --help`か[ドキュメント](https://github.com/htanjo/replocal#readme)を参照してください。

## 課題点
- HTTPSに対応していません。技術的には対応可能ですが、環境ごとのセットアップが別途必要で少し難しいです。
- 深い階層のページを置き換えるには、ローカルにもサブディレクトリをたくさん切って再現しないといけません。頑張れば、特定のURL配下をターゲット指定できるようになるかも…。

## GitHubリポジトリ
<https://github.com/htanjo/replocal>

ご意見やご要望がありましたら、[Issues](https://github.com/htanjo/replocal/issues)／[Pull requests](https://github.com/htanjo/replocal/pulls)まで。日本語大丈夫デース！
tailコマンドを使って、ログファイルから特定の文字列を含む行のみ抽出して表示させる


## やりたいこと
- ログファイルから入力した文字列を含む行だけを抽出して表示したい
- 複数単語に対応したい

## コード

```bash:log.sh
$ #!/bin/sh
$ read -a input
$ result=`echo ${input[@]} | sed -e "s/ /\\\\\\|/g"`
$ echo $result
$ tail -f log.txt | grep --line-buffered "$result"
```

```bash:
read -a # 入力を受け付けて、入力を配列に格納する
sed -e # 文字列置換
"s/ /\\\\\\|/g" # 正規表現(バックスラッシュがたくさんになるのは展開が三回行われるから)
tail -f # ファイルの末尾を出力する
```

## 実行
```bash:
$ sh log.sh
# 入力待ちになるので、出力したい文字列をスペース区切りで入力
> test hoge

> test または hoge を含む行のみが出力されます
```
RabbitMQからjavaからつかう（メモ）

AWSのSQS以外に、キューの仕組みの選択肢がないかの下調べのメモ


# RabbitMQ

erlangで動いている。
javaのバージョンがかえられないときは逆に使えるかも。

https://www.rabbitmq.com/features.html

java clientは1.5以上から使える。

CloudAMQP　のfree　プランでサーバをたてる
https://www.cloudamqp.com/
Golang Goの並列処理を学ぶ(select)

[Golang goの並列処理を学ぶ](http://qiita.com/TakaakiFuruse/items/241578174fd2f00aaa8a)　の続き

1秒待つ､2秒待つ､3秒待つ､という処理は順番にやると6秒かかります｡それを一気にまとめて3秒でやってしまおう､というコード｡

1秒待つ処理が終わったら　1
2秒待つ処理が終わったら　2
3秒待つ処理が終わったら　3
を送信して､ "finished (数字)"というのを出力してやることにします｡

[ここ](https://gobyexample.com/select)を参考にしてみました｡

```go
package main

import (
	"fmt"
	"log"
	"time"
)

func wait1(c chan string) {
	time.Sleep(1 * time.Second)
	c <- "1"
}

func wait2(c chan string) {
	time.Sleep(2 * time.Second)
	c <- "2"
}

func wait3(c chan string) {
	time.Sleep(3 * time.Second)
	c <- "3"
}

func main() {
	c := make(chan string)
	log.Print("started")
	go wait1(c)
	go wait2(c)
	go wait3(c)
	for i := 0; i < 3; i++ {
		select {
		case msg1 := <-c:
			fmt.Println("finished", msg1)
		case msg2 := <-c:
			fmt.Println("finished", msg2)
		case msg3 := <-c:
			fmt.Println("finished", msg3)

		}
	}

	log.Print("finished")

}

```

きっちり三秒で終わりました｡

```go
2015/11/25 10:57:44 started
finished 1
finished 2
finished 3
2015/11/25 10:57:47 finished

```

でもこうすると

```go
func main() {
	c := make(chan string)
	log.Print("started")
	go wait1(c)
	go wait2(c)
	go wait3(c)
	for {
		select {
		case msg1 := <-c:
			fmt.Println("finished", msg1)
		case msg2 := <-c:
			fmt.Println("finished", msg2)
		case msg3 := <-c:
			fmt.Println("finished", msg3)

		}
	}
```

```go
2015/11/25 11:08:37 started
finished 1
finished 2
finished 3
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [select]:
main.main()
        /home/test.go:31 +0x7a7
exit status 2

```

エラーが出てしまいます｡
なんでForループを使わないとエラーが出るのかはよくわかりません｡

for i := 0; i < 10; i++ {

のように､チャンネルより多い数を指定してもエラーが出るみたいですね｡
少ない数だとその数だけしか処理してくれないみたいです｡
[メモ] オープンソースのcantools の libcandbcで、.dbcファイルの読み込み

".dbc" ファイルは、そのスジ(車関係)の方々はよくよくご存知かと思います。

Cのプログラムで簡単に使いたい、というとき、[cantools](http://sourceforge.net/projects/cantools/) に含まれる、`libcandbc` を使うと、簡単に読み込みできます。
.lとか、.y のファイルがありますが、cのファイルを生成してくれているようなので、それらは気にしなくていいようです。

\# ライセンスは、GPLv2。 なので、**その辺**は注意。


## (例) Visual Studioで使ってみる 
1. .dbcのデータをさがしてくる。(`j1939_utf8.dbc`とかで検索?)
2. Projectのページで、ファイルダウンロードして解凍するか、svnで取得する。
3. `cantools-code/src/libcandbc`　のみ使用するので、うまいとこにコピーする。
4. サンプルコード(↓の`tetdbc.c`)を同じフォルダに作成。
5. Visual Studioを立ち上げて、 File => New => Project From Exsisting Code...から
6. `Visual C++` [Next]で、`Project file location:`に先ほどのフォルダ、`Project name:`をてきとうに (`testdbc`とか)いれて、[Next]
7. `Project type:`は、`Console application project` (printfを使ってるので...)で、[Next]、[Next]、[Finish]
8. Solution Explorerで、testdbcのプロジェクトプロパティを開いて(右クリ-> Properties)、
 - `VC++ Directries` の `Include Directries`に `.;`を入れて、[Apply] => <font color='red'>**.;**</font>\$(VC_IncludePath);\$(WindowsSDK_IncludePath);
 - `C/C++` => `Preprocessor`の `Preprocessor Definisions`に `YY_NO_UNISTD_H;`を追加して、[Apply]
9. ビルドして、実行。






```c:testdbc.c
#include <stdio.h>
#include "dbcReader.h"

int main(int ac, char *av[])
{
	dbc_t *p; 
	
	p = dbc_read_file("./j1939_utf8.dbc");

	if (p == NULL) return -1;

	for (message_list_t *ml = p->message_list; ml != NULL; ml = ml->next)
	{
		printf("ID:$%08x - %s \n", ml->message->id, ml->message->name);
		for (signal_list_t *sl = ml->message->signal_list; sl != NULL; sl = sl->next)
		{
			printf("\t%s\n", sl->signal->name);
		}
	}

	return 0;
}
```


```text:実行結果
ID:$c0000000 - VECTOR__INDEPENDENT_SIG_MSG 
	TrailerWeight
	ReferenceTirePressSetting
	ReferenceTirePress
	TirePressThresholdDetection
	TireAirLeakageRate
	CTIWheelEndElectricalFault
	CTITireStatus
	CTIWheelSensorStatus
	TireTemp
	TirePress
ID:$88f02dfe - AccelerationSensor 
	SpprtVrblTrnsRpttnRtFrAcclrtnSns
	VrtclAcclrtnExRngeFigureOfMerit
	LngtdnlAcclrtnExRngFgureOfMerit
	LtrlAcclrtnExRangeFigureOfMerit
	VerticalAccelerationExRange
	LateralAccelerationExRange
	LongitudinalAccelerationExRange
ID:$98fceafe - VEP4 
	HybrdBatteryPackRemainingCharge
ID:$8cf029fe - SSI2 
	RllAndPtchExRngMsurementLatency
	RollAngleExRangeFigureOfMerit
	RollAngleExRangeCompensation
	PitchAngleExRangeFigureOfMerit
	PitchAngleExRangeCompensation
	RollAngleExRange
	PitchAngleExRange
...
...
...

ID:$9cfda7fe - VROM 
	VoltageRegulatorEnabled
	VoltageRegulatorSoftStartState
	VltgRgltrUndrfrqncyCmpnstnEnbld
	VltgRgltrVAr_PwrFctrOprtingMode
	VltgRglatorLoadCompensationMode
ID:$8cfda6fe - VREP 
	GnrtrOtputVoltageBiasPercentage
	GeneratorExcitationFieldCurrent
	GeneratorExcitationFieldVoltage
```
Trelloで複数タスクの終了予定時間を計算するブックマークレットを書いた

![image](https://qiita-image-store.s3.amazonaws.com/0/4140/62bfbb79-7734-7987-0f65-791b8ff1e570.png)

TrelloでToDo管理をするにあたり、カードのタイトルにに見積もり時間をいれるという使い方をしている。
その時に見積もり時間の通り終わったら何時になるのかというのが知りたかったのでブックマークレットを書いた。

# なぜ欲しいのか

今のペースで仕事をしていて定時に帰れるのかどうか知りたかった。（Trelloは使う前提）

# ブックマークレット

<a href="http://let.hatelabo.jp/toyoshi/let/hLHUp8KY8Y11" >Trelloのタスクの終了時間を計算するブックマークレット - Hatena::Let</a>
（リンク先から取得してください）

# 使い方

![image](https://qiita-image-store.s3.amazonaws.com/0/4140/d10a201f-e972-3e26-8341-25ac44271838.png)

上図は10:07にブックマークレットを起動して時間を計算した結果だ。
`To Do`というリストタイトル横に10:07 + （5分 + 25分 + 60分 + 60分）の結果である12:37というのが表示されているのがわかる。

計算方法は`*分`というのを探して合算しているだけなので、カードタイトルの数字は自分で時間を入れる必要があります。
Linuxで時刻設定後、ハードウェア再起動後や電源投入後に日時ずれが生じる場合の対応

# はじめに

Linuxで日時設定を行う場合、dateコマンドで以下のように行うと思います。

```
# date --set "2015/11/25 9:14:58"
```

しかし、サーバ（あるいは端末）をの電源断・再投入や、再起動を行うと、日付が数時間ずれる、１日あるいはそれ以上ずれる等、予期しない結果が生じる場合があります。

# 原因

Linuxでは、日時情報として「Local time」「Universal time」「RTC time」の３種類が管理されています。これはtimedatectlコマンドで確認することが出来ます。

```
# timedatectl
      Local time: 水 2015-11-25 09:23:38 JST
  Universal time: 水 2015-11-25 00:23:38 UTC
        RTC time: 木 2015-11-26 00:29:58
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

「Local time」は現地時刻、「Universal time」は世界標準時で、これらはシステムクロックと云われます。「RTC time」は、ハードウェアが持つ日時情報で、これはリアルタイムクロックと云われます。BIOS/UEFIで設定可能な日時情報と「RTC time」は同じものです。

うち、dateコマンドで反映されるのは「Local time」と「Universal time」の２つです。（正しくは、設定値が反映されるのは「Local time」で、「Universal time」は「Local time」の時差に合わせて結果が出力されるものです）

「RTC time」はdateコマンドで日時設定を行っても、その設定値が反映されません。また、NTPによる日時補正についても同様（「Local time」しか補正されない）となります。

# 対応

最もシンプルな方法は、BIOS/UEFIで日時を設定することです。しかし、既にLinuxが起動していて、再起動が難しい場合は、hwclockコマンドで「RTC time」を設定することができます。

dateコマンドで日時を設定した後に、hwclock --systohcを実行すると、「Local time」と「RTC time」が同期されます。

```
# date --set "2015/11/25 9:28:20"
# hwclock --systohc
```

上記実行後、timedatectlコマンドを実行すると、「Localtime」と「RTC time」が同期されていることがわかります。

```
# timedatectl
      Local time: 水 2015-11-25 09:28:26 JST
  Universal time: 水 2015-11-25 00:28:26 UTC
        RTC time: 水 2015-11-25 00:28:26
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

なお、NTPによる日時補正は、前述の通り「Local time」しか反映されませんので、「RTC time」の日時ずれが生じた際は、上記コマンドを実行する必要があります。１週間〜１ヶ月に１回程度cronで上記コマンドを定期的に実行するのが良いでしょう。
Android の WebView で signal 11 (SIGSEGV) が出る件の解決策

Android で WebView を使ってると、signal 11 (SIGSEGV) で落ちることが多々ありました。
具体的には、mWebView.reload(); や、adb から再インストール→起動した時、などに発生します。


調べたところ、次の組み合わせで落ちていた模様。

mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
mWebView.getSettings().setJavaScriptEnabled(true);

js ファイルのキャッシュが悪さをしている…？

<h1>解決策１：Javascript をオフにしてみる</h1>

mWebView.getSettings().setJavaScriptEnabled(false);

とりあえず落ちなくなりました。でも Javascript が使えないと困ります。

<h1>解決策２：キャッシュをオフにしてみる</h1>

mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

これでも落ちなくなりました。でもキャッシュは使いたいです。

<h1>解決策３：onPageStarted 時にキャッシュをクリアしてみる</h1>

public void onPageStarted(WebView webView, String url, Bitmap favicon) {
 webView.clearCache(true);
}

解決策２とあまり変わりません。
ここで js ファイルのキャッシュのみ削除とかができれば良さそうなのですが…。

<h1>解決策４：js ファイルのみキャッシュが発生しないようにしてみる</h1>

&lt;script type="text/javascript" src="&lt;? echo "hoge.js?" . time(); ?&gt;"&gt;&lt;/script&gt;

よくある js ファイルの URL を毎回変えてあげる手です。
通信量が増える、キャッシュが膨れ上がる、そもそもサーバー側が弄れない場合は使えない、などなど多々問題がありますが、
場合によってはこれで解決できそうです。

<h1>追記（未検証）：shouldInterceptRequest でごにょごにょ</h1>

shouldInterceptRequest を使えば、js がリクエストされたときのみ独自で js を取得するなどが可能かも。
ただ shouldInterceptRequest を使うことで SIGSEGV が発生する事例もあるようなので、
もっと根が深いところで落ちてるのかも…。
もうちょっと検証する必要がありそうです。

<h1>補足</h1>

data/data/{パッケージ名}/caches
data/data/{パッケージ名}/databases

キャッシュはこのあたりに sqlite などで入ってるようです。
興味がある人は覗いてみるといろいろ分かるかも知れません。
onPageStarted 時にここを直接弄るという手も考えたのですが、今後も通じるとは限らないのでオススメはできません。
osxでcrontab -rをやっちまった

TimeMachineがあってよかったー！！


【復旧方法】
>
defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder

で不可視ファイルを見れるようにして、TimeMachineに入って

>
/usr/lib/cron/tabs/

を復活させた。

焦ったぜよ。
DietPi(jessie)をデスクトップ環境にした時の難所と解決方法

## DietPiの利点

* `/`パーティションをSDカードのサイズに自動で拡張してくれる。
    * Raspbian, minibianでfdiskを用いての拡張に失敗したという苦い経験があった。
    * (fdiskでパーティションを削除、作成してOS再起動するとOS起動途中で止まった)

## 自分用メモ

```bash:
apt-get install -y \
  vim-gtk ansible git tig freerdp-x11 cifs-utils sshfs \
  autossh fizsh \
  pavucontrol xfce4-screenshooter xfce4-terminal \
  fonts-takao xtightvncviewer \
  iceweasel-l10n-ja icedove-l10n-ja
```

* icedove はthunderbird

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

# 難所の解決方法

## 解像度の変更

```bash:以下コマンドから実施
dietpi-config
```

## LXDE環境を一般ユーザで利用したい

```bash:lightdmをインストールしたら解決した
adduser user1
sudo apt-get install -y lightdm
```

* 次回OS起動時からlightdmが起動し、一般ユーザでログインすればよい。

## 日本語フォントがない

```bash:解決方法
sudo apt-get install -y fonts-mona fonts-monapo xfonts-mona
```

*  要、再ログイン

## 文字のレンダリングを綺麗にする

```bash:解決方法
sudo apt-get install -y epiphany-browser
sudo apt-get remove -y epiphany-browser
sudo apt-get autoremove 
```

* epiphany-browserを入れたときに入る依存関係のパッケージで解決した。（メモし忘れた）
    *  要、再ログイン

## 無線マウスの速度がもっさり

* [Raspberry Pi • View topic - RPi2 Slow wireless mouse](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=99494)

```bash:パーティションのマウント
mkdir ~/a
sudo mount /dev/mmcblk0p1 ~/a
```


```diff:~/a/cmdline.txt
- dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=noop rootwait
+ dwc_otg.lpm_enable=0 usbhid.mousepoll=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=noop rootwait
```

* OS再起動し、解決。

## 日本語入力

```bash:
apt-get install -y fcitx-mozc dbus-x11
```

* dbus-launchコマンドが必要なことがわかるまで時間がかかった。(dbus-x11パッケージにある。)

## thunderbirdからicedoveに移行

```bash:
mv ~/.thunderbird ~/.icedove
```

## alias

```bash:
alias cpu='/DietPi/dietpi/dietpi-cpu_info'
alias dietpi-backup='/DietPi/dietpi/dietpi-backup'
alias dietpi-bugreport='/DietPi/dietpi/dietpi-bugreport'
alias dietpi-cleaner='/DietPi/dietpi/dietpi-cleaner'
alias dietpi-config='/DietPi/dietpi/dietpi-config'
alias dietpi-logclear='/DietPi/dietpi/dietpi-logclear'
alias dietpi-morsecode='/DietPi/dietpi/dietpi-morsecode'
alias dietpi-nice='/DietPi/dietpi/dietpi-nice'
alias dietpi-services='/DietPi/dietpi/dietpi-services'
alias dietpi-software='/DietPi/dietpi/dietpi-software'
alias dietpi-sync='/DietPi/dietpi/dietpi-sync'
alias dietpi-uninstall='/DietPi/dietpi/dietpi-uninstall menu'
alias dietpi-update='/DietPi/dietpi/dietpi-update'
alias emulationstation='/opt/retropie/supplementary/emulationstation/emulationstation'
alias opentyrian='/usr/local/games/opentyrian/run'
```

----

# x86_64用イメージあり

* [Fuzon • View topic - DietPi for VMware (Virtual Machine)](http://fuzon.co.uk/phpbb/viewtopic.php?f=8&t=90#wrap)
    * Virtualboxで動いた

![dietpi.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7bfe3874-4a43-5073-e3b7-d6975f2c45ea.png)

## Nginxの起動対応

* [Nginxで設定ファイルチェック - Qiita](http://qiita.com/yaotti/items/bd6774888a790c00e6fd)


```bash:インストール
sudo apt-get install -y nginx
sudo journalctl -xn
```

```bash:syntax_check
sudo /usr/sbin/nginx -t -c /etc/nginx/nginx.conf
```

```diff:/etc/nginx/sites-enabled/default
 server {
         listen 80 default_server;
-        listen [::]:80 default_server;
```