OmniAICreator/Qiita-1.07M huggingface dataset:
C# で簡単に await/async に置き換える方法

# C# で簡単に await/async に置き換える方法

C# には便利な `EventHandler` というものがあります。
とある処理が完了した時点で事前に登録されているイベントハンドラーが実行されるものです。

例えば以下のような `Process` を await/async に置き換えてみます。
（※`Process.WaitForExitAsync` があるやんけとかは言わないでください…）

```c#
var startInfo = new ProcessStartInfo {
    FileName = "dir",
    UseShellExecute = false,
    ErrorDialog = false,
};

var process = new Process {
    StartInfo = startInfo,
    EnableRaisingEvents = true,
};

process.Exited += (sender, args) => {
    // プロセス終了
};
```

これを `await` で待機可能にするには…

```c#
public static Task<int> RunAsync(this Process process)
{
    var exited = new TaskCompletionSource<int>();

    process.Exited += (sender, args) => {
        exited.TrySetResult(process.ExitCode);
    };

    if (!process.Start()) {
        throw new InvalidOperationException($"Could not start process: {process}");
    }

    return exited.Task;
}
```

みたいな拡張機能を作成して…

```c#
await process.RunAsync();
```

で待機することが可能です。

新規で作成するクラスの場合 `INotifyCompletion` やらを使用して初めから待機可能にすることも出来ますが、既存クラスを待機可能にするだけであれば上記の例のように `TaskCompletionSource` を使えば簡単に待機可能に出来ます。

```c#
public static Task<T> ????Async<T>(this ???? awaitable)
{
    var tcs = new TaskCompletionSource<T>();

    // awaitable の非同期処理終了時に tcs.TrySetResult を呼び出す

    return tcs.Task;
}
```

みたいな感じです。
jax/flaxのインストール時のトラブルメモ


# インストール

GPUを使う時はpipインストール時に指定しなければいけない

```
pip3 install --upgrade "jax[cuda]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
```

実際にはcudnnのバージョンに合わせてバージョン指定したほうがいい（後述）

```
pip3 install "jax[cuda11_cudnn86]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
pip3 install "jax[cuda11_cudnn82]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
```

**2023/9/11追記**
[公式のgithub](https://github.com/google/jax/#installation)見るとcudnnのバージョン指定不要になったっぽい？
```
pip install --upgrade pip

# CUDA 12 installation
# Note: wheels only available on linux.
pip install --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

# CUDA 11 installation
# Note: wheels only available on linux.
pip install --upgrade "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
```

# バージョンについて

cudnnバージョンは環境のcudnnのメジャーバージョンは合わせなければいけない
マイナーバージョンは環境のcudnnよりも古いjaxをインストールする

環境にインストールされているcudnnのバージョンはヘッダファイルを見る

```
$ cat /usr/include/cudnn_version.h

---省略---
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 5
#define CUDNN_PATCHLEVEL 0
---省略---
```

上の例の場合、jax[cuda11_cudnn82]をインストールしなければいけない

# GPUのメモリ

デフォルトではGPUメモリの9割をプリアロケートする。
チュートリアルやサンプルコードが動かないとかの報告がある。

特に、[Getting started](https://flax.readthedocs.io/en/latest/getting_started.html)のコードはTFDSでMNISTをロードする際にTensorFlowがGPUメモリをアロケートしてしまうので、TensorFlow側も対処が必要

JAXの設定

下記のどちらかを.bashrcでexportするか、実行時に指定する
```
export XLA_PYTHON_CLIENT_PREALLOCATE=false # preallocateしない場合
export XLA_PYTHON_CLIENT_MEM_FRACTION=.XX # 80-85%でうまくいくらしい。デフォルトは90%
```

TensorFlowの設定

下記をコード内で実行しておく
```
tf.config.experimental.set_visible_devices([], "GPU")
```

参考

https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html
https://github.com/google/jax/issues/8746
https://tech.yellowback.net/posts/jax-oom
2023年から始めるTableau入門③ -集計と非集計-

## はじめに
23年2月からTableau案件にアサインされることになったので、理解を深めるためにまとめます。

第1回　[ディメンジョンとメジャー](https://qiita.com/freestyleaerial/items/233b96dd21c8016af5f4)
第2回　[連載と不連続](https://qiita.com/freestyleaerial/items/8fcb73b632763d7a8010)
第3回　集計と非集計 ←今回

### 筆者の技術力

:::note warn
業界歴半年で、つい2週間前にTableau Desktopをインストール。BIツールはTableauが初めてです。
:::

## 参考

https://note.com/ritz_tableau/n/n690ec867a000

## 非集計とは

:::note info
「非集計」は、各行の中で完結している計算のこと。
:::

サンプルスーパーストアを例にとって、売上にどのくらい利益が占めているかを表した「利益率」を計算する列を追加してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/b2d13394-935f-a5b6-5d95-b1a4f2cc8351.png)
データソース▼を見てみると、確かに計算した結果が追加できていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/8f4989df-bd4f-9711-6fe9-b81c42ec9c4d.png)
先ほど定義した計算式に従い、「利益率」フィールドが生成されています。
これらはデータソース1行1行（レコード）の中で、それぞれの行の中で完結する計算が行われており、このことを「行レベル計算」と言います。

また、複数行のデータ集計ではないので、「非集計」計算とも呼ばれます。

## 集計とは

:::note info
「集計」は、粒度（データの切り口のこと）によって、データソースを切り分けて、その範囲内でデータを集計すること。
:::

上記の非集計では、利益率をレコード単位で完結させる計算をしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/b2d13394-935f-a5b6-5d95-b1a4f2cc8351.png)
この計算だと、例えば家電カテゴリ毎の利益率を見たいとき、「家電カテゴリに対し、1行ずつ利益率を算出する」ことになります。

正しいカテゴリ毎の利益率は、「カテゴリ毎の総売上に対し、そのうち何%利益になったか」なので、次のような計算式になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/28ecb934-dd63-0aa0-620d-236318cb7d7b.png)
これを「集約計算」と呼び、ディメンジョンの変化に応じて、その範囲内における利益率を算出してくれるというものです。

例えば、「地域」のディメンジョンを列に配置したとき、利益率はそれぞれの「地域毎」で計算式に従って求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/da758c7e-ddd8-b17b-1d96-8e97950d9b7a.png)
さらに、「カテゴリ」のディメンジョンを追加すれば、利益率はそれぞれの「地域毎×カテゴリ毎」で求められるということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601070/0e46c889-72eb-7c49-8461-9d0d9fb310b1.png)

## まとめ
ここでは、集計と非集計についてまとめました。
Tableauは、ディメンジョンを配置した範囲内（粒度）を判断し、瞬時にデータを集計し視覚化してくれることが分かりました。

次回は、結合・リレーション・データブレンドについて紹介できればと思います。
Googleプロジェクト管理：キャパシティ・プランニングとクリティカル・パス

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

# キャパシティ・プランニング

これまで、[タスクの完了に必要な総時間を予測する「時間見積り」][ref1] について説明しました。そして、タスクを完了するために必要な能動的な作業の量と難易度を予測する「工数見積り」についても説明しました。これらのテクニックは、タスクを完了するために必要な時間の長さを見積もるのに役立ちます。

[ref1]: https://qiita.com/masami-atwvn/items/2aad88c78b90076de4a9

このような情報が得られたら、作業を完了させるために適切な人数がいるかどうかを判断する必要があります。これを把握するには、キャパシティ・プランニングと呼ばれる手法を使用します。

まず、キャパシティを定義しましょう。

　***<font color="MediumVioletRed">『キャパシティとは、プロジェクトに割り当てられた人材やリソースが、一定期間内に合理的に完了できる作業量のこと』</font>***

一人の人間ができることは限られており、仕事を割り当てる際には、各人のキャパシティを念頭に置くことが重要です。そこで登場するのが、キャパシティ・プランニングです。

　***<font color="MediumVioletRed">『キャパシティ・プランニングとは、プロジェクトのタスクに人、リソースを割り当てること』</font>***

そして、その作業を時間内に完了するために必要なリソースがあるかどうかを判断します。この過程で、2人目のウェブ開発者や3人目のライターなど、プロジェクトのタイムラインを短縮するためのリソースが必要であることがわかるかもしれません。

