OmniAICreator/Qiita-1.07M huggingface dataset:
将棋のAPIがあったら対戦つくれそうかな・。・使っていいっすか？

将棋盤代わりに駒を並べて動かせるボード。

将棋用のソフトは沢山あるので、これで対戦したいとは思わないんだけど。

対戦できるなら、対戦を入れたい・。・が、AIを書きますよというパワーは無いので、棋譜を並べて動かしてみたり、詰将棋を並べて動かしてみたり、メモ代わりに局面図を作ってみたり。

そして、ハム将棋でハムに負けてもらう。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/215245/368d686d-f8a5-8f4e-4393-f79f0463fcb0.png)

サーバーレス将棋 AI ☖　https://qiita.com/na-o-ys/items/b04ce27732c82b6beb9b という投稿を見つけたので・。・ちょっと繋いで動かしてみようかな。

という段階。

🐮のweb APIがあれば対局できますよ・。・というレベルまでテストさせてもらおう。

と、とりあえず書いて・。・いつものように、でき上げるのは遠い未来のような気がします。


まったく、ノウハウの共有にはならないな。
Facebookに書くと、イロイロ混ざってわけわからんようになるので・。・ここにメモ代わりに書いておこう。

囲碁のGUIとか、よく分からん描画ツールとか、フリーの書籍を組み込んだリーダーとか、知識もそこそこ、プログラムもラーメン、コツコツやっているとできるようなものを作っていきます。それ単体では意味不明が多いけれど。

Logotypeという名前で・。・こういう名前をつけると、説明が簡単なので。

それが、Logotypeです。
Mroongaデータベースが壊れたので、MySQLとデータを入れ直した手順

ほぼ自分めもです。

## Mroongaのデータベースが壊れた

```
ERROR 1016 (HY000): mroonga: failed to open table xxxxxxx
```

## restoreを試みるも失敗

```
mysql -u root -p xxxxxx< mysql_bkup.sql

ERROR 1016 (HY000) at line 36: grn_io_lock failed
```


## データディレクトリを削除して一から構築し直し


### データディレクトリ一旦削除


```
rm -rF /var/lib/mysql/{database}
```

### アンインストール

-　ライブラリを調べる

```
$ yum list installed |grep -i "mysql"
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
groonga-normalizer-mysql.x86_64      1.1.1-1.el7.centos              @groonga
mysql-community-client.x86_64        5.7.18-1.el7                    @mysql57-community
mysql-community-common.x86_64        5.7.18-1.el7                    @mysql57-community
mysql-community-libs.x86_64          5.7.18-1.el7                    @mysql57-community
mysql-community-libs-compat.x86_64   5.7.18-1.el7                    @mysql57-community
mysql-community-release.noarch       el7-7                           installed
mysql-community-server.x86_64        5.7.18-1.el7                    @mysql57-community
mysql57-community-mroonga.x86_64     7.02-1.el7.centos               @groonga
php-mysqlnd.x86_64                   7.1.5-1.el7.remi                @remi-php71
````

- MySQLを停止させてから

````
$ sudo systemctl stop mysqld
````

- 全てアンインストール

````
$ sudo yum remove xxxxxxx
````

### 再度インストール

- 構築時の手順に従ってインストール

[2\.5\. CentOS — Mroonga v7\.08 documentation](http://mroonga.org/ja/docs/install/centos.html#centos-7-with-the-official-mariadb-package)


- パスワードの確認

```
$tmp_password=$(sudo grep 'A temporary password' /var/log/mysqld.log | sed -e 's/^.*: //')
$ echo $tmp_password
A8<g2!3%=rry
```

ログインしてからパスワードは変更すること


## バックアップデータをrestoreして終了

```
mysql -u root -p xxxxxxxxx< mysql_bkup.sql
```


バックアップ大事
BaserCMS テーマ 「Pages』 ディレクトリPathの変更

# BaserCMS テーマ 「Pages』 ディレクトリPathの変更

BaserCMSテーマの固定ページを管理するPagesディレクトリが

Pathの変更になったことを書きたいと思います。

## 環境
BaserCMS : 4.0.8 (公式サイト)

## 問題発生

![froide.png](https://qiita-image-store.s3.amazonaws.com/0/162787/d00d2ad3-c70c-f938-a57c-cc43e31a8a66.png)

**Path: froide/theme/Pages/xxx.php**

テーマにあるPagesのFileが認識できない問題がありました！

原因を聞いてみると **『Pathの変更がありました！』** の答えを聞きました。

**テーマフォルダ構造 (公式)**

| Name    |役割           |
|:-------------|:-------------|
| /Blog/       |ブログプラグイン部分に関わるファイル群が入ります。|
| /Config/     |テーマブートストラップの為のファイルや、テーマの初期データ群が入ります。|
| /css/        |CSSファイルが入ります。|
| /Elements/   |エレメントファイルが入ります。| 
| /Feed/       |フィードプラグイン部分に関わるファイル群が入ります。|
| /Helpers/    |テーマ内で利用できるヘルパーやフックのためのファイルが入ります。|
| /img/        |画像ファイルが入ります。|
| /js/         |javascriptファイルが入ります。|
| /Layouts/    |レイアウトテンプレートが入ります。|
| /Mail/       |メールプラグイン部分に関わるファイル群が入ります。|
| /Pages/      |固定ページファイルが入ります。|
| VERSION.txt  |テーマのバージョン情報ファイル。|
| config.php   |テーマの各種情報ファイル。|
| screenshot.png |管理画面で表示するスクリーンショット画像。|


## 解決方法

**修正Path: app/View/Pages/**

![froide2.png](https://qiita-image-store.s3.amazonaws.com/0/162787/4c87d145-3903-c597-a988-258ea427295a.png)

Viewの中にあるPagesディレクトリへ入れたら正常に反映ができます！


### 固定ページのContent()内容を修正したい場合

![teplate.png](https://qiita-image-store.s3.amazonaws.com/0/162787/40b3d8ee-1e59-b4b0-7e04-a819ac57580f.png)

[固定ページのContent()内容を修正したい場合](https://qiita.com/doyoun/items/53d1fba219a332e5ec3f)

詳しい内容は上のLinkにあります。
HTMLとJavaScriptだけでBLE通信できるのか？

はい、出来ます。
ブラウザからBLE通信できるWeb Bluetooth APIを使うことで簡単に出来ちゃいます。
![html_js_dev.png](https://qiita-image-store.s3.amazonaws.com/0/69327/dd7c19f8-e266-f238-be11-247dfcac1e87.png)

XcodeやAndroid Studio、Visual Studioといった開発環境は一切不要でChromeとテキストエディタのみでいけます。Webアプリなので、スマホアプリ作成時の面倒な作業も不要だし、ユーザー側もインストールなしで使えます。

#ソースコードはこれだけ
bluejelly.jsというライブラリを利用することで、記述はたったこれだけです。


```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>BlueJelly</title>
<script type="text/javascript" src="bluejelly.js"></script>
</head>
<body>
<div id="text1">Hello, BlueJelly!</div>
<button id="button1">READ</button>

<script>
//Global
var ble = new BlueJelly();

//onLoad
window.onload = function(){
    ble.setUUID("UUID1", "713d0000-503e-4c75-ba94-3148f18d941e",
    "713d0002-503e-4c75-ba94-3148f18d941e");
}

//ClickEvent
document.getElementById("button1").addEventListener("click", function(){
    ble.read("UUID1");
});

//onRead
ble.onRead = function(data, uuid){
    value = data.getInt16(0);
    document.getElementById("text1").innerHTML = value;
}
</script>

