OmniAICreator/Qiita-1.07M huggingface dataset:
Vimで言うところの「単語」ってどうやって決まるのさ？


Vimのコマンドには、単語単位での操作がいろいろある。
でもその「単語」はどうやって決まっているのか。分からないと迂闊に`w`を押せないよ。。。
ということで調べてみた。

## iskeyword
早速結論だけど、[iskeyword](http://vim-jp.org/vimdoc-ja/options.html#'iskeyword')という設定値で単語が定義されている。
ここで設定された文字が続く限りは、単語とみなされるという仕組み。

ドキュメントによると、

* Windowsでの規定値："@,48-57,_,128-167,224-235"
* それ以外のシステムでの規定値："@,48-57,_,192-255"

となっているらしい。

`@`は、関数`isalpha()`で`TRUE`が返るような文字(=a-z,A-Zと、これらにアクセントが付いたもの)を表す。
また、`48-57`などの数値での指定はASCIIコードでの範囲指定を表す。`48-57`は数字の0-9のこと。128以降は拡張ASCCIIというので定義されているらしいけど、日本人はほぼ使わないと思う。

つまり、デフォルトでは英数字と`_`の塊が単語としてみなされるということ。

## 設定値の確認
設定値を確認したいときは以下を入力すればOK。

```
:set iskeyword
```

もしくは、

```
:set isk
```

## 変更例
たとえばCSSを編集してるとき。`margin-top`とか、ハイフンも単語の一部とみなしてほしくなる。
なので、ハイフンをiskeywordに含めてやる。

```
:setlocal isk+=-
```

たとえばRubyでクラスの編集をしてるとき。`@foo`, `@@bar`を単語として扱ってほしい。
そんなときは、

```
:setlocal isk+=@-@
```

`@-@`は文字の@を表す。`@`は英字を表す特殊文字なので。

。。。などなど、便利に使ってください。
Rails4.1のvariantsでスマホ用にテンプレートを切り替える


Rails4.1にvariantsという条件によってテンプレートを変える便利機能があります。

## 使い方

- コントローラでrequest.variantsをセット
- バリアントごとにテンプレートを用意

これだけです。


##ApplicationControllerでの設定例

```ruby
class ApplicationController < ActionController::Base
  before_action :detect_variant

  private
  def detect_variant
    case request.user_agent
    when /ip(hone|od)/i
      request.variant = :phone
    when /android.+mobile/i
      request.variant = :phone
    end
  end
end
```

## テンプレートの準備

`index.html.haml` と `index.html+phone.haml`のように
`アクション名.拡張子+request.variant.テンプレートエンジン` というテンプレートを別に用意する


## 参考
http://railsguides.jp/4_1_release_notes.html#action-pack-variant
OS X Yosemite の日本語入力で常時半角スペースにする方法

# 概要

OS X Yosemite から日本語入力がことえりから JapaneseIM になりましたが、
従来の `defaults` コマンドによる半角スペース入力設定がきかなくなってしまったようです。

設定ファイルを変更する必要があるので、メモしておきます。

# 手順

1. `/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_*.plist` をバックアップする
    * `cd /System/Library/Input\ Methods/JapaneseIM.app/Contents/Resources`
    * `tar czf ~/JapaneseIM_KeySetting.tar.gz KeySetting_*.plist`
    * 次でパッチをあてるので、カレントディレクトリはそのまま
2. Space -> 半角スペース、Shift+Space -> 全角スペース となるように設定を修正する[パッチ](https://gist.github.com/comutt/dd0a03bdc81e2660ea07)を当てる
    * `curl -sL https://gist.githubusercontent.com/comutt/dd0a03bdc81e2660ea07/raw/003f1c44891280f813233235e11dbb0dcfd7bdce/KeySetting.diff | sudo patch -p1`
3. JapaneseIM を再起動する
    * `sudo killall -HUP JapaneseIM`

# 情報元

* [Yosemiteの日本語入力で常に半角スペースを入力する方法](https://discussionsjapan.apple.com/thread/10153312)
マクロ展開後のコードを見る

[ブログ](http://joe-noh.hatenablog.com/entry/2014/10/18/101809)から整形して転載。

マクロが自分が望んだ形に展開されているかテストする方法。

```ex
# lib/my_module.ex

defmodule MyModule do
  defmacro my_macro do  # テスト対象
    quote do
      ...  # 略
    end
  end
end
```

```ex
# test/test_helper.exs

ExUnit.start

defmodule TestHelper do
  defmacro macro_to_code(macro) do
    macro |> Macro.expand(__CALLER__) |> Macro.to_string
  end
end
```

```ex
# test/my_module_test.exs

defmodule MyModuleTest do
  use ExUnit.Case
  import TestHelper

  test "my_macro" do
    expanded = macro_to_code(MyModule.my_macro)  # 文字列が返る
    assert expanded =~ ~r/.../
  end
end
```

以下のようにすると、文字列ではなくASTが返ります。

```ex
defmacro macro_to_ast(macro) do
  macro |> Macro.expand(__CALLER__) |> Macro.escape
end
```
Firefoxでのcssアニメーション


クラスの付け外しによって、アニメーションを何度も再生したいとき、
他のモダンブラウザではうまくいくもののfirefoxではうまくいかない場合がある。

つまり、クラスを戻したとしても前回のアニメーションの最後の状態が保持されたままになっており、
同じアニメーションを１からスタートすることができない。

この場合は、一度DOMを削除し、コピーしたDOMを再度insertすれば解決する模様。
とはいえ、firefoxでもうまくいく場合もあるので要調査。
[git] gitのXcodeプロジェクトでの使い方

## 概要
Xcodeプロジェクトの関連ファイルをgit登録する方法について説明します。

## 環境
* 作成日: 2014.10.20
* OS: 依存なし
* Xcode: 依存なし
* 言語: 依存なし

## .gitignoreファイル
Xcodeを使用していると、様々なファイルが生成されますが、その全てをgit登録(他者と共有する)必要はありません。登録不要なファイルをgitのcommit対象から除外するための.gitignoreファイルの設定が、[Objective-C.gitignore](https://github.com/github/gitignore/blob/master/Objective-C.gitignore)にて公開されています。

2014年10月現在、上記.gitignoreの内容は以下の様に定義されています。

> \# Xcode
> \#
> build/
> *.pbxuser
> !default.pbxuser
> *.mode1v3
> !default.mode1v3
> *.mode2v3
> !default.mode2v3
> *.perspectivev3
> !default.perspectivev3
> xcuserdata
> *.xccheckout
> *.moved-aside
> DerivedData
> *.hmap
> *.ipa
> *.xcuserstate

## commitしたファイルの登録取り消し
`git rm --cached ファイル`コマンドで、ファイルを削除することなく、リポジトリの登録対象から削除です。gitの使い方については、[Git 戻す系の処理を自分の理解の為にまとめてみた](http://box406.hatenablog.com/entry/2014/04/23/215805)を参考にしました。
OSX YosemiteでPhpStormを起動させる方法


追記：JDK 1.6をダウンロードして起動させることを推奨とのこと。
https://intellij-support.jetbrains.com/entries/27854363-IDE-doesn-t-start-after-updating-to-Mac-OS-Yosemite-or-Mavericks

~~こちらに記載されている方法で起動させることができました。~~
https://laracasts.com/discuss/channels/general-discussion/phpstorm-does-not-work-in-yosemite-help/replies/10750

~~エディタで/Applications/PhpStorm.app/Contents/Info.plistを編集します。~~
~~JVMVersionを1.6*から1.*に書き換えて保存。~~
~~無事起動できるようになります。~~

```/Applications/PhpStorm.app/Contents/Info.plist
      <key>JVMVersion</key>
      <string>1.*</string>
```
RailsでiPhoneの絵文字対応する方法


掲示板アプリ作っていたら、
iPhoneの絵文字を入力すると500エラーとなってしまったので、
対応したメモ

databaseはMySQLを使用しています。
通常utf8を使用していたのですが、
どうもiOS5の絵文字は4バイトのUTF-8で記述されているので、「utf8mb4」を使わないといけないらしい。

## database.ymlの設定

``` database.yml
default: &default
  adapter: mysql2
  charset: utf8mb4
  encoding: utf8mb4
  collation: utf8mb4_general_ci
```

## stringの最大文字列を191文字へ変更

これで、MySQLでは「utf8mb4」を使うことになったのですが、
rake db:migrate でエラーがでてしまいました。

> Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE UNIQUE INDEX

utf8が4バイトになったため、
Stringの最大が255だと767バイトを超えてしまうのでした。

そのため、
limitでstringは最大を191にすることで、
対応できました。

``` config/initializers/mysqlpls.rb
require 'active_record/connection_adapters/abstract_mysql_adapter'

module ActiveRecord
  module ConnectionAdapters
    class AbstractMysqlAdapter
      NATIVE_DATABASE_TYPES[:string] = { :name => "varchar", :limit => 191 }
    end
  end
end
```
iOSアプリ開発:サスペンド時のEXC_BAD_ACCESS

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/10/20/ios_dev_suspend_exc_bad_access/)のほうで更新します。

前回のメモリ不足によるアプリが勝手に終了してしまう対応が出来た！
と思い、色々アプリで遊んでいたら新たな問題発生。

## 現象

アプリをXcodeから端末へ転送&実行し、
アプリが起動したらホームボタンを押し、アプリをサスペンド状態にした所下記記述で[EXC_BAD_ACCESS]発生していました。

```objc++:
// mContext…EAGLContext*
[mContext presentRenderbuffer:GL_RENDERBUFFER];
```

## 調査

iOSシミュレータでは確認出来ませんでした。(PC側の問題で最新のXcodeにしていないからかも？)
※ちなみに、iOSシミュレータのバージョンは6.0 (369.2)でした。

実機はiOSバージョン6.1.6で、こちらではエラーが発生します。

ViewController上にOpenGLで描画をしていますが、
どうやらバックグラウンドに入った後なのにOpenGLの処理が走ってしまっているようです。

## 対応

バックグラウンド中はOpenGLの処理が走らないようにする必要があります。
実際の関連処理は下記に記述しました。
今回の対応で追加した部分は、追加と記述してあります。

```objc++:AppDelegate.h
#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

// 〜省略〜

@property (strong, nonatomic) ViewController *viewController;

@end
```

```objc++:AppDelegate.m
#import "AppDelegate.h"

#import "ViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 〜省略〜
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    // 〜省略〜
}

// サスペンド
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    self.viewController.mOpenGLRun = false;  // 追加(実行しない)
}

// レジューム
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    self.viewController.mOpenGLRun = true;  // 追加(実行する)
}
```

```objc++:ViewController.h
// 〜省略〜
@interface ViewController : UIViewController
// 〜省略〜
@property (assign, nonatomic) bool mOpenGLRun;  // 追加(OpenGL処理実行フラグ)
@end
```

```obj++:ViewController.m
#import "ViewController.h"
// 〜省略〜
@implementation ViewController

@synthesize mOpenGLRun;  // 追加

- (void)viewDidLoad
{
    [super viewDidLoad];
    mOpenGLRun = true;  // 追加
    // 〜省略〜
}

- (void)Test
{
    if (mOpenGLRun == true) {  // 追加
        // OpenGL関連の処理
    }                          // 追加
}
```

前からこうだったのか全然記憶にありません…。
他の処理でも何か出てきそうなので気を付けます。

## 更新履歴

* 14/10/20 1:11　更新<br>
調査に、iOSシミュレータでの情報を追加しました。
xcode6でiOS7の新規プロジェクトを作成したら上に黒い隙間ができる

なぜか、xcode6で作ったプロジェクトを実機に転送すると
シミュレーターではでなかった黒い隙間が上に出ます。

とりあえずの解決法
[targets]→（プロジェクト名）→Generalにある
App Icons and LaunchImages の
Launch　Image　Sourceを[use asset catalogs]に変更する。
インテル Edison ボード　ハッカソン

発売前の世界最小Linuxを使ったIoTイノベーション大会に参加してきました。


![IMG_0145.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/17b5f2bd-320a-a014-6e94-f9c3b701f2fe.jpeg)


結果は・・・
ファイナリストに選ばれましたー！！


制作したもの
　「ボルテージカラーズ」
概要はライブなどで使うペンライトにEdisonと加速度センサーを乗せて、会場のボルテージを計算！！

盛り上がり具合でペンライトの色とステージ上のアイドルの洋服の色が同時に同じ色にかわります！！もちろんアイドルから会場を変えることもできます。
また、この小さいことを利用して直接腕（ウェアラブル）にも装着できます！！

かなり完成度が高くオリンピックやスポーツの大会でも使いたいと思いました！！

ちなみにここの最終決勝は【インテル® ソフトウェア・カンファレンス】でのプレゼンで勝負！！
http://sw-event.intel.jp/index.html
※写真はこの結果で公開します。


マジで最優秀賞目指しまーす！！


今回の大会がハッカソン初めてでしたが、マジで疲れました！！
擬似要素を使ってCSSでロングシャドウを表現する

cssでロングシャドウを表現するとして、「css long shadow」などで検索すると、`box-shadow`を位置をずらしながら多重にかける方法で表現できるようです。

```:shadow01.css
.shadow {
  box-shadow: 1px 1px rgb(31, 41, 52),
              2px 2px rgb(31, 41, 52),
              3px 3px rgb(31, 41, 52),
              ...
              /* シャドウが100pxなら100まで続く */
}
```

ただこの方法だと、背景色を透過したシャドウを作れませんし、cssが黒魔術っぽくなってしまいます。

そこで、疑似要素を使ってシャドウを作ってみました。
実際の要素の右と下にシャドウとなる疑似要素を作成し、`transform: skew()`させてシャドウのように見せかけます。

[サンプル][LINK-1]

```:shadow02.css
.shadow {
  position: relative;
}
.shadow:before,
.shadow:after {
  content: "";
  position: absolute;
}
.shadow:before {
  width: 100px;
  height: 100%;
  top: 0;
  left: 100%;
  background-image: linear-gradient(to right, rgba(0, 0, 0, .7), rgba(0, 0, 0, 0));
  transform: skew(0, 45deg);
  transform-origin: 0 0 0;
}
.shadow:after {
  width: 100%;
  height: 100px;
  top: 100%;
  left: 0;
  background-image: linear-gradient(to bottom, rgba(0, 0, 0, .7), rgba(0, 0, 0, 0));
  transform: skew(45deg, 0);
  transform-origin: 0 0 0;
}
```

この方法であれば背景色を透過したシャドウを作成することができます。

しかし、[sample02-02][LINK-1]のようにシャドウを濃い色に設定すると、シャドウの繋ぎ目にある隙間の部分が目立ってしまいます。
また、`box-shadow`とは違い、擬似要素を作成しているので、他の要素に影響を与えることも注意が必要です。

[link-1]:http://codepen.io/kyaido/pen/gaBlz
悲報 Yosemiteのインストールに失敗したよ



![スクリーンショット_2014_10_20_0_00.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/41e79201-821b-c2f6-d658-a3ffe2036b89.jpeg "スクリーンショット_2014_10_20_0_00.jpg")

## はじめに

正式版のYosemiteがリリースされました。Beta版が利用していたのですが、大変安定しておりアップグレードも都度問題なかったので、正式版のアップグレードも気軽に行ったところ問題が発生しました。しかも、TimeMachineのバックアップが３ヶ月もとれてませんでした（自業自得）

結果、なんとかインストールできたので、手順を記載します。

## インストール中のフリーズ

インストール中の最後の１分は大変時間がかかるという事情はいくつか散見されますが、自分の場合、残り１７分からまったく動かなくなってしまいました。


![iPhoto.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/0d90d979-6142-7a26-9d24-06d42794f286.jpeg "iPhoto.jpg")

インストール中のログを見ることができるとアドバイスをもらったので、確認したところどうもログが更新されずフリーズしている模様。


![000.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/ee220ad0-7d11-039e-ccbc-98a423a576db.jpeg "000.jpg")


## 再起動してみた

一向に進まないので電源ボタンを押下して再起動しました。すると

![iPhoto.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/b7d16800-3e3b-4fde-3615-4d2c9365d1a2.jpeg "iPhoto.jpg")

エラーが！！！

壊れてしまいました涙


## ゴニョゴニョしてみる

起動時に「command + R」キーを押して、リカバリーモードを起動してみます。リカバリーモードは起動できました。

![00.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/c89efc44-83fc-722b-1b1a-82e0f7a91719.jpeg "00.jpg")

ディスクユーティリティでディスクをスキャンすると、なんとエラーが出ていました。ディスクの復旧を行いエラーを取り覗いて再度OSXを起動してみるものの、あの悲しいエラー画面が再度表示されます。

## クリーンインストール覚悟で

リカバリーモードの「OSXを`新しく`再インストール」を選択しました。`新しく`と書いてるのでアップグレードではなく、クリーンインストールがされることを覚悟でインストールしたところ、残り１７分でインストールがフリーズすることもなく、すんなりとインストールすることができました。（他の方同様、残り１分で結構待ちましたが）

起動すると、なんとアップグレードでインストールされており、めでたく既存のデータは消えることはありませんでした。
物理量、数値、単位（の書き方）

こんにちは。
プログラムで、物理量、数値、単位の関係（書き方）をどう定めるか考えてみました。
ISO および SI の考え方の原則（下記）に従うことにすると、

* 物理量 = 数値 × 単位
* 物理量変数の値は MKSA 系および radian

プログラムの書き方はこんな具合です[^1]。

```python
DEGREE = PI/180 # 単位定義
KM_PER_HOUR = 1000/3600 # 単位定義
angle_rectangular = 90 * DEGREE
velocity_sonic = 1225 * KM_PER_HOUR
print(angle/DEGREE, "degree")
print(velocity/KM_PER_HOUR, "km/h")
```

ただしデメリットとして、例えば```angle```の値をデバッグで見たい場合に、そのままでは radian 単位の値です。分かりやすくするためには例えば```angle/DEGREE```の値（degree 単位）を見る必要があります。

-------
[^1]: Mathematica はこの流儀です。
scrollViewDidScroll:で都度、追加の読み込みをする


テーブルビューを一番したまでスクロールさせると、勝手に数件分のデータを読み込み表示してくれる機能を実装したかった。
`scrollViewDidScroll:`メソッドが想像以上に呼び出されるので、無駄な呼び出しをあの手この手で削ぎ落としていくのに頭を使った。
その部分に関してメモを残す。


##やりたいこと（仕様）
* `UITableView`が下端までスクロールされたら（バウンス）、追加でn件分のデータを読み込んで表示したい。
* 読み込んだ後のセルの表示位置はそのままにしておき、テーブルビューの1行目に行ったりしない。

## アプローチ
1. UIScrollViewControllerのデリゲートメソッド`scrollViewDidScroll:`を使う
1. このメソッドは頻繁に呼びだされるのでバウンスされたときという条件を絞り込む
1. バウンスされたときという条件下でも何度も呼び出されるので、実装を非同期実行・並列処理として不要な呼び出しをキャンセルする

## サンプルコード


```objectivec:該当のビューコントローラにて
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    //バウンスの判定条件は、テーブルビューのサイズを超えて一番したまでスクロールされ、かつそれが ユーザの動作によって行われている場合とする
    BOOL isBouncing = NO;
    isBouncing = (self.tableView.contentOffset.y >= (self.tableView.contentSize.height - self.tableView.bounds.size.height)) &  self.tableView.dragging;
    if(isBouncing)
    {
        //どれか一つのスレッドが処理中なら、ほかのスレッドの処理は中断する。
        if (self.isUpdating) { // isUpdating は このメソッドの処理が実行中かどうかを知らせる BOOL 値のプロパティ
            return;
        }
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            self.isUpdating = YES;

            /*
             * 追加でn件分のデータを読み込む処理
             */

            //処理が１秒続いたとする
            [NSThread sleepForTimeInterval:1.0];

            self.isUpdating = NO;
        });
    }
}

```

##結果
上のコードを活用することで、やりたいことは実現できた。
その上で記載すべきこととしては２点。
###1. EXC_BAD_ACCESS が出た
追加のデータを表示させた後に、このビューコントローラからひとつ前のビューコントローラに戻ると発生した。
[[XCode]ARC使用中にエラー「EXC_BAD_ACCESS」「respondsToSelector」が出た場合の対処法」](http://www.hawk-a.com/exception_code/archives/1428)を参照させていただいたところ、テーブルビューの`delegate`を解放していないことが原因ということがわかった。そのため、`dealloc`メソッドをオーバライドした。

```objectivec:該当のビューコントローラにて
- (void)dealloc
{
    self.tableView.delegate = nil;
}
```

###2. reloadDataの利用で表示はうまくいくか？
サンプルコードはないが、テーブルビューの更新は`reloadData`を使っている。これを使うと一律でテーブルビューが常に１行目を表示してしまうようだと困ったのだが、そんなことはなかった。
Rustプログラミングを始める

Rustプログラミングの始め方。

公式ページは[こちら](http://www.rust-lang.org/)。

[The Rust Guide](http://doc.rust-lang.org/0.12.0/guide.html)

こちらの公式のガイドに沿って始めます。Max OS X 10.9.5で試します。

まずはRustをインストールします。

```bash
$ curl -s https://static.rust-lang.org/rustup.sh | sudo sh
```

ダウンロードに時間がかかりますが、待ちます。

インストールが終わったらバージョンを確認。

```bash
$ rustc --version
rustc 0.13.0-nightly (c46812f65 2014-10-19 00:47:18 +0000)
```

適当にディレクトリを作成して、Hello Worldしてみる。

```bash
mkdir rust_hello_workd
cd rust_hello_world
```

rust_hello_world.rsファイルを作成して、テキストエディタで以下のように書く。

```rust:rust_hello_world.rs
fn main() {
  println!("Hello, world!");
}
```

`println`に`!`が付いているのはMacroらしいですが、今は気にしないでおく。

コンパイルする。

```bash
rustc rust_hello_world.rs
```

実行可能なrust_hello_worldファイルができあがるので、それを実行する。

```bash
$ ./rust_hello_world
Hello, world!
```

できました。
文字列配列から空文字を除去するバッドノウハウ

このパターンは「配列の要素が全て文字列だと保証できる」場合以外では推奨できない。適用しやすいのは、`explode()`の返り値。

逆に、**適用してはいけない**のは `$_GET`, `$_POST`, `$_REQUEST` など(要素に配列が含まれうる)。

```php
<?php
$path = '/hoge/fuga/piyo';

$split = explode('/', $path);
// => ['', 'hoge', 'fuga', 'piyo']
$split = array_filter(explode('/', $path), 'strlen');
// => ['hoge', 'fuga', 'piyo']
```

## 申しわけ程度に説明

* `strlen()`は文字列の長さ(バイト数)を返す変哲もない函数
* `array_filter()`は配列の各要素をコールバック函数に適用し、`true`を返した値のみから構成される配列を返す
* PHPの数値型は`0`が`false`、それ以外が`true`に相当する

## 追記

忘れてたけど、`array_filter()`だとキーと値の対応は維持されたままなので、純粋な配列として扱ひたいときは`array_values()`で振り直すと良いですよ。

つまりこんな感じ。

```php
<?php
$split = array_values(array_filter(explode('/', $path), 'strlen'));
```

連想配列として扱っておきたい場合は特に何もしなくていい。
YosemiteでFinderから起動時の環境変数の扱いが変わった？

# 背景
 
[AXIsProcessTrustedを使ったMacRubyスクリプトをCocoaアプリケーション化](http://qiita.com/kjunichi/items/bde806a9f2849211a01f)したが、Yosemiteでは動かなくなった。

プライバシーのアクセシビリティでアプリが表示されず、登録出来ない。

追記：
どうやらこの問題、アクセシビリティで+のアイコンをクリックして、アプリを登録すれば、動くようになる模様。登録して、一旦パネルを閉じれば、次回から表示されたorz


# 解決策

ターミナルからopenコマンドでは動かせた。しかし、アクセシビリティには、
許可すべきアプリは表示されず、ターミナルのチェックを外している状態なのに、AXIsProcessTrustedはTrueを返して来た。

これは、Mavericksの時に、アプリを許可していたから、Yosemiteのアクセシビリティには表示されず、内部的には、許可した状態になっているのかも

# 疑問

ターミナルのopenコマンドから起動すると動く、というのは、実はwxMaximaとmaximaが通信出来なくなるトラブルをYosemiteにして経験済みで、これも、
どうも、ターミナルから起動するとうまく動くという、状態。

そんなわけで、Emacsのホームのトラブルと同様、Finderでの環境変数がまたYosemiteで変わったのかと思われる。

追記：

wxMaximaとmaximaの通信の問題は、Finderからの起動の場合、Yosemiteでは/usr/local/binが参照されなくなった為に生じていることがわかった。

# 関連記事

- [YosemiteでwxMaximaがmaximaと通信できない件: misc](http://kjunichi.cocolog-nifty.com/misc/2014/10/yosemitewxmaxim.html)
- [MacRubyのスクリプトをCocoaアプリ化出来た: misc](http://kjunichi.cocolog-nifty.com/misc/2014/10/macrubycocoad-0.html)
Travis CI で MySQL を使う

## 概要

Travis CI で MySQL を使う方法を調べました。Travis CI の[ドキュメント](http://docs.travis-ci.com/user/database-setup/#MySQL)によると、テスト実行時にデフォルトで MySQL のサービスが起動してくれます。ユーザー名は `root` 、パスワードは空でアクセスできました。

## 動作試験

下記の `.travis.yml` とテーブルの一覧を表示するだけの PHP スクリプト `show_tables.php` で動作試験を行いました。

`.travis.yml` では `before_script` でデータベース `hoge` とテーブル 3 つを作成します。

```.travis.yml
language: php
before_script:
  - mysql -uroot -e "create database hoge"
  - mysql -uroot -e "use hoge; create table tokyo (id int(11))"
  - mysql -uroot -e "use hoge; create table saitama (id int(11))"
  - mysql -uroot -e "use hoge; create table osaka (id int(11))"
script:
  - php -f show_tables.php
```

`show_tables.php` は `.travis.yml` で作成したデータベースからテーブルの一覧を読み出すスクリプトです。

```show_tables.php
<?php

$pdo = new PDO(
  'mysql:host=localhost;dbname=hoge;charset=utf8',
  'root',
  ''
);
$stmt = $pdo->query('show tables');
$results = $stmt->fetchAll();
foreach($results as $table_name){
  echo $table_name[0] . PHP_EOL;
}
```

下記は実行結果です。Travis CI のコンソールで、テーブル名が読み出せていることが確認できました。

```
$ php -f show_tables.php
osaka
saitama
tokyo
```

上記の動作試験を行った GitHub のリポジトリです。
https://github.com/suzuki86/sample-of-using-mysql-on-travisci

Travis CI での実行結果です。
https://travis-ci.org/suzuki86/sample-of-using-mysql-on-travisci
Yosemiteにアップデート後にずっとCrash Reporterが動いて困っている方へ

# 手っ取り早く治したい方へ
Yosemiteにアップデートして使っていたところ、ずっとCrash ReporterがCPUを30%近く占拠する状況で、もしコンソールでsoagentなどが「Code Signature Invalid」が原因でError Reportされている場合、dyldの共有キャッシュが古いことが原因の可能性があります。その場合、dyldの共有キャッシュを更新するために下記のコマンドを実行します。

    sudo update_dyld_shared_cache

これでError Reportがでなくなりました。お困りの方はぜひお試し下さい。

# 症状の詳細

コンソールで確かめるとsoagent、sharingd、AddressBookSourceSyncなどがほぼ毎秒落ちており、その度にCrash Reportをする状況。

![スクリーンショット 2014-10-19 20.21.48.png](https://qiita-image-store.s3.amazonaws.com/0/43380/60182670-e514-e209-e924-0869fbbbd3bd.png)

Error Reportを見ると

    Exception Type:        EXC_BAD_ACCESS (Code Signature Invalid)

となっている。この「Code Signature Invalid」をヒントに、その他のコンソールのログを確かめると、下記のようにCode Signatureを調べる際に、dyld_shared_cacheを元に調べているようです。

    2014/10/19 19:36:01.000 kernel[0]: CODE SIGNING: process 626[AddressBookSourc]: rejecting invalid page at address 0x7fff9b73c000 from offset 0x162b0000 in file "/private/var/db/dyld/dyld_shared_cache_x86_64" (cs_mtime:1413545821.0 == mtime:1413545821.0) (signed:1 validated:1 tainted:1 wpmapped:0 slid:0)

このdyld_shared_cache_x86_64の最新更新日時を確かめると、どうやらYosemiteにUpdateする前の日付。この時点で古いCacheが原因であると推測。(キャッシュの日付は10月17日。筆者は10月18日にYosemiteに更新)

    $ ls -l /private/var/db/dyld/dyld_shared_cache_x86_64
    -rw-r--r--  2 root  wheel  381405330 10 17 20:37 /private/var/db/dyld/dyld_shared_cache_x86_64

このdyldのcacheを更新するた方法として、[update_dyld_shared_cache](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/update_dyld_shared_cache.1.html)というコマンドがあり、これを実行することでCacheが更新されます。

    sudo update_dyld_shared_cache

Cacheが更新されたか確認。

    $ ls -l /private/var/db/dyld/dyld_shared_cache_x86_64
    -rw-r--r--  2 root  wheel  381524694 10 19 20:17 /private/var/db/dyld/dyld_shared_cache_x86_64　# cacheの日付が10月19日になっている。

以上のようにdyldの共有キャッシュを更新することで、Code Signature Invalidのエラーが解消されますので、お困りの方はお試し下さい。
Yosemite(OS X 10.10)においてHomebrewが使えない問題を解決する

会社が休みだったので、他のスタッフに人柱になってもらうわけにもいかず、かといって好奇心を抑えられず、Yosemiteにアップグレードしました。

なんかhomebrewつかっているとアップグレードの時間が遅くなると言われていましたが、おおよそ2時間弱程度でアップグレードできました。アップグレードしたはよいものの、brewコマンドを打つと、

```bash
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 23: /usr/local/Library/brew.rb: Undefined error: 0
```
以上のメッセージをひたすら返すようになってしまいました。

原因としては、References内の記事で挙げられているように、YosemiteのRubyが、2.0デフォルトで、1.8.7がなくなっているために生じているようです。（健全な進化ですね。）よって、当該箇所を書き換えてしまおう、というのが解決策の主流のようです。

私の場合、デフォルトのRubyが

```bash
$which ruby
/Users/yuichi/.rvm/rubies/ruby-2.1.2/bin/ruby
```

なので、`/usr/local/Library/brew.rb`のshibangを、
```
- #!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0
+ #!/Users/yuichi/.rvm/rubies/ruby-2.1.2/bin/ruby -W0
```
に修正しました。ここで、`$brew update`をやってもgitのエラーになるので、修正分をコミットします。

```bash
➜  local git:(master) ✗ git commit -a -m 'use my default ruby'
[master 3f11181] use my default ruby
 1 file changed, 1 insertion(+), 1 deletion(-)
```

ここでpullしてくると、当然ながらconflictします。そこは、また当該箇所を修正して、再びpullします。

```bash
git add .
➜  local git:(master) ✗ git commit
[master 35c84e3] Merge branch 'master' of https://github.com/Homebrew/homebrew
➜  local git:(master) grew update
zsh: command not found: grew
➜  local git:(master) brew update
Updated Homebrew from 35c84e3c to 35c84e3c.
... 以下略
```

これで、使えるようになりました！

あまりスマートな方法でもない気もするので、待てる人は公式な解決策がでるまでYosemiteへのアップグレードを待ったほうがよいかもしれません。

取り急ぎ以上です。

# References

- [OS X 10.10 ships with Ruby 2.0 as the default, no 1.8.7 · Issue #29795 · Homebrew/homebrew · GitHub](http://goo.gl/NW2CJ6)
- [Fixing Homebrew for OS X 10.10 Yosemite - Hans van Gent a.k.a. @jcvangent](http://goo.gl/ffjUCz)
Qiita APIを触ってみた

Qiitaの投稿とtwitterを連携しようと思い，Qiita APIにちょっと触れてみた．今回はさくっとやりたいため，[pythonラッパー](http://qiita.com/heavenshell/items/1e5397fd6df917628822 "pythonラッパー")を使用した．

今回やろうとしたのは，以下の2点

* 定期的に投稿させるため，一定期間更新がない場合に通知
* 一定期間ごとの自分の行動の統計を取る

このための下準備として，まず一定期間ごとの自分の投稿の取得を試してみた．

ラッパーの使い方は基本的には上記のリンクページに書いてあり，詳しく知りたい人はpipで落としてきたコードを参照．
今回の操作には必要ないが，一応Oauth認証から投稿リスト取得までは以下の通り．

```py
client = Client(url_name = self.user_name, password = self.user_pass)
token = client.token # post等はここで取得したtokenを使用
users = Users()
user_items = users.user_items(url_name=self.user_name, params={'page':1, 'per_page':100})
```

返ってくる値の形式は[公式document](http://qiita.com/api/v2/docs)を参照．ここで欲しい値は投稿日時の'created_at'なので，抽出は`user_items[0]['created_at']`みたいにできる．取得できる形式は`2014-10-11 23:34:14 +0900`の様になり，日付・時間の比較のためにはこれをdatetimeの形式に変換する必要がある．この際，最後についているタイムゾーンが邪魔なので削りつつ変換すると以下の様になる．

```py
In [42]: time_str = '2014-10-11 23:34:14 +0900'

In [43]: time = datetime.strptime(time_str[:-6], '%Y-%m-%d %H:%M:%S')

In [44]: (datetime.now() - time).days
Out[44]: 7
```

こんな感じでデータの抽出をしていけばいけそうな感じ．
現状は本当に導入部分だけど，早めに形にしたい．

###### 追記
daysの差は日付ではなく，24時間単位の切り捨てになるため，一日以内の場合はdays<1で良さそう．
UIScrollViewでzoomScaleが変化しない場合の対処法

UIScrollViewで、

```objc:間違いコード
UIScrollView* scrollView = [[UIScrollView alloc] init];
scrollView.minimumZoomScale = MIN(CGRectGetWidth(self.bounds) / _imageView.frame.size.width, CGRectGetHeight(self.bounds) / _imageView.frame.size.height);
scrollView.maximumZoomScale = 1.f;
scrollView.zoomScale = self.minimumZoomScale;

scrollView.delegate = self;
```

などというコードを書いても、minimumZoomScaleは変化しているのに、zoomScaleが変化しない。

そういう時は、zoomScaleをプログラミング的に変化させる前に、デリゲートを代入しなければいけない。

```objc:正解コード
UIScrollView* scrollView = [[UIScrollView alloc] init];
scrollView.delegate = self;

scrollView.minimumZoomScale = MIN(CGRectGetWidth(self.bounds) / _imageView.frame.size.width, CGRectGetHeight(self.bounds) / _imageView.frame.size.height);
scrollView.maximumZoomScale = 1.f;
scrollView.zoomScale = self.minimumZoomScale;
```

これはよく忘れて、「あれー？」とかなるので、メモのために書いておく。
皆も注意せよ！
Elixir Atoms

# Elixir Atoms

## 概要
Elixir の Atoms について。

Atom は 特定の名前を持つ定数の一種です。
コロンに続けて文字列名か、オペレータ名を続けて定義します。
コロンに続けて直接文字列を指定する場合は、
Atom は文字・数字・アンダースコア・@ を利用できます。
最後はエクスクラメーションマークかクエスチョンマークで終えることもできます。

コロンに続けてシングルォート・ダブルクォートで名前を指定する場合は
ASCII 範囲の文字を利用可能です。
※下記公式ドキュメントより

http://elixir-lang.org/docs/stable/elixir/String.html#to_atom/1

~~~
Currently Elixir does not support conversions from strings which contains Unicode codepoints greater than 0xFF.
~~~

Atom の値は名前であり、同じ名前の Atom は等価です。

### コロンに続けて直接名前を指定した場合

~~~
iex> :text
:text
iex> :_
:_
iex> :hoge!
:hoge!
iex> :hoge?
:hoge?
iex> :a123
:a123
iex> :a@
:a@
iex> :a@b
:a@b
iex> :+
:+
iex> :<>
:<>
iex> :hoge == :hoge
true
iex> :hoge == :hige
false
~~~

### コロンに続けてダブルクォートで名前を指定した場合

~~~
iex> ascii_atoms = 0..127 |> Enum.map(&("a" <> <<&1>> <> "b")) |> Enum.map(&(String.to_atom(&1)))
[:"a\0b", :"a\x01b", :"a\x02b", :"a\x03b", :"a\x04b", :"a\x05b", :"a\x06b",
 :"a\ab", :"a\bb", :"a\tb", :"a\nb", :"a\vb", :"a\fb", :"a\rb", :"a\x0Eb",
 :"a\x0Fb", :"a\x10b", :"a\x11b", :"a\x12b", :"a\x13b", :"a\x14b", :"a\x15b",
 :"a\x16b", :"a\x17b", :"a\x18b", :"a\x19b", :"a\x1Ab", :"a\eb", :"a\x1Cb",
 :"a\x1Db", :"a\x1Eb", :"a\x1Fb", :"a b", :"a!b", :"a\"b", :"a#b", :"a$b",
 :"a%b", :"a&b", :"a'b", :"a(b", :"a)b", :"a*b", :"a+b", :"a,b", :"a-b", :"a.b",
 :"a/b", :a0b, :a1b, ...]

iex> ascii_atoms |> Enum.take(10)
[:"a\0b", :"a\x01b", :"a\x02b", :"a\x03b", :"a\x04b", :"a\x05b", :"a\x06b",
 :"a\ab", :"a\bb", :"a\tb"]

iex> Enum.slice(ascii_atoms, 65, 26)
[:aAb, :aBb, :aCb, :aDb, :aEb, :aFb, :aGb, :aHb, :aIb, :aJb, :aKb, :aLb, :aMb,
 :aNb, :aOb, :aPb, :aQb, :aRb, :aSb, :aTb, :aUb, :aVb, :aWb, :aXb, :aYb, :aZb]
~~~

## 組み込み関数
下記を参照
http://elixir-lang.org/docs/stable/elixir/Atom.html

### to_char_list(atom)
Atom を char_list に変換します

~~~
iex> Atom.to_char_list(:hoge)
'hoge'
~~~

### to_string(atom)
Atom を string に変換します

~~~
iex> Atom.to_string(:hoge)
"hoge"
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Atom.html
Jade内で書かれるJavascriptは、htmlに出力されないので便利


jadeでは、コンパイル時にのみ使われるJavascriptを書くことができる。

記法は、

```
- var description = []
- description.push('hoge0')
- description.push('hoge1')
- description.push('hoge2')
- description.push('hoge3')
- description.push('hoge4')
- description.push('hoge5')
- description.push('hoge6')
- description.push('hoge7')
- description.push('hoge8')
```

このように、ハイフンを文頭に入れれば良い。

こうしてJavascriptとして変数定義することで、htmlを大量生成する際に便利となる。

例えば上記のスクリプトを含むファイルを定義し、

/include/_description.jade


という名前で保存する。
各ページでは、

例) page00.jade

```
include /include/_description
meta(name='description', content='#{description[0]}')
```

という風に書けばmeta情報の管理を容易に行うことができる。
Android Gradle Pluginでduplicate files during packaging of APKエラー

gradleでapk作成時に"duplicate files during packaging of APK"エラーが発生しました。


```text
Error:Gradle: duplicate files during packaging of APK /git/intellij/example/app/build/outputs/apk/app-debug-unaligned.apk
Error:Gradle: Execution failed for task ':app:packageDebug'.
> Duplicate files copied in APK META-INF/LICENSE.txt
  	File 1: /Users/test/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.0/8873bd0bb5cb9ee37f1b04578eb7e26fcdd44cb0/commons-lang3-3.0.jar
  	File 2: /Users/test/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.0/8873bd0bb5cb9ee37f1b04578eb7e26fcdd44cb0/commons-lang3-3.0.jar

```

これはAndroid Gradle Pluginの問題でバージョン0.7あたりから知られているようです。

http://stackoverflow.com/questions/20673625/android-gradle-plugin-0-7-0-duplicate-files-during-packaging-of-apk

Goolge codeのAndroidプロジェクトでも下記のIssueが上がっていました。

https://code.google.com/p/android/issues/detail?id=61573#c14

依存ライブラリに指定した外部jarファイルを内部で展開した時に複数のjarファイルでリソースファイルなどのパスが競合してエラーになっているようです。回避策として、Android Gradle Plugin 0.7.1から導入されたpackagingOptionsのオプションで解消できるようです。いまいち腑に落ちませんが、このオプションに重複エラーになるリソースファイルを指定します。

```js:${module_root}/build.gradle
android {
    // 省略
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}
```

NOTICE.txtなども重複しやすいので追加しておくと良さそうです。大文字小文字が違っていたり拡張子.txtがなかったりする場合もありますのでそれらを全部追加しておけば良いかもしれません。あとはエラーが起きた時にその都度追加しましょう。

```js:${module_root}/build.gradle
android {
    // 省略
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}
```
Swiftでenumの整理


過去の経験上、`Java`等でも`enum`列挙型をそれほど多く使用していなかった。それなので個人的には結構ノーマークな話題。
しかし、`Swift`もバージョンアップしてきて仕様も変わっており勉強に追い付いていないため、これを機に`enum`を整理してみる。`.toRaw`等のメソッドもいつの間にか失くなっているしね。

ちなみに、`enum`の中身の値を確認するために、あえて`Playground`で変数への代入をしてます。


###戻り値指定無しのenum

下記のように、`enum`を展開すると変数に(Enum Value)型が代入されている。

![スクリーンショット 2014-10-19 18.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/3184/698fb369-d153-48d2-ec9c-87e942adfa51.png "スクリーンショット 2014-10-19 18.10.33.png")

そこで、`.hashValue`というメソッドで実際の値を取得できるようだ。
値の中身は一般的な`enum`らしく、0から整数順(0,1,2,3,4,5)にて値が設定されている。
`.hashValue`というくらいなので、これらはハッシュ値なのであろう。

![スクリーンショット 2014-10-19 18.13.34.png](https://qiita-image-store.s3.amazonaws.com/0/3184/1ae7dcb3-c26d-a852-b09b-58d507238136.png "スクリーンショット 2014-10-19 18.13.34.png")


###戻り値(Int)指定のenum

今度は、Int値を返すように`:Int`を指定。
この場合、`.hashValue`でも、`.rawValue`でも利用できる。

![スクリーンショット 2014-10-19 18.20.40.png](https://qiita-image-store.s3.amazonaws.com/0/3184/31873201-29e1-19d8-98f6-9bc7d0b0f5f3.png "スクリーンショット 2014-10-19 18.20.40.png")

###戻り値(String)指定のenum

今度は、String値を返すように`:String`を指定。
するとコンパイルエラーとなる。

![スクリーンショット 2014-10-19 18.26.46.png](https://qiita-image-store.s3.amazonaws.com/0/3184/f5af009a-41ca-1e42-1ad8-2669661e4d69.png "スクリーンショット 2014-10-19 18.26.46.png")

`String`型を返すように明示したのだから、enumの値に`String`の値を設定してあげる。


![スクリーンショット 2014-10-19 18.29.53.png](https://qiita-image-store.s3.amazonaws.com/0/3184/f7579f5f-e48c-c73f-cf93-97c635f151df.png "スクリーンショット 2014-10-19 18.29.53.png")

上記の結果を見て、`enum`がどのように展開するかが見えてきた。
実際の`enum`の使いどころは下記のように、`myPet`を`enum`型として使える。戻り値の`String`型ではないのがミソ。


![スクリーンショット 2014-10-19 20.34.56.png](https://qiita-image-store.s3.amazonaws.com/0/3184/de091236-323d-ab8c-0631-8cd29e449221.png "スクリーンショット 2014-10-19 20.34.56.png")



とりあえず、色々試したいし、長くなりそうなので今回はここまで・・・。

*Lovely Swift!!*
Sonarのfindbugs-pluginにカスタマイズルールを実行させる方法

Sonar-3.7だと以下の手順で自分で作成したfindbugsのカスタムルールを実行させることができました。

<pre>
rules.xmlとカスタムルールを実行するjarファイルを以下に配置してSonarを再起動

＜配置場所＞
$SONAR_HOME/extension/rules/findbugs
</pre>
ただし、この方法はSonar-findbugs-pluginの実装が変わったことにより、4.2から変わりました。
Sonar-4.2（名前も変わってSonarQubeとなっています）からは、
独自にプラグインを作って実行させる必要があります。
プラグインを作ると聞くと、ハードルが上がりそうですが、難しくはありません。

やることは以下の３つだけです。
<pre>
1.SonarPluginを継承したクラスを作成
2.ルールのリポジトリクラス作成
3.pomの用意
</pre>

sonar-fb-contrib（もともとsonar-findbugs-pluginを拡張していた別のプラグイン）を参考にすれば簡単に用意できます。
以下みたいになります。

1. SonarPluginを継承したクラスを作成
 MyRulePlugin.javaを用意
<pre>
public final class MyRulePlugin extends SonarPlugin {
　public List getExtensions() {
　　return Arrays.asList(MyRuleRepository.class);
　}
}
</pre>

2. ルールのリポジトリクラス作成
　MyRuleRepository.java
<pre>
public final class MyRuleRepositoryextends RuleRepository {
　private XMLRuleParser xmlRuleParser;
　public MyRuleRepository(XMLRuleParser xmlRuleParser) {
　　super("findbugs", Java.KEY);
　　setName("Findbugs");
　　this.xmlRuleParser = xmlRuleParser;
　｝
　@Override
　public List<Rule> createRules() {
　　return xmlRuleParser.parse(getClass()
           .getResourceAsStream("/org/sonar/plugins/myrule/rules.xml"));
　}
}
</pre>

コンストラクタで、「findbugsの仲間だよ」と親クラスに教えてあげている箇所があります。
これがないとfindbugsとして動きません。
また、Java.KEYは費推奨になっているので、気になる方は直接"java"としてください。

3. pom.xml
<pre>
\<properties>
　\<sonar.pluginName>myPlugin\</sonar.pluginName>
　\<sonar.pluginClass>{2.のフルパッケージ名}\</sonar.pluginClass>
　\<license.skip>true\</license.skip> ← エラーになると面倒なので入れておく。
\</properties>
\<dependecies>
・・・中略・・・
　\<dependecy>
　　　\<groupId>my.findbugs-group.id\</groupId>
　　　\<artifactId>my.findbugs-artifact.id\</artifactId>
　　　\<version>0.1.0\</version>
　　　\<scope>import\</scope>
　\</dependecy>
\</dependecies>
\<build>
　\<plugins>
　　\<plugin>
　　　\<groupId>org.codehaus.sonar</groupId>
　　　\<artifactId>sonar-packaging-maven-plugin\</artifactId>
　　　\<configuration>
　　　　\<basePlugin>findbugs\</basePlugin
　　　　\<requirePlugins>java:1.4\</requirePlugins>
　　　\</configuration>
　　\</plugin>
　\</plugins>
\</build>
</pre>

sonar-packaging-maven-pluginを書いていますが、
これは、名前のとおりでsonarのmavenプラグインに含みますよ、という宣言です。
これがないと、sonarを起動した際にpluginとして認識してもらえないため、deployされません。

ここまでできれば、$SONAR_HOME/extension/pluginに作ったjarファイルを配置して
Sonarを再起動するのみです。
チェックが実行されているかは、3.7と同様のやり方で、ログに出ればＯＫです。
<pre>
Found findbugs plugin: /usr/local/sonar/extensionplugin/myPlugin.jar_zip/META-INF/lib/myFindbugs.jar ←カスタムチェックのjar
</pre>

以上のログを見てお察しのとおりで、チェックするjarはMETA-INF/lib下に置かれている必要があります。
万が一上手く、動かないなどありましたら、ここにご自身で作られたfindbugsのチェックを実装したjarファイルがあるかを確認してみてください。

また、SonarQube4.5になると、sonar-findbugs-pluginがの実装が変わっているため、
この方法では動かない可能性があります。
具体的には、今回作成したリポジトリクラスなどが全てsonar-findbugs-pluginの中に入ってしいます。
なので、外部からの拡張が効かなくなっている可能性が高いです。
SonarQube4.5でも今回の手順でアプローチするのは悪くないですが、もし動かなければ、
sonar-findbugs-pluginのソースを持ってきて、直接組み込んでください。
Redis

### 特徴
* インメモリ（サイズ注意）
* 更新頻度の高いデータに適用
* 永続化可能

### データー構造
* LIST（連結リスト）
* SET（重複のない集合）
* SORTED SET（ソート済みのSET）
* HASH（連想配列）

### 導入
#### redisを導入:
http://morizyun.github.io/blog/redis-mac-centos-rails/

#### node用クライアントを導入:
http://nodejs.osser.jp/thread/node-redis
##### インストール
Cライブラリhiredisも対応しています、hiredisはノンブロッキング且つスピードはやいなので、お勧めします。

```zsh
$ npm install hiredis redis
```

hiredisモジュールはシステムに入ってたら、node-redisはデフォルトで使用します。入ってなかったら、ピュアなJavascriptパーサーを利用します。

*hiredisを利用する場合、node.jsの新バージョンをリリースされたら、hiredisライブラリを再コンパイルする必要ですので、ご注意ください。*

##### node-redisサンプル
node-redisオフィシャルモジュールにシンプルなサンプルを提供されてます。

```js

var redis = require("redis"),
    client = redis.createClient();
// if you'd like to select database 3, instead of 0 (default), call
// client.select(3, function() { /* ... */ });
client.on("error", function (err) {
    console.log("Error " + err);
});
client.set("string key", "string val", redis.print);
client.hset("hash key", "hashtest 1", "some value", redis.print);
client.hset(["hash key", "hashtest 2", "some other value"], redis.print);
client.hkeys("hash key", function (err, replies) {
    console.log(replies.length + " replies:");
    replies.forEach(function (reply, i) {
        console.log("    " + i + ": " + reply);
    });
    client.quit();
});
```

##### 実行結果

```zsh
$ node example.js
Reply: OK
Reply: 0
Reply: 0
2 replies:
    0: hashtest 1
    1: hashtest 2
```
delete_if がやけに遅いけど、compact! と keep_if は普通。

先程「`ary-[nil]` と `ary.compact`」という記事( http://qiita.com/Nabetani/items/ba6b8eea61e03ce48df7 )を書いたんだけど、そういえば `delete_if` とかもあったよな、と思い、調べてみたら意外な展開に。

まずはグラフ。縦軸は時間。対数目盛注意。

CRuby は、2.1.3。
JRuby は、1.17.15。

![dekeco.png](https://qiita-image-store.s3.amazonaws.com/0/6854/30ddbf5c-9d6f-2009-a93a-ac22a3c2bf38.png "dekeco.png")


`compact` がぐねぐねしているのは、誤差。

まず。
配列のサイズと繰り返す数の積が一定になるようにしているんで、計算量が変わらないことを期待しているんだけど、`delete_if` はどんどん遅くなっている。
対数目盛なのでわかりにくいかもしれないけど、10倍以上遅くなっている。

`keep_if` や `compact!` は期待通り。なんだろうこれ。

`delete_if` の後半以外は CRuby が速いけど、`delete_if` の後半だけは JRuby が速いというところも面白い。

`delete_if` には副作用のないバージョンがないので、公平を期すために、`compact` の代わりに `dup.compact!` にしている。

測定に使ったソースコードは以下のとおり：

```ruby
require "benchmark"

puts "array size,trial count,label,delete_if,keep_if,compact"
2.to_r.step(7,1.to_r/6) do |ary_size_e|
  ary_size =(10**ary_size_e).ceil.to_i
  src=Array.new(ary_size){  |n|
    n%2==0 ? nil : n
  }

  trial = (10**7/ary_size ).ceil
  print "array size : #{ary_size},trial count : #{trial},,"
  Benchmark.benchmark( "", nil, "%u,") do |x|
    x.report( "" ){ trial.times{ src.dup.delete_if{ |x| x.nil? } } }
    x.report( "" ){ trial.times{ src.dup.keep_if{ |x| ! x.nil? } } }
    x.report( "" ){ trial.times{ src.dup.compact! } }
  end
  puts
end
```
iOSアプリ動画キャプチャ

iOS8 に続いて Yosemite も一般公開されたので、これで可能になった iOS デバイス画面の動画キャプチャをやってみました。

# 動作環境
- Mac + OS X Yosemite
- iOS8 Device
- Lightning ケーブル

# キャプチャ手順
1. Mac と iOSデバイスを Lightning ケーブルでつなぐ

2. QuickTimePlayer を起動する

    ![スクリーンショット 2014-10-17 18.14.34.png](https://qiita-image-store.s3.amazonaws.com/570/47457/3221feec-a6ad-99b7-e16f-13051da7a250.png)


3. メニューバー > ファイル > 新規ムービー収録 をクリック

    ![スクリーンショット 2014-10-17 18.15.54.png](https://qiita-image-store.s3.amazonaws.com/570/47457/bb8b3c16-66d1-6a87-4e01-6142a811bd9a.png)

4. 録画ボタン横のメニューの 「カメラ」 「マイク」にて接続したデバイスを選択する

    ![スクリーンショット 2014-10-17 18.17.18.png](https://qiita-image-store.s3.amazonaws.com/570/47457/0742f792-9d8b-0fec-24ec-7b236a5edbcb.png)

5. デバイスのスクリーンがQuickTime上に映し出されたら録画ボタンをクリックして録画開始


6. 停止ボタンクリックで録画終了

7. メニューバー > ファイル > 保存 をクリックで、キャプチャした動画を保存

    ![スクリーンショット 2014-10-17 18.23.11.png](https://qiita-image-store.s3.amazonaws.com/570/47457/720d6ca5-fade-9ac2-6510-dc0283f501f4.png)

- h.264コーデックの.movで保存される。

# トラブルシューティング

## Adobeソフトに読み込むと明るくなる

**症状**

- キャプチャした動画を AfterEffects や Premiere に持っていくと、まれに明るくなってしまうことがある。
- QuickTime や FinalCutProX ではならない。なんかやらしい。

**原因**

- おそらくキャプチャされた .mov ファイルは色空間がYUVになっていて、映像内にスーパーホワイト(Y=>235)が含まれていると、Adobeソフトの読み込み時の自動RGB変換においておかしなことになるっぽい。
- ホワイトレベルが高くない映像は問題無い。(というよりは問題が小さいってことかな？)

**対処法**

.m4vで書き出すと正しくRGB変換されるっぽい(多分)

1. メニューバー > ファイル > 書き出す > iPad, iPhone... をクリック

    ![スクリーンショット 2014-10-17 18.30.36.png](https://qiita-image-store.s3.amazonaws.com/570/47457/abdff07a-b671-f73b-fb52-51c740fe1a35.png)

2. サイズを選択して保存ボタンをクリック

    ![スクリーンショット 2014-10-17 18.32.40.png](https://qiita-image-store.s3.amazonaws.com/570/47457/24ed37be-a83c-6ca8-d687-2a52bf214ad7.png)

3. 保存した.m4vを使用する。
    - 画質的には気になるような差はない。(どちらもh.264コーデック)
MQTT でグループチャット ことはじめ

# はじめに
MQTT でグループチャットを実現する方法について考えてみます。

# 基礎知識
## MQTT とは
MQTT (Message Queue Telemetry Transport の略称) とは、publish/subscribe パターンに基づく軽量なメッセージングプロトコルです。TCP、TLS over TCP、WebSocket 上で動作します。MQTT は制限されたネットワーク帯域でも小さなコードフットプリントで動作するよう設計されています。

MQTT プロトコルの詳細は、参考資料で詳しく解説されているのでここでは触れません。

## publish/subscribe パターンとは
publish/subscribe パターンでは、メッセージの送信者 (publisher、出版者) が特定の受信者 (subscriber、購読者) に直接メッセージを送信しないようにプログラムされています。このパターンでは、message broker (メッセージの仲介役) が必要になります。message broker は、メッセージの「トピック」に関心のあるクライアントにメッセージを配信する責任をもっています。

基本的には publisher と subscriber がクライアント、message broker がサーバで動作することになります。これ以降、publisher/subscriber を MQTT クライアントと呼ぶことにします。

# 考察
## MQTT の利用例
少し前に Facebook が Beluga というグループチャットアプリを開発していた企業を買収しましたが、その目的は Facebook で行われるチャットを Beluga で使われていた MQTT ベースのインフラに置き換え、チャットをもっと快適に行えるようにすることでした。

MQTT プロトコルを使わずとも、HTTP/HTTPS などでも同様なことは実現可能です。しかし、MQTT はプロトコルのオーバーヘッドが非常に小さく、接続指向のプロトコルなので大量の接続からのちょっとしたデータを低遅延・小消費電力でリアルタイムにやりとりするのに向いています。

うまくやれば、Facebook Messenger のように超大規模チャットを支えることができるプロトコルというわけです。また、IoT を支える技術としても注目されています。

IBM の資料によると、HTTP に比べるとトラフィックが 1/10 〜 1/100 で済み、電池の消費量が 1/10 以下になるとのことです。HTTPS だとトラフィック量に比例して SSL/TLS の暗号化・復号化のオーバーヘッドが大きくなるので、さらに電池の消費量が減りそうに思えます。

## MQTT クライアントの機能
基本的には以下の５つの機能しかありません。

 1. MQTT broker に接続する
 2. MQTT broker から切断する
 3. メッセージを publish する
 4. 購読を開始する
 5. 購読を終了する

グループチャットクライアントを実装しようとした場合、ユーザ管理やグループ管理などは別途容易する必要があることが分かります。

## MQTT broker の機能
先ほど「ユーザ管理やグループ管理などは別途容易する必要がある」と述べました。例えば MQTT broker の実装である「RabbitMQ」は、コマンドラインツールや RabbitMQ Management HTTP API  でユーザの管理を行うことができます。しかし、グループチャットを実装しようとするとユーザごとのコンタクトリストの管理なども必要なのでこれだけでは限界がありますし、RabbitMQ Management HTTP API 自体は RabbitMQ の持つ機能にフルアクセスができてしまうのでよろしくありません。

となると、グループチャットサービスサーバを別途用意し、そこから RabbitMQ Management HTTP API を呼び出して MQTT レベルのユーザ管理や権限管理を行い、足りない機能はグループチャットサービスサーバで別途実装する、というのが現実的だと思います。

# 参考資料
 1. [MQTT - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/MQTT)
 2. [MQTTについてのまとめ — そこはかとなく書くよん。](http://tdoc.info/blog/2014/01/27/mqtt.html)
 3. [Building Facebook Messenger](https://www.facebook.com/notes/facebook-engineering/building-facebook-messenger/10150259350998920)
 4. [MQTT used by Facebook Messenger | MQTT](http://mqtt.org/2011/08/mqtt-used-by-facebook-messenger)
 5. [時雨堂 MQTT ブローカー開発ログ](https://gist.github.com/voluntas/558fea1445253e6dc6c2)
 6. [Low Latency Mobile Messaging using MQTT](http://www.slideshare.net/henriksjostrand/devmobile-2013-low-latencymessagingusingmqtt)
 7. [alsm/gochat-mqtt](https://github.com/alsm/gochat-mqtt)
 8. [Paho - Open Source messaging for M2M](http://www.eclipse.org/paho/clients/golang/)
 9. [MQTT V3.1 プロトコル仕様](http://public.dhe.ibm.com/software/dw/jp/websphere/wmq/mqtt31_spec/mqtt-v3r1_ja.pdf)
 10. [RabbitMQ - Management Plugin](https://www.rabbitmq.com/management.html)
 11. [RabbitMQ Management HTTP API](http://hg.rabbitmq.com/rabbitmq-management/raw-file/rabbitmq_v3_3_5/priv/www/api/index.html)
 12. [ruby-amqp/rabbitmq_http_api_client](https://github.com/ruby-amqp/rabbitmq_http_api_client)
 13. [michaelklishin/rabbit-hole](https://github.com/michaelklishin/rabbit-hole)
 14. [MQTT、IBM MessageSight 技術セミナー](http://www.ibm.com/developerworks/jp/websphere/library/connectivity/ms_mqtt_ws/)
テーブルビューで、下に引っ張ったら更新するやつ (RubyMotion)


Twitterなど色んなアプリでおなじみ、Pull to Refresh機能の実装。

`UITableViewController`の中で、`UIRefreshControl`を設定する。また、更新時の処理を`
addTarget:action:forControlEvents:
`を利用してセット。

```ruby:items_controller.rb
class ItemsController < UITableViewController
  def viewDidLoad
    super

    # 略

    # refreshControlに、UIRefreshControlのインスタンスを設定
    self.refreshControl = UIRefreshControl.new.tap do |refresh|

      # 更新用のアクションを指定
      refresh.addTarget(self, action: 'refresh_items', forControlEvents: UIControlEventValueChanged)

    end

    # 略
  end

  def refresh_items

    # 更新開始の宣言
    self.refreshControl.beginRefreshing

    # (テーブル更新用の処理を記述)

    # 更新終了の宣言
    self.refreshControl.endRefreshing
  end
end
```

上記のように簡単に実装できる。めんどうなのは、更新処理の中身の方ですかねー。
Run/Debug Configurations で Please select Android SDK エラー

IntelliJをバージョンアップしてRun/Debugを実行すると"please select Android SDK"のエラーが起きるようになりました。テストやビルドではエラーにならずapkパッケージの作成時にエラーになります。

![スクリーンショット 2014-10-19 14.50.43.png](https://qiita-image-store.s3.amazonaws.com/0/3324/58977016-83a4-a0fd-420e-c11b78e6823e.png)

参考までに問題が発生した環境は以下の通り。この環境だけの問題ではなく他のバージョンでも発生すると思われますのであくまで参考までに。Android Studioでも発生するようです。

* Mac OS X
* IntelliJ IDEA 13.1.5
* Android Gradle Plugin 0.13.2  


調べてみると事例がいくつか上がっているようです。

https://code.google.com/p/android/issues/detail?id=73086

http://stackoverflow.com/questions/21070268/intellij-idea-13-error-please-select-android-sdk

Project Structureを開いてSDKsを設定し直し

![スクリーンショット 2014-10-19 14.27.36.png](https://qiita-image-store.s3.amazonaws.com/0/3324/00cb0a57-1580-42aa-97c8-f2bb93bfd663.png)

Modulesを設定し直し

![スクリーンショット 2014-10-19 14.28.27.png](https://qiita-image-store.s3.amazonaws.com/0/3324/744f9ab2-842c-8c58-3ade-6c9853d73504.png)

これでエラーは消えました。
ダミーのpodspecを作って、画像素材などのライセンスもCocoaPodsと一緒に表示する


CocoaPodsはiOSやMacアプリを作る際のライブラリ管理に便利ですが、[ライセンス一覧を自動生成してくれる](https://github.com/CocoaPods/CocoaPods/wiki/Acknowledgements)のも地味に助かります。
※ [近々、本体からは分離してしまう](http://qiita.com/laiso/items/47c1e32bc325549720dd)ようですが…。

[VTAcknowledgementsViewController](https://github.com/vtourraine/VTAcknowledgementsViewController)などを使えば、生成されるplistファイルを元に、簡単にライセンス画面が表示できてしまいます。

ここで気になるのは、画像や音楽素材など、CocoaPodsで管理していないもの達。同じ謝辞なのにCocoaPodsと別に表示するのも微妙といえば微妙です。

で、今までは、[こんな風にPodfileの`post_install`で、無理やりplistを書き換えてた](https://github.com/tnantoka/tetloop/blob/master/Podfile)んですが、使い回しづらいし、馬鹿っぽいなと思ったので、ダミーのpodspecを作ってやってみました。

[tnantoka/podspecs](https://github.com/tnantoka/podspecs)

例えば、Bootstrap用のpodspecは以下のようになります。

```ruby:Bootstrap.podspec
Pod::Spec.new do |s|
  s.name             = "Bootstrap"
  s.version          = "0.1.0"
  s.summary          = ""
  s.description      = <<-DESC
                       DESC
  s.homepage         = "https://github.com/twbs/bootstrap"
  s.license          = { :type => 'MIT', :file => 'Specs/Bootstrap/LICENSE' }
  s.author           = 'Twitter, Inc'
  s.source           = { :git => "https://github.com/tnantoka/podspecs.git", :tag => s.version.to_s }
end
```

Bootstrapのようにgit管理されているものは、直接[twbs/bootstrap](https://github.com/twbs/bootstrap)をsourceに指定してもいいんですが、無駄にcloneしてくるのもあれなので、LICENSEファイルだけ拝借してきました。

あとは、Podfileにこのpodspecを指定してpod installするだけ。

```ruby:Podfile
source 'https://github.com/CocoaPods/Specs.git'

pod 'VTAcknowledgementsViewController', '~> 0.12'

pod 'Bootstrap', podspec: 'https://raw.githubusercontent.com/tnantoka/podspecs/master/Specs/Bootstrap/Bootstrap.podspec'

post_install do | installer |
  require 'fileutils'
  FileUtils.cp_r('Pods/Target Support Files/Pods/Pods-acknowledgements.plist', 'Podspecs/Pods-acknowledgements.plist')
end
```

VTAcknowledgementsViewControllerなら、こんな感じに表示されます。

![](https://raw.githubusercontent.com/tnantoka/podspecs/master/screenshot1.png)![](https://raw.githubusercontent.com/tnantoka/podspecs/master/screenshot2.png)

ベストな方法ではないと思いますが、しばらくは素材のライセンス系はここで管理していく予定です。

もし他にいい方法があれば教えて下さい！
CentOS 6 系における tmux のインストール

tmux のインストール.md
======================

```
wget "http://sourceforge.net/projects/tmux/files/latest/download?source=files"
tar xvzf tmux-1.9a.tar.gz
cd tmux-1.9a
./configure
make
sudo make install
```

libevent が必要なため、インストールする
```
sudo yum install libevent libevent-devel
```

yum からインストールした libevent 使用してビルドするとエラーとなる。
```
control.c: In function ‘control_callback’:
control.c:62: warning: implicit declaration of function ‘evbuffer_readln’
control.c:62: warning: nested extern declaration of ‘evbuffer_readln’
control.c:62: error: ‘EVBUFFER_EOL_LF’ undeclared (first use in this function)
control.c:62: error: (Each undeclared identifier is reported only once
control.c:62: error: for each function it appears in.)
control.c:71: warning: implicit declaration of function ‘time’
control.c:71: warning: nested extern declaration of ‘time’
make: *** [control.o] Error 1
```

最新の libevent を取ってきてインストールする。
http://libevent.org
```
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure
make
sudo make install
```

これで再度 tmux をインストールする
```
./configure
make
sudo make
```

起動してみるが、エラー
```
% tmux
tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
```

次のコマンドをたたくとなおる。
```
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
```

以上
Treasure Agent (td-agent)からTreasure Dataにデータを入れる

[トレジャーデータ](http://www.treasuredata.com/jp/)では、クラウドサービスに継続的にデータをアップロードするためのデーモンとしてTreasure Agent(td-agent)を開発しました。td-agentの一部は[Fluentd](http://www.fluentd.org/)としてオープンソース化されており、様々な企業で使われています。

この記事では、td-agentを用いて[トレジャーデータ](http://www.treasuredata.com/jp/)にデータをアップロードする方法を紹介します。こちらの[3分ビデオチュートリアル](http://docs.treasuredata.com/articles/td-agent#how-to-install-treasure-agent)でも実際の設定方法を見ることができます。

# Step0: 事前準備

事前準備として、[こちら](http://docs.fluentd.org/articles/before-install)のドキュメントに従ってNTPとファイルディスクリプタ最大数の設定を行って下さい。最悪の場合、ログの消失に繋がります。

# Step1: td-agentのインストール

Mac / Linux向けのパッケージが提供されていますので、ダウンロードしてインストールします。

##### RHEL/CentOS 5,6

    $ curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

##### Ubuntu 10.04,12.04

    # 10.04 Lucid
    $ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-lucid.sh | sh
    # 12.04 Precise
    $ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-precise.sh | sh


##### MacOS X 10.8,10.9

    $ open 'http://packages.treasuredata.com/2/macosx/td-agent-2.0.3-0.dmg'

# Step2: td-agent.confの編集

/etc/td-agent/td-agent.confを以下のように編集します。APIキーはトレジャーデータに[サインアップ](https://console.treasuredata.com/users/sign_up)したあと、[Webコンソール](console.treasuredata.com/users/current)から取得します。Write Only APIキーを使うのに注意して下さい。

    # HTTP input
    <source>
      type http
      port 8888
    </source>
    
    # Treasure Data output
    <match td.*.*>
      type tdlog
      endpoint api.treasuredata.com
      apikey YOUR_API_KEY
      auto_create_table
      buffer_type file
      buffer_path /var/log/td-agent/buffer/td
      use_ssl true
    </match>

編集後、再起動を行います。

    # Linux
    $ sudo /etc/init.d/td-agent restart
    
    # MacOS X
    $ sudo launchctl unload /Library/LaunchDaemons/td-agent.plist
    $ sudo launchctl load /Library/LaunchDaemons/td-agent.plist

# Step3: データの投入

最後にデータを投入してみます。今回はHTTT POSTにてJSONをローカルのtd-agentに送信します。

    $ curl -X POST -d 'json={"action":"login","user":2}' \
      http://localhost:8888/td.testdb.www_access

通常は5分に1回データのアップロードが行われます。以下のコマンドで強制的にバッファをフラッシュする事も可能です。

    # Linux
    $ kill -USR1 `cat /var/run/td-agent/td-agent.pid`
    
    # MacOS X
    $ sudo kill -USR1 `sudo launchctl list | grep td-agent | cut -f 1`

その後、Webコンソールの[データベース](https://console.treasuredata.com/databases)タブからデータが投入された事を確認できます。

# まとめ

以上で完了です。何か問題が起こった場合は、/var/log/td-agent/td-agent.logを参照するか、support@treasure-data.comまで問い合わせて下さい。

HTTPの他にも各種言語からログをPOSTする事が出来ます。Java, Ruby, Python, Perl, PHP, Node.js, Scala, .NET等がサポートされています。

- [Streaming Import](http://docs.treasuredata.com/categories/streaming-import)

td-agentのトレジャーデータへの書き出しプラグインにはその他にも様々なオプションがあります。詳しい情報に関しては以下の記事を参考にして下さい。

- [fluent-plugin-tdの説明](http://qiita.com/repeatedly/items/df4a3623a78f3e063a34)

大規模環境での設定は以下のドキュメントを参考にして下さい。弊社では約5000台にtd-agentをインストールし、リアルタイムにログを1分間隔で収集されているお客様もいます。

- [High Availability td-agent Configuration](http://docs.treasuredata.com/articles/td-agent-high-availability)

<img src="http://ads.perfectaudience.com/seg?add=2777304&t=2" width="1" height="1" border="0" />