OmniAICreator/Qiita-1.07M huggingface dataset:
Monaca用Framework7テンプレートのアップデート

最近、MonacaアプリをFramework7を利用して作るようになっています。Framework7はOnsen UIやIonic FrameworkのようなUIフレームワークであり、コンポーネントが多種多様なのが特徴です。

Monacaアプリでも手軽にFramework7を使えるようにhttps://github.com/NCMBMania/MonacaFramework7Baseを用意していますが、開発する中で徐々にFramework7のバージョンが古くなっていきます。その際のアップデート方法について紹介します。

## 現状の確認

現在はすでにバージョンアップしているのですが、その前の状態ではじめたとします。

```
$ git clone git@github.com:NCMBMania/MonacaFramework7Base.git YOUR_MONACA_APP
$ cd YOUR_MONACA_APP
$ npm install
```

この状態で、古いバージョンがあるか確認します。

```
% npm outdated 
Package     Current  Wanted  Latest  Location                 Depended by
dom7          3.0.0   3.0.0   4.0.6  node_modules/dom7        MonacaFramework7Base
framework7    7.1.1   7.1.5   7.1.5  node_modules/framework7  MonacaFramework7Base
swiper        8.4.5   8.4.7   9.0.3  node_modules/swiper      MonacaFramework7Base
```

このようにFramework7のバージョンが若干古くなっているのが分かります。

## Framework7の更新

`npm update` でライブラリを更新します。

```
% npm update  

changed 18 packages, and audited 698 packages in 11s

89 packages are looking for funding
  run `npm fund` for details

7 vulnerabilities (5 moderate, 2 high)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
```

更新したら、再度古いバージョンがないか確認します。

```
% npm outdated
Package  Current  Wanted  Latest  Location             Depended by
dom7       3.0.0   3.0.0   4.0.6  node_modules/dom7    MonacaFramework7Base
swiper     8.4.7   8.4.7   9.0.3  node_modules/swiper  MonacaFramework7Base
```

dom7やswiperが残っているのは、Framework7が各ライブラリのメジャーアップデートに対応していないためと考えられます。

## Monacaアプリに反映する

この状態では、 `node_modules` 以下のFramework7がバージョンアップしただけなので、Monacaアプリ側（www以下）にも反映します。

```
% npm run update-f7    

> framework7-tab-view@1.2.0 update-f7
> npm run copy-f7 && npm run copy-f7-font

> framework7-tab-view@1.2.0 copy-f7
> cp node_modules/framework7/*.js node_modules/framework7/*.css ./www/framework7/

> framework7-tab-view@1.2.0 copy-f7-font
> cp ./node_modules/framework7-icons/fonts/*.* ./www/fonts/
```

## バージョンを確認する

`www/framework7/framework7.js` の最初にFramework7のバージョンが書かれているので、確認します。

```jsx
/**
 * Framework7 7.1.5
 * Full featured mobile HTML framework for building iOS & Android apps
 * https://framework7.io/
 *
 * Copyright 2014-2023 Vladimir Kharlampidi
 *
 * Released under the MIT License
 *
 * Released on: February 2, 2023
 */
```

バージョンが更新されていれば問題ありません。

## 注意点

今回はマイナーバージョンのアップデートなので、まず問題はありません。しかし、バージョン8系になったりすると、後方互換性がないアップデートが行われる可能性もあるので注意してください。

Gitなどでバージョン管理した上で、アップデート後に不具合があれば戻せるようにしてください。

## まとめ

Framework7は開発が活発で、バージョンアップが頻繁に行われます。それらはセキュリティ的な問題に対応するものもあるので、なるべく追従した方が良いでしょう。コマンドを数回実行するだけで完了しますので、Framework7プロジェクトを最新状態に保つのに役立ててください。

[NCMBMania/MonacaFramework7Base: Monaca × Framework7 × NCMBのベースアプリです。](https://github.com/NCMBMania/MonacaFramework7Base)
laravel マイグレーションを作る


# マイグレーションファイルのみ作成
```php
# マイグレーションファイルの生成
php artisan make:migration <ファイル名> -create=<テーブル名>

// 作成例
php artisan make:migration create_create_target_users_table --table=target_users
//成功すると、マイグレーションファイルが database/migrations/ の直下に作成されます。
```
# マイグレーションファイルの編集
```php
    public function up()
    {
        Schema::create('target_users', function (Blueprint $table) {
            $table->id();
            $table->string('name')->nullable()->comment('氏名');
            $table->uuid('uuid')->comment('UUID');
            $table->string('email')->uniqe()->comment('メールアドレス');
            $table->timestamps();
        });
    }
```
```php
//固定長文字列型(char)
$table->char('hello', 20)
//可変長文字列型(varchar)
$table->string('hello')
//整数型(int)
$table->integer('hello')
//日時型(datetime)
$table->dateTime('hello')
//タイムスタンプ型(timestamp)
$table->timestamp ('hello')
//※雛形に最初から記述されている$table->timestamps()とは異なります。
//$table->timestamps()はテーブルに登録日時と更新日時を記録するカラムを追加するための定義です。
```
# マイグレーション実行
```php
php artisan migrate
```
Laravel Bootstrap（Viteでの使用）／新規追加機能


https://bootstrap-guide.com/getting-started/vite

```php
npm install
npm install vite
npm install bootstrap @popperjs/core
npm install sass
```

``` プロジェクト構造.
my-project/
├── src/
│   ├── js/
│   │   └── main.js
│   └── scss/
│   │   └── styles.scss
│   └── index.html
├── package-lock.json
├── package.json
└── vite.config.js
```

```scss/styles.scss
// BootstrapのCSSをすべてインポート
@import "~bootstrap/scss/bootstrap";
```

``` js/main.js
// カスタムCSSをインポート
import '../scss/styles.scss'
// BootstrapのJSをすべてインポート
import * as bootstrap from 'bootstrap'
```

```vite.config.js
const path = require('path')
export default {
  root: path.resolve(__dirname, 'src'),
  resolve: {
    alias: {
      '~bootstrap': path.resolve(__dirname, 'node_modules/bootstrap'),
    }
  },
  server: {
    port: 8080,
    hot: true
  }
}
```
Laravel 9ページネーションによる列のソート


# 1 : kyslik/column-sortable パッケージのインストール
```php
composer require kyslik/column-sortable
```
詳細はgithubへ
https://github.com/Kyslik/column-sortable

# 2: config/app.php

パッケージをインストールしたら、 config/app.phpディレクトリに移動して、サービス プロバイダーとエイリアスを追加する必要があります。次のコードをファイルに追加します。
``` config/app.php
'providers' => [
    Kyslik\ColumnSortable\ColumnSortableServiceProvider::class,
]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/d1c1c45e-7e85-5521-72a2-0a27493c8a3c.png)

3: 次のコマンドでデフォルト設定を公開
```php
php artisan vendor:publish --provider="Kyslik\ColumnSortable\ColumnSortableServiceProvider" --tag="config"
```
config フォルダーに新しいcolumnortable.phpが作成されていることがわかります。必要に応じて、デフォルトの構成をファイルに変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/590d0613-02b9-0aeb-1e60-b73d53355ec4.png)
# 3 モデルに次のコードを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/9071d502-d4bc-abe2-2759-cbbbdda310fa.png)
4 # コントローラーの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/0ddef7c3-039a-51c1-bf50-c3fb340fd09e.png)
#5 resources /view/フォルダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/59f84d30-3417-814f-adda-7fb11435449e.png)

参考サイト
https://laraveltuts.com/laravel-9-sorting-columns-with-pagination/
laravel　テストデータ作成

# １，作成方法１

以下コマンドでテーブル用のSeederを作ります。
```php
php artisan make:seed target_usersSeeder
```

``` seeders\target_usersSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Ramsey\Uuid\Uuid;

class target_usersSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $names = [
            'taro' => '太郎',
            'jiro' => '次郎',
            'takesi' => 'タケシ'
        ];

        foreach ($names as $name_jp => $name_jp) {

            // \App\Models\target_users::create
            DB::table('target_users')->insert([
                'name' => $name_jp,
                'email' => $name_jp .'@example.com',
                'uuid' => Uuid::uuid4(),
                'password' => '$2y$10$92IX'
            ]);
        }
    }
}
```
target_usersSeederの変更が完了したら、DatabaseSeeder.phpに登録してコマンドを実行します。
```DatabaseSeeder.php
    public function run()
    {
        $this->call(target_usersSeeder::class);
    }
