OmniAICreator/Qiita-1.07M huggingface dataset:
GR-CITRUSファームウェアをカスタマイズしてオブジェクト指向ぽくmrubyでプログラミング

##概要
少し前に[Class定義をバシバシするとバイナリサイズがでかくなって困るわー](http://qiita.com/paichi81@github/items/38c752862d5527762dee)みたいなこと書いたのですが、[takjnさんのカスタムmruby構築](http://qiita.com/takjn/items/42fa8ad0c61a8840a9c2#_reference-7eace0853ad79f7e59fe)および[Shimo_cchiさんのmrbgem構築](http://qiita.com/shimo_cchi/items/645d814995c1902a2563)をもとに、自分用カスタムファームを強化してみました。
mrbgemはlibmruby.aを作るときに組み込んでしまうので、ファームビルド後につかえるようになるarduino由来のメソッドは組み込めないのかと思ってましたが、なんのことはなく事前に組み込むことができたという話です。
コンパイル時に評価されないから関係ないということでしょうか？←理解はできていません。ただmrubyを構築するときにmrbgemがCに置き換えられてたり、なかなか見ていくと興味深い構造なんだと気づかされました。

##やったこと
mrbgem組み込みついでに個人的に気になっていた点を直した。

   1. ローダのヘルプは ? を入力するまで表示させないプロンプト表示にした
   2. ローダのコマンドでよく使うものは小文字で受け入れるようにした(r x z l)
   3. takjnさんの組み込まれてたNeoPixel,SSD,GFXを最新ファームのブランチに移植
   1. Serial.println を Serial.puts にした
   2. Pinを汎用Classにし、InputDevice, OutputDeveceを定義

##例

13番ピンにタクトスイッチを取り付け、もう片方をGNDにおとしただけの配線をしたうえ、下記プログラムを実行。

![2016-12-13 (2).png](https://qiita-image-store.s3.amazonaws.com/0/23242/194f9d60-1f35-3769-ad32-0ea47fa67a00.png)

※上記の例で、バイナリサイズは363Byteにおさまっている。

![2016-12-13 (3).png](https://qiita-image-store.s3.amazonaws.com/0/23242/bd2850bf-e474-feb5-7cc5-eb0fd052ad18.png)


##まとめ
思いの外かんたんにmrbgemが組み込めたので、前に作ったLEDMatrixをgem化して組み込んでみるつもり。
しかしあまり多くgemだらけにするとlibmruby.aが肥大化して、ファイルコピーできなくて焦るので気をつけないといけない。
いまのところ579kbのファームウェアは75%までコピーされたところで止まる。けっこう肝を冷やすので500kbくらいを目安にしている(個人の感想です)

mrubyのCコードもわかりやすくできてるようで、Cを知らない自分もなんとかなりそうな気がした(するだけかもしれない)。
同じく気になっている .avalableとか.useWiFiとかもbooleanで帰ってくるように、改造したいような気もする。

※[カスタム版ファームウェア](https://github.com/paichi81/wrbb-v2lib-firm/tree/master/firmware/firmware_develop)は秘密結社ギフハブに保存していますが、自己責任でお願いします。
Python で unittest して CI する

## 前提

- Python 3.5
- unittest
- Travis CI
- GitHub Public Repository


## ディレクトリ構成

```
project/
├── src/
│   └── module/
│       ├── __init__.py
│       └── add.py
├── test/
│   ├── module/
│   │   ├── __init__.py
│   │   └── test_add.py
│   └── __init__.py
└── .travis.yml
```


## 内容

モジュールを書きます．

```python:project/src/module/__init__.py
```

```python:project/src/module/add.py
def add(a, b):
    return a + b
```

おまじないを書きます．

```python:project/test/__init__.py
import sys

sys.path.append('src')
```

テストを書きます (ファイル名は `test_*.py`)．

```python:project/test/module/__init__.py
```

```python:project/test/module/test_add.py
import unittest

from module.add import add


class TestAdd(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(1, 2), 3)


if __name__ == '__main__':
    unittest.main()
```

CI してもらいます．

```yaml:project/.travis.yml
language: python
python: 3.5
script: python -m unittest discover
```
IMEを使う（macOS編）

# はじめに
AppleのIME APIはドキュメントを読んだだけでは実装できないと思うので、わりと有用な記事になるかもしれません。

# `NSTextInputClient`
Objective-Cだと10.5以降、Swiftだと10.10以降に対応という楽しいProtocolです。
他のIME APIと同様に、自前のTextViewを作るときくらいにしか使われません。
（https://developer.apple.com/reference/appkit/nstextinputclient?language=objc）

大まかな実装の手順は以下のとおり。

1. `NSView<NSTextInputClient>`を継承したViewを作る
2. このView上に編集対象のテキストを表示可能にする
3. `NSTextInputClient`の関数を実装する

これで、IMEを正しく扱うことができます。
WindowsのTSFと比較すると以下の機能には対応していません。

- 複数の文字列選択
- アプリケーション側からの再変換要求

## ドキュメントに書かれていないこと
[ドキュメント](https://developer.apple.com/reference/appkit/nstextinputclient)に幾度となく現れるmarked textとselected textですが、ドキュメントではそれらがどういう値を返すべきかという点については記述されていません。
なので初見殺しであろうこれらについて、実装した際の挙動から推測される定義をまとめておきます。

### marked textとは何か
- 未確定文字列があるとき
    - 未確定文字列の範囲
- 未確定文字列がないとき
    - なし: `{NSNotFound, 0}`

### selected textとは何か
- 未確定文字列があるとき
    - 未確定文字列中の`setMarkedText`で渡された範囲
- 未確定文字列がないとき
    - 選択中の文字列の範囲

# 実装メモ

## 基本

以下の関数は素直に実装しましょう。

- hasMarkedText
    - 未確定文字列の有無
- markedRange
    - 未確定文字列の範囲
- selectedRange
    - 選択文字列の範囲
- setMarkedText
    - 未確定文字列の挿入
- unmarkText
    - 未確定文字列の解除
- validAttributesForMarkedText
    - 表示可能な装飾
- attributedSubstringForProposedRange
    - 指定範囲の文字列
- insertText
    - 文字列の挿入
- characterIndexForPoint
    - ディスプレイ上の座標に対応する文字のインデックス
- firstRectForCharacterRange
    - 指定された範囲の文字列の最前方の矩形
- doCommandBySelector
    - 適宜処理する

## 縦書きのために
縦書きのために必要なことは、`drawsVerticallyForCharacterAtIndex`（オプションの関数）で`YES`を返すことです。
そのものズバリで簡単ですね。

## 再変換のために
文字列の再変換のために必要なことは、`attributedString`（オプションの関数）を常に返すことです。
つまり`NSAttributedString`という文字列長に比例した大きさのオブジェクトを返さなければいけません。
`NSAttributedString`が世界最高の文字列クラスなら問題ないのですが、そんなことはないので実装には注意しましょう。
もちろん`NSAttributedString`を使うならば何も問題はありません。
（TATEditorのデフォルトではIME側に見せる文字列の範囲をある程度狭めて返すようにしてます）

# おわりに
素晴らしきAppleのドキュメントの充実っぷりを味わうことができたかと思います。

さて、明日はIME APIのGTK+編です。
CentOS7 remi-release-7.rpm Recv failure: 接続が相手からリセットされました

##Remiのrpm取得に失敗する。

ちょっと前までは,これで行けてたけど

```
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

うまくいかなくなってる。

```
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
curl: (56) Recv failure: 接続が相手からリセットされました
エラー: http://rpms.famillecollet.com/enterprise/remi-release-7.rpm をスキップします - 転送に失敗しました
```

とりあえず、これで

```
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7.rpm
```
Mac OSのServerが立ち上がらない時のメモ

MacのOSをYosemiteからSierraへアップグレードして、Serverアプリを最新にしたら以下のメッセージが出て起動ができない。

>This version of Server does not support upgrading the Server data on this volume. To upgrade your Server data, you will need to install an older version of Server and OS X.

この場合、/Library/Serverのフォルダを削除したら再度セットアップが実行された。
CloudFrontのここがつらい

## はじめに
みんな大好きCloudFrontですが、本格的なCDNが手軽に使える分、けっこう落とし穴があります。そこで、個人的にはまったポイントを書いてみました。

## ここがつらい

### Originに転送できないリクエストヘッダーがある
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html#forward-custom-headers-blacklist
Cache-ControlやContent-Lengthが転送できないのは、CloudFrontがリクエストボディを書き換えるから、Originに転送する意味がないためだろう。If-*関連のヘッダーが転送されないのはちょっと不便、、

### Rangeヘッダーを書き換える
Rangeヘッダを付けずにCloudFrontへmp4動画をリクエストすると、OriginへのアクセスにRangeヘッダが追加されている。たぶんファイルサイズの大きいファイルへアクセスがあると、Originから部分ダウンロードを試みるのだろう。

また、RangeヘッダーをつけてCloudFrontへアクセスしたときも、Rangeヘッダが書き換えられる。
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RangeGETs.html
> パフォーマンスを最適化するために、CloudFront は、Range GET でクライアントから要求された範囲よりも大きい範囲を要求する場合があります

Rangeヘッダーをチェックしてごにょごにょしているプログラムを扱っているときは、注意。

### APIでinvalidationを投げるとき、ユニークなトークンを送る必要がある
例えばrubyのaws gemを使うと、caller_referenceにユニークな文字列を入れる必要がある。caller_referenceが空だったり、以前のinvaidationとcaller_referenceが被っていたりすると、invalidationは発行されない。なぜinvalidationが動かないのかわからず、はまったことが。。
rubyのコード例:

```rb
cloudfront = Aws::CloudFront::Client.new
cloudfront.create_invalidation(
  distribution_id: "YOUR_DESTRIBUTION_ID",
  invalidation_batch: {
    paths: {
      quantity: 1,
      items: ["/*"]
    },
    caller_reference: Time.now.to_i.to_s # 現在時刻を入れる
  }   
)  
```

### 反映が遅い
一般的なCDNと同じく、CloudFrontサーバー同士はP2Pで通信する仕組みのはず。ブロードキャストのような通信方法に比べて、すべてのサーバーに変更が行き渡るまでに時間がかかる。少し設定を変更するたびに20分ぐらい待たないといけないのはやはり辛い、、

### URLからファイル名を省略できない
Default Root Objectにファイル名を設定できるが、ルートパスにのみ適用される。（例えばDefault Root Objectにindex.htmlを設定したとき、/のパスで/index.htmlにアクセスできるが、/sub/のようなパスで/sub/index.htmlにアクセスはできない。）特に他のサーバーからCloudFrontに移行するときは、ファイル名が省略されたURLがないか確認する必要がある。

## 終わりに
つらさが伝わるといいなあ・・・
Bitbucket Serverバックアップ手順

#環境
CentOS 7.2.1511
Atlassian Bitbucket v4.10.1
bitbucket-backup-distribution-3.3.1.zip

マニュアル
https://confluence.atlassian.com/bitbucketserver/using-the-bitbucket-server-backup-client-776640064.html

---
いくつか方法があるようです。今回は Bitbucket Server Backup Client でやってみます。

* Bitbucket Server Backup Client
* Bitbucket Server DIY Backup
* Bitbucket zero downtime backup

1. ダウンロード https://marketplace.atlassian.com/plugins/com.atlassian.stash.backup.client/server/overview
2. Bitbucket Server にコピー
3. 解凍

```
sudo -s
yum install unzip
unzip bitbucket-backup-distribution-3.3.1.zip
```

4.実行。xxx部分などは修正して実行します。

```
cd bitbucket-backup-client-3.3.1/
java -Dbitbucket.password="xxx" -Dbitbucket.user="xxx" -Dbitbucket.baseUrl="http://localhost:7990" -Dbitbucket.home=/var/atlassian/application-data/bitbucket -Dbackup.home=/home/xxx/backup -jar bitbucket-backup-client.jar 
```

以上です。
各月の日数について

各月の日数は決まっている。例外は閏年で変わる2月だけ。

 - 31日まであるのは1、3、5、7、8、10、12月。
 - 残りの2、4、6、9、11月は2月を除き全て30日まで。

|月|日数|
|---|---|
|1|31|
|2|28 or 29|
|3|31|
|4|30|
|5|31|
|6|30|
|7|31|
|8|31|
|9|30|
|10|31|
|11|30|
|12|31|

# 覚え方
「にしむくさむらい（士）」　の語呂合わせで、31日でない月は覚えられる。
2, 4, 6, 9, 11。

# JavaScript的には
上記の基本日数を配列に格納しておき（2月は28）、
閏年判定さえできれば、各月が何日までなのかはDateオブジェクト無しで求めることができる。

## 閏年判定について
1. 4で割り切れる年である。
1. 4と100で割り切れるが、400で割り切れない年は例外的に平年とする（4と100と400で全て割り切れる場合は閏年）

例: 2004年、2008年、2012年は4で割り切れるので閏年。
2100年、2200年、2300年は4と100で割り切れるが400で割り切れないので平年。
2400年は4と100で割り切れて、400でも割り切れるので閏年。

```js
var isLeapYear = function(y){
    return y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0);
};

var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
```

```js
var year = 2012,
    month = 1,
    lastDay = days[month - 1]; // 31

if(isLeapYear(year) && month === 2){
    lastDay = 29;
}
```
SourceTreeユーザーでも知っておいたほうが便利なgitコマンド


# SourceTreeって便利ですよね！ #

SourceTreeって便利ですよね！
gitわかんなくても色々できちゃうんですから！

とりあえずpullして編集して～pushして～
ひとによってはPullReqしちゃったりして～
便利～

便利は便利なんですけど
たまーにおせえ！めんどくせえ！
って事があります。

そんなときに便利なgitコマンドを紹介します。

# 対象読者 #

* SourceTree使ってる人
* gitわかんねーっていう技術職
* git使わされてる企画職
* gitとりあえず使ってるアートやサウンド作る人（なんていうの？）

以下はsourcetreeだとちょっと操作がめんどくさいことを書いています。
pullとかはsourcetreeでいいやん。

# コンソールの出し方 #

コンソールの出し方はSourceTree右上にターミナルとか端末っていうボタンがあるからそれおすとでるよ。
そこにコマンド打ち込んでいけばOK

# とりあえず覚えとくとすぐ楽になる #

覚えとくと何かと便利なもの

## 全部リセットしたい ##

たまに何故かpullに失敗して…ついでにリセットしてもまだだめとか…
このコマンドでSourceTreeのリセット以上に全部リセットします。

```shell-session

git clean -df ; git checkout .

```

###ちょっと解説###

git clean -df
でgitの管理下にない(SourceTreeで？になる)ファイルをすべて削除します。

git checkout .
でgitの管理下にある変更したファイルを(SourceTreeで黄色になるやつ)をリセットします。
SourceTreeのリセットはこちら

;は2つ以上のコマンドを一行で書きたいときに使います。接続詞みたいなものです。

## 一つのファイルを消したい ##

よくわからないエラーにファイル名が表示された…
とりあえず消すには…エクスプローラー出して…
ってめんどくさいのでコマンドラインで消しちゃいましょう

```shell-session

#windowsの人こちら
del ファイル名

#macやGit for Windows適用済の人
rm ファイル名

```

たまに便利なので覚えときましょうね。

# いらないブランチ消したい人向け #

## リモートのすでにないブランチを消したい ##

例えば、あなたのプロジェクトが1リポジトリにプッシュしてブランチ間でPullRequest出す。
というような運用をしていた場合ローカルのブランチにすでにないブランチが表示され続けます…うぜぇ…

そんなときはこのコマンドですでにないブランチが表示されなくなります

```
git prune
```

## リモートにすでにないブランチをローカルから消し去りたい ##

更にリモートにブランチがいっぱい見えてるけどもう使ってないブランチがいっぱい！というときにはこちら

```
git fetch --prune
```


# ちょっと上級者向け #

## ファイルを微調整中で何度も修正をしてコミットするを繰り返したい ##

要はSourceTreeだと何度も同じファイルをプッシュするの面倒くさいからコマンドでやりましょ
ってことです

簡単なツール作ったりする技術や向けかも

```shell-session

cd ファイルのあるディレクトリ(フォルダ名)
git add ファイル名 ; git commit -m "コミットのメッセージ" ; git push origin ブランチ名

```

で、これの何がいいかというとですね。
このコマンドを使ってから↑ボタン押すと同じコマンドが自動入力されます。
いいでしょ。

###ちょっと解説###

cd ディレクトリ(フォルダ)
はディレクトリ(フォルダ)に移動します。エクスプローラーでフォルダクリックするみたいな感じです。

git add ファイル名
はSourceTreeでいう追加ですね。

git commit -m "コミットのメッセージ"
でコミットします。
mはメッセージの略です。

git push origin ブランチ名
でプッシュです。

originは自分のブランチにプッシュします。（設定によります。）

### 注意 ###

このコマンドはリモートに影響を与えます。
特にpushのところのコマンドはちょっと注意して使ってください。

# マージのチェリーピックをしたい #

マージされたコミットをチェリーピックするとこういうエラーが出ると思います。

```
git -c diff.mnemonicprefix=false -c core.quotepath=false cherry-pick コミットのハッシュ
error: Commit コミットのハッシュ is a merge but no -m option was given.
```

こういうときはおもむろに一行目のコマンドに -m 1オプションを付ければたいてい解決します

```

git -c diff.mnemonicprefix=false -c core.quotepath=false cherry-pick コミットのハッシュ -m 1

```

# ところで #

[カレシ・カノジョできないエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/give_me_kareshi)の記事です。

やっぱり技術職以外の人が触れるネタの方がいいよね！とか思って書きました。
一瞬、恋愛を関数化してみようとか書いてたんですけど黒歴史化するのでやめました。

前回の[synchronized のメモ](http://qiita.com/BK93/items/c7f2ac357f36930ff77f)からバトンタッチできました。
主催の[nagaoyuriko](http://qiita.com/nagaoyuriko)さんの記事は他業種の話聞くの楽しいですよね。ってことでめっちゃ面白いです。

ダンサーさんって裁縫必須なんだ…コス衣装ですら作ろうとすら思わないのに無理や…
毎回2,3万くらいのですよちくせう。ロリータとかさらに高いよね。
恋人よりロリータとか選んでくれる友達がほしい今日この頃です。
備忘録_ctagsをscssで利用


## 環境

- Mac
- Neovim

## 手順

1 ctagsの導入

```
$ brew install ctags
```

2 .ctagsファイルの作成

```
// .ctagsの設定ファイルを作成
$ vi $HOME/.ctags
```

3 .ctagsファイルに下記の設定を追加

```.ctags
--langdef=SCSS
--langmap=SCSS:.scss
--regex-SCSS=/^\s*(\$[a-zA-Z_-][a-zA-Z0-9_-]+)/\1/d,var/
```

4 init.vimに設定を追加

```init.vim
if expand("%:t") =~ ".*\.scss"
	setlocal iskeyword+=$
	setlocal iskeyword+=-
endif
```

5 tagファイルの作成

プロジェクトのルートディレクトリに移動後、下記のコマンドを実行

```
$ ctags -R
```

tagファイルが作成され、その中にタグが作成される


参考
https://teratail.com/questions/58237
S3 のクロスアカウント書き込みにまつわる厳しい現実

# tl;dr

AWS アカウントをまたいだ S3 バケットへの書き込みが色々とアレ~~なので Lambda で無理矢理アレした~~。

※1年半ぶりに追記: 解決策はあまりにも無理矢理だったが問題の知見としては有用なのでタイトルを変更しておく

# 背景

S3 は AWS 最古参のサービスであり、 S3 が登場した頃は IAM も存在しなかった。このため、今では AWS サービスの標準アクセス権限管理になった IAM とは異なる、独自のアクセス権限管理の仕組みが S3 にはある。

この歴史的経緯により、ある状況で非常に面倒な事態が発生する。

# バケットオーナー != オブジェクトオーナー の場合に発生するつらみ

- 凡例
    - つらくない現実
    - **つらい現実**
- [バケットポリシーで他アカウントへの認可を設定する](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-walkthroughs-managing-access-example2.html)と、別の AWS アカウント（と、その配下の IAM User など）がバケットへの書き込みを行えるようになる
- バケットに [`PutObject`](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) されたオブジェクトのオーナーはそのオブジェクトを PUT したユーザーになる
    - ここでの `ユーザー` は `AWS アカウント` と読み替えても構わない
    - これが誰なのかを調べる API は [`GetObjectACL`](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html) である
- **権限付与（Object ACL）を明示的に指定せず PUT されたオブジェクトへの権限は、オブジェクトオーナーのフルアクセスのみになる**
    - オブジェクトオーナーのフルアクセス権限は剥がすことができるが、そのようにしても依然としてオブジェクトオーナーはそのオブジェクトへのフルアクセスが可能である
- **自分がオーナーではなく、自分に対して明示的許可が与えられていないオブジェクトに対する[`GetObject`](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html) 、 [`GetObjectACL`](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html) はバケットオーナーであっても不可能**
- バケットオーナーは、自分に対してアクセス許可がないオブジェクトを [`DeleteObject`](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html) できる
- 自分がオーナーでないオブジェクトと同じキーに対して [`PutObject`](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) すること（上書き）は可能
- **バケットポリシーによるアクセス許可は、オーナーがバケットオーナーであるオブジェクトのみに適用される**

# ~~どうしたか~~

アカウント A と B があるとして、アカウント A にあるバケットに対し、アカウント B から `PutObject` した場合に上のようなつらみが発生する。

~~そこで、まず `s3:PutObject`, `s3:GetObject`, `s3:GetObjectAcl` が可能な Role をアカウント B に作り、さらに以下のような Lambda Function をアカウント A に配置して S3 の `ObjectCreated` イベントで発火するようにした。~~

- ~~[lambda-s3-put-with-acl/index.js at master · y13i/lambda-s3-put-with-acl](https://github.com/y13i/lambda-s3-put-with-acl/blob/master/functions/putWithAcl/src/index.js)~~

## ~~これは何をしているのか~~

1. ~~前述の、アカウント B にある Role を `sts:AssumeRole` する~~
2. ~~作成されたオブジェクトにバケットオーナー（アカウント A）に対する ACL が設定されていなければ~~
3. ~~バケットオーナー（アカウント A）に対する ACL を明示的に指定して、 `PutObject` しなおす~~

~~1が必要なのは、この場合2と3がそもそもアカウント A からは操作できないから。~~

# ~~まとめ~~

~~**ここまで全部 BK** 。 S3 (**Simple** Storage Service) は極力シンプルに使うべき。~~

# ~~その他~~

~~Serverless Framework で書き直したい。~~
疑似クラスvisitedをlocalStorageを使って装飾する

擬似クラス`visited`はプライバシー上の理由で、特定のプロパティ（色に関するもの）しか利用できません。
[:visited - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/:visited)

私がやりたかったのはアイコンフォントを使ってチェックマークを`before`を使い、未訪問と訪問済みで使い分けたかったのです。
こんな感じ↓
![訪問.png](https://qiita-image-store.s3.amazonaws.com/0/133977/0621a21b-cd54-c70b-e98b-799d482a489a.png)

しかし`visited`は擬似クラスにも対応していません。

```css
a:visited:before {
    content: "これは適用されません";
}
```

この問題に解決するためにクッキーで訪問の判別をする方法が出回ってました。
「ライブラリ入れるの面倒くさい」
「リクエストが増えるのが嫌だ」
ということで`localStorage`を使ってみました。



# コード
```html:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>タイトル</title>
</head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="css/style.css">
<body>


<ul>
  <li><a href="//localhost:3000/test/">未訪問</a></li>
  <li><a href="//localhost:3000/">訪問済み</a></li>
</ul>



<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script src="js/script.js"></script>
</body>
</html>
```
```scss:style.scss
ul {
  list-style: none;
}
a {
  &:before {
    content: "\f096";
    font-family: "FontAwesome";
    margin-right: 0.5em;
  }
  &.visited {
    &:before {
      content: "\f046";
    }
  }
}
```
```css:style.css
ul {
  list-style: none;
}

a:before {
  content: "\f096";
  font-family: "FontAwesome";
  margin-right: 0.5em;
}

a.visited:before {
  content: "\f046";
}
```
```javascript:script.js（jQuery）
$(function(){
  var nowLocation = location.href;
  localStorage.setItem(nowLocation, nowLocation);

  $('a').each(function(){
    var anchorHref = $(this).prop('href');
    var anchorHref = anchorHref.replace(/(index.html|index.php)/gi,'');
    if( localStorage.getItem(anchorHref) == anchorHref ){
      $(this).addClass('visited');
    }
  });
});
```

## 仕組み
`location.href`で現在のURLを取得します。
`location.href`を`localStorage`に入れます。訪れたページが全て`localStorage`に入ってます。
`a`の数だけループします。
`$(this).prop('href');`でhrefの値を拾い、`anchorHref.replace`で表記のばらつきを直します。
直した`href`の値が`localStorage`の中にあれば`class="visited"`を追加して完了。

## 解決できないこと
外部サイトはデータを保存出来ないので判別できません。
割りとそこがネックなのですが、今回は私が使用したものでは問題になりませんでした。

HTML5に対応していないブラウザは`localStorage`を使えません。また、一部環境では容量に制限があります（数量は無制限）。

一部環境でプライベートブラウジング時はうまく動きません。
[SafariのプライベートブラウジングでWebStorageが使用できない挙動と対処法](http://qiita.com/narikei/items/f55fb9cb398beac52ea9)

## 最後
`visited`が色だけしか変更できないのを知っていて無理やり脳が忘れたみたいです。
些細なことだったのですが、モヤモヤした気持ちになったので適用させてみました。
自分的 Android Development ChaosMap 2016

# 知見を体系的に得たい

私は、とある企業でAndroid開発をちまちまやっている身ですが、開発の知見を体系的に整理して、しっかり伝えられるようになりたいと思い立ちました。

今、世の中で流れているキーワードを元に、**Android開発で知見を得るべきカテゴリのマップ**を作ってみたんですが、年々カオス度が高まっている気がしてきました。

1時間でまとめてみた図なので、実際に知見を掘り込んだ上で、カテゴリ変更必要なら更新していきたいなと思います。

※　OSSのカテゴリ分けは、wasabeefさんの「awesome-android-libraries」をそのまま参考にさせてもらいました。
https://github.com/wasabeef/awesome-android-libraries

## 自分的 Android Development ChaosMap 2016

![Android.png](https://qiita-image-store.s3.amazonaws.com/0/154253/3f8d2afa-39b9-a44a-569f-197266f8cf65.png)
CloudFrontの特有ヘッダを一般的なヘッダに書き換えて楽をするメモ

WEBアプリケーションの前段に CDN として CloudFront を使っているとスマホ判定やhttps判定でCloudFront用の特別設定を開発者側にしてもらう必要がある。

具体的には `User-Agent` が取れない代わりに `CloudFront-Is-Mobile-Viewer, CloudFront-Is-Tablet-Viewer, CloudFront-Is-Desktop-Viewer, CloudFront-Is-SmartTV-Viewer` などを見るようにする。
また、一般敵なProxyを経由したときのhttps判定では `X-Forwarded-Proto` を見るところ、CloudFront では `CloudFront-Forwarded-Proto` というヘッダを見てやる必要がある。

で、多くのアプリでは User-Agent 判定に iPhone/iPad などの文字列が含まれているかを使っており、またhttps判定では `${HTTPS} =on` または標準的な `X-Forwarded-Proto` ヘッダ辺りを見ているものがおおい。そしてCloudFrontのヘッダに対応しているものは少ない。
なので、CloudFrontのヘッダを見つけたら、対応されていることが期待できる `User-Agent` や `X-Forwarded-Proto` ヘッダを擬似ってやることで**アプリケーション開発者/デプロイ作業者の作業を少し減らしてやろう**。というのが本エントリの趣旨です。


# リクエストヘッダを書き換える設定
で、以下のような設定を httpd.conf に書いておいてあげることで、php や .htaccess などのアプリケーション側では普通のWEBサーバにデプロイされたときと同じように User-Agent や X-Forwarded-Proto を見て判定すれば、それらのヘッダについて特別 CloudFront の存在を意識する必要はなくなる。

```apache:httpd.conf
# アプリ側でCloudFrontスペシャルのスマホ判定をしなくてよいようヘッダを書き換える
SetEnvIf CloudFront-Is-Mobile-Viewer true is-mobile
SetEnvIf CloudFront-Is-Tablet-Viewer true is-tablet
RequestHeader set User-Agent "Amazon CloudFront (iPhone)" env=is-mobile
RequestHeader set User-Agent "Amazon CloudFront (iPad)" env=is-tablet
# アプリ側でCloudFrontスペシャルのhttps判定をしなくてよいようヘッダを書き換える
SetEnvIf CloudFront-Forwarded-Proto https is-https HTTPS=on
RequestHeader set X-Forwarded-Proto https env=is-https
```

終わり。
R: sample関数で引数の要素数が1つの場合の挙動

Rの`sample`関数は、ベクトルとサンプル数を与えると、そのベクトルから無作為に要素を抽出してくれる。

    sample(1:9, 3)
    #[1] 4 9 6

だけど、第１引数の要素数が長さ１の数値の場合、それを最大値とする整数のサンプルを取る仕様になっている。
    
    sample(5, 1)
    #[1] 4

ヘルプを見ると、注意が喚起されている。

    If x has length 1, is numeric (in the sense of is.numeric) 
    and x >= 1, sampling via sample takes place from 1:x. 
    Note that this convenience feature may lead to undesired 
    behaviour when x is of varying length in calls such as sample(x).

ちなみに、長さ1の文字列の場合だと、その文字からのサンプルになる。

    sample("X", 1)
    #[1] "X"

結論：気をつける。
PDFのファイルサイズをGhostscriptのコマンドで小さくする

大きいファイルサイズのPDFはEメールに添付して送付すると、メールサーバーで弾き返され、送付できないことがある。そのような場合は、PDFの画像の解像度を落としてファイルサイズを小さくするGhostscriptのコマンドが役立つ。

```bash
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
   -dPDFSETTINGS=/screen -sOutputFile=output.pdf input.pdf
```

`output.pdf`は出力ファイル名、`input.pdf`は入力ファイル名である。`-dPDFSETTINGS`でPDFファイルの解像度を指定してファイルサイズを小さくできる。`/screen`が一番解像度が低く、`/ebook`は中間程度、`/printer`と `/prepress`は高解像度である。

###参考
https://www.techwalla.com/articles/reduce-pdf-file-size-linux
データストアについてまとめてみた

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> データストアとは

RDBMS や KVS などのデータを格納する仕組みを指してデータストアと呼びます。データストアは HDD や SSD から効率的にデータを取得・保存する仕組みを提供します。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> HDD
### HDD について

今では SSD もお手頃な価格になってきましたが、依然データの格納場所は主に HDD です。20年前は数十MBだった容量も近年では数TBのものが数万円で手に入ります。データ転送帯域は広くなってきていますが、シークタイムだけはそれほど早くなっていません。

### シークタイム

HDDがディスクを読み出すためにヘッドを動かす処理を `シーク` と呼びます。`シーク` に係る時間をシークタイムと呼びます。HDDでは物理的にシークを行ってデータを読み出すためシーケンシャルな(ディスク上に連続して配置された)データを読み出すのは得意ですが、ランダムな(ディスク上に飛び飛びに配置された)データを読み出すのには時間がかかる。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> ストレージ装置の高速化

- RAID
  - 複数台のディスクを組み合わせて一台のハードディスクとして運用する技術
  - 複数のディスクに同時に書き込むことで高速化を行う
- SSD
  - フラッシュメモリを使用したストレージデバイス
  - HDD に代わるディスクドライブとして利用が広がっている
- PCIe SSD
  - SSD よりも SATA(接続規格)の性能が頭打ちになってしまったため、PCI-Express で接続するタイプの SSD
  - ioDrive の登場を皮切りに、M.2 や NVMe などが登場してきた

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> SSD

### SSD のメリット
- シークタイムがないためランダムアクセス性能が高い
- 書き込み性能も高い
- 省電力、静音性耐衝撃性能などが高い

### SSD のデメリット
- 容量単位の価格が高い(近年では HDD との差は縮まってきている)
- 寿命が短いとされている
- 故障時の復旧が困難

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> RDBMS

RDBMS はデータストアとして一般的に用いられてきた。ACID特性に守られた RDBMS は、特に金融などの分野では必要不可欠で、現在でも多く使われている。しあkし、データ量が爆発的に増えてきた現在では、RDBMS を使っていては思ったようにデータ利用ができない現状があります。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 分散 KVS

超大規模データの中から意味ある集計データを算出したりオンラインでそれらを参照したりするには、従来の RDBMS では難しくなっている。これらを解決するために登場したのが分散 KVS です。分散 KVS には ACID 特性はありません。そのため、使用する際にはそれを踏まえた設計をする必要があります。
速報・HyperのWindows版でbashを動かす


待望の、Hyperのv1.0.0が2016/12/12(日本時間深夜)にリリースされました。HyperはElectronで実装されたターミナルで、UIが美しいこと、カスタマイズ性に優れること、Mac版とともに、Linux版、Windows版も提供されていることが特徴です。もちろん、オープンソース!

- [公式サイト](https://hyper.is) ([GitHub](https://github.com/zeit/hyper))
- [v1.0.0 リリースノート](https://github.com/zeit/hyper/releases/tag/1.0.0)
- [Windows版ダウンロード](https://hyper-updates.now.sh/download/win)

![image](https://qiita-image-store.s3.amazonaws.com/0/1858/28b498cc-6ce0-b205-d39b-70cbc6b70111.png)

## BoWを動かす

デフォルトのシェルは、コマンドプロンプト、つまり`cmd.exe`になっています。BoW(Bash on Windows)を使うには、これを`bash.exe`に変える必要があります。設定ファイルは、`C:\Users\[User Name]\.hyper.js`にあるので、それをエディタで開きます。行末がLFなので、メモ帳で開くと見にくいです。Atomとか、Visual Studio Codeで開くと良いでしょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/1858/2e85524d-638b-0cd1-60b9-0e1ecf548c63.png)

`shell`の項目があるので、そこに`bash.exe`のパスを指定します。

```js
{
  ...
  // the shell to run when spawning a new session (i.e. /usr/local/bin/fish)
  // if left empty, your system's login shell will be used by default
  shell: 'C:\\Windows\\System32\\bash.exe',
  ...
}
```

注意点としては、バックスラッシュを2重にしてエスケープするところくらいでしょうか? あとは保存するだけで反映されました。Hyperを再起動しなくても新規タブ(Ctrl + T)を開けば、もうbashになっているはずです。

↓は試しに、手元のライブラリのテストを走らせたところです。エラーが出ているのは、Hyperの所為ではなくてBoW側の問題ですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/1858/f18a8466-5eaa-5e30-59bc-9b000a826fcc.png)

## 嬉しいポイント・気になったところ

`cmd.exe`では大丈夫だったので、BoW特有の問題のようですが次の点が気になりました。

- コマンド履歴が使えない
- タッチパネルでスクロールできない

前者は、起動ディレクトリがWindows側のホームディレクトリになっている所為な気がするので、もう少しいじったら解決するかも。後者はIssueでPgUpが認識されない報告があったのでその辺でしょうか。

一方で嬉しいのは、**Ctrl + Vでペーストができる**こと! これで、もう「ターミナル上で右クリック」にさよならできますね。
駅すぱあとWebサービスのAPI TesterアプリをElectronで作る話。

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)、13日目は[Electron](http://electron.atom.io/)で駅すぱあとWeb APIのAPI Tester的なアプリを作成してみようと思います。

## API Tester

[Slack API](https://api.slack.com/web)のドキュメントなどでは、リファレンスと一緒に[API Tester](https://api.slack.com/methods/api.test/test)が用意されており、パラメータを指定して実際のWebAPIのレスポンスを得ることができます。

WebAPIを使用する場合に、パラメータの組み合わせとレスポンスを手早く試すことができれば開発効率が向上しそうです。というわけで、さっそく駅すぱあとWeb APIの簡単なAPI Testerを作成してみました。

APT TesterのサンプルコードはGitHubにUPしてあります。WebAPIのアクセスキーは「[駅すぱあとWebサービス](https://ekiworld.net/service/lp/webservice/)」からお申込みいただくことで入手できます。

 * [valsitoh/val_sample](https://github.com/valsitoh/val_sample)

[Electron](http://electron.atom.io/)がインストールされている環境であれば、サンプルコードを`git clone`したのち、以下のコマンドで実行できます。
(Electronのインストール手順は[12日目の記事](http://qiita.com/valsitoh/items/63fe37e23eb870a96e1e)をご参照ください)

```
$ git clone https://github.com/valsitoh/val_sample.git
$ cd val_sample
$ electron ./api_tester
```

## 駅すぱあとWeb API Tester

動作イメージは以下のような感じです。各APIについて、パラメータ(全部設定できるようにする時間がなかったので一部だけですが...)を指定して、"Test WebAPI"を実行するとレスポンスを取得できます。

![img201.png](https://qiita-image-store.s3.amazonaws.com/0/152217/539d1939-29fc-8ea3-35cc-dd90e541a1f3.png)

例えばこんな感じですね。

![img202.png](https://qiita-image-store.s3.amazonaws.com/0/152217/b140a2b3-ed5c-5a96-e0df-93b7de09f799.png)

他のWebAPIについても、同様にAPIのテストが行えます。これは[駅簡易情報](http://docs.ekispert.com/v1/api/station/light.html)のレスポンスを取得する例です。

![img203.png](https://qiita-image-store.s3.amazonaws.com/0/152217/ca6141d6-fe07-4b69-2706-2efe4f512cbc.png)

[データバージョン](http://docs.ekispert.com/v1/api/dataversion.html)を取得する例です。[駅すぱあとWebサービスDocument](http://docs.ekispert.com/v1/)にも記載されていますが、レスポンスはXML,JSONのいずれかで取得できます。

![img204.png](https://qiita-image-store.s3.amazonaws.com/0/152217/4f356c76-e000-d273-a70e-7738ea0fc595.png)

せっかく[Electron](http://electron.atom.io/)でアプリケーションを作成しているので環境変数からアクセスキーを取得・設定したいところですが、今のところは都度入力する感じです。

![img205.png](https://qiita-image-store.s3.amazonaws.com/0/152217/98c1cd37-7ba4-bb89-cd76-15b0bf925974.png)

## まとめ

SlackのAPI Testerからヒントを得て、駅すぱあとWeb APIの簡単なAPI Testerを作成してみました。[WebサービスDocuments](http://docs.ekispert.com/v1/api/)のパラメータの説明を参照しながらWebAPIを試せるようにすると、より理解が進みそうです。
JavaScriptで動画をTyped array上に展開してくれるライブラリ

個人用のメモ

感染しないオープンソース
======================

https://github.com/mbebenita/Broadway
mp4.js

https://github.com/phoboslab/jsmpeg
jsmpg.js


商用ライセンス
=============




雑談
====

携帯デバイスでは動画の同時再生が1本ということが多いんで，たくさん並べるには
プロダクトオーナーと忘年会の幹事を重ねてみる。

# はじめに
すっかり忘年会シーズンになってしまいました。
ところで、（だいぶ強引ですが）忘年会の幹事とプロダクトオーナーって、実は役割が似ているんです。

# ある年の忘年会の話
登場人物は、幹事・店長・料理人たち・参加者たち です。

とある年の12月、たくさんのお客様や上司・同僚をよんで忘年会を行うことになりました。
**幹事**は忘年会の成功を、誰よりも望んでいました。
幹事には、信頼できるお店の**店長**と**料理人たち**がいました。
お客様や上司・同僚が、忘年会の**参加者たち**です。

幹事は、幹事の思い込みだけで忘年会の料理を考えるのは、幹事として失格だと考えていました。
そのため、参加者たちはどんな料理を好むのかを、自分の足を使って日々情報収集していました。
参加者たちは概ね協力的でしたが、お客様の中には幹事にとって苦手な人もいましたし、予算を握っている上司たちの中には面倒な事を言ってくる人もいました。また、意外なことに同僚たちの中には忙しくて幹事に取り合ってくれない人もいました。
しかし、みんなに楽しんでもらえるような忘年会にするため、幹事はあの手この手で参加者たちから情報を引き出しました。
例えば流行りのキーワードを会話の中に散りばめて、参加者の気を引きました。
幹事の献身的なまでの活動の結果、忘年会に協力的でなかった参加者も、しだいに幹事の話に耳を傾けるようになりました。

こうして幹事のもとには、参加者たちの忘年会に期待する料理についてのたくさんの情報が集まりました。
幹事は情報を整理して、忘年会を実現するために必要な料理のリストを作成しました。
だいぶ達成感を味わった幹事でしたが、それもつかの間、幹事は絶望します。
残念ながらすべての料理のレシピを作成することは、絶対にできないことに気がついたのです。
忘年会に必要な料理のレシピはこれから料理人たちに作ってもらいます。
忘年会の予算や忘年会当日までの日数を考慮すると、絶対にすべてを作るのは無理です。
でも当日までに少しでも多くのレシピを作りたい。
そこで幹事はリストにある一つ一つの料理に優先順位を付けることにしました。
優先順位をつけることができない料理もありましたが、そんな時、幹事はまた情報収集へと旅立ちます。
そんなことを繰り返して、料理についてのリストは日々洗練されていきました。

そして、いよいよ優先順位が最も高い料理からレシピを作っていくことになりました。
実現するのは、幹事が信頼するお店の料理人たちです。
幹事は料理の内容を料理人たちに、簡潔かつ的確に伝えます。
幹事は料理人ではないので、料理を作る方法などは、もちろん気にしません。
どんな料理がほしいかは伝えますが、どんな方法で実現するかについては、口を出しませんでした。
料理人たちを信頼しているからに他なりません。


しかし、ときに幹事の説明がいまいちだと、料理人たちは料理を作れないと言いました。
幹事は、料理人たちは理解力が無い、と嘆きました。
料理人たちは、幹事の説明がイケてない、と嘆きました。
そんな時はお店の店長が、うまいことまとめてくれました。
幹事と料理人たちをつないでくれる頼もしい存在、それが店長でした。
店長がいるおかげで、幹事は情報収集と予算について頭を悩ませることができますし、料理人たちは安心して料理に磨きをかけることができました。
店長の言うことなら聞いてみようかな、不思議とそんな風に思えました。
店長は、さながらスポーツのチーム監督のようでした。

料理人たちは優先順位の高い順から料理のレシピを、1週間に数品づつ完成させていきました。
最初の頃は幹事としては受け入れられない結果もありましたが、1週間ごとに料理人たちは腕を上げていきました。
料理人たちはしだいに1週間で完成させることができるレシピを、料理人たち自身で正確に見積もることができるようになっていました。

忘年会当日、料理人たちはこの日のために用意してきたレシピを忠実に守り料理を作りました。
ほとんどの料理が好評でしたが、ある料理には参加者たちから千差万別の反応がありました。
料理人たちはなぜかと考え、来る新年会に向けて改善したレシピの作成に取りかかりました。
幹事もまた新年会に向けた情報収集を行うべく、席を離れ参加者たちの間を走り回ることにしました。

# プロダクトオーナーにとって大事なこと
この幹事がやっていること、実はプロダクトオーナーの仕事と同じ気がするのです。
プロダクトオーナーとしてやらなければならない事はたくさんありますが、幹事が店長と料理人たちを信じて情報収集と予算について頭を悩ませていたように、プロダクトオーナーはスクラムマスターとチームを信じ、情報収集に全力を尽し、コストをコントロールすることに注意を払わなければなりません。
プロダクトオーナーにとって大事なことは、実はそのあたりではないかと考えています。
スクラムマスターとチームを信じること、情報収集、コストコントロール。
プロダクトオーナーとしてどのように振る舞うべきか迷った時、私は忘年会の幹事を見習い、そこに立ち返り考えるようにしています。

# まとめ
プロダクトオーナーと忘年会の幹事はいろいろ重なるところがある。

# 書籍など
最後に、最近ずっと読み返しているスクラムについての書籍があるので紹介したいと思います。（とはいえ、とてつもなく有名なのものです。でも知らない方もいると思うので。）

Roman Pichler氏の「 [スクラムを活用したアジャイルなプロダクト管理](http://amzn.asia/jekyE7L) 」です。

スクラムについては、素晴らしいと感じるものから明らかにエンターテイメントと感じるものまで、数多くの書籍があります。
どの書籍が良いかは人それぞれですが、この書籍は私の知っている誰もが絶賛しています。
まさにクラシックな一冊です。
何度も手にとって読みたくなりますし、なんといっても **プロダクトオーナーとしてどのように動くべきか** を明確に教えてくれる内容です。
また、この本の翻訳をされた江端 一将さんの認定スクラムマスター研修では、プロダクトオーナーの「姿勢」を叩き込まれるのでこちらも非常にオススメです。
Rails5のAPI modeをサクッと構築してみる


以下、API mode をサクッと初期構築するための手順メモです。

---

作りたいアプリのフォルダを用意する。

```bash
$ mkdir sample_api_app
$ cd sample_api_app
```

Rails5 ではバージョン2.2.2以上の Ruby が必要なので、rbenv などでバージョンを変更する。
（今回 rbenv のインストール方法については記載しません）

```bash
$ rbenv install -v 2.3.3
$ rbenv local 2.3.3
$ ruby -v # バージョンを確認
```

Gemfile を生成する。

```bash
$ gem install bundler
$ bundle init
```

Gemfile にある Rails の記載をコメントアウトし、バージョンを 5 にする。

```bash
$ vi Gemfile
```

↓↓↓

```vi:Gemfile
# A sample Gemfile
source "https://rubygems.org"

# Comment out and set version
gem "rails", "~> 5.0"
```

Rails をインストールし、API mode で初期構築する。
（rails new 時に `--api` をつけるだけです）

```bash
$ bundle install --path vendor/bundle
$ bundle exec rails new . --skip-bundle --api    # すべてYでよい
$ bundle update
```

User の CRUD を作成する。

```bash
$ bundle exec rails g scaffold User name:string age:integer
$ bundle exec rake db:create
$ bundle exec rake db:migrate
```

Rails サーバーを起動する。起動はやい。

```bash
$ bundle exec rails s
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
# frozen_string_literal: true
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.6.2 (ruby 2.3.3-p222), codename: Sleepy Sunday Serenity
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

curl で疎通テストをしてみる。

```bash
$ curl http://localhost:3000/users
[]%
$ curl http://localhost:3000/users -X POST -d 'user[name]=shibukk&user[age]=76'
$ curl http://localhost:3000/users
{"id":1,"name":"shibukk","age":76,"created_at":"2016-12-13T01:55:15.528Z","updated_at":"2016-12-13T01:55:15.528Z"}%
```

いけました :+1:
Laravel5でCacheをフレームワークの外から使う方法

# 外からつかうなんてないよね？
* いやテストで・・・
* いや実はバッチで・・・
* いやフレームワークとは離したモジュールにしたくて・・・

いろんな理由でフレームワークの一部機能を外から使いたいなんて無謀なことに挑んでいる方は一定数いらっしゃると思われます。そんな人のお役に立てればと思い書きました。

ちなみに、ORMであるEloquentは拙筆の[Laravel5でEloquentをフレームワークの外から使う方法](http://qiita.com/taichi_akippa/items/0b170747753f5ebbe3f1)をご覧ください。

ここではRedisをキャッシュとして使う方法を書いていますが、他のfileやopcacheなども同じ方法で可能と思われます。

# 結論

```php:
    $app = new \Illuminate\Container\Container();
    $app->singleton('redis', function () {
        return new \Illuminate\Redis\Database([
            'client' => 'predis',
            'default' => [[
                'host' => 'localhost',
                'port' => 6379,
                'database' => 0,
            ]],
        ]);
    });
    $app->singleton('config', function () {
        return [
            'cache.default' => 'redis',
            'cache.prefix' => '',
            'cache.stores.redis' => [
                'driver'     => 'redis',
                'connection' => 'default',
            ],
        ];
    });

    $manager = new \Illuminate\Cache\CacheManager($app);
　　　　　　　　$cache = $manager->driver();

    echo $cache->get('hogehoge');
```
vagrant 1.9.1 centos7box on virtualbox でprivate networkが認識されない

## 結論

```bash
service network restart
```

すればOK

## 動作環境

MacOS 10.10.5
Virtual Box 5.0.30
Vagrant 1.9.1
centos/7 1610.01

Vagrantfileの該当の設定

```ruby
config.vm.network "private_network", ip: "192.168.33.12"
```

## 関連していそうなIssues/PullRequest
[Vagrant 1.9.1 private networking configures unreachable VirtualBox VM](https://github.com/mitchellh/vagrant/issues/8115)
[Fix `service network restart` on RHEL-7 / Fedora]
(https://github.com/mitchellh/vagrant/pull/8052)
ROS入門 【インストール編】

ROSは聞いたことあるけど、どこから手をつければわからない、という人のために書きます。

# ROSとは何か
[この文献](https://kazuyamashi.github.io/ros_lecture/ros_overview.html)がとてもわかりやすいので、こちらを参照してください
# 環境
Ubuntu 16.04 LTS
2GBほどの空き容量

# インストール手順
[公式のドキュメンテーション](http://wiki.ros.org/kinetic/Installation/Ubuntu)もわかりやすいですが、「インストールさえできればいい！」という人向けにコマンドを集めました

## UbuntuがROSのaptリポジトリを受け入れるようにする

まず設定を開きます
![first_step.png](https://qiita-image-store.s3.amazonaws.com/0/113446/a785ab05-e649-036c-9a5b-2ca25fc969b3.png)

次にこのような画面が出てくるので、ソフトウェアとアップデートの設定を開きます
![second_step.png](https://qiita-image-store.s3.amazonaws.com/0/113446/a312db0a-7f14-0251-ab99-4f1d881d7a3e.png)

そして下の画面において、赤い四角で囲った部分にチェックが入っていることを確認します。もしチェックが入っていなかったら、チェックをして,Closeをクリックしてください![third_step.png](https://qiita-image-store.s3.amazonaws.com/0/113446/dd6f8bc6-0452-0e63-0dd3-cb0959a81680.png)


## ROSのaptリポジトリをセットアップする
これ以降ターミナルを開いて、以下を実行します。

```bash:terminal
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
$ sudo apt-get update
```
## ROSをインストールする
```bash:terminal
$ sudo apt-get install ros-kinetic-desktop-full
```
## インストール後のおまじない
```bash:terminal
$ sudo rosdep init
$ rosdep update
```
## パスの設定の自動化
```bash:terminal
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
```
これでROSのパスがターミナルを起動するときに、自動的に読み込まれます。
終わったらターミナルを閉じましょう。

## 動作確認
再びterminalを開き、以下を実行します。

```bash:terminal
$ roscore
```
以下のようになりましたら成功です。

```bash:terminal
... logging to /home/[user_name]/.ros/log/[some number]/roslaunch-[your_pc_name].log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://[pc_name]:[port]/
ros_comm version 1.12.6


SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.6

NODES

auto-starting new master
process[master]: started with pid [13855]
ROS_MASTER_URI=http://[host_name]:11311/

setting /run_id to [some_number]
process[rosout-1]: started with pid [13868]
started core service [/rosout]
```
# 参考文献
[(公式)ROS Kinetic インストール方法](http://wiki.ros.org/kinetic/Installation/Ubuntu)
ACFの投稿オブジェクト(post object)を複数選択にしたときの抽出

## いきさつ
ある商品を投稿した際に、その商品を使った例を別のカスタム投稿で作った時
**その商品が使われているカスタム投稿一覧を表示**させたかった

## 投稿オブジェクト選択が１つのみのとき
ACFのガイドどおりにすすめていきます

``` php:single-post-object
<?php 
$args = array(
'post_type' => 'cpt_courses',
'posts_per_page' => -1,
'meta_key' => 'course_tutors',
'meta_value' => '86'
);

// query
$wp_query = new WP_Query( $args );
// loop
while( $wp_query->have_posts() )
{
$wp_query->the_post();
the_title();
// ...
}?>
```

## 投稿オブジェクトが複数選択可能な時
どうやら**メタデータの参照元が配列になっているせいで、上記の方法だと抽出できない**ようだ
下記のように**`'compare' => 'LIKE'`を使う**と抽出できるようになりました

``` php:multi-post-object
$args = array(
'post_type' => 'cpt_courses',
'posts_per_page' => -1,
'meta_query' => array(
  array(
    'key' => 'course_tutors',
    'value' => '86',
    'compare' => 'LIKE'
  ))
);

```

またsingleページのとき、その投稿が選んだカスタム投稿を抽出する場合

``` php:multi-post-object-selected
$args = array(
'post_type' => 'cpt_courses',
'posts_per_page' => -1,
'meta_query' => array(
  array(
    'key' => 'course_tutors',
    'value' => '"' . get_the_ID() . '"',
    'compare' => 'LIKE'
  ))
);

```
とすれば抽出されます。

## まとめ
wp_queryのmeta_queryでフィルターする際に、値が配列だったときは`'compare' => 'LIKE'`で解決できるかもしれません
思ったように絞れないときに試してみてはいかがでしょうか

参照元：https://www.advancedcustomfields.com/resources/querying-relationship-fields/
Drupal のコンソールコマンド Drush を簡単にインストールする

## Drush

Drupal には Drush というコンソールコマンドが存在します。 WordPress でいうところの wp-cli に相当します。

### インストール
色々なインストール方法が解説されていますが、 CentOS では以下の2行でインストール可能です。 Drush 8.1.7 がインストールされます。

```bash
yum install epel-release
yum install drush
```

epel-testing リポジトリを有効にすると Drush 8.1.8 がインストールされます。

```bash
yum install drush --enablerepo=epel-testing
```

## Drupal Console

Drupal は 8 から Symfony を採用しているためか、 Symfony Console を利用した Drupal Console という Drush と似たものが登場したようです。

### インストール
#### Composer
```bash
composer global require drupal/console:@stable
```
#### インストーラー
```bash
curl -Lo drupal https://drupalconsole.com/installer
chmod +x drupal && mv drupal /usr/local/bin/
```
Pythonを使う上で欠かせないパッケージ管理システムpipの使い方

<a href="https://kikagaku.net/blog/"><img src="https://kikagaku.net/blog/wp-content/uploads/2016/12/kikagaku_online_ogp.png"></a>

こちらは『[**キカガク Online**](https://kikagaku.net/blog/)』の記事を、Qiita向けに編集してお届けしています。

———————————

Pythonを使っていく上で欠かせない、pipというパッケージ管理システムについて説明します。

# そもそもパッケージ管理システムとは？
効率的にプログラミングを行うためのライブラリやパッケージを、簡単に取り扱えるように管理してくれるシステムです。

ライブラリの重要性については前の記事で取り上げました。

[機械学習をこれから学ぶ人がPythonを使うべき3つの理由](https://kikagaku.net/blog/programming/why-use-python)

メジャーなプログラミング言語には、それぞれ有名なパッケージ管理システムがあります。
Pythonの場合、それが**pip**というわけです。

# パッケージ管理システムを使わないと...？

パッケージのインストールが非常に手間になります。

なぜなら、パッケージ同士が依存している場合があるからです。

例えばパッケージAをインストールしようと思ったが、パッケージAは内部でパッケージBを使用しており、先にパッケージBを入れる必要がある、というようなコトが起きます。

これがもっとたくさんのパッケージが関わる場合、インストールが大変になるだろうというのは想像に難くないですね。

# pipの使い方
パッケージ管理システムの重要性が分かったところで、それではpipの主な使い方を見ていきましょう。
Pythonのインストールは以下の記事に大変よく書かれているのでぜひ参考してください。

1. [Pythonインストール（Mac編）](http://qiita.com/ms-rock/items/6e4498a5963f3d9c4a67) → Macユーザ
2. [Pythonインストールと環境設定](http://www.pythonweb.jp/install/) → Windowsユーザ

Pythonは最新版を入れるようにしましょう（現時点ではバージョン3.5.2が最新）。
そうするとpipもインストールされているはずなので、コンソール（Windowsならコマンドプロンプト）でpipと打つと以下のようになるはずです。

```bash
$ pip -V
pip 8.1.2 from ~
```

## パッケージのインストール
パッケージのインストールは以下のコマンドになります。

```bash
$ pip install パッケージ
```

## パッケージのアップデート
以下のコマンドで、インストール済みのパッケージをアップデートできます。

```bash
$ pip install -U パッケージ
```

## パッケージのアンインストール
パッケージをアンインストールする場合は以下のコマンドになります。

```bash
$ pip uninstall パッケージ
```

## パッケージの検索
以下のコマンドでインストールできるパッケージを検索することができます。

```bash
$ pip search 検索ワード
```

## インストール済みのパッケージの一覧表示
インストール済みのパッケージを一覧で確認できます。

```bash
$ pip list
```

## インストール済みのパッケージの詳細を確認
インストール済みのパッケージについて、詳しい情報を知りたい場合は以下のコマンドになります。

```bash
$ pip show パッケージ
```

## pip自身のアップデート
pip自身のアップデートは以下のようにします。

```bash
pip install --upgrade pip
```

## ヘルプの表示
pipの使い方を知りたい場合は、次のコマンドです。

```bash
pip -h
```

使い方に慣れるまでは頻繁にヘルプを確認するとよいでしょう。

## おわりに

pipは他にもたくさんのオプションがありますが、とりあえずこれだけ抑えておけば最低限使えると思います。
機械学習を学ぶ上でも欠かせないツールですので、しっかり覚えていきましょう！

# キカガク Online
[**キカガク Online**](https://kikagaku.net/blog/) では、機械学習入門向けの記事を配信します。
機械学習や人工知能、ディープラーニングを学びたい方向けの基礎講座の記事から、機械学習を使ったビジネス導入例まで幅広く取り扱います。

<a href="https://kikagaku.net/blog/"><img src="https://kikagaku.net/blog/wp-content/uploads/2016/12/kikagaku_online_ogp.png"></a>
bitrise + deploygateでtitaniumアプリ評価環境を作る

こんにちは。 @imoans です。 この記事は[Titanium Advent Calendar 2016](http://qiita.com/advent-calendar/2016/titanium) 13日目の記事です。

私は、今年4月に新卒入社した会社でTitaniumアプリを書いております。
入社して1年弱が経ち、アプリを書くのにも慣れてきたため、
だんだんとアプリ開発時の定常作業を自動化することに興味を持ち始めました。

当時、一番自動化したかったのがアプリリリース前のipaファイルのビルドと配布だったので、
bitriseでipaファイルをビルド -> deploygateにアップロード
という環境を作ってみました。

その時の話を書きたいと思います。


## bitriseとは?
[bitrise.io](https://www.bitrise.io/)
スマートフォンアプリ向けのCIサービスです。
アプリビルド時に必要なProvisioning Profileやkeystoreの設定がGUIで簡単にでき、
200ビルド/月などの制限があるものの、無料枠でも十分使うことができるので、
とても便利なサービスです。


## bitrise登録〜アプリ設定

まず、bitriseに登録して、githubまたはBitbucketのレポジトリを登録します。
その後、Provisioning Profileや証明書を登録して、アプリがビルドできる環境を作ります。

こちらの記事がとても参考になります。
http://qiita.com/janus_wel/items/83996325920f62a684eb


## workflow設定

アプリビルドの環境が整ったら、workflowを設定していきます。
workflowとは、アプリビルドに必要な作業を一つづつ登録できるものです。
(bitriseではこの一つ一つの作業をstepと呼んでいます)

ネイティブアプリ向けには、Xcode Archive for iOSやgradle runnerなどビルド用のstepが用意されています。

Titaniumは対応していないため、専用のstepはありませんが、
scriptを追加できるので、ここにビルドコマンドを書いて追加していけば、
アプリをビルドすることができます。

今回のアプリの場合は、

```sh
npm install
```

```sh
npm install -g appcelerator
```

```sh
npm install -g titanium
```

```sh
appc login --username <username> --password <password>
```

```sh
appc ti sdk install
```

```sh
appc ti build -p ios -T dist-adhoc -D <certificate name> -P <provigioning profile uuid>
````

これらのscriptを追加しました。


## ビルドしたアプリをdeploygateにアップロードする
[deploygate API](https://docs.deploygate.com/reference#upload)をそのままworkflowに追加しました。

## `dist-adhoc` ビルドでdevelopment用の設定を適用させたい

Titaniumでは`config.json`に環境ごとの設定を書くことができます。
私の担当しているアプリでも[公式ドキュメントの例](http://docs.appcelerator.com/platform/latest/#!/api/Alloy-property-CFG)にある通り、test, development, productionの3つの環境の設定が書かれていました。

今回bitriseでビルドするアプリではdevelopment用設定を適用させようと思っていましたが、
このままだと、`build-target`が`dist-adhoc`なのでproduction用設定が選択されしまいます。

`build-target`が`dist-adhoc`のときだけdevelopment用設定を適用する方法がないかと調べていたら、
Alloy1.4から`dist-adhoc`と`dist-appstore`ビルドを区別することが可能になっていました。。！ ([公式ドキュメント](http://docs.appcelerator.com/platform/latest/#!/guide/Alloy_Controllers-section-34636384_AlloyControllers-ConditionalCode))

ということで`config.json`に以下のように設定を追加しました。

```json:config.json
{
    "dist:adhoc": {
        "dist": "adhoc",
        "SERVER_URL": "SERVER_URL_FOR_DEVELOPMENT"
    }
}
```
そうすると無事、
`dist-adhoc`ビルドのときにdevelopment環境を適用することができました。

---



というわけで、以上のような手順でbitrise + deploygateによるリリース前のipaファイルの準備を自動化する事ができました！

これによりTitaniumでのアプリ開発を加速させることができました！
追い込み駆動開発

新人Advent Calendar 2016の13日目の記事を担当します
>IT業界に入ったばかりの新人エンジニアが実際に行っている業務効率化の方法についての記述をお願いします

とのことなので、「業務効率化のために実践した5つの方法」を書きます

# そもそも(業務効率化とは)
 - 与えられた、もしくは目の前に転がっているタスクの消化速度を上げる
 - 余計な業務の負荷を減らす（≒人的コストの削減）ためにタスク管理を徹底し仕事内容に関してマネージャと交渉する

ナドナド手段がありますが、本稿では前者(設計・実装力を上げる)のことだと思って進めます

# 技術的バックボーン
 - IDEによる開発が独学含め未経験。
 - 就活時の技術アピールがテキストエディタで書いたphpのスクリプトだった（コンパイラ言語を知らない）程度
 - レンタルサーバーでWordpressとかDrupalでサイト構築してアフィリエイトを趣味でやってた

以下に書く実践内容も学生の頃からIDEでバリバリ書いてる人からしたら何を今更…と思うかもしれません

# 追い込み駆動開発
 - 無事に就職が決まり、大学の夏休みに勉強がてらとEclipseをインストールしようとした→TomcatでHello,World!するまでに1週間掛かった
 - 当時のツテで小さな会社の経理システムの魔改造(localで動くphpに無理やりLaravelを組み込んで機能追加)などやって無事に完成せず（精神的に）死んだ

入社前のそんな事からあっていち早く追いつく為には単純に仕様への理解を深め、手戻り・脇道せずに素早く開発するしかないと思って約1年間取り組みました

## 5つの実践
 - 気になるOSSをウォッチする
  - アプリケーション、フレームワーク、ライブラリ問わず
  - よくわからない技術から逃げない（わからないまま適当にこなしてあとで後悔しない）ようにする
  - 社内のコーディングとは違う作法でも有名なコントリビューターのコードは参考にする
 
 - 本を買う
  - ネット上に転がってる個人レベルのドキュメントは結構適当な事が多いと気づいたため
  - 一行一行が丁寧に書かれた本は役立つ
  - あえて枯れきってないジャンルの本を買って腐る前に読もうとしてみる

 - 英語と数学を勉強する
  - Map-reduceだとかTensorFlowだとか深層学習だとかに関するドキュメント（書籍・論文）を読むとカジュアルに線形代数が出てくるので大学数学は地道にやり直した
  - 技術に対する関心の障壁は実装レベルで使うかにかかわらず対処しておくのが良いと思った
  - 英語は必修科目。日本語依存からの早期脱却を

 - アンチパターンを知る
  - 新しめのライブラリ(Exoplayerみたいな更新が早くてドキュメントがすぐ腐るタイプの)はSlideShareとかStackOverflowでシェアされてる事が多いので実装前にまず調べる
  - ミッションクリティカルじゃなくても目に入ったら知識として入れておく
  - ハマりポイントをウンウン言いながら徹夜して消化するのは楽しかったけど業務に対してするべきではない

 - テンション（緊張感）を上げる
  - 上のすべてを試験勉強のような緊張感で取り組む
  - 効率化のための努力の効率化
  
# 結び
 - 各人のネットサーフィン効率化のために箇条書きで纏めました
 - 全て一年間続けたわけではなく、内省や人からの説教によって徐々にハードになってゆきました
 - これらを意識することで趣味だったプログラミングを仕事レベルまで引き上げることが出来ました
 - ※効果には個人差があります
 - 追い込む時は心と体の健康と相談する
 - （業務効率化の）銀の弾丸は無い（ので色々やってみるのが良いと思います）（し、これからも色々試してスキルアップしたいと思います）
 
読んでいただきありがとうございました。来年も良いエンジニアライフを！
launchの起動を遅延させる"timed_roslaunch"が使いやすくなりました

# はじめに

以前投稿した[launchファイルを指定時間sleep後に起動する "timed_roslaunch"](http://qiita.com/MoriKen/items/a1f29f5637732ac18a1c) が，[forno](https://github.com/forno)さんのPull-Requestによって改良されたので，ご報告します．

改めて，[forno](https://github.com/forno)さんに感謝申し上げます．

(また，これを書いている日よりも前の日程でAdventCalenderに空きがあったので，埋めさせて頂きました．)

# そもそも `timed_roslaunch` とは？

任意の`launch`ファイルの起動時間を，指定秒だけ遅らせる機能を持つノードです．雛形は[ROS Answers - Can I run a bash script using roslaunch?](http://answers.ros.org/question/51474/can-i-run-a-bash-script-using-roslaunch/)です．

例えば，下記のような用途に利用可能です．

- 実機で，特定のノードだけはドライバの初期化完了後に実行したい
- GAZEBOで，特定のノードは仮想空間構築およびプラグイン読み込みの完了後に実行したい

このように実行しないとエラーを吐いてしまうノードに遭遇することが稀にありますので，その対策に使えるという位置づけです．

地味ですが，意外と需要はあるかも（？）しれません．

# どう使うの？

## リポジトリ

下記リポジトリをクローンし，`catkin_make`します．

- [MoriKen254/timed_roslaunch](https://github.com/MoriKen254/timed_roslaunch)

## コマンドからの利用
### 従来仕様
```bash
rosrun timed_roslaunch timed_roslaunch.sh [number of seconds to delay] [rospkg] [roslaunch file] [arguments (optional)]
```

- ノードを直接実行する．
- `timed_roslaunch.sh`の引数は1つ．
- 必要なパラメータをまとめてこの1つの引数の中に記述している．

### 追加仕様
```
roslaunch timed_roslaunch timed_roslaunch.launch time:=[number of second to delay] pkg:=[rospkg] file:=[roslaunch file] value:=[arguments (optional)]
```

- 起動用のlaunchファイルから実行する．
- 遅延時間，pkg名，ファイル名，遅延対象launchファイル用の引数，ノード名，をそれぞれ個別の引数として渡す．

## `launch`ファイルからの呼び出し

### 従来仕様

```xml
<launch>
  <node pkg="timed_roslaunch" type="timed_roslaunch.sh"
    args="2 turtlebot_navigation amcl_demo.launch initial_pose_x:=17.0 initial_pose_y:=17.0"
    name="timed_roslaunch" output="screen" />
</launch>
```
- 引数が少ないので行数は短くて済むが，引数の解釈がしにくい．

### 追加仕様

```xml
<launch>
  <include file="$(find timed_roslaunch)/launch/timed_roslaunch.launch">
    <arg name="time" value="2" />
    <arg name="pkg" value="turtlebot_navigation" />
    <arg name="file" value="amcl_demo.launch" />
    <arg name="value" value="initial_pose_x:=17.0 initial_pose_y:=17.0" />
    <arg name="node_name" value="timed_roslaunch" /> <!-- This is optional argment -->
  </include>
</launch>
```

- 視認性が高く，引数の管理がし易い．

# おわりに
任意の`launch`ファイルの起動を遅らせる方法について述べました．ただし，1つ忘れてはならないことがあります．

本質的な問題を解決するには「起動を遅らせなければエラーを吐いてしまうノード側を修正する必要がある」という点です．

言っている私本人が使い込んでしまっているのですが，一応頭の隅には入れておくべきと思います ^^;
arduino model 比較

|model|Arduino Uno|Arduino Leonardo|Arduino Nano|Arduino MEGA 2560|
|:-----------------|:------------------|:------------------|:---------------|:-------------|
|外観|![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Arduino_Uno_004.jpg/250px-Arduino_Uno_004.jpg) | ![MVC-008S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/79ba229c-959b-65b7-60d1-77600884ff6f.jpeg)|![ArduinoNanoFront_3_sm.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/edc16719-e93d-fcb4-ae66-1e4241fd7726.jpeg)|![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Arduino_Mega2560.jpg/250px-Arduino_Mega2560.jpg)|
|AVR|ATmega328|ATmega32u4|ATmega328|ATmega2560|
|タイマー|0,1,2|0,1,2|0,1,2|0,1,2,3,4,5|
|動作電圧|5.0V|5.0V|5.0V|5.0V|
|インプット電圧（推奨）|7-12V|7-12V|7-12V|7-12V|
|インプット電圧（リミット）|6-20V|6-20V|6-20V|6-20V|
|デジタルI/Oピン|14本（内6本はPWM出力）|20本（内7本はPWM出力）|14本（内6本はPWM出力）|54本（内15本はPWM出力）|
|PWMピン番号|3, 5, 6, 9, 10, 11|3, 5, 6, 9, 10, 11, 13|3, 5, 6, 9, 10, 11|2〜13、44〜46|
|LED|13|13|13|13|
|アナログインプットピン|6本|12本|8本|16本|
|アナログアウトプットピン|-|-|-|-|
|フラッシュメモリ|32KB（内0.5KBはbootloader用）|32KB（内4KBはbootloader用）|32KB（内4KBはbootloader用）|256 KB（内8KBはbootloader用）|
|SRAM|2 KB|2.5 KB|2 KB|8 KB|
|EEPROM|1 KB|1 KB|1 KB|4 KB|
|クロックスピード|16 MHz|16 MHz|16 MHz|16 MHz|
|電源|USB or 外部電源（2.1mmプラグ）|micro USB or 外部電源（2.1mmプラグ）|Mini-B USB or 外部電源|USB or 外部電源（2.1mmプラグ）|
|発売日|2010年9月|2012年6月||2010年9月|
VMware > Windows 8.1 > ディスクアクセス100%の対処

```txt:動作確認
VMware(R) Workstation 12 Pro on Windows 10 Pro
Windwos 8.1 pro(64bit) on VMware
```

### 症状

1つのゲストOS(Windows 8.1 pro)においてディスクアクセス100%の問題が発生。起動後15分してもディスクアクセス100%の状態が続いていた。
それによってか同じパーティションに置いている他のゲストOSの処理も重くなっているようであった。

該当のゲストOSについては以下の対処によりDisk I/Oは減らしている状況。

http://freesoft.tvbok.com/freesoft/virtual/vmware_tuning.html
の「高速化させる方法」

### 対処

該当のゲストOSにてセーフモードにして起動。

セーフモードを解除して再起動してから症状は見られなくなった。
( 時々ディスクアクセス100%が続くときがあるが、1分くらいで0%まで落ちるので状況は改善したように思われる。)

### 追記 (2016/12/19)

再発した。
セーフモードにしてから症状が消えた。

再発する前にしたことはWindows Updateの適用。

### 追記 (2016/12/26)

再発した。
別ゲストOSでIDEを触っていて、「処理が重いな」と感じた時には、この状態になっている。

やはりセーフモードにしてから症状が消えた。

根本解決をしたいが、今は分からない。
超軽量os、xosをvirtualboxに入れてみる

久々に書きます。

たまたま見かけた、xosというのをvirtualboxに入れてみたので、紹介がてらに。

# XOS

以下にOSSとして公開されています。

https://github.com/omarrx024/xos

すごく小さく軽量、ということのようです。
どこかレトロ感漂うUI

# 入れてみる

virtualboxにはさくっと入れられましたので、以下手順です。

## リポジトリをclone

前述のリポジトリをcloneしてきます。

```bash
$ git clone https://github.com/omarrx024/xos.git
```

masterは夜間バッチでビルドされているようなので、必ずしも安定してはいないようです。
なので、必要に応じてタグに変更してください。

## virtualboxに入れる

あとは、内包されているdisk.hddをvirtualboxに入れるだけです。

適当に名前つけて、以下のように選択します。

<img width="804" alt="スクリーンショット 2016-12-13 9.15.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/105934/bf02359a-8873-6b11-3d68-9a6152711499.png">

残りは任意で大丈夫です。

できあがったら、ストレージの初期のhddを消して、disk.hddをプライマリマスタにします。
こんな感じ。

<img width="764" alt="スクリーンショット 2016-12-13 9.16.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/105934/b93ae1bf-2635-da6e-e5fb-fc66c2fcd1a1.png">

あとは起動すればよいようです。

## 起動

起動した感じはこんな感じですね。

<img width="799" alt="スクリーンショット 2016-12-13 9.17.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/105934/1cbceef8-a767-d8d8-0f7c-864820fbac45.png">


デフォルトでペイントツールとHalloWorldが表示されていて、絵が描ける程度。

起動はめちゃくちゃ早かったです。
今後どんな感じで成長するのか楽しみ。