</body>
</html>
```

これだけで、Scanを行い、選択したBLEデバイスにConnectし、指定したUUIDのService/CharacteristicからValueをReadし、HTMLに表示しています。これはReadの例ですが、WriteやNotifyも同様に簡単にできます。
BlueJellyは[GitHub](https://github.com/electricbaka/bluejelly)で公開されています。


#動作環境に注意！
Web Bluetoothはまだ出てきたばかりの技術ということもあり、動作できるOSに条件があります。
ブラウザはChromeのみ対応です。

>【 対応OS 】
>・Mac (OS X Yosemite以降)
>・Android (Android 6.0 Marshmallow以降)
>・Linux (Kernel 3.19以上 かつ BlueZ 5.41以上)
>・Chrome OS
>注：iOSとWindowsは非対応 (2017年11月現在)


#BLEデバイス側はどうする？
BLEデバイス側のUUIDとデータフォーマットさえ分かれば、先ほどのHTMLファイルをちょっと変更するだけで既存のBLEデバイスにもアクセス可能です。

また、こんな感じでBLEマイコンボードを使えば、ブレッドボードと組み合わせて、ハンダ付け無しでBLEデバイスを完成させることも可能です。ファームウェアもArduinoやMbedなどを使ってWebコンパイルでさくっと出来ます。
![breadboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/69327/cd6d57ea-843d-5aa5-0b56-a346a238cfa2.jpeg)


#参考になるサイト
オリジナルのBLEデバイスも併せて作りたい人は、こちらのサイトを参考にすると最短で出来ると思います。
Webエンジニア向けに書かれているので、ハードの内容は初心者にも分かりやすいです。

[ハードウェアのプロが教えるWebエンジニアのためのIoT講座](http://www.analog.com/jp/education/landing-pages/003/iot_lectureship/iot_lectureship_home.html?ADICID=AF_jp_p1645_other-IoT_lecture_4)

#関連イベント
[Web Bluetooth APIでBLEアプリ開発ハンズオン！](https://connpass.com/event/73300/)


楽してBLEアプリを開発しましょう！ ではまた。
[basercms] BurgerEditorのバージョンアップが反映されない時

#BurgerEditorのバージョンアップが反映されない時
##DBの「plugins」の中身をチェック

![スクリーンショット 2017-11-20 16.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/215203/ff0acd22-0381-0bfe-33d3-29a5588ba882.png)
![スクリーンショット 2017-11-20 16.28.33.png](https://qiita-image-store.s3.amazonaws.com/0/215203/3e5ccead-99ba-75c2-d5d5-75774569c71f.png)
versionの下の「-rc」を消す。phpMyAdminだとクリックで選択可能。

##basercmsの「管理画面」から「プラグイン管理」に入る
![スクリーンショット 2017-11-20 16.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/215203/6d1a7ee0-322d-a43c-7c9f-c589603a9aa2.png)
![スクリーンショット 2017-11-20 16.31.29.png](https://qiita-image-store.s3.amazonaws.com/0/215203/aaa045eb-a0f1-8a2e-f42f-ad4825990474.png)

画面左にある緑のアップデートボタンをクリック。![スクリーンショット 2017-11-20 16.33.11.png](https://qiita-image-store.s3.amazonaws.com/0/215203/ee51e1d3-64f4-0472-5a5a-e6473035300a.png)
![スクリーンショット 2017-11-20 16.33.27.png](https://qiita-image-store.s3.amazonaws.com/0/215203/3923df32-137a-74c2-c850-9fc09ce362ee.png)
アップデート実行をクリック。

アップデートログを確認。現在のバージョンが最新だと成功。
![スクリーンショット 2017-11-20 16.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/215203/f5a5ee60-8593-5580-752e-6846363d3873.png)
[BaserCMS]ログイン機能

# BaserCMSログイン機能の作成
## 認証プレフィックスの作成
**lib/Baser/Config/setting.php**の内容を全てコピーする。
**app/Config/setting.php**にコピーした内容を貼り付け、125行目辺りのコメントアウトを外す。
![スクリーンショット 2017-11-20 16.33.59.png](https://qiita-image-store.s3.amazonaws.com/0/215192/28883e94-f67b-cdc8-e1dd-3baa488f3c7c.png)

## ユーザーグループに作成した認証プレフィックスを登録する
**管理画面** > **システムナビ** > **ユーザーグループ管理** からユーザーグループの作成または既存のユーザーグループを編集する。
作成したプレフィックス名（今回はフロント）にチェックボックスにチェックを入れ、保存する。
![スクリーンショット 2017-11-20 17.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/215192/b9a1464a-5a50-0c92-7fdd-adf1f023dea5.png)

## ユーザーを登録する
**管理画面** > **システムナビ** > **ユーザー管理** からユーザーを新規登録する。
作成したプレフィックスにチェックを入れたユーザーグループを選択し、保存する。
![スクリーンショット 2017-11-20 17.15.28.png](https://qiita-image-store.s3.amazonaws.com/0/215192/1e95b784-79e4-e2a7-7d6b-f3e954e88caf.png)

## ログインしてみる
**app/Config/setting.php**内の**'loginAction'**のURLで先ほど作ったユーザーでログインする。









[参考URL](https://qiita.com/beychan/items/7bbccd244552e0e2ff79)
RectTransformのAnchor Presetsが表示されない

今まではなんとかなっていたものの、iPhone X対応でのレイアウトの崩れや見切れは如何ともしがたく、uGUIのUIオブジェクトにAnchorを打ちまくっているところなんですが、一部のオブジェクトのInspectorにRectTransformのAnchor Presetsが出てこないことに気が付きました。

具体的には、こうなるはずが…
![correct_anchor.png](https://qiita-image-store.s3.amazonaws.com/0/141731/037c4111-c731-6755-3803-a596d480ccc6.png)

何も出ない。
![anchor.png](https://qiita-image-store.s3.amazonaws.com/0/141731/d3e78e98-ef56-e501-dd9f-cabe15ac2ab5.png)

原因はシンプルで、

**親オブジェクトがRectTransformを持っていない**

からです。

それでも表示はできてしまうのでなかなか気付きづらいところですが、Canvasの下にTransformなオブジェクトを置く積極的な理由が私には思いつかないので、"Add Component"でTransformをRectTransformに変更しましょう。

これにはEditorの挙動にも原因があって、"GameObject->Create Empty Child"や、右クリックで"Create Empty"をした場合、選択されているオブジェクトがRectTransformを持っていればRectTransformを持つオブジェクト、TransformであればTransformを持つオブジェクトが生成されるということになっています。なので、例えば別ツリーで作っていたものを移動したりした場合に生まれがちです。明示的にRectTransformなオブジェクトを作る"UI/Create Empty"というメニューを作ったほうが分かりやすかったですかね。

皆さんもご注意くださいませということで。
[baserCMS]エイリアス機能について


# BaserCMSエイリアス機能について
## エイリアスとは
エイリアスを作成すると作成元と同じコンテンツの内容のページ(URLは違う)が作成されるので

- スマホ用に別のURLでページを作成したいとき(レスポンシブではない)
- コンテンツの中身が同じページを複数作成したいとき

などに用いられる。

## エイリアスの作成
管理画面のコンテンツ一覧のエイリアスはコンテンツ右横の"…"から作成することができる。
![スクリーンショット 2017-11-20 15.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/215192/51702eb0-4346-d2bf-3366-1e9103bc7ccf.png)


## コピー機能との違い
コピー機能も同じようにファイルの複製を作成するが機能が違うため、用途によって使い分ける必要がある。

- エイリアス
 - 作成元のファイルのみ編集可能。
 - 作成元のファイルを編集すると、エイリアスのファイルにも反映される。

- コピー
 - コピーしたファイルも編集可能。
 - 編集をしても、コピーしたファイルには反映されない。
シェルスクリプトで環境変数の一覧を取得する

環境変数の一覧が必要になったのでやり方を調べてみました。

# 結論
以下のコマンドで一覧を取得できます。

```zsh
$ env -0 | tr '\r\n' ' ' | sed 's/\x0/\n/g' | sed 's/=.*//'
```

## 補足

`env` コマンドは以下のような形式で環境変数の一覧を出力します。

```bash
A=foo
B=bar
C='hoge
hoge'
...
```

ここから変数名だけ抜き出したいわけですが、上の`C=`のように値が複数行になる場合があります。
これをそのまま`sed`で処理するのは難しいので、`-0`オプションをつけて出力をNull文字区切りにします。
`tr`で改行を適当に置き換えてからNull文字を改行に置き換えれば値部分の改行だけ除去できるので、あとは`=`から行末まで消して終了です。
RailsのI18n.tはtに省略して、省エネで行こう

引き継ぎのプロジェクトで、全部

```rb
I18n.t('activerecord.models.article')
```

みたいなのを毎回書いてあって毎回書くの大変だな〜って思ってたけど、

```rb
t('activerecord.models.article')
```

に省略できる。

**5文字省エネできるのはデカイw**

ほんとゴミみたいな記事だけど、一人でも省エネできるエンジニアが増えたら嬉しい :pray:

### 参考
[Rails国際化 (I18n) API](https://railsguides.jp/i18n.html#%E8%A8%B3%E6%96%87%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
ESXi6.5でRadeon RX 580をパススルーした話

# 自分の環境
* Supermicro X10DAX
* Intel Xeon E5-2630v3(金欠なので一つだけ積んでる)
* Crucial BLS2K8G4D240FSA x4 32GB
* Radeon RX 580 8GB

# 前提
* ESXi 6.0u2がインストールされている
* 使用者が仮想PCを作成できる
* 最新のドライバをダウンロードされている

# 問題
* Radeon Crimson DriverをインストールしようとするとESXi仮想マシンがクラッシュする

# 解決法
* ESXi 6.0でGPUパススルーの設定をする([ここ](https://qiita.com/yakumo/items/d193ded63e4c2c0cdf6b)を参照しながら)
* ESXi 6.5にアップグレードする
* ドライバを更新する

# 具体的な手順
1. WindowsのRDPを有効にしておく(ドライバを削除したときにグラボが利用できなくなるため)
2. [最新のDDU](https://www.wagnardsoft.com/content/display-driver-uninstaller-ddu-v17079-released)(Display Driver Uninstaller)をダウンロードしておく
3. ESXi 6.0を[ここ](https://i-think-it.net/esxi6-to-esxi6-5-upgrade-how-to/)を参考にESXi 6.5にアップグレードする
4. セーフモードでWindows10仮想マシンを再起動する
5. DDUを利用してグラフィックボードのドライバを綺麗に削除する
6. 普通に起動すると画面が出力されないため，RDPで接続してドライバのインストーラを起動する
7. カスタムインストールを選択し，全てのパッケージを選択してインストール
8. Windowsを再起動
9. もしだめならESXiごと再起動

# まとめ
ESXiのバージョンアップしたら解決しました(白目)

## 追記(2018/1/29)
メモリを事前にすべて予約してないと起動しない事が発覚しました
「仮想マシン」→「編集」→「メモリ」を展開→「予約」から「すべてのゲストメモリを予約」にチェック
以上の手順を踏むとちゃんとドライバもアップデートできるようになりました

# 参考にしたリンク
ESXi でGPUパススルーしてみた
https://qiita.com/yakumo/items/d193ded63e4c2c0cdf6b
vSphere6.5がリリースされたのでESXi6からESXi6.5にアップグレードしてみた！
https://i-think-it.net/esxi6-to-esxi6-5-upgrade-how-to/
非対話的に evolutions を適用する

複数 DB に対する evolutions をまとめて適用するやつ。CI とかコンテナ構築のお供に。

```
# デフォルト DB に対して適用
$ sbt "runMain ApplyEvolutions default"
```

```scala
object ApplyEvolutions {
  import play.api._
  import play.api.db._
  import play.api.db.evolutions._


