OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel5 で連続した値を持つビューを作る

## 概要

* [SQLで一か月分の日別のデータを作成する。｜スタッフブログ｜ビットスター株式会社 - ITにかかわる全てをご提供するIT企業](https://bitstar.jp/blog/sql%E3%81%A7%E4%B8%80%E3%81%8B%E6%9C%88%E5%88%86%E3%81%AE%E6%97%A5%E5%88%A5%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82/)

この記事に書かれているのと、ほぼ同じようなことを Laravel で行うために、0 から 9 までの値を持つテーブルと、1 から 500 までの値を持つビューを、マイグレーションとシーダーを使って作成したのでメモ。


## マイグレーションを使って 0 から 9 までの値を入れるテーブルを作成

```bash
$ php artisan make:migration create_digits_table --create=digits
```

```database/migrations/2016_04_15_000000_create_digits_table.php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateDigitsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('digits', function (Blueprint $table) {
            $table->integer('digit')->unsigned();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('digits');
    }
}
```

## シーダーを使って 0 から 9 までの値を挿入

```bash
$ artisan make:seeder DigitsTableSeeder
```

```database/seeds/DigitsTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class DigitsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $table = DB::table('digits');

        $table->truncate();

        foreach (range(0, 9) as $digit)
        {
            $table->insert([ 'digit' => $digit ]);
        }
    }
}
```

## マイグレーションを使って 1 から 500 までの値を持つビューを作成

```bash
$ php artisan make:migration create_sequence500_view
```

```database/migrations/2016_04_15_000000_create_sequence340_view.php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateSequence500View extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        if (DB::table('digits')->count() !== 10)
        {
            Artisan::call('db:seed', [ '--class' => 'DigitsTableSeeder' ]);
        }

        DB::statement('
            CREATE VIEW
                `vw_sequence500`
            AS
                SELECT
                    (`d1`.`digit` + (`d2`.`digit` * 10) + (`d3`.`digit` * 100)) AS `number`
                FROM
                    (`digits` AS `d1` JOIN `digits` AS `d2` JOIN `digits` AS `d3`)
                ORDER BY
                    `number`
                LIMIT
                    1, 500
        ');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement('DROP VIEW `vw_sequence500`');
    }
}
```

※ ビューを作る前にシーダーを実行するようにしている。

## マイグレーションを実行

```bash
$ php artisan migrate
```
AWS LambdaでEC2をまとめてスケジュール起動・停止してコスト削減してみた

普段、開発やテストで使っているEC2インスタンスが大量にあるので、インスタンスのスケジュール起動・停止をcronでおこない、できるだけコストを抑えて使っています。AWS Lambdaを全く触った事が無かったので、cronバッチから移行する良い機会だと考えAWS Lambda用に少し手を入れたので晒してみます。

##できること
**"開発などで利用しているインスタンスを、営業時間だけ起動したい"**、**"特定の曜日だけで定期的に起動したい"**といった事ができます。
インスタンスへの設定方法は、インスタンスのタグに設定ファイルに書いたタグを入れておくだけで、解除もタグ削除するだけです。

##準備
* python2.7, pipが実行できる環境
* AWSアクセスIDとシークレットキーを予め用意しておく。
* コードをDL [https://github.com/hidesakai/EC2Scheduler](https://github.com/hidesakai/EC2Scheduler)

ライブラリのbotoとpytzが必要なので、ec2_scheduler.pyと同一階層にインストールしておきます。

```shell-session
$ pip install boto -t path/to/ec2_scheduler/
$ pip install pytz -t path/to/ec2_scheduler/
```
設定ファイルのtag-key, tag-valueと同一のタグを持つインスタンスのみスケジュール実行される仕組みとなっている。スケジュール実行を止める場合は、タグを削除すればOK。

設定項目は以下(ファイル名は変更可)

```sh:schedule.cfg
[Develop]
region: ap-northeast-1 <= リージョン
type: daily <= 実行Type(dailyしか無いのでこのまま)
tag-key: AWS-Schedule <= インスタンスタグ名
tag-value: Dev-Weekday  <= タグ値
start: 9:00  <= 起動
stop: 19:00  <= 停止
skip: saturday, sunday <= スキップする日を曜日で指定
timezone: Asia/Tokyo  <= タイムゾーン指定

↓設定ファイル内に複数のスケジュール設定もできる
[TestServer]
region: ap-northeast-1
...
...
```

##実行するLambda Functionを用意

```python:lambda_function.py
# -*- coding: utf-8 -*-

from ec2_scheduler import EC2Scheduler

def lambda_handler(event, context):
    access_id = 'AWSアクセスID'
    secret_key = 'AWSシークレットキー'
    conf = 'schedule.cfg'

    schedule = EC2Scheduler(access_id=access_id, secret_key=secret_key, conf=conf)
    schedule.job()
```

Lambda Functionまで準備出来たら、用意したファイルをzipで圧縮する。(同じディレクトリで実行)

```shell-session
cd path/to/ec2_scheduler
zip -r ec2_scheduler.zip .
```
##AWS Lambdaの設定
AWSマネジメントコンソールのAWS LambdaでLambda Functionを新規作成
###[Lambda]
**[Create a Lambda function] -> [Python2.7] -> [lambda canary]** を選択
###[Configure event sources]
**[Event source type] -> [CloudWatch Events - Schedule]**を選択
**[Rule name]**に適宜名前を入れる
**[Schedule expression]**で実行スケジュールを選択
###[Configure function]
**[Name]**に適当な名前
**[Runtime] -> [Python 2.7]**
**[Lambda function code] -> [Upload a .ZIP file]**で事前に用意したzipファイルをアップロード
**[Handler\*]**にhandler名を入れる(例では「lambda_function.lambda_handler」)
**[Role] -> [Basic execution role]**
**[Advanced settings]** 適宜設定をする

あとは**[Create function]**で作成されるはず

Lambda Functionを作ったら、あとはTestで確認する。
Testがsucceededになるはずなので、あとは**[Event source]**でさっき設定したScheduleEventを**State Enabled**にすれば完了。
ipython notebook はじめのメモ

proxyサーバー環境

ipythonをブラウザで使うのに、ちょっとストレートに行かなかったのでメモ。

スタートメニューで
ipython notebook server
もしくはコマンドプロンプトで
`ipython notebook` 
起動する。

起動すると、
![image](https://qiita-image-store.s3.amazonaws.com/0/99215/605cdaf4-e7b6-43d4-5746-e87145eaa8ad.png)
こんなエラーが出る。

ブラウザのプロキシサーバの設定の問題だった。
https://msdn.microsoft.com/ja-jp/library/ee251335(v=bts.10).aspx
以下、引用
>http://localhost に接続できない

>原因 : [プロキシ サーバーを使用する] チェック ボックスはオンになっていますが、[ローカル アドレスにはプロキシ サーバーを使用しない] チェック ボックスがオンになっていません。
解決策 : [プロキシ サーバーを使用する] チェック ボックスはオンにしたまま、[ローカル アドレスにはプロキシ サーバーを使用しない] チェック ボックスをオンにします。

これで無事にipython nootbookがchromeブラウザに現れるようになったが、新しいノートを作成しようとすると、失敗する。
![image](https://qiita-image-store.s3.amazonaws.com/0/99215/5482da30-69e3-1342-fde4-7819c0d94848.png)

このサイト（http://stackoverflow.com/questions/28922881/error-failed-to-execute-send-on-xmlhttprequest-failed-to-load-file-ang）
によると、どうやらブラウザにファイルアクセスを許可する必要があるらしい。

>On Windows:
>chrome.exe --allow-file-access-from-files
or
>chrome.exe --allow-file-access-from-files --disable-web->security
On Mac:
>open /Applications/Google\ Chrome.app/ --args --allow-file-access-from-files

ということで、windows keyとrを同時押しして、「ファイル名を指名して実行」する
`chrome.exe --allow-file-access-from-files --disable-web-security`
でブラウザを開いてから、もう一度ipython nootbookを立ち上げると、新しいnoteboookを作成できた。

自分はこれを電卓代わりに使おうと思う。
![image](https://qiita-image-store.s3.amazonaws.com/0/99215/14b0f461-5611-add5-0b29-1cd74ba67909.png)
AFHTTPRequestOperationManagerをAFNetworking 3.x向けに変更する

翻訳したまま放置していましたが、以下のエントリからの続き。
個人的なメモにも近いものになると思います。

◆ AFNetworking 3.xへの対応
http://qiita.com/Takumi_Mori/items/4353f1d40b8d92b74a2c


## この記事の対象になる人
`AFHTTPRequestOperationManager`のサブクラスを独自に作っていて、
今回のAFNetworking3.xによる`NSOperationQueue`の削除によって書き換えが必要になった人
つまり、私です。
また、いまだにiOS6以前をサポートしないといけない方はそもそも`NSURLSession`が使えないので対象外です。

## AFHTTPSessionManagerを利用する
以下のように書き換えていきます。

- `AFHTTPRequestOperationManager`を継承していた箇所を、`AFHTTPSessionManager`に変更する
- `(AFHTTPRequestOperation *)`を戻り値にしている箇所は、`(NSURLSessionDataTask *)`が返ります。
- `HTTPRequestOperationWithRequest:success:failure:`は`dataTaskWithRequest:completionHandler`に変更します。


### ResponseSerializerを指定していた場合
`.responseSerializer`に対して`setAcceptableContentTypes`ができなくなっています。
以下のように、一度ResponseSerializerを作成して設定します。

```objc
id responseSerializer = [AFJSONResponseSerializer serializer];
[responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/html", @"application/json", nil]];
self.sessionManager.responseSerializer = responseSerializer;
```

## 終わり
まだいろいろと検証中ではありますが、意外とこの程度の変更で普通に動作しています。
あと、地味に`NSURLSessionUploadTask`のprogressが、`(NSProgress * __autoreleasing *)progress`から`(void (^)(NSProgress *uploadProgress)) uploadProgressBlock`という形でblocksを渡す形に変更されてしまってるのも注意しないといけませんね。
RailsとCarrierWaveでさくらのクラウド オブジェクトストレージにファイルを保存する

基本的にS3と同じ。


## Rails側の実装

こんな感じでCarrierWaveで作っておく。

* RailsとCarrierWaveでAmazon S3に画像を保存する
 * http://www.workabroad.jp/posts/1186

## オブジェクトストレージの作成

さくらのクラウドにログインしてオブジェクトストレージを選択。
バケットの作成を選んで任意のバケットを作成。
自動でフルアクセス権限とリードオンリー権限を持つアクセスキーがそれぞれ発行される。

## CarrierWaveの設定

```ruby:config/initializers/carrierwave.rb
config.fog_credentials = {
  :provider               => 'AWS',
  :aws_access_key_id      => 'アクセスキーID',
  :aws_secret_access_key  => 'シークレットアクセスキー',
  :host                   => 'b.sakurastorage.jp',
  :endpoint               => 'https://b.sakurastorage.jp',
  :aws_signature_version  => 2
}
config.fog_directory = 'バケット名'
config.fog_public    = true
```

こんな感じでオブジェクトストレージにファイルを保存できる
TensorFlow0.8 でtensorboardが使えなくなった時の対策

4月14日、[TensorFlow](https://www.tensorflow.org)の0.8がでましたね！
正式にDistributedTensorFlowが使えるようになりましたし、0.7までではずーっとcomming soonだったDeepDreamがとうとうjupyterを用いてTutrialに登場したりして楽しみです。
しかし、たぶんすぐに修正されると思いますが、こんな問題に直面した人は居ませんでしょうか？
「**アップグレードしたらtensorboardで何も映らなくなった！**」
筆者の環境はMacOSXですが、Ubuntuでも同様の現象を確認済みです。
なにやら[ドキュメント](https://www.tensorflow.org/versions/r0.8/how_tos/graph_viz/index.html)を見る限りは0.8ではtensorboardが結構パワーアップしているように見えるのにうーん勿体無い！
そういうこに困っている方々がいるかもしれないので、その時の対策を書こうと思います。
#原因
TensorFlowをインストールする際に[Download and Setup](https://www.tensorflow.org/versions/r0.8/get_started/os_setup.html)にあるバイナリからインストールの部分の以下のコマンドで実行していませんか？
`sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0rc0-py2-none-any.whl`

これはMacの場合ですが、何はともあれwebにあがっているビルド済みのwhlファイルをpipでインストールしてきているのが原因です。

#対策
ソースからビルドしましょう。
webにあるビルド済みのバイナリからインストールした場合と、ソースからビルドした場合のtensorflow のインストール先の/Library/Python/2.7/site-packages/tensorflow/tensorboard/libtensorboardのディレクトリを比較した画像を以下に添付します。

<img width="765" alt="スクリーンショット 2016-04-15 16.26.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/57774/7c8d12d6-ae3e-7d13-689c-83473ef3ac89.png">

上がソースからビルドした場合、下がバイナリからインストールした時のディレクトリ構成です。バイナリからインストールした時にcssディレクトリがありませんね。

このcssディレクトリの中身、入っているのはglobal.cssというtensorboardのcssを記載したファイルです。他の環境でビルドした何かの拍子にこのファイル及びディレクトリが欠損してしまったのが原因だと思われます。

なので、対策としては[Download and Setup](https://www.tensorflow.org/versions/r0.8/get_started/os_setup.html)にあるソースからのビルドを実行しましょう。
もしかしたらこのcssファイルを移植するだけで動くようになるかもしれませんが、気持ち悪いと思うのでせっかくなのでソースからビルドしてみましょう。

#最後に
何やら[issue](https://github.com/tensorflow/tensorflow/issues/1923)も上がっているそうなので、すぐに解決すると思われますが、基本的にどんなものであってもソースからビルドすることができるなら、そうした方がいいと思います。他の環境で作られたものが自分の環境で動くかどうかって結構信じられませんよね。
0.8の時点では改正されているのを確認しましたが、0.7の時点で、バイナリからインストールするとinclude直下のディレクトリが大部分欠損しており、C＋＋から叩けない状況に陥ってしまい、そこからはソースでビルドすることにしました。

ちょっとめんどくさいですが、変な問題につまづかないためにもソースからのビルドをお勧めします。
androidタップした時に一瞬だけ画像を変える方法


handler.postDelayedというのを使います。


```
imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //タップしたらすぐ動作するメソッド
                imageView.setImageResource(R.drawable.ossantapped);
                soundPool.play(soundOne, 1.0f, 1.0f, 0, 0, 1);

                //今回の記事で紹介した部分
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                     //処理内容はここに                    
                     imageView.setImageResource(R.drawable.ossan);
                    }
                }, 200);//1000ミリ秒 0.2秒後に行う処理

            }
        });
```

タップしたらimageViewにsetImageResource(R.drawable.ossantapped)を呼び出し、
handler.postDelayedの処理に移ります。
200m秒後に、setImageResource(R.drawable.ossan)が読まれる。
PhpStormで1行の文字数ガイドラインを設定する


![right-margin.png](https://qiita-image-store.s3.amazonaws.com/0/9845/f0f44e52-8eb6-f826-0e68-da99dcf82b11.png "right-margin.png")


設定のEditor → Code Styleに設定あります。 


![right-margin-setting.png](https://qiita-image-store.s3.amazonaws.com/0/9845/9ebd608c-89c3-2f30-e113-9f17616646b3.png "right-margin-setting.png")
Railsでコンソールの出力結果を上書きする方法


rakeタスク等で現在の処理件数を出力することはあると思います。ただこれだと出力結果が。。

![console_1.gif](https://qiita-image-store.s3.amazonaws.com/0/35480/fedf368d-a6d7-35a4-3192-f1a595c36fdd.gif)

これだと数字が大きい時に見づらいですよね。
ダウンロードなどと同じように出力結果を上書きするため方法があります（数字を見やすくするためにsleep挟んでいます）。書き方はgifの下にあります。

![console_2.gif](https://qiita-image-store.s3.amazonaws.com/0/35480/e716e2f9-8df2-7ca9-388a-952a4e9f1fb2.gif)

```lib/tasks/count.rake
10.times do |i|
  print "#{i}\r"
end
```

`\r`が大事な部分のようです。（あと`puts`では意図した動きになりません。）
また数字だけでなく、文字や記号でも上書きすることが出来ました。

参考: [コンソールへの出力を上書きしてゆく方法](http://qiita.com/airtoxin/items/bb445529c94d3cd871f3)
C#でswitchのフォールスルーの有無でのパフォーマンス

基礎のメソッドで使われているswitch条件分岐で実行元によって、
同じ結果を求めるのにswitchで参照する値が異なってるっていうのがあり、
統一した方がいいだろうっていう話から、
そもそもパフォーマンス的に違いがあんの？っていうのから気になって調べたのでその結果メモ

**結果**
どっちもあんまり変わらなさそう
***
パフォーマンステストとかやったことないので、そもそも計測方法合ってんの？
っていうのはありますが、下記に詳細。

一応、switch分岐を10個並べたけど、実際の物は2個ぐらいなので、
実務的にはそんなに影響なさそう。

**実行環境**
CPU : intel i3-3220 @ 3.30GHz
RAM : 4.00 GB
OS  : Windows7 Pro 32bit
.NetFreamWork : 3.5

AnyCPUでリビルドした物を実行してます。
***
**出力結果**
***
フォールスルーなし：0回目:00:00:03.1577708
フォールスルーなし：1回目:00:00:03.1692752
フォールスルーなし：2回目:00:00:03.2303683
フォールスルーなし：3回目:00:00:03.1641701
フォールスルーなし：4回目:00:00:03.1919198
フォールスルーなし：5回目:00:00:03.1786859
フォールスルーなし：6回目:00:00:03.2009377
フォールスルーなし：7回目:00:00:03.1793720
フォールスルーなし：8回目:00:00:03.2954076
フォールスルーなし：9回目:00:00:03.1917363
フォールスルーなし平均：00:00:03.1959643
フォールスルーあり：0回目:00:00:03.1917434
フォールスルーあり：1回目:00:00:03.1726927
フォールスルーあり：2回目:00:00:03.1649794
フォールスルーあり：3回目:00:00:03.1667495
フォールスルーあり：4回目:00:00:03.1672266
フォールスルーあり：5回目:00:00:03.1672114
フォールスルーあり：6回目:00:00:03.1684243
フォールスルーあり：7回目:00:00:03.1638066
フォールスルーあり：8回目:00:00:03.2593065
フォールスルーあり：9回目:00:00:03.3309922
フォールスルーあり平均：00:00:03.1953132

**まずいソース**
***
```c#
using System;
using System.Collections.Generic;

namespace PerformanceTest
{
	class Program
	{
		static void Main(string[] args)
		{
			//Stopwatchオブジェクトを作成する
			System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
			long timeSpan = 0;

			string strValue = "Data";

			for (int count = 0; count < 10; count++)
			{
				//ストップウォッチを開始する
				sw.Reset();
				sw.Start();

				// 1億回ループ
				for (int i = 0; i < 100000000; i++)
				{
					switch (strValue)
					{
						case "Data0":
							break;
						case "Data1":
							break;
						case "Data2":
							break;
						case "Data3":
							break;
						case "Data4":
							break;
						case "Data5":
							break;
						case "Data6":
							break;
						case "Data7":
							break;
						case "Data8":
							break;
						case "Data9":
							break;
						case "Data":
							break;
					}
				}

				//ストップウォッチを止める
				sw.Stop();

				timeSpan += sw.Elapsed.Ticks;

				//結果を表示する
				Console.WriteLine("フォールスルーなし：" + count.ToString() + "回目:" + sw.Elapsed.ToString());
			}

			Console.WriteLine("フォールスルーなし平均：" + TimeSpan.FromTicks(timeSpan / 10));

			timeSpan = 0;

			for (int count = 0; count < 10; count++)
			{
				//ストップウォッチを開始する
				sw.Reset();
				sw.Start();

				// 1千万回ループ
				for (int i = 0; i < 100000000; i++)
				{
					switch (strValue)
					{
						case "Data0":
						case "Data1":
						case "Data2":
						case "Data3":
						case "Data4":
						case "Data5":
						case "Data6":
						case "Data7":
						case "Data8":
						case "Data9":
						case "Data":
							break;
					}
				}

				//ストップウォッチを止める
				sw.Stop();

				timeSpan += sw.Elapsed.Ticks;

				//結果を表示する
				Console.WriteLine("フォールスルーあり：" + count.ToString() + "回目:" + sw.Elapsed.ToString());
			}

			Console.WriteLine("フォールスルーあり平均：" + TimeSpan.FromTicks(timeSpan / 10));
		}
	}
}

```
ELBのSSL設定(証明書アップロード)でServer Certificate not found for the key


///////////////////////////
2019/06/07 追記
※今はAWS Certificate Manager(ACM)で管理すべきです
///////////////////////////

現象としてはこちらと同じです。

[既存の ELB に SSL 証明書を追加しようとすると Server Certificate not found for the key というエラーになる件の解決方法](http://qiita.com/ynii/items/694d60614b98f73f780f)

すでに作成済のELBでリスナーがHTTPだけのものに、HTTPSのリスナーを追加。
SSL証明書に「新規のSSL証明書をアップロードする」と選択し
SSL証明書情報をコピペして保存すると

```
次の SSL 証明書を作成しました: xxxxxxxxxxxx。
ポートのリスナーを作成できませんでした: 443。 Server Certificate not found for the key:xxxxxxxxxxxxxxxxxxx
```

というエラーが発生して設定できませんでした。
解決策としてはCLIを使用すると解決するようですが、コンソールでもろに「新規アップロード」と書いてるのにCLIからしかできないという事はないだろう、とちょっと試行錯誤しました。

結果としてELBのバックエンドのインスタンスのセキュリティグループをごちゃごちゃすればいけるようになりました。
おそらく**バックエンドのインスタンスが80と443、両方ELBから通る状態だとエラーにはならない**みたいでした。

ELBにはdefaultのセキュリティグループも与える場合、インスタンス側を default だけにしたら通ったけど、
インスタンス側に追加のセキュリティグループでHTTPだけを許可するものを追加しているとエラーになったり、、
挙動はなんかバギーでしたのではっきりと原因はわかっていません。

なんにせよ、IAMユーザ作ってCLIで設定するのが面倒であればインスタンスのセキュリティグループを確認してみて下さい。
【未検証】three.jsのGeometryをJSONとして保存し、読み込む


# 前提
- three.js [Release r74 · mrdoob/three.js](https://github.com/mrdoob/three.js/releases/tag/r74)


# 課題
three.js の Geometry を、外部JSONとして保存して、再利用化したい。

# 問題
- GeometryのJSON化はどうすればいいのか
- JSON化したものをどう保存するのか
- JSON化したものをどう読み込むのか

# 手法
## GeometryのJSON化はどうすればいいのか
普通に``toJSON``を呼ぶだけ

```javascript
var geom = new THREE.BoxGeometry(1,1,1);
var json = geom.toJSON();
```
ただしこの方法では、JSON化はできても「読み込む手段」がない。それについては、下記「JSON化したものをどう読み込むのか」参照

## JSON化したものをどう保存するのか
外部保存するので、そもそものコードをNode.jsで書く必要がある

```bash
$ npm init
$ npm install three --save-dev
```
```javascript
var THREE = require('three');
var fs = require('fs');

var geom = new THREE.BoxGeometry(1,1,1);
var json = geom.toJSON();
fs.writeFile('geom.json', JSON.stringify(json));

```
実は``JSON.stringify``が、引数の``toJSON``を自動で呼ぶっぽいので、あらかじめ``toJSON``をしておく必要はないっぽい

## JSON化したものをどう読み込むのか
three.jsには、単純にGeometryをJSON化しただけのものを読み込む手段がないっぽい。なので、 __Geometryを一旦BufferGeometryに変換__し、JSON化する

```javascript
// 書き出し側: node.js
var THREE = require('three');
var fs = require('fs');

var geom = new THREE.BoxGeometry(1,1,1);
var buffer_geom = new THREE.BufferGeometry().fromGeometry( geom );
var json = buffer_geom.toJSON();
fs.writeFile('geom.json', JSON.stringify(json));
```

```javascript
// 読み込み側: ブラウザ【未検証】
var loader = new THREE.BufferGeometryLoader();
loader.load('geom.json', function(persed_geom){
  // 適当にmesh作る
});
```

# 【未検証】とは
実際に動くコードは書いたけど、上記のようなシンプルなコードではないので、上記コードそのものを動かして検証したわけではない。後日検証して、問題があるようなら修正する。
ちなみに、俺はgeom.jsonの中身が複数のBufferGeometryのJSONによる配列だったので、下記のようなコードになってる。

```javascript
$.ajax({
  url: 'geoms.json', // BufferGeometryの配列
  success: function(geoms_json){
    var loader = new THREE.BufferGeometryLoader();
    $.each( geoms_json, function(i, geom_json){
      ver buffer_geom = loader.parse( geom_json );
      ver geom = new THREE.Geometry().fromBufferGeometry( buffer_geom );
    });
  });
});
```
UISliderのような円形のスライダーコントロールを作ってみた

# 概要
iOSのUISliderは便利ですが、横に広くスペースを取る必要があるので、配置が難しくなります。
そこで、オーディオ機器のボリュームのような、円形のSliderを作ってみました。
![Simulator Screen Shot 2016.04.15 16.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/30218/6f6fbb3d-a908-48e3-ed24-2dca9a64ce79.png)

# 使い方
サンプルコードのUICircleSliderフォルダごとプロジェクトにコピーしてください。
あとは、ほぼUISliderと同じです。

```objc
    // 画像
    circleSlider.image = [UIImage imageNamed:@"volume"];
    // 最小値
    circleSlider.minimumValue = 0;
    // 最大値
    circleSlider.maximumValue = 100;
    // 初期値
    circleSlider.value = 0;
    // 通知設定
    circleSlider.delegate = self;
```

値が変更された場合、delegateで通知するようにしています。

```objc
- (void)didChangeValue:(UICircleSlider *)sender
{
    [valueLabel setText:[NSString stringWithFormat:@"%.2f", sender.value]];
}
```

画像は自由に変更できます。（サンプルのように、上を向いている状態の画像を用いて下さい）

# サンプルコード
本体と共にgithubからどうぞ。
[UICircleSlider](https://github.com/sasanao/UICircleSlider)
nginx、apache のロードバランサ性能比較

既に色々なところで書かれていますが、ロードバランサとしての性能について簡単な性能比較をしてみました。

> [apache と nginx の比較表とベンチマーク](http://qiita.com/sion_cojp/items/edb20a6b87f10e186c23)

下記の条件で比較を行いました。

- ロードバランサ 1 台で バックエンドの web サーバ 2 台を負荷分散
- web サーバは 2 台とも apache を使用
- apache bench でそれぞれ10回計測し、その平均を算出。
- テストに用いるページは Apache Test Page
- Apache/2.2
- nginx/1.8

> [Apache Benchでサクッと性能テスト](http://qiita.com/flexfirm/items/ac5a2f53cfa933a37192)

1. apache
![apache](https://qiita-image-store.s3.amazonaws.com/0/65255/31a6174b-1c46-486b-76b9-0cbe3208a56e.png)

2. nginx
![nginx](https://qiita-image-store.s3.amazonaws.com/0/65255/66c6626a-8574-5859-579e-5b6bee443017.png)

3. ロードバランサなし（webサーバ直接）
![none](https://qiita-image-store.s3.amazonaws.com/0/65255/e5642db5-03dd-955e-c08e-9b6a2dc37b9f.png)

## ベンチマーク
- Requests per second [#/sec]

| 同時接続数 | apache | nginx | web サーバ直接 |
|:-----------|------------:|:------------:|------------:|
| 100 | 2697.871 | 3463.774 | **4326.293** |
| 300 | 2485.409 | **3362.214** | 3002.440 |
| 500 | 2436.372 | **3286.834** | 1507.004 |

- Time per request [ms]

| 同時接続数 | apache | nginx | web サーバ直接 |
|:-----------|------------:|:------------:|------------:|
| 100 | 0.3734 | 0.2890 | **0.2326** |
| 300 | 0.4031 | **0.2978** | 0.3331 |
| 500 | 0.4107 | **0.3046** | 0.6636 |

## 機能的なこと


- ディレクトリやファイルのパスでの振り分けは両方可能
- オープンソースの WAF：ModSecurity を入れることも両方可能
- SSL証明書の設定も両方可能
- セッション維持(パーシステンス)をしたい場合、apache の場合はモジュール mod_proxy_balancer の stickysession、nginx の場合は~~標準で sticky が入っているようだが、~~サードパーティ製のモジュール nginx-sticky-module-ng を使用するという情報が多い。nginx の公式サイトに if is evil とあるので、if を使用するような設定には注意が必要

訂正：sticky が入っているのは商用版の nginx plus のようです。

> [NginxによるWebSocketの負荷分散](http://take4.hatenablog.com/entry/2014/06/27/135258)
[mod_proxy_balancerの設定、特にstickysessionについて](http://www.res-system.com/weblog/item/618)
[Module ngx_http_upstream_module](http://nginx.org/en/docs/http/ngx_http_upstream_module.html)
[無料SSL/TLS証明書のLet's Encryptが正式版になったので自動更新を含めて試してみた](http://www.websec-room.com/2016/04/13/2541)
[If Is Evil | NGINX](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)

## さいごに

- 環境によって変わる可能性はあると思うが、やはり nginx の方が速そう。
- 同時接続数が 100 ぐらいまでならロードバランサなしの方がよさそうだが、web サーバを隠蔽化するという目的もあるので入れておきたい。
- if 非推奨も気になるが、使わなくても目的は達成できそう。
- 機能的にはどちらも問題ない。
- web サーバも nginx にすればもっと早くなりそう。

nginx、apache のロードバランサ性能比較
http://web.loft-net.co.jp/lofttecs/nginx_apache_load_balancer_performance/
Atomでタブを押した時に入るスペースの数を言語ごとに設定する方法

# Why?
言語ごとにインデント変えてる人多いですよね？
いちいち設定を変えるのめんどくさいのですよね？

Atomでは言語をファイルの拡張子から読み取って、タブによるスペース挿入の数などの設定が言語それぞれ別ににできます。

# How?
### 1. 設定を開きます。
![Screen Shot 2016-04-14 at 11.46.19 PM.png](https://qiita-image-store.s3.amazonaws.com/0/78600/ebf2a5c5-b4c6-3464-0354-94e343054bc5.png)

### 2. Packagesをクリックします。
![Screen Shot 2016-04-14 at 11.49.17 PM.png](https://qiita-image-store.s3.amazonaws.com/0/78600/0eff4bae-bfbe-3958-9dd1-05cce3d148bc.png)  


### 3. 検索欄に個別に設定したい言語を検索します。
例ではJavaScriptを検索しています。
![Screen Shot 2016-04-15 at 12.00.07 AM.png](https://qiita-image-store.s3.amazonaws.com/0/78600/13c97e35-debb-32a7-28c0-3aa269457880.png)


### 4. Settingsをクリック。
![Screen Shot 2016-04-15 at 12.png](https://qiita-image-store.s3.amazonaws.com/0/78600/9d31c7f8-38ce-ae59-11c1-1fe293f6040a.png)
  

### 5. 下にスクロールするとTab Lengthと書いてあるので、そこで任意のスペースに設定してください。
![Screen Shot 2016-04-15Edited.png](https://qiita-image-store.s3.amazonaws.com/0/78600/5e827b74-1198-342f-0b2f-32a4cf9867a3.png)
  

### 6. お疲れ様でした。以上で設定完了です。
  

#終わりに
簡単ですね。日本語で解説しているページが無かったので投稿してみました。
Apple Tier MatrixをJSONで取得する

今までTierが変わるごとに、iTunesConnectにログインして価格表みてあれこれしていましたが、最近価格表を見たらフォーマットが変わっており愕然としました。

いちいちログインして、価格表見て・・なんてメンドクサイので、なんとかAPIで取得できないだろうか調べていたところ・・・

# あった！
```https.api
https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/apps/pricing/matrix
```

レスポンスはこんな感じ

```response.json
{
  "data": {
    "pricingTiers": [
      {
        "tierStem": "0",
        "tierName": "無料",
        "pricingInfo": [
          {
            "country": "アメリカ合衆国",
            "countryCode": "US",
            "currencySymbol": "$",
            "currencyCode": "USD",
            "wholesalePrice": 0,
            "retailPrice": 0,
            "fRetailPrice": "$0.00",
            "fWholesalePrice": "$0.00"
          }
        ],
        ...
      }
    ],
    ...
  }
}
```

# でも
非公式かもしれません(fastlaneで使ってそうだから大丈夫かな）。フォーマットも突然変わるかもしれません。
韓国もUSDです。気をつけましょう。
git credentialの使い方

新しい環境でgitを使い始める際に、git-credentialの使い方をいつも調べているのでメモ。

# git-credentialについて

githubで多段階認証などを設定していると、githubへのアクセスを行うアプリケーションごとにアクセストークンを発行し、パスワードの代わりとしなければならない。
パスワードやアクセストークンを覚えるのは大変だし、毎回入力するのもたるいよねってことで、gitが一度入力した認証情報を覚えて次回以降は自動で入力してくれる機能がgit-credentialである。

# 利用できるgit-credential-helperの確認方法

以下のコマンドによって、利用可能なgit-credential-helperを一覧できる。

```txt:windowsの場合
git help -a | findstr credential-
```

```txt:Mac,Linuxの場合
git help -a | grep credential-
```

# git-credentialを利用する

以下のコマンドによって、利用するgit-credential-helperを設定する。

```
git config --global credential.helper {helper name}
```

参考: https://mistymagich.wordpress.com/2013/10/07/git-credential-helper%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6http%E8%B6%8A%E3%81%97%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AA%E3%83%9D%E3%82%B8/
Git Bashのtmpディレクトリってどこにあるん？

Windowユーザの皆さんこんにちわ。

WindowのGit環境で、Git Bashを使っています。

で、Git Bashの`tmp`ってのが、Windowsのどこにあるのか全然分からなかったので、手当たり次第探してみました。

# 環境

* Windows7 Professional SP1
* Administratorのユーザでログイン
* 同ユーザでGit Bashを導入済み、かつ同ユーザでの利用を想定
* `git version 1.9.5.msysgit.1`という構成

# 結論

`C:\Users\<Your Username>\AppData\Local\Temp`

ここでした。

# Tempって？

```
# Git Bashのコマンドプロンプトを起動
# 環境変数でtmpの設定を確認
$ set |grep tmp
TEMP=/tmp
TMP=/tmp
$ cd /tmp
$ pwd
/tmp
```

以上でした。
SSHでログインする際にホスト名を変える

### SSHでログインする際にssh xxx@xxx.xxx.xxx.xxx と入力するのは面倒なので、ssh example.com に変更する。

.ssh/config 作成

```
Host example.com
   HostName xxx.xxx.xxx.xxx ex) 192.168.56.100
   User xxx ex) n2xnot
   Port 2222
   IdentityFile ~/.ssh/id_rsa
   ServerAliveInterval 30　接続切れを防ぐため30秒に1回サーバーに通信する
```
日付のフォルダ(ファイル)を連番で作成するPowerShellスクリプト

# 前置き
テストデータ準備のために、日付のフォルダを連番で作りたい。
また、フォルダの更新日時も日付に合わせたい。
コマンドプロンプトでは扱いづらいため、PowerShellを使用する。

# スクリプト
100日前から今日までの日付のフォルダを作成するスクリプト。

```ps1:
for( $i = -100; $i -le 0; $i++ )
{
    $Date = (Get-Date).AddDays($i).Date
    $Name = (Get-Date $Date -Format "yyyyMMdd")
    New-Item $Name -ItemType Directory -Force
    Set-ItemProperty $Name -Name LastWriteTime -Value $Date
}
```

New-Item -ItemType で Directory を指定。
既に存在している場合はエラーが出るため、-Force をつける。

Set-ItemProperty で 更新日時を修正。更新日時は $Date にする。

# ファイルを作りたい場合
New-Item -ItemType を Directory から File に置き換えれば良い。
Raspberry Pi に Arch Linux 環境を整える

## 必要なもの

- Linux マシン
- SD カードリーダ
- SD カード
- Raspberry Pi 3

## 手順
### イメージの書き込み

書き込む前に，ディスクの不良セクタを修復しましょう．

```bash
fsck -a /dev/sdX1
```

適当な Linux マシンを使い，[公式サイト](https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3) に従って SD カードにイメージを書き込む[^1]．

書き込みが終了したら，SD カードを Raspberry Pi に挿入し，起動．

### 初期設定

日本語キーボードに設定．

```bash
loadkeys jp106
echo "KEYMAP=jp106" > /etc/vconsole.conf
```

`root` のパスワードを変更．

```
passwd
```

ロケールの設定．

```bash
nano /etc/locale.gen
```

`en_US.UTF-8 UTF-8` と `ja_JP.UTF-8 UTF-8` のコメントアウトを外す．

```bash
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
export "LANG=en_US.UTF-8"
```

時刻の設定．

```bash
unlink /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

ホスト名の設定．

```bash
echo hostname > /etc/hostname
```

### ネットワーク設定

今回は固定 IP で設定[^2]．

```bash
nano /etc/systemd/network/eth0.network
```

以下のように書き換える．

```bash
[Match]
Name=eth0

[Network]
DHCP=false
Address=192.168.xxx.xxx/24
Gateway=192.168.xxx.xxx
DNS=192.168.xxx.xxx 192.168.xxx.xxx
```

```bash
systemctl start systemd-networkd
systemctl enable systemd-networkd
```

### その他の設定

システムのフルアップグレード．

```bash
pacman -Syu
```

`sudo` の導入．

```bash
pacman -S sudo
```

```bash
nano /etc/sudoers
```

以下のコメントアウトを外す．

```
Defaults env_keep += "HOME"
%wheel ALL=(ALL) ALL
```

Wheel グループのユーザを作成．

```bash
useradd -m -g wheel user
passwd user
```

### デスクトップ環境の構築

Xorg と X ドライバをインストール．

```bash
pacman -S xorg-server xorg-server-utils xorg-xinit xorg-xterm xf86-video-fbdev
```

`startx` して起動するか確認．

Xfce をインストール．

```bash
pacman -S xfce4
```

`xinit` して Xfce が起動するように設定．

```bash
echo "exec startxfce4" > ~/.xinitrc
```

日本語フォントを入れる．

```bash
pacman -S otf-ipafont
```

## 参考

- https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
- http://takuya-1st.hatenablog.jp/entry/20101023/1287853709
- https://wiki.archlinux.org/index.php/Raspberry_Pi
- https://wiki.archlinuxjp.org/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88
- http://trileg.hatenablog.jp/entry/ArchLinux%25252525E3%2525252581%25252525A7systemd-networkd%25252525E3%2525252582%2525252592%25252525E7%2525252594%25252525A8%25252525E3%2525252581%2525252584%25252525E3%2525252581%25252525A6%25252525E3%2525252583%25
- https://wiki.archlinuxjp.org/index.php/Systemd-networkd



[^1]: `fdisk` の箇所は `cfdisk` を使った方がグラフィカルでわかりやすい．
[^2]: DHCP 環境の方は `systemctl enable dhcpcd` するだけでネットワークに接続できる．
RailsにおいてJSファイルで変数を参照する方法(gem "gon")

#概要
JSファイルでcontrollerで定義してあげた変数を参照する方法を知りたかったので調べてみると色々な方法があったが、僕が一番わかりやすくきれいだなぁ（後、hamlでやりやすいなあ）と思った方法(gem "gon"を使う)をメモします。
今回の場合はJSファイルに変数typeを渡すことを例にします。
#手順
## 1. gemの導入

```lang:gemfile
...
gem "gon"
```

```lang:terminal
$ bundle install
```
## 2. headに"include_gon"の追記
html.erbの方は

```lang:/layouts/application.html.erb
...
    <%= include_gon %> #を追記
    <%= javascript_include_tag "application" %>
    <%= stylesheet_link_tag    "application" %>
...
```

html.hamlの方は

```lang:/layouts/application.html.erb
...
    = include_gon
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true
    = javascript_include_tag 'application', 'data-turbolinks-track' => true
...
```

## 3. controllerでのそのインスタンス変数の定義
コントローラーではその変数を定義するとき、　「gon.変数名」で定義します。
僕の場合がprojectコントローラーのindexアクションで変数typeに"popular"という文字列を定義して、JSファイルで参照したかったのでこのように書きました。

```lang:projects_controller.rb
  def index
    ...
    gon.type = "popular"
  end
```

## 4. jsファイルでの呼び出し方
このサンプルはJQueryです。3行目で、「gon.type」と呼び出せます。

```lang:project.js
$(window).on("load", function(){
    $(".active").removeClass("active");
    $("#list_" + gon.type).addClass("active");
});
```

のように「gon.変数名」で普通に呼び出せる。すごい

#最後に
gemの導入に限らず、他にもいろいろ方法があります。
## 参照
http://qiita.com/mosa_siru/items/e69eee47a183b13cfb62
http://ikasama.hatenablog.jp/entry/2013/09/15/121746
[C++] Be careful about the returned value of localtime

We usually convert `time_t` to `tm` with `localtime` function. Such as the example code described [here]()

```cpp
time_t rawtime;
struct tm * timeinfo;

time (&rawtime);
timeinfo = localtime (&rawtime);
printf ("Current local time and date: %s", asctime(timeinfo));
```
According to the c++ reference [here](http://www.cplusplus.com/reference/ctime/localtime/):

>The returned value points to an internal object whose validity or value may be altered by any subsequent call to gmtime or localtime.

That is to say, if we do something like this, you will get two same pointers, the start pointer and the end pointer are same.

```cpp
int main() {
    time_t rawtime;
    time(&rawtime);
    struct tm *start = localtime(&rawtime);
    // Do somthing
    time(&rawtime);
    struct tm *end = localtime(&rawtime);
    printf("%p\n", start);
    printf("%p\n", end);
    return 0;
}
```

Output:

```
0x7fd8d14034e0
0x7fd8d14034e0
```

The solution is very simple, copy the value not the pointer.

```cpp
int main() {
    time_t rawtime;
    time(&rawtime);
    struct tm *start = new tm(*localtime(&rawtime));
    // Do somthing
    time(&rawtime);
    struct tm *end = new tm(*localtime(&rawtime));
    printf("%p\n", start);
    printf("%p\n", end);

    delete start;
    delete end;
    return 0;
}
```

Output

```
0x7f88d24034e0
0x7f88d2403780
```
EC-CUBEプラグイン「SPPED-CUBE」導入記

（※本記事はSPEED-CUBE ver1.7について記述しております）
# SPPED-CUBEとは？
EC CUBEで商品やカテゴリの件数が多くなった、重くなった、そんな時に出会ったのがこのプラグインでした。
[商品一覧を高速化するプラグイン SPEED-CUBE](http://www.ec-cube.net/products/detail.php?product_id=436)

プラグインを入れるだけで速くなる！　すごい！

## 有効化するのも重い
プラグインをインストールして「有効化」をポチッ……
処理が終わらない……？
[EC-CUBEの高速化プラグインでつまずいたこと](http://blog.73web.net/?p=511)
インデックスを張る操作に時間がかかって処理が終わんねー＼(｀Д´)ノ
そもそもデータ量が多くて困ってプラグインを入れようとしているのに、データ量が多いと処理が終わらないとは。

# SPEED CUBE用のINDEXを手動で作成する
## プラグインをインストール
プラグインを普通にインストールします。有効化はしない。

## プラグインでCREATE INDEXを行わないようにする
data/downloads/plugin/WbmSpeedCube/WbmSpeedCube.phpのL151をコメントアウト。

```php
  plg_WbmSpeedCube_Util::createIndexes(self::$_indexArray);
```
## EC-CUBEのDBにINDEXを作成する（一部ALTER TABLEする）
```mysql
CREATE INDEX plg_wbmspeedcube_d878de5a1d715929446251e6ec4f047e ON dtb_category (`parent_category_id`,`category_id`);
CREATE INDEX plg_wbmspeedcube_41d48b62d1b326c157bb43ebb1303900 ON dtb_category (`del_flg`,`rank`);

CREATE INDEX plg_wbmspeedcube_af58ff2160967a9e918aac57c9e22318 ON dtb_product_categories (product_id,rank);
CREATE INDEX plg_wbmspeedcube_eef72c3b525fc73ba229bff80fad5852 ON dtb_product_categories (`category_id`,`product_id`,`rank`);

CREATE INDEX plg_wbmspeedcube_eee278233028bfc51720d80ff07cca6e ON dtb_products (`maker_id`,`status`,`del_flg`);
CREATE INDEX plg_wbmspeedcube_6d5a5b6cf4d101dbad8bd2239b94d905 ON dtb_products (`status`,`del_flg`);

ALTER TABLE dtb_products_class MODIFY COLUMN product_code VARCHAR(255);
CREATE INDEX plg_wbmspeedcube_bfaf53a4613f781b99e1a24412568b15 ON dtb_products_class (`product_id`,`del_flg`,`price02`,`product_code`);
CREATE INDEX plg_wbmspeedcube_1ea985c6feb1ae8e82a4a128f679fcae ON dtb_products_class (`del_flg`,`product_id`,`price02`,`product_code`);

CREATE INDEX plg_wbmspeedcube_1d35ce71961c25dd25e53120fd49858a ON dtb_product_status (`product_status_id`,`del_flg`);
```
（※INDEX名はプラグインから自動的に作成してもこれになる）

## プラグインを有効にする
チェックボックスぽちー
CREATE INDEXをしないようになっているので、有効化処理は一瞬で終わる。

張ったINDEXに対して色々とプラグインのコードがよしなにしてくれているみたいなので、プラグインは有効化しておく。

# SPEED-CUBEにはバグがあるぞ～
プラグイン内 plg_WbmSpeedCube_Util.php の450行目あたりには

```php
    foreach ($indexes as $tableName => $rows) {
        foreach ($rows as $indexName => $row) {
            $sql = 'CREATE INDEX ' . $indexName . ' ON ' . $tableName . ' ';
            $sql.= implode(',', $row) . ";\n";
        }
        self::getDbAdapter()->query($sql);
    }
```
というコードがあり、ものの見事に「テーブル1つにつきINDEXを1つしか作成してくれない」動作をしてくれています。
正しくはqueryが直上のforeachスコープの中かなーって。
なので、手動でINDEXを作成しない場合もここは直しておく必要有り。
手書き数字の機械学習に実際に画像をくわせてみた


TensorFlowのチュートリアルでMNISTの手書き数字画像をソフトマックス回帰させた学習モデルに、自分で用意した数字画像を渡して正解できるかを試したものです。
学習内容について詳しくは[前記事](http://qiita.com/jkkch/items/c6715d3c1557c62ab33a)を参照してください。

## 用意した画像

[@tomigarash](http://qiita.com/tomigarash)さんがホワイトボードに書いた数字をいくつか拾ってきました。

|IMG_0738.JPG|IMG_0739.JPG|IMG_0740.JPG|
|---|---|---|
|![9](https://qiita-image-store.s3.amazonaws.com/0/121144/5e798684-25e6-eb87-2d1d-aaca8ee4bfda.jpeg)|![2](https://qiita-image-store.s3.amazonaws.com/0/121144/93ecfee1-8e12-7761-ea3e-e9811d0bbe77.jpeg)|![5](https://qiita-image-store.s3.amazonaws.com/0/121144/d730dc5f-9ece-03d5-6402-cdc36a0a3f6d.jpeg)|



## コード

前記事のコードの後に以下を追加します。

```python
from PIL import Image
import numpy
import sys

# 画像の読み込み
image = Image.open(sys.argv[1]).convert('L')
# バックを白に
image = Image.frombytes('L', image.size,
                        bytes(map(lambda x: 255 if (x > 160) else x,
                                  image.getdata())))
image.thumbnail((28, 28))

# input_data の形に揃える
image = map(lambda x: 255 - x, image.getdata())
image = numpy.fromiter(image, dtype=numpy.uint8)
image = image.reshape(1, 784)
image = image.astype(numpy.float32)
image = numpy.multiply(image, 1.0 / 255.0)

p = sess.run(y, feed_dict={x: image, y_: [[0.0] * 10]})[0]
print(p)
print(numpy.argmax(p))
```

コマンドの引数としてファイル名を渡します。
最後に各数字の確率と、もっとも確率の高い数字を表示します。

## 実行結果

奇跡的にうまくいったときの結果を:wink:

```bash
$ python hoge.py IMG_0738.JPG
[ 0.00254864  0.14155449  0.03942517  0.0640309   0.10035493  0.24547113
  0.03151034  0.08466743  0.02800771  0.26242924]
9

$ python hoge.py IMG_0739.JPG
[ 0.0133549   0.03801349  0.27229738  0.00914067  0.05935491  0.1855848
  0.23350625  0.08867891  0.01579926  0.08426938]
2

$ python hoge.py IMG_0740.JPG
[ 0.08777995  0.00248157  0.15249293  0.00432909  0.00173489  0.63235831
  0.04411433  0.02771386  0.01238648  0.03460857]
5
```

実際はどれもほとんどの場合`5`と認識されてしまっていました:stuck_out_tongue_closed_eyes:
タブキーを押すとフォーカスが移動してしまうせいでタブをテキストとして入力できないウェブサービス（Google Keep など）でタブを入力できるようにする方法

Chrome の拡張を作って下記のコードを実行させれば、カーソル位置にタブ（\t）を挿入させることができます。

```js
document.onkeydown = function (e) {
    if (e.keyCode === 9) {
        e.preventDefault();
        event.returnValue = false;
        document.execCommand('insertText',false , '\t');
    }
};
```

実際に Google Keep でタブを入力できるようにする Chrome 拡張を作ってみました。
※2023-10-20追記：下記の拡張はある方に譲渡しました。すでに私は関わっていません。

* ダウンロード：https://chrome.google.com/webstore/detail/input-tab-in-google-keep/bmfmbanhkhjhfeckobkcecohknhlnamb
* ソースコード：https://github.com/arai-wa/input_tab_in_google_keep

# 説明
Google Keep などでは tab キーを押すとフォーカスが別の HTML 要素に移ってしまうため、タブをテキストとして入力できません。

上記のコードでは、tab のデフォルトの動作を無効にして、`document.execCommand('insertText',false , '\t');` を呼び出すことで `\t` を入力しています。

# その他の使いドコロ
Google Keep 以外のサービスでも使えると思います。

また、自分がウェブサービスを作る場合でも同様の方法をつかえば textarea にタブを入力できるようになります。
AS2でマウスクリックでアニメーションのデバックをする

この記事はデザイナー向けの記事である。

例えばStageにmovieClipがあり、その中にタイムラインアニメーションが書いてある場合がある。
このタイムラインアニメーションは最後のフレームでstop();という命令が書かれており、
二回目を見るのはもう一度パブリッシュするか、swfを立ち上げなおなければいけない。

この時、マウスクリックなどで、もう一度アニメーションが再生ができれば便利だと考えるとする。
再生されるmovieclipにインスタンス名をつけて（main_mcとする）、
Stageの1フレーム目、空のキーフレームをうち以下のコードを書こう。

``` 
main_mc.onMouseDown = function(){
　main_mc.gotoAndPlay(1);
}
```

これでクリック（マウスダウン時）のたびにムービーが再生される様になる。
rails　カラムの型

string 文字列型
text テキスト（不定長文字列）型
integer 整数型
float 浮動小数点数型
decimal 固定長整数型
datetime 日時型
timestamp タイムスタンプ型
time 時刻型
date 日付型
binary バイナリ文字列型
boolean 真偽値型
references 他のテーブルへの外部キーの定義、_id が付いた整数
BK：Bluemix に cf push するときは、.cfignore で不要なフォルダを除外すべし

IBM Bluemix に `cf push APP-NAME` すると、カレントディレクトリの中身が一切合財アップロードされる。

しかし、buildpacks で sdk-for-nodejs を使っている場合、node_modules 等はデプロイで自動的にインストール＆キャッシュされるので、わざわざローカルのものを push する必要はない。

そこで、`.cfignore` に不要なフォルダを指定しておく。

```:.cfignore
node_modules
scripts.es6
```

これで push が快適に。

# 参考

- [Ignore Unnecessary Files When Pushing](https://docs.cloudfoundry.org/devguide/deploy-apps/prepare-to-deploy.html#exclude) - Cloud Foundry Documentation
指定した文字列を含むファイルを検索するコマンド

##指定した文字列が書かれているファイルを検索できるコマンド．

```bash
$ find ./ -type f -print | xargs grep 'hoge'
```

##コマンドの詳細

- **`find`**

ディレクトリの中を再帰的に検索する．

```bash
$ find ディレクトリ 検索条件 アクション
```
ディレクトリが`./`の場合は，今いるディレクトリ配下が検索対象．
検索条件が`-type f`の場合はファイルを検索．`-type d`とするとディレクトリを検索する．
アクションが`-print`の場合は，結果を標準出力．

---

- **`|`**

「パイプ」と呼ばれ，左側のコマンドの標準出力を右側のコマンドに標準入力として渡す．

---

- **`xargs`**

ファイル名の一覧を標準入力から受け取り，それらをコマンドの引数として渡す．

---

- **`grep`**

ファイルや標準入力から正規表現でマッチする行を探し出す．


##参考
[【Linux】複数あるファイルの中から特定の文字列を検索するコマンド](http://kawatama.net/web/1141)
Mailer でloadModel を利用できるようにする (CakePHP3)

# Mailer でモデルを使いたい

CakePHP3には [Resuable-email](http://book.cakephp.org/3.0/en/core-libraries/email.html#creating-reusable-emails) という仕組みがあり、Mailer クラスを利用する事で、メール送信に関連する処理を別クラスに切り離せます。

[apiドキュメント](http://api.cakephp.org/3.2/class-Cake.Mailer.Mailer.html)を見ると、ModelAwareTraitを指定されており、モデルも利用可能なのかと思いModelを利用し使ってみると、

```
InvalidArgumentException

Unknown repository type "Table". Make sure you register a type before trying to use it.
```

怒られた。modelのインスタンスを生成する手段が登録されてないという意味なので、
以下で対応

```php
namespace App\Mailer;

use Cake\Mailer\Mailer;

class UserMailer extends Mailer
{

    public function __construct(\Cake\Mailer\Email $email = null)
    {
        parent::__construct($email);

        /**
         * loadModelを利用可能にする
         * modelFactory にTableRegistory::get を指定。
         */
        $this->modelFactory('Table', ['Cake\ORM\TableRegistry', 'get']); 
        
        $this->loadModel('Users');
    }

  

    public function notify($data)
    {
        $users = $this->Users->find('target');
        .....
    }
}
```

でModelを利用可能となった。
javascriptにおける変数の巻き上げをざっくりまとめ

javascriptにおける変数の巻き上げを調べたのでまとめ


###まずグローバルの変数を参照する場合

```js
var name = 'fukamiiiiinmin';

var call = function(){
  console.log(name)//グローバルのname（fukamiiiiinmin）を参照してる
}

call() 
// => fukamiiiiinmin
```

###ローカル変数を参照する場合

```js
var name = 'fukamiiiiinmin';

var call = function(){
  var name = 'masakazu';
  console.log(name) //localで宣言したmasakazuを出したい
}

call()
// => masakazu
```


###関数内でグローバルのnameを呼び出して、ローカルに宣言したnameも呼び出したいわー

```js
var name = 'fukamiiiiinmin';

var call = function(){
  console.log(name); // 上で宣言したname（fukamiiiiinmin）を出したいなーー
  
  var name = 'masakazu';
  console.log(name); //直前で宣言したname（masakazu）を出したいなー
}

call()
// => undefined あれ?fukamiiiiinminじゃない？
// => masakazu ここはmasakazuで問題なし
```

## なんでやねん
これがいわゆる変数の巻き上げというやつで[文法とデータ型 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types)によると
> もうひとつ、JavaScript の変数にまつわる独特な点として、例外を発生させることなく後に宣言した変数を参照できる点が挙げられます。この考え方は巻き上げとして知られています。JavaScript の変数は関数や文の先頭まで、ある意味「巻き上げられ」、持ち上げられます。一方、巻き上げられない変数は undefined 値を返します。そのため、その変数を使用したり参照した後に宣言や初期化を行っても、依然として undefined が返されます。

というわけです。
とりあえず長いので簡単に省略すると
**関数内で宣言したローカル変数は全部関数内の一番最初に持って行くよ！**
**その時は変数名だけ宣言するからundefinedにするよ！**

ってことです！
つまり先程のjsは途中で宣言したvar name = 'masakazu'のnameだけ巻き上げられて

```js
var name = 'fukamiiiiinmin';

var call = function(){
  var name;// var name = undefined;と同じ
  console.log(name); // 変数が巻き上がってundefineで宣言されとる！
  
  name = 'masakazu';
  console.log(name); 
}

call()
// => undefined なるほど
// => masakazu ここはmasakazuで問題なし
```

というふうになるわけです。
[新人教育] 何も知らない人がGitとGitHubを独学で知る


![](https://cloud.githubusercontent.com/assets/1305617/9652620/fce0cc46-51d1-11e5-9cb6-d2d71535dfc5.png)

一通りやりましたがめちゃオススメです。

画面の指示に従って進めていくだけで
Gitの概念からプルリクエストのフローまで学べます。
※実際にプルリクエストを送ることができます。
※章末ごとに正しく操作できているかのチェック機能があります。

所要時間は、Git使い慣れてる人で1時間未満。
未経験者でも3時間あればなんとか！(ハマり具合による)

Git・GitHub始めたばかりの人から復習したい人まで！
また、研修でも使えると思います。



日本語版も出来たみたいですのでぜひお試しあれ！
...と勝手に宣伝。

[git-it-electron(概要)]
https://github.com/jlord/git-it-electron#user-content-git-it-desktop-version

[ダウンロードページ(日本語版)]
https://github.com/jlord/git-it-electron/releases/tag/3.1.0


(補足)
Macだとターミナルですぐに初められるんですが、
windowsだと少し環境設定がいるかもしれません。

<br>




----

### 過去に書いた Git関連の記事 :arrow_double_down: 


[Qiita-git checkout できないとき、私はこうしてます。](http://qiita.com/iKenji/items/c03bd6e72f57291da24c)
[Qiita-プルリクエストで表示される差分の仕組みを GitHub に問い合わせたときの話](https://qiita.com/ikenji/items/7417d4f41ac8b564b36d)
[Qiita-ブランチ間の差分をコミット単位で知る・見る](https://qiita.com/ikenji/items/fecd39966bbf463da3f4)
[Qiita-git 差分を見る](https://qiita.com/ikenji/items/42248085c4f4b55660d6)
JavaScript でクリップボードを操作する方法

* `document.execCommand('copy');` で選択中の文字列をコピー出来ます
* `document.execCommand('cut');` で選択中の文字列をカット出来ます
* `document.execCommand('paste');` でペースト出来ます

# 従来の問題
従来は JavaScript だけでクリップボードを操作することは難しくて、

* Flash を使う
* window.clipboardData という IE 独自のオブジェクトを使う

といった方法が一般的に取られていました。

# `document.execCommand` について
* 他にもテキストの書体（bold 等）を変更できたり
* `document.execCommand('insertHTML', false, foo);` で HTML 文字列を挿入できたり

と色々出来ます。

詳細は [MDN のページ](https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand)にあります。

ブラウザの対応状況については [MDN のページ](https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand)の「ブラウザの互換性」をご覧ください。
最近のブラウザなら使えるようです。
【PHP】date関数での日付フォーマット



```
$date = '201301';
echo date('Y-m', strtotime($date));
```

参考：[php：phpのdate関数で日付のフォーマット変更](http://raining.bear-life.com/php/php%E3%81%AEdate%E9%96%A2%E6%95%B0%E3%81%A7%E6%97%A5%E4%BB%98%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E5%A4%89%E6%9B%B4)
メモ：ubuntu14.04でxrdpサーバーでリモートデスクトップ接続

## XRDPのセットアップ
[Tweaking4All.com - How to use xRDP for remote access to Ubuntu 14.04](http://www.tweaking4all.com/software/linux-software/use-xrdp-remote-access-ubuntu-14-04/)
に完全に従ってxrdpの環境をセットアップ。Windowsのリモートデスクトップ接続クライアントで無事接続できることを確認。しかし、いくつか問題があった。

## 同じセッションに繋げない問題
### 問題
リモート接続して接続を切断しもう一度繋ごうとすると新しいセッションに繋がり、これまでのセッション上での作業内容がどこかに消えてしまう。
### 解決策
[remote desktop - How do I set up xrdp session that reuses an existing session? - Ask Ubuntu](http://askubuntu.com/questions/133343/how-do-i-set-up-xrdp-session-that-reuses-an-existing-session)
の回答にある通り`/etc/xrdp/xrdp.ini`のポート番号を適当に設定すると動くと思いきや、そこに既にセッションがないとproblem connectingで入れない。これは、port=-1は新しいセッションを毎回作り出すことを意味するらしく、新しいセッションがない状態ではportを指定しても意味ない。なのでport=askにしておいて、最初は接続後画面でport: -1を設定し、新しいセッションに接続し、その後は作られたセッション番号を指定して接続すると良いっぽい。（5910とか。`echo $DISPLAY`とか見るとわかるはず。）

## タブ補間が効かない問題
### 問題
ターミナルなどでtab補完しようとしてもSuper+Tabとして認識され、ウインドウ切り替えが発生し動かない。
### 解決策
[Command line auto complete tab key not work in terminal for Ubuntu - Stack Overflow](http://askubuntu.com/questions/352121/bash-auto-completion-with-xubuntu-and-xrdp-from-windows)
Railsのf.selectにclassが設定できなかった

## 現象

Rubyもあやしい僕ですが、最近Railsを触ってます。

そんな中で`f.select`を使用してclass属性を設定しようとしたところ何故か設定できませんでした。

```ruby
<%= f.select :object, :property, :class => 'foobar' %>
```

```html
<select id="foo_object">
  :
```

[日本語のRailsドキュメント](http://railsdoc.com/references/select)を読んでも問題なさそうだし、何がいけないんだろう…。

## 修正

ググッてみたところ、以下のようにしろということでした。

```ruby
# f.select 第3引数に {} を追加
<%= f.select :object, :property, {}, :class => 'foobar' %>
```

すると

```html
<select id="foo_object" class="foobar">
  :
```

ちゃんと出力された！！
`{}`が気持ち悪ーい！！

## 原因

原因は先ほどのRailsドキュメントの[ソースコードへのリンク](https://github.com/rails/rails/blob/71c7fd101324046995d8f7e51e78475c0e37ec1a/actionview/lib/action_view/helpers/form_options_helper.rb#L776)を見ればわかりました。

メソッドの定義が以下のようになっていました。

```ruby
def select(method, choices = nil, options = {}, html_options = {}, &block)
  :
```

つまり、`options`をスキップして、`html_options`に設定する必要があったみたいです。なんだこれ…。
Remix OS for PC導入方法【mac】

# Remix OS とは
![remix-os-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/110454/5b059f49-0211-d8a1-03dd-7c79c1cc6c6d.jpeg)

Android互換OSでUSBがあれば簡単にインストールすることができます。

今回installに非常に手間取りました、ｇｇると出てくる下記の様なサイトを参考に導入するもののOS起動画面で完全に止まるのです。

> [MacでAndroidベースOS「Remix OS for PC」のブートUSBを作る方法](http://applech2.com/archives/47508631.html)

色々調べた結果、うまくいった方法をまとめます。

## USBのフォーマットはWindowsで行う

`スタート→コンピュータ→USBDriveを右クリック→フォーマット`

するとこのような画面が出てくると思います。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/110454/686407ea-eede-3f04-f34e-91ce8b9ff898.png)

### 変更箇所が２点

ファイルシステムを`FAT32`

フォーマットオプションの`クイックフォーマット`のチェックを外す

この設定でフォーマット開始を押します、クイックフォーマットのチェックを外したのでそこそこ時間がかかりますが気長に待ちましょう。

## ブートUSBの作成

フォーマットできたUSBを引っこ抜いてmacに挿しましょう

remix OSも落としておきます。今回は64bit版にしました。

> [remix OS for PC](http://www.jide.com/remixos-for-pc)

ISOからCDなしでUSBにインストールするため下記のソフトをダウンロードしましょう。

> [UNetbootin](https://unetbootin.github.io/)

開くと`開発元が未確認のため開けません`と怒られる場合があります
その時はctrlキー+クリックで開いてください

<img width="414" alt="スクリーンショット 2016-04-15 12.14.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/110454/fb875111-8767-90ff-6809-ad1d7d6d3098.png">

### 変更点

- Diskimageを選択
- 先ほどダウンロードしたremixOSのisoファイルを選択
- 先ほどフォーマットしたUSBを選択

できたらokボタンを押してください

<img width="525" alt="スクリーンショット 2016-04-15 12.15.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/110454/1c7718eb-97fb-1db2-3d6e-3337da95b922.png">

インストールが完了したらmacを再起動します

## いよいよremixOSの起動

再起動時に`alt/optionキー`を長押しします。

どのディスクを使うか選択できるのでWindowsと書かれた方を選択します。

すると起動し始め`guestモード`か`residentモード`を選べるのでとりあえずguestモードを選択します。

しばらくすると・・・・。

![CgDMdjQUMAAzdjt.jpg](https://qiita-image-store.s3.amazonaws.com/0/110454/873cd2c3-bb32-5d7f-d87e-5efd64b36dff.jpeg)

### うごいたあああああああああ
POIで大きなExcelシートを取り込もうとしたら、ふりがなにふりまわされた

## 問題
- POI(3.8)をevent-apiを使ってExcelシートのセルの文字列を取得したら、後ろにゴミが付いてた。
- Apache POIを使ったExcel 2007形式のシートの取込処理を保守していた。
- ちょっと大きいExcelシートを取り込んだら、メモリー不足になっので、event-api を使って取り込むようにした。
- プログラムの動きがおかしいので、データを確認したら文字列の後ろにフリガナぽいゴミがついてた。
- 「未対策」が取れるはずなのに、「未対策ミタイサク」になってしまう。はて。

## 分析
- Excelファイルの拡張子をzipにして解凍。sharedString.xmlを参照してみる。

```xml:sharedString.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1"><si><t>未対策</t><rPh sb="13" eb="14"><t>ミ</t></rPh><rPh sb="14" eb="16"><t>タイサク</t></rPh><phoneticPr fontId="19"/></si></sst>
```

- **\<rPh\>**と**\</rPh\>**の中に「ミ」と「タイサク」が格納されている。
- Excelシートに入力時にふりがなが保存されているぽい。**\<rPh\>**は無視するようにすればいいか。

## 対策
- ReadOnlySharedStringsTableクラスをOverrideして**\<rPh\>**タグ内の**\<t\>**は取り込まないようにしました。

```java:MyStringTable.java
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

public class MyStringsTable extends ReadOnlySharedStringsTable {

    private boolean isPhonetic;

    public MyStringsTable(OPCPackage pkg) throws IOException, SAXException {
        super(pkg);
    }
    
    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
    	super.startElement(uri, localName, name, attributes);

        if ("rPh".equals(name)) {
        	isPhonetic = true;
        }
    }

    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
    	super.endElement(uri, localName, name);

        if ("rPh".equals(name)) {
        	isPhonetic = false;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (!isPhonetic) {
        	super.characters(ch, start, length);
        }
    }
}
```

## ...
- Excelのフリガナ機能って日本独自の仕様なのかね。みんな使われているんだろうか。
- 初めての投稿なのでドキドキ。もっと丁寧に書きたいけど、とりあえずこれで。
- 作成時間15分