:::note info
1日にこなすべき仕事量には限りがあります。ミーティングや突発的なタスクなど、通常の業務では一日にこなせる量は限られています。
:::

# クリティカル・パス

では、チームメイトが優先順位を決め、能力を最大限に活用するにはどうすればよいのでしょうか？

優先順位をつけるには、プロジェクトのタイムライン上にクリティカルパスを描きます。

　***<font color="MediumVioletRed">『クリティカルパスとは、プロジェクトのゴールを予定通りに達成するために、必ず到達しなければならないマイルストーンのリスト』</font>*** を指します。

また、各マイルストーンの完了に貢献する必須タスクもリストアップします。それ以外のものは、クリティカルパスから外れているとみなされます。

# キャパシティとキャパシティプランニングに影響を与える要因

1. ***<font color="MediumBlue">どのタスクが並行して実行できるか</font>*** を特定する必要があります。つまり、他のタスクと同時に実行できるタスクです。
1. ***<font color="MediumBlue">どのタスクが順次実行可能か</font>*** 、つまり特定の順序で実行されなければならないかを特定する必要があります。並行して進められるタスクを特定することで、複数のタスクを同時に完了できることを示し、プロジェクトスケジュールの効率化を図ることができます。連続したタスクを特定することで、プロジェクトの早い段階で優先順位をつけるべきタスクを特定することができます。<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4fc99ea5-6211-c2cb-3c74-b330ccd07d6f.png" width="600">

1. ***<font color="MediumBlue">どのプロジェクトタスクの開始日(Fixed start date)が確定しているかを判断する</font>*** 必要があります。開始日が決まっているものとは、目標を達成するために、そのタスクの作業を開始しなければならない日のことです。タスクの開始日が決まっているかどうかを確認することで、キャパシティプランニングに役立てることができます。なぜなら、タスクを時間通りに完了させるために、適切な人数を確保するのに役立つからです。<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/fd7f0d43-4d78-ef2b-301b-1d3ea0cb34f8.png" width="600">
1. タスクによっては、開始日が最も早い場合もあります。 ***<font color="MediumBlue">早期開始日を設定する</font>*** ことで、ベンダーやチームメンバーがいつからプロジェクトに参加できるのか、正確な見通しを立てることができます。これにより、作業計画を立てやすくなり、作業の優先順位もつけやすくなります。たとえば、新しいベンダーと仕事をする場合、ベンダーが作業を開始する前に、契約が締結され、発注書が承認され、作成されるのを待つ必要があります。
【Laravel 9】複数のMiddlewareと実行の優先度を指定する

## ミドルウェアとは..？
リクエスト処理の前後に実行したい処理を定義できる機能！

## ミドルウェアの作成
artisanコマンドで作成できる。

```php
php artisan make:middleware Hoge
```

## 処理を書く

```php
<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Hoge
{
	/**
	 * Handle an incoming request.
	 *
	 * @param  \Illuminate\Http\Request  $request
	 * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
	 * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
	 */
	public function handle(Request $request, Closure $next)
	{
		// リクエストが処理される前の処理を書きたい場合はここに書く
		return $next($request);
        // リクエストが処理された後の処理を書きたい場合はここに書く
	}
}
```

## app/Http/Kernel.php に作ったミドルウェアを追加

```php:Kernel.php
// どのページでも使用したいミドルウェアはここに書く
protected $middleware = [
	// \App\Http\Middleware\TrustHosts::class,
	\App\Http\Middleware\TrustProxies::class,
    // ...
];
```

```php:Kernel.php
// ルートのグループごとに使用したいミドルウェアはここに書く
protected $middlewareGroups = [
	'web' => [
		\App\Http\Middleware\EncryptCookies::class,
        // ...
    ],

	'api' => [
        // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
		'throttle:api',
		\Illuminate\Routing\Middleware\SubstituteBindings::class,
	],
];
```

```php:Kernel.php
// ルートごとに指定したいミドルウェアはここに書く
// 今回はここに追加
protected $routeMiddleware = [
	'hoge' => \App\Http\Middleware\Hoge::class,
	'fuga' => \App\Http\Middleware\Fuga::class,
	'piyo' => \App\Http\Middleware\Piyo::class,
];
```

## ミドルウェアの順序を指定

```php:Kernel.php
// ここで指定した順にミドルウェアが実行される。
protected $middlewarePriority = [
	\App\Http\Middleware\Fuga::class,
	\App\Http\Middleware\Piyo::class,
	\App\Http\Middleware\Hoge::class,
];
```

## 複数のミドルウェアをroutesに設定する
```php:routes/api.php
// ['Hoge', 'Fuga', 'Piyo'] の順で設定しているが、 $middlewarePriority に指定した順序が適用される
Route::group(['middleware' => ['Hoge', 'Fuga', 'Piyo']], function($router) {
	$router->apiResource('members', MemberController::class, ['only' => ['store', 'show']]);
	$router->apiResource('shops', ShopController::class, ['only' => ['index']]);
	$router->apiResource('blogs', BlogController::class, ['only' => ['index']]);
    // ...
});
```
AWS CDKの備忘録

## AWS CDKとは
AWS CDKは、AWS Cloud Development Kitの略で、Infrastructure as Code（IaC）ツールの一つ。
使い慣れたプログラミング言語（JavaScript、TypeScript、Python、Java、C#）を使用してAWSリソースの構築をすることができる。
実態としては、AWS CDKでコード化したものがAWS CloudFormationのテンプレートに変換されているため、作成・更新・削除などの挙動については、AWS CloudFormationのユーザーズガイドを参照する。
[スタックのリソースの更新動作](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html)

## 事前準備
AWS CDKを使用するための事前準備は、下記の通り。
* AWS CLIのインストール
* AWSの認証情報を設定
* Node.jsおよびyarnのインストール

## インストール
```php
yarn global add aws-cdk
cdk --version
```

## 初期化
```php
mkdir <プロジェクト名>
cd <プロジェクト名>
cdk init --language=typescript
```

## コマンド
```php
# 差分表示
yarn cdk diff <スタック名>

# スタックを作成（デプロイはされない）
yarn cdk deploy --no-execute <スタック名>

# スタックを作成してデプロイ
yarn cdk deploy <スタック名>

# スタックを削除
yarn cdk destroy <スタック名>
```

## 実装時に参考にすべきドキュメント
実装したい内容を調べて出てくる内容はもちろんですが、やはり[公式ドキュメント](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-construct-library.html)がおすすめ。

## 注意事項
* AWS CDKのバージョンに注意
2021年12月から安定版のv2の提供が開始。
実装したい内容を調べて出てくる内容がv1の記載となっているものもあるため注意が必要。
v1とv2の違いについては、こちらの説明がわかりやすい。
[2021年の「re:Invent」で一般提供が開始された「CDK v2」](https://logmi.jp/tech/articles/326570)
【BizRobo!】使用頻度が高い正規表現①

# はじめに
私がBizRobo!を使用し始めて約3年で使用頻度が高い正規表現を共有します。
BizRobo!に触れる前は、開発が得意ではないタイプの人間でしたので、
温かい目で見て頂ければ幸いです。
**※正規表現ができる人からすると簡単かも・・・？**

# BizRobo!で使用する正規表現
#### ファイル名を取得する
フルパスからファイル名のみを引き抜きたいときに、正規表現を使用すると
すごく簡単にファイル名だけを取得出来ます。

"C:\Users\username\Desktop\RPAとは？.pptx"
例えば上記のようなファイルパスがあったとします。
ファイルのフルパスを変数に格納します。
変数名はなんでもOK！
変数の型は「**Short Text**」
↓こんな感じ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/2e060da4-3646-bb53-cdd8-90ed5a167db0.png)

「変数の割当」ステップを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/cd1b76a0-1f01-55b9-707a-57dc43d9735a.png)

格納先の変数は、先ほど設定した変数。
値を「**コンバータ**」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/0d141197-e281-9e77-8907-b7ab254dad78.png)

デフォルトで設定されている「**変数の取得**」に
先ほどフルパスを格納した変数を設定し、OKをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/21bacf42-a0bf-2298-ad8e-ac68572d4fb9.png)

