OmniAICreator/Qiita-1.07M huggingface dataset:
Poetryで管理しているプロジェクトの名前を変えたら、`poetry run mypy`を実行したときに"Command not found"というエラーが発生した

# 環境
* Python 3.12.4
* Poetry 1.8.3

# はじめに

Poetryを使って、Pythonのアプリケーションを開発しています。
仮想環境はプロジェクト内に作成するように設定しています。

```
$ pwd
/home/yuji/tmp/awesome

$ tree
.
├── README.md
├── awesome
│   └── __init__.py
├── poetry.lock
├── poetry.toml
├── pyproject.toml
└── tests
    └── __init__.py

2 directories, 6 files

$ ls .venv/
bin  lib  pyvenv.cfg
```

```toml:pyproject.toml
[tool.poetry]
package-mode = false


[tool.poetry.dependencies]
python = "^3.12"
mypy = "^1"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```

```toml:poetry.toml
[virtualenvs]
in-project = true
```

```
$ poetry run python --version
Python 3.12.4

$ poetry run mypy --version
mypy 1.10.1 (compiled: yes)
```


# 何が起きたのか
`/home/yuji/tmp/awesome`ディレクトリの名前を、`awesome2`に変更しました。

```
$ cd /home/yuji/tmp/

$ mv awesome awesome2
```

ディレクトリ名変更後では、`poetry run mypy --version`を実行できませんでした。

```
$ cd awesom2

$ poetry run mypy --version
Command not found: mypy
```

ただし、`poetry run python -m mypy`は実行できました。

```
$ poetry run python -m mypy --version
mypy 1.10.1 (compiled: yes)
```

# `poetry run mypy`を実行できない原因
`/home/tmp/awesome2/.venv/bin/mypy`の中身は以下の通りです。シバンには`/home/yuji/tmp/awesome/.venv/bin/python`と絶対パスが記載されています。なので、`awesome`ディレクトリの名前を変えたら、動かくなくなったようです。

```python:/home/tmp/awesome2/.venv/bin/mypy
#!/home/yuji/tmp/awesome/.venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from mypy.__main__ import console_entry
if __name__ == "__main__":
    sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0])
    sys.exit(console_entry())
```

「仮想環境がプロジェクト内にあるので、プロジェクト名を変えても問題ない（相対パスで記載されているだろう）と」思っていたため、エラーの原因を特定するのに少し時間がかかってしまいました。


ちなみに、`.venv/bin/python`はシンボリックリンクなので、ディレクトリ名を変更しても`poetry run python`で実行できます。

```
$ ls .venv/bin/python -l
lrwxrwxrwx 1 yuji yuji 48 Jul 19 09:46 .venv/bin/python -> /home/yuji/.pyenv/versions/3.12.4/bin/python3.12
```



# 解決方法
`Poetry`で管理しているプロジェクトのパスが変わったら、仮想環境を作り直しましょう。

# 補足
`.venv/bin/mypy`のシバンは、`pip`の以下のコードで生成しているようです。

https://github.com/pypa/pip/blob/5fb46a305e7e54a76d04d93327f2e6789f71637b/src/pip/_vendor/distlib/scripts.py#L42
[OCI]クロステナンシーポリシーでリモートピアリング接続する

# はじめに
クロステナンシーポリシーを設定して、異なるテナンシー間をリモートピアリングで接続します。
以下を参考にしました。

https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/scenario_e.htm

https://speakerdeck.com/ocise/ociji-shu-zi-liao-idoyobiakusesuguan-li-iam-xiang-xi?slide=61

https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/drg-iam.htm#scenario_m__IAM_cross-tenancy

# 構成

以下のような構成です。どちらも東京リージョンですが、テナンシーは別々です。
左をリクエスター（A）、右をアクセプター（B）とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/38748071-7d82-0249-9bfc-d927239ddb58.png)

# ポリシー
以下のポリシーをそれぞれrootCompartment直下に設定します。

- リクエスター

```
Define tenancy アクセプターテナンシー名 as アクセプターテナンシーOCID
Allow group リクエスターグループ to manage remote-peering-from in compartment リクエスターコンパートメント
Endorse group リクエスターグループ to manage remote-peering-to in tenancy アクセプターテナンシー名
```

- アクセプター

```
Define tenancy リクエスターテナンシー名 as リクエスターテナンシーOCID
Define group リクエスターグループ as リクエスターグループOCID
Admit group リクエスターグループ of tenancy リクエスターテナンシー名 to manage remote-peering-to in compartment アクセプターコンパートメント名
```

# DRGの作成
リクエスター、アクセプターそれぞれでDRGを作成します。
（詳細割愛）

# DRGアタッチメントの作成
リクエスター、アクセプターそれぞれでDRGアタッチメントを作成します。
（以下の画像はリクエスターですが、アクセプターも同様に作成します。）

![スクリーンショット 2024-07-19 9.34.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/196f6885-4525-5c4c-e41a-053d7c78074a.png)

# リモートピアリング接続の作成
リクエスター、アクセプターそれぞれでリモートピアリング接続を作成します。
（以下の画像はリクエスターですが、アクセプターも同様に作成します。）

![スクリーンショット 2024-07-19 9.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/5f56864f-cbd2-6dee-2456-6ec08f7c2be2.png)

この時点ではピアリング・ステータスは「ピアリングなし」となります。

![スクリーンショット 2024-07-19 9.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/293f4712-9269-8514-e04d-783ba7cbc409.png)

# リモートピアリング接続の確立
リクエスター側でリモートピアリング接続を確立します。設定画面では、アクセプター側のリモートピアリング接続のOCIDを設定します。

![スクリーンショット 2024-07-19 9.40.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/2b280aaa-d729-139a-058c-b62acb1cccfc.png)

数分待つと、ステータスが「ピアリング済」に変わります。

![スクリーンショット 2024-07-19 9.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/7be957b7-b975-103f-4db1-0fa39ae8e5d9.png)

アクセプター側も「ピアリング済」に変わります。

![スクリーンショット 2024-07-19 9.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/18b33093-dda5-a23b-a1de-c9211ddb00f4.png)
Node.jsでS3の署名付きURL取得

node.jsで署名付きURL取得するコードサンプルを書きました。
aws-sdk v3を使用しています。

```javascript
import { S3Client, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const s3 = new S3Client({ region: process.env.AWS_REGION });
// 環境変数にあらかじめBUCKET_NAMEを登録しておく
const BUCKET_NAME = process.env.BUCKET_NAME;
const KEY = "hoge"

export const handler = async (event) => {
    const { filename, contentType } = JSON.parse(event.body);
    console.log("body", event.body);

    const params = {
        Bucket: BUCKET_NAME,
        Key: `${KEY}/${filename}`,
        ContentType: contentType,
    };

    const command = new PutObjectCommand(params);
    // オブジェクトダウンロードするときは以下
    // const command = new GetObjectCommand(params);

    try {
        const signedUrl = await getSignedUrl(s3, command, { expiresIn: 3600 }); // 署名の有効期限を設定（例: 1時間）
        return {
          statusCode: 200,
          headers: {
            'Access-Control-Allow-Origin': '*',
          },
          body: JSON.stringify({ url: signedUrl }),
        };
      } catch (err) {
        console.error(err);
        return {
            statusCode: 500,
            headers: {
                'Access-Control-Allow-Origin': '*',
              },
              body: JSON.stringify({ error: "Could not generate signed URL" }),
        };
    }
};
```
AWSサービスメニュー開発をしていてAWSを好きだ！と感じた瞬間

# 勉強会
JAWS-UG#59で発表させて頂きました。

https://jawsug-asa.connpass.com/event/291919/

# 内容
社内でAWSのサービスメニュー開発を行いました。AWSを利用して何かアプリケーションを構築したわけではなくAWSの構築や運用をシステムインテグレーターとして提供するサービスです。

![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/22999f16-74a9-dc14-cc61-83a04e928534.png)

実施の背景としてはクラウド関連の案件の需要が増加する中、AWS案件は実施しているものの、まだまだオンプレミス対応案件に比べ、クラウド案件の対応割合が低いためです。

![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/4558d662-f008-c5d0-9dd6-58683e08d19c.png)

サービス開発で実施したプロセスになります。企画～サービス提供まで約3～4か月ほどで実施をしています。プロモーションフェーズでは紹介動画作成なども自分達で実施しました。

![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/4f8bf4dc-4a55-af13-3686-cd9c9334a8b4.png)

新しいことをやるにあたっては抵抗感がある人もいます。

![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/f6013ea7-2caf-e6c2-7eab-ac4ec4f24933.png)


