OmniAICreator/Qiita-1.07M huggingface dataset:
ExtJSをつかったDOMの操作方法(入門編)

この記事は [Sencha Advent Calendar 2013](http://www.adventar.org/calendars/1370) 19日目の記事です。

今回は、ExtJSをつかったDOMの操作方法の出だしの部分について書きます。

##はじめに

本記事の内容は[こちら](http://jsfiddle.net/Y5v2M/)で試すことができます。

##DOMとは・・・

DOMは、Document Object Model のことで、HTMLの要素（aタグや、divタグなど)に対して
操作するための仕組み(API)のことです。

DOMを使うことで、javascriptからリンクURLを書き換えたり、スタイルの変更をしたり、
構造をまるっと入れ替えることすらできます。

さて、ExtJSでDOM操作をすることができるクラスメソッドにはどんな物があるでしょうか。

簡単に紹介していきます。

###素のjavascriptの場合

素のjavascriptでは`document.getElementById`メソッドを呼ぶことで、element オブジェクト
を取得できます。
長いですね・・・。


###Ext.getメソッド

このメソッドの引数にidを指定して呼び出すことで、エレメントを取得することができます。

Ext.getメソッドは、スタティックメソッドなのでそのまま呼ぶことができます。

id=piyo01のエレメントに、hogehogeクラスを付加する使用例を以下に示します。

```hoge.js
var hoge = Ext.get('piyo01');
hoge.addCls('hogehoge');
```

###Ext.flyメソッド

このメソッドもidを指定して呼び出すことで、エレメントを取得することができます。

Ext.flyメソッドも、Ext.get同様に、スタティックメソッドなのでそのまま呼ぶことができます。

id=piyo01のエレメントに、hogehogeクラスを付加する使用例を以下に示します。

```fuga.js
var hoge = Ext.fly('piyo01');
hoge.addCls('hogehoge');
```

ここまで見た限りではこの二つのメソッドに、違いが無いように見えます。

しかしそんなことはありません。

では、その違いは何なのか・・・。

ということで、以下の例をご覧ください。

```例1.js
var hoge = Ext.get('piyo01');
hoge.addCls('hogehoge');
var fuga= Ext.get('piyo02');
hoge.addCls('hogehoge');

hoge.hide();
fuga.hide();

hoge.show()
fuga.show()
```

```例2.js
var hoge = Ext.fly('piyo01');
hoge.addCls('hogehoge');
var fuga= Ext.fly('piyo02');
hoge.addCls('hogehoge');

hoge.hide();
fuga.hide();

hoge.show();
fuga.show();

```

さて、例1では、piyo01,piyo02の表示非表示が切り替わりますが、
例2ではpiyo01の表示非表示が切り替わらないはずです。

なぜこうなってしまうかというと、
Ext.getはExt.Elementオブジェクトが返すのに対して、
Ext.flyではExt.dom.Element.Flyオブジェクトが返されるためです。

Ext.dom.Element.Flyオブジェクトは、flyweight であるため、
領域が再利用されるのです。

使い分けとしては、ワンライナーなど、その場限りのDOM操作にはfly、
後で取得したオブジェクトを再利用したい場合にはgetを使います。

特に、メモリ使用量を節約したいモバイルではメモリ使用量が抑えられるflyを多用することになるでしょう。


##最後に

今日紹介したメソッドはほんの入り口に過ぎません。
Ext　JSにはほかにも数多くのDom操作エレメントがありますので、是非使いこなしてみてください。

##リンク
[document.getElementById](https://developer.mozilla.org/ja/docs/Web/API/document.getElementById)
[Ext.dom.Element](http://docs.sencha.com/extjs/4.2.2/#!/api/Ext.dom.Element)
[Ext.get](http://docs.sencha.com/extjs/4.2.2/#!/api/Ext-method-get)
[Ext.fly](http://docs.sencha.com/extjs/4.2.2/#!/api/Ext-method-fly)

---
つぎは、yasutomogさんです。
PM2をサービスに登録してnodejsサーバーの自動起動をする(centos6.x)

とりあえず再起動時に自動起動させたい人向けの記事です

# PM2をインストールする
```
sudo npm install pm2 -g
```

# initスクリプトの作成とサービスの登録をする
```
sudo pm2 startup centos
```
（このコマンドを実行すると/etc/init.d/pm2-init.shが作成され各runlevelにリンクが張られる）

# PM2にスクリプトを登録して状態を保存する

```
sudo pm2 start app.js
```

# 確認
再起動して自動起動しているか確認する

```
reboot
-----
pm2 list
```

以下のログが出て起動しなかったなら

```sh:/var/log/boot.log
sudo: sorry, you must have a tty to run sudo
```

sudoの設定を変更する

```sh:visudo
# ↓をコメントアウトする
Defaults    requiretty
```
Git + GitBucketの使い方

# リポジトリを作ろう

先日，GitBucketのインストール方法について投稿しましたので，今回は新しいリポジトリを作って，ファイルを追加→GitBucketにpushまでのやり方を説明します．なお，対象とするGitBucketは1.8です．また，手元のコンピュータにはgitコマンドがインストールされているものとします．

## 初期設定

まずは氏名やメールアドレスを登録します．以下は単なる例なので，氏名とメールアドレスは自分のものをご利用ください．

```sh
# ローカルコンピュータで
$ git config --global user.name "Masuo Fuguta"
$ git config --global user.email fuguta@umiyama-shouji.co.jp
```

## GitBucketにリポジトリを作る

1. GitBucketにログインして，「new repository」をクリックする．
2. 「Repository name:」にリポジトリ名を入力し，PublicかPrivateのうち，公開ルールを選択する．「Initialize this repository with a README」のチェックは入れておくことを勧めます．そして，「Create repository」をクリックします．
3. 画面下半分にタイトルだけのREADME.mdが表示され，その上にファイル一覧，右上にリポジトリのURLが表示される．リポジトリのURLは次で使うのでコピー（control-Cやcommand-C）しておきます．

## ローカルコンピュータにリポジトリをコピーする

git cloneでリポジトリをコピーします．

```sh
# ローカルコンピュータで
$ git clone <先ほどのURL>
$ cd <リポジトリ名>
```

## .gitignoreを作成する

gitで管理したくないファイルが存在します．例えばJava言語を取り扱うプロジェクトであれば，必要なのは.javaファイルであり，.classファイルは不要です．また，MacOS Xを利用していると，不要な「.DS_Store」を作られたりします．エディタの作成するバックアップファイル「ファイル名~」や「ファイル名.bak」も要りません．このようなファイルを無視するための設定ファイル「.gitignore」を作成します．

.gitignoreの書式は難しくありませんが，手っ取り早くWebサービスを利用しましょう．Webブラウザで[gitignore.io](http://gitignore.io)にアクセスして，空欄にOS名や言語名を入力します．入力が済んだら「Generate」をクリックすると内容が表示されるので，コピー＆ペーストして.gitignoreを作成してください．

このファイルは，リポジトリ名のディレクトリ内に配置してください．ここまでの作業により，ディレクトリ内は以下のようになっているはずです．

```sh
$ ls -a
./  ../  .git/  .gitignore  README.md
```

## addする

ここまでで事前準備が終わったので，早速ファイルを作成しましょう．すでに管理したいファイルが有るのであればこのディレクトリにコピーしましょう．

例として，Foo.javaを追加し，コンパイルした様子を示します．

```sh
$ ls -a
./  ../  .git/  .gitignore  Foo.class  Foo.java  README.md
```

それではgit addを用いてFoo.javaを管理対象にします．

    $ git add Foo.java

管理対象にするファイルが幾つもある場合には以下のようにして一気に追加することも可能です．

    $ git add .

## コミットする

ここまでの作業では，まだこれらのファイルはリポジトリに登録されていません．登録するためのコマンドはgit commitです．また，コミットにはコメントが必要です．

git commitをそのまま実行するとエディタが開いて，その中でコメントを記入しなければならず苦痛ですので，以下のように実行することを勧めます．

```sh
$ git commit -a -m 'Foo.javaを追加'
[master (root-commit) b8a6688] Foo.javaを追加
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 Foo.java
```

以上でリポジトリに登録されました．メッセージを見ると「1 file changed」と，Foo.javaが追加されたことを確認できます．

## pushする

ここまでの作業により，「ローカル」リポジトリにファイルが登録されました．次に，GitBucketにアップロードして，公開しましょう．アップロードにはgit pushを使います．また，GitBucketに登録していあるID，Passwordの入力が必要です．

```sh
$ git push
Username for 'http://git.umiyama-shouji.co.jp/gitbucket': fuguta
Password for 'http://fuguta@umiyama-shouji.co.jp' : *****
```

## IDとパスワードを記憶させる

毎回IDとパスワードを入力するのも疲れる，と言う人は，~/.netrcに書いておくことで回避できます．なお，~/.netrcには生のパスワードが書かれているので，パーミッションは600にして他人から見られないようにしてください．

```sh
$ cd
$ cat > .netrc
machine git.umiyama-shouji.co.jp
login fuguta
password sazae24tarao3　　　←適切に変更してください
^D
$ chmod 600 .netrc
```

これで，IDとパスワード入力から逃れられます．くれぐれも席を外している間に友人らに.netrcを読まれるとか，いたずらpushされないよう，お気をつけ下さい．

後は基本的にファイル編集→git commit→git pushの繰り返しです．ファイルを追加した場合にはgit add .を忘れないよう注意してください．
JSPでコンテキストパスを取得する方法

これ以外でいい方法はやはりないのだろうか…（長い)

```jsp
<s:property value="#request['javax.servlet.forward.context_path']"/>
```

例えばインポートするCSS定義は次のようになります。

```jsp
<link rel="stylesheet" type="text/css" 
  href="<s:property value="#request['javax.servlet.forward.context_path']"/>/css/common.css">
```
mitmproxyを使う

MacでiPhoneの通信内容を見たい場合に便利。

## 公式サイトからmitmproxyをインストール

```bash
$ (sudo) pip install mitmproxy
```

ちなみにpipがない場合はeasy_installでpipをインストール。

```bash
$ sudo easy_install pip
```

## iPhoneに証明書を送る

証明書は$HOME/mitmproxy以下のmitmproxy-ca-cert.pemにあるのでメールでiPhoneに送信。

## iPhoneにmitmproxyをインストール

iPhoneメールで添付されたmitmproxy-ca-cert.pemを叩く

## プロキシを設定する

iPhoneのWi-Fi設定からHTTPプロキシを設定する

サーバ　192.168.2.1
ポート　8080

## Macでmitmproxyを起動してiPhoneでゴニョゴニョ

```bash
$ mitmproxy
```

iPhoneでSafariやアプリ立ち上げると通信がログに流れてくる＼(^o^)／

## 参考サイト

http://mitmproxy.org/
http://qiita.com/yimajo/items/c67cb711851f747c35e5
バス代(2013.4.6の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの19日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord9busfare/ にあります。

```hs
module Doukaku.Bus (solve) where
import Data.List (sort)
import Data.List.Split (splitOn)

roundup :: Int -> Int
roundup n = ((n + 9) `div` 10) * 10

solve :: String -> String
solve input = show $ adultsFee + childrenFee + infantsFee
  where
    (base', _:people') = break (== ':') input
    base = read base'
    people = splitOn "," people'
    adults = filter ((== 'A') . head) people
    children = filter ((== 'C') . head) people
    infants' = filter ((== 'I') . head) people
    infants = drop (length adults * 2) . map snd . reverse . sort .
              zip (map (flip rate 100) infants') $ infants'
    adultsFee = sum . map (roundup . flip rate base) $ adults
    childrenFee = sum . map (roundup . (`div` 2) . flip rate base) $ children
    infantsFee = sum . map (roundup . (`div` 2) . flip rate base) $ infants

rate :: String -> (Int -> Int)
rate (_:'n':_) = id
rate (_:'p':_) = const 0
rate (_:'w':_) = (`div` 2)
```

大人、幼児、子供に分けてそれぞれ料金を計算しました。幼児(`infants'`)は金額が高い順に並べて、無料にできる人数分だけ削っています。

http://qiita.com/Nabetani/items/84255ac417ef25069a3b に他の方の回答もありますので、見ると参考になるでしょう。
Array#sort実装のshuffleは偏る

## シャッフル実装
[Fisher-Yatesアルゴリズム](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)で実装された`goodShuffle`と巷で見つけたsort実装の`badShuffle`を5個用意。

```js
var goodShuffle = function (arr) {
  var i, j, temp;
  arr = arr.slice();
  i = arr.length;
  if (i === 0) {
    return arr;
  }
  while (--i) {
    j = Math.floor(Math.random() * (i + 1));
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
  return arr;
};

var badShuffle1 = function (arr) {
  return arr.slice().sort(function () {
    return Math.round(Math.random() * 2) - 1;
  });
};

var badShuffle2 = function (arr) {
  return arr.slice().sort(function () {
    return Math.round(Math.random());
  });
};

var badShuffle3 = function (arr) {
  return arr.slice().sort(function () {
    return Math.random() - Math.random();
  });
};

var badShuffle4 = function (arr) {
  return arr.slice().sort(function () {
    return parseInt(Math.random() * 3, 10) - 1;
  });
};

var badShuffle5 = function (arr) {
  return arr.slice().sort(function () {
    if (Math.random() > 0.5) {
      return 1;
    } else {
      return -1;
    }
  });
};
```

## 均等に分布しているかを調べるメソッドを実装
同じ配列に対してシャッフルし、何番目に配置されたかを記録。1000回繰り返して平均を出すプログラムを実装。10個の要素をシャッフルするので、全ての要素でこの値が4.5に近ければ均等にシャッフルされたことになる。

```js
var array = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'];
var times = 1000;
var trial = function (shuffle) {
  var arr, average, elem, i, j, len;
  average = {};
  for (i = 0, len = array.length; i < len; i++) {
    average[array[i]] = 0;
  }
  i = times;
  while (i--) {
    arr = shuffle(array);
    for (j = 0, len = arr.length; j < len; j++) {
      elem = arr[j];
      average[elem] += j;
    }
  }
  for (elem in average) {
    average[elem] /= times;
  }
  return average;
};
```

## 結果

### Fisher-Yatesアルゴリズム

4.5近辺なので均等に混ざっているといえる。

```js
console.log(trial(goodShuffle));
{ A: 4.579,
  B: 4.358,
  C: 4.487,
  D: 4.575,
  E: 4.541,
  F: 4.341,
  G: 4.522,
  H: 4.519,
  I: 4.646,
  J: 4.432 }
```

### Array#sort実装

元のインデックスに沿って並ぶので全然混ざらない。

```js
console.log(trial(badShuffle1));
{ A: 0.38,
  B: 1.16,
  C: 2.023,
  D: 2.985,
  E: 3.949,
  F: 5.01,
  G: 6.013,
  H: 6.915,
  I: 7.896,
  J: 8.669 }
```
```js
console.log(trial(badShuffle2));
{ A: 1.539,
  B: 1.55,
  C: 2.288,
  D: 3.108,
  E: 4.079,
  F: 4.876,
  G: 5.665,
  H: 6.565,
  I: 7.314,
  J: 8.016 }
```
```js
console.log(trial(badShuffle3));
{ A: 1.65,
  B: 1.674,
  C: 2.255,
  D: 3.123,
  E: 4.014,
  F: 4.788,
  G: 5.748,
  H: 6.471,
  I: 7.327,
  J: 7.95 }
```
```js
console.log(trial(badShuffle4));
{ A: 0.724,
  B: 1.155,
  C: 2.119,
  D: 2.929,
  E: 3.967,
  F: 4.991,
  G: 5.949,
  H: 6.956,
  I: 7.707,
  J: 8.503 }
```
```js
console.log(trial(badShuffle5));
{ A: 1.624,
  B: 1.653,
  C: 2.117,
  D: 3.068,
  E: 3.899,
  F: 4.94,
  G: 5.779,
  H: 6.625,
  I: 7.296,
  J: 7.999 }
```

## 結論

[Fisher-Yatesアルゴリズム](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)を使おう。

## 関連

- [Array.sort() should not be used to shuffle an array | Lambda](http://sroucheray.org/blog/2009/11/array-sort-should-not-be-used-to-shuffle-an-array/)
- [Will It Shuffle?](http://bost.ocks.org/mike/shuffle/compare.html)
UIActivityViewControllerのBuilt-in アクティビティを色々試したのでメモっとく



[iOS Dveloper Library ：UIActivity Class Reference](https://developer.apple.com/library/IOS/documentation/UIKit/Reference/UIActivity_Class/Reference/Reference.html#//apple_ref/occ/instm/UIActivity/activityType)

#Built-in アクティビティのタイプのストリング定数
パッと見なんのこっちゃ分からないものも含まれているので、簡単にメモっとく。

```objectivec
// facebook：画像はFB側のアルバムに登録されるため復数指定も可。
// テキスト復数は連結。
// NSURLと画像が含まれている場合、画像投稿と見なされURLはテキストリンクで文中に
NSString *const UIActivityTypePostToFacebook;

// Twitter：画像は１枚のみ。
NSString *const UIActivityTypePostToTwitter;

// weibo：試してない
NSString *const UIActivityTypePostToWeibo;

// デフォで入ってるメッセージアプリリ：画像・テキスト・URLそれぞれ復数でもまとめて送れる
NSString *const UIActivityTypeMessage;

// デフォで入ってるMailアプリ：画像・テキスト・URLそれぞれ復数でもまとめて送れる
NSString *const UIActivityTypeMail;

// プリントアウト：画像のみ。復数可能で１枚ずつ出力される。小さい画像も用紙サイズに引き伸ばされた。。
NSString *const UIActivityTypePrint;

// リップボードにコピー：テキストのみ、画像はコピー出来ない
NSString *const UIActivityTypeCopyToPasteboard;

// 画像をアドレス帖のアバターに登録
NSString *const UIActivityTypeAssignToContact;

// 画像がアルバムに保存される：復数可
NSString *const UIActivityTypeSaveToCameraRoll;

// Safariのリーディングリストに追加。NSURLが含まれている場合のみ
NSString *const UIActivityTypeAddToReadingList;

// Frickr：試してない
NSString *const UIActivityTypePostToFlickr;

// Vimeo：試してない、youtubeも欲しい
NSString *const UIActivityTypePostToVimeo;

// Weiboがやってるマイクロブログ：試してない
NSString *const UIActivityTypePostToTencentWeibo;

// Airdrop：URL,画像,テキスト。
// 復数指定可能（txtx,txt,img または url, url, txt）でテキストの優先順位は低い。
// 画像とURLが混在していると"cannot receive"となる
NSString *const UIActivityTypeAirDrop;
```

#除外したい機能またはアプリに該当する定数を配列にして、excludedActivityTypesへ代入

```objectivec

// UIActivityViewControllerへ渡したいブツを、配列にしとく
NSArray *items = @[hoge_txt, hoge_img, hoge_url];

// 上記の配列と一緒に、UIActivityViewControllerのインスタンスを作成
UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];

// 除外したい機能またはアプリを指定する
avc.excludedActivityTypes =  @[
                                
    // facebook：画像はFB側のアルバムに登録されるため復数指定も可。
    // テキスト復数は連結。
    // NSURLと画像が含まれている場合、画像投稿と見なされURLはテキストリンクで文中に
    UIActivityTypePostToFacebook,
    
    // Twitter：画像は１枚のみ。テキスト復数は連結。URLは無視される。
    UIActivityTypePostToTwitter,
    
    // weibo
    UIActivityTypePostToWeibo,
    
    // デフォで入ってるメッセージ
    UIActivityTypeMessage,
    
    // デフォで入ってるMail
    UIActivityTypeMail,
    
    // テキストをクリップボードにコピー、画像はコピー出来ない
    UIActivityTypeCopyToPasteboard,
    
    // アドレス帖が起動、選択した人のアバター登録、テキストのみの場合アイコン出ない
    UIActivityTypeAssignToContact,
    
    // 画像がアルバムに保存される、テキストのみの場合アイコン出ない
    UIActivityTypeSaveToCameraRoll,
    
    // Safariのリーディングリストに追加。NSURLが含まれている場合のみ
    UIActivityTypeAddToReadingList,
    
    // Frickr：試してない
    UIActivityTypePostToFlickr,
    
    // Vimeo：試してない
    UIActivityTypePostToVimeo,
    
    // Weiboがやってるマイクロブログ
    UIActivityTypePostToTencentWeibo,
    
    // Airdrop：URL,画像,テキスト。
    // 復数指定可能（txtx,txt,img または url, url, txt）でテキストの優先順位は低い。
    // 画像とURLが混在していると"cannot receive"となり送れない
    UIActivityTypeAirDrop
];

// UIActivityViewControllerを表示ドーン！
[self presentViewController:avc animated:YES completion:nil];
```
form用正規表現判定/備忘

formのバリデーション作成用の正規表現判定


###数字の場合
全て数値（全角）

```
/^[０-９]+$/
```


全て数値（半角）

```
/^[0-9]+$/
```

全て数値（全角,半角）

```
/^[0-9０-９]+$/
```

全て全角数値（マイナス、小数点）

```
/^[ー]?[０-９]+(\．[０-９]+)?$/
```

全て半角数値（マイナス、小数点）

```
/^[-]?[0-9]+(\.[0-9]+)?$/
```


###文字の場合

半角アルファベット（小文字）

```
/^[a-z]+$/
```

半角アルファベット（大文字）

```
 /^[A-Z]+$/
```

半角アルファベット（大文字・小文字）

```
 /^[a-zA-Z]+$/
```

半角アルファベット（小文字・数値）

```
/^[a-z0-9]+$/
```

半角アルファベット（大文字・数値）

```
/^[A-Z0-9]+$/
```

半角アルファベット（大文字・小文字・数値）

```
 /^[a-zA-Z0-9]+$/
```

全角ひらがな

```
/^[ぁ-ん]+$/
```

全角カタカナ

```
/^([ァ-ン]|ー)+$/
```

全角ひらがな、カタカナ

```
/^[ぁ-んァ-ンー]+$/
```

半角カナ

```
/^[ｧ-ﾝﾞﾟ]+$/
```

漢字

```
/^[一-龥]+$/
```

全角ひらがな、漢字

```
/^[一-龥ぁ-ん]/
```


全角ひらがな、全角カタカナ、漢字

```
/^[ぁ-んァ-ン一-龥]/
```


###e-mailの場合

```
 /^\S+@\S+\.\S+$/
```


###URL

```
/^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/
```


###電話番号の場合

電話番号(ハイフンなし10桁)

```
/^\d{10}$/
```

携帯番号(ハイフンなし11桁)

```
/^\d{11}$/
```

携帯番号(ハイフンなし10桁or11桁)

```
/^\d{10}$|^\d{11}$/
```


###クレジットの場合

クレジットカード(VISA,Master,Diners,Discover,Amex対応)

```
/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$/
```


###郵便番号の場合

郵便番号（ハイフンあり3桁・5桁・7桁）

```
/^\d{3}[-]\d{4}$|^\d{3}[-]\d{2}$|^\d{3}$/
```

郵便番号（ハイフンあり5桁）

```
/^\d{3}[-]\d{2}$/
```

郵便番号（ハイフンあり7桁）

```
/^\d{3}[-]\d{4}$/
```

郵便番号（ハイフンなし3桁）

```
/^\d{3}$/
```

郵便番号（ハイフンなし5桁）

```
/^\d{5}$/
```



郵便番号（ハイフンなし7桁）


```
/^\d{7}$/
```


郵便番号（ハイフンあり・なし両方）

```
/^\d{3}[-]\d{4}$|^\d{3}[-]\d{2}$|^\d{3}$|^\d{5}$|^\d{7}$/
```
Paperclipのファイル格納フォルダ名に日付をつけました

Paperclip（ https://github.com/thoughtbot/paperclip ） を利用しファイルのアップロードをやってます。

ファイルの格納先フォルダにクラス名とかIDとかが利用できますが、やっぱり日付をつければ分かりやすく、なしにもファイルの管理ができます。

**has_attached_file**`に使えるinterpolationはhttps://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/interpolations.rb に詳しく乗っていますので、ご参考ください。

まずは日付を含むInterpolationsを作りましょう。

```rb
# file path: RAILS_ROOT/config/paperclip.rb（ここじゃくてもよいです。）
Paperclip.interpolates :ymd_path do |attachment, style|
  attachment.instance.avatar_updated_at.utc.strftime "%Y/%m/%d"
end
```

これで新たに:ymd_pathを定義しました。

次はModelの中に：

```rb
has_attached_file :data,
                    :url  => "/pictures/:ymd_path/:id/:style_:basename.:extension",
                    :path => "pictures/:ymd_path/:id/:style_:basename.:extension",
```


これで**pictures/2013/12/19/7/content_recent-happening.png**のようなファイルが作られます。
Light Tableの使い方 (序章)

ちょっと前にkickstarterで20万ドルを集めて話題となったLight TableというIDEですが、順調に開発が進んでいてClojureアプリの開発に十分使えるレベルになっています。

http://www.lighttable.com

完成したあかつきには、どういうライセンス体系になるのか不明ですが、現状は「Try the alpha」という位置づけで、自由に試してみることができます。

上記サイトから、Mac OSX、Windiws、Linux それぞれパッケージがあるのでダウンロードしてインストールします。
![SnapCrab_Light Table_2013-12-19_18-17-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/028bd544-3a97-3f30-6a78-80bc52c8ef1f.png)

起動するとオシャレ感ただようウィンドウが開きますが、Clojureのコードを動かすために、バックエンドでJarファイルを取りに行ったりするので、プロキシ環境下で使う場合には、環境変数http_proxyとhttps_proxyを設定しておくとよいかと思います。

Clojureを試してみたい場合には、メニューのView -> Commands を選択して、コマンドパネルを開き、「instarepl」とタイプします。そして「Instarepl: Open a clojure instarepl」というコマンドを選択します。

![SnapCrab_Light Table_2013-12-19_18-18-3_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/8a25b310-034d-82d9-28ac-1de007492687.png)

これでInstareplのタブが開きます。

InstareplはClojureの対話的な実行環境です。役割的には、Emacsの*scratch*と似ていますが、Light Tableは編集すると即座にInstarepl内のすべてのコードを再評価するLiveモードというものがあります。

試してみましょう。

ただの足し算、 (+ 1 2 4) をタイプしてみます。

![SnapCrab_NoName_2013-12-19_18-14-38_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/48c56ec4-9728-727c-125d-457d75e6fc5d.png)

![SnapCrab_NoName_2013-12-19_18-15-2_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/6069fd54-e667-bc16-20f7-0d288b7253d4.png)

![SnapCrab_NoName_2013-12-19_18-15-12_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/1b080183-35c9-5554-cef1-4be6452fe005.png)

とタイプしていくと同時に右側に評価された値が出ます。コンパイルが速いClojureだから実現できる機能ですね。

全部が再評価されるというものを試すために、まず適当な変数を使ったコードを入力します。
![SnapCrab_NoName_2013-12-19_18-15-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/847e4dc8-1775-fd3d-d447-edda6e789635.png)

宣言がないので当然エラーになります。
そこで、宣言を追加してみると…その瞬間に

![SnapCrab_NoName_2013-12-19_18-15-57_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/b405dbdc-e736-bf1a-d972-31fee0a59af4.png)

再評価されて結果が表示されます。

関数の使い方がわからなくなったら、ドキュメントも見ることができます。
コマンドウィンドウを開いて、docとタイプし「Docs: Toggle documentation at cursor」を選択すると、このようにドキュメントが表示されます。

![SnapCrab_NoName_2013-12-19_18-19-52_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8475/8de58ece-4fe3-9686-d79c-6f3fae640061.png)

コマンドはショートカットキーを割り当てることができるので、そうしておけば簡単にドキュメント見ながら、Instareplで実行結果も即座に確認しながら、コードを書くというちょっと新感覚な体験ができると思います。
oil コマンド


忘れがちなので備忘録的に。


##モデル生成

```php
oil g model model_name field_name1:type field_name2:type field_name3:type
```
idとcreated_at,updated_atは自動的に生成されます。


##コントローラー生成

```php
oil g controller controller_name action1 action2 action3
```

##DBにフィールド追加

```php
oil g migration add_'フィールド名'_to_'モデル名' field:type
```


##モデルをDBにマイグレート

```php
oil r migrate
```
migrateファイルを元にDB構造を生成。


```php
oil r migrate:current
```
現在のバージョンのmigrateファイルを元に、データベースを更新。

```php
oil r migrate --version=2
```
指定したバージョンのmigrateファイルを元に、データベースを更新。
GinnieからGitExtensionsを起動しコミットするスクリプト

表題の通りです。GinnieからGitExtensionsを直接起動できるスクリプトを作ってみました。コレさえあれば、リポジトリ下のファイルを編集中にワンタッチでファイルをコミットできます。
# スクリプト

```js:GitCommit.js
var wsh = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var command = App.ParamCount > 0 ? App.Params(0) : "commit";
var path = fso.buildPath(wsh.RegRead("HKCU\\Software\\GitExtensions\\InstallDir"), "GitExtensions.exe")
if(fso.fileExists(path)){
  // .gitフォルダを探索
  var doc = Documents.newDocument();
  if(doc.save()){
    var folder = fso.getFolder(fso.getParentFolderName(doc.fileName))
    try{
      while(!fso.folderExists(fso.buildPath(folder.path, ".git"))){
        folder = folder.parentFolder;
      }
      var shell = new ActiveXObject("WScript.Shell");
      shell.run(format("\"{0}\" {1} \"{2}\"", path, command, folder.path));
    }catch(e){
      Dialogs.Alert("リポジトリルートフォルダが発見できませんでした。リポジトリではない可能性があります\n" + e.message);
    }
  }
}else{
  Dialogs.Alert("Git Extensionsがインストールされていません");
}

App.Quit();

function format(string)
{
  var text = string;
  for(var i = 1; i < arguments.length; i++)
  {
    text = text.replace("{" + (i - 1) + "}", arguments[i]); 
  }
  return text;
}

```

## リポジトリ
https://github.com/TakamiChie/ginnie-scripts にて公開しているのでそちらからもどうぞ

# つかいかた

1. Ginnieのマクロ＞スクリプトファイル＞設定 より、マクロの設定画面を開く
1. 「追加」ボタンより、上記スクリプトファイルを追加する(パラメータなどは不要)
1. リポジトリ下のファイルを編集中に、先ほど登録したスクリプトを実行する

で、Git Extrensionsのインストールがちゃんとできていれば、GitExtensionsのコミットダイアログが表示されます。
![スクリーンショット 2013-12-19 17.59.51.png](https://qiita-image-store.s3.amazonaws.com/0/14499/e5a4b239-5289-e1d0-d4c7-52649a1a489f.png)

なお、Git Extensionsが必須です(インストーラによりインストール済みである必要があります)。無い場合はスクリプトが動きません

# しくみ

やっていることは次のような感じ。

1. レジストリのインストール情報より、Git Extensionsのパスを取得
1. 現在開いているドキュメントを上書き保存(この時点でファイルが未作成の場合、名前をつけて保存ダイアログが表示される(キャンセルすると、その後の処理が実行されない))
1. 現在開いているファイルのフォルダパスを探索し、リポジトリのルートフォルダを探す(.gitフォルダを探索する)
1. GitExtensionsにcommitオプションをつけて起動する

これでとりあえずコミットダイアログが開きます。文章やIDEのないスクリプトを書いている人には便利じゃないでしょうか。

# おまけ
マクロ実行時のパラメータに「openrepo」などGitExtensionsがサポートしているパラメータを指定すると、リポジトリにそれぞれ該当オプションの操作を行うことができます。
こんな感じですね。
![スクリーンショット 2013-12-19 18.12.18.png](https://qiita-image-store.s3.amazonaws.com/0/14499/5e8e3341-adb1-d5cd-2a13-46a6a1341a7e.png)

とりあえずパラメータなし(commit)とopenrepoをメニュー項目として登録しておくと何かと捗るかと。
Androidのインストールリファラを使うときの注意点

Androidでインストールリファラを使うときにハマったのでメモ。

google playのアプリへのリンクにリファラをつけることができる。

\<GOOGLE PLAY APP URL>&referre=hoge%3Dfuga

※リファラの=や&はエンコードが必要(=->%3D, &->%26)

この時のリファラ文字列を以下のようにしてアプリで受け取ることができる。

```xml:AndroidManifest.xml
<receiver
    android:name="com.example.app.InstallReferrerReceiver"
    android:exported="true" >
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>
```

```java:InstalReferrerReceiver.java
public class InstallReferrerReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) 
        String referrer = intent.getStringExtra("referrer");
    }
}
```
intentから受け取ったリファラ文字列はそのまま
`referrer = “hoge%3Dhuga”`
が取得できると思って、parse処理を仕込んでいたが、実際は
`referrer = “hoge=huga`
とデコードされた文字列が渡される。

リファラ文字列を自前でパースしたりする時は注意。
C++ vector::reserveの挙動を勘違いしていた件について

vector・stringのメンバ関数である`reserve`関数の挙動を勘違いしてた。私のようによく知りもせずに使うとハマってしまうかもしれない。そもそも`reserve`関数で確保される容量(capacity)とは何なのか？要素数(size)とは何が違うのか？
##容量(capacity) / 要素数(size)とは

* 容量とは要素を新たに挿入しても動的なメモリ確保が行われない __許容量__ のこと
* 要素数とは実際にコンテナに格納されている要素の数のこと

##容量(capacity) / 要素数(size)の注意点

* 容量を確保するのであって要素数を大きくする訳ではない
* イテレータ`end`は動かずに`begin`と同じ位置を指したまま
* 容量を確保したからといって要素数以上の位置にアクセスすべきではない

また、容量が足りなくなるとvector・stringは __その時点での2倍の大きさ__ の容量を用意してくれるので、名著Effective STLの第14項「reserve を使って不必要な割り当てを避けよう」でも示されているように下手をすれば"無駄に何度もメモリ確保関数を呼び出す遅いコード"や"無駄に長い容量を確保させて邪魔くさいコード"になってしまうので注意するべき。
ここで、以下に私が実際に書いた __書くべきでないコード(恥)__ を晒す。

```cpp:
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
const int N = 100;
int main(void) {
  vector<int> v;
  v.reserve(N);
  fill(v.begin(), v.end() + N, 1);

  cout << "size " << v.size() << endl;
  if (v.begin() == v.end())
    for (int i = 0; i < N; i++)
      cout << v[i];
  return 0;
}
```

10行目で`vector::end()`イテレータを無理やりに書いて気持ち悪いかもしれません、大変申し訳ない
`fill`関数で要素数以上の位置(v.size()==0なのに添字で言えば0～N-1)にアクセスしてるのが宜しくない、`fill`関数を使いたいのであれば

```cpp
// 省略
  v.resize(N);
  fill(v.begin(), v.end(), 1);
// 省略
```

と書くべき。また、別の書き方としてはコンストラクタを用いて

```cpp
// 省略
  vector<int> v(N, 1);
// 省略
```

と書くこともできる。
##つまり
事前に要素数が分かっていて

* `push_back`関数などで要素を一つずつ挿入したい場合は`reserve`関数
* 添字アクセスにより任意の位置に要素を代入したい場合は`resize`関数 or `vector( size_type size )`コンストラクタ
* 特定の値を敷き詰めたい場合は`resize`関数+`fill`関数 or `vector( size_type num, const TYPE &val )`コンストラクタ

とすれば良い。
##謝辞
hattorixさん、skonbさん、h2so5さん、ご指摘頂きまして本当にありがとうございます。
根本的に勘違いしていました、これをキッカケにEffective C++・STLを読み直そうかと思います。
【PHP】【JavaScript】【解決】class内に生成した変数の参照

こんにちは。

どうしても「->」(アロー演算子)がとっつきにくいなぁと思うこのごろです。

クラスの作成

```php
class Testclass{
    //変数
    public $test_variable ;

    public static function test_msg(){
        echo "テスト" ;
    }

    public function test_function(){
        self::test_msg() ;
    }

}

//インスタンスの生成(newする)
$test_ist = new Testclass() ;

//参照
$test_ist -> test_variable = 100 ;
echo $test_ist -> test_variable ; //100
```

最後の2行がなんか頭にはいってこない・・。

あとは呼び出し方でしょうか。
>
同じクラス内からstatic関数を呼び出すには
self::関数名
クラス外からstatic関数を呼び出すには
クラス名::関数名

 *****
以下、JSの確認もこめて

JavaScriptだとクラスの概念がないみたいですね。
でも似たような書き方ですと・・・

と、やってみたものはいいものの全くうまくいかず。

本来は「.」で生成されると思っていましたが、
何とかしてテストとalertされるようにするので手いっぱい。

```js

function Testclass(){
	function test_msg(){
		alert("テスト");
	}
	return test_msg() ;
} 

test_ist = new Testclass() ;
Testclass() ;
m = test_ist.test_msg ;
alert(m) ;
```

>
test_ist = new Testclass() ;
m = test_ist.test_msg ;
alert(m) ;

でnewして . で呼び出せると思っていたのですが・・・。

デバッグしたところ、Testclassの中は通っているもよう。

```js
function test_msg(){
	alert("テスト");
}
 return test_msg() ; 

``` 

悔しかったのでなんとか表示はさせるようにしたのですが
本来の目的である、
>
alert(m)

で表示するまでにはいたりませんでした。
定義されていないと出る。

ちょっとドツボにはまってしまいました。
結構な時間かけているので、未解決のままやりたかったことをメモりました。

return test_msg();で表示させたかったわけじゃないんだけどなぁ・・・。

*****
解決しました！

いただきましたコードが僕の希望通りでしたので
そのまま貼らせていただきます。

```js
var Testclass = function(){
    this.test_msg = function(){
        alert("テスト");
    };
};

test_ist = new Testclass;
test_ist.test_msg();
```

ありがとうございました！
これからも宜しくお願いいたします。
CeylonでのHTML出力

今日はHTMLの出力です。

そんなの文字列つなげて出力するだけでいいじゃん？って思っているあなた。
ceylon.html モジュールがありますよ！

#モジュール追加

ということでいつも通りモジュール追加。

> import ceylon.html "1.0.0";

#そしてコードは

コードは公式サイトのトップページに！！
[公式ページ](http://ceylon-lang.org)
![スクリーンショット 2013-12-19 17.39.33.jpg](https://qiita-image-store.s3.amazonaws.com/0/17213/6dbacf27-dbcb-7789-e652-6a9f8b20e480.jpeg)

公式ページからコードをコピペして来たのが ↓

```ceylon

import ceylon.html { Html, Body, html5, Head, H2, P }

void outputHTML() {

	Html html = Html {
		doctype = html5;
		Head { title = "Ceylon: home page"; };
		Body {
			H2 ( "Welcome to Ceylon ``language.version``!" ),
			P ( "Now get your code on :)" )
		};
	};
	
	print(html);
}

````
Htmlの属性をそのまま書いて行く感じで
クラスが用意されてます。分かりやすい！

コンソールへの出力結果は

```html
<!DOCTYPE html>

<html>
    <head>
        <title>
            Ceylon: home page
        </title>
    </head>
    <body>
        <h2>
            Welcome to Ceylon 1.0.0!
        </h2>
        <p>
            Now get your code on :)
        </p>
    </body>
</html>
````

まさにHtmlです。きれいです。

#個人的な意見

ここまで紹介しといてなんですがプログラマーがHTML書くケースってあんまりないと思うんですよね。
プログラム上で組み立てれてカッコいい！！ってなるだけで。。

実際の仕事の場合はマークアップデザイナな人たちからHTMLもらって
どんな風にマッピングするかとかテンプレートとして利用するかだと思うんですよ。

なのでカッコいい！！って思うんですけど
これって実際の所はどうやって使うんですかね？
(Xmlとしても使えないしCSSできれいにするから！とか言ってDivタグだらけだと楽しくないし・・・)

こんな風に使えるよ！っていう意見やアイデアがあったらコメント貰いたいです。
PostgreSQLのデータをMySQLに移行する


長くアプリケーションをメンテナンスしているうちに、データベースを別の環境に移行する機会もあるかと思います。私が経験したPostgreSQLからMySQLへの移行における手順を示しておきます。

このシステムは下記のような特徴を持っているため、かなり簡単な部類に入るかと思います。

- データをバッチで突っ込む以外に更新は無い
- TRIGGERは使わない
- VIEWは使わない
- それらしい機能は全然使わない

機能も大したこと無い、それゆえに制限も無いということで、データベース・エンジンはMyISAMにしました。テーブルの関連付けは移行しないということです。関連付けも移行する場合はまた別途手順が必要になるでしょう。

## PostgreSQLのデータをエクスポートする

PostgreSQLの付属のプログラム`pg_dump`を使います。ここでは、ダンプするデータベースの名前を`db1`としておきます。この時、後の作業のためにデータとスキーマを別々に出力します。

```
$ pg_dump --data-only --no-owner --no-privileges --disable-dollar-quoting db1 > /var/tmp/dump_data.sql
$ pg_dump --schema-only --no-owner --no-privileges --disable-dollar-quoting db1 > /var/tmp/dump_schema.sql
```
## MySQLにデータをインポートする

インポートするためには、ダンプしたファイルを多少加工する必要があります。

### schemaファイルの修正

互換性のない部分を手作業で修正します。下記のような対処をしないとSyntax Errorが起きたりします。

- 先頭のSET構文を削除します。
- ALTER TABLE ONLY … のONLYを削除します。
- CREATE INDEX … ON table_name USING btreeはUSING btreeをONの前に移動します。

参考：

- http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html
- http://dev.mysql.com/doc/refman/5.1/ja/create-index.html

修正したら下記の通りインポートします。

```
$ mysql -h database.example.com -u root -p db1 < dump_schema.sql
```

エラーが出ていなければ成功です（たぶん）。

### dataファイルの修正

pg_dumpではデータを`COPY`ステートメントでインポートするように記述されているのですが、MySQLには`COPY`が無いようです。`COPY`ステートメントは、その宣言の後にタブ区切りでデータを並べ、`\.`で示されるデータの終端までをインサートするというシンプルな構文です。そのため、多少の加工で対応できる`LOAD DATA INFILE`構文でインポートすることにします。

データの加工には即席のプログラムを作って対応しました。

- https://gist.github.com/artifactsauce/8035314

下記のように実行します。

```
$ conv-pg_dump-tsv.pl dump_data.sql
```

ダンプファイルがテーブル毎にTSVとして`data`ディレクトリ配下に出力されます。出力されたTSVファイルを`mysqlimport`でインポートします。

```
$ mysqlimport --local -h database.example.com -u root -p db1 data/*
```

インポートするテーブルが空の場合は、LOAD DATA INFILEは最適化を自動的に実行するそうですので、データ量がそれなりに有っても結構速いです。

参考：

- http://dev.mysql.com/doc/refman/5.1/ja/insert-speed.html
- http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
- http://dev.mysql.com/doc/refman/5.1/ja/mysqlimport.html
curl でリクエスト時にプロキシ設定する

`-x`または`--proxy`オプションを使う。

`<[protocol://][user@password]proxyhost[:port]>`

となっていて、ポートはデフォルトだと1080に設定されている。

例
``` curl --proxy http://proxy.example.com:8080 http://qiita.com
```
オブジェクトのシンボル探し用シェルスクリプト

find、nm、grepを使ってシンボル探し。

```bash:find_function.sh
#!/bin/bash

target_dir=/lib/modules/`uname -r`/
target_type="ko"
func_name=""

function usage()
{
    echo "usage: $1 -d [directory] -t [objecdt type(e.g. so, ko)] -f [function name]"
    exit -1
}

while getopts d:t:f: option
do
    case $option in
        d)
            target_dir=$OPTARG
            ;;
        t)
            target_type=$OPTARG
            ;;
        f)
            func_name=$OPTARG
            ;;
        \?)
            usage $0
            ;;
    esac
done

if [ "$func_name" = "" ]; then
    usage $0
fi

echo "[-]Directory: $target_dir"
echo "[-]File type: $target_type"
echo "[-]Function : $func_name"

files=`find -L "$target_dir" -name "*.$target_type"`
for f in $files
do
    nm --defined-only $f 2>&1 | grep "$func_name"  > /dev/null 
    if [ $? -eq 0 ]; then
        echo $f
    fi
done

exit 0
```

.koから探す。

```
[-]Directory: /lib/modules/3.13.0-rc4-ktest/
[-]File type: ko
[-]Function : ext4_xattr_get
/lib/modules/3.13.0-rc4-ktest/build/fs/ext4/ext4.ko
/lib/modules/3.13.0-rc4-ktest/kernel/fs/ext4/ext4.ko
/lib/modules/3.13.0-rc4-ktest/source/fs/ext4/ext4.ko
```

.oから探す。

```
masami@saga:~$ find_function.sh -d ~/linux-kernel/fs -t o -f ext4_xattr_get
[-]Directory: /home/masami/linux-kernel/fs
[-]File type: o
[-]Function : ext4_xattr_get
/home/masami/linux-kernel/fs/ext4/acl.o
/home/masami/linux-kernel/fs/ext4/xattr.o
/home/masami/linux-kernel/fs/ext4/ext4.o
```

.soから探す。

```
masami@saga:~$ find_function.sh -d /lib -t so -f printf
[-]Directory: /lib
[-]File type: so
[-]Function : printf
/lib/perl5/core_perl/auto/Devel/PPPort/PPPort.so
/lib/perl5/core_perl/CORE/libperl.so
/lib/libpython2.7.so
/lib/python3.3/config-3.3m/libpython3.3m.so
/lib/libpython3.3m.so
/lib/libc-2.18.so
/lib/libasprintf.so
/lib/libdevmapper.so
/lib/python2.7/config/libpython2.7.so
/lib/libcrypto.so
/lib/ld-2.18.so
/lib/libnss3.so
```
Node.js のクライアントからオレオレ証明書のサーバへ接続する方法

## 困った事例

Node.jsの`https.request`を使用してサーバへ接続した時、
サーバ側が自己署名証明書などを使っていて認証エラーになる場合、
Nodeで下記のようなエラーがでて通信が出来ません。

```shell-session
Got error: UNABLE_TO_VERIFY_LEAF_SIGNATURE
```

テストなどでAPIの動作確認をしたいときに困ります。

僕は[iodocs](https://github.com/mashery/iodocs)を使って、
開発中APIの動作確認をしようとしてたときに困りました。

## 解決策

下記の一文をいれるだけで証明書のエラーを無視してくれるようになるようです。

`process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';`

適当なところに放り込んでおきましょう。

## 参考
http://stackoverflow.com/questions/9440166/node-js-https-400-error-unable-to-verify-leaf-signature
TweetボタンとLikeボタンの設置方法


余計なことはとにかく省略した。

## Tweetボタン
以下のURLにアクセスします。
https://about.twitter.com/resources/buttons

ボタンのタイプを選んだ後、オプションを設定してください。
設定した後右のコードをコピペで完了

## Likeボタン
1. [アプリを作成](https://developers.facebook.com/)
2. [Likeボタンを作成](https://developers.facebook.com/docs/plugins/like-button/)
3. [Get Code]ボタンをクリック
4. XFBMLを選択してコードをコピペ <- Likeボタン押下時にコメント枠がでる
5. 画像、タイトルなどを指定する場合はmetaタグを追加

```
<meta property="og:title" content="記事のタイトル" />
<meta property="og:type" content="article" /> //トップページはwebsite、個別ページはarticle
<meta property="og:description" content="記事の説明" />
<meta property="og:url" content="記事のURL" />
<meta property="og:image" content="画像のURL" />
<meta property="og:site_name" content="サイトのタイトル" />
<meta property="og:locale" content="言語" />
<meta property="fb:admins" content="facebookのユーザーID" /> //できればfb:app_idを利用
<meta property="fb:app_id" content="facebookのアプリID" />
```
6.[デバッグツール](https://developers.facebook.com/tools/debug)で設定を確認
※画像などを変更した場合はキャッシュが残っていますので、こちらを実行してとキャッシュをリセットします。
意外と知らない？SublimeTextのショートカットキー集


暇だった時に、ぼーっとSublimeTextのkeymapを眺めていたんですが、意外と知らないものがあって、便利そうだったのでまとめてみました。

# はじめに

- この記事でのショートカットはすべてMac、SublimeText3でのデフォルトショートカットキーです。ショートカットの横には設定上の名前を書いています。

- キー名はSublimeTextでの名前をそのまま使っています。(superはcommandキーですね)

- 1行に続けてキーが書かれているショートカットは、１つ目を押した後に2爪を押す、という感じです。


# ショートカット一覧



## カーソル移動も含めてundo, redoする

```
super + u  // soft_undo
super + y  //soft_redo
```

使いそうなのにしらなかった。
通常のundo、redoとの違いは、ファイルの変更を行わなかったカーソル移動も含めて戻されること。
「あ、さっき見てたmethodなんだっけ〜〜」的なときに使える(かもしれない)

## 前にコピー、カットした履歴から貼り付ける

```
super + k, super + v // paste_from_history
super + option + v   // これも一緒です。
```

最近のcopy, cutなどをして履歴から貼り付けができます。
これは便利！コピーだけ先にしておいてストックしておく、みたいに使えるかもですね。

## 定義元を表示

```
f12 // goto_definition
```
まさかデフォルトで定義元を辿れるなんて…! 
ボクが勉強不足なだけかもしれませんが。
ただ、同じProject内のみなので、RubyでKernelのmethodを辿りたい、とかはできないです。


## ファイルを越えてカーソルを移動させる
```
ctrl+minus // jump_back
ctrl+shift+minus // jump_forward
```
soft_undoとなどと違い、編集履歴は戻さず、カーソルの移動のみを戻します。ファイルを越えた移動もちゃんと戻してくれるので便利ですね。

## Paneを増やす、減らす、Pane間の移動
```
super+k, super+up // new_pane
super+k, super+down // close_pane
super+k, super+left or right // focus_neighboring_group
```
Paneの追加、削除、それからPane間の移動をしたいときのショートカット。
特にPane間の移動は便利ですが、デフォルトのキーがすごく使いにくいので、設定したほうがいいかも。

## 文字をUpper case, Lower caseにする
```
super + k, super + u // upper_case
super + k, super + l // lower_case
```

言わずもがなですね。定数とか作るときに便利、でしょうか。


と、こんなかんじでまだまだいろいろあります！
また、自分でショートカットを作ることもできるので、試してみてはいかがでしょうか :)
【HTML】別のページへ自動的に飛ばす方法

こんにちは。
JavaScriptで色々できるかと思いましたが
実際開発の際には、こちらが楽かと思ったのでメモ。

よく見る、「～秒後に自動的にジャンプします。」
というやつです。

>
<meta http-equiv="refresh" content="指定したい秒数;URL = http://***">

結構入り組んだことをするのかと思いきや
metaタグにrefreshを入れ、contentの中に
***ミリ秒ではなく***　秒数を入れ、
URL=のあとに飛ばしたいリンクを貼ればいいんですね。

今回は新しいrenew.phpを作って、に phpの　``` include ```　をいれてやってみたけど
ほかの方法でやっているところもあるのか。

(HTMLタグをいじったりするのかどうかなぁ)

それでは、これからも宜しくお願いいたします。
ckw で起動する Windows コマンドインタープリターの初期設定

最近は「コマンドプロンプト」じゃなくて「Windows コマンド インタープリター」って言うんですね。

![cmd.png](https://qiita-image-store.s3.amazonaws.com/0/6870/d51bc920-551b-eb75-fee2-cbdf2bd0b8ed.png)

というのは余談で、[ckw-mod](http://ckw-mod.github.io/) で起動する Windows コマンドインタープリターの初期設定をするときにハマった話。Linux でいうと `.bash_profile` やら `.bashrc` の設定みたいなもんです。

やってることは大きく以下の2つです。

 * 初期カレントディレクトリの設定
 * 環境変数の設定

これらを実現するコマンドファイルはこんな感じになります。

```bat:cmd-myproj.cmd
start %~dp0ckw\ckw.exe -x "CMD /K cd %USERPROFILE%\git\myproj && set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_25 && PATH=C:\Program Files\Java\jdk1.7.0_25\bin;%PATH%;C:\Ruby200\bin;%APPDATA%\npm;C:\Program Files\nodejs-v0.10.22"
```

`%USERPROFILE%\bin` にパスを通して、その中にこのファイルと ckw のディレクトリを置いておけば、Windows キーを押して `cmd-myproj[Enter]` でいい感じにセットアップされた ckw が起動します。

`%USERPROFILE%` というのは、一般的には `C:\Users\[ユーザ名]` のことです。Linux でいう `$HOME` ですね。`%HOMEDRIVE%%HOMEPATH%` でも多分同じ。

# ハマった事例

-x オプションではなく -e オプションを使うと、なぜかパスが通らなくなります。

```bat:cmd-myproj.cmd
start %~dp0ckw\ckw.exe -e CMD /K cd %USERPROFILE%\git\myproj && set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_25 && PATH=C:\Program Files\Java\jdk1.7.0_25\bin;%PATH%;C:\Ruby200\bin;%APPDATA%\npm;C:\Program Files\nodejs-v0.10.22
```

また、改行を入れてもなぜかパスが通りません。

```bat:cmd-myproj.cmd
start %~dp0ckw\ckw.exe -x "CMD /K cd %USERPROFILE%\git\myproj && ^
  set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_25 && ^
  PATH=C:\Program Files\Java\jdk1.7.0_25\bin;%PATH%;^
  C:\Ruby200\bin;%APPDATA%\npm;C:\Program Files\nodejs-v0.10.22"
```
MacにPandocを入れてMarkdownをTextileに変換


個人的には[Markdown](http://ja.wikipedia.org/wiki/Markdown)で何でも書きます。
だけど、仕事で使う[Redmine](http://redmine.jp/)は[Textile](http://en.wikipedia.org/wiki/Textile_(markup_language))形式での入力が必要。
でも、Textileの記法は覚えられません。。([Backlog](http://www.backlog.jp/)はwiki記法だし。。この時点で3記法。。。)

で、[Pandoc](http://johnmacfarlane.net/pandoc/)を使うことにしたので、それのインストール方法。

## インストール
	brew install pandoc
嘘。formulaがありません。なので、[haskell-platform](http://www.haskell.org/platform/)経由でインストールするらしい。

	brew install haskell-platform
	cabal update
	cabal install pandoc

これ、だいぶ時間がかかります。自分は10分くらい。

終わったらPATHを通します。自分はzshなので、zshrcに

	PATH=${HOME}/.cabal/bin:$PATH
と書いてやる。

## 確認
一旦、ターミナルを再起動し、

	pandoc -v
で

	pandoc 1.12.2.1
	Compiled with texmath 0.6.5.2, highlighting-kate 0.5.5.1.
	Syntax highlighting is supported for the following languages:
    actionscript, ada, apache, asn1, asp, awk, bash, bibtex, boo, c, changelog,
    clojure, cmake, coffee, coldfusion, commonlisp, cpp, cs, css, curry, d,
    diff, djangotemplate, doxygen, doxygenlua, dtd, eiffel, email, erlang,
    fortran, fsharp, gnuassembler, go, haskell, haxe, html, ini, java, javadoc,
    javascript, json, jsp, julia, latex, lex, literatecurry, literatehaskell,
    lua, makefile, mandoc, markdown, matlab, maxima, metafont, mips, modelines,
    modula2, modula3, monobasic, nasm, noweb, objectivec, objectivecpp, ocaml,
    octave, pascal, perl, php, pike, postscript, prolog, python, r,
    relaxngcompact, rhtml, roff, ruby, rust, scala, scheme, sci, sed, sgml, sql,
    sqlmysql, sqlpostgresql, tcl, texinfo, verilog, vhdl, xml, xorg, xslt, xul,
    yacc, yaml
	Default user data directory: /Users/macbookpro/.pandoc
	Copyright (C) 2006-2013 John MacFarlane
	Web:  http://johnmacfarlane.net/pandoc
	This is free software; see the source for copying conditions.  	There is nowarranty, not even for merchantability or fitness for a particular purpose.

こんなのが出たら成功。

## 使い方

基本的には[本家の例を見ればわかる](http://johnmacfarlane.net/pandoc/demos.html)。
自分の場合、Markdown形式のファイルをTextileに変換したいので、

	 pandoc -s hogehohe.md -o hogehohe.textile

とやるだけ。

便利。おためしあれ。
GooglePlusの「投稿」からRSS生成する方法

GooglePlusで投稿した内容をRSS化する方法です。
+1した場合は、[GooglePlusの「plusones」からRSS生成する方法](http://qiita.com/typista/items/6ee5a564d0086dfc12f0)です。

[FEED43](http://feed43.com/)を使います。

①[Create your own feed](http://feed43.com/feed.html?action=new)をクリック
②AddressにRSS生成したいGooglePlusの投稿ページURLを入力し「Reload」ボタンを押します。Encodingはデフォルトでutf8なので、未入力でOKです。
　＊私の場合は、https://plus.google.com/u/0/+MakotoKizuka/posts
③STEP2の `Item (repeatable) Search Pattern*:` に

```
<div class="Ct">{%}</div>{%}<a href="{%}"{%}>{%}</a>{%}<a href="{%}" target="_blank" class="d-s ot-anchor zg" tabindex="0">{%}</a>
```

を入力し「Extract」ボタンを押します。

④STEP3の `Item Title Template*:` に `{%8}` を入力、 `Item Link Template*:` に `{%3}` 、 `Item Content Template*:` に `{%1}` を入力し「Preview」ボタンを押します。
⑤RSS完成
OWASP ZAPを触ってみる

IPAでウェブサイトにおける脆弱性検査手法として紹介されていたので触ってみる

* https://www.ipa.go.jp/about/technicalwatch/20131212.html 

# OWASP ZAP
* Webアプリケーション脆弱性スキャンツール
* サイト
 * https://code.google.com/p/zaproxy/
 * https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

# インストールと下準備
今回はOS X 10.9.1にインストールしました
## 必要なもの
* JREが必要なので、必要な場合は予め入れておく
 * http://java.com/ja/download/
  * Mervericksには最初から入っていたので、何もしていない
* Firefox
 * 標準ブラウザとしてFirefoxを期待しているようなので入れておく
  * http://www.mozilla.jp/firefox/
  * アドオン追加時に標準である必要があるだけで、追加してしまえば、標準ブラウザとしていなくても動く様子

## DLして展開して実行する
* http://sourceforge.net/projects/zaproxy/files/
 * ZAP_2.2.2_Mac_OS_X.zip
* 展開するとOWASP ZAP.appが出てくるのでアプリケーションフォルダにD&Dしてから実行する

## 実行したら警告が出た
![ポート待ち受け.png](https://qiita-image-store.s3.amazonaws.com/0/23194/7f924700-3055-95da-0f8c-885662021a57.png)
ポートで待ち受けできません 8080

* localhostの8080を既に他で利用していたので、警告が出た
* 対応しなくていい人(以下の場合等)は「Firefoxにアドオンを追加」へ
 * OWASP ZAPをプロキシにする事がない
 * 普段のリクエストもプロキシを通す事なく行っている

## 待ち受けポートを変更する
* OWASP ZAPが待ち受けるポートを10080にして、リクエストが元々のポートに流れるように変更
 * ツール -> オプション -> Options -> ローカル・プロキシ -> ローカル・プロキシ
![ローカルプロキシ.png](https://qiita-image-store.s3.amazonaws.com/0/23194/b3bde971-88a5-65f9-2853-db586a53129d.png)
 * ツール -> オプション -> Options -> ネットワーク -> プロキシ・チェイン利用
![プロキシチェイン.png](https://qiita-image-store.s3.amazonaws.com/0/23194/ccdcc0af-4994-48c9-76ff-0e0080fa173c.png)

## Firefoxにアドオンを追加
* Firefoxを標準のブラウザに変更
 * Firefox：環境設定 -> 詳細 -> 一般 -> デフォルトWebブラウザ
* Furefox Plug-n-Hackをインストール
 * Plug-n-Hackボタンをクリック
![plug-n-hack.png](https://qiita-image-store.s3.amazonaws.com/0/23194/56d01082-bf15-66ec-5477-fb64d64c6c91.png)
* OWASP ZAP再起動

# 試しスキャン
* ポリシー -> スキャンポリシー
 * 試したいヤツにチェックが入っているのを確認
  * とりあえず全スキャンしてみるので、全部に入っている事を確認
* URLを入れて攻撃ボタンを押す
 * 自分の管理しているサイト以外には __絶対にやらない事__
* しばらく待っていると以下のように出るので、見たい項目をクリックすれば展開されて詳細が見れます
![実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/23194/1078f18c-173e-4309-892d-b1fa4b37feeb.png)
 * オレンジ旗以上が出てたら早急に対応した方がいい感じですかね？
 * 幸い赤旗は出ていませんが、世間的に「設定しろよ」って言われている内容が出ていますね。。。やらねば！！

# レポート出力
* レポートという部分を押せばHTMLやXML等に出力出来るらしいですね

# セッションの保存
* セッションを保存しておけば、スキャンし直さなくても続きから調査出来るので便利

## 保存
* ファイル -> Persist Session
 * 細々といろいろとファイルが作成されるので、あらかじめフォルダを作っておいた方が良い

## 再開
* ファイル -> セッションを開く
 * 保存しておいた*.sessionファイルを指定して開く

# まとめ
* たしかに手軽かも！！
 * 何もしなくても日本語だし

Fuzzerとかって文字も見えますし、プロキシとして利用して操作を記録し、記録内容に対してスキャンとかあるそうなので、ログイン後の機能でもスキャン出来るそうですし、色々と使えそうですね。
ちょこちょこと触ってみようと思います。
スマホのブラウザバックでページをリロードさせる。


ブラウザバックしたときに初期化した状態で画面表示したい。
そんなときはこれ入れとくと幸せになれる。

```javascript:noBrowserBack
ContentObj.setEventBrowswerBack = function() {
    window.onpageshow = function() {
        if (event.persisted) {
            location.reload();
        }
    };
};


// イベントセット
ContentObj.setEventBrowswerBack();
```


// ----------------- 参考URL
http://nmi.jp/archives/273
【JavaScript】三項演算子(if～else文の省略形)メモ

こんにちは。
どうしても形が変わると覚えられないのでメモ。

```js
var test = (a === b) ? true : false ;
```

と

```js
if(a === b){
    var test = true ;
}else{
    var test = false ;
}
```

上記は同じ意味。

この変数の条件は？　本当　：　嘘

うまい覚え方がわかりません。。

それでは、これからも宜しくお願いいたします。
chef(ruby)でipアドレスの末尾を置換


DBのアカウントのホストの制限をするために置換したいという需要がありまして。
`ohai`というchef同梱のコマンドで
ohai ipaddressと打つとlocalhostのipaddressがとれます。
ohaiでとれる値をchefのrecipeやtemplateから読むときは、`node[:ipaddress]`とかすると値がとれます。

ただし`node[:ipaddress]`はmy.cnfのserver-idに第4オクテットを指定する感じにtemplateで使ってました。
templatesに置いたmy.cnfは以下のような感じ(抜粋)です
`server-id = <%= node[:ipaddress].split(".").last %>`
参考：http://studio3104.hatenablog.com/entry/20130218/1361163629

DBアカウントのホスト制限のために`node[:ipaddress]`を使って置換すると
templateの値も置換されてしまうという現象が。。
rubyもchefもよくわかんないなと思いました。元の値を別の値に代入するのにも失敗したし。
→"ruby 参照渡し"でググると少しわかりました。
　rubyでは変数は箱ではなくラベルでポインタなので中身を変えると元の値も変わってしまうとのこと。
　そのような破壊的操作をしなければいいということですがじゃあどうすればいいのかはよくわからず。

しょうがないから、`node[:network][:default_gateway]`とか別のパラメータ使いました。
デフォゲをどっかで使うなら他のブロードキャストなどを使わないとダメかも。

結果的に上手くいった置換方法のレシピ：

```
～略～
localip = node[:network][:default_gateway]
localip[/[0-9]+\.[0-9]+$/] = "%"
～略～
bash "secure_installation" do
  only_if "#{mysqlconn} -e 'show databases;'"
  code <<-EOC
    localseg=#{localip}
    #{mysqlconn} << EOF
      grant all on *.* to #{suuser}@"${localseg}" identified by "#{supass}";
      grant all on *.* to #{suuser}@'localhost' identified by "#{supass}";
      grant all on *.* to #{suuser}@'::1' identified by "#{supass}";
      grant all on *.* to #{suuser}@'127.0.0.1' identified by "#{supass}";
      grant replication slave,replication client on *.* to #{repluser}@"${localseg}" identified by "#{replpass}";
      drop database test;
      delete from mysql.user where password='';
      flush privileges;
～略～
```
※ユーザ情報はdata_bagsからロードしています。
※mysql5.6でrpmで入れてる為`expect`でパスワードセットする処理をbashリソースで上のレシピの前に入れています。
参考：http://qiita.com/k-motoyan/items/25e64dc054abfa0ff7cb

結果

```
mysql> select user,host,password from mysql.user;
+------+---------------------+-------------------------------------------+
| user | host                | password                                  |
+------+---------------------+-------------------------------------------+
| root | localhost           | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| root | test-mysql01        | *6A60A70C59535B75A79FDE4C7C55FDA55F****** |
| root | 127.0.0.1           | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| root | ::1                 | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| root | 192.168.%           | *E8DD65E018E30F27D962FB9BFA2F4E8206****** |
| repl | 192.168.%           | *43E209EED080057E35C2630AC06D32960A****** |
+------+---------------------+-------------------------------------------+
```

検索してもファイル内をsedってるレシピしかみつからなくて「たのしいruby」を部分的に読みました。
bash内でsedだとohaiでとれた値をマッチさせるのに括弧とかダブルクォートとかの余計な値が多くて
難儀だったのでたどたどしくrubyで頑張ってみた次第です。
「ソフトウェアにコミットするときに翻訳から取りかかる」ことのメリット

オープンソースソフトウェアへのコミット方法には様々なものがある。コードを書くだけでなく、ドキュメントを書いたり、ソフトウェアの配布サイトを管理したり、といったことがあります。翻訳もその一つです。

今日は、「ソフトウェアにコミットするときに翻訳から取りかかる」ことのメリットとして、以下の2つを紹介します。

* 少しずつ取りかかれる
* 翻訳のコミットは歓迎され易い

<h2>少しずつ取りかかれる</h2>

コードでのコミットの場合、ある程度まとまった量になることが多いです。追加するコード自体は少なくても、テストコードが結構な量になることもあります。

翻訳の場合は、一文から取りかかることができます。なので、「大量のリソースは割けないが、少しコミットしたい」という場合には作業しやすいです。

<h2>翻訳のコミットは歓迎され易い</h2>

「翻訳のコミットは歓迎され易い」と私は思います。理由は以下の2点です。

<h3>翻訳は、ほぼ確実に改善につながる</h3>

コードでコミットする場合、コミットする側はコミットする機能が重要だ、と考えています。コミットを貰う側も同じ判断なら良いですが、必ずしもそうではありません。「このソフトウェアには不要な機能だ」という判断かもしれません。

一方、翻訳をコミットする場合、ほぼ確実に改善につながります。このため、ほぼ確実に翻訳を受け入れてもらえます。本体に組み込んでもらえるのが理想ですが、最悪でも「翻訳されたものがここにあります」ぐらいは紹介してもらえるでしょう。

<h3>一人で様々な言語に翻訳するのは難しい</h3>

コードの場合は、一人の天才がほとんど書いてしまう、というケースが結構ありそうです。そういう場合、他からコミットしてもらうことがあまりメリットにならないかもしれません。

翻訳は、理論上は一人で様々な言語に訳すことが可能ですが、そんなスーパーマンは滅多にいないでしょう。会社組織が中心の場合でも、かなり大変でしょう。なので、自分では難しい(or不可能な)翻訳をコミットすると、歓迎されやすいでしょう。

<h2>私個人のコミット方法</h2>

私個人は、いきなり多くのコードをコミットするのではなく、少しずつコミットするようにしています。少しずつコミットするうちに、そのソフトウェアの開発体制が少しずつ分かってくるからです。

「少しずつのコミット」に丁度いいのが翻訳ですね。一度に全部翻訳するのは大変ですが、「30分〜1時間作業する×週2〜3回」ぐらいでも結構進みます。

そうやって少しずつコミットしてから、大きな提案を行うようにしています。もちろんオープンソースソフトウェアなら、理論上は最初から大きな提案をしても良いのですが、私は少しずつコミットした上で行うようにしています。

<h2>まとめ</h2>

ソフトウェアの翻訳は、コミットするときの取りかかりとして良いのではないかな、というお話でした。
Javaのシステムプロパティを取得


`jinfo`で取得可能

```
Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message
```

`ps -ef | grep java`等でpidを取得してそれを`jinfo`に食わせればOK。

#### 補足
`ps`の代わりに`jps`コマンドって言うのもあるそうです。

# 参考
* [java - How can I obtain the system properties for a particular JVM instance programmatically? - Stack Overflow](http://stackoverflow.com/questions/8833533/how-can-i-obtain-the-system-properties-for-a-particular-jvm-instance-programmati)
* [実行中のJavaアプリケーションの拡張設定を確認／変更する - Starlight](http://d.hatena.ne.jp/Kazuhira/20120623/1340464983)
ajaxでPOSTした値を取得する


## クライアント側

```js
$.ajax({
    url:$form.attr('action'),
    type:$form.attr('method'),
    dataType: 'html',
    data:{
        search_word:$('#search_word').val()
    },
    success: function( data ) {
        $('#result_list').html(data);
    },
    error: function( data ) {
        $('#result_list').html(data);
    }
});
```

## サーバ側

```php

if ($this -> request -> is('post') ){
    $search_word = $this -> request -> data['search_word'];
}

```
MAASとjujuインストールしてみた

* [インストール手順](http://maas.ubuntu.com/docs/install.html#disc-install)
  * 稼働中のubuntuにインストールもできるし、最初からMAASが入った状態でインストールも出来る。
* サーバーにログインして`Import the boot images`をクリック。
  * イメージのダウンロードが30GBあります。4時間かかりました。

```bash:
# du -sh /var/lib/maas/*
21G	/var/lib/maas/ephemeral
3.9G	/var/lib/maas/tftp
# du -sh /var/lib/maas/ephemeral/*
4.7G	/var/lib/maas/ephemeral/precise
4.9G	/var/lib/maas/ephemeral/quantal
5.0G	/var/lib/maas/ephemeral/raring
3.4G	/var/lib/maas/ephemeral/saucy
```

```bash:管理者作成
$ sudo maas createsuperuser
```

管理画面にログイン

* http://IPアドレス/MAAS

```bash:追加パッケージインストール
$ sudo apt-get install -y juju-core mongodb-server lxc vim libvirt-bin
```

```bash:ディレクトリ作成
$ mkdir ~/.juju
$ chmod 700 ~/.juju
$ juju init
$ vim ~/.juju/environments.yaml
```

```bash:sshキー作成
$ ssh-keygen
$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
```

```bash:
$ sudo juju bootstrap
しばらく待つ。
```

```bash:稼働状況確認
$ juju status
$ tail -f ~/.juju/local/log/machine-0.log
```

```bash:サーバーにログイン
$ juju ssh 0
Permission denied (publickey,password).
ERROR exit status 255
```

?? ここで詰まった。

maas-cli
==========
* MAASをCLIで操作可能です。

```bash:
$ maas-cli login root http://localhost/MAAS/api/1.0
API key (leave empty for anonymous access): 

You are now logged in to the MAAS server at
http://localhost/MAAS/api/1.0/ with the profile name 'root'.

For help with the available commands, try:

  maas-cli root --help
```

* [API key](https://maas.ubuntu.com/docs/maascli.html#api-key)はこちら。

```bash:こんな感じで使います。
$ maas-cli root nodes -h
```

* [maas->docs->nodes](https://maas.ubuntu.com/docs/nodes.html)