OmniAICreator/Qiita-1.07M huggingface dataset:
2019-01-21 大阪IT勉強会のLTで、機械学習使える Tensorflow.js や、新しい美術メディア「ARTLOGE」の話を聞いてきた！僕はQiitaプチ炎上案件や、最近のiPhone音声入力の素晴らしさについて声ガラガラで語った。


# REf

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">【大阪・梅田】WEBエンジニア式　最高の交流イベント<br>来週1/21(月)は、交流イベントです！🍻🍕<br>大阪からITを盛り上げていきましょう！<br>プログラミング初心者でも経験者でも！<br>今まで参加したことがない方！<br>ITを盛り上げていきたい方！<br><br>皆さんぜひご参加ください！🍺🤓✌️<a href="https://t.co/Hnnje56pso">https://t.co/Hnnje56pso</a></p>&mdash; 大阪IT勉強会 (@osaka_it) <a href="https://twitter.com/osaka_it/status/1086531910715600896?ref_src=twsrc%5Etfw">January 19, 2019</a></blockquote>

[【大阪・梅田】WEBエンジニア式　最高の交流イベント - connpass](https://umeda-web-meeting.connpass.com/event/113837/)

# LT そうすけさん

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">大阪IT勉強の発表を聞いてきた。JavaScriptで、クライアントサイドだけで、機械学習完了済みのデータを使って、デバイスのカメラと関連付けて遊べるらしい。学習自体はクライアントで行おうとするとめちゃくちゃ遅いけど、GPUをJavaScriptが使えるらしく、マシンパワーさえあれば学習自体も可能らしい <a href="https://t.co/gNkn8yvhbx">https://t.co/gNkn8yvhbx</a></p>&mdash; いなうらゆうま🤖LifeHAck 今日は筆談エンジニア (@YumaInaura) <a href="https://twitter.com/YumaInaura/status/1087334808374505472?ref_src=twsrc%5Etfw">January 21, 2019</a></blockquote>


# LT ARTLOGE

[アートメディア ARTLOGUE（アートローグ）は、展覧会情報やコラム、ニュースなどアートをより楽しくなるアート情報を発信しています](https://www.artlogue.org/)

- 野球観戦する人より実は美術館にのべ人数の人のほうが多いらしい、氷山の一角、ブルーオーシャンに飛び込む！
- 美術館に行く人たちのソーシャルや、VRやARや、食べログ的なやつや、総合的なサービスを作りたい
- 僕らは誰もが皆、「美術館に行く人はあまりいないだろう」と思いながら、年に1回や2回は友達に連れられるなどして、美術館を訪れている、ここにすごくギャップがありますよね、と一瞬、LT登壇者の鈴木さんと話した

[鈴木 大輔 (株式会社アートローグ 代表取締役CEO／アートイノベーター) プロフィール - Wantedly](https://www.wantedly.com/projects/238316/staffings/1008623)

# 自分のLT

- 5分間
- 資料なし、MacBookのtype-cのケーブルがなくてMacBookを借りる、不まじめな参加者
- 京都人狼会でトークをはしゃぎすぎて、声がガラガラだけど頑張った
- 今まで15分ぐらいのLTしかやったことがなかったので、一瞬で終わってしまった
- LTの「電撃」っていう意味を改めて思い出した
- LTのあとの雑談で、iPhone音声入力の素晴らしさ、Twitterやブログでの発信などについてたくさん話した

[エンジニアには国語的能力が重要だ。実は言語的能力が80%を占める文系の仕事だとさえ思える。理系的な要素だけでプログラミングが成り立つと思ったら間違えた。ロマンロランのジャンクリストフを読もう。良い小説だから。日本語や言語的なものを大いに愛そうじゃないか。僕らプログラマは。 - Qiita](https://qiita.com/YumaInaura/items/8a0cc0721ae78175bce4)

# 食事

- めちゃくちゃ出てきた
- ビールと氷結が勢揃いだった
- 参加費LT枠は1000円
- どうせサラダ余るだろ！ どんな飲み会に行ってもサラダがcompleteされたの見たことないし！ と思って低カロリーのサラダを半分無意識にひとりで食べようとしていたら、ちゃんと取り分けるように指示があった、社会人失格
- ウェハースやチキン南蛮が美味しすぎて食べすぎてしまった、2000kcalぐらいは摂取した
- Twitterのフォロワーの人がアルフォート好きだなと言っていたのを思い出していた

![image](https://user-images.githubusercontent.com/13635059/51504307-a99f7880-1e23-11e9-90d1-b85d62d93062.png)

![image](https://user-images.githubusercontent.com/13635059/51504315-ac9a6900-1e23-11e9-934d-fa3392f87268.png)

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エクセルバージョン違いのエラーに対する対処

エクセル2010で作ったマクロ入りファイル（.xlsm）をエクセル2007で使おうとするとエラーが出ることがあります。

「DLL読み込み時のエラーです。」と出ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/347301/bc7479cb-cb61-4876-9919-328485c8b485.png)

これが表示されると、保存しようとしても、「～の保存中にエラーが検出されました。いくつかの機能を削除または修復することにより、ファイルを保存できる場合があります～」というエラーが。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/347301/6001498e-634b-a86f-27ac-df6a1e4a9777.png)

こうなると保存すらできないので、なにもできない。

結論から言うと、この問題の原因は参照設定で、参照不可のライブラリにチェックが入っているからです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/347301/fb314c1d-f743-a836-e597-3d8253705ec1.png)

参照不可のものは、このライブラリが「場所」に表示されたパスに存在しないということです。じゃあ、このチェックを外せば万事解決か。しかし、チェックを外してOKを押してもエラーが出ます。どうしても変更させたくないのか。

 

対処１．配布先と同じバージョンのエクセルを使う

　配布先がエクセル2007を使っているのなら、開発側も2007を使ってマクロを作ります。

 

対処２．参照不可ライブラリのチェックを外して配布

　配布先のバージョンのエクセルが必要です。

　VBAの編集画面から、ツール⇒参照設定。参照不可となっているライブラリのチェックを外し、OKを押します。それを配布します。

 

対処３．ライブラリをダウンロードして入れる

　参照不可になっている場所にダウンロードした該当ファイルを入れてみるやり方。今回、何のライブラリがないかというと、MSWORD.OLBというやつですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/347301/7abab293-5304-ce2b-de08-231b93b327a4.png)


それをネットで検索してみる。今回のライブラリは検索でヒットして、ありました。ダウンロードして、Office14フォルダ内に入れます。……エラーが出なくなり、動きました。

 

これ以外にも最初から作り直すという方法がありますが、面倒くさそう。

エクセルだけではなく様々なところでバージョンの違いの問題は起こります。配布先がどのバージョンを使っているか、事前に確認するのが間違いがないやり方でしょう。
JavaScriptで任意の文字数の'ああああああああああああ...'文字列を作る

ユニットテストで使う。

> コメントいただいたので追記。
> これが一番シンプルでわかりやすいですね。

> ```javascript
> 'あ'.repeat(100)
> ```

```javascript
const generateStr = (num) => [...Array(num).keys()].map(() => 'あ').join('')
```

> コメントいただいたので追記。
> `fill()`を使った書き方もできるようです。

> ```javascript
> const generateStr = (num) => Array(num).fill('あ').join('')
> ```

出力結果。

```javascript
> generateStr(0)
''

> generateStr(1)
'あ'

> generateStr(100)
'ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ'
```
Ruby on Railsのしくみ

# 入門段階で学んだこと
##### 要素の繋がりが頭の中でごちゃごちゃしていたので、以下の順番でまとめてみます:point_down:
1. 各要素の役割
2. Railsが動く流れ

## 1. 各要素の役割
全体の流れを見る前に、まずは各要素が何をする場所なのかを把握します。


#### ルーティング
URLのリクエストが来た時に、どのコントローラーのどのメソッドに繋がるかを示すところ
**リクエストの行き先**を案内します。

`get　(または　post) URL => コントローラー#メソッド`

getはデータベースを参照する場合、
postはデータベースに変更を加える場合（例えば登録、削除など）という違いがあります。


#### コントローラー
リクエストに対応する処理（メソッド）を定義するところ
**アクション**を行います。

`@変数名`のように@をつけてインスタンス変数を定義し用いることで、ビューでも同じ変数を使ってコードを書くことができるようになります。


#### モデル
データベース内のデータに処理を行うところ
例えば、**保存されるデータが条件に合っているかの判断**などを行います。


#### ビュー
コントローラーで行われた処理をHTMLで可視化するところ
**ユーザに表示される画面**になります。

コントローラーのメソッド1つに対して、1つのビューが作られます。
コントローラーで定義された`@変数名`は、ビューでもそのまま使用可能です。


## 2. Railsが動く流れ

それぞれの役割がわかったところで、どのような流れで処理が行われるかを図で見ます。
ユーザから送信されたリクエストは以下のように動いていきます。

<img width="980" alt="名称未設定2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/323978/69041ac0-ce05-b3df-820f-44a46df87a17.jpeg">

1. **ルーティング**で示された道案内に従い
2. **コントローラー**でアクションを起こし
3. **モデル**の条件に従って
4. **データベース**に情報を保存・削除・編集等し
5. **ビュー**でユーザに見せる画面を作成


## まとめ
どことどこが繋がっているかが見えると、全体的な構図を理解してコードを書けると思います。
勉強中なので説明が不足している点もあると思いますが、ひとまず上記の役割と流れを把握してRailsの勉強を続けたいと思います:computer:
非公式、超簡単な.debパッケージ作成法。

自分のプログラムを、debパッケージにして配布したい場合があります。
GPL公式パッケージの手続きはソースコード付きにしなければいけないし、ソースコードを非公開にしたい場合など、non-free、プロプライエタリの一部の場合などに、
非公式にバイナリパッケージを作成する方法を、超簡単に示したいと思います。

ここでは、僕の、maneatersというゲームのバイナリを例にしています。
https://qiita.com/fygar256/items/441a3a1e8cee3d67d3e4

①fakerootのインストール
`sudo apt-get install fakeroot`

②作業用ディレクトリと、DEBIANディレクトリを作る。
`mkdir -p work/DEBIAN`

③controlファイルを作る。
`vi work/DEBIAN/control`

```
Package: maneaters
Maintainer: Mike Maekawa <fygar256@gmail.com>
Architecture: amd64
Version: 0.9-1
Description: a ncursesw game
Depends: libncursesw5
```

Package:にはパッケージ名を、
Maintainer:にはメンテナ名を、
Architecture:には依存するアーキテクチャを、
Version:には、バージョンを、
Description:には説明を、
Depends:には、依存するパッケージ名を入れましょう。

④基本的に、'work'の下の、ディレクトリ構造の様にインストールされます。
　ここでは、/usr/local/binに、maneatersを入れます。

`mkdir -p work/usr/local/bin`
`cp maneaters work/usr/local/bin`

treeしてみると、こんな感じです。

```
$ tree work
work
├── DEBIAN
│   └── control
└── usr
    └── local
        └── bin
            └── maneaters
```

⑤パッケージ作成。
`fakeroot dpkg-deb --build work .`

⑥完了。このようなファイルが出来ているはずです。
`maneaters_0.9-1_amd64.deb`
初学者が独習C#をざっくり読んでみる 第4回 -続演算子-

## 前回の復習
算術演算, 代入演算, 関係演算と追ってきた. 論理演算, ビット演算, その他と進んで次回から制御構文にいきたい

## §3 演算子(続き)
### 3.4 論理演算子
- 論理積...&& AND
- 論理和...|| OR
- 排他的論理和... ^ XOR
- 否定... ! NOT

という物たち. 集合論の本で一番最初の章に出てくる論理演算.

#### 3.4.1 ショートカット演算
論理演算の特徴は, 左オペランドの評価だけで結果が分かる場合, 右オペランドは評価されない

``` C#
var num = 1;
num==10 && num2==10 // 左辺だけでfalseが確定されるため右辺は評価すらされない
num==1  || num2==10 // 左辺だけでtrueが確定できるので右辺は(ry

// use case
if (str != null && str.StartWith("http://")
{
    Console.WriteLine("asdf");
}

```
上のケースでは本来, strがnullだった場合でメソッドを呼ぶとエラーが出るけれど, その場合は左辺のみの評価でショートカットが発生するので問題なく動作する.

### 3.5 ビット演算子

| operater | abs | ex. |
| --- | --- | --- |
| & | 論理積, 両辺に双方にセットされてるビットをセット | 10&1 -> 1010&0001 -> 0000 -> 0 |
| ｜ | 論理和. 両辺のいずれかにセットされてるビットをセット | 10｜1 -> 1010｜0001 -> 1011 -> 11|
| ^ | 排他的論理和. 両辺のいずれかでセットされており, 双方にはセットされてないビットをセット | 10^1 -> 1010^0001 -> 1011 -> 11|
| ~ | 否定. ビットを反転 | ~10^ -> ~1010 -> 0101 -> -11 |
| << | ビットを左にシフト | 10 << 1 -> 1010<<1 -> 10110 -> 20 |
| >> | ビットを右にシフト | 10 >>1 -> 1010 >> 1 -> 0101 -> 3|

正直ビット演算子あまりよくわかってないのでちゃんと勉強する.
ビット演算子は大きく分けて, ビットの**論理演算子**と**シフト演算子**の二種に分けられるのだとか.

#### 3.5.1 ビット論理演算子
二進数に直した数字を桁ごとに論理演算していくという物だった.

```plaintext
// 論理演算子
5&3を考える.

5(10) = 0101(2)
3(10) = 0011(2)

この時,

 0101
&0011
-----
 0001

となる. (桁ごとに0=false, 1=trueとみなしたANDを考える)

0001(2) = 1(10)より, 5&3 -> 1

// 否定演算子
5(10)の否定を考える

5(10) = 0101(2)

この時,

~0101
-----
 1010

ただし, 1010(2) = 10(10)より, 演算の答えは10とやりたいのはわかるが, それは間違え.

否定の演算子は, 正負を決める数値ビットの一番最初も同時に反転する.
符号が負の場合の数値の計算方法は, ビットを反転させて1を加えたものが絶対値になる...という物のため

1010 -> 0101 + 1 -> 0110 -> 6 より, ~0101 -> -6(10)
```

#### 3.5.2ビットシフト演算子
左シフト<<, 右シフト共に新しい桁を左/右に付け加えるものだった

```plaintext
// シフト演算子
10<<2を考える

10(10) = 1010(2)より, 

1010 << 2 = 1010"00"

よって, 101000(2) = 40(10)のため, 10<<2 -> 40
```

右シフトも同じだけれど, 右シフトで加えたビットの値が問題.
数値ビットの最上位は符号を表すため, 最上位の値を残すか残さないか(符号を維持するか)の話になる.

残すのを算術シフト, 残さないのを論理シフトといい, 符号有の型か符号無の型によってどちらのシフトが選択されるかが変わる

### 3.6 その他の演算子
#### 3.6.1 sizeof演算子
値型のサイズをバイト単位で取得する.

基本的にstaticにサイズが決まっている数値型のみしかこのメソッドは使えないが, unsafeモードを利用することで, 三法型を含まない構造体とポインターの賤母求められるとか.

```C#
sizeof(int) // 4
sizeof(decimal) //16

unsafe
{
    sizeof(MyStruct)
}
```

unsafe使うには, unsafeブロックでくくったうえで, プロジェクトの設定をunsafeにする必要があるらしい.

#### 3.6.2 nameof演算子
変数名のようなラベルとして使われている識別子を文字列として取得する

``` C#
int data = 1;

nameof(data) // "data"がゲットできる
```

例外処理で使えるね, みたいな話が書いてあった.

### 3.7 演算子の優先順位と結合測
#### 優先順位
優先順位があるよ.
[kwsk](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/)

#### 結合測
- 代入演算子以外の二項演算子は左結合
- 代入演算子と条件演算子は右結合

要するに, 右から評価されるかと左から評価されるかによって, 結合測()の利用は変わるよという話

---

思ったより残って多分が短かった.
次回制御構文
バーチャルホスト の設定（Amazon Linuxにて）

#背景
[先日設定したawsのlaravelの環境](https://qiita.com/outase/items/0de097cc51d1ff037bd7)で、そのままだとphpMyAdminが参照できなくなるので、バーチャルホストを設定しました。

※できるだけ無料でやりたいので、DNSはRoute 53を使わず、ムームーDNSを使用。ホントは使いたい、、、

#手順
xxx.com →　laravelサイトを参照
xxx.com/tools/phpMyAdmin →　phpMyAdminを参照

上記になるようにバーチャルホスト を設定する。

~~~
$ sudo vi /etc/httpd/conf.d/custom.conf

<VirtualHost *:80>
  DocumentRoot /var/www/test-laravel/public
  ServerName xxx.com

  #/tools で/var/www/htmlにエイリアス
  Alias /tools /var/www/html

  #test-laravel/public以下が参照されるように変更。
  <Directory "/var/www/test-laravel/public">
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
~~~

###できた
xxx.com
![test-laravel 2019-01-22 07-33-13.png](https://qiita-image-store.s3.amazonaws.com/0/336536/c7c3134b-04b2-b536-1b6d-dcf0e8d372d6.png)

xxx.com/tools/phpMyAdmin
![phpMyAdmin2019-01-22 07-31-19.png](https://qiita-image-store.s3.amazonaws.com/0/336536/c802f51f-3097-ae3a-ebf2-7ee9c3c33f30.png)

#追記
今のままだと、urlを間違った時にディレクトリー一覧が表示されセキュリティー上よくない。
![index2019-01-22 07-14-41.png](https://qiita-image-store.s3.amazonaws.com/0/336536/1d9f1ff1-43c1-aab7-92a2-eb47b8dcf30a.png)

~~~
$sudo vi /etc/httpd/conf/httpd.conf
~~~

下記のように変更

~~~
Options Indexes FollowSymLinks
↓
#Options Indexes FollowSymLinks
Options FollowSymLinks
~~~

表示されなくなりました。
![index2019-01-22 07-16-38.png](https://qiita-image-store.s3.amazonaws.com/0/336536/a5b06f85-a03a-a334-8809-8f2ecd4d4802.png)
kintone プラグイン開発メモ　その３（プラグイン設定画面にボタンをつける）

前回の続きです。
[その２](https://qiita.com/sy250f/items/d6b8cd69c66513c1f6ca)はこちら
設定画面にボタンを置いてみます。

こんな流れ

 1. config.htmlにボタンを設置
 2. config.jsにボタンが押された時にポップアップを表示するコードを作成

# 設定画面にボタンを設置

```config.html
<html>
    <body>
        <h1>Hello,world設定画面</h1>
        <div id="form">
            <button type="button" id="button_submit">押してください</button>
        </div>
    </body>
</html>
```
<img width="587" alt="スクリーンショット 2019-01-22 6.37.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/0f80a0b4-ffa8-9097-73e9-33441e7fe59f.png">

# config.jsにボタン押下時にポップアップを表示させる

```config.js
(function () {
    "use strict";
    window.addEventListener('DOMContentLoaded', function() {
        document.getElementById("button_submit").onclick = function() {
            window.alert("押しましたね！");
        };
    });
})();
```
<img width="525" alt="スクリーンショット 2019-01-22 6.37.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/216d1582-7033-b9ef-452f-8e9398be23e1.png">

次回は設定値を登録・読み込みしてみたいと思います。
GAE GOをローカルで立ち上げた時にデータが消えないようにする

GAEで開発をする場合ローカルでGAEを立ち上げて開発するわけだけど、普通に起動するとデータストアもクラウドストレージの中身もPCを再起動すると消えてしまう。

それだとあまりに開発しづらいので、GAEをローカルで立ち上げた時にデータが消えないようにする。

具体的には dev_appserver.pyで起動する時に --storage_path オプションを渡してあげれば良い。ちなみに渡すのはディレクトリのパスで、ディレクトリが存在しない場合は自動で作ってくれる。

```sh
dev_appserver.py --storage_path=./local_dir ./src/app/app.yaml --enable_sendmail
```

ちなみに起動コマンドのオプションは以下の公式ページにざっと説明がある。

https://cloud.google.com/appengine/docs/standard/go/tools/local-devserver-command?hl=ja
php-master-changes 2019-01-21

今日はドキュメントの更新、sapi/litespeed を 7.2 にする更新、エンジン/opcache の最適化、libgd の pkg-config への移行、slite3 で不要コードの削除があった！

# 2019-01-21
## weltling: Update NEWS [ci skip]
- https://github.com/php/php-src/commit/a1b1c53d1358c86182efcc4126078c2cf444633b
- [7.3~]
- NEWS の更新

## George Wang: Checkin LiteSpeed SAPI 7.2.
- https://github.com/php/php-src/commit/66d72377d0226521fef6601683054446565bbdc0
- [7.2~]
- sapi/litespeed を 7.2 に更新
- これちょっと開発の関係が分かってないな（元気があったら調べよう）

## nikic: Implement single-pass live range calculation
- https://github.com/php/php-src/commit/3269e884686ada59407e14db812bfb42d59d2f1c
- 単一パスの生存期間計算を実装
- コンパイルしながら計算するのでなく pass_two でまとめてやる、みたいな感じか？

## cmb69: Use pkg-config to detect and configure for system libgd
- https://github.com/php/php-src/commit/570d4311b6630bb1fe3378c2d2b216ecda6f1671
- ext/gd で、システムの libgd 検出設定用に pkg-config へ移行

## dstogov: Live ranges construction optimization
- https://github.com/php/php-src/commit/97ccafd4c6a565df73199212c9736ea5b659157b
- 生存期間データの構築を最適化

## cmb69: Remove superfluous variable
- https://github.com/php/php-src/commit/3815a03117905de08dba08707bcab96be5946661
- ext/sqlite3 で、不要な変数を削除

## cmb69: [ci skip] Note preloading and ext/ffi in UPGRADING
- https://github.com/php/php-src/commit/36c825575ed13c87efdd4d24b32f0cabaad89e0d
- Preloading と FFI について UPGRADING へ追記
Rustコミュニティの行動規範を訳してみた

Rustのあるライブラリを読んでいたときに、コントリビューターはRustコミュニティの
[Code of conduct](https://www.rust-lang.org/policies/code-of-conduct)に従うことが望ましいと書かれていて、読んでみたら素敵だったので和訳しました。

## Conduct -行動-

- 私たちはプログラミング経験や性同一性や性表現、性的志向、身体障害、見た目、身体の大きさ、人種、民族、年齢、宗教、国籍、その他の似た概念にかかわらず、フレンドリーかつ安全で歓迎的な環境を全ての人に約束します。

- 上記の環境を損なうような、あからさまに性的な別名やニックネームをつけるのは避けましょう。

- 優しく丁寧でいましょう。嫌な奴や無礼である必要はありません。

- 人間は違う意見を持つものであり、すべての設計や実装の選択はトレードオフで多大なコストがかかることを尊重してください。正しい答えがあることはまれです。

- 建設的でない批判は最小限にしましょう。もし、あなたが試したいと思っている正しいアイデアがあるならば、レポジトリをフォークしてアイデアを試してみましょう。

- 私たちは、もしあなたが他の人を侮辱したり、恥をかかせたり、ハラスメントをした場合はコミュニティから除外します。それは歓迎されるふるまいではありません。私たちはハラスメントという用語を市民の行動規範（リンク切れ）における定義を含めて解釈しています。もしこの概念を理解できないならば、ぜひそこで定義されているものを読んでみてください。特に私たちは社会的に疎外された人々を排除するような態度を容認しません。

- 私たちはプライベートでのハラスメントも同じく容認していません。あなたが誰であろうと、コミュニティメンバーからハラスメントを受けた・受けているまたは不快な気分にさせられたなどあれば、管理者の誰かに連絡するか、Rustのモデレーションチームにすぐに連絡してください。あなたが常連のコントリビューターであろうと新規メンバーであろうと、私たちはこのコミュニティを安全で戻りたくなるような場所であるよう気をつけています。

- 同様にあらゆるスパム行為、釣り行為、炎上行為、からかい、その他の注意を無理やり引こうとする行為は容認していません。


## Moderation -節度-
これらは私たちのコミュニティの行動基準を支えるポリシーです。もしスレッドでモデレーターが必要だと感じた場合はRustのモデレーションチームに連絡してください。

1. Rustの行動基準を犯すような、他人が嫌がる、他人を傷つける、圧迫する、排除するといった発言は許されていません。（間投詞として"fxxk"などの罵り言葉を使うことは許されていますが、メンバーに向けてやメンバーが嫌がるようには言わないでください）

2. モデレーターが不適切と判断した発言はそれが行動基準にあろうとなかろうと許されません。

3. モデレーターは最初、そのような発言に対して注意をします。

4. もしその注意が無視された場合は、そのメンバーを追い出します。そのコミュニケーションチャンネルを沈静化するためです。

5. もし、そのメンバーが戻ってきて引き続き問題を起こせば、そのメンバーはBAN（永久追放）されます。

6. もしBANされたメンバーが1回目の問題行為でかつ心からの謝罪をコミュニティにすれば、モデレーターの裁量でBANを解除することができます。

7. もしモデレーターがメンバーをBANし、それが不当だと思う場合はそのモデレーターか他のモデレーターに**プライベート**で連絡してください。BANに関してチャンネル内での不満を言うことは許されていません。

8. モデレーターはその他のコミュニティメンバーよりも行動基準を徹底しています。もしモデレーターが不適切な状況を作っていた場合は、彼が他のメンバーより余裕がないと予想されます。
　  

Rustのコミュニティでは、お互いで注意しあうために一歩を踏み出す努力をしています。技術的に不可能なものを目指すのではなく、最高の自分でありましょう。特に攻撃的や繊細な話題をもて遊ぶことを避け、メンバーが議題と関係のない話しすることも避けましょう。これがよく不必要な言い合いにつながったり、感情を害したり信用を傷つけ、最悪の場合、人々を完全にコミュニティから遠ざけます。

そしてもし誰かがあなたの発言や行為を問題だと取り扱ったとしても、自分を守ろうとむきにならないでください。ただ、他のメンバーがやめてほしいといっていることをやめ、謝りましょう。もし誤解やフェアでない避難だとしても、良いコミュニケーションを取る良い機会です。ラスタシアンに快適な環境を作るのもあなたの責任であることを覚えておいてください。メンバー全員がなかよくあることを望んでいて、なによりもクールな技術の話をするためにここにいます。あなたがメンバーの信用を得ている限り、メンバーはあなたの行為を故意だと思わず、許してくれるはずです。  


上記の執行ポリシーは、全てのRust公式の場所で適用されます。公式のIRCチャンネル( #rust, #rust-internals, #rust-tools, #rust-libs, #rustc, #rust-beginners, #rust-docs, #rust-community, #rust-lang, and #cargo )、Discordのチャンネル（ https://discord.gg/rust-lang ）、rust-lang、rust-lang-nurseryｍ、rust-lang-deprecated下のGitHubレポジトリ、rust-lang.org(users.rust-lang.org, internals.rust-lang.org)下の全てのフォーラムです。他のRustの行動基準を採用しているプロジェクトは、ぜひメンテナーにポリシー執行の連絡をしてみてください。もしこの行動基準をあなたのプロジェクトで使ってみたい場合は、混乱を避けるために、明確にあなたのモデレーションポリシーを明示するか、自分のモデレーションポリシーのコピーを作成することを検討してください。


## 最後に
こういった形で明記してあるかどうかだけでも違うんだなと思う。
初めてコミュニティの行動基準をしっかり読んだので勉強になりました。
Swift：非同期の処理を無理やり同期的にするやつ（セマフォ）

# 概要
非同期処理とか`Thread`を駆使して色々やっていると，どうしても処理を待ってから何かしたいってことがある．そんな時によく使うセマフォを忘備録．

# ソース
```swift:
func isSomething() -> Bool {
    var res: Bool = true
    let semaphore = DispatchSemaphore(value: 0)
    DispatchQueu.global().async {
        res = なんかBoolを返すような処理
        semaphore.signal()
    }
    semaphore.wait()
    return res
}
```

要は`signal`が発火するまで`wait`するっていう仕組み．
[Rails]FullCalendar カレンダー表示からイベント表示まで

イベント表示までの記事が見つからなかったので書いてみます。
##実現したいこと
FullCalendarの導入とイベントの表示
##前提条件
FullCalendarのカレンダーは表示済み。
[こちら](https://qiita.com/Kattrxvjxxde/items/3e4507456c4c6f51672e)を参考にしてください。
##コード
私はホーム画面にその人の予定を表示させていますので、下記の様なコードになります。（slimで書いてます。）


```slim:home.html.slim

div.container.mt-5
  div id="calendar"

javascript:
  (function() {
    $('#calendar').fullCalendar({
      events: '/index.json'
  });

  }).call(this);
```
JavaScript部分はaseets/javascriptに入れたかったのですが、何故かそこに入れると表示されませんでした。
htmlにベタ打ちすると表示されるので、とりあえずここに入れています。

```ruby:static_pages_controller.rb
def home
    if user_signed_in?
      @events = Event.where(user_id: current_user)
    end
 end
```
コントローラで必要なイベントを取得します。
今回の例の場合、名前の通りuserがサインイン済みだったら、現在のユーザーがスケジュールしているイベントをEventから取得します。
（user_signed_in？やcurrent_userは自分で実装してください。deviseというgemでログイン機能を実装すると自動で使える様になるメソッドです。）

```ruby:home.js.jbuilder
json.array!(@events) do |event|
  json.id "#{event.id}"
  json.title "#{event.name}"
  json.start event.start_time
  json.end event.end_time
  json.url root_url(format: :html)
end
```
このファイルはhome.html.slimのviewと同じディレクトリに保存してください。これでjson形式でイベントを取得します。
必要なのはイベントのid、タイトル、開始時間、終了時間です。 開始時間、終了時間は今回DateTime型ですがTime型でもいけると思います。（未確認です。）

表示形式等、他にも色々といじれますが、とりあえずイベントはこれで表示されます。
コメント等ございましたら是非お願いします。
特に何でassets/javascriptにslimコードに書いたJavaScriptを入れると表示されなくなる理由とか分かる方がいると大変助かります。
15の倍数の場合はFizzBuzz(その数-1)を代わりに表示するFizzBuzz

## 元ネタ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">FizzBuzz(n)<br>を、1以上n以下の数を順番に表示する。ただし、3の倍数の場合はFizzを、5の倍数の場合はBuzzを、15の倍数の場合はFizzBuzz(その数-1)を代わりに表示する関数とするとき、<br>FizzBuzz(100)を表示するプログラムを作りなさい。</p>&mdash; TokusiN (@toku51n) <a href="https://twitter.com/toku51n/status/1087291051646152704?ref_src=twsrc%5Etfw">2019年1月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Swift

```swift:fbp.playground
func fizzBuzz(num: Int) {
    guard 1 <= num else {
        fatalError("num must be larger than 1")
    }
    
    for i in 1...num {
        switch i {
        case i where i % 15 == 0 :
            fizzBuzz(num: i - 1)
        case i where i % 3 == 0 :
            print("Fizz")
        case i where i % 5 == 0 :
            print("Buzz")
        default:
            print(String(i))
        }
    }
}

fizzBuzz(num: 100)

```

## Kotlin

```kotlin:fbp.kt
import java.lang.Exception

fun Int.fizzBuzz() {
    if (this <= 1) {
        throw Exception("this must be larger than 1")
    }
    for (i in 1..this) {
        when {
            i % 15 == 0 -> (i - 1).fizzBuzz()
            i % 3 == 0 -> println("Fizz")
            i % 5 == 0 -> println("Buzz")
            else -> println(i.toString())
        }
    }
}

fun main() {
    100.fizzBuzz()
}
```
Kotlin Tips クイズ ~ 三項演算子風の処理 ~

なんとなくうっかり間違えそうなところがあったので、クイズ風にまとめてみました。

# 始める前に

Kotlinをこれから勉強しよう or 勉強したてという人向けの簡単な問題です。
普段からKotlinを書いてる人からしたら、物足りないかもしれませんがご了承ください。

また、Kotlinの経験が浅い人向けに２点補足です。

## `null.toString()`

Kotlinではnullは`Any?`の拡張関数により`toString()`を呼び出せるようになっています。
[リファレンス](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/to-string.html)

そのため`println`にnullを渡すと`"null"`が出力されます

## Kotlinでのif文は式

Javaとは違いKotlinではif文は式になっています。そのため戻り値が取れます。
letやエルビス演算子（`?:`）でも同様です。
そのためKotlinには三項演算子はありません。（必要ないから）

例

```kotlin
fun main() {
    var str: String? = null
    var message: String? = null

    message = if (str != null) { "nullじゃないよ" } else { "nullだよ" }
    println(message)    			// nullだよ
    
    str = "dummy"

    message = str?.let { "nullじゃないよ" }
    println(message)    			// nullじゃないよ
    
    str = null

    message = str ?: "nullだよ"
    println(message)    			// nullだよ
}
```

# Question

では早速クイズに入っていきましょう！

それぞれ何が出力されるでしょうか？
答えをしっかりと考えてから[Play Ground](https://play.kotlinlang.org/)で実行してみてください。

下へ進むと解説がありますので、先に読まないでくださいね。

## Q1

```kotlin
fun main() {
    val q1 = "q1"
    println(if (q1 != null) { null } else { "default" })
}
```

## Q2

```kotlin
fun main() {
    val q2 = null
    println(q2?.let { "let" } ?: "default")
}
```

## Q3

```kotlin
fun main() {
    val q3 = null
    println(q3.let { it + it } ?: null)
}
```

## Q4

```kotlin
fun main() {
    val q4 = "q4"
    println(q4?.let { null } ?: "default")
}
```

# Answer

それではここから解説です。

## A1：if文

```kotlin
fun main() {
    val q1 = "q1"
    println(if (q1 != null) { null } else { "default" })
}
```

これは簡単ですかね？
Javaなどでも三項演算子をif文で書いたらこんな感じになります。
q1はnullではないので先のif文が条件に一致します。
そのためnullが戻り値となるため `null`と出力されます。


## A2：エルビス演算子

```kotlin
fun main() {
    val q2 = null
    println(q2?.let { "let" } ?: "default")
}
```

これもそこまで悩むことはないと思います。
`q2`がnullなので`let`は処理されず、後ろの`?:`により`default`が戻り値になります。
正解は`default`です。

## A3：引っ掛け+ 型推論

```kotlin
fun main() {
    val q3 = null
    println(q3.let { it + it } ?: null)
}
```

これもQ2と同じで簡単そうにみえますが、ちょっとした引っ掛けです。

ここでまず注意点はq3のletの前に`?`がないことです。
そのため、q3がnullかどうかは関係なく必ずletが実行されます。

そしてさらに次のポイントは`it + it`です。
三項演算子風の処理とは話が別になりますが、最初の`it`がnullなので`String?`の`+`オペレータの拡張関数により、`String?`と推論されます。（q3を`Int?`とかの型で明示的に宣言するとビルドが通らなくなります）
そして、次のitは`Any?`となり、`String?`の`+`で`toString()`で結合されるので、正解は`nullnull`です。

[plusのリファレンス](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/plus.html)

## A4：あまり気づかないパターン

```kotlin
fun main() {
    val q4 = "q4"
    println(q4?.let { null } ?: "default")
}
```

最後の問題です。
こんな簡単なのが最後なの？と思うかもしれませんが、割と勘違いしやすいやつです。

q4はnullではないのでletが処理されます。ですのでnullが返却されて`null`と出力されそうですが、ここが違います。letの後にエルビス演算子が評価されます。
ですので、letの返却がnullのため、正解は`default`になります。

# まとめ

いかがでしたでしょうか？
意外とQ3, Q4あたりはうっかり間違えそうかなと思います。
何かの参考になれば幸いです。

クイズ風にはしてみましたが、他の問題も作るかはまだ考えてません。
何か、うっかり系や意外と知らなそうなものがあれば書いていきたいとは思っています。
MacでEclipse ショートカット単語補完

# MacでEclipseのショートカットが使いたい
最近Javaを勉強していて、Eclipseそろそろ使いたいなと思って、とりあえず単語補完ショートカットは覚えようと検索してみて、同じように設定して使えなかったので簡単に対応した内容を記載します。

## 環境

OS ：　macOS Mojava バージョン 19.14.2
Eclipse ：Photon Release（4.8.0）

## 設定したこと

[システム環境設定]　- [キーボード]　- [ショートカット]　- [入力ソース]
の「前の入力ソースを選択」のチェックボックスを外す

## Eclipseで単語補完
Ctrl + Space
*mainって書いて、上記タイプすればmain関数が単語補完候補に出てとても便利です

## 終わり
これで出来ました。
もともとEclipseの設定では、Ctrl + Spaceが単語補完なのですが
システム環境設定（OSの設定）で、Ctrl + Spaceが使用されていたため、
Eclipseのショートカットキー　＜　システム環境設定
となって、Eclipseで単語補完出来なかったようです。数分悩みました( ・∇・)
Espresso テストで background に border があるかどうかを調べる Matcher 

ニッチな用途で汎用性はない気がしますが、うまく行ってちょっと嬉しかったのでメモ。

## 問題 ##

下図のように、`RecyclerView` ベースのアプリがありまして、内部状態によって `ViewHolder` にボーダーをつけたりつけなかったりしています。ボーダーの有る無しは、`background` に異なる `shape` を指定することで実現しています。(`stroke` を実装した `shape` ではボーダーが付き、`stroke` がなければ付きません。)

<img width="886" alt="Japanese.png" src="https://qiita-image-store.s3.amazonaws.com/0/108030/f4b7aeb7-d7f2-4b9c-ca03-d8f8f9f0c4a8.png">

ところが、期待した `ViewHolder` 以外にもボーダーが描画されるというバグが発生しました。おそらく `ViewHolder` の再利用によるバグだと思います。すぐに直せばいいんですが、これは UI テストを書くところだろうと言うことで、初めてちゃんと Espresso テストをやってみました。

しかし、こう言う見た目を比べる `Matcher` て言うのはコアのライブラリではちゃんと用意されてなくて、サードパーティでも見つからなかったので自分で書いてみることにしました。(初心者なので見落としている可能性も大ですが)

## `itemView.background` ##
`ViewHolder` の `itemView.background` の状態を調べるわけなんで、それが何クラスに属しているのかをまず調べます。デバッグして、ちまちま`ViewHolder` のオブジェクトツリーを辿ります。

<img width="479" alt="GradientDrawable.png" src="https://qiita-image-store.s3.amazonaws.com/0/108030/f0c76946-26ae-bd84-8ba8-c8150b5821fb.png">

ありました！`mBackground` プロパティは `GradientDrawable` のインスタンスで、こいつには `mStrokePaint` っていうプロパティが有ります。このプロパティに実体があればボーダー有り、`null` だったらボーダー無しです。

## Matcher ##

`Matcher` の実装は以下です。

```kotlin
fun backgroundHasBorder(): Matcher<View> {
   return object : TypeSafeMatcher<View>(View::class.java!!) {

       override fun describeTo(description: Description) {
           description.appendText("to have a border")
       }

       override fun matchesSafely(foundView: View): Boolean {
           val gradientDrawable = (foundView.background as? GradientDrawable)
           if (gradientDrawable == null) {
               print("Background is not a gradient")
               return false
           }

           val field = (GradientDrawable::class.java.getDeclaredField("mStrokePaint"))
           field.isAccessible = true
           val stroke = field.get(gradientDrawable)
           return stroke != null
        }
    }
}
```

`GradientDrawable.mStrokePoint` はプライベートプロパティで、これを公開しているメソッドがないので、リフレクションでアクセスしています。

## 使い方 ##

ボーダーがある(はず)の時

```kotlin
onView(withId(R.id.SomeId))
    .check(matches(backgroundHasBorder()))
```

ボーダーがない(はず)の時

```kotlin
onView(withId(R.id...))
    .check(not(matches(backgroundHasBorder())))
```

NOTE : 今回の僕のアプリの場合、`RecyclerView` の `ViewHolder` について評価したいわけですが、`RecyclerView` の個々の `ViewHolder` アクセスには `withId(...)` Matcher が使えず、カスタムの Matcher を使用しています。[^1]

[^1]: 一般的に `RecyclerView`アクセスが思ったより大変でハマりました。他にも方法はあるのかもしれませんが [RecyclerViewMatcher](https://github.com/dannyroa/espresso-samples/blob/master/RecyclerView/app/src/androidTest/java/com/dannyroa/espresso_samples/recyclerview/RecyclerViewMatcher.java) というのをコピーしてきて使いました。これを使う場合、View の Matcher には `withId(...)` でアクセスするのではなく、`withRecyclerView(R.id....).atPosition(...)` でアクセスします。


## 感想 ##

* `shape` で定義した `background` が `ShapeDrawable` ではなく、`GradientDrawable` になるっていうのは意外でした。きっと、rect や ellipse ベースではないもっと複雑な `shape` を定義すると `ShapeDrawable` になるのかな?
    * この辺はバージョンにおける実装の違いが怖いですが、一応 API level 28 (Pie) と API level 19 (Kitkat) でテストしたところ、期待通りに動きました。
* Java や Kotlin には reflection があるので、こういう `View` の `Matcher` を書いたりするのは、調べさえすればワンパスは通せるという感じがあります。ただ、Proguard をかますと間違いなくハマりそう。
Refused to create a worker from 'blobでコンテンツセキュリティポリシーで怒られた場合の対処法


#Monacaでtessearact.jsを動かそうと思ったらコンソールに以下の画面が現れ、実行ができないエラーに遭遇してしまった。

```
Refused to create a worker from 'blob:file:///8c082fe9-ea7c-4bd6-8dbf-5ca6c339eb82'
because it violates the following Content Security Policy directive: 
"script-src * 'unsafe-inline' 'unsafe-eval'". 
Note that 'worker-src' was not explicitly set, so 'script-src' is used as a fallback.
```

どうやら、MonacaのプロジェクトテンプレートはデフォルトでXSSのような攻撃を抑止するためにHTTP headerにコンテンツセキュリティポリシーというものを設定しているらしいです。
以下、ご参考にさせて頂きました。
https://qiita.com/goofmint/items/0b60dcc5eccad6c794a2
https://content-security-policy.com/

エラーの内容から、blobと呼ばれるバイナリ形式のオブジェクトをセキュティで禁止しているようですので、許可を与えます。

```index.html
<meta http-equiv="Content-Security-Policy" content="worker-src blob: ;default-src * data: gap: blob: content: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
```

デフォルトから` worker-src blob: ;`を追加し,`default-src`に`blob`を追加しています。

これで無事エラーは出なくなりました。

ただしこれはベストな方法ではないはずです。ベストな設定をご存知の方ご教授ください。
jupyter themesでグラフのラベルなどが見えにくくなる問題

# jupyter themes
　については既に色々な方が記事にして下さっているので割愛します. 　
ここで問題なのは...

<img width="1013" alt="Screen Shot 2019-01-22 at 0.58.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/212428/1adcc217-b939-8dab-0650-8c0757286a85.png">
せっかく目に優しく, かっこいいデザインなのにグラフのラベル・目盛りなどが見えにくくなっています.　今回はこれを改善します.
方法は簡単. 背景色を変更します. これらの設定は`~/.jupyter/custom/custom.css`に記載されています. この中身を弄れば細かい変更が可能です.

結果から, 
<img width="998" alt="Screen Shot 2019-01-22 at 1.00.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/212428/3b55b0f0-ae73-a4d0-cc57-b6bf3e485e7f.png">

見やすくなりました:eyeglasses:

# `custom.css`を弄る

まず対応箇所を確認します

``` custom.css
div.output_wrapper {
background-color: #ffffff; /* ffffffが背景色に対応 */
border: 0px;
left: 0px;
margin-bottom: 0em;
margin-top: 0em;
border-top-right-radius: 0px;
border-top-left-radius: 0px;
}
```

ということで`fffff`を別の色に変更すればいいわけですが, ここだけ変更すると出力cellの一部のみ, 色が変わってしまうのでファイル全体で`ffffff`->`xxxxxx`に置換するといいと思います.

※変更する際は[こちら](https://colorate.azurewebsites.net/ja/ColorPicker/4B6984)などで色見本を参考にすると便利です.

# 備考
↑で紹介した設定の詳細です. 今回適用したテーマはchesterishというものでした. 
color codeは以下で変更

|   |color code|
|---|---|
|before|`#323a48`|
|after|`#4b6984`|
テーマのバランスを崩さないように色を選択したつもりですが, しっくりきていません. いい感じの設定などありましたら教えてください.

# おわりに
[ブログ](https://black-thunder.hatenablog.com/)でもその他、ちょっとした内容を公開しています。
よければご覧になってください。

-------
# 追記(2019/1/23)
　コメントでお二方に`Figure`オブジェクトの`facecolor`を変えることでも対応できるとご指摘いただきました．`Figure`とか`Axes`などについては他の方の記事に譲ります．

　毎度，`facecolor`を設定するのが面倒な方は`~/.matplotlib/matplotlibrc`を編集することでデフォルト設定の変更が可能なようです．
基本データ型と参照型 (Java)

# 基本データ型

| 型 | 内容 |
|:--:|:----:|
| char | 16ビットUnicodeキャラクタデータ |
| boolean | 真偽値 (true or false) |
| byte | 8bit符号付き整数 |
| short | 8bit符号付き整数 |
| int | 32bit符号付き整数 |
| long | 64bit符号付き整数 |
| float | 32bit符号付き浮動小数点数 |
| double | 64bit符号付き浮動小数点数 |

```java
public class Main1 {
    public static void main(String[] args) {
        // (1) プリミティブ型の宣言と初期化
        int a = 0;
        int b = 1;
        System.out.println("a: " + a);
        System.out.println("b: " + b);

        // (2) プリミティブ型の代入
        b = a;
        System.out.println("a: " + a);
        System.out.println("b: " + b);

        // (3) プリミティブ型の代入
        a = 2;
        System.out.println("a: " + a);
        System.out.println("b: " + b);
    }
}
```

```java
public static void main(String[] args) {
    int a = 1;
    int b = a;
    b = 2;
    System.out.println(a);
    System.out.println(b);
}
```

```
1
2
```



# 参照型

```java
public static void main(String[] args) {
    int[] a = {1, 2, 3};
    int[] b = a;
    b[0] = 5;
    System.out.println(a[0]);
    System.out.println(b[0]);
}
```

```
5
5
```

配列aもbも同じメモリの番地を表すので配列の要素は関係ない


# クラスの場合

```java
/**
 * 円を表すクラス
 */
public class Circle {
    /** 半径を表すフィールド */
    public int radius;
}
```

```java
public class Main2 {
    public static void main(String[] args) {

        // (4) 参照型のインスタンス化とフィールドへの代入
        Circle c1 = new Circle();
        c1.radius = 0;
        Circle c2 = new Circle();
        c2.radius = 1;
        System.out.println("c1.radius: " + c1.radius);
        System.out.println("c2.radius: " + c2.radius);

        // (5) 参照型の代入
        c2 = c1;
        System.out.println("c1.radius: " + c1.radius);
        System.out.println("c2.radius: " + c2.radius);

        // (6) 参照型のフィールドに代入
        c1.radius = 2;
        System.out.println("c1.radius: " + c1.radius);
        System.out.println("c2.radius: " + c2.radius);
    }
}
```

```
c1.radius:0
c2.radius:1
c1.radius:0
c2.radius:0
c1.radius:2
c2.radius:2
```

# 参考

http://teachingprogramming.net/archives/647
https://nobuo-create.net/sanshougata/
【Golang】Structのタグを取得する方法

# 概要
CSVファイルなどにStructのタグをヘッダー形式で書き込む際に
便利なStructタグの取得方法を紹介します。
今回はJsonファイルのキーを取得します。　　

# 前提
このようなStructがあると仮定します。

```golang
// Information はJsonファイルの構造体
type Information struct {
	ID      int    `json:"id"`
	Title string `json:"title"`
	Date string `json:"date"`
}
```

Jsonファイルのイメージ

```json
[
  {
    "id": 1,
    "title": "A - foo1",
    "date": "2019-01-01T00:00:00+09:00"
  },
  {
    "id": 2,
    "title": "B - foo2",
    "date": "2019-01-02T00:00:00+09:00"
  }
]
```
CSVファイルの場合、ヘッダーの完成図は

```
id, title, date 
```
上記のようなイメージになります。

# 実装
構造体の情報を取得する際に有用なreflectパッケージの__Typeof関数__を使って
Jsonファイルのタグを取得します。

[reflect パッケージ - golang.jp](http://golang.jp/pkg/reflect)

```golang
func main() {
	// Structのjsonタグを取得
	s := Information{}
	t := reflect.TypeOf(s)

	// 取得したjsonタグを格納するスライスを宣言
	var lenInfo []string

	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		j := field.Tag.Get("json")
		lenInfo = append(lenInfo, j)
	}

	// スライスをカンマ区切りの文字列に変換
	strInfo := strings.Join(lenInfo, ", ")

	fmt.Println(lenInfo) // 出力結果： [id title date]
	fmt.Println(strInfo) // 出力結果： id, title, date
}
```

以上がStructタグの取得方法となります。
# おまけ
スライスである`lenInfo`で取得した値を出力すると`[id title date]`と
スライスのまま出力されてしまいます。
これではヘッダーとして格好がつきません。

ここでJoin関数を使って文字列に変換します。
ついでにカンマ区切りにしてしまいます。
`strInfo := strings.Join(lenInfo, ", ")`

出力結果は`id, title, date` 
想定通りになりました。

[strings パッケージ - golang.jp](http://golang.jp/pkg/strings)
Unityシェーダーエラー Parse error: syntax error, unexpected TOK_PASS, expecting TOK_SETTEXTURE or '}'

#エラー構文
- Parse error: syntax error, unexpected TOK_PASS, expecting TOK_SETTEXTURE or '}'

#原因
surfaceシェーダーの複数パスレンダリングの記述方法が間違っていた

```
Pass{
      CGPROGRAM

      ENDCG
}
Pass{
      CGPROGRAM

      ENDCG
}
```
と記述のするのはフラグメントシェーダーやバーテックスシェーダーの場合。

サーフェスシェーダーは

```
CGPROGRAM

ENDCG

CGPROGRAM

ENDCG
```

と記述する。

1パス目にサーフェスシェーダー、2パス目にバーテックスシェーダー等の場合は以下のように記述する。

```
CGPROGRAM
#pragma surface surf ~
ENDCG

Pass{
      CGPROGRAM
      #pragma vertex vert
      ENDCG
}
```
Vim で Highlight_Matching_Pair のエラーが出る場合

Vim のバージョンアップデート後に、例えば、以下のようなコード

```ruby
def test(a)
  puts "Test: #{a}"
end
```

を書いたとして、 `{`, `}` のところにカーソルを合わせたときに、以下のようなエラーが発生しました。

```
Error detected while processing function <SNR>57_Highlight_Matching_Pair:
line   97:
E475: Invalid argument: 0
```

このエラーの原因は、結果的には、 Vim のバージョンアップによって API が変わっているのに、インストール済みの Vim のプラグインのバージョンを上げていないので、発生していたものでした。
(どのプラグインが原因までかは調べていません)

プラグインの方が修正されていない場合はアウトですが、プラグインの方も更新してくれているかもしれません。ということで、プラグインをアップデートしてみましょう。

私の場合、 Vim のプラグイン管理に [dein.vim](https://github.com/Shougo/dein.vim) を使っているので、以下のコマンドを叩いて、プラグインのアップデートを行い、 Vim を開き直すことで解消しました。

```vim
:call dein#update()
```

> References

- [dein.vim/dein.txt](https://github.com/Shougo/dein.vim/blob/af70c00/doc/dein.txt)
atcoder ABC104

c問題はよくある貪欲かと思いきや全探索の問題である。D問題はDPを使うことはわかったものの更新が分からずできなかった。
https://atcoder.jp/contests/abc104

#C問題
#方針
まず貪欲でできないか考えるが思ったより複雑なため全探索を考える。問題条件より、問題の種類は10種類しかないことと、ある種類の問題を途中で終わらせて、他の種類の問題に取り掛かるメリットは明らかにないので、ある種類の問題を中途半端に終わらせることは、途中では起こらないことがわかる。よって、1~N(N<=10)の問題について、それぞれ全部解いたら、違う問題を全部とくという風に全探索することで、最小回数を求められる。


#D問題
DPの問題であるが、ここで文字列Sのi番目にいる時の状態を考えると3種類存在する。
(1) Aを加える
(2) (1)の状態から
(3) (2)の状態からCを加える
最終的に文字列の長さの時の(3)の数を見れば良い。
次に実際の遷移について考える。まず?が一個もない文字列について考えると、
i番目の文字が'A'の時
dp[i+1][0] = dp[i][0] + 1;
i番目の文字が'B'の時
dp[i+1][1] = dp[i][1] + dp[i][0];
i番目の文字が'C'の時
dp[i+1][2] = dp[i][2] + dp[i][1];
次に?が文字列中に現れる場合について考える。?が出てくると、?は3通りに買われることから、文字列の種類は3倍に増える。(AAB? => AABA,AABB,AABC)なのでこれらの増えた文字列についても全て考慮しなければならない。
以上より、文字列が増えた時の遷移の様子について考える。
i番目の文字が'A'の時
dp[i+1][0] = dp[i][0] + 文字列の数;
i番目の文字が'B'の時
dp[i+1][1] = dp[i][1] + dp[i][0];
i番目の文字が'C'の時
dp[i+1][2] = dp[i][2] + dp[i][1];
i番目の文字が'?'の時
上3つ全てについて足し合わせる。
この考えを用い、dpと文字列の総数を更新していくことで答えを導ける。
Homebrew の処理ですごく時間がかかる場合

## ケース1

`brew upgrade` などをしたときに起こることですが、 Homebrew がローカルに持っているいくつかの Git repository (`/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core` など) で pull が起こるときに、取得していない差分があまりに多いと、それなりの時間がかかることがあります。

`Updating Homebrew...` というログが出ているときがその目印です。
これは必要な処理になるので、辛抱強く待っていましょう。こまめに `brew update` しておけば、上記の repository を更新してくれるので、よいかもしれません。

> References

- [brew/brew.sh](https://github.com/Homebrew/brew/blob/170c5493a4e3628ed77137215a9ed6328e1a17c8/Library/Homebrew/brew.sh)
- [brew/update.sh](https://github.com/Homebrew/brew/blob/170c5493a4e3628ed77137215a9ed6328e1a17c8/Library/Homebrew/cmd/update.sh)

## ケース2 gcc をインストールしようとしている

gcc を直接、ないし、依存しているライブラリをインストールするため間接的にインストールしようとすると、とても時間がかかることがあります。
私の場合は macOS Mojave update 後に起こりました。どうも gcc をソースからコンパイルしようとするため、時間がかかるようです。

gcc をインストールしようとしているログが出ていて、その直後から全然進まない場合は Ctrl-C で一度 stop しちゃってください。
(Homebrew は安全設計なので途中で止めても大丈夫です)

その上で、

```sh
$ xcode-select --install
```

を実行して、まず Xcode Command Line Tools をインストールしてください。その上で再実行すれば、かなり短時間で完了します。

下記のリンクに書いてあることですが、 Xcode Command Line Tools がインストールされている場合、 Homebrew は Homebrew 用語で "bottle" と呼ばれる binary 形式の gcc を使用するようになるので、インストールが高速になるのです。

> References

- [homebrew - brew install gcc too time consuming - Stack Overflow](https://stackoverflow.com/questions/24966404/)
- [homebrew-core/gcc.rb](https://github.com/Homebrew/homebrew-core/blob/6a81aeee836f93d805f679e4f77a1a9589fa35d5/Formula/gcc.rb)
Gitにファイルが読み込まれないときはその配下ディレクトリに".git"フォルダがあるかも！

#タイトルのまんまだが、
## Gitにファイルが読み込まれないときはその配下ディレクトリに".git"フォルダがあるかも！
そもそも `.git`のディレクトリ配下の、ファイル・ディレクトリを管理することができる。

Project
　┣.git　←(A)
　┣ABC.txt
　┗example_folder
　　　　┣.git　←(B)
　　　　┗XYZ.txt

上記の図だと `(A).git`では、`ABC.txt`と`exmaple_folder`ディレクトリ自体は管理できる。
`exmaple_folder`ディレクトリ配下のファイルは管理できない。

`(B).git`では`XYZ.txt`を管理できる。

`(A).git`で`XYZ.txt`を管理するときは、②.gitを削除すれば良い。
  
  
単純なことだが、苦労した。脳みそ使ってないのかな？
説明適当だけど、わかりますかね？
Oculus RiftはSurface Book 2で動かせないから気をつけて！

# 結論から

Surface Book 2では、Oculus Riftを動かすことができません。
変換アダプターとか関係なく、ハードウェアのアーキテクチャ的に繋がりません。

## なぜ動かないか

詳細は、 [こちらのYouTube](https://www.youtube.com/watch?v=-vht-2juWh4) の動画が非常にわかりやすいです。

原因は、HDMIケーブルを認識することができないからです。

Surface Book 2の端子は、
① USB3.1 Gen1（フルサイズ）
② SDメモリーカードスロット
③ ヘッドホン出力
④ USB3.1 Gen1 Type-C
⑤ Surface Connect
があります。

HDMI端子がありませんが、USB-C→HDMI変換ケーブルで外部ディスプレイに出力可能です。
CPU内蔵GPU(iGPU)かディスクリートGPU(dGPU)の2つのGPUが内蔵されています。
しかし、USB-CとUSB3.1は、iGPUにしか繋がらず、dGPUにつなぐことができません。
そのため、Oculus RiftはiGPUを使用することになるため、スペックが足りず正常に動作させることができません。

15インチの場合、SteamVRパフォーマンステストでは、十分な性能であることを表わす「VRレディ」というスペックです。
しかし、動作させることができません。
Oculus RiftもHTC Viveも公式による正式サポートしていないため、文句は言えませんが納得行かない…

[Surface Book 2 15インチモデル 詳細レビュー：すべてが最高品質の超ハイエンド2-in-1ノートPC – こまめブログ](https://little-beans.net/review/surface-book2-15/)


# 終わりに

Oculus Questの発売まで待てず、Oculus Riftを買ったのが失敗でした。
セールをやっていたので、ノリで買って失敗しました。

どうやらHTC Viveの場合は動作させることができるようですが、iGPUと繋いだ状態とのことです。

Oculus RiftとHTC Viveが動かないことを知っていたらSurface Book 2を買わなかったです。ちゃんと下調べすればよかったと反省しています。

でもそれ以外は完璧なので、気に入っています。


# 参考文献

 [Would it work?? Oculus rift on surface book 2 15" : virtualreality](https://www.reddit.com/r/virtualreality/comments/7st24r/would_it_work_oculus_rift_on_surface_book_2_15/)
 
 [can you use VR on the Surface Book 2 (rift, vive etc) : Surface](https://www.reddit.com/r/Surface/comments/7f32ya/can_you_use_vr_on_the_surface_book_2_rift_vive_etc/)
 
 [Microsoft Surface Book 2 review: beauty and brawn, but with limits - The Verge](https://www.theverge.com/2017/11/16/16658466/microsoft-surface-book-2-review)
NodeListとは？

同僚がはまっていました。
私も早合点してはまった事があるので書いておこうと思います。

# これは何？
Nodeの集合です。
`length`などがあるので**配列**と早合点しそうになりますが（恥ずかしながらしました）、**配列**とは異なります。

`querySelectorAll()`の返値や、`Node.childNodes`のプロパティとして取得できます。

#特徴
- 静的な場合と動的な場合がある。`querySelectorAll()`の場合は静的なので、取得後に変化があっても変更されません。しかし、`Node.childNodes`の場合は動的になります。
- メソッドとして`forEach()`をもっているので反復処理が可能です。（https://developer.mozilla.org/ja/docs/Web/API/NodeList/forEach）
- IEやEdgeでは動作しないメソッドがあるので、要注意です。

＊NodeListは静的な場合と動的な場合があるので、ここを理解していないと予期しない問題を発生させると思います。
後は私自身にも言い聞かせますが、**配列**とは異なります。


#参考
NodeList
https://developer.mozilla.org/ja/docs/Web/API/NodeList

IEで NodeList を forEach するとエラーになる問題の対処方
https://qiita.com/snjssk/items/8d179566b023703c0663
組み込みエンジニアでなくても週末に簡単にmicro:bitを動かして遊ぶ

# 概要
週末に簡単に電子工作をしたいが、環境構築に苦労して以外と労力が掛かることが良くあります。
micro:bitを使うと環境問題に遭遇せず比較的簡単に実動作させて遊ぶことができましたのでメモします。
# micro:bitの入手
下記から購入しました。

BBC micro:bit （マイクロビット）
https://www.amazon.co.jp/BBC-micro-bit-（マイクロビット）/dp/B074M58PL7

microUSB - USB TypeC ケーブルは100均の物を用意しました。
（DAISOの、micro USB - USB TypeAと USB TypeA - USB TypeC変換アダプタを計216円で購入しました。）

家に届きました。
![IMG_0097.JPG](https://qiita-image-store.s3.amazonaws.com/0/344880/e4ef7769-5b63-5631-03ee-f115ac7af5c1.jpeg)

# micro:bitプログラム開発環境
下記のMakeCodeを使いました。MakeCodeエディター→プログラムしましょう。から開発用ページに移動することができます。
https://microbit.org/ja/code/


# 簡単なプログラムを作成
上記ページ移動後に、新しいプロジェクトから、プログラム作成画面へ移動します。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/344880/cb90bcb0-b7d3-7c8e-3460-d842485f38e3.png)
ページに移動後は下記画面になります。「最初だけ」と「ずっと」はプログラム作成時によくある項目です。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/344880/3ab69b2e-20a4-6a51-f6cd-5757548c9599.png)
「最初だけ」に処理を加えるため、基本からアイコン表示用のブロックを選択。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/344880/2e6f5fd9-0a7e-f772-4518-af995c64ffcf.png)
「最初だけ」の間に挟みます。
![004_1.png](https://qiita-image-store.s3.amazonaws.com/0/344880/36b5f9ce-9414-6fe4-a952-4c5e33633e37.png)
同様に、「ずっと」の中にもブロックを挟みます。
![004_2.png](https://qiita-image-store.s3.amazonaws.com/0/344880/e9d80815-d07f-7261-0d33-5ecdb6fc9c01.png)
次に、ボタン押下時の処理を加えます。入力から、ボタンAが押されたとき、を選択して、もとの画面にドラッグして持ってきてドロップします。
![005.png](https://qiita-image-store.s3.amazonaws.com/0/344880/8960f717-9b83-de72-0be8-eaf4ffe82575.png)
同様に、処理を挟みます。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/344880/c9f36ce6-eecc-abef-2e37-b18e2b22626e.png)
![007.png](https://qiita-image-store.s3.amazonaws.com/0/344880/022cfddc-86cc-92ac-31a0-aebc7b11b75f.png)

以上で、簡単なプログラム作成は完了です。

# 動作テスト
左のmicro:bitシミュレーションを操作して、
最初だけ、ハート
ずっと、笑顔
ボタンAが押されたとき、しかめっ面
ボタンBが押されたとき、驚いた顔　になることを確認して下さい。
その後、ダウンロードボタンを押して、「*.hex」ファイルを入手し、
micro:bitとPCを接続して認識されたMICROBITフォルダにドラッグ＆ドロップして下さい。

![008.png](https://qiita-image-store.s3.amazonaws.com/0/344880/d6ab22a5-2bc8-e138-ee88-6fb6c09803ea.png)

下記の表示が出ると思います。
![009.png](https://qiita-image-store.s3.amazonaws.com/0/344880/2471ac94-bdcc-fb86-498f-8c0f87c8bd36.png)

書き込み中はLEDがチカチカ光ります。
書き込み完了後に、手元のmicro:bitが、最初だけハート、ずっと笑顔、ボタンA押下時にしかめっ面、ボタンBが押されたとき驚いた顔、、のように動いたらOKです。

# 今後
micro:bitは温度センサや明るさセンサ、傾きセンサを持っているので、
それぞれの値に応じた顔の出力を行うよう改造することができます。
また、microbit下にある、1,2,3,3V,GNDの番号を他機器と上手く繋ぐことで、他機器と連携することができます。（本記事の対象外ですが必要に応じて記載します。）

# 備考
私はUSBハブ経由でmicro:bitとPCを接続しましたが、microbitがPCから
見つかりませんでした。直接接続すると問題なくmicrobitが見つかりました。
（USBハブの問題かもしれませんが）、不要なトラブルを避けるためにもPCと直接接続した方が良いかもしれません。
平成30年度春期　データベーススペシャリスト試験（DB）午後Ⅰ　問１　設問1（2）の解説

問１　設問1はこっち
https://qiita.com/mokoenator/items/1d4f364e1085ff962321

検証してないので、間違っている可能がおおいにあります。
参考程度にしてください。

#設問１（2）

問題は「図１のリレーションシップは未完成である、必要なリレーションシップを全て記入し、図を完成させよ」とある。
ここでポイントなのは、未完成であること、リレーションシップしか記入してはいけない事。

商品回りがスーパータイプしかないけど、商品のサブタイプは考えないで「リレーションシップしか記入してはいけない」ことを守りましょう。


（2）は（1）が完璧にならないと１００点にならない。
逆に（2）で（1）の間違いに気が付ければ100点になる

##図２関係スキーマの穴埋めをする

----は問題で省略されている部分

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/185049/7d0e32f9-70e6-eac8-e8b4-e8aa85aaf7ba.png)



##線を引こう
設問１（1）で答えた外部キーの線を引けばいい。

本当は完成された「図2　関係スキーマ」にあるすべての外部キーを確認する必要があるけど、問題の答えを最初から図２に書いているわけがない。


とりあえず、線を引いてデグリを考える
（下記の矢印は元が１先がNの関係をあらわし、ハイフンは１：１の関係を表しています）
#「地域.SC組織コード」と「サービスセンタ」のデグリ
問題文から読みにくい。かなりこじつけ・・・・
図２の関係スキーマから「地域が決まるとSCが決まる」がよみとれる。
さらにここから「複数の地域が一つのSCと関係できる」とよみとれる。

問題文からは、「地域ごとに、担当SCを決めている」とあるので「地域が決まると担当SCが決まる」とよみとれる。
地域は都道府県より小さい＆SCは都道府県の数ほど作れないと予想すると
「担当SCが決まると複数の地域が決まる」と考えられる
つまりSC→地域のデグリが成立する。

#「営業担当者」と「営業所」のデグリ
問題文、業務概要・営業担当者から「営業担当者は、いずれか一つの営業所に所属する」とあるので
営業所→営業担当者のデグリがきまる。

#「顧客」と「営業所」のデグリ
問題文、業務概要・組織から「顧客ごとに、担当営業所を決めている。」とあるので
営業所→顧客のデグリがきまる。

#「設置事業所」と「顧客」のデグリ
問題文、業務概要・顧客から「（コピー機を設置する顧客の事業所）」とあるので
この文から顧客は複数の事業所を持っていると読み取れるし、会社ってそうだから。
顧客→設置事業所のデグリがきまる。

#「設置事業所」と「地域」のデグリ
普通に考えて一つの地域に複数の顧客が存在するので
設置事業所→地域のデグリがきまる。

#「営業担当者」、「顧客」、「営業所」と「見積」のデグリ
商売として顧客からの見積の依頼は何回でもできるし（同じ案件、違う案件）、同じ社員がたくさんの見積を作るし、その社員が作った一つの営業所にはたくさんの見積をあつかうので以下のデグリになる。
営業担当者→見積
顧客→見積
営業所→見積

とくに問題文から読み取る必要はないし、明記されてない（みつけられないだけかも）

#「見積」と「受注」のデグリ
問題文、業務概要・受注から「成約に至ったときに、見積り同じ単位で受注登録を行う。」とあるので１：１の関係と読み取れる。
（わざわざ"同じ単位で"とある）
見積‐受注のデグリがきまる。


#だまされたらだめ「顧客」と「受注明細」のリレーション
「設置事業所」から「顧客」にリレーションを引いたらダメ。
受注明細にある{顧客コード,設置事業所コード}は設置事業所への外部キーだから線を引いたら減点になると思う。

#最後の確認
最後に図１と図2が一致していることを確認する。もしかしたら、線が引かれてないが図１には外部キーが書いてあるかもしれない。


#出典
平成30年度春期　データベーススペシャリスト試験（DB）午後Ⅰ　問１
AWS 認定クラウドプラクティショナー試験 合格体験記

2019年1月にAWSの入門者向け資格の「クラウドプラクティショナー」に合格したので、その時の勉強法などをまとめてみました。

# 受験したきっかけ

* 職場ではオンプレのサーバーを扱うことが多く、AWSに関する知識を習得する機会があまりなかったため。
 * とは言っても、EC2などは使っていましたが...
* AWSに関する知識をある程度体系的に学んでみたかったため。
 * 業務や自宅でAWSを触るだけだと、直接触れたことのないサービスについて学ぶ機会がないため。
* 初心者向けの試験なので、まず最初に受けるのに適当だと考えたため。
 * 初級者～中級者向けの「アソシエイト」レベルの試験は、この次に受験することに...

# 受験までの大まかな流れ

|実施したこと|実施日|
|---|---|
|受験を思い立った時期|2018/11/20前後|
|試験に関する情報収集の開始|2018/11/20前後|
|参考書の購入|2018/11/29|
|模擬試験(1回目)|2019/01/01|
|受験申込日|2019/01/02|
|本格的な学習の開始|2018/01/06頃|
|模擬試験(2回目)|2019/01/16|
|試験日|2019/01/17|

* かなり早い段階で[合格対策 AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/dp/486594043X/)を参考書として購入しましたが、当初は電車の中でパラパラと流し読みする程度でした。
* 元旦にWeb上で模擬試験を受けた後、試験直前にもう1回模擬試験を受けて到達度を最終確認しました。
 * 元旦に酔っぱらった状態で勢いに任せて模擬試験を受けましたが、結果は合格でほっとしました(笑)
* 本格的に勉強を始めたのは試験2週間前...
 * オンプレである程度の経験があれば、IAMやセキュリティグループなど"AWSに特徴的な部分"を集中的に学習すると効率が良いと思います。
 * 業務でVirtualBoxやVMwareを扱ったことがあったので、仮想化技術に関する基礎的な知識があったのも多少はプラスに影響したと思います。

# 勉強に使ったもの

|種類|役立ち度|参考URL|
|---|---|---|
|合格対策 AWS認定ソリューションアーキテクト - アソシエイト|★★★|[■](https://www.amazon.co.jp/dp/486594043X/)|
|Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版|★★|[■](https://www.amazon.co.jp/dp/4822237443/)|
|AWSome Day for Partner 2018まとめ|★★★|[■](https://qiita.com/nkojima/items/0917f595e7dbf562562a)|
|AWSを実際に触る|★★★||
|AWS クラウドサービス活用資料集|★★|[■](https://aws.amazon.com/jp/aws-jp-introduction/)|
|オンラインの模擬試験|★★★||

* 「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」は、AWS認定に関する唯一？の参考書なので、クラウドプラクティショナーよりもワンランク上の内容ですが、一通り読んで学習しました。
* AWSを触って学習する際には、「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」を片手に勉強しました。
 * 逆に、AWSを触りながら学習するのでなければ、この本よりも「合格対策...」を読んで学習した方が良いかもしれません。
* 私自身が書いた「AWSome Dayのまとめ」は、学習を始めた初期に全体像を把握するのに役立ちました。
* 勤務先では、昼休みに「AWS クラウドサービス活用資料集」をパラパラ見て学習することもありました。
 * サービスごとに資料がまとめられていて学習しやすいですが、クラウドプラクティショナーよりもやや上のレベル向けの内容に感じました。
* "AWS認定"のサイトから申し込めるオンラインの模擬試験は、自身の実力を測るだけでなく、オンライン受験に慣れるためにも受験しておいた方が良いと思います。
 * 本試験の方が問題が難しかったですが、解答の仕方や目印（フラグ）の付け方、解答を修正する方法などは模擬試験と同じなので、本試験で慌てずに済みます。
 * 模擬試験は1回あたり2000円もしますが、1度は受験しておいた方が良いと思います。（正直なところ、参考書よりも役立った気がします...）

# その他

* AWS認定のアカウントにログインするまでが一仕事。
 * 最初はどこからログインすれば良いのかが分からず、ちょっと手間取りました。
 * ログインした後、ダッシュボードから模擬試験や本試験を申し込む方法も少し分かりづらかったです。
* 試験会場だった「新宿駅前テストセンター」は、新宿駅南口の目の前なので分かりやすかったです。
* 受験の際には「免許証」と「クレジットカード」を提示するように要求されました。
 * 最初は「免許証」と「社員証」を提示しましたが、クレジットカードを出すように要求されました。
 * どうやらクレジットカードのサインを確認したかったようですが、なぜクレジットカードじゃないとダメだったのかは分かりません。
* 試験会場の部屋には、何も持って入ることができないので要注意。
 * 手荷物や上着をロッカーに入れるだけでなく、ポケットの中身や腕時計までロッカーに入れるように指示されます。
DNSなど分からぬ初心者がApp Engineにカスタムドメインを設定する

# はじめに
Google Cloud PlatformのApp Engineにカスタムドメインを設定した備忘録です。
今回は[お名前.com](https://www.onamae.com/)で購入したドメインを設定します。

## 参考サイト
- [公式App Engineのカスタムドメインのマッピング](https://cloud.google.com/appengine/docs/standard/python3/mapping-custom-domains)

## 読むと良さそうな方
筆者DNSとかは多少勉強した程度で、いざ設定しようとしたら分からなったという背景があります。
そのくらいの知識の方向けになりますので、分かってる方には退屈かと思います。

## 前提
- App Engineを使用してすでにアプリケーションを作成している方
- [お名前.com](https://www.onamae.com/)で購入したドメインを持っている方
- 基本的には**参考サイト**を読めば進められますが、私は躓いたので、そこを説明していきます。

## 躓いた点
参考サイトの[ここ](https://cloud.google.com/appengine/docs/standard/python3/mapping-custom-domains#dns-config)で躓いた
![dns-config.jpg](https://qiita-image-store.s3.amazonaws.com/0/262838/1daea7e2-7b0a-8377-f6d6-2fd519d6b59a.jpeg)
正直な話、**まともに読まず**にやってしまったことが原因。

### 手順
以下の手順で進めていきます
1. お名前.comに遷移してもらう
2. お名前.comでDNSのレコードを登録する

#### 1. お名前.comに遷移する
上記画像の手順は、[お名前.com](https://www.onamae.com/domain/navi/dns_manage/select)で行う
以下のページまで遷移していただきたい。
ログイン → 上記ヘッダーの**ドメイン設定** → 左サイドバーの**DNS関連機能の設定**
でたどり着きます。
![dns-use.jpg](https://qiita-image-store.s3.amazonaws.com/0/262838/bb33fab9-f6a3-a82e-9c2e-bfed2c3cb5c6.jpeg)
この操作で躓いた点の画像の
「a. ドメイン登録機関でアカウントにログインしてから、DNS設定ページを開きます。」
の対応が完了します。

#### 2. お名前.comでDNSのレコードを登録する
以下の作業は躓いた点の画像の
「b. ~~~」の作業になります。
ざっくりいえば、提示されたレコードを登録しておいてね、ということ。
App Engine側で開かれていると思いますが、以下の画像のところを開いてください。
![gdns-config.jpg](https://qiita-image-store.s3.amazonaws.com/0/262838/349e5d48-7fea-673f-2beb-3580d2685414.jpeg)
上記画像の赤枠に値する部分（自分のApp Engine側で出力されている内容）を、以下の画像を参照に入力してください。
![odns-config.jpg](https://qiita-image-store.s3.amazonaws.com/0/262838/fb747fe3-ac3c-12b6-02bb-b7236c46c647.jpeg)
ホスト名には、赤枠の`alias`の欄に書いてある内容を入力します
TYPEには、赤枠の`Type`と一致するものを選択します
TTLは、デフォルトのままで良いです。
Valueには、赤枠の`Data`の欄に書いてある内容を入力します
状態は、デフォルトのままで良いです。

## 終了
これで作業完了です。
稚拙な文章を読んでくださり、有難う御座いました。
お疲れ様です。