OmniAICreator/Qiita-1.07M huggingface dataset:
C#: DateTimeの年2桁の解釈 (0～29, 39～99 → 2000～2029, 1930～1999) を変更する

日付形式を年2桁(yy)で扱うことは今日日あまりないと思いますが、最近必要になったので参考に記載します。

C# (.NET Framework) では、`"yy/MM/dd"` (や `"y/M/d"`) など、年2桁の日付形式文字列を `DateTime.Parse()`, `DateTime.ParseExact()`, `DateTime.TryParseExact()` で扱うと下記のようになります。

```
00/01/01 → 2000/01/01
:
29/01/01 → 2029/01/01
:
30/01/01 → 1930/01/01
:
99/01/01 → 1999/01/01
```

```csharp
for (var yy = 0; yy <= 99; yy++)
{
    // DateTime.Parse()
    var d1 = DateTime.Parse($"{yy:D2}/01/01");
    // DateTime.ParseExact()
    var d2 = DateTime.ParseExact($"{yy:D2}/01/01", "yy/MM/dd", null);
    // DateTime.TryParseExact()
    DateTime d3; DateTime.TryParseExact($"{yy:D2}/01/01", "yy/MM/dd", null, System.Globalization.DateTimeStyles.None, out d3);

    // 出力
    Console.WriteLine($"{yy:D2}/01/01 → {d1:yyyy/MM/dd}, {d2:yyyy/MM/dd}, {d3:yyyy/MM/dd}");
}
```

2029年の次が1930年になってしまうので、2030年になると2000年問題のようなことが起こるおそれがあります。

## 何故このような動作になるのか

この動作は、Windowsの地域設定 (カレンダー設定) がもとになっています。
(Windows 10でコントロールパネル経由でたどり着くには、「コントロールパネル」> 「時計、言語、および地域」>「日付と時刻の設定」>「カレンダーの設定の変更」)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/782/18249a2e-9778-4891-f5e3-faf06cb59eda.png)

「2桁の数字で年を入力すると、次の範囲内での暦年として解釈する」の設定を「2099」(2000 から 2099) にすると、下記のように挙動が変わります。

```
00/01/01 → 2000/01/01
:
29/01/01 → 2029/01/01
:
30/01/01 → 2030/01/01
:
99/01/01 → 2099/01/01
```

## プログラム上のみで動作を変更できないのか

複数のPCで動作させるプログラムの場合、PCの設定を変えるのはできるだけ避けたいです。(全台変える必要が出てくるので)

`DateTime.Parse()` などはカルチャ (地域情報オブジェクト) によって動作が変わるようになっていて、明示的にカルチャを指定すれば動作を変更できます。(前述のコードのようにカルチャを指定しない場合はWindowsの設定が使用される)

年2桁の設定は Calendar.TwoDigitYearMax という項目です。

```csharp
// カルチャの生成 (年2桁の解釈(TwoDigitYearMax)を2099(2000～2099)にする)
var culture = new System.Globalization.CultureInfo("ja-JP");
culture.Calendar.TwoDigitYearMax = 2099;

for (var yy = 0; yy <= 99; yy++)
{
    // DateTime.Parse() + カルチャ明示
    var d1 = DateTime.Parse($"{yy:D2}/01/01", culture);
    // DateTime.ParseExact() + カルチャ明示
    var d2 = DateTime.ParseExact($"{yy:D2}/01/01", "yy/MM/dd", culture);
    // DateTime.TryParseExact() + カルチャ明示
    DateTime d3; DateTime.TryParseExact($"{yy:D2}/01/01", "yy/MM/dd", culture, System.Globalization.DateTimeStyles.None, out d3);

    // 出力
    Console.WriteLine($"{yy:D2}/01/01 → {d1:yyyy/MM/dd}, {d2:yyyy/MM/dd}, {d3:yyyy/MM/dd}");
}
```

※ `System.Globalization.CultureInfo` は `using System.Globalization;` していれば `CultureInfo` のみでよいです。
※ `CultureInfo.CurrentCulture` に現在のカルチャが格納されていますが、このオブジェクトは読み取り専用なので設定変更ができません。
※ `DateTime.Parse()` などを MSDN で確認するとカルチャを指定するメソッドがないように見えますが、`CultureInfo` は `IFormatProvider` を実装しているので、`IFormatProvider` が引数として必要なオーバーロードに引数として指定することができます。
UnityでZEDから深度画像を取得する

# はじめに
ZEDのUnityサンプルには、トラッキングと、クロマキーと、MRのサンプルしか無かったので、Unity上でDepth値をどうやって使うのか調べてみました。

# 震度画像を取得
ZEDで画像を取得している箇所は、TextureOverlay.csのStart()関数内です。

    //Create two textures and fill them with the ZED computed images
    camZed = zedCamera.CreateTextureImageType(videoType);
    depthXYZZed = zedCamera.CreateTextureMeasureType(sl.MEASURE.XYZ);

おそらく実体はこれですが、depthXYZZedでDepthを取得しているように見えます。
しかしここで取得している値はrgbの3次元であり、ShaderでQuadに出力してみても、Depthっぽいですが少し違うような値しか取得できませんでした。
これはsl.MEASURE.XYZで取得しているのが原因でした。

    CreateTextureMeasureType(){
        ...
        if (mode == MEASURE.XYZ || mode == MEASURE.XYZABGR || mode == MEASURE.XYZARGB || mode == MEASURE.XYZBGRA || mode == MEASURE.XYZRGBA)
        {
            m_Texture = new Texture2D(ImageWidth, ImageHeight, TextureFormat.RGBAFloat, false, true);
        }
        else if (mode == MEASURE.DEPTH || mode == MEASURE.CONFIDENCE)
        {
            m_Texture = new Texture2D(ImageWidth, ImageHeight, TextureFormat.RFloat, false, true);
        }
    }
    
ここでXYZとDEPTHの判別を行っており、引数をsl.MEASURE.DEPTHとすることで、Texture2D型のデプスマップを取得することが出来ました。
XYZが何を取得しているかは今のところ不明です。MeasureTypeとなっているので距離を取得はしているんでしょうが、値を見てもよく分かりませんでした。

![2017-04-22_102345.png](https://qiita-image-store.s3.amazonaws.com/0/163818/b0db0a50-594a-4262-ffa9-c1d89613dc09.png)

画像は取得した値をShader内で1/10にして出力しています。
jsdoでconvnetjs その9

#概要
convnetjsでfizzbuzz問題やってみた。
活性化関数にtanh使った。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/s/w/G/swGpU.jpg?t=1492821451)


#成果物
http://jsdo.it/ohisama1/swGpU
Hyperledger ブックマーク集

Hyperlegder
https://www.hyperledger.org/
https://github.com/hyperledger/

Read the docs on GitHub pages
http://intelledger.github.io

Tutorial
https://github.com/IBM-Blockchain/getting-started

Hyperledger
http://qiita.com/kyrieleison/items/4b49fad4bc9e1db79de4
http://qiita.com/kyrieleison/items/ec5223bbe6140822df4a


IBMブロックチェーンの日本語Web
http://www-935.ibm.com/industries/jp/ja/blockchain/index.html

「絵でわかる！ はちさんのブロックチェーン・レポート」のバックナンバー
第1回： 仮想通貨だけじゃないブロックチェーンの仕組み
http://ibmjapan.tumblr.com/post/150952688856/blockchain-report01

第2回： ブロックチェーンの特徴と活用例
http://ibmjapan.tumblr.com//150034606381/blockchain-report02

第3回： ブロックチェーンのビジネス/システム上の利点
http://ibmjapan.tumblr.com/post/151012601111/blockchain-report03

第4回： ブロックチェーンがもたらす機会と脅威 
http://ibmjapan.tumblr.com/post/151043082481/blockchain-report04

第5回：森として繁栄するブロックチェーンと実践の意義
http://ibmjapan.tumblr.com/post/151093795791/blockchain-report05
Xamarin ブックマーク集

本当に入門記事
http://ichgw.hateblo.jp/entry/Xamarin/handson01


Xamarin入門記事
http://qiita.com/ytabuchi/items/c1cd365bf10d2385d847
ここで案内されているハンズオン
5つ
dev daysハンズオンとてもわかりやすい
https://github.com/chomado/xamarin-dev-doc/blob/master/hands-on/readme.md
中級は難しいが、仕組みがわかる
参考
http://ticktack.hatenablog.jp/entry/2016/04/09/110635
https://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/sharing_code_options/
しぇあとPCLのちがい
https://www.google.co.jp/search?q=xamarin+itemselected&rlz=1CDGOYI_enJP635JP635&oq=xamarin+itemselected&aqs=chrome..69i57j0l3.9798j0j8&hl=ja&sourceid=chrome-mobile&ie=UTF-8
なにがもともとある関数かわかるといい
http://www.buildinsider.net/mobile/xamarintips/0008
assembly

