OmniAICreator/Qiita-1.07M huggingface dataset:
iPhoneアプリ学習：ストップウォッチ

#はじめに
某プログラミング学習サイトでの学習記録を記します。

#共通操作
・Ctrl + I：インデント修正

#01：割愛

#02：部品配置
・複数の部品にまとめて制約を付ける場合は、
　・対象となる部品を全て選ぶ
　・Embed InからStack Viewに登録する
　・View Controller Scene > View Controller > View > Stack Viewを選択する
　・位置の制約を付ける

#03：部品をコードに接続する
・時間表示用のラベル
・ボタン3つ(Start,Stop, Reset)

#04：ボタン押下でタイマーを開始する
@IBAction func (ボタン名) (_ sendor:Any) {
　Timer.scheduledTimer(
　　timeInterval: 0.01, // 実行間隔[秒]
　　target: self, // タイマーで実行するメソッドのある場所
　　selector: #selector(self.update), // 実行するメソッド名
　　userinfo:nil, // selectorに渡す情報。なければnil
　　repeats:true) // 繰り返し実行するかどうか

　// selectorはobjective-cの仕様のため先頭に@objcが必要らしい
 @objc func update() {
　　print(Date.timeIntervalSinceReferenceDate);
　　// 2001年からの経過秒数を取得
 　}

#05：経過秒数の算出
・開始時刻の変数定義
　var startTime:TimeInterval? = nil;
・startボタン押下時に開始時刻を取得
　@IBAction func startTimer(_ sender:Any) {
　　self.startTime = Date.timeIntervalSinceRefernceDate // 開始時刻
　　Timer.ShceduledTimer(略)
　　// 後略
}

・経過時間を取得
@objc func update() {
　if let startTime = self.startTime {
　　// 経過時刻を取得
　　let t:Doublee = Date.timeIntervalSinceReferenceDate - startTime
　}
}

#06：経過秒数のラベル表示
・文字列返還
　String(format:[C言語と同じ書式指定], [変数をコンマ区切り])
(例)
　String(format:"%02d:%02d", min, sec)

#07：ストップウォッチのStopとReset
・タイマーを停止するには、起動時のTimerオブジェクトが必要になる
・タイマー変数の生成
　var timer = Timer()
・起動時の戻り値を取得
　self.timer = Timer.scheduledTimer() // 既存の起動関数の戻り値を取得

・Stop時の動作
　self.timer.invalidate() タイマー停止

・Reset時の動作
　self.startTime = nil
　self.timerLabel.text = "00:00:00"

#08：Stop後の再開
・Stop後にStartしたとき、Stop時の時間から再開する
　変数としてelapsedTime(double)を宣言
・Stop時の時刻を取得する
　if let strtTime = self.startTime { // 開始時刻を取得済であれば
　　　self.elapsedTime += Date.timeIntervalSinceReferenceDate - startTime　// 経過時刻を取得する
　}

・経過時刻の取得関数を修正(経過時刻を加算)
　let t = Date.timeIntervalSinceReferenceDate - startTime + self.elapsedTime
　　
#09：ボタンの有効/無効を切換える
・Startボタン押下　start:無効、stop：有効、Reset：無効
・Stop ボタン押下　start:有効、stop：無効、Reset：有効
・Resetボタン押下　start:有効、stop：無効、Reset：無効

・self.(ボタン名).enabled = true / falseを切換える関数を作成する
・関数を、各タイミングで呼び出す
初心者によるプログラミング学習ログ 363日目

#100日チャレンジの363日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
363日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●寝る直前の筋トレ5分、kindle読書 10分<br>●ブログ記事1記事作成<br>●プログラミング学習363日目 1h<br>・ソースツリー導入（git）<br><br>今までgitあんまり使ってなかった<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%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1280230844305571841?ref_src=twsrc%5Etfw">July 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Rails】複数のDB処理をまとめる transaction を実装してみた

# はじめに
Rails でアプリを開発していて、複数テーブルのデータを同時に作成する、という処理を実装していた。
その処理において、どちらかの処理が失敗した場合に双方の処理をなかったことにする transaction という概念があることを知ったので備忘録兼アウトプットとして、 transaction についておよび、実装した内容について書く。

# transaction とは
「transaction」という言葉の定義を調べると
【処理、取り扱い、処置、業務、取引、売買、会報、紀要、議事録】 このように出てくる。

ITやプログラミングにおいては
「複数の処理を一つにまとめた分割不可能なもの」

と定義づけることが出来そうです。

こちらの記事がトランザクションの概念について非常にわかりやすいくまとめられており、参考にさせていただきました。

[「トランザクション」とは何か？を超わかりやすく語ってみた！](https://qiita.com/zd6ir7/items/6568b6c3efc5d6a13865)

# transaction メソッド使い方
- 複数の処理を一つのまとまった処理として扱う
- 一つでも処理に失敗した場合は、トランザクション全体として失敗となる
- 失敗した場合は、全ての処理がなかったこととなる

基本的な構文としてはこうなる

```ruby

モデル.transaction do
  # テーブルへのアクセス処理
  # テーブルへのアクセス処理
end
  # トランザクション処理が成功した場合の処理
rescue => e
  # トランザクション処理が失敗した場合の処理
```
注意点としては「処理失敗時には例外を発生させるメソッドを使用する」こと。

トランザクションは、含まれる処理のいずれか1つでも失敗すると、トランザクション内のすべての処理をなかったことにするが、そのなかったことにする条件が「例外の発生」となる。

では実際に実装してみる。

# 実装
今回開発していたアプリにはユーザーのグループ化機能があった。
そこで、グループを新規作成するときにグループ作成をしたユーザーは自動的にグループに所属するユーザーとなる、という仕様を想定。
そこでグループ作成をした際に、思わぬ動作が起きてしまうことを避けるためにトランザクションの利用を検討。

テーブル構造はこのようになっている。
<img width="979" alt="スクリーンショット 2020-07-07 19.57.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/a2f5e937-cb09-b264-e685-24ed91df58b0.png">

groupsテーブルインスタンスを作成すると同時に、ログインユーザーのidをuser_idカラムとする group_usersテーブル（usersテーブルとgroupsテーブルの中間テーブル）が作成されるようにしたかった。

1. groupsテーブルインスタンスの作成
2. group_usersテーブルインスタンスの作成

この 1, 2 のうちどちらかの処理が何らかの理由により失敗した場合、双方の処理がなかったこととなるように groups コントローラの create アクションで transaction を活用する。

```groups_controller.rb
# createアクション部分を抜粋
# 変数current_userにはログインユーザーのインスタンスが格納

  def create
    @group = Group.new(group_params)

    # トランザクションを適用(グループの作成と中間テーブルを同時作成)
    # save! と create! と「!」がついている点に注意！
    @group.transaction do
      @group.save!
      current_user.group_users.create!(group_id: @group.id, permission: true)
    end
    # トランザクション成功時の処理
      flash[:success] = '新しいグループを作成しました'
      redirect_to @group
    rescue => e
    # トランザクション失敗時の処理
      flash.now[:danger] = 'グループ作成に失敗しました'
      render :new
  end

```

この transaction 内での処理には両方とも「！」がついており、テーブルデータ作成失敗時には例外が発生するメソッドを使っていることに注意！

 
    
仮に transaction を利用せずに以下ように実装した場合は、何らかの理由で group_usersテーブルの作成が失敗した場合に無人のグループが作成されてしまう懸念がある。 

```groups_controller.rb

# transactionを利用しない場合

def create
  @group = Group.new(group_params)

  if @group.save
    current_user.group_users.create(group_id: @group.id, permission: true)
    flash[:success] = '新しいグループを作成しました'
    redirect_to @group
  else
    flash.now[:danger] = 'グループ作成に失敗しました'
    render :new: 
  end
end
```
# 最後に
記事を読んでいただきありがとうございます！
今回調べながら何とか実装してみたのですが、正直トランザクションについての理解はそこまで深くないです。誤りやより良い記述方法などがあれば、気軽にコメント等いただければ幸いです。
下記の記事、参考にさせていただきました。ありがとうございました。

- https://web-camp.io/magazine/archives/18310
- https://www.sejuku.net/blog/27240
エクセル　オートフィルで連続データができない

初歩的なことかもしれませんが躓いた＆検索で出なかったので共有します。

結論：データにフィルターかけてるとオートフィル使えなかった

請求書データ作成中、項番を振ろうと1,2行目に1,2を入れてセル右下角に
カーソルを合わせて＋マークになったところでクリック。
下にずらしていくと通常は1,2,3,4,5と連番になるはずが
全て1になってしまった。

googleで検索したところ下記のサイトを参照した。
https://blog-tips.sekenkodqx.jp/2019/10/09/excel-can-not-autofill/

しかしどれにも当てはまらず、使用中のエクセルは2006なので
SEQUENCE関数も使えない。

仕方なく手打ちしようと思ったところ、フィルターをかけていることに気が付く。
これを解除すると解決。
VSCode LiveShareをブラウザから実行する方法

[VSCode LiveShare](https://docs.microsoft.com/ja-jp/visualstudio/liveshare/) 機能にPreview版でブラウザでのlive shareが可能になりました!!

その手順をまとめたいと思います。

## 参考にしたサイト

* [Microsoft 公式ブログ](https://docs.microsoft.com/ja-jp/visualstudio/liveshare/quickstart/browser-join)

## 環境

* MaxOSX
* Chrome

## 注意事項

* Preview版なので変わる可能性があります

## 事前準備

* [VisalStudioCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)がInstallされていること
  * 共有をする側(Hostは必要で共有される側は必要ありません)

## やり方

### 0. LiveShare Extension Packをインストールする

[Live Share Extension Pack](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare-pack)
をインストールして下さい

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5564/c16c3393-5545-9ae7-77a9-f59de3d3c57b.png)


### 1. Visal Studio Codeで共有したいprojectを開く

ファイル > ワークスペースを開く

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5564/41569823-4c2d-dd81-4b13-b02e02a91d30.png)

### 2. コラボレーションリンクをコピーする

コラボレーションリンクをコピーした後にzoomなりSlackなりにコラボレーションリンクを貼り付けてVSCodeで共同作業をしたい人にURLを共有してください。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5564/a089fb64-72bf-24f9-8936-560340b2f5ed.png)


### 3. コラボレーションリンクからブラウザ用のリンクを押す

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5564/48a85884-6980-070e-c78d-9c616445b27f.png)

