OmniAICreator/Qiita-1.07M huggingface dataset:
Terrainにデフォルトで用意されているテクスチャを設定してみる

メニューの `Assets` → `Import Package` → `Environment` をImport

「Terrain」をクリックし、

![スクリーンショット 2016-04-18 19.16.14.png](https://qiita-image-store.s3.amazonaws.com/0/13836/05db8c70-9a84-b9e4-ee57-3e231343e902.png)

右側で色々表示しているところの、「Terrain」のブラシのマークを選択。「Edit Textures」ボタンを押す

![スクリーンショット 2016-04-18 19.18.29.png](https://qiita-image-store.s3.amazonaws.com/0/13836/88805919-cd40-bab7-0395-fa4ba9c5b103.png)

下側のViewの、Standard Assets → Environment の 「Surface Textures」にあるものを適当にDrop&Dropしてみる

![スクリーンショット 2016-04-18 19.18.55.png](https://qiita-image-store.s3.amazonaws.com/0/13836/a0970792-cac8-7885-afff-829b7abc6165.png)

再生ボタンを押してみる

![スクリーンショット 2016-04-18 19.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/13836/f20cfe12-3ebf-1dc0-a444-2967933ad1b8.png)

(なんか近い部分のテクスチャがボケてださいけど・・・w)ひとまずできた。
Rails テストの豆知識 ( fixture )

さっきハマったので自分用メモを兼ねて。

#fixtureでシャープ（#）の扱い方
userデータでtagという属性があるとします。

\#をそのまま使うとコメントアウトされてしまいます。

```ダメな例1：users.yml
taro:
  name: YamadaTaro
  tag: #111
```

正しくはシングルクオーテーション（またはダブルクオーテーション）で囲みます。

```正しい例：users.yml
taro:
  name: YamadaTaro
  tag: '#111'
```

なおエスケープだとyamlとしては適切ですが、テストコードで読み込んだ際にエスケープシーケンスも文字列として読み込んでしまうのでテスト全体としてはNGです。

```ダメな例2：users.yml
taro:
  name: YamadaTaro
  tag: \#111
```
return redirect('hogehoge')->with('message','ってかいたらいつでもメッセージだしたい');


## リダイレクトするときにメッセージを

ログインが必要なときはログインに自動的にリダイレクトして
リダイレクトされた理由をメッセージ出したかったので、そこら辺のコードをコピペしたのですが、messageを出力するところをコピペしておらず困りました。

レイアウト（layout）に書いておくと便利だったので、メモします。

## コントローラ

```app/Http/Controllers/PostController.php
//省略

class PostController extends Controller
{
    // 省略
    public function create()
    {
        if (Gate::denies('create', $this->post)) {
            return redirect('login')->with('message', '投稿するにはログインしてください。');
        }
        return view('post.create');
    }
    // 省略
}

```

## レイアウト

```resources/views/layouts/app.blade.php

// 良き場所に適当に

@if (session('message'))
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="alert alert-warning">
                {{ session('message') }}
            </div>
        </div>
    </div>
    @endif
@yield('content')

```

## 公式のマニュアル

公式のマニュアルではこのような場所に書いてありました。
英語読めないと探すのが辛いね。

> [Session - Laravel - The PHP Framework For Web Artisans  Redirecting With Flashed Session Data](https://laravel.com/docs/5.1/responses#redirecting-with-flashed-session-data)
> https://laravel.com/docs/5.1/responses#redirecting-with-flashed-session-data


## おまけ

ついでですが、``controller``の``redirect``はヘルパーメソッドでこんな風に定義されています。

```vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
if (! function_exists('redirect')) {
    /**
     * Get an instance of the redirector.
     *
     * @param  string|null  $to
     * @param  int     $status
     * @param  array   $headers
     * @param  bool    $secure
     * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
     */
    function redirect($to = null, $status = 302, $headers = [], $secure = null)
    {
        if (is_null($to)) {
            return app('redirect');
        }

        return app('redirect')->to($to, $status, $headers, $secure);
    }
}
```

そして、redirectが返すのは、RedirectResponseのインスタンスで、このクラスのwithでは、渡したKeyとValueが、``Session::flash``とされています。（flashは一回きりのセッションデータだよって意味）

```vendor/laravel/framework/src/Illuminate/Http/RedirectResponse.php
/**
 * Flash a piece of data to the session.
 *
 * @param  string|array  $key
 * @param  mixed  $value
 * @return \Illuminate\Http\RedirectResponse
 */
public function with($key, $value = null)
{
    $key = is_array($key) ? $key : [$key => $value];

    foreach ($key as $k => $v) {
        $this->session->flash($k, $v);
    }

    return $this;
}
```
EclipseからIntelliJに乗り換えるときに行った設定

※随時追加します。

## import の設定
デフォルトの設定だと、すぐに*でimportをされてしまう。
Preferences -> Editor -> Code Style -> Java の importsタブにて設定。

![Screen Shot 2016-04-18 at 4.22.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/33499/476b2c31-72d9-a615-c1d0-f251e19c2fae.png)

## メモリの設定
デフォルトのメモリ量だと、プロジェクトの大きさによりメモリが足りなくなり、
コンパイルが通らなくなる。

~/Library/Preferences/IntelliJIdea15CE/idea.vmoptions
参考サイト : https://www.jetbrains.com/idea/help/tuning-intellij-idea.html

```
-Xms1024m
-Xmx8192m
-XX:MaxPermSize=1024m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
```
備忘録：簡易HTMLバリデーションブックマークレット

#はじめに
とっくりばーさんのタグチェック用のブックマークが一部動作しないページがあったので、GET送信できるW3Cのvalidatorを使った簡易バリデーションブックマークレットを自分用に作成。
単純な構成なので、Facebookのデバッガーなどでも使えます。

#ブックマークレットのアドレスの中身
####コピー用ソース
```js:javascript
javascript:var%20u='https://validator.w3.org/nu/?doc=';var%20h=encodeURIComponent(window.location.href);var%20w=window.open(u+h,'_blank','width=1280,height=800,scrollbars=yes');void(0);
```
####ソースの展開
```js:javascript
javascript:
    var u='https://validator.w3.org/nu/?doc=';
    var h=encodeURIComponent(window.location.href);
    var w=window.open(u+h,'_blank','width=1280,height=800,scrollbars=yes');
    void(0);
```

##ブックマーク登録方法
上記のコードをブックマークのアドレスにペーストする。

##オプション
1. ソース付きにする場合、引数に「showsource=yes」を追加する
2. サイトマップ付きにする場合、引数に「showoutline=yes」を追加する
3. 画像レポートを追加する場合、引数に「showimagereport=yes」を追加する

##参考URL
とっくりばー
http://tockri.blog78.fc2.com/blog-entry-168.html

W3C Markup Validation Service
https://validator.w3.org
DBaaSサービス「Compose」のセキュリティはどうなってる？

クラウドといえば、セキュリティ懸念・・・というわけで調べてみました。Compose.io（Enterpriseは、また別っぽい）の対応状況です。
参考→https://help.compose.io/docs/security

## 規格対応状況

以下のものたちには、対応しているようです。
・ISO 27001
・SSAE16 SOC-1 Type II/ISAE 3402 (previously SAS70 Type II)
・SOC 2 - Security
・SOC 3
・PCI Level 1
・FISMA moderate

## ネットワークについて
802.1qですとか書いてありますね。

## 個々のDBレベルでいうと？
PostgreSQLでしか試していませんが、ログインしてくるfromのIPを絞ることができるようです。
![security.png](https://qiita-image-store.s3.amazonaws.com/0/119378/fb5233f3-4c14-d630-9ff0-22520d5ad91e.png)

内部的にはproxyサーバで絞っているっぽい（サポートに聞いたらそう答えられた）。
pg_hba.confをいじってるとおもいきや、違うのか・・・。確かにconfをいじるとDB再起動が必要なので、その辺を考えてProxyでの制限にしたのでしょう・・・

参考：PostgreSQLのCompose上の構成はこちらの記事ご参照↓
http://qiita.com/azzeten/items/a7a786701cf25ef1a087
VirtualBox で特殊な解像度を利用する

# 背景
VirtualBox で Windows 10 を利用していて、新しい Build を適用したタイミングで適切なディスプレイの解像度が選択されなくなった。

# 環境
- Guest Additions はインストール済
- VM名は windows10
- ディスプレイ解像度は 1600 x 900

# 対処

```shell-session
% VBoxManage controlvm "windows10" setvideomodehint 1600 900 32
```

※ VM起動中に実行可能、即時反映される。
rsyncについてのメモ（転送テスト〜帯域制限まで）

#rsyncについての備忘録
rsyncを使うたびにググってる気がするのでよく使用するものを備忘録

##基本形
```lang:同じサーバ上
rsync -a src dest
```
```lang:遠隔サーバへの転送
rsync -a src 遠隔ユーザ名@遠隔IPアドレス:dest
```

##テスト
--dry-runを使うとコピーやdeleteを行うことなくテストできます。

```lang:同じサーバ上
rsync -av --dry-run src dest
```

##帯域制限
本番などでサーバに与える負荷を調整したい場合などに。
一秒間にコピーする量を調整できます。例は10M/s。

```lang:同じサーバ上
rsync -av --bwlimit=10240 src dest
```


##各種オプション
使用頻度の高いオプションをまとめてみた

|オプション名|使用用途|
|:---|:---|
|-a|-rlptgoD オプションと同義|
|||
|-r|ディレクトリで再帰的に実行する|
|-l|ソフトリンクを維持する|
|-p|パーミッションを維持する|
|-t|タイムスタンプを維持する|
|-g|グループを維持する|
|-o|オーナーを維持する (root のみ)|
|-D|デバイスを維持する (root のみ)|
|||
|--delete|srcになく、destに存在する場合、destから削除する。|
|-v|転送情報を詳しく表示|
|-q|転送情報を表示しない|
|-h|メガやギガを人間的な読み方にする。|
|--exclude=PATTERN|除外する条件を記述。正規表現も可能。複数指定したい場合は--exclude=PATTERNを複数記載する。|
|--exclude-from=FILE|除外する条件を記述したファイルを指定する。複数条件時はファイルないで改行区切りで複数指定する。|
|--progress|転送中の情報を表示。何件中の何件目など詳細に表示されるので多いときは結構有益な情報が表示される。|
|-q|転送情報を表示しない|
|-e|rsh の代替を指定。sshのポートがデフォルトでない場合などに「-e "ssh -p 8022"」といった形式で指定できる。|
|--bwlimit=byte|1秒間に送信できるバイトを指定する。例）--bwlimit=1024|
|--dry-run|コピーは行いませんが、動作をテストできます。|
Unityで1分でFPSを作る (インストール時間を除く)

※使っているバージョンは4.6です。
※インストール手順は省きます

# 下準備

プロジェクトを作る。3Dで作る

# Terrainを作る

メニューの `Game Object` → `3D Object` → `Terrain`

※ Terrain とは地形。地面です。

# FPSなキャラクターを作る

メニューより `Assets` → `Import Package` → `Charactors`

Importボタンを押す(結構時間がかかるのでしばらく待つ)

下にツリー状のViewがあるので、Assetsの中の、 

![スクリーンショット 2016-04-18 15.54.55.png](https://qiita-image-store.s3.amazonaws.com/0/13836/bf3446d0-a1a2-0930-2665-01de39974cf0.png)

ここにある `FPSController`

これを先ほど用意した Terarin 上のどこかに `Drug&Drop` する

![スクリーンショット 2016-04-18 15.56.30.png](https://qiita-image-store.s3.amazonaws.com/0/13836/aacb68be-5bac-2197-1b15-5c500464e181.png)

# 完成！
再生ボタンを押す。

### 操作方法
PCのFPSゲーで標準的な `WASD` キーで移動する。マウスによる視点変更も可能。スペースでジャンプ。素晴らしい！！（ここまで1分)

「抜けるのはどうするんだー！？」っていうのは、ESCキーで抜けれるので、もう一回「再生」ボタンを押せば、ゲームを停止できます。

![スクリーンショット 2016-04-18 16.22.46.png](https://qiita-image-store.s3.amazonaws.com/0/13836/56d099de-9061-5014-08e7-802d2bb51c91.png)

…弾の発射がないけれど、それは自分で実装する感じなのかな・・・？多分

---

真っさらな地形だけど、歩いた時コツコツ音が出てるし、ちゃんと一歩一歩歩いてるような画面の動き方をするので、**Unityすげー！！**って感じだ。
Oracle Java Cloud Serviceインスタンスの停止と削除

# はじめに
[Oracle Java Cloud Serviceをフリートライアルで使い始める](http://qiita.com/nobuhikosekiya/items/130c4335719d40ec6177)でJava Cloud Service(以降JCS)を使い始めるまでを書きましたが、今回は作ったJCSを停止したり、削除したりする方法です。

停止は、JCSを一時的に使わないけど、また後で使いたいときに使います。
削除ではJCSのVMごと削除されますので、もう必要なくなったときに使います。

フリートライアルであれば、JCSインスタンスを作成しては削除して、また別の構成で作成する、といったやり方で色々な構成を試してみるのもいいのではないでしょうか。

クリックベースでできますので、簡単です。
最初に停止の方法、次に削除について書きますが、停止せずにいきなり削除も可能です。

# JCSの停止

Oracle CloudのMy Servicesにログインし、Oracle Java Cloud Serviceのサービス・コンソールのリンクを開きます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/1746e382-16dc-2201-db7d-a17210c874ec.png)

JCSインスタンスのリンクをクリックします。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/41e84eef-5a0c-0b98-5a5b-e8a8092a936a.png)

上のメニューボタンを開くと、中止ボタンがあります。これが停止ボタンです。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/415a15fd-4f7d-77e6-7d94-e2de3cba1d75.png)

トポロジをクリックし、その下にあるアクティビティを開くと、停止状態を確認できます。画面例だとまだ停止が進行中の状態です。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/05b03e89-163f-dc70-ca4b-52c516d30bb2.png)

停止が完了しました。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/52cacf02-c45c-199d-0205-18df15f823ca.png)


この停止のやり方だと、JCSインスタンスに含まれるすべてのVM（管理サーバー、管理対象サーバー、ロードバランサー）が停止します。（管理対象サーバーとロードバランサーに関しては個別に停止もできます。）

# Database Cloud Serviceインスタンスの停止

ついでにDatabase Cloud Service (DBCS)インスタンスの停止のやり方も。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/c96db6c4-da28-cf48-ec4b-3aaa12ab6ca3.png)

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/bb2f051e-f533-4c80-0eaa-cbf73ea32bf3.png)

JCSの停止が完了していないと、以下のメッセージが出てDBCS停止できません。JCSの停止の完了を待つ必要があります。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/5ec39eff-1c7f-4ca9-6c6c-d6f5293970db.png)