DIコンテナ

http://www.nuits.jp/entry/2016/10/18/195852

Xamarinはおおきくふたつ。
FormとNative
FormにはPrismというMVVM

難しい話

http://www.buildinsider.net/mobile/xamarintips/0013
http://www.buildinsider.net/mobile/xamarintips/0012


ようやくのプリズム
https://github.com/jxug/PrismAndMoqHansOn/blob/master/docs/02.HandsOn-PrismApplication.md

http://blog.okazuki.jp/entry/2016/09/23/221959

アドベントカレンダー
http://qiita.com/advent-calendar/2016/xamarin2

http://qiita.com/advent-calendar/2016/xamarin2
ADDA > Re{Ex} for various angles of the incident light

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Using [displaySingleInitFieldY_170422.ipynb v0.2](http://qiita.com/7of9/items/7eec91086bb47b147dc0), real part of Ex[] from the `InitFieldY` is checked.

### command line

```
./adda -grid 25 -orient 0 0 0 -store_int_field -maxiter 1000)
```

where `-orient 0 0 0` specifies the [Euler angles](https://en.wikipedia.org/wiki/Euler_angles) of the incident light.
`-orient {<alpha> <beta> <gamma>|avg [<filename>]}` from the manual.pdf.

In this article, beta value is changed.

### Real part of Ex[12]

beta=0.0deg
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/963bbcf3-20d9-225f-d7be-3aaee84ff6eb.png)

beta=30.0deg
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/76897e42-c373-57cf-caf8-27fa65d76b89.png)

beta=60.0deg
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6799b794-a2be-34d1-78f1-2fac1f4035c0.png)

beta=90.0deg
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0bd57324-3ed9-df6d-71f0-8041a974b4e0.png)
AWS の Ubuntu 16.04 で Etherpad as a service

AWS上でEtherpadを動かし、外からアクセスするようにできるまでのメモ書き。
DBはmysqlを使用。pluginはテーブルと画像挿入のをインストール。

前準備
AWS上のUbuntuパスワード変更
http://d.hatena.ne.jp/thata/20101116/1289890621

nodesインストール（次のに含まれているから不要？）
http://qiita.com/yuji_azama/items/45c0b413453534dba291

Ubuntu 16.04 に Etherpad をインストール
（コマンドを入力したら実行できる状態まで）
https://linuxconfig.org/install-etherpad-web-based-real-time-collaborative-editor-on-ubuntu-16-04-linux

起動時サービス
（サーバ起動時に自動でEtherpadが起動できるようにする）
http://pangency.hatenablog.com/entry/2015/05/08/111025

script の中身は

```
#! /bin/sh

case "$1" in
  start)
    /opt/etherpad/bin/run.sh
    ;;
esac

exit 0
```

とします。


ドメイン設定
https://ja.amimoto-ami.com/2013/11/29/elastic-ip-and-route-53/

nginxをリバースプロキシサーバとして使う。
（nodejs は80番ポートで起動できない？）
以下、Ethepadのデフォルトポートは9001 だが、settings.jsでポートを8080に変えた時の例。

```
upstream web-nodejs {
  server localhost:8080;
}
server {
  listen       80;
  server_name  etherpad.dslabgroup.com;
 
  location / {
    proxy_pass http://web-nodejs/;
  }
}
```

外からは80番ポートでアクセスするので、AWSのセキュリティの設定は、80番ポートに外からアクセスできるようにしていればいい。

nginx enableする　（サーバ起動時にnginx起動）
https://www.digitalocean.com/community/tutorials/how-to-configure-a-linux-service-to-start-automatically-after-a-crash-or-reboot-part-1-practical-examples


plugins
https://static.etherpad.org/plugins.html # ここにPlugin一覧がある
https://help.ubuntu.com/community/Etherpad-liteInstallation#Plugins

```
cd /opt/etherpad-lite
npm install ep_tables2
npm install ep_copy_paste_images
# AWSでインスタンス再起動する
# （上記で自動でrun.shをするようにした場合の、サービスだけの再起動方法不明。。）
```

