OmniAICreator/Qiita-1.07M huggingface dataset:
俺は弱い（戒め）　AjaxとJS編

# 最初に
今回vueとDjangoを使ったアプリを作成したいとのことでakiyokoさんが著作した[現場で使える Django REST Framework の教科書 ](https://www.amazon.co.jp/gp/product/B07XWL8FPM/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07XWL8FPM&linkCode=as2&tag=akiyoko0b-22&linkId=c2101278023093228e5df50cf627eaa9)を拝読させていただきました。その中でBootstrapVue、Ajax周り、JavaScriptの細かい部分が分からないとのことだったので分からんところをピックアップしてまとめることにした(不出来な自分への戒め)


## variant
```javascript
<div>
  <b-jumbotron bg-variant="info" text-variant="white" border-variant="dark">
    <template #header>BootstrapVue</template>

    <template #lead>
      This is a simple hero unit, a simple jumbotron-style component for calling extra attention to
      featured content or information.
    </template>

    <hr class="my-4">

    <p>
      It uses utility classes for typography and spacing to space content out within the larger
      container.
    </p>
  </b-jumbotron>
</div>
```

これだけ見ると初心者は全く分からん。自分も分からん。
まずvariantの意味

![スクリーンショット 2020-12-22 18.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331535/7168f055-86ad-00f3-612a-1886e831a8de.png)

ほう。分からんw
ここは愚直に公式ドキュメントを読む。

bg-variant prop（info、danger、warning、light、darkなどに設定）を使用して全体的な背景バリアントを制御し、border-variant propを使用してborderバリアントを制御し、text-variantpropを使用してtextバリアントを制御します。 3つの小道具はすべてデフォルトでnullに設定され、ジャンボトロンにデフォルトのスタイルを使用するように指示します。

とある。自分の解釈は
bg-variant propではおしらせ系（警告や危険告知など）、テーマ設定を制御するバリアント。
border-variant propではボーダーの制御
text-variant propでテキスト制御する。
つまり、ここは制御に関しての設定を行う場所ってイメージで落とし込んだ。

## Ajax
非同期に(Asynchronouse)、JavaScriptがサーバとXML形式でデータ通信を行うための技術。
だけど最近はXML形式より他の形式で行うことが多々ある（JSONとかあるよね）
ページ遷移を行わずに画面を更新できることからユーザビリティの向上が期待され、開発者目線ではクライアントサイドとサーバサイドの処理を明確に切り分けることができるなどのメリットがある。
以下のaxiosは実装法の一つ。
[参考記事](https://qiita.com/frost_star/items/3dec133b5213f5cd7a35#ajax%E3%81%AE%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

## axios
axiosとはブラウザやnode.js上で動くPromiseベースのHTTPクライアントです。(promiseベース？。HTTPクライアント？)
### Promiseベース
参考記事によると非同期のAPI処理を良い感じにしてくれるやつ。
コールバック地獄を改善してくれる良いやつ
[参考記事](https://qiita.com/koki_cheese/items/c559da338a3d307c9d88)
### HTTPクライアント
HTTP送受信で作られるクライアント、サーバのクライアント側のこと指している？（ググっても良い感じのは出てこない）
[HTTPの良さそうな記事](https://qiita.com/shuntaro_tamura/items/ae55b99deb9e2a170754)


## 三項演算子（調べて思い出した。俺は....弱い）

```javascript
変数 ? 真にしたいこと : 偽にしたいこと
```
変数が真となれば真にしたいことが起こる。偽なら偽にしたいことが起こる。
以上。
精進しろ自分。

[参考サイト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)
ImageMagick で JPEG の Orientation 情報を取り除くメモ

## 背景

python imageio とかで読んだ JPEG 画像が正しく? Orientation を扱えていないようなケースがあるっぽく,
実画像データが回転している状態になってしまっている.

適切に回転した状態にして, Orientation 情報を JPEG から取り除きたい(Orientation を Top-Left にしたい).
 
## 方法

https://stackoverflow.com/questions/19456036/detect-exif-orientation-and-rotate-image-using-imagemagick

ありがとうございます.

とりあえずは,

```
mogrify -auto-orient your-image.jpg
```

で上書きで行けました.

## TODO

* [ ] DNG(TIFF) の orientation も上書きできるか試す
More than one file was found with OS independent path 'lib/arm64-v8a/libopencv_java3.so'. エラー回避備忘録

## 概要
出くわしたエラー

```
More than one file was found with OS independent path 'lib/arm64-v8a/libopencv_java3.so'.
```

きちんとopencvをcmake から読み込んで動的リンクをしているはずなのだが、このエラーが出てしまう。


## 解決法
`app/gradle`
に

```
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/libs']
        }
    }
```

とする。

なぜ解決するかは完全には理解していない。。
Node.js: Redis のデータを作成 (Create)

## プログラム
```js:redis_create.js
#! /usr/local/bin/node
// ---------------------------------------------------------------
//	redis_create.js
//
//					May/25/2023
//
// ---------------------------------------------------------------
'use strict'

const redis = require('redis')

// ---------------------------------------------------------------
function dict_append_proc (dict_aa,id_in,name_in,population_in,date_mod_in)
{
	var unit_aa = {}
	unit_aa['name'] = name_in
	unit_aa['population'] = population_in
	unit_aa['date_mod'] = date_mod_in

	dict_aa[id_in] = unit_aa

	return	dict_aa
}

// ---------------------------------------------------------------
function data_prepare_proc ()
{
	var dict_aa = new Object ()

	dict_aa = dict_append_proc (dict_aa,'t1851','福井',92714,'1950-9-12')
	dict_aa = dict_append_proc (dict_aa,'t1852','敦賀',28158,'1950-3-15')
	dict_aa = dict_append_proc (dict_aa,'t1853','小浜',67241,'1950-10-2')
	dict_aa = dict_append_proc (dict_aa,'t1854','大野',32164,'1950-6-22')
	dict_aa = dict_append_proc (dict_aa,'t1855','勝山',41358,'1950-8-14')
	dict_aa = dict_append_proc (dict_aa,'t1856','鯖江',64792,'1950-9-12')
	dict_aa = dict_append_proc (dict_aa,'t1857','あわら',38251,'1950-3-21')
	dict_aa = dict_append_proc (dict_aa,'t1858','越前',52486,'1950-7-26')
	dict_aa = dict_append_proc (dict_aa,'t1859','坂井',25397,'1950-11-9')
	
	return	dict_aa
}

// ---------------------------------------------------------------
async function create_proc(options)
{
	var dict_aa = data_prepare_proc ()

	const client = redis.createClient()
	await client.connect()

	const keys = Object.keys(dict_aa)

	for (var it in keys)
		{
		const key = keys[it]
		const str_json = JSON.stringify (dict_aa[key])
		console.log(key,str_json)
		try
			{
			await client.set(key, str_json)
			}
		catch (error)
			{
			console.error ("*** error *** from client.set ***")
			console.error (error)
			console.error (key)
			}

		}

	await client.disconnect()
	console.error ("*** 終了 ***")	
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

create_proc({ argv: process.argv })

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

## 実行コマンド

```bash
./redis_create.js
```

## 確認したバージョン

```text
$ node --version
v20.2.0
```
CodingKeysでdecodableに準拠していないエラー



```
struct Item: Codable {
    let itemName: String
    let itemPrice: Int
    
    private enum CodingKeys: String, CodingKey {
        case itemName = "ItemName"
    }
}
```


この場合CodingKeysのcaseにitemNameしか定義されていないため、エラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/1000a77b-d637-8b7f-dcae-6006267689e1.png)
なのでcaseを一つ追加することでエラーが無くなります。

```
struct Item: Codable {
    let itemName: String
    let itemPrice: Int
    
    private enum CodingKeys: String, CodingKey {
        case itemName = "ItemName"
        case itemPrice = "ItemPrice"
    }
}
```
【Java】WindowsでJavaのアップデートを行う方法

#プログラミング勉強日記
2020年12月30日
Javaのアップデート方法について簡単にまとめる。

#Javaのアップデートとは
　パソコンにインストールされているJavaを最新のバージョンにアップデートすることである。Javaの開発は日々行われているのでバージョンアップのたびに最新のJavaがリリースされている。
　<b>Javaは常に最新バージョンにしていた方がいい</b>。セキュリティの面でも性質の向上の面でもJavaのアップデートは必要である。

#アップデート方法

##1. Javaのコントロールパネルを開く。
　Javaの設定を行うコントロールパネルを開く。Windowsマークを押して、`Javaの構成`をクリックするか、左側の検索欄でJavaと入力すると`javaの構成`が表示されるのでクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/a2c1fe8b-47e2-1127-522d-cb70a81deadd.png)

##2.更新タブから更新する
　更新タブの中に`今すぐ更新`があるのでクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/2dd13861-b14f-474d-71c9-4f02c8757dc0.png)

##自動更新を設定する方法
　毎回手動でアップデートするのは面倒なので、自動更新設定をお勧めする。方法は先ほどの画面で`更新を自動的にチェック`にチェックマークを入れて`OK`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/4a458902-01c8-f4ca-75a2-90859b692f02.png)



#参考文献
[Javaのアップデート方法を簡単に解説](https://eng-entrance.com/java-install-update)
[Javaのアップデートができない？やり方とエラーの対策を解説します！](https://www.tech-teacher.jp/blog/java-update/)
Linuxでのタスク優先度の逆転現象についての調査

#経緯
組込みLinux上で動作するプロセスの周期タイマに遅延が起こっており、CPUトレースを取得してタスクのコンテキストスイッチの状態を調査していた。すると、通常スレッドがリアルタイムスレッドの優先度を上回っているところがあった。
タスク優先度の逆転現象というのは一般的に資源の排他制御が原因で起こると思われるが、今回は同一資源を使用していないスレッド同士で優先度の逆転現象が起こっていたため原因を調べてみた。

#調査結果
今回のタスク優先度の逆転現象は、<b>「帯域幅制限メカニズム」</b>によるものであった
Linuxではリアルタイムスレッドが無限ループなどに落ち着いたときCPUを占有してしまい、他の処理が実行されなくなる恐れがある。その対策として、Linux カーネル 2.6.25 以降ではCPUを独占する可能性のあるリアルタイムスレッドからCPUを保護する機能が追加された。この機能を「帯域幅制限メカニズム」と呼ぶ。

このメカニズムは、以下の /proc ファイルシステムパラメーターで調整できる。

```
/proc/sys/kernel/sched_rt_period_us
```
CPU 帯域幅の 100％ と考えられる時間をマイクロ秒で定義する。
デフォルト値は 1000000マイクロ秒。

```
/proc/sys/kernel/sched_rt_runtime_us
```
リアルタイムスレッドの実行に当てられる時間をマイクロ秒で定義する。
デフォルト値は 950000マイクロ秒。
この値を-1に設定すると、帯域制御メカニズムが機能しなくなる。

sched_rt_runtime_usの値は以下のように設定する。


```
$ sudo sysctl -w kernel.sched_rt_runtime_us=980000
kernel.sched_rt_runtime_us = 980000
```
※98ミリ秒に設定する場合

#参考文献

この記事は以下の情報を参考にして執筆しました。

・パフォーマンスチューニングガイド Red Hat 4.2. CPU のスケジューリング
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-cpu-scheduler

・Tech Knowledge  RT Throttling と RT Group Scheduling
https://blog.longest-road.com/contents/?p=1236
gitでpush出来なくてハマってしまった話。

プライベートPCでwebアプリ開発を始めようと `rails new` してfirst commitの内容をgithubに反映させようとしたところ以下のようなエラーが出て1日ハマってしまったので自戒も込めてメモ。

# 前提としてやっていたこと
- githubで新しいリポジトリを作成している。
- gitリモート接続登録している。
- 公開鍵をgithubのsettingに登録。

# 発生したエラー

```
### originのリポジトリにプッシュする
$ git push origin master

#-------------------
Bad owner or permissions on ~/.ssh/config
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
#-------------------
```

「アクセス権限とリポジトリの存在を確認してくれ」と言われている。

# 確認した内容
## gitリモート接続出来ているか
```
＄git remote -v
```
```
origin  git@github.com:githubaccaunt/projectname.git (fetch)
origin  git@github.com:githubaccaunt/projectname.git (push)
```
この様に出力されてたらOK。
もしされてなかったら

```
$git remote add origin https://github.com/githubaccaunt/projectname.git
```

## keyが作成されているか。
前提で公開鍵を登録していたが念の為

```
$ ls ~/.ssh/
id_rsa id_rsa.pub
```
確かに存在している(これで出てこない人は検索してみてね)。
念の為githubに公開鍵を登録し直してみた。

```
# 公開鍵のクリップボードへのコピー
pbcopy < ~/.ssh/id_rsa.pub
```
それをgithubで

- 右上のアイコン→Settings→SSH and GPG keys→New SSH key

に貼り付け(元々作ったのはdelete)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877744/3dcd160d-252e-ea1b-e56a-ab20ac90703c.png)

## ~/.ssh/configの中身確認
```
$ vim ~/.ssh/config
```

```
Host gitHub↲
  HostName github.com↲
  User git↲
  IdentityFile  ~/.ssh/id_rsa↲
```

サイトによって記述の仕方は若干異なるけど大多数はこれ。

vimは使い慣れていないけど

- Iでインサートモード
- esc→:waで保存
- :qaで終了

とりあえず中身もタイポとかはしてなさそうだった。

## sshへの接続確認

```
$ ssh -T git@github.com
```
これを実行して

```
Hi your! You've successfully authenticated, but GitHub does not provide shell access.
```

接続できている。これでpush出来るかと思ったら

# なぜかエラーメッセージは同じものだった
ひと通り関連した検索内容に書かれているものは再確認・再試行したがダメだった。SSH認証まで取れているのになぜだろう。

# 頼れるは公式Doc
[GitHub公式Doc](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/connecting-to-github-with-ssh)を参考にしたら大事な手順が抜けていることが判明。
そもそもSSHへの接続確認までの手順として正しいのは

1. 既存の SSH キーの確認
2. 新しい SSH キーを生成する
3. SSH キーを ssh-agent に追加する
4. GitHub アカウントへの新しい SSH キーの追加
5. SSH 接続をテストする

なのだが3.を抜かしていることに気づく。

## 解決
```
### ssh-agentが動作しているか確認
$ eval "$(ssh-agent -s)"
Agent pid 32047

### 秘密鍵を追加
$ ssh-add ~/.ssh/id_rsa
...
Identity added: ~/.ssh/id_rsa 
```

# 終わりに
なかなか環境構築って数を沢山やるわけじゃないから個人の知見があまりなかったが、SSH周りの復習も兼ねていい経験になった。
WVD RDP Shortpathを試してみた

Windows Virtual Desktop (WVD)のRDP Shortpathはパフォーマンスを向上させるということで、実際にRDP Shortpathを試してみたレポートです。

# ネットワークの状態
## RDP Shortpathが有効の場合
![Shortpath1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/6da34647-3c1b-d213-d9a7-506a1e3c0569.png)
着目するポイントは、ネットワークの詳細。

```
[Network details]
トランスポート プロトコル: UDP
ラウンドトリップ時間: 4 ミリ秒
使用可能な帯域幅: 100.17 Mbps
フレーム レート: 20 FPS
```

## RDP Shortpathが無効の場合
![Shortpath2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/e7a3a09f-4e87-02dd-e519-ac7a6d97f1ec.png)

```
[Network details]
トランスポート プロトコル: TCP
ラウンドトリップ時間: 22 ミリ秒
使用可能な帯域幅: 26.98 Mbps
フレーム レート: 28 FPS
```

## 計測環境

- WVDのVMは東日本リージョンに展開
- パブリックIPアドレスの<あり|なし>でRDP Shortpathの<有効|無効>を制御
- クライアントはNURO光 2GにつながったWindows 10 20H2

[Windows Virtual Desktop エクスペリエンス見積もりツール](https://azure.microsoft.com/ja-jp/services/virtual-desktop/assessment/)は、下記の通り。
![ExpTool1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/13dddf95-9c84-97dc-8d14-3b7b0c43ebfe.png)

# 考察
上のスナップショットで示した、ネットワークの状態によって変わっていきます。RDP Shortpathなら絶対速いというわけではないようです。
キーボードタイプ、マウス操作によるレスポンスは、**"この環境では"**差を感じませんでした。これは、個人の感覚もあると思います。
ここまで書いておいてなんですが、Universal Rate Control Protocol (URCP)をベースにしているということで、例えば品質が動的に変わるモバイルルーターでつないでいるような環境などで効果を発揮するかもしれません。
また、ルーティング設計しやすくなることもポイントですので、ExpressRouteを通すことで安定化させることもできるかと思います。
あと、注意点として、Azure Firewallを通す場合、SNATがかかると現在の仕組みでは接続が確立できません。WVDではInternetへのアクセス制御でAzure Firewallを通すことがありますが、RDPだけこれを通さないような設定はできないので、このような利用形態では注意が必要です。

# 参考
## 設定

[こちらのDocs](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/shortpath)に従って設定します。ホストPCに設定する項目は2つ。

- RDP Shortpathの有効化
- ファイアウォールでのUDP 3390の開放

ホストPCそれぞれに設定する必要があるため、私はグループポリシーで一括設定しました。

AzureのVNetでセキュリティグループなどが設定されている環境では、UDP 3390のインバウンドトラフィックをルールに追加する必要があります。

なお、RDP Shortpathを有効化していても、環境的につながらない場合は、RDP Shortpathなしとしてフォールダウンして接続が確立されます。

あと、ホストそのものにクライアントからネットワーク的に接続可能である必要があります。グローバルIPアドレスが割り当てられている、もしくはプライベートネットワークへVPN(ExpressRouteを含む)で到達可能、などが必要です。
授業メモ2



# githubの利用

　githubのアカウントを作成する際に注意する点はすぐに読めるメールアドレスを設定すること.

　なぜなら招待(今回は授業グループ)を受け取った際にすぐに参加できるようにするため.

　本授業の中ではzoomチャットにアカウント名を送り,TeamNishitaniに参加した後rubydoc  にアクセスが可能かどうかを確認する.

　githubの設定(settings)にssh-keyを登録し,sshのアドレスをコピーする.


# emacsの使い方

　正直今でもよくわかっていないが,少し使ってみた感じemacsはqiitaに記事を載せる際の原稿のようなかんじなのかなと思っている.

Ubuntu内の

> gradmembers/members/adchello(myaccount)

  において　

> emacs AAA

とすると,AAAという名前のemacsフォルダが作成される.

emacsの中には基本情報を入れておいた方が良い.

具体的には

　1.アクセストークン

　2.タイトル,筆者

　1は後で説明します.2のタイトルはこれをqiitaに載せた時のタイトルになるから必須かなと思った.

そのほかにも授業の都合上,言語・qiita<sub>id</sub>・github<sub>id</sub>・学籍番号・名前もあってもよき.


# emacsのキーバインド

　実際にemacsを使う際にはキーバインドをある程度知っておく必要があった.

特によく使うキーバインドを紹介する.

1.C-x C-s ファイルの保存

2.C-x C-c emacsの終了

3.C-k 選択箇所以降の一行を削除

4.C-shift-v + 右クリ　貼り付け

　このほかにも一文字消すや一文字進む,戻る,一行上がる,下がるにもそれぞれキーバインドがある.

普通のファイルと同じくdeleteや矢印キーでも行えるが,慣れるともっとスムーズにできるからと注意される.


# qiitaの利用

　qiitaはブログっぽいものを簡単に自分で作成できるコンテンツっぽい.実際に検索していて,個人のqiitaサイトを参考にしたことも多くある.

qiitaに記事を投稿するにはまずマイページ>設定>アプリケーションからアクセストークンを発行する.emacsの使い方でも少し触れたこのアクセストークンはemacsによって作成した記事をqiitaに載せる際のカギのようなものだと思う.これを忘れてしまうとその記事の更新ができなくなってしまう.

　私はこの授業の評価対象であるREADME.orgのアクセストークンを忘れてしまい位置から作り直しました.  (ほとんど進めてなかったからすぐに終わったけど).


# 共有方法

　ここでは作成したものをgithubでメンバーに共有する方法とqiitaに記事として公開することで共有する方法を示す.

・githubでの共有

> git config &#x2013;global core.editor emacs

> git pull origin main

> git add -A

> git commit -m 'hoge hoge'

> git push origin main

　上記の方法でgithub内の自分のフォルダが更新され,Ubuntuで作成したファイルたちが新しいバージョンになる.

・qiitaでの共有

> gem install qiita<sub>org</sub>

> qiita config

> qiita config global access<sub>token</sub> 'created Token'

> qiita post 'AAA.org' private

　上記は'AAA.org'というファイルをqiitaに載せる場合の方法なので,名前の部分は適宜変更を行う.

ここまでで,README.orgがgithubとqiitaにあることが目安とされていたが,両方確認できた.



------
 - **source** ~/grad_members_20f/members/adchello/test1.org
ユーザースニペットの罠

便利ですよね、ユーザースニペット。
(ユーザースニペットに関してはこちら)
[アニメ図解たっぷり】VSCodeの使い方入門！～ 基本からWeb制作まで](https://skillhub.jp/blogs/235)
[拡張子ごとのスニペット(定型文)登録の仕方](https://qiita.com/d0ne1s/items/de857ed1948417dde4ed)

しかし、ユーザースニペットを登録するにあたって気をつけなければならないことがあります。
それは、**"prefix":に登録できない文字がある**ということです。

例えば、僕はhtml.erbでよく使う`<%  %>`を以下のように登録しようとしました。

```html.erb.code-snippets
{
	"<%  %>": {
		"prefix": "<%",
		"body": [
			"<% $1 %>",
			"$2"
		],
		"description": "<%  %>"
	}
}
```
しかし、これだとユーザースニペットが全く反応しませんでした。
「そもそもスニペットの登録の仕方が間違っているのか...」などといろいろ調べることになってしまいましたが、そもそも"<%"をスニペットに登録することはできず。

```html.erb.code-snippets
{
	"<%  %>": {
		"prefix": "r",
		"body": [
			"<% $1 %>",
			"$2"
		],
		"description": "<%  %>"
	}
}
```

などとすれば登録ができます。

案外これに関する記事が少なかったので書かせていただきました。
参考になれば幸いです。
「error  Irregular whitespace not allowed  no-irregular-whitespace」１つの解決法

#はじめに
Vueでたまに発生するこのエラー！！！

```console
 2:5  error  Irregular whitespace not allowed  no-irregular-whitespace

✖ 1 problem (1 error, 0 warnings)
```

厳密にはこのエラー、**vueではなくESLintのルールが原因。**

Vue CLIでプロジェクトを作成すると、デフォルトでJSのルールを設定す「ESLint」も付いてくるかと。
そいつのエラー。

##これは何？
[ESLintのエラールール。日本語ざっくり解説 可能性あるエラー編](https://qiita.com/M-ISO/items/f9097a75b362206c2a99#no-irregular-whitespace)
上記の記事で解説されている

#全角スペースが入っていませんか？
![スクリーンショット 2020-12-30 16.55.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/3c352485-599c-dd24-7b9d-f2ccc5c5fc64.jpeg)

目視で確認できないレベルなら、**疑うべきは全角スペース**

エディタの検索で全角スペースを探してみましょう。個人的にはこの可能性が高い。。。。
エンジニアを振り返ってみる

##エンジニア暦1年ちょいを振り返ってみる
もはやブログ。
エンジニアとしての歴史を振り返り、これからに活かそう。

##エンジニアでない生活との差分
以下4点に分類して、振り返ってみた。
・使う言葉
・思考回路
・手の動き
・技術的知識
結局はこれらが1年間において、私に身についた`純度の高い財産`なのである。
#####使う言葉
まずは様々な単語を使うようになった。
・差分
・認識
・連携
など、ちょっと漠然んとしてて好きじゃないものもあるけど
まぁこの辺をよく使うってことは、この辺が大事ってことだ。
#####思考回路
今までとあまり変わらない気がするが、それは日々少しづつ変化したからだろう。
・現状の把握
・理想の把握
・つまり何が必要か
・何が障害か
などを洗い出して整理。とにかくその辺を整理するのが上手く、早くなったと思う。
これを繰り返し、体で覚え、修錬した結果、業務知識を把握するのが早くなった。
また、何かを調査するときに推測して仮説を立証するのがとても速くなった。

あと、`人に伝えるときはとりあえず結論のみ`を重要視するようになった。
無論、結論いった後でしっかり補足もするが。
#####手の動き
もうほんとにここが変わった。
ひたすらにツールと関数を好み、手動を嫌うようになった。
やはり私にとっての三種の神器は
・Chrome、スプレと関数
・sakuraと正規表現
・Excelと関数
である。
Chrome以外、sakuraとExcelは、使えない現場なんてまず無いと思っていいから
安心して依存できる。
管理系業務や要件、見積りの為に
OfficeやWinMergeなどをものすごく使った。マジで神速で指が動く。使いこなせる。
[私の思う、使えた方がいい最小限をこちらにまとめています。](https://qiita.com/neras_1215/items/f5b6e29c9fb870f1b4e3)
#####技術的知識
思考回路と手の動きが軸であり骨である。
そして、技術知識は肉となる。
その結果使う言葉が変わっていったイメージ。
ここでは詳しく取り上げられないが、やはり[こちら](https://qiita.com/neras_1215/items/f5b6e29c9fb870f1b4e3)にまとめている。
私は1年JavaとJavaScriptを、eclipseによってガツガツ担当していたので
エディタで言えばeclipseやVSCodeを、言語で言えばJavaやJS関連のライブラリ系を
かなり深くまでライブラリを潜り、細部まで調査し、と。

##これからの動きとして
4点をもっと深く、広く。
また、より長く高密度に活動していくことで、上記観点以外が見えてくるかもしれない。
恐らく私は慢心している。
謙虚に頑張っていこう。
Bashのcdコマンドで移動前のディレクトリに戻る方法


便利なcdコマンドの使い方を知ったのでメモ

`cd -`で1つ前にいた移動前のディレクトリに戻ることができる。

```
$ pwd
/home/someuser
$ cd somewhere/to/work && pwd
/home/someuser/somewhere/to/work
$ cd -
/home/someuser
$ cd -
/home/someuser/somewhere/to/work
```

npm scriptsやCI/CDでディレクトリを移動して作業した後、元いたプロジェクトのルートディレクトリに戻る時に便利

```
$ cd path/to/child && [何か作業する] && cd -
```
gitブランチを一括削除

# 目的
現在のブランチとmasterブランチ以外を一括削除したいときに使う！

# git version
### 2.16以下
何もしない

### 2.16以上
```bash
git config --global pager.branch false
```

git 2.16版から`git branch`の出力はページングされるようになったため、まず**無効**にする

# 一括削除
`.bashrc`に以下の内容を追加する

```bash
gbrm() {
    git branch | grep -v `git branch --show-current` | grep -v 'master' | xargs git branch -d
}
```

↑これで

- current branch
- master

以外のブランチを削除されます。

### 補足
```
-d, --delete
           Delete a branch. The branch must be fully merged in its upstream branch, or in HEAD if no upstream was set with --track or --set-upstream-to.

-D
           Shortcut for --delete --force.
```

`-d`はmerge済みか、upstreamを設定してないブランチしか削除されない。間違えて開発中のブランチを削除してしまうことを防げます。

関係なく、削除したい場合は、`-D`をを使ってください。

# 使い方
```bash
FO-602:manager feng$ git branch
  current-working-branch 582c921c2 
  last-week-branch       582c921c2 
  master                 582c921c2 
* merged-branch          582c921c2 
FO-602:manager feng$ git checkout current-working-branch
Switched to branch 'current-working-branch'
FO-602:manager feng$ gbrm
Deleted branch last-week-branch (was 582c921c2).
Deleted branch merged-branch (was 582c921c2).
```
# 参照
- [terminal \- Git branch command behaves like 'less' \- Stack Overflow](https://stackoverflow.com/questions/48341920/git-branch-command-behaves-like-less?answertab=active#tab-top)
OpenSSLを使ったファイルの暗号化

# 暗号化する

```shell-session
$ openssl des3 -salt -in %暗号するファイル% -out %暗号化されたファイル%
```

# 復号する

```shell-session
$ openssl des3 -d -salt -in %暗号化されたファイル% -out %復号ファイル%
```
Corgi Engineのはじめかた

Corgi Engineを一週間使ってみたので、分かった範囲で書いていきたいと思います
Corgi Engine(https://assetstore.unity.com/packages/templates/systems/corgi-engine-2d-2-5d-platformer-26617?locale=ja-JP)

Corgi Engineは2Dのプラットフォーマーのテンプレートで昔のマリオみたいなゲームが作れます。アングリーバードみたいな物理演算ゴリゴリなのを作るのには向いてません

どういった風に自分のゲームに組み込むかですが、一週間使ってみてこんな感じがよさそうです
1. Corgi Engineの機能を理解し、それに沿ったゲームデザインにしたゲーム→Corgi Engineをそのまま使う
2. プロトタイプ、短期間で作るゲーム、少しだけカスタマイズが必要なゲーム→Corgi Engineをカスタマイズする
3. 長期間かけて作るゲーム→Corgi Engineのソースコードを流用して自分で作る

なぜ、３はソースコードの流用がいいのかというと、大幅なカスタマイズをするとコードの整合性を保つのが難しいので、ブラックボックスをなるべくなくして扱える範囲でやった方がいいです


公式のドキュメントがあります。
https://corgi-engine-docs.moremountains.com/
英語ですが基本的な内容はあるので、わからなくなったらみると解決したりしなかったりします。Youtube動画もあります。なぜか音が小さいです
ここをみて解決しなかったら、Googleにきいたり、それでもわからなかったらCorgi Engineのソースコードをみましょう

#Corgi Engineで遊ぼう
まずは、遊んでみてどういったことができるかを知っておきましょう
Corgi Engine/ Common/ Scenes/ SplashScree.unity
このシーンを実行するとはじめから遊べます
![Level_Selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293944/ebd4e2ae-5947-5956-7220-e27fe4f4488c.png)
普通の2Dやドット絵、3Dのステージ、また機能を説明するために最低限の要素で構成されたMinimalステージもあります

操作方法は公式ドキュメントのここにかいてあります
https://corgi-engine-docs.moremountains.com/input.html

移動:W,A,S,D(W,Sは上向いたり、下向いたりする)
ジャンプ:Space
走る:Sift
ダッシュ:F
ショット:E

画像をはっつけときます
![input-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293944/39b78c1c-6bfa-f527-1bcf-81aa7d11fb0a.jpeg)

#キャラを作ってみる
正方形をプレイアブルキャラクターにしていきます
その前にシーンを用意します
CorgiEngine/ Demos/ Minimal/ MinimalLevel.unity
最低限のステージ(Level)が用意されているシーンです。GameManagersやLevelManagerなどがあらかじめ含まれています。実行するとこんな感じのです
![MinimalLevel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293944/acf2b496-8436-3626-c8b0-47a3c6fe8346.png)



これを複製して、変更していきましょう。まず、正方形(ツールバーからAssets>Create>Sprites>Square)をシーンに配置します
この正方形のGameObjectにAdd ComponentでCharacterを追加します。
![Character.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293944/e49bc5c4-53c8-ddfd-2278-f5f8d0e75cf5.png)
インスペクターにあるCharacterコンポーネントに"AutoBuild Player Character"とかいたボタンがあるので押すと自動的に必要なコンポーネントの追加やタグ、レイヤーが変更され、操作できるようになります。
追加されたコンポーネントをいじって簡単に挙動を変えれます。例えば、ジャンプの上限を5回に変更したときは、CharacterJumpコンポーネントのNumber Of Jumpsを５にするだけです

このままでも操作はできますが、ちゃんと管理できるようにLevelManagerに登録します。先ほど作成した正方形のゲームオブジェクトをPrefab化します。シーンに配置されているLevelManagerのPlayer PrefabsのSizeを１として、Element 0に正方形のPrefabを付けます
![movie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293944/f798672c-e25f-1977-6810-298eacf46f42.gif)

足場を作る場合はCollider2Dをつけて、レイヤーをPlatforms、下から通れるようにしたいならOneWayPlatformsにします

他にも機能が用意されています。CorgiEnigine/Demosの中からその機能が使われているシーンを探して真似すればできます

#カスタマイズ
私はCorgi Engineのソースコードを直接いじってファイルの位置を変えたらプロジェクトが2回壊れたので直接いじらないようにしています。公式の動画でもその方がいいといってました

Corgi Engineのコードはプロパティとメソッドにほとんどprotectedやvirtualがついているので継承で書き換えられます
ただし、CharacterJumpやCharacterRunといったクラスを継承してキャラクターにアタッチしてもうまく動きません。CharacterJumpやCharacterRunなどはCharacterAbilityを継承しています。これらを他のクラスから取得するためにCharacterクラスにFindAbility()が定義されています。FindAbility()は指定したクラスとまったく同じクラスのコンポーネントしか取得しないので、子クラスのコンポーネントをつけていても取得できないため正常に動作しなくなります。アクション時に音やエフェクトを追加したいなら、Corgi Engineには独自のイベント機能があるのでそれを使ってアクション時に実行させることが可能です

#まとめ
Corgi Engineは楽しいのでぜひ使ってみてください
【VScode】PlantUMLのビューがjava pathエラーで表示されない

#1.今回発生した問題
VScodeでPlantUMLでUMLモデルを書いてる歳，Alt + Dでプレビュー表示すると以下のエラーが表示された

>Cannot find java!
If you've installed java, please add java bin path to PATH environment variable.
Or, configure java executable path with "plantuml.java".

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/f47a0dfb-8c93-2616-b481-5e64152a8acf.png)


翻訳するとjavaがないよ！パス通ってる？って聞かれてるが，
・javaはちゃんとインストールされてる
・PATHも通ってる
っていう状況

Orの後のPlantUMLの設定をいじってね！みたなこと書いてあるので，それをやれば解決するのだが日本語の記事での本情報が見つけられなかったため投稿．

#2.解決手順
##2.1.javaの本体のパスをコピー
PATH通すときはフォルダのパスですが，今回はファイルパスのほうです．
自分の環境では以下にありました．
```C:\Program Files (x86)\Common Files\Oracle\Java\javapath_target_4709203\java.exe```

##2.2.VScode/PlantUMLの設定を開く
Ctrl + , で設定を開く，もしくはファイル > ユーザー設定 > 設定
検索に「PlantUML」と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/03314652-7bc1-0a50-77cf-02e255f1e466.png)

##2.3.設定の編集
設定項目のPlantUML:javaに先ほどコピーしたパスを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/ce6b8c77-c251-82d6-e6a7-9a50674d227d.png)

##2.4.確認
適当にコードを打って，Alt + Dで表示させてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/563e9bfb-de92-3324-4b6e-f0ab9381afa6.png)

#3.結言
PlantlUML:javaにjavaのファイルパスを設定してあげることで，エラーを解決した．
環境構築でハマるとほんとイライラしますよね．参考になると幸いです．
C#で消えない描画アプリを作る

C#で描画した絵を、そのまま消さずに重ねて描画していきたい。
以下のような仕様のプログラムを作る。
・エンターキーが押されたら、マウス座標に四角形を描画する。
・一度描画した四角形は、アプリを消すまで残り続ける。

# 描画アプリ作成
描画については、Paintイベントを使うのが標準らしいので、ピクチャボックスのPaintイベントを使用する。
描画した絵を残すしくみは、一度描画した絵の座標を保存し、毎回これまでに描画した絵をすべて描画することで実現した。
※他に良い方法があれば教えてほしいです。

ソースコード

```C#:drawpolygon.cs
        // キーボード押下イベント
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
                // 画像貼り付け
                pictureBox1.Invalidate();
            }
        }

        // マウスのY座標取得
        private int GetMousePoint()
        {
            return System.Windows.Forms.Cursor.Position.Y; ;
        }
        
        // Paintイベント
        private void PastePicture(object sender, PaintEventArgs e)
        {
            // 座標取得 
            int mouseY = GetMousePoint();

            Brush brush = new SolidBrush(Color.Black);
            PointF point1 = new PointF(0, mouseY - 10);
            PointF point2 = new PointF(pictureBox1.Width, mouseY - 10);
            PointF point3 = new PointF(pictureBox1.Width, mouseY);
            PointF point4 = new PointF(0, mouseY);

            PointF[] curvePoints =
            {
                 point1,
                 point2,
                 point3,
                 point4
            };

            for (int i = 0; i < list.Count; i++)
            {
                e.Graphics.FillPolygon(brush, list[i]);
            }
            // 古いcurvepointを保存する
            list.Add(curvePoints);
        }
```


エンターキーを押したら描画されることを確認できた！
![2020-12-30_16h21_20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/1d859274-eb60-7e2b-2400-331eb7a6bb6c.gif)
[linux] ファイルを指定したサイズで分割する

```shell-session
$ split -b 1m %分割するファイル% %出力ファイル名%
```

* `-b 1m` は1メガバイトずつ分割することを示す
  * `-b 600k` とすると600キロバイトになります
* 出力ファイル名に続いて `aa` `ab` `ac` ... など順番付けの文字が付与されます
Next.jsチュートリアルでデプロイ後に画像が反映されず、詰まったのでメモ

##Next.jsのデプロイについて  

下記のurlを進めていくと画像が反映されず詰まった。
>デプロイについてのチュートリアルはこちら
<https://nextjs.org/learn/basics/deploying-nextjs-app/deploy>
  
next.jsのissueを確認すると同じようなエラーが起きている人がいたためそれを参考にしながら修正した。
>参考
<https://github.com/vercel/next.js/issues/18356>  

####手順1
```  
npm run-script build  
```  
####手順2  
```
next start (npm start)
```

この手順でコマンドを打つことで画像が反映された。  
##まとめ
チュートリアルを進める過程を全てgithubのdiscussionにメモして公開しているので気になったら見てください。

>こちらから
<https://github.com/QuantumBoxOpenSource/document/discussions/15>
未経験文系新人SEがレベルアップしていく話 ~1年目プログラミング書籍編~

社会人1年目ももう12月終わり。
今年を振り返ってみると、業務ではCSSや外部設計が多く、実際のモノづくりはあまりやらなかったのですが、
自学で触ってみた技術で新人が固めておいて割とよかったなと思うものを書いてみます。

入社前の内定者や、就活生、新人教育担当者でアドバイスを探している人が参考になればと思います。

　※まだ成功してないので、これが「正解」というわけではありません。
　　アドバイスやつっこみは大歓迎です。


# HTML/CSS,JavaScript

#### 『高校生からはじめる　プログラミング』(著：吉村総一郎)
https://www.amazon.co.jp/dp/B06Y5R95DQ


入社前に「プログラミング独学でやってみるかー」と思ったときに、有効だった書籍。
当時大学生でしたが、「業界でフかしてる連中は高校生のうちからバリバリにやってるに違いない！」と思って買いましたｗ


vscode入れて本に書いてあるコードを書けば、プログラミングができます。
忠実に書籍のコードを写経できれば、それ以外のエラー(「写経したのになぜかエラーが出てきて解決できない」問題)も多くないため、最初の一歩としてHTML/CSS(とJavaScript)は最適だと思います。

私自身、CやJava、Pythonの名前だけは知っていたり、実際にCの本も買いましたが、初心者がハマる

```
・環境構築
・オブジェクト指向
・「写経したのになぜかエラーが出てきて解決できない」問題
```

の３壁が高すぎていやになってしまいました。


ので、一番最初はHTMLとCSS。
ほかにも良書はたくさんあると思いますが、周りに聞けない独学環境にいるなら
『高校生からはじめる　プログラミング』は1つの最適解ではないでしょうか。


# Java
#### スッキリわかるJava入門 第3版 (スッキリシリーズ)(著：中山清喬・国本大悟)
https://www.amazon.co.jp/dp/4295007803


入社後、会社から配布された一冊。研修を受けながら取り組みました。
集合研修がJavaだったので、研修の課題をカタカタやりながら、本書をペラペラめくりました。
環境構築や講義内容は研修メインで、わからないところを辞書代わりに使う運用でした。

新型コロナウイルスの影響でZoom環境での研修だったので、講師への質問はチャット形式でした。
他の生徒にかかっていて質問の回答が遅いときに、わからない部分を調べると大体解決できました。(最初から調べろという話ですね。とはいえ、他の生徒たちも参考にしていたのでそれはそれということで...)

そんなこんなもありまして、

```
・環境構築
・オブジェクト指向
・「写経したのになぜかエラーが出てきて解決できない」問題
```

の「初心者３壁」とうまく付き合いながらJavaの基礎的な部分を習得できました(業務ではまだ使ってないんですけどね)。

# JavaScript
#### 10日でおぼえるJavaScript入門教室 第3版 10日でおぼえるシリーズ(著：大槻有一郎)
https://www.amazon.co.jp/dp/B0088L98K6</h4>

配属されて、業務一発目は、テーマやCSSなんかを書いていました。
これはこれで勉強になるのですが、今のうちに、
これまで苦手としていたJavaScriptをレベル上げしておこうと思い立ちました。

他プロジェクトの先輩社員に「なーんか良さげなのないスか？」と曖昧で失礼極まりない質問を投げたところ、おすすめいただいた本書をぽちり。

研修でさらっとやった、値の書き換えはもちろん、関数、無名関数、イベント、オブジェクト、通信プログラムまで...
目次を見て、「10日でできるかい！」と一旦床にたたきつけましたが、
10日なんて無視して自分のペースでやりました。
平日が業務で忙しいことや、他の資格試験の勉強もあって3か月くらいかけてゆっくりやりました。


# React.js
#### React.js & Next.js超入門(著：掌田津耶乃)
https://www.amazon.co.jp/dp/B07X7DHZ9F

今やっているのがReactというフレームワークです。
JavaScriptをやってみて、フロントエンドの大部分の技術がJavaScriptを基礎としていることを知り、ひとまずフロントエンドを磨くことにしました。(バックもやってみたいですが、いったん置いておきます。なにか良さげな技術があったら教えてください)

また、例の先輩社員に「なーんか良さげなのないスか？」とまた曖昧で失礼極まりない質問を投げたところ、おすすめいただいたのがReactでした。
Facebookが作ったことや、改良が速く品質も高いことがわかり、ググりまくって情報を集めました。

Reactのチュートリアル(``https://ja.reactjs.org/tutorial/tutorial.html``)
をやってみて、完成まで到達はできたのですが、何が何だかわからない状態でゴールしてしまいました。
結果、「このコードは何をしたいコードなのか」がわからず、他のReact記事をまねても「写経したのになぜかエラーが出てきて解決できない」問題を解決できませんでした。
そこで、ググりまくって良さげな参考書を購入しました。

まだ届いて2日、3/6章目ですが、JavaScriptでやったものが多く出てきて、「JavaScript克服してよかった」と思った勢いでQiita書いています。笑

# まとめ
### 人それぞれにあった道を
`HTML/CSS`,`JavaScript`,`Java`,`React`と紹介しましたが、あくまで1つの進め方であり、正解ではありません。ネットワークやDBに特化したいエンジニアはこれ通りに進めるよりも他の記事を参考にしたほうがいいと思います。
私はフロントエンドに特化したいわけではなく、両方触りたいと思っているので、もう少しやったらバックエンドにも手を出そうと思いますが、フロントを極めたい人はここからさらに自分でトレンドや興味を探してみるのがよいと思います。

### 無理は禁物
「ロケットスタートであれもこれもやりすぎる」
研修先の新人にも多く見られましたが、みな3か月持たず失速してしまいました。
業務に拘束される時間が増えたり、残業があったりと、生活が大きく変わるなかで、まずは「精神力の持久力」を上げていけるとよいのではないでしょうか。

### 楽しくやろう
自学は業務に拘束されない貴重な時間でやることがほとんどだと思います。
トレーニングととらえたり、業務の一環ととらえる考え方もあると思いますが、
2,3番目くらいの趣味としてプログラミングを認識できると、無理なく持続する習慣にできるのではないでしょうか。
[linux] telnetで相手の切断を待たずに終了する方法

telnetでホストに繋いだ場合、大抵は `quit` コマンド等を入れてホスト側から切断するケースが多いですが、クライアント側から切断したいケースもたまにあります。

そんな時は `Ctrl + ]` を押すと、telnetのプロンプトが表示されます。プロンプトで `q` を入れるとクライアントから切断してtelnetが終了します

```shell-session:telnet
telnet> q
Connection closed.
```

telnetのターミナルが効かなくなって強制的に抜け出したい時にも使えます
boost をandroid ndk でビルドする備忘録

## 概要
boost をndkでプレビルドしてからandroid studio上でリンクする。

## 手順
https://github.com/moritz-wundke/Boost-for-Android
ここを基本的にフォローする。

必要なandroid ndk をダウンロードする必要がある。
古いバージョンはunsupported versionのところからダウンロードする必要がある。

また、`./build-android.sh`
の中にビルドするboost のバージョンがハードコードされているため、
これを先ほどダウンロードしたndkのバージョン、gitに記載されている対応表をみて、
バージョンを適宜ハードコードし直す。
Rubyでのclass

\![macOS-11.1](<https://img.shields.io/badge/macOS-11.1-brightgreen>) \![ruby-2.7.2p137](<https://img.shields.io/badge/ruby-2.7.2p137-brightgreen>) 


# Preface (はじめに)

オブジェクト指向の基本的な考え方として, 

-   隠蔽 (capsulation)
-   継承 (inheritance)
-   多形 (polymorphism)

があります.

Rubyに限らず, Pythonや様々な言語でこの考え方が組み込まれています. 


# Class

前に作成したコマンドの引数に名前を入れると挨拶を返す

```ruby:hello_method.rb
def hello name
  puts "Hello #{name}."
end

name = ARGV[0]
hello(name)
```

これを改良して, さらにclass化します. 


### 名前を取得

hello\_method.rbでは, コマンドの引数を返すようにしましたが, これでは, 何も渡さなかった場合, 

```
> ruby hello_method.rb
-> Hello .
```

とただの挨拶だけが返ってきます.

このままでは物寂しいため, gets\_nameメソッドを用意してコマンドの引数に何も渡さなかった時に

```
Hello world.
```

と返ってくるようにします.

```ruby:greeter.rb
def hello name
  puts "Hello #{name}."
end

def gets_name
  name = ARGV[0] || 'world'
  return name
end

name = gets_name
hello name
```


### class化

このコードをclass化します.

```ruby:class_greeter.rb
class Greeter
  def initialize
    @name = gets_name
    puts_hello
  end

  def puts_hello #salute
    puts "Hello #{@name}."
  end

  def gets_name
    name = ARGV[0] || 'world'
    return name.capitalize
  end
end

Greeter.new
```

これを実行すると

```
> ruby class_greeter.rb
-> Hello World.

> ruby class_greeter.rb W
-> Hello W.
```

class化する前と同じ出力を返すものができます.

ここで, 

-   class Greeter: Greeterクラスの定義
-   def initialize: 初期化を施す関数. C++などのコンストラクタと同じような働きかな?
-   @name: メンバ変数
-   Greeter.new: Greeterクラスのインスタンスを生成

はRubyでのclass化での基本となります.


# 参考資料

[チャート式ruby-VI(hello class)](https://qiita.com/daddygongon/items/969ad5112878f6dab844)
FasterRCNN VS EfficientDet(collab環境実装コード)

広島大学で社会基盤(土木)を専攻している３年生です。
現在は１年間休学して建設系のIT企業でインターンをしています。

今回はkaggleなどのコンペで実績を出している物体検出のモデルであるEfficientDetとFasterRCNNの精度を簡単に比較してみました。
後日、GitHubに実装コードを上げておきたいと思います！

#EfficientDetとは
個人的によくまとまっている記事があるので載せさせて頂きます！
[EfficientDetの記事](https://qiita.com/takoroy/items/2850c06e15bb7dfd8e9c)

#今回のデータセット
この御時世なのでマスクのデータセットで試してみました。
[マスクデータセット](https://www.kaggle.com/andrewmvd/face-mask-detection?select=images)

#今回の実装結果
学習のloss
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/d1c13dd5-ad0a-aa5a-b6ff-32f1aaba82d5.png)
val_lossはB０,B1,B2がほとんど精度が変わっていないので今回の出力はB0を評価しています。

「テストデータ全体のIoU」「クラス毎のIoU」「クラスごとのAP」を算出しました。
結果はこちらです！

###EfficientDet
・全体のIoU = 約0.67
・mask_weared_incorrectのIoU = 0.29
・with_maskのIoU = = 0.68
・without_maskのIoU = 0.49

・AP(IoU > 0.3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/1e187f0a-be0d-7c63-fa94-a0eeab403295.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/e59b38fc-29a2-6ac0-09cd-68969f007c22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/cce7a129-d70e-4a3a-1745-9483387c9187.png)

###FaterRCNN
・全体のIoU = 約0.64
・mask_weared_incorrectのIoU = 0.0(検出なし)
・with_maskのIoU = = 0.65
・without_maskのIoU = 0.56

・AP(IoU > 0.3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/98acaec5-1982-c013-9163-6eaceb3b7658.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/04a046c9-52de-ca49-fb95-6da502b84635.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/7b618104-26ea-acd7-c40e-7be3a6e11b62.png)

[感想]
両方ともパラメータなどは適当に設定しているためなんとも言えない結果になりました、、、
使用用途によって変わりそうです、、

##参考資料
・https://qiita.com/tmtakashi_dist/items/863e1781b5252e453b47
・https://github.com/rafaelpadilla/Object-Detection-Metrics#different-competitions-different-metrics
・https://www.kaggle.com/shonenkov/training-efficientdet
ChromebookのLinux環境（crostini）で日本語入力できるようにした

#困ったなあ
筆者はPixelbookを使っている。
USキーボードであるため`Ctrl`+`Space`で日本語/半角を切り替えられるのだが、Linuxターミナル（crostini）上でやってみてもウンともスンとも言わない。
これは困ったというわけで、調べてみるとフォントやらターミナルを入れなければならず手順が煩雑だ。

もっとシンプルに有効化できないものか？

#解決策
`OSのデフォルトのキーボード バインディング / ショートカットを使用する`という設定をオンにするだけ。

やり方は、まずシェルフにあるターミナルのアイコンを右クリックし`設定`をクリックする。
![Screenshot 2020-12-30 at 15.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519665/2aca3110-2b56-8ed6-a9d4-929807688b85.png)

左のメニューから`キーボードとマウス`を選び、一番上に件の`OSのデフォルトのキーボード バインディング / ショートカットを使用する`という項目があるので、これをオンにする。
![Screenshot 2020-12-30 at 15.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519665/85bd1c72-edf4-7119-79b3-22d29aa8810e.png)

以上。

ちなみに、入力ではなく表示の方の言語を変更するには下記の記事を参照。[^a]
[localeを日本語(ja_JP.UTF-8)にする
](https://qiita.com/libra_lt/items/feb65b1742d9508740a9)

[^a]: 「よくわからないでやったら日本語表示になっちゃった」もこう書くとデキる人っぽくなります。;)
M1チップ な Macbook で SciPy, scikit-learn を利用可能にする

2020年11月より、M1 CPU (Apple Silicon)が搭載された、 Macbook Air/Macbook Pro/Mac Mini がリリースされました。しかしながら、従来のMacのように Macports から引っ張ってきても、Aarch64 ネイティブアプリが少ないことに嘆いている人も多いと思われます。

今回は、Python3.8 上で、（Macports ではちゃんと動かない）SciPy （こちらは2021年2月から公式にビルドできるようになった！）と scikit-learn をビルドして、まあなんとか動いているので、そのTIPSを。

# MacPorts について＆その設定方法。
@tenomoto さん記事[MacPortsの紹介](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)を見てください。M1 CPU でもやり方は変わりません。ファイルの置き場所は素直に

```
/opt/local 
```
に置きましょう。

## ローカルリポジトリ設定
はてなブログ記事[MacPorts で自家製 ports を使う方法](https://passingloop.hatenadiary.org/entry/20110907/p1)を参考に、レポジトリ設定ファイルに、ローカルリポジトリの URL を設定します（ここでは自分のホームディレクトリにディレクトリ "ports" を作成してます。）。

```
 % mkdir ~/ports
 % cat /opt/local/etc/macports/sources.conf
....
....

file:///Users/XXX/ports ＃## <=== 新しく追加 ###
rsync://rsync.macports.org/macports/release/tarballs/ports.tar [default]
```

## ローカルリポジトリに設定ファイル追加
適当なフォルダで以下コマンドを実行します。

```
 % git clone https://github.com/gdaisukesuzuki/Macports_tensorflow_macos
```

すると、ports というフォルダが作成され以下にフォルダやファイルがぶら下がってます。
今回は以下コマンドを実行すればよいでしょう。

```
（ディレクトリ移動しない）
 % mkdir ~/ports/python
 % (scipy は macport レポジトリのが動くようになったのでコピー不要)
 % cp -pr ports/python/py-scikit-learn ~/ports/python/
 % cd ~/ports
 % portindex
```
最後のportindexを実行することで、コマンド port 実行時に、ローカルリポジトリを参照するようになります。また、py-scipy や py-scikit-learn は、本家 macports リポジトリに登録されていますが、この操作でローカルに置かれた方を優先します

# 必要なもののインストール
port コマンドの使い方はわかっているものとして進めます。
## gcc-devel/libgcc-devel
インストール前に、ld64, cctools については事前に以下のように設定して入れてます。

```
ld64 @3_3+ld64_xcode
ld64-xcode @2_3
cctools @927.0.2_6+xcode
```

あとはport install でそのまま導入してください。

```
libgcc-devel @11-20210101_0
gcc-devel @11-20210101_0
```

## Python3.8
そのまま導入でOK

```
python38 @3.8.7_0
```

## py38-numpy
インストール前に、OpenBLAS については事前に以下のように設定して入れてます。

```
OpenBLAS @0.3.13_0+gccdevel+lapack
```

あとはport install で以下の形態で導入してください。

```
%sudo port install py38-numpy +openblas +gccdevel -gfortran -universal

py38-numpy @1.19.5_0+openblas
```

## py38-scipy
port install で以下の形態で導入してください。

```
%sudo port install py38-scipy +openblas  -universal

py38-scipy @1.6.0_0+gfortran+openblas
```

## py38-scikit-learn
port install で以下のように導入してください。

```
%sudo port install -s -v -d py38-scikit-learn +gcc-devel

py38-scikit-learn @0.24.1_0
```

#おことわり
この記事は、筆者以外の方の環境でも同様に成功することを保証するものではありません。**ビルドや動作確認の失敗**、（ないとは思いますが）**環境が破壊されても責任は一切負いかねます**（基本的には自己責任でお願いします。わかっておられるとは思いますが）。

まだふわっとしか把握してませんが、マルチプロセス動作を設定した操作が動作しない（異常停止じゃなくてサブプロセスの終了を親が確認できてない）ためなのか、pytest の一部が通りません。また、MacbookAir pytest を行うと、CPUが熱量持ちすぎてシステム全体を道連れにして異常終了することがあります。

そもそも OpenBlas 依存なので、Apple Silicon の GPU とか Neural Chip とか全く使ってないですし。

#今回紹介したリンク
[https://github.com/gdaisukesuzuki/Macports_tensorflow_macos](https://github.com/gdaisukesuzuki/Macports_tensorflow_macos) ... 自家製Portfile について。Apple提供のM1向けtensorflow を導入するための設定も入れてます。

#記録
1. (2020.12.30 15:40 JST)...初版
2. (2020.1.3 18:45 JST)... scipyのバージョンを 1.6.0 リリース版にあげた。scipy/numpy のコンパイラを gfortran でなく gccdevel に変更
3. (2021.1.10 10:00 JST)...gcc,numpyのバージョン更新を反映
4. (2021.2.14 18:20 JST)...scikit-learn のバージョンを0.24.0 => 0.24.1 に更新
5. (2021.2.15 10:05 JST) ... scipy は macports レポジトリで対応できる。
やったー！地上波映画リマインダーできたよー

正月に天気の子が地上波で放送になったり、パラサイト 半地下の住人が放映になったりと、何かと映画の話題作がテレビで放送されるのが年末年始ってもんですが、いかんせんこういうのはどこで放送情報を見たらいいのかとか、放送予定を書いてるメディアを知っていたとしても、毎日いちいちその情報を全て見ている訳では無いので必要なときに自分が見たかった映画の放映情報をメールで知らせてくれたらいいなあと思って作りました↓

<a href="https://github.com/hideq1123/chijouha-eiga-reminder">https://github.com/hideq1123/chijouha-eiga-reminder</a>

本来であれば「もじアドレス」のように、UIをかっちり整えることができればカッコイイのですが、そういうのは時間がかかるのでやりませんでした。なぜなら既に「TV番組リマインダ」とか「地上波初映画オシラセ」といったスマホアプリがあるからです。だけど、そういったアプリはリマインド機能がちょっと求めてるものと違うなと思ったので今回自分でphpファイルのみですが作りました。

少し過去の映画で見たい映画があるのにいつも地上波で録画するのを忘れてしまうというかたには最適だと思います。因みに自分はジュラシックワールドとか永遠の0とかを登録しました。このmovie.phpをcronで一日一回動かすようにすれば、見たい映画がヒットしたときだけメールが飛びます。詳しい使い方はフォルダ内の「使い方.txt」を読んで下さい。

(この記事は<a href="https://figreen.org/it/">自分のブログ</a>からもってきたものです)
VBAの負債問題について

基本的に業務を一番知っている人が作るEUC(End User Computing)はアジャイル思考だと思うので、成果物最優先になります。
さらに、負債問題が起きるということはそれだけ生産効率が高いということで、JavaやPythonに比べてもその成果物の量は比較にならないでしょう。

また、日本人に特化した話ですが、そもそも変数や関数などに効率的な表意文字である漢字を使うことで、かなりの負債問題は改善できると思います。
あと、シート内に閉じた処理はシート関数内で、シート間にかかわる処理はThisWorkbook関数内で、共通関数は標準モジュール内で、PrivateとPublicを適切に使うなど、というような規則と命名規則の整備などでも生産性や保守性の向上にも寄与できますね。
TensorFlowでモデルの重み（Weights）を手動で設定してみる

TensorFlowではモデルの重みは通常トレーニングによって学習させますが、手動で設定してたのでメモ。

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を使います。

**モデルを作る**

全結合層が１つだけのシンプルなモデルを定義します。

```Python:NoteBook
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential()
model.add(layers.Dense(1,input_shape=(1,)))

model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])
```
**重みを確認してみる**

```Python:NoteBook
W = model.get_weights()
W
# 出力結果
# [array([[-0.56507134]], dtype=float32), array([0.], dtype=float32)]
```

重みは１つだけです。この時点ではランダムな値です。

**重みを設定してみる**

重みを設定してみます。

```Python:NoteBook
W[0][0][0] = 1.1
model.set_weights(W)
```

**モデルを動作させてみる**

モデルに0〜19の数字の配列を与えてみます。

```Python:NoteBook
x_train = np.arange(20).reshape((20,1))
model.predict(x_train)
# 出力結果
# array([[ 0.       ],
#        [ 1.1      ],
#        [ 2.2      ],
#        [ 3.3000002],
#        [ 4.4      ],
#        [ 5.5      ],
#        [ 6.6000004],
#        [ 7.7000003],
#        [ 8.8      ],
#        [ 9.900001 ],
#        [11.       ],
#        [12.1      ],
#        [13.200001 ],
#        [14.3      ],
#        [15.400001 ],
#        [16.5      ],
#        [17.6      ],
#        [18.7      ],
#        [19.800001 ],
#        [20.9      ]], dtype=float32)
```

0〜19の数字に重み1.1を乗じた数字になっていますね。

**最後に**

NoteではiOS開発、とくにCoreML、ARKit、Metalなどについて定期的に発信していますので。
https://note.com/tokyoyoshida

Twitterでも発信しています。
https://twitter.com/jugemjugemjugem
設定ファイルを.ini等でなくPythonで書いて与える形の試行

設定ファイルを.ini等でなく、**設定ファイルもPythonで書いて与える形**を試行してみます。

Pythonで書いて与える設定ファイルは、「config(cfg)」関数の中に設定を書いて、「cfg」オブジェクトに設定値を代入することにすると、以下「trial-config1.py」のようなもの(例)。

**関数の戻り値**や、**場合分けして**設定可能。別の設定ファイルを読み込んで上書き(ネスト)も可能。

```Python:trial-config1.py　(設定ファイル)

