OmniAICreator/Qiita-1.07M huggingface dataset:
CentOSにMetabaseを構築する方法

# 構築
> 単純にやるならめっちゃ簡単。jar取ってきて配置して実行するだけ。
> 今回は、メタデータの管理DBをデフォルトのH2からMySQLに変更する。
> そしてサービスとして運用する。

## 

### AP

## インストール & 初期設定

### DB
* 管理用のDBスキーマ作る。

	```SQL
	DROP SCHEMA IF EXISTS metabase;
	CREATE DATABASE       metabase
	DEFAULT CHARACTER SET utf8;
	```

### AP

* デプロイ
  * バージョンは調べて適宜変えてね。

	```bash
	mkdir -p /opt/metabase
	cd /opt/metabase
	curl -LO http://downloads.metabase.com/v0.31.2/metabase.jar
	```

* 起動スクリプトを生成

	```bash
	cat << EOS > /etc/systemd/system/metabase.service
	[Unit]
	Description=Metabase - Data visualization platform
	After=syslog.target
	After=network.target
	After=remote-fs.target
	[Service]
	Environment=MB_DB_TYPE=mysql
	Environment=MB_DB_DBNAME=metabase
	Environment=MB_DB_PORT=3306
	Environment=MB_DB_USER=mysql-user-name
	Environment=MB_DB_PASS=mysql-secure-password
	Environment=MB_DB_HOST=mysql.host.name
	Environment=MB_JETTY_PORT=3000
	WorkingDirectory=/opt/metabase
	ExecStart=/usr/bin/java -jar /opt/metabase/metabase.jar
	ExecStop=/bin/true
	Restart=always
	Type=simple
	StandardOutput=syslog
	StandardError=syslog
	SyslogIdentifier=metabase
	User=root
	Group=root
	StartLimitBurst=50
	[Install]
	WantedBy=multi-user.target
	EOS
	chmod 755       /etc/systemd/system/metabase.service
	```

* リロード

	```bash
	systemctl daemon-reload
	```

## 起動
* サービスを起動する。

	```bash
	service metabase start
	```
2018年12月第2週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■AIが長文を3行ぐらいにギュッとまとめてくれるエンジン「IMAKITA」を使ってみた
https://gigazine.net/news/20181211-imakita/
AWSの各サービスの説明文などを例題に何度か試してみましたが、ちゃんと要点だけがまとめられた文章が生成されていて驚いた。
重要度の高い分を抽出しているらしいけど、AWSのサービスという専門性の高い文章に対してちゃんと重み付けが正確にできているのが凄い。

##■リリースされたばかりのApple Watchの心電図機能でさっそく命を救われる事例が報告される
https://gigazine.net/news/20181208-apple-watch-ecg-saved-life/
ガジェットに付いてくる健康診断系のアプリは結局はおまけレベルなのかなってイメージだったのだけど、こういう事例があるってことはある程度正確に取得できているということなので意外。
1個目の記事もそうだけど、ちょっと前まではまだまだ未成熟だった技術がちょっとずつ理想に追いついてきている感じがして未来館が凄いっす。

##■ガジェットのようなズッシリ感。このクレジットカード、何かが違う…
https://www.gizmodo.jp/2018/12/luxury-card.html
欲しい・・・けどよっぽど縁が無さそう。
クレジットカードというものの能力に全く依らないところを最高級にしていくという無駄さ加減が最高。

##■とにかく「e」が書かれているだけのリポジトリが面白い
https://qiita.com/wagase/items/867c38f57fe0bce86495?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
こちらもネタに世界中の人が技術力駆使して取り組んでいるのが素晴らしい。

##■


##■
npmを使ってJSプロジェクトの管理

# npmを使ってJSのプロジェクトの管理

X番煎じの記事。
Node.jsを触り始めたのと同じぐらいのタイミングでnpmコマンドを使い始めたが、
今まで本格的に使おうと思ったことがなかったのもあり、
「npm search キーワード」と「npm install パッケージ名」以外使うことがなかった。
(-gを付ければ恒久、つけなければカレントぐらいの知識だった)

もちろん、よくQiitaの記事などで「npm install --save パッケージ名」を指定していたので
「--save」の存在は知ってたが、特に使わなくても困らなかったので、覚えようという気もなかった。
(個人でソース管理する分にはライブラリを入れたままでも困らないので)
が、GitHubのようなパブリックな環境で管理しようとすると、
さすがにそうもいかないので、JavaのMaven的なものを探してnpmに行き着いた。

## 概要

1. プロジェクト作成
2. パッケージ(ライブラリ)の追加
3. プロジェクト取得後にやること

## プロジェクト作成

npmでプロジェクトを管理する場合、最初にpackage.jsonを作成する必要がある。
package.jsonの作成にはinitを使用する。
以下、実行例である。

```shell-session
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (xxxxx) 
version: (1.0.0) 0.5.0
description: xxxxxxxxxx
entry point: (xxxxx.js) 
test command: 
git repository: (https://github.com/xxxxx/xxxxx.git) 
keywords: xxxxx xxxxx
author: xxxxx
license: (ISC) MIT
About to write to /home/alisha/work/tmp/20181213/gql2doc/package.json:

{
  "name": "xxxxx",
  "version": "0.5.0",
  "description": "xxxxxxxxxxx",
  "main": "xxxxxxxxxxxx",
  "dependencies": {
    "graphql": "^14.0.2",
    "isomorphic-fetch": "^2.2.1",
    "meow": "^5.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/xxxxx/xxxxx.git"
  },
  "keywords": [
    "graphql",
    "gql",
    "html"
  ],
  "author": "XXXXXXXXXXXXXX",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/xxxxx/xxxxx/issues"
  },
  "homepage": "https://github.com/xxxxx/xxxxx#readme"
}


Is this ok? (yes) yes
```

GitのようなVCSで管理する場合、package.jsonをリポジトリに追加する必要がある。

## パッケージをインストール

プロジェクトにパッケージ(依存ライブラリ)を追加する場合、
「--save」のオプションを指定することでパッケージを取得した上で、
package.jsonに依存ライブラリが追記される。

```shell-session
$ npm install --save 依存ライブラリ
```

上記のコマンドを実行し、package.jsonを保持しておけば、
「node_modules/」を直接保存する必要はなくなる。

## プロジェクト取得後にやること

```git clone```などでソース取得後、
以下のように```npm install```を実行することで、
依存ライブラリをローカルにインストールできる。

```shell-session
$ npm install
```

## おまけ

開発時にだけ使用するライブラリを記述する場合は以下のように「--save-dev」を指定する。

```shell-session
$ npm install --save-dev 依存ライブラリ
```
【ポエム】アジャイル開発と官僚主義的組織

# ポエム編

