OmniAICreator/Qiita-1.07M huggingface dataset:
【検証用】Zabbix4.0-preをAnsibleで自動構築してみた

####※2018/10/02追記※
本日Zabbix4.0LTSが正式にリリースされたので、
リポジトリも追加しておきました。

https://github.com/HOBO1108/zabbix4.0lts-ansible

下記の手順とREADME.md記載の内容で構築できますので、
ご利用頂ければ幸いです。

## 目的
インフラCI構築技術習得の一環のため、Ansibleの学習を最近行っています。
そこで手動構築経験のあるZabbixの最新版(β版)を自動構築できないかと思い、
やってみました。

CentOS7へPlaybookを実行すると以下の状態が完成するように設定しております。
Zabbix 4.0-preの検証などにお使い頂ければありがたいです。

　・zabbix_server (Zabbix) 4.0.0beta1 一台構成

　・zabbix_agentはZabbix Serverのみに入るようにPlaybook及び
　　zabbix_agentd.confを編集しています。必要であれば適宜編集してください。

## 作業概要

■Zabbixモジュールダウンロード公式ページ
https://www.zabbix.com/jp/download?zabbix=4.0&os_distribution=centos&os_version=7&db=MySQL

■Github(PlaybookダウンロードURL)
https://github.com/HOBO1108/zabbix40a-ansible

上記URLからPlaybookをGit CloneするかダウンロードしてAnsible実行サーバへ配置していきます。

↓↓は私のAnsible実行サーバのディレクトリ構造です。

```:Ansible_ZabbixPlaybookのディレクトリ構造
[root@stma01s zabbix40a]# pwd
/root/zabbix40a
[root@stma01s zabbix40a]# tree --charset=C
.
|-- inventory
|   `-- inventory.ini
|-- roles
|   |-- common
|   |   |-- handlers
|   |   |   `-- main.yml
|   |   |-- tasks
|   |   |   |-- check.yml
|   |   |   `-- main.yml
|   |   |-- templates
|   |   |   `-- chrony.conf.j2
|   |   `-- vars
|   |       `-- main.yml
|   |-- zabbix_agent
|   |   |-- tasks
|   |   |   `-- main.yml
|   |   `-- templates
|   |       |-- zabbix.conf.php.j2
|   |       `-- zabbix_agentd.conf.j2
|   `-- zabbix_server
|       |-- tasks
|       |   `-- main.yml
|       `-- templates
|           |-- snmptrapd.conf.j2
|           `-- zabbix.conf.php.j2
|-- site.yml
|-- zabbix_agent.yml
`-- zabbix_server.yml

13 directories, 15 files
[root@stma01s zabbix40a]#
```
Playbook実行完了後に[http://{zabbix serverのIPアドレス}/zabbix]に
URL接続するとログイン画面が開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/198785/0da1c0b9-bcf2-5dd0-0315-7009f923c478.png)

ID       : Admin
Password : zabbix

でログインすれば終わりです。

あとは日本語設定やエージェントの有効設定などを行ってください。

## 参考資料

