OmniAICreator/Qiita-1.07M huggingface dataset:
CPU でXMR(Monero) をマイニングする

漢なら CPU でレイトレーシングですよね!

しかし, 計算に使っていないときでも CPU リソースを活用したいですよね.

CPU での計算に重点を置いた CryptoNight アルゴリズムを使う Monero をマイニングしてみましょう.

現時点では

https://github.com/fireice-uk/xmr-stak-cpu

が一番ハッシュレートが高そうでした(NiceHash の miner でも使われています).

## config.txt

CPU の設定は以下のようにしました. 

```
"cpu_threads_conf" :
  [
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
       { "low_power_mode" : false, "no_prefetch" : false, "affine_to_cpu" : false },
  ],
```


他の設定はこんなかんじです. 今回は Nicehash に接続する(hashrate を売る)ようにしたので `nicehash_nonce` `true` にしています.

```
"use_slow_memory" : "warn",
"nicehash_nonce" : true,
```


16 GB mem + Ubuntu 16.04 + Ryzen7 1700 3.0GHz 定格で動かしたところ, 1% dev fee ありで 517 H/s でました. 2017/05/13 時点では 1 USD/day くらになります. でも電気代が半分くらいかかるので, ちょっとしたお小遣い程度くらいの収益ですかね. 1 年間動かしていれば, Monero の価格上昇があると想定すれば, Ryzen7 1700 の価格(4 万円くらい)は回収できるかもしれません.

```
HASHRATE REPORT
| ID | 2.5s |  60s |  15m | ID | 2.5s |  60s |  15m |
|  0 | 64.9 | 64.9 | (na) |  1 | 64.2 | 64.3 | (na) |
|  2 | 64.5 | 64.4 | (na) |  3 | 64.5 | 64.4 | (na) |
|  4 | 65.0 | 64.9 | (na) |  5 | 64.5 | 64.4 | (na) |
|  6 | 64.9 | 64.9 | (na) |  7 | 64.7 | 64.9 | (na) |
-----------------------------------------------------
Totals:   517.1 517.2 (na) H/s
Highest:  517.4 H/s
```

`affine_to_cpu` を 0, 2, 4, 6, 10, 12, 14 に設定するとちょこっとだけ早くなったような?(517 H/s -> 518 H/s)

## Windows では..?

Windows 10 64bit + 32 GB mem + Ryzen7 1700 3.8 GHz OC 環境で測定していました. なぜか Linux と比べ, 450 H/s と下がってしまいました. Windows のスケジューラや, メモリとの周波数の関係があるのかもしれません.


## TODO

* CPU クラスタで動かしたいので, AMD Naples はよ
* Xeon Phi ではいかがかしら...?
* CryptoNight アルゴリズムを解析してくれる, 優秀な CryptoNight アルゴリズム若人を探す旅に出たい.
print0 コマンド

# find のオプションのあれ

`find` コマンドのオプションに `-print0` があります。みなさん大好きだと思います。

釈迦に説法ですが、主な用途は

```sh
$ touch euu\ upp\\ntotoro1
$ touch euu\ upp\\ntotoro2
$ ls euu*
euu upp\ntotoro1  euu upp\ntotoro2

$ find ./ -name 'euu*' -print |xargs rm
rm: `./euu' を削除できません: そのようなファイルやディレクトリはありません
rm: `uppntotoro2' を削除できません: そのようなファイルやディレクトリはありません
rm: `./euu' を削除できません: そのようなファイルやディレクトリはありません
rm: `uppntotoro1' を削除できません: そのようなファイルやディレクトリはありません
```

上記の様な空白などが混じった名前のファイル名を消去する時、 `xargs` は標準入力から空白や改行コードを区切り文字として読み込みます。よってファイル名の空白も区切り文字として解釈され、解釈された文字列群が `rm` の引数に渡されます。よって上記の様なエラーが起こります。

だからその現象を回避するために

```sh
$ find ./ -name 'euu*' -print0 |xargs -0 rm
$ ls
$
```

`find` は `-print0` オプションで ヌル文字を区切り文字として出力し、 `xargs` は
`-0` オプションで、ヌル文字を区切り文字と解釈して rm に引数として渡します。これで空白が混じったファイル名を無事に処理する事が出来ます。

以上が一般的なあらすじですが、以下の様に処理を行いたいです。

```sh
$ touch euu\ upp\\ntotoro1
$ touch euu\ upp\\ntotoro2
$ ls euu* | xargs rm
rm: `euu' を削除できません: そのようなファイルやディレクトリはありません
rm: `uppntotoro1' を削除できません: そのようなファイルやディレクトリはありません
rm: `euu' を削除できません: そのようなファイルやディレクトリはありません
rm: `uppntotoro2' を削除できません: そのようなファイルやディレクトリはありません
```

当然エラーになりますが、 `find` じゃなく `ls` を使いたいよね。というか `ls` の出力に限らず、空白が混じったファイル名が存在する事を考慮して ファイル名同士の区切り文字はヌル文字に変えたいよね。

つまり **find の -print0 オプションに相当する print0 コマンド が欲しい** のです。

# Ruby で実装、実行

実装といっても骨格だけですが

-   print0.rb

```ruby
#!/usr/bin/env ruby

while line = gets
  print "#{line.chomp}\0"
  STDOUT.flush
end
```

