OmniAICreator/Qiita-1.07M huggingface dataset:
【No.3】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b

#【正規表現キーワード】設定でござんす
:star:赤で囲まれた部分を設定でござんす。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/58885a22-1f18-5ce3-f0cd-3ae03b0ad5a3.png" width=50%>
:sparkles:ここで私的に慎重にポイント(;´･ω･)
「インポート」を押下する。
そして、**「【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」の「【確認】設定の前に」**で行った「C:\Program Files (x86)\sakura\keyword」の中にある「Ruby.rkw」を選択します。
「正規表現」の隣の四角に「/defined\?/k」なっているのをご確認を！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/29ee5d8c-869f-787d-c023-cdecb4320d1d.png" width=50%>
では！次へ参りまするぞ！(; ･`д･´)

#【カラー】設定忘れてはいないさ！
:star:「共通設定」を押下するのさ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/9d53d3fa-c42c-8e88-fa66-3bba2c6316c9.png" width=50%>
:star:「セット追加」を押下して、「セット名」を**「Ruby1」**にしてOKなのさ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/1312b254-27c2-612b-0d26-cda47da17609.png" width=50%>
:sparkles:ここで私的に慎重にポイント(;´･ω･)
セット名」が「Ruby1」になっているのを確認し、「インポート」を押下する。
そして、**「【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」の「【確認】設定の前に」**で行った「C:\Program Files (x86)\sakura\keyword」の中にある「Ruby1.kwd」を選択し「OK」を押下します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/df07637d-6112-4de9-96a5-a917d268696c.png" width=50%>
っていう作業を「Ruby4」「Ruby4.kwd」までを行うのさ。
そしたら下記のように「セット名」のところが「Ruby1」「Ruby2」「Ruby3」「Ruby4」
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/423bcdf0-7caa-3f7f-dff9-1fc1ab627e0c.png" width=50%>
:sparkles:ここで私的に慎重にポイント(;´･ω･)
「セット名」がそろったのを確認し、「インポート」を押下する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/c6ce8fe1-9ea8-3f8b-93e0-ee8ed876470c.png" width=50%>
そして、**「【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」の「【確認】設定の前に」**で行った「C:\Program Files (x86)\sakura\keyword」の中にある「Ruby.col」を選択し押下します。
:star:「強調キーワード1」を「Ruby1」にセットし「2~10…」を押下するのさ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/43a4a249-74f2-af35-fc14-e60b78772e27.png" width=50%>
そして、「強調キーワード1」は「Ruby1」と各選択し「OK」を押下するのさ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/211911e5-0a57-5a54-372d-d1ba8c4c93a3.png" width=50%>
:star:「コメントスタイル」の「ブロック型(F)」「=begin」、「~(T)」「=end」を入力するのさ。
「行型(M)」「#」を入力して「OK」を押下するのさ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/248438/9be31984-7a43-7f9a-7577-7b7549b11e1c.png" width=50%>
これで設定がすべて完了なのさ(。-`ω-)

#【おわり】チャンチャン♪
自分用のメモとして書いたので
ニュアンスがわかりにくい部分が多々あると思います(((・ω・;)))ﾌﾞﾙﾌﾞﾙ

無責任になってしまいますが、わからなかったらググって…

「サクラエディタ」の説明として**「【No.1】 ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」の「【確認】設定の前に」**で行った「C:\Program Files (x86)\sakura\keyword」の中にある
「Ruby-readme.txt」をみてちょーよ(●´ω｀●)

エディタは「サクラエディタ」以外にもたくさんあるので
いろいろ試す価値はあります！！

今回「サクラエディタ」を紹介した理由としては
4月といえば、サクラの季節だなと思い:cherry_blossom:

以上、**「ｻｸﾗｴﾃﾞｨﾀでRubyの設定をしてみた(=ﾟωﾟ)b」**でした。
Java 9環境でNetBeans 8.2が動かない問題の解決法

# NetBeans 8.2はJDK9環境では動かない！
2018.4.12執筆時点で最新安定版であるNetBeans 8.2はJDK 9に対応していないため正常に動作しません。
起動はするもののプロジェクトを開いても何も表示されないので使い物になりません。