```
```php
php artisan migrate:fresh --seed
```

# 2、作成方法2

artisanコマンドからFactoryを作成する
```php
php artisan make:factory TargetUser
```
artisanコマンド実行時にTargetUserを指定したので、$model変数にモデルのTargetUserクラスが指定されています。これで、ModelとFactoryが関連付けとFactoryのdefinitionメソッドを修正する。

```TargetUserFactory.php
<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\TargetUser; //追加
use Ramsey\Uuid\Uuid;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model>
 */
class TargetUserFactory extends Factory
{

    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = TargetUser::class;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'uuid' => Uuid::uuid4(),
        ];
    }

}
```
モデルの方にも必要な記載がります。
```TargetUser.php
    // 変更可能なカラム
    protected $fillable = [
        'name',
        'uuid',
        'email',
        'teams',
        'katagaki',
        'tag',
        'created_at',
        'updated_at'
    ];

```


SeederでFactoryを使用する
```database/seeders/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        App\Models\TargetUser::factory(10)->create();

    }
}
```
Seederを実行して、実際にデータが登録されるか確認します。
```php
php artisan db:seed
```
Rubyのバージョンを管理する方法

# 初めに
今回は、自分が仕事をしてるときに必要だったRubyのバージョン管理方法を紹介してこうと思います
### 本文
まず、バージョン管理ツールの`rbnev`をインストールします
```terminal: rbenvのインストール
brew install rbenv
```
次に、特定のRubyバージョンをインストールするときに必要となる`libyaml`をインストールします
```terminal: libyamlのインストール
brew install libyaml
```
全て終わったら下記のコマンドで適用されてるバージョンを確認しましょう
```terminal: rubyのバージョン確認
ruby -v
```
必要なバージョンではなかった場合は下記のコマンドでインストールすることができます
```terminal: rubyの欲しいバージョンをインストール
rbenv install 3.2.0
```
最後にインストールしてきたバージョンを適用させましょう
```terminal: rubyのバージョン適用
rbenv global 3.2.0
```

### 最後に
今回は備忘録的に書いていきましたが、Rubyを触ったことがない方がAndroid Studioで触るのが初めてという方用に書いてみました
どなたかのお役に立てれば幸いです
テーブルを統合する

# はじめに
テーブルの統合することがあったので、手順を忘れないように記載します。

# 要件
approachesテーブルをinformationsテーブルへ統合する


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [カラム追加する](#カラム追加)
1. [データをコピーする](#データコピー)
1. [テーブルを削除する](#テーブル削除)

<!-- 各チャプター -->
<a id="#カラム追加"></a>
# カラム追加
approachesテーブルにしか存在しないのは以下です。
・mail_address
・facebook
・line

#### マイグレーションファイル作成
マイグレーションファイルを作成して、統合元テーブルにしか存在しないカラムを統合先テーブルに追加する

```
rails g migration add_columns_to_informations
```
#### マイグレーションファイル編集

```
class AddColumnsToInformations < ActiveRecord::Migration[5.2]
  def change
    add_column :influencer_informations, :mail_address, :string
    add_column :influencer_informations, :facebook, :string
    add_column :influencer_informations, :line, :string
  end
end
```

下記のコマンドを叩くと、カラムが作成される。

```
rails db:migrate
```
<a id="#データコピー"></a>
# データコピー
informationsテーブルに【mail_address・facebook・line】カラムが生成されたのを確認してから、approachesテーブルの【mail_address・facebook・line】カラムのデータをコピーする。

#### SQL文でコピー （各カラムごとに作成し実行する）
今回はmail_addressカラムのみ記載します
```
UPDATE informations, approaches 
SET 
 informations.mail_address = approaches.mail_address
WHERE
 informations.influencer_id = approaches.influencer_id
AND
 approaches.mail_address != "";
```
<a id="#テーブル削除"></a>
# テーブル削除
informationsテーブルに【mail_address・facebook・line】にデータが入ったことを確認してから、approachesテーブルを削除する。

#### マイグレーションファイル作成
マイグレーションファイルを作成して、統合元テーブルにしか存在しないカラムを統合先テーブルに追加する

```
rails g migration DropApproaches
```
#### マイグレーションファイル編集
```
class DropApproaches < ActiveRecord::Migration[5.2]
  def change
    drop_table :approaches
  end
