OmniAICreator/Qiita-1.07M huggingface dataset:
Rustの文字列結合はどうしてString+&strなのか

## TL; DR;

文字列の2項演算 + が `String` + `&str` になっている理由：

- 効率よく計算するため一方はムーブ(`String`)になっている
- 足されるほうは借用で事足りるため借用(`&str`)になっている

## 2つの文字列型

Rust には2つの文字列型があります。

- `&str` - 文字列スライスとも呼ばれるプリミティブな文字列型。
- `String` - 標準ライブラリの提供する文字列型。文字列操作などに使う。

ざっくり理解すると借用が `&str` で、所有権があるのが `String` と覚えておくとよさそうです。

`&str` と `String` は相互に変換できます。

```rust
// 文字列リテラルは &str
let s = "hello";

// String の初期化
let s = String::from("hello");

// &str -> String
let s = "hello".to_string();

// String -> &str
let s = String::from("hello").as_str();
```

## 2項演算 + でコンパイルが通るのは？

それではクイズ。文字列は2項演算 `+` で結合できますが、次の4つのパターンのうち、コンパイルが通るのはどれでしょうか？

```rust
// &str + &str
"hello" + "world";

// String + &str
String::from("hello") + "world";

// &str + String
"hello" + String::from("world");

// String + String
String::from("hello") + String::from("world");
```

正解は、2番目の `String` + `&str ` です。他の3つはコンパイルエラーになります。

## なぜ `String` + `&str` なのか

なぜ文字列の結合 + は `String` + `&str` だけが可能なのでしょうか。答えは2項演算 + の定義にあります。

2項演算 + はトレイト std::ops::Add が実装されている型で使えます。

https://doc.rust-lang.org/stable/std/ops/trait.Add.html

2項演算は関数呼び出しのシンタックスシュガーと考えられるので、左の項と右の項は関数に与える引数と同じように、Rust の所有権の考え方が適用されます。

そこで、所有権の観点から考えてみましょう。

`String` は所有者、`&str` は借用なので、上で考えた4パターンは足し算に与える引数を

- (借用) + (借用)
- (ムーブ) + (借用)
- (借用) + (ムーブ)
- (ムーブ) + (ムーブ)

というパターンで考えていることになります。

ところで、引数を借用にすべきかムーブにすべきかは、「必要がない限りはできるだけ借用にし、必要なときにだけムーブにする」という原則で考えるとよいでしょう。

というのも、引数を借用にしておけば、関数呼び出しが完了したら変数を元のスコープに返すことができますが、引数で所有権をムーブすると、基本的には所有権が返ってこないからです。関数に変数を渡しただけで以後その変数が使えなくなるのは不便ですよね。

この原則で考えると、文字列の足し算では少なくとも一方は借用で事足りそうです。たとえば足されるほうの文字列は、どんな文字列なのかを知りたいだけなので所有権までは欲しくないからです。

では、どちらか一方はムーブである必然性があるのでしょうか？

API ドキュメントにその理由が説明されています。 文字列の + は `String` の中で定義されています。

https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-Add%3C%26%27_%20str%3E

これによると、+ 演算で毎回新たな `String` をコピーしてメモリを確保すると効率が悪いため、渡された `String` を再利用して結合文字列を作るそうです。

それを行うために所有権のムーブが必要だというわけですね。

よって、+ 演算の一方がムーブで他方が借用である理由がわかりました。

最後に 「`&str` + `String`」 ではなく「`String` + `&str`」になっている理由ですが、これはおそらく `String` が文字列操作の標準ライブラリだから `String` 側に + 演算を実装したからだと思われます。
Blenderで、ペンダントっぽいものを作る

## 作るもの

Blenderで以下のようなものが簡単に作れたので紹介します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/db17108e-11fd-d267-efdb-a857543e06e6.jpeg" width="400">


## 手順

- 追加メニューのメッシュのグリッド（Grid）
- モディファイアーのデシメートを追加し、分割の復元にし、反復を１に
- モディファイアーのワイヤーフレームを追加し、幅を0.03に
- モディファイアーのサブディビジョンサーフェスを追加し、シンプルにし、ビューポートのレベル数とレンダーを4に
- モディファイアーのキャストを追加し、係数を2.7に

メッシュを編集することなくきれいなオブジェクトができました。

以上
XCTest を使った iOS アプリのテストについて

# XCTest

XCTest というフレームワークを利用することで、 iOS アプリの自動テストを簡単に実装することができます。

Reference: https://developer.apple.com/documentation/xctest

## デバッグ

`XCUIApplication.debugDescription` function を利用することで、テスト対象のアプリの UI の要素、およびそれらの階層構造を知ることができます。
テストが期待通りに動かなかった際に、デバッグのために以下のようなコードをテストコードに挿入することがよくあります。

```swift
print(app.debugDescription)
```

Reference: https://developer.apple.com/documentation/xctest/xcuielement/1500909-debugdescription

## 特定の UI 要素の取得方法

SwiftUI において以下のように　 NavigationLink が複数表示(`entries` に含まれる要素の数だけ NavigationLink が表示)される場合、

```swift
ForEach(entries, id:\.self) { entry in
    NavigationLink(destination: DetailView(entry: entry)) {
        CompactView(entry: entry)
    }
    .accessibility(identifier: "EntryNavigationLink")
}
```

テストコードにおいては以下のように　`identifier`　を利用することで要素の数(`entries` の数)を確認できる。

```swift
app.buttons.matching(identifier: "EntryNavigationLink").count
```
テグスを使ってRaspberry pi picoにピンヘッダをたてる

#はじめに
　Raspberry pi picoは、600円程度で入手容易なマイコンボードです。

https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/44d63213-b8eb-aafc-896f-28c1a3c41937.png)

　電子工作への活用を検討している場合、ピンヘッダをたてる必要がありますが、はんだ付けをしなければいけません。
　はんだ付けを避けてジャンプワイヤで何とかしたい場合、スルーホール用テストワイヤなどを使う必要があります。　

https://www.sunhayato.co.jp/material2/ucb12/item_548

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/ff3b5023-6076-7b1b-e2e5-7cf6d6010e7d.png)

　スルーホール用テストワイヤは、接続部分がばね状になっているので、スルーホールに刺さったら抜けにくくなるという、大変便利な道具ですが、ピンヘッダを立てて汎用性の高いジャンプワイヤを使う方が、よりお安く作業ができます。
　はんだ付けを行わずに、ピンヘッダを立てる方法を考えてみました。

#Picoの穴とピンの太さ
　Raspberry pi picoのスルーホールの直径は約1 mmで、ピンヘッダのピンの太さは約0.6 mmです。ピンヘッダの隙間を埋めることのできる材質を導入できれば、スルーホール内の金属部分にピンヘッダのピンを押し付けることで、導通が実現することとなります。

#テグスを使う
　ネックレスやビーズアクセサリ作製に用いられる手芸用テグスには、以下のような規格のものが販売されています。

|品名|太さ|
|:---:|:-----:|
|1号|約0.17 mm|
|2号|約0.23 mm|
|3号|約0.29 mm|
|4号|約0.33 mm|
|6号|約0.40 mm|
|8号|約0.47 mm|

　今回の基板の穴とピンヘッダの直径から、直径0.33 mmの4号のテグスを使うことにしました。
![IMG_20220122_22080102.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/804e687c-e72f-dd1d-6e25-3ce09a1615ac.jpeg)

　まず、テグスで基板の穴を波縫いします。
![IMG_20220122_2224022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/5b46aeee-5be6-00b8-c6a7-c0314946e59e.jpeg)

　基板の表面に出ているテグスの部分を赤線で示しました。
ヘッダピンを裏から差し込みますので、テグスの端は上向きに飛び出しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/45411704-9498-6de1-27f2-446a846d90ba.png)

　基板を壊さないようにピンヘッダを差し込むと、下図のようになります。

![IMG_20220122_2236322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f6fbdc9e-2606-d113-4604-524a83f305d6.jpeg)

　ピンヘッダを差し込んだ後に余分なテグスを切り取って完成です。
ピンヘッダとテグスの位置関係がわかるよう拡大写真を下に示します。
ピンヘッダの2か所の角がスルーホールの壁に押しつけられています。
ブレッドボード上で回路を作る程度ですと、問題なく使えます。

![DSCF2660 (3).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/9db9ba3f-7777-22bb-31b4-d4f81a0296c0.jpeg)

　注意点は以下の2点です。
1. ちょうどいいテグスを使用しているかを確かめるには、基板の端の2つの穴にさして、少数のピンを差し込んで、差し込みにくいか、抜けやすいかを確認することです。
2. 基板、ピンヘッダとテグスの組み合わせがあわなくて、ピンヘッダを差し込みにくい場合はより細いテグスを、すぐ抜ける場合はより太いテグスを使うようにしてください。

　ピンヘッダを差し込むのが難しい時は、無理をせずにより細いテグスを使いましょう。私の使用したテグスは200円でおつりがくる値段ですので、複数種類手元に置いておき、基板の穴の大きさとピンヘッダとの太さに合わせて、すばやく対応できるようにするといいでしょう。
　<font color="Red">**くれぐれも、基板を壊さないように作業しましょう。**</font>

参考文献
https://hackaday.com/2021/12/16/using-fishing-wire-to-hold-in-pin-headers-is-a-nifty-trick/
importのパスにエイリアスを指定する方法

## はじめに

プロジェクトが大きくなると、コードが多くなり、階層構造も複雑になるため、パス指定が複雑になってしまいます。

```
import UseEffectHookExmaple from './../../useEffect'
```

## webpackのresolve.aliasにパスを指定する
```
resolve: {
    alias: {
      '@practice': path.resolve(__dirname, './src/practice'),
    },
},
```

絶対パスなので階層構造気にせず指定できるので、パスを間違えずにモジュールをimportできます！

