OmniAICreator/Qiita-1.07M huggingface dataset:
JSの復習：オブジェクトの基礎

<h1>オブジェクトの取り出し方基礎

基本的にUdemyから学んだことのコピペです。
今回はオブジェクトの取り出し方について。

```javascript:main.js
let obj = {
    props1:'value1',
    props2:'value2',
    props3: function(){
        console.log('value3');
    },
    props4: {
        props5:'value5'
    },
    
}

console.log(obj.props1);
obj.props3();
console.log(obj.props4.props5);

obj.prop6 = 'value6';
console.log(obj.prop6);
console.log(obj['prop6']);
```
コピペしてjsファイルに貼り付け、コンソールの確認をしてみてください
大体の取り出し方がわかるはずです。


参考は、CodeMafiaさんのガチで学びたい人のためのJS講座です。↓

[Udemy](https://www.udemy.com/course/javascript-essence/learn/lecture/19505454#content)
【AWS DBS-C01】合格のための知識詰め込み

# はじめに
AWS DBSの試験対策で練習問題を解き、ひたすら知識を詰め込みます。

# データベース設計

## RDS
- マルチAZを有効にしていると、AmazonRDSは別のアベイラビリティーゾーンのスタンバイレプリカに自動的に切り替わる。
- マルチAZでは、エンジンレベルのアップグレードは同期的に行われるのでダウンタイムが発生する。
- パラメータグループを変更した場合、動的パラメータはすぐに適用され、静的パラメータは再起動により適用される。
- リードレプリカを作成するときはスナップショットから読み取り専用インスタンスを作成し、バックアップ保持期間を0以外にし、自動バックアップを有効にする。
- RDSAPIやAWSCLIを使用してインスタンスを作成する場合、バックアップ保持期間は1日、マネコンは7日
- 自動バックアップを無効にすると自動バックアップの全てのデータが削除される。
- プライマリインスタンスを削除する前にリードレプリカを全て削除する必要がある。

## Amazon Aurora
- フォールトインジェクションクエリを使用して、AuroraDBクラスターのフォールトトレランスをテスト可能。
- 任意のエンドポイントに接続するためにはカスタムエンドポイントを使用する。
- AuroraReplicaLagはリーダノードへの更新の際のラグ。リーダノードの構成をライターと同等以上にしつつ、書き込みを監視することで発生を予防可能。
- クローンをテストDBとして作成することが可能。
- バックトラック機能により高速な巻き戻しが可能。これはクラスター全体に影響する。

## DynamoDB
- TTLを設定することでアイテムを自動で削除可能。
- 結果整合性は1秒あたり2回、強い整合性は1秒あたり1回、トランザクション読み取りは1秒あたり0.5回


# 展開および移行
- 基本的にダウンタイムが許容できデータも少ない場合はバックアップデータやCSVのエクスポート、インポート。
- ダウンタイムが許容されない場合はDMS
- 互換性のないDBの移行はDMS
- サイズが大きすぎる場合はSnowballを使用する。

## LOBの移行
- 完全LOB：すべてのデータを移行するが、パフォーマンスが下がる可能性がある。
- 制限付きLOB：大きすぎるLOBは手動で移行する。
- インラインLOB：大きいデータと小さいデータを両方レプリケート。


## RDS->Aurora
- RDSのリードレプリカをAuroraクラスターに移行しレプリカをプロモート
- RDSのスナップショットからAuroraを作成
- mysql dump、S3へバックアップを出力し復元、S3にCSVを作成し復元でも可能。

## オンプレミスのOracle -> Aurora 
- ダウンタイムゼロ　費用対効果も高くする
    - SCTを使用して、スキーマの移行中にデータベースオブジェクトをMySQLに変換。DMSを使用して、フルロードおよびCDCを実行。

## S3 -> Neptune
- 頂点とエッジが適切なヘッダー列フォーマットで異なる.csvファイルに指定されていることを確認
- Neptune DBインスタンスのIAMロールが、S3バケット内のファイルへのアクセスを許可する適切なアクセス許可で構成されていることを確認
- S3 VPCエンドポイントを作成し、データベースのローダーエンドポイントにHTTPPOSTを発行

## DMS
- 移行の正確性を検証するためにはDMSデータ検証を構成してソースとターゲットのデータを比較する。
- RedshiftやS3への移行もサポート。
- ターゲットDBインスタンスと同じAZにレプリケーションインスタンスを置くことでパフォーマンスを向上させることが可能。
- 移行の速度を上げるには
    - 複数のAWSDMSタスクを作成する
    - AWSDMS レプリケーションサーバーの容量を増やします。
    - オンプレミスデータセンターとAWSの間にAWSDirectConnect接続を確立します。

# 管理および運用
## DynamoDB
- バックアップと復元の全てのAPIはCloudTrailで記録可能。
- バックアップは読み書きの容量、LSI、課金モードを保持する。
- AutoScalingポリシー、IAMポリシーは手動で再設定する。
- 自動バックアップは単一のリージョンのみで使用可能。
- GSIは結果整合性のみをサポート。

# 監視およびトラブルシューティング
## RDS
- メモリ使用率は拡張モニタリングでのみ有効。
- Enhance MonitoringでOSのメトリックを監視可能。
- RDS Performance Insightsでパフォーマンスに影響の与える問題の分析が可能。

# セキュリティ
## RDS
- 暗号化されたスナップショットを別のAWSアカウントと共有する
    1. ターゲットアカウントをカスタム（デフォルト以外）のKMSキーに追加
    1. カスタマー管理キーを使用してスナップショットをコピーしてから、ターゲットアカウントとスナップショットを共有
    1. ターゲットアカウントから共有DBスナップショットをコピー
- RDSを後から暗号化する
    1. 暗号化されていないRDSDBインスタンスのスナップショットを作成
    1. スナップショットの暗号化されたコピーを介して暗号化されたスナップショットを作成
    1. この新しい暗号化されたスナップショットを新しいDBインスタンスに復元
- 暗号化されたスナップショットを別リージョンにコピーするには、宛先リージョンのKMSキーを指定する。

## IAM
- 複数のIAMユーザやロールを同一のDBアカウントにマップ可能。
- EC2でDBが実行されている場合はインスタンスプロファイルのクレデンシャルでアクセス可能。
- IAMDB認証は1秒あたり最大200接続まで。
- 設定できるのはMysqlとPostgreSQLのみ。
gatsby develop で  Missing onError handler for invocation 'building-schema' エラー

# 環境
```
MacOS Catalina 10.15.7
nodejs v16.8.0
Gatsby CLI version: 4.18.0
```

    "gatsby": "^4.18.0",
    "react": "^18.1.0",
    "react-dom": "^18.1.0"
    "gatsby-plugin-image": "^2.18.0",
    "gatsby-plugin-sass": "^5.18.0",
    "gatsby-plugin-sharp": "^4.18.0",
    "gatsby-source-wordpress": "^6.18.0",
    "gatsby-transformer-sharp": "^4.18.0",
    "prettier": "^2.7.1",
    "sass": "^1.53.0"

```
Local 6.4.1
WordPress 5.9.3
```

```
WP Gatsby 2.3.3
WP GraphQL 1.8.6
WP Multibyte Patch 2.9 
```

## 症状
Local で WordPress を起動
.env の WPGRAPHQL_URL に Local の graphql を設定
```gatsby-config.js
require('dotenv').config();

module.exports = {
  plugins: [
    {
      resolve: `gatsby-source-wordpress`,
      options: {
        url: process.env.WPGRAPHQL_URL,
      },
    },
    `gatsby-plugin-image`,
    `gatsby-plugin-sharp`,
    `gatsby-transformer-sharp`,
    `gatsby-plugin-sass`,
  ],
}
```

`gatsby develop` で下記エラー
```
Missing onError handler for invocation 'building-schema', error was 'Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but "WpTemplate_空白" does not.'. Stacktrace was 'GraphQLError: Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but "WpTemplate_空白" does not.
```

## 対応
WordPress管理画面で `設定` `一般` `サイトの言語` を `日本語` から `English(United States)` に変更
FlutterにGoogleAnalyticsを導入しようとしたら、PlatformExceptionが発生してアプリが起動しなかった話

## やろうとしたこと
Flutter製のアプリにFirebase Analytics(≒GoogleAnalytics)を導入しようとした。
[公式ページの説明](https://firebase.google.com/docs/analytics/get-started?hl=ja&platform=flutter#add-sdk)に従って、firebase_analyticsをpubspec.yamlに入れて、デバッグ実行しようとしたら以下のエラーを吐いてクラッシュした。

## 環境
macOS Monterey 12.4
VisualStudio Code 1.68.1
iPhone11 (iOS15.5)

## 発生したエラー
```
PlatformException (PlatformException(channel-error, Unable to establish connection on channel., null, null))
```
![スクリーンショット 2022-07-08 20.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296554/5df3beb8-1f26-19ff-6b9e-03374285645d.png)

## 原因
先行で入れていたFirebase Coreとのバージョン違いによる兼ね合いが原因と思われる。
実はこの作業に先立ち、3週間ほど前にFirebase Crashlyticsを先行してアプリ内に組み込んでいた。
そちらの対応が終わったのでFirebase Analyticsの対応をしていたところこの件に躓いた次第だった。

Firebase Coreのバージョン： 1.17.1(2022/5/26公開)
Firebase Crashlyticsのバージョン： 2.8.1(2022/5/26公開)
Firebase Analyticsのバージョン： 9.1.12(2022/7/1公開) ←New!!

## 対処方法
すでに導入済みのCrashlyticsのバージョンは上げたくなかったので、Analyticsのバージョンを5/26時点のバージョン(9.1.9)に戻すことで水準を合わせた。

(作業手順)
* 一旦全ての差分を破棄
* flutter clean
* `firebase_analytics: 9.1.9`をpubspec.yamlに記述
* flutter pub get
* flutter run

これをおこなったことで、無事に起動するようになった。
自分の場合は前に入れていたもののバージョンに合わせたが、特にこだわりがなければfirebase関連のパッケージを全て最新で統一するのもアリかもしれない。

お試しあれ
左矢印←　右矢印→を使わずに移動する方法（ショートカット）

# 状況・課題
### コーディングや文を書く際に、矢印キーまで指を動かすのが面倒...。

Mac,Linuxを使っている。

# 解決策
### Ctrl + f で右に移動

### Ctrl + b で左に移動

これで手を動かす距離が減って、移動が楽になるかも知れません！

アプリケーションによっては対応してないこともあるので、注意してください。

参考になれば嬉しいです!

### 見ていただき,ありがとうございました！
React: Parcel の使い方

こちらを参考にしました。
[Building a web app with Parcel](https://parceljs.org/getting-started/webapp/)

## プロジェクトの用意 ##

```bash
mkdir proj01
cd proj01
yarn init -y
yarn add react react-dom
yarn add --dev parcel
```

## プログラムの作成 ##

フォルダー構造

```text
$ tree src
src
├── App.js
├── index.html
└── index.js
```

```html:src/index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>My Parcel App</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="index.js"></script>
  </body>
</html>
```

```js:src/index.js
import ReactDOM from "react-dom";
import { App } from "./App";

const app = document.getElementById("app");
ReactDOM.render(<App />, app);
```

```js:src/App.js
export function App() {
  return (
<>
<h1>Hello world!</h1>
<blockquote>
<p>Jul/08/2022 PM 19:55</p>
</blockquote>
</>
)
}
```

```json:package.json
{
  "name": "proj01",
  "version": "1.0.0",
"source": "src/index.html",
  "scripts": {
    "start": "parcel",
    "build": "parcel build"
  },
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "parcel": "^2.6.2",
    "process": "^0.11.10"
  }
}
```

## サーバーの起動 ##

```bash
yarn start
```

ブラウザーで
http://localhost:1234
にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/08b44b8e-57f9-2994-16c1-14f7bfbc2254.png)
【Visual Studio Code】ソースをデプロイまたは取得中にエラー: デプロイまたは取得しようとしたファイルかディレクトリが sfdx-project.json ファイルで指定されたパッケージディレクトリにありません。

# 問題

clsを保存しようとしたら下記のエラーが出てきてデプロイできない。
※いつもはVSCodeの設定から「Push-or-deploy-on-save」を「Enabled」にして、Ctrl + Sで変更内容の保存と同時にデプロイを行っていました。

> ソースをデプロイまたは取得中にエラー: デプロイまたは取得しようとしたファイルかディレクトリが sfdx-project.json ファイルで指定されたパッケージディレクトリにありません。この場所を "packageDirectories" の値に追加するか、異なるファイルやディレクトリをデプロイまたは取得してください。sfdx-project.json についての詳細は https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_config.htm を参照してください。

デプロイまたは取得しようとしたファイルかディレクトリ
→XXXX_Test.cls

sfdx-project.json ファイルで指定されたパッケージディレクトリにありません。
→"path": "force-app"の中に「XXXX_Test.cls」がある。

・・・？

# 解決策

下記のコードをターミナルから実行するとデプロイができました。

```java:test.cls

// Apexの場合
sfdx force:source:deploy -m "ApexClass:MyApexClass"

// VFの場合
sfdx force:source:deploy -m "ApexPage:MyApexPage"

```

面倒なので元に戻せないか確認中・・・

# 解決策2 オススメ！！！

・VSCodeのターミナルで「sfdx update」を行う
・拡張機能から「Salesforce CLI Integration」が最新になっているか確認する

「sfdx update」だけだと、「Salesforce CLI Integration」はアップデートされないのが、注意点。
拡張機能を見ると「リフレッシュ」みたいになってるので、押下するとVSCodeが再起動されます。

私のバージョンは下記になりました。
・sfdxは「sfdx-cli/7.158.1 win32-x64 node-v16.15.1」です。
・Salesforce CLI Integrationは「v55.4.1」です。

# 参考リンク

[任意の組織に対する開発](https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_dev.meta/sfdx_dev/sfdx_dev_develop_any_org.htm)

[Salesforce CLI Integrationのバグだったようです](https://github.com/forcedotcom/salesforcedx-vscode/issues/4261)
EDAの初手にやるべきこと集

# これは何か
EDAする時に自分が初手によくやっていることをまとめる。今、雑にまとめたいだけなのだが、追々ちゃんと整理する。

## 事前準備
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.style as style
style.use('fivethirtyeight')
import seaborn as sns
import os
```

# 全体概観
## 欠損値確認
```python
print(train.isnull().sum())
print(f'train data: {len(train)}')
```

## 要約統計量の確認
```python
train.describe()
```

# 単変量解析
## histgram

```python
sns.distplot(train['col_name'], bins=100, kde=False)
plt.show()
```

## 棒グラフ
```python
value_counts = train['col_name'].value_counts()
value_counts.name = 'col_name count'
sns.countplot(value_counts)
plt.show()
```

# 多変量解析
追記予定
基本情報（ハードディスク以外の補助記憶装置パート2）

https://qiita.com/jupippii/items/16230d9a7e1833b1abb6

前回は上記を書きました。引き続きアウトプットしていきます。

## 磁気テープ
磁性体が塗布された「テープ状のフィルムに、時期を使って読み書きを行う」カセット型の記憶媒体が磁気テープ装置のようです。
ブロックごとにスタート、ストップすることをせず、連続してデータの読み書きを行うものをストリーマと呼びます。
![400px-Kaseta_magnetofonowa_ubt.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/dc51fbce-aecc-d1ba-7aae-86b06e559e61.jpeg)
もう全く使わないですね。。。

## フラッシュメモリ
EEPROMの一種を補助記憶媒体に転用したものがフラッシュメモリ。
EEPROMってなんだか忘れてしまったので下記にメモ

>EEPROM（Electrically Erasable and Programmable Read Only Memory）とは、コンピュータで使用される半導体メモリの一種で、基本的には記録されている内容を書き換えることができない読み出し専用だが、電気的にデータを消去して書き換えることができるメモリのことです。

半導体メモリの一種みたいですね。
代表的なものにメモリカード、USBメモリがあります。
コンパクトで、かつ低価格のためデジタルカメラや携帯電話などの記録メディアに利用されたり、データの持ち歩きに利用されたりしています。

## SSD(Solid State Drive)
ハードディスクの代替として使われているのがSSD。

SSDは内部にディスクを持たず、フラッシュメモリを記憶媒体として内臓する装置です。
機械的な駆動部分がないので省電力で衝撃にも強く、シークやサーチといった待ち時間もありません。

SSDは書き込み回数に上限があり、ハードディスクに比べてビットあたりの単価が高くなるので、まだ完全には普及がされていないようですね。

自分が使っているmacはSSDなので下記を参考に調べてみました。

https://abc-by.com/macbook-ssd-monitoring/

Percentage Used:                    1%

2年弱使って1%なので全然余裕っぽいですね。

## まとめ
暗記領域
Firebase Storageから全ての画像ダウンロード

該当するフォルダを事前に作成する必要がある

```download.js
const admin = require('firebase-admin');
const fs = require('fs');

const serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    storageBucket: "<BUCKET_NAME>.appspot.com"
});

const bucket = admin.storage().bucket();

async function main() {
    const files = await bucket.getFiles();
    files[0].forEach(async (file) => {
        const filePath = `./work/${file.name}`;
        if (!fs.existsSync(filePath)) {
            console.log(filePath);
            await file.download({ destination: filePath });
        }
    });
}

main().then();
```

gsutilの方が良さそう
JavaScriptで注意すべき書き方メモ

# exportとimport
1.個々の機能をエクスポート
```javascript:export1.js
export const add = (num1, num2) => {
  return num1 + num2;
  };
export const minus = (num1, num2) => {
  return num1 - num2;
};
```

```javascript:import1.js
import { add, minus } from "./export1.js"
add(1, 2); // 3
minus(2, 1); // 1
```
importするとき {  } でくくる

2.デフォルトエクスポート
```javascript:export2.js
const add = (num1, num2) => {
  return num1 + num2;
  };
const minus = (num1, num2) => {
  return num1 - num2;
};
default export {add, minus};
```

```javascript:import2.js
import calc from "./export1.js"
calc.add(1, 2); // 3
calc.minus(2, 1) // 1

```
デフォルトエクスポートの場合は {  } でくくらない
Windows Update 更新サービスに接続できませんでした


Windowsサーバーを手動でUpdateしようとしたところ、エラーが発生。
インターネットとの接続は確認済み。

ファイアウォールなどで制御もしていなかった。

【解決策】
ドメインの再参加

ドメインを一度抜け、Updateを実行したところ、正常にインストールされることを確認。

再度、ドメインに入り直し、無事にUpdateされた。



【施行したが、変化なかったもの】

![WindowsUpdate失敗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206656/833b66b0-28aa-c19e-0301-3d97bb10b09b.png)


システムファイルのチェックとDISMコマンドを実行することで、破損したシステムファイルの修復をしたが、変化なし。

DISMコマンド：dism.exe online cleanup-image restorehealth
![WindowsUpdate失敗1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206656/157d55b2-a636-69ab-b955-0deacebe9b7e.png)

システムファイルのチェックコマンド：sfc /scannow
![WIndowsUpdate失敗2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206656/cddb1094-fec6-1930-e347-20f20b278b75.png)
LaravelのDBからCarbonを用いて特定の月のデータを取得する

備忘録に


# 今月のデータを取る場合
```
// 今月の初めの時間を取得
$now = Carbon::now()->startOfMonth();
// 日付けあふれなしで翌月から1秒引いた時間を取得
$next = Carbon::now()->startOfMonth()->addMonthNoOverflow()->subSecond(1);
// 取得
$data = $this->whereBetween('updated_at', array($now, $next))->get();
```

nowとnextを変えれば好きな月で取得可能
ヒューズ抵抗器の機能は何ですか？

抵抗器に関しては、誰もがなじみのないものであってはなりません。中学生の時、抵抗器の役割も学びました。誰もが抵抗器の役割を理解する必要があります。現在、市場にはますます多くの抵抗器ブランドがあります。見てみましょうヒューズ抵抗器の詳細をご覧ください。
![c35b40f852ccdc4bc6cebd58c958a4f5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648141/af6a2972-808d-83e3-bea4-027c227cfa94.jpeg)
1.定義の概要

ヒューズ抵抗の定義：抵抗器とヒューズは材料と構造が似ており、ヒューズタイプの抵抗器には両方の機能があります。通常は抵抗器として使用できます。電流が異常になると、それらは機械や設備を保護するためのヒューズの役割を果たします。兼用機能によりコストダウン。ヒューズ抵抗器は、金属膜ヒューズ抵抗器、ヒューズタイプの巻線抵抗器、およびヒューズタイプのセメント抵抗器に分けることができます。電力は、1 / 4W、1 / 2W、1W、2Wです。パワーの増加に伴い、製品の外観サイズは拡大し続けます。

2.はじめに

ヒューズ抵抗器の抵抗値は一般に小さく、そのほとんどは1オーム未満です。多くの場合、回路内でサンプリング抵抗として機能します。同時に、サージが発生したり、他の大電流が発生したりすると、ラインを保護する役割を果たし、ヒューズによって回路が開きます。保護効果。同時に、ほとんどのヒューズ抵抗器はチップタイプであり、比較的安定した性能のチップヒューズ抵抗器は一般にジャベソンヒューズ抵抗器およびジャベソンチップヒューズ抵抗器と呼ばれています。製品は高速ヒューズと低速ヒューズに分けられます。

耐ヒューズ性

3.なぜヒューズ抵抗が大きいのですか？

ヒューズの材質と形状が決定されると、その抵抗Rが相対的に決定されます（抵抗の温度係数が考慮されていない場合）。電流が流れると熱くなり、時間の経過とともに熱くなります。電流と抵抗の大きさが発熱速度を決定します。ヒューズの構造とその設置条件によって、熱放散率が決まります。発熱量が熱放散率よりも小さい場合、ヒューズは切れません。熱が発生する速度が熱が放散される速度と等しい場合、それはかなりの期間融合しません。

上記の情報はヒューズ抵抗に関するものです。ヒューズは、私たちの毎日の家庭の電力消費において非常に重要な役割を果たしています。特に不安定な電圧の場合、それは家電製品の保護的な役割を果たすことができます。その役割はますます顕著になっています。
GitLabにssh接続が急にできなくなった話

どうも、小田急電鉄初のITエンジニアXuです。

昨日、新しいサーバーを立てて、プロジェクトを作成してGitLabにプッシュしようとしたときに
```
git@gitlab.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
このようなエラーによりgit pushが出来なかった。

あれれと思い、sshで接続確認
```shell
~/.ssh$ ssh gitlab

Welcome to GitLab, @[user-name]!
Connection to gitlab.com closed.
```

普通につながるじゃん！
さて困ったなぁと思い、早速調査開始。

### 1．パーミッション変更
```shell
~/.ssh$ sudo chmod 600 git
```
結果：
ssh　〇
git clone　×
変化なし

### 2．IdentitiesOnly追加
```shell
Host gitlab
        HostName gitlab.com
        IdentityFile ~/.ssh/git
        User git
        #追加
        TCPKeepAlive yes
        IdentitiesOnly yes
```
結果：
ssh　〇
git clone　×
変化なし

### 3．4096bitでKeyを再発行
```shell
$ ssh-keygen -t rsa -b 4096
```
結果：
ssh　〇
git clone　×
変化なし

さてどうしようかとなったときに
このブログを発見
https://wing-degital.hatenablog.com/entry/2020/01/03/175752
せや、ssh-agent確認してなかったわ

### 解決方法
Ubuntuの場合
```shell
$ eval $(ssh-agent)

Agent pid 9202
```
ssh-agentに秘密鍵を登録する
```shell
$ ssh-add ~/.ssh/git

Identity added: git ([Email addr])
```
適当に作ったからのプログラムでgit cloneを試すと
```shell
Cloning into 'gitclone_test'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), done.
```
やっと解決できた！

このように小田急電鉄では問題解決が得意なエンジニアの募集を行っております！
ご興味がある方、一緒に問題解決したい方、アイディアを形にしたい方、
[Twitter](https://twitter.com/Xu_takax)でのご連絡お待ちしております！
2022年7月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2022年7月1日の検索結果 (リスティング広告)

![20220701_AIOps_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/26a0dbc5-db62-5b65-7a86-d946e2648f42.jpeg)


* IBM
* shopify
* Splunk
* NTTデータ

リスティング広告だと、今月も IBM がトップでした(4か月連続)。 Shopify が初登場ですが、なぜ AIOps のキーワードで表示されたのかは謎です。

先月の結果はこちら --> [2022年6月 AIOps 定点観測](https://qiita.com/mkodera/items/869e6a87907e89b33fd6)

# 2022年7月1日の検索結果 (広告以外)

![20220701_AIOps_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/f259b8db-68bd-e084-ed36-b52da5b0cdea.jpeg)


* Splunk
* JBSVC
* ServiceNow
* ITmedia
* テックファーム株式会社
* 日本情報通信株式会社 (IBM Watson)

広告以外だと、上位2位までは 2022年2月の定点観測開始以来、不動の2社です。3位以下は順位の変動はありますが、顔ぶれは先月と同じです。

先月の結果はこちら --> [2022年6月 AIOps 定点観測](https://qiita.com/mkodera/items/869e6a87907e89b33fd6)
M1 Mac の Parallels 仮想マシンに Windows 11 Pro を簡単インストール

### なんで今更記事にしたの？
　少し前までは、M1 Macの仮想マシンに ARM版 Windows 11 をインストールするには、Microsoftの「Windows Insider Program」に登録し、Preview版のインストーラをダウンロードしてという手順が必要でしたが、執筆時（2022.7月6日）時点では、その必要もなく、Parallels の新規 Windowsインストールで自動的にダウンロードして、そのままインストールできるのでした。
　それでうまくいったと思ったらインストールされたのは、Home エディションだったし、エディション選択の機会も無かったため、少し試行錯誤して、比較的簡単に Pro 版をインストールできる方法が見つかったので、情報共有しようと記事にしました。

### 手順1 インストーラ（isoファイル）のダウンロード
　なぁんだ結局ダウンローするのかと思った方、Microsoft Insider Program への登録などが不要で、Parallels がインストーラをダウンロードしてくれるのです。
　（既に、Parallels を使用して、homeエディションをインストールしてしまった人は、既にインストーラがダウンロードされていますので、次の手順に進んでください。）
Parallels を起動し、「ファイル」メニューから「新規」を選択します。
出てきたダイアログで、「Microsoft から Windows 11 を入手」を選択して、「続行」ボタンを押します。
![01_InstallerDL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/6d622b83-d150-88ca-2e4a-dbc68aa8970d.png)
すぐにダウンロードが始まります。
![02_InstallerDLing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/61ddf9e6-0ddc-34d1-5cbe-35d598a42022.png)
ダウンロードが完了すると、そのままインストーラが始まります。（ここですかさず停止させる）
![02)StopTiming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/a19508b8-ac1d-dc5b-d1f6-ad0b9a9eac70.png)
この画面が出たらすぐに、「デバイス」メニューでインストールを停止させます。
既に iso ファイルはダウンロードされているはずです。
投稿執筆時のファイル名
「22000.318.211104-1236.co_release_svc_refresh_CLIENTCONSUMER_RET_A64FRE_ja-jp.iso」

### 手順2 Windows 11 Pro のインストール
　いよいよPro版のインストール本番です。
　「ファイル」メニューから「新規」を選択します。
出てきたダイアログで、「DVD/イメージファイルからWindows/その他 OS をインストール」を選択して、「続行」ボタンを押します。
![03_2ndInstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/62c3befe-e770-e18a-798c-ea8f9a96d8d5.png)
すぐに、OSのエディションを選択するダイアログが出ます。
![04_SelectOSType.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/e15ac582-a22d-24cb-55b3-7cf32ee6c7cc.png)
ここで Windows 11 Pro を選択します。
![04x2_selectOSEdition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/d82e10d5-faa0-ac11-2799-cfc578345d4e.png)
更に、Pro 版をどういう用途で使用するのか選択するダイアログが出ますので、お好みのタイプを選びます。
![05_selectJobType.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/9055335e-899a-02c6-8264-258c53cf27b1.png)
　これでWindows 11 Pro のインストール・セットアップが始まりますので、完了するまで待ちましょう。
　セットアップ後はアップデートが結構ありますので、全部インストールしましょう。

### 手順3 ライセンスの認証
　既に、Pro版のライセンス（プロダクトキー）をお持ちの方は、プロダクトキーを入れてライセンス認証ができるはずですが、うまくいかない時や、他のマシン等にインストールされているライセンスを使うこともできます。
　うまくいかない時は、この画面で「トラブルシューティング」ボタンを押します。
![06_lisenceChk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/cbd2ee25-cdae-1a68-2044-67ba6d6fefa1.png)
　トラブルシューティングが完了すると、こんな画面が出ますので、画面下の「このデバイス上のハードウェアを最近更新しました」をクリックします。
![07_LisenceChk2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/37a15270-c90c-626d-7665-258ffed06123.png)
　そうすると、Microsoftアカウントへのログイン画面が出ますので、Microsoftアカウントにログインします。Microsoftアカウントにログインできると、アカウントに登録されている（ライセンスが認証されている）機種名等が表示されますので、それを選択して、「このPCです。」と確認すると、無事にライセンスが認証されるはずです。

ここまで。
InstaloaderでInstagramから画像を取得する

機械学習で画像のデータセットが必要な時、GoogleだけでなくInstagramから取得したい。
でも、APIを使うのは申請とかあって面倒くさそう。。。
スクレイピングでやるのも面倒くさい。。。

そんな方向けに、Instagramから簡単に画像をダウンロードできる[Instaloader](https://instaloader.github.io/)を紹介します。
なお、本当はハッシュタグから画像を検索してダウンロードしたかったのですが、、、2022年7月8日現在、バグが発生しており使えません。。。
また、Instagrams自体は、このような手法でデータを取得することを認めていないようです。場合によってはアカウントがロックされる可能性もあるかもしれませんので、各自の責任で実行してください。
## 環境
```
Windows10
anaconda=4.13.0
python=3.10.5
```
## セットアップ
まずはInstaloaderをインストールします。
```
pip install instaloder
```
準備はこれだけ！
## コード
```instaloader.py
import sys
import instaloader

def main():
    TARGET_ID = <データを取得したいInstaアカウントのID>
    USER_ID = <ご自身のアカウントID>
    PASSWORD = <ご自身のパスワード>
    number_of_picture = 300 # 取得したい画像枚数

    cls = GetImageFromInstagram(USER_ID, PASSWORD)
    cls.download_user_posts(TARGET_ID, number_of_picture)

    # 以下、現在バグのため動きません
    # hashtag = <取得したいハッシュタグ>
    # cls.download_hashtag_posts(hashtag)

class GetImageFromInstagram():
    def __init__(self, my_user_name, password):
        self.L = instaloader.Instaloader()
        self.my_user_name = my_user_name
        self.password = password
        self.L.login(my_user_name, password)

    def download_user_posts(self, target_username, limitation=100):
        posts = instaloader.Profile.from_username(self.L.context, target_username).get_posts()

        for index, post in enumerate(posts, 1):
            self.L.download_post(post, target_username)
            if index >= limitation:
                print(f'{target_username}の画像を{limitation}枚保存しました。')
                break

    def download_hashtag_posts(self, hashtag, limitation=100):
        posts = instaloader.Hashtag.from_name(self.L.context, hashtag).get_posts()
        for index, post in enumerate(posts, 1):
            self.L.download_post(post, target='#' + hashtag)
            if index >= limitation:
                print(f'ハッシュタグ#{hashtag}の画像を{limitation}枚保存しました。')
                break

if __name__ == '__main__':
    main()
```
ログインしなくても動きはします。
が、、、僕のときは途中で止まりました。
ブラウザからInstagramを開いた時も、ログインしていないと途中で見れなくなるので、おそらく同じような仕組みが働いているのだと思います。
## 実際に動かしてみる
私の推しのれなひょんのInstagramから画像を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/1a7bb3b0-dbe5-5449-92fb-b0ed0d1c930c.png)
アカウントIDは`renamatsui27`、27は7月27日生まれなのでその数字ですね。
pythonファイルを動かすと同じディレクトリ内に`renamatusi27`とインスタのアカウント名でフォルダが作成され、その中にダウンロードしたデータが格納されます。
シンプルで簡単ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108046/d89609f3-3607-a981-097e-39dffb1d2c96.png)
投稿データ全体を取得します。jsonファイル、テキストファイル、動画なんかも含まれます。
必要に応じて、適宜削除してください。

Instaloaderめっちゃ便利です。
ぜひ試してみてください！
【Copy-Item】コピー先フォルダの存在に気をつけろ！【PowerShell】

# はじめに
どうも、ATLのヴィリアスです。

最近、社内でとあるフォルダの整理をしました。
そのときに「とりあえず整理前フォルダのバックアップを取っておこう」ということで、
何も考えずにPowerShellでCopy-Itemをしたら「**？？？？**」な問題が発生してしまいました。

問題を解決するまで少し悩んでしまったので、今後忘れないように記事にすることにします。

**※免責事項(必ず、ご一読ください)**
　　記事の情報により生じた、いかなる損害や損失についても、当社は一切の責任を負いかねます。
　　また、誤情報が入り込んだり、情報が古くなったりすることもありますので、
　　必ずしも正確性を保証するものではありません。ご了承ください。

# やろうとしたこと
**とあるフォルダの構成を、そのフォルダ内にバックアップフォルダを作成し、そこにPowerShellでまるごとコピーする。**

## 具体的に
サンプルとして、```~\Qiita\Copy-Item\フォルダ```にA, B, Cの3フォルダが存在するとします。
今回の記事では、このフォルダ構成のバックアップを取っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/bdabf9fa-e25f-f6c7-4e6f-ab2101251f7f.png)

ちなみに、A, B, Cのフォルダ内には次のようなファイルがそれぞれ存在します。
(Bフォルダにはb1.txt, b2.txt, b3.txt、Cフォルダにはc1.txt, c2.txt, c3.txt)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/40648773-18a8-efc3-7c11-b08f1354b4b7.png)

