OmniAICreator/Qiita-1.07M huggingface dataset:
DynamoDB Exportでハマったのでメモ


# DynamoDBのテーブルエクスポート
DynamoDBにはRedShift→S3のunloadに相当するような一括出力ポチー！ボタンは存在しません。
DynamoDBのデータをエクスポートする際はDataPoplineを介して、EMRクラスターが起動しS3へ出力されます。

この際、何度頑張ってもEMRクラスターがCANCELされてしまったので原因とメモ

# DataPiplineのコンソールで確認

CANCELされて最終的にERRORと表示されるだけで何が原因かよくわからなかった。
Edit Piplineでは特にERRORは出ていないはずなのに、クラスターが起動しない。

# EMRコンソールで確認する
クラスターが起動していないのでS3にログすら吐き出されていない。。。
困ったどうしよう。

と、思ったので一旦EMRのコンソールを確認することに

### 終了（エラー発生）No default VPC found
これが原因でした。
対象のアカウントでは諸般の事情でデフォルトVPCを削除していたため、DynamoDBのエクスポートで作成できるテンプレートのままだとEMRがデフォルトVPCに起動しようとするためエラーが出てしまっていたようです。

### SubnetIDの指定
今回のように、デフォルトVPCを削除している場合、SubnetIDを指定することで起動するクラスターをで指定したVPCに起動させることが出来ます。

#### ResourcesでSubnetIDを追加し、起動したいサブネットのidを記載します。

## 無事に起動
サブネットIDを指定することで無事、EMRクラスターが起動し、DynamoDBのデータをエクスポートすることができました。
地味にログすら出なくて地味にハマったので同じような症状の方はVPC等をご確認下さい。
サーバ変数について

#　自己紹介
皆さん初めまして。某学校で、ITの知識を勉強中の初心者プログラマーのわたのんです。将来はサーバサイドのエンジニアになるため、今精進しています。
以後お見知りおきを。得意言語はPHPです。今回はPHPでのサーバ変数についてです。
#サーバ変数
サーバー変数と言ってもたくさん種類があり、全部覚えるのは無理！！自分も全部覚えていない(笑)
なので、自分が使ってみて便利だったものだけ書かせていただきます。

*`1.$_SERVER["REQUEST_METHOD"]`*
　　　　　　　ページがリクエストされたときのリクエストメソッド名を返す。
*`2.$_SERVER["SERVER_PORT"]`*
　　　　　　　webサーバの通信ポートとして使用されているポート番号を返す。
*`3.$_SERVER["SERVER_NAME"]`*
　　　　　　　現在のサーバ名を返す。
*`4.$_SERVER["HTTP_HOST"]`*
              現在のリクエストのホスト、ヘッダーがあればその内容を返す。
*`5.$_SERVER["REQUEST_URI"]`*
　　　　　　　ページにアクセスする際に指定されたURI（ドメイン以下のパス）
*`6.$_SERVER["SCRIPT_FILENAME"]`*　　　　　　　
　　　　　　　現在実行されているスクリプトの*絶対パス*
*`7.$_SERVER["SCRIPT_NAME"]`*
　　　　　　　現在実行されているスクリプトの*パス*

特に自分が使うサーバ変数は１番です。
使う理由：フォームなどのサンクスページに重要な処理を記述した場合、直接アクセスされるとバグるからそれを防ぐため。

```php
:server.php
if($_SERVER["REQUEST_METHOD"]==="POST"){
         POSTの時の処理
}else{
    echo "不正なアクセス！！！";
}
```
他にもPOSTの時の処理などに分けて処理を行えるから使えると便利


#最後に
いかがでしたか？サーバ変数について:smiley:
これからも至らない点は多々あるかとは思いますがこれからもPHPについて投稿したいと思います。
間違っている点や改善点などありましたら連絡ください:bowtie:
PowerShellでAzureSQLDatabaseのポイントインタイム リストアでのDB復元

#PowershellでSQLDatabaseのリストア
###AzurePowershellのクラシックモード版
メモとして残しておきます
####まずはお決まりのやつ
```
Add-AzureAccount
Set-AzureSubscription -SubscriptionId "SubscriptionId"
```
####データベース情報取得
```
$SourceServerName = "serverName" 
$SourceDatabaseName = "DatabaseName"
$SourceDatabase = Get-AzureSqlDatabase -ServerName $SourceServerName -DatabaseName $SourceDatabaseName
```
####復元後のデータベース名を決める
```
$TargetDatabaseName = "xxxx" + (Get-Date -Format "_yyyyMMdd")
```
####リストア開始
```
Start-AzureSqlDatabaseRestore -SourceDatabase $SourceDatabase -TargetDatabaseName $TargetDatabaseName
```
cocos2dx-2.2.6のlibpng セキュリティバグ対応

# 背景

GooglePlayからlibpngのセキュリティ警告が来ていたので対応。