停止が実行できると、こちらもアクティビティから状況を確認できます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/a55fc3c1-b7b8-2178-f71b-386b424174f5.png)


# JCSインスタンスの削除

JCSインスタンスのメニューから削除できます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/0dc9a895-70ec-1eb9-cfb2-d565d43352d9.png)

ここでJCSと一緒に作成したDBCSの管理者ユーザー（普通は「SYS」)とそのパスワード（DBCSインスタンス作成時に指定したパスワード）を入れますが、もし忘れてしまっても強制削除ボタンを入れておくと、削除することができます。（しかしユーザー名とパスワードは一応入れないと削除ボタンが押せないので、デタラメなユーザーを入れてみています。）
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/a72819c2-e4a4-3bd3-d6a5-3c37ba31c10d.png)

削除が進行中です。。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/ad78e673-7259-ace9-2efe-d976b54de34a.png)


削除完了しました。インスタンスが消えています。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/109197/088018b3-6a81-89d8-21cc-caeab65f5543.png)


必要であればこの後DBCSインスタンスも削除できます（JCSを削除するまでは接続先のDBCSインスタンスは削除できません）


以上
KotlinでParcelerを使う話


クラスでParcelableを実装するのは、めんどくさいので、Javaでは[Parceler](https://github.com/johncarl81/parceler)を使っているのですが、それをKotlinで使おうという話です。

### 試してみる

まず、

```Foo.kt
@Parcel
data class Foo(
        val Hoge: Int,
        val Fuga: String,
        val Piyo: List<String>
)
```

こんなクラスを考えてみます。

```build.gradle

   ･･･
dependencies {
     ･･･
    compile "org.parceler:parceler-api:1.1.1"
    kapt "org.parceler:parceler:1.1.1"
}

```

こんな風に準備して、いざ、Build。

```
エラー: Parceler: No @ParcelConstructor annotated constructor and no default empty bean constructor found.
```

こんな感じのエラーがでます。引数無しのコンストラクタがないですからね。

### 引数無しのコンストラクタ

```Foo.kt
@Parcel
data class Foo(
        val Hoge: Int,
        val Fuga: String,
        val Piyo: List<String>
) {
    private constructor() : this(0, "", ArrayList())
}
```

としてあげることで、Parcelerを使用できます。
このコンストラクタはprivateにしておいても、Parcelerが生成するクラスではリフレクションで使用できるみたいなので、Parcelerのためだけな場合は、privateにしておくとよいでしょう。

また、問題なければ、

```Foo.kt
@Parcel
data class Foo(
        val Hoge: Int = 0,
        val Fuga: String = "",
        val Piyo: List<String> = ArrayList()
)
```

のように、デフォルト値を指定しておけば、引数無しのコンストラクタも作られるので、それでもかまいません。
ただ、この場合、不要なコンストラクタもできてしまうので、この方法は慎重に使う必要があります。

### 明示的なコンストラクタの指定

```Foo.kt
@Parcel
data class Foo @ParcelConstructor constructor(
        val Hoge: Int,
        val Fuga: String,
        val Piyo: List<String>
)
```

というように、使用するコンストラクタを指定してあげればできそうな気もするのですが、

```
エラー: Parceler: No corresponding property found for constructor parameter arg0
エラー: Parceler: No corresponding property found for constructor parameter arg1
エラー: Parceler: No corresponding property found for constructor parameter arg2
```

というエラーになってしまうので、素直に引数無しのコンストラクタを作ってあげた方が良いようです。

### 補足

Kotlinのインクリメンタル・コンパイラのせいなのか、kaptがまだまだなのか、はたまた、インスタントランの影響なのかはわかりませんが、ソースを修正しても、build/generated/source/kapt/ に生成されるソースが、そのままになっていることがあります（これで、かなり混乱した）。
意図したようにBuildできないときや、適当なタイミングで、 **kaptディレクトリをサクッと削除** して試した方が良いみたいです。

### その他の方法

Parcelable code generation( for kotlin's data class) というプラグインもあるので、Parcelerを使わずに、それでParcelableインターフェースのメソッドを生成するという方法もあります。

ただ、

```Foo.kt
data class Foo(
        val Hoge: Int,
        val Fuga: String,
        val Piyo: List<String>
) : Parcelable {

    constructor(source: Parcel): this(source.readInt(), source.readString(), source.createStringArrayList())

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeInt(Hoge)
        dest?.writeString(Fuga)
        dest?.writeStringList(Piyo)
    }

    companion object {
        @JvmField final val CREATOR: Parcelable.Creator<Foo> = object : Parcelable.Creator<Foo> {
            override fun createFromParcel(source: Parcel): Foo {
                return Foo(source)
            }

            override fun newArray(size: Int): Array<Foo?> {
                return arrayOfNulls(size)
            }
        }
    }
}
```

こんな感じになって、すっきりしたdata classの定義が台無しになってしまうので、あまり使いたくないなーと思います。
BluemixのSQL Databaseがサービス終了ですと!?

#BluemixのSQL Databaseが6月3日にサービス終了します

Bluemixをお使いのみなさま、Bluemixのステータスページ[ https://status.ng.bluemix.net/ ]をチェックされていますでしょうか？
SQL Databaseが6月3日にサービス終了とアナウンスがありました。
Bluemix上のアプリケーションのリポジトリとしてSQL Databaseを利用中の方はデータベースの移行を検討する必要がありそうです。。。

![image](https://qiita-image-store.s3.amazonaws.com/0/112854/19351df2-e0ca-337f-c2da-7ef10eb2b808.png)


>Announcement: SQL Database extension dates
The SQL Database Free Plan deprecation date and both the Free and Small Plan end-of-service dates have been extended. These extensions will allow you more time to migrate data to a new service. Here are the details:

>SQLDB Free Plan
Deprecation date: April 18, 2016.
As of April 18, 2016, you will not be able to provision new SQL Database instances. However, existing instances will continue to be supported. You can access and export your existing instances until the End-of-Service date, which is June 3, 2016.

>SQL Database Free Plan and SQL Database Small Plan
End-of-Service date: June 3, 2016
This date is the last day to access your SQL Database instances and data. You must ensure that you have exported/migrated all of your data out of the SQL Database before June 3, 2016. As of this date, the SQL Database Free and SQL Database Small plans will be shut down and no longer supported.


サービスインスタンス作成の画面にもサービス終了が記載されていました。
![image](https://qiita-image-store.s3.amazonaws.com/0/112854/47033297-55b9-1c49-0acf-2df9dd977ada.png)

#SQL Databaseの移行
こちらのページに [ http://sqldb-migration.info/ ] 移行についてのガイドがありました。

移行先として推奨しているのは、Compose PostgreSQL と DB2 on Cloud のようです。
SQL DatabaseのPremium(有償)サービスについては"今のところ"サービス終了の案内はないので、短期ではそちらへの移行を検討するのも一つの選択肢ではないでしょうか。
また、dashDB のメニューの中に dashDB Transactional という、分析ではなくオンライントランザクションに利用可能なdashDBインスタンスも追加されていましたので、そちらも利用可能です。[ https://console.ng.bluemix.net/catalog/services/dashdb/ ] 
**ただ、、、どれも有償なんですよね。。。**
簡単ですが移行のメリデメをまとめてみました。

||SQL Database Premium| Compose PostgreSQL | DB2 on Cloud | dashDB Transactional |
|:---:|:---:|:---:|:---:|:---:|
|メリット|DBエンジンに変更なく、移行が容易。|30日間無償で利用可能。オープンソースデータベースへの移行。無償期間を過ぎると有償にはなるが月$20程度から運用可能。|DBエンジンに変更なく、移行が容易。ベアメタルの専用クラスターを提供。|DBエンジンに変更なく、移行が容易。ベアメタルの専用クラスターを提供。マネージドサービス。|
|デメリット|有償。一部サービス終了の案内がされているため短期的な移行先としてしか検討出来ない|DBエンジンの変更となるためデータベース移行作業が発生する。有償。|有償。SQLDBの規模からするとコスト高。マネージドサービスではない|有償。SQLDBの規模からするとコスト高。|


Compose PostgreSQL価格 (https://compose.io/pricing/#postgresql-pricing)
DB2 on Cloud 価格 (https://console.ng.bluemix.net/catalog/services/ibm-db2-on-cloud/)
dashDB Transactional 価格 (https://console.ng.bluemix.net/catalog/services/dashdb/)
プログラマの考えが・・身につく本より：ルーンチェックサムの検証（可変長）その２


Pythonでプログラミング入門中
[前回](http://qiita.com/teratera/items/387be64bd9b40971cd38)より引き続き

前回やった部分の流用がほとんどになりそうですが、
前回解決したことといえば、

・６桁の識別番号を標準入力から取得
・取得した６桁の識別番号を足し合わせる（以下特殊事項）
（６桁の中で奇数桁には２を乗算し、乗算の計算結果が２桁の場合は各桁を個別に分けて
　足し合わせる）

ここで次の問題になりますが、当初からの問題では『任意の桁数』となっており
６桁の数字とは限らないということ。

<h1>任意の長さの識別番号に対応するコード</h1>
書籍での解答はC++でASCII文字コードによる入出力結果の数字で判断しています。
（ASCII文字コードの”改行”を取得した場合にループを終了させる）

書籍解答

```cpp
char digit;
int checksum = 0;
int position = 1;
cout << "Enter a number with an even number of digits: ";
digit = cin.get();
while(digit != 10) {
    if (position % 2 == 1) checksum += digit - '0';###奇数番目はそのまま
    else checksum += doubleDigitValue(digit - '0');###偶数番目を2倍
    digit = cin.get();
    position++;
}

cout << "Checksum is " << checksum << ". \n";
if (checksum % 10 == 0){
    cout << "Checksum is divisible by 10. Valid. \n";
}else{
    cout << "Checksum is not divisible by 10. Invalid. \n";
}
・・・

```


<h1>自分の解答</h1>
コメントをいただいた部分を参考に変更しています。
（また、本来の問題では奇数番目を２倍していますが、最初の課題では偶数番目を２倍と
なっており、尚　ルーンチェックサムアルゴリズムの参考サイトでも同じく偶数番目を２倍となっているので
その点、変更しています）

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

import sys
from ConsoleOut import cout
from test import doubleDigitValue


def number():
    checksum = 0
    position = 0
    cout << "Enter a number with an even number of digits:"
digits = input()
    while position < len(digits):
        digits = digits[position]
        if position % 2 == 1:
            checksum += int(digit)
        else:
            checksum += doubleDigitValue(int(digit))
        position += 1
            
    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalud. \n"

・・・(ターミナル出力結果)
>>> from test02 import number
>>> number()
Enter a number with an even number of digits:49927398716
Checksum is 70. 
Checksum is divisible by 10. Valid .


```

入力された文字数の合計をだしてその奇数番目を見つける方法で考えていたのですが、
前回コメントいただいていた偶数のみと奇数のみというとてもシンプルでわかり易い方法を
教えて頂いていたので利用させて頂きました。

また、標準入力では教えていただいたraw_input()も利用してみようと
試みましたが、自分がPython3.5を使っていた為、NameErrorになってしまい、
Python3では sys.stdin.readline() を使えと参考サイトにあったので
試したのですが、これがうまくいかず前回のままのコードです。

こちらの記事に[「Python Tips：標準入力から文字列を取得したい」](http://www.lifewithpython.com/2014/05/python-get-stdin-standard-input.html)sys.stdin.readline()の使い方がありました。
レスポンシブサイトのjsを使ったUA振り分けについての考察１


#レスポンシブサイトのjsを使ったUA振り分けについての考察

まずviewportのブラウザの挙動について説明していきます。

##ブラウザの挙動について

###viewportの指定による基本的な挙動

####①指定が数値の幅の場合

```lang:metaタグ
<meta name="viewport" content="width=1280">
```

描画直後からスマートフォンやタブレットでは画面幅1280pxとしてレンダリングされます。

*※この指定での注意*
androidのchromeにて、一部の端末でfont-sizeがおかしくなる。
[AndroidのChromeでフォントサイズが大きくなってしまう不具合は「max-height」で解決するかも](http://www.seomode.jp/html-css/2014/06/25/3339/)


####②viewport指定がdevice-widthの幅の場合

```lang:metaタグ
<meta name="viewport" content="width=device-width">
```
描画直後からスマートフォンやタブレットでは画面幅は端末で設定されたdevice pixel ratioでの幅としてレンダリングされます。


###viewportのwidth以外のパラメータによる固有挙動

####viewport指定がスケールをさせないの場合

```lang:metaタグ
<meta name="viewport" content="width=device-width,user-scalable=no">
```

*※この指定での注意*
androidの端末ではscale不可するとwidthは何を指定してもdevice-widthに固定される


####viewportをdpiでのコントロールしたいの場合

```lang:metaタグ
<meta name="viewport" content="width=target-densitydpi=device-dpi">
```

*※この指定での注意*
iOSはインスペクタでそんなパラメータはないとコンソールが出て効かない。


###javascriprtによるviewportの書き換え

####viewport指定がスケールをさせないの場合

```lang:metaタグ
<meta name="viewport" id="viewpot" content="width=1280">
```

```lang:javascript
document.getElementById('viewport').setAttribute('content','width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no');
```

metaタグにIDを振ってcontentを書き換えるように記述する。
このスクリプトは、いつ発火されても、metaが書き換えられれば、cssはそれに伴って再描画が始まる。

*※この指定での注意*
htmlのmetaタグには元から初期値にuser-scalableは入れない。androidの一部端末で書き換えても変わらなくなるため。
reveal-ckを使ってmarkdownでスライドを作る

# reveal.jsとは

reveal.jsはHTMLでWebスライドを作ることのできるフレームワークです。
htmlで記述する以外にmarkdownを用いて記述することも可能であり，手軽にスライドを作成できることが利点です。

# reveal-ckとは

reveal-ckはreveal.jsを利用したmarkdownによるスライド作成をより効率的にするツールです。

reveal.jsでWebスライドを作る際には以下の手順が基本になると思います。

* テキストエディタ等でhtml/markdownでスライドを記述
* 編集した内容をブラウザで確認
* 編集が書き換えたらブラウザ側でページを更新

わざわざブラウザでローカルのhtmlを開いたり，編集後に毎回更新するのは面倒であるためgrunt等のタスク管理システムを用いて自動化するのが一般的ですが，スライドを簡単に作るためだけにそれらの環境を整えるのは（初回の環境設定という意味で）慣れていないと大変だったりします。

reveal-ckはそういったhtmlの自動生成やLiveReloadを含めたツールであるため，タスク管理システムを用いることなくreveal-ckだけでmarkdownによる効率的なスライド作成の環境を作ることが出来ます。

# 環境

私が導入を行った環境です

* OSX Yosemite 10.10.5
* gem 2.6.1

gemはインストール済みと想定して話を進めます。

# reveal-ckのインストール

```
gem install reveal-ck
```
インストールができたか確認

```
reveal-ck --version
```

# スライドの生成

slides.mdにスライドを記述していきます。

```
mkdir myslide
cd myslide
echo "# Hello myslide :smile:" > slides.md
```

slides.mdからhtmlのスライドを生成します。

```
reveal-ck generate
```

serveでslides.mdの編集を監視して，ライブリロードを行います。

```
reveal-ck serve
```

http://localhost:10000 にアクセスすればスライドがプレビューできるはずです。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/102294/676d876b-a4af-5f13-ab51-d545471ea1b1.png)

これでテキストエディタ等でslides.mdを編集して，ブラウザでプレビューしながらスライドを作成できます。

# スライドの設定

スライドのタイトルや，テーマ/トランジションの変更はconfig.ymlを作成し，設定項目を編集することで可能です。

```yaml
theme:      "night"
transition: "page"
author:     "Hoge"
title:      "Hello myslide"
```

トランジションは [reveal.js-transitions](http://lab.hakim.se/reveal-js/#/transitions)を，テーマは [reveal.js-themes](http://lab.hakim.se/reveal-js/#/themes)を参考に設定してください。

# pdfでの出力

reveal.jsと同様にURLの末尾に?print-pdfを追加し，ブラウザの印刷機能からpdf出力を行うことで可能です。

![slide_pdf.png](https://qiita-image-store.s3.amazonaws.com/0/102294/3d387005-7d11-3c96-7320-f4aa66e32b96.png)

# 参考URL

[reveal.js + markdownでスライドを作る時は reveal-ck が便利だった](http://sue445.hatenablog.com/entry/2015/10/03/201241)
Gulp で Jade の extends, include ファイルを更新する時のブラウザリロードを効率化

jade の extends, include ファイルを更新時は全てのファイルをコンパイルする必要ある。
でもブラウザリロードが何回も発生したり、現在表示しているページのコンパイルタイミングが後になることも。
さらにはブラウザリロードが重なって、現在表示しているページのブラウザリロードが上手くいかないなんてこともある。

大量の html ファイルを出力する場合だとこの問題は結構つらい。
折角 extends、include で効率化してるのに、確認に時間がかかっちゃう。

ってことで extends, include を更新した場合は
gulp を起動（watch）して最後に表示したページの jade ファイルをはじめにコンパイル＆ブラウザリロードして、それ以外の jade ファイルをコンパイルだけするって方法をとることにした。

これで表示確認もすぐできて、かつ裏で残りのファイルのコンパイルが進むので、きっとみんな幸せになれるはず。


## ディレクトリ構成

```
┬ htdocs
└ jade ──┬ extends
         ├ includes
         └ src
```


## gulpfile
babel で書いています。

```js:gulpfile.babel.js
// モジュールの読み込み
const gulp        = require('gulp');
const gulpif      = require('gulp-if');
const { join }    = require('path');
const watch       = require('gulp-watch');
const browserSync = require('browser-sync').create();
const jade        = require('jade');
const cache       = require('gulp-cached');


// 現在表示しているページの情報
let viewingPage = '';


// デフォルトタスク
gulp.task('default', [ 'watch', 'browser-sync', 'jade' ]);


// 監視
gulp.task('watch', () => {
  watch('jade/src/**/*.jade', { ignoreInitial: false }, () => gulp.start('jade'));
  watch('jade/!(src)/**/*.jade', { ignoreInitial: false }, () => gulp.start('jade-all'));

  watch('htdocs/**/*.html', { ignoreInitial: false }, (file) => {
    const page = viewingPage ? join(__dirname, 'htdocs', viewingPage) : '*.html';

    gulp.src(file.path)
      .pipe(gulpif(page, browserSync.reload()));
  });
});


// ローカルサーバー
gulp.task('browser-sync', () => {
  browserSync.init({
    server: {
      middleware: (req, res, next) => {
        const url = req.url.match(/^.*\/(.+\.html)?$/);
        if(url) {
          if(url[0].match(/\/$/)) {
            viewingPage = `${ url[0] }index.html`;
          } else {
            viewingPage = url[0];
          }
        }
        next();
      },
    },
  });
});


// jade のコンパイル

gulp.task('jade', () => {
  jadeTask('jade/src/**/*.jade', 'htdocs', true);
});

gulp.task('jade-all', () => {
  if(viewingPage) {
    const path = `${ viewingPage.match(/^(.+)\.html$/)[1] }.jade`;
    const dest = viewingPage.match(/^(.*\/).+\.html$/)[1];
    jadeTask(join('jade/src', path), join('htdocs', dest), false);
    jadeTask(['jade/src/**/*.jade', `!${ join('htdocs', path) }`], 'htdocs', false);
  } else {
    jadeTask('jade/src/**/*.jade', 'htdocs', false);
  }
});

const jadeTask = (srcPath, destPath, isSrcDirUpdate) => {
  return gulp.src(srcPath)
    .pipe(gulpif(isSrcDirUpdate, cache('jade')))
    .pipe(gulpJade())
    .pipe(gulp.dest(destPath));
};
```
とりあえず関係している部分だけ適当にコピって最小構成にしただけなので、なんか抜けたり間違ってたりするかも。。。
あと、ひととおりの動きを確認しただけなのでバグもあるかも。

本当はコンパイルするファイルも更新したファイルに関係するものだけに絞りたいんだけど、
extends の extends とかあったりするから、結構大変そうだと思ってやってない。
そこまで出来れば最高だね。
vimでUTF-8のCSVにBOMをセットする方法

最近UTF-8のCSVをエクセルで開きたいという状況が発生して、エクセルだとただのUTF-8だと文字化けを起こしてしまい、BOMというものを付けると文字化けしないで表示出来るとのことでした。

私はMacを使っていて簡単に出来る方法がないか調べたところvimを使うと良さそうでした。

vimでファイルを開きコマンドモードの時に下記のコマンドを入力して保存するとBOMがセットされます。

```
:se fenc=utf-8 bomb
```

lessでファイルを開くと、一行目に`<U+FEFF>`が付くことが確認できます
android-sdkでこんなエラーがでたとき

Done. Nothing was installed.
Downloading Google Admob Ads Sdk package, revision 1
File not found: C:¥Program Files¥Android¥android-sdk¥temp¥googleadmobadssdkandroid-4.0.4.zip (アクセスが拒否されました。)

「SDK Manager.exe」を右クリックし「管理者として実行」とするとうまくいく
Mongoidで属性を変更してから他の属性をupdate_attribute

Mongoidである属性(my_field)を変更してからsaveを行わないでおく。
その状態で別のフィールドをupdate_attributeした際に、同時にmy_fieldまで更新した値に保存される。

```rb
m = MyModel.first
m.my_field = "a"               # my_fieldの値はaにセットしたが、保存はしていない
s.update_attribute(:b, 1234)   # bのみを変更したつもりだが、、、
s.reload.my_field
# => "a"                       # my_fieldの値も一緒に更新される
```

Mongoid 4.0.1 で確認
プログラマーとしての心得


<a href="http://d.hatena.ne.jp/takehikom/20100310/1268166625" target="_blank">プログラミング能力アップのために - わさっき</a>
- できる人を観察する
- ムダを減らす
- 正解・不正解ではなく、成功・不成功で考える（理由をつける）
- 動作原理を学び、日本語を表す
- 常に学ぶ
レスポンシブ対応の考察

#レスポンシブ対応の考察

レスポンシブ対応＝media-queryみたいなイメージがついてるが、
html枚で、端末毎に最適された画面が表示される対応のことである。
必ずしも、PCブラウザで画面サイズで変わるようにする必要性はない。

##レスポンシブ有効性

### 利点
- アクセス数の別URLによる分散が少ない。以下のような記述も必要なく設定ミスのリスクも低い

```lang:filename
<link rel="alternate" media="only screen and (max-width: 767px)" href="http://www.●●●.●●.jp/index.html">
```

- テキストなどの更新作業が一箇所になるため、作業漏れが少ない。


### 欠点

- アクセス端末以外のサイトを見ることは基本できない。（SP⇄PCができない）
- デザインによっては、CSSを上書きしながら作成する必要があるため、画面によってレイアウトがバラつく、レイアウト更新性が低くなる


##方法について

###① media-query利用
#### **利点**：

- jsを使わずに画面サイズの判別だけで作れる。

#### **欠点**：

- 画面幅だけの判断なので、タブレットとスマートフォンの中間を
補うのに手間がいる。これに伴ってoreantationchangeとresizeの使い分けなど、逆に後から複雑な調整を必要となることもある。
- media-queryの判別はclassを指定したものより描画が遅い。
- タブレットやスマートフォンの画面回転で表示がPCとスマフォという混在が起こる場合がある。


###② UA判定

#### **利点**：
- UAの判別ルールを理解していれば、そのルールが変わらない限り振り分けはスマートフォン、タブレット、PCと正確に分けられる

#### **欠点**：
- jsを切ると起点にしている画面しか表示されない。
AdminLTE テンプレート作成

簡易テンプレを作成しました。

# ロジック部分

data.py

```
#!/usr/bin/python
# -*- coding: utf-8 -*-

import csv
import codecs

#print "Content-type: text/html"
#print

reader = csv.reader(open('data.csv', 'r'))
#header = next(reader)

data = []
for rows in reader:
    data.append(rows)

#f.close()

lines = open('data_test.html').read()

table_data = ''
for d in data:
    s = '<tr><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>'.format(
            d[0]+d[1]+d[2], d[3], d[4], d[5], d[6])
    table_data = table_data + s

lines = lines.replace('{{replacement_example1}}', table_data)
print lines
```

# テンプレート部分

data.html

```
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
  {{replacement_example1}}
  </body>
</html>
```

# データ部分

data.csv

```
2016年4月17日,14時41分ごろ,2016年4月17日,14時44分,熊本県熊本地方,3.5,3
2016年4月17日,14時10分ごろ,2016年4月17日,14時15分,熊本県熊本地方,2.7,3
2016年4月17日,13時38分ごろ,2016年4月17日,13時43分,熊本県熊本地方,3.8,3
```
Mac  | 「標準の英和辞典」を使って英語のウェブドキュメントを読む > GoogleChrome / Safari の例

右クリックを使うと。
ウェブページ等で Mac 標準の「英和/和英辞書」が引ける。

知らなかった。

( ブラウザ に限らず、他にも各種アプリが対応しているようだ )

# 単語を右クリックして"「○○」を検索』"を選ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/30fc64e6-1714-f38a-7a60-8750f490641e.png)

# 辞書があらわる

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/fa0ae85b-d572-a561-8ec7-97b282276650.png)

# Safari の場合

「○○を調べる」という表現なので分かりやすい。が同じ機能だ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/f2d1f6d9-55fc-fa82-4416-9cdefd9848b6.png)


# 問題

Mac でうまく動く Google Chrome の翻訳拡張がなかった。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
homebrew入れてる場合のsublime textでのnodeパス

nodeパスがちがってHTMLPrettifyなどが動かないのでメモ


私の環境では

```json:HTMLPrettify.sublime-settings
"osx": "/usr/local/node"
```
ではなく

```json:HTMLPrettify.sublime-settings
"osx": "$HOME/.nodebrew/current/bin/node"
```

環境により違うようです
[Rails] 現在のURLにパラメータをマージする

既存のパラメータを維持しつつ、かつ現在のURLにリクエストをしたい場合

```rb
url_for(params.merge(hoge: 'fuga'))
```

既存パラメータを削除する場合は

```rb
url_for(params.merge(hoge: nil))
```
メモリを使いすぎたPHPから無理やり解放させる

# 環境：CentOS7 + apache2.4(prefork) + PHP5.4

## 現象

* PHPの処理が終了してもメモリの使用量が回復しない画面（処理）がある。
* MaxRequestsPerChildに達するとapacheのプロセスが終了してメモリ使用量も回復するが、特定の画面だけでその現象が発生しているため、時にはMaxRequestsPerChildに達する前にサーバーのメモリを使い切ることがある。
* というか、複数プロセスあるんだから、普通はそうだよね。
* ぶっちゃけメモリリークなんだろうけど、発生個所が曖昧なのと、特定環境でのみしか発生しないため、調査が難航。

## 理想

* PHP処理が終了したら、PHPが使ったメモリを解放する。

## 現実

* `unset`や循環参照の怪しそうなところを潰してみたけれど、環境によって発生コードが異なっていて、そもそもの根本原因がわからない状態なので、どこまで対応すれば完了と言えるのかの根拠がない（運用に乗せられない）。

## 迷走

* MaxRequestsPerChildを1にする  
⇒メモリを大して使わないPHPや、js、css等へのリクエストにも毎回子プロセスを生成するのはパフォーマンスが心配
* 定期的にapacheの再起動を行う  
⇒定期的って具体的にいつよ？（少なくとも1日1回夜間に再起動のペースでは間に合わない）

その他、MaxRequestsPerChild=1用のapacheと通常のapacheを用意するとか考えはしましたが、変更点が多くなり影響範囲が広がりすぎるので断念。

## 採択

* メモリをたくさん使う（ことのある）画面については特定できているので、メモリをたくさん使った場合はMaxRequestsPerChildの値に関係なく、そこでプロセスを終了として、apacheが確保したメモリを解放させる。
* 分かりやすく言うと、太ったPHPに自殺させます。

### 強制解放

> http://php.net/manual/ja/function.apache-child-terminate.php
> `apache_child_terminate()`

ただし、

> もし PHP が Apache 1 モジュールとして実行している場合、TRUE を返します。 

これが原因なのか、メモリは回復せず。

### 真・強制解放

```php
function mightRelease(){
    //メモリ解放閾値：この値以上にメモリが使われていた場合はプロセスを落とす
    $memory_byte_threshold = 1024 * 1024 * 200;
        
    $memory_byte_usage = memory_get_peak_usage(true);
    if($memory_byte_usage > $memory_byte_threshold){
        //処理終了時に実行する関数を登録
        register_shutdown_function(function(){
            posix_kill(getmypid(), 28);
        });
    }
}
```

この関数をpostExecute的なところで呼び出す。
200MB以上使った画面だけ、プロセスが終了し、メモリが解放されていることを確認。
終了した直後は子プロセス数は減るが、数秒後にはちゃんと規定数まで増えていることも確認。
Macでアプリケーションソフトの上部が枠外（画面の外）に出て動かせなくなった時の対処法


デュアルディスプレイでよく起きるそうで、
photoshopのてっぺんが画面の外に出てしまい、動かせなくなったことが有りました。

![スクリーンショット 2016-04-18 12.20.17.png](https://qiita-image-store.s3.amazonaws.com/0/40940/910b81ba-5997-f9f1-cc99-9ce6e206fab5.png "スクリーンショット 2016-04-18 12.20.17.png")


ソフトを入れるとか、
ググったところ、デュアルディスプレイをやめる（線を引っこ抜く）とか、
いろいろ方法があるとは思いますが、私は以下で直りました。

###システム環境設定 ＞ ディスプレイ
![スクリーンショット 2016-04-18 12.12.11.png](https://qiita-image-store.s3.amazonaws.com/0/40940/e67ed94f-60ed-1816-3235-cdf4be7d6690.png "スクリーンショット 2016-04-18 12.12.11.png")
![スクリーンショット 2016-04-18 12.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/40940/cb20d954-c001-d93c-a0aa-1e6a0c49e908.png "スクリーンショット 2016-04-18 12.11.36.png")

で、
ディスプレイを回転させると(90度とか)、アプリケーションのてっぺん（上部）に触れるチャンスが訪れます。

![スクリーンショット 2016-04-18 12.11.45.png](https://qiita-image-store.s3.amazonaws.com/0/40940/937b058e-5bc0-c0d8-d5b3-8f1fd3ab6fef.png "スクリーンショット 2016-04-18 12.11.45.png")

あとは、急いでアプリケーションを下に動かして、元に戻れば、OK.
ただ、画面が90度横になってしまうので、アプリケーションの位置が動かしづらいです（汗）

![スクリーンショット 2016-04-18 12.22.37.png](https://qiita-image-store.s3.amazonaws.com/0/40940/b6b34000-1c26-97e1-d3e6-f6d7963977a1.png "スクリーンショット 2016-04-18 12.22.37.png")
JavaScriptでHTTP/HTTPSアクセス・スクレイピングをする

JavaScriptでHTTP/HTTPSアクセスをする場合、どうすればいいのか。[request/request](https://github.com/request/request)や[visionmedia/superagent](https://github.com/visionmedia/superagent)あたりが有名どころでしょうか。でもこれらを使っている時に割と困ることはあります。cookie? form? encode? header? json? xml?

しかし、[Node.jsでスクレイピングするならば - プログラマでありたい](http://blog.takuros.net/entry/2016/04/18/080157) という記事でなるほどと思いました。request や superagent で面倒な事は、より高度な対応ができる [cheeriojs/cheerio](https://github.com/cheeriojs/cheerio)や[ktty1220/cheerio-httpcli](https://github.com/ktty1220/cheerio-httpcli)や[srveit/mechanize-js](https://github.com/srveit/mechanize-js) を使えばいいのです。

## 基本的な考え方

1. 単純なAPIアクセスにはrequestかsuperagentを使う
2. それ以外の用途は全てcheerioかcheerio-httpcliかmechanize-jsを使う

という考え方でいけば話は実に簡単になるのではないでしょうか。

ここでは個人的偏見により、requestのPromise版であるrequest-promiseとcheerio-httpcliに決め打ちしていきます。

## request-promise

requestには派生系として、Promiseに対応したrequest-promiseというライブラリがあります。今の時代ではもう皆さん、最低でもES2015かTypeScriptを使っていると思いますので、旧態依然としたインターフェースのrequestではなくPromiseで楽をしてしまいましょう。もっともrequest-promise自体はbluebirdを使って古いJavaScriptでも動くのですが。

使い方はgithubのチートシートを見れば良いです。

* [GET something from a JSON REST API](https://github.com/request/request-promise#get-something-from-a-json-rest-api)
* [POST data to a JSON REST API](https://github.com/request/request-promise#post-data-to-a-json-rest-api)

これだけです。これ以外の用途にはcheerio-httpcliを使っちゃいましょう。

## cheerio-httpcli

[cheerio-httpcli](https://github.com/ktty1220/cheerio-httpcli) を読めば事足りるでしょう。どうやら、作者さんが大型バージョンアップの再には変更点をQiitaに投稿してらっしゃいます。[cheerio tag](http://qiita.com/tags/cheerio)を見ておけばいいと思います。

## まとめ

* request/superagentは複雑な事をしようとすると面倒が増えるので、単純なAPIアクセスにとどめる
* 複雑なことはもうmechanizeやcheerio-httpcliに任せてしまう
* 今の時代Promiseを使って、古いインターフェースやコールバック地獄から解放されましょう
* 僕はrequest-proimseとcheerio-httpcliに決め打ちしました

今後、このポリシーで困ったことがあったら追加で記事を書いたり、追記しようと思います。
Elixir: コマンドラインツールを作成する

# 手順
1. プロジェクトを作成する
2. エントリポイントとなるモジュールを作成する
3. mix.exsを編集する
4. ビルドを実行する
5. 動作確認をする

# プロジェクトを作成する

```ex
  > mix new my_cli
```

# エントリポイントとなるモジュールを作成する
エントリポイントとなるモジュールは, `main/1`という関数を含んでいること以外に
特に制約はないようです.
今回は, [ネタ元](http://www.amazon.co.jp/Programming-Elixir-Functional-Concurrent-Pragmatic/dp/1937785580)にしたがって, lib/my_cli/cli.exに作ることにします.

```ex:lib/my_cli/cli.ex
defmodule MyCli.CLI do

  @moduledoc """
  this is my command line tool module
  """

  def main(argv) do
    IO.puts "this is my command line tool"
    IO.inspect argv
  end

end
```

# mix.exsを編集する
mix.exsを編集し, escriptから先ほど作成したモジュールが呼び出されるように設定します.
escriptはerlangのプログラムをコマンドラインツールとして使う際に使うコマンドのようですが
詳しくは説明できないので, 説明は省略します.


```mix.exs
defmodule MyCli.Mixfile do
  use Mix.Project

  def project do
    [app: :my_cli,
     version: "0.0.1",
     elixir: "~> 1.3-dev",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps,
     escript: escript_config #<-add
    ]
  end

  ...
  ...

  # add
  def escript_config do
    [ main_module: MyCli.CLI ]
  end
end
```

# ビルドを実行する
mixコマンドを作ってビルドを行います.
使うコマンドは`mix escript.build`です

```
$ mix escript.build
Compiled lib/my_cli.ex
Compiled lib/my_cli/cli.ex
Generated my_cli app
Consolidated List.Chars
Consolidated String.Chars
Consolidated Collectable
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect
Generated escript my_cli with MIX_ENV=dev
$
$ ls -al
total 2394
drwxrwxr-x   6 vagrant        vagrant      113 2016-04-18 11:52 .
drwx------  18 vagrant        vagrant     4096 2016-04-18 10:58 ..
-rw-rw-r--   1 vagrant        vagrant       41 2016-04-18 10:58 .gitignore
-rw-rw-r--   1 vagrant        vagrant      422 2016-04-18 10:58 README.md
drwxrwxr-x   3 vagrant        vagrant       16 2016-04-18 11:04 _build
drwxrwxr-x   2 vagrant        vagrant       23 2016-04-18 10:58 config
drwxrwxr-x   3 vagrant        vagrant       53 2016-04-18 10:59 lib
-rw-rw-r--   1 vagrant        vagrant      766 2016-04-18 11:52 mix.exs
-rwxrwxr-x   1 vagrant        vagrant  2446124 2016-04-18 11:52 my_cli #<-- 作成された実行ファイル
drwxrwxr-x   2 vagrant        vagrant       50 2016-04-18 10:58 test
```

# 動作確認をする
```
$ ./my_cli hoge -h --verbose true
this is my command line tool
["hoge", "-h", "--verbose", "true"]
```

見ての通り, コマンドに対する引数やオプションは, リストとしてmain関数への引数として渡されるので
あとはこれらの情報を使ってよしなに処理してください.

なお, コマンドライン引数の処理については, [OptionParser](http://elixir-lang.org/docs/stable/elixir/OptionParser.html)というモジュールが標準で用意されているので, こちらを使うのが良いようです.

```ex
iex(2)> OptionParser.parse ["hoge", "-h", "--verbose", "true"], aliases: [h: :help]
OptionParser.parse ["hoge", "-h", "--verbose", "true"], aliases: [h: :help]
{[help: true, verbose: "true"], ["hoge"], []}
```

# 参考
Programming Elixir: Functional, Concurrent, Pragmatic, Fun : http://www.amazon.co.jp/Programming-Elixir-Functional-Concurrent-Pragmatic/dp/1937785580

OptionParser: http://elixir-lang.org/docs/stable/elixir/OptionParser.html
ElixirでThriftの簡易サーバーのRiffed.Serverを使ってみた

[以前の投稿](http://qiita.com/letusfly85/items/93695c4ab8b0b7a914d2)で、Elixirでthriftの構造体を定義しました。

その際に利用したライブラリ[riffed](https://github.com/pinterest/riffed)が提供している以下の３つの機能のうち、最後に１つを利用してみました。

1. thriftコードから、erlangのコードを自動生成するMixタスク[mix compile.thrift]を提供
2. Riffed.Structを利用して、thriftで定義、erlangで生成した構造体にElixirからアクセスできる機能を提供
3. Riffed.Server, Riffed.Clientを提供することで、生成したコードを利用したデータ通信の簡易サーバを簡単に構築できる機能を提供

サンプルのリポジトリは以下になります。

* https://github.com/letusfly85/use_elixir_thrift

---

### 1. thrift構造体の用意

以下の構造体を用意しました。

```thrift
struct MyChatMessage
{
  1: i32 senderId,
  2: i32 recieverId,
  3: string message
}

service MyChatService
{
  void sendMessage(1: i32 senderId, 2: i32 recieverId, 3: string message);
  void recieveMessage(1: i32 senderId, 2: i32 recieverId, 3: string message);
}
```

### 2. mix compile.thriftでerlangコードを生成

ここはサブタイトルそのままです。
プロジェクト直下に、`src`フォルダが出来上がります。

### 3. Server, Client, Handler, Modelの４つの役割を持ったexファイルを実装

[riffedのexampleフォルダ](https://github.com/pinterest/riffed/tree/master/examples/tutorial)を参照しながら実装しました。

* https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_server.ex
* https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_client.ex
* https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_handler.ex
* https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_message.ex

### 4. 動かしてみる

terminalを２つ立ち上げます。

* __terminal1__

ServerとHandlerを立ち上げます。
これで2112ポートで待ち受けが始まります。

```ex
iex(1)> UseElixirThrift.MyChatServer.start_link
11:08:25.795 [info]  thrift service listening on port 2112
{:ok, #PID<0.191.0>}

iex(2)> UseElixirThrift.MyChatHandler.start_link
{:ok, #PID<0.200.0>}
```



* __terminal2__

Clientを立ち上げます

```ex
iex(1)> UseElixirThrift.MyChatClient.start_link
{:ok, #PID<0.195.0>}
```

__terminal2__ から、sendMessageメソッドを読んでみます。

```ex
iex(2)>UseElixirThrift.MyChatClient.sendMessage(1, 2, "test")
:ok
```

すると __terminal1__ 側では以下のように出力されます。

```ex
"got a message: test"
```

### 5. ユースケースを考えてみる

こいつ自体を利用して以下のような用途で利用可能かを探ってみようと思います。

* Cassandraにレコード登録できるかどうか
* Zipkin操作できるか
* 他言語のThrift Server/Clientとの併用が可能か

---

本日は以上となります。
Cronを使う


# crondのステータスを確認
```
$ /etc/rc.d/init.d/crond status
crond (pid  1491) を実行中...
```

* 設定の更新は自動で読みに来てくれるので、起動さえしていれば問題ない

# cronの設定
```
# vi /etc/crontab
```

* 「crontab -e」を使う方法もあるが、一元管理するならcrontabを使ったほうがよさげ
* 単純な定期実行であれば、下記に設定するほうが推奨らしい
  * /etc/cron.daily
  * /etc/cron.weekly
  * /etc/cron.monthly

## メールを飛ばさないようにする

```bash
* * * * * [User] [Command] >/dev/null 2>&1
```

* 情報が失われるので、別途適切にログ等を出力させる必要あり

# 動作確認

## ログを見る
```
/var/log/cron
```
* クーロンが実行されたか
* 設定ファイルをリロードしたか

```
/var/spool/mail/{User}
```
* メール飛ばしている場合

```
/var/spool/cron/{User}
```
* crontabコマンドで指定している場合

### トラブルシュート
上手く動かない時は、↓あたりを疑うとよい

* 環境変数
* 権限

# その他
* 実行ディレクトリはcrontabの場合HOMEに指定したディレクトリになる
* 外部ファイル化することもできるらしい
  * 構成管理を考えるとそのほうがいいのかも？

# 参考
* [crontab.guru](http://crontab.guru/)
  * cronの書き方など調べるときに 
* [crontab -e は「絶対に」使ってはいけない](http://d.hatena.ne.jp/ozuma/20120711/1342014448)
* [cron上でのコマンド実行を再現する](http://qiita.com/nog/items/0e9ab97cf59d82cdf6be)
* [crontabの書き方と安全な使い方](http://furudate.hatenablog.com/entry/2014/10/28/182336)
javaのbuild.xml　コンパイルオプション debuglevel, includeantruntime

##javaのbuild.xmlのコンパイルオプションについて調べた結果メモ

###debuglevel
参考ページ
[スタックトレース　コンパイルオプション-g](http://music.geocities.jp/kreisler_liebesleid/java/stackTrace.html)

コンパイルオプション-gのキーワードでした。
debug="true"
にした上で、
debuglevel="lines,var,source"
にすると、スタックトレースにデバッグ情報がのるようになります。
・source　ソースファイルのデバッグ情報
・lines　行番号のデバッグ情報
・vars　局所変数のデバッグ情報

###includeantruntime
参考ページ
[Ant で javac して実行可能 jar を生成させるための build.xml](http://www.my-notebook.net/d9988b8e-3f7f-484e-ae52-618aeae31865.html)
[Ant 1.8から出るincludeAntRuntimeに関するワーニング](http://epian-wiki.appspot.com/wiki/Memo/20100822030535/Ant%201.8%E3%81%8B%E3%82%89%E5%87%BA%E3%82%8BincludeAntRuntime%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%AF%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)

includeantruntime 属性を指定しないと warning が出るようになったらしい。
includeantruntime="false"
にします。
AuroraとRDS MySQL 5.7のsysbench

[この記事](http://qiita.com/pakotan/items/1db981611ead66ce2c8b)を見て、結果に疑問を持ったので、AuroraとRDS MySQL 5.7のベンチマークを取ってみました。

# 動作環境
* サーバ
    * Aurora 5.6.10a / db.r3.large / SingleAZ
    * MySQL 5.7.10 / db.r3.large / SingleAZ
        * io1 / 100GB / 1000iops
    * 設定はそれぞれ以下を変更
        * `sync_binlog = 0`
        * `innodb_flush_log_at_trx_commit = 2`
* クライアント
    * 4.1.17-22.30.amzn1.x86_64 / c4.2xlarge
    * sysbench 0.4.12
* サーバとクライアントはすべて同じAZ
* 並列数を高くできるように以下の値を増やした
    * max_connections
    * max_prepared_stmt_count
    * nofile

# テストスクリプト

* `--oltp-table-size=100000000`
* `--num-threads`は1,000〜8,000

## 初期データの投入

```bash
#!/bin/bash
MYSQL_HOST=...

sysbench \
  --test=oltp \
  --db-driver=mysql \
  --oltp-table-size=100000000 \
  --mysql-host=$MYSQL_HOST \
  --mysql-user=sbtest \
  --mysql-password=sbtest \
  --mysql-db=sbtest \
  --mysql-table-engine=innodb \
  prepare
```

## ベンチマーク

```bash
#!/bin/bash
MYSQL_HOST=...

sysbench \
  --test=oltp \
  --db-driver=mysql \
  --oltp-table-size=100000000 \
  --num-threads=$N \
  --mysql-host=$MYSQL_HOST \
  --mysql-user=sbtest \
  --mysql-password=sbtest \
  --mysql-db=sbtest \
  --mysql-table-engine=innodb \
  --oltp-read-only=off \
  --max-requests=0 \
  --max-time=60 \
  run
```

# 検証方法

* データのメモリへの載り具合でだいぶスループットが変わってくるので、Aurora・RDSともに`num-threads=100`の状態でスループットが頭打つまでsysbenchを実行
* 1,000〜8,000まで500きざみで並列数を増やしていく
* 一つの並列数で5回試行し、中央値を取る

# 結果

[2016/04/18 Aurora vs MySQL 5.7 sysbench](https://docs.google.com/spreadsheets/d/1HeBxXOBB3rcTWErZwdTfJzXRx1_oKm6pYxGDBNpo2sE/edit?usp=sharing)

![](https://docs.google.com/spreadsheets/d/1HeBxXOBB3rcTWErZwdTfJzXRx1_oKm6pYxGDBNpo2sE/pubchart?oid=1385866747&format=image)

|並列数|Aurora (r3.large)|RDS MySQL 5.7 (r3.large)|
|--:|--:|--:|
|1000|9,132|8,900|
|1500|9,001|8,565|
|2000|8,849|8,069|
|2500|8,709|8,112|
|3000|8,490|8,134|
|3500|8,344|7,950|
|4000|8,160|6,192|
|4500|7,992|4,580|
|5000|7,603|3,408|
|5500|7,658|3,084|
|6000|7,480|N/A|
|6500|7,267|N/A|
|7000|7,091|N/A|
|7500|6,745|N/A|
|8000|6,481|N/A|

# 所感
* Auroraが本領を発揮するのはクライアントが多い場合っぽい
* `oltp-read-only=on`にするとまた結果が変わりそう
* いままでPreparedStatementを使わないベンチマークをやっていたんですが、「並列性が高い」というAuroraの特性はどちらもあんまり変わらず
* 複数行取得するクエリが多かったんですが、一行だけ取得するクエリが多い場合でもまた結果変わりそう
Python覚書ファイルの更新日を取得する。



## os.stat
時間の取得について、ここでも書いていますが、もう少し書きます。
[Python覚書：テキスト参照して、対象ファイルをコピーしつつファイル名を編集する](http://qiita.com/h6rdworker/items/db89e91be836f6ab1146)


    >>> os.stat(file_path).st_mtime
    >>> 1442209206.0

変更された時刻が取得できる。でもこれは値のみ。

## datetime.datetime.fromtimestamp
datetime.datetime.fromtimestampで変換する。

    >>> datetime.datetime.fromtimestamp(os.stat(file_path).st_mtime)
    datetime.datetime(2015, 9, 14, 14, 40, 6)

## dt.strftime
さらにdt.strftimeで文字列に変換すれば出来上がり。

    >>> dt.strftime('%Y/%m/%d  %H:%M:%S')
    '2015/09/14  14:40:06'


パスから対象ファイルの日付を他のテキスト情報に書き出し処理。

```py:gettime.py
# -*- coding: shift-jis -*-
def main():
    pass

if __name__ == '__main__':
    main()

import os
import datetime
from datetime import datetime as dt

os.chdir(r"D:\temp")

txt_file = open(r"D:\temp\photo.txt","r")

for target_line in txt_file:
    if target_line == '\n':
        break

    target = target_line[:-1]
    file_name = os.path.basename(target_line)[:-1]

    print file_name

    if os.path.exists(target) :
        dt = datetime.datetime.fromtimestamp(os.stat(target).st_mtime)
        key = dt.strftime('%Y/%m/%d  %H:%M:%S')
        txt_file_out = open(r"D:\python\py_date\ipad_img_file_date.csv", "a+")
        txt_file_out.write(target + "," + file_name + "," + str(dt) + "," + key + "\n")

txt_file_out.close()
txt_file.close()
```



## エクセルでも似たような感じになる。
詳しくは後ほど。

    import xlrd
    year_b, month_b, day_b, hour_b, minute_b, second_b = xlrd.xldate_as_tuple(udtdate_ib,book.datemode)
    as_udtdate_ib = str(year_b) + '/' + str(month_b) + '/' + str(day_b)
linuxのコマンド履歴

### これまた、こうやって調べるんだ…って顔をされましたので。

linuxにおけるユーザのコマンド履歴は、ある程度追いかけられます。
逆に足跡を消す事も出来ます w
ただし、複数の窓で同時ログインしてた場合、どう記録されるかは知らない。

### ここにある。
~/.bash_history
/home/ユーザ名/.bash_history
/root/.bash_history

### 使う局面
他のユーザが、自分の操作を覚えてないけど不具合起こした、
そんな時に管理者がそのユーザの放ったコマンドを確認できます。
rrdtoolのrpnを試すコマンド


rrdtoolのrpnの検証用コマンドです。

rrdtool xport -s -0min DEF:test=/root/test.rrd:aaa:LAST CDEF:test2=test,POP,20,5,/ XPORT:test2

CDEF:test2の記述の中で、20,5,/の部分を、
任意のrpnに変えることで、結果を確認できます。

※上記のコマンドでは、rrdファイルのds-nameはaaaにしています。
　指定したrrdファイルにあわせて、ds-nameを変えてください。


rpnを試すために、CDEF:test2を記述します。

CDEF:test2=test,POP  という記述までは固定で、
必ずこれにしてください。
続く内容が、試したいrpnの記述になります。

CDEF:test2=test,POP,20,5,/ という記述で、
20を5で割る、という結果を確認できます。

上記rpnの記述で、以下の処理が行われます。
1、testの値を積む
2、値を1つ取り出す
3、20を積む
4、5を積む
5、値を2つ取り出して、除算し、結果を積む

5の処理の計算ですが、
2個目の値 / 1個目の値 という計算をします。
なので、
20 / 5 = 4となり、5の処理を行うと、4が積まれます。

rrdファイルが何でも良い、ということが、
test,POPの内容で分かったかと思います。
つまり、rrdファイルの内容は、test,POPの時点で
捨ててしまっているので、何でも良いのです。

XPORT:test2、で計算結果を画面に出力します。

rrdtool xportのオプションとして、-s -0minと
することで、出力するrowsを1行に絞っています。

-s -0minという指定で、startの時間に、
endと同じ時間を指定したことになります。

start、endの時間が同じとなるため、
取り出す行は1行になります。

以下コマンド実行結果

```
[root@localhost ~]# rrdtool xport -s -0min DEF:test=/root/test.rrd:aaa:LAST CDEF:test2=test,POP,20,5,/ XPORT:test2
<?xml version="1.0" encoding="ISO-8859-1"?>

<xport>
  <meta>
    <start>1460942760</start>
    <step>60</step>
    <end>1460942760</end>
    <rows>1</rows>
    <columns>1</columns>
    <legend>
      <entry></entry>
    </legend>
  </meta>
  <data>
    <row><t>1460942760</t><v>4.0000000000e+00</v></row>
  </data>
</xport>
[root@localhost ~]#
```
Linux機に他の人のアカウントを追加して仮パスワードを発行するまでの私のやり方

もうちょい最近のやり方を別記事に書きました

https://qiita.com/aokomoriuta/items/6a8c659f460b9c6fc0da

----

いっつも忘れて毎回全部調べてるのが面倒なのでメモがてら。

```bash
# 1. アカウント作成
$ sudo adduser <username>

# 2. 仮パスワード作成
$ sudo yum install expect
$ mkpasswd

# 3. 仮パスワード設定
$ sudo passwd <username>

# 4. 仮パスワードを期限切れにする（初回ログイン時に強制的にパスワードを変更させる）
$ sudo chage -d 0 <username>

# 5. （おまけ）グループ追加
$ sudo gpasswd -a <username> <groupname> 
```
elasticbeanstalkで作られたS3のBucketを削除できませんでした。

elasticbeanstalkで生成されたらS3のBucketを削除できませんでした＼(^o^)／

こいつの対応には、**バケットポリシーの編集**からポリシーの書き換えが必要らしいです。

<img width="727" alt="バケットポリシーの編集" src="https://qiita-image-store.s3.amazonaws.com/0/1624/4166b82b-c177-7ef4-c8c7-cdbe292cd220.png">

Jsonを編集します。

```json
{
  "Sid": "eb-50950a8d-feb6-11e2-11e0-0800277e041a",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": "s3:DeleteBucket",
  "Resource": "arn:aws:s3:::elasticbeanstalk-ap-northeast-1-392131151111"
}
```

EffectがDenyのところをAllowに書き換えた後に、削除するとBucketを削除できました(☝ ՞ਊ ՞)☝

# 参考
http://qiita.com/ariarijp/items/8a6a0fb4f41ebebde8c2