OmniAICreator/Qiita-1.07M huggingface dataset:
iptablesの問題でdockerが起動できない障害

インストールしたDockerを起動しようとすると、以下のようなエラーメッセージが出た。
メッセージの内容からすると、iptables関連の問題に見えていたが、実際にはコマンド云々の問題ではなかった。

```Unable to enable network bridge NAT: iptables failed: iptables -I POSTROUTING
  (続き) -t nat -s 172.17.42.1/16 ! -d 172.17.42.1/16 -j MASQUERADE: iptables: No chain/target/match by that name.
(exit status 1)
[9c5ad138] -job init_networkdriver() = ERR (1)
(exit status 1)
[9c5ad138] -job initserver() = ERR (1)
2014/09/01 17:02:44 (exit status 1)```

原因としては、カーネルモジュールipt_MASQUERADEが不足しているそうで、

```insmod /usr/local/src/linux-3.16.1/net/ipv4/netfilter/ipt_MASQUERADE.ko```
とすれば、問題が解消した。

同様にxt_addrtype.koも必要ということで、
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
に変更してカーネルをビルドして、同様にinsmodする。

参考URL: https://github.com/docker/docker/issues/866
SCSS内において、imageを指定する方法

いくつか方法がある様子。

```scss:sample.css.scss
image-url("image.jpg") /* => url(assets/image.jpg) */
image-path("image.jpg") /* => "assets/image.jpg" */
 
asset-url("image.jpg", image) /* => url(/assets/image.jpg) */
asset-path("image.jpg", image) /* => "/assets/image.jpg" */
```

