OmniAICreator/Qiita-1.07M huggingface dataset:
Python if文と足し算


```
準備
>>> import random
>>> combs =[]
>>> for x in["チーズバーガー","ハンバーガー","トマトバーガー"]:
	for y in["ポテト","サラダ"]:
		for z in["シェイク","コーラ","ダイエットコーラ"]:
			combs.append((x,y,z))

#準備

>>> combs
[('チーズバーガー', 'ポテト', 'シェイク'), ('チーズバーガー', 'ポテト', 'コーラ'), ('チーズバーガー', 'ポテト', 'ダイエットコーラ'), ('チーズバーガー', 'サラダ', 'シェイク'), ('チーズバーガー', 'サラダ', 'コーラ'), ('チーズバーガー', 'サラダ', 'ダイエットコーラ'), ('ハンバーガー', 'ポテト', 'シェイク'), ('ハンバーガー', 'ポテト', 'コーラ'), ('ハンバーガー', 'ポテト', 'ダイエットコーラ'), ('ハンバーガー', 'サラダ', 'シェイク'), ('ハンバーガー', 'サラダ', 'コーラ'), ('ハンバーガー', 'サラダ', 'ダイエットコーラ'), ('トマトバーガー', 'ポテト', 'シェイク'), ('トマトバーガー', 'ポテト', 'コーラ'), ('トマトバーガー', 'ポテト', 'ダイエットコーラ'), ('トマトバーガー', 'サラダ', 'シェイク'), ('トマトバーガー', 'サラダ', 'コーラ'), ('トマトバーガー', 'サラダ', 'ダイエットコーラ')]


#実行コマンド

>>> combs[(random.randint(1,len(combs)+1))]

#表示例

>>> combs[(random.randint(1,len(combs)+1))]
('チーズバーガー', 'サラダ', 'ダイエットコーラ')

>>> combs[(random.randint(1,len(combs)+1))]
('ハンバーガー', 'サラダ', 'コーラ')
```

上記までは滞りなく進むのですが。

```
>>> if x == "ハンバーガー":
	X = 120
elif x == "チーズバーガー":
	X = 100
elif x=="トマトバーガー":
	X = 200

>>> if y == "サラダ":
	Y = 150
elif y == "ポテト":
	Y = 100
	
>>> if z == "シェイク":
	Z = 120
elif z =="コーラ": 
	Z = 100
elif z =="ダイエットコーラ":
	Z=150

```

として

```
>>>print(combs[(random.randint(1,len(combs)+1))],X+Y+Z)

```

と打ち込んでも。X+Y+Zの計算の部分が毎回同じ値
```
('チーズバーガー', 'ポテト', 'コーラ') 500
('トマトバーガー', 'ポテト', 'シェイク') 500
```

となります、どうやったら計算部分が毎回うまく動くようにできますか？
AWS EC2 で ImageMagickの脆弱性「ImageTragick」対応

## 前提
- AWS の EC2に、脆弱性の発見されている ImageMagick が下記コマンドでインストールされている

```yum install ImageMagick```

