OmniAICreator/Qiita-1.07M huggingface dataset:
Canvasの解像度


https://codepen.io/mo4_9/pen/eRYRRZ

解像度2倍
= 750pxのcanvasをつくって、375pxで表示

```javascript
canvas.width = 750px
ctx.scale(2,2);
canvas.style.width = 375px
```

となればいい。

```javascript
const dpr = window.devicePixelRatio || 1;

function onWindowResize() {
    width = window.innerWidth;
    height = window.innerHeight;
    
    canvas.width = width * dpr;
    canvas.height = height * dpr;
  
    ctx.scale(dpr,dpr);
    
    canvas.style.width = width + 'px';
    canvas.style.height = height + 'px';
}
```

canvasが重くなければ、
`const dpr = window.devicePixelRatio || 1;`
で解像度ぴったりのcanvasを描画

逆にcanvasが重い場合は、
`dpr = 0.5`などで強制的に解像度を下げる。


> 参考
https://codepen.io/mo4_9/pen/LyXzob
http://dotinstall.com/lessons/basic_canvas_v2/39905
VagrantによるLAMP環境構築手順


# はじめに
　ここでは以下の最短手順を紹介する。作業環境は、全てターミナル or コマンドプロプトで行う。

* Vagrantのセットアップ
* LAMP環境のインストール
* ブラウザで表示を確認


前提
以下がマシンに既にインストール済みであること。
僕の環境は、virtualBox(5.0.32)、Vagrant（1.9.1）だが、最新バージョンでも手順は変わらないはず。

* VirtualBox
* Vagrant



## 1. Vagrant Setup
ここでは、Ubuntsu 16.04を使う。

### Ubuntsu 16.04のBoxを追加
　vagrantにUbuntsu 16.04を登録。

```
vagrant box add xenial64 https://atlas.hashicorp.com/ubuntu/boxes/xenial64/versions/20160521.0.0/providers/virtualbox.box
```


### Boxに追加されているか確認
Ubuntsu 16.04が追加されていたら、`xenial64 (virtualbox, 0)`が出力される。

```
vagrant box list
```



### 仮想環境を構築したいディレクトリへ移動

```
cd なんとか
```

### ディレクトリをvagrantで初期化
 仮想環境を構築するディレクトリへ移動が終わったら、Ubuntsu 16.04で初期化。（フロントエンドでいう、npm initみたいなイメージ）
`vagrant init xenial64`が完了すると、Vagrantfileという設定ファイルが生成されていることが確認できる。

```
vagrant init xenial64
```

### OSを起動する

その後、Vagrantfileと同じディレクトリで、`vagrant up`コマンドを打つと、Vagrant上のUbuntsuOSが立ち上がる。

```
vagrant up
```

　これでPCの中にUbuntsuの仮想環境ができた。
しかし、この状態はOSが立ち上がっただけで、中身は空っぽ。（初めて買ったばかりのPCに、chromeやAdobeが入っていないのと同じイメージ）
このままでは、Webサーバーとしては使えないため、ApacheやPHP, MySQL等（LAMP環境）をインストールする。



# 2. LAMP環境の構築

　ここからは立ち上げたUbuntsuで作業をする。
Vagrantfileがあるディレクトリまでターミナル or コマンドプロンプトで移動


### sshログイン

```
vagrant ssh
```

### LAMP（Apache, MySQL, PHP）環境をインストール
　MySQLのパスワードを聞かれるので、任意のパスワードを指定。

```
sudo apt-get install tasksel
sudo tasksel install lamp-server
```

### CURLとPHPの拡張をインストール

```
sudo apt-get install curl php-curl php-mcrypt php-mbstring php-gettext
```

```
sudo apt-get install zip
```


### PHPの拡張を有効化
```
sudo phpenmod mcrypt
sudo phpenmod mbstring
sudo a2enmod rewrite
```

### Apacheの再起動
```
sudo systemctl restart apache2
```

　ここまでやると、LAMP環境が構築できた。設定の更新するため、`sudo systemctl restart apache2`を行う。いったん`exit`コマンドでsshログインから抜ける。


## ブラウザからアクセスして確認する。
　そのままでは、ブラウザから確認できない。

### Vagrantfileを編集する
　Vagrantfileの以下をコメントアウトして、ブラウザからのアクセスを許可する設定に変更

```
# config.vm.network "private_network", ip: "192.168.33.10"

↓ コメントアウト

config.vm.network "private_network", ip: "192.168.33.10"
```

### Vagrantfileを更新したので、更新を反映させる

```bash
vagrant reload #Vagrantの設定をリロード
```

以下でもOK。

```bash
vagrant halt #Vagrant停止
vagrant up   #Vagrant起動
```

### ブラウザからhttp://192.168.33.10 へアクセス
成功していたら、以下のようなページが表示される。

![default_apache.png](https://qiita-image-store.s3.amazonaws.com/0/104234/b2acf599-dca5-4ae5-cfb3-27c83eef0699.png)
Makefileで依存パッケージの更新をしてほしいときだけdep ensureさせる

私は普段、GoのソースをビルドするMakefileに`dep ensure`で依存解決するターゲットを書いてます。

チーム開発時は、このターゲットをビルド前に必ず呼び出すようにしていて、依存パッケージがメンバー全員の開発環境で常に最新になるようにしています。

ただ毎回、ビルド時にこれをやってしまうと、環境次第でビルドが遅くなってしまうので、せっかくGoのコンパイルは速いのに残念な感じでした。

そこで、一度`dep ensure`したら、Gopkg.lockのチェックサムを保存し、次回の依存解決はチェックサムが変わるまでやらないようにしています。

```Makefile:Makefile
VENDOR_MD5 := $(shell if [[ -f vendor/lock.md5 ]]; then cat vendor/lock.md5; fi)
GOPKG_MD5 := 
ifneq ($(shell type md5 2> /dev/null),)
GOPKG_MD5 :=  $(shell md5 -q Gopkg.lock)
endif
ifneq ($(shell type md5sum 2> /dev/null),)
GOPKG_MD5 :=  $(shell md5sum Gopkg.lock | sed -E 's/ .*//g')
endif


.PHONY:	build vendor


build: vendor
	go build -i -o piyo ./*.go


vendor: dep-install
ifneq ($(VENDOR_MD5),$(GOPKG_MD5))
	dep ensure
ifneq ($(shell type md5 2> /dev/null),)
	md5 -q Gopkg.lock >| vendor/lock.md5
else ifneq ($(shell type md5sum 2> /dev/null),)
	md5sum Gopkg.lock | sed -E 's/ .*//g' >| vendor/lock.md5
else
	@echo vendor/lock.md5 was not created 1>&2
endif
else
	@echo vendor/ is already up-to-date
endif


dep-install:
ifeq ($(shell type dep 2> /dev/null),)
	go get -u github.com/golang/dep/...
endif


dep-ensure: dep-install
	dep ensure
```

めでたし

md5のチェックをせずに`dep ensure`をする場合は`make dep-ensure`します。（その場合は普通に`dep ensure`すればいいのだけど）
Zabbix: イベント情報の表示を省略させない。

# 問題点

ZABBIXのダッシュボードやトリガー画面やイベント画面で、SNMPTRAP等のイベント情報が全文表示されない。
結局、マウスクリックで画面遷移(２～3画面)しないと、SNMPTRAPの全貌が分からない(見えない)。
これって、非常に非効率。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/eb3e4421-186e-3e82-2238-83d5bc3de557.png)

# 検証した環境

* zabbix3.0(zabbixオフィシャルリポジトリ使用)

# やったこと

ZABBIXのダッシュボードやトリガー画面やイベント画面で、画面遷移なく、SNMPTRAPのイベント情報を参照可能にする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/2e11d0b8-0d31-627d-21e5-7b0566353f86.png)

ダッシュボードでアラーム内容が把握できる!!
ダッシュボード以外でも、トリガ・イベント画面でも同様に全文が一度に確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/2a6f71ce-d6a9-645a-7394-c1b4a51e9016.png)

# 実際の変更点ところ

/usr/share/zabbix/include/items.inc.phpを修正。
標準だと、20文字以上あれば、"..."で表示を打ち切るようになっているので、
そこを強引に、20->400文字とかに変えてしまう。
※つまらないオチで申し訳ございません。これだけです。

```ruby:diff
--- /usr/share/zabbix/include/items.inc.php.original    2017-05-22 19:42:51.748714884 +0900
+++ /usr/share/zabbix/include/items.inc.php     2017-05-22 20:09:09.535936472 +0900
@@ -929,8 +929,8 @@
                // break; is not missing here
                case ITEM_VALUE_TYPE_TEXT:
                case ITEM_VALUE_TYPE_LOG:
-                       if ($trim && mb_strlen($value) > 20) {
-                               $value = mb_substr($value, 0, 20).'...';
+                       if ($trim && mb_strlen($value) > 400) {
+                               $value = mb_substr($value, 0, 400).'...';
                        }

                        if ($mapping !== false) {
```