関連
- [Need to update libpng for v2.x because of security issue reported by Google Play #15871](https://github.com/cocos2d/cocos2d-x/issues/15871)

# 対応方法

- https://github.com/cocos2d/cocos2d-x/issues/15871#issuecomment-227968466

## 1. cocos2dxから提供されたthird_partyのlibpng/zlibをDLする

- https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/releases/tag/v2-deps-9

## 2. 中身を置換する

```shell-session
$ rm $COCOS2DX_ROOT/cocos2dx/platform/third_party/android/prebuilt/libpng
$ mv cocos2d-x-3rd-party-libs-bin/cocos2dx/platform/third_party/android/prebuilt/libpng $COCOS2DX_ROOT/cocos2dx/platform/third_party/android/prebuilt/
$ mv cocos2d-x-3rd-party-libs-bin/cocos2dx/platform/third_party/android/prebuilt/zlib $COCOS2DX_ROOT/cocos2dx/platform/third_party/android/prebuilt/
```

## 3. Android.mkを書き換える

本体のAndroidNDK側のzlibを利用しないようにする設定 & zlibのターゲット追加を行う

```shell-session
$ curl -O https://raw.githubusercontent.com/cocos2d/cocos2d-x/v2/cocos2dx/Android.mk
$ cp Android.mk $COCOS2DX_ROOT/cocos2dx/Android.mk
```

diffはこんな感じ

- https://github.com/cocos2d/cocos2d-x/pull/15938/commits/d5c0b596a5f816274aecd3484abad60eb784d4a5
squid3を使ってubuntuでBasic認証つきサーバー

テスト用にぱっとBasic認証つきのサーバーを設置する必要があったため、メモ的に残しておきます。


#動作確認環境
Ubuntu 14.04  64bit版

#squid3をインストールする
```
sudo apt-get install squid
```

#パスワードファイルの作成
Apacheのツールを利用し、Basic認証用のパスワードファイルを作成する。

```
sudo apt-get install apache2-utils
```
↓  (ユーザ："proxy", パスワード："pass"とする場合)

```
sudo htpasswd -c /etc/squid/.passwd proxy
New password: pass
Re-type new password: pass
```

#squid3の設定
以下のファイルを編集する。
/etc/squid3/squid.conf

こんな感じに設定した。
IPは環境によって変更が必要そう。
Windowsアップデートの設定など記載してみたが、未確認。
（ひとまず認証つきプロキシとしては動作確認した。）

```:/etc/squid3/squid.conf

#acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.1.10.1/255


acl winupdate dstdomain .microsoft.com .windowsupdate.com
acl SSL_ports port 443
acl Safe_ports port 80                # http
acl Safe_ports port 1025-65535        # unregistered ports
acl Safe_ports port 280                # http-mgmt
acl Safe_ports port 488                # gss-http
acl Safe_ports port 591                # filemaker
acl Safe_ports port 777                # multiling http
acl CONNECT method CONNECT


#######################################################################
#　認証関連
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/.passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
acl password proxy_auth REQUIRED
http_access allow password
#######################################################################

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access allow localhost manager
http_access allow winupdate
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow localnet
http_access deny all

# Squid normally listens to port 3128
http_port 8080


cache_dir ufs /var/spool/squid3 600 16 256
coredump_dir /var/spool/squid3

refresh_pattern ^ftp:                1440        20%        10080
refresh_pattern ^gopher:        1440        0%        1440
refresh_pattern -i (/cgi-bin/|\?) 0        0%        0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .                0        20%        4320

forwarded_for off


request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

access_log /var/log/squid3/access.log common

cache_mem 256 MB

```



#設定の反映

squid3を再起動して設定を反映する。

```
sudo service squid3 restart
```
AWS EC2でCloudWatch用にメモリ使用率を取得しようとして躓いたメモ

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html

ここを見てやってみたけど、IAM無いよって言われて悩んだ。
OS: CentOS7

```
ERROR: No IAM role is associated with this EC2 instance.
```

`awscreds.template` 変更したのにおかしいなと思ったけど、これはテンプレートで、
実際に使う場合は `awscreds.conf` のファイル名で作らないといけないみたい。

```perl:CloudWatchClient.pm
  if (!$aws_credential_file) {
    my $conf_file = &File::Basename::dirname($0) . '/awscreds.conf' ;
    if (-e $conf_file) {
      $aws_credential_file = $conf_file;
    }
  }
```

なので、以下のようにしてコピーしてあげれば動く。

```bash
cp awscreds.template awscreds.conf
```

ちなみに、設定ファイルを使わないなら `--aws-access-key-id` と `--aws-secret-key` を指定してあげても動く。

```bash
./mon-put-instance-data.pl --mem-util --verify --verbose --aws-access-key-id アクセスキー --aws-secret-key シークレットキー
```
Postgresで大量のシードデータ、ダミーデータを生成する方法

## シードデータ

すでに何かしらのデータを大量に保持している場合、
一個ずつ`INSERT`を行うよりも、`COPY`クエリを実行したほうが早いです。

```postgres:sql
-INSERT INTO hoge(name, huga) VALUES ('name1', 1);
-INSERT INTO hoge(name, huga) VALUES ('name2', 2);

+COPY hoge (id, name, huga) FROM stdin;
+1  name1     1
+2  name2     2
+\.
```

stdin;以下にタブ区切りorカンマ区切りで指定してあげるだけです。
最後に`\.`を入れるのを忘れずに。

## ダミーデータ

データが何でもいいのであれば、すでにinsertしているデータを再挿入することで爆速でデータ増殖が可能。

```postgres:sql
INSERT INTO hoge (id, huga) SELECT huga FROM hoge;
```
IDがprimary keyの場合は、IDの再導入を行うことができません。(auto incrementであれば省略可能)
2016年の夏時間終了に向けての確認事項。


*注意喚起が、ヨーロッパ向けの夏時間終了のタイミングに間に合わず、申し訳ありません。*

StatusPageのDatadogのページにも出ていますが、[Daylight Saving Time]
(https://status.datadoghq.com/incidents/cgsl2ph49spw)終了に向け、v5.5.2以前のDatdog Agentを使っているユーザー向けに注意喚起が出ています。

Datadog Agent v5.5.2が2105年10月30日にリリースされていますので、それ以前にDatadog Agentをインストールし、以降Agentの更新をしていないユーザーは、次のステップに従って影響度合いの確認と必要に応じて対処の作業をすることをお勧めします。

## 夏時間終了の影響が出た場合に想定される症状

- 夏時間終了の切り替えに関わる時間帯(1時間分)のデータが届いていないことになります。
- グラフに、その時間帯のデータが表示されなくなります。
- データが存在しないことにより、誤ったアラートが発生する可能性があります。


## 自分の環境が夏時間終了の影響を受けるかどうかを判定するために


### 影響が出ない環境:

下記の条件に合致している環境では、夏時間終了に伴うデータのキャップが発生することは有りません。

- サーバーのtime-zoneにUTCを設定している。
- サーバーに設定しているtime-zoneには、夏時間がない。
- サーバーにインストールしているDatadog Agentがv5.2.2か、それより新しい。



#### Linuxの場合の確認方法:

- コンソールより`Date`コマンド実行してください。"Sat Oct 29 22:00:56 UTC 2016"や"Sat Oct 29 22:00:56 JST 2016"の場合は、影響を受けることはありません。もしも"Sat Oct 29 18:09:09 EDT 2016"のように、夏時間になっている場合は、影響を受けルことになります。
- `/etc/init.d/datadog-agent info`を実行し、Datadog Agentのバージョンを確認する。

#### Windows:

- タスクバーの時間帯を確認する。
- Startupメニューより、Datadog Agent Managerを実行し、`Logs and Status` --> `Agent Status`を実行し、Datadog Agentのバージョンを確認する。

## 夏時間終了の影響を受ける環境の場合の対応方法

以下の2つ方法で、グラフのギャップと誤ったアラートの発生を防ぐことができます。

1. Datadog Agentをv5.5.2か、それより新しいバージョンに更新する。(2016/10/29日現在の最新バージョン`v5.9.1`へ更新することをお勧めします。)
2. DST終了直後に、Datadog Agentが再起動するようにサーバーに設定するか、手動で再起動の作業をする。

注) 尚、上記の作業をしなかったとしても、Datadog Agent自体は、メトリクスデーターを送信し続けます。影響を受ける環境であっても、起こりうる症状を理解した上で、判断をすることをお勧めします。
GAE/Go で HTTP Handler のテストを書く

# はじめに

* GAE/Go 環境の JWT 認証をするアプリケーションで HTTP Handler のテストを書いてみた

# 通常の httptest との違い

* 気をつけるのは2点だけで後は普通の httptest みたいなのりでかける

## リクエストは `google.golang.org/appengine/aetest` パッケージを使って作成する

* リクエストの作成から実行までは以下の流れになる
* リクエストから生成したコンテキストを使って Datastore へのアクセスなどが行える

```go
	// aetest (App Engine Test) のインスタンス作成
  // テスト用の環境が用意される
	opt := aetest.Options{StronglyConsistentDatastore: true}
	instance, err := aetest.NewInstance(&opt)
	if err != nil {
		t.Fatalf("Failed to create aetest instance: %v", err)
	}
	defer instance.Close()

	// aetest インスタンスからリクエストの作成
	req, _ := instance.NewRequest("POST", "/registration", strings.NewReader(`{"username":"user1", "password":"pass1"}`))
	req.Header.Set("Content-Type", "application/json")

	// レスポンスの作成
	res := httptest.NewRecorder()

	// コンテキストの取得
	ctx := appengine.NewContext(req)

	// リクエストの実行
	RegistrationHandler(res, req)
``` 

## テストの実行は `goapp test` を使う

```
# handler ディレクトリ以下のテストを実行する場合
goapp test ./handler
```

# 全文

* テスト全文は[こちら](https://github.com/nirasan/gae-jwt/blob/master/handler/handler_test.go)

# 参考ページ

* https://cloud.google.com/appengine/docs/go/tools/localunittesting/
* http://nowsprinting.hatenablog.com/entry/2016/10/30/235459#f-84810a1c
* http://qiita.com/sinmetal/items/79458af94e35d7523a50
Chromeのlist-style: insideの挙動が変わった気がする件

最近のChromeのバージョン(54.0.2840.71よりもちょっと前?)で、リスト要素へ`list-style: inside`を適用した時の挙動が変わったような気がする。
この箇条書きのマークとテキストの間は`text-indent: -1em`などをしても詰まらない。

![image](https://qiita-image-store.s3.amazonaws.com/0/48238/a4e6ecbc-8c70-4311-de2a-e09d6efb4f97.png)
スクショ元：http://www.htmq.com/style/list-style-position.shtml

Chromeのバグなのか、Chromeの実装の方が仕様に忠実なのかはChangelogやCSSの仕様書を見てみないと分からない。今度見てみよう…。
Android Studio 初體驗心得 - 版本控管

最近開始練習寫 Android ，
做了一個嘗試：

> 在 Android Studio 進行 Git commit

## 進行 commit

於是就碰到問題了，也上網查了一下，
發現 Android Studio （也就是 JetBrains 系的 IDE），
存在著一樣的問題，
他們用自己的方式讓使用者去進行版本控制，
讓熟悉 Git 操作方式的我覺得不是很直覺，
進入門檻有點高 ... :sweat_drops: 

我覺得對新手比較糟糕的一點是，
當新手在搭配 Git 開發的時候，清單裡面很多不是和 Git 有相同概念的字眼，
於是在 Git 不熟悉的情形之下，就會很難入手，或是很容易犯錯。

所以 ...

決定還是透過 SourceTree 或是 command line interface 來處理版本控制這塊，
至少比較清楚我自己在做什麼事 :100:

## 編輯器

在程式碼編輯的視窗，
Android Studio 會幫我們上色提示哪邊有更改過，
可以即時觀看變化，
這個我覺得就做得還不錯 :100: 

## 結語

恩 ...

我其實本來就不是「使用 IDE 附帶版控」派的，
在用 Xcode 的時候，我也都是搭配 command line interface + SourceTree 搭配使用，
幾乎沒有在用 Xcode 送的版控工具～

這點來到 Android Studio 看來也是不會變的 :laughing:
rails で redirect_to 済かどうかを取得する

以下のように判定します。

```rb:controller.rb
# redirect_to 済であれば、終了する。
return if response_body
```

※ Rails 3.2 の AbstractController::DoubleRenderError ではこのように判定していました。

なぜこんな判定が必要になったかというと、とあるコードにてAbstractController::DoubleRenderError が発生しました。原因は Controller の public method から別の public method を読んでおり、両方の method で redirect_to が設定されてしまうことでした。

public method が public method を呼んでいる時点で相当に行儀の悪いコードと考えますが、最少工数でこれを発生しなくするために、 redirect_to 済であるか判定して、エラーの発生を抑えています。
Pathnameライブラリのglobメソッドをインスタンスメソッドでも使いたい

`glob`便利ですよね。特定のディレクトリ配下の一括処理。昔は`Dir.glob`使ってたんですが、`Pathname`の便利さを知ってからは`Pathname.glob`ばかり使っています。

その`glob`がクラスメソッドとしてしか用意されてないのでインスタンスメソッドとして使えるようにしました。

```.rb
class Pathname
  def glob(string)
    Pathname.glob(self.join(string).to_s)
  end
end
```

### 使い方

```.rb
path_name = Pathname.new('/var/foo')
path_name.glob('*.txt')
# Pathname.glob('/var/foo/*.txt') と等価
```

便利！！
Android Library ProjectでのSPI(Service Provider Interface)


ほぼメモ的な内容。
ライブラリプロジェクトを分割し、かつライブラリAに対し、ライブラリBが
プラグイン的に機能を提供する手段の一つとして検討した際のメモ。
あんまりAndroid自体は関係ない。

# インターフェースとかの定義

まずサービス(Androidのサービスではないです)を定義するためにインターフェースとかをきる。

```java:Service.java
package com.hoge;

public interface Service {
	void onLoaded();
}
```

# 実装クラスを用意

機能提供側で実装クラスを作成

```java:ServiceImpl.java
package com.hoge.impl;

public class ServiceImpl implements Service {
	@Override
	public void onLoaded() {
		Log.d("test", "loaded " + getClass().getName());
	}
}
```


# META-INFを用意

src/{buildType}/resources/META-INF/services 以下に
サービス(インターフェース側)のFQNでファイルを生成

例: src/main/resources/META-INF/services/com.hoge.Service

実装クラスを提供するものがライブラリプロジェクトの場合は
これでaarファイルを生成した際にMETA-INFがjarファイルに含まれる。

# 上記ファイルにロードするクラスを記述する

上で作った src/main/resources/META-INF/services/com.hoge.Service に
ロードするクラスをFQNで記述する

```java:com.hoge.Service
com.hoge.impl.ServiceImpl
```

# クラスのロード

ServiceLoaderを使用してロード。(APIレベル9以降。流石に2.2とか対応している人はいないと信じたい)
以下はとりあえず定義されているやつをぐるぐるロードする例。

```java

ServiceLoader<Service> loader = ServiceLoader.load(Service.class);
for (Service service : loader) { // loaderからはロードされたクラスへのiteratorが取得できる。
	service.onLoaded(); // この例ではServiceImplの実体がnewされ渡される
}
```
YYYYMMが文字列で入ったカラムに対して、Nヵ月後をSQLで取得する

いわゆる自分用メモ。

# やりたいこと
yyyymmが日付ではなく文字列で入ったカラムから、その何ヶ月前後をSQLで取得したい。


### 例テーブル：tmp_qiita

| ID    | register_yyyymm  |
|:------|-----------------:|
|a001   |      201605      |
|a002   |      201606      |
|a003   |      201602      |
|a004   |      201601      |


## MySQLの場合

```
select ID , DATE_FORMAT(cast(concat( register_yyyymm,'01') as date) + interval 1 month ,'%Y%m')  from tmp_qiita;
```

## PostgreSQLの場合（実際にはRedshiftを利用）
```
select ID ,to_char( dateadd(month, 1, cast( to_date(register_yyyymm::text , 'YYYYMMDD') as date)) ,'YYYYMM') from tmp_qiita ;
```

若干試行錯誤に寄っているため、もっとスマートな方法はありそう。
Android BLE メモ　スキャンまで (API level 21対応版)

AndroidでBLEを動作させるための備忘録として記載します。
自分で理解できることを優先していますので、不足分は補完してくださいませ。。。


# マニュフェストへのパーミッション追加

AndroidManifestに”BLE使わせてくださいね”的なものを追加します。
位置に関する"ACCESS_COARSE_LOCATION"も必要となるので忘れずに。

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature android:name="android.hardware.bluetooth" />
```


# インポート

BLEに必要なあれこれをimportします。

``` java
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
```

# 変数宣言

BLE通信をするクラスのメンバとして追加。

```java
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mBluetoothLeScanner;
private ScanCallback mScanCallback;
```

# BluettoothAdapterの取得

```java
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

// Bluetoothサポートしているかのチェック
if (mBluetoothAdapter == null) {
    Toast.makeText(this, ”Bluetooth未サポート”, Toast.LENGTH_SHORT).show();
    finish();
    return;
}
```

# BluetoothLeScannerの取得

``` java
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
```

# コールバック

コールバック関数と動作を作成する。

```java
private ScanCallback initCallbacks() {
    return new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);

            // デバイスが見つかった！
            if (result != null && result.getDevice() != null) {
                // リストに追加などなどの処理をおこなう
                //addDevice(result.getDevice(), result.getRssi());
            }
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            super.onBatchScanResults(results);
        }

        @Override
        public void onScanFailed(int errorCode) {
            super.onScanFailed(errorCode);
        }
    };
}
```

onCreateなどでコールバックをメンバに入れておく

```java
mScanCallback = initCallbacks();
```


# BLEスキャンの開始／停止

## スキャンの開始
``` java
mBluetoothLeScanner.startScan(mScanCallback);
```


## スキャンの停止
``` java
mBluetoothLeScanner.stopScan(mScanCallback);
```

以上。
cURL からC言語のプログラム・ソースを生成してみた

#背景
CのプログラムでWebサービスのリクエストを発行するプログラムを作りたかったのですが、一から作るのが面倒だったので、いろいろと調べてたらcURLの機能でCのソースを生成できるらしく、やってみました。

#手順
①ソースの生成 
(curlでリクエストを発行。-libcurlオプションを付加することで実行したリクエスト内容をCのソースとして生成）


```
curl -H "Content-Type: text/xml; charset=utf-8" http://ipaddr:port_number/soap/base64t -X POST -d @base64_soap.txt　--libcurl post_base64.c
```

②生成したソースを確認 （こんな感じになります）

```
/********* Sample code generated by the curl command line tool **********
 * All curl_easy_setopt() options are documented at:
 * http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
 ************************************************************************/
