OmniAICreator/Qiita-1.07M huggingface dataset:
Express-Generatorを使ってみる

# Express-Generatorって何?

Webアプリケーションのひな形を作ってくれるモジュールです。すごい。

# Express-Generatorを使ってみる

http://expressjs.com/starter/generator.html を参考に。

```
npm install express-generator -g
```

と、実行してみる。こうすると、expressコマンドが使えるようになる。

自身の環境では、C:/Users/mude/AppData/Roaming/npm/node_modules/express-generator/bin 以下にexpressというファイルがあるので、この辺りはnpmが世話をしてくれるのだろう。

あとは先程のページに従って

```
express myapp2
cd myapp2
npm install
```

でOK。myapp2にしたのは、なんとなく気分的に…。

Windowsの場合は

```
set DEBUG=myapp2 & npm start
```

で実行。

http://localhost:3000/ にアクセスすると、ページが出てくる。また、コマンドラインに、ログが出力される。

./bin/wwwが、プログラム本体。
./routesが、getした時の内容。render関数に注目。
./viewsが、ビューテンプレートエンジン。jadeを使っている。

ビューテンプレートエンジンは色々他にも、ejsとか指定可能。CSSも、less、stylus、compass、sassなどが選べると聞いているけど、よく分かりません。ごめんなさい。

この辺のコンパイル(?)はnode.jsがやってくれる、はず。便利。

# 参考URL

* http://qiita.com/janus_wel/items/207672dc29e22fa2c343
* http://qiita.com/kkam0907/items/1e35a72c549e1e3dfabf
* http://yutapon.hatenablog.com/entry/2014/04/29/124657
* http://mower.hateblo.jp/entry/2015/06/22/133039
Node.jsで書く時に気をつけたいこと


Node.jsはサーバサイドJavaScript実行環境です。
このNode.jsの最大な特徴が **ノンブロッキングI/O** です。

いままでサーバサイドで動く物となるとshellやperl,rubyなどがありましたがノンブロッキングI/Oではありません。

# ノンブロッキングI/Oについて
すごーく簡単な例えを言うと *ワンオペを効率良くこなす* 感じ。
従来のプログラミングでは料理を火にかけてる間完成するまでその場から離れません。
火にかけて、出来上がる間に他の下準備をできる。それがノンブロッキングI/Oです！

あ、具体例がないのでわからない？なるほど。

ファイルを開いて読む/書く、DBに問い合わせるなどの処理が従来であれば結果を返すまで処理を待つのがブロッキングI/Oです。
ノンブロッキングI/Oでは結果を待たずして次の処理へ行きます。

このノンブロッキングI/Oの特徴から処理の順番を制御しようとするとコールバック地獄に陥ったりします。
いま現在、順番制御しようとするとAsyncモジュールを使うのが一般的ですかね。


# if...elseをしっかり書こう
やっとこ本題

```javascript:db.js
db.find(sql, function(err, docs){
  if(err) return errToNext(err);
  docs.forEach(...);
})
```

例としてこんな書き方をすることがある。
errがあれば`errToNext`関数の返り値をリターンする。
errがなければ次の`docs.forEach`を実行する形になる。

だが、ちょっと待ってほしい。
もしも`errToNext`関数内部にブロッキングI/Oを発生させる処理があったら？

`return`が返らないで次の処理へ行ってしまい本物のExceptionが発生するので

```javascript:db.js
db.find(sql, function(err, docs){
  if(err){
    return errToNext(err);
  }else{
    docs.forEach(...);
  }
})
```

ノンブロッキングI/Oでは面倒臭がらずキチンと書きましょう。

# おわりに

今回の件は実際にハマったことを書いてみました。
どんな関数でも呼ぶと順番が保証できない可能性が高いので条件分岐はきっちり書こうという教訓でした。
Node.js+Expressで超簡単なWebアプリケーションを作成する

Node.jsを初めてインストールしてから、localhostでHTTPリクエストを待ち受けるまで。

# Express.jsって何

Express.jsはNode.jsのフレームワーク。なんか、簡単に色々書けるらしい。

# Node.jsをインストールする

https://nodejs.org/ からサクっとダウンロードして、インストールする。

# Node.jsのプロジェクトを使ってみる

http://expressjs.com/starter/installing.html を参考に…。

```
mkdir myapp
cd myapp
npm init
```

`npm init`をするといろいろ聞かれるけど、とりあえずは全部enterを押しちゃってOK。
entry point: と聞かれるところはapp.js にしておいたほうがいいかも。

こうして、myappディレクトリの下に、package.jsonが作られる。

package.jsonは、たとえば、githubからプロジェクトをgit cloneした後に

```
npm install
```

って打つと、package.jsonに書いてあるモジュールが自動的に入るという仕組み

# Express.jsをインストール

http://expressjs.com/starter/installing.html を参考に…。

次のコマンドを実行する。

```
npm install express --save
```

これで、Express.jsがカレントワーキングディレクトリにインストールされた…はず。

# Expressを使ってみる

http://expressjs.com/starter/hello-world.html を参考に…

最初に作成したディレクトリ(myapp)の下に app.js を作成する。コードは上記のURLに示したものを使う。

そして、`node app.js` というコマンドを実行すると動き出す。

```
Example app listening at http://:::3000
```

とコマンドプロンプトに出力されるので、ブラウザからlocalhost:3000にアクセスすると、Hello, world! と表示される。

# 参考URL

* http://gihyo.jp/dev/serial/01/nodejs/0003
* http://expressjs.com/
Typescriptをplaygroundで遊びながら理解した記事

TODO
これ。6年前の記事。Googleでトップに出てくるようになったので更新する。