# 問題点

一目でわかるようになったけど、そもそもzabbixのコンテンツででかいですよね。
「表示速度遅い」とか「監視の分際で回線流量使ってんじゃねーよ」とか言われていたのが、ますます言われるようになってしまいます。

# 上記問題点の対処(httpサーバでコンテンツ圧縮)

mod_deflateで、コンテンツ圧縮してあげます。
参考：[Apache モジュール mod_deflate](https://httpd.apache.org/docs/2.4/ja/mod/mod_deflate.html)

今回のダッシュボード(最小レベル)だと、15KB->3KBになりました。
実際に運用すると、トラップ量は増える(多分)ので、劇的なコンテンツサイズ縮小が図れると思います。

zabbix使ってると、リソース(回線・メモリ・ディスク(iops))に困ったことはあるけど、CPUリソースには困ったことない。
だから、zabbixとコンテンツ圧縮はとても良い組み合わせかもしれない。

# 対処の実際


```ruby:/etc/httpd/conf.d/zabbix.conf
<Directory "/usr/share/zabbix">
     ...省略...
    <IfModule mod_php5.c>
     ...省略...
    </IfModule>
    <IfModule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/html
    </IfModule>
</Directory>
```

上記のように、zabbix用のDirectoryディテクティブに、以下を追記するだけ。

```
    <IfModule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/html application/json application/json-rpc text/javascript
    </IfModule>
```
Ubuntu では g++ に指定するライブラリの順番に気を付けないと undefined reference

参照されるライブラリは後ろに書かないといけないらしい。
https://lists.ubuntu.com/archives/ubuntu-devel/2010-November/031991.html
http://www.hakodate-ct.ac.jp/~tokai/tokai/gtkmm/etc/p1.htm

コマンドライン、Makefile、CMakeでのそれぞれ回避策は以下の通り。

```bash:.bashrc
alias g++='g++ -Wl,--no-as-needed'
```

```Makefile:Makefile
 LDFLAGS=-Wl,--no-as-needed
```

```CMakeLists.txt
 set (CMAKE_EXE_LINKER_FLAGS -Wl,--no-as-needed) 
```
CSSで、画面幅・高さから一定の値を引く計算をさせたい

# 画面幅・高さに応じてwidth・heightを変える
heigtなら、ヘッダーとフッターの高さは固定、画面いっぱいの高さからその二つを引いた値をボディの高さとする方法。

例えば画面高さいっぱいから、300px引いた値をボディの高さとしたい時。
(ヘッダー・フッターのheightが共に150pxとか)

```css:失敗
.hoge {
    height: 100% - 300px;
}
```

だと、「Incompatible units: 'px' and '%'.」とエラーが出る。
こういう時は```calcメソッド```を使う。

```css:成功
.hoge {
    height: calc(100% - 300px);
}
```

widthなら、サイドバーを引いた値をボディの幅にしたい時とかに使えそう。
Molokai for TeraTerm

teratermの色をmolokai風に

TERATERM.INIに下記のANSIColorを追加。既定の値はコメントアウト。

<pre>
; molokai
ANSIColor=0,27,29,30, 1,249,38,114, 2,130,180,20, 3,253,151,31, 4,38,139,210, 5,140,84,254, 6,86,194,214, 7,204,204,198, 8,80,83,84, 9,255,89,149, 10,183,235,70, 11,254,237,108, 12,98,173,227, 13,191,160,254, 14,148,216,229, 15,248,248,248
</pre>

フォントは`inconsolata` だと見やすいと思います。
サーバ上の設定情報変えられないときとかに。

イメージ↓
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/121456/daf00735-00b6-372a-2a06-aba019bbc13c.png)
Redshiftのキューが詰まり気味かどうか確認する

`stl_wlm_query`を見れば、クエリがキューに入ってた時間と、実行にかかった時間がわかる。

http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STL_WLM_QUERY.html

なので、クエリにかかった総時間のうち、キューに入ってた時間の占める割合が多く、かつ計算リソースがあまり気味な場合、WLMの`query_concurrenty`を上げることでクエリのリードタイムを短くできる余地がある。

http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/workload-mgmt-config.html

## 例

たとえば以下のようなクエリを投げると、

```
30sec以上かかったクエリの、キューに入ってた時間と実行にかかった時間、および総時間を、開始時間の降順で300件
```

が出せる

```sql
select 
  r.starttime,
  r.query,
  l.total_queue_time / 1000000.0 as total_queue_time_sec,
  l.total_exec_time / 1000000.0 as total_exec_time_sec,
  (r.endtime - r.starttime) / 1000000.0 as total_time_sec,
  substring(r.querytxt, 0, 100) as query_summary from 
    stl_wlm_query l inner join stl_query r on l.query = r.query 
  where l.total_exec_time > 30000000 order by r.starttime desc limit 300;
```

```
        starttime          |  query  | total_queue_time_sec | total_exec_time_sec | total_time_sec |             query_summary
---------------------------+---------+----------------------+---------------------+----------------+------------------------------
2017-05-22 09:59:45.759782 | 1234577 |          33.60106500 |         88.78451400 | 122            | select col1, col2 from ...
2017-05-22 09:59:45.463301 | 1234576 |           0.10747800 |         88.11247500 | 88             | select col1, col2 from ...
2017-05-22 09:59:39.08331  | 1234575 |           3.68974900 |         37.37480700 | 41             | select count(* ...
2017-05-22 09:58:57.252807 | 1234574 |          41.63762000 |         94.75934300 | 136            | select col1, col2 from ...
2017-05-22 09:58:13.491151 | 1234573 |          44.95999800 |         47.11964700 | 92             | select count(* ...
2017-05-22 09:58:07.478298 | 1234572 |           5.92790200 |        125.95480500 | 131            | select col1, col2 from ...
2017-05-22 09:58:07.40917  | 1234571 |           1.22832300 |         48.45053400 | 49             | select count(*...
2017-05-22 09:57:09.519421 | 1234570 |          57.54272200 |        132.29861800 | 189            | select col1, col2 from ...
2017-05-22 09:56:53.672369 | 1234569 |          17.04953400 |         56.55392900 | 73             | select count(* ...
2017-05-22 09:56:34.059251 | 1234568 |          19.30138300 |        168.04979700 | 187            | select col1, col2 from ...
2017-05-22 09:56:20.419248 | 1234567 |          14.83418200 |         34.10228000 | 48             | select count(* ...
...
```
先週 (2017-05-15) の振り返りと今週 (2017-05-22) の動きについて

# 先週 (2017-05-15) の振り返り
## TODO(計画)
 * 時間配分
   * 業務後
     * 3 × 平日5日 + 休日 8h = 23時間
   * 電車内
     * 2 × 平日5日 = 10時間




 * RailsTutorial
   * 10章目安(いければ)




 * 読み物
   * 12fac
   * リーダブルコード
   * WEBを支える技術




## 結果
 * 業務後
   * 平均 2? × 平日5日 + 休日 8h = 18時間→これが100%なので、これを基準にする。
 * 電車内(乗り換え含め)
   * 1.5 × 平日5日 = 7.5時間




 * RailsTutorial
   * 7章まで完了
     * テストなどの自分があまり理解を深められていないところに時間を割いた
     * 14まで終わらせるのではなく、取捨選択していきたい。
       * これらを全部やるのではなく、飛ばしてもいいのをお願いする。




 * 読み物
   * 12fac →全部見終わる。
     * 今後順次実務と絡めつつ復習(予定)
   * リーダブルコード
     * p70ほど(全体の3割程度)
     * 変に読み込んでしまった。
       
# 今週 (2017-05-22) の計画


* 業務後
  * 平均 2 × 平日5日 + 休日 8h = 18時間→これが100%なので、これを基準にする。
* 電車内
  * 1.5 × 平日5日 = 7.5時間




* RailsTutorial
  * 先週5章ほどだったので、12(5章分)を目標に
  * 重点的にやるところは下記二点
    * 自分があまり理解を深められていないところ
    * 取捨選択をしてもらったところ




* 読み物
  * リーダブルコード
    * すべて(ガッツリは読まない)
      * 残りp140 / 5 = p28
  * webを支える技術
    * p100/300 を目標に
      * 12facを読みながらのリーダブルを基準においた。(p70)
      * 土日に100を読みたい。
 
