OmniAICreator/Qiita-1.07M huggingface dataset:
【VBS】浮動小数点の剰余

# はじめに
これは、[Visual Basic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/vb)の6日目の記事となります。

先月ネタ探しに、Yahooリアルタイム検索でVisual Basic関連で検索していた時に、下記のサイトを見つけました。

https://blog.soln-sns.net/how-to-solve-the-vbscript-mod-bug-problem/

# 現象
```vb
If ((3091470 - 714643) * 0.2 * 62) mod 365 = 0 Then
    Call MsgBox("割り切れる")
Else
    Call MsgBox("割り切れない")
End If
```

>上記のプログラム “sample-mod-bug1.vbs” を Windows PC に保存して実行すると「割り切れる」とメッセージが表示されます。
>
>実際に… ((3091470 – 714643) * 0.2 * 62) ÷ 365 を計算すると、答えは 807,469.995 になります。従って、剰余は 0 ではないので「割り切れない」と表示されるべきです、、

# 原因
これは不具合ではなく、Classic Visual Basic系（VBScript、VBA、Visual Basic 6.0）では整数に対する剰余しか対応していないという仕様でした。その為、VB.NETではこの不具合は発生しません。

>解説
>剰余演算子は、number1 を number2 で割って (浮動小数点数は整数に四捨五入されます)、その余りのみを result として返します。
>A = 19 Mod 6.7 ' Returns 5.
>MyResult = 12.6 Mod 5    ' Returns 3.
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/mod-operator
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-basic-6/aa242823(v=vs.60)?redirectedfrom=MSDN

((3091470 – 714643) * 0.2 * 62) = 29472654.8 は整数に四捨五入され 29472655 となります。 
29472655だと365で割り切れるため剰余も0となり、「割り切れる」というメッセージとなります。

```
29472655 Mod 365 = 0
29472655 / 365 = 807470
```

## 余談
ちなみにC言語では整数に対する剰余は`%`演算子で求められ、浮動小数点を指定するとコンパイルエラーになります。
浮動小数点数に対しては`fmod`関数を使用する必要があります。

