OmniAICreator/Qiita-1.07M huggingface dataset:
airflowのQuick Startを実施する

（自身の備忘録用です）
※OSはmac

### airflow本家のページのQuickSrartを実施
https://airflow.apache.org/docs/apache-airflow/stable/start/local.html

#### standaloneコマンドでUI立ち上げる場合
```
$ export AIRFLOW_HOME=[任意のディレクトリ]
→confや、のちに出てくるコマンドで出てくるパスワードを出力されるファイルなどが配置されます

$ AIRFLOW_VERSION=2.2.4
$ PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
→airflowのバージョン指定と、インストール済のpythonバージョン抽出して指定します（この時はpython3.8）

$ CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
$ pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
→インストール

$ airflow standalone
→ユーザー（admin）とランダム生成のパスワードが作成されます
 ※パスワード忘れちゃった場合
　　　　→最初に指定したAIRFLOW_HOMEにstandalone_admin_password.txtがあるのでそこに更新されています。
→UI(localhost:8080)にてログイン後、DAGがグラフィカルに閲覧可能になります
→UIからDagのon/offでの切り替えで実行が可能です。
```

#### ユーザー名やパスワード、メールアドレスの指定を実施して行う場合は以下
airflow usersコマンドで実施できます

```
$ airflow db init
$ airflow users create \
    --username [任意の値] \
    --firstname [任意の値] \
    --lastname [任意の値] \
    --role Admin \
    --password [任意の値] \
    --email [任意の値]
$ airflow webserver --port 8080
$ airflow scheduler # 別窓で実行

→roleは[Admin, Public, Viewer, User, Op]の中から選択
→UI(localhost:8080)にて作成したユーザーでログイン後、DAGがグラフィカルに閲覧可能になります
→UIからDagのon/offでの切り替えで実行が可能です
```

■初期設定されているDAGのコードの場所
```
$ pip show apache-airflow
→Locationを確認

$ ls [Location]/airflow/example_dags/
→exampleに配置されているので、中のコードを見たり、編集してみたりしてairflowの記載方法が学べます
```
オプティマイザ とは

## 勉強前イメージ

聞いたことはあるけど、わからん

## 調査

### オプティマイザ とは

optimizer と書き、構造等を調整して最適化を行うことになります。
いろんな分野で使用されている言葉なので、詳細はその分野によって異なることがあります。

### データベースでのオプティマイザ

データベースの箇所で言われる、オプティマイザ とは
外部からの問い合わせを効率よく処理できるように計画を立てる機能で `クエリオプティマイザ` というものがあります。
オプティマイザとも言われますが、各DBで独自のオプティマイザが使用されています。
しかし、ユーザはオプティマイザの設定や操作を変更することができないのであまり使用上は意識されることは少ないかもしれません。

## 勉強後イメージ

この単語を聞いたときは、SQLの話だった気がする。
クエリオプティマイザの方かな？
mysqlとかpostgresqlで独自に設定されているのね。

## 参考

- [オプティマイザ 【optimizer】](https://e-words.jp/w/%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6.html#:~:text=%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%81%A8%E3%81%AF%E3%80%81%E5%AF%BE%E8%B1%A1%E3%81%AE,%E3%81%AA%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AA%E3%81%A9%E3%81%AF%E7%95%B0%E3%81%AA%E3%82%8B%E3%80%82)
あとから.gitigoreに追跡対象外を追加したい

## .gitignoreに記載しても追跡対象外にならない

.gitignoreに記載しても、全然追跡対象外になってくれなくて困ったことがあったのでメモ。

どうやらすでに git add で追跡しているものは、あとから.gitigoreに記載しても反映されないみたい…

なので、
・ まずは対象のファイルをGitの追跡から外す
・ .gitigoreファイルへ記載
という手順が必要だったようです。

### Gitの追跡対象から除外
```
# 特定のファイルだけ
git rm --cached ファイル名

# フォルダごと
git rm -r --cached フォルダ名
```
これをしたあとに、.gitignoreに記載をしたら、無事に追跡対象外になりました！

※ ``--cached`` をつけないと、ファイルそのものが削除されてしまうので注意！

参考にさせていただいた記事
https://www-creators.com/archives/1662#gitignore-2

### その他メモ
.gitignoreで対象外になっているものを確認する方法
```
git status --ignored
```
excelをコマンドプロンプトで編集する

# 目的
　私はコマンドプロンプトが好きだ。なんでもGUIに頼ると画面を開くだけで終わってしまう。
　というわけで、コマンドプロンプトでexelの内容を更新することを考えた。
　端末はwindowsでpowershellを使っているということを前提にしている。

# 概要
　１）読み込みコマンドをpowershellに登録
　２）データを入力
　３）save

# 読み込みコマンドをpowershellに登録
  次のコマンドを$profileに設定しておく

  ```
  function exrd($file){
    $global:ex = new-object -com excel.application
    $bk=$null
    if ($file[0] -eq '.'){
        $file2 = $file.substring(1)
        $global:bk = $global:ex.workbooks.open("$pwd$file2")
    }else{
        $global:bk = $global:ex.workbooks.open($file)
    }
  }
```
$global:というのは変数をfunctionの範囲ではなく、自分の使っているpowershellの変数に書き込むということだ。

# データを入力
　上の定義があれば
　exrd [excelファイル名]
　で$bkという変数にデータが読み込まれている。

　例えば、excelのsheet1の４行目のA,D列のデータを入力したい場合は
　$bk.sheets(1).range("A4:D4").value2=(1,2,3)
　みたいにすれば、入力ができる。
 
　内容を確認したい場合は
 <pre>
　$ex.visible = $true</pre>
 で更新した内容を見ることが出来る。なんのことはない、excelを開いているということだ。

# save
<pre>
　$bk.save()　
　$bk.close()
　$ex.quit()
　$ex=$null
  [System.GC]::collect()</pre>
 でおしまいである。これをexend()とかのfunctionにしておいてもいいかもしれない。

# 最後に
これらがあれば、全ての操作を１つのコマンドで片付けられる基本ができたので、
進捗だの不具合表だのうざい管理データをプロンプトで片付けられる。
本当はDBで連携する方がよっぽど便利だと思うのだが、未だにexcelがはびこっているので、ちょっとやってみた。ただ、安全だとは思うのだが、comobjectの堅牢性はよくわからない。
さらに、データがネット上にあるとか競合は？とかいわれてもそこまでは試験していない。
要するにアレだ、「利用は自己責任で・・」ってことですね。
【TidalCycles】3度上の音を再生する

# はじめに

TidalCyclesで3度上、5度下などの音を重ねたいと思ったときにいいやり方がわからなかったので、`degreesUp`関数を作ってみました。

# degreesUp関数の実装

以下のコードをBootTidal.hsに追記して、TidalCyclesを再起動すれば`degreesUp`関数が使えるようになるかと思います

```haskell:BootTidal.hs
:{
majorC :: Num a => [a]
majorC = [0,2,4,5,7,9,11]

majorKey :: (Eq a1, Data.String.IsString a1, Num a2) => a1 -> [a2]
majorKey key
  | elem key ["c"] = majorC
  | elem key ["cs","df"] = map (+1) majorC
  | elem key ["d"] = map (+2) majorC
  | elem key ["ds", "ef"] = map (+3) majorC
  | elem key ["e"] = map (+4) majorC
  | elem key ["f"] = map (+5) majorC
  | elem key ["fs", "gf"] = map (+6) majorC
  | elem key ["g"] = map (+7) majorC
  | elem key ["gs", "af"] = map (+8) majorC
  | elem key ["gs", "af"] = map (+9) majorC
  | elem key ["a"] = map (+10) majorC
  | elem key ["as", "bf"] = map (+11) majorC
  | elem key ["b"] = map (+12) majorC
  | otherwise = error "invalid key name!"

degreesUp :: (Num a, Eq a1, Data.String.IsString a1) => a1 -> Int -> Int -> a
degreesUp key degree n =
  noteInScale (majorScale) (degree+elemScaleIndex n)
  where majorScale = majorKey key
        octave s x = x `div` length s
        noteInScale s x = (s !! (mod x (length s))) + fromIntegral (12 * octave s x)
        elemScaleIndex n
          | isJust(elemIndex (mod n 12) majorScale) = fromJust(elemIndex (mod n 12) majorScale) + (length majorScale)*(n `div` 12)
          | otherwise = elemScaleIndex (n+1)

degreesUp' :: (Num a, Eq a1, Data.String.IsString a1) => a1 -> Int -> Int -> a
degreesUp' key degree n
  | degree==0  = degreesUp key 0 n
  | degree>0   = degreesUp key (degree-1) n
  | degree<0   = degreesUp key (degree+1) n
:}
```

# degreesUp関数の使い方

例えば、キーがCで3度上の音を重ねたい場合は以下のようにすると実現できます。

```haskell:live.tidal
do
  let
    nPat = "[c4|d6|e5|f5|g4|a5|b4]*8"
    degree = 3
  d1
    $ stack[
    s "superpiano*8"
    # n nPat
    ,
    s "superpiano*8"
    # n (degreesUp' "c" degree <$> nPat)
    ]
```

いろいろな度数で試してみるとこんな感じになります。

<iframe width="100%" height="450" src="https://www.youtube.com/embed/0pXtgXxOaNQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
AWS SDK for PHP: 認証情報をプロセス間で再利用する

## 背景

AWS EC2 上で AWS SDK を使ってリソースにアクセスする場合、Instance Profile に指定したロールの権限が自動的に使われます。これは実際には IMDS (Instance MetaData Service) へ HTTP でアクセスして一時的な認証情報を取得することで実現しており、Web サービスではリクエスト(プロセス)毎に発生します。しかしこのリクエスト数には一定の上限があり、スロットリングによるリトライやエラー(タイムアウトになる場合もあるようです)が発生する場合があります。これにより、AWS リソースへのアクセスを頻繁におこなう Web サービスでは問題になることがあります。

参考) [Retrieve instance metadata - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)