追記:先週、今週みたいな相対的な表現だと後で見づらいので、絶対的な日付をつけるようご指摘いただいた。ありがたい。
SSLサーバー証明書の申請～設定方法

# 環境
CentOS
Apache

# 秘密鍵とCSRの生成

### 作業フォルダに移動
```cd /etc/pki/tls/certs/hoge```

### 秘密鍵を作成します。
```openssl genrsa -des3 -out （秘密鍵ファイル名） 2048
（パスフレーズ）
```shell

### CSRを作成します。
```
openssl req -new -key （秘密鍵ファイル名） -out （CSRファイル名）
（パスフレーズ）
```

### ディスティングイッシュネームを登録します。
```shell
Country Name (2 letter code) [AU]:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
A challenge password []:
An optional company name []:
```

# SSL証明書の申請を行う
省略…

# SSLサーバー証明書の設定
### 証明書をサーバへ配置します。
```
touch （SSLサーバー証明書ファイル名）

-----BEGIN CERTIFICATE-----
＜サーバー証明書＞
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
＜中間CA証明書＞
-----END CERTIFICATE-----
```

WebサーバはApacheのため.confファイルに以下を記載します。

```shell
SSLEngine on
SSLCertificateFile （SSLサーバー証明書配置パス）
SSLCertificateKeyFile （パスフレーズなしの秘密鍵ファイル配置パス）
```

### Apacheの再起動
```shell
service httpd stop
service httpd start
```
テイラー展開を描いてみる

テイラー展開ってなんやねん。
ってことで`sympy` で描いてみた話。

legendがやたら長くて収まりが悪いのはご愛嬌。
`matplotlib` を `sympy.plotting` 経由で描かないとならないのでちょっとめんどくさい。

```py3
from sympy import sin, exp, plotting
from sympy.abc import x, y
from functools import reduce
import operator
import itertools

import seaborn as sns
sns.set_palette(sns.color_palette("Set1", 16))
sns.set_style('whitegrid')
col = sns.color_palette()

f = sin(x)
#  もしくは
#f = exp(x)

x0 = 0

def series(fx, x0=0, n=6):
    y = fx.series(x0=x0, n=None)    # x０周りのテイラー展開
    # n=None だと generator を返すので
    return reduce(operator.add, itertools.islice(y, n))    # 第n項まで抜き出す

def explot(fx, x0, i):
    if x0 == 0:
        title = "%s / Maclaurin series " % (fx)
    else:
        title = "%s / Taylor series(x=%f)" % (fx, x0)
        
    return plotting.plot(fx, (x, -10, 10), line_color=col[i], ylim=(-10, 10), title=title, show=False, legend=True, axis=True)

# 元の関数
p0 = explot(f, x0, 0)

# テイラー展開
for i in range(1, 8):
    p = explot(series(f, x0=x0, n=i), x0, i)
    p0.extend(p)

p0.show()
```