そこで社内でAWSを知らない人にもAWSのおもしろさを知ってもらおうと思い、私が考えた上記ベスト3です！！

![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/4ffa7b40-c813-aca2-71cc-53e83761afaf.png)

AWSを使用すればサーバをすぐに作成出来ることを知っている人は多いですが、実際に数分で作成できるというデモを見せる。

![スライド12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/a2a19a40-6aaa-324f-258a-96e4f454d7ff.png)

自分がAWSを触り始めたころに最も感動したサーバレスです。難しそうなイメージですが、結構簡単に作れるのを見せる。S3の静的WEBホスティングでHTML置くだけで大丈夫な箇所など。

![スライド13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/bf5219e4-f9df-4308-f72d-6f2f62a793b0.png)

RAGで部内メンバーの自己紹介を付与して遊んでました。

![スライド14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/f36bd218-c03a-a705-df07-3cf2f218ba44.png)

「どのように便利になるか」、「どんなものを作れるか」を実際に見てもらうと良いと思います！

![スライド12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0be34b30-eaef-7f9f-6ad7-9576f51b701f.png)

# 勉強会
8月にCloudWatch入門の勉強会をやります。

https://infra365.connpass.com/event/323497/

# 資料

https://speakerdeck.com/toru_kubota/awssabisumeniyukai-fa-wositeiteawswohao-kida-togan-zitashun-jian
DELL Precision 3590 でHyper-Vを利用するためのBIOS設定

# 事象：
DELL Precision 3590 (Windows11) でHyper-Vを有効にした後、Hyper-Vマネージャを起動し、［新規］-［仮想マシン］を選択すると、メッセージやログも無しに終了し、仮想マシンを作成できませんでした。

# 対策：
1.BIOS設定（パソコンを再起動してDELLのロゴが出ている間に［F2］）を開く。
2.Advanced Setupを有効にして、Virtualization Supportを開く。（DELLのヘルプ記事とは操作がちょっと違う）
3.DELLのヘルプ記事では、［Virtualization］と［Virtualization for Direct-IO（またはVT-d）］を［Enabled］に設定するように書かれているけれど、既定値が［Enabled］なのでここはそのまま。
4.同じ画面の下の方に、**DMA Protection** の設定が３つあり、ON/ON/OFFになっていたので、とりあえずOFF/OFF/OFFにしてみる。

この方法が **適正かどうかはわかりませんが、** BIOS設定を保存してWindowsを再起動したところ、仮想マシンを作成できるようになったので、備忘録として起票しました。
ちょっと特殊なモデルなので、この機器でHyper-Vを使うのは珍しいとは思いますけれど。

# メモ：
DMAは、CPU抜きにメモリとデバイスの間でデータを転送する方式とのことです。
これをProtectすることで、デバイスがメモリを不正に操作できないようにする技術のようですが、なぜ影響するのかはよくわかりません。
とりあえずHyper-Vが使えるようになったので、調査はここまでとします。

