OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでNetworkManagerを操作する 【python-networkmanager】

PythonからNetworkManagerを操作し、Linuxのネットワーク設定を行えるようにします。
python-networkmanagerというライブラリを使用します。
このライブラリは特徴は、裏でnmcli等のツールを呼び出してパースしているのではなく、
D-busというものでNetworkManagerと直接やり取りしているところです。
残念ながらドキュメントがしっかりしていないので、自分用の備忘録を兼ねて書いていきます。

なお、こちらではRockyLinux8.5を使用しています。

# 準備

python-networkmanagerをインストールします。

```bash:インストール
$ pip3 install python-networkmanager
```

念のためNetworkManagerが動作しているか確認します。
```:NetworkManager
$ systemctl status NetworkManager
● NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-03-26 22:51:21 JST; 1h 36min ago
~~
```

ライブラリの動作確認をします。
```python:動作確認
from dbus.mainloop.glib import DBusGMainLoop
import NetworkManager

DBusGMainLoop(set_as_default=True)

print(NetworkManager.NetworkManager.Version)
```
実行して`1.32.10`などとNetworkManagerのバージョンが表示されていれば成功です。
注意点として必ずNetworkManagerのライブラリを呼び出す前に
`DBusGMainLoop(set_as_default=True)`
を実行しないとエラーになってしまうようです。

# デバイス情報

NetworkManagerからデバイス一覧を取得します。

現在、以下の状態になっています。
```:device
$ nmcli dev
DEVICE    TYPE      STATE     CONNECTION
ens18     ethernet  接続済み  ens18
ens19     ethernet  接続済み  eth1
ens19.20  vlan      接続済み  eth1.20
lo        loopback  管理無し  --
```

以下のプログラムを実行すると
```python:device.py
from dbus.mainloop.glib import DBusGMainLoop
import NetworkManager

DBusGMainLoop(set_as_default=True)

devices = NetworkManager.NetworkManager.GetDevices()

for dev in devices:
    print('device :', dev.Interface)
    print('state :', NetworkManager.const('device_state', dev.State))
    print('type :', NetworkManager.const('device_type', dev.DeviceType))

    for addr in dev.Ip4Config.Addresses:
        print('addr : {}/{}'.format(addr[0], addr[1]))
    print('------------------')
```

このような結果になります。

```:device.py 実行結果
$ python3 device.py
device : lo
state : unmanaged
type : generic
addr : 127.0.0.1/8
------------------
device : ens18
state : activated
type : ethernet
addr : 192.168.50.100/24
------------------
device : ens19
state : activated
type : ethernet
addr : 172.16.10.106/24
------------------
device : ens19.20
state : activated
type : vlan
addr : 172.16.20.70/24
------------------
```

ポイントを解説します。
`NetworkManager.NetworkManager.GetDevices()`でデバイスの一覧をList型で取得できます。
オブジェクトのプロパティから各種情報を参照できます。
`NetworkManager.const()`で定数値を名前に変換することができます。

# 参考文献
https://pythonhosted.org/python-networkmanager/
https://github.com/seveas/python-networkmanager
【NestJS】GCSに画像をアップロードするとPayloadTooLargeError: request entity too largeで弾かれたので解決した件

# 概要

サイズの大きい画像を送信すると`PayloadTooLargeError: request entity too large` エラーーが発生したので解決方法をまとめる

https://stackoverflow.com/questions/50101512/http-413-request-entity-too-large-in-node-js-project-in-gae

# 解決方法

`bodyParser`を利用してリクエストバッファサイズを上げることが必要だったみたい

https://www.npmjs.com/package/body-parser

```diff_typescript:src/main.ts
async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: loggerFactory.useFactory('warn'),
  })
  const logger = app.get<CustomLogger>(CustomLogger)
+  app.use(bodyParser.json({ limit: '32mb' }))
+  app.use(bodyParser.urlencoded({ limit: '32mb', extended: true }))
});
```
MAMPで500エラーが出た時の対処について

エンジニア初学者がPHPのよくわかる教科書で勉強していてつまづいた点と、
教科書には載っていない補足情報を記載できたらと思います。
今回は、500エラーが出た時の対処法（主にエラーの確認方法）です。

# 500エラーとは
developer.mozilla.orgに記載の内容を引用すると、
>HyperText Transfer Protocol (HTTP) の 500 Internal Server Error サーバーエラーレスポンスコードは、サーバーがリクエストを実行を妨げる予期しない条件に遭遇したことを示します。

ということです。
リクエストを実行したいが、予期せぬ何かに妨げられている状態ということらしい。
サーバーがダウンしているのかと思ったのですが、phpの記述ミスが大半な要因だとの意見も。
なので、コードを見直すことをまず第一に行った方がよいということですね。

# どうやってコードを見直すか
MAMPでPHPのエラーログを書き出しているファイルがあるので、それを見ます。
ファイル名は「php_error.log」です。
ターミナルを使って操作するので、コマンドを知る必要があります。
（自分は少しLinuxコマンドをかじったことがあるので、表面的に理解しているつもりです。誤っていたら優しめにご指摘ください！)

```
$ cd MAMP/logs/
$ ls
apache_error.log        cloud_mamp.log          mysql_error_log.err     php_error.log
```
「php_error.log」があるのを確認したら、
次は以下のコマンドを入力します。

```
$ tail -f php_error.log
```
簡単に説明すると、コマンドをtail［-f］［パス名］という３つに分解できて
tail:指定したファイルの末尾10行を表示
-f:元々オープンしていたファイルを引き続きtailする命令
パス名：一旦ファイル名だと思っていて良いです。
という感じになります。

最終行を確認するとどのようなエラーが、どのファイルの何行目で起きているのかを記載してくれています。

## 自分は以下のように書き出されていました

```
PHP Fatal error:  Uncaught Error: Call to undefined function shal() in /Applications/MAMP/htdocs/todolist/check.php:15
```

___/Applications/MAMP/htdocs/todolist/___　にある、
___check.php___ というファイルの15行目の、
___shal()___ というファンクションが定義されてない。

とのことです。英語が読めれば（翻訳アプリを使ったら）なんとなくわかるかと思います。

本当はsha1()を使いたかったのに、shal()と記載してしまっていた。
1とlを見間違って入力していたみたいです。恥ずかしいミスですね。

派生して、
sha1()などはハッシュ関数と言います。
よく使われるハッシュ関数らしいのですが、PHPの公式リファレンスを見るとあまり推奨していないらしいです。
その辺りは追ってまとめたいと思います。

# まとめ
最初はエラー多発すると思うのですが、もしエラーが出ても
書き出されているエラーを出力して、原因見つけに行けたら
特に慌てることなく対処できそうです。
原因を見つけにいく手段を学べる良い機会でした！