「＋」を押して「**抽出**」→「**高度な抽出**」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/7c47dbff-36f8-d0d6-3166-60104519d5c7.png)

設定が出来たら以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/d76bd2fe-0ef1-0762-efa1-aac227194f63.png)

すると、以下のように出力がファイル名のみだけになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/b20fd5c7-7453-d966-a9d6-e5ad982bae4a.png)

# さいごに
今回は正規表現を使用して、ファイルパスを抽出するということを行いました。
また次回別の正規表現を使用したことを共有したいと思います。
最後までご覧いただきありがとうございました。
[小ネタ] Caddy でローカルのみ通用するHTTPSサイトをワンライナーで立てる

たとえば下記コマンドを実行し、 https://oreore-https-site.localhost にアクセスすると http://127.0.0.1:3000 に繋ぐリバースプロキシを一発で立てることができます。

```bash
$ caddy reverse-proxy --from oreore-https-site.localhost --to 127.0.0.1:3000

# (追加のツールのインストールやパスワードを求められるかも)
```

もちろんローカル以外では通用しないなんちゃってHTTPSサイトですが、HTTPSでしか使えないブラウザの機能を解放する場合など即席でHTTPSが必要なケースには便利だと思います。


## (おまけ) Caddyのインストール方法

```bash
# Mac
$ brew install caddy
# Windows
$ scoop install caddy
```


## (おまけ) `*.localhost` ドメインとは？

> .localhostは、ループバックを示すことを目的としたトップレベルドメイン(TLD)である。

https://ja.wikipedia.org/wiki/.localhost

たとえば、 http://localhost:3000 のかわりに http://any-string-goes-here.localhost:3000 というURLを使ってもローカルホストに繋がります。[^1]

[^1]: Google Chromeだとローカルホストにつながったのですが、curlだと繋がりませんでした。ユーザーエージェントごとに　`.localhost` のサポート状況は違うようです。もちろん hosts に書いてしまうのも手です。
【Python】Excelと密に連携可能なpandas.DataFrameのサブクラス【Pandas】

# はじめに
昨日、Jupyter上にExcel風のスプレッドシートを作成する記事を拝見しました。
そして思いました。
**シームレスに本家Excelとデータを受け渡しできれば、それが一番最強なのでは**
と。

つまり「Excelでインタラクティブにデータを触りたい場合にはExcelにデータを渡して、Excelで編集したデータをPythonで使用したい場合にはExcelからデータを受け取る。」この当たり前の動作を、ファイル入出力などの面倒な操作を介さずに即座に行えれば非常に捗りそうです。

![Desktop 2023.01.17 - 17.35.21.05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501281/f15f218e-bd54-ca5d-c3aa-a7cee55713d7.gif)


# どうしたか
Pythonで表形式のデータを扱う定番といえばPandasのDataFrameです。このクラスを継承して、Excelとの連携機能を追加します。

# 実装例
`win32com`は日時データの扱いに癖があるため少しごちゃついてますが、Excelを開いてデータを読み書きしているだけですので、やっていることは至ってシンプルです。
`df.push()`でExcelにデータを渡し、`df.pull()`でExcelからデータを受けとれます。それ以外は通常のpd.DataFrameと同様に扱うことができます。

```py
import pandas as pd
from datetime import datetime
import win32com.client
import pywintypes
import numpy as np
from openpyxl.utils import get_column_letter


class DataFrame(pd.DataFrame):
    @property
    def _constructor(self):
        return DataFrame

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def push(self):
        self._connect()
        self.sheet.Cells.Clear()
        row, col = self.shape
        headers = [str(i) for i in self.columns]
        self.sheet.Range("A1", f"{get_column_letter(col)}1").NumberFormatLocal = "@"
        self.sheet.Range("A1", f"{get_column_letter(col)}1").Value = headers
        values = self._to_pydatetime(self.values)
        self.sheet.Range("A2", f"{get_column_letter(col)}{row+1}").Value = values

    def pull(self):
        self._connect()
        col, row = self._get_range()
        headers = self.sheet.Range("A1", f"{get_column_letter(col)}1").Value
        headers = headers[0] if isinstance(headers, tuple) else [headers]
        data = self._to_pydatetime(
            self.sheet.Range("A2", f"{get_column_letter(col)}{row+1}").Value
        )
        return DataFrame(data, columns=headers)

    def _get_range(self):
        return (
            self.sheet.Cells(1, self.sheet.Columns.Count).End(-4159).Column,
            self.sheet.Cells(self.sheet.Rows.Count, 1).End(-4162).Row - 1,
        )

    def _connect(self):
        try:
            self.app = win32com.client.GetActiveObject("Excel.Application")
            if not self.app.visible:
                self.app.visible = True
                self.workbook = self.app.Workbooks.Add()
            else:
                self.workbook = self.app.Workbooks[0]
            self.sheet = self.workbook.Worksheets("Sheet1")
        except Exception as e:
            self.app = win32com.client.Dispatch("Excel.Application")
            self.app.visible = True
            self.workbook = self.app.Workbooks.Add()
            self.sheet = self.workbook.Worksheets("Sheet1")

    def _to_pydatetime(self, x):
        def f(x):
            return (
                x.to_pydatetime()
                if isinstance(x, pd._libs.tslibs.timestamps.Timestamp)
                else datetime.fromisoformat(x.isoformat())
                if isinstance(x, pywintypes.TimeType)
                else x
            )

        return np.vectorize(f)(x)

```

# おわりに
良いPythonライフを。
JavaScriptによるコーディングテスト中のデータ構造

## 一、ハッシュテーブル

#### 1.配列Array

```js
const arr = [1, 2, 3]
```

#### 2.集合Set

```js
const set = new Set([1, 2, 3]);
```

#### 3.写像Map

```js
const map = new Map([
  ['name', 'tom'],
  ['title', 'Author']
]);
```



## 二、スタック

```js
function Stack(){
    // スタック
    this.items = [];
    // 追加
    Stack.prototype.push = function(element){
       this.items.push(element);
    }
    // 削除
    Stack.prototype.pop = function(){
        return this.items.pop();
    }
    // 取得
    Stack.prototype.peek = function(){
        return this.items[this.items.length-1];
    }
}

// 使用
const stack = new Stack();
```



## 三、キュー

```js
function Queue() {
	// キュー
	this.dataStore = [];
	// 追加
	Queue.prototype.enqueue = function (element) {
		this.dataStore.push(element);
	};
	// 削除
	Queue.prototype.dequeue = function () {
		this.dataStore.shift();
	};
	// 取得
	Queue.prototype.theFront = function () {
		return this.dataStore[0];
	};
}

// 使用
const queue = new Queue();
```



## 四、連結リスト
配列→連結リスト

```js
function ListNode(val, next) {
  this.val = val === undefined ? 0 : val;
  this.next = next === undefined ? null : next;
}

const makeList = (protoArr) => {
  let list = new ListNode(protoArr[0]);
  let pre = list;
  for (let i = 1; i < protoArr.length; i++) {
    pre.next = new ListNode(protoArr[i]);
    pre = pre.next;
  }
  return list;
};

// 使用
const list = makeList([1, 2, 3, 4, 5, 6])
```



## 五、二分木
配列→二分木
```js
function TreeNode(val, left, right) {
	this.val = val === undefined ? 0 : val;
	this.left = left === undefined ? null : left;
	this.right = right === undefined ? null : right;
}

const tree = (arr) => {
	if (!arr || arr.length === 0) return null;

	let root = new TreeNode(arr.shift());
	let nodeQueue = [root];

	while (arr.length > 0) {
		let node = nodeQueue.shift();
		if (arr.length === 0 || node === undefined) break;
    
		const leftArr = arr.shift();
		if (leftArr !== null) {
			let left = new TreeNode(leftArr);
			node.left = left;
			nodeQueue.push(left);
		}


		if (arr.length === 0) break;

		const rightArr = arr.shift();
		if (rightArr !== null) {
			let right = new TreeNode(rightArr);
			node.right = right;
			nodeQueue.push(right);
		}
	}

	return root;
};

// 使用
tree([1, 2, 3, 4, 5, 6, 7, 8, 9])
```
【PHP】文字化けせずに文字を抜き出す方法