その後、[TypeScript練習問題](https://gist.github.com/kenmori/8cea4b82dd12ad31f565721c9c456662)
や
[TypeSript中級者になる為に知っておくと良い108個のこと](https://kenjimorita.jp/typesript-check-108/)
を書く

以下古い記事
---
今日遊んだ奴を思い出に投稿しておく
・コンパイルしたTS
・書き出されたJS
・今日であったエラー

[playground](http://www.typescriptlang.org/Playground/#src=%2F%2F%20%E4%BD%95%E6%95%85%E3%81%93%E3%82%93%E3%81%AA%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E3%81%AF%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E5%BE%8CJavaScript%E3%82%92%E8%A6%8B%E3%82%8C%E3%81%B0%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%8B%E3%82%82%0D%0A%0D%0Afunction%20Sample()%20%7B%0D%0A%09alert(%22Hello!%22)%3B%0D%0A%7D%0D%0A%0D%0Amodule%20Sample%20%7B%0D%0A%09export%20function%20bye()%20%7B%0D%0A%09%09alert(%22Bye!%22)%3B%0D%0A%09%7D%0D%0A%7D%0D%0A%0D%0ASample()%3B%0D%0ASample.bye()%3B%0D%0A%0D%0A%2F%2F%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%20http%3A%2F%2Fgoo.gl%2FlpXZX6%0D%0A)で適当に動き調べてどんな時エラーでて、どうなるのか
理解したり、自分なり調べてたりした。

### Typescript

```js

module kenji{
	export class B{
		constructor(
			public n:number
		){}
		 exest (num): any{
			console.log(num + this.n);
		}
	}
}
module morita{
	import ggg = kenji.B //上記のmoduleのBクラスを取り込む
	var ddd:ggg = new ggg(5); //classを型注釈
	var ccc = ddd.exest(5);//メンバ変数は普通にvar
	var kkk:any; //メンバ関数を定義voidで型注釈だと返り値注意
	export class A {
		public ffa:any;//publicは省略可能
		constructor(
			public fafa,public ccc:number
		){};
	  kkk():any{
			return ccc + this.fafa;
		}
	}
}
var dddd = new morita.A('ee',8);//引数渡すの忘れないで
dddd.kkk

```

### javascript


```js
var kenji;
(function (kenji) {
    var B = (function () {
        function B(n) {
            this.n = n;
        }
        B.prototype.exest = function (num) {
            console.log(num + this.n);
        };
        return B;
    })();
    kenji.B = B;
})(kenji || (kenji = {}));
var morita;
(function (morita) {
    var ggg = kenji.B;
    var ddd = new ggg(5);
    var ccc = ddd.exest(5);
    var kkk;
    var A = (function () {
        function A(fafa, ccc) {
            this.fafa = fafa;
            this.ccc = ccc;
        }
        ;
        A.prototype.kkk = function () {
            return ccc + this.fafa;
        };
        return A;
    })();
    morita.A = A;
})(morita || (morita = {}));
var dddd = new morita.A('ee', 8);
dddd.kkk;

```

### 今日出会ったエラー(playgroundでリアルタイムで出てくる奴)

```
Duplicate indentifier
```
複製重複
同じmodule内にメンバ登録？定義している箇所がある


```
export' modifier cannot appear on a class element
```

「エクスポート」修飾子は、クラスの要素上に表示することはできません

```
Supplied parameter do not match any of signature 

```
こいつはよく出てきた。「渡す引数が合わない」

```
Property ‘[エラー箇所]’ does not exist on type ’typeof’ [エラーClass];
```

importした内部モジュール内のclass(object)がexport記述されていない、
もしくは、
返り値の型注釈が一致しない
↓
書き出されたJS見たら
↓
プロトタイプに定義しているのにインスタンス呼び出しをしないで関数呼び出しになっていた。。

間違え
morita.A.kkk()
↓
正しい
var dddd = new morita.A('ee',8);
dddd.kkk();
PythonのWebフレームワークDjangoを使ってみる(1) - 導入からサーバー起動まで


# 環境

* Mac


# Python3のインストール

せっかくなのでPython3をインストールします。

```shell
$ brew install python3

$ python3 --version
Python 3.4.3
```


# Djangoのインストール

```shell
$ sudo pip install django
...
Successfully installed django-1.8.3

$ pip freeze -l
...
Django==1.8.3
...
```


# Djangoプロジェクトの作成

```shell
$ django-admin.py startproject project
$ ls
project
```

# Djangoプロジェクトのマイグレーションと起動

```shell
$ python manage.py migrate
...

$ python manage.py runserver
...
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

localhost:8000 に接続してみると、`It worked!` と表示されます。

# 次回

http://qiita.com/yoshikyoto/items/274ffd8bb8087902aec8


# 参考

* http://qiita.com/kaki_k/items/7b178ad39394a031b50d
タッチで反応が無いのはEventSystemが無いのが原因

ハマってしまった事とその対処過程・気づきをメモ。

ジョイスティックを追加してバリバリ開発していたのですが、
いつの間にか動作しなくなっていた問題。

ひとまず、ボタンを押して反応するかぐらいの
簡単なものを作成する工程に立ち返ってみることにしました。
<br>

##【簡単なものを作る】##

↓こちらを参考にさせていただきました！
[uGUIでボタンのクリックイベントを取得](http://hwks.hatenadiary.jp/entry/2014/12/10/024926)
ありがとうございます。

1. (何もインポートせず) New Projectを作成する
2. Hierarchy > UI > Button でボタンを作成する
3. 下記C#スクリプトを作成し、先ほど作成したボタンにAdd Componentする

```csharp:TestButtonClick 
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class TestButtonClick : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Debug.Log("Start()");
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	/// ボタンをクリックした時の処理
	public void OnClick() {
		Debug.Log("Button click!");
	}

}
```

これだと、押せているのかどうか端末側からは確認できないので、
**画面にログを出力**するようにします。

↓こちらを参考にさせていただきました。
[【Unity】 ゲーム画面でログを出力する機能](http://d.hatena.ne.jp/nyakuo/20120429/1335717199)
ありがとうございます！

↑より、
NyDebug.csと
NyDebugTest.csを作成し、
先ほど作成したボタンに順にAdd Componentします。

※ ここまでで追加したcsファイルは、すべてAssetsフォルダ直下に投げ込んでいます。
フォルダ振り分けなどは各自の環境でご対応ください。

<br><br>

##【動作確認する】##

ひとまず、簡単なものはできたので
各プレイヤーで確認します。

・Build Settings > Web Player にスイッチ

iOS Unity Remoteでタッチ操作が効く、のを確認できました。
（手持ちのAndroid端末が働いてくれないので、
バンバン働いてくれるiPad miniで確認します）

・Build Settings > Android にスイッチ

iOS Unity Remoteでタッチ操作が効かない、のを確認できました。
Android端末にインストールするとタッチ操作が効く、のを確認できました。
（この後、Web Playerにスイッチしましたが
iOS Unity Remoteでタッチ操作が効かない、ままでした）

※ Player Settings > Default Orientation > Landscape Right
にして書き出しています。

-> Android優先で作る場合は
iOS Unity Remoteはやらないほうがよさそう
（リモートはあまり安定していない気がするが、いちいちインストールする手間は省ける）

<br><br>

##【続いて本題に...】##

※ **期待する動作：ジョイスティックをタップして反応するかどうか**

Menu > Assets > Import Package > CrossPlatformInput
で、CrossPlatformInputをインポートし、
MobileStickSingleControlをHierarchyに追加します。

* インポートするパッケージは、Unity5のStandardAssets（Unity5をインストールすると入ってます）です。<br>
→　https://www.assetstore.unity3d.com/jp/#!/content/32351

こちらも上記過程と同様にAndroid端末にて
期待する動作を確認できました。
（ジャンプボタンは未確認ですが動いてるはず？）

というか、Unityのエディタ上のGame画面でマウスクリックで動きますね（Build Settings > Androidにて）

続いて、
CrossPlatformInputのように
Charactersをインポートし、
ThirdPersonCharacters < Prefabs < ThirdPersonControllerをHierarchyに追加します。

→　期待する動作を確認できました。

ここで、不要そうなファイルを消しつつ
期待する動作となるかを確認していきます。

‥‥　EventSystemを削除すると
期待する動作にならなくなりました。

ハッ！！(；ﾟДﾟ)

（またしょーもないことでハマってしまった。。

<br><br>

##【結論】##

**EventSystemは大事！！**
Hierarchyから **EventSystem** を消すと期待する動作にならなくなっていました。
この **EventSystem** は、
Hierarchy > UI > Button でボタンを作成した際に
同時にHierarchyに追加されます。
StandardAssetsをインポートしてプレハブを読み込んだ時には存在しないので、
上記の期待する動作とならない
ということでした。
（逆に最初はなぜいけていたのかは闇）

↓こちらに記述がありました。
[Unity5版Standard Assetsを使って仮想ジョイスティックを実装](http://qiita.com/cabbage/items/7836efaa04bbb037b086)

<br><br>

##【メモ】##

・apkのインストールにDropboxを使う場合は、
Dropboxの設定からキャッシュ削除をする
（多分ないとは思いますがキャッシュをインストールして「何も変わんないなぁ」とか言う無限ループになっているかと思うと恐いので念のため）

<br><br>

##【余談】##

・未知のことが多い。嘆いていても仕方ないので日々勉強！
・そろそろJelly BeanからLolipopに乗り換えたい。
3年ぐらい前の端末なのでメモリもダメダメで非常に重い。

<br><br>
Vagrant+Movable Type+AWS S3を使って月額10円～でサイトを運用する　～コマンドラインから配信編～

# 目次
* [導入編](http://qiita.com/histori/items/34174e4ff17731980ee5)
* [サンドボックス編](http://qiita.com/histori/items/28f97e5e0d8d96979d8b)
* コマンドラインから配信編

# 概要
本当は`vagrant push`を使いたかったのに、Windowsのvagrantはバグ？で動かないので、AWS CLIをそのまま使う

# 手順

## コマンドラインツールをインストールする
[AWS コマンドラインインターフェイス](https://aws.amazon.com/jp/cli/)からインストールする

## コマンドプロンプトから初期設定を行う
`$ cd MT`
`$ aws configure`

* AWS Access Key ID [None]: アクセスキー ID
* AWS Secret Access Key [None]: シークレットアクセスキー
* Default region name [None]: ap-northeast-1
* Default output format [None]: json

アクセスキー IDとシークレットアクセスキーは、AWSのコンソールにログインして、ログイン>認証情報>アクセスキー>新しいアクセスキーの作成で取得する

## バケットを作成する

そのままコマンドプロンプトで、
`$ aws s3 mb s3://あなたのバケットの名前`

## S3と同期を開始する

`$ aws s3 sync ./www/html s3://あなたのバケットの名前/ --delete`
`--delete`オプションによって、MT側で削除したファイルはS3側でも削除される

mt-staticフォルダを同期から除外したい場合は、
`aws s3 sync ./www/html s3://あなたのバケットの名前/ --delete --exclude "mt-static/*"`
`--exclude`オプションによって、指定したフォルダは無視される

S3をホスティングサーバとして使うには、AWSコンソールで設定が別途必要。S3側の表示で404,403エラーが出る場合は、[こちら](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HostingWebsiteOnS3Setup.html)を参照

以後、更新のたびに上記のコマンドを打つ
（vagrant pushが使えないのがつくづく残念）

# 参考
* [AWS-CLIでAmazon S3を操作・管理する／ServerFrog Blog](http://blog.serverfrog.jp/aws-cli-s3/)
[翻訳] Mix Configの活用

Cory Schmittさんの2015年7月31日のブログ記事[Taking Advantage of Mix Config](http://www.schmitty.me/taking-advantage-of-mix-config/)の翻訳です。
[**mix**](http://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html)は言わずと知れた**Elixir**のプロジェクト管理・依存性解決・ビルド…ツールです。最初にいじったときに「なんだかClojureのLeiningenに似ているなあ」と思ったんですが、その通りLeiningenを参考にして作られたツールで、Leiningenの設定ファイルproject.cljがClojureで書かれていると同じく設定ファイル(mix.exs)自体がElixirで書かれています。
これはmixを使うとこういうこともできるから**YAMLは使わないでね**という話です。

-----

私はPaypal APIで何か購入できるElixirのライブラリを書いて実験してきました。[ソースはここです](https://github.com/cas27/ppt)。このライブラリで作業しているときに異なる環境(test, dev, production)に向けて設定するやり方が必要になりました。私はRubyから来た人なので、ついYAMLに手を出していつもの通りにやろうとしかけました。

その頃、ジェダイ・マスター、[ジョゼ](https://twitter.com/josevalim)はフォースの乱れを感じ、私が落ちようとしていた暗黒面への道についてツイートしたのです。
![josetweet1.png](https://qiita-image-store.s3.amazonaws.com/0/46294/46e258f1-03c1-a009-6490-7e57ad528c28.png)

https://twitter.com/josevalim/status/626131275150065665 [^1]
(訳：ElixirのプロジェクトでYAMLを使うのは止めてください。導入も使い方も不必要に複雑です。Elixirは既にconfigファイルを提供しています。)
[^1]: Tweet日付に注目…マジでジョゼの兄貴ジェダイ・マスターじゃね？と。

よし、Elixirのconfigの中身がどうなってるか見てやろうじゃないの！

mixで新規にプロジェクトを作成すると、直下に`config`というフォルダと`config.exs`が作られます。このファイル自身よくできたドキュメントになっておりさらに詳しくは[Mix.Config](http://elixir-lang.org/docs/stable/mix/Mix.Config.html)を見れば調べられます！

コメント[^2]をひと通り読んで各環境ごとに個別のconfigを設定できるように設定することを決めました。私は即座に`import_config "#{Mix.env}.exs"`のコメントアウトを解除して、`config/test.exs` `config/dev.exs` `config/prod.exs`を作成しました[^3]。
[^2]: 生成されるconfig.exsにコメントがついてます。
[^3]: 環境設定により#{Mix.env}がtest, dev, prodのどれかになります。

Paypai APIを使いはじめるためにいくつか設定が必要でした。

```exs
# config/dev.exs
config :ppt,  #(訳註: configの後にはアプリ名を表すアトムが来ます)
user: "AeosmXJ1nZWwJgErHHhzxpOS0fH7Ki6qu4LVEotJA3al_bsZcnnYsvc1dDAi_71JYIdwkxeFHDu4sdEy"  
secret: "EDL8FGl7O6Xy-oIjdvcl4TRrx9EqKEkU_vKTi2qV3S95vfh1RB9gqiBJ6Uys-NuhSWCOn3FO84JFdpXy",  
currency: "USD"  
```

これらのキーはサンドボックスAPIにしかアクセスできませんのでごあんしんください。

さたいくつかの設定値をconfigの中の取り込めました。ではどうやってこれにアクセスすればいいのでしょうか。次のようにとても簡単にできます:`Application.get_env(:ppt, :user)`。このやり方でどtest、dev、prodその他どんな環境でプログラムが走っていても正しいキーを得られます。

ではこのconfigはこのライブラリが独自の環境のconfigを持つ他のmixアプリケーションにインポートされた時にはどう働くのでしょうか。

私はこのpaypalライブラリを他の練習課題プロジェクトであるphoenixフレームワークで動作する[ショッピングカート](https://github.com/cas27/phoenix_cart)でインポートしました。

ショッピングカート環境のconfigファイルを使うとpaypalライブラリからインポートされたどのキーも上書きできました！すごくイケてるしすごく簡単！私の理解ではこれは以下のように動作したからだと思います。

`プロジェクトの config.exs -> アプリのEnv.exs`

もしこれらのファイル内でキーがセットされなければリスト上の次のものに移動するのです。私のケースでは`Application.get_env`が次のように返されたのでしょう。

1. ショッピングカート環境のconfigファイル
2. pptのconfigファイル

Elixirに組み込まれた設定の取り扱い方法はよく考えられており、あなたがElixirのライブラリやアプリケーションを作成するときの慣習になると思います！
Macで、設定済みのWi-Fiネットワークがあるか判別するシェルスクリプト


## 動機
* sleepwatcher で、スリープ解除時に自動的にネットワーク接続している
* 設定済みのWi-Fiネットワークがある場合はWi-Fi、ない場合はBluetoothテザリングで接続したい

## 使用ツール
### airport
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport

で、接続可能なネットワークを検出する。

```bash
$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
                            SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
                xxxxxx-xxxxxxx-x xx:xx:xx:xx:xx:xx -xx  x       Y  JP WPA2(PSK/AES/AES)
                  x-xxxxx-xxxxxx xx:xx:xx:xx:xx:xx -xx  x       N  -- WEP

```

### networksetup
過去に設定済みのネットワーク一覧を取得する。出力を加工し、grepコマンドのオプションとする。

```bash
$ networksetup -listallhardwareports # Wi-Fiのデバイス名を確認

Hardware Port: Bluetooth DUN
Device: Bluetooth-Modem
Ethernet Address: N/A

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Bluetooth PAN
Device: en2
Ethernet Address: xx:xx:xx:xx:xx:xx

VLAN Configurations
===================
$ networksetup -listpreferredwirelessnetworks en0 # Wi-Fiのデバイス名
Preferred networks on en0:
	xxxxxxxxxxxxxxx-xx
	xxxxxx-xxxxxxx-x
$ networksetup -listpreferredwirelessnetworks en0 | sed -e 1d -e 's/^[:blanc:]*//' | xargs -n1 echo -n " -e"
 -e xxxxxxxxxxxxxxx-xx -e xxxxxx-xxxxxxx-x
```

## コード
現在接続可能なネットワーク一覧を、過去に設定済みのネットワーク名でgrepし、判定を得る。

if文に組み込むと、以下のようになる。

```bash
if ! /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s | sed 1d | grep -q $(networksetup -listpreferredwirelessnetworks en0 | sed -e 1d  | xargs printf " -e %s");then
  osascript ~/bin/osascript/btconnect.scpt # bluetooth接続用スクリプト
else
  echo "prefered Wi-Fi network is avarable." 1>&2
fi
```

## 参考
* [MacでのWi-Fi周りの設定コマンドを調べたのでメモっとく - たまに書きます](http://yukisakamoto.hatenablog.com/entry/2013/09/24/014540)

## 関連
* [Mac起動時に自動的にBluetoothテザリング接続するようにしてみた | 豆腐メンタルは崩れない](https://wbtmiu.herokuapp.com/2014/12/21/90d418ccd73d83fa7ec697b3793030bf/)
UnityのAnimationのAnimationClipの末尾全部にFinishEventをぶっさすスクリプト

使い方
・Animationの刺さっているObjectにこいつをAddComponent
・AnimationのFinishイベントを拾いたいコンポーネントはこいつのOnFinishAnimationにイベントを追加
・特定のClipがアニメーション終了した時にそのClipの名前がイベントに飛んでくる。

```csharp

using UnityEngine;
using System.Collections.Generic;
using System.Collections;
using System;


[RequireComponent (typeof(Animation))]
public class AnimationFinishEventTrigger : MonoBehaviour
{
	public event Action<string> OnFinishAnimation;

	void Awake()
	{
		var animation = this.GetComponent<Animation> ();
		foreach (AnimationState state in animation) {
			var finishEvent = new AnimationEvent();
			finishEvent.functionName = "OnFinishAnimationTrigger";
			finishEvent.stringParameter = state.clip.name;
			finishEvent.time = state.clip.length;
			state.clip.AddEvent(finishEvent);
		}
	}

	void OnFinishAnimationTrigger(string name)
	{
		Debug.Log ("--"+this.gameObject.name+"-OnFinishAnimation: " + name );
		if (OnFinishAnimation != null)
			OnFinishAnimation (name);
	}
}

```
plist ファイルの代わりに YAML を使ってみた

OS X で launchd に登録する時には plist というフォーマット (バイナリもしくは XML) の設定ファイルを使う必要がある。
ところがこれが XML かつ、ちょっと癖があって dict とか key とか string とか、なかなか XML らしくもない。
なれるまでとても読みにくい。読めても書きたくない。

↓ は、サンプルとして、 1 分おきに terminal-notifier をつかって「はろー」と通知する設定。

```
$ terminal-notifier -message 'はろー'
```

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/25886/68af75b5-58ea-eca1-3823-2ff38b7d05e8.png)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>sample-launchd</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/bin/terminal-notifier</string>
		<string>-message</string>
		<string>はろー</string>
	</array>
	<key>StandardOutPath</key>
	<string>/tmp/sample-output.txt</string>
	<key>StartInterval</key>
	<integer>60</integer>
</dict>
</plist>
```

こんなのを記憶して空で書ける気がしない。crontab なら 1 行くらいで書けるし、たぶん手が覚えている。
launchd にフラストレーションが貯まっていく。

そこで対策を考えてみた。

人間にとって読みやすい、 YAML で書くのだ。

# YAML

```yaml
StandardOutPath: /tmp/sample-output.txt
StartInterval: 60
ProgramArguments:
  - /usr/local/bin/terminal-notifier
  - -message
  - はろー
Label: sample-launchd
```

これなら読める。かなり読める。ちょっと覚えれば手で書けるレベル。

そして OS X には plutil というツールが含まれていて、これは JSON を上記の plist 用の XML 形式に変換できる。

```console
$ yaml2json < some_daemon.yaml | plutil -convert xml1 - -o some_daemon.plist
```

としてやれば、普通の plist になる。あとはいつもどおり。

```console
$ launchctl load some_daemon.plist
```

と読ませてやることができる。もちろん止めるときは unload 。

# 他にも思いつく応用例

自分では試してないけど plist をマージしなきゃいけないつらさがある iOS の開発とかで使えるんじゃないだろうか。

# 補足

## yaml2json

~~実験で使った yaml2json なるコマンドは https://www.npmjs.com/package/yaml2json で入れることができる。~~

おそらく自分の誤りで ↑ の通りでは意図していた挙動になっていなかった。 ↓ のエイリアスが意図した挙動だった。

あるいは、 Python 環境があるなら PyYAML をインストールした上で、

```console
$ python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)'
```

のようなコマンドを yaml2json にエイリアスすればいい。

## terminal-notifier

```console
$ brew install terminal-notifier
```

でインストールできる。わりと便利。

## launchd のスケジューリング

この記事では「 YAML でできるよね」という内容だけを扱った。
細かいスケジューリングの方法まで知りたい方は Apple のドキュメント読もう

[Scheduling Timed Jobs](https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html)


## 訂正: cron について

この記事を最初に書いた時に OS X 上の cron について考え違いをしていた。ごめんなさい。
↓ のように書いていましたが、普通に使える。

~~OS X で定期実行させるには launchd 用に設定を読み書きしなくてはならない。~~
~~色々と設定すれば crontab も使えるようになるらしいが、デフォルトでは cron は止まってる。~~

参考: http://qiita.com/kegamin/items/e035304e7295750cdf7d
Mac SafariでTrackpadが効かなくなる


## 現象

Webサイトを閲覧中にTrackpadで前の画面に戻ろうとした時に
画面がフリーズし、Trackpadの操作が行えなくなる現象が発生します。

この現象に陥ると、Trackpadによる上下のスクロールもできなくなります。

## 対処方法

一度Macを寝かせて(Sleep)あげてください。
Macが目覚めた時にはSafariが正常に動作してくれます。

## 補足

他にもいろいろ試してみましたが
案外この現象は厄介で、なかなか直ってくれませんでした。

例えば、Safariを終了`⌘ + q`して再起動してもすぐに同じ現象に陥ってしまうし
Macを再起動してからSafariを使用しても
また数時間後に同じ現象に陥っていました。

ですが、MacをSleepしてから使ってあげると
不思議なことにSafariがもとに戻ります。

困っていたら一度試してください。

ダメだったらごめんなさい。。。
PosetgreSQLのパーティションに対してINSERT ON CONFLICTを実行する方法

PostgreSQL9.5からサポートされるUPSERT(INSERT ON CONFLICT)は、9.4以前のパーティション定義ではうまく動作しません。これは、パーティションの親テーブルに対するINSERT実行時に、子テーブルに通常の(ON CONFLICTではない)INSERTを実行するようにTRIGGERが定義されているためです。このため、親テーブルに対してINSERT ON CONFLICTを実行しても、子テーブルには(ON CONFLICTではない)通常のINSERTが実行されるため、UPSERTの動作にはなりません。

この問題を解決するには、親テーブルのINSERTに対するTRIGGERで、通常のINSERTではなくINSERT ON CONFLICTを実行するようにします。この方法では、親テーブルにINSERT ON CONFLICTが実行されると、子テーブルにもINSERT ON CONFLICTが実行されるため、UPSERTの動作になります。ただし、親テーブルに通常のINSERTを実行した場合も、子テーブルにはINSERT ON CONFLICTが実行されるとの問題があります。

親テーブルに対して通常のINSERTとINSERT ON CONFLICTの両方が実行される可能性がある場合は、親テーブルのINSERTに対するTRIGGERにおいて通常のINSERTとINSERT ON CONFLICTを使い分ける必要があります。つまり、TRIGGERに対して、今現在、どちらのINSERTが要求されているのか伝える必要があります。

どちらのINSERTが要求されているのかをTRIGGERに伝える公式の方法は、PostgreSQL9.5でもまだなさそうです。このため、何らかの伝える方法を編み出す必要があります。例えば、INSERTの要求情報を格納するテーブルを用意し、そのテーブル経由で情報を伝える方法が考えられます。

また、以下は、ダミーのPostgreSQLパラメータを使って伝える方法の例です。この例では、idとname列のテーブルhogeを作成し、idが偶数のデータを子テーブルhoge0、奇数のデータを子テーブルhoge1に格納するようにパーティション化します。親テーブルhogeのINSERTに対するTRIGGERでは、ダミーのパラメータupsert.hogeがonの場合はINSERT ON CONFLICTを、さもなければ通常のINSERTを実行するようにします。これにより、親テーブルにINSERT ON CONFLICTを実行するときは常にダミーパラメータupsert.hogeをonに設定することで、期待どおりにUPSERTを実現できます。一方、通常のINSERTを実行するときは常に設定値をon以外にします。

**これは十分に試験した方法ではありません。期待どおりに動作しないケースがあるかもしれません。十分に試験するなど、使用時にはご注意ください。**

``` plpgsql
-- パーティションの親テーブルを作成
CREATE TABLE hoge (
  id INTEGER PRIMARY KEY,
  name TEXT
);

-- 親テーブルに対するTRIGGERを作成
CREATE OR REPLACE FUNCTION hoge_upsert_trigger () RETURNS trigger AS $$
DECLARE
  tbl TEXT;
BEGIN
  -- id列が偶数であれば子テーブル名はhoge0、奇数であればhoge1
  tbl := 'hoge' || mod(new.id, 2);

  -- ダミーパラメータupsert.hogeの値により通常のINSERTとINSERT ON CONFLICTを使い分け
  IF current_setting('upsert.hoge') = 'on' THEN
    EXECUTE 'INSERT INTO ' || quote_ident(tbl) ||
      ' VALUES (($1).*) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name'
    USING new;
  ELSE
    EXECUTE 'INSERT INTO ' || quote_ident(tbl) || ' VALUES (($1).*)' USING new;
  END IF;
  RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- TRIGGERを親テーブルに登録
CREATE TRIGGER upsert_hoge_trigger
  BEFORE INSERT ON hoge
  FOR EACH ROW EXECUTE PROCEDURE hoge_upsert_trigger();

-- id列が偶数のデータを格納する子テーブルを作成
CREATE TABLE hoge0 (
  LIKE hoge INCLUDING ALL,
  CHECK (mod(id, 2) = 0)
)
INHERITS (hoge);

-- id列が奇数のデータを格納する子テーブルを作成
CREATE TABLE hoge1 (
  LIKE hoge INCLUDING ALL,
  CHECK (mod(id, 2) = 1)
)
INHERITS (hoge);

-- ダミーパラメータをRESETでon以外(NULL)に設定して、通常のINSERTを実行
RESET upsert.hoge;
INSERT INTO hoge VALUES (1, 'one');  -- 初回INSERTなので成功
INSERT INTO hoge VALUES (1, 'first');  -- id列のユニーク制約違反により失敗

-- ダミーパラメータをonに設定してINSERT ON CONFLICTを実行
SET upsert.hoge TO 'on';
INSERT INTO hoge VALUES (1, 'first')  -- 子テーブルにはUPSERTが実行されるため成功
  ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name;
-- ダミーパラメータがonであれば、親テーブルに対するINSERTはON CONFLICTなしで構わない
INSERT INTO hoge VALUES (1, 'one');  -- 子テーブルにはUPSERTが実行されるため成功
```
Atomでパッケージを作ってみた その4


`Project`以下に存在するファイルを取得するための`API`の覚え書き。
実装していてハマった。

```
    #Projectのディレクトリを取得
    dirs = atom.project.getDirectories()
    #対象のディレクトリ以下を取得
    for dir in dirs
      #ディレクトリ以下のディレクトリやファイルを取得
      for entry in dir.getEntriesSync()
        if entry.isFile()
          console.log "F:" + entry.getPath()
        else if entry.isDirectory()
          console.log "D:" + entry.getPath()
```

これによって、再帰的にディレクトリ階層を辿れそうだ。
YouTube APIでSafari7系で自動再生させる。

coffeescriptでyoutube apiを叩いて動画を埋め込みつつ
Safari6〜7系で自動再生されないので調べたものをメモ。

```
$ = window.jQuery = require 'jquery'

module.exports =
class YouTube

  constructor: ->
    super
    tag = document.createElement 'script'
    tag.src = "https://www.youtube.com/iframe_api"
    firstScriptTag = document.getElementsByTagName('script')[0]
    firstScriptTag.parentNode.insertBefore tag, firstScriptTag

    @$youtube = @$ '.js-youtube'
    window.onYouTubeIframeAPIReady = @apiReady

  apiReady: =>
    window.player = new YT.Player @$youtube.get(0),
      width   : '640'
      height  : '390'
      videoId : 'M7lc1UVf-VE'
      events  :
        'onReady'       : @onPlayerReady
        'onStateChange' : @onPlayerStateChange
      playerVars :
        autoplay       : 1
        rel            : 0
        controls       : 0
        showinfo       : 0
        modestbranding : 1
        wmode          : 'transparent'
        html5          : 1

  onPlayerReady: (event) ->
    console.log 'ready'

  onPlayerStateChange: (event) ->
    console.log event.data
```

キモは

```
      playerVars :
        html5          : 1
```

だった。
mongodb的安装和配置

#安装mongodb

```
$ brew install mongodb
```

#设置登录时自动开启mongodb

```
$ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
```
#启动mongodb

```
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
```

无需通过launchctl启动的设置

```
$ mongod --config /usr/local/etc/mongod.conf
```
设置完毕后,

```
$ mongod
```
便可启动mongodb
#进入mongodb

```
$ mongo
```
#mongo基本操作

```
> show dbs
> use dbmeizi
> show collections
> db.meizi.find()
> db.dropDatabase()
```
collection相当于table
python环境的安装和设置


#安装pyenv
>pyenv是python的包管理工具。可以很方便地安装和管理多个版本的Python，自由地切换到需要的版本。类似于ruby的包管理工具rbenv

```
$ brew install pyenv
```

激活shims和开启自动补全命令功能

```
$ echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >> ~/.bash_profile
```
~/.pyenv/shims文件夹中包含了一些shell脚本，透过这些脚本可以解决一些由于不同版本间的差异而造成的运行时问题。

#安装python
确认可以安装的版本

```
$ pyenv install -l
```
安装需要的版本

```
$ pyenv install 2.7.10
$ pyenv install 3.4.3
```
确认安装完毕的版本

```
$ pyenv versions
```
切换到需要的版本

```
$ pyenv global 2.7.10
```
重启bash，确认目前的python版本

```
$ python --version
```
在特定文件夹下，设置特定的python版本

```
$ pyenv local 3.4.3
```

>通过pyenv安装python的时候，pip工具也会被一并安装，可以直接使用

#python库管理工具
>虽然mac默认安装了easy_install，但是没有pip好用，会有一些bug，无法识别已安装的库等问题。基本上easy_install 只是在安装pip的时候使用的。

```
$ sudo easy_install pip
```
路径设置@Mac

>所谓的路径设置是指告诉Mac执行文件的路径是什么。为了执行新的命令通常都需要设置好路径先。

#路径设置的文件
* `~/.bash_profile` 此文件中的路径设置只适用于当前用户
* `/etc/paths` 此文件中的路径设置适用于全部用户

基本上，当前用户的路径设置是比较推荐的。

#路径设置的确认

```
$ echo $PATH
```
各路径间是用【`:`】隔开的。`$PATH` 是目前的路径变量

#路径设置的方法
* 适用于全部用户的路径设置

直接修改路径设置文件,添加新的路径。

```
$ sudo vim /etc/paths
```

* 当前用户的路径设置

编辑文件，

```
$ sudo vim ~/.bash_profile
```
添加以下内容
例：

```
export PATH=$HOME/.rbenv/bin:$PATH
```
在当前的`$PATH`路径上追加`$HOME/.rbenv/bin`路径。`$HOME`是当前用户目录变量。

在当前bash窗口下，可刷新路径设置文件（或者重启bash），

```
$ source ~/.bash_profile
```
确认更新后的路径内容。

```
$ echo $PATH
```
Homebrew的安装和设置

> Homebrew是Mac OS X的包管理工具。其他比较有名的还有MacPorts。貌似最近用Homebrew的人越来越多。

#安装前的准备
* 确认安装了 Xcode Command Line Tools

```
$ gcc -v
```
安装完毕的话，显示结果如下

```
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
```
尚未安装的话，可通过以下方法安装
打开Xcode,菜单栏Xcode->Open Developer Tool ->More Developer Tools，进入AppleDeveloper的主页（需要登录），
选择CommandLineTools，进行安装。

* 确认安装了 JAVA

```
$ java -version
```
安装完毕的话，显示结果如下

```
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)
```
如果尚未安装的话，系统会提示安装。

* 确认安装了 Ruby

```
$ ruby -v
```
Mac默认情况下是已经安装了ruby的。其他默认安装的还有：Perl,Python,PHP。但是没有java~
#安装Homebrew
前往[Homebrew官方主页](http://brew.sh/index_ja.html),复制最新的安装命令进行安装。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

安装完毕后，确认版本。

```
$ brew --version
```

最后，执行诊断命令，确认brew可以正常工作

```
$ brew doctor
```
如果显示“Your system is ready to brew."就表示brew可以正常使用了。如有问题或警告，可根据提示内容谷歌解决。
#需要记住的两个单词
| Celler  | 包的安装路径 | /usr/local/Celler |
|:-------:|:----------:|:------------------:|
| Formula | 记载了编译顺序的脚本 | /usr/local/Library/Formula |
> /usr/local/bin里面存放的是指向Celler的链接
【atom】シンタックスカラーが気に入らないなら、自分で作ればいいじゃない

細かい設定は置いといて、兎にも角にも手っ取り早くatom editorの配色を変えたいのである。
そんな私のような人に向けて大雑把な方法をまとめておく。

# ここで入れておくと便利なパッケージ

* minimap-color-highlight
色の設定をしている箇所の背景色がその色になる。
https://atom.io/packages/minimap-color-highlight

* A Color Picker for Atom
crtl + alt + c で色を選択する窓が出てきて選択すると色のコードが記述される。
https://atom.io/packages/color-picker

# テーマ用のあれこれを準備

Ctrl + shift + p を同時に押すとお決まりの窓が出てくるので
そこに「theme」と入力する
すると「Package Generator : Generate Syntax Theme」という表示が出てくるのでそれを選択

C:\Users\\[User]\github\my-theme-syntax
と書かれた入力画面が出てくる
「my-theme-syntax」の「-syntax」の前の部分がテーマ名として設定画面等で表示されるのでここで設定する

例えば青系統の色で揃えたいなんてなった時は「sapphire-syntax」などと設定してみる。
テーマ名が決まったらenterを押下

設定したテーマ名のディレクトリと、その中身には設定ファイルが作られる。
sapphire-syntax/
|-- CHANGELOG.md
|-- LICENSE.md
|-- README.md
|-- index.less
|-- package.json
\`-- styles
    |-- base.less
    |-- colors.less
    \`-- syntax-variables.less

# いざ、色を変えてみる

細かい説明は飛ばして、とりあえず文字色を変えるならcolors.lessを操作
colors.lessで設定した色がbase.less,syntax-variables.lessで使用される。

```colors.less
// These colors are specific to the theme. Do not use in a package!

@very-light-gray: #c5c8c6;
@light-gray: #969896;
@gray: #373b41;
@dark-gray: #282a2e;
@very-dark-gray: #1d1f21;

@cyan: #8abeb7;
@blue: #81a2be;
@purple: #b294bb;
@green: #b5bd68;
@red: #cc6666;
@orange: #de935f;
@light-orange: #f0c674;

```

These colors are specific to the theme. Do not use in a package!とはいかに
TOEICのスコアが異様に低い割にセンター試験で9割取ったガチガチ英文法者が意訳するには
「このテーマ特有の配色なのでパッケージで使用しないでください><」とのこと。
どのみちgit等に上げる予定であれば変更する必要のあるファイルらしい。
逆にその必要が無いのであればそのままでも良いのかもしれない。

さて、自分に分かる設定であれば、「cyanだから青系統の色、redだから赤系統の色、orangeだから...」というように色の名前に則って色を設定する必要はない。
今回は手っ取り早く色を変える設定なので、色の名称はガン無視している。
（あ、gitで公開するなら考慮した方が良いかも...）

例えばこのように設定する。

```
@very-light-gray: #f0f0f0;
@light-gray: #969896;
@gray: #373b41;
@dark-gray: #282a2e;
@very-dark-gray: #1d1f21;

@cyan: #55aaff;
@blue: #80bfff;
@purple: #aad5ff;
@green: #55aaff;
@red: #80bfff;
@orange: #aad5ff;
@light-orange: #55aaff;
```
# 保存、反映
設定を保存したら設定画面に移る
ctrl + shift + P で「setting」と入力して一番上に出たものを選択するかctrl + ,

画面左側の「themes」を選択し、右側の「Syntax Theme」のプルダウンを広げてみると、
自分が作ったテーマがその中に含まれている。不覚にも嬉しい。
それで選択をすればテーマが反映される。
CSVアドレスマッチングサービスによるXYデータをArcMapに入れる手順

# 操作の手順 :computer:

1. マップレイヤの座標系は平面直角９系とします。
1. `データの追加`→`XYデータの追加`
1. csvファイルを指定し、XとYも指定します。
1. 「入力座標の座標系」の下の`編集`をクリック。
1. `日本測地系 2000(JGD 2000)`を指定します。
1. これで重なるはず。

# 参考リンク :paperclip:

[CSVアドレスマッチングサービス](http://newspat.csis.u-tokyo.ac.jp/geocode-cgi/geocode.cgi?action=start) - 東京大学空間情報科学研究センター

_
middleman-blog-bootstrap-templateを使ったプロジェクトのセットアップ

あらかじめ middleman-blog-bootstrap-template を git clone しておく

~~~
git clone https://github.com/biblichor/middleman-blog-bootstrap-template.git ~/.middleman/blog-bootstrap
~~~

プロジェクト配下に middleman で関連ファイルを生成

~~~
cd workspace/myproject
bundle init
echo 'gem "middleman"' >> Gemfile
bundle install --path vendor/bundle
bundle exec middleman init . --template=blog-bootstrap
~~~

bowerをつかってパッケージ群をインストール

~~~
npm install -g bower
bower install
~~~
LaravelでCSVダウンロード


CSVダウンロードの実装はどの言語、どの環境でもいつも悩ましいですね。
ここでは、都度、CSVダウンロードの方法を模索してみたいと思いますが、とりあえずfputcsvから。

###fputcsvを使う場合

コントローラーのcsv()メソッドのみ抜粋。
検索結果のCSVダウンロードにも対応できるようにkeywordを受け取っています。

```php
public function csv()
    {
        //keyword
        $keyword = \Input::get('keyword');

        //クエリ生成
        $query = User::query();

        //もしkeywordがあれば条件設定
        if(!empty($keyword))
        {
            $query->where('email','like','%'.$keyword.'%');
        }

        //クエリ実行
        $users = $query->get();

        //仮ファイルOpen
        $stream = fopen('php://temp','w');

        //loop
        foreach($users as $user)
        {   
            //カラムを選択
            fputcsv($stream,[$user->id,$user->name]);
            //全カラムの場合はtoArray()を使えば良い
            //fputcsv($stream,$user->toArray());
        }

        //ポインタの先頭へ
        rewind($stream);

        //いろいろ変換
        $csv = mb_convert_encoding(str_replace(PHP_EOL, "\r\n", stream_get_contents($stream)), 'SJIS', 'UTF-8');

        //file名
        $filename = "users_".date('Ymd').".csv";

        //header
        $headers = array(
            'Content-Type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename="' . $filename . '"'
        );

        //response
        return \Response::make($csv, 200, $headers);
    }
```

とりあえずは以上です。
初心者用　ECCUBEデザインの変更方法　変更したのに反映されないキャッシュ問題よさらば。wondaの備忘録

htmlの変更は管理画面のコンテンツ管理＞ブロック管理から行う。

直接ファイルをいじりたければ
src/Eccube/Resource/template/default/Blockにおかれているファイルを編集。

どちらで編集しても同じであると考えられる。

:key: ここで重要なのが、編集後はキャッシュがクリアされない限りhtmlの出力は変更されないので編集後はキャッシュクリアしなければならないということ。

肝心のキャッシュはapp/cache/twig/defaultの中にある。
フォルダ名　0  1  5  b  d　など
英数字一文字のファイルがいくつか見られる。（一度でもeccubeのindexを表示した場合）

このフォルダたちを思い切ってすべて消去。次回HPを表示させたときに再コンパイルされるので再びこれらのフォルダは自動的に出来上がる。そして、こんどは編集後の内容を反映しているため表示も変更される。

このことを知らないデザイナーの方は結構長時間どつぼにはまることに。お気をつけください。
SwiftでもPowerAssertしたい


「でも」と書いてますが、他言語でPowerAssert使ったことないです。すみません。

あいにくSwift版を作っている先人はいらっしゃらないようで、それらしいプロダクトは見当たりませんでした。
そこで「欲しいものは自分で作る」の精神で、自分で作ってみることにしました。

- - -

**PAssert**
https://github.com/keygx/PAssert

試行錯誤と割り切りと泥臭い実装によって、ようやくそれっぽいエラーが出力できるようになりました。


![screen.png](https://qiita-image-store.s3.amazonaws.com/0/15905/4a015689-d17e-bdb6-5ec1-e90a70cb00e2.png "screen.png")


##使い方
#### XCTAssertの代わりにPAssertを使えるようにします

- PAssert.swiftファイルをXcodeプロジェクトのTestターゲットへコピーします。  


![xcode.png](https://qiita-image-store.s3.amazonaws.com/0/15905/498a9739-4dc9-6a9e-a5c5-950c7f82a7ec.png "xcode.png")


- テストコードの中でXCTAssertの代わりにPAssertを書きます。  
PAssert(値1, 比較演算子, 値2) 

```
// Test MyCalc add()
func testCalc() {

	var calc = MyCalc()
	
	PAssert(calc.add(3, 4), ==, 7)
}
```

- 値1と値2が比較演算子の通り評価され、trueならばテストが通り、falseならばテストが失敗し、下記のような内容が出力されます。

```
=== Assertion Failed =============================================
DATE: 2015-08-05 11:59:49
FILE: PAssertSampleTests.swift
LINE: 29
FUNC: testCalc()

=> PAssert(calc.add(3, 4), ==, 7)
           |               |   |
           |               |   7
           |               |
           |               false
           |
           12
```

**エラー内容が分かりやすくなっていいかんじです。**
TwitterCardについていろいろ調査してみたことの備忘録


TwitterCardsについて色々調べてみたのでメモします。
※2015年8月10日現在の状況です。

# Twitter カードについての概要は下記に書いてあります。
https://dev.twitter.com/ja/cards/overview

Twitter カードには申請がいるとか書いてあるサイトがありますが恐らくPlayerカード以外は今はいらなくなってそうでした。

# App Cardを使ったときの例

## 1.まずはmetaを対象のhtmlに記載してください。(下記はサンプルなのでアプリに合わせて書き換えてください)

```lang:hoge.html
<meta name="twitter:card" content="app">
<meta name="twitter:description" content="The perfect for grabbing a nearby taxi. Try it by downloading today.">
<meta name="twitter:app:country" content="US">
<meta name="twitter:app:name:iphone" content="Example App">
<meta name="twitter:app:id:iphone" content="306934135">
<meta name="twitter:app:url:iphone" content="example://action/5149e249222f9e600a7540ef">
<meta name="twitter:app:name:ipad" content="Example App">
<meta name="twitter:app:id:ipad" content="306934135">
<meta name="twitter:app:url:ipad" content="example://action/5149e249222f9e600a7540ef">
<meta name="twitter:app:name:googleplay" content="Example App">
<meta name="twitter:app:id:googleplay" content="com.example.app">
<meta name="twitter:app:url:googleplay" content="http://example.com/action/5149e249222f9e600a7540ef">
```

## 2.metaを埋め込んだらCard validatorにURLをはっつけてください。

https://cards-dev.twitter.com/validator

![スクリーンショット 0027-08-10 19.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/54509/12dc8f0e-3bf9-36e4-4015-bd84c8cef82d.png)

※自分はサーバーの知識がなかったのでサーバーの人にお願いするまえにDropBoxにhtmlを置いて公開URLをコピーしてCard validatorにかけてテストしてました

## 3.はりつけたらこのようになるかと思います
![99954c56-3530-11e5-82f1-b93a7f250194.png](https://qiita-image-store.s3.amazonaws.com/0/54509/d7c45007-fb50-bf40-080d-e04d3a854bf8.png)

ドメイン is whitelisted for app cardになればOKです！
特に申請など必要ありませんでした。

## 4.whitelistedに登録されたURLをつぶやく
Tweetしたらこんな感じでTwitterアプリから見る事ができます。


![Screenshot_2015-08-10-19-45-15.png](https://qiita-image-store.s3.amazonaws.com/0/54509/8fdc72fd-9a9f-1713-95a5-ec92525f65e4.png)



**ここで注意があります。**
PCブラウザ、モバイルブラウザからwhitelistedに登録したURLをつぶやくとカードが表示されましたが、
iOS/AndroidのTwitterアプリを使用してwhitelistedに登録したURLをつぶやいてもカードが表示されませんでした。。。



大体の流れは以上になります、、

今日はザーっと書いてしまったのでまた綺麗に整理しますね。。
coqdocで日本語を含むPDFを生成する

Coqのドキュメント生成ツールであるcoqdocはコマンドラインオプションによってHTML形式やPDF形式の書類を生成するが、PDF形式の書類を作成する際に内部でpdfTeXを使っているようで、日本語を含むソースコードを扱う場合は簡単にはうまくいかないことがある。

そこで、coqdocからはtex形式のファイルを出すところまでやってもらい、残りはplatexなど自分の好きな方法で処理したい。

次のような内容のMakeというファイルを追加すればわりと簡単に実現できる(CoqのソースコードはHoge.v, Piyo.vだとする)。

```mf:Make
-R src JapaneseCoqdocSampleProject
src/Hoge.v
src/Piyo.v
-custom "platex Proof.tex; platex Proof.tex" "Proof.tex $(VOFILES) $(VFILES:.v=.tex)" "Proof.dvi"
-custom "dvipdfmx Proof.dvi" "Proof.dvi" Proof.pdf
```

また、プリアンブルなどに相当する部分Proof.texは自分で用意する。例えば次のような感じ。

```Tex:Proof.tex
\documentclass[12pt]{jreport}
\usepackage[]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fullpage}
\usepackage{coqdoc}
\usepackage{amsmath,amssymb}
\begin{document}

\title{証明報告書}
\author{有限会社 ITプランニング\\システム検証部　証明支援系課\\今井宜洋}
\date{\today}

\maketitle

\tableofcontents{}

%% Coqソースコードを追加削除変更したときはこちらも変更してください
\include{src/Hoge}
\include{src/Piyo}

\end{document}
```

ターミナルやJenkinsでは次を実行すればよい。

```bash
$ coq_makefile -f Make -o Makefile
$ export COQDOCFLAGS="-interpolate -utf8 --body-only"
$ make Proof.pdf
```

出来上がる生成物(PDF)の例は次のような感じ: https://github.com/yoshihiro503/coqdoc_ja_sample/raw/master/demo/Proof.pdf

また、HTML版の物も次のコマンドで生成できる。

```bash
$ unset COQDOCFLAGS
$ make html
```

出来上がるHTMLは次のような感じ: https://github.com/yoshihiro503/coqdoc_ja_sample/tree/master/demo/html
SQL Serverの横棒記号の取扱

とりあえずパッと混同されそう(Microsoft IMEで一発変換可能)な分だけ調べてみた
(一文字ずつレコードに放り込んだテーブルを用意してWHERE句でLIKE演算子で検索)

* －(全角マイナス) = -(半角ハイフン/マイナス)

* ー(全角長音) = ｰ(半角長音) = ―(全角ダッシュ)

* ‐(全角ハイフン)は他との一致無し

他に思いつけばそのうち調べる。
というかフォント次第ではホント見分けつかんねこれ
Microsoft AzureでCoreOS Stableインストール時にDockerがtimeoutして動かない問題

# 概要
Microsoft AzureでCore OS Stableをインストールした場合、Dockerが正常に動作しない事を確認しました。DockerHubからイメージをダウンロードできない為、Dockerの基本的な機能ほとんど全てが使えません。

ネットワークルーティングの問題だと考えられますが、Core OS Alphaをインストールしたら無問題でした。じきに解消されると思いますが、メモとして。

# 確認したバージョン情報
## CoreOS Stable(動作せず)
CoreOS Version 723.3.0
Docker Version 1.6.2
## CoreOS Alpha(動作する)
CoreOS Version 766.0.0
Docker Version 1.7.1

# 解決方法
## Core OS Alphaをインストールする
![ 2015-08-10 19.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/10949/a6309eb4-4217-cd3f-83bc-91462f991b1c.png)
非常に簡単。Azureのインストール時に選択するだけです。

## ルーティングの問題を解決する(未検証)
```bash
sudo route -nv add -net x.x.x.x -interface hoge
```
コマンドあたりで解決すると思いますが、実証していません。
覚えとけ！Rubyで順番は死ぬほど大事だぞ！

さてこのコード、当っていそうで何かが間違っています。それはなんでしょうか？

```rb
def fizz_buzz
  num = 0
  while (num <= 100) do
    num = num + 1
    if (num % 3 == 0) && (num % 5 == 0)
      puts "FizzBuzz"
    elsif (num % 3) == 0
      puts "Fizz"
    elsif (num % 5) == 0
      puts "Buzz"
    else
      puts num
    end

  end
end
```



正解はここ！numの位置です！

```rb
def fizz_buzz
  num = 0
  while (num < 100) do
    num = num + 1
    if (num % 3 == 0) && (num % 5 == 0)
```

ココの何が間違っているでしょうか？
では、実際に最初のコードを追ってみてください。すると・・・

**あれ？？なんかずれてるぞ？？**

ということに気づくはずです。
せっかくnumの値を0と定義しているのに、while文のすぐそばでnum = num + 1とやってしまったら、if文の中が0ではなく1で実行されちゃうんですねー、これが間違いの正解です。
ですので正しくはこうなります。

```rb
def fizz_buzz
  num = 0
  while (num <= 100) do
    if (num % 3 == 0) && (num % 5 == 0)
      puts "FizzBuzz"
    elsif (num % 3) == 0
      puts "Fizz"
    elsif (num % 5) == 0
      puts "Buzz"
    else
      puts num
    end

    num = num + 1

  end
end
```

いやー、ほんのちょっと順番を間違えるだけですごいエラーになっちゃうんですね〜

***いいか！順番は死ぬほど大事だぞ！***


~おわり
3Dプリンタ ダヴィンチ1.0Aにてノズルが正常にヒーティングされない問題の対処法


# 数ヶ月使用していると、ノズルヒーティングが正常に動作しない事象が発生
1. 2015年2月に購入し、連続3-5時間、週2-3回は使用していた
2. 5月頃、**フィラメントのロード/アンロード、プリント時などに行われるノズルのヒーティングが全く行われない事象が度々発生**するようになった (ワークテーブルのヒーティングは問題ない)

# 原因 ノズル上部の白コネクタの接触不良
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/80163/9d154117-3388-baed-b2c9-e208d06807c0.jpeg)
1. 電圧を計測してみるとわかるが、12Vがかかっていないはず (このコネクタ接続されているケーブルがノズルへつながりヒーティングを行っているので、ここに正常に電気が流れていないと、当たり前だが正常動作しない)
2. 海外版だと、白コネクタじゃないみたい。オレンジ？っぽい
3. 国内版でも、もしかしたら生産時期などによって色や形が違う場合があるかもしれない

# 対策 至って簡単 挿し直すだけ
**ただの接触不良なので、挿し直してあげたり、ケーブルをぐりぐり押し込んであげたりするだけで直る**

# 備考
1. 調べていないが、もしかしたら他の機種でも同じ事象が発生するかもしれない(ダヴィンチ1.0やAiO, Jrなど)
2. 5月に直し、8月上旬事象が再発
とはいえ、原因はわかりきっているので、コネクタを挿し直したところ、すぐに解決
3. 保証が切れるの覚悟で、コネクタを別のものに付け替えるとか、ハンダ付けするとかしたほうが確実だとは思う (長時間プリント中に接触不良起こしてノズルの温度が落ちて結果失敗とかマジ最悪)
Goをインストールしたときの備忘録

Androidをずっと開発していますが機会があってGoに触れる機会ができたのでメモです

サーバーの知識はほぼゼロベースです(笑)
その中での備忘録です :sob: 

# まずはintellijをインストールしました!
下記サイトからintellijはゲットンできます。(Download IntelliJ IDEA 14.1)
https://www.jetbrains.com/idea/download/

![スクリーンショット 0027-08-10 18.26.59.png](https://qiita-image-store.s3.amazonaws.com/0/54509/39daa7c5-db38-004f-c015-17fe556743b1.png)

右側のCommunity Edition FREEを選択してください。

•ideaIC-14.1.4.dmgが落っこちてきますので
なにも考えずに実行してください。

# Xcodeのインストール
なにも考えずにインストールして下さい。

```lang:terminal
$ xcode-select --install
```

# Homebrew をインストールする
```lang:terminal
$ sudo ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# Go をインストールする
```lang:terminal
$ brew install go
```

# ちょいとめんどくさいPath設定

```lang:terminal
$ sudo emacs .bash_profile
```

bash_profileを開いてpathを追加しましょう！

```lang:.bash_profile
export GOROOT=`go env GOROOT`
export GOPATH=$HOME/GoLang
                    ^^^^^^^
                    ↑ここは自分で作成したフォルダを書いてください！
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```


これで一通りインストールは完了です！
cloud-init のスクリプトを reboot せずに再実行するには

cloud init のスクリプトをホストを再起動せずに何度も実行して開発するには次のようにすればよいようだ

## 前提知識

/etc/cloud/cloud.cfg には

```
cloud_init_modules:

...

# The modules that run in the 'config' stage
cloud_config_modules:

... 

# The modules that run in the 'final' stage
cloud_final_modules:
```

の３つのセクションがある。実行タイミングについては [Amazon Linuxのcloud-initの動きについて調べてみた](http://dev.classmethod.jp/cloud/aws/probe-cloud-init) の記事を参照すると良い。

## 開発実行のやり方

それぞれ以下のように実行すれば良い

１. `cloud_init_modules` セクションの実行

```
rm -rf /var/lib/cloud/* && \
  cloud-init --debug init --local && \
  cloud-init --debug init
```

２. `cloud_config_modules` セクションの実行

```
rm -rf /var/lib/cloud/* && \
  cloud-init init --local && \
  cloud-init init && \
  cloud-init --debug modules --mode config
```

３. `cloud_final_modules` セクションの実行

```
rm -rf /var/lib/cloud/* && \
  cloud-init init --local && \
  cloud-init init && \
  cloud-init modules --mode config && \
  cloud-init --debug modules --mode final
```

## 補足

`/var/lib/cloud` の下はこんなかんじで、status.json や sem 以下のファイルに init が実行ずみであることなどが記録されているため、消さないと再実行できなくなっている。(status.json を消すだけではダメだった)


```
# tree /var/lib/cloud/
/var/lib/cloud/
├── data
│   ├── instance-id
│   ├── previous-datasource
│   ├── previous-instance-id
│   └── status.json
├── handlers
├── instance -> /var/lib/cloud/instances/i-5d1d98af
├── instances
│   └── i-5d1d98af
│       ├── cloud-config.txt
│       ├── datasource
│       ├── handlers
│       ├── obj.pkl
│       ├── scripts
│       │   └── runcmd
│       ├── sem
│       │   └── consume_data
│       ├── user-data.txt
│       ├── user-data.txt.i
│       ├── vendor-data.txt
│       └── vendor-data.txt.i
├── scripts
│   ├── per-boot
│   ├── per-instance
│   ├── per-once
│   └── vendor
├── seed
└── sem
```

消した上で、

1. `cloud-init init --local` (`/etc/init.d/cloud-init-local start`)
1. `cloud-init init` (`/etc/init.d/cloud-init start`)
1. `cloud-init modules --mode config` (`/etc/init.d/cloud-config start`)
1. `cloud-init modules --mode final` (`/etc/init.d/cloud-final start`)

の順番で実行されるのが前提となっているため、final を実行するには、前３つを実行する。

例えば、`runcmd:` で指定したコマンドは config ステージで `scripts/runcmd` が生成され、final ステージで実行されるようだ。なので final だけ実行してもファイルがなくて何も処理されない。

# おわりに

もっとうまい方法があれば情報 welcome
javascriptでHTMLで書いたコードにハイライトをつける。（Highlight.jsを使ってみた。）

## やりたいこと

* ウェブサイトで記述するコードにハイライトをつけたい。


## まずはダウンロード

まずは以下のサイトからソースをダウンロードする。

https://highlightjs.org/

![スクリーンショット 2015-08-10 18.27.33.png](https://qiita-image-store.s3.amazonaws.com/0/29570/c788a57f-9b30-c900-edb0-aaef49c2014f.png)


「get version x.x」をクリック。

![スクリーンショット 2015-08-10 18.28.27.png](https://qiita-image-store.s3.amazonaws.com/0/29570/17e00bfd-7041-8516-ffbd-cde286286df3.png)


ページが移動すするので、使用するプログラムにチェックを入れてダウンロードする。

![スクリーンショット 2015-08-10 18.29.52.png](https://qiita-image-store.s3.amazonaws.com/0/29570/8fb6ba1e-da3b-10f3-bbe7-a53457841b0f.png)

## ファイルを展開し、ローカルでチェックしてみる。

ダウンロードした `highlight.zip` ファイルを回答すると以下のような構成になる。（cssファイルは省略）

<pre>
highlight
├── CHANGES.md
├── LICENSE
├── README.md
├── README.ru.md
├── highlight.pack.js
├── index.html
└── styles
   ...
    ├── darkula.css
    ├── default.css
    ├── docco.css
    ├── far.css
    ├── foundation.css
    ├── github-gist.css
    ├── github.css
    ├── googlecode.css
   ...
</pre>





公式サイトには以下のように記述するようにあるので、それを参考に`highlight`の直下に `index.html`ファイルを作成してみる。

```html
<link rel="stylesheet" href="/path/to/styles/default.css">
<script src="/path/to/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
```



```html:index.html
<html>
<head>
<link rel="stylesheet" href="styles/default.css">
<script src="highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body>

<pre>
<code>
def hoge
  p "aaaa"
end
</code>
</pre>

<pre>
<code>
body {
	display: none;
}
#test{
	font-size: 80%;
}
.test{
	background: url(../images/test.jpg) no-repeat left top;
}
</code>
</pre>

</body>
</html>

```

実際には以下のように表示される

![スクリーンショット 2015-08-10 19.13.57.png](https://qiita-image-store.s3.amazonaws.com/0/29570/15f08e96-8760-a5f2-8e41-22f35f859dc5.png)

## カラー変更

ハイライトの色を変更したい場合は、cssの読み込みファイルを変更する。

例えば、github風にする場合は以下のように変更する

```html:index.html
<html>
<head>
<link rel="stylesheet" href="styles/github.css">
...
```

## 感想

使ってみた感じでは、設定はすごく簡単で、様々な言語にも対応しており（精度の検証はしてませんが。）良い感じ。
カラーもCSSで自分好みのテーマに切り替えることができるので、その他色々なカラーテーマを試してみたくなる。
今のところ個人的には、`foundation.css` のカラーテーマがお気に入り。
しばらくはハイライトはこのライブラリーを使用してみます。
ggplot2 で geom_text() を使って集合棒グラフにラベルを付けたい #rstatsj

> 本記事は [ggplot2逆引き](http://qiita.com/tags/ggplot2%E9%80%86%E5%BC%95%E3%81%8D/items) プロジェクトの一環として、Stack Overflow の下記記事を翻訳したものです。
> [ggplot: geom_text with dodged barplot](http://stackoverflow.com/questions/6017460/ggplot-geom-text-with-dodged-barplot)

## 質問

タイトル通りのことをやりたくて、自分でやってみたのですが、ダメです。

まずはデータを用意します。

```r:R
data <- data.frame(
  variable = gl(5, 2, labels = c("vma", "vla", "ia", "fma", "fla")),
  ustanova = gl(2, 1, 10, labels = c("srednja skola", "fakultet")),
  all = c(42.9, 38.7, 37.8, 33.7, 29.5, 26.1, 27.9, 23.9, 33.2, 26.9)
)

data
```

```:結果
   variable      ustanova  all
1       vma srednja skola 42.9
2       vma      fakultet 38.7
3       vla srednja skola 37.8
4       vla      fakultet 33.7
5        ia srednja skola 29.5
6        ia      fakultet 26.1
7       fma srednja skola 27.9
8       fma      fakultet 23.9
9       fla srednja skola 33.2
10      fla      fakultet 26.9
```

集合棒グラフを作り、`coord_flip()` で横向きにして、棒の内側にテキストを付けたいのですが、

```r:R
library(ggplot2)
ggplot(data) + 
  geom_bar(aes(x=variable, y=all, fill=ustanova), position="dodge", stat="identity") +
  geom_text(aes(x=variable, y=all, label=sprintf("%2.1f", all))) + 
  coord_flip()
```

結果はこのようになります。

![bar1.png](https://qiita-image-store.s3.amazonaws.com/0/2570/bc26cbdb-ccf8-0815-8b8f-d30e3eeaeb44.png)

私の質問は非常に基礎的なことかもしれません。
テキストラベルが棒に「ついていく」ようにしたいのです。
ラベルは y 軸に対しては正しく配置されています。
しかし、どのようにすれば x 軸に対しても正しく配置されるのでしょうか？

## 回答

こういうことかな？

```r:R
ggplot(data) + 
  geom_bar(aes(x=variable, y=all, fill=ustanova), stat="identity", position="dodge") +
  geom_text(aes(x=variable, y=all, group=ustanova, label=sprintf("%2.1f", all)), 
            position=position_dodge(width=0.9)) +
  coord_flip()
```

![bar2.png](https://qiita-image-store.s3.amazonaws.com/0/2570/f5f61adf-8960-b3d8-f66b-0014eb2387d6.png)

ポイントは `position = "dodge"` の代わりに `position = position_dodge(width=0.9)` を使うことと、`geom_text()` の中で `group` を指定してやることです。
`position = "dodge"` は `position_dodge()` のパラメータを指定しない単なるショートカットにすぎません。

## 補足

テキストラベルを棒の「内側に」表示したい場合は、`hjust` や `vjust` を使います。

```r:R
ggplot(data) + 
  geom_bar(aes(x=variable, y=all, fill=ustanova), stat="identity", position="dodge") +
  geom_text(aes(x=variable, y=all, group=ustanova, label=sprintf("%2.1f", all), hjust=1.4), 
            position=position_dodge(width=0.9)) +
  coord_flip()
```

![bar3.png](https://qiita-image-store.s3.amazonaws.com/0/2570/14d66693-9948-69d1-4c01-a56b6a649ba8.png)

また、積み上げ棒グラフに対して同様のことを行うには、次のように書きます。

```r:R
ggplot(data) + 
  geom_bar(aes(x=variable, y=all, fill=ustanova), stat="identity", position="stack") +
  geom_text(aes(x=variable, y=all, label=sprintf("%2.1f", all)), position="stack") +
  coord_flip()
```

![bar4.png](https://qiita-image-store.s3.amazonaws.com/0/2570/5864f736-4073-d4fc-90f5-8f9307ab8e45.png)

## 参考

- [ggplot: geom_text with dodged barplot](http://stackoverflow.com/questions/6017460/ggplot-geom-text-with-dodged-barplot)
- [Issue with geom_text when using position_dodge](http://stackoverflow.com/questions/30634148/issue-with-geom-text-when-using-position-dodge)

## 関連

- [ggplot2で積み重ね棒グラフに値を表示させたい](http://qiita.com/kazutan/items/f26db670412906f00e4c)
JavaScript上でuserAgentを変更する

JavaScriptで無理やりUserAgentを変更するコード。
テストコード用に利用してたものなのでproductionで使う場合は自己責任で。（そんなケースないと思いますが）


```js
/**
 * userAgentをハックする
 */
const changeUserAgent = (ua) => {
  // Chrome, fx, IE11
  window.navigator.__defineGetter__('userAgent', () => ua);

  // Safari
  try{
    // fxでsetterがないとエラーになるので
    window.navigator = {
      get userAgent() {
        return ua;
      }
    };
  }catch(e){}
};
```

テストコード例

```js

describe('check ua', function () {
  before(() => {
    changeUserAgent('Mozilla/5.0 (Macintosh; ...');
  });

  it('is Mac Chrome?', () => {
    assert.equal(window.navigator.userAgent, 'Mozilla/5.0 (Macintosh...');
  });
});
```