OmniAICreator/Qiita-1.07M huggingface dataset:
[Phabricator] Installation Guide with Docker

# Phabricator
Facebook的opensource專案
它是軟體開發協同作業的工具集合包
包含以下:

- Arcanist: CLI
- Diffusion: repository browser可整合GitHub, GitLab等
- Differential: pre-push code review
- Audit: post-push code review
- ...

詳見[phabricator on GitHub](https://github.com/phacility/phabricator)
以下介紹如何安裝至本機並搭配docker建制環境
至於有興趣的使用者可以試著更進一步使用docker-compose撰寫更容易建制環境的方式

## Installation Requirements
- nginx
- php-fpm(required "php-mysql" extensions)
- MySQL

```bash
$ mkdir <work_dir>
$ cd <work_dir>
$ git clone https://github.com/phacility/libphutil.git
$ git clone https://github.com/phacility/arcanist.git
$ git clone https://github.com/phacility/phabricator.git
```

## Configuration
### MySql
pull mysql docker image and run it

```bash
$ docker run --name local-mysql -v <volume>/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=<mysql_root_password> -p 3306:3306 -d mysql
```

### php-fpm
get [php5-fpm-mysql](https://github.com/Jim-Lin/php5-fpm-mysql) dockerfile and build image

```bash
$ git clone https://github.com/Jim-Lin/php5-fpm-mysql.git
$ cd php5-fpm-mysql
$ docker build -t php:5-fpm-mysql .
```

當php:5-fpm-mysql image build完成之後, run image

```bash
$ docker run --name local-fpm --link local-mysql:db -p 9000:9000 -v <work_dir>:/path/to -d php:5-fpm-mysql
```
其中**work_dir** mount to **/path/to**會在接下來的nginx段落說明

### nginx
首先建立default.conf

```nginx
server {
  root        /path/to/phabricator/webroot;

  location / {
    index index.php;
    rewrite ^/(.*)$ /index.php?__path__=/$1 last;
  }

  location = /favicon.ico {
    try_files $uri =204;
  }

  location /index.php {
    fastcgi_pass   fpm:9000;
    fastcgi_index   index.php;

    #required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;

    #variables to make the $_SERVER populate in PHP
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

    fastcgi_param  REMOTE_ADDR        $remote_addr;
  }
}

```
- root: **/path/to/**對應到前面run php-fpm image的**work_dir**
- fastcgi_pass: **fpm**:9000是之後run nginx image link到local-fpm的別名

```bash
$ docker run --name local-nginx --link local-fpm:fpm -p 80:80 -p 443:443 -v <volume>/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro -d nginx
```

## Setup
進入local-fpm container中

```bash
$ docker exec -it local-fpm bash
```

進入之後執行storage upgrade

```bash
$ cd /path/to/phabricator
$ ./bin/storage upgrade --user root --password <mysql_root_password>
```
upgrade期間會要求設定

```bash
$ ./bin/config set mysql.host db
$ ./bin/config set mysql.user root
$ ./bin/config set mysql.pass <mysql_root_password>
$ ./bin/config set mysql.port <mysql_port>
```
- host: 請填container已經link到local-mysql的別名**db**
- port: 預設不填是3306

upgrade之後
in your browser go to http://127.0.0.1
inverse_of について


## inverse_of とは

ActiveRecord で双方向の関連付けをしている以下のようなクラスがあるとする。

```ruby
class Customer
  has_many :orders
end

class Order
  belongs_to :customer
end
```

同じ Customer を指しているのに
次のような変更を加えると
データの不整合が生じてしまう。


```ruby
c = Customer.first
o = c.orders.first

c.first_name = "Change"

c.first_name == o.customer.first_name #=> false

```

これは、同じデータを持つ別々のオブジェクトであることが原因。

```ruby
c = Customer.first
o = c.orders.first

c.equal? o.customer #=> false

```

`inverse_of` を使うと、同じオブジェクトをみるようになり、
このようなデータの不整合が生じなくなるとともに
無駄にオブジェクトを生成しないので、アプリケーションの効率もよくなる。

## Q: いつも使えばいいのでは？
オプション指定する必要があるということは、`inverse_of` を使いたくないタイミングなんてのがあるのだろうかと疑問に思った。

### A: Rails4.1 以降はデフォルト化されていた
結局、 `inverse_of` を使いたくないタイミングというのは見つけられず、
代わりに、 `inverse_of` は自動で設定されるようになったということがわかった。

この記事が一番わかりやすかった。
Automatic Inverse Associations に至るまでの経緯から その実現方法について簡単な説明付き。 
http://wangjohn.github.io/activerecord/rails/associations/2013/08/14/automatic-inverse-of.html


上の記事によるとこのコミットで追加されている。
https://github.com/rails/rails/commit/26d19b4661f3d89a075b5f05d926c578ff0c730f

ただし、自動で `inverse_of` を設定してくれるのは
:has_many, :has_one, :belongs_to 関連付けに対してだけ。
:conditions, :through, :polymorphic, :foreign_key などを使用した複雑な名前付けが絡んでくると、`set_automatic_inverse_of` メソッドの扱える範囲を越えてしまう。
人工知能で自動作曲してみた

##概要
ニューラルネットワークLSTMを使って作曲人工知能を作ってみた
パターン１
https://www.youtube.com/watch?v=iaG-svtxmkg
パターン２
https://www.youtube.com/watch?v=ZnNxsyoaWV4

##今までの作曲LSTMと少し違う点
１．パート別に学習させる
２．学習させるデータをしっかり選定する

##結論とわかったこと
・過学習がえげつない
・リズムを理解してくれない・コード進行のルールを理解してくれない
→つまり、人間の価値観や気持ちよさの基準があるならやはり
何らかの形でルールを教えないとダメ
・データ量を集めることは大切

##やったこと
・pretty midiというライブラリを使ってmidiファイルを学習できる形に変換
・バッキングパート、ベースパート、メロディパートに分けて学習させる
・バッキング生成→バッキングを受けてベース・・・という順序で生成
・メロディは過学習がえげつないので上のデータには載せていない

##補足
・パターン２も過学習がキテる
・リクエストあればもう少し詳しくどうやったか書きます
HTML5 Conference 2016 Notes

# HTML5 Conference 2016 Notes

## W3C Nakamura-san
HDR can change brightness of each pixel. Web needs implementation.
Web is the center of Buzz Word(Big Data, IoT, AI).
Web is distributed OS around the world
UNIX vs Web
TV and instrument panel on the car will be HTML
ePub and W3C will be merged
Up-down direction is on progress in the CSS Working group.
The keypoint of block chain is trust in the distributed system.
One of copperation between Web and IoT is Servient.

## Increments Oikawa-san
Web as Application
API, Web Components, Progress Apps to follow native
Spatial sound by Web
WebAssembly: Run C++ on browser
Increase of mobile app means reject to mobile Web => AMP
Native is not perfect. Users can't find it.

## Latest trend of React and best practice by Kobayashi-san
### General information
Used by Instagram, Netflix, Twitter(mobile), AbemaTV, Hyperterm(terminal made by Electron), new Jenkins component
Learn once, Write anywhere
Declative. jQuery is mission base
### Best practice
Stateless Functional Components is first choice. Just function without instance.
State is only for the data which needs display.
From 15.3, PureComponent was introduced. Shallow comparison between props and state improves performance.
Arrow function generates each time. Measurement by react-addons-perf is important.
createClass is deprecated at slow pace
High Order Components. recomponents is utility collection
Function as Child Components doesn't need wrap, but optimization is difficult.
The state of application should be stored on one place as possible.
Redux is popular recently.
There are three choices for React test.
Use ShallowRender for Component unit test. enzyme by AirBnB is useful
react-test-renderer is recently added
By eslint plugin, you can check whether the code conform with best practice
Demo of React Story Book
Demo of Redux Dev Tools. Export as json is possible.
### Real world
Facebook "We only open source what we use"
OSS
### Future
Core will shrink
ReactFiber is complete replacement of internal algorithm
HTML5 CONFERENCE 2016メモ

# HTML5 Conference 2016 メモ

## W3C 中村さん
HDRはPixelごとに輝度を変えられる。Webも対応していく必要がある。
Buzz Word(Big Data, IoT, AI)でもWebが中心
Webは世界にある分散OS
UNIXとWebの対比
TVも車のインパネもHTMLになろうとしている。
ePubがW3Cと一緒になろうとしている
縦書きもCSS Working groupで対応中
ブロックチェーンは分散システムにおけるトラストが肝
WebとIoTとの連携にServientがある

## Increments 及川さん
アプリケーションとしてのWeb
API, Web Components, Progress Appsでネイティブに追いつこうとする動き
空間サウンドもWebで
WebAssembly: C++をブラウザで動かす
モバイルデバイスの普及はモバイルWebの否定 => AMP
ネイティブにも見つけてもらえない等課題がある

## Reactの最新動向とベスト・プラクティス by 小林さん
### 概要
利用事例として、Instagram、Netflix、 Twitter(mobile)、 AbemaTV、 Hyperterm(Electron製ターミナル)、Jenkinsの新しいコンポーネント
Learn once, Write anywhere
宣言的。jQueryは命令的
### ベスト・プラクティス
Stateless Functional Componentsが第一選択肢。インスタンスを持たないただの関数。
Stateには表示に必要なデータのみ
15.3からPureComponent導入。propsとstateの浅い比較でパフォーマンス向上。
Arrow関数だと毎回生成されるので、react-addons-perfで計測が大事。
createClassはゆるやかに非推奨。
High Order Components. recomponentsというutility集がある。
Function as Child Componentsだとラップが不要だが、最適化が難しい
アプリケーションの状態はなるべく一箇所に
最近だとReduxがよく使われる。
Container ComponentとPresentational Component
Reactのテストには３つの選択肢がある
ShallowRenderでComponent単体のテストが可能。AirBnBのenzymeを使うと便利。
react-test-rendererが最近入った。
eslint pluginでbest practiceに沿っているか確認できる。
React Story Bookのデモ
Redux Dev Toolsのデモ。jsonとしてエクスポートできる
### 現実世界
Facebook "We only open source what we use"
OSS
### 今後
Coreは小さくなっていく
ReactFiberは内部アルゴリズムの置き換え
awscli で s3 バケット作って CORS を設定する


## バケットの作成

```
$ aws s3 mb s3://{bucket name}
```

## CORS設定

以下の内容で cors.json の名前で保存

```cors.json
{
  "CORSRules": [
    {
      "AllowedHeaders": ["*"],
      "AllowedMethods": ["GET"],
      "AllowedOrigins": ["*"],
      "MaxAgeSeconds": 3000
    }
  ]
}
```

CORS設定をバケットに適用

```
$ aws s3api put-bucket-cors --bucket {bucket name} \
      --cors-configuration file://cors.json
```
3行の内容でQiitaのストック1000を獲得する逆転の発想法

### まずはじめに

<b>これを見てしまったはなたは、既に僕の手中にハマった人です。</b>
すみません。

先日、職場の同僚とQiita記事の話をしていて気がついたことがありました。
自分とストック数こそ違うものの、自分と比べて<b>圧倒的にView数が多い</b>のでした。
考えてみると、自分は<b>「タイトルの付け方」</b>が下手くそなんじゃないかという結論でした。

そのため、今回のこの記事の対象者は、「いい内容を書いてるはずなんだけど、なかなかストックされない」とお悩みの方<b>ではなく</b>、
<b>そもそもView数が伸びない方が対象の記事となります。</b>

同じ事でお悩みの方、是非最後まで一読いただけると。

### 概要
昨今、ブログやQiita記事を書く機会が徐々に増えてきたので、こんな本を読んでみました。
今回は、そもそもクリックしてもらえるようなタイトルの付け方の観点を備忘録がてら書いてみます。

<div style="text-align:center;">
<a href="https://www.amazon.co.jp/%E3%80%8C%E3%83%90%E3%82%AB%E5%A3%B2%E3%82%8C%E3%80%8D%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%8C%E9%9D%A2%E7%99%BD%E3%81%84%E3%81%BB%E3%81%A9%E6%9B%B8%E3%81%91%E3%82%8B%E6%9C%AC-%E4%B8%AD%E5%B1%B1-%E3%83%9E%E3%82%B3%E3%83%88/dp/4806141151/ref=as_li_ss_il?ie=UTF8&linkCode=li3&tag=yamadagenki06-22&linkId=cc8a262626caa17b227ff945cbc16828" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4806141151&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=yamadagenki06-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=yamadagenki06-22&l=li3&o=9&a=4806141151" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</div>

### ストック数を劇的に増やす12つの観点

#### <b>メリットを一瞬にして伝える</b>

例：ストック1000を獲得する方法

読み手の気持ち → 「この記事を読めば、ストック1000をゲット出来るのかな？」

※ 読めば得をするので素直に気になってクリックしたくなる

#### <b>緊急性を伝える</b>

例：この秋限定!!ポケモンG◯を使って彼女を作る方法

読み手の気持ち → 「マジか、確かにポケモンG◯は最近旬だからな。この記事読んだら彼女できるのかも！？」

※ 限定感を出すことで、読者を「いま読まなくてはいけない！」という気持ちにさせる

#### <b>読み手に、ことの重大性を気づかせる</b>

例：吉田さん、いま後ろにだれかいますよ。

「吉田」が苗字の方の気持ち → 「え、どういうこと？」

※ 名前など入れることで臨場感を増加させ、事の重大さを伝える

#### <b>どうしても中身をみてしまいたくなる仕掛けを施す</b>

例：この方法なら、狙ってる異性と必ず付き合えます

読み手の気持ち → 「え、マジ？知りたい知りたい！！」

※ メールマーケティングなどは、とにかく開かせることなので、中身を読まずにはいられないようにする

#### <b>内容とちょっとズラす</b>

例：Gitは非エンジニアのために開発されたものです!!

読み手の気持ち → 「え、そんなことないだろ。どれどれ？」

※ え、どういうこと？という効果で注目をあびるパターンです

#### <b>「そんなこと、ありえないでしょ！」と思わせる</b>

例：砂漠で砂を得る方法を教えます！!

読み手の気持ち → 「いや、無理でしょ。どうやって売るのさ」

※ え、普通そんなのできないでしょ？というツッコミを生みだし、引き付けるパターンです。

#### <b>「UMA」のような未知の魅力を利用する</b>

例： Emacsの入ってないパソコンを法紹介します

読み手の気持ち → 「Emacs入ってないパソコンとか存在するの？いや、ないないー」

※ 「意味わからん」と思わせることで、そのものの魅力を一段引き立たせるパターンです。

#### <b>タイトルらしくないコトバを使う</b>

例：昨日人生で１番驚いたことがありまして、実は・・・

読み手の気持ち → 「え、何があったの？？？」

※ 続きが気になる！！と思わせたら勝ちです。

#### <b>「なぜ、読んだほうが良いのか」を気持ちよく伝える</b>

例：ストック1000取れる内容教えます！!

読み手の気持ち → 「知りたい知りたい！なになに？」

※ 率直なタイトルが怪しさが半減させます

#### <b>「逆常識法」を使う</b>

例：視聴率を減らすための番組制作について

読み手の気持ち → 「視聴率減らしてどうすんだ！！」

※ 逆をつくことで、え？と思わせることです


#### <b>とにかく「鮮度」を伝える</b>

例：日本初上陸！！この夏話題のアイスクリーム

読み手の気持ち → 「まだ知らないアイスクリームがあるんだ。どれどれ」

※ とにかく「はじめて」という、最近話題というような「鮮度」を全面に押し出す。

#### <b>読み手をうなずかせる</b>

例：あなたの記事で駄目なのは、タイトルの付け方です

読み手の気持ち → 「確かに思い当たるフシが。。。」

※ ズバリ、「なるほど」と思わせることで中身を読ませるパターンです。
※※ これは、自分が言われた言葉で「グサッ」となり、その話を聞き入ってしまいました。

### まとめ

いかがだったでしょうか？
今回は、あくまでも<b>「タイトルを見てクリックするかどうか」</b>ということに関してタイトルの付け方を研究してみました。

いいものを書いても、それを伝えられないと何も意味がありません。
「タイトル」は内容のまとめです（本の受け売り）。
いい内容を書いたーと自己満で終わるのも良しですが、せっかくなら読んでもらえるタイトルをつけて、記事の内容も読んでもらえる一工夫をしてみると良いのかなと思いました。

自己満足で終わらないように、最後の最後でもうひと頑張り。
これを頭に、今後のQiita記事を書いてみようと思います。

よろしくお願いしますm(_ _)m
【Xcode8】An unknown error occurred.の対処法

[元ブログ - 【Xcode8】An unknown error occurred.の対処法](http://blog.dalt.me/1291)

またも久しぶりの投稿となってしまいました。

ビルドすらしてくれなくて有無を言わさず掲題のエラーが出る...。
直りましたのでサクッと書きたいと思います。

## 端末情報等

Xcode8

Mac OS X 10.11.6 El Capitan

iPhone5S
OS 10.0

## やったこと

・アプリの削除
・Clean (⌘ + shift + k)
・Derived Dataの削除

です。

Cleanしてもダメだったけど、Derived Data削除したら出来ました。

誰かのお役に立てば。
VersioningされたS3バケットから欲しいバージョンのファイルを取得する，あるいはTerraformのstateをリカバリーする

# 前提
- TerraformのtfstateをS3で管理している
- S3のバージョニングを有効にしている

# 経緯
さきほど`terraform state mv`をミスってtfstateから`aws_vpc`の定義を消し飛ばしてしまい，すさまじいdiffを出してしまいました．

今後も起きる気がするのでいい感じにしておきたい．．．

# やったこと
すくりぷとつくった

```bash:state-resurrection.sh
#!/bin/bash

export AWS_DEFAULT_REGION=ap-northeast-1

candidates=$(mktemp)
aws s3 ls s3://foo/tfstate --recursive | awk '{printf(" [%2d] %s\n", NR, $4)}' > $candidates

cat $candidates
read -p 'choose target tfstate number: ' num
num=$(printf "[%2d]" $num)

candidate=$(grep -F "$num" $candidates)
key=${candidate:5}

aws s3api list-object-versions \
  --bucket foo \
  --prefix $key \
  --query 'Versions[].{VersionId:VersionId,LastModified:LastModified}|sort_by(@, &LastModified)' --output table

read -p 'choose target VersionId you want: ' v

aws s3api get-object --bucket foo --key $key --version-id $v tfstate.resurrected
```

実行結果

```shell-session
uraura@rosemary$ ~/bin/state-ressurection.sh
 [ 1] tfstate/run/terraform.tfstate
 [ 2] tfstate/gin/terraform.tfstate
 [ 3] tfstate/vodka/terraform.tfstate
 [ 4] tfstate/tequila/terraform.tfstate
choose target tfstate number: 3
------------------------------------------------------------------
|                       ListObjectVersions                       |
+---------------------------+------------------------------------+
|       LastModified        |             VersionId              |
+---------------------------+------------------------------------+
|  2016-08-29T23:24:25.000Z |  Yo87dexAmPle1OGy4oBkSExAMp1eUGY.  |
|  2016-08-29T23:26:54.000Z |  HRvRFexaMP1efvLUg.8uMEXamPleDhWc  |
|  2016-08-30T00:24:20.000Z |  B8ExamplejLYcXnqqBFTexamPleknOPc  |
|  2016-08-30T01:15:38.000Z |  UEXamPLEQ5lTwZ4CK2ntJexAMP1e3VUK  |
|  2016-09-02T07:50:28.000Z |  q3kKnaauXP7nuExamPlecAWavExAMPle  |
+---------------------------+------------------------------------+
choose target VersionId you want: B8ExamplejLYcXnqqBFTexamPleknOPc
{
    "AcceptRanges": "bytes",
    "ContentType": "application/json",
    "LastModified": "Tue, 30 Aug 2016 00:24:20 GMT",
    "ContentLength": 35960,
    "VersionId": "B8ExamplejLYcXnqqBFTexamPleknOPc",
    "ETag": "\"f24de000fdaf6479ba1923000c63600b\"",
    "Metadata": {}
}
```

最初の選択肢は，いくつかの環境の構成を1つのバケットで管理しているので必要になっています．
1つのtfstateしかないのであれば固定でもいいでしょう．

指定された環境のtfstate(上の例ではウォッカ)のtfstateのバージョンを取得し，日付でソートしたものが表示されるので，欲しいバージョンIDをコピって次の選択肢で入力します．

そうすると指定したバージョンのtfstateが実行した場所に`tfstate.resurrected`として帰ってきてくれます．
あとはstate操作をやりなおせば万事解決．．．

# まとめ
state操作むずかしい
kintone イベント処理で日時項目設定のメモ

#日時項目のフォーマット
日時項目は、日付項目や時刻項目と異なり注意が必要です。
イベント処理の日時項目のフォーマットは、REST API と同じISO形式です。
[REST APIの共通仕様](https://cybozudev.zendesk.com/hc/ja/articles/201941754#step6)

[moment.js](http://momentjs.com/) を使う表示変換の例がありますが、設定のサンプルがあまりありません。
[Moment.js を利用して、日時フィールドのフォーマットをカスタマイズする
](https://cybozudev.zendesk.com/hc/ja/articles/204982474-Moment-js-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6-%E6%97%A5%E6%99%82%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B)　

#日時項目の設定
下記のようにすると、簡単に設定できます。

```
// 本日日付に、時刻を付加して、日時項目に設定

// ロケールを設定
moment.locale('ja');

// 本日日付(日本時間)
var datetime = moment().format('YYYY-MM-DD');

// 本日日付+時刻(日本時間)
if(event.record['時刻']['value'])
datetime += ' ' + event.record['時刻']['value'];

// ISO形式に変換
event.record['日時']['value'] = moment(datetime).toISOString();
console.log(event.record['日時']['value']);
```
keyframeアニメーションの前後の状態を維持する

animation-fill-modeで設定する


[設定値]
**none**
アニメーションで指定されたスタイルは、アニメーションの実行前や実行後には適用されない。
**forwards**
アニメーションの最後に適用されたキーフレームの指定によって計算された値を維持する。
**backwards**
アニメーションの適用先に、'0%' または 'from' キーフレームで定義された値を即座に適用する。
**both**
forwards と backwards の両方の規定に従います。よって、アニメーションの設定は実行前と実行後の両方に適用されます。

例:

```css:
.hoge{
    animation: keyframename 1s linear 5s  forwards;
}
```

参考：https://developer.mozilla.org/ja/docs/Web/CSS/animation-fill-mode
githubにpushする時に勝手に別ユーザでpushされる現象の対処法

# 現象

　社内github勉強会でwindowsの共有マシンで複数人(複数人分のgithubアカウントを用いて)が同一リポジトリに対してプッシュした際に、gitのキャッシュ？のせいで意図しないユーザ(対象のリモートリポジトリではないユーザ)でプッシュしようとしてエラーが発生する現象の対処法。なお、一度gitクライアントを削除して、再インストールしても改善されませんでした
gitを詳しいわけではないので、もし原因や別の対処法があれば教えて頂けると幸いです

# 前提条件
 - 作業はすべて同一のWindowsマシンで実施する
 - 同一のリモートリポジトリをforkしたリポジトリを操作する
 - 複数人(仮にuser1とuser2とする)である
 - 仮にリモートリポジトリ名をdemo-repoとする
 - すべてのユーザは二段階認証を導入していない(ユーザ名/パスワードで認証)

# 手順
 １. user1がforkしたdemo-repoをローカルにクローン
 
 ```git:config(user1)
 [remote "origin"]
  url = https://github.com/user1/demo-repo.git
 ```
 ２. user1がdemo-repoに変更を加え、コミットする
 ３. user1のリモートリポジトリにプッシュする（**成功する**）
 ４. user2がforkしたdemo-repoをローカルにクローン

```git:config(user2)
[remote "origin"]
 url = https://github.com/user2/demo-repo.git
```

 ５. user2がdemo-repoに変更を加え、コミットする
 ６. user2のリモートリポジトリにプッシュする（**失敗する**）

##### エラー内容

```
remote: Permission to user2/demo-repo.git denied to user1.
fatal: unable to access 'https://github.com/user1/demo-repo.git/': The requested URL returned error: 403
```

user2のdemo-repoにpushしようとしたところなぜかuser1で勝手にpushする
しかも、githubへの認証ダイアログが表示されない

# 対処法

 git configのremote urlにユーザ/パスワードを付与することで解決できます
共有マシンではユーザ/パスワードをテキストで残すのはちょっと気が引けますが、一時利用であれば作業が完了したら削除すること

```git:config

# ユーザ名：パスワード（またはアクセストークン）@をgithub.com前に付与する
# なお、パスワードに「@」が含まれている場合は、「%40」に置きかえってください
[remote "origin"]
 url = https://username:password@github.com/xxxxxx/demo-repo.git
```


以上
RPGツクールMV　セーブデータを拡張する

RPGツクールMVのセーブデータに新たに項目を追加してみます。

セーブデータはBase64に変換されていますがやっぱりJsonです。
DataManagerの各メソッドでセーブ対象のオブジェクトを設定し、それをシリアライズして保存しているだけでシンプルです。
なので、スクリプトで各メソッドを上書きし、セーブ対象のオブジェクトにプロパティを追加すれば一緒に保存されます。

以下のスクリプトでは$gameExというセーブデータを追加しています。
$gameExは数値にしていますが、文字列でもオブジェクトでも問題ないはずです。

```
// 追加するセーブデータの変数
// セーブデータ類はグローバルスコープに定義されているので、クロージャ[function(){...}();]の外に出す
// 他のプラグインとかぶらないように名前を決める必要がある
// 既存の変数は全て$game〜という名前になっているので統一すると分かりやすいかも
var $gameEx = 0;

(function() {
	// 初期値の設定
	// 新しくゲームを始めた時に呼ばれる
	var createGameObjects = DataManager.createGameObjects;
	DataManager.createGameObjects = function() {
		createGameObjects.call(this);
		$gameEx = 0;
	};

	// セーブデータの生成
	// 返り値がセーブされるのでデータをcontentsに追加して返す
	var makeSaveContents = DataManager.makeSaveContents;
	DataManager.makeSaveContents = function() {
		var contents = makeSaveContents.call(this);
		contents.ex = $gameEx;
		return contents;
	};

	// セーブデータの読み込み
	// 生成時と同じ形でデータがcontentsに入っているので、変数に格納する
	var extractSaveContents = DataManager.extractSaveContents;
	DataManager.extractSaveContents = function(contents) {
		extractSaveContents.call(this, contents);
		$gameEx = contents.ex;
	};
})();
```
gitでマージし終わってるブランチを散らかしてたので、まとめてドカーンと消したい。

gitでマージし終わってるブランチを散らかしてたので、まとめてドカーンと消したい。

```bash
$ for b in `git branch --merged | grep -v '*' | grep -v master`; do git branch --delete $b; done
```

`rm_merged_branch`として登録しておけば…ちょくちょく消してきれいにしておく…かもしれない。

```bash
$ function rm_merged_branch () { for b in `git branch --merged | grep -v '*' | grep -v master`; do git branch --delete $b; done }
```
続・こんなプロジェクトは破綻する　スケジュール②


つづきです。

## 自分の作業にバッファーを取るパターン。

作業見積もりを聞かれて、3日ぐらいで終わると思ったけど、余裕をもって、「5日で。」という・・・

これは、本気出せば、3日で終わるけど・・・

理由は、
　①何か想定外のことがあった時にリスケしたくない。
　②毎日余裕を持って作業を終わらせたい。
　③なんかやる気が出ないので、だらだらやりたい・・・

大体こんなところでしょうか。③は論外ですね。
気持ちはわかりますが、あまりにも多く取りすぎるとどうなるか？

### 想定外のことが起きなかった時に早く終わるとどうなるか？
　
　「前倒しで終わった。」で済む場合は問題なさそうです。
　
　でも、後続の作業が前倒しで始められない場合に問題が起きそうです。

　たとえば、作業終了を5日後に設定していて、3日で終わった場合。
　2日間の空きが出ます。
　
　これが繰り返されると、
　「こいつはバッファーを取って作業をする人なんだ。」
　ということになり、信頼関係を崩すとおもいます。


### 毎日余裕を持って作業を終わらせたい。
　
　作業の状況が確実に見えていない場合には、問題なさそうです。
　また、相手が「余裕を持って作業をしてほしい」と思っている場合も問題なさそうです。

　でも、相手が、「なる早で進めてほしい。」と思っている場合は問題が起きそうです。

　自分たちとしては、「確実に進めたい。」と思っているのに、相手からすると、
　「だらだらやっている・・・」という風に見えかねないです。

　
###　ではどうすればいいのか？

　①何か想定外のことがあった時にリスケしたくない。
　②余裕を持って進めたい。
　と思ったら、バッファーも開示するのが、解決策だと思います。
　例　「3日で終わると思いますが、5日で計画してください。」など。
　
　そうすれば、相手も、
　「急ぎたいので、4日でお願いします。3日の時点で5日かかりそうでしたら、5日ということで問題ないようにします。」
　とか言えそうですね。
　
　ちなみに大前提は、相手との信頼関係をもとに作業をしたい場合です。
　
　自分もしくは相手が、信頼関係なしにプロジェクトを進めたい場合、確実にそのプロジェクトは破綻します。
気になるOS、ミドルウェア、フレームワークのサポート終了日(End of Life)

# はじめに
 * 個人的に特に気になるOS、ミドルウェア、フレームワークだけを対象としています。
 * 延長サポートなど追加料金なしの終了日を基本としています。
 * 出来るだけ公式情報へのリンクを貼っていますが不明な点はフォーラムなどから取っています。

# [Red Hat Enterprise Linux](https://access.redhat.com/support/policy/updates/errata)
| Version | End of Production Phase | End of Extended Life-cycle Support |
|:-:|:-:|:-:|
| 3 | 2010年10月31日 | 2014年1月30日 |
| 4 | 2012年2月29日 | 2017年3月31日 |
| 5 | 2017年3月31日 | 2020年11月30日 |
| 6 | 2020年10月30日 |  |
| 7 | 2024年6月30日 |  |

# [Solaris](http://www.oracle.com/us/support/library/lifetime-support-hardware-301321.pdf)
| Release | Premier Support Ends | Extended Support Ends  |
|:-:|:-:|:-:|
| Solaris 8 | 2009年3月 | 2012年3月 |
| Solaris9 | 2011年10月 | 2014年10月 |
| Solaris 10 | 2018年1月 | 2021年1月 |
| Solaris 11 | 2021年11月 | 2024年11月 |

# [Windows](https://support.microsoft.com/en-us/help/13853/windows-lifecycle-fact-sheet)
| OS | End of mainstream support | End of extended support |
|:-:|:-:|:-:|
| Windows XP | 2009年4月14日 | 2014年4月8日 |
| Windows Vista | 2012年4月19日 | 2017年4月11日 |
| Windows 7 | 2015年1月13日 | 2020年1月14日 |
| Windows 8 | 2018年1月9日 | 2023年1月10日 |
| Windows 10 | 2020年10月13日 | 2025年10月14日 |

# [Internet Explorer](https://www.microsoft.com/ja-jp/windows/lifecycle/iesupport/)
| Internet Explorer | End of mainstream support | End of extended support |
|:-:|:-:|:-:|
| 8 | 2009年4月14日 | 2014年4月8日 |
| 9 | 2012年4月19日 | 2017年4月11日 |
| 11 | 2018年1月9日 | 2023年1月10日 |


# [Oracle Database](http://www.oracle.com/us/support/library/lifetime-support-technology-069183.pdf)
| Release | Premier Support Ends | Extended Support Ends |
|:-:|:-:|:-:|
| 8.1.7  | 2004年12月 | 2006年12月 |
| 9.2 | 2007年7月 | 2010年6月 |
| 10.2 | 2010年7月 | 2013年6月 |
| 11.2 | 2015年1月 | 2020年12月 |
| Enterprise Edition 12.1  | 2018年7月 | 2021年6月 |

# [Java SE](http://www.oracle.com/technetwork/jp/java/eol-135779-ja.html)
| メジャー・リリース | 公式アップデートの終了 |
|:-:|:-:|
| 5.0 | 2009年10月 |
| 6 | 2013年2月 |
| 7 | 2015年4月 |
| 8 | 2017年9月(未確定) |

# [Apache HTTP Server](https://en.wikipedia.org/wiki/Apache_HTTP_Server#Development)
| Version | Latest release |
|:-:|:-:|
| 1.3 | [2010年2月3日](http://mail-archives.apache.org/mod_mbox/httpd-announce/201002.mbox/%3C20100203000334.GA19021%40infiltrator.stdlib.net%3E) |
| 2.0 | [2013年7月10日](http://mail-archives.apache.org/mod_mbox/httpd-announce/201307.mbox/%3C20130710124920.2b8793ed.wrowe%40rowe-clan.net%3E) |
| 2.2 |   |
| 2.4 |   |

# [Apache Tomcat](https://en.wikipedia.org/wiki/Apache_Tomcat#Releases)
| Series | Latest release | End of Life |
|:-:|:-:|:-:|
| 5.0 | 2004-08-30 | 不明 |
| 5.5 | 2012-10-10 | [2012年12月31日](https://tomcat.apache.org/tomcat-55-eol.html) |
| 6.0 | 2016-02-11 | [2017年3月30日](https://tomcat.apache.org/tomcat-60-eol.html) |
| 7.0 |   |  |
| 8.0 |   |  |

# [Spring Framework](https://spring.io/)
| Version | End-Of-Life |
|:-:|:-:|
| 3.1 | [2014年1月28日](http://www.va.gov/trm/ToolPage.asp?tid=12#) |
| 3.2 | [2016年12月31日](https://spring.io/blog/2015/06/15/spring-framework-3-2-x-eol-on-dec-31-2016) |
| 4.2 | |
| 4.3 | |

# 最後に
* これ全部を真面目に守って投資効果がある所あるのでしょうか？
* 全部を追いかけるぐらいならシェルだけで開発する[ユニケージ開発手法](https://www.usp-lab.com/methodology.html)の方が良いのでは？
続・こんなプロジェクトは破綻する　スケジュール


## はじめに

※ 今回は、特に開発初期の要求や要件を決めていくフェーズを前提としています。


スケジュールを組む時にバッファーを取りたくなることって・・・ありますよね。

たとえば・・・

作業見積もりを聞かれて、3日ぐらいで終わると思ったけど、余裕をもって、「5日で。」と言う。

①自分の作業にバッファーを取るパターン。

相手から提出期限を聞かれて、10日後で間に合うのに、「5日後で。」と言う。

②相手からの締め切りを前倒しにする、相手の締め切りにバッファーを作るパターン。

大体この2つです。

それぞれどんなことになるのか？

ちょっと想像してみました。


## 自分の作業にバッファーを取るとどうなる？


[続・こんなプロジェクトは破綻する　スケジュール②](http://qiita.com/ohirayama/items/761a46e1ff06f7e65859)



## 相手の締め切りにバッファーを作るとどうなる？

<近日公開>
macでdockerコンテナのリソースを設定する方法


自分のmac環境でdockerコンテナに割り当てられたメモリが2GBしかなかったため、dockerコンテナのリソースを増強を行う。

![スクリーンショット 2016-09-03 10.47.52.png](https://qiita-image-store.s3.amazonaws.com/0/138447/a4464a80-d733-8802-ed36-bc2a8e385942.png "スクリーンショット 2016-09-03 10.47.52.png")

![スクリーンショット 2016-09-03 10.49.40.png](https://qiita-image-store.s3.amazonaws.com/0/138447/88a005aa-0c78-463e-e14b-7059b5ee1c72.png "スクリーンショット 2016-09-03 10.49.40.png")
Haskellで直角三角形のタプルをつくる

まずは、1〜100の3辺x, y ,zの組み合わせをつくる。

```Haskell
[(x, y, z) | x <- [1..100], y <- [1..100], z <- [1..100]]
```

ここで、zを斜辺だとすると、xとyはzより小さいことになる。その組み合わせをつくると、

```Haskell
[(x, y, z) | z <- [1..100], y <- [1..z], x <- [1..z]]
```
x,y,zの順番を少し入れ替えていることに注意。
xとyは、yの方を長辺だとすると、さらにこう書ける。

```Haskell
[(x, y, z) | z <- [1..100], y <- [1..z], x <- [1..y]]
```

あとは、x^2 + y^2 = z^2を満たす組み合わせを抽出する。


```Haskell
[(x, y, z) | z <- [1..100], y <- [1..z], x <- [1..y], (x * x + y * y == z * z)]
```

以上で完成。
file コマンド

`file` コマンドはファイルの種類を調べる。
ルールは `/usr/share/file/magic` や `/usr/share/file/magic.mgc` で定義されている。前者はテキスト形式であり、後者はコンパイルされた形式である。
上のファイルに加えて `$HOME/magic` や `$HOME/magic.mgc` も読み込む。
kintone ファイルのダウンロードとアップロード

kintone で、ファイルダウンロードして、それをそのままアップロードを行う例です。

[添付ファイル再利用プラグイン](http://qiita.com/rex0220/items/f59a5f6b17776fb9af74)の開発で、いくつか試して最終的にこうなりました。
Promise でファイルを扱った例があまり無かったので、メモしておきます。
現時点では、XMLHttpRequest で行うのがよさそうです。

```
    // ファイルダウンロード & アップロード
    return fileDownload(fileKey).then(function(resp) {
        // file upload
        return fileUpload(fileName, contentType, resp);

    }).then(function(resp){
        console.log(resp.fileKey);
        ...
    });

    // File Download
    function fileDownload(fileKey) {
        return new Promise(function(resolve, reject) {
            var url = kintone.api.url('/k/v1/file', true) + '?fileKey=' + fileKey;
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url);
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.responseType = 'blob';
            xhr.onload = function() {
                if (xhr.status === 200) {
                    // successful
                    resolve(xhr.response);
                } else {
                    // fails
                    reject(Error('File download error:' + xhr.statusText));
                }
            };
            xhr.onerror = function() {
                reject(Error('There was a network error.'));
            };
            xhr.send();
        });
    }


    // File upload
    function fileUpload(fileName, contentType, data) {
        return new Promise(function(resolve, reject) {
            var blob = new Blob([data], {type:contentType});
            var formData = new FormData();
            formData.append("__REQUEST_TOKEN__", kintone.getRequestToken());
            formData.append("file", blob , fileName);
            var url = kintone.api.url('/k/v1/file', true);
            var xhr = new XMLHttpRequest();
            xhr.open('POST', url);
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.onload = function() {
                if (xhr.status === 200) {
                    // successful
                    var results = JSON.parse(xhr.response);
                    resolve(results);
                } else {
                    // fails
                    reject(Error('File upload error:' + xhr.statusText));
                }
            };
            xhr.onerror = function() {
                reject(Error('There was a network error.'));
            };
            xhr.send(formData);
        });
    }

```
Gradle で Payara Micro の Uber Jar を利用するタスクを作る

Uber Jar については蓮沼さんの [Payara 4.1.1.162 がリリースされました - GlassFish Japan](http://www.coppermine.jp/docs/glassfish/2016/05/payara-162.html) を参考のこと。

Uber Jar を作る部分を、 Gradle のタスク化させる方法のメモ。

```groovy:build.gradle
apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    providedCompile 'fish.payara.extras:payara-micro:4.1.1.163'
}

war.baseName = 'hogehoge'

task uberJar(type: Exec, dependsOn: war) {
    def payaraJarPath = configurations
                        .providedCompile
                        .find {it.name =~ /payara-micro.*\.jar/}
                        .absolutePath

    def warFile = war.archivePath
    def uberJarPath = warFile.path.replaceAll(/\.war$/, '.jar')

    commandLine('java', '-jar', payaraJarPath, '--deploy', warFile, '--outputUberJar', uberJarPath)
}
```

`uberJar` タスクを実行したら、 `build/libs` の下に jar ファイルが出力される。
直線位置調整 > 移動距離の測定 > 300msec > 10cm程度 +- 2cm

距離計の補正のため、直線移動するための装置作成。

http://qiita.com/7of9/items/93257105e64bb4724fa7
にて用意した物を使って移動距離を測定してみた。

## code v0.2

3000msecごとに300msecの間、DCモーターを駆動する。
ただし、3000msecごとに動くと測定が難しいので、3回ごとに駆動するようにした。

```
#include <ESP8266WiFi.h>
#include <stdint.h>

/*
 * v0.2 2016 Sep. 3
 *   - execute for every [kCount_interval] times 
 *     + add [kCount_interval]
 *   - include <stdint.h>
 * v0.1 2016 Jul. 11
 *   - handle relay pin
 *   - add loop()
 *   - add setup()
 */

static const int kRelayPin = 14;
static const int kCount_interval = 3;

void setup() {
  WiFi.disconnect();
  Serial.begin(115200);

  pinMode(kRelayPin, OUTPUT);
  digitalWrite(kRelayPin, LOW);
}

void loop() {
  char szbuf[] = "hello";
  static int8_t cnt = 0;

  Serial.println(szbuf);

  if (cnt == 0) {
    digitalWrite(kRelayPin, HIGH);
    delay(300); // msec
    digitalWrite(kRelayPin, LOW);
  }

  cnt++;
  if (cnt >= kCount_interval) {
    cnt =0;
  }
  delay(3000);
}
```

## 測定の様子

- レール(R-01)を3つ使用
- だいたい9秒ごとに移動するので、移動した時に定規で移動距離を見る
- レール単体では移動時にレールが動くのでバイスを重しとした

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/da02ce4f-95a7-1473-2eba-18692743a6b5.jpeg)

## 測定結果

R-01の連結部分を通る/通らない場合で測定値が変わる。
なお、測定者の技能により、読み取り誤差は2mm程度あるだろう。

### 連結部分を通らない場合

| idx | 移動距離 (cm) |
|:-:|:-:|
| 1  | 10.8 |
| 2  | 11.3 |
| 3  | 11.3 |
| 4  | 11.8 |
| 5  | 11.3 |
| 6  | 11.2 |
| 7  | 11.3 |

### 連結部分を通る場合

| idx | 移動距離 (cm) |
|:-:|:-:|
| 1  | 9.5 |
| 2  | 8.6 |
| 3  | 8.8 |
| 4  | 8.8 |
| 5  | 9.0 |
| 6  | 10.0 |
| 7  | 9.2 |

### 結果

2cm近い誤差がある。
距離計の補正に使うには誤差が大きすぎる。

## 誤差要因

- DCモーターのトルク関連
- delay(300)がそもそも300msecを保証しない
  - ESP8266内部のOSによって誤差が生じる

## アナログエンジニアさんの教え

測定中にふと思い出した教え。

http://analog-engineer.cocolog-nifty.com/blog/2011/01/post-9bcc.html
> データーの写し間違いや異常があった時には、消しゴムで消さずに横線を引いて元のデータの脇に書き添える。間違いデータと思ったものが、真実でありかつ次の実験計画に影響を及ぼすことがある。筆記用具は鉛筆でなく、簡単には消せないボールペンだ。


## code v0.3 > delay()の時刻測定

`delay(300);`の誤差を見るため、前後にミリ秒の表示を追加した。

https://www.arduino.cc/en/Reference/Millis

```
#include <ESP8266WiFi.h>
#include <stdint.h>

/*
 * v0.3 2016 Sep. 3
 *   - measure time for delay(300);
 * v0.2 2016 Sep. 3
 *   - execute for every [kCount_interval] times 
 *     + add [kCount_interval]
 *   - include <stdint.h>
 * v0.1 2016 Jul. 11
 *   - handle relay pin
 *   - add loop()
 *   - add setup()
 */

static const int kRelayPin = 14;
static const int kCount_interval = 3;

void setup() {
  WiFi.disconnect();
  Serial.begin(115200);

  pinMode(kRelayPin, OUTPUT);
  digitalWrite(kRelayPin, LOW);
}

void loop() {
  char szbuf[] = "hello";
  static int8_t cnt = 0;
  unsigned long mils;

  Serial.println(szbuf);

  if (cnt == 0) {
    mils = millis();
    Serial.println(mils);    

    digitalWrite(kRelayPin, HIGH);
    delay(300); // msec
    digitalWrite(kRelayPin, LOW);

    mils = millis();
    Serial.println(mils);    
  }

  cnt++;
  if (cnt >= kCount_interval) {
    cnt =0;
  }
  delay(3000);
}
```

```txt:結果
hello
hello
hello
55758
56058
hello
hello
hello
65058
65358
hello
hello
hello
74358
74658
hello
```

`delay(300);`ではミリ秒オーダーの誤差はないのか。
pythonのクラスキャストの方法

#結論

　出来ない。
　やり方知ってる方がいれば、教えて欲しい。

# クラスキャストとは？
[マンガでわかるjava入門講座](http://manga.crocro.com/?cat=java&pg=cast_object)がわかりやすいと思いました。


# pythonで本当に出来ないの？

実際にGoogle先生に問い合わせるとpythonで
クラスキャスト実現してみようとしている人は、いるみたいです。

[Pythonでクラスのキャスト](http://nihaoshijie.hatenadiary.jp/entry/2014/08/09/152558)とか

よくよく見てみるとクラスキャストではなく
クラスのattrをコピーしているだけで、
キャストになっていないように見えます。

例えば。。。

```py:お試し

def cast(ChildClass, parental_obj):
    child_obj = ChildClass()
    for attr_name in parental_obj.__dict__:
        setattr(child_obj, attr_name, getattr(parental_obj, attr_name))
    return child_obj


class ParentalClass():
    parental_attr = "parental"

class ChildClass(ParentalClass):
    child_attr = ""

child_object = ChildClass()
child_object.child_attr = "child_attr"


parental_object = cast(ParentalClass, child_object)
print(parental_object.parental_attr)
print(parental_object.child_attr)
```

親クラスに"キャスト"した後に、
子クラスのchild_attrにアクセスできてしまうのは、
おかしいですね。

javaで同じことを行うと、
エラーになりますよね。

```java:SuperClass
public class SuperClass {
	public SuperClass() {
		// TODO Auto-generated constructor stub
	}
}
```
```java:SubClass
public class SubClass extends SuperClass {

    public String name = "SubClass";

	public SubClass() {
		// TODO Auto-generated constructor stub
	}
}
```
```java:main
public class main {

    public static void main(String[] args) {
		// TODO Auto-generated method stub
        // SubClass生成
        SubClass subClass = new SubClass();
        // SuperClassにキャスト
        SuperClass superClass = subClass;
        // SubClassのnameにアクセス
        System.out.println(superClass.name); //⇦ここでエラー
    }
}
```

SubClassを生成して、SuperClassにキャストした後に
SubClassのメンバー変数のnameにアクセスするとエラーが発生します。
技術英語 > a memory parachute > Allocate that amount of memory at the beginning of the program as a reserve parachute.

@ Code Complete (No. 11083 / 36077)

> a memory parachute

memory parachuteは英語というよりコーディングで使われる用語なのだろう。

以下の文が続く

> Allocate that amount of memory at the beginning of the program as a reserve parachute.
統合ターミナルウィンドウへフォーカスするショートカットキーを設定する


テキストエディタVisualStudioCode ではエディタ内にターミナルを表示させるショートカットキー(`ctrl+@`)は用意されていますが、ターミナルとテキストエディタ間のフォーカスを移動するためのショートカットキーが存在しなかったので、設定方法を調べてみました。

＜2020/08/02＞
執筆当時のバージョン(1.13)では`toggleTerminal`コマンドはパネルの表示非表示を切り替えるのみの動作だったので、エディタからターミナルへフォーカスを移動するという用途には適しませんでした。

Ver. 1.28 [^1] 以降では、フォーカスの無いパネルをトグルさせるとき、一旦フォーカスを移動するという動作に変更されたので、下記のデフォルトのショートカットキーのみでフォーカス移動に対応できます。 

|言語|key|command|
|:--|:--|:--|
|us, jp|ctrl+1|workbench.action.focusFirstEditorGroup|
|us|ctrl+`|workbench.action.terminal.toggleTerminal|
|jp|ctrl+oem_3(@)|workbench.action.terminal.toggleTerminal|

[^1]: https://code.visualstudio.com/updates/v1_28#_toggle-panel-changes

# 設定方法
`Ctrl+Shift+P` からコマンドパレットを開き、'keyboard' と入力すると下記のようにメニューの候補が表示されるので、'Preference: Open Keyboard Shortcuts (JSON)' を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8721/6f467405-8bf2-d9c0-9a3d-a0ac6d60a82f.png)

「keybindings.json」が開かれるので、下記のコードをコピペして上書き保存します

``` keybindings.json
[
    {
        "key": "ctrl+;",            "command": "workbench.action.terminal.focus",
                                    "when": "editorTextFocus"
    },
    {
        "key": "ctrl+;",            "command": "workbench.action.focusFirstEditorGroup",
                                    "when": "terminalFocus"
    }
]
```

設定ファイル上は「Ctrlキー＋セミコロン(;)」のショートカットキー割り当てとして書かれていますが、筆者環境（Windows10 HHKB JP）ではこの設定で「Ctrlキー＋コロン(:)」へ割り当てられました。
おそらく設定ファイルの記述はUSキーボードのキーコードを想定しているのを、JISキーボードから入力するため、表記が不一致になっていると思われます。
コマンドは下記を参考にしました。
https://code.visualstudio.com/docs/editor/integrated-terminal#_key-bindings
Arrays#fillメソッドの多次元版の一例

一次元配列の初期化をするメソッドがあります。Arraysクラスのfill(boolean[] a, boolean val)等のfill(型名[] a, 型名 val)の形のメソッドが用意されています。このメソッドの多次元配列版の一例を紹介します。

#コード

コードは以下です。

```java:多次元版の一例
import java.util.Arrays;

public class ArraysFillEx {

    public static void fill(Object array, Object value) {

        // 第一引数が配列か判定
        Class<?> type = array.getClass();
        if (!type.isArray()) {
            throw new IllegalArgumentException("not array");
        }

        // クラスの型を判定
        String arrayClassName = array.getClass().getSimpleName()
                .replace("[]", "")
                .toLowerCase();
        String valueClassName = value.getClass().getSimpleName()
                .toLowerCase()
                .replace("character", "char")
                .replace("integer", "int");
        if (!arrayClassName.equals(valueClassName)) {
            throw new IllegalArgumentException("does not match");
        }

        // 処理
        if (type.getComponentType().isArray()) {
            for (Object o : (Object[])array) {
                fill(o, value);
            }
        } else if (array instanceof boolean[]) {
                Arrays.fill((boolean[])array, (boolean)value);
        } else if (array instanceof char[]) {
                Arrays.fill((char[])array, (char)value);
        } else if (array instanceof byte[]) {
            Arrays.fill((byte[])array, (byte)value);
        } else if (array instanceof short[]) {
            Arrays.fill((short[])array, (short)value);
        } else if (array instanceof int[]) {
            Arrays.fill((int[])array, (int)value);
        } else if (array instanceof long[]) {
            Arrays.fill((long[])array, (long)value);
        } else if (array instanceof float[]) {
            Arrays.fill((float[])array, (float)value);
        } else if (array instanceof double[]) {
            Arrays.fill((double[])array, (double)value);
        } else {
            Arrays.fill((Object[])array, value);
        }
    }

}
```

#使い方

[GitHubのリポジトリにテストコード](https://github.com/java-beginner/arrays-fill-ex/blob/master/src/arraysfillex/ArraysFillExTest.java)を載せました。以下はその抜粋です。

```java:使用例
        // int型の例
        int[][][] array = {
                { {1, 2, 3}, {4, 5} },
                { {6, 7, 8}, {9} }
            };

        ArraysFillEx.fill(array, Integer.MAX_VALUE);

        // String型の例
        String[][][] array = {
                { {"a", "b", "c"}, {"d", "e", "f"} },
                { {"g", "h", "i"}, {"j", "k", "l"} }
            };

        ArraysFillEx.fill(array, "zzzz");
```

@shiracamus さんにコメントをいただきまして、以下の使い方もできることを確認しました。。

```java:使用例
        int[][][] array = new int[3][2][4];
        ArraysFillEx.fill(array, -1);


        String[][][] array = new String[3][2][4];
        ArraysFillEx.fill(array, "Dummy");
```

#ポイント

以下の再帰呼び出しの箇所で、配列の次数を下げてます。第一引数が1次元配列になったら、Arrays#fill()メソッドを使って初期化が完了です。

```
        if (type.getComponentType().isArray()) {
            for (Object o : (Object[])array) {
                fill(o, value);
            }
        }
```

1次元になったら、Arrays#fill()メソッドを使って初期化が完了です。

#修正履歴

20160903

+ 「使い方」に@shiracamus さんのコメントを反映。
+ @saka1029 さんのコメントを反映。コードを修正。 
+ 上記修正に合わせ、「ポイント」を修正。
RubyでStructをJSONでserialize, deserializeする

イマイチやり方がわからなかったのでメモ

参考
- https://github.com/flori/json/blob/master/tests/json_addition_test.rb

# 宣言

id, nameをattributeにもつStructの例

```rb
require 'json/add/core'

class User < Struct.new(:id,:name)
  def self.json_create(o)
    new(*o['v'])
  end
end
```

# Serialize

```rb
json = JSON.generate(User.new(1, "ninja"))
# => '{"json_class":"User","v":[1,"ninja"]}'
```

## Deserialize

```rb
user = JSON.parse(json, create_additions: true)
# => #<struct User id=1, name="ninja">
```

簡単で便利だ。
UnixユーザのためのWindowsコマンドライン超入門（その2）

前回の記事はこちら: http://qiita.com/superriver/items/f61a609150bfdd98a27a

思ったより読んでくれた人がいたので、続きを書きます。

# ディレクトリのみを検索して表示

UNIXの場合は``find``を使いますよね。こんな感じ

```
$ find /home/user -type d -print
```

Windowsでは``dir``を使います。

```
C> dir /ad \home\user
```

これだと \home\user 直下にあるディレクトリの一覧を表示します。なので``find``とは挙動が違いますね。``find``と同じく\home\user以下のサブディレクトリを全探索するには前回紹介した``/s``オプションを追加すればOKです。

```
C> dir /ad/s \home\user
```

``/ad``と``/s``の間はスペースを空けても空けなくても構いません。``/b``オプション(これも前回紹介しました)を加えると、表示が完全に``find``と同じになります。

```
C> dir /ad /s /b \home\user
```

おまけですが、以下のようにすると\home\user以下にある、名前にdataを含むディレクトリをすべて表示します。

```
C> dir /ad/s/b \home\user\*data*
```

これを``find``で書くときって``-type``と``-name``の両方を指定しなきゃならないし、ワイルドカードをバックスラッシュでエスケープしなきゃならなくて、結構めんどくさいんです。これはWindowsの方が簡単に書けます。

```
$ find /home/user -name \*data\* -type d -print
```

ただパターン表記そのものはUNIXのシェルの方が強力です。Windowsではワイルドカード(``*``か``?``)しか使えないので、正規表現(たとえば``[a-e]*``みたいなこと)は使えません。まあdirとfindstr組み合わせればできるんですけど、まあ一長一短です。

# ファイル名補完

現代のUNIXシェルと同じくTABキーでファイル名補完できます(「現代の」と書いたのは、昔のcshだとESCキーで補完だったからです。豆ね)。ワイルドカードも認識してくれます。

```
C> notepad ho[TAB]
```

これでhoで始まるファイル名を補完してくれます。zshのような一覧表示はなく、TABキーを押すごとに候補を順番に表示します。

ファイル名が``txt``で終わるファイル名を順番に補完するにはワイルドカードを使います。

```
C> notepad *txt[TAB]
```

自分がよくやるのはVisual Studioを開くとき、カレントディレクトリにある``sln``ファイルで起動する方法です。

```
C> *sln[TAB][ENTER]
```

ちなみにTABキーの代わりに``Ctrl-I``をタイプしても同じです。基本ですね。ENTERも``Ctrl-M``で代用できます(``Ctrl-J``は利かない)。UNIXユーザとしてはホームポジションから手を離したくないでしょうし、ご存じでなかった方はぜひご活用ください。

# findstrがgrep/egrepの代わり

``findstr``は自分的には最も頻繁に使うコマンドの一つです。``grep``の代わりなので当然といえば当然ですが。

``grep``と同じくファイル群／標準入力から特定の文字列(正規表現含む)を探すのが基本的な使い方ですが、入力ファイルの指定方法が``grep``より少しリッチです。

## 基本的な検索

例えば「カレントディレクトリ以下にあるすべての``.php``ファイルから``hoge``を含む行をすべて表示する」にはこうします。

```
C> findstr /s hoge *.php
```

``/i``スイッチを追加すると大文字小文字の区別なく検索します。

```
C> findstr /si hoge *.php
```

``/s``スイッチと``/i``スイッチはまとめて``/si``のように指定できます。

## -vに対応するのは/vスイッチ

``hoge``を含まない行をすべて表示するのはUNIXと同じくvオプションです。

```
C> findstr /v hoge *.php
```

意図的に同じオプションになっているので覚えやすくていいですよね。

## 正規表現による検索

正規表現は``/r``を指定した場合のみに有効になります。

```
C> findstr /r "^[0-9a-f]" *.txt
```

ハット記号(``^``)はCMDではエスケープ文字なので、使う時はダブルクォーテーションで囲ってください。

## リテラル検索

ワイルドカード文字を含んだ文字列を検索したいときは``/c``です。

## /help使ってね

他にもオプションが沢山あるので、ぜひヘルプを一度ご覧ください。

```
C> findstr /help
```

# おまけ

Windows APIは、実はMS-DOSの頃からUNIX同様フォワードスラッシュ(``/``のことです)もディレクトリの区切り文字として認識しています。なのでファイル名にはスラッシュが使えません。
普段パス名にスラッシュが使えないのは単にCMDの制約によるものです(オプション名の指定にスラッシュ使っちゃったから...)

でもいつの間にか``cd``コマンドだけはスラッシュを受け付けるようになってます。

```
C> cd /users/hoge/downloads
```

これちゃんとカレントディレクトリを切り替えてくれるんですよ。でもTABキーの補完は利かないし、``/d``オプションを指定した場合はエラーになっちゃうんですけどね。。。
ChromeでAPNGを試してみる

枯れすぎて衰退気味なAnimation PNGをやってみた。
Chromeだと標準で対応していないので、Extention入れる方法もあるようだがStoreのコメント見る限り1年前からExtention動いてないようだ。
最近ではiOS8で扱えるようになったり、にわかに復興の兆しもあるようなないような。

今回Chromeで扱うのに[apng-canvas.js](https://github.com/davidmz/apng-canvas/)を試してみた
ただフレームの最初から動かす便利なメソッドがないので、その場合キャンバスに直書きとなるようだ。
いい方法あったら教えてください。


```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>APNG TEST</title>

<script src="jquery-2.1.3.min.js"></script>
<script src="apng-canvas.min.js"></script>
<script>
    $(function () {

        APNG.ifNeeded().then(function() {
            var images = document.querySelectorAll(".apng-image");
            for (var i = 0; i < images.length; i++) APNG.animateImage(images[i]);
        });

        var cvs = document.getElementById("cvs");
        var ctx = cvs.getContext("2d");
        APNG.parseURL("fox.png").then(function(anim,e){
            var num = anim.playTime / anim.frames.length;
            var i=0;
            setInterval(function(){
                if (anim.frames.length <= i) i=0;
                ctx.clearRect(0, 0, cvs.width, cvs.height);
                ctx.drawImage(anim.frames[i].img, 0, 0);
                i++;
            },num);
        });
    });
</script>
</head>
<body>

<div id="one">
<p>
    <img src="fox.png" width="150" height="150" class="apng-image" float="left">
    <canvas id="cvs" width="150px" height="150px">
</p>
</div>

</body>
</html>
```

他、Chromeをローカルで動かすのにPythonワンライナーは便利。
```
$ python -m SimpleHTTPServer 8080
```

## 追記

時々アクセスがあるようなので最近の状況について書いておきます。

### 2017/03/13 現在の状況

[Chromium 59.0.3039.0](https://chromium.googlesource.com/chromium/src/+log/59.0.3038.0..59.0.3039.0?pretty=fuller&n=10000)において、[427dfb952160b6402103f5db70a0e3dc6c5c500d](https://chromium.googlesource.com/chromium/src/+/427dfb952160b6402103f5db70a0e3dc6c5c500d)でAnimation PNGが実装されています。

[Issue 2618633004: Add support for Animated PNG](https://codereview.chromium.org/2618633004)もまもなくCloseになりそうです。

あとは、既にソースのアドレスはNot Foundになってますが、確かAPNGはChromium 58で実装を予定となっていたように思います。

本日予定通り、Chromeの57もリリースされました。
順調にいけば59のバージョンで6月にリリースとなるかもしれません。
58のバージョンに入れば4月ですね！

* [Chromium Development Calendar and Release Info](https://www.chromium.org/developers/calendar)
  * 57,Mar 14th, 2017
  * 58,Apr 25th, 2017
  * 59,Jun 6th, 2017


### 2017/03/18 現在の状況

先日のIssueがClosedになっていました。
[Issue 2618633004: Add support for Animated PNG (Closed)](https://codereview.chromium.org/2618633004)

#### masterに組み込まれています。

Cr-Commit-Position: refs/heads/master@{#456840}
Committed: https://chromium.googlesource.com/chromium/src/+/7d2b8c45afc9c0230410011293cc2e1dbb8943a7

今のところ59に組み込まれているようです。
<img width="645" alt="スクリーンショット 2017-03-18 4.04.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/35973/5a5fcb6b-ae7c-6c74-0ef6-9171ebc58dd4.png">

下記ページでも59に更新してありました。
[Animated PNG (APNG)](http://caniuse.com/#feat=apng)
<img width="571" alt="スクリーンショット 2017-03-18 4.09.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/35973/a079d2e7-f694-a24c-487e-373d549c3862.png">
Arduino + カラー液晶で落ち物ゲームを作る


# 概要

[前回](http://qiita.com/d2cs-ytakada/items/4b7fc4a499b555702dc4)は、モノクロ液晶で簡単なゲームを作ってみました。

今回はそこから進化して、液晶がカラーになりました！

折角カラーなので、色を使った落ち物ゲームを作ってみたいと思います。

# 作るゲーム
下記のようなゲームにしてみたいと思います。

* w6 x h12の盤面
* 2個のピースが繋がったブロックが落ちてくる
* 色は5色
* 同色のピースを縦・横に4つ以上つなげると消える
* 連続して消える（チェイン）と、チェイン数に応じてスコアが2^(chain-1) * 10 ずつ加算される


# 使用材料

* Arduino UNO R3 (開発とArduinoライタとして)
* ATMEGA328P（[秋月で250円](http://akizukidenshi.com/catalog/g/gI-03142/)）
* カラー液晶 128x128 ICはST7735（[ebayで300円](http://www.ebay.com/itm/191866322734)）
* 16MHzセラロック（[秋月で35円](http://akizukidenshi.com/catalog/g/gP-00525/)）
* ユニバーサル基板（[秋月で60円](http://akizukidenshi.com/catalog/g/gP-03229/)）
* タクトスイッチ（[秋月で1個10円](http://akizukidenshi.com/catalog/g/gP-03647/)）
* ICソケット 
* ロジックレベルコンバーター（[ebayで2個100円程度](http://www.ebay.com/sch/i.html?_sacat=0&_nkw=Logic+Level+Converter&rt=nc&LH_BIN=1)）

前回とカラー液晶以外は全く同じです。
それにしても、1個300円は安い・・。前回のモノクロ液晶の半分以下です。。。

# 使ったカラー液晶について (ST7735)
使用したカラー液晶には、ST7735というICが積まれていました。
ST7735のライブラリはいくつか有るようなのですが、
今回は、[sumotoy](https://github.com/sumotoy)さんが作ったライブラリを利用しました。
ただ、128x128のこの液晶向けのコンフィグがなかったので、
コンフィグを追加して利用しています。
githubは[こちら](https://github.com/alf-ytakada/TFT_ST7735/tree/1.0p1-add-display)。

Arduinoに追加する場合は、githubからZIPでダウンロードし、

    [スケッチ] -> [ライブラリをインクルード] -> [.ZIP形式のライブラリをインストール] 

でダウンロードしたZIPを選べばOKです。


# 回路図
ハンダ付けをするときのために、簡単な回路図を作っています。
ソフトには水魚堂さんの[BSch3V](http://www.suigyodo.com/online/schsoft.htm)を使わせていただいております。
直感的に操作ができ、とても便利です。

今回は下記のようになりました。
※回路図としては、記法的に不正確かもしれませんが、ご了承下さい。。

![color-blockgame-LCD.png](https://qiita-image-store.s3.amazonaws.com/0/129201/949ac033-90bf-f4ff-c01c-8298f05fee49.png)

液晶とタクトスイッチを、atmega328pにつなげただけですね。
ちなみに単三電池2本で動かすので、ロジックレベルコンバータは不要です（開発中のブレッドボードでは使いましたけどね！）。

※本回路図エディタのファイルも、落ち物ゲームのリポジトリに入れております。

# ソースコード
[githubにあげています](https://github.com/alf-ytakada/arduino_ochimono_game)。

今回は、
・Arduino部分
・View部分
・ゲーム処理部分
で分割してみました。

モダンなC++の機能が使えるのは、
普段LLを使っている身としてはありがたいです。

# 完成品
こんな感じのゲームになりました。

[![arduino + カラー液晶で落ち物ゲームを作る](http://img.youtube.com/vi/_FO0nece_RA/0.jpg)](https://www.youtube.com/watch?v=_FO0nece_RA)


# 感想
カラー液晶の発色を見た時に、子供の頃初めてゲームボーイカラーの液晶を見た時のことを思い出しました。
当時は、ゲームボーイカラーで表示されたスライム（ドラクエモンスターズ1です！）の青さに、本当にとても感動したものです。。


ところでゲームボーイカラーのスペックは、下記のようなものだったようです。
[wikipedia:ゲームボーイカラー#基本仕様から引用](https://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%9C%E3%83%BC%E3%82%A4%E3%82%AB%E3%83%A9%E3%83%BC#.E5.9F.BA.E6.9C.AC.E4.BB.95.E6.A7.98)

* CPU：カスタムZ80 4MHz / 8MHz（カラー専用カートリッジ用の倍速モード）
* RAM : 32kバイト（カートリッジ側に128kバイトまでの増設メモリを搭載可能）
* VRAM：16kバイト
* ROM：最大64Mビット（＝8Mバイト、発売されたソフトの実績値）
* サウンド：ステレオ、PSG音源4チャンネル （波形メモリ1音、矩形波2音、ノイズ1音）
* 画面：TFT液晶ディスプレイ（160×144ドット、32768色中最大56色表示可能）


それに対してarduino仕様のatmega328pは、

* CPU: 8bit RISC 16MHz
* RAM: 2kバイト
* ROM: 32kバイト

CPUは速いですが、RAMは1/16、ROMは 1/512です。
意外とゲームボーイカラーって、RAM多かったんですね。


ということで、カラー液晶を使った工作でした！

さて、次回は「音」を出してみたいと思います！