# 参考：
[Dell製システムでハードウェア仮想化を有効または無効にする方法](https://www.dell.com/support/kbdoc/ja-jp/000195978/dell%E8%A3%BD-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%81%A7-%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2-%E4%BB%AE%E6%83%B3%E5%8C%96-%E3%82%92-%E6%9C%89%E5%8A%B9-%E3%81%BE%E3%81%9F%E3%81%AF-%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-%E6%96%B9%E6%B3%95)
fortranで動的に使用メモリ量を知りたい

fortranプログラムってメモリなくなると「突然segmentation fault」でおちる。
現代にしてこの仕様！！！研究室のqsubシステムとかだと、１ノードを分け合って使うこともあるーメモリの奪い合いが起こって共倒れ、ということにもなるんじゃないかな。どっちかが倒れてくれたら、どっちかは生き延びるのかな。動的メモリ確保なので、仕方ない、といえば仕方ないのかもしれんけど。

いずれにせよ、動的なメモリ管理をしないと計算のバッチサイズを自動化できない。一個ずつ計算して論文にしてる時代は幸せ？だったけど、１０００ケースを一括処理できるようにしていかないといけない。

数値計算は、「メモリの許す範囲でメモリは目一杯使い、許さなければon-the-flyでやる」というもの。計算の速さは演算速度ｘメモリ量ｘ通信速度で決まってくる（ディスクは通信速度〜０なのでスワップはまずい）。

Cにはgetrusageがある。これをfortranから呼び出せば良い。
以下、試してみてください。デバッグに使ってメモリリークを探せました。
(GBになるとinteger(4)で対応できないので注意）。
copilotがだいぶと教えてくれた。

もっと良い方法があれば教えてください！

----
(たぶん）disk swapがおこると以下のような感じで進んでいく. 540GB/32=16.8GBあるはずなのに
よくわからない。
```
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　hhmmss　　　　　　　　GB
goto iwimag ixx niw=0       10 DateTime= 20240721 221800.98 memused  8.499
goto iwimag ixx niw=1       10 DateTime= 20240721 230358.12 memused  8.559
goto iwimag ixx niw=2       10 DateTime= 20240722 005736.10 memused  8.559
goto iwimag ixx niw=3       10 DateTime= 20240722 010642.06 memused  8.559
goto iwimag ixx niw=4       10 DateTime= 20240722 011532.23 memused  8.559
goto iwimag ixx niw=5       10 DateTime= 20240722 012303.04 memused  8.559
goto iwimag ixx niw=6       10 DateTime= 20240722 013018.45 memused  8.559
goto iwimag ixx niw=7       10 DateTime= 20240722 013735.36 memused  8.559
goto iwimag ixx niw=8       10 DateTime= 20240722 014430.31 memused  8.559
goto iwimag ixx niw=9       10 DateTime= 20240722 015326.07 memused  8.559
goto iwimag ixx niw=10      10 DateTime= 20240722 020024.73 memused  8.559
endof CorrelationSelfEnergy    DateTime= 20240722 020901.02 memused  8.559
```
---11回回しているが、7分の時もあれば45分かかる時もある。アカンな。


```fortran
real(8) function memused() !in GB
  use iso_c_binding
  implicit none
  type, bind(C) :: c_timeval
     integer(c_long) :: tv_sec
     integer(c_long) :: tv_usec
  endtype c_timeval
  type, bind(C) :: c_rusage
     type(c_timeval) :: ru_utime
     type(c_timeval) :: ru_stime
     integer(c_long) :: ru_maxrss
     integer(c_long) :: ru_ixrss
     integer(c_long) :: ru_idrss
     integer(c_long) :: ru_isrss
     integer(c_long) :: ru_minflt
     integer(c_long) :: ru_majflt
     integer(c_long) :: ru_nswap
     integer(c_long) :: ru_inblock
     integer(c_long) :: ru_oublock
     integer(c_long) :: ru_msgsnd
     integer(c_long) :: ru_msgrcv
     integer(c_long) :: ru_nsignals
     integer(c_long) :: ru_nvcsw
     integer(c_long) :: ru_nivcsw
  end type c_rusage
  interface
     function getrusage(what,usage) bind(C, name="getrusage")
       import :: c_int, c_long, c_rusage
       integer(c_int) :: getrusage
       integer(c_int), value :: what
       type(c_rusage) :: usage
     end function getrusage
  end interface
  type(c_rusage) :: usage
  integer(c_int) :: ret
  integer :: mpi__info
  real(8)::k=1000
  ret = getrusage(0,usage)
  memused = usage%ru_maxrss/k**2 ! in GB
end function memused
```
Djangoでカスタムコマンドを作成する

# はじめに

こんにちは、Python初心者のkeitaMaxです。

今回はDjangoでカスタムコマンドを作成してみようと思います。

前回の記事はこちら。

https://qiita.com/keitaMax/items/31d76751bff1171d9827

# 作業するディレクトリ作成からブラウザに文字列を表示する

以下コマンドでbatchディレクトリを作成します。

```
python3 manage.py startapp batch
```

これをすると`batch`ディレクトリが作成されます。

フォルダを以下のように修正、追加します。

```py:app/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path("batch/", include("batch.urls")),
]
```

```py:batch/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

```


```py:batch/views.py
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

このように修正した後、以下のURLにアクセスすると設定した文字列が出てくるはずです。

```
http://localhost:8000/batch/
```
![スクリーンショット 2024-07-18 19.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/3b5d1e57-22e6-7b78-28bc-dc846e8d4c8c.png)


# コマンドの作成

以下のようにディレクトリとファイルを作成します。

```
batch
└── management
    ├── __init__.py
    └── commands
        ├── __init__.py
        └── example.py
```
```py:example.py
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "Help message"

    def handle(self, *args, **options):
        print("Hello, World!")
```

`__init__.py`ファイルは空のままで大丈夫です。

また、`settings.py`に以下を追加します。

```py:settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'batch',  // 追加
]
```

これでコマンド作成が完了です。

あとは以下コマンドでコンテナの中に入り、

```
docker compose exec app bash
```

以下コマンドで今作成したコマンドを実行してみましょう。
```
python manage.py example
```

```
root@ada83e062183:/code# python3 manage.py example
Hello, World!
root@ada83e062183:/code# python3 manage.py example
```

`Hello, World!`とでてくれば完了です。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://docs.djangoproject.com/en/5.0/intro/tutorial01/

https://docs.djangoproject.com/en/5.0/howto/custom-management-commands/#

https://zenn.dev/wtkn25/articles/django-custom-command

# 次の記事

https://qiita.com/keitaMax/items/d30d2ba23ae5e7d7a65c
あなたが「ネットワーク効果」を学ぶなら

# はじめに

### なぜネットワーク効果を学ぶのか
  - ネットワーク効果は1994年以降のすべてのテック企業の価値の70％を説明することができ、デジタル世界における防御力と価値創造の最高の形である
  - ネットワーク効果から得られる価値は指数関数的に増加する


# ネットワーク効果を、直感的に学ぶなら

https://ncase.me/crowds/ja.html

人間の心理や考えがどうやって広まるか、ゲーム感覚でわかる。

伝達の良い面、悪い面についてニュートラルに書かれておるのが良い。


# プロダクトやサービスの伝播のためにネットワーク効果を使いたいなら

あるプロダクトやサービスが、より多くの人に使われることによって、さらなる価値を獲得する現象としてのネットワーク効果を扱う。

https://note.com/kei_book/n/nefdab4e4289a

サービスのグロース観点での記述が豊富で助かる。

「**ネットワーク効果を持っていると判断する方法」で、具体KPIの設定例も載ってる。**


## ネットワーク効果の分類

ネットワーク効果って、13種類あんねん。

| 種類 | 例 | 説明 |
|:--|:--|:--|
| 物理的 | 固定電話 | 物理ノードや物理リンクに関連する直接ネットワーク効果。最も防御力が高い。 |
| プロトコル | イーサネット | 通信や計算の標準が宣言されると、すべてのノードとノード作成者はそのプロトコルを使ってネットワークに接続できる。 |
| パーソナル・ユーティリティ | iMessage、WhatsApp | ユーザーの個人的なアイデンティティがネットワークにリンクし、日常的に必要とされる。 |
| パーソナル | フェイスブック | 人のアイデンティティや評判がプロダクトと結びついている。 |
| マーケット・ネットワーク | HoneyBook、AngelList | パーソナルネットワークの機能とマーケットプレイスの取引を組み合わせたもの。 |

| 種類 | 例 | 説明 |
|:--|:--|:--|
| マーケットプレイス | eBay、Craigslist | 買い手と売り手の両面があり、ネットワークが価値の大部分を提供する。 |
| プラットフォーム | ウィンドウズ、iOS、Android | 供給側と需要側が、プラットフォームを通じて価値を交換する。 |
| 漸近的マーケットプレイス | Uber、Lyft | ある規模を超えると、ネットワークの成長が現在のユーザーに価値を追加しなくなる。 |
| データ | Waze、Yelp! | より多くのデータを収集するほど、プロダクトの価値が上昇する。 |
| 技術的パフォーマンス | Bittorrent、Skype | プロダクトの技術的パフォーマンスがユーザー数の増加に伴って直接的に向上する。 |

| 種類 | 例 | 説明 |
|:--|:--|:--|
|言語 | Google、Xerox | 専門用語は、より多くの人々に受け入れられることで、すべてのユーザーにとって価値が高まる。 |
| 信念 | 通貨、宗教 | 人々が信念を信じれば信じるほど、信念を信じる人にとって価値が高まる。 |
| バンドワゴン | Slack、Apple | 人々が仲間外れにされたくないために、あるネットワークに参加せざるを得ないと感じる。 |

## 押さえておくべきポイント

### 基本となる法則性
  - サルノフの法則: ネットワークの価値はネットワークの規模に正比例して増大する
  - メトカーフの法則: 通信ネットワークの価値は、ネットワーク上のユーザー数の2乗に比例して大きくなる
  - リードの法則: グループ形成型のネットワークでは、ネットワーク上のノードの総数をNとすると、2^Nの割合で値が増加する

### ネットワークの特性
  - クラスタリング: ノードはクラスタ化する傾向がある
  - クリティカルマス: ネットワークが生み出す価値が、プロダクトそのものや競合プロダクトの価値を上回る時点
  - 不規則性とクラスタリング: ネットワークには通常不規則性があり、クラスターが形成される
  - 非対称性: マーケットプレイスの両サイドでノードを獲得する難易度の違いと、ノードの種類内における非対称性

### 注意すること
- ディスインターミディエーション、スイッチングコスト、リテンション、蒸発冷却効果、ソーシャルネットワークのデススパイラル

-  紛らわしい概念
    -  バイラル効果とバイラリティ: ネットワーク効果とは異なる
    -  幾何学的成長 vs. 線形成長: ネットワーク効果があると非線形成長を示す
    -  強化: ネットワーク効果を持つビジネスは他の防御力も構築しやすい
    -  規模の経済性: ネットワーク効果とは異なる
    -  ブランド: ネットワーク効果とは異なる強力な防御力
    -  エンベッディング: ネットワーク効果とは異なる防御力
MRBのSHA256

mruby on YABMでmrbを作る時にSHA256を表示するようにしました。[bcmbm-mruby](https://github.com/yamori813/bcmbm-mruby)では

```
% make image
./mruby/build/host/bin/mrbc -ohoge.mrb samples/hello.rb
SHA256 (hoge.mrb) = 097833905716fddec214245680539e830ac59f8f1d20e2c38f930a0d6a3b3055
tools/asustrx -o main.trx main.bin.gz hoge.mrb
mjn3's trx replacement - v0.90, modified to pack ASUS compatible trx
```

となりmain.trxを実機に焼くと

```
Starting program at 0x80001000
bcmbm-mruby 7b35e9f(master) Fri Jul 19 07:20:46 JST 2024
mruby ac8846dbc(master)
Mem : 1000000
SP : 80ffff00
BOOT_CONSOLE : uart0
Clock : 240000000
MRB SIZE 326
MRB SHA256 097833905716fddec214245680539e830ac59f8f1d20e2c38f930a0d6a3b3055
Hello Bear Metal mruby on YABM..............................
```

となります。
ファイルのアップロードに伴うセキュリティ担保する方法


+ [「ファイル添付」を有効にされている方はエクスペリエンスサイト上でのファイルのアップロードに伴うセキュリティ担保はどのように確保されておりますでしょうか。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmO7E)

:::note
同じような懸念を持たれている方の投稿があります。

やはり現状では別のウィルススキャンの仕組みを使う必要があるようなことがいわれています。

which means we can't reliably turn on "attach" files without investing additionally in virus scan options when users bring in files from their devices. 

https://ideas.salesforce.com/s/idea/a0B8W00000Gdb4KUAR/allow-admins-to-control-who-can-upload-files-to-chatter-same-as-content

回避策になるかは判断できないですが、特定の拡張子を持つファイルのアップロードを制限する、つまり承認されたファイルの種類/拡張子のみを許可する方法が解説されています。

確かにバイナリファイルでない、マクロのないファイルならウィルスの脅威はかなり低くなると思います。ただし、拡張子が偽装されてしまうと、この方法ではすり抜けられてしまいます...

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvbdwSAB
:::
画面フロー : ファイルアップロードコンポーネント


+ [フロー内の「ファイルのアップロード」](https://qiita.com/Keiji_otsubo/items/e1dfed8940eb7a1ade6a)

+ [画面フローでの添付ファイル必須設定](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007eqFH4)

:::note
英語ですが回避策が解説されています。

決定要素を使用して出力を確認する

ファイル アップロード コンポーネントには、コンテンツ ドキュメント ID、コンテンツ バージョン ID、およびファイル名の出力値があります。ユーザーが [次へ] ボタンをクリックすると、決定要素を使用して、ユーザーがファイルを正常にアップロードしたかどうかを確認できます。

https://salesforcetime.com/2023/10/02/how-to-make-the-file-upload-component-required/
:::
Javaで「戻り値を使ってメソッドから値を返す」の動作を確認してみた

# 概要

Javaで「戻り値を使ってメソッドから値を返す」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/method/index5.html

# 実装

以下のファイルを作成しました。
```JSample5_1.java
class JSample5_1{
  public static void main(String args[]){
    int kekka;

    kekka = bai(9);
    System.out.println(kekka);

    kekka = bai(5);
    System.out.println(kekka);
  }

  private static int bai(int n){
    return n * 2;
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample5_1.java 
$ java JSample5_1 
18
10
```

# まとめ

何かの役に立てばと。
リダイレクト先をテストする

```ruby
require "rails_helper"

RSpec.describe UsersController,type: :controller do
  describe "create user transition page" do
    it "assigns @user" do
      post :create, :params => {:name => "hogehoge", :email => "gehogeho"}
      expect(response).to redirect_to(:action => 'show',id: assigns(:user).id)
    end

    it "not assigns @user" do
      post :create, :params => {:name => "", :email => ""}
      expect(response).to redirect_to(:action => 'new')
    end
  end
end
```

render_templateからredirect_toに変更したらテストが通った。
インスタンス変数を保存した後リダイレクトしていたため変更した。

>The render_template matcher is used to specify that a request renders a given template or layout. It delegates to assert_template
It is available in controller specs (spec/controllers) and request specs (spec/requests).
NOTE: use redirect_to(:action => 'new') for redirects, not render_template.


# 出典
https://rspec.info/features/6-0/rspec-rails/matchers/render-template-matcher/#:~:text=The%20render_template%20matcher,not%20render_template.

>assigns(key = nil)	アクションを実行した結果、インスタンス変数に代入されたオブジェクトを取得
# 出典
https://railsdoc.com/test#:~:text=assigns(key%20%3D%20nil,%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97

# 感想
とりあえずコントローラのテストを簡単にできてよかった。
またテストのタイトル、場合わけの英文には問題あり。

asssigns(:user)とするとコントローラの@userにすることができることを知れてよかった。
Linuxでファイルを作る

# touchはファイルを作るコマンドではない
touchコマンドの解説を見るとファイルを作るコマンドという人が多いがそうではない。
では、　manコマンドでtouchを調べてみると

touch - ファイルのタイムスタンプを変更する

と書かれている。そのとおり！！
決してファイルを作るコマンドとは書かれていないそもそもなんでこれがあるかというと
make コマンドでソースを再コンパイルしたい場合にファイルのタイムスタンプを更新して再コンパイルするためのものです。

# 大きさ０のファイルを作りたいなら
cp /dev/null filename
とすると大きさ０のファイルが出来上がる
中身があってもこうすることで大きさ０に戻すことができる。

# 改行コードのみのファイルを作る場合
echo > filename
で出来上がる
html 画像表示タグ『imgタグ』『iframeタグ』について

# 目次


| 項番 | ページ内リンク | 説明 |
|:----:|:-------------|:-------------|
| 1 | [1.はじめに](#1-はじめに) ||
| 2 | [2.imgタグについて](#2-imgタグについて) ||
| 3 | [3.iframeタグについて](#3-iframeタグについて) ||
| 4 | [4.さいごに](#4-さいごに) ||

更新履歴
2024/07/19　@junerさんから qiitaの見易さ・記事コード修正案を頂きました。☺
記事コードが余りわからなかったので、非常に助かりました！☺

https://qiita.com/juner

※勝手に載せてるので、怒られたら消します。
2024/07/19　初稿

# 1-はじめに
html における画像を挿入する方法
・imgタグ
・iframeタグ

の解説記事

※「絶対パス」もしくは「相対パス」の記事は後日書きます。

「絶対パス」
『`https://www.~~~~~~.com/img/sample.jpg`』
インターネットにある 『`https://www.~~~~~~.com/`』の『`img`』の『`sample.jpg`』を参照するよ☺

「相対パス」
『`img/sample.jpg"`』
同じファイル内の『`img`』の『`sample.jpg`』を参照するよ☺


# 2-imgタグについて
imgタグ

src=画像のurl先 
`<img src="[ファイル名]">`
```html
<img src="[ファイル名]">
```

alt=画像の名前
`<img src="[ファイル名]" alt="ここの写真の名前・ロゴ画像・etc">`

```html
<img src="[ファイル名]" alt="ここの写真の名前・ロゴ画像・etc">
```

title=マウスカーソルがあった時に名前が出るよ
`<img src="[ファイル名]" alt="ここの写真の名前・ロゴ画像・etc" title="マウスカーソルがあった時に名前が出るよ">`

```html
<img src="[ファイル名]" alt="ここの写真の名前・ロゴ画像・etc" title="マウスカーソルがあった時に名前が出るよ">
```

# 3-iframeタグについて
iframeタグは別のHTMLを読み込む際に使われるタグで、主な用途としては、別のWebサイトやSNSに公開されている画像や動画を転載する場合に使用します。
(例：youtube/google map とか)

`<!-- https://www.=====.comの動画をiframeで表示するよ☺ -->`
`<iframe src="https://www.=====.com"></iframe>`


```html
<!-- https://www.=====.comの動画をiframeで表示するよ☺ -->
<iframe src="https://www.=====.com"></iframe>
```

width="幅" %・px とかで指定するよ☺
height="高さ" %・px とかで指定するよ☺

`<!-- https://www.=====.comの動画をiframeでwidth="100%" height="500px"表示するよ☺ -->`

`<iframe src="https://www.=====.com" width="100%" height="500px" frameborder="0"></iframe>`


```html
<!-- https://www.=====.comの動画をiframeでwidth="100%" height="500px"表示するよ☺ -->
<iframe src="https://www.=====.com" 
width="100%" height="500px" frameborder="0">
</iframe>
```

`<iframe src="https://redstar-hp.netlify.app/images/logo.jpg" width="300px" height="100%"　frameborder="0"></iframe>`

width="300px" 300ピクセル
height="100%" 100%
で表示するよ☺

```html
<iframe src="https://redstar-hp.netlify.app/images/logo.jpg"
width="300px" height="100%" frameborder="0">
</iframe>
```

# 4-さいごに
恐らくいっぱい記事があると思いますが書きました。
自分で書いている『htmlのサンプルコード』のurlリンクとして使いたいと思い、執筆しています。
まだ編集中ですが、良かったら見てみて下さい。☺

https://qiita.com/redstar-hr/items/0bfbffc503a80afe1b85
Pythonを使って、指定したフォルダ以下の重複ファイルをチェックする

duplicatesライブラリを使います
これは重複ファイルを、Pandas Dataframeの形で返します。

https://pypi.org/project/duplicates/


# 使い方
引数に指定したフォルダ以下をスキャンするスクリプトを書いてみた。

```dupcheck.py
import duplicates as dup
import pandas as pd
import os,sys

folder_of_interest =  sys.argv[1]
df = dup.list_all_duplicates(folder_of_interest, fastscan=True)
if df.empty :
	exit()

print(df)
```

これを、イラスト集CGフォルダに対して使ってみる。

```cmd
> python dupcheck.py e:\illusts
                                                  file                                               hash
471  e:\illusts\china\[埃罗芒阿老师 我的妹妹是黄漫...  04c9821c140e8c58cdeef5d6c365916f905b44e31f5948...
468  e:\illusts\china\[埃罗芒阿老师 我的妹妹是黄漫...  04c9821c140e8c58cdeef5d6c365916f905b44e31f5948...
469  e:\illusts\china\[埃罗芒阿老师 我的妹妹是黄漫...  0890d1ea0518b338a93fbc2afc8240e5c7cdfa7cad39bd...
..                                                 ...                                                ...
604  e:\illusts\china\[爱上火车Last Run 火...  e10506965a84a09469c9448cced646b1e17e618a64d91c...
335  e:\illusts\china\[11月的理想乡 11月的阿卡...  e22dd0666099e32670998761ae8d5e465c18183afa772c...
334  e:\illusts\china\[11月的理想乡 11月的阿卡...  e22dd0666099e32670998761ae8d5e465c18183afa772c...
348  e:\illusts\china\[ALICE or ALICE...  ef0797d65c1584fb28997ef7ca913e6b1d24c05381a5fe...
347  e:\illusts\china\[ALICE or ALICE...  ef0797d65c1584fb28997ef7ca913e6b1d24c05381a5fe...

[88 rows x 2 columns]
```

# もっと便利に

Dataframeについて、以下を使って表示させたほうが見やすいかもしれません。

```python
df["file"] = df["file"].str.replace(folder_of_interest, "")		# 相対パスにする
df["hash"] = df["hash"].str.slice(0, 9)		# ハッシュキーは短くていい
print(df.to_string(index=False, max_rows=None,max_cols=None, justify="left"))   # 全件表示
```

# References

- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_string.html
Macで動いていたdocker containerが、Windows環境でrunに失敗した

タイトル通り、Macで動いていたdocker containerが、Windows環境でrunに失敗しました。
docker-compose.ymlは以下。docker-compose-waitを用いてdb containerの起動待ちを行った後、migration conatianerが起動しtableのmigrationを行う仕組みです。

```
services:
  db:
    build:
      context: .
      dockerfile: ./images/db/Dockerfile
    volumes:
      - ./db/data:/var/lib/mysql:rw
    restart: always
    ports:
      - "3306:3306"
    env_file:
      - ./envfiles/.db
  migration:
    build:
      context: .
      dockerfile: ./images/migration/Dockerfile
    depends_on:
      - db
    command: ["upgrade head"]
    volumes:
      - ./migration/alembic:/workspace/alembic:rw
    env_file:
      - ./envfiles/.migration
```
Dockerfileは以下。poetryを使ってalembicをcontainerにインストールします。
```
FROM python:3.11-bookworm as requirements-stage
WORKDIR /tmp

RUN pip install poetry

COPY ./migration/pyproject.toml ./migration/poetry.lock* /tmp/

RUN poetry export -f requirements.txt --output requirements.txt --without-hashes

FROM python:3.11-bookworm
WORKDIR /workspace

COPY --from=requirements-stage /tmp/requirements.txt /workspace/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /workspace/requirements.txt

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait

COPY ./migration/run.sh /usr/local/bin
RUN chmod +x /usr/local/bin/run.sh

COPY ./migration/alembic.ini ./

ENTRYPOINT ["run.sh"]
```

docker compose buildは通っているのになぜかdocker compose upで以下のようなエラーが出力されました。
```
migration-1        | exec /usr/local/bin/run.sh: no such file or directory
```

15分ほど試行錯誤しても解決策が思い浮かばなかったため、github copilot chatに助けを求めると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659945/864ac464-c160-1396-3891-89a0119ec5e1.png)

どうやら改行コードの修正が必要らしいとのことでした。
半信半疑で指示通りCRLFからLFに変更すると、run.shの中身の見た目は一切変わらずdocker compose upが通りました。。。
```
migration-1        | [INFO  wait] Host [db:3306] is now available!
migration-1        | [INFO  wait] --------------------------------------------------------
migration-1        | [INFO  wait] docker-compose-wait - Everything's fine, the application can now start!
migration-1        | [INFO  wait] --------------------------------------------------------
migration-1        | INFO  [alembic.runtime.migration] Context impl MySQLImpl.
migration-1        | INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
migration-1        | INFO  [alembic.runtime.migration] Running upgrade  -> 61e1a7eba0f8, create_table_circle_info
migration-1        | run migraiton scripts in online mode
migration-1 exited with code 0
```

恥ずかしながら、OSによって改行コードが異なることを認知していませんでした。。。それが原因でfile not found errorが発生するとは、それはそれで不思議ですね。


[参考]
https://qiita.com/sbeleg_77/items/833de09f7bca24bc8ab8
[JavaScript] 表示/非表示にif文を使わない方法

<!--下書き-->
# [JavaScript] 表示/非表示にif文を使わない方法

この記事は表示/非表示(あるいは可視/不可視)を実現するJavaScript(JS)についてのメモです。DEMOページは特にありません、あしからず。
HTML x JS x CSS

__前提__
- アコーディオンやドロワーではない、単純にパッと表示＝可視したり、非表示=不可視になったりするタイプの表示/非表示
- CSSでいう`display:none;`、`display:block;`をJSから操作するタイプ
- 以降、この記事で略してfuncと書かれているのはfunctionのこと

## JSコード
JSにおいて複数回出てくる頻出値であることを見越して変数化。ついでに配列化。後に出るfuncで共通。
### 共通func
```javascript: 共通：可視/不可視func
// id取得短く書く用
const $ =(id)=>{ return document.getElementById(id) };

// 可視/不可視の変数化と配列化
const blAk = "block";
const nVn = "none";
const dispArr = [nVn,blAk];
```
※「id取得短く書く用」については下記を参照
[[JavaScript] 頻出document.getElementByIdを短く書く](https://qiita.com/Reng/items/6f340959c02bf9a5d44e)

### ✅ JSコード：表示/非表示にif文を使わないタイプ
メリット：行が少なく済んでイイ
デメリット：...特に見当たらないが...？
```javascript: 可視/不可視func①
function openClose(id){
  if (!id) return;
  const ele = $(id).style;
  ele.display = dispArr[ele.display.indexOf(nVn) + 1];
}
```
__解説__
1行目：引数で指定のidが無ければそこで終了(無くても成立する)
2行目：`style`までを変数化(無くても成立する)
3行目：表示/非表示の働きを設定だか指定だかしてるカ所

と、いうわけで、1行目を省いて2行目も変数化しないなら下記のように1行で済む：
```javascript: 可視/不可視func①, 1行でもOK
function openClose(id){
  $(id).style.display = dispArr[ele.display.indexOf(nVn) + 1];
}
```

### ✅ JSコード：表示/非表示にif文を使うタイプ
メリット：if文の構文や働きについて分かりやすい
デメリット：確か、htmlタグ自体にあらかじめ`style=display:none;`など`display`値を書いておかなければ1クリック分が何も働かなかったような...? =ウロ覚え=
```javascript: 可視/不可視func②
function openClose(id){
  const ele = $(id);
  const disp =ele.style.display;
  if (disp === 'block' || !disp) {
    ele.style.display = nVn;
  }
  else {
    ele.style.display = blAk;
  }
}
```
__解説__
1行目：id取得によるターゲット要素を変数化
2行目：`style.display`までを変数化
3行目以降：表示/非表示の働きを設定だか指定だかしてるカ所

- 最初のif：表示(`display:block`)なら非表示、もしくは`display`設定が(html側の)タグに無かったら非表示
- そうじゃなければ=非表示(`display:none`)なら表示




## 『表示/非表示』の種類
アプリの操作やサイト上には (≒ 普段見るHPには ≒ 普段操作するウェブアプリには)、いくつかの種類の表示/非表示 効果があります。

イメージ共有のため『表示/非表示』の種類について整理して書き出したのが下記。

### アコーディオン式の表示/非表示
-  ２〜３行文ほど表示して末尾に｢もっと読む｣などがあり
-  続きがある事を透過グラデなど視覚的にも表現していて
- ｢もっと読む｣をクリックなどすると(上→下方向に)ヌルっと全文表示
- イメージしやすい例：
    - YouTubeの説明欄
    - その他たくさんのシーン

### ドロワー式の表示 / 非表示
- サイドバーなど、左側(or右側)からヌルっと領域表示
- 実際は範囲外からの左→右(or左→右)エフェクト付きの位置移動
- イメージしやすい例：
    - サイドバーメニュー、左→右の移動エフェクト付き表示
    - スマホアプリのメニュー(サイドバーメニュー)
    - その他たくさんの例

### (単に)表示 / 非表示：
- 非表示だったモノ(領域)が、パッと表示になったりパッと非表示なったり
- イメージしやすい例：
    - いわゆるポップアップ(PopUp)、モーダルウィンドウ類 ＠webページ
    - 環境設定で呼び出す設定画面 ＠アプリ類
    - ミニメニュークリックで表示される簡易設定(サイドバーの一種)＠ブラウザ

__📎備考１__
個人的認識としては、ヌルっと表示(/非表示)されるのがアコーディオン式やドロワー式。

もう一つ特徴を言うと、(元の)画面を全部覆わないのがドロワー(≒サイドバータイプ)で、全部覆うのがアコーディオン式の表示/非表示。

アコーディオン式はスマホやiPadなど小さい画面の媒体(のユーザー率がPCやノートPCユーザー)以上に世間で増えたなぁ、と認識できる頃に、一気に一般的になったような気がします。ドロワー式は、使われ方No1のサイドバーメニューの表示/非表示という性質上、webページのメニュー表示に使われていた印象。



__📎備考２__
アコーディオン式の１種？に入るのかどうか、というのがhtmlの`<details>`タグ。Qiitaでもお馴染みの開/閉するやつ。装飾なしだと何とも味気ないがcssで装飾すればアコーディオン式みたいに装うことも可能。

:::note
`<details>`タグ
元の省スペース表示に戻すのに｢非表示だった領域内からの操作が出来ない｣という点で、個人的分類としては『単に開/閉モノかな』と。

用途が補足説明であることや、いやむしろそのためのタグ、というのを鑑みると単に“アコーディオン式”と分類するのは、ナンカチガウ気がする。
:::


以上です。
【HTML, CSS】CSS Tips

# CSS Tips
作ってみて、ナルホドと思った CSS Tips を書き溜める。

## プログレスバー

```:html
<div class="progress">
  <div class="progressBar"></div>
</div>
```

```:css
.progress {
  width: 100%;
  height: 20px;
  background-color: gray;
  border-radius: 15px;
}

.progressBar {
  width: 25%;
  height: 20px;
  background-color: red;
  border-radius: 15px;
}
```

#### できあがり :cooking:  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455342/f07716f0-597c-c627-240c-0c0b181dd875.png)

`.progressBar`の`width`の値を変えることで、プログレスバーの進捗度を変更できます。
また、styled-componentsを利用することで、動的にプログレスバーの進捗度が変更できます。

```:styled-components使用時
const Progress = styled.div`
  width: 100%;
  height: 20px;
  background-color: red;
  border-radius: 15px;
`
const ProgressBar = styled.div`
  width: ${props => props.progress}%;
  height: 20px;
  background-color: red;
  border-radius: 15px;
`
render (
  <Progress>
    <ProgressBar progress={25}></ProgressBar>
  </Progress>
);
```


## 要素に画像を重ねたいとき
何かの要素に画像を重ねたい場合、重ねたい画像自身またはその親要素に`position（static以外）`と`z-index`を指定すればOK

```:html
<div class="gazouBox">
  <img class="gazou" src="imgのパス" alt="medamayaki">
</div>
<div class="kasanetaiYoso">
　  <p>ここに重ねたい</p>
</div>
```

```:css
.gazou {
  position: relative;
  z-index: 1;
  margin: 0 auto -25px;
}
```

#### できあがり :cooking: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455342/0ba4c650-dbb3-dc9e-3c27-31192eb3827e.png)


## Comming Soon
Markdown記法の数字の箇条書きで空行を間に入れる方法

## やりたいこと
``` これを.txt
1. りんご
2. ごりら
3. らっこ
```

``` こうしたい.txt
1. りんご

2. ごりら

3. らっこ
```

## やりかた
``` 全角スペースを入れる.txt
1. りんご
[ ]<-ここに全角スペースを入れる
2. ごりら
[ ]<-ここに全角スペースを入れる
3. らっこ
```

## 実際にやってみる
#### 全角スペースを入れるとこんな感じ
1. りんご
　
2. ごりら
　
3. らっこ



#### 全角スペースがないとこんな感じ
1. りんご
2. ごりら
3. らっこ
借金3000万の男が目指す最強エンジニアへの道

# 初めに
いきなり物騒なタイトルからはじまりましたが、今年の3月に両親のためにマンションを購入しました。転勤族でありずっと会社の社宅に住んでいた我が家にとっては人生初となる**家**ができました。1年前から準備しており初めてのマイホームにうきうきだった我が家は内装や家具などにかなり凝ってしまいました。

3月は昇進のタイミングも重なっており、かなり成果を出したと上司にも言われていたので間違いなく昇進して給料が上がると思っていました...

が、まさかの過去最低の評価に...**家買ってしまったけど**、どうしよう？
不幸というのは重なるものです。案件が終了して次に行こうと思っていたら4月から現在までまさかの待機です。いわゆる社内ニートです。

**家売ろうかしら**

# 私について
私立文系大学を卒業した後全くの未経験でWeb制作会社に入社しました。現在ものそこでコーダー、フロントエンドエンジニアとして働いています。HTML、CSS、JavaScriptなどを使用してWebサイトの制作を行なっています。JavaScriptもWebサイトで使う機能実装程度、マークアップ言語以外はからっきしです。

# スクール加入で大失敗
４ヶ月ほどサブスク型のプログラミングスクールでReactを学んでいたました。ただ成果は実感できませんでした。お金だけが毎月消えていき気がつけば、お金が無駄にならないように勉強しているだけになっていました。本来なら自分のなりたい姿になるためにやるはずの勉強がこなすだけのものになっていました。そんな時出会ったのが**渡邉 臣**さんの記事でした。

やっと気がつきました、自分に足りないのはこれだと！
（決して私が加入していたスクールは悪くありません、私の勉強方法が間違っていただけです。）


# なぜ勉強するのか？
前述の通りお金が必要というのはもちろんです。大学生の頃から両親に家を買うことは私の人生の目標でした。それをお金が理由で手放すことは絶対にできません。もっとスキルをつけて稼げるようになれば良いのですから。
また、私がこのITの世界に飛び込んだ大きな理由の一つが自分でサービスを作りたいからです。**私がどんな時に頑張れるのか?それは自分のため以上に誰かのためになると思っている時です**。きっと良いものを皆さんに届けます。そのための一歩としてReactを学びたいと思っていいます。

# 何を目指すのか
* 短期
まずはReactの学習を楽しむこと
* 中期
自分の作りたい、やりたいを形にすること
* 長期
エンジニアとしてのキャリアップ、お金や自由を手にすること

昨日の自分より1ミリでも成長します。応援よろしくお願いします。
OIDCを使うには

　こちらのGtiHub Docsが英語しかないため、OIDCを使用するメリットとはなにか？に関わる部分のみ短く抜粋していきます。

 https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#configuring-the-oidc-trust-with-the-cloud


## 下記のGitHubDocsの図を解説

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045261/76f8c233-b720-aa92-857a-4b89bdc15192.png)

1. みなさんが使っているクラウドプロバイダ(AWSなど)にて、クラウドロールとGitHub workflowの間でOIDC trustを作成します。GitHub workflowがクラウドにアクセスするためには、このOIDC trustが必須となります。
　
2. ジョブが実行される度にGitHubのOIDCプロバイダは自動でOIDCトークンを発行します。このトークンは認証中の特定のworkflowの認証可能なidやセキュリティを強化する情報が複数含まれています。
　
3. GitHubのOIDCプロバイダからのトークンをリクエストする際、ステップやアクションをジョブの中に含めることが可能であり、これをクラウドプロバイダに提示することもできます。
　
4. 一度クラウドプロバイダがトークンにて示された情報の認証に成功すると、クラウドが短時間のみ有効なアクセストークンを発行します。このトークンはジョブ実行中のみ利用可能です。
.next()と.nextLine()の違いと、初心者向けのScannerの解説

色々なサイトで説明されていますがイマイチ核心を掴めていない両者の違いを自分なりに確認していきます。
まずは、両者のメソッドを確認。

## .next()とは
　Scannerで取得した値を文字列として受け取る。受け取る範囲は空白まで。
例：「aaaa bbbb ccccc」と入力された場合は「aaaa」のみ取得される。

## .nextLine()とは
　Scannerで取得した値を文字列として受け取る。受け取る範囲は改行まで。
例：「aaaa bbbb ccccc」と入力された場合は「aaaa bbbb ccccc」まで取得される。

### 実際のコードと出力結果の例
▼コード
```
import java.util.Scanner;

public class ScannerNextMethod {
  public static void main(String[] args) {
    Scanner scNext = new Scanner(System.in);
    String a = scNext.next();
    System.out.println(a);

    Scanner scNextLine = new Scanner(System.in);
    String b = scNextLine.nextLine();
    System.out.println(b);

    scNext.close();
    scNextLine.close();
  }
}
```
▼出力結果
```
aaaa bbbb cccc
aaaa
aaaa bbbb cccc
aaaa bbbb cccc
```

想定通り、next();のときは空白までの「aaaa」のみ、nextLine();のときは改行までの「aaaa bbbb cccc」全てが出力されています。
※ちなみに、「scNext.close();」「scNextLine.close();」を最後に書いていますが、こちらはどちらか1つのみでOKです。今回はVSCodeの「Scannerが閉じられていません」の警告を回避するために念の為、両方とも記載しています。（黃波線が気になるので…）

実際にコードを動かしてみると、両者の違いについて明確に確認できますね！

### 詳細説明
では、上記のコードがどういう流れで進んでいるのか確認していきます。
```
import java.util.Scanner;
```
こちらはScannerクラスを使うときの決まりですね。Scannerに限らず、java.langパッケージ以外のクラスを使用するときは、適切なものをimportして使う必要があります。
```
 Scanner scNext = new Scanner(System.in);
```
この1文で下記の処理が行われています。
1. Scanner型の変数scNextを宣言
2. ユーザーが入力したものを全てスキャン（読み取り）
3. スキャンしたものを**全て**変数に入れる（※ 正確な動作は少し違いますが、この認識でも大丈夫かと思います）

上記コードの場合、scNextには「aaaa bbbb cccc」が入ります。
```
String a = scNext.next();
```
1. String型の変数aを宣言
2. scNextに入れた要素を、指定の区切り文字（next();のときは空白、nextLine();のときは改行）で分割して変数aに入れる

上記コードの場合
  「変数a」には「aaaa（1つの要素）」が
  「変数b」には「aaaa bbbb cccc(ここまでで1つの要素)」が入ります。
  ```
  System.out.println(a);
  ```
変数aを画面に出力して結果を得ます。

## next();とnextLine();を混合で使ってみる
サンプルのコードを以下のように書き換えて、両者のコードについてさらに理解を深めていきたいと思います。
なお、コメントアウトしている部分（//で始める行）については、一旦無視してください。
▼コード
```
import java.util.Scanner;

public class ScannerNextMethod {
  public static void main(String[] args) {
    Scanner scNext = new Scanner(System.in);
    String a = scNext.next();
    String c = scNext.next();
    String d = scNext.nextLine();

    System.out.println("a:" + a);
    System.out.println("c:" + c);
    System.out.println("d:" + d);

    Scanner scNextLine = new Scanner(System.in);
    String b = scNextLine.nextLine();
    // String e = scNextLine.next();
    System.out.println("b:" + b);
    // System.out.println("e:" + e);

    scNext.close();
    scNextLine.close();
  }
}
```
▼出力結果
aaaa bbbb cccc
a:aaaa
c:bbbb
d: cccc
aaaa bbbb cccc
aaaa bbbb
b:aaaa bbbb cccc
### 説明
不要かもしれませんが、念のため解説をします。
```
 Scanner scNext = new Scanner(System.in);
```
 入力された内容を全てスキャンして、変数scNextへ入れます。
```
String a = scNext.next();
```
空白までの1つの要素を、変数aへ入れます。
```
String c = scNext.next();
```
空白までの1つの要素を、変数cへ入れます。
```
String d = scNext.nextLine();
```
**改行まで**の1つの要素を、変数dへ入れます。変数cまでで、「bbbb」が参照済みのため、「bbbb」の後ろの半角スペースから改行までの要素が全て入ります。

## 終わり
長くなってきたので、今回は以上とさせていただきます！
コメントアウトしている部分の動きについては次回、確認していきます！
【VSCode】commitlintのエラーをエディタに表示する方法

以下の方法でcommitlintのエラーをエディタに表示できます。

vscode-commitlintという拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=joshbolduc.commitlint

すでにプロジェクトでcommitlintを使用している場合には拡張機能のインストールのみでエラーが表示されます。

![スクリーンショット 2024-07-18 23.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/578e76ea-81dc-20cf-3d3c-c709b3492d11.png)

ソース管理の入力欄でもエラーが表示されます。

![スクリーンショット 2024-07-18 23.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5e73d9da-5ca5-3fe7-f42e-0e34258f4b58.png)

v2.6.0を使用していてエラーが表示されない場合にはv2.5.1を使用してみてください。

また、commitlintがインストールされていない場合には`settings.json`に以下のようにルールを記述することでエラーが表示されるようになります。

```settings.json
{
  "commitlint.config.extend.rules": {
    "body-leading-blank": [1, "always"],
    "body-max-line-length": [2, "always", 100],
    "footer-leading-blank": [1, "always"],
    "footer-max-line-length": [2, "always", 100],
    "header-max-length": [2, "always", 50],
    "scope-case": [2, "always", "lower-case"],
    "subject-case": [2, "never", ["sentence-case", "start-case", "pascal-case", "upper-case"]],
    "subject-empty": [2, "never"],
    "subject-full-stop": [2, "never", "."],
    "type-case": [2, "always", "lower-case"],
    "type-empty": [2, "never"],
    "type-enum": [
      2,
      "always",
      ["feat", "fix", "docs", "perf", "refactor", "build", "ci", "revert", "style", "test", "chore"]
    ]
  }
}
```
投稿 18 共通鍵暗号　公開鍵暗号 2024/07/18

本日の勉強時間　6H

共通鍵暗号方式で相手ごとに秘密の通信を行う際、通信相手の数が増えるほど、鍵管理の手間は増える。

共通鍵暗号方式では、送信者、受信者で同じ鍵を使う。

公開鍵暗号方式で公開されるのは秘密鍵。複合鍵は公開されない。

署名に用いるのは秘密鍵。
秘密鍵を公開すると、誰でも署名できてしまうことになる。
react-queryでreactの状態管理

## react-queryで状態管理は十分ですか？

プロジェクトで状態管理ツールは使用せず、react-queryだけで状態管理は不十分だと思っていろんな方法を探しました。apiが更新されても、画面ではリロードしない場合に画面が更新されなかったからです。

zustandでストアを作ろうか、useStateやuseEffectを使って仮想ドームを操作しようか調べました。
でも、動いているプロジェクトに新しい機能変更は難しいと思い色々調べた結果、

react-queryのinvalidateQueriesって言うことを使うようにしました。
上の関数を使えば自動的に現在のデータを再フェッチできます。


## 現在フロントエンジニアとして一番困っていること
データの扱いとバックエンドとのやり取りです。
今までのフロントの作業って画面の実行やバックエンドからもらうデータの表示が主な仕事でした。
バックエンドから４００エラーを返す時とかCORSエラーになる時は今だにどこを見れば修正できるかが微妙です。
その上、フロントで管理しなきゃならないデータも扱いまで色々勉強するものがいっぱいですが、なんとなくやっています。
毎日記事を書いて見た感想

質はともかく量、という言葉をもとに40日間、ほぼ毎日Qiitaに記事を投稿してきました。その感想を書いてみようと思います。

## そもそも書きたかった
なぜはじめたのかは、いくつか理由があります。
まず、そもそも何かしらの記事を書きたかった、というのがあります。QiitaでもZennでもnoteでも個人ブログでもなんでも良いのですが、なにか記事を書きたいという欲求がありました。
しかしながら、忙しくて詳しく書く暇がとれないな、ちゃんと書けないな、という気持ちもあり、中々手が出せませんでした。
また、仕事でやっている内容があまりにニッチでクローズドなので記事にできることも少なく、ネタも多くないのでどうしようかな、というのもありました。

そんなときに、以前記事にしたように、本田選手の考えに触れる機会があり、まぁともかくやってみよう、ということで初めてみました。
https://qiita.com/moonWalf/items/feb7c7bbe09c6be0c056

## 継続するのはかなり難しかった

大きく２つの理由から、継続するのが難しい場面がありました。

### ネタ不足
ひとつは、ネタ不足です。
これはもう、クローズドでニッチな環境にいる以上、どうしようもありませんでした。オープンにできるネタも少なかった。
そこで、ちょっと気になっていた言語を試して見たり、ニッチだけど出せるものを書いて見たり、どうしてもネタがない時は経験談ポエムを書いたり。
「質」は諦めて、どうにか続けることにフォーカスすることで、ネタが不足しても続けることができました。

### 体調不良
ふたつめは、体調です。
これはもう、そのままの意味で、ここ１ヶ月ほど体調を崩し気味だったので、書くのがシンドイ日が続いていました。こういう日はもう、薄い記事になっても仕方ないと割り切り、少量でもいいから書いたからよし、としていました。

## モチベーションはどうにかなった
案外とどうにかなったのが、モチベーションでした。飽きっぽい性格なのですぐに飽きるかなと思っていたのですが、ちょうどQiita Engineer Festa 2024をやっていたタイミングでもあり、最後まで落ちることなく続けることができました。

## よかったこと
ネタがなかったぶん、興味があったけど手を出さなかった技術に手をだすことができました。PKlは本当にそうで、気にはなっていたけど...という技術だったので、確認できてとても良かったです。

## 悪かったこと
疲れました。そのぐらいです。

## 記事を書くのはおすすめ
記事を書くのは本当におすすめです。毎日である必要はないと思いますが、定期的に自分の技術の棚卸しになったり、気になった技術を調べて見たり、仕事で使わない技術を使って見たり、そういう自分の技術の幅を広げるのに良い方法です。

毎日記事を書く、というのは一旦終わりにしようと思います。
でも、できる限り定期的に記事を書いていきたいなぁと思います。
Tableauのクロス集計表をExcelで別名を付与して出力する(エクスポートする)方法

はじめに
--
Tableauでクロス表に別名を付けた後にエクスポートを行う際、
名称が変わってしまう事象の原因と解消方法について説明します。
※Tableauのバージョンは2023.3、データは[サンプル - スーパーストア]のデータを使用しています。

・事象内容
--
①Tableauのクロス表で別名を付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/fd1d9b7c-7bf0-0e80-f78e-fafcb4be9b6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/ded9357c-c60f-9602-0e97-fb9181e9f68d.png)

②その後エクスポートで出力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/3a8cf855-09f2-dab3-f3ce-b7ac8c197e5b.png)

③エクスポートしたファイルで名称が変わっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/69170cee-6aac-44cd-f7a6-c6dc4c2f6db2.png)