```
import UseEffectHookExmaple from '@practice/useEffect'
```

## TypeScriptの場合は、tsconfig.jsonにも設定が必要
baseUrlとpathsに設定が必要です。
https://qiita.com/Nekonecode/items/09b26deec21a5f83adb1
baseUrlは、上記の記事が分かりやすいです！

```
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      // alias
      "@practice/*": [
        "src/practice/*"
      ]
    }
  }
}
```

以上
テスト59


```vb
'Excel
Sub Excel_SQL()
'-----------------------------
'参照設定
'Microsoft ActiveX Data Objects 6.1 Library

'ｶﾀｶﾀ＼＿ﾍ('ω'ｏ)＜AccessのRDBとSQLを使う程ではないけど、
'ExcelのVBAや関数だけでは操作が難しい場合を考慮し、ExcelVBA
'でExcel内のデータを使ってSQLを使えるようにするためのメモ
'-----------------------------

Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim MyPath As String
Dim i As Long

Set CN = New ADODB.Connection
Set RS = New ADODB.Recordset


MyPath = ThisWorkbook.FullName

CN.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & MyPath & ";" & _
        "Extended Properties='Excel 12.0;HDR=YES' "

Set RS = CN.Execute("SELECT *" & _
                    "FROM [テストデータ$] " & _
                    "WHERE 商品カテゴリコード = 'W811'")

i = 2

With ThisWorkbook.Sheets("テスト出力")
    
    .Cells.Clear
    
    .Range("A1:E1").Value = Array("NO", "商品カテゴリコード", "商品コード", "管理コード", "価格")

    Do Until RS.EOF
    
        .Cells(i, 1).Value = RS!NO
        .Cells(i, 2).Value = RS!商品カテゴリコード
        .Cells(i, 3).Value = RS!商品コード
        .Cells(i, 4).Value = RS!管理コード
        .Cells(i, 5).Value = RS!価格
        
        i = i + 1
        RS.MoveNext
    
    Loop
    
    .Columns("A:E").AutoFit

End With

RS.Close
CN.Close

Set RS = Nothing
Set CN = Nothing

MsgBox "処理が終了しました。", vbInformation

End Sub
[UE4] アニメーションアセットを常に新規ウィンドウで開くようにする

#前置き
UE4を使っていて個人的に一番不便だと感じるのが、アニメーションアセットを開いた時に、既に開いているアニメーションアセットがあると、同じタブで開かれてしまうことだ。

一応、アセットを右クリックして`Open In New Window`を選択するか、`Shift+ダブルクリック`で開くことで新規ウィンドウで開くことが出来るが、間違って普通にダブルクリックしてしまうと、前に作業していたものが閉じられてしまい、非常に面倒なことになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601695/72336cac-793b-a6b0-339b-97be4fdba4cb.png)

また、そこに関するEditor設定のようなものは、発見できなかった。

環境はUE4.27を使用。

#解決策
結論から言うと、エンジンを改造した。

アニメーションアセットを開いた時に以下の関数が呼ばれるが、`OpenAnimAssetEditor`の第二引数が新規ウィンドウで開くかどうかのboolになっているため、ここをtrueにすることで、常に新規ウィンドウで開くようになる。

```Engine\Source\Developer\AssetTools\Private\AssetTypeActions\AssetTypeActions_AnimationAsset.cpp
void FAssetTypeActions_AnimationAsset::OpenAssetEditor( const TArray<UObject*>& InObjects, TSharedPtr<IToolkitHost> EditWithinLevelEditor )
{
	OpenAnimAssetEditor(InObjects, false/*bForceNewEditor*/, EditWithinLevelEditor);
}
```

もっとスマートな方法があれば教えてください...。
【Salesforce】【資格】Salesforce 認定アドミニストレーター 合格までのあれこれ

～2022.01.29 追記～ [各試験の受験記と勉強メモ](https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd)を投稿しました！

当記事は受験体験記です。
※2022年1月に1年半前（受験時期2020年7月）を思い出して書いてます。
※あくまでもぴえさん個人の考えです。

# Salesforce 認定アドミニストレーター とは　（ざっくり）
・Salesforceに携わる人がまず一番最初に受ける基礎中の基礎の資格
・誰でも受験可能（受験資格等はない）
・Salesforceのユーザが利用できる機能、システム管理者が利用できる設定など幅広い出題範囲
・受験料：税込22,000円
・90分60問（合格基準は65％以上）
・選択式
・試験終了後、即座に合否がわかる

# ぴえさんの受験記録
受験当時は1か月ほどTrailheadは進めていましたが、Salesforce経験は一切なしでした。

【受験日程とバージョン】
日時：2020/7/29　13：15
受験方法：オンサイト受験（最寄りの会場）
バージョン：Spring ‘20

【受験データ】
ウェブアセッサーのスクショ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/f0754b33-ee55-5a5f-d323-43fd3824d13e.png)

分かりにくいので表にしました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/b0dfc25f-d531-37c6-e777-41e33debbeb8.png)

【感想】
・初めてのSalesforce試験でとても緊張していた気がします。
・オンライン受験はおすすめされなかったので、オンサイト受験を選びました。
・当時はアドミン試験の予想問題や体験記がほとんどなく、有名な2サイトにお世話になった覚えがあります。
・試験勉強は一週間前から始めました。
・Salesforce独特な日本語＋専門用語で解くのにギリギリまで時間を要しました。
・予想問題の問題がそのまま出たりもしましたが、初めて聞く単語やよく分からない機能で混乱しました。
・３試験受けた今思うのは、全部を網羅するのは無理なので取れるとこしっかり取ることを心がけましょう！

# 勉強方法

１．受験ガイドを読む
　　　[資格一覧ページ](https://tandc.salesforce.com/credentials)から取得できます
２．Trailheadの↓トレイルをする
　　　[【Salesforce公式】認定アドミニストレーター資格 対策](https://trailhead.salesforce.com/en/users/welcome4/trailmixes/prepare-for-your-salesforce-administrator-credential)
３．ウェビナー（できるだけ新しめ）などの公式が出した演習を解く
　　　[Salesforce資格のウェビナー開催情報](https://www.salesforce.com/jp/campaign/trailhead-academy/certification-days/)
４．個人が出している練習問題を解く
　　現在ではクイズレットや個人サイトなど沢山出ていますので、どれか自分に合うものを利用するといいと思います(^^)/
　　最新機能が試験に盛り込まれるので、更新日が新しめのものが良いですね！
　　個人的にはこちらのnoteが気になりました↓

https://note.com/salesforce777

アドミンに限って言えば、Salesforce公式ヘルプを見るのは余力がある方だけでいいと思います。
私は当時Salesforce実務経験がなかったのでヘルプを見てもチンプンカンプンでした。

Salesforceの他資格についてはこちらの記事にまとめています↓

https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd
git cloneしようとしてRepository not found.

## エラーの内容

```
ERROR: Repository not found.

fatal: Could not read from remote repository.


Please make sure you have the correct access rights

and the repository exists.
```

## 解決策
- ~.ssh/configに以下を追記した。

```
IdentitiesOnly yes
```

## 原因

- 違うアカウントの秘密鍵を使用していて、違うアカウントでgithubにアクセスしていたから。
  - 違うアカウントでアクセスしているから、お目当てのリポジトリもnot found

## 状況詳細

- 以下のような構成でアカウントを持っていて、複数アカウントでgithubにアクセスしようとしていた。
  - アカウントA（既にうまくアクセスできて、リポジトリもクローンできてた）
      - リポジトリA
  - アカウントB（リポジトリをクローンしたいけど、エラーが出ていた）
      - リポジトリB

### ssh接続はできていた

```ssh -T ~/.ssh/configのHost（アカウントBの方）```　を叩くと、

```Hi アカウントA! You've successfully authenticated, but GitHub does not provide shell access.```

### ん？？

- 「Hi アカウントA!」？
- つながってるユーザ違う。。
- アカウントBの「~.ssh/config」に「IdentitiesOnly yes」をつけて、他の秘密鍵を見ないようにしたら、ちゃんとアカウントBにHiと言ってくれるようになりました。

## まとめ

クローンまでの接続ルートをしっかり理解していれば、もっと早く解決できたなあ。
仕組みから理解するのをサボらないようにしないと。
pyenvを使ってEC2(Amazon Linux 2)にpython3.9.10をインストールする。