# -*- coding: utf-8 -*-

# pyによる設定ファイル

import socket

# sec: config

def config(cfg):
    
    # sec: cfgに設定値を代入する形
    
    cfg.setting1 = True
    
    # sec: 関数戻り値を設定可
    
    cfg.name = socket.gethostname() # ホスト名 (★関数戻り値を設定可)
    cfg.ip = socket.gethostbyname(cfg.name) # IPアドレス
    
    # sec: 場合分けして設定可
    
    if "PC" in cfg.name: # (★場合分けして設定可)
        cfg.setting2 = True
    
    # sec: 階層的に設定可
    
    cfg.setting3 = cfg.__class__() # (★階層的に設定可)
    cfg.setting3.setting1 = True
    
    # sec: 設定ファイルのネスト可
    
    __import__("trial-config2").config(cfg) # (★設定ファイルのネスト可) 
```

別の設定ファイルも、「config(cfg)」関数と「cfg」オブジェクトを使う形にして、以下「trial-config2.py」のようなもの(例)。

```Python:trial-config2.py　(設定ファイル)

# -*- coding: utf-8 -*-

# pyによる設定ファイル

# sec: config

def config(cfg):
    
    # sec: 元の設定値を上書き
    
    cfg.name += " + 上書き"
    cfg.ip += " + 上書き"
    
    # sec: 新しい設定値を代入
    
    cfg.setting11 = True