#include <curl/curl.h>

int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd;
  struct curl_slist *slist1;

  slist1 = NULL;
  slist1 = curl_slist_append(slist1, "Content-Type: text/xml; charset=utf-8");

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_URL, "http://ipaddr:port_number/soap/base64t");
  curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" ><SOAP-ENV:Body><BASE64TOperation xmlns=\"http://www.BASE64T.BASE64T.Request.com\"><comm_args><debug_mode></debug_mode></comm_args><comm_data><strelem_0001>YWJjZGVmZw=B</strelem_0001></comm_data></BASE64TOperation></SOAP-ENV:Body></SOAP-ENV:Envelope>");
  curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)326);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.29.0");
  curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "/root/.ssh/known_hosts");
  curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA set to a objectpointer
  CURLOPT_WRITEFUNCTION set to a functionpointer
  CURLOPT_READDATA set to a objectpointer
  CURLOPT_READFUNCTION set to a functionpointer
  CURLOPT_SEEKDATA set to a objectpointer
  CURLOPT_SEEKFUNCTION set to a functionpointer
  CURLOPT_ERRORBUFFER set to a objectpointer
  CURLOPT_STDERR set to a objectpointer
  CURLOPT_HEADERFUNCTION set to a functionpointer
  CURLOPT_HEADERDATA set to a objectpointer

  */

  ret = curl_easy_perform(hnd);

  curl_easy_cleanup(hnd);
  hnd = NULL;
  curl_slist_free_all(slist1);
  slist1 = NULL;

  return (int)ret;
}
/**** End of sample code ****/
```

③あとはこのソースをcurlのライブラリーをリンクさせてコンパイルすれば、curlで実行した内容がCのプログラムから実行できます。
※gccつかいました。

```
# gcc post_base64.c -o post_base64 -lcurl
# ls | grep post
post_base64
post_base64.c
```



#おわりに
今回、CentOS上でためしてみました。
また、cURLでリクエストを発行する際、SOAPメッセージを別ファイル(@base64_soap.txt)を用意しています。
JSONリクエストとかでCソースを生成したい場合、呼び出すサービスのURLと、ヘッダー部分を-H "Content-Type: application/json; charset=UTF-8"に変えて、JSON形式のデータを別ファイルで用意してあげればできるはずです。
Postfixのメールキューを確認、削除する方法

AWSから誤って大量のメールを（自分に）送信してしまったが、Postfixのキューにたまってた。

### 引用および参考
http://jehupc.exblog.jp/19944472/

### キューの確認
```
$ sudo postqueue -p
```

### キューの削除
```
$ sudo postsuper -d QUEUE_ID
```

### キューの全削除
```
$ sudo postsuper -d ALL
```

### キューの強制送信
```
$ sudo postfix flush
```
横スクロールナビゲーションを実装する3つの方法

# 実装方法3パターン

横スクロールを実装する方法は以下の3パターンが主流だと思う。
1, 親要素をdisplay: flexにする
2, 子要素をdisplay: table-cellにする
3, 子要素をdisplay: inline-blockにする

それぞれの実装方法と気をつけるところを書いていく。

HTMLはこういったものを想定

```
<ul class="gnav">
  <li class="item">gnav1</li>
  <li class="item">gnav2</li>
  <li class="item">gnav3</li>
  <li class="item">gnav4</li>
  <li class="item">gnav5</li>