mysql 設定
デフォルトではjs製のDB DirtyDBを使うようになっている。データ毎（？）の容量の上限が1M？らしいので、mysqlに変える。
下記設定だけを行うと、create tableなどはetherpad 起動時に自動で行われる。
https://github.com/ether/etherpad-lite/wiki/How-to-use-Etherpad-Lite-with-MySQL
https://help.ubuntu.com/community/Etherpad-liteInstallation
ADDA > Re{Ex} for various materials

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Using [displaySingleInitFieldY_170422.ipynb v0.2](http://qiita.com/7of9/items/7eec91086bb47b147dc0), real part of Ex[] from the `InitFieldY` is checked.

### refractive index

From [the Amsterdam Light Scattering Database](http://www.iaa.es/scattering/amsterdam/index.html), following materials are checked.

- Feldspar
  - m = 1.5 + 0.001i
- Olivine S
  - m = 1.62 + 0.000001i
- Volcanic ash (Mnt St. Helens)
  - m = 1.48 + 0.0018i
- Forsterite initial
  - m = 1.63 + 0.0i

### command line example

```
./adda -grid 25 -m 1.63 0.0 -store_int_field -maxiter 1000
```

### Real part of Ex[12]

Feldspar
![Feldspar.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7fe7d4a1-6f87-0155-5324-d621e9795869.png)

Olivine S
![Olivine_S.png](https://qiita-image-store.s3.amazonaws.com/0/32870/88d12300-4d2a-9d8b-338e-17f267a6665b.png)

Volcanic ash (Mnt St. Helens)
![VolcanicAsh.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1a097afa-6c57-a8fd-ecd1-43a55a5221be.png)

Forsterite initial
![Forsterite_initial.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3dbce1db-8b54-9704-aa3e-82facf700527.png)


Note:
The vertical and horizontal lines shown for the Feldspar and Volcanic ash (Mnt St. Helens) may be the artifact caused by my display program with the setting of 30,30 for the X and Y direction.
OnBecameInvisible, OnBecameVisibleが呼ばれない時の対処

Rendererがアタッチされていないオブジェクトは描画されないので、
OnBecameInvisible, OnBecameVisibleが呼ばれません。

そのためゲームオブジェクトにMeshRenderコンポーネントを追加してあげると、呼ばれるようになります。

拾ってきたアセットがRenderが無くてOnBecaseInvisibleが呼ばれなくて困ったのでメモ。
DISKを複数載せてdebian 9インストールした後boot失敗(initramfs)する時

debian9インストーラーでのインストール先DISKの認識は`/dev/sde`。
しかしインストール後のOS起動時のDISKの認識は`/dev/sdd`。

```bash:確認
cat /proc/partitions
```

grubで`root=/dev/sde2`の指定が原因。

## 修正（一つ若くする）

```diff:/boot/grub/grub.cfg
- linux   /boot/vmlinuz-4.9.0-2-amd64 root=/dev/sde2 ro  quiet
+ linux   /boot/vmlinuz-4.9.0-2-amd64 root=/dev/sdd2 ro  quiet
```

もしくは

```
sed -i -e 's/sde/sdd/g' grub.cfg
```

```
grub-install /dev/sdd
reboot
```
技術英語 > but if it [costs you an arm and a leg] to build it, ... / cost a fortune

@ http://thecodist.com/article/the-six-goals-of-every-programming-project

> but if it **cost you and arm and a leg** to build it, was it worth it?

http://ejje.weblio.jp/content/cost+an+arm+and+a+leg
> たいへんな金がかかる

上記はスペルミスのようだ (typo)。
正しくは以下だろう。

but if it costs you an arm and a leg to build it, ...

<hr>
似たような言い方が下の方に出てきた。

> The Space Shuttle software development supposedly **cost a fortune** for every line of code to ensure that nothing would ever go wrong

<hr>
関連して思い出した。

http://qiita.com/7of9/items/599af2d21f5f18580cb7
>I owe you one.
意訳「借りが増えたな」

~~I owe you a fortune to people, who gave me various suggestions at Qiita during the last two years.~~

I owe a fortune to people, who gave me various suggestions at Qiita during the last two years.
MySQLコマンド

#MySQLコマンド

## DBに関して

###DB作成
<pre>
CREATE DATABASE データベース名;
</pre>

<img width="259" alt="スクリーンショット 2017-04-22 4.45.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/b19cd97c-a5f6-54c6-62c7-85df8a668b45.png">

###DB削除
<pre>
DROP DATABASE データベース名;
</pre>

<img width="271" alt="スクリーンショット 2017-04-22 4.47.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/1719e567-2148-6851-bf32-3fa3e610a4d0.png">

###DBに接続
<pre>
USE データベース名;
</pre>

<img width="126" alt="スクリーンショット 2017-04-22 4.49.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/bf2e793e-7f91-e0e4-186c-1174f95d792c.png">

###DB一覧表示
<pre>
SHOW DATABASES;
</pre>

<img width="204" alt="スクリーンショット 2017-04-22 4.50.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/13019e13-8862-6c59-f699-c02bf29f32a7.png">

##テーブルに関して

###テーブルの作成
<pre>
CREATE TABLE テーブル名 (カラム名 データ型(桁数), カラム名1 データ型1(桁数1));
</pre>

###テーブルの削除
<pre>
DROP TABLE テーブル名;
</pre>

###テーブル一覧表示
<pre>
SHOW TABLES FROM データベース名;
</pre>

###テーブルの構成の表示
<pre>
SHOW COLUMNS FROM テーブル名;
</pre>

###テーブルのデータ変更（カラム追加）
<pre>
ALTER TABLE テーブル名 ADD (カラム名 データ型(桁数));
</pre>

###テーブルのデータ変更（カラム変更）
<pre>
ALTER TABLE テーブル名 MODIFY (カラム名 データ型(桁数));
</pre>

###テーブルのデータ削除（カラム削除）
<pre>
ALTER TABLE テーブル名 DROP COLUMN カラム名;
</pre>


#関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
ターミナルの表示方法

#ターミナルの表示方法

ターミナルの表示は、macの設定によるが、デスクトップで「F4」キーを押下するとメニューが表示されると思います。
表示されなければ「fn」を押しながら「F4」を押してください。

で表示されたメニューの中の「その他」を選択します。

<img width="118" alt="スクリーンショット 2017-04-22 4.28.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/bdd3f34f-35b8-0616-8dbf-47140d12a2f0.png">

ターミナルのアプリケーションが入っていると思うので、それを起動したら終わりです。

<img width="1327" alt="スクリーンショット 2017-04-22 4.30.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/96e5710d-b670-c725-4549-3d7357382fbf.png">

すごい簡単ですね♪
これ用にページ分ける必要なかったかも…

#関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
Togglで時間の使い方を可視化してみた

読んでいた本に、「タイムログを取って自身の時間の使い方を可視化してみる」という話があり
面白そうだったのでやってみました。

# Togglとは
タスク毎に時間を計測するツールで、タスクをカテゴリ分類することで
どのカテゴリにどれだけの時間を使っているのか可視化もできます。
5人以下のチームなら無料で使用することができます。

[Toggl公式](https://toggl.com/)

# タスクの分類の仕方
「7つの習慣」という本に出てくる、時間管理のマトリックスを元に分類を行いました。

||緊急|緊急でない|
|:--|:--|:--|
|重要|第1領域|第2領域|
|重要でない|第3領域|第4領域|

各タスクが緊急/重要なのかは、個人の感覚によってしまうので、
具体的に今回どのように分類したのかを以下にまとめました。
第1と第2の分け方がイメージしづらかったので、3日やらなくても問題ないかどうかでわけてみることにしました。

#### 第1領域
- 大半の仕事
- 通勤時間
- 身支度
- 食事
- 睡眠(7.5時間以内。一般男性の平均睡眠時間。)

#### 第2領域
- 運動
- 勉強
- 仕事中の休憩

ポモドーロ・テクニックで仕事をしているので、1時間毎に10分の休憩を取っています。
(25分働いて5分休んでの繰り返し)

#### 第3領域
- 無駄なミーティング
- 非効率的な仕事

#### 第4領域
- 睡眠(7.5時間を超えた分の睡眠時間)
- ゲーム
- テレビ
- ぼーっとしている時間

# 結果
月曜〜金曜の5日間、毎日タイムログを取った結果が以下。
<img width="855" alt="スクリーンショット 2017-04-22 3.11.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/69067/74e7dee5-87b0-4b98-5e9a-ea5b9f4f5cf9.png">

第1領域は項目が多いのもあり、生活の大半を占めていることがわかります。
重要項目なのでこれはとりあえず良いとして、
未来投資にあたる第2領域と無駄ゾーンの第3/第4領域が同じくらいなのが気になるところ...

第3領域は、ミーティングが無駄にならないような工夫をしたり、仕事の効率化を行うことで減らすことはできそうです。
第4領域は...「ぼーっとするな。テレビ見るな。ゲームするな」で減らすことはできそうですが...そういうことなのだろうか？

# おわりに
自分が時間をどう使っているのか、ログを取って可視化してみると発見があって面白いです。
ただログを取るのがなかなかめんどうなので毎日やらずとも、毎月初週だけやるとかでもいい気がします。
少し手間はかかるものの無料なので、お試し気分でぜひやってみてください！
Homebrewインストール手順

#Homebrewインストール手順

##前提
・x-codeがインストールされいていること
されていない場合はこちら（<a href="http://bit.ly/2pjyeDN">x-codeインストールリンク</a>）
・x-codeコマンドラインがインストールされていること
されていない（わからない）場合はこちら（<a href="http://bit.ly/2pZNO3N">x-codeコマンドライン</a>）

## Homebrewインストール
<a href="http://brew.sh/index_ja.html">Homebrew公式サイト</a>
公式サイトに記載してあるURLをコマンドラインに貼り付けて実行する。
※ターミナルの出し方がわからない方はこちら（<a href="http://bit.ly/2q02YpN">ターミナルの表示方法</a>）

<img width="1440" alt="h1.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/97e94351-67bf-bcd9-21ec-f1474d2483ad.png">

ターミナルに貼り付けるとこんな感じになります。
※ターミナルの色変えてるので、「あれ？自分のと違う」となるかもしれませんが…

<img width="970" alt="スクリーンショット 2017-04-22 3.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/4eac0b21-86f6-5a32-b29e-039a27d313d8.png">

でEnterを押すと、ログがどんどん出てきて下記のところで止まります。

<img width="1030" alt="スクリーンショット 2017-04-22 3.56.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/82c8ee34-7095-4d7a-9a31-5b27015c877b.png">

<h3>ここでEnterキーを押してください！！<br>
押すと下記の画面になると思います。</h3>

ここで入れるパスワードはmacのユーザーにログインする際のパスワードです。

<img width="1046" alt="スクリーンショット 2017-04-22 3.56.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/4e1836af-6287-807f-25ab-a68a781dea79.png">

その後はログが流れて、自分のユーザーが出てきたら完了です。

最後にしっかりインストールされたか確認しておきましょう！

ターミナルに下記のコードを丸々コピペしてください。
<pre>
brew update
</pre>

これが出ればOKです！お疲れ様でした。
<img width="363" alt="スクリーンショット 2017-04-22 4.03.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/9a6a192c-161a-7754-c96f-78d2ceef6b3b.png">


ちなみに、ログが多すぎて見づらいってなったら、下記のコマンドでログを画面外に消してください。
<pre>
clear
</pre>
※画面外に移動してるだけなので、スクロールさせれば出てきます。

#関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
MySQLを使おう

#MySQLを使おう

MySQLを使用する際に覚えておかなければならないこと
（覚えなくても、知っておく必要はある）

サーバー起動コマンド
<pre>
mysql.server start
</pre>

<img width="405" alt="スクリーンショット 2017-04-22 4.37.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/e51b4171-e64e-0f29-0265-8c22118768e5.png">

サーバー停止コマンド
<pre>
mysql.server stop
</pre>

<img width="401" alt="スクリーンショット 2017-04-22 4.37.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/94bb4935-7dfd-4d64-c612-89be34f05e92.png">

mysql接続
<pre>
mysql -u ユーザー名 -p パスワード
</pre>
※パスワードを設定していなければ入力しなくても良い

例）
<pre>
mysql -u root
</pre>

<img width="571" alt="スクリーンショット 2017-04-22 4.37.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/aed767f8-5623-12ab-3512-646c4a20bb9e.png">

下記の様になっていればSQL文を実行できる状態です。（MySQLに繋がっています。）
<pre>
mysql>
</pre>

ここからは、DBを作成してから、テーブル作成・・・
MySQLで行いたい作業を行なってください。

基本のコマンドなどなどはこちらに纏めておきます。（<a href="http://bit.ly/2pmC5zZ">MySQLコマンド</a>）

#関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
<a href="http://bit.ly/2pjm0el">mac MySQLインストール手順</a>
リンク一覧

#リンク一覧

##MySQL
<a href="http://bit.ly/2pjm0el">mac MySQLインストール手順</a>
<a href="http://bit.ly/2pZFDEw">windows MySQLインストール手順</a>
<a href="http://bit.ly/2pZQJtn">MySQLを使おう</a>


##Java
<a href="http://bit.ly/2pZGtRV">Java（eclipse)インストール手順</a>


##C＃


##Unity


##その他
<a href="http://bit.ly/2pjyeDN">x-codeインストール方法</a>
<a href="http://bit.ly/2pZNO3N">x-codeコマンドライン</a>
<a href="http://bit.ly/2pmy26y">Homebrewインストール手順</a>
x-codeコマンドライン

# x-codeのコマンドラインについて
まずはx-codeを起動します。
すると下記の画面が表示されると思います。
<img width="799" alt="スクリーンショット 2017-04-22 3.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/32b69586-ae64-900b-090c-2842787e5ab1.png">

この状態で表示されているウィンドウは触らず、macのメニュー欄の「Xcode」の中の「Preferences...」をクリックします。
<img width="280" alt="スクリーンショット 2017-04-22 3.37.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/00e39dec-dbd1-f786-540b-5d529b3c6200.png">

下記の画面が出てくると思います。
ここで、ウィンドウ内のメニューの「Locations」をクリックし、「Command Line Tools」が現在のx-codeのバージョンになっていることを確認します。
※現在のバージョンになっていればインストールされています。（最近はインストールされていることが多いのかな？）
<img width="750" alt="スクリーンショット 2017-04-22 3.38.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/93696e43-6719-b00b-999f-f1e8049d8305.png">


<h3>もし違っていて、インストールする場合は…どうするんだろ…？<br>
調べて、出てきたら更新しておきます！<br>
わかる方いたらコメントください！！！</h3>


# 関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
Chromeバージョン59のデベロッパーツールにCSS、JSのカバレッジタブが追加されるらしい

※追記 2017/06/06
現在のChrome最新版で利用できます。
わざわざChromiumをダウンロードする必要はありません。


---

Chromeバージョン59でCSSとJSのカバレッジが確認できるようになるようです。
（2017/04/23現在はChromeはバージョン58です）
https://developers.google.com/web/updates/2017/04/devtools-release-notes

ということで試してみることにしました。

# Chromiumのダウンロードと起動

次の記事を参考にさせていただきました。
[Chromeのヘッドレスブラウザがやってくる。というわけで試してみた](http://qiita.com/devneko/items/51f2e114a7e0b3389435)

こちらのページからダウンロード
https://download-chromium.appspot.com/

たぶんzipが落ちてくるので解凍して中の実行ファイルを実行
（windows版ではchrome.exe）

# カバレッジを見てみよう
デベロッパーツールを開いて、coverageタブを開きます。
（Qiitaのページで試しています。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/4744106d-499d-8873-360a-fdf70f65d85b.png)

Coverageを選択。↓Coverageタブ現る！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/4a3b565c-35f5-7869-5460-639ce2e72343.png)

start●ボタン押して、リロードして、stop！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/4fb77362-9ba9-2562-b006-0348d37b64a8.png)

CSSのカバレッジも見れるところが個人的に大感動！
(Qiitaのページでは見ることができなかったので適当なhtml作成して確認)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84259/d09ec678-8ddd-a699-4982-bd3d2cc5ac8f.png)

