OmniAICreator/Qiita-1.07M huggingface dataset:
windows10にpythonとVisualStudioCodeをインストールする(2020年4月版)

# 概要
Windows10にPython3とVisualStudioCodeをインストールしたので備忘録

## 動画
動画版もこちらにおいておきます。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/QRnmsGYL0dM/0.jpg)](http://www.youtube.com/watch?v=QRnmsGYL0dM)

#手順
## 1.Python3 インストール
### 1-1. ダウンロード
下記のURLからダウンロードしてください。
https://www.python.org/
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/011e6286-caa6-6182-f039-634271cadf63.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/6c4759d4-dcb6-3bbf-230c-846e5e127aa9.png">

### 1-2. 実行
ダウンロードしたファイルを実行してください。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/985290cb-1e68-a3e2-32a0-088af3871102.png">
「Add Python3.8 PATH」はチェックを入れてください。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/6b657feb-7448-f439-9cf7-49c81d97ebf6.png">

これでPythonのインストールは完了です。

## 2.VisualStudioCode インストール
### 2-1. ダウンロード
下記のURLからダウンロードしてください。

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

![image.png]()
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/20143b3b-b559-cf72-58a4-59cc91355f83.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/bf089f25-e2ae-0f2f-b94a-985f310f4dd7.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/706c4ddb-7405-fd3e-1613-edf77e7ccd88.png">


### 2-2. 実行
ダウンロードしたファイルを実行してください。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/dac2d56c-bd7b-11a0-9c35-ec49731a837f.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/d257ae1e-b7f7-a564-98e8-6b9c8d7e8c17.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/92fa7726-8dac-dc53-2f35-b5c07f555bdc.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/d7cd3993-b3aa-1443-6568-db20a3d7b5be.png">

チェック項目に関しては自由に選択してください。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/8c83080c-3707-cd19-f0e4-b9ed204f2b18.png">

これでインストールは完了です。

### 2-3.デバッグ設定
VisualStudioCodeを起動してください。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/f05f815f-6ecf-359f-dc8d-cac7cc5fc214.png">



四角が重なったようなアイコンから拡張機能をインストール出来ます。
その中からPythonを選択し、インストールしてください。

インストールが終わるとデバッグが可能になります。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/cd241120-bd41-2416-eb23-798acee9e387.png">

実行したいpythonファイルを開いた状態で、虫のようなマークを選択、その後`Run and Debug`をクリックすると、下記のような画面になります。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/e4c0711b-46d5-6809-3135-d1085f46190c.png">

`Python File`を選択するとデバッグすることが出来ます。
matplotlib 色一覧の作成

# はじめに
最近は趣味でも仕事でも、計算はほとんどPythonで行っており、グラフ化もPython matplotlibで行っている。グラフには識別性を上げるため、色を使うことになるが、matplotlibの色一覧を手元においておきたいと思い、色一覧の画像を作成した。


# 作例

![fig_col_mpl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/745fe9dc-fed2-952f-9f75-aabd9cf00355.png)


# 作り方
以下を参考にmatplotlibで扱える色一覧を取得する。辞書形式で色名および16進の値が取得できる。

[matplotlib で指定可能な色の名前と一覧](https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)

あとは```fill```を使って指定した矩形領域を塗りつぶしていくだけである。

しかし、グラフ作成時にこれを参照して色指定を行うためには、色名と16進の値をテキスト表示しておきたい。
そこで悩むのが、色名と16進のテキストの表示色である。一つ一つ指定してもいいのだが、なんとか自動で表示色を指定できないかということで、HSV値を使うことに。

私の場合、表示色指定には16進を用いているが、テキスト表示色を決めるため、16進の短冊色を一度RGBに変換し、さらにそれをHSVに変換し、その値に基づきテキスト表示色を決めるようにした。

テキスト表示色を決める関数（def penc()）は以下の通り。[colorsys.rgb_to_hsv](https://docs.python.org/ja/3/library/colorsys.html
)という便利なものがあるので、RGBからHSVへの変換にはこれを使っている。

```python
def penc(hval):
    r=int(hval[1:3],16)
    g=int(hval[3:5],16)
    b=int(hval[6:8],16)
    hsv=colorsys.rgb_to_hsv(r/255, g/255, b/255)
    h=hsv[0]
    s=hsv[1]
    v=hsv[2]
    col='#000000'
    if 0.5<h: col='#ffffff'
    if v<0.75: col='#ffffff'
    return col
```

上の事例では、テキスト表示色をまず黒（#000000）に指定するが、HSVのHが0.5を超えた場合、およびVの値が0.75未満の場合は、テキスト表示色を白（#ffffff）にするようにしている。
反対色を使うなどの方法も考えたが、テキスト表示色を色とりどりにするのも抵抗があったため、表示色は黒と白のみで割り切るようにしたものである。


# プログラム全文

```python
import matplotlib
import colorsys
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'Ricty Diminished'


def penc(hval):
    #https://docs.python.org/ja/3/library/colorsys.html
    r=int(hval[1:3],16)
    g=int(hval[3:5],16)
    b=int(hval[6:8],16)
    hsv=colorsys.rgb_to_hsv(r/255, g/255, b/255)
    h=hsv[0]
    s=hsv[1]
    v=hsv[2]
    col='#000000'
    if 0.5<h: col='#ffffff'
    if v<0.75: col='#ffffff'
    return col
    

cdic=matplotlib.colors.cnames
lkey=[]
lval=[]
for key, val in zip(cdic.keys(), cdic.values()):
    lkey=lkey+[key]
    lval=lval+[val]
    
xmin=0
xmax=4
k=-1
fnameF='fig_col_mpl.png'
ymin=0
ymax=37
plt.figure(figsize=(6,12))
plt.xlim([xmin,xmax])
plt.ylim([ymax,ymin])
plt.axis('off')
fsize=8 # fontsize
k=-1
for i in range(int(ymin),int(ymax)):
    for j in range(0,4):
        k=k+1
        if k<len(lval):
            xs=float(j)
            xe=xs+1.0
            ys=float(i)
            ye=ys+1.0
            xx=[xs,xe,xe,xs]
            yy=[ys,ys,ye,ye]
            plt.fill(xx,yy,color=lval[k])
            text1=lkey[k]
            text2=lval[k]
            xg=0.5*(xs+xe)
            yg=0.5*(ys+ye)
            col=penc(lval[k])
            plt.text(xg,yg-0.25,text1,rotation=0,ha='center',va='center',fontsize=fsize,color=col)
            plt.text(xg,yg+0.25,text2,rotation=0,ha='center',va='center',fontsize=fsize,color=col)
plt.savefig(fnameF, dpi=300, bbox_inches="tight", pad_inches=0)
```

以　上
webpack で host に 0.0.0.0 を指定しつつブラウザでは localhost で起動する

# webpack で host に 0.0.0.0 を指定しつつブラウザでは localhost で起動する

webpack で devServer を実行する際に端末の IP アドレスでアクセスする場合
[devServer.host](https://webpack.js.org/configuration/dev-server/#devserverhost) に `0.0.0.0` を指定しますが、

> Specify a host to use. If you want your server to be accessible externally, specify it like this:

```bash:devServer.host
webpack-dev-server --host 0.0.0.0
```

これだと `http://0.0.0.0/` で起動してしまいます。
`http://localhost/` に直せば正しくアクセスできますが手間が発生してしまいます。

## `devServer.public` にて起動する URL を指定

webpack の設定を眺めてみると・・・
[devServer.public](https://webpack.js.org/configuration/dev-server/#devserverpublic) というのがあり、


```bash:devServer.host+public
webpack-dev-server --host 0.0.0.0 --public localhost
```

`public` に `localhost` を指定したところ

- 起動時には `localhost` で立ち上がりつつ、
- 端末の IP アドレスでのアクセスが可能になりました。

でも Mac の人にためしてもらったところなぜか `http://0.0.0.0/` でひらかれてました・・・
attr_accessorについて

#attr_accessorとは？
attr_accessorについて理解が不十分であったので紐解きます。
attr_accessorはデータを代入するメソッド（setter）とデータを取り出せるメソッド（getter）を同時に定義できるメソッドである。これは省略形であり、いきなり覚えようとするとかえって混乱するので一個一個分解していく。

###attr_accessor・setter/getterを使わずに定義する場合

```

class okashi
  def name = (name)　    #どんな処理を行っているのか
  @name = name　　 　→ 　　・いわゆるsetterの部分
  end　　　　　　　　　　　　　お菓子クラスに名前という情報をセット
　　　　　　　　　　　　　　　　しますという処理。＠を使用しているた
　　　　　　　　　　　　　　　　め、メソッドの中だけでなく外でも使用できる。
 
 def name           →    #どんな処理を行っているのか
  @user　　　　　　　　　　　・いわゆるgetterの部分
 end　　　　　　　　　　　　　　お菓子クラスにセットされている
end　　 　　　　　　　　　　　　@nameという情報を取り出す（ゲット） 
                           しますの処理
oks = Okashi.new

#setterにnameの値をいれる
oks.name = "クッキー"

#getterを取り出す
puts oks.name

```
console上ではクッキーと表示される。これだと中の処理を一個一個細かく書いていかなければならない。これをsetter/getterを使って省略する。

###setter/getterを使用して定義する場合

```
class okashi
  attr_writer :name   → 　　setterの部分。この処理だけでクラスに
　　　　　　　　　　　　　　　　　＠nameの値をwrite(書き込む)こと
　　　　　　　　　　　　　　　　　ができるようにする処理。
　
 　attr_reader :name　　→　　　getterの部分。@nameという情報を取り出す
　　　　　　　　　　　　　　　　　処理
　end
oks = Okashi.new

#setterにnameの値をいれる
oks.name = "クッキー"

#getterを取り出す
puts oks.name
```
上記の処理を省略することでかなりわかりやすくなる。
このsetter getterの処理をさらに省略したものがattr_accessorである。

```
class okashi
  attr_accessor :name 
end

oks = Okashi.new

oks.name = "クッキー"

puts oks.name  
```
ここまで省略することができる。
特定の数字やアルファベットを有する配列の生成 range()関数

指定した範囲の要素を持つ配列の生成にはrange()関数を使用します。

```php:dice.php
$dice = range(1, 6);

var_dump($dice);
```

↓実行結果

```php:dice.php
array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) }
```

このように引数に指定した範囲の値を持つ配列の生成が出来ます。
数字以外にも、

```php:abc.php
$alphabet = range('a', 'z');

var_dump($alphabet);
```

↓実行結果

```php:abc.php
array(26) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" [4]=> string(1) "e" [5]=> string(1) "f" [6]=> string(1) "g" [7]=> string(1) "h" [8]=> string(1) "i" [9]=> string(1) "j" [10]=> string(1) "k" [11]=> string(1) "l" [12]=> string(1) "m" [13]=> string(1) "n" [14]=> string(1) "o" [15]=> string(1) "p" [16]=> string(1) "q" [17]=> string(1) "r" [18]=> string(1) "s" [19]=> string(1) "t" [20]=> string(1) "u" [21]=> string(1) "v" [22]=> string(1) "w" [23]=> string(1) "x" [24]=> string(1) "y" [25]=> string(1) "z" }
```

と、アルファベットでも可能です。

これは、**アスキーコード（ASCIIコード）**に則って生成されるものであるため、数字やアルファベットの他に記号などには対応しても、平仮名などには対応していません。
Ruby入門メモ(プログラミング経験者用)1

#変数定義
1.型無しで定義できる
2.セミコロンがいらない

```
//C言語やC#言語の場合
//int year = 2020;

//Ruby
 year = 2020

```

#入出力
1.シングルクォーテーションやダブルクォーテーションで囲む。
2.クォーテーションで囲むと文字列として扱われる
3.文字列中で変数をつかうときは「#{ }」で変数をかこむ（ダブルクォーテーションのとき利用可能）。

```
num1 = 10
num2 = 20

puts num1 + num2
puts "num1" + "num2"
puts "#{num1}" + "#{num2}"

buf1 = "春夏" 
buf2 = "秋冬"

puts buf1 + buf2
```

[実行結果]

```
30
num1num2
1020
春夏秋冬
```




###出力
改行なし print
改行あり  puts

```
print "あいう"
puts "あいう"

puts "あいう"
print "あいう"
```
[実行結果]

```
あいうあいう
あいう
あいう
```

###入力
文字列:gets.chomp

```
input = gets.chomp
puts input
```

[実行結果]

```
1
1
```

ここで、gets.chompは文字列として入力されるため、
数値変換するためには「gets.chomp.to_i」をつかう。

```
input = gets.chomp.to_i
puts input
```

```
1
1
```

####複数の要素の入力
スペースで区切られているとき。

```
#入力
あ　い　う　え　お
```
gets.chomp.splitを使う。

```
input = gets.chomp.split
```
スペースで区切られているかつ、要素が数値の時。
map(&:to_i)をつける。

```
#入力
#1 2 3 4 5

input = gets.chomp.split.map(&:to_i)
```




#配列
###宣言
1.大カッコ「[]」でかこむ

```
languages = ["日本", "中国", "アメリカ"]

puts languages
```

[実行結果]

```
日本
中国
アメリカ
```

###配列の要素数
lengthメソッドをつかう

```
languages = ["日本", "中国", "アメリカ"]

puts languages.length
```
[実行結果]

```
3
```

###配列の要素の追加
配列 << 要素

```
languages = ["日本", "中国", "アメリカ"]

languages << "イギリス"
puts languages
```
[実行結果]

```
日本
中国
アメリカ
イギリス
```
###配列の要素の削除
配列.delete(要素)

```
languages = ["日本", "中国", "アメリカ"]

languages.delete("アメリカ")
puts languages
```
[実行結果]

```
日本
中国
```

###配列の繰り返し処理

---
配列.ecach do |変数|
   #処理
 end


```
colors = ["red", "green", "yellow"]

colors.each do |x|
  puts x
end
```
[実行結果]

```
red
green
yellow
```

#for文


for 変数　in オブジェクト(数値範囲や配列)
  ＃処理
end

---
数値範囲は「..」か「...」の記号を使用する
「..」は以下   例）1..5は１から５まで
「...」は未満  例）1...5は1から４まで


```
for num in 1..5
  puts num
end
```
[実行結果]

```
1
2
3
4
5
```
#メソッドの定義
def メソッド名(引数)
 #処理
end


```
def check(number)
  #処理
end
```




#if文
①if,elsif,elseを使用する(elseifではない)。
②endを忘れない


```
if num > 10
  puts "10より大きい"
elsif num == 10
  puts "10"
else
  puts "10より小さい"
end
```

```
def check(num)
  
if num > 10
  puts "10より大きい"
elsif num == 10
  puts "10"
else
  puts "10より小さい"
end
  
end

check(5)
check(10)
check(20)
```

[実行結果]

```
10より小さい
10
10より大きい
```


#まとめ
FizzBuzzのコードを書いてみる

```
input_num = gets.chomp.to_i

range = 1..input_num

for x in range
  if x % 3 == 0 && x % 5 == 0
    puts("#{x}: " + "FizzBuzz")
    elsif x % 3 == 0
    puts("#{x}: " + "Fizz")
    elsif x % 5 == 0
    puts("#{x}: " + "Buzz")
  else
    
  end
end
```

[実行結果]

```
15
3: Fizz
5: Buzz
6: Fizz
9: Fizz
10: Buzz
12: Fizz
15: FizzBuzz

```


#最後に
paizaなどを通して簡単なアウトプットを繰り返しましょう






#参考文献

 Progate: https://prog-8.com/slides?lesson=72%2C75%2C78%2C81%2C85
Bash でスペース区切りの文字列をsplitして配列に変換する

## そのままんまでした ~~bash の変数展開が便利だった~~

```bash
names_str="Mike Jon Jacky Emma"
names_array=($names_str)
# コメントいただき修正しました！当初以下のように変数展開していましたが、不要でした!
# names_array=(${names_str// / })
```
C70K2 レストア日誌 その7 〜 キャブレターのO/H

# アイドリングが安定しないので、キャブレターをO/H
_実はレストアは随分前に終わっています。_

## タイからお届け！というサイトで購入したO/Hキットを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/e714fb05-0a35-4eac-2a4a-7b7274025f07.png)
`O/Hに必要なパーツはほぼ全て入っていましたが、ガソリンコックのフューエルパッキン(通称れんこんパッキン）は別売りでした。`

## 分解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/fcef348e-e35d-a636-88f5-ac2cc719675e.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/8d2aaae5-4cc5-4877-339a-d2a5d262cff9.png)

なかなか汚いので、キャブクリーナーで清掃していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/e243d334-2e34-68b4-8594-c47a73fc9b1c.png)

フロートチャンバーの中に汚れがかなり溜まっていましたので綿棒でほじります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/7e00abb4-f169-81e7-25ff-debb5bac54b2.png)

オーバーフローの原因になりそうな、ニードルジェットとジェットニードルもO/Hキッドに入っているので交換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/43c6484a-f190-d64f-e4c3-e0a56a501a84.png)

