OmniAICreator/Qiita-1.07M huggingface dataset:
マルチバイト対応str_replace【PHP】

ありそうでないんだ...知らなかったw
というわけで作りました。

```php

/**
 マルチバイト対応str_replace
*/
function mb_str_replace($search, $replace, $haystack, $encoding="UTF-8")
{
    // 検索先は配列か？
    $notArray = !is_array($haystack) ? TRUE : FALSE;
    // コンバート
    $haystack = $notArray ? array($haystack) : $haystack;
    // 検索文字列の文字数取得
    $search_len = mb_strlen($search, $encoding);
    // 置換文字列の文字数取得
    $replace_len = mb_strlen($replace, $encoding);

    foreach ($haystack as $i => $hay){
        // マッチング
        $offset = mb_strpos($hay, $search);
        // 一致した場合
        while ($offset !== FALSE){
            // 差替え処理
            $hay = mb_substr($hay, 0, $offset).$replace.mb_substr($hay, $offset + $search_len);
            $offset = mb_strpos($hay, $search, $offset + $replace_len);
        }
        $haystack[$i] = $hay;
    }
    return $notArray ? $haystack[0] : $haystack;
}

// test
$search = "あいうえお";
$replace = "かきくけこ";
var_dump(mb_str_replace($search,$replace,"xxxxxxあいうえお","UTF-8")); // xxxxxxかきくけこ

```
読めないファイルにLibreOfficeで応戦