end
```
下記のコマンドを叩くと、テーブルが削除される

```
rails db:migrate
```
# まとめ
テーブルを統合するときには、マイグレーションファイルを２つ作成する必要があり、段階を踏んで実行していくことが必要だとわかりました。

# 参考文献
- [【Rails】テーブル削除(drop_table)の注意点！エラー対処法：ActiveRecord::IrreversibleMigration: To avoid mistakes, drop_table is only reversible if given options or a block (can be empty).
](https://prograshi.com/framework/rails/rollback_drop-table_error/)
Laravelの初期設定／日本語化【自己啓発】

# Laravelの初期設定を変更する
・タイムゾーン
・言語
・警告メッセージを日本語にする

# タイムゾーンと言語の変更
```config/app.php 
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'faker_locale' => 'ja_JP',
```

# 日本語にする

方法1

Breezeをインストール。(必要に応じて）
```php
composer require laravel/breeze --dev
php artisan breeze:install --dark
※ダークモードが不要の場合は「--dark」オプション無しで実行
```

Breezejpパッケージのインストール／日本語。
```php
composer require askdkc/breezejp --dev
php artisan breezejp //言語ファイル
```

https://github.com/askdkc/breezejp

方法2　下記はWindows環境では、実行しても日本語化にはなりませんでした。
```php
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```
https://readouble.com/laravel/9.x/ja/validation-php.html
Vantageとクラウド・サービスとの統合に関する記事のインデックス

こんにちは！

Vantageと各クラウドベンダーが提供する様々なサービスとを統合することによりデータ分析がより簡単であったり、より複雑な分析ができたりします。

ここではそんな「Vantageと各クラウド・サービスとを組み合わせて動かしてみた」というタイプの記事をインデックスにしました。
クラウド・サービスでのデータハンドリングに困ったことがある方、でひご参考にされてみてはいかがでしょうか？

|記事タイトル|概要|
|:-|:-|
|[VantageのデータをAmazon QuickSightでビジュアル化してみた](https://qiita.com/ykswi/items/00f62dace2868be7843e)|Amazon QuickSightとVantageでできることとその方法について解説します|
|[Google Vertex AIで作成された分析モデルをVantageでスコアリングする方法](https://qiita.com/ykswi/items/03f82e9097f483c4e9eb)|Google irtex AIで作成されたモデルをBYOM機能を使用してVantageに取り込みスコアリングする方法について解説します|
|[AWS Comprehend MedicalとVantageで医療データの高度な分析をしてみた](https://qiita.com/ykswi/items/0300be164f9a6481ad49)|データをAWS Comprehend Medicalを処理した後、結果をさらにVantageに書き戻してテーブル化する方法について説明します|
|[AWS GlueでVantageへデータを出し入れしてみる](https://qiita.com/ykswi/items/e52f3791009d250a4fe7)|AWS Glueを使用してVantageへのデータ・ロードおよびVantageからデータ・エクスポートする方法を説明します|
|[AWS S3のデータをVantageにロードする](https://qiita.com/ykswi/items/e8c9cafb75f504f9c8cb)|Vantageのネイティブ・ローダであるTPT（Teradata Parallel Transportation）を使用してAWS S3上にデータをエクスポートしたりAWS S3上のデータをロードする方法を説明します|
|[AWS Kinesis Firehoseを使ってS3に蓄えたデータをVantageにロードしてみた](https://qiita.com/ykswi/items/dfb5cab20d67ba5dd971)|ソース・データをAWS Kinesis firehose経由でAWS S3にデータを流しAWS Glue ETLジョブでJSON形式に変換し、Teradata NOSを使用してS3からデータにアクセスする手順について説明します|
|[VantageのデータをAWS SageMakerでの機械学習に使用してみた](https://qiita.com/ykswi/items/2479c466d593fe1d50e0)|Vantage上のデータをS3環境に提供しSageMakerでモデル開発行い、さらにSageMakerによるその後のスコアリングのためにS3経由でVantage上のデータを利用できるようにする方法を説明します|
|[Amazon SageMakerで作成したモデルをVantageで推論（スコアリング）してみた](https://qiita.com/ykswi/items/e1e87476c25cffc22bfa)|VantageのBYOM（Bring Your Own Model）機能を使用してVantageにモデルを取り込み → Vantageで高速推論を行う方法を取り上げます|
|[Amazon Managed Kafka (MSK) Data StreamsとAWS Glue Streaming ETLを用いたVantageへのデータのストリーミング配信](https://qiita.com/ykswi/items/ab424f8d9a9685363514)|Amazon MSKとStreaming ETLを使用してVantageにデータをストリーミング配信し格納させる方法について説明します|
|[Teradata Access Module for AzureでAzure Blob Storageにデータの読み書きをしてみる](https://qiita.com/ykswi/items/6a508a2e741d564be012)|Vantageのネイティブ・ローダであるTPT（Teradata Parallel Transportation）を使用してAzure BLOB上にデータをエクスポートしたりAWS S3上のデータをロードする方法を説明します|
|[Amazon Kinesis Data Streams (KDS)とAWS Glue Streaming ETLを用いたVantageへのデータストリーミング](https://qiita.com/ykswi/items/6aaa5d855753756d6573)|Amazon KDSとStreaming ETLを使用してVantageにデータをストリーミング配信し格納させる方法について説明します|
|[AWS AppFlowを使ってS3におとしたデータをVantageで読み取ってみる](https://qiita.com/ykswi/items/d3d5fe823a5c72dc3340)|SlackからAWS AppFlow経由でAWS S3にデータを転送し、Teradata Vantage Native Object Store（NOS）を使用してS3内のデータにアクセスする手順を説明します|
|[VantageでAzure Blob Storageに接続してJSONファイルのデータを検索してみる](https://qiita.com/ykswi/items/d462dc6a47bd9ef6c646)|VantageのNative Object Store（NOS）機能を使用して、膨大な量の半構造化または非構造化データを保管できるMicrosoft Azure Blob Storage上のJSONファイルにクエリを実行します|
|[Azure Data Factoryで取得したSalesforceデータにVantageでアクセスしてみた](https://qiita.com/ykswi/items/676f149ab8f58439f036)|Salesforceから顧客情報を取得しVantageからの注文および出荷情報と組み合わせてさらに分析を行うためのプロセスについて説明します|

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
Three.jsで動画テクスチャの切り替える際に必要だったこと

# 概要
Three.jsで`HTMLVideoElement`をThree.js空間の特定のオブジェクトのテクスチャとして扱う際に複数の動画を任意のタイミングで切り替える際に切り替え時に稀に動画再生がされない問題に悩まされたので、対策として有効だったことを備忘録として記します。(検証端末:モバイルブラウザ(Android Chrome1049, iOS Safari))

# Three.js空間上で不必要になったインスタンスの解放処理
Three.jsで作成したインスタンスは自動的には解放されないので、明示的に解放処理を入れてください。
私の場合は、動画の切り替えの際に前回の動画を貼り付けているテクスチャに対してThree.jsの[texture.dispose()](https://threejs.org/docs/#api/en/textures/Texture.dispose)することで対処しました。これをしない場合、iOS Safariで`WebGL context lost`エラーに苦しめられました。

# HTMLVideoElementの`preload`属性を設定
結論からいうと以下のようにHTMLVideoElementの`preload`属性を`metadata`に設定してください。
```javascript
const videoElement: HTMLVideoElement = document.createElement('video')
videoElement.preload = 'metadata'
```
HTMLVideoElementの`preload`属性には`none`|`metadata`|`auto`の3つがあります。この`preload`属性は、HTMLが読み込まれた場合に動画がデータをどこまで読み込むかの設定になります。`preload`属性を何も設定しない場合は、`auto`が設定され可能な限り複数の動画のプリロード時に[HTMLVideoElement.play()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play)が実行できるように読み込みがされるようです。`metadata`に設定された場合は、動画のサイズ、トラックリスト、再生時間をプリロードするようです。また、`none`に設定された場合は、プリロードがされず動画再生のタイミングで全ての動画データを読み込むようです。
今回のように複数動画がある場合に`auto`を設定すると以下のようにエラーが発生します。
```console
video MEDIA_ERR_DECODE occurs randomly
```
HTML5の仕様書によるとこのエラーは`メディアリソースが使用可能であることが確認された後、メディアリソースをデコードする際に何らかのエラーが発生した。`場合に発生するようです。([エラー詳細](https://html.spec.whatwg.org/multipage/media.html#error-codes))
# HTMLVideoElementのリソースの解放処理
ブラウザ上で動画を複数扱う場合は、以下のように前回の動画リソースを削除することが[推奨](https://momdo.github.io/html/media.html#best-practices-for-authors-using-media-elements)されています。具体的には、以下のようにしてください。
```typescript
const videoElement: HTMLVideoElement = document.createElement('video')
videoElement.src = 'prevVideoSource'
...// 何らかの処理
// 前回の動画が必要無くなったタイミングでリソースの解放処理をする
videoElement.src = '' 
// 今回使う動画リソースの登録
videoElement.src = 'currentVideoSource'
```

# おわりに
最近は、重いコンテンツのWebアプリを作る機会が増えてきたこともあり、今回のようにブラウザでも解放処理が必要だったりと面白いですね。
【Swift】Lazy Propertiesについて、AIに聞いてみた

## 今回書いたきっかけ
自分のなんとなく使ってるものについて、誰かに聞こうと思ったけど上司がいない！！
ので、AIに教えてもらいました。

## AIに指示出し
わかりやすく、簡潔に指示を出す
主は英語ができないので日本語で指示出しをした。
```
SwiftのLazy Propertiesについて、コードを用いて説明してください
```
## AIからの返答
SwiftのLazy Propertiesは、必要になるまで初期化されないプロパティです。
これは、初期化することによって処理に多くの時間がかかるような大きなプロパティの場合に特に便利です。
Lazy Propertiesは、以下のように宣言します：

```Swift
class MyClass {
    lazy var heavyComputation: Int = {
        // ここで重い処理を行う
        return 42
    }()
}
```

## 結論
View生成時に重くなり画面遷移に支障がある場合に使うのが良さそうですね。
さすがAI。Swift歴4年目の俺よりわかりやすい説明をする、、、

## 最後に
iOSアプリ開発をしています。
主にSwiftですが、最近は熱が入ってきてFlutterも🦾
色々やってます。もし良かったら見てってください。

https://sogablog.net/

・面白いのでやってみてね

https://chat.openai.com/chat
Testlink でテストケースを編集中に内容が見えなくなった

Testlink 1.9.9
Chrome で編集

Testlink Testcaseを編集中に編集画面が消えて、以降このテストケースが表示されなくなった。
テスト実行画面からもなにも表示されない。

:::note alert
コピペで発生するようです。
:::


# こうなった場合の対処方法。

Testlink DB のデータ構造は壊れていないと思われる。

表示されない状態で「フレームのソースを表示」させてみると、テストケースの内容を表示しようとはしているが、表示できない状態になっている。

tsteps Table （実行ステップと期待結果が格納されている場所）の欄の中身がおかしい。

末尾に、以下のコードが入っている

```.html
	&nbsp;</p>
<body id="cke_pastebin" style="position: absolute; top: 96px; width: 1px; height: 1px; overflow: hidden; left: -1000px;">

<p>
    テストステップ・期待結果
</p>

