OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCIでawsebcliを入れる場合はpythonのバージョンを指定しよう

# 問題

`awsebcli 3.7.5`からCircleCI上でのインストールでエラーが発生するようになった。

```yaml:circle.yml
dependencies:
  pre:
    - sudo pip install awsebcli
```

```bash:circleci_error
$ sudo pip install awsebcli
The directory '/home/ubuntu/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/ubuntu/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting awsebcli
/usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
```

# 原因

[InsecurePlatformWarning](https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning)

`Python 2.7.9`未満だと`urllib3`で使える`ssl module`の設定が制限されてるのでHTTPSが通らなくなる。恐らく`awsebcli 3.7.5`でコレ関連の修正が入った事が原因。

そしてなんとCircleciの`default Python version`は[2.7.6](https://circleci.com/docs/language-python/) （2016/04/12現在）

# 解決

`awsebcli`のバージョンを[固定する方法もある](http://qiita.com/tknzk/items/36b04d337f772908d5c6)が個人的にはpythonを上げた方が良いと思ってる。せっかくなので最近よく使ってるaws lambdaの`python 2.7.9`と合せておく。（sudoも不要になった）

```yaml:circle.yml
machine:
  python:
    version: 2.7.9
dependencies:
  pre:
    - pip install awsebcli
```

# 関連
http://qiita.com/testnin2/items/97ddb749879415b23e18
http://qiita.com/tknzk/items/36b04d337f772908d5c6
VS CodeでTerminate Running Taskのキーボードショートカットを設定する

ビルドタスクなどの実行を中断するためのキーボードショートカットを設定したかったのだけど、Default Keyboard Shortcutsの一覧には載っていなかった。そこで、適当にそれっぽいコマンド名を指定してみたらいけた。

```js
[
{ "key": "ctrl+alt+c",           "command": "workbench.action.tasks.terminate",
                                     "when": "editorTextFocus" }
]
```

`key`の部分はお好みで。

調べてみたら[同じ悩みを抱えた人](http://stackoverflow.com/questions/33885264/how-to-set-a-keyboard-shortcut-to-terminate-running-task-in-vscode)がいた。
【WordPress】Contact Form 7のajaxトリガーを引き当てる


メールフォームが簡単に作成できる[Contact Form 7](http://contactform7.com/ja/)。とても便利です。
こちらはsubmit時にajaxで色々な値の更新を行っていますが、submitが成功した場合、エラーが発生した場合などをJSで検知したい時があります。

/wp-content/plugins/contact-form-7/includes/js/scripts.js の中を見ると `$(data.into).trigger('wpcf7:hogehoge');` といった記述がいくつか見られます。
$(data.into)に対してtriggerが登録されていますので、これに `.no()` でイベントを引き当てることができます。
triggerの種類はざっと見た感じ以下があります。

<Font color="red">※ wp_head()とwp_footer()関数が記述されていないと、ajaxが動作しませんので、header.phpとfooter.phpに記述するようにしてください。</font>
参考：[どうして私のコンタクトフォームは AJAX っぽく動かないのか?](http://contactform7.com/ja/why-isnt-my-ajax-contact-form-working-correctly/)


```js
/*
 * /includes/js/scripts.js内の記述
 */
// エラー時
$(data.into).trigger('wpcf7:invalid');

// メールアドレスがスパムだった場合
$(data.into).trigger('wpcf7:spam');

// メールの送信が成功した場合
$(data.into).trigger('wpcf7:mailsent');

// メールの送信が失敗した場合
$(data.into).trigger('wpcf7:mailfailed');

// ajaxが成功した際に必ず呼ばれる
$(data.into).trigger('wpcf7:submit');


/*
 * /includes/js/jquery.form.js内の記述
 */
// ajax開始前 ajax送信前に実行され、ajax実行時の一番初めに呼ばれるイベント
$.event.trigger('ajaxStart');

// ajax送信時 ajax送信前に実行され、ajaxStartの後に呼ばれる
$.event.trigger('ajaxSend');

// ajax成功時 ajax後に呼ばれる
$.event.trigger('ajaxSuccess');

// ajax失敗時 ajax後に呼ばれる
$.event.trigger('ajaxError');

// ajax完了時 成功、失敗どちらの場合も呼ばれ、ajaxSuccess、ajaxErrorの後に呼ばれる
$.event.trigger('ajaxComplete');

// ajax終了時 成功、失敗どちらの場合も呼ばれ、ajaxCompleteの後に呼ばれる
$.event.trigger('ajaxStop');
```

結構細かくtriggerが用意してあるので、どんな場合にも対応できそうです。
引き当てる際は `$('.wpcf7').on('event_name', function() {});` といった感じで `.wpcf7` に対して `.on()` で引き当てることが可能です。

例えば、エラーがある際にフォームの一番上までスクロールしたい場合は以下のようにします。

```hoge.html
<script>
  var $       = jQuery.noConflict(); // $の衝突回避
  var formTop = $('#form').offset().top;

  // ajax後にエラーがある場合のイベントを引き当てる
  $('.wpcf7').on('wpcf7:invalid', function() {
    // スクロール位置をフォームトップに移動する
    $('html, body').animate({
      scrollTop: formTop - headerHeight
    }, 700);
  });
</script>

```
$scopeを使わずpopPage後に前画面をリロードする

「えー？マジ`$scope`！？」「`$scope`が許されるのはv1.1までだよね！」

モダンAngularJSのお作法的に`$scope`や`$rootScope`は仕様を控えるべき、だそうです。

popPage後に元ページをリロードさせる際、`$scope.$emit`や`$scope.$broadcast`は使えないということですね。

# 解決法1
popPageのrefreshをtrueに設定する。
replacePageと同じくこれは元のページ全体を再読込みする。

```detail.js
var page = nav.getCurrentPage();

// 前の画面に戻る
function back() {
    var options = {
        animation : "slide",
        refresh   : true
    };
    nav.popPage(options);
}
```

一瞬でツールバーごと消えるのが玉にキズ。
ons-splitter-contentの部分だけリロードしたい場合は向かないかと。

# 解決法2
pushPage時にリロード用のメソッドも一緒に送る。
遷移後ページのpopPageのonTransitionEndで元ページのリロードメソッドを呼ぶ。

まずは遷移元画面のJavaScript。
読み込み処理をpushPageの引数optionにreloadという名前で登録。

```master.js
// 詳細表示
function showDetail(data) {
    var options = {
        animation : "slide",
        reload : function() {
            load();
        }
    };
    nav.pushPage('detail.html', options);
}

// 読み込み
function load() {
    /* データを読み込む処理 */
}
```

こちらは遷移先画面のJavaScript。
onTransitionEnd（2.0RC以降はcallback）で元画面から渡されたreloadを呼んでいます。

```detail.js
//var args = nav.topPage.pushedOptions; // 2.0RC以降
var args = nav.getCurrentPage().options;

// 前の画面に戻る
function back() {
    var options = {
        animation : "slide",
        // callback : function() {  // 2.0RC以降
        onTransitionEnd : function() {
            args.reload();
        }
    };
    nav.popPage(options);
}
```

# 結論
簡単なのは`refresh:true`に設定してpopPageを呼ぶ方法。
部分的にリロードをかける場合はonTransitionEnd(現在はcallback)を駆使するのが良いっぽいです。
Kotlinの学習がてら音量調整を一つに統一するアプリを書いてみた

# 前置き
Androidって音量調整が、電話とメディアとアラームに分かれているんですよね。
アラームだけは鳴らしたいとか、それはそれで便利な時はあるんですが、どっちかというと分かれているために悲劇が起きる時の方が圧倒的に多い。


> **ぴぴぴぴぴ**
静かなコワーキングスペースで**突然鳴り出す**憎たらしいスマホ！
「あれれ、音量0にしてるはずなのに！」


メーカーカスタマイズが入ったAndroidには、高確率でマナーモードが実装されているのでこんな悲劇は回避できます。

が、**Nexus、てめーはダメだ！**



ということでKotlinの学習がてらボリューム調整を一本化するアプリを書いてみました。
例によって画面のないミニマルデザインです。

コードはこちら
https://github.com/furu8ma/OneVolume/


今回はサービスを書いてみました


```VolumeReceiver.kt
package jp.hateblo.furu8ma.onevolume

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.AudioManager

/**
 * Created by furuyamah on 16/04/11.
 */
class VolumeReceiver : BroadcastReceiver() {


    override fun onReceive(context: Context?, intent: Intent?) {
        if (context == null ) return
        if (intent == null) return

        if (intent.action.equals("android.media.VOLUME_CHANGED_ACTION")) {
            changeAllVolume(context)
        }
    }

    fun changeAllVolume(context: Context?) {

        if (context == null) return

        val am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
        val maxRingVolume = am.getStreamMaxVolume(AudioManager.STREAM_RING).toFloat()
        val maxMusicVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
        val maxAlermVolume = am.getStreamMaxVolume(AudioManager.STREAM_ALARM).toFloat()

        val currentRingVolume = am.getStreamVolume(AudioManager.STREAM_RING).toFloat()
        val perVolume = (currentRingVolume / maxRingVolume)

        am.setStreamVolume(AudioManager.STREAM_MUSIC, (maxMusicVolume * perVolume).toInt(), 0)
        am.setStreamVolume(AudioManager.STREAM_ALARM, (maxAlermVolume * perVolume).toInt(), 0)

    }

}
```

```manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.hateblo.furu8ma.onevolume">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.Translucent"
        >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".VolumeReceiver">
            <intent-filter>
                <action android:name="android.media.VOLUME_CHANGED_ACTION" />
            </intent-filter>
        </receiver>

    </application>

</manifest>
```


![Screenshot_20160412-181419.png](https://qiita-image-store.s3.amazonaws.com/0/74328/2c16d9ec-56a8-3ab1-81a3-056c29e00528.png)

こんな感じで全てのボリュームが同期して変更。
満足。


### TODO
~~public static final Stringな定数の定義がうまくできず断念~~

public static final StringなKotlin的書き方を教えてもらったので、SharedPreferenceを使う部分をもうちょいマシにする。



```kotlin
// class object {  Wrong!
companion object {
    const val HOGE="hoge"
}
```

~~でいいはずなんだけど、エラーになるなぜ？~~
【Python】角度２つと距離から座標を求める

# 概要
親子関係にあるオブジェクトにおいて
親オブジェクトが回転した時に子オブジェクトがどう動くのかとかそういう時に使える。

# 参考コード

実行環境：Motionbuilder2015

MBでNullで球を描く処理を作ってみました。
本題の処理は`getPosition()`の中身だけです。

※ MBを知らない人へ
`FB○○`と言うのはMB専用のものです。
自分が利用したいソフトや言語に沿ったものに変更してください。


```py
# -*- coding: utf-8 -*-

from pyfbsdk import *
import math

# 角度2つと距離から座標を求めるメソッド
def getPosition(_angle1, _angle2, _radius):
    x = _radius * math.sin(math.radians(_angle1)) * math.cos(math.radians(_angle2));
    y = _radius * math.sin(math.radians(_angle1)) * math.sin(math.radians(_angle2));
    z = _radius * math.cos(math.radians(_angle1));
    return FBVector3d(x, y, z);

# このfor内を使いたいソフト用に変更してあげれば何でも球体を描いてくれる
## angle1,angle2 に入る値を調整すれば半円を描いたりもできる
## rangeの第3引数のstepを1（もしくは指定なし）で実行すると重たいので注意
parentPos = FBVector3d(50, 50, 50)
for angle1 in range(0, 360, 3):
    for angle2 in range(0, 180, 3):
        mdlNull = FBModelNull("Null_{0}_{1}".format(str(angle1), str(angle2)))
        mdlNull.Show = True
        mdlNull.Scaling = FBVector3d(1, 1, 1)
        mdlNull.Translation = parentPos + getPosition(angle1, angle2, 100.0)
```

実行するとこんな感じのものが出来上がります。
（これはrange()のstepを1で作りました！）

![球体.png](https://qiita-image-store.s3.amazonaws.com/0/76746/0c369bd3-24ad-28f5-2c1c-169f1fb55db6.png)
python で cout << "Hello, World!" << endl

[こちらの記事のコメント](http://qiita.com/teratera/items/d4610e0212dff1cf3e97#comment-a9253694e57a512bf5f6)に書いたけど、せっかくなので投稿記事にしておきます。
`C++`でおなじみの `cout <<` をpythonでも使えるようにする方法です。

`<<`演算子の処理メソッドである `__lshift__` を定義します。 

```py:cout.py
class ConsoleOutput:
    def __lshift__(self, message):  # Left Shift(<<)演算子の処理を定義
        print(message, end='')
        return self

cout = ConsoleOutput()
endl = "\n"

if __name__ == '__main__':
    cout << "Hello, world!" << endl
```

```Console:実行結果
$ python3 cout.py
Hello, world!

```

モジュールをインポートして使うこともできます。

```py:sample.py
from cout import *

cout << "Hello, world!" << endl
```

```console:実行結果
$ python3 sample.py
Hello, world!

```
deployerで直接Webhooksを使わずに簡単にslack通知する

deployer使ってリリース後にslack通知する、みたいなことを、curlでwebhoosを叩かずにslackrecipeを使ってやる手順のメモです。

# インストール

composerで下記をインストール

```bash
$ php composer.phar require --dev "deployphp/recipes ~3.0"
```

もしくは

```json:composer.json
{
  "require": {
    "deployer/deployer": "~3.0",
    "deployphp/recipes": "~3.0"  #これを追加
  }
}
```

# deploy.phpに処理追加

以下のような感じで必要な設定を追加します。

```php:deploy.php
<?php

require 'vendor/deployphp/recipes/recipes/slack.php';

set('slack', [
  'token'    => '', // slackの認証Tokenを入れる
  'team'     => '', // slackチーム名を入れる
  'channel'  => '', // 投稿するチャンネルを入れる。デフォルトが#generalなので結構怖い
  'app'      => '', // アプリケーション名を入れる
  'icon'     => '', // iconは必要であれば。デフォルトは:sunny:
  'username' => '', // ユーザー名も必要であれば。slackに表示される通知のユーザー名。デフォルトはDeploy
]);

// deployの後に処理追加
after('deploy', 'deploy:slack');
```

これでslackに通知がされるようになります！
webhooks使っても大して手間変わらない気もしますけどね(´・ω・｀)
StringJoinerとstream

Java8から文字列結合のAPIにStringJoinerが追加されました。
これ思った以上に便利な機能なので、似たようなメソッドやユーティリティを実装する前に検討してみましょう。

# コンストラクタ

次の2種類が用意されています。

|コンストラクタ|説明|
|:---|:---|
|StringJoiner(CharSequence delimiter)|第1引数を区切り文字とした連結文字列を生成します|
|StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)|第1引数を区切り文字とし、第2引数を先頭、第3引数を末尾とした連結文字列を生成します|

引数はCharSequenceですが、利用する際にはStringで良いです。

# 使い方

例えば引数が1つの場合を使ってみましょう。

```java
public void sampleA() {
    List<String> list = Arrays.asList("カピバラ", "ソルト", "のり");

    StringJoiner join = new StringJoiner(",");
    // リストの要素を1つ取り出すたびにStringJoinerへ追加する。
    list.stream().forEach(e -> join.add(e));

    System.out.println(join.toString());
}
```

このメソッドの実行結果は次のようになります。

```
カピバラ,ソルト,のり
```

第1引数の文字を区切り文字として、StringJoinerに追加されたものが出力されました。

# 接頭辞＋接尾辞を指定する

引数が3つあるコンストラクタを使えば、CSVやJSONのような出力にも使えます。

## CSVライクな例

```java
public void testCSV() {
    List<String> list = Arrays.asList("カピバラ", "ソルト", "のり");
    StringJoiner join = new StringJoiner("','", "'", "'");
    list.stream().forEach(e -> join.add(e));

    System.out.println(join.toString());
}
```

実行結果

```
'カピバラ','ソルト','のり'
```

## JSONライクな例

```java
public void testJson() {
    Map<String, String> map = new HashMap<>();
    map.put("名前", "ソルト");
    map.put("年齢", "2歳");
    map.put("性別", "メス");

    StringJoiner join = new StringJoiner(",", "{", "}");
    map.entrySet().stream().forEach(m -> join.add(m.getKey() + ":" + m.getValue()));

    System.out.println(join.toString());
}
```

実行結果

```
{年齢:2歳,性別:メス,名前:ソルト}
```

## URLのクエリ文字列

先頭だけ?で始まり、以降は&でつなげる、のような場合にも使えます。

```java
Map<String,String> map = new HashMap<>();
    map.put("名前", "ソルト");
    map.put("年齢", "2歳");
    map.put("性別", "メス");

    StringJoiner join = new StringJoiner("&","?","");    
    map.entrySet().stream().forEach(m -> join.add(m.getKey() + "=" + m.getValue()));

    System.out.println(join.toString());
```

実行結果

```
?年齢=2歳&性別=メス&名前=ソルト
```
【Windows IIS】IIS環境にWordpressいれたら思いの外いろいろアレだった話【Wordpress】

# 前提

サーバがWindows server 2008、IIS6の環境。
サーバは初期で用意したままで特に何もいじってない。。
最低限PHPは入れてもらってる状態での設置。
また、Wordpressはドキュメントルートに任意のディレクトリを作成し、
その中にインストールしてindex.phpと.htaccessのみドキュメントルートにおいて管理画面の
URLと分けることとする。

# ハマった点（

## htaccessが使えない（解決）

web.configにて記述しなきゃならん
ドキュメントルートに下記で設置

```lang:web.config
<configuration>
<system.webServer>
<rewrite>
	<rules>
		<rule name="wordpress" patternSyntax="Wildcard">
			<match url="*"/>
			<conditions>
				<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
				<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
			</conditions>
			<action type="Rewrite" url="index.php"/>
		</rule>
	</rules>
</rewrite>
</system.webServer>
</configuration>
```


## デフォルトだとRewriteがない（解決）

[Rewrite module 2.0 for IIS](https://www.compnet.jp/archives/1238)をインストールして対応

## linux環境で作ったWPのDBダンプをリストアしてみたら管理画面のスタイルシートが死んだ。（解決）

load-style.phpがなんか動かなくなる、wp-config.phpに下記記述で対応

```lang:wp-config.php
define('CONCATENATE_SCRIPTS',false);
```

## メディアアップロードでローディング画像がぐるぐるまわったまま進まない（解決）

wp-admin/ajax-load.phpが環境によって正しく動かないらしい。
どうもcontent-type:text/htmlでよまれるのがあれだとか。。下記対応

```lang:wp-admin/ajax-load.php
//@header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
if(in_array($_POST['action'], array('query-attachments', 'send-attachment-to-editor'))){
	@header('Content-Type: application/json; charset=' . get_option('blog_charset'));
}else{
	@header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
}

```
WPアップデートはきをつけて。。

## パーマリンク設定をデフォルトからよくあるカスタム設定「/%%post_id%%」とかにすると画像アップロードが死ぬ（解決）

下記対応手順
1.php.iniにのupload_tmp_dirに"C:¥TEMP"を設定
2.上記テンポラリディレクトリに権限フルコントロール付与
3.IIS再起動
4.wp-config.phpに「define('WP_TEMP_DIR','C:¥TEMP');」設定
5.uploadsディレクトリに「IIS_IUSERS」の権限フルコントロール付与


## phpからのメール送信（mail関数など）が使用できない。(解決)

根本的に
・25ポートがあいてない
ってのがあって試しに開けたけど、sendmail.exe単体で動かないくさい。

ということで、仮想SMTPサーバを構築することに。

SMTPサーバインストール
1.サーバマネージャーを起動し、機能を追加でSMTPサーバを選択。
2.インストール後、「インターネットインフォメーションサービス6.0マネージャー」を起動
3.SMTP Virtual Serverのプロパティでアクセスタブ野中の接続制御と中継の制限にて「127.0.0.1」を許可する
4.SMTP Virtual serverを起動
5.cmdでtelnetによる動作確認で問題なくメールが送信できればOK

wp mail smtpプラグインにてローカルのsmtpを利用したメール送信を実施。

# まとめ

よっぽどなことがない限りWebサーバはLinuxに限る。マジで。
Firebaseのデータを同期的に取得したい

AndroidのFirebase SDKのデータ取得処理は非同期で行われます。
通常データを一件取ってくるくらいだったらこれで十分だし便利なんですけど、複数オブジェクトを扱うようになると**IDのリストを取ってきてそれぞれについて詳細データを取ってきて全部揃ったら返す**みたいな感じの処理をやる必要がでてきて、そうすると非同期のAPIだと非常に処理が書きづらい。かといってせっかくSDKが整備されているのにREST APIを叩くのはちょっと…

というわけで、Javaの標準APIに含まれている`Future`インターフェースを使ってFirebaseのデータ取得を同期的に処理できるようにしてみた。
本当はマルチスレッドのこととかきちんと考えないといけないんでしょうけど、とりあえず動くのはできた。

```java:FutureSnapshot.java
public class FutureSnapshot implements Future<DataSnapshot>, ValueEventListener {
    private final Query query;
    private boolean canceled;
    private DataSnapshot snapshot;

    private FutureSnapshot(Query query) {
        this.query = query;
        query.addListenerForSingleValueEvent(this);
    }

    @Override
    public boolean cancel(boolean mayInterruptIfRunning) {
        if (isDone()) {
            return false;
        }

        query.removeEventListener(this);
        canceled = true;
        return true;
    }

    @Override
    public boolean isCancelled() {
        return canceled;
    }

    @Override
    public boolean isDone() {
        return snapshot != null;
    }

    @Override
    public DataSnapshot get() throws InterruptedException, ExecutionException {
        while (!isDone() && !canceled) {
            Thread.sleep(100);
        }
        return snapshot;
    }

    @Override
    public DataSnapshot get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
        Thread.sleep(unit.toMillis(timeout));
        return snapshot;
    }

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        this.snapshot = dataSnapshot;
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {
        canceled = true;
    }
}
```

## 使い方

```java
Firebase fb = new Firebase("https://mydatabase.firebaseio.com");
Future<DataSnapshot> futureSnapshot = new FutureSnapshot(fb);
DataSnapshot snapshot = futureSnapshot.get();
```

たとえば下記のようなデータがあるときに`dataList`の下にあるIDを`sortOrder`の順に`data`から取得したいとすると

```json
{
  "data": {
    "-K-XnH7XuxHrLfj0lVT-": {
      "name": "Arc"
    },
    "-K-qzTmqGgZnwFu2ep4-": {
      "name": "Alec"
    },
    "-K-bEW28LyK1sigjELVO": {
      "name": "Elc"
    }
  },
  "dataList": {
    "-K-XnH7XuxHrLfj0lVT-": {
      "sortOrder": 1
    },
    "-K-bEW28LyK1sigjELVO": {
      "sortOrder": 2
    },
    "-K-qzTmqGgZnwFu2ep4-": {
      "sortOrder": 3
    }
  }
}
```

このように書けます。
注意:このコードはバックグラウンドスレッドで処理されることを想定しています。メインスレッドでこの処理を行うとフリーズしてしまいます。

```java
// 取得すべき data の id をsortOrderの順に取得
Firebase fb = new Firebase("https://mydatabase.firebaseio.com");
Future<DataSnapshot> futureSnapshot = new FutureSnapshot(fb.child("dataList").orderByChild("sortOrder"));
DataSnapshot dataListSnapshot = futureSnapshot.get();

List<String> ids = new ArrayList<>();
for (DataSnapshot child : dataListSnapshot.getChildren()) {
  ids.add(child.getKey());
}

// 取得した id を使って data を取得 *1
List<Future<DataSnapshot>> futures = new ArrayList<>();
for (String id : ids) {
  futures.add(new FutureSnapshot(fb.child("data").child(id)));
}

List<DataSnapshot> snapshots = new ArrayList<>();
for (Future<DataSnapshot> f : futures) {
  snapshots.add(f.get());
}
```
サイズのわからない画像のAMP対応

[AMP⚡️](https://www.ampproject.org/)(Accelerated Mobile Pages)に対応したサービス増えてきました。
AMPのページではできることが少ないので、対応は簡単です。（元の仕様を削るのが大変）

AMPで画像を表示するには``<amp-img>``タグを使う必要があります。

例えばこんな感じ

```html
<amp-img src="sample.jpg" width="300" height="300"></amp-img>
```

しかし、
ソーシャルAPIから引っ張ってきた画像、そもそも画像サイズを保存していないなど、画像サイズがわからないとき
width、heightを省略してみると

```html
<amp-img src="sample.jpg"></amp-img>
```

AMPはエラーに・・・
アスペクト比が固定の画像であれば適当でも良いですが、そうでない場合画像が歪みます。


## 解決策１

``layout="fixed-height"``を使い高さのみ固定にして、幅はレスポンシブに任せる
詳しい使い方は[Layout](https://www.ampproject.org/docs/guides/responsive/control_layout.html)へ

```
<amp-img src="sample.jpg" layout="fixed-height" height="300"></amp-img>
```


## 解決策２

とりあえず数値は入れておき、CSSで元の形に戻す

```html:html
<amp-img src="sample.jpg" width="300" height="300"></amp-img>
```

```css:css
amp-img img{
  width: auto;
  height: auto;
}
```

## 解決策３

**サーバーサイドで計算する。**


とりあえずこれで歪まなくなります。
解決策１も解決策２も高さが固定されるので、画像によってはマージンが空いたりします。``CSS``や``sizes``などとも組み合わせてうまくやりましょう。
Visual Studio + GLFW 簡単導入

#まえおき
##動機
Visual Studio で利用できるNuGetを利用したら、想像以上に短時間でGLFWを利用したプロジェクトが作成できたので記事にすることにしました。

##対象者
Visual Studioを利用している方で、GLFWを導入したい方。
インターネットに接続されている方。

##環境
Visual Studio 2015（2013でも一応確認）
Windows7

## 謝辞
本記事は床井先生の情報を参考に執筆いたしました。また、ソースコードは床井先生のコードをパク…参考にしたと思います。昔書いたコードを移植しただけなので、覚えておりません。
よろしければ、以前書いたGLFW導入の記事をどうぞ。
[GLFWを導入する](http://www.cho-design-lab.com/2015/04/21/intro_glfw/)

#さっそく本題
流れ
1. プロジェクトを作成する
2. NuGetパッケージマネージャからGLFWをインストール
3. OpenGLライブラリのリンク設定
4. ビルド＆実行

## 1. プロジェクトを作成する
Visual Studioのメニューから、*ファイル*→*新規作成*→*プロジェクト*を選ぶ
![WS000059.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/87f65428-3bba-78f4-f202-4c83271c9e4c.jpeg)

今回は*Win32コンソールアプリケーション*を指定。
![WS000060.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/e4d668f1-2a31-967b-ff44-f854b3cf4a89.jpeg)

ちょっと事情があって、*空のプロジェクト*にしました。
![WS000061.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/2ad62c66-2e90-7907-a476-1d541fb0832b.jpeg)

これにてプロジェクト作成完了

## 2. NuGetパッケージマネージャからGLFWをインストール
ソリューションエクスプローラにある作成したプロジェクトを右クリックし、*NuGetパッケージの管理* を選択する
![WS000062.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/4a5d6e3d-1ae1-997e-727d-71e718dba44d.jpeg)

NuGetパッケージマネージャの検索窓に*glfw*と入力すると、絞り込まれる。
glfwのパッケージを選択し、右側にあるインストールボタンを押下する。この時バージョンに希望があれば、指定する。
![WS000063.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/70663f79-2b71-2fbd-4710-2d32f98fa38b.jpeg)


インストールする前に、確認がでるので、よければOK。
![WS000064.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/0a15a837-aae4-e7ed-1cf0-7c83d93f4518.jpeg)

## 3. OpenGLライブラリのリンク設定
GLFWを利用する際には必ず（？）OpenGLを利用するので、OpenGLのライブラリをリンクしなければならない。そこで、*プロジェクト*の*プロパティ*を開き、*構成プロパティ*->*リンカ*->*追加依存ファイル*に**opengl32.lib**を追加する。
![WS000065.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/13da8dbd-f3b7-b771-1a27-8db36749e4ba.jpeg)

## 4. ビルド＆実行
ここまでで設定完了です。あとはどしどしコードを書いて実行してください。とりあえず、今回は下記のソースコードで動作の確認をしました。

以前書いたGLFW導入の記事から拝借しました。
[GLFWを導入する](http://www.cho-design-lab.com/2015/04/21/intro_glfw/)

```C:main.cpp
#include <iostream>
#include <GLFW/glfw3.h>


int main()
{
	if (glfwInit() == GL_FALSE)
	{
		std::cerr << "Can't initilize GLFW" << std::endl;
		return 1;
	}

	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

	GLFWwindow *const window = glfwCreateWindow(640, 480, "SAMPLE", NULL, NULL);
	if (window == nullptr)
	{
		std::cerr << "Can't create GLFW window." << std::endl;
		glfwTerminate();
		return 1;
	}

	glfwMakeContextCurrent(window);

	glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

	while (glfwWindowShouldClose(window) == GL_FALSE)
	{
		glClear(GL_COLOR_BUFFER_BIT);


		glfwSwapBuffers(window);

		glfwWaitEvents();
	}

	glfwTerminate();
}
```

白い画面にウィンドウタイトルが"SAMPLE"と出れば成功です。
![WS000067.JPG](https://qiita-image-store.s3.amazonaws.com/0/109715/39c8b69c-4bb1-4f79-a5de-c070ae933737.jpeg)

# おわりに
とっても簡単に導入することができました。以前、大学の授業で多数の学生相手に、ライブラリのダウンロード、適切な場所への移動、パスの追加などなど、非常にミスが多発し、頭が痛くなりましたが、これで少し問題が解消できそうです。
TRIGGERだけmysqldumpする

Running Triggers on the Slave for Row-based Eventsの検証のため、
BI用サーバのTRIGGERを全部DROPする必要があったので、TRIGGERだけmysqldumpしてみた。


* [Running Triggers on the Slave for Row-based Events(mariadb公式knowledgeより)](https://mariadb.com/kb/en/mariadb/running-triggers-on-the-slave-for-row-based-events/)

# 全てのTRIGGERをmysqldumpする。(=全てのスキーマが対象)

* rootと同様の権限持っているユーザがいたら、そちらでもOK。
* --add-drop-triggerつけないと、同名のTRIGGERがあるとエラーになるので、適宜使い分けて。
* ↑の**--add-drop-triggerはmariadbのmysqldumpには無い**オプションでした。。。トホホ…(´・ω・｀) MySQLにはあるようです。
* ちなみに--routinesつけるとストアドのdumpがとれます。

```sql
# mysqldump  -u root -p --all-databases --triggers --no-create-info --no-data > trigger.dump_$(date '+%Y%m%d')
```

# 特定のスキーマのTRIGGERのみをmysqldumpする。

```sql
# mysqldump  -u root -p --databases <スキーマ名1> <スキーマ名2> --triggers --no-create-info --no-data > trigger.dump_$(date '+%Y%m%d')
```

# 参考リンク。
* [mysqldumpまとめ](http://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c)
* [4.5.4 mysqldump — データベースバックアッププログラム(mysql公式Document)](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html)
* [SQLでトリガーのみのmysqldumpコマンドを生成する](http://www.s-quad.com/wordpress/?p=1722)
* [いままで使ったことのあるmysqldump でもバックアップの方法をメモ](http://qiita.com/hit/items/12b8bd7fd134cbff2646)
* [https://mariadb.com/kb/en/mariadb/mysqldump/](https://mariadb.com/kb/en/mariadb/mysqldump/
)
gulp-sassでエラー（compass使ってて）

#gulp-Sassでエラー
Sassをgulpで、コンパイルしようとして、
エラーが出たので備忘録

```
gulp sass
```
とコマンドうったら
以下のエラー

```ターミナル
events.js:154
      throw er; // Unhandled 'error' event
      ^
Error: source/stylesheets/_style.scss
Error: Function sprite-map doesn't support keyword arguments
```


##解決策

調べたら、compassのコンパイルができるように
**gulo-compass**というプラグインを入れなきゃいけなかった
```
sudo npm install --save-dev gulp-compass
```

参考
[http://ichimaruni-design.com/2015/02/comapss-gulp/]
なんかおかしいな？と思った時にチェックすべき4つのポイント

たまに正しく動くけど、ときどき間違って動くこともある。
プログラミングをしているとそういう状況になることがあります。特にAndroidではNDKを使い始めると割としょっちゅう起こると思います。こういう場合、どこがおかしいのかを特定するのは結構大変です。

しかしよく調べてみると、不定期に問題が起こるコードは割と似たような原因で発生しているようです。
なんかおかしいな？と思ったら、下記の4点をチェックしてみると良いでしょう。

## 変数の初期化を忘れていないか？

Javaではプリミティブ型は`0`や`false`に、参照型は`null`に自動的に初期化されますが、CやC++では変数の宣言のみ行い初期化をしなかった場合、その変数に入っている値は**不定**になります。正確には、**その変数にメモリ領域が割り当てられた際に以前記録されていた値**となります。
昔のゲームではこのような値を乱数代わりに使ったりもしていたようですが、一般的なアプリケーションではこのような不定の値を利用することはまずありません。このような値を扱ってしまうと実行する度に予測の付かない動作を引き起こしてしまうため、必ず変数は初期化してから使うようにしましょう。

## メモリ解放を忘れていないか？

こちらもJavaではガーベッジコレクションがあるためあまり気にしませんが、CやC++では自分で確保したメモリは必ず自分で開放する必要があります。`new`でインスタンスを作成したら`delete`でメモリを開放するのを忘れないようにしましょう。
メモリの開放を忘れると、だんだん利用できるメモリがなくなっていき最終的にアプリケーションが強制終了したり最悪システムが停止したりします（メモリリーク）。
C++のクラス（構造体）ではデストラクタを使いこなせるようになるとメモリ管理が楽になります。

ちなみにJavaのガーベッジコレクションも万能ではなく、循環的に参照するオブジェクトが存在するとメモリリークが発生することがあります。Javaでもなるべく不要になったオブジェクト参照には`null`を代入するように心がけたほうが良いでしょう。

## 実行スレッドは正しいか？

Androidでは大抵の場合、大きく分けて以下の3種類のスレッドが存在します。

* Androidのメインスレッド
* バックグラウンドスレッド
* Open GLのコンテキストを持ったスレッド

メインスレッドはAndroidシステムが用意するスレッドで、主にUIの更新に使います。
バックグラウンドスレッドは自分で作成するスレッドで、ネットワーク通信やファイルの読み書きに使います。
Open GLのコンテキストを持ったスレッドはGLSurfaceViewやCardboardViewなどを使う際に作られます。(直接または間接的に)Open GLのAPIを呼び出す処理はこのスレッドから行わなければいけません。

適切なスレッドで適切なAPI呼び出しを行わないと、特定の端末では動くけど別の端末では動かなかったり、たまに動くけどたまに失敗するというような予測不能な動作を引き起こしてしまいます。

また、`ArrayList`や`HashMap`などのコレクションは複数のスレッドで同時にアクセスすると`ConcurrentModificationException`が発生する場合があります。単一のスレッドからのみアクセスするように処理の流れを見直すか、複数のスレッドから使わなければいけない場合は値を取得・設定する箇所を`synchronized`ブロックで囲ってきちんと同期処理をするか、`Collections.synchronizedList`を使って同期化バージョンのコレクションを取得するか、`CopyOnWriteArrayList`や`ConcurrentHashMap`などの複数のスレッドから扱えるように作られたコレクションクラスを使用します。

## スレッド間の処理順序は正しいか？

二つのスレッドA,Bが並行して処理を行っているとします。
このとき、スレッドBの中にスレッドAの処理が完了していることを前提として処理している箇所がある場合、そこに入る前にスレッドAの終了を待機する処理を書いておかなければいけません。
そうしないと、たまたまスレッドAが早く処理が終わったときは成功するが、スレッドAの処理に時間がかかった場合は失敗する、という不安定なプログラムになってしまいます。

この状況のやっかいなところは、**スレッドBが強制終了するからといってスレッドBの中にブレークポイントを置いて変数の中身を確認しようとすると、スレッドBが中断している間にスレッドAが完了してしまうため、処理が正しく行われてしまう**ということです。
こういう場合はブレークポイントではなく`Log.d`などを使ってログに変数の中身を書き出すようにすると良いです。

Javaでは`Future`を使って非同期処理が終了するまで待機して結果を取得するAPIがあるので、複数スレッドで並行処理を行う時は活用してみましょう。
GitHubリポジトリのデフォルトブランチをdevelopに変更する

#はじめに
最近GitHubを触り始めたのでメモ。
GitHubリポジトリのデフォルトブランチの設定方法について。

#前提
- GitHubのデフォルトブランチ設定はmasterブランチになっている
- git-flowベースの開発スタイルであれば、リリース時以外は作業用ブランチからdevelopブランチへのマージが中心になる
- Pull Requestを送るたびに差分の対象ブランチをmasterブランチからdevelopブランチへ手動で切り替える作業が発生する 
- 効率悪くね？

というわけでデフォルトブランチの設定を変更する。

#デフォルトブランチの設定
GitHubの対象リポジトリにて [Settings] - [Branches] を選択。
<img width="708" alt="スクリーンショット 2016-04-12 15.28.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/17b43b98-cbe1-1429-7670-dfbc4e3bea58.png">

「Default Branch」の「master」をクリックし、ブランチを「develop」に切り替えて「Update」をクリック。
<img width="309" alt="スクリーンショット 2016-04-12 15.28.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/294e3943-4f79-8ba9-f217-d6f623120ed2.png">

確認ダイアログが表示されるので問題なければ了解ボタンをクリックする。
<img width="459" alt="スクリーンショット 2016-04-12 15.28.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/795229ec-7a2c-5ad6-1318-b73ad2a20510.png">

これでデフォルトブランチがdevelopブランチになる。

#参考
[GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus) ](http://www.amazon.co.jp/dp/477416366X/)
Ubuntu16.04のphoenixで最初のアプリを作ってみた

## はじめに

[前回](http://qiita.com/dynamitecoolguy/items/889b2fd4db8e29d8e356)、Ubuntu16.04にphoenixまで入れてみたので、サンプル用の最初のアプリを作ってみます。

## 最初のアプリ

### テンプレート作成

`mix phoenix.new`コマンドを使って、phoenixのテンプレートアプリを作成します。
下の例ですと、ディレクトリ`demo_app`が作成されて、その下にプロジェクトに必要なファイルが配置されます。

```shell-session
$ mix phoenix.new demo_app
```

これでテンプレートと依存するライブラリのダウンロード等が行われます。なお、Linuxですと以下の警告ができますが、これは無視してかまいません(Mac専用でしょうか?)。

```shell-session
npm WARN optional Skipping failed optional dependency /brunch/chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.11
```

### DB作成

`mix ecto.create`でRDBをセットアップしていきます。

```shell-session
$ cd demo_app
$ mix ecto.create
```

Hexのバージョン違いなどによって、`Unchecked dependencies for environment dev:`というエラーメッセージと共に`mix deps.get`を実行して欲しいというエラーが出ることがあります。このときは、素直にdeps.getを実行します。

```shell-session
$ mix deps.get
```

もう一度、`mix ecto.create`でRDBをセットアップしていきます。
`rebar`がインストールされていない場合は、rebar入れてもいいかと聞かれるので、問題無い(Y)と答えておきます。

```shell-session
$ mix ecto.create

(...略...)

Could not find "rebar", which is needed to build dependency :fs
I can install a local copy which is just used by Mix
Shall I install rebar? [Yn]

-> Y
```

しかし、Postgresqlインストールしたデフォルトのままだと、postgresユーザにパスワードが設定されていないので、下のようなエラーが出てしまいます。

```shell-session
** (Mix) The database for DemomoApp.Repo couldn't be created, reason given: psql: FATAL:  password authentication failed for user "postgres"
FATAL:  password authentication failed for user "postgres"
```

設定ファイル(`config/dev.exs`)にpostgresのユーザ、パスワード、ホスト名などが設定されています。

```shell-session
$ cat/config/dev.exs

(...略...)

# Configure your database
config :demo_app, DemoApp.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "postgres",
  database: "demo_app_dev",
  hostname: "localhost",
  pool_size: 10
```

今回は、設定の方を変えずに、dbのpostgresユーザにパスワードを設定することにします。
postgresqlの`pg_hba.conf`ファイルの位置を確認しつつ、パスワードを設定します。

```shell-session
$ sudo su - postgres
> psql
postgres=# show hba_files;
hba_file
--------------------------------------
/etc/postgresql/9.5/main/pg_hba.conf
(1 row)
postgres=# alter role postgres with password 'postgres';
```

pg_hba.confの中身は、下のようになっていました。
つまり、ローカルへの接続はパスワード認証が許可されているということで、こちらは編集の必要は無さそうです。

```shell-session
(...略...)
local all all 127.0.0.1/32 md5
(...略...)
```

再度、`mix ecto.create`でRDBをセットアップします。

```shell-session
$ mix ecto.create

The database for DemoApp.Repo has been created.
```

今度は無事作成できたようです。

```shell-session
$ psql -h localhost --username=postgres -W
postgres=# \l

(...略...)
      Name      |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
----------------+----------+----------+-------------+-------------+-----------------------
 demo_app_dev   | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
```

### 起動とWeb確認

`mix phoenix.server`で、サーバを起動してみます。設定ファイルを見るとポートは4000です。

```shell-session
$ cat/config/dev.exs

(...略...)
config :demo_app, DemoApp.Repo,
  http: [port: 4000],
(...略...)

$ mix phoenix.server
```

`http://localhost:4000/`にアクセスすると、Phoenix Frameworkのデフォルト画面が表示されました。
なお、iexでインタラクティブで操作しながらサーバを動かす場合は、下のようにします。

```shell-session
$ iex -S mix phoenix.server
```
任意バイト長の符号あり整数の符号を反転する JavaScript コード

[int64-buffer](https://github.com/kawanet/int64-buffer) という 64 ビット整数を扱うモジュールを書いていて、8 バイト長の符号あり整数の符号を反転する JavaScript コードを書いてました。

前提：Buffer とか Uint8Array のビッグエンディアンのバイト列に整数値を格納していて、最初のバイトの最上位ビットが符号であること。

```js
  function neg(buffer, start, end) {
    var p = 1;
    for (var i = end; i >= start; i--) {
      var q = (buffer[i] ^ 255) + p;
      p = (q > 255) ? 1 : 0;
      buffer[i] = p ? 0 : q;
    }
  }
```

https://gist.github.com/kawanet/6c562ab541986da933435deb3a7c37c0

メモ：

- 要は、すべてのビットを反転させて、1 を足せばよい。
- 引数で start、end を指定できるのは、バッファ上の位置を指定できるようにするため。
- 0 の符号を判定したときは 0 のままになる。
- 0x80000000 (INT32_MIN) などのそのバイト数で表せる最小の負の値の符号を反転したいときは、反転できないので、そのままになる。(C 言語だとそういう動作になっていた）
- `p` の値は 0 か 1 のみ。`q` の値は 0〜255。
lambdaでVPC内のRDSにアクセスする

# はじめに

AWS LambdaがVPCに対応したので、プライベートネットワーク上のRDSにアクセスできるようになりました。
Pythonでやってみましたので、手順をメモしておきます。
Python LambdaからRDSへの接続はMySQL-pythonを利用します。
外部ライブラリを利用する場合は、スクリプトとライブラリを合わせてzip圧縮し、アップロードする必要があります。
今回はEC2(Amazon Linux AMI 2016.03.0)で準備したときの手順です。

# 準備

テスト用RDSを用意します。

http://qiita.com/Keisuke69/items/cba4b501e91da95188f8

ここと同じ手順で、RDS(MySQL)の起動とテーブルの作成を行います。

# 作業ディレクトリを作成

```bash
$ mkdir lambda-rds
$ cd lambda-rds/
```

# pipをアップグレード

```bash
$ sudo pip install --upgrade pip
```


# 必要なパッケージをインストール

```bash
$ sudo yum -y install mysql mysql-devel gcc
```

# MySQL-pythonをカレントディレクトリ内にインストール

そのままインストールしようとすると下記のようなエラーが出るので、

```
Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/usr/local/lib/python2.7/site-packages/pip/commands/install.py", line 357, in run
    for item in os.listdir(lib_dir):
OSError: [Errno 2] そのようなファイルやディレクトリはありません: '/tmp/tmpxhz25M/lib/python'
```
ディレクトリ内に下記のファイルを作成します。

```setup.cfg
[install]
install-purelib=$base/lib64/python
```

インストールを実行します。
pipをアップグレードするとpipのパスが/usr/binから/usr/local/binに代わるみたいなので、フルパスで実行しています。

```bash
$ /usr/local/bin/pip install MySQL-python -t .

$ ls
MySQL_python-1.2.5.egg-info
MySQLdb
_mysql.so
_mysql_exceptions.py
_mysql_exceptions.pyc
setup.cfg
```

# スクリプトの作成

ファイル名はlambda_function.py、ファンクション名はlambda_handlerにします。

```python:lambda_function.py
import MySQLdb

def lambda_handler(event, context):

  connect = MySQLdb.connect(host='lambda.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com', db="lambda", user="lambda", passwd="XXXXXXXX")
  connect.cursorclass = MySQLdb.cursors.DictCursor
  cursor = connect.cursor()
  cursor.execute('SELECT * FROM sample')
  row = cursor.fetchone()
  cursor.close()
  connect.close()
  return  row
```

# Shared Object Fileのコピー

libmysqlclient.so.18をカレントディレクトリにコピーします。

```bash
$ cp /usr/lib64/mysql/libmysqlclient.so.18 .
```

これがないとlambda実行時に、

> Unable to import module 'lambda_function': libmysqlclient.so.18: cannot open shared object file: No such file or directory

というエラーになります。


http://www.iheavy.com/2016/02/14/getting-errors-building-amazon-lambda-python-functions-help-howto/

# カレントディレクトリすべてをzip圧縮

```bash
$ zip -r upload.zip *
```

# AWSマネージメントコンソールからLambda Functionの作成

- Select blueprint → Skip

- Configure function
    - Name: 適当
    - Description: 適当
    - Runtime: Python 2.7
  
- Lambda function code
    - Code entry type: Upload a .ZIP file をチェックし、upload.zipをアップロード

- Lambda function handler and role
    - Handler: lambda_function.lambda_handler   (ファイル名.関数名)
    - Role: Basic with VPC を選択
    - Role Nameを編集し、Allowを選択

-  Advanced settings
    - VPC: RDSのVPCを選択
    - Subnets: デフォルト(全選択) サブネットを固定する場合は、選択
    - Security Groups: RDSにアクセスできるセキュリティグループを選択

# 動作確認

Input test eventはそのままで、Test

こんな感じで返ってきました。

```json
{
  "id": 1,
  "value": "test"
}
```
New features in Swift 3.0


#####Document:[Apple Swift Document](https://swift.org/blog/swift-2-2-new-features/)

#####Release Notes:[Official release notes](https://swift.org/blog/swift-2-2-released/)

```
import UIKit

class ViewController: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // 修改1：traditional C-style for loop is deprecated
        for i in 0..<3
        {
            print(i)
        }
        
        // ps. for var i = 3; i > 0; i-- {} can be write like blow:
        for i in (0..<3).reverse()
        {
            print(i)
        }
        
        // ps. for var i = 0; i < 10; i+=2 {} can be write like blow:
        for i in 0.stride(to: 10, by: 2)
        {
            print(i)
        }
        
        // 修改2: selector will be checked in compile-time
        let tap = UITapGestureRecognizer(target: self, action: #selector(selectorFunc))
        view.addGestureRecognizer(tap)
        
        // 修改3: Swift version-check will be in compile-time
        #if swift(>=2.2)
            print("Swift 2.2+")
        #else
        	 This code will never be checked!!!!!!!!
            print("Swift 2.2-")
        #endif
        
        // 修改4：
        testFunc("kuang", age: 25)
        
        // 修改5：can compare two tuples
        let tupleOne = (firstName:"asahi", age:25)
        let tupleTwo = (first:"asahi", a:25)
        if tupleOne == tupleTwo {
            print("equal")
        }
        else {
            print("not equal")
        }
        
        // 修改6: tuple splate syntax is deprecated.
        /*
        let parameterTuple = ("asahi", age:25)
        testFunc(parameterTuple)
         */
        
        // 修改7：var parameters is deprecated
        var name = "Tylor Swift"
        parametersFunc(name)
        parameterFuncNew(&name)
        
        // 修改8：debug identifiers are renamed
        debugFunc()
    }
    
    func selectorFunc()
    {
        print("selector function")
    }
    
    func testFunc(name: String, let age: NSInteger)
    {
        print(name+"\n",age)
    }
    /**
     *  @brief 'var' parameters are deprecated and will be removed in Swift 3.0
     */
    func parametersFunc(var name: String)
    {
        name = name.uppercaseString
        print(name)
    }

    func parameterFuncNew(inout name: String)
    {
        name = name.uppercaseString
        print(name)
    }
    
    func debugFunc()
    {
        // old version
        /*
        print(__FUNCTION__, __LINE__, __FILE__, __COLUMN__)
        */
        
        // new version
        print(#function, #line, #file, #column)
    }
    
    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```
Xcodeプロジェクト内で使っているStoryboardやXibが全てインスタンス化可能な事をテストする


StoryboardやXibの初期化はStringでファイル名を渡す形なので、注意していないと実行時にクラッシュしてしまう事があります。渡す名前をタイポしているならまだ気づきやすいですが、たとえば.xcodeprojをマージしようとしてコンフリクトの解決に失敗して、普段あまり開かない画面のIBファイルの参照を消してしまったりするとクラッシュに気づかずリリースしてしまう可能性もあります。

これどうにかできないかなーと考えていたけど、単純に以下のようなテストを書けば解決できそうです。
内容はプロジェクトディレクトリ下から.storyboard、.xibファイルの一覧を取得し、全てのファイル名でUIStoryboard・UINibインスタンスを生成するという単純なもの。万が一、ファイル上は存在するけど.xcodeprojから参照されてないものがあるとfailします。

```swift
import XCTest

class IBInstantiationTests: XCTestCase {
    
    let fileManager = NSFileManager()
    // ソースディレクトリのパス(Info.plist内に記述)
    let sourceDirectory = NSBundle(forClass: IBInstantiationTests.self).infoDictionary!["Source Directory"] as! String
    
    var xibs: [String] {
        return fileManager.enumeratorAtPath(sourceDirectory)!
            .filter({ $0.hasSuffix(".xib") })
            .flatMap({ NSURL(string: $0 as! String)?.URLByDeletingPathExtension?.lastPathComponent })
    }
    
    var storyboards: [String] {
        return fileManager.enumeratorAtPath(sourceDirectory)!
            .filter({ $0.hasSuffix(".storyboard") })
            .flatMap({ NSURL(string: $0 as! String)?.URLByDeletingPathExtension?.lastPathComponent })
    }
    
    func testInstantiate() {
        xibs.forEach { XCTAssertNotNil(UINib(nibName: $0, bundle: nil)) }
        storyboards.forEach { XCTAssertNotNil(UIStoryboard(name: $0, bundle: nil)) }
    }
}
```


プロジェクトディレクトリのパスは、以下のようにTest TargetのInfo.plistに書いたものをNSBundleのinfoDictionaryで取ってきてます。単体テスト等のコードからは直接ソースディレクトリのパスが分からないため、無理やりだけどplistでXcodeの環境変数を展開し、それをコード側から参照するという形。

![Kobito.Mc2h2c.png](https://qiita-image-store.s3.amazonaws.com/0/7325/ac4658d6-9b0b-35c2-b07a-d1328ebdd557.png "Kobito.Mc2h2c.png")


自分は普段.xcodeprojのコンフリクト対策で[simonwagner/mergepbx](https://github.com/simonwagner/mergepbx)を使っているんですが、たまーにこいつがうまくコンフリクトを解決できず、新しく追加したファイルの参照が消えてしまったりする事がありました。このテストをCIで走らせておくようにすればマージ後も心配せずに済みそうです。
JIRAとGitHubを連携させてsmart commitsを利用してみよう！

[JIRAの公式ドキュメント](https://confluence.atlassian.com/bitbucket/connect-bitbucket-cloud-to-jira-server-applications-814208991.html)を見つつもそこそこはまったので備忘録を残します。

## 1. 手順概要

1. GitHubのユーザーのSettingsから新規のJIRA用のOAuth Applicationを作成
2. JIRAの管理画面で、GitHubで作成したOAuthのアプリのTokenをDVCS用に登録
3. DVCSのリポジトリ設定画面で、JIRAと同期させたいプロジェクトを選択
4. smart commitsを利用

## 2. 実施結果

### 2-1. GitHubのユーザーのSettingsから新規のJIRA用のOAuth Applicationを作成

Personal settings > OAuth applications > Developer applications 

で新規にOauth Applicationを登録します。

![Screenshot from 2016-04-12 15-02-03.png](https://qiita-image-store.s3.amazonaws.com/0/49547/b046d636-61b5-6d96-e7ef-d3d97a15361d.png)

からの、

![Screenshot from 2016-04-12 15-03-10.png](https://qiita-image-store.s3.amazonaws.com/0/49547/e9ba2969-82ad-ca22-1fc4-5caf011549ba.png)

Developer applicationタブを開いて、右上のRegisterボタンを押下

成功すると、Client IDとClient Secretが発行されるので控えを取得します。（これは何度も参照できるので、いったん画面を閉じても問題ありません）

### 2-2. JIRAの管理画面で、GitHubで作成したOAuthのアプリのTokenをDVCS用に登録

ここで、日本語ブログ等だとちょっと情報鮮度がひくくハマりました。。

JIRAの管理画面で「アプリケーション」タブの中にある、[DVCS accoutns]を選択します。

![Screenshot from 2016-04-12 15-04-51.png](https://qiita-image-store.s3.amazonaws.com/0/49547/618dc315-d597-87a9-bb3b-c067acdf151e.png)

この際に、先ほど控えたClient IDとCelint Secretが必要になってきます。

### 2-3. DVCSのリポジトリ設定画面で、JIRAと同期させたいプロジェクトを選択

![Screenshot from 2016-04-12 15-06-46.png](https://qiita-image-store.s3.amazonaws.com/0/49547/3fc1c74c-54a4-add7-2124-09a89490bc54.png)

設定が終わると、リポジトリの一覧が上記のように表示されます。
ここで、JIRAと連携させたいプロジェクトを選択することになります。


### 2-4. smart commitsを利用

[smart commitsの公式ドキュメント](https://confluence.atlassian.com/bitbucket/processing-jira-software-issues-with-smart-commit-messages-298979931.html)にあるように、コミットメッセージにJIRAの課題番号等の情報を格納してあげると、コミットリンクがJIRAの課題に紐づくようになります。

ここで注意点が２つありました。

* commitをする際のgitのuser.emailはJIRAのアカウントと同様である必要がある。（GitHubと同じemailアドレスを使ってない場合はGitHub側に登録が必要）
* smart commitsの内容が同期されるのは１時間に１回でシステム設定によっては変更不可。ブラウザ経由による手動同期は可能の模様。

仕様として、以下が可能となっています。

* JIRAの課題のアクティビティへのcommentsをgitのコミットメッセージとして利用させる
* JIRAの課題の時間計上をgitのコミットメッセージ中の時間埋込によって実現できる
* JIRAの課題のステータスをgitのコミットメッセージ中のステータスについての埋込文言で実現できる

* PRを作成し、それがJIRA課題に紐付くコミットを含んでいる場合、JIRAからPRへのリンクが見える

イメージとしては以下のようになります。

![Screenshot from 2016-04-12 15-11-27.png](https://qiita-image-store.s3.amazonaws.com/0/49547/3b181ea0-e4ce-f320-2f10-97faf04f90d7.png)

これは便利ですね＾＾

## 3. 所感

* １時間に１回しか同期されないのはちょっと微妙ですが、こと開発だけならGitHubで行い、あとからどのくらい時間がかかったか、とか、どの程度のコミットがあったか、をサマって見るのをJIRAと割り切れれば特に気にならないかな、とも思いました。
* JIRA自体も進化しており、すぐにブログ等の情報鮮度が落ちていってるような気がしました。
* artifactory等の成果物管理系との連携についても気になるところです＾＾
* こういうのをさくっと使いこなせるようになりたいものです（＞＜）

---

本日は以上となります。
Angular.js入門サンプルその１

[Angular.jsの公式サイト](https://angularjs.org/)にあるサンプル

#Basics
```Angular.html
<!doctype html>
<html lang="ja" ng-app>
<head>
    <meta charset="UTF-8">
    <title>Untitled Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
</head>
<body>
<div>
    <label>Name:</label>
    <input type="text" ng-model="yourName" placeholder="Enter a name here">
    <hr>
    <h1>Hello {{yourName}}!</h1>
</div>
</body>
</html>
```
htmlタグにng-app、inputタグにng-model、表示したいものは{{ng-modelのやつ}}
かんたん


youtube動画内にあったおまけ

```jquery.html
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Untitled Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
</head>
<body>
<div>
    <label>Name:</label>
    <input type="text" id="name" placeholder="Enter a name here">
    
    <hr>
    <h1 id="greeting">Hello !</h1>
</div>

<script>
$(function(){
    var name = $('#name');
    var greeting = $('#greeting');
    
    name.keyup(function(){
        greeting.text('Hello ' + name.val() + '!');
    });
})();    
</script>
</body>
</html>
```
scriptタグ内にいろいろ書く。分かりにくくてたいへん
ディレクトリ一覧を文字数でソートする


# 概要
pecoは僕の生活の中で欠かせないものとなっています。
導入やその他は過去にも記事を書いたので良かったら参考にしてください。

+ [え、まだpecoを使ってないの？？？](http://qiita.com/vintersnow/items/08852df841e8d5faa7c2)）

そのうち、履歴からディレクトリ移動をするものがあったのですが、少し不満があったので改良しました。

# 不満点

```
# ### search a destination from cdr list
function peco-get-destination-from-cdr() {
  cdr -l | \
  sed -e 's/^[[:digit:]]*[[:blank:]]*//' | \
  peco --query "$LBUFFER"
}

### search a destination from cdr list and cd the destination
function peco-cdr() {
  local destination="$(peco-get-destination-from-cdr)"
  if [ -n "$destination" ]; then
    BUFFER="cd $destination"
    zle accept-line
  else
    zle reset-prompt
  fi
}
zle -N peco-cdr
bindkey '^x' peco-cdr
```

今まで上のようなコードを書いていたのですが、これだと履歴の順番で表示されます。
これはこれで便利なのですが、よく以下の様な状態になったりします。

```
~/a/b/c/d/
~/a/b/
~/a/b/e/
~/a/b/c/
~/a/
```

このとき、`~/a/`に移動したかった場合、絞り込む方法がありません。（少なくとも僕の知る限りでは）
なので、いちいちカーソルを移動するか、適当に`~/a/b/`に移動してから`cd ..`したりしていました。

# 改良
なので、表示される順番を文字数でソートするようにしました。

```
# ### search a destination from cdr list
function peco-get-destination-from-cdr() {
  cdr -l | \
  sed -e 's/^[[:digit:]]*[[:blank:]]*//' | \
  awk '{c=gsub("/","/"); print c,length($0),$0}' | \
  sort -n | \
  cut -d' ' -f1- | \
  peco --query "$LBUFFER"
}

### search a destination from cdr list and cd the destination
function peco-cdr() {
  local destination="$(peco-get-destination-from-cdr)"
  if [ -n "$destination" ]; then
    BUFFER="cd $destination"
    zle accept-line
  else
    zle reset-prompt
  fi
}
zle -N peco-cdr
bindkey '^x' peco-cdr
```

単純にawkで'/'の数と文字数を足して、ソートして、文字数の部分をcutしてからpecoに渡しているだけです。
処理速度が気になるところですが、自分の環境だとそこまで遅くないのでとりあえずこのままにしています。

これで上記の例だと以下のように表示されるので`~/a/`に行きやすくなりました！

```
~/a/
~/a/b/
~/a/b/e/
~/a/b/c/
~/a/b/c/d/
```

# 改良

このままだと消去したディレクトリも記録に残っているので、それが上位に来てしまい邪魔になってしまいます。
そこで下記のスクリプトで定期的に存在しないディレクトリをcdrの記録から除去します。

```
#!/bin/sh

CDRFILE=~/.chpwd-recent-dirs
TMPFILE="$CDRFILE-tmp"
# exec < $CDRFILE
while read line; do
  dir=$(echo $line | sed -e 's/\$//g')
  # sed -e 's/'\''/"/g' |sed -e 's/\$//g')
  eval test -d $dir
  if [ $? -eq 0 ]; then
    echo $line
  fi
done < $CDRFILE > $TMPFILE

mv -f $TMPFILE $CDRFILE
```

# 問題点
これの問題点というか不満は、文字数でソートしているので最初の画面に`/`,`~`,`/var`,'/etc'などで埋め尽くされる点です。
移動先の名前をある程度覚えていないと使えないです。
ただ、まあ文字数順＝ディレクトリ構造の順ともいえるので、
`us lo`とかで /usr/local/がヒットし、上の方は`/usr/local/`以下の子ディレクトリが表示されるのでそこまで不満では無いのですが…
マルチモニターでのOSXのアプリケーションスイッチャーの表示をコントロールする

OSXのアプリケーションスイッチャーはdockが表示されているモニターに表示されるので、アプリケーションスイッチャーを表示したい画面にdockを表示（マウスポインタをdockの位置に持っていく）すればいい。

dockを自動で隠す設定でも同様に一度dockを表示したモニタにアプリケーションスイッチャーが表示されるようになる。
ui-viewのスクロール位置を常に先頭にする



```js

//ui-viewのスクロール位置を常に先頭にする
app.config(['$provide', 
function ($provide) {
    $provide.decorator('$uiViewScroll', function ($delegate) {
        return function (uiViewElement) {
             window.scrollTo(0, 0);
        };
    });
}])

```
プログラマの考え方が○○本より(Python)

続いて
<h1>問題：横倒しの三角形を表示</h1>
>cout << "#"とcout<<"\n"の２つの出力文だけを使い、
ハッシュ記号（#)で横倒しの三角形を作るプログラムを書いてみよう


前回の問題まではワンライナーでかけていたのですが、
僕の現状では書き収まらないというか実行されてしまって
まとまらなかったのでファイルに書いて実行したのが以下になります。
（多分、本当の解答はもっとこうネストっていうんですか、うまく書けるのでしょうけど、
　できないm(_ _)m）

<h3>以下解答</h3>


```lang:test.py
#!/usr/bin/env python
#coding:utf-8

str = "####"
for i in range(1,5,1):
    slice = str[:i]
    print(slice)

for i in range(3,0,-1):
    slice = str[:i]
    print(slice)
・・・
$ python test.py
#
##
###
####
###
##
#
```

とても微妙な気がするんです。