</ul>
```

ちなみにどのパターンも親要素(ul)に ```overflow-x: auto; ``` または ``` overflow-x: scroll; ``` をつける必要がある

## demo

[demoページ](https://sottar.github.io/horizontal_scroll_demo/index)

## 1, 親要素をdisplay: flexにする

### 実装方法
CSS3で導入されたdisplay: flexを使用する方法。
親要素(ul)に``` display: flex ```をつけると、子要素 (li) が折り返されずに横に続いていく。

ちなみに``` flex-wrap ```の初期値は``` no-wrap ```なので、``` display: flex ```のみ設定すれば良い。

### 注意点
ブラウザ対応が面倒くさそうな印象があったのですが、
ie以外では対応しているようで、ie10以降であればプレフィックスをつければ対応可能なよう。
cf: http://caniuse.com/#search=flex

スマホの案件とか、新しいプロパティ使いたい人はこのパターン。

[コード <i class="fa fa-github" aria-hidden="true"></i>](https://github.com/sottar/horizontal_scroll_demo/blob/master/parts/_sample_flex.scss)

## 2, 子要素をdisplay: table-cellにする
### 実装方法

これが一番安定の使い方だと思う。
子要素(li)を ``` display: table-cell ``` にするだけで横スクロールを実装できる

レガシーブラウザに対応しないといけない場合か、
どれを使うか迷ったらこれ。

[コード <i class="fa fa-github" aria-hidden="true"></i>](https://github.com/sottar/horizontal_scroll_demo/blob/master/parts/_sample_table-cell.scss)

## 3, 子要素をdisplay: inline-blockにする

### 実装方法
子要素を ``` display: inline-block ``` にすると横並びにはなる。
### 注意点
``` display: inline-block ```にすると子要素と子要素の間にスペースができてしまう。
それを直すには、親要素を ``` font-size:0 ``` にして、子要素で表示したいfont-sizeを指定すると解消できる。

[コード <i class="fa fa-github" aria-hidden="true"></i>](https://github.com/sottar/horizontal_scroll_demo/blob/master/parts/_sample_inline-block.scss)

## スクロールバーを消したい

横スクロールの実装方法と直接は関係ありませんが、スクロールバーを消したいという要望が出てくるケースは多いと思うので念のため。

以下の記事がとても参考になります。
[Appleに学ぶ、横スクロールナビを組む時のCSSメモ](http://qiita.com/volkuwabara/items/412a2e48d813f2f52537)

## まとめ
基本的には2番の方法を使うのがいいと思います。

[demoページ](https://sottar.github.io/horizontal_scroll_demo/index)
[コード <i class="fa fa-github" aria-hidden="true"></i>](https://github.com/sottar/horizontal_scroll_demo)


もっと良い実装方法があるという方はご教授いただけると幸いです。
Akka HTTP のミニマルストローク Hello World

# はじめに
Akka HTTP を使ってミニマルストローク Hello World をやったときの記録です。
環境は前回の [ScalikeJDBC](http://qiita.com/yutaka2487/items/cee20e4684b8937e88c9) と同じく、以下の通り。

+ JDK 8.0
+ Scala 2.11.8
+ sbt 0.13.12

# build.sbt を作る
[Maven Repositry](https://mvnrepository.com/) で Akka HTTP を検索し sbt 向けの記述をコピペします。
また scalaVersion を端折ったら Scala 2.10 向けにビルドされてしまう（？）ようで
実行時に ClassNotFoundException が発生しますのでご注意を・・

```scala:build.sbt
scalaVersion := "2.11.8"

// https://mvnrepository.com/artifact/com.typesafe.akka/akka-http-experimental_2.11
libraryDependencies += "com.typesafe.akka" % "akka-http-experimental_2.11" % "2.4.11"
```

# Hello World
これ以上どこかを削ったら機能しなくなるミニマルな Hello World がこちらです。
プロジェクトフォルダで sbt を実行し、ブラウザで http://localhost:8080/ にアクセスしてみましょう。

```scala:HelloAkkaHttp.scala
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._

object HelloAkkaHttp extends App {

  implicit val actorSystem = ActorSystem()
  implicit val actorMaterializer = ActorMaterializer()

  val route =
    pathSingleSlash {
      get {
        complete {
          "Hello World"
        }
      }
    }

