OmniAICreator/Qiita-1.07M huggingface dataset:
MacでのLinux LiveUSBの作り方（と再フォーマット方法）

# Linux LiveUSBの作り方

1.ディストリ配布先からISOイメージをDLしてくる

2.下記コマンドでisoからdmgイメージに変換    

```
$ hdiutil convert -format UDRW -o converted-dst-image source-dst-image.iso
　-oオプションの後が出力ファイル名。拡張子は指定不要で.dmgが自動的に付与される。
```

3.USBメモリをMacのディスクユーティリティでフォーマット

4.下記コマンドでアンマウント後に書き込み    

```
$ diskutil list ← マウントポイント調べる（例:/dev/disk3）    
$ disluitl unmountDisk /dev/disk3　←　アンマウント    
$ sudo dd if=converted-dst-image.dmg of=/dev/disk3 bs=1m 
```
 
# 使用済みLinux LiveUSBのフォーマット方法（by Mac)

LiveUSBとして焼いたLiveUSBはMacのディスクユーティリティではフォーマットできない
（「名前が無効です」という意味不明なエラーが出る）
下記の手順でフォーマットする

1.USBメモリを挿す

2.ターミナルを開く

3.下記コマンドで削除する

```
$ diskutil list ← マウントポイント調べる（例:/dev/disk3）    
$ diskutil unMountDisk /dev/disk3　←　アンマウント    
$ diskutil eraseDisk HFS+ Untitled /dev/disk3
```

あとはディスクユーティリティで認識されるので適当に。
ネットワーク機器の初期設定

#ネットワーク機器の初期設定
検証とやるときに毎回最低限入れたいな～と思うコマンドをコピペで入れられるように整理。もっと良い内容のものがググると説明付きでいっぱいありますが、自分が欲しいのをコピペで入れたいので。

##仕様
- cisco機器について
  - Cisco特有の機能は基本的に全てdisable。
  - IOSは15系
- Juniper SRX用も書きたい。

##Cisco製ネットワーク機器の初期設定
時刻、ホスト名、MntNWのIPは手動であわせる。Interfaceの設定も機器に合わせる。
###L2
```cisco:L2(IOS15系)
#conf t
clock timezone JST 9
do clock set HH:mm:ss DD MMM YYYY
service sequence-numbers
service timestamps debug datetime msec localtime show-timezone year
service timestamps log datetime msec localtime show-timezone year

hostname c2960-XX
＃service password-encryption
enable password hoge

vtp mode off
no spanning-tree vlan 1-4094
no ip domain-lookup
no ip source-route
no ip http server
no ip http secure-server
no cdp run
no vstack
no service pad
no service password-encryption
no service dhcp
no service config
service tcp-keepalives-in
service tcp-keepalives-out
!
int range f0/1 - 24 , g0/1 - 2
#int range f0/1 - 48 , g0/1 - 2
#int range f1/0/1 - 48 , g1/0/1 - 2
 shutdown
 load-interval 30
exit
!
int vlan 1
 shutdown
exit
!
int vlan 10
 desc management
 ip address 192.168.255.2XX 255.255.255.0
 no shutdown
exit
!
line con 0
 password hoge
 logging synchronous
 login
 exec prompt timestamp
exit
!
line vty 0 15
 password hoge
 logging synchronous
 login
 exec prompt timestamp
exit
!
end
```

また思いついたら随時追加。
つくば市のごみ収集カレンダーをJSON化するツールを作った #正月ハッカソン