### 4. ブラウザからVSCode LiveShareが開けていることを確認する

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5564/1215aaa2-c8e2-9f5c-ec9c-c3e6590fcc72.png)


### 最後に

ブラウザでVSCodeが開けるなんて便利な世の中になりましたね。本当に。。。
EC2 (AmazonLinux2) の立ち上げ、PHP7.4, composerのインストール, vimの整備

# EC2インスタンス作成
AMIをAmazonLinux2にしてインスタンス作成
AWSコンソールでGUI的な操作でぽちぽち

# yum update
```shell
sudo yum update
```

# PHP7.4, composerのインストール
## remiを入れる
```shell
sudo amazon-linux-extras install epel
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```
## install PHP7.4, composer
```shell
sudo yum install php74 php74-php composer php74-php-simplexml php74-php-mbstring
# ついでに必要そうないくつかのPHP拡張も同時にインストール
```
## デフォルトのPHPをインストールしたPHP74で置き換え
```
sudo mv /usr/bin/php /tmp/php54
sudo ln -s /usr/bin/php74 /usr/bin/php
```


## スワップ領域作成 (composer require が成功するために)
```shell
# サイズはcountの値で調整する
sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo chmod 600 /var/swap.1
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1
```
https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors

# vimの設定
（インストール自体は最初からされている）

## install Git
```shell
sudo yum install git
```

## NeoBundle入れる
```shell
git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

## NeoBundle向けに、~/.vimrcに追記する
```vim
"NeoBundle Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath^=~/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('~/.vim/bundle'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'

" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }
NeoBundle 'editorconfig/editorconfig-vim'

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck

"End NeoBundle Scripts-------------------------
```

## ~/.editorconfig
適当に設定

```conf
[*.php]
indent_style   = space
indent_size    = 4
```

# あとがき
最初からPHPがインストールされてる、良い感じのAMIから始めれば良かった
JavaScriptでクラスとインスタンスを作成

#はじめに
JavaScriptでクラスとインスタンスについて復習しました。

#クラスとインスタンス
前回オブジェクトとクラスとインスタンスの概念について勉強しました。
そこで今回はJavaScriptでクラスとインスタンスを用いると、どのような形で実装できるのかを確認していきます。

```index.js
// Slimeクラスの作成
class Slime {
  // コンストラクタ
  constructor(color, level){
    this.color = color;
    this.level = level;
  }
}

// Slimeインスタンスを生成
const slimeA = new Slime('blue', 5);
const slimeB = new Slime('red', 50);

// 出力結果をconsole.logで確認
console.log('slimeA : ', slimeA.color); // blue
console.log('slimeA : ', slimeA.level); // 5

console.log('slimeB : ', slimeB.color); // red
console.log('slimeB : ', slimeB.level); // 50
```

#感想
今日はクラスとインスタンスの基礎的な部分について勉強しましたが、フレームワークで応用できるようにできればと思います。
明日も頑張ります。
SASテクニック マクロ変数のリセット

# SASのマクロ変数を一括削除する方法

sashelp.VMACROにマクロ変数の名前や中身が入っている
名前を取ってきて、symdelで削除する

```sas
%* VMACROからグローバルマクロ変数の名前を取得 *;
%* sys…のとか消せない(SQL使ってなければ出てこないかも) *;
%* 200超えてたりするとレコードまたぐため、nodupkey *;
proc Sort data = sashelp.VMACRO( keep = SCOPE NAME ) out = work.VMACRO nodupkey;
  by NAME;
  where SCOPE =: "G" and NAME ^=: "SYS";
run;
%* 他に消したくないマクロ変数あるなら、NAMEのとこ増やす *;

data _null_;
  set work.VMACRO( keep = NAME );
  call execute( '%symdel '|| cats( NAME ) || ';' );
run;

%* データセット不要なら *;
proc Delete lib = work data = VMACRO;
run;
```

# 余談
call symdelでも消せる
%sysmacdelete マクロ;でマクロを削除

# dictionary.MACROSからもマクロ変数名を取得できる

```sas
proc Sql;
  create table work.VMACRO as
    select distinct NAME
    from dictionary.MACROS
    where SCOPE like 'G%' and ^( NAME like 'SYS%' );
quit;

data _null_;
  set work.VMACRO;
  call symdel( NAME );
