OmniAICreator/Qiita-1.07M huggingface dataset:
DataView

# DataView
## とは何か
[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)内のデータを読み書きするためのビュー。    
（[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)自身には読み書きする機能はないので、それを補完する立ち位置）

これと類似する[型付き配列（typed array）](https://qiita.com/toshi00ysm/items/b90b76094c1d114651c5)との違いは、「エンディアンをよしなにしてくれないので、バッファ内に書き込まれてるままのバイト順で取り扱う（エンディアンについては開発者側が責任を握る）」ということ。

## 用途
前述の通り、[型付き配列（typed array）](https://qiita.com/toshi00ysm/items/b90b76094c1d114651c5)と違ってエンディアンを意識しながら触る用途向きなので、使う・見かけることが稀というか、DataViewの利用シーンも[型付き配列（typed array）](https://qiita.com/toshi00ysm/items/b90b76094c1d114651c5)と比べて「（技術的に）濃い」めになりがち。

DataViewの本質的用途は以下。

- [ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)から、指定のエンディアンで（＆指定の数値型として）値を読み出す
- [ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)から、指定のエンディアンで（＆指定の数値型として）値を書き込む

なお、これらの応用として

- [型付き配列（typed array）](https://qiita.com/toshi00ysm/items/b90b76094c1d114651c5)と組み合わせることで、「自環境がどちらのエンディアンか」を判定する

などの用途も考えられる。

## 参照
- [JavaScript 型付き配列 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Typed_arrays)
- [TypedArray - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)
- [Typed Arrays: ブラウザでバイナリデータを扱う - HTML5 Rocks](https://www.html5rocks.com/ja/tutorials/webgl/typed_arrays/)
DatabricksのFeature Store

[Databricks Feature Store \| Databricks on AWS](https://docs.databricks.com/applications/machine-learning/feature-store.html) [2022/10/13時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

本書では、特徴量ストアとは何か、提供するメリットは何か、そして、Databricks Feature Store固有の利点を説明します。

Databricks Feature Storeライブラリは、Databricks機械学習ランタイムでのみ利用でき、Databricksノートブックやワークフローからアクセスすることができます。

:::note
**注意**
現時点では、Feature StoreはUnity Catalogメタストアをサポートしていません。Unity Catalogが有効化されたワークスペースでは、特徴量テーブルはデフォルトのHiveメタストアにのみ書き込むことができます。
:::

# 特徴量ストアとは？

特徴量ストアは、データサイエンティストが特徴量を発見、共有できる集中管理されたリポジトリであり、モデルトレーニングと推論に使われる特徴量の値を計算するために同じコードが使われることを確実にします。

機械学習では、将来の値を予測するためのモデルを構築するために既存のデータを使用します。ほとんどすべてのケースにおいて、モデル構築に活用する前に、生データには前処理や変換処理が必要となります。このプロセスは特徴量生成や特徴量エンジニアリングと呼ばれ、このプロセスのアウトプットが、モデルのビルディングブロックである特徴量と呼ばれます。

特徴量の開発は複雑で時間がかかるものです。機械学習に対応するための追加の複雑性、モデルトレーニングのために必要な特徴量計算処理、そして、予測を行う際にモデルを使う時にも再度計算が必要となります。これらの実装は、同じチームや同じコード環境によって実施されないケースもあり、遅れやエラーを引き起こすことがあります。また、企業内の別のチームは多くの場合で同様の特徴量を必要としますが、他のチームによって処理が完了していることに気づかないことがあります。特徴量ストアは、これらの問題に取り組むために設計されています。

# なぜDatabricks Feature Storeを使うのか？

Databricks Feature Storeは、他のDatabricksのコンポーネントと完全にインテグレーションされています。

- 発見可能性。DatabricksワークスペースからアクセスできるFeature Store UIを用いることで、既存の特徴量をブラウズ、検索することができます。
- リネージュ。Feature Storeを用いて特徴量テーブルを作成すると、特徴量テーブルを作成するために使用されたデータソースが保存され、アクセス可能になります。特徴量テーブルのそれぞれの特徴量に対して、特徴量を使用しているモデル、ノートブック、ジョブ、エンドポイントにもアクセスすることができます。
- モデルスコアリング、モデルサービングとのインテグレーション。モデルをトレーニングするためにFeature Storeからの特徴量を使う際、モデルは特徴量メタデータと一緒にモデルがパッケージングされます。バッチスコアリングやオンライン推論にモデルを使う際、Feature Storeから自動で特徴量を取得します。呼び出し元は、これらに関して知る必要や、新規データをスコアリングするために特徴量を検索、joinするロジックを含める必要はありません。これによって、モデルのデプロイメントと更新をより簡単なものにします。
- ポイントインタイムの検索。Feature Storeでは、ポイントインタイムの正確性を必要とする時系列、イベントベースのユースケースをサポートしています。

# Feature Storeを使い始める

Feature Storeを使い始めるには、以下のドキュメントをご覧ください。

- 特徴量の作成・更新、モデルトレーニングやバッチ推論におけるモデルの活用のプロセスを説明する[サンプルノートブック](https://qiita.com/taka_yayoi/items/4ee41a1865aeaf3ac79c)をご覧ください。
- [Feature Store Python API](https://docs.databricks.com/machine-learning/feature-store/python-api.html)のリファレンスマテリアルをご覧ください。
- [Databricks Feature Storeを用いたモデルのトレーニング](https://qiita.com/taka_yayoi/items/c6785fc3c93c89a204f6)を学びます。
- [Databricks Feature Storeで特徴量テーブルを操作する](https://qiita.com/taka_yayoi/items/329e7284bebf29e90634)を学びます。
- モデルのトレーニングやスコアリングにおいて、特定の時点の最新の特徴量の値を取得するための[time series feature tables and point\-in\-time lookups](https://docs.databricks.com/machine-learning/feature-store/time-series.html)を学びます。
- リアルタイムのサービングや自動特徴量検索のための[publishing features to online feature stores](https://docs.databricks.com/machine-learning/feature-store/online-feature-stores.html)を学びます。
- [Databricksワークスペース間で特徴量テーブルを共有する](https://qiita.com/taka_yayoi/items/33ac44f965adfe726f1f)
- [Control access to feature tables](https://docs.databricks.com/machine-learning/feature-store/access-control.html)

# その他の情報

Feature Storeを使用する際のベストプラクティスに関しては、[The Comprehensive Guide to Feature Stores](https://www.databricks.com/p/ebook/the-comprehensive-guide-to-feature-stores)をダウンロードください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Faceapp を windows で使う

faceappをwindowsで使いたい。

参考
http://hidekyan.cocolog-nifty.com/blog/2021/03/post-396f80.html


#faceapp インストールしよう



Android アプリプレイヤー
エミュをインスコ
https://www.bluestacks.com/ja/index.html

Googleプレイヤーでログイン
Faceappを検索

システムアプリ >　メディアマネージャー > windows から インポートする
エクスポートする際も同じような感じで可能。
pvcをdeleteしてもTerminatingから変化せずリソースが削除されない

## 現象
- pvcが`Terminating `のままで消えない

## 原因
- `pvc-protection`状態になっていると消えないみたい

## 対応

### Finalizers部分を確認

```
kubectl describe pvc fluentd | grep Finalizers
```

pvc-protectionとなってしまっている

```
Finalizers:    [kubernetes.io/pvc-protection]
```

### patchサブコマンドでfinalizersステータスを無理やり変える
- すると消える

```
kubectl patch pvc fluentd-ebs-claim -p '{"metadata":{"finalizers": []}}' --type=merge
```

## 参考
- https://qiita.com/devs_hd/items/8cbf834c504e57fbe1ff
- https://stackoverflow.com/questions/51358856/kubernetes-cant-delete-persistentvolumeclaim-pvc
golangでtime.Parse()を使ってstring型をdate型に型変換する方法

# 環境

- Go 1.15

# やりたいこと
Excelから日付をstring型で持ってきた時は`2011/8/10`のようになっている。
`toDate()`関数を使ってgolangのdate型にしたい

# 結論

ポイントは`layout`を狂いなく`2006/1/2`に設定すること。
例えば`layout`を`2006/1/3`とかにするとエラーになる。

```parseDate.go
strVal := 2011/8/10
layout := "2006/1/2"
timeVal, err := time.Parse(layout, strVal)
```

# 詰まったポイント
`2011/8/10`を0埋めして`2011/08/10`にする処理が必要だと思ってた。
わざわざ0埋めする関数`padNumberWithZero`を作った。

```
func padNumberWithZero(value string) string {
    i, _ := strconv.Atoi(value)
    return fmt.Sprintf("%02d", i)
}
```
しかしそれでもエラーが発生した

## エラー内容

```
2021/06/04 07:39:49 parsing time "2011/08/10" as "2011/09/01": cannot parse "/08/10" as "1"2011/8/10
```

# まとめ
golangでtime.Parse()を使いたい時は第一引数にはgolangが定めている日付や時間と全く同じlayoutを指定しないといけないから注意(分かりにくすぎるし面倒くさい、、、)

参考 https://golang.org/src/time/format.go
kubernetes操作が便利になるプラグイン


## krew

- kubernetes系のプラグインマネージャー
- fishです

### インストール

```
begin
  set -x; set temp_dir (mktemp -d); cd "$temp_dir" &&
  set OS (uname | tr '[:upper:]' '[:lower:]') &&
  set ARCH (uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/') &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz" &&
  tar zxvf krew.tar.gz &&
  set KREWNAME krew-$OS"_"$ARCH &&
  ./$KREWNAME install krew &&
  set -e KREWNAME; set -e temp_dir
end
```

### シェル起動時に読み込むようにする

```~/.config/fish/conf.d/krew.fish
set -gx PATH $PATH $HOME/.krew/bin
```

https://krew.sigs.k8s.io/docs/user-guide/setup/install/

## kubectx
- コンテキストの切り替えが楽

```
kubectl krew install ctx
```

使い方

```
kubectl-ctx <context>
```

## kubens
- namespaceの切り替えが楽

```
kubectl krew install ns
```

使い方

```
kubectl-ns nginx
```

今のNamespace

```
kubectl-ns -c
```

## iexec
- execで長いコマンド打たなくてすむ
- いい感じにシェルに入ってくれる

```
kubectl krew install iexec 
```

使い方

```
kubectl-iexec nginx
```

## open-svc
- svcをPortForwardせずに利用できる


```
kubectl krew install open-svc
```

使い方
- ブラウザが立ち上がる

```
kubectl-open_svc kibana
```
UnrealEngineのUPROPERTY漏れのチェック

# UPROPERTYとは

UEのC++側では、UObjectを継承したポインタ型のメンバー変数をUPROPERTY()属性をつけて保持しておかなければなりません。

```cpp
class MYPROJECT_API MyClass : public UObject
{
    GENERATED_BODY()

private:

    UObject* NG; // GCに回収される恐れあり

    UPROPERTY()
        UObject* OK; // 安心
};
```

これはUEで採用されているガベージコレクション（以下、GC）が参照を保持するために使用しているからです。

UPROPERTY()をつけないで参照を持っているとGCに回収され、メモリアクセス違反などのエラーの原因になります。
またGCのタイミングの関係上、エディタで実行中は起きにくく実機で起きやすい、という傾向があります。

そのため、コードを書く時は絶対にUPROPERTYを付けるというコード規約のもとコードを書くのですが、こんなものは人間はどうしても忘れてしまいます。
そこでUPROPERTYの漏れチェックをCIに挟もうと思い、UESourceAnalyzerという名前でPropertyCheckできるようなものを作成しました。

https://github.com/yKimisaki/UESourceAnalyzer

取り急ぎ社内用に作ったのものを雑に公開してるものなので何も整えてないのですが、評判が良さそうならもうちょっと綺麗にします。

# 使い方

上記のGitHubのリリースからZIPを適当に展開して、中のexeに対してUEプロジェクトのSourceフォルダを引数に指定してあげてください。

```
PS K:\UESourceAnalyzer_Win64> .\UESourceAnalyzer.exe K:\UE4Test\Source
```

そうるすと、上記の場合はK:\UE4Test\Sourceの配下にPropertyCheck.txtというテキストファイルが吐かれます。
中身は以下のようになっており、

```
########################################
K:\UE4Test\Source\UE4Test\Core\CPP_GameInstance.h:19
------------------------------
private:

	static UCPP_GameInstance* Current; <<<<<<<<<<<<


########################################
K:\UE4Test\Source\UE4Test\Features\AsyncTask\AsyncTaskSubsystem.h:201
------------------------------
private:

	TArray<AsyncTaskCoreSystemBase*> CoreSystems; <<<<<<<<<<<<


########################################
K:\UE4Test\Source\UE4Test\Levels\WaitActorInitializing\WaitActorInitializingActor.h:18
------------------------------
private:

	UWaitActorInitializingActorComponent* WaitActorInitializingActorComponent; <<<<<<<<<<<<


########################################
K:\UE4Test\Source\UE4Test\Levels\AbilityTest\Actors\CPP_AbilityTestCharacter.h:22
------------------------------
private:

	UCPP_AbilitySystemComponent* AbilitySystem; <<<<<<<<<<<<



```

このような感じでUPROPERTYが抜けていそうな場所を、上下数行と合わせて一覧化して出してくれます。
PHP ファイルの記述、読み込み、追加


#sprintf
```
sprintfを使用すると書式を整えることができる！！

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
例
<?php
$date = sprintf('%04d年 %02d月 %02d日', 2021, 6, 4);
print($date);
?>
→２０２１年 06月 04日

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
%04d年は、何を指しているか
％→パラメータの数　今回は２０２１、６、４の３つに分けている
0→何もない場合は何でを表示するか
4→表示する桁数　【２０２１年は４桁、　06月は２桁、　０４日は２桁】
d→数字を表示する　文字の場合であればsを入れる
```

#file_put_contents ファイルの書き込み
```
ファイルに内容を書き込むことができる！！

--------------------------------------------------------
例
<?php
$success = file_put_contents('../../news_data/news.txt',
'2021-06-04 本日は雨です');
if($success){
  printf('ファイルへの書き込みができました');
}else{
  print('書き込みに失敗しました');
}
?>
→if文の出力結果で、書き込みできたかどうかわかる。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
file_put_contents('../../news_data/news.txt',
'2021-06-04 本日は雨です');

別のフォルダーにファイルを作成して、記述をしている！
news_dataのフォルダに指定して、その中にファイルを作成して内容を記述
```

#file_get_contents　ファイルの読み込み/内容の追加
```
フォルダとファイルの指定をして、内容を読み込む

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$news = file_get_contents('../../news_data/news.txt');
print($news);
これでファイルの内容を読み込める。！

readfile('../../news_data/news.txt');
これも同じでファイルを読み込める！ *printはいらない

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ファイルに内容の追加

$news = file_get_contents('../../news_data/news.txt');
$news .= "2021-06-01 記事を投稿しました\n";
file_put_contents('../../news_data/news.txt',$news);
print($news);

【＄news . = この記述で＄newsの変数に、ファイル内容を追加する！】
```
**読み込みだけなら、readfileだけで簡単にできる！！！！！**
[VSCode]Vueコード整形ツールの設定をシングルクォーテーションにする

VSCodeでVueのコード整形ツール(Prettier)の設定をシングルクォーテーションにしたい。

## 問題

古い記事では、以下のように書かれていることが多かった。

メニューから `Code > Preference > Settings` を開く。
検索バーで `SingleQuote` と検索して出てきたものをチェック。

![スクリーンショット 2021-06-04 16.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/a853af02-f504-ae2a-6959-bba3c57adaee.png)

自分の環境ではこの設定を行なっても整形時にダブルクォーテーションのままだった。

## 解決策

Pritterはアップデートがあったらしく、共通の設定ファイルを利用せずにPritter専用ファイルから指定するよう変更されたらしい。

プロジェクトルートディレクトリに`.prettierrc`を作成して以下を記述する。

```json:.prettierrc
{
  "singleQuote": true
}
```

これでフォーマッターのショートカット `Shift+Option+F` を押すと、シングルクォーテーションで整形されるようになった。

## 参考
https://stackoverflow.com/questions/59243558/vscode-not-formatting-ts-js-files-with-single-quotes
https://prettier.io/docs/en/configuration.html
【C#】NPOIを使って「.xls」と「.xlsx」に対して罫線を引く

# 概要
- 「.xls」と「.xlsx」に対して罫線を引く
- 以下に記載コードは.xlsと.xlsx共通コード

# 使用バージョン
- Npoi 2.5.3
- .Netframwork4.7.2
- Windowsフォームアプリケーションで実装

# セルに対して罫線を引くソース
- ファイルの読み込みを含めて以下に記載
- 以下結果

![2021-06-04_16h35_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245167/3ceecd03-cd00-3450-9350-cc57f021a61e.png)

- 実際に引いたコード

``` sample.cs
using NPOI.SS.UserModel;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms;

/// filepathに「.xls」or 「.xlsx」のファイルパスを渡してください
public void WriteCell(string filepath)
{
    book = WorkbookFactory.Create(filepath);
    var sheet = book.GetSheetAt(0);
    
    IRow row = sheet.CreateRow(5);
    ICell cell = row.CreateCell(5);
    cell.SetCellType(CellType.String);
    cell.SetCellValue("testssss");

    ICellStyle cellStyle = sheet.Workbook.CreateCellStyle();
    
    //セルの上に引く
    cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
    cellStyle.TopBorderColor = IndexedColors.Aqua.Index;
    
    //セルの下に引く
    cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
    cellStyle.BottomBorderColor = IndexedColors.Green.Index;
    
    //セルの左に引く
    cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
    cellStyle.LeftBorderColor = IndexedColors.Black.Index;
    
    //セルの右に引く
    cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    cellStyle.RightBorderColor = IndexedColors.LightBlue.Index;
    
    //セルの斜めに引く
    cellStyle.BorderDiagonal = NPOI.SS.UserModel.BorderDiagonal.Forward;
    cellStyle.BorderDiagonalLineStyle = NPOI.SS.UserModel.BorderStyle.Thin;
    cellStyle.BorderDiagonalColor = IndexedColors.Black.Index;

    //セルのスタイルを保存
    cell.CellStyle = cellStyle;
    
    //ブックを保存
    using (var fs = new FileStream(filepath, FileMode.Create))
    {
        book.Write(fs);
    }

    var result = MessageBox.Show("処理しました。ファイルを開きますか？","確認",MessageBoxButtons.YesNo,MessageBoxIcon.Information);
    if (result == DialogResult.Yes)
    {
        Process.Start(filepath);	
    }
}

```
# 注意点
- 上記のコードで斜めを引くときに「.xlsx」だと斜めだけでなく、どこかの罫線を引いてあげないと罫線が引かれない

# 参考文書

* ApachePoiのドキュメントを参照
* https://poi.apache.org/components/spreadsheet/quick-guide.html#Borders
AWS S3にテストウイルスのファイルをLambdaでアップする

# はじめに

EICAR のテストウイルスが HTTP でダウンロードできなくなってしまったので、Amazon S3 の静的ウェブサイトを使ってテストウイルスのダウンロード環境を作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/b73cc35f-d65f-c3a7-ab7a-d477afcbe2ea.png)

# Amazon S3 の設定

バケットを作成して静的ウェブサイトの設定を行います。
詳細は下記チュートリアルや他サイトを参照ください。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html

# Lambda の設定

言語は Python 3.8 で作成。

下記コードを保存 → Deploy → Test 実行 で S3 にファイルがアップされます。
トリガなど特に設定する必要はありません。

```python:lambda_function.py
import json
import boto3
import os

def lambda_handler(event, context):
    # ローカルにテストファイル作成
    fp = open('/tmp/eicar.com', 'w')
    
    # EICARテストファイルのアスキー文字列を書き込みます
    fp.write('X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*')
    
    # ファイルのクローズ。
    fp.close()
    
    # S3アップロード
    s3 = boto3.resource('s3')
    s3.meta.client.upload_file('/tmp/eicar.com', '[S3バケット名]', 'eicar.com')
    
    # ローカルファイル削除
    os.remove('/tmp/eicar.com')

```

# 動作確認

ブラウザ等から以下のURLにアクセスしてファイルがダウンロードできることを確認します。

```
http://[S3バケット名].s3-website-ap-northeast-1.amazonaws.com/eicar.com
```

※上記リージョンは東京ですので環境に合わせてURLを調整ください

うまくいかない場合は、S3のバケット内にファイルがアップされているか確認してください。

# 最後に

今回 Lambda を使いましたが、一度きりの作業で他システムからの連携もありませんので、あえて Lambda でやるメリットはあまりなかったかもしれません。
まあ環境を作って壊してを繰り返すときは Lambda にコードが残っていれば、再作成は容易いかなと思います。


参考サイト
https://rioner2525.hatenablog.com/entry/2019/07/25/185907
https://www.eicar.org/?page_id=3950
Cloud9上にlaravel / nuxt環境をgit cloneで作成する

いちから環境構築する手順はたくさんあると思いますが。
今回はまっさらなCloud9にlaravel/nuxt環境を構築するまで。
※リモートリポジトリに環境がある前提。
※phpのバージョンなどの環境構築は過去記事の[こちら](https://qiita.com/tk2Aprl/items/38595bce5199d37a9097)を参照。

___git clone___

```
$ git clone リモートリポジトリ
```

__laravel編__

```
$ mkdir vendor
$ cp .env.example .env
$ composer install
$ php artisan key:generate
```
___nuxt編___

```
$ npm install
```
ABC084-D Pythonでの「エラトステネスの篩」を用いた解法

## 累積和の問題
https://atcoder.jp/contests/abc084/tasks/abc084_d

結構昔の問題です。今更ながら、累積和の勉強の為に解いてみました。

##解法
「エラトステネスの篩 (ふるい)」という手法を使うと、素数テーブルを高速に作成することができます。
そのテーブルとは、配列のインデックス $i$ が素数だった場合、その要素が True となる配列のことです。

この問題では作成した素数テーブルを用いて、「2017に似た数」かどうかを判定し、[累積和](https://qiita.com/drken/items/56a6b68edef8fc605821) という手法を用いることでより高速に「2017に似た数」が何個あるか数えられます。

##コード
```python:like2017.py
Q = int(input())
lr = [list(map(int, input().split())) for _ in range(Q)]

N = 10 ** 5
prime = [True] * (N + 1)
prime[0] = prime[1] = False

# 素数テーブルの作成 (エラトステネスのふるい)
for i in range(2, N + 1):
    if prime[i]:
        for j in range(i * i, N + 1, i):
            prime[j] = 0

# 2017 like number の累積和テーブルの作成
like2017 = [0] * (N + 1)
for n in range(1, N + 1):
    if prime[n] == 0: # n がそもそも素数でなかったから前の値で更新
        like2017[n] = like2017[n - 1]
        continue
    query = (n + 1) // 2 # n は素数なので奇数であり、n + 1 は必ず 2 で割り切れる数となっている
    if prime[query] == 1: # (n + 1) // 2 も素数だから、1 を足した値で更新
        like2017[n] = like2017[n - 1] + 1
    else: # n は素数だったけど、(n + 1) // 2 が素数でなかったから前の値で更新
        like2017[n] = like2017[n - 1]
    
for l, r in lr:
    print(like2017[r] - like2017[l - 1])
```


##参考
- [ABC084D - 2017-like Number](https://kakedashi-engineer.appspot.com/2020/04/29/abc084d/)
- [累積和を何も考えずに書けるようにする！](https://qiita.com/drken/items/56a6b68edef8fc605821)
PycharmでunittestをDebug


#はじめに
unittestを使ってテストコードを作成して初めて、Pycharmで直接Debugしてみたら、いきなり下記のエラーが出ました。本文では下記のようなPycharmでunittestをDebugする時、モジュールが見つからないエラーを解消する方法を共有します。

```
ImportError while importing test module \src\tests\utils\test_transmitters.py'.
Hint: make sure your test modules/packages have valid Python names.
```

#エラーの原因
Pycharmでは自動的にunit testファイルを識別して、デフォルトでpytestで実行してしまうから。原因が分かりましたが、それならどうやって解決できるでしょうか？ここでは二つの方法を紹介します。

#デフォルト実行環境をunittestにする
以下の手順でFile->setting->Tools->Python Intergrated Tools->Default test runner->Unittestsデフォルト実行環境を変えます。デフォルト実行環境を変えると、直接Debugしたいファイルを実行して、Debugできます。

![スクリーンショット 2021-06-04 031841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486244/f0a67bf1-bb51-ba3d-daac-56770456a118.png)

#ファイル毎に実行環境を用意する
以下のようにファイルの実行環境を追加します、必ずPython tests->Unittestsを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486244/a32429cd-b8c9-4ed1-d315-381fe0b80b1b.png)

#後記
unittestで実行する場合、順番でテストメソッドを実行していますので、例えば、一つのテストクラスにたくさんのテストケースがある場合、一つ一つ実行してしまて、テスト時間が長くなってしまうことがあります。ここでは特定なメソッドを実行する方法を紹介します。
同じく実行環境を追加します、Python tests->Unittestsを選択して、TargetのところをModule nameを選択して、実行するメソッドを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486244/bc39e907-4993-d2b1-d135-caf1829d0cd2.png)
teratailに数ヶ月参加して分かった、質問、回答の難しさ

これは、teratailを数ヶ月ほど利用した私が質問、回答両方ともやってみた上で、感じたことをまとめてみたもの。
~~ですます調で書くのはすごく書きづらかったので諦めた。~~

質問の難しさ
---
質問をするユーザーは大体初心者の方が多い印象だ。初心者故に気付かない事もある。
なので初心者がやっていなくても**怒られはしないが
指摘は受けるもの**と、**明らかなマナー違反、規約違反と指摘されるもの**がある。
基本的には後者はヘルプにて推奨していない質問をしていた場合だ。前者はteratailから特段取り締まられている訳では無いが、
ユーザビリティの問題などで改善して欲しいものが多い。


##怒られはしないが指摘されるもの
これの代表としては**MarkDownを使用せずにソースコードをベタ貼りする事**が挙げられる。
私自身、teratailに参加するまでMarkDownの存在は全く知らなかった。
teratailのヘルプや質問投稿画面は結構良く出来ているが、問題が発生して、誰かに質問したくて焦っている人間が見落とすことはある。(若干目立ちにくい位置にあるからね。)

今は回答者側に立っているため、C言語などの質問で

#include＜stdio.h＞
int main(void){

int i;
(以下略)

---
上記のように見出しと扱われているinclude...を見て、
MarkDownが使われていない事に苛立ちを覚えるが、
知っている初心者の方が少ないので、これに関してはあくまで普通に指摘だけしてあげれば良いと思う。
(投稿後に質問画面見れば変だなと気付きそうではあるが)

##明らかなマナー違反、規約違反と指摘されるもの
これはteratailにおいて非推奨の質問とされているものがメジャーだ。

- プログラミングに関係のない質問
- コードをください・デバッグしてください等の丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような質問

以上の6つがteratailの[推奨していない質問](https://teratail.com/help/avoid-asking)で挙げられているものだ。
これらの解説については、リンク先を見て貰った方が分かりやすいと思うので、省略する。

他には、[利用規約](https://teratail.com/legal)にて禁止されているものもそうだ。
基本的にはQAサイトにおける一般的な利用規約が書かれているが、よく問題になるものを挙げる。

> **第7条（禁止事項)**
(10)ユーザーIDを他者と共有する行為
(11) 複数のユーザーIDを1人で保有する行為


teratailでは、アカウントを複数人で共用すること、
複数のアカウントを同時に保有することは禁止されている。
2017/02/01に規約の改定によって追加されたもの。


禁止こそされているが、特に(11)に関しては防ぐような手段がteratail自体に備わっていないため、
殆どはユーザーによる通報で調査が行われ、規約違反となれば凍結→BANとなるようだ。

このような行為はユーザー達によって低評価、コメントによる指摘がすぐに入る。
広告と受け取られるような質問は基本的には無いと思うが、それ以外はしっかり考えて質問を立てないとどうしても付きやすい。
特に多いのは`コードをください・デバッグしてください等の丸投げの質問`。

あくまで回答者は善意によって回答、コメントをしてくれているので、無償の場であることをしっかり理解した上で質問を
心掛ける必要がある。

質問一つするにしても色々な所で縛りが多いため、低評価されず、指摘も受けないような質問をするのは非常に難しい。
実際、低評価を受けて即座に退会してしまうユーザーも少なくない。
~~Stack overflowよりはフラットな場だとは思うが~~

回答の難しさ
---
~~色々書こうと思ったが、面倒だったので。~~
この記事を書くに当たって参考にした@raccyさんの記事の方が参考になると思うのでそちらを読んで欲しい。
[teratailで良い回答をするには？](https://qiita.com/raccy/items/064635c6896509b871c1)

現在、記事執筆時点で342159件(質問のURL参照)もの質問がされているteratailだが、質問するにしても、回答するにしても
色んな所で気を使わないと上手くやっていくのは難しい。本記事は質問についてを多く述べたので、~~(回答について書くのをサボっただけ)~~

teratailで質問しようとする人がこの記事を見ていたなら、上手く使えば問題解決に大きく役に立つ場であるので、
疑問を解消したくて焦る気持ちはわかるが、一呼吸置いてしっかりとした質問を心掛けては如何だろうか。
即時関数、アロー関数

### 即時関数
---
即時関数とは、関数を定義すると同時に実行される構文です。関数を定義してから呼び出すと言う手間を省くことができます。

```
// 無名関数
const countNum = function(num){
 console.log(num)
}
countNum(1)

// 即時関数
(function countNum(num) {
 console.log(num)
})(1)
```
()の中にfunctionからはじまる関数定義そのものを配置することで、その関数を即実行するということができるようになります。その結果、関数を呼び出すという手間が省けます。

### アロー関数
---
アロー関数とは、functionの記述を省略し、その代わりに()=>という記述によって関数を定義する構文です。より短い記述で関数を定義できるというメリットがあります。

```
// 無名関数
const 変数名　= function(){
　処理
}

// アロー関数
const 変数名 = ()  => {
　処理
}
```

以下のコードを記述して1と表示されていれば成功です。

```
const countNum = (num) => {
 console.log(num)
}
countNum(1)
```

関数定義の種類　|  特徴                                                       |
-------------|-------------------------------------------------------------|
関数宣言      | 標準的な関数の定義                                              |
無名関数      | 関数を多く使用するコードであるときに使用する。関数名の重複を避けることができる。 |
即時関数      | 流用する可能性のない関数を定義するときに使用する。別途関数を定義する手間がない。 |
アロー関数     | 無名関数または即時関数において、より省略したいときに使用する。 |
FastAPI の使い方

FastAPI の使い方です。

参考ページ
[FastAPI](https://fastapi.tiangolo.com/)

## インストール

Arch Linux でのインストール

```bash
sudo pacman -S python-fastapi
sudo pacman -S uvicorn
```

Ubuntu でのインストール

```bash
sudo apt install python3-fastapi
sudo apt install uvicorn
```

## サンプル　その1

```py:main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
```

サーバーの実行

```bash
uvicorn main:app --reload
```

クライアントでアクセス

```text
$ http http://127.0.0.1:8000
HTTP/1.1 200 OK
content-length: 17
content-type: application/json
date: Fri, 04 Jun 2021 07:29:36 GMT
server: uvicorn

{
    "Hello": "World"
}
```

## サンプル　その2

```py:ex01.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
	rvalue = {"morning": "おはよう","afternoon": "こんにちは"}
	return rvalue


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
	return {"item_id": item_id, "q": q}
```

サーバーの実行

```bash
uvicorn ex01:app --reload
```

クライアントでアクセス

```text
$ http http://127.0.0.1:8000
HTTP/1.1 200 OK
content-length: 56
content-type: application/json
date: Fri, 04 Jun 2021 07:31:18 GMT
server: uvicorn

{
    "afternoon": "こんにちは",
    "morning": "おはよう"
}
```

## 確認したバージョン

```text
$ python
Python 3.12.7 (main, Feb  4 2025, 14:46:03) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import fastapi
>>> fastapi.__version__
'0.110.3'
```

## 関連ページ
[FastAPI: GET の引数の処理](https://qiita.com/ekzemplaro/items/3f892bf7ff53d8b0ca02)
[FastAPI: POST の引数の処理](https://qiita.com/ekzemplaro/items/77507876c1551c6464df)
🔰 [Kotlin] 基礎 androidstudio　配列


「作って楽しむプログラミング　Androidアプリ超入門」の勉強をまとめていきます。

####環境
java: 1.8.0_281
kotlin:1.5.10

##配列の種類と特徴
Kotlinの配列には大きく分けて2つの種類があります。
``基本型(プリミティブ型)の1つとしての配列``： Arrayが該当します
``コレクションパッケージの1つとしての配列``： ListやArrayListなどArray以外のほとんどが該当します

Kotlinで複数の要素を扱う際は、基本的にコレクションパッケージで用意されているListやMutableListなどのクラスを使用します。

Arrayはライブラリなどで明示的に使うことを指定されている場合に使用すると良いでしょう。またListは読み取り専用のクラスであり、要素や要素数を変更する可能性がある場合はMutableListを使用します。

MutableListと同等のクラスにArrayListがあります。両者の違いは可変(Mutable)であることを明示しているか、です。通常はMutableListを使用し、Javaとの互換性などで明示的に使うことを指定されている場合にのみArrayListを使用すると良いでしょう。

##サンプルコード
要素の確率を変更したい時は、if,whenなどの条件分岐ではなく、配列を用いるほうがベター
if,whenのサンプルコードは[こちら](https://qiita.com/nipp/items/b1c6179abdd19c3a6ac8)

今回は吉:大吉:凶を18:1:1に設定したい。
また、今回使用するArrayクラスでは、宣言と同時に配列要素の初期化を行うことができる。
初期化処理には各要素に設定したい値を返す式を書く。今回は「吉」という文字列で初期化。
インデックス番号を指定して、「大吉」「凶」を代入する


``` sample.kt
        //文字列型が20個分入った配列を宣言する
        val omikujiShelf = Array<String>(20,{"吉"})
        omikujiShelf[0] = "大吉"
        omikujiShelf[19] = "凶"
```

##for文で配列にアクセスする
要素数が増えてきても、要素1つずつ指定するのは非効率なのでfor文の範囲式を使用する
javaで言うと拡張for文みたいなイメージ
上記のコードを範囲式で書き換える

``` sample.kt
        //文字列型が20個分入った配列を宣言する
        for (i in 0 .. 19 ) {
        omikujiShelf[i] = "吉"
　　　　　　　　　　　　　　　　}
```



``参考``
https://techacademy.jp/magazine/32265
🔰 [Kotlin] 基礎 androidstudio　アニメーション

「作って楽しむプログラミング　Androidアプリ超入門」の勉強をまとめていきます。

###環境
java: 1.8.0_281
kotlin:1.5.10

今回はアニメーションについてです。

##androidのアニメーション
androidでは、Tweenアニメーションと、Frameアニメーションがあります。

**`Tweenアニメーション`**：1つの画像そのものを変化させる。具体的には、画像の移動、フェード、回転、拡大縮小など

**`Frameアニメーション`**：少しずつ異なる複数の画像を順番に表示させるアニメーション。パラパラ漫画みたいな。

今回はTweenアニメーションについて見て行きます。
どのアニメーションも「開始時の値」　「終了時の値」　「何ミリ秒かけて移動するか」などの項目の設定が必要である。

| クラス名 | 概要 | 
|:-----------|------------:|
|AlphaAnimation | 透過性を変化させる |
|RotateAnimation|角度を変化させる|
|ScaleAnimation|大きさを変化させる
|TranslateAnimation|位置を変化させる|
|AnimationSet|複数のアニメーションを合成する|

####サンプルコード

```sample.kt
      //0.1秒の移動を3往復(最初の1回+繰り返しの5回)設定したい
        fun onButtonClick(v:View) {
      //ウィジェットの移動
        val translate = TranslateAnimation(0f,0f,0f,-200f)
      //繰り返しモード
      translate.repeatMode = Animation.REVERSE
        //繰り返し回数
      translate.repeatCount = 5
      //アニメーション時間
        translate.duration = 100
      //アニメーション回転
        val rotate = RotateAnimation(0f, 36f, imageView.width/2f, imageView.height/2f)
        rotate.duration = 200
        //AnimationSetクラスを使ってアニメーションの合成
        val set = AnimationSet(true)
        set.addAnimation(rotate)
        set.addAnimation(translate)

        imageView.startAnimation(set)
無名関数

### 無名関数
---
無名関数は関数名なしで関数を定義することができます。より簡潔なコードが記述できると言うメリットがあります。

```
//関数宣言
function hello(){
 console.log('hello')
}

//関数式(無名関数）
const hello = function(){
 console.log('hello')
}
```
以下のコードを記述して、12と出力されていれば成功です。

```
const calc = function(num1,num2){
 return num1*num2
}

const num1 = 3
const num2 = 4
console.log(calc(num1,num2))
```
【jinja2】複数行にわけてテンプレートを記述したい

### はじめに
<バージョン>
Jinja2: 2.11.3

　以下のyamlファイル(sample_yaml.yml)から変数を結合するテンプレート(sample1.j2)を
作ったのですが、全体(list1/var1/var2)に対してjoinフィルタをかけようとすると一行が
長くなってしまうので、複数行に分けて書く方法がないかを調査しました。

```yaml:sample_yaml.yml
---
list1:
  - "test1"
  - "test2"
var1: "aaa"
var2: "bbb"
```

```jinja:sample1.j2
{{ list1 | join('_') }},{{ var1 }},{{ var2 }}
```

```text:出力
test1_test2,aaa,bbb
```

### テンプレート紹介
　1行目と最終行にあるように、複数行に分けて書きたい内容は()で囲めばよいそうです。
後は、全体(list1/var1/var2)に対してjoinフィルタをかけるために[]で囲めば完成です。

```jinja:sample2.j2
{{(
  [
    list1 | join('_'),
    var1,
    var2,
  ] | join(',')
)}}
```
Raspberry Pi Pico（ラズパイPico）をArduino IDE環境で使ってみる

#####Raspberry Pi PicoがArduino IDE 環境で使えるようになりました。

#####次の記事を参考にしました
 [Arduino IDE Support for the Raspberry Pi Pico!](https://www.seeedstudio.com/blog/2021/01/29/arduino-ide-support-announced-for-the-raspberry-pi-pico/ "Arduino IDE Support for the Raspberry Pi Pico!")

英文ですが、易しい文章なので原文を参照した方がわかりやすいかもしれません。
OSはWindows 10 ProですがMacもほぼ同じだと思います。

####Raspberry Pi picoを追加する手順

**■ファイル->環境設定を開く**
**■追加ボードのマネジャーURLを開く**
**■`https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json` を貼り付ける**
**■追加したらOKボタンで閉じる**
**■ツール-ボードマネジャーを開く**
**■「Raspberry pi Pico/RP2040」を選択してインストールする**



![aruduino_pico.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11566/65a51921-70a0-f24d-28e7-25f0913d1f45.png)

![aruduino_pico_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11566/a1c8969a-53a3-6b15-0d3a-505bc1795403.png)


####Raspberry Pi picoにプログラムを書き込む手順

**■pico上の「BOOTSEL」ボタンを押しながら、USBケーブルをPCに接続します。**
**■ツール->ボードをRaspberry pi picoを選択**
**■ツール->シリアルをRaspberry pi picoを認識しているポートを選択**


######これで他のArduino マイコンボードと同じようにプログラミングができます。
SharedArrayBuffer

# SharedArrayBuffer
## とは何か
（Web Worker - メインプロセス間などの）スレッド間で参照を共有することが出来る版の[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)。  
（通常の[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)は他のスレッドに参照を渡したら、自スレッドからはアクセスできなくなる。一方、ShareArrayBufferは渡した後でもアクセスできる。）

## 使用上の注意点
### セキュリティ
Spectreの脆弱性の発見に伴い、SharedArrayBufferの「スレッド間で値を参照し合える」という特性が当該攻撃についてセキュリティリスクを孕むことが判明したため、現在では[cross-origin isolated](https://developer.chrome.com/blog/enabling-shared-array-buffer/#cross-origin-isolation)な状態でない限りブラウザのセキュリティ機構によってSharedArrayBufferの使用をブロックされるようになった。  
（※ cross-origin isolated: ざっくり言うと、自サイトが`<iframe>`, `<script>`, `<img>`, `XMLHttpRequest(XHR)`, etc. で他サイトから取得されれたり、したりするときの利用ポリシー（何を、どうするのがOK/NGか）を設計・設定・管理されている状態にであるということ。）

#### 参照
- [SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 91 - Chrome Developers](https://developer.chrome.com/blog/enabling-shared-array-buffer/)
- [「Google Chrome 91」でSharedArrayBufferの制限が強化 ～COEP/COOPヘッダーの明示的な指定が必要に - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1307629.html)
- [Security consideration: Multi-threading helps cache-based side channel attacks · Issue #1 · tc39/ecmascript_sharedmem · GitHub](https://github.com/tc39/ecmascript_sharedmem/issues/1)
- [Cross-Origin Resource Policy (CORP) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP))

### マルチスレッド処理における排他処理
SharedArrayBufferも、マルチスレッド処理における類似の他例に漏れず、値の取り扱いには排他処理への考慮が必須となる。  
（もし要らないとしたら、もしかしてそれ[ArrayBuffer](https://qiita.com/toshi00ysm/items/ddd60c22aa58d16c8320)で事足りる要件だったりしませんか？）

JavaScriptにおける排他処理、つまり不可分操作は、`Atomics`を使って実装することが出来る。

#### 不可分操作とは
マルチスレッドで1つの変数を共有している場合、その変数に両方のプロセスのアクセスタイミングが重なるとデータ整合性上のトラブルが発生し、バグの原因となる。

これを防ぐために、不可分操作を施し、他のスレッドの割り込みを禁止して、値の書き込みと読み出しの整合性（書き込み処理と読み出し処理の間に別スレッドによる別の書き込み処理が割り込んでいないこと）が確実に担保された区間を作ることが出来る、というもの。

#### 参照
- [SharedArrayBuffer - JavaScript | MDN #atomic_操作で共有メモリを更新、同期する](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#atomic_%E6%93%8D%E4%BD%9C%E3%81%A7%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E6%9B%B4%E6%96%B0%E3%80%81%E5%90%8C%E6%9C%9F%E3%81%99%E3%82%8B)
- [Atomics - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Atomics)

## 参照
- [SharedArrayBuffer - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer)
- [ecmascript_sharedmem/TUTORIAL.md at master · tc39/ecmascript_sharedmem · GitHub](https://github.com/tc39/ecmascript_sharedmem/blob/master/TUTORIAL.md)
- [ArrayBuffer - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
- [Typed Arrays: ブラウザでバイナリデータを扱う - HTML5 Rocks](https://www.html5rocks.com/ja/tutorials/webgl/typed_arrays/)
Cloud9でlaravelの開発環境構築210604

Cloud9からbastionサーバーに接続しようといじっていたら、突然バーストして爆死した。
laravelの環境構築の備忘録を残すいい機会なので、書いておく。
しかし次に構築する時には、備忘録を記録したことを忘れてしまっている可能性があるので、意味がない気もする。


__PHP install__

```
$ php-v
PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

$ sudo amazon-linux-extras list | grep php
15  php7.2                          available    \
17  lamp-mariadb10.2-php7.2=latest  enabled      \
 _  php7.3                          available    \
 _  php7.4                          available    [ =stable ]
 _  php8.0                          available    [ =stable ]

$ sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2=latest
// 略

$ sudo amazon-linux-extras install php7.3
$ php -v
PHP 7.3.28 (cli) (built: May 13 2021 22:37:44) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.28, Copyright (c) 1998-2018 Zend Technologies
```

Cloud9には元から7.2系のPHPが入っているが、Laravel6系は7.3以降しかインストールできない。
上記コマンドでバージョンを上げる。
※普通にインストールしても入らないので、３行目でawsの制御を外している

__composer install__

```
# curl -sS https://getcomposer.org/installer | php
# sudo mv composer.phar /usr/local/bin/composer
# composer
```

上記通り実行すれば良い

__package install__

```
$ sudo yum install php php-mbstring php-pdo php-gd php-xml
```

必要なパッケージをダウンロードする。
以上
AWSにてyumのインストールができない時

EC2サーバーにyumをインストールしようとした際に、以下エラーが発生してインストールできなかったのでその備忘録を残しておきます。

```
[ec2-user@ip-10-0-0-110 ~]$ sudo yum install httpd -y
[sudo] ~ のパスワード:
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
　〜省略~
Cannot find a valid baseurl for repo: amzn2-core/2/x86_64
```

##結論
EC2のセキュリティグループのアウトバウンド設定が正しく設定されていなかった。

##対処策
EC2のセキュリティグループのアウトバウンド設定にhttpとhttpsを追加する。

以下手順となります。

まず、AWSのEC2インスタンスの画面に移行します。
そしてネットワーク&セキュリティ→セキュリティグループを選択します。

![スクリーンショット 2021-06-02 23.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340120/cb909241-ac02-1131-423c-b3fa9fa1ba60.png)

次にアウトバウンドルールを編集します。
![スクリーンショット 2021-06-02 23.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340120/930d172c-fa12-092f-3477-b6e36de4deaa.png)

ここでHTTPとHTTPSを追加して、外部接続を許可します。
![スクリーンショット 2021-06-02 23.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340120/1095ae05-1e94-b870-4e84-12af32936059.png)

これで再度yumのインストールの実行を行ってみてください。

もし、またインストールできないようであればAmazon Linuxのyumリポジトリにアクセスできていない可能性がありますので、その場合は以下記事が参考になりました。
https://go-journey.club/archives/14364
Raspberry PiのmicroSDをwindows10環境で初期化する手順

#どんな人が必要とする情報か
+ Raspberry PiのOSを焼いて実機で使っていたmicroSDに、初期状態のOSイメージを焼き直す際、そのままではWindows10のRaspberry Pi imagerで書き込みエラーになる。
+ そのため、書き込み前にmicro SDを初期化要。その初期化手順を記す。

#初期化手順
※2021/9/16追記
その後、以下の手順ではdiskpartのcleanコマンドで返ってこなくなったり、diskpartでselect partition x してからdelete partitionや、readonly属性を消す処理をしてもコマンドが返ってこなくなるケースが発生した。その場合、windows10→windowsマーク右クリック→ディスクの管理　でSDカードを選択し、ボリューム削除　で削除できた。
![スクリーンショット 2021-09-16 145733.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/bed02859-511b-a232-a49e-30c2952b1403.png)



1. raspberry PiのmicroSDをWindows10 PCのどこかに挿す。
※私のPCはSDカードスロットがあるので、microSD→SDアダプタを利用して、そのスロットに挿してます。
1. windows 10のコマンドプロンプトを起動する。
1. コマンドプロンプトから　diskpart　を実行する。
1. diskpartのコンソールで以下のコマンドを実行する。
    　　　※以下は"ディスク 3"が初期化したいmicroSDの場合の実行例。間違えるとハードディスクが消える可能性もあるので注意。

```
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           931 GB      0 B        *
  ディスク 1    オンライン           238 GB    17 MB        *
  ディスク 2    オンライン          2794 GB      0 B        *
  ディスク 3    オンライン            59 GB  3072 KB

DISKPART> select disk 3

ディスク 3 が選択されました。

DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。

DISKPART> list partition

このディスクには表示するパーティションがありません。
```
この後、Raspberry Pi imagerでOS Imageを焼けるようになる。
fastq用のインデックスfaidxって中身なんぞ？

## 結論

公式リファレンス

* https://www.htslib.org/doc/faidx.html

htslib公式サイトには次のように書かれています。

| 列 | 項目名      | 説明                                                |
|---|------------|----------------------------------------------------|
| 1 | 名前        | 参照配列の名前                                       |
| 2 | 長さ        | 参照配列の全長 (塩基)                                 |
| 3 | オフセット   | この配列の最初の塩基の FASTA/FASTQ ファイル内のオフセット |
| 4 | ラインベース | 各行の塩基数                                         |
| 5 | 線幅        | 改行を含む各行のバイト数                               |
| 6 | QUALOFFSET | FASTQ ファイル内のシーケンスの最初の品質のオフセット       |


## これはなに？

Fasta形式のリファレンスゲノムとかがあったときに、

```
samtools faidx hogehoge.fq
```

というコマンドを打つことがあると思います。すると、`hogehoge.fai` っていうファイルが生成されます。
この `.fai` っていうファイルは一体なにものなんでしょうか？

## とりあえず中身を見てみようか

いろいろ考えるよりやった方が早いことが結構あります。
たとえばヒトゲノムのリファレンスにfaidxをつけてみましょう。

```
samtools faidx GRCh38.p13.genome.fa
```

`GRCh38.p13.genome.fa.fai` というファイルができあがります。ここで注目すべきことは、faidx サブコマンドには、 `-@` などの並列化オプションが存在しないことです。faidx に限らず、インデックスを作るコマンドは並列化が効かないケースが多い印象がありますね。なんででしょうね。難しいことはわからない。

`head GRCh38.p13.genome.fa.fai`

さて、このインデックスファイルは中身はふつうのテキストファイルでした。

```
chr1	248956422	8	60	61
chr2	242193529	253105712	60	61
chr3	198295559	499335808	60	61
chr4	190214555	700936301	60	61
chr5	181538259	894321107	60	61
chr6	170805979	1078885012	60	61
chr7	159345973	1252537766	60	61
chr8	145138636	1414539514	60	61
chr9	138394717	1562097136	60	61
chr10	133797422	1702798442	60	61
```

`tail GRCh38.p13.genome.fa.fai`

```
KI270748.1	93321	3320702127	60	61
KI270749.1	158759	3320797027	60	61
KI270750.1	148850	3320958455	60	61
KI270751.1	150742	3321109809	60	61
KI270752.1	27745	3321263087	60	61
KI270753.1	62944	3321291318	60	61
KI270754.1	40191	3321355335	60	61
KI270755.1	36723	3321396219	60	61
KI270756.1	79590	3321433578	60	61
KI270757.1	71251	3321514518	60	61
```

1列目は、染色体の名前、2列目は塩基配列の長さでしょうか。
なんでしょうね。この60とか、61とかって。

余談ですが、YouPlotというターミナル上にグラフ描出ソフトがございまして、

https://github.com/red-data-tools/YouPlot

ターミナル上に棒グラフを描くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/f69373a1-64ae-3bd2-3bb2-85a7de30d356.png)

~~すきあらば自作ツールの宣伝~~

## 自分でインデックスを作成してみよう

こうやって見てみると思ったよりも簡単ですね。最後に本当に理解できていることを確認するために、自分でもインデックスを作るスクリプトを書いてみることにします。

私はRubyしか書けないのでRubyです。

完成イメージはこんな感じでしょうか？

```
cat genome.fa | ruby index.rb > genome.fa.fai # または
./index.rb genome.fa > genome.fa.fai
```

ちょっと富豪的プログラミングですが、以下のようなコードにしてみました。

```ruby
#!/usr/bin/env ruby

name       = nil
index      = 0
bases      = []
width      = []
offset     = 0
line_width = 0

def puts_tab(*args)
  puts args.map(&:to_s).join("\t")
end

while l = ARGF.gets
  index += l.size

  if l.start_with?('>')
    puts_tab(name, bases.sum, offset, bases[0], width[0]) if name

    name = l[1..-1].split(' ')[0]
    offset = index
    bases = []
  else
    width << l.size
    bases << l.chomp.size
  end
end

puts_tab(name, bases.sum, offset, bases[0], width[0])
```

とりあえず `GRCh38.p13.genome.fa` に関しては `samtools faidx` 全く同じ結果が得られることを確認しました。

## おわりに

samtools の faidx で求められるインデックスファイルは簡単な形式であることがわかりました。この記事は以上です。
SQLのIN句で指定できる値の上限について

SQLでIN句を使う時に、指定できる値は1000個が限界だと思っていて
この前業務で
「このSQLのIN句には1200個くらい値が入る可能性があるのに普通に動いてしまってる、、これはバグだ！！」
と思い無駄に時間をくってしまったのでメモ

実際にはDBによって違うようです。

| DB | 上限 |
| --- | --- |
| oracle | 1000 |
| postgreSQL | 2の64乗、一つの単語が2kバイトまで |
| mySQL | 上限なし、ただしクエリの上限サイズまで |


mySQLのクエリの上限サイズは調べたいDBに接続して以下のコマンドを打つことで調べられます。

```
mysql> show variables like 'max_allowed_packet'
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 33554432 |
+--------------------+----------+
```

DBサーバーに接続できるのであれば、設定ファイル（/etc/my.cnfのmax_allowed_packetの値）を変えてMySQLを再起動することで、制限値を変えることが可能です。

また、その接続の時だけ変えたい場合であればsetで変更ができます。

```
mysql> set max_allowed_packet=12345678;
Query OK, 0 rows affected (0.00 sec)
```

もし間違えていたらご教授いただけると幸いです。
関数式

### 関数式
---
関数式の場合は、function(引数) {}という無名の関数を変数に定義または、代入して関数を定義する、と言う記述になります。

```
変数 = function(引数) {
 //関数内の処理
}
```
### 関数宣言と関数式の違いについて
---
関数宣言と関数式では読み込まれるタイミングが異なります。

以下のコードを実行すると、Uncaught ReferenceError...といった形でエラーが表示されます。

```
hello()

const hello = function() {
console.log('hello')
}
```
１行目の時点で関数helloは定義されていないため、エラーとなります。一方、以下のように関数宣言を用いた場合はエラー無く、helloと出力が確認できます。

```
hello()

function hello(){
 console.log('hello')
}
```

JavaScriptにおいては関数宣言は先に読み込まれるために、このような事象が発生します。一方で関数式であれば先に読み込まれることはありません。
Firebase Emulatorsのデータを永続化する

私は普段の開発でBaaS（Backend as a Service）を使うことはほとんどありませんが、最近は少しFirebaseを使っています。Firebaseには各種エミュレータが備わっていて、Firestoreなどわざわざクラウドに接続しなくても、ローカルで起動したエミュレータに接続するようにして開発に役立てることができます。

https://firebase.google.com/docs/emulator-suite/install_and_configure?hl=ja

`firebase-tools` を設定済みの環境で、以下のコマンドを実行すればエミュレータを起動できます。簡単ですね :sparkles: 

```sh
$ npx firebase emulators:start
```

通常、エミュレータを使って開発を進めますが、上記のコマンドで起動すると停止した際にデータがすべて消えてしまいます。どうしたものかと思って調べたところ、以下のイシューを見つけました。 `--import` と `--export-on-exit` オプションを付けて起動すれば、エミュレータ停止時に指定したディレクトリにデータが保存され、次回起動時に保存済みのデータが使われるようになるんだと。

https://github.com/firebase/firebase-tools/issues/2269

例えば `data` というディレクトリに保存したければ、

```sh
$ npx firebase emulators:start --import data --export-on-exit
```

このように実行すればOKです。

と、ここまでの内容は、実はすべて公式ドキュメントやコマンドのヘルプに載っています。ちゃんと読みましょうってことですね :sweat_smile:

```sh
$ npx firebase emulators:start --help
```

```:実行結果
Usage: firebase emulators:start [options]

start the local Firebase emulators

Options:
  --only <emulators>          only specific emulators. This is a comma separated list of emulator names. Valid options are: ["auth","functions","firestore","database","hosting","pubsub","storage"]
  --inspect-functions [port]  emulate Cloud Functions in debug mode with the node inspector on the given port (9229 if not specified)
  --import [dir]              import emulator data from a previous export (see emulators:export)
  --export-on-exit [dir]      automatically export emulator data (emulators:export) when the emulators make a clean exit (SIGINT), when no dir is provided the location of --import [dir] is used
  -h, --help                  output usage information
```

# ディレクトリの指定に関するちょっとした注意点

出力先として `data` ディレクトリを指定した場合、以下のようなディレクトリ構造で出力されます。

```
data
├── firebase-export-metadata.json
├── firestore_export
│   ├── all_namespaces
│   └── firestore_export.overall_export_metadata
└── storage_export
    ├── blobs
    ├── buckets.json
    └── metadata
```

このとき、 `data` ディレクトリは勝手に生成されますが、ログを見る限り単純に `mkdir $PWD/data` を実行しているだけのようです。ディレクトリの階層を増やそうとして、 `data` ディレクトリがない状態で `data/firebase` のような指定をしてしまうと、ディレクトリの生成に失敗してデータが出力されないので注意が必要です :point_up:
react-router-domでrouterが動かない場合はrouter以下をdivで囲む

動かない

```javascript
<Router>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
          <li>
            <Link to="/dashboard">Dashboard</Link>
          </li>
        </ul>

        <hr />

        {/*
          A <Switch> looks through all its children <Route>
          elements and renders the first one whose path
          matches the current URL. Use a <Switch> any time
          you have multiple routes, but you want only one
          of them to render at a time
        */}
        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/about">
            <About />
          </Route>
          <Route path="/dashboard">
            <Dashboard />
          </Route>
        </Switch>
    </Router>

```

動く

```javascript
<Router>
      <div>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
          <li>
            <Link to="/dashboard">Dashboard</Link>
          </li>
        </ul>

        <hr />

        {/*
          A <Switch> looks through all its children <Route>
          elements and renders the first one whose path
          matches the current URL. Use a <Switch> any time
          you have multiple routes, but you want only one
          of them to render at a time
        */}
        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/about">
            <About />
          </Route>
          <Route path="/dashboard">
            <Dashboard />
          </Route>
        </Switch>
      </div>
    </Router>

```

routerの中が単一の要素でないと動かないらしい。
Juliaで配列の最小値を計算する時はminよりminimumの方が圧倒的に速いです!!

配列内の数値の最小値を求める作業を大量にループさせるコードを書く場面があり、よく使われるminとminimumのどちらがパフォーマンスが良いかを調べたので、結果を記します。
# Juliaで配列の最小値を求める方法

Juliaで配列の最小値を求める一番シンプルな方法は、以下の2つです:

- min関数を使う
- minimum関数を使う

### min関数とminimum関数の使い方

```Julia
# min関数 -> 引数に 「"配列"...」を入れる
arr = [4,6,99];
min(arr...) # -> 4
min([-5.3,2,0]...) # -> -5.3

# minimum関数 -> 引数に配列をそのまま入れる
minimum(arr) # -> 4
minimum([-5.3,2,0]) # -> -5.3
```
# min関数よりminimum関数の方が圧倒的に速いです!
どちらを使えばよいか迷って、Juliaの実行時間などのパフォーマンスを計測するパッケージ[BenchmarkTools](https://github.com/JuliaCI/BenchmarkTools.jl)を使って両関数の平均実行時間を調べたところ、**min関数よりminimum関数の方が圧倒的に速い**ことが判明しました。

以下の実験は、100000個の成分を持つ配列`b`の最小値を求めるのにmin関数とminimum関数を使った時で実行時間を比較した実験です。

```Julia
 b=rand(100000)
100000-element Vector{Float64}:
 0.07661649377719604
 0.646703517608999
 0.4972175634773961
 0.6893494999824146
 0.35158611763357195
 0.22027202802188928
 0.24586562304315396
 0.39476733772469186
 0.41141803903897145
 0.3037154094658425
 0.524003104541277
 0.6108319260559976
 0.3071612199107656
 ⋮
 0.2520123361632036
 0.5960248411447657
 0.8591244133447207
 0.15221420124967233
 0.48588096064056074
 0.9075623006011952
 0.5003984631658029
 0.5342887466969424
 0.16459541842781045
 0.7087452580959306
 0.3287200831830004
 0.31812125202785935
```

```Julia
julia> using BenchmarkTools

julia> @benchmark minimum(b)
BenchmarkTools.Trial:
  memory estimate:  16 bytes
  allocs estimate:  1
  --------------
  minimum time:     64.000 μs (0.00% GC)
  median time:      66.400 μs (0.00% GC)
  mean time:        66.535 μs (0.00% GC)
  maximum time:     122.600 μs (0.00% GC)
  --------------
  samples:          10000
  evals/sample:     1

julia> @benchmark min(b...)
BenchmarkTools.Trial:
  memory estimate:  5.34 MiB
  allocs estimate:  200003
  --------------
  minimum time:     6.151 ms (0.00% GC)
  median time:      7.072 ms (0.00% GC)
  mean time:        8.086 ms (4.97% GC)
  maximum time:     18.408 ms (28.64% GC)
  --------------
  samples:          617
  evals/sample:     1
```

このように、minimum関数を使った時は平均時間わずか$66\mu$ sで済んだのに対して、min関数を使った場合は平均約8 msかかっています。その差は100倍以上です。

# 結論
以上より、配列の最小値を求めるときは、基本的にminimum関数を使うと良いでしょう。
ArrayBuffer

# ArrayBuffer
## とは何か
ざっくりいうと、「生のバイナリデータのバッファ（入れ物）」。  

そしてこのArrayBuffer、なんと自身のデータを読み書きするメソッドがない。  
ではどうやってデータをArrayBuffer読み書きするのかというと、「[型付き配列（typed array）](https://qiita.com/toshi00ysm/items/b90b76094c1d114651c5)」や「[DataView](https://qiita.com/toshi00ysm/items/09404faf4c6c3921c800)」といった、バッファからデータを読み書きする専用のクラスを介して行う。  
（要は、JavaScriptではバイナリを保持する役割（「バッファ」）と読み書きする手段（「ビュー」）で実装を分け（役割分担し）ており、使う側が適宜それらを理解して効率的＆高速に使っていこうね、ってこと。）

## ArrayBufferが（こいつ単体で）出来ること
- `byteLength`プロパティから、データのバイト長を知る。
- `slice()`メソッドで、部分コピーな新しいArrayBufferをつくる。
- メソッドの引数に渡したりとかの、変数（値）としての取り回しができる。（そりゃな）

以上。

つまり、ArrayBuffer自体は本当に **ただの「バイナリデータの塊」** でしかないということ。  
なので、「（リトルエンディアン/ビッグエンディアンみたいなバイナリ特有のめんどくさいこと考慮しつつ/しないでよしなに）データの読み書きがしたいんですけどー」みたいなときはその用途専用のビューを使って行きましょうね、という感じ。

## 参照
- [ArrayBuffer - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
- [Typed Arrays: ブラウザでバイナリデータを扱う - HTML5 Rocks](https://www.html5rocks.com/ja/tutorials/webgl/typed_arrays/)
Gatsby.jsでマークダウン内の外部URLの画像もgatsby-imageで最適化したい！

# はじめに
こんにちは。いきものがかりの**ほっち**が卒業することを発表しました。ファンとしては残念ですが、これからの活動を応援しております！

さて、Gatsby.jsで画像の最適化を行う**gatsby-image**を使用しています。

その際に、マークダウン中に挿入している画像が、外部URLの場合にも、**gatsby-image**を適用する方法を見つけましたので共有します！

# これで行けます:+1:
以下を使用すると、外部URLの画像をダウンロードしてbuild時にstaticファイルとして配置してくれます:ok_hand:
https://www.gatsbyjs.com/plugins/gatsby-remark-images-anywhere/

まずはパッケージをインストールします。

```shell
$ npm install gatsby-remark-images-anywhere
```

で設定に以下を追加します。

```js:gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          {
            resolve: `gatsby-remark-images-anywhere`,
          },
        ],
      },
    },
  ]
}
```

あとはbuild等々すればOK！

## 実施前

```
![sample](https://example.com/sample.jpg)
↓
<img src="https://example.com/sample.jpg" alt="sample" title="sample" />
```


## 追加後

```
![sample](https://example.com/sample.jpg)
↓
<img
  class="gria-image"
  src="/static/xxxxxx/aaaaa/181128.jpg"
  srcset="
    /static/xxxxxx/bbbbb/181128.jpg 200w,
    /static/xxxxxx/ccccc/181128.jpg 400w,
    /static/xxxxxx/ddddd/181128.jpg 784w"
  title="sample"
  alt="sample"
  style="
    position: absolute;
    top: 0; left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center center;"
/>
```

# おわりに
これでマークダウンで挿入した外部URLの画像もgatsby-imageによって最適化されて表示できます :smile:
サイトのパフォーマンス改善にぜひ！