</body>
```

HTMLの overflow;hidden は指定サイズをはみ出した場合は表示されないという意味で、サイズが 1x1 なので
1ドットの点で表示、はみ出た部分は表示しないということになり、画面にはなにも表示されない状態になったと思われる。

    width: 1px; height: 1px; overflow: hidden; 

# 問題がある場所の調べ方：

phpMyAdmin を使うと便利です。
手順中の数値は一例です。

* まず外部IDを特定します（外部IDはプロジェクト毎に順にテストケースに付与されます）
* テストケースのタイトルを確認します(これは見えているはず)

    Testcase: Test-134_No5-2-8_Teatcase_Sample

* この例では、テストケースの外部IDは 134
* PhpMyAdmin のSQLで
 
    SELECT * FROM `tcversions` WHERE `tc_external_id`=134　

の結果を見る

* 複数表示される中で、テストケースの Summary が一致するもののIDを記録する。> 50188
これがテストケースの内部IDで Testlink 全体でユニークな値になります
結果のTimeStamp (creation_ts または modification_ts) でソートして最近の更新のものが怪しいです
* 次に

    SELECT * FROM `nodes_hierarchy` WHERE `parent_id`=50188 

の結果を見る > ID=51056

* testCase の手順と期待結果が格納されているテーブルから上記IDを検索する。

    SELECT * FROM `tcsteps` WHERE `id`=51056

* 結果を「編集」し expected result を確認。後半にゴミが残っているので削除する。

下記から、```<body ... から　</boby>``` まで、まるごと削除する

```
<body id="cke_pastebin" style="position: absolute; top: 120px; width: 1px; height: 1px; overflow: hidden; left: -1000px;">

<p>
    テストステップ・期待結果
</p>

</body>
```

編集した内容（テストステップ・期待結果）はこの expected result フィールドの上の方にも通常のテキストとして入っています。

:::note info
他のテキストからコピペするときに HTML コードが紛れ込んでしまうようです。
Testlink 編集時は、貼り付け時に、「プレーンテキストとして貼り付ける」でペーストすればテストが不可視になることはありません。
:::



# 要約、前提条件を修正して見えなくなった場合

下記で外部ID指定で表示されれるものを直接編集する。

    SELECT * FROM `tcversions` WHERE `tc_external_id`=XXX


[TestlinkのDB構造](https://qiita.com/s_hanzawa/items/24d6aa50300e66ad23a5) ←参照
AWS WAFで海外からのアクセスのみルールを適用する

# やりたいこと
海外からのアクセスのみWAFのルールを適用する
言い換えると
日本からのアクセスは通信を通すようにする

# なぜやるか
アプリケーション内での検索クエリがsqlインジェクションルールに引っかかり弾かれてしまった
sqlインジェクションルールの詳細がブラックボックスになっているため、
穴を開ける形を取らないといけなくなった。
国内限定で使うアプリケーションなので海外からのアクセスにのみWAFを適用することにした。

# 前提
今回適用するルールは
- 日本からの通信か(allow)
- sqlインジェクション(block)
- レートベースルール(block)

albにアタッチするところまではやらない
# コード
```main.tf
#----------------------------
# WAF ACL
#----------------------------
resource "aws_wafv2_web_acl" "main" {
  name  = "${var.app_name}-WebACL"
  description = "${var.app_name}-WebACL"
  scope = "REGIONAL"

  default_action {
    allow {}
  }

  # 日本からの通信に関しては通信を通し、日本以外からのアクセスは後続のルールが適用される
  rule {
    name     = "allowJpRule"
    priority = 0

    action {
      allow {}
    }
    statement {
      geo_match_statement {
        country_codes = ["JP"]
      }
    }
    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "allowJpRuleMetric"
      sampled_requests_enabled   = false
    }
  }

  #DDoS攻撃に対するルール(5分間あたりのlimit(閾値)を超えた場合にblockする)
  rule {
    name     = "AWSRateBasedRule"
    priority = 10

    action {
      block {}
    }

    statement {
      rate_based_statement {
        limit = 300
        aggregate_key_type = "IP"
      }
    }
    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "AWSRateBasedRuleWAFMetric"
      sampled_requests_enabled   = false
    }
  }

  #SQLインジェクション攻撃に対するルール
  rule {
    name     = "AWSManagedRulesSQLiRuleSet"
    priority = 20

    override_action {
      none {}
    }

    statement {
      managed_rule_group_statement {
        name        = "AWSManagedRulesSQLiRuleSet"
        vendor_name = "AWS"
      }
    }
    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "AWSManagedRulesSQLiRuleSetWAFMetric"
      sampled_requests_enabled   = false
    }
  }

  visibility_config {
    cloudwatch_metrics_enabled = true
    metric_name                = "${var.app_name}-WebACL"
    sampled_requests_enabled   = false
  }
}

```

## ポイント
```.tf
# 日本からの通信に関しては通信を通し、日本以外からのアクセスは後続のルールが適用される
  rule {
    name     = "allowJpRule"
    priority = 0

    action {
      allow {}
    }
    statement {
      geo_match_statement {
        country_codes = ["JP"]
      }
    }
    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "allowJpRuleMetric"
      sampled_requests_enabled   = false
    }
  }
```

> priority = 0

こうすることで一番最初に実行される
> action {
> 　allow {}
> }

こうすることで通信を通すということになるので
JPからのアクセスは後続のルールを適用せずに通信を通すということができる。

# 補足
ルール内で追加の条件を書くこともできるが
terraformが`and_statement`や`or_statement`内での
`rate_based_statement` `managed_rule_group_statement`をサポートしていなかったため(2022/02/07)
別でルールを適用する必要があった。
ので
今回のような形になった。

# 素朴な疑問
これ作ってみて思ったことは、

国内限定で使用することが前提のアプリケーションの場合
海外からのアクセスは完全に断ち切ればいいのでは?
金額も安く済みますし😅

と思いました。
何かデメリットとかるのでしょうかね。
パラメータストアからの値の取得でハマった件


# Lambda Extension
Lambdaで処理を行う際に、将来変更が予測される値をパラメータストアにセットされていて、そこから値を取得するケースは良くあると思います
今年の10月にAWSから[Lambda　Extension](https://aws.amazon.com/jp/blogs/compute/using-the-aws-parameter-and-secrets-lambda-extension-to-cache-parameters-and-secrets/)が発表され、SDKを使わずに、このLambda Extensionを使う方が多くなっているのではないでしょうか

# ハマったところ
`/` のエンコードです
パラメータストアの名称は `/` で階層化組織化を行っているかと思います
Lambda Extensionは、httpでリクエストを飛ばすので、パラメータストア名にもエンコードが必要となります
ただ、`/`は普通にUrlの区切り文字ですので、一工夫必要となりました

```example.py
from urllib.parse import quote

param = "/Top/Middle/param_name"
quote(param, safe='')
# '%2FTop%2FMiddle%2Fparam_name'
```

といった感じで、quoteのパラメータに `safe=''` が必要となります

公式の[ドキュメント](https://docs.aws.amazon.com/systems-manager/latest/userguide/ps-integration-lambda-extensions.html)に、[Sample](https://docs.aws.amazon.com/systems-manager/latest/userguide/ps-integration-lambda-extensions.html#ps-integration-lambda-extensions-sample-commands)があり、そちらはエンコードされた値を使っていました
PyCaretのevaluate_model()実行時にフォントエラーとなる場合の対処方法

手持ちのデータセットを用いてPyCaretで機械学習モデルの比較検討を行い、evaluate_model()関数を実行すると以下の様なエラー表示が連発します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/70a3eabd-b6e8-7bf8-8d57-241a35659e1f.png)

```bash:エラー文(抜粋)
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial, Liberation Sans, Bitstream Vera Sans, sans-serif
```

# 対処方法
`japanize-matplotlib`をインストールします。これは元々`matplotlib`を手軽に日本語表示に対応させるためのライブラリです。

```bash
pip install japanize-matplotlib
```

ここから注意が必要です。それは<font color="RED">**importの順番です**</font>。Pep8には違反してしまいますが、japanize-matplotlibをPyCaretより<font color="RED">**後にimport**</font>しないと有効になりません。

以下の様にPep8準拠のimport順序では、上記のエラーが表示されます。

```python:Pep8準拠のimport順では対処できない
import japanize-matplotlib

from pycaret.classification import *
```

以下の順番でimportします。flake8などが実行される環境ではエラー出力されないように`# noqa`を追記すると良いでしょう。