.NET系では、Visual Basicは`Mod`演算子(C#は `%` 演算子)では、浮動小数点数の剰余に対応しています。

>サポートされている型
>すべての数値型。 これには、符号なしおよび浮動小数点の型と Decimal が含まれます。
>https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/operators/mod-operator


# 対応
Mod 演算子は使用しないで`fmod`関数を作成する。

```vb
If fmod((3091470 - 714643) * 0.2 * 62, 365) = 0 Then
    Call MsgBox("割り切れる")
Else
    Call MsgBox("割り切れない")
End If

Function fmod(a,b)
    fmod = a - b * Int(a / b)
End Function
```

VBAのMod演算子とExcelのサポートしているMod数式の計算結果は異なる。
参照：[剰余の計算でMod演算子とMod数式の結果が違う - Excel VBAコーディング ガイドライン案](https://qiita.com/mima_ita/items/8b0eec3b5a81f168822d#%E5%89%B0%E4%BD%99%E3%81%AE%E8%A8%88%E7%AE%97%E3%81%A7mod%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%A8mod%E6%95%B0%E5%BC%8F%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E9%81%95%E3%81%86)

# 最後に
以前、端数処理でExcelで計算した結果と違うので不具合ではないかとユーザーから確認があったことを思い出しました。ユーザーはExcelを使用していることが多いので、Excelの数式とプログラム言語での結果が違うというのは困り物ですね。

https://qiita.com/yaju/items/6c90e600f9ca7fb30eef
SnowflakeからBigQueryにデータを移動する

# この記事は何？

[BigQuery Advent Calendar 2021](https://qiita.com/advent-calendar/2021/bigquery) の5日目の記事です。
普段使ってるBigQueryとSnowflakeでデータを移動させる方法のうち、Snowflake => BigQuery の回です。

# 全体の流れ

全体の流れはシンプルです。

1. バケット準備：GCPでGCSにバケットとデータを置くパスを切っておきます
1. ストレージ統合作成：Snowflakeでストレージ統合を作ります
1. IAMロール作成：GCP上でIAMロールを作ってパーミッションを与えます
1. IAMロール割当：Snowflakeのストレージ統合で作られたサービスアカウントにIAMロールを割り当てます
1. Snowflakeからアンドロード：Snowflakeから `COPY INTO <場所>` を使って、GCSにデータをアンロードします
1. BigQueryで読み込み：BigQueryでGCSの該当パスを外部テーブルに指定して、SELECTします
1. 完了

どうでしょうかんたんでしょ？
しかも一度ストレージ統合を作ってしまえば、配下のパスに好きにデータをアンロードできるので、BigQueryでも読ませ放題ですね。

# バケット準備

特に言うことはありませんが、バケットとパスを作りましょう。
[このあたり](https://cloud.google.com/storage/docs/creating-buckets?hl=ja)を読んで好きな方法で作成しましょう。

# ストレージ統合作成

Snowflakeへログインして、ストレージ統合を作りましょう。
[ドキュメントはこちら](https://docs.snowflake.com/ja/user-guide/data-load-gcs-config.html#step-1-create-a-cloud-storage-integration-in-snowflake)です

使うSQLはこんな感じです。

```SQL
CREATE STORAGE INTEGRATION gcs_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = GCS
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://hogehogehoge/from-snowflake/')
;
```
ストレージ統合ができたら、 `DESC STORAGE INTEGRATION` で割り当てられた、サービスアカウントを確認しておきましょう。
`STORAGE_GCP_SERVICE_ACCOUNT` のところに書かれています。

# IAMロール作成：

次にGCSにアクセスできるようにIAMロールを作成します。
必要な権限は下記になります。

- storage.buckets.get
- storage.objects.create
- storage.objects.delete
- storage.objects.get
- storage.objects.list

GCPのIAMの管理画面からポチポチ作成しましょう。

詳細は[このあたりの手順](https://docs.snowflake.com/ja/user-guide/data-load-gcs-config.html#creating-a-custom-iam-role)を参考にしてください。

# IAMロール割当

次はストレージ統合で割り当てられたサービスアカウントに、今作ったIAMロールを割り当てます。
作業は引き続きGCPのIAMの管理画面からポチポチで行えるはずです。
詳細は[このあたりの手順](https://docs.snowflake.com/ja/user-guide/data-load-gcs-config.html#assigning-the-custom-role-to-the-cloud-storage-service-account)を参考にしてください。


# Snowflakeからアンドロード

次はついにSnowflakeからデータをアンロードします。
データのアンロードには `COPY INTO <場所>` を使います。
このとき `<場所>` には `gcs://バケット名/パス名/` を指定します。

オプションを含めて指定すると下記のようなSQLになります。

```SQL
copy into 'gcs://mybucket/unload/'
  from <テーブル名やSELECT文>
  storage_integration = <ストレージ統合名>;
```

メチャクチャ簡単ですね。

# BigQueryで読み込み

最後はBigQueryで外部テーブルとして読み込んだら完了です。

[このあたりの手順](https://cloud.google.com/bigquery/external-data-cloud-storage?hl=ja)を参考に作ってみましょう。


# 最後に

だいたい慣れてくると10分くらいで作業できるようになります。
これでお客様に**「SnowflakeのこのデータをBigQueryに読み込ませてほしいんですが、どれくらいかかりますか？」を「10分！！！」と答えられる**ようになりますね！

ちなみに、GCSにデータを置きっぱなしにすれば、Snowflakeからも外部テーブルとしてクエリできるようになっていますので、捗るかもしれません。
また、アンロードする時にHive形式のパーティションに則ったパスでアンロードすれば、BigQuery側もパーティションとして読み取れるので効率が良さそうです。

ちなみにGCSはアップロードが無料だったと思うので、費用的にはアンロードにかかったSnowflakeのウェアハウス消費クレジットと、AWSからGCSへのアウトバウンドの通信費だけです。
お安そうですね。
wsl2でssh-agentを利用するときに沼ったので供養

# 背景
dockerで立てたコンテナにVSCodeのリモート接続で入ったときにローカルのgitの情報で
そのままgithub等に接続しようとしたがうまくいかなかった
https://code.visualstudio.com/docs/remote/containers#_sharing-git-credentials-with-your-container
ここを参考にしたがちょっとした勘違いをしてうまくいかなかったので備忘録として記載

# 環境
windows10
wsl2

# 解決
[ここ](https://code.visualstudio.com/docs/remote/containers#_sharing-git-credentials-with-your-container)だと

```
eval "$(ssh-agent -s)"
```
した後に

```
if [ -z "$SSH_AUTH_SOCK" ]; then
   # Check for a currently running instance of the agent
   RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
   if [ "$RUNNING_AGENT" = "0" ]; then
        # Launch a new instance of the agent
        ssh-agent -s &> $HOME/.ssh/ssh-agent
   fi
   eval `cat $HOME/.ssh/ssh-agent`
fi
```
と~/.bash_profileに書くと書かれているが
一度`eval "$(ssh-agent -s)"`でssh-agentを起動した後`$HOME/.ssh/ssh-agent`が作成されておらず、`eval`の部分
で正しく表示されていなかった
さらにそれに気づかず何度もssh-agentを起動しており重複していた
よって
`ps -ax | grep 'ssh-agent -s' | grep -v grep`
ででてくるプロセスを全部killした後にシェルの再起動をすると~./bash_profileに記述した
ssh-agentが起動し、$HOME/.ssh/ssh-agentも無事作成される

# 余談
windows terminalにwsl2を追加してしようしていると
.bash_profileを読み込むと.bashrcが読み込まれず、シェルに色が付かなくなった
そこで.bash_profileの末尾に

```
if [[ -f ~/.bashrc ]] ; then
  . ~/.bashrc
fi
```
と記述すると.bash_profileを読み込んだ後に.bashrcを読み込んでくれた
[EKS] 起動しているpodの数とサブネットのIP消費が見合わない

# 起
ある日、運用しているEKSクラスタで、subnetのIPが足りなくてnodeが起動できないというエラーが出ました
クラスタのサブネットは/24なのでそれはまあ少なかったんですが、小規模なクラスタだったのでまあ問題にはならないと思っていました
実際クラスタ内で起動しているpodの数はどう見ても256には届いてない
ということで調査です

# 結
以下は、ポッドネットワーキングにamazon-vpc-cniを使っている前提です
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/pod-networking.html

podに割り振られるIPは、nodeのENIに割り当てられたセカンダリIPになっています
podがnodeのipを消費していくと、新しいENIをアタッチするようになっています
ENIとそれに割り当て可能なセカンダリIPの数はインスタンスタイプにより異なるのですが、デフォルトでは割と余裕を持って新しいENIを用意するようになっています
それで、デフォルトではENIがアタッチされると同時に最大数のセカンダリIPを確保します
（セカンダリIPの数についてはこちらを参照してください https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html )

つまり、podが起動していなくてもnodeが結構な数のIPを消費します
大きいインスタンスほどENIあたりのセカンダリIPの最大数が多いので。例えば大きいインスタンスにリソースを大量消費する少数のpodというようなクラスタ構成だと、使わないipが大量に確保されている状況になります
起動中のnodeがサブネットのipをすべて確保してしまうと、当然新しいnodeが起動できません

これが今回起動しているpodの数に見合わずipが枯渇していまった経緯でした

# 解
じゃあどうすればいいのかという話ですが、ENIの起動タイミングや確保するIPの数は設定が可能です
環境変数で設定します
（解説間違ってたらすいません、怪しいと思ったら元のドキュメントで https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/eni-and-ip-target.md ）

- WARM_ENI_TARGET
    - 確保しておくENIの数
    - デフォルトは1
    - たとえば1の場合、1つめのENIに割り当てられたセカンダリipがpodに使われると、次のENIをひとつ用意するということ（のはず）
        - なので、ほとんどの場合nodeが起動すると2つENIがアタッチされる
- WARM_IP_TARGET
    - podに消費されたipより余分に確保するipの数
    - デフォルトは0
    - 0の場合は、eniあたりの最大数を確保する（のはず）
- MINIMUM_IP_TARGET
    - nodeがipを確保する最低数
    - デフォルトは0

これらを設定してクラスタの用途といい感じに合わていくのですが、割と面倒な注意事項があって
`WARM_IP_TARGET` を0以外に設定すると、podを起動・削除するごとにセカンダリipが増減するので、podの出入りが激しいクラスタだとawsのapi制限にひっかかりやすいそうです

nodeあたりに配置されるpodの数が大体わかってる場合は`MINIMUM_IP_TARGET`を少し余裕を持って設定して、補助的に`WARM_IP_TARGET`を使用すれば使えなくはないかも？（当然デフォルトより消費ipが少なくできる場合）

正直使いにくいな、と思いました
確保したipが残りいくつになったら次のeniを用意する、みたいな設定があればよかったです

# で
私はこの設定を使いこなせる気がしないので、サブネットを大きくして終わりにしました :rolling_eyes:
【PyTorch】Anaconda にインストール

## 環境
+ Anaconda 4.10.3
+ Microsoft Windows 10.0.22000.318（21H2）
+ PowerShell 7.2.0

## 手順
### 1. 仮想環境の作成
（仮想環境を作らない場合はスキップ）
`conda create -n test python`を実行すると、仮想環境「test」が作成され、同時にpythonもインストールされる。（途中で`Proceed ([y]/n)? y`と出てきたら`y`と入力してEnterを押す。）

```powershell:記法
# 仮想環境を作成
conda create -n ENVNAME
# 仮想環境を作成＆pythonをインストール
conda create -n ENVNAME python
# 仮想環境を作成＆pythonをバージョンを指定してインストール
conda create -n ENVNAME python=X.X
# 仮想環境を作成＆pythonとnumpyをバージョンを指定してインストール
conda create -n ENVNAME python=X.X numpy=X.X
# 仮想環境を作成＆Anacondaにインストールされているすべてのライブラリをインストール
conda create -n ENVNAME  anaconda
```
`conda info -e`で作成されたかどうか確認

```powershell:実行例
(base) PS C:\Users\USERNAME> conda info -e
# conda environments:
#
base                  *  C:\Users\USERNAME\.pyenv\pyenv-win\versions\Anaconda3
test                     C:\Users\USERNAME\.pyenv\pyenv-win\versions\Anaconda3\envs\test
```
現在の環境には`*`がついている。この場合、現在の環境は「base」になっている。

### 2. 仮想環境の切り替え
（仮想環境を作らない場合はスキップ）
`conda activate test`で、test仮想環境に切り替える

```powershell:記法
# 仮想環境を起動する
conda activate ENVNAME
# ちなみに仮想環境を終了する場合は
conda deactivate
```
(base)の部分が(test)に変わる。また、`conda info -e`を実行すると、`*`の位置が変わっている。

```powershell:実行例
(base) PS C:\Users\USERNAME> conda activate test
(test) PS C:\Users\USERNAME> conda info -e
# conda environments:
#
base                     C:\Users\USERNAME\.pyenv\pyenv-win\versions\Anaconda3
test                  *  C:\Users\USERNAME\.pyenv\pyenv-win\versions\Anaconda3\envs\test
```

### 3. PyTorchのインストール
[公式サイト](https://pytorch.org/get-started/locally/)でコマンドをコピーして実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/f113d795-2075-522a-2994-9a31e64777eb.png)


```powershell
conda install pytorch torchvision torchaudio cpuonly -c pytorch
```
＊`PackagesNotFoundError...python=3.1`というエラーが出た場合は[こちら](https://qiita.com/probabilityhill/items/852a6b2d788e84be6004)を参考に

最後に、インストールされたことを確認する

```powershell
conda list
conda list -n ENVNAME # 仮想環境を指定する場合はこちら
```

### 4. 動作確認
```powershell
(test) PS C:\Users\USERNAME> python
Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> x = torch.rand(5,3)
>>> print(x)
tensor([[0.8759, 0.5712, 0.7837],
        [0.4928, 0.4360, 0.5360],
        [0.3955, 0.6482, 0.3982],
        [0.0737, 0.8370, 0.1629],
        [0.0994, 0.2063, 0.3786]])
```


## 参考

https://pytorch.org/get-started/locally/

https://qiita.com/ozaki_physics/items/985188feb92570e5b82d
似たプロフィールのFANZA女優を検索出来るようにした

この記事は [驚異のFANZA女優検索](https://fanza-actress-bust-search.azurewebsites.net/) Advent Calendar 2021 の 6 日目の記事です。

# 似たプロフィールのFANZA女優を検索出来るようにした
特定のFANZA女優から似たプロフィールのFANZA女優を検索出来るようにした。似たプロフィール女優検索は顔検索と違って専用のページは作らなかった。プロフィールを自分で打ち込むような専用ページを作ろうかとも思ったが、あまり使い勝手が良いイメージが出来なかったので止めた。代わりに女優のバストアップ画像がある所に、アイコンをつけてクリックすれば似たプロフィールで検索できるようにした。ついでに顔検索も同じ方法で出来るようにした（通常の顔検索と殆ど同じだが、若干UIが違う）

# 似ているとは？
似ている女優を検索できると書いたが、では似ているとは**何が**似ているか、自分もここが一番悩んだところだ。最初はそもそもこのサービスはバストを検索するために作ったのでバストが似ている女優を出すことにした。ただ、自分のサービスは5万人の女優がいるため、大体どのサイズであっても同じバストサイズの女優の数は結構ヒットする。似ている女優を何十人も出すつもりはなくTop10を出すぐらいの方が使い勝手も良いだろうと思った。そうなるとただバストサイズが同じ女優が登録順に10人並ぶだけなので、複数の要素を組み合わせる方が面白いと思った。そこでカップを加味した。バストもカップも同じ女優になるとさらに絞れる。バストとカップが同じ女優を似ているとして作ってみた。

# 似ていても完全に同じだとつまらない
自分的にはバストとカップが同じ女優が出るでも悪くない感じにはなった。ただ、バストとカップが完全に同じ女優だけ出るのは若干つまらない。というのも驚異のFANZA女優検索はバスト検索できるので、バストサイズが同じ女優は似たプロフィールとして検索しなくても分かっている状態だ。同じような結果にしかならないならわざわざこの検索を使う意味が薄い。で、ちょっと考えてみると例えばバスト100cmの女優で検索した場合にバスト80cmの女優がヒットしたらそれは恐らく望んでいないと思う。ただ、100cmで101cmや99cmの女優がヒットしてもなんら違和感はない。95cmぐらいでもありかもしれない。さらにカップでも1サイズ違う人も候補に入ればバスト検索とは違う結果になると思った。

# 検索にスコアをつけてみる
そこで検索結果にばらつきを持たすためスコアをつけてみることにした。つまり100cmの女優を検索した時に100cmに近いサイズであるほど高得点、カップも同じに近いほど高得点とする。さらに別の要素も足してみた。作品毎にジャンルがある。その女優がどのジャンルの作品が多いかを集計してそれを足してみた。スコアはバストやカップよりも若干下げている。ただ、バストもカップも少し違うけれど、ジャンルが近いことで上位に入ってくることがある。この**揺らぎ**で検索結果結構いい感じになった。やはりバストは揺れることに価値がある。

# 検索にデビューした日を足してみる
さらに近いの意味を強めるために年齢を入れたかったが、プロフィールに年齢が書いてある女優は結構少ないので、単体でデビューした日をパラメータに足してみた。これは大正解だった。何十年も続いているメディアは続いている期間全てを押さえている人はほぼいない。例えば歌手でも1990年代なら詳しいが、2000年代になるともう分からないとか、自分は2010年以降の曲しか聴いたことがないとかはわりと普通で、要はユーザーによってそのメディアにふれている期間には差がある。自分がよく見ていた期間の女優が多く検索結果に出た方が当然体感としては**近い**と感じやすい。デビューした日が加点されることになって、年代が古い女優で検索すると年代が古い女優がヒットしやすくなった。個人的な体感としては近いのレベルがさらに上がったと感じるぐらい良くなった。

#  似たプロフィールのFANZA女優検索
最終的にパラメータとしてバスト、カップ、ジャンル、デビュー日、誕生日を入れた。そこに自分なりの重みづけを足した。あと印象操作として顔写真がNo Imageの人がヒットすると何となくテンションが下がるような気が自分なりにしたので点数を下げた。既に作っている顔もパラメータに足すかと思ったが、顔検索は顔検索だけで成り立つもので、常に顔に目がいくようにんるとプロフィール検索としての価値が濁ると思ったので止めた。これで似た女優を検索してみたら、かなりいい感じに似た女優が検索できるようになった。

# スコア式の弊害
ただスコア式にした弊害もあって、どうしてもパフォーマンスが悪い。特にヒットする要素の幅を広くするほど遅くなる。+-3cmぐらいを対象にしているのと+-5cmを対象にするのでパフォーマンスは変わる。特にヒットする女優の数が多いサイズ程遅くなる。色々考えて調整などもしたみたが、今の所スコア式以上の結果にはつながっていない。パフォーマンスと結果を両立する別の方法が見つからない限り時現状はスコア式で行くことにした。

# プロフィール検索をする方法
プロフィール検索を作り始めたモチベーションは女優の詳細ページを見て、そこで誰か別の似たような女優が探せれば便利かと思ったからだ。だから理想は、女優のページに行ったら、画面の下の方に似た女優を10人表示するようにしたかった。しかしこれをやると女優の詳細ページに入る毎に検索してしまうので、パフォーマンスの問題があるうちはここに実装することは避けたい。今後パフォーマンスが改善すれば女優ページの下の方に似た女優として常に表示することも考えているが現状は顔写真のアイコンクリックだけにしている。自分的には良い感じだが、一度さわってみて本当に似ている女優が良い感じに出るか、他の人の感想を聞かせて欲しい。

# 追記
静的にプロフィール検索て結果をキャッシュすれば良いことに気づいたが、実装は後で。。。
Linux Mint の「wifi接続がすぐ切れる」トラブルの解決方法

# はじめに
この記事ではトラブルの原因については考察しない。
おそらく現在多くの人に起こっている「wifi接続が切れる」トラブルが解決に至るまでにしたことを、ただ書き連ねる。
そのため、ひとつの手法のみで解決したのか、それとも複合的な要因で解決したのかまでは分からないことに留意してほしい。

## Linux Mintのバージョン
```bash:LinuxMintのOSバージョン
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 20.2
Release:	20.2
Codename:	uma
```

# 方法①：IPv6を停止する

まず、ネットで調べると最初に「IPv6を停止すると直った」と出る。
そこで、以下の方法でIPv6を停止させた。

まず、`/etc/default/grub`を編集してIPv6を停止する。
開くと`GRUB_CMDLINE_LINUX=""`という行が見つかるので、そこに`ipv6.disable=1`という文字列を追記する。

```grub:/etc/default/grub
# GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="ipv6.disable=1"
```

次に、 `sudo update-grub`を実行する。

```bash:
$ sudo update-grub
```

すると`ip -6 a`と入力しても何も出力されない。

```bash:
$ ip -6 a
```

もし戻したいなら、`/etc/default/grub`を元に戻せばいい。

# 方法②：wifiの省電力モードを無効化する
しかし、これで問題は解決しなかったのでさらに調べると、今度は「wifiの省電力モードが原因」と出た。
そこで以下の方法で省電力モードを無効化した。
`/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf`の`wifi.powersave = 3`を2にした。

```conf:/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf
[connection]
#wifi.powersave = 3
wifi.powersave = 2
```

# まとめ

以上の方法でwifiは切れなくなりました。
ただ、1時間近く作業していると突然切れてまた接続されることもあり、不安定なことに変わりはないように思えます。
Linux MInt側での根本的解決を望みます。



###### 参考サイト
- [Ubuntuの「IPv6」を無効にする方法＆有効に戻す方法 | LFI](https://linuxfan.info/ubuntu-on-off-ipv6)
- [ブルー弐拾壱: Linux Mint 20.1 でwi-fi 接続が切れまくる](https://blue21neo.blogspot.com/2021/07/linux-mint-201-wi-fi.html?m=1)
自分的よく使うffmpegコマンド集

![Untitled (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/5c882cfd-d994-5424-ee69-754cb7737d4c.png)

自分的によく使うffmpegコマンドを備忘的にかいていきます(随時更新予定)

# 画像系

## フレーム毎の切り出し

```bash
ffmpeg -i "input.mp4" -s 120x68 -filter:v fps=fps=29.97:round=down -y "outputs/%06d.jpg" 2>&1
```

## 指定フレームサムネイル切り出し

```bash
ffmpeg -hide_banner -ss 00:00:04.945668 -i "input.mp4" -vf scale=-1:540 -vframes 1 -f image2 -y "output.png" 2>&1
```

# オーディオ系

## オーディオトラックの合成

```bash
ffmpeg -y -i 'video.mp4'  -i 'audio1.wav' -i 'audio2.wav' -i '.audio3.wav' -map 0:v:0  -map 1:0 -map 2:0 -map 3:0 output.mp4
```

## オーディオトラックの抽出

```bash
ffmpeg -y -i 'input.mp4' -map 0:1 -vn -acodec copy audio001.m4a -map 0:2 -vn -acodec copy audio002.m4a -map 0:3 -vn -acodec copy audio003.m4a
```

map オプションの：の後ろに？をつける `o:2?`とオーディオトラックがない場合にエラー停止せずに実行する(→ない場合、先頭のオーディオトラックが抽出される)

## オーディオトラックを選択して保存

```bash
ffmpeg -i input.mp4 -map 0:0 -map 0:1 -c:v copy -c:a copy output.mp4
```

# 変換系

## mp4 → hls 変換

```jsx
ffmpeg -i input.mp4 -c:v copy -c:a copy -f hls -hls_time 9 -hls_playlist_type vod -hls_segment_filename "stream%3d.ts" output.m3u8
```

## mp4 → m4aのhls変換

```bash
ffmpeg -i input.mp4 -vn -acodec copy -f hls -hls_time 60 -hls_playlist_type vod -hls_segment_filename "stream%3d.m4a" output.m3u8
```

## mp4 から m4a音声の抽出

```bash
ffmpeg -y -i input.mp4 -map 0:1? -vn -acodec copy 001.m4a -map 0:2? -vn -acodec copy 002.m4a -map 0:3? -vn -acodec copy 003.m4a -map 0:4? -vn -acodec copy 004.m4a
```

`-map`以降で抽出するオーディオトラックを指定、 `0:3?`のように`?`をつけるとエラーを吐かずに処理する

# オプション

## 無限ループ指定&時間カット指定オプション

```bash
-stream_loop -1 -t 385 -i .\123.mp4
```

`-stream_loop -1`で無限ループ、`-stream_loop 3`で3回ループ
`-t 123`で123秒でカット
Qiitaのストック全消し用スクリプト

# 概要

過去のQiita記事のストックを全部消そうとしましたが、
UIからでは1件ずつしか消せなかったので、スクリプトでまとめて消したときのメモです。

# 注意事項

:::note alert
このスクリプトを実行すると、記事のストックがすべて削除されます。
:::


# 使い方

環境変数に下記をセットしてから、スクリプトを実行する。

```bash
export QIITA_TOKEN=[APIアクセストークン]
export USER_NAME=[ユーザ名]
```


# スクリプト

記事ストックのリストを取得し、それぞれに対して削除のリクエストを発行します。

```python
import os
import json
import requests


def get_next_url(response):
    link = response.headers['link']
    if link is None:
        return None

    links = link.split(',')
    for link in links:
        if 'rel="next"' in link:
            return link[link.find('<') + 1:link.find('>')]

    return None


def get_items(token, user_name):
    url = 'https://qiita.com/api/v2/users/{}/stocks'.format(user_name)
    headers = {'Authorization': 'Bearer {}'.format(token)}

    items = []
    while True:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        items.extend(json.loads(response.text))
        url = get_next_url(response)
        if url is None:
            break

    return items


def delete_item(token, item_id):
    url = 'https://qiita.com/api/v2/items/{}/stock'.format(item_id)
    headers = {'Authorization': 'Bearer {}'.format(token)}
    response = requests.delete(url, headers=headers)


def main():
    token = os.environ['QIITA_TOKEN']
    user_name = os.environ['USER_NAME']
    items = get_items(token, user_name)

    for item in items:
        delete_item(token, item['id'])


if __name__ == '__main__':
    main()
```
今更ながらかもしれないUnityの導入方法について第3回目（終わり)

#Unityの導入について第3回目です。
第1回でUnityHubの準備及びアカウント作成
第2回でUnity本体のインストールが完了しました。
第3回目はVRM/VCIを作成するためのプロジェクトを作成しましょう。

#プロジェクト作成の準備
・UnityHubから「プロジェクト」→「新規作成」をクリックしましょう![8_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/8a724dc8-30f9-ab32-9151-4e8e29e3e7b5.jpeg)

・テンプレートは「3D]のまま、プロジェクト名はわかりやすい名前を付けましょう。
　例題として「Test」としましたが、コレは良くない例題です。どんどんテストが増えていくやつです。
　保存先は容量がありバックアップの取りやすい場所を選びましょう。
　保存先+プロジェクト名の場所に保存されます。
![9_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/47eac08a-eb07-4b48-ffd1-03fcccb6e3cc.jpeg)

・「作成」をクリックし、しばらく待つとUnityが起動します。
　このままでは表示は英語です。日本語が好きな人は「Edit」→「Preferenoes」を選択し
![11_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/5bb1e9f1-2e6b-2897-ebe8-bfe158a75a0f.jpeg)

・「Languages」→「Editor language」より、「日本語」を選びましょう。
![12_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/862b397a-f62d-b8ea-e8b9-cf147b2618c7.jpeg)

・Unityをいったん閉じ、UnityHubからプロジェクトを選択し
![13_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/13496976-fbe1-2478-d717-9f8866a23f6a.jpeg)

・Unityプロジェクトを再度立ち上げることで日本語表記にすることが出来ました。
![14_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/d1d9bf48-4df5-523d-ba1c-6a6de8b58adf.jpeg)

・VCIを作成する環境を整えましょう。UniVCI v0.33.1を導入する際の重要事項にあったとおり、
　UniVCI v0.33.1を導入する前にUniVRM v0.88.0を導入する必要があるため、
　まずはUniVRM v0.88.0ファイルを「Assets」の中にドロップ
![15_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/d44c0496-85c7-e0c8-0c90-3244b7eea737.jpeg)

・しばらく待つとファイルが読み込まれ、
　別ウィンドウが出てくるのでそのまま「インポート」をクリック
![16_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/a29a235c-0857-e308-2d04-dbf626c427a3.jpeg)

・インポート後、必要な設定を自動でしてくれるので「Accept All」をクリック
![17_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/c1fc1340-2da5-9e74-7322-c54a6c938f15.jpeg)

・「Thank you!」が出ると完了です。
![18_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/7d3471f8-0548-ad9a-b590-ae8bfddc835e.jpeg)

・続けてUniVCI v0.33.1をUniVRM同様にドロップし、インポート。
　「Accept All」をクリックして完了です。

#終わりに
3回に分けて長々と書きましたが、これにてUnityの導入とVCIを作成する環境の構築完了です。
この後もたくさんのワカランがありますが、少しでも皆様のお手伝いが出来たのなら幸いです。
ドメイン駆動設計（DDD）についてイメージしてみた。

以前「上手なクラス分けをするために頑張ることをまとめてみた。」という記事を書いたのですが、まあまあな時間が経ってしまっていました。
その頃からDDDの本を読んでみたらいいかも〜、と先輩に薦められていたのですがなかなか後回しになってしまい、、、
やっと最近読み始めることができました。

それにしても抽象的すぎて難しい…
少しずつでも理解していきたいので自分の言葉でまとめていこうと思います。

# ドメイン駆動設計ってなに？
そもそも、ドメインってなに？という疑問になりました。
「ドメインとは」で調べてみると、
> ドメインはインターネット上の住所
>> Webサイトがどこにあるのかを判別する情報は、ドメインに紐づく「IPアドレス」というものにあり、数字だけでは覚えづらいため、ドメイン名に変換してWebサイトの場所を示す。

[ドメインとは何か？ドメインの基礎知識](https://muumuu-domain.com/supports/about-domain)より引用


という内容で出てきました。
なんか違うっぽい。

技術書によると、ソフトウェア開発におけるドメインとは、
> ドメインの知識に焦点をあてた設計手法です。
>> 「プログラムを適用する対象となる領域」を指し、重要なのはドメインが何かではなく、ドメインに含まれるものが何か、です。

とのこと。

技術書に書いてある内容を頑張って噛み砕いて、考えてみます。
そして今現在の私のイメージを具体化していきます。

# 学校を例にイメージしてみる

学校を例に考えてみます。
学校には様々な人と、システムがあります。

生徒、生徒の親、教師、部活のコーチ、用務員、事務員…
クラス管理、成績管理、行事管理、時間割管理、部活管理…

学校に何があるかなということを上記のように思いついた事を書き出してみたのですが、「教科が教師情報と結びついて？全クラスに時間割があってその時間割に教師が結びついて？？？学校のシステム難しすぎ:innocent:」

ということでもう少し絞り、「部活」に焦点をあててみます。
「部活に所属している全生徒の戦績を管理したい」という要望があったと想定し、「全校生徒の部活戦績管理システム」を開発することとなりました。

「全校生徒の部活戦績管理システム」という領域（ドメイン）の知識に焦点をあてた設計手法（ドメイン駆動設計）で設計で、です。

領域に関連する知識に焦点をあてるとは？
技術書より引用すると、
> ソフトウェアの目的は利用者のドメインにおける何らかの問題の解決です。
彼らが直面している問題を解決するためには、利用者が何に困っていて何を解決したいのか、彼らの考え方や視点、取り巻く環境を真に理解する必要がある。

つまり、「全校生徒の部活戦績管理システム」を最新技術を使って効率よく実現できたとしても、問題点が解決していなかったらドメイン駆動設計はうまくいっていない、ということです。

これを防ぐために、「全校生徒の部活戦績管理システム」という領域（ドメイン）と向き合い、どういう知識が必要なのか、そしてその知識に焦点をあてて設計をする。→ドメイン駆動設計
ということです。


もう少し上の例で考えてみると、
○○中学校の生徒の部活戦績システムにおいて、
2000年度の中学1年生〜中学3年生の部活戦績しか確認できないシステムだとどうでしょう？
利用者は本当に2000年度に在籍している生徒のみ分かればいいのでしょうか。
毎年生徒は入学し、卒業していくのでもちろん生徒情報は毎年更新されるはずです。

あらかじめ利用者の問題点をきちんと洗い出し、実現させるためにはどういう知識が必要なのかを理解し、設計することが大事ということです。

こう書いてみると、あまり大したことは書いていない気がしています。
現状の理解度の確認ということで。

# 参考文献
[ドメイン駆動設計入門　ボトムアップでわかる！ドメイン設計の基本](https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3-ebook/dp/B082WXZVPC)
【Anaconda】Python 3.10に関するエラーについて

## 環境
+ Anaconda 4.10.3
+ Microsoft Windows 10.0.22000.318（21H2）
+ PowerShell 7.2.0

## 現象
PyTorchをインストールする際に、`PackagesNotFoundError` が出た。

```powershell:実行例
(test) PS C:\Users\USERNAME> conda install pytorch torchvision torchaudio cpuonly -c pytorch
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

  - python=3.1

Current channels:

  - https://conda.anaconda.org/pytorch/win-64
  - https://conda.anaconda.org/pytorch/noarch
  - https://repo.anaconda.com/pkgs/main/win-64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/r/win-64
  - https://repo.anaconda.com/pkgs/r/noarch
  - https://repo.anaconda.com/pkgs/msys2/win-64
  - https://repo.anaconda.com/pkgs/msys2/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

    https://anaconda.org

and use the search bar at the top of the page.
```

## 原因
> python 3.10 is the find version with two digits in the minor version.
conda doesn't seem to like it. In particular, noarch: python packages
seem to get installed to lib/python/3.1/site-packages instead of
lib/python/3.10/site-packages. 
([Not compatible with python 3.10 · Issue #10969 · conda/conda](https://github.com/conda/conda/issues/10969))

Python 3.10はマイナーバージョンが2桁であり、condaが3.10を3.1と認識するようだ。

## 対応
とりあえず、`conda install python=3.9`でPython 3.9をインストールすることで対応した。
ちゅらデータで推奨してるフィードバックとラップアップの紹介

# この記事は何？

[ちゅらデータ Advent Calender 2021](https://qiita.com/advent-calendar/2021/churadata) の5日目の記事です。
今日の記事はちゅらデータで仕事するときに推奨されてるプラクティスを2つ紹介します。
データサイエンティストやエンジニアだけじゃなく、他の職種の人にも有効なプラクティスです。

# 1つ目、フィードバック

ちゅらデータではフィードバックを推奨しています。
フィードバックは、相手の行動の改善ができそうだなと思ったら相手にアドバイスをする活動です。

## どんなことを解決したいの？

フィードバックが解決したいのは次のようなシーンです。

- あ、今の言い方だときっと伝わらないんじゃないかなぁ？、…その後…、やっぱり伝わってないな…どうしたら良かったんだろう？
- こんな言い方したら傷ついてしまうんじゃないか？……言い方を考えてるうちに次の話題へ……、あーまぁいいか…
- うーん、この進め方は嫌だ…でも自分だけが思ってるのかも知れないし言いにくいな…

## 具体的にはどうするの？

具体的には次のようにフィードバックというプラクティスを行います。

1. 気づく：(心の声)あ、あの行動は、こうした方がいいんじゃないか？
1. フィードバックする宣言：「すいません、＊＊＊さん、これからフィードバックさせてください」
1. フィードバックする
    1. お互い **4A** を思い出す
        1. **Aim To Assist** （FBによって相手を助けようとする気持ちで）
        1. **Actionable** （FBを通して行動変化を促す）
        1. **Appriciate** （FBされた人が感謝する）
        1. **Accept Or Discard** （FBされた人が取捨選択するもの）
    1. 「これは＊＊＊だから良くないので、代わりに＊＊＊のようにするとより良くなると思いますよ」
        1. ポイント：強制しない
1. 感謝：「フィードバックしてくれてありがとう、自分の行動を振り返ってみるよ」（勇気がいる）

## ネタ元

**4A** の部分で気づいた方もいるかも知れませんが、これは Netflix のフィードバックを元にしています。
もっと事例が知りたい場合は、 [NO RULES(ノー・ルールズ) 世界一「自由」な会社、NETFLIX](https://amzn.to/2ZWW1xb) をご覧ください。

## 何が起きるか

偉い人がフィードバック攻撃にさらされます。権威主義がはびこる会社には導入できないところもポイントですね。
フィードバックが機能しだすと、お気持ち文句みたいなものも減って行動の改善にフォーカスするようにできます。
長期間運用すればするほど、組織が改善しそうですね。

# 2つ目、ラップアップ

2つ目はラップアップです。
ラップアップは会議の質を事後に改善するテクニックです。

## どんなことを解決したいの？

MTGしててこんな事ありませんか？

- よくわからないことが話されていたけど、だれも質問しないので黙っていた(´・ω・｀)
- 「いいですね」ってみんな言ってるけど、誰がいつまでにやるのかよくわからない
- 目的がわからないけれどやっぱり誰も質問しないので黙っていた
- 自分がやることになったけど、具体的に何を作ればいいかわからない
- お客様とMTGで話し合ったことが、後日確認したら変わっていた

こんなMTGあるある課題を解決しようというのがラップアップです。

## ラップアップの具体的なやりかた

下記のような流れと内容で、ラップアップを実施しましょう。

1. カレンダーにMTGセット後、ラップアップの時間も合わせて設定
1. MTG開始 => 終了
1. **ラップアップ開始(15~30分くらい)**
    1. **必須アクティビティ：相互確認の実施**
        1. 認識の確認：＊＊ってこういう意味であっていますか？
        1. 意図の確認：＊＊さんって＊＊の目的で言ったんですか？
    1. **必須アクティビティ：NextActionの設定**
        1. TrelloやGitlabなどのタスク管理ツールへ登録する
        1. 必須項目：**いつから、いつまで、だれが、なんのために、何をする、具体的な成果物は何**
    1. **任意アクティビティ：議事録作成**
        1. ラップアップ中に議事録を作る必要はないけど、作れると作業重複が減るかも


## 何が起きるか？

冒頭で紹介したMTGあるあるの課題が解決されます。
良かったですね。
MTG参加メンバーの前提知識やスキルが揃っていないときなどは特に有効に機能すると思います。
まれにラップアップを拒否する怠惰なマネージャーもいるらしいですが良くないですね。滅ぶべきです。

# 終わりに

ちゅらデータでは最高の仕事をしようと努力する仲間がたくさんいます。
個人的に地道な活動が好きなので、最高の仕事がこのような地道なプラクティスに支えられていると良いなと思っています。
おしまい
React NativeでGoogle Newsを表示しよう

<h1>（１）はじめに</h1>

<p>普段はソーシャルワーカーとして障がいをお持ちの方の支援をしています。ReactやReact Nativeでアプリ作成を楽しんでおり、最近は3D表示に関心があります。今年から始めたReactが楽しくて、Webアプリやモバイルアプリを作成したので、一年の振り返りにいくつか書きたいと思っています。</p>
<p>今回は Google News の rssフィード を取得してReact Nativeのアプリに表示させることについて。</p>


<h3><a href="https://qiita.com/KMD/items/872d8f4eed5d6ebf5df1
">Google News Rss(API)
</a></h3>
<p>参考にさせていただきました。</p>

<h1>（２）使った技術</h1>

<p>
・react-native<br>
・expo 42.0.1<br>
・react-native-xml2js 1.0.3<br>
・moment 2.29.1<br>

<h1>（３）コード</h1>

<p>変数 word に検索したい文字を入れてGoogle Newsから取得します。<br>そのままだと日付順にならないので
ソートして変数 list にセットします。</p>

```js

   import { parseString } from "react-native-xml2js";

   const [list, setList] = useState([]);

   let url = `https://news.google.com/rss/search?q=${word}&gl=JP&ceid=JP:ja&hl=ja`;
    fetch(url)
     .then((response) => response.text())
     .then((responseText) => {
       parseString(responseText, (_, result) => {
         let article = result.rss.channel.map((item) => item.item);
         for (let i = 0; i < article[0].length; i++) {
           data.push({
             title: article[0][i].title[0],
             link: article[0][i].link[0],
             date: article[0][i].pubDate[0],
           });
         }
         const sortedData = data.sort(function (a, b) {
           a = new Date(a.date);
           b = new Date(b.date);
           return a > b ? -1 : a < b ? 1 : 0;
         });
         setList(sortedData);
        });
      })
      .catch((error) => {
       console.log("取得に失敗しました: ", error);
    })
     
    // FlatList などに展開して表示
    // {item.title}
    // {moment(item.date).format("YYYY年MM月DD日(ddd)")}
    // onPress={() => onPress(item.link)}

```


<h1>（４）終わりに</h1>

<p>最新ニュースやある事柄に関係するニュースを表示させたいときに使えます。NewsAPIも簡単に取得できて良いのですが、登録の必要性や制限があるため、気軽に使いときはGoogle Newsが良いかと思います:thumbsup:</p>
孤独な独学から救ってくれたアウトプット法3選

#この記事について
はじめまして。
2021年11月、エンジニアとして株式会社アンティー・ファクトリーに入社しました。
業界未経験で入社しもうすぐ１ヶ月が経ちます。
入社前までは独学で勉強をしていました。
この記事では、私が実感した、入社に結びついたと感じるアウトプット法をまとめようと思います。


>・この記事においてのアウトプットの定義は『学習過程で得た知識の表現や発言・転職のための活動』を指します。
・今回は独学期間中どんな勉強をして何の言語を学んだとか、何を作ったとかは割愛させていただきます。


##自己紹介

- 出身：北海道
- 性別：女
- 誕生日：1995年12月6日
- 子供の頃からお絵かき大好き。今は映画とか植物とか音楽とか
- 就職を機に上京するもブラックすぎたため２年で退職
- Pikumin Bloomにハマり中



#転職までのざっくりした流れ

2020年3月退職
↓
2020年5月独学開始
↓
2020年12月メンターに出会い共同開発
↓
2021年4月Qiita記事執筆
↓
2021年6月転職活動開始
↓
現在に至る

こんな感じです。



#孤独を救うアウトプット法3選
では以下からは

- `何故メンターに出会えたのか？`
- 開発を終えすぐに転職活動せず、`Qiita記事の執筆に時間をかけているのは何故なのか？`

その理由とともにまとめていきたいと思います。
##1.もくもく会に参加しよう！
もくもく会とは、エンジニアが同じ場所で黙々と作業をする会の総称です。
私は主に[connpass](https://connpass.com/)という掲示板サイトやTwitterから応募していました。
当時はコロナ真っ盛りだったのでオンラインで参加しました。

もくもく会といっても色々な「黙々」があります。
当時の私と同じような初学者たちが集まって切磋琢磨しあおうぜ！みたいな会や
普段扱う言語は違えど予定があえば参加OKな、現役エンジニアから初学者まで参加できる会などなど。

もくもく会に参加してメリットだと感じた点は

- 時間を決めて良い意味で見張られながら作業できるので集中できる
- 同じ目標を持った初学者と出会えたのでモチベになった
- 現役エンジニアと繋がれる

の3点です。
だいたい、もくもく会の最後に懇親会てきな時間が設けられているので
そこで自分のことを話したり、質問したり、今日勉強したことを共有したりすることで有意義な時間にすることができます。
ただ黙々と作業して終わる会もいいですが、交流も目的としている会に積極的に参加してみると良いと思います。

私はこういう場で繋がった初学者の方達がいたおかげもあり、モチベーションを維持できました。

##2.LT会に参加しよう！
アウトプット法２点目はLT会に参加しよう！です。
LT会とはLightning Talk会の略で、短いプレゼン会のようなものです。
こちらも私は[connpass](https://connpass.com/)を活用していました。
カテゴリ検索で自分が興味のある分野や、今勉強中の言語で検索して
その技術発表会にただただオーディエンスとして参加します。

現役エンジニアの方が実践的なことを発信してくれるので、かなり勉強になります。
レベルが高すぎて全く理解できないことの方が多いですが
このライブラリでこんなことできるんだ〜みたいなことを知ってるだけで1UPです。

だいたい各LT会にはTwitterハッシュタグが設定されており
登壇者に直接チャットとかDM飛ばすまでもない疑問やつぶやきを、ハッシュタグ付きで投稿すると解答がもらえたりするので、そこから繋がりをもつことができます。

前項目で
> 2020年12月メンターに出会い共同開発

と記載しましたが、このメンターがLT会に登壇していた現役エンジニアです。
日頃から独学の勉強内容や学び ~~や愚痴~~ を呟いていたこともあり、成果物のサポートなどをしていただけることになりました。（なんて優しいんだ）

LT会に参加するうえで大切だと感じたことは

- 各LTに何かしらの形でリアクションする（できればその場で質問しちゃう）
- 制作中のPFやアプリで使用している技術に関するLT会に参加する
- 狙ってる企業や興味のある会社があれば絶対参加する

以上の３点でした。

##3.Qiitaを最大限利用しよう！
詰まったとき、エラーメッセージで検索したりすると必ずと言っていいほどお世話になる`Qiita`
日本のエンジニアであれば100％目にしているはずです。
裏を返せば自分が入りたい企業のエンジニアも利用していることになるので、Qiitaをアウトプットの場として有効活用しましょう！

実際に私は学んだことを備忘録的な形で書き留めたり
職務経歴書代わりに記事を投稿しました。
>実際に投稿した記事は[こちら](https://qiita.com/natsumi1206/items/a4483d830cb26ed74a0e)

自分が今まで何をしてきて、何をやりたくて、どんな勉強をしてて、何をつくって、そこから何を学んだか…

体裁が決まった日本の職務経歴書や、応募メッセージのテンプレートをアレンジするよりよっぽど自分のことを知ってもらえます。
前項にも記載したとおり記事を書くのに２ヶ月もかけてますが、それくらい力をいれて取り組みました。
特に力をいれたのは、自分はどういう人間で、独学を通して何を学んだか。この項目が５割くらい占めていて、残りは成果物の内容です。
職務経歴書では伝えきれない人となりを知ってもらうのがポイントだと思います。

実際に、現在の会社に拾っていただけたのはQiitaの記事がきっかけでした。



#最後に
アウトプットって、技術的なことじゃないとダメ、みんなのタメになるような事じゃないと意味がない
というわけではなく、自分のために行動して、相手に自らを発信する、知ってもらう。
こういう形もありだと私は思います。

他人に伝えるために情報を整理して言語としてまとめることって大変ですが
自分の脳内に「点」として乱雑に置いてあったものが、一つにまとまることで自分自身の情報の整理につながり
見返せる形として残しておけることで未来の自分を救うことにも繋がると思います。

ここまでまじめに意識高い系のことを書いてきましたが
要は
自分今こんなことしてまーす！
こんなことやりたいでーす！
ここわかりませーん！
こんな会社はいりたいでーす！
と大いにアピールしていこうよ
ってことです。

最後まで読んでいただきありがとうございました！
マリトッツォゲームを作ったよ

# はじめに
クソアプリアドベントカレンダー、6日目担当のサンジモニカです！
去年に続き、2回目の参加です。
去年は「[とてつもない汚いゲーム](https://qiita.com/SanjiMonica/items/ba19bafe0d41c19ffe23)」を作ってしまったので、その反省を活かして今年は制作に取り掛かりました。

# 何を作ろうか
せっかくなら多くの方に遊んでほしいと思い、今年流行った**マリトッツォ**を題材とすることにしました。
見た目も可愛いしアイコン的にも使えるし、最適なモチーフでした！
流行ってくれて感謝！

# ゲームの説明
そんなわけで[**マリトッツォゲーム**](https://maritozzo.nankakaku.com/)というものを作りました。

ルールはシンプル。マリトッツォをスワイプしてお皿のところに運びましょう。
ハムスターに当たってしまうと失敗です！
全10面のステージクリア型です。ぜひ遊んでみてください！

https://maritozzo.nankakaku.com/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/a3d666d6-faa6-e44a-c0ea-6af2a6279a4a.png" width=5%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/89320263-f01b-f459-2a98-02117adef7a5.png" width=30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/a3d666d6-faa6-e44a-c0ea-6af2a6279a4a.png" width=5%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/86534fb8-2a73-0087-488d-60f9a30c94cf.png" width=30%>


# 仕様検討について
ゲーム制作に当たって考えた企画的な要件について、以下の記事にまとめました。
企画要件、ゲームデザイン（ルール）、ターゲットユーザー、難易度設定などについてまとめています。

https://zenn.dev/sanjimonica/articles/aa92f91a63b973

# 技術的な話
以下の環境で開発しました。

* PixiJS
* Webpack
* TypeScript
* HTML/CSSを少々（デザイナーに任せたい部分はHTML/CSSで実装）
* Firebase Hosting

WebpackとTypeScriptは以前から導入したかったので、今回始めて本格的に使用しました。大変便利でした！
Firebaseも今年習得した技術です。サーバーレス環境最高……。

その他、 **PixiJS**と**ハムスターの動き**について、以下で少し詳しく解説しようと思います。

## Pixi.JS
2DレンダリングができるJavaScriptライブラリです。
https://pixijs.com/
今回のゲームがなめらかな移動が必要なブラウザゲームということもあり、いろいろとライブラリを探していた中で見つけました。
勤めている会社でも使用しており、多少聞き馴染みがあったので今回採用しました。

使い方については、とてもわかりやすい記事がありました。

https://qiita.com/chiisanwo/items/f22caabc89ed8a6c41de

使ってみた感想ですが、大変良かったです！
もともとHTML5での開発はほとんどしたことがなかったのですが、それでもほぼ迷うこと無く開発ができました。


## ハムスターの動き
お邪魔キャラクターであるハムスターの動きにもこだわりました。
滑らかで連続的に動くことと、自由に移動経路を定義できることを条件としていたのですが、なかなか上手くいかず何度か作り変えることに……。
最終的には、SVGでパス（経路）を定義することにしました。
以下、コードの抜粋です。

```ts:SVGから座標を取得する
// パスの定義部分
static line_rightUp = new RoundTripSVG(SVGType.PATH, 'M 0,0 T 100 -100');
static circle = new RoundTripSVG(
    SVGType.PATH,
    'M 100, 100 m -75, 0 a 75,75 0 1,0 150,0 a 75,75 0 1,0 -150,0'
);
static wave = new RoundTripSVG(
    SVGType.PATH,
    'M 0,0 Q 100 -200 200 0 T 400 0'
);
// （中略）
// SVGの作成
this.svgPathElement = document.createElementNS(
    'http://www.w3.org/2000/svg',
    this.roundTrip.type
);
this.svgPathElement.setAttribute('d', this.roundTrip.path);
// 全体長の計算
this.totalLength = this.svgPathElement.getTotalLength();
// ・・・
// 全体長に対して取得したい点を%で指定し、座標を得る
var returnPosition = this.svgPathElement.getPointAtLength(
    (this.totalLength * this.currentPercentage) / 100
);
```

SVGって画像描画以外にも使えるんですね。知りませんでした。
結果として、自由な曲線を定義してその上を移動させることができるようになりました。

# 最後に
今年も見事なクソアプリを作ることができました。
かねてより使いたいと思っていた技術の習得にもなり良かったです！

デザインは[おしゃもこ](https://twitter.com/font_onesan)さんに担当していただきました。
今年も素晴らしいデザインをありがとうございます。ハムスターかわいい🐹

最後になりますが、Twitter([@SanjiMonica](https://twitter.com/SanjiMonica))でもいろいろとつぶやいていますので、よければフォローをお願い致します！
明日以降の皆様の素晴らしきクソアプリも楽しみにしております！
OpenCVでオートフォーカスWebカメラのフォーカスを設定する（Python）

OpenCVでオートフォーカスWebカメラのフォーカスを変更する方法です。

LogicoolのC922n(オートフォーカスかつ60FPS出る)を買ったので試してみました。

フォーカス値は`0~250`の範囲で5刻みに設定できるようです。
フォーカス値を大きくしていくと、近くにピントが合います。

```python
import cv2

cap = cv2.VideoCapture(0)
# 画像サイズを設定
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 360)
# FPSを設定
cap.set(cv2.CAP_PROP_FPS, 60)
# オートフォーカスをオフ
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0)
# フォーカス値を設定
cap.set(cv2.CAP_PROP_FOCUS, 0)

# 映像を表示
while cap.isOpened():
    _, img = cap.read()
    cv2.imshow("manual_focus", img)
    key = cv2.waitKey(1)
    # qキーを押すと終了
    if key == ord('q'):
        break
cv2.destroyAllWindows()
cap.release()
```
【Laravel】composerの調子が悪い時に試すこと

別のgitブランチでcomposerをいじっていて(特に新規パッケージ追加などしていて)元のブランチに戻って`composer install`した時とか。

`composer install`でライブラリが上手く読み込めない, `composer.json`・`composer.lock`に記述のないライブラリが存在しないとかで怒られる, など発生することがあるので、対処法メモ。

# vendor/を削除
```
rm -rf vendor/
```

# キャッシュクリア
```
composer clear-cache
```

# bootstrap/ のキャッシュファイル削除
```
cd bootstrap/cache
rm -f packages.php services.php
```
↑この他にも、git管理外のファイルがあれば削除。

# composerを再度install
```
composer install

メモリが足りない場合は
COMPOSER_MEMORY_LIMIT=-1 composer install
```

# クラス再読み込み
```
composer dump-autoload
```

# 補足
Dockerにcomposerをバージョン指定してインストールしている運用ケースなどは、PCではなくDockerコンテナ内でcomposerコマンドを実行した方が良い。
(composerバージョン違いなどで意図しない事象が発生するのを防ぐため)
Delphi コンカレント (並行処理) プログラミング

# はじめに

Delphi の並行処理プログラミングについての情報が新旧入り乱れていたり、散在していたりして解りづらいと感じたので、自分なりにまとめてみることにしました。

# 目次

 - [0. はじめに](https://qiita.com/ht_deko/items/c6714835355a83cde088)
 - [1. スレッドオブジェクト](https://qiita.com/ht_deko/items/39da99a10202589e002c)
 - [2. クリティカルセクションとロック](https://qiita.com/ht_deko/items/9f3c7534e2ac406ba7dc)
 - [3. スレッドローカル変数 (スレッドローカルストレージ)](https://qiita.com/ht_deko/items/09f04b5768135401eebb)
 - [4. 並列プログラミングライブラリ (PPL)](https://qiita.com/ht_deko/items/ee155618119c48bec7b7)　
 - [5. サードパーティ製ライブラリ](https://qiita.com/ht_deko/items/e7f655bb73af05fbac35)
 - [6. ミューテックス (同期オブジェクト)](https://qiita.com/ht_deko/items/83cd0ab35c90a9a6cea1)
 - [7. セマフォ (同期オブジェクト)](https://qiita.com/ht_deko/items/6d7aa5ab5856d231b79e)
 - [8. イベント (同期オブジェクト)](https://qiita.com/ht_deko/items/c6317b1bb7ad6dd47476)
 - [9. 非同期プログラミングライブラリ (APL)](https://qiita.com/ht_deko/items/eedf3728be2a301a8a5d)
 - [10. ファイバー](https://qiita.com/ht_deko/items/73b34d900385f286ee36)
 - [付録](https://qiita.com/ht_deko/items/2f8d55f69d30ba622d3b)

# おわりに
記事の内容は予告なく変更になる事があります。
不備や間違いがありましたらコメント欄などでツッコミを入れてください。
tilemakerを使って爆速でOSMベクタータイルを作る

この記事は2021 Advent Calendar [ベクトルタイル](https://qiita.com/advent-calendar/2021/vt)13日目の記事です。

## TL;DR

- `tilemaker`だと日本のOSMベクタータイルを作るのに2時間かからない
- （まだExperimentですが）planetでも37時間で出来るというベンチマーク

## tilemaker

https://github.com/systemed/tilemaker

C++で書かれた、osm.pbf->.MBTiles変換ツール。[OpenMapTiles](https://github.com/openmaptiles/openmaptiles)に準拠したスキーマでタイルを生成する。

`OpenMapTiles`との違いは速度。`OpenMapTiles`のタイル生成はかなり時間がかかる（[日本だけで50時間](https://gist.github.com/smellman/c9b8de7b6d5a78b91ded39cb3a5d12c8)、planetのベンチマークは見つからなかったが、想像したくないくらいの時間がかかりそう）。後述するが、`tilemaker`では日本の領域のタイル生成に<b>2時間かからない</b>。

仕組みの違いとしては、`OpenMapTiles`がOSMデータを全てPostgreSQLに投入してから色々処理しているのに対して、`tilemaker`は全てオンメモリで処理を行う（GitHubのdescriptionによれば<b>without stack</b>と表現されている）。

ゆえに`tilemaker`では、実行マシンのメモリ容量はそれなりに大きいものが必要（[planet対応のIssue](https://github.com/systemed/tilemaker/issues/315)で、最大メモリ使用量が131GBであったと記載されている ※planet-latest.osm.pbfのファイルサイズは90GB程度）。メモリが大きいとパフォーマンスがよいとかそういう話ではなくて、足りないと処理が落ちる。

また、`tilemaker`には差分更新の仕組みはない（でもその必要がないくらい処理が早い）。

## OSMタイルの日本分を作ってみる

### 実行条件

- japan-latest.osm.pbf(1.6GB)
- AWS EC2 r5.large(16GB RAM)

### 手順

```sh
git clone https://github.com/systemed/tilemaker.git
cd tilemaker

# osm.pbfをダウンロード(1.6GB)
wget https://download.geofabrik.de/asia/japan-latest.osm.pbf

# tilemaker実行
docker build . -t tilemaker
mkdir output
docker run -v $PWD:/output tilemaker --input japan-latest.osm.pbf --output output/japan.mbtiles
```

2時間足らずでMBTilesの生成が完了。

### 出来栄えを確認

`© OpenMapTiles © OpenStreetMap contributors`

![スクリーンショット 2021-11-27 20.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/ec087ced-f34d-16c0-6595-2d31c0409e29.png)
![スクリーンショット 2021-11-27 20.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/f9d02936-6298-2180-ad2e-d06628f22025.png)
![スクリーンショット 2021-11-27 20.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/74941bb5-c2f8-0651-a4e4-77fa44121d56.png)
![スクリーンショット 2021-11-27 20.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/53763285-3b7e-ed94-e340-cb4cc47ddd41.png)
![スクリーンショット 2021-11-27 20.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/63700943-aad8-9896-6a72-e81440a6c0af.png)

（もうこれで良いんじゃないかな）

細かい検証はしていないが、OpenMapTilesで生成したタイルと同じ見た目になっている（フォントは置いといて）。
参考:https://tile.openstreetmap.jp/styles/osm-bright/#13.79/35.68197/139.7648

### その他

- NaturalEarthのデータなどを配置しておくと取り込む機能もある模様（未検証）。

## 終わりに

`tilemaker`はOSMベクタータイルのゲームチェンジャーだと思います。OSMタイル生成が圧倒的に手軽になります。運用を考えると、タイル生成のコストが大きいとデータの更新が悩みのタネですが、`tilemaker`が実用レベルに到達すれば、この問題が解消されます。誰でもOSMベクタータイルを作成・配信・運用できるようになると思います。
Jetpack Compose+Coilで角丸の画像を表示する

Jetpack Compose + Coilで画像をダウンロードしてきて表示する場合、ImageにModifier.clipやbackgroundで角丸のshapeを指定してもダウンロード後の画像が角丸にならなかったので、coilのbuilderでtransformationしてあげると角丸の画像を表示できた。
ついでにDensityを使ってdp指定のPxサイズで角丸にしておいた。

``` kotlin
Image(
    painter = rememberImagePainter(
        data = url,
        builder = {
            transformations(
                with(LocalDensity.current) {
                    val r = 10.dp.toPx()
                    RoundedCornersTransformation(
                        topLeft = r,
                        topRight = r,
                        bottomLeft = r,
                        bottomRight = r,
                    )
                }
            )
        }
    ),
    contentDescription = contentDescription,
    modifier = modifier.testTag("NetworkImage"),
    contentScale = contentScale,
)
```
マッチした人の年収を知れるマッチングアプリを作った

明らかに攻撃的なリクエストが飛んでいて、管理するのが怖くなったので消しました。

---

[クソアプリカレンダー](https://qiita.com/advent-calendar/2021/kuso-app) 25日目を担当します。今年が 4回目の参加です。

これまでに作ったものはこのようなものです。

https://qiita.com/sadnessOjisan/items/45d2c3e6e3f5a38a7f0b

https://qiita.com/sadnessOjisan/items/98619eaaef1da8d6545a

https://qiita.com/sadnessOjisan/items/51bb949466fdd065a5a6

またクソアプリコンテストではないですが、これもなかなかクソアプリだと思います。

https://qiita.com/sadnessOjisan/items/05bbca78bca3301d24b2

今回作ったのは、"Howマッチ" という マッチングアプリ です。**年収で決闘できる**マッチングアプリです。メールアドレス もしくは GitHub ID があれば登録できます。

https://howmatch.ojisan.dev?why_qiita_ogp_cache_stale=be_fresh

皆さん対戦してください。

## 謝罪

毎年、面白おかしく書こうと色々工夫しているのですが、今年はできあがったのがついさっきであるため文章を書いている余裕がなく、淡々と事実だけ書いていきます。（現在 12/25 23:04）

## なぜ作ったのか

知り合いの年収を単純に知りたくないですか？

年収を開示するのはちょっと勇気が入りますし、自分のは開示したくないのですが、開示することで知りたい人の年収を知れるなら開示したいという声をたまにききます。
なのでそれができるサイトを作ってみました。

お互いの年収を知れば「え、あなたそんなにすごい人なのにこんなに年収低いんですか！弊社もっと出せます、弊社に来ませんか？」や「え、こいつこんなに高いん？おれが低いだけか？転職しなきゃ！」的なこともあるのではないでしょうか。年収の相場感を自覚することでキャリアプランも築きやすくなると思い、こういうものを作りました。

## 使い方

認証情報を登録します。メールもしくはGitHubで可能です。

![Screen Shot 2021-12-25 at 23.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89256/d92008a7-48e8-58cd-f9ca-c81439440a3e.png)

年収情報を登録します。

![Screen Shot 2021-12-25 at 23.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89256/87788827-4962-131d-1303-28d1cb5f81d8.png)

登録が完了しました

![Screen Shot 2021-12-25 at 23.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89256/2e64894b-d5c9-e36b-6aa7-41d7147c6d8b.png)

マッチングします。（これは別のユーザーから見たものです）

![Screen Shot 2021-12-25 at 23.50.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89256/cd53eed0-b2f2-025a-b93a-9321be0a4cf9.png)

相手も自分にマッチしていると、お互いの年収を知れます

![Screen Shot 2021-12-25 at 23.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89256/f6ab4bb1-d135-62a1-c135-22a157511544.png)



## どう作ったのか

NextJS + Firebase で作っており、技術的には特筆することはないです。

ただ、設計は少し工夫をしており、全てのリクエストを Firebase Functions 経由で行っています。
これは年収情報というセンシティブなものを確実に守りたく、バリデーションの行いやすさや、不正なリクエストの検知を目的としているためです。
その代償としてコールドスタートによるTTFBの影響はあります。
特に常に大量にリクエストが来るわけではないので、まばらなユーザー全員がTTFBの悪い体験をしてしまうという問題があり、これは改善すべきことだと思っています。
おそらくセンシティブな情報が絡まないところは Firestore に直接アクセスさせる、もしくはFaaSをやめるとかにすると良いのだろうと考えています。
もしこのサービスが使われることがありそうでしたらこの辺りは改善します。

そういえば久しぶりに [Mui](https://mui.com/) を使ってみました。業務で昔作っていたのですが、最近はもっぱら Chakra や Ant を使っていたので追いかけていませんでした。Material UI が Mui としてリブランディングされて使うのは初めてでした。要素に直接スタイルを当てるのがやりやすかったり、Chakra にある思想が取り込まれていたりで結構使いやすかったです。

特に Mui はサポートしているコンポーネントの種類はもともと多く、このクオリティーでこの数のコンポーネントが使えると考えると、これからの選択肢としてありではと思っています。

## あとがき

マッチングとか恋人とかそういうのばっか書いてて悲しくなってきた
クラウド関連ビジネスの現在位置

日付を間違えていて書く、ACCESS Advent calendarの記事です。何とかクリスマスに間に合った。

技術的に書きたいことはいくつかあったのですが、間に合わなかったので、ビジネス的な事を書きます。（以前、社内向けに書いた資料の、焼き直しです）

単なる昔話と、若干悲観論的ですが、一般論を書いているつもりです。国内外のことにふれますが、日本国内のSI事業の視点から書いています。
（と言いつつ、国内の会社は社名を上げづらいので、ぼかして書いています）

# BaaS/PaaSの創世記

国内でクラウドという言葉が広く聞かれるようになったのは、2011年頃、大震災の前ぐらいからのはずです。AWSの日本リージョンができたのは、2011年です。

当時、BaaSの、Parse.comで、Facebookが買収した年でした。とはいえ、BaaSは未成熟の状況で、商用開発で使う例は少ない状況でした。

また、便利なPaaSというと、Herokuぐらいしかありませんでした。（ちなみに、私のいるACCESSでは、Herokuを広範囲に使っており、当時国内で最もヘビーにHerokuを使っていた会社の一社のはずです。）
なお、AWSのPaaSである、Elastic Beanstalkは、2011年から提供されていますが、2013年当時では、実績のあるプラットというまでは発展していませんでした。

以上の状況から、この頃に様々な「開発プラットフォーム」という名のクラウドサービスが2013年頃、日本国内でもローンチしています。AWSはIaaSを提供し、自社がPaaS/BaaS/SaaSを提供する、そういった差別化を狙える時期でした。

# ビッグ3の成長

しかし、2021年までの間、AWSを始め、Azure、GCPなどクラウドのビッグ3は、とてつもない投資を続け、機能も実績も充実しました。AWSのCognito、S3、DynamoDB、RDS、Kinesis、Bean Stalk、Amplyfy、Greengrass 等々、システムアーキテクチャーの全てのレイヤにサービス・コンポーネントを提供しています。さらに導入実績も豊富になり、技術情報もネットに溢れています。

さらに、AWS、Azure、GCPは、IaaS、BaaS、PaaS ではシェア拡大に限界が見えてきたことから、周辺のSaaSのような領域に投資を拡大しています。たとえばAWSでは、開発者向けのSaaSを増やしています。機械学習用の開発プラットフォームのSageMaker、CIのCodeBuild、Web上の開発ツールのCloud9、VR開発ツールのSumerian、、とリストアップしようとしましたが、もう書き切れないほどあります。

# ビッグ3への集約

以上から、クラウドとその周辺ビジネスは、ビッグ3に集約される形になってきています。Parse.com は2017年に閉鎖されました。クラウド創成期にAWSと並びIaaSで有力だったRackspaceは、2016年にIaaSのビジネスを止めて、ビッグ3のクラウドを扱う会社に変わりました。
2011年にローンチしたリアルタイムデータベースとして知られたFirebaseはGoogleに買収されGCPに、エンタープライズBaaSとして知られたKinveyもアメリカの会社に買収されています。

国内で見ても、2013年頃にローンチした多くの開発プラットフォームで生き残っているものはほとんどありません。

# クライドインテグレーター業界現在位置

私の観測範囲ですが、2020年以降、クラウド関連のSI（Cloud Integrator）としての案件では、顧客から、「このプロジェクトはAzureで」など、クラウドを指定される例が、大部分となっています。これは、ビッグ3によるセールス活動が非常に活発で、サービス検討の段階まで、各社のソリューションアーキテクトが入り込んでいるためだと思われます。

一方で、クラウドのSI案件の数は増えています。SI産業としては、成熟しながらも、拡大していることは確かです。一方で、ビッグ3への集約が進んでおり、プラットフォーム事業でスケールを狙うビジネスが難しくなってきました。さらに、その周辺の汎用的な、開発プラットフォーム・ツールについても、ビッグ3による提供範囲が増え、そこでのスケールも難しくなりました。

# ビジネスSaaSの模索

上記のような背景が、2019年以降、国内で機運の広まっている、ビジネスSaaSにつながっていると思っています。クラウド関連の汎用的なプラットフォームでスケールを狙うようなビジネスは成り立たなくなり、IT企業は、業界特化型のSaaSでスケールを狙う道を模索する形となりました。
これも、様々な業界にスケールできる会計系などはすでにプレイヤーが決まっている事から、競争環境は明らかにきびしくなっています。

同時に、ビジネスSaaSの広まりは、単なる受託としての、SIは相対的に減って、ビジネスSaaSを活用した、インテグレーションが増えていく、という状況の変化をもたらしています。


特に結論らしきものをかけなかったですが、、とりあえずクリスマスの間に投稿します。
フェードインしてくる文字の表示

ページにアクセスした時に特定の文字がフェードインしてくるcssの記述です。`translate3d(0,-100%,0);`の部分はy軸に-100%移動するという意味です。



```style.css
h1 {
  visibility: visible;
  animation: fadeInDown 1s ease 0.5s 1 normal;
  -webkit-animation: fadeInDown 1s ease 0.5s 1 normal;
  animation-fill-mode: both;
}

@keyframes fadeInDown {
  0% {
    opacity: 0;
    transform: translate3d(0,-100%,0);
  }
  100% {
    opacity: 1;
    transform: none;
  }
}

@-webkit-keyframes fadeInDown {
  0% {
    opacity: 0;
    transform: translate3d(0,-100%,0);
  }
  100% {
    opacity: 1;
    transform: none;
  }
}
```
アドベントカレンダーはいいぞという話

本記事は、[アドベントカレンダー初参加する人を応援したい、アドベントカレンダーに参加したきっかけアドベントカレンダー Advent Calendar 2021](https://qiita.com/advent-calendar/2021/sanka-kikkake) 25日目の記事です。

## 私自身のアドベントカレンダー参加歴
<dl>
<dt>2019年</dt>
<dd><a href="https://qiita.com/yshimizu125/items/adf39bd2aed41ad0e972"> Dreamweaver→VisualStudioCode移行物語</a>（初参加）</dd>
<dt>2020年</dt>
<dd> <a href="https://qiita.com/yshimizu125/items/08866fd0f12d6ee6f7ff"> アクセシビリティ対応はじめの一歩</a></dd>
<dt>2021年</dt>
<dd><a href="https://qiita.com/yshimizu125/items/574ae841a55b6855117c">Contact Form 7の実装Tips①</a><br><a href="https://qiita.com/yshimizu125/items/9027052b22e973caabe1">Dreamweaver→VisualStudioCode移行ガイド</a><br><a href="https://qiita.com/yshimizu125/items/9b8a9bad761c3c6097e6">Contact Form 7の実装Tips②</a><br><a href="https://qiita.com/yshimizu125/items/3907ce0b8bfc916de86a"> Shifter Github Plugin/Theme Installerを使ってGitHubで管理しているWordPressテーマファイルをインストール＆アップデートしよう </a> </dd>
</dl>
今年はちょっと記事にしておきたいことが多くて~~調子に乗って~~たくさん書いていますが、数年前までは完全なROM専でした。なので、アドベントカレンダー、及び技術記事を発信する者としてはまだまだ初心者です。

## 私とアドベントカレンダーの出会い
思い出せる限りの最古の記憶は2015年。
QiitaではなくAdventarというサイトで、私は初めて「アドベントカレンダー」という単語と文化を知りました。

当時制作していたサイトではIE7以降での表示を担保する必要があり、私は頭を抱えていました。
そろそろサポートが切れるIE11もなかなかの曲者ですが、それ以前のIEは比べものにならないぐらい多くのバグを抱えていたのです。

ひたすらCSSの修正方法を探していて出会ったのが、このアドベントカレンダーでした。

https://adventar.org/calendars/723

タイトルからして面白い記事が並んでいますね。内容自体も面白く、また非常に参考になるものばかりで、IEという悪夢で精神をすり減らしていた私は、色んな意味で救われたのです。
「なんて素敵な文化なんだろう！」と感銘を受けた私は、以降毎年アドベンターとQiitaで面白そうなカレンダーをチェックするようになっていきました。

## 私のアドベントカレンダーデビュー
面白そうなカレンダーと記事をチェックしていると、だんだん「自分も参加してみたいな」という気持ちがわいてくるものです。もちろん、「私のようなザコーダーがカレンダーに参加してもいいのだろうか」という不安があり、ずっと参加に踏み切れませんでした。

時は流れ、2019年。
アドベントカレンダーの季節がそろそろやってくるな〜という頃、私はDreamweaverからVisualStudioCodeへの移行を検討していました。ところが、調べてもあまり同じような事例はなかなか見つかりません。

手探りで移行を進めながら、ふと考えました。事例が見つからないということは、苦労するようなほどじゃ無かったか、レアケースか、困ったままの人が多いかのどれかでは？と。そして、どの場合であってもアウトプットして損は無いのでは？とも思いました。

ちょうどVisualStudioCodeのアドベントカレンダーを発見した私は、「ええいままよ！」と参加を決めて記事を書きました。これが私のアドベントカレンダーデビューであり、Qiitaデビューでもありました。

## 参加してよかったこと
嬉しいことに初めてアドベントカレンダーに参加した記事は多くの方に閲覧いただき、またこれが後押しとなって弊社のリクルートに応募してくれる人も現れました。
2回目の参加では情報共有の場を広げることができました。3回目となる今年は参加するカレンダーを増やして、さらに他の技術者の方との接点が持てたら良いなあと考えています。

また、記事を書くのは大変ですが、発信することへの不安やハードルがなくなりました。

### 2022年1月20日追記
さっそくですが2021年分のカレンダーで参加してよかったことがありました！
なんとこのたび、（生まれて初めての）イベントへ登壇することになったのです！

https://eventregist.com/e/M1NzTceR9n3d

エンジニアとして、「いつかイベントに登壇とかしてみたいな～」という憧れがあったので、大変光栄です。
きっかけとなった記事は本当に初歩的な内容で、投稿当初は恥ずかしさもありましたが、臆せず書いて良かったです。

## 思い切って参加しよう！
基本的にアドベントカレンダーに参加して、得をすることはあれど損することはないです。迷うぐらいなら、思い切って参加しちゃった方が良いと思います！

今年のアドベントカレンダーは今日で終わりですが、空いているところに遡って記事を登録・参加することができます。下書き状態で眠らせている記事がある方は、参加してみても良いかもしれませんね。

下書き記事はないけど参加してみたい気持ちがある方は、ぜひこの一年で書きたい内容を見つけて、来年のカレンダーに参加してください！一緒に楽しいアドベントカレンダーの季節を過ごしましょう！