OmniAICreator/Qiita-1.07M huggingface dataset:
【Javascript】Javascriptのfetchの仕様の注意点

# 初めに

React での開発中に、`fetch`の仕様がわからなくなったのでここに忘備録を残しておきます。

## 環境

- React 18.0.0
- typescript 4.6.3

# Fetch API の仕様

## json データの取り出し方

> `Fetch API`の最も簡単な使い方は 1 つの引数 — fetch で取得したいリソースへのパス — のみをとり、 Response オブジェクトで解決するプロミスを返します。Response は、実際の JSON レスポンス本体を直接持っているのではなく、 HTTP レスポンス全体を表現するものです。 Response オブジェクトから JSON の本文の内容を抽出するには、 json() メソッドを使用します。これはレスポンス本文のテキストを JSON として解釈した結果で解決する第 2 のプロミスを返します。

上記のように、`fetch()`は取得した`Response`に対して`json()`メソッドを使用しないと、レスポンスの本体が取得できません。

```javascript
fetch(URL)
  .then((response) => response.json())
  .then((json) => console.log(json));
// jsonにはレスポンスの本体が入っている
```

## レスポンスが成功したかの確認方法

> 404 はネットワークエラーにはなりません。 fetch() が成功したかどうかを正確に判定するには、プロミスが解決された後で、 Response.ok プロパティが true になっているかを確認してください

上記に記載されているように、`Reasponse.ok`での確認が必ず必要になります。

```javascript
fetch(URL)
  .then((response) => {
    if (!response.ok) {
      throw new Error("Network response was not ok.");
      // Errorが発生したら、ここで処理を中断して、下記のcatchに移行する
    }
    return response.json();
  })
  .then((json) => console.log(json))
  .catch((error) => console.log(error));
```

## Typescript 使用時の注意点

レスポンスの`json`が `any`型もしくは `unknown`型になる。

```javascript
fetch(URL)
  .then((response) => {
    if (!response.ok) {
      throw new Error("Network response was not ok.");
    }
    return response.json();
  })
  .then((json) => console.log(json))
  // jsonの型がany型になる
  .catch((error) => console.log(error));
```

これを解決するには`fetch`をラップして、レスポンスに型を指定する必要があります。
Spring for GraphQL v1.0.0-M3 を使用してみての所感

# はじめに
 
2021/12/29 - 2022/01/03 の間に `GraphQL` を勉強するための題材として `Spring for GraphQL` を使ってみた感想です。

`GraphQL` の記憶はまったくなかったので、仕様を調べるところからはじめました。

# GraphQL の仕様理解

- 参照(Query)と書込(Mutation)で大別される
- レスポンスで必要とするフィールドを指定する
  - 呼び出し方次第で、余計なフィールドを取得しないことを可能とする
- 1回のリクエストで複数リソースを参照/書込可能
  - 画面を描画する際にRestAPIだと複数回リクエストしていた箇所をGraphQLでは1回ですませられそう 

# Spring for GraphQL

- `src/main/resources/graphql` ディレクトリ配下のGraphQL定義ファイル `.graphqls` を参照する
- `application.yml` の `spring.graphql` プロパティを参照する
  - `spring.graphql.graphiql.enabled=true` にするとデバッグツールが利用できる
- 以下のアノテーションの付与先がGraphQL定義ファイルと対応する
  - `org.springframework.graphql.data.method.annotation.Argument`
  - `org.springframework.graphql.data.method.annotation.MutationMapping`
  - `org.springframework.graphql.data.method.annotation.QueryMapping`
  - `org.springframework.graphql.data.method.annotation.SchemaMapping`
- Gradleで、 `com.netflix.dgs.codegen` プラグインを利用するとGraphQL定義ファイルからリソースを自動生成する

# RestAPIからGraphQLにリメイクしてみた

| 種別       | Url                                            | 説明                                                 | 
| ---------- | ---------------------------------------------- | ---------------------------------------------------- | 
| リメイク元 | https://github.com/mabubu0203/catcafe          | OpenAPI Specificationからインターフェース、モデルを自動生成している | 
| リメイク先 | https://github.com/mabubu0203/catcafe-graph-ql | GraphQL定義からリソース？モデル？を自動生成している  | 

## リメイク元紹介

`SpringWebFlux` と `SpringR2DBC` を利用している。  
`OpenAPI Generator` を使って `OpenAPI Specification` から `Controller` を自動生成している。  
`Redoc` から `OpenAPI Specification` をAPI仕様書として利用できている。  

## リメイクしての利点

リメイク元の参照系APIは、  
- 一覧取得は必要な要素だけ返却する  
- 詳細取得は全ての要素を返却する  

のように使い分けていた。  
これを一覧取得に統合して、呼び出し元でフィールドの制限をかける運用にできそうだなと感じた。  

## 物足りないと感じた箇所

### ページング

ページングについてはGraphQL側で明確な仕様は存在しない。  
推奨の仕様が存在し、ライブラリにも存在している。  
だが、 `SpringR2DBC` とは相性がよくなさそうだと感じた。  
なので、ページングについては実装していない。  
※ `com.netflix.dgs.codegen` プラグインでは自動生成の対象になっている  

### API仕様書について