新品（左）と比べると尖っている部分が丸くなっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/ad16ecad-bfd8-e957-f17f-05fc31b1181f.png)

**ジェット類の小さな穴も針などを使って貫通させます。（不安定なアイドリングは恐らくこれが原因でした）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/fef1e2ae-ec68-cf11-bbf2-05292cf14acc.png)

別売りのれんこんパッキンも交換しておきます。
上部のここに入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/f87a2c39-3d58-934b-4451-607561859b7e.png)

左が古い純正のものですが、ほとんど差はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/4dfded61-d34a-5544-cedc-da952b29f08c.png)

### 完成
アイドルアジャストスクリューも交換したので、スプリングが綺麗です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/2b319e18-70a8-8ac5-7465-3bcf04ddc161.png)
CloudFormation テンプレートで CloudFront の Header を全て Foward する設定

[ドキュメント](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html#cfn-cloudfront-distribution-forwardedvalues-headers)を見ても具体的にどういう値を設定するべきか書いていない。

>A complex type that specifies the Headers, if any, that you want CloudFront to forward to the origin for this cache behavior (whitelisted headers). For the headers that you specify, CloudFront also caches separate versions of a specified object that is based on the header values in viewer requests.

`All` で良いのか？ `*` か？

と悩んだが `'*'` で良かった

```yaml:example
          ForwardedValues:
            Headers:
            - '*'
```

とりあえず「All の場合設定方法を書いてくれ」とフィードバックは送った。
C70K2 レストア日誌 その6 〜 ハブダンパーの交換

# 購入したものを取り付けていく その２
* _実はレストアは随分前に終わっています。_

## ハブダンパーの取り付け
- カスタムジャパンで購入した[サードパーティ製](https://www.customjapan.net/shop/goods/goods.aspx?goods=013010558)
- 商品画像を見て分かる通り、本来穴が空いている部分に薄い膜が貼っている。（到着した品物もそうだった）

### リアホイールを外す
リアアクスルシャフトが左側のみ六角ボルトが19と23のダブルナットで入っており、
この年式ではβピンで回転防止されています。
<img alt="20181125_162410.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/317676a5-a1b6-c6c0-1ffd-6732d854f266.jpeg" width="400"><img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/09d9f466-302c-bab8-ca6b-6ab6cce9ecd9.png" width=400>

スーパーカブはリアホイールが単体で外れる構造 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/275fde0f-818e-56fe-2436-26f825ecd49d.png)

車体側はこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/7f5fc2e8-9e03-e04f-9bc6-6a2f23a59a1f.png)