# はじめに
最近AWSについて勉強中で、EC2環境にDjangoアプリをデプロイしようと思っているので、備忘で記載します。
（　初投稿😩　）
# Python3.9.10 インストール
### 1. pyenvのインストール
基本的に[pyenvの公式サイト(?)](https://github.com/pyenv/pyenv#understanding-path)のReadMeに従えば良い気がする。
**pvenv**とは、Pythonのバージョン管理を行えるツールのこと。


まずはpyenvをクローンする。
※gitが入っていない場合は、gitのインストールが必要。（``$ yum install git``でインストールできる。）

```sh
 git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

続いて、pyenvのパスを通す。（実際のコマンドは、[pyenvの公式サイト(?)](https://github.com/pyenv/pyenv#understanding-path)からコピぺした方が良いかも。）

```sh
$ sed -Ei -e '/^([^#]|$)/ {a \
> export PYENV_ROOT="$HOME/.pyenv"
> a \
> export PATH="$PYENV_ROOT/bin:$PATH"
> a \
> ' -e ':a' -e '$!{n;ba};}' ~/.bash_profile
$ echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
$ 
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(pyenv init --path)"' >> ~/.profile
$ 
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source .bash_profile
$ pyenv --version
pyenv 2.2.4-1
```


### 2. Python3.9.10 のインストール
まずはpythonビルドの依存関係をインストールする。
これやっとかないとPythonインストール時にエラーになる。

```sh
$yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
```


続いてpython3.9.10をインストールする。

```sh
$ pyenv install 3.9.10
Downloading Python-3.9.10.tar.xz...
-> https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tar.xz
Installing Python-3.9.10...
Installed Python-3.9.10 to /home/ec2-user/.pyenv/versions/3.9.10
```

インストール完了！

```sh
$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.9.10
```

ただ、実際には　2.7.18が適用されている。

```
$ python --version
Python 2.7.18
```

ので、3.9.10にバージョンを切り替える。

```
$ python global 3.9.10
/usr/bin/python: can't open file 'global': [Errno 2] No such file or directory
$ pyenv global 3.9.10
$ python --version
Python 3.9.10
```

完了🙌
Seleniumをすぐ使えなかった苦労話

#SeleniumもChromeDriverもインストールしたのに
まずはブラウザの立ち上げできるかなと思ったら、
動きませんでした。
矢鱈にインストールした初心者ぼくが悪いです。

「pip install chromedriver-binary」だけすればOK！という情報に惑わされ、
以下のようなエラーが出ていました。
言われた通りバージョン指定しても同じエラー・・・

```
'chromedriver' executable needs to be in PATH. Please see https://chromedriver.chromium.org/home
```
#解決してくれた参考サイト
自分の場合はChromeDriverはやはりきちんとインストールした方がよかったのか、
記載のサイトを参考にしながら以下手順を実行して解決しました。

https://self-development.info/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A7%E3%82%82%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%A7%E3%81%8D%E3%82%8Bselenium%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%80%90python%E3%80%91/

https://watlab-blog.com/2019/08/10/chromedriver-path/


##①Chromeのバージョンを確認

ブラウザのツールバー右上部の3つの点から「設定」に進み、
設定ページの左メニュー一番したの「Chromeについて」からも確認可能。

```
chrome://settings/help
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/20802c54-9293-d1e8-6bf5-c80d192efaa0.png)

##ChromeDriverをダウンロードする

https://chromedriver.chromium.org/downloads

今回は「__97__.0.4692.99」だったのでversion 97にした。
初めの2文字だけ見たらいいような印象だった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/c189322d-98e2-f699-2b74-60fa06ec7a7b.png)

##Pathを通す
```
C:\Program Files
```
上記に格納したらいいらしいが、私はここに追加したり
環境変数を変えられる権限がない可哀そうな社員なため、
自分でPathを通すことができていたMiniconda3に設置した。

```
C:\Users\(ユーザー)\Miniconda3
```

##実行してみる

```python
from selenium import webdriver
import chromedriver_binary

driver = webdriver.Chrome()
```

実行できました。
「import chromedriver_binary」は以下をしていれば要らないらしい。

```python
pip install chromedriver-binary-auto
```

#VSCodeのエラーが気になる
実行が成功していても波線は消えないそうです。
これのせいで、seleniumを何度もアンインストールしては
別の方法でインストールしてみて・・・と時間を無駄に過ごしました。
（ChromeDriverがないだけでしたが実行してもエラーが出ていたため）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/3c209c3b-dd2b-c5a1-890d-838099835e60.png)

#結果
「このモジュールがないよ」というメッセージをみたら、
特に何も気にせずPythonにインストールしてしまっていたので、
バージョンを気にしながらできるようになれたらいいなと思いました。

備忘録なので違うよというところあるかもです。
VSCodeのエクスプローラで「新規ファイル＆フォルダ」ショートカットを作成（Windows）

VSCode のエクスプローラで新しいフォルダやファイルを作成するとき、マウスを使って新しいフォルダを作成していました。このマウスでの作業をラクできるように、今回は、**`VSCode のエクスプローラ上で、指定したフォルダに「新規ファイルとサブフォルダ」を作成できるショートカットを設定します`**。

## 設定手順

### 1, コマンドパレットを開いて `Preferences: Open Keyboard Shortcuts (JSON)`を開く

「表示」→「コマンドパレット」を選択して、`Preferences: Open Keyboard Shortcuts (JSON)` を入力選択し `keybindings.json` を編集できるようにします。

### 2, keybindings.json を編集

開いた `keybindings.json` を以下のように編集します。"key" の値の部分はショートカットコマンドになります。

**(注) 今回はWindowsでコマンド設定していますので、`Ctrl` を使用しています**

```json:keybindings.json
// 既定値を上書きするには、このファイル内にキー バインドを挿入します
[
    {
        "key": "Ctrl+n",
        "command": "explorer.newFile"
    },
    {
        "key": "Ctrl+shift+n",
        "command": "explorer.newFolder"
    },
]
```

### 3, エクスプローラ上で、指定のコマンドして動作確認

VSCode のエクスプローラで対象のフォルダを選択し、「2」で設定したコマンドで新しいファイルやフォルダが作成できるかどうか確認します。
勾配降下法を可視化したい件

#背景
単純パーセプトロンを勾配降下法で実装したいです。TensorFlowやPyTorchなどのライブラリを使えば動くものは出来るのですが、0からPythonで作りたいです。具体的にはANDゲートで実装したいのですが、出力は0,1です。学習には確率的勾配降下法を使いたいと思っていますが、そのためにバイナリークロスエントロピー誤差を使おうと思っています。ただ、勾配降下法のイメージが掴めないので、簡単な所から可視化してみたいと思います。

#目的
という事で、今回は「勾配降下法の可視化」が目的となります。

#方法
今回は、超一般的な2次関数 $y=x^2$ を使って可視化します。微分した時の傾きが0の所で勾配降下法を終えます。

#結果
matplotlibでの描写をfor文で繰り返すことで、それっぽいのが出来ました。バッテンが少しずつ移動する様子が見てて面白いです。
追加（2021.1.31）
バッテンが移動する様子をアニメーションで保存しました。
修正(2021.1.31)
わかりやすさの為、マーカーを丸にして、学習率を大きくしました。

https://twitter.com/low01252654/status/1488106994787446784?t=5GlD4J6CPgq-aV5cxMeFBA&s=19

勾配降下法.ipynb

https://colab.research.google.com/drive/1C66slaXeigWwYqH0LnaN58jKrYC6JrSU?usp=sharing

#課題
1. とりあえず報告だけ。この後すぐに動画にしたり、DeepLearningに拡張したりしたい。
1. 先日、自分で実装した物を参考に勾配降下法の過程を動画にしました。次はDeepLearningの様子を動画にしたいと思います。クロスエントロピー誤差の様子を動画に出来るとかなり嬉しい気がします。その時は、「[なぜディープラーニングをするのか？について調べてみた件2（ロジスティック回帰）](https://qiita.com/tan0ry0shiny/items/343ebe8ed5840603abc8)」を参考に実装したいと思っています。
1. matplotlibで図示しているのですが、意図しない所で描写されたりします。例えば、以下は描写されそうなコードは変数に入れて描写されない様にしているつもりなのですが描写されてしまいます。もし、原因がお分かりの方がいらっしゃると教えて下さると嬉しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/a589a139-f777-d490-a1a2-2ece748b15c0.png)
1. 今回は2次関数の出力が0の所が解となっていますが、それが何なのかも良く分かっていないので今後の課題にします。というか、クロスエントロピー誤差について調べていくと分かる気がしています。