```

「trial-config1.py」と「trial-config2.py」は、以下のように置く時、

```:ファイル構造:

アプリ側スクリプト.py
trial-config/
  trial-config1.py (設定ファイル)
  trial-config2.py (設定ファイル)
```

アプリ側で、前記のPythonで書いた設定ファイルを読み込んで利用するには、「**__import__("trial-config1").config(cfg)**」等で読み込み、「cfg」の中の各値を用いる形にして、以下コード。

```Python:アプリ側スクリプト.py

# -*- coding: utf-8 -*-

# pyで設定定義ファイルを構成・ネストする方法

import sys

# sec: main

def main():
    
    # sec: 格納クラス
    
    class Config: pass
    cfg = Config()
    
    # sec: 読込
    
    sys.path.append(r"./trial-config/")
    __import__("trial-config1").config(cfg)
    del sys.path[-1]
    
    # sec: 結果表示
    
    for key, val in cfg.__dict__.items():
        print(f"{key}: {val}")

"""コンソール出力例:
setting1: True
name: PC1 + 上書き
ip: 192.168.0.1 + 上書き
setting2: True
setting3: <__main__.trail__py_config_file.<locals>.Config object at 0x0>
setting11: True
"""

# sec: entry

if __name__ == "__main__": main()
```

「cfg」内の設定値が全てコンソールに表示されます。アプリ側では「cfg.setting1」のようにして、設定値を利用可に。
第13回(thor,rubocop)

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# thor

いくつかの振る舞いを一つのコマンドに持たそうとすると，オプションなどを適切に扱う必要が出てくる.そのためにいくつかのCLI builder gemsがあり,ここではthorを学ぶ.

まずは

    gem install thor

前作ったhello\_rubyに組み込む

```ruby
require 'thor'
require "hello_rudy/version"