jasmine等で作ったtestページで計測すると良さそう。

ただ、複数ページを開いてscript実行をした結果を集計する方法がわからず。。。
無いのか？わからなかっただけか？



# リリース予定

http://www.chromium.org/developers/calendar
リリースは2017/06/06の予定みたいです。

---

本当は話題のヘッドレスモードやってみようと思ってChrome59調べ始めたのですが、
CSSのカバレッジやべぇ！と思ってカバレッジタブで遊んで終わってしまいました。
AndroidのData BindingでXML上でDateFormatを使ってDate型を文字列整形したい

# 経緯
Data Bindingライブラリを使ってる時に、Entityが持つDate型のプロパティをそのままXML上で整形した状態で表示したかった。

Data Binding使ってるとこういう部分はViewModelに持ってくというのもありだけど、リスト表示で使うAdapterの中だとEntityを渡して表示するケースもある。

そういった場合でも表示処理を分散させたくないのでXML側に寄せたかった。

# 方法
Commons Lang3の`DateFormatUtils`を使った

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DateFormatUtils.html

これを使って**2017/04/21 00:30に投稿**みたいな文字を出力させてみる

```xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <import type="org.apache.commons.lang3.time.DateFormatUtils" />
        <variable name="item" type="com.example.Item" />
    </data>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{DateFormatUtils.format(item.createdAt, `yyyy/MM/dd HH:mmに投稿`)}" />
</layout>
```

# イメージ
自分の今作ってるアプリで実際にやっている

<img width="379" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/20629/9b0e0f93-9aeb-ac18-663a-cfdd07cd2204.png">

# ほか
kotlin + Data Bindingあたり使ってQiitaアプリ作ってます。
https://github.com/chuross/qiiip

ある程度できてきたらなんか記事書くかもしれない。
DataBindingライブラリちょいちょい触ってたけど、便利なのでこれも色々書いていこうと思う。
Excelの「行列を入れ替える」っぽいことをSQLのUNPIVOT／PIVOTでやってみる。(Oracle Database)

まずはサンプルデータの作成彡(ﾟ)(ﾟ)

```sql
DROP TABLE TBL_10 PURGE;
CREATE TABLE TBL_10 (
    COL1   VARCHAR2(10)
  , VALUE1 NUMBER
  , VALUE2 NUMBER
  , VALUE3 NUMBER
);

INSERT INTO TBL_10 VALUES('XXXXX', 100, 200, 1000);
INSERT INTO TBL_10 VALUES('YYYYY', 200, 400, 2000);
COMMIT;
```

できた↓のデータが

```sql
SELECT * FROM tbl_10;

COL1           VALUE1     VALUE2     VALUE3
---------- ---------- ---------- ----------
XXXXX             100        200       1000
YYYYY             200        400       2000
```

↓の通り、UNPIVOTとPIVOTで行と列が入れ替わる彡(ﾟ)(ﾟ)

```sql
SELECT * FROM tbl_10
UNPIVOT(col_vals FOR col_names IN (value1, value2, value3))
PIVOT(MAX(col_vals) FOR col1 IN ('XXXXX', 'YYYYY'))
ORDER BY COL_NAMES;

COL_NA    'XXXXX'    'YYYYY'
------ ---------- ----------
VALUE1        100        200
VALUE2        200        400
VALUE3       1000       2000
```


もう少し解説すると、UNPIVOTで列(VALUE1, VALUE2, VALUE3)を行に変換して……・

```sql
SELECT * FROM tbl_10
UNPIVOT(col_vals FOR col_names IN (value1, value2, value3));


COL1       COL_NA   COL_VALS
---------- ------ ----------
XXXXX      VALUE1        100
XXXXX      VALUE2        200
XXXXX      VALUE3       1000
YYYYY      VALUE1        200
YYYYY      VALUE2        400
YYYYY      VALUE3       2000
```

上記の状態で、PIVOTで行(XXXXX, YYYYY)を列に変換、COL_VALS列を集計(MAX)することで、行列が入れ替わるんやで彡(ﾟ)(ﾟ)

```sql
SELECT * FROM tbl_10
UNPIVOT(col_vals FOR col_names IN (value1, value2, value3))
PIVOT(MAX(col_vals) FOR col1 IN ('XXXXX', 'YYYYY'))
ORDER BY COL_NAMES;

COL_NA    'XXXXX'    'YYYYY'
------ ---------- ----------
VALUE1        100        200
VALUE2        200        400
VALUE3       1000       2000
```

図解すると↓のような感じ彡(ﾟ)(ﾟ)
![IMG_2078.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/1be5d12b-8d00-c6e8-727e-7b5483891b47.jpeg)

INPIVOTで列(VALUE1～3)を行に変換して、PIVOTで行(XXXXX, YYYYY)を列に変換。
2行のレコードの複数列を比較するようなケースで、使えるんかと彡(ﾟ)(ﾟ)