  def main(args: Array[String]) {
    java.lang.System.setProperty("play.evolutions.enabled", "false")

    // Start the application (instead of using `new play.core.StaticApplication(...)`)
    val env = Environment(new java.io.File("."), this.getClass.getClassLoader, Mode.Dev)
    val context = ApplicationLoader.createContext(env)
    val loader = ApplicationLoader(context)
    implicit val app: Application = loader.load(context)
    val dbApi = app.injector.instanceOf[DBApi]

    val dbNames = if(args.length == 0) dbApi.databases.map(_.name) else args.toList

    try
        // Apply evolutions
        dbNames foreach (dbName => {
          try {
            Logger.info(s"Applying evolutions for database $dbName")
            OfflineEvolutions.applyScript(
              appPath = new java.io.File("."),
              classloader = this.getClass.getClassLoader,
              dbApi = dbApi,
              dbName = dbName,
              autocommit = true
            )
          } catch {
            case e: java.sql.SQLException =>
              Logger.error(s"Unable to apply evolutions for database $dbName -- skipping: " + e.getMessage)
          }
        })
    finally app.stop()
  }
}
```
AWS linux PHP apache mysql wordpress fast setup

Step1・Apache2.4インストール
$ sudo yum -y install httpd24
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/a77ab1ee-d0df-4850-7910-0283853a21a1.jpeg)
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/183812cc-6115-687b-cd32-f54ab30690cd.jpeg)

Step2・PHP7.0インストールする
$ sudo yum -y install php70 php70-mbstring php70-pdo
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/fb4717d0-fefa-9f9d-585a-8232992db49c.jpeg)
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/fe7b70d3-8982-6947-0c2b-8a90ef9f26cb.jpeg)

Step3・mysqlインストールする
$ sudo yum install mysql57 mysql57-server
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/ba993446-abb1-7e4f-3425-7abb9d2b0558.jpeg)
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/52660967-c64f-d443-2fa9-a17353c011b6.jpeg)

Step4・httpd mysqld 起動確認
$ sudo service httpd start
$ sudo service mysqld start
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/02ca0222-784a-0b3a-a53d-40faf0af5478.jpeg)

Step5・apache配置
etc/httpd/conf/httpd.confを編集し、以下の２行を追加
AddType application/x-httpd-php .html .htm .php .phtml
AddType application/x-htlstpd-php-source .html .htm .phps
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/011f901d-a246-906a-b258-cfdde8188cb8.jpeg)

Step6・httpd restart
$ sudo service httpd restart
![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/168596d5-c01b-7d5e-8531-a1ba99377d15.jpeg)

Step7・php apache動作確認する
var/www/htmlの下でindex.php を作成、下記のコードを追加
<?php
phpinfo();
?>
ブローザにIP入力、下記の画面出ます
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/bd7a9e7c-ff5a-953b-8db0-c3ebc89ab7cf.jpeg)

Step8・mysql配置
①rootユーザパスワード修正
$ sudo service mysqld stop
$ sudo mysqld_safe --skip-grant-tables
ターミナル再開、rootユーザで登録
mysql>update mysql.user set authentication_string=password('root') where user='root';
$ sudo service mysqld restart
database 追加
mysql> create database wordpress;

②PHPにmysqlサポート追加
$ sudo yum -y install php70-mysqlnd
/etc/php.ini　に　extension=msql.so　追加
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/9abf61f0-8951-df7e-5cd9-8cce6951a3fe.jpeg)
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/3369928d-8a37-2a89-fc87-d89136b78740.jpeg)
httpd restart
$ sudo service httpd restart

・wordpess配置
下記のurlから日本語wordpessバージョン確認
https://ja.wordpress.org/install/

var/www/html下に
$ sudo wget https://ja.wordpress.org/wordpress-4.8.3-ja.zip
$ sudo unzip wordpress-4.8.3-ja.zip
wordpressに書けるように権限付与（777推奨ではない）
$ sudo chmod 777 * -R
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/5a435ac4-b7b7-2a05-155c-eb4e70cf905c.jpeg)

画面から設定
![14.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/322bcd94-6f71-58a5-70d4-abd129670f2d.jpeg)
![15.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/6307bb4f-7615-4803-5504-332bc740cb5a.jpeg)
![16.jpg](https://qiita-image-store.s3.amazonaws.com/0/213567/fa4b98ff-49a6-e893-6b17-aa98d2c5576a.jpeg)

追記：
FTP使いたくない場合下記参照

・wp-config.php に書きます
define('FS_METHOD', 'direct');
・wordpressフォルダすべてのファイル書き可能に変更

以上。
UnityプラグインでviewDidLoadやUIViewControllerにあたるものの話

意外と載ってなかったので、覚書。

# はじめに
- 本記事ではUnityプラグインによるアプリ起動時のトリガーとAppDelegate, UIViewControllerの取得方法を解説します。
- アプリ側でUIViewController取得してUIImagePickerControllerなどを追加したいとかそういう時に使います。
- Unity2017.2.0f3, XCode9を使用しています。

# Unity側
- サンプルなのでキューブが表示されるだけのプロジェクトを作ります。
- 空のGameObjectを作りプロジェクトに追加します。
- スクリプトを新規作成し、GameObjectに紐付けます。

<img width="1778" alt="スクリーンショット 2017-11-20 16.07.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/06c7a357-edde-01bb-9605-36f9668b1835.png">
こんな感じ

スクリプトは以下のような感じで。殆ど生成時のままです。
initializeView()というところがプラグインの入口になります。

```csharp:viewController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

public class ViewController : MonoBehaviour {

	[DllImport("__Internal")]
	private static extern void initializeView();

