OmniAICreator/Qiita-1.07M huggingface dataset:
Azure SDK for PHPにPull requestを送るまでにやったこと

# これは何？

2年前まで知らなかったのですが、MicrosoftはOSSに力を入れています。
最近もVisual Studio CodeがOSSとして公開され、話題になりました。
https://github.com/Microsoft/vscode

そしてAWSなどと同様に、Azureの各種SDKもOSSとしてGithubで公開されており、誰でもForkしてPull Requestを送ることができます。

今回はAzure SDK for PHPにPull requestを送るまでにやったことをまとめてみました。
Pull requestを受け入れてもらうため、Microsoft独特のお作法などがありますので参考になれば嬉しいです。


でも最初に1点だけ。
Azure SDK for PHPはメンテナンスされていない状態です。
([現状、Azure SDK for PHPはメンテナンスされていないようです]( http://qiita.com/nntsugu@github/items/7ee9bb52c414599c33f7#%E7%8F%BE%E7%8A%B6azure-sdk-for-php%E3%81%AF%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%A7%E3%81%99)を 参照)

そのままだとproxyも通せない状態なので、使用するなら他のSDKをおすすめします。





# 1.Forkして自分のbranchを作る

[Githubのリポジトリ](https://github.com/Azure/azure-sdk-for-php)からForkして、自分の開発用branch(Spike/Prototype branch)を作成します。

[GitHubへpull requestする際のベストプラクティス](http://d.hatena.ne.jp/hnw/20110528)
こちらの解説がとてもわかりやすいのでこちらを参考にしてください。

下記に気をつけてやればOKだと思います。

- masterブランチのまま修正しない。必ず開発用branchを作る
- Githubを見ている人が、ぱっと見で開発用branchとわかるようなbranch名にする



# 2.Unit Testを通す

開発をスタートする前に、プロダクトのテストコードを使用できる状態にしておきましょう。
Azure SDKのテストコードはAzureの各種サービスを利用します。
そのための接続情報などなど必要に応じて環境変数に定義して上げる必要があります。

長いので下記にまとめました。そちらを参照してください。

[Azure SDK for PHPのUnit Testを通すまでにやったこと](http://qiita.com/nntsugu@github/items/1b8f0432e7e3fb1ac0bc)




# 3.開発する

1で作成した開発用branchでコードに変更を加えます。
まめにUnit Testを実行しながら変更を加えたほうがいいのですが、全ケースを通すのに数分かかるため
　　https://phpunit.de/manual/5.0/ja/textui.html
あたりを参考に、必要なテストのみ実行するのもいいかもしれません。
でも最後に全ケースを通す事を忘れずに。

そしてまめにfork元に変更が入っていればいないか確認して、必要に応じて開発用branchに適用しましょう。
具体的なやり方は、[GitHubへpull requestする際のベストプラクティス](http://d.hatena.ne.jp/hnw/20110528)の"fork元の更新に追随する"を参照してください。


# 4.Pull requestを作成する

開発用Spike/Prototype branchへの変更をひとつにまとめたbranchを作ってPull requestを作成します。
[GitHubへpull requestする際のベストプラクティス](http://d.hatena.ne.jp/hnw/20110528)の"pull request用に過去のcommitを1つにまとめる"、"pull requestする"を参照してください。



# 5.CLAに署名する

MicrosoftのプロダクトにPull requestを送り、受け入れてもらうためには、必ずContribution License Agreement (CLA) に署名をする必要があります。
署名までの流れは下記が参考になります。

[Azure にコントリビュートするには](http://qiita.com/nnasaki/items/a0293617d75cae1e7673)


# 6.リポジトリ管理者のリアクションを待つ

https://github.com/Azure/azure-sdk-for-php/pulls
の自分のPull requestにリアクションがあるのを待ちましょう。


----

記事本文はここまでです。




# [余談]現状、Azure SDK for PHPはメンテナンスされていないようです

Azure SDK for PHPにはいくつか問題があり、Microsoftによるメンテナンスが放棄されている状態です。
自力でメンテナンスする覚悟と余力が無い場合は他のSDKを使用しましょう。


## Pull Requestが放置されている

https://github.com/Azure/azure-sdk-for-php/pulls
を見ると、2015/7以降のPull requestにリポジトリ管理者からのリアクションはありません。

機会があったのでMSの人にも聞いてみました。
「内部でも問題視されており、現在他のSDKと足並みを揃えようと準備中」
とのことでした。

でも残念ながら、その話を聞いてから3ヶ月以上経過しています。


## 対応APIバージョンが古い

[ドキュメント](https://msdn.microsoft.com/en-us/library/azure/gg592580.aspx)では最新のAPIバージョンは2015-04-01なのですが、Azure SDK for PHPでは2011-10-01までしか対応していません。

```php:WindowsAzure/Common/Internal/Resources.php
    const STORAGE_API_LATEST_VERSION                    = '2012-02-12';
    const SM_API_LATEST_VERSION                         = '2011-10-01';
```


ついでに書くと、Azure Service Management(ASM)モードにしか対応していない状態です。
今後はAzure Resource Management(ARM)モードが主流になります。



----

明日12/02は @takekazuomi さんです。
よろしくおねがいしまーす。
Clojure の Web アプリケーション開発について 1 から 10 くらいまで

## 言いたいこと

Clojure で Web アプリケーション開発をしたい初心者/入門者向けのドキュメントを書きました。
想定読者は Clojure の書き方はなんとなく分かるようになったけど、 Web アプリケーションの作り方はよく分からない人です。

* [Clojure で Web 開発をはじめてみよう / Clojure Beginner](http://ayato-p.github.io/clojure-beginner/intro_web_development/index.html) 

## モチベーション

* Clojure で Web 開発のとっかかりを作りたかった( in Japanese!! )
  * ひいては興味持ってくれた人が一緒に働いてくれるかもしれない(ﾖｺｼﾏ)
* ちゃんとした Clojure のドキュメントを作りたいという気持ちがあった(目指せ "ひしだま's 技術メモページ" )

## ありそうな質問と回答

Q. Clojure 初心者でも読める?
A. 一応想定としては Clojure という言語についてはある程度理解していることを前提に書いている部分が大なので、プログラミング Clojure あたりは最低でも読んでおいた方が良いかもしれません。

Q. Luminus をカバーしている?
A. Luminus について解説しようとすると内容をメンテするコストが高くなるのと、初心者は Ring の理解をした方がいいと思うため特定のフレームワークと呼ばれるものについてはカバーしていません。その代わり、 Luminus を使っていても理解を助けるためのドキュメントにはなっていると思います。

Q. Luminus 嫌いなの?
A. 個人的には何かを開発するときに使ったことはないです(結局書き換える範囲多くて泣くので/今なにか作るなら Duct がいいかなぁとは思う)。

Q. 読めば何か作れるようになる?
A. なると思って書いていますし、実際にドキュメントの中では TODO アプリを作っています(今後、増えるかもしれません)。

Q. このドキュメントの良いところって何?
A. 比較的現実的な Web アプリケーションの開発方法を書いていることです。また lein-ring などを使わずに REPL 上で開発するように促しているので REPL の嬉しさみたいなのを理解出来るようになってると思います(たぶん)。

Q. 質問があったらどうしたらいい?
A. 僕の Twitter アカウント( _ayato_p )にメンションするか、不明瞭な部分があったりする場合は GitHub の issue を立ててもらえれば対応します。

## 最後に

とても疲れました。あと結構な量の日本語を長い期間( 2,3 ヶ月)に渡って書くと最初に考えていたこととか忘れてるし、語り口調も少しずつ変わっていくし(実際変わっているので読まれる方はそこにも注目してみてください/いつか修正する…)、途中で前のところのミスとかに気づくと目も当てられません(今回、コミット履歴を見れるようにドキュメントに URI を埋め込んだので fixup とか使うと他に影響でるし、かと言って直さないのも変だし…みたいな葛藤が何回かありました)。

時間が足りなかったので TODO アプリを作って Heroku にデプロイするところまでしかできていませんが、今後も随時書き足していくつもりなのでリポジトリを Watch しておくと良いのではないでしょうか。

今後の予定

* マイグレーションについて書く
* Buddy を使ってユーザー認証を実装する
* ring-jetty-adapter の代わりに Immutant を使う
* Compojure を bidi に置き換える
* SQL を DSL を使って書けるようにする( or HugSQL? )
* ClojureScript を使ってフロントエンド開発出来るようにする
* Reagent + re-frame あたりをカバーする
* Component を使ってプロジェクトの状態を管理する
* 別のアプリケーションを作って RESTful な Web アプリの作り方を書く
* etc

このドキュメントを読んで Clojure を触ってみようと思う人が増えたら僕は嬉しいです。
(あ、プロの Clojurian の方は間違ってるところあったら指摘してくれると僕が喜びます)

## お誘い

12/12(土) に Clojure ワークショップを行います。
https://japanclojurians.doorkeeper.jp/events/34090
仕事で Clojure を書いているエンジニアが手厚くサポートしてくれる会ですので、是非この機会に Clojure を勉強してみてはどうでしょうか?
Clojure を初めて触る方や Web アプリを Clojure で作ってみたい方、自分が書いてるコードが正しいか自信がない newbie な人にオススメです。

## 宣伝

サイボウズスタートアップスでは一緒に Clojure を書きたいエンジニアを募集しています。
詳しくは[採用情報のページ](http://cstap.com/jobs/dev-engineer.html)を見ていただければ幸いです。
Google Apps for Work の SAML を使って AWS にログインする

# はじめに

Google Apps for Work を使い始めました。

Google Apps for Work は独自のドメインでGmailを利用できることをはじめとして
グループワークに必要なフォーラム機能やメーリングリスト機能や、
GoogleDrive や Google Docs といったドキュメント管理ツールなども提供され、
月々500円/アカウントという低価格で利用することができるサービスです。

今回は、提供されているサービスの一つ SAML を使って、
AWSとのシングルサインオンを実現したいと思います。

## Google Apps for Work で SAML を有効にする。

1. Google Apps for Work の [管理コンソール](https://admin.google.com/AdminHome) にログインします。
- ログイン後のメニューから 「アプリ」 を選択します。
- 「SAMLアプリ」を選択します。
- 右下の ＋ を選択します。
- Amazon Web Service を選択します。
- サービスプロバイダの詳細はデフォルトのままでいいので、次に進みます
- 属性のマッピングは https://aws.amazon.com/SAML/Attributes/Role* を 従業員の詳細 > 役職 に設定します。（理由は後述します）
- metadata の XML をダウンロードします。

これで SAML の設定が完了しました。

## AWS で SAML によるログインを有効にする

### プロバイダを登録する

1. [AWSコンソール](https://console.aws.amazon.com/console/home) にアクセスします。
- IAM の管理画面にアクセスします。
- バーティカルメニューより Identity Providers を選択します。
- Create Provider ボタンを選択します。
- Provider Type に SAML を選択し、Provider Name に任意の文字列を設定します。
- Google Apps for Work 設定時にDLした metadata をアップロードします。
- プロバイダのARNをメモしておいてください。

### SAMLログイン時に利用するロールを設定する

1. バーティカルメニューより Roles を選択して Create New Role ボタンを選択します。
- Role Name に任意の文字列を設定します。
- Select Role Type で Role for Identity Provider Access の Grant Web Single Sign-On (WebSSO) access to SAML providers を選択します。
- SAML provider に先ほど登録したプロバイダを指定して登録します。
- ロールのARNをメモしておいてください。

## Google アカウントに SAMLログイン時に利用するロール設定を反映する

1. 再び Google Apps for Work の [管理コンソール](https://admin.google.com/AdminHome) にログインします。
- ユーザ管理を選択し、SAMLでログインさせたいユーザを選択します。
- アカウント を選択します。
- 従業員の詳細 の編集を選択します。
- タイトル とプレースホルダのあるフォームに {プロバイダのARN},{ロールのARN} という文字列を指定します。（https://aws.amazon.com/SAML/Attributes/Role* でAWS側に渡る値となります）

## ログインしてみよう

「アプリ > SAML アプリ > Amazon Web Services の設定」 の横にあるボタン
あるいは
右上の Google App メニューから Amazon Web Services を選択します。

すると、いきなり AWSコンソールにログインできたはずです。
これで心置きなくAWSのルートアカウントはMFAをオンにしてパスワードをくそ長いものを指定できるようになります。
[OSX][iOS]Cocoaとは何ぞや

<p>Apple Lisaコンピュータのアプリケーションは、Lisa Toolkitというライブラリを使って開発され、このToolkitライブラリはClascalと呼ばれるPascal言語を拡張したオブジェクト指向言語で書かれていたそうだ。</p>
<p>『オブジェクト指向プログラミング for the Macintosh』によると、Clascalのコードは以下のようになる。</p>

```pascal
{TViewクラスの子クラス}
TQuadView = SUBCLASS OF TView
    {インスタンス変数}
    window:TQuadWindow;
    {作成メソッド}
    FUNCTION TQuadView.CREATE(object:TObject;heap:THead;itsExtent:LRect;itsPanel:TPanel):TQuadView;
    {選択メソッド}
    PROCEDURE TQuadView.MousePress(mouseLPt:LPoint);OVERRIDE;
    FUNCTION TQuad TQuadView.NewSelection(quad:TQuad):TQuadSelection;ABSTRACT;
END;{TQuadView}
```

<p>Pascal派生の言語ということでC言語とは異なる部分があるが、iOSしか知らなくてもコードの内容が理解できると思うし、Swiftなど、逆に近づいているように感じる部分があって面白いと思ったが、どうだろうか？</p>

<p>このLisa ToolkitとClascalは、Macintoshの開発環境に影響を与えている。MacintoshのAPIはオブジェクト指向から手続き型のToolboxライブラリになっているが、MacAppクラスライブラリが用意され、このMacAppはObject Pascalというオブジェクト指向プログラミング言語で記述されていた。</p>
<p>こちらもコードを『オブジェクト指向プログラミング for the Macintosh』から引用してみる。</p>

```pascal
TYPE TFoo = OBJECT(TSnark)
    fFirstObject: TEmployee;
    fNumber: INTEGER;
    PROCEDURE TFoo.IFoo;
    PROCEDURE TFoo.Free;OVERRIDE;
END;
 
PROCEDURE TFoo.IFoo;
VAR tempObject:TEmployee;
BEGIN
    SELF.ISnark;
    NEW(tempObject);
    tempObject.IEmployee;
    SELF.fFirstObject:=tempObject;
END;
 
PROCEDURE TFoo.Free;
BEGIN
    FreeObject(SELF.fFirstObject);
    INHEFITED Free;
END;
```

<p>Lisaコンピュータが発売されたのが1983年。Macintoshコンピュータが1984年。MacAppクラスライブラリは1985年。NeXT創業が1985年。NeXTワークステーションとNeXTSTEPオペレーティングシステムが発表されたのが1988年。</p>
<p>アプリケーションは、Application Kitソフトウェアキットを利用して開発され、Objective-Cで記述されていた。『Xウィンドウとその仲間たち』によると以前のクラス名は頭にNXが付いていて、その後のNSと異なっている。NeXTSTEPからOPENSTEPに変わる際に変わったのかな？（NSはNeXT Softwareの略と聞いたことがある）</p>

<p>C++でなくObjective-Cが選択された理由の一つに、当時、C++は研究室で利用されるもので、実際の現場で利用可能になっていたのはObjective-Cだったからという話を聞いたことがあるが、今となってみれば、C++でなくてよかったのではないか！？</p>

<p>『オブジェクト指向プログラミング for the Macintosh』に古い形式のObjective-Cのコードが掲載されていたので引用する。</p>

```objc
= Point:Object (Geometry, Primitive) { short, xLoc, yLoc; }
+ x:(int)anX y:(int)aY {
    id myNewPoint = [self new];
    [myNewPoint x:anX];
    [myNewPoint y:aY];
    return myNewPoint;
}
 
- x:(int)anX { xLoc = anX; return self; }
- y:(int)aY { yLoc = aY; return self; }
=:
```

<p>1996年、NeXTはAppleに買収された。OPENSTEPはRhapsodyというコードネームでMacintoshに移植された。RhapsodyにはMatintosh ToolboxをエミュレーションするBlue Boxと、OPENSTEPのYellow Boxで構成されていた。</p>

<p>RhapsodyはMac OS X Server 1.0としてリリースされたのち、2001年にMac OS Xとしてリリースされ、v10.8 (Mountain Lion) からMacが取れてOS Xとなった。そして、RhapsodyのBlue BoxはCarbonに、Yellow BoxはCocoaという名前となり、現在でも、OS XやiOS、watchOS、tvOSの主要なフレームワークとなっている。</p>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
Kurt J. Schmucker（1986）『オブジェクト指向プログラミング for the Macintosh [上巻]』大谷和利訳, 日本ソフトバンク．<br />
Kurt J. Schmucker（1986）『オブジェクト指向プログラミング for the Macintosh [下巻]』大谷和利訳, 日本ソフトバンク．<br />
<a href="http://amazon.jp/dp/4320023552">Xウィンドウとその仲間たち</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
GitLabをNginxを使ってサブドメインに設定導入する


##概要
一つのサーバーで[www.example.com]()や[example.com]()にWebページなどのサービスを利用している場合、GitLabなどの他のサービスを利用するときに[example.com:3000]()などポート番号を指定してアクセスしたりしなければいけません。これでは格好悪かったり、80番ポート以外はアクセス出来ない環境でアクセスできなかったりします。
一般的にはリバースプロキシを使用することで、[gitlab.example.com]()のように簡単にアクセスできるようにします。今回、Nginx+WordPressを導入しているサーバーにGitLabを導入・設定したときに少しハマったので、メモ代わりに投稿します。

##目標
[www.example.com]()にはWordPressがアクセスできる状態として、[gitlab.example.com]()でGitLabにアクセスできるようにする。

##環境
* CentOS 6.7
* Nginx version: 1.0.15
* GitLab version: 8.2.1 

NginxはGitLab内蔵のものではなく、Nginx単体で導入したものを使用します。

##GitLabの設定
GitLabのインストール方法は[公式サイト](https://about.gitlab.com)がわかりやすいと思いますのでそこを参考にしてください。
インストールが完了したらGitLabの設定ファイルをいじります。

```
$ vi /etc/gitlab/gitlab.rb
```

```gitlab.rb
external_url 'http://gitlab.example.com'

nginx['enable'] = false #GitLab内臓のNginxの使用を切る

nginx['listen_port'] = 8080 #設定する内部ポート
nginx['listen_https'] = false
```
編集が終わったらリロードして再起動かけます。

```
$ gitlab-ctl reconfigure
$ gitlab-ctl restart
```


##Nginxのファイルを作成
Nginxのリバースプロキシの設定をします。
設定ファイルの名前はなんでもいいのですが、今回はgitlab.confにします。

```
$ cd /etc/nginx/conf.d
$ vi gitlab.conf
```

```gitlab.conf
upstream gitlab{ #サブドメイン名を設定
	server 127.0.0.1:8080;
}

server {
    listen       80;

    access_log /var/log/nginx/gitlab.access.log;
    error_log /var/log/nginx/gitlab.error.log;

 
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8080;
    }

}
```

設定を保存したらNginxを再起動します。

```
$ chkconfig nginx on
$ service nginx restart
```

##最後に
設定したURLにアクセスできればOKです。(今回は[gitlab.example.com]())
vimでmdをライブプレビューしながら書く、セッディング

# .vimrc

```
"" ===== markdown 環境構築
NeoBundle 'plasticboy/vim-markdown'
NeoBundle 'kannokanno/previm'
NeoBundle 'tyru/open-browser.vim'
au BufRead, BufNewFile *.md set filetype=markdown
```

＃install

`: NeoBundleInstall`

# 起動方法

`: PrevimOpen`

ブラウザが起動して、プレビューが表示される。
保存するたびに勝手にリロードしてくれる。

![スクリーンショット 2015-11-30 23.46.48.png](https://qiita-image-store.s3.amazonaws.com/0/4036/3e37e7f6-c0dc-67fc-4b56-8cdb8f879afd.png)
p5.js を instance mode で使う


## グローバルに展開される関数

p5.js は `setup()` が実行された時に、`fill()` や　`ellipse()` などの各関数をグローバルに展開しようとします。

これらの関数は他のライブラリと共存させた時や、自作の関数名とバッティングしてしまう可能性があるため、問題になることがあります。

## instance mode

これを避けるために p5.js では instance mode と呼ばれるモードが用意されています。
まず通常の書き方で、マウスを動かすと円が描写されるようなコードを書いてみます。

```js
function setup() {
  createCanvas(600, 400);
}

function draw() {
  ellipse(mouseX, mouseY, 20, 20);
}
```

これを instance mode で書きなおしてみます。

```js
const s = (p) => {
  p.setup = () => {
    p.createCanvas(600, 400);
  };

  p.draw = () => {
    p.ellipse(p.mouseX, p.mouseY, 20, 20);
  };
}

const myp5 = new p5(s);
```

p5 をインスタンス化して、引数に関数sを渡すように変更しました。

関数s内では先述のコードと同様に `setup()`,`draw()` の処理が書かれていますが、p5 で用意されている関数、プロパティは全て引数で渡されてきたオブジェクト `p` を介して実行できるようになりました。

参考: [p5.js overview#instantiation--namespace](https://github.com/processing/p5.js/wiki/p5.js-overview#instantiation--namespace)
アプリの内容をSpotlight検索の対象にする


iOS9からSpotlightでアプリが保持するコンテンツも検索対象にできるようになりました。
やってみましょう。

##コンテンツを検索対象にする
まずはプロジェクトに「CoreSpotight.framework」を追加します。

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/3a3646b1-0385-6fb8-8954-0bbaa3db0f94.png "screen1.png")


「CoreSpotlight」と「MobileCoreServices」をimportします。

```
import CoreSpotlight
import MobileCoreServices
```

コンテンツを検索インデックスに登録するコードは以下の通り。

```
// 検索対象の作成
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)
attributeSet.title = "恐竜打線復活"
attributeSet.contentDescription = "ドアラが恐竜打線の復活を予言！"
attributeSet.thumbnailData = UIImageJPEGRepresentation(UIImage(named: "109b.jpg")!, 1.0)
let item = CSSearchableItem(uniqueIdentifier: "1", domainIdentifier: "doara1", attributeSet: attributeSet)

// インデックスに登録
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { error in
    if error != nil {
        print(error?.localizedDescription)
    }
    else {
        print("追加したよ")
    }
}
```
CSSearchableItemAttributeSetには「supportsPhoneCall」や「supportsNavigation」プロパティがあり、これらをtrueにすることで検索結果から電話をかけたり地図を表示したりもできます。

上記の例の状態で実行させてSpotlightから「恐竜打線」や「ドアラ」で検索すると検索結果に表示されます。

![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/77573/98fc8c32-0082-66b1-4e46-08a250010bc1.png "screen2.png")


ここでタップするとアプリが起動します。
その時の処理はAppDelegateで「application:continueUserActivity:restorationHandler」を実装してやれば捕捉できます。

```AppDelegate
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    if userActivity.activityType == CSSearchableItemActionType {
        let uniqueIdentifier = userActivity.userInfo? [CSSearchableItemActivityIdentifier] as? String
        print(uniqueIdentifier)
    }
    return true
}
```
上記の例だと「1」が出力されます。
これはCSSearchableItemのuniqueIdentifierで指定した値です。
この値を使って適切な画面にナビゲーションしてあげれば良いでしょう。
React core types の整理

## React (Virtual) Dom Terminology
React にはコアな型がある。この型同士の関連性をすぐに忘れてしまうので、整理してみた。
基本的には、[公式サイト](https://facebook.github.io/react/docs/glossary.html)を図解した形。

> この表記は、サイトの引用文です。

## コアな型の関連性
このような形で繋がっている。矢印の始点と終点は、**生成の材料**と**生成されるもの**という関係がある。

![Group.png](https://qiita-image-store.s3.amazonaws.com/0/37895/780af176-13d0-4273-f7f0-70e7cef9cb15.png)

## 各々の型で重要なポイント

### React Elements

> ReactElements are not to be confused with DOM Elements. A ReactElement is a light, stateless, immutable, virtual representation of a DOM Element. It is a virtual DOM.

`ReactElement`はDOM要素ではない。軽量、ステートレス、イミュータブルな仮想DOMである。

### React Components
コンストラクタ(`ReactClass`)とインスタンス(`ReactComponent`)に分けて考える。

#### コンストラクタ

`React.createClass()`の戻り値として、コンストラクタが生成される。

```javascript
// 型シグネチャ
ReactClass createClass(object specification)
```

これを`React.createElement()` に渡すと、`ReactElement`が生成される。

```js
var element = React.createElement('MyComponent');
```

JSX記法を用いて、

```javascript
var element = <MyComponent />;
```

のようにも書ける。
通常のプロトタイプベースのクラスと異なる点は、`new`しないこと。上述の`React.createElement()`を用いる。


#### インスタンス

> When this is passed to ReactDOM.render, React will call the constructor for you and create a ReactComponent, which is returned.

`ReactElement`を`ReactDOM.render()`に渡すと、`ReactComponent`が生成される。

> The render method of a ReactComponent is expected to return another ReactElement. This allows these components to be composed. Ultimately the render resolves into ReactElement with a string tag which instantiates a DOM Element instance and inserts it into the document.

この`ReactComponent`インスタンスは、`render()`メソッドを呼び出すことで、元になったものとは別の`ReactElement`を生成できる。
最終的に、`render()`メソッドはDOMを生成するためのタグ要素に分解し、ドキュメントに挿入する。
Laravel5で「.. or ...) and (..」みたいな複雑な条件を書く

```sql

SELECT * FROM tbl_data WHERE (column_a = 'hoge' or column_a= 'piyo') 
                         AND (column_b= 'foo' or column_b= 'bar');
```

こういうSQLを書きたい場合、->whereや->orWhereでどうすれば良いか。

```php

$query =  TblDatum::where(function($query){
                        $query->orWhere('column_a', '=', 'hoge')
                              ->orWhere('column_a', '=', 'piyo');
                    })->where(function($query){
                        $query->orWhere('column_b', '=', 'foo')
                              ->orWhere('column_b', '=', 'bar');
                    });
```

こうなりました。
'='は省略してもいいです。

変数使うときはuseを使います。

```php
$query =  TblDatum::where(function($query) use ($hoge, $piyo) {
                        $query->orWhere('column_a', '=', $hoge)
                              ->orWhere('column_a', '=', $piyo);
                    })->where(function($query) use ($foo, $bar) {
                        $query->orWhere('column_b', '=', $foo)
                              ->orWhere('column_b', '=', $bar);
                    });
```
シンボルハッシュを文字列ハッシュに変換するワンライナー

railsで、コントローラに渡されたパラメータを、キーワード引数としてメソッドにそのまま渡そうとするとエラーになる。
ハッシュがのキーシンボルであるため、これらのキーを文字列に変換してやる必要がある。


```irb:hash_change
my_hash = my_hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
```


参考
http://stackoverflow.com/questions/800122/best-way-to-convert-strings-to-symbols-in-hash




追記
railsであればハッシュに対してstringify_keys メソッドを使用するほうが簡単である。

http://apidock.com/rails/v4.2.1/Hash/stringify_keys
Raspberry Pi(Raspbian wheezy)をOS XのQEMUで動作させる手順

[Raspberry Pi emulator for WindowsでRaspbian最新版を動作させる手順](http://qiita.com/u6k/items/1301cc75d19066150701)ではWindows上のQEMUでRaspbianを動作させましたが、現在使用しているのはMacBookなので、OS X上のQEMUでRaspbianを動作させる手順をまとめます。内容はほぼ同じです。

# 注意

* Raspbian Jessieを動作させようとしましたが、Kernel Panicで起動しませんでした。よって、当記事では前回と同じRaspbian wheezyを動作させます。
* OSとQEMUの組み合わせがマズイのかと思ってDebian on VirtualBoxで試しましたが、別の原因で起動しませんでした。
* CentOS、Ubuntuでは`qemu-system-arm`をインストールする方法が分かりませんでした。あまりまじめに探していませんが。

# 作業環境

* OS X Yosemite
* qemu 2.4.0.1

# 作業手順

## QEMUをインストール

Homebrewでqemuをインストールします。

```
$ brew install qemu
```

必要なCPUがサポートされているかチェックします。`arm1176`が表示されればサポートされています。`arm1176`が表示されない場合は、QEMUをビルドする必要があります。問題無いはず。

```
$ qemu-system-arm -M versatilepb -cpu '?' | grep arm1176
```

## Raspbianおよびkernelをダウンロード

[Raspberry Pi Downloads - Software for the Raspberry Pi](https://www.raspberrypi.org/downloads)から、`RASPBIAN WHEEZY`をダウンロードします。ファイルサイズが大きいので注意。ダウンロードしたら展開して、`raspbian.img`にリネームします。

次に、[dhruvvyas90/qemu-rpi-kernel](https://github.com/dhruvvyas90/qemu-rpi-kernel)から`kernel-qemu-3.10.25-wheezy`をダウンロードします。ダウンロードしたら、`kernel-qemu`にリネームします。

## Raspbian使用準備

RaspbianをQEMUで使用するためには、いくつかの調整を行う必要があります。なお、この作業の一部でキーボードが英語配列になることがあるので注意。

### Raspbianを起動(1回目)

調整のため、1回目の起動を行います。

```
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda raspbian.img
```

### `ld.so.preload`を修正

`/etc/ld.so.preload`を修正します。1行目先頭に`#`を追加して、コメントアウトします。

```
# sed -i -e 's/^/#/' /etc/ld.so.preload
```

### `90-qemu.rules`を作成

`/etc/udev/rules.d/90-qemu.rules`を作成します。

```
# touch /etc/udev/rules.d/90-qemu.rules
# echo 'KERNEL=="sda", SYMLINK+="mmcblk0"' >> /etc/udev/rules.d/90-qemu.rules
# echo 'KERNEL=="sda?", SYMLINK+="mmcblk0p%n"' >> /etc/udev/rules.d/90-qemu.rules
# echo 'KERNEL=="sda2", SYMLINK+="root"' >> /etc/udev/rules.d/90-qemu.rules
```

### Raspbianを終了

これで使用準備ができました。いったん、終了します。

```
# exit
```

## Raspbianを起動(2回目)

Raspbianを起動します。以降、以下のコマンドでRaspbianを起動します。1回目の起動とはコマンド内容が少し異なるので注意。

```
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda raspbian.img -redir tcp:5022::22
```

正常に起動したら、設定完了です。この時点の`raspbian.img`をバックアップしておくと、状態を元に戻すのが楽になります。

`-redir tcp:5022::22`で、ホストOSの5022番ポートを、ゲストOSの22番ポートにリダイレクトします。5022番ポート以外を使用する場合は、このオプションを変更します。sshログインするには、以下のようにコマンドを実行します。パスワードは`raspberry`です。

```
ssh -p 5022 pi@localhost
```

# 参考

* [Raspberry Pi を QEMU でエミュレートする方法 (2015年7月更新)](https://blog.ymyzk.com/2013/12/raspberry-pi-qemu/)
* [OSX raspberry pi emulation via QEMU](https://gist.github.com/JasonGhent/e7deab904b30cbc08a7d)
git-svnで(trunkとかbranchとかのない)SVNからGitに移行

メモ
#目的
SVN管理していた、いにしえのプロジェクトレポジトリをgitに移行したい

#手順
参考下記
http://qiita.com/hidekuro/items/4727715fbda8f10b6b11

まず試す
>■cloneコマンド
git svn clone -s --prefix=svn/ https://your.svn/repos/project
■init => fetchコマンド
git svn init -s --prefix=svn/ https://your.svn/repos/project
git svn fetch

→これでうまくいかない場合

svnの使い方もそこまで詳しくないですが、普通はルートディレクトリに/trunkとか/brunchってディレクトリがあって、それをgitにも反映してくれるっぽい。
ただ、そういう使い方をそもそもせずtrunkディレクトリ等が存在しない場合、上記コマンドだと"Initialized empty Git repository"と表示された後なにもadd されずに空のgitレポジトリができる。そういうときは
--trunkオプションでtrunkをルートディレクトリに指定する
```
git svn clone --trunk=/ http://hogehoge.com/svn/hoge_repository
```
うまくいくとSVNレポジトリがmasterブランチにcloneされる。その他--branchオプションなどもあるようなので必要なら使うといいかも

##確認

```shell-session:
yama@test $ git branch -a
* master
  remotes/origin/trunk
yama@test $ git svn info
Path: .
URL: http://hogehoge.com/svn/hoge_repository
Repository Root: http://hogehoge.com/svn/hoge_repository
Repository UUID: 7C43DC2B-C610-4F65-8628-6B6DCB8BB1CB
Revision: 1234
Node Kind: directory
Schedule: normal
Last Changed Author: hoge
Last Changed Rev: 1233
Last Changed Date: 201x-xx-xx 09:17:30 +0900 (月, xx xx 20xx)
```

上記のようにブランチ・元のsvnレポジトリ情報は残る。

##元のレポジトリ情報削除

移行したらむしろ元のsvnレポジトリは消したいので、リモート情報も一緒に消したかった。
branchは消し方分かったけど、svnレポジトリの情報の消し方分からないので知ってる方いたらご教授願いたいです…


```shell-session
yama@test$ git branch -rD origin/trunk #-rでリモート、-Dで強制削除
Deleted remote branch origin/trunk (was 098f6bc).
```

以上
fluentdからAmazon Elasticsearch ServiceにPOSTする

403エラーに悩まされたのでメモ。

### 結論
[これ](https://github.com/atomita/fluent-plugin-aws-elasticsearch-service/issues/2)と同じエラーで悩まされたが、以下の設定で[fluent-plugin-aws-elasticsearch-service](https://github.com/atomita/fluent-plugin-aws-elasticsearch-service)は正常に動いた。


### fluentd側
#### fluent-plugin-aws-elasticsearch-serviceのインストール

```bash
sudo td-agent-gem install fluent-plugin-aws-elasticsearch-service
```

#### configサンプル
`type_name`が無いと403エラーになる

```
<match **.**>
  type copy

  <store>
    type aws-elasticsearch-service
    type_name access_log
    logstash_format true
    include_tag_key true
    tag_key @log_name
    flush_interval 10s

    <endpoint>
       url https://search-***.ap-northeast-1.es.amazonaws.com
       region ap-northeast-1
       access_key_id ***
       secret_access_key ***
    </endpoint>
  </store>
</match>
```

### AWS ES側
#### policy

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::***:user/***"
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:***:domain/***/*"
    }
  ]
}
```
CentOS7 スワップファイル（swap file）の作成方法

##はじめに

VPSレンタルサーバーやクラウドサーバーを使用すると、swapが用意されていたないことがあります。swapがあるのとないとでの違いは、一時的なメモリ不足による問題を回避できるか否かにあります。この記事では、このswapを作成する方法について記述します。
むろん、慢性的なメモリ不足の場合は、実メモリを増やすべきです。

※ここでの手順は、[VULTR](http://www.vultr.com/?ref=6844506)[^1]クラウドサーバーで検証しました。

[^1]: このリンクはアフィリエイトリンクです。アフィリエイトリンクがいやな方は[こちら](http://www.vultr.com/)から。

※LVM(logical volume manager)を使用しているシステムではswapを用意していると思いますので、LVMを使用していないことを前提としています。

※タイトルにCentOS7としていますが、6でもOKだと思います。

※この記事は2015年11月現在の情報をもとに記述しています。

##手順

####swapがないことを確認（Swap:行の値が0であることを確認）

```
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            741          75         439           9         226         545
Swap:             0           0           0
```

####swapファイル領域を確保

下記例では1GBを確保（下記例ではブロックサイズ1MBで1024個）

```
[root@localhost ~]# dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.56416 s, 419 MB/s
```

####パーミッションを変更

```
[root@localhost ~]# chmod 600 /swapfile
```

####swapの作成（ファイルシステムをswapにする）

```
[root@localhost ~]# mkswap /swapfile
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=d0519bf6-8abf-4c0d-9375-8068c9e5e9a1
```

####swapの有効化

```
[root@localhost ~]# swapon /swapfile
```

####swapの確認（Swap:行の値が0でなくなっている）

```
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            741          76          57           9         606         537
Swap:          1023           0        1023
```



##swapの永続化
上記の手順だけでは、システムを再起動した場合、swapが無効化されてしまいます。永続化するためには、viなどで/etc/fstabを開き下記の1行を追記する必要があります。

```
/swapfile                                 swap                    swap    defaults        0 0
```

　
***
VAIO Pro 13でUSBブータブルなUbuntuを作成する

最近、MacBook Airを処分し、VAIO Pro 13(SVP132A1CN)を購入した。
Macを卒業した理由は自由なUNIX環境が欲しかったから。
El Captainで課せられた制約を受け入れがたかったため、手放してWindowsマシンに回帰することにした。

普段はWindows 10+Virtual Box+Vagrantで作業しているが、ハードウェアを制御したい場合や性能を得たい場合にはネイティブなLinuxが必要な場合もある(かといって100%常用するわけではない)。
そこで外付けのUSBディスクを用意し、USBブータブルなUbuntuを構築することにした。

ところで、VAIOのUEFIの仕様がいまいち汎用性に欠けるため、ブートできるディスクを作るのに難儀したのでメモを記す。

## USBブータブルなUbuntu作成手順(初回手順)

1. USBディスクにするSSD(or HDD or USBメモリ)にUbuntuを、他にディスクを一切繋がないデスクトップPCでインストール(私は内蔵SSD 120GBを購入)
2. デスクトップPCでUbuntuを起動し`/boot/EFI/ubuntu/*` を `/boot/EFI/Boot/` にコピー
3. `/boot/EFI/ubuntu/shim*.efi`を `/boot/EFI/` にコピー
4. インストール完了したSSDをUSB外付けケースに換装
5. VAIOのBIOS設定を実施
  - Intel(R) AT Support System: Disabled
  - Secure Boot: Disabled
  - Boot Mode: UEFI
  - External Device Boot: Enabled

## 起動手順(VAIOでいつもやること)
 1. USBディスクをVAIOに接続(手前の非充電用ポート)
 2. AssistボタンでVAIOを起動
 2. 「外付けディスクから起動」を選択

※ BIOS設定で起動順をExternal Disk優先にしておけば上記2,3手順の代わりに通常の電源ONでOK

## Grubのアップデートを行った場合
 1. 再起動前に上記初回手順の2,3を行う

---

##　参考文献

- https://www.preining.info/blog/2014/08/sony-vaio-uefi-lie/
- http://qiita.com/rit-rit/items/5adefbd7d4876f0917c3
Kakaxiの紹介

# Kakaxiの紹介

　まずはこちらのビデオをご覧ください（Qiitaってaタグにtarget指定できないのかな？）。
[![alt](https://i.vimeocdn.com/video/510432806_200x150.webp)](https://vimeo.com/121867084)

　なんか、いいですよね！

　[Kakaxi](http://kakaxi.jp/)は農業における生産者と消費者を繋げるデバイスとアプリを含めた総合的なサービスです。自社開発の小型モニタリングデバイスが設置された農場から、気温や湿度、土壌の他に画像などの情報が近くの携帯端末にBluetooth経由で送信され、サーバを経由して様々な端末と共有することができます。また生産者と消費者は互いに農作物やその利用などを共有し合うことで、ただの商売上の関係からより緊密な互いの顔が見える関係へと発展することができます。現在は米国内で展開中ですが、2016年からは日本でも始動する予定だそうです。

　個人的にはこの[モニタリングデバイス](http://kakaxi.jp/#s6)にすごく興味があります。IoTと呼ばれるデバイスの開発は日本でも盛んですが、クオリティを保ったまま量産するとなるとなかなか難しいですよね。普段親しんでいるウェブやアプリ開発の世界からはあまり触れることのなかった領域なので、今回色々とお話を伺うことができて最も面白かったのがこのあたりの事情でした。

　こういったデバイスの量産が色々と実現できるなら、農業分野での技術革新や他の一次産業においても、例えば漁業や林業での資源管理といった様々な用途が浮かんできそうですね。

## Titanium

　なんとKakaxiの機能の一部（Android向けクライアント）はTitaniumで開発されています。Titaniumはサーバ上のAPIとの連携が必須であったり、素早い立ち上げと柔軟な対応が求められるスタートアップ案件にもぴったりのソリューションです。あまり長い時間をかけることができない状況でしたが、まずは最小の要件を固めて開発を進め、今回無事にリリースすることができました。

　現在のところ米国内で事業展開が進んでいるため、日本国内に在住の方にはまだ使い道がないサービスではありますが、早く日本でも展開されるといいですね。

[Android版](https://play.google.com/store/apps/details?id=me.kakaxi.KakaxiUserapp)
[iOS版](https://itunes.apple.com/us/app/kakaxi/id1006511486?mt=8)


## 関連記事

もっとKakaxiの事を知りたい、という方はこちらもご覧ください。
[Kakaxi - A Startup Showcase Success Story](http://sxsweco.com/news/2015/kakaxi-startup-showcase-success-story)
[Forbes日本版2015年12月号](http://forbesjapan.com/magazines/detail/11) *「米国発凄いアイデア100選」日本発なのに…
Androidのメソッド数が65536を超えた場合にビルドができなくなる問題にProguardで対応する

# 概要
Androidはアプリ内で定義しているメソッド数（依存ライブラリも含む）が65536を超えると、ビルドできなくなる問題があります。
この問題に対する対応法は[こちらの記事](http://qiita.com/chuross/items/c874e5058aa5847e1b98)を参照していただけば十分であるが、Proguardでの対処法について具体例がないため本記事ではそのあたりについて述べます。

# 注意
正直Proguardで対応するよりも、上記の記事の通りにMultiple Dex Filesを使用して対応した方が汎用性があり、かつデメリットが少ないのでオススメです。

# Proguardでやる
Proguardには難読化（obfuscate）以外に、使用していないメソッドの削除（shrink）、最適化（optimize）といった機能があります。
今回はメソッド数が65536を超えてしまった場合に、Proguardで使用していないメソッドを削除させてメソッド数を65536以下に押さえ込むことを考えます。
（Proguardを使用しメソッドを削除しても65536を超える場合はMultiple Dex Filesを使用して対応してください。）

Proguardはデフォルトで使用していないメソッドの削除機能が有効なので、Proguardを有効にすればOKです。
しかし、デバッグビルドでもProguardによる難読化・最適化がなされてしまうとデバッグに非常に手間取るため、これらを無効にします。

```groovy:build.gradle
buildTypes {
    debug {
        debuggable true
        // デバッグビルドでもProguardを有効にする
        minifyEnabled true
        // デバッグビルド用のProguardルールファイル proguard-rules-debug.pro を指定する。
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro'
    }
    release {
        debuggable false
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
```

proguard-rules-debug.proは下記の通り。

```:proguard-rules-debug.pro
# リリースビルド用のProgurdルールをインポートする
-include proguard-rules.pro

# テストとかのため、自信で記述したアプリケーションのクラスは保持
-keep class your.application.packagename.** { *; }

# シュリンクはする
#-dontshrink
# 難読化しない
-dontobfuscate
# 最適化しない
-dontoptimize
```

これでProguardによる難読化・最適化されずに、使用していないメソッドの削除がなされます。

# Proguardでやることのメリット・デメリット
## メリット
* Multiple Dex Filesを使用するとパフォーマンスが悪い（らしい）のを回避できる
  * 個人的にはこれを体感したことがない…
* Multiple Dex Filesを使用するとアプリのファイルサイズが増えるのを回避できる

## デメリット
* デバッグビルドでもビルドに時間がかかるようになる
  * アプリの規模にもよりますが、10画面以上の商用アプリでビルド時間が倍近くに延びました。正直いらいらするレベルです。
* 使用していないメソッドを削除してもメソッド数が65536を超える場合には、どうにせよMultiple Dex Filesを使用しなければならない

# まとめ
メリットの少なさのわりにデメリットが大きいので、おとなしくMultiple Dex Filesにしとけってことですね。
カタカナ表記スタイルを統一する

### -データかデーターか、インストーラかインストーラーか、それが問題だ-

この記事はhttp://qiita.com/advent-calendar/2015/english_translation
の2日目の記事です。
(前日はコチラ http://qiita.com/Uemmra3/items/f1eddd83f01c295b5f10)
(翌日はコチラ http://qiita.com/Uemmra3/items/f94ffd61e9fac80972aa)

# カタカナ表記スタイル
data の訳語は**データ**あるいは**データー**となる。
見ての通り、語末を伸ばすのか、伸ばさないのかのどちらかである。
これが混じってると読みにくい文書になるので、翻訳している時やセルフチェックの時に、スタイルを統一して行きたい。
ただしこれには好みがあるので、絶対的なルールではない。

ちなみに、Microsoftは2008年の時点で、伸ばさなかった用語を伸ばす様に変更したようである。
http://www.atmarkit.co.jp/news/200807/25/microsoft.html
私はあまり伸ばさないのが好きかも？

# まとめ
カタカナ語の終わりの長音のスタイルを、**データ**か**データー**のどちらかに統一すると読み易い。
【JavaScript】日付処理

##Dateクラスの関数またはコンストラクタ呼出し
下記以外にも形式あるらしいが割愛。

new Date()
現在時刻のDateインスタンス

new Date(year,month,date,hours,minutes,secounds)
引数の指定時刻のDateインスタンス
monthの指定は0始まりなことに注意！

```
//2017年1月15日 22時30分
new Date(2017,0,15,22,30)
```

new Date(value)
引数をエポックミリ秒に解釈したDateインスタンス

Date()
現在時刻の文字列

##インスタンスから各種値の取得

インスタンスはエポックタイムで時刻を保持していて、文字列や数値として取り出すときにロケールやタイムゾーンに合わせて変換される。

以下は全て全てローカル時刻。UTCも表示できるが割愛。

```js:js
var dt = new Date();

//年
var year = dt.getFullYear();

//月
//1月が0、12月が11。そのため+1をする。
var month = dt.getMonth()+1;

//日
var date = dt.getDate();

//曜日
//日曜が0、土曜日が6。配列を使い曜日に変換する。
dateT = ["日","月","火","水","木","金","土"];
var day = dateT[dt.getDay()];

//時
var hours = dt.getHours();

//分
var minutes = dt.getMinutes();

//秒
var seconds = dt.getSeconds();
```

##インスタンスへ各種値の設定
規定値の範囲を超えると繰り越される。例えば、setMonthで12を設定すると0となる。（11が12月なので0は1月）
逆に規定値の範囲を下回ると戻る。setMonthで-1を設定すると10になる。
これは日付の加算減算に利用される。

```js:js
var dt = new Date();

//年
dt.setFullYear(2015);

//月
//1月が0、12月が11。
dt.setMonth(10);

//日
dt.getDate(30);

//曜日
//日曜が0、土曜日が6。
dt.getDay(1)

//時
dt.getHours(21);

//分
dt.getMinutes(30);

//秒
dt.getSeconds(15);
```

##日付の加算減算
月の加算減算、さらに日付の加算減算は月によって日数が違ったりうるう年などあるため単純に計算するのは難しい。set系のプロパティを使って計算すると簡単にできる。

月、日、時間、分を足したり引いたりするだけ。

```js:js
var dt = new Date();

//３か月後
dt.setMonth(dt.getMonth() + 3);

//３か月前
dt.setMonth(dt.getMonth() - 3);

//3日後
dt.setDate(dt.getDate() + 3);

//3時間後
dt.setHours(dt.getHours() + 3);

//3分後
dt.setMinutes(dt.getMinutes() + 3);
```

##日付の差分
getTime()でエポックミリ秒を取得して差分を出す。それを割って変換。
小数を四捨五入するか切り捨てるかはその時次第。

###年、週、日、時、分、秒、ミリ秒の場合。

```
var diff = dst.getTime() - src.getTime();
//秒
var second = diff/1000;

//分
var minute = diff/1000*60;

//時
var hour = diff/1000*60*60;

//日
var day = diff/1000*60*60*24;

//年
var day = diff/1000*60*60*24*365;
```

###月の場合
参考を参照。

参考：[2 つの Date 間の差分を求める](http://qiita.com/janus_wel/items/f27156d6314c4fd40657)

##Dateクラスのスタティックなプロパティ
newとかしなくても使えるプロパティ。

now()
現在時刻のエポックミリ秒を返す

parse(string)
引数の文字列をパースしてエポックミリ秒を返す

## 比較
getTime()でエポック秒を取得して比較する
オブジェクトの比較は大小は日付の比較となるが、==や===がオブジェクト自体比較となるため

```
if(date1.getTime() > date2.getTime(){
  
}
```

##その他
日付を扱うならmoment.jsが便利らしい。

参考
[JavaScript の Date は罠が多すぎる](http://qiita.com/labocho/items/5fbaa0491b67221419b4)
GoogleCloudStorageに、curlでResumable Upload メモ


## 流れ

1. Resumable upload sessionを作成する
1. 作成したsessionにチャンクをアップロードする。ただし、最終のものを除き、チャンクサイズは256KB(262144 bytes)の倍数である必要がある。
1. 最後までチャンクがアップロードされると、GCS上でオブジェクトとして認識される。

なお、[GCS JSON API](https://cloud.google.com/storage/docs/json_api/)(v1)にて。

## 例

使うファイル

```
786432(bytes) chunk1.txt
213568(bytes) chunk2.txt
```

を結合して、file.txtを作る、とする。

### Resumable upload sessionの作成

```bash
curl -v \
     -H "Authorization: Bearer <access_token>" \
     -H "Content-Length: 0" \
     -H "X-Upload-Content-Type: text/plain;charset=utf-8" \
     -H "X-Upload-Content-Length: 1000000" \
     -X POST \
     "https://www.googleapis.com/upload/storage/v1/b/<bucket>/o?uploadType=resumable&name=file.txt"
```

すると

```bash
< HTTP/1.1 200 OK
< X-GUploader-UploadID: AEnB2Uoatj_...
< Location: https://www.googleapis.com/upload/storage/v1/b/<bucket>/o?uploadType=resumable&name=file.txt&upload_id=AEnB2Uoatj_...
<
```

な感じのレスポンスが返る。
`AEnB2Uoatj_...` が、このオブジェクトへのResumable upload sessionを表すIDとなる。

なお、sessionは一週間有効な模様。[document link](https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload#resumable)

またOAuth2 access_tokenの取得は
http://qiita.com/giiko_/items/b0b2ff41dfb0a62d628b
がわかりやすい。

### チャンクアップロード

##### chunk1.txtをアップロードする。

```bash
curl -v \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-type: text/plain;charset=utf-8" \
    -H "Content-Range: bytes 0-786431/1000000" \
    -H "Content-Length: 786432" \
    -H "Expect: ''" \
    -X PUT \
    --data-binary '@chunk1.txt' \
    "https://www.googleapis.com/upload/storage/v1/b/<bucket>/o?uploadType=resumable&name=file.txt&upload_id=AEnB2Uoatj_..."
```

アップロードサイズは256KBの倍数になるように注意する。
中途半端なサイズは切断される。また数byteなど、小さすぎるサイズも弾かれる。

また、`Content-Range: bytes 0-786431/1000000` のように、範囲の末尾の指定は、
アップロードサイズ-1 になることに注意。

ちなみに、`Expect: ''` は、リクエストボディのサイズが大きいと、curlが自動で `Expect: 100-continue`を付けてくれるのを抑止するため。

レスポンスは、以下のような感じ

```bash
< HTTP/1.1 308 Resume Incomplete
< X-GUploader-UploadID: AEnB2Uoatj_...
< Range: bytes=0-786431
< X-Range-MD5: ...
< Content-Length: 0
```

`308 Resume Incomplete` で、オブジェクトが未完成なことが示される。

##### 残りのchunk2.txtをアップロードする。

```bash
curl -v \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-type: text/plain;charset=utf-8" \
    -H "Content-Range: bytes 786432-999999/1000000" \
    -H "Content-Length: 213568"
    -H "Expect: ''" \
    -X PUT \
    --data-binary '@chunk2.txt' \
    "https://www.googleapis.com/upload/storage/v1/b/<bucket>/o?uploadType=resumable&name=file.txt&upload_id=AEnB2Uoatj_..."

```

すると、

```bash
< HTTP/1.1 200 OK
< X-GUploader-UploadID: AEnB2Uoatj_...
```

な感じのレスポンスが返り、
オブジェクトのアップロードが完了したことがしめされる。

### アップロード中断したオブジェクトの状態を知りたい

```bash
curl -v \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-Length: 0" \
    -H "Content-Range: bytes */1000000" \
    -X PUT \
    "https://www.googleapis.com/upload/storage/v1/b/<bucket>/o?uploadType=resumable&name=file.txt&upload_id=AEnB2Uoatj_..."
```

すると、

```bash
< HTTP/1.1 308 Resume Incomplete
< X-GUploader-UploadID: AEnB2Uoatj_...
< Range: bytes=0-786431
< X-Range-MD5: ...
< Content-Length: 0
```

なレスポンスが返り、786432bytesまでアップロード完了していることが判断できる。
C# > コード スニペット - Push any key!

#コンソールアプリでサンプルを作成する我々の為に。
コンソールアプリケーションで簡単なサンプルを作成して実行結果を確認する為に、一時的に実行を中断し、実行結果をコンソールで確認した後、何かキーを押すと再開する極々単純なスニペットを作成しました。
今までは手打ちで書いてましたが、スニペットにしてから楽になりました。
よかったら使ってみてください。
#挿入されるコード
`Console.WriteLine("\n\nPush any key!");
Console.ReadKey();`
#コードスニペット
```pushanykey.snippet:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>pushanykey</Title>
      <Author>AKIRA</Author>
      <Description>実行結果を確認する為に実行を一時停止します。何かキーを押すと再開されます。</Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>push</Shortcut>
    </Header>
    <Snippet>
      <Code Language="csharp" Delimiter="$"><![CDATA[Console.WriteLine("\n\nPush any key!");
Console.ReadKey();]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
```
"If" の訳し方

### -エイヤッでやっつけてラクしよう-

この記事はhttp://qiita.com/advent-calendar/2015/english_translation
の1日目の記事です。
(翌日はコチラ http://qiita.com/Uemmra3/items/911f5bcb9cbef80ac27e)

# If の訳し方
プログラマとしては最も初めに習う文法の1つであるIfだが、英語でも基本の構文である。
とにかく、そこらへんにたくさん出てくる。なので翻訳する時には、なるべく考えずに訳したいので、次の方法を提案する。

技術英語においては、この**If**は必ず、 **～の場合** と訳すこと。

ポイントとしては、**とにかく悩まない！**ということ。
場合によっては、「もし～だったら」とかの訳語の方がふさわしいこともあるかもしれない。「もしもピアノが引けたなら」という歌が「ピアノが引けた場合」であったら味気ない。ただ**技術英語には情緒やニュアンスよりも正確さが重要**である。

# まとめ
技術英語においては、**If**は必ず、 **～の場合** と訳すこと。
(bash) Macかどうかで処理を分ける

MacだとGNU sedが `gsed`だったりしてめんどい。
Macはgsed、Linuxはsedを使いたいとかそういう時。

## 要約

```bash
if [ $(uname) = Darwin ]; then
  echo Mac
fi
```

## 他には？

正規表現の`=~`を使ってもできるらしい。

## Thanks

@Takeru さんのコメントを元に書きなおしました。
ありがとうございます！
実機でiOSアプリ実行時のエラー　dyld: Library not loaded: @rpath/Pods_xxx.framework/Pods_xxx

##実機でエラー発生
シミュレーターでは問題なくアプリを起動できたものの実機で下記のエラーが発生した。
```
dyld: Library not loaded: @rpath/Pods_xxx.framework/Pods_xxx
```
CocoaPodsのライブラリがロードされないというエラーが起きている。

##原因はframeworkのステータスがRequiredになっていること
CocoaPodsのissuesを見ると、GeneralのLinked Frameworks and LibrariesのPods_xxx.frameworkのstatusがRequiredになっているのがエラーの原因だった。


>It wasn't being copied to device by the .sh script and so the app crashed. Setting this to optional fixed the issue.
[dyld: Library not loaded: @rpath/Pods.framework/Pods #3586](https://github.com/CocoaPods/CocoaPods/issues/3586)

Pods_xxx.frameworkのステータスをoptionalにしたら無事、実機でiOSアプリが起動した。
(bash) dateで指定した日付を表示する

1日前、1ヶ月後等の日付を表示する。
フォーマットと併用すると、結構使う機会多い。

## 要約

### BSD date

Macの標準はこっち。

```bash
# 1日先
date -v+1d
# 1ヶ月前
date -v-1m
```

### GNU date

Linuxの標準はこっち

```bash
# 1日先
date --date '1 days'
# 1ヶ月前
date --date '1 month ago'
```

## 説明

dateはBSDかGNUで使い方が大きく異なるので注意。
`date --version` でバージョンが出るのはGNU
出ないのはBSD

もしくは、`man date` をすればBSDかGNUか判明する。
python > array > 個数を決めて初期化する > mylist = [idx for idx in range(10)] / mylist = [0 for idx in range(10)] >> mylist = [0] * 10

pythonでサイズNのarrayとして宣言、というのがよくわからなかった。

http://www.i-programmer.info/programming/python/3942-arrays-in-python.html?start=1
このあたりを読んで分かったやり方。

## try1

http://ideone.com/3oPLwu

```test.py
mylist = [idx for idx in range(10)]
print mylist
```

```txt:結果
Success	time: 0.03 memory: 44680 signal:0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

これで100の個数のarrayも一応初期化できる。

初期値を0にしたい場合は一番左のidxを0にすればいいようだ。

```
mylist = [0 for idx in range(10)]
```

## improved
(2015/12/01追記)

初期化だけならコメントでお二方に教えていただいた下記の方法がシンプルで見やすい。

```
mylist = [0] * 10
```

range()の注意点などは @shiracamus さんの コメント(2015/12/01 07:41)に詳しいので参照ください。
いまさらJavaScriptのクロージャ超簡単説明(投稿テストです)

サンプルはこちらになります
https://github.com/Tomonobu3110/jQueryStudy/tree/master/Test/Closure

(01-Dec-2015 追記)

クロージャについて、ごくごく簡単にまとめました。
1から7に向かって進化していくイメージで。

- 1. 普通に関数実行

```js
    function hoge() {
        alert("hoge");
    };
    
    hoge();  // ごくごく普通ですね。
```

- 2. 関数って変数に代入できるんだ。それで実行できるんだ。

```js
    function hoge() {
        alert("hoge");
    };

    var func = hoge;  // 関数名を変数に代入！
    func();           // そんでもって実行！
```

- 3. 関数の中に関数って書けるんだねー。

```js
    function outer() {
        var cnt = 1;
        function inner() {  // 関数の内側で関数を定義
            cnt++;          // 外側の関数で宣言した変数にアクセスできるね。
            alert(cnt);
        }
        inner();  // そして内側の関数の実行
    };

    outer();
```

- 4. 関数の中の関数を、外から実行してみよう。

```js 
    function outer() {
        var cnt = 1;
        function inner() { 
            cnt++;
            alert(cnt);
        }
        var ret = inner;  // 内側の関数を変数で受けて...
        return ret;       // それを戻り値で返す
    };

    var inner2 = outer();  // inner2に内側関数を代入して
    inner2();              // 実行
```

- 5. 関数の中の関数の書き方を省略する(無名関数の利用)

```js 
    function outer() {
        var cnt = 1;
        return function () {
            cnt++;
            alert(cnt);
        }
    };

    var inner = outer();
    inner();
```

- 6. 引数とか戻り値とかを追加してみよう

```js
    function outer(init) {  // 引数を受け取って
        var cnt = init;     // 初期値として設定できるようにしてみた

        return function (delta) {  // 引数を受け取って
            cnt += delta;          // 好きなだけ増やせるようにしてみた
            alert(cnt);
            return cnt;            // 表示した値を返せるようにしてみた
        }
    };

    var inner = outer(10);     // 初期値は10
    var c = inner(2);          // 2足す
    alert("return --> " + c);  // 戻り値を表示
```

- 7. 内側の関数が一個じゃ足りないし...

```js
    function outer(init) {
        var cnt = init;

        var obj = new Object();       // オブジェクト使えばいい
        obj.add = function (delta) {  // 足し算用関数(メソッド)
            cnt += delta;
            return cnt;
        }
        obj.show = function() {       // 表示用関数(メソッド)
            alert("show --> " + cnt);
        }

        return obj;
    };

    var inner = outer(10);
    var c = inner.add(2);   // 足し算と
    inner.show();           // 表示をバラバラに呼び出す
    alert("return --> " + c);
```

以上です
babel v6 での loose mode

## overview

ひさびさにbabelを使ったら、version 6になっていてloose optionが削除され、指定方法が変わっていたのでmemo


> ## 6.0.0
* **Breaking Change**
  * Remove `loose` option in favor of plugin options.

> [changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)


「loose optionは削除したので、pluginのoptionを使って」って感じ？


ということで`.babelrc`などでpluginを指定して、loose optionを指定してあげましょう

## babelrc

```json
{
  "presets": ["es2015"],
  "plugins": [
    ["transform-es2015-classes", { "loose": true }],
    ["transform-es2015-computed-properties", { "loose": true }],
    ["transform-es2015-template-literals", { "loose": true }],
    ["transform-es2015-for-of", { "loose": true }],
    ["transform-es2015-modules-commonjs", { "loose": true }],
    ["transform-es2015-spread", { "loose": true }],
    ["transform-es2015-destructuring", { "loose": true }]
  ]
}
```

他にもloose optionのあるpluginがあったら編集リクエストいただけると幸いです<(_ _)>


## gulp-watchify + babelify の場合

```js
var gulp    = require("gulp"),
  watchify = require("gulp-watchify");

gulp.task("watch", watchify(function(watchify){
  return gulp.src("./src/index.js")
    .pipe(watchify({
      watch: true,
      setup: function(bundle) {
        bundle.transform(require("babelify"), {
          presets: ['es2015'],
          plugins: [
            ["transform-es2015-classes", { "loose": true }],
            ["transform-es2015-computed-properties", { "loose": true }],
            ["transform-es2015-template-literals", { "loose": true }],
            ["transform-es2015-for-of", { "loose": true }],
            ["transform-es2015-modules-commonjs", { "loose": true }],
            ["transform-es2015-spread", { "loose": true }],
            ["transform-es2015-destructuring", { "loose": true }]
          ],
          extensions: [".babel"]
        })
      }
    }))
    .pipe(gulp.dest("./dist/"));
}));
```
python > datetime > 年月日(例:20151130)形式の文字列を取得する > print today.strftime("%Y%m%d") / print "{:%Y%m%d}".format(today)

2015年11月30日を20151130という文字列として受け取りたい。

参考 [SO](http://stackoverflow.com/questions/311627/how-to-print-date-in-a-regular-format-in-python)

色々あるが、以下の２つの方法でできそう。


http://ideone.com/i1SNzk

```test.py
import datetime
today = datetime.date.today()
print today

print today.strftime("%Y%m%d")
print "{:%Y%m%d}".format(today)
```

```txt:結果
Success	time: 0.03 memory: 44680 signal:0
2015-11-30
20151130
20151130
```

.format()の方は以下の２点から使用に躊躇する。

1. :が必要
2. .format(today)という書き方 (today.format()と反対)

.strftime()の方は覚えやすそう。
UILabelの文字列に点線の下線をつける

３行で簡単に

```swift:label
let attrText = NSMutableAttributedString(string: "hogehoge hogehoge")
attrText.addAttributes([ NSUnderlineStyleAttributeName: NSUnderlineStyle.PatternDot.rawValue|NSUnderlineStyle.StyleSingle.rawValue], range: NSMakeRange(0, attrText.length))
pageTitleLabel.attributedText = attrText
```

![スクリーンショット 2015-09-28 20.05.03.png](https://qiita-image-store.s3.amazonaws.com/0/37053/b316f04c-b631-ba90-14d0-d7116fa421b0.png)


NSAttributedStringそれなりに便利。
Storyboardを使っているならAttributesInspectorから同様の設定をすればコードも不要になる。
EC2インスタンスにEphemeral Diskがマッピングされているか確認する

# 概要

EC2インスタンス上でEphemeral Diskを使用するためには、

1. インスタンスを起動する時、Block Device MappingsにEphemeral Diskを含めるよう指定する
2. OS上で上記のEphemeral Diskをマウントする

という2段階が必要。1が正しくできているか、既存インスタンスを調べる方法を書きます。

# 方法

`aws ec2 describe-instances` でいいっしょｗｗｗって思ったそこのアナタ！残念！

> インスタンスのブロックデバイスマッピングを表示した場合、EBS ボリュームのみが表示され、インスタンスストアボリュームは表示されません。

- [インスタンスストアボリュームのインスタンスブロックデバイスマッピングの表示](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html#bdm-instance-metadata)

そして、次の文に正解が続きます。

> インスタンスメタデータを使用すると、完全なブロックデバイスマッピングに対してクエリを実行できます。

## 例

つまりこういうことです。

### Ephemeral Diskをマップできていない例

```
[ec2-user@ip-172-123-123-123 ~]$ curl 169.254.169.254/latest/meta-data/block-device-mapping/
ami
root
```

### Ephemeral Diskをマップできている例

```
[ec2-user@ip-172-234-234-234 ~]$ curl 169.254.169.254/latest/meta-data/block-device-mapping/
ami
ephemeral0
ephemeral1
root
```

# ちなみに

## Ephemeral DiskとInstance Storeって何が違うの

[ブロックデバイスマッピングの概念](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html#block-device-mapping-def)の図を見るとわかりやすいのですが、 **Instance Storeはn本のEphemeral Diskを含むストレージプール**と理解してます（違ったら教えてください）。
Bigquery | コンソールで100件しかレコードを表示できない

仕様っぽい。

100件より後は、データとしては取得できていても。
コンソール上の表示は省略される。

( 2015年11月現在 )



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
openFrameworks 0.8.4/0.9.0 + El Capitan + Xcode7 での起動 64bit出力

#環境
El Capitan
Xcode7
openFrameworks0.8.4/0.9.0(どちらでも)
**OS X 10.11.sdk**

#注意点
特になし、全部すんなりいったので驚きました。
すんなり行かなかった方は以下を参考に
http://qiita.com/totepo18/items/d92de308d027ef86c9aa
http://qiita.com/coa00@github/items/c91adb9505e72d057da9

![Skitch.png](https://qiita-image-store.s3.amazonaws.com/0/56510/a66ccc17-1549-fad5-f770-7c62de685933.png)

また、openFrameworks0.9.0からは64-bitができるみたいですが、そこだけいまいちまだ使い方がわかっていません。

#64-bit出力したい場合
64-bit出力したい場合はBuildSettingから以下のようにArchitectureを変更してください。

![Skitch-1.png](https://qiita-image-store.s3.amazonaws.com/0/56510/ffb36858-f9ff-268a-505d-b16387b55790.png)


間違ってたら(補足などありましたら)コメントください！！
Raspberry Piにvsftpd 3.0.3をソースからインストール

Raspberry Piのvftp 2.3.5ではchrootがうまく設定できないのでソースからビルドしたその記録。

# ソースファイルを取得し、展開、そのディレクトリへ移動

```
# wget https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz
# tar zxfv vsftpd-3.0.3.tar.gz 
# cd vsftpd-3.0.3/
```

# cryptに対するエラーを回避する

このままmakeすると下記エラーメッセージを表示し、ビルが失敗する。

```
sysdeputil.c:(.text+0xe0): `crypt' に対する定義されていない参照です
sysdeputil.c:(.text+0x100): `crypt' に対する定義されていない参照です
```

そこでvsf_findlbs.shにlibcryptの所在を記す。

```
# vim vsf_findlibs.sh
```

29行目に下記を追加

```
   locate_library /usr/lib/arm-linux-gnueabihf/libcrypt.so && echo "-lcrypt";
```

# make

vsf_findlbs.shを保存終了後、makeし、インストールする。

```
make
make install
```

# chrootの設定

chrootできるように設定ファイルを編集。

```
vim /etc/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
allow_writeable_chroot=YES
```

# vsftpdサーバを起動する。


```
/usr/local/sbin/vsftpd &
```
composerを使ってpsr-4に従ったautoloadをする

PHPでは長らく依存関係の管理ツールが使われてなかったようですが、[Technology radar](https://www.thoughtworks.com/radar/tools/composer)でもAdoptになってることですし使わない理由がありません。
それとクラス名の衝突をさけるためにもNamespaceの利用も外せません。
でいちいちrequireするのも面倒なのでautoloadも必須です。
ということで調べたところ簡単だったので残しておきます

https://getcomposer.org/doc/01-basic-usage.md

composerインストールされてない場合はインストール

```
$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
```

composer.jsonを作って下記を追加。
もしくはすでにある場合はautoloadのところを編集/追加。

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "Proj\\": "src/",
        }
    }
}
```

```
### まだcomposer install/updateやってない場合
$ composer install
### すでにcomposer install/updateやってる場合
$ composer dump-autoload
```

これでvendor/autoload.phpとvendor/composer/auttoload_psr4.php(ほかにも)が作成される

以上で設定は終わり

あとは使う側でvendor/autoload.phpをrequire_onceするだけ