OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】Railsのビューヘルパーのdate,timeとデータベースのdate型time型

## 概要
ビューヘルパーのdateやtimeの値をparamsから受け取ると次のようになっているため少し面倒だったという内容です。
合わせてこれをデータベースに格納したときのデータについても触れています。

```html
<select id="log_date_1i" name="log[date(1i)]">	# 年
<select id="log_date_2i" name="log[date(2i)]">	# 月
<select id="log_date_3i" name="log[date(3i)]">	# 日
<select id="log_date_4i" name="log[date(4i)]">	# 時
<select id="log_date_5i" name="log[date(5i)]">	# 分
```

## データの取り出し方
dateやtimeは次のように一つを指定しないと取り出すことができません。
パラメーター名に[:date]のように指定してしまうとnilが返ってきます。

通常

```zsh
params[:パラメーター名]
params[:モデル名][:パラメーター名]
```

datetime

```zsh
params["date(1i)"]
params[:モデル名]["date(1i)"]
```

## パラメーター
どのヘルパーでも1i~5iまで値が入ってパラメーターに入っています。
その影響でtimeは時間だけしか入力していなくても次のような値になってしまいます。
dateが年月日だけなのはよく分からないのですが...
これはアクティブレコードの問題らしいですが詳しくはわかりませんでした。

現在時刻をそのまま入れた場合:

```zsh
# datetime
Wed, 27 May 2020 08:04:50 JST +09:00

# date
Wed, 27 May 2020

# time
Mon, 01 Jan 0001 08:04:50 LMT +09:18
```

## データベースへの格納と表示
時間の場合time型を指定していれば先述のパラメーターの状態でもカラムに「08:04:50」だけが格納されていました。
しかし、そのまま取り出すと「Mon, 01 Jan 0001 08:04:50 LMT +09:18」の形で表示されてしまいます。

なのでフォーマットの必要が出てくるのですが、私は次のようにしています。
localeの設定が事前に必要になりますがここでは省略します。
参考の記事ではメソッドを定義しているので場合によって使い分けられればいいですね。



```yml:/config/locales/ja.yml
  time:
    am: 午前
    formats:
      default: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      long: "%Y/%m/%d %H:%M"
      short: "%m/%d %H:%M"
      only_time: "%H:%M"
    pm: 午後
```


```html:view.html.erb
<dd><%= l @form.time, format: :only_time %></dd>
```