武蔵野のとある施設を保有する某巨大電気通信企業グループにおいて、[中期経営計画](http://www.ntt.co.jp/ir/mgt/managementstrategy/index.html)にも記載があるデジタルトランスフォーメーションの推進に資するべく、アジャイル開発のマインドとプラクティスを普及させようと奮闘中である。
一方、当該企業グループはその出自から社風は総じて官僚主義的である。官僚主義とは辞書にはこうある。

>官僚組織などをはじめとする大組織に特有の気風や態度・行動様式。規則に対する執着、権限の墨守、新奇なものに対する抵抗、創意の欠如、傲慢、秘密主義などの傾向を批判的にいう場合に用いられる。お役人風。お役所式。
([コトバンク 大辞林第三版の解説](https://kotobank.jp/word/%E5%AE%98%E5%83%9A%E4%B8%BB%E7%BE%A9-49765)より)

まず`規則に対する執着`という傾向、すなわち、失敗を恐れ、また仮に失敗してもその責任を規則の不備に転嫁したがる減点主義的なマインドというものがある。一方アジャイル開発においては、日々小さな失敗を積み重ねながらも絶え間なく改善を続けて大きな成功に向かってゆこうという加点主義的なマインドが求められる。
次に`権限の墨守`という傾向、すなわち、ビジネスの現場に権限を委譲することなく、過去の成功体験に囚われて現実離れした経営判断を繰り返し、ビジネスを大きな失敗に導く企業体質というものがある。一方アジャイル開発においては、日々の改善を実行に移せる程度の裁量と権限を現場のチームに与えることで最大限のパフォーマンスを発揮できるようなサポートが経営幹部に求められる。
次に`新奇なものに対する抵抗`や`創意の欠如`という傾向、すなわち、前例のないビジネス・技術・社内手続きを嫌い、過去の経験上成功が保証されたビジネスや技術、確立されたワークフローのみを信頼するマインドというものがある。一方アジャイル開発においては、時々刻々と変化するビジネス要件への対応や、チームの生産性向上のための業務改善を進めるため、新しい技術やプラクティスを日々調査・検証・試行・採用しつづけることが求められる。
次に`秘密主義`という傾向、すなわち、情報の流通や開示を嫌い、情報を独占することで組織間や個人間において優位な立場を獲得しようとするマインドというものがある。一方アジャイル開発においては、少なくともチーム内では、ビジネスや要件の背景から各メンバのタスクの進捗状況に至るまで積極的に情報を共有・開示し、役職や所属会社を問わず対等な人間関係を保つことが求められる。
このように比べてみると、アジャイル開発と官僚主義とは、まさに水と油、全く相容れないもののように思える。官僚主義の蔓延した企業の経営計画に「デジタルトランスフォーメーション」を掲げるとは、単なる絵に描いた餅なのではないのか。

# フォロー編

上記のような企業体質をもつのは致し方ない面もある。国家的最重要インフラの一角を担うがために、小さな失敗も許されず、強力な法的・行政的・社会的規制を受ける立場に置かれているためである。
そういう会社がデジタルトランスフォーメーションの推進役を買って出るということは、非常に大胆なチャレンジであると言える。
先ず隗より始めよ。千里の道も一歩から。この道を行けば、どうなるものか。危ぶむなかれ。危ぶめば道はなし、踏み出せばその一足が道となり、その一足が道となる。迷わず行けよ。行けばわかるさ。

# おしまい
rubyzipを使ってファイル圧縮する際に任意の変更日付をいれてテストしてみたら展開ファイルが1秒ズレてハマったという話。

[Ubiregi Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ubiregi)の14日目です。

言いたいことはタイトル通りです。

# やりたいこと

ユビレジでは売上データのcsvをダウンロードする機能があります。
その時に、アカウントのタイムゾーンによって、zipに圧縮するファイルの変更日時を変えたいという時があると思います。
なので、そんな感じでサンプルコードをやっていきます。

# 実装

```ruby
require 'zip'
require 'time'

def compress(path, time)
  buffer = Zip::OutputStream.open('data.zip') do |out|
    zip_entry = Zip::Entry.new(out, "sample.csv", nil, nil, nil, nil, nil, nil, Zip::DOSTime.parse(time))
    out.put_next_entry zip_entry
    buffer = File.read(path)
    out.write(buffer)
  end
end
```

[Zip::Entry.new のドキュメント](https://www.rubydoc.info/github/rubyzip/rubyzip/Zip%2FEntry:initialize)を見ると、色々引数が指定できるみたいですね。最後の引数に[Zip::DOSTime](https://www.rubydoc.info/github/rubyzip/rubyzip/Zip/DOSTime)のインスタンスを渡してやれば良さそうなのでそうします。

# テストコードをかく

テストコードも書いていきましょう。
あくまでもサンプルで、これだとローカルのファイルを用意しなきゃいけなかったり、ローカルに圧縮ファイルが作成されたりしちゃうので、実際にやる時はいい感じにやってください。

```ruby
require 'minitest/autorun'

class CompressTest < Minitest::Test
  def test_compress
    compress('/Users/kitaindia/Documents/today.csv', '2018-12-24 15:15:15')
    Zip::InputStream.open('data.zip') do |io|
      assert_equal '2018-12-24 15:15:15 +0900', io.get_next_entry.time
    end
  end
end
```

実行してみます。

```ruby
F

Failure:
CompressTest#test_compress [sample.rb:19]:
Expected: "2018-12-24 15:15:15 +0900"
  Actual: 2018-12-24 15:15:14 +0900
```

はい。1秒ずれてしまいました。

# 解決

https://github.com/rubyzip/rubyzip/blob/d07b13a6cf0a413e010c48879aebd9576bfb5f68/lib/zip/dos_time.rb#L6

```ruby
# Bits 0-4  2 second increments (0-29)
```

２秒ごとにインクリメントするのだそうです。
秒数は5bit(32通り)で表してるんだそうで・・・。

[wikipedia](https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)) によると

>DOSのFATファイルシステムは2秒単位でタイムスタンプを保持し、ZIPファイルレコードはこれを模倣している。結果として、ZIPアーカイブ内にあるファイルのタイムスタンプも2秒単位で丸められる。

なるほど・・・。しかし、テストで偶然２分の１を踏んでしまうなんて、ついてないですね・・・。

# まとめ

実際の慌て具合の様子。

<img width="700" alt="スクリーンショット 2018-12-15 0.36.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/806/b1fdb3af-9843-994d-40e3-cca218bd55de.png">

解決の様子。

<img width="700" alt="スクリーンショット 2018-12-15 0.40.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/806/dfb90507-339e-b329-33c4-d41f72f9b7a2.png">
LINE絵文字ランキングが欲しかった

最近、LINE絵文字を作ってみたが、自分の絵文字が人気ランキングのどの辺にいるのか気になるのが人の常。

LINE STOREのクリエーターズ絵文字の人気画面を開いて、ページ繰りを延々とすること５０回ぐらい・・・自分のがあった！

って辛い。辛すぎる。一発で何位なのか検索したい。

（人気ページのアルゴリズムは不明なので、何位という表現が正しいかはわかりませんが）

#### そうだ自動化しよう！

データはスクレーピングして作るとしてどこで動かしてどこに置こう。金はかけたくない。

AWSは金がかかる。GCPで無料インスタンスを使うか・・・

と悩み、Google Apps Scriptで書いてSpreadSheetに置けば良いかという結論に。

## サクッと書いてみる

HTMLの解析内容は伏せときます。

````csharp
function ScrapingLineRanking() {
  var result = [];

  var page = 1;
  while(true) {
    var url = "https://store.line.me/emojishop/showcase/top_creators/ja?page=" + page;
    var res = UrlFetchApp.fetch(url) + '';
    getData(res, result);
    if(res.indexOf('適当な目印') != -1 && page < 200) {
      page++;
    } else {
      break;
    }
  }
  
  var spreadsheet = SpreadsheetApp.openById('スプレッドシートのID');
  var sheet = spreadsheet.getSheetByName('絵文字');
  sheet.getRange(1, 1, sheet.getLastRow(), 2).clear();
  var range = sheet.getRange(2, 1, result.length, 2);
  range.setValues(result);
  sheet.getRange('A1').setValue('更新時刻：' + new Date().toString());
}

function getData(res, result) {

  // 適当な目印を見つけてHTMLを解析して、絵文字名とURLの配列を作る

}
````

## 動かしてみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/9f315548-4ad1-100a-c9ad-4f485cb0bea0.png)

良い感じ★


## 定期実行してみる

時間トリガーを設定してみる。なんか昔と画面変わってる！

１日６回絵文字ランキングを全ページ見るぐらいなら怒られないよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/22226938-379c-a66e-7fe8-2eb393f8bf4e.png)

## どこかに結果を表示したい

SpreadSheetからデータ取ってきてーとか考えてるとめんどくさくて眠くなってきた・・・のでiframeで良いよね。

ということでSpreadSheetから直接WEBに公開。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/94526a21-7445-c628-a13b-2b98e6978bd8.png)


## 見てみる

http://megyo.jp/line%E7%B5%B5%E6%96%87%E5%AD%97%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0/

うーん、表示は遅いし、ブラウザのCtrl+Fで検索しても反応遅い・・・

とりあえず自分が見たいだけなので、まあいっか。


# で、何を作ったのか

https://store.line.me/emojishop/author/733295

こんなん作りました。

なぜ絵文字作ったかというと、１１月末ごろに初めて絵文字がクリエイター開放されたのでスタートダッシュで売れば売れるんじゃないかという目論見でした。そして公開当日に６００番目ぐらいに申請してました。

肝心の結果はというと・・・１１月ラスト１週間で５００円程度の収入でした。ちゃんちゃん。（1個あたり売値120円で、35%が分配されます）

さて、どれが一番売れてると思いますか。そもそもそんなに売れてませんが、1個だけ突出して売れてます。
T.Rex...散歩したいよね...npmにあげちゃお...

# 自己紹介

じゅんじゅんです。フロントエンドエンジニアです。

HAL大阪の4年です。

イベントによくいます！いまは東京にいるのでぜひお声掛けください！！

# T.Rexと言えば...

この前wordの新機能でなにかと話題になりましたね。

<img width="637" alt="スクリーンショット 2018-12-15 0.03.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/90347/b9b75f12-f326-2f47-2142-a1f56c88cfef.png">


> なんかこれいるんか！！
> 謎い
> おもしろwwwww

など、色々な感想が飛び交っていました。知らない人は[こちら](https://dekiru.net/article/17491/)

そして、月日は流れ僕のアドベントカレンダーが回ってくるわけです。

じゃあやることは一つしかなく。

**webでやろ**

ってことでライブラリ書きました。

https://github.com/konojunya/t.rex-web

<img width="968" alt="スクリーンショット 2018-12-15 0.04.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/90347/62fce117-6689-ffae-8808-6e56ba0714dd.png">


使い方は簡単でnpmやyarnで `t-rex-web` っていうpackageをinstallすればいいです。

もしくはHTMLに

```html
<script src="https://raw.githubusercontent.com/konojunya/t.rex-web/master/lib/t-rex.js"></script>
```

とかけば、動きます。（いつかCDNサービスにあげます）

僕は、暴れまわるより昔の懐かしいマウスに付きまとってくるやつやりたかったんですよね...

なので、マウスのポインターに付いてきます。

このライブラリ何がすごいって、依存パッケージないんですよね（当たり前）

Qiitaのネタ的にはこのライブラリの紹介をしたいんじゃなくてnpmに自分のパッケージをあげるのをどうやるかを説明したいと思います。

# 自作ライブラリ、世の中に公開していこ

stepとしては3つぐらいです。

1. npmjsに登録する
2. ライブラリ書く
3. publishする

だけです。

順番にやっていきましょう。

### 1. npmjsに登録する

まずpublishする人を登録しないといけません。

https://www.npmjs.com/ で自分のアカウントをつくってください。

作ったら手元のパソコンのterminalとかで

```shell
$ npm adduser
```

としてください。するとユーザー名とパスワード聞かれるので打ち込みます。パスワードを打つときは何もterminalには反映されませんがセキュリティのためそうなっています。気にせずうちきってください。

これで1つ目は終わり。

### 2. ライブラリ書く

では実際のライブラリを書いて行きましょう。今回はwebブラウザで動作させることを前提にします。

node.jsとかで動かしたい場合、 `package.json` の `bin` ってとこを埋めないといけないのでぐぐってみてね。

まず、 `package.json` を作ります。npmであれば

```shell
$ npm init -y
```

yarnであれば

```shell
$ yarn init -y
```

で、初期の形のpackage.jsonが作成されます。

風習っぽいのとして、実際のライブラリのコードは `lib/` に書くのが多いっぽいです。

なので、実際のライブラリのコードは `lib/my_lib.js` などに書いてみます。

```js:lib/my_lib.js
(function() {
  console.log("This is My Library!!")
})()
```

`function` で即時関数にしているのは、この中で作った変数のスコープを止めるためです。

ライブラリインストールして使うときになって、グローバル環境の変数が汚染されてたら嫌ですよね。僕は嫌です。

ではproject直下に `index.js` を書いてみます。

```js:index.js
const lib = require("./lib/my_lib.js")
module.exports = lib;
```

このindex.jsを `import` すると、 `lib/my_lib.js` が読み込まれるように書いておきます。

最後に `package.json` の `main` フィールドに　 `index.js` と書いておきます。

```json
{
  "name": "my-lib",
  "version": "0.0.1",
  "name": "index.js"
}
```

ここまでできたら最後、このライブラリを公開する設定をします。

`package.json` の `private` というフィールドを `false` にします。これで準備が整いました。

### 3. publishする

いよいよ自分のつくったものを世の中に公開するわけですが、コマンドを実行するだけです。

```shell
$ npm publish
```

これだけで、npmjsに自分のライブラリが公開されます！！！！

ここで注意点があって、 `package.json` の `name` が自分のライブラリ名になるんですが、npmjsに同じ名前のライブラリがあるとpublishできません。

ライブラリの名前を変えるか、自分のアカウント名をいれます。

`@konojunya/mylib` みたいな感じです。

このライブラリ名には、**ハイフン**か**英数字**しか使えなかった気がします。（間違えてたらすいません）

これであなたも一人前のエンジニアですね！

# あとがき

おもったより簡単にかけることがわかったのではないでしょうか。

どんどん公開して、PRくれぇ〜〜って叫びましょう。

Author: [@konojunya](https://twitter.com/konojunya)
【TIC-80】ゲーム作って公開するぞ！（その４）

##前回までのあらすじ

「[TIC-80](https://tic.computer/create)」でゲーム作って「[VOICEゲームジャム2](https://itch.io/jam/voicegamejam2)」に参加したい！

##一週間でやったこと

![ZUNDA8-2.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/7c2812d8-20d1-c8fb-a3dc-98946ec5a522.gif)

- 自機ずんだの移動処理　（済）
- ずんだピースと接触、吸着処理 （済）
- 自機ずんだの回転、反転処理 （半分済：回転のみ）
- ネクストずんだピース出現 （済）
- クリア判定 （済）

次のステージに行った時に前のずんだの残ってる？　ままえあろ

ついでに

![ZUNDA7.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/b12bbefc-686d-2065-75d1-d0ae0efac705.gif)

これを見たら「TIC-80」でゲーム作ってくれるって言ったよね？

よし！
これでソースコードを見ようとした人は「TIC-80」を使ってくれるようになる。
（「TIC-80」のゲームは公開すればソースコードを簡単に見ることができる）

今後の予定

- 操作方法の説明（デモ）の作成
- クリア済ステージにマークを付ける？
- 反転および、ステージ開始時にずんだピースのランダム反転追加
- かな表示
- コンフィグ
- マウス操作
- 音関係

技術的な話がなくてすみません。
完成したら上げる予定です。
配列にためる手間なしenum_for

この記事は[Okinawa.rb Advent Calendar 2018](https://qiita.com/advent-calendar/2018/okinawarb)の14日目の記事です。
昨日は @hanachin_ さんの[RubyでJavaScriptのTemplate literalsの真似をする](https://qiita.com/hanachin_/items/f1f822ff2ecd5f384eca)でした。
明日は @naopontan@github さんのDateオブジェクトから和暦を得るです。

## 配列にためてますか

例えばこういうコードです。
WebAPIでページ数の上限が分かりません。
全部取るみたいな処理です。
なので無限ループで回しています。
取得した結果を配列にためて返しています。

```rb
def 動物API
  @動物API ||= Object.new
end

def 動物API.page(page)
  {
    1 => ["鶏"],
    2 => ["豚"],
    3 => ["牛"]
  }[page] || []
end

def いろんな肉
  page = 1
  肉 = []
  while true
    animals = 動物API.page(page)

    break if animals.empty?

    肉 += animals
    page += 1
  end
  肉
end

いろんな肉.each do |肉|
  puts 肉
end
# 鶏
# 豚
# 牛
```

## ためずにyield

つどつどyieldして渡すのでためておく必要がなくなりました。


```rb
def 動物API
  @動物API ||= Object.new
end

def 動物API.page(page)
  {
    1 => ["鶏"],
    2 => ["豚"],
    3 => ["牛"]
  }[page] || []
end

def each_いろんな肉
  page = 1
  while true
    animals = 動物API.page(page)

    break if animals.empty?

    animals.each {|a| yield a }
    page += 1
  end
end

each_いろんな肉 do |肉|
  puts 肉
end
# 鶏
# 豚
# 牛
```


でもやっぱり配列でほしくなったら...?

## enum_forを使うとyield結果を配列にできてべんり

`enum_for`してから`to_a`するだけで配列に変換できてべんり

```rb
def 動物API
  @動物API ||= Object.new
end

def 動物API.page(page)
  {
    1 => ["鶏"],
    2 => ["豚"],
    3 => ["牛"]
  }[page] || []
end

def each_いろんな肉
  page = 1
  while true
    animals = 動物API.page(page)

    break if animals.empty?

    animals.each {|a| yield a }
    page += 1
  end
end

def いろんな肉
  enum_for(:each_いろんな肉).to_a
end

puts いろんな肉.join("と") + "を全部焼いたもの"
# 鶏と豚と牛を全部焼いたもの
```

## まとめ

- 配列にためておきたいときはyieldでつどつど渡すと貯める必要がなくなってべんり
- 配列にためたやつが欲しかったらenum_forで配列に変換できる

enum_forべんりですね。
AWSを始めるなら読んでおきたい資料集

AWSを始めるなら読んでおきたい初学者向けの資料をまとめてみました。
まず確認するべきは各サービスのドキュメントページやチュートリアルだと思いますので、それ以外の資料を紹介します。
ドキュメントページの中でもおすすめなのはFAQで、そのサービスの概要や他のサービスとの違いが端的にまとまっているので概要だけ掴みたいというときによいかもしれません。

個人的にもAWSを学習する上でとてもお世話になった資料群です。参考になれば幸いです。

# AWS公式資料
## [AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)

[AWS Black Belt Online Seminar](https://aws.amazon.com/jp/about-aws/events/webinars/) というアマゾン ウェブ サービス ジャパン株式会社が主催するオンラインセミナーがあります。製品・サービス別、ソリューション別、業種別などのテーマ別でそのテーマのスペシャリストが各回1時間で講義してくれます。事前申し込みをすれば無料でライブ聴講ができます。また、講義後はスライド・PDF・動画で公開してくれます。上記のリンクはその資料がまとまっているページです。

初心者向けから中上級者向けのセミナーまで多種多様なセミナーがあります。「AWS re:Invent 2018 アップデート速報」なんていうテーマもあるので情報のキャッチアップを助けてくれます。

## [AWS Well-Architected Framework](https://aws.amazon.com/jp/architecture/well-architected/)

AWS Well-Architected Frameworkとは、AWS（クラウド）におけるシステム設計・運用の大局的な考え方をまとめたもので、AWSとAWSのユーザーが多くの経験から培ったベストプラクティス集です。クラウドを利用したインフラ構築に必要な高可用性/コスト効率/耐障害性/スケーリングなどの概念を学ぶことができます。


# 書籍
AWSは頻繁にアップデートが行われているため、書籍の情報は陳腐化します。実際、書籍のキャプチャは現在のUIとは異なる部分があります。しかし、体系的な学習ができるので1冊は読んでおくべきだと思います。

## [Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/dp/4822237443/)

![aws-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/160547/e99ddf5a-dab3-e5fb-ed80-b4c6029444a4.jpeg)


WordPressでのブログ構築を通じてネットワーク・サーバー・NATなどを実際に手を動かしながら構築していきます。写真や図が豊富ですし、基礎的な用語の解説もあるので一つ一つ理解しながら進めることができます。

## [Amazon Web Services ネットワーク入門](https://www.amazon.co.jp/dp/4844381679/)

![aws-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/160547/69992720-9db2-b625-47dd-8b4b7b46ac40.jpeg)


こちらもWordPressでのブログ構築を通じて実際に手を動かしながら学習していくスタイルの本です。上記の書籍よりもさらにとっつきやすい本だと思います。

## [AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/dp/486594043X/)

![aws-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/160547/5200d492-6d2c-06f5-54fe-2ef1e95f2107.jpeg)


おそらく日本語で唯一の認定試験向けの書籍です。認定試験で問われる「いかにAWSの各種サービスや特徴を活用し、可用性が高く、コスト効率に優れたシステムを設計・構築するか」に重点を置いてAWSの用語や設計思想、代表的なサービスを紹介してくれます。章末問題が用意されているのでアウトプットしながら学習を進められます。

# ブログ
## [Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/)

公式ブログです。基本的にはサービスアップデートや新サービスリリースの情報が投稿されます。たまにサービスの活用事例のブログも投稿されるので面白いです。例えば、最近だと「[AWS Fargate を使用してサーバーレスの Twitter リーダーを構築する](https://aws.amazon.com/jp/blogs/news/build-a-serverless-twitter-reader-using-aws-fargate/)」のようなブログです。公式ブログなのでウォッチしておいて損はないかと思います。

## [Developers.IO](https://dev.classmethod.jp/category/cloud/aws/)

AWSといえばクラスメソッド。クラスメソッドといえばAWSといっても過言ではないでしょう。上記リンクはクラスメソッドさんのAWSカテゴリのページです。新サービスのいち早い試行やAWSに関するノウハウなどを共有してくれます。
certutilコマンドの出力結果の違い（Win8.1～/ Win11）

# はじめに

Windows環境では、[certutil](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/certutil)というコマンドを使ってファイルのハッシュ値を計算することが出来ます。

> certutil -hashfile [ファイルパス] [ハッシュ関数]

ハッシュ関数には、「SHA1」「SHA256」「MD5」など様々なものを指定できるので便利なのですが・・・MD5の場合、コマンドの実行結果の「表現の仕方」がWindows8.1とWindows10で異なっています。
ハッシュ値そのものは同じなので問題ありませんが、表現の仕方としてはWindows10の方が見やすく使いやすいと思います。

# Windows8.1の場合

- 結果のハッシュ値が、「bc d4 17 72 89 2d 29 ce 11 26 c7 b4 be 11 1d b6」と2桁ずつ半角のスペースで区切られています。

```msdos:dos
c:\>certutil -hashfile sample.txt MD5
MD5 ハッシュ (ファイル sample.txt):
bc d4 17 72 89 2d 29 ce 11 26 c7 b4 be 11 1d b6
CertUtil: -hashfile コマンドは正常に完了しました。
```

# Windows10/Windows11の場合

- 結果のハッシュ値が、「bcd41772892d29ce1126c7b4be111db6」と一続きの文字列となっています。

```msdos:dos
C:\>certutil -hashfile sample.txt MD5
MD5 ハッシュ (対象 sample.txt):
bcd41772892d29ce1126c7b4be111db6
CertUtil: -hashfile コマンドは正常に完了しました。
```

# 参考URL

* [Windowsのコマンドプロンプトでファイルのハッシュ値を求める](https://qiita.com/negi_c/items/00af8fce3c965e4c1fc5)
ARKitでカラーフィルター


ARKitでカメラにフィルターをかけてみましょう。

![GIFイメージ-FF5A801DAB1A-1.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/b88a05e1-81d1-77cc-e4c6-acbab0f3e4da.gif)

## やり方

以下のようなLUT画像と呼ばれる画像を使って、

![sepia.jpg](https://qiita-image-store.s3.amazonaws.com/0/111366/86e9ba62-03c3-f8aa-06a4-f83dedb7d2fa.jpeg)

scnCameraのcolorGradingにセットすると実現できます。

```swift
sceneView.pointOfView?.camera?.colorGrading.contents = #imageLiteral(resourceName: "sepia")
```

## もとに戻すには

```swift
sceneView.pointOfView?.camera?.colorGrading.contents = nil
```

## 画像を変えていろいろなフィルターをやってみよう

与える画像を変えることでいろいろなフィルターを表現することができます！

|![sepia.jpg](https://qiita-image-store.s3.amazonaws.com/0/111366/86e9ba62-03c3-f8aa-06a4-f83dedb7d2fa.jpeg)|![lut2.png](https://qiita-image-store.s3.amazonaws.com/0/111366/4469ade9-7b68-3bbb-20ea-2e7c3496ec9a.png)|![lut1.png](https://qiita-image-store.s3.amazonaws.com/0/111366/62aab5e0-2d92-2c38-c6c7-232b2dd75d58.png)|![lut3.png](https://qiita-image-store.s3.amazonaws.com/0/111366/2582890f-fe79-8315-c6d4-e8304bed4033.png)|
|:-:|:-:|:-:|:-:|
|![GIFイメージ-FF5A801DAB1A-1.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/b88a05e1-81d1-77cc-e4c6-acbab0f3e4da.gif)|![GIFイメージ-999C1C03C661-1.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/ec5c21cb-4010-2dce-6c70-dd321beac8be.gif)|![GIFイメージ-BE9EE74F7633-1.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/5a04b0f6-e087-33c6-1d54-d7b449d7290a.gif)|![GIFイメージ-2E126300361B-1.gif](https://qiita-image-store.s3.amazonaws.com/0/111366/509c77be-0ebf-42f1-df8d-59268d5ceaa2.gif)|

## サンプルコード

https://github.com/kboy-silvergym/ARKit-Emperor/blob/master/ARKit-Emperor/View/ColorGrading/ColorGradingViewController.swift

## 参考文献

- https://developer.apple.com/documentation/scenekit/scncamera/1644114-colorgrading
- http://appleengine.hatenablog.com/entry/2018/10/02/210907
macOS MojaveでApacheを起動しようとしたらPermission denied: AH00091: httpd: could not open error log fileとなったときの対応方法

# 事象 : Apacheを起動しようとしたら怒られた
```bash
$ apachectl start
(13)Permission denied: AH00091: httpd: could not open error log file /usr/local/var/log/httpd/error_log.
AH00015: Unable to open logs
```

# 原因 : Apacheのlogファイルに権限がないから
```bash
$ ls -l /usr/local/var/log/httpd/
total 16
-rw-r--r--  1 root  admin  1132 12 10 23:55 access_log
-rw-r--r--  1 root  admin  1358 12 10 23:53 error_log
```

# 対応 : Apacheのlogフォルダごと所有者を変える
これまでは `777` にしちゃえとかしていましたが調べると違うようなので・・・・そうよねセキュリティって普通ね
> Most users will want to be able to modify their content without being root. The easiest way to achieve this is through the use of Unix Groups; you create a group to which you add your content editing user, then you add the httpd user to that group.
> 
> Note that this doesn't easilly extend to more than one user who needs to edit the files, since at that point you need to set Group write on the files. One would need to use ACL's to achive this.
> [FileSystemPermissions - Httpd Wiki](https://wiki.apache.org/httpd/FileSystemPermissions)

```bash
# Apacheを動かすユーザを確認する
$ cat /usr/local/etc/httpd/httpd.conf
#<省略>
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User _www
Group _www

</IfModule>
#<省略>

# 「apache」ってグループを作ろうと思ったので使われていないかと空いているGIDを確認する
$ dscl . -list /Groups PrimaryGroupID | sort -k 2 -n
nobody                           -2
#<省略>

# グループを作る
$ sudo dscl . -create /Groups/apache PrimaryGroupID 531
# ユーザをグループに参加させる
$ sudo dscl . -append /Groups/apache GroupMembership _www
$ sudo dscl . -append /Groups/apache GroupMembership {自分}
# 確認してみる
$ sudo dscl . -read /Groups/apache
dsAttrTypeNative:record_daemon_version: 4850000
AppleMetaNodeLocation: /Local/Default
GeneratedUID: 4CFDE893-A9F2-4985-B1CC-8F7EA3812324
GroupMembership: _www {自分}
PrimaryGroupID: 531
RecordName: apache
RecordType: dsRecTypeStandard:Groups

# 所有者を変える
$ sudo chown -R {自分}:apache /usr/local/var/log/httpd/
Password:
$ ls -l /usr/local/var/log/httpd/
total 16
-rw-r--r--  1 {自分}  apache  1132 12 10 23:55 access_log
-rw-r--r--  1 {自分}  apache  1358 12 10 23:53 error_log

# めでたく起動した
$ apachectl start
$ 
```

# 参考
- [apacheのグループと実行ユーザを調べる – ABC Blog - Linux](https://linuxserver.jp/%E6%9C%AA%E5%88%86%E9%A1%9E/apache-group-and-user/)
- [usermodコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-usermod)
- [Macでグループを追加する方法など - BitArts](https://bitarts.jp/blog/archives/003881.html)
overflow:hiddenはモバイルだとbodyやhtmlタグには使えないという罠にかかりました。本当にありが(ry

# overflow-xを使ってたときの悲劇
個人的なウェブサイトを作ってるときに引っかかったので、備忘録がわりに残しておきますが、タイトル通り罠に引っかかりました。。。

bodyの中にカルーセルを作って、はみ出した部分をoverflow-x:hiddenで隠しておき、次へボタンクリックしたら次のカルーセルを表示みたいなことをしていたのですが。。。

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        ごにょごにょ
    </head>
    <body>
        bodyを横にはみ出すコンテンツ
    </body>
</html>
```
```css:style.css
body {
  overflow-x: hidden;
}
```

これPCならOKでしたがモバイルだとoverflow-x:hiddenが効かなかったです。

調べたところ、
**モバイルだとhtmlタグ・bodyタグに書いたoverflow:hiddenは無効**
というトラップがあったようです。

#解決策
bodyをdivタグで囲って、divタグに対してoverflow:hiddenすることで解決しました〜

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        ごにょごにょ
    </head>
    <div class="body-wrapper">
        <body>
            bodyを横にはみ出すコンテンツ
        </body>
    </div>
</html>
```
```css:style.css
.body-wrapper {
  overflow-x: hidden;
}
```

わかっちゃえばなんてことないんですけどねえ。そんだけです。
機械学習の学習方法についての整理

私自身の理解度チェックと備忘を兼ねて何回かに分けて記事にしておこうというのが目的です．

# はじめに
私が記事にした[これ](https://qiita.com/ryouka0122/items/6af88ba8cbc3bd43ff29)や[これ](https://qiita.com/ryouka0122/items/9acac34dfb04d78dcec1)では，学習データをすべて使うものでした．
そして精度はデータ数が多ければ多いほど良い（Under fittingしてたら意味ないけど）．
しかし，学習データを全てメモリ上に展開するのは現実的ではない．そのため，学習方法に工夫を加えその問題を改善することが出来る．


# バッチ学習
バッチ学習(Batch)は，一番わかりやすい学習方法だと思う．
学習データのすべてを使って，一番フィットしているパラメータを導き出す方法である．
勾配降下法で必要な$J(\Theta)$や$\Theta$の更新値の演算量はデータ数とパラメータ数に比例して大きくなっていく．


# 確率的勾配降下法 SGD
確率的勾配降下法(Stochastic Gradient Descent)は，1回の更新ですべてのデータを使わず，データを1つずつ用いる方法である．
当然のことながら，すべてのデータを使わないため演算量が格段に下がる．そして，1データずつパラメータを更新していく．
そのため収束速度はそれなりに良い．その反面，「1つずつ」という点から「いつまで経っても最小値周辺でウロチョロする」ということがある．
「およそ最小値周辺にいる」という意味なので，結果からみるとバッチ学習のときと近しいパラメータを早い段階で見つけることが出来る．

# ミニバッチ法
ミニバッチは，上記2つの間を取ったような方法である．つまり，1度のパラメータ更新で2～100程度のデータを使用する．
仮説関数$h_\Theta(x)$やデータの性質からミニバッチ法が最速で収束するときもある．しかし，使用データ数のチューニングが必要となるため，一長一短である．

# オンライン学習
バッチ処理では，手元にある学習データを全て使って高次の予測曲線や境界線を見つけることをやっている．
しかし，逐次現れる行動履歴から見つかるパターンには対応しきれない．
また，文章の単語や音声の音素などの構成要素の前後に関連がある場合にも対応できない．

そこで，現れるデータを次々と学習させていく逐次処理をオンライン学習と呼ぶ．
この学習方法は，市場の動向やトレンドを捕捉したり、購入情報から関連のある商品を提示するリコメンド機能などに活用できる．

オンライン学習の特徴は，学習に使ったデータは2度と使わないということ．


# まとめ
データの性質と予測したいものによって学習方法をバッチ学習にするかオンライン学習にするか変わってくる．
またバッチ学習には，パラメータ更新で利用するデータ数を変えるバッチ(batch)・確率的(stochastic)・ミニバッチ(mini-batch)の3パターンある．
スマートコントラクトのアップデート！？

スマートコントラクトもソフトウェアではあるのですが、通常のソフトウェアとは大きく異なる点があります。

## アップデート…できない？

ふつうのソフトウェアは、一度で完成形に至るものは稀で、ときおりバージョンアップしてバグ修正や機能の強化を図っていくものです。

これに対して、ブロックチェーンに焼き込むスマートコントラクトは、一度反映すれば**決して更新できません**。同じものを再度ブロックチェーンに投入したところで、新しいスマートコントラクトができるだけで、もとのスマートコントラクトには何ら影響がありません。

## どのような手を取ればいいか

ブロックチェーンのこのような特性をもとにして、バグの発生をゼロにはできない現実世界でスマートコントラクトを動かすには、どんなふうに進めればいいのでしょうか。

### 事前の監査

まず前提として、ブロックチェーンに投入する前に厳密なコード監査などを行って、事前に摘める不具合は摘んでおく必要があります。

### 永続するものは、更新の必要ないシンプルなコントラクトにする

イーサリアム上に構築した系でトークンのあるものも多いですが、トークン自体に複雑な機能を組み込むと、そこでバグを発生させる危険が出てくるなど、価値を保持するトークンとしては好ましくありません。

ということで、トークンはERC20などの規格を満たす最低限で作る、という形にすれば、少なくともアップデートの必要性自体が大幅に減少します。

### 永続しないコントラクトの活用

イーサリアムのコントラクトは、`selfdestruct`といって、「自爆」することができます。クラウドファンディングなどのように「実行期限」や「送金限度」が決まっているものは、その期限を迎えれば`selfdestruct`するようにしておくことで、完了後には攻撃される心配もなくなります。

### フロントエンドとバックエンドの分離

ある程度アップデートを前提として作らざるを得ないシステムでは、本体以外にフロントエンドとなるコントラクトを用意しておいて、バックエンドのコントラクトのアドレスを書き換え可能とすることで、処理の内容を入れ替え可能となります。

ただし、アドレスを変更可能ということは、ブロックチェーンの、一度書き込めば不変という部分に穴を開けているようなものなので、状況によってはデメリットやセキュリティリスクともなりかねません。

### 最後の手段

もうどうしようもなくなれば、残った手段は「新しいコントラクトを反映して、そちらを使ってもらうようにする」しかなくなります。イーサリアム上にあったAugurはもともとSerpentという言語で書かれていましたが、Serpent自体に脆弱性が見つかるという事態となりました。

対策として、Augur全体をSolidityで作り直して、取引所も含めてそちらに移行、旧Augurは**脆弱性を使って止めてしまう**ということとなりました（[詳細](https://btcnews.jp/2t1j8z4l12080/)）。この場合はたまたまシステムを止められる脆弱性だったので、前のスマートコントラクトは使用不能となっていますが、もしそうでない場合、旧システムもそのまま動き続けることとなるので、フォークのようになることもありえます。
Clovaの対話モデルにおける人名のゆらぎ


この記事は[スマートスピーカー2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/smart-speaker-2)の記事です。

# 乃木坂誕生日

乃木坂誕生日とういアプリを作りました。
これは、メンバーの名前を言うと、誕生日を教えてくれるスキルです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">乃木坂誕生日、<br>とりあえずまいやんの誕生日言うまでになった。<a href="https://twitter.com/hashtag/clova?src=hash&amp;ref_src=twsrc%5Etfw">#clova</a> <a href="https://twitter.com/hashtag/CLOVA_CEK?src=hash&amp;ref_src=twsrc%5Etfw">#CLOVA_CEK</a> <a href="https://t.co/QHoirP8FOS">pic.twitter.com/QHoirP8FOS</a></p>&mdash; Satoshi Watanabe (@sassy_watson) <a href="https://twitter.com/sassy_watson/status/1020979329147129856?ref_src=twsrc%5Etfw">2018年7月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



LINE Clovaのスキルには対話モデルを設計する必要があります。対話モデルとはClovaとどうやりとりするかをモデル化したもので、インテントとスロットで成り立ってます。
対話モデルでインテント（どのようなことをして欲しいか）とスロット（どのような言葉か）を設定してあげれば、音声をClovaでうまくインテント、スロットを分析してくれるので、それを元にどのような動作をさせるかプログラムしてあげます。

# 人名を扱う難しさ

乃木坂誕生日では、乃木坂46のメンバーの名前を登録したカスタムスロットを使うのですが、この人名を扱うのは非常に面倒くさかったのです。これはそのメモです。

人名には、発話の「ゆらぎ」が発生しやすいのです。メジャーなファミリーネームやファーストネームなら問題なさそうですが、そうは行かない場合もあります。

例えば、

- 向井葉月(むかいはづき)が「向葉月」
- 寺田蘭世(てらだらんぜ)が「ペアダンデ」
- 中村麗乃(なかむられの)が「中村莉の」
- 吉田綾乃クリスティーが「吉田屋のクリスティ」

などです。

- 久保史緒里(くぼしおり)が「久保志織」
- 阪口珠美(さかぐちたまみ)が「坂口珠美」

と別な漢字になってしまうものもありました。
(これは、ひらがなで　代表語を設定してしまったからかもしれません。)

これを回避するためには何度もテストする必要があります。ここがうまくいかないとうまく動作させずリジェクトされてしまいます。

# テスト方法

テストには対話モデルにある「テスト」の「発話履歴」を使います。

<img width="1292" alt="スクリーンショット 2018-12-14 22.16.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/4044/2d6d76a5-9f3c-8544-278d-c8fa2d4990ca.png">

これでなんどもなんどもテストしてみて「ゆらぎ」を洗い出します。

# しかし

4期生は珍しい名前がおおく、この「ゆらぎ」が出やすかったので、何回もテストして審査に出しました。
しかし、この「ゆらぎ」でリジェクトされました。
以下がそのリジェクトされたときのメッセージです。

<img width="714" alt="スクリーンショット 2018-12-14 22.18.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/4044/6e6bc9a0-e335-e8b8-f2ad-33ab728bf28d.png">

これは、発音する人の滑舌やイントネーションの違いで起こるのかと思われます。

リジェクトされてなんどもテストしました。
イントネーションを変えてみたり、早くしにしてみたり、かすれ声をしてみたり、姓と名の間に間を開けたり…。

一番バリエーションがあった清宮レイ(せいみやれい)さんの例です。
- saviorで
- セイミヤでいい
- 清宮0
- 清宮ね
- すいみやレイヤー
- cbre
- 生命
- jamie rae
- ついに歩い
- すいみやぎ
- せいねい
- saviorがいい

もし可能なら、テストするときは複数人でテストするのといいと思います。

---

以上で簡単ですが、スロットの「ゆらぎ」に関して書きました。
この情報が誰かの役に立てば幸いです。
macOS MojaveでApacheを起動しようとしたらAddress already in use: AH00072: make_sock: could not bind to addressとなったときの対応方法

# 事象 : Apacheを起動しようとしたら怒られた
```bash
$ apachectl start
(48)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(48)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
```

# 原因 : ポートが他のアプリとかぶっているから
```bash
$ lsof -i | grep 80
Google      731 mana  180u  IPv4 0x1dd0702206feb65      0t0  TCP 192.168.0.4:50545->185.199.110.153:https (ESTABLISHED)
Google      731 mana  280u  IPv4 0x1dd07021f59ab65      0t0  TCP 192.168.0.4:50585->104.17.69.176:https (ESTABLISHED)
Dropbox   61354 mana  150u  IPv4 0x1dd07021784d4e5      0t0  TCP 192.168.43.220:63686->162.125.80.3:https (CLOSE_WAIT)
Dropbox   61354 mana  203u  IPv4 0x1dd07020b6521e5      0t0  TCP 192.168.0.4:50211->162.125.80.3:https (CLOSE_WAIT)
Dropbox   61354 mana  205u  IPv4 0x1dd070221fad7e5      0t0  TCP 192.168.0.4:50212->162.125.80.7:https (CLOSE_WAIT)
```

# Apacheで使うポート番号を変える
```bash
$ vi /usr/local/etc/httpd/httpd.conf
#<省略>
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080 #<<< 80番から8080に変更した
#<省略>

# エラーは残っているけどポートの被りは解決
$ apachectl start
(13)Permission denied: AH00091: httpd: could not open error log file /usr/local/var/log/httpd/error_log.
AH00015: Unable to open logs
```

- [macOS MojaveでApacheを起動しようとしたらPermission denied: AH00091: httpd: could not open error log fileとなったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/40d7c4a14f7946e9b2e7)
(自分用メモ) Macを買ってからセットアップするまで

(自分用メモ)

# Mac購入
* Paypay祭りの時にMacBook Air(13-inch, 2017)を購入

```
1.8 GHz Intel Core i5
8 GB 1600 MHz DDR3
Intel HD Graphics 6000 1536 MB
```

# Mac起動
* Apple idでログイン
* [つぶやき] webブラウザでもどこでもEmacsのキーバインドが使えるのが素敵
    * e.g. Ctrl+fで右方向に1つ進む
    * 特にWebブラウザ上のEditorなどで, "新しくTabを開く"ショートカットとコンフリクトせずに, Ctrl+nで下方向にいく (MacではCommand+nで新しくTabを開く)
* [つぶやき] かな, 英数の切り替えが”かな”, ”英数”キーということを知る,,,

# Macでの設定
* Dockの場所を左にして, 自動的に隠す (システム環境設定 -> Dock)

# Homebrewインストール
* https://brew.sh/index_ja

# SKKの導入
* SKKとは
    * https://ja.wikipedia.org/wiki/SKK
* MacでSKKをセットアップ1
    * http://aquaskk.osdn.jp
    * http://aquaskk.osdn.jp/install_and_settings.html
    * インストールしたけど, なぜか日本語入力できない... -> これは設定ミスだった. 設定 -> 入力ソースでAquaSKKだけではなく, "ひらがな", "カタカナ"なども追加する必要がある.
    * しかし、漢字などに変換できない...
    * 本家がaccessできない, これが関係あるのか http://openlab.jp/skk/index-j.html
    * 辞書を別途DLして, 設定したらできた. ユーザ辞書に辞書Lと, 辞書一覧に辞書Lを追加した. (おそらく片方はユーザ辞書の登録は不要...)
        * https://github.com/skk-users-jp/dic-mirror
* [困り事1] SlackでShift+Enterで改行するたびに入力モードが"ひらがな"になる
    * [メモ1] "書類ごとに異なる入力ソースを使用"の設定は関係なし. SKKにも入力ソースの設定にもそれっぽいものはない...
    * [解決せず1] https://discussionsjapan.apple.com/thread/10153489
    * [メモ2] AquaSKK側でIssueとして対応したっぽい(4.2.7) https://github.com/codefirst/aquaskk/pull/25 . 起きているのは4.7.0ですね...
* [困り事2] PyCharmで"ひらがな"モードだと"l"を押して英数にしても, 何かを入力した瞬間にひらがなを入力しようとする
    * [メモ1] 同じ症状, 参考に試してみる https://github.com/codefirst/aquaskk/issues/81

# Githubの設定
* ssh経由でgit cloneできるように
    * https://qiita.com/unsoluble_sugar/items/14bea376d8e6fce82eb3

# インストールしたもの (一般)
* Google Chrome (Safariが検索してもたまに繋がらない)
    * Chromeだったら問題なくつながる, 謎
* PyCharm
    * https://www.jetbrains.com/pycharm/
* Android studio
    * 参考: https://akira-watson.com/android/adt-mac.html
* Zsh / Oh my zsh
    * https://qiita.com/NaokiIshimura/items/249bb1a101b626a59387
* Docker for mac
    * https://docs.docker.com/docker-for-mac/

# インストールしたもの (WebからMac用)
* Cheat sheet
    * https://www.cheatsheetapp.com/CheatSheet/

# インストールしたもの (AppStore)
* Xcode
* Slack

# インストールしたもの (brew)
* git / python3 / ffmpeg
* emacs
    * Terminal上で開くのではなく, 別windowで開くようにする > https://qiita.com/kokorinosoba/items/ecceaabe07d91c6f2c66
* circleci
    * circleciのビルドをローカルで確認できるように

# インストールしたもの (pip)
* pytest, pytest-cov

# 覚え書き
* Launchpadのショートカット
    * https://satoshisgarage.tech/?p=1741

# 参考
* [僕のMacセットアップ記録](https://qiita.com/taktod/items/308352c35e52fd015d35)
* [iMac/MacBook購入後に必ず設定したい設定項目](https://qiita.com/ryuichi1208/items/5905240f3bfce793b33d)
    * こんな設定が出来るんだ, 確認する
O'REILLY Dockerで引っかかったところ(Windows10)

オライリーから出ているDockerをWindows10 homeのWSLで動かそうとしたらいろいろハマったのでメモ。
（素人なのでしょうもない内容ばかりです）

# 環境
OS: Windows 10 home
WSL: ubuntu 16.04
Dockerバージョン: 18.09.0

#ハマり１ docker daemonが起動していない


## 症状
* 3.1章の19ページ真ん中あたり

```
$ docker run debian echo "Hello World"
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
```
## 解決方法
* この[記事](https://qiita.com/kogaH/items/534560dd1e4004e80df4)を参照
* 起動時に以下を実行するようにした。

```bash:dockerstart.sh
#!/bin/sh
sudo cgroupfs-mount
sudo service docker start
```

#ハマり２ uWSGIのインストールに失敗する
## 症状
* 5.1章の76ページ真ん中あたり

```
$ docker 
..
Failed building wheel for uWSGI
..
```
## 解決方法
* DockerfileのuWSGIのバージョンを2.0.15にしたら成功した。

#ハマり３ dnmonsterの画像が表示されない
* 6.2章の93ページ

## 解決方法
* firewallを切ること。

#ハマり４ docker pushができない
* 7.2章101ページ

## 解決方法
* docker loginをすること。

また何かあれば適宜追加修正します。
macOS MojaveでApacheを起動しようとしたらCould not reliably determine the server's fully qualified domain name, using IPアドレス. Set the 'ServerName' directive globally to suppress this messageとなったときの対応方法

# 事象 : Apacheを起動しようとしたら怒られた
```bash
$ apachectl start
AH00558: httpd: Could not reliably determine the server`s fully qualified domain name, using {IPアドレス}. Set the 'ServerName' directive globally to suppress this message
(48)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(48)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs

$ apachectl configtest
AH00558: httpd: Could not reliably determine the server`s fully qualified domain name, using mananoMacBookAir.local. Set the 'ServerName' directive globally to suppress this message
Syntax OK
```

# 原因 : httpd.confでServerNameを指定していないから
> ServerName が指定されていないときは、 サーバは IP アドレスから逆引きを行なうことでホスト名を知ろうとします。 ServerName にポートが指定されていないときは、 サーバはリクエストが来ている ポートを使います。最高の信頼性と確実性をもたらすためには、 ServerName を使ってホスト名とポートを明示的に 指定してください。
> [core - Apache HTTP サーバ バージョン 2.4](http://httpd.apache.org/docs/2.4/ja/mod/core.html#servername)

[macOS MojaveにHomebrewでApacheをインストール](https://qiita.com/ponsuke0531/items/ac257b112c1712114931)してから何も設定はしていなかった。

# 対応 : httpd.confでServerNameを指定する
```bash
$ vi /usr/local/etc/httpd/httpd.conf
#<省略>
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:8080
ServerName localhost:8080 #<<<ここを追記
#<省略>

$ apachectl configtest
Syntax OK

# まだポート番号のかぶりとかエラーは残るけどServerNameのエラーは解決
$ apachectl start
(48)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(48)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
```

- [macOS MojaveでApacheを起動しようとしたらPermission denied: AH00091: httpd: could not open error log fileとなったときの対応方法 - Qiita](https://qiita.com/ponsuke0531/items/40d7c4a14f7946e9b2e7)
- [macOS MojaveでApacheを起動しようとしたらAddress already in use: AH00072: make_sock: could not bind to addressとなったときの対応方法](https://qiita.com/ponsuke0531/items/d3ed0b7c9713e42a54e4)


# 参考
- [Apacheエラー「httpd: apr_sockaddr_info_get()」、「httpd: Could not reliably determine the server&#039;s fully qualified domain name」のエラーの原因と解決方法 - r_nobuホームページ](https://nobuneko.com/blog/archives/2014/12/apache_httpd_apr_sockaddr_info_get_could_not_reliably_determine_fqdn.html)
【Tello】トイ・ドローンで遊んでみた♪～VGG16とcv2.meanshiftによる物体識別トラッキング

昨夜はいわゆるcv2.meanshiftを利用してTrackingを試みたが、第四夜はこれに物体識別機能を追加して、さらに撮影した動画を保存するように改良した。

###一応の目標
①とにかく飛行させる
②GamePadで飛ばす
③PCで飛ばす
④Pythonで飛ばす
⑤画像入力する
⑥物体検出搭載
⑦トラッキングする
⑧物体を探して見つける
⑨...
今回やったこと
⑦物体識別機能付きトラッキングする
###コードは以下に置いた
[Tello/meanshiftObjDet.py](https://github.com/MuAuan/Tello/blob/master/meanshiftObjDet.py)
###⑦物体識別機能付きトラッキングする
[以前取り上げたものをTelloに応用した。](https://github.com/MuAuan/OpenCV/blob/master/meanshift_recognizedByVGG16.py)
ほとんどコードは同じで、カメラ部分だけ変更している。
肝心なところは以下のように画像サイズをVGG16のサイズに合わせている。

```py
    # 追跡する枠の座標とサイズ
    x = 200
    y = 200
    w = 224
    h = 224
    track_window = (x, y, w, h)
```
また、動画を保存できるように以下のとおり、cv2.VideoWriterを定義し、cv.fouce関数を定義した。

```py
    OUT_FILE_NAME = "meanshiftObjDet_result.mp4"
    FRAME_RATE=8
    out = cv2.VideoWriter(OUT_FILE_NAME, \
                  cv_fourcc('M', 'P', '4', 'V'), \
                  FRAME_RATE, \
                  (w, h), \
                  True)
```

```py
def cv_fourcc(c1, c2, c3, c4):
        return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
            ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)
```
また、drone.takeoffはtラッキングする物体を確定してからtakeoffすることとした。
そして、識別した物体の名称を動画に張った。

```py
cv2.putText(img_dst, txt, (x+3,y+10), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,0), 1)
```
さらに動画のfpsを計算して同じく動画に張り付けた。

```py
            curr_time = timer()
            exec_time = curr_time - prev_time
            prev_time = curr_time
            accum_time = accum_time + exec_time
            curr_fps = curr_fps + 1
            if accum_time > 1:
                accum_time = accum_time - 1
                fps = "FPS: " + str(curr_fps)
                curr_fps = 0
            cv2.putText(img_dst, fps, (x+3,y+10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1)
```
動画保存は以下のとおり

```py
            img_dst = cv2.resize(img_dst, (int(h), w))
            out.write(img_dst)
```

###結果
安定して物体識別しつつ、動画撮影・保存できた。
撮影した動画は再生もできたが、公開するには絵がもう一つ気に入らないので後日フィールドで撮影したいと思う。
###まとめ
・Tello飛行における、VGG16による物体識別付きトラッキングを実装・成功した
・動画を保存できるようにした

・物体検出したいと思う

###おまけ
物体識別は以下のようにVGG16を使っている。

```py
def yomikomi(img):
    batch_size = 2
    num_classes = 1000
    img_rows, img_cols=img.shape[0],img.shape[1]
    input_tensor = Input((img_rows, img_cols, 3))

    # 学習済みのVGG16をロード
    # 構造とともに学習済みの重みも読み込まれる
    model = VGG16(weights='imagenet', include_top=True, input_tensor=input_tensor)
    model.summary()
    
    # 引数で指定した画像ファイルを読み込む
    # サイズはVGG16のデフォルトである224x224にリサイズされる
    # 読み込んだPIL形式の画像をarrayに変換
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    #preds = model.predict(preprocess_input(x))
    preds = model.predict(x)
    results = decode_predictions(preds, top=1)[0]
    return str(results[0][1])
```
10.3 RioにJCLとJVCLをインストールする。

##JCL/JVCLとは
JCLとJVCL MPL 1.1で公開されているProject Jediのライブラリ/コンポーネント群です。JVCLがビジュアルコンポーネントで，JCLを利用しています。
公式サイト http://www.delphi-jedi.org/

Delphi 10/10.1/10.2ではGetItからインストールできたのですが，10.3 Rioではまだ公開されていないようです。
![Snap0012.png](https://qiita-image-store.s3.amazonaws.com/0/33902/25f856f1-3134-0f66-69a8-ab90c89df56d.png)

そこで，GitHubから最新のソースコードをダウンロードして，10.3 Rioにインストールしてみたいと思います。

##JCLのインストール

https://github.com/project-jedi/jcl からダウンロードします。
このページのHow to installには，
> Start the jcl\install.bat

と書かれていますが，これはcloneを作ったときのことのようです。その上の
Download the ZIP fileを見ると，
> If you download the JCL as a ZIP file from GitHub, you also have to download the jedi.inc and kylix.inc files from the https://github.com/project-jedi/jedi project and copy them to the jcl\jcl\source\include\jedi directory.

と書かれていますので，
https://github.com/project-jedi/jedi からjedi.incとkylix.incをダウンロードして，jclを展開したフォルダの中のjcl\jcl\source\include\jediにそれらをコピーします。
そして，展開したフォルダを適切な場所に動かしてから，そのフォルダの中のjcl\install.batを実行してください。すると以下のようなダイアログが表示されます。
![Snap0013.png](https://qiita-image-store.s3.amazonaws.com/0/33902/776b07d6-c775-7438-bc2d-f207f7caf04c.png)
Rioの32bitと64bitにインストールしたいと思いますので，Rad Studio 10.3 32bitタブをクリックして先頭のRad Studio 10.3 32bitにチェックを入れます。同様にRad Studio 10.3 64bitタブをクリックして，先頭のRad Studio 10.3 64bitにチェックを入れます。
![Snap0014.png](https://qiita-image-store.s3.amazonaws.com/0/33902/b7381684-49d3-d1fe-4bec-61d289a1b709.png)
インストールしないバージョンはタブを開いてすべて先頭のチェックを外してください。

そして，**installボタン**をクリックするとインストールされます。

##JVCLのインストール

JVCLのインストールはJCLよりも簡単です。
https://github.com/project-jedi/jvcl よりダウンロードして，適切な場所に展開します。
IDEを終了した状態で，その中のjvcl\install.batを実行します。
すると，以下のようなダイアログが表示されます。
![Snap0016.png](https://qiita-image-store.s3.amazonaws.com/0/33902/576464a0-f5f2-0afb-fbd3-be03d53b3398.png)
10.3 Rioには初めてインストールするので，New instrationを選択し**Next>ボタン**をクリックします。すると以下のダイアログが表示されます。
![Snap0017.png](https://qiita-image-store.s3.amazonaws.com/0/33902/b38f59b9-a248-7035-da2e-d5576c8f908a.png)
今回は10.3の32bitと64bitだけをチェックして，**Next>ボタン**をクリックします。
![Snap0018.png](https://qiita-image-store.s3.amazonaws.com/0/33902/b02181c6-557b-2166-e1c8-4900185df71c.png)
Configurationは特に変更しなくてよいようです。，**Next>ボタン**をクリックします。
![Snap0019.png](https://qiita-image-store.s3.amazonaws.com/0/33902/6f01de4d-8e2f-db4c-5209-a3cbe796a75f.png)
パッケージの選択も特別でない限り変更する必要はないと思います。，**Next>ボタン**をクリックします。
![Snap0020.png](https://qiita-image-store.s3.amazonaws.com/0/33902/ac7fa2c6-c5d6-a57e-08fa-c0ad7ee343ca.png)
インストール情報を確認し，**installボタン**をクリックします。するとインストールが実行されます。

IDEを起動すると，以下のように表示され，JCLとJVCLがインストールされたことが確認できます。
![Snap0000.png](https://qiita-image-store.s3.amazonaws.com/0/33902/aba31818-d0ae-2356-e9d3-3dc9db283f26.png)
VCLアプリを新規作成すれば，JVCLのコンポーネントをポトリペタリすることができます。

##まとめ

GitHubより，JCLとJVCLをダウンロードしてインストールする方法を説明しました。JCLをダウンロードしてインストールする場合にはhttps://github.com/project-jedi/jediから，incファイルをダウンロードして適切な場所に配置する必要がありますが，そんなに難しいインストール作業は必要ありません。
GetItからインストールできるようになったら，install.batを実行して，アンインストールしてから，GetItからインストールする方が安全でしょう。
【超小ネタ】Windows Vista以降のOSでUAC(User Account Control)のプロンプトを画面キャプチャーする方法

# はじめに
Windows Vistaで　UAC(User Account Control)が導入されました。そのため、インストーラーを起動したり、セキュリティーポリシーを変更するときに許可を求めるプロンプトが表示されるようになりました。
![ユーザーアカウント制御のプロンプト(キャプチャー不可).png](https://qiita-image-store.s3.amazonaws.com/0/114856/67ba24ce-d9ab-4da4-268a-9fd46a210018.png)
ところが、このプロンプトは通常、画面キャプチャーする事ができません。これは保護されたデスクトップに移行してしまうためです。この記事では、このユーザー権限昇格の許可を求めるプロンプトを画面キャプチャーする方法を御紹介します。

# 通知を受け取るタイミングを変更して対処する方法(Windows 7以降のOS)
まず初めに、Windows 7以降のOSで使用できる方法を御説明します。ただし、これはWindows Vistaでは使用不能な方法です。なお、環境の都合上、Windows 10の場合で説明していますが、原理はどのOSも同じです。

まず、コントロールパネルを起動し、「<font color="Red">システムとセキュリティ</font>」をクリックします。
![コントロールパネル.png](https://qiita-image-store.s3.amazonaws.com/0/114856/efccd165-a599-3276-a5bd-c19bcc25eeb0.png)

次に「<font color="Red">ユーザアカウント制御の変更</font>」をクリックします。
![1-1. システムとセキュリティ.png](https://qiita-image-store.s3.amazonaws.com/0/114856/3cdecd51-3313-3075-ab20-9ff02f8c7ec8.png)

起動したウィンドウで、<font color="Red">レベルを一段下げた</font>後、「<font color="Red">OK</font>」を<font color="Red">クリック</font>します。
![1-2. レベル変更.png](https://qiita-image-store.s3.amazonaws.com/0/114856/c2bc5016-4c82-0d00-3fff-7e567babd0aa.png)

そして開いたウィンドウを全て閉じます。

これだけでこのユーザー権限昇格の許可を求めるプロンプトを画面キャプチャーできるようになります。
![ユーザーアカウント制御のプロンプト(キャプッチャー可能).png](https://qiita-image-store.s3.amazonaws.com/0/114856/594c4ebc-e8b0-3337-36ce-5f5d103c31b8.png)

# ローカルセキュリティポリシーを変更する方法(Windows Vista以降のOS)
上記の方法はWindows Vistaでは使用できません。その場合はローカルセキュリティポリシーを変更すればキャプチャーできるようになります。なお、環境の都合上、Windows 10の場合で説明していますが、原理はどのOSも同じです。

まず、コントロールパネルを起動し、「<font color="Red">システムとセキュリティ</font>」をクリックします。
![コントロールパネル.png](https://qiita-image-store.s3.amazonaws.com/0/114856/efccd165-a599-3276-a5bd-c19bcc25eeb0.png)

今度は「<font color="Red">管理ツール</font>」をクリックします。
![2-1. 管理ツール.png](https://qiita-image-store.s3.amazonaws.com/0/114856/840431f1-faef-7ce8-8c94-26507531471c.png)

次に「ローカル セキュリティ ポリシー」をクリックします。
![2-2. ローカルセキュリティポリシー.png](https://qiita-image-store.s3.amazonaws.com/0/114856/cb3a3075-416c-6a01-937a-d14beea74012.png)

ローカル セキュリティ ポリシーの編集画面が起動したら、「<font color="Red">ローカル ポリシー</font>」>「<font color="Red">セキュリティ オプション</font>」の順にクリックし、最後に「<font color="Red">ユーザー アカウント制御: 昇格のプロンプト時にセキュリティで保護されたデスクトップに切り替える</font>」を<font color="Red">ダブルクリック</font>します。
![2-3.png](https://qiita-image-store.s3.amazonaws.com/0/114856/53dbd867-7862-e2ea-2513-e62d540b6ee7.png)

起動したウィンドウで「<font color="Red">無効</font>」を選択し、「<font color="Red">OK</font>」を<font color="Red">クリック</font>します。
![2-5. 無効.png](https://qiita-image-store.s3.amazonaws.com/0/114856/986dff94-7066-3f06-1af6-7aa3fa40cf3e.png)

ローカル セキュリティ ポリシーの編集画面で「<font color="Red">ユーザー アカウント制御: 昇格のプロンプト時にセキュリティで保護されたデスクトップに切り替える</font>」が「<font color="Red">無効</font>」になっている事を確認します。
![2-6. ローカルセキュリティポリシー.png](https://qiita-image-store.s3.amazonaws.com/0/114856/e750dde5-17ed-b9ac-78b2-0d0300ede8f1.png)

そして開いたウィンドウを全て閉じます。

これだけでこのユーザー権限昇格の許可を求めるプロンプトを画面キャプチャーできるようになります。
![ユーザーアカウント制御のプロンプト(キャプッチャー可能).png](https://qiita-image-store.s3.amazonaws.com/0/114856/594c4ebc-e8b0-3337-36ce-5f5d103c31b8.png)

#最後に
この記事ではUACの権限昇格のプロンプトを画面キャプチャーする方法について記述しました。作業手順書を書いたり、テスト実行時の証跡を取ったりする時に役に立つ方法ですので、必要な場合に使用してみてください。
CakePHP config配下のディレクトリ内の設定ファイルを読み込む

##ディレクトリ構成

```php:ディレクトリ構成
project
    |
    - bin
    - config
        |
        - Migrations
        - hoge
            |
            - huga.php
        - schema
        - Seeds
        app.default.php
        app.php
        bootstrap.php
        routes.php
    - logs
    - plugins
    - src
    - tests
    - tmp
    - vendor
    - webroot
```

##前提
- configディレクトリ配下に存在するhogeディレクトリ内のhuga.phpの設定を読み込む
- bootstrap.phpにはConfigure::loadされている

##読み込む
```php:HogeController
<?php
namespace App\Controller;

use App\Controller\AppController;

class HogeController extends AppController
{
    public function index()
    {
        Configure::read('huga');
    }
}
```

HogeControllerで読み込みたい場合、この状態で`Configure::read()`をしてもエラーになります。
理由としては、`Configure::read()`はconfigディレクトリ直下のファイルを参照するからです。

なので、HogeControllerの先頭で`use Cake\Core\Configure;`をして[エイリアス](http://e-words.jp/w/%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9.html)を作成します。

`Configure`はCakePHPがもともと持つクラスです。
エイリアスを作成することで、config配下のディレクトリ内のファイルも参照することが出来るようになります。

```php:HogeController
<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Core\Configure;

class HogeController extends AppController
{
    public function index()
    {
        Configure::read('huga');
    }
}
```

##参考
https://book.cakephp.org/3.0/ja/development/configuration.html#namespace-Cake\Core
https://book.cakephp.org/3.0/ja/development/configuration.html#id3
https://remotestance.com/blog/3064/
http://blog.fagai.net/2015/01/18/cakephp3-configure-class/