この事象はTableauDesktopだけでなく、
TableauServerへパブリッシュした後でも発生します。

こちらの記事はこの事象を解消するための内容になります。

・事象の原因
--
下記の記事で原因について記載があります。

https://kb.tableau.com/articles/issue/exporting-crosstab-to-excel-doesn-t-retain-column-alias-for-table-calculations-while-using-color-marks?lang=ja-jp

・内容要約
表計算を使用していて、かつ[色]マークを使用している場合、
エクスポートされたファイルに列の別名が保持されない。

[色]マークとはTableauDesktopのこの部分のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/90836545-1b12-9732-aa95-feaab01f185d.png)

解消方法
--
解消までの道筋をYES,NO方式のフローにしました。
内容を確認し、事象解消方法を確認ください。

★Q1
・[色]マークを[メジャー ネーム] から削除して問題ないか
　YES⇒解消方法１
  　NO ⇒Q2へ

★Q2
・エクスポート時に名称が変わるフィールドについて既定の表計算が表示されているか　
　YES⇒解消方法２
　NO ⇒解消方法３

※既定の表計算の表示がされている例(赤枠部)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/e13f997b-ccea-3ffd-41d6-fabbde4b8c24.png)




・解消方法１
--
[色] マークから [メジャー ネーム] を削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/afafbe79-babf-aa12-e29d-b2454c475bb8.png)


