OmniAICreator/Qiita-1.07M huggingface dataset:
モダンなC++とは何なのか

これは次の記事に対する批判・訂正記事です. 元記事が修正されたら削除されます.
[おまえもしかしてまだ自分がモダンC++使わなくてもいいとでも思ってるんじゃないかね？](https://qiita.com/aki_senri/items/1c3f5a663070892ff17e)

# はじめに
何なのでしょうね？ コメントに書こうと思ったのですが長くなりそうなので. はじめに私のC++戦闘力は初心者です.
大正時代に西洋文化の風俗・流行を積極的に取り入れた若者達を, モガ・モボと呼んだそうです. モダンC++で`モピ`でしょうか. モダンという言葉は相対的で, ~~Qiitaはすぐしぬ~~C++99が発行されたときには不適切だと思います.
ドラスティックに変化したのはC++11であるという見解は一般的に賛同されそうなので, C++11がモダンであると定義してもよさそうです（2022年）. ですのでC++11がモダンであるとします.

私個人としては更新ごとに自身の知識も更新して, コードも再構築していけばいいのでは？という考えです.

まず, 非推奨だからダメです, は説明になっていないので特に言及しません. どうして非推奨になったのか, その代わりにどうすべきか, が最も重要だと思います.

# スマートポインタ
`auto_ptr`という, ブロック内の`newで確保した`リソースの解放を保障するポインタがありました. このポインタは配列には対応していない, コンテナやクラスのメンバに持つ用途を考慮していない, と用途が限定的でした. 用途が限定的なのに, その用途以外での使用を禁止することができなかったのが問題になっていました.
`auto_ptr`の代替として, `unique_ptr`が良いでしょう. `auto_ptr`が想定する範囲を含む一般的なリソース解放と名前のとおり所有者は唯一なことが保障されます, `COM`のような独自のリソース管理にも対応できなくもないです.
`shared_ptr`はリソースを共有したい場合に用います. 解法済みリソースへのアクセス, ２重解放やディープコピーの問題を解決します（するかもしれません, ディープコピーの問題はシステムの設計にも依存するのでスキップします）. 必ず`unique_ptr`以上のコストが必要です. 参照カウント方式で実装する場合, カウンタ用の追加のメモリ確保, ポインタサイズの増加やカウント増減のコストが必要です. 実際にみたイケていない事例では, Implイディオムに`shared_ptr`を使っていたことがあります.

# ラムダ式
ソートのcomparisonや, 探索のpredicate程度だと何がしたいかは明確だと思います.
ファイバやグリーンスレッドではない, カーネルスレッドに渡す関数で, 通常数行ではオーバヘッドの方が大きくなると予想されるので考えられず, 数百行のコードになることでしょう. 数百行のコードが可読性が良いかどうかは個人の感想だと思います.

そもそも論として可読性が悪くなる原因は, `メソッド名を考えなくて済む`のような態度にあるのではないでしょうか. コードが自身を明らかに説明するように, シンボル名を吟味したほうがよいのではないでしょうか.

# auto
仕事以外でコードを書く方や, 使い方を誤らなければ好きにすればと思いますが, 多用されたコードを見たいとは思わないです.
C#ですが, [COCOA](https://github.com/cocoa-mhlw/cocoa)のコードはJavascriptかな？と思います, 私は分かり易いとは思いません. なんちゃって型推論について, 推奨する方々は他人の書いたコードを読むということ, したことがあるのでしょうか？（私事でげきおこ）.
書いた本人が理解していることと, 他人が見て分かり易いは別物だと思います.

# constexpr
コンパイル時に評価してくれるかもしれない式, という認識でした.
`マクロとは異なり副作用がなく`は, マクロに副作用を埋め込むことができるのでしょうか？私は知らないので, 年明けにでもチャレンジしたいです（大嘘）, 意図しない置換とかそういう意味かと推測しますが.

# まとめ
先生のCppConでの公演を見ていると最近はC++教育への関心が高いように思います. それでも, 先生の著書にたびたび出現する`プログラマは自分のしていることを理解している`という趣旨の言は今でも有効なのかなと思います. C言語熟練者が有力ユーザであったころの名残はあるのかなと思います.
C++はセキュアになってもいないし, 実行効率がよりよくなってもいないと思います. セキュアな方法, 効率的な方法を選択できるようになりましたが, 誤用するとやはりアンセキュア, 非効率になる言語だと思います.
but it does not match your minimum-stability.

<details><summary>composer.jsonがないときは</summary>

```bash
echo {} > composer.json
```
</details>

```bash
composer config minimum-stability dev
```

https://stackoverflow.com/a/65847508/5602117

エラー内容

```bash
composer require amphp/http-client:v5.x-dev
./composer.json has been updated
Running composer update amphp/http-client
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires amphp/http-client v5.x-dev -> satisfiable by amphp/http-client[v5.x-dev].
    - amphp/http-client v5.x-dev requires php >=8.1 -> your php version (7.2.34) does not satisfy that requirement.


Installation failed, reverting ./composer.json to its original content.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/91efeb9b-6577-987f-48e4-ce7dbba08e2b.png)
Microsoft Azure: 秘密鍵を使ってサービスプリンシパルの認証を行う

Microsoft Azure で、秘密鍵を使ってサービスプリンシパルの認証情報を作成するコードを紹介します。 サービスプリンシパルに証明書を登録した場合は秘密鍵を使って認証できます。
さらに、その認証を利用して、 Azure Storage Account のコンテナ一覧、ファイル一覧を行なってみます。

## 環境

* Python 3.10.8
* pipでインストールしたもの
    * azure-identity     1.12.0
    * azure-storage-blob 12.14.1

## 認証情報を作成するコード

秘密鍵を使って認証情報を作成する場合は、 `azure.identity.CertificateCredential` を使います。
`CertificateCredential` のパラメータとなる `client_id`, `tenant_id` はサービスプリンシパルのページからわかります。

```python
import azure

config = {
    'client_id': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'tenant_id': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    "private_key_file": "sample.pem"
}

credential = azure.identity.CertificateCredential(
    config['tenant_id'],
    config['client_id'],
    config["private_key_file"]
)
```

## 認証を利用するコード

上で作成した認証情報を使って `BlobServiceClient` を作成し、 ファイルを表示します。
`account_url` は、各ストレージアカウントを表すURLで、 `{ストレージアカウント名}.blob.core.windows.net` がドメイン名になります。

```python
blob_service_client = azure.storage.blob.BlobServiceClient(
    account_url='https://sample.blob.core.windows.net/', credential=credential
)

# list files in a container
container = blob_service_client.get_container_client('sample')
for x in container.list_blobs():
    print(x['name'])

# download files in a container
for i, blob in enumerate(blobs_list):
    blob_client = container.get_blob_client(blob.name)
    with open(f"{i}.txt", "w") as f:
        f.write(blob_client.download_blob().readall())
```
🔰margin📦 と paddingの違いはこれだ！

# 理解してみたので📦で例えてみる

marginは箱と箱の間の距離。
paddingは箱の中にプチプチ（梱包材）をどれくらい詰めるかの厚さ。
# margin📦
図
📦（ここ）📦
例文
商品を見栄え良く陳列したいから商品Aと商品Bのmarginは5ｃｍ空ける。
# padding📦
例文
メルカリで配送する時は商品だけにプチプチを巻くのではなく、
段ボールの内側にpadding2周分巻いた方が丁寧に梱包できるよ。

# 調べてみたこと
1、margin と paddingの意味を知らなかったのでググってみた。
検索ワード
css margin　日本語　→ 余白　余裕
css padding　日本語　→ 詰め物

# 調べた順番
1、英単語は調べる。
基本中の基本ですが、プログラミング用語と英語が私の中で全く別物になっていた。
調べた意味から、どんな役割があるか想像する。

2、Youtube
自分の想像だけでは、限界がある。
わからない単語が出てきただけでパニックになるし冷静にブログとか読めないので
映像から理解するというアプローチをしました。
できれば、ショートとか短い時間で教えてくれる方を見つけるのが大事。
TikTokでも教えてくれそうだけど、私は調べていないので
TikTokでプログラミング関係教えてくれる人をご存知の方は教えてください！


# おわり
間違っていたら、訂正お願いします。
GPUが動くDocker環境を立ち上げる（Google Colabと同等の環境）

Google ColabでさくっとGPUが使えるように、自分のローカル環境にも同様の環境を作りたい。

```
nvidia-smi
```
で自分のホストOSのGPUバージョン、Cuda Driverバージョン、CUDAバージョンを確認。
対応するCUDAバージョンをメモする。

https://pystyle.info/pytorch-relationship-between-gpu-and-driver-cuda-and-cudnn-versions/


```
docker pull nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04
```
対応するDockerバージョンをpull。

```
docker run \
--gpus all \
--shm-size=2gb \
-v /home/my/Documents/anomalib:/root/anomalib/ \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-e DISPLAY=$DISPLAY \
--device /dev/video0:/dev/video0:mwr \
--device /dev/video1:/dev/video1:mwr \
-it \
nvidia/cuda:11.2.0-cudnn8-devel-ubuntu20.04
```
run。後々のことを考えてGPU利用や、メモリサイズ確保、ホストPCとのフォルダ共有、USBカメラ利用などの設定をしておく。

コンテナにCUDA Toolkitが必要だが、nvidia/cudaのDockerイメージには既に入っている。

![5b208976-b632-11e5-8406-38d379ec46aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/fb924f9e-57d0-92cc-935d-d19ff466afcb.png)

```
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.27.04    Driver Version: 460.27.04    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    On   | 00000000:01:00.0 Off |                  N/A |
| N/A   47C    P3    27W /  N/A |    274MiB /  8119MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```

## その他

python、pipがない。
nvidia/cudaでもpipが入っていないのか。
```
apt-get update
apt-get install -y python3 python3-pip
```
https://qiita.com/tatsuya11bbs/items/3af03e704812b6c89965


gitもいない。
```
apt-get install -y git
```

参考
https://skmkuma.com/ubuntuos%E3%81%A7gpu%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%BF%E3%81%86/
Please tell me how to convert excel file to svg file programatically

There are several ways you can convert an Excel file to an SVG file programmatically. One option is to use a library that is capable of reading and writing Excel files, such as the npm package "xlsx", and then use a library that is capable of converting from the Excel format to SVG format, such as the npm package "excel-to-svg".

Here is an example of how you could use these libraries to convert an Excel file to an SVG file in a Node.js application:

Install the xlsx and excel-to-svg packages:
Copy code
npm install xlsx excel-to-svg
Import the packages in your Node.js script:
Copy code
const xlsx = require('xlsx');
const excelToSvg = require('excel-to-svg');
Use the readFile function from the xlsx package to read the Excel file into memory:
Copy code
const workbook = xlsx.readFile('/path/to/input.xlsx');
Use the worksheetToSvg function from the excel-to-svg package to convert the worksheet to an SVG string:
Copy code
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
const svg = excelToSvg(worksheet);
Write the SVG string to a file using the writeFileSync function from the built-in fs module:
Copy code
const fs = require('fs');

fs.writeFileSync('/path/to/output.svg', svg);
This example converts the first worksheet in the Excel file to an SVG file. If you want to convert a specific worksheet, you can use the workbook.Sheets object to get a reference to the worksheet by its name, and pass it to the excelToSvg function.

Copy code
const worksheet = workbook.Sheets['My Worksheet'];
const svg = excelToSvg(worksheet);
I hope this helps! Let me know if you have any questions.
Tell me how to convert svg file into tif file in React application

To convert an SVG file to a TIFF file in a React application, you will need to use a library that is capable of converting from SVG to TIFF format. One option is to use the npm package "imagemagick-native", which is a wrapper for the ImageMagick command-line tool.

Here is an example of how you could use the imagemagick-native package to convert an SVG file to a TIFF file in a React application:

Install the imagemagick-native package:
```
npm install imagemagick-native
Import the package in your React component:

import imagemagick from 'imagemagick-native';
```
Use the convert function from the imagemagick-native package to convert the SVG file to a TIFF file. You will need to pass the path to the SVG file and the desired output file path as arguments to the convert function.
```
const inputFile = '/path/to/input.svg';
const outputFile = '/path/to/output.tiff';

imagemagick.convert([inputFile, outputFile], function(err, stdout) {
  if (err) {
    console.error(err);
  } else {
    console.log('SVG file converted to TIFF successfully');
  }
});
```
Note that this example assumes that the ImageMagick command-line tool is installed on your system. If it is not installed, you will need to install it before you can use the imagemagick-native package. You can download and install ImageMagick from https://imagemagick.org/script/download.php.
Tcl/Tkチートシート

:::note info
文法
```
#コメント
コマンド 引数1 引数2 ...
```
:::

:::note info
評価
- 行単位
- []
- {[]}
:::

:::note info
変数
型宣言は不要
型は基本的に文字列

<details><summary>代入はsetコマンド</summary>

```tcl
set var hello
```
```:実行結果
hello
```
</details>

<details><summary>空白を含む文字列はダブルクォーテーションで囲む</summary>

```tcl
set var "hello world"
```
```:実行結果
hello world
```
</details>

<details><summary>演算はexprコマンド</summary>

```tcl
expr 1 + 2
```
```:実行結果
3
```
</details>

<details><summary>変数の取り出しは変数の冒頭に$をつける</summary>


```tcl
set a 1
set b $a
```
```:実行結果
1
```
</details>
<details><summary>コンソールに出力する</summary>
```tcl
put $a
```
```:実行結果
10
```
</details>
:::

:::note info
配列
<details><summary>配列は後ろに()をつける
</summary>


```tcl
set Arr(1) 10
set Arr(2) 20
set Arr(1)
```
```:実行結果
10
```
</details>


:::

:::note info
リスト
<details><summary>要素を空白文字で区切って，全体を{}でくくる．
</summary>


```tcl
set list {10 20 30 40 50}
```
```:実行結果
10 20 30 40 50
```
</details>
:::

:::note info
<details><summary>if 文

```
if 条件式　処理
```
</summary>

```tcl:サンプル
if {$i < 0 }{
 set i 0
}
```

<details><summary>elseif
</summary>


```tcl
if {$i < 0} {
    set i 0
} elseif {$i < 10} {
    set i 10
} else {
    set i 100
}
```

</details>
:::

:::note info
繰り返し
<details><summary>while

```
while 条件式　処理
```
</summary>

```tcl
while {$n > 0} {
    .....
    incr n -1
}
```
</details>
<details><summary>for

```
for 初期化式 条件式　更新式　処理
```
</summary>

```tcl
for {set i 0} {$i < 10} {incr i} {
    .....
}
```
</details>
<details><summary>foreach

```
for 変数　リスト　処理
```
</summary>

```tcl
foreach n {0 1 2 3 4} {
    puts $n
}
```
</details>
:::
:::note info
<details><summary>
プロシャージャ

```tcl
proc コマンド名 引数リスト　本体
```
</summary>

```tcl
proc square {x} {expr $x * $x}
```
</details>
:::

:::note info
グローバル変数

```tcl
global c
```
:::

参考：
- [Tcl/Tk お気楽 GUI プログラミング入門](http://www.nct9.ne.jp/m_hiroi/tcl_tk_doc/index.html)
- [もっとTcl/Tk](http://www.interq.or.jp/japan/s-imai/tcltk/)
- [tcl文法](https://freesoftnet.co.jp/webfiles/tclkits/doc/tclcom.html)
Java、Python、JavaScriptでよく使われる構文や機能を比較した表

## Java 、 Python 、 JavaScriptでよく使われる構文や機能を比較した表

| Java | Python | JavaScript |
|------|--------|------------|
| `public class` | `class` | `class` |
| `class` | `class` | `class` |
| `public static void main(String[] args)` | `def main():` | `function main()` |
| `System.out.println()` | `print()` | `console.log()` |
| `int` | `int` | `number` |
| `double` | `float` | `number` |
| `boolean` | `bool` | `boolean` |
| `char` | `str` | `string` |
| `String` | `str` | `string` |
| `true`/`false` | `True`/`False` | `true`/`false` |
| `null` | `None` | `null` |
| `void` | - | `undefined` |
| `import` | `import` | `import` |
| `子クラス名 extends 親クラス名` | `子クラス名(親クラス名)` | `子クラス名 extends 親クラス名` |
| `implements` | - | - |
| `try { } catch (Exception e) { }` | `try: except Exception:` | `try { } catch (e) { }` |
| `switch (x) { case 0: break; }` | `if x == 0:` | `switch (x) { case 0: break; }` |
| `for (int i = 0; i < 10; i++) { }` | `for i in range(10):` | `for (let i = 0; i < 10; i++) { }` |
| `while (true) { }` | `while True:` | `while (true) { }` |
| `do { } while (true);` | - | `do { } while (true);` |
| `break` | `break` | `break` |
| `continue` | `continue` | `continue` |
| `return` | `return` | `return` |
mod_auth_mellonはSAML属性値を受け取れない原因

mod_auth_mellonはSAML属性値を受け取れない原因わかりました。
４日掛かってやっと原因見つかった。
ほかの記事に全部書かれていないので、ここで書きます。


他の記事でよく記載されている
RequestHeader set Mellon-SAML-Response %{MELLON_SAML_RESPONSE}e 
はちゃんと書いているのに、なんで受け取れないだろうと思って悩んでいた

↓↓↓★★★★これ設定しないと属性値受け取れない
MellonCookiePath /

デフォルトで設定されていないんだ！！！


auth_mellon_conf設定

```
<Location/> 
    MellonEnable info 
    MellonSessionDump On 
    MellonSamlResponseDump On 

    MellonEndpointPath /PostResponse
    MellonSPMetadataFile /etc/apache2/saml2/metadata.xml 
    MellonSPPrivateKeyFile /etc/apache2/saml2/metadata.key 
    MellonSPCertFile /etc/apache2/saml2/metadata.cert 
    MellonIdPMetadataFile /etc/apache2/saml2/idp-metadata.xml
    MellonIdPPublicKeyFile /etc/apache2/saml2/idp-public-key.pem

    MellonCookiePath /

    RequestHeader set Mellon-SAML-Response %{MELLON_SAML_RESPONSE}e 
</Location> 

# This is a location that will trigger authentication when requested. 
<Location /secret > 
    AuthType Mellon 
    MellonEnable auth 
    Require valid-user 
</Location> </code>
[python-oracledb入門](第2回) python-oracledbのインストール


# 連載目次
[連載：python-oracledb入門　目次](https://qiita.com/nakaie/items/c373cff694cb23a8568c)


# はじめに 
本記事ではpython-oracledbのインストール方法を解説します。なお、本記事執筆時点でのpython-oracledbの最新バージョンは1.2.1です。また、python:3.10のdocker imageを使用して動作確認しています。


# インストール要件
バージョン1.2.1時点でのインストール要件は以下です。最新の情報をお知りになりたい場合は[本家](https://oracle.github.io/python-oracledb/)の「Dependencies」をご確認ください。

<dl>
  <dt>Pythonのバージョン</dt>
  <dd>Linux : 3.6～3.11</dd>
  <dd>Windows, Mac : 3.7～3.11</dd>
  <dt>Oracle Clientのバージョン(Thick Modeのみ)</dt>
  <dd>11.2以上</dd>
  <dt>接続可能なOracle Databaseのバージョン</dt>
  <dd>Thin Mode : 12c以上</dd>
  <dd>Thick Mode : 利用しているOracle Clientが接続可能なOracle Databaseバージョン</dd></dl>

利用しているOracle Clientが接続可能なOracle Databaseバージョンは、基本的にはご利用のバージョン・プラットフォーム向けのOracle Clientのインストールのマニュアルの「Oracle Database Clientのソフトウェア要件」をご確認ください。より正確なOracle Server/Client間の接続要件に関しては、My Oracle Supportにアクセス可能な方は[Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)](https://support.oracle.com/knowledge/Oracle%20Database%20Products/207303_1.html)をご確認ください。My Oracle Supportにアクセスできない方は[python-oracldbのマニュアル](https://python-oracledb.readthedocs.io/en/latest/user_guide/installation.html#supported-oracle-database-versions)をご確認ください。ただ、このリンク先にも記載がありますが、この情報は要約されていて、実際にはもっと細かいです。


# 基本的なインストール
以下のコマンドを実行してください。
```
pip install oracledb
```
依存モジュールとして、cffi, cryptography, pycparserもインストールされます[^1]。インポート後の動作確認は、今後の本連載や既存のサイトに存在するサンプルコードを実行することでご確認ください。python-oracledbの導入自体の確認であれば、
```
python -c 'import oracledb'
```
の実行が成功することでも確認が可能です。Pythonの対話型シェルやJupyter Notebookなどで「import oracledb」の実行の成功を確認する方法でも構いません。
[^1]:より正確には、python-oracledbの依存モジュールはcryptographyのみで、cffi, pycparserはcryptographyの依存モジュールです。

# バージョン指定のインストール
開発要件次第ではインストールするpython-oracledbのバージョンを指定したい場合があると思います。先の方法だと常に最新バージョンがインストールされます。指定バージョンをインストールしたい場合は以下のように
```
pip install oracledb==1.2.0
```
という形でバージョンを指定したインストールが可能です。
インストール可能なバージョンを調べる方法としては、[PyPIのリリース履歴](https://pypi.org/project/oracledb/#history)もしくは[python-oracldbのリリースノート](https://python-oracledb.readthedocs.io/en/latest/release_notes.html#releasenotes)を確認するか、
```
# pip install oracledb==
ERROR: Could not find a version that satisfies the requirement oracledb== (from versions: 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.1.0, 1.1.1, 1.2.0, 1.2.1)
ERROR: No matching distribution found for oracledb==
```
と、バージョン番号を無指定でバージョン指定インストールを行い、表示されるエラーメッセージに出てくる指定可能バージョン一覧を確認してください。


# 既存バージョンのアップグレードとダウングレード
アップグレードであれダウングレードであれ、バージョン指定インストールを行うと、現在インストールされているバージョンが削除され、指定バージョンのものがインストールされます。
単純に最新バージョンにアップグレードする場合は、「-U」もしくは「--upgrade」オプションを指定してください。
```
pip install -U oracledb
```


# プロキシ経由のインストール
プロキシを通さないとインストールできない場合は、以下のように「--proxy」オプションを指定してください。プロキシサーバーのURLやポート番号はご利用の環境に合わせて変更してください。
```
pip install oracledb --proxy=http://proxy.example.com:80
```
「--proxy」オプション以外には、HTTP_PROXY/HTTPS_PROXY環境変数を設定する方法、pip.conf(Windowsだとpip.ini)にプロキシを設定する方法もあります。

# アンインストール
python-oracledbをアンインストールしたい場合は、
```
pip uninstall oracledb
```
と実行してください。なお、依存モジュール(cffi, cryptography, pycparser)はアンインストールされません。


# 参考リンク
指定可能なバージョンの調べ方の参照元：[pip installのバージョン指定方法](https://zenn.dev/wtkn25/articles/python-pip-install-version)
SEでも「テクニカルライティング」を学んでみよう！

# はじめに 
以前から「読み手に分かりやすい文章を書けるようになりたい！」と思っていました。
とある企業様の歓迎スキルに「テクニカルライティング３級」と記載があり、そこで初めてテクニカルライティングという技術がある事を知りました。
面白そうだったので、さっそく勉強しながらまとめてみたいと思います！

※「日本語スタイルガイド」の本を参考に記載していきます。

**参考文献「日本語スタイルガイド」**
# そもそもテクニカルライティング技術ってなに？ 
「日本語スタイルガイド」によると、次のように記載されています。

>技術的な内容を正確かつ効率的に伝えるための文章作成技術

注目すべきは「技術的な内容」というところです。

# なぜテクニカルライティング技術が必要なの？ 
私の会社では、在宅勤務がメインとなっています。それによりチャットやグループウェア上でコミュニケーションをとることも多くなりました。コロナ禍により、最近はそういった会社が多いのではないでしょうか。
文章でも自分の意見や意思を正確にわかりやすく説明できる能力は、どんな職業でも大切だと思います。

また、先ほど「技術的な内容」と記載した通り、SEとして動作概要書を書いたり、テスト項目書を書く場合にも使える技術なので、IT分野で働いてる方にもおすすめです！

「日本語スタイルガイド」によると、次のように記載されています。

>書き手側が当然と感じていることが、読み手にとっては想定外というケースは日常的に発生する。 ～中略～ 読み手が自ら価値を見出せる説明にすることが、文章の品質に直結する。

相手に価値を見出せる説明が毎回できたら、なんだかかっこいいですよね！笑
 
# 具体的な例
ここからは、本の内容を簡単に抜粋して記載していきます。
詳細の内容は省きますが、気になった箇所だけ自分なりに書き換えてまとめてみます！

## 算用数字と漢数字の使い分け 
私もよく文章を書くときに迷う内容です。
算用数字を使ったら、その文章では算用数字だけを使うようにしていました。実際は使い分けをした方がいいようです。

* 数えることができる数字や任意の数に置き換えても適用するのは算用数字にします。

```
今日は2022年12月
300円のハーゲンダッツ 
```
 
* 概数や貨幣は漢数字にします。

```
三メートル級の波
一万円札
```

## かっこの使い分け
* （）は直前の内容の説明や補足説明 。
* 「」は引用、語句の協調など 。
* 『』は「」のなかでカッコを使いたいときに使う。 
*   [ ]はメニューやボタン名を書くときに使う。
 
## 一文一義でかく 
文を書いていると、ついつい色んな内容を一文で書いてしまいます。一つの文には一つの事柄を書いたほうが相手に伝わりやすいです。

```
// ダメな例
名前の入力をすると登録されますが、画面上には表示されません。
// 良い例
名前の入力をすると登録されます。ただし、画面上には表示されません。
```
 
## 一文は50文字以内がよい 
これはそのままの意味です。長いと読むのに疲れるので、50文字以内にしましょう！

## 句読点の使い方
* 三点リーダーで終わる文にも句点をつける。

```
文章がうまく書けるようになりたいな……。
```

* 「」の閉じかっこの前には句点をつけない。

```
// ダメな例
「文章がうまく書けるようになりたいです。」
// 良い例
「文章がうまく書けるようになりたいです」
```

## 並列する語句の区切りには読点を打つ。

```
// ダメな例
自転車、車または電車での移動
// 良い例
自転車、車、または電車での移動
```
私はダメな例でいつも書いてるきがします・・。気をつけねば。

## 二重否定はさける
こちらもよく私がダメな例として使っていました。
* 否定の表現は一文に一つにする。
```
// ダメな例　二重否定になってる
郵便番号を設定しないと、次の画面に遷移しません。

// 良い例　否定をなくす方法
郵便番号を設定すると、次の画面に遷移します。
```

## 「未満」や「～を超えて」は使わずに、「以上」と「以下」を使う
未満はそれが含まれない値ですが、誤解されやすい書き方です。
そのため、以上や以下で書き換えるほうが良いとのことです。

```
// 誤解を招く例
30歳未満のバスケット選手
// 誤解を招かない例
29歳以下のバスケット選手
```

# 読み手のことを考えて書こう
* 読み手がどんな知識をもっているのか。
* 読んでくれる人のターゲットはどんな人か。
* 伝えたことで、どのような気持ちになるのか。

文章を書くときは、上記のように相手のことを考慮することが大切です。何事も相手の気持ちになって考えることが大切なんですね！

# まとめ
テクニカルライティングは誰でも役に立つ技術だと思いました。
「日本語スタイルガイド」の本を一通り読んだことで、分かりやすい文章が書けるようになった気になっています笑

このような記事を書く場合でも、読んでくださる方がいるなら「楽しんでくれたり、わくわくしてくれたり、役になってくれる」文章を書きたいものです。

再度記載しますが、この記事の内容は「日本語スタイルガイド」の本のほんの一部を参考にして書いたものです。興味がある方は一度手に取って読んでみることをおすすめします！
Unity DOTSで入力を受けたい

# Unity DOTS 3日目
今日は昨日の宣言通り、InputSystemとColliderEventを受け取ることを頑張りました。
後者はできませんでした。なんなら、InputSystemは10分で出来ました。
今日はもはや嘘をつくこともできないぐらいの内容量でお送りします。
## 環境
Unity 2022.2.1f1
Entities 1.0.0-pre.15
Burst 1.7.4
# 今日やること
キー入力したいなーと思って色々調べたら日本語の記事が…！
ということで、それをほぼコピペした話です。

ColliderEventは明日書きますね。全く理解してないので
## 参考にした記事
https://qiita.com/makihiro_dev/items/e05eaa3fdf05869725ac
## 変更したこと
実は上の記事ではめっちゃ少しだけ動かなかったです。
``Entities.ForEach``ってとこで使ってる``Translation``っていうクラスが消滅していたんですよね。
あとは``WithBurst()``もなくなってたかな。俺は使いませんでした。なくても動く！
その代わりに``LocalTransform``を使って動かしました。これだけです。10分。終わり。
## 今日のISystemとSystemBase
もはや毎日触れていますが、評価変わりまくりです。
``SystemBase``くんLOVE、``Entities.ForEach()``くんLOVE
まぁ実際ISystemも使えてますし、Unity公式ドキュメントを読むとやっぱりISystem激推しです。
なので、ISystemを使ってダメそうだなーと思ったらSystemBaseに移行するみたいな使い方してます。
早く初見で使い分けたいところです。
## 最後に
今日は記事書くの楽でした。
明日は「Unity Physics for Entities」について少しお送りしたいと思います。
今日やってたClliderEvent関係のお話ですね。
ここら辺、Unity公式ドキュメントが間違っていて約7時間ぐらい溶かしましたが、明日には解決しそうな感じだったので頑張ってきます。

はい。以上で3日目終わりです。雑記にお付き合いいただきありがとうございました。ﾊﾞｲﾊﾞｲ
【Linux】ファイルの内容を逆順で出力する方法

## `tac`コマンド

`tac`コマンドはファイルの行を逆にして出力します。  

```terminal
$ cat sample.txt
1 abcde
2 abcde
3 abcde
4 abcde
5 abcde

$ tac sample.txt
5 abcde
4 abcde
3 abcde
2 abcde
1 abcde
```

複数のファイルのそれぞれの行を逆にして連結する場合には次のように実行します。  

```sample.txt
$ cat sample.txt example.txt
1 abcde
2 abcde
3 abcde
4 abcde
5 abcde
a 12345
b 12345
c 12345
d 12345
e 12345

$ tac sample.txt example.txt
5 abcde
4 abcde
3 abcde
2 abcde
1 abcde
e 12345
d 12345
c 12345
b 12345
a 12345
```

複数のファイルを連結したうえで行を逆にして出力するには次のようにします。  

```terminal
$ cat sample.txt example.txt | tac
e 12345
d 12345
c 12345
b 12345
a 12345
5 abcde
4 abcde
3 abcde
2 abcde
1 abcde
```

## `rev`コマンド

`rev`コマンドはファイルの行の文字列を逆にして出力します。  

```terminal
$ rev sample.txt
edcba 1
edcba 2
edcba 3
edcba 4
edcba 5
```

ファイル全体を末尾から先頭に向かって出力するには次のようにします。  

```terminal
$ tac sample.txt | rev
edcba 5
edcba 4
edcba 3
edcba 2
edcba 1
```
2022年末の emacs 設定

emacs の設定は人生（反論はない）

2022年末時点の mac 版 emacs 設定のトピックを書いておく。

1. Cask から straight.el への移行
1. ほとんど use-package 化 （leaf 化は挫折）
1. (mac-auto-ascii-mode 1) をしたいので port 版 emacs に変更
1. go-translate 導入
1. lookup 何年振りかにインストール
1. server-start + emacsclient 化
1. elscreen をやめて tab-bar-mode に
1. ispell 実行バイナリを hunspell に
1. 検索は swiper
1. メインUI は ivy、counsel

よく使ったコマンド
1. ivy-switcher-buffer
1. counsel-rg

導入した elisp 小物関数

- 現在行を region にする
```elisp
;; from http://xahlee.info/emacs/emacs/emacs_region.html
(defun my-select-line ()
  "Select current line."
  (interactive)
  (goto-char (line-beginning-position))
  (push-mark (line-end-position))
  (setq mark-active t))
```
region 範囲を変更するというのは意外にむずい。


- region 範囲の数字を sum
```elisp
;; https://emacs.stackexchange.com/questions/10939/sum-numbers-in-region
(require 'cl-lib)
(defun sum-numbers-in-region (start end)
  (interactive "r")
  (message "%s" (cl-reduce #'+
                           (split-string (buffer-substring start end))
                           :key #'string-to-number)))
```
なんてエレガントな

enjoy emacs on next year.
【SwiftUI】iOS16からハーフモーダルが使えるようになったので使ってみた

# はじめに
以前はSwiftUIがハーフモーダルに対応していなかったのでUIKitを使用してハーフモーダルを実装しました。

https://qiita.com/SNQ-2001/items/f7c1df423ad633bec7e0

今回は公式で対応されたハーフモーダルを使ってみたいと思います。

[`presentationDetents`](https://developer.apple.com/documentation/swiftui/view/presentationdetents(_:)?changes=_2_1)

# 使い方
|タイプ|使い方||
|-|-|-|
|`.large`|`.large`|通常のsheetと同じ高さ|
|`.medium`|`.medium`|画面の半分の高さ|
|`.height`|`.height(100)`|heightで高さを指定できる|
|`.fraction`|`.fraction(1/3)`|画面の何分の何を指定できる(例は三分の一)|
|`.custom`|`.custom(CustomSheetHeight.self)`|高さをカスタマイズできる|

# 基本的な使い方
```swift:ContentView
import SwiftUI

struct ContentView: View {
    @State private var large: Bool = false
    @State private var medium: Bool = false
    @State private var height: Bool = false
    @State private var fraction: Bool = false
    @State private var custom: Bool = false
    var body: some View {
        VStack(spacing: 20) {
            Button("large") {
                large = true
            }

            Button("medium") {
                medium = true
            }

            Button("height") {
                height = true
            }

            Button("fraction") {
                fraction = true
            }

            Button("custom") {
                custom = true
            }
        }
        .sheet(isPresented: $large) {
            Text("large")
                .presentationDetents([.large])
        }
        .sheet(isPresented: $medium) {
            Text("medium")
                .presentationDetents([.medium])
        }
        .sheet(isPresented: $height) {
            Text("height")
                .presentationDetents([.height(100)])
        }
        .sheet(isPresented: $fraction) {
            Text("fraction")
                .presentationDetents([.fraction(1/3)])
        }
        .sheet(isPresented: $custom) {
            Text("custom")
                .presentationDetents([.custom(CustomSheetHeight.self)])
        }
    }
}
```
```swift:CustomSheetHeight
// iPadの場合は400、それ以外は200にする
struct CustomSheetHeight: CustomPresentationDetent {
    static func height(in context: Context) -> CGFloat? {
        return UIDevice.current.userInterfaceIdiom == .pad ? 400 : 200
    }
}
```

# 複数タイプで切り替える
```swift
import SwiftUI

struct ContentView: View {
    @State private var isPresented: Bool = false
    var body: some View {
        VStack(spacing: 20) {
            Button("表示") {
                isPresented = true
            }
        }
        .sheet(isPresented: $isPresented) {
            Text("複数サイズ")
                .presentationDetents([.height(100), .medium, .fraction(0.8), .large])
        }
    }
}
```
![Simulator Screen Recording - iPhone 14 - 2022-12-29 at 21 03 28](https://user-images.githubusercontent.com/84154073/209948676-9b633c78-295a-4fcd-96a7-5c9e14fa1a2d.gif)

# おわり
どんどん便利になってきてますね
SwiftUIが進化してると嬉しいです
mmdetectionでalbumentationsを使う

# 概要
1. 前提
1. ここにすべてある
1. 解説
1. 拡張結果の確認

# 前提
albumentationsをインストールしてあることである
[albumentaionsのgithub](https://github.com/albumentations-team/albumentations#installation)にあるinstallationを参考にインストールするのが手っ取り早い

# ここにすべてがある
albumentaionsを適用したmmdetection公式のconfigファイルである．
これがすべてである．
https://github.com/open-mmlab/mmdetection/blob/master/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py

# 解説
**train_pipeline** 変数内に**type='albu'** となっている場所があり，albumentationsを適用するためのコードが書いてある．
これはそのままパクれば良さそうである．

実際にalbumentaionsのどの関数を使うのかは**albu_train_transforms** に書かれている．
**albu_train_transforms** はtypeに適用したい関数名，他の変数にその関数の実引数が書かれている．

[albumentationsのAPIリファレンス](https://albumentations.ai/docs/api_reference/full_reference/)を参考にしよう．
[デモページ](https://demo.albumentations.ai/)では，どんな風に拡張されるのか，確認できる．ぜひ使っておきたい．

# 拡張結果の確認
自分の思い通りに拡張されているか確認したいときは以下のコマンドで確認できる．
```
$ python tools/misc/browse_dataset.py your/config/file/path
```

SSHしていてX転送できないなど，GUI環境が使えないときは以下のようにする.
check_aug_resディレクトリに拡張された結果が格納されている．
```
$ python tools/misc/browse_dataset.py your/config/file/path --output-dir check_aug_res --not-show
```
python-networkmanagerはメンテナンス滞り中

# はじめに（結論）
NetworkManagerをPythonから叩くためのpython-networkmanagerパッケージはメンテナンスが滞っているので使わない方がいい，というお話です。(2022/12現在）

# 経緯
Python経由でOS(Linux）のIPアドレスを変更しようとpython-networkmanagerを使ってみました。が，ubuntu22.04（NetworkManage1.36）,OracleLinux8U7（NetworkManager1.40.0）など，幾つかの環境で試してみたところ，ことごとくエラーが出て動きません。
こんなエラーです。

```
  File "ip.py", line 8, in <module>
    connection = devices[1].ActiveConnection.Connection
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 169, in get_func
    return fixups.to_python(klass, 'Get', name, data, attrib['type'])
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 578, in to_python
    val = fixups.base_to_python(val)
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 648, in base_to_python
    return globals()[classname](val)
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 304, in __init__
    self.uuid = self.GetSettings()['connection']['uuid']
  File "<string>", line 8, in GetSettings
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 619, in to_python
    val['ipv4']['dns'] = [fixups.addr_to_python(addr,socket.AF_INET) for addr in val['ipv4']['dns']]
KeyError: 'dns'
```

```
>>> connection = devices[0].ActiveConnection.Connection
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 169, in get_func
    return fixups.to_python(klass, 'Get', name, data, attrib['type'])
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 578, in to_python
    val = fixups.base_to_python(val)
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 648, in base_to_python
    return globals()[classname](val)
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 304, in __init__
    self.uuid = self.GetSettings()['connection']['uuid']
  File "<string>", line 8, in GetSettings
  File "/usr/local/lib/python3.6/site-packages/NetworkManager.py", line 623, in to_python
    val['ipv6']['dns'] = [fixups.addr_to_python(addr,socket.AF_INET6) for addr in val['ipv6']['dns']]
KeyError: 'dns'
```
python-networkmanagerのGithubを追いかけたところ，NetworkManager>=1.34で発生するバグらしく，プルリクがでていました。しかし，メンテナが「I've mostly abandoned this project（私はこのプロジェクトをほとんど放棄してます）」と発言しており，今後のメンテナンスは厳しそうです。
https://github.com/seveas/python-networkmanager/pull/94
【Python】並行処理でwrite()してたら馬鹿みたいな文字化けをした

# まとめ
並行処理でwriteするときは`threading.Lock`を使おう！（どんな並行処理ライブラリを使っていてもthreadsをimportすればOK!）

# 経緯
Webスクレイピングで7つぐらいのスレッドから一つのファイルにスクレイピング結果を書き込んでいたとき、完成したスクレイピング結果ファイルをみると文字化けだらけだった！
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/f5561fbc-7a70-657e-f35f-7b61bf52ced1.png)

ここでは、並行処理にfuturesを使っていました。
### やっていたコード（悪い例）
```Python:悪い例
from concurrent import futures

def scrape(アクセス先):
    global f    

    #(スクレイピング部分)

    f.write(result)

f = open("ファイル", "w", encoding="utf-8")

future_list = []
with futures.ThreadPoolExecutor(max_workers=drivers_n) as executor:
    #処理を登録
    for link in アクセス先リスト:
        future = executor.submit(scrape, url=link)
        future_list.append(future)

    #全ての処理が完了するまで待ち
    _ = futures.as_completed(fs=future_list)

f.close()
```

そしてさっきの写真のような文字化けをおこしました。
<strong>複数のスレッドのwriteが同時発生して競合したせい</strong>でしょうね。

# 解決
一つのスレッドがwriteしている間は他のスレッドを待たせる必要があります。排他処理ってやつですね。

その「一つのスレッドがwriteしている間は他のスレッドを待たせる」ロジックを使うには`threading.Lock`を使えばいいんです。
これはどの並行処理ライブラリ（futuresでもなんでも）にも有効です。

### 改善したコード（良い例）
```Python:良い例
```Python:悪い例
from concurrent import futures
from threading import Lock

def scrape(アクセス先):
    #追加！
    global f, write_lock    

    #(スクレイピング部分)

    #追加！
    with write_lock:
        f.write(result)

f = open("ファイル", "w", encoding="utf-8")

future_list = []
#追加！
write_lock = Lock()
with futures.ThreadPoolExecutor(max_workers=drivers_n) as executor:
    #処理を登録
    for link in アクセス先リスト:
        future = executor.submit(scrape, url=link)
        future_list.append(future)

    #全ての処理が完了するまで待ち
    _ = futures.as_completed(fs=future_list)

f.close()
```
グローバル変数としてLockを一つ用意すれば、排他処理にしたいロジックを
`with Lock:`
のブロックに入れることで、「一つのスレッドがwriteしている間は他のスレッドを待たせる」処理ができます。
JavaScriptの非同期通信, Ajax通信

# 同期処理とは
上から順番にひとつずつ処理されていく。
一つの処理が終わるまで次の処理は実行されない。

#　非同期処理とは
一つの処理が終わるのを待たずに次の処理を実行する

```javascript
setTimeout(() => {
    console.log('こんにちは');
}, 3000);
```
第二引数の秒数(3秒)待って第一引数の中身を実行する

「○秒待ってから処理する」あるいは「何かが完了したら処理する」ということも実現できるようになっている。



# Ajax

Asyncronous JavaScript + XMLの略。
ユーザーが何かのアクションをするとサーバーで生成された新しいHTMLを読み込む方法ではなく、非同期通信を行いながらHTMLの必要な箇所だけをサーバーから取得して既存のHTMLを書き換える方法。

サーバーから結果が返ってくるまで他の処理を止めてしまうとその間JavaScriptの処理が止まってしまう。
Ajax通信には非同期処理を組み合わせて利用することが必要になる。

```javascript
//APIURLを叩く
fetch('https://qiita.com/api/v2/items?query=tag:JavaScript')
    .then(response => {
        //consoleでレスポンスの中身を見ている
        console.log(response);
        //レスポンスをjson形式で戻り値にする
        return response.json();
    })
    //APIURLを叩いたときの結果になる
    .then(data=> {
        console.log(data);
    });
console.log('APIを叩きます');
````
.thenでfetchの結果が返ってきてから戻り値を見ている
.thenは関数を引数に取り、Responseオブジェクトがその引数として設定されている。
Responseオブジェクトにjsonメソッドを利用してreturnすることで、その次のthenの引数にはdataが渡される。
このdataの中身はそれぞれの記事と情報を配列としたもの。

### fetch
Ajax通信を行うために作られた機能。
第一引数にAPI URLを指定できる。
https://qiita.com/sotasato/items/31be24d6776f3232c0c0

### Promise
Promiseを使うと何かの非同期処理を行う際に、それが終わった後の処理を同時に書くことが可能になる。基本的に自分でプロミスを作ることはなさそう。

func = resolveが終わるまでconsole.logしないメソッド
```javascript
const func = () => {
    const promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        }, 3000);
    });
    return promise;
};

func()
    .then(() => {
        console.log('done');
});
```

エラー処理
```javascript

const func = () => {
    const promise = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        }, 3000);
    });
    return promise;
};

func()
    .then(() => {
        console.log('done');
    })
    .catch(() => {
        console.log('error');
    });
```

### Acync
Promise.thenで繋いでいくのは楽だが「○が終わったら○する」をどんどん入れ子にしていくとネストが深くなるのでそれを防ぐ。


```javascript
async function func(){
    const response = await fetch(
        'https://qiita.com/api/v2/items?query=tag:JavaScript'
    );
    //↑これが終わるまで次の処理をしない
    const data = await response.json();
    //↑これが終わるまで次の処理をしない
    console.log(data);
}

func();
```



### HTTP通信用のライブラリ:axios

https://qiita.com/s_taro/items/30114cfa370aac6c085f
centos7 + jupyter lab 環境構築メモ

以下URLを参照
https://uktia.hatenablog.jp/entry/20200712/1594545810
https://qiita.com/taka4sato/items/2c3397ff34c440044978

````
useradd -s /bin/bash -d /opt/jupyter jupyter
su - jupyter -c 'pip3 install -U pip --user'
su - jupyter -c 'pip3 install -U jupyterlab --user'

su - jupyter -c 'jupyter notebook --version'
su - jupyter -c 'mkdir ~/.jupyter/'

su - jupyter -c 'tee ~/.jupyter/jupyter_notebook_config.py << _EOF_ > /dev/null
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.token = ''
_EOF_'

tee -a /etc/systemd/system/jupyter.service << _EOF_ > /dev/null
[Unit]
Description=Jupyter notebook

[Service]
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart=/opt/jupyter/.local/bin/jupyter lab
User=jupyter
Group=jupyter
WorkingDirectory=/opt/jupyter
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
_EOF_

systemctl daemon-reload
systemctl start jupyter
systemctl enable jupyter

firewall-cmd --permanent --add-port 8080/tcp 
firewall-cmd --reload

````
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. の解決法

# はじめに
Flutterで新しくプロジェクトを作成してからFirebaseに接続してビルドすると、大体CocoaPods周りでエラーが。

```console
CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Runner` to `Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig`
```


毎回忘れて調べてしまうのでここに記録したいと思います！！！:sweat_smile:

# Release.xcconfigを編集
`/ios/Flutter/Release.xcconfig`に👇を追加

```
#include "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"
```

![Screen Shot 2022-12-29 at 19.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/fc21b1ba-714c-86e4-3651-26916cfdda92.png)

>FlutterはCocoaPodとは別に.xcconfigファイルを独自に所有しており、デフォルトの状態だとCocoaPodで変更した内容が反映されないため、それができるように該当のファイルにコードを追記する。
https://qiita.com/kokikudo/items/ddc6552df4fb71328a99



これで`pod install`すると正常に終わりビルドもできるようになりました！！
毎度のことなんで手順に追加しときましょう！


# 追記

```console
could not find included file 'Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig' in search paths
```

Xcodeでのビルド時にこう言ったエラーが発生する場合があります。。。:fearful:
その場合は

```
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"
```
のように`Pods/Target Support Files/`にしてあげると解消しました！！！

https://stackoverflow.com/questions/53630136/using-cocoapods-libraries-in-flutter-ios-platform-specific-code
【UE4 UE5】Unreal Engine系の記事を出している人まとめ

メモです

<br>
<br>
<br>
<br>

キンアジちゃんかわいい

https://kinnaji.com/2018/12/04/blogabout/

<br>
<br>
<br>
<br>


UIのすごい人、BPの解説もわかりやすい

https://limesode.hatenablog.com/

<br>
<br>
<br>
<br>

いろいろ～

https://logicalbeat.jp/date/2022/12/

<br>
<br>
<br>
<br>

ドスパラで有名の会社、UEの記事も上げてるみたい

https://zenn.dev/tw_trainingcamp

<br>
<br>
<br>
<br>

色々、とりあえず見て

https://uehow.web.fc2.com/Contents/Jpn/UE4/Root/Cone/UE4_Root.html

<br>
<br>
<br>
<br>


色々

https://orenda.co.jp/blog_tag/ue4/page/2/

<br>
<br>
<br>
<br>

たくさん、いろいろ、すごい

https://w.atwiki.jp/ue4wiki/pages/23.html

<br>
<br>
<br>
<br>

すごい
https://japanese-rooster.com/

<br>
<br>
<br>
<br>

帝京平成大学のココがスゴイくらい凄いから見よう

https://automaton-media.com/devlog/interview/20180903-75415/

<br>
<br>
<br>
<br>

EpicなGamesさんのスライド、なんかすごい

https://www.docswell.com/user/EpicGamesJapan

<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

## YouTube

<br>
<br>
<br>
<br>

グラフィックとか

https://www.youtube.com/channel/UCmUA-8TQGMiKg04DAGTuWwA/videos

<br>
<br>
<br>
<br>


BPの色々解説してる方

https://www.youtube.com/channel/UCKhBF8ccOzLFhnWZA0JR7IQ/videos

<br>
<br>
<br>
<br>

ゆかりさんがかわいい

https://www.youtube.com/channel/UCpv-_UwsYpe5ifnEC2hYB8g/videos

<br>
<br>
<br>
<br>

すごい、やばい、やばいので見よう

https://www.youtube.com/channel/UC4BAcQ4p-U_Fi1aA_I3wc2g/videos

<br>
<br>
<br>
<br>

インタビュー動画とか、ライブおもしろので是非見てね

https://www.youtube.com/channel/UCMB4OYmMrzbxnh6ZpDP2pmQ/videos

<br>
<br>
<br>
<br>

最近動画あげていないけど大丈夫かな…
初心者さんに特にオススメ

https://www.youtube.com/@arika--2584

<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

## 海外ニキのYouTube

https://www.youtube.com/channel/UCv_n9oioNF6OpzR2dt6E4xg/videos

https://www.youtube.com/channel/UC8_RNwftEO4isrX2LJowcpg/videos

https://www.youtube.com/channel/UCz-eYJAUgSE-mqzKtit7m9g/videos

https://www.youtube.com/channel/UCGxt9c_CREmnquHjPEknHYw/videos

https://www.youtube.com/channel/UC6FyDBid7cF9Ll3004OYkjw/videos

https://www.youtube.com/channel/UCGKjGGjdl-GzEcFPf1EQwqw/videos

<br>
<br>
<br>
<br>

日本語字幕もあるので見よう、編集すごくておもろい
UE5でペプシマンのゲーム作った人

https://www.youtube.com/@YahyaDanboos/videos
mmdetectionによって得たインスタンスセグメンテーションの結果をマスク動画にする

# 概要
1. 前提
1. コード

# 前提
* configファイルがある
* 学習済みモデル（チェックポイントファイル）がある
* 動画ファイルがある
* 検出するクラスが1つのみ（多クラスはこのコードでは無理かも．．．）

# コード
以下のコードを参考に，自分なりに改造すればよい
```
config_file     = "your/config/file"
checkpoint_file = "your/checkpoint/file"    #学習済みモデルパス
r_video_file    = "your/read/video/file"    #インスタンスセグメンテーションされる動画パス
w_video_file    = "your/written/video/file" #インスタンスセグメンテーション結果を保存する動画パス
thr             = 0.3                       # インスタンスセグメンテーションの結果の閾値 mmdetectionでは0.3なので，それに倣った

model = init_detector(config_file, checkpoint_file, device="cuda:0")

video_reader = mmcv.VideoReader(r_video_file)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter(w_video_file, fourcc, video_reader.fps,(video_reader.width, video_reader.height), False)

for frame in mmcv.track_iter_progress(video_reader):
    result = inference_detector(model, frame)

    bboxes = np.vstack(result[0]) #バウンディングボックスの結果を得る
    segms = result[1]             #インスタンスセグメンテーションの結果を得る

    scores = bboxes[:, -1]  #インスタンスセグメンテーションの確信度を得る
    inds = scores > thr     #確信度が閾値以上である添え字を得る
    
    #インスタンスセグメンテーションの結果を有効だったもののみ残す
    mask = mmcv.concat_list(segms)
    mask = np.stack(mask, axis=0)
    mask = mask[inds, ...]         

    #インスタンスセグメンテーションの結果を一つにまとめる
    res = mask[0].copy()
    for i, m in enumerate(mask):
        res = res | m
    
    #マスク画像化
    res = np.apply_along_axis(np.vectorize(lambda x: 255 if x > 0 else 0), 1, res)

    #書き込み
    video_writer.write(np.array(res, dtype='uint8'))

if video_writer:
    video_writer.release()
cv2.destroyAllWindows()
```
Nested ESXi 環境でホストと同じ VDS に Edge をデプロイすると Tunnel がダウンする件

自宅ラボとしてワークステーションに物理 ESXi を導入し、その上に複数台の Nested ESXi と vCenter Server で vSphere クラスタを構築しています。
NSX-T 3.2 も利用していて、これまでは物理 ESXi 上に直接 Manager/Edge をデプロイし、vCenter Server と連携させていたのですが、この度環境の見直しがあり、NSX-T を Nested ESXi 側に移行した....
... のですが、移行後からなぜか一向に Geneve Tunnel が動作しないトラブルに遭遇。

# 症状
症状として、構築時点では特に何も問題は見られず、ホストトランスポートノードも Edge ノードも正常稼働しているが、いざセグメントを作成し、VM を Overlay ネットワークに接続すると、VM を動かしているホストトランスポートノードのトンネル状態が「停止」となってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/da68ede0-b7b4-a4fb-4d31-e15c3864d4e3.png)

いろいろ切り分けてみると、
* Overlay セグメントのゲートウェイに ping は疎通する
* Overlay セグメントのゲートウェイより向こう側に ping は疎通しない
* 同じ Overlay セグメントに接続されている East-West VM 間で ping は疎通する

という状態で、ホストトランスポートノード内で動作はしているようですが、ホストトランスポートノードと Edge トランスポートノード間で正常に TEP トンネルを確立できていない様子。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/76a23491-b512-a090-e8c7-6b52f57df1d1.png)

とはいえ、ホストトランスポートノードから Edge トランスポートノードへの TEP インタフェースあての ping も通るし、MTU も 1600 以上を設定しているし、なんでなんだーと悩み続けること数日間。。。
```bash
[root@esxi01-ifrit:~] vmkping ++netstack=vxlan 192.168.103.9 -s 1592 -d
PING 192.168.103.9 (192.168.103.9): 1592 data bytes
1600 bytes from 192.168.103.9: icmp_seq=0 ttl=64 time=0.631 ms
1600 bytes from 192.168.103.9: icmp_seq=1 ttl=64 time=0.649 ms
1600 bytes from 192.168.103.9: icmp_seq=2 ttl=64 time=1.212 ms
 :
```

# 結果
[この記事](https://www.ntpro.nl/blog/archives/3570-Edge-Tunnels-Down-when-hosting-NSX-T-on-the-same-DVS.html)を見つけ、まさに当てはまっていました。
要は VDS 環境でホストトランスポートノードの TEP インタフェース（vmk10）が作成されているところに Edge VM をデプロイし、TEP 用のインタフェースを PortGroup にくっつけてしまうと、そのインタフェース間でトンネル確立ができなくなってしまう、ということのようです。

今回で言うと、NSX-Manager からホストトランスポートノードの設定を行う際にこちらの NSX-Geneve-DSwitch を VDS として指定し、スタティック IP を割り付けています。
また、Edge トランスポートノードの設定を行う際も、Edge スイッチ（Overlay）の作成時に同 VDS を指定しており、この構成がよろしくなかったようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/328819b3-ab21-9238-713b-d9b0b44940da.png)

面倒ですが、Edge 用に別の VDS を作成し、Edge VM のネットワークをそちらの VDS に切り替えることで、無事にトンネル確立ができるようになりました。
物理環境でも同じことが起きるかは不明ですが、Edge の配置には気を付けたほうがよさそうです。

# 追記（補足）
いまさらながら追記：

> 要は VDS 環境でホストトランスポートノードの TEP インタフェース（vmk10）が作成されているところに Edge VM をデプロイし、TEP 用のインタフェースを PortGroup にくっつけてしまうと、そのインタフェース間でトンネル確立ができなくなってしまう、ということのようです。

これは若干間違っていて、NSX-T における「Geneve によるトンネリングが開始されるポイント」が「パケットが VDS を抜けていくタイミング（レイヤ）」であるため、同じポートグループ間だとトンネリングされない、というオチ（製品仕様）だったようですね。  

これだと構成上、上の例のようにわざわざポートグループを分けなければならいことになるため、これを回避する Inter TEP と呼ばれる構成方法があります。
Rustでファイル全体を読み込む方法

# Rustでファイル全体を読み込む

標準ライブラリの`std::fs::read_to_string`メソッドを使うことにより、**ファイル全体**を文字列に読み込みます。


`std::fs::File`と`std::io::Read`を用いて次のように書きます。

```rust
use std::{fs::File, io::Read};

fn main() {
    let file_name: &str = "src/hoge.xml";
    println!("File name: {}", file_name);

    let mut f: File = File::open(file_name).expect("Fail to open file.");

    let mut contents: String = String::new();
    f.read_to_string(&mut contents).expect("Fail to read file.");

    println!("{}", contents);
}
```

# 参考文献

- [ファイルを読み込む - The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/ch12-02-reading-a-file.html)
[企画書]ID管理の統合による情報セキュリティ底上げ

この記事は事業会社の情シス部門がID管理の必要性を訴えてAzureADによる認証基盤の構築を推進するための企画書です。もしよければレビューしていただけると助かります！

# 背景
covid-19をきっかけにクラウドサービスなどを利用した場所や時間を限定しない働き方が定着しました。その流れはビジネスのスピードや質の向上にも寄与し、大きな効果を上げています。一方で様々なクラウドサービスはそれぞれ利用者IDの管理が必要となり、利用者及び管理者にとって負担になり始めています。これまでは複雑でサービスごとに異なるパスワードを利用することが推奨されてきましたが、そのような考え方は昨今現実的ではなくなっています。
そもそもパスワードだけで企業や個人の情報を守ることができなくなっており、実際に多くのクラウドサービスではより強固な認証方法を推奨しています。

# 課題
利用者ID管理が複雑化により下記のような課題が顕在化しています。
* 利用者はサービスごとに存在するIDとパスワードを覚えることができない（サービス間でのパスワード使い廻しを防ぐ手段はない）。
* 管理者はサービスごとにIDの発行、削除やパスワードリセット等の作業が増加する（作業中は利用者のビジネス活動が停止する）。

:::note
これらの課題は利用者の負担となるだけではなく、情報漏洩等のビジネスリスクとなります。
:::

# 施策
認証基盤を導入することにより下記を実現します。
* ID管理統合
* 認証を強化

## ID管理統合
認証基盤にID管理を統合し各サービスと連携することにより、利用者はサービスごとにユーザーIDやパスワードを管理する必要がなくなります。パスワード忘れなどによる業務の停止が無くなるため、ID管理者の負担も減らすことができます。
## 認証の強化
認証基盤に多要素認証等の仕組みを用意することにより、IDとパスワードによるなりすましを防ぐことができます。

https://www.ipa.go.jp/security/anshin/account_security.html

# システム選定
ID管理を行う製品はいくつか選択肢がありますが、Microsoft製品（WindowsやOffice）を利用するのであればAzureADの親和性が高いと考えられます。下記のレポートにある他社製品と比較して最終的な導入製品を選択します。

https://www.microsoft.com/ja-jp/biz/security/blog-0008.aspx

ちなみに代表的なSaas製品ではSSO構成を行うための丁寧なチュートリアルが存在します。下記はSalesforceの例。

https://learn.microsoft.com/ja-jp/azure/active-directory/saas-apps/salesforce-tutorial

# 体制・スケジュール・予算
体制やスケジュールはともかく、AzureAD自体は基本機能が無料で利用できます。多要素認証やオンプレADとの連携を行うためには有償のライセンスが必要になりますが、それでもMicrosoft365などのライセンスに含まれる部分もありますので、お得感はあります。

# おまけ
Salesforceが発表した多要素認証の必須化は、ID統合の良いキッカケになり得ます。2022年の2月にルール上必須化されましたが、2023年の間には「自動的に適用」という手段に出るようなのでタイムリミットが迫っているといえます。

https://qiita.com/talomina/items/968907789ebe840a4232
Kotestはいいぞ - mockK編

# はじめに
前回はKotestの基本構文についてまとめた記事を記載しました。
今回はこのKotestをサポートするライブラリについても記載していきます。

[Kotest基本構文編](https://qiita.com/maiya0123/items/75e221962bfe435f138c) -> 前回
mockk編 -> 今回

# mockK
モックとして扱える。テスト対象以外のオブジェクトを差し替えて、どのような振る舞いをするかを決めてあげることで、テスト対象外のオブジェクトが存在する場合に、モックに差し替えて動作内容を定義できます。

### よく使うファンクション/アノテーション
- every
特定のモックインスタンスが呼ばれた時に指定した値を返却する
- verify
メソッドが指定した引数で呼び出されたかを確認できる
- @MockK
モックとしてインジェクションする
- @SpyK
メソッドの引数や呼び出し回数、戻り値などを検証する

### mockK導入
前準備としては以下のライブラリを入れるだけです。
```
testImplementation("io.mockk:mockk:1.13.1")
```

### テスト対象クラス
ユーザークラスを作成して、レポジトリ層でCRDできるメソッドを作成。実体クラスなどは割愛します
```kt:UserRepository.kt
@Repository
interface UserRepository : MongoRepository<User> {
}
```

```kt:UserService.kt
@Service
class UserService(
    private val userRepository: UserRepository
) : UserRepository {
    fun saveUser(user: User): User {
        return this.userRepository.save(user: User))
    }

    fun getUser(id: String): User {
        return this.userRepository.get(id) ?: throw IllegalArgumentException("User with id $id not found")
    }

    fun deleteUser(id: String) {
        this.userRepository.clear(id)
    }
}
```

### テストクラス
```kt:UserServiceTest.kt
internal class UserServiceTest : FunSpec(){
    lateinit var userRepository: UserRepository
    lateinit var userService: UserService

    beforeTest {
        // mock作成
        userRepository = mockk()
        userService = UserService(userRepository)
    }

    init {
    	context("saveUser") {
	    context("正常系") {
    		//given
    		val randomId = UUID.randomUUID().toString();
    	        val testUser = User(id = randomId, name = "testUser1")
    		val expectedUser = User(testUser)

    		every { userRepository.saveUser(any()) } returns expectedUser

    		//when
    		val result = userService.create(user)

    		//then
    		result.should(expectedUser)

    		verify { userRepository.save(any()) }
    		confirmVerified(userRepository)
    	    }
	}
    }
}
```

# まとめ
mockを使うことでDBの環境依存などが起きないので、外部依存を気にせず想定しているテストを簡単に確認ことができます。Javaだとmockitoというライブラリが有名かと思いますが、KotlinだとmockKがそのポジションのよう。テストケースを書く上で、使わない理由はないかなと感じています。
【車輪の再発明】Enumを使わずSUM関数を作ろう！

ElixirのEnumは便利です
そのありがたみを理解するためにEnumを使わずにコーディングしたいと思います

経緯
「今までの知識だけでもプログラム組めますよね？」
※別の表現だったかもしれんがざっくり言うとこんな感じ

また、悔しい思いをしたので組みます

ヒントは再帰を使えばできますと教わったので作ってみましょう

```Elixir:hoge.ex
defmodule Hoge do
  def sum(list), do: sum(list, 0)
  def sum([], acc), do: acc

  def sum([h | list], acc) do
    acc = acc + h
    sum(list, acc)
  end
end

```

実行結果
```Elixir:iex
iex(1)> [1, 2, 3, 4, 5] |> Hoge.sum()
15
```

元になった関数で検証
```Elixir:iex
iex(3)> [1, 2, 3, 4, 5] |> Enum.sum()
15
```

Enum使わずに作れました