OmniAICreator/Qiita-1.07M huggingface dataset:
Google Play のデータセーフティセクションのあれこれ

2022年4月までにGoogle Playに公開されている全てのアプリに対応が求められている「データ セーフティ フォームの回答」を頑張るためのあれこれをまとめておきます。

# はじめに

備忘録なので期待しないで。

当初は「データセーフティフォーム」と呼ばれていたけどいつの間にか「データセーフティセクション」になっていてよくよく見ると「データ セーフティ セクション」が正式な表記だったりした。


# 収集(collect)と共有(share)

一般的な「収集」と「共有」とは違う用語なので注意。

[Google Play のデータ セーフティ セクションの情報を提供する \- Play Console ヘルプ](https://support.google.com/googleplay/android-developer/answer/10787469?hl=ja) より抜粋。

- **「収集」**とは、ユーザーのデバイス外にアプリからデータを送信することを意味します。
    - **デバイス上でのアクセス / 処理**: アプリがアクセスするが、ユーザーのデバイス上でローカルで処理されるだけで、デバイス外には送信されないユーザーデータは、**開示する必要はありません**。
- **「共有」**とは、アプリから収集したユーザーデータをサードパーティに転送することを意味します。


# リンク集

## 公式情報

- [Google Play のデータ セーフティ セクションの情報を提供する \- Play Console ヘルプ](https://support.google.com/googleplay/android-developer/answer/10787469?hl=ja)
    - まずはこれを読む 

- [アプリがユーザーデータを収集、共有する仕組みを確認する  \|  Android デベロッパー  \|  Android Developers](https://developer.android.com/guide/topics/data/collect-share)


## SDK とか

- [Prepare for Google Play's data disclosure requirements  \|  Android  \|  Google Developers](https://developers.google.com/admob/android/play-data-disclosure#data_collected_and_shared_automatically)
    - **AdMob SDK** で収集・共有されるデータとか
    - AdMobに関するデータセーフティのGoogleグループのこのスレッドも参考に⇒ ["Data Safety" form for Admob](https://groups.google.com/g/google-admob-ads-sdk/c/2So-N4qi2xE)

- [GooglePlayのデータ開示要件に備える  \|  Firebase Documentation](https://firebase.google.com/docs/android/play-data-disclosure#remote-config)
    - **Firebase** の各SDKで収集・共有されるデータとか
- [Google Play Core Library の概要  \|  Android デベロッパー  \|  Android Developers](https://developer.android.com/guide/playcore?hl=ja#data-safety)
    - **Play Core SDK** のデータ セーフティ
    - `Play Asset Delivery`とか`アプリ内アップデート`とか`アプリ内レビュー`を使ってるなら必読。


## その他、事例とか

- [【GooglePlay】データセーフティの記述例 \| ゲーム制作の骨\(Tips\)](https://www.zkn0hr.com/google-play-firebase-admob-data-safety-example/)
    - **Firebase(Analytics, Crashlytics)とAdMobを使用しているアプリ** での、Google Playのデータ セーフティの記述例。

- [Google Playのデータセーフティに対応する \- Qiita](https://qiita.com/kobayashi_ryo/items/a8d22edd004939b6d824)
    - 主にPlayコンソールの操作方法
neosでlogix その53

#概要

niosでlogixやってみる。
SineWaveClipコンポーネント
Play One Shotノード、使ってみた。

#写真
![2022-01-21 02.47.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/154cb90a-5084-51b6-d98d-74f3dcdc1865.jpeg)


#手順

- devtooltipを装着
- 新規->空のオブジェクト
- コンポーネントを追加
- SineWaveClipを追加
- そのインターフェースを取り出す
- logixtooltipを装着
- Play One Shotをスポーン
- つなぐ

以上。
自動化、BI、AIの融合を解き明かす


アナリティクス（AI）とビジネスインテリジェンス（BI）の融合を理解していきましょう。これはかなり前から起こっています。
まず、[狩野モデル](https://www.productplan.com/glossary/kano-model/)に基づいた製品開発の視点で見てみましょう。このモデルでは、製品にはさまざまなレベルの機能があるとしています。たとえば、基本機能、競争優位性のある基本機能、様々な問題を解決する機能、お客様のポジティブな反応を引き起こす「エキサイティング」な機能、お客様が自社製品と他社製品のどちらを選ぶかを決定するのにキーとなる重要な機能、などです。
この考え方は、BIで起きている変化にも適用できます。ある期間、ある機能は注目される機能となり、その後、一旦ユーザーの興味関心は下がり、また役立つ機能だと再認識され、そしてある時に基本機能になるのです。
![clint-adair-BW0vK-FA3eg-unsplash-2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/5e6d45f3-8d29-4053-cadd-c4190c7f4df4.jpeg)


##従来のレポートによるBI

BIは今に始まったものではなく、数十年前から存在しています。比較的基本的な方法で、元々システムにあるデータと繰り返し実行機能で、定型帳票を生成してきました。例えば、ビジネスで発生したデータを集計し、年次報告書で活用されてきました。

ビジネスのリーダー層に本当の価値を提供するためには、より多くのレポートがより頻繁に生成される必要があります。しかしこれまで実際には、ボタンをクリックすると、大量のファイルを含むレポートが生成されて、集計担当者がそのデータを[扱いにくいスプレッドシート](https://blog.dataiku.com/financial-modeling-dataiku)にまとめ、分析を行い、調査結果をフォルダにまとめて、取締役会や関係者にプレゼンテーションを行って、部門のメンバー全体が忙しくなるほど、手作業による反復作業が行われていました。


##自動化から、ダッシュボードで自動化されたBIへ

企業はこれまで長い間、繰り返し作業を「自動化」してきました。さらに、ここ5〜10年の間に、データレイクやデータウェアハウスの整備に向けて、サイロ化された独自のシステムやデータを統合する方向に進んでいます。その目的はもちろん、作り込まれたレポートから、より価値のあるインサイトを提供することであり、これはまさに 「ビジネス・インテリジェンス 」の核心をなすものです。

この傾向は徐々に、自動化されたダッシュボードで、ビジネスの概要を把握しようとシフトしていきました。自動化されていなければ、繰り返し作業を手作業で行うことになり、業務効率が低下してしまいます。そのため、ほとんどのデータウェアハウスには、データをまとめるための（自動）抽出・変換・ロード（ETL）機能が搭載されていますが、これは単なるコピー作業である場合もあります。
		
通常、自動化とBIは密接に関連しています。年に数回しかレポートを作成できない場合でも、本当は毎日もしくは毎週レポートを更新することが求められているはずです。そのBIは自動化しなければ成り立ちません。BIも自動化もビジネスの中核をなすものです。しかし、BIは、すでに起こったことを過去にさかのぼって見るものであり、予測やより高度な分析は、いまだに一部の専門家が手作業で行っていることが多いのが現状です。そこで、[AIや機械学習（ML）](https://blog.dataiku.com/the-impact-of-data-science-on-business-analytics-now-and-looking-ahead)の出番となるわけです。


##自動化されたBIをAIで補い、強化する

現在、データはいわゆるETLジョブで、自動的に統合されて、便利に使いやすい形で提供されるようになってきています。そしてデータチームは、より多くのデータを活用し、より多くのモデルを作成し、これまで不可能だったビジネス上の質問の答えを得ることができるようになってきています。わかりやすく区別するために、これをBI 2.0と呼ぶことにします。さらにこの新しく改良されたBI（現状を明らかにし、チームが下す意思決定を形成するビジネスの中核的機能）は、AIとMLの「未来を見る」機能とともに使えるよう形を変えてきています。たとえば、ネガティブなレポートにも、KPIに関する様々な信頼性の高い予測を付け加えることができるようになります。

過去のデータだけではなく、将来の予測に基づいて行動を起こすためには、ビジネス上の問題を逆方向に考える必要があります。ある収益のしきい値に到達するため、あるKPIに注目したとします。6ヵ月後の収益を予測するより、「収益のしきい値Xを達成するには、どのような行動が必要か？」と考える方がはるかに有益です。この質問に答えるためには、自動化されたワークフローを実装し、BIで個々のデータソースを探索し、AIの出力結果を加えて、目標に到達するための手段を知ることができるようになります。


##3つの要素を融合

自動化、BI、AIの融合は、積み木のようなものです。BIがある程度できていないとAIはできません。データアナリストが手作業でデータをコピーするのは、非効率的で貴重な時間を無駄にします。予測などの高度な分析を手動で行う場合も同様です。そこで必要になるのは自動化です。AIは明確なビジネス課題の解決を目的に使われるべきですが、その前提の元、自動化、BI、AIを1つのビジネス機能として有機的に融合させることは極めて重要です。

結局のところ、これら3つの要素が融合していることに意味があります。サイロ化されたツールで分断させず、目的を持ってこれらをまとめることで（データチームがビジネスの方向性を理解し、将来的にどのように発展/進化させるかを検討する）、ビジネスを正しい方向に導くことができるようになります。2022年に向けて、アナリティクスとBIや、データサイエンスとMLの融合が、より加速すると考えています。ツールの分断を減らし、BIやAIでビジネス課題に取り組む人々/チーム間の分断を減らし、チーム間のプロジェクトの見える化やコラボレーションを向上させていきましょう。


原文：[*Unpacking the Convergence of Automation, BI, and AI*](https://blog.dataiku.com/convergence-of-automation-bi-and-ai)
フロントエンドLT会 - vol.5　#frontendlt に参加して

## はじめに
先日[フロントエンドLT会 - vol.5　#frontendlt](https://rakus.connpass.com/event/232039/)というオンラインイベントに参加してきました。
発表された方の中から、私が個人的に気になったもの、ためになったものをピックアップしてまとめておきます。

## フロントエンドエンジニアが知っておきたいセキュリティについて
セキュリティというと、一般的にはバックエンドが頑張る仕事と思われがちですが、どれだけ強固なバックエンドを仕組んでもフロントが弱いと破られてしまう場合やそのリスクが高まるのは間違いありません。

>参考資料
[ヒグ！さん](https://connpass.com/user/ShuyaHiguchi/)の発表スライド
[フロントエンドが知っておきたいセキュリティについて](https://speakerdeck.com/higuuu/hurontoendogazhi-tute-okitaisekiyuriteinituite)


### フロントエンドが最も気にすべきセキュリティ
- トークン
- 認証＆認可

今回は時間の都合上トークンの例についてお話いただきました。

### 「トークン」とは
よく耳にする「トークン」とはそもそもなんなのか？
色々調べると証や印を意味する単語であり、ITの分野においては認証を識別するために用いられる文字列などを指すことが多いそうです。
> トークンとは、証拠、記念品、代用貨幣、引換券、商品券などの意味を持つ英単語。ITの分野では、長いデータを最小の構成単位に分解したものや、何かの証や印になるようなデータや装置、器具などのことをトークンということが多い。
[トークンとは](https://e-words.jp/w/%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3.html)

### 問題になるシーン
例えば、現状Webで公開しているサイトをスマホのアプリからWebviewで呼び出して動作させようとした場合、ただページだけを閲覧するサイトなら問題ないが、会員ページや決済などの認証認可が必要になる場合に、アプリからログインした際のトークンをWebview経由でどうやってサイト側に渡すかが問題になるそうです。
![スクリーンショット 2022-01-21 10.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583420/06151413-56d4-bf90-3164-45536831c00a.png)

### 解決策
1. Authorization headerで渡す 
1. URLのクエリで渡す
1. ローカルストレージ経由で渡す
1. js発火時の引数として渡す
1. トークンではなくワンタイムパスワードを使用

#### 1. Authorization headerで渡す
HTTPにAuthorizationリクエストヘッダを追加する。
メリット： 一番メジャーな手法であり。鉄板。
デメリット： SPA(Single Page Application)では使えない
![スクリーンショット 2022-01-21 11.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583420/f0e82a43-b803-db95-f5d0-814e61821868.png)
> 詳細はこちらのスライドが図解でわかりやすいです。
[参考スライド](https://speakerdeck.com/higuuu/hurontoendogazhi-tute-okitaisekiyuriteinituite?slide=11)

#### 2. URLのクエリで渡す
URLのクエリ(`http://hoge?token=fuga`)にトークンを渡す。
メリット: SPAでも動作できる。
デメリット: サーバーサイドのログやGAに残る（セキュリティ的によくない）
よく言われるのがwire sharkで傍受される心配があるという事象だが、暗号化されるのでそれはない。ドメイン名はわかってしまうがクエリは暗号化されている。
それよりかは、サーバーのログの取り方によっては生データが残っている可能性の方が危険度が高いといえる。
> Wire Sharkとは
LAN上に流れているパケットを「見える化」するパケットキャプチャツール
[～Wiresharkで「TCP/IP」モデルをのぞき見る～](https://hldc.co.jp/blog/2020/04/15/3988/)

#### 残りの方法について
残る３つの手法については、まだまだ文献が少なかったり、実装方法が煩雑になりすぎるデメリットの方が大きいので、あまり推奨はされないようです。

## 草を生やす技術
人の役に立つ技術が素晴らしいのは誰しもが理解していますし、誰しもがそのような技術や技術が使われたサービスや商品を望んでいると思います。
でも、やっぱり開発は自分が楽しむことも重要なんじゃないかなとこの発表を見て改めて感じましたw
> [草を生やす技術](https://speakerdeck.com/yug1224/kusa)
[Gitリポジトリ](https://github.com/YuG1224/kusa)

### どんなことをしたのか
GitのContributionsに人工芝を生やす。

### GitのContributionsが更新されるタイミング
Gitでは以下の日付が更新されるとContributionsが更新されるみたいです。

- Author Date
 - コミットの著者のcommit日付
 - git commit --dateで更新
- Commit Date
 - コミットを取り込んだ人のcommit日付
 - git rebase / git commit --amendで更新

### 更新されるコマンドを無限に打てば無限に草を生やせるのでは？
こういうことも暇つぶし程度に遊んでみるのも面白いなと思いました。
SSH接続をconfigファイルを使ってラクする

# 概要

SSH接続するとき、鍵ファイルやホスト名などの長いパラメータを毎回入力しなくていい方法。

# 対象者

- macでターミナルを使っている
- ターミナルでファイルの操作が行える
- テキストエディタを使える
- シェルはzsh（最近のmacデフォルトはzsh：2022年時点）
- SSH接続をよく使っている

# 関連記事

- [SFTPを使ってファイルのダウンロード/アップロードする](https://qiita.com/tatsumi_t2/items/73567ff4a1006399969b)	
- [SFTPコマンドをシェルファイルから使うサンプル](https://qiita.com/tatsumi_t2/items/719206cb6ce33fcb414f)	


# 目次

- [普通のssh接続](#普通のssh接続)
- [configファイルを使ったssh接続](#configファイルを使ったssh接続)
- [configファイルを使うメリット](#configファイルを使うメリット)
- [configファイルの用意](#configファイルの用意)
- [さらに便利に](#さらに便利に)
- [接続先の入力補完について](#接続先の入力補完について)

# 普通のssh接続

sshのパラメータはこんな感じなので

```bash
ssh -i 鍵ファイル ユーザー名@ホスト名
```

普段、次のように入力していると思います。

```bash
ssh -i =/keys/hoge-key.pem hoge-user@hoge-server
```

SSHをよく使ってると面倒になりますよね。

# configファイルを使ったssh接続

後述する設定ファイルを用意しておくと、こんな感じで接続できるようになります。

```bash
ssh hoge
```

# configファイルを使うメリット

- 入力が楽になる
- 鍵ファイルやホスト名以外のパラメータも指定できる
- 入力補完が使えるようになる（zshの設定が必要）
- sftp、rsyncでも使える

# configファイルの用意

ホームディレクトリに.sshディレクトリを作る

```bash
mkdir -p ~/.ssh
```

configファイルを作成する

```bash
vi ~/.ssh/config
```

configファイルの書き方はこんな感じ

```bash
Host 接続名
HostName ホスト名やIPアドレス
User ユーザー名
IdentityFile 鍵ファイルへのパス
```

SSHで接続がこうだったら

```bash
ssh -i ~/keys/hoge-key.pem hoge-user@hoge-server
```

configファイルの内容はこのように書きます。

```bash
Host hoge
HostName hoge-server
User hoge-user
IdentityFile ~/keys/hoge-key.pem
```

configファイルの設定で接続する（Host行に記載した名前を指定する）

```bash
ssh hoge
```

これで接続できるようになります。

# さらに便利に

複数の接続先や、共通設定なども書けます。

```bash
# 共通設定
Host *
ServerAliveInterval 60

# コメント
Host hoge
HostName hoge-server
User hoge-user
IdentityFile ~/keys/hoge-key.pem

# コメント
Host fuga
HostName fuga-server
User fuga-user
IdentityFile ~/keys/fuga-key.pem
```

```bash
ssh hoge

ssh fuga
```

# 接続先の入力補完について

zshの入力補完機能を有効にすると接続先を補完してくれるようになります。

```bash
ssh h
```

と入力しておいて、「tabキー」を押すと

```bash
ssh hoge
```

と補完されます。

zshの補完機能を有効にするには、ホームディレクトリに.zshrcファイル作ります。

```bash
vi ~/.zshrc
```

```bash
autoload -U compinit
compinit
```

ターミナルを入り直すか、次のコマンドで読み込むと補完が有効になります。

```bash
source ~/.zshrc
```
プリクラ並みの美肌フィルターをつかう #YUCIHighPassSkinSmoothing

#iPhoneでつかえる美肌フィルターのつかいかたです
<img src="https://user-images.githubusercontent.com/23278992/150454125-7c1d6d69-b9f5-41b1-95fd-5d91c59d4ef1.png", width=400><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a22d123c-b3df-ab54-b3be-933b420d5b6e.jpeg", width=402>

#見たいものを見せることがサービスには肝要です
現代は浄化されたものが好まれる時代だと思います。
SNSでも、何も加工せずに顔写真を載せている人はむしろ珍しいのではないでしょうか？
もしもあなたが画像アプリを作りたい場合、美肌フィルターが必要になることもあるかもしれません。
さて、どのようにして商用アプリ並みの美肌加工を実装できるのでしょうか？

<img src="https://user-images.githubusercontent.com/23278992/150454121-5b263cfe-af69-4cfe-bb4d-a556ce49b9a9.png", width=400><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/54ece577-e87a-995e-0cf7-75b9de92e01d.jpeg", width=408.5>

#高品質の美肌フィルター
YUCIHighPassSkinSmoothingは肌のテクスチャをスムースにしてくれるフィルターです。
誰しも肌に凹凸はあるものですが、それをSNSなどでよく見る質感にしてくれます。

https://github.com/YuAo/YUCIHighPassSkinSmoothing

#使い方

Metalベースの画像処理ライブラリ、MetalPetalをCocoaPodsをつかってインストールします。

https://github.com/MetalPetal/MetalPetal


MTIImageをつくってMTIFilterをアプライします。

```swift
let inputImage = MTIImage(image: image).unpremultiplyingAlpha()
let filter = MTIHighPassSkinSmoothingFilter()
filter.inputImage = inputImage
let outputImage = filter.outputImage
```

<img src="https://user-images.githubusercontent.com/23278992/150454092-d857cc4d-238a-488a-a6ee-2feb570dcef2.png", width=400><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c7b246b2-cb09-53a9-557a-d60d2de4ae4a.jpeg", width=408.5>

#あなたの画像アプリを充実させましょう

MetalPetalには他にもいろんな高速フィルターがあります。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
neosでlogix その52

#概要

neosでlogixやってみる。
StaticAudioClipコンポーネント
Play One Shotノード、使ってみた。


#写真
![2022-01-21 02.13.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e7622497-eefd-7250-a075-88c7757e74ec.jpeg)


#Play One Shot


```
Inputs
 	Impulse	Play
 	IAssetProvider`1	Clip
 	Float	Volume
 	Float	Speed
 	Bool	Spatialize
 	Float	SpatialBlend
 	Float3	Point
 	Slot	Root
 	Int	Priority
 	Float	Doppler
 	Float	MinDistance
 	Float	MaxDistance
 	AudioRolloffMode	Rolloff
 	AudioTypeGroup	Group
 	AudioDistanceSpace	DistanceSpace
 	Float	MinScale
 	Float	MaxScale
 	Bool	ParentUnderRoot
 	Bool	LocalOnly
Outputs
 	Impulse	OnStartedPlaying
```

#手順

- devtooltipを装着
- 新規->空のオブジェクト
- コンポーネントを追加
- StaticAudioClipを追加
- そのインターフェースを取り出す
- logixtooltipを装着
- Play One Shotをスポーン
- つなぐ


以上。
日本人だから入力値は日本時間で表現したい！

世の中全て日本時間になれ！って一度はそう思ったことありますよね？
そういっても、サーバ上はUTCとかはよく有る話です。

テストするときに、日本時間感覚で検証したい。
そんなわけでみんな大好きTimex

#準備

まずはiexでTimexを使う準備


```elixir
iex(1)> Mix.install([{:timex, "~> 3.7"}])  
Resolving Hex dependencies...
Dependency resolution completed:
New:
  certifi 2.8.0
  combine 0.10.0
  gettext 0.19.0
〜　省略　〜
==> timex
Compiling 62 files (.ex)
Generated timex app
:ok
```
#日本時間→UTC

日本時間 09:00を変換してみましょう

```elixir
iex(2)> ~N[2022-01-01 09:00:00] |> Timex.to_datetime("Asia/Tokyo") |> Timex.to_naive_datetime()
~N[2022-01-01 00:00:00]
```
UTC時間の00:00になりました

#UTC→日本時間

UTC 00:00を変換してみましょう

```elixir
iex(3)> ~N[2022-01-01 00:00:00] |>  Timex.to_datetime("Etc/UTC") |> Timex.to_datetime("Asia/Tokyo") 
#DateTime<2022-01-01 09:00:00+09:00 JST Asia/Tokyo>
```

日本時間09:00になりました
WordPressでカスタム投稿タイプ作成(functions.php)

##functions.php

```functions.php
//カスタム投稿タイプ
function add_custom_post_type_news()
{
  // お知らせ
  register_post_type(
    'news', // 1.投稿タイプ名 
    array(   // 2.オプション 
      'label' => 'お知らせ', // 投稿タイプの名前
      'public'        => true, // 利用する場合はtrueにする 
      'has_archive'   => true, // この投稿タイプのアーカイブを有効にする
      'menu_position' => 10, // この投稿タイプが表示されるメニューの位置
      'menu_icon'     => 'dashicons-edit', // メニューで使用するアイコン
      'supports' => array( // サポートする機能
        'title',
        'custom-fields',
        'editor',
        'thumbnail',
        'tag'
      ),
      //'show_in_rest' => true,//新しいエディター
    )
  );
  register_taxonomy(
    'genre_category', //分類名
    'news',
    array(
      'label' => 'カテゴリリー',
      'hierarchical' => true,
      //'show_in_rest' => true,

    )
  );
  register_taxonomy(
    'genre_tag', //分類名
    'news',
    array(
      'hierarchical' => false, //タグタイプの指定（階層をもたない）
      'update_count_callback' => '_update_post_term_count',
      'label' => 'タグ',
      'hierarchical' => true,
      //'show_in_rest' => true,

    )
  );
}
add_action('init', 'add_custom_post_type_news');
```
Reactで直接URLを入れると404エラーになる時の対処法

この記事を書こうと思った理由
---
reactで直接URLを叩くと404エラーになるという記事は多数見たのですが、わかりやすく解決法が書かれている記事が少なかったので書くことにしました。

結論：解決策
---
index.htmlに　`<head>`　を作り、中に`<base href="/" >`と入れる。

こんな感じ

```rails:index.html
<head>
<base href="/" >
</head>
```

注意点
---
`<link rel="stylesheet">`等のリンクを貼りたいときは`<base href="/" >`
より下に書かないといけないらしいです。

感想
---
いろんな記事を見ましたがこれが一番簡単な解決策でした。
一人でも多くの方の役に立てれば幸いです。
Access VBAでPostgreSQLをODBC接続したとき、ODBCエラー3146と格闘した話

# 目的、背景など
現職場ではAccessをメインにデータの集計を行っています。
最近AWS上にシステムを構築し、RDSを使うことになりました。なのでAccessにてODBC接続してデータを取り扱う機会が増えました。この職場ではAccessによるVBAで構築されたレガシーな開発標準があり、ODBC接続を自動で処理するモジュールにて接続することになるのですが、そのモジュールが機能せず、ODBCエラーを吐き続けることとなりました。
当記事はその問題対処へのレポートみたいなものです。

# 作業環境
* データベースエンジン（※1）：Aurora PostgreSQL（エンジンバージョン12.7）
* Microsoft Access2003、Microsoft Access2016
* OS：Windows10 64bit
* ODBCドライバー（※2）：PostgreSQL Unicode （バージョン13.02.00.00）

※1　私の環境では踏み台サーバ経由での利用ですが、既存のナレッジにて接続ができています。
※2　Microsoft Access2003をメインに使っているため、ODBCドライバーは32bitを使用しています。

# 事象
**できていること**
* フリーソフトA5M2等によるDB参照
* 新規作成＞テーブルのリンク＞ODBCデータベース() からシステムDSNやファイルDSNを使ったリンクの作成

**できていないこと**
* TableDef オブジェクトによるODBC自動接続

# ODBCエラー
「3146　ODBC--呼び出しが失敗しました。」がプログラムをどう書き直しても出てきます。TableDefの使われ方はググれば出てくるようなオーソドックスなものなのにどこが悪いのか全く分かりません。TableDefでの接続を行ったという技術記事を調べまわると、Microsoftが公開しているAttachDSNLessTableという名前で、DSNを使用しないODBC接続の方法が紹介されていました。ぱっと見、既存のモジュールと同じ要領でTableDefが使用されていたため、
AttachDSNLessTableを丸々コピペして使ってみたのですが、3146のエラーがやっぱり出てきます。

# エラー対処
3146エラーの対処をどうググっても、記事ごとに原因が異なっているため、これ以上の情報が必要となりました。そして英語のページも見飽きてきた時に以下のページを見つけました。
https://answers.microsoft.com/en-us/msoffice/forum/all/run-time-error-3146-odbc-call-failed/30fce3c6-0e05-463f-b115-41357c95a5ad

要は、エキスパートの方が言うに、プログラムの中にこれ入れればより詳細なエラーが見れるよって回答でした。この回答こそが問題解決への光明となりました。

```vb
Public Sub DumpErrorsCollection()
    Dim e               As Error
    Debug.Print Time$, "Dumping " & DBEngine.Errors.Count & " error records:"
    For Each e In DBEngine.Errors
        Debug.Print e.number, e.Description, e.source
    Next e
End Sub
```

早速エラー個所に仕込んでみると以下の出力を得ることができました。

```
16:28:43      Dumping 2 error records:
 11           The specified table does not exist        ODBC.TableDefs
 3146         ODBC--呼び出しが失敗しました。            DAO.TableDefs
```

んん？「The specified table does not exist」？
テーブルが存在しない？？？？

# 種明かし
まず、Accessで新規作成＞テーブルのリンク＞ODBCデータベース() からシステムDSNやファイルDSNを使って作成すると以下のようにテーブル名の前に「public.」という文字列がついてきます。（スキーマというんでしょうか？不慣れなもので...(-_-;)　）
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394613/f9c4d64d-ff37-94ae-5eea-4a37b39dcc7e.png)

そしてOKでリンクを作成すると「public_テーブル名」という名前でリンクが作成されます。

![タイトルなし2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394613/49fc3c8e-2d07-8e04-5a4c-f4b374753750.png)

私はVBAでTableDefにテーブル名を渡す際、「public_テーブル名」で渡していました。事前に手動で作成テストをしていたのでpublic付が印象に残っていたため、てっきり「public_テーブル名」で渡すものだと勘違いしていました。その後このスキーマを取り除いたテーブル名でモジュールを実行したら、問題なくリンクが作成されることを確認しました。

改めて調べ直したら、何度も閲覧した以下の記事でもちゃんとスキーマの処理を挟んでいるのが伺えます。。。。。
~~https://fnya.cocolog-nifty.com/blog/2015/04/access-postgres.html~~
（追記：2023/01/11時点で上記リンクは無効になっていました）

# 所感
VBAの開発に関わって２年ほど経ちますが、とても実のある体験だったと思います。不慣れなODBC接続であったこともそうですが、データベースに対する理解や用語・知識に目を向けることができました。
何よりDumpErrorsCollection()というデバッグ手段を学ぶことができたのが最大の収穫だと思っています。元記事の回答のいいねを連打してやりたいです。
どこかの技術記事のコメント欄に私と同じようにAccess、VBA、Postgreで手動ではリンク作成ができるのにTableDefで自動作成できないというコメントがあったため、決して自分だけがこの問題にはまった訳ではないと思っています。

以下のことで躓いている方がいて、検索したらこの記事を見つけて何かの手助けになってくれればと思います。
* ODBCエラーの対処・詳細分析
* TableDefを使うとODBCエラー3146が返ってくる
【GoogleAppsScript】初めてWEBアプリを作ってみた

独学でWEBアプリ開発を勉強したいけど、自由に使えるサーバはない。
業務でWEBアプリとの連携について聞かれたから実際にやってみようと思ったけど、やっぱり自由に使えるサーバはない。
ngrokはとても便利なんだけど毎回URLが変わるから常用はできない。
Herokuは無料なんだけど英語だしGitするのが面倒くさい。

そんなこと、ありませんか？私はこれで二度目です（笑）

### それならGoogleAppsScriptを使えばいいじゃないか！

Googleアカウントがあれば利用できるし、サーバも必要ない。環境構築不要。
インターネット接続環境さえあればいつでも開発できる。
何といっても、無料！！
他にも色々と利点はありますので、興味のある方は他の方の記事を検索してみてください。

# GoogleAppsScriptを始める

Google Driveの[新規] - [その他] - [Google Apps Script]を選択します。
![gas001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/b9fdcb53-b48f-8c4a-f0fc-5a75b9e998c9.png)

すると、新しいプロジェクトが作成されます。これでもう準備は整いました！はやー( ﾟДﾟ)
![1641541816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/36bbcb6d-ac69-b13f-0f65-7219ef73cb8c.png)

# WEBアプリを作る

プロジェクトが作成できたら、コード.gsにコードを書いていきます。

```js:コード.gs
function doGet(e) {
  var html = HtmlService.createTemplateFromFile('index')
  return html.evaluate()
}
function doPost(e) {
  var html = HtmlService.createTemplateFromFile('index')
  return html.evaluate()
}
```

これを保存すれば、サーバーサイドプログラム完成です！はやー( ﾟДﾟ)

# WEBページを作る

WEBアプリで表示するWEBページを作ります。
[ファイルを追加] - [HTML]でHTMLを作成します。
![gas002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/540b82ff-bc89-2a22-4770-890201e05de4.png)

ファイル名は`index`にします。自動的に最低限必要な要素は追加された状態でHTMLが作成されます。べんりー( ﾟДﾟ)
![1641542308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/f76940b4-209c-3bea-4ac9-5bf040656922.png)

HTMLで`Hello World!`を表示しましょう。
bodyの間に`Hello World!`と入力して保存します。
![1641542676.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/1401850b-0210-9988-bd0c-eeb4bd99e402.png)

これでWEBページは完成です。はやー( ﾟДﾟ)

# インターネット上に公開する

それでは最後にデプロイ作業です。
[デプロイ] - [新しいデプロイ]を選択します。
![1641542789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/ff5ebdc6-2984-3847-ea14-736e15a6a703.png)
[設定] - [ウェブアプリ]を選択します。
![1641542881.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/82209604-0c2d-511a-458d-07c0cfe3707e.png)
アクセスできるユーザーを[全員]に変更して[デプロイ]を選択します。
![1641542968.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/64125e3f-1579-067f-2e99-5697a3010450.png)
デプロイ作業が完了しました！はやー( ﾟДﾟ)
![1641543080.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/4d763e08-5449-dad3-6218-6586b472dbc0.png)
ウェブアプリのURLをコピーしてブラウザでアクセスしてみましょう。
![1641543348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/b9f5f54a-f067-a756-0579-f0b68181b5c3.png)

きちんと表示されてますね！これですべて完成です。はやー( ﾟДﾟ)

# おわりに

ここまでお付き合いいただきありがとうございました。

と、言っても簡単過ぎてすぐ終わりましたよね。
こんな環境を無料で提供してくれるなんて、本当にGoogle様様デス。

それにしても昨年は忙しくて死ぬかと思った。。。気づけば半年以上記事書いてなかった。
今年は無理せず勉強の時間を確保して、勉強したことを少しずつでもアウトプットしていきたいと思います。
本年もどうぞよろしくお願いいたします。

ではまた！(^^)/

# 参考にさせていただきましたm(_ _)m

[GASでWebアプリ、はじめました](https://qiita.com/supreme0110/items/677df147f42a6750e604)
【え、その速度早すぎ!?】爆速でvagrantの仮想環境を作成してみた

# 目的
業務内でvagrantの仮想環境を使う機会があったので、備忘録として使い方をまとめてみる。
# 諸々インストール
```
＄ brew install virtualbox --cask
$ brew install vagrant --cask
```
# vagrantの公式からBOXを選ぶ
[この辺り](https://app.vagrantup.com/boxes/search?order=desc&page=1&provider=virtualbox&q=&sort=downloads&utf8=%E2%9C%93)からvagrantの仮想環境で使いたいBOX(OSと思ってもいい)を選択する

今回は[yzgyyang/macOS-10.14](https://app.vagrantup.com/yzgyyang/boxes/macOS-10.14)を仮想環境で利用していこうと思う。


```bash
Vagrant.configure("2") do |config|
  config.vm.box = "yzgyyang/macOS-10.14"
end
```

yzgyyang/macOS-10.14をコピーしておく

 
# vagrantを設定する
vagrant用のディレクトリを作成する

```
$ mkdir ~/vagrant/tvagrant_test
$ cd ~/vagrant/tvagrant_test
```

# vagrantfileを作成する

```
$ vagrant init
```

するとディレクトリ内にVagrantfileというファイルが作成されるため、先ほどコピーしたbox名を下記のように記述する

```bash
・
・
・
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.

  # 変更
  config.vm.box = "yzgyyang/macOS-10.14"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

・
・
・
```

# vagrantを立ち上げる

```
$ vagrant up 
```

# vagrantの仮想環境にログインする

```
$ vagrant ssh
```

# まとめ
vagrantとか仮想環境とか聞くと大変そうだが、手順はこれだけ。
個人開発とかプライベートでもローカルを汚したくない人には仮想環境はとてもおすすめ。
Github リモートブランチにマージしたものを取り消す（自分めも）

超参考なりました
https://techtechmedia.com/merge-cancel-git/

Githubになれず、リモートにマージしたら他の人の更新を戻しちゃうよって焦った時のメモ

```
# やっちまったブランチに移動
git checkout やっちまったブランチ

# これ以上傷を増やさないように最新にしておく
git pull origin やっちまったブランチ

# ログを確認、戻したい commit XXX を確認
git log

# 戻る
git reset --hard XXX

# リモートブランチに戻ったところをPush
git push -f origin やっちまったブランチ
```

ドキドキしながらGithubのサイトを確認して、やっちまった自分のマージが撲滅されていることを確認する
Batsを使ってbashのUnitTestを行う

# はじめに
shellScriptコードで最低限の自動テストをやりたい人向けのメモ、カバレッジ分析等は対象外<br>

ちなみにBatsとbats-coreが存在するが、現在は bats-core/bats-coreがメンテされている

### 検証環境
Ubuntu 21.04
bats-core 1.5.0
bats-support, bats-assert 0.3.0

# インストール方法
bats-coreのインストール

```bash
$ git clone https://github.com/bats-core/bats-core.git
$ cd bats-core
$ ./install.sh /usr/local
```

bats-support, bats-assert のインストール
(ソースを置くだけだからpathは/usr/local/libじゃなくてもいい)

```bash
$ sudo git clone https://github.com/ztombol/bats-assert /usr/local/lib/bats-assert
$ sudo git clone https://github.com/ztombol/bats-support /usr/local/lib/bats-support
```

# テストコード書き方
ファイル名は{name}.bats

```shell:test.bats
#!/usr/bin/env bats
setup() {
    load /usr/local/lib/bats-assert/load.bash
    load /usr/local/lib/bats-support/load.bash
    
    # ここに各テストケースの事前の処理を書く
}

teardown() {
    echo "finish test case"
    # ここに各テストケースの事後の処理を書く
}

#テストケース１
@test "test case1" {
    source remove.sh
    #resultフォルダのファイル数　== 0
    assert_equal "$(ls /home/user/result | wc -l)" 0
}
@test "test case2" {
    source remove.sh
    assert_equal "$(ls /home/user/result | wc -l)" 0
}

```

# 実行結果
テストファイルを実行

```s
user@pcname:~$ bats test.bats 
 ✓ test case1
 ✓ test case2

2 tests, 0 failures
```

# 参考
https://bats-core.readthedocs.io/en/stable/tutorial.html
https://github.com/bats-core/bats-core#version-history
GitHubでテキストを簡単にリンクにする方法！

# 概要
GithubのPRやIssueを作成する際にテキストをリンクにさせたい事がよくあるかと思います。
今までは毎回`[](url)`のフォーマットを作成してからリンクを作成していたのですがもっと簡単な方法があったのでご紹介します。


# やり方
以下のGIFを見てもらうのが一番わかりやすかと思います！
特定のURLをコピーしたあとに、Githubの特定のテキストをフォーカスしたままペーストすると自動的にリンク付きテキストにしてくれます！これは便利！

![link.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49347/26621a48-34c1-74a1-b652-ea5b48e4c20e.gif)

以上です！
Windows 11 で sihost.exe が CPU を浪費する問題

# はじめに
この記事は、私の実体験に Web で検索した情報を足した程度のものです。
根本的にどのような問題があったのかは把握できていません。
情報の補足を歓迎します。

# 発生したこと
Windows 10 から Windows 11 にアップデートしてしばらく使っていたら、sihost.exe が 10％ 程度 CPU を使っていることに気づいた。Ryzen 5 3600 での 10% なので、CPU の使用率としてはそこそこ高い。
sihost.exe は Shell Infrastructure Host であり、シェルがらみなので問題が特定しづらい。この CPU 浪費が始まると、エクスプローラー再起動でも解決できず、再起動かサインアウトが必要になる。

# やってみたこと
定番の `DISM.exe /Online /Cleanup-image /Restorehealth` と `sfc /scannow` はやってみたが、改善せず。
参考: https://support.microsoft.com/en-us/windows/using-system-file-checker-in-windows-365e0031-36b1-6031-f804-8fd86e0ef4ca

# 検索してたどり着いた情報
いろいろ調べるとフォトアプリ Microsoft.Photos.exe が関係しているらしいという情報にたどり着いた。
https://www.elevenforum.com/t/shell-infrastructure-host-high-cpu-usage-windows-11.2370/
https://www.elevenforum.com/t/shell-infrastructure-host-high-cpu-usage-windows-11.2370/
https://www.reddit.com/r/techsupport/comments/q8zsjd/windows_11_shell_infrastructure_host_taking_up/hij72q7/?utm_source=reddit&utm_medium=web2x&context=3

# 確認
エクスプローラーから画像ファイルをダブルクリックしてフォトアプリを起動し、直ちにフォトアプリを終了してみる。すると、sihost.exe が CPU を浪費するようになる。これだ。問題が特定できた。

# フォトアプリの設定を見直す
フォトアプリの設定に問題があるかもしれないと考え、フォトアプリを単独で起動してみた。すると、なにかの更新をインストールしようとする。あやしい。この更新がされていないためにおかしな動作をしていたのかもしれない。
その後、ひととおり設定を眺めてフォトアプリを閉じた。こんどは sihost.exe の CPU 浪費はなかった。

# 再発
数日後、やはり同様の問題が発生した。やはり原因はフォトアプリである。
特に設定を変えたところはない。
現状、フォトアプリを使わないというのが最も無難かつ確実な解決策である。

# 結論
フォトアプリに問題があったことは間違いない。ただ、それがどのような問題なのかはわからない。
Microsoft のフォトアプリは、どうしても使わなければならないほどのものではないので、避けるというのも有効な選択肢だと思う。
Blender(3.0)で作成したアニメーションが消えた時の復元方法＆消えないようにする方法

復元方法
-----------------------------------------------------------------
ファイル　→　復元　→　自動保存　→　Blenderファイルビューで選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2283987/9f534a75-f285-1a9b-05c5-155b9df598a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2283987/fc494121-552f-14c3-0d9a-9ed56748d931.png)



消えないようにする方法
-----------------------------------------------------------------
アニメーション名の横の盾マークをクリック
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2283987/f97bdaa5-aeba-0de0-80f1-7647feb0c077.png)

（参考サイト）
https://imoue.hatenablog.com/entry/2016/07/08/222400
free5GCをUbuntu18.04にインストール - トラブルシューティング -

free5GCのインストールについては、[本家](https://github.com/free5gc/free5gc/wiki/Installation)で詳しく説明されているため、おおよそ、これを見れば大丈夫かと思います。ここでは、インストール中にトラブったところを中心に記載します。

#modprobe gtp5gで"Operation not permitted"
GTP 5Gとは、5G用のGPRS Tunnelling Protocol、つまり、GPRS を伝送するために使
用される IP ベースの通信プロトコル。
modprobe gtp5gは、gtp5gモジュール（カーネルモジュール）をmodprobeコマンドにより組み込むというものになっています。
gtp5gのMakefileに、このmodprobe gtp5gがありますが、ここでエラーが生じるケースがあります。エラー内容は、
`modprobe: ERROR: could not insert 'gtp5g': Operation not permitted`
というもの。
`dmesg`を見てみると
`Lockdown: modprobe: Loading of unsigned module is restricted; see man kernel_lockdown.7`
このトラブルシュートは、[こちら](https://unix.stackexchange.com/questions/543576/modprobe-fails-with-operation-not-permitted)にも記載されている通り、SysRqを使いカーネルロックダウンをDisableにするとのことで、下記コマンド

```.sh
sudo sh -c 'echo 1 > /proc/sys/kernel/sysrq'
sudo sh -c 'echo x > /proc/sysrq-trigger'
```
で解消されるとあるのですが、私の環境では無理でした。

私の環境では、BIOS設定でSecure Bootを無効にすることで解消しました。Dell PCの場合は電源起動後、F2でBIOS Settingsに入れると思います。
子供の科学のラズパイ

リンクメモです。
連載記事PDFが以前は見れましたが、現在は登録しないと見られないようです。
https://www.kodomonokagaku.com/jibun/

## SDカードの作成
以下を参考に作成。基本的にはラズパイ公式と同じ。DLしたイメージを公式書き込みソフト(Raspberry Pi Imager)でカスタムファイルの書き込みを選んで書き込む。
壁紙とブラウザのスタート画面がKoKaに変わっている。その他の変更は？？
（公式の最新イメージーフルリコメンドでもいいとおもいますが）

https://www.kodomonokagaku.com/experience/programming/6269/

## SDカードアップデート

以下を参考に、
パッケージのインデックスを最新にした後
パッケージを最新のものにアップグレードする。

```bash:
sudo apt update
sudo apt upgrade
```
upgradeは依存先の削除が必要な場合は、更新されない。


https://www.kodomonokagaku.com/experience/programming/6334/

## フルアップグレード

sudo apt full-upgrade では、パッケージ構成まで変わるらしく子供の科学では推奨していない。（いくつかのパッケージを削除してでもアップグレードする）
新規にSDカードを準備する時は、何かあっても戻せるのでやってみた。大丈夫でした。
aptのオプションの違いは以下を参考
https://penpen-dev.com/blog/upgrade-tigai/
マニュアルのページ
https://manpages.debian.org/testing/apt/index.html
https://manpages.debian.org/testing/apt/apt.8.ja.html
Rustで関数やクロージャーをVecに入れる方法

RustのVecに関数やクロージャーを入れて管理したかったのでその方法を紹介。

# まずはクロージャの使い方

まずは、クロージャーの基本。

```rs:closure1.rs
fn main() {
    let f1 = |n| {n+51};
    let f2 = |n| {n+52};
    println!("{}", f1(1)); // 52
    println!("{}", f2(1)); // 53
}
```

# クロージャーを配列に入れて呼び出してみる

割と簡単に実現可能です。

```rs:array_closure.rs
fn main() {
    let f1 = |n| {n+51};
    let f2 = |n| {n+52};
    let func_list = [f1,f2]; // クロージャーを配列に
    // 配列にいれたクロージャーを呼び出す
    for f in func_list.iter() {
        println!("{}", f(0));
    }
}
```

# Vecに入れようとすると失敗する

ただし、クロージャーを配列ではなくVecにいれようとするとエラーになります。

```rs:error_vec_closure.rs
fn main() {
    let f1 = |n| {n+51};
    let f2 = |n| {n+52};
    let func_list = vec![f1,f2]; // ← ここでエラー
    for f in func_list.iter() {
        println!("{}", f(0));
    }
}
```

こんなエラーが出ます。

```
error[E0308]: mismatched types
 --> b.rs:4:21
  |
2 |     let f1 = |n| {n+51};
  |              ---------- the expected closure
3 |     let f2 = |n| {n+52};
4 |     let func_list = vec![f1,f2];
  |                     ^^^^^^^^^^^ expected slice, found array of 2 elements
  |
  = note: expected struct `Box<[[closure@b.rs:2:14: 2:24]], _>`
             found struct `Box<[fn(_) -> _; 2], std::alloc::Global>
```

Vecには同じ型のデータしか入れることができません。


## 正しくVecにクロージャーを入れる

当然、Vecには同じ型のデータしか入りません。上記のf1とf2のクロージャーは同じ型に見えますが、Rustのコンパイラは別の型と見なしてしまうようです。そのため、型ヒントを入れると正しく動かすことができます。

```rs:ok_vec_closure.rs
// 型を定義
type MyFuncType = fn(usize)->usize;
fn main() {
    let f1 = |n| {n+51};
    let f2 = |n| {n+52};
    // 型ヒントを入れる！
    let func_list: Vec<MyFuncType> = vec![f1,f2];
    for f in func_list.iter() {
        println!("{}", f(0));
    }
}
```

> (メモ) Vecの値は、ヒープ領域に配置されます。
> Rustではメモリの配置場所「スタック」と「ヒープ」について意識する必要があります。


# 同じように関数をVecに入れる

次に、クロージャーではなく、関数をVecに入れてみましょう。この場合も、型ヒントを指定すればVecに入ります。

```rs:ok_vec_func.rs
// 型を定義
type MyFuncType = fn(usize)->usize;

fn f1(n:usize) -> usize {
    n+51
}
fn f2(n:usize) -> usize {
    n+52
}

fn main() {
    // 型ヒントを入れる
    let func_list:Vec<MyFuncType> = vec![f1, f2];
    for f in func_list.iter() {
        println!("{}", f(0));
    }
}
```

無事に関数がVecに入りました！！

# 参考

> [補足] なお、記事に関しまして、 @vain0x さんよりクロージャーの詳しい解説をいただきました。参考になりますので、コメント欄も確認してみてください！感謝！！


- [『Rustの書き方・作り方』](https://amzn.to/3mnx9qe)という本を書きました。
  - 良かったら見てください！メモリやBoxについても詳しく解説しています！！
ffmpegによる動画からの音声抽出

メモ集です。
## ffmpegのダウンロードと解凍(windows PC)
https://ffmpeg.org/download.html#build-windows 公式のダウンロードページ
https://www.gyan.dev/ffmpeg/builds/ 公式からのリンクのwindows用ビルド済み

ビルド済みの中から、ffmpeg-git-full.7zをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/0f6638cb-bc8c-bd51-df3e-150743ddd778.png)

windowsでは、標準で７ｚに対応していない。今回は、wsl2上で解凍ツールを使った。
wsl2のコマンドラインで　７ｚ　と打ち込むと、
Command '7z' not found, but can be installed with:
sudo apt install p7zip-full
と丁寧に、教えてくれるので、sudo apt install p7zip-fullを実行。
もう一度　７ｚ　と打ち込むと、使い方を教えてくれる。ｘはフォルダを作って解凍。
 7z x ffmpeg-2023-02-04-git-bdc76f467f-full_build.7z　で解凍した。
　

## ffmpegによる抽出
#### フォルダ中の動画から一括で音声抽出

ffmpegはWindowsのGUIツールだと思っていたが、マルチプラットフォームのコマンドラインツールだった。

検索したところ、

https://sutasutashiki.blogspot.com/2021/03/Windows10-FFmpeg-Convert-mp4-to-mp3.html
https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8

を参考に簡単なバッチファイルを書けばいいことがわかった。
以下のバッチファイルを動画フォルダに作成し、直下にoutputフォルダを作成して実行。

```bat:mp4_to_mp3.bat
for %%f in (*.mp4) do (
c:\ffmpeg\bin\ffmpeg -i "%%~nf".mp4 -ar 22050 -b:a 64k -f mp3 "output\%%~nf".mp3
)

REM このバッチファイルがあるフォルダのmp4ファイルをすべて検索し、直下のoutputフォルダにmp3で出力する
REM arビットレート44100の半分 音声のみなので。64k レート　i入力　f出力
```

#### 選んだファイルだけを処理するバッチ

フォルダ名は適当に変更。
ダブルクォーテーションで囲っているので日本語ファイル名もＯＫ
%1はバッチファイルにドラッグして放り込む動画ファイル。%~n1は拡張子除いたファイル名。
```
"D:\オンライン講演会の映像と音声\ffmpeg-2023-02-04-git-bdc76f467f-full_build\bin\ffmpeg.exe" -i %1 -ar 22050 -b:a 64k -f mp3 "D:\オンライン講演会の映像と音声\mp3_output\%~n1.mp3"

```

同じ行を追加して、％２，３..９まで書けば、一度に９個までのファイルを放り込める。
SQL 基本構文（MySQL）ログインコード

cmd(コマンドプロンプト）など、なかなか知らない存在のものである。エンジニアが黒い画面を使っているのは、結構な人が知っていると思います。しかし、実際にコードを打ってコンピュータに指令をだしていると知っている人は少ないです。

下記に指令コードを書いていきます。

ローカルサーバにログイン
$mysql> -u[ユーザー名] -p[パスワード]

外部サーバーへのログイン
$mysql> -u[ユーザー名] -p[パスワード]
 -h[host名] -p[ポート番号]

ユーザの追加
mysql>create user 'ユーザ名' @ 'ホスト名’ IDENIFIED BY 'password';

ユーザにDB操作権を
mysql>grant all privileges on test.db.＊to testuser@localhost IDENTIFIED BY 'password';

ログイン中のユーザにパス設定
mysql>set password =password('hogehoge')

特定のユーザのｐｗ設定
mysql>set password for 'tetuser' @ 'localhost' = password('hogehoge123');
renderで部分テンプレートを呼び出す方法

#はじめに
　この記事はプログラミング学習の備忘録です。今回はrenderを使って指定のビューファイルを呼び出す方法についてまとめます。
#viewでrenderメソッドを使う
　まずviewでよく使われるrenderメソッドの用法は、部分テンプレートを呼び出す時です。部分テンプレートとは複数のviewファイルで使われるコードを切り出して、共通化するファイルのことです。
renderで部分テンプレートを呼び出すためには、まずは共通部分をまとめた部分テンプレートファイルを作ります。
この時に気をつけることは、ファイル名の先頭にアンダーバーをつけて
**「_tweet.html.erb」**のような形にすることです。

次に部分テンプレートを呼び出します。呼び出し方は主に、
①部分テンプレートをそのまま呼び出す場合
②変数を渡す場合
の2つがあります。順番に説明します。　
#部分テンプレートをそのまま呼び出す
 例えばformを作る部分テンプレートには変数を渡さず、そのまま呼び出されます。
まずは「_form.html.erb」というファイルを作り、

```new.html.erb
 <%= render "form"%>
 ```
と記述します。そうすることで、newとeditのviewで共通のフォームをそのまま使えます

#部分テンプレートに変数を渡す
 次に変数を渡す場合についてまとめます。
例えばtwitterの一つ一つの投稿は、変数が違う共通のコードを使います。
そのような時には、部分テンプレートに変数を渡す必要があります。
以下のように記述します。

```tweet.html.erb
 <% @tweets.each do |tweet|%>
  <%= render partial: ‘tweet’, locals: { tweet: tweet } %>
 <% end %>
```
‘部分テンプレート名’, locals: { 部分テンプレートで使いたい変数名: 渡したい変数 }
とすることで変数を部分テンプレートに渡します。

またこの記述はcollectionオプションを使って簡略化することもできます。

```tweet.html.erb
<%= render partial: 'tweet', collection:  @tweets %>
```

まず最初の'tweet'では、①呼び出す部分テンプレート名と、②部分テンプレートで使いたい変数名の2つの意味があります

そしてcollectionの後では、@tweetsの中身分、部分テンプレートを呼び出します。

このようにcollectionオプションを使うことにより、より簡略化して記述することができます。

#まとめ
　今回はrenderで部分テンプレートを渡す方法についてまとめました。
部分テンプレートを使うことで、見やすくなり、ミスの少ないコードを書けます。
今回の記事が少しでもお役に立てれば幸いです。
「ライト、ついてますか」を読んだので、その要点

[ライト、ついてますか―問題発見の人間学 | ドナルド・C・ゴース, G.M.ワインバーグ, 木村 泉 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4320023684)
![](https://www.kyoritsu-pub.co.jp/app/img/item/02368.jpg)
を読んだので、響いた要点と学びのメモ。

## 最初に感想

- 全体としてポエミーな書物。なので読書感想文が賛否両論になるのは理解はできる。
- 自分にとっては、ある程度開発経験を経てから効いてくるフレーズが多いと感じた。フレーズそのものは響くものも多いので、使っていきたいようなものもある。笑
- 気に入ったのは **「ユーモアのセンスのない人のために問題を解こうとするな。」**


## 要点

- 「それは誰にとって問題なのか？」という問いについて考えてみよう。
- この問いは
    - １．一方では誰が依頼主か、つまり誰をしあわせにしなければならないかをはっきりさせようとしているもの。
    - ２．もう一方では適切な解答を見つけ出すのに役立つかも知れないヒントを得ようとしている。
- 問題は何なのか？とたずねる以前にあわてて解答を作り出そうとする、持って生まれた傾向に、歯止めをかけるべきである。
- 未熟な問題解決者は、解くべき問題を定義する時間を惜しんで解答にとびつく。経験を積んだ問題解決者すら、社会的圧力にさらされると、この「急ぎたい」という気持ちに負ける。
    - 「何がまずいか」をどうきめるか？
    - まずいのは何か？
- そのために、何ができるか？
- 問題とは、望まれた事柄と認識された事柄の間の相違である。
- ユーモアのセンスのない人のために問題を解こうとするな。
    - 第１は、彼らの解決方法を問題の定義と取り違えるな。
    - そして第２は彼らの問題をあまりやすやすと解いてやると、彼らは本当の問題を解いてもらったとは決して信じない。
- 解法を問題の定義と取り違えるな。ことにその解法が自分の解法であるときには注意。
- 問題解決に関する本当の問題点は、こうなんだ。問題の正しい定義が得られたかどうかは決してわからない、問題が解けたあとでも。
- 結論に飛びついてはいけないが、自分の第一印象は無視するな。
- 問題は何か？
- 正しい問題定義が得られたという確信は決して得られない。だがその確信を得ようとする努力は、決してやめてはいけない。
- すべての解答は次の問題の出所
- 問題の転嫁
- 問題によっては、それを認識するところが一番むずかしいということもある。
- 問題の転嫁という問題は設計家、つまりほかの人々のために問題を事前に解くことを商売にしている連中の存在によって一層面倒なことになる。設計家はビルの持ち主と同様、自分たちがやったことのもたらす結果を経験するということのまずないものである。だから設計家は絶えず不適合を作り出す。
- 外国旅行をすると、われわれは「新しい」ものに対して、いやおうなしに見慣れなくて変だという気持ちをもつことになる。お金は意味をなさないし、道路標識はとんでもないところにあるし、トイレットペーパーもおかしい。だがもっと有益な経験は、外国からの旅行者を連れて、自分の国を歩くことである。
- キミの問題定義を外国人や盲人や子供について試してみよう。またキミ自身が外国人や盲人や子供になってみよう自分が毎日扱っているものを、何か一つ取り上げてみよう。靴でもいい、シャツでもいい、フォークでもいい。車のドアでも、歯ブラシでも、そのほか何千とあるさまざまなもののどの一つでもいい。
- もし人々の頭の中のライトがついているなら、ちょっと思い出させてやる方がごちゃごちゃいうより有効なのだ。
- 伝統的に「問題解決」と呼ばれてきたものの多くは、実はパズル解決である。パズルはむずかしいように設計されているものだ。だがそのむずかしさの背後には設計者がいる。われわれは、その設計者がこのパズルを、もしそれがふつうでないむずかしさを持たないのであれば選択しなかったであろう。


## 参考記事

- [「ライト、ついてますか」から学ぶ問題発見の心得 | Program Is Made At Night](https://kimh.github.io/blog/jp/thoughts/important-things-about-problem-finding-learnd-from-are-your-lights-on-ja/)
- [「ライトついてますか」から学ぶ問題発見の心得 - Qiita](https://qiita.com/kimh/items/2eb324e0a73afa3692a7)
- [SREやクラウドエンジニアが読むと良さげな本まとめ - Qiita](https://qiita.com/tmknom/items/67dbfcf5194aee5c6e61#%E3%83%A9%E3%82%A4%E3%83%88%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%99%E3%81%8B)
- [【読書メモ】ライト、ついてますか - radioc@?](https://radiocat.hatenablog.com/entry/2018/08/04/000000)

以上です～
【JavaScript】分割代入とデフォルト値

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 分割代入とデフォルト値

### 分割代入

```js:オブジェクトの場合
const myProfile = {
 name: "田中";
 age: 39;
};

// 分割代入を使用しない場合
const message = `名前は${myProfile.name}です。歳は${myProfile.age}歳です。`;
console.log(message);
// "名前は田中です。歳は39歳です。"

// 上記の記述はmyProfileを何度も書く必要があり冗長であるため、分割代入を利用して以下のように記述

// 分割代入を使用した場合
// 取り出したいプロパティ名を{}のなかに記述。=の後に取り出すオブジェクトを記述
const { name, age } = myProfile
// 呼び出す際には、myProfileは記述不要
const message = `名前は${name}です。歳は${age}歳です。`;
console.log(message);
// "名前は田中です。歳は39歳です。"
```


```js:配列の場合
// 分割代入を使用しない場合
const myProfile = [ '田中', 39 ]
const message = `名前は${myProfile[0]}です。歳は${myProfile[1]}歳です。`;
console.log(message);
// "名前は田中です。歳は39歳です。"


// 分割代入を使用した場合
// 配列で記述。配列の順番に格納される。以下ではnameは'田中',ageは39。
const [ name, age ] = myProfile
const myProfile = [ '田中', 39 ]
const message = `名前は${name}です。歳は${age}歳です。`;
console.log(message);
// "名前は田中です。歳は39歳です。"

```

### デフォルト値

```.js
const myName = (name) => console.log(`こんにちは、${name}さん`);
myName();
// 値を渡していない場合、"こんにちは、undefinedさん"のような形で出力される。

// undefinedを避けるために以下のように記述し、デフォルト値を設定する。
const myName = (name = "ゲスト") => console.log(`こんにちは、${name}さん`);
myName();
// 値を渡していない場合、"こんにちは、ゲストさん"。

const myName = (name = "ゲスト") => console.log(`こんにちは、${name}さん`);
myName("田中");
// 値を渡すと、"こんにちは、田中さん"。

```
git clone 〇〇 が上手くできない時の対処法 〜 Authentication failed for 'https://github.com〇〇 〜

## はじめに
こちら自分用のメモであるためとても雑な記事です。
ただ、同じようなエラーが出た人の助けに少しでもなれば幸いです。
## エラーログ


```.zsh
Username for 'https://github.com':〇〇
Password for 'https://〇〇-user@github.com':〇〇
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/〇〇-user/repository-name.git/
```

##原因
2021/8/31以降よりGithubのポリシーが変更され、従来のパスワード認証によるHTTPSアクセスができなくなった

##解決策
個人アクセストークンいわゆるPAT(Private Access Token)を作成し、パスワードを打ち込む代わりにこれを指定する。

###環境
macOS Monterey 12.1
![スクリーンショット 2022-01-21 23.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/214c145a-8a40-7ff0-c76c-d440f451aa50.png)
![スクリーンショット 2022-01-21 23.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/e0cfd6f8-3adc-f529-00cf-cc633504f919.png)


###1. PAT(Private Access Token)を作成する
下記リンクのGitHub公式ドキュメントを参考にPATを作成します。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

##### ⚠️ ブラウザを閉じてしまうと先ほど作成したPATは再生成する必要が生じるので忘れずにコピーしておきましょう



###2. パスワードの欄に先ほど作成したPATを設定する

再挑戦！

```.zsh
$ git clone 〇〇
```

```.zsh
Username for 'https://github.com': GitHubのユーザー名
Password for 'https://xxxxx@github.com': 　先ほど作成したPATを入力する！！
```


いかがでしたでしょうか！？
少しでもエラー解決の助けになっていれば幸いです！
Nginxのルートディレクトリからproxy_passするとき備忘録

Nginxでリバースプロキシをするときは `/etc/nginx/sites-available/~` にconfigファイルを作成して `/etc/nginx/sites-enabled/~` にリンクします。

Nginxさんにはリバプロだけしていただいて、ルートディレクトリから別のホストへプロキシしようとしたら、サブディレクトリ以下のルーティングをしてくれずにハマったので備忘録。

```conf
location / {
    try_files $uri $uri/ =404;
    proxy_pass <TARGET HOST>;
    
    location ~ {
        proxy_pass <TARGET HOST>;
    }
}
```

正解じゃないのかもしれませんが、ひとまずlocationの中に、全てを含む正規表現をもう一回入れてあげることで解決。
もう一度言うと最適解ではないかもしれない。

今後良い方法見つけたら追記します。

### P.S.

直接的な関係はありませんが、 `proxy_pass` ディレクティブに与えるURI備忘録

```config
location /abc/ {
    proxy_pass http://192.168.1.x; #1
}
```
と
 
```config
location /abc/ {
    proxy_pass http://192.168.1.x/; #2
}
```

では挙動が違うと言うもの。

1は `http://example.jp/abc/def` にアクセスすると、 `http://192.168.1.x/def` に転送される。

2はそのまま `http://192.168.1.x/abc/def` に転送される。

その時々によってどちらかを正しく選択することが重要ですネ。
React の build で MiniCssExtractPlugin is not a constructor と言われたとき

## 現象
create-react-app した react アプリを build しようとしたら、怒られた。

```bash
$ yarn build
yarn run v1.22.17
$ react-scripts build
/Users/.../node_modules/react-scripts/config/webpack.config.js:664
        new MiniCssExtractPlugin({
        ^

TypeError: MiniCssExtractPlugin is not a constructor
```

そんなこと言われても！！


## 環境
react: 17.0.2
node.js: v16.13.1
yarn: 1.22.17

## 解決策

["TypeError: MiniCssExtractPlugin is not a constructor" in fresh CRA installation #11930](https://github.com/facebook/create-react-app/issues/11930)

原因は、ここに書いてある通り、```mini-css-extract-plugin``` のバージョンが上がったかららしい。解決策は、```2.4.5``` を使えとのこと。

```package.json``` に以下を追加して、```yarn install``` すると直る。

```json:package.json
  "resolutions": {
    "mini-css-extract-plugin": "2.4.5"
  }
```

なお、```yarn add mini-css-extract-plugin``` などとして、```dependencies``` や ```devDependencies``` に追加しても、```2.4.5``` が、別途インストールされるだけなので直らない。


すぐに React 側で問題なくなるんじゃないですかね。待てないよって人は、これで。
セキュリティ未経験大学生でも情報処理安全確保支援士になりたい！

## はじめに
先日(とは言っても結構前ですが)，情報処理安全確保支援士試験(旧セキュリティスペシャリスト試験)に合格しました．私は実務未経験の学生だったのもあり，どのように勉強の指針を立てるかに苦労したので，偉そうに勉強方法を載せておきたいと思います．あくまで個人の意見になりますので，この記事の通りに勉強をしても合格が保証されるわけではありません．
## 自己紹介
* 都内の某大学の院生(受験時は学部生)
* 現在は暗号理論に関することを勉強・研究したり，CTFをやったりしてます．他セキュリティ関係のイベントに参加したり，セキュリティに関係ない分野も勉強したりしてます．

## 情報処理安全確保支援士試験を受けるメリット
ネットでよく情報処理安全確保支援士試験(以下SC試験)を受けるメリットとして挙げられるのは「給与アップ」です．
個人的には，応用情報技術者試験には合格したけれど，特に何か身についた感じもしないし，夏休み暇だしなんか勉強したいな〜みたいな軽い気持ちで高度情報処理技術者試験の要綱を見ていたら，どうやら
1.  SC試験に合格して講習を受けると「情報処理安全確保支援士」として登録できる
2. 高度情報処理技術者試験の中では唯一年に2回開催されている試験である
3.  他の試験と比べて合格率がそこまで低くない(10%ちょっとは毎年ある)

このような特徴があるようでした．特に個人的に大きいと感じたのは，2番です．仮に試験に不合格でも半年後に受け直すことができるというのは，時間にそこまでゆとりのなく，かつモチベーションを維持して勉強をしたい私に取って魅力的に感じました．

かくして，SC試験の申し込みを行いました(自分は申し込んでから勉強を始めるタイプの人間なので，申し込むまでは特に勉強をしていませんでした)．

## 勉強方針
SC試験に合格するのに必要な能力は大きく以下の３つだと考えています．
*  広範囲のITリテラシ
*  セキュリティの観点でシステムを観察する能力
*  国語力

当然ながら，ネットワークやデータベース，通信やWebなどのいわゆるITリテラシは前提となってきます．SC試験では，これら広範囲に及ぶ分野をセキュリティの観点からどう指摘できるかが重要になってきます．普段から様々なことにいちゃもんをつけられる人は強いと思います(?)．また，監査報告書や管理規定などを読む必要があるため，ある程度の国語力は必要になってきます．

上記のように記しましたが，具体的な勉強方針としては，

0. 応用情報技術者試験に合格する
1. 参考書でセキュリティ周りの理解を深める
2. 過去問演習(午前)
3. 過去問演習(午後)

になります．
### 1. 応用情報技術者試験に合格する
もしSC試験を受けようとしている方で応用情報技術者試験(以下AP試験)に合格していない方がいれば，まずAP試験合格に全力を尽くしましょう．SC試験に必要な前提知識を得ることができますし，何よりSC試験の午前Iの免除を受けられます．

### 2. 参考書でセキュリティ周りの理解を深める
基礎的な知識に自信がある方はいきなり過去問演習を行っても良いですが，そうでもない方はまず参考書等を使って基礎的な知識を深めていきましょう．使う参考書はSC試験を照準においている一般的なものでいいでしょう．私は[うかる！情報処理安全確保支援士](https://www.amazon.co.jp/dp/479816867X/)シリーズを用いましたが，非常によくまとまっていて良かったと思います．各自の好きな参考書を使用してください．あまり細かく勉強しすぎる必要もないとは思いますが，各用語がどういう意味なのか軽く説明できるくらいにはきちんと勉強すると良いと思います．
### 3. 過去問演習(午前)
2での学習と並行しながら過去問演習を行うと良いです．[情報処理安全確保支援士ドットコム](https://www.sc-siken.com/)の過去問道場をやり続けましょう．最初の方は結構な頻度で間違えると思いますが，あまり気にせず周回しましょう．そこで自分がよく間違えると感じる分野は参考書を用いて勉強し直しましょう．私は過去問道場を八段くらいまでやりました．最後の方は一年分を10分もかからずに周回できるようになると思います．

SC試験の午前IIはほとんど過去問からでるので，過去問道場を完全に解けるようになるだけで(理解が浅くても)突破できるようになります．過去2回分の過去問は出ないと言われているので，試験直前の力試しに使うのもありだと思います．
### 4. 過去問演習(午後)
個人的に，SC試験で一番大事な対策だと思います．午後問題は問題文が長く，時間が90分と短いため，素早く問題を処理する能力が必要になります．ただ，問われていることはシンプルなことが多く，きちんと過去問演習を行い対策を積めば，他の受験生と差がつけやすい部分だと思います．

午後の過去問演習は，最初は問題解説が詳しい参考書を購入してやるといいでしょう．私は[重点対策シリーズ](https://www.amazon.co.jp/dp/4865752404/)を用いましたが，解説が詳しければ詳しいほど良い参考書だと思います．各自の肌に合ったものを使いましょう．最初はあまり解けないかもしれませんが，解説を読むと，結構単純な思考プロセスで答えに辿り着けることが多く，また必ずしも小難しい知識が必要ではないことがわかると思います．何度か演習を続けると，文章の中で「この部分，セキュリティ的にどうなの？」と思える箇所がだんだん増えてきて解きやすくなると思います．

参考書に乗っている分の過去問演習が終わったら，過去問ドットコムに掲載されている午後問題を解いていきましょう．古い問題は若干範囲や形式が違うかもしれませんが，似たような題材が出題されることもありますし，全く同じ語句を答えさせる場合(私の場合は「タイムゾーン」を答えさせる問題が全く同じように出てきました)もありますので，できる限りたくさんの問題を解くことをお勧めします．

## その他
* 午前IIでは新しい問題も出ますが，~~諦めて鉛筆を転がしましょう．~~ 語句の意味を英語の意味から類推したり，消去法で選択肢を絞ったりして，正答率を少しでも上げる努力をしましょう．また，過去問に似ているけれど微妙に問われている内容が異なる場合もあるので，十分に見直しをするようにしましょう．

* 午後I問題は三題の中から二つを選択する必要がありますが，この選択は大事なので，過去問演習の中で時間を測りながら二題を選択して時間内に解き切る練習をすると良いと思います．
* 私はSC試験には合格しましたが支援士登録はしていません．誤解を招くようなタイトルですみません．~~それより講習費用安くしてください．~~

## 学生向け
* SC試験に限らずこの辺の分野の理解を深めるのに一番良いのは学校の授業だと思いますので，様々なことに興味を持って学校の授業を幅広く真面目に受けておくことをお勧めします．
* 受験当日は周りの受験生が中年ばかりで日和るかもしれませんが，所詮紙と鉛筆を用いた試験なので，学生の方が慣れていますし，実際IPAの出している統計データとしても学生の方が合格率が高いと出ているので，あまり気負わずに受験しましょう．
SQL エラー 備忘録　自分用

##GROUP BY句で指定するか、集約関数内で使用しなければなりません
###自分用
###DB：PostgreSQL
```
    SELECT
        history_id,
        COUNT(*)
    FROM
        (
        SELECT
            his.*
        FROM 
        housework_history AS his
        WHERE
        works_id= 2/*i*/
        AND
        flag_nexttime_comp = FALSE
        ) AS A

```
###欲しい結果
|history_id|count|
|----|----|----|
|2|2||
|31|2||

```
列"a.history_id"はGROUP BY句で指定するか、集約関数内で使用しなければなりません
```
###GROUP BY追加
```
GROUP BY history_id;
```
###結果
|history_id|count|
|----|----|----|
|2|1||
|31|1||

##集約関数
集約関数は複数の入力値から単一の結果を計算

https://www.postgresql.jp/document/9.2/html/functions-aggregate.html
##分析関数
それぞれの行で集計結果を計算
###OVER()をつけることで分析関数として使うことができる。
```
COUNT(*)
↓
COUNT(*)OVER()
```
https://qiita.com/YuichiTanaka007/items/2758ff8d14526b2e0ba3
オフショア開発センター（ODC）についてAからZまで

#オフショア開発センター（ODC）についてAからZまで
![Offshore-Development-Center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512901/3d0bb3ff-58ee-cb0f-889b-6575206f17de.png)


新型コロナウイルスの世界的大流行の影響を受けて2年が経った、ビジネス運営の劇的な変化がはっきりと見られます。 新型コロナウイルスの感染拡大は、世界中で金融と経済活動の停止につながりました。 市場で最も著名なプレーヤーでさえも、コストを削減するためにできる限りのことをしています。 IT業界における企業もこの課題への最も効果的なソリューションとして オフショア開発 センター を建設する傾向にあります。

「オフショア開発センター」（ODC）という用語は一部の企業にとって一般的になったようです。「オフショア開発センターとは？」、「なぜ多くの企業、特にIT企業はコスト削減のためにソリューションとして オフショア開発センターを選択しているか」等の質問に対する回答を探していれば、今回の記事をご覧ください。

##1. オフショア開発センターとは？
__オフショア開発センター__ は、別の国にあるソフトウェア開発センターです。 オフショア開発センターの建設は事業を行うために海外にある専用のチームの構築・採用を実施することです。ODCは下記のように3つの主要な特色があります。
+ スケーラビリティ
+ 専用チーム
+ 統合
ODCの主なリソースは人的リソースとインフラストラクチャが含まれます。 顧客の要求によって、ODCの人事は、ソフトウェア開発者にとどまらず、と管理スタッフとサポートスタッフが含まれるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512901/ee0087e9-a6d4-cfb4-2e74-708b196b7866.png)
                        
          _オフショア開発センターとは？_

オフショア開発企業は最小１名からの開発チームを構築し、要求に応じて人数を増減することなど柔軟なサービスを提供できます。人数次第で、顧客企業が異なる管理方法を実施します。

ODCが人気のある理由は、ODCが費用対効果をもたらすからです。ある調査によると、ODCは、ソフトウェア開発のコストを60％削減するのに役立つ可能があります。具体的には、ODCのチームに比べると、社内に開発者チームを設けるのはよりコストがかかることにつながります。ODCの場合では、 地域別価格制度により、低い人件費で優秀な開発チームを構築することができます。一方で、社内に開発者チームの場合で、企業はインフラストラクチャコスト、オフィス賃料や管理コスト等を支払う必要となります。これらのコストは、些細なそうも見えるが、合計すると膨大なコストになっていきます。

オフショア開発センターのもう1つのメリットは、プロジェクトに専任チームを提供することです。 このチームは要求または仕事量次第で、1つのプロジェクトまたは複数のプロジェクトに取り組んでいきます。 ODCは自社の海外ブランチとして稼働するので、自社の人材と同じように欲しい仕事を依頼できます。

 
##2. オフショア開発センター とITアウトソーシングの違いは何でしょうか？
多くの人が「オフショア開発センター」と「アウトソーシング」は同じだと考えていますが、実際にはこの２つのモデルが少し違います。

ITアウトソーシングは国内外問わず別の企業に業務の一部を発注すること一方で、ODCは海外だけにある開発チームにプロジェクトを依頼することです。

それでは、外部に自社の仕事を委託する際に、「ロケーション」という要素はどんな影響を与えますか？

オフショア開発は、国際的なアウトソーシングと呼ぶものとして、特にIT業界におけるコスト削減のための最適なソリューションです。地域別価格設定のおかげで、一部の国は他国により人事の面で有利な価格をもたらします。 これにより、企業はオフショア開発を導入すると、より低コストで優秀な人材を採用することができます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512901/cf78f40a-f268-3631-6b0e-1c01dfd40422.png)
                               _オフショア開発センターとITアウトソーシングの違い_

ITアウトソーシングプロジェクトの核心は出力結果であり、アウトソーシングチームがその結果をもたらす方法は小さな要素にすぎません。簡単に言えると、顧客はプロジェクト管理にほとんど干渉しません。その一方で、ODCはブランチとして稼働するので、顧客のガイドラインと行動規範に従う仕事をすることが必要です。

どのモデルが自社の目的に適しているかわからない場合は、次のことを検討してください。

+ ITアウトソーシングのプロジェクトは、成果の質に重視するので、コストは小さな要素にすぎません。 ITアウトソーシングチームの人事は、時間の経過とともに変化する可能性があります。 ITアウトソーシングチームは通常に1つのプロジェクトだけに取り組みます。別のプロジェクトがある場合は、別の専用チームまたは契約が設定されていきます。
+ その一方で、ODCの最優先事項はコストを削減することです。アウトソーシングプロジェクトに比べると、プロジェクト内の管理はより綿密に行われます。顧客がプロジェックを管理するために人員を補充する場合もあります。 その上、ODCのプロジェクトでは同時に複数のプロジェクトに取り組むことができます。
 
-------------------------------------------------------------

**関連記事**
・[オフショア開発を実施する際にどんな課題に直面しますか？](https://lotus-ts.com/jp/blogs/offshore-software-development-center/?utm_source=Qiita&utm_medium=Share+Blog&utm_campaign=LTS)
・[なぜベトナムオフショア開発を実施すべきでしょうか？](https://lotus-ts.com/jp/blogs/vietnam-your-next-software-outsourcing-destination/?utm_source=Qiita&utm_medium=Share+Blog&utm_campaign=LTS)
・[ITオフショア開発費用予測の方法](https://lotus-ts.com/jp/blogs/estimate-it-outsurcing-costs/?utm_source=Qiita&utm_medium=2022&utm_campaign=Share+Blog)