run; 
```


https://support.sas.com/documentation/cdl_alternate/ja/mcrolref/67912/HTML/default/p1vtk6flp9vpfzn14kkxolcnggzy.htm
https://support.sas.com/documentation/cdl_alternate/ja/mcrolref/67912/HTML/default/n1mihelxhd39lgn1qvl44z89otpw.htm
【Netlify】AngularでSPAしたときにPage Not Foundが出てしまったあなたへ

# いきさつ

ポートフォリオサイトつくるか～
イケてる404ページつくったからデプロイして確認してみよう！

思ってたPage Not Foundとちがう！！！
![ntf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390321/1f660fc0-1ec8-38b4-202a-db5f6aac6823.png)


※下層のルート（/hoge）でページ再読み込みしても同じようにPage Not Foundが出ます

ちなみに作ったサイトはこちら。時間が無限にある人はぜひ見てください。
https://localhost3000.work/

# 修正方法

今回書くのは簡単な修正方法です。
細かい設定をしたい方は[公式ドキュメント](https://docs.netlify.com/routing/redirects/#syntax-for-the-netlify-configuration-file)へどうぞ！

## 手順①: src以下に_redirectsファイルを作成

配置したときの画像
![src.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390321/0239df20-b737-43ac-8262-015894a21c42.png)


中身はこんな感じ

        /*  /index.html 200

## 手順②: angular.jsonに設定を記述

中身はこんな感じ

        "projects.architect.build.options.assets": {
          "glob": "_redirects",
          "input": "src",
          "output": "/"
        }
[Shopify] ミニハック、文字列を数字に変換する

なんで、

```liquid
{% for item in order.line_items %}
  {{ assign qt = qt | plus: item.quantity }}
{% endfor %}
{{ qt }}
```

の出力が

```
1 1 
```

！？


なんだよ、と思った方は、今日ここにたどり着けて幸せ者です。今から1時間ほど時間を節約することになります。

`parseInt` みたいなのがないので `plus:0` で数値と認識させてから、足し算をすると数値としてでてきます。

```liquid
{% for item in order.line_items %}
  {% assign item_qt = item.quantity | plus: 0 %}
  {% assign qt = qt | plus: item_qt %}
{% endfor %}
{{ qt }}
```

出力

```
2
```

# 募集
Shopify開発を一緒にするメンバー募集中。ガンガンご応募ください。 C#, Azure, Shopify こんなテックストックです。

プロマネも募集中です。詳細に関しては下記をご参照ください。
https://t-rnd.com/Jobs/
ExcelやWeb上にある表からSQL文を自動生成する

webサイトなどにある表やExcelなどから一行ごとにINSERT文を自動で生成するプログラムをphpで作成してみました。

##実行環境
Windows10
PHP 7.1.33

##データのコピー
まず、INSERT文にするためのデータをコピーし、適当なファイルに貼り付けます。
例えば、以下のような表がweb上にあるとします。

| ID       |       名前 |    価格    |
|:-----------------|------------------:|:------------------:|
|001|	りんご	|100円|
|002|	ぶどう	|200円|
|003|	いちご	|300円|
|004|	バナナ	|100円|
|005|	ナシ	|250円|
|006|	スイカ	|3000円|
|007|	メロン	|4000円|
|008|	さくらんぼ|	350円|
|009|	モモ	|600円|
|010|	レモン	|300円|

この表のIDと名前だけでSQL文を作成したい場合は、Chromeの拡張機能にある「[Copytables](https://chrome.google.com/webstore/detail/copytables/ekdpkppgmlalfkphpibadldikjimijon?hl=ja)」を使うことで、以下の画像のように特定の列や行のみを選択することが可能となります。(Excelの場合はctrlキーなどを使ってうまくコピーして下さい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/8dda5ce5-705b-e21a-ac42-bf5c2e256e74.png)


コピーができたら、適当な名前でファイルを作成し、貼り付けます。(今回はdata.txt)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/a44f8a0f-8fbf-ce18-ea93-cea7e34144fc.png)

##SQL文を生成するプログラム
次にPHPファイル(ここではinsert.php)を作成し、下のコードを記述して実行します。(解説は後ほど)

```php:insert.php
<?php
header("Content-type: text/html; charset=utf-8");
$filename = "data.txt";
$file = file($filename);
$fp = fopen("insert_sql.txt","w");
for($i=0; $i<count($file); $i++){
  $data =  preg_split("/\s/", $file[$i], -1, PREG_SPLIT_NO_EMPTY);
  $data_values = "'".$data[0]."'";
  if(count($data) >= 2){
    for($j=1; $j<count($data); $j++){
      $data_values .= ", '".$data[$j]."'";
    }
  }
  $contents = "INSERT INTO test VALUES(".$data_values.");";
  fwrite($fp,$contents."\r\n");
}
fclose($fp);
?>
```
実行すると以下のように「insert_sql.txt」というファイルが作成され、そのなかにSQL文が記述されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/ee9d406a-84eb-8fca-92d1-49888474b94b.png)

##ソースコードの解説
PHPファイルに記述したコードの内容について詳しく解説します。

まず、3~5行目ではデータを記述した「data.txt」というファイルをfile()関数を使って 、1行ずつ配列に格納します。その後、fopen()関数で書き込み可能なファイルを新規で作成し、開いています。

```php:insert.php
$filename = "data.txt";
$file = file($filename);
$fp = fopen("insert_sql.txt","w");
```
次にfor文でデータの行数分だけSQL文を生成する準備をします。
count()関数で配列変数$fileにある要素の数を数えることで、その分だけ処理を繰り返すことができます。

```php:insert.php
for($i=0; $i<count($file); $i++){

}
```
7行目ではpreg_split()関数を使って文字列をある文字列で区切って配列に格納します。
もし、データの区切りがカンマだった場合は第一引数を “/,/” にし、半角スペースだった場合は “/\s/” にしたりします。

```php:insert.php
$data =  preg_split("/\s/", $file[$i], -1, PREG_SPLIT_NO_EMPTY);
```

8~11行目でinsert文の VALUES の中身を作成します。データの１行の中身を文字列で区切って配列に格納した配列変数$dataの要素分だけカンマで繋げていきます。

```php:insert.php
$data_value = "'".$data[0]."'";
  if(count($data) >= 2){
    for($j=1; $j<count($data); $j++){
      $data_value .= ", '".$data[$j]."'";
```

その後、SQL文を作成し、変数に格納します。

```php:insert.php
$contents = "INSERT INTO test VALUES(".$data_values.");";
```

fwite()関数で最初に作成して開いたファイルにSQL文を記述します。

```php:insert.php
fwrite($fp,$contents."\r\n");
```
最後にfor文の外で開いていたファイルを閉じ、完成です。

```php:insert.php
fclose($fp);
```

ソースコードを少し変えることで、いろんなパターンのSQL文に対応できると思います。
暗号を知らない人のためのSystem.Security.Cryptographyのざっくりとして使い方(その1)

#System.Security.Cryptography
.NET(や、.NET Core, .Net Framework)には、System.Security.Cryptographyという名前空間があります。
ドキュメントを見てみると、大量のクラスが出てきて圧倒されます。暗号を知らない人が暗号化しようとしたときに、どれを選ぶのかよくわからないこともあるかと思います。

#暗号の分類
と、クラスの説明をする前に暗号を分類しておきましょう。
大きくわけると、
* 共通鍵暗号
* 公開鍵暗号
* ハッシュ関数
があります。
##共通鍵暗号
いわゆる、暗号としてイメージするものはこれです。暗号をかけるための鍵を双方で共有し、決まった方法で暗号化、あるいはその逆手順の復号を行います。
代表的なアルゴリズムに、米国標準（そして、世界でのデファクトスタンダードである）
* AES
や、それの前世代の
* DES
が挙げられます。
##公開鍵暗号
暗号をかけるための鍵(暗号化鍵)と復号のための鍵(復号鍵)が異なるものととらえると理解がしやすいと思います。暗号をかけるための鍵は暗号化できますが、それで作った暗号文を復号できません。
この性質から、暗号化鍵の配布が容易であるという利点があります。
また、電子署名に使われることがあります。
代表的なアルゴリズムでは、デファクトスタンダードである
* RSA
* DH(ElGammal)
* ECDH(楕円ElGamal)
や、米国標準である
* DSA
* ECDSA
などが挙げられます。
##ハッシュ関数
ハッシュ関数は厳密には暗号ではないのですが、セキュリティや暗号に利用されるため、ここで触れます。
ハッシュ関数とは、任意長のデータを決まった大きさのデータ(ハッシュ値)に変換する関数です。
暗号の文脈で使われるときはさらに、「同じハッシュ値を出す入力を探すのが困難である」という性質が望まれます。
もちろん、ハッシュ値は決まった大きさであるにもかかわらず入力は任意長のデータであるため、必ず同じハッシュ値を出す入力は存在します。(これを衝突という)
このハッシュ関数は、改ざん検出によく使われます。
代表的なアルゴリズムには、
* MD5
* SHA1
* SHA256
* SHA384
* SHA512
* SHA3
などが挙げられます。

#まず何を使えばいいのか
決まった鍵でデータを秘匿したいという目的に使う場合、共通鍵暗号を使うのが正解です。なぜなら共通鍵暗号は公開鍵暗号より速いからです。逆に、鍵を共有する手段がないのであれば、公開鍵暗号を使わざるを得ません。しかし、公開鍵暗号は遅いので、公開鍵暗号でデータを暗号化するのではなく、ランダムに生成した鍵を暗号化し、その鍵でデータを暗号化するといった使い方をします。この使い方をハイブリッド暗号と言います。

#共通鍵暗号に何を使うのか
ざっと、System.Security.Cryptography名前空間にある共通鍵暗号アルゴリズムは、
* AES
* DES
* RC2
* Rijndael
* TripleDES
の5種類になります。ただし、Rijndaelは事実上AESと同じ。RC2とDESは既に解読可能、TripleDESも推奨されないということで、結論としては、**AES一択**ということになります。

AESにかかわるクラスは、
* Aes
* AesCng
* AesCryptoServiceProvider
* AesManaged
の4つになります。このうち、一番上のAesは抽象基底クラスですので使用できません。残りの3つは歴史的経緯で実現方法が違います。
##AesCng
一番最初ですが、これを選ぶのが正解です。Windows用のCryptoAPI:Next Generation(CNG)のAESを呼び出す形で実装されています。
##AesCryptoServiceProvider
これは、CNGがリリースされる前のCryptoAPI(CAPI)のAESを呼び出す形で実装されています。.NET 4.6以前の開発に使うという理由がない限りは推奨しません。
##AesManaged
.NETで記述されたAESです。どうしても、.NET上で完結したいという理由でなければお勧めしません。
Windowsセキュリティポリシーには、FIPS準拠アルゴリズムのみを使用するというオプションがあります(レジストリで設定する)。このオプションが設定されているとAesManagedは(AESはFIPS準拠アルゴリズムであるにもかかわらず)CryptographicException例外を吐きます。これが**お勧めしない**理由です。

#公開鍵暗号に何を使うのか
ざっと、System.Security.Cryptography名前空間にある公開鍵暗号アルゴリズムは、
* RSA
* DSA
* ECDH
* ECDSA
の4つです。しかし、DSAとECDSAは電子署名専用アルゴリズムですので、鍵の暗号化には使用できません。そうすると、RSAとECDHの二択になりますが、鍵のサイズがたかだか256ビットであり、RSAは暗号文サイズが大きくなるという性質からお勧めしません。つまり、ECDHを推奨します。

ECDHを取り扱うクラスは、
* ECDiffieHellman
* ECDiffieHellmanCng
の2つですが、ECDiffieHellmanは抽象基底クラスですので使用できません。というわけで、ECDiffieHellmanCngの一択となります。また、鍵サイズが選べますが、これはAESの鍵サイズの2倍__以上__のサイズにしてください。なぜ2倍なのかという話は長くなるので、ここでは省略します。ただし、どうも、Xamarinに入ってないっぽいので、その場合は、RSACngを使ってください。__RSAでの鍵サイズの選択はもっと長くなるのでその2以降で記述します。__

#ハッシュ関数に何を使うのか、
ざっと、System.Security.Cryptography名前空間にあるハッシュ関数アルゴリズムは、
* MD5
* SHA1
* SHA256
* SHA384
* SHA512
になります。用途にもよりますが、MD5は衝突が容易に発見できるので推奨しません。SHA1以降はどれも使えますが、ハッシュ関数を何に使うかによって選択を変えてください。
なお、それぞれ抽象基底クラス、CryptoServiceProviderで呼び出すものとManagedクラスがあります。Windowsのみで使うなら、CryptoServiceProviderを、Xamarinで使うならManagedクラスがよいと思います。上手くどれを選べばいいというのが断言できないのですが、.NET 5になれば、全部CryptoServiceProviderを使用するべきだと思います。これは、Managedクラスは上記のCryptographicException例外を吐く可能性があるという理由からです。
もの作りと対比すると欠落しているプロセス

これまで、殆ど議論されていなかった点について述べます。
もの作りのプロセスとシステム開発のプロセスを比較すると、もの作りにあって
システム開発に無いプロセスがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621379/cea1fb5c-7ab7-b89c-f1f7-f8e363ad0492.png)

この図の上側の紫色の箱はもの作りのプロセス、したの緑色がシステム開発のプロセスです。上側の赤い楕円で示した部分がソフトウェア開発の工程には一切含まれていないのです。

この個所は**『作り方の設計』**です。ソフトウェア開発ではこの個所は各エンジニアの頭の中で行われて、そのやり方は各人によって違いますが、その良き不出来で品質やコストに跳ね返ってきますが、いままでは、それが属人性によるとされていて、Aさんはセンスが良い、コーディングした内容が読みやすい、効率よくプログラムコーディングしていると評価されていて、その反対は出来ない人と評価され、チーム作業とはいえず、個人個人のばらつきが当たり前でした。

この**モノ作りにおける『作り方の設計』はアジャイル開発での『タスク出し』に相当します。**
チーム全員で、タスクの粒度に拘って実施することで、作り方の設計と同じ価値がある作業になります。
各メンバーの**スキル向上ならびに平準化・仕様祖語の是正から品質向上**といった効果を期待できるのです。
[Shopify] ミニハック、カートで数量を変更できないようにする

え！？なぜ、こんなことさせるのと思うかもれしませんが、こういうニーズもありましたので。（＊Debutテーマ使っています）

# 編集箇所の確認
編集するのは `cart-template.liquid`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/3ca63d8e-b386-b998-d12b-342be90231b8.png)

## 編集ラインの確認
171行目 = PC表示
184行目 = モバイル表示
の2か所を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/e37a9a2c-3a20-d3fd-d47d-c60ed0e7a0a6.png)

## 枠を削除
`input`ボックスっぽい枠を消します。
`style="border:none;"`とします。もしくはこれを定義している`class`を追加します。

## `attribute`を`readonly`に変更
`input`を`readonly`にする
読み込みオンリー、編集不可能。

## `type`の変更
`input`の`type`が`number`のままだと数字をアップダウンするカーソルが表示されてしまうので、`type`を`text`にします。

## 編集後のコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/7d31332a-776e-77a3-5616-4f030163f3c2.png)

これでどうやっても数値が編集できないカートができました。 `min`や`pattern`もいらないのですが、残してあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/472fad52-8ce5-91d5-ab07-6e8258e4cdf8.png)
コイン集めゲームを作る

# 今回作ったゲーム

![myFile (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638192/43c4b9e6-8d57-8941-cec3-1ec78392defd.gif)

キツネを動かして画面上に出現するコインを集めていくゲームを作りました
動かせるものと聞いた時から簡単なゲームを作りたいと思いこれを作成しました

---

#実際に作っていく

このゲームは**Pygame**と**Pygame Zero**の２種類のモジュールをインストールして作りました


```python

# coding:utf-8

import pgzrun
from random import randint
#ゲーム画面を作る
WIDTH = 400
HEIGHT = 400
#スコアをセットする
score = 0
game_over = False
#アクターを加える
fox = Actor("fox")
fox.pos = 100, 100

coin = Actor("coin")
coin.pos = 200, 200

#画像を画面に表示
def draw():
    screen.fill("green")
    fox.draw()
    coin.draw()
    screen.draw.text("Score: " + str(score), color="black", topleft=(10, 10))

    if game_over:
        screen.fill("pink")
        screen.draw.text("Final Score: " + str(score), topleft=(10, 10), fontsize=60)

#コインをランダムに置く
def place_coin():
    coin.x = randint(20, (WIDTH - 20))
    coin.y = randint(20, (HEIGHT - 20))

def time_up():
    global game_over
    game_over = True

#キツネを動かす
def update():
    global score

    if keyboard.left:
        fox.x = fox.x - 2
    elif keyboard.right:
        fox.x = fox.x + 2
    elif keyboard.up:
        fox.y = fox.y - 2
    elif keyboard.down:
        fox.y = fox.y + 2

    coin_collected = fox.colliderect(coin)

    if coin_collected:
        score = score + 10
        place_coin()

#タイマー、コインをセットする
clock.schedule(time_up, 30.0)
place_coin()

pgzrun.go()
```
clokcやupdate()関数などPygame Zeroオリジナルのものもいくつかある
数字を変更することでキツネのスピードやコイン獲得時のスコア、制限時間も調節できる

---

#新しくわかったこと

**Pythonでゲームを作るにはモジュールをインストールしなければならない**
上のコードをそのまま打って実行してもエラーが出るだけで何も起こらない
ゲームを作るときはそれ用のモジュールをインストールする必要がある
インストールのやり方が全然わからなかった

##モジュールをインストールする（Windows）
まず、コマンドプロンプトというアプリを開く
コマンドプロンプトは画面左下の検索欄に**cmd**と入力するとでてくる
↓
![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638192/8d421502-d276-b3fa-79a3-b03841d56e64.png)
このアプリを開くとテキストエディタ？がでてくるのであとはインストールしたいモジュールの公式サイトなどを調べ、でてきたコードを打ち込めばインストールできる

---

#最後に

今回のゲームは以下の本を参考にして作成しました

[「たのしくまなぶPythonゲームプログラミング図鑑」](https://www.amazon.co.jp/たのしくまなぶPythonゲームプログラミング図鑑-キャロル・ヴォーダマン/dp/4422414364/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1HSHLCFQYO00T&dchild=1&keywords=python+%E3%82%B2%E3%83%BC%E3%83%A0&qid=1594121156&sprefix=python%2Caps%2C330&sr=8-7
)

ゲームの作り方がたくさん書いてあるのでおすすめです
よく使うエクセル(Excel)ショートカット一覧

# よく使うエクセルのショートカット一覧

```Ctrl + F1``` リボン表示/非表示
```F12``` 名前を付けて保存
```Alt + e + m``` シート移動/コピーのダイアログ表示
```Shift + F11``` 新しいシートの追加
```Ctrl + f``` 検索と置換ダイアログの「検索」を表示
```Ctrl + h``` 検索と置換ダイアログの「置換」を表示

## セル選択/追加/削除操作
```Shift + Space``` 行の選択※IMEがオフになっていること
```Ctrl + Space``` 列の選択
```Ctrl + "+"``` 行or列の選択状態で、行or列の挿入
```Ctrl + "-"``` 行or列の選択状態で、行or列の削除


## セルの書式操作
```Ctrl + b``` ```Ctrl + 2``` 太字(bold)
```Ctrl + i``` ```Ctrl + 3``` 斜体(itaric)
```Ctrl + u``` ```Ctrl + 4``` 下線(underline)
```Ctrl + 5``` 取り消し線
```Ctrl + 1``` セルの書式設定ダイアログ表示

## ホーム
```Alt + h``` リボン:ホーム表示(home)

```Alt + h → w``` 折り返して全体表示(wrap)
```Alt + h → mm``` セルを結合して中央揃え(merge)
```Alt + h → mu``` セル結合を解除(merge unlock)

```Alt + h → bn``` 罫線　無くする(border none)
```Alt + h → ba``` 罫線　選択範囲を全て格子(border all)
```Alt + h → bs``` 罫線　選択範囲の周りを細い線で囲む(border square)
```Alt + h → bt``` 罫線　選択範囲の周りを太い線で囲む(border thick)

## 校閲
```Alt + r``` リボン:校閲表示(review)

```Alt + r → c``` コメント　書く(comment)
```Alt + r → d``` コメント　消す(delete)
```Alt + r → h``` コメント　表示/非表示(hide)
```Alt + r → a``` コメント　全て表示/非表示(all)

## 表示
```Alt + w``` リボン:表示(window)

```Alt + w → vg``` 目盛線　表示/非表示(visible grid)
```Alt + w → vf``` 数式バー　表示/非表示(visible formula)
```Alt + w → vh``` 列と行の見出し　表示/非表示(visible header)


カッコ書きの部分は自分用の覚書きですので、正確なところは不明です。
「BashでFizzBuzz」からShellScriptの基本的な書き方を思い出してみる

# はじめに

あるとき自分のFacebookにこんな記事が出てきたんですよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/cc856385-d37f-d105-0d9d-cd8a5d77adc5.png)

ああ、8年……そんな経ったのですね……ちょうど特許検索エンジンのUI側をjQueryを鬼駆使ししてSPAなどという言葉もなかった頃にSPAみたいなことをやっていた時期だったと思います。

んで、その頃に当時の現場のCTO（頭脳も物理的にもつよつよなエンジニア）から腕試し的に書いてみろって言われたんですよ。
これくらい書けなきゃMac使わせない的なこと言われたんだったかな……？

FizzBussとは3の倍数のときに「Fizz」、５の倍数のときに「Buzz」と出力させる、コードの基礎が全て詰まっていると言われているよくある練習課題です。
3の倍数のときにアホになる例のネタと同じようなやつです。
`Hello World` の次ぐらいにやるやつですね。

えーと、コードは……

```bash
for ((i=1; i < 101; ++i));do if ((i%3==0 && i%5==0));then echo fizzbuzz;elif ((i%3==0)) ;then echo fizz;elif ((i%5==0));then echo buzz;else echo $i;fi; done
```

ワンライナーなのでよくわかりませんね。

# Beautifyしてみた

整形するとこんな感じです。

```bash
for ((i = 1; i < 101; ++i)); do
    if ((i % 3 == 0 && i % 5 == 0)); then
        echo fizzbuzz
    elif ((i % 3 == 0)); then
        echo fizz
    elif ((i % 5 == 0)); then
        echo buzz
    else
        echo $i
    fi
done
```

なんか、「今だったらこんな書き方しないな？」な箇所がいくつかはあるんですが、どうして今そうしないのかよくわからないので、細かく紐解いてみましょう。

# For文のループ

```bash
for ((i = 1; i < 101; ++i)); do
    # なんか処理
done
```

初期化式に再初期化式を実行して継続条件式が `false` になったら止めるっていう基本のループです。
`do` から `done` までの間の処理を継続条件式が `true` である限り繰り返し実行します。
今日日、式を3つ並べるforループなんてなかなか書かないですよね。
この書き方の場合、カッコは2つ使う必要があるようです。

```bash
for i in {1..100}; do
    # なんか処理
done
```

多分この形のいわゆる `for-in` 型のほうが使い勝手がいいのかなと思います。

# if文の条件分岐

```bash
    if ((i % 3 == 0 && i % 5 == 0)); then
        echo fizzbuzz
    elif ((i % 3 == 0)); then
        echo fizz
    elif ((i % 5 == 0)); then
        echo buzz
    else
        echo $i
    fi
```

条件分岐ですね。 `if` で始まって、 `elif` とか `else` で分岐して、 `fi` で終わります。
でもShellScriptの条件文ってこんな感じに書くんじゃなかったっけ？って思ってたですよ。

```bash
if [ i -eq 5 ]; then
    # なんか処理
fi
```

この、ブラケット `[]` で囲まれた部分って、 `test` というコマンドのシンタックスシュガーなんですよね。
んで、このFizzBuzzではブラケットの代わりに二重括弧を使ってます。
実は二重括弧で囲まれた部分は `let` コマンドのシンタックスシュガーなんだそうで、数値の比較で絶大な威力を発揮します。（その代わり文字列比較ができません）

# 変数

変数への代入は普通に

```bash
i = 5
```

みたいな感じでできます。
参照のときは

```bash
echo $i
```

みたいな感じで、ドルマークを付けます。
letコマンドで参照するときはいらないようです。

# 参考ページ

* [普段使いなbashのfor文](https://qiita.com/mikeda/items/483927bba1e556e02b2e)
* [JP1/Advanced Shell 5.2.2　条件式](http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0134.HTM)
windowsでもMacみたいにモニタ1つでデスクトップ複数使いたい

自分はMac bookを普段使っているのですが、たまに家のデスクトップのwindowsを使って作業をすることがあります。ブラウザ含めデスクトップ1つだと足りないんですよね...。モニター2つ置くスペースはないし持ってないし。
そこでwindowsでも仮想デスクトップを使いたいんですが、マウスで変えるの面倒くさいのでショートカットキーを調べました

#仮想デスクトップを追加する

```
windows + Ctrl + D
```

#仮想デスクトップを移動する

```
#右に移動
windows + Ctrl + →

#左に移動
windows + Ctrl + ←
```

#仮想デスクトップを削除する

```
windows + Ctrl + F4
```
占う。

#作成動機

自分の好きな漫画「ニセコイ」を読み直していた時、主人公らがおみくじを引いていて、最近自分もおみくじを引いてないので引きたくなったが、そのためだけに神社に行くのも少し気が引けた上、簡単そうだから初心者の自分でも作れると思い、作ってみることにした。

---

#すべてのコード
結論から言うのが好きなので結論から。


```php
import random as r
import tkinter,tkinter.messagebox
 #tkinterの初期化
root = tkinter.Tk()
root.withdraw()
 #メッセージボックスの表示
tkinter.messagebox.showinfo(title="今日の運勢は？？",
message = "下のボタンを押してね！")
 #運勢の一覧（リスト）
lucks = ["大吉","吉","中吉","小吉","末吉","凶","大凶"]
 #運勢の一覧からランダムで選択
luck = r.choice(lucks)
 #運勢の内容で表示する文章を変える
if luck == "大吉":
   detail = "おめでとうございます！すべての物事が自分の思い通りにいく日かも(*^^)v"
elif luck == "吉":
   detail = "知らぬ間に周りの人のインフルエンサーになっていて、恩が帰って来る日かも"
elif luck == "中吉":
   detail = "帰り道など遠回りをしてみると、ちょっとした幸せをみつけられる日となるかも"
elif luck == "小吉":
   detail = "幸せは近くにあるのに見つけ出せていないので、探してみるといい日になるかも"
elif luck == "末吉":
   detail = "いつかするからといって後回しにしていた課題を、今日頑張ってすることでいい日となるかも"
elif luck == "凶":
   detail = "夜明けまで遊ばず、規則正しい生活をすれば運気アップかも"
else:
   detail = "……　　今日は大人しくしておいたほうがいいかも(+_+)"
 #結果の表示
tkinter.messagebox.showinfo(title="結果発表！",
message="あなたの今日の運勢は{0}です(￣▽￣)\n{1}".format(luck,detail))

tkinter.messagebox.showinfo(title="また見てね！",
message="以上、今日の運勢でした(≧▽≦)") #自動的に閉じる
```

こうしてみると最初に思った通り、簡単そうに見える。。
**だけである**。初心者の自分にとってはこれでもとても難しく、エラーを幾度となく叩き出したため引用を用いた。
自分にはプログラムの知識と才能が圧倒的に足りないのだろう。。

---

#実行してみた
結果は！！！　　
![2020-07-07 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638209/13053f69-ee71-459d-7602-a3426ec6e6fd.png)
…末吉でした。うーーん、微妙(´・ω・｀)　

---

#感想
エラーをたくさん出してしまったが、そのたびそのたびどこがダメなのかをしっかりとわかったことで、少しは成長できたのかなと感じた。今後は知識を増やして、ぜひとも一人でプログラムを作ってみたい！！

---

#引用・参考文献
・[pythonの簡単な初心者向け占いプログラム ](https://note.com/honnto_maitta/n/n554ac8f29dca)
・「いちばんやさしいPython入門教室」, 著者：大沢文孝
実行した時刻を数字として取得する

日時を数字として取得しドキュメントとして保存することで、Firebaseの非同期処理を乗り越えることができました。
他にもやり方はあると思いますが、これによってドキュメントを時系列でソートすることができます。
例)
2020年7月8日8時19分38分に実行
timeNumberDocument()
-->20070881938

```Swift
import UIKit

func timeNumberDocument() -> Int {
    let dt = Date()
    var firstCha = ""
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddHHmmss", options: 0, locale: Locale(identifier: "ja_JP"))
    var time = dateFormatter.string(from: dt)
    var timeNumber = time.compactMap { $0.hexDigitValue }.map({String($0)})
    for cha in timeNumber {
        var cha = cha
        firstCha += cha
    }
    return Int(firstCha) ?? 0
}
```
R (3.4.2)を手動でアップデートする

# 背景
R version 3.4.2 (2017-09-28)を使っていたが、さすがに対応していないパッケージが増えてきたのでアップデートしたい。

# 方法
調べるとupdateRやinstallrで簡単にできるようだが、そもそもこれらのパッケージが現行バージョンに対応していない。。。

```r
sessionInfo()
# R version 3.4.2 (2017-09-28)
# Platform: x86_64-apple-darwin15.6.0 (64-bit)
# Running under: macOS  10.14.1

install.packages("updateR")
# Warning in install.packages :
#         package ‘updateR’ is not available (for R version 3.4.2)

install.packages("installr")
# Warning in install.packages :
#         package ‘installr’ is not available (for R version 3.4.2)
```

[Install/Update R & RStudio](https://uvastatlab.github.io/phdplus/installR.html)を参考に手動で入れてみる。

1. [cran](https://cran.r-project.org/)から自分のPCのOSにあったRをダウンロードする。
![The_Comprehensive_R_Archive_Network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/eec12caf-880a-6c72-8627-3b6cd5bacd4a.png)

2. インストールする。基本的には「次へ」をクリックしていけば良い。
![R_4_0_2_for_macOSのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/6113dd68-f761-4f7c-8ed8-e6ea1f1e3b15.png)

3. Rstudioを再起動する。ここでいくら待っても起動が完了しない。
![RStudio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/9393a00e-b14a-8085-b775-187cd0767272.png)
2回ほど再起動を繰り返すと最終的には起動した（新しいのを読み込むのに時間がかかっていた？）。

# 結果
無事に最新のR version 4.0.2 (2020-06-22)にアップデートされた。

```r
sessionInfo()
# R version 4.0.2 (2020-06-22)
# Platform: x86_64-apple-darwin17.0 (64-bit)
# Running under: macOS Mojave 10.14.1
```
Go: Starttls でメールの送信

こちらと同じことを Deno で行いました。
[Python3: Starttls でメールの送信](https://qiita.com/ekzemplaro/items/c248b52a6f36947af080)
hi-ho.ne.jp で試しました。

```go:hi-ho.go
// ---------------------------------------------------------------
//
//	hi-ho.go
//
//					Jul/07/2020
// ---------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	"net/smtp"
	"github.com/joho/godotenv"
)


func main() {

	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

err := godotenv.Load(".env")
    if err != nil {
        panic(err)
    }

	server := os.Getenv("SERVER")
	port := os.Getenv("PORT")
	usr := os.Getenv("USR")
	password := os.Getenv("PASSWORD")

	fmt.Fprintf (os.Stderr,server + "\n")
	fmt.Fprintf (os.Stderr,port + "\n")

	from := os.Getenv("FROM")
	to := os.Getenv("TO")

	auth := smtp.PlainAuth("", usr, password, server)

	msg := []byte("" +
		"From: " + from + "\n" +
		"To: " + to + "\n" +
		"Subject: Test from Hi-ho PM 20:02\n" +
		"\n" +
		"テスト\n" +
		"今晩は。\n" +
		"PM 20:02\n" +
	"")

	err = smtp.SendMail(server + ":" + port, auth, from, []string{to}, msg)
	if err != nil {
		fmt.Fprintf(os.Stderr, "エラー: %v\n", err)
		return
	}

	fmt.Print("success\n")

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:.env
SERVER = 'hi-ho.mose-mail.jp'
PORT = 587
USR = '****@hi-ho.ne.jp'
PASSWORD = '****'
FROM = '****@hi-ho.ne.jp'
TO = 'sample@example.com'
```

実行結果

```text
$ go run hi-ho.go
*** 開始 ***
hi-ho.mose-mail.jp
587
success
*** 終了 ***
```
[ロードマップ] ５秒でフロントエンド〜バックエンド〜DevOpsまで全体図を画像で把握する

![web dev learning path 2020 part2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/2463d1c5-5c5f-78e4-faf0-5e56419b2a67.png)
![back end learning path 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/84fc745a-993d-3572-d76d-4a70b85f70f8.png)
![dev ops learning path 2020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/ce93ca9c-3b7c-df09-a52d-cd11b3981c1d.jpeg)

# 引用元

https://levelup.gitconnected.com/the-2020-web-developer-roadmap-76503ddfb327

https://medium.com/@sushantkr17/7-steps-to-become-a-web-developer-in-2017-ef5b88e6fafa

https://twitter.com/the_real_pilzze/status/885148232141156353
【JavaScript】タブの切り替え表示を実装する【JQuery】

## はじめに
webサイトでよく見るタブの切り替えを、JavaScriptを使って実装する方法を解説します。
あまり難しいことはないので順番に見ていきましょう！

先に今回のサンプルの完成イメージを載せておきます。
![3d9f2899143344eb9d1a27b1c14f7420.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/31a51fb7-3fac-0882-9fdd-b53ed5321829.gif)

## htmlファイル
タブとそれぞれのタブに対応した中身を用意します。
一つ目のタブ（tab）にactiveクラスをつけ、タブの中身（content）の一つ目にshowクラスをつけておきます。

```html:htmlファイル
<div class="tab-area">
  <div class="tab active">
    タブ１
  </div>
  <div class="tab">
    タブ２
  </div>
  <div class="tab">
    タブ３
  </div>
  <div class="tab">
    タブ４
  </div>
  <div class="tab">
    タブ５
  </div>
</div>
<div class="content-area">
  <div class="content show">
    タブ１の中身です
  </div>
  <div class="content">
    タブ２の中身です
  </div>
  <div class="content">
    タブ３の中身です
  </div>
  <div class="content">
    タブ４の中身です
  </div>
  <div class="content">
    タブ５の中身です
  </div>
</div>
```

## cssファイル
scssで書いてます。
タブのactiveとそれ以外、中身のshowとそれ以外がどのように表示されたら良いか書けばOKです。

```scss:scssファイル
.tab-area {
  display: flex;
  justify-content: space-around;
  background-color: #222e3e;
  cursor: pointer;
  .tab {
    width: 300px;
    height: 30px;
    line-height: 30px;
    text-align: center;
    color: white;
    border-right: 1px solid #50637b;
    border-left: 1px solid #222e3e;
  }
  .tab.active {
    background-color: #ccc;
    color: #222e3e;
    border: none;
  }
}
.content-area {
  font-size: 30px;
  text-align: center;
  .content {
    display: none;
  }
  .content.show {
    margin-top: 50px;
    display: block;
  }
}
```


## jsファイル
JQueryを使って書いてます。

```js:jsファイル
$(function() {
  let tabs = $(".tab"); // tabのクラスを全て取得し、変数tabsに配列で定義
  $(".tab").on("click", function() { // tabをクリックしたらイベント発火
    $(".active").removeClass("active"); // activeクラスを消す
    $(this).addClass("active"); // クリックした箇所にactiveクラスを追加
    const index = tabs.index(this); // クリックした箇所がタブの何番目か判定し、定数indexとして定義
    $(".content").removeClass("show").eq(index).addClass("show"); // showクラスを消して、contentクラスのindex番目にshowクラスを追加
  })
})
```

## 最後に
クリックした箇所のクラス名をJavaScriptを使って変更していくだけなので、難しいことは特になかったかと思います。

タブを使った表示ができるとモダンな感じになるので積極的に使っていきましょう！
OSMCで日本で利用可能な2.4GHz WiFiのChannel 12, 13, 14を使う方法

#2.4GHzのWiFiがとても混んでいる。
我が家のテレビ録画は、TVにUSB HDDを繋いで録りためているのですが、TVが壊れた時のために、ネットワークHDDに移動することにしました。セットアップが終わりいざコピーを始めたところ、途中で切れることが頻発しました。どうやらWiFiのパフォーマンスに問題がありそうな振る舞いだったので、Macに[WiFi Explorer Lite](https://apps.apple.com/jp/app/wifi-explorer-lite/id1408727408)を入れてWiFiの混雑状況をみてみると、チャンネル1から9くらいまでが団子状態となって出てきました。自分のWiFiはチャンネル6を使っていました。
チャンネル12くらいが重なりがなく、良さそうでしたので、WiFiルーターのチャンネル設定を変更して難をのがれ、スイスイビデオのコピーも進んみました。

#今まで使えていたOSMCのWiFiが使えなくなっていた
寝室にあるTVには、Raspberry Pi3 Bに入れたOSMCでネットワークメディアを見ていたのですが、気づいたらWiFiにつながらなくなっていて、調べてゆくとチャンネル12以上はちゃんと国設定をしないと使えないということがわかりました。国によって使えるチャンネルが異なっていて、日本を明示する必要があるとのことです。=> [IEEE 802.11のWiki](https://ja.wikipedia.org/wiki/IEEE_802.11)
通常のRaspbianだと、wpa_supplicant.confにcountry=jpと入れておけばOKなのですが、OSMCにはraspi-configもないし、wpa_supplicant.confも使われていないようで、やっとの思いでOSMCのForumでイギリスの設定という書き込みを見つけそれを参考に設定して旨くゆきましたので、日本語でやり方を残しておきたいと思います。=> [元の記事](https://discourse.osmc.tv/t/raspberry-pi-3-with-osmc-unable-to-use-wifi-channels-11-12-13-in-uk/15907)

#日本向けWiFi環境の設定手順
下記の手順通りに設定

```
sudo apt-get install iw
sudo apt-get install crda
sudo iw reg set JP
```
そして、/etc/default/crda ファイルにREGDOMAIN=JP を記載してRebootします。
場合によってはiwの導入とsetは不要かもしれません。

iWだけでも日本に設定できますが、リブートすると忘れてしまうので、CRDAの導入と定義ファイルへの記述をすることで恒久的な設定となりました。
【javascript】 クリックイベント　click 　文字色変更　文字変更  innerHTML /  classList / toggle

##【ゴール】

###その① 文字色変化

![画面収録 2020-07-07 18.26.59.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/c776d2a9-5de1-159e-1dce-4d5ae0414ee2.gif)





###その② 文字大きさ変化
![画面収録 2020-07-07 18.29.16.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/6f04aea0-bd3f-487d-18a8-d338bd7e110e.gif)


##【メリット】
■ javascript　理解度向上


##【必要なもの】
■　**HTML記述**（ページ内容表示、文や、文字の表示）
■　**CSS記述**（ページの装飾、色変更等）
■　**javascript記述**（CSSでは実現できない動き、）

##【コード】
###その①文字色を変更

####HTML
＊id を付与。

```html:index.html
<button id="button">文字色が変わるよ</button>
<h2 id="text">文字色が変わるよ</h2>
```


####CSS
＊クリックイベント後の処理

```css:style.css
.font-color {
      color: pink;
    }
```

####javascript
＊button id　がクリックされたらスコープ内を処理
＊**toggleメソッドはクラスが存在していれば削除、なければ付与。超絶便利メソッド**

```javascript:script.js
const change = document.getElementById('button');

    change.addEventListener('click', () => {
     document.getElementById('text').classList.toggle('font-color');
    });
```

###その② 文字を変更

####HTML
＊その①と同じ

```html:index.html
<button id="button">文字が変わるよ</button>
<h2 id="text">文字色が変わるよ</h2>
```


####CSS
**今回は不要**

####javascript
＊button id　がクリックされたらスコープ内を処理
＊**innerHtml**メソッドで文字を変更


```javascript:script.js
const change = document.getElementById('button');

change.addEventListener('click', () => {
  document.getElementById('text').innerHTML = '<h2>変わったね</h2>';
});

```

##【留意点】
■アロー関数を積極的に使う。推奨の為
■javascript取得するIDを間違えないようにする
■メソッド、基本的な物を覚える。



##【合わせて読みたい】
■ 【Javascript】 メソッド　まとめ　基礎基本コード　メモ
https://qiita.com/tanaka-yu3/items/2438798d159fa402b1d5

■ 【アロー関数】　javascript　() => {} 　意味　一言で、 入門　
https://qiita.com/tanaka-yu3/items/e16d51280f647aa19a58

■ドットインストールカリキュラム　javascript
https://dotinstall.com/lessons/basic_javascript_v4/50603
Qiita投稿テンプレート

自分用

## 環境
- Mac
- AndroidStudio4.0
- Kotlin

## 前提知識
[今までに投稿した記事とか](https)

## 解決したい内容

## 改善策

## 参考にした記事
[URL](https)

```kotlin:コピペ用
## 環境
- Mac
- AndroidStudio4.0
- Kotlin

## 前提知識
[URL](https)

## 解決したい内容

## 改善策

## 参考にした記事
[URL](https)


マークダウン
# 見出し 1
## 見出し 2
### 見出し 3
強調
**強調**
リンク
[リンク](http://...)
リスト
- リスト 1
- リスト 2
    - リスト 2-1
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
```
rc.localが実行されない場合に確認すること

# /etc/rc.d/rc.local に記載したコマンドが実行されない
## 確認すること
### 実行権
```
ls -l /etc/rc.d/rc.local
```
### 実行権が付いていない場合は付与する
```
chmod u+x /etc/rc.d/rc.local
```
SQLServer: ストアドプロシージャ内で参照しているストアドプロシージャを抽出するときにハマったこと

# 背景
[sys.sql_expression_dependencies](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-sql-expression-dependencies-transact-sql?view=sql-server-ver15)というテーブルを使うと、特定のストアドプロシージャで参照しているテーブルや、EXECUTEしているストアドプロシージャを自動で抽出することができます。

以下のクエリを実行することで、ストアドプロシージャ内で実行されているストアドプロシージャをリストアップできるかと試してみたのですが、うまくいきませんでした。

```sql
select *
from sys.sql_expression_dependencies as sd
inner join sys.objects as o on o.object_id = sd.referenced_id
	and type = 'P'
```

データを確認すると、referenced_idがNULLになっていたので、本挙動について調査してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/9ab90705-93c6-dbb7-320f-7ed1882e93cc.png)


# 調査結果
[ドキュメント](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-sql-expression-dependencies-transact-sql?view=sql-server-ver15)をみると、referenced_idは

>参照先エンティティの ID。 スキーマバインド参照の場合、この列の値は NULL になりません。

となっています。
「スキーマバインド」の意味をとりかねたのですが、おそらく「スキーマ指定までしているかどうか」だと思い、以下の実験をしてみました。

```sql
create proc proc111
as
begin
	select 1
end
go

--スキーマバインドなし
create proc proc222
as
begin
	exec proc111
end
go

--スキーマバインドあり
create proc proc333
as
begin
	exec dbo.proc111
end
```

#### スキーマバインド無しの場合の依存関係抽出結果

```sql
select *
from sys.sql_expression_dependencies as sd
where referencing_id = object_id('proc222')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/6a03b691-fc4a-2937-b7e6-a81c29e4c912.png)

#### スキーマバインドありの場合の依存関係抽出結果
```sql
select *
from sys.sql_expression_dependencies as sd
where referencing_id = object_id('proc333')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/d2632171-6c1e-1fa6-b347-fcd9cf3ec4aa.png)

スキーマバインドありだと、referenced_idが取得できました。

スキーマバインド無しのストアドプロシージャを参照している場合、sys.sql_expression_dependenciesを使用するときは、referenced_idの代わりにreferenced_entity_nameを使用するしかなさそうです。

※[sql_dependencies](https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-sql-dependencies-transact-sql?view=sql-server-ver15)であれば取得できるようですが、非推奨のテーブルとなっています。
git patch の事

//TODO
パッチの作り方

```sh
git diff
```

新しい方法なのでなるべくこちらを使おうよって

```sh
git format-patch
```

mbox形式


パッチ適用する方法

こちら、成功する場合だけ適用される。エラーがあると適用できない。

```sh
git apply
```

git applyで問題があるので適用できない、

patchコマンドを使う、エラーがあっても実行編集されるので、中途半端な状態になる可能性がある。

```sh
patch -p1 < xxx.patch
```


### 課題

`patch`より`git apply` を使うのがよいのでパッチのエラーが修正できるならそのほうがいい・・・。

例）
error: patch failed: ＜ファイル名＞:＜行＞
error: ＜ファイル名＞: patch does not apply

パッチファイルを編集して問題が起きるケースもある。
物体検出　SSDについて

# 物体検出の入力と出力
入力：画像
出力：BBox(位置・大きさ情報)、クラスラベル、confidence

# SSD（Single Shot Multi Detector）
SSDは、物体検出アルゴリズムの一つ。SSD300とSSD512の2パターンがある（画像サイズがそれぞれ300x300, 512x512）。8732個の大きさや形の異なる長方形の枠（デフォルトボックス）を画像に乗せ、SSDモデルに通すことで、位置の予測とクラスの予測を行う。

位置の予測：DBoxのオフセット（cx,cy,w,h）
クラスの予測：物体の種類

# 特徴
* 小さい物体の検出は苦手（小さい物体の検出に用いられる特徴量マップ（サイズが大きいもの）は、畳み込みの回数が少なく、単純な特徴しか得ることができないため）

# SSDによる物体検出の流れ
1．画像を300x300にリサイズ
2. デフォルトボックスを8732個用意
3. SSDネットワークに画像を入力（出力：デフォルトボックス x (各クラスの信頼度:21個 + オフセット：4個)を出力）
4. 信頼度上位のデフォルトボックスを抽出
5. オフセット情報による修正と被りの除去
6. 閾値（ユーザが設定可）以上の信頼度のバウンディングボックスを出力

# ネットワークモデル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/9cc5b550-e86d-8048-60b4-c9bc713149da.png)

VGG16モデルにExtra Feature Layersという畳み込み層を挿入。6つの異なる大きさの特徴量マップを用いることで、様々な大きさに対応した物体の特徴量を得ることができる。

# Non-Maximum Suppressionのアルゴリズム
DBoxが8732個もあるので、画像中の同じ物体に対して、SSDモデルより求めたBBoxはほんの少しずれて複数個生じる場合がある。Non-Maximum Suppressionとは、これらBBoxから一つのBBoxのみを残す処理を指す。

操作：高い信頼度を出したBBoxが複数ある場合、重なり度合いの指標IoU(Intersection over Union)が閾値以上（ex:5割）の場合、最も高い信頼度のBBoxのみを残し、他は除去する。

$$
IoU = \frac{Intersection(BBox同士が重なる部分の面積)}{Union(BBoxを組み合わせた面積)}
$$


# 参考
* 作りながら学ぶ! Pytorchによる発展ディープラーニング
* https://avinton.com/blog/2018/03/single-shot-multibox-detector-explained1/
* https://www.acceluniverse.com/blog/developers/2020/02/SSD.html
* https://qiita.com/hiroqik/items/39ea69213626bb4b7d84
* http://cedro3.com/ai/pytorch-ssd/
AndroidStudioでGitHubを使う


すぐ忘れるのでメモ

## 環境
Mac
[Pleiadesプラグイン](https://mergedoc.osdn.jp)で日本語化
[GitHub](https://github.com)アカウント開設済み
PCに[git](https://git-scm.com/downloads)インストール済み

## Gitの作成
プロジェクト初回作成時のみ

VCS
→Enable Version Control Integration
　（バージョン管理統合を使用可能にする）
![スクリーンショット 2020-05-29 18.12.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/175c8106-64df-0ffd-1f56-9f3e38f89595.png)

→Git
→OK
![スクリーンショット 2020-05-29 18.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/244d838d-b687-f3c6-b2cd-2fe292f063f2.png)

## GitHubに接続
VCS
→Import into Version Control
　（バージョン管理へインポート）
→Share Project on GitHub
　（GitHubでプロジェクトを共用）
![スクリーンショット 2020-05-29 18.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/ac7fa7f6-4735-c606-093f-099aead95f16.png)

### GitHubにログイン
初回のみ
![スクリーンショット 2020-07-20 15.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/f746aab0-f856-c3ec-3b3a-5726910bf2e3.png)



### GitHubのリポジトリ作成
名前つけたり
→Share
　（共用）
![スクリーンショット 2020-05-29 18.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/48e1483e-c2c6-a7a7-bdee-c30ff6a45237.png)

→Add
　（追加）
![スクリーンショット 2020-05-29 18.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/6b6b4d3a-f333-e86f-d6b4-1b1681b42bd2.png)

## Checkout
（初回）GitHubからAndroidStudioに保存

Checkout for version control
（バージョン管理からチェックアウト）
→Git
![スクリーンショット 2020-06-01 10.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/612533e4-de48-cc2c-c64c-ab8964d85802.png)

GitHubにログイン
![スクリーンショット 2020-06-01 10.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/ceae0e49-8e2a-029a-90fe-4d4f26a6c8bc.png)

URLで開きたいプロジェクトを選択
URL入れればログインしてなくてもとってこれるし何なら自分のプロジェクトじゃなくてもとってこれる
サンプルとかすぐ開ける
![スクリーンショット 2020-06-01 10.53.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/0ef4c932-250d-363b-048b-26b85b1e36ef.png)

確認画面が出てきたら はい を押して完了
![スクリーンショット 2020-06-01 10.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620387/7c5e6f95-ead4-1ede-a23b-fb0207b2f2a1.png)

## プロジェクトの更新
（2回目以降）GitHubからAndroidStudioに保存

VCS
→プロジェクトの更新(⌘T)
→更新タイプ・更新前の作業を選択
→OK

別の場所で同じものを編集したいだけならマージでいいんじゃないかと

## Commit
変更をAndroidStudio内に保存
Git:✔︎(⌘K)

## Push
変更をGitHubに保存
VCS
→Git
→Push(⇧⌘K)

## 参考にした記事
[CodeCampus](https://blog.codecamp.jp/programming-androidstudio-github)

[GitHub↔︎Bitbucketの移動](https://www.blog.danishi.net/2019/04/11/post-262/)
VSCodeで'Don't show again'を押してしまった通知を復活させる

ハマったけど情報が見つからなかったのでメモ。

## Don't Show Again

VSCode 右下に出るこのような通知は、「Don't Show Again」を選択することで以後表示されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204734/c089374e-0859-229e-62ae-9b3e87dc868c.png)

しかし間違えて選択してしまった場合や、一度消した通知があとから欲しくなったときに復旧する項目が VSCode の設定項目に見当たりませんでした。
二度と表示させねえという意思があまりにも強すぎる。

## 設定の復旧

### ワークスペースの特定

これらの設定はグローバルに存在する通知オフ設定（`extensions.ignoreRecommended` など）とは独立して、
ワークスペース単位で管理しているようです。

ワークスペース固有の環境設定はワークスペースのフォルダ内にはなく、別の場所で管理されています。

mac の場合は `$HOME/Library/Application\ Support/Code/User/workspaceStorage` にありました。
別 OS でも似たような場所（ `AppData` 以下や `.config` 以下にあるのではないかと思います。）

現在作成されているワークスペースはこのディレクトリ下に管理されていますが、
単純なワークスペース名では無くなんらかのハッシュ値もしくは乱数によって命名されているようです。
このディレクトリは次のような構成になっています。（ちゃんと検証していないので環境差あるかも）

```text
2a7b2639e3fb95fc60d7e863ca9ebda4/
├── state.vscdb
├── state.vscdb.backup
└── workspace.json
```

このうち `workspace.json` にワークスペースの存在するディレクトリが記述されているので、
これを参考に該当のワークスペースを探します。

```workspace.json
{
  "folder": "file:///Users/USERNAME/path/to/workspace"
}
```

### 通知の復旧

まずは作業前に VSCode を終了しておきます。

難しいことを考えたくない場合、この特定したディレクトリを削除すれば解決です。
ただし何が入っているのかよくわからないので、編集過程の保存していない進捗のキャッシュなども飛ぶかもしれない。
（レコード見た感じターミナルやファイラが開いた状態か？や最後にカーソルがどこにあったか？みたいな情報も記録されている気がする）

それでは困る場合は具体的な通知無効化の設定を特定し、無効化を解除する必要があります。

このワークスペースのディレクトリに含まれるファイルのうち、 `state.vscdb` は sqlite3 のバイナリになっていました。
この中に無効化した通知等の設定が記録されているので、このファイルを sqlite3 で読み込み該当するレコードを削除します。

今回の例では、無効化してしまったワークスペース単位での推奨拡張の通知を再度表示するようにしたいというのが目的だったので、
以下のレコードが該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204734/5c3622b1-2e16-5f8f-99cd-067618b4e8ad.png)

このレコードを削除して VSCode を再度起動し、該当のワークスペースを開き直したところ上記の通知が復旧しました。

## おわりに

無効化した通知の再有効化とかエディタの設定項目に用意してくれてても良い気がするというか、
ここまでしてマジで通知を徹底的に潰す理由もあるんだろうかという気がするのでどっかに設定項目あるのかもしれん。
でも見つからなかったので...
Dockerコンテナ環境における開発で頻出するコマンドまとめ

#はじめに
Dockerコンテナ環境で開発を進めていた際に、使う機会が多かったコマンド一式をまとめました。
本記事が皆様の一助になりますと幸いです。

#docker-compose.ymlの変更を反映
イメージ： 再構築の必要なし
コンテナ： 再構築の必要<font color="Tomato">あり</font> `docker-compose up -d`

#Dockerfileの変更を反映
イメージ： 再構築の必要<font color="Tomato">あり</font> `docker-compose build`
コンテナ： 再構築の必要<font color="Tomato">あり</font> `docker-compose up -d`

#起動しているコンテナの停止・削除
全コンテナ停止： `docker stop $(docker ps -q)`
全コンテナ削除： `docker rm $(docker ps -q -a)`
全イメージ削除： `docker rmi $(docker images -q)`

#参考文献
Docker Composeにおける各種ファイルの変更時の反映
https://qiita.com/subretu/items/5857628534b53f29f5a3
一発ですべてのDockerコンテナを停止・削除、イメージの削除をする
https://qiita.com/shisama/items/48e2eaf1dc356568b0d7
【Nuxt.js】Nuxt文法編：$emit

🎈 この記事はWP専用です
https://wp.me/pc9NHC-od

# $emitとは
通常は子→親には何もできません。
$emitを使えば子自身のイベントや
値を親に渡せます🌟
値に関してはvuexで管理しても⭕️
ただシンプルな物なら
わざわざvuex使う必要もないし…
って時とかに便利です✨

ちなにみ親→子ならpropsが⭕️

# 書き方
@clickとセットで使用します🌟
書き方は2種類

メソッド記法
@click="methods名"
this.$emit('イベント名', 第二引数)

インライン記法
@click="$emit('イベント名', 第二引数)"

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-od