## 参考
[Railsで時刻 time型を扱う](https://www.tbn.co.jp/posts/technology/2017/01/17/alias_attribute.html)
Pythonで複数のデータフレームを単一Excelファイルに出力

複数データフレームを1つのExcelファイルにまとめて出力。`index`で行名を、`header`で列名を無視する。

```python
writer = pd.ExcelWriter("data.xlsx", engine='xlsxwriter')
df1.to_excel(writer, sheet_name = "sheet1", index=False, header=False)
df2.to_excel(writer, sheet_name = "sheet2", index=False, header=False)
writer.save() 
```
Hangoutで会話を始めても着信し続けます

ど素人ですみませんが、おとといからHangoutがかかってきた際、スワイプして会話を始めても着信し続けます(バイブが止まりません)。どうすれば元のように会話を始めたら、着信バイブが止まるようになるかご存知の方はいらっしゃいませんか？
golang switch fallthrough

# golang の switchで使う fallthroughを試してみた

次のcase文に、条件に関わらずに進む。
この例だと、Aの条件が成立して実行されたあと、fallthroughで、
Case Bの節を実行する。
Case Cは実行されないので、その中のｆallthroughは通過しない。
もしa=Cだったら、defaultも
実行される。

```fallthrough.go
package main

func main () {
    a := "A" 
    switch a { 
    case "A":
        println("A")
        fallthrough
    case "B":
        println("B")
    case "C":
        println("C")
        fallthrough
    default:
        println("end")
    }   
}                                                                                                  
      
```
ruby subメソッドで使用した正規表現について

# 正規表現がうまく行かない
    address="都道府県,市区町村,番地,建物名部屋番号"
という変数があり、ここから、番地を取得したいとします。
結論からいうと、

    address.split(",")[2]
ですが、
正規表現でチャレンジしました。

まずはsubで、先頭の「都道府県,」を消して、それを２回繰り返そうと思いました。
のこった「番地,建物名部屋番号」から、「,」以降を消して終わりです。

まずは1回だけのバージョンでテスト

    address.sub(/.+,/,'')
「都道府県,」のみが消える予定です。

結果
"建物名部屋番号"
となっちゃいました。

/.+,/の部分が「都道府県,」になるだろうと予測したのですが、
「都道府県,市区町村,番地,」になっちゃいます。

試しに

    address.sub(/,/,'')
としてみると
「都道府県市区町村,番地,建物名部屋番号」
となり、最初の1個目をちゃんとけしてくれます。

なぜに？？？

・・・・・
まぁ番地のみ取得という問題は解決しているので
そういうもんだろうと今は割り切って次に進みます。
まだまだ、勉強中なもので、、、
今後勉強していけば、この疑問も晴れるかも、、、
よかったら誰か教えてＴＴ

#解答の一例ができたので以下に

    address.sub(/[^,]+,/,'')
### 簡単に　[^,]+,　を解説
　[^,]　で　,　以外の文字となります。例として、　[^A]　でA以外の文字です。
　[^,]+　で　,　以外の文字が一文字以上です。　[^A]+　でA以外の文字が一文字以上です。
　[^,]+,　で　,　以外の文字が一文字以上続いた後に　,　です。
　[^A]+,　でA以外の文字が一文字以上続いた後に　,　です。

最初の　.+,　は、任意の文字が続いた後に　,　だったので　都道府県,市区町村,番地,　になっていました。
　,　も任意の文字と捉えられていたので、この結果だったと思います。
そこで　,　以外の文字としたことで、　都道府県,　になったと思います。

こちらがとてもわかり易かったのでご紹介です^^
[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9 "初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」
")
[初心者歓迎！手と目で覚える正規表現入門・その２「微妙な違いを許容しつつ置換しよう」](https://qiita.com/jnchito/items/64c3fdc53766ac6f2008 "初心者歓迎！手と目で覚える正規表現入門・その２「微妙な違いを許容しつつ置換しよう」")

記事のご紹介ありがとうございました^^
緊急事態宣言が解除されてリモートワークはどうなるのか - 2020年5月子連れ在宅記録

[2020年、（3歳1歳と）私のリモートワーク](https://qiita.com/e99h2121/items/c8878d027603745a6426)
[在宅育児（と勤務）を支える技術](https://qiita.com/e99h2121/items/475045cabd005a7add57)
[子連れで在宅育児（と在宅勤務）を開始して１か月が経ちました](https://qiita.com/e99h2121/items/cb7471fd833b086b7233)

の続編、5月の開発期間を終了しての振り返りです。

## 振り返るにあたって

[子連れで在宅育児（と在宅勤務）を開始して１か月が経ちました](https://qiita.com/e99h2121/items/cb7471fd833b086b7233)
でも書きましたが、開発チームでは1か月毎に振り返りを行い、

- 失敗
- 問題、改善点
- そして成功、良かった点

を皆で前向きに発表して次に生かすということを行っています。


## 成功

今月、私のアウトプットは以下でした。
- 通常進行の2チケットを完了
- ややイレギュラー進行の2チケットを完了

つまりコロナ禍下で自分のチームにおける役割上、通常通りの進行をしました。

## 失敗

ここからがポエムです。

皆さん仕事って何のためにしていますか？私の会社に勤めているとある程度お金は貰えます。本来、これだけでもとても有難いと思わなければならないとはおもいます。

でも、生活費のための仕事の要素って半分くらいでもう半分はなんだかんだ言って楽しいから、仕事している（仕事＝ソースコードを書く、設計する、考える）、という気持ちもありませんか。今月はフルで緊急事態宣言下の在宅勤務だったわけですが、在宅「勤務」と在宅「育児」は両方「在宅」だからまとめられるかというとまとめられるわけねえ、が結論でした。

もちろんそれでも弊社はどちらかといえばなかなか社員思いなので保育園の書類さえ提出すれば有休が貰えます。「しんどい人は有休取れるよ」なのです。上で仕事＝ソースコードを書く、設計する、考える、つまり開発は楽しい！と書きました。ここで選択肢は楽しい仕事をお金だけ貰いながら休んで生きるために育児を優先させるか、敢えてそれでも楽しい仕事をとるかです。

私は仕事を取ってみました。だって楽しいしそれじゃないとやってられんと思いました。もう少しかっこよく言いたい気持ちを出すならそんな「はした金（有休）」が欲しいわけでもないのです。

しかし結果片や成功じゃなかった点のほうが多かったです。家庭内で色々とイライラすることしかありませんでした。具体的に書くと例えば集中しようとしてソース読もう書こうとしているとき。[^1]

```
throw new Exception("あれ取って");
throw new Exception("これ飲みたい開けて");
throw new Exception("おなかすいた");
throw new Exception("パズルやろー");
```
が5分おきくらいに差し込みとして入ってきて時として握りつぶしてしまっているのですがそれが精神衛生上たまらなく不味くて誰も得しない状態だったこと、です。

個人としての気持ちと、家に居るなら子供の面倒を見るべきという状況下、仕事を単なる労働として考えるなら「有休をとる」という答えが用意されていたわけですが一度も休みを取らなかった結果ソフト面にひずみが来たなと思いました。もう一か月やれと言われたら結構発狂するとおもいます。


## 改善したい点
解決策は見つかっていません！！

と書いてしまうと弊社・社内保育園に申し訳ないので補足しますが、私の会社の社内保育園はこんななかで6月開園準備を進めていました。すごい。在宅保育もトライしているようです。このスピード感もすごいです。ですが敢えて保育園のために会社に行くか？とか、先生の安全は？とか考えるとなかなか利用決断も、責任が伴う。難しい…。 幸せな悩みなのですが。

6月以降、地元保育園は「休園は解除するが登園自粛を求める」という`@deprecated`で再開するようです。私は自粛せず預けてしまおうと現時点では考えていますが、まあ、物理的に安全かというと科学的に考えてそんなことは無いと私はおもいます。家にいるほうが安全です。こうして、一人ひとりが考えないといけない時なのかなあ、と評論家的には思います。

早く通常営業できれば良いですが安全な世の中ではまだないでしょうし社会的にも再度自粛だ何だとまた言われてしまうととても仕事をしているどころではなくなり働けなくなる状況しか想像できない。どちらかというと物質的な答えを探るより精神的な面で答えを出すしかないのかもしれません。

「ほどほどにやれ」を受け入れる精神が必要だなと。

引用: [この時期、業務で低パフォーマンスを出し続ける覚悟](https://tagomoris.hatenablog.com/entry/2020/04/16/104307) 

まだまだモヤモヤは消えないのですが、そういえばお客様からの問い合わせのほうを少しでも楽にするためのガイドラインも、そういえば今月作ったりしたのでした。同様、細かい時間で結果を出しやすい手法、物理労働ではない知的な仕事を模索したいなあーーーーー！[^2]

[^1]: ソースはせっかく始まった会社ロゴ付きQiita記事にポエムばかり書いていて申し訳ない気持ちも表現しています。
[^2]: と考えた結果またこんな記事を書いてしまいました。
Windows10でwxpython使ったらdatetime.datetime.strptimeで「ValueError: unknown locale: ja-JP」

wxpython使ってWindows向けGUIを作ってみていたのですが、
「application = wx.App()」とした後に
「datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S')」としたら
「ValueError: unknown locale: ja-JP」となってしまいました。

デバッグで追っていったところwx.App()をするとイニシャル処理で「InitLocale()」が実行されて
「self._initial_locale = wx.Locale(wx.LANGUAGE_DEFAULT)」
と処理されて実行OSのlocaleが設定されるようなのですが・・・
https://docs.wxpython.org/wx.Language.enumeration.html
それが「ja\_JP」となるようです。

「ja_JP.UTF8」とかじゃなくて「ja_JP」です。

localeに「ja_JP」が設定されている状態で
「locale.getlocale(locale.LC_TIME)」とかやると
（datetime.datetime.strptimeの中で実行されます。）
「ValueError: unknown locale: ja-JP」とエラーになります。

「ja_JP.UTF8」がセットされていれば
「ValueError: time data '20/Aug/2020:17:28:00' does not match format '%d/%b/%Y:%H:%M:%S'」というエラーになるのですが、そこまでたどり着くこともありません。

## 環境情報

OS: Windows 10
Python: 3.7.7

## 事象の再現と解消・・・というかとりあえず回避

```python:事象再現と解消
import datetime
import wx

def test_func1(self):

    print(datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S'))

def test_func2(self):

    application.ResetLocale()

    print(datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S'))

    application.InitLocale()

if __name__ == '__main__':

    application = wx.App()

    frame = wx.Frame(None, wx.ID_ANY, title='test')

    exechg_button1 = wx.Button(frame, wx.ID_ANY, 'エラー発生')
    exechg_button2 = wx.Button(frame, wx.ID_ANY, 'エラー回避')

    exechg_button1.Bind(wx.EVT_BUTTON, test_func1)
    exechg_button2.Bind(wx.EVT_BUTTON, test_func2)

    frame_sizer = wx.BoxSizer(wx.VERTICAL)
    frame_sizer.Add(exechg_button1)
    frame_sizer.Add(exechg_button2)
    frame.SetSizer(frame_sizer)

    frame.Show()
    application.MainLoop()

```

「エラー発生」ボタンを押すと再現します。
「エラー回避」は解消というか回避案です。
ここではwx.APPで用意されている「InitLocale()」「ResetLocale()」を使用して回避しました。
https://wxpython.org/Phoenix/docs/html/wx.App.html

wx.APP()のイニシャル処理で設定されるロケールは「ResetLocale()」で元に戻せるようなので、「datetime.datetime.strptime」のようにlocaleの影響を意識しなければいけない処理に入る前に「ResetLocale()」して完了次第「InitLocale()」するようにしました。

「ResetLocale()」ではなく
「locale.setlocale(locale.LC_TIME, 'C')」と直接locale設定しても良かったのですが（というかそもそもlocaleを意識しなければいけない処理なので、それはそれで正しいかと思いますが）せっかくなのでwx.APPで用意してくれている「ResetLocale()」のみで対応しました。

## 私のWindows10環境でwxpython利用した際にlocaleを「ja_JP」ではなく「ja_JP.UTF8」にするにはどうすればいいのだろうか。

悩み中
HTMLとCSSの関心の分離設計(下書き)

# 課題意識
HTMLとCSSは分離すべきだという一般論があるが、レイアウトの構造を整えるためのHTML要素やアニメーションで表現を変えるためのHTML要素も存在する。

HTMLとCSSは本当に分離できるのか、分離できるとしたら何が分離できて、分離できないとしたら何が分離できないかを整理する必要がある。

また、レイアウトは他のプログラミング機能と違い、単独のモジュールとしてでなく全体で初めて意味を持つ。

そのようなレイアウトの性質を踏まえ、どのようにレイアウトを設計すべきなのか。

レイアウトの共通化の単位はCSS単位ですべきなのかコンポーネント単位ですべきなのか。
コンポーネント単位だとしたら、それはHTMLとCSSが結合した状態に他ならず、分離を考えるよりもむしろ結合を前提にコンポーネント単位で関心を分離する方が適切なのではないか。

そういった事に関する考察。

## Memo
1. What is content and what is layout.
2. What is separation of concerns.
3. Why does separation of concerns matter.
4. Not separation but direction of dependency.  
5. Difference of component and css.
6. What is Utility class


### 参考
https://yuheiy.hatenablog.com/entry/2020/05/25/021342
JavaScriptの基礎

#JavaScript(JS)とは
Web開発等で用いられるフロントエンド言語
JSのライブラリには以下がある
-jQuery:効果やアニメーションの実装が可能なライブラリ
-React：Facebookが開発したUIに特化したライブラリ
-Node.js：サーバサイドでJSを実行するためのライブラリ

#基本的コマンド
##コンソール（画面への文字出力）
`console.log("○○")`
()内は""でも''でも可
文末のセミコロンを忘れずに

#####入力例

~~~js
console.log("あいうえお");
~~~

#####出力例
あいうえお

##変数の代入
プログラムの中では多くの値を用いるため、間違えないように、そして値の変更を容易にするために、変数を用いる。

変数のイメージとしては、変数という箱の中に、文字列や数字などの値が入っている感じ

#####書き方
`let 変数名　= 値（文字列なら"○○"）`

#####入力例

~~~js
let food = "ラーメン";
console.log(food);
console.log("food");
~~~

#####出力例
ラーメン
food

##変数の更新
プログラムは上から順に実行されるため、後から代入された値で変数の中身が更新される

#####書き方
`変数　= 更新結果;`

#####入力例

~~~js
let number = 1;
console.log(number);

number = number + 8;
console.log(number);
~~~

#####出力例
1
9


##定数
定数は変数と異なり更新不可

#####書き方
`const 定数名　= 　値`

#####入力例

~~~js
const food = "soba";
console.log(food);
~~~

#####出力例
soba


###出力文字の連結
方法は2つある
1. 出力したい異なる種類の値を+で連結
`console.log("文字列"+変数+"文字列");`
2. テンプレートリテラルを用いる
`console.log('文字列${変数名or定数名}文字列');`

#####入力例
~~~js
let food = "ラーメン";

//1．の方法
console.log("好きな食べ物は"+food+"です");

//2.の方法
console.log.('好きな食べ物は${food}です');
~~~

#####出力例
好きな食べ物はラーメンです
好きな食べ物はラーメンです


##条件分岐①
`if(条件式){処理}`
文末セミコロンは不要

#####入力例

~~~js
const number = 12;
if(number>=10){
　console.log("numberは10より大きい");
}
~~~

#####　出力例
numberは10より大きい

##条件分岐②
ある値によって処理を分岐する場合に利用
`switch(条件の値){ case 値1:  処理;  break; default:  処理:　break; }`

####<font color="red">breakは忘れない</font>
breakが出るまで処理が続きます

:と;の使い分け注意
　:　文中
　;　文末({}の外には不要)

defaultは値を指定せずにそれ以外の意
#####入力例

~~~js
const color="黒";
switch(color){
 case "赤":
  console.log("止まってください"):
  break;
 case "青":
  console.log("渡っていいですよ"):
　break;
 case "黄":
  console.log("注意して渡っていいけど無理して渡らないで"):
　break;
 default:
  console.log("それは信号じゃない");
  break;
}
~~~
#####出力例
それは信号じゃない

##繰り返し処理①
条件式が成り立つ間、処理が繰り返される
`while(条件式){処理}`
#####入力例
~~~js
let number = 1;
while(number<=3){
 console.log(number);
 number ++
}
~~~
#####出力例
1
2
3

##繰り返し処理②
①の初期値、条件式、変数更新をまとめて記述し、条件が成り立つ間、処理が繰り返される

`for(変数の初期値;条件式;変数の更新){条件式}`

()内の区切りは<font color="red"> **;**</font>
#####入力例
~~~js
for (let i=1;i<=3;i++){
 console.log(i);
}
~~~
#####出力例
1
2
3

##繰り返し処理③
配列に対する繰り返し処理

`配列名.forEach(function(任意の配列の要素の名前){処理内容});`
#####入力例
~~~js
const numbers =[1,2,3];
numbers.forEach(function(number){
 console.log(number);
}); 
~~~

#####出力例
1
2
3
【Rails】フォームのエラーメッセージを入力項目ごとに表示する

## 実現したいこと
次の画像のようにフォームにある入力項目一つ一つに対してエラーメッセージを表示させます。
<img width="960" alt="スクリーンショット 2020-05-27 6.40.32.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545044/95472bf5-602a-d27e-ab73-5c2d0fe52bed.jpeg">

localesでの日本語化もしていますが、こちらのインストールなどについてはカバーしていないので知りたい場合は参考のURLなどから確認してください。

## 環境
ruby:  2.7.1
rails:  6.0.2.2

## コード

### エラーメッセージ表示のパーシャルを作成
modelとattributeを変数にすることで使いまわせるようにしています。
errors.full_messages_forを利用して入力項目に対応したエラーメッセージのみを表示します。
/app/views/layouts/_error_messages.html.erb

```html:_error_messages.html.erb
<% if model.errors.any? %>
  <div class="alert alert-warning">
    <ul>
      <% model.errors.full_messages_for(attribute).each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

### フォームのパーシャルを作成
これは場合によると思いますが、フォームは基本new、editで使い回すことになると思うのでパーシャルにします。
「model: @form, attribute: :date」で入力項目ごとの値を指定すれば対応したエラーメッセージのみ表示可能です。

/app/views/logs/_form.html.erb

```html:_form.html.erb
<%= form_with model: @form, local: true do |f| %>

  <div class="field">
    <%= f.label :date, "日付" %>
    <%= f.date_select :date, use_month_numbers: true, start_year: Time.now.year - 20, end_year: Time.now.year %>
　　<!-- エラーメッセージの呼び出し -->
    <%= render "layouts/error_messages", model: @form, attribute: :date %>
  </div>

<!-- ~略~ -->
```

### エラーメッセージの日本語化
このままではエラーメッセージが「Dateは1文字以上で入力してください」のように表示されるので、対応する日本語を指定して日本語化します。
/config/locales/ja.yml

```yml
ja:
  activerecord:
    models:
      form: "フォーム"
    attributes:
      log:
        date:               "日付"
        country:            "国"
        prefecture:         "都道府県"
        area:               "地域"
        point:              "ポイント"
```

### ビューの表示
使用する場所でフォームを呼び出して終了です。
/app/views/logs/new.html.erb

```html:new.html.erb
<h1>フォーム</h1>
<%= render 'form' %>
```

## 後書き
この手の表示は皆さんしていることだと思うのでもっと簡単な方法やGemなどあるのかもしれませんが見つけられなかったのでこのような感じに実装してみました。
参考の一つにあるのですが、そのうちajaxでリアルタイムに表示させられるようにしたいですね。

## 参考
[【Rails】バリデーションのエラーメッセージを表示する](https://blog.yuhiisk.com/archive/2018/05/22/rails-display-error-message.html)
[バリデーションの日本語表示の仕方](http://shoohei.hatenablog.com/entry/2017/10/15/195748)
[Rails エラーメッセージの表示](https://qiita.com/ryuuuuuuuuuu/items/1a1e53d062bff774d88a)
[rails で日本語化をしているのですが、attributesの日本語化が適用されません](https://ja.stackoverflow.com/questions/22083/rails-%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C-attributes%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%E3%81%8C%E9%81%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93)
[Railsでajax通信時にattribute名とfull_messageの組み合わせでレスポンスを返す](http://yucatio.hatenablog.com/entry/2017/04/14/024052)
BindsNETでSNNを試してみる


[前回の記事でBrian2を使ってみました](https://qiita.com/takeajioka/items/11690b9adee612e48b33)が、今回はSNNの実装が出来るソフトであるBindsNETを使ってみます。

SNN(Spiking Neural Network)は現在のDeep Learningよりも神経生理に近いもので、神経活動のシミュレーションを利用して学習を行います。
SNNやBindsNETについては[こちらの記事](https://qiita.com/arakiii/items/b076a5c9e57c08c49a9a)でも紹介されています。

GitHub：https://github.com/BindsNET/bindsnet
論文：https://www.frontiersin.org/articles/10.3389/fninf.2018.00089/full
ドキュメント：https://bindsnet-docs.readthedocs.io/

NEURONやBrian2はシミュレータの用途メインなのに対して、BindsNETは機械学習のソフトとしての用途メインになるかと思います。
BindsNETはPyTorchをベースとしていて、GPUも利用することが出来ます。
BindsNETによって教師あり学習や教師なし学習だけでなく、強化学習も実装可能のようです。

# インストール
環境は
Ubuntu 16.04
CUDA 10
Anaconda
Python 3.6
です。

```shell
pip install bindsnet
```
これでインストールできました。
バージョンは0.2.7でした。

ただしこのままだとデモを動かした時にエラーになりました。
対処法としてはPytorchのバージョンを変えてpytorch==1.2.0にインストールし直すことで解決しました。

# デモを試してみる
まずはgit cloneでダウンロードします。

```shell
git clone https://github.com/BindsNET/bindsnet.git
```
デモはbindsnet/examples/の中に色々あります。
とりあえず教師あり学習のデモを実行してみます。

```shell
cd examples/mnist/
python supervised_mnist.py
```
完了には20分ほどかかりましたが、無事動きました。
--gpuオプションでGPUを使用できましたが、速くはなりませんでした。(むしろ若干遅くなりました。)
またテストスコアがあまり良くないのも気になりました。

教師なし学習(Diehl&Cook)のデモも実行してみます。

```Shell
python eth_mnist.py
```
こっちは完了に数時間かかるようです。

他には、自己組織化マップ（SOM）やリザーバーコンピューティング、強化学習などのデモがありました。

# 実装方法
[ドキュメント](https://bindsnet-docs.readthedocs.io/guide.html)によると、実装方法は
①ネットワークの作成　と　②学習則の定義
の２つを行うようです。
ネットワークの作成では、LIFニューロンなどを層として定義して結合させます。
学習則の定義では、結合に対してHebb則やSTDP則などの学習則を設定します。

# 最後に
BindsNETは神経ダイナミクスのODEを解くことは出来ませんが、SNNによる学習を簡単に行うことが出来るようです。
SNNを使った機械学習はまだ発展途上の分野で様々な研究が行われており、BindsNETが大きな役割を果たすかもしれません。
mod_wsgiでhttpd.confのディテクティブが不足するとアプリがハングアップする

WindowsにてApache + mod_wsgi + flaskでPython3.7アプリを動かそうとしていた同僚から、
「基本的に動作したが、使いたいモジュールのimport文を追加しただけで動かなくなる」
という相談を受けたので調査した。

症状としては、Webブラウザでアクセスすると「・・・の待機中」となり、一向に表示されない。
アプリがハングアップしたか、停止しているように思われる。
import文をコメントにすると正常に表示される。
import文を有効にしてcmd.exeで実行しても正常に表示できる。
cmd.exeとApache上での実行環境の違いが原因と考えて調査した。

結論
https://living-sun.com/ja/ython/726892-flask-wsgi-application-hangs-when-import-nltk-python-flask-wsgi-nltk.html
を見たところ、httpd.confのディテクティブ WSGIApplicationGroup が足りないことに気づいた。

```Apache:httpd.conf
<VirtualHost *:80>
	WSGIScriptAlias / "wsgi	のパス"
	<Directory "wsgiディレクトリのパス">
		Require all granted
		WSGIScriptReloading On
		WSGIApplicationGroup %{GLOBAL} # ←これ
	</Directory>
</VirtualHost>
```

この情報にたどり着くまでに多くの時間を浪費してしまった。
mod_wsgiの解説記事を書いている方はWSGIApplicationGroupも記載してください。
同じような事態に陥った人のためにメモしておきます。
【Rails】一つのメソッドをf.selectのオプションとバリデーションで使い回す

## 前置き
erbのセレクトボックス一つ一つにオプションの値を書いていると、見落としや編集の手間を感じたので1箇所に集めようと思った。
初めはhelperを使用していたが、同じ配列がバリデーションでも流用できるのではと思い今回の形になりました。

しかし、セキュリティの側面からみた場合、バリデーションで同じメソッドの値を使い回すこのやり方はどうなのか？という疑問が残ります。
また、バリデーションで流用するためにmodelにメソッドを定義しましたが、viewで表示するデータの作成は本来のmodelの役割ではない部分も意識する必要がありそうです。

## 環境
ruby:   2.7.1
rails:  6.0.2.2

## コード

### model
```ruby
 class Log < ApplicationRecord

# クラスメソッドの定義
  class << self
    def selectBoxOptions(key)
      if key == "fruits"
        return [ "なし", "りんご", "いちご"]
      elsif key == "vegetables"
        return [ "きゅうり", "とまと", "なす" ]
      end
    end
  end

 # バリデーションの作成。
 validates :fruits, inclusion: { in: selectBoxOptions("fruits") }
 validates :vegetables, inclusion: { in: selectBoxOptions("vegetables") }

end
```

### view
```html
  <div class="field">
    <%= f.label :speciality, "スペシャリティ" %>
    <%= f.select :speciality, Log.selectBoxOptions("fruits") %>
  </div>

  <div class="field">
    <%= f.label :entry_way, "エントリー方法" %>
    <%= f.select :entry_way, Log.selectBoxOptions("vegetables") %>
  </div>
```
## 後書き
enumを使用するという方法もあったのですが、それだけだとinputのvalueが数字になってしまうのでlocaleで日本語化する必要があったり、データベース保存は英語になるなどで今回実現したい内容には不向きなようでした。
[[Rails] selectタグの選択肢の管理方法についてメリデメ比較をしてみる](https://qiita.com/HrsUed/items/56677d6c266d8a53ffa7)
[【Rails】Enumってどんな子？使えるの？](https://qiita.com/ozackiee/items/17b91e26fad58e147f2e)

なんやかんや方法はあるのでやりたいと思ったことはほぼ実現できますが、それが利にかなっているのか？正しい設計なのか？という部分は自分では判断しきれない部分が多々あり難しいですね。。。
もっと勉強しなければ！

## 参考
[Railsのviewのパーシャルで、modelで定義したメソッドを利用すると発生するエラーを解消したい](https://teratail.com/questions/73430)
[Railsのモデルに書いたメソッドってどうやってコントローラで使うの？](https://qiita.com/leavescomic1/items/99f32f45cd04035f146c)
初心者によるプログラミング学習ログ 327日目

#100日チャレンジの327日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
327日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>327日目 2h<br>・ポートフォリオ作成2h：cssアニメーション導入など<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1265379839877378053?ref_src=twsrc%5Etfw">May 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
TeX出力の行列計算TeX電卓

# TeXめんどい
大学に入ってから初めてTeXというものをつかった．便利で大変良い．まだB1なので行列計算とかもまだ簡単．でも手書きでレポート出すなら簡単で，ぱっとやって提出できるけど，TeXだとそうは行かない．紙に計算して，TeXの形式に打ち込んでとまあまあめんどくさい．慣れてないし，補助ツールがぐぐってもみつからない．TeXの形式で渡したら自動で計算してくれるところとかさがしたけどあんまりしっくりこない．

# つくった
ということで行列を入力したら計算してくれるやつを作った．

```python
import numpy as np


# tex
def tex_text(A):
    A_mat = ""
    for l in A:
        l_tex = ""
        for r in l:
            if r == int(r):
                l_tex += str(int(r))
            else:
                l_tex += str(r)
            l_tex += "&"
        l_tex = l_tex[:-1] + r"\\"
        A_mat += l_tex
    A_mat = r"""\left(\begin{array}{ccc}@\end{array}\right)""".replace("@", A_mat)
    return A_mat


# mat input
def input_mat(arg_name, a_line, a_rows):
    cal_flag = False
    while cal_flag == False:
        A = []
        print(f"{arg_name} = ")
        for i in range(a_line):
            print(f'[{i + 1}]', end='')
            inputs = list(map(float, input().split()))
            if len(inputs) == a_rows:
                cal_flag = True
            else:
                print("Argment Error, input again")
                cal_flag = False
                break
            A.append(inputs)
        A = np.array(A)
        if cal_flag:
            print(tex_text(A))
            return A


a_line = int(input("A Lines:"))
a_rows = int(input("A Rows:"))
b_line = int(input("B Lines:"))
b_rows = int(input("B Rows:"))

A = input_mat('A', a_line, a_rows)
B = input_mat('B', b_line, b_rows)

cal_flag = False
while cal_flag == False:
    calc = input("what calc:")
    if calc == "@":
        C = A @ B
        cal_flag = True
    elif calc == "+":
        C = A + B
        cal_flag = True
    elif calc == "-":
        C = A - B
        cal_flag = True

print("C:")
print(C)
print("A")
print(tex_text(A))
print("B")
print(tex_text(B))
print("C")
print(tex_text(C))


```

#　使ってみた
まあまあ便利．どうせ最初の数週間しかつかわんし，クオリティは求めてない．

旧バージョン
![スクリーンショット 2020-05-27 4.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263501/d4f62701-09a9-07eb-0f81-ddf1bcb0e27a.png)

新バージョン
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">行列の授業の最初の方でTeX書くのがめんどくさくて作ったやつを供養<a href="https://t.co/FuJjDAVMRJ">https://t.co/FuJjDAVMRJ</a> <a href="https://t.co/72vLEqF8fZ">pic.twitter.com/72vLEqF8fZ</a></p>&mdash; 電電猫猫 (@nya3_neko2) <a href="https://twitter.com/nya3_neko2/status/1280573770567020544?ref_src=twsrc%5Etfw">July 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Windows10 ＰＣをサブディスプレイ化する方法

使っていないノートＰＣがあったので　

サブモニターにできるかな～と思ったら。　

めっちゃ簡単にできたので　

その方法を紹介します。　



サブディスプレイ化にする方法は色々ありますが　

今回紹介する方法は　一番簡単な　Windowsの接続です。　

ただしこれをやるのには　条件があって　

- 　サブディスプレイにしたい方がWindows１０のＰＣであること　

- ＰＣがMiracastに対応していること　

この２つが条件です。　

　

# ステップ１　

サブディスプレイにしたい方のWindowsＰＣで

Windowのスタートから　接続を選択します。



# ステップ２　

メインＰＣの方で　設定を開いて　　

システムから　プロジェクションを開きます。　

そしたらこんな画面になるので　

設定を　どこでも使えるに変えます。　

これは両方のＰＣで　設定します。


![bandicam 2020-05-27 03-48-59-510.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295760/37740672-ad53-7dd3-3f79-5c92e4b706af.jpeg)





# ステップ３　

メインＰＣで

今度は設定から　ディスプレイを開くと　こんな画面になるので

マルチディスプレイの　検出をクリック　

そしたら、サブディスプレイ側のＰＣが出てくるので　

それを選択すれば、無事に接続できます。

もちろんこれはメイン側　サブ側どちらからでも操作ができるので　

なかなか便利だと思いますね。

![bandicam 2020-05-27 03-49-57-123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295760/dea01f6e-8061-aeee-dd99-f6de1a5075c7.jpeg)
ec2デプロイ、unicorn.logのエラーActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessageの解決法

これを試す。

https://qiita.com/shota0701nemoto/items/2a7f5556803926c33d45#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E5%90%88%E8%A8%884%E3%81%A4%E3%81%AEmasterkeycredentialsymlenc%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E7%B4%90%E3%81%A5%E3%81%91%E3%82%8B%E6%89%8B%E9%A0%86



下記の作業で本番環境が更新されるはずなのだが、どうしても上記の作業をしなければいけない。

```
bundle exec rake assets:precompile RAILS_ENV=production
$  sudo service nginx restart
$  sudo systemctl restart  postgresql
$  ps -ef | grep unicorn | grep -v grep
$  bundle exec unicorn_rails -c /var/www/rails/Portfolio/config/unicorn.conf.rb -D -E production
```

上記の作業をしなくても良い手動デプロイ方法がありましたら教えてください。
EC2デプロイの際のエラーActiveRecord::AdapterNotSpecified: The `production` database is not configured for the `production` environment.

database.ymlに何らかの記述ミスが起こっている。

私の場合はEC2上でgit pull origin masterをした場合に変更内容がコンフリクトしていた。

正しい方にすることよって動きました。
【Unity】ほしゆきトゥーンシェーダーのUniversal RPおよびHDRP対応計画について

# ほしゆきトゥーンシェーダーのUniversal RPおよびHDRP対応計画について

今後の方針的なもの。

## はじめに
『[ほしゆきトゥーンシェーダー(以下HTS)][github]』は2017年末にGithub上で公開され、以下のような特徴を持っています。

- [ビルトインパイプライン向け][brp]
- トゥーンシェーディング専用の[グローバルイルミネーション][gi]
    - [Light Probe Proxy Volume][lppv]やライトマップへの対応
    - HDR下での破綻のないライティング
- 物理ベースマテリアルとの調和のしやすさ
- [サーフェイスシェーダー][surface]や専用の関数を通したカスタマイズ

公開以後、Unityがバージョンアップするにつれて[スクリプタブルレンダリングパイプライン(SRP)][srp]が普及し[Shader Graph][shadergraph]や[Visual Effect Graph][veg]などの利用も増えるなかで、ほしゆきトゥーンシェーダーはビルトインパイプライン向けであることがネックとなってきています。  
また配布開始以来、広報面でも課題がありました。

そこで新たに[ユニバーサルレンダリングパイプライン(Universal RP)][urp]および[HDレンダリングパイプライン(HDRP)][hdrp]上で動作する新しいシェーダーアセットの開発を計画します。

その名も『**ほしゆきユニバーサルシェーダー**』です(ｷﾘｯ。


## 予定している機能
### Shader GraphおよびVisual Effect Graphへの対応

LitおよびOutlineLitマテリアルを[Shader Graph][shadergraph]上で編集可能にします。  
また、HTSのシェーダー内部で使用されている補助関数をノード化して応用性を高める予定です。

また、[Visual Effect Graph][veg]上での制御も可能にする予定です。


### その他
- HTSや、他のシェーダーからの移行を容易にする機能の搭載
- パラメーター変更やエディッタ拡張などを支援するスクリプトAPI


## 検討をしている機能
可能であれば搭載を予定している機能。

### アウトライン機能の強化
ポストエフェクトの利用などによる従来のアウトラインよりもよりアニメやイラストに近い実装の検討。  
これは調査や実験がかかるかもしれないです。

### 遅延レンダリングの対応
スクリーンスペースアンビエントオクルージョン(SSAO)やスクリーンスペースリフレクション(SSR)などの機能を対応を目的。

現時点では完全な遅延レンダリングよりも、物理ベースマテリアルとの共存による対応を計画。

### レイトレーシングの対応
動作が可能であれば検討。



## 広報など
HTSではwiki作成などの充実化などの便宜はあったものの、情報発信やアクセス解析に課題が見られた。  
そのため以下の改善が必要と考えています。

- 発信手段および配布形態の見直し
- アクセス解析の改善
- チュートリアル作成などの資料の充実化



## 公開時期および配布方法など

- 配布予定 : 2020年秋
- 公開場所 : GithubかAsset Store



## あとがき
2020年は社会はコロナの流行による不安、自分はなれない一人暮らしとテレワークによるSNS依存という逆風に立たされる羽目になりました。  
この記事も実はSNS依存の影響が大きかったりしたりする。

それはさておき、意見やご希望などがあればどんなことでもお構いなくコメントをどうぞ！

## 参考リンク

- [Github][github]
- [ほしゆきトゥーンシェーダーの特徴][about]
- [紹介ページ][official]

<!-- LINKS -->
[github]:https://github.com/Masterexa/HoshiyukiToonShader
[about]:https://qiita.com/Masterexa/items/f822a8b38589fb564d9d
[official]:https://masterexa.github.io/products/HoshiyukiToonShader

[surface]:https://docs.unity3d.com/ja/2018.4/Manual/SL-SurfaceShaders.html
[lppv]:https://docs.unity3d.com/ja/2018.4/Manual/class-LightProbeProxyVolume.html
[gi]:https://docs.unity3d.com/ja/2018.4/Manual/SL-SurfaceShaders.html
[brp]:https://docs.unity3d.com/ja/2018.4/Manual/SL-RenderPipeline.html
[srp]:https://unity.com/ja/srp
[urp]:https://blogs.unity3d.com/jp/2019/09/20/how-the-lightweight-render-pipeline-is-evolving/
[hdrp]:https://unity.com/ja/srp/High-Definition-Render-Pipeline
[shadergraph]:https://unity.com/ja/shader-graph
[veg]:https://unity.com/ja/visual-effect-graph
Dockerを使用したRails開発 初期ソースコード生成とGemパッケージインストール (Could not find xxx in エラー)

##初めに
これまでの制作で、Railsコンテナにログイン・ログアウトができるようになりました。
なので、ここからは「PostgreSQL」を使用して、初期ソースコードを生成・Gemパッケージインストールを行います。
また、gemパッケージインストールでエラーを連発しました。
もしも、私と同じエラーでつまづきましたら、参考にしてください。

#マシンスペック
・macOS Catalina
・バージョン 10.15.4
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

##初期ソースコードの生成

①コマンド入力
「rails new」コマンドで新規アプリケーションを制作します。
しかし、今回は「PostgreSQL」を使用するので、記載が複雑になっています。

```rails new ●● -d postgresql --skip-test-unit```

●●はアプリ名を英語で入力してください。
test::unit関連のコード生成省略のために「--skip-test-unit」を使用しています。

②初期ソースコード確認
ソースはアプリのフォルダに生成されているので、中身を「Is -a」コマンドで確認ができます。
```Is -a ●●```

●●はアプリ名を英語で入力してください。

問題がなければ、ソースコードが表示されます。

##gemパッケージのインストール

①Gemfileの編集
アプリフォルダの中に「gemfile」があるので、こちらをエディターソフトで開き
以下必要なgemを追記しました。

```gem 'bcrypt'
gem 'rails-i18n'
gem "kaminari"
gem 'date_validator'
gem "valid_email2"
gem "nokogiri"```


```gem "capybara"
gem "selenium-webdriver"
gem "webdrivers"
gem "rspec-rails"
gem "factory_bot_rails"```



②gem パッケージのコマンド実行

gemfileに入力後、通常は以下のコマンドでgemパッケージ群をインストールできるのですが、私はここでエラーを多発させました。

 ```bin/dundle ```

<img width="366" alt="Docker_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/72dd2837-18fc-65c1-f778-07f2e7c7e58c.png">


 ```Could not find xxx in```

というエラーです。

このエラーは、Gitからアプリをダウンロードしたり、rubyのバージョンを上げることにより発生します。
私は解決のために、以下のサイトを使用しました。

<img width="1296" alt="Docker_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/fae7cecb-80fc-c575-7f60-446c5b4698f6.png">
https://rubygems.org

```Could not find bcrypt-3.1.13 in any of the sources```
なので「bcrypt」を「bcrypt-3.1.13」に変更する必要があるので直していきます。

まずは「bcrypt」を検索

<img width="1302" alt="Docker_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/baad1985-1562-175e-ce88-632f62e79f3f.png">
<img width="1295" alt="Docker_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/68a00b72-1217-5529-a7d9-1d7420b08d1c.png">

2枚目の左にあるソースコード

gemfile
```gem 'bcrypt', '~> 3.1', '>= 3.1.13'```

インストール
```gem install bcrypt```

をそれぞれ入力して「bin/bundle」を行います。

<img width="286" alt="Docker_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/056a7d22-5790-239e-b04a-420afc29cecb.png">

他のgemも同じくエラーがでたので、同じ方法で直しました。

②Gemのパッケージリスト表示

無事にここまで進みましたら、gemパッケージをリスト表示できます。

```bin/bundle list```
<img width="413" alt="Docker_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/59fbfc08-2834-9edc-90e9-766cb720371a.png">

・・・・・


##エラーの参考記事
https://qiita.com/jnchito/items/44ab1df134369ed76911

以上になります。
ここまで、読んでいただきありがとうございました。

gemパッケージでエラーが発生して、驚きましたが解決できてよかったです。
WindowsのVSCodeでPythonのIntelliSenseが表示されないときの対処法

最近のエディタでやっぱり優秀なのはIntelliSens(Autocomplete)だと思う。入力の手間が省けるだけじゃなくて、引数の形とかも出してくれるし、ちょっとしたドキュメントもついてるからめっちゃ有能。

でも、VSCodeを使ってPythonの開発をしていて、```opencv-python```, ```numpy```, ```scipy```, ```pandas``` などの巨大なライブラリではIntelliSenseが出てこなかったので、色々調べて直した方法をメモ。ただ、あんまり情報がなかったので、これで全員が解決するかはわからない()

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628276/23a18141-e571-309e-dfa0-d7dd697208f4.png)


## 環境
- OS : Windows 10 Home
- VSCode : 1.45.1
- Python : 3.8.3

**Anaconda経由ではなく、Pythonを直接インストールしています。**

## ```settings.json```

```terminal
pip install [パッケージ名]
```
としてパッケージがインストールされるフォルダを、VSCodeの```settings.json```の```"python.autoComplete.extraPaths"```に書き足せばよい。

例えばPython3.8系のものを、インストーラーのデフォルトの設定でインストールした場合は、以下のフォルダに入ります（多分）。Pythonのバージョンが3.7系なら```Python38```を```Python37```に読み替えればいいだけです。

- ```C:\Users\<ユーザー名>\AppData\Roaming\Python\Python38\site-packages```
- ```C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python38\Lib\site-packages```

これを書き足せばいいです。
ただ、1つの環境のみで開発していて、```settings.json```をその環境以外とは共有していないのであればこのまま書けば良いですが、例えば[Settings Sync](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)などを使って共有している場合は```<ユーザー名>```が同じとは限らないので環境依存しない書き方をします。
```settings.json```では[環境変数的なの](https://code.visualstudio.com/docs/editor/variables-reference)が使えないので、```settings.json``` (以下の場所にあります)からの相対パスで上記のディレクトリを指定しました。

- ```C:\Users\<ユーザー名>\AppData\Roaming\Code\User\settings.json```

以下のようになります。回りくどいので他にいい方法あれば教えてください。

```json:settings.json
...
"python.autoComplete.extraPaths":[
    "../../Python/Python38/site-packages",
    "../../../Local/Programs/Python/Python38/Lib/site-packages"	
],
...
```

後はVSCodeを再起動すれば、IntelliSenseが使えると思います。ついでに、```import```のところの```unresolved import '~~~' Python(unresolved-import)```も出なくなっていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628276/2524742d-abb4-f3fc-3f63-b73bf845b3ef.png)


## 備考
### ```"python.jediEnabled"```を```false```にする

人によるかもしれないのですが、```settings.json``` の```"python.jediEnabled"```が```True```だと思うので、これを```False```にしないとだめかもしれません。

```json:settings.json
...
"python.jediEnabled": false,
...
```

### 絶対パスでもいける？

Pythonを```C:\Python```とかユーザー名に依存しない場所に、どの環境でもインストールしておけば相対パスで書かなくてもいけそうです。
```C:\Python```にインストールした私の環境であれば、以下の形の記述でいけました。

```json:settings.json
...
"python.autoComplete.extraPaths":[
    "C:\\Python\\Python38\\Lib\\site-packages"
],
...
```
コンフリクトを起こしGitHubで自動でマージできない時のコマンドラインの操作

GitHubで丁寧に手順とコマンドを教えてもらった。
もらったプルリクエストをマージしようとしたけど、自分がそれに気づかずプッシュしててコンフリクトを起こしたらしい。
データベースの違いだったのですぐ直せたけど、この表示は初めてだったのでメモ代わりに残す。

#GitHubでの表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638366/ea73ad0e-3e44-3507-a257-708b094e7cff.png)


Checkout via command line
If you cannot merge a pull request automatically here, you have the option of checking it out via command line to resolve conflicts and perform a manual merge.

Step 1: From your project repository, check out a new branch and test the changes.
`git checkout -b xxx(新しいブランチ) master`
`git pull https://github.com/xxx(プルリク元のURL、HTTPとか) master`

Step 2: Merge the changes and update on GitHub.
`git checkout master`
`git merge --no-ff xxx(新しく作ったブランチ名)`
`git push origin master`

#日本語訳
グーグル翻訳最高！

コマンドラインによるチェックアウト
ここでプルリクエストを自動的にマージできない場合は、コマンドラインからチェックアウトして競合を解決し、手動でマージするオプションがあります。

ステップ1：プロジェクトリポジトリから新しいブランチをチェックアウトし、変更をテストします。
`git checkout -b xxx(新しいブランチ) master`
`git pull https://github.com/yyy(プルリク元のURL、HTTPとか) master`

ステップ2：変更をマージし、GitHubで更新します。
`git checkout master`
`git merge --no-ff xxx(新しく作ったブランチ名)`
`git push origin master`

#具体的に何したか
ターミナルでローカルリポジトリに移動
`git checkout -b xxx(新しいブランチ) master`
`git pull https://github.com/yyy(プルリク元のURL、HTTPとか) master`
うまくいかないので修正する。
VScode、DB Browserで。
修正したらもう一度プル。`git status`とかで確認して、
`git checkout master`
`git merge --no-ff xxx(新しく作ったブランチ名)`
変更をaddしてなかったので上手くいかなかったっぽいのでaddしてもう一度した。
あとはstatus見て、
`git push origin master`

完成！
developブランチとかある場合はそれもマージしておく。
ここで新しく作ったブランチはもう削除してもいい
ファイルの変更を監視してコマンドを実行するCLIツール「monitor」を作成した話

# 概要
AtCoderや機械学習の前処理を行うようなスクリプトを組む場合，変数の状態をprintデバッグすることが多く，変更を加えて再実行して結果を確認する一連の作業がめんどくさいと感じていました．
そこで，ファイルの変更があった場合に事前に引数で渡したコマンドを実行してくれるコマンドラインツール`monitor`を作りました．
この手のCLIツールは探せばより優秀なものがすでにあるとは思いますが，とりあえず作ってみたことで愛着が沸きますし勉強になりました．![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271810/026bf835-8a15-07b6-32cc-0c6e756e7ccd.gif)



# 実装
https://github.com/maitaken/monitor
実装言語は使ってみたかったという理由でGo言語を選択しました．

# インストール方法
GOの設定(GOPATHなど)がされているのであれば，以下のコマンドでインストールできます．GOのcontextを使用しているのでGoは1.7以上のバージョンが必要です．

```shell
git clone https://github.com/maitaken/monitor.git
cd monitor
make install
```

# 使い方
基本的な使い方は以下の2つです．

ファイルの監視対象が1つの場合，第一引数に監視するファイル名，第二引数に実行するシェルを指定します．

```
monitor [監視するファイル名] ["実行するシェル"]
ex)
monitor main.py "python main.py"
```

ファイルの監視対象が2つ以上の場合，-fオプションを使用します．このファイル名の指定にはワイルドカードが使用できます．

```
monitor -f [監視するファイル名] -f [監視するファイル名] ["実行するシェル"]
ex)
monitor -f main.py -f in "python main.py < in"
monitor -f "*.py" "python main.py"
```

# TODO
いまのところでも結構使いやすいのですが，今後は以下の機能を付けていきたいと思っています．

### 指定したコマンドが終わるまで結果を出力してくれない
実行に時間がかかり，ある間隔で出力される値を確認したい場合，現状ですと全ての実行が終わるまで待たなければいけません．
そのため，途中経過を逐次出力する機能をつけたいと思っています．

ただ，もともとAtCoderで使うことを目的にしていたため，実行時間が長くても3sか4sくらいなので（それ以上長かったらTLEになってしまう）今のところ不便じゃないです．

### ファイルをパッシブな方法で監視するように変更
現在の実装だと500msに一回ファイルの変更日時を確認して，一回前に確認した変更日時と異なっていたらコマンドを再実行するような実装になっています．（アクティブな方法）
アクティブな方法ではCPU使用率などのリソースが無駄に使われているので，OSのシステムコールを用いたファイル監視に変更していく必要があります．
特定の時間内のみアプリを自動起動

# 前置き
会社では業務中は常にSkypeを起動しておく必要があるのですが、直ぐに忘れてしまうので、自動起動するようにしたいのですが、業務時間外には起動して欲しくなく、調べたがタスクスケジューラでは出来ないと書かれていたため、やり方を考えた。

```※ 2020/06/17 Windows起動時はアプリの自動起動を使ってましたが、こちらも定時内のみにするためタスク化しました。```

# 方法概要
タスクの有効/無効はコマンドにより制御可能なため、タスクを有効/無効にするタスクを作って、時間でタスクを有効/無効にします。

# アプリを起動するタスクを作成
※実行したいアプリの起動タスクを作成する。以下はSkype起動の例。

1. タスクスケジューラを起動
2. タスクの作成
3. 全般 タブ   
   名前：Skypeの起動（リモート接続）   
   説明：リモート接続時のSkypeの起動   
4. トリガー タブ   
   トリガー①   
   　　タスクの開始：ユーザーセッションへの接続時   
   　　設定   
   　　　⦿ 特定のユーザー： [アプリを利用しているアカウント]   
   　　　⦿ リモート コンピュータ－からの接続   
   　　詳細設定   
   　　　☑ 停止するまでの時間：10時間   
   トリガー②   
   　　タスクの開始：ログオン時   
   　　設定   
   　　　⦿ 特定のユーザー： [アプリを利用しているアカウント]   
   　　詳細設定   
   　　　☑ 遅延時間を指定する：5分間　※起動直後はPC重いので遅延   
5. 操作 タブ   
   新規(N)...   
   操作：プログラムの開始   
   設定   
   　プログラム/スクリプト："C:\Program Files (x86)\Microsoft Office\Office15\lync.exe"   
6. 条件 タブ   
   ※ デフォルトのまま   
7. 設定 タブ
   ☑ スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する   
   ☑ タスクを停止するまでの時間：12時間   

# アプリを起動するタスクのプロセス優先度の変更
1. 作成したタスク（Skypeの起動（リモート接続））を右クリックし、エクスポートし、任意の場所へ格納
   N:\Documents\official\PC設定\タスクスケジューラ
   Skypeの起動.xml   
2. 作成したタスク（Skypeの起動（リモート接続））を右クリックし、削除
3. Skypeの起動.xmlをテキストエディタで開き、以下のように変更   
   `<Priority>7</Priority>`　⇒　`<Priority>6</Priority>`
4. タスクスケジューラを右クリックし、タスクのインポートでSkypeの起動.xmlを選択

# 起動タスクを有効化するタスク
2. タスクの作成
3. 全般 タブ   
   名前：Skypeの起動 有効化   
   説明：タスク：Skypeの起動（リモート接続） の定時の有効化   
   セキュリティ オプション   
   　タスクの実行時に使うユーザー アカウント　※Admin権限要   
   　☑ 最上位の特権で実行する   
4. トリガー タブ   
   新規(N)...   
   タスクの開始：スケジュールに従う   
   設定   
   　⦿ 毎週   
   　開始： yyy/mm/dd　8:00:00   
   　間隔：1   
   　☐ 日曜日　☑ 月曜日　☑ 火曜日　☑ 水曜日　☑ 木曜日　☑ 金曜日　☐ 土曜日   
5. 操作 タブ   
   新規(N)...   
   操作：プログラムの開始   
   設定   
   　プログラム/スクリプト：SCHTASKS   
   　引数の追加：/Change /TN "\Skypeの起動（リモート接続）" /ENABLE   
6. 条件 タブ   
   ※ デフォルトのまま   
7. 設定 タブ   
   ※ デフォルトのまま   

# 起動タスクを無効化するタスク
2. タスクの作成
3. 全般 タブ   
   名前：Skypeの起動 無効化   
   説明：タスク：Skypeの起動（リモート接続） の定時の無効化   
   セキュリティ オプション   
   　タスクの実行時に使うユーザー アカウント　※Admin権限要   
   　☑ 最上位の特権で実行する   
4. トリガー タブ   
   新規(N)...   
   タスクの開始：スケジュールに従う   
   設定   
   　⦿ 毎週   
   　開始： yyy/mm/dd　18:00:00   
   　間隔：1   
   　☐ 日曜日　☑ 月曜日　☑ 火曜日　☑ 水曜日　☑ 木曜日　☑ 金曜日　☐ 土曜日   
5. 操作 タブ   
   新規(N)...   
   操作：プログラムの開始   
   設定   
   　プログラム/スクリプト：SCHTASKS   
   　引数の追加：/Change /TN "\Skypeの起動（リモート接続）" /DISABLE   
6. 条件 タブ   
   ※ デフォルトのまま   
7. 設定 タブ   
   ※ デフォルトのまま   

# 参考
1. [Tech TIPS：タスク・スケジューラをコマンド・プロンプトから制御する](https://www.atmarkit.co.jp/ait/articles/0506/25/news016.html)
2. [タスクスケジューラから起動されるプロセスの優先度を変更する](https://www.google.com/url?q=https%3A%2F%2Flikemid.wordpress.com%2F2011%2F03%2F21%2F%25E3%2582%25BF%25E3%2582%25B9%25E3%2582%25AF%25E3%2582%25B9%25E3%2582%25B1%25E3%2582%25B8%25E3%2583%25A5%25E3%2583%25BC%25E3%2583%25A9%25E3%2581%258B%25E3%2582%2589%25E8%25B5%25B7%25E5%258B%2595%25E3%2581%2595%25E3%2582%258C%25E3%2582%258B%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25BB%25E3%2582%25B9%25E3%2581%25AE%25E5%2584%25AA%2F&sa=D&sntz=1&usg=AFQjCNGUnZcP0NOzb_YC0uqogMgw7peagA)
C#　勉強　JSONシリアル化


```c#:Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

namespace List1231{
    class Program{
        static void Main(string[] args){

            var novels = new Novel[] {
              new Novel {
                Author = "吉川英治",
                Title = "宮本武蔵",
                Published = 1939,
              },
              new Novel {
                Author = "吉川英治",
                Title = "三国志",
                Published = 1940,
              },
            };
            using (var stream = new FileStream("novels.json", FileMode.Create,
                                                FileAccess.Write)) {
                var serializer = new DataContractJsonSerializer(novels.GetType());
                serializer.WriteObject(stream, novels);
            }

            var lines = File.ReadLines("novels.json");
            foreach (var line in lines)
                Console.WriteLine(line);

        }
    }
}
```

クラス

```c#:Novel.cs

using System.Runtime.Serialization;

namespace List1231{
    [DataContract(Name="novel")]
    public class Novel{
        [DataMember(Name="title")]
        public string Title {get;set;}
        
        [DataMember(Name="author")]
        public string Author {get;set;}

        [DataMember(Name="published")]
        public int Published {get;set;}

        public override string ToString(){
            return string.Format("Title={0},Author={1},Published=[2]",
                Title,Author,Published);
        }
    }
}
```
Dockerを使用したRails開発 Railsコンテナへのログイン (仮想環境の準備 Mac用)

##初めに
制作するにあたって
「Doclerコンテナ」と「操作コンテナ」の2種類に分けてコンテナへログインして行きたいと思います。

#マシンスペック
・macOS Catalina
・バージョン 10.15.3
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

#操作コンテナへログイン

以下のコマンドを起動します。
起動時には操作するフォルダーの中で起動させないとエラーになるので、ルーディングを気をるけてください。

```docker-compose exec web bash```

エラーなく進みましたら、ここでRailsのバージョンを確認してください。

```rails --version```

##コンテナからのログアウト
ログアウトは以下のコマンドを実行します。

``` exit ```

以上が、コンテナへのログインでした。
閲覧いただき、ありがとうございます。
docker-compose + makeで作る最強のTerraformローカル実行環境

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">Terraformローカル実行環境の個人的ベストプラクティスが出来上がった・・・ぜ！！</p>&mdash; とっしー@インフラエンジニア (@Tocyuki) <a href="https://twitter.com/Tocyuki/status/1265300872994549761?ref_src=twsrc%5Etfw">May 26, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

というわけで、Terraformのローカル実行環境の個人的なベストプラクティスなものが出来上がったのでご紹介したいと思います！！

# 今回やること
- Terraformで作成するリソースはVPCのみ
- `docker-compose` + `make` によるTerraformローカル実行環境の構築

# ディレクトリ構成
ディレクトリ構成はこんな感じでして、要約するとHashicorpの公式Terraform Dockerイメージを使って、Terraformの実行環境を用意して`make`コマンドでラップするという感じです！

```
.
├── LICENSE
├── Makefile
├── README.md
├── docker-compose.yml
└── terraform
    ├── main.tf
    └── modules
        └── aws
            └── network
                ├── variables.tf
                └── vpc.tf
```

# 各ファイルについて
### vpc.tf
`10.0.0.0/16`のVPCを作っているだけ！

```:vpc.tf
resource "aws_vpc" "vpc" {
  cidr_block           = var.vpc_cidr
  enable_dns_support   = true
  enable_dns_hostnames = true
}
```

### docker-compose.yml
[Hashicorp公式Dockerイメージ](https://hub.docker.com/r/hashicorp/terraform/)を使った`docker-compose.yml`！

```yaml:docker-compose.yml
version: '3.6'

services:
  terraform:
    image: hashicorp/terraform:0.12.24
    container_name: terraform
    volumes:
      - ./terraform:/terraform
    env_file: .env
    working_dir: /terraform
```

ちなみに`.env`にはAWSのクレデンシャルを記載するだけです！

```:.env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
```

### Makefile

```make:Makefile
.PHONY: init plan apply destroy check

init: check
	@docker-compose run --rm terraform init

plan: check
	@docker-compose run --rm terraform plan

apply: check
	@docker-compose run --rm terraform apply

destroy: check
	@docker-compose run --rm terraform destroy

check:
	@docker-compose run --rm terraform fmt -recursive
	@docker-compose run --rm terraform fmt -check
	@docker-compose run --rm terraform validate
```

`Makefile`のおかげで以下のように`make`コマンドで簡単にTerraformを実行できます！

```zsh
➜  terraform-best-executable-env (master) ✗ make check   
docker-compose run --rm terraform fmt -recursive
docker-compose run --rm terraform fmt -check
docker-compose run --rm terraform validate
Success! The configuration is valid.
```

# というわけで
こんな感じで最近はAnsibleやPackerなども同様の手法でローカル実行環境を作成してます！
個人的にはかなりすっきりした感じでコマンド実行できて良い感じだなぁと思ってますので是非試して見てください＾＾

コードは[Github](https://github.com/Tocyuki/terraform-best-executable-env)にあげてあって、ついでにGitHub ActionsでTerraformのCI環境を軽く作ってみたところめちゃ簡単にできたので気になる方は見てみてください〜！
【CentOS8】CentOS8でrails sをするとlibffi.so.7: cannot open shared object file: No such file or directory

# ◆エラー

```
libffi.so.7: cannot open shared object file: No such file or directory
```

# ◆解決策

```
sudo ln /lib64/libffi.so.6 /lib64/libffi.so.7 
sudo ld config
```

# ◆効果がなかったこと

## ●ffiのインストールし直し

```
gem reinstall ffi
```

## ●libffiとlibffi-develが入っているか確認（入ってた）

```
sudo dnf install libffi libffi-devel
```
Immutableとは？Mutableとの違い


#Immutableとは
プログラミングにおいてImmutable（イミュータブル）とは「不変」という意味で、オブジェクトの状態が変わらないことを指します。

逆に、元のデータが変更可能なオブジェクトの性質をMutable（ミュータブル）と言います。


#ImmutableとMutableの違い
Immutable（イミュータブル）とMutable（ミュータブル）の違いについて、実際にみていきましょう。

まずは、日付操作ライブラリ「Carbon」を使って現在日時を取得してみます。

```sample.php
$now = \Carbon\Carbon::now();//2020-05-26 06:57:02.027091
```
現在日時が取得できました。
次に、addDayメソッドで上記で取得した現在日時に1日加算してみます。

```sample.php
$tomorrow = $now->addDay();//2020-05-27 06:59:01.25073
```
1日加算されています。

ここで$nowの中身を再びみてみます。

```sample.php
var_dump($now);//2020-05-27 06:59:01.25073
```

なんと、\$nowまで1日加算され、\$nowと\$tomorrowが同じ結果となってしまいました。
これは、\$nowと\$tomorrowが同じオブジェクトであるために起こります。
元の状態の変化を防ぐにはcopyメソッドを使います。

#copyメソッドで元の状態を保持
copyメソッドで元のオブジェクトを複製して、2つの変数の結果を見てみましょう。

```sample.php
$tomorrow = $now->copy->addDay();
var_dump($now);//2020-05-26 06:57:02.027091
var_dump($tomorrow);//2020-05-27 06:59:01.25073
```
元のオブジェクトはそのままで、$tomorrowだけ1日加算されました。

Carbonのバージョン2系では、このImmutable（イミュータブル）版が利用できるようになっています。
流行りの通信プロトコルSRTのライブラリをWindowsに導入する

#はじめに
最近流行り？の通信プロトコルである[SRT](https://github.com/Haivision/srt)のWindows向けビルドを簡単に入手する方法です。
SRTのREADMEで推奨されているやり方は、windowsに限り複雑で、弊環境ではエラーを吐いてしまいました。
そんな時に、issueをさまよっていたら見つけたのが以下のやり方です。issueは[こちら](https://github.com/Haivision/srt/issues/823)
ちなみにSRTとは何ぞやという方は、
https://www.explorer-inc.co.jp/srt/media1902.html
ここを見てみると概要がつかめると思います。
ffmpeg,gstreamer,VLCは既に対応しているので試しに使ってみてはいかがでしょうか。

#vcpkgのインストール
MicroSoft公式のパッケージマネージャであるvcpkgを利用します。vcpkgは[こちら](https://github.com/Microsoft/vcpkg)から入手できます。
vcpkgは、aptのように簡単にライブラリをインストールできる上に、VisualStudioで利用する際に、追加でインクルードディレクトリを設定しなくても自動で認識してくれるという優れものです。

##vcpkgでlibsrtのインストール
コマンドプロンプトを起動して、以下のコマンドを実行すればsrtライブラリのインストールが完了します。

```
vcpkg install libsrt
```
めっちゃ簡単！！！！！！！！

#終わりに
実際に使う際は、VisualStudioでプロジェクトいつものように作成するだけで大丈夫です。ディレクトリの参照は既にやってくれているので、すぐにプログラミングに移ることができます！最高！ 
![コメント 2020-05-27 003752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411974/018e498e-9d39-6d25-c674-3a5b8c8eabc8.png)
RX65N版GR-SAKURAの端子設定

現在の状況
---

GR-CITRUSと同等に、GR-SAKURAにもRX65N-2MBを実装してArduino環境を構築中です。

![2020-05-27 00-08-56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/017f36f5-b0cd-6516-5100-bd2f4ced53b4.jpeg)

素のGR-ROSE,GR-CITRUS(RX65N),GR-SAKURA(RX65N)のピン番号の定義などをdefine文で切り替えられるようにしようとしていたのですが、AVRベースのArduinoの仕様とルネサスの開発環境の独自性から詰まるポイントが多数ありました。
いくつかはこちらの調査不足と思いますが、忘れないよう記録しておきます。

強制アーカイブ関連
---
IDEforGRではGR-ROSE仕様から元のファイルを変えようとしても、ほとんどのファイルがgr_common.aというアーカイブで固められていてIDE下のファイルを書き換えても何も起こりません。
IDEでも端子配置を変えたければWebコンパイラで生成したgr_common.aをダウンロードしてくればよいのですが、Webコンパイラに再コンパイルしてもらうためにはまじないが必要です。

* アーカイブ対象のファイルを再コンパイルしたいときは毎回gr_common.aを消す
* 同様にスケッチも消す

ここはCITRUSでも実施した内容なので難しくはないのですが、SAKURA向けの設定を追加してdefineで切り替えようとしてもCITRUSの設定のまま変わらないという事態になりました。

PRGMEM関連
---

ピン番号と端子の結び付けはpins_arduino.h下のdigital_pin_to_port_PGMなどの配列に記載し、この配列はAVR独自のプログラムでFlashに書かれ、実行時にFlashが参照されます。
コンパイルでgr_common.aを再生成しても前の設定が残っているらしく、何時間試行しても上書きされませんでした。
独自のピン配置にするのは難しいのかな、と思いつつPROGMEMから外すなどしているのですがWebコンパイラで変更が反映されてもIDEでは駄目だったりで原因がはっきりしません。
ARDUINO_MAINというdefineが変に絡んでいてややこしいです。

```pins_arduino.h
(抜粋)
//const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
const uint8_t digital_pin_to_port[] = {
```
```Arduino.h
(抜粋)
//#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
#define digitalPinToPort(P) ( digital_pin_to_port[P] )
```

しばらく試行が続きそうです。
(続く)
Dockerを使用したRails開発 Railsのコンテナ群構築 (仮想環境の準備 Mac用)

##初めに
DockerとDocker Compose を用いてRailsの開発用コンテナ群を制作します。

#マシンスペック
・macOS Catalina
・バージョン 10.15.4
・iMac(retina 4K, 21.5-inch,2019)
・プロセッサ 3 GHz 6コアIntel Core i5
・メモリ 8GB

##①Gitのインストール
<img width="1138" alt="Docker_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/f7f3e810-6a56-92b0-908d-76ab82e73b89.png">
https://git-scm.com/download/mac
こちらのページに、ダウンロードファイルがあります。

##②Rails開発用コンテナ群の構築

```git clone https://github.com/oiax/rails6-compose.git```

<img width="550" alt="Docker_7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/82ecf978-a5a0-6c01-5f75-d19b522c2d53.png">


```cd rails6-compose```
```./setup.sh```

##③コンテナ群のスタートとストップ

・コンテナ群のスタート
```docker-compose up -d```
<img width="337" alt="Docker_8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/86746165-06a6-d612-3481-6d89185ff2bd.png">

・コンテナ群のストップ
```docker-compose stop```
<img width="337" alt="Docker_8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/94f444ff-adc8-bc47-99ed-9b8b5eee1cd5.png">


以上がRailsのコンテナ群の構築でした。
ここまでは、エラーなしで構築できましたが、これからが心配です。

閲覧いただき、ありがとうございました。