最終的には、```~\Qiita\Copy-Item\フォルダ\バックアップ```を作成、そこに上記のフォルダ構成をまるごとコピーし…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/1cf13c20-9734-486b-7723-b689d2342cd9.png)

```~\Qiita\Copy-Item\フォルダ\バックアップ```の構成が、最初の```~\Qiita\Copy-Item\フォルダ```と同じになるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/775345dc-f867-1138-b41d-9253054ddbdd.png)

# 問題発生
一番最初にスクリプトを実行しました。(カレントディレクトリは```~\Qiita\Copy-Item\フォルダ```とします。)
```PowerShell: PowerShell
Get-ChildItem -Path . | #カレントディレクトリのアイテムを取得
ForEach-Object {
    Copy-Item -Recurse $_.FullName ".\バックアップ" #バックアップにアイテムをコピー
}
```

しかし実行した結果、バックアップフォルダは次のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/3a9f131d-35a7-99bd-0f1d-009abe240424.png)

B, Cは想定したとおりにコピーされていますが、
**Aはフォルダまるごとではなく、フォルダ内のファイルのみコピーされてしまいました。**

# なぜ？
Copy-Itemはコピー先パスのフォルダが<b>「存在するとき」と「存在しないとき」で動きが異なる</b>からです。

## フォルダが存在するとき
コピー元フォルダが**コピー先フォルダ内にそのままコピーされます。**(本来やりたかった動き！)