class HelloRudyCLI < Thor
  desc "hello NAME", "say hello to NAME"
  def hello(name)
    puts "Hello " + name
  end
end

HelloRudyCLI.start(ARGV)
```

これでほぼ動く．CLIという文字列がclass名の最後にないとダメ.

ちゃんと動かすには，さらに修正.

    > in hello_rudy.gemspec
      spec.add_runtime_dependency('thor')
    
    > bundle update
    > bundle install
    
    > cat lib/hello_rudy/version.rb 
    class HelloRudy　#
      VERSION = "0.1.0"
    end

で出来上がり．

bundleでlocalに動かしてみると

    > bundle exec exe/hello_rudy
    Commands:
      hello_rudy hello NAME      # say hello to NAME
      hello_rudy help [COMMAND]  # Describe available commands or one specific command
    
    > bundle exec exe/hello_rudy hello Rudy
    Hello Rudy

と動く.


# rubocop

規約通りにコードが書かれているかをチェックしてくれるもの.

タブとか空白のformatといった簡単なチェック以外に，method lengthとabc sizeというのがある.method lengthはデフォルトは10行以上だと警告．abc sizeというのは，

-   Assignment : 変数への代入
-   Branch : メソッド呼び出し
-   Condition : 条件文

なんかを勘定して基準値を超えると警告．

こんなツールまであるなんてメソッドを短く書くのは本当に重要だとわかる.



------
 - **source** ~/grad_members_20f/members/yoshida/c06_thor.org
CASL2で汎用レジスタGR0をゼロにする

CASL2で汎用レジスタGR0をゼロクリアする方法をまとめます。
WCASL-IIというシミュレータで確認済みです。

```
MAIN  START
    LAD    GR0,0
    LD     GR0,=0
    SUBA   GR0,GR0
    SUBL   GR0,GR0
    XOR    GR0,GR0
    AND    GR0,=0
    SLL    GR0,16
    SRL    GR0,16
    RET
    END