### ハブダンパー交換
前述の構造のため、回転動力をスプロケットから受け取る部分にゴムのダンパーが入っています。
これは劣化しやすい上に、乗り心地に直結するため交換します。

摘出したハブダンパー  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/39e42d0d-792e-486d-8fa2-4f378eb6e89d.png)

取り寄せた商品は膜がついていますので、丁寧に除去してこの部分にはめ込みます。（そのままだときれいに入りません）   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/2f345c4d-f2aa-ec12-e3fd-c9964906f226.png)

### リアブレーキチェック
ハブダンパーと反対側は、リアのドラムブレーキがついていますので、ついでにチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/04a01c5a-2cce-9b5b-6237-ebb632df4f7b.png)

錆びてはいますが、ライニングはまだ残っていそうなのでそのままに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230921/36ee12d8-1e54-7508-4ac5-c741ce7721c9.png)
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装のchapter 4のヒント

https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch04/two_layer_net.py

```
loss_W = lambda W: self.loss(x, t)

grads = {}
numerical_gradient(loss_W, self.params['W1'])
```

の部分ですが、`numerical_gradient`の第二引数は参照渡しになっているようです。
多次元配列について

配列の中のキーを配列として格納することが可能。

```php:meet.php
$meet = array(
    '鶏肉'=> array(
        'price' => 68,
        'stock' => 10),
        
    '豚肉' => array(
        'price' => 89,
        'stock' => 15),
        
    '牛肉' => array(
        'price' => 128,
        'stock' => 8)
        );
foreach($meet as $name => $value) {
    echo $name . 'は、１００グラム' . $value['price'] . '円、在庫は' . $value['stock'] . '個です。' . '<br>'; 
}

```
↓実行結果

``` php:meet.php
鶏肉は、１００グラム68円、在庫は10個です。
豚肉は、１００グラム89円、在庫は15個です。
牛肉は、１００グラム128円、在庫は8個です。
```

複雑な構造を持つデータの配列として定義することが出来ます。
JavaScriptのスコープについて

##スコープとは
スコープとは変数を参照できる範囲のことです。今回はJavaScriptのvar,let,constについて解説します。
constは定数(再代入不可)の宣言なので特に難しく考えることはないのですが、letとvarは少し紛らわしいのでここを理解することでコードレビューの指摘が減ると思います。


##今回の記事用に書いたコード
コメントに解説が書いてあるので、これだけでも分かるかもしれませんが一応ひとつずつ解説します。

```javascript
function Test(){
  var hoge = 1

  // hogeは関数スコープなのでTest関数の中で使う場合はエラーにならない
  console.log(hoge)

  if (true){
    let fuga = 2
    // fugaはブロックスコープなので、ブロック内(この場合はif文の中)で使用する場合はエラーにならない
    console.log(fuga)
  }
  // fugaはブロックスコープなので、ブロック内で定義した変数をブロックの外で呼び出そうとするとエラーになる
  // Uncaught ReferenceError: fuga is not defined
  console.log(fuga)
}

Test()

// hogeは関数スコープなので、Test関数内で定義した変数を関数の外で呼び出そうとするとエラーになる
// Uncaught ReferenceError: hoge is not defined
console.log(hoge)

// constで変数を定義すると定数扱いになるため、値の再代入はできない。
// Uncaught TypeError: Assignment to constant variable.
const aaa = 3
aaa = 3
```
##var
関数内で有効となる変数。上記のコードでは変数hogeをvarで宣言している。Test関数の外でhogeを参照使用とするとエラーとなる

##let
ブロック内で有効となる関数。上記のコードでは変数fugaをletで宣言している。変数を宣言したブロックの外でfugaを参照しようとするとエラーとなる。varに比べるとスコープが狭いため、想定外の値が入りにくいというメリットがある。

##const
constで宣言された場合は定数となり、再代入は不可能となる。処理内容ごとに値が変わらないことを想定している場合は定数にしておく。
コマンド1発でMacでFolding@homeのコロナウイルス解析に貢献する方法

# MacでFolding@homeのコロナウイルス解析に貢献する方法

世界的大流行を見せているコロナウイルスですが、コロナウイルスの特効薬開発といった分野で今我々プログラマーに貢献できることはほとんどなく、医療関係者の方々の結果を待つことしかできません。
そこで何かできることは無いのかと調べていると、**Folding@home**でコロナウイルスの解析作業を手伝う事ができるとのことでした。
PCの計算能力を貸すだけで誰でも貢献ができるので、家で寝かせているPCがある方はぜひ試してみてはいかがでしょうか？

https://pc.watch.impress.co.jp/docs/news/1243458.html

## Folding@homeとは？

Folding@homeは、スタンフォード大学を中心としたタンパク質解析の分散コンピューティングプロジェクトです。
1台のPCのスペックは低くても、それを何百何千と合わせることでスパコンをも超える速度での演算が可能となります。
似たようなプロジェクトにSETI@homeという宇宙人を探すプロジェクトがあったのですが、今年の3月末までで休止したみたいですね。

## Macでのインストール

Macを使っているプログラマーならきっと`homebrew`はインストール済みかと思いますが、もしまだの方は以下のコマンドで`homebrew`をインストールしてください。

```sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

`homebrew`がインストール完了したら、以下のコマンドで`Folding@home`がインストールできます。

```sh
brew cask install folding-at-home
```

これで`Folding@home`がアプリケーション・フォルダにインストールされます。
`FAHControl`という名前のアプリケーションが`Folding@home`を起動したり設定したりするアプリケーションです。
あとは`FAHConrol`を起動してマシンパワー（`Folding Power`）を設定して再生ボタンみたいな三角形を押すだけです。
マシンがタンパク質の解析を行ってくれます。

## チームについて

チームというものが作れるそうなので、`Japanese Programmers`という名前で一応チームを作っておきました。
チーム単位でのランキングみたいなものが出るそうです。
なんとなくで作ったチーム名なので、プログラマーの方もそうじゃない方も、みんなで参加してみましょう！

チームの入り方は、`Configure`を押して`Identify`タブを開くと出てくる`Team number`欄に`257614`と入力するだけです。

### 2020/04/12 追記

結構な人数の方がチームに参加してくれています。
ありがとうございます。

![folding@hometeam.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144917/f38ae13c-c9b5-3665-fdac-c5437f45797a.png)


## おわりに

電気代はかかってしまうかも知れませんが、元々動かしっぱなしにしているよ、という方はぜひFolding@homeでコロナウイルス解析に貢献してみませんか？
if文の省略記法

```php:from.php
$area = '京都';

//A
$from = isset($area) ? '出身は' . $area . 'です' : '出身地が設定されてません';

//B
if (isset($area)) {
    $from = '出身は' . $area . 'です';
} else {
    $from = ',出身地が設定されてません';
}
```

Aの書き方とBの書き方ではどちらも同じ結果が$fromに代入されることになります。
初学者の自分はBの表記法でしかしたことなかったですが、Aの表記法の方が断然すっきりしますね。
ログインが必要なWEBサービスにお試しログイン機能を付けてみた。

表題の通り、学習のアウトプットでAuth認証が必要なサービスを作ってみても、なかなかEメールとかパスワードとか入力してもらうのって手間では？お試しに気軽にログインできる機能をjsで付けてみた。

```sanple.js
// jQuery利用
$("#js-easyLoginBtn").click(function() {
    $("#js-email").val("sample@123.com");
    $("#js-pass").val("sample");
  });
```
```index.html
<!-- 関係あるとこだけ抜粋 -->
<form>
  <input id="js-email" type="email">
  <input id="js-pass" type="password">
</form>
<div id="js-easyLoginBtn" >お試しログインはこちら</div>
```

見ての通りだけど、`”js-easyLoginBtn”`を押すとイベントが発火して`"js-pass"`と`"js-email"`のval値にそれぞれ、`"sample@123.com"`と`"sample"`が入力される。
[Jenkins] エラーが発生しても後続Stageを実行する書き方

Stageを複数定義している状態で、エラー発生後のStageも実行する方法のメモ。

# 検証バージョン

* Jenkins 2.222.1

# エラーが発生したStageでJobが終了する書き方

```groovy
pipeline {
    agent any 
    stages {
        stage('Test AP1') { 
            steps {
                echo "test ap 1"
            }
        }
        stage('Test AP2') { 
            steps {
                echo "test ap 2"
            }
        }
        stage('Test AP3') { 
            steps {
                echo "test ap 3"
            }
        }
    }
}
```

みたいに書くと、仮に２つ目のStageでエラーが出ると３つ目のStageが実行されない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/d1acc1e7-6676-f7a8-ef0e-ac1dc6789517.png)


# エラーが発生しても後続Stageを実行する書き方（エラー箇所がわからない・・・）

```groovy
pipeline {
    agent any 
    stages {
        stage('Test AP1') { 
            steps {
                catchError {
                    echo "test ap 1"
                }
            }
        }
        stage('Test AP2') { 
            steps {
                catchError {
                    echo "test ap 2"
                    error "error test!!" // エラーを起こすためのダミーコード
                }
            }
        }
        stage('Test AP3') { 
            steps {
                catchError {
                    echo "test ap 3"
                }
            }
        }
    }
}
```

という感じにすると(`catchError`句で囲むと)、後続Stageを実行した上でビルドがエラーになってくれるが・・・どこのStageでエラーが出たかパッと見わからない・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/9ce8a146-cf52-d5e6-13ff-38ebccf6c600.png)

# エラーが発生しても後続Stageを実行する書き方（エラー箇所もわかる！！）

```groovy
pipeline {
    agent any 
    stages {
        stage('Test AP1') { 
            steps {
                catchError(stageResult:'FAILURE') {
                    echo "test ap 1"
                }
            }
        }
        stage('Test AP2') { 
            steps {
                catchError(stageResult:'FAILURE') {
                    echo "test ap 2"
                    error "error test!!" // エラーを起こすためのダミーコード
                }
            }
        }
        stage('Test AP3') { 
            steps {
                catchError(stageResult:'FAILURE') {
                    echo "test ap 3"
                }
            }
        }
    }
}
```

という感じで `stageResult`オプションに `FAILURE` を指定すると、後続のStageを実行した上でエラーになったStageもわかるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/29ba902c-41e1-a45b-a0a5-f92d9afe10f9.png)

# 最後に

ま〜とりあえずやりたいことはできたけど、個別に`catchError`じゃなくて・・・全体のオプションで同じような動作にできたりするのかな！？
QLab AppleScript: cueListの切り替え <next cue list-II>



**QLab4でscript cueを使って指定したcue listをアクティブにする.**

はじめにお読みください→[About Qlab AppleScript](https://qiita.com/kooky_mice/private/6ad9380fca6b14eb01a0)  

<details><summary><b>Release Note:</b> 2020/4/2</summary><div>
・ アルゴリズムの変更により動作を高速化しました
・ 高速化に伴い, 変数の設定条件を変更しています。

</div></details>

# AppleScript
Scriptはscript cueのscriptタブに直接書き込む.

```applescript:next_cue_list_hso.scpt
set nextcueList to "Target_cueList"
set selectcueNumber to "Select_CueNumber"

tell application id "com.figure53.QLab.4" to tell front workspace
	set selected to item 1 of (get every cue of (every cue list whose q name is nextcueList) whose q number is selectcueNumber)
	
	go
	