[■zabbix3.0(server/agent)のansible-playbookを作ってみた(その２)](https://qiita.com/mishikawan/items/23b94362be24e1bc0803)
→Zabbix自動構築Playbookを作成する際に非常に参考になりました。
 上記URLのPlaybookと異なるのはリポジトリやzabbix-mysqlのURL、zabbix_agented.confの設定部分だけで、ほぼ公開されている内容を使って構築できました。

 大変参考になりました。ありがとうございます。

[■注目の構成管理ツールAnsibleを徹底活用する 記事一覧](https://thinkit.co.jp/series/5495)
→掲載時期は既に二年前と古いものの、初学者用としてわかりやすくまとめてくれているので、Ansibleの構築と基本操作を学ぶのに大変参考になりました。


以上です。

## 感想(余談)
Ansibleは触り始めてまだ10日も経っておりませんが、シンプルかつ豊富なモジュール、そしてエージェントレスでの簡易な仕組みも相まって、すぐに基本的な使い方は習得できました。

また今回は、インターネット上に存在したAnsibleのコードを拝借して少し編集しただけですので、構築完了までに全く時間がかかりませんでした。

Zabbixを手動で構築するとなると、設定項目やインストールするものも多く、どこかでつまづくことが多かったです。ちなみに私は去年初めてZabbixサーバを構築した際は約15時間(土日潰れました)かかりましたが、今回はCentOS構築から始めても約30分で完了し飛躍的に構築速度が向上しました。

さらに、Ansibleは冪等性もあるため、サーバの作り直し時間も大幅に短縮されます。
今後はスナップショットによる戻しも含めて約5分で済みます。
　※CentOS7はVMWare ESXiのVMとして起動させてます。

ということで、Ansible+Zabbixでの検証環境構築は激しくオススメです。
ものすごい簡単ですよ。ぜひZabbixを検証されたい方は学習することをオススメします。
PlantUML Server に Noto フォントを組み合わせてみました

PlantUML Server に Google Noto フォントを組み合わせてみました。Noto Sans と Noto Serif の両方をインストールしています。

docker run で使えます。

```
docker run --rm -d -p 8080:8080 plantnotouml/server:ja
```


## サンプル

```
@startuml

skinparam ParticipantFontName "Noto Sans CJK JP"
skinparam ActorFontName "Noto Serif CJK JP"
skinparam ArrowFontName "Noto Sans Mono CJK JP"

(ParticipantFontName:\nNoto Sans CJK JP) as sans
"ActorFontName:\nNoto Sans CJK JP" as serif
sans <.. serif : ArrowFontName:\nNoto Sans Mono CJK JP

@enduml
```

![スクリーンショット 2018-09-09 2.41.26.png](https://qiita-image-store.s3.amazonaws.com/0/63688/9b24c910-29af-5432-2ec8-d27aa34768eb.png)

## リンク

* [Plant-Noto-UML Server (Docker Hub)](https://hub.docker.com/r/plantnotouml/server)
neovim+diffchar.vimでgitコンフリクト解消時に単語の差分も見れるようにする

## 概要
gitのマージツールをneovimにしていたのだが、デフォルトのままだと単語ごとの差分が表示されないため、csvなどのマージの際にコンフリクトした箇所をわざわざ違うdiffツールを使って差分を確認するなどの面倒な作業が発生していた。

![スクリーンショット 2018-09-08 19.04.16.png](https://qiita-image-store.s3.amazonaws.com/0/169996/2af1de65-e665-a050-354f-521c2ec6d53d.png)

これが不便だったので、[diffchar.vim](https://github.com/rickhowe/diffchar.vim)を使って、単語ごとの差分を出すようにした。

## 環境
### OS
macOS High Sierra 10.13.6

### neovim
```
NVIM v0.2.2
Build type: Release
LuaJIT 2.0.5
Compilation: /usr/local/Homebrew/Library/Homebrew/shims/super/clang -Wconversion -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -DNDEBUG -DMIN_LOG_LEVEL=3 -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wimplicit-fallthrough -Wvla -fstack-protector-strong -fdiagnostics-color=auto -DINCLUDE_GENERATED_DECLARATIONS -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/build/config -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/src -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/opt/gettext/include -I/usr/include -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/build/src/nvim/auto -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/build/include
Compiled by brew@HighSierra.local

Features: +acl +iconv +jemalloc +tui
See ":help feature-compile"

      システム vimrc: "$VIM/sysinit.vim"
       省略時の $VIM: "/usr/local/Cellar/neovim/0.2.2_1/share/nvim"

Run :checkhealth for more info
```

### git
git version 2.17.0

## 導入手順

### diffchar.vimをインストール
プラグインマネージャーを使うのが楽。
自分の場合は[dein](https://github.com/Shougo/dein.vim)を使用。

```toml:dein.toml
[[plugins]]
repo = 'rickhowe/diffchar.vim'
```

### diffchar.vimの設定
[ドキュメント](https://github.com/rickhowe/diffchar.vim/blob/master/doc/diffchar.txt)を参考にdiff表示の設定。
自分は以下のように設定。

```vim:init.vim
let g:DiffUnit = 'Char' " any single character
let g:DiffColors = 3 " 16 colors in fixed order
```

### gitconfigの設定
以下のコマンドでgitconfigを編集

```shell
git config --global --edit
```

```.gitconfig
[merge]
  tool = nvim
[mergetool "nvim"]
  cmd = nvim -c '2wincmd w | diffthis | 3wincmd w | diffthis | 1wincmd w | wincmd J' -O $MERGED $LOCAL $REMOTE
```

`$LOCAL`ペインと`$REMOTE`ペインをdiffモードで比較し、`$MERGED`ペインを下部に移動している。
まわりくどいように思えるが、こうすることで`$MERGED`ペインをdiffモードに入れずに表示することができる。

## 結果
単語ごとの差分が表示されるようになった！
![スクリーンショット 2018-09-08 23.07.31.png](https://qiita-image-store.s3.amazonaws.com/0/169996/e34bf097-568b-da0a-e96b-6ce6d7be0271.png)


## 参考
* [Macでコンフリクト時に単語差分も出すマージツール「DiffMerge」](https://qiita.com/mkiken/items/1d493fc562706e2c23d1#comment-4201cd13c5bfae60bb0a)
* [Git の difftool と mergetool コマンドが Neovim を使うように設定してみた](https://yu8mada.com/2018/08/21/i-tried-configuring-for-git-s-difftool-and-mergetool-commands-to-use-neovim/)

## 2018/9/9追記
[こちら](https://qiita.com/mkiken/items/1d493fc562706e2c23d1#comment-4201cd13c5bfae60bb0a)で@rickhowe さんに

```
cmd = nvim -d \"$LOCAL\" \"$REMOTE\" \"$MERGED\" -c '2 wincmd l | wincmd J | wincmd k'
```

だと、`$MERGED`のペインもdiffモードで比較されてしまうので、よくないとのことで改良案をいただいたのでそちらのコマンドに変更しました。
ありがとうございます。
Markdownを始めよう

Markdown記法を全く利用していない社内でMarkdown記法について布教するためのメモです。

# Markdownとは何か？

テキストファイルで構造的な文章を記述するための記法。

Markdown記法で記述されたファイルを適切なビューアで読み込むと、HTMLに変換していい感じに綺麗に表示できる。

GitHubでいい感じにREADME.mdファイルが表示されるのはこれ。

# 利点

- 平文テキストの記法が統一できる
- Word等の特定のアプリに依存せず、テキストエディタが自由に選択できる
  - エディタによっては入力補助が使える
- ソースコードを挿入できる
- テキストファイルなのでGit等でバージョン管理できる
  - GitHub等のリポジトリマネージャは標準でビューア機能があり、いい感じに表示してくれる

# 欠点

- 表示には何らかのツールが必要
- WYSIWYGではないのでエンジニア以外には向かない
- ページ区切りという概念はない
- 画像のバイナリファイル自体を埋め込みできない
- 表を書くのがちょっと辛い

# ツール (エディタ、ビューア)

テキストファイルが編集できるなら何でもよい。メモ帳でもいい。

モダンなエディタなら拡張機能を導入することでシンタックスハイライトや入力支援機能が使える。プレビュー機能を備えているものも多い。

以下、利用しているものを記載。

## Visual Studio Code

- [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one) によって入力支援、[markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint) による文法チェックが可能
- 別カラムでのリアルタイムプレビューもできる
- シンタックスハイライト
- アウトライン解析

## 秀丸

- [Markdown記法強調表示定義ファイル](https://hide.maruo.co.jp/lib/hilight/mrkdwn102.html) でシンタックスハイライト可能
- リアルタイムプレビューには [HmCustomLivePreviewMD](https://hide.maruo.co.jp/lib/macro/hmcustomlivepreviewmd.html)

## Chrome

[Markdown Preview Plus](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl) を導入するとChromeへファイルをD&Dするだけでプレビューできる。表示の自動更新もできるのでChromeで開きながらメモ帳で編集も可能。

# 記法について

下記参考。

- [Markdown記法 サンプル集 - Qiita](https://qiita.com/tbpgr/items/989c6badefff69377da7)

記法についてはサービスによって方言というものがあり、必ずしも同じ記法が使えるわけではないので注意。表組みやシンタックスハイライトはMarkdown ExtraやGitHub Flavored Markdown (GFM) といった方言の仕様ではあるが、大体の表示系で使える。

今までは標準的な仕様というものが存在していしなかったが、現在は[CommonMark](https://commonmark.org/)という仕様で標準化が進められつつある。GitHubが採用しているGFMはこの仕様をさらに拡張したものになっている。

以下、よく使うものを抜粋します。

## 改行・段落

改行1つだけだと無視されます。空行を1つ置くと段落分けされる。

段落内で改行したい場合は、行末にスペースを2つ書く。


## 見出し

    # 見出し1
    ## 見出し2
    ### 見出し3
    #### 見出し4

## 箇条書きリスト

    - リスト1
      - リスト1-1
        - リスト1-1-1
        - リスト1-1-2
      - リスト1-2
    - リスト2
    - リスト3

## 番号付きリスト

    1. 番号付きリスト1
      1. 番号付きリスト1-1
      2. 番号付きリスト1-2
    2. 番号付きリスト2
    3. 番号付きリスト3

行頭の数字が何であるかは無視されるため、全部`1.`で始めてもいい感じに番号を振ってくれる。

    1. 番号付きリスト1
    1. 番号付きリスト2
    1. 番号付きリスト3

## 文字装飾

    *斜体* _斜体_
    **太字** __太字__

## リンク

    [表示テキスト](https://www.google.com)

## 画像表示

     ![代替テキスト](gazou.png "タイトル")

## コード挿入

    行内に含める場合、 `echo 'hello, world'` のようにバッククウォート1つで囲む。

複数行に渡る場合は、行頭にスペースを4つ置く。

上下にバッククウォート3つと言語名を書くとシンタックスハイライトされる。ただし、これはGFMの仕様。

    ```c
    int main(int argc, char** argv)
    {
        printf("hello, world¥n");
        return 0;
    }
    ```

## 表組み

Markdown Extraの仕様。GFMでも使用できる。

    |header1|header2|header3|
    |:--|--:|:--:|
    |align left|align right|align center|
    |a|b|c|
ElectronでCORSで守られているレスポンスも見れるようにする

CORSというウェブアプリのセキュリティのための仕組みがあり、例えばドメインが違うところに通信を行おうとすると、レスポンスが見られないようになったりします。
これは、ブラウザーがそのへんをきっちり制御していて、セキュリティを守るようになっているからです。

で、今回、私はElectronのアプリでCORSで守られたAPIを叩きたいと思ったのですが、`Access-Control-Allow-Origin`にドメインが設定されていて、Electronからもレスポンスにアクセスできなかったのです。
Electronで実行されるとき、カレントドメインにはどうやらnullが設定されているようです。

# 本来の解決方法

調べた限り、こうするんじゃないかなー、という雰囲気を感じ取ったのですが、うまく動きませんでした。

### `webRequest.onHeadersReceived`でヘッダを書き換える

参考：https://imfly.gitbooks.io/electron-docs-gitbook/jp/api/session.html

要は、`Access-Control-Allow-Origin: *`が帰ってきたことにしてブラウザを騙してしまえばよいのです。
と思ったので、レスポンスヘッダを書き換える方法を試してみましたが、うまくいかず。
ハンドラが呼ばれていることも、`cancel: true`が有効なことも確認できましたが、ヘッダーは書き換えられず。

```js
const { session } = require("electron");
session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
  callback({
    cancel: false,
    responseHeaders: {
      ...details.responseHeaders,
      "Access-Control-Allow-Origin": ["*"],
    },
  });
});
```

# 今回やった解決方法

CORSというのはブラウザー上で動くウェブアプリでのみ有効な決まりごとです。
ブラウザー外で通信する場合にはこの制約は働きません。
そこで、実際の通信はElectronのNode.jsプロセス(メインプロセスと呼ばれます)で行い、その結果をWebアプリプロセス(レンダラプロセスと呼ばれます)に渡す、というだいぶめんどうな方法で解決することにしました。

```js:main.js
const { ipcMain } = require("electron");
const request = require("request");

ipcMain.on("fetch", async (event, url, params) => {
  const body = await new Promise(ok => {
    request(url, params, (_, _, body) => ok(body));
  });
  event.sender.send("fetch", JSON.parse(body));
});
```

```js:renderer.js
const { ipcRenderer } = require("electron");
async function fetch(url, params) {
  return new Promise(ok => {
    ipcRenderer.once("fetch", (_, body) => ok(body));
    ipcRenderer.send("fetch", url, params);
  });
}
```

ただ、この雑実装だと、通信が同時に走るだけで混線する可能性があるので、もうすこしいい感じに実装する必要があるでしょう。とりあえず、自分はこれで十分でした。

なんで、onHeadersReceivedが使えなかったのか、とか、一般的にElectronアプリでCORSのURL叩くときどうしてるんだろうとか、疑問はいろいろ残りました。

以上です。よろしくお願いいたします。
firestoreのセキュリティルールでハマったこと

# TL;DR
firestoreのセキュリティルールはやっぱり難しい
ルールを変えたらクエリも考え直す必要が出てくる
**RealTimeDatabaseのドキュメントも読むべき**

# やろうとしたこと
各documentの中に、閲覧許可を与えられている人のメールアドレスを保持しておき、
そこを変更することで、document毎に自由に閲覧権限を振れるようにしたかった。

例えば、以下のようにcollectionの中にdocumentが保存されていたとすると、
test1@test.comのユーザでアクセスした時には全てのドキュメントが見れて、
test2@test.comのユーザでアクセスした場合には"ドキュメント1"と"ドキュメント3"だけが見れるようにしたかった。

```json
{
  "name": "ドキュメント1",
  "emails": ["test1@test.com", "test2@test.com"]
},
{
  "name": "ドキュメント2",
  "emails": ["test1@test.com"]
},
{
  "name": "ドキュメント3",
  "emails": []
}
```


[公式のドキュメント](https://firebase.google.com/docs/firestore/security/secure-data?hl=ja)を読むと、やりたいこと自体は達成できそうだったので、やって見た。

```javascript
service cloud.firestore {
  match /databases/{database}/documents {
    function hasPermission(emails) {
      return request.auth.token.email in emails || emails == [];
    }
    function isSignedIn() {
      return request.auth != null;
    }
    match /{collection}/{documentId} {
      allow read: if isSignedIn() && hasPermission(resource.data.emails);
      allow write: if isSignedIn();
    }
  }
}
```
シミュレータで確認したところ、想定通りの動きをしてくれたので、ルールをデプロイして見た。
> 公開した変更が反映されるまでには最大 1 分ほどかかることがあります

すると、こんなメッセージが出て来たので、2,3分待ってからどうなったかを確認した。
> Missing or insufficient permissions.

ん？シミュレータと言ってることが違う。。。？
色々とルールを見直したり、フロント側の実装を見直して見たものの
どこが間違っているのか分からない。。。orz

気分転換に昼寝をしてからリトライしてみると、何故か想定通りにデータがとれる。？？？
さっきとコードは何も変えてないぞ？？？

錯乱しながら調べていると[こんなことが書いてある記事](https://medium.com/google-cloud-jp/firestore3-9518331f8748)を見つけた。
> firebase deploy --only firestore:rules を実行すると、反映されます。大抵は数十秒以内で反映されますが、仕様的には最大10分ほどかかるので、正確に書いたつもりなのに意図通り動かない場合は未反映も疑ってしばらく待つのも良いです🍵

~~もしかして、セキュリティルールが反映されるのは段階的なのか？
もしそうなら、hasPermissionとして書いた部分だけ反映が遅れて弾かれていた
と言われれば、何と無く納得できる。~~

~~今はルールを変えてもすぐに反映されているみたいなので、再現性がなくて困る。~~

複数のアカウントでデータを追加したり消したりして見たところ、再び、
> Error: Missing or insufficient permissions.

が出て来た。
これはもしかして、自分が権限を持たないデータにアクセスした時に
そこだけ弾くのではなく、そのクエリ自体を拒否されてしまうのか！
ということでクエリを投げる段階で、自分が許可を持っている範囲に限定して飛ばしてみると
無事データが取れた！

# まとめ
多分、自分が権限を持っていないcollection, documentを含む形でクエリを投げてしまうと、
クエリの実行自体が失敗してしまうので、whereで絞ってクエリを投げる必要がある。
今回の場合だと

```javascript
.where("emails", "array-contains", email)
```
や

```javascript
.where("emails", "==", [])
```
をクエリにつければ解決した。
~~あれ？ORって使えたっけ？~~

# TODO
- emailsを編集できる人の権限もadminに設定されたユーザに限定しておきたい
単体テストを呼吸するように治そう(Apexトリガー編)

# まえおき
Saleforceには75%以上カバレッジがないとクラスをデプロイできないという規約がある。

素晴らしい規約。だが単体テストを"カバレッジを通すため"に実装する
様々な禁忌が犯されているケースは少なくない。

「なんのための単体テストなん？なんのための規約なん？」

そんな光景を発見しては治しの連続。

ちゃんとTDDや単体テストの書き方について勉強されてる方には恥ずかしい限りだが
以下の願いをこめて単体テストの治し方について書くことにした。

* 単体テストを"単体テスト"として書く人が少しでも増えるように
* 禁忌のケースを見つけても素通りせず"呼吸するように治す"人が増えるように

※ほぼjavaクラスとJUnitと同じなのでjavaラベルつけた。

# 対象の実行クラス
Dto1__c というオブジェクトのtrigger内のafter update時に起動するこんなクラスだとします。

```
public with sharing class DtoHandler{
    public static void execute(Dto__c dto){
        if(dto.a == 'x'){
            // dto2オブジェクト にinsertする処理
           insert new Dto2();
        }
    }
}
```

# 治す前
こんなでした。

```
@isTest static void testExecute(){
    Dto__c dto = new Dto(a='x', b='y');
    insert dto;
    update dto:
}
```

お、おう。トリガーでこう動くんだからまあカバレッジは上がるよね。

```
trigger DtoTrigger on Dto__c (after update) {
    DtoHandler.execute(Trigger.New);
    munyamunya();
}
```

えっと単体テストがfailしないってことはトリガーが失敗せずに実行される。
ってことまでは担保できてそうだ。（担保？）
これはtriggerのテストなので testDtoTrigger() にしよう。

で、testExecute()は今の単体テストだとmunyamunya() も実行してるけど？
っていうかデータ更新だけ実施して何がわかるの？ってことで。

# 治した後

```

/*
 * DtoTriggerのテストメソッド
 */
@isTest static void testDtoTrigger(){
    Test.startTest();
    Dto__c dto = new Dto(a = 'x');
    insert dto;
    //DtoTrigger.trigger updateの実行
    //expect：update実行時にerror発生しない
    dto.a = 'y';
    update dto;
    Test.stopTest();
}
```

```
/*
 * executeメソッドのテストメソッド
 */
@isTest static void testExecute(){
    Test.startTest();

    //dto生成
    Dto__c dto = new Dto(a='y');

    //a = 'x'以外の場合レコードはinsertされない
    DtoHandler.execute(dto);
    Dto2__c dto2_1 = [SELECT Id FROM Dto2__c];
    System.assertEquals(0,dto2_1.size());

    //a = 'x'の場合dto2のレコードがinsertされる
    dto.a = 'y';
    DtoHandler.execute(dto);
    Dto2__c dto2_2 = [SELECT Id FROM Dto2__c];
    System.assertEquals(1,dto2_2.size());

    Test.stopTet();
}
```

# 治し方ポイント

- 単体テストのDTOに余計な項目は入れない。
- トリガー単位ではなく、もっと単体（メソッド単位）でのテストをする。
- コメントや書き方を工夫して"何のテストをしてるのか"極力わかりやすくする。
- トリガーのテストは超最小限（にできる実装の方がテストの粒度を細かく実施できる。）
 
# つぶやき
TDDに慣れてない人や、TDDやりたいけどいまいちスピードが出ない。。という人は
このように残念な単体テストをひたすら直し続けると自ずと
「あ、単体テストから書いた方がわかりやすい」ってなると思う。
せっかく良い規約があるんだからちゃんと活用しましょ。
Jetson TX1にJetPack 3.3をUbuntu18.04でインストールしてみた

# 環境
- Jetson TX1
- Ubuntu 18.04
- JetPack 3.3

# インストール
JetPack 3.3 はUbuntu 18.04をサポートしてなく、そのままではインストーラーが正常に動作しないようです。下記の手順でlibpng12、xterm、pythonをインストールすれば良いようです。

```
$ sudo wget -q -O /tmp/libpng12.deb http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb \
&& sudo dpkg -i /tmp/libpng12.deb \
&& sudo rm /tmp/libpng12.deb

$ sudo apt install -y xterm python
```

あとは、下記等を参照。

[JetsonTX2初期セットアップ(Jetpack)からサンプルのコンパイルまでの手順](https://qiita.com/akrian/items/54c321bfa95d8eaef17d)

# 動作確認
libcublasがSM 35アーキに対応していないため、そのままだとエラーが起きるので修正します。

```
$ cd /home/nvidia/NVIDIA_CUDA-9.0_Samples
$ vi 6_Advanced/cdpLUDecomposition/Makefile
```

```:6_Advanced/cdpLUDecomposition/Makefile
--- 6_Advanced/cdpLUDecomposition/Makefile.org	2018-09-09 13:47:30.283098319 +0000
+++ 6_Advanced/cdpLUDecomposition/Makefile	2018-09-09 13:30:58.002487389 +0000
@@ -234,7 +234,7 @@ LIBRARIES :=
 
 # Gencode arguments
 ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),armv7l aarch64))
-SMS ?= 35 37 50 52 53 60 61 62
+SMS ?= 37 50 52 53 60 61 62
 else
 SMS ?= 35 37 50 52 60 61
 endif
```

```
$ make -j2
```
高階関数（チラ裏）

チラ裏のメモ

簡単に覚えよう、**高階関数とは、引数や戻り値に関数を渡せる関数の事。**
（関数の単語が三回出てきててめんどくさい。）

```c++
//引数に関数オブジェクトを渡す場合。
void func(std::function<void()> f)
{
   f();
}

//戻り値が関数オブジェクトだ。
std::function<void()> func2()
{
   return [](){printf("わん\n");};
}

int main()
{
   func([](){printf("にゃおーん\n");});

   std::function<void()> ff = func2();
   ff();

   //これ楽しい
   func( func2() );

   return 0;
}
```

関数ポインタとか渡そうと思ったら書き方を忘れている・・・（汗
とりあえずこっちで。
((追記：ちなみに、C言語では第1級関数のサポートが無いので関数ポインタを使った所で高階関数ということにはならないらしい。こういう厳密な定義ってめんどくさいね。だけど、大事なことは大体めんどくさいんだってさ...。))

で、上記のような意味のない関数では、なかなか腑に落ちないので以下。

```c++
int main()
{
   int arr[] = {1,3,4,5,6,7};
   
   //これは高階関数になってる
   std::sort(std::begin(arr)
             , std::end(arr)
             , [](int a, int b){return a > b; });

   //　ログで確認
   for(const auto &n : arr)
   {
      std::cout << n << std::endl;
   }
    return 0;
}
```
DNSを切り替えた時の問題と対応

先日、DNSを お名前.com から Route 53 へ切り替えた時の
問題と対応メモ。

# DNSを切り替える
1. AWS > Route 53 で Hosted Zone を作成する
2. NSレコードの AWSDNS 4種 をお名前.comで設定する
3. nslookupコマンドで、DNSの切り替わりを確認する

```txt:コマンド例
$ nslookup -type=ns hogehoge.com
Server:		192.168.11.1
Address:	192.168.11.1#53

Non-authoritative answer:
hogehoge.com	nameserver = ns.awsdns.org.
hogehoge.com	nameserver = ns.awsdns.co.uk.
hogehoge.com	nameserver = ns.awsdns.com.
hogehoge.com	nameserver = ns.awsdns.net.

Authoritative answers can be found from:
ns.awsdns.org	internet address = ○○○.○○○.○○○.○○○
ns.awsdns.org	has AAAA address ××××:××××:××××:××××::×
ns.awsdns.co.uk	internet address = △△△.△△△.△△△.△△△
ns.awsdns.co.uk	has AAAA address □□□□:□□□□:□□□□:□□□□::□
ns.awsdns.com	internet address = ■■■.■■■.■■■.■■■
ns.awsdns.com	has AAAA address ▲▲▲▲:▲▲▲▲:▲▲▲▲:▲▲▲▲::▲
ns.awsdns.net	internet address = ●●●.●●●.●●●.●●●
ns.awsdns.net	has AAAA address ＊＊＊＊:＊＊＊＊:＊＊＊＊:＊＊＊＊::＊
```

# サブドメインを設定する
Route 53 にて、api.hogehoge.com へのアクセスで
指定したALBへ繋がるようにAレコードを作成する

# 設定の翌週に確認すると
先日、nslookupコマンドでDNS切り替わりを確認できたにも関わらず、
今回は確認できず。。

```txt:コマンド例
$ nslookup -type=ns hogehoge.com
Server:         192.168.11.1
Address:        192.168.11.1#53

** server can't find hogehoge.com: NXDOMAIN
```

また、ブラウザで api.hogehoge.com へアクセスすると、
以下のエラーが表示されました。

```
ERR_NAME_NOT_RESOLVED
```

名前解決できていない！

# 対応と原因の切り分け
Route 53 の設定が間違っているのかと思い、
Hosted Zone を作り直すところからやりましたが特に変わらず。
ググったり色んな方に相談しましたが、設定は特に問題なさそうとのこと。

また、サブドメインで設定したALBのエンドポイントに対して直接アクセスすると、
アプリケーションの画面は確認できました。
（アプリケーションの問題ではない。ドメインの問題？）

# お名前へ問い合わせ
ドメインの認証が完了していないとの返答をいただきました..。
ドメイン登録された先方に再度メール確認依頼して添付のURLへアクセスしていただき、
約30分程度で api.hogehoge.com へアクセスできるようになっていました。
（爆速！10分程度で返答が返ってきました！）

nslookupコマンドでも問題ないことを確認しました。

```txt:コマンド例
$ nslookup -type=ns hogehoge.com
Server:		192.168.11.1
Address:	192.168.11.1#53

Non-authoritative answer:
hogehoge.com	nameserver = ns.awsdns.net.
hogehoge.com	nameserver = ns.awsdns.org.
hogehoge.com	nameserver = ns.awsdns.co.uk.
hogehoge.com	nameserver = ns.awsdns.com.

Authoritative answers can be found from:
```

# 結論
* DNSは切り替わっていた
* ドメインのメール認証が完了していなかった為、ドメイン利用に制限がかかっていた
    * ドメイン登録は先方が行なっており、こちらで状況を把握できていませんでした
    * ドメイン登録含め、丸ごとこちらで請け負うべきと思いました
ゲームAIの勉強に有用なオープンソースソフトウェア

昨今のAIブームによりゲームAIの情報も得やすくなってきましたが、プレイヤーを追うといった入門書にあるような簡単なロジックを組めるようになった後、実際の製品で使われているようなもう少し高度な技術に挑戦しようとしたときに参考になるソースコードがなくて困っている人も多いのではないでしょうか。
そこで、初級者から中級者へのステップアップに役立つオープンソースのソフトウェアを集めてみました。名前の右についている★は難易度を表しています。なお、難易度は「ソースコードを読んで中身を理解する」という点でつけています。

このページの内容は随時更新します。

# 意思決定

## Behavior Tree Starter Kit ★
https://github.com/aigamedev/btsk

最近のゲームAIの意思決定ではデファクトスタンダードになってきているビヘイビアツリーの簡易実装です。ゲームAIの技術に関する書籍である Game AI Pro に掲載されているビヘイビアツリーの解説記事向けに作成されました。記事は無料で公開されています。（英語）
http://www.gameaipro.com/GameAIPro/GameAIPro_Chapter06_The_Behavior_Tree_Starter_Kit.pdf

## lua_planner ★
https://github.com/yhase7/lua_planner

AI自身に戦略や行動計画を立てさせる自動計画の技術の一種であるSTRIPS（GOAP）とHTNプランニングの簡易実装です。アカウントを見ていただければわかりますが、これは私が作ったものです。手前味噌ですみません（汗）

# ナビゲーション

## Recast ★★★
https://github.com/recastnavigation/recastnavigation

海外のAAAタイトルでも使用されている超メジャーなナビゲーションメッシュのライブラリです。どこの開発スタジオでもこのライブラリをベースに独自に拡張したライブラリを社内に持っていることが多いです。ちなみに、UE4やUnityもエンジン内部ではナビメッシュの生成やパス検索等にこれを使用しています。事前知識なしにいきなりソースコードを読んでもちんぷんかんぷんになるので、ゲームエンジンで触ってみるなど知識を入れてから読むことをお勧めします。

## ORCA ★★
https://github.com/snape/RVO2

エージェントがほかのエージェントなどの動的障害物を避けるように制御する衝突回避アルゴリズムの一種です。元論文と一緒に読むと理解が進みます。

# 全般（ゲームエンジン）
ロイヤリティの支払いが必要だったりするので厳密にはオープンソースとは言えないですが、無料でソースコードを閲覧でき、個々のAI技術やAI以外の要素をどのように連携させればいいかの勉強に役立ちます。

## Unreal Engine 4 ★★★
https://github.com/EpicGames/UnrealEngine
ソースコードを取得するには登録（無料）が必要です。

言わずと知れた超有名な商用ゲームエンジンです。AIの機能に関しては潤沢というわけではありませんが、必要最低限のものは揃っている感じです。ただ、業界標準から少し外れたカスタマイズや設計が入っている箇所があったりするのでそこだけは要注意。

- BehaviorTree
- NavigationSystem (NavMesh, Path Following, Collision Avoidance, Crowd, Flow Field, etc...)
- AIPerception
- Environment Query System (EQS)
- AITask
- GenericTeamId
- Gameplay Debugger
- HTN Planner (Plugin, 4.20時点では初期実装レベルで実際に使用するには機能不足)

## CRYENGINE / Lumberyard ★★★
CRYENGINE : https://github.com/CRYTEK/CRYENGINE
Lumberyard : https://github.com/aws/lumberyard

昔から最先端の技術をいち早く取り入れて成長してきたゲームエンジンです。AIに関しても商用ゲームエンジンの中では一歩先を行ってます。でも最近はあまり元気がない印象。ゲームエンジン全体での先進性を考えるとCRYENGINEがベースになっているLumberyardを見たほうがいいかも。

- Modular Behavior Tree
- Multi-Layer Navigation Mesh
- Movement System
- Sensory System
- Tactical Point System (TPS), Universal Query System (UQS)
- Smart Objects
- Factions
- AI Communication
- AI Bubbles System
- Procedural Animation
    - Motion Warping
httpsのドメインをプロキシしてlocalhostとして使えるようにする設定

# 概要

ローカル開発環境で、ブラウザで動くものを作ろうとすると、クロスドメイン制約に引っかかり、データの取得ができない場面があります。

Apacheを使って、開発環境のドメイン(localhostなど)で呼び出せるようにできます。


# 設定

macOSの場合のApacheのモジュール追加 ( /etc/apache2/httpd.conf )

```apache
# コメントアウトされているので外す
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
```


それぞれの環境のapache confに追記

```apache
<VirtualHost *:80>
    SSLProxyEngine On
    RewriteEngine On
    RewriteRule ^/proxy_path/(.*)$ https://domain/$1 [P,L]
    Header add Access-Control-Allow-Origin "*"
</VirtualHost>
```

設定の読み込み後、http://localhost/proxy_path/ 等で開けるようになりました。
サーバ管理・監視サービスMackerelでHerokuを監視する

# サーバ管理・監視サービスMackerelでHerokuを監視する

## はじめに

[Mackerel Help](https://mackerel.io/ja/docs/entry/advanced/monitoring-heroku)を見るとHerokuの監視もできるようだったので導入してみました。



## Mackerel側の設定

### ■ そもそもMackerelとは？

- 株式会社はてなが提供するSaaS型監視サービス

### ■ Mackerel側の設定

1. [Mackerel Sign Up](https://mackerel.io/signup)にアクセスして登録する
2. Mackerelにログイン
3. [APIキー]画面で`APIキー`をメモ
4. [Services]→[サービスを追加]で任意名のサービス(hogehoge)を追加
5. [Services]→[サービス名(hogehoge)]→[ロールを追加]で任意名のロール(test)を追加



## Heroku側設定

- 1: Procfileの編集

   ```shell
   - web: bin/hubot -a slack
   + web: ./start.sh
   ```

- 2: start.shの新規作成

   ```shell
   #!/bin/sh
   set -x
   # install mackerel-agent
   mackerel_agent=/app/mackerel-agent/mackerel-agent
   mackerel_agent_conf=/app/mackerel-agent/mackerel-agent.conf
   
   cd /app/ && \
     curl -O http://file.mackerel.io/agent/tgz/mackerel-agent-latest.tar.gz && \
     tar xvfz mackerel-agent-latest.tar.gz
   sh << SCRIPT
   cat > $mackerel_agent_conf <<'EOF';
   pidfile = "/app/mackerel-agent/mackerel-agent.pid"
   root = "/app/mackerel-agent"
   apikey = "${MACKEREL_API_KEY}"
   roles = [ "${MACKEREL_ROLES}" ]
   EOF
   SCRIPT
   trap "$mackerel_agent retire -conf $mackerel_agent_conf -force" TERM
   $mackerel_agent -conf $mackerel_agent_conf -v &
   
   bin/hubot -a slack
   ```

  最終行はProcfileで削除した起動コマンドを記入。
   ※ただし`web:`は削除

- 3: Herokuにソースコードをデプロイ

- 4: 環境変数をHerokuに追加

     - Web経由でHerokuにログイン

     - [app name]→[Setting]→[Config Vars]で環境変数を設定
        `MACKEREL_API_KEY`： MackerelのAPIキー

        `MACKEREL_ROLES`： Service名:ロール名




## 動作確認

上記設定が正常の場合、Mackerel側で監視データが取得できるようになっている

<img width="1136" alt="2018-09-08_23.57.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/278224/ddc48b1c-8098-80b5-cfe5-171c7fe9961b.png">
データサイエンス初心者のメモ[2日目]

#概要
[前回](https://qiita.com/kawaiy/items/e45373e346ffba347f95)に引き続き2回目です．
同様，いただいたデータをいじっていきます．
#やってみた
- 前回作成したヒートマップに続いて散布図行列を作成してデータを可視化していきます．

```python
from pandas.tools.plotting import scatter_matrix
scatter_matrix(droped_data)
plt.show()
```

ヒートマップと散布図行列から目的変数と相関のある特徴がいくつかあることがわかりました．

- その特徴から新しい特徴を作ることができそう →　新しい特徴作成

```python
droped_data['C'] = (droped_data['A'] + droped_data['B'] ) / 2
#　ここの処理はデータ依存です，今回は単純にAとBの平均を新しい特徴としました．
```
- この新しい特徴で目的変数が説明できるのでは...と思い，ランダムフォレストにつっこむことに　まずは学習データの準備から

```python
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestRegressor

train_X = df_new.drop(['D','E'],axis=1) # 説明変数:今回はいらないものをのぞいた全てを入れました
train_y = df_new.X # 目的変数，:予想する特徴

X_train, X_test, y_train, y_test = train_test_split(
        train_X,train_y, test_size=0.2, random_state=0)

```
train_test_splitは，scikit-learnで用意されているデータセットを分割するメソッドです．
第1引数に入力データ,第2引数に正解ラベルの配列を渡します．
引数test_sizeではテストデータの割合を0.0～1.0の実数で指定できます．(今回の場合はtrain:test=8:2としました) 
分割の比率は学習：テストデータを2:1がよく用いられる?? (参考:[はてなブログ](http://labs.septeni.co.jp/entry/2017/07/10/145448))
引数random_stateでは分割に使用する乱数のシード値を固定できます．

- 準備もできたので，早速ランダムフォレストへ

```python
rf_reg = RandomForestRegressor(n_estimators=10)
rf_reg = rf_reg.fit(X_train, y_train)
```
今回は回帰問題なのでRandomForestRegressor()を使用しました．
分類問題であればRandomForestClassifier()に変更で解決??(試していません...)
インスタンスを定義して，fitするだけなんてとっても簡単ですね！

- trainとtestの精度を確認します．

```python
print(rf_reg.score(X_train,y_train))
print(rf_reg.score(X_test,y_test))
```
あれどっちも良すぎるなあ...??
<img width="477" alt="スクリーンショット 2018-09-08 23.59.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/227625/967bdc81-c2f1-c406-2c6c-1507679cb0d6.png">

やはり欠損値は落としただけでなくて，適切に埋めなければいけないですね...

#まとめ
今回はデータをとりあえずランダムフォレストに入れてみました．
やはり実データは欠損値が多く，適切な補完が必要だということがわかりました．
次回は補完方法について勉強していきます．
後輩が「[前処理大全](https://www.amazon.co.jp/%E5%89%8D%E5%87%A6%E7%90%86%E5%A4%A7%E5%85%A8%EF%BC%BB%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AESQL-R-Python%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%EF%BC%BD-%E6%9C%AC%E6%A9%8B-%E6%99%BA%E5%85%89-ebook/dp/B07C3JFK3V)」という本を紹介してくれたので，併せて読んで勉強していきたいと思います．

##環境
- Python 3.6
- pandas 0.20.3
- scikit-learn 0.19.1

##最後に
データサイエンスもQiitaも初心者のため，間違っている箇所，おかしい箇所があると思います．
お気付きの方はご指摘いただけると幸いです．
docker pull で unauthorized: incorrect username or password と出た時

MySQLの実行環境を作ろうと思ってdocker pullしたら下記のようなエラー。

```terminal
$ docker pull mysql:5.7
Error response from daemon: Get https://registry-1.docker.io/v2/library/mysql/manifests/5.7: unauthorized: incorrect username or password
```

どうやらdocker loginしないといけないようです。

```terminal
$ docker login
Authenticating with existing credentials...
Stored credentials invalid or expired
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (******@gmail.com): DockerHubのユーザ名
Password:
Login Succeeded
```

再度実行して無事pullできました

```
$ docker pull mysql:5.7
5.7: Pulling from library/mysql
...略
Status: Downloaded newer image for mysql:5.7
【swift】 1から100万未満の素数の和をエラトステネスの篩とfilter関数を使って求める。

先日、
[【swift】 1から100未満の素数の和をforを使わずに求める。](https://qiita.com/BMJr/items/92acef984200c116fc9c)
というタイトルで投稿いたしました。
たくさんのコメントを頂き、ありがとうございました。
今回は、 1から100万未満の素数の和をエラトステネスの篩とfilter関数を使って求めました。

```swift
        let n = 1000000 //自由に変更してください。
        let sqrtN = Int(sqrt(Double(n)))
        var baseArray = Array<Int>(2 ... n)
        var primeArray = [Int]()
        while baseArray[0] <= sqrtN {
            let firstPrime = baseArray[0]
            primeArray.append(firstPrime)
            baseArray = baseArray.filter{$0 % firstPrime != 0}
        }
        primeArray = primeArray + baseArray
        let sum = primeArray.reduce(0, +)
        print(sum)
```
print結果は、
37550402023
となります。（37550402023自体も素数です！）
計算時間は3.7秒でした。

n = 1000万にすると、総和は3203324994356で、計算時間は72秒、
n = 1億では、総和は279209790387276で、計算時間は1569秒でした。
（環境：MacBook Pro, 2018, 2.3GHz Intel Core i5）

解説：
baseArray: 2からnまでの全ての整数の配列です。
primeArray: 素数を集める配列。最初は空の状態です。
1. firstPrime: baseArrayの最初の数で、初めは「2」です。
2. primeArrayにfirstPrime (=2) を収納してから、
3. baseArray = baseArray.filter{$0 % firstPrime != 0} で2で割り切れない数だけを集めます。（エラトステネスの篩）
4. するとbaseArrayの最初の数は「3」となり、1. にループします。

baseArrayの最初が100万の平方根 (sqrtN = 1000) になるまで繰り返します。
1000以下の素数とfilterされた1000~100万までの素数を繋げれば出来上がりです。

```swift
baseArray = baseArray.filter{$0 % firstPrime != 0}
```
上記の部分をforとifで表現しようとすると結構面倒であり、filter関数の便利さを実感します。
make cmake を知る．使う

# make cmake って？

良い感じにビルドしてくれる便利なもの、
ということは知ってるけれど使い方が分からないので調べてみたものをメモします

## Make

MakeFile に依存関係を書き，make で MakeFile のコマンドを実行してくれるもの
差分をコンパイルしてくれるらしく、どうやら賢い

## MakeFile のフォーマット

```MakeFile
.PHONY: ターゲット
ターゲット : 依存ファイル
    実行コマンド
# ↑ indent する
```

で，このターゲットをタスクターゲットとも呼ぶらしい．

```
$ make [ターゲット]
```
で実行

※ .PHONY とは
タスクターゲットを宣言するもの
>しかし，もしタスク名と同名のファイルやディレクトリがあると混乱しますので，.PHONYは積極的に書くようにしましょう．

ということがあるらしい

## いろいろなルール

タスクターゲットは，`依存ターゲット` を複数持つことができる．
が，ちょっと文章を読んだだけでは少し理解が難しかった．

それなりにややこしそうだし，cmake の方が扱いやすいと書いてあったので，`make` はまた余裕があるときに，追記しようと思う．（目的が，cpp コンパイルのためもある）

## CMake

make でいう MakeFile は `CMakeLists.txt`  になります．

```
# CMakeのバージョンを設定
cmake_minimum_required(VERSION 2.8)
# プロジェクト名と使用する言語を設定
project(test_cmake CXX)
# a.outという実行ファイルをmain.cppとhello.cppから作成
add_executable(a.out main.cpp hello.cpp)
```
とりあえず，これで，実行できるらしいでございます．

そして，ライブラリを作成するには...

```
# 静的ライブラリ
cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)
# hello.cppとgood_morning.cppをコンパイルして静的ライブラリlibgreetings.aを作成
add_library(greetings STATIC hello.cpp good_morning.cpp)
# a.outという実行ファイルをmain.cppから作成
add_executable(a.out main.cpp)
# a.outを作成する際にlibgreetings.aをリンク
target_link_libraries(a.out greetings)
```

```
# 共有ライブラリ
cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)
# hello.cppとgood_morning.cppをコンパイルして共有ライブラリlibgreetings.soを作成
add_library(greetings SHARED hello.cpp good_morning.cpp)
add_executable(a.out main.cpp)
# a.outを作成する際にlibgreetings.soをリンク
target_link_libraries(a.out greetings)
```

`cmake` を使うときは，`build` ディレクトリ以下で行ったほうが管理が楽になるみたいです


## ソースファイルが，複数のディレクトリをまたいでいるとき

ディレクトリごとにコンパイル．ライブラリの作成みたいなフローになるのでしょうか．

cmake では，ディレクトリごとに `CMakeLists.txt` を作成

```/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)
# サブディレクトリを登録
add_subdirectory(src)
add_subdirectory(test)
```


``` /src/CMakeLists.txt

add_library(greetings SHARED hello.cpp good_morning.cpp)

```
``` /test/CMakeLists.txt

add_executable(a.out main.cpp)
# a.outをコンパイルする際に/srcをインクルードファイルを探すパスとして登録
target_include_directories(a.out PUBLIC ${CMAKE_SOURCE_DIR}/src)
target_link_libraries(a.out greetings)

```

※正直なところ，コピペをさせていただいているだけで全然理解できていないです．cppを学習して，実際に使ってみて更新していきます．





## 参考

### make

https://qiita.com/thaladabar/items/1f72a3359acb5cf7428e
http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make/rule.html

### cmake
https://qiita.com/shohirose/items/45fb49c6b429e8b204ac
Windows のローカルユーザーをコマンドで有効化する

某所の課題で「事前に作成しておいたローカルユーザーを、普段は無効にしておいて、特定のタイミングで有効化したい。リモートで半自動化するからコマンドで。」という要望があったので、さらっと調べてみました。

## 環境

* Windows Server 2016

※とはいえ、後述のコマンド (net user) は、たいていの Windows OS では動作するハズです。

## net コマンドでやる

net コマンドの user コンテキストで、さらっとできます。

```text

> net user test01
ユーザー名                           test01
...
アカウント有効                       No
...
コマンドは正常に終了しました。

> net user test01 /active:yes
コマンドは正常に終了しました。

> net user test01
ユーザー名                           test01
...
アカウント有効                       Yes
...
コマンドは正常に終了しました。

```

＃ところで、net コマンドの公式リファレンスを探したけど、全然情報が見つからなかった…

## PowerShell でやる

PowerShell だと、[Enable-LocalUser コマンドレット](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.localaccounts/Enable-LocalUser?view=powershell-5.1)でできました。

```powershell

> Get-LocalUser -name test01

Name   Enabled Description
----   ------- -----------
test01 False

> Enable-LocalUser -Name test01
> Get-LocalUser -name test01

Name   Enabled Description
----   ------- -----------
test01 True

```

なお、上記の通り、ローカルユーザーの情報取得は [Get-LocalUser コマンドレット](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.localaccounts/get-localuser?view=powershell-5.1)で実施できます :wink:
DNSの勉強ノート【その2】A/CNAME/NS/MXレコード

## はじめに

- 前回までのあらすじ
   - [DNSの勉強ノート【その1】 名前解決](https://qiita.com/RyomaTaniyama/items/0a05316c5e1b4308af8e)

- 今回の内容
  - ネームサーバ
  - ゾーン
  - リソースレコード

## ネームサーバとゾーン

- DNSの下で、ドメインはそれぞれネームサーバを持つ。
- ネームサーバは、以下の情報を管理する。
   - 直下の **ホスト名** とその **IPアドレス** との対応
   - **サブドメイン** と、その **ネームサーバのIPアドレス** との対応

- ネームサーバが管理する情報をゾーン情報という。
- ドメインはネームサーバを書き換えることにより、ドメイン名前空間の一部を書き換えることができる。
- つまりゾーン情報とは、**あるドメインがドメイン名前空間に対してAuthorityを持つ範囲** といえる。
- FQDNからホストのIPを特定するとき、rootドメインから始まりFQDNの後ろから前へ順にドメインのネームサーバに問い合わせる。
- ネームサーバがダウンするとDNSによる問い合わせが出来なくなる。そのため、耐障害性を高めるためにドメインには通常2つ以上のネームサーバが配置される。
- ネームサーバに問い合わせるクライアントを **リゾルバ** といい、通常はOSの機能として提供されている。

## リソースレコード

- ネームサーバが管理するドメイン情報の1レコードを、 **リソースレコード** と呼ぶ。
- リソースレコードを構成する代表的なカラムは以下の通り。
   - **名前**（ホストやサブドメインの名前）
   - **タイプ**（リソースレコードのタイプ。後述）
   - クラス（基本的に`IN`） 
   - TTL, Time To Live（クライアントにおいて情報がキャッシュされる時間。単位は秒）
   - **RDLength**（RDATA列の長さ。単位はオクテット）
   - **RDATA**（リソースレコードの値。 **タイプ** によって異る）
- 以下では、代表的なタイプであるA, CNAME, NS, MXについて触れる。 

### Aレコード

- **A (Address)** レコードとは、ホスト名とIPアドレスの対応を表すリソースレコード。

![a_record.png](https://qiita-image-store.s3.amazonaws.com/0/288168/b2dd0e7b-070b-bb17-12f0-4b00e6f8fe1a.png)


- **DNSラウンドロビン** では、ネームサーバに **同じ名前・異なるRDATAを持つ2つ以上のAレコード**を登録しておき、リクエストの都度、順番に異なるAレコードをレスポンスする。

### CANAMEレコード

- **CNAME (Cannonical Name)** レコードとは、ホストに別名を付けるリソースレコード。
- あるホストに複数の名前を付けたい（e.g. 1台のサーバをwebサーバ兼ftpサーバとして機能させたい）ときに使う。
- **RDATAカラムで他のAレコードを指定** することでIPアドレスを引いてくる。

![cname_record.png](https://qiita-image-store.s3.amazonaws.com/0/288168/25be04c2-e2e3-b081-3ef0-f372c7a6956f.png)

### NSレコード

- **NS (Name Server)** レコードとは、ドメインのネームサーバを示すリソースレコード。
- ドメイン自身、及びサブドメインのネームサーバを記述する。

![ns_record_1.png](https://qiita-image-store.s3.amazonaws.com/0/288168/e3701da0-813a-e9c3-d7b5-8295605dadd0.png)

- サブドメインの管理は、**サブドメインに権限移譲** することができる。

![ns_record_2.png](https://qiita-image-store.s3.amazonaws.com/0/288168/ed36b8c6-eee3-a0da-c2c9-7d5080ee82c0.png)

- 「ドメイン名前空間に`huniv.ac.jp.`を登録する」ということは、「JPRSが管理する`ac.jp.`のネームサーバにCNAMEレコードとAレコードを登録してもらう」ということ。

![ns_record_3.png](https://qiita-image-store.s3.amazonaws.com/0/288168/5eb1fc2f-4fcf-3667-7178-e3dbed090659.png)

### MXレコード

- **MX (Mail Exchange)** レコードとは、ドメインのメール交換サーバを示すリソースレコード。
- ドメインは **メール交換ホスト** を設定し、メール交換ホストからメールボックスのあるサーバへメールを転送する（メール交換ホストを経由させることにより、メールサーバ停止時もメールアドレスを変えずにメールサービスを利用することが可能）。
- 複数のMXレコードに対して優先順位を指定することが可能であり、耐障害性を高めることができる。

![mx_record.png](https://qiita-image-store.s3.amazonaws.com/0/288168/c0444833-0b9f-877d-c811-41f67afe69c7.png)

## つづく

[DNSの勉強ノート【その3】フルサービスリゾルバとコンテンツサーバ](https://qiita.com/RyomaTaniyama/items/fc1641393ed654217a90)

## 参考文献

- 網野衛二 (2009) 『3分間DNS基礎講座』 技術評論社
- 竹下隆史・村山公保・荒井透・苅田幸雄 (2012) 『マスタリングTCP/IP 入門編』 オーム社
- 長橋賢吾 (2009) 『これならわかるネットワーク　インターネットはなぜつながるのか？』 講談社
Addressable AssetsでAssetBundleっぽいことしてみた

# はじめに
[前回](https://qiita.com/majimeneko/items/3ca053ce1d69559f8a22)で導入したAddressable Assetsを利用して、AssetBundleっぽい運用方法を試してみたいと思います。

# 使用したバージョン
Unity 2018.2.3f1
Addressables System 0.2.2 - preview

# 前回の状態
下記2点ができている状態だと思います。

* Addressablesウィンドウの`Default Local Group`にアセットが登録されている。
* 文字列かAssetReferenceにてアセットが読み込める。

![addressable-assets3.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/67d79a91-e12d-7dd7-cd62-9da0f5bc0c13.jpeg)

# アセットバンドルを作成する
まずは、Addressable Assetsのプレイモードを切り替えます。
デフォルトでは、Virtualになっていると思いますが、これをPackedへ変更します。

![change-play-mode.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/d1076a14-fac0-0ad0-1c58-953234fd85ae.jpeg)

エディタで実行する際にアセットバンドルがビルドされます。
Buildボタンは、まだ未実装なため常に押せない状態になっています。
ビルド先は、AddressablesウィンドウにてDefault Local Groupを選択すると詳細部分に表示されます。

![build-path.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/c16e6d1c-3386-9c04-00bf-6138c3d08761.jpeg)

デフォルトで設定されている`Assets/StreamingAssets/com.unity.addressables/[BuildTarget]`は、エディタでの実行時に作成され、終了時に削除されます。

BuildPathやLoadPathを変更するとビルドしたデータの保存先や読み込み元を変更することができます。
BuildModeでは、一つのAssetBundleにまとめるか、分割するか選ぶことができます。
現在のバージョンでは、変更していてもアセットのビルドの後に設定がデフォルトのLocalBuildPath、LocalLoadPath、Pack Togetherに戻ってしまいます。

![select-load-path.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/94f04daa-e2fd-24e9-eb63-eece8bb1d2be.jpeg)

また、Profile: Defaultというメニューから`Manage Profile`を選択すると、AA Profilesウィンドウが表示され、Profileを切り替えたりすることができます。

![aa-profiles-window.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/4145cae3-654a-450d-6b27-8046e5c2f52a.jpeg)

Manage Profile listボタンからProfileの管理をすることができます。
Add Entry/Remove Entryで項目を増やしたり、減らしたりすることができます。

# まとめ
* プレイモードを`Packed`へ変更する。
* エディタでの実行時にAssetBundleがビルドされる。（ビルドボタンは未実装。）
* Default Local Groupなどに設定されているLocalBuildPathやLocalLoadPath、BuildModeでAssetBundleの読み書きや設定を変更できる。
* 上記の設定はエディタでの実行時にデフォルト値に戻る。

サーバーを立てる知識がなく、実際にAssetBundleを配置してダウンロードしてみるなどはできませんでした。
しかし、なんとなくAssetBundleを作成するイメージができたと思います。

# 番外編（一応こんなこともできるよAddressables）
* Addressables.ReleaseAsset: アセットを開放する。
* Addressables.Instantiate: プレハブをシーン状に生成する。
* Addressables.ReleaseInstance: GameObjectを開放する。
* Addressables.LoadScene: シーンを読み込む。
* Addressables.UnloadScene: シーンを破棄する。
* Addressables.PreloadDependencies: 関連するAssetBundleをロードする。

元々のAssetBundleでできていたことは一通りできそうです。
関連ファイルを読み込んでおくメソッドがあるため、どのアセットバンドルにアセットがあるかなどはあまり気にしないでも良さそうでした。
またキャッシュの削除に関しては、今まで通りにキャッシュのAPIを利用することになりそうです。

# 参考
[Addressable Assets Systemを完全に理解する - Qiita](https://qiita.com/k7a/items/b4fd298bcb64dc968ad1)
bubble builderでAPIを使用

bubble builderでAPIを使用したいと思っています。

プログラミング初心者です。

https://make.dmm.com/print/developer/creator/reference/

でgetで情報を取得はできたのですが、

postの使い方がわかりません。

postとはなんでしょうか？？？

途中まではなんとかできている気はするのですが、、、

headerにContent-Type、application/jsonを入力して

あとはBody (JSON object, use <> for dynamic values)のみだと思います。

bubbleで下記の物を作りました。

https://using-api.bubbleapps.io/version-test?debug_mode=true

postmanを使えばいいのでしょうか？？？

お願いします。
JenkinsをApache経由で表示する

# はじめに
業務でJenkinsを使用しているのですが、「**ポートって8080じゃないとダメなの？**」と言われ、「**確かに8080である必要は・・・ない**」という話になりました。
そこで、80ポートで表示してみようというところからApache経由で表示するにはどうしたらいいのだろうと考え、この機会に「**Apache経由でJenkinsを表示しようぜ**」ということになりました。

### セットアップ環境
セットアップの環境は次のとおりです。

| 分類   |  項目 | バージョン |
|:-------|-------|----------:|
|OS      | CentOS   |7.3 |
|MW      | httpd | 2.4.6 |
|MW      | Jenkins | 2.140 |
|MW      | OpenJDK | 1.8.0_181 |

# Jenkinsのセットアップ
Jenkinsをセットアップします。セットアップはyumで行います。
yumでインストールするためにJenkinsのリポジトリを取得する必要があります。

```
# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
# yum install jenkins
```

Javaがインストールされていなければ、Javaのインストールが必要です。

```
# yum install java
```

Jenkinsのサービスを起動します

```
# systemctl start jenkins
# systemctl enable jenkins
```

Webブラウザから "http://IPアドレス:8080" にアクセスします。
画面に表示される内容に従って、設定を行います。

# リバースプロキシの設定をする
JenkinsのURLを変更します。

```
# vi /etc/sysconfig/jenkins
・・・・
#以下の行を修正
JENKINS_ARGS="--prefix=/jenkins”
・・・・
```

httpdをインストールします。

```
# yum install -y httpd
```

リバースプロキシの設定をします

```
# cat /etc/httpd/conf.d/jenkins.conf
ProxyPass           /jenkins http://localhost:8080/jenkins nocanon
ProxyPassReverse    /jenkins http://localhost:8080/jenkins
ProxyRequests       Off
AllowEncodedSlashes NoDecode

<Proxy http://localhost:8080/jenkins*>
  Order deny,allow
  Allow from all
</Proxy>
```

httpdを起動します

```
# systemctl start httpd
# systemctl enable httpd
```

Webブラウザから "http://IPアドレス:8080" にアクセスします。
Jenkinsにログインし、Jenkinsの管理をクリックします。
管理画面からシステムの設定をクリックします。
JenkinsのURLを "http://IPアドレス:8080/jenkins" に変更します。

Jenkinsを再起動します。

```
# systemctl restart jenkins
```

Webブラウザから "http://IPアドレス/jenkins" にアクセスし、Jenkinsの画面が表示されれば、設定は完了です。

# 注意点

リバースプロキシの設定をする中で、私がぶつかった問題を下記にまとめます。

### SELinuxが有効だとJenkinsが表示されない

"http://IPアドレス/jenkins" にアクセスするとJenkinsの画面が表示されない場合があります。
その時は、SELinuxが有効になっている可能性があるので、SELinuxを無効にしてみましょう。

```
# setenforce 0
# getenforce 
Permissive
# systemctl restart httpd
```

### Jenkinsにアクセスするとリバースプロキシの設定がおかしいと怒られる。
Jenkinsの管理をクリックすると、
「**リバースプロキシの設定がおかしいようです**」とアラートが出ていました。
下記のURLの記事の通り、JenkinsのURLを "http://IPアドレス/jenkins" に変更したらアラートは
出なくなりました。
[「Jenkins says my reverse proxy setup is broken」でもう一つ確認すべき場所](https://qiita.com/amedama/items/a15c2055b80c9dcc7ed1)

# まとめ
Jenkinsのページにも簡単にまとめられていたので、簡単にリバースプロキシを設定することができた。
リバースプロキシ自体の設定も複雑なものではないので、また機会があれば設定してみようと思いました。

# 参考記事
[「Jenkins says my reverse proxy setup is broken」でもう一つ確認すべき場所](https://qiita.com/amedama/items/a15c2055b80c9dcc7ed1)
[Apache モジュール mod_proxy](http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html)
ウムラウトの文字化け

# 現象
ドイツ語などで使われるウムラウト (umlaut) など、発音区別記号付きのアルファベット1文字が2文字に文字化けして表示される。例えば、地名の Kärnten が KÃ¤rnten になってしまう。

その他の大半のアルファベットは文字化けしないため気付きにくいようだ（実際、"KÃ¤rnten" でググると文字化けしているサイトが沢山出てくる）。

今回はJavaで画像のexifメタデータを読み書きする際にこの問題が起きた。

# 原因
```UTF-8``` として保存した文字列を ```ISO-8859-1``` として読み出してしまっているため。

以下、[Java REPL](http://www.javarepl.com/term.html)での実行例を載せる。

```java:
java> String s = new String("Kärnten")

java> byte[] iso = s.getBytes("ISO-8859-1")
byte[] iso = [75, -28, 114, 110, 116, 101, 110]

java> byte[] utf8 = s.getBytes("UTF-8")
byte[] utf8 = [75, -61, -92, 114, 110, 116, 101, 110]
```

このように、"ä" は ISO-8859-1 では1バイト (```-28```) で、UTF-8 では2バイト (```-61, -92```) で表される。UTF-8 でバイト列を保存したあと ISO-8859-1 として読んでしまうと、```-61``` は "Ã"、```-92``` は "¤" として解釈されるので

```java:
java> new String(utf8, "ISO-8859-1")
KÃ¤rnten
```
というふうに化ける。

他の発音区別記号付きでも同様。例:

- ö → Ã¶
- ü → Ã¼
- Ä → Ã

# 対処
当たり前だけど、読み書き両方に正しい文字コードを指定する。

```java:
java> new String(utf8, "ISO-8859-1");
Kärnten

java> new String(iso, "ISO-8859-1");
Kärnten
```

# 参考
https://forum.httrack.com/readmsg/18923/indexhtml
[PHP] ゼロ埋め、スペース埋めとマルチバイト

# 文字列を空白で埋める
固定長の文字列を得るために、後ろをスペースで埋めたり数値を右揃えで頭をゼロで埋めたりしたい場面はあると思います。
PHPでは以下の関数を使うのがセオリーですが…

[str_pad — 文字列を固定長の他の文字列で埋める](http://php.net/manual/ja/function.str-pad.php)

```php:str_pad
$str1 = 'hogehoge';
$str2 = 'piyo';
//10桁で後ろをスペースで埋める
echo str_pad($str1, 10); //'hogehoge  '
echo str_pad($str2, 10); //'piyo      '
```

[sprintf — フォーマットされた文字列を返す](http://www.php.net/manual/ja/function.sprintf.php)

```php:sprintf
$str1 = 'hogehoge';
$str2 = 'piyo';
//10桁で後ろをスペースで埋める
echo sprintf("%-10s", $str1); //'hogehoge  '
echo sprintf("%-10s", $str2); //'piyo      '
```

# マルチバイト文字の場合
全角はもちろん、半角カナもマルチバイトなので（ちょっとハマりました…）上記の記述だと意図した結果が得られません。

```php:マルチバイト
$str1 = 'ﾎｹﾞﾎｹﾞ';
$str2 = 'ﾋﾟﾖ';
//10桁で後ろをスペースで埋められない・・・
echo str_pad($str1, 10); //'ﾎｹﾞﾎｹﾞ'
echo str_pad($str2, 10); //'ﾋﾟﾖ '
echo sprintf("%-10s", $str1); //'ﾎｹﾞﾎｹﾞ'
echo sprintf("%-10s", $str2); //'ﾋﾟﾖ '
```

対応する`mb_`シリーズの関数もないようで、どうしようかと思っていたら[マニュアルのコメント](http://jp2.php.net/manual/ja/ref.mbstring.php#90611)に素晴らしい解決策がありました。

```php
function mb_str_pad ($input, $pad_length, $pad_string=" ", $pad_style=STR_PAD_RIGHT, $encoding="UTF-8") {
    $mb_pad_length = strlen($input) - mb_strlen($input, $encoding) + $pad_length;
    return str_pad($input, $mb_pad_length, $pad_string, $pad_style);
}
```

```php:マルチバイト改
$str1 = 'ﾎｹﾞﾎｹﾞ';
$str2 = 'ﾋﾟﾖ';
//10桁で後ろをスペースで埋められた
echo mb_str_pad($str1, 10); //'ﾎｹﾞﾎｹﾞ    '
echo mb_str_pad($str2, 10); //'ﾋﾟﾖ       '
```

「文字数」カウントなので、全角文字を引数にする場合はどういう結果を得たいかによって少し手を加える必要がありますね。
ArchLinux　Redis起動方法

#ArchLinux　Redis起動方法

備忘録としてArchLinuxのredis起動方法を記述

↓下記Archwikiも参照しながら作業してください
[redis（日本語）](https://wiki.archlinux.jp/index.php/Redis)
[redis（英語）](https://wiki.archlinux.org/index.php/Redis)


##インストール
redis パッケージのインストール
※redisはAURにあるので注意、自分はyayでインストール

```
yay redis
```
yayの導入は下記記事参照
[ArchLinux　yay インストール方法](https://qiita.com/Gen_Arch/items/ad7aef73cfc5a12b4e45)

##設定
下記設定ファイルを変更

```:/etc/redis.conf 
#ip設定（デフォルト）
bind 127.0.0.1
#ポート設定（デフォルト）
port 6379

#unixソケット設定
unixsocket /run/redis/redis.sock
#ソケットのパーミッションを全て redis グループのメンバーに設定
unixsocketperm 770

#ログファイル設定
logfile /var/log/redis/redis.log
```

ソケットを保存するためのディレクトリを作成

```
sudo mkdir /run/redis
sudo chown redis:redis /run/redis
sudo chmod 755 /run/redis
```

ログファイル用のディレクトリを作成

```
sudo mkdir /var/log/redis
sudo chown redis:redis /var/log/redis
sudo chmod 755 /var/log/redis
```

##起動
```
sudo systemctl start redis
```
確認

```
$ ls /run/redis
redis.sock

$ ps aux | grep "[r]edis"
redis     9380  0.1  0.1  47176  5308 ?        Ssl  21:06   0:03 /usr/bin/redis-server 127.0.0.1:6379
```
OK
Pythonで月末日を求める

予算管理のレポートだとかで、月末日を自動算出したい場合があります。
そんなときの月末日の求め方です。

すごく単純です。relativedeltaを利用するだけだったりします。

```python
from datetime import datetime
from dateutil.relativedelta import relativedelta

print((datetime.today().replace(day=1) + relativedelta(months=1, days=-1)).date())
```

シンプルですね。
【Game a Week】５週間目

# Game A Week
1. 一週間（月曜日から日曜日）に一本ゲームをリリースする。
2. 日曜日（まで）に制作したゲームを何らかの手段で公開する。
3. 制作したゲームはGame A Weekが終わるまで改変しては行けない。

# 前置き
先週の作品：[【Game a Week】4週間目](https://qiita.com/hota1024/items/60d0be1a249389c5808c)

# 今回作ったゲーム
今回はフレンドに「次週enchant.jsやってみてよ」とDiscordで言われたので、いい機会なのでenchnat.jsを使ってゲームを作りました。

enchant.jsは初見なので簡単な「クリッカーゲーム」を作ってみました。

# 使った技術
| 名前 | 説明 |
|:-:|:-:|
| [enchant.js](https://github.com/wise9/enchant.js)  | HTML5のCanvasを使ったゲームやアプリを開発するためのフレームワーク。  |
|[LaravelMix](https://readouble.com/laravel/5.4/ja/mix.html)  | Webpackのラッパー。  |

# ゲームの詳細
名前は「ねこかんクリッカー」。
[こちら](http://game-a-week.hota1024.com/projects/NekokanClicker/)から遊べるので是非遊んでみてください。

ページを開くと以下のようにゲームが始まります。
![スクリーンショット 2018-09-08 21.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/154299/b45177a5-6110-8943-b4cd-fc56054a1b30.png)
画面中央の**猫缶をクリック**すると猫缶が増えます。
<img width="651" alt="スクリーンショット 2018-09-08 21.49.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/a25a54e7-f615-3d57-c37d-16df953386da.png">
「猫缶を「xx」個あげますか？」というボタンを押すと、猫缶を消費して猫のレベルを上げられます。

猫はレベルが上がると自動で猫缶を増やしてくれます。

ちなみにこのゲームには終わりがありません。

# 5週間目の感想
enchant.jsの感想としては少し使いづらかったですね。
理由としては
1. enchant.js自体がES6に対応していない
2. 「シーンを作ってスプライトを生成してシーンに追加する」という流れがめんどくさく感じた。
3. 円や矩形などの基本的な図形の描画機能がない

あくまで僕が感じたものなので、もしかしたら解決策があるかもしれません。
解決策を知っている方はコメントで教えていただければ幸いです。

「ソースコード見たいよー」という方はGithubのリポジトリーがあるのでぜひ見てみてください。
<https://github.com/hota1024/nekokan-clicker>

# 最後に
ここまで読んでいただきありがとうございます。
良ければアドバイスや質問よろしくおねがいします。
2018年9月第1週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■ノッチすらない真のベゼルレスのためにカメラユニットが飛び出す変態スマホ「OPPO Find X」レビュー、スマホ技術の最先端を体感してみた
https://gigazine.net/news/20180904-oppo-find-x/
開発機としてベゼルレスに近い端末を触ることはあるけれど、画面が大きいメリットよりも操作面でのデメリットが多いので正直良い印象が無い。
この端末も色々と操作面では不都合なことが多そうだし、ベゼルレスが増えてる流れとニーズは一致しているのだろうか・・・？

##■どこでもタイピングできる! ウェアラブルなキーボード「TAP」が斬新
https://techable.jp/archives/82744
パッと見は良いじゃんと思ったんだけど、文字ごとにアクションが変わるってのはすげぇ大変なんじゃ・・・。

##■言語表現に関して
世界の見方が変わる5つの言語について
https://gigazine.net/news/20150525-five-languages-change-the-way/
「I love you」は「愛してる」と訳せないという指摘
https://gigazine.net/news/20180903-love-ai/

日本語独特の感情表現、各地独自の言語表現。
日本語を使う上で自然に長けていく部分と欠けていく部分があるんだろうな。
自分自身を表す言葉が日本語は飛びぬけて多い印象なんだけど、
それも何かルーツがあるのだろうか。

##■Facebookが機械翻訳の質を劇的に向上させるAI技術を開発
https://gigazine.net/news/20180903-facebook-ai-translation/
凄いことはよく分かるんだけど仕組みがなかなかイメージできない・・・。

##■Netflixの視聴を左右する「アートワーク」はどのように生成されているのか？
https://gigazine.net/news/20180905-netflix-art-science-image-discovery/
ベストなアートワークをAIが判断するって字面以上に凄い話だな。
芸術を人工知能が理解し始めているってことだと思うので。

##■Alexa関連
プログラミング不要で、スマートスピーカーのスキルを開発できる「NOID」公開
http://www.itmedia.co.jp/news/articles/1809/04/news115.html
Alexaのためのローカル開発環境を整備する
https://thinkit.co.jp/article/15144
Alexaスキルで使える音声増やす「Amazon Polly」　日本でも開発者向けにプレビュー版が登場
http://www.itmedia.co.jp/news/articles/1809/06/news136.html

Alexa関連のサービスや記事がだんだん目に付くことが増えてきているなぁ。
ちょっと自分も手を付けていきたい。

##■エンジニアの単価について
フリーランスエンジニアの単価を決める
https://qiita.com/KazukiTanaka/items/130a2c477847b24e35ce?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
25歳初めてのフリーランスエンジニアの単価について
https://qiita.com/turmericN/items/a73d005e8bf4700bbb37?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items

スキルセット考えたらそこまで今の自分の給料ベースはずれていないのかな？
ただこれからスキルだけで見ると上げどまってしまう状態には思う。

##■セキュリティ関連
Googleのオフィスはハッキングにより解錠可能で誰でも入れる状態だったと判明
https://gigazine.net/news/20180904-google-doors-hacked/
スマホのスピーカー＆マイクを利用した音響トラッキングでロック解除の「パターン」をあぶりだす技術が登場
https://gigazine.net/news/20180906-sonarsnoop-attack/

Googleのエンジニアとはいえ1エンジニアが突破できちゃうセキュリティってどうなんだろうか。

##■マイクロソフト、手描きスケッチからHTMLコードを自動生成する「Sketch2Code」
https://m.japan.cnet.com/amp/story/35125117/?__twitter_impression=true
これは今のところはなかなか活かす機会ないけど便利そう