OmniAICreator/Qiita-1.07M huggingface dataset:
これから始める学習ロードマップ

# ★概要
今までだらだらと色々な参考書を読んだり、サブスクに登録して自分なりに学習を進めてきましたが、圧倒的にアウトプットが足りなかったので、技術書を書くことで少しでもアウトプットしていこうと思います。

その上でこれから学んでいこうと思っている順序をロードマップ形式で残していきます。

# ★参考にしたもの
* 動画学習
    * [しまぶーのIT大学](https://www.youtube.com/@shimabu_it)
    * [とらゼミ](https://www.youtube.com/@1492tiger)
 
* ウェブサイト
    * [Developer Roadmaps](https://roadmap.sh/frontend)

* 書籍
    *  [りあクト！](https://oukayuka.booth.pm/)

## ★インターネット
![sec_main_20051.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/5c2001ad-6958-147b-046d-342f37a6f08b.jpeg)

まずはここから始めないとというのをどこかの記事で見たことがあるので、基本からしっかりと理解していこうと思います。<br>
特にHTTP、DNS、ドメイン、ホスティングをきちんと理解するのが良いみたいです。

## ★フロントエンド
![shutterstock_1188713476_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/9039e5b2-5776-e420-02f1-80e01c09ae9c.jpeg)

ここは私が一番興味のある分野で、**HTML、CSS、JavaScript**を学んでいこうと思います。<br>
今まで**しまぶーさん**の動画や**とらゼミさん**の動画を参考に学習を進めてきました。<br>
動画自体は学習すれば進んでいくので **"自分はできる！！"** という気持ちにはなりますが、いざやってみると手が止まるということが多々ありました。

JavaScript(以降JS)とTypeScript(以降TS)を並行して学習していこうと思いましたが、TSはJSの完全なスーパーセットとのことなので、まずはしっかりJSから学習していき、DOM操作ができるようになったあたりでそれまで作成したものをTSに書き換えるのが良いかと思っています。<br>
DOM操作という言葉もしまぶーさんがおっしゃっていただけなので現段階では何のことかわかっていません笑<br>
これからしっかりと理解していきたいと思います。

## ★Github
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/8e66ab88-18f9-83ef-2b61-545fe3c95958.png)

これからプログラミングを始める方も１度は聞いたことがあるのではないでしょうか？<br>
自分が作ったコードを掲載してポートフォリオとしたり、ほかの人が作った作品のコードを見たりすることができます。<br>
私の今の知識で説明できるのはこの程度なので、学習していきたいと思います。
こちらは主にしまぶーさんの動画を参考にして理解度を深めていきます。



## ★パッケージマネジャ
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/98505b10-4145-8129-0238-4dd2c907bb26.png)

この辺からは今までなんとなく動画学習に登場するから言われた通りのコードを使って利用してた程度なので、理解度は0といっても過言ではありません。<br>
ですが、こちらも欠かせない知識となることは知っているので学習していこうと思います。
こちらも主にしまぶーさんのyoutube動画を参考にして学習を進めていきます。

## ★フレームワーク
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/c3121567-fa3a-7f25-40d1-daea8596f7ef.png)

こちらはしまぶーさんの動画を拝見していて知ったフレームワークになります。
フレームワークというのすらいまいちよくわかっていませんが、それも含めて今後学んでいきたいと思います。
こちらは主にしまぶーさんの動画ととらゼミさんの動画を利用して学習していきます。

## ★サーバーサイド
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/105548ca-faf2-b4aa-f306-38712d71470c.png)

しまぶーさんの動画を見ていてVercelという会社がNext.jsというサービスを提供していることを知りました。
Next.jsを使用してVercelというサービス(Vercelという会社がVercelというサービスを出している)を利用するとバックエンドの操作を勝手に実行してくれ、簡単にWeb上にファイルを表示することができるだけでなく、Githubへのプッシュも簡単にできるとのことです。<br>

Reactとも相性が良いみたいなので、学習していこうと思います。

## ★クラウド
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192300/c8bb14a3-eb22-18d9-44d4-cbc63d510d7f.png)

今ではCMでも見る機会があるのではないでしょうか？AWSになります。
クラウドのことはさっぱり(バックエンド系は避けてきました)なので、これを機に1からしっかりと理解していきたいと思います。
こちらでは主にUdemyの[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)を使用して実際にAWSを触りながら学習を進めていこうと思います。

# まとめ
現段階で予定しているのはこのような流れになります。
学習していく過程で必要なものは随時アップデートして学習を進めていき、将来的にはTypeScript × React × Next.js × AWSで何か作れたらと思っています。

隙間時間のお供にでも閲覧していただけると嬉しいです。
以上になります、貴重なお時間ありがとうございました。
Laravel10 ページング機能に表示件数の可変を実装する方法


# オリジナルのページネーション表示用テンプレート
```php
php artisan vendor:publish --tag=laravel-pagination
```
これでresources/views/vendor/pagination内にページネーション表示用Bladeファイルができました。
```php
bootstrap-4.blade.php
default.blade.php
semantic-ui.blade.php
simple-bootstrap-4.blade.php
simple-default.blade.php
simple-tailwind.blade.php
tailwind.blade.php
```
Controller
全件取得であればall()メソッドを使うところを、paginate()メソッドに置き換え、引数に表示件数を指定
```php
    public function index()
    {
        // all()の代わりにpagenate()を使用
        // $items = Item::all();
	$items = Item::paginate(20);
        $this->data['items'] = $items;

        return view('item.index', $this->data);
    }
```

viewでは作ったテンプレートファイル名を引数にすれば完了
```php
{{ $items->links('vendor.pagination.bootstrap-4') }}
```
# 画面での選択可能にするには

Controller　画面
```php
    public function index(Request $request)
    {

        $pag_list = [
            0 => '',
            1 => '5',
            2 => '10',
            3 => '100',
            4 => '200',
        ];

        $disp_list = $request->disp_list;

        if(empty($disp_list)) { // ?disp_list= が空値、またはURLになかった場合
            $disp_list = 3; // デフォルトの表示件数をセット
        }

        $Users = User::paginate($disp_list );
        return view('tuser.index',[  'pag_list'=>$pag_list, 'disp_list'=>$disp_list, 'Users' => $Users]);


    }
```
フロント画面
```php
        <div class="form-group">
            <div class="mb-2 xl:w-66">    
                <p>総件数: {{ $Users -> total() }}件</p>  
                <form action="/" method="get">                                
                    <label data-te-select-label-ref>表示件数：</label>
                    <select data-te-select-init  id="disp_list" name="disp_list" value="{{ old('disp_list') }}" onchange="submit();">
                        @foreach($pag_list as $key => $val)                            
                            @if ($val === $disp_list)
                                <option value="{{ $val }}" selected >{{ $val }}</option>
                            @else
                                <option value="{{ $val }}">{{ $val }}</option>
                            @endif
                        @endforeach
                    </select>             
                
                </form>   
                {{ $Users->appends(request()->query())->links('vendor.pagination.tailwind') }}             
            </div>
        </div>
```
【実験】Azure Data Factory or Azure Synapse のパイプラインで SharePoint Online or Teams 上のファイルをデータレイクに連携する

## はじめに

SharePoint Online（Teamsも含む） 上のファイル連携の要望は多いです。