[LibreOffice AdventCalendar 2016](http://www.adventar.org/calendars/1639) 12月18日の記事として投稿します。


皆様は理不尽なファイルを送り付けられたことはないでしょうか？
「読めねーよ。こんなファイル。」ってやつです。

- 何でもExcel,SIer
- 何でもPowerPointの営業
- 何でもWordの結婚式の司会者
- 何でもPhotoshop,Illustratorのデザイナー
- 何でもFileMakerのMACer
- AutoCAD図面を送り付けてくる設計者

「一応、商社[^1]」にお勤めの僕はすべての事象に遭遇しました。

- 作り出したソフトがないと作り出したファイルは読めない。
- お前の持っているソフトは俺が持っているとは限らない。

という当たり前のことが分かっていらっしゃらない。
色々言いたいことはありますが大人の対応をしていきましょう。

彼らのファイルを何とか見てあげる方法を考えます。
LibreOfficeで何とかなってしまうものです。
FileMakerが読めるのはFileMakerだけなので諦めて下さい。
では、初めて行きましょう。

##LibreOfficeの対応ファイル形式
FileMakerは無理です。
それ以外はLibreOfficeで取り敢えず読むことはできます。

LibreOffice Calc

- Excel (*.xls *.xlsx  *.xlsm)

LibreOffice Impress

- PowerPoint (*.ppt *.pptx)

LibreOffice Writer

- Word (*.doc *.docx)

LibreOffice Draw

- Photoshop (*.psd)
- Illustrator (*.eps)
- AutoCAD (*.dxf)

取り敢えず読めるというだけです。
100%互換ではありません。

罫線ゴリゴリのExcel方眼紙とか、
LibreOfficeにない機能まで使われたExcelファイルとか、
の再現は厳しいでしょう。

LibreOfficeの形式に変換して送り返してしまいましょう。(w
心配いりません。
Microsoft Office 2007からはLibreOfficeの形式の読み書きには対応しています。
我々は理不尽なファイルに善処したのですから。

PhotoshopやIllustratorやAutoCADのデータはどうするの？
うーん、そもそも弄れる人が専門家なので、
追記してPDFかJPEGにして送り返しましょう。
最近のAdobeReaderで追記は可能ですからね。
彼らもそもそもPDFかJPEG,PNGあたりでファイルを渡すべきだったのですから。
PDFにすべきだったと反省するに違いありません。

##それ以外はどうするの？
残念ながら以下の形式は対応していません。

- Illustratorのai形式
- AutoCADのDWG形式

ファイルを見るためだけに高価なIllustratorやAutoCADなんて買えませんよね。
ビューワーソフトを探しましょう。

- Illustrator ビューワー 
- AutoCAD ビューワー

何かの検索キーワードでネット検索をかけると見つかるでしょう。

##Illustratorのaiファイル
LibreOfficeでepsは読めるもののai形式のファイルは読めません。

Illustratorのai形式はai viewerというソフトがあるようです。
Windows限定
他にもInkscapceを使うとかという方法もあります。
InkscapeはLinux Mac Windowsで使えます。

[Ai Viewer](http://aiviewer.com/)　- Windows版
[Inkscape](https://inkscape.org/ja/download/) - Linux Mac Windowsで使える

##AutoCADのDWG形式

流石のLibreOfficeもAutoCADのDWG形式には対応していません。

AutoCADの場合はメーカーがOnline Viewerを用意しています。
それで見るといいでしょう。
[A360 Online Viewer](https://a360.autodesk.com/viewer/)

##MSOfficeドキュメントならMicrosoft Onlineでいいんじゃない？

君のように勘のいいガキは嫌いだよ。[^2]

Microsoft アカウントを用意して…という作業は企業ユースでは難しい。
Microsoftアカウントを自分で取得できる商社マンならそれでいいけど。
誰がアカウント取るのよ。
監査がセキュリティーが情報漏洩がなんて言い出したら。
Office365 ?
...。

[^1]: 明日があるさ - 浜田課長のセリフ
[^2]: 鋼の錬金術師より
UnityでARC設定を編集する方法

# 前置き
　①　ネイティブプラグインのARC設定を無効化したいケースが発生
　②　Xcodeの設定でネイティブプラグイン（本例では.mm）に対し、「-fno-objc-arc」のオプションを指定することで、ARC設定を無効化できる
　③　Unity側で、ビルド後にXcodeプロジェクトの設定を変更できたら嬉しい

# 環境
　Unity：5.0.1
　Xcode 6.1


# 編集方法
　① 「XCode Editor for Unity (UnityEditor.iOS.Xcode)」を使う（Unity5.0からは標準で入ってるため、準備は不要）
　② [Editor]フォルダ以下に「XXX.cs」ファイルを作成
　③ ②で作成したファイルに
　　　[PostProcessBuild]　　★属性
　　　public static void OnPostProcessBuild (BuildTarget target, string path)　　★メソッド
　　　を追記し、そのメソッド内で"PBXProject"クラスを使ってXcodeプロジェクト設定を編集する

# 具体的な実装
　WebViewerのネイティブプラグイン「WebView.mm」のARC設定を無効化する

```lang:PostProcessBuildScript.cs
/// <summary>
/// ビルド後処理スクリプト
/// </summary>
/// <param name="buildTarget">ビルド対象</param>
/// <param name="path">ビルド対象のパス</param>
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
{
	//iOSビルド後の設定
	if (buildTarget == BuildTarget.iOS) 
	{
		ModifyXcodeProject(path);
	}
}

/// <summary>
/// Xcodeプロジェクトの編集処理スクリプト
/// </summary>
/// <param name="path"></param>
private static void ModifyXcodeProject(string path)
{
	string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
			
	PBXProject proj = new PBXProject();
	proj.ReadFromString(File.ReadAllText(projPath));
			
	string target = proj.TargetGuidByName("Unity-iPhone");

	//////WebView.mmのARC設定を無効化する
	List<string> compile_Flags = new List<string>();
	compile_Flags.Add("-fno-objc-arc");
	proj.SetCompileFlagsForFile(target, proj.FindFileGuidByProjectPath("Libraries/Plugins/iOS/WebView.mm"), compile_Flags);


	File.WriteAllText(projPath, proj.WriteToString());
}
```

# 参考
ARCの有効/無効設定を切り替える方法
　http://lab.dolice.net/blog/2013/05/10/objc-arc-switch/

UnityでのXcode設定をUnityEditorのスクリプトだけで自動化する
　http://cflat-inc.hatenablog.com/entry/2015/01/05/074442
SourceTreeで隠しフォルダにあるリポジトリを追加する方法

# 背景
最近、Gitの管理を[ghq](https://github.com/motemen/ghq)という、Go製のリポジトリ管理ツールを使っているが、Githubからダウンロードしたリポジトリを隠しフォルダ(~/.ghq)に保管するため、[SourceTree](https://ja.atlassian.com/software/sourcetree)の`新規リポジトリ>既存のローカルリポジトリを追加`に表示されない。

ではどうするかというと、Finderで隠しフォルダを表示させるか、openコマンドでフォルダを開き、gitリポジトリのフォルダをSourceTreeにドラックアンドドロップすると追加できる。

# 手順
## openコマンドでフォルダーを表示

```
$ open ~/.ghq/
```

## SourceTreeにフォルダをドラックアンドドロップする

<img width="482" alt="貼り付けた画像_2016_12_26_15_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/2432/46c57651-8345-c5f2-268c-ec39dfd46e9d.png">

# 隠しフォルダについて

OSXのデフォルトでは隠しフォルダが表示されない。常にFinder上に隠しフォルダを表示したい場合は、以下の記事を参考に有効化すれば隠しフォルダが表示されます。
[Macで隠しファイルを表示する方法](http://qiita.com/clutter/items/520efe83b48375048c9f)

# 参考記事
[Is there a way to add a hidden folder (with . prefix) to SourceTree?](http://stackoverflow.com/questions/29837813/is-there-a-way-to-add-a-hidden-folder-with-prefix-to-sourcetree)
BurpSuiteExtensionについての備忘録

# 概要

診断作業のPC環境を変えたときにまず追加するBurpSuiteのExtensionを、備忘録としてまとめました。
※下記Extensionは一部Pro版のみで使用できるものがあります。

# よく使うExtension

## Logger++

自動でログが保存されます。
また、ProxyやScannerごとのリクエスト/レスポンスが、まとめて格納されるので、ログの参照が簡単になります。

ダウンロード：Logger++
https://portswigger.net/bappstore/ShowBappDetails.aspx?uuid=470b7057b86f41c396a97903377f3d81

## Software Version Reporter

リクエスト/レスポンスに含まれるソフトウェアのバージョンチェックを自動で行ってくれるので、助かります。

ダウンロード：Software Version Reporter
https://portswigger.net/bappstore/ShowBappDetails.aspx?uuid=ae62baff8fa24150991bad5eaf6d4d38
※Pro版のみで使用可

## Paramalyzer

スコープに設定したURLについて、パラメータと送信した値を集計してくれます。
Proxyタブのヒストリーや、Logger++で確認するよりも手間がかからないので、ありがたいですね。

ダウンロード：Paramalyzer
https://portswigger.net/bappstore/ShowBappDetails.aspx?uuid=0ac13c45adff4e31a3ca8dc76dd6286c

## JSON Decoder

JSONのリクエストを読みやすい形に整形してくれます。
以前は社内の環境を利用して整形していたので、BurpSuite内で完結できるようになり作業効率があがりました。

ダウンロード：JSON Decoder
https://portswigger.net/bappstore/ShowBappDetails.aspx?uuid=ceed5b1568ba4b92abecce0dff1e1f2c

## burp-msgpack

MessagePackを使用したサービスを診断する際に使用しています。

株式会社サイバーディフェンス研究所の松永さんが下記で公開しているExtensionです。大変ありがたく使用させていただいております。
http://io.cyberdefense.jp/entry/2016/05/13/Burp_Extension%E9%96%8B%E7%99%BA_-_MessagePack#toc5

# まとめ

他にも、公式のBApp Storeなどで色々なExtensionが公開されていますので、
実際に触ってみながら、便利なものを診断作業に取り入れていきたいと思います。
Dockerで分析環境構築(jupyter notebook + PostgreSQL)

## 本記事では
- Dockerを利用したデータ分析環境の構築
- docker-composeでのpythonとpostgresqlの接続確認

を行っています

## imageについて
postgresqlについては、公式のDockerイメージを利用しています。
anaconda環境は、自作のイメージをベースにしたDockerfileを作成しています。

```Dockerfile
FROM kyobad/anaconda3-alpine

MAINTAINER K.Kato

RUN conda install -y seaborn psycopg2 networkx\
&& pip install chainer

WORKDIR /root/notebook

CMD ["/bin/sh", "-c", "jupyter notebook --no-browser --port=8888 --ip=0.0.0.0"]
```

こちらは、anaconda環境をベースに、seabornやpsycopg2といった分析環境をインストールしたイメージです。

## composeファイルについて
このpython環境と、postgresqlを接続するためのdocker-composeの構成ファイルを作成します。

```docker-compose.yml
version: '2'
services:
    db:
        image:
            postgres
        restart:
            always
        environment:
            POSTGRES_USER:
                pythonist
            POSTGRES_PASSWORD:
                password
            POSTGRES_DB:
                mypyenv
        ports:
            - "5432"
        container_name:
            postgres-db
        volumes:
            - ./postgres-db:/var/lib/postgresql/data
            - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    python:
        build: .
        volumes:
            - ./workdir:/root/notebook/
        ports:
            - "8888:8888"
        links:
            - db
        depends_on:
            - db
```
dbのenvironmentで、ユーザ名やパスワード等を設定しています。これらは適宜変更して使ってください。
volumeで設定している postgres-db/ は、postgresのデータをローカルにマウントしてバックアップを取っています（本当はdataonlyのコンテナを作成することが望ましいとされている？）
docker-entrypoint-initdb.dは、コンテナ起動時の初期設定です。ここに、テーブル作成等のsqlファイルを置いておくと、それらがコンテナ起動時に行われます。
pythonのvolumeは、起動したnotebookをローカルに保存するためのマウントです。

## 起動方法
これらを置いたディレクトリで、

``docker-compose up``

コマンドを実行することで、postgresコンテナとjupyter notebookコンテナが立ち上がります。

ブラウザから、localhost:8888にアクセスし、composeファイルに書いてあるdb名やパスワードでdbにアクセス可能です

![スクリーンショット 2016-12-26 14.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/116528/ee9e24bc-2e74-b51a-5e3c-a13d2f374cbf.png)

## 結論
- Dockerを使うことで簡単に分析環境の構築や再構成等可能になる
- notebookやpostgresデータをローカルにマウントすることでバックアップ＆ポータブルが可能
Amazon Dash Button > Link > DNSの処理 > 参考になる名前解決サーバのプログラムを紹介いただいた

Amazon Dash Buttonのボタン押下をESP8266で検知するにはどうするか。

Dasher(Node.js使用)のような高機能なものは使えない。

以下を見つけた。
http://blog.nemik.net/2015/08/dash-button-corral/
> By running WireShark and ettercap, we can observe how the Dash Buttons behave. They phone home to “parker-gateway-na.amazon.com”. But they look up the IP for that domain by talking to Google’s 8.8.8.8 DNS servers. The Button doesn’t use the DNS server given by your home DHCP server, it insists on using Google’s. That’s pretty smart. But we can get around that.

8.8.8.8(DNSサーバー)に問い合わせてしている。
DNS問い合わせをESP8266で検知できるかどうか。

あるいは「parker-gateway-na.amazon.com」への問い合わせ検知でもいい。

@soramimi_jp さんのESP8266用DNSコードも気にはなっている。
http://www.soramimi.jp/esp8266/naming/

<hr>
(追記 2016/12/26)

@soramimi_jp さんが作られたBogonsの情報をいただきました。

情報感謝です。
超速！gulpプラグインの作り方


こんにちはsekitakaです。

gulpを利用していると独自のgulpプラグインを作りたい場合が出てくると思います。
作り方は[writing-a-plugin](https://github.com/gulpjs/gulp/tree/master/docs/writing-a-plugin)に説明されています。
しかし公式の説明は丁寧な分、長いです。
そこで今回はとりあえずプラグインを作る必要がある方にむけて、最短でgulpプラグインを作る方法を紹介します。
[作成するサンプルプロジェクト|GitHub](https://github.com/sekitaka/gulp-plugin-template)

## gulpプラグインテンプレート
以下のコードはファイルの内容を繰り返して出力するだけのプラグインです。
これをテンプレートに`プラグイン処理本体`の部分を必要に応じて編集すれば独自プラグインの完成です。

```JavaScript
var through = require('through2');
var PluginError = require('gulp-util').PluginError;
var PLUGIN_NAME = 'プラグイン名';

module.exports = function() {
  /**
   * @this {Transform}
   */
  var transform = function(file, encoding, callback) {
    if (file.isNull()) {
      // 何もしない
      return callback(null, file);
    }

    if (file.isStream()) {
      // ストリームはサポートしない
      this.emit('error', new PluginError(PLUGIN_NAME, 'Streams not supported!'));
    }

    // プラグインの処理本体
    if (file.isBuffer()) {
      // ファイルの内容をcontentsに読み込み
      var contents = String(file.contents);

      // 同じ内容を繰り返す(サンプル)
      contents = contents + contents;

      // 編集した内容を出力
      file.contents = new Buffer(contents);

      // 処理の完了を通知
      return callback(null, file);
    }

    this.push(file);
    callback();
  };

  return through.obj(transform);
};

```

## 使い方
### プラグインファイルの作成
テンプレートをコピーしてgulpfile.jsと同じ階層に、`gulp-my-plugin.js`を作成します。

ちなみにnpm経由でプラグインをインストールする場合はnode_modules以下にプラグインが作成されます。
しかし独自プラグインではそこまでする必要はないでしょう。サクッとプロジェクト直下に作成します。

### gulpfile.jsでの使い方
プラグインファイルがnode_modules以下に配置されないので、`require`のパラメタの先頭に`./`を追加してモジュールを読み込みます。
その他の使い方は一般的なプラグインと同様にpipe内で関数を実行します。

```JavaScript|gulpfile.js
var gulp = require('gulp');
var myPlugin = require('./gulp-my-plugin'); // 先頭に./を記述

gulp.task('default',function(){
  return gulp.src(['src/*'])
    .pipe(myPlugin()) // 独自プラグインを使用
    .pipe(gulp.dest('dist/'));
});
```

### サンプルプロジェクト
今回使用したプロジェクトはGitHubで公開しています。自由に利用してください。
https://github.com/sekitaka/gulp-plugin-template


## ストリームの非サポートについて 
このサンプルでは、ストリームでの入力をサポートしていません。
しかしストリームを利用するかはタスクの登録時に自分で制御できるので問題ないでしょう。

ストリームを使用する場合は以下のように`src`関数へのオプションを指定します。

```JavaScript
gulp.task('default',function(){
  var options = {
    buffer:false // falseの場合はストリームを使用する(デフォルトはtrue)
  };
  return gulp.src(['src/*'],options)
    .pipe(myPlugin())
    .pipe(gulp.dest('dist/'));
});
```

## まとめ
いかがでしたでしょうか。今回はgulpプラグインをサクッと作る方法について説明していきました。
仕組みを深く知りたい方は公式ドキュメントを読んでみるとよいと思います。
MongoDB export ,import, dump, restore ダッシュボード

2016年もいよいよカウントダウンですね。残すところあと５日です。

# 今日のお悩み

mongodbのcollectionを別dbへのcollectionに移動させたい

要はexport/importですね。


# 解決

mongoexport と　mongoimportを使います

- [mongoexport — MongoDB Manual 3.4 ](https://docs.mongodb.com/manual/reference/program/mongoexport/#cmdoption-mongoexport--collection)
- [mongoimport — MongoDB Manual 3.4 ](https://docs.mongodb.com/manual/reference/program/mongoimport/)

- （例）エクスポート

```bash

$ mongoexport --db old_db --collection users --out /tmp/users.json

2016-12-26T05:22:27.667+0000	connected to: localhost
2016-12-26T05:22:27.671+0000	exported 26 records
```

- （例）新しいdbへインポート

```bash

$ mongoimport --db new_db  --collection users --file /tmp/users.json

2016-12-26T05:24:18.118+0000	connected to: localhost
2016-12-26T05:24:18.159+0000	imported 26 documents

```


## 注意

これらのコマンドは、プロダクション環境のフルインスタンスのバックアップ用途としては使わないように、ということですね。



## mongodbのバックアップにはmongodumpを戻すのはmongorestoreで

- [mongodump — MongoDB Manual 3.4]( https://docs.mongodb.com/manual/reference/program/mongodump/)
- [mongorestore — MongoDB Manual 3.4]( https://docs.mongodb.com/manual/reference/program/mongorestore/)


- （例）mongodump

```bash

$ mongodump --archive=/tmp/test.20150715.gz --gzip --db test

2016-12-26T05:44:08.920+0000	writing test.users to archive '/tmp/test.20150715.gz'
2016-12-26T05:44:08.928+0000	writing test.rooms to archive '/tmp/test.20150715.gz'
2016-12-26T05:44:08.930+0000	done dumping test.users (26 documents)
2016-12-26T05:44:08.931+0000	done dumping test.rooms (6 documents)
```

- （例）mongorestore

```bash

$ mongorestore --gzip --archive=/tmp/test.20150715.gz --db test

2016-12-26T05:47:04.805+0000	creating intents for archive
2016-12-26T05:47:04.844+0000	reading metadata for test.users from archive '/tmp/test.20150715.gz'
2016-12-26T05:47:04.870+0000	restoring test.users from archive '/tmp/test.20150715.gz'
2016-12-26T05:47:04.890+0000	reading metadata for test.rooms from archive '/tmp/test.20150715.gz'
2016-12-26T05:47:04.902+0000	restoring test.rooms from archive '/tmp/test.20150715.gz'
2016-12-26T05:47:04.919+0000	restoring indexes for collection test.rooms from metadata
2016-12-26T05:47:04.919+0000	restoring indexes for collection test.users from metadata
2016-12-26T05:47:04.919+0000	finished restoring test.users (26 documents)
2016-12-26T05:47:04.919+0000	finished restoring test.rooms (6 documents)
2016-12-26T05:47:04.920+0000	done
```

## 注意

mongodump only captures the documents in the database.
 The resulting backup is space efficient, but **mongorestore or mongod must rebuild the indexes after restoring data.**
Bootstrap3でカーソルをpointerにする

# <i class="fa fa-cubes"></i>  副題

Bootstrap3でCSSの追加無しにプレースホルダーリンク上のカーソルをpointerにする

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

`role="button"`属性を追加する。

```css:bootstrap3.3.7.css
[role="button"] {
  cursor: pointer;
}
```

# <i class="fa fa-cubes"></i> 概要

プレースホルダーリンクは、通常のリンクと異なり、マススオーバー時のカーソルがtextの「I」のようなものになってしまう。
デフォルトの指矢印「<i class="fa fa-hand-o-up" aria-hidden="true"></i>」のようなものにしたい。

# <i class="fa fa-cube"></i> なりゆき

1. SPA風ページ作りたい
2. ページ遷移はJSが担当する
3. テキストリンクを作りたい
4. ただしリンク移動はせず、JSでページ書き換える
5. なので、移動先は指定せず、プレースホルダーリンクに`onClick`を設定する
6. カーソルはリンクだとわかりやすいように<i class="fa fa-hand-o-up" aria-hidden="true"></i>がいい
7. プレースホルダーリンクではカーソルが<i class="fa fa-hand-o-up" aria-hidden="true"></i>にならない
8. `href="javascript:void(0)"`はかっこ悪いからキライ
9. `return false;`もちょっと…そもそもダミーのリンクURLも設定するの面倒
10. CSSで設定したい
11. CSS書きたくない
12. Bootstrapから探す
13. あった

あくまでローカルなもののズボラ策として。

# <i class="fa fa-cogs"></i> 検証環境

* Bootstrap3.3.7
* Firefox 50

# <i class="fa fa-code"></i> コード

http://www.bootply.com/cpc3jdHWMr

```html

<a href="test">普通のリンク</a> <br>
<a>プレースホルダリンク</a> <br>
<a href="javascript:void(0)">JavaScriptリンク</a> <br>
<a role="button">ロール付きプレースホルダリンク</a>

```

<a href="test">普通のリンク</a> <br>
<a>プレースホルダリンク</a> <br>
<a href="javascript:void(0)">JavaScriptリンク</a> <br>
<a role="button">ロール付きプレースホルダリンク</a>

QiitaもBootstrapな同じスタイルがあるはずですけどプレビューでは出力の`role`属性が削除されている。

# <i class="fa fa-question-circle" aria-hidden="true"></i> `role`属性って？

Web Accessibility Initiativeが策定したWAI-ARIAという、アクセシビリティを高めるための仕様の一部。
障害者のための補助属性などにもなるもよう。
まだまだ普及はしていないだろうが、表示上のスタイルのためだけに乱用することはよくないでしょう。

が、これが2014年3月20日勧告で、Bootstrap3自体は2013年からリリースしている。(初リリース時点では`role`は含まれていないが)
`role`属性の設定も`button`しか書かれていないので、BootstrapはWAI-ARIAを意識した`role`属性じゃないんじゃないかなーと思います。
ただそのまま、押せる(button)ことを表したいときに使うスタイル、程度かもしれません。

# <i class="fa fa-book"></i> 参考

* [クリックしても何も起こらないダミーのa要素 - Qiita]

* [HTML5/テキスト/a要素 プレースホルダを表す - TAG index]

* [WAI-ARIA の基礎知識 — Website Usability Info]

* [twbs/bootstrap at v3.3.7]

* [HTML で aタグを使ってるのに、矢印カーソルが出てこなくてなんでやねんと思った時 - Qiita - コメント]

[クリックしても何も起こらないダミーのa要素 - Qiita]:http://qiita.com/448jp/items/dbd2e4ee0a6ec500d329
[HTML5/テキスト/a要素 プレースホルダを表す - TAG index]:http://www.tagindex.com/html5/text/a_placeholder.html
[WAI-ARIA の基礎知識 — Website Usability Info]:http://website-usability.info/2014/04/entry_140415.html
[twbs/bootstrap at v3.3.7]:https://github.com/twbs/bootstrap/tree/v3.3.7

[HTML で aタグを使ってるのに、矢印カーソルが出てこなくてなんでやねんと思った時 - Qiita - コメント]:http://qiita.com/mm36/items/71004eb822726670eebf#comment-6845dddb77c049f1fbbf
よく使えるRuby/Rails文法と実行されるSQL文を一緒に学ぶ

# pluck：任意のカラムの配列を取得
pluckって日本語でなんだ？と思って、ググったら出てきました。
摘むことができるらしい。

<img width="646" alt="スクリーンショット 2016-11-23 18.05.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/135475/b6aad7bd-f2f2-f76a-b09a-351c35e89f93.png">


## かんたんな例1
usersテーブルからidとfirst_nameのカラムのみ取得する

```ruby
User.pluck(:id, :first_name)
```
実行されるSQL文

```sql
SELECT users.id, users.first_name FROM users
```

limitつけるなら、pluckの前

```ruby
User.limit(5).pluck(:id, :first_name)
```

```sql
SELECT users.id, users.first_name FROM users LIMIT 5
```

consoleでの実行結果

```ruby
[[1, "トム"], [2, "マリ"], [3, "キミ"], [4, "ナミ"], [5, "リサ"]]
```


## かんたんな例2
whereで条件付きで、usersテーブルからidとfirst_nameのカラムのみ取得する。

```ruby
User.where(sex: "女性").limit(5).pluck(:id, :first_name)
```

consoleでの実行結果

```
[[2, "マリ"], [3, "キミ"], [4, "ナミ"], [5, "リサ"], [6, "ミネ"]]
```

リファレンス
- http://railsdoc.com/references/pluck

# map：各要素を{ }内の式を実行した結果を返す
collectと同義。

```ruby
array = [1,2,3]
array.map(&:to_s)
# => ["1", "2", "3"]
```

```ruby
# すべて3倍にして返す
[1, 2, 3].map { |n| n * 3 }
# => [3, 6, 9]
```


# select：{ }内の式がtrueになる要素のみ返す

find_allと同義。

```ruby
# 2で割り切れるものを抽出する
[1, 2, 3, 4, 5, 6].select { |n| n % 2 == 0 }
# => [2, 4, 6]

# 9で割り切れるものがないので空の配列が返る
[1, 2, 3, 4, 5, 6].select { |n| n % 9 == 0 }
# => []
```

# reject：selectの反対(falseになる要素のみ返す)
falseになる要素がない場合は空の配列が返る。

```ruby
# 2で割り切れるものじゃないものを抽出する
[1, 2, 3, 4, 5, 6].reject { |n| n % 2 == 0 }
# => [1, 3, 5]

# すべて1で割り切れるので空の配列が返る
[1, 2, 3, 4, 5, 6].reject { |n| n % 1 == 0 }
# => []
```

# find / detect：{ }内　の式がtrueになった最初の要素を返す
ポイント： **最初の要素**！！
detect と find は同義。

trueになる要素がない場合はnilが返る。

```ruby
# 最初の3の倍数を探す
[1, 5, 8, 2, 6, 3].find { |n| n % 3 == 0 }
# => 6

# 7で割り切れるものがないのでnilが返る
[1, 5, 8, 2, 6, 3].find { |n| n % 7 == 0 }
# => nil
```

### find_index：要素の位置を知りたい場合

```ruby
# 最初の3の倍数の位置を探す
[1, 5, 8, 2, 6, 3].find_index { |n| n % 3 == 0 }
# => 4
```


# grep：引数にマッチする要素のみ返す
引数には正規表現が使える。
マッチする要素がない場合は空の配列が返る。

```ruby
# 数字を含むものを抽出する
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[0-9]/)
# => ["a1", "c2", "5e"]

# 大文字の英語を含むものがないので空の配列が返る
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[A-Z]/)
=> []
```

# その他文法

## joins
テーブルを結合する。

messagesテーブルのuser_idとusersテーブルのidが同じなので、
messagesテーブルのuser_idにusersテーブルのidを紐づけて、
messagesのuser_idにuserテーブルの情報を紐づける。イメージ。
where()でmessagesの条件からそれに値するuser情報を取得することができる！

```ruby
User.joins("join messages on messages.user_id = users.id")
.where("messages.created_at > ?", 1.month.ago).limit(3)
```

```ruby
Post.where(user_id: User.joins("join posts on  posts.user_id = users.id").student.select(:id))
```

## order("RANDOM()")
RANDOM()関数を用いたorder

## scope
よくは分かってないが、とりあえず、便利そう。
scopeで遠いところからpostを取ってこれる感じ。


http://qiita.com/okamos/items/724a4a162dfa9e27754a
http://ruby-rails.hatenadiary.com/entry/20140814/1407994568


### 参考
http://www.programming-magic.com/20080110002650/
MySQLのデータベースを他のPCのMySQLにデータを移行する

#はじめに
MySQLに保存しているデータベースを
別のMySQL(別のPC)にデータを移動する

#sqlファイル（バックアップファイル）の作成
sqlファイルの作成をする。
sqlファイルを保存しておけば、バックアップファイルになる。

```bash
$ mysqldump -u root -p DatabaseName > BuckupName.sql
```

#インポート先のセットアップ
sqlファイルのインポート先のスキーマを作成する
DatabaseName = 新しいデータベース名

```bash
$ mysql -u root -p
```

```mysql
mysql > create schema DatabaseName;
```

作成したsqlファイルをインポートする

```bash
$ mysql -u root -p DatabaseName < BuckupName.sql
```
Unityを使ってAndroidで音声解析するときに困ったこと

Unityで音声解析を行うとき，躓いた問題点を記録しておきます．
私は割と致命的な欠陥だと思っています．

しかしUnityを使い始めて日が浅いため私の知識不足なだけかもしれません．
#「指定秒分録音して処理」ができない？
「1秒録音して処理」を行うプログラムを作ってみます．

Androidのマイクを使って録音する場合，AudioSourceを追加し，Microphoneを使ってAudioSource.clipに記録します．
このときマイク名，録音をループさせるか，録音時間，サンプリングレートの４つを指定します．
その後，AudioSouce.clip.GetDataを使ってAudioSourceに記録されたデータを取り出します．

``` C#:sample1.cs

float[] data;
AudioSource rec;

void Start () {
    data = new float[44100];    //音声データを格納する配列
    
    rec = GetComponent<AudioSource> ();    //AudioSourceを初期化
    rec.clip = Microphone.Start ("マイク名", true, 1, 44100);    //録音開始
    
    //次の録音ができるようになるまで待つ
    while (Microphone.GetPosition("マイク名") <= 0) {

    }
    
}

void Update () {
    rec.clip.GetData (data, 0);    //AudioSouceに記録されたデータを配列へ格納する
}

```

これでマイクで録音した音声データを取り出すことができるのですが，このプログラムでは「指定秒分録音して処理」はできません．
その理由は，Update関数が毎フレーム呼び出されるため1秒録音し終わる前の段階でAudioSourceに記録されたデータが取り出されてしまうからです．

実際に実行してみると分かりますが，明らかに１秒経たずにデータが取り出されています．（当然ですが…）

「リアルタイムで波形データを表示する」みたいなアプリを作る場合はこれでいいのでしょうが，今回はこれではダメです．
そこで録音が終了したタイミングで実行される関数はないかと探しましたが，それらしいものは見つからず，最終的には「Unityに指定秒分録音して実行する関数はない」というのが私の結論になりました．
#コルーチンを使って無理やり指定秒間待たせて実行する
「Unityに指定秒分録音して実行する関数はない」というのが私の結論になりました．と書きましたが，できないで済めば苦労はしません．
なんとか，ややごり押し気味ではありますが，指定秒分録音して処理することができるようにしました．

``` C#:sample2.cs

bool isRec = true;
float[] data;
AudioSource rec;

void Start () {
    rec = GetComponent<AudioSource> ();    //AudioSourceを初期化
    StartCoroutine ("SecRecording");    //コルーチンを実行
}

IEnumerator SecRecording () {

		float[] data = new float[44100];    //音声データを格納する配列

        //録音を繰り返す
		while (isRec) {
			rec.clip = Microphone.Start ("マイク名", false, 1, 44100);
			yield return new WaitForSeconds (1.0f);

			rec.clip.GetData (data, 0);
		}
}

```

変更点をまとめます．

- 録音をループをwhile文で行うようにした
- yield returnを使って1秒間（録音時間分）待たせ，その後で処理を実行するようにした

これで厳密ではありませんが，指定秒分録音して処理を行うことができるようになりました．
他に何か方法があれば教えてください．
ポリモーフィズムクイズ

[Java Puzzlers Advent Calendar 2016](http://qiita.com/advent-calendar/2016/java_puzzlers)の投稿は一つだけ足りないという惜しい状況になっていますので、Day 5の記事を代打させて頂きます。

#問題

```java
class MyTest
{
	private static class A {
		String message = "hello";
		Consumer<String> hello = s -> System.out.print(message + s);
		void hello(String s) { this.hello.accept(s); }
	}
	
	private static class B extends A {
		String message = "ハロー";
		void hello(String s) { this.hello.accept(s); }
	}

	public static void main(String[] args) {
		A b = (A) new B();
		b.hello(" world");
		System.out.print("/");
		b.hello.accept(" world");
	}
}
```

上記のコードの実行結果は

- [ ] A. ハロー world/hello world
- [ ] B. ハロー world/ハロー world
- [ ] C. hello world/ハロー world
- [ ] D. hello world/hello world
- [ ] E. コンパイルエラー


#正解
答えは

- [x] D. hello world/hello world


#説明
一見複雑そうですが、実はポリモーフィズムをちゃんと理解できれば、すぐ解けるはずです。それでは、`main`メソッドの処理を追って見ましょう。  
- `main`メソッドの一行目では`A`型`B`実装の変数`b`を宣言しました。`(A)`というアップキャストの処理が書かれていますが、実はコンパイラが自動的に行ってくれる作業なので、ただの目障りで意味がありません（勿論エラーにもなりませんが・・）。
- `b`のメソッドを利用する際に、コンパイラはまず実装型にそのメソッドがあるかどうかを見ます（二行目）。クラス`B`に`hello`というメソッドがありましたね。オーバーライドが明記されていませんが、シグネチャに違いがない為、親クラスの`hello`メソッドがオーバーライドされていることは分かります。ポリモーフィズムのルールによりクラス`B`の`hello`メソッドが実行されます。
- `hello`いうメソッドは`hello`というコンシューマー関数のフィールドを呼んでいますが、残念ながら`A`クラスにしか`hello`が存在しません。その為、やむを得ず`A`クラス内の`hello`関数を利用することになります。（ちなみに、メソッド名とフィールド名の重複は許されますので、コンパイルエラーになりません）
- `hello`という関数は`message`というフィールドを使います。クラス`A`の`message`は`hello`ですので、出力結果は`hello world`になります。クラス`B`にも`message`というフィールドが存在しますが、今使っている`hello`関数とは無関係ですね。
- さらに`main`の四行目ですが、`b`オブジェクトの`hello`関数を利用しているように見えますね。しかし、フィールド変数のオーバーライドが存在しないことを忘れてはいけません。`hello`関数は`hello`メソッドと同じく処理手続きを定義するものですが、本質的には`message`のようなフィールド変数です。その為、どのフィールドが利用されるかは宣言時の参照型によります。`A`として宣言された為、クラス`A`の`hello`関数が利用され、二行目の出力結果と同じようになります。

#参考
- https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
- https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/Consumer.html
Rubyの配列に関する便利な文法

# push：配列を合体する
例１：

```ruby
array = [1, 2, 3]
array.push(10, 100)
p array
[1, 2, 3, 10, 100]
```

例２：

```ruby
arr_1 = [0, 1, 2]
=> [0, 1, 2]

arr_2 = [8, 9, 10]
=> [8, 9, 10]

arr_1.push(arr_2))
=> [0, 1, 2, [8, 9, 10]]
```

pushは「<<」と同義

```ruby
a = [1, 2]
=> [1, 2]

b = [3, 4]
=> [3, 4]

a << b
=> [1, 2, [3, 4]]
```
どちらも重複した配列になる。

# concat：配列を合体する
```ruby
arr_1 = [0, 1, 2]
=> [0, 1, 2]

arr_2 = [8, 9, 10]
=> [8, 9, 10]

 arr_1.concat(arr_2)
=> [1, 2, 3, 8, 9, 10]
```

+演算子と同義。


```ruby
a = [1, 2]
=> [1, 2]

b = [3, 4]
=> [3, 4]

a + b
=> [1, 2, 3, 4]
```

重複しない。

# flatten! ：重複配列をフラットにする
(flattenでも可)
「!」は破壊的メソッドなので使用しないほうがいいかも。

```ruby
arr_1 = [0, 1, 2]
=> [0, 1, 2]

arr_2 = [8, 9, 10]
=> [8, 9, 10]

arr_1.push(arr_2))
=> [0, 1, 2, [8, 9, 10]]
# 重複しても、、、

arr_1.flatten!
=> [0, 1, 2, 8, 9, 10]
# 解決！
```


# 配列の要素を数指定で取得
```ruby
arr = [0,1,2,3,4,5,6,7,8,9,10]
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 「.」が2つのとき、10個の要素
arr[0..9]
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 「.」が2つのとき、10個の要素
arr[1..9]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 「.」が3つのとき、9個の要素
arr[0...9]
=> [0, 1, 2, 3, 4, 5, 6, 7, 8]

# [0..9]の中からランダムに2つだけ取る
arr[0..9].sample(2)
=> [4, 2]
```

# sample：要素をランダムに取得する
```ruby
arr = [0,1,2,3,4,5,6,7,8,9,10]
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.sample(4)
=> [0, 8, 1, 4]
```

# shuffle：シャッフルする
```ruby
arr = [0,1,2,3,4,5,6,7,8,9,10]
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.shuffle
=> [4, 8, 9, 2, 5, 1, 3, 7, 10, 0, 6]

arr.shuffle!
=> [5, 0, 4, 7, 6, 2, 1, 9, 10, 3, 8]
```

## uniq：重複した要素を取り除く
```ruby
a = [0, 1, 2, 4, 6, 3]
=> [0, 1, 2, 4, 6, 3]

b = [0, 1, 2, 6, 3, 5]
=> [0, 1, 2, 6, 3, 5]

c = ((a.sample(3)) + (b.sample(3)))
=> [6, 2, 1, 2, 5, 6]

# ユニークにする
c = ((a.sample(3)) + (b.sample(3))).shuffle!.uniq
=> [0, 6, 2, 3]

c = ((a.sample(3).uniq) + (b.sample(3)).uniq).shuffle!
=> [3, 1, 1, 2, 0, 4]

c = ((a.sample(3)) + (b.sample(3))).uniq.shuffle!
=> [4, 2, 3, 1, 6]

c = ((a.sample(3)) + (b.sample(3))).uniq.shuffle!
=> [0, 6, 4, 3, 1, 2]
```

# combination：組み合わせ

```ruby
arr = [1, 2, 3]
=> [1, 2, 3]

arr.combination(2){|x| print x}
[1, 2][1, 3][2, 3]=> [1, 2, 3]
```

3個の要素から2個を選んだ。
3C2の計算 = 3P2/2! = 3通り

# permutation：順列

```ruby
arr = [1, 2, 3]
=> [1, 2, 3]

arr.permutation(2){|x| print x}
[1, 2][1, 3][2, 1][2, 3][3, 1][3, 2]=> [1, 2, 3]
```

3P2 = 6通り
CSV内の日時文字列(CST)をEmbulkでTreasureDataにUNIX timeとして入れてRubyで結果を確認する

まずはEmbulkのプラグインを入れる

```bash
$ embulk gem install embulk-filter-timestamp_format
```

次にEmbulkの設定ファイルを書く
in(type: csv)では当該列は`type:string`とする
そして以下のフィルタを記述する

```yaml
filters:
  - type: timestamp_format
    default_from_timestamp_format: ['%Y-%m-%d %H:%M:%S']
    default_from_timezone        : 'America/Chicago'
    stop_on_invalid_record       : true
    columns:
      - {name: mycolname, type: long}
```

これで実行すると、例えばCSVに`2016-12-22 05:27:36`と書いてある場合、TreasureDataには`1482406056`が入る
これを以下のようにRubyで確認すると、UTCなら6時間、JSTなら15時間ずれていることが確認できる

```bash
$ ruby -e 'puts Time.at(1482406056).utc'
2016-12-22 11:27:36 UTC
$ ruby -e 'puts Time.at(1482406056)'
2016-12-22 20:27:36 +0900
$ ruby -e "require 'time'; puts Time.parse('2016-12-22 20:27:36 +0900').to_i"   # おまけ
1482406056
$ ruby -e "require 'time'; puts Time.parse('2016-12-22 20:27:36 JST').to_i"     # おまけ
1482406056
$ ruby -e "require 'time'; puts Time.parse('2016-12-22 05:27:36 CST').getlocal" # おまけ
2016-12-22 20:27:36 +0900
```

わざわざフィルタを入れなくてもembulk-output-tdプラグインの以下のオプションで行けそうに思うが、値は`1482406056`になるものの、型がstring型になってしまい、断念

```yaml
  default_timestamp_type_convert_to: sec
```

環境

```bash
$ embulk gem list|grep -i embulk
2016-12-26 15:44:33.104 +0900: Embulk v0.8.15
embulk-filter-timestamp_format (0.2.4)
embulk-input-td (0.1.0)
embulk-output-td (0.3.12)
```

stringになっちゃう件は、先に`td table:create`・`td schema:set`をやっておけばいいのかも
プラグイン入れるのとどっちが楽かなぁ
【Unity】コルーチンでtry catchした時に起きるエラー

先日Unityのコルーチンのコードを書いていて
謎のコンパイルエラーに遭遇したので.....φ(´･ω･｀)ｶｷｶｷ♪ 

原因を調べたら.Net側の問題なのかな？
とにかくIEnumrator型のメソッド内でtry catchを使うときに出るエラーのようです

```csharp
using System;
using System.Collections;

public class IEnumratorTryCatchError
{
    IEnumerator test()
    {
        try
        {
        }
        catch (Exception e)
        {
        }
        yield break;
    }
}
```
このようにcatchしたExceptionを未使用の時にのみ起こるエラーのようです。
しかも全く関係ないクラスがErrorログに出てくるので、この記述が原因だと特定するのに苦労します・・・

![image](https://qiita-image-store.s3.amazonaws.com/0/67497/f1daf401-95c3-cd38-0c72-3ba733e0f37c.png)


ちなみにvoid型のメソッドではエラーになりませんでした

```csharp
using System;
using System.Collections;

public class IEnumratorTryCatchError
{
    void Test()
    {
        try
        {
        }
        catch (Exception e)
        {
        }
    }
}
```
rakeで謎のエラーが出る(StandardError: An error has occurred, this and all later migrations canceled:)

環境をどんどん変えていっていたらいろんなエラーに悩まされたのですが、これだけはググってもなかなか出てこなかったので共有します、というより備忘録として…。


とあるテキストをやっていて(Railsの超有名なやつ)、突然こんなエラーが出てきました。

```
$ rake db:migrate
== 20161226043813 CreateBooks: migrating ======================================
-- create_table(:books)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "books" already exists: CREATE TABLE "books" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "isbn" varchar, "title" varchar, "price" integer, "publish" varchar, "published" date, "cd" boolean, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
/Users/fndm40/rwork/railbook/db/migrate/20161226043813_create_books.rb:3:in `change'
ActiveRecord::StatementInvalid: SQLite3::SQLException: table "books" already exists: CREATE TABLE "books" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "isbn" varchar, "title" varchar, "price" integer, "publish" varchar, "published" date, "cd" boolean, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
/Users/fndm40/rwork/railbook/db/migrate/20161226043813_create_books.rb:3:in `change'
SQLite3::SQLException: table "books" already exists
/Users/fndm40/rwork/railbook/db/migrate/20161226043813_create_books.rb:3:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

```
何度rakeしてもダメですし、rakeコマンドに問題があるのかと思い

```
$ bundle update rake
```
をやってみてもダメでした。
エラー文をよく見てみると「既にbooksテーブルは存在しています」と書いているので、一旦DBをリセットすることにしました。
一応コマンドです。

```
$ rake db:migrate:reset
```
このあとにもう一度

```
$ rake db:migrate
```
を実行したら無事に解決しました。
めでたしめでたし。
LTをしたらReactJSを勉強することになってよかった

[dots girls Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dots_girls)、トリも頂きました吉澤です！

# LTしたらReactJSの講座を作ることに

きっかけは今年の10/31に開催された [「ECMAScript6勉強会」HappyHalloween JS 祭！！ 《仮装マストじゃないよ》](https://eventdots.jp/event/571557) でReactJSをネタに[LT](http://www.slideshare.net/wakanayoshizawa/reactjs-54589595)したことです。

当時の資料を見返してみると、よくこの内容でLTしたななんて恥ずかしくなります。

ところが運命は面白い方向に転がり、このLT資料を見た方という方から、ReactJSを学習する動画の講座を作ってUdemyという動画サービスで公開してみたらどうかという話をいただきました。もちろん、私はいままで動画を作ったことはありませんし、そもそも動画を作る機会が滅多にないので「面白そう！」と思いました。

# 反省

いきなり反省です＼(^o^)／

今思い出すと色々軽く考えていました。ReactJSは仕事でも使っているし何とかなるだろう思っていました。

私は話すのも文章を書くのもとても苦手なのですが、動画はNGがでても編集できるし、教科書のような文章を作るより楽に違いないと勝手に考えていました。

# 動画は大変

## 動画は原稿が必要
動画を撮るには最初に原稿をちゃんとした日本語で書かないといけません。これは動画を撮ろうとしてすぐ気がつきました。結局苦手な教科書を沢山書いて用意しないといけませんでした。

## ちゃんと話すのが大変
次に、動画で自分を撮ってみると声と話し方がとても変です。これじゃない感、違和感があります。さらには、撮影中に噛んでうまく話せなかったりするとすぐリテイクになります。自分はちゃんと話しているつもりでも動画にして見てみると変だからです。

## 環境音にも注意
動画はMacのQuickTimePlayerで撮影できました。Macのデフォルトマイクだと、キータイプ音が思ったよりも大きく入ってしまい、有線マイクを使うことにしました。

これは例えば、撮影中に外で大きな音がしていたらマイクが拾ってしまう場合があるということです。

## 動画編集なんて夢
動画なんて編集すればいいじゃん！と思っていたのですが、今までそもそも大した動画の編集なんてしたことありませんでした。動画編集のスキルは無いのでなるべく一発撮りでOKにした方がいいです。試しに編集してみたのですが、編集用に動画を何本も分割したりすると、動画ごとにメモを残さないと管理できなくなってきます。

## ドットインストールすごい
実際にやってみるととても大変で、ドットインストールのような動画サービスはすごいんだなってわかります。

# ReactJSについて

## 自分で書くのと人に教えるのは別
ドットインストールを見ると、動画の講座は対象のフレームワークライブラリについて網羅的である必要があります。
動画を作ることにしたため、普段使っていなかったり知らないことを調べたりするようになりました。
もちろん動画講座で全てを紹介することは無いですが、いままで知らなくて勉強になることがあって良いです。

## コンポーネントを小さくしたほうがいい
普段書いていたReactJSのプロジェクトではメンテしにくさが問題になっていました。今更本当に基本かもしれないですが、動画作成のために勉強したおかげで、やっぱりコンポーネントをもっと小さく分割したほうがいいんだなと再認識してためになりました。

## 書き方が色々ある
ReactJSについて調べるようになり、改めて気づいた点として、書き方のパターンが多いと思いました。最初オライリーのReactJS本を参考にしようと考えていました。でも世の中のQiitaやブログ記事ではやや書き方の異なる記事もあります。現在はReactJSのドキュメントになるべく従おうかなと思っています。

## 環境の説明が多い
ReactJSはコンパイル環境などツールについての説明記事が多いです。けれどひとまず始めるには、Create React Appを使えばよくて環境に関する記事はあまり読まなくていいのかなと思いました。

## 1から書く
私は確かに仕事でReactJSを使っています。けれど、元々書いていた人のReactJSプロジェクトを引き継いだだけで、まるごと1からプロジェクトを作るとなると色々考えることが全然違うと思いました。


## jQueryをやってわかったこと
最近の私はReactJSよりもjQueryを使う方が多いです。
私はJavaScriptの業務でReactJSを触った方が先で、jQueryをメインで触ったのは実は最近です。
jQueryをたくさん使ってみた結果、動かす分にはどちらでも構わないのですが、やはりjQueryのほうがコードが多くなりますし、ReactJSの良いところが前よりもわかるようになった気がします。

# まとめ

まだまだ現時点では私はReactJSを人にちゃんと説明できるほどわかっていないんだなと思いました。

アドベントカレンダーこの枠を予約したときには、dots girls のアドベントカレンダーを書くころにはReactとReduxについて知見が溜まっていて、なにか書きたいことが溜まっているに違いないなんてことを考えていました。

ポエムみたいになってしまってすみません。

あまりまとまらなかったのですが、書きたかったこととして3つあります＼(^o^)／

* 勢いでLTに出てみると何か変わるかも
* 動画作成は大変だがためになる
* ReactJSは便利

# dots.女子部について

インフラ、サーバー、フロント開発から運用ノウハウ、女性エンジニアのキャリアについてなどいろいろな観点から勉強したり、情報共有している女性エンジニアのための部活です。
興味がある方は是非SNSアカウントのフォローしてみて下さい！

[Twitter](https://twitter.com/dotsgirls)
[Facebook](https://www.facebook.com/dots%E5%A5%B3%E5%AD%90%E9%83%A8-457992851057604/)

2017年もよろしくお願いします！
AndroidStudioのエミュが起動しない(VirtualBox環境下だと)・・・だと！？

かなり限定的な環境下で起きる現象の話ですが・・・
VirtualBoxでゴリゴリサーバーAPIとか作ってる時に
さー！そろそろアプリ繋ぎこむか！ってなっていざAndroidStudioを起動したら・・・

**エミュレータが起動してくれなかった...orz**

時の話

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/genymotion001.png)


## 'Error while waiting for device'と言う謎のエラー

なんかstackoverflowで同じような事を言っている人がいる・・・

[Emulator Not Running on Android Studio](http://stackoverflow.com/questions/37281365/emulator-not-running-on-android-studio)

どうやらVirtualBoxでインスタンスが起動しているとエミュが起動しないっぽい・・・

## 僕らにはまだ、'Genymotion'が...ある！！ → あっさり解決ヽ(=´▽`=)ﾉ

さっくりAndroidStudioのエミュを諦めて、ちょっと遅くなるかもだけど['Genymotion'](https://www.genymotion.com/)のエミュを使ってみる事にした。
で、あっさり解決しました！ヽ(=´▽`=)ﾉ

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/genymotion002.png)

こんな感じでAndroidStudio起動中にちゃんとエミュが立ち上がります。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/genymotion003.png)

ちゃんとデバッグも出来ますね。
(エラーが起きちゃってるのはご愛嬌・・・ほら、こういうのを確認しようと思ってやってたから・・・)


## 肝心の構築手順

brew-caskでさっくり'Genymotion'を入れちゃいましょう。

```
[xcodeはインストールされている前提]
xcode-select --install
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew tap caskroom/cask
brew install caskroom/cask/brew-cask
brew cask install virtualbox
brew cask install genymotion
```

で、ここが肝ですが、'Genymotion'と'AndroidStudio'がみてるADBの場所をちゃんと合わせましょう。

僕は'AndroidStudio'の方のSDKの向け先を、'Genymotion'の方に向けて、ADBのパスを合わせました。

```
/Applications/Genymotion.app/Contents/MacOS/tools/
```

'AndroidStudio'の'preferences'から変えられます。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/genymotion004.png)

この方法だと、SDKのダウンロードが再度行われるので設定完了まではちょっと時間が掛かります。

## エミュからVirtualBoxのサーバを見れるようにしないとそもそも意味がない

ので、忘れずに設定しましょう。
簡単です。
起動中のエミュのhostsファイルを書き換えて、名前とVirtualBoxのIPを書き込んじゃいましょう。

僕のMacのhostsには以下の用にVirtualBoxサーバの名前とIPの紐付け設定がされてます。

```
cat /etc/hosts

192.168.33.16   fwmhoge.localhost
192.168.33.16   webhoge.localhost
192.168.33.16   apihoge.localhost
...
```

コレをエミュに上書き

```
/Applications/Genymotion.app/Contents/MacOS/tools/adb root
/Applications/Genymotion.app/Contents/MacOS/tools/adb remount
/Applications/Genymotion.app/Contents/MacOS/tools/adb push /etc/hosts /system/etc
```

以上でエミュから'webhoge.localhost'でIP'192.168.33.16'が振られているVirtualBoxサーバに到達出来るようになります。

**コレで快適にAndroidアプリ開発が出来るぜー！ヽ(=´▽`=)ﾉ**

　

何方かの参考になれば幸いですm(__)m

###### Created by [株式会社デジタルクエスト](https://www.digiq.co.jp) 大野 修平 ( [@saimushi](https://twitter.com/saimushi/) )
良いコードを書く技術を読んでみた

[良いコードを書く技術　－読みやすく保守しやすいプログラミング作法](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E6%8A%80%E8%A1%93-%EF%BC%8D%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%8F%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-WEB-DB-PRESS-plus/dp/4774145963) という書籍呼んだので読了後のメモを残します。

浅く広く良いコードとは何かをざっくり理解したいプログラミング初心者の方にはおすすめの本です。
サンプルコードもあり、この本で良いコードの概要はつかめるかと思います。

---

## 良いコードとは

■本書で定義されている良いコードとは

- 保守性が高い
    - コードは作り手が想像しているよりも長く使われる。他人が後からみてもわかりやすいコードであるべき 

- すばやく効率的に動作する
    - 良いコードは適切なパフォーマンスで動作する 

- 正確に動作する
    - 確実に動作し、信頼性が高い、バグが起きない 

- 無駄な部分がない
    - 無駄が無いコードは理解しやすく、修正する手間がかからない

## 名前付け

適切な名前付け（メソッド名、クラス名、変数名など）を行うことで、コードの保守性があがります。
名前付けが適切であればあるほど、理解しやすいコードとなり、無駄なコメントを残す必要がなくなります。

■説明的で意図・意味を表した名前付けをする

```
///消費税をカンマ区切りに変換
String s = fmt(value);
///整形済み消費税出力
out.println(s);
```
変数名s、valueとメソッド名fmtが短すぎてわかりずらい
以下のようにするべき

```
String formattedConsumptionTax = 
  insertGroupingSeparators(consumptionTax);
out.println(formattedConsumptionTax);
```
名前で意味を表しているのでコメントがいらなくなる。

■一貫性を保つ
コード全体を通して、一貫したポリシーで名前付けを行う
begin/end
write/read 
writing/reading
right/left 
open/close 

## スコープ
ある変数や関数が特定の名前で参照される範囲のこと。変数、メソッド、クラスなどが、プログラミング上使かえる範囲のこと。使えるとは、つまり言い換えると依存しているということです。スコープを上手く使うことで、依存する範囲を絞る事ができる。依存が大きければ大きいほど、デバック時に調査する範囲が広くなりるので、保守性に大きな影響を及ぼす。

スコープ＝見える範囲＝使える範囲＝依存する範囲＝保守性に影響を与える範囲

```
public boolean isClosing(Date now) {
  Date open = null；
  Date close = null;
  ...
  for(Timetable table : tables){
    open = getDate(table.openDateString());
    close = getDate(table.closeDateString());
    if(contains(now, open, close)){
    ...
    }
  }
  return true;
}
```
上記だとスコープはメソッドの中のどこからでも参照できてしまう。


```
public boolean isClosing(Date now) {
  ...
  for(Timetable table : tables){
    Date open = getDate(table.openDateString());
    Date close = getDate(table.closeDateString());
    if(contains(now, open, close)){
    ...
    }
  }
  return true;
}
```
これでスコープをfor文の中だけに限定できる。
つまりローカル変数の影響範囲が小さくなる。

## コードの分割・集約
コードの重複箇所を分割・集約して無駄を無くすことで、読みやすくかつ修正箇所の少ないコードにすることが出来る。

以下のコードでは文字列が空かどうかの判定が二回出てくる。

```
public class StoreAction extends BaseAction {
  public void store(Account account) {
    if(account.getFirstName() == null || account.getFirstName().length()== 0) {
      return;
    }
    if(account.getlastName() == null || account.getLastName().length() == 0) {
      return;
    }
  }
}
```

該当箇所を別メソッドにすることで、まとめる事ができる。

```
public class Store extends BaseAction {
  public void store(Account account){
    if(isEmpty(account.getFirstName())){
      return;
    }
    if(isEmpty(account.getLastNAme())) {
      return;
    }
  }
  public boolean isEmpty(String str) { 
    return str == null || str.length() == 0;
  }
}
```
golangで画像のサイズ変換を実施する


# お題目
1. 最近傍法によるサイズ変換
2. 線形補間法によるサイズ変換

裏テーマ
1. mainで動かしてたけど、テストで駆動するように変更
2. for文を一箇所にまとめる

# 最近傍法
要するに、拡大した時に対応するピクセルを比で求めるというだけ。

## ソースコード
imageLoopに渡してる、関数の引数xとyが変換後の画像の位置なのですが、それがどこかをdownの関数内で求めてるだけです。
大したことないですな

```go
// 最近傍方
func (ef *effect) ChangeSize() image.Image {
	up := func(val int, rat float64) int { return int(float64(val) * rat) }
	down := func(val int, rat float64) int { return int(float64(val) / rat) }

	// とりあえず正方形にして、0.5倍にする
	ratio := 0.5
	rect := ef.inputImage.Bounds()
	width := up(rect.Size().X, ratio)
	height := width
	newRect := image.Rect(0, 0, width, height)
	yRatio := float64(height) / float64(rect.Size().Y)

	return ef.imageLoop(newRect, func(x, y int) color.RGBA64 {
		r, g, b, a := ef.inputImage.At(down(x, ratio), down(y, yRatio)).RGBA()
		return color.RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)}
	})
}

```
ちなみに某技術書を見ながらやってるんだけど、テキストのソースコード間違ってますね。

## 画像
![test_chgsize.jpg](https://qiita-image-store.s3.amazonaws.com/0/51009/9e5fa1a9-adfe-66c9-d66c-5a92bd321c69.jpeg "test_chgsize.jpg")

# 線形補間法
ピクセル間の平均取ればもっといいよねって話
数式は面倒だから[wiki](https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E8%A3%9C%E9%96%93)参照
数学でやりましたね、この式。なお、テキストはもう少しプログラム寄りに書いてありそうです。

## ソースコード

```
func (ef *effect) senning(x, y int, xRatio, yRatio float64) color.RGBA64 {
	// 比較のための４点とその位置の比を求める関数
	createParam := func(inSize, outSize int, ratio float64) (int, int, float64) {
		v1 := down(outSize, ratio)
		v2 := v1 + 1
		if v2 > inSize-1 {
			v2 = inSize - 1
		}
		v3 := float64(outSize)/ratio - float64(v1)
		return v1, v2, v3
	}
	//	計測点（パラメータ）を作る
	point := ef.inputImage.Bounds().Size()
	j1, j2, q := createParam(point.Y, y, yRatio)
	i1, i2, p := createParam(point.X, x, xRatio)
	positions := [4]struct {
		X int
		Y int
	}{
		{i1, j1},
		{i2, j1},
		{i1, j2},
		{i2, j2},
	}
	// 4点の値を取得する
	var valsR, valsG, valsB, valsA [len(positions)]float64
	for i, v := range positions {
		r, g, b, a := ef.inputImage.At(v.X, v.Y).RGBA()
		valsR[i] = float64(r)
		valsG[i] = float64(g)
		valsB[i] = float64(b)
		valsA[i] = float64(a)
	}
	//各要素の値を求める関数
	con := func(val [4]float64) uint16 {
		return uint16((1.0-q)*((1.0-p)*val[0]+p*val[1]) + q*((1-p)*val[2]+p*val[3]))
	}
	return color.RGBA64{con(valsR), con(valsG), con(valsB), con(valsA)}
}
```

４点の値を取得するあたりはもう少しやりようがある気がする。
思いつきませんでした。
とりあえず、注目すべきは無名関数conの中ですね、。

```go
uint16((1.0-q)*((1.0-p)*val[0]+p*val[1]) + q*((1-p)*val[2]+p*val[3]))
```
ちょっと理解しやすくしましょう

$$
 \biggl( (1-q) \times \bigl((1-p) \times V_{ij} + p \times V_{i+1j} \bigr) \biggr) + \biggl(q \times \bigl((1-p) \times V_{ij+1} + p \times V_{i+1j+1}) \bigr) \biggr)
$$
1ってのが、変化量の比であると気付けば難しい数式ではないですね。
##　出力結果
![test_sizesen.jpg](https://qiita-image-store.s3.amazonaws.com/0/51009/4da7cb79-c723-ddf3-c45e-21dad85cb0fe.jpeg "test_sizesen.jpg")
比率を手動で上げてしまえばその違いがよりわかりやすくなります。
情報の復元の方法の一つなんじゃないかな？と思いました。
AzureLogicAppsでAPI wrapper

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯

EmotionAPIやその他高機能なAPIはすでにAzureで提供されているが、それらのAPIを組み合わせたり、
非同期処理を噛ませたり、というのをシームレスに実現したいなと思い、色々探していたところLogicAppsを見つけた。[Apache Camel好き](http://qiita.com/tstakano-yj/items/7e2d0fd28ddda3dbbe54)なので、同じようなアプローチのこういったソリューションはとてもしっくり来る。Apache Camel + route デザイナ + α と言った感じでしょうか。取り合えずEmotion API wrapperを作ってみる
EmotionAPIに関しては[こちら](http://qiita.com/tstakano-yj/items/ed208c26c867b8774416)でも試してみましたが、面白いですね。

# ハンズオン

## 作成
<img width="333" alt="スクリーンショット 2016-12-26 10.38.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/7280a7a2-5fea-24ca-3373-b226b5e56fce.png">
普通に上記画面から作成

## 今回の最終形態
<img width="739" alt="スクリーンショット 2016-12-26 10.45.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/4eb4112e-6f96-66b0-7688-e8fa3c6efc30.png">
API wrapperなので、上記の通り。
下記のような、いたってシンプルな構成。
コンポーネントの追加は「ステップの追加」からポンポン追加できます。

| name | 概要 |
|:-:|:-:|
| 要求 | Http(s)のlisten |
| HTTP | Http(s)のinvoke |
| 応答 | Http(s)のresponse |

各項目についてみていきます。

### 要求

<img width="613" alt="スクリーンショット 2016-12-26 10.52.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/fcc961f4-d85c-8b79-4dfe-dfd1a7cd1e01.png">

```json:urlをjsonの必須項目として設定。
{
  "properties": {
    "url": {
      "type": "string"
    }
  },
  "required": [
    "url"
  ],
  "type": "object"
}
```

### HTTP
<img width="514" alt="スクリーンショット 2016-12-26 10.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/59bf53f3-2cbf-c554-645a-2667c443734a.png">

| name | 概要 |
|:-:|:-:|
| 方法  | EmotionAPIへそのままPOSTする形にします。  |
| URI  | EmotionAPIのURIです。  |
| ヘッダー | EmotionAPIのお決まりのヘッダーを追加します。（鍵等）  |
| 本文  | 要求本文をそのままbodyとしてinvokeします。  |

```json:urlをjsonの必須項目として設定。

{
  "Ocp-Apim-Subscription-Key": "keyです",
  "content-type": "application/json"
}

```

### 応答
<img width="565" alt="スクリーンショット 2016-12-26 10.53.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/05999b66-7e94-64a6-c22c-c78c00bf1c50.png">

状態コード、ヘッダー、本文すべて、http invokeの結果を引き継ぐ形に設定する。

## 実行

### 走らせてみる
<img width="318" alt="スクリーンショット 2016-12-26 13.01.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/abedcc2e-8c1d-0051-f92e-526bd85477c5.png">
Runから実行

### test
Postmanで実行してみる
<img width="1147" alt="スクリーンショット 2016-12-26 13.39.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/090b170a-0245-08f3-0be9-e780d6008f47.png">

成功ー。
【Slick】initialSlideを設定するとページングがおかしくなる場合の解決方法

# TL;DR
webでページングを実装するときに超便利なプラグイン「Slick」では、
・「1ページあたりの項目表示数(slidesToShow)」
・「1回のスライドで何項目スライドさせるか(slidesToScroll)」
・「初期ページを何ページ目にするか(initialSlide)」
などといった初期設定をすることが可能です。

ここで、たとえば
・1ページあたり5項目表示し
・1スライドで5項目分スライドさせたい
・そして表示ページは現在のページに従って動的に変更したい
という仕様にする場合に、素直に「slidesToShow: 5, slidesToScroll: 5, initialSlide: 現在のページ」みたいなことすると、Slickのページングがおかしな挙動になる場合があるため、ここではその解決法を書いていきます。


# どうなるのか
それぞれの初期値は下記の通り
・slidesToShow:1
・slidesToScroll:1
・initialSlide:0
のため、初期値のまま例えば数ページ分の項目があるSlickを実装すると、下記のように
「1」→スライド「2」→スライド「3」→スライド....　となります(「」内が1度に表示される項目数です。わかりにくくてすみません)
そして「initialSlide:0」のため、たとえば3ページ目をクリックすると、Slickの表示は「1」からになっています。

TL;DRの仕様は下記のようなイメージ
「1 2 3 4 5」→スライド→「6 7 8 9 10」→スライド「11 12 13 14 15」...
そして「initialSlide」が現在のページ数を表す場合、「現在のページがSlickのスライドの初期値になっていい感じになる」と思いたいですが、そうはうまくいかないみたいです。

上記の設定をコードに落とし込むと、こんな感じ

```js:sample
var initialSlideNum = ****; //例えばURLからページ番号を取ってくる

$('#sample').slick({
        infinite: false, //無限ループの無効
        slidesToShow: 5,
        slidesToScroll: 5,
        initialSlide: initialSlideNum
});
```

で、これをすると何がいけないのかというと、例えば7項目あるid=sampleの要素を上記Slickにかけた場合、initialSlideNumが「0,5」のときは正常に動作するのですが、
**「1,2,3,4,6,7」のときはスライドが端までいかず、途中で引っ張られるように戻ってしまいます**。(端の1,2が押せなくなる)。

# 原因
正確なことはわかりませんが、「slidesToScroll」を1に戻すと問題なく動作するため、「initialSlide」がたとえば「2」に設定されたとき、そこを起点に「slideToScroll:5」が適用され、ページが「1,2」「3,4,5,6,7」のように分割され、結果「1,2」側が5件に満たないので表示できない、みたいな動作になっているように感じます。

つまり、「initialSlideNum」に設定する値は、ただページ数をそのまま表示するのではなくて、
**「slidesToScroll」で割り切れる値にする必要がある**ということになります。

# 解決法
今回自分のほうでは下記のように修正しました。

```js:sample2
var slidesToScrollNum = 5;
var nowPage = ****; //例えばURLからページ番号を取ってくる

var initialSlideNum = parseInt((nowPage/slidesToScrollNum ),10); //nowPageをslidesToScrollNumで割って小数点以下を消す
 if(nowPage%slidesToScrollNum == 0) initialSlideNum = initialSlideNum-1; //割り切れるときだけ前ページ
initialSlideNum = initialSlideNum*slidesToScrollNum; //改めてslidesToScrollNumでかける

$('#sample').slick({
        infinite: false, //無限ループの無効
        slidesToShow: 5,
        slidesToScroll: slidesToScrollNum ,
        initialSlide: initialSlideNum
});
```

こうすることで、項目数16のSlickの場合
・現在のページ数が1,2,3,4,5のとき -> initialSlideNumは0になる -> 初期ページは1になる
・現在のページ数が6,7,8,9,10のとき -> initialSlideNumは5になる -> 初期ページは6になる
・現在のページ数が11,12,13,14,15のとき -> initialSlideNumは10になる -> 初期ページは11になる
・現在のページ数が16のとき -> initialSlideNumは15になる -> 初期ページは16になる

となりました。

何かご指摘やもっと良い方法等がありましたらコメントお願いします！
Python > 拡張スライスとは

[コメントにて](http://qiita.com/7of9/items/316daf7839d58f16afec#comment-e5fb9779032127f813bd)教えていただいたPEP8での書き方。
https://pep8-ja.readthedocs.io/ja/latest/#id16

> 拡張スライスでは、両側に同じ数のスペースを置かなければなりません。

拡張スライスというのを分かっていなかった。

https://docs.python.org/2.3/whatsnew/section-slices.html

> However, Python's built-in list, tuple, and string sequence types have never supported this feature, raising a TypeError if you tried it.

拡張スライスの「拡張」は、「list, tuple, string sequenceに対応した」という意味での「拡張」なのだろうか?

使い方は上記のページにいくつか例がある。

```
>>> L = range(10)
>>> L[::2]
[0, 2, 4, 6, 8]
```

```
>>> L[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
```

https://pep8-ja.readthedocs.io/ja/latest/#id16
に記載の以下については分かった(と思う)。
> 拡張スライスでは、両側に同じ数のスペースを置かなければなりません。
Windowsバッチファイルにおける x86/x64判定

#環境変数PROCESSOR_ARCHITECTUREを利用する場合

基本ですが、環境変数**PROCESSOR_ARCHITECTURE**を利用利用してアーキテクチャ判定が可能です。

```bat
rem 条件分岐の例 
if "%PROCESSOR_ARCHITECTURE%" EQU "x86"   goto :ARCH_X86
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" goto :ARCH_X64
echo 未対応環境です & goto:EOF

:ARCH_X86
echo x86環境です
goto :EOF

:ARCH_X64
echo x64環境です
goto :EOF
```
```bat
rem 実行ファイルを別の環境変数に設定する例
if "%PROCESSOR_ARCHITECTURE%" EQU "x86"   SET SETUPFILE=SETUP.EXE
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" SET SETUPFILE=SETUP64.EXE
if NOT EXIST "%SETUPFILE%" echo 未対応環境です & goto:EOF

"%SETUPFILE%"
```
ちなみに、**PROCESSOR_ARCHITECTURE**が返す値はx86,x64の他にIA64,ARM,ARM64等があるようです（昔はMIPSやALPHAなどという物も存在したらしいですが…）
今後もIoTCoreやx86エミュレーション可能なARM系Windowsも出てくるようなので、x86以外はx64と決めつけ、

```bat
rem だめな例１
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" (
  goto :ARCH_X86
) else (
  goto :ARCH_X64
)
```
```bat
rem だめな例２
if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" goto :ARCH_X64
```
などと記述するのは将来に禍根を残したくなければ止めたほうが懸命かもしれません。

#環境変数**ProgramFiles(x86)**を利用する例
 環境に依存せずに32bit用Program Filesフォルダを取得する方法です。
バッチファイルを利用したアプリのサイレントインストール場合、事前にインストール場所を決めたり、事後にパッチ等をあてる場合等に便利かもしれません。

```bat
set PF32=%ProgramFiles(x86)%
if not exist "%PF32%" set PF32=%ProgramFiles%
echo 32bitのProgram Filesフォルダは %PF32%
```
x86環境で実行すると、環境変数***ProgramFiles(x86)**が定義されていないためず"%ProgramFiles(x86)%"という文字列がそのまま入ってきてしまいます。
普通はそんなパスは存在しないので、空の場合は改めて%ProgramFiles%を取得しています。