・解消方法２
--
①事象の発生するワークブックを一度閉じて、再度開く　
②メジャーバリューカードからフィールドを全て削除　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/1f7b01fd-c39c-4c49-3d5b-548c083c9c2c.png)


③表計算を使用する計算式で、表計算の既定設定を絶対方向指定で設定
　絶対方向指定とはTableauで自動的に設定される「表(横)に沿って～」等ではなく
　任意の計算方向を指定することです。
 　ここでは行に配置しているオーダー日を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/523214e6-aab0-b489-9f3c-2236379ed54a.png)


　(※注１)③の方向の指定で指定するフィールドは、指定したい方向により異なります。
　　　 例では行方向へ計算したいため行に配置しているオーダー日を選択しています。

④メジャーバリューカードに③を再配置　
※解消しない場合は再度別名を付けることで解消可能です。

　(※注２)再配置後にエラーが出る場合があります。
　　　この場合方向の指定の設定がうまく反映されていないので、下図操作を行います。
　　　なお、例では行方向へ計算したいため行に配置している
    　　　「出荷日の年」、「出荷日の月」、「出荷日の日」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/e931b572-2713-36ef-b692-9e833386b9de.png)


・解消方法３
--
①事象の発生するワークブックを一度閉じて、再度開く
②メジャーバリューカードから既定の表計算が表示されないフィールドを削除(それ以外のものは残す)
③②のフィールドで計算に使用するフィールドに対して、表計算を使用する計算式で、表計算の既定設定を絶対方向指定で設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3671775/e931b572-2713-36ef-b692-9e833386b9de.png)
　(※注１)③の方向の指定で指定するフィールドは、指定したい方向により異なります。
　　　 例では行方向へ計算したいため行に配置している
    　　　「出荷日の年」、「出荷日の月」、「出荷日の日」を選択します。

