OmniAICreator/Qiita-1.07M huggingface dataset:
Python で matplotlib を試そうとしたら 'cairo.Context' ってナニソレ

# 1. 突然の 'cairo.Context'

```
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax1 = fig.add_subplot(2,2,1)
>>> plt.show()
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
```

　何さこれ... せっかくグラフ書いたりして遊ぼうと思ってたのに...

# 2. わたしの環境

ディストリビューション：4.4.5-1-ARCH
Python：Python 3.5.1

# 3. 解決法は stackoverflow が知っていた

[Python matplotlib Cairo error](http://stackoverflow.com/questions/27749664/python-matplotlib-cairo-error)という記事に同様の例があったのでソレにならってみるとあっさり解決することができた。

- まず python3-pyqt5 をインストールする。

```
# arch の公式リポジトリには python3-pyqt5 ではなく python-pyqt5 としてある。
sudo pacman -S python-pyqt5
```

- matplotlibrc を書き換えるために，ディレクトリを調べる。

```
>>>import matplotlib
>>>matplotlib.matplotlib_fname()
'/usr/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc'
```
- backend : の項目を書き換える。

```text:matplotlibrc
# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.
backend      : qt5agg # ここを書き換えた。もとは backend : gtk3agg
```

- そして...

　できた。やったぜ。
プログラマー1ヶ月目でもわかるwebpayの導入2 ~カスタマーidの取得~ (rails) 

前回は決済をして、ダッシューボードに決済内容が反映されることまで書いたので

今回は決済した情報をDBに保存するところまでやりたいなと思います。

前回のだと

```rails:ターミナル
$ rails new
```

で作ったんですけど

これだとmysql使えないので
(あるかもしれないのですが、1ヶ月目なんでよく知りません。)

```rails:ターミナル
$ rails new　testapp -d mysql
```

でファイルを作ります。

今回は既に前回の1までの内容は完成している前提で話を進めるので
まだ決済できてない、テスト決済してもダッシュボードに決済したデータが出ない
という方は

http://qiita.com/nekononeko_53/items/3ae3856aa0f1a9ddfb5c

こいつを見て元気出してください。


と思ったのですが

-d mysqlをつけると色々やることが増えるので

当時の僕が見てもわかるようにやっぱり最初からやります。
でも、詳しくは書かないので詳しい話は上のURLを見てもらえれば
(でもこれから書くやつを全部そのまま実行すればうまくいくよ。多分。)

```rails:ターミナル
$ rails new　testapp -d mysql
$ cd testapp
```

とりあえずこれでファイルを作ります。

```rails:Gemfile
gem 'webpay'
```

webpayのgemを入れて

```rails:ターミナル
$ bundle install
$ rake db:create
```

rake db:createでデータベースができるんじゃないかなと。

基本的なルーティング、コントローラーは前回の1と同じものを使います。

```rails:config/routes.rb
  get  'products' => 'products#index'
  post 'products/pay' => 'products#pay'
```

```rails:ターミナル
$ bundle exec rails g controller products
```

できたproductsコントローラーに

```rails:app/controllers/products_controller.rb
  def index
  end

 def pay
 webpay = WebPay.new('鍵')
 webpay.charge.create(
   amount: 400,
   currency: "jpy",
   card: params['webpay-token']
)
end
```

```rails:app/views/products/index.html.erb
  <%= form_tag(action: :pay, method: :post) do %>
        <script src="https://checkout.webpay.jp/v3/" class="webpay-button" data-key="鍵" data-lang="ja"></script>
      <% end %>
```

```rails:app/views/products/pay.html.erb
  支払い完了
```

ここまでで前回の1と同じところまで来れているはず。

一応ここまでで決済はできるようになっているはずなのでrails sで確かめてみてください。

そんでもって決済履歴のテーブルみたいなのを作ってそこに課金情報を持たせようという死ぬほどめんどくせーことをしようというのだから

もうやめたい。けどやる。

とりあえず箱でも作る。履歴のやつはhistoryとでも名付けて
```rails:ターミナル
$ bundle exec rails g model history
```

マイグレーションファイルのカラムは適宜作ってください。

今回は課金した情報をダッシュボードで確認できるようにカスタマーidを取得したいと思います。

のでそれに合わせてカラムを作ります。

```rails:db/migrate
  t.string     :customer_id
  t.timestamps #null: falseがついていたら消しとく
```

```rails:ターミナル
$ bundle exec rake db:migrate
```
テーブルが出来てるかチェック

カラムもできたのであとは取得するためのアレを書いていきます

前に書いたproductsコントローラーのpayメソッドに追記と変更をします。

```rails:app/controllers/products_controller.rb
 
 def pay
 webpay = WebPay.new('鍵')
@customer = webpay.customer.create(card: params['webpay-token']) #追記
 webpay.charge.create(
   amount: 400,
   currency: "jpy",
   customer: @customer.id,　＃変更
)
History.create(customer_id:  @customer.id)　＃追記
end
```

これでテスト決済すれば決済が完了して、かつ、historiesテーブルにカスタマーidが記録されてれば成功！！！！！

てか、一応試しているのでうまくいくはず。だよ。

これで一応このシリーズは終わり

でも、もしかしたら定期課金とかも試すかもしれないし

paypal導入とかも試すかもしれないです
(限りなく可能性は低い)

決済機能つけられるとサービスで収益を上げる選択肢が一つ増えるじゃないですか。

みんなでいいwebサービスを作って楽しんでいきましょう！
yumがrockされた際の対処法

【yum実行時に、下記のようなエラーが出力された場合の対処法】
■エラーメッセージ
[root@nova1 ~]# yum install openstack-nova-compute
Loaded plugins: fastestmirror, priorities
Existing lock /var/run/yum.pid: another copy is running as pid 13949.
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory : 132 M RSS (1.4 GB VSZ)
    Started: Tue Apr  5 11:29:56 2016 - 18:42 ago
    State  : Traced/Stopped, pid: 13949

■対処法
下記コマンドで、yum.pidを削除
# rm -f /var/run/yum.pid

■原因
なんらかの理由でyum.pidが削除されず、rockされてしまっていた
BluemixのOSSデータベースサービス「Compose.io」のサポートを使ってみた

Composeつかっててわかんないことがあったら、ヘルプを見たりするのですが、それでもわからないときは素直にあきらめてサポートに聞いてみました。
リアクション的には1、2日ではほぼ確実に帰ってくるので便利っす。

・ログイン後、左側の「？」をクリックして、「Open a ticket」をクリック
![open ticket.png](https://qiita-image-store.s3.amazonaws.com/0/119378/79d4c869-c63b-c810-01aa-ef7cad1b8e6c.png)

・そうするとこんな画面。必要に応じて適宜入力。
![ticket.png](https://qiita-image-store.s3.amazonaws.com/0/119378/70992f3f-1e61-7967-8186-1e0491d9d0b4.png)


・重要度みたいなのはここから選べます。
![ticket2.png](https://qiita-image-store.s3.amazonaws.com/0/119378/0237e7c9-8463-da79-5423-d122bbf25350.png)


・回答はメールでもくるし、このWEB UIでも出来てます。
[C++] new & new(nothrow)

If there are not enough memory when `new` some data in C++, it will have a exception.

Do something like this:

```cpp
long long n = 1LL << 63LL;
int *p = new int[n];
```

Then you will get a exception like this:

```
libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
```

But if you use the `new(nothrow)`, instead of exception, you will get a null pointer.

```cpp
long long n = 1LL << 63LL;
int *p = new(nothrow) int[n];
if (p == nullptr) cout << "Null Pointer" << endl;
```

Output: 

```
Null Pointer
```
ZabbixでSSL証明書有効期限を監視する

Zabbixサーバにスクリプトを配置してSSL証明書の有効期限を取得します。

# スクリプトの配置
SSL有効期限取得するスクリプト (`ssl-cert-check.sh`)をZabbixサーバに配置します。通常は`/usr/lib/zabbix/externalscripts`以下に配置すると思いますが念のため確認します。

```text:/etc/zabbix/zabbix_server.conf
ExternalScripts=/usr/lib/zabbix/externalscripts
```

```text:ssl-cert-check.sh
#! /bin/sh

SERVER=$1
PORT=$2
TIMEOUT=25
/usr/lib/zabbix/externalscripts/timeout $TIMEOUT /usr/lib/zabbix/externalscripts/ssl-cert-check -s $SERVER -p $PORT -n | sed 's/  */ /g' | cut -f6 -d" "
```

その他に`ssl-cert-check`と`timeout`も同じ場所に配置します。以下のURLから持ってきます。

- ssl-cert-check : http://prefetch.net/code/ssl-cert-check
- timeout : http://www.pixelbeat.org/scripts/timeout

`ssl-cert-check`は一部修正します。

```text:ssl-cert-check
<             ${PRINTF} "%-47s %-12s %-12s %-4s %-30s\n" "$1:$2" "$3" "$MIN_DATE" \|days="$5" 
---
>             ${PRINTF} "%-47s %-12s %-12s %-4s %-30s\n" "$1:$2" "$3" "$MIN_DATE" "$5" 
```

試しに実行してみます。

```
[root@zabbix externalscripts]# ./ssl-cert-check.sh www.google.co.jp 443
71
```

作成したスクリプトに実行権限付けるのを忘れずに。

# テンプレートの作成
Zabbixの「設定」->「テンプレート」でテンプレートの一覧が表示され、右上の`テンプレートの作成`から作成できます。

テンプレート名と適切なグループを設定し、`追加`します。

## アイテム
SSL証明書有効期限を監視するためのアイテムを作成します。作成したテンプレートのアイテムを選択し`アイテムの作成`から作成します。
下記以外の設定は状況に応じて設定してください。

- 名前：(ご自由に)
- タイプ：外部チェック
- キー：ssl-cert-check.sh["{HOST.CONN}","443"]

## トリガー
期限切れが近づいたらアラートがなるように設定します。同じようにテンプレートのトリガーを選択し`トリガーの作成`から作成します。
条件式は一例ですのでその他の設定と合わせて状況に応じて設定してください。

- 名前：(ご自由に)
- 条件式 (例)：{SSL cert check:ssl-cert-check.sh["{HOST.CONN}","443"].last(0)}<31

## グラフ
必要であれば設定します。

# 複数のSSL証明書が設定されている場合
サーバによっては複数のSSL証明書が設定されている場合があると思います。その場合は、テンプレートのアイテムを「複製」して、`ssl-cert-check.sh["{HOST.CONN}","443"]`の`{HOST.CONN}`を直に指定した設定を追加することで取得しています。ポートが443以外であればそれも指定します。トリガーなども「複製」して設定すると良いと思います。

# SSL証明書のみ監視したい場合
業務上稀にサーバは管理外だけどSSL証明書は管理している場合があります。この場合ホストごとの設定追加はできないので、現状はZabbixサーバにアイテムを追加しています。

「設定」->「ホスト」からZabbixサーバを選択します。アイテムやトリガーの設定方法は、複数のSSL証明書が設定されている場合と同じです。


# 参考
- [ZabbixでSSL証明書の有効期限を監視する - Qiita](http://qiita.com/ma3ki/items/302205c0402c3746c9ff)
- [ZabbixでSSL証明書の有効期限をチェックする | 補充.info](http://blog.ho10.info/2011/02/zabbixssl.html)
- [Zabbix 2.0でSSL証明書の有効期限をチェックする - めもおきば](http://d.hatena.ne.jp/nekoruri/20130404/zabbixsslcert)
[数学][JS] 最小二乗法を使ってトレンドラインを計算する


Google Spreadsheetなどで「トレンドライン」を引く際に利用される計算。
全データから、誤差の2乗が最小になるようにラインを引く方法・・らしい。

計算式は以下。（[Wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95)から引用）

```math
a = \frac{n\sum_{k=1}^{n}x_ky_k - \sum_{k=1}^{n}x_k\sum_{k=1}^{n}y_k}{n\sum_{k=1}^{n}x^2_k - (\sum_{k=1}^{n}x_k)^2}
```

```math
b = \frac{\sum_{k=1}^{n}x^2_k\sum_{k=1}^{n}y_k - \sum_{k=1}^{n}x_ky_k\sum_{k=1}^{n}x_k}{n\sum_{k=1}^{n}x^2_k - (\sum_{k=1}^{n}x_k)^2}
```

上記 $a$, $b$ を算出し、 $y = ax +b$ という形にして利用します。

なお、計算式の導き方はこちらが参考になりました。（[最小二乗法](http://akita-nct.jp/yamamoto/lecture/2007/5E_comp_app/interpolation/interpolation_html/node4.html)）
ただ、例に出されているデータと、最後に

>最初に示したのデータについて計算してみると

で表示されている数値がどうやら違うっぽいので注意です。（別のサイトでデータ入れてみたら違う数値が出た）
また、最後に導き出されている数式もWikipediaに載っているのと若干違いました。

```js
(function (ns) {
    'use strict';

    function sum(data, func) {
        var val = 0;
        for (var i = 0; i < data.length; i++) {
            val += func(data[i]);
        }
        return val;
    }

    function leastSquare(data) {

        var N = data.length;

        var sumX = sum(data, function (item) {
            return item[0];
        });

        var sumX2 = sum(data, function (item) {
            return item[0] * item[0];
        });

        var sumY = sum(data, function (item) {
            return item[1];
        });

        var sumXY = sum(data, function (item) {
            return item[0] * item[1];
        });


        var a, b;

        var denominator = (N * sumX2) - Math.pow(sumX, 2);

        var molecule1 = (N * sumXY) - (sumX * sumY);
        a = molecule1 / denominator;

        var molecule2 = (sumX2 * sumY) - (sumXY * sumX);
        b = molecule2 / denominator;

        return {
            a: a,
            b: b
        };
    }

    ns.leastSquare = leastSquare;

}(window));
```

これを使って、以下のように計算します。

```js
var data = [
    [1.2, 2.2],
    [2.1, 3.8],
    [3.3, 5.6],
    [4.1, 7.1],
    [5, 8.8]
];

var test = leastSquare(data);
console.log(test); // => Object {a: 1.7142239515780355, b: 0.1173367920449656}
```


## 参考

- [データを入れると計算してくれるサイト](http://www.claygear.com/webservice/lmscalc)
【解決済】「TypeScript を使用した HTML アプリケーション」でvb.netを使うには

# 環境
- Visual Studio Community 2015
- 新規作成＞プロジェクト＞TypeScript を使用した HTML アプリケーション

# 質問
VSでwebアプリケーションの開発を行うため、以下を参考に「TypeScript を使用した HTML アプリケーション」で新規プロジェクトを作成しています。
http://qiita.com/laco0416/items/3d8083647c8f70a68597

webapiから呼び出す予定のサーバ側の処理はvb.netで既にあるので、Controllerもvb.netファイルで作成したいのですが、「追加＞コントローラー」で作成するとC#のファイルが作成されてしまいます。

vb.netファイルで作成する方法・設定はあるのでしょうか？

※dll参照等、c#からvb.netのソースを呼び出すことは可能かとは思いますが、開発効率やメンバの能力を考えるとできればvb.netで統一したいです。
fence_virshを使ってみる

# 経緯
Pacemakerで利用可能なlibvirtのゲスト用のSTONITHにはglueに含まれるexternal/libvirtがありますが、今後は、fence_agentに含まれるfence_virshが主流となると思われる為、確認してみました。

# 環境
KVMホスト(SL7.0:アドレスxxx.xxx.xx.x)とKVMゲスト(CentOS7:ct72-01,ct72-02)。
それぞれのゲストにはPacemaker1.1系をインストールして、クラスタを構成可能なようにしておきます。
(fence_agentのインストールもお忘れなく...)

# CLIファイルでの設定例
PacemakerでCLIファイルとして設定する場合には以下のような設定例になります。
pcmk_host_listで対象となるゲストを指定してipaddrで接続先KVMホスト(xxx.xxx.xx.x)を指定します。
また、今回は、KVMホストへの接続ユーザとパスワードをlogin/passwdパラメータで指定します。

```
property no-quorum-policy="ignore" \
        stonith-enabled="true" \
        startup-fencing="false"
(snip)

primitive prmStonith_libvirt01 stonith:fence_virsh \
        params pcmk_host_list="ct72-01 ct72-02" action=reboot ipaddr=xxx.xxx.xx.x login=XXXX passwd=XXXX \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval=60s \
        op stop interval="0s" timeout="60s" on-fail="ignore"
(snip)
```

# 単一動作の確認
fence_virshを直接実行して動作を確認することが出来ます。

```
##ゲストリストの取得
[root@ct72-01 ~]# fence_virsh -o list   -a "xxx.xxx.xx.x" -l "xxx" -p "xxx" 
ct72-01,
ct72-02,
(snip)

##ゲスト状態の取得
[root@ct72-01 ~]# fence_virsh -o status  -a "xxx.xxx.xx.x" -l "xxx" -p "xxx" -n ct72-02
Status: ON

##reboot(フェンシング)の実行
[root@ct72-01 ~]# fence_virsh -o reboot  -a "xxx.xxx.xx.x" -l "xxx" -p "xxx" -n ct72-02
Success: Rebooted

```

# ゲストをUUID指定する場合
ゲストをuuid指定する場合は、fence_virshのコマンドラインでは、-nでuuidを指定するだけです。

```
[root@ct72-01]#  fence_virsh -o reboot  --a "xxx.xxx.xx.x" -l "xxx" -p "xxx" -n a63f823f-1f40-4da2-a0d9-2b3ede88de5d
Success: Rebooted

```
あらかじめ、KVMホスト側で対象ゲストのUUIDを確認しておいて指定してください。

```
[root@kvm-host ~]# virsh domuuid ct72-02
a63f823f-1f40-4da2-a0d9-2b3ede88de5d

```
CLIファイルで指定する場合は、pcmk_host_listではなく、pcmk_host_mapパラメータを利用して、"ゲスト名1:uuid;ゲスト名2:uuid"のように指定します。
以下に例を示します。

```
primitive prmStonith_libvirt01 stonith:fence_virsh \
        params pcmk_host_map="ct72-01:02c7772d-ed60-451f-b4dd-75dee575a170;ct72-02:a63f823f-1f40-4da2-a0d9-2b3ede88de5d" action=reboot ipaddr=192.168.40.1 login=root passwd=nttdata \
        op start interval="0s" timeout="60s" on-fail="restart" \
        op monitor interval=60s \
        op stop interval="0s" timeout="60s" on-fail="ignore"

```

以上です。
CircleCIでPostgreSQL 9.3を使う


CircleCIのPostgreSQLのデフォルトバージョンは9.4
バージョン9.3でテストしたいときは、`circle.yml`に以下を追加する。9.4入れた後に9.3も入れている。

```
dependencies:
  pre:
    - sudo service postgresql stop && sudo apt-get remove -y
      postgresql-9.4 && sudo apt-get update; sudo apt-get install -y
      postgresql-9.3 postgresql-contrib-9.3
    - sudo sed -i "s/\port = 5433/port = 5432/"
      /etc/postgresql/9.3/main/postgresql.conf
    - sudo cp /etc/postgresql/9.4/main/pg_hba.conf
      /etc/postgresql/9.3/main/pg_hba.conf
    - sudo service postgresql restart
    - sudo -u postgres createuser ubuntu -d --superuser
    - createdb circle_test
    - createdb ubuntu
```

このタスクの実行時間は、40秒でした。

[FAQ](https://circleci.com/docs/faq/)にある、Dependencies内の`How do I use postgres 9.3?`の情報を転載
BigQuery | コンソールで100行より多く表示する


# 解決

-n オプションを指定すれば、その行数まで表示してくれる。

```bash
$ bq query -n 1000 'SELECT * FROM dataset.table' # 1000行まで表示
```

# 問題

普通に書くと 100行までしか表示できない。

```bash
$ bq query 'SELECT * FROM dataset.table'
```

# 環境

- BigQuery CLI 2.0.2z



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
shUnit2を使う

参考：http://a4p.me/1157/
公式ドキュメント：https://shunit2.googlecode.com/svn/trunk/source/2.1/doc/shunit2.html#quickstart

# インストール

https://code.google.com/archive/p/shunit2/downloads からtgzを落としてきて解凍する。
その後、適当なディレクトリに移動すればOK。

# サンプルを動かしてみる

```bash
cd shunit2-2.1.6/examples/
./equality_test.sh
```

```bash:output
testEquality

Ran 1 test.

OK
```

テストの中身はこう。

```bash:examples/equality_test.sh
#! /bin/sh
# file: examples/equality_test.sh

testEquality()
{
  assertEquals 1 1
}

# load shunit2
. ../src/shunit2
```

# 試しにテストを作ってみる

テスト対象コード。

```bash:target.sh
#!/bin/sh

echo "hello shUnit2"
```

テストコード。

```bash:target_test.sh
#!/bin/sh

testEcho()
{
  result=`./target.sh`
  assertEquals \
    "the result of '${result}' is wrong." \
    "hello shUnit2" "${result}"
}

# load and run shUnit2
. shunit2-2.1.6/src/shunit2
```

## 実行する

```bash
chmod +x target.sh
chmod +x target_test.sh

./target_test.sh
```

```bash:output
testEcho

Ran 1 test.

OK
```
他業種からスマホアプリのプログラマに鞍替えする人へ


##はじめに

僕のように他業種からプログラマに鞍替えする人になにかお伝えできたらと思って書きました。

##想定する層

* 籍を置いていた業界ではベテランと呼ばれる領域にいながらも、他のことがやってみたくなった
* プログラム自体は独学で書いているけど、自信がいまいちもてない
* 独学で勉強しようと技術書を買ったけど、挫折した人

##技術書の選び方

最初から「Objective-C入門」や「Swift入門」や「Java入門」というプログラム言語にフォーカスした入門書は買わないほうがいいと思います。
この手の本はプログラムの基礎がわかっていないと、序盤で力つきることが多いです、経験上。

じゃあ、どんな本がいいのか。
まずはチュートリアル形式になっていて、プログラムを書くことで実際にシミュレーターや実機で動かすことができる本がいいと思います。
動いているところを見ることができる、これ正義。

[絶対に挫折しない iPhoneアプリ開発「超」入門【iOS6対応】](http://www.amazon.co.jp/%E7%B5%B6%E5%AF%BE%E3%81%AB%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%AA%E3%81%84-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80%E3%80%90iOS6%E5%AF%BE%E5%BF%9C%E3%80%91-%E9%AB%98%E6%A9%8B-%E4%BA%AC%E4%BB%8B-ebook/dp/B00H372KOM/ref=sr_1_21?s=books&ie=UTF8&qid=1459401909&sr=1-21&keywords=ios+%E3%82%A2%E3%83%97%E3%83%AA+objective-c)

僕はこの本の書籍版を会社から貸してもらって勉強しました。
分厚かったので大変でしたが、1週間くらいで一通り読み終えてサンプルも書けました。
Swiftはこまめにバージョンアップがかかって、仕様が変わることがあるので、書籍のサンプルコードが動かない！なんてことが普通にあります。
購入したらなるべく早く消化しましょう。

すでに自分でプログラムを書いている人には一歩先に進むための本として、リーダブルコードがおすすめ。

[リーダブルコード](http://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Dustin-Boswell/dp/4873115655/ref=sr_1_1?ie=UTF8&qid=1459761181&sr=8-1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB+%E3%82%B3%E3%83%BC%E3%83%89)

僕は電子書籍がセールになっていた時に購入しました。
わかりやすくて、読んでて楽しいです。

##先駆者のコードを読み漁る

身近にスマホアプリのプログラマがいれば（先輩など）、その人の書いたコードをとにかく読みましょう。
ある程度読めるようになったら[AFNetworking](https://github.com/AFNetworking/AFNetworking)、[Alamofire](https://github.com/Alamofire/Alamofire)など、有名どころのライブラリのコードを読んでみましょう。

コードリーディング、楽しいですよ。

##勉強会に参加する（＆発表する）

いろいろな勉強会が開催されているので、興味のあるものはどんどん参加しましょう。
コミュニティができあがってしまっているような勉強会では、場違いかなーと思ってしまうこともあるかもしれませんが、その場で見聞きしたことは自分の糧になりますから、積極的に交流しましょう。

「たくさんの人がいると疲れてしまう」「作りたいものがあるけど、家ではだらけてしまう」、そんなあなたには、もくもく会がおすすめです。
もくもく会とは、簡単に言ってしまうと、「各自勝手に作りたいもの作ろう。悩んだら周囲の人に聞きましょう」といった趣旨の勉強会です。
もくもく会ベースで有志がLTする時間を設けているパターンもありますね。

僕は下記のもくもく会に参加したことがあります。
[iOS馬場 #ios_baba](http://iosbaba.connpass.com/)
[Swiftビギナーズ倶楽部](https://swift-beginners.doorkeeper.jp/)

どちらももくもく会＆LTがあるので、最新の技術を追いつつ、自分のやりたいことをやれるので、楽しかったです。

##前職の経験を活かす

これは前職の内容によるとは思うのですが、必ず活かせるものがあります。
僕は印刷系の仕事で進行管理をやっていたので、スケジュールの立て方、工数見積もり、顧客との打ち合わせなど、いろいろと活かせているところがあると思います。
自分のできることを物怖じせずアピールするところから始めてみると、とっかかりがつかめるかと思います。

##おわり

薄い内容ですが、参考になれば。
良きプログラマライフを！
職場用にtwitter風メモ帳作った

## はじめに
私はTwitterを自分用のメモツールとして使うことがあります。
タイトルなんて考えず、必要か不要かすら考えず気軽にメモを取れるので便利です。

職場でもこんなノリでメモを取りたいと思ったことはありませんか？私はしょっちゅう思います。
さすがに業務内容をツイートするわけにはいきませんので、twitter風メモ帳はないかなーと探していたのですが、いまいちしっくりくるのがありません。

というわけで、作りました。

## twitter風メモ帳の紹介
作ったといっても、[かんたんMarkdown](https://tatesuke.github.io/KanTanMarkdown/)をちょこっとだけ改造しただけです。適当改造なので名前も付けていません。

以下のURLにサンプルがあります。
http://tatesuke.github.io/KanTanMarkdown/temp/qiita_tweet/ktm-tweet.html

> ![初期画面.png](https://qiita-image-store.s3.amazonaws.com/0/29682/96a92415-7a8c-5b9c-f250-8bbe7dbc23a1.png)

### つぶやく
画面を開いたら右上の「編集／閲覧」ボタン（または``ESC``キー）を押します。すると、左にテキストエリア、右にプレビューという画面構成になります。

> ![編集画面切り替え.gif](https://qiita-image-store.s3.amazonaws.com/0/29682/ee20241a-eae3-4e5c-75f3-025908ace98b.gif)


左のエリアに何か入力して``Ctrl + Enter``を押してください。つぶやきが右のプレビューに反映されます。

> ![つぶやく.gif](https://qiita-image-store.s3.amazonaws.com/0/29682/e3cee00e-1224-79cc-26e9-329a72b73b69.gif)


### Markdown記法
つぶやきはMarkdown記法を採用しています。箇条書きやテーブルなどそのまま使えます。

例

```
* 箇条書き
* 箇条書き

テーブル | テーブル
--------|---------
テーブル | テーブル
```

> ![markdown.png](https://qiita-image-store.s3.amazonaws.com/0/29682/cf3c560e-6b8f-7bae-f1a0-a23c0e384917.png)


### 添付ファイル
かんたんMarkdownがベースなので、ファイルを添付できます。添付ファイルを画面にドラッグアンドドロップするだけです。画像はそのままimgタグで表示できますし、画像以外でもダウンロード用のリンクを作成できます。

> ![添付ファイル.gif](https://qiita-image-store.s3.amazonaws.com/0/29682/dec9c137-7183-fa62-0a0a-e8c25592d0c4.gif)

ここで大事なのは、ファイルへの参照を張っているのではなく**ファイルそのものを埋め込んでいる**ことです。なので、一度添付してしまえば元のファイルは捨ててしまってもよいです。

### Markdown編集
つぶやきはMarkdownテキストに随時追記しているだけです。下部のMarkdownタブから直接編集することも可能です。


### レイアウトは自由
CSSタブでCSSをいじればお好みのレイアウトにカスタマイズ可能です。

### 閲覧
じっくり読み返したい場合は、再び「編集／閲覧」ボタンを押せばテキストエディタを隠すことができます。


### 保存
自動保存はされないので右上の「保存」ボタンから保存します。
そのままでは上書き保存ができなくて面倒です。そんなときは[ktmsaver](http://tatesuke.github.io/KanTanMarkdown/ktmsaver-beta/ktmsaver-beta.html)を導入することで上書き保存も可能になります。


## 関連記事
> 完全に単一のHTMLファイルで動作するMarkdownエディタ作った
> http://qiita.com/tatesuke/items/225b51b270faf8b10923
RedHat Developer Program で使える範囲

(参考訳です。この記事を参照して損害を被っても保証はありません)

http://developers.redhat.com/faq/ によれば以下のとおり:

> the Red Hat Red Hat Developer Program is intended for individual developer-use only. Integration, test and production environments will require a paid subscription.

参考訳 「開発者サブスクリプションは個々の開発者の利用のみを意図したものである。統合、テスト、本番環境用には有料のサブスクリプションが必要。」

実際に合意する契約である、http://developers.redhat.com/terms-and-conditions/ によれば:
>you will be using the Red Hat Subscriptions(s) for development purposes only, and Red Hat is relying on your representation as a condition of our providing you access to the Subscription(s). If you use the Red Hat Subscriptions for any other purposes, you are in violation of Red Hat’s Enterprise Agreement set forth below and are required to pay the applicable subscription fees, in addition to any and all other remedies available to Red Hat under applicable law. Examples of such violations include, but are not limited to,
> 
> - using the services provided under the Program for a production installation,
> - offering support services to third parties, or
> - complementing or supplementing third party support services with services received under the Program.

参考ざっくり意訳「
あなたはRed Hat サブスクリプションを開発用途のみで使い、Red Hat はこの表明に基づいてサブスクリプションを提供します。この用途以外に使用した場合は Red Hat の Enterprise Agreement に抵触するため、該当する料金および損害額を支払う必要があります。以下に違反の例 (この限りではありません) を示します:

- 本番サービスでの使用
- 第三者へのサポートの提供
- 第三者のサポートサービスによる補完

」

Production Licences は 日本語版があります:
http://www.jp.redhat.com/licenses/Enterprise_Agr_Japan.pdf


----
結局よくわからないな……

「for individual developer-use only」「for development purposes only」って、本番サービスにむけた開発で使っていいのかどうかわからん。勉強用ならいいとして、単体テストまでだったらいいのか?

Microsoft, IBM、Oracleなどなど「開発者ライセンスまとめ」があるとうれしい。
RubyをインストールせずにdockerでGitHub Wikiのプレビューと開発環境を作るメモ


## はじめに

GithubではプロジェクトごとにWikiページを持てるようになっています。
でもブラウザから直接GitHubのサイトを開いてWikiを編集しちゃうと
すぐに公開されちゃうんですよね。

やっぱり実際に表示されるページをブラウザで確認しておきたい。
特にすでに公開済みのWikiページを編集するときは確認しておかないと不安。

  * 手早くGitHub Wikiページをプレビューしたい
  * でもgollum(rubyも)を用意するの面倒

でも我らにはdockerがあるじゃないか :smirk_cat: 
ということでサクッとプレビュー環境作ります。

dockerとdocker-machineがインストール済みなら数分で出来ます。

関連記事：[RubyをインストールせずにdockerでGitHub Pagesのプレビュー環境を作るメモ](http://qiita.com/yamamoto-febc/items/8c5b50acb4b6075ee15d)


## 前提条件

* dockerとdocker-machineが利用可能であること
  (今回はドライバにvirtualboxを利用)

* docker-machineにて`default`ホストが作成されていること
  :information_source: もし作成されていない場合は以下コマンドで作成しておいてください。
  
```
docker-machine create -d virtualbox default
```

## 手順

1. Github WikiページのGitリポジトリをクローン
2. Docker、Docker-Composeの設定ファイル作成
3. Gollumコンテナ起動

## 手順(それぞれの詳細) 

### 1. Github WikiページのGitリポジトリをクローン

Wikiページを作成するGithubのプロジェクトを開きます。

上部のメニューから`Wiki`を選択すると、Wikiページが開きます。
右側にWikiページのGitリポジトリのURLが表示されていますのでこれをコピーしておきます。

![Home_·_yamamoto-febc_docker-machine-sakuracloud_Wiki.png](https://qiita-image-store.s3.amazonaws.com/0/20668/51ed9d32-6fe8-c601-368e-0e89170369ff.png "Home_·_yamamoto-febc_docker-machine-sakuracloud_Wiki.png")


コピーしたらコンソールで以下コマンドを実行しクローンします。

```bash
git clone [コピーしたWikiページのGitリポジトリURL]
```

:bangbang: **クローン先のディレクトリはカレントユーザーのホームディレクトリ配下にしてください。**:bangbang: 
  これは、DockerMachine + virtualboxの場合、ホームディレクトリ配下であれば
  自動的にDockerMachineで作ったホストとファイル共有されるからです。




参考：GitHub Wikiページのクローン方法については[こちら](http://tech.admax.ninja/2014/10/08/how-to-write-wiki-of-github/)が読みやすかったです。
> [【GitHub】GitHubのWikiを書く](http://tech.admax.ninja/2014/10/08/how-to-write-wiki-of-github/)



### 2. Docker、Docker-Composeの設定ファイル作成

Gollum用のDockerコンテナの準備を行います。
直接`docker run`を実施すればDocker-Composeは不要なのですが、
オプション指定などが楽なため今回はDocker-Composeを利用してDockerコンテナを起動します。

```bash

# 1.でクローンしたディレクトリへ移動
cd [1.でクローンしたディレクトリ]

# Dockerfile作成(内容は下記参照)
vi Dockerfile

# docker-compose.ymlの作成(内容は下記参照)
vi docker-compose.yml

```

  * Dockerfileの内容

```Dockerfile
FROM ruby
RUN apt-get -y update && apt-get -y install libicu-dev
RUN gem install gollum
RUN gem install github-markdown
RUN gem install redcarpet org-ruby
VOLUME /wiki
WORKDIR /wiki
CMD ["gollum", "--port", "80"]
EXPOSE 80
```

:point_right: `gem install github-markdown`がポイントです。

 * docker-compose.ymlの内容

```docker-compose.yml
version: '2'
services:
  gollum:
    build: .
    ports:
      - "80:80"
    volumes:
      - $PWD:/wiki
    command: ["gollum", "--port", "80" , "--allow-uploads" ]
```


### 3. Gollumコンテナ起動

ここまできたら以下コマンドでGollumコンテナを起動してみましょう。
起動にはdocker-machineで作成された`default`マシンを使います。


```bash

# defaultマシンを利用するように環境変数設定
eval $(docker-machine env default)

# docker-composeでコンテナ起動
docker-compose up -d
```

起動しましたか？

まずはdocker-machineのIPアドレスを確認します。

```bash
docker-machine ip default
```

IPを確認したらブラウザで以下URLを表示してみましょう。

http://[確認したIP]/

![kobito.1459818820.583454.png](https://qiita-image-store.s3.amazonaws.com/0/20668/57d5c404-0ae9-4806-40c0-8290f2a0f7b1.png "kobito.1459818820.583454.png")


無事表示されましたね？

ブラウザ上で編集するとgitコミットもされます。
ガンガンWikiページを作成しましょう。


### 仕上げ(公開)

ある程度作成できたらGithubへpushすればGithub上のWikiページに反映されます。

```bash
git push origin master
```

以上です。簡単ですね!
SphinxでLaTeXを用いたPDFで出せない文字を強引に出す


丸付き数字とかミリの合成文字とか括弧付き株式会社を出さなきゃいけない事態になった時の対処。
下記の方法は、今回Windows環境で揃っているから取れた対処な気がしています。

LaTeXで機種依存文字を出すために取った方法は、以下の2つ。

* LaTeXとLaTeX以外でreSTの記述を分ける
* LaTeX用の記述は、otfパッケージを使ったLaTeXの命令をreSTに直接記述する

## LaTeXとLaTeX以外でreSTの記述を分ける
Sphinxのonlyディレクティブを使って **latex** と **not latex** を分け、LaTeXのotfパッケージを適用して、LaTeXの命令を直接記述する。

まず、conf.pyでLaTeXのプリアンブルにotfパッケージを追加する。

```py:conf.py
latex_elements = {
'preamble': r'''
\usepackage{otf}
''',
（以下、省略）
}
```

その上で、reSTに以下のように記述する。

```rst
.. only:: not latex

  ①㍉

.. only:: latex

  \ajMaru{1}\ajLig{ミリ}
```

この他にも出したい機種依存文字があったので、CID番号を指定した記述もしている。

今回の方法は、やりたいことは実現できているけど、方法が強引で限定された環境でしか使えなそうなのが気になってる…。
スペース区切りで入力される値をvectorに読み込む

```helpers.hpp
#include<string>
#include<sstream>
#include<vector>
using namespace std;
vector<string> split(const string &s,char d){
    vector<string> r;
    size_t c=0,f;
    while((f=s.find_first_of(d, c))!=string::npos){
        r.push_back(string(s,c,f-c));
        c=f+1;
    }
    r.push_back(string(s,c,s.size()-c));
    return r;
}
template <typename T> vector<T> getValues(){
    string s;
    getline(cin,s);
    vector<string> v=split(s,' ');
    vector<T> r(v.size());
    for(int i=0 ; i<v.size() ; ++i){
        stringstream S;
        S<<v[i];
        S>>r[i];
        S.clear();
        S.str("");
    }
    return r;
}
template <typename T> void eraseValue(vector<T>&v,const T&d){
    v.erase(remove(v.begin(),v.end(),d),v.end());
}
```
Thymeleafを使ったviewのあれこれ

##viewを表示させる

```lang:controller

@Controller
@EnableAutoConfiguration
public class DemoController {
    @RequestMapping("/")
    public String home() {
        return "index";
    }

```
viewの作成場所はresources/templatesの下。

```index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>title</title>
</head>
<body>
hello world!
</body>
</html>

```



##viewをテンプレートパーツとして使う

```common.html
<div th:fragment="header (title)">
    共通ヘッダー
</div>
```

```index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>title</title>
</head>
<body>
<div th:include="common :: header('引数')"></div>
hello world!
</body>
</html>

```
`<div th:include="common :: header('引数')"></div>`で
common.htmlを呼び出せる。

##viewでのeach

もらったlistをまわしてひとつずつ表示する際など。

```
<tr th:each="girl: ${girls}">
      <td th:text="${girl.name}">みなみ</td>
      <td th:text="${girl.age}">20</td>
      <td th:text="${girl.address}">東京</td>
</tr>
```

###viewでのswicth文

```
<td th:switch="${girl.age}">
      <p th:case ="19">うし年</p>
      <p th:case ="20">ねずみ年</p>
      <p th:case ="21">いのしし年</p>
</td>
```

###viewでのif文

```
<p th:if="${girl.age lt 20}">お酒は禁止です！</p>
```

girl.ageが20より小さい時のみ「お酒は禁止です！」を表示。
20以上の時は`<p>…</p>`ごと消える。

お酒が飲める場合もメッセージを表示したい時は以下のようにする。

```
<p th:text="${girl.age lt 20}? 'お酒は禁止です！' : 'お酒が飲めます！'"/>
```
[Thymeleafのif文で使う比較演算子の使い方](http://qiita.com/narikei/items/c4780d6bb69902380136)より
GUIアプリに日本語入力が可能なイメージ作った

参考: @syuiさんの[DockerからGUIアプリとWineアプリを使う方法 - Qiita](http://qiita.com/syui/items/b43ba220d9cd1e2fb74f)

## 日本語入力対応

* 既に日本語入力ができている ubuntu20.04上でこのdockerイメージを使うことを想定

```rb:run.sh
docker run -it --rm \
  -e XMODIFIERS \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v `pwd`:/home/ubuntu/ \
  tukiyo3/gui
```

* [tukiyo3/gui](https://hub.docker.com/r/tukiyo3/gui/)

```bash:firefox起動
sudo pkdadd.sh firefox
firefox
```

## /usr/local/bin/pkdadd.sh

```sh:pkdadd.sh
apt-get update -qq \
&& apt-get install -yq $@ \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
```

* これを使ってパッケージをインストールすると容量がふくれなくて良いかと。

## Dockerfile

* [Dockerfile](https://github.com/tukiyo/dockerimage-ja/blob/master/16.04/Dockerfile)

```rb:Dockerfile
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND noninteractive

RUN echo 'apt-get update -qq && apt-get install -yq $@ && apt-get clean && rm -rf /var/lib/apt/lists/*' > /usr/local/bin/pkdadd.sh &&\
    chmod +x /usr/local/bin/pkdadd.sh

# japanize
RUN \
    # set timezone
    ln -s -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime &&\
    dpkg-reconfigure tzdata &&\
    pkdadd.sh fonts-takao sudo &&\
    # generate locale
    locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8

# create user ubuntu. uid:gid=1000:1000
ENV USER ubuntu
ENV HOME /home/${USER}
RUN export uid=1000 gid=1000 &&\
    echo "${USER}:x:${uid}:${gid}:Developer,,,:${HOME}:/bin/bash" >> /etc/passwd &&\
    echo "${USER}:x:${uid}:" >> /etc/group &&\
    echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers &&\
    install -d -m 0755 -o ${uid} -g ${gid} ${HOME}
WORKDIR ${HOME}

# X
ENV DISPLAY :0.0
VOLUME /tmp/.X11-unix
VOLUME ${HOME}
USER ${USER}

# add packages
# RUN sudo pkdadd.sh firefox

#CMD /usr/bin/firefox
```



----

```sh:Dockerfile
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND noninteractive

RUN dpkg --add-architecture i386
RUN apt update
RUN apt install -y wine32 \
                   winetricks \
 && apt-get clean
ENV WINEARCH=win32
RUN winecfg

ENV DISPLAY=:1
```
PHPでPDFファイルからOCR処理をしてみる

雛形に沿ったPDFファイルを読み込んで、特定の場所の文字列を文字認識で取得する。
というアプリケーションを作りたかったので、忘備録代わりに。

普通にググるとImageMagick+GhostScriptが大多数でした。
一度試してみましたが、OCR処理を通すために必要な解像度まで上げるとCPUが悲鳴を上げます。
今回はWebサービスへの組み込みも考えているので、もっと軽量にしたい・・・
なので、LinuxコンソールアプリのpdfimagesとGoogleオープンソースOCRエンジンのTesseract-OCRを組み合わせてみました。

## 環境
- centos6
- php
- composer
- imagemagick
- pdfimages
- Tesseract-OCR

## 準備
```bash.sh
yum install imagemagick-devel poppler-utils tesseract-devel //要epel
composer require waarneembemiddeling/php-pdfimages@dev-master
composer require thiagoalessio/tesseract_ocr
```

## コード
```ocr.php
<?php
include "vendor/autoload.php";

use \TesseractOCR;
use Wb\PdfImages\PdfImages;

// `which pdfimages` でpdfimagesのフルパスを入れておく
$pdfImages = PdfImages::create(['pdfimages.binaries' => '/usr/bin/pdfimages']);
/* 
 * 1P目のPDF画像を指定する
 * @var FilesystemIterator
 */
$file = $pdfImages->extractImages("PDFへのパス")->current();

// ImageMagickでクロップ処理
$image = new \Imagick;
$image->readImage($file->getPathName());
$image->setImageFormat('jpeg');
$image->setCompressionQuality(100);
$image->cropImage(300, 100, 390, 4593);
$image->writeImage("/tmp/crop.jpg");

//クロップ済み画像のパスを渡す
$ocr = new TesseractOCR("/tmp/crop.jpg");
//OCRで利用する言語を選択
$ocr->setLanguage("eng"); 
//OCR精度を上げる為にホワイトリストに文字を追加
$ocr->setWhitelist(range(0,9), array("+", "-", ".")); 
//文字列で帰ってくる
echo $ocr->recognize(); 
```

## 結果
単純な数字の文字認識だとかなりの精度で検出出来ました。
ホワイトリストで文字を縛れば縛る程効果が目に見えて大きかったです。
またImagemagick+GhostScriptだと１０秒程cropに時間が掛かりましたが、200ms程で終了するので大幅に高速化出来ました。

日本語等の検出はまだ試していないので何ともいえませんが、単純な文字列の検出でしたらサクッと実装出来たのでオススメです。
Phalconのデバッグコンポーネント導入

[公式](https://docs.phalconphp.com/ja/latest/reference/debug.html)にも記載のあるデバッグコンポーネントを導入してみました

まずは手順通りにpublic/index.phpに追記します

```php:public/index.php
<?php
error_reporting(E_ALL);

(new \Phalcon\Debug())->listen(); // ここを追記

define('APP_PATH', realpath('..'));

try {
```

[公式](https://docs.phalconphp.com/ja/latest/reference/debug.html)ではtry/catchを削除せよと書かれています。
ですが、リリース時にはないと困るので、削除するのも如何なものかと。
そこでちょっとひと手間加えてみます。

config.phpの最後にデバッグフラグ追加

```php:app/config/config.php
        'baseUri'        => '/',
    ],
    'debug' => true
));
```

public/index.phpのcatch内でexceptionをthrowする

```php:public/index.php
} catch (\Exception $e) {
    if ($config->debug) {
        throw $e;
    }
    echo $e->getMessage() . '<br>';
    echo '<pre>' . $e->getTraceAsString() . '</pre>';
}
```

これでconfigの値で制御できるようになりました。
めでたし。
cakephp3 ２つテーブルのデータをトランザクションで保存


```MembersController.php
use Cake\Datasource\ConnectionManager; 
```


```MembersController.php
// トランザクション
$connection = ConnectionManager::get('default');
$connection->begin();
try{
    // データを保存
    if( !($member_result = $this->Members->save($member)) ){ // member更新
        throw new Exception(Configure::read("M.ERROR.INVALID"));
    }

    // 今登録したmember_idを設定 TODO 本当はentityでidも篩いにかけた方がいいかも
    $agreement['member_id'] = $member_result['id'];

    if(!$this->Agreements->save($agreement)){ //agreementの更新
        throw new Exception(Configure::read("M.ERROR.INVALID"));
    }
    $this->Members->connection()->commit();
} catch(Exception $e){

    $this->Flash->error($e);
    $connection->rollback(); //ロールバック
}

```
Fink による LaTeX (TeXLive) や R のインストール

#1. XCode のインストール

`$ xcode-select --install`

XCode ライセンスを承諾する必要がある時があります。この場合、

`$ sudo xcodebuild -license`

と入力し、

`agree`

と入力します。

#2. Fink のインストール

[Install Fink](https://raw.githubusercontent.com/fink/scripts/master/srcinstaller/Install%20Fink.tool)

を開き、テキストとしてデスクトップに保存します。

![Install Fink.tool.txt]
(https://qiita-image-store.s3.amazonaws.com/0/118479/3ed17bb6-b088-f7a6-9d4b-4d3f0b126abe.png)


その後、ターミナルを開き、以下のコマンドを入力します。

`$ cd Desktop` 書類フォルダに保存した場合は、 `$ cd Documents`

`$ chmod +x Install\ Fink.tool.txt`

`$ ./Install\ Fink.tool.txt`

いくつか質問されますが、だたいリターンキーを押すだけでも大丈夫です。



JDK と X11 のインストール方法が途中で示されます。「詳しい情報...」をクリックしてインストールしてください。その後、ターミナルに戻って、再び

`$ ./Install\ Fink.tool.txt`

とします。

なお、Java に関しては、JDK ではなく JREの情報が表示されてしまいます。JDK のダウンロードは、以下のURLのようです。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

#3. R と TexLive のインストール

ターミナルで、

`$ fink install r-base`
`$ fink install texlive-nox`

と入力します。
Makefile を使った、 LaTeX と 他のツール (R) からの論文作成

論文を用意する場合は、R などで図を用意し、 LaTeX で論文を作成することが多い。 ここでは、.tex や .r を用意し、自動的に更新する方法を示します。

ここでは、 Sweave や RMarkdown など、R の中で文書を生成する方法とは異なる方法を説明しています。 実際、ここの方法は他のツール、例えば Python+matplotlib などにも応用することができます。

なお、MacOSX 上で、Fink によってインストールされた texlive と r-base を使用しています。

次に、用意するファイルです。

- Makefile
- ronbun.tex
- fig.r
- data.csv

```make:Makefile
TARGET := ronbun
PNGFILES := fig.png

REMOVE=rm -f
LATEX=/sw/bin/platex -kanji=utf8 -shell-escape
BIBTEX=/sw/bin/bibtex
DVIPDFMX=/sw/bin/dvipdfmx
EBB=/sw/bin/ebb
RSCRIPT=/sw/Library/Frameworks/R.framework/Resources/bin/Rscript

all: $(TARGET).pdf 

clean:
	$(REMOVE) *.aux *.log *.dvi *.bbl *.bbg *.bb *.xbb

$(TARGET).tex: $(PNGFILES)

.tex.pdf:
	-$(LATEX) $(TARGET).tex && $(BIBTEX) $(TARGET)
	$(LATEX) $(TARGET).tex && $(LATEX) $(TARGET).tex && $(DVIPDFMX) $(TARGET).dvi

.r.png:
	$(RSCRIPT) $<

.SUFFIXES: .tex .bib .pdf .dvi .r .png .bb .xbb

.PHONY: all clean
```


```tex:ronbun.tex
\documentclass[a4paper,12pt]{jsarticle}
\usepackage[a4paper]{geometry} 
\usepackage[dvipdfmx]{graphicx}
\usepackage{amsmath,amssymb}

\begin{document}

\section{はじめに}
論文をかくときは、LaTeXやRを使う。

\includegraphics[width=100mm]{fig.png}

\end{document}
```


```R:fig.r
png('~/Documents/fig.png', 
    width = 100, height = 100, units = "mm", res=300, pointsize = 8)
par(family="Hiragino Kaku Gothic Pro W6")
Dataset <- read.table("data.csv", header=TRUE, 
    sep=",", na.strings="", dec=".", strip.white=TRUE)
.Table <- xtabs(~X+Y, data=Dataset)
barplot(as.matrix(.Table), 
     ylim=c(-1,50),
     xlim=c(0,3),
 	 space=0.5,
     xlab="X", ylab="Number of patients", 
     axes = TRUE,
     col=c("white","darkgrey"),
     names.arg=c('X1','X2'),
 	 legend.text = TRUE, 
     args.legend = list(x = "topleft", bty = "n"),
 	 border = T)
abline(h=0) 
dev.off()
```

一行目で保存先を指定しているので、適宜変えてください。


```text:data.csv
X,Y
1,1
1,1
1,1
1,2
1,2
2,1
2,2
2,2
2,2
2,2
```

では、論文を作成しましょう。

`$ make`

これで、自動的に .png ファイルが作成され、.tex が .pdf に変換されます。
「突然の死」の引用スタイル .totsuzennoshi

クラスひとつで「[突然の死](http://dic.nicovideo.jp/a/突然の死)」が実装できる `.totsuzennoshi` を作りました。

## スクリーンショット

![Screen Shot 2016-04-05 at 6.58.15 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38383/860500b8-858f-463c-a9c9-33d134c4208f.png)

引用文の長さは14文字程度まで対応しています。

## コード

```html:HTML
<blockquote class="totsuzennoshi">
  <p>突然の死</p>
</blockquote>

<blockquote class="totsuzennoshi">
  <p>引用スタイル</p>
</blockquote>

<blockquote class="totsuzennoshi">
  <p>引用スタイル・文字長め</p>
</blockquote>
```

```css:CSS
.totsuzennoshi {
  overflow: hidden;
  font-family: serif;
  line-height: 1.25;
}
.totsuzennoshi:before,
.totsuzennoshi:after {
  display: inline-block;
  width: 1em;
  vertical-align: top;
  word-break: break-all;
}
.totsuzennoshi:before {
  content: "＿＞￣";
}
.totsuzennoshi:after {
  content: "＿＜￣";
}
.totsuzennoshi p {
  position: relative;
  display: inline-block;
  margin: 0;
  padding: 1.25em 0.4em 1.25em 0.6em;
  overflow: hidden;
}
.totsuzennoshi p:before,
.totsuzennoshi p:after {
  position: absolute;
  white-space: nowrap;
}
.totsuzennoshi p:before {
  content: "人人人人人人人人人人人人人人人人人人";
  top: 0;
  left: 0.2em;
}
.totsuzennoshi p:after {
  content: "　Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y";
  bottom: 0;
  left: -0.55em;
  letter-spacing: 0.05em;
}
```

とりあえず Mac の主要ブラウザで動作確認済み。

![Screen Shot 2016-04-05 at 7.36.41 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38383/173cbe4d-d4cc-55ae-adaf-c3fee4df8ed5.png)


- http://codepen.io/anon/pen/GZONgK
技術英語 > Engineering is, after all, always [an art of compromise].


@ [Meet the Zynq MIO: Adam Taylor’s MicroZed Chronicles Part 9](https://forums.xilinx.com/t5/Xcell-Daily-Blog/Meet-the-Zynq-MIO-Adam-Taylor-s-MicroZed-Chronicles-Part-9/ba-p/386661)

> Engineering is, after all, always <font color=red>an art of compromise</font>.

の art をどう訳すかは未消化。

- 「妥協の産物」
- 「妥協の技術」(Art of Readable Code から類推)
- etc.


http://eow.alc.co.jp/search?q=art&ref=sa
> `8. 〔ある分野の〕技術、技巧、技、術
Herokuでphpのconfigureオプションを変更したい。

Heroku環境でphpアプリの開発をしています。

開発中のアプリでは,スペルチェックを行う必要があり、そのために 
enchant関数を使用したいと考えています。

しかしながら、enchant関数は、Heroku環境では動作しません。

Heroku環境にてphpinfo()を実行すると、phpのバージョンが5.6.19
となっており、またconfigure commandには--with-enchantが含ま
れていないので、それが原因かと思っております。

どなたか、Heroku環境でphpのconfigureオプションを変更する方法 
をご存知ないでしょうか？

※Bashのタグを追記しました。
<a href="https://github.com/heroku/heroku-buildpack-php" target="_blank">Herokuの公式ビルドパック</a>のsupport/buildフォルダのphp,php-min
などの内容をみると、configureの記述があったため、buildpackで
対応できるのではないかと思っております。
そしてHeroku公式ビルドパックはbashシェルでかかれているため
タグにBashを追加いたしました。

※Dockerのタグを追加しました。
HerokuはDockerに対応しており、Dockerを使用してインフラを
カスタマイズしている方もいらっしゃると聞いています。このため
タグにDockerを追加いたしました。
1.2くらいから始めるGitHub (Mac編)

プログラミング教えてすこしたつ人からGitHubのセットアップ方法を聞かれたので方法を書く。（terminalを使わない方法もある。記事下部）

#前提
GitHubアカウントは作成済みなこと（ここまでで1.2くらい）

# Gitのインストール
MacにはGitが標準でインストールされているが、最新版にアップデートする意味でもインストールするとよい。


GithubはGitというシステムを利用している。インストール方法だけど２つほど方法がある。

**1. 直でダウンロード　＆　インストール**
**2. パッケージマネージャを使う**

このうちあまりterminalに慣れていない人は１をでいいと思う。個人的にはパッケージマネージャを使ったほうがめんどくさくないのでおすすめ！
## 1の方法

**1. gitをダウンロードする ( https://git-scm.com/ )**
**2. インストールする**

これだけ。

## 2の方法


パッケージマネージャはMacPortsやHomebrewなどがあるが個人的にHamobrewがすきなのでその方法をご紹介。

```lang:terminal
brew update
brew install git  
```
と入力
**パスワードを聞かれるので入力して待つのみ。**
これだけ。

#Gitバージョンを確認する
とりあえずインストールが終わったところで、きちんと完了しているかバージョン情報を見る。

**```git --version ```**　と入力
**```git version x.x.x```** と表示されたらインストール済みです。

もしnot foundなどと言われたらもう一回インストールしてみる。


#セットアップ

Gitを使う上で必要な情報をセットアップをする。この情報はとても重要だが簡単にセットアップできる。詳しくは[GitHubのドキュメント](https://help.github.com/articles/set-up-git/)を見ると良いがこれだけやっておけば間違いない。
terminalに

```lang:terminal
git config --global user.name "ここに自分の決めた名前を入力"
git config --global user.email "e-mailアドレスを入力"
```

とそれぞれうちこむ。
####これでセットアップ完了。おつかれさまでした！

#terminalを使わない方法

最近GitHubはGUIベースで使えるアプリができたらしい。（私は使ったことないけど）
非プログラマーの人やterminalに慣れていない始めたばかりの人にはおすすめかも。

ここでは触れないがGoogle先生で```Github Desktop```と検索するとたくさんでてくるのでそちらを参照。
Web サイト本文の font-family に指定するフォントの決め方

Web サイト本文の font-family にどのフォントを指定するべきなのか考えたことをメモっとく。

# 明朝体とゴシック体

Web の本文は一般的にゴシック体で印刷物の本文が一般的に明朝体なのと異なる。ディスプレイに小さなサイズで明朝体を表示するとジャギーが多くなって可読性が低下するからだ。現在の高 PPI ディスプレイだと明朝体でも綺麗に表示されるけどね。

高 PPI ディスプレイが標準的になったとはまだ言えないので、現在でもゴシック体を指定するのが無難だろう。

# Windows の和文フォント

Windows に入っているゴシック体の和文フォントで font-family に指定する候補として上がってくるのは下記の2つだろうか。

* メイリオ
* 游ゴシック

「ＭＳ ゴシック」と「ＭＳ Ｐゴシック」を除外したのは、可読性の高い本文という観点では和文は等幅フォントで、欧文はプロポーショナルフォントである必要があるけど、どちらのフォントもそれに対応できないから。和文フォントと欧文フォントの混植で解決する方法もあるけど、そうしない理由は後述する。

Web サイト本文のフォントとして「メイリオ」と「游ゴシック」のどちらがいいのだろう？

スクリーン上での可読性を重視してつくられた「メイリオ」が Web サイト本文のフォントとして無難かな。

主観的に Windows 上で動作するブラウザが表示する小さなサイズの「游ゴシック」は汚いと思うので「メイリオ」がいいと思う。

Windows ユーザー向けの和文フォントのデモページを用意したので自分の目で見て決めてほしい。Windows でフォントを綺麗に見せる ClearType という技術は液晶ディスプレイのドットの三原色の配置に密接に関連した技術なので実機で確認するのがいいと思う。

http://takuya0301.github.io/japanese-font-demo/windows.html

**OS X を利用している Web 制作者は Windows 環境での「游ゴシック」の表示をちゃんと確認してね。**

# OS X の和文フォント

OS X に入っているゴシック体の和文フォントで font-family に指定する候補として上がってくるのは下記の2つだろうか。

* ヒラギノ角ゴシック
* 游ゴシック

Web サイト本文のフォントとして「ヒラギノ角ゴシック」と「游ゴシック」のどちらがいいのだろう？

OS X ユーザーはシステムフォントの「ヒラギノ角ゴシック」を見慣れていたり、Apple の Web サイトは「ヒラギノ角ゴシック」を使用していたりするので、「ヒラギノ角ゴシック」という選択は無難かな。

「ヒラギノ角ゴシック」で Web を見ることに慣れすぎてしまっているからかもしれないが、主観的には和欧文混植の場合に「ヒラギノ角ゴシック」の方が読みやすいと思う。

OS X ユーザー向けの和文フォントのデモページを用意したので自分の目で見て決めてほしい。比較用に「メイリオ」も並べておいた。Office for Mac が入ってる OS X なら「メイリオ」が入っているからね。

http://takuya0301.github.io/japanese-font-demo/osx.html

# 和文フォントと欧文フォントの混植

「メイリオ」の場合は混植しない方がいい。「メイリオ」の欧文フォントは Verdana を「メイリオ」用にリデザインしたものなので和欧文混植での可読性が最初から考えられているから。

「ヒラギノ角ゴシック」の場合は混植するしないは好みの問題かなと思う。和文フォントと欧文フォントの混植で明確に発生する問題は「三点リーダー」のような記号が欧文フォントのものになってしまうこと。

OS X ユーザー向けに Helvetica Neue と「ヒラギノ角ゴシック」を混植したデモページを用意したので自分の目で見て決めてほしい。

http://takuya0301.github.io/japanese-font-demo/mixed-typesetting.html

# まとめ

「メイリオ」と「ヒラギノ角ゴシック」を下記のように指定するのがいい。

```css
p {
  font-family: Hiragino Kaku Gothic ProN, Meiryo, sans-serif;
}
```

Helvetica Neue と「ヒラギノ角ゴシック」で混植したかったら下記のように指定する。

```css
p {
  font-family: Helvetica Neue, Hiragino Kaku Gothic ProN, Meiryo, sans-serif;
}
```

# 参考文献

https://www.w3.org/TR/jlreq/ja/
http://www.type-c4.com/concept/meiryo.html
PlayでとりあえずonStartしたい

## はじめに
PlayのVersionを上げたらGlobalSettingsで怒られたけどonStartの代替のやり方が良く分からない!そんな人向けに中身の解説すっ飛ばして「とりあえず動くようにする」だけの記事。

## コード
こいつをapp以下の好きなところにおいて

```scala
import javax.inject._
import com.google.inject.AbstractModule

@Singleton
class Global @Inject()(system: ActorSystem) {
  onStart()

  def onStart(): Unit = {
    // やりたいことを書こう!
  }
}

class GlobalModule extends AbstractModule {
  override def configure(): Unit = bind(classOf[Global]).asEagerSingleton()
}
```

`application.conf` に以下を書き足す

```
play.modules.enabled += "GlobalModule"
```

## ActorSystem以外に欲しいものが
`(system: ActorSystem)` の部分が引数になっているので、欲しいものを追加すればよしなにやってくれる。多分。

## 結局これなんなの
Playって割とGlobalな値使ってるけど、それ良くないから依存性は後で注入することにしようぜ!そこでDIですよ!だからGlobalSettingsとかいうGlobalなobjectはやめようぜ!ってことらしい。DIを使うモチベはそんなとこ。

で、上は何をしているかというと、moduleを追加して、moduleを初期化するときにonStartを実行させるようなことをしてるだけ。簡単だね
transitionプロパティによるCSSアニメーションの基礎


## はじめに
cssを使った簡単なアニメーションを作る。
cssでアニメーションを作成する手法としてはanimationプロパティを用いたものとtransitionプロパティを用いたものがある。
今回はtransitionを用いてアニメーションを作る。
transitionはanimationと比較して:hoverなどのトリガーが必要となる。

## アニメーション前
アニメーション前のhtmlとcssは以下の通り。
ブラウザから見ると青色の二つのブロックが並ぶ。
これらのブロックの上にカーソルを載せた時とクリックしたときにブロックが横に伸びるアニメーションを作成する。

```html:html
<div class="box hover">:hover</div>
<div class="box click">:click</div>
```

```css:css
.box {
     width: 200px;
     height: 100px;
     margin: 10px;
     background-color: #33f;
     color: white;
     padding: 10px;
}
```

## transitionプロパティ

transitionは時間変化を指定するプロパティ。
秒数を指定すると変化に掛かる時間を設定する事ができる。
今回は1sを指定した。これにより1秒で対象が変化する。

```css:transitionプロパティを追加
.box {
     width: 200px;
     height: 100px;
     margin: 10px;
     background-color: #33f;
     color: white;
     padding: 10px;
     transition: 1s;
}
```

## ホバー状態

ホバー状態(マウスカーソルが上に乗っている状態)にブロックが横に伸びるように設定する。
擬似クラス:hoverを用いてwidthを設定すれば良い。
今回は400pxを設定した。また、background-colorも変化させている。

```css:hover
.box.hover:hover {
     width: 400px;
     background-color: #f33;
}
```

## クリック時

クリック時に以下のようなクラスを要素に追加することで実装する。

```css:clickedクラス
.box.click.cliced {
     width: 400px;
     background-color: #3f3;
}
```

jQueryを使うので`<head>`に以下を追加する必要がある

```html:jQueryのインクルード
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
```

jQueryのtoggleClassを用いる。
toggleClassは指定したCSSクラスを対象の要素が持っていなければ追加、持っていれば削除する。

```js:.clickedの追加
$(function() {
    $(".click").click(function() {
		 $(this).toggleClass("clicked");
	 });
});
```

## [デモ](http://tetsuyanegishi.github.io/Warehouse/css_transition/)
Vagrant で ansible_local を試す (CentOS7)

開発チームが各個人で手軽に使えるVagrant環境を整えようとしたらおもいっきりハマった。

まさに↓の問題
> [ansible_localにハマりました。](http://qiita.com/sega_yuu/items/b094aed3002905497aa5)

重要なのは、 `vagrant-vbguest`をインストールすること。

```
vagrant plugin install vagrant-vbguest
```

あとは、`ansible_local`を動かすための`ansible.cfg`の設定。

```
[defaults]
host_key_checking = no

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes
```

もう二度とハマりたくないのでサンプルを以下に置いた

> [vagrant-ansible_local-centos7-sample](https://github.com/tumf/vagrant-ansible_local-centos7-sample/commits?author=tumf)
HTML,CSS勉強メモ #10 〜応用:要素の重ね方他〜

本日の勉強。

##**進度**##
ホームページ作成練習

- フレームワーク

これから自分なりにこれまでの勉強を生かし、一つ(とりあえずTOPページだけ)作ってみようと思います。
今日はフレームワークとまでいきませんが、こんな感じにしたいみたいな大まかなイメージを作ってみました。

![IMG_2504.JPG](https://qiita-image-store.s3.amazonaws.com/0/96102/89b9cd58-c5d8-4a4b-c2d6-ba6c1871adcf.jpeg)

ただ真似するだけでは面白くないので、以前から気になっていた`header`と`footer`に`main`が重なってるヤツ
やってみようと思います。


##**メモ**##

###重ね方###
今回、`main`の重ね方についてはレッスンでやった`position:absolute;`と`position;relativ;`を使いました。
`menu`と`main`を別の`div`要素の中に入れて`position`を指定しています。
他にもやり方があるのか今後も調べてみようと思います。

###`footer`の設置方###
`footer`は当然ページの下部に配置したいのですが、今回`header`と`footer`の間に`main`がないため、
最初は`margin-top`で調節しました。
しかしこれでは背景に何も指定できないことに気づき、`main`が入っている`div`要素の外にもう一つ背景用の要素を作りました。

###`float`には`width`を！###
レッスンで毎回言われていたのにやっぱり忘れました。
`main`内を「実践！～」の時と同じように２カラムにしようと思ったのですが、最初`float`が全く適応されずハマっていました。
その時レッスンで散々「`float`した時には必ず`width`を指定します。」と言っていたことを思い出し、確認したところやはりそれでした。

###`menu`を中央に配置したい###
上記の通りなのですが、`margin: 0 auto;`が何故か適応されません。
仕方がないので個別に指定することにしましたが、やはり固定になってしまってブラウザを伸縮させると中央にならないのが気になります。
なぜ適応されないのかは今後も調べてみようと思います。


本日は以上です。
FireLinkに日付変数を正しく動かすPull Requestを取り込む


[日付変数が正しく動作しない by Hi-lo · Pull Request #6 · ongaeshi/firelink](https://github.com/ongaeshi/firelink/pull/6)

Firefox45で`%date%`が動かなくなったのに気がついていなかった。パッチありがたい。

Add-on SDK はPythonベースの`cfx`じゃなくてnode.jsベースの[jpm](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/SDK/Tools/jpm)になった。たまにパッチを取り込むたびにやり方を忘れる(ので忘れないように今回はログに記録)。cfxの頃に比べるといちいち専用シェルにログイン不要になったので使いやすくなっている。

```
$ cd ~/Documents/firelink

# 実行テスト
$ jpm run

# xpiの作成
$ jpm xpi
```

パッチもうまく動き、さて[新バージョン申請](https://github.com/ongaeshi/firelink/commit/e2df4d57eb2851fdb2bc6c5bc0036815d0e4ad7f)しようと思ったらなぜかFirefoxアカウントにログインできない。パスワードを忘れたをクリックしても同じように予期しないエラーが出る。

![サインイン_Add-ons_の利用を続ける.jpg](https://qiita-image-store.s3.amazonaws.com/0/3885/44098ed8-a346-e899-264f-bbf6f8892946.jpeg "サインイン_Add-ons_の利用を続ける.jpg")

ググるとサーバトラブルの可能性もあるっぽいので1日待ってみよう。
Objectからvalueだけを1linerでさくっと取り出す(Object.values)

gulpのタスクを書いていて必要になった（gulp.srcに突っ込みたくなった）のでさくっと。
エラー処理とかあんまり考えてないけど、自分の使い道的には十分

```js
const a = { hoge: 'hogehoge', fuga: 'fugafuga'};

const b = Object.keys(a).map((k) => { return a[k]; });

console.log(b);
// [ 'hogehoge', 'fugafuga' ]
```

更に短く書くならこうだけど、このarrow functionの書き方はあまり好きじゃない

```js
const b = Object.keys(a).map(k => a[k]);
```

# おまけ
ES2016でドラフトではあるけど、Object.keysのようにObject.valuesでvalueの配列が取り出せるようになるらしい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values
ポリフィルはこちら。きちんと使いたいならこっち
https://github.com/tc39/proposal-object-values-entries
サイコロ勝負

# 何をするの？
相手に、ほぼ勝てるような勝負[^1]を仕掛けます。
[^1]: 「万能鑑定士Qの事件簿」の京サイコロのようなもの

# ルールは？
- -13から13までの数直線の0にコマを置きます。
- コマが-13または13になるまで下記を繰り返します。
  - 4つのサイコロから相手が1つ選びます。
  - 残りの3つのサイコロから私が1つ選びます。
  - 同時に振って、数字の大きい方がコマを1だけ移動できます。
- -13になったら相手の勝ち、13になったら私の勝ち。
- サイコロは正六面体で、0から6までの数字がかかれています。

# サイコロの目
「[数字オンチの諸君!](http://www.amazon.co.jp/dp/4794203802/)」には、次のような目のサイコロが出てきます。
これを使うと、AはBに2/3で、BはCに2/3で、CはDに2/3で、DはAに2/3で勝ち、引き分けはありません。後からサイコロを選ぶ方が、断然有利。

- A: 0, 0, 4, 4, 4, 4
- B: 3, 3, 3, 3, 3, 3
- C: 2, 2, 2, 2, 6, 6
- D: 1, 1, 1, 5, 5, 5

# Pythonで1万回試してみる

まず、確率2/3を確認してみましょう。

```py3:python
from itertools import product
dices = [
    [0, 0, 4, 4, 4, 4],
    [3, 3, 3, 3, 3, 3],
    [2, 2, 2, 2, 6, 6],
    [1, 1, 1, 5, 5, 5],
]
for i in range(4):
    print(i, sum(j > k for j, k in product(dices[i], dices[(i+1)%4]))/ 36)
>>>
0 0.6666666666666666
1 0.6666666666666666
2 0.6666666666666666
3 0.6666666666666666
```

相手がどのサイコロを選んでも、勝率2/3です。

1万回、勝負してみましょう。

```py3:python
from random import randint, seed
seed(1)
nn = 10000 # 試行回数
th = 13 # しきい値
ywin = 0 # 私の勝ち数
for cnt in range(nn):
    p = 0
    while -th < p < th:
        n = randint(0, 3)
        dicex = dices[n]
        dicey = dices[(n+3)%4]
        if dicex[randint(0, 5)] > dicey[randint(0, 5)]:
            p -= 1
        else:
            p += 1
    ywin += p > 0
print(ywin / nn) # 私の勝率
>>>
1.0
```

勝率100%でした[^2]。

[^2]: 本当にやると友達をなくすかも

以上