end tell
```


## Setting
1. [Inspecta]内の[Script]タブにスクリプトを入力する.
1. スクリプトに変数を指定する.
1. アクティブにしたいcue listの名前を`set nextcueList to "Target_cueList"`の
**Target_cueList**に指定する.
1. "Compile Script"でスクリプトをコンパイルする.  
    → *Successfully compiled.* と表示されると実行可能です.
![Qiita_next_cue_list_img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411510/84d9615a-be4c-309e-8c44-c3a3beec83c7.png)





### Variable
- Target_cueList
 - <font color="Red"> **必須** </font>
 - 目的とするcueListの名前を指定する.
 - 指定できるcueListの名前は日本語も文字列もOK.
 - 指定する名前に""を含む場合はバックスラッシュ(\\)でエスケープする.  
 **例) cue listの名前が*****BGM "Monday"*****の場合:** `set nextcueList to "BGM \"Monday\""`

- Select_CueNumber
 - <font color="Red"> **必須** </font>
 - 選択するcue numberを指定する.
 - 指定できるcue numberは日本語も文字列もOK.

### Option
+ script cueを実行時にアクティブにしたcue listのcueを***Go***するには`set selected to item 1 of (get every cue of (every cue list ~`の下に`go`を追加する.  
選択状態で待機にする場合には`go`をコメントアウト(`--go`)する. 

# Environment
<!--+ macOS High Sierra (10.13.6)-->
<!--+ QLab 4.6.3-->
+ macOS Mojave (10.14.6)[Intel]
+ QLab 4.6.11

# Reference
[A CUE LIST A DAY - The QLab Cook Book](https://qlabcookbook.com/1996/01/19/a-cue-list-a-day/)
IBM CLOUDのAPIを使うにあたり、Python2から３への切り替えが必要な場合にすること

IBM CLOUDのAPIを使うにあたりPython2.7からPython3.xへ変更する場合

※yum がpythonで書かれているので削除は厳禁。

現状の確認を実施
$ python --version
Python 2.7.5
と表示されます。

まずgitをインストール
$ sudo yum install git

次にpyenvをインストールします
$ sudo curl https://pyenv.run | bash
※pyenvはpythonのバージョン切り替えツールです

インストール後に出力されるメッセージに従い~/.bashrcに以下を追加します。
export PATH="/(Home dir)/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

ログインし直すことで利用できるようになります。

$ pyenv
pyenv 1.2.17-2-ga8ca63f
Usage: pyenv <command> [<args>]
（以下省略）
が表示されると正常にインストール完了

これからpython3をインストールします。コンパイルを行うため以下のパッケージを入れます。
$ sudo yum groupinstall "Development Tools"
$ sudo yum install zlib-devel libffi-devel openssl-devel

以下のコマンドにより導入可能なプログラム一覧が表示されます。
最初に表示される数字だけのものがpythonとなります。
$ pyenv install -l


ここでは3.7.7を導入します
$ pyenv install 3.7.7

確認はpyenv versionと入力します。
$ pyenv versions
* system (set by /(Home Dir)/.pyenv/version)
3.7.7

切り替えコマンドは以下の通りです。
$ pyenv global 3.7.7
$ python --version
Python 3.7.7
無事3.7.7が導入されました。


ログインした時に以下のようなメッセージが表示される場合あり。何かが足らないようです。
「pyenv: no such command `virtualenv-init'」

virtualenv-initが無いということのようでしたので、別途導入しています。

以下を実行します。
git clone https://github.com/yyuu/pyenv.git ~/.pyenv

本来はこれで実行ファイルが所定の位置に導入されるのでしょう。
やはりエラーメッセージが表示される場合、正しく配置されないようです。
以下のようにコピーしてしまいます。

cd .anyenv/envs/pyenv/plugins/pyenv-virtualenv/bin
cp * /usr/local/bin

最後にインストールします。
pip install softlayer

※pythonの別のバージョンを導入した場合、同様にインストール操作が必要です。



▪️その他・余談
もしPerlを使った場合HTTPS接続がCan't verify SSL peersというエラーになるときには？

以下を入れることで解決する場合があります。
% sudo cpan install Mozilla::CA
【Java入門】Java SE・EE・ME？JDK・JRE・JVM？

# Javaの種類って？
- JDK(Java Development Kit)
- JRE(Java Runtime Environment)
- JVM(Java Virtual Machine)

# JDK(Java Development Kit)とは？
Javaプログラムを開発するための基本的なソフトウェア。

# JDKの構成？
コンパイラ、デバッガ、アーカイバ、ソフトウェアモニター、ドキュメントジェネレーターなどの基本開発ツール、及び、様々な開発支援ツール、Java API（Java Application Programming Interface）で構成される。

# JRE(Java Runtime Environment)とは？
Javaアプリケーションを実行するために必要なソフトウェア。

# JREの構成？
Java仮想マシン（Java Virtual Machine）や、”Java.exe”を始めとする様々なスターター（Web用プラグインを含む）、Javaクラスライブラリ（Java Class Library）などで構成される。

# JREの種類？
- プライベートJRE
JDKをインストールする際には、プライベートJREがインストールされ、必要に応じてパブリック・コピーがインストールされます。プライベートJREでは、JDKに付属のツールを実行する必要があります。これにはレジストリ設定がなく、場所がJDKにのみ認識されているJavaディレクトリ(通常はC:\Program Files\jdk1.7.0\jre)に完全に含まれています。

- パブリックJRE
他のJavaアプリケーションで使用でき、JDKの外部(通常はC:\Program Files\Java\jre1.7.0)に含まれています。これは、Windowsレジストリ(HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft)に登録されています。これは、「プログラムの追加と削除」を使用して削除することができ、ブラウザにも登録されます。

# JVM(Java Virtual Machine)とは？
Java内で、命令を実行できるようにするソフトウェア・プログラム。
「Java仮想マシン」「JavaVM」などと呼ばれることもあります。

# JDKの種類？
- Java SE(Java Standard Edition)
Java の基本となる APIを まとめたもの。
Javaプログラミング言語のコア機能を提供。

- Java EE(Java Enterprise Edition)
Java SEプラットフォームの上に構築されている。（Java　SE拡張機能バージョン？）

- Java ME(Java Micro Edition)
-携帯電話などの小型デバイス上でJavaプログラミング言語アプリケーションを実行するためのAPIと小さなフットプリント仮想マシンを提供

※おまけ
- Java FX
Java FX ScriptTMで書かれたリッチインターネットアプリケーションを作成するためのプラットフォーム

# 参考
[JAVA種類](https://josys-navi.hiblead.co.jp/josys-bk-now_type-of-java_190311)
複数行にまたがる文字列を利用する方法（ヒアドキュメント）

シングルクオートとダブルクオート以外で、複数行にまたがる文字列を利用する方法でヒアドキュメントがあります。
ヒアドキュメント構文（<<<）の後に終端識別子を定義し、それが出現するまでを文字列として認識します。

```php:heredocument.php
$age = 29;

$a = <<<EOM
初めまして。私はktktと言います。
年齢は${age}歳です。

よろしくお願いします。
EOM;

echo $a;
```

実行結果

```php:heredocument.php
初めまして。私はktktと言います。 年齢は29歳です。 よろしくお願いします。
```


注意する点は、終端識別子は必ず行頭から始まり、直前にインデントなどを含めず、すぐに改行しなければなりません。

また、ヒアドキュメントの中ではダブルクオートと同様に、変数が展開されます。

＊終端識別子は何でもよく、ABCでも大丈夫です。よく使われるのは、EOM（エンドオブメッセージ）、EOD（エンドオブドキュメント）のようです。
ERROR:root:code for hash md5 was not found.

ERROR:root:code for hash md5 was not found.

pythonでimportを使用した時、こんなエラーが出た。

python@2が原因の様でしたので、

$brew uninstall python@2

もしくは、

$brew reinstall python@2

を実行した結果、問題解決した。
Golang インターフェースと抽象化

## そもそも抽象化とは
- 具体的な実装を隠し振る舞いによって共通化させること
- 複数の実装を同質のものとして扱う

## インターフェースによる抽象化とは
- Goではインターフェースでしか抽象化することができない
- `interface` はメソッドの集合を抽象化したもの
- `interface` は異なる具象型(concrete type)を同じように取り扱うことを可能にしてくれる抽象型(abstract type)

## インターフェース
- Goのインタフェースは，その型がどのようなメソッドを実装するべきかを規定する役割を持つ
- `型T`が`インターフェースI`を実装しているとは
    - インターフェースで定義されているメソッドを全て持つ
    - `型T`は`インターフェースI型`として振る舞うことができる
        - `var i I = t` // tはT型の変数とする

### インターフェースの例
- インターフェースはメソッドの集まり
    - メソッドのリストがインターフェースで規定しているものと一致する型はインターフェースを実装していることになる

```sample.go
package main

import "fmt"

// バスケをするためのインターフェース
type BasketBaller interface {
	Run()
	Dunk()
	Jump()
	Shoot()
}

// 人間と犬の構造体
type Human struct {
	Height int
	Weight int
}
type Dog struct {
	Kind string
}

// 人間のインターフェースの実装
func (h Human) Run() {
	fmt.Printf("身長: %v, 体重:%v, の選手が走るよ\n", h.Height, h.Weight)
}
func (h Human) Dunk() {
	fmt.Printf("身長: %v, 体重:%v, の選手がダンクをするよ\n", h.Height, h.Weight)
}
func (h Human) Jump() {
	fmt.Printf("身長: %v, 体重:%v, の選手がジャンプをするよ\n", h.Height, h.Weight)
}
func (h Human) Shoot() {
	fmt.Printf("身長: %v, 体重:%v, の選手がシュートするよ\n", h.Height, h.Weight)
}

// 犬のインターフェースの実装
func (d Dog) Run() {
	fmt.Printf("犬（%v）が走るよ\n", d.Kind)
}
func (d Dog) Dunk() {
	fmt.Printf("犬（%v）はダンクをできないよ\n", d.Kind)
}
func (d Dog) Jump() {
	fmt.Printf("犬（%v）がジャンプをするよ\n", d.Kind)
}
func (d Dog) Shoot() {
	fmt.Printf("犬（%s）はシュートができないよ\n", d.Kind)
}

// BasketBallerインターフェースが引数になる、Basketメソッド
func Basket(b BasketBaller) {
	b.Dunk()
	b.Jump()
	b.Run()
	b.Shoot()
}

func main() {
	var human = Human{170, 64}
	var dog = Dog{Kind: "プードル"}
	var basketBaller BasketBaller

	basketBaller = human // Human型をBasketBaller型に
	Basket(basketBaller)

	basketBaller = dog // Dog型をBasketBaller型に
	Basket(basketBaller)
}

```
Qiitaはじめてみました。のテスト

# はじめに
これは、テストアカウントでのテスト投稿になります。
あくまで自身のQiita投稿・Markdown記法の練習ですので、特にこの記事に価値はありません。

# 経歴
・自社開発のソフトウェア開発業務
　　⇓
・エセフリーランス
　　⇓
・社内ＳＥ（内製IoTソフトウェア開発業務）

# 使用言語
* C# (WPF on .NET Framework)
* C# (ASP.NET Core)
* Kotlin
* Delphi (過去)

# 投稿の目的
以下の目的で記事投稿を行います。

* 後に振り返れる知的財産の形成
* 学習内容のアウトプットによる定着化と体系的な理解度向上の補助
* 獲得知識の共有とそれに伴う恩恵の教授

# 感想
基本的に勉強不足なので、お手柔らかにお願いしますね。
一応閲覧者に利益のある内容を提供したい意思はあるので、まとめ方には注意を払いながら記事内容の精度を上げていきたいと思っています。
よろしくお願いします。

# プログラムコード記入テスト

```C#:MainWindow.xaml.cs
namespace BurageSnap
{

    private ObservableCollection<Item> _collection { get; set; } 

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            _collection = new ObservableCollection<Item>();

            this.DataContext = _collection;
        }
    }
}
```
ros チュートリアル

初心者質問で恐縮なのですが、解決策を講じていただければ幸いです。

rosrun tertlesim tertlesim_node

という処理を実行したいのですが

[ERROR] [1585755566.453071844]: [registerPublisher] Failed to contact master at [localhost:11311].  Retrying...

このようにエラーとなってしまいます。

調べてみるとroscoreを行ってから実行すると良いというのを見たのですがroscoreは正常に実行することができましたが、その後のエラーについては変わらなかったです。

環境はvirtualboxで
ホストはmac
ゲストとしてlinux ubuntuを使用しています。

よろしくお願いします。
MySQL データベース作成 テーブル作成からデータの格納 取り出し

# 目的

- MySQLで基礎的な一連のデータの取り扱い方法をまとめる
- 必要だと思うことを随時追加してゆく

# 実施環境

- ハードウェア環境

| 項目 | 情報 | 備考 | 
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) ||
| ハードウェア | MacBook  Air (11-inch ,2012) ||
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 ||
| メモリ | 8 GB 1600 MHz DDR3 ||
| グラフィックス | Intel HD Graphics 4000 1536 MB ||

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 実施環境

- 下記の方法を用いてMySQLの環境をMac上に構築した。
    - [Mac Homebrewで最新のMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9)

# 簡単な前提知識

- 今回紹介するSQL文の予約語(selectなど)は小文字で記載する。
- SQL文の予約語は大文字小文字を考慮しない。

# MySQLのターミナルをrootユーザで開く

- 下記コマンドを実行する。

    ```terminal
    $ mysql -u root -t
    ```

# データベースを作成する

- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> create database データベース名;
    ```

# 現在存在するデータベースを確認する

- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> show database;
    ```

# データベース内のテーブルを確認する

- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> show tables from データベース名;
    ```

# データベース内のテーブル内のカラムを確認する

- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> show columns from テーブル名 from データベース名;
    ```

# 使用するデータベースを指定する。

- 指定する事によりデータベース名を指定するSQL文をのデータベース名を省くことができるので多様したい。
- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> use データベース名;
    ```
- 上記を設定すると先に紹介したデータベース内のテーブルを確認するSQL文やカラムを確認するコマンドのデータベース名を省略することができる。
- データベース名をuse文で指定した場合のテーブルを確認するコマンドを記載する。

    ```mysql
    mysql> show tables;
    ```
- データベース名をuse文で指定した場合のテーブル内のカラムを確認する方法をまとめる。

    ```mysql
    mysql> show columns from テーブル名;
    ```

# 使用しているデータベース名を出力する

- MySQLのターミナルにて、すでにuse文を用いてデータベースを指定している時に下記を実行する。

    ```mysql
    mysql> select database();
    ```

# テーブルを作成する

- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> use テーブルを作成するデータベース名;
    mysql> create table テーブル名 
        -> ( カラム名1 データ型1, カラム名2 データ型2, カラム名3 データ型3(データ型の文字数制限などのオプション)
        -> );
    ```

# 作成したテーブルにデータを格納する

- MySQLのターミナルで下記コマンドを実行する。

    ```mysql
    mysql> use テーブルを作成するデータベース名;
    mysql> insert into テーブル名 
        -> (カラム名1, カラム名2, カラム名3)
        -> values ('カラム名1に格納したい値', 'カラム名2に格納したい値', 'カラム名3に格納したい値')
        -> ;
    ```
日本の航空路誌における座標表示をGoogle Mapsなどで使える10進法表示に置き換えるJavaScriptスニペット

追記: 自分でも使う機会が多いのでWebページにしておきました
**https://ryo-a.github.io/ais-coord-converter/**

国土交通省航空局が運営している[AIS Japan](https://aisjapan.mlit.go.jp/Login.do)から入手できる航空路誌では、ウェイポイントやATC境界などの座標が以下のような形式で記載されています。区切りはありませんが、これは60進法表記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185296/5d9329ed-8c40-a92a-ab8e-acc9c09a46f7.png)

eAIP の `GEN 2.1.2` では、通常の書体で表記されているものは Tokyo Datum 、斜体で表記されているものはWGS84座標系であるとされています。適当にチャートを漁る限り、その多くが斜体（WGS84座標系）で示されているのでTokyo Datumはあまり考慮しなくてよいでしょう。

ということで雑に「eAIPにおけるWGS84の60進法座標表示を、Google Maps などで使える10進法表示に変換する」スニペットを置いておきます。
なお、駐機場スポットの位置などで使われている小数点を含むものについては対応していません。

```js
function convert(aipCoord) {
    let aipLat = aipCoord.substring(0, 6);
    let aipLng = aipCoord.substring(7, 14);

    let latDeg = parseInt(aipLat.substring(0, 2));
    let latMin = parseInt(aipLat.substring(2, 4));
    let latSec = parseInt(aipLat.substring(4, 6));

    let lngDeg = parseInt(aipLng.substring(0, 3));
    let lngMin = parseInt(aipLng.substring(3, 5));
    let lngSec = parseInt(aipLng.substring(5, 7));

    let decimalLat = latDeg + latMin / 60 + latSec / 3600;
    let decimalLng = lngDeg + lngMin / 60 + lngSec / 3600;

    return { lat: decimalLat, lng: decimalLng };
}
```
Squid 結果コード (Squid result codes) 一覧

Squid 結果コードは、クライアントに送信されたレスポンスを説明するために、アンダースコアで区切られた複数のタグで構成される。

# レスポンスの種類 (必須タグ)

レスポンスがどのように配信されたかを記述する。

- `TCP`: HTTP ポートでのリクエスト。
- `UDP`: ICP ポートまたは HTCP ポートでのリクエスト。
- `NONE`: Squid が異常なレスポンスを配信したか、応答しなかったことを示す。通常 TCP/UDP のいずれかに分類される前にトランザクションが失敗した場合に発生する。

# 処理が実行理由 (任意タグ)

特定の処理が実行された理由や、リクエストがどこから来たのかを記述する。

- `CF`: リクエストが壊れていることを示す。
- `CLIENT`: クライアントがリクエストに設けた制限により、レスポンスが影響を受けたことを示す。
- `IMS`: クライアントが再検証のリクエストを送信したことを示す。
- `ASYNC`: Squid によってリクエストが内部的に生成されたことを示す。
- `SWAPFAIL`: オブジェクトがキャッシュに存在するはずであったが、アクセスが失敗したことを示す。
- `REFRESH`: 再検証のリクエストがサーバに送られたことを示す。
- `SHARED`: サポートされていないタグ。
- `REPLY`: サーバまたはピアから HTTP レスポンスがあったことを示す。

# オブジェクトの種類 (任意タグ)

- `NEGATIVE`: "404 Not Found" などのエラーレスポンスがキャッシュに存在したことを示す。`HIT` レスポンスでのみ見られる。
- `STALE`: オブジェクトがキャッシュに存在したが、古い状態で提供されたことを示す。
- `OFFLINE`: offline_mode の間に、オブジェクトがキャッシュから取得されたことを示す。
- `INVALID`: 無効なリクエストが受信されたことを示す。
- `FAIL`: 再検証のリクエストが失敗したことを示す。`REFRESH` レスポンスでのみ見られる。
- `MODIFIED`: 再検証により、新しく修正されたオブジェクトが生成されたことを示す。`REFRESH` レスポンスでのみ見られる。
- `UNMODIFIED`: 再検証により、304 Not Modified が生成されたことを示す。`REFRESH` レスポンスでのみ見られる。
- `REDIRECT`: リクエストに対して、Squid が HTTP リダイレクトレスポンスを生成したことを示す。

# キャッシュとの関連 (任意タグ)

- `HIT`: オブジェクトがキャッシュから取得されたことを示す。
- `MEM`: オブジェクトがメモリキャッシュから取得されたことを示す。`HIT` レスポンスでのみ見られる。
- `MISS`: オブジェクトがキャッシュに存在しなかったことを示す。
- `DENIED`: アクセス制御によって、リクエストが拒否されたことを示す。
- `NOFETCH`: サービスは生きていたが、当該リクエストには使用されなかったことを示す。
- `TUNNEL`: バイナリトンネルが確立されたことを示す。

# エラー条件 (任意タグ)

- `ABORTED`: 接続が中断されたため、レスポンスが完了しなかったことを示す。
- `TIMEOUT`: 接続がタイムアウトしたため、レスポンスが完了しなかったことを示す。
- `IGNORED`: キャッシュされたレスポンス A をリフレッシュしているときに、A よりも古い B を取得した場合、Squid が B を無視したことを示す。

# 出典
squid-cache wiki
<https://wiki.squid-cache.org/SquidFaq/SquidLogs>
【VSCode】Remote-sshで鍵の設定を行ったのにパスワードを聞かれる

VSCodeにはRemote-sshという拡張機能があり、
リモート先のファイルを普段と同じ環境で編集することが出来ます。

接続方式では鍵認証も行えるのですが、たまに鍵認証を設定してもパスワードを聞かれることがあるので、その時に確認する事柄を共有します。

## 環境

- Visual Studio Code 1.43.2
- Remote-SSH 0.51.0
- OpenSSH 7.4p1
- OpenSSL 1.0.2

## リモート先サーバーの権限

リモート先サーバーがlinux系の場合、sshの権限は決められており、正しく設定する必要があります。

```bash
# リモート先サーバにて
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
```

## .ssh/configの確認

.ssh/configに正しい形式で記述します。 
VSCodeの拡張とは言え、コンソールからSSHできないと起動出来ません。

```
Host remote_server
    HostName 192.168.11.1
    User user
    IdentitiesOnly yes
    IdentityFile ~/.ssh/key_rsa
```

コンソールから、鍵で入れるかを試します。 
正しい設定がされている場合、`ssh (Host)`だけでリモート先に接続出来ます。

identytyFileとtypoした例。

```bash
$ ssh remote_server
C:\\Users\\ragnar/.ssh/config: line 14: Bad configuration option: identytyFile
C:\\Users\\ragnar/.ssh/config: terminating, 1 bad configuration options
```

## authorized_keysの権限

クライアントがUnix系の場合、クライアント側のauthorized_keysの権限も設定する必要があります。

```bash
$ chmod 700 ~/.ssh/authorized_keys
```

## .ssh/configのHost名変更

ここまでの流れでコンソールからはSSHできるが、VSCodeではパスワードが聞かれる場合、  
configのHostの名前を変更すると上手く行く場合がある。

`user@hostname`とHostを設定している場合、拡張機能側でhostとuserを解釈されるようで、うまく動かなかった。
また、スペースも使用しないほうが良いようだ。

```bash
# NG
Host user@hoge
    HostName 192.168.11.1
    ...
# NG
Host user hoge server
    HostName 192.168.11.1
    ...
# OK
Host remote_server
    HostName 192.168.11.1
    ...
```
SwiftUIでiPhoneのバッテリー残量を表示してみる

# はじめに
たまたまTwitterで#swiftuiを検索していたら見つけたので、ちょっと作ってみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今のバッテリー残量にどうやってアクセスするんだろう…<br><br>UIKitのサンプルはたくさんあるのにSwiftUIはとても少ないのが少し大変ですね😭<a href="https://twitter.com/hashtag/SwiftUI?src=hash&amp;ref_src=twsrc%5Etfw">#SwiftUI</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85?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></p>&mdash; ふってぃプログラミング初心者SwiftUI (@Futty_99) <a href="https://twitter.com/Futty_99/status/1244813847845732353?ref_src=twsrc%5Etfw">March 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# バッテリー残量を取るには
バッテリー残量を取るには、下記のコードで取得できます。

```swift:BatteryViewModel.swift
        //バッテリー監視を開始する
        UIDevice.current.isBatteryMonitoringEnabled = true
        //変化通知登録しただけなので初回は更新する必要がある
        remain = String(format: "%0.1f", UIDevice.current.batteryLevel * 100)
        status = UIDevice.current.batteryState
```

その後の変化通知を`NotificationCenter`で受け取れます。

```swift:BatteryViewModel.swift
        //バッテリーレベル変化通知を受け取れるようにする
        NotificationCenter.default.addObserver(self, selector: #selector(batteryLevelChanged(notification:)), name: UIDevice.batteryLevelDidChangeNotification, object: nil)
        //バッテリー状態編か通知を受け取れるようにする
        NotificationCenter.default.addObserver(self, selector: #selector(batteryStateChanged(notification:)), name: UIDevice.batteryStateDidChangeNotification, object: nil)
```

# バッテリー残量をViewに反映する
ObservableObjectで反映します。

```swift:BatteryViewModel.swift
class BatteryViewModel: ObservableObject {
    ///バッテリー状態
    @Published var status: UIDevice.BatteryState = .unknown
    ///バッテリー残量
    @Published var remain = ""
```

# 終わりに
サンプルコードは、[github](https://github.com/FromF/SwiftUI-Battery/blob/master/SwiftUI-Battery/)にアップしています。
参考にどうぞ。
[Rails]refileの使い方を初心者がまとめてみた。[refile]

#はじめに
私のオリジナルサービスの画像投稿機能にrefileを使用したので、簡単にまとめておきたいと思います。
つまづいたところとかも記載しておくので、参考になれば幸いです。

#refileの導入
##gem
いくつかQiitaやブログなどで参考記事はありますが、gemをinstallできないもののいくつか見受けられました。
githubに記載されている [github/refile](https://github.com/refile/refile#1-backend)

```ruby:Gemfile
gem "refile", require: "refile/rails"
gem "refile-mini_magick"
```
↑この記述方法ではbundle install できませんでした。（環境によっては変わるのか？）

なので、私はこの記事([refile使い方](https://qiita.com/salvage0707/items/2614c97a1f256027ef71))を参考にして、

 ```ruby:Gemfile
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"
```
としました。そして　

```
$ bundle install
```

で追加したgemをインストールします。
次にgithubを参考にしていくと

`We're requiring both Refile's Rails integration and image processing via the MiniMagick gem, which requires ImageMagick (or GraphicsMagick) to be installed. To install it simply run:`

と書かれており、ImageMagickをインストールする必要があると言われているので、

```
$ sudo apt-get install imagemagick
```

とします。
(僕の場合、　apt-get　を　yum　に直して、　imagemagick　を　ImageMagick　に変更するとインストールできました。ちなみにAWSのcloud9で開発しています。)

##model
インストールが終わったら、次は画像投稿機能を追加したいmodelに

```ruby:画像投稿機能をつけるmodel
class User < ActiveRecord::Base
  attachment :image_id
end
```

`attachment :画像を入れたいカラム名 + _id` を追記します。
`_id`の説明についてはまた後でしますので、ひとまずつけておいてください。


##カラムの追加
カラムの追加は　`rails g migration add_(追加したいカラム名+_id)_to_追加するモデル名 (追加したいカラム名+_id):型 `　とします。

```
$ rails generate migration add_image_id_to_users image_id:string
```
ポイントは　`(追加したいカラム名+_id)`　←これです。
refileの決まりで、先ほどの `attachment :`　くっつけるカラムには　`_id`が必要になります。
なので、さきほどのmodelでも出てきましたが、カラム名には　`_id`をつけてあげてください。

##View
次は画像投稿用のフォームを作成します。　`<%= form.attachment_field :カラム名 %>`　で投稿用のフォームが完成します！
ややこしいですが、ここでのカラム名には　`_id`はいりません。

```
<%= form_for @user do |form| %>
  <%= form.attachment_field :profile_image %>
<% end %>
```

##Controller
次はストロングパラメータに先ほど追加したカラムをpermit（許可）してあげないといけません。
ここでも　`_id`は必要なし。

```ruby:users.controller
def user_params
  params.require(:user).permit(:name, :email, image　←これを追加)
end
```

##View
これで最後です。画像を表示したいところに

```
<%= image_tag attachment_url(@user, :image, :fill, 300, 300, format: "jpg") %>
```

のように追記してあげるだけです！ここでも　`_id`は必要なし。
この　`:fill, 300, 300`　の部分で縦横幅を決めれます。（が、レスポンシブ対応にするならCSSとかで指定した方がいいかも？）
これで投稿した画像が表示されるはずです！

#まとめ
実際、なにもわからない時に画像投稿機能をつけたいな〜と思いながらQiitaの記事を漁ってましたが、ほとんど分からずにかなり苦戦しました…。
なので、初心者の方にもわかるようにできるだけ詳しく解説してみました。
ポイントはなんども出てきた　`_id`　かな〜と個人的には思います。

#参考記事

- [refile使い方](https://qiita.com/salvage0707/items/2614c97a1f256027ef71)
- [rifile/git](https://github.com/refile/refile)
- [うるぞーさんのyoutube (Ruby on Railsでブログを作ろう part3 画像アップロード機能をつくる)](https://www.youtube.com/watch?v=YiQ7xjge6cY&t=1347s)

正直どんな記事よりもうるぞーさんのyoutubeを見るのが手っ取り早いです。ほんと神。
ほとんどこの動画を参考にしてました。ありがとうございます。
Ubuntu Linuxで、Tabをqにする

# TL;DR

* やんごとなき理由で、`Tab`キーを`q`キーにしたい
* 対象はUbuntu Linux
* `xev`でキーコードとkeysymを調べて`xmodmap`で割り当てる


# 環境

```shell
$ uname -srvmpio
Linux 4.18.0-25-generic #26~18.04.1-Ubuntu SMP Thu Jun 27 07:28:31 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
```


# `xmodmap`と`xev`

`xmodmap`というコマンドで、キーの割り当てを変更できます。

```shell
$ xmodmap -e "keycode [keycode] = [keysym]"
```

`[keycode]`が指す物理的なキーを、`[keysym]`が指す内容に割り当てることができます。

これらを調べるには、`xev`コマンドを使います。

```shell
$ xev
```

コマンド起動後にキーを押すと、キーコードとkeysymを調べることができます。

"q"を押した場合は、keycodeは24で、keysymはqです。

```shell
KeyPress event, serial 37, synthetic NO, window 0x5e00001,
    root 0x17e, subw 0x0, time 5825075, (42,674), root:(197,823),
    state 0x0, keycode 24 (keysym 0x71, q), same_screen YES,
    XLookupString gives 1 bytes: (71) "q"
    XmbLookupString gives 1 bytes: (71) "q"
    XFilterEvent returns: False
```

"Tab"を押した場合は、keycodeは23で、keysymはTabです。

```shell
KeyPress event, serial 37, synthetic NO, window 0x5e00001,
    root 0x17e, subw 0x0, time 5804891, (141,203), root:(296,352),
    state 0x0, keycode 23 (keysym 0xff09, Tab), same_screen YES,
    XLookupString gives 1 bytes: (09) "	"
    XmbLookupString gives 1 bytes: (09) "	"
    XFilterEvent returns: False
```


# Tabをqにする

ここまでの情報が得られたので、Tabをqにするには、以下のようにします。

```shell
$ xmodmap -e "keycode 23 = q"
```

元に戻すには、以下のようにします。

```shell
$ xmodmap -e "keycode 23 = Tab"
```

なお、この変更は現在のX Windowセッションのみで、永続的な適用は行われません。

個人的には、それで問題ないので…。
画像をトリミングできる object fitプロパティが使える件

#『HTMLで表示する画像のサイズを調節したい！ でも、縦横の比率はそのままにしたい！』

というケースは多いと思います。
そんな時は<strong>object-fit</strong>プロパティを使いましょう。


元の画像がこんな感じだとします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/66920da0-15f4-a2aa-4e1e-39176fdb6ec4.png)


 この画像を縦300px横500pxで埋め込むとします。

```
img {
  height: 300px;
  width: ５00px;
}
```


<img width="602" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/bc4ebdb8-67ab-efec-86e8-158e6cf56c42.png">


サイズは合いましたが、比率は歪んでしまっています。
早速ここで<strong>object-fit</strong>を使ってみます。

```
img {
  height: 300px;
  width: 300px;
  object-fit: cover
}
```

<img width="602" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/1a9fa815-0363-fb78-ef92-9ef168471855.png">

比率が維持されつつ、枠に収まっています。

今回はカバーを指定しましたが、他にも,
fill, contain, none, scale-downなんかがあります。

見てもらったほうが早いんじゃないかと個人的には思います。

##fill 
文字通り画像がはめ込まれています。

```
img {
  height: 300px;
  width: 500px;
  object-fit: fill;
}
```
<img width="599" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/29db1a40-33f5-f554-2a00-92c2dfbf7875.png">

## contain 
元の画像の縦横の比率を維持したまま、左右に余白が生じています。
```
img {
  height: 300px;
  width: 500px;
  object-fit: contain;
}
```
<img width="600" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/b5976f35-44d8-deaf-09ac-475d3b66a2cb.png">


##none 
指定サイズとは関係なく画像が表示され、残りはトリミングされています。

```
img {
  height: 300px;
  width: 500px;
  object-fit: none;
}
```

<img width="604" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/a833cfc0-9d71-683e-7916-372a33d2611c.png">

## scale-down 
画像が指定より大きい場合はcontain,小さい場合はnoneが適用されます。
この場合はnoneですね

```
img {
  height: 300px;
  width: 500px;
  object-fit: scale-down;
}
```

<img width="603" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594063/e495edef-d6c2-b827-13a3-85e05c2a88a4.png">

今回はobject-noneについてまとめてみました。
まだまだQiitaに慣れず、ブログに結構時間が掛かってしまいます、、、（そもそもブログというものを書く事自体が2回目）

今度はもう少しペースをあげて、アウトプットの効率を高めていきたいものです。
【Rails】孫モデルの数が最大の子モデルの要素を取得する方法（maximum,maxを使わず、sortで実装する）

#やりたいこと
食べログ的なサービスを作っているとして、
**いいねが最も多い投稿の画像を、お店の画像として表示したい**

#まえがき
今回やりたかったことが、Railsの`maximum`メソッドやRubyの`max`メソッドを使ってもどうしてもできなかった。（やり方あったら教えてください。）
ので、自分でメソッドを作りました。

アイデアとしては、最大のものを取ってくるというよりも、**「並べ替えて端っこを持ってくる」**ってだけです。

`sort`メソッドを使いました。
自分的に少し詰まったのでまとめておきます。
誰かの役に立てることを願って。

#状況
##機能
食べログ的なサービスを作っている。機能としては、

- お店に対して
- ユーザーが
- 画像を投稿する
- ユーザーは投稿に対していいねできる

##テーブル
|テーブル名|カラム1|カラム2|カラム3|カラム4|
|--- |---|---|---|---|
|Shop|id|name|
|User|id|name|
|Post|id|user_id|shop_id|image|
|Like|id|user_id|post_id|

##アソシエーション
- Shop has many posts
- User has many posts
- User has many likes
- Post has many likes

（belongs toは省略）

#概要

- ControllerでShopモデルのインスタンス取得
- Viewで`most_liked_image`メソッドを使って画像を表示
- Modelで`most_liked_image`メソッドを定義

この順に説明します。

##ControllerでShopモデルのインスタンス取得
```.rb
@shop = Shop.find(params[:id])
```
とか。
変数`@shop`にShopモデルのインスタンスが入れる。

##Viewで`most_liked_image`メソッドを使って画像を表示
```.erb
<%= image_tag @shop.most_liked_image.to_s %>
```
`most_liked_image`メソッドについては次項で説明します。

##Modelで`most_liked_image`メソッドを定義
`most_liked_image`メソッドで、最もいいねが多い投稿の画像を取得することを考える

```models/shop.rb
class Shop < ApplicationRecord
  has_many posts, dependent: :destroy

  def most_liked_imege
    sorted_posts = self.posts.sort { |a,b| a.likes.count <=> b.likes.count }
    sorted_posts.last.image
  end
end
```

以上.
間違ってたらごめんなさい。