```python:正しいimport方法
from pycaret.classification import *

import japanize-matplotlib
```

このエラーメッセージをインターネットで検索すると十中八九Matplotlibのエラー対処として出てきます。PyCaretも内部でMatplotlibを呼んでいるため、これはどうやらMatplotlibのエラーが出ているのだと思われます。
【データ検証/BigQuery】SQLでのデータ検証について

# 今回の課題
自社でSQLのテストを行っていなかったため、
SQLで抽出するデータが正しいかテストする方法について調べてみた。

[データ検証の方法](https://plazma.red/user_engagement/howto/0115)という記事を参考に解釈したことをまとめた。

## 制約の検証
### UNIQUE制約
指定したカラムに、ユニークな値が格納されているかどうか確認できる。
ユニークな値が入っていれば`true`が出力される。
```SQL
select
    count(*) = count(distinct [ユニークな値が入っているか確認したいカラム] as check 
from
    `テーブル名`
```


### NOT NULL制約
指定したカラムに、NULLの存在の有無を確認できる。
NULLが存在しなければ、`true`と出力される。
```sql
select
    count(*) = 0 as check 
from
    `テーブル名`
where
    [nullの有無を確認したいカラム] is null
```

### CHECK制約
指定したカラムに、指定した値以外が格納されていないかを確認できる。
指定した値（下記で言うと「PC」又は「SP」）以外が含まれていなければ、`true`が出力される。
```sql
select
    count(*) = 0 as check
from
    `テーブル名` 
where
    [指定した値以外含まれていないか確認したいカラム] not in ('PC', 'SP')
```

### FOREIGN KEY制約
外部キーでJOINできなかったレコードが存在しなかったことを確認できる。
JOINできなかったレコードが存在しなかった場合、`true`が出力される。
```sql
select
    count(*) = 0 as check
from
    `テーブル名` as tbl1
    left join `テーブル名` as tbl2
        on tbl1.key = tbl2.key
where
    tbl2 is null
```

## テーブル同士の比較検証
### レコードの突き合わせ
確認したいテーブル同士を相互にEXCEPT演算をして差分を取、完全一致しているかを確認する。
`true`が出力されたら、両テーブルのデータは一致すると分かる。
```sql
with master as (
    select * from `テーブル1` except select * from `テーブル2`
union all
    select * from `テーブル2` except select * from `テーブル1`
)
select 
    count(*) = 0 as check
from
    master
```
### 集計値の比較
#### 1)レコード数を確認する場合の例
レコード数がお互いのテーブルで一致するかを確認する。
一致すれば`true`を出力する。
```sql
select (select count(*) from `テーブル1`) = (select count(*) from `テーブル2) as check
```
#### 2)pageiviewの平均値を確認する場合の例
先週時点から平均値が増加したかを確認する。
平均値が増加していれば、`true`を返す。
```sql
select (select avg(pv) from `今週の値が格納されたテーブル`) > (select avg(pv) from `先週の値が格納されたテーブル`) as check
```

※参考：[データ検証の方法](https://plazma.red/user_engagement/howto/0115)
【React】React+Expressの構成でpostを実行する

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/f858b075-bdb1-9e2c-3ba3-1230793c7979.png)

ReactのApp.tsxからnode+expressで作っている、バックエンドにpostをするイメージです。
バックエンドはMySQLと繋がっています。

## コード
```typescript:App.tsx
  const App = async () => {
    try {
      await axios.post("http://localhost:3100/api", {
        date: "2023/02/07",
        id: 1,
        name: "name",
      });
    } catch (error) {
      console.error("error=" + error);
    }
  };
```

```typescript:index.ts
const express = require("express");
const cors = require("cors");
const app = express();
const mysql = require("mysql2");
require("dotenv").config();

const connection = mysql.createConnection({
  host: process.env.ENDPOINT,
  user: process.env.NAME,
  password: process.env.PASSWORD,
  database: process.env.DBNAME,
});