PHP のプロセス間で共有する領域に認証情報を有効期限までキャッシュすることで、この問題を回避します。IMDS のリクエストが減ることで、パフォーマンスの向上も見込めるかもしれません。

## Doctrine Cache を使う場合

公式ドキュメントには [Doctrine Cache](https://github.com/doctrine/cache) を使って APCu にキャッシュする方法が記載されています。が、このライブラリは開発が終了している模様。ApcuCache クラスも最新バージョンでは削除されているため、v1 を使う必要があります。

参考) [Configuration for the AWS SDK for PHP Version 3 - AWS SDK for PHP](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html)


APCu をインストール (例)

```bash
sudo yum install -y php-pecl-apcu
```

Doctrine Cache (v1) をインストール

```shell
composer require doctrine/cache:^1.0
```

キャッシュ例 (公式ドキュメントより)

```php
$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region' => 'ap-northeast-1',
    'credentials' => Aws\Credentials\CredentialProvider::cache(
        Aws\Credentials\CredentialProvider::defaultProvider(),
        new Aws\DoctrineCacheAdapter(new Doctrine\Common\Cache\ApcuCache())
    ),
]);
```

### Cache Provider を自作

Deprecated なライブラリを使うのも気持ちが悪いので、自作してみました。

[Aws\CacheInterface](https://github.com/aws/aws-sdk-php/blob/master/src/CacheInterface.php) を実装した Cache Provider を作り、CredentialProvider::cache() に指定すれば良いだけです。同様にして、保存先を APCu 以外にすることも容易です(ファイルとか [Shared Memory](https://www.php.net/manual/en/book.shmop.php) とか)。ちなみに Aws\DoctrineCacheAdapter は Doctrine Cache をラップした Cache Provider の実装になります。

例) 保存先となる APCu のキーはプロセス間で共有されるため、他の用途と重複しないよう namespace を指定できるようにします。

```php
class MyApcuCache implements \Aws\CacheInterface
{
    private string $namespace;

    public function __construct(string $namespace)
    {
        $this->namespace = $namespace;
    }

    private function get_apcu_key(string $key): string
    {
        return sprintf('%s[%s]', $this->namespace, $key);
    }

    public function get($key)
    {
        return apcu_fetch($this->get_apcu_key($key));
    }

    public function set($key, $value, $ttl = 0)
    {
        apcu_store($this->get_apcu_key($key), $value, $ttl);
    }

    public function remove($key)
    {
        apcu_delete($this->get_apcu_key($key));
    }
}

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region' => 'ap-northeast-1',
    'credentials' => Aws\Credentials\CredentialProvider::cache(
        Aws\Credentials\CredentialProvider::defaultProvider(),
        new MyApcuCache('AwsCredentials')
    )
]);
```
Autonomous Database にデータをロードする（Database Actions)

Oracle Autnomous Database の操作を行う上で多くの便利な機能が提供されています。本記事では Database Actions 機能の中からデータ・ロード機能を紹介します。Webブラウザから簡単にデータのロード処理を実行することができます。

# Database Actions
Database Actionsの画面はAutonomous Database のメイン画面から、上部の「Database Actions」ボタンをクリックすることで表示できます。

![Database Actions](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/9bc1e389-4c37-145f-4bdd-6db6df42fef6.png)

表示された画面の「データ・ツール」グループから「データ・ロード」をクリックします。

## データ・ロード
「データ・ロード」機能はCSVや他のデータベースからのデータのロードやリンクを作成することができます。本記事ではでは「データのロード」を試します。メインのページから「データ・ロード」を選択し、「次」ボタンをクリックします。

![Data Load](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/d213e07f-4d39-f70d-f2c8-bfa7ff2dc067.png)

## アップロード
画面に対してファイルをアップロードします。複数のファイルをアップロードし、同時に処理することもできます。次の画面ではCSVファイルの「data1_csv1_error.csv」をアップロードしています。

![Upload](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/44421be4-534c-90ca-eef5-f64093d1b199.png)

ファイル横の鉛筆アイコンをクリックすると、ファイルの内容を設定できます。

![options](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/9c57a42a-7b3f-51c6-ba12-0a7d83e86b35.png)


|設定項目|説明|
|:---|:---|
|オプション|表の作成、表への挿入、データの置換など|
|名前|データ格納先テーブル名|
|エンコーディング|文字コードの指定|
|テキスト囲み|文字列の囲み文字|
|フィールド・デリミタ|列の区切り文字|
|スキップする行|先頭行をスキップするレコード数|
|ソース列名|列名を移行元のヘッダから取得するか|
|無効なデータをNULLに変換|格納できないデータをNULLに置換するか|
|ソース列|移行元の列名|
|ターゲット列|移行先の列名|

ファイルの情報を更新したら「閉じる」ボタンで画面を閉じ、元の画面から「矢印」ボタンをクリックします。
確認ダイアログが表示されるため、「実行」ボタンをクリックします。実行中は「ファイル」のアイコンをクリックすると実行状況を表示できます。下の画面では「INSERT INTO LOG ERRORS INTO REJECT LIMIT」文が実行されていることがわかります。

![Executing](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/e78bcb43-57e3-c5dd-b18b-7bc4f0603f64.png)

処理が完了したら「完了」ボタンがクリックできるようになります。ロード処理に失敗したレコードは、「ADP\\$ERR\\${ターゲット・テーブル名}」が自動的に作成されて格納されます。以下の例では、C1=500001 のレコードが DATA1 テーブルの主キー違反で格納できなかったことを示します。

```SQL:
SQL> describe ADP$ERR$DATA1
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 ORA_ERR_NUMBER$                                    NUMBER
 ORA_ERR_MESG$                                      VARCHAR2(2000)
 ORA_ERR_ROWID$                                     ROWID
 ORA_ERR_OPTYP$                                     VARCHAR2(2)
 ORA_ERR_TAG$                                       VARCHAR2(2000)
 C1                                                 VARCHAR2(4000)
 C2                                                 VARCHAR2(32767)

SQL> SELECT COUNT(*) FROM ADP$ERR$DATA1;

  COUNT(*)
----------
         1

SQL> SELECT ORA_ERR_MESG$, C1, C2 FROM ADP$ERR$DATA1;

ORA_ERR_MESG$                                                C1         C2
------------------------------------------------------------ ---------- ----------
ORA-00001: unique constraint (ADMIN.SYS_C0032986) violated   500001     data1
```
pythonのhelp()をgoogle翻訳で日本語表記させる。

pythonでhelp()関数を使う際に英語に抵抗があったのでgoogle翻訳させる機能を作ってみた。

