OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino UNO + LCD + 温湿度センサ



諸事情によりQiitaを使うことになったので、試しに記事をお引っ越ししてみます。
ここから。

Arduino UNOと16x2のLCD、温湿度センサを使って

温度と湿度を表示できるようにしてみた。

![20130629164718.jpg](https://qiita-image-store.s3.amazonaws.com/0/38611/b88e38be-4449-7a7b-9663-8fdc81cc2bde.jpeg)

メインはArduino UNO。

##LCDディスプレイ

SparkFun LCD-00791


と、それをシリアル制御できるSerLCD。

[Serial Enabled LCD Backpack - SparkFun Electronics](https://www.sparkfun.com/products/258)

これは、ディスプレイをシリアルで制御できるようにするモジュール。

 

まずはLCDで表示のテストから。

使い方は、ここにサンプルコードと共にあったのでこれを参考に。

[Serial LCD quickstart - SparkFun Electronics](https://www.sparkfun.com/tutorials/246)



さらに、ここに書かれているように

SerLCD用のライブラリがあったので、これを使ってさらにシンプルに書くことができる。

[Arduino Playground - SerLCD](http://playground.arduino.cc/Code/SerLCD)

 

## 温湿度センサ

DHT22/RHT03

※時期によって型番が異なるが、同一らしい

[DHT22 temperature-humidity sensor + extras ID: 385 - $12.50 : Adafruit Industries, Unique & fun DIY electronics and kits](http://www.adafruit.com/products/385)

http://hirooka.pro/?p=945

![20130626084837.jpg](https://qiita-image-store.s3.amazonaws.com/0/38611/ac3bcc5f-352b-47f5-b0f9-14e7f1a6d676.jpeg)

値を取得するコードはこちらのサイトを参考にさせていただき、あっさり取得できた。

[ DHT22 / RHT03 | hirooka.pro](http://hirooka.pro/?p=945)

### Arduino UNOではsprintfでのfloatが扱えない

ただ、シリアル経由でPCに飛んでくるデータを見ると正しく数値は

取得できているようだが、

センサの値が何故か表示されず、軽くはまった。

どうもsprintfでのfloatの値がうまく文字列に変換されていない。 


調べてみると、Arduino Unoではsprintfでfloatは使えないらしい。

その代わり、dtostrf()という関数があることがわかった。

http://garretlab.web.fc2.com/arduino/reverse_lookup/index.html#string-float_to_string

##スケッチ

かなり適当だが最終的なコードはこんな感じ。 

https://gist.github.com/u-one/5938598#file-rht03-serlcd
perlにおける配列要素数の取得

#perlにおける配列要素数の取得
めっさめさ今更感が漂うけれど備忘録に投稿させていただきます.

##最後の要素番号を利用
````
@array=('anpan','syokupan','karepan');
````
という配列に対し,
$#arrayを参照することでこの配列の最後の要素番号（karepanの要素番号）を参照することが出来る.
つまり,この場合,要素数「2」が取得できる.（要素数は0からカウントされるから）
ということは,
````
$#array+1
````
で知りたい情報となる.

##配列自体をスカラー変数に代入
````
@array=('anpan','syokupan','karepan');
````
を
````
$length=@array;
````
と,スカラー変数に代入することで,簡単に配列の要素数を取得することができる.
逆に言うと,スカラー変数に代入してしまうと配列として扱うことはできない.

##配列リファレンスの要素数が知りたい
````
@array=('anpan','syokupan','karepan');
$refArray = \@array;
````
ここまでのお話は配列が対象だったが,配列リファレンスの場合はどのように参照するのか？

もちろん,上記二つのやり方は使えない.



ここではscalar関数を使ってやればいい.
````````````````````
scalar(@$refArray);
`````````````````````

引数としてデリファレンスしたものを渡してあげれば,要素数を返してくれる.

というか,リストコンテキストをスカラーコンテキストに変換するという話なので,配列そのものを引数に指定することもできる.
配列リファレンスだとスカラー変数に代入しないと使いようがないため,scalar変数を使うしか方法がないという話でもある.
[jQuery] isメソッドで:invalidを使えるようにする


久しぶりにjQuery触っていたら、isメソッドに:invalid擬似クラスを指定したところでSyntax Errorになった。
自家製CSS Selectorだし、いずれ先のバージョンで対応されるんだろうけど、取り急ぎ使えないと不便だったのでjQueryオブジェクトを拡張。

```javascript
$.extend($.expr[':'], {
  invalid: function(e, inx, match){
    var invalids = document.querySelectorAll(':invalid');
    var result = false;
    for(var i=0; i<invalids.length; i++){
      if(e === invalids[i]){
        result = true;
        break;
      };
    };
    return result;
  }
});
```

これで、自然に使えるようになる。はず。

```javascript
if($(this).is(':invalid')){
  alert('Validation Error!');
};
```
お手軽？16進数から10進数への変換

Windows標準の（プログラム）電卓を使っても良いのですが、　「俺はコマンドラインが好きなんだぁぁ！」？？な人向けに・・・
***
**シェルの演算機能を使ってみましょう。**
`bc`コマンドや`printf`コマンドでも変換できますが、書式など忘れやすいものです。
そんな時は、以下のようにサクっと打ってみましょう。

**16進数「1F2E」を10進数に変換する例**

```
$ echo $((0x1F2E))
7982
```

`$((計算式))`　で計算をしてくれますが、結果は10進数で表示されることを利用したものです。
なので、「16進数同士を計算して、結果は10進数で」みたいなこともできます。

```
$ echo $((0xFF + 0x11))
272
```

あまりお手軽ではなかったですね・・・
でも、電卓ではなく、ターミナルからカチャカチャって変換すると、何かカッコイイかも？？
phpseclib の Net_SSH2 でエージェント認証

`System_SSH_Agent` が psr-0 のディレクトリ構成になっていないので composer から入れるとオートロードされない（クラス名の区切りがディレクトリ区切りになっていない）。

 - https://github.com/phpseclib/phpseclib/blob/0.3.6/phpseclib/System/SSH_Agent.php

include-path が通っているので require_once で明示的に読みこめば大丈夫。

 - https://github.com/phpseclib/phpseclib/blob/0.3.6/composer.json#L59

```php
<?php
require_once 'vendor/autoload.php';
require_once 'System/SSH_Agent.php';

$agent = new System_SSH_Agent();
$ssh = new Net_SSH2('example.net');

if (!$ssh->login('your', $agent))
{
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
```
global-set-key したキーが特定の mode-map に取られてしまったときーー!

# 悲しいときーーー!!
悲しいときーーー!!
ゴキゲンな lisp を入れて `global-set-key` を設定したら、特定のモードのときにその mode-map にキーが取られてしまったときーーー!!

そのような場合に以下のように対処してみました。
もっとよい方法があったらお教え下さい。

### 追記
syohex さんにコメントで「上書きされない用のマイナーモードを作る方法」を教えていただきました。→ http://d.hatena.ne.jp/rubikitch/20101126/keymap

# ゴキゲンな lisp を入れたらキーバインド衝突
ゴキゲンな lisp の例として、`expand-region` をご紹介します。(「[自分が入れたEmacs便利拡張・設定集 (2013年版) - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2013/12/30/190354)」で学びました。わしのようなレイトマジョリティにはたまらない、よだれ記事です。ありがとうございました。)

## 設定

```el
(require 'expand-region)
(global-set-key (kbd "C-,") 'er/expand-region)
```

よし! `C-,` ッターン!!! うお〜〜いいねいいね〜〜!!
と思った矢先……

## モードマップと衝突

そしたら org-mode で `C-,` が `org-cycle-agenda-files` に割り当てられていたので見事に衝突ですよ。 birthday.org が開かれてしまいましたよww 一つも誕生日など書かれていない無意味なファイルですよwwww

# 衝突を解消する

この例では、org モードがロードされたら org-mode-map の `C-,` を nil にして割り当てを解除しました。

```el
;;
;; Disabling key bindings
;;
(eval-after-load "org"
  '(progn
     (define-key org-mode-map (kbd "C-,") nil)
     ))
```

# 終わりに

この方法では衝突するモードが見つかるたびにそれぞれ解除しないといけません。
もっといい方法があるのでしたら是非とも教えていただきたく存じます。

### 大事なことなのでもう一度追記
syohex さんにコメントで「上書きされない用のマイナーモードを作る方法」を教えていただきました。→ http://d.hatena.ne.jp/rubikitch/20101126/keymap
MacでRaspberry　Piのイメージファイルを書込手順


```shell-session

# SD　Cardのディバイス名を確認
$ diskutil list

#Unmount SD card
#私の場合disk1
$ diskutil unmountDisk /dev/disk1

#SDに書き込み、かなり時間かかりました。
$ sudo dd if=pidora-18-r2c.img of=/dev/disk1 bs=1m

```
FKGridViewを使ってObjective-Cでグリッドレイアウト

![スクリーンショット 2014-03-05 13.45.15.png](https://qiita-image-store.s3.amazonaws.com/0/2846/63a1e26e-1652-c829-82d9-def2af6c8d62.png)

jQueryのvgridの簡易的なものを再現したかったんですが、
色々ライブラリ探したんですけど手軽なのが無かったので作ってみました。

ソースコードは下記に格納しています。

<a href="https://github.com/fromkk/FKGridView" title="FKGridView" target="_blank">https://github.com/fromkk/FKGridView</a>

使い方は、

```objc
//initialize
self.gridView = [FKGridView new];
//set view frame
self.gridView.frame = self.view.bounds;
//set col counts
self.gridView.cols = 3;
//auto resize items.
self.gridView.autoresizeWidth = YES; //add subview
[self.view addSubview:self.gridView];

for (int i = 0; i < 102; i++) {
    //create subview
    UIView *currentView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, (320.0f - 5.0f * 4.0f) / 3.0f, rand() % 10 * 10.0f)];
    //red background color
    currentView.backgroundColor = [UIColor redColor];
    //add item. if animated is NO then stop animation.
    [self.gridView addGridItemView:currentView animated:YES];
}
```

UITableViewやUICollectionViewみたいに再利用に対応したいなと思ってはいるんですが、
とりあえず今回の案件ではそこまで負荷は掛からなそうだったのでビューを貼っつけるだけで対応しました。
カラム数を決め打ちにすると結構シンプルにいけそうだったので決め打ちで作ってます。

[参照](http://fromkk.me/fkgridview "FKGridView")
5分で完了！iOS6/7ステータスバー対策

#はじめに
ステータスバーらしさを出すミニマムな対応であれば5分で可能です。
storyboardとResolve Auto Layout issuesの機能を使用し
コードは1行も書いていません。

#storyboard

webViewを上部から20pxあけて配置しています

##AutoLayoutの有効化

![スクリーンショット 2014-03-05 16.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d6171dae-1bd9-790f-7f21-2495562a4e92.png)

↓

![スクリーンショット 2014-03-05 16.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/12362/175555b2-da1c-47f0-867c-b3f9aa932c60.png)


###有効化で増えた項目

 - Top Layout Guide
 - Bottom Layout Guide

##Top Layout GuideとViewをつなぐ
![topConweb.png](https://qiita-image-store.s3.amazonaws.com/0/12362/5fee9462-fb4a-5a53-d0bc-f740c57c0c10.png)

↓

###縦に固定20pxの制約をつけます
![スクリーンショット 2014-03-05 19.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b4ada63c-f4df-10be-0e28-83d73f6763fc.png)

↓

###問題があるようで丸に矢印のアイコンが表示されます
このアイコンをクリックすると次の画面に遷移
![スクリーンショット 2014-03-05 16.35.34.png](https://qiita-image-store.s3.amazonaws.com/0/12362/70f55204-3056-017a-acc6-12d589dc6a80.png)

↓

###問題の解決

問題の解決方法を提示するメッセージが表示されています
![スクリーンショット 2014-03-05 16.35.55.png](https://qiita-image-store.s3.amazonaws.com/0/12362/4821553a-75ff-9b83-9cc6-7becd4a7927a.png)

#Resolve Auto Layout issues
エラーの内容をみたけど、対応がわからない。手っ取り早く作りたい。

そんな時に

![スクリーンショット 2014-03-05 16.36.58.png](https://qiita-image-store.s3.amazonaws.com/0/12362/2739f76f-2d8c-f5cb-5d03-b75af5cf4e40.png)

#シミュレータで確認
※加工した部分はFacebookの記述です。
##iOS7

ステータスバーのピンクはControllerのViewの背景色です。
20px分空いている。
![iOS7.png](https://qiita-image-store.s3.amazonaws.com/0/12362/c64c9d26-97ed-a707-419c-d6ce84e8fe43.png)

##iOS6
ステータスバーは黒で、ControllerのView背景色は見えません。
![ios6.png](https://qiita-image-store.s3.amazonaws.com/0/12362/2aff7f41-5b48-b06b-1842-54b6debd301a.png)

大まかなレイアウトとしては想定通りです。

#参考URL

Xcodeでの操作はこちらの記事を元に実行して確認できました
http://blog.grio.com/2013/10/upgrading-your-iphone-app-to-ios-7-the-new-status-bar.html

makoto_kwさんの記事にある「AutoLayoutでStatsuBarに対する余白を変更する」がだいぶ参考になりました。
http://qiita.com/makoto_kw/items/d7ed59aff27fb95c9fde

#さいごに
個人的には未経験だったAutoLayoutのことはじめと
statusbarの切り替えでコード使わずに出来ないか探してみたら、とても簡単にでした。
制作的には、このあとiOS6ではステータスバーの色を変更したりコードで書き換える処理は必要になります。

応用するためにはロジックの理屈が分かる学習が必要で
今回はステータスバーで悩まない！レベルに持っていくための記事です。

またよろしくお願いします。
[Snippets]スワイプ判定


```cpp:enum定義

enum kSwipeDirection{
   kSwipeRight = 1234,
   kSwipeLeft,
   kSwipeDown,
   kNotSwipeTouch,
};

```


```cpp:判定メソッドの実装
//スワイプ判定を行う
kSwipeDirection GameScene::getSwipeDirection(Point first ,Point last) {
   //距離の計算
   //スレッショルドとなる距離以上のスワイプが行われているかを測定する
   int distance = sqrt((first.x-last.x)*(first.x-last.x) + (first.y-last.y)*(first.y-last.y));
   double rad =atan((last.y-first.y)/(last.x-first.x));
   //スレッショルドを50pxにする
   if (distance > 100) {
      if (first.x < last.x) {
         if ( -M_PI/6<rad && rad < M_PI/6 ){
            return kSwipeRight;
         }
      }
      if (first.x > last.x) {
         if ( -M_PI/6<rad && rad < M_PI/6 ){
            return kSwipeLeft;
         }
      }
   }
   if (distance > 70) {
      if (first.y >last.y) {
         if (-2*M_PI/3 < rad && rad < -M_PI/3) {
            return kSwipeDown;
         }
      }
   }
   return kNotSwipeTouch;
}

```

最初のポイントはonTouchBegan,最後のポイントはonTouchEndedで取得しておくこと。そして、スワイプの方向の情報を取ったあとは、
一応初期化しておく事

```cpp:
 kSwipeDirection direction;
   direction = getSwipeDirection(firstTouchPoint, lastTouchPoint);
//メンバ変数の初期化
   firstTouchPoint = Point::ZERO;
   lastTouchPoint = Point::ZERO;
```
<font color="red">
タッチポイントはgetLocationでの取得で良いが、DesignResolutionと、OpenGL上(実際の座標)に大きな差が開いたら端末差が大きくなるので、その場合はgetLocationInViewで取ってscalefactorで値調整するなど,考えると良い。
</font>
Macで画面キャプチャを取る方法


## 画面全体
`command` + `Shift` + `3` キーを押下

## 選択画面部分①
`command` + `Shift` + `4` キーを押下

## 選択画面部分②
※ ②は、カメラアイコンで選択する場合

`command` + `Shift` + `4` + `space` キーを押下

2014/03/06修正
 *記載を修正しました。詳細はコメント欄をご覧ください。


-
★ちなみにデフォルト状態だと、保存形式は **png形式**

-
### 2014/08/11_更新
- クリップボード上にキャプチャを取得したい場合は、`Control`キーを押下しながら選択する。
Linux版のAdobe Readerの検索ボックスの文字化けを修正する

Ubuntu 12.04 LTS (64-bit) に Adobe Reader 9.5.5 をインストールしたら、検索ボックスに日本語を直接入力した時に文字化けが発生するので困っていたのですが、環境変数に `CHARSET=eucJP` を追加すれば文字化けしないことが分かりました。

管理者権限で、`/opt/Adobe/Reader9/bin/acroread` の `export UBUNTU_MENUPROXY=0` の下ぐらいに `export CHARSET=eucJP` を追加するのが一番簡単だと思いますので困っていらっしゃる方はお試しください。

（ググっても同様の情報が見つからなかったので、ひょっとするとウチの環境が何かマズいのかもしれません。）
Railsで定数を環境ごとに管理するrails_config（現 config）

## config って？
開発環境ごとに定数を YAML ファイルで管理できるプラグインのこと



##公式リポジトリ
https://github.com/railsconfig/config

##configをインストール
Gemfile に config を記述

````ruby:Gemfile
gem 'config'
```

vendor/bundle 以下に config をインストール

```
$ bundle install --path vendor/bundle
$ bundle exec rails g config:install
  create  config/initializers/rails_config.rb
  create  config/settings.yml
  create  config/settings.local.yml
  create  config/settings
  create  config/settings/development.yml
  create  config/settings/production.yml
  create  config/settings/test.yml
  append  .gitignore
```


gitignoreには自動で下記の内容が追加される

```.gitignore
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
```

使用したい環境に応じて編集するファイルを変更


| YAML（環境） |ファイルの場所 |
|:-----------|:------------|
| 全ての環境のYAML |       config/settings.yml |
| ローカル環境専用のYAML | config/settings.local.yml |
| 開発環境専用のYAML |    config/settings/development.yml |
| テスト環境専用のYAML |  config/settings/test.yml |
| 本番環境専用のYAML |    config/settings/production.yml |　


###記述例

```config/settings.yml
twitter:
  follow_target_name: 'mossmoss'
  text: 'mossmossmossmossmoss'
  url : 'http://mossmossmossmossmoss.com/'
```

###参照例

```
Settings.twitter[:text]
Settings.twitter['text']
Settings[:twitter][:text]
```

 [settingslogic](https://github.com/binarylogic/settingslogic "settingslogic")もいいけど、わかりやすいしそこそこ大きな開発の時に使えそうなrails_configでした。
PhoneGap 3 でアプリ名を多言語化する方法



ググった他のサイトの記事が一切通用しなかった&忘れそうなのでメモ。
やり方が正しいのかは、不明。

## version

* phonegap 3.3
* Xcode 5.0.3


## 箇条書きで要約

英語ファイルをベースに日本語ファイルを作る


* InfoPlist.strings ファイルを手動で アプリ名/Resources/en.lproj/ 以下に 追加
* InfoPlist.stringsファイルに CFBundleDisplayName = "App Name"; を追加
* Xcode の言語追加のところで、 Japanese の言語追加
* en.lprog の下に ja.lproj/InfoPlist.strings ができるのでそこに日本語のアプリ名を入れる


## 手順

僕の環境では、以下のような構成 (Xcode)

```
[アプリ名]
 + Resources
   Images.xcasetts
   + de.lproj
   + se.lproj
   + en.lproj
   + es.lproj
   + icons
   + splash
    [アプリ名]-Info.plist
```

### en.lproj/ に InfoPlist.strings を入れる

* 英語をベースにする
* なので、英語のアプリ名用にファイルを用意する

en.lproj/ をクリックすると、Localizable.strings が見える
そこに InfoPlist.strings を入れる

* en.lprojを右クリック New File を選択
* Strings File のアイコンを選択
* InfoPlist.strings とファイル名を入れてファイルを追加

以下のような内容のファイルが自動でできる

```
/* 
  InfoPlist.strings
  AppName

  Created by Hoge Hogeo on 2014/03/06.

*/
```

* Project から Info のタブをクリック
* Localizations の Languages の項目に既に
 * English
 * German
 * Northern Sami
 * Spanish

がある(僕の環境では)

* + をクリックして、Japanese を追加
* ウィンドウが開いて、リファレンスになる言語を選択してと言われるので
 * English の Localizable.strings と InfoPlist.strings を選択する

このへんでよく ja.lproj が追加できない等言われることがあるので、その場合は直接以下のディレクトリを削除してから、再度 Japaneseを追加する

```
platforms/ios/NyankoTouch/Resources/en.lproj/ja.lproj
```

## アプリ名を追加

追加後 Xcodeで [アプリ名]/Resources/en.lproj/Info.Plist.strings をクリックすると、以下の2つが見えるようになる

```
InfoPlist.strings (English)
InfoPlist.strings (Japanese)
```

Englishの方に英語のアプリ名

```
CFBundleDisplayName = "Sample App Name";
```

Japaneseの方に日本語のアプリ名

```
CFBundleDisplayName = "サンプルアプリ名";
```


作業は、以上。

### テスト

* ビルドして問題ないことを確認
* 英語なiOSと日本語なiOSで試して、起動アイコンの名前が正しければOK
 * iOSシミュレータで起動して、現言語環境でのアプリ名を確認。その後、iOSシミュレータ内の設定で、言語環境を変えて、アプリ名がその言語環境の名前になれば、成功!


## 他サイトのやり方の問題

ググってもphonegap や Xcode のバージョンが古いとかディレクトリが存在しないなど、同じ条件のページが見つからず。

* Supporting Files というディレクトリが存在しない
 * どこでもいいっぽいし、Resources 以下に en.lproj 等存在するので、そこに作ることにする
* InfoPlist.strings も存在しない
 * 自分で作るべし?


## 参考リンク

[Xcode 5でアプリを多言語対応するまでの全スクリーンショット - Dolice Lab](http://lab.dolice.net/blog/2014/02/14/xcode5-localize/ "Xcode 5でアプリを多言語対応するまでの全スクリーンショット - Dolice Lab")


## トラブル

* Japanese 追加し、削除したら、再度追加時にエラーになるという問題に遭遇。 別ページで解決方法書いたのでググって下さい。


## 検索用語

アプリ, iPhone, iPad, ローカライゼーション, ローカライズ, 多言語化, internationalization, localization, xcode, phonegap, cordova
Digit to time. Time to digit.


rails の時間、日付に関する便利な機能。ちなみに動作確認は rails 4 です。

```ruby
time_point = Time.now.strftime('%Y%m%d%H%M%S')
```

みたいな時間のタグを使って、クエリの結果をキャッシュするようなコードを書いていた時に、このフォーマット `%Y%m%d%H%M%S` を定数にするか迷って、rails のコンソールで当てずっぽうに `'20140305'.to_date` って打ったら「おおっ」となったので、ActiveSupport を少し調べました。

## Digit to date. Date to digit.

8桁の数字(String)を Date オブジェクトに、また逆に Date オブジェクトを8桁の数字に。

以下のソースコードを参考にしました。
[github  rails/activesupport/lib/active_support/core_ext/date/conversions.rb](https://github.com/rails/rails/blob/c6897b7d7b18b5c89aca46d4595b47c2590ce335/activesupport/lib/active_support/core_ext/date/conversions.rb#L47)

```ruby
# 8桁の数字を Date オブジェクトに変換
date = '20140305'.to_date
# => Wed, 05 Mar 2014

# その逆
date.to_s(:number)
# => "20140305"
```

## Digit to time. Time to digit.

14桁の数字(String)を Time オブジェクトに、また逆に Time オブジェクトを14桁の数字に。

rails のソースコード
[github rails/activesupport/lib/active_support/core_ext/date_time/conversions.rb](https://github.com/rails/rails/blob/5b790ca7b8b52868ae2a37546f205db38ac14a46/activesupport/lib/active_support/core_ext/date_time/conversions.rb#L31)

```ruby
# 14桁の数字を Time オブジェクトに変換
time = '20140305184233'.to_time
# => 2014-03-05 18:42:33 +0900

# その逆
time.to_s(:number)
# => "20140305184233"
```

</br>


8桁の方はヘビーユーザー向けのUIに便利だし、14桁の方はデータに時間のタグを付ける時に便利です。


## 追記 2014/03/12

`String.to_time` には気をつけなくてはいけないことがありました。
このメソッドは `ActiveSuppoer::TimeWithZone` ではなく、 `Time` のインスタンスをマシンのタイムゾーンで返しますので、アプリケーションのタイムゾーンとマシンのタイムゾーンが異なる場合は、`Time.zone.parse()` を使う必要があります。

```ruby
# 例えば、マシンが UTC、アプリケーションが JST の場合。

last_update_time = record.updated_at
# => Wed, 12 Mar 2014 11:20:14 JST +09:00

timestamp = last_update_time.to_s(:number)
# => "20140312112014"

# to_time ではマシンのロケール時間になってしまう。
time = timestamp.to_time
# => 2014-03-12 11:20:14 +0000

# これをクエリに使うと以下の値が使われてしまい、UTC オフセットが加算されてしまう。
time.in_time_zone
# => Wed, 12 Mar 2014 20:20:14 JST +09:00

# アプリケーションのタイムゾーンのインスタンスにするには。
time = Time.zone.parse(timestamp)
# => Wed, 12 Mar 2014 11:20:14 JST +09:00

```

## 追記 2014/03/13

更に、現在時間と現在日時を扱う時の注意点。
異なるロケールからアクセスしてくるユーザーにビューを提供する場合などには重要です。

```ruby
# 例などではよくこう書いてあります。
now = Time.now
today = Date.today

# でも上記はいずれもマシンローカルな時間に基づきます。
# アプリの設定に基づきたいのであれば、以下のように書きます。
now = Time.zone.now
today = Time.zone.today
```
さくらインタネットのホスティングサーバで git をインストールするときの configure オプション


さくらのホスティングサーバ上で git をコンパイルしたら `https` に対応してなかったので `--with-curl=/usr/local` を追加した。


```bash
$ ./configure --prefix=$HOME/local --enable-pthreads=-pthread --with-curl=/usr/local
```
【PostgreSQL】バイナリ保存


がっつりハマりました。
WEBの勉強初めて一番絶望的にわからなかった。

WEBというかDBだったんですが。

RailsアプリでPostgreSQLを使用し、DBに画像データをバイナリデータとして保存しています。しかし、環境によってDBに保存されるデータの形式が変わってしまいます。

[QA@ITに質問した](http://qa.atmarkit.co.jp/q/3535)後に、キーワードをひねってたら解決策に辿り着いた。


## 正しいデータ（意図するデータ）

 `"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x05\xDC\x00\x00\x02X\b"`


## 問題のデータ

`"x89504e470d0a1a0a0000000d49484452000005dc0000025808..."`

### 保存処理のコード

コンソールから再現できたのでその際のコードです(irb)。

``` irb
file = ActionDispatch::Http::UploadedFile.new(tempfile: File.open(Rails.root.to_s + "/public/bg.png"))
image = MiniMagick::Image.read(file)
Master::Image.first.update_attribute(:data, image.to_blob)
```

上記を実行すると、`Master::Image.first.data`に入っているバイナリデータに差異が出ます。

### 環境の差異

#### 正しいデータとなる環境

ローカルの環境と、AWS上のAmazonLinux（DBとしてRDSを使用）では上手く行きました。

- ローカルのMacOSX、homebrewにてpostgreSQL, ImageMagickをインストール
- AWSのRDS

#### 問題のデータとなる環境

- CentOS6.4
 - `PostgreSQL 9.3.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit`

VPS上のCentOSで現象を確認後、VMに構築したCentOSでも問題が再現しました。

### 解決策

- `alter role [username] set bytea_output to ‘escape’;`

としてやると無事画像データのまま保存されました。

色々と調査するときは冷静に検索キーワードを変えてみることですね。

今回は「postgres bytea activerecord」で引っかかりました。

- [ActiveRecord loads binary field incorrectly on Heroku, fine on OSX](http://stackoverflow.com/questions/8539207/activerecord-loads-binary-field-incorrectly-on-heroku-fine-on-osx)

英語を読めるのは必須ですね。WEB技術は。
線形回帰とは何か

[昨日](http://qiita.com/ynakayama/items/ba3b45b376397955c3da)はデータの種類と線形回帰に触れるところを説明しました。ちょっと出てきた線形回帰というのは回帰分析の一種です。回帰分析と言いますと何やら難しそうな印象がありますが、厳密な数学的な定義は差し置いて、わかりやすく言うとこうなります。

# 回帰分析とは

たくさんの変数を持つ集まり (= ベクトル) についてある関数にノイズが加わったような状態が事例として観測されました。このときその関数を予測しましょうというのが回帰分析です。

単一の変数 x だけでなく、ふたつの変数 x,y あるいはみっつの変数 x,y,z などを観測して n 個 (n 組) のデータを得る場合、そのデータを **多次元のデータ (multi-dimensional data)** と言います。

ここでは 2 次元のデータに絞って考えてみます。 2 次元ですから x と y です。 x と y に区別をもうけず対等に見るのを **相関 (correlation)** と言います。 x から y を見るとき **回帰 (regression)** と言います。

たとえば年齢と血圧、所得と消費、人口と商業のように、ある一方が他方を左右するという一方向の関係にあるものは分析として回帰分析をとるのが良いでしょう。逆に身長と体重のようにどちらがどちらを決めるという性質にない 2 次元のデータは相関としてとらえることになります。

## 線形回帰とは

ではこの 2 次元の変数 x と y を考えてみます。この変数間に一方 x が他方 y を左右ないし決定する影響があるとき、 x を **独立変数 (independent variable)** 、 Y を **従属変数 (dependent variable)** と言います。

この関係式を要約して直線を当てはめるのが線形回帰です。

関数が次の線形モデルでノイズ ε が多変量正規分布の場合

```math
\mathbf{x}'_i=[1,x_{i1},x_{i2},\ldots,x_{im}]^\top
```

```math
f(\mathbf{x})=\mathbf{\theta}^\top \mathbf{x}'
```

となります。 Θ を最尤推定で求めることは最小二乗法と等価になります。最小二乗法は縦軸 (= Y 軸) の距離のみを最小とするように計算する方法で、回帰分析では特にポピュラーです。

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/3aa1b5e5-c848-a641-71ee-7bab43ad7c52.png)

とても汚い図ですが添付します。本当に汚い。

ちなみに最小二乗法は全数をみるので外れ値の影響をダイレクトに受けます。算術平均と同じですね。

## 線形回帰と検定

線形回帰には要約が生じますから、その傾きや切片に関して信頼区間をともなう検定をおこなうことになります。これにより有意かどうかを調べることができます。

たとえば、不快日数の増加がエアコンの保持率をどれくらい増加させるか、年齢 1 歳の上昇は血圧を何 mmHg 上昇させるか、といった 2 次元データを整理要約して 1 次式が求まれば x から y が決定される様子やしくみがあきらかになります。これが線形回帰です。

回帰と相関の考え方にはつながりがあります。

次回は昨日の例題をもとに、回帰係数と相関関係について考察し、検定を実際におこなってみます。
Removing only all App Store Applications

Of course you should wipe the HDD if you sell your Mac, but this script (Ruby 1.8.7 or 2.0.0) could be useful if you are just renewing your Mac in your Office and returning the old one.

[App Storeアプリだけを全て削除する]

売るときは完全ワイプのほうが良いと思いますが、例えば会社や研究室のMacを新調して古いMacをお返しするときなどには使えるのでは。

Ruby 1.8.7と2.0.0で(rm_r以外)動作確認しました。10.9でなくとも大丈夫です。

[追記] Ruby 2.0.0とOSX 10.9の組み合わせで正常に削除成功しました。

```rb:unappstore.rb
#!/usr/bin/env ruby
require 'fileutils'
Dir.glob('/Applications/*.app').select{|e|File.exist?(e+'/Contents/_MASReceipt')}.each{|app|
	puts app
	FileUtils.rm_r(app,{:force=>true,:secure=>true}) # need sudo
}
```
Xcode 5 で多言語化しようとして追加したら、エラーで追加できなくなる問題の対処方法



Xcode 5.0.3


## エラー内容

```
"Localizable.strings" couldn't be copied to "ja.lproj" because an item with the same name already exists.
```

## 対処方法

[アプリ名]/Resources/en.lproj/ja.lproj/ を削除


## したこと

* LocalizationsにJapanese を追加
* その後、削除
* エラーで再度追加できなくなる


## 感想

* バグなの?
【千葉民必見！】カトーレックの再配達申請が楽になるブックマークレット

```javascript:bookmarklet
javascript:(function(){n=document.getElementsByName("txtName"); n.item(0).value="<氏名>"; p=document.getElementsByName("txtAdd2"); p.item(0).value="<住所・市名番地>"; p=document.getElementsByName("txtAdd3"); p.item(0).value="<住所・建物等>"; p=document.getElementsByName("txtTel"); p.item(0).value="<電話番号>"; p=document.getElementsByName("txtMailAdr"); p.item(0).value="<メールアドレス>"; p=document.getElementsByName("txtDenno"); p.item(0).value="<伝票番号>"; p=document.getElementsByName("ddlKibouTime"); p.item(0).value="<再配送希望時間ID>"; p=document.getElementsByName("ddlDepo"); p.item(0).value="<配送所ID>"; })();
```

## これは一体…？
Amazonをこよなく愛する千葉在住のみなさま！
カトーレックの再配達に必要なデータ入力を半自動化するブックマークレットです！

## なぜこんなことをした…？
カトーレックではログイン機能が提供されていないため、
再配達を依頼するたびに、名前・住所・電話番号等の情報を入力する必要があります。(2014/03/05現在)

そこはかとなく めんどくさいのです。

## この力、一体どうすれば…？
上記スクリプトの __<文字列>__ を必要事項に置き換えた上で、ブックマークとして保存してください。
ヘビーユーザーさんはブックマックバーに登録しておくと幸せだと思います。

[再配達ページ](https://www6.katolec.com/deliver/)を見ながら入力するとわかりやすいと思います。

### 伝票番号
通常空文字列で良いと思いますが、
prefix数桁が固定の場合指定しておくと、 __更なる幸せ__ を得られます。

### 再配送希望時間ID
下記から選択してください。

| 時間ID  | 希望時間     |
|:--------|:------------|
| "0"     | 指定なし      |
| "09-12" | 09:00～12:00 |
| "12-15" | 12:00～15:00 |
| "15-18" | 15:00～18:00 |
| "18-21" | 18:00～21:00 |
| "19-21" | 19:00～21:00 |
| "20-21" | 20:00～21:00 |

### 配送所ID
下記から選択してください。

| ID   | 配送所名    |
|:-----|:-----------|
| "40" | 千葉北配送所 |
| "81" | 市川北配送所 |
| "80" | 市川配送所   |
| "60" | 習志野配送所 |
| "45" | 我孫子配送所 |
| "19" | 野田配送所   |
| "17" | 市原配送所   |
| "7"  | 茂原配送所   |
| "27" | 成田配送所   |
| "4"  | 木更津配送所 |
| "3"  | 君津配送所   |
| "1"  | 館山配送所   |
| "25" | 東金配送所   |
| "24" | 大網配送所   |
| "28" | 銚子配送所   |
| "10" | 勝浦配送所   |

## もっと力を…！

スクリプトからは省略していますが、
日付を指定することも可能です。

ユースケースによっては、再配達指定日は __いつも土曜日！__ のように決まってきますので、
javascript で次の土曜日の日付を取得して渡してあげれば、永久の幸せが約束されることでしょう。

## 備考
カトーレック再配達受付ページ
https://www6.katolec.com/deliver/
遂に Google SpreadSheet が Excel に追い付いて、超絶便利になった件について。


と、個人的には感じました。

なんたって、「 **条件付き書式** に数式が使えるようになった」から！！！

使い慣れてる人には不要な情報だろうけど、一応使い方を以下に。

1. 例えばこんなシートがあるとする。<br />
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/01.png)<br /><br />
1. A 列はプルダウンリストとして定義しているモノとする。<br />
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/02.png)<br />
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/03.png)<br /><br />
1. こんなシートに対して、オモムロに全選択して…。
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/04.png)<br /><br />
1. [ 表示形式 ] &gt; [ 条件付き書式 ] を以下のようにすると…。
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/05.png)
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/06.png)<br />
	※数式のとこは `=IF($A1 = "ほげ", TRUE, FALSE)` みたいなのが入ってる。<br /><br />
1. すると、こんな感じの表示が実現出来ちゃいます！！
	![ScreenShot 01](http://d4dqxb4bcxr8q.cloudfront.net/img/ss/20140305-01/GoogleSpreadSheet/07.png)

Excel を BTS 的な使い方している場合とかに、ステータス管理とか進捗管理とかで背景色を弄るコトとかあると思うけど、この機能が実装されたことで、より一層 **脱 Excel** が捗りますね！ｗ
OracleのDATE型項目にJDBC経由でjava.sql.Timeのインスタンスを登録したときの動きがドライバのバージョンで違う

自分が遭遇したのは、 `11.1.0.7.0` と `11.2.0.3.0` での違い。

ドライバのバージョンが `11.1.0.7.0` の場合は、年月日を変更せずにそのままの値で DB に登録するが、 `11.2.0.3.0` では年月日を 1970/01/01 に変換して登録するっぽい。

以下のテーブルを作って、それぞれ登録してみた。

```sql:確認用テーブル作成DDL
CREATE TABLE TEST (DATE_COLUMN DATE);
```

```groovy:確認用Groovy実装
import groovy.sql.Sql
import java.sql.Time

def url = 'url'
def user = 'user'
def pass = 'pass'
def driver = 'oracle.jdbc.OracleDriver'

def sql = Sql.newInstance(url, user, pass, driver)

def now = new Date()
def time = new Time(now.getTime())

println "time = " + time.format('yyyy/MM/dd HH:mm:ss.SSS')
sql.execute "INSERT INTO TEST VALUES (${time})"
```

|ドライバのバージョン|標準出力                 |DBに登録された値       |
|:----------------|:------------------------|:--------------------|
|`11.1.0.7.0`     |`time = 2014/03/05 16:58:49.417`|`2014/03/05 16:58:49`|
|`11.2.0.3.0`     |`time = 2014/03/05 17:01:07.405`|`1970/01/01 17:01:07`|

どちらも、 `Time` 型に変換した時点では年月日がそのままだけど、 DB に登録した時点で `11.2.0.3.0` の方は年月日が 1970/01/01 に変換されている。

そもそも年月日を気にする項目で `java.sql.Time` を使うなよという話だけど、そういう実装に遭遇してしまったのだから仕方ない。

#参考
- [Time (Java Platform SE 6)](http://docs.oracle.com/javase/jp/6/api/java/sql/Time.html)
- [java.util.Dateをjava.sql.Dateにきちんと変換する方法 - ひがやすを blog](http://d.hatena.ne.jp/higayasuo/20090219/1235020303)
NSArrayのソート


下記のようなプロパティを持ったクラスの配列をソートする

```objectivec:Hoge.h
@property (nonatomic) NSInteger itemId;
@property (nonatomic) NSString *name;
@property (nonatomic) NSInteger age;
```



#Blocksを使ったソート

```objectivec:Fuga.m
NSArray *list = [[NSArray alloc] init];

// Hogeを適当に追加する処理
// ~

// ソート
list = [list sortedArrayUsingComparator:^(Hoge *obj1, Hoge *obj2){
	// 昇順でソートする
	return obj1.itemId - obj1.itemId;

	// 降順の場合
	// return obj2.itemId - obj1.itemId;
}];
```
Scala: sbtでステップ実行できるようにする


sbtでステップ実行するには、主に以下の準備をしておく

* sbt でjvm-debugのポートを指定して起動する
* IntelliJで実行設定をしておく

```
./sbt -jvm-debug 5005
```

※ 普通のsbtでは-jvm-debugオプションが無いので、 https://github.com/sbt/sbt-launcher-package を代わりに使う

IntelliJ側の設定

"Run" -> "Edit Configuration" で下記の設定をしておく

![Run_Debug_Configurations.png](https://qiita-image-store.s3.amazonaws.com/0/889/cee9e60a-14f3-1c53-541f-61d50400af2e.png "Run_Debug_Configurations.png")


あとはブレークポイントをしこんで、虫のアイコンをクリックして、sbtのデバッグサーバにつないでsbtでrunするといい
PhoneGap 3.x / iOS でのアイコン、スプラッシュの追加方法


PhoneGap と Xcode の仕様が変わりまくりなので、メモ。

## バージョン

* phonegap 3.3
* Xcode 5.0.3

## 箇条書き要約

* www/res/icon/ios, www/res/screen/ios 以下に画像を入れる
* phonegap build ios コマンドを叩く
* platforms/ios/www/res/(icon|screen)/ios 以下に新しく画像が追加される
* その画像をXcode で追加
 なぜか、普通に追加すると追加できないので、asset catalog を使って、Finderから画像をドロップしたらうまくいきました。


## アセットカタログ (Asset Catalog)の使い方

下記ページがわかりやすかったです。

* [EZ-NET: Xcode 5 のアセットカタログでアイコンや画像を管理する : Objective-C プログラミング](http://program.station.ez-net.jp/special/handbook/objective-c/xcode/resource/asset-catalog.asp "EZ-NET: Xcode 5 のアセットカタログでアイコンや画像を管理する : Objective-C プログラミング")

* [Xcode5でアイコンを設定する方法| ずっとMegane。](http://zutto-megane.com/objective-c/post-262/ "Xcode5でアイコンを設定する方法| ずっとMegane。")

## ツヤを出すとかの設定

View -> Utilities -> Show Attributes Inspector

で右側にペインが出るので、iOSのバージョン、portrait, landscape等切り替える。

## Xcode アセットカタログの画像付き説明(Apple公式,英語)

[Asset Catalog Help: Migrating an App Icon Set or Launch Image Set](https://developer.apple.com/library/ios/recipes/xcode_help-image_catalog-1.0/StoringAppIconsandLaunchImagesinanAssetCatalog/StoringAppIconsandLaunchImagesinanAssetCatalog.html#//apple_ref/doc/uid/TP40013303-CH7-SW1 "Asset Catalog Help: Migrating an App Icon Set or Launch Image Set")

## PhoneGap 3.3.0 公式ドキュメント (英語)

公式ドキュメントだけど、実情にあってないので、信用しない方がいいと思います。

[PhoneGap API Documentation](http://docs.phonegap.com/en/3.3.0/config_ref_images.md.html#Icons%20and%20Splash%20Screens "PhoneGap API Documentation")
Rでdate-timeクラスオブジェクトからUnixtimeに変換


strptimeなどで生成したdate-timeクラスオブジェクトをUnixtimeに変換するには`difftime()`で1970-01-01 00:00:00からの差分を計算すればよい。

```
> hoge <- strptime("2014-03-01 00:00:00",format="%Y-%m-%d %H:%M:%S")
> difftime(hoge,strptime("1970-01-01 00:00:00",format="%Y-%m-%d %H:%M:%S"),units="secs")
Time difference of 1393632000 secs
```

このあまだと数値として扱えないので`as.numeric()`につっこむ。

```
> hoge.ut <- as.numeric(difftime(hoge,strptime("1970-01-01 00:00:00",format="%Y-%m-%d %H:%M:%S"),units="secs"))
> hoge.ut
[1] 1393632000
```


なんだかもっとスマートな方法がある気がする。
MongoDBのデータをS3経由でRedShiftに入れる


## 追記: 時代は変わった

JSONオプションがRedShiftのCOPYコマンドに追加されたのでmongoexportのデータや, fluent-s3-pluginが生成するようなJSON linesファイルを直接ロードすることが可能になりました。

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-copy-from-amazon-s3-synopsis

## MongoDBからCSVで出力

MongoDB付属のmongoexportを使うとcsvファイルが作れます。以下のようなコマンドになるかと思います。`-o`オプションを外せばとりあえず標準出力に出てきますので、試してみるのにいいかもしれません。(データ量が多いコレクションでやると大変かもですが)

mongoexportのデフォルトの挙動はJSON形式でのシリアライズなのでここでは`--csv`オプションを忘れないように気をつけます。

```bash
$ mongoexport \
> --host mongo.example.com \
> --db mydb \
> --collection mycollection
> --fields name,mail,lang,blog_url \
> --csv \
> -o ./user.csv
```

以下のように、`-q`オプションでクエリを与えることで出力するドキュメントを絞り込むこともできます。

```bash
$ mongoexport \
> --host mongo.example.com \
> --database mydb \
> --collection mycollection
> --fields name,mail,lang,blog_url \
> --csv \
> -q '{lang: "en"}' \
> -o ./user.csv
```

## CSVをS3にアップロード

user.csvを **RedShiftと同じリージョン** にあるS3バケットにアップロードします。`s3://example-bucket/import/user.csv`にアップロードされたものと仮定します。

アップロードにはs3cmdなどのコマンドラインツールS3Foxなどのブラウザプラグインや、MacならCyberduck, 3Hubなど、WindowsならS3 Browser, DragonDiskなどのGUIソフトなどが使えるでしょう。

## RedShift上でCSVをS3からインポート

Redshiftにログイン。

```bash
$ psql -h (RedShiftのhost) -p 5439 -U username dbname
```

まだテーブルがなければ、CREATE TABLEで作っておきましょう。(ここでは適当な定義ですが、RedShiftワールドではdistkey,sortkeyおよび各カラムの圧縮形式が非常に重要ですので注意です)

```sql
> CREATE TABLE my_user_table(
>   name varchar(255),
>   mail varchar(255),
>   lang varchar(255),
>   blog_url varchar(1024)
> );
```

S3からRedShiftへのデータのロードにはCOPYクエリを使います。COPYクエリではAWSのキーが必要ですので、用意しておきます。

```sql
> COPY
>   my_user_table
> FROM
>   's3://example-bucket/import/user.csv'
> CREDENTIALS
>   'aws_access_key_id=********************;aws_secret_access_key=****************************************'
> CSV;
```

ちなみにgzipしてuser.csv.gzとしてアップロードした場合、COPYクエリの最後の`CSV`を`CSV GZIP`にして読み込ませることもできます。データの量が大きいときはGZIPを使うとよさそうです。
JavaScriptで、要素に適用されている色を取得する

## まとめ

* `window.getComputedStyle(el).color` で得られる。
* 戻り値は設定値を無視して `"rbg()"` ないし `"rgba()"` の書式になる。
* IEは9+が対応。
* IE 8までは `el.currentStyle.color` が近い、けどちょっと違う。
* jQueryの `.css('color')` は `getComputedStyle` があればそっち、なければ `currentStyle` を使う

## 確認

* http://jsfiddle.net/ginpei/LKFu9/show/

## 取得方法

### HTML例

```html
<div id="colored" style="color:red">COLORED</div>
```

### getComputedStyle

DOM 2の仕様。IEは9から対応。

値は`"rgb()"`ないし`"rgba()"`になる。

```js
var elColored = document.getElementById('colored');
var color = window.getComputedStyle(elColored, '').color;
console.log(color);  // => "rgb(255, 0, 0)"
```

* [2.2.1. Override and computed style sheet](http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-OverrideAndComputed-h3)
* [Interface RGBColor (introduced in DOM Level 2)](http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-RGBColor)

`"rgba()"`はDOM 2じゃなさげ。

分解はこんな感じでどうでしょ。

```js
var color = 'rgb(255, 0, 0)';
var colors = color.match(/\d+/g);
console.log(colors);  // => ["255", "0", "0"]
```

### currentStyle

IEの独自規格。

値は設定値の書式を踏襲。ただし正規化はされるみたい。（例: `"#FF0000"` → `"#ff0000"`, `"rgb(1, 2, 999)"` → `"rgb(1,2,255)"`）

```js
var elColored = document.getElementById('colored');
var color = elColored.currentStyle.color;
console.log(color);  // => "red"
```

* [currentStyle object (Internet Explorer)](http://msdn.microsoft.com/en-us/library/ie/ms535231(v=vs.85).aspx)
* [color property (Internet Explorer)](http://msdn.microsoft.com/en-us/library/ie/ms530749(v=vs.85).aspx)

正規化について書いてあるの、見つからなかった。

### jQuery

ご存知の。

値は`getComputedStyle()`があればその値、なければ`currentStyle`の値になる。（もちろん1系の場合ね。）

```js
var $colored = $('#colored');
var color = $colored.css('color');
console.log(color);  // 環境に依る
```

* [.css() | jQuery API Documentation](http://api.jquery.com/css/)
* [jquery/src/css/curCSS.js (v1.11.0)](https://github.com/jquery/jquery/blob/91cd1587ed4a1d4f3834227e8eb3cc30cb385409/src/css/curCSS.js#L12)
fluent-formatを使ってidobataにtd-agent.confの内容を送る

# fluent-formatを使ってtd-agent.confのパース

[fluent-format](https://github.com/sonots/fluent-format)という、td-agent.confの内容をパースしてくれる
便利gemがあるという話をインターネッツ経由で@sonotsさん(作者様)より教えていただいた。

で、td-agentのpidファイルが変更される度に
(つまり、service td-agent restartが行われるなど)
idobataに向けて通知が走るスクリプトを書いてみた。

![スクリーンショット 2014-03-05 14.16.47.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b6396bfd-6958-b5b6-6863-28ac37176c9a.png)

pidファイルの状態監視に[fssm](https://github.com/ttilley/fssm)を使った。

```rb:Gemfile
source 'https://rubygems.org/'

gem 'fssm'
gem 'fluent-format'
```

include先のファイルも含めた形でパース結果を得たい場合は、
formatメソッドに[file pathを文字列で指定する](https://github.com/sonots/fluent-format/blob/master/lib/fluent/format/format.rb#L44)。

**{{ idobata endpoint url }}は適宜自分の環境に合わせて欲しい。**

```rb:monitor.rb
#!/usr/bin/env ruby

require "fssm"
require "fluent-format"

monitor = FSSM::Monitor.new

IDOBATA = "{{ idobata endpoint url }}"
PROCESS_DIR = "/var/run/td-agent"
PROCESS_PID = "td-agent.pid"
TD_CONF = "/etc/td-agent/td-agent.conf"

monitor.path PROCESS_DIR do

  glob PROCESS_PID

  puts "Start Monitoring..." 

  notify = Proc.new do |base, relative|
    system("curl --data-urlencode 'source=#{Fluent::Format.format(TD_CONF).to_s}' #{IDOBATA}")
  end

  update &notify

  create &notify

end

monitor.run
```



IRCやメーリングリストへ投げるなど色々と使えそうだ。
Java8で追加されるBase64クラスを試す

Java8から<del>ものすごい今更</del>追加されるBase64Encode/Decodeを扱うためのクラスをちょっと試してみたよ。

JDKのバージョンは、「8 Build b129」です。

## Java8のBase64クラスの使いかた

### Encoder/Decoderの取得

* Basic

RFC4648の標準Base64エンコーディングに基づく変換を行う。

```java
Encoder encoder = Base64.getEncoder();
Decoder decoder = Base64.getDecoder();
```

* URL and Filename safe

RFC4648のbase64urlエンコーディングに基づく変換を行う。

```java
Encoder encoder = Base64.getUrlEncoder();
Decoder decoder = Base64.getUrlDecoder();
```

* MIME

RFC2045のBase64エンコーディングに基づく変換を行う。

デフォルトで76文字ごとにCR+LFの改行文字が挿入される。
1行の長さ、および改行文字を指定したEncoderが取得できる。

```java
Encoder encoder = Base64.getMimeEncoder();
encoder = Base64.getMimeEncoder(80, new byte[]{'\n'});
Decoder decoder = Base64.getMimeDecoder();
```

## CommonsCodecとの比較

エンコード結果が微妙に違うっぽいのでまとめておきます。

```java
import static java.util.Base64.*;
import static org.apache.commons.codec.binary.Base64.*;
:
:
:
Path path = Paths.get("./test.jpg");
byte[] bytes = Files.readAllBytes(path);

byte[] java8BasicEncoded = getEncoder().encode(bytes);
byte[] java8UrlEncoded = getUrlEncoder().encode(bytes);
byte[] java8MimeEncoded = getMimeEncoder().encode(bytes);

byte[] commonBasicEncoded = encodeBase64(bytes);
byte[] commonsUrlEncoded = encodeBase64URLSafe(bytes);
byte[] commonsMimeEncoded = encodeBase64Chunked(bytes);

System.out.println(Arrays.equals(java8BasicEncoded, commonBasicEncoded)); // true
System.out.println(Arrays.equals(java8UrlEncoded, commonsUrlEncoded));    // false
System.out.println(Arrays.equals(java8MimeEncoded, commonsMimeEncoded));  // false

```

* base64urlエンコード
Java8のUrlEncoderの場合、パディングあり。
CommonsCodecのencodeBase64URLSafeの場合、パディングなし。


* Mimeエンコード
Java8のMimeEncoderの場合、末尾の改行文字なし。
CommonsCodecのencodeBase64Chunkedの場合、末尾の改行文字あり。

Base64的にどちらが正しいのかっていうのまではわかんない……。

Java8のEncoderは `withoutPadding()` でパディングなしのエンコーダが取得できるので、
base64urlエンコードについては、これを使えばCommonsCodecと同じ変換結果になります。

```java
byte[] urlEncodeNoPad = getUrlEncoder().withoutPadding().encode(bytes);
System.out.println(Arrays.equals(urlEncodeNoPad, commonsUrlEncoded));     // true
```
railsで複数のDBを使う方法

rails(4.0.3)で複数のDBを使う際の設定メモ。
やり方としては、active_recordを使う際に毎回呼び出されているestablish_connectionをmodel側で設定してあげれば良い。

一応このような感じでできる。

```hoge.rb
class Hoge < ActiveRecord::Base

  establish_connection(
                        adapter: "mysql2",
                        ...
                      )

  self.abstract_class = true
  self.table_name = "table名"
  self.primary_key = "プライマリーキー"
end
```

self.abstract_class = true を書いとけば継承ベース用のモデルだと認識してくれる。
(※上記の設定をしていれば、table_nameは不必要だという記事もあったが、自分の場合は設定しておかないとエラーになった。。。)

これだと、別DBを使う度にmodelに書かないといけないので、DRYじゃない。。。

なのでdatabase.ymlに設定した方が良さそう。

```config/database.yml
hoge_db:
  adapter: mysql2
  encoding: utf8
  database: 'DB名'
  host: 'ホスト'
  username: 'ユーザ名'
  password: 'パスワード'
  socket: /tmp/mysql.sock
```


```hoge.rb
class Hoge < ActiveRecord::Base

  establish_connection :hoge_db

  self.abstract_class = true
  self.table_name = "table名"
  self.primary_key = "プライマリーキー"
end
```

これの方がすっきりして良い。
ちなみに継承させればサブクラスでもDBの設定は引き継がれるみたい。

```fuga.rb
calss Fuga < Hoge
end
```

コンソールで確認できたので、大丈夫そう！
load-grunt-configでGruntfileを分割するときの注意点


## initConfigは指定しちゃダメ
Grantfile内にinitConfigを残すとエラーになります。

## 設定ファイル内はモジュール名省略
load-grunt-configは./grunt以下に配置した **モジュール名.js** を読み込みます。
このとき設定ファイルの中ではモジュール名を省略します。

```Javascript:Gruntfile内に書くとき
grunt.initConfig({
	watch: {
    	options: {
			open: true,
        	port: 9000,
        	livereload: 35729,
        	hostname: 'localhost',
			base: 'app'
    	}
	}
});
```

```Javascript:分割するとき(grunt/watch.js)
module.exports = {
    options: {
		open: true,
        port: 9000,
        livereload: 35729,
        hostname: 'localhost',
		base: 'app'
    }
};
```

##カスタム設定の取り回し方
通常、initConfig内に書いた設定はテンプレートを用いて書くconfig内で取り回すことができますが、load-grunt-configを使う際はinitConfigを書けないので、この方法は使えません。


```Javascript:Gruntfile
grunt.initConfig({
	settings: {
		app: "app",
		disp: "dist"
	},
	watch: {
    	options: {
			open: true,
        	port: 9000,
        	livereload: 35729,
        	hostname: 'localhost',
			base: <%= settings.app %>
    	}
	}
});
```

### 方法１:カスタム設定ファイルを用意する
grunt/settings.jsのようにファイルを作って、他の設定ファイル同様に記述することで、
従来通りテンプレートで値を取り回すことができます。

```Javascript:grunt/settings.js
module.exports = {
    app: "app",
	disp: "dist"
};
```

### 方法２:package.jsonに指定する
package.jsonは自動的に読み込まれ、 **package** プロパティでアクセスすることができます。
以下のように設定すると、各Configファイル内から<%= package.settings.app %>のようにしてアクセスできます。

```Json:package.json
{
  "name": "grunt-maccotsan",
  "version": "0.0.0",
  "dependencies": {},
  "devDependencies": {
    "grunt": "~0.4.1",
    "grunt-contrib-watch": "~0.5.2",
    "load-grunt-config": "~0.7.1",
  },
  "engines": {
    "node": ">=0.8.0"
  },
  "settings": {
    "app": "app-frontend",
    "dist": "dist"
  }
}
```

## タスク内から設定を使う
grunt.config()で呼び出せます。

```Javascript:Gruntfile
grunt.registerTask('default', function() {
 	grunt.log.writeln('app:' + grunt.config('package.settings.app'));

	grunt.task.run([
    	'connect:livereload',
   		'watch'
   ]);
});
```

## 参考URL

[タスクの作成 | Grunt 日本語リファレンス | js STUDIO](http://js.studio-kingdom.com/grunt/doc/creating_tasks)
[I am mitsuruog: Yeomanに学ぶモテるGruntfile.jsの書き方](http://blog.mitsuruog.info/2013/12/yeomangruntfilejs.html)
LegacyAnimationをMecanimに対応させる

[これ](http://u3d.as/content/8bull/audience-crowd/4B9)をMecanimで使いたかったけど、ちょっと悩んだのでメモ

.fbxのInspcectorで、
1. Rigを選択
2. **AnimationTypeをHumanoidに** <sub>これがほぼメイン</sub>
3. （問題があれば）AvatarDifinitionのConfigure...でAvatarを設定
使えるマクロ: シェル引数を変数にバインド


こういうのこそマクロの使い道。

```cl
(defmacro with-boolean-options (bindings before after &body body)
  (assert (typep before 'symbol))
  (assert (typep after 'symbol))
  `(let ((,after ,before))
     (let ,(mapcar
            (lambda (bind)
              (ematch bind
                ((list (and var (type symbol))
                       (and str (type string)))
                 `(,var
                   (prog1
                     (if (member ,str ,after :test #'string=) t nil)
                     (setf ,after (remove ,str ,after :test #'string=)))))))
            bindings)
       ,@body)))


(defun main ()
  (print sb-ext:*posix-argv*)
  (match sb-ext:*posix-argv*
    ((list* _ rest)
     (with-boolean-options ((*invert* "--invert")
                            (*ignore-first* "--ignore-first")
                            (*block* "--block")) rest rest
       (apply #'output-to-csv rest)))))

;;;; 展開結果
(LET ((REST REST))
  (LET ((*INVERT*
         (PROG1
             (IF (MEMBER "--invert" REST :TEST #'STRING=)
                 T
                 NIL)
           (SETF REST (REMOVE "--invert" REST :TEST #'STRING=))))
        (*IGNORE-FIRST*
         (PROG1
             (IF (MEMBER "--ignore-first" REST :TEST #'STRING=)
                 T
                 NIL)
           (SETF REST (REMOVE "--ignore-first" REST :TEST #'STRING=))))
        (*BLOCK*
         (PROG1
             (IF (MEMBER "--block" REST :TEST #'STRING=)
                 T
                 NIL)
           (SETF REST (REMOVE "--block" REST :TEST #'STRING=)))))
    (APPLY #'OUTPUT-TO-CSV REST)))

```
VirtualBox+NAT+SSH接続で失敗したJenkinsジョブ実行がJNLP接続で成功した

## Jenkins環境
* Master
 * CentOS6.4
* Slave
 * Mac(10.9)のVirtualBoxにインストールしたMac(10.9)

## うまくいかなかった(NAT+SSH)
* Slave側の設定で、VirtualBoxのNATでホストの10022->ゲスト22にポートフォワーディングするよう設定
* Master側からSSHでSlaveに接続
* ジョブ実行時に以下のようなエラーが頻発した

> FATAL: スクリプトファイル /var/folders/1x/dzrp58q14zs4l3k0wjd3s2080000gn/T/hudson678197218987356742.sh を削除できません
hudson.util.IOException2: remote file operation failed: /var/folders/1x/dzrp58q14zs4l3k0wjd3s2080000gn/T/hudson678197218987356742.sh at hudson.remoting.Channel@192f47e:node_name
	at hudson.FilePath.act(FilePath.java:901)
	at hudson.FilePath.act(FilePath.java:878)
	at hudson.FilePath.delete(FilePath.java:1263)
	at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:101)
	at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:60)
	at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
	at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:804)
	at hudson.model.Build$BuildExecution.build(Build.java:199)
	at hudson.model.Build$BuildExecution.doRun(Build.java:160)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:586)
	at hudson.model.Run.execute(Run.java:1576)
	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
	at hudson.model.ResourceController.execute(ResourceController.java:88)
	at hudson.model.Executor.run(Executor.java:241)
Caused by: hudson.remoting.ChannelClosedException: channel is already closed
	at hudson.remoting.Channel.send(Channel.java:494)
	at hudson.remoting.Request.call(Request.java:129)
	at hudson.remoting.Channel.call(Channel.java:672)
	at hudson.FilePath.act(FilePath.java:894)
	... 13 more
```

#### 原因
* "FATAL: スクリプトファイル 削除できません" あたりでぐぐってみるとSSH接続あたりが怪しそう
 * [[jenkinsci-ja:429] ジョブ実行途中でたまにこける現象について ](http://jenkins-ci.361315.n4.nabble.com/jenkinsci-ja-429-td4648299.html)
 * [ジョブ実行途中でたまにこける現象について](https://groups.google.com/forum/#!msg/jenkinsci-ja/IzjfN8Y0LzI/AfbtmbD8igAJ)
* NWの瞬断だとか、SSHのパケットロスだとか

## うまくいった(JNLP)
* SlaveへのNAT+SSHでの接続をやめ、JNLP経由でスレーブを起動するようにした
 * ジョブの設定などは変えてないけど、これだけでうまくいくようになった
c#で.xlsから.xlsxへ変換する

[参考サイト]
http://convertxsltoxlsx.blogspot.jp

.xlsファイルを開く→.xlsx形式で保存→.xlsファイルを削除。
参照マネージャー→COM→Microsoft Excel 14.0 Object Libraryの設定も忘れずに。

```csharp:sample.cs
static void convertSample()
{
    string xlsFileName = @"d:\SampleReportExcel.xls";
    string xlsxFileName = @"d:\SampleReportExcel.xlsx";

    Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
    
    // .xlsファイルを開く。
    Microsoft.Office.Interop.Excel.Workbook eWorkbook = excelApp.Workbooks.Open(xlsFileName);

    // .xlsx形式で保存する。
    eWorkbook.SaveAs(xlsxFileName,
        Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing,
        Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    // ファイルを閉じる
    eWorkbook.Close(false, Type.Missing, Type.Missing);

    // .xlsファイルを削除する。
    File.Delete(xlsFileName);
}

```
百人一首の JSON

百人一首の本文と作者 (仮名と漢字) を使いやすいように JSON にしたので置いときます。

https://gist.githubusercontent.com/wakaba/8363dc27f4c54f76b4a7/raw/hyakunin.json

例:

```json
[
{
  "n": 1,
  "bodyKanji": "秋の田の かりほの庵の 苫をあらみ 我が衣手は 露にぬれつつ",
  "bodyKana": "あきのたの かりほのいほの とまをあらみ わがころもでは つゆにぬれつつ",
  "nameKanji": "天智天皇",
  "nameKana": "てんじてんのう",
  "kimariji": "あきの",
  "imageWref": "ファイル:Hyakuninisshu_001.jpg",
  "imageURL": "http://upload.wikimedia.org/wikipedia/commons/0/04/Hyakuninisshu_001.jpg"
},
...
]
```

どうぞご利用ください。

ちなみに元データは

http://ja.wikisource.org/wiki/%E5%B0%8F%E5%80%89%E7%99%BE%E4%BA%BA%E4%B8%80%E9%A6%96

で、

https://gist.github.com/wakaba/8363dc27f4c54f76b4a7/#comment-1184092

にある簡単な JavaScript のコードで変換したものです。
配列を条件によってリニアに分割する


例えばこんな配列があったとき、並んでいる数字をまとめたいことがある。
_.groupedByを使うと近いことができるが、あちらは配列中の全ての要素をまとめてしまう。こちらは、まとめたい要素が連続した場合のみまとめたい。

```javascript
var array = [1,1,2,1,3,3,4,5,6,6]
```

要素がjsの===演算子で比較可能なものならともかく、オブジェクトなどの等価性は自分で判断したい。
例えばこんな風に。

```coffeescript
array = [1,1,2,1,3,3,4,5,6,6]
divided = _.divide [1,1,2,1,3,3,4,5,6,6]
# -> [[1,1],[2],[1],[3,3],[4],[5],[6,6]]
```

javascriptにはrange型がない。ので配列を捜査してlocationとlengthをカウントしてまとめあげる。破壊しても意味がないので新しい配列を返すようにしている。アルゴリズムが結構複雑になったので、一応動いているものの取り逃しがないかどうかはわからない。javascriptは文字列も配列と同じようなアスペクトを持っているので[]メソッドが使える。なので文字列にも使える。

```coffeescript
# 配列をpredicateで分割した配列を返す
# 配列をpredicateで分割してrangeの配列を返す
_.extend _ ,  {
  "divide" : (arrayOrString = [], predicate = (prev, current)->(prev is current)) ->    
    if arrayOrString.length is 1 
      return [[arrayOrString[0]]] 
    prev = arrayOrString[0]
    location = -1
    length = 1
    ret = []
    for i in [1..arrayOrString.length] by 1
      obj = if i < arrayOrString.length then arrayOrString[i] else null
      if predicate(prev, obj)
        location = i-1 if location < 0
        length++
      else
        _location = if location > -1 then location else i-1     
        ret.push _.at arrayOrString, _location, length
        length = 1
        location = -1
      prev = obj
    return ret
  }
# 配列をindexかrangeから返す
_.extend _, {
  "at" : (arrayOrString = [], location = -1, length = 0) ->
    if length is 0 
     return arrayOrString[location]
    else
      if _.isArray(arrayOrString)
        return Array.prototype.slice.call(arrayOrString,location,location+length)
      else if _.isString(arrayOrString)
        return String.prototype.slice.call(arrayOrString,location,location+length)
}
```

```coffeescript

console.log _.divide [1,1,2,1,3,3,4,5,6,6,6]
# -> [[1,1],[2],[1],[3,3],[4],[5],[6,6,6]]
ps = ["キュアハート","キュアダイヤモンド","キュアロゼッタ","キュアソード","レジーナ","キュアエース", "|" ,"キュアラブリー","キュアプリンセス"]
console.log _.divide(ps, (p,o)->((_.at(p,0,3) is _.at(o,0,3))))
# -> [["キュアハート","キュアダイヤモンド","キュアロゼッタ","キュアソード"],["レジーナ"],["キュアエース"],["|"],["キュアラブリー","キュアプリンセス"]]
console.log _.divide("あああいいあいいいうえうう")
# -> ["あああ", "いい", "あ", "いいい", "う", "え", "うう"] 
```

使いドコロが少ないけど、なかなか便利です:D
tmux で xclip を実行したら Perfix キーがきかなくなった

tmux でバッファの内容を X のクリップボードにしようと以下の設定をしました。

```.tmux.conf
bind-key C-c run "tmux save-buffer - | xclip
```

これで Prefix キー + C-c を打鍵するとコピーできるのですが、
一度でも実行するとそれ以降 tmux に Prefix キーが送れなくなりました。

いろいろと調べた結果、xclop に -loops オプションを指定すると解消しました。
-loops は X セレクションへのリクエスト回数を制限するオプションのようで、
1 だと値が小さ過ぎるのかコピーできず、3 で正常にコピーできしました。

```.tmux.conf
bind-key C-c run "tmux save-buffer - | xclip -loops 3 
```

もしかすると環境依存の現象かもしれませんが
同様のことで困っている方がいたら試してみて下さい。

私の環境:
- Ubuntu 13.10
- tmxu 1.8-4
DirectoryIteratorの闇

DirectoryIteratorを、「ディレクトリ内のアイテムをリストアップしてくれるオブジェクト」だと思ってたら痛い目にあいました。

### 闇その１：別の変数に代入すると空になる

```php
$dir = new DirectoryIterator('/usr/');
$items = [];
foreach ($dir as $item) {
    $items[] = $item;
}

var_dump($items[0]);
```

## 実行結果

```shell
object(DirectoryIterator)#1 (3) {
  ["pathName":"SplFileInfo":private]=>
  string(0) ""
  ["glob":"DirectoryIterator":private]=>
  bool(false)
  ["subPathName":"RecursiveDirectoryIterator":private]=>
  string(0) ""
}
```


## 闇その２：ディレクトリとディレクトリエントリの実体が同じである。

```php
$dir = new DirectoryIterator('/usr/');
foreach ($dir as $item) {
    var_dump($dir === $item);
}
```

## 実行結果

```shell
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
```

## 教訓

DirectoryIteratorを「リスト」だと思ってはいけない。

どなたか、なぜこういう挙動になるのか教えていただると幸いです。