④メジャーバリューカードに②を再配置

終わりに
--
Tableauでの表示がうまくいかないケースの一つについて解消方法を記載しました。
今後もTableau含むBIツールの問題解決の一助となるような記事を作成していこうと思います。
TypstでPDFのファイルサイズが大きくなりすぎる問題

# はじめに
~~メモ書き程度のクオリティですが時間があればちゃんとした体裁にします~~

# Typst 0.12でかなり改善されました。

組版時に使用していないフォントデータを外して処理してくれるようになったのでCJKフォントを使用してもPDFのサイズを抑えられるようになりました...

これでわざわざCJKではなくjpだけのotfファイルを入れなくて済む......(地味にフォントファイルを認識させるのが面倒だった)

# PDF周りの強化はほかにも
長期保存に適応したPDF/A規格にも対応し（web版だけらしいので今後のアプデに期待）ますます利用できる場面が増えてうれしい限りです。細かいことをA-2b規格らしく、柔軟性と堅牢さの中間をとった形式です。

# やっぱり時代はTypstかもしれない
バージョンを見てわかる通りTypstは発展途上ではあるものの、今の時点で普段のレポートや論文執筆にはLaTeXとなんら遜色ない完成度になっています。

環境構築も記法もLaTeXに比べてはるかに使いやすいのでさらに広まることでしょう。ほんと広まってほしい。