# 参考
- [500 Internal Server Error - HTTP - MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/500)
- [ホームページを見ている時によく、「HTTP 500… – Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q139250058)
- [MAMPでエラーログを確認する – Qiita](https://qiita.com/naoki85/items/d8d400de235af8fc9934)
- [tailコマンドのオプション「f」と「F」 – Qiita](https://qiita.com/sakito/items/7f65e16f10b3d754f307)
- [パスワードのハッシュ - Manual - PHP](https://www.php.net/manual/ja/faq.passwords.php)
【React Native】位置情報アクセス許可要求とAppStateの相性が悪い件

## はじめに
React Nativeを仕事で扱い始めてから、早半年以上が過ぎました。
いろいろ躓くところはありましたが、一番躓いたといっても過言ではない件を備忘録として残しておこうと思います。

### まず、結論から言わせて
今回根本的な解決はできておりません！！！
実装に合わせた修正をいれて対応したけど、あくまで __「こういった事象が発生したよ。」__ というものになります。

## 位置情報アクセス許可要求とAppStateの相性が悪い件
厳密には相性が悪いという訳ではなく、想定外の動きをしてしまったというのが正しいです。
ちょっと盛りましたね。
※ちなみにAndroidのみで発生。

### AppStateとは？

[React Native公式ドキュメント - AppState](https://reactnative.dev/docs/appstate)

公式ドキュメントを読んでもらったほうが早いですが、アプリがフォアグラウンドにあるかバックグラウンドにあるかを通知してくれるものです。

### AppStateを使用した背景
位置情報を監視したかったのですが、一度アプリをバックグラウンドに持ってきてしまうと監視されなくなってしまうという問題が発生したので、そちらの対応として使用しました。
ちなみに位置情報の監視は以下で出来ます。

[React Native公式ドキュメント - watchPosition()](https://reactnative.dev/docs/0.63/geolocation#watchposition)

そのためAppStateを使ってアプリのフォアグラウンド・バックグラウンドを監視して、フォアグラウンドになった際は位置情報監視を開始、バックグラウンドになった際は監視状態を解除させるといった処理を入れたかったという訳です。

### 何が起こったの？
今回想定外の動きをしたのが、位置情報のアクセス許可を要求する際に、 __「アプリがバックグラウンドに行ったよ〜と思ったらフォアグラウンドに戻ってきたよ〜」__ と一気に通知されてしまうことです。

…Why?

### それで何が相性悪いの？
今回フォアグラウンドに行った際には位置情報のアクセス許可要求を行う処理を行っていました。
そのため、
アクセス許可要求→バックグラウンド通知→フォアグラウンド通知→アクセス許可要求→バックグラウンド通知→フォアグラウンド通知…
のように無限ループが発生してしまいました。
（※位置情報のアクセス許可を拒否している場合のみ）
厳密には位置情報アクセス許可要求とAppStateの２つの相性が悪いというより、想定外の動きをするもんだから実装と相性が悪かったといった感じでしょうか。

結論でも述べたように、根本的な解決はわからず…

急にアプリが重くなるもんだからなんでだ…と悩みまくり…かなり時間を使ってしまいました。
そこかよ…
※ちなみに参考に記載したstackoverflowでは「AppStateは使うな！」とか書かれてます…笑

## さいごに
玄人からすると「当たり前だろ」とか思われるかもしれませんが、まだまだ素人なのもので…お許しを。

## 参考
[React Native公式ドキュメント](https://reactnative.dev/)
[stackoverflow - Appstate keep on getting change in React native in Android](https://stackoverflow.com/questions/58832423/appstate-keep-on-getting-change-in-react-native-in-android)
[Vue3 vite] Vue3で多言語対応

# Vue3で多言語対応(vite)
## 目次
[vue-i18nインストール](#vue-i18nインストール)
[フォルダー構成](#フォルダー構成)
[翻訳用ファイルの準備](#翻訳用ファイルの準備)
[多言語配置](#多言語配置)
[Vue3の開始処理](#vue3の開始処理)
[使い方と言語切り替え](#使い方と言語切り替え)

----
今回はVue3に、多言語対応の実装方法について説明します。
下記の通りに実装すれば、上手く行けると思います。
**viteは本当に早いものだなぁ～**

-----

### vue-i18nインストール
先ずはnpmを利用して、国際化のプラグインをインストール
``` 
npm install vue-i18n@next
```
### フォルダー構成
```
└─src
    └─language
        ├─en.ts
        ├─index.ts
        └─ja.ts
```
### 翻訳用ファイルの準備
英語と日本語
```en.ts
export default {
    test: {
        hello: 'hello'
    }
}
```
```ja.ts
export default {
    test: {
        hello: 'こんにちは'
    }
}
```
### 多言語配置

``` index.ts
// i18nのコンポーネントを導入する
import { createI18n } from 'vue-i18n'
// 翻訳用のファイルを導入する
import ja from './ja'
import en from './en'

const i18n = createI18n({
    // デフォルトは日本語
    locale: 'ja',
    messages:{
        en,
        ja
    }
})
export default i18n
```
### Vue3の開始処理
vueのインスタンスに、プラグインを使用する
```main.ts
// index.tsを導入する
import i18n from './language'

const app = createApp(App)
// i18nを使う
app.use(i18n)
app.mount("#app")
```
### 使い方と言語切り替え
`$t()`メソッドを使って翻訳を適用します。
またtypescriptに値が貰えます。

上記index.tsの`i18n`を利用して、簡単に言語を切り替えます。
``` template.vue
<template>
    <h1>{{$t('test.hello')}}</h1>
    <!-- Element-plusのボタン -->
    <el-button @click="testI18n()">helloを表示</el-button>
    <!-- 言語切り替えボタン -->
    <el-button @click="changeLang('ja')">Japanese</el-button>
    <el-button @click="changeLang('en')">English</el-button>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
  name: "test",
  methods: {
    testI18n() {
      console.log(this.$t('test.hello'))
    },
    // 言語を切り替える
    changeLang(langType: "ja" | "en") {
      i18n.global.locale = langType;
    },
  },
})
</script>
```
AWS Cloud9でJupyter labの環境を構築する

# 背景・目的
[AWS Cloud9を試してみた](https://qiita.com/zumastee/items/312d20594b7eecbd533d)で構築した環境にJupyter labをインストールする。

# 内容
## JupyterLabとは
> JupyterLab is the next-generation user interface for Project Jupyter

- Project Jupyterの次世代ユーザーインターフェイスらしい。

> JupyterLab will eventually replace the classic Jupyter Notebook.
- Jupyter Notebookから最終的に置き換わるようだ。

## 実践
### インストール
- [Installation](https://github.com/jupyterlab/jupyterlab#installation)を参考にインストールする。
```
$ pip install jupyterlab                                                                                                                                                                                                                                                
```

### 起動
#### 失敗
- 以下のコマンドを実行し、Preview>Preview Running Applicationを実行すると、以下の画面が表示された。
```
jupyter lab
```
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/48c1f0c9-3da8-8d49-e888-d0c0d61f7b95.png">
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0a94efa2-ea38-674b-1d55-94fb4bb951a2.png">

> The server might be running on a different port; make sure it runs on port 8080.

- サーバは別のポートで実行されているかもしれない。8080で実行する必要があるようだ。

#### 成功
- ポートとIPアドレスを指定し、Preview>Preview Running Applicationを実行すると、以下の画面が表示された。
```
jupyter lab --port $J_PORT --ip $J_IPADRESS
```
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9d2917bb-f503-aa70-e202-023c1c73bcda.png">

- Pop Out into New Windowをクリックすると画面が表示されました！
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7c7589b2-63fa-311f-7428-770bba9bce5b.png">

- Tokenを入力してLog inをクリックすると初期画面が表示されました！
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9c0fc421-2f78-7388-155d-f6500cc2878e.png">

# 参考
https://github.com/jupyterlab/jupyterlab

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html
【GAS】Googleカレンダーに特定の予定があったときにメールを送る

# これはなに
うちの会社では有給を取るときに以下の作業をしなければいけません。
 
- カレンダーに予定登録
- メール送信

ちょっと手間だし忘れたりすることもあるので、手作業はせめて1回にしたいところです。
予定をブロックするために、カレンダーは必ず登録するので、メール送信をGASで自動化。


# 作り方

## スクリプト

```JavaScript:AbsenceMail.js
function AbsenceMail() {
  let myCalendar = CalendarApp.getCalendarById('☓☓☓@gmail.com'); // 自分のメールアドレス
  let today = new Date();

  // イベントを取得
  let myEvent = myCalendar.getEventsForDay(today);
  
  // イベントの中に”休み”という件名のものがあれば、メールを送信する
  for(let i = 0 ; i < myEvent.length ; i++ ){
    if(myEvent[i].getTitle() == '休み'){
      let dateString = Utilities.formatDate(today, "JST", "M/d"); // 今日の日付
      let recipient = '☓☓☓@gmail.com'; // 宛先
      let myName = '某'; // 自分の名前
      let subject = `【勤怠連絡】${dateString} 有給 ${myName}`;// 件名
      let body = '今日は休みだ\n'
        + 'わっしょいわっしょい';
        GmailApp.sendEmail(recipient, subject, body);
    };
  }
}
```

あとはこれを毎朝実行するように、トリガーを設定すればOK。
と思いきやまだ続きます。

## 時間設定を変更する

`new Date()`の出力結果が、アメリカ時間（-13h）になってしまいます。
これでは朝実行したら昨日の予定を取ってきてしまうので、時間設定を日本時間に変更します。
手順は以下

- サイドメニューの`プロジェクトの設定`から`「appsscript.json」マニフェスト ファイルをエディタで表示する`にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231065/7ababe7a-b5e6-62a2-487e-34c8b79322ca.png)

- エディタで`appsscript.json`を開いて`timeZone`の設定を`Asia/Tokyo`に変更する

```json:appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

これでようやく**日本時間の今日** の予定を取ってきてくれる。


# 最後に
これでメール忘れの心配はなくなりました。
応用したら会議前にSlackとかで「資料読めよ」的なリマインドにも使えそう。
曜日固定の定例会議なら、Slackワークフローの方がお手軽ですが。
はじめてのGO のメモ

# はじめに

何となくGOを使ってみたいなと思い、linux に環境をインストールしてtutorial を行ったので、メモしておきます。
インストールについては、GOのページに書いてある情報で全く困らなかったので、tutorial のところだけメモしておきます。

https://go.dev/learn/

https://go.dev/doc/tutorial/getting-started

全くGOについて知識がないので、間違えがあるかもしれませんがご容赦ください。

# メモ

### Module file

以下のファイルがあり ```go run . ``` とするとHello world ができるか、と思いきや、できませんでした。

```golang:hello.go
package main
import "fmt"
func main() {
    fmt.Println("Hello, World!")
}
```

```
$ go run .
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
```

ソースコードで使用するモジュールの依存関係を調べて解決する必要がります。その情報は go.mod というファイルに書かれるようです。
That go.mod file stays with your code, including in your source code repository. とチュートリアルに書かれています。

```
$ go mod init example/hello
go: creating new go.mod: module example/hello
$ ls
go.mod  hello.go
```

とすると、go.mod というファイルが作られます。これで実行できるようになります。

```
$ go run .
Hello, World!
```

### モジュールを追加して使用する

今度は、モジュールを追加して使用します。ここでは、grc.io/quote というものを使います。
先程のhello.go に

```golang
import "grc.io/quote"
```

を追加してgo run . を実行すると、エラーが出ます。

```
$ go run .
hello.go:4:8: no required module provides package rsc.io/quote; to add it:
	go get rsc.io/quote
```

Tutorialに書かれている通り、以下を実行すると、自動的に追加されます。tidy は「几帳面」の意味らしい。

```
$ go mod tidy
go: finding module for package rsc.io/quote
go: found rsc.io/quote in rsc.io/quote v1.5.2
$ go run .
# example/hello
./hello.go:4:8: imported and not used: "rsc.io/quote"
```

実行すると、なんとimport したのに使っていない、と言われてしまします。

```golang:hello.go
package main

import "fmt"
import "rsc.io/quote"

func main() {
    fmt.Println("Hello, World!")
    fmt.Println(quote.Go())
}

```

これで実行できました。

```
$ go run .
Hello, World!
Don't communicate by sharing memory, share memory by communicating.
```

# まとめ

とりあえずtutorialを終えた。go.modが大切そう、という感じだけわかりました。何か作ってみたいが、いい題材はないかな。クラウド関係で。

良さげなページがあったのでメモ

- WEB application の開発
https://iij.github.io/bootcamp/server-app/go/#_0-1-%E7%9B%AE%E7%9A%84
- GCPのCloudRunのチュートリアルをGOで
https://cloud.google.com/run/docs/quickstarts?hl=ja
基本情報技術者試験対策　16日目

基本情報技術者試験勉強　16日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

今日の目標
-
ストラテジ系とマネジメント系は2問以内に抑えて、50問中、40問正解する。

間違えた箇所
-
①SLCPーJCF 
日本国内のユーザ，ベンダ，学識経験者が共同で策定した，国内版SLCPの共通フレーム

②PPP（Point-to-Point Protocol
電話回線を通じてコンピュータをネットワークに接続するダイヤルアップ接続で使われる、2点間を接続してデータ通信を行うための通信プロトコル。

③メモリリーク
プログラム上で確保したメモリが使用後も解放されずに主記憶上に残っている状態

④スラッシング
システムのオーダーヘッドが増加し、実行中のプログラムがCPUを使用している割合が極端に少なくなる現象

⑤USB
ツリー状に機器を接続できるシリアルインタフェース

⑥パラレルATA
CD-Rom、DVDに接続するパラレルインターフェース

⑥SCSI（Small Computer System Interface）
デイジーチェーンで接続するパラレルインターフェース

⑨DKIM（DomainKeys Identified Mail）
ディジタル証明をつかlっつえ、送信元ドメインの詐称がないことを確認

⑨SPF
電子メールの送信元のドメイン情報と電子メールを送信したサーバのIPアドレスから、ドメインの詐称がないことを確認

⑩チップセット
CPU,メモリ、などの間で発生するデータの受け渡しを管理する一連の回転群を搭載した半導体チップ

11、SoC（System on a Chip)
必要とされるすべての機能を同一プロセスで集積した半導体チップ

12、SIP（System In Package)
プロセスで異なる機能は、個別に構造化されたプロセスで創造し、パッケージ上でそれぞれのチップを適切に記憶した半導体チップ

13,マイクロコントローラ
CPU,チップセット、ビデオチップ、メモリなどコンピュータを構成するための電子回路基盤

振り返り
-
ネットワーク、コンピュータシステムあたりの正答率が低く、同じ問題を間違えてしまうことがあり、改善点。また、知らない問題もまだあるので、引き続き問題数をたくさんこなす。

>引用
基本情報技術者試験ドットコム
https://www.fe-siken.com
コメントの自動化

doxygenを利用して、コメントから自動に資料を作成することをやって見ました。
この度はその次の内容になります。

doxygen利用して、コメントから自動に資料を作成するのは良いですが、
色んなプログラミング言語をサポートすることも良いですが、
コメントの作成方法を勉強する必要がありますね。

それぞれの言語の独自のコメント書き方が慣れていれば、そのまま利用もできるし、
もし、慣れてない場合だったら、doxygenコメントのみを利用しても良いことにしたい！ーと思いました。
かつ、sassdocのコメントや基本的に入れて頂きたいコメントの内容もありました。
それで、vs-docblockrと言うvs codeの拡張機能を利用することにしました。


が、足りない部分がありました。
例えば、基本的に入れて頂きたいコメント内容とか色んな言語でdoxygenのコメントを利用したいとかのところが修正必要がありました。

sassdocのコメントはsassdoc拡張機能もありましたが、不足部分が多かったので、かつ、拡張機能一つで終わらせたいと言う希望からvs-docblockrを修正して、利用することにしました。

正式名は「VS DocBlockr」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516328/86825a67-7244-74d2-b4ba-03607cfb8894.png)

元のレポジトリはこちらです。
https://github.com/jeremyvii/vs-docblockr

今回プロジェクトのeslintに合わせて、doxygenやsassdocのコメントに合わせて、基本的なコメントは書くように変更した内容はこちらです。でたらめで、よろしくない実装になっているので、正式にプールリクエストやマーケの登録はしないですが、公開だけはやるのは、提供してくれた方への尊重の表現です。

https://github.com/heedaily/vs-docblockr

後で、時間が有ったら、概要や説明までも自動に記載してくれるように変更したいと思います。
説明をAI利用して、自動に書いてくれる拡張機能は既にありまして、日本語は支援しないため、日本語翻訳機能も追加が必要とは思います。

インストールしたら、設定からscssのコメント書き方を変更することを忘れないようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516328/fcb10ff7-684b-b71c-e187-8bdc568a2da7.png)
Goを始める時に役立つ資料

何か言語を学びたいので、学びながら良かった記事をまとめていきます。
学んで何か作ってみないと、言語の良し悪しはわからないのでガンガンいきましょう。

まだ全然マスター出来てませんが、特別に良いなーと思ったのは

1位　Haskell
2位　Rust
3位　OCaml, F#
4位　C++
5位　JavaScript
6位　Python

でした。
難易度が高い言語が上位ですが偶然です。
学習コストは低ければ低いほど良いと思ってるので
Goにかなり期待✨

学びながらまとめていきます。随時更新

※ 基礎的な文法を一通り見ました。シンプルな良さって感じで良い言語です。
Rustと同位でHaskellの次に好きな言語になりそうです。
ジェネリクスも導入されメッチャ良い言語✨

<br><br>






## 日本語リンク集

<br>

[A Tour of Go](https://go-tour-jp.appspot.com/list)  

<br>

[はじめてのGo―シンプルな言語仕様，型システム，並行処理](https://gihyo.jp/dev/feature/01/go_4beginners)  

<br>

[お気楽 Go 言語プログラミング入門](http://www.nct9.ne.jp/m_hiroi/golang/index.html)  

<br>

[他言語プログラマがgolangの基本を押さえる為のまとめ](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7)  

<br>

[他言語から来た人がGoを使い始めてすぐハマったこととその答え](https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)  

<br>

[golang チートシート](https://qiita.com/jca02266/items/56a4fb7b07b692a6bf34)  

<br>

[Go言語：文法基礎まとめ](https://qiita.com/HiromuMasuda0228/items/65b9a593275f769f6b69)  

<br>

[とほほのGo言語入門](https://www.tohoho-web.com/ex/golang.html)  

<br>

[【Go】基本文法総まとめ](https://qiita.com/k-penguin-sato/items/deaeab18aa416496e273)  

<br>

[【初中級編】Go言語を始める方のための落とし穴、問題の解決方法やよくある間違い](https://qiita.com/tutuz/items/fedb8e3a1137d046f418)  

<br><br>


## 文字列操作

<br>

[[Golang] 文字列操作サンプル](https://qiita.com/tchnkmr/items/b3d0b884db8d7d91fb1b)  






<br><br>


# goroutine

<br>

[Goのgoroutine, channelをちょっと攻略！](https://qiita.com/taigamikami/items/fc798cdd6a4eaf9a7d5e)  

<br>

[goroutine と channel で始める非同期処理](https://qiita.com/convto/items/b2e95e549f35a1beb0b8)  

<br>

[Go言語による並行処理備忘録 ~goroutine基礎編~](https://qiita.com/yoshinori_hisakawa/items/486752636cf66225483a)  

<br>

[goroutine と channel を使った並行処理のパターン](https://qiita.com/kkohtaka/items/c42bfc75bede7cd8dc50)  

<br>

[Go 言語の goroutine と channel についての考察](https://qiita.com/izariuo440/items/9e1b1faabcee6e2e94c0)  



<br><br>












## Tips

<br>

[逆引きGolang](https://ashitani.jp/golangtips/index.html)  

<br>

[Goの言語仕様書精読のススメ & 英語彙集](https://zenn.dev/hsaki/articles/gospecdictionary)  

<br>

[Goのなぜ問答](https://zenn.dev/nobonobo/articles/9a9f12b27bfde9)  





<br><br>





## モジュール管理

<br>

[Go のモジュール管理](https://zenn.dev/spiegel/articles/20210223-go-module-aware-mode)  

<br>

[Goのプロジェクト構成の基本](https://zenn.dev/nobonobo/articles/4fb018a24f9ee9)  



<br><br>





## プログラミング　サンプル

<br>

[Go by Example](https://gobyexample.com)  

<br>

[golangで作るTCPIPプロトコル](https://zenn.dev/satoken/articles/golang-tcpip)  

<br>

[GoでシンプルなHTTPサーバを自作する](https://qiita.com/tutuz/items/ab1fd3c0ee6fa01e08b6)  

<br>

[Go言語の golang/go パッケージで初めての構文解析](https://qiita.com/po3rin/items/a19d96d29284108ad442)  
























<br><br><br><br><br><br><br><br><br><br>
[Python] 要素のスワップについてのメモ

## はじめに
プログラミングの勉強としてアルゴリズム関連の本を読んでいるのですが、バブルソートか何かの話で２つの要素をスワップする際のコードを見て「そんなことできるんだ」と思ったので、関連知識も含めてのメモです。



### どういうことかというと


``` python:python.py
>>> l=[1, 0]

>>> print(l)
[1, 0]
```

最も単純化し、こんな配列を考えてみます。この二つの要素をスワップしたいとします。
誠実な方法としては、以下のような書き方が考えられます。

```python:python.py
>>> l[0] = temp0
>>> l[1] = temp1

>>> l[0] = temp1
>>> l[1] = temp0

>>> print(l)
[0, 1]
```

エレガントではないですね。
そんなとき、Pythonなら以下のように書けるということです。

``` python:python.py
>>> l[0], l[1] = l[1], l[0]

>>> print(l)
[0, 1]

#もしくは、2変数なら
>>> a, b = 1, 0
>>> a, b = b, a

>>>print(a, b)
0, 1
```

どういう仕組みになっているのでしょうか。
参考になりそうな記事を見つけたので紹介させていただきます。(https://www.haya-programming.com/entry/2018/09/19/195828)

>3つまではスタックを用いた高速な処理を行うよう最適化されている。
>4つ以上ある場合は（たぶん最適化を実装するのが面倒くさいので）tupleにしてシーケンスアンパックで処理する。

ちゃんと想定された動作のようなので、エレガントな記述を気兼ねなく使えます。

もちろん、以下のように書くと見た目通りの処理が行われるので、注意が必要です。

``` python:python.py
>>> l[0] = l[1]
>>> l[1] = l[0]

>>> print(l)
[0, 0]
```
【プリンシプルオブプログラミング】 第3章（3.29~3.36）「思想」要点抜粋

この記事は「プリンシプルオブプログラミング」という書籍の、特に重要だと感じた部分を紹介します。この書籍は全部で7章あります。1記事につき1章（項目が多い章は分割）を取り上げていき、今回は第3章（7つの設計原理）の部分です。
### 第3章 「思想」 〜プログラミングのイデオロギー〜
# 3.29 7つの設計原理
###### 障害を作り込まないために考慮すべき、コード構造上の7つの核心観点（コードレビュー時のチェック観点）
- 単純原理（3.30）
- 同型原理（3.31）
- 対称原理（3.32）
- 階層原理（3.33）
- 線形原理≒透明原理（3.34）
- 明証原理（3.35）
- 安全原理（3.36）
# 3.30 単純原理
- シンプルにこだわる
# 3.31 同型原理
- 形にこだわり、同じことは同じように扱う（「一様性」を重視する「一様原理」と呼ばれる）
- 一貫性のあるコードを書く
# 3.32 対称原理
- 対称性（上⇄下、左⇄右、アクティブ⇄パッシブなど）にこだわる
# 3.33 階層原理
- 構造が階層であることにこだわる
# 3.34 線形原理≒透明原理
- 処理の流れを直線にこだわり、コードの見通しをよくする
- 処理の分岐を少なくする
# 3.35 明証原理
- ロジックをはっきりと証明することにこだわる
- 直感的でわかりやすいロジックにする
- 意味のない変数名などは使わない
- コードだけで明証できない場合は、コメント、ドキュメント、図などで正しさを証明する
# 3.36 安全原理
- 必然性のないところ、曖昧なところは安全サイドに設計する
- 要件と機能の理解、場合分けをコードに正しくブレイクダウンできると、ソフトウェアが安全に動作する確率が高くなる
VS Code のsettings.jsonってどこ？

私は、プログラミング初学者です。

加えて、英語が不得意なので、よくスペルミスをします。

ただ、その場で気づけたら良いのですが、気付かずに進めてしまうことが大半です。

加えて、そのミスで何時間も溶かしてしまうことが多々ありました。

これは解決しなきゃいけない問題だなと思っていたときに、上司から、VSCode に Code Spell 

Checker を導入すると良いと助言をいただいたので、調べて導入してみようと思い、記事を見つ

け他所で問題が起きました。

<h4><font color="crimson";>settings.jsonって........どこ？？</font></h4>

そうなんです。

みんな知ってるかのように書かれていたので、僕はここに書いておこうと思います。

こっからが本題ですがサクッといきましょう。

①左下の設定ボタンを押す
![スクリーンショット 2022-03-26 23.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606285/55a935b0-a762-df51-067f-b67ac301336e.png)

②右上の三つ並んでるボタンの真ん中押す
![スクリーンショット 2022-03-26 23.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606285/58ef9ff4-edec-e5f3-7f31-e46e6cf47b43.png)

これで出てくるはず.....

以上！！
【Python】取得したSQLite3のデータを辞書型に整える方法

PythonでSQLite３のデータを取得し、辞書型に整える方法を記載します。
辞書型は{ key : value }の構成にすることで情報の紐付けができるため、
どのような値なのかが分かりやすくなります。
今回はKeyをDBのカラム名、Valueは格納されているデータの値になります。

## 目指すゴール
以下のようなデータを作成します。

 ```
[
    { "id" : 1, "fruit" : "apple", "price" : 100 },
    { "id" : 2, "fruit" : "banana", "price" : 150 },
    { "id" : 3, "fruit" : "peach", "price" : 120 }
]
```
for文で扱いやすいようリスト型の中に辞書型が複数存在するデータを作成します。

## データの準備
データを作成するスクリプトは以下になります。
```python:insert.py
import sqlite3

db_name = 'test.db'

conn = sqlite3.connect(db_name)
cur = conn.cursor()
cur.execute('CREATE TABLE items(id INTEGER PRIMARY KEY AUTOINCREMENT, fruit STRING, price INTEGER)')

cur.execute('insert into items(fruit, price) values("apple", 100)')
cur.execute('insert into items(fruit, price) values("banana", 150)')
cur.execute('insert into items(fruit, price) values("peach", 120)')

conn.commit()
conn.close()

```

## 1つのデータを辞書型にする
いきなり複数データを処理するよりまず1つのデータで、
うまくいくか確認してからfor文で対応するようにします。

以下対応をします。
* DBデータをselect文で取得する
* selectしてきたデータをリスト型に変換する : fetchall関数
* 2つのリストを辞書型に変換 : dict( zip( list1, list2 ) )

```python
import sqlite3

dbname = 'test.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
db_col = [ "id", "fruit", "price" ]
cur.execute('select * from items')
select_items = cur.fetchall()
result = dict(zip(db_col, select_items[0]))
print(result)

conn.close()
```
`cur.execute('select * from items')`でitemsテーブル内全データを取得します。
sqlite3の関数でfetchall関数で、select文を取得してデータをリスト型をして取得します。
`dict(zip(db_col, select_items[0]))`でdb_colのリストとfetcall()でリスト化したデータの１番目を辞書型に変換します。
以下が実行結果になります。
```
{'id': 1, 'fruit': 'apple', 'price': 100}
```
これで1つのデータを辞書型にできたので、これをfor文で複数データを辞書型にしていきます。

## 複数データを辞書型にする
for文で辞書型に変換し、リストに追加していきます。
```python
import sqlite3

dbname = 'test.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()
db_col = [ "id", "fruit", "price" ]
cur.execute('select * from items')
select_items = cur.fetchall()
result_list = [] # 空のリストを作成
for item in select_items:
  d_item = dict(zip(db_col, item))
  result_list.append(d_item)

print(result_list)

conn.close()
```

select文で取得したデータをfor文で1つずつ辞書型に変換し、
`result_list.append`で作成した空のリストに追加していきます。
以下実行結果
```
[
    {'id': 1, 'fruit': 'apple','price': 100}, 
    {'id': 2, 'fruit': 'banana', 'price': 150}, 
    {'id': 3, 'fruit': 'peach', 'price': 120}
]
```

## 参考サイト
[https://qiita.com/drafts/8191896ea8577a0213aa/edit](https://qiita.com/drafts/8191896ea8577a0213aa/edit)
[https://note.nkmk.me/python-zip-usage-for/](https://note.nkmk.me/python-zip-usage-for/)
【 Java＿インクリメント演算子とデクリメント演算子 】

現在独学でJavaを学習中です。
この投稿はその備忘録になります。

## インクリメント演算子とデクリメント演算子
■インクリメント演算子( ++ )
　対象の値をひとつ増やす
■デクリメント演算子( -- )
　対象の値をひとつ減らす

##### それぞれの使用例
```java
■インクリメント演算子■
int num = 5;
num++;

System.out.println(num);   //6

■デクリメント演算子■
int num = 5;
num--;

System.out.println(num);   //4
```

### 前置と後置の違い
```java
■前置き■
++num
--num
■後置き■
num++
num--
```
##### 結果が同じになる使用例
```java
■後置き■
int x = 5;

x++;
System.out.pritnln(x);    //6
```
```java
■前置き■
int x = 5;

++x;
System.out.println(x);    //6
```
##### 結果が異なる使用例
〜結果を別の変数に代入すると結果が異なります〜
```java
■後置き■
int x =5;
int y;

y = x++;
System.out.println(x);   //6
System.out.println(y);   //5
```
y = x++のように演算子を後置きすると
・y = x
・X = x + 1
のように置き換えることができる。
```java
■前置き■
int x = 5;
int y;

y = ++x;
System.out.println(x);    //6
System.out.println(y);    //6
```
y = ++xのように演算子を前置きすると
・x = x + 1
・y = x
のように置き換えることができる。

### 注意点
・使用できるのは変数にたいしてだけ
・前置きと後置きでは結果が異なってくるので使い分けが必要


以上です。
AWS Cloud9でCodeCommitを利用する

# 背景・目的
[AWS Cloud9を試してみた](https://qiita.com/zumastee/items/312d20594b7eecbd533d)で作成したCloud9環境に、CodeCommit環境を構築する。

# 内容
## 事前準備
### リポジトリを事前に作成する。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/beb0c7f6-1905-ca95-58a6-aabc2720e449.png">

### Gitのバージョンを確認する
- CodeCommit は Git バージョン 1.7.9 以降をサポートしている。

```
$ sudo yum -y update
$ git --version
git version 2.32.0
$ 
```
### Git Configで環境を設定する
```
$ git config --global user.name "XXXXX"
$ git config --global user.email "XXXX@XXXX"
$ git config --global core.editor 'vim -c "set fenc=utf-8"'
$ git config --global color.diff auto
$ git config --global color.status auto
$ git config --global color.branch auto
```

## CodeCommitを操作する
### 作成したリポジトリをCloneする
```
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/jupyter-repo
Cloning into 'jupyter-repo'...
warning: You appear to have cloned an empty repository.
$ ls -l
drwxrwxr-x 3 ec2-user ec2-user   18 Mar 26 13:42 jupyter-repo
$ 
```
### ファイルを作成しPushする
```
$ pwd
/home/ec2-user/jupyter-repo
$ ls -l
total 4
-rw-rw-r-- 1 ec2-user ec2-user 15 Mar 26 13:50 README.md
$ cat README.md 
# first commit
$ git add .
$ git commit -a
$ git push origin master
```
### リポジトリを確認する
- ファイルが追加された。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6c992b38-9f1f-be1c-9d69-68df231ee11e.png">

# 参考
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ide-c9.html#setting-up-ide-c9-connect
備忘録 : ABC243に参加したよ

## はじめに
競技プログラミングを初心者なりに頑張っているのですが、「どう解いたかを記録して、将来的に見返せるようにするといいよ」なんてことを小耳に挟んだので、備忘録として書いてみます。

### A - Shampoo

https://atcoder.jp/contests/abc243/tasks/abc243_a

問題文要約：
父(A ml使用)・母(B ml使用)・高橋君(C ml使用)が、V ml残っているシャンプーを順番に減らしていきます。
足りなくなっちゃうのは誰？

#### 考えたこと：
modを使うことも一瞬考えたけど、max(V) = 10^5なので、素直にVから減らしていくループを回し、負になった時点で終了すれば良さそう。

```python:python.py
V, A, B, C = map(int, input().split())
while True:
    if V-A < 0:
        print("F")
        break
    else:
        V -= A
    if V-B < 0:
        print("M")
        break
    else:
        V -= B 
    if V-C < 0:
        print("T")
        break
    else:
        V -= C
```

3:22も掛かってるので、ちょっと遅かった。A問題は素直にシミュレートする思考だけに制限してもよさそう。

------

### B - Hit and Blow

https://atcoder.jp/contests/abc243/tasks/abc243_b

Wordle的なやつ。

問題文要約：

同じ長さ(N)の整数列A, Bが与えられます。
・同じ位置で同じ数字(Wordleの緑)の個数
・違う位置だけどどちらにも含まれている数字(Wordleの黄色)の個数
をそれぞれ求めてください。

#### 考えたこと
「どちらにも含まれている数字」の集合からそれぞれの条件で分類する話だったので、とりあえず積集合でどちらにも含まれているものを取り出し、「積集合に含まれているかどうか → 位置が一致しているかどうか」で判定すれば良さそう。

```python:python.py
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
 
AB = set(A)&set(B)
cnt1 = set()
cnt2 = set()
for i in range(N):
    if A[i] in AB:
        if A[i] == AB[i]:
            cnt1.add(A[i])
        else:
            cnt2.add(A[i]
 
print(len(cnt1))
print(len(cnt2))
```

pythonのset型、めちゃめちゃ便利で多用しがち。→[スーパー初心者の頃にset型に出会ったときの記事](https://qiita.com/zhengxi__/items/d320e0e94d712746eabf)

------

### C - Collision 2

https://atcoder.jp/contests/abc243/tasks/abc243_c

問題文要約：

$xy$ 座標平面に $N$ 人います。
それぞれの人 $i$ は右左どちらか一方に動けますが、それは文字列Sの $S_i$ によって定まっています。
全ての人を動かし続けたとき、お互いにぶつかる人はいるでしょうか？

#### 考えたこと

とりあえずyが同じ人同士でないと絶対にぶつからないので、yが同じ人同士をまとめ、その中でxを降順に並べ、「右に動く人」の右側に「左に動く人」が存在すればぶつかるので、それを判定した。

```python:python.py
N = int(input())
array = []
for i in range(N):
    x,y = map(int, input().split())
    array.append([y,x])
    
S = list(input())
for i in range(N):
    array[i].append(S[i])
    
array.sort()
 
flag = 0
for i in range(N-1):
    if flag == 0:
        if array[i][0] == array[i+1][0]:
            if array[i][2] == "R":
                flag = 1
    if flag == 1:
        if array[i][0] == array[i+1][0]:
            if array[i+1][2] == "L":
                print("Yes")
                exit()
        else:
            flag = 0
            
print("No")
```

何を実装すれば良いのかは早めに思いついたのですが、Sのインデックスの管理とか、「yが同じ人同士をまとめ、その中でxを降順に並べる」をどうすればいいか手間取ってしまい、43分時点で提出。

結局 $[y,x,S_i]$ の順番でリストを作ってソートをかければ、ソートの優先順位的にうまくいくことに気づいた。

ぶつかるかどうかの判定についても、「yが同じ人たちの中で『右に動く人』がいる時点でフラグを立て、その後に『左に動く人』がいれば良い」というやり方で実装したが、解説ではもっとスマートに判定していたので、参考にしたい。

------

### D - Moves on Binary Tree

https://atcoder.jp/contests/abc243/tasks/abc243_d

問題文要約：

完全二分木があります。
文字列Sのi番目がUなら木の親に移り、Lなら左の子に移り、Rなら右の子に移るのをシミュレートしてください。

#### 考えたこと

「なるほど、N = 10^6で乗除を愚直にやっていたらデカい数字のときに間に合わないからなんとかしてね」ってことか......まではすぐ考えた。ただ、一歩手前で撃沈。

この問題を解く数日前にビット演算についてちょっと触れていたので、「//2じゃなくて<< 1なら演算早いのでは？」と思ったんですが、そんなことはなかったらしい。
直接二進数の文字列として操作すれば良かったのか......。考え方は合ってたので悔しい。

------

### まとめ
結局Dまでは解けなかったけれども、二進数でどうにかするという考え方自体は合っていたので満足してます。次は解き切れるように。
【プリンシプルオブプログラミング】 第3章（3.22~3.28）「思想」要点抜粋

この記事は「プリンシプルオブプログラミング」という書籍の、特に重要だと感じた部分を紹介します。この書籍は全部で7章あります。1記事につき1章（項目が多い章は分割）を取り上げていき、今回は第3章（アーキテクチャ非機能要件）の部分です。
### 第3章 「思想」 〜プログラミングのイデオロギー〜
# 3.22 アーキテクチャ非機能要件
- アーキテクチャの設計時点から考慮されるべき観点（後回しでは間に合わない）
- 機能のテストは「何をするのか（What）」に着目
- 非機能のテストは「どのように動作するのか（How）」に着目
###### 非機能要件（機能面以外の全般）の観点
- 変更容易性
- 相互運用性
- 効率性
- 信頼性
- テスト容易性
- 再利用性
###### セキュリティ非機能要件
- 機密性、完全性、可用性は情報セキュリティの3大要素
# 3.23 変更容易性
- 簡単に修正、拡張、再組織化、別のプラットフォームに移行できるようにする
- 「保守性」「拡張性」「再構築」「移植性」の側面から考察する
# 3.24 相互運用性
- ほかのソフトウェアとやりとりする能力のこと
- プロトコルやデータ形式は業界の標準的な規格を選択する
# 3.25 効率性
- リソースをうまく使う
# 3.26 信頼性
- 機能を維持する能力のことで、「フォールトトレランス」「ロバストネス」の2つの側面がある 
# 3.27 テスト容易性
- 効率的にテストする能力
# 3.28 再利用性
- 再利用「する」「される」能力
- できるだけ作らず、どこからか借りてくるのが一番
- 「プラグイン」できるようにする
Emotetってなんぞや

# はじめに

最近私の身近でEmotetに感染したと言う話を聞きました。
実際に私もその組織に所属していたため攻撃を体験しましたが、全くEmotetについて知らなかったためこれを機に調べてみました。

## Emotetとは
攻撃者によって不正なメールに添付されるなどして、デバイス上でそのファイルを開くと感染するウイルス。

## なぜEmotetは拡大したか
- Emotet本体には不正なコードは含まないため不信感を抱かれにくい
- メールの巧妙さ
- ユーザ自身にファイルをダウンロードさせる

## Emotetに感染すると
- 他のマルウェアにも感染する
- 重要な情報を盗み取られる
- 社内の他の端末にEmotetが感染する
- 社外へのEmotetばらまきの踏み台にされる

## Emotetの対策
- メールのアドレスが不審なドメインになっていないか、送信元を確認する
- 添付ファイルのマクロが自動的に実行されないよう設定を確認する
- 本文中に挿入されているurlが不審なリンクになっていないか確認する
- 重要システムやデータのバックアップをとっておく

## Emotetに感染したら
- 感染の有無をチェックする
- 感染した端末のネットワークをインターネットから遮断する
- 他のマルウェア感染の有無を調査する
- 感染した端末を初期化する
- 感染したアカウントのメールアドレスとパスワードを変更する
- 感染拡大を防止する

## 参考資料
https://www.softbank.jp/biz/blog/business/articles/202202/emotet/

https://www.keishicho.metro.tokyo.lg.jp/kurashi/cyber/joho/emotet.html
PCをファイルサーバーにする

# 概要

- 古いパソコンをファイルサーバーとして使用するための設定メモ

# 環境

- パソコン
  - SSD x 2 を内蔵 ( M.2 SATA SSD + SATA SSD )
- OS
  - Ubuntu 20.04.4 LTS ( 作成時の最新 LTS )

# 設定方法

## PC の準備

### OS ( Ubuntu ) のインストール

これは [ubuntu のダウンロードページ](https://jp.ubuntu.com/download) から iso ファイルをダウンロードしてインストールする。

今回は M.2 SSD が SATA であることと、SATA の SSD のほうが容量が大きかったので

- M.2 SATA SSD にシステム
- SATA SSD を NAS

にする。( M.2 SSD が NVMe だったらこっちを NAS にしたほうがいいと思う )

### 設定

#### update, upgrade

```
$ sudo apt update
$ sudo apt upgrade
```

#### インストール

```
// samba
$ sudo apt install samba

// ifconfig が入ってなかった
$ sudo apt install net-tools

// モニタを接続しない予定なので ssh 接続できるように
$ sudo apt install openssh-server
```

#### ディスクの設定

- 今回は SATA SSD を使用するのでマウントする
- 再起動してもマウントされるように fstab を設定する

```
// マウントするディレクトリを mkdir する
$ mkdir [マウントするPATH]

// ディスクの確認と UUID の確認
$ sudo blkid
```

/etc/fstab の編集
以下の内容を追記する ( ext4 でフォーマットしている )

```
UUID=[blkidで調べたUUID] [マウントするディレクトリ] ext4 defaults 0 0
```

### samba の設定

/etc/samba/smb.conf の編集
以下の内容を追記する

```
workgroup = workgroup

[share]
    path = [共有するディレクトリのPATH ( 上記でマウントしたPATH + ディレクトリ )]
    writable = yes
    browseable = yes
    guest ok = no
```

smbd の再起動

```
$ sudo service smbd restart
```

### IP アドレスの固定

IP アドレスを固定する

### アカウント関連

```
// useradd とかでアカウントを作っておく

// sambaパスワードを作成
$ sudo smbpasswd -a [アカウント名]
```

# 参考情報

- [日本 Samba ユーザー会 Web サイト](http://www.samba.gr.jp/)
- [@IT ( 【 useradd 】コマンド――新規ユーザーを作成する )](https://atmarkit.itmedia.co.jp/ait/articles/1811/02/news035.html)
UE5 Preview版のconsole variables editor紹介

先月、UE5のPreview版が公開されましたが

https://www.unrealengine.com/ja/blog/unreal-engine-5-is-now-available-in-preview

その中で「Console Variables Editor」という、役立ちそうなプラグインが追加されていましたので共有記事です。

## 利用バージョン
5.0.0 Preview2
エディタ言語：English 
<b>※エディタ言語が日本語だと正常に動作しなさそう</b>

## どんな機能？
触った感じ、UEのコンソールでコンソールコマンドを簡単に実行したり、調整、管理出来るプラグインのようです。

## 有効化する
Edit→Pluginから「Console Variables Editor」を検索して有効にしましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/4fab25e1-ae44-59a9-5a73-676921fb9375.png)

## Console Variable Collectionを作成する
プラグインを入れると、右クリックのコンテンツ作成から「Console Variable Collection」を作成出来るようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/bf18a7a8-4ff1-d7fc-20f6-f8e27e2f6e36.png)

Console Variable Collectionを作成してクリックすると、以下のような画面が開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/d38c3c16-2b42-52c3-faac-1e05cbb7ef9b.png)

## コマンドを追加する
左上の「+Console Variable」を押すと「Enter Console Command」と出るので、試しに「stat fps」と打ち込んでみると、以下のような画面になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/a1828f5d-101f-3fb4-c040-cd2eeba08393.png)
この時点で便利やん！って感じですが、追加された「Execute」のボタンを押すことで、stat fpsのon/offが行えるようになります。

On/off以外も対応していて、つづいて「r.Color.Max」と打ち込んでみます。
最初は1.0とValueの所に出ていますが、この数値をリアルタイムで調整可能です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/ktQscfvvNc0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

便利やん

## プリセットを追加する
さらに、こちらの追加したコマンドですが、プリセットとして保存することができます。
右上にある「Presets」から「Save Preset」を押すことで保存が行えます
（現時点では、保存しない状態で違うタブを開いたりすると追加されたものが消えるようなので注意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/a7947954-9044-ad25-1812-bb59c1318b49.png)
よく使うコンソールコマンドをプリセットとして登録しておくとよさそうですね。
便利やん

## 導入のメリット
このプラグインの導入によって、上記で上げたようなコンソールコマンドのOn/Offをポチポチすることで行えたり、パラメータ調整が容易に行えますね。

あとプリセットが保存出来るので、例えば
・パフォーマンスを確認、調整するためのプリセット
・デザイナーがビジュアルを確認、調整するためのプリセット
のような細かい用途に応じたプリセットを作成、管理を行い、使ってもらうことで

・それぞれのコンソールマンドに対する知識も統一できそう
（このコマンドはこの人しか知らない、使ってない、みたいのが起きづらくなる）
・コンソールコマンド、しばらく使わないと忘れていくので、用途に応じたプリセットを保存しておけば、リファレンス的にも使えそう
などメリットがありそうです。

あと地味に、コマンドにマウスオーバーすると説明文が出るのもありがたいですね。（日本語だともっとありがたいけど）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/98d73d00-e3f8-88f1-9fd1-544949dc8f97.png)

## さいごに
なんとこのプラグイン、エディタが日本語だと使えなさそうです。便利じゃないやん..

正確に言うと追加したコマンドがリストに出てこないようです。
ここはまだベータといったところかなと思います。ベータが取れる頃には治っているといいな。

----
というわけで、（個人的）神プラグインのご紹介でした
まだBetaではありますが、すぐにでも使えるプラグインだと思うので、気になる方はぜひ使ってみてください。
Professional DevOps Engineerのサンプル問題について解説 2/2(#6-#10)

Professional DevOps Engineerは2022/3に追加された試験。名前通り、OutSystemsでCI/CDを始めとするDevOpsを実践するための知識が問われる。

試験情報のPDFと一緒にダウンロードできるサンプル問題を解説する。
全部で10問で、この記事では6問目-10問目が対象。

1問目-5問目の記事: [Professional DevOps Engineerのサンプル問題について解説 1/2(#1-#5)](https://qiita.com/jyunji_watanabe/items/e15a2f1467cd8dc933b2)

サンプル問題は、
https://www.outsystems.com/learn/certifications/
の、「Professional DevOps Engineer」項目のリンク「Exam Details」でダウンロードできる資料から。「Sample Exam」がついている方のファイルが該当する。

# 6 テストピラミッド
テストピラミッドという用語は、OutSystems独自のものではない。
いくつかのバリエーションがあるようだが、概ね、ユニットテスト・APIテスト・E2Eテストを順番に積み上げた三角形を描き、これをテストピラミッドと呼ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/06e766de-fb69-95c1-021a-28fd1d20dc24.png)

より下にあるテストの方が、

- 実行が早い
- 作成も簡単

であるため、可能な限り下にある階層のテストを優先するように勧められている。
つまり、下の方のテストの方がテストケースが多く含まれる。
よって、正解は選択肢D (ユニットテストのレイヤー）

# 7 BDDFramework
BDDFrameworkはOutSystems推奨のComponent Testingツール。
よって正解はB。

BDDFrameworkは、OutSystemsのTraditional Webモジュールとして自動テストを作成する。
したがって、テストプログラム中でOutSystemsのロジックを利用可能。
主なテスト対象はServer Action。場合によっては、Service Action・REST・SOAPなど。Client Acitonについては、BDDFramework Client Sideという別のツールを利用する。

ちなみに、コンポーネントテストというのは、PublicなActionに対して作成するテスト。対象Actionの粒度によって、Unit Test・API/Service Test・E2D Testのいずれかになる。

他の選択肢を見ておくと、

- A(UI Testing): UIはUI用の別のテストツールを使う。また、Screen ActionはBDDFrameworkの対象にできない（Screen ActionはPublicにできないため）
- C(Load Testing): 負荷テストは別のツールを使う。JMeterなど
- D(Regression Testing): 回帰テストのこと。BDDFrameworkで作ったテストも回帰テストとして実行されるが、回帰テストにはUIテストのようにBDDFrameworkでは実現できないものも含まれる

# 8 UIテスト
設問は「エンドユーザーの画面を通した操作をシミュレーションすることによってアプリケーションの機能をテストする」ことなので、そのまま選択肢DのUI Testingが正解。

# 9 Performance Monitoring APIの設定
Request Eventを取得する[Performance Monitoring API](https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_APIs/PerformanceMonitoring_API)を使うためには、

> アプリケーションでこのメソッドを使用するには、環境とアプリケーションモジュールに対する監視がいずれもオンになっていること

という条件がある。
この監視は、LifeTimeアプリケーションのANALYTICSタブで、Environment Monitoring Statusのトグルをオンにする。

よって、正解は選択肢CのLifeTime -> Analytics -> Configurations

# 10 Performance Monitoring APIでしか取れないデータ
選択肢を見ていく。

- A(Queries Performance): 時間がかかるクエリがあると、Service CenterのGeneral LogにSlow Queryのログが出る
- B(General logs): Service Centerの同名のタブで見られる
- C(Request events): このデータはPerformance Monitoring APIでしか取得できない
- D(Extensions performance): これも遅いと、General LogにSlow Extensionsのログが出る

よって、選択肢C Request eventsがPerformance Monitoring APIでしか取得できないので正解。
Dynamics 365 Finance and Operations ~ 標準原価 ~

標準原価を使用して品目の原価管理をしたい製造業のお客様は多くいらっしゃいます。標準原価は、製造時の目標値となり、製造に必要な労働力や材料の消費量を統計的に調査して算定します。そして、実際原価との乖離を見て、何の材料で・どこの工程で・どのオーダーで問題があるかを分析していきます（原価差異分析）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/db5941e7-402a-44c2-5037-c0f8bc52f5ea.png)

# D365 FO で標準原価を導入する上で
・標準原価を品目に設定する → 品目作成時の「品目モデルグループ」に"標準原価"を設定する。
・原価差異（配賦差異勘定や賃率差異）を勘定科目に設定する → 「CoA」（勘定科目表）の Posting に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/f828c07a-2207-6dc5-d24a-617bc9c67ead.png)
・原価差異を分析するコストグループごとの計算を有効化する → 「在庫会計ポリシーの設定」の原価内訳に"補助元帳"を設定する。
例. 補助元帳（材料元帳）を見てみると、6ドルの実際費用が掛かっているが、標準原価では4ドルなので、2ドルの材料費価格差異（不利差異）が発生している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/0eeadaa4-50d1-ed6b-3c17-650ea80e3f67.png)
・実際原価との乖離・差異を確認する → 定期的にチェックする運用を検討する。
　　✓ どこで原価差異が発生している？
　　✓ 実際原価はかなり変動的か？
　　✓ 原価差異をGLに転記している？
　　✓ 他の品目でも差異がある？特定の品目だけ大きな差異がある？
原価差異分析の手法は色々なものがあるかと思いますので、説明は割愛いたします（みなさんの方が得意でしょう...）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/d7a015cb-ac18-b3c2-97e6-cd18149df599.png)
・通常1年に一回ぐらい価格の見直しをかけて、新しい価格にする → 品目の「原価バージョン」にて価格を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/605ffa8c-c6e4-b957-49de-c042d95f521b.png)
スマホのメニューバーに左右されたくない人に送る記事


## はじめに
スマホでブラウザを開くとメニューバーがある時にデザインが狂ったりしませんか？

## そんな時にこちら
Safari15.4で新たに追加されたCSSの単位を利用すればすぐにメニューバーに狂わされることなく実装できます。


```
100svh, 100svw :メニューバーが表示されていない時の画面が１００になる
100lvh, 100lvw :メニューバーが表示された時の画面が100になる
100dvh, 100dvw :現在表示されている画面が１００になる(メニューバーがなければ100svhになり、あれば100lvhになる)
```

```
body {
  height: 100vh;
  height: 100dvh;
  width: 100vw;
  width: 100dvw;
}

注: 2022/03/26現在Safari15.4しか対応していないのでheight:100vhも記述する必要がある
```

従来はメニューバーありの時のために
```css
.my-element {
  height: 100vh;
  height: calc(var(--vh, 1vh) * 100);
}
```

```javascript
let vh = window.innerHeight * 0.01;

document.documentElement.style.setProperty('--vh', `${vh}px`);
```

と処理を追加したりしていましたが、単位指定すればすぐ実装できるのでかなり便利になりましたね。
現在はSafariでしか採用されていないため他のブラウザでも採用されるといいですね。

## 参考資料
https://css-tricks.com/the-trick-to-viewport-units-on-mobile/

https://webkit.org/blog/12445/new-webkit-features-in-safari-15-4/
[Laravel]APIを作る上でのキャッシュの扱い

# はじめに

Laravel（8.5.0）で[APIリソース]([https://readouble.com/laravel/8.x/ja/eloquent-resources.html](https://readouble.com/laravel/8.x/ja/eloquent-resources.html))を使ってAPI呼び出し時のjsonの返却機能を別クラスに移行する、という作業をする際に先輩から

「キャッシュはいじらないでね。APIのキャッシュは基本禁止だから。キャッシュの設定ミスによる情報漏洩はよくある話だよ」

と念押しされた。

ただ、この「APIのキャッシュは基本禁止」と「情報漏洩」の関係性が理解できず色々と勉強した結果をメモ

# どういうことか？

## 起きうる事象

ここでいう情報漏洩とは、具体的には

「Aさん向けのjsonレスポンスがキャッシュされてBさんに見えてしまう」

などのことが起きうる、ということ。

これはAPIというものが**決まったURLにアクセスするとリソースのデータがjsonで取得できる可能性がある**という特性が前提にある。

尚、この情報漏洩についてはIPAの図解が非常にわかりやすかった

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html

## 現状

現状は、今のキャッシュの設定は
> Cache-Controll : no-cache, **private**

であった。ちなみに、これはLaravelのデフォルト設定。

このキャッシュの設定の内、privateは以下の意味を持つ

> **Cache-Control: private**
Webサーバから返されるコンテンツがただ一人のユーザのためのものであることを示す。このコンテンツは、複数のユーザが共有されるキャッシュに記録されるべきではないことを表している。

※IPAの記事より抜粋

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html


要はprivateは
「AさんのjsonデータはBさんはアクセスしてはいけません」
という場合に設定するべきものということ。

# 結論

要するに今回の先輩の

「APIのキャッシュは基本禁止」

というアドバイスは詳細を補足すると

「（APIリソースを導入しようとした際に何かの拍子でprivateを消してしまうと重大な脆弱性を生んでしまうので、）APIのキャッシュは基本禁止（で実装してね）」

ということだった。

# おわりに

この事実は知らなかったので、知れてよかったと思う

補足として、今回のような情報漏洩が具体的にどのキャッシュで起こるかというと、プロキシサーバ（IPAリンク先の図解の「中間サーバー」）で起こるとのこと。

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html

これはなかなか言われないと気づかない…
【プリンシプルオブプログラミング】 第3章（3.11~3.21）「思想」要点抜粋

この記事は「プリンシプルオブプログラミング」という書籍の、特に重要だと感じた部分を紹介します。この書籍は全部で7章あります。1記事につき1章（項目が多い章は分割）を取り上げていき、今回は第3章（アーキテクチャ根底技法）の部分です。
### 第3章 「思想」 〜プログラミングのイデオロギー〜
# 3.11 アーキテクチャ根底技法
###### よいコードの基礎原理
- 抽象（3.12）
- カプセル化（3.13）
- 情報隠蔽（3.14）
- パッケージ化（3.15）
- 関心の分離（3.16）
- 充足性、完全性、プリミティブ性（3.17）
- ポリシーと実装の分離（3.18）
- インターフェースと実装の分離（3.19）
- 参照の一点性（3.20）
- 分割統治（3.21）
# 3.12 抽象
- 抽象は「捨象」と「一般化」の2つの観点からまとめられる
- 捨象：対象物の本質をむき出しにすることで、複雑度を下げ、真なる問題に集中できるようにする
- 一般化：複数のものを、共通の特徴によってグルーピングし、「同じ」と見なすこと
- 複雑な対象に取り組むときは「捨象」する -> 余計なものを捨て、本質を捉える
- 異なる複数の対象に取り組むときは「一般化」する -> 共通点を組み合わせ、汎用的な概念を構成する
# 3.13 カプセル化
- 関連性の強いデータ群とロジック群を、モジュールという膜で包み込むこと
###### カプセル化のメリット
- 関連のない要素が混じらず、コードが見やすい
- 変更時の影響がモジュール内に閉じる
- 影響度が明確になり、コード変更が容易
- それぞれが独立した部品となり、再利用性が高まる
- 小さい単位に分割されるので、複雑な問題に対処できる
# 3.14 情報隠蔽
- クライアントが知る必要ない内部の詳細部分は見せない
- インターフェースが小さくなり、やりとりがシンプルになる
- コード全体の複雑性を下げる
###### カプセル化と情報隠蔽の違い
- カプセル化：関係ある要素を集めてモジュール化、関連の深いデータと関数を1箇所にまとめること
- 情報隠蔽：モジュールの内部状態や内部関数を隠蔽すること
###### 関連
- 「パルナスの規則」 
# 3.15 パッケージ化
- モジュール：コードの関連要素をカプセル化したもの
- パッケージ：モジュール群をグルーピングしたもの
###### パッケージ化のメリット
- ソフトウェア全体が、パッケージという小さい単位に分割され、複雑性が下がる
- パッケージ内は、関連のないモジュールが混じらず、管理しやすい
- 修正に対して、影響度がパッケージ内に留まる可能性が高く、コード変更がしやすい
- 依存関係が整理され、パッケージを単位とした再利用がしやすい
# 3.16 関心の分離
- 「関心」=ソフトウェアの機能や目的のこと
- 代表的なパターン：「MVC（Model-View-Controller）」
- 代表的な技術：「アスペクト指向プログラミング（AOP）」
# 3.17 充足性、完全性、プリミティブ性
- 充足性：モジュールが表現しようとしている抽象が、それを伝えるために十分であるか
- 完全性：モジュールが表現しようとしている抽象が、すべての特徴を備えているか
- プリミティブ性：モジュールが表現しようとしている抽象が、すべて純粋であるか
# 3.18 ポリシーと実装の分離
- 1つのモジュールで「ポリシー」と「実装」の両方を扱ってはいけない
- ポリシーモジュールはそれぞれのソフトウェアに特化しているため再利用できない
- 実装モジュールは「純粋」なモジュールである、再利用できる
# 3.19 インターフェースと実装の分離
- インターフェース：クライアントからの使われ方
- 実装：機能の実現方法
- インターフェースに対してプログラミングするのであって、実装に対してプログラミングするのではない
# 3.20 参照の一点性
- 変数の値を初期化したら、以後、値を変更しない（単一代入） -> 見通しのよいコードになる
# 3.21 分割統治
- 大きな問題は小さな問題に分け、個別に解決する
Qiita投稿テンプレート

投稿テンプレートです。コピペすれば動くはずです
チートシートについては以下を参照
[Qiita書き方メモ](https://qiita.com/sakekasunuts/items/c498654481e2c83497d3)
~~~
hogeをhugaしたい時はこうする。

## 目次
大項目|小項目 
:--|:--|
あああ|いいい|
ううう|えええ|

## 実際のコード[↑](#目次)
投稿内容の記載
```PowerShell:hoge.ps1
# ここにコードを記載
```

#### コードの解説[↑](#目次)
各コードの解説
コード|意味
:--|:--
あああ|いいい
ううう|えええ


####  参考にしたサイト[↑](#目次)
* [サイト名](URL)
~~~

## ↓コピペした際の見え方
<br>
hogeをhugaしたい時はこうする。

## 目次
大項目|小項目
:--|:--|
あああ|いいい|
ううう|えええ|

## 実際のコード[↑](#目次)
投稿内容の記載
```PowerShell:hoge.ps1
# ここにコードを記載
```

#### コードの解説[↑](#目次)
各コードの解説
コード|意味
:--|:--
あああ|いいい
ううう|えええ


####  参考にしたサイト[↑](#目次)
* [サイト名](URL)
モデルを作る

Railsではコントローラやビューからモデルを使うプログラムを書くことがほとんどであり、まず機能に関連するモデルを用意するのが一般的だ。

//Postモデルの作り方。//

モデルは主に
1,モデルに対応するRubyのクラス
2,モデルに対応するデータベースのテーブル
の二つから構成される。

ちなみに命名の規則として
１は大文字で
２は小文字の複数形で書かなければならない。

理由は簡単で、データベースは複数のものを取り出すときに使う。
また、モデルはデータベースの書き込みならず読み出しも行う。
モデルは単体でデータベースが複数あるイメージを持っていただけると命名規則もわかりやすいかと思う。

つまり今回、例えば
1モデルをTaskと名づけたのなら２のデータベースはtasksと複数形になる。

次にどんなカラムを持たせるのかも考える。
```
bin/rails g model [モデル名][属性名:データ型 属性名:データ型]
bin/rails g model Post name:string//短い文字列// comment:text //数字//
```

１、railsのモデルクラスはデータベースのテーブルに定義を読み込みます。
２、モデルを作成する場合はデータベースのテーブルに追加を行う。
３、データベースにテーブルを追加するには、railsの用意しているマイグレーションというファイルを作成する。
db/migrate/qqqqqqqq_create_posts.rb
というファイルの中に記述することで新しいデータベースのカラムを作成することができる。


//保存方法　これを忘れないこと！！！//
```
bin/rails db:migrate
```
でデータベースにテーブルが追加される。


モデルが動くためにはデータベースとモデルクラスが必要になってくる。
先ほどのgeneratorでapp/models/posts.rbがあるのでそこでモデルクラスは既に作られている。
これでモデルとデータベースの定義は終了です。


///コントローラーとビュとルーテイングの設定///
```
bin/rails g controller コントローラ名　[アクション名 アクション名]
bin/rails g controller posts index show edit new
```
config/routes.rbの中身
```
resources :posts
root to: 'posts#index'
```
resourcesモデルは前のアクションに関するルーテイングを一括でまとめてくれる。
またroot to でアクセス時にどこに最初に入っていくのかの設定もすることができる。
PowerAutomate: Excel コネクターの file パラメーターは 756 文字制限故に、識別子より完全パスがよさげ

# 背景
SharePoint 格納で、Excel ファイル自動化の際、file パラメーターに識別子を使ってたところ、
たまに実行エラーになっていた。

その原因調査と回避策の記録

# 結論
- 識別子(Identifier) を使うのではなく、完全パス(FullPath) を使いましょう。

ドキュメント上の file パラメーター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/4c8a962b-bac8-fe6f-42d9-b2b049279899.png)

実際のコネクターで言うと、以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/bb97c070-e348-0b83-8a18-17cbb6bd8de5.png)


# エラーについて
## 発生したエラー
よくある Bad Request
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/27069893-e462-9ac8-a5c1-bd1c3b891654.png)

エラーを見てみると
> HTTP Error 400. The request URL is invalid.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5ff94185-d0ac-2e0f-fb1c-d8cc6ad7463d.png)

正常に動いている中で、一部だけがエラーになるので質悪いんですよね・・。
でもって request URL はエラー内部には無し :thinking: 


## 原因調査
で、まぁ、知り合いが「長いんじゃね？」って突っ込んでくれたんで、制限を調査

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b73e1e17-e1cf-2a06-95cf-a61d82eeff43.png)

で、境界は、756 文字
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8fe9cdf5-2edd-5b5f-f57f-6d1f36c2d136.png)

## 回避策
他に使えるものは？とドキュメントを見ると
ファイルを一意指定子は以下な感じ

- ファイルID (ID)　
    - ライブラリ内の連番
- 識別子 (Identifier)
    - 完全パスを内部エンコードしてる？
- 完全パス (FullPath)　
    - 完全パスとかいいつつ、ライブラリ以下のパス。
    - ファイルへのリンクとして使いたいなら、{link} とか {thumbnail} を

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d01beeff-78d0-aa8e-3065-29410212ae6a.png)

識別子がエラーになるのは長すぎる為
何故長すぎるか？っていうと、エンコードがかかってるから
であれば、エンコードされてない完全パスを利用しようって流れですね

無事、識別子だとエラーになる場合でも、以下のように完全パスだと正常化しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/64d7a704-198a-1c38-5fdf-6143087fe6d3.png)

# あとがき
識別子、っていう名称的に、GUID 的なものかと思ってると嵌ってしまいますよね。
ドキュメントを指定してるので、File ID でもいいんじゃね？とか思うんですけど、現状使えない？

# 参考
https://docs.microsoft.com/ja-jp/connectors/excelonlinebusiness

# keyword
The limitation of 'file parameter' in Excel Connector is 756.