[Azure Data FactoryでSharePointのファイルをADLS Gen2にコピー](https://qiita.com/yaagi/items/eb6a86e0c9a2fc3b3e61) など、API を利用したコピーはいくつか見かけられますが、 基本的には 単一ファイルをループしてとるような方式です。

今回はより簡単な方法のアイデアをもらったのでやってみました。

※ 今回紹介する方法は一つの手段であり、懸念も存在します。個人的には保証されている API を利用したほうがデータ連携としては安定するように思います。ただ、API の方式は大量のファイル連携でもいけるのか？という気持ち・・・

## 概要

SharePoint の Onedrive を利用したローカルファイル同期を使ってファイルシステムとして セルフホステッド統合ランタイムからアクセスさせます。

## 手順

ローカルファイルへアクセスするためのリンクサービス設定は[こちら](https://qiita.com/ryoma-nagata/items/35e58aa4bb846bd8dac3)をご確認ください。


### 1. ローカルファイル同期設定

1.SharePoint or Teams の 対象フォルダを同期します。

![2023-02-21-09-28-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4224d366-62cb-c641-bdd0-58770e927363.png)


2.フォルダが追加されたら右クリックから **このデバイス上で常に保持** をクリック

![2023-02-21-09-29-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ef65b042-362d-00b9-f5c2-0094b3ecea22.png)


### 2. パイプライン作成

1.パイプライン画面からファイルシステムのデータセットを作成します。

![2023-02-21-09-30-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/185fa7bb-bcce-ea66-7c88-4dab1989fb28.png)


![2023-02-21-09-31-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a8159839-a52e-6f59-87ff-340a5c26c143.png)


2.ファイルパスを確認し、参照します。ルートフォルダはOnedriveが使用しているファイルがあるためお勧めしません。

![2023-02-21-09-31-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f8696d68-64d6-2345-dcff-ed4a72f1bf21.png)


![2023-02-21-09-42-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4425ffe7-adcd-6a05-9e86-a3941e637cfe.png)



3.データセットが完成しました。

![2023-02-21-09-42-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5f19a472-9fd9-bc98-f442-720d44ee2344.png)


4.コピーアクティビティのパイプラインを作成し、適当な場所にシンクする設定をします。

![2023-02-21-09-32-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7890334f-c29d-44f3-2bd1-8ef39657de9b.png)

![2023-02-21-09-32-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a5fd81bd-0553-eace-c146-5aadee49fb8a.png)


### 3. 確認

1.ファイルを Teams にアップしてみます。

![2023-02-21-09-40-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0360b695-0be4-75e6-1cd8-68de57f62a2d.png)


2.数分待ち、パイプラインをデバッグ実行し、成功を確認します

![2023-02-21-09-35-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d98b9a1c-fd3f-9bce-92de-0ad50454be77.png)


3.データレイクに連携できました。

![2023-02-21-09-41-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1b678c6b-63fd-2dc9-2ae2-5d4d2d1b51d0.png)


## 懸念

- ファイル同期のラグが発生するため、アップしたファイルはすぐに取得できません。
- 今回の検証の中ではユーザーのロック状態でも取得できることを確認できていますが、同期のタイミングや、不整合を起こした際に同期が停止するようなことが起きたら、など実際運用してみないとわからないことがありそうです。
GitHubへの初接続にはGit Credentials Manager

# GitHubに接続しようとしたら認証を求められた
　Macbookに変えて初めてGitHubへPushしたら失敗しました。

```sh
$ git push origin main
Username for 'https://github.com': xxxx
Password for 'https://xxxx@github.com': xxxx
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xxxx/xxxxxxxx.git/'
```

　2021年8月に認証方法が変わったそうで、単にパスワードを入力する方法では認証出来ません。公式的には、認証に`GitHub CLI`か`Git Credential Manager (GCM)`を推奨しているようなので、`GCM`を使うことにしました。

https://docs.github.com/ja/get-started/getting-started-with-git/caching-your-github-credentials-in-git

# インストール方法（Mac）
　`Homebrew`を使用してインストールします。

```sh
# gitをインストール
$ brew install git

# GCMをインストール
$ brew tap microsoft/git
$ brew install --cask git-credential-manager-core
```

これで`git push`すると次のような画面が出てくるので、ブラウザでサインインすれば完了です。
![スクリーンショット 2023-02-22 15.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426862/f140c732-aeca-bd88-087b-99cb3e3b32de.png)

`personal access token`を発行し、管理する手間を考えるとめちゃくちゃ簡単ですね。
【仕様変更対応】Azure Data Factory or Azure Synapse のパイプラインでローカルファイルシステムにアクセスする方法

## はじめに

検証準備として、セルフホステッド統合ランタイムでローカルファイルをアップしようとしていたところうまくいかず、サポート利用して確認したところ最新のセルフホステッド統合ランタイムでは追加の設定が必要であることがわかったため、共有します。

## 仕様内容内容


https://www.microsoft.com/en-us/download/details.aspx?id=39717

からダウンロードできるリリースノートに以下のような記載があります。

> 5.23.8355.1
> What’s new 
>
> Azure Data Factory: introduce a new security control for the Self-hosted Integration Runtime (SHIR) admin that lets them allow or disallow local SHIR file system access through File system connector. 
> 
> SHIR admins can use the local command line (dmgcmd.exe -DisableLocalFolderPathValidation/-EnableLocalFolderPathValidation) to disallow or allow. Refer here to learn more.
> 
> Note: We have changed the default setting to disallow local SHIR file system access from SHIR versions (>= 5.22.8297.1). Using the above command line, you should explicitly opt-out the security control and allow local SHIR file system if needed.

要約すると、「version 5.22.8297.1 以降、既定ではローカルファイルシステムへのアクセスを禁止されたけれど、version 5.23.8355.1 で追加したコマンドラインから許可設定を変更可能」とのことでした。（随分長いこと気づかなかったな）



## 手順

dmgcmd.exe を実行することで、設定を変更します。

## 準備

1. [UI を使用してセルフホステッド IR を作成する](https://learn.microsoft.com/ja-jp/azure/data-factory/create-self-hosted-integration-runtime?context=%2Fazure%2Fsynapse-analytics%2Fcontext%2Fcontext&tabs=synapse-analytics#create-a-self-hosted-ir-via-ui)を参考に、セルフホステッド統合ランタイムをインストールします。
 
![2023-02-21-08-01-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7f40a78b-51c4-15a5-e788-b548a2f00b97.png)


2.インストール後、ファイルシステムのリンクサービスを作成します。

![2023-02-21-07-57-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/37563edb-c744-5549-44f0-fa4b8ef298ef.png)


3.セルフホステッド統合ランタイムをインストールしたマシンのローカルパスを入力して、テスト接続が失敗することを確認します。

![2023-02-21-08-13-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/22d11fcb-cca4-f331-3052-a9b004c5b6ca.png)


統合ランタイムがセルフホステッド統合ランタイムとなっているよう注意しましょう。

ちなみに今回は検証用に、ローカル管理者ユーザーを作成しています。ドメインユーザーで検証する際は {ドメイン名} \ {ユーザー名} でリンクサービスを設定しましょう。

![2023-02-21-08-03-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7a1a5d6d-855d-ba7d-6d1d-ddc6819e11fc.png)


## ローカルドライバーへのアクセスを許可する

1. まずは、dmgcmd.exeの場所を確認します。通常は C:\Program Files\Microsoft Integration Runtime\ {version}\Shared\ フォルダーに置かれます。

![2023-02-21-08-09-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dc98e819-3085-8f6a-33c7-e19baedc2160.png)


2.Power Shell を管理者実行して、目的のパスまで移動します。

```powershell

cd 'C:\Program Files\Microsoft Integration Runtime\5.0\Shared\'

```

3.セキュリティ検証を無効にして、ローカル コンピューターのファイル システムへのアクセスを有効にします。

```powershell

.\dmgcmd.exe -DisableLocalFolderPathValidation

```

![2023-02-21-08-15-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6aff22f0-0863-1b45-f169-73ffcba68bb5.png)


4.Azure 側で再度テスト接続し、成功を確認します。


![2023-02-21-08-15-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c52150fd-e90f-ac17-7c0a-f539567dbaf4.png)

これでローカルファイルにアクセス可能になりました。
spinnerのある画面を回転させると、AdapterView.OnItemSelectedListenerがnullポで落ちる

# 画面を回転させると、アプリが落ちる
こんな画面で、
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/c00252d3-2663-d944-0316-fb71f0febc83.png">

回転させると、

```
--------- beginning of crash
14:49:36.123  D  Shutting down VM
14:49:36.124  E  FATAL EXCEPTION: main
                 Process: com.example.spinnernamevalue, PID: 3232
                 java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter view
                 	at com.example.spinnernamevalue.MainActivity$onCreate$1.onItemSelected(Unknown Source:2)
                 	at android.widget.AdapterView.fireOnSelected(AdapterView.java:957)
                 	at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:946)
                 	at android.widget.AdapterView.selectionChanged(AdapterView.java:935)
```
どうやら、落ちている箇所はここ
```kotlin
spinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener {
    //　アイテムが選択された時
    override fun onItemSelected(parent: AdapterView<*> ,view: View, position: Int, id: Long) {
        val spinnerParent = parent as Spinner
        val myItem = spinnerParent.selectedItem as MyItem
        textView.text = myItem.name
        editText.setText(myItem.code)
    }

    override fun onNothingSelected(p0: AdapterView<*>?) {
    }
}
```
onItemSelectedの第2引数のviewがnullで渡ってきているらしい。[ここはAPI仕様的には](https://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener#onItemSelected(android.widget.AdapterView%3C?%3E,%20android.view.View,%20int,%20long))
```
public abstract void onItemSelected (AdapterView<?> parent, 
                View view, 
                int position, 
                long id)
```
パラメータの説明を見るとこのようになっている。
| parameter | 説明 |
|:-|:-|
|parent|AdapterView: The AdapterView where the selection happened   |
|view|View: The view within the AdapterView that was clicked|
|position|int: The position of the view in the adapter |
|id|long: The row id of the item that is selected|

デバッカで止めてみてみるとparentにはspinnerのインスタンスがわたってきている。viewは
TextViewが渡ってきている。これはおそらく、今、タップしたspinnerで表示されている内容のTextViewを意味するのだろう。

画面回転だと、タップしないので第2引数のviewがnullになっているのだと思う。

```diff_kotlin
- override fun onItemSelected(parent: AdapterView<*>,view: View, position: Int, id: Long) {
+ override fun onItemSelected(parent: AdapterView<*>?,view: View?, position: Int, id: Long) {
```	

第2引数のviewをnull可にすることによって、nullポで落ちなくなった。どうせ、onItemSelectedの中で使ってないし・・・ついでに、第1引数のparentもnull可にしたけど、こっちは回転してもnullになることはないようだ。

API仕様的にはJava表記なので、これを見てoverrideするとnull不可になってしまう。うっかり、null不可のままだと回転させるとアプリが落ちてしまう。回転させないと気が付かないので注意が必要である。

ちなみに、AndroidStudioの補完でoverrideするとnull可になるようだ。
Laravel Breezeで認証機能を即実装する方法と日本語化対応する方法

# はじめに
今回、Laravel Breezeを使ってログイン機能をサクッと実装する方法と、日本語化する方法についてご紹介します。日本語化に1時間ほどハマったので、注意点を交えて説明します。

# 目次
・Laravel Breezeとは
・Laravel Breezeのインストール方法
・日本語化する方法

# Laravel Breezeとは
Laravel Breezeをインストールすると、ユーザーの登録と認証に必要なルート、コントローラ、ビューなどが自動的に作成され、ログイン、登録、パスワードリセット、メール確認、パスワード確認などの機能が使えるようになります。また、ユーザーが名前、メールアドレス、パスワードを更新できる簡単な「プロフィール」ページも含まれています。Laravel Breezeを使わなくても認証機能を作ることはできますが、サクッと実装できるので便利ですね。


# Laravel Breezeのインストール方法
Laravel Breezeをインストールするには、まずLaravelプロジェクトの作成、データベースの設定、データベースのマイグレーションを済ませる必要があります。それらが済んだら、Composerコマンドでインストールします。

```
composer require laravel/breeze --dev
```

もっと詳しく知りたい方は[Laravel公式ドキュメント](https://laravel.com/docs/9.x/starter-kits#laravel-breeze)で確認してください。

# 日本語化する方法
[こちら](https://logsuke.com/web/programming/laravel/laravel-breeze-lang-ja)の記事を参考に日本語化しました。

## 1\. config/app.phpファイルを編集する

```diff_PHP
// timezoneをAsia/Tokyoに変更
- 'timezone' => 'UTC',
+ 'timezone' => 'Asia/Tokyo',

// localeをjaに変更
- 'locale' => 'en',
+ 'locale' => 'ja',
```

## 2\. 言語ファイルをインストールする

```
composer require laravel-lang/lang --dev
```

## 3\. インストールした日本語に対応するjaディレクトリを/resources/langディレクトリに配置する
上のコマンドを実行すると、vendor/laravel-lang/lang/localesディレクトリに多言語ファイルが生成されます。その中から、日本語に対応するjaディレクトリを選択して、それを/resources/langディレクトリにコピーします。そして、/resources/langディレクトリにコピーしたjaディレクトリには、ja.jsonファイルが含まれていますので、それを/resources/langディレクトリ直下に移動します。

注意点としては、生成された日本語に対応するjaディレクトリを/langディレクトリではなく、/resources/langディレクトリに配置するということです。
JavaScriptのfinallyっていらなくね？【必要性】

そんなふうに考えていた時期が俺にもありました。returnしても処理をしたいときのみ有効です

```javascript
function sum(a, b){
  let sum;
  try{
    sum = a + b;
  } catch(e) {
    console.error(e);
    return null;
  } finally {
    console.log('Finally!');
  }

  return sum;
}

console.log('Start');

console.log(sum(10, 8));
console.log(sum(10, 8n));

console.log('End');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/8b37338d-7a3c-6f42-b394-49d3dc29d9d0.png)
【サクラエディタ】特定のキーワードを含む行だけ残し、それ以外の行を削除する

ログなど大量に出力されているテキストファイルから、目的の情報だけ残して他は全て削除したい時に使えそうな手順です。

■引用元
サクラエディタで必要な行のみ抽出する方法 | あきらブログ
https://blackbird-blog.com/regex-sakuragrep

■前提条件
1.サクラエディタをインストールしていること
以下URLより「インストーラ、パッケージダウンロード」をクリック
https://sakura-editor.github.io/
2.ファイルの改行コードが「CRLF」であること
下記手順3の入力「\r\n」に該当する。CRの場合「\r」、LFの場合「\n」に読み替える

■手順
1.サクラエディタでファイルを開く
2.Ctrl+Rキーを押す
3.置換ウインドウが開いたら、[置換前]に「^(?!.*検索ワード).*\r\n」を入力する
4.[置換後]は未入力、正規表現にチェックを入れる
5.[該当行マーク]をクリックし、削除したい行がハイライトされることを確認する
6.5で確認が取れたら[すべてを削除]をクリックする


■実例
上記手順に従って実施してみる
1
サクラエディタでファイルを開く
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917622/aa380970-9079-faf5-2490-66c998e16702.png)

2～4
今回は「WARN以外を削除したい」ので「WARN」を検索する
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917622/514d0e4a-da98-070a-706c-8b1a9b75acdc.png)

5
削除したい行が正しく検索できているか確認する
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917622/40042b57-886d-cd32-2298-0597e80c132f.png)

6
正しく削除出来ていることを確認する
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917622/5ca55e00-cb70-3c2f-50f5-a4e1778b90f6.png)
【Windowsコマンド】アプリケーション(exeやdll)のバージョンを確認する方法

■引用元
Windowsのコマンドプロンプトでファイル(exe,dll)のバージョンを取得するには - より良いエンジニアを目指して
https://rimever.hatenablog.com/entry/2019/10/13/060000

■手順
1.コマンドプロンプトを開く
2.以下のコマンドを実行する
powershell (Get-ItemProperty '調べたいexeのパス').VersionInfo.FileVersion

■実例
サクラエディタのバージョンを調べてみる
1.コマンドプロンプトの実行結果
「2.2.0.1」と判明
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917622/87823e3d-b91e-3165-26af-4589cfba06c4.png)

2.プロパティから確認した結果
「2.2.0.1」と判明。1と同じことを確認
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917622/1c8ea46b-cc5c-6d1c-ac65-a201c76500f1.png)
追跡しやすいログ出力を実現する


サービス運用をしていくうえで、ログはとても重要です。
どういった操作がされているのか、どういったことが起こっているのか。運用しているサービスを調べる方法として、「実際のデータを確認すること」と「ログを確認すること」しかできません。

「データを確認する」ことは、問題があった時に原因が分からず、どうにかして確認するための最終手段となります（個人情報を含むようなサービスであれば、そう簡単には見ることができないでしょう…）。
ということは、サービス運用の視点も踏まえたログ出力を心掛ける必要があります。

では、実際にログを取得しないといけない状態になったと仮定しましょう。どういったことができると **楽ができる(早く見つけられる)** でしょうか。

# 追跡しやすいログ出力にする意味

ログを確認する時、多くの場合は下記の流れになると思います。

1. 「何かが発生した時間」で絞り込み
1. その出力内容と同じ処理であるログ出力がどれかを探す
1. どういう流れでどういう処理が実行されたのかを確認

この中で一番大変なのが、「2」になります。
もしも「操作しているユーザーが一意」 且つ 「複数人で同じユーザーを同時に利用できない」場合は、そのログ上に「ユーザーの識別子」が出力されていれば、すぐに見つけることができるでしょう。
しかし、原因箇所と同じ処理か否かを再度確認する必要 と、上記の前提ではない場合、さらに絞り込む必要があり、大変な作業となります。

このようなことがないように、ログの出力内容として **「操作の始め～操作の完了」の中で同じ値を出力する** という方法を取ります。
そうすれば、「1」で見つけた該当のログから、その値でさらに絞り込みをするだけで、すぐに確認をすることができるというわけです。

マイクロサービスアーキテクチャーを採用していた場合、 **分散トレーシング** という考え方にも関連しています。
（アーキテクチャーに関わらず、採用されることが多い考え方だと思います）


# 実現方法

「一連のログの中で同じ値」 且つ 「全てのログの中で固有な値」 を、ログに出力する必要があります。
「トレースID」や「リクエストID」と呼ばれるようです（どちらも同じ目的で利用されます）。

では、その値をどうやって渡していくと良いでしょうか。

1. 「Request Parameter」, 「Request Body」 に項目として追加する
1. 「Request Header」に「X-*」(カスタムヘッダー) として追加する
1. 「Request Header」に「traceparent」「tracestate」に追加する
1. gRPC通信の場合、「metadata」に追加する

モノシリック(一つだけで稼働している)サービスであっても、マイクロ(複数が連携している)サービスであっても、上記のいずれかの実現方法の方が良いと思います。
つまり、外部から渡してもらう形式です。

理由は、後に記載する「気を付けたいこと」に関連します。

## traceparent と tracestate

「Request Parameter/Body」で渡すのは最終手段とした方が良いと思います(そもそも共通処理で出力しますし、リクエスト項目として渡すとノイズとなる可能性が高くなります)。

ですので、「Request Header」で渡す方法になりますが、(あまり気にする必要はないかもしれませんが)カスタムヘッダーは非推奨となっているため、
W3C が勧告している項目の「traceparent」「tracestate」を採用した方が良いかもしれません。

## 実現時の注意点
`Access-Control-Allow-Headers` の設定や、悪意のある値が送信されるリスクも考慮する必要があります。
目的を踏まえると、「最大文字列長」や「使用可能な文字種」のチェックのみで良いと思います（メタ情報に分類される内容のため、厳密なチェックをしてしまうことで逆に使い辛くなります）。


# 気を付けたいこと

「どこまでを始めとするのか」「どこまでを一連の操作として取得したいのか」を意識することです。

一般的で一番多いパターンは「1回のリクエスト（1回の実行）」かと思います。しかし、それだけではないことも考えないといけません。

## 具体例
「二段階認証/二要素認証」を例に考えてみます。
通常、「1. ログイン情報を入力 & 送信」→「2. 入力情報が妥当であればレスポンスし、追加の認証を求める」→「3. 追加認証情報を入力 & 送信」→「4. 認証結果をレスポンス」の流れかと思います。

この時、全てを一回の検索条件で取得できるようにしたい場合は、それらの処理ログの中で同じ値を出力してもらう必要があり、それが実現できるような基盤実装が必要になるでしょう。

## Nginx のアクセスログも一緒に取得する

アクセスログを取得する場合、 `nginx.conf` の `http > log_format` の内容を、今回のheader の内容を出力するように書き換える必要があります。

Nginx 内の変数としての参照方法として「`$http_*`」「`$sent_http_*`」「`$upstream_http_*`」があるため、うまく利用して出力させます。


# 最後に
今回は、追跡がしやすいログ出力を実現する方法をまとめてみました。
「追跡しやすいログ出力」を実現するための実装は、基盤開発で行われることが多く、多くの人が何となくで使うことが多いものです。
また、カスタマイズがしやすい利点を取り入れることによって、問題になり得るリスクも同時に息をひそめます。

目的を知らないまま、適当に利用することによってやりたいことが実現されず、修正が必要となる場面にならないことをお祈り致します。
新規開発をする人、また、改善をするために頑張ろうとしている人の力になれれば幸いです。


# 参考

* https://www.rfc-editor.org/rfc/rfc6648
* https://www.w3.org/TR/trace-context/

https://zenn.dev/lempiji/articles/b752b644d22a59

* https://openresty.org/download/agentzh-nginx-tutorials-en.html#02-nginxdirectiveexecorder01
* https://nginx.org/en/docs/http/ngx_http_core_module.html#variables
* https://stackoverflow.com/questions/12431496/nginx-read-custom-header-from-upstream-server

https://recruit.gmo.jp/engineer/jisedai/blog/nginx-post-log-filter/
LANからのみSSHを許可【CIDR】

# はじめに
LAN(プライベートアドレス、リンクローカルアドレス)からのみSSH接続を行うufwの設定を行います。
```ufw cidr```でググると、1つ目に以下がヒットしますがバッドノウハウではないかと思い記事を書くこととしました。
https://qiita.com/Shiro-neko-kamen/items/7e8411c95b0bedf8312f

# LANを示すアドレス  
IPv4の場合、```192.168.0.0〜192.168.255.255```がプライベートアドレスである。
CIDR表記すると```192.168.0.0/16```。
IPv6の場合、```fe80::/64```リンクローカルアドレスが該当する。

# ufw への設定
ufw は既に動作中のものとする。
```bash
sudo ufw allow from 192.168.0.0/16 to any port 22
sudo ufw allow from fe80::/64 to any port 22
```
または、
```bash
sudo ufw allow from 192.168.0.0/16 to any app OpenSSH
sudo ufw allow from fe80::/64 to any app OpenSSH
```
など。
アドレスを指定せず同ポートが許可されていたら削除しておく
```bash
sudo ufw status numbered

sudo ufw delete <num>
```

# ssh接続し確認する
ホスト側でIPアドレスを取得し、クライアントから各種IPアドレスでssh接続を試みます
```bash:アドレス取得
ip a
```
```bash:IPv4プライベートアドレス
ssh <username>@192.168.X.X
```
```bash:IPv6リンクローカルアドレス
ssh <username>@fe80::<XXXX:XXXX:XXXX:XXXX>
```
```bash:IPv6グローバルアドレス
ssh <username>@2400:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
```
無事にIPv6グローバルアドレスのみ接続できないことが確認できました。

# ホスト名での接続
windows10 からホスト名でのssh接続を試みる
```
ssh <username>@<hostname>.local
```
接続は出来ましたが、それなりの時間がかかった。
```bash
w -i
```
とすると、IPv4プライベートアドレスでログインしていた。
```
ping <hostname>
```
クライアントから ping を叩くと、IPv6グローバルアドレスから応答があった。
IPv6グローバルアドレス -> IPv4プライベートアドレス と、たらい回しにされている模様。

いくつかの回避策は浮かびますが、デファクトはどれなのか分からず、windows側の問題だと思うのでここでは言及しません。
良い方法をご存じの方は教えていただけますと嬉しいです！

##
スクリプトでCIDRを展開して ufw に追記する方法ですが、個別にコンペアを取ると思われパフォーマンスが落ちそうです(ベンチは取ってない)。
なにより
```
sudo ufw status
```
した際の可読性が低いと思われます。
2番目にヒットした以下では、2015年にはCIDRで ufw へ設定を入れています。
https://askubuntu.com/questions/646424/ufw-allow-range-of-ip-addresees
GitHub Pagesを使ってサイトを公開する方法

# GitHub Pagesとは
GitHub Pages とは、GitHub のリポジトリから HTML、CSS、および JavaScript ファイル を直接取得し、任意でビルドプロセスを通じてファイルを実行し、ウェブサイトを公開できる静的なサイトホスティングサービスです。

# リポジトリの新規作成
まずはGitHubにログインし右上の＋マークを押して`New repository`をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/28537d0e-8ce1-ed9a-45d1-c219033927b5.png">

リポジトリの名前を入力し`Create repository`をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/c7383439-a6b7-f3ae-8efd-a5f2aed2308b.png">


# ローカルファイルをGitHubにプッシュする
公開したいフォルダでターミナルを開き、以下を実行する。
```
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin <自分のリモートリポジトリのURL>
git push -u origin main
```
:::note warn
自分のリモートリポジトリのURLには先ほど作成したリモートリポジトリのURLをコピーして入れてください。
:::
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/584b4776-d72d-49e5-ef4b-e72e1b8e93b9.png">

自分のGitHubのリポジトリページに戻りプッシュされ反映されていることを確認。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/6880ba4d-bb87-0a3a-2b7a-3d0714e19a6f.png">



# GitHub Pagesの設定
`Settings`>`Pages`をクリック。
![スクリーンショット 2023-02-22 14.16.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/6b68fbb6-6186-fa01-3e2c-cf1dc8b11cbd.png)


`main`ブランチを選択して`Save`をクリック。
![スクリーンショット 2023-02-22 14.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/44b09e41-131a-74c1-84e0-adc22b8e987e.png)

:::note warn
Branchの部分が「None」になっていたら「main」に変更する。
:::

そうすると画面上部にURLが発行されるのでそちらをクリックすると無事サイトが公開されます。
![スクリーンショット 2023-02-22 14.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257972/32ac9c8e-f51d-e927-53aa-d11910ed6f78.png)

以上がGitHub Pagesを使ってサイトを公開する方法です。
PHP：match式：同じ変数を複数の値で条件分岐して、結果の値を代入できる

同じ変数を複数の値で条件分岐して、結果の値を代入できる。
これは便利に使える。

```php
$artist = 'Blur';

$nation = match($artist) {
    'Nirvana' => 'アメリカ',
    'Adele', 'Blur' => 'イギリス',
    default => '日本',
};

echo $nation; // イギリス
```
四則演算、文字列、Bool値、比較演算子

## 四則演算
```py:qiita.py
# 　2-1  四則演算
print(1 + 3)
print(1 - 3)
print(1 * 3)
print(1 / 3)

#  2-2 変数を用いた四則演算
a = 1
b = 3
print(a + b)
print(a - b)
print(a * b)
print(a / b)

#  2 - 3 変数の中に計算結果を直で入れることも可能
tasu = 1 + 3
hiku = 1- 3
kakeru = 1 * 3
waru = 1 / 3

print(tasu, hiku, kakeru, waru)

#  2-4 商の計算、あまりの計算
print("1÷3の商は", 1 // 3)
print("1÷3のあまりは", 1 % 3)
```
## 文字列
```py:qiita.py
# 　2-5 文字列
print("文字列はダブルクォーテーションでも", 'シングルクォーテーションでもok')

#  2-6 文字列を変数に代入
s = '空が青いです。' 
print(s) # 空が青いです。

#  2-7 文字列から一部の文字を取り出す
#  インデックスの利用、文字列はインデックスを用いることができる
print(s[0]) # → 空

# 2-8 文字列から複数の文字を取り出す
print(s[0:3]) # 　→ 空が青
# 　省略可
print(s[:3])
# 逆にする
print(s[3:])
# 最後の文字を取得
print(s[-2:])
```

## Bool値、比較演算子
```py:qiita.rb
# 2-9 bool値と比較演算子
a = 2
#  aが2であるか判定
a == 2 # True
#  aが3であるか判定
a == 3 # False
#  aが3以上であるか判定
a >= 3 # False

#  2-10 比較演算子
#  aが2以上
print(a >= 2)
# a が 2よりも大きい
print(a > 2)
# a が　２以下
print(a <= 2)
#  aが２未満
print(a < 2)

# 2-11 bool値を変数にいれる
is__ok = True
#  判定
is__ok == True
is__ok == False

```
AWS Step Functions で「合計」「実行中」「成功」「失敗」などの数字が表示されてこない

# 課題
AWS Step Functions で「合計」「実行中」「成功」「失敗」などの数字が表示されてこない
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/412e668f-2cc5-cefd-e167-7d4985acea16.jpeg)

# 原因
数字が表示されていないのは作成タイプが「Express」で作成されたものです。
(なぜ表示されないのかはソースを発見できませんでした)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/af3883be-7f1f-6d15-51d9-7ca9d0442388.jpeg)


# 解決方法
意図して「Express」で作成していない場合は、「標準」で作り直しましょう。(Typeだけを変更するという事は出来ないようです)
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/bp-express.html
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/c43fcd28-7fd7-03c4-a541-7a9fe37f7ec2.jpeg)

# 再作成後
AWS Step Functions で「合計」「実行中」「成功」「失敗」などの数字が表示されてくるようになります
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/412e668f-2cc5-cefd-e167-7d4985acea16.jpeg)
FacrotyMethodの概要【OOP/デザインパターン】

## FactoryMethodとは？
下記の2点を満たすクラス群。
1. Factoryクラス（スーパークラス）
......オブジェクトの生成を抽象メソッドに、オブジェクトのふるまいを具象メソッドに設定する。
2. サブクラス
......オブジェクトを生成するためクラスで、オブジェクト毎に別々のクラスにする。

## 主な使用シチュエーション
- 同じような機能を持つ別々のオブジェクトが大量に必要なケース
- オブジェクトが継続的に追加されるケース

## メリット
- 各種オブジェクトの生成を抽象メソッドすることで、オブジェクトの生成をサブクラスに一任できる
- オブジェクトのふるまいを具象メソッドにすることで、ふるまいの部分を親クラスに一任できる
（→クラスの役割を分割できるので、単一責任則に従った開発を行うことができる）
- オブジェクトのふるまいをサブクラス間で共通化できるので、保守性や可読性が高まる
- 各種オブジェクトにインターフェースを継承させれば、サブクラスで生成するオブジェクトを制限/一元化できる

## デメリット
- 生成するオブジェクトの数によってサブクラスの管理コストが増減する
- Factoryクラスの具象メソッドに変更を加えると、すべてのサブクラスに影響する

## KeyWord
### CreationMethod
オブジェクトを生成する処理を担当するメソッドの総称。
FacrotyMethodの場合はサブクラスがこれに該当する。

### SimpleFactory
Factoryクラス内でオブジェクトを生成する方法。サブクラスは使わない。

## 作成したソースコード
https://github.com/hirotada-t/design_pattern/tree/main/FactoryMethod
GPartedでパーティションサイズの変更 

# パッケージが更新できない
`archinstall`コマンドを利用してインストールした場合、rootのパーティションは20GBになります。
`pacman -Syu`でパッケージを更新しようとするとエラーで更新できなくなります。
```shell:shell
$ df -h
~~~
/dev/sda2        20G   14G   6G  80% /
~~~
```
`GPerted`を利用してGUIでパーティションサイズを変更したいと思います。
```shell:shell
wget https://downloads.sourceforge.net/gparted/gparted-live-1.2.0-1-amd64.iso 
```
このファイルをUSBなりに焼いてください。

# 起動後
焼いたディスクを指定して起動してください。

起動したときに4つの選択肢があるのですが、

> GPerted Live (Default settings)
> Don't touch keymap

を選択してください。

あとは言語選択を`15`でJapaneseを選択してください。

あとはGUIが起動してGPertedも起動します。

# パーティションサイズの変更

+ 右上のリストを押してパーティションサイズを変更するドライブを選択
+ 変更したいパーティションを右クリックして`Risize/Move`を選択
+ 数字もしくは上の横棒をドラッグしてパーティションサイズを変更
+ チェックボタンを押して適用

で終了です。
```shell
$ df -h
~~~
/dev/sda2        72G   14G   55G  20% /
~~~
```
これでパーティションサイズを変更できました。
スクリーンショット取り忘れたのでまた機会があれば書き直します。


### 参考文献
https://www.2daygeek.com/linux-resize-active-primary-root-partition-gparted/
[AWS][postgresSQL]RDSにローカルクライアントからアクセスしてテーブルを操作したい


# 結論これを見ればOK

Yutube
https://www.youtube.com/watch?v=XDMgXZUfa10

# pgadmin DL
https://www.sraoss.co.jp/tech-blog/pgsql/pgadmin4
No.4 ページの壁紙の色を変える

## はじめに
これまでのセッションで作成したビジュアルを、みなさまどんどんページに貼っていっていると思います。
その中で見やすさを改善するために幾つか見せ方の工夫などを下記のブログでもお伝えしました。
参考リンク：[No.3（ちょっと一息）作成したビジュアルを組み合わせてみる](https://qiita.com/shinyasasaki/items/ed956c393879e882edf4)

ところでページの背景ですが、なんだか味気がない感じがするのは私だけでしょうか。。
・Before
![スクリーンショット 2023-02-22 12.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/06e98656-b5c2-ecf2-cf6d-ce239c98f556.png)
ビジュアルも背景も全部白だと境界線がわかりにくく、それが見辛さを助長していると思います。

今回はこちらの**ページの壁紙（の色）を変える方法**について記載していきます。
・After
![スクリーンショット 2023-02-22 12.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/dd537cc2-dc52-61d4-7154-47f1b8ce40fd.png)


## 壁紙の色を変更
**1．色を変更したいレポートを選び、編集を押下**
**2．視覚化の「レポートページの書式設定」を押下**
**3．「壁紙」を開き、「カラー」で任意の色を選択する**
**4．選択した色に変更されれば、完了**
![ezgif-1-dd0f2ffd0c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/80862202-3fff-1caf-5095-ede993ad737a.gif)

また、ページ毎に壁紙は変更可能です。
見やすい色やコーポレートカラーに合わせるなど、アレンジをしてみて下さい。


こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
python基礎学習ログ

## 2月21日(水)
### 1\. 変数について
```pyhon:qiita.py
#  1 -1 aという変数の中に、数字の1を入れる
a = 1
#  1-2 bという変数の中に3を入れる
b = 3
#  1- 3 fiveという変数の中に、数字の5を入れる
five = 5

# 　1-4 変数の中身の表示
print("aの中身は" , a)
print("bの中身は",  b)
print("fiveの中身は", five)

#  1-5 printは数字も表現できる
print(1)

#  1-6 printを使って全ての変数を表示
print(a, b, five)
```
Rails論理削除paranoia

# 論理削除とは

データを消すが情報としては残しておくみたいな使い方です。

対義語的な感じで物理削除があり
物理削除は完全にデータを消します。

Railsで言う論理削除は
データベースのレコードとしては残っているが
データを取得する時とかに論理削除されたデータは取得できないとかがあります。

# paranoiaとは

論理削除を間単に実装できるGemです

[paranoia　github](https://github.com/rubysherpas/paranoia)

# Railsに実装する

Gemfileにパラノイアを追記
bundle install
```
gem 'paranoia'
```

migration
論理削除を実装したいテーブルに`deleted_at`を追加
```
def change
  add_column :entry_lists, :deleted_at, :datetime, default: nil
  add_index :entry_lists, :deleted_at
end
```

該当モデル
`acts_as_paranoid`を追加

```
class EntryList < ApplicationRecord
  acts_as_paranoid
```

これだけで論理削除が実装されます。

# 実際の動き

#### 削除

任意のレコードを削除
デリート実行しているが
実際sqlはdeleted_atのupdateが行わている
```
entrylist.delete

EntryList Update (7.2ms)  UPDATE `entry_lists` SET `entry_lists`.`deleted_at` = '2023-02-22 02:34:11', `entry_lists`.`updated_at` = '2023-02-22 02:34:11.956798' WHERE `entry_lists`.`id` = 2


=> #<EntryList:0x0000000007e7e800
 id: 2,
 created_at: Mon, 31 Oct 2022 17:06:07 JST +09:00,
 updated_at: Wed, 22 Feb 2023 11:34:11 JST +09:00,
 deleted_at: Wed, 22 Feb 2023 11:34:11 JST +09:00>　　⇦削除実行した時間がはいる
```

#### 取得

論理削除されたレコードを取得しようとすると存在しないエラーが返る
論理削除されたものはデフォルト含めずに取得されるので特に意識しなくてもいい感じに取得してくます

```
EntryList.find(2)

ActiveRecord::RecordNotFound: Couldn't find EntryList with 'id'=2 [WHERE `entry_lists`.`deleted_at` IS NULL]
```

取得したい場合は
`with_deleted`をあいだに挟んであげると
取得できるようになる
文字通り論理削除されたものも含めて返してくれるようになる

```
EntryList.with_deleted.find(2)

=> #<EntryList:0x0000000008299598
 id: 2,
 created_at: Mon, 31 Oct 2022 17:06:07 JST +09:00,
 updated_at: Wed, 22 Feb 2023 11:34:11 JST +09:00,
 deleted_at: Wed, 22 Feb 2023 11:34:11 JST +09:00>
```

# 論理削除されているか確認したい

```
entrylist.paranoia_destroyed?
=> true
```


# 論理削除を復活

`restore`で復活することができます。
ただバリデーションチェックはすり抜けるっぽいので
`entrylist.valid?`とかで確認して　restoreがいいと思います

```
entrylist.restore

   (0.6ms)  BEGIN
  EntryList Update (0.7ms)  UPDATE `entry_lists` SET `entry_lists`.`deleted_at` = NULL, `entry_lists`.`updated_at` = '2023-02-22 02:43:31.555370' WHERE `entry_lists`.`id` = 2
   (8.8ms)  COMMIT

=> #<EntryList:0x0000000007e7e800
 id: 2,
 created_at: Mon, 31 Oct 2022 17:06:07 JST +09:00,
 updated_at: Wed, 22 Feb 2023 11:43:31 JST +09:00,
 deleted_at: nil> ⇦　deleted_atがなくなる

```

配列でID渡して一括復活も可能です
```
EntryList.restore([id, id, ・・・id])
```

# やっぱ物理削除したい

論理削除実装してるがこれだけは物理削除したい時
`really_destroy!`

```
entrylist.really_destroy!

 EntryList Destroy (0.8ms)  DELETE FROM `entry_lists` WHERE `entry_lists`.`id` = 2
 (4.1ms)  COMMIT


EntryList.with_deleted.find(2)
ActiveRecord::RecordNotFound: Couldn't find EntryList with 'id'=2 ⇦完全に削除されているので見つからない
```

# 削除したもののみ取得したい

`only_deleted`

```
EntryList.only_deleted

=> [#<EntryList:0x0000000008a0b4e8
  id: 5,
  created_at: Mon, 31 Oct 2022 17:06:16 JST +09:00,
  updated_at: Wed, 22 Feb 2023 11:49:22 JST +09:00,
  deleted_at: Wed, 22 Feb 2023 11:49:22 JST +09:00>,
 #<EntryList:0x0000000008a0b420
  id: 15,
  created_at: Fri, 17 Feb 2023 14:00:57 JST +09:00,
  updated_at: Wed, 22 Feb 2023 11:49:56 JST +09:00,
  deleted_at: Wed, 22 Feb 2023 11:49:56 JST +09:00>]
```

# まとめ

簡単に論理削除が実装できるので
論理削除したいときにはこれ
Databricksにおけるノーコードのデータサイエンスと機械学習

[No\-code data science and machine learning \- Databricks](https://www.databricks.com/product/no-code-ml)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

組織全体におけるデータサイエンスを拡大し、すべての人がデータドリブンの意思決定を支援します。

# エンタープライズの信頼性を持つツールでシチズンデータサイエンティスト向けにスケール

![](https://www.databricks.com/wp-content/uploads/2022/01/image-nocode-ml-1.png)

Databricksは、みなさまが数クリックで膨大な複雑なデータセットの分析、洞察の発見、予測を行えるように支援をします。一行のコードを記述することなしに、データを整理、変換、可視化します。

[bamboolibを探索する →](https://bamboolib.8080labs.com/)

# 非エンジニア向けのデータエンジニア

![](https://www.databricks.com/wp-content/uploads/2022/01/image-nocode-ml-2.png)

機械学習はデータエンジニアリングからスタートします。最初に、コードを記述することなしに、データを準備、変換、可視化し、探索的データ分析を実施します。Databricksを用いることで、組織の誰でも後段のユースケースで使用するデータを準備することができます。

# 完全に自動化された機械学習

[No\-code data science and machine learning \- Databricks](https://www.databricks.com/wp-content/uploads/2022/01/image-nocode-ml-3.png)

Databricks AutoMLはシチズンデータサイエンティストに対してガラスボックスアプローチを提供し、データの前処理、特徴量エンジニアリング、モデルトレーニング、チューニングのヘビーリフティングを自動化することで、チームはクイックに機械学習モデルを構築、トレーニング、デプロイすることができます。

[AutoMLについて学ぶ →](https://www.databricks.com/jp/product/automl)

# 必要に応じて詳細を確認できるための透明性と可視性

![](https://www.databricks.com/wp-content/uploads/2022/01/image-nocode-ml-4.png)

Databricksにおける機械学習に固有のものですが、UIで実行されたすべてのステップは、内部でプロダクションレベルのコードとして生成されます。

エキスパートのデータサイエンティスト、機械学習エンジニアはコードを調査し、自身のカスタマイゼーションを追加することができ、規制に対応する部署は再現性や透明性が重要になるケースで、これらを参照することができます。Databricks Machine LearningはネイティブでMLflowとインテグレーションされており、前処理から特徴量エンジニアリング、トレーニング、デプロイメントに至るまで、きめ細かいエクスペリメント追跡やバージョン管理を実現します。

[MLflowを学ぶ →](https://mlflow.org/)

# 機能横断でのコラボレーションのための説明可能性とコンプライアンス

![](https://www.databricks.com/wp-content/uploads/2022/01/image-nocode-ml-5.png)

完全なリネージトラッキングや自動生成コードの登録に関するDatabricksのサポートは、皆様のデータサイエンスプロジェクトがセキュアで、法令に準拠しており、追跡可能であることを保証します。特徴量の説明可能性は、生成されたモデルにおいてどの入力が最も重要であるのかに関する洞察を提供します。これによって、ユーザー、データサイエンティスト、機械学習エンジニア、IT、リーガル、コンプライアンス部門などさまざまなチームがコラボレーションする基盤を構築することができます。

[説明可能性に関するブログ記事を読む →](https://www.databricks.com/blog/2019/06/17/detecting-bias-with-shap.html)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
クローンしたリポジトリでnpm installを実行したらパスワードの入力を求められた話

まず、フォークした`express-jwt`リポジトリをローカルにクローンしました。

https://github.com/auth0/express-jwt

そしてVSCode Dev Containers拡張機能を使ってプロジェクトを開きました。

この時使ったDockerのイメージは`mcr.microsoft.com/devcontainers/typescript-node:0-18-bullseye`です。

`npm install`を実行してみると、`code E401`エラーが発生しました。

```shell
node ➜ /workspaces/express-jwt (master) $ npm install
npm ERR! code E401
npm ERR! Incorrect or missing password.
npm ERR! If you were trying to login, change your password, create an
npm ERR! authentication token or enable two-factor authentication then
npm ERR! that means you likely typed your password in incorrectly.
npm ERR! Please try again, or recover your password at:
npm ERR!     https://www.npmjs.com/forgot
npm ERR! 
npm ERR! If you were doing some other operation then your saved credentials are
npm ERR! probably out of date. To correct this please try logging in again with:
npm ERR!     npm login

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/node/.npm/_logs/2023-02-18T09_22_56_224Z-debug-0.log
```

試しに、`npm login`を実行してnpmにログインした状態でインストールを試みましたが、問題は解消されませんでした。

仕方がないので、Stack Overflowで調べたところ良さそうな回答が見つかりました。

https://stackoverflow.com/questions/67114659/npm-err-code-e401-npm-err-incorrect-or-missing-password

このページの回答では、`package-lock.json`をまず削除してみろと書かれていたので、とりあえず削除してもう一度インストールを試みました。

```shell
node ➜ /workspaces/express-jwt (master) $ npm install

> express-jwt@8.4.1 prepare
> npm run build


> express-jwt@8.4.1 build
> rm -rf dist ; tsc


added 408 packages, and audited 409 packages in 39s

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

found 0 vulnerabilities
```

お分かりの通り、解決することができました。

もし同じようなエラーが出て困っている場合は、とりあえず**package-lock.json**を削除してみることをお勧めします。
JavaScriptで出てくる「this」、「children」について

# 本題
早速ですが
「this」と、「children」の違いを解説していきます。

> - <b>「this」</b>はイベントが発生した要素のみを変化させます。
> - <b>「children」</b>はHTML要素直下のすべての子要素を取得できます。

例えばthisを使うと正方形にクリックした時、その正方形のみslideUPして消えていく機能を作れます。

対して、childrenを使うとリスト(ul要素)の子要素であるli内の文字列がすべて
黒色から赤色に変化する機能を作れます。
thisやchildrenを使うと変更したい要素を簡単に指定できて便利です。

要は、

:::note info
<b>thisは個別でイベント発生
childrenは子要素をまとめてイベント発生</b>
:::

みたいなイメージですかね。知らんけど。

# まとめ
本日は「this」と、「children」の違いについて解説していきました。
javascriptは奥が深いですね。
それでは、また次回もお願いします！
フロントエンドで完結するまったくサーバーを使わないアイドル判定サービスを作った

# なぜ作ろうと思ったのか
1. 最近アイドル多くない？
  NiziU、IVE、Kep1er、BLACKPINK、ITZY、SixTONES、Snow Man、なにわ男子、King & Prince、BTS、JO1、Da-iCE、INI、CUBERS、原因は自分にある。、BALLISTIK BOYZ、VOYZ BOY、Zero PLANET、プラチナボーイズ、BE：FIRST、BUDDiiS、7ORDER、OCTPATH、BLVCKBERRY、THE SUPER FRUIT、TravisJapan などなど
2. 誰が誰か分からんのだが…
3. Shazam的な感じでパッと誰か分かるもの欲しいなぁ

ということで作ってみることにしました。

# 作ったもの
- [アイドル判定AI「セレン」](http://celebsearch.deg84.app)という写真を選択するとどのアイドルかを判定してくれるサービスを作りました。
  - セレンは、celeb+funから考えた名前です
- ChatGPTやLINEでボットとの会話をするのに抵抗感が薄れていると考えたので、このサービスもチャットベースになっています
- 写真はサーバーサイドやS3等のオンラインストレージへのアップロードは行わず、フロントエンドでのみ利用しています

ちなみに、このプロダクトは、株式会社mofmofの「水曜日の個人開発」にサポートされています。
https://indie-dev.mof-mof.co.jp

# 技術的な話
## 技術スタック
### サービス周り
- TensorFlow.js（WebAssembly）
- OpenCV.js（WebAssembly）
- Next.js(T3 Stackベース)
- TypeScript
- ESLint
- Prettier

最初はサーバーありのつもりだったので[T3 Stack]()を使って開発しましたが、現状使っているのはNext.js部分だけです。

### 機械学習周り
- Jupyter Notebook
- TensorFlow
- face_recognition

## WebAssembly
TensorFlow, OpenCVがWebAssemblyのおかげでJavaScriptから実行できるようになったことで、サーバーを使うことなく実装することが出来ました。

WebAssemblyは、C、C++やRustで書かれたコードをJavaScriptから実行できるようにする技術です。

これまでは使用することが難しかった処理をWebから実行できるようになったり、JavaScriptで実装するよりも高速に処理できるようになったりします。

ただ、今後モデルデータが大きくなりすぎた場合は、サーバーサイドへ移行する可能性はあります。

# その他苦労ポイントとか
## 全然正しく判定してくれない

記事執筆時点では、データが全然足りていないのが原因だと考えています。
1名に付き100枚用意しており、訓練用50枚、テスト用に50枚で学習してます。

改善案としては、データ元を増やすのとデータ件数を増やすが考えられます。

## BTSしか判定できない

今はBTSのメンバー7人しか判定出来ません。（そして精度は低いです…）

色々なアイドルを判定できるようにしたい気持ちはあるんですが、手動で分類するのが大変すぎて手が回っていません…
何か良い方法があれば教えてください。

# まとめ
ということで、個人開発したサービスの紹介でした。
もしよかったら使ってみてください。
フィードバックなどもお待ちしております。
指定したHOSTを一度にリサイズする（json読み込み版）

# はじめに
https://qiita.com/watyanabe164/items/4729da3d93559df6b345

の改良版。jsonファイルの内容を読み込んでリサイズするように修正。
そのほか細々と修正

# 入力用jsonファイル

```:vmslist.json
[
    {resourcegroup:"pro-nabehiro-001", hostname:"nbfr151v", vmsize:"Standard_B1s"},
    {resourcegroup:"pro-nabehiro-001", hostname:"nbfr152v", vmsize:"Standard_B1s"}
]
```

# スクリプト

```
# Define variables
$resource_group_name = "pro-nabehiro-001"

# Read the vmslist.json file
$vms_list = Get-Content ".\vmslist.json" | ConvertFrom-Json

function Get-VMData ($vm_id){
    $powerstate = az vm get-instance-view --ids $vm_id --query "{host: name, powerstate: instanceView.statuses[1].displayStatus}" -o tsv
    $vm_name_size = az vm show --ids $vm_id --query "{size: hardwareProfile.vmSize}" -o tsv
    Write-Host "VM power state and size: $powerstate`t$vm_name_size"
}

$vm_ids = foreach ($vm_data in $vms_list) {
    $vm_name = $vm_data.hostname
    $resource_group_name = $vm_data.resourceGroup
    az vm show --name $vm_name --resource-group $resource_group_name --query 'id' -o tsv
}

foreach($vm_id in $vm_ids) {
    Get-VMData $vm_id
}
Read-Host "Press Enter to continue. next:stop vms"

# Stop VMs
Write-Host "Stop VMs"
az vm deallocate --ids $vm_ids --no-wait | Out-Null

az vm wait --ids $vm_ids --updated | Out-Null
foreach($vm_id in $vm_ids) {
    Get-VMData $vm_id
}
Read-Host "Press Enter to continue. next:resize vms"

# Resize VMs
foreach ($vm_data in $vms_list) {
    $vm_name = $vm_data.hostname
    $vm_size = $vm_data.vmsize
    $vm_name_size = az vm show --name $vm_name --resource-group $resource_group_name --query "{size: hardwareProfile.vmSize}" -o tsv

    write-host "before:$vm_name_size, after:$vm_size"

    # If the VM size is already the specified size, skip the resize
    if ($vm_name_size -eq $vm_size) {
        Write-Host "VM $vm_name is already the specified size. Skipping resize."
        continue
    }

    # Resize VM
    Write-Host "Resizing VM $vm_name to size $vm_size"
    az vm resize --name $vm_name --resource-group $resource_group_name --size $vm_size --no-wait | Out-Null
}

az vm wait --ids $vm_ids --updated | Out-Null
foreach($vm_id in $vm_ids) {
    Get-VMData $vm_id
}
Read-Host "Press Enter to continue. next:start vms"

# Start VMs
Write-Host "Start VMs"
az vm start --ids $vm_ids --no-wait | Out-Null

az vm wait --ids $vm_ids --updated | Out-Null
foreach($vm_id in $vm_ids) {
    Get-VMData $vm_id
}
Write-Host "Finished!"

```

# 動作結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d70decb1-4564-5e4a-e7c8-63d359b41628.png)
【Unity】ParticleSystem の再生位置を簡単に変えられる拡張メソッド

# 概要
ParticleSystem の```Simulate()```を扱いやすくする拡張メソッド```Skip()```を作りました。


![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/b7b0c1df-8ef6-9005-245b-889feefb387a.gif)

Simulate() を使うと、再生位置を進めたり開始位置から指定時間までシミュレーションを進めたりできます。
しかし、使用後に Particle が止まったりマイナスの値に対応していなかったりして不便なところがあります。
そこで、再生・停止の状態を維持してマイナスの値にも対応した拡張メソッドを作りました。

```Skip()```は Simulate() と比較して下記の挙動を取ります。
- 再生・停止の状態を維持します
- t がプラスの場合は単純にシミュレーションを進めます
- t がマイナスの場合は Restart してシミュレーションを進め、-t 秒前の状態を再現します

また、再生・停止の状態を維持して再生位置を変えられる```SetTime()```も用意しています。

# コード
お手持ちの ParticleSystemEx クラスに追加してご利用ください。

``` ParticleSystemEx.cs
using UnityEngine;

namespace Extensions
{
    public static class ParticleSystemEx
    {
        public static ParticleSystem Skip(this ParticleSystem particle, float second, bool withChildren = true, bool fixedTimeStep = true)
        {
            if (second == 0f) return particle;
            var isPlayed = particle.isPlaying;

            if (second >= 0f) particle.Simulate(second, withChildren, false, fixedTimeStep);
            else particle.Simulate(particle.totalTime + second, withChildren, true, fixedTimeStep);

            if (isPlayed) particle.Play();
            return particle;
        }
        public static ParticleSystem SetTime(this ParticleSystem particle, float time, bool withChildren = true, bool fixedTimeStep = true)
        {
            var isPlayed = particle.isPlaying;
            particle.Simulate(time, withChildren, true, fixedTimeStep);
            if (isPlayed) particle.Play();
            return particle;
        }
    }
}
```
コマンドの結果を Visual Studio Code で開く

# 要旨

テキストファイルを編集する際など、Visual Studio Code (以下、VSCode) で編集するよりもコマンドを叩いたほうが早く、軽く実施できることが多く有る。
しかし、コマンドの結果は、通常は Terminal に表示され、再利用性に乏しい。

ここでは、 コマンドを実行し、その結果を VSCode に表示する方法を記載する。

# TL;DR

1. Command Palette から code をインストールする。
2. Terminal から パイプで `code -` へ繋ぐ

# やり方

### Code コマンド インストール
code コマンドは、 Command Palette からインストールする。

VSCode で Command Palette を表示して、 `code` と入力
Shell Command Install 'code' command in PATH を選択。
(言語パックが入っている場合は適宜読み替えてください。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240771/57ac379c-2278-881f-2407-b89b005520d4.png)

### Terminal からコマンドの実行

(サンプルデータは JSON.org から)

#### 元データ
JSON ファイルなのは分かるけど、整形して、フィルタリングしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240771/77b9de36-7f4f-edfa-1a54-6e29fb22ff7c.png)

#### コマンドで整形
`cat sample.json | jq .glossary` を Terminal から実行
整形できたが、見にくい、ここから VSCode で編集したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240771/0459b18b-e4a8-cb05-16df-7c63017bf0f3.png)

#### コードにパイプ
Terminal に `| code -` を追加して実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240771/2d8da21e-22e0-84f1-d489-6cd39bebf605.png)

#### 結果
Command で整形した結果を、Code に表示することができた。

# 参考文献
[stackoverflow How do I pipe output into Visual Studio Code?](https://stackoverflow.com/questions/39418452/how-do-i-pipe-output-into-visual-studio-code)
[Visual Studio Code Command Line Interface \(CLI\)](https://code.visualstudio.com/docs/editor/command-line)
LightGBMのインストール

LightGBMのインストール時にエラー終了の連続で苦戦したため、備忘録を予て**正しい**インストール方法を残しておくことにしました。

:warning: 現状LightGBMはPython3.9までの対応とGitHub上では表示が出ていますが、Python3.10でも問題無くインストールが出来ました。

# OpenMPのインストール
まず最初にOpenMPをインストールします。この行程を実行しなかった場合、怒濤のエラーメッセージが出力されインストールはエラー終了します。Logは大量にメッセージが出ている割にざっと読んでもどこに理由が有るのかよく分かりません。。。しかし、[公式](https://github.com/microsoft/LightGBM/tree/master/python-package#build-from-sources)にはOpenMPをまずインストールすることとの記載が有ります。

```bash
brew install libomp
```

# LightGBMのインストール
OpenMPのインストールが完了して漸くLightGBMのインストールが実施出来ます。

```bash
pip instakk lightgbm
```

筆者はPipenvを利用しているので以下のコードでインストールを実行しました。

```bash
pipenv install lightgbm
```

# Reference
https://zenn.dev/higan96/articles/4d6220e2251f5b
paiza.ioでelixir その191

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

# 練習問題
パイプラインを実装せよ。

# 参考にしたページ

https://qiita.com/Tsuyoshi84/items/0782c4a288cdb5d55f6a


# サンプルコード

```

defmodule MyTest do
    defmacro left ~> right do
        quote do
            unquote(left)
            |> unquote(right)
        end
    end
end

defmodule Main do
    import MyTest
    5
    ~> IO.puts
end


```

# 実行結果

```
5

```

# 成果物

https://paiza.io/projects/TpGjwNYn7Zgsx-R4Iqheyw

以上。
paiza.ioでelixir その190

# 概要
paiza.ioでelixirやってみた。
defmacro使ってみた。

# サンプルコード

```

defmodule MyTest do
    defmacro plus2mul({:+, meta, args}) do
	    {:*, meta, args}
	end
end

defmodule Main do
    import MyTest
    plus2mul(3 + 8)
    |> IO.inspect
end


```

# 実行結果


```
24

```

# 成果物

https://paiza.io/projects/atWfE29kpueuYGFV-y6qfg

以上。
Go言語のappendについて

Go言語のappend関数は、スライスの末尾に要素を追加する際に使用します。
以下はappend関数を使用してスライスに要素を追加する簡単な例を記載。

```go: golang sample
package main

import "fmt"

func main() {
    s := []int{1, 2, 3}
    s = append(s, 4, 5, 6)
    fmt.Println(s)
}
```

上記の例では、最初にsスライスに3つの要素を設定しています。次に、append関数を使用して、4, 5, 6の値を追加しています。append関数は、追加された後の新しいスライスを返しますので、それをsに再代入する必要があります。

また、append関数は、追加する要素が可変長引数として渡されるため、複数の要素を一度に追加できます。ただし、追加する要素は追加されるスライスの型に対応している必要があります。

以下は、スライスに別のスライスを追加する例です。

```go: golang sample
package main

import "fmt"

func main() {
    s1 := []int{1, 2, 3}
    s2 := []int{4, 5, 6}
    s1 = append(s1, s2...)
    fmt.Println(s1)
}
```

上記の例では、s1スライスにs2スライスを追加しています。...を使用してs2を展開する必要があります。s2を...なしで追加すると、コンパイルエラーになります。

Tipsとして、append関数を使用する際には、元のスライスに追加するのではなく、追加後のスライスを新しい変数に代入することをお勧めします。これにより、元のスライスが変更されないため、バグの発生を防ぐことができます。

https://pkg.go.dev/builtin#append