導入
---------------------------------------
```python
pip install googletrans==4.0.0-rc1
```
(ここでバージョン指定しないと古いバージョンが読み込まれ使えないのでコピペ推奨)

使い方
---------------------------------------

help()の中身を調べると、個々のオブジェクトの中に__doc__という特殊メソッドがあり、それを表示させていることが分かった。
また__doc__はstring型であるためtranslate()関数の引数として渡す。

(1)インポート
```python
from googletrans import Translator
```
(2)関数の定義
```python
def help_japanese(input_object):
    
    trans = Translator()
    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    print("(原文)")
    print(input_object.__doc__)
    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    print("(翻訳文)")
    japanese_document = trans.translate(text=input_object.__doc__, src="en", dest="ja").text
    print(japanese_document)

```
(3)調べたいオブジェクトを引数に渡してhelp_japanese()呼び出し
```python
help_japanese(print)
help_japanese(input)
help_japanese(len)
```

想像以上にコードが少ないので物足りない。。。
【TypeScript入門 #10】typeofとkeyofについて

# 概要

オンラインサロン IT_KINGDOM で、typescript について学んだことを備忘録としてメモしていきます。

# 学習内容

- typeof とは
- keyof とは
- typeof と keyof の組み合わせ

# typeof とは

- 型クエリ
- 指定した変数の型を取得する
- 型アノテーション（型を明示的に指定した変数）、型推論（型を指定してない変数からの型の類推）のどちらでも使える
- リテラルタイプで宣言すると型ではなく値が入る

```typescript
// 型アノテーションを取得
export let foo1: number;
type Foo1 = typeof foo1; // Foo1にはnumber型が入る

// 型推論で取得
export let foo2 = 123;
type Foo2 = typeof foo2; // Foo2にはnumber型が入る

// リテラルタイプで宣言
export const foo3 = "123";
type Foo3 = typeof foo3; // Foo3には文字列"123"が入る
```

- オブジェクトのプロパティを継承したい時にも使える

```typescript
// ユースケース1（オブジェクトの型の継承）
export const obj1 = {
  foo: "foo",
  bar: "bar",
};
const obj2: typeof obj1 = {
  foo: "aaaa",
  bar2: "bbbb", // bar2はobj1のプロパティとして定義されてないためエラー
};

// ユースケース2（型の絞り込み）
export function double(x: number | string) {
  if (typeof x === "string") {
    return Number(x) * 2; // xは必ずstring型
  }
  return x * 2; // xは必ずnumber型
}
```

# keyof とは

- 型クエリ
- オブジェクトのプロパティを取得する
- オブジェクトのプロパティ名をリテラルタイプでかつユニオンタイプで取得できる

```typescript
// リテラルタイプとユニオンタイプ
export type Obj = {
  foo: string;
  bar: number;
};

type Key = keyof Obj; // type Key = "foo" | "bar"; と同じ意味
const key1: Key = "bar"; // OK
const key2: Key = "bar2"; // Objにbar2のプロパティが定義されてないためエラー
```

# typeof と keyof の組み合わせ

- keyof と typeof を組み合わせて使うこともできる

```typescript
export const Obj2 = {
  foo: "foo",
  bar: "bar",
  123: "aaa",
};

type Key3 = keyof typeof Obj2;
const key3: Key3 = "bar"; // OK
const key4: Key3 = "aaa"; // Key3にaaaのプロパティが定義されてないためエラー
```

# 参考サイト