	// Use this for initialization
	void Start () {
		#if UNITY_IOS
		initializeView ();
		#endif
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

## Unityプラグイン
- UnityのプロジェクトディレクトリにてAssets/Plugins/iOSディレクトリ内にファイルを配置すればUnityプラグインとなります。
- 無い場合は手動で作ればUnity側で勝手に読み込んで認識してくれます。
- ここではunity_plugin_ios.mmというファイルで作成します。

```objc:unity_plugin_ios.mm
extern "C" {
void initializeView() {
}
}
```

# iOS側
- UnityのソースをビルドしXCodeプロジェクトにエクスポートした後の話です。
- Libraries/Plugins/iOS内にunity_plugin_ios.mmがあるのでそれを触ります。

```objc:unity_plugin_ios.mm
#import <Foundation/Foundation.h>
#import "UnityAppController.h"

extern "C" {
void initializeView() {
    UnityAppController *unityAppController = (UnityAppController*)[UIApplication sharedApplication].delegate;
    UIViewController *unityRootVC = unityAppController.window.rootViewController;
    
}
}
```
- initializeView()がviewDidLoadと同程度のタイミングでコールされます。
- unityRootVCにUIViewControllerが取得されます。

どうでもいいですが、エクスポートしたプロジェクトにlibiconv2.dylibが付いてくるの、いい加減修正されませんかねえ・・・（ぼやき
以上です。
NGINX Amplify - How to fix "maybe permissions?" error with Let’s Encrypt SSL

## Symptom

https://amplify.nginx.com/docs/guide-installing-and-managing-nginx-amplify-agent.html
During installing NGINX Amplify agent, the error below

```
2017-11-20 16:17:33,280 [23305] supervisor ssl certificate found /etc/letsencrypt/live/.ac.jp/fullchain.pem
2017-11-20 16:17:33,280 [23305] supervisor could not read /etc/letsencrypt/live/.ac.jp/fullchain.pem (maybe permissions?)
2017-11-20 16:17:33,287 [23305] supervisor running /usr/sbin/nginx -t -c /etc/nginx/nginx.conf
```

## How to fix

check this

```
% ls -aslrt
total 44
 4 drwx------    3 root root  4096 May  7  2016 live
 4 drwx------    3 root root  4096 May  7  2016 archive
 4 drwx------    4 root root  4096 Oct 14  2016 accounts
 4 drwx------    2 root root  4096 Oct  1 05:00 keys
 4 drwxr-xr-x    2 root root  4096 Oct  1 05:00 csr
 4 drwxr-xr-x    2 root root  4096 Oct  1 05:00 renewal
 4 drwxr-xr-x    5 root root  4096 Nov  1 11:26 renewal-hooks
 4 drwxr-xr-x    9 root root  4096 Nov  1 11:27 .
12 drwxr-xr-x. 156 root root 12288 Nov 20 10:18 ..
```

then do

```
sudo chgrp {username} live
sudo chown {username} live
sudo chgrp {username} archive
sudo chown {username} archive
sudo chgrp {username} accounts
sudo chown {username} accounts
sudo chgrp {username} keys
sudo chown {username} keys
```


cf.
https://www.digitalocean.com/community/questions/permissions-issue-after-installing-lets-encrypt
content()関数で表示される基本内容の設定方法


<code>$this->BcBaser->content();</code>で表示される内容は基本的に**```lib/Baser/View/Pages/templates/default.php```**の内容で表示されています。

自分なりにしたいときは、
**```lib/Baser/View/Pages/templates/default.php```**をコピーして**```app/View/Pages/templates/default.php```**を新しく作って編集します。

例：日付だけ表示したくない場合、コピーした内容の中で

```php:app/View/Pages/templates/default.php
$this->BcBaser->updateInfo();
```
だけを消すと作成日と変更日は表示されなくなります。

※ 参考：[baserCMS4で変更された固定ページの構成](https://qiita.com/ann7368/items/aa0ed6c0ab6f160960c5)
active developer path...does not existを解決


```
xcrun: error: active developer path ("/Applications/Xcode8.2.1.app/Contents/Developer") does not exist
Use `sudo xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools, or use `xcode-select --install` to install the standalone command line developer tools.
See `man xcode-select` for more details.
```

#確認
Xcodeのインストールディレクトリを確認してみる

```
$ xcode-select -print-path
/Applications/Xcode8.2.1.app/Contents/Developer
```
このコマンドで表示されたPathが存在しているかを確かめてみる
おそらく、存在しないためエラーとなっている

複数のバージョンを入れていたり、インストール後にフォルダを移動してたり、RENAMEしたりするとPathが一致しなくなるようです


#解決
正しいPathに変更してあげる

```
$sudo xcode-select -switch /Applications/Xcode9.1.app/Contents/Developer

Password:

$xcode-select -print-path
/Applications/Xcode9.1.app/Contents/Developer
```
Ruby の Digest(name) にかかるコストを把握してなかった

以下の問題に遭遇して以来、ダイジェスト値を計算する際に `Digest(:MD5).hexdigest(str)` と書く様にしていました。autoload かどうかに関わらず…。

- [Bug #9494: Race condition in autoload of Digest::SHA256, etc. - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/9494)

単純に毎回 `Digest(name)` 関数を実行していると、複数回繰り返し呼ばれる様な場合に著しく時間がかかる事を、最近ようやく把握しました…。

```ruby
require 'digest/md5'
require 'benchmark'

N = 100_000
nums = 1.upto(N).map(&:to_s)

Benchmark.bm(15) do |x|
  x.report('Digest::MD5') do
    nums.each { |num| Digest::MD5.hexdigest(num) }
  end

  x.report('memoized') do
    digest = Digest(:MD5)
    nums.each { |num| digest.hexdigest(num) }
  end

  x.report('Digest(:MD5)') do
    nums.each { |num| Digest(:MD5).hexdigest(num) }
  end
end

__END__
                      user     system      total        real
Digest::MD5       0.170000   0.010000   0.180000 (  0.182523)
memoized          0.130000   0.000000   0.130000 (  0.132090)
Digest(:MD5)      8.120000   7.750000  15.870000 ( 42.705663)
```

`Digest(name)` 関数の実装は以下の通り。

```ruby
# https://github.com/ruby/ruby/blob/trunk/ext/digest/lib/digest.rb#L96-L109
def Digest(name)
  const = name.to_sym
  Digest::REQUIRE_MUTEX.synchronize {
    # Ignore autoload's because it is void when we have #const_missing
    Digest.const_missing(const)
  }
rescue LoadError
  # Constants do not necessarily rely on digest/*.
  if Digest.const_defined?(const)
    Digest.const_get(const)
  else
    raise
  end
end
```

`require 'digest/md5'` してから `Digest::MD5.hexdigest(str)` を実行すれば良い話だった気がします。
正規表現で整数と小数を判別する

Javaで文字列の整数・小数判定を行った際の備忘録

##やりたいこと
数字と小数点のみで構成されている文字列を正として扱いたい。（指数表記等を除く）
Double.parsedouble(str)メソッドだと、指数表記である```2.4e+8```や```NaN```、```Infinity```がパースされてしまうため、正規表現で判別を行いました。

##前提条件
jdk1.8.0_40

#結果
`^-?(0|[1-9]\d*)(\.\d+|)$`
##テスト

```java:テストコード
List<String> targets = Arrays.asList("0","-0","0.8","0.878","1","-1","1.1",
    "1.123","544","42.195","000","000.0","2.4e+8","3.1e-2","-6.75e-7",
    "0X02.Bp-1","1.","155.","000.0","-0.","-0000.","0x07","A","１",
    "-","NaN","Infinity","-Infinity");
String regex = "^-?(0|[1-9]\\d*)(\\.\\d+|)$";
Pattern p = Pattern.compile(regex);
for(String s : targets){
  Matcher matcher = p.matcher(s);
  if(matcher.matches())
    System.out.println("match! : " + s);
  else
    System.out.println("対象外 : " + s);
}
```

テスト対象は適当です。

```:result
match! : 0
match! : -0
match! : 0.8
match! : 0.878
match! : 1
match! : -1
match! : 1.1
match! : 1.123
match! : 544
match! : 42.195
対象外 : 000
対象外 : 000.0
対象外 : 2.4e+8
対象外 : 3.1e-2
対象外 : -6.75e-7
対象外 : 0X02.Bp-1
対象外 : 1.
対象外 : 155.
対象外 : 000.0
対象外 : -0.
対象外 : -0000.
対象外 : 0x07
対象外 : A
対象外 : １
対象外 : -
対象外 : NaN
対象外 : Infinity
対象外 : -Infinity
```
【メモ】middleman4でbuild時にjsを1枚にまとめる

middleman3のようにbuildでjsファイルをまとめてくれないため、
gulpを利用してbuildしたときにjsファイルを1枚にまとめてついでにminifyする方法の私的メモ。
layoutごとに異なるJSを読み込んでいる場合はオススメしません。
node.jsやnpmが使える前提です。

執筆時のバージョン
・node v8.9.1
・npm v5.5.1
・gulp CLI version 3.9.1 Local varsion 3.9.1

使用するプラグインは
・gulp-concat2.6.1
・gulp-uglify3.0.0

まずはmiddlemanのプロジェクトへ移動し以下を実行

```console
npm init
```
enter連打でOK
rootディレクトリにpackage.jsonが生成される。
続いて作業環境にもGulpをインストールするため以下のコマンドを実行

```console
npm i -D gulp
```
rootディレクトリにmnode_mmodulesが生成される
さらに今回使用するプラグインをインストールするため以下のコマンドを実行

```console
npm i -D gulp-concat gulp-uglify
```
rootディレクトリにgulpfile.jsを作り、以下の内容を入力

```javascript:gulpfile.js
var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify')

gulp.task('build.js', function(){
  gulp.src('source/assets/javascripts/**/*.js')
  .pipe(concat('site.js'))
  .pipe(uglify())
  .pipe(gulp.dest('build/assets/javascripts'))
});

gulp.task('default', ['build.js']);
```
元になるjs、出力先のディレクトリなどは適宜環境に合わせてください。

config.rbに以下の内容を記述
簡単に説明すると、通常のbuild時にjsファイルは除外してgulpにbuildさせる。

```ruby:config.rb
configure :build do
  ignore 'assets/javascripts/*'
  after_build do
    system('gulp')
  end
end

```
gulpfile.jsの最下行に設定したデフォルトタスクが「build.js」なので、結果的に1枚にまとめてminifyしたものがbuildされる。

では早速buildしてみましょう！

```console
[16:18:00] Using gulpfile ~/Sites/mysites/middleman4/gulpfile.js
[16:18:00] Starting 'build.js'...
[16:18:00] Finished 'build.js' after 5.92 ms
[16:18:00] Starting 'default'...
[16:18:00] Finished 'default' after 14 μs
Project built successfully.
```

こんな感じのログが流れればOK。
全てのJSをまとめてminifyされているかsite.jsを確認してください。



開発環境でJSが動かない系の応急措置

```erb:layout.erb
<% if development? %>
  開発環境で使うJSを全部読み込む
<% end %>
```

page speed insight的にjsファイルは1枚にしたいため
bash > printf > プレフィックスを追加する方法 > filename3=$(printf "%s_%02d.nc" $prefix $idx) > $prefixに%が含まれる可能性も考慮

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

(追記 2017/11/20 **下記のfilename1に関して間違いがありました**)

bashのprintfを使ってファイル名を作成する。

```bash:prefix_171120_exec
#!/usr/bin/env bash

prefix="LDPO"

for idx in $(seq 2 3 23)
do
    filenaem1=$(printf "${prefix}_%02d.nc" $idx)
    echo "1:"$filename1
    filename2=$(printf "$prefix""_%02d.nc" $idx)
    echo "2:"$filename2
    filename3=$(printf "%s_%02d.nc" $prefix $idx)
    echo "3:"$filename3    
done
```

```txt:run
$ ./prefix_171120_exec | head
1:
2:LDPO_02.nc
3:LDPO_02.nc
1:
2:LDPO_05.nc
3:LDPO_05.nc
1:
2:LDPO_08.nc
3:LDPO_08.nc
1:
```

filename2の方法でもできるようだが、filename3の方が自然な表記に感じる。
filename3表記時にはカンマをつける間違いはしそう。

### リンク
http://wiki.bash-hackers.org/commands/builtin/printf

### 教えていただいた事項

@akinomyoga さんの[コメント](https://qiita.com/7of9/items/782d5cc6ff4b40c37320/#comment-9ef158347781c107d1d1)にてtypoを教えていただきました。

また、$prefixに`%`が含まれる可能性での考慮もいただきました。

情報感謝です。
CentOS7で時間のずれを調整してみた

CentOS7、64bit環境の時刻を調整します。

```
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
$ arch
x86_64
```

現在時刻を確認します。

```
$ date
2017年 11月 20日 月曜日 06:40:09 UTC
```

今は15:40くらい。UTCに設定されているので当然9時間ずれています。タイムゾーンを設定して再度時刻を確認します。

```
$ sudo timedatectl set-timezone Asia/Tokyo
$ date
2017年 11月 20日 月曜日 15:40:45 JST
```

直った。と思いたいのですがなんか2分くらいずれています。[こちら](https://eng-entrance.com/linux-clock-system)を参考にさらに調整してみます。

chronydをyumでインストールします。

```
$ sudo yum install -y chronyd
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
パッケージ chrony-3.1-2.el7.centos.x86_64 はインストール済みか最新バージョンです
何もしません
```

Vagrant+VirrualBox+bento/centos-7.3の場合は最初から入っているようです。`chronyd`を起動します。

```
$ sudo systemctl start chronyd
```

状態をチェック

```
$ systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since 月 2017-11-20 14:51:31 JST; 59min ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
 Main PID: 5613 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─5613 /usr/sbin/chronyd
```

動いていますね。一旦停止して再度状態をチェックします。

```
$ sudo systemctl stop chronyd
$ systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 月 2017-11-20 15:59:07 JST; 8s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
 Main PID: 5613 (code=exited, status=0/SUCCESS)
```

止まっています。再起動しましょう。

```
$ sudo systemctl restart chronyd

```

起動時にサービスを自動的に起動するようにします。

```
$ sudo systemctl enable chronyd
```

設定をしていきます。

```
$ sudo vi /etc/chrony.conf
```

参照サーバの再設定 + 時刻同期許可設定です

```/etc/chrony.conf

#デフォルトの参照サーバをコメントアウト
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst

#参照サーバ再指定
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

#LAN内のマシンからの時刻同期許可
Allow 192.168.33.10
```

設定が終了したらサービスを再起動して時刻を確認します。

```
$ chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* sv01.azsx.net                 2   6   377    54  -1225us[-1973us] +/- 6313us
^- secure.opticnerve.asia        2   6   377    56   -820us[-1568us] +/-   81ms
^- x.ns.gin.ntt.net              2   6   377    55  +3749us[+3749us] +/-   78ms
^- 34nm.com                      2   6   157    54  +3836us[+3836us] +/-  186ms
$ date
2017年 11月 20日 月曜日 16:07:39 JST
```

ずれてない。直りました。


こんなの自分でできないですよね。。。
Macで Doxygen を使ってドキュメント作成


Doxygen でソースコードをドキュメント化したときのメモ。 

■ 参考
- [Doxygen公式](http://www.doxygen.jp/)
- [MacでDoxygenとGraphvizを使ってクラス図を出力する](https://qiita.com/ysk24ok/items/5460e65e31d95ec5d9a8)

## 手順

1. Mac に Doxygen と Graphviz をインストール。brew でも、公式URLからダウンロードでも。

1. Doxygen へのPathを通す
	`.bash_profile` に以下を追加
	
	```bash
	export PATH=/Applications/Doxygen.app/Contents/	Resources/:${PATH}
	```

1. DoxyFile 作成
	ソースコードの有るフォルダに移動して、以下を実行

	```bash
	doxygen -g
	```
	`DoxyFile`が生成される。

1. DoxyFile 編集
	必要に応じてDoxyFileを修正。今回自分が修正したのは、以下の通り。
	
	|修正項目|修正前|修正後|
	|:-----------|:------------|:------------|
	|PROJECT_NAME|My Project|<プロジェクトの名前>|
	|OUTPUT_LANGUAGE|English|Japanese|
	|CREATE_SUBDIRS|NO|YES|
	|EXTRACT_ALL|NO|YES|
	|RECURSIVE|NO|YES|
	|EXCLUDE||/除きたいディレクトリ （複数あるときは、\ でつなげて書く）|
	|SOURCE_BROWSER|NO|YES|
	|HAVE_DOT|NO|YES|
	|UML_LOOK|NO|YES|
	|CALL_GRAPH|NO|YES|
	|CALL_GRAPH|NO|YES|
	|CALLER_GRAPH|NO|YES|

1. doxygen 実行
	ソースコードの有るフォルダにて、以下を実行

	```bash
	doxygen
	```
	
	`html`フォルダが作成され、Doxygenドキュメントが生成される
画面外に出て行ったウィンドウを連れ戻す

マルチモニタで作業していて片方のモニタを取り外したり、「終了時にウィンドウ位置を保存する」ようなアプリを書いていたりすると、ウィンドウが画面外に現れてしまい、マウス操作では画面内に戻せなくなったりすることがある。

そんなときの戻し方。

1. 連れ戻したいウインドウをタスクバーから選択したり `Alt+Tab` するなどでアクティブにする[^1]。
2. `Alt+Space` を押すと、コントロールメニューが出る[^2]。
3. `M` を押して「移動」を選択する[^3]。
4. カーソルキーのどれかをどれでもよいので一回押す[^4]。
5. マウスを動かす。

これで画面内にウィンドウが戻ってくるので、マウス左クリックで配置する。

この小技は Windows 3.1 からずっと使える。

[^1]: ウィンドウをアクティブにできれば手段はなんでもよい。Windows Vista ぐらいから、タスクバーのアプリアイコンでマウスホバーするとそのアプリのウィンドウが列挙されるので、それを右クリックするとコントロールメニューが出る。
[^2]: **画面外に出ているかもしれない**けど気にせず次へ進む。
[^3]: メニューが画面外に出ているとマウスで選択できないので、キーで覚える。
[^4]: ウィンドウが画面外にある場合、どこにあるかわからないウィンドウをカーソルキー操作だけで画面内に戻すのは難しいので、次項とあわせてこのようにする。
技術者だって本を読む。(技術書以外にも)

実は散見される技術者たちの文学好き感。
===
昨今理系だから文系だからという表現も陳腐化した感がある。
文系出身プログラマや理系出身小説家なんかもそれほど珍しくもない。(かくいう自分も美大卒)

そんなわけで技術者視点のあちらこちらに見え隠れしている文学のエッセンスをちょっとだけ紹介する。

銀河ヒッチハイク・ガイド
===
物語は地球が粉々に破壊されるところから始まる。
なんだかんだあって主人公はある宇宙船に乗ることになり、そのままその旅路を共にする。
有名なフレーズとして「生命、宇宙、そして万物についての究極の疑問の答え」というものがある。

## VIM
`:help!` を実行すると `Don't panic!` というエラーメッセージが表示される。
これは銀河ヒッチハイク・ガイドに登場する同名のガイドブックの表紙に書かれた言葉で、邦訳された単行本の表紙にもかかれていたり、ある意味でこの作品の象徴した言葉。

ほかにも `:help` である文字列を検索してもこの作品に関係した特別なテキストが表示される。

## Google
「生命、宇宙、そして万物についての究極の疑問の答え」と検索すると不思議な検索結果が帰ってくる。
この問いは作中世界で2番目に優れたコンピュータが途方もない時間をかけてやっと答えを算出している。
googleのコンピュータはおそろしいほどの性能を持っているのかもしれない。

華氏451度
===
この作品は本の所持閲覧が許されないディストピアを舞台にした作品。
昇火士(消火士のもじり。原文ではfiremanだったと思う)が各地に残った本を見つけては焼却処分する。
主人公は昇火士の仕事をする一方で本を隠し持っている。
タイトルの華氏451度は紙が燃える温度。

## HTTP
httpステータスコード 451はそれになぞらえてコードが与えられた。
このステータスコードの意味はUnavailable For Legal Reasons(法的理由により取得不能)。違法性のあるページへリクエストを送信した際に表示される。

ハイニッシュ・ユニバース
===
この作品はまだ読めていないので詳しくは知らない。
舞台は未来のようで、異種族や社会のあり方などがシリーズのテーマになっているっぽい。
SF作品としてみたとき特筆するものとして超光速の乗り物が登場せず、その代わり超光速の通信技術が登場するらしい。(wikipedia参考: https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%82%B7%E3%83%A5%E3%83%A9%E3%83%BBK%E3%83%BB%E3%83%AB%EF%BC%9D%E3%82%B0%E3%82%A6%E3%82%A3%E3%83%B3)

## Ansible
構成管理ツールであるこのツールの名前が、先に出た超光速通信技術の名前を由来としている。
サクッと素早くサーバ立てちゃいますよ〜といった感じか。

ギリシャ神話
===
上にあげてきたものとは毛色が違うがこういうエッセンスを持ったものもある。
日本やインドの神々もはっちゃけてるなあと思うが、ギリシャ神話に登場する神々もなかなかだと思う。

## UNIX
バックグラウンドで処理を実行するdeamonは、ギリシャ神話に登場する神々の代わりに煩雑な作業を行う存在であるdeamonが語源。
*demon* と書くのは誤りで、これは悪魔を指す。

ちなみに悪魔は悪魔で古典物理を扱う本でよく出てくる(マクスウェルの悪魔やラプラスの悪魔など)。
昔の学者たちはみんな悪魔を飼っていたらしい。

〆
===
知ったからといってなんにも得することはないんですが、なんとなくそういうこと知ってるとかっこいいよなあと。
個人的にはなにかいいのが出来たら星新一作品からなにか引用したいなあと思う次第。

*
*
*

この記事は **株式会社ソニックムーブ Advent Calendar 2017** 21日目の記事です。
アドベントカレンダーはこっち。 -> https://qiita.com/advent-calendar/2017/sonicmoov
ソニックムーブについてはこっち。 -> https://www.sonicmoov.com
MysqlのAlter Tableの終了時間を確認するSQL

最近扱うデータ量が増えて、1億件を超えてきたため、AlterTableを待つのが辛い。
それでいつ終わるかどのくらいの速度で実行してるか、調べるクエリを作ってみた。

データ量があまりに多いと、処理時間過ぎても終わらないときがあるけど、目安という事で。
※1億件とか処理すると数時間過ぎても終わらなかったことあり。

#performance_schemaを有効にする
```bash
[mysqld]
performance_schema=on
```

#Alter Tableのモニタリングを有効にする
```SQL
UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
```

#Alter Table実行
```SQL
Alter Table ○○○○○○○○○○○○○○
```

#Alter Table実行中に以下のクエリを実行
```SQL
SELECT
	EVENT_NAME as "実行中プロセス",
	WORK_COMPLETED as "完了",
	WORK_ESTIMATED as "全体",
	CONCAT(@PROGRESS := WORK_COMPLETED/WORK_ESTIMATED * 100 , "%" ) as "進捗率",
	@ELAPSED :=  ( TIMER_END - TIMER_START ) / POWER(10, 12)  as "実行時間",
	WORK_COMPLETED / @ELAPSED as "処理量/秒",
	@REMAIN := FLOOR( @ELAPSED * ( 100 / @PROGRESS ) - @ELAPSED ) AS "残時間",
	DATE_FORMAT( NOW() + INTERVAL @REMAIN SECOND , "%m月%d日 %H:%i:%s" ) AS "終了予測時刻"
FROM
	`performance_schema`.events_stages_current;
```

サンプル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/19439/9ff27647-e4ab-1c90-e2d2-62942296a201.png)

予想時間がわかると、後はそれまで寝とけばいいので便利！

##参考
14.16.1 Monitoring ALTER TABLE Progress for InnoDB Tables Using Performance Schema
https://dev.mysql.com/doc/refman/5.7/en/monitor-alter-table-performance-schema.html
MySQL 5.7.6のPerformance SchemaでInnoDBのALTER TABLE進捗どうですか
https://yoku0825.blogspot.jp/2015/03/mysql-576performance-schemainnodbalter.html
vccwのWordmoveを最新にする(Rubyバージョンをアップデート)


Wordpressの管理(デプロイ etc)には[vccw](http://vccw.cc/ "vccw")にお世話になっています。
ただ、最近データベースをデプロイする時に以下のエラーがよく発生します。

> wordmove/sql_adapter.rb:44:in `gsub!': invalid byte sequence in UTF-8 (ArgumentError)

vccw内でデプロイを行う場合、[Wordmove](https://github.com/welaika/wordmove "Wordmove")というライブラリを使用しています。
WordmoveではWordpressのデータベースに含まれているホスト名を自動で置換してくれる処理が含まれているのですが、この処理でエラーが発生しているようです。

対策としてvccw内のWordmoveをアップデートしてWordpress cli(wp search-replace)を使った置換方式に変更します。

なお、きちんと確認はしていませんが以下のようにエラーが発生しているようです。

1. Wordpressのデータベースをmysqldumpを使用してテキストに出力
2. dumpファイル(テキスト)をデプロイ先にアップロード
3. dumpファイル内にあるhost名をruby内で置換
4. dumpファイルにUTF-8形式以外の文字列が含まれているためエラー

## インストール済みのRubyを削除する

まずはvccw内のubuntuに含まれているオリジナルのrubyを削除します。2017.11現在ubuntuのRubyバージョンは2.3ですが、Wordmoveの最新バージョンではRubyバージョン2.4が必要となります。

<pre>$ sudo apt-get remove ruby
</pre>

## brightboxのレポジトリを追加

[brightbox](https://www.brightbox.com/ "brightbox")のレポジトリを追加します。
Rubyを一からビルドするのが面倒なのでビルド済みのパッケージを使用します。brightboxはUKのCloud Hosting会社のようですが、信用ならない人は一からビルドすることをおすすめします。

<pre>$ sudo apt-add-repository ppa:brightbox/ruby-ng
$ sudo apt-get update
</pre>

[Ruby packages for Ubuntu](https://www.brightbox.com/docs/ruby/ubuntu/ "Ruby packages for Ubuntu")

## Ruby2.4をインストール

Rubyバージョン2.4をインストールします。rubyという名前のパッケージではなくruby2.4というバージョンを含んだ形の名前になっていますので注意して下さい。

<pre>$ sudo apt-get install ruby2.4 ruby2.4-dev
</pre>

## Rubyバージョンの確認

rubyコマンドが問題なく使用できるか確認します。

<pre>$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux-gnu]
</pre>

なお、ruby2.4というコマンドでもRubyが使えるようです。
また、複数のバージョンをインストールしてもrbenvのようにバージョンを切り替える方法も備えているようです。[ruby-switch](https://www.brightbox.com/docs/ruby/ubuntu/#switching-the-default-ruby-version "ruby-switch")を確認してみて下さい。

## Gemを使用してWordmoveをインストール

Gemを使用してWordmoveをインストールします。vccwではWordmoveの他にbundlerもインストールしていたのでインストールしておきます。

<pre>$ gem install bundler
$ gem install wordmove
</pre>

bundler がどのように使用されているか確認できていません。もしかするとbundlerのバージョンが異なることでエラーが起きるかもしれません。

## Wordmoveの設定を変更してデプロイ

最新のWordmoveではMovefileに以下の設定が追加となっています。

```Yaml:Movefile
global:
  sql_adapter: "default"
```

defaultはrubyを使ったテキスト置換処理となります。wordpress cliを使用した置換に変更したい場合は以下のようにします。

```Yaml:Movefile
global:
  sql_adapter: "wpcli"
```

この状態で push or pull を実行するとwordmove内でwp search-replaceを使用した置換処理を実行してくれます。
Linux関連資料メモ(2016-09-25)

次いでLinuxについて調べてみた。

# パフォーマンス
パフォーマンスの最大化
https://wiki.archlinuxjp.org/index.php/%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E6%9C%80%E5%A4%A7%E5%8C%96

# ベンチマーク
Linux Performance
http://www.brendangregg.com/linuxperf.html

http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html
Nginx＋SSL設定資料メモ

SSL証明書

【翻訳】NginxでHTTPS : ゼロから始めてSSLの評価をA+にするまで（Part 1）
http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-1/
【翻訳】NginxでHTTPS : ゼロから始めてSSLの評価をA+にするまで（Part 2）
http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/
ペアプロはJAZZである


# もしペアプロが音楽なら

譜面通りに演奏するクラシックではなく、即興性の高いジャズに近い。

演奏してみれば、何かの音が出る。

---

# 例えば一般的なコミュニケーションでも

- Aさん 対 Bさん
- Bさん 対 Cさん
- Cさん 対 Dさん

が話す時では、それぞれコミュニケーションのとり方が変わる。

---

# 人 x 人

これと同じでペアプロでも、人対人の種類だけ、バリエーションがあるはず。

---

# 固定観念

「ペアプロとは、こういうものだ」という固定観念があると、ハードルが高くなる。(一番の問題)

---

# 苦手意識

- 「教える側として自信がない」
- 「質問に答えられなかったらどうする」
- 「答えが見つからず、気まずい空気が流れたらどうする」

とか思うと、いつまでもペアプロが出来ない。

---

# 悪循環

ペアプロしない => ペアプロ力が伸びない => 自信がつかない => ペアプロしない => ペアプロ力が伸びない => ...

---

# ゆるさ

「一緒にプログラミングしたら、ペアプロだ」ぐらいのゆるさで良いと思う。

(下手な音が出たら出たで、また演奏の仕方を考えれば良いし、それも成果だと思う)


---

# オブザーバーとドライバーの違い

これもあまり考えなくて良いんじゃないか。

「教える側」と「教わる側」という意識に引きずられがち。

---

# ペアプロ力

プログラミング力やプロジェクト歴とは別に「ペアプロ力」というものがあって、これも経験値ゼロからスタートするはず。

---

# 言いたいこと

「これがペアプロだ」っていう固定観念に引きずられず、自由にやってみたい。

---

# 具体例 ( 個人的な話 )

- 今まで、ペアプロのオブザーバー経験がほぼなかったので、かなり苦手意識があった。
- 「そんな自分でも、やりやすい方法」を模索してみた。


---

## オブザーバー(自分) 

- プロジェクト歴2年
- 分からないことがあったら立ち止まるタイプ
- 質問する前に考えるタイプ

---

## ドライバー

- プロジェクト歴半年
- どんどん先に進むタイプ
- たくさん質問するタイプ

---

## 1日目

主にオブザーバーが話しながらペアプロした。

---

## 2日目

主にドライバーに話してもらいながらペアプロした。

---

## 3日目

オブザーバーはほとんど口を出さず、見学しているぐらいの感じでペアプロした。

---

## 時には

教官が教習生に教える感覚。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/60acf380-cc95-dc13-6565-35954e052501.png)

---

## 時には

隣で運転している感覚だった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6dca25f1-533e-c7b2-d226-e98dc4236c9e.png)

---

## 気をつけたこと

---

## 口を出すレベルを調整する

- オブザーバーとドライバーの性格を考えて、今回は「最小限の関与」をするようにした
  - 自分で進める道なら、オブザーバーが指示する必要はない
- 最初はある程度の道筋を立てて、だんだんと関与を少なくしていった

---

## 間違いも大事

- ドライバーが道を間違えた時に、一瞬で訂正したりせず、話し終わるのを待ってから訂正した
  - 「どんな風に間違えやすいか」「どんな思考パターンで実装をしているか」を理解するのも大事
  - むしろ、相手の考え方や、パターンを理解することがペアプロ本来の目的だと思う

---

## 分かったこと

---

### スタイル

- 必ずしも「オブザーバーが手取り足取り教える」というスタイルじゃなくても良い。
  - 昔、はじめて自分にペアプロをしてくれた人が、手取り足取り教えてくれるタイプだったので、そのイメージが強く残っていたのかもしれないと気付いた。
  - 自分と相手に合ったペアプロのスタイルを見つけられると良い。
 
---

### 沈黙も金なり

- ドライバーが分からないことを、オブザーバーが即答する必要はない。
  - 分からない部分は「自分も分からない」と伝えた上で、ドライバーに調べてもらったりした。その調べ方を見るのもペアプロ。
  - 分からないことを前にして、沈黙しても良い。焦らずに解決方法を考えれば良い。

---

### 下調べ

- なおかつストーリーの下調べもしておくことで、オブザーバーとしての自信と余裕が持てた。

---

# 話したこと

- プログラミングの内容だけではなく、エンジニアとしての気質や、仕事のやり方の話もした。

---

# 改めて

- ペアプロの目的は、まずは「ペアプロすること」自体にある。
- ペアプロでしか分からないことがある。
- ペアプロ経験が少ない場合、まずはペアプロ経験をつけるためにやってみる。
- 最初うちは、ペアプロのスタイルを見つけるための時間だと思っても良いかも。

---

# セオリーはない

- 「ペアプロはこの手法が良い」というセオリーは存在しないかもしれない。
  - この記事のテーマのとおり、相手やシチュエーションが変わるたび、最適なやり方も変わってくると思う。
  - 試行錯誤することが正解。「良いペアプロは何か」じゃなく「自分に合ったやり方は何か」「相手に合ったやり方は何か」を基準に考えてみる。

---

# 以上









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
無限スクロール（InfiniteScroll）をKaminari（Rails）で実装


なんかInfiniteScrollがversion3に新しくなった？っぽい感じがして、あまり最新の実装方法を書いている記事が見当たらなかった。

https://infinite-scroll.com

ここでダウンロードするJSファイルも新しい名前のファイルになったのか、実装例がなかった。


```Ruby
#Gemfile

#スクロール読み込み
gem 'kaminari'
gem 'jquery-turbolinks'
```

Gemを読み込み `bundle i`

Viewを編集。今回はpartialの内容を読み込むように設定。Slimがわからない人は、Slimでググってください。

```Slim
/ view html.slim

#jopost
  = render partial: 'jo', collection: @jo
= paginate @jo
```

```Slim
/ view partial _jo.html.slim
.jo
  p 無限スクロールの内容
```

Controllerも単純。

```ruby
# Controller

  def show
    @jo = Jo.page(params[:page])
  end
```

最後に、上述のjsをセットして、4行の単純なコードを足せばok。

```Coffee
#assetsのコントローラー.coffee

#スクロール読み込み
//= require "infinite-scroll.pkgd.min"

#無限スクロール
$('#jopost').infiniteScroll
  path: '.next a'
  append: '.jo'
  history: false
```

簡単だなぁ。
[TypeScript] String Literal Typesで無理やりURL型を実装する



以前、[文字列型のバグをできるだけ埋め込みたくない](https://qiita.com/Huruikagi/items/c6cc82e8379c24baaf39)という記事を書きました。

最近になって[User-Defined Type Gurds](https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards)の意味を理解しまして、
これと[String Literal Types](https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types)を使ったら、スマートに解決しそうだなと思ったので実装してみます。

## 実装

```ts
type URLString = 'isURLFormat関数でチェックされた文字列';

function isURLFormat(str: string): str is URLString {
    return /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/.test(str);
}
```

こう。
文字列リテラル型で適当に定義しておくのと、それからType Gurdsで正規表現をパスしたらその型として扱うということにします。

### 使用例

```ts
interface RequestOptions {
    url: URLString;
}

function buildOptions(target: string): RequestOptions {
    return { url: target };
}
```

このように、文字列をノーチェックで使おうとすると……

> error TS2322: Type '{ url: string; }' is not assignable to type 'RequestOptions'.  Types of property 'url' are incompatible.
    Type 'string' is not assignable to type '"isURLFormat関数でチェックされた文字列"'.

コンパイルエラーになります。
このエラーを回避して正常にコンパイルを通すためには、

```ts
function buildOptions(target: string): RequestOptions {
    if (isURLFormat(target)) {
        // このスコープではtargetはURLString型
        return { url: target };
    } else {
        // ここで何かしらの例外処理
        throw new Error('Invalid URL')
    }
}
```

このようにチェックをきちんと記述する必要が出てくるわけです。

## 利点

+ 文字列の形式がチェックされているかどうかを型で明示できる
+ コンパイル後のJSではただの文字列である
    + 無駄なオブジェクトとかができない
    + 既存の文字列を受け取る関数とかにそのまま渡せる

## 欠点

+ String Literal Typesってそういう使い方するものじゃない。きもい。

多分つかわない。なんかこう、こういうの用の型定義の書き方があればいいんですけれど。
UIとロジックをクラスで分離する - iOS

# UIButtonのロジックの実装

```ViewController.swift

/*

UIButtonのロジックの実装

*/

var sHeight:CGFloat?
var sWidth:CGFloat?

class ViewController: UIViewController {


    @objc func doButtonActioin(sender: Any) {
        print("ボタンが押された時の処理")
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        sHeight = self.view.frame.width/2
        sWidth = self.view.frame.height/2

        //ボタンを画面に描画
        self.view.addSubview(myButton().myButtonFunc())
```

# UIButtonのUIの実装

```ButtonUI.swift

/*

UIButtonのUIの実装

*/

class myButton: UIButton {

    func myButtonFunc() -> UIButton {
        
        let myButton = UIButton()

        myButton.frame = myButtonView().myButtonViewFunc()
        myButton.backgroundColor = UIColor.cyan
        myButton.setTitle("tap me", for: .normal)
        myButton.addTarget(self, action: #selector(ViewController().doButtonActioin(sender: )), for: .touchUpInside)
        // buttonにイベントを追加
        return myButton
    }
}
```

# UIButtonのレイアウトの実装 

```ButtonLayout.swift

/*

UIButtonのレイアウトの実装 

*/

class myButtonView: UIView {
    
    func myButtonViewFunc() -> CGRect{

        let rectx =  sWidth!/2
        let recty = sHeight!/2
        let rectWidth = sWidth!/2
        let rectHeight = sHeight!/2
        let buttonRect = CGRect(x:rectx,y:recty,width:rectWidth,height:rectHeight)
        
        return buttonRect
    }
}
```
vagrantの共有フォルダがマウントできなかった時に対処した方法いろいろ

急にvagrantのフォルダがmountできなくなった時があった。

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: Protocol error
```

それまでの設定は、

```
config.vm.synced_folder "./", "/vagrant", type: "virtualbox"
```

`type: 'virtualbox'`を外すと、ファイルをローカルで編集した時に、その変更が反映されないから、この方法は個人的には使えない。

いろんなサイトにあるように、kernelに原因がある例があったことからアップデートをしたり、

```
sudo yum update -y kernel
```

vbguestのプラグインをインストールしたり

```
vagrant plugin install vagrant-vbguest
```


mountオプションを加えたり

```
config.vm.synced_folder "./", "/vagrant", type: "virtualbox", mount_options: ['dmode=777','fmode=755']
```

VirtualBoxの最新版にバグがあるっぽいので、
https://www.virtualbox.org/wiki/Downloads

> Update Nov 3 2017: The Guest Additions image with the 5.2.0 release had problems with a number of Linux guest systems. Please try this image which we believe fixes several of these.

新しいイメージも試そうと色々試した。


再度、vagrantのドキュメントのページに行き、他のtypeを試してみる。今回はnfs。

```
config.vm.synced_folder "./", "/vagrant", type: "nfs"
```

あ、できた。
iOSプロジェクトのCircleCI 2.0設定例

iOSプロジェクトのCircleCI 2.0対応を行ったので、その内容を共有します。
オフィシャルのドキュメントが結構充実していて、これらを参考にしてymlを作りました。

- [Testing iOS Applications on macOS](https://circleci.com/docs/2.0/testing-ios/)
- [iOS Project Tutorial](https://circleci.com/docs/2.0/ios-tutorial/)
- [Migrating Your iOS Project From 1.0 to 2.0](https://circleci.com/docs/2.0/ios-migrating-from-1-2/)

またサンプルリポジトリも提供されています。

- https://github.com/CircleCI-Public/circleci-demo-ios/

CircleCI 2.0では、 `circle.yml`　の代わりにルートフォルダに `.circleci/config.yml` を作成します。

```.circleci/config.yml
version: 2
jobs:
  # ユニットテスト
  build-and-test:
    macos:
      xcode: "9.0"
    working_directory: /Users/distiller/output
    steps:
      - checkout
      - run:
          name: Run tests
          command: fastlane scan
          environment:
            # ユニットテストで使用するシミュレータ端末とshemeを指定
            SCAN_DEVICE: iPhone 8
            SCAN_SCHEME: <スキーム名>

      # ユニットテストの結果を保存
      - store_test_results:
          path: test_output/report.xml
      - store_artifacts:
          path: /tmp/test-results
          destination: scan-test-results
      - store_artifacts:
          path: ~/Library/Logs/scan
          destination: scan-logs

  # Beta配信
  beta-deployment:
    macos:
      xcode: "9.0"
    # Rubyのバージョンを指定するためにログインシェルを設定　
    shell: /bin/bash --login -eo pipefail
    working_directory: /Users/distiller/output
    steps:
      - checkout
      - run:
          # match でSSLのエラーを回避するためにruby2.4を使用
          name: Set Ruby Version
          command:  echo "ruby-2.4" > ~/.ruby-version
      # Gemのキャッシュを読み出す
      - restore_cache:
          key: 1-gems-{{ checksum "Gemfile.lock" }}
      - run: bundle check || bundle install --path vendor/bundle
      # Gemのキャッシュを保存
      - save_cache:
          key: 1-gems-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle
      # badge に必要
      - run: brew install imagemagick
      - run: brew install graphicsmagick
      # Beta配信
      # 弊社では beta コマンドの中で match, badge, gym をまとめて実行している
      - run: bundle exec fastlane beta
      # artifactsとして保存するファイルを明示
      - store_artifacts:
          path: <スキーム名>.app.dSYM.zip
      - store_artifacts:
          path: <スキーム名>.ipa

  # iTunes Connectへのアップロード
  release:
    macos:
      xcode: "9.0"
    shell: /bin/bash --login -eo pipefail
    working_directory: /Users/distiller/output
    steps:
      - checkout
      - run:
          name: Set Ruby Version
          command:  echo "ruby-2.4" > ~/.ruby-version
      - run: bundle install --path vendor/bundle
      - run: bundle exec fastlane release --verbose

workflows:
  version: 2
  build_test_deployment:
    jobs:
      - build-and-test
      - beta-deployment:
          filters:
            branches:
              # master ブランチのみで、このジョブを実行
              only: master
          requires:
            # このジョブを実行するためには、以下のジョブをパスしている必要がある
　　　　　　　　　　　　　　　　　　　　　　　　# 並列でジョブを実行したければ、この設定は削除すること
            - build-and-test
  release:
    jobs:
      - release:
          filters:
            branches:
              # 正規表現でこのジョブを実行できるブランチを指定する
              only: /release.*/
```

暫定版ですが、どなたかの役に立てば幸いです。