OmniAICreator/Qiita-1.07M huggingface dataset:
[Number Theory] Euclidean Algorithm & Inverse Element

With the inverse element, we can get the value of modulo in a division, such as $k =(a / b) \%m$. To generate a inverse element, we should know the euclidean algorithm.

### Euclidean Algorithm

The euclidean algorithm is a method for computing ***greatest common divisor*** (GCD) of two integers.
The algorithm can be described as this:

```math
gcd(a, b) = gcd(b, a \% b) 
```

**Proof:**

Suppose $c = gcd(a, b)$ and $a > b$. 
Then we can write a equation.

```math
a = xb + m
```

Because the gcd of $a$ and $b$ is $c$, so we can replace the $a$ and $b$ with $k1 * c$ and $k2 * c$. After replaced $a$ and $b$, it seems like we also can replace $m$ with $k3 * c$. So the equation will like this:

```math
k1 * c = x * k2 * c + k3 * c
``` 

So $m$ and $b$ have the same gcd. Therefore the value of the $gcd(a, b)$
is the same with the value of $gcd(b, a \% b)$

So for this, we can get a $gcd(a, b)$ quickly with such as c++ language.

The code will like this:

```cpp
int gcd(int a, int b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}
```

### Solve *ax + by = gcd(a, b)*

We can use the `extgcd` to get the value of $x$ and $y$.

Suppose we have solved the $x'$ and $y'$ in this equation.

```math
bx' + (a \% b)y' = gcd(a, b)
```

Then we replace the $a % b$ with $a - (a / b) * b$:

```math
bx' + (a - \frac {a} {b} b)y' = gcd(a, b)
```

=>

```math
ay' + b(x' - \frac {a} {b} y') = gcd(a, b)
```

So we can know $x = y'$, and $y = (x' - (a / b)y')$.

When the $b = 0$, we can let $x = 1$ and $y = 0$ to get one result of $x$ and $y$:

```math
a * 1 + b * 0 = a = gcd(a, b)
```

Code:

```cpp
int extgcd(int a, int b, int &x, int &y) {
    int d = a;
    if (b != 0) {
        d = extgcd(b, a % b, y, x);
        y -= (a / b) * x;
    } else {
        x = 1; y = 0;
    }
    return d;
}
```

### Inverse Element

Suppose we have a function:

```math
a * x \equiv b (m)
```

We want to solve the $x$. If we know the $y$ in $a * y \equiv 1(m)$, then we can solve the $x$ in the before function. We call the $y$ is the inverse element of $a$. If we get the $y$, we can use $x = a^{-1} * a * x = a^{-1} * b$ to get $x$.

The function $a * y \equiv 1(m)$ can be replaced by $a * y - k * m = 1$. It's very clearly that it has no solutions when $gcd(a, m) != 1$. We can solve this function by `extgcd`.
Elixir | Doctests #elixir

# Elixir | Doctests
## 概要
Doctests によって、 API ドキュメントの内容をテストする
## 使用方法
@doc に iex の実行コード＋結果フォーマットを記述します。

~~~elixir
defmodule Doctests do
  @doc ~S"""
  FizzBuzz.

  ## Examples

      iex> Doctests.fizzbuzz(1, 15)
      [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
  """
  def fizzbuzz(from, to) when is_integer(from) and is_integer(to) do
    from..to |> Enum.map(&(fizzbuzz/1))
  end
  def fizzbuzz(_from, _to) do
    raise "invalid argument"
  end
  defp fizzbuzz(n) when rem(n, 15) == 0 , do: "FizzBuzz"
  defp fizzbuzz(n) when rem(n, 3) == 0, do: "Fizz"
  defp fizzbuzz(n) when rem(n, 5) == 0, do: "Buzz"
  defp fizzbuzz(n), do: n
end
~~~

そして、テストクラスには以下のように記述します

~~~elixir
defmodule YourModuleTest do
  use ExUnit.Case, async: true
  doctest YourModule
end
~~~

すると、テスト実行時に api コメントの Example が実行されます

~~~bash
$ mix test --trace
YourModuleTest
  * doc at YourModule.fizzbuzz/2 (2) (4.7ms)
~~~

## iex -S mix の利用して、 Example をコピペ

~~~bash
# プロジェクトの作成
$ mix new doctests

# 手動で実装クラス、テストを作成

# プロジェクトのコンテキストで iex を実行
$ iex -S mix
iex(1)> Doctests.fizzbuzz(1,15)
[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14,
 "FizzBuzz"]

# iex の出力結果をそのまま @doc の Examples に貼りつければ doctests 完成
~~~