```
npm 調べてたら凄い事を発見した!!!

`npm xmas` でクリスマスツリー出てきた :flushed:

```bash
$ npm xmas

                     ★
                    ／＼
                   ／  ＼
                  ／   @＼
                 ／⸮    &＼
                ／& i     ＼
               ／⸛     ⸮   ＼
              ／           ⁂＼
             ／@ ⸮   ⸮     ｡ ＼
            ／i⸛⸛ ⸛i⁂i  @  ⸮& ＼
           ／  ⁂ i ⁂ ⁂   @    ⸮＼
          ／    ⸛  @ ⁂& &    ⸛ @＼
         ／             @｡ &     ＼
        ／ ⸮  ⸛@  ｡   ｡&@      @ i＼
       ／@ ｡@&⸛     ⸮⁂    @      ｡⁂＼
      ／⸮@  ⁂ @ &  ⁂ ⁂   ⸮ i&  ｡ i  ＼
     ／｡⁂   @@   ⸛⁂⁂⸮ @     ⸛ &⸛ i   ＼
    ／   ⸮⸛    @     ⸛  &｡  @  ⸛   ⸛ @＼
   ／&     ⸛   @⁂  i⸮ ⸮ i@  ⸮@ i⸛   @ i＼
  ／  ⸛ ⸮  ｡⁂⁂｡ ⸛ ｡ i ⸮ ⸮  ⁂⸛ ⸮  ⁂⸛  i@ ＼
 ／ ⸛              ⸛     i⸮     &⁂ ｡   ⸮i＼
 ^^^^^^^^^^^^^^^^^^^|  |^^^^^^^^^^^^^^^^^^^
                    |  |                   
