OmniAICreator/Qiita-1.07M huggingface dataset:
配列の中に特定の値の組み合わせが存在するかどうかを順番を無視して判定する

こんな感じ？

```ruby
 def test(target, pattern)
   pattern_set = Set.new(pattern)
   target_set  = Set.new(target)
   intersect = pattern_set & target_set
   return intersect == pattern_set
 end

> test([3,2,1,4], [1,2,3])
=> true
> test([3,2,2,4], [1,2,3])
=> false
> test([3,2], [1,2,3])
=> false
```

### 修正(2013.7.2)

コメント頂いたので修正した。
Array のまま積集合を求める事ができるので、上記のコードは以下のように変更する事ができる。

```ruby
def test(target, pattern)
  Set.new(pattern & target) == Set.new(pattern)
end
```
Pebble と iOS のメモ

http://developer.getpebble.com/
2013-06-21
Pebble Firmware v1.11.1

EDIT:2013-07-01:
- `UIBackgroundModes`  `bluetooth-central` について追記
- カスタム font もキャラクタ数が 255 に制限されている

## Pebble ユーザー視点
- システムにはまだ日本語などの unicode 文字のフォントがない
  - なんとなく、日本語を表現するために必要な漢字 の glyph のサイズが
- iPhone が電話を着信したときの通知の Pebble の画面からは電話に出たり切ったりできる(Pebble自体で音- - 声通信はできないので出ても音声は iPhone 本体)

## iOS app と Pebble app の通信
- 現状の制限
  - 現状では pebble app が foreground でないと通信できない
  - pebble app 本体には persistent store がない
  - カスタム font もキャラクタ数が 255 に制限されている
- iOS app がバックグランドのときに通信できるか不明
- iOS 7 でバックグランド動作が改善されたので期待( push 通知, schedule)
- 電話やSMSの通知で割り込まれても戻れば Pebble app の状態は維持できてる様子
- `UIBackgroundModes` で `bluetooth-central` を設定すれば iOS アプリが終了している状態でも、 Pebble 側からのメッセージで iOS アプリで処理可能(らしい)

## アイデア
- iOS app から Pebble app (.pbw ファイル)を iOS Pebble.app 経由でインストールできるようにするのがいいだろう
- Pebble app は時計としても機能させて常に foreground で使ってもらう
- iOS app が PUSH 通知やスケジュール実行をにより Pebble app に push するようなのが良さそう
tigで見ているコミットをgithubで開く

```sh:~/.tigrc
bind main G !@hub browse -- commit/%(commit)
bind diff G !@hub browse -- commit/%(commit)
```

上を`~/.tigrc`に書いておけば，tig起動中に`G`を押したとき，選択されているコミットに対応したgithubのコミットページをブラウザで開いてくれる．hubコマンドについては[GitHubユーザーのためのhubコマンド - Qiita](http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3)の記事をどうぞ．


デフォルトでは`G`は`git gc`に割り当てられていて意味がわからない(たまに間違えて押してしまう)ので潰しておく．
`!@hub`の`@`は出力を捨てる(つまりtigの再描画を避ける)意味がある．


