OmniAICreator/Qiita-1.07M huggingface dataset:
iOS / Mac アプリをローカライズしましょう！

どうも、b123400です。アプリをローカライズするアプリを作りましたので、ローカライズのチュートリアルを書きながら自分のアプリを宣伝させていただきます。

アプリのインターフェースを英語にすると日本人に馴染まないけど、かと言って日本語にして海外を完全に無視するわけにもいかない、と思うなら、ローカライズする時です！

ローカライズとはシステムの設定に応じて、インターフェースの言語を変えることです。Xcode 6からXLIFFというフォマットに出力することができたから、ローカライズは以前より簡単になりました。

# まずはプロジェクトを準備する

## コードをローカライズできるように

ユーザー向けの文字列を`NSLocalizedString`というマクロを使えばローカライズされます、例えば：

### Objective-C

```
// これを
NSString *title = @“Hello”;
// こうするのじゃ
NSString *title = NSLocalizedString(@“Hello”, @“title in alert”);
```
### Swift

```
// これを
let title = “Hello”
// こうするのじゃ
let title = NSLocalizedString(“Hello”, comment: “title in alert”)
```
二番目の引数はコメントっていう、実際の動きに影響はしないが、翻訳者に見せるコメントとしては役に立ちます。例えばこの文字列はボタンなのか、タイトルなのかを書けば、翻訳者にとっても便利でしょう。

## インターフェースファイルを改修する

コードよりも、storyboardやxibファイルの方がローカライズが必要な場合も多いです、そしてこういうインターフェースファイルも簡単にローカライズできます。