```
よく使うコマンドたちをメモしておく記事

## はじめに

仕事でよく使うコマンドをメモしておく(随時更新)。

## MYSQL

MySQLに入るとき

```
mysql -h <ホスト名> -u <ユーザー名> -p<パスワード>;

例
mysql -h hogehoge -u root -p`cat piyo.txt`;
```

MySQLからダンプを取るとき

```
mysqldump -h <ホスト名> -u <ユーザー名> -p<パスワード> <db名> > <ファイル名>;

例
mysqldump -h hogehoge -u root -p`cat piyo.txt` fuga > mysql.dump;
```

踏み台サーバーとかからSQL叩いてファイルにするとき

```
mysql -h <ホスト名> -u <ユーザー名> -p<パスワード> <db名> -e "<SQL>" | <sedとか加工用コマンド> > <ファイル名>;

例
mysqldump -h hogehoge -u root -p`cat piyo.txt` fuga -e "SELECT * FROM testers" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > output.txt;
```

## Redis

redisに入るとき

```
redis-cli -h <ホスト名>
```

## SCP

```
scp <ユーザー名>@<SSH先のホスト名もしくはIP>:<SSH先のお目当てのファイル> <ファイルを落としたいローカルのパス>

例
scp user1@hoge_server:/hogehoge/piyo/output.txt /Users/user1/output.txt
```
MacでGoogle Chromeが起動しない時の対処

# 環境

MacBook Early 2015
macOs 10.15.7

# 症状
突然Google Chromeが起動しなくなりました。

# 対処方法
アプリケーションのChromeのフォルダーの利用者のアクセス権を「読み出しのみ」から「読み/書き」に変更する方法もあるようですが、Chromeに対してフルディスクアクセスを有効にすることで起動できるようになりました。

手順は以下のとおりです。

1. システム環境設定を開く
2. セキュリティとプライバシーを選択
3. プライバシータブを選択
4. 左に表示されるリストから「フルディスクアクセス」を選択
5. 左下のカギアイコンをクリック
6. パスワードの入力が求められるので入力する
7. 右に表示されるリストの枠の下にある「+」をクリックする
8. アプリケーションの一覧が表示されるので「Google Chrome」のアイコンを選択し「開く」をクリックする

以上でまた起動できるようになりました。

# 参考にさせていただいた記事
[Macで何を試してもGoogle Chromeが起動しない時の対処法（ファイル削除しません）](https://qiita.com/Monji_24/items/0c4a3fd1f1a961b3ea21)
[macOS 10.14（Mojave）でフルディスクアクセスを有効にする](https://support.intego.com/hc/ja/articles/360016683471-macOS-10-14-Mojave-でフルディスクアクセスを有効にする)
Google ColaboratoryでMyDriveへのマウントとipynbファイルの読み込みで躓いて解決した時にやったこと

##躓きポイント１： Google MyDriveへのマウント

####以下は実行エラーになった

```bash
import os
os.chdir("./drive/My Drive/")
```

####以下だとうまくいった

```bash
from google.colab import drive
drive.mount('/content/drive')
```

##躓きポイント2： Google Drive内のディレクトリ移動

Pythonのosモジュールでディレクトリ移動コマンドを実行すると、エラーになった。####以下だとうまくいった
「!」をつけて、bashコマンドを実行するとうまくいった。

__以下、*causal_inference*は、Google MyDrive直下に作成済みのディレクトリの名前です。__

```bash
!cd("./drive/My Drive/causal_inference/")
```

##躓きポイント3： iPythonノートブックファイル（拡張子：.ipynb）の読み込み

Google MyDriveのディレクトリに格納したiPythonノートブックファイルをコマンドで読み込み、実行しようとしたところうまくいかなった。

####以下だとうまくいった

Coplaboratoryの画面上部にあるボタンを、GUIで操作することで、iPythonノートブックファイルを、Colaboratoryに読み込ませることができた。

#####__「ファイル」__ -> __「ノートブックをアップロード」__ -> __「Google ドライブ」を選択__ -> __Google MyDriveに保存済みのipynbファイルを選択__

##（ ipynbファイルの一括実行 ）

以下で、Colaboratoryに読み込んだiPython notebookファイルに記述されているすべての（セルの）コードを、上から下にすべて一気通貫して実行することができる。

####__「ランタイム」__ -> __「すべてのセルを実行」__