## 脆弱性について
- 参考: [ImageMagickの脆弱性(CVE-2016-3714他)についてまとめてみた - piyolog](http://d.hatena.ne.jp/Kango/20160504/1462352882)

## 脆弱性対応
- AWS では2016/05/11時点で対応済みのImageMagickパッケージが用意されている。参考: https://alas.aws.amazon.com/ALAS-2016-699.html

```
Note: This update contains an updated /etc/ImageMagick/policy.xml file that 
disables the EPHEMERAL, HTTPS, HTTP, URL, FTP, MVG, MSL, TEXT, and LABEL
coders. If you experience any problems after the update, it may be necessary
to manually adjust the policy.xml file to match your requirements. 
```
- 下記コマンドを実行すれば対応完了

```
yum update ImageMagick
```
NewRelic APMを任意のホストのみに導入する方法

## TL:DR
NewRelic は1ホストあたり $149/month なので、全サーバーに導入することは難しい。
なので、全体の中から必要なホストのみ抽出し、監視する等のテクニックが必要となる。


itamaeが整っている環境では、rails_configのgemを使って、
settings.ymlをホスト毎に書き換えるのが最もよいだろう.


とはいえ、itamaeがそこまで整ってないプロダクトもあると思うので、
ここでは application.rbで指定する方法を用意した.

## CODE
```ruby:application.rb
module SampleProject
  class Application < Rails::Application
    config.newrelic_monitor_mode = (`hostname -f`).strip.in? %w(NEWRELIC_HOST)
  end
end
```

```yml:newrelic.yml
common: &default_settings
  license_key: <%= Settings.newrelic.license_key %>
  log_level: info
  developer_mode: false
  monitor_mode: false
production:
  <<: *default_settings
  monitor_mode: <%= SampleProject::Application.config.newrelic_monitor_mode %>
```

## 確認

deploy後に、下記のようなログが流れればOK.
log/newrelic_agent.log 

```
[2016-05-11 xx:xx:xx +0900 URL (nn)] INFO : Reporting to: https://rpm.newrelic.com/accounts/:account_id/applications/
[2016-05-11 xx:xx:xx +0900 URL (nn)] INFO : Reporting to: https://rpm.newrelic.com/accounts/:account_id/applications/:application_id
```

そうでない場合は設定ファイルが間違っているかも知れないので、
Agentのconfigを確認する。

bundle exec rails c 

```
irb(main):00n:0> NewRelic::Agent.config[:monitor_mode]
=> true
irb(main):00n:0> NewRelic::Agent.config[:license_key]
=> 'xxxxxxxxxxxxxxx'
```
Array.forEachでbreak出来ないぐぬぬってなったらArray.some

## Array.forEachでbreakは使えないんじゃよの巻
配列を上から順に見て、一番最初に見つかった男性キャラの名前を表示したいとします

```js
let characters = [
                  {
                   name: "阿良々木暦",
                   gender: "male"
                  },
                  {
                   name: "戦場ヶ原ひたぎ",
                   gender: "female"
                  },
                  {
                   name: "八九寺真宵",
                   gender: "female"
                  },
                  {
                   name: "神原駿河",
                   gender: "female"
                  },
                  {
                   name: "千石撫子",
                   gender: "female"
                  },
                  {
                   name: "羽川翼",
                   gender: "female"
                  },
                  {
                   name: "忍野メメ",
                   gender: "male"
                  },
                  {
                   name: "忍野忍",
                   gender: "female"
                  }
];

// Uncaught SyntaxError: Illegal break statement
characters.forEach(function(character){
    if(character["gender"] === "male"){
        console.log(character["name"]);
        break;
    }
});
```

予期した結果としては「阿良々木暦」と表示されるはずですが、
「Uncaught SyntaxError: Illegal break statement」と怒られます。
C#のforeach等と同じ感覚では使えないわけです。

ここでforEachを__some__、breakを__return true__に置き換えます。

```js
// 「阿良々木暦」と表示される
characters.some(function(character){
    if(character["gender"] === "male"){
        console.log(character["name"]);
        return true;
    }
});
```

これで期待した動作をします！簡単ですね！
## 本来のArray.someの使い方
実は先ほどのコードでは、someメソッド自体もtrueを返しています。
これはArray.someが__第一引数に与えられた関数がtrueを返すまでループを回す__メソッドであるからです。
配列の最後の要素まで行ってtrueが返らなかった場合にのみArray.someはfalseを返します。
なので、本来の使い方としてはこんなところではないでしょうか。

```js
// 忍ちゃんがいたらドーナツを買う
function shouldBuyDonut(characters){
    return characters.some(function(character){
        return character["name"] === "忍野忍";
    });
}
```
小ネタ：箱詰めの値型を外側から偏執的にいじる

#どーいうこと？

昨日、[dynamic 経由の値型の取り回し](http://qiita.com/NetSeed/items/798435d4328f57233e5f)と言うエントリをアップしたのですが、その後気になるというかまぁ調べてみっか程度に、色々と調べてみたら、どうやらコールサイトの構築時に内部でボックス化を含む処理を生成しているらしく高頻度に動かしたときGarbageCollectionが発生していた。

本質的に、値型をボックス化した挙げ句、ボックス化した状態で結構な回数書き換え、読み込みを行うことなんて本来的には問題が多く、改善をすべき状態ではあるけど、ここは一つ偏執狂的に何とか出来ないか追い求めてみたので、おつきあい頂ければ幸い。

尚、今回はパラノイア回なのでほとんど自己満足として、出来ましたと言う事実の提示であって、積極的にお勧めなんてとても出来る代物では無いのでその点十分ご留意の程。

#前説

さて、今回使う箱詰めにする構造体は以下の通り

```csharp
public struct SomeStruct
{
	public int Value { get; set; }

	public override string ToString() => Value.ToString();
}
```

で、コレを、以下のように操作したとき、

```csharp

static void Main()
{
	dynamic d = new SomeStruct { Value = 42 };

	for (int i = 0; i < 1000000; i++)
	{
		d.Value += i;
	}

	Console.WriteLine(d.Value);
}

```

自分の環境では、

 * Generation0:17回
 * Generation1:1回
 * Generation2:0回

という感じでGarbageCollectionが発生していた。
で、ここのカウントを0にしていきましょうというのが今回のお題です。

#dynamic無しでとりあえずどうかしてみる

dynamicの使用せず、ボックス化したまま`Value`プロパティをGet/Setするにはリフレクションを使えばまぁ何とかなる。

```csharp

static void Main()
{
	object obj = new SomeStruct {Value = 42};

	var propInfo = typeof (SomeStruct).GetProperty("Value");


	for (int i = 0; i < 1000000; i++)
	{
		var tmp = i + (int) propInfo.GetValue(obj);
		propInfo.SetValue(obj, tmp, null);
	}

	Console.WriteLine(obj);
}

```

ただ、`propInfo.GetValue`メソッドの戻りは`object`から`int`へのUnboxingが発生しているし、`propInfo.SetValue`メソッドの第2引数も`int`から`object`へのBoxingが発生している。
だもんで、自分の環境ではGeneraton0が26回発生していた。

#どーせ行くならパラノイア♪

ということで、基本はリフレクション経由で行くとして、解決すべきは`Boxing`と`Unboxing`が発生させなきゃ良いので、それは何とかしたい。
で何とかしたのが以下[^1]

```csharp

static void Main()
{
	object obj = new SomeStruct {Value = 42};

	var propInfo = typeof (SomeStruct).GetProperty("Value");

	var setter = (Action<int>) propInfo.SetMethod.CreateDelegate(typeof (Action<int>), obj);
	var getter = (Func<int>) propInfo.GetMethod.CreateDelegate(typeof (Func<int>), obj);

	for (int i = 0; i < 1000000; i++)
	{
		var tmp = i + getter();
		setter(tmp);
	}

	Console.WriteLine(obj);
}

```

見事、GarbageColletionを発生させないまま完了したけど、一般的なシナリオ[^2]では多分、`setter`,`getter`の構築コストをペイできないし、そもそも、何れのデリゲートも`obj`変数専用となっており、ほぼ使い道は無い。

とはいえ、多分実用的な場面でコンなこと必要なシナリオは多分ないかな～とは思う。でも良いじゃ無いパラノイアなんだから♪





[^1]: ごめん。飽きたw
[^2]: 含む、ちょっと逸般的なシナリオ。余程な逸般的なシナリオは除く。
EspressoテストでMenuアイテムの表示、非表示を確認したい

#Menuアイテムの表示を確認する
メニューアイテムはidではViewを探せないため、表示文言で探す。

```java:HogeActivityTest.java
　　　　@Test
　　　　public void testMenuItem() {
　　　　　　　　// 表示されていることを確認する場合
　　　　　　　　onView(withText(R.string.menu_setting)).check(matches(isDisplayed()));
　　　　　　　　// 表示されていないことを確認する場合
　　　　　　　　onView(withText(R.string.menu_refresh)).check(doesNotExist());
　　　　}
```
#OverFlowMenu内のメニューアイテムを確認する
OverFlowMenu内のアイテムを確認するには、OverFlowMenuを開く必要がある

```java:HogeActivityTest.java
　　　　@Test
　　　　public void testOverFlowMenuItem() {
　　　　　　　　// オーバーフローメニューを開く
　　　　　　　　openActionBarOverflowOrOptionsMenu(mActivityRule.getActivity());
　　　　　　　　// 表示されていることを確認する場合
　　　　　　　　onView(withText(R.string.menu_setting)).check(matches(isDisplayed()));
}
```
#OverFlowMenuが表示されているかどうかを確認する
条件によってMenuの表示非表示を切り替えている時、OverFlowMenuが表示されるかどうか知りたい時があったので調べた。
メニューを開くことができるなら、Viewも判定できるはずと思って、Espresso.javaの中からMacherを持ってきた。

```java:HogeActivityTest.java
　　　　@Test
　　　　public void testOverFlowMenuItem() {
　　　　　　　　　Matcher<View> overFlowButtonMatcher = anyOf(
    　　　　　　　　allOf(isDisplayed(), withContentDescription("More options")),
    　　　　　　　　allOf(isDisplayed(), withClassName(endsWith("OverflowMenuButton"))));
　　　　　　　　// 表示されていることを確認する場合
　　　　　　　　onView(overFlowButtonMatcher).check(matches(isDisplayed()));
}
```
docker networkのcluster-storeでsslを使うオプションのメモ

平文通信は危なっかしいですよね。クラスタストアとsslで通信するには、以下の様なオプションでdocker daemonを起動すれば良さそう。

```
--cluster-store=etcd://<host>:<port>} \
--cluster-store-opt kv.cacertfile=ca.pem \
--cluster-store-opt kv.certfile=cert.pem \
--cluster-store-opt kv.keyfile=key.pem \
```
ヘルプ画面作るのに wiki 調べてみました

- DBなし
- php
- free 
- 画像は表示できないと
- テーマで簡単に見た目が調整できる

ぐらいが条件
用語集とかも作りたいから、media wiki がよさげなんだけど、DB使ってるんでどうしようかな
#候補

##[dokukwiki](https://www.dokuwiki.org/start?id=ja:dokuwiki)
これは使った事ある、ＤＢなしでphpのはず
## [XWiki Projects](http://www.xwiki.org/xwiki/bin/view/Main/)
不明、結構かっこいい画面が作れそうなので　調査

[リンクをメモ](http://www.netdiggers.com/best-opensource-and-free-wiki-software/)
UWP開発のメモ


# 検索の仕方

UWPの情報が少ない上に、似た異様なコードが大量に引っかかるのが厄介
WinRTをキーワードに追加するとチョット良い。

```.cs

//デザインモード判定
var isDesignMode = windows.ApplicationModel.DesignMode.DesignModeEnabled;

if(!isDesignMode){
	//デザインモードじゃないときの処理
}                        

//コンソール出力
Debug.WriteLine("hoge");
```

# System.ApplicationException が見つかりません。

> 抑制状態 エラー
>  モジュール CommonLanguageRuntimeLibrary で型System.ApplicationException が見つかりません。

UWPにはSystem.ApplicationExceptionが存在しないので、それを使ってるクラスは全滅っぽいーぽいー。
てゆか基本的に旧DLLはダメ？

# Log4netが使えない？
だめっぽい。
MetroLogを使いましょう。

# shift_jisが使えない？
> System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");
System.ArgumentException: 'shift_jis' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

#ドロップシャドウは？
```.wpf
<StackPanel.BitmapEffect>
  <DropShadowBitmapEffect Color="Black" Direction="270" ShadowDepth="5" Softness="1" Opacity="0.5"/>
</StackPanel.BitmapEffect>
```

だめっぽい、UWPはエフェクトサポートしてないらしい。
まじか、耳を疑いましたわ。
どうしよう。

#埋め込みリソースをImageタグで表示する
```.xaml
<Image Source="ms-appx:///Resources/hoge.png"/>
```


#Drag and Dropで移動可能なオブジェクト
WPFではThumbを継承して使うのが簡単で良かったのですが
> シール型'Thumb'から派生することはできません。

なんでシール型にするかね。。

#InkCanvasのEditableMode
inkCanvas.InkPresenter.InputProcessingConfiguration.Mode

ペン >> InkInputProcessingMode.Inking
消しゴム(Stroke) >> InkInputProcessingMode.Erasing
消しゴム(Point) >> 無し

EraseByPoint無しですよ、無し。
普通の消しゴムは実装されていません、使えねぇ。。
Python tqdm について。

```ruby:filename.rb
>>> from tqdm import tqdm

>>> import time

>>>for i in tqdm(range(100)):
    time.sleep(0.01)



  0%|          | 0/100 [00:00<?, ?it/s]
  6%|6         | 6/100 [00:00<00:01, 59.16it/s]
 12%|#2        | 12/100 [00:00<00:01, 59.38it/s]
 19%|#9        | 19/100 [00:00<00:01, 59.75it/s]
 26%|##6       | 26/100 [00:00<00:01, 59.99it/s]
 32%|###2      | 32/100 [00:00<00:01, 59.98it/s]
 38%|###8      | 38/100 [00:00<00:01, 57.21it/s]
 44%|####4     | 44/100 [00:00<00:01, 55.98it/s]
 #以下略

```

というようなエラーではないのですが、本来とは違う結果が出力されます。
どこが間違っているのでしょうか？
Ubuntu 16.04 on Docker で Heroku Toolbelt を試す


* 要 Docker 環境
* 要 Heroku アカウント

## Local

```bash
### Ubuntu 16.04 の bash を起動
docker run -it ubuntu:16.04 /bin/bash
```

## Ubuntu on Docker

```bash
### Heroku Toolbelt のインストール
apt update
apt install -y wget sudo
wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

### Heroku Toolbelt バージョン確認
heroku --version

### Heroku ログイン
heroku login

### Heroku アプリ作成
mkdir hello-app
git init
heroku create <MY_HEROKU_APP_NAME>
#=> Creating app... done, ⬢ <MY_HEROKU_APP_NAME>
#   https://<MY_HEROKU_APP_NAME>.herokuapp.com/ | https://git.heroku.com/<MY_HEROKU_APP_NAME>.git

git remote -v
#=> heroku	https://git.heroku.com/<MY_HEROKU_APP_NAME>.git (fetch)
#   heroku	https://git.heroku.com/<MY_HEROKU_APP_NAME>.git (push)

### アプリ作成
### (ごにょごにょ)

### Heroku デプロイ
git push heroku master
```

あとは煮るなり焼くなり:smiley: 

Dockerfile 化しておくと良いかもです。
oFの映像をキャプるよ

## フロー
　流れとしては、ofxExportImageSequenceで連番書き出し→ffmpegで統合といった感じです。


### 1.ofxExportImageSequenceで連番書き出し
#### 1-1.比嘉さんの[レポジトリ](https://github.com/satoruhiga/ofxExportImageSequence)からcloneしてきます。</b>

#### 1-2.書き出したい範囲を囲みビルド</b>
　プロジェクトに追加し、連番書き出しを行いたい範囲を`begin()/end()`で囲みビルドするだけです。以下にも記載していますが、ぶっちゃけexampleをみた方が良いかと思います。

```
//この2行は.hファイルに記述
#include "ofxExportImageSequence.h"
ofxExportImageSequence exp;


void ofApp::setup(){
    exp.setup(1280, 720, 30);
    exp.setOutputDir("out");
    exp.setOverwriteSequence(true);
    exp.setAutoExit(true);
    exp.startExport();
}
```

```
void ofApp::draw(){
    exp.begin();
    ofClear(0);
    /*書き出したい何か*/
    exp.end();
    
    exp.draw(0, 0);
}
```


#### 1-3.こんな感じでdataフォルダの中に、outというフォルダが生成され、連番画像が書き出されます。</b>
![スクリーンショット 2016-05-11 23.14.26.png](https://qiita-image-store.s3.amazonaws.com/0/104234/a9f26c15-58ca-233a-3b30-7d7c78cf4c00.png "スクリーンショット 2016-05-11 23.14.26.png")





### 2.ffmpegで統合
　ffmpegとは、オープンソースの動画/音声ファイルのエンコーダー&デコーダーです。多種多様なファイル形式やコーデックを扱える上、マルチプラットフォームの凄いヤツです。まずは、ffmpegを手に入れましょう。
　
#### 2-1.ffmpegをインストール
ターミナルから、homebrewでffmpegをインストールします。

```
brew install ffmpeg
```

#### 2-2.ffmpegで統合
　これで、ffmpegが使用可能になったので、ターミナルで連番があるディレクトリまで移動して、連番画像を統合します。書き出し設定は、コーデックH.264、拡張子mov、30fpsです。処理中は、しばらくターミナルにコマンドがダーっと流れますので、コーヒーでも飲みながら待つと良いでしょう。連番画像名や書き出しファイル名やフレームレートは適宜変えてくださいね。（mbaだと60fpsちょっときつかった。。。。）

* <b>-r 30</b>:フレームレートを指定
* <b>-i "out_%05d.tif"</b>：インポートする連番ファイル名を指定
* <b>-vcodec libx264</b>:コーデックをh.264に指定
* <b>-pix_fmt yuv420p</b>:エンコーダーに渡すピクセルフォーマットを指定
* <b>out.mov</b>：最終的に書き出すファイル名を指定

```
ffmpeg -i "out_%05d.tif" -r 30 -vcodec libx264 -pix_fmt yuv420p out.mov
```
RDS(mysql) general_log をLambdaを用いてS3に保存する方法

# general_log を定期的にS3へ保管できると便利
RDSでは、パラメータグループに次の設定を追加するだけで general_log がFILEに保管され、 RDS API経由で取得できるので、たいへん便利です。

- general_log = 1
- log_output = FILE

ただし、1時間単位で general_log はローテーションされ、1日以上経ったログは消されてしまいます。このため、ログを長期保管するためには手動またはスクリプト等にて定期的にログを保管する必要がありました。

# Lambda を用いて、S3 上ログを簡単に保管
EC2インスタンス等を新たに構築せずログを定期的に保管する方法としては、Lambda Function を用いた実装が、コスト・運用の観点でお勧めです。

既に、すぐに使える Lambda Function が github 上にありましたので、次にまとめさせていただきます。

- [AWS Lambda Function to copy MySQL Query Logs to S3](https://github.com/ryanholland/rdslogs_to_s3)

# 使い方
1. githubのREADMEドキュメントに従い、S3のbucketにアクセスする権限を、Lambda Functionの実行に用いるIAMロールに追加します。
2. rds_mysql_to_s3.py のコードをインラインエディタにてコピー・ペーストします。または、zipファイル化したアーカイブファイルをアップロードします。
3. Lambda Function の動作テストを実施します。

動作テストに用いるパラメータは、次の内容になります。

````json
{
  "BucketName": "[BucketName]",
  "S3BucketPrefix": "[Prefix to use within the specified bucket]/",
  "RDSInstanceName": "[RDS DB Instance Name]",
  "LogNamePrefix" : "general/mysql-general",
  "lastRecievedFile" : "lastWrittenMarker",
  "Region"  :"[RegionName]"
}
````

動作テストに成功すれば、rds_mysql_to_s3.py 内の下記コードを変更し、パラメータをコード内に埋め込みます。Event source を用いて定期的に Lambda Function を実行する場合、パラメータを指定することができないため、コード内に変数としてパラメータをあらかじめ設定しておく必要があります。
汎用性を高めるためには、パラメータについてはS3のバケットに記載するなど、別途工夫をすると良いかもしれません。

```
S3BCUKET='[BucketName]'
S3PREFIX='[Prefix to use within the specified bucket]/'
RDSINSANCE='[RDS DB Instance Name]'
LOGNAME='general/mysql-general'
LASTRECIEVED='lastWrittenMarker'
REGION='[RegionName]'
```
【Unity5】変数の値をSceneビュー上にInspector風に表示させるエディター拡張

※この記事のUnityのバージョンは5.3.2p4です

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/f1f93507-7715-a749-c10f-f0aa3f0569a3.png)


# はじめに
<a href = "http://klabgames.tech.blog.jp.klab.com/archives/1047665593.html"> KLabGames Tech Blog - Unity なんでもインスペクタに表示していくやつ  </a>

上記ページのエディター拡張が素晴らしかったので、これを参考にSceneビュー上で変数が確認できるよう
にするエディター拡張を作ってみました.

<a href = "https://github.com/rngtm/debugging-inspect-window">サンプルプロジェクト</a>

# ソースコード 
以下のスクリプトをプロジェクトに配置すればOK <a href = "https://github.com/rngtm/debugging-inspect-window/blob/master/Assets/Scripts/DebuggingSceneWindow.cs">
DebuggingSceneWindow.cs </a>

# 使い方
 下記のように```[Inspectable]```を記述するとウィンドウに変数とその中身が表示されます.

```TestComponent.cs
using UnityEngine;
using System.Collections;

[Inspectable]
public class TestComponent : MonoBehaviour
{
  [Inspectable]
  int x = 100;

  [Inspectable]
  Vector2 vector2;

  [Inspectable]
  Vector3 Position { get { return this.transform.position; } }
}
```

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/d6556e41-09a2-6d71-6201-23dd0922621e.png)


# 参考
 KLabGames Tech Blog - Unity なんでもインスペクタに表示していくやつ
http://klabgames.tech.blog.jp.klab.com/archives/1047665593.html
Swiftの変数定義あれこれ

## はじめに
Swiftの変数定義はいくつかパターンがあって忘れてしまうのでメモ。
基本部分は忘れることは無いのだが、一応書いておく。

## 基本1
基本的な定義は以下になります。

```swift
var value:Int
```

JavaやRubyなどと同じ普通の定義。
この定義をした場合は`init`で値を設定するか、使用するまでに値を設定する必要がある。

```swift
class Hoge {
    var value:Int

    init() {
        self.value = 1
    }
}
```

もしくは

```swift
var value:Int

if randBool() {
    value = 1
} else {
    value = 2
}

print("\(value)")
```

※`randBool`はランダムにBoolを返すメソッドとする。

## 基本2
すでに初期値が決まっている場合

```swift
var value:Int = 1
```

あらかじめ値を設定することで初期化ロジックを省くことができる。
`Swift`は型推論型を採用しているので、明らかに`Int`とわかっている場合は以下のようにも書ける。

```swift
var value = 1
```

注意点としては`Float`型の扱いである。
`Float`型と`CGFloat`は別の型であり、以下のように定義すると`Float`型になるので`CGPoint`などを使う場合は注意が必要。

```swift
var value = 0.5
```

`CGFloat`を使う場合は型を書く必要がある。

```swift
var value:CGFloat = 0.5
```

## 基本3
定数として値を変えたく無い場合

```swift
let value = 1
```

`var`を`let`に変えるだけである。

```swift
let value = 1
value = 2  // NG!
```

注意点としては、`let`はポインタアドレスなどを固定するだけなので以下のようなコードは正常に動作する。

```swift
let hoge = Hoge()
hoge.value = 1 // OK!
```

`Array`や`Dictionary`は`let`で定義すると値を変えれないので、これもまた注意。

```swift
let values = [1,2,3]
values.append(4) // NG!
```

## 基本4
`static`として定義する場合
他の言語と相違無いので説明は割愛。

```swift
static let value = 1
```

## 基本5
変数に値は入っているが、初期化のタイミングでは値を入れれない場合

```swift
var value:Int
```

だと、初期化時にデータを入れなければならない。

```swift
var value:Int!
```

その場合は`!`をつけることで解決する。
主にxibとの繋ぎこみで使ったりする。

```swift
@IBOutlet weak var valueView:UIView!
```

## 基本6
変数に値が入っているかどうかわからない場合

```swift
var value:Int?
```

このようにすることで`Optional`を使用できる。
プログラマーが`nil`チェックをしないで変数を使ったりできないようになる。

```swift
if let value = self.value {
    print("\(value)")
}
```

このような使い方ができる。
`flatMap`などで値を取り出したりもできるが、横道にそれるのでここでは割愛。
この辺は結構奥深くて面白いです。

※余談ですが、`let`の定数では`!`や`?`を使う事は無いと思います。（一応使えますが・・・無意味なきがする。）

## 基本7
基本というと結構難しいけれど、オーナーシップを持ちたく無い変数を定義する場合

```swift
weak var hoge:Hoge?
```

このように定義することで強参照を防げます。
[weak（弱参照)の使うタイミング(特にクロージャの中)について説明してみる](http://qiita.com/syou007/items/51f2342850e408739cc9)に説明を書いてますので、良ければみてください。

なお、プリミティブ型っぽい型には使えません。（無意味なので）

## よく使うけど忘れる定義
ここからが本題。
僕がよく使うけど、忘れる定義の仕方を書きます。
応用というほどでは無いですし、全部を網羅しているわけでもありません。

## 応用1
変数の`setter/getter`を作りたいとき

```swift
var value:Int? {
    get {
        // 1足してデータを返したい。
        return self.value + 1
    }
    set {
        // 1引いてデータを設定したい。（setの後に`newValue`の変数名を定義することもできます。僕はそのまま使っちゃいますが。）
        self.value = newValue + 1
    }
}
```

## 応用2
変数の`getter`だけ作りたい

```swift
var value:Int? {
    return self.value
}
```

簡略化して書けます。

## 応用3
値が設定された後にフックして別の処理をしたい場合

```swift
var value:Int = 1 {
    didSet {
        // 再描画させるなど...
        self.render()
    }
}
```

この他にもいろいろ便利なフック処理があります。
僕は`didSet`を多用するので、これだけ紹介します。

## 応用4
いつも忘れるやつ。
初期値を設定して返したいが、使われない場合は初期化をしたく無い場合

```swift
lazy var hoge:Hoge = {
    // Hoge()がとても重い処理だったり、インスタンスが作成されてから処理をしたい場合
    // この処理は一度しか呼び出されない。
    return Hoge()
} ()
```

`=`と最後の`()`がミソ。
`self.view`のレンダリングが終わった`viewWillAppear`以降で使いたい時に便利。
`self.frame`を使ってViewを作成したいときとか

```swift
lazy var hogeView:HogeView = {
    let hoge = HogeView(frame: self.freame)
    hoge.delegate = self
    return hoge
}()

// 上記のように定義していると以下のように使えてコードがスマートになります。
self.view.addChild(self.hogeView)
```

以上、最後だけよく忘れてしまいます。
AWS CLI を Mac にインストールする時のエラー回避

## 前提
- Mac のバージョンは 10.11.4

```
$ sw_vers

ProductName:	Mac OS X
ProductVersion:	10.11.4
BuildVersion:	15E65
```
- pip インストール済み `sudo easy_install pip`

## ログ
```
$ sudo pip install awscli

DEPRECATION: Uninstalling a distutils installed project (six) has
been deprecated and will be removed in a future version. This is
due to the fact that uninstalling a distutils project will only
partially uninstall the project.
    Uninstalling six-1.4.1:
...
```

## 回避法
- 下記のようにオプションを付ければ回避できる

```
sudo pip install awscli --upgrade --ignore-installed six
```
- 参考: https://github.com/pypa/pip/issues/3165
REPL 駆動開発をしていると困っちゃうことがあるアレコレ



Clojure でアプリケーション開発を行なう場合、 REPL を酷使するわけなんですがその中でもハマりやすい問題が幾つかあることに最近同僚を見ていて気付いたので書いておきます。

マルチメソッドが再定義できない
------------------------------

例えば次のようなマルチメソッドを定義していたとします。

``` clojure
(defmulti greeting (fn [time name] time))

(defmethod greeting :morning
  [_ name]
  (str "おはよう、" name))

(defmethod greeting :afternoon
  [_ name]
  (str "こんにちわ、" name))

(greeting :morning "あやぴー") ;;=> "おはよう、あやぴー"
(greeting :afternoon "あやぴー") ;;=> "こんにちわ、あやぴー"
```

シンプルですね。 ですが、ある気紛れで 2 引数うけとっていたのをマップだけを受け取るようにするために次のように変更したとします。

``` clojure
(defmulti greeting :time)

(defmethod greeting :morning
  [{name :name}]
  (str "おはよう、" name))

(defmethod greeting :afternoon
  [{name :name}]
  (str "こんにちわ、" name))

(greeting {:time :morning :name "あやぴー"}) ;;=> clojure.lang.ArityException
(greeting {:time :afternoon :name "あやぴー"}) ;;=> clojure.lang.ArityException
```

既に `(defmulti greeting (fn [time name] time))` を評価していた後に、 REPL で `(defmulti greeting :time)` を評価すると `nil` が返却されると思います。

そして、実際に `defmethod` などを評価しても問題ないですが、 `greeting` は引数違いというエラーが出て評価できません。

このケースは何が問題なのか気付き難いのですが、一度 `greeting` をこのネームスペースから消してあげることで解決できます。こういうときは `(ns-unmap *ns* 'greeting)` とします。

`require` して別名を付けていたものを名前を変更して同じ別名をつけたらエラーが出る
--------------------------------------------------------------------------------

ちょっと日本語で説明するのが難しいのですが、以下のようなネームスペースがあったとします。

``` clojure
(ns foo.bar
  (:require [clojure.string :as str]))
```

`str` という別名を付けて `clojure.string` を `require` しています。これを評価した後に次のように書き換えて評価します。

``` clojure
(ns foo.bar
  (:require [clojure.java.io :as str]))
;; => java.lang.IllegalStateException
;;      Alias str already exists in namespace foo.bar, aliasing
;;      clojure.string
```

`str` という別名はそのままで `clojure.java.io` を `require` するようにしました( `clojure.java.io` に `str` という別名を付けないだろう、っていう突っ込みはなしで)。

このとき例外が吐かれますが、これは分かりやすいですね。単純にその別名は既にこのネームスペースで使われているよ、というだけの話なので `(ns-unalias *ns* 'str)` としてあげればよいです。

まとめ
------

Clojure で開発を行なっていると極力 REPL を再起動したくないと思いますが、このように単純に書き直して再評価すればいいというわけではない場合知っていれば対処できますが、知らないと時間を取られてしまいますし REPL を再起動してしまうと思うので転ばぬ先の杖として知っておいてもらえると良いのかなと思います。

他にも思いついたら加筆すると思います。

余談
----

Emacs(Cider) では `C-c C-u(cider-undef)` を使うことでどちらのケースでも対応することができます。なので Emacs を使いましょう。
MacのダッシュボードにWebクリップを設定して雨雲が近づいてきたら退社する


# TL;DR
MacのDashboardには『Webクリップ』を設定できる。
どのアプリケーションを使っていても`F12`キーを押すとだけで見れるので便利。

# 設定
1. Safariでクリップしたいページを表示
2. ファイル→Dashboardで開く
3. クリップしたいエリアを選択して右上の「追加」をクリック
![スクリーンショット 2016-05-12 19.03.14.png](https://qiita-image-store.s3.amazonaws.com/0/11454/c5d1a078-01f3-b525-b2cd-143908d303ac.png "スクリーンショット 2016-05-12 19.03.14.png")

![スクリーンショット 2016-05-12 19.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/11454/2e76bcee-04da-43d3-0cfd-a2420e3d6c1b.png "スクリーンショット 2016-05-12 19.05.24.png")

# こんな感じ
![スクリーンショット 2016-05-09 16.19.57.png](https://qiita-image-store.s3.amazonaws.com/0/11454/6ce2e5e4-58fa-aa31-2988-5054de3761a2.png "スクリーンショット 2016-05-09 16.19.57.png")

# その他
- ログインが必要なページでもSafariでログインしていれば表示できる。
- 更新される間隔は謎だけど、`Cmd`+`R`で派手なアニメーションと共に更新できる。
- 雨が近づいてきたら帰ろう。
Git Bashのプロンプトから不要な箇所を消してスッキリさせる

Gitの操作はCLIで行うのが好みなので、Windows環境ではGit Bash を使っている。
Git操作以外でもBashが使えると色々捗るのだが、`MINGW64`の表示がウザいとか、ユーザ@ホスト名の表示はローカルの決まったユーザでしか操作しないのでいらないとか不満もあった。

![20160512_prompt_mozaic.png](https://qiita-image-store.s3.amazonaws.com/0/387/dc5ef20d-67f3-caa8-193b-0991b8686355.png)

`C:\Program Files\Git\etc\profile.d\git-prompt.sh` の該当箇所をコメントアウトする消せるようなのでやってみた。
3行目～6行目をコメントアウトする。

```sh:git-prompt.sh
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title
PS1="$PS1"'\n'                 # new line
#PS1="$PS1"'\[\033[32m\]'       # change to green
#PS1="$PS1"'\u@\h '             # user@host<space>
#PS1="$PS1"'\[\033[35m\]'       # change to purple
#PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
PS1="$PS1"'\w'                 # current working directory
if test -z "$WINELOADERNOEXEC"
then
	GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
	COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
	COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
	COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
	if test -f "$COMPLETION_PATH/git-prompt.sh"
	then
		. "$COMPLETION_PATH/git-completion.bash"
		. "$COMPLETION_PATH/git-prompt.sh"
		PS1="$PS1"'\[\033[36m\]'  # change color to cyan
		PS1="$PS1"'`__git_ps1`'   # bash function
	fi
fi
PS1="$PS1"'\[\033[0m\]'        # change color
PS1="$PS1"'\n'                 # new line
PS1="$PS1"'$ '                 # prompt: always $
```

かなりスッキリした。空いたスペースに作業フォルダの状態とか表示するようにすると更に良さげ。

![20160512_after_prompt.png](https://qiita-image-store.s3.amazonaws.com/0/387/698030cf-911a-2d9f-211f-793d0163f35f.png)
UIImageOrientationをNSStringに変換するメソッドを作った

デバッグで役立つこともあろうかと。非常に原始的。
UIImageOrientationはUIImageオブジェクトのメソッドで画像撮影時のデバイスの向きを表している。Objective-Cでログ出力するためには以下の様な変換するメソッドが必要らしい。
UIImageOrientationだけでなく、他のenum型をログ出力したい場合も同様にして文字列に変換する必要がありそう。

## メソッド定義
```objc
//for debug
- (NSString*) convertToString:(UIImageOrientation) o {
    NSString *result = nil;
    
    switch(o) {
        case UIImageOrientationUp:
            result = @"UIImageOrientationUp";
            break;
        case UIImageOrientationDown:
            result = @"UIImageOrientationDown";
            break;
        case UIImageOrientationLeft:
            result = @"UIImageOrientationLeft";
            break;
        case UIImageOrientationRight:
            result = @"UIImageOrientationRight";
            break;
        case UIImageOrientationUpMirrored:
            result = @"UIImageOrientationUpMirrored";
            break;
        case UIImageOrientationDownMirrored:
            result = @"UIImageOrientationDownMirrored";
            break;
        case UIImageOrientationLeftMirrored:
            result = @"UIImageOrientationLeftMirrored";
            break;
        case UIImageOrientationRightMirrored:
            result = @"UIImageOrientationRightMirrored";
            break;
        default:
            result = @"unknown";
    }
    
    return result;
}
```
##使い方
```objc
//uiimageはUIImageのインスタンス
NSLog(@"%@",[self convertToString:uiimage.imageOrientation]);
```
モーダルでクリックイベントが取得できないときのメモ

モーダルのclickイベントが効かない。悲しい。

```
$('p').click(function(){
     hoge;
});
```

これでは、だめで...


```
$(document).on('click','p',function(){
     hoge;
});
```

上のようにしたらいけた。これは、click()はページがロードされたときにある要素にしか効かないらしい。モーダルとかで追加される要素にはclickは効かない。onを使えばいける。このへんのタイミング、むずかしい。ちゃんと理解できてない。
simplecovで生成されるhtmlレポートからcsvを作る開発用rake taskの作成


## 経緯
coverage率を追って、どれだけの変化があったか等を記録していくのに、htmlではやりづらさがかなりあった。

csvに出力したりする方法を探してみたものの、思うようなものが発見できなかったので自分で実装してみた。

コードは汚いし、本当ならgemのメソッドのどこかにhookして、htmlでなく、ちゃんとデータからcsvを作成できるようにすべきだが、時間がなかったので、このようなコーディングをした。


誰かもっといい方法を知っていたら教えて欲しい！！

## 使い方

```
1. $> bundle exec rake dev:make_csv_from_coverage_html:create

2. コマンド入力を要求されるので、生成元になるhtmlのpathを入力

3. 保存先と保存ファイル名をコマンド入力

4. DONE
```

## ソースコード

```make_csv.rb
namespace :dev do
  namespace :make_csv_from_coverage_html do
    desc "make csv from coverage html file"
    task :create => :environment do
    
      # 元になるhtmlファイルをpathで指定
      # コマンド入力で取ってこれるようにしてある
      print("Input coverage html file path : ")
      open_file_path = STDIN.gets
      open_file_path = open_file_path.chomp
      coverage_file = open("#{open_file_path}")

      header = []
      row_data = []
      coverage_file.each do |line|
        if line.include?("table class=\"file_list\"")
          while l = coverage_file.gets
            if l.include?('<th>')
              header << l.strip.delete('<th>').delete('</th>')
            elsif l.include?('</tr>')
              break
            end
          end
        end

        if line.include?('<tr>')
          row = []
          while l = coverage_file.gets
            if l.include?('<td')
              l = l.strip

              if l.include?('href')
                # file名
                match_str = l.match('title')
                post_str = match_str.post_match
                match_str2 = post_str.match("\">")
                post_str2 = match_str2.post_match
                match_str3 = post_str2.match('</a></td>')
                row << match_str3.pre_match
              elsif l.include?("\">")
                # coverage %
                match_str = l.match("\">")
                post_str = match_str.post_match
                row << post_str.delete('</td>')
              else
                # others
                row << l.strip.delete('<td>').delete('</td>')
              end
            end

            if l.include?('</tr>')
              break
            end
          end
          row_data << row
        end

        if line.include?('</table>')
          break
        end
      end

      csv_data = CSV.generate do |csv|
        csv << header
        row_data.each do |row|
          csv << row
        end
      end

      # 保存先もコマンド入力で自分で指定できるようにした
      print("\n Input coverage csv file path after saving\n For Example coverage/csv/coverage_#{Date.today}.csv \n")
      save_file_path = STDIN.gets
      save_file_path = save_file_path.chomp
      File.open("#{save_file_path}", "w") do |file|
        file.write(csv_data)
      end
    end
  end
end

```
vagrant statusを打つとinaccessibleと表示される時の対処法


##事象

最近僕が会社で使っているPCが頻繁にフリーズして、開発環境を1から立ち上げ直さないといけない事案が起きています。
まずは新しくて高スペックなPCを社長に請求して……違う

そんな事情は置いておいて
vagrantの状態がinaccessibleになった場合の対処法を書いていきます。
※PCがフリーズして再起動した時などにたまになります

自分のメモ程度で全く詳しく書いていませんのでよろしくお願いします(何を


##解消

1. まずはOracle VM VirtualBoxマネージャーを起動します
2. アイコンがクエスチョンマークになっているVMを右クリック
3. 除去を選択
4. いつも`vagrant up`しているディレクトリでいつも通り`vagrant up`
5. 立ち上がるはず

だいぶ雑ですね
元通りになるからいいんです


##参考

[vagrant upしたらまたエラーが出たので解消する]("http://motomichi-works.hatenablog.com/entry/2015/01/21/113452" vagrant upしたらまたエラーが出たので解消する)
Apple Watch対応アプリじゃないのに、Apple Watch対応アプリになっていた件

先日、知り合いがApple Watchを買ったと聞いて、Apple Watchに対応したアプリの話をしていました。

その会話の中で、

> **「お宅の会社から出ているアプリ、Apple Watch対応って書いてあるけど、Apple Watchにインストールできないんだけど」**

と言われて、そのアプリの名前を聞いたら、Apple Watch対応アプリではないアプリでした。

そのアプリはApple Watchが発売される頃にプロトタイプとして開発しましたが、Appleからリジェクトされたため、Apple Watch対応については見送ることにした過去がありました。

そのアプリをAppStoreで見てみると、こんな感じでApple Watch対応になっているではないか！

<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/40009/e65d7f67-9c0b-1850-02fa-7eba59960019.jpeg">

（間違えてリリース版にApple Watchのコードが混ざってしまった！？ いや、もし混ざったとしてもリジェクトされた過去があるから、リリースはされないはず…）

実はこれはiTunes ConnectのApple Watchの箇所にスクリーンショットを登録したままのものが残っていたというオチでした。

<img width="75%" src="https://qiita-image-store.s3.amazonaws.com/0/40009/f1f2ff71-c062-29fd-e233-dfe6daff23c2.jpeg">

ちなみにApple Watch対応アプリであれば、**Apple Watch Appが有ります**とアプリのアイコンの下あたりに表示されます。

<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/40009/7074f48e-b8f8-cac3-ba43-137a9246479f.png">

きちんと見れば対応はしていないとわかりますが、Apple Watchに対応していると間違えてしまう（実際に自分は対応していると思ってしまった…）ため、即刻修正しました。

<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/40009/68bd7787-512a-bd1d-75ca-05e22a36fc34.png">

無事に修正。
しかし、このスクリーンショットのためにアップデート申請するのも手間がかかる…自分が悪いんだけれども。

ということで、**アプリがApple Watchに対応していなくても、Apple Watchのスクリーンショットは登録できちゃうから気をつけようね**、というお話でした。
みんな気をつけようね！！
PHPメール送信ライブラリ SwiftMailer の日本用カスタマイズ


## 1. RFCに従わないキャリアメールにメールを送れるように

デフォルトだと、foo..bar@docomo のように . が連続したり foo.@docomo のように . で終わるユーザー名だとエラーになり送れません。
それを回避する方法

参考
https://teratail.com/questions/28363


## 2. エンコードを iso-2022-jp にする

デフォルトだとutf-8になりますが、どうしてもiso-2022-jp でないと受け取れないクライアント向けに iso-2022-jp にエンコードする方法

参考
http://uzulla.hateblo.jp/entry/2015/03/20/235252


## サンプル

別途 Sample/Email/LooseMimeGrammar.php を作成しておく。


```
<?php

use Sample\Email\LooseMimeGrammar;

\Swift::init(
        function () {
            // 日本語に関する初期設定 (ISO 2022)
            \Swift_DependencyContainer::getInstance()
                ->register('mime.qpheaderencoder')
                ->asAliasOf('mime.base64headerencoder');
            \Swift_Preferences::getInstance()->setCharset('iso-2022-jp');

            // RFC違反のアドレスにメール送る設定
            // @link https://teratail.com/questions/28363
            \Swift_DependencyContainer::getInstance()
                ->register('mime.grammar')
                ->asSharedInstanceOf(LooseMimeGrammar::class);
        }
    );


// SMTP サーバーとの接続設定
/** @var \Swift_SmtpTransport $transport */
$transport = \Swift_SmtpTransport::newInstance($host, $port);

/** @var \Swift_Mailer $mailer */
$mailer    = \Swift_Mailer::newInstance($transport);

// メールの作成
/** @var \Swift_Message $message */
$message = \Swift_Message::newInstance()
    ->setCharset('iso-2022-jp')
    ->setEncoder(\Swift_Encoding::get7BitEncoding())
    ->setSubject($subject)
    ->setFrom($from)
    ->setTo($to)
    ->setBody($body);

// 送信
$result = $mailer->send($message);

```
自分のserver上のGitレポジトリを作ってそこにPushする

# 目的

GithubやBitbucketを使わずに、Remote ServerとLocalのみで、GitRepositoryを作って管理してみる。

#server上ですること

```bash
mkdir test.git
cd test.git
git init --bare
```
注意：--bareとしないと、LocalからPushできないので、注意！

# Local

```.ssh/confg
Host server
    Hostname <server ip>/<host>
    User user
```
以下のコマンドでServerにログインできるのを前提とする

```bash
ssh server
```

ローカルのGitRepositoryをPushする

```
git add origin server:path/to/test.git
git push -u origin master
```

もしも同じマシン上にGitRepoのRemoteを作りたい場合には、以下のようにサーバホストを書かなければよい。
```
git remote add origin /path/to/test.git
```

完成！

## 他のマシーンからCloneする

`ssh server`で入れる他のマシーンからCloneするには、

```bash
git clone server:path/to/test.git
```
とすれば、そのDirectoryにtest/という


##参考にしたページ
http://keisanbutsuriya.hateblo.jp/entry/2015/02/01/152550




# server上で別のフォルダでこれをCloneする

以下のコマンドでClone完了

```bash
git clone /path/to/test.git
```
current directoryに Repoができる！

これで、複数のローカル（元々のローカルと新しくCloneしたローカル）とサーバ上どこでも、コードのバージョン管理ができるようになった。

## 参考にしたページ

http://stackoverflow.com/questions/4941090/cloning-git-repository-locally
Golang で過去の遺物的(cp932)DLLを利用する

# 狙い
古いDLLは文字コードにCP932を使ってるものがあるが
web上に見受けられる文献にはこれらの遺物を利用する方法が見つからないのでここに記述する。

# コード

```go:call_msgbox.go
package main

import (
	"syscall"
	"unsafe"

	"golang.org/x/text/encoding/japanese"
	"golang.org/x/text/transform"
)

func cp932(str string) string {
	r, _, err := transform.String(japanese.ShiftJIS.NewEncoder(), str)
	if err != nil {
		panic(err)
	}
	return r
}
func cp932ptr(str string) *byte {
	return syscall.StringBytePtr(cp932(str))
}

func main() {
	user32 := syscall.MustLoadDLL("user32.dll")
	defer user32.Release()
	MessageBoxA := user32.MustFindProc("MessageBoxA")
	MessageBoxW := user32.MustFindProc("MessageBoxW")

	//wide char = utf16le
	MessageBoxW.Call(0,
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("日本語の表示"))),
		uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("UTF16LEの場合"))),
		0)

	// cp932
	MessageBoxA.Call(0,
		uintptr(unsafe.Pointer(cp932ptr("日本語の表示"))),
		uintptr(unsafe.Pointer(cp932ptr("CP932の場合"))),
		0)

	// UTF8もANSI互換なので英数字のみならば
	MessageBoxA.Call(0,
		uintptr(unsafe.Pointer(syscall.StringBytePtr("ascii only"))),
		uintptr(unsafe.Pointer(syscall.StringBytePtr("utf8 is ANSI"))),
		0)
}
```


# 反省点
あくまでCP932(いわゆるSJIS)用である。
ユーザーの入力をOSのANSI関数に渡す場合にはWideCharToMultiByteを利用して
UTF16へ変換 -> WideCharToMultiByte -> CP_ACP へ変換してやるべき

# 一言
uintptr(unsafe.Pointer(
が非常に冗長に感じる
ubuntuにプロキシサーバーを構築

# 背景
* 社内に、selenium webdriver+capybaraでテスト環境構築するが、capybara seleniumは認証付きproxyを超えられない

# 手順
### squid3のインストール

```
$ sudo apt-get install squid3
```

* 確認

```
$ squid3 -v
Squid Cache: Version 3.3.8
```

### 認証付きproxyを設定

```
sudo vi /etc/squid3/squid.conf
```

* 以下のコードを追加

```
http_port 8080
cache_peer (proxyのhostname) parent 8080 7 no-query login=(proxyのユーザー名):(proxyのパスワード)
never_direct allow all
```

* 再起動

```
$ sudo service squid3 restart
squid3 stop/waiting
squid3 start/running, process 13066

```


# 確認

* firefoxに、プロキシを設定する
    * 127.0.0.1:8080

* firefoxから、www.google.co.jpへアクセスする
    * 社内プロキシ認証なしで、アクセスできることを確認した

# 参照

* https://www.rosehosting.com/blog/install-squid-proxy-server-on-ubuntu-14-04/
* https://sandalov.org/blog/1711/
開発合宿ファシリテーション方法を共有する（準備編）

そろそろ10回以上開発合宿をしているので、ノウハウをまとめる。
今回は準備編です。言い出しっぺ（幹事）が発起してから準備完了まで。

# ポイント
+ なるべく言い出しっぺ（幹事係）が苦労しない
+ 難しいファシリテーションを必要としない
    + 基本は投票で決める。係は必要に応じて独断で決めてよい

# 係がやること

##幹事係がすること(開催ひと月半ぐらい前)
 + ①日程を決める
      + 幹事係が参加できる日程を優先して何案か出し、（facebookなどで）投票を行い最多得票の日程とする。割れたら幹事の好きな方にしたり好きにしていい。

>例
>![image](https://qiita-image-store.s3.amazonaws.com/0/119514/ef890f28-77bc-02e7-ee89-3798fc500742.png)

  + ②係を決める
      + （facebookなどで）係を挙げて立候補を募る。皆なるべく自分のやっていないかかりをやるように空気を読んで。決まらない時は幹事係が指名。係は、宿・会計・お菓子・レク・備品・車・アイデア出しファシリ・当日ファシリ・振り返りファシリ・次回幹事あたりから必要な物をチョイス。

>例
>![image](https://qiita-image-store.s3.amazonaws.com/0/119514/e81d1ae0-806e-043a-0b38-7345f24964f1.png)

  + ③どこに行くか決める。
    +  宿係に振ってもいい。（facebookなどで）行きたい観光地を何案か挙げ投票。

>例
>![image](https://qiita-image-store.s3.amazonaws.com/0/119514/54a94862-f68a-9430-7e0d-c94136f41c84.png)


## 宿係がすること（開催ひと月前)
  + ①宿を決める
    +  宿代一泊１万円前後でネットが使えて開発しやすそうな宿を何案か挙げる。ネットの有無、値段、夕食朝食の有無、会議室の有無、部屋の広さを調査してfacebookなどで投票して決める。
  + ②決まった宿を予約する。１ヶ月を切っていると大人数で泊まるのは厳しいので宿係の独断で泊まれる宿を選んで良い。会議室を使うならばその予約も。
  + ③決済方法を決める。
  + ④当日のチェックインの時間や誰がその時間にチェックインできるかを確認してアナウンス。適宜、宿への行き方などのアナウンスも

>例
>![image](https://qiita-image-store.s3.amazonaws.com/0/119514/3af0bbae-64cf-ab34-6a1c-fdfc739bb888.png)


## アイデア出しファシリ係がすること（開催ひと月前）
  + ①アイデアを列挙できる掲示板的なものを用意して、期日までにアイデアをN案書いてもらう

>例
>![image](https://qiita-image-store.s3.amazonaws.com/0/119514/097f74ff-60af-3f23-669d-abec27df7d28.png)


  + ②顔を合わせてのアイデア発想会を実施。アイデアを出した人に説明してもらいながらすすめる。
  + ③投票でアイデアを絞る。アイデアが出揃ったら、投票でチームが適切な大きさ（マックス４人。３人がベスト？）になるように絞る。
  + ④チーム結成。適当に空気を読んで同じアイデアをやりたい人が同じチームになるようにチームを決める。ある程度、技術レベルとか今まで組んだことがあるかとかを考慮したりする。

# チーム分け後にすること

## チームですること
  + ①アイデアの具体化。ここでアイデアだしの時と違うアイデアに変わっても良い
  + ②開発準備。環境やデータや事前の調べ物やプロトを作っておく等
  + ③行ってからあたふたしても困るので、実際開発し始めてしまったほうが良い


# 次回
 合宿中編に続く(今後書く）
[Arch Linux] LaTeX環境を整える

# はじめに

Arch Linuxでは意外と簡単にLaTeX環境を構築できることがわかったので、<a href="https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Linux%2FArch%20Linux">TeX Wikiの該当ページ</a>を見ながら進めていきます。

# インストール

公式リポジトリにあるので以下のコマンドを実行すれば一発でインストールできます。この際、一応EPS画像用にghostscriptを、PDFプレビュー用にEvinceを、PDFプレビューで日本語が表示されない問題を解決するためにpoppler-dataをそれぞれ導入しておきます。

```bash
$ sudo pacman -S texlive-langjapanese texlive-most ghostscript evince poppler-data
```

# 動作確認

適当なファイルを作ってコンパイルするテストをします

```latex
\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard,a4paper,12pt]{bxjsarticle}

\begin{document}
\section{にほんご}
日本語もOK
\end{document}
```

コンパイルとプレビューは暫定的に以下のコマンドで。今回はuplatex環境を前提としています。

```bash
$ uplatex test.tex
$ dvipdfmx test
$ xdg-open test.pdf
```

# latexmkの導入

いちいちコンパイルしてプレビューまでするのも面倒なので自動化します。まずは以下のような設定ファイル(~/.latexmkrc)を作ってしまいましょう。今回は<a href="http://konn-san.com/prog/why-not-latexmk.html">こちらのサイト</a>を参考に、Linux環境向けにアレンジしてみました。

```pl
#!/usr/bin/env perl
$latex            = 'uplatex -shell-escape -synctex=1 -halt-on-error';
$latex_silent     = 'uplatex -shell-escape -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode     = 3; # generates pdf via dvipdfmx

# Prevent latexmk from removing PDF after typeset.
# This enables Skim to chase the update in PDF automatically.
$pvc_view_file_via_temporary = 0;

# Use Skim as a previewer
$pdf_previewer    = "xdg-open";
```

とりあえずpdfにしてもらいたいときは以下のようにすればOKです。

```bash
$ latexmk test.tex
```

エディタでの変更を監視しつつ、自動でプレビューも更新してもらいたい場合は以下のようにしましょう。

```bash
$ latexmk -pvc test.tex
```

これでだいぶ快適になりました。
A valid provisioning profile for this executable was found のエラーが出た時

A valid provisioning profile for this executable was found のエラーが出た時
そのProjectのBUild Settings でProvisioning ProfileをAutomaticにすると良い様？
![provisoningprofile01.jpg](https://qiita-image-store.s3.amazonaws.com/0/101462/2bd6aea0-fcab-3eab-ce3d-eac381eec1b8.jpeg)
Python リスト内で文字数が最小の要素を特定するには？

a = ['apple', 'beer', 'compsci']
print(min(a))

apple

タイトル通りリストの中からアルファベットの最小ではなく文字数の最小である'beer'をプリントしたいのですがどうすればいいんでしょうか？
Use Time.zone.now instead of Time.now

http://rails-bestpractices.com/posts/2014/10/22/use-time-zone-now-instead-of-time-now/

rails有个更方便的方法
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/calculations.rb#L36

https://makandracards.com/makandra/15049-don-t-assign-time-values-to-date-attributes
MQTTを動かして学ぶ

MQTTとはなんぞや、という自分が実際に動かしながら学んだ方法です。
オプション的（retain,qos等）なものは一切削いでシンプルに。
基本sampleコードをベースに、改造しながらMilkcocoaとの連携まで実施しました。

##MQTTとは
> MQTT(Message Queue Telemetry Transport)は1999年にIBM社と Eurotech社のメンバーにより考案されたプロトコルで、2014年8⽉現在 における最新のバージョンはMQTT3.1.1です。現在、コンピュータと通 信に関する標準化団体であるOASISによって、MQTTの標準化が進められています。 https://sango.shiguredo.jp/mqtt

* 軽量・省電⼒なプロトコル
* 低速・不安定なネットワークでの利⽤を想定
 
##sample code
まずは、mqttのサイトにもあるサンプルコードを手元で動かしてみる。
###sample.js
コードはこちら
[mqtt_samples/sample.js](https://github.com/papettoTV/mqtt_samples/blob/master/sample.js)


```
node sample.js
```
すると

```
Hello mqtt
```
こんなレスポンスが返ってきます。
これが、どういう状態か。図がこちら。
![スクリーンショット_2016-05-12_16_45_55.png](https://qiita-image-store.s3.amazonaws.com/0/1533/9a9b13a4-82ea-140e-2ae7-da2246403439.png "スクリーンショット_2016-05-12_16_45_55.png")

このように、自身(PC)がpubして自身(PC)でsubして（受けて）いるので、ちょっと分かりにくいです。
なので、この`sample.js`を少し改変します。

###publishとsubscribeでプログラムを分ける

publishとsubscribeでプログラムを分けてみました。

pub_test.js
https://github.com/papettoTV/mqtt_samples/blob/master/pub_test.js

sub_test.js
https://github.com/papettoTV/mqtt_samples/blob/master/sub_test.js

これらの実行はコツが必要で、先に`sub_test.js`を実行し、直後に別プロセスで`pub_test.js`を実行します。

```
node sub_test.js
```
これを実行すると、待ちの状態になります。
で、直後に別ターミナルで、

```
node pub_test.js
```
を叩くと、`sub_test.js`側に以下の様な出力がでます。

```
Hello mac
```
これの概要図がこちら
![スクリーンショット 2016-05-12 16.48.17.png](https://qiita-image-store.s3.amazonaws.com/0/1533/d70a26fe-6179-2b92-75e0-17332981ab3c.png "スクリーンショット 2016-05-12 16.48.17.png")
処理フローは
 * sub_test.jsを実行し、brokerにpresenceというトピックを登録
 * pub_test.jsで、presenceトピックに対して`Hello mac`という情報を投げる
 * brokerが、同トピックで待ってるsubscriber(sub_test.jsの実行者)に対して、`Hello mac`を投げる、という動きになります。

これで、publisher、subscriberの関係の理解が深まりました。
もっと現実的にするなら、このpubとsubを別端末で実施するといいかもしれません。

###brokerを変えてみる
sampleコード内で、以下の部分は、brokerサーバを指定しています。

```nod
var client  = mqtt.connect('mqtt://test.mosquitto.org');
```

このtest.mosquitto.orgはオープンソースなbrokerサーバですね。
なので、これを試しに別brokerサービスに変えてみます。

###Milkcocoa
Milkcocoaというリアルタイムなサービス向けBaaSがありますが、こちらはbrokerとしての機能も備えていますので、これに置き換えてみます。

それがこちら
[milkcocoa_pub_sample.js](https://github.com/papettoTV/mqtt_samples/blob/master/milkcocoa_pub_sample.js
)
コード内のapp_idはMilkcocoaに登録して取得したものを書きます。
publisher側のコードなので、`pub_test.js`と比べて、基本的には、`mqtt.connect()`内のパラメータが変わっただけです。

動作イメージはこちら
![スクリーンショット 2016-05-12 16.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/1533/9083c3b2-e611-b616-8d6f-b4bb2669b579.png "スクリーンショット 2016-05-12 16.53.07.png")

※subscribe側もsub_test.jsで、mqtt.connectを変えれば同じです。

結果は同じなので省略しますが、これで、publisher、subscriber、brokerの関係が理解できました。


##参考
社内で使った[資料](http://www.slideshare.net/YokotaEiji/mqtt-61926090)
Reactの公式チュートリアルでコメントを送信するとエラーになる

[Reactの公式チュートリアル](https://facebook.github.io/react/docs/tutorial-ja-JP.html)でのエラーについてです。

# 発生エラー

コメントを送信した時に以下のエラーが発生しました。

```
jquery.min.js:4 POST http://localhost:3000/comments.json 405 (Method Not Allowed)
comments.json error Method Not Allowed
```

問題はコンポーネントに渡す`url`でした。

```javascript
// エラー
ReactDOM.render(
  <CommentBox url="comments.json" pollInterval={2000} />,
  document.getElementById('content')
);
```

`server.rb`ではドキュメントルートが`public`に指定されているので、`comments.json`を問い合わせるとは`/public/commnts.json`を取得するということです。`/public/comment.json`が置いてあれば、表示に問題はなく送信だけエラーが出ます。

```javascript
// 正常
ReactDOM.render(
  <CommentBox url="/api/comments" pollInterval={2000} />,
  document.getElementById('content')
);
```

`server.rb`に合わせるなら`url`を`comments.json`から`/api/comments`に変更して、`server.rb`と同じディレクトリに`comments.json`を置きましょう。その理由を知るために`server.rb`を見てみます。

# Rubyのserverファイル

```ruby
server.mount_proc '/api/comments' do |req, res|
  comments = JSON.parse(File.read('./comments.json', encoding: 'UTF-8'))

  if req.request_method == 'POST'
    # Assume it's well formed
    comment = { id: (Time.now.to_f * 1000).to_i }
    req.query.each do |key, value|
      comment[key] = value.force_encoding('UTF-8') unless key == 'id'
    end
    comments << comment
    File.write(
      './comments.json',
      JSON.pretty_generate(comments, indent: '    '),
      encoding: 'UTF-8'
    )
  end
  # ...
end
```

Rubyの場合はWEBrickを使って実装されています。`mount_proc`で`/api/comments`にアクセスされた場合に、`./comments.json`を読み込むようにしています。この時、`server.rb`があるパスからの相対パスとなります。`/public/comments.json`は読み込まれません。

```javascript
var CommentBox = React.createClass({
  // ...
  handleCommentSubmit: function(comment) {
    var comments = this.state.data;
    var newComments = comments.concat([comment]);
    this.setState({data: newComments});
    $.ajax({
      url :this.props.url,
      dataType: 'json',
      type: 'POST',
      data: comment,
      success: function(data) {
        this.setState({data: data});
      }.bind(this),
      error: function(xhr, status, err) {
        this.setState({data: comments});
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },
  // ...
  render: function() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList data={this.state.data} />
        <CommentForm onCommentSubmit={this.handleCommentSubmit} />
      </div>
    );
  }
});
```

`javascript`でコメントを送信時にはAPIを叩いているだけで保存しているわけではありません。`comments.json`を叩いても内容が取得できるだけです。これが最初のエラーが発生する理由でした。
【WebStorm】JSHintで'angular' is not definedエラーを非表示にする

WebStormのJSHintを有効にしてionicプロジェクトを開くと、各プログラムの冒頭に宣言するangular.moduleをことごとくエラー扱いにします。このままエラー表示されていても問題なく開発はできますが、気持ち悪いのでできれば表示させたくありません。

<img width="1025" alt="angular_not_defined.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18196/4383b79d-d490-4c9a-3e34-21a71b59697d.jpeg">

> JSHint : 'angular' is not defined. (W117)

このエラーを非表示にするには、WebStormのJSHint設定を変更します。

WebStormの設定画面を開き、"Languages & Frameworks" -> "Code Quality Tools" -> "JSHint"を選択します。
左のHSHint設定値から、以下の行を探して"Set"をクリックします。
> Predefined( , separated ) Set predef (globals)

<img width="960" alt="JSHint_setting.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18196/af4205dc-b918-dc3d-7fa8-91910cfa891c.jpeg">

"Set"をクリックするとダイアログが表示されるので"angular"と入力してOKボタンをクリックします。設定ダイアログでOKを押して画面を閉じると"angular"のエラーは非表示になります。