# 先頭の1文字を取得したい

## mb_substrを使う
```php:qiita.php
mb_substr("文字",0,1);
```
* 結果  
```
文
```
<br>

## バイトで指定したいときはsubstr
```php
substr("moji",0,1);
```
* 結果
```
m
```
:::note warn
バイト指定なので文字を指定すると文字化けします
:::
Exception classのgetMessage

getMessage()とprintStackTrace()の違い
ExecutorServiceを使用した場合に発生するExecutionExceptionのgetMessage()について

```java
public class Outer {
    public static void main(String[] args) throws InterruptedException {
        SampleException se = new SampleException("xxxxxx");
        System.out.println(se.getMessage());
        method();
        Exception ex = new Exception("eeee");
        System.out.println(ex.getMessage());
        Exception ex2 = new ExecutionException(se);
        System.out.println(ex2.getMessage());
    }
    static void method() {
        SampleException se = new SampleException("yyyy");
        se.printStackTrace();
    }
}
```
ExecutionExceptionのgetMessage()は、クラス名が前につく
```
xxxxxx
com.mycompany.mavenproject1.SampleException: yyyy
	at com.mycompany.mavenproject1.Outer.method(Outer.java:37)
	at com.mycompany.mavenproject1.Outer.main(Outer.java:30)
eeee
com.mycompany.mavenproject1.SampleException: xxxxxx
```
paiza.ioでelixir その176

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
wavファイルを解析せよ。

# サンプルコード

```


:inets.start
:ssl.start



defmodule Main do
	def parse(body) do
		<<
			var!(chunk_id)::binary-size(4),
			var!(chunk_size)::little-unsigned-integer-size(32),
			var!(format)::binary-size(4),
			var!(sub_chunk_1_id)::binary-size(4),
			var!(sub_chunk_1_size)::little-unsigned-integer-size(32),
			var!(audio_format)::little-unsigned-integer-size(16),
			var!(num_channels)::little-unsigned-integer-size(16),
			var!(sample_rate)::little-unsigned-integer-size(32),
			var!(byte_rate)::little-unsigned-integer-size(32),
			var!(block_align)::little-unsigned-integer-size(16),
			var!(bits_per_sample)::little-unsigned-integer-size(16),
			var!(sub_chunk_2_id)::binary-size(4),
			var!(sub_chunk_2_size)::little-unsigned-integer-size(32),
			var!(data)::binary
		>> = body
		IO.inspect chunk_id
		IO.inspect chunk_size
		IO.inspect format
		IO.inspect sub_chunk_1_id
		IO.inspect sub_chunk_1_size
		IO.inspect audio_format
		IO.inspect num_channels
		IO.inspect sample_rate
		IO.inspect byte_rate
		IO.inspect block_align
		IO.inspect bits_per_sample
		IO.inspect sub_chunk_2_id
		IO.inspect sub_chunk_2_size
	end
	def main() do
        {:ok, {_status, _headers, body}} = :httpc.request('https://resolvenet.org/modules/contrib/webform/tests/files/sample.wav')
        body = IO.iodata_to_binary(body)
        parse(body)
        #IO.puts(body)
	end
end
Main.main


```

# 実行結果

```
"RIFF"
37526
"WAVE"
"fmt "
16
1
1
11025
11025
1
8
"data"
37478


```

# 成果物

https://paiza.io/projects/y6QSWO5XRX4IpaNDvhhbKg


以上。
MonacaとNCMBで経県値風アプリを作る（その1: 画面の仕様とSDKの初期化）


経県値というアプリは知っていますか？各都道府県毎に、その地域で経験した内容を記録していくことで累計ポイントを獲得するアプリです。