`String#chomp` は ( <https://docs.ruby-lang.org/ja/2.4.0/class/String.html#I_CHOMP> )

    chomp(rs = $/) -> String[permalink][rdoc]
    self の末尾から rs で指定する改行コードを取り除いた文字列を生成して返します。 
    ただし、rs が "\n" ($/ のデフォルト値) のときは、 実行環境によらず "\r", "\r\n", "\n" の
    すべてを改行コードとみなして取り除きます。

ですので、末尾の改行コードらしきものは全て取り除きます。実用上は何か問題はあるかな？ 思いつかない。

そして実行。

```sh
$ ls euu* | print0.rb | xargs -0 rm
$ ls
$
```

期待した動作です。

# シェルスクリプトで実装、実行

-   print0.sh

```sh
#!/usr/bin/env bash

trap 'echo Error: $0:$LINENO stopped; exit 1' ERR INT
set -eu

while read -r line
do
    echo -E -n "$line"
    echo -e -n "\0"
done
```

実行。

```sh
$ touch euu\ upp\\ntotoro1
$ touch euu\ upp\\ntotoro2
$ ls euu*
euu upp\ntotoro1  euu upp\ntotoro2

$ ls euu* | print0.sh |xargs -0 rm
$ ls
$
```

期待した動作です。

# alias を設定、実行

シェルスクリプトが短く出来ているので ワンライナーにしてエイリアスしてみます。

-   `print0` にエイリアスする

```sh
alias print0='while read -r line; do; echo -E -n "$line"; echo -e -n "\0"; done'
```

実行。

```sh
$ touch euu\ upp\\ntotoro1
$ touch euu\ upp\\ntotoro2
$ ls euu*
euu upp\ntotoro1  euu upp\ntotoro2

$ ls euu* | print0 |xargs -0 rm
$ ls
$
```

期待した動作です。

とは言え、個人的には エイリアスにするのは好みではありません。エイリアスが コマンドに勝手に展開されるとか、history に記録する際に展開されるとか zsh に設定がありそうな。(それが好みの人もいるかもしれませんが)

# 最後に

誰でも思いつく上 骨格だけならとても小さなツールですが 使い勝手は良い様な気がします。`print0` なら大抵の シェルユーザーには "find のあれ" で通用するでしょうし。
ubuntuがapt-get updateに失敗するのを直したメモ

いつからか忘れたけど、apt-get updateが失敗するようになってた。
エラーメッセージは以下の通り。

```
W: http://jp.archive.ubuntu.com/ubuntu/dists/trusty/Release の取得に失敗しました  期待されるエントリ 'main/binary-C/Packages' が Release ファイル内に見つかりません (誤った sources.list エントリか、壊れたファイル)
```

何が原因なのかわからんけど、以下の手順で治った。
## キャッシュを片っ端から消す

```
$ sudo rm -rf  /var/lib/apt/lists/*
$ sudo apt-get autoclean
$ sudo apt-get clean
```

## 片っ端から[arch=amd64]を足す

```text:/etc/apt/sources.list
###### Ubuntu Main Repos
deb [arch=amd64] http://jp.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse

###### Ubuntu Update Repos
deb [arch=amd64] http://jp.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb [arch=amd64] http://jp.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb [arch=amd64] http://jp.archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb [arch=amd64] http://jp.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
```

## apt-get updateをやり直す
```
$ sudo apt-get update
```
rex0220 テキスト翻訳プラグイン

Azure text translator API を使用して、テキストを翻訳するプラグインです。
（販売停止）

- [６０以上の言語を翻訳可能](https://www.microsoft.com/ja-jp/translator/languages.aspx)（2017/5時点）
- タブキーで翻訳
- 翻訳対象項目数は、１０組まで
- 同時に多数の言語に翻訳可能
- 翻訳結果をさらに他の言語に翻訳可能
- ラベル欄に、言語表示可能
- ラベル欄に、文字数表示。<br>※日英以外は、目安程度の文字数カウントになります。
- PC/スマホ対応

[rex0220 stores](https://rex0220.stores.jp)で、販売中です。


[Microsoft Translator テキスト API](https://www.microsoft.com/ja-jp/translator/translatorapi.aspx)
**Azure の無料のサブスクリプションに登録することで、月に 200万字まで無料で利用可能**

# 翻訳操作例

- 日本語タイトルを、ヒンディー語とアラビア語に翻訳
- 日本語テキストを、英語、中国語、タイ語、スペイン語に翻訳
- 英訳結果を変更して、さらに和訳

![2017-05-14_01h01_04.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/b79c9c26-fc40-87cd-a3af-27762801ba76.gif)



# 翻訳アプリ設定例


![2017-05-14_00h29_25.png](https://qiita-image-store.s3.amazonaws.com/0/100572/4d0b9c07-4f16-c3f3-8e0a-f67b897e82fd.png)


# スマホ画面例

編集画面と詳細画面例

![2017-05-14_00h42_26.png](https://qiita-image-store.s3.amazonaws.com/0/100572/25711b62-d1a3-98d8-a087-5af7c79c2bc6.png)



# Microsoft Azure アカウントの取得からAPI認証キー取得まで


[Translator API を使い始める](https://www.microsoft.com/ja-jp/translator/getstarted.aspx) に従って、 API認証キーを取得します。

![2017-05-14_01h47_54.png](https://qiita-image-store.s3.amazonaws.com/0/100572/7e9fc3ac-dc28-113e-709d-eb4ff7d43ae1.png)

まずは、無料の価格レベルで設定しましょう。
無料の価格レベルでも、有料プランと同じ特長や機能を利用でき、使用期限はありません。

500文字の日本語を英訳・和訳を20日間で平均して使うとすると、100回/日使えます。
2,000,000文字 / 1000文字 / 20日 = 100回/日


#　プラグインの読み込みとアプリへのプラグイン追加設定

- 「Kintoneシステム管理＞プラグイン」で、プラグインを読み込みます。
- 「アプリの設定＞プラグイン」で、プラグインを追加します。


![翻訳1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/cce4979b-0ab5-b2b8-6326-e68ca1a3e130.png)

# 翻訳プラグイン設定

- Azure APIアクセスキーの設定
- 翻訳元テキスト、翻訳先テキストと言語設定

![2017-05-14_01h37_53.png](https://qiita-image-store.s3.amazonaws.com/0/100572/40e0cf9f-a848-6e9f-4918-36aa064d6a8a.png)

- Azure APIアクセスキーのテスト

接続テスト成功例

![2017-05-14_01h39_39.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3a93b99f-2844-a981-88bd-54baf948af7d.png)

接続テスト失敗例
有効なAzure APIアクセスキーを指定してください。

![2017-05-14_01h44_18.png](https://qiita-image-store.s3.amazonaws.com/0/100572/42fca4ba-10a7-cfa7-c4c4-6a51ef619c63.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- アプリ設定を変更した場合は、プラグインを再設定してください。
Bower/bower-rails チートシート

## 概要

- Bower = フロントエンドJavaScriptのパッケージマネージャ
    - Bower自体はnode.js上で動作し、npmで管理される

- bower-rails = Rails上でBowerを扱うためのgem
    - rakeコマンドでbowerを操作でき、Railsに準じたフォルダ構成下にパッケージをインストールできる



## Bower

### 導入

```bash
# node.jsのインストール
$ brew install node

# bowerのインストール
$ npm install -g bower
```


### 使い方

```bash
# 構成設定ファイルである bower.json を作成する
$ bower init

# ライブラリを検索する
$ bower search <package>

# パッケージを追加し、かつbower.jsonに記録する
bower install <package> --save

# bower.jsonに記録されたパッケージをインストールする
# bower_components/ にパッケージがインストールされる
bower install
```


## bower-rails

## 導入

Gemfileにbower-railsを追加してインストールする。

```ruby:Gemfile
gem 'bower-rails'
```

```bash:install
$ bundle install
```

またbowerのパッケージは`vendor/`以下にインストールされるので、該当フォルダをgitの管理から除外しておく。

```:.gitignore
vendor/assets/bower_components
```


### 使い方

```bash
# bowerを初期化
$ rails g bower_rails:initialize

# Bowerfileに欲しいアセットを任意に追加
asset 'mocha'

# bowerをインストール
$ rake bower:install
```

あとはインストールされたパッケージを、(アセットのrequire機能など)jsの構成に応じて任意にロードする。



## 参考
- [Bower](https://bower.io)
- [Github - rharriso/bower-rails](https://github.com/rharriso/bower-rails)
- [Qiita - Railsでbower-railsを使う方法](http://qiita.com/sukechansan/items/ed22f163312711340ad3)
pyenvチートシート

## 概要
- pyenv = pythonのバージョンマネージャ。[rbenv](https://github.com/rbenv/rbenv)と操作性が似ている


## 導入
OSXの場合はbrewでインストール可能

```
$ brew install pyenv
```

インストール後はパスを通す

```bash:~/.bash_profile
export PATH=$HOME/.pyenv/shims:$PATH
```

## 利用

コマンドの書式もrbenvに準ずる。

### バージョンの管理

```bash
# インストールできる一覧の表示
$ pyenv install --list

# インストール
$ pyenv install 3.3.6

# アンインストール
$ pyenv uninstall 3.3.6
```

インストールされたpythonは~/.pyenv に格納される。

### 確認

```bash
# インストール済の一覧表示
$ pyenv versions

# カレントディレクトリ内で有効なバージョンの表示
$ pyenv version
```

### バージョン指定

デフォルトのバージョン指定とは別に、ディレクトリ別にバージョンを指定できる。
当該のディレクトリ内には`.python-version` が作成され、指定したバージョンが記録される。

```bash
# デフォルトのバージョンを指定
$ pyenv global 3.3.6

# カレントディレクトリのバージョンを指定
$ pyenv local 2.7

# カレントディレクトリのバージョン指定を除去
$ pyenv local --unset
```

## 参考
- [Github - pyenv/pyenv](https://github.com/pyenv/pyenv)
rbenvチートシート

## 概要
- rbenv = rubyのバージョンマネージャ。復数のバージョンのrubyを切り替えて使える
- [rvm](https://rvm.io/)に比べると、
    - 軽量、シンプル設計
    - シェル環境変数に対する副作用がない
    - gemsetのようなgemの管理機能がない(逆にgemに対する副作用もない)


## 導入
OSXの場合はbrewでインストール可能

```bash
$ brew install rbenv
```

インストール後はパスを通す

```bash:~/.bash_profile
export PATH=$HOME/.rbenv/shims:$PATH
```

## 利用

### バージョンの管理

```bash
# インストールできる一覧の表示
$ rbenv install --list

# インストール
$ rbenv install 2.3.0

# アンインストール
$ rbenv uninstall 2.3.0
```

インストールされたrubyは~/.rbenv に格納される。


### 確認

```bash
# インストール済の一覧表示
$ rbenv versions

# カレントディレクトリ内で有効なバージョンの表示
$ rbenv version
```

### バージョン指定

デフォルトのバージョン指定とは別に、ディレクトリ別にバージョンを指定できる。
当該のディレクトリ内には.`.ruby-version` が作成され、指定したバージョンが記録される。

```bash
# デフォルトのバージョンを指定
$ rbenv global 2.3.0

# カレントディレクトリのバージョンを指定
$ rbenv local 1.9.3-p551

# カレントディレクトリのバージョン指定を除去
$ rbenv local --unset
```

## 参考
- [Github - rbenv/rbenv](https://github.com/rbenv/rbenv)
- [Developers.IO - rbenv を利用した Ruby 環境の構築](http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)
- [Qiita - rbenvでrubyのバージョン管理をする](http://qiita.com/MasahiroSakoda/items/b66f92df80b375f7c786)


- [passingloop - rbenv と RVM との違い](http://passingloop.tumblr.com/post/10512902196/difference-between-rbenv-and-rvm)
- [Hatena Blog - rbenvについてやrvmと比べた時の長所を調べた](http://llcc.hatenablog.com/entry/2014/12/20/204141)
dot言語を使ってみた

(参考)DOT言語
https://ja.wikipedia.org/wiki/DOT%E8%A8%80%E8%AA%9E
(参考)Qiita＞Graphvizとdot言語でグラフを描く方法のまとめ
http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d
(参考)作図系ツール・ライブラリまとめ 
https://gist.github.com/hashrock/208b84c61558663e40bb
# 環境 
Windows7 (64bit)
Graphviz 2.38
# 拡張子は何でもいい。
GVファイル (.gv)又はDOT言語(.dot)

(参考)Graphiz の基本的な使い方を学んで連絡網を作る ＞dotファイルはWORDに関連付けられてることがあるので注意する。
http://takuya-1st.hatenablog.jp/entry/2015/01/10/035601

まぎらわしい拡張子
DOT＜Microsoft Word document template 
GV ＜GrandView outline file
# DOT言語を作成する方法
(1)標準エディタ
(2)Graphviz内gvedit
http://www.graphviz.org/
(3)DotEditor Homepage on github
http://www.graphviz.org/content/try-new-dot-editor-graphviz-beginner
(4)Qiita＞electronなGraphvizエディタ "electron-viz"
http://qiita.com/Kazunori-Kimura/items/8e2b65ed6117a3681cdc
(5)プログラミング言語
調査中
gulpでscssコンパイルとブラウザリロードを自動化

```gulpfile.js
var gulp = require('gulp');
var sass = require("gulp-sass");
var autoprefixer = require("gulp-autoprefixer");
var browserSync = require('browser-sync').create();

//ブラウザ同期
gulp.task('browser-sync', function() {
	browserSync.init({
		server: {
			baseDir: "./",
			index: "index.html"
		}
	});
});

gulp.task('bs-reload', function () {
	browserSync.reload();
});

//scssコンパイル
gulp.task("sass", function() {
	gulp.src("./sass/**/*.scss")
		.pipe(sass())
		.pipe(autoprefixer())
		.pipe(gulp.dest("./css"))
});

//下記のファイルが変更されたらリロード
gulp.task('default', ['browser-sync'], function () {
	gulp.watch("./**/*.scss", ['sass']);
	gulp.watch("./*.html", ['bs-reload']);
	gulp.watch("./css/*.css", ['bs-reload']);
});
```

```cpp
gulp
```
jyhtonでpipを使ってライブラリのインストールをする。

jythonでは、デフォルトではpipのインストールはされないようだ。
次のようにすると、pipが入る。試したのは、ubuntu16.04 jythonのバージョンは`jython2.7.0`である。

```
Jython 2.7.0 (default:9987c746f838, Apr 29 2015, 02:25:11)
[OpenJDK 64-Bit Server VM (Oracle Corporation)] on java1.8.0_121
```

### pipのインストール

```
jython -m ensurepip
```

jythonが居るフォルダーに次のように入る。

```
easy_install  easy_install-2.7  jython  pip  pip2  pip2.7
```

### jythonにライブラリを導入する。

後はpipと同じようにする。

```
 pip2.7 install ruamel.yaml
```

また、`requestment.txt` を作る場合は、

```
pip2.7 freeze > jython_requirements.txt
```

のようにすれば良い。

### 注意、Cのコンパイルが必要なライブラリは入らない。

C言語のコンパイルが必要なライブラリ、 pylxmlみたいなライブラリを必要とするライブラリは入らないので、pure pythonで書かれたライブラリしか入らないのでその点は注意が必要だ。
iTerm2の指定できるフォントサイズを追加する

# はじめに

iTerm2で16ptあたりのフォントサイズが指定できなかったのでメモ。

Rictyのような等幅フォントを利用する場合、個人的には16ptあたりが好みのフォントサイズです。ただし、iTerm2ではフォントサイズは選択式になっており、デフォルトでは16ptは指定できません。

# やり方
Preference>Profiles>Text>Change Font
<img width="720" alt="SS_20170514.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/e93f6291-d1e1-4327-1fae-a72a1471f41e.jpeg">

左上の歯車マーク>Edit Sizes...
<img width="522" alt="SS_20170513_4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/0454f097-5ab2-623b-5e40-ab3ce0bbd055.jpeg">

自分の好みのフォントサイズを入力して、+ボタンを押す。
<img width="361" alt="SS_20170513_5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/1ff10f6a-2fd9-fb6d-4c9f-d03947f1c7e8.jpeg">

あとは先程追加したフォントサイズを指定すれば完了。
<img width="522" alt="SS_20170513_2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/b76565f8-8ea9-f58a-676e-129ba2739134.jpeg">
楽しいBlender（紹介編）


この記事は、

「Blender?聞いたことあるけどよくわからん」
「3DCGやってみたいけど、難しそうだなぁ」

という方向けです。
Blenderでできることや魅力、取っつきにくさを減らす方法等を簡単にまとめていきます。
少しでもBlenderに対して興味を持ってもらえたら嬉しいです。

![blender-plain.png](https://qiita-image-store.s3.amazonaws.com/0/176578/45b5306d-cfaf-7f09-4468-0aec72941cef.png)

#1.Blenderとは何ぞや
+ オープンソースの3DCGフリーソフトウェア(無料！ここ大事)
+ モデリング（造形）やレンダリング（出力）はもちろん、アニメーションや動画編集もできる


![blender.png](https://qiita-image-store.s3.amazonaws.com/0/176578/5a65fd57-8893-2517-117a-e27fb6898d98.png)
画像はver2.76です

#2.Blenderでこんなことができる
[Blender Demo Reel 2013](https://www.youtube.com/watch?v=1XZGulDxz9o&index=4&list=PLa1F2ddGya__fTBj6FlL39NEBPZLB50ey&t=3s)
少し古いdemoreelですが、イラスト調のものからリアル調のものまで幅広く取り上げられています。
この中だとフルーツやインテリアのところはフリーのモデルを借りたりすれば簡単に作れます。
また、雪山の地形等はモディファイアーというオブジェクトに対して
いろんな効果や変形を適用できる機能を使うと作ることができます。

[Cycles Demoreel 2016](https://www.youtube.com/watch?v=mIiY6aGefvI&list=PLa1F2ddGya__fTBj6FlL39NEBPZLB50ey&index=1)
主に Cyclesレンダーというよりリアルな質感が表現できるレンダラーが使われています。
このdemoreelの中だと、冒頭の水の表現（流体シミュレーション）、
アメリカンクラッカーの質感、ドミノあたりは比較的簡単に作れます。

実際に以前映像用素材に作ったものをいくつか紹介します。

##1.鉱物
![](https://media.giphy.com/media/l4FGwc0Yu0JoHuICs/giphy.gif)
超絶簡単です。屈折率とか光の照り具合を調節するとリアルな感じになります。

##2.新聞記者の机（レトロっぽい）
![](https://media.giphy.com/media/l4FGjPGEQqZXxHzVe/giphy.gif)
重いかもしれない。いろいろ素材をお借りしています。
後ほど白い紙には写真っぽく画像を貼ったりもしました。

##3.海中（沈んでいく）
![](https://media.giphy.com/media/l4FGEoujyHOFwwuI0/giphy.gif)
"blender" "海"とかで検索するとやり方が載っています。
あとはカメラの位置とか光の入り具合を調節してやったり。



#3.Blenderのここが良い
+ 無料なのにモデリングから動画編集までできる
+ Windows、Mac OS、Linuxに対応している
+ オープンソースなので有志の方が作った便利なアドオン（プラグインとも言う、追加機能みたいなもの）を導入することができる
+ もちろんアドオンの自作もできる（Pythonを使う）
+ UnityやMMDとの連携がしやすい（例. モデルを作る、アニメーションを作る等）

#4.Blenderのここがちょっと…なところ
+ UIがわかりにくい、機能が多くてパッと見ではわからない

![blender1.png](https://qiita-image-store.s3.amazonaws.com/0/176578/389b3790-233e-209f-2a8a-772b4b2b76c1.png)
他にもいろいろありますが、静止画の場合はタイムラインは使いません。

+ 公式サイトやデフォルトUIが英語

![blenderr.png](https://qiita-image-store.s3.amazonaws.com/0/176578/22cffb24-2ad5-d7d5-fbda-12d94d1070f1.png)

+ 業界シェアが低い

#5.取っつきにくさを減らすには？
##UI
初めは3Dビューだけ注目する等、視野を狭める（気にしない）
初見わからないことが多いのはどのソフトも同じ、まずは触ってみることが大事
##英語
UIを日本語化可能。
また[Blender.jp](https://blender.jp/)という日本語で書かれたサイトもあります。
何か困ったときに質問できる掲示板はこちらの中にあります。

youtubeには海外の方が投稿されたメイキングの動画がたくさんあるので英語UIに慣れておくのもいいでしょう。
##シェア
個人で初めて触ってみる分にはあまり関係ないかと

#6.まとめ
初めて触った3dcgソフトがBlenderだったのですが、
魅力的なところはやはり無料でこれだけ幅広くいろいろなことができる点と
活発にユーザー同士の情報共有がされている点だと思います。
今までどこかで詰まっても記事を探したり掲示板に質問すると大体解決しました。

3dcgソフトもいろいろあって、同じような機能を持つものだとMaya、3dsMAX、Cinema4D等があります。
この3つは各々使用条件や使用期間等いろいろ制約がありますが学生無償版があります。
業界シェアは圧倒的にMayaが高いのですが、それぞれ特色や向き不向きがあるので、
用途によってソフトを選択するのも良いかもしれませんね。

***

次回　[楽しいBlender（入門編）　①はじめに](http://qiita.com/ppr007/items/19280036aea965a4a8b2)
UE4でカメラをキャラクターから独立させる手順

#UE4でカメラをキャラクターから独立させる手順
##目的
プレイヤーキャラクターからのカメラの分離

##理由
ThirdPersonのサンプルを見る限り、キャラクターにカメラが紐づけられていますが、キャラクターに紐づけられることで下記のデメリットが存在します。
・キャラクターのブループリントをほかのキャラクターにも適用しづらい。
・キャラクター側でカメラをすべて制御するのは煩雑。
・注視点が必ずアクターの位置からのオフセットとなり、注視点や位置が細かく制御しずらい。
・実際のゲームコードでもカメラクラスを別で用意してカメラ自身が動きを制御するのが一般的
以上の理由から、カメラやキャラクターをもっと自由に制御するためにカメラ自体をキャラクターから分離してしまいましょう。

##テスト環境
UnrealEngine 4.15.2

##手順
１．ThirdPersonのサンプルを用意
![SnapCrab_NoName_2017-5-14_0-1-2_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/81106b52-4282-36c8-913a-5ff0b9276573.jpeg)

２．ThirdParsonCharactorのブループリントからCameraBoomとFollowCameraを削除しましょう。
![SnapCrab_NoName_2017-5-13_22-7-39_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/70db18c6-de9b-628d-cde0-c240b4cd4812.jpeg)
↓
![SnapCrab_NoName_2017-5-13_22-11-54_No-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/181347/1ff39254-1952-c20b-3418-944d5153dc2b.jpeg)

３．コンテンツの新規作成から新しくActorのBluePrintを作成しましょう。
![SnapCrab_親クラスを選択_2017-5-14_0-24-10_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/181347/f614677f-5832-0dc1-3115-ccc8bca3432b.png)

４．作成したActorにArrowコンポーネントを追加した後、SpringArmコンポーネントとCameraコンポーネントが階層になるように追加しましょう。
![SnapCrab_BP_ActorCamera_2017-5-14_0-26-48_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/181347/328993fd-29f0-be63-8aa4-50f7afe355f0.png)


５．イベントBeginPlayからSetViewTarget with Blend関数を設定します。
このとき、ターゲットにGetPlayerControllerから習得したValueを、NewViewTargetにselfを入れておきましょう。

また、同時にイベントTickで位置が更新されるようにSetActorLocationとSetActorRoatationをそれぞれ、GetPlayerPawnから取得したGetActorLocationとGetControllRotationセットします。

![SnapCrab_イベントグラフ_2017-5-14_0-28-25_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/181347/9a198d14-915b-ab4a-c6c1-3eb1d22d6655.png)



※ここでCameraActorのLocationに任意の位置を設定すると、その位置が注視点になります。例えば、GetSocketLocationで頭の位置を取得して設定すると注視点を頭にすることができます。


６．さてそうして作成したCameraアクターをドラッグ＆ドロップで適当なところに配置して、一度Playしてみたところ、カメラがキャラクターに埋まってしまいました。

![ScreenShot00004.png](https://qiita-image-store.s3.amazonaws.com/0/181347/dc60506c-b57a-e941-3679-61c6123ccf31.png)


７．これはSpringArmがCameraの当たりをチェックして引き寄せているため埋まっている状態になっています。
解決するためにはキャラクターがカメラとぶつからないようにしてあげる必要がありますので、再度、ThirdPersonCaracotrのブループリントを開いて、CapselComponentとMeshのCollisionをCustomに変更して、Cameraに対するあたりをブロックからOverrideか無視するように設定を変更しましょう。

（カプセルコンポーネントの変更）
![SnapCrab_NoName_2017-5-13_23-49-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/181347/b1623e9a-ab46-684d-f592-a102205e542c.png)

（メッシュ側の変更）※両方しないと埋まります。
![SnapCrab_NoName_2017-5-13_23-50-28_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/181347/195c3514-27d6-9967-201c-ecd6b43568a7.png)


８．無事、キャラクターにくっつく別アクターのカメラが完成しました。
![ScreenShot00005.png](https://qiita-image-store.s3.amazonaws.com/0/181347/9faf0edf-8767-d753-0d4a-7c726908227e.png)

##パッケージ
（HPバーの記事のパッケージも上記内容は内包されていますので、それと同じものです）
https://drive.google.com/file/d/11y-q7ZpAjGJn81LXv8Q-7Qbydto4ASUB/view?usp=sharing
VirtualBoxの仮想マシンの保存先を任意のディレクトリに設定したい

この間、macOS sierraの仮想環境を作成したら、
8GB以上にも及ぶデータがCドライブ（SSD）のユーザーディレクトリ直下の
「VirtualBox VMs」というディレクトリに書き込まれているのを発見したので、
SSDへの書き込み数を減らすべく、任意のディレクトリ（今回の場合HDD内）に設定してみました。

以下、その時の作業内容です。

# 動作環境

- Windows10 Home
- VirtualBox 5.1.22

# 設定方法
※こちらの方法は非推奨としました。詳しくはコメント参照願います。

仮想マシンはシャッドダウンしておくこと。

```xml:~\.VirtualBox\VirtualBox.xml
~省略~
    <MachineRegistry>
      <MachineEntry uuid="{xxxx}" src="${任意のディレクトリ}/virtualbox-name/xxxx.vbox">
    </MachineRegistry>
    ~省略~
    <SystemProperties defaultMachineFolder="${任意のディレクトリ}" ...>
~省略~
```

あとは、すでにあるマシンファイルを任意のディレクトリ先に移動するだけとなります。
以下、PowerShellでの実行例です。

```PowerShell
Set-Location ~
Move-Item '.\VirtualBox VMs\' ${任意のディレクトリ}
Remove-Item '.\VirtualBox VMs\'
```

念のため、仮想マシンが起動できるか確認しておきましょう。
以上です。
shinydashboardのサイドバーをデフォで隠す方法

タイトル通り、shinydashboardで生成したページのサイドバーをデフォルトで隠す方法です。
結論から言うと、**shinyjs**を使ってクラスを追加してやればOKです。

例えば、こんなコードがあったとする。

```r:ui.R
library(shiny)
library(shinydashboard)

sd_header <- dashboardHeader()

sd_sidebar <- dashboardSidebar(
 menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
 menuItem("Widgets", tabName = "widgets", icon = icon("th"))
)

sd_body <- dashboardBody( 
 tabItems(
  tabItem(tabName = "dashboard",
          infoBoxOutput(outputId = "dashboard")
  ),
  tabItem(tabName = "widgets",
          h2("widgets")
  )
 )
)

dashboardPage(
 sd_header,
 sd_sidebar,
 sd_body
)
```

```r:server.R
library(shiny)

shinyServer(function(input, output) {
 output$dashboard <- renderInfoBox(
  infoBox(title = "dadshboard", icon = icon("thumbs-up"))
 )
})

```

で、こういうページが生成されてるはず。
![Untitled.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/631117be-68c4-c09d-e212-4f30e920fd36.jpeg)


でも、デフォでサイドバーを隠しておきたいときだってあるはずですが
dashboardSidebarには特にそのあたりを指定する引数が無い。。。

# やり方
じゃあどうすれば良いか？と探してみたら**shinyjs**というライブラリを使ってaddClassを使ってclassを追加してあげればOKのようです。

shinyjsはserverとuiどちらにもコードを追加する必要があり
serverにはaddClass()、uiにはdashboardBody()の中にuseShinyjs()をそれぞれ追加し、
次のようなコードになります。


```r:ui.R
library(shiny)
library(shinydashboard)

sd_header <- dashboardHeader()

sd_sidebar <- dashboardSidebar(
 menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
 menuItem("Widgets", tabName = "widgets", icon = icon("th"))
)

sd_body <- dashboardBody( 
 useShinyjs(),
 tabItems(
  tabItem(tabName = "dashboard",
          infoBoxOutput(outputId = "dashboard")
  ),
  tabItem(tabName = "widgets",
          h2("widgets")
  )
 )
)

dashboardPage(
 sd_header,
 sd_sidebar,
 sd_body
)
```

```r:server.R
library(shiny)
library(shinyjs)

shinyServer(function(input, output) {
 addClass(selector = "body", class = "sidebar-collapse")
 
 output$dashboard <- renderInfoBox(
  infoBox(title = "dadshboard", icon = icon("thumbs-up"))
 )
})
```

これで、ページを開いた状態でサイドバーは閉じた状態になります。
Ubuntuにngrockをインストールする

Windows7パソコンの私はOracle VM VirtualBoxでUbuntuを起動しましてそこにngrockをインストールします。
Ubuntuの環境は以下。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/7b03097a-469b-6941-006c-e3874dca78e9.png)

#ngrockとは？
ファイアウォール下でもHTTP等をトンネリングして外部からアクセスできるようにするトンネリングサービスです。どちらかというとWebアプリケーション等の開発者向けで、用途としてはローカルで開発中のWebアプリケーション等の動作検証で外部からアクセスしてもらえるようにする、などがあるようです。


#ngrockをインストール

[ngrockのサイト](https://ngrok.com/)からOSに合わせた資材をダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/6db28173-ce04-cdb9-8a4d-7517a3f19130.png)

ライブラリに保存するために[Save File]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/d45c145f-3ec7-ec46-f571-d551554e7036.png)

保存できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/f2bfc0b6-bfc3-e167-b3c7-33d1ef3384b4.png)

展開します。

```
$ unzip /path/to/ngrok.zip
```

homeディレクトリにngrokディレクトリができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/3fcb564b-6dad-b991-dc8f-64f74a135a1d.png)

```
$ ngrok help
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/6c8cffd6-765e-bc38-0e56-f11aca838ce4.png)

できましたね。
インストールする前に必要に応じてngrokを移動します。

```
$ sudo mv ./ngrok /usr/local/bin
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/05936195-0f53-fad2-2731-a88b33bf9dfc.png)
移動でけた。

インストールします。

```
$ sudo apt-get install ngrok-client
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/d4318fb8-c1c7-541d-a92d-77cc8a652704.png)
できたっぽい。

#動作確認

```
ngrok help
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/02540f8e-20d0-0b51-3329-ab8c596023a4.png)

httpで起動してみます。

```
$ ngrok http 80
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/178aa4c8-954d-d31f-1e43-414b821aafd7.png)

出力されたURLをブラウザで開いてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/b2e38baf-60fa-6f63-035d-6bd57db17f09.png)
トンネル自体は成功してるっぽいけどなんかエラーが出る。。Ctrl+Cで戻ります。

#参考
以下参考になります。
・[トンネリングサービスのngrokを使ってみた](http://abyssluke.hatenablog.com/entry/2015/03/25/210640)
・[ルーターを超えてリモートホストに接続できる ngrok（無料）を使ってRaspberry Pi を IoT ハブにする方法](http://netbuffalo.doorblog.jp/archives/4974284.html)
・[ngrockでローカル環境と外部サービスをつなぐ](http://qiita.com/yamatmoo/items/8d5c2ffe6edf54c91957)
4つのWord8からWord32に変更する

入力で受け取ったByteStringを32bitの数値で扱いたい。

いろいろ方法がありそうだけど、自前で作成してみた。Cならばunionで4バイト領域にへunsigned charとunsigned longとしてアクセス可能で便利であるが、型が厳密なHaskellではそうはゆかないようです。

ByteStringをWord8のリストで扱うことは容易なので、ByteString -> Word8を4つ切り取って、Word32へ変更という作戦です。

http://randt.jp/?p=1155
MattermostをDebian（Apache＋MySQL）にインストール

チャットルーム的なものが欲しかったので、Rocket.chatと悩んだ末、MySQLが使えるMattermostにしました。

一応公式にもマニュアルはありますが、結構詰まった（丸1日かけてしまった…）のでメモ書きを残しておきます。

# 下準備

## Goをインストール

http://golang-jp.org/doc/install

## MySQLのアップデート

Ver.5.6が必要。
ちなみにバージョンが古いと起動時に
>Failed to create index Error 1214: The used table type doesn't support FULLTEXT indexes

というエラーが出ます。

通常の方法だとまだ5.5.55しか入らないので、
http://www.debiantutorials.com/install-mysql-server-5-6-debian-7-8/
を参考に5.7.18までアップデートした。

>E: Sub-process /usr/bin/dpkg returned an error code (1)

というエラーが出たが、とりあえず入ったみたいなので放置。

# Mattermostのインストール

基本的に取ってきて置くだけ。公式マニュアル
https://docs.mattermost.com/install/prod-debian.html
の「Set up Mattermost Server」のセクションを読む。

~~ディレクトリ全体を実行用ユーザーの所有にしておく。~~結局うまく動かなくてsudoで起動したので要らないかも。

## Apache

サブドメインと仮想サーバーなどを用意しておく。
ヴァーチャルホストの設定ファイルの書き方は以下が参考になりました。

- [CentOS7+Apacheサーバに GitLab 9.0 + Mattermost 3.7 をインストールする](http://qiita.com/miyahan/items/36aceed26aaeecdd5b4a)
- [Mattermost Apache config example](https://gist.github.com/misje/52551fc43754d2e27f32)

エラーメッセージをメモし忘れましたが、ProxyのところでSyntaxエラーが出たら

```
sudo a2enmod proxy_http
```

## MySQLの設定とデータベースへの接続

データベースとユーザーを作っておく。

```mysql
CREATE DATABASE データベース名;
GRANT ALL PRIVILEGES ON データベース名.* TO 'MySQLユーザー名'@'localhost' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
```

Mattermost設定ファイルは /opt/mattermost/config/config.json
`"DriverName": "mysql"`はそのまま。

```config.json
"DataSource": "MySQLユーザー名:パスワード@tcp(localhost:3306)/データベース名?charset=utf8mb4,utf8",
```

ポートや書き方を間違えると

- default addr for network 'localhost' unknown
- Failed to ping DB err:dial tcp [::1]:8065: getsockopt: connection refused
- packets.go:33: unexpected EOF  
Failed to ping DB err:driver: bad connection

等のエラーが出ます。とりあえず3306にしたら接続できました。

他にもURLの設定など、
https://docs.mattermost.com/administration/config-settings.html
を見ながらお好みで。

## ポートを開ける

tcp:8065 を開ける。[GCEの場合はコンソールでの設定も忘れない](http://qiita.com/yukari-n/items/01d3194e261793ddbf02)。

# 起動

```
sudo /opt/mattermost/bin/platform &
```

バックグラウンド起動にしないとプロセス切ったら落ちます。

上のコマンドで動かないときは以下を確認。

1. /opt/mattermost/logs/mattermost.log の所有者がmattermostになっているか
2. 今作業しているユーザーがmattermostグループに入っているか

## 管理画面からの設定

config.jsonを書き換えなくてもコンソールから出来るようになる。
サーバーの再起動が必要なものもあるが、その旨書いておいてくれる親切仕様。

メール認証をしたい場合、GCEの場合は[Mailgunなどを経由してメールを送信する](http://qiita.com/yukari-n/items/45624096582111dd25b9)ことになる。ポートはこの時自分で決めた物を使うこと。
しかもTLSだとうまくいかなかった。PLAINで接続できた。

# 未解決エラー

>[EROR] Unable to setup forwarding

このエラーは出ていても動く。
https://github.com/mattermost/platform/blob/master/app/server.go
の172行目。とりあえず`"Forward80To443": false`に戻したら消えた。

# その他の参考記事

- [Mattermost導入手順](http://qiita.com/dahugani/items/7e76621e13eb3780d33b)
ヘルパー(カスタムヘルパー)ってなんぞ？

#Railsのviewにおけるメソッド
ただし、もともと用意されている物ではありません。
これは、自作するなりどこかからコピぺする必要があります。

Railsのviewには、元から用意されている様々なメソッドが使用できますが、それで全ての機能が満たされているわけではありません。
やはり、どこかで追加していくわけです。

欲しい機能のため、追加していくメソッド。これを**ヘルパー/カスタムヘルパー**と言います。


#どこにあるの？
Railsでは簡単なコマンドで半自動的に、アプリケーションの開発に必要な多数のファイルを作成できます。
ですので、じゃあヘルパーがどこにあるのか。あるいは、どこに作成すべきなのかというと。

app/helpers/application_helper.rb

上記のような位置にあるのですが、これはつまり、appというディレクトリ(フォルダ)の中にあるhelpersというディレクトリのさらに中。
application_helper.rbというファイルがそれに当たるということです。
これ自体は自動作成されるもので、最初は至極簡素に以下のような内容になっています。

```application_helper.rb
module ApplicationHelper
end
```
はい。
本当にこれだけです。

この中に必要な機能を書き込んでいくことで、実際の見た目に影響するファイルであるapp/views/layouts/application.html.erbというファイルにその効果が現れます。


#使い方
例として、以下。

```application_helper.rb
module ApplicationHelper

 def full_title(page_title)
   base_title = "Ruby"
   if page_title.empty?
     base_title
   else
     "#{base_title} | #{page_title}"
   end
 end

end
```
```application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title><%= full_title(yield(:title)) %></title>
  〜中略〜
</head>
<body>

　　　　〜後略〜

</body>
</html>
```
上はブラウザの一番上に表示されるページタイトルについての例になります。
このようにすることで、application.html.erb側に書かれているtitleタグに
def full_title(page_title)以下、endまでの効果が反映されます。

page_title = yield(:title)

以上のように考えられますので、yieldで持ってきた:title(つまり、page_title)にempty・・・つまり、内容が無ければbase_titleにあたるRubyという文字列のみを返し、内容があればRuby | page_titleという文字列をタイトルに入れ込むことができる訳です。

このように、元からあるメソッドだけでカバー仕切れないところを自分で書き込んでいくことで補う物のことをヘルパー/カスタムヘルパーと呼びます。
width の読み方について

# はじめに

**width** の読み方についてツイッターで投票をお願いしたところ、181票も協力頂けたので、そのまとめです。何の影響力もない一般人アカウントでのアンケートなので、そんな事もあるかな程度に聞いて頂ければ。

ちなみに自分は日本人相手にはウィドゥス(ドゥとトゥの間位で母音抜き)で発音してます。なお、英語の発音(wídθ,wítθ/ウィス)とは掛け離れています。

# 結果

<p align="center">
<a href="https://twitter.com/yoya/status/863021351233232898">
<img width="640" alt="https://twitter.com/yoya/status/863021351233232898" src="https://qiita-image-store.s3.amazonaws.com/0/1798/54aeb463-2766-956a-daa7-18a748bc8827.png"> </a>
</p>

だいたい、選択肢に並べた通りの順位になりました。

<p align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/1798/c71e893a-4a82-8d7a-90bd-5c42263f36a5.png" />
<p align="center"> powered by <a href="http://aikelab.net/wdgg/"> http://aikelab.net/wdgg/ </a> </p>
</p>

それ以外だと、こんな発音をしてるというメンションを頂いてます。

```
ウィズ、ワイデス、ウィフ、ワイドス、ワイズ、ウィズジ、ウィズス、ワイド、
```

# 英語の発音

```
/ˈwɪtθ/, /ˈwɪdθ/, /ˈwɪθ/
```
- https://en.wiktionary.org/wiki/width

```
/wídθ, wítθ/
```
- http://ejje.weblio.jp/content/width

カタカナ読みすると、ウィトゥス、ウィドゥス、ウィス。
実際に発音を聞くとウィッツ(orウィッス)が近いでしょうか。

# 昔の話

- http://www.tagindex.com/statistics/tag_name/ ([web archive 2018/06/07](https://web.archive.org/web/20180607080034/http://www.tagindex.com:80/statistics/tag_name/))

```
ワイズ （62件）
ウィドス （57件）
ワイド （41件）
ウィドゥス （37件）
ウィズ （36件）
ワイドス （12件）
ワイス （6件）
(以下、5件以下)
```


2005年のアンケート結果です。以下のような解釈が出来るでしょう。

- ウィドスとウィドゥスを合わせて考えれば、これが一番で、次点ワイズ、３位がワイド、続いてウィズ、あとその他。
- もしくは、ウィズ/ワイド派と、ウィドス/ウォドゥス派の２強と、続いてウィズ、そしてその他。

この頃と比べると今日のアンケートでは、ウィズ(ウィッズ)がかなり増えている印象です。

# その他

<img width="536" alt="スクリーンショット 2017-05-13 23.30.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/1798/3b6a3633-1b01-e3ff-457b-7944c495faca.png">

他の業界で先に聞いた発音に引きずられるってのはありそうですね。

# 最後に

この手の聞くのが恥ずかしい系の質問は、プライドを持ってても仕方のない年寄りがすべきとの持論があるので、えいやっと聞いてみました。

結論としては、英語の発音としてはウィッスかウィス(←英語堪能なお友達からの情報)、日本人と話す時には勿論、相手の発音に合わせるのが基本ですけど、自分が先に言い出すのであれば、ウィドゥスが通じやすそうなので、そこから探っていこうと思います。
プロセスが使ったメモリー量を調べる

[tips: perl スクリプトが使うメモリ量を調べる方法 \- Qiita](http://qiita.com/bass_ikeda/items/aae7f287984b0e25f2ca)

ちょうど書こうと思っていたネタが投稿されていたので。

# メモリー量とは

RSSとVSSというのがあって
RSSは実際に確保した量、VSSは割り当てたけど使っていない量というもの。
本稿ではRSSの値を取る。

詳しくは以下リンク先他を参照のこと。（詳しくはｇｇｒ）

[Linuxトラブルシューティング探偵団　番外編（2）：減り続ける利用可能メモリ……そしてついにリブート！ \(2/3\) \- ＠IT](http://www.atmarkit.co.jp/ait/articles/0812/16/news121_2.html)

# プロセスが現在使っているメモリー量

[tips: perl スクリプトが使うメモリ量を調べる方法 \- Qiita](http://qiita.com/bass_ikeda/items/aae7f287984b0e25f2ca)

の通りである。

```bash
$ cat a.pl
#!/usr/bin/perl
my $a = "x" x 10_000_000;
while (1) {
  sleep 1;
}
$ ./a.pl &
$ ps -o pid,rss,cmd -C a.pl
  PID   RSS CMD
 8361 21372 /usr/bin/perl ./a.pl
```

# プロセスが使ったメモリー量

こちらが本題である。
使うのはpsでなく種も仕掛けもないtimeコマンド。ただしフルパス指定。
（bashではtimeは組み込み関数になるので）
プログラム側に仕込みがいらないのがメリット。

```bash
$ cat b.pl
#!/usr/bin/perl
my $a = "x" x 10_000_000;
$ /usr/bin/time -f "\n%M" ./b.pl

21372
```

ちからつきた。おやすみなさい。
HTTP Strict-Transport-Security (HSTS)


# 概要

ブラウザに次回のアクセス以降(指定した期間内であれば)ではHTTPSを使ってアクセスさせる

```
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload
```

max-age

- HTTPSでのアクセスを強制させる期間

includeSubDomains

- このオプションが指定された場合は全てのサブドメインに適用される

preload

- [preload listに含めてもらう為の条件](https://hstspreload.org/#submission-requirements)になってるので、申請する前にpreloadを返すようにしないと行けないらしい
- RFCにはないオプション

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
https://hstspreload.org/
https://tools.ietf.org/html/rfc6797


# HSTS 事前リスト

- HSTSをあらかじめ有効にするサイト一覧
- 事前リストに含めてもらうには[ここ](https://hstspreload.org/)で申請が必要 (一見怪しいサイトにみえるが、証明書を見る限りgoogleが管理してるっぽい)

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security#Preloading_Strict_Transport_Security

# その他

HSTSが有効なサイトはユーザが証明書エラーを無視することができなくなる(UAがそのケースはコネクションを切断してしまうため)

> 8.4.  Errors in Secure Transport Establishment
>
   When connecting to a Known HSTS Host, the UA MUST terminate the
   connection (see also Section 12 ("User Agent Implementation Advice"))
   if there are any errors, whether "warning" or "fatal" or any other
   error level, with the underlying secure transport.  For example, this
   includes any errors found in certificate validity checking that UAs
   employ, such as via Certificate Revocation Lists (CRLs) [RFC5280], or
   via the Online Certificate Status Protocol (OCSP) [RFC2560], as well
   as via TLS server identity checking [RFC6125].
   
https://tools.ietf.org/html/rfc6797#section-8.4


# 防げる問題

- httpアクセスをMITMで攻撃するケース
- httpsサイトにhttpのリンクやコンテンツを意図せず含めてしまったケース
- 不正な証明書をユーザが無視するようなケースを狙った攻撃

https://www.owasp.org/index.php/HTTP_Strict_Transport_Security_Cheat_Sheet#Threats

# 実際のレスポンスの例

```bash
$ curl -s -D - 'https://www.facebook.com/' -o /dev/null | grep Strict-Transport-Security
Strict-Transport-Security: max-age=15552000; preload
```
Apache ssl対応メモ

#はじめに
投稿練習も兼ねて、ApacheでSSL利用のために行ったことの備忘録として作成。
#前提
CentOS 6.9
Apache 2.2
#opensslのインストール
<pre># yum install openssl</pre>
#mod_sslのインストール
次のコマンドでモジュールがインストールされているか確認。
<pre># httpd -M | grep ssl</pre>
入っていない場合、次のコマンドでmod_sslをインストール。
<pre># yum install mod_ssl</pre>
インストールの際に /etc/httpd/conf.d/ssl.conf が作成される。
#秘密鍵、証明書の作成
<pre># cd /etc/httpd/conf</pre>
次のコマンドで秘密鍵を作成。
<pre># openssl genrsa -aes128 1024 > server.key</pre>
次のコマンドでCSR（証明書の基となる情報）を作成。
<pre># openssl req -new -key server.key > server.csr
*パスフレーズを入力*
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
*国コード*
Country Name (2 letter code) [XX]:JP
*都道府県*
State or Province Name (full name) []:Tokyo
*市町村*
Locality Name (eg, city) [Default City]:
*組織名（空白）*
Organization Name (eg, company) [Default Company Ltd]:
*部門名（空白）*
Organizational Unit Name (eg, section) []:
*サーバ名、IPアドレスを入力*
Common Name (eg, your name or your server's hostname) []:192.168.56.254
*メールアドレス（空白）*
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
*別のパスワード？（空白）*
A challenge password []:
*別の組織名（空白）*
An optional company name []:
</pre>
次のコマンドで証明書を作成。
<pre># openssl x509 -in server.csr -days 36500 -req -signkey server.key > server.crt</pre>
#起動時にパスフレーズの入力を省略
<pre># mv server.key server.key.bak</pre>
次のコマンドでパスフレーズを削除。
<pre># openssl rsa -in server.key.bak > server.key</pre>

#sslの設定ファイル編集
<pre>vi /etc/httpd/conf.d/ssl.conf</pre>

<pre>元ある記述をコメントアウトし、下記を追加
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server.key
</pre>

Apacheを再起動して完了。
以上
| while read のwhileループ脱出にはbreakではなくexitを利用する(+それに関連するTips)


`| while read`はbashプログラミングにおいてもっとも使われるイディオムのひとつですが、__この`while`ループを脱出する際は`break`ではなく`exit`を使います。__これは`while`がサブシェルになる影響――すなわち`while`から脱出するにはサブシェルを抜ける必要があります。

```bash
cat ${file} | while read line; do
    [[ "${line}" = "END" ]] && exit 0
done
```

シェルコマンドは終了ステータスを持ち、`while`は通常`0`を返しますが、`exit`を明示した場合にはその`exit`の引数が終了ステータスになります。以下のサンプルに示すように、この性質は多重ループの脱出などに利用すると便利です。__ただし以下のサンプルでは`-e`オプション、つまり`0`以外の終了ステータスを検知するとシェル自体を終了してしまうオプションは利用できなくなります。__

```bash
echo ${files[@]} | while read file; do
    cat ${file} | while read line; do
        [[ "${line}" = "END" ]] && exit 99
    done
    
    [[ $? -eq 99 ]] && exit 99
done
```

`while`ループ脱出に`exit`を利用するのは、パイプの流し込み先に`while`が指定されたときだけです。__つまり単なる`while`ループの脱出には`break`を利用します。`exit`を利用すると、当然ですがシェル自体が終了してしまい、想定通りの動作を示しません。__

```bash
while :; do
    do_something
    [[ $? - ne 0 ]] && break
done
```
【第2回】静的テスト

# 1. はじめに
第1回テストケースにて投稿した記事のPVが好調だったため、
第2回を投稿したいと思います。

# 2. 人による静的テスト
レビュー、ウォークスルー、インスペクション

1. ブラックボックステスト
答えがあっていればよい
インプットとアウトプットを確認する
2. ホワイトボックステスト
内部を知った上で全部行う
3. グレーボックステスト

※おおまかなフェーズ
1. 単体テスト
ソフトウェアを構成する最小単位（モジュール）に対して行う

2. 結合テスト
単体テストを行ったモジュールを組み合わせて行う

3. 総合テスト
ハードウェア・ミドルウェアなどとも結合して行う

4. 受け入れテスト
顧客側が要求通りにソフトウェアが作られているか確認する

## 2-1. 品質の観点からの分類

1. 機能テスト
テスト対象に入力を与えたり，動作させたりしたときに，正しい実行結果が出るかどうかを確認
2. 性能テスト
ユーザがストレスを感じない程度かの確認
3. 負荷テスト
テスト対象が実行できる限界のリソースを確認
4. ユーザビリティテスト
ユーザにとっての「使いやすさ」に着目したテストで，特に高齢者や障がい者などに配慮した「アクセシビリティ」の高い作りになっているかどうかの確認
5. セキュリティテスト
ソフトウェアの実行中に機密情報が漏洩しないことや，外部からの悪意を持った攻撃に耐えられることを確認

## 2-2. 実行方法
1. 動的テスト
テスト対象を動かしてみて結果を確認
2. 静的テスト
ソースコードレビュー等

## 2-3. テストケース作成技法
1. ブラックボックステスト
テスト対象に入力を与えて，実行された結果が正しいかどうかを確認
2. ホワイトボックステスト
テスト対象に入力を与えた際に，どのような順序で処理が実行されたり，データの値が変化したりするのかを確認

## 2-4. これらのテストを効果的に実施する(品質を確保)するには
1. テストの実施範囲を明確にする
例) 単体テストで確認した（細かい）ことを結合テストでは確認しない

2. 正しいプロセスで行う

3. ツールを効果的に利用する
同じ作業を繰り返し実行することが多いので，それをツールに任せることで効率が上がります。
ツールに頼りすぎると十分なテストができなかったり，逆に時間を要してしまうこともありますので，注意が必要です。

4. テスト管理をする
作業がきちんと行われているか確認し，作業した結果の分析や評価を行い，そこで得た教訓を次の開発に活かしていきます。

5. 情報を横展開する
そのバグはどのような観点のテストケースから見つけられたのか，バグを作りこんだ原因は何かといった情報を記録し共有する。

【参考】
1. [俺のサイト](http://tegend.net/1279.html)
2. [ソフトウェアテスト基本テクニック 第1回 ソフトウェアテストを分類する](http://gihyo.jp/dev/serial/01/tech_station/0001?page=2)
BaserCube インストール

# この記事で使用したバージョン

| アプリ | バージョン | インストールパス | URL |
|:-------|:----|:----|:----|
| BaserCMS | 4.0.4 | /public_html | https://cube3.example.jp/ |
| BaserCube | 2.0.0 | /public_html/app/Plugin/ | - |
| EC-CUBE | 3.0.14 | /public_html/eccube | https://cube3.example.jp/ec/ |

# プラグインの設定

```php:app/Plugin/BaserCube/Config/setting.php
$config = array(
  'BaserCube' => array(
    // EC-CUBE設置PATH: public_html/eccube
    // WWW_ROOT . DS となっているが パスがおかしくなるので DS削除
    'EcConfigPath' => WWW_ROOT . 'eccube'  ,
    // EC-CUBE設置URL(Base): 
    // 設定によりけりだが https の設定変更が必須の場合もあるが
    'EcUrl' => 'https://' . $_SERVER['HTTP_HOST'] . '' ,
  ),
);
```

# テスト環境でエラーとなる場合はこうなる

```php:Event/BaserCubeControllerEventListener.php
// 以下以外にも設定ファイルが存在しない場合のエラーとして出力メッセージの可視レベルが protected のため エラーとなる
// 別のサーバーのDBを使っている場合は必要が無いのだが localhost 設定の場合 接続先ホストが存在しないエラーとなる
$dbConfig = array(
 'datasource' => $datasource,
 'persistent' => false,
 'host' =>  $ecDatabase['database']['host']?:"localhost",
 'port' => $ecDatabase['database']['port'],
 'login' => $ecDatabase['database']['user'],
 'password' => $ecDatabase['database']['password'],
 'database' => $ecDatabase['database']['dbname'],
 'schema' => '',
 'prefix' => '',
 'encoding' => $ecDatabase['database']['charset'],
);
```
macOS Sierraにアップグレードしたらvagrant up出来ない


OS X El CapitanからSierraにアップデートしたら以下のエラーを履いてvagrantが起動しなくなった。

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 66 of file VBoxManageHostonly.cpp
```

ぐぐってみるとアップグレードしたら結構動かない問題があるみたい。
Virtual boxとvagrantを一度アンインストールして再インストール。

以下のコマンドで起動するとエラーが再び。

```
$ vagrant up
Vagrant failed to initialize at a very early stage:

The plugins failed to initialize correctly. This may be due to manual
modifications made within the Vagrant home directory. Vagrant can
attempt to automatically correct this issue by running:

  vagrant plugin repair

If Vagrant was recently updated, this error may be due to incompatible
versions of dependencies. To fix this problem please remove and re-install
all plugins. Vagrant can attempt to do this automatically by running:

  vagrant plugin expunge --reinstall

Error message given during initialization: Unable to resolve dependency: user requested 'vagrant-hostsupdater (> 0)'
```

エラー文言に従って

```
$ vagrant plugin expunge --reinstall
```

したあとに起動で完了。
めでたしめでたし。


以下、ダウンロードページ
[vagrant](https://www.vagrantup.com/downloads.html)
[Virtual box](https://www.virtualbox.org/wiki/Downloads)



参考：http://stackoverflow.com/questions/39652593/virtualbox-error-on-macos-sierra
次元の呪い (Curse of dimensionality) とは何なのか

# 次元の呪い (Curse of dimensionality) とは何なのか

データサイエンスの本や、ブログなどを見ているとよく目にする、次元の呪いとはなんなのか、と疑問に思ったので、調べてまとめてみました。

Wikipedia より
>
高次元ユークリッド空間の広大さを示す別の例として、単位球と単位立方体の大きさを次元を上げながら比較してみればよい。次元が高くなると、単位球は単位立方体に比較して小さくなっていく。したがってある意味では、ほとんど全ての高次元空間は中心から遠く、言い換えれば、高次元単位空間はほとんど超立方体の角で構成されており、「中間」がない。このことは、カイ二乗分布を理解する上で重要である。

と、ちょっと日本語が正しく使われていないようなので、頑張って初心者言語に翻訳していきたいと思います。

## この回のポイント↓

まぁ、次元の呪いを機械学習をする上で簡単に言うと、
**"扱う特徴量(次元)が多すぎて、機械学習モデルが効率よく回帰または分類ができないこと"**
を言います。

特徴量とは、例えば'花'で言うと、花弁、茎、葉、根などのことです。
回帰や分類の違いは、前回まとめたので、[こちらを参照](http://qiita.com/koji_france/items/5b7bcbe6c72b716a8cd9)

## たとえ話

[Stackflow の fcop さんのコメント](https://stats.stackexchange.com/questions/169156/explain-curse-of-dimensionality-to-a-child)がわかりやすかったので、要約して翻訳してみます。

質問は、子供でもわかるように次元の呪いを説明してくださいとの質問に対して、fcopさんはこう答えていました。

例えば、様々な種類のクッキーが入ったトラックがあるとして、その中から子供が自分の好きなクッキーを選ぶ時に、'味'という特徴量だけ考えると、[甘い,辛い,すっぱい,苦い]の4種類しかないとします。この特徴量だけを考慮すれば、子供は簡単に好きなクッキーを選べますよね。きっと、甘いに属するクッキーでしょうね。しかし、これに新しい特徴量'色'[赤、青、黄、緑]が入ってくると、4種類×4種類で16通りが考えられますね。さらに、5種類の'形'という特徴量が加わると、4×4×5=80通りになってしまいます。これを、繰り返していくと指数関数的に種類が増えていき、なにがなんだかわかんなくなってしまいますよね。これが、次元の呪い、the curse of dimensionality です。


## 次元の呪い (Curse of Dimensionality) の2つの解決策

- 特徴選択 (Feature selection)

必要不可欠な特徴量（次元）、とくに必要ではない特徴量を見極めて、後者を消去（削減）します。このことを特徴選択といいます。 特徴選択には、filter法とwrapper法とEmbedded法があるようです。これは、また改めて新しいページにまとめますので、気になる方はこのページをストックするなり、フォローするなりしておいてください、そのうちここにリンク貼ります。もしくは、英語で読める方は、こちらを参考にどうぞ。[これ](https://www.analyticsvidhya.com/blog/2016/12/introduction-to-feature-selection-methods-with-an-example-or-how-to-select-the-right-variables/)

- 特徴作成(Feature creation)

これは、２つ以上の特徴量を組み合わせて、1つの特徴にまとめてしまおうというものです。
Kaggle の Titanic survival prediction のコンペで使われているデータには、Parch と SibSp という、親子と兄弟、配偶者の数を示す特徴量がありました。それを、多くの人が、Family Size というParch と SibSp を足し合わせた特徴量にまとめていました。これが、特徴作成です。
ハッシュによるパスワード生成プログラム

いろいろなサイトの複雑なパスワードを安全に管理するためには、どうするかという話。

パスワード管理用のソフトやアプリは色々あり、それで管理しているという人も多いだろう。しかし、ある特定のソフトに依存するということは、そのソフトの開発者が信頼できるか、パスワードは安全か、突然ソフトが使えなくなってパスワードにアクセスできなくならないか、といったような不安もある。

そこで、パスワードのリストを作成して、そのファイルを暗号化して保存している、という人もいることだろう。

## ハッシュによるパスワード生成 ##

ここでは、「サイト固有のパスワードの種」をファイルに保存しておいて、「記憶しているマスターパスワード」と決められたハッシュアルゴリズムから、サイトのパスワードを都度生成する、という方法について書く。

> C(H(M + S)) = P

H: ハッシュ関数
C: ハッシュをパスワード文字列に変換する関数
M: 記憶しているマスターパスワード
S: サイト固有のパスワードの種
P: サイトのパスワード

この方法は「パスワードを暗号化して保存する」方法よりも総当たり攻撃に強いという特徴がある。試みに適当なマスターパスワードを入力したときに、生成されたパスワードが正しいか否かは「実際にサイトにログインを試みないとわからない」ためである。

## Python 3 版のプログラム ##

Python 3 で書いたそのようなプログラムを公開している。

[パスワード生成プログラム](https://gist.github.com/sekika/89338aa1a25aebcf2e8698aad6db0080)

プログラムに直接「サイト固有のパスワードの種」を書いて使用する。サンプルとして、google, amazon, twitter の「サイト固有のパスワードの種」を入れてある。

このプログラムを password という名前としてパスが通っているところに保存して、

```
password google
```

として起動すると、

```
マスターパスワードを入力してください。
```

と表示されるので、そこで自分が決めたマスターパスワードを入力すると、パスワードが表示される。クリップボードにコピーするように設定することもできる（ソースコード参照）。

サイトごとの情報は、プログラム冒頭で辞書オブジェクトとして

```python
sitekey = {
    "google" : ["sha512", "an", 16, "kKkMqYDUIivWLi3WSt3VndHci"], 
    "amazon" : ["sha3_384", "an", 16, "stBuQIQgT9Yp84RBK3HdllnUK"],
    "twitter" : ["sha3_512", "an", 14, "UmhvSHT72smO4aI1LMYt7H2el"]
}
```

のように定義されているのでここを書き換える。ここで、サイト固有のパスワードの種だけではなく、ハッシュアルゴリズム、パスワードの文字種（an はアルファベットと数字）、パスワードの長さも指定する。また、要素を追加すればその情報が表示されるため、たとえばサイトごとのユーザー ID や登録したメールアドレス、二段階認証に設定した電話番号などの情報を書き込んでおくことができる。さらに詳しいことは、ソースコードのコメントを参照。

せっかくプログラミングができるのであれば、自分の好きな言語でこのようなプログラムを作成して自分好みに管理するのが良いであろう。私は、自分専用のスクリプトはすべてプライベート Git リポジトリで管理して、そのディレクトリにパスを通して使用しているが、このような自分専用のパスワード生成スクリプトもそこで管理をしている。

## JavaScript 版のプログラム ##

このプログラムの [JavaScript 版](http://seki.webmasters.gr.jp/password.html)を作成した。「マスター」にマスターパスワードを入れると、リアルタイムでパスワードが生成され「コピー」でクリップボードにコピーされる。[jsSHA](https://caligatio.github.io/jsSHA/)を使って SHA の計算をしている。Python 版と JavaScript 版で、同じマスターパスワードから同じパスワードが生成される。JavaScript 版では連想配列を使って

```javascript
var sitekey = new Object({
    "google" : ["sha512", "an", 16, "kKkMqYDUIivWLi3WSt3VndHci", "https://www.google.co.jp/",  "ユーザID: xxx", "2段階認証: "], 
    "amazon" : ["sha3_384", "an", 16, "stBuQIQgT9Yp84RBK3HdllnUK", "https://www.amazon.co.jp/", "メール: xxx"],
    "twitter" : ["sha3_512", "an", 14, "UmhvSHT72smO4aI1LMYt7H2el", "https://twitter.com", "https://twitter.com/seki/"]
});
```

のように定義しているので、サイトごとの情報は Python の定義をそのままコピーして使える。モバイルからアクセスする必要のあるパスワードについては、JavaScript 版でもパスワードを生成できるようにしておくと便利である。

この記事はプログラマー向けに書いたが、[パスワードの管理について](https://sekika.github.io/2017/05/09/Password/)には、もう少し一般の人向けに書いた。
さくらのサーバで WordPress を https 化する際の .htaccess の記述

サイトを HTTPS 化するにあたって、少々手こずったのでメモ。
基本的には以下の記事が、とても参考になりました。

- [WordPressをhttps化する方法とさくらサーバーでの注意事項](https://webtatan.com/blog/wordpress/wordpress-https-sakura)

Wordpress は `/www/wp/` にインストールしており、単純に http のアクセスを https に変更するだけです。今回は [ラピッドSSL](https://ssl.sakura.ad.jp/rapid_ssl.html) を使ったものになります。

基本的には記事に沿って行えば問題無いと思うのですが、 `.htaccess` の記述に関してうまくいかず、少し手間取りました。最終的には [teratail で見つけた記事](https://teratail.com/questions/16869) を参考に以下のように書き換えました。

```apache:.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !^on [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,QSA]
</IfModule>
```

この記述で意図通りの動きになりました。何かの参考になれば。

#### 参考リンク

- [【独自SSL】導入の流れ・設定手順 &ndash; さくらのサポート情報](https://help.sakura.ad.jp/hc/ja/articles/206054802--%E7%8B%AC%E8%87%AASSL-%E5%B0%8E%E5%85%A5%E3%81%AE%E6%B5%81%E3%82%8C-%E8%A8%AD%E5%AE%9A%E6%89%8B%E9%A0%86)
- [さくらのレンタルサーバーで、.htaccess を使って http を https へリダイレクトして、www も無しで統一する | Latele Blog](https://latele.co.jp/blog/back-end/2016/0418_10)
- [さくらのSNI SSLでhttp→httpsリダイレクト](https://woresite.jp/2015/07/01/052816.html)
エックスドメインの無料サーバーは決して早くない

いきなりセンセーショナルなタイトルではじめてますが、これはgZip圧縮ができないということで、サイトのダウンロードサイズが何倍も膨れ上がってしまうことを指しています。このことは、一時期ヘルプにも書いてあった通り、gZip圧縮に必要なモジュールがユーザーに開放されていないことによるものです。gegahostが恋しくなってしまいます。gegahostは、サポートが一切されていなかったのに、サーバーまた貸しサービスでったために、速さだけは一級品でした。まあ、いまさら嘆いても仕方ないので、フロントエンドの改築でどうにかしようと思います。
##WordPressだけではどうにもならない
問題点は先の通りなので、今あるデータを活用するにしても、フロントエンドサーバーを変えなくてはいけませんので、WordPress運用中のエックスドメイン無料サーバー(以下、現サーバー)だけではどうにもなりません。そこで、Netilfyを活用しようかと思います。
###1.jsベースフレームワークでのサイト+現サーバー
これは、データ移動の手間がないのでそういう点ではいいのですが、私が作り上げることができるかというのが最大の問題点ですね。そもそも、これは自己満足でありますから、あまりにコストがあると腰が引けてしまいます。いずれ作りたいところですが。というわけで、あまり現実的ではないですね。ルーティングとか、WP REST API上の制約とか。
###2.Netlify CMS+静的サイトジェネレーター
せっかくなので、こっちに移行しようかと思ってしまっています。[こちら](https://www.netlifycms.org/)を見て頂ければ、Netlify CMSがどういうものか把握できるかと思います。これを使いやすいように改造しつつ、稼働実績のあるHuGoをパートナーに選んで、それのテーマをつくるのがいいですかね。
##まとめ
一応2案書きましたけれども、後者が現実的ですね。その中での知見を活かして、前者のやつをちまちま作るぐらいだと思います。