[サバイバル TypeScript](https://typescriptbook.jp/reference/type-reuse/keyof-type-operator)
[IT Kingdom](https://it-kingdom.com/)
パートナーユーザーを有効にすると、パートナーロールの数の変更は表示されません


ヘルプ記事
[パートナーユーザーを有効にすると、パートナーロールの数の変更は表示されません](https://help.salesforce.com/s/articleView?id=000314255&type=1)

[コミュニティ設定のセールスフォースで2つの役割を選択すると、パートナーマネージャーの役​​割は作成されません](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A7rkcSAB)

パートナーに役割を割り当てるためのオプションとして表示される役割は1つだけです。コミュニティ設定ページから2つの役割を利用できるようにすることを選択しました。ユーザーロールのみが使用可能です。

回答

パートナーの役割の数を2に変更する前にアカウントパートナーを関連付けたため、この問題に直面しました。 

この問題を修正するには、次のことを行う必要があります。 

1-パートナーの役割の数を必ず2に設定してください 

2-このアカウントのパートナーアカウントを無効にします（必要に応じて名前を変更する場合があります） 

3-このアカウントのパートナーアカウントを有効にします 

4-次にパートナーユーザーを有効にします


[Account Partner Roles Not Created](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G4WugSAF)
【Go】forループのrangeで要素を更新したいとき、2つ目の変数は使えない

# 概要

`range` が返す変数の仕様で躓いたので、備忘録として残しておきます。
(下記でいう`k`, `v`)

```go
package main

import "fmt"

func main() {
	foo := map[string]string{"key": "value"}
	for k, v := range foo {
		fmt.Printf("foo[%v]: %v", k, v)
	}
}

// => foo[key]: value

```

# 詳細

## 結論

`range`　を使うときは以下の方針で書くのがいいと思います。

- 要素を値を更新したい ⇒ 1つ目の変数を使う
- 要素を更新したくない ⇒ 2つ目の変数を使う

理由は、

- 1つ目の変数は配列, mapのindex, keyであり、この値を使えばループしている配列, mapの要素の実体を指定できる
- 2つ目の変数は1つ目の変数で返されたindex, keyで示される値の**コピー**である(値渡しである)

というGoの仕様があるからです。つまり、2つ目の引数に再代入しても何も起こらないということですね。
Tour of Goにもしっかり書いてあるのですが、私はハマってみないと理解ができなったようです…。
[https://go-tour-jp.appspot.com/moretypes/16](https://go-tour-jp.appspot.com/moretypes/16)

## 検証

Atcoderの[abc081_b - Shift only](https://atcoder.jp/contests/abs/tasks/abc081_b)という問題です。

- `n`, `A1, A2, ...An` の標準入力を受け取る
- `A1, A2, ...An` が全て偶数か判定する
- 全て偶数なら`A1, A2, ...An` の全てを2で割る
- 再度偶数判定を行う…
- “全てを2で割る”を実行した回数を出力する

という流れ。

NGのコードはこちら:

```go
package main

import (
	"fmt"
)

func main() {
	var length int
	fmt.Scanf("%d", &length)

	nums := make([]int, length)
	for i, _ := range nums {
		fmt.Scanf("%d", &nums[i])
	}

	var count int
	var flag bool
	for {
		flag = false

		for _, n := range nums {
			if n%2 == 0 {
				flag = true
			} else {
				flag = false
				break
			}
		}

		if !flag {
			break
		}

		count++
		for _, n := range nums {
			n = n / 2
		}
	}

	fmt.Print(count)
}
```

このコードで下記の入力を与えると処理が終わらず失敗します。

```bash
6
382253568 723152896 37802240 379425024 404894720 471526144
```

原因はこの部分です。

この`n` は`nums[index]` のコピーなので、ここで`n` の値を更新しようが`nums` の中身(つまり`A1, A2, ...An`)は更新されず、無限ループになるわけです。

```go
		count++
		for _, n := range nums {
			n = n / 2
		}
```

以下のように、`range` の1つ目の引数で`nums` の要素を指定するように修正すればOKのコードになります。

```go
		count++
		for i, _ := range nums {
			nums[i] = nums[i] / 2
		}
```

先ほどと同じ入力を与えると、正常に処理は完了し、期待値通りの`8` が出力されます。

# 最後に

「問題は配列のループを使えばいいのだから`range` を使わなければよかったのでは？」とも思いましたが、”要素の数だけ処理を行う”というのを強調するなら`range` を使った方がわかりやすいだろうなぁと考えました。 

以上です！
json内の日付フォーマットがそのままではSystem.Text.Jsonで解釈されないときのConverter

(Newtonsoft じゃなく、text.jsonの方)
## JSON中の日付フォーマットがそのままではパースできないことがある（多々）

例えば

``` json
{
"created_at": "2019/06/08 05:47:17"
}
```

こういう日付形式だと`DateTime`にパースされない。

```
Unhandled exception. System.Text.Json.JsonException: The JSON value could not be converted to System.DateTime. Path: $.data[0].attributes.created_at | LineNumber: 74 | BytePositionInLine: 43.
 ---> System.FormatException: The JSON value is not in a supported DateTime format.
   at System.Text.Json.Utf8JsonReader.GetDateTime()
…
```

こんなException吐きます。

## Converter書く
ビルトインなクラスにあればいいんだが、自分でConverterの実装書かないといけないみたい。

参照）
https://docs.microsoft.com/ja-jp/dotnet/standard/datetime/system-text-json-support#custom-support-for--and-
（ドキュメントって得てして読みにくいもんだよね…

``` converter.cs
    public class DateTimeJsonConverter : JsonConverter<DateTime>
    {
        public override DateTime Read(
            ref Utf8JsonReader reader,
            Type typeToConvert,
            JsonSerializerOptions options)
        {
            if (reader.GetString()! == null) return DateTime.MinValue;
            return DateTime.ParseExact(reader.GetString()!,
                "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture);
        }

        public override void Write(
            Utf8JsonWriter writer,
            DateTime dateTimeValue,
            JsonSerializerOptions options) =>
            writer.WriteStringValue(dateTimeValue.ToString(
                "yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture));
    }
```

マッピングするクラス側

``` class.cs
public class Hoge
{
  [JsonConverter(typeof(DateTimeJsonConverter))]
  public DateTime created_at { get; set; }
}
```

シリアライズのコード

``` main.cs
var obj = JsonSerializer.Deserialize<Hoge>(json);
```

でOK

応用すれば色々書ける。
Vue.js / Google Maps JS API でクリックされたmarkerにアニメーションをつける

# はじめに

Vue.js / Nuxt.js で Google Maps に marker アニメーションをつけてみたので、共有します
一番最新にクリックされたmarkerだけにアニメーションを適用します

# 公式ドキュメントの解説

ドキュメントはこのあたりに解説があります

* [Adding a Google Map with a Marker to Your Website  \|  Maps JavaScript API  \|  Google Developers](https://developers.google.com/maps/documentation/javascript/adding-a-google-map?hl=en_GB)
* [Marker  \|  Maps JavaScript API  \|  Google Developers](https://developers.google.com/maps/documentation/javascript/reference/marker#Marker.setAnimation)

# コード（抜粋）


`mapMarker` メソッドの `click` イベント発火時に `enableClikedMarkerAnimation` メソッドを登録しておきます  
実際には `mapMarker` をループで処理して複数の `marker` を登録しています

`enableClikedMarkerAnimation` メソッドは`GMapMarkers` のすべての `marker` のアニメーションをキャンセルし、 クリックされた `marker` のみに `BOUNCE` アニメーションを設定します  
クリックされた `marker` を一番上に表示したい（ `marker` が重なっていた場合）ので `marker.setZIndex(this.markerMaxZIndexCount + 1)` のようにします

マップ上の `marker` のないエリアのクリック時にも `marker` アニメーションはすべてキャンセルされるよう、 `mapClickEvents` でそれを指定します

```vue:Map.vue
<template>
  <div class="map">
    <div ref="map" class="map__google-maps_embedded"></div>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  data() {
    return {
      GMap: {} as google.maps.Map, // window.google object
      GMapMarkers: [] as Array<google.maps.Marker>,
      markerMaxZIndexCount: 100000,
    }
  },
  methods: {

    mapClickEvents(): void {
      /* eslint-disable @typescript-eslint/no-unused-vars */
      this.GMap.addListener('click', (event: google.maps.MapsEventListener) => {
        this.clearSelectedStore()
        this.clearAllMarkerAnimation(this.GMapMarkers)
      })
    },

    mapMarker(storeId: string, storeName: string, position: google.maps.LatLngLiteral, map: google.maps.Map, icon?: google.maps.Symbol): void {
      /*
      add single marker and associated click event to the map
      */

      const self = this
      let marker = {}

      marker = new window.google.maps.Marker({ position, map, })

      /* eslint-disable @typescript-eslint/no-unused-vars */
      ;(marker as google.maps.Marker).addListener('click', async (event: google.maps.MapMouseEvent) => {
        // add marker animation
        this.enableClikedMarkerAnimation(this.GMapMarkers, (marker as google.maps.Marker))
      })

      this.GMapMarkers.push((marker as google.maps.Marker))
    },

    enableClikedMarkerAnimation(GMapMarkers: Array<google.maps.Marker>, marker: google.maps.Marker): void {
      /*
      Clear all marker animations and apply 'BOUNCE' animation to only the latest clicked map marker
      */

      this.clearAllMarkerAnimation(GMapMarkers)

      // add marker animation to only the latest cliked marker
      marker.setAnimation(google.maps.Animation.BOUNCE)
      marker.setZIndex(this.markerMaxZIndexCount + 1)
    },

    clearAllMarkerAnimation(GMapMarkers: Array<google.maps.Marker>): void {
      /*
      clear all marker animation
      */
      GMapMarkers.forEach(eachMarker => {
        eachMarker.setAnimation(null)
      })
    }
  }
})
</script>

```
Go言語のキャラクター「Gopherくん」が可愛いので、GO言語始めてみる

タイトルのとおりで、GO言語のマスコットキャラクターであるGopherくんが可愛いのでGO言語始めてみよう思います。

https://go.dev/

# Go言語とは
Googleが作ったWeb系の言語程度の前知識しかありませんでしたので、ちょっと調べてみました。
**以下、全部Wiki調べです。**

1. 静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け、CSPスタイルの並行性などの特徴を持つ
2. Goのコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースである
3. Pythonのような動的型付け言語のようなプログラミングの容易性、などの特徴もある
4. Go処理系としてはコンパイラのみが開発されている
5. **マスコット・キャラクターはGopher（ホリネズミ）**

コンパイル言語ということもあり、C言語やJavaに文法は近いらしいです。

**C言語で意識しなければいけないメモリリークなどはガベージコレクションでサポートして、Javaで言うVMは用いないため高速実行が可能**という素敵な言語みたいです。

**しかもマスコットキャラクターがかわいい**。

# Gopherくんとは
こちらの記事を御覧ください。
もうこちらの記事以上のことは僕には書けないです。

https://www.techscore.com/blog/2016/12/02/love-gopher/


あと公式サイトも↓

https://go.dev/solutions/#case-studies

# GOの導入（Mac環境）
ここからはMac環境でGOをインストールし実行するまでをまとめておきます。
今回は公式のチュートリアルに従って、「Hello World」するまでの過程をメモります。

## インストール
なにはともあれ、まずはインストールです。
brewコマンドか、[公式サイト](https://go.dev/doc/install)から直接ダウンロードします。

```shell:インストール
$ brew install go
```

続いては、実行環境の整備作業を[チュートリアル](https://go.dev/doc/tutorial/getting-started)を基に行います。
まずはソースコードを保管するためのファイルを作成して、Hello World用のモジュールを入れ込みます。

```shell:フォルダ作成
$ cd
$ mkdir go_test
$ cd go_test
$ go mod init example/hello
```
あとは以下のコードを書いて、保存するだけなのですが色々とつまずいてしまったので、このあと説明していきます。
（コード記載はテキストエディタでも、viでもなんでもOKです)

```GO:Hello World
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
```

## なんかエラーメッセージ
先程記載したGOのコードを以下のコマンドで実行してみたところ、エラーっぽいメッセージがでました。

```shell
$ go run hello.go
$GOPATH/go.mod exists but should not
```

**もーなにこれ〜。**
GO言語のことはGoogleに聞こうと思って、上記メッセージをそのまま検索窓に入力したところ、以下の記事に出会いました。

https://qiita.com/yonaimineakio/items/ae89f5a34b3b6df9004d

>$GOPATHで指定されているディレクトリ配下にxxx.modがあることが原因。

とのことなので、早速go.modを逃します。

```shell
$ mv go.mod ../
```

そして再度実行してみるとちゃんと動きました！！

```shell
$ go run hello.go
Hello, World!
```

モジュールのこととか勉強すること盛りだくさんですが、
Web系の言語はしっかり勉強して行きたいと思っていたので、がんばります・・・

**まぁ、Gopherくん可愛いのでそれをモチベにしていきます。**
【Go】DTOの使い方メモ

# はじめに
GoでDTOを使用する方法についてメモ。
以前、NestJSでバリデーションを行ったときにもDTOを利用したので、興味がある方はこちらもご覧ください。

https://qiita.com/suzuki0430/items/894e2da2b44156a2a437

# DTOとは
ドメイン層をインフラ層(DB)から分離したいときに使います。
例えば、以下のようなモデルが定義されているとします。
このとき、DBで`status = "0" or "1"`が管理されているとしても、DTOを使用すれば、ドメイン側では`Status = "active" or "inactive"`などに変換して取り扱うことができます。

```go:domain/customer.go
type Customer struct {
	Id string	
	Name string 
	City string 
	Zipcode string 
	DateofBirth string	
	Status string 
}
```

また、ドメインモデルの中にインフラ層のタグが入らないようにする、ドメインモデルの中にDB用のID, CreatedAt, UpdatedAtが入らないようにする、といったケースでもDTOは使用されるようです。

# 実装
DTOの構造体を新しくつくります。

```go:dto/customerResponse.go
package dto

type CustomerResponse struct {
	Id string	`json:"customer_id"`
	Name string	`json:"full_name"`
	City string	`json:"city"`
	Zipcode string	`json:"zipcode"`
	DateofBirth string	`json:"date_of_birth"`
	Status string	`json:"status"`
}
```
ドメインモデルからDTOに変換するメソッド`ToDto()`をつくります。
また、`statusAsText()`で`Status`を`"active" or "inactive"`に変換します。

```go:domain/customer.go
func (c Customer) statusAsText() string {
	statusAsText := "active"
	if c.Status == "0" {
		statusAsText = "inactive"
	}
	return statusAsText
}

func (c Customer) ToDto() dto.CustomerResponse {
	return dto.CustomerResponse{
		Id: c.Id,
		Name: c.Name,
		City: c.City,
		Zipcode: c.Zipcode,
		DateofBirth: c.DateofBirth,
		Status: c.Status,
	}
}
```
そして、サービス層では、DBから取得したデータを`c.ToDto()`でDTOに変換して、`response`として返します。

```go:service/customerService.go
func (s DefaultCustomerService) GetCustomer(id string) (*dto.CustomerResponse, *errs.AppError) {
	c, err :=s.repo.ById(id)
	if err != nil {
		return nil, err
	}
	response := c.ToDto()

	return &response, nil
}
```

# 参考資料

https://www.udemy.com/share/103O5K3@eaO2eQ_n1FHcT1SLGLACVzdYOckWab9MY6NuCR5lRR86mpgKA9a_kU0CT_eXGaCD/

https://qiita.com/tomocy/items/555a662f3a784a408143

https://dev.classmethod.jp/articles/go-sample-rest-api/
fairseq導入時にハマったこと

# はじめに
対話システム作成のためにfairseqをインストールしようと思ったのですが，導入時に少しだけハマった部分があるので同じような方のために共有しておこうと思います．

# 参考
https://github.com/pytorch/fairseq/issues/2546

# No package metadata was found for fairseq
```sh
git clone https://github.com/pytorch/fairseq
cd fairseq
pip install --editable ./
```
上記コマンドでインストールしてから，
```sh
fairseq-train
```
コマンドを試しに打ってみた際に発生したエラーです．
公式githubのissueによるとパスが通っていないことが原因のようでした．
そこで以下を実行します．
```py
! echo $PYTHONPATH

import os
os.environ['PYTHONPATH'] += ":/content/fairseq/"

! echo $PYTHONPATH
```
上記はcolabでの例です．
fairseq本体ディレクトリのパスさえ通せばいいので，適宜書き換えて使ってみてください．
以上でfairseqのコマンドが利用できるようになります．
良きfairseqライフを．
【Python】ファイルを読み込む方法

今回はpythonであるテキストファイルを読み込む方法を解説していきます。

# テキストファイル全体を読み込む

```Python
file = open('test.txt', mode='r', encoding="utf-8") # mode r:読込み
text = file.read()
print(text) # テキストファイル全体が表示される
file.close()

# ファイルを閉じたか
print(file.closed) # True
```

# テキストファイルを一行ずつ読み込む
ファイルサイズが大きい場合、全体ではなく行単位の操作が望ましい場合があります。
また、「with」構文を使用すれば、ファイルが使用された後に閉じることが保証されます。

```Python
with open('./test.txt') as f:
    for line in f:
       print line
```

# open関数について
open関数は、ファイルの新規作成や保存、書き込みなどのファイル操作ができます。

open関数は、以下のような形式で使用できます。

```Python
open(ファイル名, モード, 文字エンコード)
```
文字エンコードとは、ファイルに書き込む際にコンピュータ上で文字や記号を扱う際に割り振られている番号のことです。
主にUTF-8, Shift-JISなどがあります。
モードとは、ファイルをどのように開くのか、どのように書き込むのかなどを指定します。
代表的なモードには、以下のものがあります。

|mode|説明  |
|---|---|
|省略|読み込み用で開きます。|
|'r'|読み込み用で開きます。|
|'w'|書き込み用で開きます。ファイル名に設定したものがすでに存在している場合はそのファイルに上書きします。|
|'x'|新規ファイルの書き込みとして使います。既存に存在している場合は末行に追加していく。|
|'a'|追記用で開きます。既存に存在している場合は末行に追加していく。|
|'b'|バイナリーモードで開きます。'rb'や'wb'などの使い方をする|
|'t'|テキストモードで開きます。'rt'や'wt'などの使い方をする。デフォルトではtとなる。|

## with構文
ファイルを操作した後は、closeメソッドの実行が必要になります(メモリから解放するため)。
with構文を使うと必ずファイルオブジェクトはcloseされるので、try〜finallyで実装するより簡潔に書くことができます。

```Python
with open("filename") as f:
  f.read()
```
SKT豆腐屋と「Screeps: Arena」 のチュートリアル#3「First attack」を進めよう

# Screeps: Arenaとは
　「JavaScript」などのプログラミング言語を使って自軍の「駒」を動かし他プレイヤーと戦うゲーム
Steamからダウンロードできる。https://store.steampowered.com/app/1137320/Screeps_Arena/?l=japanese
Screepsの公式discordはこちら（英語）：https://discord.gg/screeps
超全茶discord(日本語)では一緒に楽しみたい人を募集中：https://discord.gg/Am9Rz4w　（discord)

# Screeps: Arenaのチュートリアルを始めよう
https://qiita.com/Yumenoshima/items/054e82f5fa1fab6006b0

## コメント付きサンプルコード #3「First attack」
```javascript
import { } from '/game/utils';
import { } from '/game/prototypes';
import { } from '/game/constants';
import { } from '/arena';

//指定した種類のオブジェクトを全て取得する関数を使えるようにインポート
import { getObjectsByPrototype } from '/game/utils';
//駒「Creep」を使えるようにインポート
import { Creep } from '/game/prototypes';
//「射程範囲外エラー」定数を使えるようにインポート
import { ERR_NOT_IN_RANGE } from '/game/constants';

export function loop() {

    //自軍の駒を取得する
    var myCreep = getObjectsByPrototype(Creep).find(creep => creep.my);
    //敵軍の駒を取得する
    var enemyCreep = getObjectsByPrototype(Creep).find(creep => !creep.my);
    
    //自軍の駒で敵軍の駒を攻撃する。結果が、射程外エラーなら敵軍の駒に向かって進む
    if(myCreep.attack(enemyCreep) == ERR_NOT_IN_RANGE) {
        myCreep.moveTo(enemyCreep);
    }
}
```
## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/807ee3f9-6199-04bd-b583-a42316723520.png)

![first_attack.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/b3b9c186-49bb-ca33-8b93-a5c9fb0044b2.gif)

# 以上
よかったよかった
ロールアップサマリーフィールド : Rollupsummary field


[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [Create a Roll-Up Summary with Flow](https://blog.certifycrm.com/create-a-roll-up-summary-with-flow/)


+ [「ロールアップサマリーフィールドの実装」セクションに入力できません](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G51vVSAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7c9b25df-7124-2228-b260-11de2c62728d.png)


高度な通貨管理を有効にした場合など、他の課題にもこの遊び場を使用したことがあるでしょう。

通貨フィールドは、2つの高度な通貨管理オブジェクト間で高度な通貨管理が有効になっている場合にのみ集計できます。


:::note
You have probably used this playground for other challenges, including one where you enabled advanced currency management.

Currency fields can only be aggregated if advanced currency management is enabled between two advanced currency management objects. Opps to Account is not one of them:

https://help.salesforce.com/s/articleView?id=sf.administration_about_advanced_currency_management.htm&type=5

Either you disable it, or restart the challenge with a new playground
:::


# 数式フィールドは使えません

+ [Question around roll up summary fields](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeJBf)

:::note
It seems that you are having cross object formula field. The cross object formula fields cannot be used for Rollup summary field. 

Please refer below URL, it is mentioned here clearly:
http://login.salesforce.com/help/doc/en/fields_about_roll_up_summary_fields.htm

https://developer.salesforce.com/forums/?id=906F000000091T0IAI
:::

# 相対的な日付は使えません

+ [Rollupsummary - formula field does not appear](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIc0N)

:::note
It just depends on what Formula the Formula(Checkbox) field is using.   

If it uses Relative Dates like TODAY() or NOW(0 and stuff like that, it can't be used as a Roll-Up Filter 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8nrhSAB
:::

# OR 条件は使えません

+ [Roll Up Summary Question](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007WejjQ)


:::note
Looks like this is still an idea: 

https://ideas.salesforce.com/s/idea/a0B8W00000GdnCCUAZ/rollup-summary-fields-or-filter-logic

For those looking for interim solutions, there are non-Salesforce-built tools available that provide some of the requested functionality. Please review and use these tools at your own discretion:

Declarative Lookup Rollup Summaries (DLRS), an open-source app
Rollup Helper, a free-to-try and paid AppExchange app
 
https://ideas.salesforce.com/s/idea/a0B8W00000Gde5QUAR/rollup-summary-fields-formulas-rather-than-static-criteria
:::
｢新しいLinuxの教科書｣個人的メモ chapter03

## コマンドラインのカーソルを動かす
うち間違えた時とかに使う

| コマンド | 説明 |
|:-:|:-:|
|ctrl + b|後ろにカーソルを動かす|
|ctrl + f|前にカーソルを動かす|
|ctrl + a|文の先頭にカーソルを動かす|
|ctrl + e|文の末尾にカーソルを動かす|
|alt + b |後方に単語1つぶんカーソルを動かす|
|alt + f |前方に単語1つぶんカーソルを動かす|

b = Backward
f = Forward
と覚えれば良い

##### <font color="Red">注意</font>
コマンドラインのカーソル(だいたいチカチカしてる)の前に文字を入れたり､消したりする
例 背景が塗りつぶされているところがカーソルとする
hll`o`

helloと打ちたいのに間違えてしまった
`ctrl+b`でカーソルを動かす
h`l`lo

[e]がカーソルの前にはいる
he`l`lo

## 文字の削除
| コマンド | 説明 |
|:-:|:-:|
|BackSpace,ctrl + h|カーソルの前の1文字を消す|
|Deleteキー,ctrl + d|カーソル位置の1文字を消す|
|ctrl + w|後方にスペース区切りで1単語ぶんを消す|

## カット&ヤンク(ペースト)
| コマンド | 説明 |
|:-:|:-:|
|ctrl + k|カーソル位置から行末まで消す|
|ctrl + u|カーソル位置から行頭までを消す|
|ctrl + y|最後に削除した内容をペーストする|

消すと書いているがカットしてるだけ

## トラブルシューティング
### Q:なんかキーボード打ち込んでも何も表示されないんだけど...
画面ロックの`ctrl + s`を押してしまったかも
`ctrl + q`を押してロックを解除しよう
##### <font color="Red">注意</font>
画面ロックしてる間も入力自体は繁栄されてるから`enter`とか押さないように

### Q:なんかコマンドが終わらないし,プロンプトが帰って来ないんだけど...
コマンドによってはユーザーが止めないと終わらないコマンドがある
`ctrl + c`で強制終了しよう

## 補完機能
コマンドを打ち込んでいる途中で`tab`を押すことで自動的にコマンドを打ち込む
```:例
ec   <-ここでtabを押す
echo <-echoと自動的に打ち込む
```
ただ上記のようにすんなり行くのはまれ
補完候補が沢山ある場合は`tab`を2回おして候補を表示してもらう
```:例
e   <-ここでtabを2回押す
e2freefrag echo era_invalidate
e2fsck egrep esac 
...(沢山あるのでここでは省略)...
```
候補をカンニングしながらコマンドを打ち込めばよい

## コマンド履歴
以前打ち込んだコマンドをちょっとだけ変えてから実行したい時とかに使える
| コマンド | 説明 |
|:-:|:-:|
|ctrl + p,↑キー|1つ前のコマンド履歴に移動する|
|ctrl + n,↓キー|次のコマンド履歴へ移動する|
|ctrl + r|履歴からインクリメンタル検索|

直前に`echo hello`と打ち込んだとする
```:1つ前のコマンド履歴に移動する
           <-ctrl+p を押す
echo hello <- 直前に打ち込んだコマンドが表示される
```

#### インクリメンタル検索
履歴から検索する
細かいことはおいておいて使ってみる
```:直前に入力したコマンド達
echo hello
touch aaa.txt
echo hello world
```
```:インクリメンタル検索してみる
         <- ctrl + rを押す
(reverse-i-search)`': <- 検索準備画面が表示される
```
```:とりあえず e を入力してみる
(reverse-i-search)`e': echo hello world <- 1つ前のコマンドが表示される
```
```:ctrl + r を使って1つ前の検索結果に移動
(reverse-i-search)`e': echo hello <- 3つ前のコマンドが表示される
```
`touch aaa.txt`には`e`が含まれていないため無視される
| 1 | 2 |
|:-:|:-:|
|(文字の入力)|検索語を追加して再検索|
|ctrl + r|1つ前の検索結果へ移動|
|enterキー|今表示されてるコマンドを実行|
|escキー|現在の検索結果を表示したまま､コマンドラインに戻る|
|ctrl + g|検索結果を破棄して､プロンプトに戻る|
cscの作法 その111

# 概要
cscの作法、調べてみた。
websocket-sharp使ってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/560f2dde-73ed-89dd-8efd-fcd88092214c.png)

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc ws0.cs /reference:websocket-sharp.dll

```

# サンプルコード

```

using System;
using System.Drawing;
using System.Windows.Forms;
using WebSocketSharp;
using WebSocketSharp.Net;

class Form1 : Form {
	private WebSocket client;
	const string host = "wss://ohiapp0.herokuapp.com/pub";
	ListView lsv;
	Button button1;
	Button button2;
	Button button3;
	TextBox inputBox;
	Form1() {
		ClientSize = new Size(450, 450);
		Text = "WebSocket";
		inputBox = new TextBox() {
			Location = new Point(110, 40),
			Size = new Size(200, 30),
		};
		Controls.Add(inputBox);
		button1 = new Button() {
			Location = new Point(10, 70),
			Size = new Size(80, 30),
			Text = "open",
		}; 
		button2 = new Button() {
			Location = new Point(110, 70),
			Size = new Size(80, 30),
			Text = "send",
		}; 
		button3 = new Button() {
			Location = new Point(210, 70),
			Size = new Size(80, 30),
			Text = "close",
		}; 
		Controls.Add(button1);
		Controls.Add(button2);
		Controls.Add(button3);
		button1.Click += button1_Click;
		button2.Click += button2_Click;
		button3.Click += button3_Click;
		lsv = new ListView();
		lsv.Location = new Point(10, 110);
		lsv.Size = new Size(400, 300);
		lsv.View = View.Details;
		lsv.FullRowSelect = true;
		lsv.HideSelection = false;
		lsv.MultiSelect = false;
		lsv.GridLines = true;
		Controls.Add(lsv);
		lsv.Columns.Add("log", 390, HorizontalAlignment.Left);
		client = new WebSocket(host);
		client.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
		client.OnOpen += (ss, ee) => lsv.Items.Add(string.Format("Connected to {0} successfully ", host));
		client.OnError += (ss, ee) => lsv.Items.Add("Error: " + ee.Message);
		client.OnMessage += (ss, ee) => lsv.Items.Add("Echo: " + ee.Data);
		client.OnClose += (ss, ee) => lsv.Items.Add(string.Format("Disconnected with {0} ", host));
	}
	private void button1_Click(object sender, EventArgs e) {
		client.Connect();
	}
	private void button2_Click(object sender, EventArgs e) {
		var content = inputBox.Text;
		if (!string.IsNullOrEmpty(content))
			client.Send(content);
	}
	private void button3_Click(object sender, EventArgs e) {
		client.Close();
	}
	[STAThread]
	static void Main() {
		Application.Run(new Form1());
	}
}





```

以上。
SKT豆腐屋と「Screeps: Arena」 のチュートリアル#2「Simple move」を進めよう

# Screeps: Arenaとは
　「JavaScript」などのプログラミング言語を使って自軍の「駒」を動かし他プレイヤーと戦うゲーム
Steamからダウンロードできる。https://store.steampowered.com/app/1137320/Screeps_Arena/?l=japanese
Screepsの公式discordはこちら（英語）：https://discord.gg/screeps
超全茶discord(日本語)では一緒に楽しみたい人を募集中：https://discord.gg/Am9Rz4w　（discord)

# Screeps: Arenaのチュートリアルを始めよう
https://qiita.com/Yumenoshima/items/054e82f5fa1fab6006b0

## コメント付きサンプルコード #2「Simple move」
```javascript
import { } from '/game/utils';
import { } from '/game/prototypes';
import { } from '/game/constants';
import { } from '/arena';

//指定した種類のオブジェクトを全て取得する関数を使えるようにインポート
import { getObjectsByPrototype } from '/game/utils';
//駒「Creep」を使えるようにインポート
import { Creep } from '/game/prototypes';
//旗「Flag」を使えるようにインポート
import { Flag } from '/game/prototypes';

// getTicks関数が使えるようにインポート！
import { getTicks } from '/game/utils';

// このloop関数はターン(Tick)ごとに呼ばれる
export function loop() {
    // 現在のターン(Tick)数をログ出力するよ！
    console.log('現在のターン(Tick)数:', getTicks());

    //盤上の駒「Creep」を全て取得する
    var creeps = getObjectsByPrototype(Creep);
    //取得した駒の数をログ出力
    console.log('取得した駒の数:', creeps.length);

    //盤上の旗「Flag」を全て取得する
    var flags = getObjectsByPrototype(Flag);
    //取得した旗の数をログ出力
    console.log('取得した旗の数:', flags.length);

    //1番目の駒(0で指定)を1番目の旗(0で指定)に向かって移動させる
    creeps[0].moveTo(flags[0]);
}
```
## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/bd9fa6cb-2c43-f6a0-8bea-b1f4126c8d64.png)

![simple_move.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609246/d002e5a5-99f8-9212-6175-0e38eb2aa419.gif)

# 以上
よかったよかった
配列でindexOfを使用して指定の値を削除したい時の注意点

# はじめに
配列で指定の値を削除する際に躓いたので記事にまとめます。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [配列内のデータを消す方法](#Chapter1)
1. [indexOfを使用して躓いた](#Chapter2)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 配列内のデータを消す方法
配列内のデータを削除するメソッドはいくつかあります。

**①popメソッド**
配列内で一番最後の値を削除します。

```js
let array = ["a", "b", "c"]
array.pop()

// arrayの中身
// ["a", "b"]
```



**②shift**
配列内で一番最初の値を削除します

```js
let array = ["a", "b", "c"]
array.shift()

// arrayの中身
// ["b", "c"]
```

③**splice**
削除する要素の位置と個数を指定して削除（第一引数に削除する位置、第二引数に削除する個数）

```js
let array = ["a", "b", "c"]
array.splice(1, 2)
// arrayの中身
// ["a"]
```

更に第３引数には削除した位置に要素を追加
```js
let array = ["a", "b", "c"]
array.splice(1, 2, "z")
// arrayの中身
// ["a", "z"] 
```

**④filter**
要素を検索して削除

```js
// aがつく値
let array = ["a", "b", "c"]
array.filter(item => item.match(/a/));

// a以外の値

array.filter(item => item.match(/a/)　=== null);
// b c
```
<a id="#Chapter2"></a>
# indexOfを使用して躓いた
**indexOfメソッドとは**
``indexOf``メソッドはその要素が配列内で何番目にあるのか取得できます。これを``splice``と組み合わせると、ユーザーがクリックした時にその要素が何番目かを取得して配列内から削除することができます。
```js
let array = ["a", "b", "c", "d", "e"]
let index = array.indexOf('d')

if (index > -1) {
  array.splice(index, 1);
}

// arrayの中身
//  ["a", "b", "c", "e"]
```

**indexOfを使用する時の注意点**
``indexOf``メソッドは``===``(厳密等価)を使用して値の比較を行なっています。比較が完全に同じ値でないと``indexOf``メソッドの検索に引っかかりません。つまり、プリミティブな値でなくてはいけません。
>indexOf() は searchElement と配列の要素を 厳密等価 (三重イコール演算子 === で使われるのと同じ方法) を使って比較します。



オブジェクトで``inexOf``を使用すると検索に引っかからないため、返り値が必ず``-1``になります。
つまり、配列の一番最後の値が削除されてしまい指定した値が削除されない可能性があります。
>indexOf() メソッドは引数に与えられた内容と同じ内容を持つ最初の配列要素の添字を返します。存在しない場合は -1 を返します。

[MDN Array.prototype.indexOf()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)

この辺に気づかずにはまってしまいしました。指定した値が間違えているのか、メソッドの理解が間違えているのか注意していこうと思います。
Chrome v100で開発者ツールに謎機能が実装されている(笑)

Chromeの開発者を開いて`What's New`で余白部分をクリックするとバージョン100をお祝いするかのようにアイコンが飛び散ります(笑)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/3cc06444-2ddc-e73a-fc15-9628b67db5ef.png)

ちなみに、連打するとめっちゃ出てきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/047dd2de-582e-99e5-2a42-e7c3c7c4c47b.png)



バージョン100での更新内容は以下をご覧ください

https://developer.chrome.com/ja/blog/new-in-devtools-100/
[Salesforce]コンポーネント最速決定戦 IN Spring'22


## はじめに
大好評企画（?）のコンポーネント最速決定戦 In Spring'22がやってきました！！
Lightningアプリケーションビルダーの分析機能を使ったコンポーネント同士の熱い戦い。
今回はどのような結果になるのでしょうか？

## 前提条件
分析機能や検証の前提条件については「[[Salesforce]コンポーネント最速決定戦 IN Winter'22](https://qiita.com/tiaug30/items/74d63fec09ad9e603db6#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)」を参照してください。

## 検証対象コンポーネント
Spring'22時点では36種類の標準コンポーネントが利用可能です。これらの中から前提条件を満たし検証対象となったコンポーネントが以下の8個になります。なんと前回の28コンポーネントから大幅にエントリーできるコンポーネントが減ってしまいました。

- Einstein Next Best Action
- Tableau CRM ダッシュボード
- Visualforce
- リストビュー
- レコードの詳細
- 活動
- 関連リスト
- 関連リストのクイックリンク

## 検証結果
結果は以下のようになりました。

|No.|コンポーネント|パフォーマンス(ms)|
|:-:|:--|:--|
|:crown: 1位|活動|28
|2位|Einstein Next Best Action|41
|2位|リストビュー|41
|4位|関連リストのクイックリンク|162
|5位|レコードの詳細|282
|6位|関連リスト|399
|7位|Visualforce|1300
|8位|Tableau CRM ダッシュボード|2900

1位は28msを記録した**活動**でした！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878697/3d17b066-5699-1595-fd11-94de4917d596.png)
前回（Winter'22）も3位と好成績だった活動コンポーネント。利用シーンが多いコンポーネントなだけに頼もしい結果を残してくれました。

## 考察

- **検証可能コンポーネントの減少**
今回条件を満たしエントリーできたのは8コンポーネント。多くのコンポーネントで前回は計測できていたパフォーマンス値が計測できなくなっていました。設定を変えたり組織内のデータを整備することで計測できるものもあるかもしれませんが、今回の条件下ではこのような結果となりました。

- **パフォーマンス値の変化**
前回と同様、数値が計測できたコンポーネントは前回の結果から数値が変わっていました。今回1位になった活動コンポーネントも16ms(Winter'22)⇒28ms(Spring’22)と変化がありました。パフォーマンス値が計測できるコンポーネントが減少したことも踏まえ、コンポーネント自体のパフォーマンス値やその計測アルゴリズムが継続的に変化していることが推測できます。

## まとめ
今回も分析機能を使って標準コンポーネントのパフォーマンスを比較検証しました。
エントリーできるコンポーネントが減って少し物足りなさもありましたが、コンポーネントのパフォーマンスが継続的に変化していることが確認できました。Lightningページのパフォーマンスにお悩みを抱えている方は分析機能使った改善を検討してみてください。

## 参考文献

- [Lightning ページのパフォーマンス](https://help.salesforce.com/s/articleView?id=sf.lightning_page_performance.htm&type=5)
Windows10 WSL から WSL2へ切り替え

WSLからWSL2にアップデートしたい。

失敗した手順

```
wsl --set-version Ubuntu-20.04 2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/d2470f18-278c-31c1-7369-cf92da8316c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/7273390e-97af-1071-1301-b2369de74d52.png)

切り替わらないので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/2c0f4c5e-ec4b-2b81-5a8c-c2e17aa85ef8.png)

手順を確認、一応手順確認
https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-3---enable-virtual-machine-feature

---
手順最初から設定(はじめからこちらの手順をすべきでした）

```
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/5af3dd15-65fb-2dc4-7583-f637e8c15666.png)

インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/5b9b2d9f-5553-c010-018b-040a98fe74ca.png)

コマンドでデフォルトでWSL2に設定し、この時点ではまだVersion1になっていたので、UbuntuをWSL2のバージョンへ設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/ff3b5800-191a-08d9-88d4-645ed4eb4792.png)

しばらく処理が続き完了後、確認。wsl2への変換を確認しました。
```
wsl -l -v
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/d75c3f39-eeee-9dcb-d041-d8264e603636.png)

この後、Ubuntuを起動して起動できました。
完了です。
【Java】Spring Data JPA関連プロパティ @application.properties

# プロパティ一覧（随時追加）
```properties
spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Tokyo
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
```

# spring.jpa.properties.hibernate.jdbc.time_zone
・データベースのタイムゾーンを設定する。
・設定方法は２つあるが、今回は設定方法２。

　設定方法１：JDBC URLのパラメータとして設定
　設定方法２：spring.jpa.properties.hibernate.jdbc.time_zoneを設定

https://www.baeldung.com/mysql-jdbc-timezone-spring-boot

# spring.jpa.database-platform
・JPA/Hibernateが生成するSQLを各DBのDDL,DMLに変換する際に「MySQL？MySQLだったらどのDialect？」の情報を必要なため、その定義を行う。

## MySQLのストレージエンジンとは？
・テーブルにデータを書き込んだり読み出したりする部分を担っているプログラム。
・現在の MySQL ではデフォルトのストレージエンジンは InnoDB。

https://qiita.com/ishishow/items/280a9d049b8f7bcbc14a

## Database Dialectとは？
・JPA/Hibernateが生成したSQLを、各DB(MySQL等)のDDL,DMLに変換する際に利用される設定
・`spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect`の場合、
　MySQLのストレージエンジンであるInnoDBのDDL,DMLに変換されるようになる。
・このプロパティを設定しなくても、自動でDataSourceからDialectを特定してくれる。

>A database dialect is a configuration setting for platform independent software (JPA, Hibernate, etc) which allows such software to translate its generic SQL statements into vendor specific DDL, DML.

# spring.jpa.hibernate.naming.physical-strategy
・Entityクラス と DB 間で「テーブル名」「カラム名」のマッピングを行う際にNaming Strategyを利用する。デフォルトのNamingStrategyとは別に定義したい場合に、このプロパティを設定する。
・Naming Strategyは「Explicit Strategy」と「Imlicit Strategy」の２つ存在する。

https://qiita.com/crml1206/items/235a892307a6812863b1

# spring.jpa.show-sql
・JPAが発行したSQLをログに出すかどうか。

# spring.jpa.hibernate.ddl-auto
・アプリケーション起動時に、Entityクラスに対応するテーブルを作るかどうか。
・デフォルト値は組み込みDB(H2等)の場合は`create-drop`、それ以外(MySQL等)は`none`。

|選択肢|動作|
|---|---|
|none|何もしない|
|create|アプリ起動時にDrop&Createする。前回まで入っていたデータは消去される。
|create-drop|アプリ起動時にCreateする。セッション切断時にDropする。Good For UT.|
|validate|@EntityクラスとDBが一致しているか確認する。不一致の場合アプリ起動が失敗する。|
|update|追加の変更のみ反映する。1カラム追加＝ALTER TABLEで該当カラム追加。|

|DBの種類|デフォルト値|
|---|---|
|組み込み(H2等)|create-drop|
|組み込みでない|none|

> Spring Boot chooses a default value for you based on whether it thinks your database is embedded (default create-drop) or not (default none).

https://docs.spring.io/spring-boot/docs/1.1.0.M1/reference/html/howto-database-initialization.html#:~:text=can%20set%20spring.-,jpa.,or%20not%20(default%20none%20)
【Java】HibernateでEntity/DB間をマッピングする仕組み

# まえがき
Entityクラスに@Table,@EntityをつけてORMをなんとなくで実現していたが、その仕組みをちゃんと知ろうという記事。

https://www.baeldung.com/hibernate-naming-strategy

# 2つのNaming Strategy
・Entityクラス と DB 間で「テーブル名」「カラム名」のマッピングを行う際にNaming Strategyを利用する。
・Naming Strategyは「Explicit Strategy」と「Imlicit Strategy」の２つ存在する。
・マッピング処理は次のフローで行われる。

　① LogicalNameの決定【Implicit Strategy】
　② PhysicalNameの決定【Explicit Strategy】

　　LogicalName：Javaで扱うテーブル名,プロパティ名
　　PhysicalName：DBとマッピングさせるテーブル名,プロパティ名

# ① LogicalNameの決定【Implicit Strategy】
・デフォルトのImplicit Strategy（ImplicitNamingStrategyJpaCompliantImpl）の場合、Javaクラスで定義されているテーブル名、プロパティ名をそのままLogicalNameとする。
・そうしたくない場合/自分でLogicalNameを設定したい場合は、@Table,@Columnで設定する。
```java
@Entity
@Table(name = "Customers")
public class Customer {

    @Id
    @GeneratedValue
    private Long id;

    private String firstName;

    private String lastName;

    @Column(name = "email")
    private String emailAddress;
    
    // getters and setters
    
}
```
↑のCustomerクラスのLogicalNameは以下のようになる。
```
Customer -> Customers
firstName -> firstName
lastName -> lastName
emailAddress -> email
```

# ② PhysicalNameの決定【Explicit Strategy】
・Hibernate5デフォルトのExplicit Strategyは、PhysicalNamingStrategyStandardImplクラス。
・LogicalNameをそのままPhysicalNameとして利用してくれる。

・Hibernate4デフォルトのExplicit StrategyはSpringPhysicalNamingStrategyクラス。
・テーブル名は一律小文字に変換されたり、ドット→アンダースコア変換等の処理が走るもの。

・LogicalNameをそのままPhysicalNameとして使ってくれる方がいいよね、ってことでHibernete5のPhysicalNamingStrategyStandardImplクラスを使うのが良い👍

# application.propertiesで設定可能
```properties
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
```
cscの作法 その110

# 概要
cscの作法、調べてみた。
CSharpCodeProvider使ってみた。

# サンプルコード

```

using System;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

public class CompileInvoke {
	static string cs = @"
		public class CSHello {
			public static void Main() {
				System.Console.WriteLine(""Hello C# World!"");
			}
		}";
	public static void Main() {
		CSharpCodeProvider cscp = new CSharpCodeProvider();
		CompilerParameters param = new CompilerParameters();
		param.GenerateInMemory = true;
		CompilerResults cr = cscp.CompileAssemblyFromSource(param, cs);
		Assembly asm = cr.CompiledAssembly;
		Type type = asm.GetType("CSHello");
		MethodInfo mi = type.GetMethod("Main");
		mi.Invoke(null, null);
	}
}

```

以上。