# References
* [rails3 cssで画像urlをassets以下パスに指定 | このコードわからん](http://hai3.net/blog/2012/07/19/css-assets-path/)
IE9でtableをbox-shadowで装飾する

##IE9でbox-shadowが効かない

IE9ではtable要素にbox-shadowをつけても効かない場合があります。table要素に「border-collapse: collapse;」が指定されていると適用されません。
>border-collapse:collapse;が指定されたtable内要素には、外側の影はつきません。



##対処法
* tableに「border-collapse: separate;」を指定する。
* box-shadowを指定している要素に対して、「border-collapse:separate」を指定する。

###tableに「border-collapse: separate;」を指定する。
tabel要素に「border-collapse: separate;」をつけることでshadowが表示されます。
tableとセルの間にスペースが入るのが嫌な場合は、「border-spacing: 0;」を付与します。

```lang:HTML
<table>
	<tbody>
	<tr><td>
	<div class="box">box</div>
	</td></tr>
	<tr><td>td</td></tr>
	<tr><td>td</td></tr>
	</tbody>
</table>

```
```lang:css
table{
	border-collapse: separate;
	border-spacing: 0;
	border: #ccc 1px solid;
	box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.2);
}
td{
	border-bottom: #ccc 1px solid;
	background: #e7f4fc;
	width: 200px;
	padding: 15px;
}
.box{
	background: #ccc;
	box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.2);
}
```
margin-topが効かない

floatをキャンセルした後の要素でmargin-topが効かない場合がある。

「clear:both」と「margin:top」は併用できない。
 親要素にoverflow : hiddenを掛ける。

親要素を入れることが出来ない場合は、
`<div class="clear"></div>`を、後ろの要素との間に作成する。
Hamlとは

###Haml（はむる）
###「HTML abstraction markup language」の略

HTML/XHTMLを生成するためのマークアップ言語。HTMLを効率的に生成するための記法。
CSSにおけるSassみたいな。
`hoge.haml`ファイルを作って→`hoge.html`に変換する。



* 記述が少なくてすむ
* Rubyが使える
* 変数を宣言、条件分岐、繰り返し処置が出来る



**例1**

```lang:.haml
!!!
```

↓変換すると

```lang:.html
<!DOCTYPE html>
```


**例2**

```lang:.haml
%h1 hoge
```

↓変換すると

```lang:.html
<h1>hoge</h1>
```


***


**基本**

* `%`でタグ名
* ` -#` でコメント
*  インデント半角2spaceで入れ子


* * *


##SublimetextでHamlをhtmlファイルにする

Hamlファイル出力するには
1. Ruby入れる
2. haml入れる
3. ビルドシステムを追加する
4. 保存時自動ビルドの設定


#### 1. Ruby入れる




#### 2. haml入れる
コマンドプロンプトかターミナル開いて下記コマンド実行

```
gem install haml
```



#### 3. ビルドシステム追加
Sublime textの　Tools > ビルドシステム > ビルドシステムを追加

下記コピペ保存

```lang:.haml
{
  "cmd": "haml",
  "selector": "source.haml",
  "working_dir": "${file_path}",

"windows": 
  { "cmd": ["haml.bat", "$file", "$file_path/$file_base_name.html"] },

"osx":
  { "cmd": ["haml", "$file", "$file_path/$file_base_name.html"], }
}
```

#### 4. SublimeOnSaveBuild入れる
1. 保存時に自動ビルドしてくれるように、SublimeOnSaveBuildを入れる。
2. [Ctrl + Shift + P]でPackage Controll : Instal Packageを選択
3. SublimeOnSaveBuildを選択
4. Prerences　> Package Setting > SublimeOnSaveBuild > settings - User
から下記コピペ保存


```
{
    "filename_filter": "\\.(css|js|sass|less|scss|haml)$",
    "build_on_save": 1
}
```


SublimeのTools > Build System > haml
を設定してから、`hoge.haml`ファイルをどこかに作り、`ctrl+S`で、同階層に`hoge.html`が作成される



**関連**
Slimとは
C#でiniファイルを取り扱うためのクラス実装例

```csharp:InifileUtils.cs
/// <summary>
/// iniファイル取り扱いのためのユーティリティクラス
/// </summary>
class InifileUtils
{
    /// <summary>
    /// iniファイルのパスを保持
    /// </summary>
    private String filePath { get; set; }
 
    // ==========================================================
    [DllImport("KERNEL32.DLL")]
    public static extern uint
        GetPrivateProfileString(string lpAppName,
        string lpKeyName, string lpDefault,
        StringBuilder lpReturnedString, uint nSize,
        string lpFileName);
 
    [DllImport("KERNEL32.DLL")]
    public static extern uint
        GetPrivateProfileInt(string lpAppName,
        string lpKeyName, int nDefault, string lpFileName);
 
    [DllImport("kernel32.dll")]
    private static extern int WritePrivateProfileString(
        string lpApplicationName,
        string lpKeyName,
        string lpstring,
        string lpFileName);
    // ==========================================================
 
    /// <summary>
    /// コンストラクタ(デフォルト)
    /// </summary>
    public InifileUtils()
    {
        this.filePath = AppDomain.CurrentDomain.BaseDirectory + "hogehoge.ini";
    }
 
    /// <summary>
    /// コンストラクタ(fileパスを指定する場合)
    /// </summary>
    /// <param name="filePath">iniファイルパス</param>
    public InifileUtils(String filePath)
    {
        this.filePath = filePath;
    }
 
    /// <summary>
    /// iniファイル中のセクションのキーを指定して、文字列を返す
    /// </summary>
    /// <param name="section"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public String getValueString(String section, String key)
    {
        StringBuilder sb = new StringBuilder(1024);
 
        GetPrivateProfileString(
            section,
            key,
            "",
            sb,
            Convert.ToUInt32(sb.Capacity),
            filePath);
 
        return sb.ToString();
    }
 
    /// <summary>
    /// iniファイル中のセクションのキーを指定して、整数値を返す
    /// </summary>
    /// <param name="section"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public int getValueInt(String section, String key)
    {
        return (int)GetPrivateProfileInt(section, key, 0, filePath);
    }
 
    /// <summary>
    /// 指定したセクション、キーに数値を書き込む
    /// </summary>
    /// <param name="section"></param>
    /// <param name="key"></param>
    /// <param name="val"></param>
    public void setValue(String section, String key, int val)
    {
        setValue(section, key, val.ToString());
    }
 
    /// <summary>
    /// 指定したセクション、キーに文字列を書き込む
    /// </summary>
    /// <param name="section"></param>
    /// <param name="key"></param>
    /// <param name="val"></param>
    public void setValue(String section, String key, String val)
    {
        WritePrivateProfileString(section, key, val, filePath);
    }
}
```
Deviseにおいて、複数の認証キー（企業コード、ユーザID、パスワードの組み合わせ）で認証する

```rb:User.rb
class User < ActiveRecord::Base
  belongs_to :company
  belongs_to :branch
  belongs_to :shop
 
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :authentication_keys => [:company_code, :user_id]
 
  attr_accessor :company_code
 
  # enable authentication by user_id
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    logger.debug "*************** conditions class ******************"
    logger.debug conditions.to_yaml
 
    company_code = conditions.delete(:company_code)
    company = Company.where(code: company_code).first
    user_id = conditions.delete(:user_id)
 
    logger.debug "company_code: " + company_code
    logger.debug "company: " + company.to_yaml
    logger.debug "user_id: " + user_id
 
    # devise認証を、複数項目(企業ID、及びユーザID)に対応させる
    if company && user_id
      where(conditions).where(["company_id = :company_id AND lower(user_id) = :user_id",
        { company_id: company.id, user_id: user_id }]).first
    else
      where(conditions).first
    end
  end
```
nkfを使ってひらがな、カタカナ（全角・半角）間の変換行う

```ruby:string_kana_extention.rb
class String
  require 'nkf'

  # NOTE require nkf 2.0.9 over

  # convert from full(or half)-width katakana to hiragana.
  def to_hiragana
    # NOTE -w option is for utf8 output
    NKF.nkf('-w --hiragana', self)
  end

  # convert from hiragana or half-width katakana to full-width katakana.
  def to_katakana
    NKF.nkf('-w --katakana', self)
  end

  # convert from hiragana or half-width katakana to half-width katakana.
  def to_hw_katakana
    # At first, convert to full-width katakana,
    # and then convert to half-width hiragana.
    NKF.nkf('-w -Z4', to_katakana)
  end
end
```

それぞれの変換について、nkfを使って割と簡単にできました。さすがRubyです。

Stringクラスの拡張メソッドとしてまとめてみました。想定以外の文字列の場合は、そのまま出力されます（nkfの仕様に準拠）。また、出力はutf8になります。

後々Gemとかにもしていく予定。

# References
* [文字コード変換プログラム「nkf 2.0.9」リリース：CodeZine](http://codezine.jp/article/detail/3519)
AppCode でも XCode のように // MARK: とか強調表示させる


Xcode ではコメントで以下のフォーマットを使用すると、ファンクションメニューで強調表示されるので便利！

```objectivec:
// TODO: todo
// FIXME: fixme
// MARK: mark
// !!!: !!!
// ???: ???
```
![fm_xcode.png](https://qiita-image-store.s3.amazonaws.com/0/35834/8c2c52c8-1871-d1b4-185d-52f0c45291b7.png "fm_xcode.png")

AppCode だと `// TODO` と `// FIXME` だけしか強調表示されないので、AppCode の設定を弄ってみる。

## 設定変更

1. Preference -> TODO -> Pattern
2. プラス記号のボタンを押して新規パターンを追加
3. `\bmark\b.*` を入力してOK、Apply!!

![mark_pref.png](https://qiita-image-store.s3.amazonaws.com/0/35834/189da657-b2b5-359f-5524-81fc325b8ede.png "mark_pref.png")

これで、`// MARK` のコメントを入力すると強調表示されますね！

![mark.png](https://qiita-image-store.s3.amazonaws.com/0/35834/be1140e0-4566-f267-b1fd-68eff8d315c3.png "mark.png")


## 補足
AppCode は `// TODO` で強調表示されますが、
XCode では `// TODO:` で強調表示されます

また、`// !!!:` と `// ???:` はエスケープさせてみたりしたけど出来なかった…
Qiita APIを用いた Qiita:Teamへの一括投稿

###動機

自分の所属するグループは急遽，Qiita:team を導入することになり，
「元々テキストで共有していたTipやノウハウのファイルを，Qiita Teamに移行したい」
とのこと．．．まずやってみることにしました．

→「ウェブ経由でテキストがいつでもみれるじゃん」
→「タグ付けして，簡単に管理してみよう」
→「チーム内でメンションを飛ばして，読んでもらうことができる」
などなど良さそうなことが思いついたので．．．
Qiita APIで一括投稿を実装してみました．


###つまずいた部分

軽い気持ちで，実装を初めたのですがいくつか問題にぶつかりました．

1. "tags"の重複配列で不具合
2. textファイルのエンコードがutf-8に統一
3. ディレクトリごとにタグを追加

####1. 'tags'の配列
Qiita API(http://qiita.com/docs/api#14) によると，
inputのtagsにはnameとversionを入れることができます．

```before.json
{
    "title": "test",
    "body": "This is a test posting.",
    "tags": {
        "name": "tips"
    },
    "team_url_name": "ourteam"
}
```
という感じにしていましたが．．．

```after.json
{
    "title": "test",
    "body": "This is a test posting.",
    "tags": [
        {
            "name": "tips"
        }
    ],
    "team_url_name": "ourteam"
}
```
こちらならいけました．初歩的なミスです．

####2. textファイルのエンコードがutf-8に統一
Macにおいて，shift-jisをutf-8に変換してみるも，
なぜか読み込めないテキストファイルが複数あることに気付きました．
cotEditorで開いてみると．．．Windows DOS?

調べてみるとcp932という文字コードらしく，
Pythonで実装したコードでは，shift-jisとは別に認識されているようでした．

####3. ディレクトリごとにタグを追加
任意のディレクトリ内におけるtextファイルを投稿する際，
そのディレクトリ名をタグに入れることにしようと考えました．
しかし，文字列を効率良く得る方法がわからず，

```py
file_name, ext = os.path.splitext(file)
tag_line = files[len(path)+1:]
tag_list = tag_line.split('/')

```
ファイル名と拡張子を分けて，
path以下の文字列を'/'で切り取る
と，実装しながら「あぁ，もっと賢い方法があるのだろうな」
そう思いながらコーディングしていました．
(一応，この方法で問題なくタグとして文字列を配列で取得できました．)


###実装後
よく考えてみたら，投稿したアカウントしか編集ができないため，
後に手動で「共同編集にする」と変更しました，トホホ．

この件について，Qiitaさんに問い合わせたところ，
開発中の Qiita API v2 にて対応だそうです．
楽しみです．

###サンプル
https://github.com/tkshnkmr/qiita_api
AlloyのModel，使ってみる．

-
[ソースコードはこちら](https://github.com/YukiTETSUKA/testModel)
今回は主に[公式ドキュメント](http://docs.appcelerator.com/titanium/3.0/#!/guide/Alloy_Models)を参考にしました．

## 背景的な
そろそろTitanium初心者を抜け出したいと思ったのでAlloyフレームワークのModelを使ってみようかなと．

## 今回やったこと
* ModelのデータをTableViewにバインドした
* レコードを追加する際に，validateを行った

※見た目は普通にTableViewを使ったのと変わらないので載せません

## ちょっと説明

``` javascript:app/controller/index.js
function transFormFunction(model){
  var transform = model.toJSON();
  return transform;
}

var library = Alloy.Collections.user;
library.fetch();
```

この2つはとても重要．TableViewに何も表示されないのであれば，おそらくこのどちらかの処理が欠けている．

``` javascript:app/model/user.js
extendModel: function(Model) {
    _.extend(Model.prototype, {
      validate: function(attrs){
        for(var key in attrs){
          var value = attrs[key];
          switch(key){
            case 'name':
              if(value.length <= 0 || 20 < value.length){
                return 'Error: No title';
              }
              break;
            case 'age':
              if(isNaN(value)){
                return 'Error: No age';
              }
              break;
            case 'email':
              if(!(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/.test(value))){
                return 'Error: No email';
              }
              break;
          }
        }
      }
    });

    return Model;
  }
```

controller側でisValid()メソッドを呼び出すとvalidateが呼び出される．isValid()は一番下のreturn Model以外のreturnを受け取った場合，falseと判定されるっぽい．(要検証)

## 理解した点・苦労した点
* **まず日本語の記事が少ない**
* dataTransformこれ重要
* Alloy.Collections.model.fetch()これも重要
* **そして日本語の記事が少ない**

## 最後に
今までTi.App.Propertiesにデータを格納してきたが，これからは勉強がてら積極的にmodelを使っていこうかなと．
また機会があったらmodelの記事を書きたいと思います．
Java クラスファイルの構成 その2


# 型指定子 (type descriptor)

型指定子はクラスファイル上でフィールドやメソッドの型を表現するのに利用される文字列です。
型指定子は型消去されたあとのジェネリクスを含まない型情報を表現します。

よく勘違いしている人がいますが、ジェネリクスを含む型情報は別途 *シグネチャ* と呼ばれる属性としてクラスファイル上に残っています。
ただ、JVM はシグネチャを無視するため、実行時にはジェネリクスを含む型情報を取得できないのです。

## プリミティブ型の型指定子

プリミティブ型の型指定子は各プリミティブ型に対応したアルファベット1文字です。
プリミティブ型とそれに対応する型指定子は以下の表の通りです。
long が L でないのは L がオブジェクト型の型指定子で利用されているためです。(たぶん)
ではなぜオブジェクト型の型指定子に L を使ったのは聞かないで下さい。(class の L ?)

| プリミティブ型| 型指定子|| プリミティブ型| 型指定子|
|:------------|:-------|:--:|:------------|:-------|
| byte        | B      || int         | I      |
| char        | C      || long        | J      |
| double      | D      || short       | S      |
| float       | F      || boolean     | Z      |

### void 型指定子

void 型の型指定子はメソッドの返り値の型でのみ利用できる特殊なプリミティブ型の型指定子です。
void 型の型指定子は他のプリミティブ型と同様アルファベット1文字で、対応するアルファベットは V です。

## オブジェクト型の型指定子

オブジェクト型の型指定子は、先頭の一文字が L で、続いてクラス名、最後に ; (セミコロン) という形式となっています。
クラス名は必ず完全修飾名(パッケージ名を含む完全な名前)で、internal form と呼ばれる形式にエンコードされています。
internal form は '.' の代わりに '/' でパッケージ名を区切ったものです。
例えば、以下は String 型の型指定子です。
Java を使ったことのある方ならどこかで一度は目にしたことがあるのではないでしょうか。

```
Ljava/lang/String;
```

## 配列型の型指定子

配列型の型指定子は、先頭の一文字が [ で、それに配列の中身の型指定子が続くといった形式となっています。
配列の中身の型指定子には、void を除くプリミティブ型の型指定子、オブジェクト型の型指定子、及び配列型の型指定子が利用できます。
例えば、以下は全て配列型の型指定子です。

```
[I
[Ljava/lang/String;
[[[D
```

上から順に、int[], String[], double[][][] を表現しています。

## フィールドの型指定子

フィールドの型指定子には void を除くプリミティブ型の型指定子、オブジェクト型の型指定子、及び配列型の型指定子が利用できます。
例えば、以下は全てフィールドの型指定子として利用可能です。

```
I
Ljava/util/List;
[[Ljava/lang/Object;
```

上から順に、int, List, Object[][] を表現しています。

## メソッドの型指定子

メソッドの型指定子は、以下の様な形式で記述されます。

```
(引数リスト)返り値の型
```

引数リストは引数の型の型指定子を順に並べたものです。
スペースやカンマなどの区切り文字は入りません。
引数の型には void を除くプリミティブ型、オブジェクト型、及び配列型の型指定子が利用できます。
返り値の型は void を含むプリミティブ型、オブジェクト型、及び配列型の型指定子です。
例えば、int と String を引数に取り、Object 配列を返すメソッドの型指定子は以下のようになります。

```
(ILjava/lang/String;)[Ljava/lang/Object;
```

引数リストの長さは最大で 255 までで、それ以上長い引数リストを持つメソッドは不正なメソッドとなります。
ただし、long 及び double は引数 2 つ分と数えます。
これは long, double がほかの型と異なり 8 バイトであるためです。
Java ではオブジェクトは 4 バイトの参照(アドレス)で渡されるので、long, double のみ倍のサイズとなります。
(注: Java は参照渡しだ！と言っている人がいますがそれは誤りです。この渡し方は参照の値渡しと呼びます)
そのため、この long, double の特別扱いには定数プールの時と異なり意味があります。

## あとがき

Java クラスファイルの構成について、残るは属性(attribute)のみです。
と言っても、属性の説明だけで他の部分の説明の何倍にもなりますが。

ここに書いた情報は全てJavaの仮想マシン仕様書に書いてあります。
詳しく知りたい方はそちらを読みましょう。
【OS X Mavericks】10.9.3アップデートしたとき困ったこと

OSアップデートしたら、困ったことがそこそこあったのでメモ。

#動かない系
##WinArchiver Lite
ゴミファイルを除いてzipにしてくれる
**対処法：アップデートする**
http://winarchiver-lite.softonic.jp/mac

#OS X Mavericksに対応してない系
##Total Finder
ディレクトリやファイルのパスのコピー
**対処法：アンインストールして代わりに[XtraFinder](http://www.trankynam.com/xtrafinder/)を入れる**
それ以外にも便利な機能はたくさんある
http://applech2.com/archives/37889607.html

##Flip4Mac
MacでWMVを再生する
**対処法：アンインストールして代わりに[VLC](http://www.videolan.org/vlc/)を入れる**
参考：[「OS X Mavericks」でWMV動画を快適にみる方法 | iTea4.0](http://itea40.jp/technic/mac-beginners/os-x-mavericks/how-to-view-windows-media-video/)

##Rapid SVN
SVNアプリ。無料なんだけど使い勝手はいまいち・・・
**対処法：有料の[Cornerstone](https://www.zennaware.com/cornerstone/index.php)に変更**

#未インストール状態
##Java
ウェブ上のなんか動かすときに必要なときがある。
**対処法：最新版をインストールすると、Firefox/Safariで使うことができる**
※ChromeはJava7をサポートしていないみたい
http://www.java.com/ja/download/mac_download.jsp?locale=ja
NPMがNotFoundって言われた時にしたこと


NPM系のパッケージって結構更新速度早いので週一で`npm update -g`とかしてるんだけど`sudo`つけ忘れて`ctrl+c`で止めて

```bash
$sudo npm update -g
npm command not found
$
```

一瞬頭が白くなってどうしようってなったわけだけど
[こちら](http://hentai-kun.hatenablog.jp/entry/2013/12/15/074238)を参考にやってみたらうまくいった。
Homebrew使ってるからLink貼り直しでやればいいんじゃないかと思ったんだけど上記のサイト様同様エラーが出ちゃって仕方なかったので下記でやったらうまくいった

```bash
$ sudo su -
$ brew postinstall node
==> make uninstall
==> make install
$sudo npm update -g
```
GenymotionでTiShadowが起動できなくなった問題の解決

#結論
Android 4.4ではなく4.3のシミュレータを作成してGappsをインストール．
#GenymotionのAndroidにTiShadowが使えない
TiShadowExpressをGenymotionのAndroidで実行しようとしても以下のようにエラーになった．

```
$ti build -p android --tishadow
…
[ERROR] Failed to install apk on "192.168.56.100:5555"
[ERROR] Error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
```

どうやらGappsが入っていないからっぽい．[他のページ](http://idea-cloud.com/dev/genymotion_google_play.html)も参考にしつつ，Genymotion-ARM-Translation_v1.1.zipとGoogle Apps for Android 4.4を導入してみた．
http://forum.xda-developers.com/showthread.php?t=2528952
今度は「問題が発生したため、Google Play開発者サービスを終了します。」と１０秒に一回ぐらい表示されるようになってしまった．
![スクリーンショット 2014-09-01 15.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/46334/a8b3b328-7ab2-2201-219e-c9407b2af8ff.png "スクリーンショット 2014-09-01 15.00.15.png")
Google Apps for Android 4.4はどうやらバグがあるらしいので，4.3をインストールしてみたが，結果は似たような感じでメッセージが表示される．
#解決方法
Google Apps for Android 4.4はバグがあるので，4.3のGappsをダウンロードし，それに合わせてシミュレータも4.3で構築する．以下はGoogle Nexus 7 2013のバージョン4.3で構築している． 
![スクリーンショット 2014-09-01 15.39.46 1.png](https://qiita-image-store.s3.amazonaws.com/0/46334/5c195629-0275-99d6-4175-2480001be5b4.png "スクリーンショット 2014-09-01 15.39.46 1.png")
VyOS1.0.4にZabbix Agentをインストールする

```bash
$ wget http://repo.zabbix.com/zabbix/2.2/debian/pool/main/z/zabbix/zabbix-agent_2.2.5-1+squeeze_amd64.deb
$ sudo dpkg -i zabbix-agent_2.2.5-1+squeeze_amd64.deb
$ sudo vi /etc/zabbix/zabbix_agentd.conf
$ sudo update-rc.d zabbix-agent defaults
$ sudo service zabbix-agent start
```
HIVEで文字列の配列化と配列の中身を１レコードずつに分ける方法

HIVEでビッグデータを処理する場合、
ログデータの中から区切り文字（例えば、","コンマ区切り）のデータを１レコードずつに分配したい場合があると思います。

その場合、まずは区切り文字の列を配列に変換し、
それを一レコードずつに落としこんでいきます。

配列に落としこむのは、HIVEで提供されているsplitを使用します。
splitは指定したカラム内の文字列を区切り文字で自動的に分離して配列に格納してくれます。
例えば、hogeカラム内がコンマ区切りの文字列の場合…

```
split(hoge, ',')
```

そして、これを一レコードずつに表示するには、
HIVEのUDFとして提供されているexplodeを使用します。
explodeは配列のデータを一レコードずつに出力するメソッドです。
bar_listというカラムに配列でデータが格納されている、
barsテーブルがあったとします。
すると以下のようにかけます。

```
SELECT explode(bar_list) AS bar_id FROM bars;
```

この２つの書き方を組み合わせると一レコードずつに区切ったテーブルの作成ができます。
注意しなければならないのは、explodeの使い方です。
実は、explodeは配列を展開するとそれを一つのテーブルとしてみなすことになり、
他のカラムと合わせて表示することができません。
したがって、HIVEのLATERAL VIEWを使い、viewとしてくっつけます。
例えば、bar_id, bar_listを持つbarsをいうテーブルがあったら、以下のような形になります。

```
SELECT bar_id, bar_player
FROM bars LATERAL VIEW explode(bar_list) ad_table AS bar_player;
```

結構、おもしろい加工ができそうです。
URLリダイレクトのspecを書きたいとき

単純に"old/page/url"を"new/page/url"にリダイレクトする処理のrspecを書くとき、

```rb
  get 'old/page/url'
```
で書くと、そんなacitonがないよ、と怒られる。

Controller specの場合、getに渡すパラメータがaction名だから。

そんなとき、Request specsの登場です。
やり方は簡単。specをspec/requestsフォルダ配下に作るだけです。

```rb
describe PcController do
  it 'redirect old/page/url to new/page/url' do
    get 'old/page/url'
    expect(response).to redirect_to('http://test.com/new/page/url')
  end
end
```

## 独り言
なるほど、spec/requests配下に置くだけで、urlをgetできるのだ。ちなみに、postもできる。
見た目では同じgetメソッドなのに、置く場所によって、actionであったり、urlであったりするのだ。
EC2上のPostfixからSES経由でメール送信

EC2のZabbixからアラートメールを送る場合、スクリプトではなく、ローカルのPostfixから送信する

> http://docs.aws.amazon.com/ses/latest/DeveloperGuide/postfix.html

*Update : SES Endpointの25番ポートに接続すると、Connection Timeoutが多発し、配送が遅延するので、587番ポートに変更*

> http://stackoverflow.com/questions/11194080/amazon-ec2-ses-smtp-timeout
http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-issues.html
You are sending to Amazon SES from an Amazon EC2 instance via port 25 and you cannot reach your Amazon SES sending limits or you are receiving time outs—Amazon EC2 imposes default sending limits on email sent via port 25 and throttles outbound connections if you attempt to exceed those limits. To remove these limits, submit a Request to Remove Email Sending Limitations. You can also connect to Amazon SES via port 465 or port 587, neither of which is throttled.



* PostfixをインストールしてSendmailをアンインストール

```bash
$ sudo yum install postfix
$ sudo yum remove sendmail
$ chkconfig postfix on
```
* Sendmailを残しておく場合

```bash
$ alternatives --set mta /usr/sbin/sendmail.postfix
```

* /etc/postfix/main.cfに下記を追記

```bash:/etc/postfix/main.cf
relayhost = email-smtp.us-east-1.amazonaws.com:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt
```

* /etc/postfix/sasl_passwdを作成

```bash:/etc/postfix/sasl_passwd
email-smtp.us-east-1.amazonaws.com:587 USERNAME:PASSWORD
```

* パスワードDB生成

```bash
$ sudo postmap hash:/etc/postfix/sasl_passwd
$ sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
$ sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
```

* Postfix再起動

```bash
$ sudo /etc/init.d/postfix restart
```
cocos2d-xをかじったのでUnityと比較

# 概要
* よくある内容
* 浅堀り
* 間違えてたら指摘ください
* 備忘録というか脳内の整理の為の覚え書き
* 比較に悪意はない、と思う

# お値段
## cocos2d-x
* MITライセンス、オープンソース

## Unity
* プロプライエタリ、コードは見れない
* 条件付きFree版、Pro版のみの機能は使えない、起動時にUnityロゴ表示
* Pro版10万、iOSコンパイラ10万、Androidコンパイラ10万
* メジャーアップデートの際は追加費用がかかる(3系->4系の際は必要でした)

# スマフォとの連携、アーキテクチャ部分はどうやってるのか？
## cocos2d-x
### iOS
* Objective-C上でC++が動くのでそんな感じ

### Android
* JNIにC++を格納、他Javaを少々
* Native部分の連携とJavaとの連携で補完してる模様

## Unity
* 上のcocos2d-x条件を使ってUnityはMonoVM動かすぽい

Unityの開発中はJITコンパイル
Xcodeで開発してると差分ビルドするけどAOTみたい、基本C++はビルド遅い

# オブジェクトの配置
## cocos2d-x
* ノードでツリー上にオブジェクトを配置、タグも使える

## Unity
* ヒエラルキーでツリー上にオブジェクトを配置、タグも使える
* 視覚的にツリーがみれる。ついでに配置したものが見れる。動作しているオブジェクトを一時停止、コマ送りができる
* タグは共通の場所で管理

cocos2dはタグの管理が煩雑だと大人数の開発だと大変かも。※ こんなの定義ファイルに書くようにすればすむ話
問題はツリー上に見れないのでデバッグコストはUnityよりかかるかも。
Unityの一時停止機能は便利

# リソースの配置
## cocos2d-x
* 基本コード書かないとできない
* 一定のルールに従ったデータを読み込ませて動作が見れる

## Unity
* ビュジュアルツールでプランナーやデザイナーといったプログラム経験なくても配置できる
* ツール化してあれば一定のルールの配置することで、そのまま画面で作ったものが動く

# まとめてきななにか
UnityはアプリサイズがiOSだと20Mからになる。無駄に大きい。
小さなアプリを作るのであればUnityより、cocos2d-xの選択でよさそう。
集団での開発はノードが見えるだけUnityのがまし。
いろいろメリット、デメリットはあるわけですが。さわり部分の評価まで。
他には、Unityはシーン移動(GCが行われる)にかかるコストが大きいので結局1シーンで作成することになりかねないとかあったり、ビジュアルツールとしてはよいのだけど基礎の部分がどこか微妙で実装が肥大化していってる印象はある
vimの最短マッチ


以下は、最長マッチになる。

```vim
*
```

以下で、最小マッチ。

```vim
\{-}
```

例えば、csvとかで行頭からカンマまで最短マッチしたければ。

```vim
/^.\{-},
```

v(後方のスラッシュ記述なし)があれば、

```vim
/v^.{-},
```

マッチしたものを削除したければ

```vim
:%s/^.\{-},//
```

こんな感じ。
Amazon Linux AMI 2014.03.2 (ami-29dc9228)にSNMPTTをインストールする

Amazon Linux AMI 2014.03.2 にはPerlのバージョンの問題により、epelのsnmpttパッケージがインストールできない
http://dev.classmethod.jp/cloud/aws/amazon-linux-ami-2014-03-trap/

* インストール手順

```bash
$ sudo yum install -y --enablerepo=epel openssl-devel git gcc gcc-c++ net-snmp perl-IPC-Cmd perl-CPAN-Meta perl-Sys-Syslog cpan

$ sudo perl -MCPAN -e 'my $c = "CPAN::HandleConfig"; $c->load(doit => 1, autoconfig => 1); $c->edit(prerequisites_policy => "follow"); $c->edit(build_requires_install_policy => "yes"); $c->commit'

$ sudo PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install Module::Build::Compat'
$ sudo PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install Config::IniFiles'

$ wget "http://sourceforge.net/projects/snmptt/files/latest/download?source=files" -O snmptt_1.4.tgz
$ tar xzvf snmptt_1.4.tgz

$ sudo cp snmptt_1.4/snmptt /usr/sbin
$ sudo cp snmptt_1.4/snmptthandler /usr/sbin
$ sudo cp snmptt_1.4/snmpttconvert /usr/bin
$ sudo cp snmptt_1.4/snmpttconvertmib /usr/bin
$ sudo cp snmptt_1.4/snmptt-net-snmp-test /usr/bin
$ sudo cp snmptt_1.4/snmptt.logrotate /etc/logrotate.d/snmptt
$ sudo cp snmptt_1.4/snmptt.ini /etc/snmp/
$ sudo cp snmptt_1.4/snmptt-init.d /etc/init.d/snmptt
$ sudo chkconfig --add snmptt
$ sudo chkconfig snmptt on
$ sudo service snmptt start
```
UIWindowLevelの怪


### 自前でViewControllerをモーダル表示させたい
iOSでモーダルでViewControllerを表示したい場合、

`- (void)presentViewController:animated:completion:`

を使うと思うのですが、時に、これを使わずにモーダル表示をさせたい場面があり、その対策の一つとして、専用のUIWindowクラスを作る手があります。

上記のメソッドに似た形で試しに作ってみたのがこちら。
任意のViewControllerを渡すと、それをモーダルっぽく表示してくれます。
ちなみにanimated=YESだと、ふわっとした感じで出てきます。

```objectivec:UIViewController+Alert.m

/**
 @brief 与えられたViewControllerをアラートとして表示する
 */
- (void)presentAlertController:(UIViewController *)viewControllerToPresent
                      animated:(BOOL)animated
                    completion:(void (^)(void))completion {
    
    dispatch_async(dispatch_get_main_queue(), ^{
        UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        window.windowLevel = UIWindowLevelAlert;
        window.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2];
        window.rootViewController = viewControllerToPresent;
        [window makeKeyAndVisible];
        
        self.indicatorWindow = window;
        
        if (animated) {
            window.alpha = 0.1;
            
            [UIView transitionWithView:window duration:0.5
                               options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionCurveEaseInOut
                            animations:^{
                                window.alpha = 1;
                            } completion:^(BOOL finished) {
                                if (completion) {
                                    completion();
                                }
                            }];
        }
    });
}
```

### UIWindowLevel？
さて、これだけであれば平和に解決なのですが、UIWindowにはwindowLevelというプロパティがあります。
これ、要するに「そのWindowがどれぐらい手前に出てくるか」というレベルです。
ちなみにリファレンスを見ると、こうなっておる。

```objectivec:UIWindowLevel.h
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
```

簡単に言えば、
「通常のwindowよりも、アラートの方が常に手前に出る」
そして更に
「アラートよりも、ステータスバーの方が常に手前に出る」
ということです。それを決定しているのがこのUIWindowLevelなわけです。

### 通常Windowとアラートの間のレベルが欲しい！！
そうなんです。
実は、そもそも私が自前でモーダル表示のカテゴリメソッドを生やしたのは、
「通常のWindowよりは手前だけど、アラートよりは奥に出るWindowが欲しい」
という要望からでした。

しかし、windowLevelプロパティに設定できるのは上記の３種類だけ・・・？

### いやいや、よ〜く見ると
```objectivec:UIWindowLevel.h
typedef CGFloat UIWindowLevel;
```

と書いてあるじゃないですか。はい。こいつ、単なるCGFloatなんです。

というわけで、そしたら、

```objectivec:UIViewController+Alert.m
window.windowLevel = UIWindowLevelAlert;
```

の部分を、

```objectivec:UIViewController+Alert.m
window.windowLevel = UIWindowLevelAlert - 1;
```

に書き換えれば、アラートより奥にwindowが表示されるのでは？？

### あかんやん

しかし、それではうまくいきませんでした。
もう少し正確に言うと、このUIViewController上から更に普通のUIAlertViewを表示させようとしても、
全く何も起きなくなってしまいました。

### なんであかんのかぜんぜんわからへん

ということで、色々とデバッグしてみたところ、実は

```objectivec:UIViewController+Alert.m
window.windowLevel = UIWindowLevelAlert - 4;
```

だとちゃんと動いたのです！！

-1と-4。
どういうことなのか。
ともかく、

*iOSが「WindowLevelに差がある」と判断するには、最低でもWindowLevelの差が4以上は必要*

という結論に現在至っております。
しかし理由は全くわかりません。
誰かご存知の方、ご教授いただければと思います。
[Heroku] Heroku の Rails プロジェクトの Ruby のバージョンを確認する方法

# コマンド

ローカルの heroku のプロジェクトがあるディレクトリにて以下のコマンドを打ち込む。

```
heroku run 'ruby -e "puts RUBY_VERSION"'
```

表示は以下の様な感じ。

```
Running `ruby -e "puts RUBY_VERSION"` attached to terminal... up, run.9368
2.0.0
```


# GemfileにRubyのバージョンを指定

Gemfileの冒頭部分に。

```vim:Gemfile
source 'https://rubygems.org'
ruby '2.0.0'
```
.gitignoreについて

# What's .gitignore?
教科書的にいうと、.gitignoreとは、Gitリポジトリにおいて、意図的に追跡対象から外したい（無視したい）ファイルを設定するためのファイルです。

# Simple Guideline
以下のファイルをGitで追跡対象にします。

* プロジェクトのソースコード
* ビルドファイル(Makefile, Rakefile, build.xml等)
* ドキュメント
* アプリケーションのリソース(画像等)
* テストコード
* 設定ファイルの**テンプレート**(**not 設定ファイル**)

なぜ設定ファイル自体は追跡しないかというと、設定ファイル自体はメンバー固有のものだからです。（各メンバーで項目が違うものを追跡して逐一pushしていたら、毎回conflictを起こしてしまい、メンバーから顰蹙を買うことになるでしょう。。。）

リポジトリにそのコードを含めるかどうか気になったら、以下の問に答えてみるといいでしょう。*「XXXがなかったら、このプロジェクトで自分の作業ができるだろうか？」*もし、「できない」のであれば、XXXをリポジトリに含めるようにしてみましょう。

# .gitignore Templates

GitHubから、様々なプログラミング言語やフレームワークに対する.gitignoreのテンプレートファイルが提供されています。以下をベースにして、気づいたところをカスタマイズしていくようにすると良いと思います。

* [github/gitignore · GitHub](https://github.com/github/gitignore)

もし、既に追跡対象にしてしまっているファイルを無視したい場合は、`git rm --cached`
でファイルを追跡対象から外して、そのファイルを.gitignoreに加えればよいでしょう。.gitignoreを更新したら、commitしないと反映されないことに注意です。

以上はあくまでも、方向性としてそんな感じですよ、という話です。具体的なプラクティスについては、ぜひ教えてください！

# References
* [Git - gitignore Documentation](http://git-scm.com/docs/gitignore)
* [Amazon.co.jp： 入門git: Travis Swicegood, でびあんぐる: 本](http://www.amazon.co.jp/gp/product/427406767X/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=466449256&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4798023809&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=1CHWJ0W1N93F0YW7A00D)
stack machine アセンブラ　その3

#fizz buzz
```
  push  "x"
  push  ""
  set
  push  "i"
  push  "0"
  set
loop  push  "i"
  push  "i"
  get
  ++
  set
  get
  push  "i"
  get
  push  "15"
  %
  push  "1"
  >
  if  skip2
  push  "i"
  get
  push  "5"
  %
  push  "1"
  >
  if  skip1
  push  "i"
  get
  push  "3"
  %
  push  "1"
  >
  if  skip0
  push  "x"
  push  "x"
  get
  push  "i"
  get
  add
  set
  push  "x"
  push  "x"
  get
  push  " "
  jp  skip3
skip0  push  "x"
  push  "x"
  get
  push  "fizz "
  jp  skip3
skip1  push  "x"
  push  "x"
  get
  push  "buzz "
  jp  skip3
skip2  push  "x"
  push  "x"
  get
  push  "fizzbuzz "
skip3  add
  set
  push  "i"
  get
  push  "100"
  >
  if  loop
  end
```
#実行環境
stack machineは、flashです。
webで実行
[jsdo ohisama1](http://jsdo.it/ohisama1/1Wjf)
【個人メモ】GoのビルトインライブラリでファイルのMIME Typeを推測したい場合

# net/httpパッケージを使えば良い

net/httpの[DetectContentType関数](http://golang.org/pkg/net/http/#DetectContentType)を使うと楽だ。
[実装はここ](http://golang.org/src/pkg/net/http/sniff.go)。

# 例

標準入力からファイルを読み込み、MIME Typeを出力する簡易なスクリプトを書く。

```go:mime.go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
)

func main() {
	bytes, err := ioutil.ReadAll(os.Stdin)

	if err != nil {
		panic(err)
	}

	mimeType := http.DetectContentType(bytes)

	fmt.Printf("MIME Type: %s\n", mimeType)
}
```

# 試す

## goのソースコード

```
./mime < mime.go
MIME Type: text/plain; charset=utf-8
```

## バイナリファイル

```
./mime < mime
MIME Type: application/octet-stream
```

## htmlファイル

```
./mime < test.html
MIME Type: text/plain; charset=utf-8
```

## bmpファイル

```
./mime < test.bmp
MIME Type: image/bmp
```

## jpegファイル

```
./mime < test.jpg
MIME Type: image/jpeg
```

## pdfファイル

```
./mime < test.pdf
MIME Type: application/pdf
```

## wav

```
./mime < test.wav
MIME Type: audio/wave
```

## mp3

```
./mime < test.mp3
MIME Type: application/octet-stream
```

## mp4

```
./mime < test.mp4
MIME Type: application/octet-stream
```

# 使用感

magicコマンド程ではないにせよ
こういうライブラリをGoは包含してるのはいいと思う。
自己完結ライブラリで作り上げれば、クロスコンパイル楽だし。

ただ、バイナリに関してはほぼ推測されない。そのため、
magicコマンド相当のものが欲しければ、
[magicmime](https://github.com/rakyll/magicmime)を使おう。

ただし、この場合は環境ごとにlibmagicをインストールし、
ライブラリとリンクできる状態にならなければならないため、
可搬性は低くなる。
Ionic frameworkでiOSとAndroidアプリを両方エミュレーターで立ち上げるまで

まずは[Getting Started](http://ionicframework.com/getting-started/)にあるようにcordovaとionicをnpmで入れる。(macでnpmインストール失敗した人は[こちら](http://qiita.com/imaimiami/items/74d3ecea1969d980775b)が参考になるかも)

```
npm install -g cordova ionic
```

で、サンプルアプリを作る。以下の場合`myApp`というディレクトリが作られる。`tabs`はアプリテンプレ。

```
ionic start myApp tabs
```

`myApp`に移動して、
platformを追加して、buildして、シミュレータを立ち上げる。
自分はxcodeとか入ってたからiosの方は以下だけですんなりいきました。

```
cd myApp
ionic platform add ios
ionic build ios
ionic emulate ios
```

若干はまったのがandroidで、`ionic platform add android`すると`ant`がないと怒られる。
なのでantをいれる。

```
brew install ant
```

再度platform追加しようとすると、今度は`android`がないと怒られる。
bashなどでandroid sdkの場所を指定してあげる。([こちら](http://stackoverflow.com/questions/23960763/error-on-adding-platform-in-ionic-framework-on-windows)に助けられた)

```
export ANDROID_HOME=/Applications/android-sdk
export ANDROID_TOOLS=/Applications/android-sdk/tools/  
export ANDROID_PLATFORM_TOOLS=/Applications/android-sdk/platform-tools/

PATH=$PATH:$ANDROID_HOME:$ANDROID_TOOLS:$ANDROID_PLATFORM_TOOLS:.
```

android sdkがない人はどっかに置いてあげないといけない。
~~自分はAndroid StudioをインストールしててAndroid Studioはapp内にsdkを内包してるのでそちらを指定した。~~
cordovaのpluginはandroid向けにはeclipse開発環境を想定しているものがあったりするので、Android Studioの中のものではなく普通に落としてきたsdkのディレクトリを指定してあげた。

以上終えたら満を持して、

```
ionic platform add android
ionic build android
ionic emulate android
```

emulateは指定する方法もあるのかもだけど、最後に起動したemulatorが起動した(wear端末のemulatorが起動して焦った)

で、結果以下の様な感じ。HTML5ファースト！

![iOSシミュレータ_-_iPhone_Retina__3_5-inch____iOS_7_1__11D167_.png](https://qiita-image-store.s3.amazonaws.com/0/29793/9731f1c5-8e9d-b796-6684-7bc107a6379a.png)
Apacheで特定のアクセスをログに残さない


Raspberry piをSDカードで運用しているのですが、書き込み回数を抑えたいため調査。

```diff:/etc/apache2/sites-enabled/000-default
-  CustomLog ${APACHE_LOG_DIR}/access.log combined
+  SetEnvIfNoCase Request_URI "\.(gif|jpg|png|css|js|woff)$" no_log
+  SetEnvIfNoCase Request_URI "nagios_checker.html$" no_log
+  CustomLog ${APACHE_LOG_DIR}/access.log combined env=!no_log
```

これで`no_log`に該当するアクセスはログから除外される。

## 参考

* [mod_setenvif - Apache HTTP サーバ バージョン 2.4](https://httpd.apache.org/docs/2.4/ja/mod/mod_setenvif.html#setenvifnocase )
tmux上でTitanium CLIのビルドを行った時にiosエミュレータが立ち上がらない問題の解決


tmux上からTitaniumプロジェクトをビルドしてiPhoneシミュレータで確認しようとしても起動したiPhoneシミュレータの画面が真っ黒の画面になり以下のようにインストール出来ない．

```
$ti build -p ios
…
[INFO]  Focusing the iOS Simulator
[ERROR] Project failed to build after 1m 57s 931ms
```
#解決方法
以下のようにreattach-to-user-namespaceをインストールしてから，.tmux.confを設定することによってtmux上からビルドできるようになる．

```
$ brew install reattach-to-user-namespace
$ echo 'set-option -g default-command "reattach-to-user-namespace -l zsh"' >> .tmux.conf
```

```
$ti build -p ios
```
brewでnode, npm入れようとして怒られたときの対応

```
brew install node
```

をしたら

```
brew postinstall node
```

をしなさいと言われた。この状態で`node`は呼べても`npm`は呼べないので混乱してdoctorを呼んだりした。

ただし、言われた通りにやってもエラーになり、
`brew uninstall node`とか試してみても変化がなかったが、

以下ののリンクのようにちゃんとnodeを消してあげた後に実行したら上手くいった。

http://d.sonicjam.co.jp/post/52541343939

```
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

この後に、以下で`node`の`npm`も呼べるようになる。

```
brew postinstall node
```
git rebaseの例

`git rebase`は難しいねーっていう話をたまにするので、実際の例を書いてみる。コンフリクトしたので自明ではない例だと思ったけど、そうでもないかも。

# rebaseの手順

.scssファイルを編集したPRがあって、いつのまにかマージできなくなっていたので`git rebase master`したらうまくいかなかった。

こんな感じにコンフリクトした。

![dashboard_scss_-_ubiregi-server_-____src_ubiregi-server_.png](https://qiita-image-store.s3.amazonaws.com/0/42766/d5e65b35-3e97-2e76-4eb7-6e62f94d0ae4.png)

見るからに両方とも残して良さそうだけど、念のためdiffを確認する。

![notificationの画像配置_·_91e7b26_·_maki-tamura_ubiregi-server.png](https://qiita-image-store.s3.amazonaws.com/0/42766/2c285400-4d2a-1156-6c7c-8d550a1ef9aa.png)

このコミットは`margin-right`の指定を追加する物なので、`HEAD`に入っていた`img`の指定と両方残すのが正しい。

![dashboard_scss_-_ubiregi-server_-____src_ubiregi-server_.png](https://qiita-image-store.s3.amazonaws.com/0/42766/0e550cc3-522a-4a03-dfce-8881e764b112.png)

この状態にして`--continue`する。すると、またマージに失敗する。

![dashboard_scss_-_ubiregi-server_-____src_ubiregi-server_.png](https://qiita-image-store.s3.amazonaws.com/0/42766/8dc86389-7b1a-7167-15a7-96406715f1c4.png)

念のためdiffを確認してみよう。

![notificationの画像配置（再）_·_d022cbd_·_maki-tamura_ubiregi-server.png](https://qiita-image-store.s3.amazonaws.com/0/42766/5b718bc2-5462-254b-0ec0-5cd3442ebccc.png)

このコミットでは`margin-right`を`margin`で書き換えているので、`margin-right`を消せば良い。

さらに`--continue`すると、もう一回似たような感じでコンフリクトする。

![dashboard_scss_-_ubiregi-server_-____src_ubiregi-server_.png](https://qiita-image-store.s3.amazonaws.com/0/42766/6cb4eca7-1fd6-bb17-e21c-d64268884298.png)

これも`margin`を`17px`にするほうを残す。

最終的に、最初のdiffと違い見比べて、`img`が増えただけで`margin`の指定が同じになっていることを確認する。

# まとめ

* 衝突した部分を見比べるだけで変更が推測できるので、これは簡単な例だった
* `margin`を何度も編集している部分を一つにまとめたい (`git rebase -i`)
* 何度も同じことを繰り返した気がするけど、もしかして`git-rerere`すると幸せになれる？

## git rebase難しい問題

`git push -f`するまではいくらでもやり直しができるので、上手くいくまで3回くらいやってみれば良いと思った。あと、他人のPRをrebaseすると、自分で書いたものと違って最終形態が自明でないので、むしろ何をすれば良いかわかりやすいかもしれない（壊れたときに取り返しがつかないかもだけど）。
Google Apps ScriptでWebアプリケーションを作るときにつまづいたこと。

## 追記
`HtmlService.SandboxMode.IFRAME`が登場して、この記事の内容が古いものになっていますので、ご注意願います。


## そもそも
google apps script（以下gas）のWebアプリケーションは、Google Siteに埋め込んで使用する目的のものだ、とどこかで聞いたことがある、うん確か。
なので、「一般的なWebアプリケーションが手軽に作れる！」などと夢見て手を出すと痛い目を見ることになりますよ、的な（自戒を含めた）話。

## 単画面Webアプリケーションしか作れない
1プロジェクトに1URLなので、HTMLやUIをいくつこさえようが遷移する術がない。
擬似的に`Panel`や`<div>`を切り替えて複数画面があるかのように振舞うこと方法もあるが、コードは冗長になる。
> http://d.hatena.ne.jp/stoikheia/20130409/1365476481
-stoikheia(@3xv)の日記

## サーバー側への通信方法が限定的
`UiApp`で画面を構築するなら同期的な`Form`と`Submit`、`HtmlService`ベースでいくなら`google.script.run`を使った非同期的なものがデフォルトとなる。

## いろいろ効率悪い
`<html>`や`<head>`、`<body>`が書けないのも然ることながら、css、jsの外部化ができない。
（一応できるけど何だコレ）
> https://developers.google.com/apps-script/guides/html/best-practices?hl=ja#separate_html_css_and_javascript
HTML Service: Best Practices - Separate HTML, CSS, and JavaScript
（urlに`hl=ja`と入っていますが英語です）

## 外部ライブラリがほとんど使えない
jQueryだけは唯一まともに動くが、他のライブラリは（例えばTwitter Bootstrapなど）は限定的、もしくは全然機能しないことを覚悟しておいたほうがいい。
> https://developers.google.com/apps-script/guides/html/best-practices?hl=ja#take_advantage_of_jquery
HTML Service: Best Practices - Take advantage of jQuery
（urlに`hl=ja`と入っていますが英語です）

なお、無理矢理Twitter Bootstrapをgasに対応させたHackもある。（私は未検証）
> https://sites.google.com/site/gashackja/gas-bootstrap
Google Apps Script Hacks - GAS-Bootstrap

## デバッグしにくい（しんどい）
gasで複雑なアプリを作ることは少ないのだろうと思うが、基本的にサーバー側（gs）は、ブレークポイントを置いたステップ実行や`Logger`でログを確認しながらのデバッグとなる。
パフォーマンスの確認には実行トランスクリプトがあるが、遅いのはだいたいブラックボックス部分なため、人は諦めを覚える。

フロント側はGoogle Chromeのデベロッパーツールに頼るしかない。
cajaなのでソース見ても難読怪奇、クライアントスクリプトは`alert`使って確認するぐらいしかない。
（私が他の方法を知らないだけかも）

## その他gasやcajaの仕様に基づくもの
私が遭遇した一部を紹介したい。

* viewportを設定してスマートフォン最適化 → できない。余白を楽しみましょう。
* font awesome使って可愛らしく → できない。「x」とか「v」とか「o」とか「>>」とかでお茶を濁しましょう。
* DialogやLightboxでかっこよく → できない。不思議な位置に出現するかまったく機能しないのを、笑顔で眺めましょう。
* DropboxのJavascript Chooser APIとかで外部データを利用 → できない。まったく機能しないので無駄にボタン連打して遊びましょう。

多分、試してないだけでいろいろ制限がある。

## まとめ
一般的なWebアプリケーションは作るには制限が多すぎる。
というか、用途が違うものを無理矢理使っていることを念頭に置いて、それを忘れないようにしないといけない（反省）。
でも、その制限の中で簡易なものを作る分にはすごく便利であることに間違いはないと思う。
しかし日本語ドキュメント少ないよね！

気が向いたらTips的な記事も投稿したいと思う。気が向いたら。
TravisCI のタイムゾーンの変更


# 現象
Jekyll + Github + TravisCI の組み合わせで連携させて，master へのPRが取り込まれたらTravisCIでビルドしてGithub Pages にブログ投稿される仕組みを作ったのですが，当日の記事がbuildされないという現象に陥りました．

# 原因
どうやら travisci の timezone が日本ではないようで，TravisCI上では前日扱いでビルドしていることになったので当日の記事がビルドされていないようです．

# 解決方法
timezone を 'Asia/Tokyo' に変更する方法は次のとおりです．
.travis.yml に下記を追記します．

```
before_script:
  - echo 'Canada/Pacific' | sudo tee /etc/timezone
  - sudo dpkg-reconfigure --frontend noninteractive tzdata
```

## 参考

https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=travisci%20timezone&safe=off
[自分用] git clone https:/~ でfatal: Unable to find remote helper for 'https'が出たとき

gitのインストール時に(lib)curl-devel ライブラリを読みこめていないことが
問題らしい。必要ライブラリをインストールし、gitの再インストールが必要

gitの削除

```
$sudo yum remove git

```


必要パッケージのインストール
参照：http://git-scm.com/book/ja/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

```
$ sudo yum install curl-devel expat-devel gettext-devel   openssl-devel zlib-devel
```

ソースのダウンロード
参照： https://code.google.com/p/git-core/downloads/list

```
wget https://git-core.googlecode.com/files/git-1.8.5.3.tar.gz
```

インストール

```
$cd 解凍ディレクトリ
$./configure && make && make install
```
Titanium 3.3.0でAndroidのナビゲーションバー（タイトルバー）を消す方法


Titanium 3.3.0では，従来の方法ではAndroidのナビゲーションバーを非表示にすることができなくなっています．この記事では3.3.0でAndroidのナビゲーションバーを非表示にする方法を記述します．
#Titanium 3.3.0以前の方法
3.3.0以前ではtiapp.xmlのAndroidマニフェストに以下のコードの記述や

    <navbar-hidden>true</navbar-hidden>

非表示にするwindowに対してnavBarHidden="true"を設定することでナビゲーションバーを非表示にできましたが，3.3.0ではこれらを設定してもタイトルバーがしれっと存在してます．

#Titanium 3.3.0での非表示の方法
方法としては２つあります．１つは，アプリが起動した時にJS側でwin.activity.actionBar.hide();を呼び出す方法です．
もう一つは，Androidのナビゲーションバー非表示のカスタムテンプレートを作成して読み込ませる方法です．

##１．JavaScript側で非表示にする方法
ウィンドウが生成されたときに，hideメソッドを呼んで非表示にする方法です．以下のようにapp.js(Alloyであれはコントローラに)actionBarインスタンスのhideメソッドを呼ぶことによってウィンドウが開かれた時にときにアクションバーを非表示にさせます．

```
win.addEventListener('open', function(){
  win.activity.actionBar.hide();
});
```

##２．Androidカスタムテンプレートを作成して非表示にする方法
以下の様な階層でディレクトリを作成し，任意の名前（以下だとcustom_theme）をつけてxmlファイルを作成します．

```
cd プロジェクトフォルダ
mkdir -p platform/android/res/values
vim platform/android/res/values/custom_theme.xml
```

custom_theme.xmlは以下のように記述します．

```
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.NoActionBar" parent="@style/Theme.Titanium">
    <item name="windowActionBar">false</item>
  </style>
</resources> 
```

上で作成したカスタムテーマを読み込むためにtiapp.xmlを修正します．applicationタグで上で作成したカスタムテーマを読み込んでいます．

```
<android xmlns:android="http://schemas.android.com/apk/res/android">
  <manifest>
	<application android:theme="@style/Theme.NoActionBar"/>
	<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
  </manifest>
</android>
```
TitaniumでTableView表示



　
#####1.必要な記述について

          1.tableViewRowを記述
          2.画像の配置
          3.ラベルの配置
          4.画像、ラベルをtableViewに格納
　　　　　　　　　　　　　　　　　　　　　　　　　　　　・完成したものはこちら
　　　　　　　　　　　　　　　　　　　　　　![スクリーンショット 2014-08-28 18.03.25.png](https://qiita-image-store.s3.amazonaws.com/0/51769/0ea233fa-eea2-591b-b891-081d14b29ac7.png "スクリーンショット 2014-08-28 18.03.25.png")

　　            これを表示させることにします。
#####2.実装
　・実装した内容はこち

```
var win = Ti.UI.createWindow({
backgroundColor:'#fff'

});

var tableView;
var rowData = [];

var headerRow = Ti.UI.createTableViewRow();
headerRow.backgroundColor = '#576996';
headerRow.selectedBackgroundColor = '#385292';
headerRow.height =40;

var clickLabel = Titanium.UI.createLabel({
text:'Hello Facebook',
color:'#fff',
textAlign:'center',
font:{fontSize:24},
width:'auto',
height:'auto'
});

headerRow.className = 'header';
headerRow.add(clickLabel);
rowData.push(headerRow);

for (var c = 1; c < 50; c++){
	var row = Ti.UI.createTableViewRow();
	row.selectedBackgroundColor = '#fff';
	row.height = 100;
	row.className = 'datarow';

	var photo = Ti.UI.createView({
backgroundImage: 'images/user.png',
top: 20,
left: 10,
width: 50,
height: 50
});
photo.rowNum = c;
photo.addEventListener('click', function() {
		alert('Hello World');	
		});
row.add(photo);

var user = Ti.UI.createLabel({
color:'#576996',
font:{fontSize:16, fontWeight:'bold', fontFamily:'Arial'},
left:70,
top:2,
height:30,
width:200,
text:'Kanno Yuma' + c
});
user.rowNum = c;
user.addEventListener('click', function(){
		alert('OK!');
		});
row.add(user);

var comment = Ti.UI.createLabel({
color:'#222',
font:{fontSize:16,fontWeight:'normal', fontFamily:'Arial'},
left:70,
top:21,
height:50,
width:200,
text:'ckckckckckcckkckckckckckckckckckckck'
});
row.add(comment);

var calendar = Ti.UI.createView({
backgroundImage:'images/image.png',
bottom:2,
left:70,
width:32,
height:32
});
calendar.rowNum = c;
calendar.addEventListener('click', function(){
		alert('image');
		});
row.add(calendar);

var button = Ti.UI.createView({
backgroundImage:'images/droplet.png',
top:35,
right:5,
width:36,
height:34
});
button.rowNum = c;
button.addEventListener('click', function(){
		alert('NO!');
		});
row.add(button);
rowData.push(row);
}

tableView = Ti.UI.createTableView({
data: rowData
});
win.add(tableView);
```

                                                       
　・ポイントは、for文を使用し、var rowData = [];　に２に書いた実装段階の１、２、３をpushさせることです。for文でtableViewRowを増やし、[]に格納することでtableViewに加えることができます。
dockerodeからポートフォワードを指定してコンテナを起動する

node.jsからDockerのRemote APIをいじくるラッパーとして使っている[dockerode](https://github.com/apocas/dockerode)

コンテナの3000番ポートをホスト側の30000番ポートにマップしてnginxでリバースプロキシかませて外から見たいなと思ったので調べてみた。

ドキュメントにはcreateOptionやstartOptionを指定してね、と書いてあるけどdockerode自体のドキュメントにはそれは書いてなさげ。
[本体のドキュメント](http://docs.docker.com/reference/api/docker_remote_api/#full-documentation)を見て色々いじってみて、とりあえずこうすればいいのかなというのは見えてきた。

```js
var Docker = require('dockerode');

var docker = new Docker({socketPath: '/var/run/docker.sock'});

docker.run(
	'イメージ名',
	['コンテナ', '起動で', '動かす', 'コマンド'],
	process.stdout,
	{
		'ExposedPorts': {'3000/tcp': {}}
	},
	{
		'PortBindings': {'3000/tcp': [{'HostPort': '30000'}]}
	},
	function (err, data, container) {
		//	起動するとここに来る
	}
);

```
コールバック関数の前にある2つのハッシュでそれぞれ

* コンテナ作成時にTCPの3000番ポートを開ける
* TCPの3000番ポートをホスト側の30000番ポートにマップする

という指定をしてあげればいいらしい
GyazoのURLから画像本体のURLをもらう

画像URLに `/raw` とつけると画像本体のURLにリダイレクトしてくれます

http://gyazo.com/f6df71edb5b7f7e2419fe26d9751d943/raw

たとえば、上のURLを叩くと下の画像URLにリダイレクトされます
https://i.gyazo.com/f6df71edb5b7f7e2419fe26d9751d943.gif

これはHipchatなどで画像を展開するのに便利です。`hubot-gyazo`というhubot moduleではこのAPIを利用しています

``` coffee
msg.send "#{url}/raw#.png" for url in urls
```

https://github.com/uiureo/hubot-gyazo/blob/master/scripts/expand.coffee#L24
aws-cliの設定ファイルをruby aws-sdkから使う

[AWSコマンドラインインタフェース](http://aws.amazon.com/jp/cli/)で `access_key_id` や `secret_access_key` を設定すると `~/.aws/config` というファイルが生成される。

[AWS SDK for Ruby](http://aws.amazon.com/jp/sdkforruby/) からこれを使って認証を行うには `SharedCredentialFileProvider` を使う。このファイルには `region` についての情報も含まれるが、渡されないので改めて明示的に書く必要があるので注意。

```rb
require 'aws-sdk'

path = File.expand_path('~/.aws/config')
provider = AWS::Core::CredentialProviders::SharedCredentialFileProvider.new(path: path)
AWS.config(credential_provider: provider, region: 'ap-northeast-1')
```
jQueryでセルの値によって背景を変更

*テーブルのセルの値によって、セルの色を変更させる。
sinatraより判定式の値を受け取るため、find内は最初に宣言しておく。*

```lang:index.erb
<script type="text/javascript">
var Obj_x1 = 'td.dval-x:myLG(>' + <%= @x1 %> +')';
var Obj_y1 = 'td.dval-y:myLG(>' + <%= @y2 %> +')';
var Obj_z1 = 'td.dval-z:myLG(>' + <%= @z3 %> +')';

jQuery(function($){
	$('#mainTBL')
	.find(Obj_x1).css('background','gold').end()
	.find(Obj_y1).css('background','coral').end()
	.find(Obj_z1).css('background','red').end()
	});
}

jQuery.extend(jQuery.expr[":"], {
	myLG  : function(a,i,m){ 
		var b = Number(
			(a.textContent||a.innerText||jQuery(a).text()||"")
			.replace(/,/g,'')
		);
		return typeof b=='number'? eval(b+m[3]):false;
	}
});
</script>
```

参照）[jQueryのセレクタを自作してみる](http://allabout.co.jp/gm/gc/24199/3/)
Goでテンポラリなオブジェクトを再利用してGCを減らす方法

Goでは一応エスケープ解析をしていて、小さな値はnewで割り当ててもリテラルの構造体として書いても、スタックに割り付けることが可能ならスタックに割り付けることになっている。

スタックは関数呼び出しがリターンすると捨てられる（ゴミ扱いになる）領域なので、値をそこに割り当てるのは、ヒープに割り当てるのに比べて大変効率が良い。割り当てるのも速いし、GCがあとで回収する手間もかからない。

（ただしそういう値が関数からリターンした後に参照されては困るので、そういう値へのポインタなどが関数から逃げ出さないことをコンパイル時に静的に検証している ―― それがエスケープ解析。）

しかし大きな値（数百バイト〜）は、エスケープしないとしてもヒープに割り当てられてしまう。そうでなければスタックが成長しすぎて、それはそれでまた問題になるからだ。

頻繁に呼び出される関数で大きな値をテンポラリに使っていると、GCで回収されるゴミがどんどん発生してしまって、GCの負荷が大きくなってしまう。可能であれば前回割り当てた値を再利用して、あまりメモリをアロケートしないようにしたいところだ。

## チャネルをバッファとして使う方法

一つのやり方は、チャネルを使用済みの値の入れ物として利用する方法だ。チャネルから値を取り出すことができれば、それを使えばいいし、取り出すことができなければ、仕方ないからnewしてその値を使えばよい。

```go
// *T型の値を最大で1個保存しておくチャネル
c := make(*T, 1)

// T型の値を使いたいときはまずチャネルを見て利用できる値があるかを確認
var x *T
select {
case x = <-c:
    // 前回使った値が取得できた。xは前の値のままなのでここで0クリアしておく
    x.f1 = 0
    x.f2 = 0
default:
    // 前回使った値が取得できなかった。新たにアロケートする。
    x = new(T)    
}

// 使い終わったら元に戻す。チャネルが一杯でもブロックしたくないのでselectを使う。
select {
case c <- x:
default:
}
```

## sync.Poolを使う

チャネルを使った方法を更に洗練させて、実行効率を向上させたのが、sync.Poolだ。使い方はドキュメントを呼んでもらうのが早いが、基本的なアイデアはチャネルを使うのと変わらない。
jQueryによる自動更新

*イベント処理を行わずに、テーブルの値を定期的に自動更新させる。*
定期的にpostもしくはgetリクエストを送信してくれるjQueryプラグイン（PeriodicalUpdater）を使用。[ダウンロード](https://github.com/RobertFischer/JQuery-PeriodicalUpdater)

```lang:index.erb
<script src="js/jquery.periodicalupdater.js"></script>
<script type="text/javascript">
jQuery(function ($) {
    $.PeriodicalUpdater('./json',{
    //  オプション設定
        method: 'get',		// 送信リクエストURL
        minTimeout: 10000,	// 送信インターバル(ミリ秒)
	    type: 'json',		// xml、json、scriptもしくはhtml (jquery.getやjquery.postのdataType)
    	multiplier:1,		// リクエスト間隔の変更
	    maxCalls: 0			//　リクエスト回数（0：制限なし）
    },
    function (data){
    	//dataは上記URLから引き渡され、変更があったか自動で判別される。
    	//dataに変更があった場合のみ実行
    	//alert(data);
    	MyFunc2(data);	//セルに値を代入
    	MyFunc1();		//セルの色付け
    });
});

//セルにデータを代入
function MyFunc2(data){
	var tr = $("table tbody tr");//全行を取得

	for(var i=0, l=tr.length; i<l; i=i+2){
		var cells = tr.eq(i).children();//1行目から順にth、td問わず列を取得
		//セルに代入
		cells.eq(0).text(data[i].time);
		cells.eq(1).text(data[i].res1);
		cells.eq(2).text(data[i].res2);
		cells.eq(3).text(data[i].res3);
		cells.eq(4).text(data[i].res4);
		cells.eq(5).text(data[i].res5);
		cells.eq(6).text(data[i].res6);
	}
}
```
```lang:app.rb
get '/json' do
  sensors = Sensor.select('time, res1,res2,res3,res4,res5,res6'
                          ).order("time DESC").to_json
end
```

 自動更新するプラグインには、new Ajax.PeriodicalUpdater(container, url[, options])もあるが、onSuccessの時にjQueryを実行できなかった･･･。