Nightly版を使うことで一応はJDK9環境でも動きますが、StackOverFlowでの評判はあまりよくないのでおすすめしません。
[Nightly版ダウンロードリンク](http://bits.netbeans.org/download/trunk/nightly/latest/)

# 素直にJDK8を使う
## JDK８が入っていない人はダウンロード
Macの方は　

```
/Library/Java/JavaVirtualMachines/
```

ここに1.8.x系のディレクトリがあるかどうかを調べることで確認できます
入ってなかった場合は以下のリンクからダウンロードしてください。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

## NetBeansを動かすJDKを指定する
環境変数`JAVA_HOME`を編集してJDK8をメインにしても問題ありません。
[MacでのJAVA_HOME設定](https://qiita.com/seri_k/items/e978c1339ce51f13e297)
NetBeansでだけJDK8を使いたい場合は以下のように設定してください。
Macの方は 

```
/Applications/NetBeans/NetBeans 8.2.app/Contents/Resources/NetBeans/etc/netbeans.conf
``` 
を編集します。

```
# netbeans_jdkhome="/path/to/jdk"
```

とコメントアウトされてるところを解除し、自分のJDK8ディレクトリの `Contents/Home` のパスを指定してあげます。　
例:

```
netbeans_jdkhome="/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home"
```

これで動くようになります。
エクセル参照式の行列番号を出力する。

1個しか対応していません。複数個の対応があれば、教えて下さい。

```VB
'Input-------
'(1,1)=123
'(1,2)=RC[-1]
'Output------
'iR=1
'iC=1
Sub aTest()
    Dim iOutR As Long
    Dim iOutC As Long
    Call セル参照式の行列番号(1, 2, iOutR, iOutC)
    MsgBox "iOutR=" & iOutR & ",iOutC=" & iOutC
End Sub
Sub セル参照式の行列番号(iInR As Long, iInC As Long, iOutR As Long, iOutC As Long)
    Dim moji As String
    moji = Cells(iInR, iInC).FormulaR1C1
    iOutR = REGEXP(moji, "(\D*)(\d*)(\D*)(\d*)", 2 - 1)
    iOutC = REGEXP(moji, "(\D*)(\d*)(\D*)(\d*)", 4 - 1)
End Sub
```
(使用)REGEXP
Excelのワークシート関数で正規表現を使う(Exce,ExcelVBA)
http://qiita.com/ktyubeshi/items/74228f18498224c7427d
Visual Studio Codeのメモ

vscodeの統合ターミナルでwslのbashを使用する

ユーザー設定を開く
![1.png](https://qiita-image-store.s3.amazonaws.com/0/35364/d72fccf2-0871-5039-3425-c7d4995ac411.png)

"terminal.integrated.shell.windows"の値を"C:\\Windows\\System32\\bash.exe"に書き換える
![2.png](https://qiita-image-store.s3.amazonaws.com/0/35364/3d3d5082-b7ea-9b8d-3f2c-3d8afc73ae4f.png)

ターミナルがbashになります
![3.png](https://qiita-image-store.s3.amazonaws.com/0/35364/a6ba0657-3354-f5c7-0ce0-bb15ff39b6d0.png)
Windows7 で Rust の diesel (sqlite3) のサンプルを動かす

rustc 1.25.0
cargo 0.26.0
diesel 1.2.1
SQLite 3.23.1
Visual Studio 2015

Rust で Windows native アプリに挑戦してみました。動かすものは Diesel のホームページにある[サンプル](http://diesel.rs/guides/getting-started/)です。ただしこれは PostgreSQL 用なので Sqlite に書き直します。なお SQLite 用に書き直したものも Diesel の [Github](https://github.com/diesel-rs/diesel/tree/1.0.x/examples/sqlite/getting_started_step_2) には置いてあります。

# WinHTTP のパッチ

Windows7 では TLS の問題があって[cargo が git clone に失敗する](https://github.com/rust-lang/cargo/issues/5066)ので[公式のパッチ](https://support.microsoft.com/en-us/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-a-default-secure-protocols-in)を当てます。自分の環境では Easy fix の項から Download して実行するだけでした。(registry を書き換えてくれます。)

# sqlite3.lib のインストール

SQLite の[公式ページ](https://www.sqlite.org/download.html)から win64-x64 バージョンをダウンロードします。解凍すると dll と def が入っているので以下のコマンドで lib を作ります。

```
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\lib.exe" /DEF:sqlite3.def /MACHINE:x64 /OUT:sqlite3.lib
```

生成された sqlite3.lib をホーム以下 `~/.rustup/toolchains/stable-x86_64-pc-windows-msvc/lib/rustlib/x86_64-pc-windows-msvc/lib` にコピーします。

# Tutorial の実行

後は基本的に [Diesel の tutorial](http://diesel.rs/guides/getting-started/) の通りできると思います。[この記事](https://qiita.com/techno-tanoC/items/4ca564bd1ea8db409496)も参考になると思います。
また[この記事](https://www.reddit.com/r/rust/comments/65fo0q/installing_diesel_cli_on_windows_10_woes/)によると Windows10 でも同じ方針でうまくいくようです。
Ken Thompson 2011年のインタビュー

2011年、KenとDennisが日本国際賞を受賞したときのインタビュー
http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480

- Unixの最初の2,3版はKenが一人で作った
- Dennisはエヴァンジェリスト、C言語、I/Oシステムを担当
- それ以外は全部Kenがやった
- `mail`と`writ`というインスタント・メッセンジャー的なプログラムを使って毎日共同作業していた
- お互いにコードレビューなどはしなかった。二人共よいコーダーだったから
今すぐにGoogleアシスタント対応アプリを作るべき3つの理由

# 背景

Google Homeが発売されて、それに伴いGoogleアシスタントを使ったアプリも注目されつつあるのかなと感じています。
現在仕事でスマートスピーカーを扱っているのですが、調べれば調べるほどに面白く、しかも簡単にアプリが作れることがわかりました。
本記事では、今すぐにGoogleアシスタント対応アプリを作るべき3つの理由についてまとめたいと思います。
ただし、ツール等の詳細な説明は省略させていただきます。記事の最後に参考URLを載せるので、そちらを参考にしてください。

# 1.簡単に作れるので、完成（リリース）まで早くたどり着ける

Googleアシスタント対応アプリを作るためには、「[Actions on Google](https://developers.google.com/actions/)」というプラットフォームを利用する必要があります。
そして、その中にある開発ツールに、「[Dialogflow](https://dialogflow.com/)」と呼ばれる開発ツールがあります。
これが本当に素晴らしいツールで、ノンプログラミングかつGUI操作で簡単に複雑な対話モデルが作れちゃいます。
複雑なことをしようと思うと、サーバ側の実装が必要な場合もあり、その際はプログラミングせざるを得ないですが、あくまで任意であるため、簡単なアプリを作るのであればサーバは必要ありません。
簡単に作れるということは、それだけリリースも容易にできるということです。

# 2.リリースされているアプリ数自体少ない

「[Google アシスタント アシスタントの機能](https://assistant.google.com/explore?hl=ja_jp)」を見ると、まだまだアプリ数自体少ないので、競合することもそんなにないかと思います。
今やGoogle Playなんかで他と被らないアプリを作るのは至難の技ではないかと。。
他と被らない、まったく新しいアプリをリリースするなら今がチャンスです！

# 3.コストがほとんどかからない

前述したとおり、サーバを必要としないのであれば実質無料で作れちゃいます。

# まとめ

最近注目されつつあると思われる、Googleアシスタント対応アプリ。
まだ出てきたばかりでもあるので、作ってリリースするなら今がチャンスだと思います。
リリース経験はそうそうできることではないと思っているので、個人開発でリリース経験積めるのは財産になりますよ。
実は僕も今アプリをリリース作業真っ最中で、数時間程度で完成させることができました。もし審査が通ったらまた報告したいと思います。

(2018/04/13 追記)
審査無事通りました！
「[妖怪 笑い袋](https://assistant.google.com/services/a/uid/0000002f26a76e99?hl=ja&source=web)」というアプリです！

# 参考URL

本記事を読んで興味を持ってくださった方は、ぜひ以下の記事も参考にしてみてください。

- Dialogflowについて

[Dialogflow入門](https://qiita.com/kenz_firespeed/items/0979ceb05e4e3299f313)
[Google Homeアプリをリリースしてみた(実装編)](https://qiita.com/miso_develop/items/bc22d55788c025c32c39)

- リリースについて

[Google Home向け子供の育児日記アプリを作ってみた〜申請とリジェクトから得られた知見〜](https://qiita.com/megadreams14/items/98fbf6c5990ef5a42ffa)
[Google Homeアプリをリリースしてみた(申請編)](https://qiita.com/miso_develop/items/c56fd334f333160a9130)
ethers.jsの概要、実装方法

#ethers.jsとは
公式ドキュメントでは以下のように書かれています。
https://docs.ethers.io/ethers.js/html/
>*This library is designed to make it easier to write client-side JavaScript based wallets, keeping the private key on the owners machine at all times.*

また、下記ブログではこんなことも書かれています。
https://medium.com/l4-media/announcing-ethers-js-a-web3-alternative-6f134fdd06f3
>*In short, ethers.js is an alternative to web3, the most commonly used library for ethereum applications.*

#特徴
以下のような特徴を持っています。

- ノードから独立したwallet機能をもつ。クライアント側に閉じた状態でアドレスの生成・復元などができる。
- web3でできることは基本的に全てできる(らしい)ので、webの代替となる。
- ライブラリ単体でBIP39&BIP32に対応したウォレットを作成できる。
- Fallback Provider、ENSの設定などをデフォルトでサポートしている。

#ウォレットの生成方法
以下の5つの方法でウォレットが生成できます。

- Private Key
  - 既存のPrivate Keyから復元したウォレット。
- Mnemonic Phrase
  - 既存のMnemonicから復元したウォレット。
- Random Wallet
  - cryptoモジュールのrandomBytesを用いてランダムに生成されるウォレット。
- Secret Storage Wallet (e.g. Geth or Parity)
  - ノードで生成されるkeystoreより復元されるウォレット
- Brain Wallet
  - 任意のidとパスワードからハッシュを作成してPrivate Keyとするウォレット。クラックされる危険性があるため非推奨とされている。

#実装方法
web3.jsとehters.jsの実装方法を比べてみます。
(TypeScriptで必要最低限の実装をしています。)
###1. web3.jsの場合
```typescript
import Web3 from 'web3';
import { default as contract } from 'truffle-contract';

export class Web3Service {
  private web3: Web3;

  // 初期化
  constructor() {
    this.web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/<your-api-key>'));
    // or
    // this.web3 = new Web3(window.web3.currentProvider);
  }

  // コントラクト取得
  public getContract(abi: any, address: string): any {
    return new this.web3.eth.Contract(abi, address);
  }

  // ウォレット作成(ランダム)
  getNewWallet(): any {
    return this.web3.eth.accounts.create();
  }
}
```

###2. ehrers.jsの場合
```typescript
import * as ethers from 'ethers';

declare const web3: any;

export class EthersService {
  private currentProvider: any;

  // 初期化
  constructor() {
    const providers = ethers.providers;
    const network = providers.networks['mainnet'];

    const web3Provider = new providers.Web3Provider(web3.currentProvider, network);
    const infuraProvider = new providers.InfuraProvider(network, '<your-api-key>');

    this.currentProvider = new providers.FallbackProvider([ web3Provider, infuraProvider ]);
  }

  // コントラクト取得
  getContract(abi: any, address: string): any {
    return new ethers.Contract(address, abi, this.currentProvider);
  }

  // ウォレット作成(ランダム)
  getNewWallet(): any {
    return ethers.Wallet.createRandom();
  }
}
```

#懸念点
- その他ライブラリでweb3に依存しているものが存在する場合は、ethers.jsだけでは完結できず結局web.jsが必要になるのでは。
- WebSoketモードで起動しているノードに対応していない。(issueには上がっている。)
  - https://github.com/ethers-io/ethers.js/issues/141



---
<参考>
https://medium.com/@julien.m./what-is-an-ethereum-keystore-file-86c8c5917b97
https://security.srad.jp/story/16/02/16/0641240/
Nano Pi debian linuxをStretchにVersion upする方法

NanoPI標準のdebianはjessieです。これをstretchにVupする方法を紹介しましょう。
超簡単です。
# backup
こういう大きな改造を行う時は、先ず動いている状態をmicroSDごとbackpしましょう。
基本です。
# /etc/apt/sources.list を書き換える

```
deb http://ftp.jp.debian.org/debian/
 stretch main
deb-src http://ftp.jp.debian.org/debian/
 stretch main

deb http://security.debian.org/debian-security
 stretch/updates main
deb-src http://security.debian.org/debian-security
 stretch/updates main

\# stretch-updates, previously known as 'volatile'
deb http://ftp.jp.debian.org/debian/
 stretch-updates main
deb-src http://ftp.jp.debian.org/debian/
 stretch-updates main
```

# 後処理
書き換えただけでは何も起こりません。
apt update
apt upgrade
apt autoremove
オペレーションはこれだけですが、途中色々と聞いてきます。分からなければ基本全部defaultの改行で行けます。分かる方はそれなりに。

# 結論
極めて簡単ですが、時間がかかります。
JPのstretchを指定してますので、cnのサーバーは使わなくなりより高速に、update出来るようになります。
ArchlinuxでGoogle ChromeとChromiumの比較

突然ですが、僕の推しブラウザはChromeです。
ArchliuxでもChromeを使おうと思ったのですが、いろいろパッケージがあり、なにをどうすればいいかわからなかったのでまとめました。

# パッケージ

- chromium
- chromium-beta
- chromium-dev
- chromium-snapshot-bin
- google-chrome
- google-chrome-beta
- google-chrome-dev

chromium以外はAURです。
元々Google Chromeは、オープンソースである`Chromium`と、Google固有の機能などを追加した`Google Chrome`の２つが存在します。

Google Chrome = Chromium + α です。
ただ、Google Chromeはクローズドソースです。
ChromiumでOSS開発をし、自分たちに重要なものはクローズで追加する、頭の良い開発方法を取っています。

# Google ChromeとChromiumの主な機能差分

Google ChromeでできてChromiumでできないこと

- Flash Playerの再生・実行
- AAC, H.264, MP3の再生
- PDFビューア(v37からchromiumにも追加されました)
- サンドボックス機能
- クラッシュレポート
- コンテンツ保護系
- 同期機能

ある程度、ブラウザに機能を追加するプラグインが権利の関係で同梱されていないことが原因です。
同期機能自体は、Googleのサーバーを使っていることが原因です。
Google ChromeにはGoogleのサーバーにアクセスするためのAPIキーが埋め込まれていますが、Chromiumは自力ビルドなためありません。

※ただ、ArchのAURにあるchromiumは解析されたAPIキーが入ってるらしいです

自力でFlash Playerの実行とPDFビューワ、コンテンツ保護系を追加するには、以下のパッケージをインストールします。

- pepper-flash 
- chromium-libpdf (※今は要らない)
- chromium-widevine

# API系

ブラウザ本体に機能を追加する「プラグイン」ですが、Google Chrome、Firefoxなど、ブラウザによってAPI規格が異なりますが、ある程度共通化されています。

Google Chrome : PPAPI
Firefox ： PPAPI, NPAPI(flash playerのみ)

Flash playerの対応するパッケージは以下です。

PPAPI用のFlashplayer： `flashplugin`
NPAPI用のFlashplayer： `pepper-flash`

# さいごに

よほどのことがない限り、`google-chrome`パッケージを使うことをおすすめします。
ただ、自分は新しいもの好きなので、一日一回ビルドされる`chromium-snapshot-bin`を使っています。人によって最適なChromeを選びましょう。
KubernetesをHeapster + InfluxDB + Grafanaでモニタリングする

Heapsterでメトリックスを取得し、そのメトリックスをInfluxDBへ保存し、Grafanaでモニタリングします。
このように書くと大変に思えますが、Kubernetesだったらポンとインストールすれば出来上がります。

### Kubernetesクラスタにインストールする

注意： このインストールは本番環境ではなく開発環境でお試し下さい。

#### 1, まず適当なディレクトリにheapsterをgit clone

```bash
$ git clone https://github.com/kubernetes/heapster.git
```

#### 2, GrafanaのService TypeをNodePortにする

```bash
$ cd headpster/
# grafana.yamlを編集し、type: NodePortにする
$ vim deploy/kube-config/influxdb/grafana.yaml

# 以下のようにする
$ git diff
diff --git a/deploy/kube-config/influxdb/grafana.yaml b/deploy/kube-config/influxdb/grafana.yaml
index 0bd35728..266f47ab 100644
--- a/deploy/kube-config/influxdb/grafana.yaml
+++ b/deploy/kube-config/influxdb/grafana.yaml
@@ -64,7 +64,7 @@ spec:
   # or through a public IP.
   # type: LoadBalancer
   # You could also use NodePort to expose the service at a randomly-generated port
-  # type: NodePort
+  type: NodePort
   ports:
   - port: 80
     targetPort: 3000
```

#### 3, Heapster, InfluxDB, Grafanaのリソースを作成

```bash
$ kubectl apply -f deploy/kube-config/influxdb/
deployment "monitoring-grafana" created
service "monitoring-grafana" created
serviceaccount "heapster" created
deployment "heapster" created
service "heapster" created
deployment "monitoring-influxdb" created
service "monitoring-influxdb" created

$ kubectl apply -f deploy/kube-config/rbac/heapster-rbac.yaml
clusterrolebinding "heapster" created
```

`kubectl get all -n kube-system`をうって Heapster, InfluxDB, Grafanaのリソースが作成されていることを確認する。

#### 4, Grafanaへアクセス

`$ kubectl describe svc monitoring-grafana -n kube-system | grep NodePort:`で表示されるportとnodeのIPを使ってアクセスする

最初はこんな画面が表示される。
`Add Users`と表示されているが別にユーザ作成しなくてもよい。
![スクリーンショット 2018-04-12 22.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/14124/2850cb7d-a43d-9ecd-5e6e-329f442f73bb.png)

上のHomeをクリックして、Clusterを選ぶとこんな画面が表示される。

![スクリーンショット 2018-04-12 22.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/14124/824ede46-3179-a838-07e6-031eb1a4f01d.png)


上のHomeをクリックして、Podsを選ぶとこんな画面が表示される。

![スクリーンショット 2018-04-12 22.36.02.png](https://qiita-image-store.s3.amazonaws.com/0/14124/20744de2-1c44-a2e7-80a8-36a9620ad423.png)


簡単にカッコいい画面がみれて気分がいいですね。

### Minikubeにインストールする

Minikubeの場合はさらに簡単です。addonsが提供されているので、以下ですみます。

```
# インストール
$ minikube addons enable heapster

# minikubeならHeapster addonを有効にした時点でInfluxDBもGrafanaも有効になる

# 画面をみる
$ minikube service monitoring-grafana -n kube-system
```


### kubectl topコマンドを使ってリソースの使用量を確認してみる

Heapsterをインストールすると`kubectl top`コマンドを使ってリソース(CPU/Memory/Storage)のメトリックスが見れるようになります。

```
$ kubectl top pod
NAME                    CPU(cores)   MEMORY(bytes)
nginx-8b8ddbf99-z7vtl   0m           1Mi

$ kubectl top node
NAME           CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
k8s-master     213m         10%       2801Mi          36%
worker-node1   132m         6%        2386Mi          30%
```

Heapsterをインストールしたばかりのときに`kubectl top`コマンドを使うと
`error: metrics not available yet`と表示されるかもしれません。その場合はしばし待ちましょう。


### 参考

https://github.com/kubernetes/heapster
Bibtexで参考文献を書くときに日本語と英語混ぜるのどうしてる？


# 日本語のフォーマットと英語のフォーマットを別々にしたい時に参考文献を自動生成できるか？

## 目的
英語文献はIEEEの表記にして，日本語表記は学会の指定のものにしたい。
IEEEを指定しまうと，日本人の名前を変なふうに省略されてしまう問題がある。

## 解決手段
できてないです。
ご意見募集です。

# 自分の環境と現状の対策

- platexとpbibtexを使用。（これで日本語がコンパイル可能）
- bstファイルはieiceのものを使用。（使ってみて一番違和感が少ない（電気学会民））
- windows環境（PPTとかも一緒に作るし執筆は基本windowsで）

## クソダサ対策案

```tex
\bibliographystyle{tieice}
\bibliography{ref.bib}
```
と本文に入れて

```
pbibtex <ファイル名>
```
をコマンドラインで実行すればbblファイルが出てくる。

この中身の日本語の箇所を修正（具体的には名前の「姓・名」が「姓」だけになってるので名前を追加<ieiceの場合>）して`\begin{thebibliography}{10}`ごとコピペ。

日本語文献の引用が少ないならそれなりの効率性がある。提出前に変更すれば良い。
そうでない場合は…どうすればいいんだろうねぇ。
Kubeadm + Helm 使ってGitLab CIを試したい ② ～クラスタを作るの巻～

本当はAnsibleとか使ってプロビジョニングするのが良きなのでしょうが
そこまでまだ勉強できていませんということで，

愚直に，公式にそって入れていきます．
まず，Masterから．

## 早速暗雲

k8s公式のBefore you beginに，
 
- 2 GB or more of RAM per machine (any less will leave little room for your apps)
- 2 CPUs or more

とありますねぇ．まぁ．無視で．




## まずDocker入れる

公式に従って，下記コマンドでインストール．
これバージョン古い気がするけどいいのかな．

```
# yum install -y docker
```
ちなみにインストールされたDockerのバージョンは1.13.1・・・古い．．．(´・ω・`)
そのせいかdocker daemonを起動できません．SELinuxがpermissiveにもかかわらず．
仕方ないですね．Disabledにしましょう．
やりかたは[こちら](https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba)参照．
でようやくdocker daemonを起動します．

```
# systemctl enable docker 
# systemctl start docker
```

ちなみに初期のrootパスワードはいじってなければvagrantです．

## 次にkubeadmとkubeletとkubectlをインストールします．
まずリポジトリ登録から．

```
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
```

そして，インストールしてkubeletを起動します．

```
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
```

CentOS入れてるので下記の処理もやります．

```
# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
```

## 次にkubeadmでセキュアなクラスターを作ります．
ここで，公式通りにやると暗雲立ち込めたあの子たちのせいでエラーが返ってきます．
kubeletちゃんと動いてないよ`systemctl status kubelet`で見ろよと言われるので見る．

するとswapはサポートされてないよを言われる．
ふと，GitLab入れるときとかメモリ足りるか不安になりつつ，
下記のようにswapを無効化してkubelet daemonを再起動します．

```
# swapoff -a
# systemctl restart kubelet
```

そして，まだいろいろエラー来るので，下記のようにして黙殺．（良いのかはわからない）

```
# kubeadm init --ignore-preflight-errors all
```

## クラスターができたので，マスターノードの一般ユーザーから，ノードの管理（kubectl）ができるようにする．

ちなみに，`kubeadm init`するとセキュアなクラスターができます．それがkubeadmのポリシー．
なので，デフォルトでRBACがオンになっている．

まずは`kubeadm init`したときに結果が出力されているので，その通りにやります．
出力結果はどこかにメモしておくのが吉かもしれない．

```
# exit
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

これで，kubeadm 使って，vagrantユーザーからクラスタの管理ができるようになりました．

こっからNode間のネットワークのためのツールを入れてようやくNodeをjoinさせられるけど
力尽きました．

また明日改めて書きます．
Amazonで2000円で売ってたJPEGカメラの動作確認

AmazonでJPEGエンコーダ付きのカメラ[0.3MピクセルシリアルJPEGカメラモジュール](https://www.amazon.co.jp/gp/product/B071F72N71/)が2000円で売っていたので，まずは動作を確認．
詳細情報はメーカーの[Webサイト](https://www.dfrobot.com/wiki/index.php/0.3M_pixel_serial_JPEG_camera_module_（SKU：SEN0099）)を参照するとわかる．
UART経由でコマンドやりとりして写真データを取り込むことができるみたい．OmniVisonの（やや）面倒なレジスタを叩かなくていいのは手軽で嬉しい．

## 撮れる画像
640x480
![img3.jpg](https://qiita-image-store.s3.amazonaws.com/0/25342/ffa892cd-03fd-fcd3-151a-8624bde37518.jpeg)
320x240
![img2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25342/6dcaa044-74f0-8f39-7f4e-93b6106b52ba.jpeg)
160x120
![img1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25342/9154aef3-fb07-6054-9cbd-9a70634b371d.jpeg)

## 取得時間
画像取得にかかった時間の計測結果はこんな感じ．

| 画像サイズ     | 時間   | ファイルサイズ
|------------|------:| ------:| 
| 640x480     | 10.0秒| 60KB 
| 320x240     | 3.42秒| 18KB
| 160x120     | 1.21秒| 6.8KB

転送速度がデフォルト（かつ最大）の115200bpsで使っているので，640x480の画像サイズを割ってみると4.2秒くらいは覚悟する必要がある．としても結構かかっているなあ．JPEGなので，圧縮がかかる画像ではファイルサイズはもっと小さく，取得時間も短くなるけど．

## 次は
ラズパイ+ラズパイカメラでお手軽に写真撮影できるので，Python使える環境でこのカメラをわざわざ使うということは，あまり考えられない．ESP-WROOM-02とかと組み合わせてみようかな，とか思っています．

## 動作確認用のコード
UARTはPyserial経由のPythonでアクセスするのが便利．というわけでこんな感じのコードを.

```python:camera_reader.py
import sys
import time
import serial

class CameraReader:

    def __init__(self, dev):
        #self.ser = serial.Serial(dev, timeout=1, baudrate=115200)
        self.ser = serial.Serial(dev, timeout=1, baudrate=115200)

    def snapshot(self, mode):
        if mode < 1:
            mode = 1
        elif mode > 3:
            mode = 3
        d = bytes([0x55, 0x48, 0x00, 0x30+mode, 0x00, 0x02, 0x23])
        self.ser.write(d)
        s = self.ser.read(4)
        s = self.ser.read(10)
        data_length = (s[6] << 24) + (s[5] << 16) + (s[4] << 8) + s[3]
        packages = (s[8] << 8) + s[7]
        return data_length, packages

    def read_image(self, data_length, packages):
        d = b''
        for i in range(packages):
            cmd = bytes([0x55, 0x45, 0x00, ((i+1) & 0xFF), ((i+1) >> 8) & 0xFF, 0x23])
            self.ser.write(cmd)
            s = self.ser.read(4) # ack
            self.ser.read(3) # 'UF<ID>'
            self.ser.read(2) # package id
            s = self.ser.read(2) # len
            len = (s[1] << 8) + s[0]
            s = self.ser.read(len)
            d += s
            s = self.ser.read(2) # crc
        return d

    def close(self):
        self.ser.close()

if __name__ == '__main__':
    args = sys.argv
    if len(args) < 3:
        print("usage: {0} device output".format(args[0]))
        exit(0)

    mode = 3
    if len(args) > 3:
        mode = int(args[3])
    
    reader = CameraReader(args[1])
    start = time.time()
    a,b = reader.snapshot(mode)
    d = reader.read_image(a,b)
    elapsed_time = time.time() - start
    with open(args[2], "wb") as fout:
        fout.write(d)
    print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```
Android Studioで初めてjavaを使用した感想と疑問

#初めに

---
授業でjavaを初めて触ってきました。
（オブジェクト指向？インタフェース？何だそれは…('ω')……うん？）
はっきり言って全く分からなかったです。
学んでいくにつれて色々な疑問や成果物をブログに挙げていくのでご指摘などくれるとうれしいです。

#開発環境

``OS:Microsoft Windows Windows10(64bit)``
`IDE:Android Studio`

#javaを触れた感想&疑問
---
基本的にはＣ＃によく似ている！

クラスやメソッドなどあるので見た目はよく似ています。
（~~文字が違うだけでやることは一緒じゃないのかとも思ってしまった~~）

ただ個人的にここは似ているのかどうかわからないと感じた部分は
**インタフェース**です。
インタフェースとは後から使うものを先に簡単に作っておいて、それを後でimplementで呼び出して使うものだと
自分は認識しました。もし間違っていたらご指摘お願いします！(´Д⊂ヽ
後疑問に思ったのは、androidアプリ側で、ボタンをクリックするとメッセージボックスが出るようにしたかったのですが
C#のように**MessageBox.show**みたいに、一行でメッセージボックスを出せるようなクラスやメソッドはないのかな？
と思いました（笑）

#まとめ
---
***オブジェクト指向を学ぶならこの言語が最適だと感じました***
まだ触れて一日なのでまだ何も理解できていない状態ですが、C言語とはまた違った考え方なので
着実に力をつけれると感じました。
他の理由としては、現在企業などでも主流になっているプログラム言語のひとつなので習得しておくと、就職の幅も
広げれると思います。

#最後に
---
少しだけですがjavaに触れて簡単なプログラムを組みました
>今日作成したプログラム
>>
```csharp:MainActivity.Java
package com.websarva.wings.i_raimu.helloandroid;
import android.content.Context;
import android.os.PowerManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    @Override
    //起動時に実行されるメソッド
    protected void onCreate(Bundle savedInstanceState) {
        //親クラスのonCreateメソッドを呼び出す
        super.onCreate(savedInstanceState);
        //レイアウト情報を設定する
        setContentView(R.layout.activity_main);
        //ボタンクラスのインスタンス生成
        Button button = MainActivity.this.findViewById(R.id.button);
        //ボタンのイベントリスナーの設定
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            //ボタンクリック時のイベント
            public void onClick(View view) {
                Log.i("lightbox","ボタンがクリックされました");
            }
        });}
}
```
Jetson TX1にROS Kineticをインストールしてみた

## 環境
- Jetson TX1
- JetPack 3.2
- ROS Kinetic

## インストール
```
$ git clone https://github.com/jetsonhacks/installROSTX2.git
$ cd installROSTX2
$ ./installROSTX2
```

以上笑。
聞いたことがある認証について調べてみた

OAuth以外の聞いたことがあったり、たまに使ったりするやつ。
なんとなくわかれば良い程度のメモ。
インフラはさっぱりなので思うところがあればコメントください。

Basic認証とDigest認証はブラウザ認証で、他はサーバー間認証だと思いますが、
Kerberosはサーバー間認証なのかはっきりとはわかりませんでした。[HTTP 認証方式](https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/understanding-http-authentication)この中にKerberosもいるのが気がかりでした。IEならできるとかなんとか？

# [Basic認証](https://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC)

> HTTPで定義される認証方式の一つ。基本認証と呼ばれることも。Basic認証では、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信する。このため、盗聴や改竄が簡単であるという欠点を持つ

平文なので安全ではない。
SSLにすれば問題ない。

# [Digest認証](https://ja.wikipedia.org/wiki/Digest%E8%AA%8D%E8%A8%BC)

> HTTPの認証方法の一つ。ユーザ名とパスワードをMD5でハッシュ（ダイジェスト）化して送る。Basic認証では防げなかった盗聴や改竄を防ぐために考案された。

MD5なので安全性は高くない。
SSLにすれば問題ない。

# [LDAP認証](http://www.infraexpert.com/study/security19.html)

> LDAP（Lightweight Directory Access Protocol）は、Active Directoryのようなディレクトリサービスにアクセスするためのプロトコル。クライアントはTCPポート番号389を使用してLDAPサーバに接続を行い属性（個人名や部署名）で構成するエントリ（関連属性のまとまり）の検索、追加、削除の操作をします。

LDAPサーバーに登録された情報で認証する。
LDAPサーバーにアカウント持たせることでまとめてユーザ管理できて楽。

平文なのでLDAP通信にはSSLやKerberosを使ったりする。

[Difference between SSL and Kerberos authentication?](https://stackoverflow.com/a/111931)

SSL化するとLDAPSになる。（ldaps://）

[LDAPS](http://e-words.jp/w/LDAPS.html)

> LDAPによりサーバとクライアントの間で送受信される利用者や機器の設定情報などを暗号化して安全にやり取りすることができる。通常のLDAPはTCPの389番ポートを使用するが、LDAPSは標準的にはTCPの636番ポートを使用する。

# [ケルベロス認証](http://www.infraexpert.com/study/security18.html)

> サーバとクライアント間の身元確認のために使用するプロトコルです。Kerberosはクライアントとサーバとを相互認証できるだけでなくデータ保全のためにクライアントとサーバ間の通信を暗号化します。

> ケルベロス認証では、ユーザが正しいユーザIDとパスワードをAS（Authentication Server）に送信して認証に成功するとTGS（Ticket Granting Server）からチケットと呼ばれるデータを受け取れます。ケルベロス認証はこのチケットを認証に使用しています。サーバはアクセスしてくるユーザがアクセス権を持っているかどうかをユーザIDとパスワードではなくチケット（ クライアントのID、タイムスタンプ、有効期限を含む ）を使用して確認します。認証時にチケットを使用することでアカウント（ユーザ ID、パスワード）の漏洩を防いでいます。

シングルサインオンに適している。

# [SAML認証](http://www.cybernet.co.jp/onelogin/function/saml.html)

> 異なるインターネットドメイン間でユーザー認証を行うための XML をベースにした標準規格です。

シングルサインオンを実現する。
ユーザー認証はIdentity Provider側で行う。（LDAPサーバーみたいなもの）
ブラウザ別、一行での両端揃えの方法

一行の文で右端と左端を揃えたデザインにしたい場合に使う方法が、ブラウザごとに違ったためまとめました。


<img width="215" alt="スクリーンショット 2018-04-12 21.24.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/237008/10dfbbce-3194-ab40-d50f-d572b774ec1b.png">
やりたいのはこうゆうこと。
右端と左端が縦に揃っているでしょう。

## chrome, firefox
``text-align-last: justify;``
をつける。

```html
<ul>
  <li>なす</li>
  <li>とまと</li>
  <li>きゅうり</li>
</ul>
```

```css
ul {
  width: 100px;
}
li {
  text-align-last: justify;
}
```

## IE,edge
日本語のように空白文字で区切らない言語はtext-align(-last)だけだと均等にならない。
``text-justify:inter-ideograph``をつける必要がある。
``text-justify``はIEが独自での採用したもので、``inter-ideograph`` を指定すれば日本語・中国語・韓国語の文字間隔を調整して両端揃えにしてくれるそうです。

```html
<ul>
  <li>なす</li>
  <li>とまと</li>
  <li>きゅうり</li>
</dl>
```

```css
ul {
  width: 100px;
}
li {
  text-align-last: justify;
  text-justify:inter-ideograph;  
}
```

## safari
safariではまだ``text-align: justify;``がうまく効いてくれません。なので、少しめんどくさい方法を取る必要があります。
一文字一文字をspan で囲って、親要素に`` display:flex;``と``justify-content: space-between;``をつける。

```html
<ul>
  <li>><span>な</span><span>す</span></li>
  <li><span>と</span><span>ま</span><span>と</span></li>
  <li><span>き</span><span>ゅ</span><span>う</span><span>り</span></li>
</ul>
```
```css
ul{
  display:flex;
  justify-content: space-between;
}
```

##まとめ
基本的にsafariは対象ブラウザになるかと思いますので、両端揃えをしようと思うと一番下の作業が必要になります。
結構な手間なので、文字数があまりに多い場合はデザイン自体を考え直した方が良いかもしれません。
CUIRPGを作ってみた

# 【前置きというか本題】
派遣SESからweb系に転向する為にサーバーサイド言語のキャッチアップとかをしてたりするが、そういえばゲームチックな奴って結構題材になるけど作ってなかったなって思い短期間で作成。
https://github.com/lunalice/cuirpg/tree/master/cuirpg

![イメージ149.jpg](https://qiita-image-store.s3.amazonaws.com/0/241708/33a9d64e-86be-9ad0-e0a8-5da8d213b906.jpeg)

![イメージ150.jpg](https://qiita-image-store.s3.amazonaws.com/0/241708/8360d707-784d-182b-947c-dcabb78c5c94.jpeg)

よくある感じのRPGなので暇なら遊んで下さい（？）
バランス調整はなされてないし、本当はjarにしてかちょかちょ出来るようにしたかったけども出来きれず。改良してもいいですよよよ。

お話させて頂いている企業様がゲーム系で何か作った事はあるかという問いにハっとなり作ったんですが、作っていく度に属性とかあったらいいなーとか、職業追加したいなーとか、もっとランダム性持たせたいとか、パーティーにしたいとか、いろいろ要件が溢れて来て時間さえあれば延々と作ってそうだったので区切りがいい所でストップ！！！

実は2種類ほど作りたいゲームの構想があって心の中で秘めてるんですが、行けると思った時に作ろうかと思います。プラットフォームはandroidかなぁ。

# 【最近のキャッチアップとか思う事とか】
平行でpythonをやりつつちょっとしたゲーム開発ノウハウ（というかロジック）が見につきそうな参考書を買ったのでやってみる事に（選定基準はなるべくさくっとやり切れるもの）。参考は以下
12歳からはじめるゼロからのpython

為になる事とならない事があって、為にならない事はpythonの言語的な仕様を学ぶなら上の参考書は凄くお勧め出来ません。他言語やった事ある人ならifとかforとか変数とかメソッドとかとかはわかってるはずなのでみんなのpythonとかはじめてのシリーズとかそっちの方が凄く為になる。（断言

為になる事は、2DMAP操作とノベルアドベンチャーのよくあるロジックがあって凄く為になった、これこれ！！ゲーム開発ノウハウってこういうので、情報集めて基礎力上げて新しいものの糧にしていかないとと思いました。

python自体については事前に動的型付けのRubyやってたお陰かjavascriptかじってたお陰かしらないけど結構とっつきやすそうな印象を受けました。土日とか使ってみんなのpythonやります。。。あ、プロRubyは読み終わって次Railsに入ります。ちらっと見た限りplayでやった流れなのでRubyがかけるかが勝負になります。

WEBアプリとかに必要なものを思いつく限り上げると、
サーバーサイド知識（Ruby、java、python、php、いろんなフレームワーク）
フロントサイド知識（html、css、js、いろんなフレームワーク）
データベース（RDB、NoSQL）
セキュリティ各種
web＋httpサーバー運用
git
テスト自動化
言語特有のライブラリ知識
業界特有ノウハウ

素人目から見てこれくらいは入りそう。かなり膨大。
しかもエンジニアはここからも更に進化する知識について行かないといけないんだけど、
給料ってPMとかコンサルとかより低いですよね・・・（白目

簡単な言語で取っ付きやすい頃と違って覚える範囲が広くなりすぎてる為、給与体系で言えばアメリカみたいにエンジニアファーストにならないと永遠にIT技術者なんて増えないよなぁって思う、まぁその為には下請け構造がなくならないと上げようもないと思うんですがね！！年功序列体系とエンジニアがマッチしてないねせやね。

それはおいといて、転活が無事終わったらUnity（+#）やろうと思ってます。
ゲーム業界なら間違いなく使うと思うし知的好奇心がとまらんぬ。
ちなみにスキル不足で結構落ちてます！！負けないんだから！！

ご清聴ありがとうございました。
Gitで管理していたコードをコミットログを引き継ぎつつSubversionに移行する

GitからSubversionに移行する際のメモです。（※SubversionからGitに移行する手順ではないです。）

事前準備
----------

- 予め、svn上にプロジェクトの構成を作っておく（rev1になるはず）。
- gitリポジトリ上は変更がない状態にしておく
- gitリポジトリが存在するディレクトリをマルっとコピーしておくと、ミスったときに多分安心です。

今回はmasterブランチで作業するものとします。

手順
------


手元のgitリポジトリの場所に移動

``` bash
cd path/to/gitrepo
```

`git svn init`で初期化。このとき、trunkまで指定しておく。また、認証情報があれば、`--username`も指定。

``` bash
git svn init --username "SVNユーザ名" "svn://svnhost/repos/project/trunk"
```

最新の変更を取得。

``` bash
git svn fetch
```

(確認) 変更を取得したことで、SVNのリモートブランチが作成されているか確認。

``` bash
# remotes/git-svnブランチが作成されていること
git branch --all
 
# masterとremotes/git-svnのコミットが**繋がっていない**状態であること
git log --all --graph
```


ここの時点で`git svn dcommit`すると、以下のようなエラーが出るはず。

> Unable to determine upstream SVN information from HEAD history.

状況とエラー内容から察するに、masterブランチ上にsvnに関する情報(remotes/git-svnが指し示すコミット)がないため、何をcommitするのか判断できないのだと思う。

そのため、remotes/git-svnにmasterの内容を付け足した形にする。
（作業はmasterブランチとして行われるので、元々のコミットが失われる可能性がある。）

``` bash
git rebase --onto git-svn --root master
```


(確認) git-svnにmasterの内容が繋がっている状態であること。

``` bash
git log --graph
```

問題がなければ Subversion へコミット。

``` bash
git svn dcommit 
```

(確認) git-svnとmasterが同じコミットを指している状態になっていること。

``` bash
git log --graph
```

(確認) svnのログも良い感じになってること

``` bash
git svn log
```

以上です。お疲れ様でした。


トラブルシューティング
------------

### SubversionのURLを間違えたので、`git svn init` をなかったことにしたい

多分他にやり方がありそうですが、すぐに見つからなかったので、私は以下の3つのコマンドを流して仕切り直しを何度かやってました。

自己責任で。

```
rm -f .git/refs/remotes/git-svn
rm -rf .git/svn
vi .git/config
# [svn-remote "svn"] の列とその項目(url,fetch)を削除
```

これで再度 `git svn init` が通るようになります。


### git rebaseの操作を間違えて変な結果になったので前のmasterの状態に戻したい

前のmasterのコミットIDがわかれば`git reset --hard コミットID`で無理やり戻せます。

コミットIDがわからない場合は、`git reflog`で直近のmasterへのコミットを探してreset。

reflogで分からない場合はご愁傷様です。
要素を見えなくするcssプロパティの違い（display,opacity,visibility）

## はじめに
要素を見えなくする操作は結構いろんなところで使うと思うのですが、
今までなんとなーくで使っていたので、頭の整理のためにもまとめてみました。

## 説明
### 比較プロパティ
  - ``opacity: 0;`` ...要素の透明度を指定する際に使用
  - ``visibility: hidden;`` ...ボックスの表示（visible）・非表示（hidden）を指定する際に使用
  - ``display: none;``  ...要素の表示形式を指定する際に使用
 
### 比較方法
- 1,cursor:pointerをつけた時のカーソルの変化
- 2,jQueryでonメソッドを使ったクリックイベントの取得
- 3,isメソッドで(':visible')を指定した時の結果
- 4,要素自体がレイアウトに与える影響の有無

## 結果

| プロパティ     | 1.cursor変化 | 2.クリックイベント取得 | 3.:visible判定 | 4.レイアウト影響 |
|:-----------------:|:------------------:|:------------------:|:------------------:|:------------------:|
| opacity: 0 | ○ | ○ | true | ある  |
| visibility :hidden | × | × | true | ある  |
| display: none| × | × | false | ない  |

## opacity: 0
- 1,cursor: かわる
- 2,jsクリックイベント:　とれる
- 3,:visibleでの判定:　true
- 4,レイアウト:　高さ、幅がある

**解説**
透明になるだけ。クリックやホバーなどのイベントは発火するので、視覚的に見えなくするだけの時や、イベントはとりたいが要素を表示させたくない時などに使用。

**jQueryでの指定方法**
fadeIn();
fadeout();

## visibility :hidden
- 1,cursor: かわらない
- 2,jsクリックイベント:　とれない
- 3,:visibleでの判定:　true
- レイアウト:　高さ、幅がある

**解説**
要素によってイベント発火はさせたくないけど、レイアウトも変えたくない時に使用。
ただし逆に残った高さや幅が無駄な空白の原因になることも。

**jQueryでの指定方法**
独自のものはないため、cssメソッドで指定
css('visibility','hidden'); 
css({'visibility':'visible'});

## display: none
- 1,cursor: かわらない
- 2,jsクリックイベント:　とれない
- 3,:visibleでの判定:　false
- 4,レイアウト:　高さ、幅がない

**解説**
高さや横幅などもないものとみなされ、次の要素がつまる。領域が確保されない（開発者ツールでは存在するし、JSで高さはとれる）
高さ幅も消してしまいたい時に使用。

**jQueryでの指定方法**
.hide();
.show();
iOSでアプリ内のデータってどうやってみるの？

##はじめに
アプリ内で写真を撮影したり、ログを書き出したりして、あ〜どんぐらいのサイズなのかなぁ。。中身どうなってんのかなぁ。。見たい！ってなった時。
Androidとかなら保存先をstorageに変更するなり、[run-as パッケージ名とかしてアプリ内のファイルを覗くことができる](https://qiita.com/nambara/items/f1b36e5b47e0ebccd4d3)のです。が、iOSだとそう簡単にはいかない:cry:でもこんな感じで中身を確認できたよ！！ステキ！ってお話です。
**※Xcodeでビルドしたアプリが対象です。**
※使用したXcodeのバージョンは9.2です
##手順
1. Xcodeを起動
2. 確認したいアプリが入っている端末を接続
3. メニューバー(?)にある**Window** から:point_down_tone2:のように**Devices and Simulators**を選択

![window.png](https://qiita-image-store.s3.amazonaws.com/0/176805/5a5f4034-fb92-1cf1-8f3e-1933b9dc650c.png "window")
　そうすると:point_down_tone2:のように表示されます。
![device simulator.png](https://qiita-image-store.s3.amazonaws.com/0/176805/da34121a-2d02-b1d5-ea85-189ac0c56def.png "devices and simulators")
4. 中身を確認したい端末のアプリを選択（写真では「■■■のiPad」の「namapp」を選択しています）
5. 選択している状態で歯車マーク（設定ボタン？）を押下
　:point_down_tone2:が表示されます
![download container.png](https://qiita-image-store.s3.amazonaws.com/0/176805/832d8cfb-e998-59f0-72d8-bcb39307fa51.png)
6. 写真のように**Download Container**を押下
7. ダウンロード先を指定していざダウンロード:ok_woman_tone1:
##どうですか。。。
iOSだと
/var/mobile/Containers/Data/Application/（XXX）/Documents/
に保存したファイル/写真たちがいます。
見えましたよね！こういう風にXCodeを使うんだなぁといった感じです。
pathとか中身がどんな感じで見えるのかも後ほど追加でまとめようと思います！

##追記(2018/04/26)
コメントで教えていただいた二つのアプリを使おうと試みました。（Win10PCにて）
iFunbox:4.0 Preview → 権限がないということでクロームでダウンロードが解決せず
　　　　3.0 → ダウンロードできたが、一向に端末を認識せず、、（あと、文章がカタコトだった）
iTools:ダウンロードしようとしたところ、ウイルスバスターでブロックされました、、、
うーん。
やっぱりXcodeで見るのが安心なのかな、といったところです。
Swift3.0からSwift4.0で何が変わった？

Swiftの新バージョン、Swift4.1が2018年03月29日にリリースされましたね。

これまでSwift3.0の学習をしていたのですが、Swift4系になることでどのように変わったのか自分なりに調べましたので纏めたいと思います。
~~（新しいもの好きなもので・・・）~~
今回は中でも気になったものを抽出してご紹介いたします。

#整数値の比較

Swift3.0までは整数同士を比較する場合でも、型が違えばエラーとなっていました。

それがSwift4.0では型規制が緩くなり、整数同士の比較であればエラーにならず比較演算が行われるようになりました。

```Swift
var i: Int    = 10
var i32: Int  = 10
var ui: Int   = 10
var ui32: Int = 10

// Swift3.0ではIntとInt32の比較になるため、エラーで実行できない
if i == i32 {
    print("OK")
}

 // Swift3.0ではUIntとUInt32の比較になるため、エラーで実行できない
if ui == ui32 {
    print("OK")
}
```

ただし、これはあくまで比較する場合のみだそうで、計算時には型をそろえる必要があるようです。


#JSONが扱いやすくなった

Swift3.0ではライブラリを導入するか、Apple標準フレームワークの`JSONSerialization`を使用して解析する方法しかありませんでした。

実際私もAPIとの連携にJSONを使用しているのですが、記述量が多く厄介な印象を持っていました。ｗ

それがSwift4.0では`Codable`というプロトコルが新しく追加され、そのプロトコルを用いることで以前よりJSONの解析が簡単になりました。

```json
{
    "name": "hoge",
    "type": "fuga",
    "age": 22,
    "birthday": "1995/01/01"
}
```

このようなJSONを解析したいとします。

そのために、受け口となる構造体を`Codable`を用いて作成します。

```User.swift

// CodableプロトコルがFoundationに内包されているためImport
import Foundation

// Codableプロトコルを使用して構造体を定義
struct User: Codable {

    let name: String
    let type: String
    let age: Int
    let birthday: String

}

```

次にJSONの解析ですが、以下の処理で完了です。

```Swift

var json = XXXXX
var user = try! JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)

```

これでもうあとは使い放題です（？）

```Swift

print(user.name)
print(user.type)
print(user.age)
print(user.birthday)

```

あと実際に試せていませんが、JSONがネストしている場合にも対応しているため、今まで通り使えそうな印象ですね！

私もSwift4.xを使ったアプリを作成するときに率先して使ってみようと思います。


#で、4.0→4.1の変化は？

Swift4.0でのソース互換性が改善されたり、コアな部分の品質改善が行われているようです。

ほとんど開発者が意識するような変更はないのかなと思いますが、
一部Map系のメソッドが非推奨やリネームされたりしているようですので、
注意すべきはそのあたりかなと思います。


#さいごに

今の時代、OSにしろ言語にしろ、アップデートが頻繁に行われますね。
頑張って覚えたことがもうすでに古い情報だったりするので、都度アンテナを張って最新の情報を取り寄せていきたいと思います。
一新しい物好きとして！！！！

ではでは。
CryptoZombiesで学ぶSolidity基礎

https://cryptozombies.io/
写経しながらポイントについて追っていくメモです。ここではレッスン１の範囲のみサポートします。

## Solidityのバージョン宣言

必ずバージョン宣言である `version pragma` でコードが始まらなければならない。
コンパイラのバージョンによるコード破壊を防ぐため。

```
pragma solidity ^0.4.19;
```

## コントラクトの作成

Ethereumで動作させるために作成するコントラクトは、class定義のような形式で記述する。

```js
contract ZombieFactory {
  // ...
}
```

## 状態変数

ブロックチェーン上に書き込まれる変数。

```js
contract ZombieFactory {

  uint dnaDigits = 16;
  uint dnaModulus = 10 ** dnaDigits;

}
```

## 構造体

複雑な型定義をつくるために`struct`を使用する。

```js
struct Zombie {
  string name;
  uint dna;
}
```

## 配列

括弧内の有無で、固定長配列・可変長配列が決まる。
ブロックチェーン上における可変長配列の場合、いくらでも格納できるためデータベースのように扱うこともあるらしい。

また、`public`宣言をすると自動的にgetterが作成されて、他コントラクトからも読めるようになる。（書き込みはできない）

```js
// 固定長配列
uint[2] fixedArray;

// 可変長配列
uint[] dynamicArray;

// 構造体を使って定義するpublicな可変長配列
Zombie[] public zombies;
```
```js
// Zombie構造体を持つ配列「zombies」に、Zombie構造体で生成したデータを追加
zombies.push(Zombie(_name, _dna))
```

## 関数

`function`で関数宣言ができる。引数にあたるパラメータ変数は同時に型を宣言します。
`public`か`private`を同時に宣言します。コントラクト内からしか呼ばれない場合はプライベートにしましょう。
（パラメータ変数名や、プライベート関数名にはアンダースコアをつけるのが通例らしい）

```js
function _createZombie(string _name, uint _dna) private {
  // ...
}

function createRandomZombie(string _name) public {
  // ...
}
```

### 戻り値

戻り値がある場合は、`returns (type)`を宣言します。

```js
string message = "Hello World!";
function hello() private returns (string) {
  return message;
}
```

### 修飾子

#### view

view修飾子がある関数は、状態の変更を行いません。そして、状態変数の参照が可能です。

```js
uint data = 99;

function showData() public view returns (uint) {
  return data;
}
```

#### pure

pure修飾子がある関数は、状態の変更も参照も行いません。受け取った値しか使いません。

```js
function _multiply(uint a, uint b) private pure returns (uint) {
  return a * b;
}
```

## Keccak256

EthereumにはSHA-3の一つであるハッシュ関数`keccak256`が組み込まれています。ランダムな256ビットの16進数へマッピングします。

```js
uint rand = uint(keccak256(_str));
```

## イベント

ブロックチェーン上で発生した事象を、コントラクトからアプリケーションへ伝えることができる。
あらかじめイベントの定義をしておき、処理が実行されたときに伝えたい値と共に呼び出す。

```js
event NewZombie(uint zombieId, string name, uint dna);
```
```js
function _createZombie(string _name, uint _dna) private {
  uint id = zombies.push(Zombie(_name, _dna)) - 1;

  // eventをemitで叩く
  emit NewZombie(id, _name, _dna);
}
```

## web3.js

https://github.com/ethereum/web3.js/

コントラクトとフロントエンドでやりとりをするための**web3.js**というライブラリがあります。
コントラクトから発行されたイベントを購読して、Webアプリ上にブロックチェーンの変更を呼び出すことができます。

```js
// JavaScript

// 注）ここよりも手前にコントラクトと接続するために準備が必要だけど割愛
const ZombieFactory = ZombieFactoryContract.at(contractAddress)

$("#ourButton").click(function(e) {
  const name = $("#nameInput").val()

  // public関数へ画面上からデータを投げる
  ZombieFactory.createRandomZombie(name)
})

// NewZombieイベントを購読
const event = ZombieFactory.NewZombie(function(error, result) {
  if (error) return

  // eventで定義した名前のObjectで取得できる
  const result = {
    id: result.zombieId,
    name: result.name,
    dna: result.dna
  }
})
```
気づけばプロ並みPHP　ショッピングカート作りにチャレンジ！＃４【日記】(2018-04-12)

PHPでデータをやり取りして画面を遷移させたり分岐させる手順を実行中。
phpだけ書いたファイルをはじめて作った。
今日は途中までで終わりそうなので後日また続きを
2018年4月頃に行うVSCode/MarkdownでCSSが変更できない

# 前提
- Windows。
- VSCodeのMarkdownプレビューで見れる知識と技術と財産を持ってる。
- `基本設定`という単語で反応できる。
- `markdown.styles`も知ってる。ここにパスを書けばＯＫというのも知ってる。
- 後ででいいからワークスペースを作る知識。


## こうすると
MarkdownのCSS変えようとして、`基本設定`の`markdown.styles`を変える。
- `"C:\\hoge\\hoge.css"`
- `"C:/hoge/hoge.css"`
- `"'C:\\hoge\\hoge.css'"`
- `"'C:/hoge/hoge.css'"`
- `"file:///C:/hoge/hoge.css"`
- `"file:///C:\\hoge\\hoge.css"`
- ...

## こうなるよエラー
`markdown.stylesが読みこめません`

## こうすると通る
1. **ワークスペース**を作る。
2. `基本設定`を開く。
3. `ワークスペースの設定`があるからそこに書いてあるパス以下にhoge.cssファイルを置く。
4. `ワークスペースの設定`に書いてあるパスがルートと思いこむ。それより上は行けないと思い込む。
5. `markdown.styles`に`"hoge.css"`と書く。
 この場合、ワークスペースフォルダの直下に置いたhoge.cssに反応する。


## なにがいけなかったのか
- MarkdownのCSSパス設定。実はワークスペース以下しか見ない仕様。
- ワークスペース直下がルートディレクトリになっている為、Windowsのドライブルートに戻る事すら許されない。


## 必要だった知識
- ワークスペース
- settingへの設定方法等
    - `ユーザー設定`
    - `ワークスペースの設定`
    - `フォルダーの設定`(ワークスペースに登録したフォルダが対象)
- **公式ドキュメントの存在**
- 普通にググってもトップに公式ドキュメントは出てこない。
    - トップにはQiitaが占拠してるからね、仕方ないね。
小数の分母推定器を作ってみた

```c:est_den.c
/**
 * Estimate denominator of a floating point number
 *
 * @code
 * extern void
 * do_something(
 *     double const x)
 * {
 *     int const den = est_den(x);
 *     int const num = (int)rint(x * den);
 *
 *       :
 * }
 * @endcode
 */
extern int
est_den(
    double const x)
{
    double f = fabs(x) - (int)fabs(x);
    int a[10] = {0}, i;

    for (i = 0; (i < (int)(sizeof(a) / sizeof(0[a])) - 2) && (1e-9 <= f); ++i)
    {
        f = 1.0 / f - (a[i] = (int)(1.0 / f));
    }
    if (1e-9 <= f) { a[i++] = (int)rint(1.0 / f); }
    for (a[i] = 1; 1 < i; --i) { a[i - 2] = a[i - 2] * a[i - 1] + a[i]; }
    return a[0];
}
```
```c:test.c
extern int
main(
    int const argc,
    char const * const argv[])
{
    (void)argc; (void)argv; /* unused */

    #define TEST(x_) \
        do \
        { \
            double const x = x_; \
            int const den = est_den(x); \
            int const num = (int)rint(x * den); \
            double const y = (double)num / den, diff = x - y; \
            \
            printf("%24.16e --> %8d/%8d = %24.16e (diff %24.16e)\n", x, num, den, y, diff); \
        } while (0)

    TEST(1.161558109833972);
    TEST(1.0);
    TEST(3.14159265358979323846);
    TEST(0.5 * (1.0 + sqrt(5.0)));
    TEST(577.0 / 867.0);
    TEST(1.000);
    TEST(2.333333333333333);
    TEST(0.800);
    TEST(1.600);
    TEST(0.900);
    TEST(1.900);

    return 0;
}
```
```:output
  1.1615581098339720e+00 -->     1819/    1566 =   1.1615581098339720e+00 (diff   0.0000000000000000e+00)
  1.0000000000000000e+00 -->        1/       1 =   1.0000000000000000e+00 (diff   0.0000000000000000e+00)
  3.1415926535897931e+00 -->  1146408/  364913 =   3.1415926535914038e+00 (diff  -1.6107115641261771e-12)
  1.6180339887498949e+00 -->      144/      89 =   1.6179775280898876e+00 (diff   5.6460660007306984e-05)
  6.6551326412918110e-01 -->      577/     867 =   6.6551326412918110e-01 (diff   0.0000000000000000e+00)
  1.0000000000000000e+00 -->        1/       1 =   1.0000000000000000e+00 (diff   0.0000000000000000e+00)
  2.3333333333333330e+00 -->        7/       3 =   2.3333333333333330e+00 (diff   0.0000000000000000e+00)
  8.0000000000000004e-01 -->        4/       5 =   8.0000000000000004e-01 (diff   0.0000000000000000e+00)
  1.6000000000000001e+00 -->        8/       5 =   1.6000000000000001e+00 (diff   0.0000000000000000e+00)
  9.0000000000000002e-01 -->        9/      10 =   9.0000000000000002e-01 (diff   0.0000000000000000e+00)
  1.8999999999999999e+00 -->       19/      10 =   1.8999999999999999e+00 (diff   0.0000000000000000e+00)
```
2018年 Java 手軽にマイクロサービスを作れるお勧めライブラリ


## 概要

`Java`でマイクロサービスを実装する際に利用するお勧めのライブラリを紹介したいと思います。
今回は以下の３点を前提条件としてライブラリを選択しました。

* `HTTP`で送受信する`RESTful API`のマイクロサービスを対象とする
* 導入コストや学習コストを抑えるため、手軽に使えるシンプルなライブラリとする（フルスタックは対象外）
* デファクトスタンダードや利用実績の多いライブラリとする

![stackJava.jpg](https://qiita-image-store.s3.amazonaws.com/0/195748/53625629-db0a-d371-6229-e82c2ab7ba81.jpeg)

### Spark Framework

* [Spark Frameworkで簡単マイクロサービス！](https://qiita.com/5zm/items/0332250e5d2775198242)

### Gson / Jackson

マイクロサービスでは複数のサービスと連携して動作するためメッセージのやり取りが発生します。その際に重要となるのがフォーマットの変換です。
`Java`（オブジェクト）と`Json`の変換が多いと思いますが、他のライブラリでも多々利用されている（サポートしている）のが[Gson](https://github.com/google/gson)と[Jackson](https://github.com/FasterXML/jackson)の２つです。
どちらでもお好きな方をどうぞ。
ただし、スタックとして例えばあるライブラリが`Jackson`を利用している（依存関係にある）のに、`Gson`を利用するのは同一の目的（フォーマット変換）のライブラリとして二種類が含まれることになるので好ましくありません。スタック全体として見るとこの場合は`Jackson`を選択すべきでしょう。

### Bean Validation

専用のアノテーションを付与することで入力チェックを行う`Bean Validation (JSR-303)`が簡単です。
`Bean Validation`は仕様のため、利用する際は実装ライブラリが必要になります。
実装ライブラリとして[hibernate-validator](http://hibernate.org/validator/)が有名なので、これを利用することをお勧めします。

**（注意）
`Java EE`サーバで動作される場合、`Bean Validation`の実装はサーバにもあるため`hibernate-validator`を利用しない選択肢もあります。
今回は通常のJavaプロセスでも動作するマイクロサービスを考慮して`hibernate-validator`を紹介しています。**

（2018/6/10 追加）

* [Bean Validationで簡単入力チェック！](https://qiita.com/5zm/items/89b7198cab74f2d0f4a1)

### Sql2o

* [JavaのSql2oで簡単データベースアクセス](https://qiita.com/5zm/items/e1f615e1729b3a9f70ba)

### Feign

* [インターフェースだけでAPIクライアントを実装するFeignがすごく便利！](https://qiita.com/5zm/items/f7a48e80ad5ba4316748)

### Jedis

キャッシュとして`KVS(Key Value Store)`を利用する場合が増えてきたかと思います。
`KVS`の中でもよく使われるのが`Redis`で、そのJavaクライアントとして有名なものが[Jedis](https://github.com/xetorthio/jedis)になります。

### Paho

`MQTT`のクライアントとしては[Paho](https://www.eclipse.org/paho/)が有名です。
`Java、.net(C#、VB.net)、Python`等々の様々なプログラム言語用のライブラリを提供しています。
（私は`Java`以外のプログラム言語でも、`MQTT`を利用する場合は`Paho`を利用しています）
薄いRailsプロジェクトを rails new する

検証やバッチ用途などで最小限の `rails new` をしたくなることがあるので
そういうときのための自分のための手順録

## 前提条件

* Mac環境
* bundlerは導入済み（未導入の方は[こちら](https://qiita.com/shinkuFencer/items/3679cfd966f6a61ccd1b)をご参考に）

## 導入手順

### railsの準備

bundlerでRailsを入れるだけの `Gemfile` を用意します。

```sh:下準備
$ bundler init
$ vi Gemfile
```

```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# 今回は5.1.0
gem "rails", "5.1.0"
```

```sh:bundler実行
$ bundle install --path vendor/bundle
```

### rails newの実行

```sh:railsnewの実行
bundle exec rails new --database=mysql -B -M -P -C -S -J --skip-yarn --skip-coffee --skip-turbolinks ./sample_app
```

|オプション|効能|
|---|---|
|`--database=mysql`|データベースの指定、今回はmysql.|
|`-B`|bundle installを最初はかけない。newしたあとに追記などを行うことがあるので指定。|
|`-M`|action mailerのセットアップをスキップ。|
|`-P`|puma関連のファイルセットアップをスキップ。|
|`-C`|action cable関連のセットアップをスキップ。|
|`-S`|[sprockets](https://github.com/rails/sprockets)関連のセットアップをスキップ。|
|`-J`|javascript関連のセットアップをスキップ。|
|`--skip-yarn`|[yarn](https://yarnpkg.com/lang/ja/)のセットアップをスキップ。フロント実装をしないなどであれば付ける。|
|`--skip-coffee`|[CoffeeScript](http://coffeescript.org/)のセットアップをスキップ。|
|`--skip-turbolinks`|[turbolinks](https://github.com/turbolinks/turbolinks)のセットアップをスキップ。|

### その他のオプションが知りたい

```sh
$ bundle exec rails new -h
```
はじめてのRailsアソシエーション【1対多】


#はじめに
Railsのアソシエーションについて調べたことをまとめます。
ここでは、SNSのようなサービスを例に「1対多」の関係を考えていきたいと思います。

#アソシエーションとは
**アソシエーション（association）＝関連付け**

Railsでのアソシエーションとはモデル同士のつながりのことを指します。
モデル同士を関連付けておくと、関連するモデル同士のデータの操作が簡単になるメリットがあります。

##関連付けることのメリット
ここで例にあげたSNSのようなサービスでは「ユーザー」と「投稿」を関連付けておくと下記のようなメリットがあります。
これらは関連付けされた時に追加されるメソッドを利用して実現できます。

- 「ユーザー」を削除した時にそのユーザーの「投稿」も全て削除できる
- 新しく「投稿」を作成した時、自動で「ユーザー」との関連付けをおこなう
- 「投稿」や「ユーザー」に関連付く内容を簡単に取り出せる
 - 「ユーザー」の持ってる「投稿」の数はいくつか(空か)
 - 「ユーザー」の持ってる「投稿」の検索 など

#ユーザー と投稿の関係
SNSではユーザーが何らかの投稿をしますが、

- ユーザーは複数の（0個以上の）投稿ができます。
- 1つの投稿に対して投稿者として関連付くユーザーは1人だけです。

1人のユーザーに対して多数のツイートが関連付くこのような関係を、**「1対多」**の関係といいます。


#モデル同士で1対多の関係を関連付ける
モデル同士の関連付けをするためには、お互いのモデルに関係性の記述が必要となります。

##テーブルに外部キーを追加する
「多」側は「1」側に従属する関係となり、この従属する側のテーブルに「外部キー[^1]」を追加する必要があります。
ここではpostsテーブルに"user_id"を追加します。
この"user_id"によって「ユーザー」と「投稿」が関連付けされます。

[^1]: 他のテーブルとの関連付けに使うキーのこと。外部キーには関連付けされた先の「主キー[^2]」が入ります。
[^2]: データベース作 成時に自動で付く「id」のこと。

##モデルファイルに関係性を記述する

1対多の関連付けをするためには下記2つを使います。

- belogns_to
- has_many

###belogns_to
「多」側に"belongs_to"を追加します。

```app/models/post.rb
class Post < ApplicationRecord
  belogns_to :user
end

```
postモデルに"belogns_to :user"と記述します。
モデル名と合わせて読むと、"post belongs to user"。直訳すると「ポスト（投稿）はユーザー属します」と読めます。
これで、投稿に対してユーザーが関連付きます。

###has_many
「1」側には"has_many"を追加します。

```app/models/user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :destroy
end

```
userモデルに"has_many :posts"と記述します（ポストは複数あるので「posts」と複数形にします）。
こちらもモデル名と合わせて"user has many posts"とすれば、「ユーザーには多くのポスト（投稿）があります」読むことが出来ます。
また、「dependent: :destroy」を追加すると、前述したユーザーを削除したときにユーザーの投稿も全て削除することができます。

#まとめ
関連付けすることによってデータの操作がわかりやすく、簡単になることが分かりました。
今回は1対多の関連付けについてまとめましたが、1対1、多対多の関連付けも存在します。
学習を進め気づいたことがあれば追記していきたいと思います。

---

参考：https://railsguides.jp/association_basics.html