[NKMR6194/tsukuba-gc - GitHub](https://github.com/NKMR6194/tsukuba-gc)
[tsukuba-gc | RubyGems.org](https://rubygems.org/gems/tsukuba-gc)

[正月ハッカソン2017 #正月ハッカソン](https://atnd.org/events/84508) の成果物である tsukuba-gc v0.1.0 をリリースしたので紹介したいと思う。

これは、つくば市がPDFで配布しているごみ収集カレンダーを、JSONで出力するためのツールだ。


# 経緯
一人暮らしをしていて、ゴミ出しを忘れることが結構あった。とくに、燃えないゴミとか、回収の頻度が低くてなかなか出さないやつ。そこで、収集日をリマインドしてくれるツールを作りたかった。しかし、つくば市ではPDFしか配布していなかったので、まず扱いやすいデータに変換したかった。

# 使い方

rubygemsとして実装したので、gemを使って導入する

```
$ gem install tsukuba-gc
```

### CLI
ダウンロードしてきたPDFと年度を指定してCLIを実行する

```
$ tsukuba-gc 28north.pdf 2016
```

`-o` 指定すると出力先を指定できる

```
$ tsukuba-gc 28north.pdf 2016 -o calendar.json
```

### ライブラリ

ライブラリとしても実装しているので、Rubyで`require`すれば呼び出せる。

```ruby
require 'tsukuba-gc'

Tsukuba::GC.parse(2016, "28north.pdf") #=> [schedule, ...]
```


# 仕組み

まず、PDFをPDFをして解析するのはハードルが高いので、rmagicで画像として扱っている。

肝心の判定は、収集する品目ごとに背景の色が決まっていることを利用している。各日付のセルから背景色を取ってきて、事前にサンプリングしておいた色と、背景色を比較して、距離が近いものを収集物として出力する。

日付に対応したピクセルの座標を決める必要があるが、日付のセルは規則的に並んでいるのを利用して、職人の絶妙な調整を元に座標を計算している。

お分かりの通り、やっていることは非常に簡単で、文字の読み取りなどは行なっていない。文字列取得等をすれば高度に柔軟にデータ化することができるかも知れないが、実装するコストと精度を考えるとこれで十分だと思った。

### CLI

CLIには [optparse](https://docs.ruby-lang.org/ja/latest/library/optparse.html) を利用した。Rubyに標準添付されているライブラリで、コマンドライン引数を渡すといい感じにやってくれる。

`--help` `--version`といったCLIにありがちなところをカバーしてくれるので、非常に使いやすかった。

Ruby界隈でよく使われる [thor](https://github.com/erikhuda/thor) も試してみたが、今回のケースではあまりフィットしなかった。bundler のようにサブコマンドを活用するタイプのCLIとは非常に相性がいいが、 tsukuba-gc にはサブコマンドがないので、合わなかった。実際、bundler では thor が使われているようだ。

# 結び

正月ハッカソンと言いながら、大晦日から作業をしていたが、２日間で求めていたものを求めていたレベルで作ることができたので、非常によかった。

アイディアを一気に実装する機会を催してくれた正月ハッカソン主催の @e10dokup と、プロジェクト名のアイディアをくれた [@a_maumau_](https://twitter.com/a_maumau_) に感謝したい。

tsukuba-gc という名前は非常に気に入っているので、これからもメンテしていきたい。

# 蛇足

リマインドにはSlack １人チームの中でbotにやってもらおうと思っている。

botのプロジェクトはこちら
https://github.com/NKMR6194/nagato
iPhoneなど Bluetooth が 近接した時、離れた時に、何かする

# Overview

防犯ライトなどを Raspberry Pi などで動かしたいことがあると思います。
そのとき、繰り返し動作とかタイマーとかを、全てcronでやってもよいのですが、
よりflexibleに記述したくなることがあると思います。

また、上のような用途だと、自分がいるときには、動いてほしくないとかもあると思います。

このような用途を満たすためのscriptを書いてみました。

構成要素としては、

* Raspberry Pi 3 + Ubuntu Mate 16.04 LTS
* Ruby script
    * スケジュール機構 + 制御script機構
    * Bluetooth検出部

です。

https://github.com/hidenorly/bt_proximity_monitor
におきました。

# 使い方

```rules.cfg
[13:30-23:30 Mon Tue Wed Thu Fri Sat Sun]
#onStart
echo "blub On"
bleBulbDriver.rb allOn
#onEnd
bleBulbDriver.rb allOff
#onConnected
bleBulbDriver.rb allOff
#onDisconnected
bleBulbDriver.rb allOn

[2017-01-01 03:00-03:26]
#onStart
bleBulbDriver.rb allOn
#onEnd
bleBulbDriver.rb allOff
#onConnected
bleBulbDriver.rb allOff
#onDisconnected
bleBulbDriver.rb allOn
```

みたいにruleを書きます。

./bt_proximity_monitor.rb -t 70:EC:E4:XX:XX:XX　のように監視デバイスを指定するか、devices.cfgなどにmac addressを記述しておきます。

iPhoneなどに対してRFCOMMを貼るようにしているので、起動したらacceptしてください。(Settings-Bluetoothで、BT自体を有効化したり、BTの接続要求が来たらacceptをしてください)

補足: githubのREADME.mdには書いてありますが、```-d rfcomm```で一度rfcommでpairingした状態で、```-d l2ping```モードにしてください。最近のスマホはpairingしたことのあるデバイスからしかl2pingの応答を返さないようになっているため。

あとは、#onXXXのあとに書いている行を実行してくれます。

なお、rssiを取得するときには、sudo起動する必要があります (hcitoolなどを使うので)

上のruleの例では、 [前回](http://qiita.com/hidenorly/items/757ce2d949846e035bc2) 作った bleBulnDriver.rb を使いましたが、なんでも起動できるので、好きにしましょう。

では、happy hacking!
pythonの正規表現メモ

# はじめに
* Pythonにはperlやrubyのような正規表現リテラルはないらしい

* 正規表現を使用するときはreモジュールをインポートする

```python
import re
```

# Raw文字列
文字列リテラルの頭に rをつけると、その文字列ではエスケープシーケンスは無効となる。
（C#でいうところの@"~"みたいなやつ）

"C:¥¥My Document¥¥fire¥¥test.txt"

を

r"C:¥My Document¥fire¥test.txt"

と書ける。

rは大文字でもよい模様。

R"C:¥My Document¥fire¥test.txt"

# マッチ

```python
import re

m = re.match(r"FIRE[0-9]+", "FIRE123")

if m:
	print("matchした")
else:
	print("matchしてない")
```

matchメソッドの他にsearchメソッドもある。
matchメソッドは先頭マッチするかどうかを、searchメソッドは文字列の途中でマッチするかどかうかをみている

```python
m = re.match(r"FIRE[0-9]+", "Python FIRE123")     # matchしない
m = re.search(r"FIRE[0-9]+", "Python FIRE123")    # matchする
```

# マッチした文字列を取得する

```python
m = re.search(r"([a-z]+)\s*=\s*([0-9]+)", "index = 123")

if m:
	print(m.group(0))                # ->  "index = 123"
	print(m.group(1))                # ->  "index"
	print(m.group(2))                # ->  "123"
```

名前付きグループは　　(?P<名前> ... )

```python
m = re.search(r"(?P<name>[a-z]+)\s*=\s*(?P<value>[0-9]+)", "index = 123")

if m:
	print(m.group(0))                # ->  "index = 123"
	print(m.group(1))                # ->  "index"
	print(m.group(2))                # ->  "123"
	print(m.group('name'))           # ->  "index"
	print(m.group('value'))          # ->  "123"
```

#マッチした位置を取得

```python
m = re.match(r"abc([0-9]+).([0-9]+)", "abc123.456")

#--- マッチ全体
print(m.start())                # -> 0
print(m.end())                  # -> 10  ※endはマッチした次の位置（index + 1）の値が返ってくる
print(m.span())                 # -> (0, 10)  startとendをタプルで返す

#--- グループ1
print(m.start(1))               # -> 3
print(m.end(1))                 # -> 6
print(m.span(1))                # -> (3, 6)


#--- グループ2
print(m.start(2))               # -> 7
print(m.end(2))                 # -> 10
print(m.span(2))                # -> (7, 10)
```

# 正規表現をコンパイル

```python
reg = re.compile(r"ABC([0-9]+)")

m = reg.match("ABC888")
print(m.group(1))               # -> "888"
```

# 重複しないすべてのマッチを文字列リストで返す


```python
match_list = re.findall(r'([0-9]+)', "123a456b789")
print(match_list)               # -> ['123', '456', '789']
```
🍣emojiキーを設定しよう🍣リベンジ編

この投稿は :calendar: [ErgoDox Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ergodox) の 18日目の記事です。

----

[前回](http://qiita.com/miyaoka/items/969864e5219349f01be3)上手く行かなかったUnicode入力を改善して絵文字を使えるようにします。

# サロゲートペアを使う

前回紹介した[🍣絵文字キーの実現 - みずぴー日記](http://mzp.hatenablog.com/entry/2016/12/24/111814)で別解に挙げられていたサロゲートペアを使うやり方でmacOSでもいけるようになります。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ErgoDoxで🍣など絵文字を直接打てるキーを実装しました <a href="https://t.co/aNfWG7A4gd">pic.twitter.com/aNfWG7A4gd</a></p>&mdash; みやおか (@miyaoka) <a href="https://twitter.com/miyaoka/status/814007604284264448">2016年12月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 実装

```process_unicode.c
      code -= 0x10000;
      register_hex32(0xD800 | (code >> 10));
      register_hex32(0xDC00 | (code & 0x3FF));
```

こんな感じに分割して0xFFFF内で表現すればOKです。

[Add support for Unicode supplementary planes on OS X by jonasoberschweiber · Pull Request #981 · jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware/pull/981)

PR上げようかなと思ってたらちょうど上がってました。
なので、じきに取り込まれるでしょう。

ただ、register_hex32内の処理ではキーコード入力してupdateする処理をしてしまっているせいか、VSCodeなどエディタによっては分割されたキーコードが1字ずつ出てしまって絵文字にならない問題があります。

サロゲートペア用に複数入力をregisterする処理が必要っぽいのでそのへんはまた追って検証します。
yarn initでエラーが出た場合の対処方法

yarn initをおこなうと以下のようなエラーが出た。

```
$ yarn init
yarn init v0.18.1
error An unexpected error occurred: "Can't answer a question unless a user TTY".
info If you think this is a bug, please open a bug report with the information provided in "C:\\Users\\username\\...\\projectname\\yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/init for documentation about this command.
```

以下で解決した。

```
$ yarn add yarn
$ node ./node_modules/yarn/bin/yarn.js init
```

参考
> https://github.com/yarnpkg/yarn/issues/743
babel-polyfill使ってるのにTravisCIでregeneratorRuntime is not definedが発生したときの対処

## はじめに

最近開発を進めている [redux-tower](https://github.com/kuy/redux-tower) というRedux向けのルーティングライブラリでは [AVA](https://github.com/avajs/ava) をテストランナーとして使っているのですが、TravisCI をセットアップした際に起こった問題とその対処についてメモを残しておきます。

## 問題

redux-tower ではライブラリを使用するアプリ側で babel-polyfill をインポートすることを想定しています。そのため、テストする際にも、テスト側で babel-polyfill をインポートしていました。

```src/__tests__/preprocess.js
import 'babel-polyfill'; 
import test from 'ava'; 

// ...
```

ローカル環境ではそれで問題なくテストを実行できていたんですが、TravisCI 上で実行してみると[エラー](https://travis-ci.org/kuy/redux-tower/jobs/187996280)が発生しました。

```
  ✔ actions › createActionCreator
  ✔ utils › isReactComponent
  ✔ actions › createActionCreatorArgs
  ✖ preprocess › preprocess - flat Error: regeneratorRuntime is not defined
  ✖ preprocess › preprocess - nested Error: regeneratorRuntime is not defined
```
抜粋： https://travis-ci.org/kuy/redux-tower/jobs/187996280

あれっと思って確認してみましたが、`preprocess.js` ではちゃんとインポートしていました。

## 対処方法

個別にテストファイル内で babel-polyfill をインポートするのをやめて、AVA のオプションで require するように変更したら解消しました。もちろんローカルでの動作も問題なし。

```js
  },
  "ava": {
    "require": [
      "babel-register",
      "babel-polyfill"
    ],
    "babel": "inherit"
  }
}
```

抜粋： https://github.com/kuy/redux-tower/blob/master/package.json#L71

## 原因

原因不明です。ローカルの環境では発生しなかったので TravisCI 特有の何か、ということくらいしかわかりません。

## 感想

すでに Node.js が Generator をサポートしているので [babel-plugin-transform-regenerator](https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-regenerator) を使わなければいいんじゃね？ってのは去年から考えているんですが、Babel 6 からブラックリストが無くなったので個別にプラグイン設定するのが面倒で試していません。スタックトレースもキレイになるし。そういうpresetを定義すればいいのかな。
データベースのインデックス(index)

#インデックス(索引)とは
処理を高速化させるデータ構造のことです。
よく出される例として、本を探すときに索引があると全てのページを探さなくても、索引を目印にして探すページを減らすことができるから早く見つけられるよねって話があります。
実際には、メモリに保持される容量がテーブル全体ではなく、インデックスのみになるため処理効率が上がっています。

##注意点
処理が早くなるならとりあえず全部インデックスをつけとけ！となりそうですが、幾つか注意点があります。
1.データ追加時の処理が重くなる
インデックスを設定した場合、通常のテーブルとは別にインデックスに値を保持するので、データ追加時に処理が重くなります。

2.データ量が少ない場合やindexのつけ方が悪い場合にはindexは使用されない
先ほどの本の例で考えてみてもわかるのですが、10ページしかない本に対して索引をつけてもあまり意味はありませんよね。
また、インデックスがあるからと言ってインデックスが使用されるとは限りません。
インデックスを使用した場合と使用しなかった場合を比較して、処理効率が早い方が実際に使用されるので、あまり効率的でないインデックスの張り方をしてしまうと実際に内部ではインデックスは使用していないということが起きます。

#インデックスの構造の種類
インデックスの内部構造にはいくつか種類が存在します。
(wikipedia参照)

・B木(B-tree)
・ハッシュ索引
・ビットマップ索引
・多次元索引
・転置インデックス

全ての構造について理解はできていませんが、それぞれ向き不向きがあるので気になる人は調べてみてください。(今後勉強してみます)
一番メジャーなB木については下でまとめます。

###部分インデックス
条件に一致する行のみをインデックスとして設定することができます。
問い合わせされることのない値をインデックスから取り除くことができるので、設定できる場合には設定した方が処理効率は上がりそうです。

###複合インデックス
複数のカラムを組み合わせて一つのインデックスとすることができます。
姓と名でカラムが分かれている場合で検索される場合に姓名で検索されることが多い場合などに、姓名のカラムを合わせて一つのインデックスとすることで、処理効率が向上します。

#B木(B-tree)
B木もデータ構造の一つで、wikipediaによると「多分岐の平衡木(バランス木)」であるそうです。
多分岐と平衡木(バランス木)に分けて考えて見ると良さそうです。

##多分岐
1~7の中からある数字を探すときどのように探すと効率が良いか考えてみましょう。
7つを手当たり次第に見ていく場合、7回確認をする必要があります。(インデックスがない場合にはこのような感じです)
しかし実際には1~700万の中から探さなければならなかったりするので、700万回確認をするのは処理が大変ですね。

処理効率を上げるために条件で分岐させてみましょう。
わかりやすいのは一番真ん中の値(中央値)である4を基準にして、それより高いか低いかで分けて考えると、すべての値を確認しなくてすみそうです。
また、4より小さい場合考えられる値は1,2,3なので、ここでも中央値の2を基準にそれより大きいか小さいかで分岐させることができます。

![スクリーンショット 2017-01-01 12.49.02.png](https://qiita-image-store.s3.amazonaws.com/0/144753/caa8af8a-fad0-0e06-dd38-987b9932bc43.png)

しかし値が700万あった場合に中央値の350万をとって高いか低いかの判定をしていると、末端まで行くのに処理回数がかなり多くなってしまいます。
そのため最初に判定する数字(上記では4)を一つではなく、複数にすることにより確認する回数を減らしてみましょう。
1~200なら100の部分を、201~400なら300の部分を確認するようになっています。
（実際には2番目の50,150の部分も2つ以上に分岐されます）

![スクリーンショット 2017-01-01 13.07.30.png](https://qiita-image-store.s3.amazonaws.com/0/144753/004fb9ef-5719-4f46-8b7f-c1fc6fee58eb.png)

このようにいくつにも分岐させて値を確認する構造が多分岐です。

##平衡木(バランス木)
上記のようなツリー構造のうち、末端構造までの深さが等しくなるように設計された構造のことを平衡木(バランス木)と言います。

###末端構造までの深さが等しくなる
ここが理解できれば問題はなさそうです。
「末端構造までの深さ」とは最初に判定をする値から、これ以上分岐できない値までの深さのことです。
また、「深さが等しくなる」とは各分岐先の深さのことです。

下記の場合2つに分岐され、両方が最初に判定をする値から見て2段階深くなっているため「末端構造までの深さが等しくなる」状態です。

![スクリーンショット 2017-01-01 13.25.29.png](https://qiita-image-store.s3.amazonaws.com/0/144753/67a28e86-406f-ed9f-3952-a3b288f8f206.png)

仮に7がさらに分岐していて、3段階深くなっていたとしたら「末端構造までの深さが等しくなる」状態ではなくなります。

#まとめ
実際には判定をする数字が増えるごとにB木がどんどん大きくなっていくような感じらしいのですが、最初にそれを読んだ時に意味がわからなかったので、それを読む前に知っておきたい概念をまとめました。
PHPのforeachで参照渡しをしたいときに気をつけること

#foreachで参照渡し
ループを回して、その中で値を上書きする時は参照渡しをして上書きしたいってことがあると思います。
foreachの参照渡しをよく理解していなかったので、PHPマニュアルを参考に調べました。

```php
$array = ['key1' => 'val1' , 'key2' => 'val2'];
foreach ($array as &$value) {
    $value = $value . '書き換えた';
}
var_dump($array); 
// ["key1"] =>  string(19) "val1書き換えた" ["key2"] =>  &string(19) "val2書き換えた"
```

出力結果のkey2のvalueが「&string」となっています。
ループを終えた場合にも、valueが最後の値を参照したままになっているため、次にarrayを使用する際に不具合が生じる可能性が高いです。



#参照渡しをしたい場合にはどうするか
###unsetを使用する
unsetは指定した変数の割り当てを解除します。
これをforeachの後に使用することで、valueが最後の値を参照しているのを解除できます。

```php
$array = ['key1' => 'val1' , 'key2' => 'val2'];
foreach ($array as &$value) {
    $value = $value . '書き換えた';
}

unset($value);
var_dump($array); 
// ["key1"] =>  string(19) "val1書き換えた" ["key2"] =>  string(19) "val2書き換えた"
```



###keyとvalueを使用する
こんな感じでkeyとvalueを使用すれば同じことができます。
なので参照渡しはどうしても必要じゃないとき以外は使用しない方が良さそうです。

```php
$array = ['key1' => 'val1' , 'key2' => 'val2'];
foreach ($array as $key => $value) {
    $array[$key] = $value . '書き換えた';
}
var_dump($array); 
// ["key1"] =>  string(19) "val1書き換えた" ["key2"] =>  string(19) "val2書き換えた"
```
Swift製のコマンドラインツールをbrewでインストールできるようにする

自分用のツールをbrewで入れられるようにした時の記録です。

ちなみにそのツールはXcodeのプロジェクトを`xc`で開くだけおもちゃです　:wink:
https://github.com/tattn/xc

# Swiftファイルをシェルスクリプトのように動かす

今回はビルドせずに、Swiftファイルをインタプリタとして動かすことにしました。
SwiftもBashスクリプトやRubyスクリプトのように **shebang** (#!で始まるやつ) をファイルの頭に付けることで、インタプリタでサクッと実行ができます。

```bash
$ vi hello
```

```swift
#!/usr/bin/env swift

print("こんにちは世界")
```

実行権限を与えます。

```bash
$ chmod a+x hello
```

これで実行できます。

```bash
$ ./hello
```

# Homebrew用のリポジトリを作成する

本家Homebrewにプルリクエストを送らずに自作ツールをインストールできるようにするためには、brew tapでリポジトリを登録する必要があります。
次は、そのために必要なリポジトリを作成します。

まず、以下のようにツール本体をGithubにpushします。
https://github.com/tattn/xc

そして、Githubのリリース機能を使い、brewでインストールするtar.gzを作成します。
https://github.com/tattn/xc/releases/tag/0.0.1

tar.gzのリンクをコピーして、以下のコマンドでbrewのFormulaのテンプレートを作成します。

```bash
$ brew create コピーしたURL
```

不要な記述があるので、以下のように編集します。(適宜内容を変更してください)

```ruby:xc.rb
class Xc < Formula
  desc "Just open a Xcode project :-)"
  homepage "https://github.com/tattn/xc"
  url "https://github.com/tattn/xc/archive/0.0.1.tar.gz"
  sha256 "053e959fe4d8994c96f629d01d7153ad81699f8d0a67cc984032e081719df673"

  def install
    bin.install "xc"
  end
end
```

installメソッドの中でインストール方法を記述します。
ここで、makeコマンドなどを呼び出してビルドすることもできます。

brew installしたものは`/usr/local/Cellar`以下に展開されます。
`bin.install`を使用するだけで、Cellar内から`/usr/local/bin`にシンボリックリンクを作成することができます。
今回はSwiftファイルを配置するだけで良いので、`bin.install`を使用しました。

できたファイルをGithubにpushします。
この時のリポジトリ名には命名規則があり、

```
homebrew-ツール名
```

にする必要があります。

このような感じです。
https://github.com/tattn/homebrew-xc

正しく設定が出ていれば、これで完了です。

# インストールする

tapコマンドでリポジトリを登録します。

```bash
$ brew tap　{ユーザー名}/{homebrew-を除いたリポジトリ名}

例えば、
$ brew tap tattn/xc
```

インストールします。

```bash
$ brew install {homebrew-を除いたリポジトリ名}

例えば、
$ brew install xc
```

これで、どこでもすぐにインストールすることができるようになりました :tada:

# 参考

HomeBrewのFormulaを作ってみた
https://freedom-man.com/blog/homebrew-formula/

Swift2で作るコマンドラインツール
http://techlife.cookpad.com/entry/2015/11/09/150248
CentOS7にMateをインストールする

# Mateとは

Gnome2からフォークされたデスクトップ環境です。
ちなみに、読み方は「マテ」（マテ茶とかの「マテ」)が正しいらしいです。


# インストール

**EPELリポジトリの追加**

    $ sudo yum install epel-release.noarch

**/etc/yum.confの設定**

/etc/yum.confに「group_package_types=default,mandatory」がなかったら追加します。

    $ sudo sh -c 'echo group_package_types=default,mandatory >> /etc/yum.conf'

「mandatory(強制的)とdefault(標準)をインストールする」という意味らしい。

**Mateのインストール**

    $ sudo yum --enablerepo=epel groupinstall "X Window system"
    $ sudo yum --enablerepo=epel groupinstall "MATE Desktop"
    
X Window systemは、CentOSを最小インストールした人以外は、すでにインストールされていると思います。

**Mateの起動設定**

    $ echo "exec mate-session" > $HOME/.xinitrc
    $ startx

普段はCLIで、必要な時だけGUIを使う方は、上記のようにstartxコマンドでMateを起動する、でよいと思います。
GUIログインに変更したい場合はランレベルを5に変更して再起動します。

    $ sudo systemctl set-default graphical.target
    $ reboot

再起動後、GUIのログイン画面が表示されるはずです。


# 日本語設定

## 日本語フォントのインストール

    $ sudo yum install vlgothic-*
    $ sudo yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts

あえて日本語フォントをインストールしなくても、文字化けせずに表示されると思います。


## 日本語入力

**ibus-kkcのインストール**

    $ sudo yum groupinstall -y "Input Methods"


**$HOME/.xinitrcの追加設定**

```terminal:$HOME/.xinitrc
 $ cat $HOME/.xinitrc
 export GTK_IM_MODULE=ibus
 export XMODIFIERS=@im=ibus
 export QT_IM_MODULE=ibus
 ibus-daemon -drx
 exec mate-session
```

GUIでログインする人は、環境変数（exportしている行）を＄HOME/.bashrcに書きましょう。
＄HOME/.xinitrcはstartxでGUIを起動するときしか読まれないっぽい。

あと実験していませんが、CentOSでibus-mozcをインストールする場合は、fedoraのrpmファイルを取得する方法が一番確実っぽいです。


# CentOS7のランレベルの切り替え

**ランレベル1（CLIシングルユーザモード）**

    $ sudo sytemctl set-default rescue.target

**ランレベル3（CLIマルチユーザモード）**

    $ sudo systemctl set-default multi-user.target

**ランレベル5（GUIマルチユーザモード）**

    $ sudo systemctl set-default graphical.target


## ランレベル5（GUIログイン時）のibus daemonの自動起動設定

GUIでログインした時の、ibus daemonの自動起動設定がわからなかったので、「自動起動するアプリ」で逃げました。

    システム ⇒ コントロールセンター ⇒ 自動起動するアプリ

に、下記の内容で自動的に起動するプログラムを追加すると、GUIログイン時にibus daemonが起動してくれるようになります。

| 設定項目 | 設定値 |
|:--------|:------------|
|名前     | ibus daemon     |
|コマンド | ibus-daemon -rdx  |
|説明     | start ibus daemon |

コマンドだけ正しく入力されていれば、名前と説明は適当（空でも可）でよいと思います。
Bootstrapのmodalで背景をクリックして閉じさせない

```
data-backdrop="static"
```
を追加する

```html
<div class="modal fade" data-backdrop="static">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">...省略</div>
      <div class="modal-body">...省略</div>
      <div class="modal-footer">...省略</div>
    </div>
  </div>
</div>

```
minikubeでローカルのdocker imageを使う

k8sクラスタを試作してる段階では、アプリのdockerイメージをいちいちprivate registryにpushしたりするのは面倒です。

minikubeを使ってる場合、docker buildだけしてローカルのimageを簡単に扱えるのでメモ。

## 環境
- Mac OS X 10.11.6
- minikube version: v0.14.0
- Docker version 1.12.5 (Docker for Mac)

## やり方
### 1. minikube VM上のdockerを使うよう設定

```bash
$ eval $(minikube docker-env)
```

これで`DOCKER_TLS_VERIFY, DOCKER_HOST, DOCKER_CERT_PATH, DOCKER_API_VERSION`が設定される。

### 2. dockerイメージをbuild

タグは`latest`以外にする必要があることに注意。でないと、k8sはregistryからイメージをpullしてこようとしてしまいます。
(http://kubernetes.io/docs/getting-started-guides/minikube/#reusing-the-docker-daemon)

```bash
$ echo "FROM nginx" >> Dockerfile
$ docker build -t example/nginx:v1.0 .
```

### 3. minikubeでPodを起動

```example.yaml
apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  containers:
  - name: nginx
    image: "example/nginx:v1.0"
    imagePullPolicy: IfNotPresent

```

`imagePullPolicy: IfNotPresent`がポイントです。

このようなPodを定義してcreateすると、

```bash
$ kubectl create -f example.yaml
pod "example" created
$ kubectl get pods
NAME      READY     STATUS    RESTARTS   AGE
example   1/1       Running   0          17s
```

ちゃんと立ち上がります。
Puppet4.xではじめるサーバ設定自動化 11（条件分岐）

Puppet4.xではじめるサーバ設定自動化の、条件分岐についてです。
全体的な目次は、[ここ](http://qiita.com/kijibato/items/ae510dfa91884bdd9f61)を参照してください。
主にCentOS 7を例に紹介しているので、その他OSについては読み替えてください。

# Puppetでの条件分岐

Puppetでの条件分岐は、次の４つがあります。

- if
- unless
- case
- selectors

if、unless、caseは、他のプログラミング言語と同様です。selectorsは、条件ごとに設定する値を変えたい場合に使います。caseとの違いは、caseは条件を満たす場合の処理を書けますが、selectorsは条件を満たす場合の値のみ書けます。

OSごとにパッケージ名が異なる、httpdとapache2を例に紹介します。
なお、$operatingsystemは、OSの種類を表す変数です。

## if

- OSがCentOSの場合、httpdインストール。
- OSがCentOS以外でUbuntuの場合、apache2インストール。
- その他、ワーニング。

```puppet:if.pp
if $operatingsystem == "CentOS" {
  package { "httpd" :
    ensure  => "installed",
  }
}
elsif $operatingsystem == "Ubuntu" {
  package { "apache2" :
    ensure  => "installed",
  }
}
else {
  warning('This manifest supports only CentOS and Ubuntu.')
}

````

## unless

unlessは条件を満たさない場合です。
参考資料からの引用で、システムメモリサイズが、1073741824バイトより大きくない場合、maxclientを500にする例です。

```puppet:unless.pp
unless $facts['memory']['system']['total_bytes'] > 1073741824 {
  $maxclient = 500
}

```

$facts['memory']['system']['total_bytes']は、システムメモリサイズ（byte）です。
なお、unlessの場合、elseは使えますが、elsifは使えません。


## case

- OSがCentOSの場合、httpdインストール。
- OSがUbuntuの場合、apache2インストール。
- その他、ワーニング。

```puppet:case.pp
case $operatingsystem {
  "CentOS": { 
    package { "httpd" :
      ensure  => "installed",
    }
  }
  "Ubuntu": {
    package { "apache2" :
      ensure  => "installed",
    }
  }
  default:  {
    warning('This manifest supports only CentOS and Ubuntu.')
  }
}

```

## selectors

- OSがCentOSの場合、httpdインストール。
- OSがUbuntuの場合、apache2インストール。

```puppet:selectors.pp
$httpd = $operatingsystem ? {
  "CentOS" => "httpd",
  "Ubuntu" => "apache2",
}

package { "httpd" :
  name    => $httpd,
  ensure  => "installed",
}

```

# 【おまけ】比較演算子in

条件分岐ではないですが、複数候補に一致する場合などにはin演算子が便利です。
Pythonぽい比較です(Rubyでいうinclude?メソッド)。

```puppet:in.pp
if $operatingsystem in ["CentOS", "RedHat"] {
  package { "httpd" :
    ensure  => "installed",
  }
}

```

# 参考

条件分岐については、下記参照です。

- https://docs.puppet.com/puppet/latest/lang_conditional.html

条件に使える比較演算子などは、下記参照です。

- https://docs.puppet.com/puppet/latest/lang_expressions.html
ZenHubを導入することでGitHubのタスクを管理しやすくする

## GitHubだけでタスク管理をする問題点

GitHubだけでタスクを管理していると以下の問題点があります。

* issuesの優先順位やタスクの進行状況がわからない
* issueが大量にあるために管理するのが大変

ZenHubを導入することにより上記の問題点を改善することができる。

## issuesの優先順位やタスクの進行状況がわからない
### 問題点
GitHubのissues機能を使用していると優先順位やタスクの進捗状況がわからないという問題点が生じます。
また、たくさんのチケットがあると次のリリースまでにどのチケットを実装するのかがわからりづらい問題があります。

### 改善案 かんばんを使用する
ZenHubを使用すると、かんばんを使用することができるようになります。
かんばんを使用することで、タスクに取り組んでいるのか、完了したのかという進行状況を表で簡単に見れることができるようになります。
また、新しくタスクを開始した場合もかんばんから移動するだけでタスクに取り組んでいるということがわかります。

かんばんは簡単に説明をすると以下の説明になります。
> タスクの状態を「TODO」「DOING」「DONE」という3つのステージに分割し、タスクを情報カードや付箋紙に書いて貼り付けたもの

[詳細な説明](http://bit.ly/2idkXbn)

#### かんばん画面へのアクセス方法
1. GitHubのメニュー欄にBordsという項目が追加されます
<img width="999" alt="zenhub_enable" src="https://cloud.githubusercontent.com/assets/155013/21558176/0a919d1e-ce79-11e6-9022-a34519cafcfb.png">

2. そこをクリックすると2番目の画像のような画面が表示されます
<img width="1231" alt="kanban" src="https://cloud.githubusercontent.com/assets/155013/21558190/43f7290c-ce79-11e6-9c6c-f5d375ddf445.png">

この画面でかんばんの操作ができます。

##  issueが大量にあるために管理するのが大変

### 改善案 エピックを使用する
ZenHubを使用することで、 複数の関連したチケットをまとめたエピックを作成することができます。
エピックを使用することで、次のリリースまでに実装する機能をまとめたエピックや友達機能などの特定の機能のタスクをまとめたエピックを作成できます。
それにより、次のリリースまでにどれぐらいのタスクが残っているのかや、どれぐらいのタスクをおこなえば機能が完成するのかがわかります。

また、かんばん内でフィルタリングをすることによって特定のエピックだけに紐付いているチケットを表示することができます。

※ チケットのフィルタリングは担当者やラベルなどでもできます。
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 EXその3(スキル選択表示)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 22日目の記事です。
以下、2017年1月1日に書いた内容になります。

---

新年明けましておめでとうございます。
3つめの記事です。

FlashゲームをUE4で再実装するゲリラアドカレ、EXその3です。
今回はスキルの選択コマンドを表示するようにします。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#スキル選択表示

スキルを選択できるようにコマンドを表示します。

まず、スキルコマンドを選択した時のイベントを実装します。
![click](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-7.png)
クリックイベント受信後、すべてのコンポーネントを削除した後、スキルの選択ボタンを表示するメソッドを実行します。

スキルを選択するコマンドUI生成メソッドは以下の通りです。
![func](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-8.png)

キャラごとに表示するスキルを決定後、UIを生成してコンポーネントにaddしています。

#スキルコマンドが表示されるようになった

スキルコマンドが選択できるようになりました。
![skill](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-9.png)

次はとりあえず攻撃スキルを選択したらHPとMPを減らすように実装します。
16.04にpyenv＋Anacondaを入れてみる

#はじめに
うっかりUbuntu14.04を16.04にupgradeしてしまった。これにより、これまで使えていたchainer等、ディープラーニング系のフレームワークが使えなくなった。

GPUが入っているので、復旧させたい。そこで各種dependenciesを入れなおしたが、chainerはdatetimeがないとかで、動かず。
http://qiita.com/masataka46/items/2de111a06049cdbda83f

そこでpyenvやanacondaを入れることで問題が解決できないか、試してみる。

#環境
GPU：GTX970
OS：Ubuntu16.04（14.04からUpgrade）
14.04時の諸々フレームワークが機能せず

#参考サイト
Shinpei Kawahito氏のブログ
http://blog.algolab.jp/post/2016/08/21/pyenv-anaconda-ubuntu/

y__sama氏のQiita記事
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

#必要なパッケージのインストール
まず必要なパッケージをまとめてインストールする。

```
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev libpng-dev
```

#pyenvをインストール
pyenvおよびプラグインをインストールする。

```
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

ここまで問題なし。
#Anacondaのインストール
まずpython3系、最新のAnacondaのヴァージョンを確認する。

```
pyenv install -l | grep anaconda3
  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1
  anaconda3-4.2.0
```

最新は4.2.0みたい。これをインストールする。

```
pyenv install anaconda3-4.1.0
```

間違って4.1.0を入れてしまった。まぁ気にしない。

```
pyenv global anaconda3-4.1.0
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-4.1.0/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

pythonのヴァージョンを確認する。

```
python --version
Python 3.5.1 :: Anaconda 4.1.0 (64-bit)
```

#Pythonライブラリのインストール
`conda`や`pip`を使い分けてインストールするみたい。両者をupgradeする。

```
conda update -y conda
pip install --upgrade pip
```
GitHubを始めてみよう

#はじめに
サーバーにファイルやフォルダを置く際にGitHubを介したら楽になるんじゃないかと思ったのでGitHubを始めてみました。
何か間違っていることがあれば指摘お願いします。
#GitHubとは
- ソースコードの管理
- バージョン管理

などができるサービスの事です。一人じゃなくてほかの人と共同で進めていく時とかに役立ちます。

#新規アカウント登録
1. [GitHub公式サイト](https://github.com/)で登録
2. Unlimited public repositories for freeを選択
3. Help me set up an organization nextにはチェックを入れずにcontinueを押す
4. 質問に答えましょう
5. 登録したメールアドレスにメールが来るのでそこから認証する

以上で登録が完了しました。とても簡単。

#Hello Worldのガイドをやってみた
##基礎知識
###レポジトリ
一つのプロジェクト全体を形作ってる物といえるでしょう。ファイルだったりフォルダだったりするまとまりのことです。
###ブランチ
レポジトリに対して、そのレポジトリのいろいろなバージョン(更新履歴のようなもの)の状態を示すもの。
masterブランチというのが最初にあってそれにすぐ手を付けていくのではなく、他にブランチを自分で作ってそのブランチ上で作業を進めた後、masterブランチに吸収させたり(mergeという)できる
また他の人がmasterブランチの更新をしたときなどに自分のbranchに吸収すること(pullという)もできる。
###コミット
レポジトリに(厳密には今現在いるブランチのレポジトリに対して。ほかのブランチのレポジトリに対しては影響しない。)変更内容を保存させること。コミットするときにはcommit messageなるものがあって何を編集したのかなどを記入しておくといい。
##実際にやってみた
###レポジトリを作る
1. [GitHub公式サイト](https://github.com/)のヘッダー部分の右上あたりにある+マークをクリックする
2. そこからNew repositryをクリックする
3. Repositry nameはHello Worldにします
4. Descriptionは適当にしておきます
5. PublicかPrivateについてはレポジトリを見せたい範囲に応じて変化させましょう
6. READMEファイルは作っておいた方がいいとの指摘がサイトにもあるのでInitialized this repository widh a READMEはチェックする
7. .gitignoreやa licenseはとりあえず今は無視
8. Create repositoryをクリックする

###masterブランチ以外のブランチを作る
Create repositoryをクリックした後に出てくるページでこれから話を進めていきます。
またこのページはGitHubのヘッダー右上の+マークの右のマークをクリックしてYour profileからも行くことができます。

1. Branch:masterのボタンをクリックしてテキストボックスに新しいブランチの名前を自由につけて(今回は```test```とします)Enterキーを押す
2. testブランチに切り替わっていてtestブランチが作成された(ファイルやフォルダの内容が**この時点では**masterブランチと同じ)

##testブランチのもとでファイルに変更を加えていく
1. README.mdファイルを選択する
2. 行数とバイト数が書かれている右側にあるペンのマークを選択して何か適当にファイルの内容を変更する
3. 変更したら画面の下側にいきcommitメッセージを記入してCommit directly to the test branchを選択してCommit changesを選択する

これでtestブランチとmasterブランチで内容が違うようになりました。
##プルリクエストを送る
testブランチをpull requestしてみましょう。
masterブランチとの差分などが分かりそのpull requestを受け入れmasterブランチにmergeしたり、またそこから議論に発展していったりします。

1. pull requestのタブをクリックしてNew pull requestを選択
2. testブランチを選択
3. ファイルの差分などが見れる。そのpull requestでいいならCreate pull requestを選択
4. Writeのところにまた何を変更したのかなどcommentを書く
5. Create pull requestを選択

##プルリクエストを受け入れてmasterブランチにmergeする
1. pull requestのタブをクリックしてMerge pull requestを選択
2. Create a merge commitを選択
3. 画面が少し変わるのでConfirm mergeを選択

これでtestブランチの内容をmasterブランチの内容にmergeすることができました。

#参考
[Hello World・GitHub Guides](https://guides.github.com/activities/hello-world/)
[今さら聞けない！GitHubの使い方【超初心者向け】](https://techacademy.jp/magazine/6235)
underscore.jsのtemplate構文をを変更する

JSPやThymeleafとunderscore.jsのtemplateを使用したい場合に構文が認識されないため、underscore.jsの構文を変更したいという状況があると思います。
今回は、その構文の変更方法を記載したいと思います。
BackBone.js、Marionette.jsを使用している場合も同様です。

underscore.jsのcodeを見てみると以下のようになっています。

```js:underscore.js[excerpt]
  _.templateSettings = {
    evaluate    : /<%([\s\S]+?)%>/g,
    interpolate : /<%=([\s\S]+?)%>/g,
    escape      : /<%-([\s\S]+?)%>/g
  };
```

上記の"<%"と"%>"の部分を他の記号に変更するとJSP等の構文と被らなくなるため、以下のように設定を変更する。
今回は、"<%"を"{{"と"%>"を"}}"に置き換えます。

```js:customized
    _.templateSettings = {
        evaluate: /\{\{([\s\S]+?)\}\}/g,
        interpolate: /\{\{=([\s\S]+?)\}\}/g,
        escape: /\{\{-([\s\S]+?)\}\}/g
    };
```

HTMLのでの記載方法は、以下のようになります。

```html:code
    <span>Item Name : {{ evaluate }} </span>
    <span>Item Name : {{= interpolate }} </span>
    <span>Item Name : {{- escape }} </span>
```
glfwを使うプログラムをターミナル上でコンパイル

# はじめに
ピンポイントでハマったので
敢えてmacのターミナルでOpenGLをやってみようと思い立つも
glfwのサンプルをコンパイルしようにもリンクのエラー吐いて困ったので色々調べてみた。

# glfwのインストール
makeしてもいいけど簡単に管理したいのでhomebrewで
stowとか使えば管理できるかなって思ったけどconfigureしないので、余談だけど

```
$ brew install glfw3
```

特に変わったこともない。

すると/usr/local/includeにGLFW/glfw3.hができてるのでそのままでおk
適当なcppファイルで#include <GLFE/glfw3.h>をインクルード
コンパイルするときには

```
$ clang++ -o main main.cpp -lglfw -framework OpenGL
```

以上

これをやらないと

```
Undefined symbols for architecture x86_64:
  "_glClear", referenced from:
      _main in main-28d7a8.o
  "_glfwCreateWindow", referenced from:
      _main in main-28d7a8.o
  "_glfwInit", referenced from:
      _main in main-28d7a8.o
  "_glfwMakeContextCurrent", referenced from:
      _main in main-28d7a8.o
  "_glfwPollEvents", referenced from:
      _main in main-28d7a8.o
  "_glfwSwapBuffers", referenced from:
      _main in main-28d7a8.o
  "_glfwTerminate", referenced from:
      _main in main-28d7a8.o
  "_glfwWindowShouldClose", referenced from:
      _main in main-28d7a8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

みたいなエラーがでる。（よくわからん）
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 EXその2(スキル表示準備)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 21日目の記事です。
以下、2017年1月1日に書いた内容になります。

---

新年明けましておめでとうございます。
２つめの記事です。

FlashゲームをUE4で再実装するゲリラアドカレ、EXその２です。
今回はとりあえずスキルを選択できるように必要なデータとコンポーネントを準備をします。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#スキルのデータテーブルを作成

まず、スキルのデータテーブルを作成します。
スキルはＣＳＶに書いたものを読み込むようにします。

まず、構造体を作成します。
![構造体](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-1.png)

構造体の中身は

| 構造体名       |詳細 |
|:-----------------|:------------------|
| id  | スキルＩＤ |
| name |  スキル名 |
| attribute | 属性ＩＤ |
| lv   |  スキルを覚えるLV |
| mp   |  消費ＭＰ |
| type  |  タイプID 0:攻撃　1:回復 2:ステータス変更　と仮に割り当てます |
| statusType  | ステータス変更の場合、どのステータスが変更されるかを示すＩＤ |
| num  | 基本数値　攻撃なら攻撃値と変更 |
| detail  | スキル詳細 |　

となっています。
今後変える可能性はありますが、いったんこれで行きます。

仮で作成した主人公のスキルデータCSVを読み込みました。
![datatable](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-2.png)

CSVをUE4へ持ってくるやり方はヒストリアさんの[[UE4] CSVデータを扱う方法　DataTable編](http://historia.co.jp/archives/779)を参照してください。

#スキル選択ボタン作成

スキルを選択するボタンを表示するように準備をします。
単体攻撃なら、処理の流れはスキル選択→対象選択に進むようにします。

スキルの構造体と、各キャラクターの構造体は別なので、スキル選択用にUIコンポーネントを作成します。
![skillbutton](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-3.png)

イベントを作成します。キャラクター選択とほぼ一緒で、違うのはクリックすると別のイベントディスパッチャーを呼び出すようにしています。
![scriptevent](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-4.png)

続いてボタンラベルのバインド関数を作成します。スキル名と消費ＭＰを表示します。
![scriptbind](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01-5.png)

これで準備が終わりました。

#スキルを表示する準備完了

スキルを表示する準備が整いました。
次は攻撃スキルを選択したらＨＰを減らす処理を実装します。
vagrant, VirtualBoxの開発環境構築

macでの開発環境の構築メモ

## vagrant, VirtualBoxインストール

## フォルダ作成・移動

## vagrant新規作成
vagrant init bento/centos-6.8

## Vagrantfile修正して固定IP設定
config.vm.network "private_network", ip: "192.168.33.10"

## vagrant起動
vagrant up

## 接続
vagrant ssh

## 各パッケージインストール
yum update yum
yum install php
などなど

## /var/www/htmlを共有フォルダ(/home/vagrant)へリンクする
ln -sf /vagrant /var/www/html
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 EXその１(ＭＰ消費)　

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 20日目の記事です。
以下、2017年1月1日に書いた内容になります。

---

新年明けましておめでとうございます。
2016年、大変お世話になりました。2017年もよろしくお願いします。

あと、色々あって年末何もできなかったので、新年明けてからのアドカレ投稿になり申し訳ございません。
早速前年度のやり残しを片付けていきたいと思います。

FlashゲームをUE4で再実装するゲリラアドカレ、EXです。
今回はEX初回として、スキル実装前にとりあえずＭＰ消費の処理を入れましょう。

ストレートに言って水増しです。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#MP減算処理

はっきりいってＨＰと同じ、バインド関数でＭＰを減らす処理を書くだけです。

![bind](http://oginoyuki.wp.xdomain.jp/wp-content/uploads/2017/01/2017-01-01.png)

以上で終わりです。

---

新年一発目から内容薄すぎてホント申し訳ないのです。
Qiitaの画像投稿制限が解除されてないため、画像を一旦レンタルサーバーに上げており、かつそのサーバーもアップロード上限制限に引っかかりそうなので、今回はこれで区切らせてもらいます。

~~ホント早くQiitaの100MB画像投稿制限解除してください、お願いします~~

次はスキルを選択できるように実装します。
Googleスプレッドシートで空白セルを置換

# 空白(未入力)セルを置換したい

Googleスプレッドシートの「検索と置換」では「検索」欄が空白のままだと検索ボタンが有効にならず、空白セルを検索できないので一工夫。

1. 「正規表現を使用した検索」にチェックを付ける
2. 「検索」欄に`^$`を入力して検索

2017/01/31コメントを受けて追記

- 試したスプレッドシートは罫線を引いている範囲でした。
- 新規作成したスプレッドシートでデータだけ入れたところ上手く一致しませんでした。
- 一度編集→削除を行ったセルでは一致する。(未編集のセルは検索対象に含まれない？)
- とりあえず…空白を含む検索範囲に罫線を引く、フォントを変更する…等を行えば上記の正規表現で空白セルに一致するようです。
PHPの配列のキーの型について

配列のキーに翻弄される事があったので、備忘録です。

## 公式ドキュメント
http://php.net/manual/ja/language.types.array.php

* キーの型は整数型と文字列型がある
* 整数型のキーが10進数以外であれば、10進数に変換される
* キャストとはロジックが異なる  

## 例
|キーにする値|キーの型|備考|
|---|---|---|
|1|整数|
|'1'|整数|
|1.2|整数|1に変換される|
|0332|整数|10進数の218に変換される|
|'1a'|文字列|
|'test'|文字列|
例えば、DBから取得した整数文字列のPKなどをキーに指定します。
それが「先頭が0、かつ8も9も含まれていない値」の場合、8進数としてみなされます。

```php:arraykey.php
<?php
declare(strict_types=1);

$data[0332] = "0332";
var_dump($data);

// array(1) {
//   [218] =>
//   string(4) "0332"
// }

```

## 整数型になると困る場合
* 半角数字以外の文字列を連結する
* キーにはハッシュ値など文字列になり得るものを用いる
VirtualBox + 3Dアクセラレーション + Ubuntu + Electron = 動かない

VirtualBox 上に構築した Electron 系のアプリケーションが動かない時の対処方法。

# 確認環境

* VirtualBox 5.1.14
* Ubuntu 16.04
* Atom, Visual Studio Code
    + 未確認だけど、他のElectronアプリもかな？

# 対処方法

`--disable-gpu` オプションをつけて起動する

## 具体的には

1度の起動だけでいい場合は、

```bash
$ atom --disable-gpu # Atom
$ code --disable-gpu # Visual Studio Code
```

など。

ただ普通に考えてランチャーから起動する機会のほうが多いと思うので、その場合は

```bash
$ sudo vim /usr/share/applications/atom.desktop
$ sudo vim /usr/share/applications/code.desktop
```

一発でできないものか…。

# 出典

* [VirtualBoxでAtomEditorが表示されない！](http://truth.hateblo.jp/entry/2016/11/16/013639)
* [Visual Studio Code FAQ](https://code.visualstudio.com/docs/supporting/faq#_vs-code-main-window-is-blank)
AppleScriptでシェルを動かす時のファイルパスについて

AppleScriptでシェルを動かす時，なんらかのファイル指定（実行するphpファイルだったり，書き込むtxtファイルだったり)をしたい時があります．その時のパスの指定についての話です．

# シェルを動かす時のファイルパス
ファイルパスを指定する時ですが，書いているAppleScriptファイルを何処に置いても，そのファイルの中で動かすシェルでの<strong>最初のカレントディレクトリは必ずルートディレクトリ</strong>になっています．

```test.applescript
#入力
do shell script "pwd"
```

すると，出力で<code> "/" </code>が確認できると思います．

したがって，AppleScript内でシェルを動かし，その中でファイル指定をする時には，必ずそのファイル名を絶対パスで記述するか，カレントディレクトリをファイルのディレクトリまで移動させて行うことになります．

```excute.applescript
# ~/User/MyPHP/test.phpを実行したい時

# 絶対パスで記述する方法
do shell script "php ~/User/MyPHP/test.php"

# カレントディレクトリを移動する方法
do shell script "cd ~/User/MyPHP; php test.php"
```

以上が，AppleScriptでシェルを動かす時のファイル指定の方法です．
utf8mb4で巻き起こったトラブル

MySQLで、BMP外の文字を入れる場合には、`utf8`ではなく`utf8mb4`が必要となります。ただし、ただ書き換えただけではうまくいかない部分がありました。

## TL; DR
* MySQLのインデックス長は767バイトまで
* 1文字4バイトの`utf8mb4`では191文字が限界
* その（文字コード/カラム長/インデックス）、必要ですか？

## エラーを食らう

モバイル向けのサービスを作ることになったのですが、Unicodeの絵文字入れられるようにすることが必要だろう、ということで、文字コードを`utf8mb4`とすることにしました。で、いつものようにマイグレーションを作成してマイグレートをかけたのですが、エラーになってしまいました。

見てみると、インデックスの長さでエラーとなっていました。MySQLのインデックスは最大767 **バイト**で、RailsやCakePHPのデフォルトで生成される255文字の`VARCHAR`では、3バイトの`utf8`では255×3=765でほぼぴったり収まります。一方、`utf8mb4`ではオーバーしてしまうので、エラーとなりました。

## さて、何を削ろう

もちろん、このままではうまくいかないので、何かしらの対処が必要となります。

### 文字数を削る
767バイト÷4 = 191.75なので、`VARCHAR(191)`とすれば確実に収まります。というより、255にしても191にしても、たいてい必要な列幅より長いイメージもあるので、適当な幅まで削ったほうがいいかもしれません。電話番号であれば30桁でも過剰なぐらいですし、郵便番号なら10桁もいりません。氏名欄にしたって、100文字を打ち込むこともないでしょう[^1]。

### インデックスを付けない
`utf8mb4`で入れて、しかもある程度の長さが必要なものを考えれば、それはフリー入力欄、ということが多いと思います。フリー入力欄に対して、並べ替えの基準にしたり、前方/完全一致で検索をかける、というような用事がなければ、インデックスは不要です。

### 文字コードを入れ替える
インデックスを付けるような使い方をする`VARCHAR`カラムは、電話番号、郵便番号などのような何かしらのコード体系に則ったもの、ということもよくあります。そのような場合、必要な文字が足りるのであれば`latin1`などを選ぶのも1つの方法です。なお、MySQLの仕様では、「Unicode文字列のカラム」と「非Unicodeのカラム」で演算を行うことはできますが（Unicodeに寄せる）、「`utf8`のカラム」と「`utf8mb4`のカラム」で演算を行おうとすると、明示的にコードを指定しない限りエラーとなるので、システム中にこの2つを混在させることはおすすめできません（[5.6のマニュアル §10.1.7.5 式の照合順序](https://dev.mysql.com/doc/refman/5.6/ja/charset-collation-expressions.html)）。

## おまけ：CakePHP3でのコレーション指定
CakePHP3のマイグレーションに使われるPhinxでは、何も指定しないと`utf8`で動きます。別なコレーションを指定したい場合、`$this->table`の第2引数で`['collation'=>'utf8mb4_unicode_ci']`のように書く必要があります（[StackOverflow](http://stackoverflow.com/questions/36866656/in-cakephp3-migrations-or-phinx-how-to-use-utf8mb4-charset)）。

[^1]: 名前が長いことで有名な、[パブロ・ピカソ](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%96%E3%83%AD%E3%83%BB%E3%83%94%E3%82%AB%E3%82%BD)の本名で120文字程度です。
commanderの使い方

# commanderとは

* コマンドラインツール用に引数をパースするライブラリ
* rubyのcommanderをインスパイアして作られている
* https://www.npmjs.com/package/commander
* https://github.com/tj/commander.js

# インストール

```
npm i commander
```

# 簡単な使い方

## version

プログラムのバージョンを設定

* -hでバージョンが表示される

## option

オプションの項目を設定
引数の値は格納される変数名にもなる

* 省略引数(-p)
* 引数(--purpos)
* 説明
* デフォルト値
* パース関数
* option(省略引数,引数,説明,[デフォルト値],[パース関数])

## parse

対象となるオプション引数を指定する

* 通常はprocess.argvを指定

## example

```
const program = require('commander');
program
  .version('0.0.1')
  .option('-p, --pen', 'Add pen')
  .option('-a, --apple', 'Add apple')
  .option('-P, --pineapple', 'Add pineapple')
  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
  .parse(process.argv);

const main = (program) => {
  if(program.pen){
    console.log("pen")
  }
  if(program.apple){
    console.log("apple")
  }
  if(program.pineapple){
    console.log("pineapple")
  }
  if(program.pen && program.apple){
    console.log("applepen")
  }
  if(program.pen && program.apple && program.pineapple){
    console.log("penpineapple applepen")
  }
}

main(program)
```

# optionの使い方

|パターン|値|説明|
|---|---|---|
|option('-p, --pen', 'i have a pen')|bool|true of false|
|option('-x, --pen &lt;n&gt;', 'Add number of pen')|String|引数に<>を指定すると引数を一つ取ることを強制する。|
|option('-x, --pen &lt;n&gt;', 'Add number of pen', parseInt)|Number|引数に<>を指定すると引数を一つ取ることを強制する。4番目の引数にパーサーを入れることで数値型として前処理させる|
|option('-x, --pen [n]', 'Add number of pen')|String|引数に[]を指定すると引数として値を取れる。値はオプションで存在しなければtrueが入る|
|option('-x, --pen &lt;items&gt;', 'Add items', (items)=>items.split(','))|Array|複数の値を扱う場合はデリミタを使いそれをパースする関数をセットする|
|option('-p, --pen &lt;n&gt;', 'Add pen', '1')|String|デフォルト値のセット|
|option('-p, --pen &lt;n&gt;', 'Add pen', '1', parseInt)|Number|デフォルト値とパーサーのセット|
gitでローカルブランチにmasterなんて（普通は）要りません

# 理由

1. GitHubやGitLabなどのおかげで、リモートで直接masterにマージできるようになった。
    - **どうしても**、という時以外ローカルのmasterブランチで作業する必要はないはずです。
2. 間違えてmasterを壊してしまうリスクが更に減る
3. ローカルのmasterブランチをメンテするコストが減る

地味なメリットに聞こえるかもしれませんが個人的にはありがたいので最後のものを詳しく説明します。

Gitの仕様上、ローカルのmasterブランチはリモートのmasterブランチを更新しても自動的には更新されません。
現状、`git checkout master`してから`git pull`しないと更新できないはずです（他にも方法はありそうな気がしますが割愛します）。
この方法、一瞬でも`master`にチェックアウトしなければならないため、チェックアウトする前のブランチとローカルの`master`の差が大きい場合、ワークツリーの書き換えに時間がかかってしまいます。
    一瞬しかそのワークツリーは必要ないのに。 :confused:
    さらに、更新前のローカルの`master`とリモートの`master`の差が大きい場合、`pull`した後のワークツリーの更新にまた時間がかかってしまいます。 :confused:
大きなリポジトリーでは無視できないぐらい遅いかもしれません。 :disappointed:

それに対してリモートのmasterブランチ（`origin/master`）は`git fetch`しただけで更新されます！ :+1:
`pull` するためだけにいちいち `checkout` する必要はないのです！

# ローカルにmasterのない日常

リモートのmasterブランチ、`origin/master` は `checkout` しない限り概ね普通に使えます。
これから紹介するコマンド例の通り、 **使う前は都度`git fetch`**しておくと安心です。[git-sh](https://github.com/rtomayko/git-sh)のaliasなどに追加するのをおすすめします。

`origin/master` から rebaseしたいときは

```bash
git fetch && git rebase origin/master
```

すればいつでも最新の`origin/master`からrebaseできますし、新しいブランチを作りたいときは

```bash
git fetch && git checkout --no-track -b 新しいブランチ origin/master
```

しましょう。

ただし、 **--no-track オプションをつけるのを忘れない**でください！
:memo: **追記**: あるいは、予め

```
git config --global push.default current
```

あるいは

```
git config --global push.default nothing
```

と設定しておくのもよいみたいです。
(Thanks @yamasa さん！)

より安全にやるなら

```bash
git fetch && git checkout origin/master
git checkout -b 新しいブランチ
```

とするとよいでしょう。
間違えて `checkout` して「detached HEAD」になってしまっても、上記のように慌てず騒がず `git checkout -b` で新しいブランチを作ればいいのです。

と、言うわけで賛同できる方は「いいね！」して `git branch -D master` しちゃいましょう！
Winメモ　このコマンドはどこにある？

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
パスが通っているコマンドの実体を探し出してフルパスを表示する。
Linuxのwhichコマンド相当。

# <i class="fa fa-cubes" style="font-size:1em;"></i> 構文
```Text:コマンドプロンプト
where コマンド名
```

PowerShellの場合は拡張子までつけないとエイリアスのwhereが動いてしまう。

```Text:PowerShell
where.exe コマンド名
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 使用例
![dos01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/5c550585-a021-c94a-ced2-02eb960ea777.png)


# <i class="fa fa-cubes" style="font-size:1em;"></i> 動作確認した環境
* Windows 8.1
* Windows 10
PC 開きっぱなしで離席したときのイタズラと戦う

研究室で離席中、ターミナルにイタズラされる由々しき事態が頻発した。
もちろんロックせずに席をはずす俺が悪いのでる。
そこで身につけることになってしまったイタズラの対処策などを紹介する。

# 事例

## alias ls=sl
定番の SL コマンド。
しかも自分で [sl_tweet](https://github.com/pocke/sl_tweet) でツイートされるように設定してたのでプラスダメージをうけた。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">slコマンドが走りました(56日振り13回目)</p>&mdash; [Elzup] (@_elzup_) <a href="https://twitter.com/_elzup_/status/779600893515698177">2016年9月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
犯人が知らずに動作確認したせいで予め SL ツイートされるおまけつき。

## alias cd=sl
anyframe-widget-cdr を使っているのでしばらく気づかなかかった。

![_Elzup_さんのツイート___あれえ？なんか_sl_コマンド走ってるなぁと思ったら誰だいたずらしたの出てこい_https___t_co_2hRiFAAYF9_.png](https://qiita-image-store.s3.amazonaws.com/0/40717/7f7981d2-37d9-5c20-c30e-1b99f62ee17a.png "_Elzup_さんのツイート___あれえ？なんか_sl_コマンド走ってるなぁと思ったら誰だいたずらしたの出てこい_https___t_co_2hRiFAAYF9_.png")

## alias tig=sl
どんだけ SL 好きなんだよ

## .zshrc の改造
alias 直接打ってたらターミナル開き直せばいいのだが .zshrc に書いてくるとは。
dotfiles の git で diff を削除。


## alias vim=sl
普段 gvim 使うので気づくの遅れた。
ちなみに `\vim` みたいに shell コマンドの手前に バックスラッシュ入れると alias のかかってない実行ができる。

## alias ls=hihumi
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">トラップコマンドにエイリアストラップかけられた時の<a href="https://t.co/osIai0Jb4e">https://t.co/osIai0Jb4e</a> <a href="https://t.co/TPepRBHp29">pic.twitter.com/TPepRBHp29</a></p>&mdash; [Elzup] (@_elzup_) <a href="https://twitter.com/_elzup_/status/804871858914889728">2016年12月3日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
https://github.com/munisystem/hihumi
瀧本ひふみと見せかけて加藤一二三先生がでるコマンドなのに。
これじゃ ls で唐突におっさんが出てくるだけである。


## alias ls=terminal-pallot

![Screenshot 2017-01-18 15.58.33.png](https://qiita-image-store.s3.amazonaws.com/0/40717/cb4ccfea-ef0c-5943-9495-5c62dfbf4381.png "Screenshot 2017-01-18 15.58.33.png")
https://github.com/jmhobbs/terminal-parrot
閉じられない〜〜〜!ってなった。(あとからわかったけど Esc で閉じれる)

俺の ls コマンドは話題のネタコマンドを紹介する場所じゃない。

# 犯人を特定する
犯行現場を激写する。

## 方法
imagesnap コマンドを使う。
参考: http://krakenbeal.blogspot.jp/2014/06/mac-os-x-isight.html

vim, alias コマンドに狙い目をつけて罠を張る。 

```
alias vim="imagesnap -q ~/Pictures/zainin/camera_\`date +%Y-%m-%d_%H%M%S\`.jpg && vim"
alias alias="imagesnap -q ~/Pictures/zainin/camera_\`date +%Y-%m-%d_%H%M%S\`.jpg && alias"
```

zainin フォルダに保存される仕組にできた。

動作チェック
![res.png](https://qiita-image-store.s3.amazonaws.com/0/40717/65be24f6-95d6-e85b-fc6a-9cb557f80e03.png "res.png")


## 結果

![Screenshot 2017-01-20 22.19.11.png](https://qiita-image-store.s3.amazonaws.com/0/40717/06aaecb4-f1f5-131d-84ab-a70ffb5e304d.png "Screenshot 2017-01-20 22.19.11.png")
ついにトラップにひっかかったものが出たようだ。

↓zainin ディレクトリ
![Screenshot 2017-01-20 22.31.34.png](https://qiita-image-store.s3.amazonaws.com/0/40717/8eeb50d2-9a39-5ce6-845c-d1e6925b850c.png "Screenshot 2017-01-20 22.31.34.png")

一瞬犯人の黒いオーラによって罠が通用しなかったのかと思ったが、頭が近づいた瞬間に撮影したみたいで全体的に暗かった。しっかり識別できる画像を撮れていた。 :tada: 

# まとめ
少し席はずす時でも PC ロックしろ。
Amazon EC2 Run Commandでコマンド発行から結果出力まで1アクションで実施

slackからhubot経由でEC2インスタンスにコマンドを発行し結果を返したい。
以前は力技のsshで実施していたのをEC2 run commandに置き換えてみた。

# Run Commandについて
* `send-command` を実行しても結果は返ってこない
* 実行結果を知るには`command id`を元に`list-command-invocations`を叩きStatusを確認する
 * StatusがSuccessになるまでポーリングする必要がある。
 * nodeの場合は`bluebird-retry`でポーリングする様にできそう

# coffeescript のサンプル
* hubotからコマンド結果表示も確認済み
 * bluebird-retryで`checkStatus`関数を必要なだけ呼び出して結果を取得する
* `hostname`コマンドを発行して結果を返すだけの例

```coffeescript

AWS = require('aws-sdk')
AWS.config.region = 'ap-northeast-1'
ssm = new AWS.SSM()
Promise = require('bluebird')
retry = require('bluebird-retry')
Promise.promisifyAll(ssm)

checkStatus = (id) ->
  params =
    CommandId: id
    Details: true
  ssm.listCommandInvocationsAsync(params).then (res, err) ->
    throw err if err      
    if res.CommandInvocations[0].Status == 'Success'
      return res
    else
      throw new Error "#{res.CommandInvocations[0].Status}"

params =
  DocumentName: 'AWS-RunShellScript'
  InstanceIds: ['i-***']
  Parameters:
    commands: ['hostname']
ssm.sendCommandAsync(params).then (sendRes, sendErr) ->
  if sendErr
    console.log sendErr
    throw sendErr
  else
    console.log sendRes
    sendRes
.then (data) ->
  retry(checkStatus, { args: [data.Command.CommandId], max_tries: 5, interval: 1000 })
.then (data) ->
  console.log "SUCCESS:", JSON.stringify(data, null, 2)
.caught (err) ->
  console.log "ERROR:", JSON.stringify(err, null, 2)
.catch (err) ->
  console.log "ERROR:", JSON.stringify(err, null, 2)
```
Fedora24, 25 でハイバネートできないのを解消する設定

Fedora 24, 25 でハイバネーションしたくて、 `systemctl hibernate` しても、起動したときに状態が保持されていない。

`/etc/default/grub` の GRUB_CMDLINE_LINUX の文字列の前のところに、`resume=/dev/mapper/swap` を追加する。
swap のパスは、 `cat /etc/fstab` あたりを参考に。

起動時のGRUB2のファイルを更新する必要があるので、BIOS上で起動しているなら、 `sudo grub2-mkconfig -o /boot/grub2/grub.cfg` 、EFI上で起動しているなら、 `sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg` を実行する。


## See also

* https://fedoraproject.org/wiki/Common_F25_bugs#Hibernation_doesn.27t_work_from_a_standard_install
* https://fedoraproject.org/wiki/Common_F24_bugs#Hibernation_doesn.27t_work_from_a_standard_install