#関連
[３次元で描写した図を動画で保存する](https://qiita.com/tan0ry0shiny/items/cda6ee024f7d799b7398)
8.3 関数とは

# 関数とは

複数の処理をひとまとまりにしたものです。メソッドと呼ばれることもあります。
また、前述の通り、JavaScriptにおける基本的な構成要素のひとつであり、Function型のオブジェクトとして扱われます。関数をオブジェクトとして扱うことが出来るのはJavaScript特有の特徴です。


## 定義方法
関数定義の方法として「関数宣言」があります。 
記法　`function 関数名(引数) { 処理 }`

```js
/** 引数で指定した名前に挨拶をする文字列を返す関数 */
function hello1(name) {
  var message = "Hello, " + name
  return message
}
```

宣言の中にある「引数」という言葉についてですが、「引数」とは関数に渡して処理の中でその値を使うことができるものです。

#### アロー関数
上記の方法で関数は定義できますが、別の方法としてアロー関数というものがあります。最近できた記法で（2015年）私は基本こちらを使用しています

記法　`関数名 = (引数) => { 処理 }`

```js
/** 引数で指定した名前に挨拶をする文字列を返す関数 */
var hello3 = name => {
  var message = "Hello, " + name
  return message
}
```

## 呼び出し
前項で関数を定義する方法を解説しました。しかし関数は定義しただけでは役に立ちません。（呼び出さないと意味がない）

呼び出し方　`関数名(引数として渡す値)`

```js
// 関数の定義
function hello1(name) {
  var message = "Hello, " + name
  return message
}
// 関数の呼び出し
var result1 = hello1("yamada")

// コンソールへ結果を出力
console.log(result1) 
```

上記コードでは関数を呼び出した式を左辺の変数result1に格納していますが、この変数にはhello1関数を呼び出した実行結果が設定されています。実行結果とは、前項で説明したreturn文で返却した値のことです。
また、引数の存在しない関数を呼び出す場合ですが、その場合は呼び出す際にも引数を設定する必要はありません。


# 参考

https://techplay.jp/column/568

https://allabout.co.jp/gm/gc/23973/
【Ruby とRails】の真偽判定メソッド

# はじめに
この記事は、エンジニア経験1年の大学生が実務で勉強になったこと、詰まったこと、調べたことをまとめています。間違っている箇所などがございましたら、指摘していただけると幸いです。

# 前提
- Ruby: 2.7.5
- Rails: 5.2.4.6
- rails コンソールで実行

# 内容
条件分岐などで、`blank?`や`empty?`、`nil?`を使用する時に、どれを使えばいいのか迷ったことはありませんか？実務でよく使われており、その度に調べてました。しかし、頻繁に調べるのはめんどくさいので、まとめることにしました。

# 真偽判定メソッド

- `nil?` 
- `empty?`
- `blank?`
- `present?`

Rubyの標準メソッドとRailsで拡張されたメソッドがある。


### nil?(Rubyの標準メソッド)

```ruby
text = "ABCDE"  # => false
text_2 = ""     # => false
text_3 = nil    # => true
text_4 = true   # => false
text_5 = false  # => false
test_6 = 12345  # => false
test_7 = " "    # => false
test_8 = []     # => false
test_9 = {}     # => false
test_10 = 0     # => false
```

Rubyの標準メソッド。nilの場合のみtrueを返し、それ以外はfalseを返す。

### empty?(Rubyの標準メソッド)

```ruby
text = "ABCDE"  # => false
text_2 = ""     # => true
text_3 = nil    # => NoMethodError
text_4 = true   # => NoMethodError
text_5 = false  # => NoMethodError
test_6 = 12345  # => NoMethodError
test_7 = " "    # => false
test_8 = []     # => true
test_9 = {}     # => true
test_10 = 0     # => NoMethodError
```

Rubyの標準メソッド。空の文字列や空の配列の場合にtrueを返す。nilに対して呼び出すとNoMethodErrorが発生する。`" "` 半角スペースの場合、falseを返す。

### blank?(Railsのメソッド)

```ruby
text = "ABCDE"  # => false
text_2 = ""     # => true
text_3 = nil    # => true
text_4 = true   # => false
text_5 = false  # => true
test_6 = 12345  # => false
test_7 = " "    # => true
test_8 = []     # => true
test_9 = {}     # => true
test_10 = 0     # => false
```

正確にいうと、Railsに入っているActiveSupportのgemのメソッド。Rails以外でもgemを入れると、blank?メソッドなどの便利なメソッドを使うことが出来る。
nilまたは空のオブジェクトをチェック nil, “”, “ “(半角スペースのみ), 空の配列, 空のハッシュのときにtrueを返す。少しややこしいが、falseの場合は、trueを返す。Rubyのみでは使えない。

### present?(Railsのメソッド)

```ruby
text = "ABCDE"  # => true
text_2 = ""     # => false
text_3 = nil    # => false
text_4 = true   # => true
text_5 = false  # => false
test_6 = 12345  # => true
test_7 = " "    # => false
test_8 = []     # => false
test_9 = {}     # => false
test_10 = 0     # => true
```

正確にいうと、Railsに入っているActiveSupportのgemのメソッド。Rails以外でもgemを入れると、present?メソッドなどの便利なメソッドを使うことが出来る。(実際のメソッドの中身は、`!blank?`)となっている。なので、stringや配列、ハッシュなど型の器はあっても中身がない場合はfalseになる。
if 変数.present?とunless 変数.blank?は同じ意味 nil, “”, “ “(半角スペースのみ), 空の配列, 空のハッシュのときにfalseを返す。


# まとめ
`nil?` `empty?` `blank?` `present?`は実務でもよく出てくるので、今回まとめることで整理することができました。`rails`コンソールで簡単に確認できますので、わからなくなった時にでもやってみてください。


# 参考

https://railsdoc.com/page/empty
Windows環境のVSCodeでcfn-lintを使えるようにする手順。

# はじめに

windows環境かつ、VS Codeでのcfn-lintのセットアップ手順を取り扱った記事が少ないように感じたので、実際に私が行った手順をまとめてみました。

https://github.com/aws-cloudformation/cfn-lint

**筆者の環境**
・VS Codeインストール済み
・OSはWindows10

手順は以下となります。

|順番|内容|  
|:---|:--|
|1.|拡張機能でCloudFormation Linterをインストール|
|2.|Pythonをインストール|
|3.|pipでcfn-lintをインストール|
|4.|CloudFormation Linter configurationで絶対パスを指定|

# 1. 拡張機能でCloudFormation Linterをインストール

VS Codeの拡張機能からCloudFormation Linterをインストールします。

![cfn-lint install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338398/8e138a48-5b2a-efbf-dd7a-1b53a71bb606.png)

# 2. Pythonをインストール

お使いのWindowsにPythonをインストールします。
pipはPythonのインストール時にデフォルトで付属してきます。

Pythonのインストール方法は本記事では解説しませんが、こちらの記事などが参考になります。

https://qiita.com/ayuchiy/items/82d6d2dfcf1acc3bec00

# 3. pipでcfn-lintをインストール

pipでcfn-lintをインストールします。
ターミナル（PowerShell）から、以下のコマンドを入力します。

```
pip3 install cfn-lint
```

インストールの完了後、cfn-lintの絶対パスを確認しておきます。
linuxの`which`コマンドに相当します。

```
where.exe cfn-lint

# 実行結果
C:\hogehoge～\cfn-lint.exe
```


# 4. CloudFormation Linter configurationで絶対パスを指定

VS Codeの設定を開きます（`Ctrl` + `,`）。
'拡張機能'の項目から`CloudFormation Linter configuration`を選択します。

![CloudFormation Linter configuration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338398/065ead8e-bec0-07c5-ca44-25fb1cb30c54.png)

`Cfn Lint:Path`欄に、先程確認した`cfn-lint.exe`の絶対パスを入力します。

入力を終えたら、VS Codeを再起動します。

手順は以上となります。
CloudFormationテンプレートを開いて、cfn-lintが使えるか確かめてみて下さい。

# 補足：文字コードエラーが起きたときの対処例

上記の手順を実行後、私の場合は以下のエラーが発生しました。


```
cfnlint.decode - ERROR - Cannot read file contents:　�（置換文字）の含まれた絶対パス
```


こちらの記事の内容を試したところ解決しましたので、同様の状態の方は参考にしてみて下さい。

https://qiita.com/Nidhog-tm/items/c7e9d759ce1a0f5c85c6

# おわりに


Linterを導入したところ、CloudFormationの作業効率が格段に上がりました。


この記事が少しでも参考になれば幸いです。

# 参考記事
・[VSCodeにCloudFormationのLinterを追加する](https://infraya.work/posts/adding_cfn-lint_to_vscode/)
・[which command相当をWindowsで実行する方法](https://qiita.com/vmmhypervisor/items/b0fc773e49e1bbbbd5be)
CiscoのNAPT(PAT)の設定

Cisco Packet Tracerを使ってNAPT(PAT)ができるか検証がてら。
172.16.0.0/24の内側IPを10.0.0.1の外側IPに変換する。
![napt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667679/b7b9c38d-c1b6-56d2-1df0-e4b8f0c85628.png)

##OPGW(オンプレミス側ルータ)の設定
```tex
# 外側のIPアドレス
interface GigabitEthernet0/0/0
 ip address 10.0.0.1 255.255.255.252
 ip nat outside

# 内側のIPアドレス
interface GigabitEthernet0/0/1
 ip address 172.16.0.1 255.255.255.0
 ip nat inside

# 後述のaccess-list 1のIPアドレスの範囲をGig0/0/0のIPにNATする
ip nat inside source list 1 interface GigabitEthernet0/0/0 overload

# 宛先不明は全てGig0/0/0へ送出
ip route 0.0.0.0 0.0.0.0 GigabitEthernet0/0/0 

# NAPTする内側のIPアドレスの範囲
access-list 1 permit 172.16.0.0 0.0.0.255
```
##SVGW(サーバー側ルータ)の設定
```tex
# 外側のIPアドレス
interface GigabitEthernet0/0/0
 ip address 10.0.0.2 255.255.255.252

# 内側のIPアドレス
interface GigabitEthernet0/0/1
 ip address 192.168.1.1 255.255.255.0
```

PC0(172.16.0.2)とPC1(172.16.0.3)からSV(192.168.1.2)宛にPINGを投げてみる。
NATされているかの確認は`show ip nat translations` で確認できる。
![napt2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667679/6726a22f-5178-2067-5e63-4fc8fc800321.png)

シミュレーションでSV到達時のPDUを確認すると、送信元が10.0.0.1となっており、正しくNATされているのが解る。
![napt3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667679/d6af06ba-875f-6f1c-0316-784de86a9108.png)
[Excel]数式を文字列として表示する関数"FORMULATEXT"

# はじめに
> Excelの数式は、"数式の表示"か"Ctrl+Shift+@"で文字列として表示できる

これは有名な話です。
しかしシート内すべてのセルについて適応されるので、特定のセルだけ数式を表示したい場合は使用できません。
そんな時は、Excel2013で追加された関数"FORMULATEXT"を使いましょう。

# 使い方
数式を文字列として表示したいセルに以下のように数式を書くだけです。 

```
=FORMULATEXT(数式を文字列としてみたいセル)
```

使用例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655112/04955095-dc20-4c72-040b-204e20274462.png)

C11セルにFORMULATEXTの数式を記載していますが、そのセルは数式でなく数式の結果を表示できております。

# 用途
この数式は、特定のセルだけ数式を文字列として表示する以外にも、既存の数式を改変するという用途で使用できます。
以下のような数式の置換を行いたい場合、Excelやテキストエディタの一括置換だけでは作業に手間がかかります。

```
例：
'E1セルのこの数式を
=SUM(A1,B1,C1)

'こうしたい
=SUM(A1,B1,D1)
```

手順

1.  数式を、関数FORMULATEXTで文字列化する
1.  文字列化した数式を、SUBSTITUDE(置換)等の関数で改変する
1.  改変した数式を、テキストエディタにコピーペストする  
    ※EXCEL上でコピーペストすると、手順2で改変に使う関数、もしくは改変結果を文字列としてコピーペストしてしまいます。
1.  テキストエディタにコピーペストした式を、適用したいセルに貼り付ける

```
例の場合の手順1,2の数式：
=SUBSTITUTE(FORMULATEXT(E1),"C1","D1")
```

数式の改変作業自体は文字列の置換となるので、SUBSTITUDE以外の関数も使用可能です。
Linuxパーミッションのまとめ

#はじめに
Linuxのパーミッションの設定はしっかりと理解されていますか？
私は今日理解しました。どうせ明日にはほとんど忘れていると思うのでまとめてみます。
よかったら参考にどうぞ🦍

# 目次
- パーミッション（権限）がある理由
- パミッションの確認方法
- パミッションの見方
- ファイルタイプ
- パーミッションの意味
- パーミッションの数値変換
- 初期値
- 権限変更


# パーミッション（権限）がある理由
Linuxを操作していると必ず遭遇する`Permission denied`は操作しているユーザーに「読み込み」「書き込み」「実行」のいずれかの許可がないことを表します。中には「なぜ許可が必要なのか？」と感じたことのある方もいると思います。
それはLinuxシステムが複数のユーザーで使用することを前提に作られているからです。現在、サーバーのOSの多くはLinuxで構成されていますが、サーバーを管理する複数のエンジニア全員が全ての権限を与えられているとセキュリティ上大変問題があります。そのため、パーミッションがあるわけです。

# パミッションの確認方法

```
$ ls -al
```

:::note info
オプションに「a」を付与すると「.」から始まる隠しファイルも表示することができます
:::

結果

```
$ ls -al

drwxr-xr-x  16 saito  saito   512  1 24 10:10 .
drwxr-xr-x  10 root   root    320  1 16 16:22 ..
drwxr-xr-x  15 saito  saito   480  1 29 16:07 .test
-rw-r--r--   1 saito  saito  1213 12 23 11:33 README.md
drwxr-xr-x   6 saito  saito   192  1 13 20:54 foo
```

# パミッションの見方

パーミッションが記されているところは`drwxr-xr-x`の部分で分解すると以下のようになります。

```
-  rw-  r--  r--
|   |    |    |
|　　　　　　|    |　　　　　　　④その他のユーザー
|　　　　　　|　　　　　　　③ファイルグループ
|　　　　　　②ファイルオーナー
①ファイルタイプ　　　　　　　　　　　　　　　　
```

# ①ファイルタイプ

基本的にファイルを表す「-」とディレクトリを表す「d」を覚えておけばいいと思います。

| 種別 | 意味 |
|-----|---------|
| - | ファイル | 
| b | ブロックファイル |
| c | キャラクタファイル |
| d | ディレクトリ | 
| l | シンボリックリンク | 
| p | FIFO（名前付きパイプ） | 
| s | Unixドメインソケット |
| ? | その他のファイルタイプ | 

# パーミッションの意味

| 種別 | 意味 |
|-----|---------|
| - | 権限未設定 | 
| r | 読み込み可 (Read) |
| w | 書き込み可 (Write) |
| x | 実行可 (eXecute) | 

これをもとに上の例を読んでみると

| パーミッション | ①ファイルタイプ | ②オーナー | ③グループ | ④その他ユーザー |
|-----|---------|---------|---------|---------|---------|
| drwxr-xr-x | ディレクトリ | 読み込み、書き込み、実行可| 読み込み、実行可| 読み込み、実行可| 
| -rw-r--r-- | ファイル | 読み込み、書き込み| 読み込み可| 読み込み可| 

となります。

:::note info
rwxの表記順序は固定です
:::

# パーミッションの数値変換
パーミッションは数値に変換することができます。

| 種別 | 数値 | 意味 |
|-----|---------|---------|
| - | 0 | 権限未設定 | 
| r | 4 | 読み込み可 (Read) |
| w | 2 |書き込み可 (Write) |
| x | 1 | 実行可 (eXecute) | 
この数字は各権限範囲ごとに足し算します。

| パーミッション | オーナー | グループ | その他ユーザー | | 数値 |
|-----|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| drwxr-xr-x | 4+2+1| 4+1 | 4+1| →| 755 | 
| -rw-r--r-- | 4+2| 4 | 4 | →| 644 | 

# 初期値

ファイルを作成した時にそれぞれ初期値が決められています。

| 種別 | 数値 | パーミッション |
|-----|:---:|:---:|
| ファイル | 666 | rw-rw-rw- | 
| ディレクトリ | 777 | rwxrwxrwx |


# 権限変更

権限の変更は`chmod`コマンドで変更することができます。

```
chmod オプション　モード 変更するファイル
```

例えば下記を実行するとこのように変化します。

```
$ chmod 777 README.md
```

| Before | After |
|:---:|:---:|
| -rw-r--r-- | -rwxrwxrwx | 


:::note info
ファイル権限はrootならびにユーザーが変更でき、ユーザーの変更範囲はそのユーザーもしくはグループに権限があるファイルとディレクトリまでです
すなわちユーザーはrootの権限を操作することはできません（当たり前ですね笑）
:::




久々にQiita書きました。。。いままでGoの記事が多かったですが、これからはインフラ寄りな記事も書いていきたいです〜
それでは👋


#参考記事

https://www.amazon.co.jp/Software-Design-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-2021%E5%B9%B44%E6%9C%88%E5%8F%B7-%E9%9B%91%E8%AA%8C-ebook/dp/B08YDMS7X2
Cloud9からSession ManagerでEC2へ接続する

Cloud9からAWS Session Managerを使いたくなって試してみたら少々ハマったのでメモ。

#### ■AWS CLI 用の Session Manager プラグインをインストールする
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-linux

```
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
sudo yum install -y session-manager-plugin.rpm
```
Session Manager プラグインのインストールを検証

```
session-manager-plugin
```
「The Session Manager plugin is installed successfully. Use the AWS CLI to start a session.」となればOK。

#### ■Cloud9からSystems ManagerでEC2に接続に以下のコマンドを実行
```
aws ssm start-session --target [インスタンスID]
```
```txt:エラー発生
An error occurred (403) when calling the StartSession operation: Server authentication failed: <UnauthorizedRequest xmlns=""><message>Forbidden.</message></UnauthorizedRequest>
```
###### Cloud9で一時クレデンシャルを使用していたがこれをやめて、一旦Cloud9のEC2にIAMロール（「AmazonSSMFullAccess」のマネージドポリシーをアタッチした）をアタッチ。

#### ■再度接続
```txt:エラー発生
aws ssm start-session --target "[インスタンスID]"

Starting session with SessionId: [インスタンスID]-045c8a0b949a60213
sh-4.2$ 
```
#### でけた。
Cloud9のVPCと異なるVPCのEC2へのアクセスもできるし、便利。

一時クレデンシャルの何故だめだったかは調査中。
AWS認定試験をオンラインで受ける際はテストプロバイダ選択に注意

# はじめに
この度AWS Certified Solutions Architect – Associate(SAA)認定試験に合格しました。
AWS認定試験は現在テストセンター、自宅受験ともに対応しているのですが、今回自宅受験しようとしたところ一筋縄ではいかなかったので共有します。
**※完全に自分が注意書きをよく読んでいなかったことが原因です！！**

# AWS SAA
試験概要については以下をご覧ください。

https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

## 受験方法
- テストセンター
- オンライン試験(自宅受験)

## テストプロバイダ
AWS認定試験を受ける際、以下の2種類のテストプロバイダ(実施業者)を選択できます。

- ピアソンVUE
- PSI

いずれのプロバイダもテストセンター、オンライン試験の両方に対応しています。

# 失敗談
ここから実際に自分が失敗したことを踏まえ、注意点を挙げます。

### PSIでオンライン試験を申し込んだ
前述の通り、オンライン試験はピアソンVUE、PSIともに選択可能です。私は予約の空き時間を比較し、より最短で受験日をスケジュールできそうなPSIで試験を申し込みました。ここで注意書きをよく読んでいなかったことが悲劇の始まりです。
### 試験当日
PSIでのオンライン試験では、自分の端末にPSI secure browserという試験専用のソフトウェアをインストールさせられます。このソフト上で、以下の流れで試験を行います。

1. 身分証および顔写真の撮影
2. ウェブカメラによる部屋のチェック
3. 試験開始

### 身分証チェックでアウトに
1.の身分証チェックで早速弾かれました。自分は免許証を提示したのですが、チャットで試験官にこう言われました。
「アルファベット付きの公的身分証明書はありませんか？(和訳)」

そう、試験概要に注意として以下のことが記されていました。(以下[Amazon CertMetrics](https://www.certmetrics.com/amazon/)より引用。ログインしないと見られないかもしれません)
>PSIでのオンライン試験に関する補足
>- 試験監督員とのやりとりはすべて英語で行われます。
>- 英語で氏名が表記されている本人確認書類（パスポートなど）を必ずご用意ください。

つまり、運転免許証やマイナンバーカードでも身分を証明することはできないのです。日本に住んでいて英語で名前が示されている身分証はメジャーどころで言えばパスポートくらいでしょうか？

さらに、この場合ほとんどのケースで返金もされないとのことです。
私の場合、日本のPSIカスタマーサービスに問い合わせ事情を説明したところ、リスケジューリング用のバウチャーコードを頂けました。
さらに、試験48時間前までに日本語のみの身分証を提示しておけば、試験官に連携してパスできるよう事前に準備していただけるらしく、その対応もしていただけました。

### PSIでない場合は？
後で調べたところ、ピアソンVUEのオンライン試験の場合は以下の特徴があるようです。

- 日本人の試験官を選択可能
- 身分証も日本語記載のものでOK

つまり、英語の試験官とチャットでやりとりする自信が無かったり、パスポートを持っていない場合はピアソンVUEにて試験を申し込むのが無難ということですね。

# まとめ
- オンライン試験を受ける場合、基本的にピアソンVUEで申し込むのが無難
- パスポート(や他のアルファベット表記の身分証)があり、英語で試験官とやり取りできるならPSIでも問題ない
- 何ならおとなしくテストセンターで予約したほうが間違いない
- 試験の注意書きはちゃんと読もう(自戒)

お読みいただきありがとうございました。
【様々なロゴマークの背景(アプリ編)】

こんにちは。
入社2年目文系出身のエンジニアです。
今回は、私が個人的に興味を持ったのですが、
様々なネットアプリツールのロゴマークの背景についてまとめてみました。

## LINE

#### アイコンの色は紫色！？
現代、使用している人が多いLINEですが、
リリース前に最初に作ったロゴマークの色は紫色だったそうです。
☛当時の開発メンバーは紫にしてみたものの、いまいちだったそうで緑色に変更したらしいです。
なぜ緑色なのかというと、NHN(韓国のIT大企業)やNAVER(韓国の大手ポータルサイト)の
コンセプトカラーが緑色だったため、緑色に変更したらしいです。
【余談】
紫色のLINEのアイコンも見てみたかったです。。

#### LINE名もリリース直前に変更した！？
どうやら事実らしく、当時は「みどりトーク」を仮名にしていたみたいです。
【余談】
今となれば、LINEの方が呼びやすいですし、しっくり来る感じはあります笑
みどりトークって言葉詰まりそうな感じがするのは私だけですかね？？

## Twitter
 
#### Twitterのロゴの意味はとてもシンプル
Twitterのロゴマークの意味は、
もともとラリー・バードと呼ばれる鳥のデザインをイメージしているものです。
空へ飛び立っていく姿は、自由や希望、無限という可能性を示しているものだそうです。
【余談】
確かにTwitterの機能性を考慮すると、自由に皆さんがあらゆることを呟き、
明日に向かって飛び立っていってるというイメージがあります(あくまで私の個人的見解です笑)

## Instagram

#### 2016年頃から大幅に変化したロゴマークの本当の意味とは？
当時のInstagramのアイコンは、チェキカメラのようなロゴマークでした。
それが現在、ピンクを基調とした平面のカメラの形を表しているようなマークです。
当時の一般的なInstagramの機能性は、写真を主流とした投稿ツールのような感じでした。
Facebookに似ていたかと思います。
だが、それではいけないという問題意識がありました。
写真を投稿するツールだけではなく、様々な機能を用いて、
カメラというアイコンのイメージを脱却するイメージを固めていったそうです。
ロゴを変更したことにより、次々と機能が追加され、ユーザー数は大幅に増加したそうです。
【余談】
Instagramにこのような背景があったことを初めて知ったので、
驚きました。
高校の時から使用していたツールですが、
確かに途中から機能が変更し、投稿しやすくなったように思います。
開発チームやデザインチームがどうすればユーザーに気軽に利用してもらえるか試行錯誤した結果、今のInstagramがあると考えると感慨深いです。。

## 最後に

ここまで読んでいただき、ありがとうございました！
少しでも普段私たちが使用しているツールを
深く知ってもらえるきっかけになれば、嬉しいです。
次回は開発言語のロゴについて深堀りしていきたいと思います。

## 参考URL

LINE
https://type.jp/et/feature/6520/

Twitter
https://logomarket.jp/labo/logomark_twitter/

Instagram
https://gaiax-socialmedialab.jp/post-52015/#:~:text=%E5%A4%A7%E5%B9%85%E3%81%AB%E5%A4%89%E6%9B%B4%EF%BC%9F-,%E6%96%B0%E3%81%97%E3%81%84%E3%83%AD%E3%82%B4%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%84%8F%E5%9B%B3%E3%81%A8%E3%81%AF,%E3%82%82%E3%81%AE%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82&text=%E6%A9%9F%E8%83%BD%E3%82%82%E5%86%99%E7%9C%9F%E6%8A%95%E7%A8%BF%E3%81%AE,%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82
順列の組み合わせ全列挙（再帰関数の理解含む）

###概要
再帰関数といえば順列の組み合わせ数の計算としてよく出てくる
この辺とかである
https://qiita.com/drken/items/23a4f604fa3f505dd5ad#1-%E5%86%8D%E5%B8%B0%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%AF

ただ、組み合わせ自体をすべて列挙する関数が自分がググった限りではあまりなかったので実装してみた。
ちなみに元々は
https://atcoder.jp/contests/abc236/tasks/abc236_d
から二人選ぶ組み合わせを計算してみたかったですが、全然やり方わからん・・・となっていた

```rust:main.rs
fn dfs( s:&mut usize, used:&mut Vec<bool>, ans:&mut Vec<usize>){

  if used.iter().all(|&f| f){
    *s += 1;
    println!("{:?}_{}",ans,"OK");
  }
  let num = used.len();
  for i in 0..num{
    if used[i] {continue}
    used[i] =true;
    ans.push(i);
    dfs(s,used,ans);
    used[i] = false;
    ans.pop();
  }

}

fn main() {
let mut s =0;
let mut used = vec![false;4];
let mut ans =vec![];

dfs(&mut s,&mut used,&mut ans);

println!("{:?}_{}",s,"OK");
}
```

このときの出力は下記のようになる。やっと再帰関数が分かってきた気がする。
[0, 1, 2, 3]_OK
[0, 1, 3, 2]_OK
[0, 2, 1, 3]_OK
[0, 2, 3, 1]_OK
[0, 3, 1, 2]_OK
[0, 3, 2, 1]_OK
[1, 0, 2, 3]_OK
[1, 0, 3, 2]_OK
[1, 2, 0, 3]_OK
[1, 2, 3, 0]_OK
[1, 3, 0, 2]_OK
[1, 3, 2, 0]_OK
[2, 0, 1, 3]_OK
[2, 0, 3, 1]_OK
[2, 1, 0, 3]_OK
[2, 1, 3, 0]_OK
[2, 3, 0, 1]_OK
[2, 3, 1, 0]_OK
[3, 0, 1, 2]_OK
[3, 0, 2, 1]_OK
[3, 1, 0, 2]_OK
[3, 1, 2, 0]_OK
[3, 2, 0, 1]_OK
[3, 2, 1, 0]_OK

ちなみにitertoolsを使うと簡単に書けます.これで上と同じ出力が得られる。
https://docs.rs/itertools/0.10.3/itertools/trait.Itertools.html#method.permutations

```rust
fn main() {
  let perms = (0..4).permutations(4);
  for i in perms{
    println!("{:?}",i);
  }
}
```


ちなみに順列組み合わせは実装できていない。つらい
【個人開発】ロケットを発射させるアプリをつくました🚀🚀🚀


##はじめに

はじめまして！くのと申します！

みなさま、体調はいかがでしょうか？？
最近では、コロナウイルス(オミクロン株)の影響により、また自粛が推奨される期間になってしまいましたね。。。なんのためらいもなく外出できる日常に早く戻れるといいですよね。。

そこで、、今回は外出という規模すら超えてしまって、ロケットを発射し宇宙へ飛び立してしまおう！！といった心意気だけは超壮大なアプリを開発しました（笑）。

簡単に遊べるゲームに仕上げましたので、気軽な気分転換のような形で遊んでいただけるとすごく嬉しいです！
それでは、開発したアプリの紹介をしていきますね！


##アプリ概要
スタートから、5秒後にSTOPボタンを押してロケットを発射するアプリです！
＊タイミングが悪いとロケットは発射しないので、注意してください。

https://zealous-heyrovsky-308820.netlify.app/


＊スマホ向けにデザインしていますので、スマホの方が遊びやすくなっております。


##使用技術

・HTML・CSS・BootStrap・JavaScript
・プログラムを設置したサーバー：netlify


## 苦労したところ

ロケット発射への盛り上がり感を出すために、JavaScriptで時間経過とともに複数枚の画像を差し替えさせるように実装しました。レスポンシブル対応もさせているため、時間経過とともに変化する画面をいかにバランスを保たせたまま、レスポンシブル調整させるかといった調整に苦労しました。


[![Image from Gyazo](https://i.gyazo.com/70518ec78c3ac91cb27de3c80108f2c8.gif)](https://gyazo.com/70518ec78c3ac91cb27de3c80108f2c8)


## リリース後からの改善

Twitterのシェア機能にて投稿されたユーザーの意見をもとに、リリース後に改善を行いました。

改善前では、ゲーム終了後に、Twitterを投稿していただく際にゲームの結果が反映されておらず、どんな結果だったのか。どのような結果をもとにその感想を抱いたのか分かりづらい状況が発生していました。

例えば、下記のようなツイートでシェアされた場合、どう惜しかったのか分からない状況になっていました。

[![Image from Gyazo](https://i.gyazo.com/2707fd6279c5fddfe13297612d2ee996.png)](https://gyazo.com/2707fd6279c5fddfe13297612d2ee996)



そこで、ゲームの結果をTwitterシェア時に反映させて、より使っていただけるユーザーが盛り上がるような改善を施しました。また、友人の結果を見て、興味をもち遊んでいただけるような導線を作るためにも、ターゲット目標との差分結果をわかりやすく表示させるように改善しました。

#####【改善後のテキスト】
[![Image from Gyazo](https://i.gyazo.com/bf104abbf13c571121309ad4c96b46f3.png)](https://gyazo.com/bf104abbf13c571121309ad4c96b46f3)

Twitterのシェア投稿では、ユーザーが何も入力することなく投稿完了されるパターンも多いので、結果や内容をJavaScript等でセットし、そのまま投稿されても内容が明瞭になるようプログラム側でアシストすることが、重要だとわかりました。


##おわりに

個人開発で、実際にアプリを使っていただいたのは初めての機会だったので、
どうしたら使ってもらえるアプリになるのかを真剣に考える良い機会になりました。また、Twitterのシェア投稿機能は、ユーザーの意見を知ることができる貴重な仕組みだとわかりました。しっかり目を通し、ユーザー視点を勉強させていただきます。


もし、興味を持っていただきこのアプリを遊んでいただけたらすごく嬉しいです！
5秒で遊べるアプリなので、ぜひよろしくおねがいします！！

https://zealous-heyrovsky-308820.netlify.app/
Visual Studio 2022の矩形選択

# Visual Studio 矩形選択
Visual Studioの矩形選択は`Alt`+`Shift`+カーソルキー
[キーボード ショートカット - Visual Studio (Windows) | Microsoft Docs](https://docs.microsoft.com/ja-jp/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio)
"1 行上まで列を拡張", "1 行下まで列を拡張"

`Alt`+`Shift`を離してカーソルキーを押せば、直ちに矩形選択は終了します。
[Notepad++](https://notepad-plus-plus.org/)でも同じ動作をしてくれます。
# Visual Studio 2022
...という話はVS2019まで。
Visual Studio 2022では、`Alt`+`Shift`を離してカーソルキーを押しても上下に伸びたキャレットは解除されず、
エスケープキーを押すと解除されます。
これは、VSCodeの動作と同じ。

Endキーを押して全行の行末を同時に編集する時とか便利ですが、それ以外であまり役立つシーンは体感しません。
# モード
個人的に、"モード"のある操作は煩わしい。
例えばEclipseでは、`Ctrl`+`Shift`+Aで"矩形選択モード"になり、もう一度同じ組み合わせを押すと、通常モードに戻ります。
うっかり矩形選択モードになっているのを忘れてタイプし続けると、ストレスになります。

"押している間だけ"そのモードになってくれれば、モードを意識せずに済むので、効率がよいという考え方もあるのです。

Shiftを押していれば選択モードになるし、Altを押していれば上下キーで行移動。
どちらもモードがあったらかなり操作性が悪いと思います。

又、矩形選択モードをエスケープキーで解除するのは、左手小指じゃ押しにくいので煩わしい。
`Alt`+`Shift`+カーソルだけなら、手元を見なくても押しやすいのですが。
# 対策
結局オチのない話になってしまったのですが
誰かが設定変更方法を見つけてくれるのではないか？
と他力本願に期待中。

"Rectangle selection"+"Visual Studio 2022"で検索しても、それらしい情報は見つけられず。
# 参考
[Visual Studioの便利なショートカットキー](https://qiita.com/yuki_nishina/items/488e23aa9d54022eb149)
ASG内のEC2をスタンバイへ移行→デタッチする際のノード補充オプションが分かりにくい件

# TL;DR
AutoScalingグループ内で稼働しているEC2のうち1台をスタンバイ状態へ変更し、さらにデタッチする際、**いずれの操作においても「代替ノード補充」オプションを有効にしていないと稼働台数が減ってしまう**ため注意！

# どういうケースでの話？
商用環境で常時2台のEC2インスタンスが稼働するAutoScalingグループがあったとする。
このうち1台の調子が悪いので、一時的に「スタンバイに設定」する。
![スクリーンショット 2022-01-29 17.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ce65953c-6501-f133-0ea0-66e240483c88.png)

このとき、サービス影響を出したくないため代替ノードを補充する。
スタンバイ移行時に「新しいインスタンスを追加」オプションを有効にして実行する。
![スクリーンショット 2022-01-29 17.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7c647d2b-fa5f-0dfb-0da7-1ccfc3d34d0e.png)

すると当該インスタンスが「Standby」ライフサイクルへ移行すると同時に、代替インスタンスが「Pending」状態で出現し稼働準備をはじめる。
![スクリーンショット 2022-01-29 17.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/249a3d1f-064c-9f70-b26e-2f22bf1d0cf1.png)

# ハマりポイント
さて、問題はここから。
不良インスタンスが無事にスタンバイ状態となり、代わりの新規ノードを含めた2台が「InService」状態で元気に稼働している。
![スクリーンショット 2022-01-29 17.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/be430f92-a752-2958-7067-b2ee05a2312e.png)

不良ノードのログ調査も完了したため、紛らわしいこいつはTerminateしてお掃除してしまいたい。
で、とりあえずインスタンス終了する前に**「ASGからデタッチしとくか」**という際に今回の問題が発生する。
![スクリーンショット 2022-01-29 17.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/c8412e51-e907-e002-a7b1-8975bab64a5f.png)

デタッチの際も代替インスタンス補充要否のオプションが提示されるのだが、現状「2台がInService＋1台がStandby」なので**「インスタンス新規追加は不要だよ〜チェック入れずデタッチ…っと」**と進めてしまうと…
![スクリーンショット 2022-01-29 17.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8d1555c1-2263-5758-0e84-183e3a119e7e.png)

「ASGの台数設定に違反するからダメ〜！」と怒られてしまう。
そう、**チェック無しだと「Standbyノード1台」だけでなく、「代替追加されたInServiceノード1台」も合わせてデタッチしようとしてしまう仕様**らしい。これは分かりにくい…。
![スクリーンショット 2022-01-29 17.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a15d0b3e-cf5a-6a2a-8d26-af6c05de41e9.png)

ということで、当該オプションにチェックを入れてリトライ。
すると「InService」ノード2台は変更されることなく、「Standby」ノード1台のみが「Detaching」へ移行してくれた。ほどなくしてASGから削除される。
![スクリーンショット 2022-01-29 17.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/df5e7f30-e5ae-f30b-3893-ddcd89273d93.png)

# まとめ
このケースは商用稼働中のASGに対するトラブル時のワークアラウンドとしてそこそこ実施される作業ではないかと思う。
とりわけエンタープライズな環境だと、想定手順通りに作業が進まないと「イレギュラー発生」扱いとなりトラブル対応がさらに紛糾することも予想されるため、このややこしい仕様は把握しておいた方がよさそう。

というか、いちいちスタンバイへ移行することなくいきなりデタッチしてしまう方がいいかも。
さらに言うと、調査目的などでインスタンスの保全が必要な場合を除いては「不良インスタンスを停止」したり「インスタンス更新でローリング置換を実施」する方がシンプルで安全だと思われる。

※ なおASGの基本的な挙動については以下の記事もどうぞ。
　**[【EC2温故知新】AutoScalingグループの挙動をマネコンで観察してみる](https://qiita.com/minorun365/items/ed7fef82af84006aaf79)**
gcloud container clusters get-credentials で発生するエラーの対応

備忘録

## [Errno 21] Is a directory: {gcloud container コマンド実行時のdir} が発生した
このエラーが発生する時は環境変数 KUBECONFIG が存在しない時が多いです。
.zshrc or .bashrc ファイルに KUBECONFIG を追加してみましょう。

## [Errno 1] Operation not permitted が発生した
.kube/config が読み込めていない可能性があります。
chownしましょう。
```sudo chown $(id -u):$(id -g) $HOME/.kube/
　sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
詳細は以下のドキュメントを参照。

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#more-information
LaravelでAuthをDIする

# やりたいこと

よく`Auth::user()`とかするけどDIして使いたい

#やりかた

`Illuminate\Auth\AuthManage`をDIする。
あとは`guard()->user()`とかでとれる

```php

use Illuminate\Auth\AuthManager;

class DIExample
{
    protected $auth;

    public function __construct(AuthManager $auth)
    {
        $this->auth = $auth;
    }
}

// Auth::user
$this->auth->guard()->user();

```
Markdown をプレビューしてくれるツール gripを使ってみた



# grip とは？
> ローカル環境でGitHubのREADMEを表示するためのコマンドラインツールです。

# 実践
```terminal
$pip install grip  ←初回のみ

$C:\Users\user\Documents\python>grip README.md
 * Serving Flask app 'grip.app' (lazy loading)
 * Environment: production
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://localhost:6419/ (Press CTRL+C to quit)

```

> `http://localhost:6419/` にアクセスしてみる

![screencapture-localhost-6419-2022-01-29-17_20_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/303287d9-6e39-b4fd-6365-00c869eb96bb.png)
 <↑> README.mdの中身

### GoFullPageと組み合わせると便利でした
[https://chrome.google.com/webstore/detail/gofullpage-full-page-scre/fdpohaocaechififmbbbbbknoalclacl](https://chrome.google.com/webstore/detail/gofullpage-full-page-scre/fdpohaocaechififmbbbbbknoalclacl)

# 参考
[https://qiita.com/tbpgr/items/64ac377e41269501c7c8](https://qiita.com/tbpgr/items/64ac377e41269501c7c8)
[https://github.com/joeyespo/grip](https://github.com/joeyespo/grip)
「すぐにできます」について考える

## すぐにできます！

『もう出ました』というそば屋の様な響きですね。
反射的に「すぐにできます」という回答をする方は一定数いると思いますが、その回答をしてできなかった場合に何が起きるかを考えてみたいと思います。


## 想像以上に莫大な損害が発生する

「すぐにできる」つもりで計画が立ちます。

開発者が「すぐにできる」と答えたら、それに合わせてリリース日の調整をします。
試験担当者の手配も「すぐ」に合わせてすることになります。
実際に「すぐ」にできなかった場合は、苦労して手配した試験担当者が手持ち無沙汰になり待機コストが発生します。

BtoC製品であれば、リリース日に向けて広告の出稿も必要ですが、すぐにできなかった場合には広告が全て無駄になります。
大変な損害です。


## 相手に不信感を与えてしまう

状況の整理ができていて理路整然と理由が説明できた上で「すぐできる」と回答するのであれば問題はないですが、それらを伴わずに「すぐできる」と回答することは危険に感じます。

なぜなら、回答される側に、タスクを把握していないのに「すぐできる」と言っている様に受け止められるからです。
更に、タスクを把握していないとすれば、「すぐにできる」かもしれないけれども、望んでいるアウトプットと異なる作業をされるリスクが高いとも感じられると思います。

わたしが、経験上「すぐにできる」と言って本当にすぐにできた人には、ほとんどお会いしたことがないせいかもしれません。


## 「すぐにできる」と答えるメリットは薄い

結局評価されるのはアウトプットです。
約束した期日に約束した物量・品質のアウトプットを約束した相手に引き渡たすことが大事です。
「すぐにできる」と答える事で、**物量・品質を担保できなくなるリスクを上げることになります。**
相手が予定している期日より早く提出しても **意味はないし評価も上がりません。**

更に、相手が望んでいる物量・品質と、自分で思っている物量・品質に差異がある場合、「すぐにできた」としても **「アウトプットはすぐに出すが、望んでいるアウトプットを出さない人」** と思われるリスクがあります。

作業に着手する前に、理路整然と説明できる状態になっており、相手に説明をして合意形成を行うことで「間違ったアウトプット」を出すリスクを下げることができると思います。

**「すぐにできること」**よりも**「着手する作業の説明ができること」**の方に遥かに価値があるのではないでしょうか。

## まとめ

約束を守るのは社会人の最低限のルールです。
多少時間はかかっても、約束を守る人間の方が信用されますし、約束を守らない人間はそもそも信用されません。
さらに、できない約束をすると、様々な人間に迷惑をかけたり、損害が発生します。

この大前提がある中で「すぐにできる」と発言するのは大変リスクが高い行為に感じます。

タスクが発生した際には、一呼吸おいて、まずはタスクを整理、分解、再構築し、見積もりを立てた後に、その後理路整然と報告し、期日を約束するのがよいと思います。

最初の見積もり通りいかないことも多々あると思いますが、その場合にはこまめに報連相するとよいでしょう。
言いづらいこと、切り出しづらいことも多々あると思いますが、早め早めに適切な行動を取ることで相手の信頼を得られることも多くあると思います。

趣味プログラマではなく、業務プログラマの皆様におきましては、好きなものを好きなように作るだけでは仕事にならず、誰かに依頼された作業を行うという仕事をされていると思います。
本記事がその誰かに信頼されるような仕事をするための参考になれば幸いです。
spreadsheet API KeyError: 'access_token'

pythonでspreadsheetを操作するものを作成中にエラーが出た

遭遇したエラー

```
KeyError                                  Traceback (most recent call last)
~\anaconda3\lib\site-packages\google\oauth2\_client.py in jwt_grant(request, token_uri, assertion)
    195     try:
--> 196         access_token = response_data["access_token"]
    197     except KeyError as caught_exc:

KeyError: 'access_token'
```

<解決>
変更前

```
SCOPES = [
    'https://spreadsheets.com/feeds',
    'https://www.googleapis.com/auth/drive',
]
SERVICE_ACCOUNT_FILE = './hogehoge.json'
SHEET = 'hoge'
```
変更後
https://stackoverflow.com/questions/63418603/google-oauth2-no-access-token-in-response-error-while-trying-to-open-spreadshe
上記サイトを参考に
SCOPESにURLを追加した（コピペしただけ）

```
SCOPES = ["https://spreadsheets.google.com/feeds",
          'https://www.googleapis.com/auth/spreadsheets',
          "https://www.googleapis.com/auth/drive.file",
          "https://www.googleapis.com/auth/drive"]
SERVICE_ACCOUNT_FILE = './hogehoge.json'
SHEET = 'hoge'
```

これで解決しない場合にはjsonファイルのパスを確認してみてほしい
僕の場合jsonファイルがpyファイルと同じディレクトリにあるのでパスが'./hogehoge.json'となっている


下記の動画を参考にしていたところ、このエラーに遭遇した。

・PythonでGoogleスプレッドシートの作業を一瞬で終わらせる
https://youtu.be/fFSGPciIkfI
・PythonでGoogleスプレッドシートの情報を抽出してみた
https://youtu.be/uBy7F4Wd9cE
Webpacker::Manifest::MissingEntryErrorが発生した場合

最近、よくこんなエラーに遭遇するので、覚書として残します。

**環境:**
Ruby 3.0.1
Rails 6.1.4

**状況:**
railsでサーバーを起動し、アクセスすると、以下の画面が表示される。
![スクリーンショット 2022-01-29 16.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159704/48aacab7-f864-c712-52d6-fe9e21ae9d91.png)

エラーメッセージに書いてあるとおり、アプリ直下の `/public/packs/`に `manifest.json` が存在してない（もしくは `/public/packs/` 自体がない）はず。


**解決策:**
Webpackerをインストールする

**詳細:**
Webpackerをインストールする

```
$ rails webpacker:install
```
途中、以下のようなメッセージが出た場合は、yで進める

```
Overwrite /Users/user_name/workspace/app_name/config/webpack/environment.js? (enter "h" for help) [Ynaqdhm]
```

おまけ:
[Webpackerの概要はこちら](https://railsguides.jp/webpacker.html)
Python プログラムを開く(ExcelやPowerPoint)

Pythonで作ったExcelやPowerPonitファイルを最後開きたくなり、調べてやったことことです

使うのは`subprocess`。

```python
import subprocess

fullpath_xlsx = r'C:\Users\XXX\Documents\aaa.xlsx'  
subprocess.Popen(['start', fullpath_xlsx], shell=True)

```
これでfullpath.xlsxファイルが開くはずです。
やってみたら、なぜか開かない。
`'start'`で登録されている実行ファイルはいいはずなんだけど。。。
ということで、Excelの実行ファイルを探し、そのpathを使い実行しました。

```python
import subprocess

fullpath_xlsx = r'C:\Users\XXX\Documents\aaa.xlsx'
xlsx_act_path = r'C:\Program Files\Microsoft Office 15\root\office15\EXCEL.EXE'
subprocess.Popen([xlsx_act_path , fullpath_xlsx], shell=True)

```

PowerPointの場合も同じ、ファイルのPathをPowerPointにすればよいだけです。
Laravelでmodel作成時にmigrationとcontrollerも同時に作る方法(メモ)

https://kaiblo.com/laravel%e3%81%a7model%e4%bd%9c%e6%88%90%e6%99%82%e3%81%abmigration%e3%81%a8controller%e3%82%82%e5%90%8c%e6%99%82%e3%81%ab%e4%bd%9c%e3%82%8b%e6%96%b9%e6%b3%95%e3%83%a1%e3%83%a2/

こちらに移動しました。
Windows 7 のライセンスを Windows 10 デジタルライセンスに移行

#きっかけ
新しくPCを組んだのだが、未整理のデータが大量にあったため古い方のPCもしばらく残しておきたかった。しかしそうするとWindows10のライセンスが新たに必要になってしまう。そのためだけに新しく買い足すのももったいないので、埃を被っていた古いWindows7（DSP版）PCのライセンスが活用できないかと考えた。
以下、その際の備忘録。

#流れ
* Windows7をWindows10にアップグレードする
* マイクロソフトアカウントと紐づけてデジタルライセンスにする
* 新しいPCにデジタルライセンスを移行する

#Windows7を10にアップグレード
Windows7のプロダクトキーを使ってWindows10をアクティベーションすることはできなかった。DSP版なのでその関係かもしれない。
しかしWindows7はWindows10にアップグレードすることができる。そしてWindows10であればプロダクトキーを廃したデジタルライセンス管理が可能であり、他のPCへのライセンス移行ができるはずである。

###旧世代ハードが必要
まずWindows7 PCをWindow10にアップグレードする。インストール済みのPCが無ければ新規インストールしてもいいが、Windows7は第7世代kabylake以降をサポートしていないため最新世代のPCに7を入れて10にアップグレードするという手は使えない。Windows7があるということは当時のハードも持っているはずだが、処分済みだったり壊れていた場合は諦めよう。

###アップグレード時はなるべく最小構成で
（アップグレードの際はWindows7のライセンス認証が済んでいること）
使い古したWindows7には様々なレガシーソフトウェアが入っていたため、そのままアップグレードを試みたところ処理に丸一晩かかった挙句に失敗、結局自動ロールバックされてしまった。そのため不必要なデバイスを外し、ソフトウェアも可能な限りアンインストール、アップグレードの際も個人設定やデータの移行をオフにしてようやく成功した。

#デジタルライセンスに切り替え
Windows10へのアップグレードに成功したら、スタートメニュー > 設定 > アカウント でマイクロソフトアカウント（無ければ作成しておく）にサインインする。
これによりマイクロソフトアカウント上にデジタルライセンスとして登録され、他のPCへライセンスを移行できるようになる。ここまできたらWindows7（だった）PCはもう不要。

#新PCにライセンスを移行する
新しいPCにWindows10を新規インストールするまでの手順は割愛。

###関連付けハードウェアの引っ越し
使用したWindows7はDSP版なので、紐づけられているハードウェアを新しいPCに移しておく。（無くても物理的には動作するが）これでDSPライセンスの要件はクリアされるはず。

###まずはWindowsUpdate
Windows10も初期のバージョンではデジタルライセンスを利用するための機能がないため（ライセンス認証画面に「トラブルシューティング」が出てこない）、まずはWindowsUpdateを一通り適用して最新バージョンにする必要がある。

###マイクロソフトアカウントにサインイン
ライセンスを紐づけてあるマイクロソフトアカウントにあらかじめサインインしておく。

###ライセンスの受け取り
ライセンス認証画面を開き、トラブルシューティングを選択。「このデバイス上のハードウェアを変更しました」を選択するとマイクロソフトアカウント上に紐づけられているデジタルライセンスのリストが表示されるので、該当するPCを選択。あとは自動的にライセンス認証が完了する。

#Windows11
巷ではWindows11が出回り始めているが、Windows7もアップグレード対象になっているので7からアップグレードしたこのライセンスでも問題なく11にアップグレードできるはず（互換性に不安があるのでまだ試してはいない）。