OmniAICreator/Qiita-1.07M huggingface dataset:
MarkdownでMindmapを描く

# 概要

markmap-libというNodeライブラリーを使って、Markdownの箇条書きをMindmapのHTMLを簡単に変換できます。

Github: https://github.com/gera2ld/markmap-lib

下記の内容を変換すると、

```markdown
# Engineering Roadmap
## Frontend
### HTML
### CSS
### JavaScript

- Basic
- ES6
- TypeScript
- Frameworks
    - React.js
    - Vue.js
- Libraries
    - Material-ui

### SVG

## Backend
### Programming

- Python
    - Basic
    - Flask
    - ORM

### Server

- Nginx

## DevOps
### Docker

```

以下のイメージになります。

<img width="1639" alt="スクリーンショット 2020-04-11 17.59.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56886/62483ece-1c3e-3036-761a-a520d8c6e590.png">

# インストールと使用

```bash
# install
npm i markmap-lib -g

# markdown を作成
touch mindmap1.md
# Markdownを書く

# MindMapを作成
markmap mindmap1.md --output mindmap1.html
```


# 参考

https://github.com/gera2ld/markmap-lib
https://github.com/dundalek/markmap
すごいHaskellたのしく学ぼう! を学びなおしてみる(第2章、第3章)[with Elixir]