# *sin(x)* のマクローリン展開
![sin.maclaurin.png](https://qiita-image-store.s3.amazonaws.com/0/41925/626c181e-8550-bb19-0a26-7716647dae23.png)

# *sin(x)* の *x=5* 周りのテイラー展開
![sin.taylor5.png](https://qiita-image-store.s3.amazonaws.com/0/41925/099d5815-d5a9-9a2e-e3b1-7baf8e494ad5.png)

# *sin(x)* の *x=π* 周りのテイラー展開
![sin.taylorPi.png](https://qiita-image-store.s3.amazonaws.com/0/41925/df87d24e-d189-6ab3-b211-306202841d9f.png)


# *exp(x)* のマクローリン展開
![exp.maclaurin.png](https://qiita-image-store.s3.amazonaws.com/0/41925/1cc6abd0-3763-e560-4337-2914d0a5054c.png)

# *exp(x)* の *x=2* 周りのテイラー展開
![exp.taylor2.png](https://qiita-image-store.s3.amazonaws.com/0/41925/523290c6-a264-0477-af14-8c2c5fd1e7d6.png)
Hive(EMR)+S3でMoving data to... Failed with exception Unable to move source s3...が出る場合の対処

ちゃんとログ見ればすぐ気づくことだったけど…

EMRでHadoop+Hive。

```
CREATE TABLE [[テーブル名]] STORED AS ORC location 's3://[[s3パス]]' TBLPROPERTIES('EXTERNAL'='TRUE', 'orc.compress'='zlib') AS SELECT * FROM [[テーブル名]]
```

```
Moving data to directory s3://[[s3パス]]
Failed with exception Unable to move source s3://[[s3パス]]/hoge/fuga...
```

INSERT INTO テーブル名 SELECT...

は通るのになんでやねん。と思ってたら。

```
No Such File or Dir s3://[[s3パス]]/hoge
```

えっ

まさかと思い手動でhogeオブジェクトをs3上に作成。
通るようになりました。

s3のputとかはオブジェクトまでのパスがなくても勝手に作ってくれるからそこを疑いもしなかったのと、EMR上でのHiveの詳細なログがターミナルで操作した場合どこに吐かれるのかわからんかったせいでドハマりした。

最終的には全く別チームが作っていたEMRにjdbc接続して(HiveServer2)HQL投げるって機構があったおかげで、/mnt/var/log/hive/hiveserer2.logにバックトレースが吐かれたので気づけた。
ターミナルからやるとここに吐かれないからわからないんだよね… どっかに吐かれるのかなあ
CircleCI 1.0でbundlerのバージョンを明示的に指定してテストを実行する

### 背景

- どうしてもCircleCI 1.0でbundlerのバージョンを指定（今回はダウングレード）してテストを実行する必要があったので調べました。
- CircleCI 1.0のbundlerのバージョンは`1.15.0`
- これを`1.13.7`にしてテストしたいという話です。

### 解決策

下記の公式ドキュメントに解決策がありました（2017/10/31追記）
https://circleci.com/docs/1.0/configuration/#bundler

- circle.ymlに下記を追加する。

```yaml:circle.yml
dependencies:
  pre:
    - gem uninstall bundler
    - gem install bundler -v 1.13.7
```

- 見たままですが、いったんbundlerをuninstallした後にバージョン指定してinstallし直すと。

### 参考

https://discuss.circleci.com/t/bundler-1-11-0-error-solved-by-1-11-2-version-fix-release/1094/10
HTML5 "コンテンツモデル" と "カテゴリー" について

![eye_html5.png](https://qiita-image-store.s3.amazonaws.com/0/20635/75b3d428-7bf0-76ea-73cc-862191efef53.png)

##したいこと
SEOを考慮したマークアップがしたい。
そこで
HTML5のカテゴリーと、コンテンツモデルの考え方についてまとめてみました。


##コンテンツモデルとは？　
どの要素にどの要素を入れてよいかを定義した**”ルール”**

##カテゴリーとは？
各要素が**主要な7つ+以外3つ**に分類されたことを指す

##つまり
**カテゴリー**に分類された要素を、
**コンテンツモデル**というルールに基づいてマークアップをする ということです。

##必要な知識
1、各要素がどのカテゴリーに属してるか知る
2、コンテンツモデルの5つのルールを知る

##1、各要素がどのカテゴリーに属してるか知る
**主要な７つのカテゴリー**
1. フロー・コンテンツ
2. フレージング・コンテンツ
3. セクショニング・コンテンツ
4. ヘディング・コンテンツ
5. エンベデッド・コンテンツ
6. インタラクティブ・コンテンツ
7. メタデータ・コンテンツ
**上記７種類以外のカテゴリー**
1. フォーム関連の要素
2. セクショニング・ルート
3. カテゴリーに属していない要素

[細かい説明と図はこちらの記事を参考にして下さい](http://scene-live.com/page.php?page=6)

##2、コンテンツモデルの5つのルールを知る
1. 入れてよいカテゴリーが決まっている
2. 何も入れてはいけない
3. 特定の要素が入る
4. トランスペアレント
5. 子孫まで制限される

[細かい説明とsampleはこちらの記事を参考にして下さい](http://scene-live.com/page.php?page=7)

##まとめ
覚えることが**多すぎる！？**ので　

各要素のカテゴリーと、コンテンツモデルのルールをある程度知りながら
意識してマークアップをするのが大事かなと思いました。（私は、"確認する時間を設ける"で対応中）
後は、量をこなす（ググる→使う→忘れる→ググる→使う→忘れる→ググる→使う→....）を繰り返せば覚えるはずです。

更に詳しく知りたい場合は、この本がおすすめです。
[徹底解説HTML5マークアップガイドブック](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%ACHTML5%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%82%AC%E3%82%A4%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E7%BE%BD%E7%94%B0%E9%87%8E%E5%A4%AA%E5%B7%B3/dp/4798025291)
iPhoneのメッセージをMacにバックアップする方法

#iPhoneのSMS・MMS・iMessageをMacにバックアップする
iPhone上のメッセージアプリは色んなプライバシー情報や貴重な思い出が載っています。非常に重要な機能でしょう。
ところが、このようなメッセージがなくなったら、大変でしょう。なので、このようなことを避けるため、iPhone上のSMS・MMS・iMessageをMacにバックアップする方法、いまなら、ご紹介します。

そこで、ある便利なツールをおすすめします。これはAnyTransです。

AnyTransはiPhone向けのデータ転送ソフトで、iPhoneのデータをPC・ほかのiOSデバイスに移行する時、かなりお役に立ちます。
詳しくはAnyTransの公式サイトで参考してください：
https://www.imobie.jp/anytrans/

以下はこのツールを使って、iPhoneのメッセージをMacにバックアップする方法をご紹介します。

ステップ１：　AnyTransをダウンロードして指示に従って、Macにインストールします。
ステップ２：　AnyTransを起動　＞　iPhoneをUSBケーブルで「メッセージ」管理画面に入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144302/b662754d-2c69-c1c3-384e-9267b267f428.png)
ステップ３：　iPhoneのメッセージ（SMS・MMS・iMessage）をプレビュー＆選択　＞　右上の「PCへ転送」ボタンをクリックします。これで、iPhone上のメッセージはMacにバックアップしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144302/e72cc11c-a1dc-2aae-4946-a57999aba082.png)



以上です！
元記事：
http://bit.ly/2rK0cpt
NVIDIAのドライバをインストールする

## はじめに
Nvidia-DockerとかCUDAとかを使うときには、NVIDIAのドライバが必要ですね。
しかしデフォルトでインストールされているのはnouveau(ヌーボー)という別のドライバなので、自分でインストールし直す必要があります。
こないだCentOS7にそれをインストールしたので、せっかくだからやり方をメモ。

## 手順
#### 1. 必要なパッケージのインストール

```bash
$ sudo yum -y update
$ sudo yum -y install kernel-devel kernel-headers gcc make git pciutils tmux
```

#### 2. nouveauの無効化

```bash
#nouveauがロードされているかを確認 (以下のような表示が出ればOK)
$ lsmod | grep nouveau
nouveau              1403757  0
video                  24400  1 nouveau
mxm_wmi                13021  1 nouveau
i2c_algo_bit           13413  1 nouveau
drm_kms_helper        125008  1 nouveau
ttm                    93441  1 nouveau
drm                   349210  3 ttm,drm_kms_helper,nouveau
i2c_core               40582  5
drm,i2c_i801,drm_kms_helper,i2c_algo_bit,nouveau
wmi                    19070  2 mxm_wmi,nouveau
```

```bash
# rootユーザに切り替え
$ sudo su
# nouveauなしの起動イメージを生成
$ mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
$ dracut --omit-drivers nouveau /boot/initramfs-$(uname -r).img $(uname -r)
# nouveauがロードされないように封印
$ echo 'blacklist nouveau' >> /etc/modprobe.d/modprobe.conf
$ echo 'blacklist nouveau' >> /etc/modprobe.d/nouveau_blacklist.conf
# 再起動
$ reboot
# nouveauがロードされていないことを確認 (何も表示されなければOK)
$ lsmod | grep nouveau
```

#### 3. GPUの型番を確認 (\[ \]の中がGPUの型番に該当)

```bash
$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GF119 [NVS 310] (rev a1)
```

#### 4. GPUに合ったドライバのインストーラをダウンロード
NVIDIAドライバダウンロードサイト(http://www.nvidia.co.jp/Download/index.aspx?lang=jp) から、3.で見つけたGPUの型番に合うドライバのインストーラ (NVIDIA-XXX.run) をダウンロードし、それを/tmp/に置きます。

#### 5. ドライバのインストール

```bash
# ディレクトリ移動
$ cd /tmp/
# ランレベルを変更
$ sudo init 3
# nvidia-dockerを停止 (動かしていた場合)
$ sudo systemctl stop nvidia-docker
# インストーラを実行 (実行後は指示に従っていけばOK)
$ sudo bash NVIDIA-XXX.run
# 再起動
$ reboot
```

再起動した結果いつも通りデスクトップが立ち上がったのなら、ドライバのインストールは成功です。

## ドライバの再インストール
yumのアップデートでカーネルのバージョンが上がった場合は、ドライバが正常に動作しなくなり、Xのサーバが起動しなくなります。それに伴って、デスクトップが表示されなくなってしまいます。(CUIやSSHは問題なく使えます)
これを直すには、ドライバを再インストールする必要がありますが、これも上と同じ手順でOKです。
(インストーラの実行中に「古いドライバをアンインストールして新しいドライバをインストールするか」を聞かれるので、そこでyesを選んでください)

## おわりに
順番通りにやれば問題なくできる…はず。
インストーラの選び間違いにだけは注意です。(間違ってたらインストールできません)
当たり前な話ですが一応言っておくと、NVIDIAのドライバはNVIDIAのGPUを積んでるマシンにしか使えませんよ。例えばGPUがIntel製だった場合には使えません。
Circle CI のAPIを使って、ターミナルからリリース

Circle CI + GitHubでの自動デプロイをちょっといじった。

世の中はChatOpsとかが流行っているけど、ターミナルは常に開いているのでこれで良しとした。

# 経緯

今まで、Gitフローで

`master`ブランチにマージ => `staging`環境にデプロイ
`release`ブランチにマージ => `production`環境にデプロイ

ということをやっていたが、 `master -> release` のプルリクが面倒になってきたので
`master` にマージしたら反映されるようにしたい。

ただ、masterにプッシュしたら即productionに反映されるのはちょっと困ることがあるので
CircleCIのAPIを使って手動でキックして本番環境に反映するようにした。

# やったこと

下記のスクリプトを実行すれば、productionにデプロイされる。

```bash:ci/release.sh
#!/bin/bash

curl -X POST --header "Content-Type: application/json" -d '{
  "build_parameters": {
    "DEPLOY": "true"
  }
}
' 'https://circleci.com/api/v1.1/project/github/organization/project?circle-token=トークン'
```

デプロイのスクリプトで、環境変数 `$DEPLOY` の有無で本番に反映するか分岐させている。

```bash:deploy.sh
# 本番環境の場合、環境変数DEPLOYが有った場合のみ処理を行う。
# CircleCIのAPIを使ってリリースする前提。
[ -n "$DEPLOY" ] || exit 0
```
H2databaseコンソール(H2コンソール)の使用方法

H2を使っている人はJava開発環境なので、あまり人気があるDBとは言えないけれど他のDBとの互換性が高く、それなりに速度も速いし個人的には取扱いやすいので好んで使ってます。
H2databaseのコンソール(H2コンソール)の使用方法を良く忘れるので備忘録として残しておきます。

# H2を使うメリット

・組み込みモードとサーバモードの両方をサポートしている
・性能はSQLiteと比べれば劣るようであるがDerbyよりは早い(らしい)
・「Pure Java」で書かれているのので基本的にJava(JVM)が動作する環境であれば動くのとバイナリサイズが小さいので組み込み用途に最適
・特にDropwizard、SpringBoot、PlayFramework等のJava系フレームワークとの相性はすごく良いと思う
・GUI(Web)のコンソールが標準で用意されている(※今回の説明する使い方はこれ)
・他のDB(PostgreSQL等)と互換性が結構高い(SQLiteと違って日付型とかちゃんとある)

# 準備

組み込みモードでH2に接続しているアプリケーションが起動している場合は停止する

# コンソール起動

```
$ java -cp h2-xxx.jar org.h2.tools.Server -webAllowOthers
※「-webAllowOthers」の指定するとlocalhost以外からのHTTPアクセスを許可する
```

# Webコンソール表示

先述のコマンドでブラウザが自動で起動するが、手動で接続する場合は任意のWebブラウザで以下のURLへアクセス

```
http://<H2DB-IP>:8082/
```

# DB接続

「JDBC URL:」の値に以下を設定(他は初期値のまま)して接続ボタンを押下

```h2:組み込みモードの場合
jdbc:h2:./<DBファイル名>
```

```h2:サーバーモードの場合
jdbc:h2:tcp://<H2DB-IP>:/~/<DBファイル名>
```
左のツリービューにテーブル一覧が表示されれば接続成功

# 使用方法

「SQLステートメント:」に

```
select * from <テーブル名>
```

を入力して「実行」ボタンを押下し、テーブルの内容がグリッド表示されれば成功
pandas, seaborn による可視化メモ

#データセットの可視化
`iris.csv`をサンプルのデータセットとして，pandas, seabornで可視化の練習をした際のメモ．あくまで自分用メモなので図の種類やカラムの選び方など恣意的な箇所があると思いますが，ご了承ください_(._.)_

データ：
https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv

##ヒストグラムの描画
`iris.csv`は，４つのカラムと１つのカテゴリ値
`sepal_length`,　`sepal_width`,　`petal_length`,　`peta_width`　と　`species`　から成る．
カテゴリ値である`species`の分類を念頭においた可視化をする．


![qiita_iris.jpg](https://qiita-image-store.s3.amazonaws.com/0/182818/d520c1f2-378a-6b36-cf26-c2a7a2477345.jpeg)


* * *
まずは1つのカラムについて，分布を確認する．

####・`sepal_length`の分布
```python:hist_iris1.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("iris.csv")
#df = sns.load_dataset("iris")  #手元にiris.csvがない場合

sns.distplot(df.sepal_length,kde = True)
plt.show()
```
![qiita_1.png](https://qiita-image-store.s3.amazonaws.com/0/182818/e8c572a3-9de7-14d8-6c64-cb9e2bca71ed.png)
* * *
つぎに，４つのカラムの分布を，４つの別々のグラフに描画した．`DataFrame`の`plot()`メソッドを用いて，`layout=(2,2)`と指定すると，４つのグラフを2*2マスのレイアウトで出力できるので便利だと思ったが，ヒストグラムとカーネル密度推定による密度関数を同時に表示する方法がわからない．

####・`sepal_length`,　`sepal_width`,　`petal_length`,　`peta_width`　の分布
```python:hist_iris2.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("iris.csv")
#df = sns.load_dataset("iris")  #手元にiris.csvがない場合

df.plot(kind="kde",subplots=True,layout=(2,2))    #kind="hist"でヒストグラム
plt.show()
```

![qiita_4.png](https://qiita-image-store.s3.amazonaws.com/0/182818/f9f2d297-010d-0464-bbfc-60abcf071e9b.png)
* * *

####・カテゴリ別の`sepal_length`の分布
`setosa`と`versicolor`で，`sepal_length`の分布の仕方がどのように異なるかを確認する．

```python:hist_iris.py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("iris.csv")
#df = sns.load_dataset("iris")  #手元にiris.csvがない場合

sns.distplot(df[df["species"]=="setosa"].sepal_length,kde=True,rug=True)
sns.distplot(df[df["species"]=="versicolor"].sepal_length,kde=True,rug=True)
plt.show()

```
![qiita_2.png](https://qiita-image-store.s3.amazonaws.com/0/182818/9a44a932-5cbe-7c26-8526-94b0360d0ae5.png)
* * *

##散布図行列の描画
データを概観するのに，散布図行列は有用な可視化方法である（と思う）．Seabornでは，`pairplot()`を使うと簡単に描画できる．
以下の例では，`pairplot()`の引数として`hue="species"`を設定している．これによって，irisデータセットのカテゴリ値`"species"`の種類別に色分けをしてくれる．`diag_kind="kde"`とすると，対角線成分には，カーネル密度推定による密度関数を描画する．何も指定しないと単にヒストグラムが表示される．

####・カテゴリ別の`sepal_length`の分布
```python:hist_iris.py
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("iris.csv")
#df = sns.load_dataset("iris")  #手元にiris.csvがない場合

#pairplot: 散布図行列を描く
g = sns.pairplot(df,hue = "species",diag_kind="kde")
plt.show()
```
![qiita_3.png](https://qiita-image-store.s3.amazonaws.com/0/182818/8550e43f-1b8d-c4c6-977c-7cadaac80d01.png)
chromeのバージョン上げたら自己認証局の証明書でエラーがでた

タイトルどおりですが、結果としてlets'encriptにもどしました。
（状況を社内の開発者の方から申告いただきchrome更新したら再現したのでした。）
戻すにあたりちょっとハマりましたので備忘録。

原因はこちら↓

Chrome58で、HTTPSの自己証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる場合の対応
http://tech.torico-corp.com/blog/chrome58-https-ssl-cert-san-error/

自己認証局のままいくなら以下のあたりをみて対応するとよさそう。

http://tech.torico-corp.com/blog/chrome58-https-ssl-cert-san-error/
https://valuessl.net/sslwords/wildcard.html
http://qiita.com/bmf_san/items/a29605fd5743dd263f71

lets'encriptのなににはまったかというと、
・git pullするソース版だとうまいこと動かなかった(git pullで最新にしてもダメ）
・CentOS7用のパッケージいれたらそっちで証明書発行できた

というだけでした。

ちなみにこんなエラーでてました（検索で来る人用に親切心でエラーメッセージを掲載）

```
# /root/letsencrypt/certbot-auto renew --force-renew 
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/mydomain.com.conf
-------------------------------------------------------------------------------
Attempting to renew cert from /etc/letsencrypt/renewal/mydomain.com.conf produced an unexpected error: HTTPSConnectionPool(host='acme-v01.api.letsencrypt.org', port=443): Read timed out. (read timeout=45). Skipping.
```

epelからインストールできるようになってたリンク
https://letsencrypt.jp/usage/install-certbot.html#CentOS6
https://letsencrypt.jp/docs/using.html
https://wwld.jp/2017/02/22/letsencrypt-cerbtbot-nginx.html

実際の作業内容

```
# yum install certbot
で、戻すにあたり証明書パスがかわるのでnginxまわりを適宜修正
# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/mydomain.com.conf
-------------------------------------------------------------------------------
Attempting to parse the version 0.14.1 renewal configuration file found at /etc/letsencrypt/renewal/mydomain.com.conf with version 0.12.0 of Certbot. This might not work.
Cert is due for renewal, auto-renewing...
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for mydomain.com
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0004_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0004_csr-certbot.pem

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/mydomain.com/fullchain.pem
-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/mydomain.com/fullchain.pem (success)
```

cronで動作することも確認できました

```
# crontab -l
## update sslcert(monthly).
#0 5 1 * * /root/letsencrypt/letsencrypt-auto renew --force-renew && /bin/gitlab-ctl restart
0 5 22 * * /bin/certbot renew --force-renew && /bin/gitlab-ctl restart
```

あとで失敗したらメール通知かなんかが来るようにしようかと思います。
RHEL 6.2のyumでCentOSのリポジトリを使えるように変更

Red Hat Enterprise Linux 6.2のyumでCentOSのリポジトリを使えるように変更してみる。CentOS-Base.repoはCentOS 6.2の既存ファイルを利用した。yum updateは少し時間がかかった。

```
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.2 (Santiago)
$ uname -a
Linux au25 2.6.32-220.4.2.el6.x86_64 #1 SMP Mon Feb 6 16:39:28 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
$ cd /etc/yum.repos.d/
$ ls -l
total 4
-rw-r--r--. 1 root root 529 Nov  9  2011 rhel-source.repo
$ cat /tmp/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
 
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
$ sudo mv -i /tmp/CentOS-Base.repo /etc/yum.repos.d/
$ ls -l /etc/yum.repos.d/CentOS-Base.repo
-rw-r--r-- 1 glire glire 782 Apr 21  2015 /etc/yum.repos.d/CentOS-Base.repo
$ sudo vi /etc/yum/vars/releasever
$ ls -l /etc/yum/vars/releasever
-rw-r--r-- 1 root root 4 May 22 16:29 /etc/yum/vars/releasever
$ cat /etc/yum/vars/releasever
6.2
$ sudo yum -y install yum-fastestmirror
$ sudo yum -y --enablerepo=base update --skip-broken
$ yum repolist all
```
struts2でAction間をforwardする際にActionMessageが引き継がれない

struts 2.5.10.1 で
ActionからActionへフォワードした際に、
Action内に設定したパラメータは引き渡されるが
Action内で設定したActionMessageやActionErrorは引き渡されなかったので困った。
設定方法の備忘録。
struts.xmlに以下を追記で引き渡されるようになる。

```struts.xml
<constant name="struts.xwork.chaining.copyErrors" value="true"/>
<constant name="struts.xwork.chaining.copyFieldErrors" value="true"/>
<constant name="struts.xwork.chaining.copyMessages" value="true"/>
```
rust test

この方
http://qiita.com/masayadk1229/items/08c5e384604f368c1762
のを試しました, というだけの記事. 
リンク先を読むべし. 

ちなみにrustを試したかったのもこの方と同じ理由でした. 

# 本家
https://www.rust-lang.org/ja-JP/
https://www.rust-lang.org/ja-JP/documentation.html
https://doc.rust-lang.org/book/

# install
installは元記事の方はcurlで落としてきてからやっていましたが, 私はなぜか本家からDLしてinstallしました. 

あとは, pathを通せばok

```
1. open
vi ~/.bash_profile

2. add
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

3. open
vi ~/.bashrc

4. add
#Rust 
export PATH="$HOME/.cargo/bin:$PATH"

5. reflection
source ~/.bashrc
```

# result
![スクリーンショット 2017-05-16 23.57.23.jpg](https://qiita-image-store.s3.amazonaws.com/0/102253/4c3d217f-75d4-bdb3-4f6c-dcbc0f4be34e.jpeg)
mysqlが起動できない


mysql関連でよくerrorになるのでメモ。
今回のerrorは

## 「The server quit without updating PID file」

原因は不明。昨日まで動いてたのに！


```
$sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxxx.local.pid).
```

権限を正しく直せば良いとのことなので

```
$sudo chown -R _mysql:_mysql /usr/local/var/mysql
```

最後にmysqlを再起動しましょう

```
$sudo mysql.server start
Starting MySQL
. SUCCESS!
```

これで起動できるようになりました。
macにnodebrewをインストールする

# mac環境にnodebrewをインストールする

こちらの記事を参考にnodebrewをインストールしてみようとしたものの、うまくいかないことがあったので、自分がインストールした際のメモを載せたいと思います。

- 参考：[Macにnode.jsをインストールする手順](http://qiita.com/akakuro43/items/600e7e4695588ab2958d)

## 事前準備

- macにNode.jsが既にインストールされている場合、アンインストールする
- 参考：[MacにpkgでインストールしたNode.jsをアンインストールする手順](http://qiita.com/yoshikoba/items/4906829faaaae8c73e56)

### コマンドでアンインストール

```
$ lsbom -f -l -s -pf /var/db/receipts/org.nodejs.node.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

### NPMの削除

```
$ sudo rm -rf ~/.npm
```

### 自分の環境ではまだ"node"が残っていたため、homebrewでnodeを削除しました。

```
$ brew uninstall node
```

※よくよく考えれば、pkgでインストールせず、homebrewでインストールしていたからだと思います。
※homebrewでインストールされていた方は、brewコマンドでアンインストールのみで大丈夫かもしれません。

## nodebrewをインストール

### homebrewより、nodebrewをインストール

```
$ brew install nodebrew
```

### インストールできたか確認。nodebrewのバージョン、Usage:、Example:などが表示されればOK

```
$ nodebrew -v
```

### 環境変数にnodebrew関連のものを追加

```
$ vi ~/.bash_profile
```

次の内容を追加

```
NODEBREW_HOME=/usr/local/var/nodebrew/current
export NODEBREW_HOME
export NODEBREW_ROOT=/usr/local/var/nodebrew

export PATH=$PATH:$NODEBREW_HOME/bin
```

## 最新のNode.jsをインストール

### まず下記のディレクトリがあるか確認。なければ作成する

```
/usr/local/var/nodebrew/src
```

### 最新のNode.jsをインストール

```
$ nodebrew install-binary latest
```

### Node.jsがインストールされたか確認

```
$ nodebrew list
```

インストールしたNode.jsのバージョンが表示されればインストールOK

### 最新版のNode.jsをcurrentに設定

2017/5/22時点では、v7.10.0がインストールされました

```
$ nodebrew use v7.10.0
$ nodebrew list
```

current: のところに、v7.10.0が表示されていればOK

### nodeコマンドを実行してみる

```
$ node -v
v7.10.0
```

current: に表示されていたバージョンが表示されればOK

### npmコマンドを実行してみる

```
$ npm -v
4.2.0
```

コマンドが実行できればOK

## 試しに違うバージョンのNode.jsを入れてみる

### インストールできるバージョンは次のコマンドでわかります

```
$ nodebrew ls-remote
```

### 試しに6.10.3を入れてみる

```
$ nodebrew install-binary v6.10.3 
```

### インストールできたか確認

```
$ nodebrew list
v6.10.3
v7.10.0

current: v7.10.0
```

インストールしたバージョンが表示されればOK

### インストールしたバージョンを利用できるように設定

```
$ nodebrew use v6.10.3
$ nodebrew list
v6.10.3
v7.10.0

current: v6.10.3
```

current: のところが指定したバージョンに変更されていればOK

### nodeコマンドを実行してみる

```
$ node -v
v6.10.3
```

### npmコマンドを実行してみる

```
$ npm -v
3.10.10
```

nodeコマンドでのバージョン確認、npmコマンドでのバージョン確認ともにv7.10.0のものとは違うバージョンが表示される

## おわりに

バージョン確認までですが、しっかり動作しました。
これからNode.jsで遊んでみようと思います。
macでのpathの意味を調べていた時の記事メモ

macでのpathの意味を調べていた時の記事メモ. 
本記事には価値はない. 
書いてくださった方々, ありがたや. 

http://qiita.com/soarflat/items/d5015bec37f8a8254380

http://qiita.com/soarflat/items/09be6ab9cd91d366bf71

http://qiita.com/hirokishirai/items/5a529c8395c4b336bf31

http://qiita.com/magicant/items/d3bb7ea1192e63fba850
Calendarの時間の部分をクリアしたいときのメモ

# これは何？
Calendarで取得した日時データの時間の部分をクリアしたいときの自分用メモ。

# まずはググると出てくる例
```
calenderObj.clear(Calendar.HOUR_OF_DAY);
calenderObj.clear(Calendar.HOUR);
calenderObj.clear(Calendar.MINUTE);
calenderObj.clear(Calendar.SECOND);
calenderObj.clear(Calendar.MILLISECOND);
```

# 何が間違っているのか？
プログラムを書いて確認してみる。

```Java

import java.util.Calendar;

public class CalendarClear {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();
        sysout(calendar);

        calendar.clear(Calendar.HOUR);
        calendar.clear(Calendar.MINUTE);
        calendar.clear(Calendar.SECOND);
        calendar.clear(Calendar.MILLISECOND);
        sysout(calendar);

        calendar.clear(Calendar.HOUR_OF_DAY);
        sysout(calendar);

    }

    private static final void sysout(Calendar calc) {

        System.out.println("/--------------------");

        System.out.println("YEAR:" + calc.get(Calendar.YEAR));
        System.out.println("MONTH:" + calc.get(Calendar.MONTH));
        System.out.println("DATE:" + calc.get(Calendar.DATE));
        System.out.println("HOUR_OF_DAY:" + calc.get(Calendar.HOUR_OF_DAY));
        System.out.println("HOUR:" + calc.get(Calendar.HOUR));
        System.out.println("MINUTE:" + calc.get(Calendar.MINUTE));
        System.out.println("SECOND:" + calc.get(Calendar.SECOND));
        System.out.println("MILLISECOND:" + calc.get(Calendar.MILLISECOND));

    }

}
```

結果はこうなる。

```
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:25
SECOND:35
MILLISECOND:527
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:0
SECOND:0
MILLISECOND:0
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:0
SECOND:0
MILLISECOND:0
```

HOUR_OF_DAY、HOURの値がクリアされていない。
正しい記述はこれ。

```Java
public static void main(String[] args) {

    Calendar calendar = Calendar.getInstance();
    sysout(calendar);

    calendar.clear(Calendar.MINUTE);
    calendar.clear(Calendar.SECOND);
    calendar.clear(Calendar.MILLISECOND);
    // 時の部分をクリアするには、setで入れないといけない。
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    sysout(calendar);

    calendar.clear();
    sysout(calendar);

}
```

JavaDocにもちゃんと明記されている。
[Calendar \(Java Platform SE 7 \)](http://docs.oracle.com/javase/jp/7/api/java/util/Calendar.html#clear(int))


>HOUR_OF_DAY、HOUR、および AM_PM フィールドはそれぞれ別個に処理され、時間の解決規則が適用されます。
>フィールドのいずれかをクリアしても、この Calendar の「時」はリセットされません。
>「時」の値をリセットするには、set(Calendar.HOUR_OF_DAY, 0) を使用します。


処理結果。

```
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:17
HOUR:5
MINUTE:27
SECOND:12
MILLISECOND:718
/--------------------
YEAR:2017
MONTH:4
DATE:22
HOUR_OF_DAY:0
HOUR:0
MINUTE:0
SECOND:0
MILLISECOND:0
```

おまけ

```java
calendar.clear();
```
をやると、

```
/--------------------
YEAR:1970
MONTH:0
DATE:1
HOUR_OF_DAY:0
HOUR:0
MINUTE:0
SECOND:0
MILLISECOND:0
```

全項目がクリアされる。

[Calendar \(Java Platform SE 7 \)](http://docs.oracle.com/javase/jp/7/api/java/util/Calendar.html#clear())

>この Calendar のすべてのカレンダフィールド値および時間値 (元期からのミリ秒単位のオフセット) を未定義に設定します。
make pdf with libreoffice 

各種ファイルのpdf化をlibreofficeで実行してみた. 
出来具合はまぁまぁだけど, 文字さえちゃんと入ってればいいかな, というレベルならば割りと良い気がします. 

# 参考
http://naruoga.hatenablog.com/entry/2015/12/21/201558#fn-936ec94d
http://qiita.com/motomiya326/items/c16038b670927468b89b
http://qiita.com/y_irabu/items/5d916562744b05c5fc82
https://www.libreoffice.org/get-help/install-howto/os-x/

PATH:
http://qiita.com/soarflat/items/d5015bec37f8a8254380
http://qiita.com/soarflat/items/09be6ab9cd91d366bf71
http://qiita.com/hirokishirai/items/5a529c8395c4b336bf31
http://qiita.com/magicant/items/d3bb7ea1192e63fba850

# environment
mac osx 10.11 el capitan
LibreOffice 5.3.3.2

# git
https://github.com/KeitaSumiya/shellscript/tree/master/libreoffice_pdf

# preparation
## install
ここ
https://www.libreoffice.org/get-help/install-howto/os-x/
からdmgをDLして実行してinstall

# set path
pathを通す. 

```
emacs ~/.bash_profile
(or 
emacs ~/.bashr
)
```

で開いて

```
#libreoffice                                                                                                                                 
export PATH=$PATH:/Applications/LibreOffice.app/Contents/MacOS
```

を追加. 

```
source ~/.bash_profile
(or
source ~/.bashr
)
```
でsourceコマンド実行して, PATHが通るようにする. 
(ターミナルを一度閉じて再び開くだけではだめなことも)
これで```soffice```で使える様になる

[PATHを通すために環境変数の設定を理解する (Mac OS X)](https://qiita.com/soarflat/items/d5015bec37f8a8254380)
[.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの？](https://qiita.com/hirokishirai/items/5a529c8395c4b336bf31)

# usage

```doc2pdf(pathを通す前).
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf:writer_pdf_Export *.doc
```

```doc2pdf(pathを通した後).
soffice --headless --convert-to pdf:writer_pdf_Export *.doc
```

```version_check.
soffice --version
```
```help.
soffice --help
```


# result
pdf化するテストをしてみた
### 割りと良い感じに動いた拡張子
doc
html
ppt
pptx
rtf
txt
xls
xlsx

### エラーが出たけど動いた拡張子
docx

### エラーは出なかったけど一部がおかしかった拡張子
csv

### 変化なし
pdf
RDSで急にパフォーマンスが悪くなったらIOPSを確認！

本番運用しているRDSのパフォーマンスが最近悪くなっている。
スロークエリを確認すると、処理時間が非常に遅いときがある。（Procedure）
とあるProcedure処理が以前は15分くらいで完了していたのだが、遅い時には100分近くかかっている。。。
処理内容は変えていないのに。。。

# CPU使用率を比較してみる
グラフの凡例

- 青線：正常
- 赤線：処理時間が遅い時

正常時は処理が終わるとCPU使用率は下がっていた。
しかし、処理時間が遅い時は負荷が上がっている時間が短く、CPU使用率も下がりきっていない。
![スクリーンショット 2017-05-22 15 (7).png](https://qiita-image-store.s3.amazonaws.com/0/181624/c6b3ac2f-588e-6b16-c18e-7a5884b697ab.png)

処理時間が遅いのはCPUがサボっているかららしい（笑）
なぜ、違う動きをしているのか？
実際に処理した件数はどうなっているのか？

# IOPSを比較してみる
### 書き込み（WriteIOPS)
正常時には次の処理が走っているが、それ以外に大きな差はなさそう。
![スクリーンショット 2017-05-22 15 (11).png](https://qiita-image-store.s3.amazonaws.com/0/181624/8f47d752-4bf9-8bad-d4ec-c5303d1d315a.png)

### 読み込み（ReadIOPS）
一定時間経過後にIOPSが300で横ばいとなっている。
![スクリーンショット 2017-05-22 16.png](https://qiita-image-store.s3.amazonaws.com/0/181624/92668a4b-aa21-f94f-1c2d-66bb1e8877cb.png)

# Amazon EBS ボリュームとパフォーマンス
色々と調べたところこのページに行き着きました。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html#EBSVolumeTypes_gp2

超ざっくりまとめると...

- ボリュームサイズによりベースラインパフォーマンスが決まる
- バーストすることで最大3,000 IOPSまで一時的に性能をあげられる
- バーストするにはクレジットバランスを消費する
 - クレジットバランスは初期に配られる
 - クレジットバランスはバーストしない間に補充される
- クレジットバランスを使い切った場合のパフォーマンスはベースラインにとどまる

# 自分の環境に当てはめる
私の環境はボリュームタイプが「汎用SSD」、ボリュームサイズが「100GiB」なので
ベースラインパフォーマンスは300 IOPSとなっています。

どうやらクレジットバランスを使い切ったため300 IOPSしか性能が出ていなかったようです。。。
ちなみに残クレジットバランスの確認方法はわかりませんでした。（あったら教えてください）

# 対応方法
対応方法として以下になると思います。
私は後者（処理間隔を空けること）で対応しています。

- ボリュームサイズを増やす。 ※後から減らせないので要注意！
- クレジットバランスが補充されるまで待つ

# まとめ
INDEXやら色々調べてみてもわからず、この結論に行くまでに時間がかかりました。
普段、意識していない部分だと思うので何かのヒントになれば幸いです。
Android Studio 2.3から3.0へのマイグレーションポイント

@eaglesakura です。

Google I/OでAndroid Studio 3.0が発表されましたね。
Preview1の段階ですが、メジャーアップデートということでいろんな機能が追加されたようです。

2.3系列から3.0へのマイグレーションガイドは(youtubeのセッション動画等で）公開されていますが、毎度のことでそれだけではなんともできないことが多いので私の個人的なアプリプロジェクトでガイド以外にマイグレーションした箇所を書いていきます。

# DexCountプラグインを削除する

DexCountプラグイン(`com.getkeepsafe.dexcount:dexcount-gradle-plugin`)  ~~slack通知プラグイン(`com.github.operando:gradle-slack-plugin`)~~は内部で参照しているGuavaのバージョンが他のプラグインと競合するため、正常に動作しなくなりました。

※Slack通知プラグインは正常に動作していました。確認不足で申し訳ないです。

不便ですが致命傷ではないので削除しています。

# dependencies{}ブロックを丹精込めてcompileからimplementationに書き換える

外部ライブラリやライブラリプロジェクトの依存解決には、従来では `compile` を使っていました。AS3.0ではビルド時、 `compile` を使っていると `implementation` に書き換えるように警告が出ます。

警告に従って書き換えると、ビルドが通らなくなるので注意してください。

今のところ、 `implementation` を使うと次のような動作となるようです。

 1. ライブラリプロジェクトがAndroidプロジェクトである場合、想定通りに動作する
 2. ライブラリプロジェクトがJavaプロジェクトである場合、それが依存しているライブラリが参照先に引き継がれない
 3. ライブラリプロジェクトがAndroid/Javaを問わず、出力される `*.pom` へ反映されない

ざっくりいうと、Androidライブラリプロジェクト以外は `compile` のままにしておかないと大幅な構成変更を余儀なくされます。

1参照1参照、それがAndroidプロジェクトであるか、Javaプロジェクトであるかを丁寧に判断しましょう。

# Retrolambdaを削除してライブラリをリビルドする

Android Studio 3.0から、Java8記法がサポートされました。正確には、Java8記法で書いた部分は古いJavaバージョンでも動くようにAndroidビルドプラグインが変換してくれます。

そのためRetrolambdaと同時に使用することはできません。

それだけだったら良いのですが、ライブラリプロジェクト（参照しているjarやaar）内部でRetrolambdaを使用している場合、メソッドが正常に呼び出せません。

そのため、ライブラリプロジェクトからもRetrolambdaを削除してリビルドしなければなりません。それがサードパーティである場合、速く対応するように祈るか自力ビルドするか諦めましょう。

https://twitter.com/eaglesakura/status/865596378726019073

# RobolectricのRawリソース読み込みがnullを返す問題の対処

Gradleのバージョンアップの影響か、rawリソースが読み込めない問題が再発しています。
これはissueに従ってカスタムTestRunnerを作ることで対処できました。

https://twitter.com/eaglesakura/status/866516255007678464

# dataBinding=trueが原因でNPE

プロジェクトが `dataBinding = true` を設定していて、DataBindingを使ったLayoutがまだ1ファイルもない場合、ビルドはNullPointerExceptionで必ず失敗します。

プロジェクト初期では、面倒でもダミーでDataBindingを使ったレイアウトファイルを突っ込んでおいたほうが良いでしょう。

# -Pcom.android.build.threadPoolSize=1

このオプションは無効なので、スクリプトに残っているとビルドエラーになります

# Windows + 4K液晶で異様に小さく表示される

Intellijの不具合です。
studio64.exeを右クリックして `プロパティ > 互換性 > 高いDPIスケール動作を上書き` である程度改善します

# Android Studio上での引数表示がなんか見づらい

AS上でメソッドの引数名が表示されるようになっていますが、黒背景のテーマだと異様に見づらいです。

`Editor > Colors & Fonts > Language Defaults > Inline parameter hint` で色設定を変更しましょう。

# 頑張って早めに移行する価値があるのか

ビルドがかなり速くなりました。
Instant Appsでの実行時レイアウト反映は（自分のプロジェクト構成では）行なえませんでした。インストールは早いです。小さいプロジェクトで試してるからかもしれません。

現場からは以上です。
デザインパターン入門（Factory Method）

この記事ではFactory Methodについてまとめます。
wikipediaによると「他のクラスのコンストラクタをサブクラスで上書き可能な自分のメソッドに置き換えることで、 アプリケーションに特化したオブジェクトの生成をサブクラスに追い出し、クラスの再利用性を高める」とあります。
参考：[Factory Methodパターン](https://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

**主な登場人物**

|NO|名前|役割|
|:-:|:--|:--|
|1|作成者(Creator)|製品をインスタンス化するためのインタフェースを定義する|
|2|作成者の具象クラス|製品をインスタンス化する。|
|3|製品(Product)|製品(デザインパターンで作成したいオブジェクト)のインタフェースを定義する|
|4|製品の具象クラス|製品の実装クラス|

このパターンはクラスをインスタンス化する際のインタフェースを上位の抽象クラスで定義しておき、インスタンス化は抽象クラスを実装するサブクラスで行います。このパターンでは「どのクラスをインスタンス化するかは、サブクラスに決定させる」と表現される場合があります。これは作成者の具象クラスは製品に関する知識を持たず（必要な情報は作成者から継承する）、単に利用するサブクラスを決めれば、自動的に利用する製品（製品の具象クラス）が決まるということです。

**パターンを実装する**
地域別のピザ屋をクラスで表現します。ピザのデータを保持するクラスと、店舗毎のクラスを作成します。

**製品**

```java:Pizza.java
import java.time.LocalDateTime;
public class Pizza {
	String name;
	String dough;
	String sauce;

    public void accept() {
    	System.out.println(LocalDateTime.now() + " お客様から" + this.name + "の注文を承りました");
    };
    public void prepare() {
    	System.out.println("準備中・・・");
    };
    public void bake() {
    	System.out.println("焼きます");
    };
    public void cut() {
    	System.out.println("切ります");
    };
    public void box() {
    	System.out.println("詰めます");
    }
	public String getName() {
		return name;
	}
}
```

**製品の具象クラス**

```java:TokyoCheesePizza.java
public class TokyoCheesePizza extends Pizza{
	public TokyoCheesePizza() {
		name = "東京で作られたチーズを使ったピザ";
		dough = "東京生地";
		sauce = "東京ソース";
	}
}
```

```java:OsakaCheesePizza.java
public class OsakaCheesePizza extends Pizza {
	public OsakaCheesePizza() {
		name = "大阪で作られたチーズを使ったピザ";
		dough = "大阪生地";
		sauce = "大阪ソース";
	}
	public void box() {
		System.out.println("大阪の店舗では特別箱でお届けします");
	}
}
```

**作成者**

```java:Order.java
public abstract class Order {
	public Pizza OrderPizza(String type) {
		Pizza pz = createPizza(type);
		pz.accept();
		pz.prepare();
		pz.bake();
		pz.cut();
		pz.box();
		return pz;
	}
	abstract Pizza createPizza(String type);
}
```

**作成者の具象クラス**

```java:TokyoOrder.java
public class TokyoOrder extends Order {
	public Pizza createPizza(String type) {
		if (type.equals("チーズ")) return new TokyoCheesePizza();
		else return new Pizza();
	}
}
```

```java:OsakaOrder.java
public class OsakaOrder extends Order {
	public Pizza createPizza(String type) {
		if (type.equals("チーズ")) return new OsakaCheesePizza();
		else return new Pizza();
	}
}
```

**メインクラス**

```java:Main.java
public class Main {
	public static void main (String args[]) {
		Order tk = new TokyoOrder();
		Order os = new OsakaOrder();	
		Pizza tkpz = tk.OrderPizza("チーズ");
		System.out.println(tkpz.getName() + "を注文しました");
		Pizza ospz = os.OrderPizza("チーズ");
		System.out.println(ospz.getName() + "を注文しました");
	}
}
```

```:結果
2017-05-22T17:02:41.553 お客様から東京で作られたチーズを使ったピザの注文を承りました
準備中・・・
焼きます
切ります
詰めます
東京で作られたチーズを使ったピザを注文しました
2017-05-22T17:02:41.553 お客様から大阪で作られたチーズを使ったピザの注文を承りました
準備中・・・
焼きます
切ります
大阪の店舗では特別箱でお届けします
大阪で作られたチーズを使ったピザを注文しました
```

この例ではピザ自体を製品としてパターンを適用しました。ピザ屋の注文を作成者に、ピザを製品に置き換えています。ピザの種類が増えていくと製品のクラス数が増加し、作成者の分岐が増えていき、変更の影響をサブクラス（○○Order.java、○○Pizza.java）に絞り込んでいます。
AmazonAthenaをCLIから使う


よーやくCLIから使えるようになりました。
早速試しましょう

# 前提条件
- S3にQuery用のダミーデータが入っているものとします
- S3にAthenaの実行結果保存用ディレクトリが作成されているものとします
- Athenaは ```us-east-1``` を使用して実行しています

# 実行環境

```bash:コマンド
aws --version
```

```bash:結果
aws-cli/1.11.89 Python/3.5.0 Darwin/16.5.0 botocore/1.5.52
```

手元にコマンドがない場合はアップデートしましょう

```:アップデート
sudo pip install -U awscli --ignore-installed six
```

- 筆者の環境ではDatapipelinを使用してDynamoDBのあるテーブルデータをS3にバックアップしたものをサンプルデータとして使用しています。
- DATABASEに関しては以前Javaからの接続の際検証で作成した ```dynamodb``` という名前のDATABASEが存在します。
- テーブルとして、DynamoDBのJSONデータに対応するように作成した ```dynamodb.sample1``` を使用します。

# Queryの実行

```bash:コマンド
aws athena start-query-execution \
	--query-string 'select count(*) from dynamodb.sample1;' \
	--query-execution-context Database=dynamodb \
	--result-configuration OutputLocation=s3://xxxxxxxxxxxxxxxxxxxxxxxxxxx/cli-test/
```

```
{
    "QueryExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```

# 結果の取得

```bash:コマンド
aws athena get-query-results \
	--query-execution-id "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

```:結果
{
    "ResultSet": {
        "ResultSetMetadata": {
            "ColumnInfo": [
                {
                    "CatalogName": "hive",
                    "Name": "_col0",
                    "Scale": 0,
                    "SchemaName": "",
                    "Precision": 19,
                    "Type": "bigint",
                    "CaseSensitive": false,
                    "Nullable": "UNKNOWN",
                    "Label": "_col0",
                    "TableName": ""
                }
            ]
        },
        "Rows": [
            {
                "Data": [
                    {
                        "VarCharValue": "_col0"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "500000"
                    }
                ]
            }
        ]
    }
}
```

# 実行したQueryの詳細を取得する

```bash:コマンド
aws athena get-query-execution \
	--query-execution-id  "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

```:結果
{
    "QueryExecution": {
        "Status": {
            "SubmissionDateTime": 1495440535.706,
            "State": "SUCCEEDED",
            "CompletionDateTime": 1495440549.995
        },
        "QueryExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Statistics": {
            "DataScannedInBytes": 71512882,
            "EngineExecutionTimeInMillis": 13930
        },
        "Query": "select count(*) from dynamodb.sample1",
        "ResultConfiguration": {
            "OutputLocation": "s3://xxxxxxxxxxxxxxxxxxxxxxxxxxx/cli-test/xxxxxxxxxxxxxxxxxxxxxxxxxxx.csv"
        }
    }
}
```

格納先のオブジェクトパスが取得できます。

これでAthenaを簡単に使える！東京リージョンまだだけど、S3を介してやり取り出来るのでまあまあ使えるんじゃないかという所感。