## 参照
[DocTest](http://elixir-lang.org/docs/stable/ex_unit/ExUnit.DocTest.html)
SMTPのテストを行うシェルスクリプト

SMTPサーバの接続確認をする際、テストメールを送信することがあります。
最初のうちはtelnetコマンドを手で叩いて確認してましたが、だんだん面倒になってきたので、シェルスクリプト化してみました。
内部ではncコマンドを叩いているので、ncがない場合別途インストールしてください。
base64のエンコードは[このあたり](http://www.plus-a.net/tools/text_tool/)からどうぞ。

```bash=mail.sh
#!/bin/bash

host=メールサーバホスト
port=ポート番号(25、465、587とか)
user=SMTP認証のユーザ名（base64エンコードしたもの）
pass=SMTP認証のパスワード（base64エンコードしたもの）
to=宛先メールアドレス
from=送信元メールアドレス

function mail_input {
  echo "EHLO localhost"
  sleep 1
  echo "auth login"
  echo "$user"
  echo "$pass"
  echo "mail from: $from"
  echo "rcpt to: $to"
  echo "data"
  echo "To: $to"
  echo "From: $from"
  echo "Subject: Hello Mail Server"
  echo ""
  echo "test mail"
  echo "."
  echo "quit"
}

# send
mail_input | nc $host $port
```

実行権限を与えて実行！

```bash
$ chmod +x mail.sh
$ ./mail.sh
```

実行結果

```bash
$ ./mail.sh 
220 hostname ESMTP Postfix
250-hostname
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
334 xxxxxxxx
334 xxxxxxxx
235 2.7.0 Authentication successful
250 2.1.0 Ok
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>
250 2.0.0 Ok: queued as AFBEE10A9C52
221 2.0.0 Bye
```

SMTP認証が不要な場合、auth login、$user、$passの3行を削ればOK。
Twitter Bootstrapでスライドするボタン

**Bootsnipp** っていう、Twitter Bootstrapのコードを公開するのに丁度いいサービスを見つけたので、ついでに使ってみました。

* http://bootsnipp.com/snippets/00GPD

![slide-twbootstrap-button.png](https://qiita-image-store.s3.amazonaws.com/0/13836/28316e67-140d-8cce-d74f-bb8f7a555340.png)


使い方とか、動くサンプルそのものがそのまま貼り付け・書かれているので、そっちを参照してくださいw

---

かんたんな仕組みを説明すれば、Twitter BootstrapのJavaScriptカテゴリー、→ Buttonのところに**「Single toggle」**というのがあるので、これをベースにしています。

普通のボタン(.btn)に`data-toggle="button"`を付けると、クリックした際に`.active`クラスが付くのですが、このクラスが付いた時に色々CSSでくっつけるようにしています。

具体的には、CSS3の`transition`を使って右の方へ動かしています。簡単ですね・・・(JavaScriptによる実装ではありません。悪しからず…)

本当は`float`で動かしたかったんですが、どうも`float`はtransitionが効かなくてアレでした

* http://oli.jp/2010/css-animatable-properties/

仕方がないので、`margin-left:`とかで動かしています。結果、ボタンサイズが変わるとCSSを直さなければいけないというクソ仕様。うーむ・・・

何か妙案が思いついたら直しておきます。:cry: 

---

サンプルコードはTwitter Bootstrap3で動作するものですが、Twitter Bootstrap2にもSingle toggle Buttonは存在しているので、ちょっと直せば動くと思います。

是非ご活用を。
【Obsolete】PyPiで人気があるパッケージを探したい

> 2021年現在、下記のサイトは存在しなくなったようです。
> 同様のサイトがいくつかあるようです。

----

http://taichino.com/ さんの[PyPI Ranking](http://pypi-ranking.info/alltime)で検索できます。
キーワードを指定すると、全期間または週間のダウンロード数の降順でリストアップされます。
Python 3.x対応を示すアイコン付き。 (ただし、3.x対応パッケージ限定での検索はできない模様)
CSS4で追加される予定のセレクタを紹介するよっ

[CSS Advent Calendar 2014](http://qiita.com/advent-calendar/2014/css) 12日目です。二日連続ですがYuZakuroが担当します。

# 概要

CSS4のモジュールの一つであるSelectors Level 4にはセレクタについての記述があります。

尚、この規格は草案段階であり、変更される可能性があります。

今回は、その中でもリンクに関するセレクタを紹介したいと思います。

# :any-link 

a:link, a:visitedの両方を指します。

visitedでも色が変わらないようなデザインをすることはよくあります。そんなとき、CSS3では、下のように、わざわざlinkとvisitedの両方に同じ指定をしなければいけません。

CSS4では、:any-linkのみを指定するだけで実現できます。

~~~css:css3
a:link a:visited { color: #fff }
a:hover { color: #aaa }
~~~

~~~css:css4
a:any-link { color: #fff }
a:hover { color: #aaa }
~~~

# :local-link

ターゲットが同一ドメイン内のリンク。サイト内部へのリンクと外部サイトへのリンクのCSSを区別させられます。

引数をつけて、:local-link(n)のように指定すると、n番目のパスまで一致しているリンクに合致する要素になります。

例えば、URLが http://yuh.me/foo/bar.html の場合、次の例では１つ目のリンクは赤い文字で表示されますが、2つ目のリンクは青い文字になります。

~~~html
<style>
a { color: red }
a:local-link(1) { color: blue }
</style>

<a href="http://yuh.me/foo2/bar.html">Red</a>
<a href="http://yuh.me/foo/bar2.html">Blue</a>
~~~

# :target

***targetセレクタはCSS3ですでに存在しています*** 
@hiroqn@githubさん、＠miyamacatさん、ご指摘いただきありがとうございます。

http://yuh.me/foo2/bar.html#2 のようなURLのとき、ページ内リンクが指している要素を示します。

例えば、次の例ではURLが http://yuh.me/foo2/bar.html#2 のとき、２つ目のヘッダの背景色が黄色になります。

~~~html
<style>
*:target { background: yellow }
</style>
<section>
  <h1 id="1">Section 1</h1>
  ...
</section>
<section>
  <h1 id="2">Section 2</h1>
  ...
</section>
<section>
  <h1 id="3">Section 3</h1>
  ...
</section>
~~~

# まとめ

CSS4で追加される、リンクに関するセレクタを3つ紹介しました。実は、あとひとつ:scopeというセレクタもあるのですが、正しく理解できている自身がなかったので省きました。

リンク以外にも、便利なセレクタが多数追加される予定のようですので、普及するのが楽しみですね。

# 参考

- [Selectors Level 4](http://www.w3.org/TR/selectors4/)
Javaでチーム開発するための環境構築

IntelliJ IDEAによるGradle Projectの環境構築について紹介します。



## IntelliJ IDEA
IntelliJ IDEAとは、統合開発環境の1つです。現在はバージョン14が出ています。
他のJavaの統合開発環境だと、eclipseやNetBeansが有名です。
IntelliJ IDEAは補完が早いのが特徴で、個人的にはeclipseより早く開発できています。
また、標準のビルドツールにGradleを採用しています。

## Gradle
ant、mavenより便利なJavaのビルドツールです。groovyを採用しているので簡潔に記述できるのと、記述した依存関係のライブラリをインストールしてくれます。

## Gradleのインストール
ここでは、gvmを利用したインストール方法を紹介します。

```
GVMのインストール
$ curl -s get.gvmtool.net | bash

Groovyのインストール
$ gvm install groovy

Gradleのインストールできるバージョンを確認
$ gvm list gradle
インストール
$ gvm install gradle
バージョンの確認
$ gradle -v
```
## IntelliJ IDEA インストール
以下のサイトでダウンロードできます。
https://www.jetbrains.com/idea/

「Download IntelliJ IDEA」→「Download Community」
無料のCommunity Editionを選択してダウンロード。
Javaだけを使う分には、Community Editionでひとまず十分です。


## プロジェクト
「Create New Project」→「Gradle」を選びましょう。チームで開発する際には、Gitでソースコードを管理してGradleでビルトするのが非常に楽です。

## JavaプロジェクトでGradleを使うために
GradleがサポートするJavaプロジェクトの基本的なディレクトリ構造は以下のようになります。sourceSetでカスタマイズすることも可能です。

```
build.gradle
src/
  main/
    java/
    resource/
  test/
    java/
    resource
build/
  libs/
  
```

## build.gradleの例
```build.gradle

apply plugin: 'java'
apply plugin: 'idea'

sourceCompatibility = 1.7
targetCompatibility = 1.7
version = '1.0'

repositories {
	mavenCentral()
	maven {
		url "https://repository.cloudera.com/artifactory/cloudera-repos/"
		}
	}

sourceSets {
	main {
		java { srcDir 'src/main/java' }
		resources { srcDir 'src/main/resources'}
	}
}


ext.cdhVersion = '2.5.0-cdh5.2.0'

// HadoopとJUnitのライブラリを指定
dependencies {
	compile "org.apache.hadoop:hadoop-common:${cdhVersion}"
	compile "org.apache.hadoop:hadoop-mapreduce-client-core:${cdhVersion}"
	testCompile 'junit:junit:4.11', {
		transitive = false
	}
	testCompile 'org.hamcrest:hamcrest-all:1.3'
}

task wrapper(type: Wrapper){
    gradleVersion = '2.21'
}

```


## ビルド
あとはコードを書いてビルドするだけです。

```
$ gradle build
```

## 他のメンバーがビルドするために
以下のコマンドを叩いて、gradleディレクトリ、gradlewスクリプト、gradle.batバッチファイルを生成しgitに上げる


```
$ gradle wrapper
```

他のメンバーはgradlewでGradle環境を構築することができる。

```
$ ./gradlew
```
## おわりに
各々の詳細に関しては、Qiitaの他の記事に載っていますので、興味がある方は調べてみてください。
Yii2でちょろいOAuthログイン




[yiisoft/yii2-authclient](https://github.com/yiisoft/yii2-authclient)という公式のエクステンションでOAuthログインの実装がちょろいという話


twitterやfbでのログインを実装しようとするとどのAuthクライアント使うかとか、それぞれ別のエクステンション用意したりして面倒臭かったりするのですが、公式のOAuthエクステンションがすごい

まず標準のクライアントが多い

* Facebook
* GitHub
* GoogleOAuth
* GoogleOpenId
* LinkedIn
* Live
* Twitter
* VKontakte
* YandexOAuth
* YandexOpenId

Yandexとか日本に馴染みのない名前ですが、何かというとロシアの最大手検索サービスだそうです。Yiiが旧共産圏で人気なので需要あるんでしょうねきっと。

fbとtwitterとgithubとgoogleあればもう困らないかなという気もしますが、コレ以外のサイトを利用する場合も独自にクライアントを書けば対応できます。
[クライアントの設定もかなりシンプル](https://github.com/yiisoft/yii2-authclient/blob/master/clients/GitHub.php)なので簡単に対応出来そうです。（これはまた別の記事で）


組み込みも簡単。
composerでauthclientを追加して


```diff:composer.json
         "php": ">=5.4.0",
         "yiisoft/yii2": "*",
         "yiisoft/yii2-bootstrap": "*",
-        "yiisoft/yii2-swiftmailer": "*"
+        "yiisoft/yii2-swiftmailer": "*",
+        "yiisoft/yii2-authclient": "*"
     },
```

設定に利用するOAuthクライアント追加して

```diff:config/web.php
     'basePath' => dirname(__DIR__),
     'bootstrap' => ['log'],
     'components' => [
+        'authClientCollection' => [
+            'class' => 'yii\authclient\Collection',
+            'clients' => [
+                'google' => [
+                    'class' => 'yii\authclient\clients\GoogleOpenId'
+                ],
+                'facebook' => [
+                    'class' => 'yii\authclient\clients\Facebook',
+                    'clientId' => '<<FaceBookAppClientId>>', // Facebookで作成したアプリのキー情報
+                    'clientSecret' => '<<FaceBookAppClientSecret>>',
+                ],
+            ],
+        ],
```

ルートに当たるコントローラにコールバックを追加

```diff:controllers/SiteController.php
                 'class' => 'yii\captcha\CaptchaAction',
                 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
             ],
+            'auth' => [
+                'class' => 'yii\authclient\AuthAction',
+                'successCallback' => [$this, 'successCallback'],
+            ],
         ];
     }

+    public function successCallback($client)
+    {
+        $attributes = $client->getUserAttributes();
+        // ここでログイン処理。終わると勝手にリダイレクトする
+    }
+
```


viewにログインボタン追加

```diff:views/site/login.php
 <div class="site-login">
     <h1><?= Html::encode($this->title) ?></h1>

+    <?= yii\authclient\widgets\AuthChoice::widget([
+            'baseAuthUrl' => ['site/auth']
+        ]) ?>
+
     <p>Please fill out the following fields to login:</p>
```

これだけで標準クライアントならボタンまで勝手に出してくれる

![スクリーンショット 2014-12-12 23.08.31.png](https://qiita-image-store.s3.amazonaws.com/0/3181/aab09b2f-1f4a-0b2e-e4ed-22b025dc893d.png "スクリーンショット 2014-12-12 23.08.31.png")


すごい！革命的なちょろさだ！

ただし簡単なのはここまで。複数手段でログインさせようとしてユーザを結びつけたりするとなるといろいろ気をつかう点もでてくるので各々がんばってください！
相対URLを絶対URL(URI)に変換する方法について


## 注意

本記事は、クライアントサイド(ブラウザ上)でのJavaScriptについて言及しています。
サーバサイドのJavaScriptは考慮していません。

## 概要

相対URLを絶対URLに変換する方法として、a要素の`href`プロパティを参照する方法を考えた。
`href`プロパティに設定したURLは、絶対URLに変換される。それを利用する方法だ。
具体的には、以下のようにすれば良いと考えた。

```js
function absolutePath(path) {
    var e = document.createElement('a');
    e.href = path;
    return e.href;
}
```

## 検索

しかし、この程度の思いつき、既に誰かがやっているだろう。
Googleで検索した所、`innerHTML`プロパティを使用した方法を発見。

[【javascript】 相対パスを絶対パスに変換する｜自家用辞典](http://dic.birdlab.com/dic/131)

> IE 6、IE 7、Firefox 2.0、Opera 9 対応。

```js
function absolutePath(path) {
    var e = document.createElement('span');
    e.innerHTML = '<a href="' + path + '" />';
    return e.firstChild.href;
}

alert(absolutePath('/'));
```

Internet Explorer 11.0.9600.17501のF12開発者ツールで試した所、
IE5,IE7では`innerHTML`プロパティを使用しないと`href`プロパティの値が絶対URLに変換されない。
初めて知った…

## 改善案

だが、`innerHTML`プロパティによる挿入は遅い。
そこで、`insertAdjacentHTML`メソッドによる動作を試みる。

```js
function absolutePath(path) {
    var e = document.createElement('span');
    e.insertAdjacentHTML('beforeend', '<a href="' + path + '" />');
    return e.firstChild.href;
}
```

Internet Explorer 11.0.9600.17501のF12開発者ツールで試した所、
IE5,IE7でも正常に動作した。

## 問題

`insertAdjacentHTML`メソッド自体がFirefox 8.0以降から対応しているため、
Firefox 2.0からFirefox 7.xまでの対応は不可能になるが、
普及していたInternet Explorer 6の対応も不要となり、Internet Explorer 8も見限られるような現在、
Firefox 7.x以前のブラウザを気にかける必要があるだろうか。

## まとめ

本記事の`insertAdjacentHTML`メソッドを利用したコードについて、意見を聞きたい。

## 追記

`"`はそもそもURLに使用できない文字だが、それも許容するならば`&quot;`に置換した方が良いかもしれない。

```js
function absolutePath(path) {
    var e = document.createElement('span');
    e.insertAdjacentHTML('beforeend', '<a href="' + path.replace(/"/g, '&quot;') + '" />');
    return e.firstChild.href;
}
```

## 更に追記

2018年3月4日現在、JavaScriptでURLを操作するためのURLインターフェイスが一部のWebブラウザで実装されつつある。

[URL() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/URL/URL)

IEやOpera Miniなど以外のブラウザであれば、だいたい使える。

[Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/#feat=url)

このURLインターフェイスのコンストラクタ関数は、第二引数に基準となるURLを指定することで、相対パスを絶対パスに変換してくれる。
よって、以下のようなやり方で絶対URLに変換できる。

```js
function absolutePath(path) {
    var baseUrl = location.href;
    var url = new URL(path, baseUrl);
    return url.href;
}
```
CloudfrontのInvalidationを一括で行うスクリプト


##1.やりたいこと

CloudfrontのInvalidationは正規表現が使えないので、
Management consoleから絶対パスを指定してリクエストする必要があります。
	
面倒なので、Document root配下のパス全てを自動的に洗い出し、
全部まとめてInvalidationをrequestするスクリプトを作って見ました。


##2.スクリプト概要

スクリプトの処理の流れは以下の通り。

>①：Document root配下をfindコマンドでリストし、ファイルにリダイレクトする
>②：①の結果からDocuent root配下の文字列を削除する
>　　（例えば`/var/www/html`だった場合、その文字列を削除することでInvalidatoinで使うパスに成形する）
>③：findコマンド結果の先頭行は空行になってしまうので、先頭行を削除する
>④：CloudfrontにInvalidationリクエストするpythonスクリプト呼び出す
>　　（pythonスクリプトで、listを読み込み、Invalidation request実行！！）





##3.ソースコード

bashとpythonで実現します。2つを同じディレクトリに配置して、bash側を実行します。
実行するインスタンスにIAMロールを忘れずに（オンプレミスから実行する場合は、アクセスキーの設定）。


まずはbash側。固定値はこっちに設定しておきます。


```bash:cf-invalidation.sh
#!/bin/sh

#ここでdistribution-idとdocument rootのパスを定義する
DIS_ID= "XXXXXXXXXXX"
DOCUMENT_ROOT="/var/www/html"　#apache-default

#find結果出力先
F_PATH="./cf-invalidation-list.txt"
#requestを行うpythonスクリプトのパス
PG_PATH="./cf-invalidation.py"


#①：findコマンド実行
`find ${DOCUMENT_ROOT} -print > ${F_PATH}`
if [ $? != 0 ]; then
  fail_exit "find command failed..."
fi

#②：document rootのプレフィックスを削除
`sed -i -e "s#${DOCUMENT_ROOT}##g" ${F_PATH}`
if [ $? != 0 ]; then
  fail_exit "Excluding docunemt-root string failed..."
fi
#③：空行削除
`sed -i -e '/^$/d' ${F_PATH}`
if [ $? != 0 ]; then
  fail_exit "Excluding docunemt-root string failed..."
fi

#④：listとdistribution-idを引数にしてpythonスクリプト呼び出し
python "${PG_PATH}" "${DIS_ID}" "${F_PATH}"
if [ $? != 0 ]; then
  echo "Invalidation request failed..."
  exit 1
fi

echo "Invalidation request success."
exit 0

```

続いてpython側。

```python:cf-invalidation.py
# coding: UTF-8

import sys
import boto
import boto.cloudfront

#Max request number of invalidation at one time.
MAX_REQUEST_NUM = 1000


try:
	argvs = sys.argv
	argc = len(argvs)

	# Checking the number of argument
	if (argc != 3):
		print "You must define two argument. <distribution-id> <invalidation-list-file-path>"
		quit()

	#set distribution-id
	dis_id = argvs[1]
	#set file-path of invalidation list
	file_path = argvs[2]

	# invalidation-paths
	paths = []

	#File open and create paths-list
	f = open(file_path , 'r')
	for line in f:
		paths.append(line[:-1])
	f.close

	# If the number of paths over 1000 processing quit , because of AWS limit...
	if(len(paths) > MAX_REQUEST_NUM):
		print "The number of paths exceeds " + MAX_REQUEST_NUM + ". processing quit...　Please set it under " + MAX_REQUEST_NUM + "."
		quit()

	#Connecting to Cloudfront...
	cf = boto.cloudfront.CloudFrontConnection()
	# Request invalidation to Cloudfront.
	rs = cf.create_invalidation_request(dis_id,paths)

except Exception as e:
	print "Unexpected error occured." + str(e)


```

問答無用でDocument root全部というのはやり過ぎ、、、という場合は、
手動でlistつくってpython側のスクリプトをdistribution-idとlistのパスを指定して実行すれば、
任意のパスをまとめてInvalidationするこもできます。

毎度のことですが、エラーハンドリングなどは適当なので、適宜工夫してあげてください。

最後に、、、
1000個毎にリクエストを分割することで、1000個以上のパスが読み込まれても大丈夫なようにしたい、とか、
servletなどで使われるパス（.doとか）はファイルの実体がないので拾いきれないがなんとかしたい、とか
改善ポイントはありますが、それはそのうちということで。。。
Hub で別の GitHub アカウントからアクセスしたいとき

[hub](https://hub.github.com/)  は GitHub の username と oauth_token を、``~/.config/hub`` に保存しているので、これを削除すればよい。

```shell-session
$ rm ~/.config/hub
```

こうすることで、次回 GitHub アカウントが必要になったときに username と password を聞いてくれる。
td-agentで使うプラグインのgemをbundlerで管理する

# 環境

* CentOS release 6.5 (Final)
* td-agent-1.1.20をyumでインストール済み
* serviceでtd-agentを起動したい

# やりかた

下記のような事を書く。

```bash:/etc/sysconfig/td-agent
TD_AGENT_ARGS="/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --gemfile /etc/td-agent/Gemfile"
PATH="${PATH}:/usr/lib64/fluent/ruby/bin"
DAEMON_ARGS="--user root"
```

```ruby:/etc/td-agent/Gemfile
source 'https://rubygems.org'

gem 'fluentd'
# 例えば下記のような感じに、必要なプラグインを書く
gem 'fluent-plugin-bigquery', github: 'groovenauts/fluent-plugin-bigquery', branch: 'auto_create_table'
```

# 解説

## service td-agent startの挙動

* 環境変数をほぼリセットした上で、/etc/init.d/td-agent startを実行する
* /etc/init.d/td-agent startでは、TD_AGENT_ARGSの内容で、td-agentをdaemon起動する
* TD_AGENT_ARGSを設定するのは、コマンドから与えるのは（リセットされるから）ダメで、/etc/sysconfig/td-agentに書けば、/etc/init.d/td-agentの中から読み込まれるので、そうすればよい

## bundlerにパスが通ってないと、何も言わずに落ちる件

* https://github.com/fluent/fluentd/blob/21e34f2a8e76ff157f25bb4ba479ecb90ab1fde1/lib/fluent/command/bundler_injection.rb#L19 あたりを見るとわかりやすい

## td-agentユーザーではbundle installが通らなかった件

* 指定しなかった場合、td-agentユーザーで起動しようとする
* 存在しない/var/lib/td-agentにアクセスしようとして許可がないエラーになる
* 詳細未調査 調べてわかったら書くかも
【AndroidStudio】で広告つける→成功したがhtcの端末だとクラッシュする→対策！

何度か書いているように、私の開発環境はAndroidStudio。そしてMacユーザだ。

世の中にはEclipse向けの文書は数多あれど、AndroidStudio向けのものは少ない。
ましてや日本語など。
なのになぜEclipseにしないの？と問われたら…なぜでしょうね。またいつか。

本題。
AndroidStudioで広告をつけようとすると、
「どれをどこにコピーして、何をどう書き換える」の資料が不足しているんである。
Eclipse向けのサイトだと、それこそDB2のGUIコンソールのようなウィザードの画面があって
すごく簡単そうに書いてあるんだが

AndroidStudioだとそんなものは無い

そこで、発見したのがこの「ぱんだ」氏の記載。
http://androidstudio.hatenablog.com/entry/2014/07/21/170610
写真付きで、ツボを押さえて書いてくださっている。Excellent！！
感謝の気持ちを込め、ここで拡散する。

＝
で、広告は無事動くようになったのだが、
私は「親日ケータイ」、HTC J ISW13HTを使用している。

とっても気に入っているケータイなのだが、何故か私のプログラムが動かない。
エミュレータでは動いているのに。
AdMobを入れるようになってからだ。。。

調べてみるとつい数日前の記事が。
#androidファッション通信　さん。
http://android.benigumo.com/20141209/java-lang-noclassdeffounderror-androidosasynctask-%E3%81%8C%E3%81%A7%E3%81%A6%E3%82%8B%E3%81%91%E3%81%A9/

どうやら、htcのAndroid 4.0.xだとヘボいことになってクラッシュするので
そこの処理を飛ばすような記載を追記する必要があるようだ。

なので　「広告のコード」の下にtry〜のくだりを追加してみたところ、
私の愛機でも無事稼働するようになった。
Androidファッション通信さんに感謝！

"onCreate"のところに　try~を追加する。

        //広告のコード
        AdView adView = (AdView)this.findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        adView.loadAd(adRequest);


        //AdMobがHTCでおかしくなるので以下追加
        try
        {
            Class.forName("android.os.AsyncTask"); //it prevents AdMob from crashing on HTC with Android 4.0.x
        }
        catch(Throwable ignored)
        {}

＝
これで、この問題は回避出来た。
よし、前に進む。
TestFlightでアプリが登録されない場合【メモ】

#TestFlightでアプリが登録されない場合

iOSアプリのテスト用に利用できるようになったTestFlight、招待メールを送るだけでテストを行うことが可能になったので積極的に活用をしていきたいと思います。

ただ、試してみたところ招待のメールからリンクをタップしてもTestFlightアプリの内部に、アプリが登録されずに困りました。

正式な方法はわからないのですが、とりあえず招待メールのボタンに設定されているリンクURLをコピーして、iOS上のSafariで直接開いたところ、TestFlightアプリ内に登録が行われました。

同じ症状の方の参考に。


##招待メールからTestFlightアプリを実行したところ

更新してもこの画面から変わらず。

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/aaba9bc3-7839-91ce-7a10-357aa9baa48c.png)



##招待メール内のリンクURLをコピー

メール内の「Open in TestFlight」ボタンのURLをコピーして、直接URLをiPhoneのSafariで開いたところ登録ができました。


![image](https://qiita-image-store.s3.amazonaws.com/0/59249/0cef576a-b613-25ac-915f-280901205bdf.png)
activerecord-mysql-awesome - ActiveRecordのMySQL向けパッチのバックポート集

2014年12月12日現在、rails 4.2.0.rc2でもうすぐ4.2.0がリリースされそうですね！

ここ最近MySQL向けパッチをいっぱい[PR](https://github.com/rails/rails/pulls/kamipo)したんですけど4.2.0には入れれなかったので、MySQL向けパッチを4.x向けにバックポートしたgemを作りました。

[activerecord-mysql-awesome | RubyGems.org | your community gem host](https://rubygems.org/gems/activerecord-mysql-awesome)
[kamipo/activerecord-mysql-awesome](https://github.com/kamipo/activerecord-mysql-awesome)

とりあえず2014年12月12日現在では以下のパッチがバックポートされています。

* [Add SchemaDumper support table_options for MySQL. #17569](https://github.com/rails/rails/pull/17569)
* [Add charset and collation options support for MySQL string and text columns. #17574](https://github.com/rails/rails/pull/17574)
* [Add bigint pk support for MySQL #17631](https://github.com/rails/rails/pull/17631)
* [If do not specify strict_mode explicitly, do not set sql_mode. #17654](https://github.com/rails/rails/pull/17654)
* [Add unsigned option support for MySQL numeric data types #17696](https://github.com/rails/rails/pull/17696)
* [Support for any type primary key #17851](https://github.com/rails/rails/pull/17851)

まだまだバックポートしていくのでよろしくお願いします！
Docker registryのwebビューワTankerの紹介


　リクルートテクノロジーズアドカレ12日目です．

　Dockerでインフラ基盤をつくりはじめると，Registryを必ず建てなければいけない時がやってくると思います．Registryを建てた暁には，registryが大量のイメージで埋め尽くされることでしょう．
Registryに登録されたイメージの一覧を見たいときはコマンドライン上で確認することがほとんどですが，JenkinsやCircle-CIのWeb画面から”あのイメージなんだったっけ…？”と思った時にはRegistryにあるイメージ一覧もWeb画面で見たくなります．

　Tankerは弊社の[@nysd]が作ったDocker registryのwebビューワです．goで書かれており，オリジナルの[リポジトリ](nysd/tanker)にはnode.js版のものも用意していますが思い切って削除しました．nodeが嫌いなわけじゃないんだ，今後のメンテナンスをgo版のものにフォーカスしていくためです．

## Tankerの機能

![screen]

　Tankerはイメージの一覧ができるほかに，次の様な機能を備えています．

- タグやイメージ名での簡単な検索
- イメージの削除

## Tankerの実装

　Tankerはapi部分だけgo，フロントはBackbone.jsで作られています．
api部分の実装は[`server.go`][server.go]のぺら1枚のみになっているので，negroniを使って簡単なapiを作るサンプルとして何かの参考に見ていただければと思います．

```
　　　 #registry一覧からイメージを取得するapiの定義
      mux.HandleFunc("/docker/api/images", func(w http.ResponseWriter, r *http.Request) {
    		success := func(b []byte) { w.Write(b) }
    		error := func(statusCode int) { w.WriteHeader(statusCode) }
        #registryにimage一覧を取りに行ってそのまま出力
    		httpGet(fmt.Sprintf("%s/v1/images/%s/json", *dockerapi, r.URL.Query().Get("id")), success, error)
    	})
```

そのほか，主な構成要素は次の通りです．

- HTTPミドルウェア: [codegangsta/negroni]
- パッケージ管理: [mattn/gom]
- Registryの情報取得部分に[gorilla/websocket]を利用

## 動かしてみる

それでは実際にTankerを動かしてみます．

**Tankerの起動**

デフォルトでは3000番portでサーバが起動します．

```
git clone https://github.com/ainoya/tanker.git && cd tanker
go get github.com/mattn/gom # Install gom, a package manager
gom install
gom run server.go
```

**Registryの起動**

Registryを5000番ポートで動かします．

```
docker run -p 5000:5000 registry
```

このままだとRegistryに何も入っていないので，Tankerの画面は無味乾燥で見ても面白くないです．
適当なタグでRegistryにイメージをpushしてから画面を確認してみましょう．

```
for i in $(seq 1 9); do docker tag centos localhost:5000/centos-test:v0.$i;docker push localhost:5000/centos-test:v0.$i;done

open http://localhost:3000/docker
# イメージ名"centos-test"のタグ一覧を取得
open http://localhost:3000/docker/view/tags/library/centos-test
```

ご覧いただけたでしょうか？

## Tankerの今後

　現在は必要と思われる最低限の機能のみしか実装していませんが，今後開発を続けていく場合には次のような機能があったら面白いなぁと考えています．

- mesosやkubernetesとの連携
- registryの操作UI．[DockerHub]など外部ホスティングからのイメージインポート機能など．



何か思いついたら[issue]までご気軽に！本日はここまで．また明日もお楽しみに！

2014/12/12追記: 書いた後に，[kwk/docker-registry-frontend](https://github.com/kwk/docker-registry-frontend)があるのを知りました…．機能も揃っていて使いやすそうです．

[issue]: https://github.com/ainoya/Tanker/issues
[DockerHub]: https://hub.docker.com/
[server.go]: https://github.com/ainoya/Tanker/blob/master/server.go
[codegangsta/negroni]: https://github.com/codegangsta/negroni
[mattn/gom]: https://github.com/mattn/gom
[screen]: https://camo.githubusercontent.com/259b9ea868a3c7eea9f1f49db4b9da94921029c7/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f31303137373839362f74616e6b65722d746f702e706e67
[@nysd]: https://github.com/nysd
[nysd/tanker]: https://github.com/nysd/docker-registry-ui
[tanker]: https://github.com/ainoya/tanker
[registry]: https://github.com/docker/docker-registry
[gorilla/websocket]: https://github.com/gorilla/websocket
Dockerコマンドメモ

http://www.calazan.com/docker-cleanup-commands/
上記サイトで紹介されているコマンドをよく使うので、日本語訳、しようかと思ったのですが、コマンドだけコピペで。

[Dockerコマンドメモ](http://qiita.com/curseoff/items/a9e64ad01d673abb6866)
こちらのメモにもお世話になってます。

Kill all running containers
``docker kill $(docker ps -q)``

Delete all stopped containers (including data-only containers)
``docker rm $(docker ps -a -q)``

Delete all ‘untagged/dangling’ (<none>) images
``docker rmi $(docker images -q -f dangling=true)``

Delete ALL images
``docker rmi $(docker images -q)``


任意のレポジトリのイメージを全部削除したい場合(誤って他のも消しちゃうかもなので、grep注意
``docker rmi $(docker images | grep 'REPOSITORY_NAME' | awk '{print$3}')``

古いコンテナを削除したい場合(`-f`オプションがついているため実行中のContainerも削除されます。停止しているContainerのみ削除したい場合は`-f`を取り除いて下さい。

- 数週間前
    - ``docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 1週間前
    - ``docker ps -a | grep 'week ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 数日前
    - ``docker ps -a | grep 'days ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 1日前
    - ``docker ps -a | grep 'day ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 数時間前
    - ``docker ps -a | grep 'hours ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 1時間前
    - ``docker ps -a | grep 'hour ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 数分前
    - ``docker ps -a | grep 'minutes ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 1分前
    - ``docker ps -a | grep 'minute ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``
- 数秒前
    - ``docker ps -a | grep 'seconds ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm -f``

適宜自分用に更新します。。
CentOS 6.5, yum でインストールした Git を 1.7.1 から 2.x にバージョンアップする (※Git2.33.1 まで対応、コメント参照)

※Git のセキュリティ情報はこちら
https://github.com/git/git/security/advisories/

# CentOS 6.5, yum でインストールした Git を 1.7.1 から 2.x にバージョンアップする
AlmaLinux でも同様の手順で実行可能です。(yumでもdnfでもお好きなほうをお使いください)

```bash
$ sudo yum remove git
$ sudo yum install gcc curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
$ wget https://www.kernel.org/pub/software/scm/git/git-2.2.0.tar.gz
$ tar -zxf git-2.2.0.tar.gz
$ cd git-2.2.0
$ make prefix=/usr/local all
$ make prefix=/usr/local install
$ git --version
```

> git version 2.2.0

これでどうだ！

// @clown0082 さん、GCC に関する編集リクエスト有難う御座いました m(_ _)m

途中の `yum install` は環境によって左右されるので、必要モノを記入.
already installed なら OK.

さすがにもう、8年前の Git を使い続けるのはちょっとね.
何度もセキュリティアップデートあったし、もう 1.8.1 以前なんか[公式](https://www.kernel.org/pub/software/scm/git/)でも降ろされちゃってる.
(ちなみに、実際の1.7.1 のリリース自体は 2010 年の 4 月 24 日. [Github の公式リポジトリ内のタグ](https://github.com/git/git/releases/tag/v1.7.1))

それでは良きエンジニアライフを(^w^)ﾉｼ

----

※追記： 2.2.x 以降にバージョンアップする手順はコメントを参照. 2.2.0 にした後は全部同じ手順で更新できると思います.

※追記2：@MamoruTsujimoto さんから頂いた情報から、以下のような現象が起こり得るとのことでしたので合わせて記載させていただきました。

# 【Q&A】git のインストール後に "No such file or directory" と怒られる

これはコメント欄に @MamoruTsujimoto さんから頂いた情報です。
実際に遭遇したことがなかったので助かりました、ありがとうございます。
(`hash` コマンドも初めて知りました…)

`git` を実行しようとした時に「そんなファイルはないよ！」と指摘されるファイルパスと、`which` や `type` で確認したときのファイルパスで、ズレが生じるケースがあるようです。

```
$ git --version
-bash: /usr/bin/git: No such file or directory

$ which git
/usr/local/bin/git

$ type git
git is /usr/local/bin/git
```

この場合、`bash` の組み込みコマンドである `hash` コマンドで解決することが出来る、とのことでした。

```
$ hash -r
```

ちなみに `tcsh` を使っている方の場合は

```
% rehash
```

となります。

# 【Q&A】git のリポジトリから最新版落とせば OK.

この記事では tarball 化された git をダウンロードしているのですが、@belq さんよりもっと簡単にできるよ、との情報を頂きましたので追記しておきます。

英語: [1.5 Getting Started - Installing Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
日本語: [1.5 使い始める - Gitのインストール](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

実は公式には「一回インストール出来たら、次からはこれでOK」という感じで git でアップデートする方法が記載されています。

```bash
git clone git://git.kernel.org/pub/scm/git/git.git
```

こうすることで、毎回バージョンを指定しながら `wget` で取得せずとも、毎回最新版の git を手に入れることが可能です。
ただし、もし RC リリースがある場合は RC 版が入ってしまうことがあります。(現時点 2017/07/20 がそんな感じ)

```
git version 2.14.0.rc0.9.gcac25fc33
```

もし「安定版を使いたい」ということであれば従来通りの `wget` で、「RC版でも構わないからアップデート手順を手軽に自動化したい」ということであれば `master` ブランチからの `clone` で問題ないと思います。

詰まるところ RC 版だろうが `master` 版だろうがバグは起こりますし、この記事のコメント欄をこっそり追っかけてくれている方々はそれを承知の上で最新版をインストールしているだろうと思いますので、特にこだわる必要はないかなぁと考えています。

## 蛇足
ちなみに、git の git 運用(分かりづらい…) は以下のように 5 つのブランチから成り立っています。(現時点 2019/06/05)

* pu - 提案 (Debian でいうポイントリリースを準備する proposed-updates)
* todo - ToDo 
* next - 時期リリースに向けたテスト用ブランチ
* master - マスタ
* maint - メンテナンスリリースを行うためのブランチ
iPhoneでもiframeを使ってスクロールさせて、かつ、PCとも外観を揃える方法

レアケースではあるものの、例えば利用規約などをiframeで表示させていて、レスポンシブでiPhoneにも表示させたとしましょう。
そんな時、iPhoneでのiframeの挙動は困ってしまう部分があるので、解決策を。

## 基本、iframeはiPhoneでは全体が表示されてしまう
![基本、iframeはiPhoneでは全体が表示されてしまう](https://qiita-image-store.s3.amazonaws.com/0/37964/1153e357-fdd9-4557-a21f-bee6571dcfd9.png)
CSSでiframe要素にサイズ指定をしても、横幅は可変しますが、縦は全体が表示されるままです。

# なので、-webkit-overflow-scrollingで制御
真っ先に思い浮かぶのが、iframeの外側の要素でこのCSS。

```css:css
div {
  width:hogehoge;
  height:hogehoge;
  overflow:scroll;
  -webkit-overflow-scrolling:touch;
}
```

![-webkit-overflow-scrollingで制御](https://qiita-image-store.s3.amazonaws.com/0/37964/adbb9395-2e27-396a-a1e4-2c9c1bb4720f.png)

これだけで無事、スクロールはできましたが、

![PC側で表示が崩れる](https://qiita-image-store.s3.amazonaws.com/0/37964/72484dbc-75cf-17fb-aee5-d773a557dee3.png)

PC側で表示が崩れてしまっているので、外側の要素に収まるようにサイズ指定。

```css:css
iframe {
  width:100%;
  height:100%;
}
```

![なぜかスクロールバーが二重に…](https://qiita-image-store.s3.amazonaws.com/0/37964/da1e1687-8f8b-9e13-cbb5-9b3214c99e88.png)

すると、なぜかスクロールバーが二重に…

# PCとも外観を揃えていくには、ここからが試行錯誤…
いろいろ試した結果、iframeにborder:noneとdisplay:block、外側の要素のoverflow:scrollをautoにすることで解決。

![iPhoneでもiframeを使ってスクロールできた](https://qiita-image-store.s3.amazonaws.com/0/37964/0a67f5d1-6bad-574f-b6e5-95b9215063f8.png)

```html:html
<div>
  <iframe src="hogehoge.html" name="hogehoge"></iframe>
</div>
```

```css:css
iframe {
  width:100%;
  height:100%;
  border:none; /* 追加で指定 */
  display:block; /* 追加で指定 */
}

div {
  width:hogehoge;
  height:hogehoge;
  overflow:auto; /* scrollからautoに変更 */
  -webkit-overflow-scrolling:touch;
  border:1px solid #c9c9c9; /* ついでに枠線も整形 */
}
```

というか、もう少しなんとかならんものか。
よく使うSencha Cmdコマンド


使用状況により随時アップデートします。

# ローカルサーバ

起動
> sencha web server

起動＋自動ビルド
> sencha app watch

# ワークスペース

ワークスペース作成
> sencha -sdk EXTJS_DIR generate workspace DIR

# アプリケーション

アプリ作成
> sencha generate app APP_NAME APP_DIR

アプリビルド
> sencha app build
> sencha app build production

デバッグログ付きビルド
> sencha -debug app build

SASSだけコンパイル
> sencha ant sass

フレームワークのアップデート
> sencha app upgrade framework-path

# パッケージ

パッケージ作成
> sencha generate package NAME

パッケージビルド
> sencha package build

# その他

ヘルプ表示
> sencha help COMMAND

バージョン確認
> sencha which

Sencha Cmdのアップデート
> sencha upgrade

Sencha Cmdアップデート後にアプリの設定を更新
> sencha app upgrade --noframework


公式リファレンス
http://docs.sencha.com/cmd/5.x/advanced_cmd/cmd_reference.html
アジャイルまわりで最近学んだこと

# 自己紹介

* 名前: 伊与田陸
* ソフトウェアエンジニアを20年くらいやってます。

## 個人的にアジャイルを避けてきた三つの理由

* アジャイルという言葉だけが先行してる印象があった。
* フリーランスとして一人で活動することが多く作れていればなんでも良かった。
* 新しいものに飛び付かなくなった。

## 最近アジャイルを勉強するようになった三つの理由

* スクラムマスターの人がチームに来るはずが・・・。
* 若い人がスクラムとかアジャイルとかの本を読んでいるのを見た。
* ボスに本を積まれた。

# 勉強前にアジャイルに持っていた偏見

* 管理しないて適当にやるんじゃないか。
* 見積りを重視しないで結局はぐだくだに

# 学んでわかってきたこと

## アジャイルマニフェストってのがある

* プロセスやツールよりも、人と人との交流を
* 包括的なドキュメントよりも、動作するソフトウェアを
* 契約上の交渉よりも、顧客との協調を
* 計画に従うことよりも、変化に適応することを

## アジャイルチームとは

アジャイルチームとは職能横断的なものあり個々のメンバーの専門分野を越えて機能する。これが成功を後押しする。
プロジェクトへの帰属意識を職能への意識より優先する。
フリーランスには少し耳が痛いところ。

## アジャイルが前提としているもの

* ウォーターフォールしかない時代に辛い記憶
* より良くしようとする意思
* 繰り返しながら学んでいく

## スクラムってのがあるらしい

スクラムはチーム運営すら属人性を排除し仕組みとして回していくためのフレームワーク。
市場とチームの持つ感情が変化していくことを前提に作られている。
スクラムを組織に根付かせるのは骨が折れそうだがチャレンジしてみたい。

## 優先順位付けとは儲かる順序

今までは企画担当に毎回確認して作っていた優先順位付けだが、勉強していく中で相対的な重み付けという方法を学んだ。
これを使うとこれまで漠然としていた優先順位を数値として解釈できるようになる。
エクセルやGoogleDocsでシート作ると便利、プロダクトバックログの精査やボスとの交渉に使ってみてるけどとてもいい。Karlさんありがとう。

http://msdn.microsoft.com/ja-jp/library/hh765981.aspx#Weigers

## スケジュールバッファは水増しではない

現実世界の不確実性と戦うためにはバッファは必要。
バッファなしを良しとする文化では早い段階で事故が起きてしまう。事故怖いです。

## ベロシティの取り扱いに注意

個人単位でベロシティを測定したりトラッキングしない、個人よりもチームとして見た場合の生産性を重視していく。個人攻撃にならないように気をつけたい。

# アジャイルはいいものだった

勉強してみるとソフトウェア開発についての様々な知見がまとまっていて楽しい。
先輩達がソフトウェア開発についての悲しみといかに戦っているかどうやって開発しているかを知ることができて本当に良かった。
今後もアジャイルまわりの勉強も続けていきたいと思う。

最後に本を積んでくれたボスに感謝したい。ありがとう @kimiya さん。
React.jsがVirtualDOMを採用していて嬉しい事

今回はReact.jsのVirtualDOMについて簡単に触れておきたいと思います。

VirtualDOMについては別途AdventCalendarがあるので詳しくはそちらを見てください。自分もReact.jsのVirtualDOMの実装について書いています。

http://qiita.com/advent-calendar/2014/virtual-dom

本当は↑だけでいいのですが、このAdventCalendarのどこかで触れておきたかったので重複する部分も多いですが簡単に触れておきます。


## VirtualDOMの嬉しい点

JavaScriptを使ってDOMを操作して画面の表示を切り替えていくようなアプリケーションの場合、ユーザー体験を損ねないためにも更新されるDOMは最低限にしたくなります。

例えばBackbone.jsを使っていると、基本的にはView単位でrenderするのでViewを細かく分割していくことが必要になります。そうなるとViewが増えて複雑さが増してきて辛くなってきます。
(jQueryで直接DOMを触ってとかも出来ますが....)

Angular.jsの場合は、Dirty checkingをして変更があれば再描画という形なので監視する対象が増えていくるとパフォーマンスが落ちる問題があります。
(v2になるとObject.observe使うようになって変わると思いますが)

React.jsの場合は、setState(forceUpdate)が呼ばれるとそのComponent以下がrerenderの対象となります。

これだけだと当然毎回広範囲のDOMが更新されてツラい感じになるのですが、React.jsではVirtualDOMとしてメモリ上にDOMの状態を保持していてその前後の状態を比較し差分の部分だけを実際のDOMに反映してくれます。

* ちなみにCSSのstyleなんかもオブジェクト形式で指定することで該当のstyleだけを更新してくれます。

```js
var Hoge = React.createClass({
  getInitialState() {
    return {
      style: {
        color: "#ccc",
        width: 200,
        height: 100
      }
    };
  },
  onChange() {
    var style = _.clone(this.state.style);
    style.color = "#ddd";
    this.setState({ style: style});
  },
  render() {
    return (
      <div style={this.state.style} onClick={this.onChange}>xxx</div>
    );
  }
}
```

それによって、パフォーマンス的に優れているというのはもちろんですが、パフォーマンスがそこまで重要視されないようなアプリケーションでもTopレベルの要素にアプリケーションの状態を持たせておいてそれをsetStateでどんどん更新するという雑なアーキテクチャも可能になります。
サーバーサイドでのレンダリングみたいですね。

つまり、DOM周りの面倒でパフォーマンスに影響を与える部分をReact.jsに任せることでアプリケーションの実装を単純に出来るという特徴があります。

アプリケーション開発者がVirtualDOMについて意識する場面は、[昨日の記事](http://qiita.com/koba04/items/a4d23245d246c53cd49d)で書いた`key`属性の指定と、パフォーマンス向上を目的に`shouldComponentUpdate`を実装する場面があります。

### shouldComponentUpdate

`shouldComponentUpdate`については[ComponentのLifecycleの記事](http://qiita.com/koba04/items/66e9c5be8f2e31f28461)でも書きましたが、実装されていない場合は常にrerenderするようになっていて、これを実装してfalseにすることでこのComponentを含むそれ以下のComponentがrerenderされなくなります。

```js
    var shouldUpdate =
      this._pendingForceUpdate ||
      !inst.shouldComponentUpdate ||
      inst.shouldComponentUpdate(nextProps, nextState, nextContext);
```
https://github.com/facebook/react/blob/master/src/core/ReactCompositeComponent.js#L684-L687

最低限のDOMしか更新されないなら常にrerenderしても問題ないのではと思うと思いますが、それだと対象のComponent以下の全てのComponentのVirtualDOMのtreeを作って比較し、差分があるかどうか計算する必要があるので、実際のDOMに触らないとはいえコストがかかります。
対して、対象のComponentのStateとPropの前後の状態を比較し差分がある場合だけ、対象のComponentを含むそれ以下のComponentのVirtualDOMのtreeを作って比較してrerenderした方がコストが低いことがわかるかと思います。


## React.js以外では

React.js以外にもVirtualDOMを実装しているライブラリとしては、[mercury](https://github.com/Raynos/mercury)や[Mithril](http://lhorie.github.io/mithril/)など色々アリますし、Ember.jsも2.0でVirutalDOMの実装を検討しているようです。

https://github.com/emberjs/rfcs/pull/15

また、実装について知りたい人はvdomやdekuのソースから読むといいかもしれません。

https://github.com/Matt-Esch/vdom
https://github.com/segmentio/deku


----------

というわけで今回はVirualDOMについて簡単に触れておきました。

明日は、Componentの拡張について取り上げたいと思います。
JavaScript で母比率の差の検定

JavaScript で母比率の差の検定を書く。
正規分布の実装は [jStat](https://github.com/jstat/jstat) の distribution.js を使う。


```js:JavaScript
var propTest = function(Nc, Nt, Pc, Pt) {
	var p = (Nc*Pc + Nt*Pt)/(Nc + Nt);
	var z = Math.abs(Pc - Pt) / Math.sqrt(p * (1-p) * (1/Nc + 1/Nt));
	var pValue = jStat.normal.cdf(-z, 0, 1) * 2
	return(pValue);
}
var pValue = propTest(300, 200, 29/300, 9/200);
console.log(pValue);
```

```:結果
 0.032696640479626615
```

[2群の母比率の差の検定](http://software.ssri.co.jp/statweb2/tips/tips_20.html) で計算した結果と同じになることを確認すること。

参考：[比率の検定・独立性の検定](http://www.aoni.waseda.jp/abek/document/chi-test.html)
Swiftで処理時間を計測

シンプルな（というかざっくりな）場合はこうです。

```swift
let start = Date()

//重い処理を書く

let elapsed = Date().timeIntervalSince(start)
print(elapsed)
```

ベンチマーク用のクラスがほしい方は下記が参考になります。
[Swiftで重い処理の処理時間を測定する](http://qiita.com/tady/items/40d7c4feecda337cf271)
整数 n を なるべく等しい整数になるように m 等分する

すごいどうでもいいのでわざわざ文章にするまでも無かったのですが、せっかくなので投稿します。

整数 n を なるべく等しい整数になるように m 等分するコードを書きました。

```rb
# 整数 n を なるべく等しい整数になるように m 等分する
# 返り値は整数の Array とする
def divide_equally(n, m)
  result = Array.new(m, n/m)
  rest = n%m

  if rest == 0
    # 端数が出ない場合
    return result
  else
    rest.times do |i|
      result[i] += 1
    end
    return result
  end
end

p divide_equally(10,2) # => [5, 5]
p divide_equally(10,3) # => [4, 3, 3]
p divide_equally(10,10) # => [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p divide_equally(0,10) # => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```

やっぱりどうでも良すぎた感がある。なんで投稿したんだ。
Slackに #timeline channelをつくった話


Slack Advent Calendar 12日目です。ギリギリの投稿です。すみません。
流行ってますねーSlack。個人的には「改善のスピードや遊びごころが見え隠れする」あたりが気に入ってます。見た目も機能もバランスいいですよね。よくHelp CenterからRequestも投げたりするんですが、数日で丁寧な返事が返ってくるので嬉しいです。みんなももっと気軽に要望とか投げたらいいと思います。

[Help Request | nanapi Slack](https://nanapi.slack.com/help/requests/new)

## #timeline channelとは
> Slack上にあるChannelへの投稿をすべて眺めることができるChannel

です。仕組みは単純でシンプルながらとても役に立つChannelで、Slack運用当初からメインChannelとして活躍しています。

![0ce84943-a00a-20b8-a77c-836c5d925b11.png](https://qiita-image-store.s3.amazonaws.com/0/11726/180a239e-2434-94ee-00f7-92ccba087b77.png "0ce84943-a00a-20b8-a77c-836c5d925b11.png")

## 表示内容
上の画像を見ていただければわかると思いますが以下をbotによって転送しています。

- 投稿者名
- 投稿者アイコン
- 投稿テキスト
- 投稿Channel名

※一応TOPICに「通知オフを推奨」を表記しておくことで `このChannelの更新頻度ヤバイから！`というのを暗に伝えていますｗ

## どんなときに便利か
Botの投稿などは対象にならないので、Joinするまでもないけど気になるChannelの動向を追ったりとか、新しくて盛り上がっているChannelなどの存在を知るのに一躍かっています。以下のような方におすすめですね。

- 社内の動向を追いたい人
- 話題になったこと（盛り上がったこと）を逃したくない
- 新しいChannelに面白いものがあればJOINしたい
- その名の通りタイムライン形式で流れを把握したい

当てはまる人は、オススメですよ。

※一応前提として、PrivateGroupは極力作らないようになっている。のでご注意下さい。

## 利用者
100人中30人くらいが #timeline channelを利用しているので3割くらいですね。3割の人が、全体の流れを把握したがっているって考えるとちょっとゾクゾクしますねｗ

でも、それくらい気になる人にはとっても嬉しいChannelになっているんだと思います。

## 通知がうざいんじゃないの？
Slackの設定で通知OFFにできますし、既読についてもESCなどで一括既読できるのでそんなに大変だと思ったことはありません。

## よかったら試してみてください。
手短に紹介してみました。よかったらSlackerな人は試してみてください。
以下で弊社のChatおじさんが丁寧にまとめてくれています。


- [Hubot - Slack上にTimelineを形成して全チャンネルの発言をゆるく眺める - Qiita](http://qiita.com/Vexus2/items/70a84b28c85fc9af14c7)

hubot_scriptのパッケージもあるのできになったかたはぜひ試してみてください。

- [hubot-slack-timeline - npm](https://www.npmjs.com/package/hubot-slack-timeline)
複数のBool値をひとつのInt値にして保存するとエコ (ビット演算)

# 要旨
　ビット演算で頑張って `True, True, True, True, True, True, True, True, True` を `0b111_111_111` に変換して保存する。
　.storeddataのファイルサイズが1/5になったので、きっとエコ。

# 実例
　定休日を管理するクラスです。中身は2進数ですが、インスタンスを使うときにはEnumとBoolだけ触れば済みます。
　2進数ひと桁ごとに「trueなら1, falseなら0」というルールでゴリゴリ書いていきます。月曜休みなら9桁目がゼロ、火曜休みなら8桁目がゼロ、水曜休みなら… となります。

``` swift
class BusinessDay {
    var binary: Int
    enum Day: Int {
        case Irregular, Holiday, Sun, Sat, Fri, Thu, Wed, Tue, Mon
    }
    private init(binary: Int) {
        self.binary = binary
    }
    convenience init() {
        self.init(binary: 0b11111_11_11)
    }
    func openOn(day: Day) -> Bool {
        // n = day.rawValue + 1
        // 右からn桁目を1にする
        let x = 0b1 << day.rawValue

        // 右からn桁目以外を0にする
        let y = (binary & x)

        // 0ならfalse
        return y != 0
    }
    func setDataOn(day: Day, open: Bool) {
        // 右からn桁目を1にする
        let x = 0b1 << day.rawValue

        // 右からn桁目以外を1にする
        let y = 0b11111_11_11 ^ x

        // 右からn桁目だけ0にする
        let z = binary & y

        if open {
            // 右からn桁目を1にする
            binary = x + y
        } else {
            // 右からn桁目は0のままにする
            binary = y
        }
    }
}
```

　ビット演算子が面白いので書きました。
　wikipediaを見ながら当てずっぽうで書いたものなので、もっと簡単に書けるのかも… 

## 追記
　もっと簡単に書けたうえ、そもそもコメントが間違っていました。編集リクエスト多謝！
　言われてみれば確かに、「n桁目以外はゼロだが、n桁目はゼロか、ゼロでないか」というのは要するに「ゼロか、ゼロでないか」というのと同じことなのでした。勉強になります。

# 利点
　NSCodingを使い、NSDataにしたうえで保存する場合に比べて省スペースです。

``` 2進数を使った場合.
<object type="ENTITY1" id="z102">
    <attribute name="day" type="int16">
        511
    </attribute>
</object>
```
``` NSCodingを使ってバイナリーデータを保存した場合. 
<object type="ENTITY2" id="z102">
    <attribute name="day" type="binary">
        YnBsa(490文字略)AAAAAAAQk=
    </attribute>
</object>
```

　1000件ほど保存すると、前者は112kb, 後者は616kbになりました。それなりにエコです。

## 追記
　[こちら](http://qiita.com/tottokotkd/items/30d447cfcc8162dbcf64)のアイデアを使って書き直しました。

```swift


protocol StorableBools {
    init?(rawValue: Int)
    var rawValue: Int { get }
}

class InfoHolder <T: StorableBools> {
    
    private var binary: Int
    private var topicCount: Int {
        var n = 0
        while let x = topics(rawValue: ++n) {}
        return n
    }
    private var resetBinary: Int {
        return 1 << topicCount - 1
    }
    
    // target enum
    let topics: T.Type
    
    // init
    private init(topics: T.Type, binary: Int) {
        self.topics = topics
        self.binary = binary
    }
    convenience init (topics: T.Type) {
        self.init(topics: topics, binary: 0)
        binary = resetBinary
    }
    // method
    func trueAbout(topic: T) -> Bool {
        let x = 1 << topic.rawValue
        let y = (binary & x)
        return y != 0
    }
    func setDataOn(topic: T, open: Bool) {
        let x = 1 << topic.rawValue
        let y = resetBinary ^ x
        let z = binary & y
        if open {
            binary = x + z
        } else {
            binary = z
        }
    }
}

enum BusinessDay: Int, StorableBools {
    case Irregular, Holiday, Sun, Sat, Fri, Thu, Wed, Tue, Mon
}

// how to use
let days = InfoHolder(topics: BusinessDay.self)
days.setDataOn(.Mon, open: false)
```
[rails] engineのroutingをapplication側からpathで呼び出す

## engine便利
[Getting Started with Engines — Ruby on Rails Guides](http://guides.rubyonrails.org/engines.html)
[Railsエンジン入門 — Ruby on Rails Guides](http://railsguides.jp/engines.html)
[使いやすくなった Rails 3.1 の Engine - passingloopの日記](http://d.hatena.ne.jp/passingloop/20110801/p1)
[Rails::Engine](http://edgeapi.rubyonrails.org/classes/Rails/Engine.html)

エンジンは便利なのだが、modelだけじゃなくて、controller/viewまでengine化すると、結構はまるところがでてくる。

### routing
```hoge/engine/routes.rb
  1 Hoge::Engine.routes.draw do
  2   resources :fuga
...
```
エンジン側に↑のようなroutingがあり

```u/app/routes.rb
  1 Rails.application.routes.draw do
  2
  3   mount Hoge::Engine, at: "/"
...
```
アプリケーション側で↑のように`routes.rb`に書くと、

```rb
$ rake routes
Routes for Hoge::Engine:
fuga POST   /fuga(.:format) hoge/fuga#create
...
```
のように、Engine側で追加したroutingが、mountしたアプリ側にも生える。

### _path が呼べない
原因はぶっちゃけよくわかってないけど、`fuga_path` で呼び出そうとすると、うまく呼び出せない。

```rb
  = link_to "ほげ", fuga_path # => undefined local variable or method
```

### mount時にasで名前を付けてやる
こうなってしまったら、下記のように、asで名前を付けてやる。

```u/app/routes.rb
  1 Rails.application.routes.draw do
  2
  3   mount Hoge::Engine, at: "/", as: 'hoge'
...
```

_pathを呼び出すときも、名前付きで呼び出す

```rb
  = link_to "ほげ", hoge.fuga_path
```

これで、Engine側で定義したroutingに対して、アプリ側からリンクを晴れる


### 参考
[#277 Mountable Engines - RailsCasts](http://railscasts.com/episodes/277-mountable-engines?language=ja&view=asciicast)

※ Qiitaに書くときに、もろもろコードを書き換えたので、記述ミスってたらすみません。
はじめてのjQuery

いままでなんとなくで使っていたjQuery。
この辺でjQueryの書き方などをまとめていく。

## もくじ

* jQueryを使うための準備
* jQueryでpタグの文字に装飾をしてみる

今回使うjQueryはバージョン2.1.1をつかっていきます。
そろそろIE8に振り回されるのも勘弁してほしいので。。。

### jQueryを使うための準備
jQueryを使うためには、jQuery本体のファイルとhtmlファイルをリンクさせる必要があります。

jQuery本体のファイルは[Google Library api]("https://developers.google.com/speed/libraries/")にあるjQueryとリンクさせるか、[jQueryサイト](http://jquery.com)からダウンロードして使います。

htmlコードのどこにjQueryを読み込むのかというと、bodyタグの閉じタグ直前。（下記コード位置）


	<body>
		<p>サンプルテキスト</p>
		<!-- ここからbodyタグの閉じタグ直前までにjQueryを書く -->
		<script src="js/jquery-2.1.1.min.js"></script>
	</body>

jQueryを読み込み、その後に実行させたいプログラムを読み込むようにします。

	<body>
		<p>サンプルテキスト</p>
		<script src="js/jquery-2.1.1.min.js"></script>
		<!-- ↑コードを書く前にjQuery本体を読み込む -->
		<script>
		    // ここにjQueryのコードを書く
		</script>
	</body>
### jQueryでpタグの文字に装飾をしてみる
解説の前に実際に動くものを書いてみる。

ここではpタグの文字色を緑色（#00ff00）にしてみる。

	<body>
		<p>サンプルテキスト</p>
		<script src="js/jquery-2.1.1.min.js"></script>
		<!-- ↑コードを書く前にjQuery本体を読み込む -->
		<script>
		    $('p').css('color','#00ff00');
		</script>
	</body>

文字に複数の装飾を加えたいこともあります。
例えば「文字色を変える」「サイズを変更する」「太字にする」の3つを同時に行いたいときは次のように記述します。

ここで行う装飾は次の通りです

* 文字は緑色
* サイズは30px
* 太字にする

```
<body>
	<p>サンプルテキスト</p>
	<script src="js/jquery-2.1.1.min.js"></script>
	<!-- ↑コードを書く前にjQuery本体を読み込む -->
	<script>
		$('p').css({'color':'#00ff00','font-size':'30px','font-weight':'bold'});
	</script>
</body>
```

ひとつだけ装飾を加える時と複数の装飾を加える時で少し書き方が変わりました。最初の書き方でpタグに「色を変える」命令と「サイズを変える」命令、「太字にする」命令を別々に指定しても同様の結果が得られます。


```
<body>
	<p>サンプルテキスト</p>
	<script src="js/jquery-2.1.1.min.js"></script>
	<!-- ↑コードを書く前にjQuery本体を読み込む -->
	<script>
		$('p').css('color','#00ff00');
		$('p').css('font-size','30px');
		$('p').css('font-weight','bold');
	</script>
</body>
```

ですが、ひとつにまとめて書いた方がすっきりしていて好みです。
画像ファイルのサイズを2の累乗にする

自作のCanvas上の描画エンジンを故あってWebGLに移さざるをえなくなって作業していたところ、テクスチャサイズの問題にぶちあたりました。画像作成担当者が忙しいのでとりあえず機械的に変換する方法を模索した所、結構面倒だったので共有します。

まずこんな感じでファイルのリストを作ります。
```
% find . -name '*.png' > files
```

その後このようなスクリプトを使えば返還できます。（要ruby, imagemagick)

```ruby:t.rb
def mls(x)
  y = 16
  while y < x
    y *= 2
  end
  y
end

open("files").each_line do |line|
  line.chomp!
  x, y = `identify -format "%w %h" #{line}`.split
  xx, yy = mls(x.to_i), mls(y.to_i)
  puts "#{line} = #{x} x #{y} => #{xx} x #{yy}"
  `mogrify -extent #{xx}x#{yy} -background none #{line}`
end
```

広げた部分はアルファ値0のピクセルで埋まります。