## 参考
[tig/tigrc.5.txt at master · jonas/tig](https://github.com/jonas/tig/blob/master/tigrc.5.txt)
OpenStreetMapリレーションとは

OpenStreetMapでデータの編集を行なっていると、**リレーション** という単語にあたることがあります。

OSM編集においてたいへん大切な概念であり、OSM Wikiにも解説ページが存在するのですが、具体的な設定操作方法がわからない、という声をよく聞きます。
ここでは、リレーションの基礎的な概念と、JOSMでの編集方法について解説します。

* [OSM Wiki: Relation] (http://wiki.openstreetmap.org/wiki/JA:Relation)

##OSMにおける地物の基本(Node,Way)
そもそもリレーションとは何か、を解説する前に、OSM編集の基礎となる地物についての基礎をおさらいしましょう。

地球上に存在する地物をOSMで表現する場合、私たちは以下のどちらかの方法を使って、対象の地物の位置を緯度経度で表現しています。

* ノード : Node。特定の緯度経度1点を示す。
* ウェイ : Way。複数のノードをつなぎあわせて、線として表現したオブジェクト。始点と終点が同じ位置の場合は、エリア(Area)と呼称する。

基本的には、上記の方法でほとんどの地物を表現することが可能です。
しかしOSMのなかで、それらの方法では表現しきれないデータの要求がでてきました。

具体的には、例えば以下のような事例です。

* エリアの中に別のエリアが存在する場合 (Multi Polygon)
* バスや鉄道など、複数の道路にまたがる経路情報 (Route)

リレーションでは、既に存在しているノードやウェイ、エリアを論理的に関連付け、1つのまとまりであることを表現することでこの問題を解決します。

## リレーションの構成
リレーションには複数のノードやウェイが、**メンバー**として組み込まれます。

また、それぞれの**メンバー**には、**ロール(役割)**が割り当てられます。

複雑な形状の森林地帯などを表現するために使われる**マルチポリゴン**という種別のリレーションを例に、解説を行います。

## マルチポリゴンにおける、リレーションメンバーとロール
OSM Wikiのマルチポリゴン解説ページは以下になります。

[JA:Relation:multipolygon](http://wiki.openstreetmap.org/wiki/JA:Relation:multipolygon)

非常に複雑な例をあげて詳細な説明がされていますが、基本となる構成は以下のみです。

![マルチポリゴン.png](https://qiita-image-store.s3.amazonaws.com/0/9928/05888a1b-3838-dfc8-3b43-a28c0304660f.png)

同構成をJOSMで行う場合の構成設定画面は以下となります。

![スクリーンショット_2013-06-21_9.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/9928/5a790637-7abe-4b65-1d85-7938bdf2b67a.png)

1. リレーション自体へのタグ付け
2. リレーションメンバー
3. リレーションメンバーに割り振られるロール
4. リレーションメンバー同士の接合状態

### 1. リレーション自体へのタグ付け
そのリレーション自体へのタグづけが行われています。

リレーションへのタグづけでは **type** というタグが必ず使用されており、その内容で、そのリレーションがどのような役割を持つかが判別されます。代表的な typeタグには、以下があります。

|Type名称|概要|
|:-------|:------|
|multipolygon|エリア内に空洞部分を作成|
|route|国道や県道などの道路、バスなどのをまとめる|
|site|1つの施設内に存在する複数の地物をまとめる|
|public_transport|公共交通機関の経路をまとめる(routeの拡張版)|
|boundary|市町村や都道府県などの行政境界、飛び地を表現|

[Types of relation](http://wiki.openstreetmap.org/wiki/Types_of_relation)

リレーションメンバーの構成やロールなど、他情報のタグづけ方法が異なります。
詳しくはそれぞれのWikiページを参照してください。

## 2. リレーションメンバー
リレーションを構築する際は、既存のNodeやWayを **メンバー(member)**として登録させます。

## 3. リレーションメンバーに割り振られるロール
リレーションに参加しているメンバーには、それぞれ固有のロール(Role, 役割)が割り当てられます。
このロールはリレーションのtype毎に異なり、固有のWikiページで解説が行われています。

![リレーションメンバー.png](https://qiita-image-store.s3.amazonaws.com/0/9928/51b62823-3525-a294-b6d1-ce614fa94628.png)

例えば、マルチポリゴン・リレーションを使用する際には、メンバーに対して以下のロールを使用するよう、定義されています。

|ロール名称|概要|
|:-------|:------|
|outer|このロールが割り当てられたウェイが、マルチポリゴン**外側**の円周であることを意味する 
|inner|このロールが割り当てられたウェイが、マルチポリゴン**内側**の円周であることを意味する

## 4. リレーションメンバー同士の接続状態
登録されたリレーションメンバーはリスト状に表示され、そのリストでの並び順にも意味が付与されています。

また、特に道路などのWayを登録する際には、地図上で隣接しているWayが、リレーションメンバーのリスト上でも連続した順番で登録されていることが重要となります。

# 参考情報
* [OSM + 路線バス by kim_upsilon](http://www.slideshare.net/kim_upsilon/osm-15970518)
特定Hostだけデフォルト認証方式をパスワード認証にする

# ~/ssh/config を設定する
githubなどを利用していると、
~/.ssh/ 以下に公開鍵を登録することになりますが、そうすると
端末からssh接続をするときのデフォルト認証が鍵認証になり、
パスワードでsshログインしたいHostにも初回だけ鍵認証を行ってしまうことがあったので、その対策です。

最初からパスワード認証で接続したい場合は、
configを下記のように設定するとOKです。

```:~/.ssh/config
Host xxx.xxx.xxx
  PubkeyAuthentication no
```
これだけで最初からパスワードが聞かれます。

サーバのsshd_configを下記のようにしていて、
1回認証失敗しただけで切断されてしまう場合に有効だと思います。

```:/etc/ssh/sshd_config
MaxAuthTries 1
```

# 参考
http://www.unixuser.org/~euske/doc/openssh/jman/ssh_config.html
UITabBarControllerとloadViewとtabBar

覚え書き？

# おまかせself.view
```objc:
- (void)loadView
{
  [super loadView];
  NSLog( @"tabBar=0x%08x", (unsigned)self.tabBar );
}
```

```text:
tabBar=0x0a2b6900
```


# 自前self.view
```objc:
- (void)loadView
{
  self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
  NSLog( @"tabBar=0x%08x", (unsigned)self.tabBar );
}
```

```text:
tabBar=0x00000000
```

tabBarが無い‥。
Engine Yard Cloud上のPHPでNew Relicを使う

RubyであればGemで簡単に導入できるNew Relicですが、PHPの場合は今のところChefのカスタムクックブックを使って導入します。
PHPアプリケーションであってもRailsと同様にクエリのパフォーマンス解析やコントローラー単位でのトラッキング可能です。

![candycane_-_New_Relic.png](https://qiita-image-store.s3.amazonaws.com/0/10032/e4610f0a-01b7-5f86-f78a-7eb8f752e157.png)

ステップは下記の通り。

* PHPのアプリケーションを作成
    * 通常どおりPHPアプリケーションを作成します。
* New Relicを導入したいEnvironmentでアドオンを追加
    * ダッシュボードで各Environmentのページの一番下の部分にアドオン追加へのリンクがあります。
* カスタムクックブックの導入
    *  **2013/8/13のアップデートによりこちらのカスタムクックブックは不要になりました。**
    * Ben Chapman氏が作成したクックブックでNew RelicのRPMの導入が自動化されます。
    * https://github.com/engineyard/ey-cloud-recipes-chef-10/tree/nr-support
    * 他のクックブックと併用する場合は cookbooks/newrelic をコピーして利用します。

<pre>
$ git clone https://github.com/engineyard/ey-cloud-recipes-chef-10.git
$ cd ey-cloud-recipes-chef-10
$ git checkout nr-support
$ ey recipes upload -e={環境名}
$ ey recipes apply -e={環境名}
</pre>
* モニタリング用デーモンの起動
    * モニタリング用のデーモンの起動はクックブックでは(敢えて？)行なっていません。手動でアプリケーション監視デーモンとサーバ監視デーモンを起動します。なお起動台数はNew Relicのライセンスに関係するので注意が必要です。

<pre>
#アプリケーション監視
$ sudo /etc/init.d/newrelic-daemon start
# サーバ監視
$ sudo /etc/init.d/newrelic-sysmond start
</pre>

まずは導入後の14日間の無料トライアルでフルの機能を利用し、その後は必要に応じて課金される形です。大量に導入する際はボリュームライセンスもあります。
またモバイルアプリからのパフォーマンス監視や例外などのイベント確認も可能です！

![8441_10201230812231680_363776219_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/10032/f58e31c7-5df7-3864-4cda-032119bb0238.jpeg)
JavaScriptでMethodMissing


Rubyの `method_missing` 的なことをJavaScriptではできないのかなと思って調べたら、FIrefoxでは `obj.__noSuchMethod__` というのが実装されているらしい。

ということで使ってみた

```js:method_missing.js
var obj = {};

obj.__noSuchMethod__ // undefined

// 第一引数に呼びだそうとした関数の名前、 第二引数に渡した引数が配列で入る
obj.__noSuchMethod__ = function(id, args){
	console.log( id, args );
}

obj.hoge("argument!");  // hoge ["argument!"]

```

使うか、といわれると使わないなぁ… (他のブラウザでは実装もされてないし)
UnityでOpenCVを使う(iOS編)

#UnityでOpenCVを使う(iOS編)

UnityでOpenCVを使う手順をまとめます。iOS編です。
iPhoneやiPadのカメラからキャプチャした映像にリアルタイムで画像処理を行うサンプルを作ってみましょう。Unity無償版で動作させることができます。

##OpenCVフレームワークの用意
はじめにiOS向けOpenCVのフレームワークを用意します。
フレームワークの作成方法はこちらを記事が参考になります。
[OpenCV for iOSの使い方](http://qiita.com/shu223/items/3ff48a8bd6edd910e780)

##Unity側の準備
シーンにPlaneを追加し、以下のスクリプトを割り当てます。
Planeが正面から見えるようにカメラの位置を適当に調整してください。
WebCamTextureでカメラ映像を取得しUpdateTexture関数でピクセルデータを更新します。
UpdateTexture関数はNativePluginで用意します。

```csharp:imageProcessing.cs
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class imageProcessing : MonoBehaviour {
	
	[DllImport ("__Internal")]
	private static extern void UpdateTexture(System.IntPtr colors, int width, int height);
	
	WebCamTexture webcamTexture;
	Texture2D texture = null;
	
	// Use this for initialization
	void Start () {
		WebCamDevice[] devices = WebCamTexture.devices;
		if (devices.Length > 0) {
			webcamTexture = new WebCamTexture(devices[0].name ,320, 240, 10);
			webcamTexture.Play();
		}		
	}
	
	// Update is called once per frame
	void OnGUI() {
		Color32[] pixels = webcamTexture.GetPixels32();
		GCHandle pixelsHandle = GCHandle.Alloc(pixels, GCHandleType.Pinned);
		UpdateTexture(pixelsHandle.AddrOfPinnedObject(), webcamTexture.width, webcamTexture.height);
		if (texture) Destroy(texture);
		texture = new Texture2D(webcamTexture.width, webcamTexture.height);
        texture.SetPixels32(pixels);
        texture.Apply();
		pixelsHandle.Free();
		renderer.material.mainTexture = texture;
	}
}
```

##Native Pluginの準備
Assetsフォルダの下にPlugins/iOSフォルダを作成し、iOSフォルダの中にimageProcessing.cppという名前でファイルを作成します。

![スクリーンショット 2013-06-21 13.08.36.png](https://qiita-image-store.s3.amazonaws.com/0/26034/3e9ac4b8-c0b0-ff7a-562a-5296304880a4.png)

UpdateTextureという名前で、ピクセルデータと画像の幅高さを引数に取る関数を作ります。

```cpp:imageProcessing.cpp
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

extern "C" {
  void UpdateTexture(char* data, int width, int height);
} 

void UpdateTexture(char* data, int width, int height)
{
    IplImage* p = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 4);
    cvSetData(p, data, p->widthStep);
    IplImage* g = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
    cvCvtColor(p, g, CV_RGBA2GRAY);
    cvCanny(g, g, 50.0, 200.0);
    cvCvtColor(g, p, CV_GRAY2RGBA);
    cvReleaseImageHeader(&p);
    cvReleaseImage(&g);
}
```
UpdateTexture関数では、ピクセルデータ格納用のIplImageを用意し
引数で渡ってきたピクセルデータをセットした後、
グレースケール化し、cvCannyでエッジ抽出を行っています。

#XCodeプロジェクトへのOpenCVフレームワークの追加
Unityでビルドし、XCodeプロジェクトを開きます。OpenCVフレームワークを追加します。

![スクリーンショット 2013-06-21 13.28.26.png](https://qiita-image-store.s3.amazonaws.com/0/26034/6919e64a-1fc9-a663-c236-9ee880175b19.png)

#実行
実行すると、カメラからキャプチャした映像にリアルタイムでエッジ抽出を行います。
320x240の画像サイズの場合で、iPhone5で12〜13FPS程度でした。

![IMG_0065.PNG](https://qiita-image-store.s3.amazonaws.com/0/26034/8a3800ea-644c-450a-9893-18605a4cca59.png)
SCPの条件

## SCPコマンドが叩けないとき
###SCPコマンドを叩いて、コマンドが存在しないといわれた場合。
`openssh-clients`が入っているか確認。⇒入っていない：入れてください。
↓
入っている：受信側に`openssh-clients`が入っているか確認。

どうやら送信側だけ`openssh-clients`が入っていてもだめらしい。
受信側にも必要みたい。
複数のUIAlertViewを使う時のclickedButtonAtIndex

.hに必要なUIAlertViewを書いておく

    UIAlertView *firstAlert;
    UIAlertView *secondAlert;

アラートを呼び出すところに

    firstAlert = [[UIAlertView alloc] initWithTitle:@"タイトル" message:@"メッセージ" delegate:self cancelButtonTitle:@"いいえ" otherButtonTitles:@"はい", nil];
    [firstAlert show];

デリゲートメソッドclickedButtonAtIndexを使う

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
        if(firstAlert == alertView){
            switch (buttonIndex) {
                case 0:
                    NSLog(@"firstAlertのいいえをクリックしました");
                    break;
                case 1:
                    NSLog(@"firstAlertのはいをクリックしました");
                    break;
            }
        } else if(secondAlert == alertView){
            switch (buttonIndex) {
                case 0:
                    NSLog(@"secondAlertのいいえをクリックしました");
                    break;
                case 1:
                    NSLog(@"secondAlertのはいをクリックしました");
                    break;
            }
        }
    }
iPhoneでオレオレ証明を使ったSSL通信を行えるようにする

iPhoneでは標準ではオレオレ証明でのSSL通信はできませんが、

NSURLRequestのprivateメソッドallowsAnyHTTPSCertificateForHost:をオーバーライドすることで対応
NSURLRequest+SSL.hと NSURLRequest+SSL.mのカテゴリを用意します。

NSURLRequest+SSL.m

```objc:
@implementation NSURLRequest(SSL)
//SSLの自己証明書の場合に通信できないのを防ぐ。Privateなメソッドなのでリリースしてはいけない
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host {
return YES;
}
@end
```

**PrivateなメソッドなのでRelaseビルドに含めないように注意してください。**

NSURLRequestのメソッドなのでGTMHttpFetcherも問題なくアクセスできるようになりました。
cookie付きのcurl

まずはcookie情報を.txtで作成する

```cookie.txt
example.com  FALSE   /       FALSE   1391698800      key      value
```

作成したcookie情報でcurlしてみる

    $ curl -b cookie.txt http://example.com/

もし example.com/?aaa=111&bbb=222 みたいに複数のパラメータをもつ場合は

    $ curl -b cookie.txt -X GET http://example.com/?aaa=111\&bbb=222

注意: &はエスケープする必要がある
UIWebViewのスクロール速度を上げる

UIWebViewのスクロールはUITableViewのスクロールに比べて遅いです。

実はこれUIWebViewが重いのではなくて、そういう設定になっているのです。
デフォルトでは UIWebView 内の UIScrollView の decelerationRate が UIScrollViewDecelerationRateFast に設定されています。
それを UIScrollViewDecelerationRateNormal に変更すれば良いです。
幸いiOS5からはUIWebView 内のUIScrollViewがプロパティとして追加されたため
以下のようにするだけでスクロールの滑りがUITableViewのデフォルトと同等になります。

```objc:
self.webView.scrollView.decelerationRate = UIScrollViewDecelerationRateNormal
```
国際化対応 (I18n API)に関するメモ〜ビューと辞書ファイルの書き方〜

ビューヘルパー「t」を用いる

| 構文 tメソッド |
| :------------------|
| t(key [,opts])    |
| *key*:辞書キー（文字列、またはシンボルで指定）　*opts*:動作オプション（「：名前 => 値」 等） |

例1：通常の記法
// ビュー

```erb:test1.html.erb
<%= t('helpers.link.back') %>
```

// 辞書ファイル

```yaml:jp.test1.yml
ja:
　helpers:
　　link:
　　　back: "Back"
```

ーーー
例2：テンプレート単位に設定ファイルの階層を設けた場合
// ビュー（頭のドット(.)が必須。）

```erb:test2.html.erb
<%= t('.back') %>
```

// 辞書ファイル(コントローラ名->アクション名->キー名)

```yaml:jp.test2.yml
ja:
　top:
　　index:
　　　back: "Back"
```

※前提として、アプリケーションの設定ファイルを「:ja」にしていること

```rb:application.rb
config.i18n.default_locale = :ja
```
AngularJSのテンプレートで表示切替とかしたい

コメントを頂いて、すごくスマートなやり方が分かった！
ng-classを使えばよいとのこと。ありがとうございます！

```html:HTML
<!--書き方メモ-->
<ul ng-repeat="item in contents">
    <li ng-class="{'適用したいclass名': 条件式 }">{{item.text}}</li>
</ul>

<!-- valueがbadのものだけclass="blue"を適用 -->
<ul ng-repeat="item in contents">
    <li ng-class="{'blue': item.value == 'bad'}">{{item.text}}</li>
</ul>

<!-- indexが奇数の要素は非表示、あと他のclassも併用 #そんなに出番ない -->
<ul ng-repeat="item in contents">
    <li ng-class="{'hidden': !($index%2 == 0)}" class="blue">{{item.text}}</li>
</ul>
```

併用はng-classの中に一緒にいれたら怒られたのでこんな感じでいいのかな。
あと、下記の何かもっと極端な出しわけとかのときのif文くらいかな...？
そんなに出番はないかも...一応流れの補完に残しておきます。

昔のやつ↓
- - -
ここを参考にしつつ！： http://d.hatena.ne.jp/puruhime/20120730

もっと賢い方法はあるかもしれないけど、とりあえずこんな感じでやってみた
ng-classとか使うともうちょっとスマートになるのかな...？
とにかくモデルの値に応じてレイアウトを柔軟に切り替えたかった。

```js:test.js
//適当なcontroller内にて
//こんなjsonオブジェクトを$scope.contentsに入れて渡す
//ミスってるかも
$scope.contents = [
{
	"value":"nice",
	"text":"(｀・ω・´)"
},
{
	"value":"bad",
	"text":"(´・ω・｀)"
},
{
	"value":"good",
	"text":"(　´∀｀)bｸﾞｯ!"
}
];
```

```html:HTML
<!-- valueがbadのものだけclass="blue"を適用 -->
<ul ng-repeat="item in contents">
    <li class="{{( (item.value == 'bad') && 'blue' ) | '' }}">{{item.text}}</li>
</ul>

<!-- 先頭のliだけclass="active"にする -->
<ul ng-repeat="item in contents">
    <li class="{{( ($index == 0) && 'active' ) | '' }}">{{item.text}}</li>
</ul>
```

特定の要素だけ隠したいとかはhiddenを指定して嬉しくなったりしていました。
\#時間無いときに適当に書いたのでもうちょっと例を具体的にしないとだめかも
\#もっとスマートなやりかたがあるかも
scalaプラグインを入れたIntelliJでREPL(scala console)を使う。あと動かなかった時の対処法。

## REPL(scala console)の起動のしかた
Run -> Edit Configurations... -> + -> Scala Console
でScala Consoleを追加して、
![スクリーンショット 2013-06-21 12.27.10.png](https://qiita-image-store.s3.amazonaws.com/0/94/e33db012-cfdb-dbf6-5442-bcebdc39c163.png)
ここで追加したやつを選択、▶をクリック。画面下でconsoleが開く。

## 起動したけど動かないよ？
入力を確定させる方法がEnterではなく⌘ + Enter。これはハマる。
それ以外の原因で動かないのは知らない。

## Reference
* [ide - Scala console won't work, IntelliJ - Stack Overflow](http://stackoverflow.com/questions/14677285/scala-console-wont-work-intellij)
* [IntelliJ IDEA: REPL window? | The Scala Programming Language](http://www.scala-lang.org/node/4608)
Emacsのcalendarで日本の祝日を表示する

GNU emacsのcalendarは様々な祝日が登録されていて面白いが、実際に表示させると祝日だらけでわかり辛い。

>
2013.3.20: Vernal Equinox 20:01 (JST)
2013.3.21: Bahá'í New Year (Naw-Ruz) 170
2013.4.21: First Day of Ridvan
2013.4.29: Ninth Day of Ridvan
2013.4.29: 昭和の日
2013.5.2: Twelfth Day of Ridvan
2013.5.3: 憲法記念日
2013.5.4: 国民の休日
2013.5.5: こどもの日
2013.5.23: Declaration of the Báb
2013.5.29: Ascension of Bahá'u'lláh

そこで、日本の祝日を`holiday-local-holidays`に登録し、それだけを表示させるようにした。

```el:.emacs.d/init.el
(require 'solar)
(setq holiday-general-holidays nil
      holiday-local-holidays t
      holiday-solar-holidays nil
      holiday-bahai-holidays nil
      holiday-christian-holidays nil
      holiday-hebrew-holidays nil
      holiday-islamic-holidays nil
      holiday-oriental-holidays nil
      holiday-other-holidays nil
      mark-holidays-in-calendar t)
(setq holiday-local-holidays
      '((holiday-fixed 1 1 "元日")
	(holiday-float 1 1 2 "成人の日")
	(holiday-fixed 2 11 "建国記念の日")
	(holiday-sexp '(map 'list 'truncate (solar-equinoxes/solstices 0 year)) "春分の日")
	(holiday-fixed 4 29 "昭和の日")
	(holiday-fixed 5 3 "憲法記念日")
	(holiday-fixed 5 4 "みどりの日")
 	(holiday-fixed 5 5 "こどもの日")
	(holiday-float 7 1 3 "海の日")
	(holiday-float 7 1 3 "敬老の日")
	(holiday-sexp '(map 'list 'truncate (solar-equinoxes/solstices 2 year)) "秋分の日")
	(holiday-float 10 1 2 "体育の日")
	(holiday-fixed 11 3 "文化の日")
	(holiday-fixed 11 23 "勤労感謝の日")
	(holiday-fixed 12 23 "天皇誕生日")
))
```

2013年6月現在の[国民の祝日に関する法律](http://law.e-gov.go.jp/htmldata/S23/S23HO178.html)に準拠している。
春分と秋分の計算にsolar.elを使用している。なお、春分の日と秋分の日は、国立天文台「暦象年表」に基づき閣議決定され、前年2月1日頃に官報で暦要項として公告されるものなので([wikipedia](http://ja.wikipedia.org/wiki/春分の日#.E6.97.A5.E4.BB.98))、この計算と違う日になる可能性がある。
振替休日はÀ faireということで。
Laravel3 バンドルの Swift Mailer をバンドルディレクトリのファイルを変更せずにSMTPでメールを送信する

バンドルディレクトリの中にあるファイルは直接編集したくないが、メーラーオブジェクトの取得を $mailer = IoC::resolve('mailer') でしたい人向け。

start.php なり routes.php なりに以下のコードを追加します。

```php:
Bundle::start('swiftmailer');
IoC::unregister('mailer.transport');
IoC::register('mailer.transport', function()
{
    return Swift_SmtpTransport::newInstance('SMTPサーバ, 'ポート番号', '暗号方式')
                ->setUsername('ユーザ名')
                ->setPassword('パスワード');
    });
```

$mailer = IoC::resolve('mailer') で呼び出すよりも前に IoC::unregister() しなければいけない。その上、バンドルもスタートされてなければいけないので、 start.php など早い段階で実行されるファイルで Bundle::start() をつかって明示的にバンドルを開始しするのがポイント。
apacheのrequest_dateをawkでdatetimeフォーマット形式を変換する


awkって便利ですよね。
apacheログのrequest_dateって以外と自力でパースすると面倒臭っかたのでメモ
（正規表現は自信がないのでこっちのほうがはやんいじゃねぇ？）ってツッコミ大歓迎です。


```shell:access_log.awk
{
    request_date = $4 $5
    #両端にある[]を除去する
    req_length = length(request_date);
    request_date = substr(request_date, 2, req_length)
    request_date = substr(request_date, 1, req_length - 2 )
    #print request_date

    split(request_date, arr, "/");
    day = arr[1]
    month = arr[2]
    #月の英字月を数字に変換
    sub(/(January|Jan|JANUARY|JAN)/, "01", month)
    sub(/(February|Feb|FEBRUARY|FEB)/, "02", month)
    sub(/(March|Mar|MARCH|MAR)/, "03", month)
    sub(/(April|Apr|APRIL|APR)/, "04", month)
    sub(/(May|MAY)/, 05, month)
    sub(/(June|Jun|JUNE|JUN)/, "06", month)
    sub(/(July|Jul|JULY|JUL)/, "07", month)
    sub(/(August|Aug|AUGUST|AUG)/, "08", month)
    sub(/(September|Sep|SEPTEMBER|SEP)/, "09", month)
    sub(/(October|Oct|OCTOBER|OCT)/, "10", month)
    sub(/(November|Nov|NOVEMBER|NOV)/, "11", month)
    sub(/(December|Dec|DECEMBER|DEC)/, "12", month)

    split(arr[3], arr2, ":");
    year = arr2[1]
    hour = arr2[2]
    minute = arr2[3]
    split(arr2[4], arr3, "+")
    second = arr3[1]
    request_date = year "-" month "-" day " " hour ":" minute ":" second
}
{
    method = $6
    path = $7
    code = $9
}
#tsvだとimportとかしやすいのでお好みで
{print request_date "\t" method"\t"path "\t"code}
```

使い方

```shell
#画像,css,jsは除外してます
cat -r /path/to/access_log | grep -v .jpg | grep -v .png | grep -v .gif | grep -v .css | grep -v .js | awk -f access_log.awk
```
node.jsでTCP/IPプロクシサーバー

シンプルなTCP/IP proxy serverです。
httpやsmtpなどを中継できます。

```js:tcp_proxy.js
var util = require('util');
var net = require("net");
 
process.on("uncaughtException", function(e) {
	console.log(e);
});
 
if (process.argv.length != 5) {
	console.log("引数が正しく入力されていません:" + " <proxy_port> <target_host> <target_port>");
	console.log("example:node tcp_proxy.js 3000 www.google.com 80");
	process.exit();
}

var proxyPort = process.argv[2];
var targetHost = process.argv[3];
var targetPort = process.argv[4];
 
net.createServer(function (proxySocket) {
	var connected = false;
	var buffers = new Array();
	var targetSocket = new net.Socket();
	targetSocket.connect(parseInt(targetPort), targetHost, function() {
		connected = true;
		if (buffers.length > 0) {
			for (i = 0; i < buffers.length; i++) {
				console.log(buffers[i].toString());
				targetSocket.write(buffers[i]);
			}
		}
	});
 
	proxySocket.on("error", function (e) {
		targetSocket.end();
	});
	targetSocket.on("error", function (e) {
		console.log("targethostに接続できません " + targetHost + ', port ' + targetPort);
		proxySocket.end();
	});
 
	proxySocket.on("data", function (data) {
		console.log("send: "+data.toString()); //送信データ
		if (connected) {
			targetSocket.write(data);
		} else {
			buffers[buffers.length] = data;
		}
	});
	targetSocket.on("data", function(data) {
		console.log("rec: " + data.toString());  //受信データ
		proxySocket.write(data);
	});
 
	proxySocket.on("close", function(had_error) {
		targetSocket.end();
	});
	targetSocket.on("close", function(had_error) {
		proxySocket.end();
	});
 
}).listen(proxyPort)
```

使い方

```bash:
$ node tcp_proxy.js [プロキシポート] [ターゲットホスト] [ターゲットポート]
```
グローバルIP、プライベートIPだけを出力するワンライナー

グローバルIP
`/sbin/ifconfig eth0 | grep "inet addr:" | cut -f2 -d : | cut -f1 -d " "`

プライベートIP
`/sbin/ifconfig eth1 | grep "inet addr:" | cut -f2 -d : | cut -f1 -d " "`

chefでのサーバ自動構築を試している時に、
欲張って別のミドルウェアサーバへの接続も自動化できないか、と試みたときに作ったものです。
結局そこまで手が回らなかったのですが、何かの折に役に立てば。
Sublime Text2（自分用メモ）

## まずはVintage ModeをOnにする。
Settings - Default の "ignored_packages": ["Vintage"] をコメントアウトする。
Settings - User の "ignored_packages": ["Vintage"] をコメントアウトする。

## Vintage Modeのデフォルトの設定を弄る。
デフォルトだとInsert-Modeで開始、Ctrl+Fとかのキーバインドが競合してたりするので、これを修正する。
Settings - User に下記の2つを追加する。

* "vintage_start_in_command_mode":true,
* "vintage_ctrl_keys":true,

## Key Bindings - User に以下を追加

* { "keys": ["ctrl+l"], "command": "show_at_center" }	

## 課題？
dotfilesみたいな感じにGitHub辺りで設定を管理する方法ないかなー
console.log()でオブジェクトを出力するときにラベルをつける方法

別のエントリで紹介し忘れてた書き方を紹介します。
[[Chrome] console.log()の色々な書き方](http://qiita.com/nakajmg/items/0a27c6642268243c8eef)

### JavaScriptオブジェクトをconsoleに出力する

```js:
var obj = {
	hoge : "hoge",
	huga : "huga"
};

console.log(obj);
```
と書くとコンソール上にはこう表示されます。

```:console
Object
  hoge: "hoge"
  huga: "huga"
__proto__: Object
```

### 複数オブジェクトを出力するとき

出力するのが1個ならいいんですが、出力したいオブジェクトが複数あるとき、どこで出力したものかわかるようにこんな書き方をするときがあると思います。

```js:
console.log('objの出力');
console.log(obj);
```
複数行使ってしまうので数が多いとこれでも見づらいかもしれません。
ワンライナーで識別子をつけようと思って`console.log(obj + 'objの出力');`と書くと加算処理がされて謎のオブジェクトになります。

## %Oで出力する

[[Chrome] console.log()の色々な書き方](http://qiita.com/nakajmg/items/0a27c6642268243c8eef)のエントリで紹介した書き方で%sや%dでの指定があったのですが、オブジェクトは**%O**で出力できます。

```js:
console.log('%O', obj);
```
この書き方だと第一引数が文字列なので好き勝手に書けます。

```js:
console.log('objの出力だぞ！ %O', obj);
```
と書くとconsole上には

```
objの出力だぞ！ Object
				hoge: "hoge"
				huga: "huga"
				__proto__: Object
```

と表示されます。
地味に便利。

__※ コメントで別の書き方をいただいたので追記__

```js:
console.log('objの出力だぞ！', obj);
```
+するんじゃなくて第2引数にすることで出力できます。
出力の表示が微妙にちがっていて

```
objの出力だぞ！ Object {hoge: "hoge", huga: "huga"}
```
とルートレベル？にある要素が横に展開されます。(__proto__プロパティは見えない)

オブジェクトのネストが1段階深くなると表示が変わります。

```js:
var obj = {
	hoge : "hoge",
	huga : "huga",
	hogehuga:{
		aaa : "aaa",
		bbb : "bbb"
	}
};
console.log('objの出力だぞ！', obj);
```
出力は

```
objの出力だぞ！ Object {hoge: "hoge", huga: "huga", hogehuga: Object}
				hoge: "hoge"
				hogehuga: Object
				huga: "huga"
				__proto__: Object
```
となります。

### 合わせ技で

console.log()はStyleの指定もできるので合わせて使うともう少しわかりやすくできます。

```js:
var sty = "color:red;background-color:black;";
console.log('%cobjの出力だぞ！ %O', sty, obj);
// or
console.log('%cobjの出力だぞ！', sty, obj);
```
と書くと`objの出力だぞ！`の部分に`sty`で指定したスタイルが適用されて黒背景の赤文字で表示されます。

console便利。

---

参考URL：[Console API Reference](https://developers.google.com/chrome-developer-tools/docs/console-api#consolelogobject_object)
node, socket.ioを使ったウェブアプリをherokuにアップロードした時につまずいたところメモ

# Abstract
最近nodeを触り始めて、簡単なものを作ってローカルで動いたからherokuで動かそうとしたら割りとはまったのでメモっておく

# Condition
前提として、node, socket.io, heroku等の公式サイトのマニュアルとか見ながらlocalhostで動くものが出来上がり、それをそのまま `git push heroku master` してサーバにファイルをアップロードしたが割り当てられたURLにアクセスしても動かない、という状況から原因をつぶしていく。

# Content

## Procfile

最初作ったウェブページにアクセスすると↓のようなメッセージが表示された。

``` 
Application Error
An error occurred in the application and your page could not be served. Please try again in a few moments.

If you are the application owner, check your logs for details.
```

ぐぐったら、herokuでサーバ動かす時Procfileなるものが必要らしい。
https://github.com/herokaijp/devcenter/wiki/procfile
で、以下の記述の `Procfile` というファイルをリポジトリルートディレクトリに置く。

``` 
web: node app.js
```

しかしまだ動かない。

## サーバを起動してない

`git push heroku master` したら勝手にサーバ起動してくれるのかと思ってたけどそんなことはなかった。

``` 
heroku ps:scale web=1
```

でサーバの起動。これで上記エラーは消えて、ぱっと見動くように見えた。が、実際に動かしてみても動かない。

## localhost直書き
お前は馬鹿か
`git grep localhost` して見つかったところを `location.origin` とかに置き換える。
まだ直らない。

## socket.io動かない
↓こんなエラーが出てた（恥ずかしいのでurlは変えてある）

``` 
WebSocket connection to 'ws://xxx.herokuapp.com/socket.io/1/websocket/RUaEEiZKh3HC5AUAuHte' failed: Unexpected response code: 503 
```

ぐぐったらこれに行き当たった。
https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku
ので、このドキュメント通りに

``` 
io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10); 
});
```

を追加した。

やっと動いた。

# Reference
* [第5回　Node.jsアプリケーションをHerokuで動かす：基礎から学ぶNode.js｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/nodejs/0005http://gihyo.jp/dev/serial/01/nodejs/0005)
* [Node.js + Express を Heroku で動かすまでの手順まとめ - tacamy memo](http://tacamy.hatenablog.com/entry/2013/02/16/235127)
* [procfile · herokaijp/devcenter Wiki](https://github.com/herokaijp/devcenter/wiki/procfile)
* [Using Socket.IO with Node.js on Heroku | Heroku Dev Center](https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku)
tmux上でdotjsをインストールする時の罠

dotjsとは？
---

dotjsはGithubberの[defunkt](https://github.com/defunkt)さんが開発しているプロジェクトです。
dotjsをインストールすると`~/.js`に配置されたjsを、専用のChrome extensionで動作させます。

インストールの仕方は下記のREADMEの通りです。
https://github.com/defunkt/dotjs

tmux上でインストールを行うと...
---

```zsh:
Could not open job overrides database at: /private/var/db/launchd.db/com.apple.launchd/overrides.plist: 13: Permission denied
```

と表示されてインストール出来ません。

そこで、下記のissueに載ってある様に **Terminal.app** でインストールを行うと問題なくインストール出来ました。
https://github.com/defunkt/dotjs/issues/86

:D
意外と知らないChrome Developer Toolsの便利な機能

参考資料がすべて英語なので、日本語で情報がまとまってる場所が欲しいと思いこの記事を作りました。「俺もっと便利な機能知ってるぜ！」「こういうことできないの？」って思った人はコメント/編集リクエストをくれると僕の幸せのステージがどんどん上がります。

## DevToolsの起動するショートカットキーは？
### 開くだけ
F12, Ctrl + Shift + I (Win, Linux)
Opt + Cmd + I (Mac)
### 要素の検証(Inspect Element)と同じ状態で開く
Ctrl + Shift + C (Win, Linux)
Shift + Cmd + C (Mac)
### Consoleタブが開いた状態で開く
Ctrl + Shift + J (Win, Linux)
Opt + Cmd + J (Mac)

## DevToolsって下じゃなくて右に持ってこれないの？
Dock To Right
![docktoright.gif](https://qiita-image-store.s3.amazonaws.com/0/15757/155994c2-102e-e546-8cf9-51e1a73316ad.gif "docktoright.gif")

## 名前が分かってるファイルを開きたい
Ctrl + O (Win, Linux)
Cmd + O (Mac)
![openfile.gif](https://qiita-image-store.s3.amazonaws.com/0/15757/8b1ef412-f868-59b8-3feb-2ea14b353ea9.gif "openfile.gif")


## DevTools上で編集したコードを保存
（あとで書く）

## DevTools上でいろいろ編集したけどどこをどう変えたかわかんなくなっちゃった
Local Modifications系
（あとで書く）

## Webページ上の今いるファイル内検索
Ctrl + F (Win, Linux)
Cmd + F (Mac)

## Webページ上のすべてのファイルを横断検索
Ctrl + Shift + F (Win, Linux)
Cmd + Opt + F (Mac)

## ページを行き来してもNetworkタブで表示しているリクエストのリストを保持し続けたい
NetworkタブではHTTPリクエストが表示されるが、ページのリロードがかかるとこの内容がクリアされてしまう。「Preserve Log upon Navigation」ボタンを押すと、もう一度押すまでの間のHTTPリクエストを、たとえリロードがかかっても、どんどん貯めることができる。

## DOMエレメントに簡単アクセス

![Screen_Shot_2013-07-04_at_6.06.00_PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/a1c371da-1bc6-648c-70de-0f6476b424a4.png)

コンソールで一時的に何かをしたいときに、DOMエレメントにいちいち `getElementById` とかでアクセスするのは非常に面倒です（idやclassが割り振られていない場合などは特に）

DevToolsでは選択している要素に `$0` でアクセスすることができます。また、選択要素を変更した場合も `$N` でNつ前に選択していた要素にアクセスできます。

## 参考資料
- https://developers.google.com/chrome-developer-tools/
- http://anti-code.com/devtools-cheatsheet/
- http://www.youtube.com/watch?v=bqfoYaKCYUI&list=SP055Epbe6d5avZGXwE5u039VQq_oQFgrc&index=5
VolleyでDigest認証やってみた

HTTPライブラリ[Volley](https://android.googlesource.com/platform/frameworks/volley/)でDigest認証を実装してみたという話。誰得感は否めない。

# 基本的な流れ

1. リクエストキューにリクエストを追加する。リクエスト(`Request<T>`を継承したやつ)にはリトライポリシー(`RetryPolicy`を継承したやつ)を仕込んでおく(`Request<T>#setRetryPolicy()`)。
2. 401が返ってくる。この時、`RetryPolicy#retry()`が呼ばれるので、そこで401と一緒に受け取る`WWW-Authenticate`ヘッダのパラメータを`DigestScheme#processChallenge()`に渡す
3. ユーザ名とPWを`DigestScheme#authenticate()`に渡して`Authorization`ヘッダを作る。
4. オーバライドした`Request<T>#getHeaders()`の中で`Authorization`ヘッダを追加する。

Digest認証やVolley内部の処理の流れなど細かいことは[ブログ](http://akihito104.hatenablog.com/entry/2013/06/20/031813)に書きました。

2から4までをやるのが下記のコードです。

```MyRequest.java
public class MyRequest extends Request<JSONObject> {

// いろいろ略
// コンストラクタとかでDigestRetryPolicyを生成する

   @Override
   public Map<String, String> getHeaders() throws AuthFailureError {
      DigestScheme ds = new DigestScheme();
      ds.processChallenge(new BasicHeader("WWW-Authenticate",
                     mChallengeHeader.get("WWW-Authenticate"));
      Header header = ds.authenticate(credencials, request);

      Map<String, String> newHeader
                 = new HashMap<String, String>(super.getHeaders());
      newHeader.put(header.getName(), header.getValue());
      return newHeader;
   }

   private Map<String, String> mChallengeHeader;

   public void setChallengeHeader(Map<String, String> header) {
      this.mChallengeHeader = header;
   }

   class DigestRetryPolicy extends DefaultRetryPolicy {
      @Override
      public void retry(VolleyError error) throws VolleyError {
         if (error.statusCode == HttpStatus.SC_UNAUTHORIZED) {
            setChallengeHeader(error.networkResponse.header);
         } else {
            super.retry(error);
         }
      }
   }

}
```
How to test D project on Travis CI


Travis-CI supports D. No need this ad-hoc approach. See: http://blog.travis-ci.com/2014-12-10-community-driven-language-support-comes-to-travis-ci/

It's simple. Download dmd and run Makefile.

## .travis.yml

```yaml
language: d

install:
  - DMD_VERSION=2.062
  - wget http://ftp.digitalmars.com/dmd.${DMD_VERSION}.zip
  - unzip dmd.${DMD_VERSION}.zip

script:
  - DMD=./dmd2/linux/bin64/dmd MODEL=64 make -f posix.mak unittest

branches:
  only:
    - master
```

`script` depends on your build system. Travis CI uses 64bit environment, so you should use 64bit code generation.

## Makefile

Sample Makefile for above use-case. Use `?=` instead of `=` to assign variable from command line.

```make
# build mode: 32bit or 64bit
MODEL ?= $(shell getconf LONG_BIT)
DMD ?= dmd
NAMES = foo
FILES = $(addsuffix .d, $(NAMES))
SRCS  = $(addprefix src/, $(FILES))
LIB = libfoo.a
DFLAGS = -Isrc -m$(MODEL) -w -d -property -O -release -nofloat -inline

target: $(LIB)

$(LIB):
	$(DMD) $(DFLAGS) -lib -of$(LIB) $(SRCS)

MAIN_FILE = "empty_foo_unittest.d"

unittest:
	echo 'import foo; void main(){}' > $(MAIN_FILE)
	$(DMD) $(DFLAGS) -unittest -of$(LIB) $(SRCS) -run $(MAIN_FILE)
	rm $(MAIN_FILE)
```
YummyFTPのBookmarksをDropboxを使って複数のmacで共有する

## YummyFTP の Bookmarks を Dropbox を使って複数の mac で共有する

http://www.yummysoftware.com/faq#16

ようは Readme 読め。って事らしい。

とりあえず、今日の時点(2013-06-20)での方法をメモしとく。

エンジニアじゃない人も使ってそうなツールなので、コマンドを使わんくても出来るように書いてみる。

## インストール

Dropbox と YummyFTP をインストールしておく。

その後、両方共終了しておく。

なお、Dropbox は常駐も終了しておく。

## Bookmarks を Dropbox に保存する

以下のどっちかに「Bookmarks」ディレクトリがあるはず。

- Mac HD -> Users -> yourname -> Library -> Preferences -> Yummy FTP

- Mac HD -> Users -> yourname -> Library -> Application Support -> Yummy FTP

※ Ver の差らしい。

どっちのディレクトリか判明したら、 ./YummyFTP/Bookmarks/ と ./YummyFTP/Item Information Database/ を Dropboxの任意の場所にコピーする。

例えば、 /Users/(username)/Dropbox/application_data/YummyFTP/Bookmarks/ と /Users/(username)/Dropbox/application_data/YummyFTP/Item Information Database/ みたいに。

※Item Information Database ディレクトリが無い場合は、Dropbox側に作成してしまって良い気がする。

## エイリアスを作成する

Dropbox 上においた2つのディレクトリのエイリアスを作成する。

コマンド使える方はコマンドでつくる。

./Dropbox/application_data/YummyFTP/Bookmarks を選択して、ファイル＞エイリアス作成 (か、cmd+l)

すると「Bookmarks のエイリアス」というファイルが出来上がる。

同様に「Item Information Database のエイリアス」というファイルも作る。

## 作成したエイリアスを YummyFTP が元々の設定で使っていた場所に移動する

例えば、前述の Bookmarks の場所が「Mac HD -> Users -> yourname -> Library -> Preferences -> Yummy FTP」であったなら、「Mac HD -> Users -> yourname -> Library -> Preferences -> Yummy FTP -> Bookmarks のエイリアス」と「Mac HD -> Users -> yourname -> Library -> Preferences -> Yummy FTP -> Item Information Database のエイリアス」みたいに。

で、" のエイリアス"部分をリネームして"Bookmarks"に戻す。

## Dropbox 起動して YummyFTP 起動してみる。

起動してみる。

他の端末からも、同じように設定して起動してみる。

問題なく Bookmark が共有されてるはず。

これだけ。
はじめてのpython② pythonの特徴を調べつつコードを書いてみる

# 背景
「さわった事が無い言語でWebシステムを作ろう」というテーマの社内勉強会に参加する事になり、
pythonの調査を担当する事になったので、調べた内容をまとめてみる第二弾。前半は主にwikipediaからの抜粋。

# pythonとは
* オープンソースのオブジェクト指向スクリプト言語
* 2013/7/8時点の最新バージョンは3.3.2
* 公式サイト http://www.python.org/

# pythonの特徴
記法

* 文法の制約が強く、プログラムのスタイルがその書き手にかかわらずほぼ同じになる
* ブロック構造にインデントを用いる
* 一行80文字（あくまで推奨）

データ型

* データは動的に型付けされる。値自身が型を持っており、変数はすべて値への参照である
* リスト = 配列っぽい感じ
* タプル = 値の変更が出来ない配列っぽい。マップのキーとしても利用出来る

オブジェクト指向

* Pythonでは扱えるデータの全てがオブジェクトである

# 比べてみよう
前にRubyで書いた長女の算数問題Scriptをpythonで書きなおしてみた。書いてみた感想は以下。
（大したことやってないので、大した感想ではないですが・・・。随時書き足します。）

* ifやwhileにendがないのは個人的には見づらいなぁ（慣れ？）
* まぁしかしそんな書きづらさは無い感じ
* ただやっぱりRubyのほうが好き

```rb:keisan.rb
#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-
 
question_num = 10
score = 0
i = 0
 
while i < question_num do
  val1 = rand(10)
  val2 = rand(10)
 
  print "(#{i + 1}) "
  case rand(2)
  when 0
    print "#{val1} + #{val2} = "
    correct_ans = val1 + val2
  when 1
    if val1 >= val2
      print "#{val1} - #{val2} = "
      correct_ans = val1 - val2
    else
      print "#{val2} - #{val1} = "
      correct_ans = val2 - val1
    end
  end
 
  ans = gets.to_i
 
  if correct_ans == ans
    p "せいかいは#{correct_ans}"
    p "やったね！！"
    score += 1
  else
    p "せいかいは#{correct_ans}"
    p "ざんねん！！"
  end
  i = i + 1
end
 
p "あなたのてんすうは　#{((score.to_f / question_num.to_f) * 100).to_i}　てん！！"

````

```py3:keisan.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import random

question_num = 10
score = 0
i = 0

while i < question_num:
  val1 = random.randint(0,9)
  val2 = random.randint(0,9)
  operator_flg = random.randint(0,1)

  print("(" + str(i + 1) + ") ", end=&#39;&#39;)

  if operator_flg == 0:
     formula = str(val1) + " + " + str(val2) + " = "
     correct_ans = val1 + val2
  elif operator_flg == 1:
    if val1 >= val2:
      formula = str(val1) + " - " + str(val2) + " = "
      correct_ans = val1 - val2
    else:
      formula = str(val2) + " - " + str(val1) + " = "
      correct_ans = val2 - val1

  ans = input(formula)

  if correct_ans == int(ans):
    print("せいかいは " + str(correct_ans))
    print("やったね！！")
    score += 1
  else:
    print("せいかいは " + str(correct_ans))
    print("ざんねん！！")

  i += 1

print("あなたのてんすうは " + str(int(float(score) / float(question_num) * 100)) + "てん！！")

```
PHPでTwitter botの習作(1)

ギークハウス元住吉のごみ当番用Twitter botです。
ベースはこれです。
ツイッターボットを作る (全10回) - プログラミングならドットインストール  
<http://dotinstall.com/lessons/twitter_bot_php>

```php
<?php

require_once('twitteroauth/twitteroauth.php');

define('CONSUMER_KEY', //CONSUMER_KEYとかブログ用に省略。

$conn = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

// 当番。人数分Twitterアカウントを入れる。（省略）
$duty = array("@ltd ");

// 朝夜の判定。8時と22時にツイート
if (date(G) == 8) {
	$time = 0;
} elseif (date(G) == 22) {
	$time = 1;
}

// 曜日で文章を変える
$youbi = date('D');

switch ($youbi) {
	case "Sun":
		$msg = array("タオルの洗濯をお願いします。", "明日、月曜日はびん・缶・ペットボトルとダンボールの収集日です。");
 		break;
	case "Mon":
		$msg = array("今日は缶・ペットボトル・びん、ダンボールの収集日です。", "明日、火曜日は普通ごみの収集日です。");
 		break;
	case "Tue":
		$msg = array("今日は普通ごみの収集日です。", "明日、水曜日はプラスチック製容器包装の収集日です。");
 		break;
	case "Wed":
		$msg = array("今日はプラスチック製容器包装の収集日です。", "明日、木曜日は普通ごみの収集日です。");
 		break;
	case "Thu":
		$msg = array("今日は普通ごみの収集日です。", "明日、金曜日はミックスペーパーの収集日です。");
 		break;
	case "Fri":
		$msg = array("今日はミックスペーパーの収集日です。", "明日、土曜日は普通ごみの収集日です。");
 		break;
	case "Sat":
		$msg = array("今日は普通ごみの収集日です。", "1週間お疲れさまでした。".$duty[1]."明日から当番をお願いします。");
 		break;
}

$params = array('status' => $duty[0].$msg[$time]);
$result = $conn->post('statuses/update', $params);
var_dump($result);
```
SSL証明書と秘密鍵をWebサーバに組み込む前に簡単に確認する

サーバ上で次のように `openssl s_server` コマンドを実行する。

    openssl s_server -cert server.crt -key server.key -www

中間証明書も必要なら `-CAfile` で指定する。

    openssl s_server -CAfile chain.crt -cert server.crt -key server.key -www

4433 ポートで Listen するのでブラウザで開いてみる。例えば・・・

 - https://ore-no-server.example.net:4433/

秘密鍵と証明書のペアが間違っていると `openssl s_server` が失敗する。

証明書に誤りがあるとブラウザで証明書のエラーになる。

---

> ブラウザで 4433 にアクセスすると色々情報が表示されます。
> 公開サーバなので余計な情報は表示させたくないです。

空のディレクトリを作ってダミーのファイルを作成する。

    mkdir empty
    cd empty
    echo ok > index.html

`-www` を `-WWW` に変更してコマンドを実行する。

    openssl s_server -CAfile ../chain.crt -cert ../server.crt -key ../server.key -WWW

次のようにブラウザでアクセスする。

 - https://ore-no-server.example.net:4433/index.html

---

> 公開サーバで 4433 ポートなんて開けてません

SSHポートフォワードでどうにかする、あるいはサーバ上の curl とかで確認する。

    curl https://ore-no-server.example.net:4433/index.html
OSXでスクリーンロックするショートカットキー

ちょっと離席するときに、さっとスクリーンロックするための手順です。

## 前提

[システム環境設定]の[セキュリティとプライバシー]で
[スリープ解除／スクリーンセーバ解除にパスワードを要求]にチェックをつけて、
[開始後]は[すぐに]にしておきます。

## スクリーンロックの手順

control-shift-powerでディスプレイのみスリープになり、スクリーンロックできます。

## 情報源
[osx - Is there a quick way to lock my Mac? - Ask Different](http://apple.stackexchange.com/questions/64/is-there-a-quick-way-to-lock-my-mac)
Rails 現在の月から前の月を順番に表示する

####Railsのメソッド,monthを使って

```rb:code.html.erb
<% t = Time.now %>
<% a = (1..12).to_a %>
    <% a.each do |b| %>
      <th>
        <% t = Time.now - b.month %>
        <%= t.strftime("%Y/%m") %>
      </th>
    <% end %>
```
curlからvimにパイプする


たとえば、 **curlコマンドでXMLをダウンロードしてvimで開きたい** なんていう要望がAPI開発とかしてると湧いて出てくるんですが、これを可能にするワンライナー紹介します。

```
$ curl "http://b.hatena.ne.jp/search/tag?q=%E3%83%8F%E3%82%A6%E3%82%B9&mode=rss" | vim -
```

これで一発です。
キモはパイプ後のvimコマンドの後ろの **-** （ハイフン）です。これがないとダメです。

API側がちゃんとMIMETYPEをこさえていれば、それを読み取ってvimさんがfiletypeをセットしてハイライトしてくれます。地味に良い。
Chrome で現在有効となっている Flash Player が PPAPI(Pepper) Plugin かどうかを判断する


**追記(7/11): 以下のような面倒なことしなくても Javascript だけでできました。 ->  [isPepperFlashPlayer (davidortinau / gist:4039375)](https://gist.github.com/davidortinau/4039375)**

Google Chrome 標準の Flash Player Plugin (PPAPI Plugin) にはいろいろな問題がある。

そのため、もしユーザが Pepper Plugin が有効になっている状態でサイトを訪れた場合、Adobe謹製の Flash Player Plugin をインストールしてなおかつブラウザの設定で有効にしてもらうように誘導したい。

そのような動機から、Flash Player のタイプが Pepper Plugin かどうかを判別する swf を作成してみた。

## SWF のソースコードとコンパイル

以下の ActionScriptコードを保存し <code>mxmlc</code>コマンドでコンパイルする。

```javascript:CheckPepperFlashPlugin.as 
package {
  import flash.display.Sprite;
  import flash.system.Capabilities;
  import flash.external.ExternalInterface;

  /**
   *  Check Flash Player type is PPAPI Plugin (Google Chrome)
   */
  public class CheckPepperFlashPlugin extends Sprite {
    public function CheckPepperFlashPlugin() {
      ExternalInterface.addCallback( "isPepper", isPepper );
    }

    private function isPepper():Boolean {
      return Capabilities.manufacturer.toUpperCase().indexOf("PEPPER") > 0;
    }
  }
}

```

以下のようにコンパイル（要 Flex SDK ）

```
$ mxmlc CheckPepperFlashPlugin.as 
```

すると、 CheckPepperFlashPlugin.swf が作成される。

## 使ってみる

http サーバ で前述の swf ファイルと以下の HTML ソースコードをホストする。

```html:test.html
<html>
  <body>
    Check Flash Player Type: <span id="plugin-type">(unknown)</span>
    <object id="checkPepper" data="CheckPepperFlashPlugin.swf" type="application/x-shockwave-flash" width="0" height="0">
      <param name="movie" value="CheckPepperFlashPlugin.swf"/>
      <param name="AllowScriptAccess" value="always"/>
    </object>
    <script>
      (function(){
        // SWFの初期化が完了するのを待って渡された関数を実行
        function waitForInitializingSWF(func) {
          if (checkPepper && checkPepper.isPepper) {
            func();
          } else {
            setTimeout(function() { waitForInitializingSWF(func); }, 100);
          }
        }

        // ドキュメントの読み込み完了したら以下のコードを実行
        window.onload = function() {
          waitForInitializingSWF(function() {
            var type = document.getElementById("plugin-type");
            type.textContent = checkPepper.isPepper() ? "Google Chrome Pepper Plugin" : "Adobe Plugin";
          });
        };
      })();
    </script>
  </body>
</html>
```

## 実行結果

FireFox

![kobito.1373460128.627304.png](https://qiita-image-store.s3.amazonaws.com/0/8219/860935c6-af45-44be-6f32-875af2c6f306.png "kobito.1373460128.627304.png")

Google Chrome (PPAPI Plugin が有効の状態）

![kobito.1373460176.120987.png](https://qiita-image-store.s3.amazonaws.com/0/8219/9410550b-f723-e15c-db9d-23f9514c3026.png "kobito.1373460176.120987.png")

Google Chrome (PPAPI Plugin が無効の状態）

![kobito.1373460227.229008.png](https://qiita-image-store.s3.amazonaws.com/0/8219/8acc465f-9ae0-cfc5-6e72-756cfff78093.png "kobito.1373460227.229008.png")
evernote-sdk-rubyを使ってEvernoteにノートを作成する

[RubyのEvernote API](https://github.com/evernote/evernote-sdk-ruby)を使ってノートを作成する方法。

## 基本の流れ
1. [NoteStore](http://dev.evernote.com/documentation/reference/NoteStore.html#Svc_NoteStore)を作成
2. コンテンツを作成
3. ノートのインスタンスを作成
4. NoteStoreの[createNote](http://dev.evernote.com/documentation/reference/NoteStore.html#Fn_NoteStore_createNote)を使ってノートを保存
という流れです。

## ソース
```rb:
require 'evernote-thrift'

# NoteStoreを取得
noteStoreTransport = Thrift::HTTPClientTransport.new('https://sandbox.evernote.com/shard/s1/notestore')
noteStoreProtocol = Thrift::BinaryProtocol.new(noteStoreTransport)
note_store = Evernote::EDAM::NoteStore::NoteStore::Client.new(noteStoreProtocol)

# 保存するコンテンツ。
# ENMLという形式になっている。
# 最初に空行があったりすると保存失敗するので注意。
content = %Q{<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
    <en-note>hello!!</en-note>}

# Noteのインスタンスを生成
# notebookGuidは指定なしの場合ユーザーのデフォルトのノートブックに保存される
note = Evernote::EDAM::Type::Note.new(
  title: 'ノートのタイトル'
  content: content,
  notebookGuid: '12345678-1234-1234-1234-123456789012'
)

begin
  # evernoteにノートを作成
  note_store.createNote(auth_token, note)
rescue => e
  # 保存に失敗するとEDAMUserExceptionなどの例外が取得できる
  p e
end
```

## その他
例外はたとえばnote.titleはrequiredなのでtitleを設定しないでcreateNoteを叩くと
<Evernote::EDAM::Error::EDAMUserException errorCode:DATA_REQUIRED (5), parameter:"Note.title">
という例外が出ます。
xmlの形式がvalidじゃなかったりしても例外が出るのでどうしても保存されないときはそこら辺をチェックすると保存できたりします。

コンテンツは[ENML](http://dev.evernote.com/intl/jp/start/core/enml.php)という独特の形式で保存する必要があるが、HTMLに似ているのでその感覚でとりあえずは大丈夫。
デザイン修正を楽にする技を考えてみた

* デザイン・文言修正依頼excelファイルにツラツラ書いてて読む気が失せますよね。

* プログラム側に修正入れる前にコレで修正して確認してもらい、OKならプログラム側に手をいれるというのはどうだろうか。

## ブックマークレット

```js:編集開始
javascript:document.body.contentEditable=true; document.designMode=on; void 0;
```

```js:編集終了
javascript:document.body.contentEditable=false; document.designMode=off; void 0;
```

viod 0 がないと、IEでページ遷移するので注意。
Qiita: 要望: フォロー関係の表示強化

フォロワー一覧に、そのユーザをフォローしているかどうかを、フォロー一覧に、そのユーザからフォローされているかどうかを表示してほしいです。

前者の場合は、そこからフォローできるとなおいいです。
KeplerでGlassFishが設定できない！？

# Kepler使ってみたらGlassFishがLibrary追加のところのServerRuntimeに現れない！？でもGlassFishさんを使いたい。。。

Keplerさくさくはやいのに、GlassFishが仲間はずれです。。
調べているとバグな感じでもしかするとそのうちちゃんと仲間に入れてもらえる気がする。
…いれてください。

英語が分かる方はこのあたりとか読むのが良さそうです。
https://forums.oracle.com/thread/2552592

（私は、ニガテなのでやり方だけつまみ食いです、そして英語をふたたびみたくないので書き残します）

## 結論：Server Runtimeに出現させるのはとりあえずあきらめておく

1. プロジェクトのPropertiesを開く
2. Project Facetsを選ぶ
3. 右のほうのRuntimesのタブでGlassFishを選択
![eclipse_kepler.png](https://qiita-image-store.s3.amazonaws.com/0/19712/8d4992db-970e-c0e5-5232-f959cc530bae.png)

これでServer Runtimeにはあらわれないものの、BuildPathに「GlassFish System Libraries」がでているはずです。
最初から作るときには困らないはずです。途中でBuildPathを修正する必要があるときにはこれでむりやりできます。。いざというときでGlassFishさんが仲間に入れてもらえるのを待てない人はお試しください。
ActionScript で "Hello World"


## 前提

Flex SDK がインストールされており <code>mxmlc</code> コマンドが実行可能であること。

## コード

```js:Hello.as
package {
  import flash.display.Sprite;
  import flash.text.TextField;

  public class Hello extends Sprite {
    public function Hello() {
      var tf:TextField = new TextField();
      tf.text = "Hello Flex World.";
      addChild(tf);
    }
  }
}
```

上記コードを保存したら、以下のようにコンパイル。

```
$ mxmlc Hello.as
```

コンパイルの結果、<code>Hello.swf</code> が作成されているはずなので、ブラウザに ドラッグ&ドロップ などで開き以下のように表示されればOK

![kobito.1373443817.994206.png](https://qiita-image-store.s3.amazonaws.com/0/8219/fc6ebb44-0dc8-687a-0a20-390c6361d289.png "kobito.1373443817.994206.png")
jQueryで全選択・全解除はprop使う

# attr使ったら動きが変だった
 <del>attrじゃないかと思って作ったら、何か変。</del>
attr('checked','')ではなく、removeAttr('checked')を使えばおk
<del>どうやらprop使えばいいらしい。</del>
でもpropのが楽に書ける
詳しくは[CSSは分かるけどjQueryは苦手……という人が .attr()と .prop()に親しんでくれるといいなーと思って書きました。｜Ginpen.com](http://ginpen.com/2011/10/12/jquery-attr-prop/)で。

>チェックされているかどうかという判定には .prop()を使う必要があります。
>HTMLに書いた属性の値を扱いたいときは .attr()を、いかにもJavaScript的な事をする時は .prop()

# デモ
こんな感じで使えばおkだと思う。

```html:
<div class="allCheck">
<input type="checkbox" id="allCheck01"><label for="allCheck01">全選択・全解除</label>
</div>
<div>
<input type="checkbox" id="check01"><label for="check01">アイテム01</label>
<input type="checkbox" id="check02"><label for="check02">アイテム02</label>
<input type="checkbox" id="check03"><label for="check03">アイテム03</label>
</div>
```

```js:
$('.allCheck input,.allCheck label').click(function(){ //全選択・全解除をクリックしたとき
	var items = $(this).closest('.allCheck').next().find('input');
	if($(this).is(':checked')) { //全選択・全解除がcheckedだったら
		$(items).prop('checked', true); //アイテムを全部checkedにする
	} else { //全選択・全解除がcheckedじゃなかったら
		$(items).prop('checked', false); //アイテムを全部checkedはずす
	}
});
```

##上のデモとattrとコメントのコード比較
http://jsdo.it/Ituki/kgmK

##補足2013.12.04
attrメソッドの仕様がjQuery 1.9から変わったそうなので、メモ。

| jQueryのバージョン | attrでcheck | propでcheck | attrで未check | propで未check  |
|:-----------|:------------|:------------|:------------|:------------|
| 〜1.8 | checked | true | undefined | false |
| 1.9〜 |  undefined | true | undefined | false |

つまり、attr / removeAttrが使えなくなったようです。
デモ：http://jsdo.it/Ituki/opoF
参考：http://blog.webcreativepark.net/2013/12/04-141752.html
プロセスを検索してkillする

勝手にapache入れて動かしてる友人がむかついたので書いた

```rb:
loop do
	res = `sudo ps aux | grep apache`.split("\n")
	res.each do |row|
		pid = row.split[1]
		`sudo kill -9 #{pid} > /dev/null 2>&1`
		puts "installed http://rubygems.jp/#{pid}" if $?.exitstatus == 0
	end
	sleep 10
end
```
Flexアプリケーション側から Flashプレイヤーが Chrome の PPAPI Plugin かどうか判別する


flash.system.Capabilities クラスの manufacturer プロパティの戻り値で判断できそう。

Flash Player の違いによって以下のとおり戻り値が変わってくる。

Adobe の Flash Player plugin の場合:

```
Adobe Machintosh
```

Google Chrome の PPAPI Plugin の場合:

```
Google Pepper
```

## 参考
[Capabilities - Adobe ActionScript® 3（AS3 ）API リファレンス](http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/system/Capabilities.html)
Ruby 2.0 向けのデバッガー byebugについて

Ruby 2.0系でのみ動作する[deivid-rodriguez/byebug](https://github.com/deivid-rodriguez/byebug "deivid-rodriguez/byebug")というデバッガーが存在する事を知りました。

少し触ってみた所、2.0系とdebuggerではどうにも動作が不安定だったステップ実行がちゃんと実行できるし、動作も軽快で良い感じでした。

debuggerとの違いは以下のようになってます。

- 1.9系では動かない。2.0系のみ対応
- 2.0で追加されたデバッガ向けのC APIを利用しているため、MRIのソースに依存しないクリーンな実装。(debugger2みたいな感じ)
- debuggerで現在も残っているissueをいくつか解決している
  - 特に正しいバックトレースを返してくれる点が良い
- 外部エディターサポートは組み込んでいない
- スレッドはまだサポートされていない。まだ新しいAPIでサポートされてないかららしい
- アクティブにメンテしてる
- pryコマンドを組込んでいるので、byebugとpry入れてればそれだけでpry呼び出せる。

デバッガに関しては、いまいち選択に悩む所が多くて安定しているとは言い難い状態だったのですが、使ってみた感触としては、今のところかなりイチオシのデバッガでは無いかと思います。
PHPでデータベースから取得するときの文字化け対策

## はじめに
* PHPで以下のようにデータベース(DB)から値をとってこようとしたら、日本語の場合は文字化けしていた
 * これを解決するのに入れるコードは１行のみ！

## DBから値を取得するコード

```php:
<?php
$sql = mysql_connect("DBURL", "DBユーザ名", "DBパスワード");
mysql_select_db("DB名", $sql);
mysql_query('SET NAMES utf8', $sql ); # この行を追加する

$query = "SELECT * FROM テーブル名";
$result = mysql_query($query);
print "$result";
?>
```

* 『?????』と結果が文字化けしていたものが、対策を入れるときちんと日本語が表示された

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
SEO対策　ソースコードエラー探し

W3Cの勧告に準拠したWEBサイトは高品質と認識される。
エラー出してくれるけど、エラーじゃないじゃん！って時の方が多い。あくまで参考程度にみればOK

http://validator.w3.org/
![ Invalid  Markup Validation of http   qiita.com    W3C Markup Validator.png](https://qiita-image-store.s3.amazonaws.com/0/19187/b2d5bf4f-7880-8574-30b6-908f1d7820a7.png)

細かなミスを探してくれます。
定期的に診断してみると役に立つかもしれません。
Gitでcommit数順にコミッターを表示する

```
  3339  David Heinemeier Hansson
  3186  Jeremy Kemper
  2007  José Valim
  1613  Aaron Patterson
  1349  Xavier Noria
  1074  Joshua Peek
   875  Santiago Pastorino
   846  Pratik Naik
   598  Jon Leighton
   544  Michael Koziarski
   520  Vijay Dev
```

こんな感じで表示される。コマンドは以下

```
$ git shortlog -ns 
```

オプションは以下

```
-n, --numbered
 Sort output according to the number of commits per author instead of author alphabetic order.
-s, --summary
 Suppress commit description and provide a commit count summary only.
```