1. まず左のサイドバーからプロジェクトを選択し、Info（情報）を押して、ローカライズの下にある「+」ボタンで言語を追加します。
    ![言語を選択して追加します](http://blog.b123400.net/content/images/2016/02/Screen-Shot-2016-02-02-at-10-16-31-PM-1.png)
2. 次は翻訳したいインターフェースファイルを選択します。それでそのファイルはローカライズできるようになります。
    ![ローカライズしたいファイルを選択](http://blog.b123400.net/content/images/2016/02/Monosnap-2016-02-02-22-20-21.png)
3. もし新しいファイルを追加して、それをローカライズ対応にしたいなら、右のサイドバーにある「ローカライズ」ボタンを押して、言語を選択すればいいです。
    ![これを押す](http://blog.b123400.net/content/images/2016/02/OtherViewController-storyboard---Edited-2016-02-02-22-58-22-1.png)

# XLIFF ファイルを出力

プロジェクトの準備が終わったら、いよいよXLIFFファイルを出力できます。

1. プロジェクトを選択します（targetじゃないです）
2. メニューバーのEditor -> Export For Localization…を押す
3. それでXcodeはさっき改修したコードやインターフェースファイルから文字列を抽出して、XLIFFファイルを作ります。

# XLIFF ファイルの編集

ここがローカライズの肝、翻訳です。XLIFFファイルを開けるアプリやサイトはいくつもありますが、ここは私が作ったアプリ [Xliffie] を紹介させていただきたいと思います。

![ここからコメントが読めます、翻訳のヒントになります](http://blog.b123400.net/content/images/2016/02/zh-Hant-xliff-2016-02-02-23-34-17.png)

ファイルを開くとさっきの文字列を全て編集できます、右のサイドバーからコメントが表示されます。

![プロジェクトの中の文字列です、コードに書いたコメントも拾えられます。](http://blog.b123400.net/content/images/2016/02/zh-Hant-xliff-2016-02-02-23-33-35.png)

インターフェースファイルから文字を抽出する時、XcodeはUILabelなど情報を入れるので、翻訳に役に立つはずです。

## Printf フォーマットの文字列に気を付けましょう

`+ [NSString stringWithFormat:]` で使われる文字列は翻訳する時気を付けないとバグになりえます、アプリが落ちたりもします。例えば「%@」がある文字列を%d変わったら、アプリは落ちます。

![Xliffieはそのフォマットを検出して、間違いがありそうな場合は警告を出します。](http://blog.b123400.net/content/images/2016/02/Monosnap-2016-02-03-00-04-14.png)

## 翻訳サービスを使う時の注意点

文字列が多い場合、簡単な文字列をとりあえず Google / Bing 翻訳に任せる場合も多いです、Xliffie はこの二つのサービスと連携していて、ローカライズをスピードアップできます。ところが、こういうサービスも完璧ではないです、例えば「%@」を Google 翻訳に翻訳してもらうと、全角の「％」が返され、`stringWithFormat:`などを使う時に問題が起こります。こういうところも気を付けましょう。

![Xliffieで翻訳サービスを使うと、フォマットは自動チェックされます。](http://blog.b123400.net/content/images/2016/02/Monosnap-2016-02-03-00-16-50.png)

# XLIFFファイルをインポートする

翻訳し終わったら、いよいよ最終のステップ、インポートです。

1. `Editor` -> `Import For Localization…` を押す。
2. 変わった文字列が表示されます、問題がなければOKを押す、それであなたのアプリのローカライズは完了です！

    ![文字列の変化点が表示されます](http://blog.b123400.net/content/images/2016/02/Monosnap-2016-02-03-00-24-17.png)

----

[Xliffie] は開発者向けの XLIFF ファイルエディターです。翻訳サービスとの連携、フォマットのチェック、正規表現で検索などの機能が付いてます。

[Xliffie]:https://itunes.apple.com/us/app/xliffie/id961651406?ls=1&mt=12
電子工作 > 小さい基板[四角]で安いものはないだろうか

ユニバーサル基板で実装するとき、ちょっとしたものを作るときに小さめのものを使っている。

これまでよく使ってきたのは以下の物
http://daisen-netstore.com/shopdetail/000000000024/universal/page1/brandname/

- 利点
  - 店で売っている
  - 四角
  - 見た目もいい(気がする)
- 欠点
  - 安くない (1枚100円)


## 他のもの(未購入)

小さいもので他に探してみた。

- Picotec > http://akizukidenshi.com/catalog/g/gP-02515/
  - 価格 15円
  - 4 x 4 の穴
  - 形状: 四角

- 矢島製作所 > http://akizukidenshi.com/catalog/g/gP-09674/
  - 価格 25円
  - 67穴 片面
  - 形状: 丸

- 矢島製作所 > http://akizukidenshi.com/catalog/g/gP-09674/
  - 価格 25円
  - 35穴
  - 形状: 丸

- 矢島製作所 > http://akizukidenshi.com/catalog/g/gP-09674/
  - 価格 30円
  - 35穴 両面
  - 形状: 丸

丸のものは用途によってはいいかもしれないが、RPi用には四角の方がよい。

ノーブランドではなく、36穴で50円くらいの四角いもので片面基板を探している。

大きめのものを買って自分でカットすることもできるが、複数枚作った時に形状の精度が取れない。

これがあった。
http://akizukidenshi.com/catalog/g/gP-02516/
と思ったら、1.16mmピッチだ。16ホールと同じサイズ。
これも試してみようか。
osx_defaultsモジュール (from Ansible 2) でMacのプロビジョニングが簡単になってすごい便利


Ansibleはそのシンプルさゆえに、brewやgemなどによるMacの開発環境構築にも利用されることが多かったですが、Ansible 2からosx_defaultsという、Macのほぼあらゆる設定を変更できるdefaultsコマンドを扱えるモジュールが使えるようになりました。

細かなMacの設定項目もこれでプロビジョニングしやすくなるので、これで作っておけば新しいMacを買った時も設定を手間なく受け継げます。会社で一度に多くのMacを導入するときとかすごく便利なんじゃないでしょうか。

> osx_defaults - osx_defaults allows users to read, write, and delete Mac OS X user defaults from Ansible — Ansible Documentation
> http://docs.ansible.com/ansible/osx_defaults_module.html

以前はこんなふうにゴリゴリ書いていたところを・・・

```
    - name: Check Dock
      shell: "defaults read com.apple.dock | grep autohide > /dev/null && test `defaults read com.apple.dock autohide` -eq 1; echo $?"
      register: is_autohide
      changed_when: is_autohide.stdout != '0'

    - name: Autohide Dock
      shell: "defaults write com.apple.dock autohide -int 1"
      notify: Restart Dock
      when: is_autohide.stdout != '0'
```

こんな風にとてもシンプルに書けるようになりました。

```
    - name: Autohide Dock
      osx_defaults: domain=com.apple.dock key=autohide type=bool value=true
      notify: Restart Dock
```

コミットログ見るとホントものすごい量を減らせました。


>GitHub
> https://github.com/ikuwow/mac-provision/commit/e9bcff7c411a410875bb070854dfe9d6e2226ee8

使い方としては、変えたい設定とそれに対するdefaultsコマンドを作って、それをAnsibleに書きなおすという感じでしょうか。書かなきゃいけない量が減るだけで、defaultsコマンドはやっぱり知らないとダメですね。というかChefでもPuppetでもこの点は同じですね。

実際にやってみると、データ型の違いでエラーが出ることが多くて悩まされます。今後より使いやすくなってくれることを期待します。

それにしてもAppleさん、defaultsで設定できる項目のドキュメントとかは出してくれないものでしょうか。
Vim起動時、マウスで選択した部分をクリップボードにコピーする方法

.vimrcに
```set clipboard=unnamed,autoselect```
って書けばよし。

MacでのVimとクリップボード共有の方法は[MacのVimでHomebrewを使ってクリップボード連携を有効にする](http://qiita.com/shoma2da/items/92ea8badcd4655b6106c)を見ると良し！
pyenv環境に入らないでpyenv依存モジュールを使ったscriptを実行する


自分用のメモ

pythonにはvirtualenvとかを使って独立したpython環境（以下、pyenv環境）を作ることができる。
非常に便利だけどpyenv環境に依存したモジュールを使ったスクリプトはいちいちpyenv環境をアクティベーションしてからでないと使えない。
(実際は使えないことはないけどややめんどくさい)

これは非常に不便なんだけど、ぱっとすぐに情報が入ってこない。たくさんあるpyenv環境を管理する方法はたくさん情報が溢れてるけど。

いい方法がないものかと、Documentを覗いてみたら簡単に解決方法が見つかった。
https://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python

つまりは、pythonモジュールの先頭に以下の二行を追加してねってだけらしい。

```lang:activate_this
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
```

`/tmp/pyenv`ってvirtualenv環境に入れたnumpyを上のようにして使いたいとすると

```
#!/usr/bin/env python

activate_this = '/tmp/pyenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import numpy as np

a = np.arange(10)

print(a)
```


【結論】
ちゃんとDocument読もうねって話なんだけど、Pythonの3rdParty系モジュールは日本語の情報少ないよね。
結構つらい
CloudFrontのバックエンドを多段にしてS3を使う場合のアクセス制御

## 概要

CloudFrontのバックエンドのElasticBeanstalkに構築したNginxを使い、そのNginxからproxy_passでprivateなS3を利用したときに、アクセス制御でハマったのでその解決方法について共有

## 構成

CloudFront -> ElasitcBeanstalk(nginx) -> S3(private)

## 詳細

S3がprivateなのでアクセスするには設定が必要で、以下の2つの方法を検討した。

1. VPC Endpointを使用
2. IAMでのアクセス制御

1の方法は今回利用したいアプリケーション以外にも同じVPCに属するインスタンスからのアクセスも許可してしまうデメリットがある。今回のケースではReadOnlyなアクセスなので、それでも副作用は特にないのだが、2の方がより適切なアクセス制御ができるので2を採用した。

nginx+luaでproxy_passするときに認証情報をheaderに付与した。該当処理部分の抜粋は以下のとおり。AWSのドキュメントはこちら:  [RestAuthentication](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationStringToSign)

```
    location ~ ^/path/(.+)$ {
        set_by_lua_file $bucket '/usr/local/nginx/lua/env.lua' 'BUCKET';
        set_by_lua_file $access_key '/usr/local/nginx/lua/env.lua' 'AWS_ACCESS_KEY';
        set_by_lua_file $secret_key '/usr/local/nginx/lua/env.lua' 'AWS_SECRET_KEY';
        rewrite_by_lua '
            local date = ngx.http_time(ngx.time())
            local string_to_sign = ngx.req.get_method() .. "\\n\\n\\n" .. date .. "\\n/" .. ngx.var.bucket .. "/" .. ngx.var[1]
            ngx.req.set_header("Date", date)
            local digest = ngx.hmac_sha1(ngx.var.secret_key, string_to_sign)
            local signature = ngx.encode_base64(digest)
            ngx.req.set_header("Authorization", "AWS " .. ngx.var.access_key .. ":" .. signature)
            ngx.req.clear_header("x-amz-cf-id") -- ここでCFのHeaderを除去
        ';
        proxy_hide_header x-amz-id-2;
        proxy_hide_header x-amz-request-id;
        proxy_hide_header Cache-Control;
        proxy_set_header Host $bucket.s3.amazonaws.com;
        proxy_pass http://$bucket.s3.amazonaws.com/$1;
        error_page 415 /50x.html;
    }
```

使用するIAM Userに該当S3へのRead権を適切に付与してあれば、これで `ElasticBeanstalk(nginx) -> S3(private)` 間のアクセスは何の問題もないのだが、CloudFront経由でアクセスしたときには問題がおこる。

`CloudFront -> ElasticBeanstalk(nginx)` のアクセス時にCloudFrontはいくつかのHeaderを付与する(ex: User-Agent, x-amz-cf-id..)。`x-amz-cf-id` が付与されていると、S3はCloudFrontからのアクセスだと判断して、そのCloudFrontからのアクセスが許可されていないとIAMの正しいAuthorization HeaderがあってもDeny(403)になってしまうのだ。CloudFrontからS3へのアクセス設定は[OriginAccessIdentity](http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html)を用い、CloudFrontのdistributionで設定できる。ただし、CloudFrontのOriginがS3のときのみ設定できるもので、今回はCloudFrontの直接のバックエンドはElasticBeanstalkなので使用できない。そこで、nginxでproxy_passする際に、 `x-amz-cf-id` をHeaderから取り除くことでIAM認証を有効にすることで解決した。

マネージドサービスはメリットの方が大きいと思いますが、動きを詳細に全部理解して使うのも難しく、こういった予期せぬ、期待せぬ挙動にあうとハマってしまいがちだなと思うところです。
面倒くさいVimコマンドにエイリアスを設定する

いちいちvim画面でNERDTreeって打つのがめんどくさいので、エイリアス設定をした。

やり方は簡単で.vimrcに
```:command <Alias名> <Aliasを付けたいコマンド>```
って書けばよし。ただ注意が必要でAlias名は大文字から始まっている必要がある。

とりあえず以下の様に設定してみた。
```:command Tr NERDTree```  

その後,.vimrcを再読み込みしてください。
使える様になっているはずです！

参考
・ http://stackoverflow.com/questions/3878692/aliasing-a-command-in-vim:title
XcodeSwiftSnippets でコーディングを速くしよう！

==

はじめましてこんにちは！
スタートアップの [Liaro](http://liaro.me/company) で iOS アプリエンジニアをしている [@131e55](http://qiita.com/131e55) です.
今回は Swift でコードを書く際に便利な [XcodeSwiftSnippets](https://github.com/burczyk/XcodeSwiftSnippets) を紹介します.

XcodeSwiftSnippets とは
--
Xcode のスニペットとは, よく利用するコードのひとまとまりを予め定義しておいて, 少ないタイプ数で入力できる補完機能です.

![Snippets0.gif](https://qiita-image-store.s3.amazonaws.com/0/104039/c0667a54-4d32-a0b4-ff4b-10aab060c760.gif "Snippets0.gif")

スニペットは自作することもできますが, 誰もがよく使うようなコードが [XcodeSwiftSnippets](https://github.com/burczyk/XcodeSwiftSnippets) にまとめられているので導入するだけで便利なスニペットを利用できます.

導入方法
--

以下のリポジトリを `git clone` または zip のダウンロードをします.
https://github.com/burczyk/XcodeSwiftSnippets

取得したフォルダ内の `plist` フォルダの中にある `.codesnippet` ファイルを全て `~/Library/Developer/Xcode/UserData/CodeSnippets/` へコピーします.
`CodeSnippets`がない場合は自分で作成してください.

これだけです!
Xcode を再起動してさっそく試してみましょう.

使い方
--
`swift` と打とうとすると候補がたくさんでてきますので選ぶだけ！

こんな時に便利！
--
僕が実際に使ってみてこれは便利だ！となったケースをいくつか紹介します.

### UIViewController のライフサイクル
`swift-uiviewcontrollerlifecycle` を選ぶだけで, viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear を補完してくれます.

![Snippets1.gif](https://qiita-image-store.s3.amazonaws.com/0/104039/8ebc41e6-b5ec-ed15-bdaf-7c0b941a2bb9.gif "Snippets1.gif")

### UITableView
`swift-uitableviewdatasource` で UITableViewDataSource のメソッドを補完してくれます.

![Snippets2.gif](https://qiita-image-store.s3.amazonaws.com/0/104039/7104cad3-d7d7-c8db-9045-6feea9b28c52.gif "Snippets2.gif")

もちろん UITableViewDelegate も `swift-uitableviewdelegate` で用意されています.

### GCD
重い処理はバックスレッドで行って結果をメインスレッドで…って場合のコードは手間がありますが, `swift-dispatchasync` で簡単です.

![Snippets3.gif](https://qiita-image-store.s3.amazonaws.com/0/104039/23f958f5-89ec-67b6-32e9-28d5063d2b6a.gif "Snippets3.gif")

まとめ
--
[XcodeSwiftSnippets](https://github.com/burczyk/XcodeSwiftSnippets) は Swift のためのスニペットがまとめられていて便利！
Arduino > PWM > 1Hz から 1MHz 駆動

Youtubeで PWM を使って 1Hzから1MHz駆動している例を見つけた。
https://www.youtube.com/watch?v=HY2X4oEqBMg&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz&index=11

ただし、イタリア語っぽい。

0:10の動画にメニューが表示されている。

イタリア語は分からないが、なんとなく訳してみた。

- IL SOFT START E` TERMINATO
  - 分からない（スタート、終了？)
- PREMI 'F' PER IMPOSTARE FREQUENZA IN Hz
  - Fを押すと、周波数(Hz)を上げます [と思う]
- PREMI 'D' PER IMPOSTARE DUDY CICLE DA 1 A 1023
  - Dを押すと、DUTY(DUDYはスペルミス)を1から1023へ変更します
- PREMI 'a' PER AUMENTARE LA FREQUENZA DI UNO STEP
  - aを押すと、周波数を１ステップ増やします [と思う]
- PREMI 'A' PER AUMENTARE LA FREQUENZA DI 10 STEP
  - aを押すと、周波数を１0ステップ増やします [と思う]
- PREMI 's' PER DIMINUIRE LA FREQUENZA DI UNO STEP
  - sを押すと、周波数を１ステップ減らします
- PREMI 'S' PER DIMINUIRE LA FREQUENZA DI 10 STEP
  - Sを押すと、周波数を１0ステップ減らします
- PREMI 'p' PER AUMENTARE IL DUTY CICLE DI 1%
  - pを押すと、Duty cycleを1%増やします
- PREMI 'P' PER AUMENTARE IL DUTY CICLE DI 1%
  - Pを押すと、Duty cycleを10%増やします
- PREMI 'm' PER DIMINUIRE IL DUTY CICLE DI 1%
  - pを押すと、Duty cycleを1%減らします
- PREMI 'M' PER DIMINUIRE IL DUTY CICLE DI 1%
  - Pを押すと、Duty cycleを10%減らします


実際の動画で周波数を変更したりDuty比を変更したりしている。
PWMを使えば、1MHzを出せるということだろうか。

コメントにBey Meephanlomさんがコードを書いていて、16MHzのCPU駆動時にCCR(Capture Compare Registerだろう)の設定をして1Prescale PWM Fmaxで4MHzという記載がある。
macosx 設定メモ rbenv 編

rbenvは、rubyの環境を切り替えたり、最新のrubyをインストールして試したりと便利なツールです。その他gemで管理されている他のツールが使えたりするのでインストールしてあると何かと便利です。
brewでインストールするので、shell - brew - gem というような階層になります。

#1.インストール

```
$ brew install rbenv
```

.bashrcあたりに下記を追記する

```
export RBENV_ROOT="$HOME/.rbenv"

if [ -d $RBENV_ROOT ]; then
    export PATH="$RBENV_ROOT/bin:$PATH"
    eval "$(rbenv init -)"
fi
```

```
$ rbenv versions         # 実行選択可能なものを一覧表示
$ rbenv install -l       # インストール可能なものを一覧表示
```

一覧は下記のような感じ

```
  2.2.2
  2.2.3
  2.2.4
  2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.4.0-dev
```

バージョン2.3.0を使いたければ、

```
$ rbenv install 2.3.0         # rubyのバージョンを指定。
$ rbenv rehash                # これをやらないと反映されない
$ rbenv global 2.3.0          # 使用可能にする（スイッチする）
```

一度Shellを抜けましょう・・・抜けないとうまくパスが通りません。

#2.railsをインストールしてみよう

El Capitainでは、標準のインストール場所では問題が起こりそうなので、下記のように場所を変えてみました。

```
$ sudo gem update —system      # RubyGemsなどがアップデートされる。
$ sudo gem install -n /usr/local/bin rails # インストール場所を指定する
$ sudo gem update -n /usr/local/bin  # アップデート
```
serverlessで趣味Webサイトを作ってる話



作っているもの: http://billboard-tv.tk/
github: https://github.com/abeyuya/billboard-tv-serverless2


serverlessとかreactに興味があったので、土日とかに勉強がてら、billboard-tvというWebサイトをちまちま作っています。

今まで趣味プログラミングのコードを公開してなかったけど、公開した方がいろいろ良いよなぁ、と思い公開してみた。

その解説の記事です。
(だらだらと感想文みたいになってしまいました...)

一人でやるよりも誰かの目に晒した方がやる気が出るかもしれないしね!:beer:

react編: http://qiita.com/abeyuya/items/64dde6c6dd117fc29217


# serverless

serverlessってのはこれ https://github.com/serverless/serverless

現状、serverlessでは定期的にビルボードのランキング情報を取得して、整形したjsonをS3に吐く処理をしている。

フロント側はReact.jsで書いていて、静的ファイルをS3で配信している。
フロント側からはこのjsonを取りに行くようになっている。

serverless使っているけどAPIGatewayは現状使っていなくて、ただlambdaファンクションを便利にデプロイするのに使っている感じ。

料金的にはlambdaの課金のみで、今回みたいに細々使うだけなら無料枠に収まる。
どうやらEC2のしょぼいマシン1ヶ月分くらいのリソースは無料枠っぽいので、趣味レベルWebサイトならガンガン使っても無料枠に収まりそうな気がする。


# lambdaファンクションの定期実行

週に1度スクレイピングをしたくて、スケジューリングを設定している。

~~本当はserverlessでcron設定をちょろっと書いて、デプロイコマンド叩くと反映されるみたいなことがやりたかった。~~

~~けど、どうやら現状ではAWS側にそもそもlambdaのスケジューリングのAPIが無いらしく、serverlessからそういったことはできなかった。~~

~~なので、ログインして管理画面からぽちぽち設定した。~~

できるようになりました!
便利!

参考: http://docs.serverless.com/docs/function-configuration#section-event-sources-configurations



# serverlessの苦労話

最初見つけた時はjaws-frameworkという名前だった。
インストールして少し触ってて、次の週になったら名前が変わっていてびっくりした。

開発中もすごい勢いでバージョンアップしていて、合わせてちょこちょこアップデートしていた。
まだ当面はこんな感じが続くんじゃないだろうか。
実プロダクトで導入するには結構勇気がいりそう。

あと、serverlessでやり始めて一番苦労したのはエラーログを見つけるところだった。

* ローカルだと動くのにデプロイすると動かない
	* 管理画面見てても、console.logの出力とかどこにも無い
	* デプロイ後のログは見れないと思ってた
		* 途中でClowdWatchで見れることを知って歓喜


# lambdaサイコーじゃないか

今回のような要件にはlambda非常にマッチするなと思った！
週に1回しか動かない処理なので、そのためにEC2起動するのはもったいない。

lambdaはイベントドリブンな面の活用をよく見かけるけど、今回みたいなバッチ処理的なやつも非常に相性が良いなぁと思った。

あとは、今回みたいにほぼ静的なWebサイトなんだけど、一部だけ動的な部分があるサイトとかも結構相性が良いと思った。


## 例1 ランディングページ

ランディングページ的なWebサイトだとメール登録した後の「ご登録ありがとうございました！」というメール送信のためだけにサーバやDBが必要になるので、そこだけlambdaとDynamoDBで作るとか良さそう。

そうすると、フロント側は全部middlemanとかで書けて、サーバの管理を一切しなくて良くなる。

サーバを持つとすごく面倒くさい。それが解消されるのがすごく良い。

サーバを持つと、
yum installとかして、
ユーザー作ったりldapセットアップしたり、
監視のためにzabbixいれたりClowdwatchの設定をしたり
する。

本当に面倒くさい。
chefのレシピとかが整備されていれば楽になるかもしれないけど、それもでなんだかんだ面倒くさい。

新規の小さなWebサイトをぽこぽこ出すような環境だと本当に面倒くさい。

しかも定額お金かかる。
負荷やばそうならスケールアウトしないといけない。

lambdaサイコー!!!!!!!!!!!!!!


## 例2 問い合わせページ

上記とほとんど一緒だけど、静的なWebサイトでも問い合わせページが必要になると、それだけで何かしらバックエンド処理が必要でサーバが必要になる。

lambdaでやれそう
lambdaサイコー!!!!!!!!!!!!!!


## 例3 ランキングページ

そんなに作ることないだろうけど、今回みたいな定期的にランキング更新するだけのWebサイトも相性良い。

## 例4 Twitter認証が必要な静的Web

静的Webだからサーバサイドの環境とか一切用意してないけど、
Twitter認証の機能が必要になった場合とかに使える。

参考: http://qiita.com/abeyuya/items/3aade1b3f359a941c22c



---


という訳で、lambdaは結構使いドコロがあるなぁと感じている。
serverlessは仕事とかで使うにはまだ厳しい印象だけど、lambdaは積極的に活用してサーバレスなインフラの恩恵を預かりたい。

今この記事を書いてて、lambdaの良いところはイベントドリブンでなんたらとかパフォーマンスがどうたらじゃなくて、インフラの面倒を見なくて良い「フルマネージド」なところだなぁと思った。
自分にとっては。


lambdaサイコー!!!!!!!!!!!
【C#】フォームの二重起動を防ぐ

C# フォームアプリケーションでフォームの二重起動を防ぐ方法を紹介する。

# 注意
今回は「SampleForm」というフォームがある前提で進める。

# やり方
開く元のフォームに以下のコードを追加する。

```csharp:Form.cs
public SampleForm sf = null;
```

「sf」の部分は自由に変更してもよい。
そして、いままでのフォームを開くコードのところを二重起動を防止するコードに書き換える。

```csharp:Form.cs
/* 二重起動防止 */
if (this.sf == null || this.sf.IsDisposed)
{ /* ヌル、または破棄されていたら */
  this.sf = new SampleForm();
}
```

# おまけ
フォームにフォーカスを当てる。

```csharp:Form.cs
if (!this.sf.Visible)
{
  this.sf.Show();
}
else
{
  this.sf.Activate();
}
```
MacデフォルトのapacheにcakePHP3インストールをメモ

ほんと、もうメモだけ。コマンドは、だいたいsudo付けてください。

## githubからcakePHP3をclone
/Library/WebServer/Documentsにhttps://github.com/cakephp/app を参考にクローン。ディレクトリ名appは好きな名前に変えてください。

## composerをインストール
ディレクトリ内に入ったら`composer install`を実行。バージョンの設定とかがゴタついたらcomposer.jsonを書き換えましょうね。

## Databaseを設定
config/app.phpのDB設定を自環境に適した形で記載。テスト環境を設定する箇所もあるので、そこも書こう。mysqlの設定方法とかは、まぁ良い。
**hostがlocalhostの時は127.0.0.1に変更しないとDB繋がらない時もある。**

## パーミッション設定
こんなカンジだ。

```shell-session:chmod&chown
sudo chown -R <ユーザ名>:staff ./<アプリ名>/
sudo chmod -R 755 ./<アプリ名>/
chmod -R 757 ./<アプリ名>/tmp/
chmod -R 757 ./<アプリ名>/logs/
```

##  httpd.confと.htaccessを設定
一番キライだ…。
/private/etc/apache2/httpd.confに以下を追記。

```xml:httpd.conf
<Directory "/Library/WebServer/Documents/アプリ名">
    AllowOverride All
</Directory>
```
`LoadModule rewrite_module libexec/apache2/mod_rewrite.so`のコメントアウトも外そう。
composer.jsonとか入っているアプリ内直下に.htaccessを作成

```xml:.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /アプリ名
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>
```

## 確認
`sudo apachectl restart`で再起動。
こんなカンジでカラフルに表示されて確認項目に全て緑チェックが付いてればOK
![screencapture-localhost-20117-Meating-1454763695906.png](https://qiita-image-store.s3.amazonaws.com/0/59687/87ece9ff-0716-68c5-b128-bf32223f2092.png)
参考サイト：
http://stackoverflow.com/questions/32512742/htaccess-and-cakephp3-routing-multiple-sites-same-server

http://stackoverflow.com/questions/20723803/pdoexception-sqlstatehy000-2002-no-such-file-or-directory
mysqlenvをOS X El Capitanで使う

# mysqlenv
[MySQL Casual #04 で mysqlenv 作った的な話をしてきました](http://blog.livedoor.jp/xaicron/archives/54459954.html)
xaicron氏　作

## mysqlenv とはッ！
なんかrbenvとかplenvみたいな奴で、いろんなバージョンのMySQLを切り替えたり、特定のディレクトリ以降で使用するMySQLのバージョンを固定したりするやつ
[とのことです。](http://xaicron.github.io/slide/mysqlcasual-04/#18)
***

今回の環境は標記にある通りです。
Command Line Toolsは導入済みです。

```
ElCapitan:~ qiita$ xcodebuild -version
Xcode 7.2.1
Build version 7C1002
```

2016年2月6日時点では
[ 3.23.58 ] - [ 5.7.9 ]
[ facebook-5.6.12 ]
[ mariadb-10.0.22 ] - [ mariadb-5.5.36 ]
[ percona-5.5.29-29.4 ] - [ percona-5.6.16-64.2-tokudb-7.1.5 ]
[ twitter-5.5.33.t12 ]
[ webscalesql-5.6.17 ]
以上が利用可能です。

## INSTALLATION
### 1. Install your system

```
curl -kL http://bit.ly/mysqlenv | bash
```

or

```
cpanm git://github.com/xaicron/mysqlenv.git
mysqlenv self-install
```


### 2. Setup your shell

```~/.bashrc
source ~/.mysqlenv/etc/bashrc
```


### 3. Restart your shell

```
exec $SHELL -l
```


### 4. 好みのDBをチョイス

```
mysqlenv available
```


### 5. DBをインストール

```
mysqlenv install 0.0.0
```

cmakeが無ければここで一度こけます。
`brew install cmake`
もう一度`mysqlenv install`しましょう。

`mysqlenv install`が終わると勝手にDBの初期化が始まるはずです。
しかしまたこけます。(MySQL 5.7.6以降)

```
run: bin/mysql_install_db
[WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
[ERROR]   The data directory needs to be specified.
```

[MySQL 5.7.6でデータベースの初期化が変わる mysql_install_dbからmysqld --initialize](http://yoku0825.blogspot.jp/2015/03/mysql-576-mysqlinstalldbmysqld.html)
というわけで`mysqld --initialize`

**初期パスワード生成されます**
### 6. お疲れ様です
`mysqlenv list`でインストール完了を確認した後に`mysqlenv global 0.0.0`でｾｯﾄして`mysqlenv rehash`で作業完了です。


```
ElCapitan:~ qiita$ mysql -V
mysql  Ver 14.14 Distrib 5.7.9, for osx10.11 (x86_64) using  EditLine wrapper
```
Gitをビルドしてインストール

Gitをソースからビルドしてインストールする機会があって
結構時間かかってしまったので、めもめも。

ここから必要なバージョンのGitを見つけてきましょう。
https://github.com/git/git/releases


# gitのDL
適当なディレクトリに移動してダウンロードします。

```
wget https://github.com/git/git/archive/v2.7.0.tar.gz
```

# 依存関係のパッケージをインストール
実は結構必要なパッケージがあります。
yumで入れられたのは幸いでしたが、パッケージがわからず時間が。。。

```
yum install -y zlib-devel perl-devel gettext gcc curl-devel
yum install asciidoc xmlto
yum -y install epel-release
yum -y install --enablerepo=epel docbook2X docbook-utils
ln -s /usr/bin/db2x_docbook2texi /bin/docbook2x-texi
```

解凍します。

```
tar xvf v2.7.0.tar.gz 
cd git-2.7.0/
```

makeしてインストール。

```
make configure
./configure --prefix=/usr/local
make all doc info
make install
```

無事にインストールできました。
Apple Documentを読んで気になったところまとめ(welcome to swift)


### functionの書き方のvariation一覧(多分既に何処かにある？)
・引数(argument)に変数を幾つかsetして、返り値が値の場合

```
func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday") // "Hello Bob, today is Tuesday."
```

・nestもあり

```
func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()  //15
```

・返り値が関数型の場合

```
func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7) // 8
```

・引数に関数型を持つ場合

```
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen) // true
```

・closure({})

```
numbers.map({
    (number: Int) -> Int in // 引数 -> 返り値 をinで区切る
    let result = 3 * number
    return result
})
```
```こういう風に書くこともできる
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
```
```引数だけで機能する場合は()いらない
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)
```

### deinitするのはどういう時か？
デイニシャライザはクラスのインスタンスが破棄される時に自動的に呼ばれる特殊なメソッドです。
構造体にデイニシャライザはありません。
メモリに確保されたインスタンスやプロパティはARC（Automatic reference counting）によって自動的に破棄されるので **通常はデイニシャライザを記述する必要はありません**が、例えばファイルを扱うクラスで、開いたファイルをインスタンスの破棄時に確実に閉じるためにデイニシャライザを利用することができます。


### stored property vs computed property vs type property
##### stored property(保持型プロパティ)
・willSet/didSetは、プロパティの状態監視をしたい時に用いる(当然、letには使えない)
・`lazy`という修飾子をつければプロパティを使う時に初期値のsetをすることができる。(遅延ストアドプロパティ)
**遅延ストアドプロパティは、インスタンス生成時そのプロパティを必要せず、かつ、プロパティの初期化処理に時間を多く割いてしまう場合に使う

##### computed property
値を保持しない算出プロパティ
・varで宣言する
・プロパティ監視(willset/didset)は使えない
・lazyも使えない
・getterだけでも使える。getterのみの場合、`get`は省略可能

```
var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
}
```

##### type property
特定の型それ自身に属するプロパティ
インスタンスを定義しなくても参照できる
`Class.typeProperty`や`Struct.typeProperty`, `Enum.typeProperty`

### mutating func とは？
メソッド内でインスタンスプロパティを変更する際には、そのメソッドを mutating として宣言する必要があります。
to mark a method that modifies the structure
macosx 設定メモ rsync 編

# はじめに

rsyncはバックアップで使う便利なコマンドです。
Windowsにはいろいろと便利なフリーウェアがあってよりどりみどりなのですが、macosでは色々調べた結果、やっぱりこれが一番です。


# 1.インストール


osxのrsyncは古いのでbrewを使って最新版をインストールします。
標準の（古い）rsyncではログが文字化けするのですが、iconvがないからなのか、バージョンが古いからなのかは調べていません。ちなみに、新しいrsyncでは--iconvオプションは必要ないようです。

```bash
$ brew tap homebrew/dupes
$ brew install libiconv
$ brew install rsync
```

brewは、/usr/local/binにインストールしますので、パスの優先順位が
/usr/binより、/usr/local/binが上になるようにします。（普通は何もしないでOK）

```bash
$ env
// または
$ echo $PATH
```

などと打ってみます。PATH設定を確認してください

# 2.ローカルでバックアップ

ディレクトリ（src）をバックアップディレクトリ(backup)にバックアップします。
(src)には後ろに/を付けません。（付けると中身だけバックアップされます）

```bash
$ rsync -av --delete src backup
```

--delete が無いと元ディレクトリで消してもバックアップ先では消えません。
http://qiita.com/QUANON/items/2953c52df7f65f2ecee5
上の記事はよく読みましょう。

バックアップを実行する前にnオプションをつけて何が更新されるのか差分を調べることが重要です。（ここで間違えるとバックアップどころか・・・）

```bash
$ rsync -avn --delete src backup
```
dry-run (お試し実行)と言うそうです。（これが欲しかった！！）

# 3.ローカルのディレクトリをリモートマシンにコピー

sshが使えるならば、下記のようにリモート環境にバックアップもできます。
相手はmacosじゃなくてもLinuxでも大丈夫です。
macosでsshd（sshデーモン）を有効にするには、「システム環境設定」「共有設定」で「リモートログイン」を有効にしてください。

```bash
$ rsync -avz src me@aaaaaa.com:~/backup
```
meはaaaaaa.comにおける貴方のアカウントです。
当然パスワードを入れる必要があります。


# 4.バックアップ対象の除外

```
$ rsync -av --exclude '*.tmp' src moons@beowulf-tech.com:~/backup
```

複数のファイル、ディレクトリーを除外する場合は、--exclude 'xxxx'を何度も並べれば良いです。ディレクトリーの場合は、最後に/を記述します。

```bash
$ rsync -av --exclude '.obj/' --exclude '.DS_Store' src me@aaaaaa.com:~/backup
```

<font color="DeepPink">
除外設定は単純に対象から外れるだけなので、例えばバックアップ先に余計なディレクトリーがあって、--deleteオプションを入れた上で--excludeで指定しても対象のディレクトリーが消えることはありません。
</font>

<br>

# 5.消えないディレクトリー

上記のまま使っていると、gitリポジトリーなどで空のディレクトリーが残っていることがよくあります。

`rsync cannot delete non-empty directory`

と言われることはないでしょうか？

```
rsync -av --delete --exclude '.DS_Store' --exclude '.obj/' src backup
```

これは例えば上記のように「バックアップ対象の除外」で指定した`.DS_Store`が、`.git`ディレクトリー内の残っていて、削除できないケースが考えられます。

このような場合は、下記のように `--delete-excluded`オプションを指定しましょう。
`--delete-excluded`オプションは、`--exclude`で除外したディレクトリーやファイルがバックアップ先にある場合は、これを削除してくれます。

```
rsync -av --delete --delete-excluded --exclude '.DS_Store' --exclude '.obj/' src backup
```


# 6.rsyncのオプション

オプション一覧は、下記のページが詳しいので、そちらを参照してください。

https://atmarkit.itmedia.co.jp/ait/articles/1702/03/news020.html
macosx 設定メモ homebrew編

#1.brewインストール

El Capitainではアクセス権を変更する必要があります。

```
$ sudo chown -R $(whoami) /usr/local
```
下記を実行してhomebrewをインストールします

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
インストール後に、下のコマンドを実行しておいたほうがよさそうです。
定期的にupdate、upgradeはしたほうが良いです。
```
$ brew update      # homebrew更新
$ brew upgrade     # homebrewでインストールしたパッケージの更新
$ brew cleanup     # 古くなった formulaを消去
$ brew doctor      # 診断
```

#2.使い方（nodeを例に）

```
$ brew list              # 一覧表示
$ brew install node      # インストール実行
$ brew uninstall node    # アンインストール実行
$ brew deps node         # 依存関係
$ brew info node         # 情報表示
```
macosx 設定メモ bash編

El Capitanには、.bash_profileも、.bashrcもありません。
なので自力で作成します。

>$ touch .bash_profile
>$ vi .bash_profile

viじゃなくても良いですが、.bash_profileに下記のように書き込みます。

>source ~/.bashrc

または、

>if [ -f ~/.bashrc ] ; then
>. ~/.bashrc
>fi

これは自分の趣味ですが、メモとして残します。

>\# プロンプトを[アカウント名@ホスト名 フルパス 時刻] の形式で表示する
>export PS1='[\[\033[40;0;33m\]\u@\h \w/ \[\033[40;2;37m\]\t\[\033[0m\] ] $ '
>
>\# historyコマンドに日時を表示するようにする
>HISTSIZE=2000
>HISTTIMEFORMAT='%F %T '
>unset HISTCONTROL
>export HISTSIZE HISTTIMEFORMAT

さらに.bashrcを作成

>$ touch .bashrc
>$ vi .bashrc

これも個人的な設定を・・・

>  alias ls="ls -G"
>  alias ll="ls -la"

手始めに、こんな感じでbash環境を整備します。
電子工作 > チャージポンプ（負電圧) > -2.813V出力

```txt:動作確認
Raspberry Pi2 + raspbian
```

http://jsdiy.web.fc2.com/lcd3v/
にあるSD1602の表示のためにVoに負電圧をかける方法を追試している。

チャージポンプという方法で負電圧を作る。

今の所、RPi2で100Hzまでしかクロックしか出せない。
http://qiita.com/7of9/items/d4c2ec34c368569e0882

とりあえずそれでチャージポンプを使ってみる。

### 接続図

http://jsdiy.web.fc2.com/lcd3v/
の「負電圧を生成して+3.0Vと-1.8Vで動かす」の項目にある回路図をそのまま使用。

- 積セラ: 0.1uF x 2
- ダイオード: 1N4148 x 2

.

- RPiのGPIO
  - GPIO14 (Pin #8) - 4th from the top at right side
  - GND

GPIO14に負電圧がでるようにする。


### code

```chargePumpNegative.py
#!/usr/bin/env python

# v0.1 2016 Feb 06
#   - output clock at #8 up to 100Hz

import RPi.GPIO as GPIO
import time
usleep = lambda x : time.sleep(x/1000000.0)

GPIO.setmode(GPIO.BOARD)

kPinCLK = 8 # GPIO14, 4th from the top at right sides

GPIO.setup(kPinCLK, GPIO.OUT)

print "hello"

while True:
    GPIO.output(kPinCLK, True)
    usleep(500.0)
#    time.sleep(0.5)
    GPIO.output(kPinCLK, False)
    usleep(500.0)
#    time.sleep(0.5)
```

### 結果

負電圧が出力できた。

![DSC_0061.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/cf5f56de-dfc6-4eed-338e-3842b27b751c.jpeg)

### 周波数ごとの結果

周波数を変えて負電圧が変わるか確認した。

- 100Hz
  - -2.813V
- 10Hz
  - -2.683V
- 1Hz
  - 安定せず (-1.1 から -1.9Vの間を変動)

チャージポンプの理解はまだだが、周波数を上げることで、負電圧が上がるということと解釈している。
[AWS]API Gateway + Lambda(Java)で適切なHTTPステータスを返す

# やりたいこと

- API Gateway + Lambdaの構成で、200以外のHTTPステータスコードを返却する。

LambdaってHTTPステータス返せないし、どうするんだろうってことでやってみました。

# うまくいったやり方
以下の2つを定義すればOKです。

- 「**Method Response**」で返したいHTTPステータスコードを定義する。[^1]
- 「**Integration Response**」でHTTPステータスコードを返す条件を定義する。


## 実際の手順

- 「**Method Execution**」の「**Method Response**」で「**Add Response**」をクリック。
- 「**HTTP status code**」の項目にステータスコードをセットし、右のチェックボタンをクリック。
![スクリーンショット 2016-02-06 20.20.11.png](https://qiita-image-store.s3.amazonaws.com/0/63643/de27fd55-8a73-376e-87ef-df4b97f83b8c.png)

- 「**Integration Response**」の「**Add integration response**」を開く。
- 「**Lambda Error Regex**」にこのステータスコードを返却する条件となる正規表現を入力。


「**Lambda Error Regex**」の項目はLambdaからthrowされたExceptionのmessageの内容を参照しています。
なのでLambdaからExceptionをthrowするときにmessageに何か目印を埋め込む必要があります。
僕の場合はExceptionのwrapperを作成して、messageの先頭にステータスコードを入れるようにしました。

こんな感じでmessageの先頭にステータスコードをくっつけています。

```lang:ApiGatewayException.java
private HttpStatusCode httpStatusCode;

public ApiGatewayException(Throwable t, HttpStatusCode httpStatusCode, String message) {
		super(t);
		this.message = message;
		this.httpStatusCode = httpStatusCode;
	}

@Override
public String getMessage() {
	return httpStatusCode.getCode() + ": " + this.message;
}
```

- 「**Method response status**」で実際に返すステータスコードを選択。
![スクリーンショット 2016-02-06 20.22.11.png](https://qiita-image-store.s3.amazonaws.com/0/63643/c5aa2c94-8ac1-f524-4681-a41ede73b373.png)
			
- 「**save**」をクリック
		
これでstageにデプロイしてAPIを叩くと設定したステータスコードが返ってきます。

ちなみにエラーは以下の形で帰ってくるので、Modelを作成し、「**Integration Response**」の「**Mapping Templates**」でマッピングすれば任意のフォーマットで返すことも可能です。

```lang:error.json
{
	"errorMessage":"[メッセージ]",
	"errorType":"[Exceptionの型]",
	"stackTrace":[StackTrace文字列の配列]
}
```
ESP8266 / Arduino > GPIOのHigh/Low速度の限界 > 5.172kHzなど

RPiのGPIOで1Mhzのクロックをだそうとして失敗。
http://qiita.com/7of9/items/d4c2ec34c368569e0882

関連して、ESP8266ではどうなのかと疑問に思った。
以下を見つけた。

http://www.esp8266.com/viewtopic.php?f=24&t=1486

> The fastest I was able to get it going on GPIO output was 5.172 KHz.. for a 80 Mhz device, that's a huge order of magnitude of terrible. 

...

> In pure C tight loop in AVR maybe 1Mhz
using Arduino calls to their API maybe 250khz
on 80Mhz 32 bit platform... maybe 10-20Mhz 
...


Arudino IDEを使うと5kHz程度が限界ということだろうか。

## PWMを使う?

PWMを使って31kHzを出している例がある。

https://www.youtube.com/watch?v=iP_f0KY7lx8&index=10&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz
Windowsでもunison動かしたい

[Unison](https://www.cis.upenn.edu/~bcpierce/unison/)自体については「[ssh越しにAtom他GUIエディタを使いたい？それ、同期ツールunisonでできるよ - Qiita](http://qiita.com/yuya_presto/items/f35f556770196f964810)」が良いかと思います。
Windows 10でUnisonの最新版をインストールした、という話です。

# 試した環境

- Windows 10 64bit
- Cygwin 2.4.1
- Unison 2.48.3

# その1 バイナリバージョンを見てみる

http://unison-binaries.inria.fr/ にあります。
が、接続先のUnisonとバージョン違うと動かないはずだし、こんな古いバージョン入れたくないな... ということで敬遠。

## 追記

[@dsegさんのコメント](http://qiita.com/igrep/items/28eb343879aba91cf260#comment-5c4f220d10ce9bb5962a)通り、
http://www.pps.univ-paris-diderot.fr/~vouillon/unison/ に最新版があるようです。  
なのでこれ以降の情報は不要かと思いますが、興味のある方はやってみてください。

# その2 ソースからビルド

ソースは http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.3.tar.gz にあります。
以下の内容は概ね上記パッケージ内の`INSTALL.win32-cygwin-gnuc`の内容に基いています。
今回ビルドしたのはCLI版のみですが、意外と簡単でした。

## Cygwinとパッケージのインストール

Cygwin自体のインストール方法に関しては、インストーラーを実行してでポチポチ押している間に、
**追加のパッケージを指定**しなければならない、ということだけ明記しておきましょう。
[こちら](http://win.just4fun.biz/%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB/Cygwin%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A8%E5%89%8A%E9%99%A4.html)に書いてあるような画面での話です。
デフォルトでインストールされるものの他に、以下のものが必要でした。

- make
- ctags
- openssh
- OCaml 4.02.3 （多分他のバージョンでも大丈夫だと思いますが。3系以降が必須だそうです。）

他にもあるかと思いますがまとめてカテゴリーを選択して入れたので申し訳なくもちゃんと把握しておりません。
足りてない場合は下記の`make`コマンドでエラーが出るのでそれを元に足りないものを入れなおしましょう。
インストーラー(setup.exe)を再実行すればもう一度パッケージ選択画面に飛べます。
（多分コマンド1個で入れるのとかあるんだろうな、とは思いますが今回はUnisonをビルドするためだけなので。）

あ、あと、多分無難だろうということで32bitにしました。

## ビルド

先ほどダウンロードしたパッケージを解凍後、以下のコマンドを実行してください。
この手のコンパイルをされたことがある方には朝飯前ですね。`./configure`すらありません！

```
cd ~/path/to/unison-2.48.3
make
```

ビルドできたら実行してみましょう！

```
$ unison -version
unison version 2.48.3
```

以上、超ざっくりですがソースからのビルドも案外楽だったよ、ということで！
S3を静的webホスティングで限定公開する。


#静的ページ配信の開発期間中
AWSでS3使って静的ページ配信すると簡単にwebサイトが作れちゃいますが、
開発期間中はダイジェスト認証とかベーシック認証で秘匿したい、とかあるかもしれません。

あとコンテンツ配信でCloudfrontつかって、とか。
でもCloudfrontでS3コンテンツ公開で秘匿ってできなかったりします。
確かに期限付きURLとか署名付きとかでできるといえばできますが、
imgとかjsとかの要素についても同様に署名付きURLで提供する必要があったり。
※知らないだけだったら、誰か教えてください。

#開発期間中のTIPS
Cloudfrontはサクッと設定できてしまうので、ここでは言及しませんが
公開前後や、コンテンツ変更タイミングはエラーページのTTLは短めがいいと思います。
特に技術検証中とか、これではまったりします。
「エラーページ、キャッシュしないでしょー」とか考えて、私はどはまりしました。

で、話を戻すと
開発期間中はS3で静的ページ配信で限定公開、
リリースのタイミングでCloudfront配信というのが妥当でしょうか。

でも静的WEBホスティングは、認証とかできないので、
IP制限で対応しました。

```json:
    "Statement": [
        {
            "Sid": "Stmt<UNIQUE_ID>",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<BUCKET_NAME/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "<IP/CIDR1>",
                        "<IP/CIDR2>",
                        "..."
                    ]
                }
            }
        },
        {
            "Sid": "Stmt<UNIQUE_ID>",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<BUCKET_NAME>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "<IP/CIDR1>",
                        "<IP/CIDR2>",
                        "..."
                    ]
                }
            }
        }
    ]
```
電子工作 > RPi / GPIO / デジボル > 周波数計測ができない > 100HzはOK, それより速いのがおかしい > time.sleep()後の待ちの蓄積だろうか?

カイセのKU-2600というデジボルを使っている。

チャージポンプ負電圧を作るため1MHzのクロックをだそうとしている。
1MHzを作るpythonコードを試しているが、KU-2600で測定した周波数が想定通りでない。

## code 

pythonコードは以下を書いた。

```chagePumpNegative.py
!/usr/bin/env python

import RPi.GPIO as GPIO
import time
usleep = lambda x : time.sleep(x/1000000.0)

GPIO.setmode(GPIO.BOARD)

kPinCLK = 8 # GPIO14, 4th from the top at right sides

GPIO.setup(kPinCLK, GPIO.OUT)

usleep(100)

print "hello"

while True:
    GPIO.output(kPinCLK, True)
#    usleep(0.5)
    usleep(50.0)
    GPIO.output(kPinCLK, False)
#    usleep(0.5)
    usleep(50.0)
```

## 結果

```txt:動作環境
Raspberry Pi2 + raspbian
```

usleepの待ち時間を変更することで、周波数が変わる。

- usleep(5000.0)
  - 97.9Hz : だいたいあってる
- usleep(500.0)
  - 833.4Hz : あやしい値だ
- usleep(50.0)
  - 3.3kHz : 全然違う

usleep(5000.0)の場合、1周期が10msecになるので、1 / (10 * 10^-3) = 100Hz.
あとはその周波数を10倍していく値になるはずだが、上記の結果となった。

[KU-2600の取説](http://www.kaise.com/images/manual/Japanese/2600_manualJ_5.pdf)
によると以下の通りなので、対応できない測定範囲ではないと思う。

- 1-3. 周波数 (Hz)
  - レンジ: 9.999Hz から 9.999 MHz
 

## 関連

オシロ用プローブを使うという案があるが、それが本当に必要なのだろうか。
http://www.marutsu.co.jp/contents/shop/marutsu/mame/180.html


### 問題の切り分け

以下のいずれなのだろうか。

- RPiの処理の問題
- KU-2600の問題

## code v0.2

pythonコードを変更してみた。

for で10回ループするようにした。以下の場合は usleep(5000.0)と同じ処理になるはず。

```py
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
usleep = lambda x : time.sleep(x/1000000.0)

GPIO.setmode(GPIO.BOARD)

kPinCLK = 8 # GPIO14, 4th from the top at right sides

GPIO.setup(kPinCLK, GPIO.OUT)

print "hello"

while True:
    GPIO.output(kPinCLK, True)
    for loop in range (10):
        usleep(500.0)
    GPIO.output(kPinCLK, False)
    for loop in range (10):
        usleep(500.0)
```

上記の結果、86.0Hzとなった (97.9Hzではない)。

<font color=red>KU-2600は悪くない</font>。

RPiの処理でusleep()処理直後のタスクディスパッチ遅延などによりwaitが累積しているのかもしれない。


http://pythoncentral.io/pythons-time-sleep-pause-wait-sleep-stop-your-code/
> The Linux kernels tend to have a higher tick rate, where the intervals are generally closer to 1 millisecond. 

1msec程度までしかだめかもしれない。

~~トラ技でこういう記事があったような気がするが、昨年の何月号だっただろうか。~~
2015年のトラ技を見たが、載っていなかった。インターフェイスの方だったかもしれない。
【しずおかアプリ部】活動ログ　第15回

■タイトル
第１５回![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/87bb2154-2a7e-9b83-b50c-8e65f9d6aaf0.jpeg)



■開催日
２０１６年２月６日（土）　１６：００～１８：００


■参加者
９名


■活動内容（概要）
・菅原プレゼン「Unityはじめるよ　～描画のクオリティを上げるコツ編～」

・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第4回 アナログ入出力編」

・保坂プレゼン「Scratch（スクラッチ）を使ってゲームを作ってみよう！」

・部員さんが持ってきたGearVR体験



■活動内容（詳細）
・菅原プレゼン「Unityはじめるよ　～描画のクオリティを上げるコツ編～」
　現在までのグラフィックの進化の過程の紹介。
　Unityで行える描画クオリティを上げるための技術の紹介。
　今回はライティングに特化した内容。
　実演したがうまく動作しない箇所があり、
　次回改めてライティングに関するテクニックを突き詰める。
　
　資料：[第15回_プレゼン資料(Unityはじめるよ～描画のクオリティを上げるコツ編～).pdf](http://monolizm.com/sab/pdf/第15回_プレゼン資料(Unityはじめるよ～描画のクオリティを上げるコツ編～).pdf)



・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」「第4回 アナログ入出力編」
　可変抵抗を使ってアナログ入力を作る。
　入力電圧を10bitの値として受け取ることが可能。
　アナログ出力にはPWMを使って、擬似的にアナログを表現する。
　時分割で、オン／オフの時間を調節し、擬似的にアナログ動作しているように見せる。

　資料：[第15回_プレゼン資料(アナログ入出力編).pdf](http://monolizm.com/sab/pdf/第15回_プレゼン資料(アナログ入出力編).pdf)



・保坂プレゼン「Scratch（スクラッチ）を使ってゲームを作ってみよう！」
　スクラッチの使い方を紹介。
　ブラウザ上で動作するので気軽に始められる。
　処理逃れを考えることに集中できるため、組み立てるという力をつけられる。
　プログラム入門には本当にオススメ。
　資料：[第15回_プレゼン資料(~Scratch（スクラッチ）を使ってゲームを作ってみよう！~).pdf](http://monolizm.com/sab/pdf/第15回_プレゼン資料(~Scratch（スクラッチ）を使ってゲームを作ってみよう！~).pdf)



・部員さんが持ってきたGearVR体験
　対応しているソフトが豊富。
　本体横にタッチパッドが付いてるので快適に操作できる。
Adobe Creative Cloud 個人プランから法人プランへ乗り換える場合のTips


AdobeCCを個人プランから法人プランへ変更するときの方法がわかりづらく、手順の確認ややり取りに時間がかかってしてしまったのでここに残しておきます。

まず手順としては、
1. 個人向けプランの契約を解除して、
2. 法人向けプランを新たに契約するようなかたちになります。

なのでまずは契約解除のための電話をカスタマーサポートにします。
その際には法人向けに乗り換えたいという意思を伝えましょう。いくらか時間が短くなるかと思います。
後は案内に従って法人向けのプランを契約すれば完了です。
Paperclipで動画をリサイズする

READMEに指定方法が書かれておらず少しハマったのでそのメモ。

例えば、アイコン画像(ここではavator)を幅120pxでアスペクト比を維持したままリサイズするときには [PaperClipのstyleで指定する記号の意味](http://qiita.com/zakihaya/items/8b6f5510871b49870559) にあるように、

```rb
has_attached_file :avatar,
  styles: { 
    thumb: "120x" 
  },
  default_url: "/images/:style/missing.png" 
```

とすることでアスペクト比を維持したままheightを自動的に計算して変換してくれます。

動画(例えば.mp4)をリサイズする場合には、paperclipのprocessorを拡張する形で提供されている [paperclip-av-transcoder](https://github.com/ruby-av/paperclip-av-transcoder) と言うgemで実現できます。しかし、普通に


```rb
has_attached_file :movie,
  styles: { 
    thumb: ["120x", 'mp4']
  },
  default_url: "/movies/:style/missing.mp4",
  processors: [:transcoder]
```

とするとうまくいきません。これはpaperclip-av-transcoderでは内部でffmpeg(またはlibav)を使っていてオプションの指定方法が異なるためです。

次のようにすることで ` -vf "scale=120:-1" ` の指定ができるようになるので、同様のことが実現できます。

```rb
has_attached_file :movie,
  styles: { 
    thumb: {
      format: 'mp4',
      streaming: true,
      convert_options: { 
        output: { vf: "scale=120:-1" }
      }
    },
  },
  default_url: "/movies/:style/missing.mp4",
  processors: [:transcoder]
```
lita で slack attachment を使う

# はじめに
lita-slack 1.6.0 以上で slack attachments を使うことが出来る
> https://github.com/litaio/lita-slack/releases/tag/v1.6.0 
> https://api.slack.com/docs/attachments

# 方法
今回は lita-echo handler を作った
https://github.com/mayok/lita-echo

```ruby:echo.rb
module Lita
  module Handlers
    class Echo < Handler
      route(/^echo\s+(.+)/, :echo, help: {"echo TEXT" => "Echoes back TEXT"})

      def echo(response)
        text = response.matches[0][0]
        target = response.room
        attachment = Lita::Adapters::Slack::Attachment.new(
          text, {
            color: "#36a64f",
            pretext: "Optional text that appears above the attachment block",
            author_name: "Bobby Tables",
            title: "Slack API Documentation",
            title_link: "https://api.slack.com/",
            text: text,
            fields: [
              {
                title: "Priority",
                value: "High",
                short: true
              },
              {
                title: "Environment",
                value: "production",
                short: true
              }
            ]
          }
        )

        robot.chat_service.send_attachment(target, attachment)
      end

      Lita.register_handler(self)
    end
  end
end
```

# まとめ

response.reply ではなく，
robot.chat_service.send_attachment(target, attachment) を使うと出来る



# 雑感
`text = response.matches[0][0]` てかっこ悪いのでなんとかしたい
SwiftLint 0.8.0 アップデート内容まとめ

2月6日にSwiftLint0.8.0がリリースされたのでまとめます。

# 廃止、変更されたもの

## SeverityLevelsConfigの設定

背景として、今までは.swiftlint.ymlファイルでwarningの値のみを設定していた場合、warningの値はデフォルト値から変更されますが、errorの値は変更されない状態でした。
そのため、例えばFileLengthのwarningのみ400から1200に上げてerrorは何もいじらないと、errorはデフォルトの1000が設定されたままになっており、FileLengthが1100の状態でビルドするとwarningには引っかからないのにerrorで引っかかってしまうという現象が起きていました。

しかし今回のアップデートで、warningしか設定していない場合、errorの値は使用されないという動作をするようになりました。

## enabled_rules

opt_in_rulesという名前に変わりました。

# 強化、追加されたもの

## whitelist_rules

SwiftLintのアップデートによって前回Lintを適用したときには採用していなかったルールも適用されてしまい、CIプロセスを破壊してしまう状況を防ぐために作られたものです。

whitelistはdisabled_rules(≒ブラックリスト)やopt_in_rulesと併用することはできません。
whitelistを使用した場合、列挙されたルールのみ適用してコードチェックを行うという動作になります。

プルリクは[こちら](https://github.com/realm/SwiftLint/pull/436)です。

## パフォーマンス改善

ColonRule, LineLengthRule, syntaxKindsByLineのパフォーマンスが改善されました。

## rulesコマンド

`$ swiftlint rules <rule identifier>`
というコマンドを打つと、ルールの概要が表示されるようになりました。

また、identifierを指定しないで`$ swiftlint rules`と打った場合は

* identifier
* opt-inかどうか
* autocorrectコマンドで修正されるルールか
* デフォルトでenabledなのかどうか
* 警告を出すルールなのか、エラーを出すルールなのか、一定の数値に達した時に警告/エラーを出すルールなのか

の値が出力されるようになりました。

## FunctionParameterCountRule

```
description: "Number of function parameters should be low."
```

新しく追加されたルールです。引数の数が6〜8個だと警告に、9以上だとエラーになります。
なので、5個以内に抑えれば警告もエラーも出ません。

## CyclomaticComplexityRule

循環的複雑度ルールでは、ネスト内の関数は別で計算する必要があるのでは、という指摘を受けて修正されました。

## OpeningBraceRule

OpeningBraceRuleに例外が追加されました。if/guard/whileの条件文が複数行に渡る場合はopening braceが次の行になっても構わないというルールに変更されました。

[該当のissue](https://github.com/realm/SwiftLint/issues/355)を見てみると、issue作成者は1つのif文で複数のバインディングやwhereがあるときに、1つの文ごとに改行してインデントを揃えて書くことがあるそうです。
その場合、opening braceをその末尾に持って行くよりも改行した方が読みやすいのではないかという提案をしています。


```swift:従来のルールに則った場合
if
    let blah = blah,
    let foo = blah.foo
    where foo.something {
    // do something
}
```

```swift:こちらの方が読みやすいのでは？
if
    let blah = blah,
    let foo = blah.foo
    where foo.something
{
    // do something
}
```

## メモリ

最大メモリ量が軽減されています。

# バグFix

## ValidDocsRule

偽陽性の修正が入りました。

## TrailingNewlineのautocorrect

行ごとに複数のルール違反を扱えるように、TrailingNewlineのautocorrectに修正が入ったようです。

## CyclomaticComplexityRule

switch文が含まれている時のcomplexityの計算が修正されました。
Windows7 にてproxy設定して pip

社内環境のネットワーク内から、pipを試したがうまく行かない。
proxy設定している環境だからだ。

そこで、環境変数に追記する方法にて試した。

```
C:\Users\whoocus>set http_proxy=http://10.10.10.1:8080

C:\Users\whoocus>pip3 install flask
Collecting flask
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connectio
n aborted.', ConnectionRefusedError(10061, '対象のコンピューターによって拒否されたため、接続できませんでした。', None, 1
0061, None))': /simple/flask/
```

残念ながら失敗。

調べてみると、pipコマンドのオプションとして存在している。

```
C:\Users\whoocus>pip install flask --proxy http://10.10.10.1:8080
Collecting flask
  Downloading Flask-0.10.1.tar.gz (544kB)
    100% |################################| 544kB 835kB/s
Collecting Werkzeug>=0.7 (from flask)
  Downloading Werkzeug-0.11.3-py2.py3-none-any.whl (305kB)
    100% |################################| 307kB 1.3MB/s
Collecting Jinja2>=2.4 (from flask)
  Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
    100% |################################| 266kB 1.9MB/s
Collecting itsdangerous>=0.21 (from flask)
  Downloading itsdangerous-0.24.tar.gz (46kB)
    100% |################################| 49kB 4.1MB/s
Collecting MarkupSafe (from Jinja2>=2.4->flask)
  Downloading MarkupSafe-0.23.tar.gz
Installing collected packages: Werkzeug, MarkupSafe, Jinja2, itsdangerous, flask
  Running setup.py install for MarkupSafe
  Running setup.py install for itsdangerous
  Running setup.py install for flask
Successfully installed Jinja2-2.8 MarkupSafe-0.23 Werkzeug-0.11.3 flask-0.10.1 itsdangerous-0.24
You are using pip version 7.1.2, however version 8.0.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
```

rubyの時もgemがそうであった。
上手く行ったので覚え書き。
Storyboard で指定した画像が表示されないときは Asset Catalog を使うと解決する


# 対象読者
1. Storyboard を使って画面や UI を作っている
2. 画像管理は images フォルダを作ってプロジェクトにドラッグ & ドロップしている
 ![スクリーンショット_2016-02-06_17_32_51.png](https://qiita-image-store.s3.amazonaws.com/0/2609/000ced20-a636-dbd3-70b4-9f4c2d33deb7.png "スクリーンショット_2016-02-06_17_32_51.png")
3. Asset Catalog の存在を知らない

自分のようにこの条件全てに当てはまっている場合は下記の方法で解決できるはずです.

# 画像が表示されない問題
- TabBar や LaunchScreen.storyboard （アプリ起動直後の画面）などに表示したい画像を Storyboard から指定すると, Simulator で画像が表示されない現象にハマった
- 以下のように設定しても Storyboard では画像が表示されるけど Simulator では画像が表示されない
 ![スクリーンショット 2016-02-06 18.03.12.png](https://qiita-image-store.s3.amazonaws.com/0/2609/ef07ea50-638b-8ace-ab91-908984e8d467.png "スクリーンショット 2016-02-06 18.03.12.png")
- ということで Asset Catalog を使うと解決した

# Asset Catalog とは
- xcode5 から追加された画像管理のためのもの
- 画像管理だけでなくテキストファイルや音楽ファイル, 動画ファイルも管理できる代物らしい
参考 [カタログからどんどんアセットが出てくる](http://qiita.com/woxtu/items/41e8dadc26803b722227)

- Assets.xcassets という名前で最初からプロジェクトにセットされている
 ![スクリーンショット_2016-02-06_17_33_07.png](https://qiita-image-store.s3.amazonaws.com/0/2609/505443da-3fe6-c94d-6bf2-fde8e8ae51d0.png "スクリーンショット_2016-02-06_17_33_07.png")

# Asset Catalog を使う
- 使い方は簡単で [Xcode:Asset Catalog の使い方と画像リソース管理について（Xcode 5以降）](http://www.sirochro.com/note/xcode-about-asset-catalog/) などを参考にすればいける
- Asset Catalog を使って画像を追加したら, Storyboard から追加した画像を指定すれば Simulator でも画像が表示されるようになる

# 補足
- images フォルダを作ってそこで画像管理している場合, Storyboard からではなくコードから画像を指定すると表示できる（コードからできていたので Storyboard からでも普通にできると思っていたらハマった）
- とはいえもう Asset Catalog 使えば良いよねっていう感じ
- Asset Catalog に関する参考リンク1 [Xcode5から追加されたAsset Catalog最大のメリット](http://qiita.com/yimajo/items/239eb68265e4ea772484)
- Asset Catalog に関する参考リンク2 [Xcode5から追加されたAsset Catalogの挙動をいろいろ試してみた](http://qiita.com/takabosoft/items/ac4f337a6dea31e95885)
- Asset Catalog に関する参考リンク3 [[iOS] Asset Catalog にまつわる今すぐ使える Tips 集](http://dev.classmethod.jp/smartphone/iphone/asset-catalog-tips/)
jqueryで、formに囲まれてないtype=fileのinputのファイルを取得してajaxで送ることは可能

jQueryで `form` 要素に囲われていない `input[type="file"]` の変更によってファイルの送信を行う際は、以下のような記述をします。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <title>ファイルを送信します君</title>
  </head>
  <body>
    <div>
      <input type="file">
    </div>
    <script>(function() {
  'use strict';

  var UPLOAD_URL = 'http://example.com/upload.cgi';

  function send(file) {
    return new Promise(function(resolve, reject) {
      var req = new XMLHttpRequest();
      var body = new FormData();
      req.open('POST', UPLOAD_URL);
      req.addEventListener('load', function(event) {
        if (req.status === 200) {
          resolve(event);
        } else {
          reject(event);
        }
      });
      req.addEventListener('error', reject);
      body.append('imagedata', file);
      req.send(body);
    });
  }

  $(document).on('change', '[type="file"]', function(event) {
    event.preventDefault();
    var target = event.target;
    var file = target.files[0];
    file && send(file);
    return false;
  });
})();</script>
  </body>
</html>
```
電子工作 > キャラクタディスプレイ > SD1602 > A / K

キャラクタディスプレイの動作を試みている。

http://jsdiy.web.fc2.com/lcd3v/
にある「負電圧を生成して+3.0Vと-1.8Vで動かす」という項目の回路図を見ている。
http://jsdiy.web.fc2.com/lcd3v/LCD_ChargePump_Negative.png

この中で、LCD SD1602側にある A, K というピンが分からない。

調べた。

http://www.toshinkk.co.jp/product/pdf2/SD1602G.pdf
にA, K があった。

- 15 : A : LED Power
- 16 : K : LED Power

アノードとカソードのA,Kなのかは未消化。
少数決のシミュレーション（アイデア）

# 概要

ネットサーフィン的なことをしていると、少数決の記録を見つけました。
http://www.nikoli.com/ja/event/less_game.html

これについて、何か適当なモデリングをすると、うまい具合にシミュレーションができるのではないか、という妄想をしました。
暇な時間があればやってみるのですが、誰かがやってくれると嬉しいので、とりあえずアイデアだけを書いてみます。

# モデルの考え方

当たり前ですが、少数決なので、少ない回答を選ぶことが目的になります。
正直に答えている人が結構いるみたいですが、一般論で考えた場合の多数派が明らかな場合は、逆を引いた方が良いかも、という駆け引きの要素が発生します。
そこで、次のような単純なモデルを考えてみます。

* 各回答者は、各質問に対して、嗜好という0か1の値を持つものとする。
* 少数決の対象は特別偏ってはいない、つまり一般的な嗜好の人がアンケートに答えているものとする。→つまり、嗜好の分布は一般論から統計的に算出される確率に従うものとする。
* 各嗜好は互いに独立であるとする。
* 各回答者は、知識レベル$l \\in (0,1)$を持っており、各質問について、自分の嗜好が多数派か少数派かを知っている確率が$l$であるとする。（ここが結構強い仮定で、この仮定で問題の難易度の概念が無くなっている）
* 質問1の多数派を知っている確率と、質問2の多数派を知っている確率は独立であるとする。他も同じ。
* 知識レベルの対数の分布は、とりあえずガンマ分布とする。__この分布に根拠はない。__
* 各回答者は、次の二種類の戦略をとるものとする：正直者戦略＝多数派・少数派によらず自分の嗜好のみで回答を行う　or　一階少数派戦略＝多数派・少数派を知っている時に限り少数派を選ぶ
* 各回答者は一つの戦略を全ての質問に適用するものとし、いずれかの戦略を選ぶ確率は回答者によらず定数$c$で与えられるとする。

本当は、一階少数派戦略のさらに裏をかくとか、ある程度まで勝ち進んだ人の戦略を想定した高度な戦略みたいなものを考えた方が良いのかもしれません。しかし、正直そこまで複雑な戦略を自分自身があまり考えられないので、みんな自分ぐらいバカだと思うことにして、単純なモデルで考えます。

# 思ったこと

仮にこのモデルで少数決を説明できるとすると、シミュレーションで次のようなことが分かるかもしれません。

* 各問題の回答に関する「本当の統計的な割合」
* 定数$c$や$l$の分布
* 勝ち進みやすい戦略、知識レベル

その昔、一定の確率で決まった回答を出す人を混ぜることにより、答えにくい質問にも素直に答えさせる手法（不倫願望があるかどうか、の調査とか）があった気がしますが、そもそもこういうモデルで、各質問への本当の答え（信念）や戦略みたいなものを推測できると、適当なアンケートから実態を推測できる可能性があるので、結構有意義だと思いました。
しかし、そういう先行研究についてをガチで調査するのは少し躊躇われたので、とりあえずネタとして書いてみました。
シミュレーションは、そのうちちゃんとやる…かもしれません。やってくれる人がいると嬉しいです。