app.use(express.json()); // for parsing application/json
app.use(express.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded

app.post("/api", (req: any, res: any) => {
  const { date, seat_id, integrated_id } = req.body;
  console.log(date);//2023/02/07
  console.log(id);//1
  console.log(name);//name

  const insertQuery = `INSERT INTO ${process.env.DBNAME}.${process.env.DBTABLE} (date, id, name) VALUES ("${date}",${id}, "${name}");`;

  connection.query(insertQuery, (error: any, results: any) => {
    if (error) {
      throw error;
    }
    res.status(201).send(`added`);
  });
});

app.listen(3100, () => {
  console.log("Server port 3100 started!");
});
```

フロントエンドは`npm start`、バックエンドは`tsnode index.ts`で起動しています。
index.ts内では

```typescript:index.ts
app.use(express.json()); // for parsing application/json
app.use(express.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
```
を追加しないとうまく動きませんでした。
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「グループにおけるアクセス権付与の方法」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「グループにおけるアクセス権付与の方法」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory グループを使用してアプリとリソースへのアクセスを管理する](https://learn.microsoft.com/ja-jp/training/modules/create-users-and-groups-in-azure-active-directory/4-manage-app-resource-access-azure-ad-groups)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADユーザアカウントの追加/削除」](https://qiita.com/fsd-jume/items/1fba86e7f873f3e56400)

## グループにおけるアクセス権付与の方法
**◆直接割り当て**
・必要なアクセス権限を持つロールをユーザに直接割り当てる

**◆グループの割り当て**
・必要なアクセス権限を持つロールをグループに割り当てる
⇒グループ内のメンバーにも権限が継承

**◆ルールベースの割り当て**
・グループメンバーシップルールを用いて、動的にグループ内メンバーを決定
⇒ルールを用いてロールを割り当てるユーザ/デバイスを動的に管理
・例：グループにアクセス許可が付与されたロールが割り当てられている場合
　-ルールを満たしている場合：グループに属するためアクセス権あり
　-ルールを満たしていない場合：グループに属さないためアクセス権なし
・ルールは組み込み/カスタムともに可能

## 次の学習内容
**◆Azure AD B2Bによるゲストユーザアクセス**

https://qiita.com/fsd-jume/items/ac40cb4f222801b2d397

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Curlコマンドで特定回数分のリクエストを送信する

```
$ for i in {1..<回数>}; do curl -s -o /dev/null -w "%{http_code}\n" <URL> ; done
```
特定の回数分リクエストを送信してそのレスポンスステータスを確認する。

-s はcurlからのメッセージを非表示にする
-o /div/null はレスポンスボディを表示しないようにする
-w はレスポンスのステータスコードだけを出力するよう指定
unicyclerによるデータの編集

# 開始
make file
```
conda create -n unicycler
```
```
conda activate unicycler
```

 
#### install [fastp / fastqc / bandage]

```
conda install -c bioconda fastp
```
```
conda install -c bioconda fastqc
```
```
conda install -c bioconda Bandage
```

make directory こっからunicyclerに入っててね
```
mkdir unicycler
```
```
cd unicycler
```
ファイルがgzで圧縮されてるのでそれを解く
```
unicycler$ gunzip G1_S41_L001_R2_001.fastq.gz
unicycler$ gunzip G1_S41_L001_R2_001.fastq.gz
```

#### fastqcで今の状況を見て、トリミングする
```
fastqc
```
・クオリティ25以下は切り捨て
・G1_S41_L001_R1_001.fastq→→→trimG1_S41_L001_R1_001.fastq.gz
　初めの２５と後ろ１０をトリム

・G1_S41_L001_R2_001.fastq→→→trimG1_S41_L001_R2_001.fastq.gz
　初めの２５と後ろの１００をトリム
　
``` 
fastp -i 1_S1_L001_R1_001.fastq.gz -I 1_S1_L001_R2_001.fastq.gz -o trim1_S1_L001_R1_001.fastq.gz  -O trim1_S1_L001_R2_001.fastq.gz -e 30 -q 30 -l 20 -3 -M 30 -T 1 -t 1 
```

### unicyclerのインストール
```
conda install -c bioconda unicycler
```

unicyclerでデータ処理してもらう。それをOutputs1_dirというディレクトリに入れてもらう
```
unicycler -1 trimG1_S41_L001_R1_001.fastq.gz -2 trimG1_S41_L001_R2_001.fastq.gz -o outputs1_dir
```

### Bandageで、つながったか見てみる
```
Bandage
```


# 以上

# いいサイト
https://www.kimoton.com/entry/20181022/1540220238

# chacking gene qality by FASTQC
```
fastqc
```
disccuss which point should be removed
https://olvtools.com/documents/fastqc

# cut bad qality place by Fastp

https://www.kimoton.com/entry/2018/02/25/200817


(this time)
R1_001 cut 1-20,  215-301
R2_001 cut 1-20,  195-301

```
fastp -i G1_S41_L001_R1_001.fastq.gz(fail_name) -I G1_S41_L001_R2_001.fastq.gz \
-o G1_S41_L001_R1_001.fq.gz -O G1_S41_L001_R2_001.fq.gz \
-h report.html -j report.json -q 30 -t 1 -T 1 -l 20 -w 8

```
-3 ：3’側のトリミングを許可
-q ：指定QVを下回ったらカット
-n ：Nを指定数だけ許容
-l ：トリミング後に長さが指定長さ以上なら許容。以下ならそのリードを捨てる
-t ：read1末尾を指定した数だけ削る
-T ：read2末尾を指定した数だけ削る
-w ：CPUのスレッド数
–detect_adapter_for_pe ：ペアエンドの際のadapterトリミング
-i or -I  :  input file
-o or -O  :  output file]
.Net7 ネイティブ出力を試してみた

# 概要
VSCode + C# + .Net 7で自作マスターデータツールをネイティブ出力して実行結果の共有

# 背景
.Net Core3.1で開発していたが2022/12でサポートが切れてしまったので.Net 7に移行
奇数バージョンは18ヶ月サポート(STS)で、偶数バージョンは36ヶ月サポート(LTS)なので
.Net 6を使うか.Net 8が出るまで待つか迷ったが、.Net 7にネイティブ出力機能があったので試してみた

# 環境
Visual Studio Code: 1.74.3 (user setup)
　C# for Visual Studio Code (powered by OmniSharp).：1.25.4
.Net Framework SDK：7.0.2

# ビルド環境
4パターンのビルドを行い、実行ファイルサイズや動作速度を比較する

## .Net Core3.1
```
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true /p:PublishTrimmed=true
```
- シングルEXEファイル
- ユーザーのランタイムインストール不要
- トリミング

## .Net 7 (Core3.1と同じ)
```
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true /p:PublishTrimmed=true
```
- シングルEXEファイル
- ユーザーのランタイムインストール不要
- トリミング

## .Net 7 (トリミングなし)
ビルドコマンド
```
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true
```
- シングルEXEファイル
- ユーザーのランタイムインストール不要

## .Net 7 (ネイティブ)
```
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishAot=true
```
- シングルEXEファイル
- ネイティブEXE
- トリミングは自動的にされるっぽい

# 動作比較
解析Excel数: 414
解析総セル数: 2,624,362

## 個別計測
| | Core3.1 | .Net 7(Coreと同じ) | .Net 7(トリミングなし) | .Net 7(ネイティブ) |
|:-:|:-:|:-:|:-:|:-:|
| Exeサイズ |  43,490KB | 18,708KB  | 71,980KB  | 21,259KB  |
| Excel解析時間  |  2.783秒 |  3.405秒 |  2.583秒 |  1.944秒 |
| バイナリ出力時間  | 0.261秒  | 0.299秒 | 0.183秒  |  0.158秒 |
| C#コード出力時間  | 0.196秒  | 0.204秒  | 0.124秒  | 0.120秒  |
| csv出力時間 |  0.461秒 |  0.546秒 | 0.301秒  | 0.197秒  |
| htmlマニュアル出力時間  | 0.063秒  |  0.064秒 | 0.030秒  | 0.030秒  |
| 総合時間  | 3.896秒  | 4.710秒  | 3.304秒  | 2.468秒  |

## 順位表
| | Core3.1 | .Net 7(Coreと同じ) | .Net 7(トリミングなし) | .Net 7(ネイティブ) |
|:-:|:-:|:-:|:-:|:-:|
| Exeサイズ  | 3位  | **1位**  | 4位  | 2位  |
| 実行速度  |  3位 |  4位 | 2位  | **1位**  |

# 結果
## ネイティブ
総合的にバランスが良いのがネイティブという結果になった
欠点としては、WindowsとLinuxのみでmacOSには非対応ということだ
このツールはWindows、macOS、Linuxの3プラットフォームで提供しているため、macOSだけは別のビルドを使う必要がある

## .Net 7(Coreと同じ) 
ファイルサイズが一番小さいが、実行速度は一番遅い結果となった
.NetCore3.1と同じビルドオプションなのに実行速度が遅くなるのは気になる
.NetCore3.1と比べてファイルサイズが大きく減るのは、OSSもトリミングを行っているからのようだ
【C#】TPL：Parallelによる並列処理

前回Dynamics CRM のExecuteMultipleRequestによる一括処理を調べて、この次は並列処理かな！　と思ったのですが、 そもそもDynamics CRMで並列処理、という前に、並列処理そのものの理解を深めないといけないな、ということで。
# .NET Frameworksによる並列処理
.NET Frameworksでは、並列処理の方法が色々あるみたいです。 バージョンが上がるに従って、いろいろと増えていっているみたいですが、

というか、まず前提として非同期と並列の違いって何よ、というところから始まったので、ちょっと調べました。

一番詳しく、かつ自分の求めていた答えに近かったのは、以下のサイトです。

■非同期処理の種類

非同期処理の種類 (C# によるプログラミング入門)

自分の理解として、以下記載していこうと思います。
# 非同期処理と並列処理
そもそも根幹として、非同期処理というものがベースにあり、その用途やシナリオによって

・非同期処理

　－バックグラウンド処理

　－並列処理

と別れる感じです。

バックグラウンド処理が、主にGUIで使われるイメージが強い。 ボタンを押して、何かの処理を実施した際、バックグラウンドで処理が走っているイメージ。UIスレッドとは別スレッドで処理が行われている感じです。

それに対して並列処理は、上記URLの概要にもある通り、マルチコアCPUの性能を最大限に活かすため、並行した処理を実施するもの。

前者はasync、await、後者はParallel.for、eachになるのかな、と。

でも、そもそもの根幹はSystem.Threadingでどちらも同じ、と。
# Parallel
で、今回私が求める要素としては、並列処理、Parallel.forなのだなぁと改めて理解したところで、実際にシンプルなParallelを使ってみたいと思います。

ちなみにParallelクラスは大きく分けて3種類のStaticクラスを提供しており 【Parallel.For】 【Parallel.ForEach】 【Parallel.Invoke】 の3種類になります。

■MSDN Parallel クラス

Parallel クラス (System.Threading.Tasks)

それぞれ、For、ForEachは元来のものとあまり変わりません。

今回試したParallel.Forであれば、第1引数に初期値、第2引数に上限値、後述するオプション、第4引数に実際の処理内容をラムダ式などで記載する形になります。

ここで1つ重要になるのが、第3引数のオプションです。 ParallelOptionsクラスを渡すところなのですが、Parallelは上限値のスレッドを決めない限り、自動的にスレッドをどんどん生成していきます。

このページがかなり詳しく、丁寧に解説しています。

非同期I/O待ち
csharptan.wordpress.com

各スレッドの処理が休止状態に入ると、CPUのリソースを有効活用するためか、どんどんスレッドを生成していきます。 試しに、Dynamics CRMの組織サービス接続で、ParallelForを実行したところ、120ほどスレッドが生成されてしまいました。

もちろん、並列処理時、クライアントからサーバーに処理を投げて、返答待ちみたいな状態であれば、スレッドをある程度作ったほうが効果的な側面もあるかもしれませんが、ある程度の数値をParallelOptionsで指定したほうが良さげです。

以下、試しにParallel.Forを書いてみました。
```
using System;
using System.Threading.Tasks;

namespace MyProject.ParallelFor
{
    class Program
    {
        static void Main(string[] args)
        {
            // ParallelOptionsで2スレッドまでに制限
            ParallelOptions option = new ParallelOptions();
            option.MaxDegreeOfParallelism = 2;

            Parallel.For(0, 100, option, i =>
            {
                Console.Write(i + ",");
            });

            Console.ReadKey();
        }
    }
}
```
# 処理結果
Console.Writeの記述結果が、順次ではなくバラバラになっており、並列処理が行われたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/378fb56e-adc2-e9a1-999c-a4930c153c95.png)

ほんの一端ですが、並列処理の1つに触ることができました。

今後もちょいちょいTaskやawait,asyncなど触って行きたいところです。

杉本 和也 (id:sugimomoto) 7年前

# 参考
https://kageura.hatenadiary.jp/entry/2015/04/10/190000
Python入門 リストの取り扱い

## 概要
初学者向けにPythonの基本的な内容をまとめて寄稿します。今回は、リストの取り扱いについてまとめました。
※あまりに自明すぎる基礎知識は省いている場合が御座います。

## リストの取り扱い
### リストの基本について
リストは<b>[]の中にカンマ(,)区切りで値を入れていきます</b>。
リストは**インデックス操作、スライス操作、連結、len関数が使用可能**です。
また、リストは**ミュータブルなので改変も可能**です。
```python:例
lists = [1, 2, 3]
lists[0] = 2
print(lists)
>>[2, 2, 3]
```

これは一般的な使用法ではあまりないですがリスト内は**異なる型でも格納する事が一応可能**です。
```python:例
lists = [1, "a", 2, "b"]
```

### リストに要素を追加する
リストに追加する方法は
- **末尾に要素を追加: append関数**
- **末尾に別のリストやタプルを結合（連結）: extend関数, +演算子**
- **指定位置に要素を追加（挿入）: insert関数**
の３つの方法があります。

append関数は以下の様に使用します。
```python:例
lists = [0, 1, 2]
lists.append(3)
print(lists)
>>[0, 1, 2, 3]
```

extend関数は以下の様に使用します。
```python:例
lists = [0, 1, 2]
lists.extend([3, 4, 5])
print(lists)
>>[0, 1, 2, 3, 4, 5]

l.extend((6, 7, 8))
print(lists)
>>[0, 1, 2, 3, 4, 5, 6, 7, 8]
```

insert関数は以下の様に使用します。
```python:例
lists = [0, 1, 2]
lists.insert(1, 3)
print(lists)
>>[0, 3, 1, 2]
```

### 二次配列
リストは**リストの中に要素としてリストを入れ二次配列を作る事が出来ます**。
```python:例
lists1 = [0, 1, [2, 3]]
print(lists1[2, 0])
>>2

name = ['hogemaru','hogesuke','hogeyasu'] 
age = [18, 25,　30]
lists2 = [name, age]
print(lists2)
>>[['hogemaru', 'hogesuke', 'hogeyasu'], ['18', '25', '30']]
```
Laravel開発環境構築

# composerのインストール
Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストール
https://getcomposer.org/

# 1. パッケージ本体インストール
方法1
```本体パッケージをインストール
composer global require "laravel/installer"
laravel new 【作成するプロジェクト名】
```

方法２
```
composer create-project laravel/laravel --prefer-dist 【作成するプロジェクト名】
```

# ２，	JetStreamのインストール手順	
Jetstreamマニュアル：https://jetstream.laravel.com/2.x/installation.html
	
作成したプロジェクトに移動し、composerでJetStreamをインストールします。	
```php
composer require laravel/jetstream
```

```php 
php artisan jetstream:install livewire
php artisan jetstream:install livewire --teams
```
https://laravel-livewire.com/　　
または
```php 
php artisan jetstream:install inertia
php artisan jetstream:install inertia --teams
```
https://inertiajs.com/
注意：チーム機能が不要の方は、--teamsはなくてOKです。

# 3， npm install と npm run dev を実行します。
```php
npm install
```
```php	
npm run dev
```

# ４，DB 接続情報設定
```vb
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

# 5、マイグレーションを実行
```php
php artisan migrate
```
もしくは
```php
php artisan migrate:fresh --seed
```

# 6、サーバーをたてて、画面を表示する
```php	
php artisan serve
```
http://localhost:8000/





# Bootstrap5のインストール
https://rapicro.com/laravel%E3%81%A7%E3%81%AEbootstrap5%E3%81%AE%E5%B0%8E%E5%85%A5/
$ npm -v
でバージョンが表示され、npmがインストールされていることを確認しましょう。

Laravelをインストールしたディレクトリ($ lsしてpackage.jsonなどが表示されるディレクトリ)にて
```
$ npm install
$ npm install bootstrap
```

```bootstrap5がインストールた構造
└── node_modules/
    └── bootstrap
        ├── js
        └── scss
```




https://getbootstrap.jp/docs/4.5/getting-started/download/
365への移行の覚え


+ [Microsoft 365 ビジネス サブスクリプション ユーザーの別のメール エイリアスを追加する](https://learn.microsoft.com/ja-jp/microsoft-365/admin/email/add-another-email-alias-for-a-user?view=o365-worldwide)
+ [共有メールボックスについて](https://learn.microsoft.com/ja-jp/microsoft-365/admin/email/about-shared-mailboxes?view=o365-worldwide)
共有メールボックスはライセンスが無くてもメールボックスを利用できる機能ですが、現状では容量は50GBとして作成されます。
Could not get minikube docker env, falling back to local docker daemon: getting minikube envエラーがでる

# はじめに

知識がなさすぎて業務でつまづいたことについてまとめます
簡単なことなので、流れを理解できてれば起きなかったと思います

# 問題

kubernetesのskaffoldを実行した際に以下のエラーがでました

```
WARN[0006] Could not get minikube docker env, falling back to local docker daemon: getting minikube env: running [/usr/local/bin/minikube docker-env --shell none -p minikube --user=skaffold]
 - stdout: "false exit code 89\n"
 - stderr: ""
 - cause: exit status 89  subtask=-1 task=DevLoop
```

kubernetesを実務で使うのが初めてだったのでエラーがよくわからず、環境変数が原因かと思いました

# 解決方法

minikubeを起動していないのが原因でした。

```
$ minikube status
# sttopedとでている

$ minikube start
```

# おわりに

当たり前って感じの問題でしたが、同じ問題で悩んだ方がいたのでまとめておきます
AWS lambdaに付与するロール

# 概要

- lambdaに付与するロールを作るときのマネージドポリシーの組み合わせをまとめる。

# 前提

- 下記のIAMロールはロール作成時の「ユースケース」で「lambda」を選択しているか、「IAM」→「ロール」→「当該ロール」と移動し「信頼関係」のタブの「信頼されたエンティティ」を見たときにPrincipalで下記の様にlambdaが設定されていること。

    ```json
    "Principal": {
        "Service": "lambda.amazonaws.com"
    },
    ```

- 信頼されたエンティティの例

    ```json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    ```



# 条件別マネージドポリシーの組み合わせ

## lambdaを実行したいだけ

- 下記の2個のマネージドポリシーをロールに含める。
    - AWSLambdaBasicExecutionRole
    - AWSXRayDaemonWriteAccess

## lambda関数からS3バケットにアクセスする

- 下記の3個のマネージドポリシーをロールに含める。
    - AWSLambdaBasicExecutionRole
    - AWSXRayDaemonWriteAccess
    - AmazonS3FullAccess

## lambda関数からEC2内のリソースにアクセスするためにlambda関数をVPCに所属させる

- 下記の3個のマネージドポリシーをロールに含める。
    - AWSLambdaBasicExecutionRole
    - AWSXRayDaemonWriteAccess
    - AWSLambdaVPCAccessExecutionRole

# 参考文献

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-intro-execution-role.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html
Nuxt3 を AWS ECS にデプロイする ( + Dockerfileの例 )

# 前提

ECS公式ハンズオンを完了しており、ECSクラスタ・VPC・セキュリティグループなどの設定ができていること

https://catalog.us-east-1.prod.workshops.aws/workshops/7ffc4ed9-d4b3-44dc-bade-676162b427cd/ja-JP/1-introduction/1-overview

# nuxtプロジェクト作成

`npx nuxi init nuxt-ex`
`cd nuxt-ex`

# Dockerfile

nuxtプロジェクトと同じディレクトリにDockerfileを作成
port は80にしておく

```dockerfile
FROM node:19.5.0-alpine3.16

RUN mkdir /web
WORKDIR /web

RUN apk update && \
    npm install -g npm && \
    npm install -g vue-cli

COPY package.json /web/

RUN npm install
CMD PORT=80 npm run dev
```

# ビルド

```
docker build -t nuxt-ex .
```

# local で動作確認

てきとうなportにつなげる
```
docker run -it -p 7000:80 nuxt-ex
```

# ECRレポジトリを作成してイメージをpush する

<img width="531" alt="image" src="https://user-images.githubusercontent.com/13635059/217143271-551d89c2-b901-4342-a29d-e3f9debf92a7.png">

```
docker tag nuxt-ex:latest **********.dkr.ecr.ap-northeast-1.amazonaws.com/nuxt-ex:latest
docker push **********.dkr.ecr.ap-northeast-1.amazonaws.com/nuxt-ex:latest
```

# AWSでタスク定義を作成

今pushしたECRイメージを指定する

イメージURLは docker push で使ったものそのまま

 `**********.dkr.ecr.ap-northeast-1.amazonaws.com/nuxt-ex:latest`


<img width="1438" alt="image" src="https://user-images.githubusercontent.com/13635059/217142437-9e273089-fb80-4238-a5ca-b47a7f66558b.png">


# ECSでサービス作成

さきほど作ったタスク定義を指定する

<img width="1373" alt="image" src="https://user-images.githubusercontent.com/13635059/217142766-4f8a151d-7b5f-4880-bdf4-dea9b5cd58ac.png">

てきとうに既存のロードバランサを使うか新規に作る

<img width="884" alt="image" src="https://user-images.githubusercontent.com/13635059/217143449-8b9957e4-569c-4477-abd3-a6c7b78f6513.png">



# デプロイ進行中

CloudFormationのログでサービス作成が成功したことが分かる「

<img width="1440" alt="image" src="https://user-images.githubusercontent.com/13635059/217142826-33941979-3769-4d67-9ac4-ae70d8e23600.png">

サービスのログが現れる

<img width="1440" alt="image" src="https://user-images.githubusercontent.com/13635059/217142909-f16c94fd-514e-45ba-8b88-59ac1090d895.png">

# Webアクセス

サービスのネットワーキングタブで「オープンアドレス」のリンクを開く

<img width="1440" alt="image" src="https://user-images.githubusercontent.com/13635059/217143005-23b1cc2e-4173-44e6-a48e-781e9db9e464.png">

# 成功

![image](https://user-images.githubusercontent.com/13635059/217142287-5d02942c-6aa1-4421-ae0d-c1e395e04d70.png)


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
.Net 6以降のC#のGZipStreamの挙動変更について

# 概要
GZipStreamの挙動が変更されており、一定サイズ以上のデータが解凍できなくなった
そこで正しい解凍方法の共有する

# 変更内容
GZipStream.Readが指定したバイト数を読み込むとは限らなくなった

# コード
変更前
```csharp:before.cs
static byte[] Decode(byte[] src)
{
	var length = BitConverter.ToInt32(src, src.Length - 4);
	var bytes = new byte[length];
	using var ms = new MemoryStream(src);
	using var gs = new GZipStream(ms, CompressionMode.Decompress);
	gs.Read(bytes, 0, bytes.Length);

	return bytes;
}
```

変更後
```csharp:after.cs
static byte[] Decode(byte[] src)
{
	var length = BitConverter.ToInt32(src, src.Length - 4);
	var bytes = new byte[length];
	using var ms = new MemoryStream(src);
	using var gs = new GZipStream(ms, CompressionMode.Decompress);
	int offset = 0;
	while (offset < bytes.Length)
	{
		var readSize = gs.Read(bytes, offset, bytes.Length - offset);
		if (readSize == 0) break;
		offset += readSize;
	}

	return bytes;
}
```

比較
```diff_c_sharp
- 	gs.Read(bytes, 0, bytes.Length);
+ 	int offset = 0;
+ 	while (offset < bytes.Length)
+	{
+		var readSize = gs.Read(bytes, offset, bytes.Length - offset);
+		if (readSize == 0) break;
+		offset += readSize;
+	}
```

# 余談
gzipファイルは後ろ4バイトにValidate用の解凍後のサイズが入っている
こちらを使うことで、あらかじめ解凍後のサイズのバッファを用意して不要なリサイズを避ける

```
var length = BitConverter.ToInt32(src, src.Length - 4);
```

# .Net 7からの新機能
Stream.ReadExactlyを使うことで、必ず指定したバイト数分読むことが保証されるようになった
[公式ドキュメント](https://learn.microsoft.com/ja-jp/dotnet/api/system.io.stream.readexactly?view=net-7.0)
rails7 devise action mailerにてパスワード再設定メールを送ろうとするとNil location provided. Can't build URI.が出る件

## 前提条件
- Rails 7.0.4
- Devise 4.8.1
- actionmailer 7.0.4

## 事象
パスワード再設定用ページから宛先のメールアドレスを入力し、送信ボタンを押下すると下のエラー画面が表示される
![スクリーンショット 2023-02-07 12.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/1dad91ad-984a-59a4-c083-86a61924c4fa.png)

![スクリーンショット 2023-02-07 12.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/478ab7c8-1965-d3a4-44de-4037b00cc939.png)


## 対応
フォームのturboを無効化する

:::note warn
この対応は応急処置です！
Deviseの4.9.0のバージョンでは解決されるようですd(^_^o)
こちらのPR↓にてfixされるとのことです👀
[Integrate with Hotwire/Turbo by configuring error and response statuses #5548](https://github.com/heartcombo/devise/pull/5548)
adviced by @jnchito (special thanks)
:::


### Before

```
= simple_form_for(***, as: ***, url: password_path(resource_name), html: {  method: :post }) do |f|
```

### After

```
= simple_form_for(***, as: ***, url: password_path(resource_name), html: { 'data-turbo': 'false', method: :post }) do |f|
```

## 参考
[Getting ArgumentError (Nil location provided. Can't build URI.) after submitting password reset form on development #5468](https://github.com/heartcombo/devise/issues/5468)
UnityHub 3.4.1 for Mac でEditorのインストールが失敗する時の対応

# エラー内容
現在(2023年2月7日)のUnityHubの最新バージョン 3.4.1 をMacで使ってる環境にて、
Editorをインストールしようとすると `Install failed: Installation Failed` というメッセージがでてインストールすることが出来ない問題が発生しました。

![InstallationFailed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117949/e998af9f-5877-7b31-2345-50229f9385b9.png)

UnityHubのログ(`~/Library/Application Support/UnityHub/logs/info-log.json`) を確認すると、下記のようなエラーが出ていました。

```
'Installation failed. Reason: Error: Error while installing the editor 2021.3.18f1-x86_64 : Error: spawn ENAMETOOLONG'
```

Unity Forum を確認すると他にも同じエラーで困ってるユーザがいるみたいです。
3.4.1にアップデートしてから起きたユーザがほとんどであったため、3.4.1 のバグだと思われます。
ただ、全てのMacユーザで発生する訳ではないようです。
[Question - Install failed: Installation Failed (Unity Hub 3.4.1) - Unity Forum](https://forum.unity.com/threads/install-failed-installation-failed-unity-hub-3-4-1.1387884/)

# 解決方法
UnityHub を1つ前のバージョンの 3.3 に戻すと、正常にEditorをインストールすることができました。
ただ、公式サイトにはUnityHubのアーカイブは存在しなかったため、私は下記サイトから入手しました。
https://macdownload.informer.com/unity-hub/download/

# 所感
こういう普通詰まらないところで詰まっちゃうと途端に困っちゃいますよね。
特に私は仕事でこれに当たってしまい「Editorすらインストールできないの！？」って不信感を抱かれてしまいました・・・。
皆さんがそうならないように、この記事で問題を回避できたら幸いです。

あとEditorだけじゃなくてUnityHubもアーカイブあるとすごく助かるなって思いました。