なんならスライド作製もできるので、marpより少し込み入ったことがしたい場合htmlをいちいち書くよりTypstにした方がよいのかもしれないですね(~~パワポでいいじゃんと言われたら何も反論できない~~)
Salesforce認定Platformアプリケーションビルダー受験 レポート

Salesforceの認定アプリケーションビルダー試験に合格したので、そのレポートを書きました。

## 勉強法
知識0からのスタートだったため、まずはSalesforceに慣れることが最優先課題でした。

[１．図解入門 よくわかる 最新 Salesforceの導入と運用](https://www.amazon.co.jp/dp/4798061840?tag=yomeru-22&linkCode=ogi&th=1&psc=1 "タイトル")

Salesforceの初心者向けの本で、最低限の機能や用語の知識は得られます。各機能の画面キャプチャも載っているので雰囲気もつかめます。

後述のTrailheadでの実機学習へスムーズに入れる人にとっては不要かもしれません。私のように少し抵抗がある人は繋ぎとして本書を利用するのも一案かと思います。

[２．Trailhead 【Salesforce公式】認定 Platform アプリケーションビルダー資格](https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/prepare-for-your-salesforce-platform-app-builder)

試験対策のモジュールに沿って、実機を操作しながら学習を行っていきます。

初期は文章量の多さと邦訳特有の癖のある文体に戸惑い、本文内の指示通りに操作をすることだけで精一杯で、単元終わってみたら何も知識が身についていなかったということがありました。
そのため各モジュールの最終目的・成果物は何であるかを意識して臨むことを常に心掛けました。

また後述の問題集を解いて自分の弱点だと思った単元に関しては、Trailmix掲載以外のモジュールまで少し手を伸ばしました。

## 問題集
[１．TysonBlog](https://tysonblog-whitelabel.com/salesforce-app-builder-practice1)　215問

こちらのブログがなければ試験合格はなかったと言い切れるほど重宝しました。
他のWEB問題集に比べて解説が丁寧で、複雑な設問に対しては解答内容の実機での再現手順まで載せてくれています。

5週ほど繰り返し学習し、反射的に解答できるまで読み込みました。問題を解いた後Trailheadに戻って復習するとより知識が定着できました。


[２．無料Platform-App-Builder-JPN試験問題集](https://www.jpnshiken.com/exam/Platform-App-Builder-JPN-salesforce-certified-platform-app-builder-platform-app-builder%e6%97%a5%e6%9c%ac%e8%aa%9e%e7%89%88-11647.html)

実際の試験でほぼそのまま出題された問題も多数掲載されており、こちらの問題集も繰り返し解きました。
たまに解答が怪しい問題があるのでそのまま鵜呑みにするのは危険です。少し古いバージョンだとコメントで誤りを指摘して下さっている方がおりました。

## 受験結果と感想

試験は全60問を105分で解きますが、50分ほどで見直しまで完了しました。
各セクション毎の想定得点は下記の通り。

※単元ごとの問題数と結果得点は公表されないため、結果は計算により求めた想定値となります。

|セクション| 配点(%) | 問題数(想定) | 得点数(想定)|
|:-|:-:|:-:|:-:|
|SALESFORCEの基本   | 23  | 14  | 12  |
|データモデリングおよび管理   | 22  |  13 | 10 |
| ビジネスロジックとプロセスの自動化  | 28  |17   | 13  |
| ユーザインターフェース  |  17 |10   |  7 |
| アプリケーションのリリース | 10  | 6 | 4  |
|  (合計) |  100 | 60  |  46 |

## 終わりに
学習期間は約2か月弱。
Trailheadに慣れるまでが大変でしたが、軌道に乗ってからは順調に学習できたと思います。Trailheadを100%終わらせてからではなく、ある程度進んだら問題集と並行して進めていくスタイルが自分には合っていました。

下期のSalesforce認定Platformデベロッパー取得に向けて、また学習を始めていきます。