# はじめに
- 前回
    - [すごいHaskellたのしく学ぼう! を学びなおしてみる(第1章)[Elixir]](https://qiita.com/torifukukaiou/items/c85ec8e360b665981dc9)
- [Elixir](https://elixir-lang.org/)を使いはじめてだいたい1年くらいがたちました
- [すごいHaskellたのしく学ぼう!](https://www.amazon.co.jp/dp/4274068854/)という本を2015年に買って、一通り読んだあとずっと本棚にしまわれていたままでした
- 久しぶりに引っ張り出して読んでみると、こんなに愉快な内容だったけ！？　という感想を持ちました
- [Elixir](https://elixir-lang.org/)で関数プログラミングにだいぶ慣れたので、ユーモアの部分を楽しむ余裕ができたのだとおもいます
- 少しずつ読み進めながら、興味が向いたところだけ[Elixir](https://elixir-lang.org/)で書き換えてみたりして理解を深めていきたいとおもいます

# リストのパターンマッチとリスト内包表記
- タプルの2番目の要素が`3`のものだけに絞りこんで、1番目の要素を100倍して3を足したリストをつくります

## Haskell
```Haskell:
Prelude> let xs = [(1,3),(4,3),(2,4),(5,3),(5,6),(3,1)]
Prelude> [x*100+3 | (x,3) <- xs]
[103,403,503]
```

## Elixir

```Elixir:
iex> for {x,3} <- [{1,3},{4,3},{2,4},{5,3},{5,6},{3,1}], do: x * 100 + 3
[103, 403, 503] 
```
- [Elixir](https://elixir-lang.org/)でも同じような感じです

# asパターン
- firstLetterという関数は文字列をうけとって、`"The first letter of #{文字列} is #{先頭文字}"` を返します


## Haskell

```Haskell
Prelude> firstLetter "" = "Empty string, whoops!"
Prelude> firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x] 
Prelude> firstLetter "Dracula"
"The first letter of Dracula is D"
```
- 全体の文字列にもアクセスしたい場合に、Haskellでは `asパターン` というものを使うそうです 

## Elixir
- [Elixir](https://elixir-lang.org/)でも同じことをやってみましょう

```Elixir:awesome.exs
defmodule Awesome do
  def first_letter(<<>>) do
    "Empty string, whoops!"
  end

  def first_letter(<<x::8, _rest::binary>> = all) do
    "The first letter of " <> all <> " is " <> List.to_string([x])
  end
end
```

```Elixir:
iex> c "awesome.exs"
iex> Awesome.first_letter("Dracula")
"The first letter of Dracula is D"
```
- [Elixir](https://elixir-lang.org/)の場合は、パターンマッチさせつつ、その全体も欲しいときには、`<<x::8, _rest::binary>> = all` のように書きます
    - 文字列のパターンマッチってどうやるのかこの記事を書いている瞬間は知らなかったのですが、きっとできるのだろうとおもって[String](https://hexdocs.pm/elixir/String.html#content)のドキュメントを眺めていたら、[String and binary operations](https://hexdocs.pm/elixir/String.html#module-string-and-binary-operations) の内容でなんとなく理解しました
    - `x` は整数で得られたのでそれを文字列に戻す処理は、[[Elixir/OTP 20] Covert ascii/number to string](https://medium.com/@alxtz.tw/elixir-otp-20-covert-ascii-number-to-string-97f4e2751b93) を参考にしました

# まとめ
- [すごいHaskellたのしく学ぼう!](https://www.amazon.co.jp/dp/4274068854/)
- 題名の通り、楽しく学べています。
Synology(DS120j)でAtomicParsleyをインストールする方法

#なぜ必要になったか
youtube-dlで(--add-metadata --embed-thumbnail)？を引数として動画をDLするとyoutube-dlから必要だと言われたため。
#検索
https://blog.fat-nerds.com/dot-nerd/complie-atomicparsley-on-synology-for-metatagging-mp4/
このサイトが自分のやりたいことにマッチしていた。
しかしサイトに書いてある
```
ipkg install gcc
```
を行うと
-sh: ipkg: command not found
と返されてしまった...
#ipkgを使えるようにする
https://mariushosting.com/how-to-install-ipkg-on-synology-nas/
このサイトを参考にして進めていった。
![1コメント 2020-04-10 233947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617102/4cfb3562-b984-3571-d090-25c0816f3244.png)
![7コメント 2020-04-11 150600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617102/32782f59-7ccf-5492-ad8d-fd86fb2f771f.png)
-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
名前:CPHUB(何でもいい？)
場所:http://www.cphub.net
-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
を設定しEasyと検索し
![8コメント 2020-04-11 151330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617102/41387eed-75fe-5657-4b73-c401c545e885.png)
↑の画像のパッケージをインストール
そして
```
vi /etc/profile
```
を実行し
![9コメント 2020-04-11 151659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617102/04c77cc0-4029-7bce-29c2-daba777a7433.png)
`export PATH=$PATH:/opt/bin`を一番下に書き加える
エラーが出たら`:w !sudo tee %`を打ち込み対処しましょう！！
するとipkgが使えるようになりました！

#AtomicParsleyをインストールする
```
ipkg install gcc
ipkg install libstdc++
```
を実行しインストールする。
https://sourceforge.net/projects/atomicparsley/files/atomicparsley/AtomicParsley%20v0.9.0/AtomicParsley-source-0.9.0.zip/download
上のサイトは怪しいと思うかもしれないが公式サイトから行ったので正しいと思います(それでも怪しいと思う方は自分で調べていってみてください)
参考にしたのサイトのURLは使えなかったためDLして自分でエクスプローラーを使いzipを置きたいフォルダに配置することにする。
そして自分でフォルダに配置したらエクスプローラーを使い解凍する。
![10コメント 2020-04-11 152636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617102/88cbf2d5-aebf-fb8d-442b-36faf530b157.png)
ここでatomicparsleyが作られたのが2006年でありにGCC4.4以降でビルドしようとすると、エラーになってしまうらしい。
https://hiroaki.github.io/blog/2013/0727/build-atomicparsley-on-centos/
なので
パッチのこのサイトを開き→https://gist.github.com/hiroaki/6095214
https://youtu.be/qPmzjJyHAe0
↑この動画のように中身の修正を行ってください。
そしてコマンドラインでAtomicParsleyの中のbuildがある階層まで行ってください
![11コメント 2020-04-11 174219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617102/7b6cdb90-7cff-5e26-4d5a-2b7c926aa9b3.png)
そしてその場で
```
./build
```
をして`Linking AtomicParsley...`と出たら成功です！！
そしてその場で
```
pwd
```
を行い先程のようにパスを通します。
これでAtomicParsleyは動作します。
#筆者から
自分はこの記事の部分で3時間ほど消費してしまいました...全く同じ境遇の方にはこのような無駄(？)な時間を過ごしてほしくないと思いこの記事を作成させていただきました。質問などがあれば自分のできる限りであれば対応させていただきますのでよろしくおねがいします。
Sublime Text  初めてKeybindingsを設定する時は [  ] で囲まないといけないよ！

#はじめに
僕が良く使うエディタは**Visual Studio Code**と**Sublime Text**

で、このSublime Textはオリジナルのショートカットキーなんかを設定できる。
そんな時にいじるファイルが
`Default (Windows).sublime-keymap`もしくは`Default (OSX).sublime-keymap`

ここに設定を書いたのに、なぜかセーブ時にエラー&設定が反映されていない！って事で、結構困ってたのだが、一瞬で解決したお話。。。

#ショートカットキーを自分で作成してみよう
メニューの`Sublime Text＞Preferences＞Key Bindings`
<img width="421" alt="スクリーンショット 2020-04-11 17.46.08.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/da7c16cd-ee31-dd40-d0eb-dd38b7dba84d.jpeg">



`Default (Windows).sublime-keymap`という2つのファイルが開く。（Mac OSなら`Default (OSX).sublime-keymap`）
:point_down:こんな感じ

<img width="1249" alt="スクリーンショット 2020-04-11 17.45.44.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/14f19150-af10-2cb5-7111-560afe0580a7.jpeg">


##編集できるのは右側だけ
左側は元々の設定で編集できない。なので自作するショートカットキーは右側に書く。

今回は実際に僕が行った[Sublime Text でインデントが崩れないようにペーストする](https://m.designbits.jp/14080321/)をやってみよう。

右側に下記を追加

```
{ "keys": ["super+v"], "command": "paste_and_indent" },
{ "keys": ["super+shift+v"], "command": "paste" },
```


これでセーブしてみる。


## [  ]がないとエラー
<img width="417" alt="スクリーンショット 2020-04-11 17.20.26.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/72461c3a-2f95-dcf5-88b3-a3c05b97f31f.jpeg">

セーブしてもこんな感じのエラーが出て、設定が反映されないのである！
なんでやねん！

左側を見てみると
<img width="275" alt="スクリーンショット 2020-04-11 17.53.19.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/fef365d1-54e0-7385-eae9-0434162b2f38.jpeg">

**[ ] がある！！**

そう、[ ] が必要だっただけなのだ。でも大体のサンプルコードでは [ ] が省かれているので、この簡単なトリックに数時間も悩み続けた僕でした。。。:frowning2:

```
[
{ "keys": ["super+v"], "command": "paste_and_indent" },
{ "keys": ["super+shift+v"], "command": "paste" },
]
```

これが正解。
Restfulとはなにか（初学者自分めも）

#概要
Restfulとはなにかを調べました。

#※ご注意点
ご覧頂きありがとうございます。
初学者のため、内容について確実に正しいものでない可能性があります。
申し訳ございませんが、その点につきましてご了承ください！

#Restとはなにか
・REpresentational State Transferの略
・webの設計思想の一つ
・webサービスやwebAPIを作成するときにこれに則るといい

#仕組み
・特定のURLにHTTPでアクセスすると、XMLで記述されたメッセージが返ってくる

#設計思想
・同じURLからは常に同じ結果が返されるべき
・システムの状態やセッションに依存しない
　→プログラミング言語固有の拡張子やパスを含めない
　→メソッド名やセッションIDを含めない
・ステートレス
・統一インターフェース
　→すべてのシステムでURIとHTTPメソッドという同じインターフェースを使用する
　→GETでのアクセスはリソースの内容に影響を与えない
　→新しいURIを作成するときだけPOSTを使用する
　→リソース操作はCRUDのみにしてプロトコルをシンプルに


#ステートレスとステートフル
　・ステートフルなやりとりは完結
　　→サーバがクライアントの状態を保持
　・ステートレスは冗長
　　→クライアントが毎回情報を提供する必要がある
　　→webサーバが冗長されていたとき、各要求がどのサーバに振り分けられても対応できる

#Restfulとはなにか
・Restの規約に則ったwebサービスのこと

#Restのメリット
・アプリのリソースがURLで示せて、アドレス欄に入力したらその情報が得られる
・将来のシステム規模増大に対応しやすくなる→最大のメリット
・標準的なデータフォーマット（JSON、XML）を扱うことで他システムとの連携しやすくなる

#まとめ
・Restとはwebの設計思想の一つ
・Restな思想に従うことで、他のwebサービスとの連携がしやすくなる

#参考サイト
以下のページを参考にさせていただきました！
https://www.slideshare.net/MonstarLabInc/rest-ful-api?next_slideshow=1
[枯れたシリーズ] 枯れたプログラミング哲学(暫定版)

# はじめに
デベロッパーたちのバイブル
　　　↓↓↓↓
[こちらを参考にさせていただきました。](https://amzn.to/34li3Yb)

# プログラミング哲学

##応用性を考えて勉強する (vol.100)

### その1
問題や課題をオブジェクトとして分解し構造化や階層化するスキルは、何をするにも必須のスキルです。
むしろ、エンジニアはこのようなスキルや分析方法をマスターしていれば、もともと他業種一本でやってきた人々よりも有利な立場応用性を考えて勉強するにあるかもしれません。

### その2
最も汎用的な知識は、「勉強法」「リサーチ方法」「仮説検証」「改善」に関するノウハウです。
まず人生の序盤ではこの4つの知識を最優先で勉強するとよいかと思います。

### その3
また会話、プレゼン、経済なども、プログラミングとは直接関係ありませんが、フリーランスになって以降プログラミングの知識と組み合わせることで、 強いアドバンテージを生み出せる.



## Web技術の変化に適応し続けるには (vol.100)

### スキルセットの変化と向き合う
- クライアントサイドMVC
- 低速なネットワーク回線でも快適に動作するパフォーマンス
- サーバーサイドの理解がアプリケーションやツールの理解につながる
- 最先端の技術はどうしても淘汰されやすい
- 限られた時間を効率よく使うためにも、生き残る技術を選んで学ぶ


### なんのための技術なのかを知る
- React: HTMLを効率的に更新するという特徴, 引き換えにコストが多くなる, ユーザにダウンロードさせるライブラリのサイズも小さくない、適切に利用できなければ不要な描画処理によってブラウザの負担はむしろ大きくなる
- JQuery: 単純なWebページであればこっちのほうがよい
- 適切な技術を使う


### 変化へ適応する地力を身につける
- Webプラットフォームは常に過渡期にある
- トレンドに振り回されず、今そして未来の現場で最適な技術を選ぶ
- より良いコードを書き、より多くの課題をコードによって解決できるようになるには、よりたくさんのコードを読むしかない
- 各プログラミング言語には、解決するのが得意な課題がそれぞれ設定されている。
- 使うつもりのないプログラミング言語であっても、読んで理解できるようになると解決できる問題の幅を広げられる
- コードの読み書き、書籍や論文、ブログ、マニュアルなどの文書を読む、増え続け洗練され続けるツールやサービスを使う
- ベンダー非依存の技術を身につける


## 無駄な英語勉強 (vol.100)

### 目指すこと
- 英語での短い自己紹介
- 技術的な文脈で相手の質問を理解する
- 相手の質問に答える
- 相手に質問できる

### 目指さないこと
- 帰国子女並みの発音
- ランチやお酒の席でのランダムな話題の会話
- 英字新聞が読めるほどのボキャブラリー




# 参考文献
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/477419686X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=477419686X&linkCode=as2&tag=hurryth30-22&linkId=a85ee31a347f9fae6d7772402cc1f7f5"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=477419686X&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=hurryth30-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=hurryth30-22&l=am2&o=9&a=477419686X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
【Day50】積み上げ日記

##予定
Ruby
−Progate4/4
-メモアプリ制作

##完了
Ruby
-Progate4/4

##学習時間
３h

##学習ポイント
■メソッドが既に親クラスで定義されている場合
子クラスにて、super(name:name)と置く

■日付
date1 = Date.new(2019, 6, 4)
■日付（今日の日付）
date1 = Date.today

■クラスメソッド
def クラス名. メソッド名
　＃処理
end

##計画通り進んだか？
進んでいない。Rubyのみだとメモアプリを作ることは厳しいということがわかった。Railsを習得しないとアプリ制作は厳しいと。また転職希望者から見てRubyはやはり初学者が多くレッドオーシャンであること、どちらかというとスマホアプリ開発をやってみたいという気持ちがあるので、明日からRubyではなく、Swiftにシフトチェンジしていく。とにかく言語問わず、何かを作りきることはかなり大事だが、作成過程でも目に見えてわかりやすいiosアプリに着手する方向でいく。
リポジトリ管理者半年で失敗したこと

# 概要
半年前、プロジェクトのGitHubのリポジトリオーナーになりました。（フロントアプリケーション限定）
スキルもまだまだ半人前ながら、GitHubの運用方法に対して**失敗したこと**、そして、そこから**学んだこと**を紹介したいと思います。

現在も、まだベストな改善策に巡り合えていないものもありますので、
ぜひ、コメントなどで、**「ウチはこうしている」**など先輩方のアドバイスを頂ければと淡い期待を抱いております。orz

どうぞよろしくお願い致します。

# 前提
## 運用ルールについて
まず、前提となる運用ルールは主に以下です。

### ブランチ管理

|ブランチ名|用途|備考|
|:--|:--|:--|
|master|デプロイ|本番環境とイコール
|develop|開発|開発中のブランチ
|feature/{issue番号}_{機能}|機能追加|機能追加を行うブランチ
|hotfix/{issue番号}_{機能}|バグ修正|バグ修正を行うブランチ

ブランチ管理に関しては、特段特別なことはない気がしています。
issueに対してブランチを切って、developブランチに対してマージを行います。

![ブランチ@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513045/fa121536-f024-6787-84a4-4bd4313cdd0d.png)

### 環境について
環境は本番も含めた３つの環境が存在します。（開発はローカル使っていますが割愛）

|環境|用途|備考
|:--|:--|:--|
|本番環境|公開している本番環境|masterブランチとイコール
|ステージング環境|本番環境リリース前の確認環境|基本的には本番とイコール
|開発環境|開発済の機能テストなどを行います|developブランチから反映を行います

機能開発完了後、developブランチを開発環境に反映してテストします。
テスト済のものをdevelopブランチからmasterブランチにマージして、masterブランチをステージング環境に反映します。
ステージングで確認済の内容をそのまま本番環境に反映を行います。


# 失敗したこと・学んだこと
上記の環境が前提となります。
では、本題です。失敗して改善していったもの、改善したいことなどをまとめました。

## その１ プルリクの単位はなるべく小さく
### 問題
issueの規模には大小があります。
１つのissueに対して、１名が担当するように割り振りを行い開発を進めていました。
規模が大きい、影響範囲が広いissueは、開発に時間がかかります。それは自然とレビューの時間も膨れます。

レビューに時間が掛かってしまい、マージされないプルリクはコンフリクトを起こして、さらに開発リソースが膨らんでしまいました。
「これがマージされるまでこのissue手が付けられない...」、なんて事が何度か起きてしまいました...。涙

### 対策
issue1つに対して1つのブランチは基本ルールとして置きつつ、
規模・影響範囲によっては、issueを分割して順を追って開発を進めるように改善しました。
（React使ったプロジェクトだったため、1.コンポーネント作成、2.ページ反映、といった感じでフェーズ開発するようにしました。）


「開発 → レビュー → 修正 → レビュー → マージ」このサイクルが、コンスタントに進めることが大事だと考えました。
マージに時間がかかるのは良い事なしですね。

## その２ 影響し合うissueは分割する
### 問題
プロジェクトが運用フィーズに入ると、リリースバージョン単位でリリースを行います。v1.2には「A」と「B」を、など。
とあるバージョンにissue_Aとissue_Bを含めることになりました。
これらのissueは相互に同じ影響反映を含むissueでした。

issue_Aを私が、issue_Bをメンバーの1人が進めました。
片方のissueの修正が長引き、片方の進行が滞ってしまい、スケジュールがパツパツになってしまいました。汗

### 対策
開発メンバーとの設計すり合わせや、影響範囲の調査不足が前提としてあるかと思うのですが、
優先順位をつけて、なるべく相互に影響し合うissueは、別のバージョンで対応するようにした方が良いかと思いました。

事業的な事情でなかなか難しいこともあります。
そのような場合はリスクや、スケジュールなど十分にチームに共有した後取り組むようにしましょう。

## その3 マージタイミングはいつだ...
## 問題
この問題は現在進行形で、是非とも解決策をお伺いできないかと思っています。
デザイン完了後、開発して、マージされた内容を開発環境に反映して、運用メンバーに確認を依頼します。
追加修正があれば、都度ブランチ切って行います。

しかし今回、「やっぱりこの機能追加をやめよう...思ってたのと違う...。」
というものです。
複数人で開発を行っているので、確認を進めている最中で、マージされるブランチも発生していました。

完全に、切り戻りしのタイミングを失ってしまいました...死

## 対策求む
確認担当者の確認タイミングを開発側では管理しないで済むように、
issueをまとめて反映しちゃおう...といった経緯で、developブランチにマージ後
確認してもらっていたのですが、まさか、「やっぱりやめよう...」

いやいや、そんなスイッチ一つで戻せる所ちゃうで...となってしまいました。
developブランチへのマージタイミング、開発環境の利用改善なのか、確認方法なのか...

ロジックとしては問題なくても、事業課題はまた別問題なんですね...。


# さいごに
Gitは、バージョン管理を行う最高のサービスですが、なかなか使いこなすのも大変だなと思います。
メリットは使いこなしてこそ、発揮されるものだなとつくづく思います。

開発運用について皆さんの経験からたくさん勉強させていただきたいと、今回記事にしてみました。
先輩方、どうかアドバイスを下さい....。（きっとお家でTwitterしているだけでしょ？笑）
【Unity初心者】インスペクターに表示したいけどpublicにしたくない。そんなときはシリアライズフィールドを使いましょう。

#環境
Unity 2019.3.7f1

#対象の方
なんらかのUnityチュートリアルを終えて制作の雰囲気がわかっている方

#使い方
privateな変数宣言時に[SerializeField]をつけるだけ。

```CSharp
[SerializeField] private int a;
```

これでインスペクターウィンドウで値を表示、編集できるようになります。

#具体例
実際にみていきましょう。
↓スクリプトを空のオブジェクトに割り当てます。

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    [SerializeField] private int a;//int型の変数aを宣言

    //スタート関数
    void Start()
    {
        Debug.Log("a=" + a);//aの値をコンソールに表示
    }

}
```

通常privateな変数はインスペクターに表示されませんが、
このようにインスペクターに表示され、数値を変更できます。
変数aの値を10に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/ec2ad0f5-92e1-af32-72f3-3a370de9238f.png)

実行してみると
↓このようにインスペクターの値が反映されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/161d02ce-efb0-8a3a-5fee-e4ad4d19d33b.png)



移動速度などを微調整したい時に
いちいちスクリプトから変数の値を変更しなくて済むので超絶便利です！！

楽しいUnityライフを！！
【Day49】積み上げ日記

##予定
Ruby
−Progate 3/4

##完了
−Progate 3/4

##学習時間
3h

##学習ポイント
■真偽値を返すメソッドはメソッド名の末尾の？をつける
■キーワード引数
引数名1: , 引数名2: , 引数名3: ,  

■クラス→インスタンス→情報追加
■クラス（設計図）を準備する
class Menu 
   attraccessor :インスタンス変数
end

■インスタンス（もの）を作る
変数P＝Menu.new

■情報追加する
変数P . インスタンス変数＝”値”
■情報を出力する
puts 変数P . インスタンス変数

■インスタンスメソッドの中でインスタンス変数を扱う
#{self. インスタンス変数}

■別ファイルを読み込む
require “. / ファイル名”

■番号を振る
Index
puts “#{index}. #{fruit}”
Index += 1  

■入力を受け答えする方法（文字列）
変数＝gets.chomp

■入力を受け答えする方法（数値）
変数＝gets.chomp.to_i

■クラスの継承
require “./ファイル名” 
class 子クラス < 親クラス
end
【Day48】積み上げ日記

##予定
■Ruby基礎
－Progateを終わらせる！

##完了
■Ruby基礎2/4

##学習時間
4h
##学習ポイント
■メソッド
複数の処理を1つにまとめたもの
def introduce
	処理
end
 
※詳細は下記ノートでまとめている。

##疑問点
引数、戻り値の関係がよくわからない

##計画通り進んだか？
進んでいない。オブジェクト指向をだんだんと理解できている実感はあるが、実際このスキルでどんな成果を出せるのかが目に見えてわからないので、その点で難しいなと感じた。

![AF0BBF6A-E744-41CD-8400-7DA182947142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586262/8cc1da6f-af17-d848-07ee-e1969e9bfe8a.png)
![C6B246DD-FBA4-4B13-8F34-467EB2BCA845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586262/cc97f02d-951a-ca4a-4c0f-82fd07eb27bb.png)
![1D73FD96-B29C-47AF-8E5B-A0DF758A75C9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586262/e295bed5-d5eb-ccda-cab2-d082873e9965.png)
![648B770E-0A30-45BF-9DEF-46EFA87CF24F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586262/e798eb3e-e3a3-162b-d3f3-2f45a7e33bbe.png)
![BA466FA8-D21A-41CC-939C-A03DAB7AA11E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586262/1dcee4af-13d6-ad75-dc9b-608b32b4b675.png)
awscliでパラメータストアから取得したファイル名に書き込めなくなった時の対処

##はじまり
####パラメータストアに格納したファイル名のファイルにデータを書き込む
ということをawscliを使ってやっていました。

```put.sh
#!/bin/bash

FILE=$(aws ssm get-parameters --name "FILE_NAME" --output=text --query "Parameters[].Value" --with-decryption)
echo "aaaa" >> ${FILE}
```

####ある日、実行すると・・
曖昧なリダイレクトです、となってファイルに書き込めません。

```.bash
$ ./put.sh
./put.sh: 行 4: ${FILE}: 曖昧なリダイレクトです
```

パラメータストアに設定した値を確認すると問題なさそうです。

```bash
$ aws --version
aws-cli/2.0.6 Python/3.7.3 Linux/4.4.0-176-generic botocore/2.0.0dev10

$ aws ssm get-parameters --name "FILE_NAME" --output=text --query "Parameters[].Value" --with-decryption
$ test.txt

```

####では、なぜ書き込めないのか？？


##調査した結果
16進数で確認してみたところ、結果にバイナリが混入していました。

```
$ aws ssm get-parameters --name "FILE_NAME" --output=text --query "Parameters[].Value" --with-decryption|od -h
$ 0000000 5b1b 313f 1b68 0d3d 6574 7473 742e 7478
                                               0000020 5b1b 0d6d 0d0a 5b1b 1b4b 3f5b 6c31 3e1b
                                                                                              0000040
```

stringsでみるとこんな感じ。

```
$ aws ssm get-parameters --name "FILE_NAME" --output=text --query "Parameters[].Value" --with-decryption|strings
[?1h
    test.txt
            [?1l

```


##対処

stringsで表示すると1行目と3行目にバイナリが混入してる・・
しょうがないので、sedで2行目だけ取るようにしました。

```put2.sh
#!/bin/bash

FILE=$(aws ssm get-parameters --name "FILE_NAME" --output=text --query "Parameters[].Value" --with-decryption|strings|sed -n 2P)
echo "aaaa" >> ${FILE}
```

####しょうもないやり方ですが、とりあえず解決

```.bash
$ ./put.sh
$ cat test.txt
$ aaaa
```
しかし、なぜ急に混入したのか腑に落ちない..

##さらに調査

バイナリが混入したのはawscliを2.0.6にバージョンアップしたためでした。
version1.18だと問題なし。
バグなのか仕様が変わったのかは不明です。。

```shell
$ aws --version
aws-cli/1.18.20 Python/3.5.2 Linux/4.4.0-176-generic botocore/1.15.20

$ ./put.sh
$ cat test.txt
$ aaaa
```
WindowsからMacにVNC接続

Macの画面共有はVNCなので，WindowsやLinuxからも接続できる。
いくつかのWindowsアプリを試したのでメモ。

## おすすめ

RealVNCの[VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/)

これが一番速かった。Macのアカウントでの認証（UNIXパスワード）に唯一対応している。

## その他

UltraVNC, TightVNC, TurboVNCはいずれも[Macの画面共有](https://support.apple.com/ja-jp/guide/mac-help/mh11848/10.15/mac/10.15)で

Macのシステム環境設定> 共有 > コンピュータ設定 > VNC使用者が画面を操作することを許可

にパスワード（VNCパスワード）を設定しないと，No supported authentication methodとエラーが出て接続できなかった。しかも速度は遅い。圧縮の設定で変わる可能性があるがいろいろ試す気にはならなかった。

## WindowsからWindowsへのリモートデスクトップ

速い！Macへの接続でこれくらい速いのないかな。
MacでGo言語を使ってOpenWeatherMapAPIを使用した際の備忘録

# 目的
MacでGo言語を使ってOpenWeatherMapAPIを使用した際の備忘録です

# 準備

環境
　macOS
　Homebrew

インストール

```
$ brew install go
```

# テスト

### hello world

本体コード

```
package main
import "fmt"

func main() {
    fmt.Printf("Hello World!\n")
}
```

実行

```
$ go run sample.go 
Hello World!
```

### Setenv

本体コード

```
package main
 
import (
        "fmt"
        "os"
)
 
func main() {
        // 既存の環境変数を取得
        // fmt.Println("1. $HOME:",os.Getenv("HOME"))
 
        // プログラム中で設定してやることもできる
        fmt.Println("2. $TEST:",os.Getenv("TEST"))
        os.Setenv("TEST", "abcdedg")
        fmt.Println("3. $TEST:",os.Getenv("TEST"))
 
        // 環境変数を配列で取得する
        // fmt.Println(os.Environ())
}
```

実行

```
$ go run testenv.go
2. $TEST: 
3. $TEST: abcdedg
```

### open weather map

以下のOpenWeatherMap APIラッパーを使わせて頂きます。

> [ramsgoli/Golang-OpenWeatherMap](https://github.com/ramsgoli/Golang-OpenWeatherMap)

Installation

```
mkdir $HOME/gocode
export GOPATH=$HOME/gocode
go get github.com/ramsgoli/Golang-OpenWeatherMap
```

export

```
export OWM_APP_ID="xxxxx" # your API Key
```

本体コード

```go:sample.go
package main
 
import (
        "fmt"
        "os"
        "github.com/ramsgoli/Golang-OpenWeatherMap"
)
 
func main() {

        owm := openweathermap.OpenWeatherMap{API_KEY: os.Getenv("OWM_APP_ID")}

        var currentWeather *openweathermap.CurrentWeatherResponse
        //var err error

        //currentWeather, err = owm.CurrentWeatherFromCity("Osaka")
        currentWeather, _ = owm.CurrentWeatherFromCity("Osaka")

        fmt.Printf("The current temperature in %s is %f degrees\n", currentWeather.Name, currentWeather.Main.Temp)
}
```

実行

```
$ go run sample.go
The current temperature in Osaka is 79.650000 degrees
```

# 参考
[GO言語をMacで使ってみる インストール](https://qiita.com/Noah0x00/items/63e024f9b5a27276401b)
[ramsgoli/Golang-OpenWeatherMap](https://github.com/ramsgoli/Golang-OpenWeatherMap)
[Go言語で今日傘が必要か教えてくれる傘APIをつくってみた ～Mockテストもしっかりやるよ～](https://blog.pco2699.net/entry/2018/12/09/163322)
[package openweathermap](https://godoc.org/github.com/briandowns/openweathermap)
[動的言語だけやってた僕が、38日間Go言語を書いて学んだこと](https://qiita.com/suin/items/22662f43b6a6e8728798)
[Go言語でRESTful APIクライアント: Qiita APIを叩いてみよう!](https://qiita.com/suin/items/2a38f3e072523fa49a5b)
[Go開発環境をEmacsで整える](https://qiita.com/shiwork/items/620ebed252ed91bdcb0a)
[My take on creating a simple wrapper for the openweather API.](https://github.com/rbo13/go-openweather)
Vim

### 移動
| キー | 内容 |ページ| 参考|
|:-:|:---|:-:|:-:|
|gg|ファイルの先頭に移動||
|G|ファイルの最後に移動||
|{数値}gg, {数値}G, :{数値}|数値行に移動||
|f{ひと文字}   |現在位置から行末までにあるアルファベットひと文字に移動   |31   |
|%|対の括弧に移動||

### 編集
| キー | 内容 |ページ| 参考|
|:-:|:---|:--:|:-:|
|.  |直前までの入力を再現   |26   |uの逆
|u| 直前の入力を取り消す。Undo |26 |.の逆
|ctrl + r | Undoの逆。Redo。||
|>>|インデントを追加||
|<<|インデントを削除||
|>G   |現在の行からファイル末尾までインデント   |27   |
|a |現在位置の後ろから入力（挿入モードに変更） |29
|A   |行末に移動し入力（挿入モードに変更）   |29   |
|s   |現在位置の文字を削除し入力（挿入モードに変更）       |31   |
|;   |直前のf{char}を再現   |31   |
|* | 現在位置の文字を検索・移動 | 35
|n | *で検索の文字へ移動 | 35
|shift + j   |下の行を現在行の右に移動させる   |   |

### 削除・コピー・貼り付け
| キー | 内容 |ページ| 参考|
|:-:|:---|:-:|:-:|
|x  |一文字削除   |26  |
|dd|現在行をカット|26 |delete |
|d3|現在行から3<strong>行下</strong>までカット||delete
|d4G   |現在行から<strong>ファイルの上から4行目</strong>までカット   |   |delete   |
|d^|現在位置より左を削除||
|d$|現在位置から右を削除||
|dgg|現在位置より上をすべて削除||
|dG|現在位置から下をすべて削除||
|yy 又は Y|現在行をコピー||yank
|P|現在行の上にペースト||put
|p|現在行の下にペースト||put
|3P|現在行の上に3行にしてペースト||put
|2p|現在行の下に２行にしてペースト||put
|cc|現在行を削除し挿入モード|
|cw|現在位置から一文字削除し挿入モード|35|
|ciw|現在位置から一単語を削除し挿入モード|

### 3つのビジュアルモード（選択機能）
#### 矩形選択
1. 選択開始行で ctrl+v
2. jやkで移動
3. Shift + i で挿入モード
4. 編集
5. escボタン
ローカル環境と本番環境のマイグレーションファイルの違いでハマった話

# 初めに
今回が初投稿になります！

今までQiitaで他の方の記事を参考に勉強させてもらっていたので、
調べる中で解決に時間がかかった物をメモとして残したいと思います！

まだまだ未熟者なので、記事の内容に誤りがあるかもしれませんがご了承ください🙇‍♂️

## ハマった内容
AWSにてデプロイを行い、自動デプロイの設定まで完了していました。
いざ、開発環境での変更内容内容を本番環境に反映させよう！と思い、
自動デプロイ実行！！！

すると、
![s3.ap-northeast-1.amazonaws.com_0_453605_fa8fee9a-0ed0-13c8-608f-1b1872b4f023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/eb9a7766-52fb-c1cc-f7f8-a5edb310a206.png)


エラーか、、、、、

とりあえず、以下のファイルを変更し、エラー文を表示させました。

```ruby:/config/environments/production.rb
config.consider_all_requests_local       = true #デフォルトはfalseになっている
```
<img width="1440" alt="error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617337/dea3f87f-9c0c-4140-554b-70b11a9662ba.png">

このエラーは見た事がある！！
ローカルでマイグレーションファイルにdefaultを設定して直したエラーでした。

本番環境にもマイグレーションの変更を反映させなくてはと思い、
`rails db:migrate RAILS_ENV=production`を実行、、、、、、、、反映されず。

ググってみたところ、
本番環境もロールバックしてからではなきゃダメ。
気を取り直して、
`rails db:rollback RAILS_ENV=production`
`rails db:migrate RAILS_ENV=production`を実行、、、、、、、、ダメ👎

更にググる。
すると、currentディレクトリに移動して実行しなければならないとの記述発見。

次こそは！藁にもすがる思いで、アプリのディレクトリ下にあるcurrentディレクトリに移動。
いざ、`rails db:rollback RAILS_ENV=production`
　　　`rails db:migrate RAILS_ENV=production`


**無事変更が反映されました！！！！**


## まとめ

本番環境にマイグレーションファイルの変更を反映させるにはcurrentディレクトリでロールバック、マイグレートしなければいけないみたいです！
かなり解決するのに時間がかかったので、忘備録として残しました。
分かりづらい説明を読んでいただきありがとうございます。間違いがあったらご指摘お願いします🤲
EmacsのM-x grepでThe Platinum Searcherを使う

[The Platinum Searcher](https://github.com/monochromegane/the_platinum_searcher) (pt) は複数のエンコーディングのテキストファイルが混在する中で素早くファイル中のキーワードを含む行を見つけてくれるツールです。
Emacs 上で pt を使う方法として、pt の README では pt.el が紹介されています。ここではそれを使わずに Emacs 標準機能の [M-x grep](https://www.gnu.org/software/emacs/manual/html_node/emacs/Grep-Searching.html) で使う方法を紹介します。

# macOS

```
(require 'grep)
(grep-apply-setting 'grep-command "pt --nogroup ")
(grep-apply-setting 'grep-use-null-device nil)
```

確認環境

* https://emacsformacosx.com/ から取得した Emacs 26.3
* pt version 2.2.0

# Windows

```
(require 'grep)
(grep-apply-setting 'grep-command "echo . | xargs pt ")
```

確認環境

* http://ftp.gnu.org/gnu/emacs/windows/ から取得した Emacs 26.3
* SourceTree からインストールした Git Bash に入ってる echo, xargs
* pt version 2.2.0
文字数に応じて背景色の横幅が可変するCSS設定方法

文字数に応じて可変する背景色の設定方法についてメモします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578250/ceb81ee8-c198-81e6-8511-1b745f384d78.png)


上記の「カテゴリ名」のワッペンを文字数に応じて背景枠を可変にするには、
classに「display:inline-block」を設定することで実現できます。

以上です。ご参考になれば幸甚です。
From Data to Viz というwebサイトで、データに適した可視化のフォーマットを学ぶ

- 以前、あるコミュニティーのLTで紹介したもの資料です。

[From Data to Viz](https://www.data-to-viz.com)は、入力データ形式に基づいてチャートタイプを分類したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137065/6ac0dbbc-7904-2e1d-47b5-edb3339e4c20.png)

---
データセットを表現するために適切と考えられる複数の可視化方法へ,決定木で導いてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137065/c438f190-43a3-38fa-9508-f286decb08fc.png)


---


**プロジェクトの基本的信念**

1. ほとんどのデータ分析は約20種類のデータセット形式で要約できる     
2. データとコンテキストの両方によって、適切なチャートが決まる        

---
このサイトでは、

- 手持ちのデータとアイデアに最適かつ実行可能なチャート・タイプを決定し、すべて実際に試してみることができます。
    - 避けるべき一般的な注意点のリスト
    - 再現可能なR言語コードスニペット
        - 実際はR, pythonなど
       


---
使い方：データ形式を確認する
<img width="1440" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137065/926d829c-af15-6b1e-1591-a70dc8ae0c7b.png">

---
「データとコンテキストの両方によって、適切なチャートが決まる」
使い方：コンテキストはアイコンの色で選択する
<img width="645" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137065/1522bf18-85d2-e573-9c7e-eea3124c2294.png">


---
実際に使用するには
- 
[EXPLOREタブ](https://www.data-to-viz.com)をクリックして決定木へ移動します。各グラフのアイコンをクリックすると、そのグラフに関する注意点等の説明と異なる言語のコード例へのリンクを示すポップアップウインドウが開きます。リンク先にはグラフについて簡潔で分かりやすい説明が書かれています。グラフも複数のバリエーションが用意されており、自分が必要なグラフだけ参照すれば良いようになっています。
各言語にしかないバリエーションもあります。Pythonの場合、Rのwrapperが重宝しそうです。

- 普段ちょっとした手持ちのデータでグラフ化したい場合、Excelを使うよりも、重宝しそうです。
パンくず作ってみた[Ruby on rails]

# はじめに
ruby on railsのパンくず機能について簡単に投稿します。
# パンくずとは
ユーザーが訪れたサイトのどの位置にいるのかをわかりやすく示した道しるべのようなものです。
<img src="https://gyazo.com/4dce48bf0b9bc3885a59809f3a5d2ea4/raw" width= 300px>

↑サイトでよく見るこんな奴です。
これを実装するための手順について説明します。

# ①gretelの導入
パンくずを実装するためにgretelというgemを導入します。
はじめにgemfileにgretelを追加します

```:Gemfile
gem "gretel" ⬅️追加
```
gemを追加したらインストール

```
$ bundle install
```
続けて

```
$ rails g gretel:install
```

このコマンドによって下記のファイルが生成されます。
config/breadcrumbs.rb

# ②breadcrumbs.rbの記述
①で生成されたbreadcrumbs.rbにパンくずの記述を行います。

```:bread,crumbs.rb（記載例）
crumb :root do　⬅️親（一番最初のページ）
  link "トップページ", root_path
end

crumb :items do　⬅️子（親の次にくるページ）
  link "商品一覧", item_path
  parent :root
end

crumb :item do |item|
  link item.name, user_path(item)
  parent :items
end

```
記載方法としては

```
crumb :ページ名（任意の名前） do 

  link “実際に表示記述”, リンク先（path名）

  parent :ひとつ前のページ名(先頭ページでは不要）

end
```
という感じで記載していけばOKです。

# ③ビューへの表示

```
  - breadcrumb :パンくず名
  = breadcrumbs separator: " &rsaquo; "
※separatorは区切りの文字のことのようで、＆rsaquoで　›　が表記されるようです
```

これで簡単にですがパンくずができました！

[![Screenshot from Gyazo](https://gyazo.com/458b2133ea06d5f42d17df81a549e42e/raw)](https://gyazo.com/458b2133ea06d5f42d17df81a549e42e)

今回の実装は以上です。
ありがとうございました。
[Unity初級]プレハブからオブジェクトを生成

#概要
１：コードを書いて
２：プレハブを登録



#本文
```cs

    public GameObject PrefabObject;
    void Start()
    {
        Vector3 pos = new Vector3(0, 0, 0);
        Instantiate(PrefabObject, pos, Quaternion.identity);//オブジェクト、位置(省略可)、無回転（省略可）
        //GameObject obj = Instantiate(PrefabObject, pos, Quaternion.identity);
    }

```
コードを書いて空のオブジェクトにAddComponentする。

![スクリーンショット_(45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ba9128e9-2045-fbf6-a35c-44b98d242d50.png)
そこに生成したいキャラ（プレハブ）をドラッグアンドドロップする。


#追記
RigidbodyとBox Colliderを有効にしてコードを繰り返し実行するようにするとこんな感じになります（同じ位置に生成してるから）
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/11fdf743-baed-57d4-96c3-0987e5433d7f.png)


Quaternionについての動画（すごく難しいから興味のある人だけ）
https://www.youtube.com/watch?v=uKWLPU8gfIY
オブジェクト指向設計実践ガイド 第1章 「オブジェクト指向設計」

## はじめに
- この資料は社内勉強会ように用意したまとめスライドです
- [オブジェクト指向設計実践ガイド](https://www.amazon.co.jp/dp/B01L8SEVYI)第1章の内容の要点をまとめています

---

## もくじ
- なぜ設計をするのか
- 設計とは何か
- 何を設計するのか
- いつ設計するのか
- オブジェクト指向設計とは

---


## なぜ設計をするのか1
- はじめから完璧なプロダクトを作れるなら設計はいらない
    - 一度動くものを書いたら一生それは動き続ける
- しかし実際はそうはいかない
    - 新しい要件の追加
    - はじめに要件を満たしきれていなかった
    - これらの変更が一生続く

---
## なぜ設計をするのか2
- 設計をしないとどうなるのか？
    - 新たな要件を追加するコストが増え続ける
    - サービスは大きくなり続ける
    - そもそも変更ができなくなっていく

---

## 設計とは何か1
- 設計とはコーディングルールではない
    - 具体的な処理には寄与しない

例
設計の観点で言えばどちらの実装でも良い

```rb
def fibonacci(n)
  return   if n < 0
  return n if n < 2
  fibonacci(n - 1) + fibonacci(n - 2)
end

def fibonacci(n)
  return if n < 0
  Hash.new { |h, k| h[k] = k < 2 ? k : h[k - 1] + h[k - 2] }[n]
end
```

---
## 設計とは何か2
- では設計とは何か？→書いた処理をどのように扱うのか
    - メンテナンスコストを増加させない
    - 要件を処理に依存させないようにする
- 設計は一回すれば良い、というものではない
    - 設計とはのちのち改めて設計できる準備をするための再帰的なプロセス

---
## 何を設計するのか1
- 設計とは美しいアーキテクチャを構築することではない
    - 原理主義的な思想ではない
- 設計とはあくまで「メンテナンスコストを増加させず」「要件を処理に依存させない」ためのプロセス
- この目的が達成されるなら設計はどのような適用レベル、種類でも良い

---
## 何を設計するのか2
- とは言いつつ先人が「うまい設計」をする上でのベストプラクティスを発見してくれている
    - SOLID原則
    - DRY
    - YAGNI
    - デメテルの法則
    - GoF
- 設計の第一歩はこれらの原則を「適切な場所に」適用していくこと

---
## いつ設計するのか1
- 設計はどのタイミングで行うのか？→気づいた瞬間から適用していけ！
- 設計とはあくまでry
- 目的を達成するならry
- 設計とはアプリケーションのアーキテクチャではない→部分適用が可能

---
## いつ設計するのか2
- とは言いつつ注意しなければならないことはいくつかある
    - 原理原則をむやみやたらに適用しない→原則は銀の弾丸ではない
    - 原理原則を適用するなら適用範囲内では完璧に適用する
- 中途半端な設計は身を滅ぼす
    - 逆に変更に弱くなる
    - 目的を履き違えてはいけない

---
## オブジェクト指向設計とは1
- オブジェクト指向プログラミングを用いて変更に柔軟な設計を行う手法
- オブジェクト指向言語以外でも適用は可能（実際に適用するかは吟味する）
- 手続き型言語はプログラムを手続きとして書く
- オブジェクト指向設計はプログラムを振る舞いとして記述する
    - 処理は振る舞いとして抽象化され、隠蔽される

---
## オブジェクト指向設計とは2
- なぜオブジェクト指向プログラミングなのか？
    - オブジェクト指向はプログラムをオブジェクトという単位でスコープを閉じる
        - 要件はいくつかのオブジェクトのメッセージパッシングで実現する
        - 具体的な処理はカプセル化をして隠蔽する
    - オブジェクト指向プログラミングを上手く使えば要件に対する変更を最小限に抑えることができる
        - 要件がメッセージパッシングで実現される→処理に依存しなくなる
        - 具体的な処理はオブジェクト内に閉じるので変更もオブジェクトに閉じるようになる
        - 要件が増えてもオブジェクト同士のメッセージパッシングで実現する→足りない処理は新たなオブジェクトを用意するだけで良い
        - →拡張に対して開いており、変更に対して閉じたプログラムを記述できるようになる
      
---
## おわり
---
## 参考文献
- https://yu8mada.com/2018/06/23/how-to-calculate-fibonacci-numbers-in-ruby/
- Sandi Metz, オブジェクト指向設計実践ガイド
Ruby on Railsのチュートリアル ~第4章Rails風味のRuby~

# はじめに
webアプリケーションを作るための学習記録
（マッチングアプリを作る予定）

こちらのチュートリアルを片っ端から進めていく
【Ruby on Rails チュートリアル】
https://railstutorial.jp/

# 第4章Rails風味のRuby
## まとめ
- Rubyは文字列を扱うためのメソッドを多数持っている
- Rubyの世界では、すべてがオブジェクトである
- Rubyではdefというキーワードを使ってメソッドを定義する
- Rubyではclassというキーワードを使ってクラスを定義する
- Railsのビューでは、静的HTMLの他にERB (埋め込みRuby: Embedded RuBy) も使える
- Rubyの組み込みクラスには配列、範囲、ハッシュなどがある
- Rubyのブロックは (他の似た機能と比べ) 柔軟な機能で、添え字を使ったデータ構造よりも自然にイテレーションができる
- シンボルとはラベルである。追加的な構造を持たない (代入などができない) 文字列みたいなもの
- Rubyではクラスを継承できる
- Rubyでは組み込みクラスですら内部を見たり修正したりできる
- 「deified」という単語は回文である

## 所感
- いわゆる文法的な話
- 今までpythonとかしか触ってなかったからか、シンボル（ラベル）とかブロックとかは初の概念だった
- 継承と拡張を実際に書いてみることで、オブジェクト指向への理解が深まったように思う。めちゃ便利だなこれ
- ブランチ切ってからherokuにデプロイするまでの手順をまとめておく

```
git checkout -b ブランチ名 # ブランチをきる
git status # 修正後、修正内容確認
git add -A # ステージング
git commit -am "命令形 対象名で変更内容記載" # コミット
git checkout master # マスターブランチに切り替え
git merge ブランチ名 # ブランチをマージ
rails test # テスト
git push # リモートへプッシュ
git push heroku # herokuへプッシュ
```

## 途中参考にしたページ
・instance method Hash#merge
https://docs.ruby-lang.org/ja/latest/method/Hash/i/merge.html
同じキーの値は加算されるのではなく上書きされる

・シングルクォーテーションとダブルクォーテーションの違い（Rubyの文字列）
https://qiita.com/ryosuketter/items/ddad508cb0124e4fe378

・turbolinksチートシート
https://qiita.com/morrr/items/54f4be21032a45fd4fe9
turbolinks = Ajaxによるページ遷移の高速化のためのライブラリ

・コンストラクタ (constructor)
https://wa3.i-3-i.info/word13646.html

・リテラル (literal)
https://wa3.i-3-i.info/word15346.html

・らくだ🐫にもできるRailsチュートリアル｜4.4（と4.5）
https://rakuda3desu.net/rakudas-rails-tutorial4-4/
リテラルコンストラクタとは、リテラル（ベタ書きの定数）によって/応じて呼び出されるコンストラクタ（インスタンス化の際に呼び出されるメソッド）のこと、かなぁ・・・

・マスアサインメント
https://scrapbox.io/tatsuhi10/マスアサインメント

・irbでrequireしたファイルを再読み込みしたい時には
http://shinya131.hatenablog.jp/entry/2012/10/24/172827
一番下にrails consoleで再読み込みの方法書いてある


## 使用したコマンド
git checkout -b rails-flavored-ruby
bundle exec guard

nano ~/.irbrc
rails c

cd sample_app
touch ./example_user.rb

rm example_user.rb
git status
git add -A
git commit -am "Add a full_title helper"
git checkout master
git merge rails-flavored-ruby
rails test
git push
git push heroku
sed で JSON の value を変更する

### sed コマンドとは

sed は入力ストリーム（ファイルまたはパイプラインからの入力）に対して、文字列を全置換したり、行単位で抽出したり、削除したり、いろいろなテキスト処理のできるコマンド。
処理内容はコマンドラインパラメータで指定して、非対話的に一括処理できる。
sed は「Stream EDitor」 の略。

今回はこの sed と使って、package.json の version を変更してみます。

### 単純に version を置換する

以下のような package.json があるとします。

```json
{
  "name": "sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "qiita",
  "license": "ISC"
}
```

version を `1.0.0+1` に置換したい場合、sed コマンドを以下のよう使います。

```shell
sed -i -e "s/1.0.0/1.0.0+1/" package.json
```

#### オプション
- `-e script` : スクリプト（コマンド）を追加する
- `-i` : ファイルを直接編集する

### 置換対象を明示的に指定しない

置換対象の version(1.0.0) を条件に含めたくない場合はこんな感じ。

```shell
sed -i -e "s/\"version\":.*\"/\"version\": \"1.0.0+1\"/" package.json
```

### もっと汎用的に置換したい

1.0.0+1 だけではなく、もっと柔軟に 2.0.0+1 とか 3.0.0+1 にも対応させたいよという場合は**正規表現のキャプチャ**を使えばできます。

正規表現のキャプチャというのは、置換対象を `\(と\)` でくくると、後で `\1` で取り出せる、というものです。複数、置換対象を `\(と\)` でくくると、`\2, \3, \4` で取り出すことができます。

こんな感じです。

```shell
sed -i -e "s/\"version\": \"\(.*\)\"/\"version\": \"\1+1\"/" package.json
```
Rubyで素数を出力する〜エラトステネスの篩(ふるい)〜

こんにちは、Ruby歴半年のプログラマです。

基本的なアルゴリズムを習得したいと考えて、『Pythonではじめるアルゴリズム入門 伝統的なアルゴリズムで学ぶ定石と計算量』(以下、Pythonではじめるアルゴリズム入門)を読んでいます。

『Pythonではじめるアルゴリズム入門』では、その書籍名の通りPythonでサンプルコードが実装されているので、Rubyの練習のためにRubyに書き換えた上でアレンジを加えました。

より良い書き方などありましたら教えてもらえると嬉しいです。

## 環境

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.4
BuildVersion:   19E287
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```

## Ruby版エラトステネスの篩(ふるい)
```ruby
def get_prime(input_number)
  return [] if input_number <= 1

  # 素数リスト
  under_limit_prime = [2]

  # 探索リスト(2以上の偶数は素数にはなりえないので3以上の奇数のみ)
  upper_limit_prime = (2...input_number).select(&:odd?)

  # 探索の上限値は与えられた数の平方根
  limit = Math::sqrt(input_number).floor

  # 探索リストの先頭が上限値より大きくなるまで繰り返す
  while limit > upper_limit_prime[0]
    under_limit_prime << upper_limit_prime[0]
    # 探索リストから探索リストの先頭で割り切れる数値を削除する
    upper_limit_prime.reject! { |number| number % upper_limit_prime[0] == 0  }
  end
  under_limit_prime + upper_limit_prime
end

print get_prime(200)
# [2, 3, 5, 7, 9, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 57, 59, 61, 67, 69, 71, 73, 79, 83, 87, 89, 93, 97, 101, 103, 107, 109, 111, 113, 123, 127, 129, 131, 137, 139, 141, 149, 151, 157, 159, 163, 167, 173, 177, 179, 181, 183, 191, 193, 197, 199]
```
IE11でバグるCSS対策法

# IE11で利かないCSS

自分が把握しているもので以下になります。
（他もありましたらご報告お願いします）

- **×** vmax（vminはいけるのに。。。)

- **×** background-blend-mode
（background-imageが表示されません。
　Edgeは、background-imageは表示されますが、
　効いていないです）

- **×** object-fit（写真の比率が変になります）

- **△** transition
（一律には言えませんが、スライドなどに仕込んだ時うまくいかない場合があります。）


# IE11だけにCSSを適応させる方法

## 1.適応するCSSを重ねて書く。

```
padding: 1% 0 6%; //vmaxが効かないIE用
padding: 1px 0 6vmax; //vmaxが効く他のブラウザ用
```


## 2.適応できるCSSとHTMLで偽装する
写真を加工する方が一番手っ取り早いですが、どうしても！という場合の方法。

- 写真の上に、position:absolute;で上から乗せる。
乗算の場合は、透明度を高くした黒背景を。
スクリーンの場合は、透明度を高くした白背景を。

- 写真の下に、background-colorで色指定。
写真の透明度を上げて、乗算・スクリーンっぽく見せる。

## 3.javaScriptライブラリを使用
object-fit対策は、javaScriptライブラリの使用が有効です。
「fitie」を使う方法もありますが、
自分はうまくいかなかったので、
「object-fit-images」を使用しました。
使い方はこちらのサイト様に詳しく載っています。
[https://www.webcreatorbox.com/tech/object-fit](https://www.webcreatorbox.com/tech/object-fit)

## 4.CSSハックを使う
こちらのサイト様をご参考にしていますm(_ _)m
[https://chaika.hatenablog.com/entry/2018/04/06/120000](https://chaika.hatenablog.com/entry/2018/04/06/120000)

```CSS
@media all and (-ms-high-contrast:none) {/*IE対策*/
  transition:none;
}
```
横文字を制す



新社会人の幕開けとともに、プログラミングを勉強し始めました。かけるです。
社内研修と並行しながら、**はや１０日。** 正直あんまり取り組めてません笑
でもチームのみんなともくもく会やったり、師匠のブログみたりしてモチベ上げてます。頑張るぞ。
****
さて、プログラミング言語を学んでいるうちに壁にぶち当たりました。
それは
**『わかんない言葉多過ぎ』**です。
なので記憶のメモも兼ねて、調べた言葉を羅列していきます。（＊自己解釈）
****

・*マークダウン記法*
→　デジタル文章において「見出し」・「強調」などを簡単に書けるようにプログラムした記法。

・*フレームワーク*
→　難解なプログラミング言語を簡単にわかりやすく書けるようにした枠組み・ルール。
全体の流れ。
ex) Ruby→Ruby on Rails

・*ライブラリー*
→一定のパッケージになっていて、必要な時にアクセスして取り出せる便利箱。要所で活用。
ex) Java Script→React

・*スクリプト言語*　⇄　[コンパイル言語 ex) Java,C言語]
→習得するのを簡単にするために工夫されたプログラミング言語の総称。
ソースコードを書くだけですぐ実行できる。
ex) Java Script

・*オブジェクト思考*
→「いかに効率よく開発を行うか」を突き詰めた考え方。概念。


****
ざっくりとした解釈でとこんなもんでしょう。随時、追加していきます。
Prolog競プロ用チートシート

# この記事について
- 学校で習った程度なので間違いがあるかもしれません。(あった場合は教えていただけると嬉しいです。)
- 関係名, 変数名の名付けが適当です。
- 文字列の入力が複数の場合はそのうち書きます。
- 出力の部分もそのうち増やします。

# 入力

## 1行に1つ

### そのまま変数へ

入力例: 

```
1000
```

実装例:

```prolog
get_input(Number):-
	current_input(Input),
	read_string(Input, '\n', '', _, String),
	number_string(Number, String).	% 文字列型なら必要ない

main:-
	get_input(N),
	write(N).

% 1000
```

### リスト化

入力例: 

```
1000
```

実装例:

```prolog
get_input(Number):-
	current_input(Input),
	read_string(Input, '\n', '', _, String),
	number_string(Number, String).	% 文字列型なら必要ない

main:-
	get_input(N),
	number_chars(N, List),	% 文字列型なら string_chars(Str, List)
	write(List).

% [1,0,0,0]
```

## 1行に複数

### 別々の変数へ

入力例:

```
10 20
```

実装例:

```prolog
get_input(Number):-
	current_input(Input),
	% 第二引数を ' \n' (スペースを含める)
	read_string(Input, ' \n', '', _, String),
	number_string(Number, String).	% 文字列型なら必要ない

main:-
	get_input(A),
	get_input(B),
	write(A),
	write(' '),
	write(B).

% 10 20
```

## 複数行(行数指定あり)
### 1行目に個数 2行目に個数個の入力 -> リスト
入力例:

```
3
10 20 30
```

実装例:

```prolog
get_input(Number):-
	current_input(Input),
	read_string(Input, ' \n', '', _, String),
	number_string(Number, String).

get_numbers(0, []):- !.
get_numbers(N, [Number|L]):-
  N1 is N - 1,
  get_input(Number),
  get_numbers(N1, L).

main:-
	get_input(N),
	get_numbers(N, List),
	write(List).

% [10,20,30]
```

### 1行目に個数 2行目以降に個数個行の入力 -> リスト
入力例:

```
3
10
20
30
```

実装例:

```prolog
get_input(Number):-
	current_input(Input),
	read_string(Input, '\n', '', _, String),
	number_string(Number, String).

get_some_inputs(0, []):- !.
get_some_inputs(N, [A|L]):-
	get_input(A),
	N1 is N - 1,
	get_some_inputs(N1, L).

main:-
	get_input(N),
	get_some_inputs(N, List),
	write(List).

% [10,20,30]
```

### 1行目で指定 1行に複数が複数行 -> リスト in リスト
入力例:

```
3 4
11 12 13 14
21 22 23 24
31 32 33 34
```

実装例:

```prolog
get_input(Number):-
	current_input(Input),
	read_string(Input, ' \n', '', _, String),
	number_string(Number, String).

get_numbers(0, []):- !.
get_numbers(N, [Number|L]):-
  N1 is N - 1,
  get_input(Number),
  get_numbers(N1, L).

get_lists(0, _, []):- !.
get_lists(H, W, [T|L]):-
	get_numbers(W, T),
	H1 is H - 1,
	get_lists(H1, W, L).

main:-
	get_input(H),
	get_input(W),
	get_lists(H, W, List),
	write(List).

% [[11,12,13,14],[21,22,23,24],[31,32,33,34]]
```

# 出力

```prolog
nl.           % 改行
write('\n').  % 改行
write('Yes'). % Yes
write(Count). % Countの内容
```

# 参考
<strong>とても</strong>参考にさせていただきました。素晴らしい記事ありがとうございます。
[AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた](https://qiita.com/n4o847/items/2040067b5388481eae88) ([@n4o847](https://qiita.com/n4o847)さん)
[AtCoder に登録したら解くべき精選過去問 10 問を Prolog で提出してみた] (https://qiita.com/Mopepe51/items/4a1c5351c001ad21218e) ([@Mopepe51](https://qiita.com/Mopepe51)さん)
git worktree でブランチ名にスラッシュが入っている時の対処法

ブランチごとにディレクトリを分けることができる`git worktree`。
名前にスラッシュが含まれるブランチを新規作成する際にハマったので、備忘録を兼ねてメモ。

# まず、シンプルなブランチ新規作成方法
```bash
> git worktree add {ブランチ名}
```

## `master`ブランチから`develop`ブランチを作成
`master`配下で下記の通り実行。

```bash
> git branch
* master

> git worktree add develop
Preparing worktree (new branch 'develop')
HEAD is now at 7e47e15 Initial commit

> git worktree list
~/         7e47e15 [master]
~/develop  7e47e15 [develop] # masterと同じハッシュ

> ls
... develop # developブランチのディレクトリが新規作成
```

# ブランチ名にスラッシュが含まれる場合の新規作成方法
本題。

```bash
> git worktree add {作成するディレクトリのパス} -b {ブランチ名}
```

## `develop`ブランチから`feature/#1`ブランチを作成

`develop`配下で下記の通り実行。

```bash
> git worktree add ./../feature/#1 -b feature/#1
Preparing worktree (new branch 'feature/#1')
HEAD is now at 9150323 add: a.py

> git branch      
* develop
+ feature/#1
+ master
                                                                                                                     
> git worktree list
~             7e47e15 [master]
~/develop     9150323 [develop]
~/feature/#1  9150323 [feature/#1] # developと同じハッシュ

```

ちなみにシンプルな方法で行うと、末尾から最も近いスラッシュ以下がブランチ名だとみなされてしまう。

```bash
> git worktree add feature/#2
Preparing worktree (new branch '#2')
HEAD is now at 9150323 add: a.py
                                                                                                                     
> git branch
+ #2 # feature/#2にしたいのに！！
+ develop
* feature/#1
+ master

```
【Rails】テーブルにカラムを追加する方法

こんにちは。YASUです。

今回はRailsにてテーブルにカラムを追加するやり方をまとめたいと思います。
前提として既にテーブルが用意されており、そこにカラムを追加していきます。

では早速いきます。


まずテーブルにカラムを追加したり削除したりするのにマイグレーションファイルを作成しなくてはなりません。
なので作ります。

```ruby:
ec2-user:~/environment/booksreview (master) $ rails g migration AddStoryToReviews
```


実行したら新しくマイグレーションファイルが生成されるので編集する。
今回は、2つテキスト型でstory,actionplanを追加。

```ruby:20200411061306_add_story_to_reviews.rb
class AddStoryToReviews < ActiveRecord::Migration[5.2]
  def change
    add_column :reviews, :story, :text
    add_column :reviews, :actionplan, :text
  end
end
```

このままだとまだ確定していない状態なのでrails db:migrateを打ち込む。

```console
ec2-user:~/environment/booksreview (master) $ rails db:migrate
```

こんな感じになったらOK

```
ec2-user:~/environment/booksreview (master) $ rails db:migrate
== 20200411061306 AddStoryToReviews: migrating ================================
-- add_column(:reviews, :story, :text)
   -> 0.0152s
-- add_column(:reviews, :actionplan, :text)
   -> 0.0090s
== 20200411061306 AddStoryToReviews: migrated (0.0252s) =======================
```

mysqlを確認するとちゃんと追加されてます。
![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/b7d0a151-086f-72f5-9d03-85f97cc2f4f2.png)

以上。
SQLAlchemy+SQLite3でOperationalError

# やりたいこと

- SQLAlchemyでSQLite3を使いたい
- DBファイルを絶対パスで指定したい

## 環境

`Python3.8.1` on `alpine linux 3.11` on `Docker`

# おこったこと

`/var/data` にDBファイルが作成されることを期待し、以下のコードを書いた

```python
engine = create_engine("sqlite:///var/data/project.sqlite3")
...
```

実行したところdatabase fileが開けないと怒られた

> sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file


# 調査

`/var/data` はホストOS側のディレクトリをコンテナへマウントしているが、ホストOS側の操作で作成した `testfile` も正しく見えている

```
# ls -la /var/data/
total 16
drwxrwxr-x    2 1006     1006          4096 Apr 11 00:41 .
drwxr-xr-x    1 root     root          4096 Apr 11 00:41 ..
-rw-r--r--    1 root     root             0 Apr 11 00:41 testfile
```


# 解決

パスの指定方法を疑い、公式ドキュメントを確認してみた。

[SQLite — SQLAlchemy 1.3 Documentation](https://docs.sqlalchemy.org/en/13/dialects/sqlite.html#connect-strings)

> This means that the actual filename to be used starts with the characters to the right of the **third** slash.

> ```python
# relative path
e = create_engine('sqlite:///path/to/database.db')
```


相対パスはスラッシュ**3つ**な。


> An absolute path, which is denoted by starting with a slash, means you need **four** slashes

> ```python
# absolute path
e = create_engine('sqlite:////path/to/database.db')
```

絶対パス使いたいならスラッシュは**4つ**な。


## orz...

やりたかったことは `/var/data/project.sqlite3` への**絶対パス**指定なので、

`sqlite:///var/data/project.sqlite3`

ではなく、下記のように指定する必要があった

`sqlite:////var/data/project.sqlite3`


```python
engine = create_engine("sqlite:////var/data/project.sqlite3")
...
```

コードを修正したところ、正しく動くようになりましたとさ、めでたしめでたし。
WordPressのブロックエディタのグラデーションのセットをカスタマイズ

#グラデーションブロック使いたいけど、カラーセットは使いづらい

##WordPressのブロックエディタの初期カラーセット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/2b9b0a63-4b93-ca7d-c5f8-477ad731c7a2.png)

かなり個性的なセットですね。

WordPress5.4では```add_theme_support```の```editor-gradient-presets```でカラーセットが変更できるようになったみたいです。

```functions.php


add_theme_support(
	'editor-gradient-presets',
	array(
		array(
			'name'     => __('Vivid cyan blue to vivid purple', 'themeLangDomain'),
			'gradient' => 'linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)',
			'slug'     => 'vivid-cyan-blue-to-vivid-purple'
		),
		array(
			'name'     => __('Vivid green cyan to vivid cyan blue', 'themeLangDomain'),
			'gradient' => 'linear-gradient(135deg,rgba(0,208,132,1) 0%,rgba(6,147,227,1) 100%)',
			'slug'     =>  'vivid-green-cyan-to-vivid-cyan-blue',
		),
		array(
			'name'     => __('Light green cyan to vivid green cyan', 'themeLangDomain'),
			'gradient' => 'linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%)',
			'slug'     => 'light-green-cyan-to-vivid-green-cyan',
		),
		array(
			'name'     => __('Luminous vivid amber to luminous vivid orange', 'themeLangDomain'),
			'gradient' => 'linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%)',
			'slug'     => 'luminous-vivid-amber-to-luminous-vivid-orange',
		),
		array(
			'name'     => __('Luminous vivid orange to vivid red', 'themeLangDomain'),
			'gradient' => 'linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%)',
			'slug'     => 'luminous-vivid-orange-to-vivid-red',
		),
	)
);

```
nameでホバーした時に注釈がでます。gradientはまんまCSSですね。slugは被らなければOK

##変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/9c15b445-329f-275b-19cc-5caab8563493.png)



##グラデーションがボタンやカバーで使えるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/da196ad1-62a3-8dec-a073-b09b2c806931.png)

最近はあまりグラデーションをかけないデザイン多めだったのですが、ブラウザ的にCSSブレンドモードも使えそうなので表現の幅が広がりそうですね。
ログアウトボタンを押すと確認のアラートを表示させる方法

#概要
ruby on rails を使ってフリマアプリを作成しています。
実装している途中にユーザーがログアウトボタンを押すと何事もなかったかのようにログアウトがされることに気づき、その事についてメモ程度に記録を残しておきます。

#修正前の状態

[![Screenshot from Gyazo](https://gyazo.com/27dbbc218a670c6046b341b5ae6227bc/raw)](https://gyazo.com/27dbbc218a670c6046b341b5ae6227bc)

因みにコードはこんな感じ

```
.logout-user
  = link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__right--btn", id: "logout-btn"
```

このままですとユーザーが間違ってボタンを押した時にサイトから強制退場させられてしまいます。
せめて『ログアウトいたします。よろしいですか？』みたいなアラートが欲しいかなと思い考えました。

# java script（jQuery)を使う方法
まず最初に思いついたのはJavaScript（jQuery)を使う方法。
因みに、この時に知ったのですが、alertですとOK以外の選択肢がない為私が求めている実装としては不十分。クリックに対してYes or Noを選択するのはconfirmなのだそうです。

また知識が１つ増えました！！
これを実装するとすると

```
$(function(){
  $("#logout-btn").click(function(){
    var result= window.confirm('ログアウトします。よろしいですか？');
    if(result){
      // OKの時の処理
    }
    else{
      // NGの時の処理
    }
  })
});
```
みたいな感じでしょうか？
OKの場合とNGの場合で処理が分岐しますのでそれぞれの対応を考える必要があります。
ここで一瞬思考が停止・・・

さて、どうしたものか？
もっと簡単な方法はないだろか？

・・・
・・・
・・・　
ありました！！
# link_toメソッドのオプションを使う方法
なんと、今まで私がやろうとしていたことを全てrailsのオプションの中で解決出来ることがわかりました！！
コードを少しだけ追加するだけで解決です。

```
修正前
.logout-user
  = link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__right--btn", id:"logout-btn" 

修正後
.logout-user
 = link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__right--btn", id:"logout-btn" 
, data: {confirm: "ログアウトします。よろしいですか？"}　⬅️この部分が追加されました
```
data: {confirm: "ログアウトします。よろしいですか？"}
を追加するだけでログアウト確認のウインドウが出てきてOKとNGの分岐もしてくれるみたいです。

実際の挙動がこちら

[![Screenshot from Gyazo](https://gyazo.com/bd4b9b70b28b92a50796c890985ff553/raw)](https://gyazo.com/bd4b9b70b28b92a50796c890985ff553)
しっかりできてますね！
ちょっと感動しました。

因みにこんなところでも使っています。

[![Screenshot from Gyazo](https://gyazo.com/b573a3239625bed81001d1c2c9df0364/raw)](https://gyazo.com/b573a3239625bed81001d1c2c9df0364)

いろんなところで活躍するので覚えておくと便利ですね！

ここまでお読みになっていただいた方、本当にありがとうございます。
もう少しJSの勉強をして今度は心が折れないように、JSでも同じ実装が出来るように努力します。