OmniAICreator/Qiita-1.07M huggingface dataset:
[=LOVE]青春"サブリミナル"を再現してみた

アイドルグループ「=LOVE」(イコールラブ、通称イコラブ)さんの8thシングル[『青春"サブリミナル"』](https://www.youtube.com/watch?v=8id6i_QeNJM)の歌詞の一部をGitとJavaScriptを使って再現してみました！

#手順
gitリポジトリ内で行います。

###jsファイルを設置

```javascript:unkown_by_ut.js
const LOVE = 'love';
let answer

```
二行目末尾に改行を入れておくのがポイントです。

###一つ目のコミット

```sh
git add .
git commit -m "さっきまで"
```

###jsファイルに変更を加える

```javascript:unkown_by_ut.js
const LOVE = 'love';
let answer
=LOVE
```

###二つ目のコミット

```sh
git add .
git commit -m "その答え"
```

###完成！

```sh
git log
```
を実行すると、

```
commit 12fb9840578f2410882ea0e1fa66ac832319d093 (HEAD -> master)
Author: user <user@sample.com>
Date:   Sun Dec 27 10:00:00 2020 +0900

    その答え

commit 2755bace9774959e9ef437c5db06e636ccd94a5a
Author: user <user@sample.com>
Date:   Sun Dec 27 10:00:00 2020 +0900

    さっきまで
```
さらに

```sh
git diff 2755bace9774959e9ef437c5db06e636ccd94a5a 12fb9840578f2410882ea0e1fa66ac832319d093
```
を実行して、

```
diff --git a/unkown_by_ut.js b/unkown_by_ut.js
index 6966efa..90b7c6d 100644
--- a/unkown_by_ut.js
+++ b/unkown_by_ut.js
@@ -1,2 +1,3 @@
 const LOVE = 'love';
 let answer
+=LOVE
\ No newline at end of file
```
差分が「=LOVE」となります。

#まとめ
と、いうわけで！
__さっきまでと違うもの〜♪  その答えは「=LOVE」~♪__
[『青春"サブリミナル"』](https://www.youtube.com/watch?v=8id6i_QeNJM)名曲なので、よかったら聴いて下さい！！

あと、ネタ被りを恐れてQiita内で「イコラブ」を検索したところ、
[Twitterのいいね数を推定してみる](https://qiita.com/obr_bt/items/6c2294a16f38c67bfc94)
[Twitterのいいね数推定の精度向上を図ってみる](https://qiita.com/obr_bt/items/86aaaf3181efac6cf867)
という真っ当な記事を書いている方がいらっしゃいました。私も[大場花菜](https://twitter.com/hana_oba)ちゃん推しです。

では、お粗末様でした〜
[Ruby]色々なeachの種類

# はじめに

勉強していると色々な種類のeachが出てきたので
忘れないように記していきます。:sunny:


# eachメソッド

1 . 配列や範囲オブジェクトなどに用意されているメソッドです。
   オブジェクトに含まれている要素を取り出します。

```Ruby
fruits = [ "apple", "orange","banana"]
 
fruits.each do |fruit|
  p fruit
end

#=>"apple"
#  "orange"
#  "banana"
```

2 . 配列のkeyとvalueを同時に取り出して使用したい場合は変数を2つ設定します。


```Ruby
fruits = { apple: 100, orange: 200, banana: 300}

fruits.each do |key, value|
  puts "#{key}の値段は#{value}円です。"
end

#=>"appleの値段は100円です。"
#  "orangeの値段は200円です。"
#  "bananaの値段は300円です。"
```

下記のように記述することもできます。
(お好みで。長いブロックを書くときは前のような記述は⇧、コンパクトに書きたい場合は⇩)


```Ruby
fruits = { apple: 100, orange: 200, banana: 300}

fruits.each { |key, value| puts "#{key}の値段は#{value}円です。"}

#=>"appleの値段は100円です。"
#  "orangeの値段は200円です。"
#  "bananaの値段は300円です。"
```

## each_keyメソッド

keyのみを取り出したい場合に使用します。


```Ruby
fruits = { apple: 100, orange: 200, banana: 300}

fruits.each_key {|key|  p "#{key}の値段" }

#=>"appleの値段"
#  "orangeの値段"
#  "bananaの値段"
```

## each_valueメソッド

valueのみを取り出したい場合に使用します。


```Ruby
fruits = { apple: 100, orange: 200, banana: 300}

fruits.each_value { |value| p "#{value}円"}

#=>"100円"
#  "200円"
#  "300円"
```

## each_with_indexメソッド

1 . 配列の要素意外にindexの数字を使用したい場合に使用します。
    

```Ruby
fruits = [ "apple", "orange","banana"]
 
fruits.each_with_index do |a,i|
  p "#{i}個の#{a}があります。"
end

#=>"0個のappleがあります。"
#  "1個のorangeがあります。"
#  "2個のbananaがあります。"
```

2 . 引数にindexの初期値を設定して開始する数値を指定できます。
　　 (◯番から始めたいんだよなぁっていうとき。)

```Ruby
fruits = [ "apple", "orange","banana"]
 
fruits.each.with_index(5) do |a,i|
  p "#{i}個の#{a}があります。"
end

#=>"5個のappleがあります。"
#  "6個のorangeがあります。"
#  "7個のbananaがあります。"
```

### each_sliceメソッド

引数に数を指定します。そうすることで名前の通り指定した数をsliceして要素を取り出すことができます。

 ```Ruby
fruits = [ "apple", "orange", "banana", "lemon","lime"]

fruits.each_slice(2) do |fruit|
  p fruit
end

#=>["apple", "orange"]
#  ["banana", "lemon"]
#  ["lime"]
```

### each_lineメソッド

改行部分で分けて取り出すことができます。

```Ruby
fruits = "apple\norange\nbanana\nlemon"
fruits.each_line {|line| p line.chomp }

#=>[:apple, :orange, :banana, :lemon]
```

### each_with_objectメソッド

引数のオブジェクトと要素を評価して最後に引数のオブジェクトを返します。

```Ruby

arr = [1, 2, 3]

result = arr.each_with_object({}) do |item, memo|
  memo[item] = item + 1
end

p result
#=>{1=>2, 2=>3, 3=>4}
```

`こちらはさらに深堀として。。`

- [injectとeach_with_objectって何が違うのさ？](https://qiita.com/Kta-M/items/c9781e09d96601687767)

# まとめ

eachの仲間も色々な種類があるのがわかりました。
少しずつ覚えてできる範囲を広げて行こう・・・！！:fire:
unrecognized selector sent to instanceエラーはこんな時にも出る。


## はじめに
ボタンを作成し、押したらある処理をするといったコードを書いていました。
すると、buildはうまくいっているのに、ボタンを押したとたん、その処理をせずに``unrecognized selector sent to instance``のエラーが出ました。
これを解決するのに苦労したのでメモを残します。
![button_error.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662345/cf9fdec8-f964-cdb6-1835-c02275aa0214.gif)

この方とは違う原因でした。
https://qiita.com/yoshiki-0428/items/80ea88f65f5a62ffcc11

## 原因
画面右の黄色い三角(危険マーク)のところをご覧ください。一つのボタンに2つ@IBActionが紐付けられています。これが原因です。![スクリーンショット 2020-12-27 10.32.36（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662345/d4a8831d-0440-0e0b-be14-a29aaa45e0b8.png)



## 対処法
この紐付けの解除に困りました。理由は、コードを削除していても、黄色いマークの方の紐付けを消すまでしないと解除されません。
![スクリーンショット 2020-12-27 10.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662345/d32286d3-418e-fd27-905a-b1c7b2cdbfa7.png)

(補足)紐付けの確認方法はこの記事を参考にしました
https://teratail.com/questions/46087

## まとめ
初見殺しというのと、swiftの記事が少ないので書きました。「こんなのでキータ書くな！」と言われるのを恐れながら書いたので、暖かい目で。。。
enchant.jsでスプライトのアンチエイリアスを強引に抜く(要検証)


**注意** : まだよく検証できていません。この記事はあくまで「最後の手段」としてご参考ください。

`enchant.js`のコードをちと編集してしまう。
v0.8.3、3039行目からである。

```
.
.
.
    },
    /**#nocode-*/
    cvsRender: function(ctx) {
        var image = this._image,
            w = this._width, h = this._height,
            iw, ih, elem, sx, sy, sw, sh;
        if (image && w !== 0 && h !== 0) {
            iw = image.width;
            ih = image.height;
            if (iw < w || ih < h) {
                ctx.fillStyle = enchant.Surface._getPattern(image);
                ctx.fillRect(0, 0, w, h);
            } else {
                elem = image._element;
                sx = this._frameLeft;
                sy = Math.min(this._frameTop, ih - h);
                // IE9 doesn't allow for negative or 0 widths/heights when drawing on the CANVAS element
                sw = Math.max(0.01, Math.min(iw - sx, w));
                sh = Math.max(0.01, Math.min(ih - sy, h));
                ctx.drawImage(elem, sx, sy, sw, sh, 0, 0, w, h);
            }
        }
    },
    domRender: (function() {
.
.
.
```

この最初の部分をこんな感じにする。

```
.
.
.
    },
    /**#nocode-*/
    cvsRender: function(ctx) {

        ctx.imageSmoothingEnabled= false;  // この行を追加！

        var image = this._image,
            w = this._width, h = this._height,
            iw, ih, elem, sx, sy, sw, sh;
```

### ちょっと解説

どうやらこの`enchant.js`、描画部分はcanvasらしい。ということで、画像のアンチエイリアスを無効にする設定を内部から強引に行ったというわけ。
vue cli, Netlify, Functionsの初期設定

vue-cliでアプリ作ってGitHubにおいてNetlifyに上げる。Fuctionsも使いたい。そんな備忘録。
環境はWin10上でWSL2（Ubuntu）です。

### Vue CLIのインストール

1. `$ sudo npm install -g --force @vue/cli`
    1. いつのだかわからないvue-cliが入ってたので、--forceで上書き

### メイン画面をNetlifyに上げるまで

2. `$ vue create my-application`
3. `$ cd my-application`
5. ブラウザでGitHubにリポジトリ作成(README.mdの自動生成とかはしなかった。vue cliのと被るし。)
6. `my-application`ディレクトリ直下で以下を実施(GitHubの画面に表示されいる通りに実施。mainブランチにするような手順になってたがmasterのままにした。)
    1. `$ git remote add origin git@github.com:<アカウント名>/<リポジトリ名>.git`
    1. `$ git push -u origin master`
2. ブラウザでNetlifyで`New site from Git`とかそんな感じのボタンから当該リポジトリを追加
    3. Can’t see your repo here? Configure the Netlify app on GitHub.とか書いてあってリンクになってるのでそこから結び付けたいリポジトリを許可する手順も必要。
    4. あとはよしなに
4. 完了的なのがでるので、以下の場所の矢印のとこをクリックするとVueのサンプル画面がでる。ここまででサイトのデプロイはOK。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284915/6954b7ff-bbab-f693-c3f5-4bea27e28291.png)

### 次にFunctionsを設定するまで。

2. コンソールに戻って、`$ cd my-application`
3. `$ vue add netlify-lambda`
8. `package.json`の`browserslist`から`"not dead"`の行を削除。←後述のエラーが出たので。
4. `$ npm run build && npm run serve`
5. ブラウザで`http://localhost:9000/hello`にアクセスするといい感じに見える
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284915/38098ca6-a306-7da7-5c22-41dad7cb0c65.png)
6. コンソールに戻って、serveをCtrl+cで止める
7. `.gitignore`に`/lambda`を加える
8. `netlify.toml`の`command`を`yarn build`から`npm run build`にする←デプロイしたときにyarnがないというエラーになったので(汗
7. `$ git add . && git commit -m "add functions" && git push`
8. ブラウザでNetlifyを確認しデプロイ状況を確認。`https://app.netlify.com/sites/Netlify上のアプリ名/deploys`
9. `published`になったら`https://Netlify上のアプリ名.netlify.app/.netlify/functions/hello`にアクセスしてみる。ローカルでみたハロワ的なメッセージでたら完了、おつかれさんでした。


## よくわからん現象ズ

### ビルドエラー
```
BrowserslistError: [BABEL] /opt/build/repo/src/lambda/hello.js: Unknown browser query `dead` (While processing: "/opt/build/repo/node_modules/babel-preset-env/lib/index.js")
```
ローカルでのビルド時に発生したので`package.json`の`browserslist`から`"not dead"`の行を削除。
それで再実行するとエラーはなくなった。
その後もう一度"not dead"を追加したらエラーでなくなった。
それでpushしたところ、Netlify側でも同様のエラーが出た。（functionsのデプロイが失敗してた）
なのでやっぱり`"not dead"`を削除してpush。
そしたらNetlify側でもビルド成功した。functionsにもアクセスできるようになりました。
google recruit

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# お題

テキストで読み込ませたe(自然対数の底)で連続する10桁の数のうち、最初の素数を求めよ


# 方針

やることはシンプルだ。文字列を読み込ませ、文字列を前から10桁ずつ切り出して素数かどうかを判定していく。


# まず動くやつを作る


## テキストを読み込む

まずは200桁までのeが記述されたテキスト(exp.txt)を作っておいて、それを読み込ませる。

```ruby
def read_exp
  exp1=gets.to_s.chomp
end
exp1 = read_exp()
```

これでexp1に文字列が配列として読み込まれたようだ。試しに

```ruby
puts exp1[0..9]
```

として、配列の0番目から9列目を出力させると

```ruby
> ruby google_recruit.rb exp.txt
> 2.71828182
#+end_src ruby
あ、なるほど、2とかピリオドも配列に入ってるから、それを考慮してプログラムを書いていかないといけないな<br>
ちなみに僕は一つ上のディレクトリにいる状態で実行しようとしたら、ちゃんとexp.txtまでの相対パスを指定したのに「exp.txtなんてありません」とか言われてムカついて作業が3日止まりました。カレントディレクトリ基準で相対パスまで指定したのにそんなことある？と思ったけど謎
#+begin_src ruby
for i in 0..189
  num = exp1[2+i..11+i].to_i
    puts num
  end
end
```

初期値は配列の2～11番目を出力、以降それを190回繰り返して10桁ずつ取り出せる。実際に取り出してみるとちゃんと頭から10桁ずつ出力されてた。とりあえず10桁ずつ切り出すことはできたので、次はこれが素数であるかを判定していく


## 素数を判定する

素数の定義に従って、つまり自分の数字以外で2から順に割っていって、割り切れずに最後まで到達すればそいつが答えだ

```ruby
def prime?(num)
  (2..num-1).each do |i|
    if num % i == 0
      puts i
      return false
    end
  end
  return true
end
```

each doで2から自分-1の数字まで順に割っていき、どこかで割り切れたタイミングがあればそこでfalse=素数じゃない判定を返す。全く割り切れずに終わったらtrueを返す。こういう関数を作っておいて、10桁の数字ごとに呼び出していくという地道な方法を取って、とりあえず動くものを作る

```ruby
for i in 0..189
  num = exp1[2+i..11+i].to_i
  answer = prime?(num)

  if answer == true
    puts num
    break
  end
end
```

基礎的ではあるけど、exp1には文字列が格納されてるので、to\_iを付けて整数にしないとprime?に渡したときに計算できなくて困ったことになる。僕はそれに気づくのに1時間かかって詰まりました。断続的に作業をしないと効率悪いって分かってんのに没頭しちゃうんだよねえ<br>あとはanswerにprime?の戻り値を入れて、それがtrue=素数であるなら表示するというだけ

```ruby
> ruby google_recruit.rb exp.txt 
> 2.71828182
```

どうやら正解が導かれたらしい。<br>しかしこの2行の間には、実はとてつもなく長い時間が含まれている。時間がかかるのは分かってたけど、進行状況を出力しつつ動かしたら15分もかかりやがった。コンピュータの感覚で時間がかかるのかと思ったらマジモンの「時間がかかる」だった。<br>はっきり言って素数かどうかを判断するだけで「終了まで結構時間がかかりますのでその間にお茶でもどうぞ」状態では困る。なので高速化を試みる。


# 素数判定高速化事業

教科書によると高速化をするには。prime?のループの範囲を2..Math::sqrt(n).to\_i+1とすると良いらしい

```ruby
def prime?(num)
  (2..Math::sqrt(num).to_i+1).each do |i|
    if num % i == 0
      return false
    end
  end
  return true
end
```

これだけで今まで15分かかってたのが一瞬で答えが出るようになった。なんでやろなあ<br><br>たとえばnum=400だとしたらループ範囲は2..21となる。従来2..399だったのが平方根を取ることで約1/20になる。同様に<br>

-   100000 : 2..317 -> 約0.3%
-   50000000 : 2..7072 -> 約0.1%
-   3000000000 : 2..54773 -> 約0.002%

という感じで、numが大きくなればなるほど短縮度合いは大きくなる。これによって大幅な高速化が可能になったと考えられる。<br>なお、ループ範囲がnumの平方根まででいい理由は、numはn×mとするとnもしくはmが必ずnumの平方根の切り上げ以下となるため。こういうことじゃないでしょうか？<br>というわけでgoogleは私に内定をください。もしくは給料だけをください。


# 参考記事

-   [Google recruit problem, exp and prime](<https://qiita.com/daddygongon/items/ba94b0f2a73990fc6a07>)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/codes/../google_recruit.org
Russell's paradox formalized in Coq

Russell's paradox についての形式化を行います。この記事においては Russell's paradox とは、以下の命題のことを指します。

```自然言語:Russel's_paradox
任意の集合 x について x ∈ V が成り立つような集合 V は存在しない。
```
この命題の Coq における形式化についての証明を本記事では紹介します。

```Coq:Proof
Axiom classic: forall P:Prop, P \/ ~P.

Axiom Univ: Type.
Definition set := Univ.
Axiom set_in : set -> set -> Prop.
Notation "x \in y" := (set_in x y) (at level 20, no associativity).

Axiom AxExt:
  forall x y: set, (forall z: set, z \in x <-> z \in y) -> x = y.
Axiom Separation_Scheme: (set -> Prop) -> set -> set.
Notation "P \and x" := 
  (Separation_Scheme P x) (at level 15, no associativity).
Axiom AxSS:
  forall (P: set -> Prop) (x: set),
    forall z: set, z \in (P \and x) <-> z \in x /\ P z.

Definition is_small (P: set -> Prop): Prop :=
  exists x: set, forall y: set, (y \in x <-> P y).
Definition full_set (x: set) : Prop := True.
Definition Russell_check (x: set) : Prop :=
  (x \in x) -> False.

Theorem there_is_no_fullset:
  is_small full_set -> False.
Proof.
unfold full_set.
unfold is_small.
intro.
destruct H.

assert (forall y: set, y \in x).
  unfold iff in H. intro.
  specialize (H y). destruct H. apply H0. trivial.
  clear H.

assert (exists z: set, z = Russell_check \and x).
  exists (Russell_check \and x). trivial.
destruct H.

pose proof AxSS as AxSS.
specialize (AxSS Russell_check x). unfold iff in AxSS.
specialize (AxSS x0).
destruct AxSS as (AxSS1 & AxSS2).

assert (x0 \in x0 -> ~ x0 \in x0).
  intro. 
  assert (x0 \in x /\ Russell_check x0).
    apply AxSS1. rewrite <- H. exact H1.
  destruct H2.
  unfold Russell_check in H3.
  unfold not. trivial.

assert (~ x0 \in x0 -> x0 \in x0).
  assert (x0 \in x). apply H0.
  unfold not. intro.
  assert (Russell_check x0). unfold Russell_check. trivial.
    rewrite <- H in AxSS1.
    rewrite <- H in AxSS2.
    clear AxSS1 H1 H3.
  apply AxSS2. split. trivial. trivial.

assert (x0 \in x0 \/ ~ x0 \in x0). apply classic.
destruct H3.
    assert (~ x0 \in x0). apply (H1 H3).
    unfold not in H4. contradiction.
    assert (x0 \in x0). apply (H2 H3).
    unfold not in H3. contradiction.
Qed.
```
`Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?` の対処法

## 環境
- Windows 10 Home
- WSL2 (ubuntu)

## エラー
`docker` コマンドで色々やろうとしたら、

``` 
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

## 解決策
docker を stop させて、start

```
$ sudo service docker stop
$ sudo service docker start
```
SQLをターミナルでいろいろやってみる。初心者編その２

#はじめに
SQLをターミナルで操作する方法を学んだのでアウトプットしていこうと思います。
本当に最初の最初の操作方法のその２です。

今回はSQLデータの追加・編集・削除についてです。

##データを操作するSQL
**・SELECT**	  データの検索
**・INSERT**	  データの登録
**・UPDATE**	  データの更新
**・DELETE**	  データの削除

##SELECT
**データ取得時に使用**

・取得するカラムを指定する

```
mysql> SELECT 《カラム名》 FROM 《テーブル名》
```

・テーブルに登録されている全てのカラムデータの取得

```
mysql> SELECT * FROM 《テーブル名》
```

アスタアリスク　＊　はワイルドカード。全てのパターンにマッチするものという意味を持つ。
今回だと全てのカラムという意味のワイルドカード。

##INSERT
**テーブルにデータを登録する**

・すべてのカラムに値を入れる場合

```
mysql> INSERT INTO 《テーブル名》 VALUES(値1, 値2, 値3);
```

```
（例）
mysql> INSERT INTO goods VALUES(1, "消しゴム", 100);
```

・特定のカラムのみに値を入れる場合

```
mysql> INSERT INTO テーブル名(カラム名1, カラム名2) VALUES(値1, 値2);
```

```
（例）
mysql> INSERT INTO goods(id, name) VALUES(2, "消しゴム");
```

●指定されていないカラムにはNULLが設定される。

**・登録されているデータの確認**

```
mysql> SELECT * FROM 《テーブル名》;
```

##UPDATE
**データの更新**

```
mysql> UPDATE 《テーブル名》 SET 《変更内容》 WHERE 《条件》;
```

```
（例）
mysql> UPDATE goods SET price = 120 WHERE id = 2;
```

##DELETE
**データの削除**

```
mysql> DELETE FROM 《テーブル名》 WHERE 《条件》;
```

```
（例）
mysql> DELETE FROM goods WHERE id = 2;
```
Rails5.2でMaterial Design for Bootstrapを使う

## 何をしたか
Railsの課題を実施しています。装飾に関しては、`Material Design for Bootstrap`を使用することになっていたのですが、WebpackerではないJS系のライブラリの導入が久しぶりで...。
だいぶ忘れていたので手順をメモします。

なお、実行環境は以下の通りです。

- Rails 5.2.3
- Ruby 2.6.4

## Material Design for Bootstrapとは？
Material Design for Bootstrap（以下、MDB）は、[Googleのマテリアルデザイン](https://material.io/design/introduction)に準拠した、Bootstrapのフレームワークです。

[Githubの公式レポジトリ](https://github.com/mdbootstrap/bootstrap-material-design)に、色々便利なリンクがありました:relaxed:

- [ホームページ](https://mdbootstrap.github.io/bootstrap-material-design/)
- [jQuery対応版、Vue.js対応版などのダウンロードリンク](https://mdbootstrap.com/)
- [MDBを利用したテンプレートなど](https://mdbootstrap.com/docs/standard/templates/trending/)

## 導入
MDBは5.0系からは、jQueryを前提としたものではなくなっています。先にもあげた[こちらのダウンロードリンク](https://mdbootstrap.com/)からは、さまざまなJSフレームワークに対応したものが入手可能です。

今回は、MDBの`4.1.1`を利用するので、`jQuery`の導入から始めます。

### jQuery
Rails5.1からは、RailsにjQueryはデフォルトで入っていないので、別途導入する必要があります。

Gemfileに以下のように記載し、、、

```Ruby:Gemfile
gem 'jquery-rails'
```

`bundle install`します。

application.jsには以下のように追記しましょう。(`require turbolinks`は取ってしまっています)

```js:assets/javascripts/application.js
//= require jquery  # 追記
//= require rails-ujs # 追記
//= require activestorage
//= require_tree .
```

### MDB本体の導入
MDB本体はnpmでダウンロードします。[gemもある](https://rubygems.org/gems/bootstrap-material-design/versions/0.2.0?locale=ja)のですが、うまく動かない、とのことでカリキュラムではnpmが推奨されていました。サイトを見る限り、少し古そうですね。。。

```
$ npm install bootstrap-material-design@4.1.1
```

### 必要なファイル類の読み込み
すみません、ここからはお手本コードの写経であまり深く整理できていないのですが、MDBを動かすために必要なcssファイルを読み込みます。

```css:assets/stylesheets/application.scss
@import 'bootstrap-material-design/dist/css/bootstrap-material-design';
```
ここまでで、自分の環境ではCSSと基本的なJSに関するMDBは動作しました。
おそらく、tooltipなど特定のものに関しては、依存するライブラリ`popper.js`なども必要になるはずとは思います＾＾。
まだ、使用する場面はアプリ内にはないので、できたら追記しようかとは思いますが、ここまでで一旦記事はリリースしようと思います。:relaxed:

なにか過不足などありましたら、ご指摘いただければ嬉しいです。
変数って何？？？

![変数の説明２加工後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/909788/ce2ccd00-b440-9d5f-68f4-cdb6f80d6016.png)
変数って何？？？

ここではC#における変数を説明したいと思います。
変数とは、物を入れるための箱だと思ってください。ただ、現実にある箱は入れれる物の大きさは決まってませんが、プログラミングの世界では決まっています。

使い方は、
変数の型　自分で決めた変数名　=　入れたいもの;

です。
たとえば、1という値を入れたい場合は
int number　= 1;
です。

もし、1が値ではなく文字として１と入れたい場合は
char number　= '1';
もし、111と値として使いたい場合は
int number　= 111;
とすればいいのですが、もし値ではなく、文字としてどうすれば良いでしょうか？？
実際に、
char kazu='111';
としてみると、VisualStudioの画面に赤い破線が出ています（小さくて分かりにくいかもしれません）
そこへカーソルを持っていくと、説明が出ます。
説明はCS1012:文字リテラルに文字数が多すぎます。と出ていますね。
これは、文字しか入れれない箱に文字列を入れてしまったので、文字数が多すぎるというエラーでした。
では、文字列はどうするの？？

型名　文字列　　C#で検索してみると
string というものが出てきます。
では使ってみましょう。
今度は、なんのエラーも出ていません。

![変数の説明１加工後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/909788/8ad4d2c8-4638-5030-b85e-0572b7a8cd01.png)

では、上手く表示できるか試してみましょう！！
![変数の説明３実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/909788/17331936-3468-5711-f4bf-2002796b336c.png)

上手くできました！！
![変数の説明のまとめ加工後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/909788/b29cb6e5-2bac-8ab9-5a15-6391817add19.png)


変数の型には他にもたくさんあるので、変数の型名　C#で検索してみてください。
変数の名前は付けるのに迷うこともあると思います。
そこで、下記を参考にしてみてください。
プログラマやシステムエンジニアの為のネーミングサイトで無料で使うことができます。
https://codic.jp/
composer updateでメモリが足りない場合の対策

Laravelで開発をしていて、composerでライブラリを導入したいときにメモリが足りなくて怒られたので備忘録として残します。

# 発生事象

`Allowed memory size of 1610612736 bytes exhausted...`として怒られます。
意味としては、割り当ててあるメモリを使い果たしたよってことです。

```
$ composer require laravel/socialite

Using version ^5.1 for laravel/socialite
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.
```

# 対策
以下のコマンドを実行することで、解消できました。

COMPOSER_MEMORY_LIMIT=-1で、一時的にメモリの制限を解除しています。
`which composer`で、composerのパスを持ってきて渡しています。

```
$ COMPOSER_MEMORY_LIMIT=-1 $(which composer) require laravel/socialite

Using version ^5.1 for laravel/socialite
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/socialite
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
73 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
```

# 参考

composer update でメモリオーバーする場合の対策
https://qiita.com/ucan-lab/items/af39b71c6eb304ddf696
[SwiftUI]UIWindow.rootViewControllerの変更と同等な実装方法

今までUIKitで、`UIWindow.rootViewController`を置き換えたりしたことがありました。
`SwiftUI`ではどのように実装するのか？という疑問があったので、調べました。

## 環境

iOS14以降のSwiftUIライフサイクルを使う場合です。
Xcode12では、プロジェクトを作成する際、Life Cycleとして`SwiftUI App`と`UIKit App Delegate`が選べますが、前者を選んだ場合です。

## rootViewController相当の切り替え方法

以下のように実装します。

```swift
@main
struct LaunchScreenTestApp: App {
    
    @State var index: Int = 0
    
    var body: some Scene {
        WindowGroup {
            if self.index == 0 {
                ContentView(index: self.$index)
            } else {
                SecondView(index: self.$index)
            }
        }
    }
}
```

ポイントは、`WindowGroup`で囲い、`index`でスイッチしているところです。
`ContentView`の中でindexを変える操作を行うことで、`SecondView`に切り替わります。

Xcodeの`View Hierarchy`を使って調べましたが、rootViewController相当の変更になっていました。

## 参考

https://stackoverflow.com/questions/58104813/change-the-root-view-of-uihostingcontroller-in-swiftui
→この方法を使いました

https://qiita.com/Pman5151/items/0c079e2c79f132597ef9
→この方法とは別ですが、参考にしました。
[Jetpack Compose] 1.0.0-alpha09から変わったこと。

## おすすめ

- Android Studio Arctic Fox Canary 2
- https://developer.android.com/studio/preview

前はBetaバージョンを使ってましたが、
最近のバージョンにはCanary Buildに変わって使いましょう。
ComposeのPreviewはAndroud studio　Beta　Buildバージョンでは使わなくなりました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/b08ca87a-108d-106a-d699-93edd743d9d0.png)

## Lib Version 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/a3d3c76a-51fc-f6f3-42ce-5e77b85eb3d2.png)


https://mvnrepository.com/artifact/androidx.compose.ui/ui?repo=google
https://androidx.tech/artifacts/compose.ui/ui-geometry/


## ChangeLog

- 意外と公式サイトのアップデートは遅いですか、alpah07までは載せています。
- https://developer.android.com/jetpack/androidx/releases/compose-ui#version_100_2
 
## Blog- Medium
- https://medium.com/androiddevelopers/jetpack-compose-before-and-after-8b43ba0b7d4f


## 今の時点の意見

- Jetpack Composeを勉強していますけど、やはりUIはFlutterの方が早いし、強いと感じでいます。
セキュリティキャンプ全国大会参加記

# セキュリティキャンプ全国大会オンラインに参加した

## セキュリティキャンプとは
情報処理推進機構が開催している、情報セキュリティの人材育成プログラムである。
詳しくは[公式ページ](https://www.ipa.go.jp/jinzai/camp/index.html)に説明がある。
この中でも、セキュリティ地方大会とセキュリティ全国大会があり、一回地方大会にも参加したことがある。
講師陣が豪華で他参加者もハイレベル。
私も今まで散々参加記を参考にしてきたので、全国大会についての応募についてのことや参加記を書く。

## セキュリティキャンプ全国大会の応募
地方大会も応募課題があるが、難易度や回答量的に、一般的には全国大会の方がハードルが高いと言われている。
ちなみに以下の内容は、全国大会の応募に限らず地方大会についても同様のことが言えると思う。

応募時に評価される点として、技術的なアウトプットや、熱意、応募の明確な動機があると良さそう。
ちなみに私は去年も応募して落ちたのだが、なにもアウトプットがなかったので応募を機にこのQiitaを始めた。
このきっかけには、とても感謝している。
また、応募課題の中には調べながら解く必要があるものも多く(少なくとも私の技術力的には)、応募するだけでもかなりいい勉強になる。
ので、応募しない理由はないだろうというのが私の意見だ。

## 応募課題にどう回答したか
私は今回XトラックのIoTセキュリティコースに応募した。
このコースは、IoT機器を分解したりしてリバースエンジニアリングしてしまおう！というものである。
内容は後述する。

応募課題は、

- リバースエンジニアリングの体験ある？
- リバースエンジニアリングしたいと思っているものは？
- 技術用語の説明をしてね(調べてok)
- ファームウェアの安全なアップデートって何？あと、攻撃手法や事例の説明をしてね
- 本コースへの熱意を書いてね
- アピールしたいこと何でも書いてね

というものである。
ちなみに課題は公開されていたものなので、ここに書いても大丈夫。
むしろ応募を含めた参加のプロセスを書いてね、と講師の方が仰っている。

自分個人の体験談をかなり踏まえて応募しており、文章を晒してもあまり意味がないかと思うので、私が気を付けていたことを記す。

- (これは長期的な準備が必要だし、自ずと発生するものかと思うが)興味がある分野の勉強会に足を運ぶ(今はオンラインな時代なので指でしょうか)
- 上の項目などで得た具体的な体験や感想をもとに、熱意を伝える
- 調べものも一個のwebページだけではなく、せめて複数調べる(図書館とか行けたらベストかも、今年は行けなかったが)
- 当たり前だが、読みやすい文章を心がける

自分の回答内容は以上に尽きる。

## キャンプの内容

例年5日くらいの合宿形式のところ、今年は2カ月ほどのオンライン形式であった。
これについて話すと長くなりそうだが、オンラインとオフラインどっちも良いところがあるよね、みたいな話は誰もがどこかしらで議論している話かと思うので省略する。
全体の講義と、グループワーク、それぞれ専門講義か選択講義のコース、の大きく分けて三種類の授業が受けられる。

私は、

1. XトラックIoTセキュリティコース
2. AWSインシデントレスポンス
3. 事例と法律

の講義を取った。例年、一つ目の専門講座か二つ目以降の選択講義かどちらかのようであるが、今年はオンラインだからか、各コース枠の制限はあったが追加受講が許された。

### IoTセキュリティコース
リバースエンジニアリングはプロダクトの販売者が想定する使用方法ではないため、それによって何か問題を起こしてしまった場合に、その製品を扱っている人たちに迷惑がかかってしまうというリスクを考慮して、詳細を伏せる必要があることは最初に書いておく。

二個くらいのIoT機器を送っていただき(返却の必要はあり)、それを分解したりファームウェアを取り出したりした。
その中で必要になったので、たまたま家に半田ごてやテスターがあったのが幸いだった。
チューターさんには恐ろしいくらいお世話になった。

他の参加者の中に普段からリバースエンジニアリングをしているような人たちがいて、知識量やLT慣れした話し方、分解して分かったことのまとめ方に非常に刺激を受けた。

### AWSインシデントレスポンス
個人的には、インスタンスis何?状態で参加してしまったことがある、AWSセキュリティのイベントのリベンジという感じだった。
講師の方の説明に感動した。わかりやすい。
最も記憶に残っているのは、講師の方のこの言葉である。
「他の脆弱性はフレーバーとして入れました」

### 事例と法律
端的に言うと、裁判官の講師の方にいじめられた。:)(良い意味で)
が、この辛い(?笑)経験はとても記憶に残り、いい経験だった。
また、この講義は法律に詳しくない受講生に向けて丁寧な解説や事前課題を用意してくださり、本当に助かったし、とても理解が深まった。
だが正直に言うと、考えすぎて分からなくなってきて、ダニングクルーガー効果の最下点で講義が終わった感じ。
来年のチューターで自信と理解を向上させていこうかなと思ったり。

## おわり
やっぱりセキュリティキャンプは参加して良かったと思うし、参加できなかったとしても応募課題は解く価値があると思う(去年落ちた私の実体験)。
私も今まで過去の参加者の参加記を参考にしてきたので、これが誰かの参考になれば幸いです。
何か私が書きそびれたことや、ご意見・質問あればコメントください;)
[SwiftUI]ZStackの中央寄せの挙動

`ZStack` の挙動について簡単に調べてみました。

## やりたかったこと

指定の領域内の中心に、画像などの固定サイズのものを中央寄せで表示する時、初めは`HStack`と`VStack`と`Spacer`を使い、中央寄せできることを考えました。

```swift
VStack {
  Spacer()
  HStack {
    Spacer()
    Color.gray.frame(width: 100, height: 100)
    Spacer()
  }.frame(width: 320)
  Spacer()
}.frame(height: 480)
```

これでも中央寄せができましたが、レイアウトが複雑です。
もっと簡単な方法がないかと思い、`ZStack`で中央寄せできないか調べました。

## ZStackで中央寄せ

ZStackを使う方法だと、意外と簡単でした。

```swift
ZStack {
  Color.gray.frame(width: 100, height: 100)
}
.frame(width: 320, height: 300)
```

このコードで、以下のようになりました。

---
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/4c003cd6-5e9c-245d-32b9-14e6d73661c2.png"/>
---

## ZStackのalignment

`ZStack`では、引数としてalignmentを指定できましたが、思っていたものと違いました。

```swift
ZStack(alignment: .leading) {
  Color.gray.frame(width: 100, height: 100)
}
.frame(width: 320, height: 300)
```
とすれば、左寄せになるかと思ったのですが、そうではありませんでした。

この`alignment`がどのように効いてくるかと調べたところ、以下の挙動になっていました。

```swift
ZStack(alignment: .top) {
  Color.gray.frame(width: 100, height: 100)
  Color.black.frame(width: 100, height: 10)            
}
.frame(width: 320, height: 300)
```

このように、指定すると、

---
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/75dc4e18-d5e6-4427-bcdf-b09f2eea4e79.png"/>
---

２つの要素が`top`で揃った上で、ZStackの中央寄せになっていました。



## 参考
https://developer.apple.com/documentation/swiftui/zstack
https://qiita.com/shiz/items/0c41d20a2cb7b0748875
https://note.com/marikooota/n/n3d0054fa0c87
padding-top: ~%とobject-fit: coverで縦長・横長どちらの画像も決まったアスペクト比で切り取る

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="momonoki1990" data-slug-hash="poEdQKq" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="padding-top: ~%とobject-fit:coverの併せ技">
  <span>See the Pen <a href="https://codepen.io/momonoki1990/pen/poEdQKq">
  padding-top: ~%とobject-fit:coverの併せ技</a> by 熊瀬川直也 (<a href="https://codepen.io/momonoki1990">@momonoki1990</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

>object-fit: cover	コンテナーに余白が出ないよう縦横比を維持しつつ、全体を覆うようにフィットさせ縦横中央に配置します。コンテナーからはみ出る部分はトリミングします。
[【CSS】object-fitはCSSだけで画像をコンテナーにフィットさせてトリミングもできるとっても素晴らしいプロパティー](https://webdesignday.jp/inspiration/technique/css/7976/)

→縦長の画像であればアスペクト比を保ったまま枠の横の長さに併せて画像を縮小し、縦のはみ出した部分を切り取り、横長の画像であればその逆のようなイメージでトリミングが行われる

・```width```と```height```を指定しないとトリミングは行われない。
３．Mac入門〜画面編（ディスプレイ設定）

# 前置き
Macbookを初めて使うことになったので、自分の理解をアウトプットするために作成。

## 環境
* macOS Big Sur 11.1
* MacBook Pro (13-inch)
* デュアルディスプレイ用モニタ BenQ GW２４８０

# ディスプレイ設定画面の表示
画面のAppleアイコン⇨「システム環境設定」⇨「ディスプレイ」を選択する。
![システム環境設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222238/1af0755d-2a84-ceab-5bb2-b5686a472fe8.png)

ディスプレイの設定画面
## MacBook Pro (13-inch)の設定
![内蔵Retinaディスプレイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222238/180ebd1f-e8f1-1e45-759b-e62a0b3fc257.png)
解像度や文字の大きさの調整ができる。

## 外部ディスプレイでの設定
接続ディスプレイによって設定画面の表示が異なる。
![BenQ_GW2480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222238/5c7675b2-dfc4-eb72-5aeb-d7aaeabfb801.png)

# デュアルディスプレイ設定
ケーブルでつないでデュアルディスプレイにしたときの位置関係を調整することができる。
2つの画面に同じ内容を表示することができるし、拡張も可能。
2つの画面に同じ内容を表示する場合は、「ディスプレイをミラーリング」にチェックを入れる。
![BenQ_GW2480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222238/2b608b21-94d4-07a4-8a23-96f8291ced58.png)

ディスプレイを拡張したい場合は、外部ディスプレイと内蔵ディスプレイの位置関係を調整する。
ディスプレイの絵の部分をドラッグして位置関係を調整できる。
![BenQ_GW2480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222238/2f9f0ec2-3cd9-e4d7-4881-105abe5953f5.png)
コマンドライン上での $$ はなに？

- コマンドライン上での $$ について

別の人のコマンド操作を見てた際、 `/proc/$$` と打ってらっしゃいました。
$$ ってなに？

- とりあえずechoで出してみる

なんかプロセス番号っぽい

```sh
[root@localhost ~]# echo $$
32499
```

- プロセス一覧から探ってみる

`rootの「-bash」` と出ました。
今、rootで操作してるので自分のプロセスってことになりそう。

```sh
[root@localhost ~]# ps aux | grep $$
root     32499  0.0  0.0 115676  2216 pts/0    Ss   14:21   0:00 -bash
root     32537  0.0  0.0 112824   968 pts/0    S+   14:27   0:00 grep --color=auto 32499
```

- /proc配下を見てみる

/proc配下にディレクトリありましたね。

```
[root@localhost ~]# ll /proc | grep $$
dr-xr-xr-x  9 root    root                  0 12月 26 14:21 32499
```
UIScrollViewのアニメーションを待ってセルを取得する

「UIScrollViewのアニメーションが完了してからセルを取得して処理を実行したい...」という時がある。アニメーションが終わらないと、`cellForRow`がnilを返すのでどうにか待ちたい。そういう場合は以下のdelegateメソッドを利用する。

```swift
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

    // scrollToRowなどのアニメーションメソッドを呼ぶ前に退避した一時変数
    guard let activationIndexPath = self.activationIndexPath else {
        return
    }

    // スクロールのアニメーションが終了する前に処理をてもcellForRowがnilで返って来るので
    // アニメーション終了後のこのdelegateで処理を行う
    let cell = tableView.cellForRow(at: activationIndexPath)
    cell.executeYourTask()
}
```
(UITableViewDelegateはUIScrollViewDelegateを継承しているので、UITableView利用時でも`tableView.delegate = self`としていれば効いてくれる)

アニメーションが必要ない場合は、その場で処理を実行すればよい。

```swift
tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)
let cell = tableView.cellForRow(at: indexPath)
cell.executeYourTask()
```
GASプログラムの開発2020

## 構造
- 基本はSPA（作ろうと思えば複数ページも作れるが、GASの範疇を超えている気がする）
- application.htmlという共通ページレイアウトを作り、<?!= ?>でコンポーネントを埋め込む
- vueやvuetifyのSDKを詰め込んだhtmlファイルを分離しておくと、他GASプログラム作成時にも転用でき便利

### vueコンポーネント
- GASではhtmlとgsしか扱えない（.vueは使えない）
- vue templateを使えば、あたかもvue componentを使っているように作成できる

# サーバーとフロントの設計
GASでアプリ操作時に、スプレッドシートに保存したデータを参照する必要があります。
※通常のvueプログラムならaxiosでサーバーにパラメータやクエリを送ってデータを検索しますが、
APIで社内データを取得できるようにしたらシステム部にしばかれると思う。

## 方法1. フロント側でhtml作成時に、サーバー側から全データを取得する。
### 概要
- created時にサーバー側にデータを要求
- サーバー側では、スプレッドシートの全データをオブジェクトを詰めた配列に変換し返す
- フロント側では返されたデータをvue dataに格納する 

### やめた理由
- 20万以上のデータがあるスプレッドシートのデータを引っ張ってくると、フロント側の呼び出しから、データがフロント側に返されるまで時間がかかる
（10秒程度）
- データ元のスプレッドシートはきれいなデータ形式ではない（タイトルが入っていたり、ヘッドが複数行あったり）
これを整形するスクリプトはサーバー側に書いていたが、メンテナンスが大変（GASプログラムごとに管理する必要がある）

## 方法2. フロント側から検索ワードを送り、検索結果を返す
### 概要
- 検索ワードを詰めたオブジェクトをフロント側からサーバー側に送る
　→サーバー側ではスプレッドシートのデータを全件取得する
　→(サーバー側)取得したデータから検索ワードに当たるデータをフィルタリングして、フロント側に返す
　→フロント側では回答をdataに格納して、vueで表示する
- ページを開けたときにデータをダウンロードする必要がないため、ユーザーはすぐに作業に取りかかれます
- サーバー側とフロント側を分離して開発できるため、開発しやすいです。
（検索ワード→結果表示をサーバー側だけでテストできる）

### やめた理由
- 検索ワードを送るまで、表は空白。最初に一覧をドーンと見せて、絞り込むような検索をしたい。
- パソコンがネットにつながって無い時は何も検索できない。

## 方法3. データをローカルストレージに保存する。
- スプレッドシートのデータをローカルストレージに保存する。
- createdでローカルストレージのデータを引っ張ってきて、オブジェクト形式に変換してvue dataに格納（サーバーにデータ一式をリクエストしない）
　→体感的にはページを開いたら一瞬で画面にデータが表示されます。
- ユーザーは更新ボタンを押したら、スプレッドシートのデータをローカルストレージにダウンロードできる
（月イチくらい。ダウンロードは10秒ほど）

工夫点など
- ローカルストレージに保管できる容量は10MB程度なので、データを小さくする工夫が必要
- 品目だけを載せたテーブル、取引先名だけを載せたテーブルなど、小さいテーブルを複数設けることでデータの重複を防ぐ
- ローカルストレージは文字列でデータを保管する必要がある。JSON形式にするとデータ容量が増えるため、テーブル形式（2次元の配列）で保管する

# より便利にする小技

## スプレッドシートのデータとオブジェクト形式への加工
- getValues()で取得したスプレッドシートのデータは二次元配列
- このままでは扱いにくいので、各行をオブジェクト形式にした一次元配列に変換して使っています。
- mapとreduceを使えば5行で書けます

## google.script.runの非同期処理
- google.script.runは非同期処理なので、サーバー側から返されたパラメーターを使って次のスクリプトを実行するにはwithSuccessHandlerに記述します
- 順番がごちゃごちゃでわかりにくいので、Promiseを返すようにし、async/awaitを使ってスクリプトを書くと読みやすくなる
- 複数のスプレッドシートからデータ取得する時は、Promise.allを使うと並列処理できる

## google.script.runでサーバー側の関数を実行する
- google.script.run.サーバー側関数()
- いちいち書くのが面倒なので、以下のような書き方をしたい
["関数1()","関数2()","関数3()"].forEach(ele=>google.script.run.ele)
- サーバー側でevalを使えば、関数名と引数を文字形式で指定して実行できます
[Python] pytest-mock使い方メモ

# インストール

poetryを使っていれば簡単です。

```console
poetry add -D pytest-mock
```

使っていなくても簡単です。けれど、poetryのほうがおすすめです。

````console:
pip install pytest-mock
```

# テストの書き方

テストメソッドの引数として`mocker`を指定します。

```python
class MyClassTests:
    def test_something(self, mocker):
        pass
```

# モックの作り方

[モック - Mock](https://docs.python.org/ja/3/library/unittest.mock.html#the-mock-class)を作るには、`mocker.Mock`を使ってインスタンスを生成するやり方と、`mocker.patch`を使ってダイナミックにMockインスタンスに置き換えていくやり方があります。

題材として、このようなモジュールがあったとします。

```
exmock
├── __init__.py
├── bar.py
├── foo.py
└── target.py
```


```python:exmock/target.py
from .foo import FooClass
from .bar import BarClass


class TargetClass:
    def do_something(self, foo: FooClass) -> None:
        """ do_foo()の結果をdo_bar()に渡します。 """
        bar = BarClass()
        bar.do_bar(foo.do_foo())
```

## クラスのモックを作る

```python
foo_mock = mocker.Mock(spec=FooClass)
# foo_mock.do_foo もモックになっています。
```

specとしてクラスを指定することで、クラスに実在する属性のみが生えるようにします。
生えてきた属性も`Mock`のインスタンスです。



## コンストラクタの戻り値をモックにする

コンストラクタは値を返さないのです表現としておかしいですが、説明の都合上このようにしています。

```python
bar_mock = mocker.Mock(spec=BarClass)
mocker.patch('exmock.target.BarClass', return_value=bar_mock)
```

テスト対象ファイル**exmock/target.py**にある`from .bar import BarClass`にあわせて、`exmock.target.BarClass`をパッチしています。

## メソッドをモック化する

```python
do_bar_mock = mocker.patch.object(BarClass, 'do_bar')
```

`do_bar`メソッドの実装がモック化し、なにもしなくなります。

`do_bar`メソッドの動作を変更するには、戻り値のモックを使います。

# モックの動作を変更する

生成したモックは、テストにあわせて任意の動きをさせます。

## 戻り値を設定する

生成したモックの`return_value`属性に値をセットします。

```python
mymock.return_value = 戻り値
```

## プロパティの戻り値を設定する

直接値をセットすればOKです。

```python
mymock.foo = 戻り値
```

## 呼び出されたときに例外を発生させる

生成したモックの`side_effect`属性に例外をセットします。

```python
mymock.side_effect = Exception('エラーです')
```

## まるっと置き換える

モック対象の実装をまるっと置き換えます。

```python
def side_effect():
    pass

mymock.side_effect = side_effect
```

# モックのテスト

モックに対して、何らかの操作が行われたことをテストします。

## 1回呼び出されたことをテストする

```python
mymock.assert_called_once()
```

## 複数回呼び出されたことをテストする

```python
# pytestを使っている場合です。
assert mymock.call_count == 回数
```

## まったく呼び出されないことをテストする

```python
mymock.assert_not_called()
```

## 特定引数で呼び出されたことをテストする

```python
mymock.assert_called_with(特定引数1, 特定引数2, ……)
mymock.assert_called_once_with(特定引数1, 特定引数2, ……) # 1回呼び出される場合
```

## 複雑な引数をテストする

```python
args, kwargs = mymock.call_args
# argsやkwargsをテストする
```

`call_args`に、直近の呼び出し引数が入ってます。
`args`は、キーワードなし引数が入っているタプルです。`kwargs`は、キーワード付き引数が入っているディクショナリです。



# 検証環境

この記事を書くにあたって使った環境です。

* Python 3.8.2
* Poetry 1.1.4
* pytest-mock 3.4.0

使ったファイルはこちらに置きました。
https://github.com/sengokyu/python-pytest-mock-usage-example
[仕事納め]2020年にやらかしたミスをまとめる[未経験から2年目]

こんにちは。web系を中心としたプラグラマをしております。
小さなミスからそこそこ大きめのミスまで、今年1年でたくさんのミスをしてきました。
まだ新人で大きな権限を頂いていないこともあり、[本番環境でやらかしてしまった](https://qiita.com/advent-calendar/2020/yarakashi-production)皆様ほどのインパクトあるやらかしはないのですが、コーディングや開発環境構築などであれこれ反省点があるのでまとめていきたいと思います。
アンチパターンやあるあるとしてお楽しみ下さい。

・[コーディング系](#コーディング系)
・[環境系](#環境系)
・[人として](#人として)

#コーディング系
###誤字
とにかく多かったです。
クラス名や関数名ならすぐエラーが発生して見つけやすいのですが、phpで変数名のスペルミスをしたりすると、そのままnullが代入されたりして見つけづらく、時間の無駄になりがちでした。

```php
$address = 'hogehoge';
print $adress; // 返却値なし
```
くだらない誤字ですが、この手の__エラーが出ない誤字__で無駄にした時間も、年間を通せばかなり膨大になって来ます。
解決策としては、__コードを細かく切り分けてこまめにテストを実行__しました。これによって誤字箇所を発見するのが早くなった実感があります。
また、エディタはVSCodeを使用しており__補完機能__は元々使っていたのですが、コード量が多いとなかなか読み込まず__使用を諦めて手入力__することもあったので、今後補完機能をうまく活用できるように工夫していきたいです。
......そんなことより__静的言語__を使った方がいいのかもしれません。

###エスケープ
先日__Laravel__の__selectRaw__メソッドを用いて生に近いSQLを書く機会がありました。WHERE句の対象となるカラムに__バックスラッシュを用いたパス__が入っていて、この部分をエスケープ出来ておらず検索結果が0となる失敗を犯しました。[この質問](https://stackoverrun.com/ja/q/10492715)と大体同じ内容です。

```php
// 失敗例
DB::table('hoge')
    ->selectRaw('* WHERE `path`="PATH\\TO\\SOME\\MODEL"')
    ->get();
```
一見エスケープ出来ていそうですが、[phpではダブルクォート内ではバックスラッシュが `//` → `/`となり](https://www.php.net/manual/ja/regexp.reference.escape.php)、かつ、[Laravelのraw関係のメソッドではエスケープされない](https://readouble.com/laravel/7.x/ja/queries.html)(というかrawって書いてあるのでそりゃそうですね)ので、MySQLに送られるクエリは以下のようになります。

```sql
SELECT * FROM hoge WHERE `path`='PATH\TO\SOME\MODEL' 
```
結果、MySQLでもエスケープされて無事死亡しました。
できるだけこのような生っぽいSQLは書かないのが一番ですが、この時は諸事情で仕方なかったので、以下のようにして解決しました。

```php
// 成功例
DB::table('hoge')
    ->selectRaw('* WHERE `path`="PATH\\\\TO\\\\SOME\\\\MODEL"')
    ->get();
```
```sql
SELECT * FROM hoge WHERE `path`='PATH\\TO\\SOME\\MODEL' 
```
ともかく、何かとバックスラッシュは問題のタネになりやすいので警戒していきたいと思います。


#環境系
###Dockerコンテナの内か外か
Dockerを立ち上げてシェル作業する時、必要なコマンドをコンテナの内側で行うのか外側で行うのかを間違えて `command not found` になったり、最悪の場合想定外の処理が始まったりします(しました)。
基本的にどのコマンドをどこで実行するのかはプロジェクトによるので、実行前に確認するようになりました。特に__composer__の実行場所で事故ったので気をつけていきたいと思います。

###バージョン違い
composerで依存パッケージをインストールすることが多いのですが、マイナーバージョンは指定しておらず不具合が発生する場合があります。
また、私が今年特に詰まったのは__composer自体のバージョン違い__です。
2020年10月頃にcomposerのバージョン2.0がリリースされました。これに気づかず`docker-compose`コマンドを実行してしまった結果、DockerFile内にcomposer関係の諸々のコマンドが実行されてしまい、大量のエラーが発生しました。
この件の解決策は、[こちらの方](https://zenn.dev/meijin/articles/09f5a7f70db286cf792d)と同じ方法を使いました。
コマンドは以下のものです。

```shell
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --1 --filename=composer
```
バージョンアップの詳細は[こちら](https://blog.packagist.com/composer-2-0-is-now-available/)です。
　　　　　　　　 
#人として
###連絡が遅い
思い出すと胃が痛くなります.......
進捗が悪いのに、頑張って挽回しようと試行錯誤していて締め切りギリギリまで上司への進捗が遅れている旨の連絡をしませんでした。上司からは特に怒られず、淡々と「了解です。次は早めに連絡・相談して下さい」という内容のメッセージが返ってきて逆に怖かったです。
とにかく、早めの報告・連絡・相談は本当に大切です。技術的なミスより何より連絡不足が一番信用を失うと思いました。

###仕様通りでない
仕様変更が頻繁でも、仕様書が読みづらくても、__決定した仕様が一意である以上__、仕様通りでないのは絶対にダメですよね。
__コミット前にもう一度__、成果物のチェックを怠らない。大事だと思います。
あと、最初に仕様書を通しで読んだ時に矛盾点を見つけられるようになりたいです。実装を始めてから気づくことが多いので.......

#まとめ
結局、ほとんどのミスが確認不足に起因していました。
コミット前、コマンド入力前、上司への報告前......この記事を振り返ってミスを減らしていきたいと思います。
というわけで、皆様1年間お疲れ様でした。2021年も頑張っていきましょう！！
Rails開発の変遷2020


# 概要
- webサイトの作成はRailsを使ってきた。
- 今年はHTML、CSSを学び、UIを作るようになった。
- vue/nuxtを学んでから、開発の仕方が変わった

# Webpack
- Rails本来のview作成はerb形式。slimで書くのが普通らしい
- Rails 5.2からWebpackをサポートし、vueを使ってHTMLを作成できるようになった。知らんけど。
- viewsにはjavascriptを参照する記述のみ。実際の中身はjavascriptディレクトリに作成する

## やり方
- Qiitaにわかりやすいチュートリアルがあるので、それを参考にするのが良い。
- vue側はvue CLIを使ったほうが開発が捗る。vue CLIである程度完成させてから、railsのjavascriptにコピペするような方法で作成した。

## 欠点
- 何も設定せずに開発すると、vueを更新した後にrails sを立ち上げなおす必要がある。
- vue-routerを使っていると、ホットリロードした時にルーティングエラーがでてしまう。

# サーバー側とフロント側を分離して開発
- railsはサーバーサイドのみに特化し、フロントはvueで作成する。
- サーバーとフロントの切り分け設計ができるようになった。（APIを意識する）
- エラーを見つけやすくなり、開発効率アップした
- DBはfirebaseに移行（それまではpostgreSQLを使っていた）


# 今年使い方を学んだgem

## Rails
### active admin
- 管理者画面を作成できる
- Railsではデータを作成する時に、コンソールやseedでデータ作成できるが、active adminを使えば画面上で編集できる
- UIはhtmlテンプレートではない形式で作成されている。そのため、管理者画面にマップとか入れたいと思っても実際無理。
- firebase storageを使うようになってから使わなくなった。

### devise
- Railsでログイン機能を作るにあたってのデファクトスタンダード
- session云々やpassword暗号化を良しなに実装してくれる（便利過ぎてsession云々を忘れるくらい）
- バックとフロントを切り分けて開発するようになってから、ヘルパーメソッドを使えなくなった。
- firebase authを使うようになって不要になった。

### active record
- Railsで画像をアップしたりする時に使うgem
- erbでviewを作成するなら、恩恵を存分に受けられる。（controllerだけでURLから画像を取得することもできる）
- active recordは本来の使い方をすれば便利だろうと思う反面、本来の使い方以外がしにくい（どこで何がどう動いているのか把握しにくい）
- 画像ファイルのアップロードなら、carrierwaveのほうがどこで何を処理しているのかがわかりやすい

### miniMagic
- Railsで画像を加工・編集するためのgem
- 参考文献が多くないため、最低限の使い方しかわからない
- 処理に時間がかかる。LINE Messangerで使おうとしたが、処理スピードが遅く、まともに使えなかった。
- 画像編集はjavascriptで行い、firestorageに画像ファイルを保存するような設計にしたため、サーバー側で画像を作成してフロント側に送るようなことがなくなった。

## 今後について
- RailsでAPIモードで開発するなら、Railsである必要性はないかな、、、
- node.jsでのexpressかpythonでのfastAPIを検討中
- とはいえ、rubyは好きな言語であるのでrubyとrailsを使うメリットがあるなら、使っていきたい。
- railsの活用法があれば教えてください。d
パラメーターが配列の場合、ストパラのparams.permitに含める方法

# パラメーターが配列の場合、ストパラのparams.permitに含める方法

# 状況
1つのusersテーブルに対して、同時に複数のレコードを作成するために下記のようなパラメーターを送りました。

```.rb
 Parameters: {"users"=>[{"name"}=>{"satoshi"}, {"name"}=>{"yuta"}]}
```

## 受けるストパラは下記

```.rb
private

def users_params
  params.require(:users).permit(
      :id,
      :name
  )
end
```

# 発生したエラー
requireした後にpermitメソッドを使うと、
「**permit？そんなメソッドは知らんよ**」と言われてしまいました。

```.js
[1] pry(#<UsersController>)> params.require(:users).permit
NoMethodError: undefined method `permit'
for #<Array:0x00007f2024a3ee40>from (pry):62:in `users_params'
```
(binding.pryの結果を出力しています)

# 理由
 params.require(:publisheds)は**Arrayクラスだから、permitメソッドが使えない。**

```.js
[2] pry(#<UsersController>)> params.require(:users).class
=> Array
[3] pry(#<UsersController>)> params.require(:users).respond_to?("permit")
=> false
```

## 情報：配列番号を指定するとpermitが通る

```.js
[4] pry(#<UsersController>)> params.require(:users)[0].respond_to?("permit")
=> true

[5] pry(#<UsersController>)> params.require(:users)[0].permit(:name)
=> <ActionController::Parameters {"name"=>"satoshi"} permitted: true>
```
配列（Array）で来てるなら、1個ずつ取り出せばいいんじゃね？って思いました。

# 解決法
mapで回して、配列をばらしてpermitして返す


```.rb
private

def users_params
  params.require(:users).map do |user|
    user.permit(
      :id,
      :name
    )
  end
end
```

## mapが使えた理由
ブロックを評価して配列を戻り値として持つ＝rubyの仕様は、最後に評価した値を暗黙的に返す(returnする)から。

## eachが使えないのはなぜ？
配列を回して引数を取るけど、その中でpermitをしても値を返さないから？
permitメソッド自体が、値の変更（代入）ではなく、許可だから少し挙動が違う？

細かな違いが難しい。。。
rubyマスターの方がいらっしゃいましたら質問させてほしいです。

# 参考：るりまのリンク

eachの仕様
https://docs.ruby-lang.org/ja/latest/method/Array/i/each.html

mapの仕様
https://docs.ruby-lang.org/ja/latest/class/Array.html#I_COLLECT
Platformio for VSCodeとCmake Toolsを両方使うときにCmake Toolsに怒られたときの謝り方

CMakeを未インストール状態でPlatformioによってインストールされるパッケージ中のCMakeを使っている場合，VSCodeからExtensionであるCMake Toolsというもののインストールが促される．
正直あんまり使わないが，とりあえず入れてみたらなんか小言を言われた．
ビルド等には特に問題がないのだけど，ずっと表示されるので謝り方を検索したがドンピシャなのが見つけられなかった．

たぶんそもそもCMake Toolsを入れなきゃいい問題のような気もする．

CMakeも自分で入れたりしてPATHが通っていればそれでいいのだろうけど，WSLじゃないWin10にCMakeをわざわざ入れたくなく，PATHもいじりたくなく，じゃあWSLのCMakeを指定すればいいじゃんと思ったけどPlatformIOが相変わらずRemote-WSLに対応していない．

そこでCMakeのにわか知識でちょっと設定いじったら許してもらえたので，その方法を共有する．


# 環境
```
Version: 1.52.1 (user setup)
Commit: ea3859d4ba2f3e577a159bc91e3074c5d85c0523
Date: 2020-12-16T16:34:46.910Z
Electron: 9.3.5
Chrome: 83.0.4103.122
Node.js: 12.14.1
V8: 8.3.110.13-electron.0
OS: Windows_NT x64 10.0.19042
```

インストールしているもの：

- VSCode
- VSCode のツール
  - Platformio for VSCode
  - CMake Tools
- PlatformioでESP32 IDFのプロジェクトを作ると`%USERPROFILE%\.platformio\packages\`以下にCMake関連の実行ファイルもインストールされる
  - `tool-cmake\bin\cmake.exe`
  - `tool-ninja\ninja.exe`

他にもインストールされているが，必要な情報は多分こんなところ．

# 問題
これだけの状態でVSCodeのExtensionからの通知欄にCMake toolsからの以下のエラーがくることがある．
これはCMake ToolsのDefault設定としてCMakeの実行ファイルのある場所のPATHが通ってる前提で`cmake`とコマンドしか記述されてないが，
CMakeをインストール，またはインストール場所にPATHを通していないため生じる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/2a35fdb3-53f2-e99d-ef4a-6b2390566172.png)

`実行可能ファイル""が正しくありません。インストールされていることと、設定に正しいパス(cmake.cmakePath)が含まれていることをご確認ください`

これの解決として，VSCodeのCMake ToolsのExtensionのSettings上で上記の`cmake`と`ninja`を指定すると消えてくれる．
後々Win10に自分でCMakeとか入れたりとかWSLでCMakeいれたりするという事を考えると，
User設定として設定するよりも，Workspace設定として設定したらいいかもしれない．

ちなみに`cmake`だけ解決しても今度はジェネレータが云々と小言を言われる．
このジェネレータというものが今回の場合`ninja`なのでこれも設定必要．

# 設定方法
以下のいずれかの方法で設定し，VSCodeを再起動する．以下の例ではいずれもWorkspaceで設定している．

## CMake ToolsのExtension Settingsで設定する方法: 
1. `Disable` `Uninstall`などのボタンの隣にある歯車マーク>Extension Settings
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/97fbd23d-8794-60eb-baff-5b8bf128ee4b.png)

2. 以下のように`Cmake Path`と`Generator`を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/08520b51-df15-d205-e158-6fe2480e1560.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265603/619f4cc6-9b63-83f7-592d-6161f0460df0.png)


## `settings.json`で設定する方法: 
上記の方法でやれば勝手に`setteings.json`に以下のような記述が生成される．自分で書いてもよい．
`%USERPROFILE%`使って指定しようと思ったけどそれだと怒られた．

```json:settings.json
{
    "cmake.cmakePath": "C:/Users/<USERNAME>/.platformio/packages/tool-cmake/bin/cmake.exe",
    "cmake.generator": "C:/Users/<USERNAME>/.platformio/packages/tool-ninja/ninja.exe"
}
```
Ubuntu Core で chromium-mir-kiosk を動かす

# 環境
Raspberry Pi 2 Model B
Ubuntu Core 18

# 方法

「mir-kiosk」をインストール

```
$ snap install mir-kiosk
```

mir-kiosk上で動くchromiumをインストール

```
$ snap install --beta chromium-mir-kiosk
```

任意のWebサイトを起動時に表示させるには、

```
$ snap set chromium-mir-kiosk url="https://yoururl.com"
```

以上で、ディスプレイ上にkioskモードでブラウザが立ち上がります。

# 問題
* 日本語が化ける（aptが使えないため、解決方法が分からない）
* 時々アプリが再起動する。（動画を見てると、初期URLへ戻ってしまう）

# 参考
https://discourse.ubuntu.com/t/install-mir-kiosk-and-chromium-mir-kiosk-under-ubuntu-18-04-server/13108
Windows 10をUSBメモリなどに手動でインストールする方法

# まえがき
かなり前の話になりますが、株式会社アーク情報システムということろが「BOOT革命/USB」という製品を作っていました。
この製品は、WindowsをUSBに入れる事ができることを売りにしていたソフトで、私は全く使いませんでしたが一応持ってはいました。
今回、SSDの代わりに低容量のUSBメモリを臨時で使いたいという問い合わせがあり、私なりに方法を探ったのでメモとして残します。

# 注意
この記事で紹介する動作について、一切の責任を負いませんので予めご了承ください。
もし、この記事を参考にし作業する際は、自己責任でお願いします。

# 検証環境
- Windows 10 Home x64 (ビルド不明)
- VMWare Workstation 16 Player

# 手順
## パーティションの設定
Windows 10の場合、基本的にパーティションは3つ生成されます。
しかし、1つは回復領域であるため無視し、EFI用とシステム用の2つのみで構成しようと思います。

パーティションは以下のようになります。
1. 200MB-500MB程度 FAT32 Active
2. 残りの容量 NTFS

設定方法は解説しませんがActiveにする方法として、`diskpart`でパーティションを選択し`active`コマンドを打つ方法があります。

設定する上で2つのパーティションにドライブレターが割り当てられている必要があります。ここから先の手順では、上からそれぞれ`E:`と`F:`が割り当てられているとします。

## イメージの展開
一般のキッティングにも使われているであろう`Dism`を使います。事前にWindows 10のインストールメディア内の`sources/install.esd`を抽出してください。
此処から先の工程では、作業ディレクトリ内に抽出した`install.esd`が存在し、アクセス権がある状態を想定し記載します。

### イメージIDを調べる
管理者権限のPowerShellもしくはコマンドプロンプトで次のコマンドを入力します。

```plaintext:PowerShell（管理者）
> Dism /Get-WimInfo /WimFile:install.esd
```

希望するエディションのインデックスを覚えておいてください。
此処から先では、`Windows 10 Home（インデックス: 1）`をインストールする前提で記載していきます。

### イメージを展開する
イメージを展開します。`/Index:`と`/ApplyDir:`は各自の環境に応じて変更してください。

```plaintext:PowerShell（管理者）
> Dism /Apply-Image /ImageFile:install.esd /Index:1 /ApplyDir:F:\
```

### ブートローダーの設定
`bcdboot`を使用し、ブートローダーを設定します。各自で`E:\Windows`、`/l ja-JP`、`/s E:`については読み替えてください。
また、`/l ja-JP`はなくても動くはずです。

```plaintext:PowerShell（管理者）
> bcdboot F:\Windows /l ja-JP /s E: /f ALL
```

### 設定（OOBE）
あとはUSBメモリからブートし、普通に設定をしていくだけです。

# 参考
- [Windows To Goを作る: おはのおはなし](http://ohaohaoha.cocolog-nifty.com/blog/2015/08/windows-to-go-f.html)
- [BCDBoot のコマンド ライン オプション | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/bcdboot-command-line-options-techref-di)
はじめまして。

　思い切って、記事を初めて書いてみます。

　自己紹介にも記していますが、現在は公務員として勤務している者です。
　業務を通じてシステム開発等に興味を持ち、こちらの業界に転職したいと考え、勉強を始めました。
　
　自分なりに調べて検討し、現在はRubyの初歩的な参考書を購入。まずはこれを一周してみようかな。
　その他にも、基礎的な知識として基本情報技術者試験の参考書は既に何周か読んでいます。業務多忙で試験自体はなかなか受けられていないのですが、目標は4月に受験し合格することですかね。
　
　現在はそんなところです。
　転職を考え始めて何冊か書籍も目を通しましたが、自分が学んだことをQiitaやTwitter等でアウトプットしている、という記載を見かけ、「文字を書くのが好きな私にとってこれは１つの目標になる！」と思い、記事を書くことに決めました。
　繁忙期もそろそろ峠を越えてくるので、目標はまず月に２本ということにします！



　こうして書いてみると、やっぱり今は何も有益な情報を提供できないものですね……。
　きちんと勉強をしていって、皆様と同じように有益なことを記して、誰かのお役に立てるようになればいいなと、ぼんやり考えています。


　私と同じように転職活動中の方がいらっしゃったら、是非繋がりたいです。
　また、諸先輩方、何かアドバイス等ありましたら、色々と御指導御鞭撻いただければ幸いです。


　自分のペースでがんばります！よろしくお願いします！
SQLをターミナルでいろいろやってみる。初心者編

# はじめに

SQLをターミナルで操作する方法を学んだのでアウトプットしていこうと思います。
本当に最初の最初の操作方法です。

##MySQLに接続
% mysql -u root

##CREATEでデータベースを作成
mysql> CREATE DATABASE 《データベース名》;
※SQL文の終わりには必ずセミコロンをつけること！

##テーブル一覧の表示
mysql> SHOW DATABASES;

##データベースの削除
mysql> DROP DATABASE 《データベース名》;

##操作するデータベースの選択
mysql> USE 《database名》;
(「どのデータベースにあるテーブルか」を選択)

##テーブルの作成
mysql> CREATE TABLE テーブル名 (カラム名1 カラム名1の型, カラム名2 カラム名2の型, …);
			**【カラム名の型（MySQLにおける）】**
			INT					：数字
			VARCHAR(M)	：最大M文字の文字列	
		（例）
		商品idを数値で保存するidカラムと、商品名を文字列で保存するnameカラムの作成
		mysql> CREATE TABLE goods (id INT, name VARCHAR(255));
		
##作成したテーブルの表示
mysql> SHOW TABLES;

##テーブルの構造の表示(追加したカラムの確認)
mysql> SHOW columns FROM 《テーブル名》;

##対象テーブルの指定
mysql> FROM 《テーブル名》

##カラム情報の更新
mysql> ALTER TABLE 《テーブル名》 操作

##カラムを1つだけ追加
mysql> ALTER TABLE テーブル名 ADD カラム名 カラムの型;

##カラムを複数追加
mysql> ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);

##カラムの変更
mysql> ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
　　　例)
          "goods"テーブルの "zaiko"というカラム名から"stockというカラム名へ変更
           mysql> ALTER TABLE goods CHANGE zaiko stock int;

##カラムの削除
mysql> ALTER TABLE テーブル名 DROP カラム名;