  Http().bindAndHandle(route, "localhost", 8080)

}
```

# この後は
このページの例が動いたら、あらためて

+ [Akka HTTP — Akka Documentation](http://doc.akka.io/docs/akka/2.4.2/scala/http/index.html)
+ [Akka HTTP サンプルコード (Scala)](https://www.qoosky.io/techs/a98142497c) 

等をよく読むのが良いのではないかと思います。
CentOS7で"locale: Cannot set LC_CTYPE to default locale: No such file or directory"

# 概要
macでvagrantを起動すると、下記のエラーが出る。
このままだと、pythonのanaconda3系のインストールが失敗してしまうので、対処したメモ。OSはCentOS7。

### vagrantログイン時のエラー内容

```
Welcome to your Vagrant-built virtual machine.
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```

### localeコマンドの実行時のエラー内容

```
[vagrant@localhost ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
```

## 対処法

下記コマンドでlocaleコマンド実行時のエラーは出なくなり、anacondaのインストールもできるようになった。

- 日本語 + UTF-8にする場合

```
$ localectl set-locale LANG=ja_JP.utf8
$ echo "export LC_CTYPE='ja_JP.UTF-8'" >> ~/.bash_profile;
```

- 英語 + UTF-8にする場合

```
$ localectl set-locale LANG=en_US.utf8
$ echo "export LC_CTYPE='en_US.UTF-8'" >> ~/.bash_profile;
```

```
$ source ~/.bash_profile
```

### 時計を合わせる

- 日本時間にする

```
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
```

- 時刻を手動で合わせる

```
$ sudo date MMDDhhmmYYYY
```

[参考]
http://weblabo.oscasierra.net/vagrant-centos6-japanize/
activatorでの起動時にプロキシを通さないFQDN,IPアドレスを指定する

# 実行コマンド
`activator run -Dhttp.nonProxyHosts="localhost|127.0.0.1"`

# 経緯
`activator run` のときに、
* JAVA_OPTS
* `~/.activator/activatorconfig.txt`
のどちらに `-Dhttp.nonProxyHosts="localhost|127.0.0.1"` を設定しても反映されなかったので。

# 備考
* パイプ（`|`）区切りで複数設定可能
    * 複数設定の場合、コマンドとして解釈されないために、ダブルクオーテーション（`"`）でくくる必要あり
テキスト処理とSQLの比較

[広瀬雄二「シェルスクリプト+データベース活用テクニック」](http://amzn.to/2f3CLlC)に掲載されていたテキスト処理とSQLとの比較をiMacでやってみました。SQLite3が高速であり，データベースが有利であるという結論は同じです。広瀬さんのマシンはXeon，こちらはi7ですが，SSDの効果が大きいようで数十倍速い結果となりました。OSにプレインストールされているBSDコマンドはGNUコマンドより，かなり遅い結果となりました。mawkはgawkよりも速いです。

* プロセッサ: 4 GHz Intel Core i7
* メモリ: 32 GB 1867 MHz DDR3
* ストレージ: 1TB SSD
* OS: OS X El Capitan 10.11.6

# 読み取り性能

## GNU grep

```
$ grep --version | head -1
grep (GNU grep) 2.26
$ time grep '東泉町' large.csv | colrm 80
,e204,998  ,9980013,ﾔﾏｶﾞﾀｹﾝ,ｻｶﾀｼ,ﾋｶﾞｼｲｽﾞﾐﾁｮｳ,山形県,酒田市,東泉町,0,0,1,0,0,0
,0202,836  ,8360821,ﾌｸｵｶｹﾝ,ｵｵﾑﾀｼ,ﾋｶﾞｼｲｽﾞﾐﾏﾁ,福岡県,大牟田市,東泉町,0,0,0,0,0,0

real  0m0.503s
user  0m0.244s
sys 0m0.230s
```

おっ，grep結構速い。

## BSD grep

```
$ /usr/bin/grep --version
grep (BSD grep) 2.5.1-FreeBSD
$ time /usr/bin/grep '東泉町' large.csv | colrm 80
,e204,998  ,9980013,ﾔﾏｶﾞﾀｹﾝ,ｻｶﾀｼ,ﾋｶﾞｼｲｽﾞﾐﾁｮｳ,山形県,酒田市,東泉町,0,0,1,0,0,0
,0202,836  ,8360821,ﾌｸｵｶｹﾝ,ｵｵﾑﾀｼ,ﾋｶﾞｼｲｽﾞﾐﾏﾁ,福岡県,大牟田市,東泉町,0,0,0,0,0,0

real  0m19.969s
user  0m19.590s
sys 0m0.341s
```

BSD grepはかなり遅い。

## SQLite3

```
$ sqlite3 --version
3.15.0 2016-10-14 10:20:30 707875582fcba352b4906a595ad89198d84711d8
$ time sqlite3 zip.sq3 "select * from zip where town like '%東泉町%';" | colrm 80
|e204|998  |9980013|ﾔﾏｶﾞﾀｹﾝ|ｻｶﾀｼ|ﾋｶﾞｼｲｽﾞﾐﾁｮｳ|山形県|酒田市|東泉町|0|0|1|0|0|0
|0202|836  |8360821|ﾌｸｵｶｹﾝ|ｵｵﾑﾀｼ|ﾋｶﾞｼｲｽﾞﾐﾏﾁ|福岡県|大牟田市|東泉町|0|0|0|0|0|0

real  0m0.056s
user  0m0.021s
sys 0m0.025s
```

grepよりも一桁速い。

## Gawk

```
$ gawk --version | head -1
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.1)
$ time gawk -F, '$9 ~ /東泉町/{print $4, $5, $6}' large.csv
ﾔﾏｶﾞﾀｹﾝ ｻｶﾀｼ ﾋｶﾞｼｲｽﾞﾐﾁｮｳ
ﾌｸｵｶｹﾝ ｵｵﾑﾀｼ ﾋｶﾞｼｲｽﾞﾐﾏﾁ

real  0m0.824s
user  0m0.558s
sys 0m0.220s
```

Gawkも結構速い。

## mawk

```
$ port installed mawk
The following ports are currently installed:
  mawk @1.3.4-20160615_0 (active)
$ time mawk -F, '$9 ~ /東泉町/{print $4, $5, $6}' large.csv
ﾔﾏｶﾞﾀｹﾝ ｻｶﾀｼ ﾋｶﾞｼｲｽﾞﾐﾁｮｳ
ﾌｸｵｶｹﾝ ｵｵﾑﾀｼ ﾋｶﾞｼｲｽﾞﾐﾏﾁ

real  0m0.461s
user  0m0.169s
sys 0m0.264s
```

mawkはGawkの半分近い。

## awk

```
$ awk --version
awk version 20070501
$ time /usr/bin/awk -F, '$9 ~ /東泉町/{print $4, $5, $6}' large.csv
ﾔﾏｶﾞﾀｹﾝ ｻｶﾀｼ ﾋｶﾞｼｲｽﾞﾐﾁｮｳ
ﾌｸｵｶｹﾝ ｵｵﾑﾀｼ ﾋｶﾞｼｲｽﾞﾐﾏﾁ

real  0m49.059s
user  0m48.347s
sys 0m0.552s
```

OSのawkはかなり遅い。

# データの更新

## cp

```
$ time cp large.csv large1.csv 

real  0m1.139s
user  0m0.002s
sys 0m0.646s
```

1.5GBは1秒そこそこでコピーできる。

## GNU sed

```
$ gsed --version | head -1
gsed (GNU sed) 4.2.2
$ time gsed -i '/東泉町/s/,[^,]*$/,yes/' large.csv

real  0m2.949s
user  0m1.069s
sys 0m1.802s
```

確かにgsedはコピーの2倍強。

## SQLite3

### インデックスなし

```
$ time sqlite3 zip.sq3 "update zip set random='yes' where town like '%東泉町%';"

real  0m0.059s
user  0m0.020s
sys 0m0.025s
```

gsedよりかなり有利。

### インデックスあり

```
$ sqlite3 zip.sq3 "create index zip_town on zip(town);"
$ time sqlite3 zip.sq3 "update zip set random='yes' where town='東泉町';"

real  0m0.017s
user  0m0.001s
sys 0m0.003s
```

10倍まで速くはならなかった。
Windows+PostgreSQL 外部からのアクセスを可能にする

## 設定ファイル編集

- C:\Program Files\PostgreSQL\9.6\data\pg_hba.conf

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
```

この下に接続したいIPを追加する。

```
host    all             all             192.168.1.1/32          md5
```

/32 はCIDR表記。単一ホストだけを指定する場合は /32 でよい。
書き換えたらPostgreSQLを再起動する。

## ポート開放
デフォルトでは 5432 を使用することになっているので、Windows側でそのポートを開放する。
http://symfoware.blog68.fc2.com/blog-entry-1231.html
【CSS3】サイズがわからない画像の縦横比を維持したまま表示する方法【object-fit】

サイズがわからない画像の縦横比を維持したまま画面に表示したいということは、よくあると思います。
特に、画像によってサイズも縦横比も異なるため、幅・高さのどちらも指定するのは難しいという状況だと、困ってしまいますね。

こういうときは、大抵CSSでmax-widthやmax-heightなどを指定し、最大の幅・高さを指定し、幅・高さのどちらかを固定サイズにすることで、縦横比が崩れることを避けることができます。

しかし、とある事情で、画像のwidthとheightには何らかの数字を指定しなければならないということもあると思います。
（例えば[AMP対応](https://www.ampproject.org/docs/guides/responsive/control_layout)とか…）

固定のサイズであればそれを指定すれば良いのですが、画像によって縦横比がばらばらなので、無理やり固定サイズにすると下記のように縦横比が崩れてしまいます。

```html
<img src="http://hogehoge.jpg" width="700" height="300">
```

<img width="500" alt="スクリーンショット 2016-10-28 20.26.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/42852/ec7c32a4-2859-38a3-e0cd-be8835c7893d.png">


解決方法として

* PHPの`getimagesize()`等で画像のサイズを取得し、その値をwidth, heightに入れる

というのも考えられるのですが、アクセスするたびに計算が発生するのは、表示までに時間が掛かってしまうため、あまりよくありません。

そこで調べたところ、CSS3のプロパティの「`object-fit`」が使えることがわかりました。
「`object-fit`」とは、主に画像の縦横比に作用して、表示領域に対しての画像の大きさを変更する場合に使うそうです。

CSSでimg要素に対して、`object-fit: contain;`を指定すると、画像の縦横比を保ちながら、全体がそのオブジェクトに収まるようにリサイズされます。

例えば、下記のimgに対してCSSを指定すると…
※わかりやすく背景に色付けてます

```html
<img src="http://hogehoge.jpg" width="700" height="300">
```

```css

img{
  background-color: gray;
  width: 150px; height: 150px;
  object-fit: contain;
}
```

`width="700" height="300"`を指定して縦横比が崩れていたさっきの画像が、object-fitにより枠内に収まるようリサイズされます！

<img width="500" alt="スクリーンショット 2016-10-28 20.26.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/42852/6c9e4d90-890d-e618-699a-0ec1e0e97588.png">

ただこのプロパティはCSS3から追加されたものであり、ChromeやFireFoxなどのモダンブラウザでしか動作対応していないため、対象とする端末のブラウザできちんと動作確認する必要があります。
http://caniuse.com/#feat=object-fit


参考記事
http://on-ze.com/archives/2296
https://dev.opera.com/articles/ja/css3-object-fit-object-position/
ALBでのEC2へのリクエストルーティングの設定

Classic Load Balancer（以下CLB）からApplication Load Balancer（以下ALB）へ移行しようと思ったところ、EC2へのリクエストルーティングの設定で少し詰まったので投稿します。

設定したいこととしては下記の2点でした。

+ HTTP(80番)接続されたら、EC2にも80番で接続する。
+ HTTPS(443番)接続されたら、EC2には8080番で接続する。

なお、EC2内のApacheの設定で、HTTP（80番）接続されたらHTTPSへリダイレクト、
HTTPS(8080番)接続されたらサイトを表示、というように設定してあります。

## 詰まったところ
詰まった点は、ALBからEC2へのリクエスト時のリスナーをどこで設定するかわからなくなってしまったことでした。

CLBで設定していた時はこういう状態でした。
![スクリーンショット 2016-10-31 8.08.42.png](https://qiita-image-store.s3.amazonaws.com/0/77692/e740e971-68c3-8bba-96c8-7811b6fd729d.png)

CLBでは、ロードバランサーとEC2へのリクエストのプロトコルとポート番号を同一画面で設定できます。

が、ALBではロードバランサーへのリクエスト時のプロトコル・ポート番号に対してターゲットグループを設定するようになっていたため、別画面で設定する情報になっていました。
![スクリーンショット 2016-10-31 8.30.46.png](https://qiita-image-store.s3.amazonaws.com/0/77692/d3042e49-cacc-f36b-26a3-94da4396aa31.png)

別画面だったので、どこでEC2へのルーティングを設定するのかすぐにわからず詰まってしまいました。

改めて考えれば、`ALB → ターゲットグループ → EC2`という流れでリクエストされていくので、ターゲットグループ上で設定しないといけないと気づきました。

（ターゲットグループ作成時にリクエストルーティングの設定が出てきていたのですが、ついALB側と同じように`HTTP・80番`、`HTTPS・443番`を設定してしまっていました。）

## やったこと
ALBからEC2へのリクエスト時のリスナーの設定でやったことは下記の2つです。

+ ターゲットグループを`HTTP`・`HTTPS`用にそれぞれ作る
+ ターゲットグループ内のEC2にどのポートで接続するかを設定する

![スクリーンショット 2016-10-31 8.20.34.png](https://qiita-image-store.s3.amazonaws.com/0/77692/97bce8d0-197a-8c34-912f-c6defb168d9e.png)

CLBで設定したリスナー1行ごとにターゲットグループが必要になるようなイメージですね。
この設定後、ターゲットグループ内のヘルスチェックが無事に通りました。

## その他
### ALBとAuto Scaling Group
~~今回の詰まった件とは直結しないのですが、今までCLBとAuto Scaling Group（以下ASG）を紐付けていたので、同じようにALBでもASGを紐付けようと思ってマネジメントコンソールを見たのですが、特に設定できる部分がありませんでした。（2016/10/31現在）~~

~~そのため、ALBはターゲットグループ（=EC2インスタンス単位）との紐付けしかできないのかと思っていました。~~

~~ですが、下記の記事のようにCLIで登録できましたので、追々マネジメントコンソール上でも扱えるようになるのでしょうか。
マネジメントコンソールでも確認や操作ができるようになるとさらに便利そうですね。~~

+ Application Load Balancer（ALB）でAuto Scaling Groupを登録する（CLIのみ）
http://dev.classmethod.jp/cloud/aws/register-auto-scaling-group-to-alb/

**（2016/10/31追記）**
すみません、ASG側の画面で紐付けるターゲットグループを設定する箇所がありました。
ターゲットグループ側ではなく、ASG側からならマネジメントコンソールを使って紐付けられます。

### 移行ツール
+ elastic-load-balancing-toolsを使ってELBをALBに移行してみた
http://dev.classmethod.jp/cloud/aws/migration-from-elb-to-alb/

上記の記事の通りにやってみました。

ELB名・VPC・Subnet・Security Groupを引き継いだALBが1コマンドで出来上がります。
既存のCLBからALBへ移行する際は本当に便利ですね。
シェルスクリプトの出力に色をつけたい！

<img width="927" alt="スクリーンショット 2016-11-02 10.19.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/35603/db5515bd-a4d2-a1e1-c1bf-77045b13dbe6.png">


シェルスクリプトを書いていると、<font color="green">OK</font>とか<font color="red">FAILED</font>とか
実行結果の出力に色をつけたいシチュエーションってありますよね。
使いたいときにぱっと頭にカラーコードが浮かべばいいけどなかなかそうは難しい。。。

なのでザクッと全部表示しちゃうコマンドをいつも使ってるので紹介します。


## :ghost: コマンド
```shell-session
# 文字と背景の色の色見本を表示する
for fore in `seq 30 37`; do printf "\e[${fore}m \\\e[${fore}m \e[m\n"; for mode in 1 4 5; do printf "\e[${fore};${mode}m \\\e[${fore};${mode}m \e[m"; for back in `seq 40 47`; do printf "\e[${fore};${back};${mode}m \\\e[${fore};${back};${mode}m \e[m"; done; echo; done; echo; done; printf " \\\e[m\n"
```

これを実行すると、スクショにあるような色見本を得ることができます。
後は使いたい組み合わせをコピって `printf` や `echo -e` に渡すだけ！
(※ macOS だと `echo -e` が使えないので `printf` に渡すのが無難です。)


## :jack_o_lantern: ちょっとだけ詳解

`32` とか `41` とかなんのこっちゃいという感じですが、実はここで色を指定しています。
基本的には `\e[文字色2桁;背景色2桁m` という組になっていて、それぞれ下記のように意味を持っています。

```
3x 文字の色
4x 背景の色

x0 黒
x1 赤
x2 黄
x3 緑
x4 青
x5 紫
x6 水
x7 白
```

ここにさらに、<b>太字</b>や点滅といった属性を追加するには更に `;` で区切って数字を与えます。
紹介したコマンド中では 1(太字), 4(下線), 5(点滅) も合わせて出力しています。

```
1 太字
2 弱強調
4 下線
5 点滅
7 反転
8 非表示
```

なお、点滅はターミナルソフトで有効にしていないと点滅してくれません。

設定した後はもとに戻してあげないと永遠とその色とスタイルで出力されてしまうので、
HTMLの閉じタグよろしく、使った後は `\e[m` できれいにもとに戻しておくのが味噌です。


## 参考ページ
- [シェル - echoで文字に色をつける その1 - Miuran Business Systems](http://www.m-bsys.com/linux/echo-color-1)
動画からのJPEG書き出しは、 -q:v  オプションで画質指定できる

ffmpegで、動画からjpegなどの静止画に書き出す時には、以下のサンプルをよく見かけます。

```
ffmpeg -i douga.mp4 -ss 10 -t 20 -r 24 -f image2 out/%06d.jpg
```
１０秒から２０秒までを１秒あたり２４個のjpeg画像に切り出してくださいねってコマンドです。
ですが、これだとjpegの画質が荒いです。そこで、画質を指定するのがこちら。

```
ffmpeg -i douga.mp4 -ss 162 -t 220 -r 24 -q:v 1 %06d.jpg
```

q:v で画質が指定できます。数字が増えるごとに画質は落ちて、ファイル容量は軽くなります。
Python3 > ドキュメンテーション文字列 (documentation string) / docstring

```
Python 3.5.2ドキュメント
```

http://docs.python.jp/3/tutorial/controlflow.html#defining-functions

> 4.6. 関数を定義する
...

```
>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
```

> 関数の本体の記述する文の最初の行は文字列リテラルにすることもできます。その場合、この文字列は関数のドキュメンテーション文字列 (documentation string)、または docstring と呼ばれます。 
(docstring については [ドキュメンテーション文字列](http://docs.python.jp/3/tutorial/controlflow.html#tut-docstrings) でさらに扱っています。)
Python3 > pass文 > 最小のクラスを作る / 関数や条件の中身 > 抽象的なレベルで考えるとき

```
Python 3.5.2ドキュメント
```

http://docs.python.jp/3/tutorial/controlflow.html#pass-statements

> pass 文は何もしません。 pass は、文を書くことが構文上要求されているが、プログラム上何の動作もする必要がない時に使われます:

...

> これは最小のクラスを作るときによく使われる方法です:

```
>>> class MyEmptyClass:
...     pass
...
```

> pass が使われるもう1つの場所は、新しいコードを書いている時の関数や条件文の中身です。こうすることで、具体的なコードを書かないで抽象的なレベルで考えることができます。 pass は何もすることなく無視されます:

```
>>> def initlog(*args):
...     pass   # Remember to implement this!
...
```

Code Completeでいうところの「Pseudocode Programming Process 」をするときに使えそうだろうか。
Rubyと素数とエラトステネスの篩

最初篩1を
https://ja.wikipedia.org/wiki/エラトステネスの篩
を参考にRubyで書いた

# エラトステネスの篩1
1) 2から、上限xまでの整数リストを作成しこれを探索リストとする。昇順。
2) 探索リストの左端から1つ取り出して削除し、素数リストに挿入。ここでの取り出しは常に素数
3) 探索リストから今取り出した素数の倍数(=素数で割り切れるもの)を削除して更新
4) 2で取り出す素数が上限xの平方根を超えている場合、もう残りの探索リストは素数だけなので、全部素数リストに挿入して終了

コメントでその後アドバイスをいただき2,3を追記

# エラトステネスの篩2
コメントでのアドバイスを元に写経。篩1に加えて以下の考慮を加えている。
1) 偶数は2以外は合成数なのでその計算を省く。これで計算量が半分になる
2) 奇数はそれがたとえ素数としてもその奇数の階乗は合成数として省く

# エラトステネスの篩3
Prime関数の素数生成。特に指定しない限りエラトステネス生成器を使う。

100万まで行くと、篩1は4分かかる。
2と3はほぼ変わらず、0.3secほど。

```ruby
require 'benchmark'
require 'prime'

# エラトステネスの篩1

def primes1(max)
  # 上限数の平方根
  max_sqrt = Math.sqrt(max)
  # 素数リスト
  prime_list = Array.new
  # 探索リスト
  search_list=(2..max).to_a
  loop {
    primer = search_list.first
    # 探索リストから取り出した素数が、MAXの平方根を超えていたら
    # 残りの探索リストは素数だから
    # 探索を終了して素数リストに探索リストを全部入れる
    if primer > max_sqrt
      prime_list += search_list
      break
    else
      # 探索リストの先頭を1つ削り、素数リストに入れる
      prime_list << search_list.shift
    end
    # 探索リストの要素を今取り出した素数で割り切れるなら、倍数として削除して
    # 探索リストを更新
    search_list.delete_if{|num|
      num % primer == 0
    }
  }
  prime_list
end

# エラトステネスの篩2

def primes2(max)
  # 0からmaxまでの探索リスト
  # 利便性の点で添え字と値を一致させている
  # この探索リストから合成数を省いて(nilを代入)
  # 素数リストとしたい
  sieve = (0..max).to_a
  # maxの平方根まで素数を確かめて、その倍数を合成数として省けば
  # 平方根からmaxまでは素数しかない
  max_sqrt = Math.sqrt(max)
  # 素数ではない0と1をnilに
  sieve[0] = sieve[1] = nil
  # 偶数で2は素数であるため
  # 4以上の偶数を全てnil
  4.step(max,2){|num|
    sieve[num] = nil
  }
  # ある奇数の2乗に対してその奇数を足していく
  # 例) 3*3=9、その後9,12,15,18
  # それらは、その奇数(この場合は3)の倍数なので合成数とみなせる
  x = 3
  loop{
    if sieve[x]
      (x * x).step(max,x){|i|
        sieve[i] = nil
      }
    end
    x += 2
    break if x > max_sqrt
  }
  # nilを取り除く
  sieve.compact
end
result1 = Benchmark.realtime do
  primes1(100000)
end
result2 = Benchmark.realtime do
  primes2(100000)
end

# エラトステネスの篩3
result3 = Benchmark.realtime do
  Prime.each(100000).to_a
end


p "result1:#{result1}" #=> "result1:239.970237"
p "result2:#{result2}" #=> "result2:0.398498"
p "result3:#{result3}" #=> "result3:0.283707"
```
TensorFlow > cifar10 > saver > .save() @ cifar10_train10.py / .restore() @ cifar10_eval.py

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000
https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

cifar10_train.pyを学習中。

saver.save()を見つけた。

```cifar10_train.py
    for step in xrange(FLAGS.max_steps):
...
      # Save the model checkpoint periodically.
      if step % 1000 == 0 or (step + 1) == FLAGS.max_steps:
        checkpoint_path = os.path.join(FLAGS.train_dir, 'model.ckpt')
        saver.save(sess, checkpoint_path, global_step=step)
```

上記保存したものはどこかでrestore()して使われると思った。

grepしたら以下で見つけた。

```cifar10_eval.py
def eval_once(saver, summary_writer, top_k_op, summary_op):
...
  with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
    if ckpt and ckpt.model_checkpoint_path:
      # Restores from checkpoint
      saver.restore(sess, ckpt.model_checkpoint_path)
```

.save()で保存した情報をcifar10_eval.pyにて.restore()で取り出して評価しているようだ。

学習を途中で中断して、Resumeする機能に使うものばかりと思っていたが、このような使い方もできるようだ。
技術英語 > Be sure to cover [this ground]: / lay of the land

@ Code Complete (No. 16321 / 36077)

> A systematic approach to developer testing maximizes your ability to detect errors of all kinds with a minimum effort. Be sure to cover <font color=red>this ground</font>:


日本語のオンライン英和辞書でgroundの名詞での良い訳が見つからなかった。

以下を見つけた。
http://www.dictionary.com/browse/ground

> `5 Often, grounds. the foundation or basis on which a belief or action rests; reason or cause:

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/lay+of+the+land

> 地形、地勢

冒険野郎マクガイバーの俳優が出ているTVドラマ「StarGate」において使われていた。「向こうの事情」という訳がついていた。
AndroidでRxを使って一定間隔に値を流したいとき

- Tipsというか、どうやるのがスマートなのかなと悩みながらこんな感じにしましたというものなので、こうすれば簡単だよ！というのがあればご教示ください m(_ _)m

## やりたいこと

```java
List<String> textList = new ArrayList<>();
textList.add("hoge");
textList.add("fuga");
textList.add("piyo");
textList.add("nya-");
```

という感じなリストがあったときに、これを定期的に、例えば1秒置きに1つずつ値を流したい、という話です。AndroidではHandlerでpostDelayedするのを繰り返せばできますが、それをRxでいい感じに書きたいのです。

## こうしてみた

```java
List<String> textList = new ArrayList<>();
textList.add("hoge");
textList.add("fuga");
textList.add("piyo");
textList.add("nya-");

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).take(textList.size()).subscribe(indexL -> {
    int index = indexL.intValue();
    System.out.println(textList.get(index));
});
```
- 最初にintervalで1秒置きに数値が流れる無限Streamを作ってから、listの数だけtakeしてsubscribeの中で流れてきた値をindexとして使ってListにアクセスしています。Androidの場合は作ったSubscriptionをonPauseでunsubscribeした方がよいでしょう。
わずか8ドルのRaspberryPi互換機 NanoPi NEO のGPIOをシェルから制御する


頑張って煽りっぽいタイトル考えてみたけど、初代ラズパイとピンコンパチなだけだった。

物理ピンとLinux GPIOの対応関係はこちら: http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO#Layout

Linux GPIOの使い方はこちらを参考にしました: https://tool-lab.com/2013/12/raspi-gpio-controlling-command-1/

```bash
root@FriendlyARM:~# echo 0 > /sys/class/gpio/export
root@FriendlyARM:~# echo out > /sys/class/gpio/gpio0/direction
root@FriendlyARM:~# echo 1 > /sys/class/gpio/gpio0/value  # GPIO Hi
root@FriendlyARM:~# echo 0 > /sys/class/gpio/gpio0/value  # GPIO Lo
```

LED 3つ光らせてみたけどちゃんと光ってるしまあまあ電流とれるっぽい。
Pythonインタプリタのプロンプト変更

おはようございます（徹夜）:whale2:
Python入門時からスクリプトはファイルに書いていたため、使ったことがなかったインタプリタをさわっています。

```bash:インタプリタの起動
$ python
Python 3.5.1 |Anaconda 4.1.0 (x86_64)| (default, Jun 15 2016, 16:14:02)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
```

```python:超かんたんな操作
>>> a = (
... 2,3,5,7
... )
>>> print(a)
(2, 3, 5, 7)
>>> exit()
```

Pythonインタプリタのプロンプト文字列は`sys`モジュールから得られます。

``` python:プロンプト文字列確認
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> exit()
```

インタプリタの一次プロンプト(PS1)は`「>>> 」`、二次プロンプト（PS2）は`「... 」`になっていることがわかりました。

```bash:プロンプトを変更してみる
>>> import sys
>>> sys.ps2 = '(๑•̀ㅂ•́)و '
>>> sys.ps1 = '(๑˃̵ᴗ˂̵)و '
(๑˃̵ᴗ˂̵)و '''
(๑•̀ㅂ•́)و インタプリタの
(๑•̀ㅂ•́)و 女子力が
(๑•̀ㅂ•́)و あがった！
(๑•̀ㅂ•́)و '''
'\nインタプリタの\n女子力が\nあがった！\n'
(๑˃̵ᴗ˂̵)و exit()
```

## おわりです

(๑˃̵ᴗ˂̵)و<span class="fa fa-spin">✧</span>

## 参考と注釈

* [Python » 3.5.2 Documentation » The Python Standard Library » 29. Python Runtime Services » 29.1. sys — System-specific parameters and functions](https://docs.python.org/3.5/library/sys.html#sys.ps1)

* [pythonのプロンプト表示を変更する - Qiita](http://qiita.com/mtwtk_man/items/70bd5e4296aba79bb75e)
AppStore, GooglePlay, MicrosoftStore バッジ入手先とリンク先

#概要

類似記事あるかと思いますが、Webからリンク張るときの、以下のようなバッジアイコンの入手先とリンク先の自分用メモです。

![button_capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/dc2f0344-ca8a-7003-85be-be6fa9ce7fe3.png)

#バッジ入手先

App Store
https://developer.apple.com/app-store/marketing/guidelines/jp/

Google Play
https://play.google.com/intl/en_us/badges/

Microsoft Store
https://developer.microsoft.com/ja-jp/store/badges

#Webでのリンク先

Webで表示したURLをそのままコピペするとやたら長くなるので、必要最小限のリンクURLにする

App Store

```
https://itunes.apple.com/jp/app/（アプリID）
```
例　https://itunes.apple.com/jp/app/id281796108


Google Play
```
https://play.google.com/store/apps/details?id=（アプリID）
```
例　https://play.google.com/store/apps/details?id=com.evernote


Microsoft Store

```
https://www.microsoft.com/store/apps/（アプリID）
```

例　https://www.microsoft.com/store/apps/9wzdncrfj3mb


#ストアアプリを直接起動するリンク先

適切なデバイスで表示していれば、Webでのリンク先でもストアアプリが開くので、そちらのほうが汎用的でよいかと思いますが、いちおう参考URLだけ。

App Store
すみません公式ドキュメント見つからず・・・
```itms-apps://itunes.apple.com/app/（アプリid）``` というのであっているのでしょうか。。。

Google Play
https://developer.android.com/distribute/tools/promote/linking.html

Microsoft Store
https://msdn.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-store-app
機械学習論文読みメモ_10

[Metadata Dependent Mondrian Processes](http://jmlr.org/proceedings/papers/v37/wangd15.pdf), ICML2015
関係データ分析問題を扱う。
この問題は基本的には、データをadjacency matrix（誰と誰がSNSで友達なったか等）で表現し、行と列を部分的に集めブロック構造を抽出する。
ここでは、確率的なパーテション生成モデルを考える。
従来手法では、ブロック数をchinese restaurant processで可変にしたinfinite relational modelとその拡張であるMondrian Processがある。
特にMondrian Processは柔軟性が高いモデルだが、その分スパースなデータなどに対しては過剰適合が起きやすく、収束しにくい問題がある。
本論では、メタ情報、例えば同じ大学に属しているもの同士は友達になりやすい、を活用する事でこれを克服する。
このメタ情報が分散する方向にパーテションを行いやすくする事で、アクセプトされやすいパーテション生成が行いやすくなる。

[Deep Unsupervised Learning using Nonequilibrium Thermodynamics](http://jmlr.org/proceedings/papers/v37/sohl-dickstein15.pdf), ICML2015
モデルのflexibilityとtractabilityを両立させる事は難しく、どちらかを犠牲にするか、近似モデルに頼る事が一般的である
本論ではそれら２つを両立させるモデルを提案する。
非平衡熱力学の知見を元にしており、ある分布からある分布へ遷移していくようなマルコフ連鎖を用いる。
これにより単純なガウス分布と複雑な分布を完全な形で対応させる。
この遷移の過程はdiffusion processと呼び、diffusion時に与えられる摂動を予測する事で上記分布間対応を可能にする。
これは分布そのものを予測するよりも簡単である。
提案モデルは結局、柔軟性が高く、正確なサンプリングが可能で、分布同士の掛け算が可能で、対数尤度や確率が低コストに計算可能である。

[A Deeper Look at Planning as Learning from Replay](http://jmlr.org/proceedings/papers/v37/vanseijen15.pdf), ICML2015
reinforcement learningにおける価値関数予測に基づいた学習手法は主に2通りある。
１つ目はmodel free methodでサンプルから直接価値関数を予測し、experience replayと組み合わせられる。
2つ目はmodel based methodで環境をモデル化し、そのモデルに基づいて価値関数を予測する。
この2つの手法間における違いは明らかではない。
特に理論面においては、線形な二乗誤差損失のモデルにおいては両者は一致する事が示されているが、実用上は計算上の問題で結局一致しなかったりする。
本論では、明確に両者のモデルが一致する事を初めて示した。
この時、新たなreplayベースの一般的手法を提案し、これがmodel freeからmodel based手法までの間を繋げる事を可能にした。
おにぎりのような右向きの角が丸い三角形

音楽アプリの再生/停止ボタンによくある、おにぎりのような右向きの角が丸い三角形を書くSwiftプログラムです。

この関数はUIBezierPathを返します。
関数の引数は x y radius ratio angleの5つです。それぞれの意味は図の通りです。angleは後から追加したので図に載っていませんが、全体を時計周り方向に回転させるパラメータです。
![softTriangle.png](https://qiita-image-store.s3.amazonaws.com/0/46631/adbba31a-3131-f667-65f2-63177bb69049.png)

パスの作成に使用しているメソッドは

```swift
open func addQuadCurve(to endPoint: CGPoint, controlPoint: CGPoint)
```

です。

引数をCGFloatにするかDoubleにするかは迷うところでありました。使用する際、都合が悪ければ変更してください。

```swift
func roundTriangle(x: Double, y: Double, radius: Double, ratio: Double, angle: Double) -> UIBezierPath {
	
	var ratio = CGFloat(ratio)
	if ratio < 0.0 {
		ratio = 0.0
	} else if 1.0 < ratio {
		ratio = 1.0
	}
	
	let pos1 = CGPoint(x: x + radius * cos(0.0 + angle), y: y + radius * sin(0.0 + angle))
	let pos2 = CGPoint(x: x + radius * cos(2.0 / 3.0 * M_PI + angle), y: y + radius * sin(2.0 / 3.0 * M_PI + angle))	
	let pos3 = CGPoint(x: x + radius * cos(4.0 / 3.0 * M_PI + angle), y: y + radius * sin(4.0 / 3.0 * M_PI + angle))	
	
	let ratio2 = 1.0 - ratio
	let pos1f = CGPoint(x: (pos1.x + pos2.x) / 2.0 * ratio + pos1.x * ratio2,
	                    y: (pos1.y + pos2.y) / 2.0 * ratio + pos1.y * ratio2)
	let pos2b = CGPoint(x: (pos1.x + pos2.x) / 2.0 * ratio + pos2.x * ratio2,
	                    y: (pos1.y + pos2.y) / 2.0 * ratio + pos2.y * ratio2)
	let pos2f = CGPoint(x: (pos2.x + pos3.x) / 2.0 * ratio + pos2.x * ratio2,
	                    y: (pos2.y + pos3.y) / 2.0 * ratio + pos2.y * ratio2)
	let pos3b = CGPoint(x: (pos2.x + pos3.x) / 2.0 * ratio + pos3.x * ratio2,
	                    y: (pos2.y + pos3.y) / 2.0 * ratio + pos3.y * ratio2)
	let pos3f = CGPoint(x: (pos3.x + pos1.x) / 2.0 * ratio + pos3.x * ratio2,
	                    y: (pos3.y + pos1.y) / 2.0 * ratio + pos3.y * ratio2)
	let pos1b = CGPoint(x: (pos3.x + pos1.x) / 2.0 * ratio + pos1.x * ratio2,
	                    y: (pos3.y + pos1.y) / 2.0 * ratio + pos1.y * ratio2)
	
	let roundTrianglePath = UIBezierPath()
	
	roundTrianglePath.move(to: pos1f)
	roundTrianglePath.addLine(to: pos2b)
	roundTrianglePath.addQuadCurve(to: pos2f, controlPoint: pos2)
	roundTrianglePath.addLine(to: pos3b)
	roundTrianglePath.addQuadCurve(to: pos3f, controlPoint: pos3)
	roundTrianglePath.addLine(to: pos1b)
	roundTrianglePath.addQuadCurve(to: pos1f, controlPoint: pos1)
	
	return roundTrianglePath
}
```

ratioを変化させるとこのようになります。
![ratio.png](https://qiita-image-store.s3.amazonaws.com/0/46631/5a60c2d0-6d90-592c-e1d7-8d9c461ac59b.png)

angleを変化させるとこのようになります。
![angle.png](https://qiita-image-store.s3.amazonaws.com/0/46631/b243486b-635a-b464-18b0-a0c1f7e800f2.png)

また、ratioが0.0のときは、始点と終点が頂点になります。このとき太い線で輪郭を描くと、lineCapStyleによっては端がぎざぎざになります。