[SpectaQL](https://blog.graphqleditor.com/spectaql) でGraphQL定義からドキュメントを生成できる。  

## 所感

- 文字数とかGraphQL定義ファイルで定義できないの？
  - `com.netflix.dgs.codegen` プラグインからコード自動生成できてよかった
    - BeanValidationつかえるみたいだけど、GraphQLの仕様にlength長チェックなどはなさそう
- ApplicationLayerでしか差分でなさそう。すごい。
- `SpringWebFlux` に対応しててよかった
- `レスポンスで必要とするフィールドを指定する` は欲しい機能だった。すごい。    

# おまけ

2022/01/03 から 2022/06/05 までに追加開発して、スライドにまとめました。

https://speakerdeck.com/mabubu0203/20220605-graphqlshi-zhuang-sitemita
G検定 合格体験記

2022年7月のG検定を受験し、無事合格しました。
学習したことなどを書いてみます。参考になれば幸いです。

## はじめに
### 私のレベル
- 文系出身エンジニア
- AI関連の仕事経験はなし

### 学習期間
一か月！！！
まあ、何とかなるやろ・・という気持ちだった

## 学習計画
- 2週間はインプット
    - 動画やテキストを使って基礎知識を頭に入れる
    - 何となく分かればいいやレベル
- 残りの2週間でアウトプット
    - 問題をたくさん解いて知識を定着させる
    - 苦手分野はテキストを復習

## インプットで使ったもの
### [窪田望さんの動画「G検定合格のためのAI基礎講座」](https://youtube.com/playlist?list=PLPyzKffvfd3m8NU8qUlIfgEnrjuAxJkPw)

<iframe width="560" height="315" src="https://www.youtube.com/embed/videoseries?list=PLPyzKffvfd3m8NU8qUlIfgEnrjuAxJkPw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

- Youtubeで無料で見れる神コンテンツ
- G検定の範囲をかなりカバーしている
- 白本と並行して視聴することで、理解が進んだ
- 講義はかなり分かりやすく、面白い。楽しく学習に取り組むことができた

### [深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版](https://www.shoeisha.co.jp/book/detail/9784798157559)
![image](https://www.seshop.com/static/images/product/22076/L.png)
- G検定の公式テキスト、通称白本
- 出版社の翔泳社さんがポイント50%還元セールやってた時に購入
- 3周した
    - 1周目は不安になるレベルで難しく感じたが、何度も復習を重ねることで覚えられてくる
- 個人的には、「第6章 ディープラーニングの手法」がきつかった・・
    - この章の復習は重点的に取り組んだ。試験でもかなり出題された

## アウトプットで使ったもの
### [徹底攻略ディープラーニングG検定ジェネラリスト問題集 第2版 (徹底攻略シリーズ)](https://www.amazon.co.jp/gp/product/4295011630/ref=dbs_a_def_rwt_hsch_vapi_tu00_p1_i0)
![image](https://images-na.ssl-images-amazon.com/images/I/51G6kmnZumS._SX350_BO1,204,203,200_.jpg)
- 通称黒本
- 黒本から同じような問題が出ると聞いたため、一通り解いた
    - 半日で解き終わった
- 問題の傾向はつかめた気がする

### [Study-AIさんの模擬試験](https://study-ai.com/generalist/)
- 利用申請を出すと無料で模擬試験を受験できる
- 本番と同じように、2時間200問、検索OKで解いてみた
    - 85％（223問中191問正解）とれた
    - とにかく時間がないから、瞬殺できるもの以外は後回しにする作戦を立てた
- これは本当にやっておいてよかった・・
    - 本番試験とかなり近い体験ができる
    - 試験でも似た問題が出た

### [公式例題](https://www.jdla.org/certificate/general/issues/)
- 試験前日に何となく解いてみたもの
- 残念ながら答えがない。ググれば個人のサイトに回答が載っている

## 試験当日
### 試験前
- 2時間ぶっ通しで試験のため、かなり疲れる。前日はよく寝て、当日も昼食後に仮眠をとった
- 自宅受験最高。夏で暑かったので、エアコンをつけて快適な温度にしておく
- 動作確認は必ずしておく
- モニター2枚用意
    - 1枚目は問題解く用、2枚目はググる用
- チートシートを用意しておく
    - 自分で作るのは大変だったので、[こちらのサイト](https://qiita.com/occam___razor/items/5b1384bdaf3a188cdfa2)のチートシートをお借りしました。超助かりました。ありがとうございました！！

### 試験中
- 瞬殺できる問題を先に解いて、ググれば分かりそうなもの、自信がないものは後回しにした
- 後回しにした問題は、チートシートを開いてCtrl+Fでとにかく検索。たいてい引っかかるので、チートシートを見ながら解答
- チートシートに載っていなかった場合は、Googleで検索。深追いすると時間なくなるから分からないものは諦めた
- 個人情報系の問題が多かった気がする
- 制限時間ギリギリに全問解き終わった

### 試験後
つかれた～～～～（バタン）
高速ググりのおかげで、合格を確信。

## 結果
![合格.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/f305d00a-3245-a29b-b43c-5c4ec4a21d9c.png)

わーい！合格してました！
そこそこ取れてた。よかったよかった～
合格するとSlackのコミュニティに参加できます。

## おわりに
学習を通して、AIに関する基礎知識を習得できてよかったです。
AI初学者でも合格できたので、興味がある方はぜひ受験してみてはいかがでしょうか。
「アーキテクチャ 'i386' をサポートしないため設定ファイル 'main/binary-i386/Packages' の取得をスキップ」の対処法、deb822の場合

apt update をしたところ次のようなN(Noticeの略)が表示されました。

```
N: リポジトリ 'https://apache.jfrog.io/artifactory/arrow/ubuntu jammy InRelease'
がアーキテクチャ 'i386' をサポートしないため設定ファイル 'main/binary-i386/Packages' の取得をスキップ
```

Apache Arrow に関するメッセージです。`[arch=amd64]` を設定してやればよさそうです。
そこで `apache-arrow.sources` を見てみます。

`cat /etc/apt/sources.list.d/apache-arrow.sources`

とすると、

```
Types: deb deb-src
URIs: https://apache.jfrog.io/artifactory/arrow/ubuntu/
Suites: jammy
Components: main
Signed-By: /usr/share/keyrings/apache-arrow-apt-source.gpg
```

何やら見慣れない感じのフォーマットでした。私達がよくみるフォーマットは次のようなものだと思います。

```
deb [arch=amd64,arm64,armhf] http://packages.microsoft.com/repos/code stable main
```

Google検索すると、新しいフォーマットは「deb822」という名前のフォーマットだそうです。
ここでは、[arch=amd64]を設定したいので 最後の行に　`Architectures: amd64` を追加して

```
Types: deb deb-src
URIs: https://apache.jfrog.io/artifactory/arrow/ubuntu/
Suites: jammy
Components: main
Signed-By: /usr/share/keyrings/apache-arrow-apt-source.gpg
Architectures: amd64
```

とします。これで通知が表示されないようになりました。

この記事は以上です。
NextLinkでComponentを囲ったら、Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? Check the render method of Link.のエラーがでた

個人の備忘録です。

# 環境
- react: 17.0.2
- react-hook-form: 7.28.0
- next: 11.1.3
- chakra-ui: 1.8.5

# やりたいこと
- chakra-ui の Link を component 化してラップして使いたい

# エラーの再現
```tsx:component
export const LinkComponent = ({ children, ...props }: LinkProps) => {
  return (
    <Link _focus={{ boxShadow: 'none' }} {...props}>
      {children}
    </Link>
  );
};
```

```tsx:使用側
import NextLink from 'next/link';

<NextLink href={'/hoge'} passHref>
  <LinkComponent>一覧に戻る</MwLink>
</NextLink>
```

# 調査
- https://stackoverflow.com/questions/66421459/warning-function-components-cannot-be-given-refs
- https://github.com/vercel/next.js/issues/7915

# 公式
- https://nextjs.org/docs/api-reference/next/link#if-the-child-is-a-functional-component
- 公式には以下のように記述がありました
> Linkの子がfunctional componentの場合、passHrefの使用に加えて、React.forwardRefでコンポーネントをラップする必要があります。

# やったこと
- ref を使う
- ただ、以下の記述だと別のエラーが出る

```tsx
import { forwardRef, LegacyRef } from 'react';
import { Link, LinkProps } from '@chakra-ui/react';

export const LinkComponent = forwardRef(function MwLinkFunction(
  { children, ...props }: LinkProps,
  ref
) {
  return (
    <Link
      _focus={{ boxShadow: 'none' }}
      {...props}
      ref={ref as LegacyRef<HTMLAnchorElement>}
    >
      {children}
    </Link>
  );
});
```

- [気にしなくても良いという記事](https://zenn.dev/so_nishimura/articles/c4df97cd1937c2)も見受けられたが、解消したい

```plaintext:error
Warning: Can't perform a React state update on an unmounted component.
This is a no-op, but it indicates a memory leak in your application.
To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
at SearchSpecialistContainer
```

# 解決方法
- 以下で今までのエラーが出なくなった

```tsx
import { Link, LinkProps } from '@chakra-ui/react';
import { forwardRef } from 'react';

const LinkComponent = forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {
  const { children, ...linkProps } = props;
  return (
    <Link _focus={{ boxShadow: 'none' }} {...linkProps} ref={ref}>
      <>{children}</>
    </Link>
  );
});

LinkComponent.displayName = 'LinkComponent';
export default LinkComponent;
```
BluePrism から外部コマンドに複雑なパラメーターを渡す（cmd.exeのエスケープで困らないTips）

# はじめに
Blue Prism から外部のコマンドラインユーティリティを叩くために、`Utility - Environment::Start Process Read Stderr and Stdout`など利用するシーンがあると思いますが、その際の引数にスペースやダブルクオート`"`、バックスラッシュ`\`が入っていたりすると、cmd.exeのエスケープが複雑すぎて制御不能になることがありました。

本記事は、上記問題を以下の方法で回避することができる、という小ネタです。

1. 外部のコマンドライン側をwrapして、jsonファイルに書かれた引数を読むようにする
1. Blue Prism 側で一時ファイルを作成し、コレクションで作成した引数を jsonファイルとして書き込む
1. Blue Prism 側から、json形式の一時ファイルを引数として、外部コマンドラインを `Utility - Environment::Start Process Read Stderr and Stdout`経由で実行する
1. Blue Prism 側で一時ファイルを消す

# 実装の手順

## Blue Prism 側で一時ファイルを作成するオブジェクトを準備する

[Path.GetTempFileName メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.io.path.gettempfilename?view=net-6.0) というメソッドがあるので、それを叩くオブジェクトを作成します。

> 65535 を超えるファイルを作成しようとした場合に、 IOException をスローします

上記制限があるので、使い終わった後は必ず消すように、Blue Prism 側でのハンドリングが必要ですね。

オブジェクトスタジオの初期化ページで[コードオプション](https://bpdocs.blueprism.com/bp-6-10/ja-jp/frmStagePropertiesObjectInfo.htm) を下記のように設定します。
![code_option.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/68a5abb3-ee02-521a-20d7-8af6099aec07.jpeg)

コードステージの中身は1行です。

![codestage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/aa822372-2c6a-a9db-fb55-f97dba1a3aec.jpeg)

## Collection で用意した引数を一時ファイルに書き込む

`Utility - JSON::Collection to JSON` で渡したい引数をJSON文字列に変換します

`Utility - File Management::Write Text File` で文字列を一時ファイルに書き込みます

## 呼び出されるコマンドユーテリティ側

python だとこんな感じです。

```python
import sys
assert len(sys.argv) == 2, "引数にファイルパスを指定してください"

import json

with open(sys.argv[1], encoding='utf-8', mode="r") as f:
    content = f.read()
    params = json.loads(content)
    # params は dict なので、params["param_name"] のように引数名のキーでパラメーターの値にアクセスできます 
```

## 利用した一時ファイルを削除する
`Utiliti - File Managment::Delete File` で一時ファイルを削除します。

> 65535 を超えるファイルを作成しようとした場合に、 IOException をスローします

上記の制限があるため、使い終わった一時ファイルは削除します。

## 以上の操作をまとめたプロセス

本来は例外発生時にも一時ファイルを削除するなどのハンドリングが必要かと思います。

![sample_process.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/369ee797-45ec-774a-6470-35aaf42b14e2.jpeg)
SAA学習方法メモ（未経験）

# SAA取得までの学習

インフラエンジニアを目指し転職をしてから初めて資格を取得しました。
LinuC　Level1とAWSのSAAで迷いましたがクラウドの勉強をしたいと思い学習をしてきました。
試験内容は自分の中ではとても難しく合格できるとは思っていませんでしたが、ぎりぎり合格することができました。
合格するまでにどのような勉強をしてきたか経験をシェアできればなと思いました。

## 学習内容

### 受験者　
AWSにほとんど触れたことないEC2、VPCなどを少し触れたことがある程度（未経験者）
8月いっぱいで試験内容がアップデートされるそうなのでなるべく急いで受験しなければと焦っていました。

### 学習時間　

おそらく200時間

### 学習期間　

およそ１ヶ月

### 受験回数
 
１回（受験費用が16500円と高額な為何回も受験するのは金銭的に厳しいと思いました。。。）


### 使用教材

・[改訂新版-AWS認定-ソリューションアーキテクト-アソシエイト教科書［SAA-C02］対応-徹底攻略シリーズ](https://www.amazon.co.jp/改訂新版-AWS認定-ソリューションアーキテクト-アソシエイト教科書［SAA-C02］対応-徹底攻略シリーズ-ebook/dp/B08SGSD479)
単語やサービスの内容を理解するために買いました。図などで使用して説明をしているためわかりやすいと思いました。

・[【2022年版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)
ハンズオンで説明してくれていますが、講座の時間が46.5時間と長いと感じた為最初は使っていた最後まで通してみることはありませんでした。最後に模擬試験がある為それを２回ほど解きました。

・[【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
初めて解いた時は正答率が30%ほどで絶望しました。最低でも正答率が80%を超えるまで全部を３、４周しました。模擬試験は６回分あるのですが６回目が難しく解説を読んでもあまり理解できませんでした。。。
本番と同じ問題数なため一回解くのにおよそ１時間かかるためとても疲れました。

・[pingt](https://ping-t.com)
単語とどのようなサービスなのかを理解するにはいいと思いますが、出題方法が本番の内容と違うのでほとんど使用しませんでた。



### 学習方法

・Udemyの模擬試験をメインに学習をしました。
・理解しづらいところは自分で図を書いて資格的に理解できるようにしました。
・わからないところはノートにメモを残しました。（１冊使い切るほど間違えたところはメモをしました。）
・教材やpingtはほとんど使いませんでした。
・わからない単語が出てきた際は自分が理解できるまで検索してなるべくわかりやすい説明をしてくれるサイトを探しました。未経験の私にはとてもわかりやすく助かりました→[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info)


### 学習をしていて苦労した点

・覚える量が多い
・模擬試験を解くたびに知らない単語が出てくるため絶望的になる
・教材を本でもサービスの内容は理解できたがサービスは基本的に単体で使うことがない為、他のサービスとの関連性を理解するのが大変
・便利な機能こそデフォルトで使用できるオプションが沢山あるため頭が混乱する
・S3やLambdaがよく出てきて混乱する
・APIがいまだに理解できてはいない。。。（API GatewayとLamdbaはセットのような形で覚えてしまっているが動くを深く理解できていない）

## まとめ
自分はノートに間違えたところを何回も書いて覚えるという方法が合っていた為そのように勉強をしましたが、勉強方法は人それぞれなので自分に合った勉強法ほを見つけるのが一番だと思いました。
今回たまたま合格はできましたが必要な改善点がある為これからも勉強は続けて行こうと思いました。
今後は自分で設定できるようになる為にAWSアカウントで触っていきたいと思います。
CSS: 「⚠danger-zoneなシマシマ」の飾り方

# 概要

⇩下図のような `.danger-zone` の視覚効果を与える装飾を CSS (SCSS&CSS3) で実装する実装例を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/5a580c08-4d2e-5517-f8e0-33b59b6f4090.png)

## 課題: .danger-zone の飾り方

次のような任意の `.some-container` に対して追加で適用し「⚠danger-zone」を意図したシマシマを表示しユーザーに注意を促す視覚効果を与える `.danger-zone` 装飾を定義したい。

```html
<div class="some-container danger-zone">
 <h1>⚠Caution-1</h1>
 <p>This is a danger zone.</p>
</div>
```

※「danger-zone」: この記事では危険を伴う操作UIなどユーザーに警告、注意を促したい領域等を意図します。
※「シマシマ」: ◤◢◤◢◤◢◤◢ 👈 こういうの。en-usで言うと stripe (すとらいぷ)。
※「danger-zoneを意図したシマシマ」: 工事現場、工場、踏み切り、災害現場、事故現場などで危険ないし注意を要する領域を視覚的に訴えたい場合に採用される🟨(黄色)と⬛(黒色)が斜めに連続したあの模様です。

### 実装例

対象の要素の `:before` と `:after` に空文字列の `content` を持ち `display: block` な要素を配置し、 `height` を決めて `background` に `repeating-liner-gradient` でシマシマを敷きます。

```scss
.danger-zone::before,
.danger-zone::after {
 content: "";
 display: block;
 height: 1em;
 background: repeating-linear-gradient(
  -45deg,
  black,
  black 1em,
  yellow 1em,
  yellow 2em
 );
}
```

## 応用課題: .danger-zone に高さ指定＆模様の自動拡縮を行う機能の追加

`.danger-zone` 改修し、適用する要素ごとに装飾部分の高さを変更できる仕組みが欲しい。但し、装飾部分の高さにあわせて模様も線形に拡縮されて欲しい。

### 実装例

`.danger-zone` の `height` とシマシマ模様を表現する `repeating-liner-gradient` の引数群に `calc` を追加し、 CSS 変数 `--danger-zone-scaling` とそれぞれの引数の基準値の積が与えられるよう変更します。

また、今回の実装例では "親切" として、 `--danger-zone-scaling` の標準値も `:root` で定義し、基準値ママで使用できればよいだけの場合にはユーザーコード側で `--danger-zone-scaling` が未定義でも意図した視覚効果が得られるよう蛇足します。

```scss
:root{ --danger-zone-scaling: 1 }
.danger-zone::before,
.danger-zone::after {
 content: "";
 display: block;
 height: calc(1em * var(--danger-zone-scaling));
 background: repeating-linear-gradient(
  -45deg,
  black,
  black calc(1em * var(--danger-zone-scaling)),
  yellow calc(1em * var(--danger-zone-scaling)),
  yellow calc(2em * var(--danger-zone-scaling))
 );
}
```

⇧CSS は ⇩HTML のように必要に応じて `style` 属性などから `--danger-zone-scaling` 変数を設定して使用します。

```html
<div class="some-container danger-zone">
 <h1>⚠Caution-1</h1>
 <p>This is a danger zone.</p>
</div>

<div class="some-container danger-zone" style="--danger-zone-scaling: 2">
 <h1>⚠Caution-2</h1>
 <p>This is a danger zone.</p>
</div>

<div class="some-container danger-zone" style="--danger-zone-scaling: 0.5">
 <h1>⚠Caution-0.5</h1>
 <p>This is a danger zone.</p>
</div>
```

### 動作例

- https://codepen.io/usagi-network/pen/yLKgGvw

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/ab4a49ac-a94f-0775-46b7-a2ed6add14eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/c7e30194-dc88-0483-3fac-16633beba3bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/2231c6c7-5eee-0d48-f15b-1715973454fe.png)

## 参考

- https://css-tricks.com/stripes-css/
- https://stackoverflow.com/questions/8833352/css3-calc-with-variables
- https://developer.mozilla.org/en-US/docs/Web/CSS/::before
- https://developer.mozilla.org/en-US/docs/Web/CSS/::after
- https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/repeating-linear-gradient
- https://developer.mozilla.org/en-US/docs/Web/CSS/--*
- https://developer.mozilla.org/en-US/docs/Web/CSS/:root
-
VueでWebアプリを作成#3:ヘッダーを途中まで作る

現場で使うVue.jsでアプリを作ろうとしています。
今日はヘッダーの作成。

ヘッダーはコンポーネントとして作成し、App.vueで読み込みます。
```php:components/AppHeader.vue
<template>
  <header class="AppHeader">
    <nav class="AppHeader__nav" aria-label="グローバルメニュー">
      <AppMenuTrigger />
      <div class="AppHeader__list" role="list">
        <div class="AppHeader__home" role="listitem">
          <router-link to="/" class="AppHeader__homeLink">
            <span class="AppHeader__headerLogo">
              <img src="@/assets/images/header.png" alt="ロゴ"/>
            </span>
          </router-link>
        </div>
        <div class="AppHeader__note" role="listitem">
          <router-link to="/production-note" class="AppHeader__noteLink">
          </router-link>
        </div>
        <div class="AppHeader__content">
          <AppMenu/>
        </div>
      </div>
    </nav>
  </header>
</template>
<style lang="scss" scoped>
.AppHeader{
    position:fixed;
    top:0;
    left:0;
    right:0;
    z-index:1;
    background-color:rgba(#fff,0.9);
}

.AppHeader__nav{
    padding:0 160px 0 38px;
}

.AppHeader__headerLogo{
    margin-left:300px;
    float:right;
}
</style>
```

```php:App.vue
<template>
 <div class="Site">
 <AppHeader />
    <nav>
      <router-link to="/">Top</router-link> |
      <router-link to="/about">About</router-link> |
      <router-link to="/author">Author</router-link> |
      <router-link to="/production">Production</router-link> |
      <router-link to="/faq">FAQ</router-link> |
    </nav>
    <router-view />
  </div>
</template>
<script>
  import AppHeader from "@/components/AppHeader.vue";

  export default({
    components:{
      AppHeader
    }
  })
</script>
<style lang="scss">
</style>
```
実行結果はこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/05e43876-4e76-2ad4-774b-fb51f2716a82.png)

課題は、vueでscssを使えるようにすることと、レイアウトが汚いのでcssで整えていくことです。
herokuでのdocker-compose.ymlの参照範囲について

# はじめに
先日投稿した記事にて、その時は気付かなかったのですが、今になって気になる事がでてきたので。

::: note info
気になった点
- herokuでイメージ・コンテナ作成するときは「docker-compose.yml」の「ports」って利用していないのでは？
:::

# 先日の投稿
https://qiita.com/std-flower/items/90379b9862b470b8e66f

# この部分
ポートフォワーディングをするため、ホストOSの環境変数[wk_port]を参照する場所ですが、本番環境（heroku）ではこの部分の設定が実質ない（heroku上の環境変数[wk_port]は未設定としているため）が、動いている。

heroku側で自動割当されたポート番号をここの「ports:」部分に入れているわけではないが、アプリケーションは実行できていることから、heroku側では「ports:」は参照していないのでは？
と思ったわけです。

```docker-compose.yml
version: '3'

services: 
 ＜サービス名＞: 
  build: 
   dockerfile: ./Dockerfile
  ports:
   - $wk_port:$wk_port
  environment: 
   wk_port: $wk_port
```

# 結論
結論は導き出せていませんが、それを確認するためのテストを実施し、次の投稿でその結果を載せたいと思います。

<b>＜　追記　＞</b>
結果はこちらです。

https://qiita.com/std-flower/items/b413a45c4a0eff686215
[C#] System.IO.PipelinesでReadOnlySequenceの扱いに悩んだのでSequenceReader使ってみた。

System.IO.Pipelinesに興味をもったので、試しに作ってみました。

題材はFileStreamから読み込んだデータを加工する処理をイメージしています。

https://github.com/panda728/PipeBenchmark

（追記：前のバージョンだと出力データまで計測していたので除外しました。これでデータ加工処理のみ計測できたかと）
|                     Method |       Mean |     Error |     StdDev | Ratio |      Gen 0 |      Gen 1 |     Gen 2 |     Allocated |
|--------------------------- |-----------:|----------:|-----------:|------:|-----------:|-----------:|----------:|--------------:|
|       UseStreamReaderAsync | 348.453 ms | 6.9207 ms | 12.3016 ms |  1.00 | 44000.0000 | 15000.0000 | 3000.0000 | 267,951,480 B |
|    Pipe_SeqPos_MemoryAsync |  12.857 ms | 0.0424 ms |  0.0354 ms |  0.04 |   203.1250 |          - |         - |   1,312,129 B |
|    Pipe_SeqPos_StructAsync |   8.830 ms | 0.0404 ms |  0.0378 ms |  0.03 |    62.5000 |          - |         - |     448,129 B |
| Pipe_SeqReader_StructAsync |   7.906 ms | 0.1535 ms |  0.2049 ms |  0.02 |    70.3125 |          - |         - |     446,217 B |
|           ReadStreamStruct |   5.128 ms | 0.0762 ms |  0.0595 ms |  0.01 |          - |          - |         - |         132 B |


#### 処理概要
1行分のデータを切り出して展開用のクラスに格納します。
クラスのプロパティで項目の値を管理します。
最終的にCSVっぽい形式でデータを出力します。

#### UseStreamReaderAsyncについて
StreamReaderを使ってクラスに展開→ファイル出力といった一般的なコード。
このお題だと、一度文字列に変換してから、項目ごとに切り出し、再び出力するだけなので効率悪いです。
変換せずにそのまま扱いたいですね。

#### Pipe_SeqPos_MemoryAsyncについて
Pipeのよくあるサンプルをベースにしたものです。
SequencePositionを使って改行コードを探す方式。
前のものに比べて文字列に変換しないので速いです。

https://docs.microsoft.com/ja-jp/dotnet/standard/io/pipelines

しかし、ここでつまづいたのがReadOnlySequenceの扱い方。

byte配列が欲しいけど、複数のセグメントに分かれた場合どう扱うんだろうと悩みました。
結局.ToArray()使ってコピーする方式になりました。

```C#
var line = lineSegment.IsSingleSegment
    ? lineSegment.First
    : lineSegment.ToArray();
```

#### Pipe_SeqPos_StructAsyncについて

先ほどの場合とほぼ同じですが
1行分を切り出した後、Span型のまま扱うことで効率よく処理できるかを確認しました。
Allocatedが減って効率良くなりました。
処理時間的には誤差の範囲。

#### Pipe_SeqReader_StructAsyncについて

タイトルにも書きましたが、SequenceReaderというものがあります。

https://docs.microsoft.com/ja-jp/dotnet/api/system.buffers.sequencereader-1?view=net-6.0

こちらを介して処理すると、いい感じに1行分のReadOnlySpanに切り出してくれます。
コードの方も見通しがよくていい感じです。

```C#
var sequenceReader = new SequenceReader<byte>(buffer);
while (!sequenceReader.End)
{
   while (sequenceReader.TryReadTo(out ReadOnlySpan<byte> line, _crlf))
      OutputReadOnlySpan(output, line);

   buffer = buffer.Slice(sequenceReader.Position);
   sequenceReader.Advance(buffer.Length);
}
```

後続の処理がSpanのまま扱えるならこの方が便利ですね。
Memory型で扱いたい場合はPipe_SeqPos_MemoryAsyncのパターンの方が便利かも。

#### ReadStreamStructについて
最後に比較対象としてPipeを使わないバージョン
固定長を前提にするならPipe使わない方がシンプルに書けますね。
Allocatedも最小なのでスピード狂にも安心です。

しかし、データ長が不明の場合には、
自前で改行コード探すことになるので大変そうです。

その場合は、Pipe使うと楽ができそうです。

あと、IBufferWriterを使ってみたかったのですが、使い方がよくわらかないので断念しました。今後の課題ということで。
30秒で分かるSnyk（脆弱性検知）

## はじめに
脆弱性検知を勝手にやってくれるサービスSnykがどんなものか30秒くらいで説明します。
登録方法は調べればすぐ出てくるので割愛します。

## 使い方
Githubと連携し追加したいプロジェクトを選択すると、このような画面になります。

![スクリーンショット 2022-07-18 11.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/601332c8-4e58-1513-f812-4953d1179044.png)

- コードにある脆弱性
- Dockerfileで追加しているイメージやモジュールの脆弱性
- 使っているライブラリ（今回はRailsなのでGemfile.lock）の脆弱性

を自動で検知してくれました。
Gemfile.lockの脆弱性を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/5cb8ceab-b26f-74e8-e526-1e15bb0c2dd0.png)

アプリケーションサーバーであるpumaのバージョンによる脆弱性とその中身（CVEとかのリンク）を教えてくれます。
今、v5.2.2使ってるから、4.3.12とか5.6.4使えばいいよって言ってくれてますね。
`Fix this vulnerability` ボタンを押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/98b87e3d-a398-5363-f8ba-5f651d33710d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/069c2c3f-6b78-e793-e8f0-74ddb15878bb.png)

こういうちゃんとしたPRを勝手に作ってくれます。


他にも、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/3f049161-0dad-cdaa-3065-afb85c560d56.png)

configの中で、SSL強制してないよとか教えてくれます。
ここはなんかPR自動作成とかはないんですが、1文コメントアウトを外すだけなので自分で作れますね。



## まとめ
無料なので、とりあえず導入しておけば良いかと思います！

CI/CDに組み込むこともできますし、脆弱性レベルによって挙動を変えることもできるらしいので、試してみると良いかと思います。（本当はこれに関する記事書こうと思ったけど、以下リンクと全く同じものになってしまうのでやめました。）
[[GitHub Actions] Snyk Node Actionを使ってCI Workflow上で脆弱性のチェックをしてみた](https://dev.classmethod.jp/articles/github-actions-checking-for-vulnerabilities-on-ci-using-snyks-action/)
【Python】map()・filter()関数の計算結果をprint()関数で出力する方法


# 初めに
pythonの勉強中にmap()関数の動作確認のため結果をprint()関数で結果を出力しようとしたら、map型のオブジェクトが出力されてしまい計算結果がわからなかったので、結果を出力する方法を調べました。filter()関数の場合も同様にfilter型オブジェクトになるので、同じ方法で出力可能です。

※間違っている情報等・不足している内容あればコメントいただけると幸いです。

# 環境
python: 3.10.4
OS: Windows 10 Home

# コード
以下の二つの方法のどちらかを使うことで、結果を出力できました

1. *(アスタリスク)を使ってアンパックする
   
2. list()を使ってリストに変換する 

サンプルのコードは以下になります。

```py
people = [("Abel", 20), ("Bob", 21), ("Cait", 16), ('Dave', 18), ('Eva', 19)]


def get_age(person):
    return person[1]

# 方法1：*(アスタリスク)を使ってアンパックする
ages = map(get_age, people)
print(ages)  # そのままだと<map object at 0x00000132C6A878E0>　と出力されてしまう
print(*ages)  # 20 21 16 18 19　とアンパックされて出力される

# 方法2：list()を使ってリストに変換する
ages2 = map(get_age, people)
print(ages2)  # そのままだと<map object at 0x00000132C6A878E0>　と出力されてしまう
print(list(ages2))  # [20, 21, 16, 18, 19] とリストで出力される

```

# 参考にした記事
- [Pythonのmap()でリストの要素に関数・処理を適用](https://note.nkmk.me/python-map-usage/)
画像など、マルチメディアデータの表現方法

画像や音声はディジタルデータへ変換することで、数値で表せるようにして扱う。

コンピュータが画像、音声、動画、自然界にある```いろいろな情報（アナログ情報）```を扱うためには```ディジタルデータへの変換```が必要となる。
### アナログ情報とは
境目なく連続して変化する情報のこと。
### ディジタル情報とは
ある範囲を規定の桁数で区切って数値化したもの
仮に1分を60秒と決め６０で区切って数値表現をする。

## 画像データは点の情報を集めたもの
コンピュータの扱う画像データの表し方はビットマップ方式だ。
細かいドットの集まり。
色は１ビットの場合２色白黒。
１６色で４ビット
```フルカラーで２４ビット```の情報量が必要。

画像のデータサイズ
ドットが縦横307200個、色数は２４ビット
両者をかけると```921,600```ビットになる。

### 気づき
ドット数と色数をかけると画像のデータサイズがもとまるのか。

## 音声データは単位時間ごとに区切りを作る
音声データはアナログの波形データを、ディジタル化して数値表現する代表格```PCM(Pulse Code Modulation)```方式です。
標本化して量子化して符号化する。

### 標本化(サンプリング)
アナログデータを一定の時間操作で区切り、その時間ごとの信号レベルを標本として抽出する処理
波形データに```縦の線で区切り```をつける。
この区切りの間隔をサンプリング周期という。
CDのサンプリング周期は1/44100秒になる。

アナログ信号から、一定の時間間隔で区切ってデータを採取することです。この時間間隔を「標本化周波数（サンプリング周波数）」と呼び、 Hz（ヘルツ）という単位で示します。 1 秒間に``` 1 回が 1 Hz``` です。
CD のサンプリング周波数は、44.1 kHz（キロ・ヘルツ）であり、```1 秒間に 44.1 × 1000 ＝ 44100 回```のデータの採取を行います。
出典 https://www.seplus.jp/dokushuzemi/fe/fenavi/easy_calc/sampling_voices/#:~:text=%E3%81%93%E3%81%AE%E6%99%82%E9%96%93%E9%96%93%E9%9A%94%E3%82%92%E3%80%8C%E6%A8%99%E6%9C%AC,%E3%81%AE%E6%8E%A1%E5%8F%96%E3%82%92%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

#### 気づき　
サンプリング周期は1/44100秒
```周波数が多ければ周期も1秒よりも小さくなる```のか。

### 量子化
信号レベルを```何段階で表現するか定め```、サンプリングしたデータを```その段階数に当てはめて整数化```に置き換える処理
データを```横に区切り```をつける。
これはビット数によって区切りの多さが違う。つまりビット数でどれだけの範囲の数字を表現できるかで決まる。８ビットよりも１６ビットの方が```多く区切る```ことができる。

### 符号化
```量子化で得た数値を２進数になおす。```

## 気づき
標本化(サンプリング)、量子化はビット数が多いと細かくディジタルデータに置き換えることができる。
つまり```原音に近いディジタルデータを作る```ことができる。

出典 キタミ式イラストIT塾 基本情報技術者　令和０３年
UIKitからSwiftUIの画面を呼び出す

SwiftUIに移行したくても、UIKitのコードがあるため中々移行できないアプリも多いと思います。
ただ、AppleのAPIがSwiftUIと共に提供しているものがあったりするので、そういう場合はUIKitからSwiftUIの画面を呼び出す必要があります。

addSubViewする方法も見つけましたが、ボタンを押したら画面遷移したかったので、その場合はこんな感じで呼び出せばいいようです。

```swift
self.present(UIHostingController(rootView: MySwiftUIView()), animated: true)
```
pythonで複数の値を返り値に持つときの型指定

# やりたいこと
以下のような関数があったとき、
返り値の型指定はどうすれば良いのか？

```python
def test():
  return 1, "a", {3, 5}
```

# 解決法
```python 
from typing import Tuple

def test() -> Tuple[int, str, set]:
  return 1, "a", {3, 5}
```

# setの型までちゃんと指定したい場合
```python 
from typing import Tuple, Set

def test() -> Tuple[int, str, Set[int]]:
  return 1, "a", {3, 5}
```

# 解説
python関数で複数の返り値がある場合、原則としてtupleとして返される。
```python 
from typing import Tuple, Union
def test() -> Tuple[Union[int, str], int, set]:
  return "1", 2, {1,64, 4}
print(test())  # ("1", 2, {1,64, 4})
```
【AWS】ElastiCache

# ElastiCache
AWSが提供するインメモリ型データベースサービスのこと。
高頻度で参照するデータや検索に時間がかかるデータセットをメモリ上に保持するもの。
毎回ネットワーク経由でアクセスすることを避けられるのでパフォーマンス向上につながる。


# インメモリ型とは？
>コンピューターのメモリ（主記憶装置）上でデータを管理するデータベースです。ハードディスクやSSD（補助記憶装置）上にデータを保管する従来のデータベースよりも高速にデータの読み書きが出来るのが特徴。
しかしメモリには大きな弱点もあります。現在のコンピューターで主に使われているメモリであるDRAMは電源の供給がなくなる、つまりコンピューターの電源がオフになると保存されているデータが消失することです。

引用：[インメモリデータベースのメリット・デメリットとは](https://products.sint.co.jp/siob/blog/in-memory-databases)


# Memcached版
簡易版。メンテナンスや障害による再起動が行われた場合は全てのデータが削除されてしまう。


# Redis版
ちゃんとした版。ノード間のレプリケーション機能（レプリカ＝複製を作る機能のこと）やデータ永続性機能といった可用性麺も考慮されている。

# CDNとの比較
ElastiCacheの方がガチ。
>コンテンツデータをキャッシュして瞬時に配信する場合は、「Amazon CloudFront」などの高速コンテンツ配信ネットワーク (CDN) サービスの利用でもいいと思いますが、リアルタイムにデータを頻繁にやりとりして処理し、瞬時に応答しなければならないアプリケーションの場合はAmazon ElastiCacheが向いているでしょう。

# 参考
https://products.sint.co.jp/siob/blog/in-memory-databases

https://business.ntt-east.co.jp/content/cloudsolution/column-114.html
セキュリティバイデザイン とは

## 勉強前イメージ

システムの構成を考えるときにセキュリティをどこに置くかみたいなこと考えること？？

## 調査

### セキュリティバイデザイン とは

英語で Security by Design と書き、
システムの導入時に企画設計の段階でセキュリティ対策を組み込んで考えることでセキュリティを確保する考え方になります。

これは、内閣サイバーセキュリティセンター(NISC)によって
`情報セキュリティを企画・設計段階から確保するための方策` と定義されています。

特にIoTのシステムについて、近年IoT機器の脆弱性やサイバー攻撃などが増加しており
安全性を高めるためにセキュリティバイデザインの考え方が必要になります。

### セキュリティバイデザインのメリット

- 手戻りが少なく期限が守れ、コスト削減になる

あとからセキュリティのことを考えて導入するより、先に考えておいたほうが
見直しなどが入っても最小限の工数で修正することができ、
結果的に期限が守れてコスト削減になります

- 保守性の向上

先にセキュリティのことを想定しておくことで工数も確保できます。
そのため急ピッチで作るよりセキュリティを担保できます。

## 勉強後イメージ

イメージ合ってた。
これって基本IoTのことみたいだけど、普通のシステムでもあとでになりがちだから
できるだけ最初にセキュリティのことは考えておこうねってことかな。

## 参考

- [セキュリティバイデザインとは？必要性やメリット、注意点について徹底解説](https://cybersecurity-jp.com/security-measures/29134)
- [セキュリティ・バイ・デザイン](https://www.nec-solutioninnovators.co.jp/ss/insider/security-words/25.html)
html table のヘッダーをスクロール固定する

## 要件
htmlページで大きなテーブルをスクロールバー付きの小さいボックスに収める。
ヘッダー見出し行および列はスクロールしても動かないようにする。というもの。

## 実装
[codepen](https://codepen.io/cfd-ack/pen/mdxRQKe)　埋め込みが小さいのでHTMLタブをオフって下さいorz
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="mdxRQKe" data-user="cfd-ack" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/cfd-ack/pen/mdxRQKe">
  Untitled</a> by cfd-ack (<a href="https://codepen.io/cfd-ack">@cfd-ack</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

確認済み
Chrome: 103.0.5060.114
FireFox: 102.0.1

※これでもまだ業務レベルで使えないので、さらに改良を入れる予定。（要javascript）

## ポイント（多い・・・

* table {border-collapse: separate;} // collapse では色々問題がある模様
* table {border-spacing: 0;} // デフォルトで空いているのが意味不（個人的な感想です）
* table {table-layout: fixed;} // 列幅を固定するのに必須
　列幅を動的にすると行ヘッダの２列目以降の sticky left にjavascript必須
* table {box-sizing: border-box;} // 列幅の指定を罫線とpadding込みでの指定にする
　ブラウザのデフォルトで指定されている模様・・・
* thead {position: sticky; top:0;} // ヘッダ行(複数)をスクロール固定
* table の幅は各列の幅の合計と同じにする（めんどいけど複数列の行ヘッダでは必要）
* 列幅は colgroup/col で指定、nth-child(i) を使えばクラス名を生やさなくてもいける。
* 行ヘッダ横スクロール固定も nth-child(i) を使用して sticky とし、left はそれまでの累積。
　セルの結合 colspan/rowspan による「被結合セル」は display:none にしている。
　このため nth-child がズレることはない。
　（結合に関わらず行列の数に合わせたセル td/th を生やし、display:none を適用。
　　動的に結合を変更するのも楽。rows/cellsコレクションのインデックスも単純明快に。
　　これはIEや旧Edgeでも有効なTipsなんだけどヨソで見たことない・・・）

## 感想
浦島だったhtml5および最新のスタイルシートでは割と楽に実現できるようになっていた。
ただ、業務レベルで使用するきっちりした見栄えの表を目指したら結構大変だった。

※ググって調べた各種サイトのものでは不満足だったので、試行錯誤した。
（技術系の調査だと昔に比べてGoogle先生が腐っている場合が多いような・・・
oldNews という Web サービスをリリースした

<font color="FireBrick">※ 2023/03/21 にサービス閉鎖しました :pray: </font>

# 🙋‍♀️ はじめに
前から個人的に欲しいなと思っていた Web サービスが形になったので紹介。
※ 期待値は下げて欲しいのと、レスポンス時間もアレなのでご了承

👉 <a href="https://oldnews.media/" target="_blank">oldNews</a>

# 📕 サービス概要
どんなものを作ったのか。

◯年前の今日に起きた出来事を教えてくれる。例えば、`56年前の今日（7月18日）、アメリカで有人宇宙船「ジェミニ10号」打ち上げ` がされたそう。ちなみに、情報ソースとしては Wikipedia を使わせてもらっている。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627625/3649a920-439f-f144-1fdd-0f438bac3cfe.jpeg" width=50%>

最初はニュース系のアプリっぽくカテゴライズ（エンタメとかテクノロジーとか）しようと思って検証していたけど、結構出来事の内容に偏りがあったり、そもそも精度がアレで見にくかったのでやめた。流石に全部並べるのは醜かったので、代わりにその出来事がいつ起きたかで区分けするようにした。

ある出来事について、関連するリンクも表示するようにした。詳細を知りたくなった時にググることが大半だと思うので、その手間を省ける。個人的にはこれが地味に嬉しかったりする。関係ないのがあったりはするんだけど、まあないよりかはマシかなと。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627625/4f20d597-a26f-57bc-c728-967ea2502dc4.jpeg" width=50%>

後、出来事に対して、いいね出来る。よりいいねされた出来事が上位に表示されるようになる。表示するタイミングでその結果が変わるので、もし見たらいいねして欲しい。他の閲覧者がどんなことに関心を持っているのかは単純に気になる。

# 🤔 作った理由
端的に言うと、自分が欲しかったからだけど、もう少し深ぼると、リラックス効果と視野を広げるためなのかな、と思い始めてきた。

日常には様々な「今」が溢れている。次から次へとやるべきことが降ってきて、リアルタイムで起きていることが共有されていく。それはそれで日々が充実していると言えるし良いことだと思う。一方でそればかりになってしまうと視野が狭くなったり、息切れしてしまう。そんな時に、普段意識しないスパンで過去に想いを馳せることには、一定のリラックス効果がありそう（トリビアの泉（懐かしい）の「へぇ〜」のあの感覚）。◯年前の今日の出来事を知って、膨大な時間の流れに意識を向けることは非日常であって、少しでも日常から解放されることにリラックス効果があるのではないかと。それなら例えば映画であったりと他にも手段あるのでは？と思うけど、その非日常が現実に起きていて、少なからず今の日常と地続きにあると思える方が、よりその効果を倍増させるように感じる。

↑に加えて、自分の視野を広げるために、新しいことを知るきっかけが欲しい。きっかけさえあれば、そこから興味の持ったものを調べていって、その知識がどこかで線になったりしたら。普通に生活している中では、そもそも知るきっかけのない情報。それを知るための手段はその他にもあるけど、なるべく効率的に、かつ定期的に確認する仕組みが欲しかった。

# 👨‍💻 技術スタック
真新しいものは何もない。。欲しいものを最低限に形にしたかったので。

- FW
    - Rails
    - Vue.js
    - JQuery
- インフラ
    - Heroku
    - postgre
    - Redis

# 🏃‍♂️ 終わりに
基本的にはクロールしてきた情報を表示しているだけなので、機能的な追加はなさそう。ただ、いくつか内部的な機能改善（キャッシュとか）でいくつかやりたいことがあるのでまた時間があったら。

実際に使っての感想としては、まあまあ良い。大半は流し読みしてしまうけど、たまに「へぇー」と思うものもあったりして、そこから気になったものを別途調べてみたり（実際に行ってみたいなと思うものもいくつかあったり）。ふとした瞬間の息抜きになったり、何か興味を持つきっかけになったら嬉しい。
GoLandでGOROOTとGOPATHを設定する（anyenv, goenv使用）

## 概要
Golandを使用したGOROOTとGOPATHの設定をします。
プロジェクト内で `go install` をする前に設定しましょう。

## はじめに
anyenvでgoenvが使える状態にします。
Goバージョン1.17.2を使用

```shell
% anyenv install goenv
% goenv install 1.17.2
% goenv local 1.17.2
```

GoLand 2022.1.3を使用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360277/6279895c-80e7-a695-a023-4cba37e859ad.png" width="400">

「File」→「Preferences」→「Go」

で設定へ進みます。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360277/e1bd5261-f747-f89a-0e8b-296c319c6094.png">

## GOROOT（Go SDK）

/Users/hoge/.anyenv/envs/goenv/versions/X.X.Xを指定します。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360277/9a0ce9e4-aeed-ccc5-6965-252b6f3b8dc2.png">

## GOPATH

/Users/hoge/go/1.17.2を指定します。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360277/ae58bd9e-51a1-9a3e-0fe1-3ddf592c9e9b.png">

## 終わり

以上で設定終わりです。
`go install hoge` など行い、パッケージが正しく読み込まれているか確認してみてください。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360277/aa364f38-02c9-134b-2939-095754ace8ea.png">
cscの作法 その243

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
guiでファイルをhashしてvirustotalに投げて、判定せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/60b5afd5-d9a9-8b83-c82f-7930c1599d79.png)


# サンプルコード

```

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Windows.Forms;
using System.Drawing;
using LitJson;
using System.Net;
using System.Net.Http;

class form1: Form {
	private TextBox textBox1;
	private TextBox textBox2;
	form1() {
		Text = "virustotal";
		ClientSize = new Size(300, 400);
		Button btn1 = new Button();
		btn1.Location = new Point(150, 150);
		btn1.Text = "check";
		btn1.Click += btn1_Click;
		textBox1 = new TextBox();
		textBox1.Location = new System.Drawing.Point(30, 30);
		textBox1.Multiline = true;
		textBox1.Size = new System.Drawing.Size(250, 50);
		textBox1.TabIndex = 2;
		textBox2 = new TextBox();
		textBox2.Location = new System.Drawing.Point(30, 230);
		textBox2.Multiline = true;
		textBox2.Size = new System.Drawing.Size(250, 50);
		textBox2.TabIndex = 2;
		Controls.AddRange(new Control[] {
			btn1,
			textBox1,
			textBox2
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		string BaseDirectory = Environment.CurrentDirectory;
		string fileContent = string.Empty;
		string filePath = string.Empty;
		using (OpenFileDialog openFileDialog = new OpenFileDialog())
		{
			openFileDialog.InitialDirectory = BaseDirectory;
			openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
			openFileDialog.FilterIndex = 2;
			openFileDialog.RestoreDirectory = true;
			if (openFileDialog.ShowDialog() == DialogResult.OK)
			{
				filePath = openFileDialog.FileName;
				Console.WriteLine(filePath);
				byte[] byteValue = File.ReadAllBytes(filePath);
				SHA256 crypto = new SHA256CryptoServiceProvider();
				byte[] hashValue = crypto.ComputeHash(byteValue);
				var hash = String.Join("", hashValue.Select(x => x.ToString("x2")).ToArray());
				Console.WriteLine(hash);
				textBox1.Text = hash;
			}
		}
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
		string url = "https://www.virustotal.com/vtapi/v2/file/report?apikey=******&resource=" + textBox1.Text;
		HttpClient client = new HttpClient();
		string response = client.GetStringAsync(url).Result;
		LitJson.JsonData json = LitJson.JsonMapper.ToObject(response);
		try
		{
			Console.WriteLine("total: " + json["total"]);
			Console.WriteLine("positive: " + json["positives"]);
			textBox2.Text = json["positives"] + " / " + json["total"];
		}
		catch (Exception ex)
		{
			Console.WriteLine("pass");
			textBox2.Text = " pass";
		}
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}




```

以上。
WindowsにRemoteアクセス(RemoteDesktop)し、キーボードで日本語入力切替

2021年当初までは、Remoteアクセスで困らなかったのですが、
2021年3月頃のWindows update以降リモートアクセスによるキーボードが英語キーボードになったことに始まり、
２０２２年7月頃のWindows updateでレジストリのキーボード情報がリセットされたり、
何度も設定し直す必要性を感じ、備忘録として残しておきおます。
## 問題点：
* キーボードが英字キーボード
* 入力切替をキーボードで行えない。

リモートアクセスはもちろんですが、Mac上の仮想環境のWindowsに対しても同様のようです。

## 解決策①：レジストリ情報変更
1. レジストリ情報を変更
    1. レジストリエディター起動
    regeditを検索してレジストリエディターを起動
    1. キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN
    へ頑張って移動
    1. 変更必須：
    名前 : 00000000
    値　：kbd106.dll
    1. 変更任意：
    名前 : 00010002
    値　：kbd106.dll
    私は、変更しています。

## 解決策②：必要に応じてIME変更（キーボードの機能割当変更）
1. キーボードに「半角/全角」キーがない場合は、行うと良いです。
キーボードで入力切替可能にします。
通常のキーボード入力も変更になります。
    1. まずは、 キー設定を可能にするために、以前のIMEのバージョンに戻します。
    「⚙設定」→「時刻と言語」→「言語」
    →「優先する言語」の下の「$\vdots$$\vdots$日本語」→「$\cdots$」→「$\cdots$　言語のオプション」
    →「キーボード」タイトルの下の「Microsoft IME」→「$\cdots$」→「$\cdots$　キーボードオプション」
    →「全般」
    →「互換性：以前のバージョンのMicrosoft IMEを使う」を「オン」
    1. MacやChromebookのようにスペースキーの左右の入力切替キーを反映します。
    タスクバーの「Microsoft IME」を右クリック→「プロパティ」
    →「詳細設定」→「全般」タグ→「編集操作：『変更』」
        * 必須　　　　：「*キー：無変換 ➡ 入力/変換済み文字なし：IME-オフ」
        * 必要に応じて：「*キー：変換 ➡ 入力/変換済み文字なし：IME-オン」
    * 「変換」はスペースキーで対応可能ですが、
    「無変換」も活用したい場合は、ファンクションキーのショートカットを活用してください。
    『F6』 ：「ひらがな」に変換
    『F7』 ：「全角カタカナ」に変換
    『F8』 ：「半角カタカナ」に変換
    『F9』 ：「全角アルファベット」に変換
    『F10』：「半角アルファベット」に変換
Salesforceで今日から1か月後の日付に更新するフローを作成しよう

Salesforceで
・今日の日付からぴったり１か月後に日付項目を更新したい

という要望を叶える方法を紹介します


これは「ADDMONTHS」関数を使用することにより対応可能です。

「ADDMONTHS」関数の詳細はこちらのヘルプをご確認ください


### ADDMONTHS
指定した日付の指定の月数前または後の日付を返します。指定された日付が月の最終日の場合、結果の日付は、結果の月の最終日になります。それ以外の場合、結果の日付の内容は、指定した日付と同じになります。

使用方法
ADDMONTHS (date, num)。date に開始日、num に追加する月数を指定します。

汎用的な例
汎用的な例 ADDMONTHS (StartDate, 5)
開始日に 5 か月を追加します。たとえば、開始日が 2017 年 9 月 20 日の場合は結果の日付が 2018 年 2 月 20 日になり、開始日が 2017 年 9 月 30 日の場合は結果の日付が 2018 年 2 月 28 日になります。
https://help.salesforce.com/s/articleView?id=sf.customize_functions_addmonths.htm&type=5


では、実際にADDMONTHS関数を使用した自動化を作成します。


今回はフローの作成の方法を示します。

フローの数式の作成は以下となります


データ型：日付型

数式
ADDMONTHS(TODAY(),1）
![フロー日付.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2953c979-5f4b-184d-debc-c6b97270d0b4.png)


もしも今日から2か月後にしたい場合は数式を
ADDMONTHS(TODAY(),2）

 に変更すれば可能です。


１か月後、２か月後、〇か月後の日付を表示したい。という場合、ぜひADDMONTHS関数をご活用ください。
HPEサーバ用の ESXi をダウンロードする。

HPのサーバって HPがカスタムした インストーラーを 使って インストールすると 痛い目に合わなくて済むと 聞いていた。

最近 HP の マイクロサーバ N54L が 熱で 壊れて 再構築しようとしたら N54L が サポートされていた 6.5 が 標準では ダウンロードできなくて どうしようかと なやんでるときに この話を 思い出した。

ググったらHPE の ページ 
[VMware ESXi Image for HPE servers](https://www.hpe.com/pt/en/servers/hpe-esxi.html)
が 見つかって りんくを たどっていったら

[vmwareのダウンロードページ](https://customerconnect.vmware.com/jp/downloads/details?downloadGroup=OEM-ESXI65U3-HPE&productId=614&download=true&fileId=c314c6bba6360e86f6cd245175b32934&uuId=492ca424-b69c-484b-a007-b6407537f614 )に たどり着いた。

いま ダウンロードしている。

これで 再構築できるかなぁ
AWS Global Acceleratorについて（自分用メモ

AWS Global Acceleratorは、ユーザーからAWSリソースまでのアクセス経路をAWSネットワークを利用して最適化するサービス。通常、ユーザーがAWSリソースにアクセスする時、AWSリソースがあるリージョンまでに経由するインターネット回線の影響を受けるため、遅延の発生やデータ損失などのリスクがあります。Amazon Global Acceleratorは、ユーザーと地理的に近いエッジロケーションから高パフォーマンスなAWSネットワークを経由してAWSリソースへアクセスするため、遅延の発生やデータ損失などのリスクを少なくします。

Global Acceleratorの機能

■リージョン間の負荷分散
複数のリージョンで展開しているWebアプリケーションなどへのリージョン間の負荷分散が可能です。負荷分散先（エンドポイント）はALB、NLB、EC2インスタンス、Elastic IPアドレスを指定できます。
負荷分散については「ELB」分野の参考【負荷分散（ロードバランシング）】を参照してください。

■エンドポイントのヘルスチェック
ELBと同様に、Global Acceleratorにもヘルスチェック機能があります。ヘルスチェックで異常となったエンドポイントは、負荷分散先から除外されます。

■固定パブリックIPアドレスが利用可能
Global Acceleratorは2つの固定パブリックIPアドレスを保有しており、ユーザーはこの固定IPアドレスへアクセスします。エンドポイントが増減してもIPアドレスに影響なくサービスを継続できるため可用性が向上します。
また、Elastic IPアドレスを割り当てられないALBへのアクセスが、Global Acceleratorを利用して固定IPアドレスでアクセス可能になります。
LinuxでNetworkNamespaceを一括削除する

LinuxでNetworkNamespaceを一括削除しようと以下のコマンドを実行した。
~~~
$sudo ip -all netns delete
~~~
その結果、下記のようなエラーを返された。
~~~
Option "-all" is unknown, try "ip -help".
~~~
調べてみると、iproute2がインストールされていないと -all オプションは使えないらしい。
そこで、代わりに以下のコマンドを実行。一括削除できた。
~~~
$sudo ip netns | xargs -I {} sudo ip netns delete {}
~~~
まあこんなコマンドを覚えるより、さっさとiproute2をインストールすればよかったというお話でした。
iOSのビルド中に出るエラーでありがちなミス

![スクリーンショット 2022-07-12 8.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/c6a4cb07-91e4-7473-038d-e8dad59f9992.png)

```
Could not build the application for the simulator.
Error launching application on iPhone
```
や
```
Error running pod install
Error launching application on iPhone
```
に囚われて、それ以外の`error`を見落とすことがある中`null-safety`問題で警告を無効にして解決した時の一文です。
![スクリーンショット 2022-07-12 8.46.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/3746b704-8174-0010-669b-0efcf253ba75.png)
```
// ignore: import_of_legacy_library_into_null_safe
```
こちらを`import`で警告されている行の上に記述して下さい。
matplotlib: エクセルからデータを読み取り描画する事例

# はじめに
久しぶりの投稿になります。
最近、エクセルからデータを読み取ってmatplotlibで作図する必要が生じたので、その再作成したPythonプログラムを残しておこうと思います。

# 作例
まず、作例として、元データとなるエクセルの表と作成したグラフを示します。

![Screen Shot 2022-07-18 at 8.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/f5d4adf1-f97d-4a49-27d0-bfb666574fa0.png)

![fig_freq.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/01fa14da-15fe-4e5c-32dc-26f8f28fb998.jpeg)

# プログラム
上に示したエクセルの表から、２カラム目（B列）、９カラム目（I列）、10カラム目（J列）の4行目から17行目までを読み取り、グラフにしています。
グラフは、機械による励振振動数を示すもので、```fill```を用いてハッチングにより
その範囲を表示しています。

```python
import openpyxl
import numpy as np
import matplotlib.pyplot as plt


def drawfig(fmin,fmax,item):
    fsz=10
    xmin=0 ; xmax=150; dx=10
    ymin=0; ymax=15; dy=1
    iw=10
    ih=3
    plt.figure(figsize=(iw,ih),facecolor='w')
    plt.rcParams['font.size']=fsz
    plt.rcParams['font.family']='sans-serif'
    plt.subplots_adjust(left=0.25,right=0.95)
    tstr='Exciting frequency'
    plt.xlim([xmin,xmax])
    plt.ylim([ymax,ymin])
    plt.xlabel('Frequency (Hz)')
    plt.ylabel('')
    plt.xticks(np.arange(xmin,xmax+dx,dx))
    plt.yticks(np.arange(ymin,ymax+dy,dy))
    plt.grid(color='#999999',linestyle='solid')
    plt.title(tstr,loc='left',fontsize=fsz)

    n=len(item)
    yax=np.arange(1,n+1,1)
    plt.yticks(yax,item)
    n=len(item)
    ds=0.3
    for i in range(0,n):
        y0=i+1
        x1,x2=fmin[i],fmax[i]
        y1,y2=y0-ds,y0+ds
        xx=np.array([x1,x2,x2,x1])
        yy=np.array([y1,y1,y2,y2])
        plt.fill(xx,yy,color='#000080',fill=None, hatch='////')


    #plt.tight_layout()
    fnameF='fig_freq.jpg'
    plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
    #plt.show()

def main():
    fnameR='frequency.xlsx'
    wb = openpyxl.load_workbook(fnameR, data_only=True)
    sheet = wb['frequency']
    n=14
    item=np.full(n,'a',dtype=object)
    fmin=np.zeros(n,dtype=np.float64)
    fmax=np.zeros(n,dtype=np.float64)
    for i,rw in enumerate(range(4,18)):
        item[i]=sheet.cell(row=rw,column=2).value
        fmin[i]=sheet.cell(row=rw,column=9).value
        fmax[i]=sheet.cell(row=rw,column=10).value

    for i in range(0,n):
        print('{0:6.2f} {1:6.2f} {2:s}'.format(fmin[i],fmax[i],item[i]))

    drawfig(fmin,fmax,item)


#---------------
# Execute
#---------------
if __name__ == '__main__': main()
```

以上
[Laravel]withメソッドでN＋１問題を解決する

# はじめに
Laravelではリレーション定義を行ったモデルを使用することで**N+1問題**が発生します。

今回は**N＋１問題**を解決するために`withメソッド`を利用したので、備忘録として残しておきます。

https://readouble.com/laravel/8.x/ja/eloquent-relationships.html

# 環境
- Laravel：8.83.4

# 1. withメソッドとは
取得したModelインスタンスのリレーション先を事前に取得するメソッドです。
「**Eagerロード**」によって**N＋１問題**を解決するために利用されます。

https://qiita.com/179Bell/items/7b4f991816f63946e738

# 2. N＋１問題を解決する
今回はUserモデルに以下のようなリレーションを定義して進めていきます。

<details><summary><b>Userモデル</b></summary><div>

```php:app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
//略
    /**
     * リレーション - postsテーブル
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
//略
}


```

</div></details>

まずは`withメソッド`を使わずにデータを取得する場合から見ていきます。

## 2-1. withメソッドを使わない場合
全ユーザーを取得した後に、`動的プロパティ`でユーザーに紐づく投稿記事をそれぞれ取得しています。

```php:UserController.php
<?php

namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    public function index()
    {
        $users = User::all();

        foreach ($users as $user) {
            $user->posts;
        }
    }
}
```
`動的プロパティ`には**リレーション先のプロパティが参照されるまでロードされないという性質**があります。
そのため、今回の場合でいうと、ユーザーの数が増えるにつれてクエリの発行回数も増えていきます。
このような**N＋１問題**によるパフォーマンスの低下を招かないための対策として`withメソッド`を利用します。


## 2-1. withメソッドを使う場合
`withメソッド`で**Eagerロード**することでN＋１問題を解決します。
```php:UserController.php
<?php

namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    public function index()
    {
        $users = User::with('posts')->get();//変更

        foreach ($users as $user) {
            $user->posts;
        }
    }
}
```
今回の場合、ユーザー情報だけでなく投稿記事も**一括で取得する**ことでクエリの発行回数を減らしています。
`withメソッド`を使うことで、ユーザーの数が増えても、
`usersテーブル`のデータを取得するクエリと`postsテーブル`のデータを取得するクエリ、計２回のクエリしか発行されません。
このようにして事前にリレーション先のデータを取得することで**N+1問題**を解決することができます。

以上で実装完了です。
**N＋１問題**はWebシステムのパフォーマンス悪化につながるので、普段から意識しながらコードを書いていきたいです。

# 3. 参考文献

https://qiita.com/wim/items/66ae4e3a58427f86cb5f
【Swift】Binary operator '/' cannot be applied to two 'T' operands

# Binary operator '/' cannot be applied to two 'T' operands

## 解決策

ジェネリクスで割り算をしようと以下のコードを記述すると**Binary operator '/' cannot be applied to two 'T' operands**というエラーが出た。
解決策は使用するプロトコルを**Numeric**から**FloatingPoint**に変更することです。

```swift
// errorが発生する。
func divide<T: Numeric>(num1: T, num2: T) -> T {
    return num1 / num2
}

// errorが発生しない。
func divide<T: FloatingPoint>(num1: T, num2: T) -> T {
    return num1 / num2
}
```

## 原因

ドキュメントを確認すると、**Numericプロトコル**自体は乗算（掛け算）しかサポートしていなく、**AdditiveArithmeticプロトコル**を準拠していることで加算（足し算）と減算（引き算）を使用できるみたいです。
そのため**Numericプロトコル**では除算（割り算）は使用できず、四則演算をサポートするためには**FloatingPointプロトコル**を使用する必要があります。

## 参考

https://developer.apple.com/documentation/swift/numeric
https://developer.apple.com/documentation/swift/floatingpoint
https://stackoverflow.com/questions/47263849/binary-operator-cannot-be-applied-to-two-t-operands
機械学習に関する有益情報まとめ



[ニューラルネットの可視化](https://towardsdatascience.com/the-mostly-complete-chart-of-neural-networks-explained-3fb6f2367464)

[ニューヨーク大学の深層学習の講義の日本語版](https://atcold.github.io/pytorch-Deep-Learning/ja/)

[深層学習のチートシート（日本語版）](https://stanford.edu/~shervine/l/ja/teaching/cs-230/)

[東工大機械学習帳](https://stanford.edu/~shervine/l/ja/teaching/cs-230/)

[機械学習の研究者を目指す人へ](https://takahashihiroshi.github.io/contents/for_ml_beginners.html) 



[ML実験管理ツールW&B](http://maruo51.com/2020/02/17/wandb/)

[ML・DL・NLP・CVの体系的記事](https://yagami12.hatenablog.com/archive/category/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9)

[CV・MLエキスパート](https://cvml-expertguide.net/terms/dl-terms-list/)

[画像の自己教師あり学習](https://blog.recruit.co.jp/data/articles/ssl_vision_01/)

### Transformerに関する記事

[Transformerメタサーベイ](https://www.slideshare.net/cvpaperchallenge/transformer-247407256)

[より良いTransformerを作る](https://speakerdeck.com/butsugiri/yoriliang-itransformerwotukuru)



### Youtube
[アイシアさん深層学習プレイリスト](https://www.youtube.com/playlist?list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP&ab_channel=AIciaSolidProject)

[ソニー深層学習プレイリスト](https://www.youtube.com/c/NeuralNetworkConsole/playlists)

### メルマガ
[Weekly Machine Learning](https://www.getrevue.co/profile/icoxfog417)

### 勉強機会
[Machine Learning Bootcamp](https://rsvp.withgoogle.com/events/gdml-japan) 2022年7月21日 (木) 〜 2022年11月10日(木)

[cvpapaer.challenge サーベイメンバー](http://xpaperchallenge.org/cv/recruit)