## フォルダが存在しないとき
コピー元フォルダの名称が、**コピー先フォルダの名称に変更されたフォルダ**が作成されます。( [問題発生](#問題発生)での動き…)

### 具体的に

[問題発生](#問題発生)で実行したスクリプトでは、次のような動きをしていました。

1. ForEach-Objectでの1回目のCopy-Itemで、フォルダAの名称が「バックアップ」になっただけのものを作成 (中身はフォルダAと同じ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/aaca0298-87bc-cd00-d3eb-7c8173389f49.png)

1. 2回目、3回目のCopy-Itemで、フォルダ"バックアップ"内にフォルダB, フォルダCをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/15dceb91-1ba9-1efc-d246-5ca429484330.png)

1.でフォルダ"バックアップ"が存在しないために、
**フォルダAの名称が「バックアップ」になっただけ**のフォルダがコピーされていたのでした。

# 解決！
```PowerShell: PowerShell
New-Item -Path "~\Qiita\Copy-Item\フォルダ\バックアップ"; #事前にバックフォルダを作成する

Get-ChildItem -Path . |
Where-Object FullName -NotLike "*\バックアップ" | #バックアップフォルダは除く
ForEach-Object {
    Copy-Item -Recurse $_.FullName ".\バックアップ"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124150/cca695d7-bb8f-5f08-b1f2-3aa860cee137.png)

**事前にバックアップフォルダを作成しておく**ことで、想定した動きになりました！

ちなみにWhere-Objectでは、事前に作成したバックアップフォルダを除外し、
バックアップフォルダ内にバックアップフォルダがコピーされないようにしています。

# おわりに
こうして記事にして改めて問題を振り返ると、なかなかに初歩的なミスをしてるな～と感じました。
もっとスマートなやり方があれば、ご教授いただけるとありがたいです。

それではまた、次の記事で。
【PowerBI】値のカスタム書式設定方法

### 値に独自の単位を付けられないかな？
PowerBIには、例えば、「0.5」という値を「50％」という書式に設定したり、3桁以上の数値にカンマを付けたり一般的な書式が設定できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/eb199ed8-935d-f83f-77a6-21a37a577a91.png)
でも社内で使っているような独自の単位と使用したい場合のカスタム書式はどうすればよいのだろう？

書式設定方法3種類をご紹介します。
[1.通常の書式設定](#1-通常の書式設定)
[2.カスタム書式設定](#2-カスタム書式設定)
[3.テキストボックスで画面に固定表示](#3-テキストボックスで画面に固定表示)

# 1.通常の書式設定
~小数点のある値を百分率で表示する~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/23909b21-2a59-275e-5787-b7d38618060b.png)

「フィールド」で対象のカラムを選択し、「列ツール」のメニューに出てくる書式設定で変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/b19c74a8-ae00-9881-e622-4694b24efb36.png)
小数点以下の桁数はビジュアルのプロパティでも設定できますが、ここでも設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/0d885e2e-94e1-225b-f9c6-36f497d2da24.png)


# 2.カスタム書式設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/d45a79bd-de72-d6f8-a855-3bb028155331.png)

~独自の単位を付ける~

カスタム設定は「モデル」の画面で編集します。
「フィールド」から対象のカラムを選択肢、プロパティの書式で「カスタム」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/b43edff5-d296-3605-1305-1ee146dd4aa5.png)
そうすると、「カスタム書式」という欄が出てきて、プルダウンには一般的なカスタムで設定するような書式が選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/978eb9d0-32d3-7ed0-9dbd-736f5b0eefdb.png)
また、もう一つ下の入力欄では、独自の単位で書式を指定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/7547339e-e4c5-c1eb-ff72-24b7af9399da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/170d8da6-90ba-fad0-9831-7acc5c587f87.png)
単位に設定した文字が表示されていますが、あくまでもデータ型は「整数」なのでこのまま計算にも使えます★

# 3.テキストボックスで画面に固定表示
~データの書式は変えずに、単位を表示~
単純に画面上でデータの単位が分かればOKという場合は、テキストボックスで固定で配置しても良いですよね★
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/57faca87-9660-d5e2-8849-b0d5c40071b5.png)




#### まとめ
他にもメジャーを使って、変則的に表示するカラムを変えたりすることもできますが、
メジャーを使うと整数や小数の値についてもデータ型が「テキスト」になってしまったり、少しデメリットが多いので、汎用的に使えるのは以上かと思いました。
比率の値については、表示する為に敢えて100倍してSQLテーブルを作るなどしなくても書式でどうにかなるので、目的に合わせてデータ整形ができると思います。
今更AndroidのContextについて整理しよう

# 適当に使いがちなContext
fragmentのライフサイクルの勉強しているときに以下の記述を見つけました。

参照記事
https://qiita.com/K4N4/items/76d7bd8036ed98a0c271
>フラグメントのライフサイクルにおいて、最初のメソッド。フラグメントとアクティビティ（コンテクスト）が関連付けられた時に呼ばれる。引数はアクティビティではなく、コンテクスト。他のメソッドにも共通する事であるが、フラグメントは基本的にアクティビティを参照するのではなく、コンテクストを参照する。

あーはいはいcontextね〜っていつもの如く読み流しながら思いました。
#### あれ？contextってなんだっけ？

結構なんとなくで誤魔化している人も多いんじゃないでしょうか（そんなことなかったらごめんなさい）
Android開発している時に様々な場面でContextと記述したり引数に渡すもののいまいち詳しく知る機会ってない気がします。


# Contextとはそもそも何か
公式の説明（https://developer.android.com/reference/android/content/Context）
<雑翻訳>
アプリケーション環境に関するグローバル情報へのインターフェース。
Androidシステムによって実装が提供されている抽象クラス。
上記によりアプリケーション固有のリソースとクラスへのアクセス、およびアクティビティの起動、インテントのブロードキャストと受信などのアプリケーションレベルの操作のアップコールが可能になる。

つまりアプリ開発時に様々な環境や設定へアクセスするためのインターフェースなんですね。
Contextは抽象クラスで定義されている。
→ActivityもApplicationもContextクラスを継承している！！

この辺であー、だからthisでContextを引数に渡せるんだなあって改めて思いました。
Activityでstrings.xmlから文字列取得するときにgetStringできるのもContextを継承しているおかげだったんですね。


# 使う時になんか種類分かれてない？
Contextを取得する際に
getApplicationContext()
getContext()
とあり何が違うんだ？って思いながら使ってました（本当に良くない）

＊一旦ここを読むことをお勧めします。
とってもわかりやすいです。
http://yuki312.blogspot.com/2012/02/thisgetapplicationcontextactivityapplic.html
# ActivityContext
Activityのライフサイクルに従っている。
Acticityの終了後にContextへの参照が残っていると、メモリリークが...（後述の問題に関与）
→ ActivityContextを使う際にそのスコープ外で使ってはいけない。
→ライフサイクルを意識して実装しましょう。

# ApplicationContext
Applicationのライフサイクルに従っている。
Viewに渡す際などApplicationのContextを渡しがちですがそもそもactivityのテーマと異なると想定と違うViewが作成されたり予期せぬ動作をするようです。
世の中には一旦困ったらApplicationContextを使っとけ！みたいなのもありますがちゃんとライフサイクルやスコープを確認して吟味するべきですね...予期せぬ動きも起こり得ますし反省。

# ContextをViewModelで渡したらいけないのはなぜ
ViewModelでResourceから文字列を取得したい時にContextを渡していましたが良くないと教えられました。
なんでダメなんだろうなってなんとなく思っていましたがここまで来るとなんとなくわかりますね。

ActivityContextはactivityのライフサイクルに従っている！
→ViewModelの中でcontext持ってくるとactivityのライフサイクルが終わった時にメモリリークしちゃうからですね。
いやでもContextは欲しいんだけどって時はApplicationContextを付与していいんですかね？上記の観点から不具合も起きそうです。
大人しくBindingしたり外部クラス作成するべきなんですかね（詳しい方いたら教えてください）




# おわりと補足
ライフサイクルの理解を深めようとContextを学んだら今度はライフサイクルの理解をもっと深める必要が起きてめちゃくちゃ密接なんだなと感じました。
基礎的な部分なのにそこそこ蔑ろにしていても実装面で困るシーンが少ないことは結構恐ろしいですね。
それだけ便利ってことでもあるのですが。


## 参照
https://qiita.com/K4N4/items/76d7bd8036ed98a0c271
https://www.torutk.com/projects/swe/wiki/Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-ViewModel
https://qiita.com/tkmd35/items/e6abeed6ac68cbac09ed
https://zenn.dev/issyu_39/articles/5225144dae22efc162fd
テックキャンプ受講した感想

【カウンセリングについて】
最初は不安でカウンセリングを申し込んだのですが、担当の方が優しく対応してくださり質問にも納得するまでお答えしてくださったので安心して入学を決めることができました。
メルカリのようなアプリを作れるようになりますよと言ってくださり、前向きに考えることができました。
受講から２週間以内であれば返金制度もあると聞いたのでまずは試してみようという気持ちで始められました。

【料金について】
受講料がかかることがネックでしたが給付金が対応しているスクールなので躊躇なく入学を決めることができました。
高いクオリティーのカリキュラムで給付金の対応がされているのでかなりお得感がありました。
給付金の申請自体も初めてでしたが、全く難しくなくスムーズにできました。
給付金に関してはライフコーチが何度もZOOMでわかりやすく説明してくださったので遅れや漏れがなくきちんと適用することができました。

【カリキュラムについて】
パソコンの操作さえもあまりできない自分のような初心者でもわかりやすく学習することができました。
MacBookを買ったばかりで使い方もわからなかったのですがカリキュラムに載っていたのでかなり親切だと感じました。
カリキュラム内では特に動画での説明が頭に入ってきやすくて、わかりやすかったです。
社会人になってからなかなか勉強する機会がなかったので学習する姿勢がかなり定着して習慣化されたと思います。
卒業後も一年間カリキュラムが見れるのもとても良く、活用させていただいてます。

【メンターについて】
同じ質問を何度してもわかりやすく根気強く理解できるまで教えてくださりました。
難しい内容に関してはかなり噛み砕いて、例え話を交えるなど工夫して説明してくださりました。
質問した内容に対して、プラスαで答えてくださり期待以上の返答をしてくださりました。

【ライフコーチについて】
毎日モチベーションを高く保てるように、温かい言葉をかけてくださりポジティブな気持ちにしてれました。
自分が困ったときは個別で相談に乗ってくださり、的確なアドバイスをしてくださりました。
いつも褒めてくだってすごく嬉しかったです。
学習面はもちろん、メンタルも支えてくださったのはライフコーチです。

【キャリアアドバイザーについて】
一から履歴書の書き方を教えてくださり、ご丁寧に添削までしてくださったので大変助かりました。
面接練習の対応をしてくださり、本番の面接でもうまく受け答えをすることができました。
就職先を探す際には、個々の企業さんについてかなり詳しいので参考にさせていただきました。
未知の新しい業界へのチャレンジなので一人では絶対に悩んで時間もかかっていたと思うのですが、約２週間くらいで内定まで進むことができたのはキャリアアドバイザーのおかげでです。

【チームメイトについて】
チームメイトにはかなり救われました。
チームメイトとの毎時間のアウトプットではさまざまな情報を交換したり、わからないところを教え合えたのでたくさんの知識が身につきました。
卒業後も連絡を取り合って進捗状況を報告してます。
なかなか大人になってから出会わせてくれたテックキャンプにはテックキャンプに感謝しております。
チーム編成の制度があるテックキャンプで本当に良かったと思っています。
gzip 圧縮したファイルを cat で繋ぐと、Ruby では読めないよ

「gzip 圧縮したファイルは cat で繋ぐことができる」という話を聞いていて、 gzip の凄さに感動していたのだけれど、 Ruby を使って読もうとしたら駄目だったので、残念だった。

`cat` で繋いだファイルと、 `gzcat+gzip` で繋いだファイルを用意する。

```sh
$ echo 'aaa' | gzip > aaa.gz
$ echo 'bbb' | gzip > bbb.gz
$ cat aaa.gz bbb.gz > cat.gz
$ gzcat aaa.gz bbb.gz | gzip > gzcat.gz
```

 `gzcat` で読むと、結合されていることが判る。

```sh
$ gzcat gzcat.gz
aaa
bbb
(rc->0)
$ gzcat cat.gz
aaa
bbb
```

Ruby で読む

```rb
[1] pry(main)> require 'zlib'
=> false
[2] pry(main)> Zlib::GzipReader.open('gzcat.gz').read
=> "aaa\nbbb\n"
[3] pry(main)> Zlib::GzipReader.open('cat.gz').read
=> "aaa\n"
```

`cat.gz` の方は、 `aaa.gz` の内容は読めているが、 `bbb.gz` の方の内容は読めていない。

`End of file` 的なものに到達しているか、ヘッダ的な箇所に読み込むバイト数が決まっているか、何かではないか?

`0000` があると打ち切るとかかな……?

```sh
$ od -x aaa.gz
0000000      8b1f    0008    dc0b    62c7    0300    4c4b    e44c    0002
0000020      5d95    77f8    0004    0000
0000030
(rc->0)
$ od -x bbb.gz
0000000      8b1f    0008    dc12    62c7    0300    4a4b    e24a    0002
0000020      1fe1    4c26    0004    0000
0000030
(rc->0)
$ od -x gzcat.gz
0000000      8b1f    0008    dc7c    62c7    0300    4c4b    e44c    4a4a
0000020      e24a    0002    3cbe    b0d8    0008    0000
0000034
(rc->0)
$ od -x cat.gz
0000000      8b1f    0008    dc0b    62c7    0300    4c4b    e44c    0002
0000020      5d95    77f8    0004    0000    8b1f    0008    dc12    62c7
0000040      0300    4a4b    e24a    0002    1fe1    4c26    0004    0000
0000060
(rc->0)
```
FlutterでiOSのボリュームをコントロールしてみる

[volume_control](https://pub.dev/packages/volume_control)を利用して、下記のようなUIを作成し実際にiOSの音量を調整できるようにしてみました。
![スクリーンショット 2022-07-08 15.42.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/360246a6-ba65-5edc-6ed5-e782e5c5c0cb.png)
```pubspec.yaml
dependencies:
  volume_control: ^X.X.X
```
バージョンは上記サイトより指定し
```
flutter pub get
```

`import 'package:volume_control/volume_control.dart';`して使えるようにします。とりあえず、`Example`通りにやっても動かなかったので、`Hooks`に切り替えましたが上手くスライドしてくれず。
```
dependencies:
  hooks_riverpod: ^1.0.4
  flutter_hooks: ^0.18.5+1
```
`riverpod`の`HookConsumerWidget`の中で`useState`で呼んであげることで解決致しました。

```volume.dart
import 'dart:async';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:volume_control/volume_control.dart';

class SoundControl extends HookConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final volumeValue = useState(0.5);
    Timer? timer;

    return Scaffold(
      backgroundColor: Colors.grey.shade200,
      body: Column(
        children: [
          Container(
            child: SafeArea(
              child: Column(
                children: [
                  Container(
                    height: 65,
                    child: Card(
                      child: Column(
                        children: [
                          ListTile(
                            leading: Container(
                              child: Icon(
                                Icons.volume_mute,
                                size: 30,
                              ),
                            ),
                            title: CupertinoSlider(
                                value: volumeValue.value,
                                min: 0,
                                max: 1,
                                divisions: 100,
                                onChanged: (val) {
                                  volumeValue.value = val;

                                  if (timer != null) {
                                    timer?.cancel();
                                  }
                                  timer =
                                      Timer(Duration(milliseconds: 200), () {
                                    VolumeControl.setVolume(val);
                                  });

                                  print("val:$val");
                                }),
                            trailing: Icon(Icons.volume_up, size: 30),
                          ),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}
```
スライダーの`UI`は`Cupertino`をインポートして`iOS`スタイルにしてあります。`SoundControl()`を使用し、シュミレータで動かしてみると、デバッグコンソールに下記ログが流れてコントロールできるようになります。
![スクリーンショット 2022-07-08 15.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/99452e72-2298-6652-643f-9ffa29f3f5e2.png)
Resqueで処理中のジョブを中断する方法

## これはなに

Resqueで処理中のジョブを中断したいなと思って調べたのですが、キューに積まれているジョブを削除する方法しか出てこなくて困ったので記事にします。

## 方法

Resqueの親プロセスに対して`USR1`シグナルを送ることで、ジョブを走らせている子プロセスを終了させることができます。

```
$ kill -s USR1 RESQUE_PID
```

## 詳細

### Resqueのプロセス

Resqueはジョブごとにプロセスをforkし、forkされた子プロセスでジョブが実行されます。

> Unlike Sidekiq (a well-designed & well-maintained alternative!) it forks a new process for each job, which makes it resilient to memory leaks and eliminates thread-safety concerns.

（https://resque.github.io/ より引用）

> Forking
> On certain platforms, when a Resque worker reserves a job it immediately forks a child process. The child processes the job then exits. When the child has exited successfully, the worker reserves another job and repeats the process.

（https://github.com/resque/resque#forking より引用）

```mermaid
sequenceDiagram
  participant worker_process as worker process
  participant child_process as child process

  worker_process->>child_process: fork
  activate child_process
  note right of child_process: Run a job
  child_process->>worker_process: exit
  deactivate child_process

  worker_process->>child_process: fork
  activate child_process
  note right of child_process: Run a job
  child_process->>worker_process: exit
  deactivate child_process
```

実際のプロセスは以下のようになっています。

```
$ ps -e -o pid,ppid,command | grep resque
92099     1 resque: Forked 92102 at 1253142769
92102 92099 resque: Processing file_serve since 1253142769
```

（https://github.com/resque/resque#parents-and-children より参照）

`resque: Forked 92102 at 1253142769`が親プロセスで、`resque: Processing file_serve since 1253142769`が子プロセスです。

なお、ジョブが走っていない場合は、以下のように表示されます。

```
$ ps -e -o pid,ppid,command | grep resque
92099 1 resque: Waiting for file_serve,warm_cache
```

### `USR1`シグナル

ResqueのREADMEにある`USR1`シグナルの説明を見ると、

> - `USR1` - Immediately kill child but don't exit
>
> If you want to kill a stale or stuck child, use `USR1`. Processing will continue as normal unless the child was not found. In that case Resque assumes the parent process is in a bad state and shuts down.

（https://github.com/resque/resque#signals より引用）

シグナルを受け取ると子プロセスを終了させ、親プロセスは存続する様です。
なので、終了させたいジョブが動いているプロセスの親プロセスに対して`USR1`シグナルを送ることで強制的にジョブを終了させることができます。

```
$ kill -s USR1 92099
```

> In that case Resque assumes the parent process is in a bad state and shuts down.

また、この部分が気になったのでソースを軽く読んでみましたが、`USR1`シグナルを受け取ったタイミングで親プロセスを終了させるような処理を見つけられませんでした。（知っている方がいれば教えていただけると助かります :pray:）

## Refs

- [Forking - resque/resque](https://github.com/resque/resque#forking)
- [Signals - resque/resque](https://github.com/resque/resque#signals)
- [resque.github.io](https://resque.github.io/)
pandas

cvs から import 使う

行を取得（boolean）

Trueが返ってきた行を表示

条件分岐

条件分岐 AND条件　
条件分岐 OR条件

もとのデータに変更はない
print("----- もとのデータの確認 -------\n")

別のdfを作ることも可能

最大値、最小値、合計値、平均を出す
# 最大値⇨max(), 最小値.min(), 合計値.sum(), 平均値⇨mean()
Linuxのショートカットキー(windows)

# Linux上のショートカットキー一覧

|ショートカットキー|意味|
|--|--|
|Ctrl + A|最初の行に移動|
|Ctrl + E|最後の行に移動|
|Ctrl + F|カーソルを右に移動|
|Ctrl + B|カーソルを左に移動|
|Ctrl + D|カーソルの部分を削除|
|Ctrl + H|カーソルの左文字を削除|
|Ctrl + U|カーソルから行頭までを削除|
|Ctrl + K|カーソルから行末までの文字を削除|
|Ctrl + W|カーソルの位置の単語を削除|
|Ctrl + Y|直前に削除した文字を貼り付け|
|Ctrl + L|画面をクリアにする|
|Ctrl + S|画面ロック|
|Ctrl + Q|画面ロック解除|
|Ctrl + R|履歴の検索|
|!!|直前コマンドの実行|
|!◯◯|◯◯で始まる最も最近のコマンドを実行|
Octave でクラスカル・ウォリス検定

# Octave でクラスカル・ウォリス検定

独立 $k$ 標本の代表値の差のノンパラメトリック検定である。

`kruskal_wallis_test` と `kruskalwallis` があるが，引数の指定法と箱ひげ図が描けるかどうかの違いで，本質的には同じである。
     

## 使用例 1

`kruskal_wallis_test` の場合

    usage 1:
    [pval, k, df] = kruskal_wallis_test (x1, …)
    
    引数は，各グループの測定値ベクトルを列挙する
    戻り値を指定しない場合は p 値のみが表示される
    戻り値を指定した場合は，後で変数を使用する（表示するなど）ことができる


```matlab
# statistics が必要
pkg load statistics

% 表示精度を高くする（任意）
format long
```


```matlab
x1 = [2;1;2;3;3;2;2;1;2;3;4];
x2 = [1;1;2;2;2;2;3;2;1;2;3;4;5;2];
x3 = [2;1;2;1;2;3;3;3];
kruskal_wallis_test(x1, x2, x3);
```

    pval: 0.959295


戻り値を変数に代入する場合


```matlab
[p, k, df] = kruskal_wallis_test(x1, x2, x3);
printf("chisq = %.5g,  df = %d,  p value = %.5g\n", k, df, p)
```

    chisq = 0.083114,  df = 2,  p value = 0.95929


## 使用例 2

`kruskalwallis` の場合

    usage 2:
    p = kruskalwallis (x, g)
    p = kruskalwallis (x, g, displayopt)
    [p, tbl] = kruskalwallis (x, …)
    [p, tbl, stats] = kruskalwallis (x, …)
    
    y は測定値ベクトル，g は測定値がどのグループのものかを示すベクトル
    分散分析表が表示される
    displayopt は，デフォルトで "on" であり，箱ひげ図も描かれる（描かないためには "off" を指定する）



```matlab
x = [x1; x2; x3]; % 使用例 1 より
```


```octave
g1 = repmat(1, length(x1), 1);
g2 = repmat(2, length(x2), 1);
g3 = repmat(3, length(x3), 1);
g = [g1; g2; g3];
```

分散分析表と共にデフォルトで箱ひげ図が描かれる。


```matlab
kruskalwallis(x, g)
```

                  Kruskal-Wallis ANOVA Table
    Source        SS      df      MS      Chi-sq  Prob>Chi-sq
    ---------------------------------------------------------
    Columns       6.86     2       3.43     0.08  9.59295e-01
    Error      2634.64    30      87.82
    Total      2641.50    32
    ans = 0.959294686028659



    
![output_10_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/5df7561d-c66b-89b0-0b76-47efd49cdd50.png)

    


`tbl` と `stats` には多くの情報が含まれるが，必要なものを取り出して使う。


```matlab
[p, tbl, stats] = kruskalwallis(x, g, "off");
```


```matlab
chisq = tbl{2,5}
df = tbl{2,3}
p
```

    chisq = 8.311393319911214e-02
    df = 2
    p = 0.959294686028659



```matlab
printf("chisq = %.5g,  df = %d,  p value = %.5g\n", chisq, df, p)
```

    chisq = 0.083114,  df = 2,  p value = 0.95929
【Github】issueの出し方、書き方

# Overview
- Githubでわからないことを相談したい
- でも相談の仕方がわからない
- issueってのがあるのは知ってるけど使ったことがない

というわけで書き方、コツについて書かれたページを見つつやってみる。

# Contents
## そもそも"issue"とは？
>issue = 問題

要は「問題が起きたときに、『これってどういうこと？』『こんなこと出来ない？』と質問できる機能」のこと。

## 書き方
1. レポジトリ上部の```issues```を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043769/61e4b041-dad7-1cc1-8f6e-2756708ea948.png)
2. ```New issue```を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043769/cbc0438e-0800-38b5-04af-6789b88557b4.png)
3. タイトルとコメントを付けてsubmit
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043769/c4a82ca7-3585-0032-ef47-5c961ff67c37.png)

:::note warn
細かい設定はわからないので知っている人いれば教えてください。
:::

## こうやって書くと嬉しい(らしい)
> 参考資料: https://note.com/koushikagawa/n/n500e2f4d4019

1. タイトルはわかりやすく動詞で終わる
    a. 『何をしたかったのか』が伝わる表現を心がける、という意味だと理解
2. コメントはアウトラインを設計、それ通りに書く
    a. 概要、目的、その他、が最低あると良さそう

### アウトラインの登録方法
> 参考資料: https://note.com/koushikagawa/n/n0dcc592d3045

:::note warn
自分ではやっておらず、流れを見ただけ。アウトラインを設定するにはいいのだと思う。
:::

# Summary
質問するときは相手に伝わるように気を付けよう、ということを意識すれば自ずといいissueが書けると思う。
バッチ処理を作る際に押さえておくこと

# はじめに
バッチ処理を作る際に検討項目が多く手が動かない。。。。
そんな状況にならないためにフォローできる記事になれば良いと思い書き込んでみました。

# そもそもバッチ処理とは
簡単にいうと一定量のデータを集めて、一括で処理する方法のことです。
主にユーザアクションに起因しない処理です。

実行についても定期実行、手動実行など様々な用途で用いられます。

# バッチ処理にするメリット
大量のデータを一括で処理できること
稼働する時間を調整できる。（業務システムが稼働していない夜間などに処理を行える）


# バッチ処理の構成
基本としてバッチ処理は以下の構成となっている。

**入力**して**加工**して**出力**する

## 例
入力
　DBのデータ
　CSVファイル

加工
　抽出する
　削除する　
　集計する　
　マージする

出力
　DBに登録する
　CSVファイルに書き起こす　
　メール送信　
　ファイル作成して転送

# バッチを作る際の検討事項
構築する際に迷ったら以下ポイントを参考にしてください
* 起動方法（定期実行？随時実行？）
* 再実行（リラン）
* 並列・直列
* ドライラン
* トランザクション制御
* リソース監視
* エラー、例外検知
* オンライン処理との関係
* ロギング(ログ)
* 完了通知



# 起動方法
* 定期実行
* 手動実行

この２パターンになります。
### 定期実行
バッチのメリットは定期実行です。こちらはジョブ管理システム、またはcronを利用することで実現可能です。

### 手動実行
主に定期バッチを何かしらの理由で実行する方法です。定期スケジュール外で実行する状況が出てきたらコマンド実行などで実行します。
実行スケジュールをルール化し定期実行することができます。


# 再実行について
リランともよく言われます。
再実行する際はほぼイレギュラーが発生した状況が多いです。
バッチ実行中に何らかの事象で処理が中断した時にリランをします。
ただそのままリランをしたところで同じエラーになることが多いのでエラーをとりのぞく（入力値の修正、処理中のエラー確認）ことをしてからリランしましょう。
考えることとしてはすでに完了している処理・再実行時に行われる処理に影響がないように再実行させましょう

方法としては途中から再実行用のオプションを付けるなど



# インプットのデータはバックアップをとりましょう
処理を実行する際に入力のファイルをそのまま加工するとエラーした際に再実行できません。
処理に間違いがあってもすぐに復元できるよう、 処理の実行で書き換えられる可能性があるデータはバックアップをとっておきましょう。


# 実行時のコマンドライン引数はわかりやすくしましょう
バッチ処理にコマンドラインから引数を渡すときは、 よりわかりやすい名前付きの引数を使うようにしましょう。

```
$ sh batch.sh 10 1 "test" //どの引数か分かりづらい
↓
$ sh batch.sh --name=hoge --age=1 --message="test"
```

# まずはドライランから実行
web,APIとは異なり一度に大量のデータ処理を行うことが多いので手動実行する際はいきなり本番でGO!ではなく、仮実行（ドライラン）できるような構成にしておきましょう。

```
$ sh batch.sh --name=hoge --age=1 --message="test"
↓
sh batch.sh --name=hoge --age=1 --message="test" --dry  //これをつけておけば本番処理されない
または
sh batch.sh --name=hoge --age=1 --message="prod" --prod  //prod指定することで本番処理される
```


# ロギング（ログ）
どんな開発でも同じだと思いますが、実行した処理についてはログを残しましょう。
バッチ内でログファイルに書き出すことで実現可能です。

ログを残す理由としては
* バッチ処理が正常終了したか確認できるようにする
* 処理が失敗した際にどこまで処理したかわかるようにする

ログに出す内容
* 現在の時間
* プロセスID
* 実行バッチ名
* 実行ファイル名、クラス名
* 処理対象
* エラーの際はエラーメッセージ

# トランザクション処理
主にバッチ処理の中でデータベースを書き込む、書き換える際は１レコードずつ処理を終えるのか一気に処理を終えるのか検討しましょう。
処理が完了している部分としていない部分が混在するとまずい場合は、 すべての処理が完了するまでデータを書き換えないようにしておきましょう。 
この方針はバッチの機能によって変わります。
データベースの話にもなりますが、長時間トランザクション処理でテーブルにロックをかけるとその間にデータの更新ができないため、web,apiと処理がかぶる場合は気を付けましょう。

# まとめ
気づいたベースでダラダラ書いてしまいました。まだまだ足りないと思いますが、思いつきで追記します。
安定したバッチ処理を実装できるようお祈りしています。
VSCodeのJupyterでIPython.display.Audio() を使いたい

2022/10/5 追記

アプデで普通に対応したそうです。  
[Visual Studio Code August 2022](https://code.visualstudio.com/updates/v1_71#_ffmpeg-codecs-support)



## 問題

vscodeでnotebook(.ipynb)を開いて`IPython.display.Audio()`を使用しても

![vs_jupyter_audio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235373/4fdf0002-4d4a-a795-7053-86c7fe60046d.png)

こうなって再生できない。パスを直接入れても同様。

![vs_jupyter_audio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235373/d8d277cd-2b68-b5bc-551f-c7b5cbd95358.png)

<br>

調べてみると

[IPython.display.Audioで音声が再生できないので調べてみました｜Discipline and Action](https://discipline-and-action.com/gcp%EF%BD%B01/)
> 私はvscode上でjupyter notebookを編集していたのですが、vscodeでは動画、音声の再生がサポートされていないようです。

ということでした。

## 解決策

GitHubのIssuesに解決案がありました。

[IPython.display.Audio not working for WAV audio · Issue #1012 · microsoft/vscode-jupyter](https://github.com/microsoft/vscode-jupyter/issues/1012#issuecomment-785410064)

```python
import IPython.display
import numpy as np
import json

def Audio(audio: np.ndarray, sr: int):
    """
    Use instead of IPython.display.Audio as a workaround for VS Code.
    `audio` is an array with shape (channels, samples) or just (samples,) for mono.
    """

    if np.ndim(audio) == 1:
        channels = [audio.tolist()]
    else:
        channels = audio.tolist()

    return IPython.display.HTML("""
        <script>
            if (!window.audioContext) {
                window.audioContext = new AudioContext();
                window.playAudio = function(audioChannels, sr) {
                    const buffer = audioContext.createBuffer(audioChannels.length, audioChannels[0].length, sr);
                    for (let [channel, data] of audioChannels.entries()) {
                        buffer.copyToChannel(Float32Array.from(data), channel);
                    }
            
                    const source = audioContext.createBufferSource();
                    source.buffer = buffer;
                    source.connect(audioContext.destination);
                    source.start();
                }
            }
        </script>
        <button onclick="playAudio(%s, %s)">Play</button>
    """ % (json.dumps(channels), sr))
```

この`Audio()`関数を`IPython.display.Audio()`の代わりに使用することで音声の再生が可能になるみたいです。やってみましょう。

![vs_jupyter_audio3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235373/a620398c-b80c-4517-1017-f602cb8e6ef8.png)

再生ボタンが表示され、これをクリックすると音声が再生されました。ちなみにパスを直接入力する方法には対応していません。また重いので、長い音声を入力すると結構時間がかかります。5分程度の音声を入力してみたのですが、数分経っても終わりませんでした。

再生バーが表示されなかったりと、本来の形とは違いますが、「とりあえず音を再生したい」という場合は使えると思います。