[経県値](https://uub.jp/kkn/#app)

今回はNCMBとMonacaを使って経県値風のアプリ（地図タップアプリ）を作ります。SVGを使って日本地図を表示し、経験したことをチェックしていきます。得点は出していませんが、ちょっとカスタマイズすればできるでしょう。

まず最初の記事では画面の説明とSDKの導入までを進めます。

## コードについて

今回のコードは　[memorymap-monaca](https://github.com/NCMBMania/memorymap-monaca) にアップロードしてあります。実装時の参考にしてください。

## 利用技術について

今回は次のような組み合わせになっています。

- Monaca
- Framework7
- D3.js

## 仕様について

地図のデータは[D3.jsで日本地図を描き、都道府県別に色を塗る - Qiita](https://qiita.com/ran/items/d88c5126362576be3291)に従って作成しています。topojsonは最新版ではコマンドラインオプションが変わっているので、1系をインストールして利用しています。

## 利用する機能について

地図タップアプリで利用するNCMBの機能は次の通りです。

- 会員管理
    - 匿名認証
- データストア
    - データ登録
    - データ更新
    - データ取得

## 画面について

今回は以下の2つの画面があります。

### www/pages/map.html

SVGを使って日本地図を表示します。都道府県をタップすると、該当する地域に対する経験を登録できます。

![0534 localhost - 0115163703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/28768ab9-c14e-5095-90c9-178425bbe28c.jpeg)


### www/pages/list.html

経験した内容を一覧表示する画面です。

![0536 localhost - 0115163730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/fc8e28f8-a921-a28a-effe-b3f5f31bf1a6.jpeg)


### SDKのインストール

今回はMonacaのJS/CSSコンポーネントの追加と削除より、NCMBを追加します。アプリのテンプレートはFramework7のJavaScript版（VueやReactではなく）を選択しています。

## NCMBのAPIキーを取得

[mBaaSでサーバー開発不要！ | ニフクラ mobile backend](https://mbaas.nifcloud.com/)にてアプリを作成し、アプリケーションキーとクライアントキーを作成します。

## js/config.jsonの作成

js/config.jsonを作成し、その中に先ほど取得したNCMBのAPIキーを設定します。内容は次のようになります。

```json
{
	"applicationKey": "YOUR_APPLICATION_KEY",
	"clientKey": "YOUR_CLIENT_KEY"
}

```

## 初期化

初期化は `js/app.js` にて行います。config.jsonを読み込む関係上、非同期処理内にて行います。cordovaの有無（アプリまたはプレビューの違いを検知）によって初期化時のイベント処理を変えています。

```jsx
// NCMBの初期化用
const event = window.cordova ? 'deviceready' : 'DOMContentLoaded';
document.addEventListener(event, async (e) => {
	// この中に処理を書きます
});

```

config.jsonの内容を読み込んで、NCMBとFramework7の初期化を行います。

```jsx
window.config = await (await fetch('./js/config.json')).json();
window.ncmb = new NCMB(config.applicationKey, config.clientKey);
window.app = new Framework7({
	name: 'My App', // App name
	theme: 'auto', // Automatic theme detection
	el: '#app', // App root element
	// App store
	store: store,
	// App routes
	routes: routes,
});

```

これでNCMBの初期化が完了します。

## ルーティング設定

今回は音声入力・出力用の1画面になります。これを `js/routes.js` に定義します。

```jsx
const routes = [
  {
    path: '/',
    url: './index.html',
  },
  // 地図画面
  {
    path: '/map/',
    componentUrl: './pages/map.html',
  },
  // 一覧画面
  {
    path: '/list/',
    componentUrl: './pages/list.html',
  },
  // Default route (404 page). MUST BE THE LAST
  {
    path: '(.*)',
    url: './pages/404.html',
  },
];
```

## まとめ

今回は地図タップアプリの仕様と画面、NCMBの初期化までを解説しました。次は[認証と地図表示を実装します](https://qiita.com/goofmint/items/a50f53e5f201cb307f81)。
別のプログラムがこのフォルダーまたはファイル

```

参考サイト		https://itojisan.xyz/trouble/23209/
		
	「Windowsマーク」を右クリックして、「ファイル名を指定して実行」を選択します。	
		
	「resmon.exe」と入力して「OK」をクリックします。	
		
	リソースモニターが起動したら、ウィンドウ上部にある「CPU」タブを開きます。	
		
	「関連付けられたハンドル」をクリックして展開します。	
		
	「関連付けられたハンドル」の「ハンドルの検索」に、「削除、移動や名前変更できないファイルまたはフォルダの名前」を入力します。	
		
	フォルダ/ファイルが検索されます。検索結果が表示されるまでしばらく待ちます。	
		
	検索結果の一覧の「イメージ」列に、ファイルを使用しているプロセスが表示されます。	
		
	表示されたプロセスを右クリックして「プロセスの終了」を選択します。	
	複数のプロセスが表示されている場合は、全てのプロセスを終了してください。
XAMPPでMySQLが起動しないのが解決した話

以前、「XAMPPでMySQLが起動しないので調べた」[zenn](https://zenn.dev/sakots/articles/445297a2555cd3) / [Qiita](https://qiita.com/sakots/items/9fed733f6c311737f461)
という記事を書いたのですが、これ解決していませんでした。で、今回解決したのでまた記事にしようということで書いております。

## 解決策

### AMPPSをインストールする（使うわけではない）

[AMPPS](https://ampps.com/)です。

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569616/ab317a5f-f228-7ce7-3713-a12c472aba63.png)

これをCドライブ直下にインストールするだけで、xamppのMySQLが安定して起動するようになりました。
AMPPSはインストールするだけで、起動しないで大丈夫です。

## なぜ解決するのか

不明です。MySQLのディレクトリも分かれているので、システム面で何かの上書きがあったものと思われます。

## 蛇足

私としては、[https化したり](https://qiita.com/sutara79/items/21a068494bc3a08a4803)、[phpのバージョンをわりと簡単に変更できたり](https://laraweb.net/environment/7156/)（AMPPSでは有料の機能）で、xamppを使っていたかったのでいい感じの解決策でした。おわり。

コメントその他お待ちしております。
Future interfaceでexceptionをキャッチする

f.get()したときに、ExecutionExceptionが発生する
ExecutionExceptionがsubmit()で発生したExceptionを保有している

```java
class SampleException extends Exception {
    public SampleException(String message) {
        super(message);
    }

    public SampleException() {
    }
}
public class Outer {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService e = Executors.newSingleThreadExecutor();
        Future f = e.submit(() -> {throw new SampleException("exxxxx");});
        e.shutdown();
        try {
            System.out.println(f.get());
        } catch (ExecutionException ex) {
            System.out.println(ex.getMessage());
        }
    }
}
```
```
com.mycompany.mavenproject1.SampleException: exxxxx
```
condaで入れたKATがlibboostが無いとエラーを吐いたらpython3.9下で入れなおすといい

KATのgithub
[https://github.com/TGAC/KAT](リンク)

### 事象

[https://kazumaxneo.hatenablog.com/entry/2018/05/01/134010](リンク)
を参考にKATを走らせようとしたところ、以下のエラーを吐く

    $ kat --version
    kat: error while loading shared libraries: libboost_filesystem.so.1.60.0: cannot open shared object file: No such file or directory


### 環境
linux minicondaのbase python=3.10.8


### 予想

katのversionが2023年1月16日現在の最新(v2.4.2)ではない。
またconda (mamba) で入れる際のboostのデフォルトのversionが1.80.0になっている。
このバージョンの差がエラーの原因ではないか

    $ mamba install -c bioconda kat

      Package      Version  Build            Channel                    Size
    ──────────────────────────────────────────────────────────────────────────
      Install:
    ──────────────────────────────────────────────────────────────────────────
    
      + boost       1.80.0  py310hc4a4660_4  conda-forge/linux-64     Cached
      + boost-cpp   1.80.0  h75c5d50_0       conda-forge/linux-64     Cached
      + jellyfish    0.9.0  py310h5764c6d_2  conda-forge/linux-64       41kB
      + kat          2.0.8  0                bioconda/linux-64        Cached
    
    Summary:

    Install: 4 packages

    Total download: 41kB

    ──────────────────────────────────────────────────────────────────────────


### 対処1. boost-1.60を入れてみ~~る~~ようとした

python3.10下でboost-1.60.0を入れようとするとpython3.5*が要ると言われた

    Could not solve for environment specs
    Encountered problems while solving:
      - package boost-1.60.0-py35_3 requires python 3.5*, but none of the providers can be installed

    The environment can't be solved, aborting the operation
のでおとなしくpython3.5の仮想環境を作りそこで入れてみる

    $ conda create -n py3.5 -y python=3.5
    $ conda activate py3.5
    $ mamba install -c bioconda kat
    
boostとboost-cppはv1.64.0、katは2.3.1が入ってきたがとりあえずそのまま続行
やや古いが一応動くっぽい

    $ kat --version
    kat 2.3.1

### 対処2. katのバージョンを最新に指定する

python3.10下でkatのv2.4.2を入れようとするとpython3.9*が要ると言われた

    $ mamba install -c bioconda kat=2.4.2
    Could not solve for environment specs
    Encountered problems while solving:
      - package kat-2.4.2-py39h7c5ebd6_3 requires python >=3.9,<3.10.0a0, but none of the providers can be installed

    The environment can't be solved, aborting the operation 

のでおとなしくpython3.9の環境でやってみる

    $ conda activate py3.9   # 以前に作ったもの
    $ python --version
    Python 3.9.15

    $ mamba install -c bioconda kat
boost-cppはv1.74.0が、katは2.4.2 が入ってきた
    
    $ kat --version
    kat 2.4.2

無事動くようになったっぽいので動かしてみる

    kat hist -t 8 -l 1 -h 10000 -m 27 -v -o output INPUT.fq
    less output    

    # Title:27-mer spectra for: INPUT.fastq
    # XLabel:27-mer frequency
    # YLabel:# distinct 27-mers
    # Kmer value:27
    # Input 1:/home/usr/INPUT.fq
    ###
    1 XXXXXXXXX
    2 XXXXXXXX
    3 XXXXXXX
    4 XXXXXXX
    5 XXXXXX
    ...

無事動いたのでここまで。

#### 追記

以下のフォーラムによるとboost-1.60.0はanaconda経由なら入れられるらしい
[https://github.com/TGAC/KAT/issues/124](リンク)
【個人開発】キャンプ旅行に持っていくキャンプ道具を共有するアプリ - Camplet - 

# はじめに

初めまして@asaAxisと申します。
この記事は初学者が初めて個人開発したWebアプリの紹介記事です。
Campと旅行のPamphletの意味を込めてCampletという名前にしました。

アプリURL : http://52.69.152.68/
旅行の際にキャンプ道具を共有する 大変さから解放されます!

# 開発の経緯

![開発経緯説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/e485df4f-8432-efa7-05f3-f03eeae416ed.png)

キャンプをやったことがない人でも、
**持っていく道具が多そう... 
何を持って行けば良いの?** とか...

そういった、ことを減らすためにこのアプリを開発しました。
旅行の際にキャンプ道具を共有する大変さから解放される!
をコンセプトに開発をいたしました。

# 開発環境
* Ruby 3.0.1
* Ruby on Rails 6.1.7
* PostgreSOL 14.5

# 主な機能

* **キャンプギア登録機能**
ユーザーが持ってるキャンプギアの登録・確認ができ、物が多くなっても検索ができます。
![スクリーンショット 2023-01-17 13.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/26903b8e-2493-1fba-9866-8a159bb1a91d.png)

* **旅行プラン機能**
行き先、チェックイン、チェックアウトの時間、持ち物リストの登録をすることができます。
![スクリーンショット 2023-01-17 13.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/e8906ea3-4288-7329-252f-9023ca7194e0.png)

* **チャット機能**
メンバー同士で投稿した旅行プランにコメントができます。
![chat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/6685740c-5a9e-9bab-727e-1978e9b593ff.png)

* **持ち物リスト機能**
用意する持ち物を自分が登録してたギアかデフォルトの持ち物で選択し登録できます。
![belongings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/be182df8-7427-8ed9-3f6a-02848550542a.png)

# 実装に苦労したところ
**ネストを使用した値の受け渡しです。**
2回以上ネストをしており、値の受け渡しが上手く出来ずにいました。
![shallow使用しない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/2e123699-4f85-52b0-3334-a16ce73a1506.png)

[railsガイド](https://railsguides.jp/routing.html#%E3%80%8C%E6%B5%85%E3%81%84%E3%80%8D%E3%83%8D%E3%82%B9%E3%83%88 "「浅い」ネスト")を確認し、【2.7.1 ネスティング回数の上限】によると「リソースのネスティングは、ぜひとも1回にとどめて下さい。決して2回以上ネストするべきではありません。」と記述されていました。
![スクリーンショット 2023-01-17 14.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881856/bdc98351-d664-af4b-0bb4-4b87542efcce.png)
そのため、shallowを使用したルートに書き換え、値の受け渡しも変わってくるため、コメント機能を実装する際は特に苦労しましたが実装することができました。

# 最後に
最後までお読みいただきありがとうございます。
至らないところも多かったと思いますが、これからも自分自身を成長させて行けるよう努力いたします。
[Flutter] 今のコードをちょっとよくする（import_sorter編）


![flutter-logo-sharing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/8b435ae9-a7e1-139e-7beb-d9df15a7c6a0.png)


こんにちわ。いせきです。色々あり、なかなか記事が書けませんでした。（コロナになっちゃいました。）
感染力がとても強いなと思いました。（家族全員全滅でした。。。）

まあ、治ったのでかいていきます〜〜〜。


# 使い方

まずは、Packageを入れましょう。

```dart
dev_dependencies:
  flutter_test:
    sdk: flutter
  import_sorter: ^4.6.0
```

今回の場合は、flutterのコード内に`import_sorter`を入れないため、`dev_dependencies`　ました。詳しい説明はこちらで書いています。（見てもらえると嬉しいです。）

https://qiita.com/iseruuuuu/items/123f1f2835af1ffc3423


これで準備は完了です。


# importを整理してみよう

では整理していきましょう。こちらのコマンドを打ってみてください。

```terminal
flutter pub run import_sorter:main
```

### before
```dart
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/physics.dart';
import 'package:flutter/painting.dart';
import 'package:intl/intl.dart';
import 'package:mdi/mdi.dart';
import 'package:provider/provider.dart';
import 'anotherFile.dart';
import 'package:example_app/anotherFile2.dart';
import 'dart:async';
import 'dart:io';
import 'dart:js';
```

### After
```dart
// Dart imports:
import 'dart:async';
import 'dart:io';
import 'dart:js';

// Flutter imports:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:flutter/physics.dart';

// Package imports:
import 'package:intl/intl.dart';
import 'package:mdi/mdi.dart';
import 'package:provider/provider.dart';

// Project imports:
import 'package:example_app/anotherFile2.dart';
import 'anotherFile.dart';

```


このよう感じとなっています。


# 解説

```dart
Dartのimportが入る。
// Dart imports:
import 'dart:async';

Flutterのimportが入る。
// Flutter imports:
import 'package:flutter/material.dart';

Dart packagesが入る。
// Package imports:
import 'package:intl/intl.dart';

作成したファイルの絶対パスor相対パスが入る。
// Project imports:
import 'package:example_app/anotherFile2.dart';

```

# 最後に
「今のコードをちょっとよくする」のシリーズ化ができていますね。僕も一つ書いて終わりかと思いましたが、何とか続けられています。また思いつき次第、たくさん書いて、いつか書籍化？などができた良いですね。

１、今のコードをちょっとよくなった。
２、今のコードをちょっとよくなった。
３、今のコードをちょっとよくなった。

→ めっちゃ良いコードになれた

こうなったら素晴らしいですね！！

僕もこれからもたくさん学んでいきます。
Windows のルーティングについて【忘備録】

# 概要
Windowsでは原則動的ルートをとっているので、
基本エンジニアでもWindows系においてはほとんど触ることがほぼない領域ではあるが、
ネットワークの都合上どうしても静的ルートを追加したり、ルーティングテーブルを出力する必要があったりする。

具体的な操作については参考資料を確認する。


# 参考

https://atmarkit.itmedia.co.jp/ait/articles/0301/11/news003.html

https://windows.command-ref.com/cmd-route.html
AtCoder Beginner Contest 285 C問題解説(Pythonコード付き)

# はじめに　

　本記事はPythonでAtcoderにチャレンジしているけど、Pythonはコード例がないため解説がわかりにくい！と感じている方を対象としています。 
　私自身大してレートも高くないので、不備等あるかもしれませんがご了承くださいm(_ _)m
　質問や指摘などもコメント等に書いてくださったら対応していきたいと考えていますのでどしどしコメントしてください。(内容がわかりにくいぞ！みたいな文句でもオールオッケーです笑)
# AtCoder Beginner Contest 285 [C問題]
　問題のURLはこちらです。[AtCoder Beginner Contest 285](https://atcoder.jp/contests/abc285/tasks/abc285_c)
# 使う手法　
 今問題ではN進数の考え方を利用していきます。　
 N進数とは、あらかじめ定められたN種類の記号や数字を列べることによって数を表す方法です。
 普段私たちが使っている数は、0~9の10個の記号(数字)を用いているため、10進数です。
 今回の入力「S」はアルファベット26文字で作らているため、26進数の数と考えることができます。
 つまり今問題は、**26進数の値を10進数の値に変更してください**という問題に置き換えることができます。
## N進数->10進数への変換　
 一般に、l桁で構成されたN進数の数「L」を10進数の数$L_{10}$に変換する場合

```math
L_{10} = \sum_{k=1}^{n} n_k × N^{i-1}
```
という式で変換することができます。($n_k$は左からk桁目の値を表しています。)
　式だけを見てもなんのこっちゃ？ってなると思うので、10進数の値「365」を用いて説明します。　
　365を桁ごとに分解すると、以下のようになります。

```math
 365 = 3×10^{3-1} + 6×10^{2-1} + 5×10^{1-1}
```
　このように見てみると、左からi番目の桁に書かれている値「ni」は、元々の値(今回の例では365)の中に$10^{i-1}$がいくつあるかを表しているのがわかります。
 
　N進数についても同様のことがいえ、左からi番目の桁に書かれている値「ni」は、元々の値の中に$N^{i-1}$がいくつあるかを表しています。
 従って、全ての桁について上記の操作を行うことで、N進数を10進数に変換することができます。
# 考え方 
 値として並べられているものが全てアルファベットなので、各アルファベットを10進数の値とリンクさせる必要があります。
 今回私はアルファベットが順番に並んでいるリスト「alpha」を作成し、それが格納されているインデックスを用いることで、各アルファベットと数字をリンクさせました。
　あとは先ほど述べた操作を行い、10進数に変換していきます。
# 実装例　
```python
#標準入力
s = input()
#sの長さを取得
n = len(s) 
#最終的に出力する値を設定。初期値は0 
num = 0

#アルファベットを格納するリスト「alpha」を作成。
#その後A、B、・・・・Zまで順番にalphaに格納していく
alpha = []
for i in range(97, 123):
    alpha.append(chr(i).upper())
 
for i in range(n):
　#右からi番目のアルファベットを取り出す
  sub_s = s[i]
　#取り出したアルファベットが格納されているインデックスを調べる
  number = alpha.index(sub_s) + 1
  #取り出した値を足す
  num += number * 26**(n-1-i)
  
print(num)

```
# 最後に　
　N進数の考え方は意外と応用が効くので便利です。
　私は[競プロ典型問題002 Encyclopedia of Parentheses](https://atcoder.jp/contests/typical90/tasks/typical90_b)でも2進数の考え方を応用しました。
　公式解説とは全然解法が違いますが、ぜひ2進数の考え方を用いて解いて見てください。
　(需要がありましたら、こちらについてもコード例を載せてみます。)

# 追記(2023/2/4日)
「最後に」の部分で競プロ典型問題002を2進数の考え方を使ったと書いていますが、正しくは「ビット探索」と言いう探索系のアルゴリズム(?)らしいです。アルゴリズムの点では解説と同じことをしていました。
調子に乗って、公式解説とは違う！と書いていますが、ほとんど公式解説と変わりませんすみません笑
Juliaでライフゲームone - liner

ライフゲームについては既知とします。必要なら[Wikipediaの記事](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0 "ライフゲーム - Wikipedia")を見てください。
# 結論
一世代計算するワンライナーです。
```julia
life(w) = let sz = size(w); let v1 = fill(0, sz[1]-2), v2 = fill(0, sz[2]); [v2'; v1 [w[i-1:i+1, j-1:j+1] .* [1 1 1;1 9 1;1 1 1] |> sum for i in 2:sz[1]-1, j in 2:sz[2]-1] .|> (a -> ((a==3 || a==11 || a==12) && return 1; return 0)) v1; v2'] end end
```
REPLにコピペすれば動きます。`0`が死んでいるセル、`1`が生きているセルを示します。

# 実行例
![スクリーンショット 2023-01-17 15.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113311/2853f23a-618a-d37f-8dff-031a8d1c9b55.png)

# 解説
## 1.`let sz = size(w); ... end`
入力配列の大きさは何回も使うので`let`ブロックで事前定義

## 2.`let v1 = fill(0, sz[1]-2), v2 = fill(0, sz[2]); ... end`
行列をパディングする（後述）時に使う配列

## 3.`w[i-1:i+1, j-1:j+1] .* [1 1 1;1 9 1;1 1 1]`
入力行列から$3 \times 3$の大きさの行列を切り出し、行列
```math
\begin{matrix}
 1&1&1\\
 1&9&1\\
 1&1&1
\end{matrix}
```
との要素ごとの積を取る。

## 4.`|> sum`
3.で求めた行列の要素を足し上げる。つまり畳み込み和（convolution sum）を計算している。

## 5.`for i in 2:sz[1]-1, j in 2:sz[2]-1`
3.、4.の計算を、入力行列の外周を除く要素で行う。

## 6.`.|> (a -> ((a==3 || a==11 || a==12) && return 1; return 0))`
5.の結果できた行列の各要素に対し、次のような関数を適用する。
```
3  -> 1
11 -> 1
12 -> 1
_  -> 0
```
Juliaに`switch/case`式やパターンマッチの構文は無いが、短絡評価する演算子`&&`で似たようなことができる。
行列`[1 1 1;1 9 1;1 1 1]`と、この関数でライフゲームのルールを表現していることになる。

## 7.`[v2'; v1 ... v1; v2']`
これが無いと、入力の大きさ`(m,n)`に対し、出力が`(m-2, n-2)`になってしまう。ので、周辺を`0`でパディングする。（もっとうまい方法がある気がするが...）

# 画像・動画にしたい?
例えば、`Plots.heatmap()`で画像にして、そのまま`Plots`で動画にするのがお手軽で良いんじゃ無いんでしょうか。

# 参考文献
[Conway's Game of Life - APL Wiki](https://aplwiki.com/wiki/Conway%27s_Game_of_Life "Conway's Game of Life - APL Wiki")
LightsailのPythonをアップデート

## 環境
VPS：AWS Lightsail
OS：Debian 11.5
git：2.30.2
## pyenvをダウンロード
```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# pyenvをclone

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
# 環境変数を定義

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
# pyenvの初期化処理を追記

$ exec "$SHELL"
# シェルの再起動
```

## 不足パッケージをインストール
下記は「Ubuntu/Debian/Mint」の例ですが
その他のOSの場合は下記から確認できます。
https://github.com/pyenv/pyenv/wiki
```
$ sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```

## Pythonのインストール
任意のバージョンをインストールしてglobalに設定します。（今回は3.11.1）
```
$ pyenv install 3.11.1
・・・
$ pyenv global 3.11.1
$ python -V
> Python 3.11.1
```
ExecutorService Runnable/Callable

Runnable:no return 
Callable:return
Future interface#get methodでreturnを取得する
 
```java
public class Outer {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService e = Executors.newSingleThreadExecutor();
        Runnable r = () -> {
            System.out.println("runnable");
        };
        Callable<Integer> c = () -> {
            return 1;
        };
        Future f = e.submit(r);
        try {
            System.out.println(f.get());
        } catch (ExecutionException ex) {
            Logger.getLogger(Outer.class.getName()).log(Level.SEVERE, null, ex);
        }
        Future<Integer> f2 = e.submit(r,0);
        try {
            System.out.println(f2.get());
        } catch (ExecutionException ex) {
            Logger.getLogger(Outer.class.getName()).log(Level.SEVERE, null, ex);
        }
        f2 = e.submit(c);
        try {
            System.out.println(f2.get());
        } catch (ExecutionException ex) {
            Logger.getLogger(Outer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
```
```
runnable
null
runnable
0
1
```
form_withのscopeは何をしているのか

## 環境
Rails 5.2

## 内容
form_withのパラメータのscopeはどのような動きをしているのか確認してみました。結論を言うと、scopeを指定すると、ViewからControllerにPOSTするとき、Viewに入力した値が、paramsハッシュにセットされます。

更新処理をするとき、form_withのパラメータには、通常、modelがよく使われます。下記の書き方だけで、newのときは画面に入力した値をcreateメソッドにPOSTで転送し、editのときはupdateメソッドにPUTで転送します。また、editのときは、idがparamsハッシュにセットされるため、コントローラの中でparams[:id]とすると、idの値を取得することができます。

HTTPのどのメソッドを使って転送し、どのコントローラのどこのメソッドに入ってくれるかの判断は、Railsが裏側で自動的に行ってくれます。この辺が、Railsの便利なところでもあり、また、初学者が難しいと感じるところでもあろうかと思います。
```_form.html.slim
form_with model: user
```

ログイン画面など、new→createだけを行い、edit→updateは行わない場合、Viewに入力した値をコントローラに受け渡すには、scopeパラメータを使います。scopeパラメータを使っても、ViewからcreateメソッドへはPOSTで転送されます。更に、paramsハッシュには、sessionというキーでViewに入力した値が全てセットされます。

例えば、Viewの入力項目のnameがpasswordである場合、コントローラの中で、params[:session][:password]とすると、passwordの値が取得できます。
```new.html.slim
form_with scope: :session
```

form_withのurlパラメータは省略しても、ちゃんと、指定のコントローラの中に入ってきてくれます。たぶんですが、Viewがあるフォルダ名とコントローラ名が同じ場合は、urlパラメータは省略しても問題ないようです。後々の可読性のために、明示的に指定しておきたい場合は、指定しても何ら問題はありません。
```routes.rb
get  '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
```
        
```new.html.slim
form_with url: login_path, scope: :session
```
Unity as a Library実装中のビルドエラー

objc[2134]: Class CLSUserDefaults is implemented in both /System/Library/Frameworks/ClassKit.framework/ClassKit (0x1f1815478) and /private/var/containers/Bundle/Application/2B492103-58A1-43EE-8035-726F5419569A/sandbox.app/Frameworks/UnityFramework.framework/UnityFramework (0x11bc08d10). One of the two will be used. Which one is undefined.
warning: UnityFramework was compiled with optimization - stepping may behave oddly; variables may not be available.

Xcodeの
Product > Scheme > EditScheme...　> Run から
Theread Performance Checker のチェックを外すと治りました。
![スクリーンショット 2023-01-17 16.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117011/5fc7f674-d5df-4831-e809-a1739051bb7e.png)
no storyboard/xib was provided ビルドエラー

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no storyboard/xib was provided.'

info.plistの
Launch screen interface file base name
UILaunchStoryboardName~iphone
UILaunchStoryboardName~ipod
の値が実際のプロジェクトの中のstoryboard名前と違うのが原因です。名前を変更すると直りました。
Oracle Analytics Cloud Classic： DashboardページにDataVisualizationのワークブックを貼り付ける

はじめに
---
Oracle Analytics Cloud Classic： Dashboardページに、DataVisualization(DV)のワークブックを貼り付けることができます
方法は至ってシンプルです。Dashboardページに、ワークブックをドラッグ＆ドロップするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b60026b7-0e6d-0894-8a3d-5393315ac0bf.png)


記事記載時のOAC ver：Nov 2022 Update

前提
---
・OAC Classicでダッシュボードの編集をしたことがある
・空のダッシュボードがある、作成できる
・DataVisualizationで作成したワークブックがある


Dashboardに、DataVisualizationのワークブックを貼り付ける
---
空のダッシュボードページを開きます。
まず、OAC Classicにアクセスします。右上部の・・・メニューをクリックし、クラシック・ホームを開くをクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/cd610b04-f66c-d2ea-d9d4-f3604870eeda.png)

上部のメニュー”ダッシュボード”をクリックします。マイ・ダッシュボードをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/901ccd16-0094-de1d-3737-2dce80d12c26.png)

空ページの場合は、以下のように表示されますので、編集をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f0539c81-ead0-fa75-f52c-04dfeef349fe.png)

左下部のカタログのところで、保存しているDataVisualizationのワークブックにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ed5606cb-c5f2-b68d-1174-58349cb6403d.png)

ドラッグして、右の「コンテンツをここにドロップ」のところにドロップします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7d4f95a0-394b-41b3-e17d-055e4dc31224.png)

ドロップしたDataVisualizationの枠で、右上部にマウスを移動すると図のようなプロパティが表示されますので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3e03bd25-227f-1c0e-3af9-d1ab6ddc98a0.png)

表示されるメニューで、サイズの設定をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0e28e55e-918b-2c46-06f6-1e92b78906ef.png)

DataVisualizationのワークブックが表示されるサイズです。小さく設定されているので、適宜、値を入力します。幅1000px、高さ600pxなど。OKをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/dfda64cf-2628-73bc-40ed-43151a1a7826.png)

保存します。右上部のメニューで、保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/603eb0e1-fdeb-f3fb-d5c3-4d9f2306cdf4.png)

実行結果を確認します。実行をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/e421952b-12d7-5cbc-2ed2-7e9f476f650c.png)

DataVisualizationのワークブックがDashboardに貼り付けられました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0acb6037-5ef3-12e9-0df7-461743a8acdd.png)

Dashboardに貼り付けることによって、DataVisualizationで作成したワークブックを他人と共有したり、ClassicのAnswersで作成した分析と同じページで一括して参照したり、できるようになり、表現方法が増します。

以上
ネットワークの障害を分析する

# 障害を分析する順序
ネットワークに障害が発生したときは、```OSI参照モデルの物理層から上に向かって、順に状態を確認```する。

# 物理層の確認
```NIC```が正常にリンクアップしているかどうか、物理層を確認します。
リンクアップしていなければNICや接続しているスイッチのポート、LANケーブルの障害を疑います。

### リンクアップとは
リンクアップとは、コンピュータや通信機器（および内部のポートやコネクタ、アダプタ）がケーブルや無線などで別の装置と接続され、```通信可能な状態```になること。また、そのような状態。

物理的に電気信号や電波の送受信が可能な状態か、いわゆる```データリンク層（リンク層/第2層）の通信規格に則ってフレームやデータグラムといった基礎的な送受信単位での通信が可能な状態```を指す。
一般的には後者を意味することが多い。

一方、相手方との通信が途絶すること、または通信が```不可能な状態のことは「リンクダウン」（link-down）```という。語順を入れ替えた「アップリンク」（uplink）は意味が異なり、無線通信における端末→基地局方向（衛星通信の場合は地上局→衛星方向）のことを意味する

#### 出典
https://e-words.jp/w/%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97.html

# データリンク層の確認
リンクアップしていればデータリンク層の障害を疑います。

デフォルトゲートウェイからに```ping```を打ち、リプライがなかったら```arp```でデフォルトゲートウェイのMACアドレスを認識しているかを確認します。

MACアドレスを認識できていれば、デフォルトゲートウェイで通信を拒否されていないかを確認する。
また確認できなければ、スイッチに何か問題がある。

# ネットワーク層の確認
デフォルトゲートウェイからリプライが返ってきたら、ネットワーク層の障害を疑う。
デフォルトゲートウェイから先にあるネットワークのIPアドレスに対して```ping```を打ちます。

リプライがなかったら```trasert```を利用して、どこまで経路を確保できているかを確認します。
```trasert```のリプライがなくなったところに、何らかの問題があるとわかる。

# トランスポート層の確認
```tracert(traceroute)```で経路が確保できていたら、トランスポート層の障害を疑う。
トランスポート層の生涯で最も多いのが、ファイアウォールのフィルタの設定間違いです。
ファイアウォールで通信を拒否されていないかを確認します。

# レイヤー５〜７の確認
例えば、WebブラウザのようにURLに対してアクセスするようであれば、名前解決できているかどうか```nslookup```で確認し、名前解決できていなければ、 DNSサーバーの障害を疑う。

# 出典
https://www.sbcr.jp/product/4797386660/
「エンジニア歴6年ほど経って得た知見を、惜しみなく公開。技術のトレンドとテクニックを、網羅的に追えます！(有料レベル)」について

## 対象の記事
https://qiita.com/joer/items/e579d3e4b35e88868996

(魚拓：<https://megalodon.jp/2023-0117-1550-00/https://qiita.com:443/joer/items/e579d3e4b35e88868996>)

## 改訂履歴
* 2023/01/25: コミュニティガイドラインに沿わせる改訂

## 経緯
Twitterで流れてきたので見た。

## 感想
* 「1. Testing Trophyを意識して、フロントエンドのテストを書きましょう」[^2]について、挿入されている画像が著作権法上要請される引用の要件を満たせていない恐れがある。出典を示すべき。
* 「16. ChatGPTを多用しましょう」[^2]について、生成されたコードの基となるオリジナルのコードは、LGPLやGPLなどコピーレフトなライセンスが適用されたコードが出力される危険性が否めないので不適切。
    * GitHub Copilotの[Businessプラン](https://docs.github.com/en/enterprise-cloud@latest/copilot/overview-of-github-copilot/about-github-copilot-for-business)のほうが安全性が高い。既存コードと150文字以上一致するコードが出力に含まれないことが保証される。
* 「18. nullかundefinedか」[^2]について[TypeScriptの公式wiki](https://github.com/microsoft/TypeScript-wiki/blob/main/Coding-guidelines.md)を参照しているが、当該ページの冒頭には
    > These are Coding Guidelines for Contributors to TypeScript. This is NOT a prescriptive guideline for the TypeScript community. These guidelines are meant for contributors to the TypeScript project's codebase.
    > -- [^3]
    
    と書かれている。これはあくまでもtsc[^1]など、TypeScript自身のコーディングルールを記述したページであり、TypeScriptの公式な言語スタイルがTypeScriptを採用するすべてのプロジェクトにおいて`null`より`undefined`を使うことを推奨していると解釈するのは誤り。
* レガシーコードをリファクタリングしていた私の意見からすると早期`return`だけが「リーダブルコード」の要素ではない (参考: 『[リーダブルコード](https://www.amazon.co.jp/dp/4873115655)』―より良いコードを書くためのシンプルで実践的なテクニック)。リーダブルコード=早期returnと読めるような断定的な文は誤り。
* 「28. JWTのトークンのハンドリングに関して」[^2]について：
    * 「最初の認証時にGETしたJWTのトークンをlocalstorageに保存し」[^2]：[`window.localStorage`](https://developer.mozilla.org/ja/docs/Web/API/Window/localStorage)に保存するべきではない。`httpOnly`属性と`secure`属性 (と、`domain`及び`path`属性) が付いたCookieに保存するべきである。
        * 一部の記事はXSSが起きれば全て無力なのでどの方法でもいいと主張している。しかし、それはそもそも「XSSを起こすようなコードを書かない」という大原則を守っていれば起きないのでここではないものとして考える。
    * 「そのトークンのプロパティに期限を扱うexpirationのようなものがある」[^2]：
        * 確かに、`exp`クレームは[RFC 7519 § 4.1.4](https://www.rfc-editor.org/rfc/rfc7519#section-4.1.4)で規定されているが、規格上は必須ではない：
            > Applications using JWTs **should** define which
   specific claims they use and when they are required or optional.
        * あくまでも相互運用性のために定められているものである [\[RFC 7519 § 4.1\]](https://www.rfc-editor.org/rfc/rfc7519#section-4.1)：
            > None of the claims
   defined below are intended to be mandatory to use or implement in all
   cases, but rather they provide a starting point for a set of useful,
   interoperable claims.

[^1]: TypeScriptのコンパイラ
[^2]: 出典：https://qiita.com/joer/items/e579d3e4b35e88868996
[^3]: 出典：https://github.com/microsoft/TypeScript-wiki/blob/main/Coding-guidelines.md