下記ページを参照しております(｀･ω･)ゞ

* 図でイメージするOracle DatabaseのSQL全集-第8回 PivotとUnPivot-
http://www.oracle.com/technetwork/jp/articles/otnj-sql-image8-1869298-ja.html
nginx使用のMastodonでObsをA+にする

***
[コメント欄にてアドバイスをいただいているので、そちらもご覧ください (2017/04/22)](http://qiita.com/gc373/items/0688c9b0ee1632ddb376#comment-f76f13412c6e65ba9194)
***

こんにちは！こんにちは！

#####[インスタンスリスト](https://instances.mastodon.xyz/list)のスコアが気になる
Mastodonのインスタンス管理者としては気になりますよね。
ただ、よくスコアとかわからないし、なんか自分のサイトのスコア低い・・・
そんなとき、まずはHTTPSに対応するかと思いますが、その次に行うのがObsの対応です。
あまりMastodon向けに記述されているドキュメントがなくてイラッとしたので、殴り書いておきます。

*なお、この設定にしての責任は取れませんので自己責任でお願いします。*

#####ObsをA+にする設定
/etc/nginx/conf.d/mastodon.confを編集します。
[公式ガイド](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md)からnginxの設定をコピって貼り付けただけの人も多いと思います。
そこに `add_header` という記述があるので、そこを下記のように編集します。

~~add_header Strict-Transport-Security "max-age=31536000";~~
`add_header Strict-Transport-Security "max-age=31536000 ; includeSubdomains ; Preload ";`

そして、さらに下記を追記します。
```
  add_header Referrer-Policy "unsafe-url";
  add_header Content-Security-Policy "frame-ancestors 'none'; object-src 'none'; script-src 'self'; base-uri 'none'";
```
最終的には下記のようになっていれば大丈夫です。
```
  add_header Strict-Transport-Security "max-age=31536000 ; includeSubdomains ; Preload ";
  add_header Referrer-Policy "unsafe-url";
  add_header Content-Security-Policy "frame-ancestors 'none'; object-src 'none'; script-src 'self'; base-uri 'none'";
```
以上です。

#####注意点
この設定が正しいのかわかりませんが、一応現状[A+で動いています。](https://japaon.cf)
また、設定を変えることで/aboutの説明欄にjavascriptを埋め込んでいる場合は無効化されます。
多分設定で変えられる(script-scr 'self'あたり)と思いますが、未検証です。
できれば本職の方にきちんとした設定を確認してもらいたいのでたたき台にしてもらえればと思います。
これじゃダメだよ！ってつっこみ、お待ちしてます。
Jenkins Pipelineのハマりどころ（僕がハマったところ）

最近はCIといえば[Concourse](https://github.com/concourse/concourse)とかが流行っていますがJenkinsもpipelineがデフォルトで入るようになって昔とは変わってきました。

昔は「GUIついてるだけのcron」とか「結局Jenkins内のshellスクリプトが秘伝のタレになる」とか言われていました。
今はJenkinsfileというスクリプト(GroovyによるDSL)をプロジェクトのルートに置いておけばそこに対する手順の更新もgit等のvcsからバージョン管理できます。
更にはJenkinsfileの中で適切な記述をすることで操作を並列化できるのでビルド時間の短縮もできます。
そしてビルドの様子が（プラグインを設定すれば）いい感じに可視化されるので使っていて楽しいです。

簡単な使い方に関しては[このスライド](https://www.slideshare.net/hico_horiuchi/jenkins-20-pipeline-blue-ocean)とか[このスライド](https://www.slideshare.net/miyajan/make-jenkins-great-again)とかを見てもらうとして、この記事では実際に使い込んでみて僕がハマった内容と対策を共有します。

## `parallel` でパラメータ化した物を並列化したいんだけど？

Jenkinsfileには並列実行のための仕組みがあります。

```groovy:
parallel(
'production': {
  sh "mkdir production"
  sh "cd production && ../configure"
},
'test': {
  sh "mkdir test"
  sh "cd test && ../configure"
})
```

これは `parallel` という関数にmapを渡しているに過ぎないので、増えてくるようであれば当然こう書きたくもなります。

```groovy:ダメな記述:
def configs = [:]
for (conf in ["production", "test", "development", "deployment"]) {
  configs[conf] = {
    sh "mkdir ${conf}"
    sh "cd ${conf} && ../configure"
  }
}
parallel(configs)
```

これは文法上セーフですが期待通りには動きません。forループの中ではconfという参照に配列の中身が順番に渡されているだけなので、configsの右辺のブロックの中を評価するタイミングの頃にはクロージャで包まれた値が指す参照先は変わっています。上の例だとループを抜けるタイミングでは `conf` は `"deployment"` なので `conf="deployment"` のブロックが4回現れるだけになります。
そういう時はクロージャの中からちゃんと値が指せるようにバインドしてやれば解決できます。

```groovy:正しい記述:
def configs = [:]
for (conf in ["production", "test", "development", "deployment"]) {
  def c = conf  // これで解決
  configs[c] = {
    sh "mkdir ${c}"
    sh "cd ${c} && ../configure"
  }
}
parallel(configs)
```

## if文でビルドの通るパスを調整したいんだけど？

`stage("hoge")` と記述すれば名前の付いたステージを作れます。
`ビルドのパラメータ化` にチェックを入れれば、ビルド時にパラメータを与える事ができるので「普段はいつものパスだけど、手動でvalgrindを使う版のテストもキックしたい」みたいな時にパラメータから挙動を変える事ができます。

![bparam.png](https://qiita-image-store.s3.amazonaws.com/0/1716/bcf90b94-70c6-f14a-73aa-523b26db1a10.png)

なのでついうっかりこんな記述をしそうです

```groovy:ダメな記述:
if (test) {
  stage('test stage') {
    sh './some_test_script.sh'
  }
}
```

Jenkinsfileは宣言的な記述をする物で、手続き的な記述は推奨されていません。

```groovy:実はまだダメな記述:
stage('test stage') {
  if (test) {
    sh './some_test_script.sh'
  } else {
    echo 'test is skipped.'
  }
}
```

こんな感じに、ifによる分岐はステージの中に書きましょう。
変数の状態に限らず、stageの状態は一致するように書けばおそらく混乱はしにくいはず。
（この仕様は後々変わるかも知れないので別の書き方が推奨される場合はコメントで教えてください）

で、更にビルドのパラメータには真偽値や文字列が与えられるので真偽値でスイッチをしたくなりますが、変数を真偽値として扱ってはいけません。

```groovy:
if (test) {  // これは常に真になる
  echo "test is ${test}"  // -> test is false.
  echo "type is ${test.class}"  // type is class java.lang.String
}
```

文字列しか渡せないつもりで扱いましょう。
文字列の `"true"` を `true` に変えてくれる便利メソッド `toBoolean()` が便利です。

```groovy:
if (test.toBoolean()) {
  echo "test is true"  // falseの時はそもそもここに至れない
}
```

## Parallelの中でstageしたいんだけど？

*できません* 少なくとも手元のバージョン(2.7.4)では。
http://stackoverflow.com/questions/36872657/running-stages-in-parallel-with-jenkins-workflow-pipeline 
https://issues.jenkins-ci.org/browse/JENKINS-27394 `in Review`
https://issues.jenkins-ci.org/browse/JENKINS-33185 `Open`

そのうち解決されると思いますが、visualizationまで追いつくのはもう少し掛かりそう。
VSCodeでAngularのファイルを簡単に切り替える

やぬてつです。

この記事ではMacのVSCodeでのTypeScript/Angularをターゲットとしています。

VSCodeでAngularを書いている時、`.html`ファイルと`.ts`ファイルをサクッと切り替えたいですよね。

作る前に拡張を探してみたけど、しっくり来るものがなかったので自分で作りました。

かなりメンドクサイから解消されましたよー

[Angular Toggle Counterpart Files](https://marketplace.visualstudio.com/items?itemName=yanutetsu.angular-toggle-counterpart)

キーバインドはEamcsベースのキーバインドですが、簡単に変更可能です。

- `Ctrl+c c`で`.html`と`.ts`のトグル
- `Ctrl+c Ctrl+c`で`.ts`と`.spec.ts`のトグル

マウスでディレクトリ構成を見ながらファイルを開くのもわかりやすくていいですけど、コマンドで開けるのも簡単でいいですよ。ぜひ使ってみてください。
pd.tseries.offsets.DateOffset は注意して使わないとかなり遅いことがある

## 言いたいこと

`pd.tseries.offsets.DateOffset.__mul__` は使わない方が良い。

## 経緯

pandasでは、日時を扱うために`pd.Timestamp` というクラスが用意されています。また、ある日時からある期間離れた日時を計算したい時は `pd.tseries.offsets.DateOffset` を使います。
今回は、`pd.tseries.offsets.DateOffset`の面白い振る舞いを紹介します。

まずは、以下の実行結果を見てください。

```
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + 100 * pd.tseries.offsets.DateOffset(seconds=1)"
10 loops, best of 3: 0.438 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + 1000 * pd.tseries.offsets.DateOffset(seconds=1)"
10 loops, best of 3: 3.85 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + 10000 * pd.tseries.offsets.DateOffset(seconds=1)"
10 loops, best of 3: 41.9 msec per loop
```

何が言いたいかわかりますか？
**DateOffsetに掛け算しただけ実行時間が線形に増えています。**
多分ですが、内部で `pd.Timestamp.__add__` が掛け算した回数だけ呼ばれています。

同じことをやるにはこうすると良いです。

```
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + pd.tseries.offsets.DateOffset(seconds=1*100)"  
10 loops, best of 3: 0.0328 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + pd.tseries.offsets.DateOffset(seconds=1*1000)"   
10 loops, best of 3: 0.0373 msec per loop
$ python -m timeit -u msec -n 10 -s "import pandas as pd" "pd.Timestamp('2010-01-01 00:00:00') + pd.tseries.offsets.DateOffset(seconds=1*10000)"
10 loops, best of 3: 0.0336 msec per loop
```

高速（というか、直感的に当たり前の挙動）になりました。

ちなみに、python標準モジュールのdatetimeを使うとこうなります。非常に高速です。

```
$ python -m timeit -u msec -n 10 -s "import datetime" "datetime.datetime(2010,1,1) + 100 * datetime.timedelta(seconds=1)"
10 loops, best of 3: 0.0031 msec per loop
$ python -m timeit -u msec -n 10 -s "import datetime" "datetime.datetime(2010,1,1) + 1000 * datetime.timedelta(seconds=1)"
10 loops, best of 3: 0.00276 msec per loop
$ python -m timeit -u msec -n 10 -s "import datetime" "datetime.datetime(2010,1,1) + 10000 * datetime.timedelta(seconds=1)"
10 loops, best of 3: 0.00227 msec per loop
```
PHP公式のDocker ImageでLaravelを動かす

Docker Hubにある[PHPのオフィシャルイメージ](https://hub.docker.com/_/php/)をベースにして、
Laravelを動かすことのできるDockerfileを記述してみました。

なお、このDockerfileはLaravelのプロジェクトルートに置かれている想定です。

```Dockerfile
FROM php:7.1-apache
RUN apt-get update && apt-get -y install git unzip

RUN DEFAULT_SITE_FILE=/etc/apache2/sites-enabled/000-default.conf && TMP=$(mktemp) && sed 's!/var/www/html!/var/www/html/public!' $DEFAULT_SITE_FILE > $TMP && mv $TMP $DEFAULT_SITE_FILE
RUN curl -L https://raw.githubusercontent.com/php/php-src/master/php.ini-production | sed 's/expose_php = On/expose_php = Off/' > /usr/local/etc/php/php.ini
RUN a2enmod rewrite

COPY . /var/www/html

WORKDIR /var/www/html
RUN sh -c 'if [ ! -x /var/www/html/composer.phar ]; then curl https://getcomposer.org/installer | php; fi'
RUN ./composer.phar install

RUN chown -R www-data:www-data /var/www/html
```

# RUN の狙い
- `apt-get -y install git unzip` はComposerを使った依存モジュールのインストールに必要。
- `RUN DEFAULT_SITE_FILE=...` は、ドキュメントルートをプロジェクトルートではなくその下のpublicディレクトリにするため。
- `RUN curl -L ...` は、PHPのリポジトリからphp.iniを取得して、expose_php を書き換えてPHPのバージョンがヘッダに出ないようにする。純粋に開発環境であれば不要かもしれない。
- `RUN a2enmod rewrite` は mod_rewrite を有効にする。
- `RUN sh -c ...` はプロジェクトにcomposerがなければ取得する。
- `RUN chown ...` はWebサーバと実行権限を揃えるため。もしかするとstorageディレクトリだけでもいいのかもしれない。
PHPで学ぶデザインパターン(Template Methodパターン)

# Template Methodパターンとは
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンのことをテンプレートメソッドパターンと呼びます。


# Template Methodパターンで登場する概念
## AbstractClass(抽象クラス)
抽象メソッドを宣言する。
処理を実装するのは次のConcreateClassになる。
実際の処理内容は記載しないが、ある程度処理の流れを形作ることが重要。

## ConcreateClass(具象クラス)
抽象メソッドを具体的に実装する。
1つのAbstractClass(抽象クラス)に対して複数のConcreateClass(具象クラス)を作成することで、同じ型(テンプレート)のクラスを作成することができる。

またサブクラスとして、スーパークラスで宣言されている抽象メソッドを実装する責任が生じており、これをsubclass responsibility(サブクラスの責任)と呼ぶ。

# 簡単なコードを書いてみる
## AbstractClass(抽象クラス)

```php
abstract class AbstractDisplay
{
    abstract protected function open();
    abstract protected function output();
    abstract protected function close();

    public function display()
    {
        $this->open();

        for ($i = 0; $i < 5; $i++) {
            $this->output();
        }

        $this->close();
    }
}
```

実際にopen,output,closeで行う処理はまだ定義されていないが、次に具象クラスで定義する。
共通メソッドであるdisplayを呼び出すことで、それぞれの具象クラスで定義をするopen→output(5回)→closeが呼ばれる処理の流れを作成した。

## ConcreateClass(具象クラス)

```php
class CharDisplay extends AbstractDisplay
{
    private $string;

    public function __construct($string)
    {
        $this->string = $string;
    }

    protected function open()
    {
        echo "<<";
    }

    protected function output()
    {
        echo $this->string;
    }

    protected function close()
    {
        echo ">>" . PHP_EOL;
    }
}
```
AbstractDisplayクラスを継承して、最低限実装が必要なメソッドのみ実装する。


## ConcreateClass(具象クラスその2)

```php
class StringDisplay extends AbstractDisplay
{
    private $string;
    private $width;

    public function __construct($string)
    {
        $this->string = $string;
        $this->width = mb_strlen($string);
    }

    protected function open()
    {
        $this->outputLine();
    }

    protected function output()
    {
        echo "|" . $this->string . "|" . PHP_EOL;
    }

    protected function close()
    {
        $this->outputLine();
    }

    private function outputLine()
    {
        echo "+";
        for ($i = 0; $i < $this->width; $i++) {
            echo "-";
        }
        echo "+" . PHP_EOL;
    }

}
```
こちらも同じくAbstractDisplayクラスを継承して各メソッドを実装する。
それぞれのメソッド内容はCharDisplayクラスとは違ったものにする。

## 呼び出しを行う

```php
$char = new CharDisplay('a');
$char->display();

$string = new StringDisplay('Hello world');
$string->display();

/*
<<aaaaa>>
+-----------+
|Hello world|
|Hello world|
|Hello world|
|Hello world|
|Hello world|
+-----------+
 */
```

それぞれの具象クラスでdisplayメソッドを呼び出すとコメントのようになる。
このように同じような処理をする場合には、先に抽象クラスで枠組みを決めて、実際に具象クラスで実装をするのがテンプレートメソッドパターンである。



# メリット
同じような処理をするときは同じようなメソッドが必要になるためロジックの共通化ができる。
もちろん元のクラスをコピペして新しいクラスを作ることもできるが、共通部分に不具合があった場合にすべてのクラスを修正しなければいけなかったりする。

# 参考
Java言語で学ぶデザインパターン入門
EmacsでTypeScript/Angularを快適に開発したい

やぬてつです。

この記事ではMacOSでEmacs24.5を利用し、TypeScript2系、Angular2をターゲットにしています

EmacsでTypeScriptを書くときは何を利用していますか？私はtypescript-modeを利用しています。そんな時に、ng2-modeなるものをみつけました。

ng2-modeなかなかよいのですが、flycheckが動作しなくて、ちょっと不便でした。なんとかflycheckをng2-modeで動作できないか調べてみたんですが、簡単にはできそうにありませんでした。

そこで、逆転の発想で、ng2-modeにあった機能をまるっと移植しようということにしました。

やることはソースコードのカラーと対応するtsフィルとhtmlファイル,specファイルのバッファ切り替えです。

```lisp
(defun ng2--is-component (name)
  (equal (file-name-extension (file-name-sans-extension name)) "component"))

(defun ng2--is-service (name)
  (equal (file-name-extension (file-name-sans-extension name)) "service"))

(defun ng2--is-pipe (name)
  (equal (file-name-extension (file-name-sans-extension name)) "pipe"))

(defun ng2--is-directive (name)
  (equal (file-name-extension (file-name-sans-extension name)) "directive"))

(defun ng2--is-file (name)
  (cond ((ng2--is-component name) t)
        ((ng2--is-service name) t)
        ((ng2--is-pipe name) t)
        ((ng2--is-directive name) t)))

(defun ng2--counterpart-name (name)
  (if (ng2--is-component name)
      (let ((ext (file-name-extension name))
            (base (file-name-sans-extension name)))
        (if (equal ext "ts")
            (concat base ".html")
          (concat base ".ts")))
    name))

(defun ng2-open-counterpart ()
  (interactive)
  (find-file (ng2--counterpart-name (buffer-file-name))))


(defun ng2--counterpart-spec-name (name)
  (when (not (ng2--is-file name)) name)
  (let ((ext (file-name-extension name))
        (base (file-name-sans-extension name)))
    (if (equal ext "ts")
        (let ((ext2 (file-name-extension base))
              (base2 (file-name-sans-extension base)))
          (if (equal ext2 "spec")
              (concat base2 ".ts")
            (concat base ".spec.ts")))
      (concat base ".ts"))))

(defun ng2-open-counterpart-spec ()
  (interactive)
  (find-file (ng2--counterpart-spec-name (buffer-file-name))))
```

Emacsはサクッと自分好みにカスタマイズできちゃうところがいいですよね
できればng2-modeで公式にサポートされるといいなー
Solid State Relay

Solid State Relay (ACのスイッチ)のテスト. 
Lチカ. 
ただし, デバイスを

- 白熱灯風LED
- 青の蛍光灯
- Lightface(nittoh様よりお借りしているもの)

を使用して比較. 
SSR自体は延長ケーブルの途中を切って取り付けた. 

SSRとして使用したのは秋月のもの: 
http://akizukidenshi.com/catalog/g/gK-00203/

配線はこんな感じ: 

![IMG_3641.jpg](https://qiita-image-store.s3.amazonaws.com/0/102253/054e9908-1f0b-0bcb-6dbc-fe20ba380a7e.jpeg)

全体:

![IMG_3640.jpg](https://qiita-image-store.s3.amazonaws.com/0/102253/09a89207-b3b2-b35e-cd44-d1423e937002.jpeg)

DCのinputは
>
+ : 2番pin
- : GND

というシンプルさ. 

codeは今回はarduinoでHIGH/LOWしてるだけ. 
本質的にはほんとにLチカと一緒. 


```solid_state_relay.ino
const int ssrPin = 2; 

void setup() {
 pinMode(ssrPin, OUTPUT);
}

void loop(){
  digitalWrite(ssrPin, HIGH);
  delay(2000);
  digitalWrite(ssrPin, LOW);
  delay(1000);
  digitalWrite(ssrPin, HIGH);
  delay(2000);
  digitalWrite(ssrPin, LOW);
  delay(1000);
  digitalWrite(ssrPin, HIGH);
  delay(500);
  digitalWrite(ssrPin, LOW);
  delay(4000);
  for(int i=500; i<100; i-=-50){
    digitalWrite(ssrPin, HIGH);
    delay(i);
    digitalWrite(ssrPin, LOW);
    delay(i);
  }
  for(int i=1; i<=10; i++){
    digitalWrite(ssrPin, HIGH);
    delay(100);
    digitalWrite(ssrPin, LOW);
    delay(100);
  }
}
```

動作はこんな感じ: 
https://youtu.be/KP1Ar_sjo9A

遊びで無駄にHIGH/LOWしてるけど, 実質はホントにloop内の最初の4行くらいでOK

```solid_state_relay_simple.ino
const int ssrPin = 2; 

void setup() {
 pinMode(ssrPin, OUTPUT);
}

void loop(){
  digitalWrite(ssrPin, HIGH);
  delay(2000);
  digitalWrite(ssrPin, LOW);
  delay(1000);
}
```

実質の手間はDCのLチカとほぼ変わらないけど, ACのデバイスだけあって, なんか派手で楽しい.
C# LINQPadでお手軽Webサーバ

なんとなくWebリクエストを投げたくなったとき、壊してもよいWebサーバがあるととても便利。

HTTPレスポンスを好きなように生成したり、遅延をシミュレートしたりもできるWebサーバをさっくり立ててみる。
立てたサーバには http://localhost:9999/test などのURLで接続できる。

```
System.Net
System.Threading.Tasks
```

```csharp
void Main()
{
	CancellationTokenSource cts = new CancellationTokenSource();
	var t = StartListener(cts.Token);

	Console.WriteLine("Press enter to stop.");
	Console.ReadLine();
	
	cts.Cancel();
	try
	{
		t.Wait();
	}
	catch {}
}

async Task StartListener(CancellationToken ct)
{
	HttpListener listener = new HttpListener();
	listener.Prefixes.Add("http://localhost:9999/");
	listener.Start();
	ct.Register(()=>listener.Stop());
	
	while (!ct.IsCancellationRequested)
	{
		var context = await listener.GetContextAsync();
		var req = context.Request;
		var res = context.Response;

		Debug.WriteLine("Connected From: " + req.RemoteEndPoint);
		await Task.Delay(500);
		
		var response = $"{req.HttpMethod} {req.RawUrl} HTTP/{req.ProtocolVersion}\r\n";
		response += String.Join("\r\n", req.Headers.AllKeys.Select(k => $"{k}: {req.Headers[k]}"));
		
		var responsedata = Encoding.ASCII.GetBytes(response);
		res.OutputStream.Write(responsedata, 0, responsedata.Length);
		res.Close();
	}
}
```


※Visual Studio でもできるけど LINQPad の手軽さが大事。
Python でハートを描く その 2 (SymPy 編)

# 概要

昨晩「Pythonからはじめる数学入門」という書籍を読みながら、[Python でハートを描く](http://qiita.com/QUANON/items/ccbdfb8048f223e8892b) という記事を書きました。今晩も :bed: の中で読んでいたのですが、第 4 章で紹介されていた [SymPy](http://www.sympy.org/en/index.html) というライブラリに度肝を抜かれました。なんと Python で式の計算ができちゃうのです！鉛筆で紙に方程式を書いて解くのと同じ感覚で、手軽にプログラムできちゃいます。これがあれば昨日の :heart: を描画するコードもシンプルになるのではと :bed: から飛び起きました。

# ハートを描く

前回の [Python でハートを描く](http://qiita.com/QUANON/items/ccbdfb8048f223e8892b) と同様の式を使います。

$x = 16sin^3(t)$
$y = 13cos(t)-5cos(2t)-2cos(3t)-cos(4t)$

この式をそのまま [plot_parametric](http://docs.sympy.org/dev/modules/plotting.html#sympy.plotting.plot.plot_parametric) 関数[^1]に渡すことでプロットできます。直感的すぎる！ :open_mouth:

```py
from sympy.plotting import plot_parametric
from sympy import Symbol, cos, sin


def draw_heart():
  t = Symbol('t')
  x = 16 * sin(t) ** 3
  y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)

  p = plot_parametric(x, y, autoscale=True, title='ハート', show=False)
  p[0].line_color = 'pink'
  p.show()


if __name__ == '__main__':
  try:
    draw_heart()
  except KeyboardInterrupt:
    pass
```

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/6697/cf2bce8f-d87d-9ea7-f283-6ccac3cd301f.png)

[^1]: 書籍内で紹介されていた SymPy のプロット用の関数は [plot](http://docs.sympy.org/dev/modules/plotting.html#sympy.plotting.plot.plot) でしたが、今回はパラメーター表示 (媒介変数表示) で表された関数をプロットする必要があるので [plot_parametric](http://docs.sympy.org/dev/modules/plotting.html#sympy.plotting.plot.plot_parametric) を使いました。
平成29年度学力テスト中学校数学B-問4をだいたいsympyを使って解く

(参考)平成29年度学力テスト中学校数学B-問4＞筋道を立てて証明し，証明を振り返って考えること（正三角形）
http://www.nier.go.jp/17chousa/pdf/17kaisetsu_chuu_suugaku.pdf#PAGE=119

(1)は,sympyでどうすればいいか、わかりませんでした。クラスメソッドになりますか？
(参考)ASAでいいですか。
https://en.wikipedia.org/wiki/Solution_of_triangles
sympyの三角形の合同条件をさがしています。よろしくお願いします。

(2)(3)は、x,tに値を入力しています。CADを使ったほうが早いかも。

```python
from sympy import *
var('x t')
print('(1)===================================================')
x=100
B=Point(0,0)
A=Point(x*cos(pi/180*60)  ,x*sin(pi/180*60))
C=Point(x*cos(pi/180*60)*2,0)
E2=C.rotate(pi/180*20,B)
ans=Line(B,E2).intersection(Line(A,C))
E=Point(ans[0].x,ans[0].y)
print("#角度BEA=",float(mpmath.degrees(Polygon(B,E,A).angles[E])))
print('(2)===================================================')
t=50
D=B.translate(t*cos(pi/180*  0),t*sin(pi/180*  0))
E=C.translate(t*cos(pi/180*120),t*sin(pi/180*120))
ans=Line(B,E).intersection(Line(A,D))
F=Point(ans[0].x,ans[0].y)
print("#角度BFD=",float(mpmath.degrees(Polygon(B,F,D).angles[F])))
print('---------------------------------------------------')
t=50
D=B.translate(t*cos(mpmath.radians(  0)),t*sin(mpmath.radians(  0)))
E=C.translate(t*cos(mpmath.radians(120)),t*sin(mpmath.radians(120)))
ans=Line(B,E).intersection(Line(A,D))
F=Point(ans[0].x,ans[0].y)
print("#角度BFD=",float(mpmath.degrees(Polygon(B,F,D).angles[F])))
#
#角度BEA= 80.0
#角度BFD= 59.99999999999999
#角度BFD= 60.00000000000002
```
Docker Community Edition 

# Docker Setup

## インストール
### Community Edition Download (2017/04)
https://store.docker.com/editions/community/docker-ce-desktop-mac?tab=description  

### Mac Install  
<img width="720" alt="スクリーンショット 2017-04-21 21.46.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/997a9f73-e761-40cd-4ea5-5736ebb2da55.png">  

<img width="773" alt="スクリーンショット 2017-04-21 21.50.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/bcdacbc9-02d4-7a7e-ec1f-0efe1426786d.png">

<img width="603" alt="スクリーンショット 2017-04-21 21.51.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/d1442886-edd7-e893-6f24-1877622c0d7a.png">
<img width="596" alt="スクリーンショット 2017-04-21 21.51.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/5a637f32-aa4e-f87a-3c57-a41b2333723d.png">

<img width="341" alt="スクリーンショット 2017-04-21 21.52.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/ca177145-d17b-338d-576b-a21000759998.png">

<img width="345" alt="スクリーンショット 2017-04-21 21.52.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/b1da083f-d5a2-a1b8-4a63-9d19f67fb9a1.png">

<img width="287" alt="スクリーンショット 2017-04-21 21.53.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/87fa7b6f-a8f2-ff1d-6c77-ce0cc9200a4e.png">  

## TensorFlow Install
### CPU Binary image

```Bash
$ docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
```
<img width="1280" alt="スクリーンショット 2017-04-21 22.08.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/4b3ca2b5-75c2-958b-d40b-967f5e72149f.png">

### Jupyter Note Book 

How to use without a password.　　

```Bash
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=89e5881eb77e925df5b66e8858dfec5b22a4158c978a454e
```  
Chrome
<img width="1177" alt="スクリーンショット 2017-04-21 22.31.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/e5ae0d49-8a32-5105-0765-53dac067c76b.png">  

<img width="1166" alt="スクリーンショット 2017-04-21 22.34.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/177475/d1dfa0b7-16cf-3880-51ce-9d394b2fb8b3.png">
swiftenvでSwiftのバージョン管理をする

pyenvみたいにコマンド一つでバージョンを変更できるツールを見つけた。
https://github.com/kylef/swiftenv

##入れ方
https://swiftenv.fuller.li/en/latest/installation.html

以上.

## 使い方
入れたいSwiftのバージョンを指定して実行
`$ swiftenv install <バージョン番号>`

インストールが割と長いので注意.

終わったらバージョン確認
```
$ swiftenv version
3.0.1 (set by ~/.swiftenv/version)
```

## 全環境のSwiftバージョンを切り替える
以下のコマンドを実行
```
$ swiftenv global <切り替えたいバージョン>
```
逆にローカル環境(特定のディレクトリとか)のみ切り替えたい時は
```
$ swiftenv local <切り替えたいバージョン>
```
でいける。

他のコマンドについては公式リポジトリに使い方が書いてあるので、そこを見ればだいたいわかるはず。
マストドンのバックエンドに Google Cloud Storage を使う方法 #mastodon

# マストドンのバックエンドに Google Cloud Storage を使う方法

先日マストドンのぼっちインスタンス、[mstdn.okumin.com](https://mstdn.okumin.com/) を Google Cloud Platform で構築しました。
その全体構成は『[今流行りの #mastodon on Google Container Engine](http://blog.okumin.com/entry/2017/04/19/011732)』で紹介しています。

この記事で述べられているように、mstdn.okumin.com はアイコンや投稿画像を保存する領域として、[Google Cloud Storage](https://cloud.google.com/storage/) を使用しています。
先程[バックエンドに GCS を使う方法について質問を受けた](https://mstdn.jp/users/sigpipe/updates/1140473)ので、Qiita にまとめておこうと思います。

## Google Cloud Storage を使う理由

mstdn.okumin.com では、複数インスタンスからの読み書きを容易にするため、GCS を使用しています。

マストドンのプロセスのうち、アイコンや投稿画像の書き込みを行うプロセスは Web フロント(Rails) とバックグラウンドプロセス(sidekiq)の２つです。
前者はユーザーのアイコンアップロードなどを行うため、後者はよくわからんけどフォロイーのアイコンなどを保存するために書き込みを行います。

mstdn.okumin.com はこれらのプロセスをそれぞれ別の K8S Pod としてデプロイしているため、最小構成でも複数コンテナから同時に静的ファイルを書き込めるストレージを用意する必要があります。

最初は sidekiq が画像を保存すると知らなかったので[永続ディスク](https://cloud.google.com/compute/docs/disks/)を Web フロントにアタッチしていました。
永続ディスクは[複数サーバからの同時書き込みができない](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes)ようなので、問題が発覚したときは頭を抱えたのですが、GCS には [S3 互換 API](https://cloud.google.com/storage/docs/interoperability) があるという情報を入手。

マストドンはストレージバックエンドとして S3 を使用することができるので、これを使うことにしました。

## マストドンで GCS を使う方法

### 1. GCS のバケットを作る

適当なバケットを作ります。
この記事では「mstdn_bucket」というバケットを作ることにします。

### 2. S3 互換 API 用アクセスキー、シークレットキーを取得

(Amazon S3 からの)[単純な移行](https://cloud.google.com/storage/docs/migrating#migration-simple)に書かれている手順を参考に、アクセスキーとシークレットキーを取得します。

### 3. S3 を使うように設定する

[.env.production.sample](https://github.com/tootsuite/mastodon/blob/0876a06e4544bc0946f3f6d884c7e2507ee12def/.env.production.sample#L60-L78) で触れられているように、環境変数を用いて S3 モードをセットアップすることができます。
設定値は、次のようになります。

```
S3_ENABLED=true
S3_BUCKET=mstdn_bucket
# 手順2で取得したアクセスキー
AWS_ACCESS_KEY_ID=GOOGXXXXXXXXXXXXXXXX
# 手順2で取得したシークレットキー
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# 多分なんでもいいと思うが、自分は次のように設定している
S3_REGION=ASIA-NORTHEAST1
S3_PROTOCOL=https
S3_HOSTNAME=storage.googleapis.com
S3_ENDPOINT=https://storage.googleapis.com/
```

ポイントは「S3_ENDPOINT」を設定する必要がある点で、これがないとうまく動作しませんでした。

## まとめ

以上、S3 互換 API を使って GCS をマストドンバックエンドとして使用する方法でした。
mstdn.okumin.com は過剰な構成になっていて、技術的に語れる点が他にもあるので、暇があれば小出しにしていきたいと思います。

稼働中の Terraform と Kubernetes 設定ファイルを参考に書いたので間違ってはいないと思いますが、色々思い出しながら書いた部分もあるので、間違っていたら教えてください。