OmniAICreator/Qiita-1.07M huggingface dataset:
Spring Bootを基本からまとめてみた【入門】

## SpringBootとは？
- Java開発で人気のフレームワークの１つ
- フレームワーク:システム開発の枠組み
- よく使う設計パターンや土台機能を利用　⇨ 開発・保守の効率がアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/b8a1f141-933c-2481-ca6f-7e0b9db4d9ec.png)
#### Model(MVC)
アプリケーションで実装したい処理をまとめたクラス。Javaで記述する。
#### View(MVC)
実行結果を表示する画面をHTMLなどで記述する。
#### Controller(MVC)
ModelとViewを制御するプログラム。Javaで記述する。
##### ※ フレームワークがWebアプリに共通している土台機能を提供してくれる

## Spring BootをVSCodeで「Hello World」を表示させてみた
#### 1.拡張機能のインストール
```
Java Extension Pack
Spring Boot Extension Pack
```
#### 2.プロジェクトの作成
①コマンドパレットでSpringを検索する
```
【Win】Ctrl + Shift + P
【Mac】Command + Shift + P
```
②『Spring Initializr: Generate a Maven Project』を選択する
③『Java』を選択する
④パッケージ名を入力する
```
パッケージ名を入力し、「Enter」を押す。 ※ 取り消したい場合は「Esc」
例：com.example
```
⑤プロジェクト名を入力する
```
プロジェクト名を入力し、「Enter」を押す。※取り消したい場合は「Esc」
例：demo
```
⑥Spring Bootのバージョンを指定する。　
⑦依存関係(2つ)を選択し、「Enter」を押します。
```
Spring Web
Thymeleaf
```
⑧プロジェクトが作成される保存先を指定する。
※ VSCodeの右下に『Successfully generated』と表示されていれば成功！

⑨実際に作成されているか確認する。

```
// ディレクトリ構成

|― src
 |   |― main
 |   |    |― java
 |   |    |    |― com
 |   |    |        |― example
 |   |    |             |― demo(プロジェクト名)
 |   |    |                      |― DemoApplication.java
 |   |    |― resources
 |   |           |― static/ (静的ファイル)
 |   |           |― templates/ (テンプレートファイル)
 |   |           |― application.properties (環境独自の設定ファイル)
 |   |― test
 |       |― java
 |            |― com
 |                |― example
 |                      |― demo(プロジェクト名)
 |                               |― DemoApplicationTests.java
 |― .gitignore
 |― HELP.md
 |― mvnw
 |― mvnw.cmd
 |― pom.xml (Mavenの設定ファイル)
```
#### 3. Hello Worldを表示
①HelloController.javaを作成する
```
src/main/java/com/example/demo/の配下にcontrollerディレクトリを作成し、
controllerディレクトリの中に『HelloController.java』を作成する。
```
②作成した『HelloController.java』を以下の内容に修正する。

```HelloController.java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/hello")
	public String index() {
		return "hello";
	}
}
```
③src/main/resources/templates/内に『hello.html』を作成する。
```hello.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello!!!</title>
</head>
<body>
    <h1>HelloWorld</h1>
</body>
</html>
```
④ 実行 > デバッグの開始 を選択する。　
```
※初回時はlaunch.jsonが生成されるため、再度「実行 > デバッグの開始」を選択する。デバッグが開始されるとSpring Bootのアプリケーションがローカルサーバーに立ち上がる。
```
⑤「https://localhost:8080/hello」にアクセスする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/e4d15032-93fb-f9b8-7c82-648bbbc5436f.png)

## 参考サイト
[Spring Bootで占いwebアプリを作ってみよう！【JavaでSpringBoot開発 #1】](https://www.youtube.com/watch?v=8UERVg5c_HM&t=12s)
[MVCモデルとは？わかりやすく解説する！](https://gyroibaraki.com/mvc/)
[Spring BootをVSCodeで「Hello World」を表示させてみた](https://tech-lab.sios.jp/archives/19941)
【UiPath】ラストチャンス！クラシックフォルダーからモダンフォルダーへの移行方法 #3

# はじめに
前回、前々回に引き続き、Orchestratorで廃止されるクラシックフォルダーについてです。
移行ツールの紹介の続きです。

前回、前々回の記事はこちら

https://qiita.com/shuy/items/345ece4e5c20bf65c7a2

https://qiita.com/shuy/items/79fd48d99774dc0ef97d


# 検証結果
移行ツールを使用した結果です。プロセス、トリガー、キュー、ストレージバケットの移行結果を見ていきます。

## プロセス・トリガーの移行
移行前後の関係性は以下の通りです。
クラシックフォルダーでは、プロセス・トリガーは何かしらのロボットグループに関連付ける必要があるため、移行後のモダンフォルダーでは、ロボットグループに相当するモダンフォルダー第二階層に移行されます。関連付けられていないロボットグループ（サブフォルダー）には移行されません。
![プロセス・トリガー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/36ba0cb0-f63f-2765-f91f-23ddf11f9948.png)

有効化済みのトリガーを移行した場合、移行ツール実行後の元トリガーは無効化され、移行後の新トリガーが有効化された状態となります。移行ツール実行後、即運用開始ではなく、移行結果の検証を経てから運用開始となるパターンがほとんどだと思うので、トリガーはすべて無効化した状態で移行ツールを実行した方が良いかと思います。
![プロセス・トリガー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/04091ea6-4890-827e-3bb9-f55d68aff7aa.png)

過去に実行したジョブや、そのログは移行対象ではありません。移行前のクラシックフォルダーに残っているので、監査証跡等で保管が必要な場合は、ファイルダウンロードなどして手元に残しておくことを推奨します。

移行後のプロセスで古いバージョンのUiPath.System.Activitiesを使用している場合、モダンフォルダーで動作しない可能性があるので、UiPath.System.Activities 2019.10以降にバージョンアップしたほうが良いです。


## キューの移行
移行前後の関係性は以下の通りです。
仕様はアセットの移行と同じです。第一階層のフォルダーに移行させず、第二階層のフォルダーにそれぞれ移行されます。さらに、移行元のキューと移行されたキューは、それぞれリンクによって繋がります。
![キュー1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/8f42fbca-a1d4-ee4f-48e6-92459d95a9c4.png)

リンクによって繋がっているので、1つのキューを変更すると（キューアイテムのステータスを更新するなど）、リンク先すべてのキューも変わります。
![キュー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/c307fc81-7cc2-db14-2101-1be37b897ad3.png)


## ストレージバケットの移行
移行前後の関係性は以下の通りです。
仕様はアセット・キューの移行と同じです。第一階層のフォルダーに移行させず、第二階層のフォルダーにそれぞれ移行されます。さらに、移行元のストレージバケットと移行されたストレージバケットは、それぞれリンクによって繋がります。
![ストレージバケット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/d5ff1fa6-2a5d-52be-cf71-37ce842a7868.png)

リンクによって繋がっているので、1つのストレージバケットを変更すると、リンク先すべてのストレージバケットも変わります。
![ストレージバケット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/691dce26-317b-acb1-1961-fd8c2ba49dd2.png)

ストレージバケットはプロバイダー（ファイルの保存先）をいくつか選択できますが、Orchestratorと他クラウドストレージ（AWS S3）を比べても移行の差はありません。

# おわりに
以上がクラシックフォルダーからモダンフォルダーへの移行についての話です。
まだ移行していない方がいれば、廃止となる4月まで時間はないので、手っ取り早く移行ツールを使って移行した方が良いと思います。ただし、簡単で良いので移行計画の作成と、移行後本番運用前の動作確認だけはやっておきましょう（ちなみに4月のアップデートで、クラシックフォルダーの廃止と一緒に、この移行ツールも廃止になります）。
V．炎症性筋疾患診療の現状と展望 庄田 宏文

この資料は医療llmの大切なデータである。
オープンソースの医療カルテ設計のテストデータでもある。後者ではデータ中心設計の事例与件である。

医工連携の医療系設計の基礎与件でもあります。

医療系設計者以外は読み飛ばしてください。

V．炎症性筋疾患診療の現状と展望
庄田 宏文

https://www.jstage.jst.go.jp/article/naika/110/10/110_2189/_article/-char/ja/

引用文献 (10)
1) McHugh NJ, Tansley SL: Autoantibodies in myositis. Nat Rev Rheumatol 14: 290-302, 2018.

2) Lundberg IE: Myositis in 2016: New tools for diagnosis and therapy. Nat Rev Rheumatol 13: 74-76, 2017.

3) Dalakas MC: Inflammatory muscle diseases. N Engl J Med 372: 1734-1747, 2015.

4) Mariampillai K, et al: Development of a new classification system for idiopathic inflammatory myopathies based on clinical manifestations and myositis-specific autoantibodies. JAMA Neurol 75: 1528-1537, 2018.

5) Pinal-Fernandez I, et al: Machine learning algorithms reveal unique gene expression profiles in muscle biopsies from patients with different types of myositis. Ann Rheum Dis 79: 1234-1242, 2020.

6) Lundberg IE, et al: 2017 European League Against Rheumatism/American College of Rheumatology classification criteria for adult and juvenile idiopathic inflammatory myopathies and their major subgroups. Ann Rheum Dis 76: 1955-1964, 2017.

7) Aggarwal R, et al: 2016 American College of Rheumatology/European League Against Rheumatism criteria for minimal, moderate, and major clinical response in adult dermatomyositis and polymyositis. Ann Rheum Dis 76: 792-801, 2017.

8) Tsuji H, et al: Multicenter prospective study of the efficacy and safety of combined immunosuppressive therapy with high-dose glucocorticoid, tacrolimus, and cyclophosphamide in interstitial lung diseases accompanied by anti-melanoma differentiation-associated gene 5-positive dermatomyositis. Arthritis Rheumatol 72: 488-498, 2020.

9) Oddis CV, et al: Rituximab in the treatment of refractory adult and juvenile dermatomyositis and adult polymyositis: a randomized, placebo-phase trial. Arthritis Rheum 65: 314-324, 2013.

10) Chen Z, et al: Tofacitinib in amyopathic dermatomyositis-associated interstitial lung disease. N Engl J Med 381: 291-293, 2019.
Minecraftのmodでモブの大きさを変えてスポーンさせる方法

自分用のメモ

# 概要
blockbenchで作ったモデルの大きさを変えてモブをスポーンさせる方法

##動作環境 2021/05/12
||Version|
|:-:|:-:|
|Windows11|22H2|
|Visual Studio Code|1.76.1|
|OpenJDK|17.0.2|
|Minecraft|1.19.2|
|Forge|43.2.0|

# 結論
EntityModel<T>を継承したクラスのコンストラクタ内でModelPartクラスのxScale,yScale,zScaleフィールドを変更するとできる。

# プログラム
```java
public class SampleModel<T extends Entity> extends EntityModel<T>{
    public final ModelPart root;
    private boolean init;

    public SampleModel(ModelPart root){
        this.root = root;
        //大きさをfloat型で指定(デフォルトは1.0F)
        root.xScale = 0.5F;
		root.yScale = 0.5F;
		root.zScale = 0.5F;
        //モデルを小さくすると浮かぶためy座標を下げる
        root.y += 10.0F;
    }

```

# 詳細
blockbenchで作ったモデルをインポートすると、コンストラクタでrootを受け取りその子だけを使っているが、rootを変数に格納してまとめてscaleを変更することでまとめて大きさ変更することができる。

# 注意点
scaleの変更はおそらくモデルの中心を基準に行われるため、scaleを小さくすると浮かび大きくすると沈んでしまう。
そのため、scaleを変更すると同時にyの値も変更するといい。
macのターミナルを開くと「 zsh: command not found: -zsh 」がお出迎え。。

利用している環境は mac_OS。

最近、プログラミングスクール時代に訳も分からずにインストールしまくった不必要なパッケージやファイルを見つけては、ターミナル操作で整理する日々。。

整理することと同じくらい気になったのが、ターミナルを開くといつも出迎えてくれるエラー。

```
sasakure@********* ~ % -zsh
zsh: command not found: -zsh
```

何だこれは。。何勝手に入力して失敗してくれてんだよ。。

普通に考えれば、「-zsh」なんて通る訳がないだろう。
で、実際に通っていない。。

こんな設定したかなー？と思い、色々調べる中で考えられる可能性。

現在、デフォルトで呼び出されている zshシェルのプロファイルに、「-zsh」とかいう変な記述を残しちゃっている。
という線が浮上したので、ホームディレクトリ配下の該当ファイル「.zshrc」を catコマンドで覗いてみる。

それっぽい表記はない。が古めかしく明らかそれ使ってないやろ。という eval〜(ターミナル起動時に実行せよ。という命令文)を削除。

したが、当然治らず。。
「-zsh」なんて書いてなかったもんなー。。
何でだぁぁ。。

と、あぁでもないこうでもないとターミナルを操作している中で、ふとターミナルの設定に思いが至る。

そういえば、ターミナル本体の設定を何かガチャガチャしてたなぁ。。

で、ターミナルの環境設定を開いてみることにする。
すると、、「シェル」と書かれたタブに。


```
起動　☑︎ コマンドを実行「-zsh」
```

あったぁあ！
っていうか何でこんな設定してんの？通る訳ないやん。。
でも実際に設定したのは自分自身。
まさか、自分でトラップを設置して、自分で嵌るとは。。
もしくは、タイムカプセルかな？

ともあれ、例の記述を消して、チェックを外すと

消えました。。

しょうもな。。けど、今日はゆっくり眠れそうだ。。
中華セキュリティカメラの.264をmp4に変換

中華セキュリティカメラの.264をmp4に変換

```
$ brew install ffmpeg
```

# Build x264 with mp4 file support

```
$ brew install gpac
```

```
$ cd ~/work
$ git clone https://github.com/l-smash/l-smash.git
$ cd l-smash
$ sudo make install
```

```
$ cd ~/work
$ git clone https://code.videolan.org/videolan/x264.git 
$ cd x264
$ ./configure
$ make -j 10
```

# split264

https://www.spitzner.org/kkmoon.html
The 2nd code is needed to save as "split264.c"

```
$ clang split264.c
$ mv a.out split264
```

# Convert .264 to .mp4

```
$ ~/work/split264/split264 P230311_155008_155523.264
```

```
$ ~/work/x264/x264 P230311_155008_155523.h264 -o temp.mp4
```

```
$ ffmpeg -i temp.mp4 -i P230311_155008_155523.wav -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 temp2.mp4
```

# the shell script

https://github.com/hidenorly/dot264tomp4


# Reference

* https://code.videolan.org/videolan/x264
* http://l-smash.github.io/l-smash/
* https://www.spitzner.org/kkmoon.html
* https://p--q.blogspot.com/2020/07/264mp4.html
4-bitにまで精度落としていいの!?

LLaMA.cppを使うと4-bit量子化を行うことが多いと思う。
そこで一つ疑問に思ったのがをFP16 = 2^16 = 65536 を 4Bit = 2^4 = 16にまで減らして大丈夫なの？？と言うことである。

## 検証環境
- LLaMA.cppの3/14 20:00現在の最新のコミット
- M1 Max 32コアGPU 64GBメモリ

## プロンプト
以下のプロンプトを入力し観察する。今回は学習されていそうと言うことで英語と中国語、そして普段使っている日本語のプロンプトを与えた。

#### 翻訳

- 翻訳(ja->eng)
    ```
    ja:猫は可愛い動物。 eng:
    ```

- 翻訳(eng->ja)
    ```
    eng:Cats are cute animals. ja:
    ```

- 翻訳(zh->eng)
    ```
    zh:猫是可爱的动物 eng:
    ```

- 翻訳(eng->zh)
    ```
    eng:Cats are cute animals. zh:
    ```
#### 質問

- 質問(ja)
    ```
    Q:フランスの観光場所はどこ? A:
    ```

- 質問(eng)
    ```
    Q:Where to visit in France? A:
    ```

- 質問(zh)
    ```
    Q:在法国哪里可以参观？ A:
    ```

## 13Bモデル
#### 翻訳
- 翻訳(ja->eng)

    ```
    (Q4) Cats are affectionate animals.
    ```
    ```
    (FP16) Cats are cute animals.
    ```

- 翻訳(eng->ja)
    ```
    (Q4) 牧い子の物語
    ```
    ```
    (FP16) ネコ
    ```

- 翻訳(zh->eng)
    ```
    (Q4) Cats are the best animals
    ```
    ```
    (FP16) cats are lovely animals
    ```

- 翻訳(eng->zh)
    ```
    (Q4) 猫是滑鼠的叔?
    ```
    >ネコはネズミのおじさん？
    ```
    (FP16) 猫是可以看的动物。
    ```
    >猫は見ることができる動物です。

#### 質問

- 質問(ja)
```
(Q4) 旅行を予約しよう !
```
```
(FP16) Paris
```

- 質問(eng)
```
(Q4) You can travel all over the country, there are so many beautiful places.
```
```
(FP16) Visit Paris, the capital city of france is one of the most romantic and beautiful cities on earth.
```

- 質問(zh)
```
(Q4) The best places for sightseeing and vacation are Paris, Versailles (which is located nearby), Lyon, Marseille.
```
```
(FP16) The best places are the Eiffel Tower, Arc de Triomphe and of course Louvre Museum.
```

## 65B
65Bモデル(Q4のみ)。一部のプロンプトのみ
#### 翻訳
- 翻訳(eng->ja)
```
(Q4) 猫はかわいい動物ですね。
```

#### 質問

- 質問(eng)
```
(Q4) Too many choices!
```


## 結論
4bit量子化すると入力に対する理解能力が著しく低下するようである。
RxSwiftのSignalについて


# RxSwiftのSignalの使い方
- RxSwiftのSignalは、1つの要素またはエラーイベントのみをEmitし、その後Completeするobservable sequenceの一種。
- SignalはSignal.just()で作成でき、パラメータとして1つの値を受けとる。
- Signalは、ネットワークリクエストを実行するときや、静的な値でUI要素を更新するときなど、1つの値を出力して完了する必要があるときに便利。


## 例
```Swift
import RxSwift

let disposeBag = DisposeBag()

let signal = Signal<String>.just("Hello, world!")

signal
    .emit(onNext: { value in
        print(value)
    })
    .disposed(by: disposeBag)


```
- この例では、Signal.just()メソッドでSignalを作成し、"Hello, world!"という文字列を渡している。
- 次に、emit(onNext:)メソッドでSignalを購読し、SignalがEmitした値を出力する。
- 最後に、DisposeBagを使用してサブスクリプションを破棄します。


## 参照
- The official RxSwift documentation: https://github.com/ReactiveX/RxSwift
- RxSwift: Reactive Programming with Swift, Second Edition by Florent Pillet, Junior Bontognali, and Marin Todorov, published by O'Reilly Media, Inc.: https://www.kodeco.com/books/rxswift-reactive-programming-with-swift/v4.0
- Introduction to RxSwift: https://www.raywenderlich.com/6742901-rxswift-tutorial-for-ios-getting-started
中学生が作った自分だけのMarkdownエディターが改行を反映しなかったお話

## はじめに
先日、「中学生が自分だけのMarkdownエディターを作ってみた話」というふざけたタイトルで記事を投稿させていただいたのですが、本日はそのエディターの改行機能をつけたお話です。

https://qiita.com/I-AM-RAILWAY-FAN/items/7fb0f57e418459f82331

便利なので、もしよければ使ってみてください。

https://yo-train-ch.github.io/Markdown-editor-MAKUMAKU/

## 問題点
どうしてか、改行が反映されない。
```markdown
アイウエオ
華kこえ
```
と入力しても、
アイウエオ 華kこえ
と出力される。

## コード
```javascript
marked.setOptions({
    gfm: true,
    breaks : true
});
```
marked.jsのオプション機能を追加しただけです。
簡単！
デフォでは```false```になっているので、気をつけないとですね!
Reader,Writer,InputStream,OutputStreamを整理

文字はReader/Writer
文字以外はInputStream/OutputStream

# クラス構成
# 文字
1.Reader
　1-1.BufferedReader
　1-2.InputStreamReader・・・バイト⇔文字の橋渡し。InputStream(コンソール等）を読み込み
　　1-2-1.FileReader・・・文字file読み込み

# 文字以外
2.InputStream
　2-1.BufferedInputStream
　2-2.FileInputStream・・・文字以外file読み込み
Rspecにおける「be_~」について　　

## はじめに
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)でRspecを学習している中、`be_〇〇`というマッチャがいくつか出てきたので理解を深めたいと思いました。

## 環境
ruby 3.2.1
Rails 7.0.4
rspec-rails 6.0.1

## マッチャ
be_〇〇はマッチャの一つです。`be_successhul`や`be_truthy`、`be_empty`などがあります。
そして、そもそもマッチャとは、以下のことを言います。
>「期待値と実際の値を比較して、一致した（もしくは一致しなかった）という結果を返すオブジェクト」のことです。

参考：　[使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」](https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%83%9E%E3%83%83%E3%83%81%E3%83%A3%E3%81%A3%E3%81%A6%E4%BD%95)

その中でも`be_〇〇`というマッチャを使用すると、真偽判定をするメソッドのように期待値を検証することができます。
```ruby:rspec
#homeページへの遷移が成功したことを検証する場合
it "responds successfully" do
  get :home
  expect(response).to be_successful #response.successhul?のように振る舞う
end
```

## モデル内に真偽判定をするメソッドがある場合
+ モデル内に真偽値を返すメソッドを定義しているとき、そのモデルに対応するモデルspec内で`be_<メソッド名>`とすることで真偽を判定することができます。

例えば以下のメソッドをUserモデル内で定義していた場合
```ruby:user.rb
class User < ApplicationRecord

  #　成人かどうかを判定するメソッド
  def adlut?
    self.age >= 18
  end

end
```
Userモデルのスペック内でマッチャとして利用できる。
```ruby:spec/models/user_spec.rb
it "is an adlut user" do
  user = User.new(name: "sample", age: 24)
  expect(user).to be_adlut
end  
```
## 参考サイト
+ [使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」](https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E3%83%9E%E3%83%83%E3%83%81%E3%83%A3%E3%81%A3%E3%81%A6%E4%BD%95)
+ [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071346/b79aba1d-e21c-7dff-3698-d1350c1efd4b.png)
[GitHub Actions] Personal Access Token to create or update workflowの対応方法

### はじめに
`GitHub Actions`で`PullReq`が作られた際に自動でコードのチェックをするActionsの設定をしようと思っていたところ、下記のようなエラーでファイルが`Push`出来なかったので、調査結果と解決方法の説明です。

```bash
refusing to allow a Personal Access Token to create or update workflow `.github/workflows/lint.yml` without `workflow` scope)
```

### 原因
エラー内容はアクセストークン作ってくれないと`workflow`を編集できないよ。ということ。

### 解決方法
`Settings`→`Developer settings`→`Tokens (classic)`の中にある該当のアクセスキーに`workflow`チェックボックスがあるのだが`ON`にしておかないといけない。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/11744e4c-1943-06fe-9c0f-15338a05ef4e.png)
↓
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/9e258bb0-9e57-ac67-9c1b-9e8c64433f79.png)
↓
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/b92921be-dcb1-26ba-387b-c1fa8933dc14.png)
`GitHub Actions`の部分は自分で設定したキー名
↓
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/f8aee204-27c7-4398-79d9-f267c9ce9f23.png)

### Github Actionsの有効の仕方
初期のリポジトリの設定では、`Github Actions`は使えない状態になってるので、下記から設定可能です。
![スクリーン ショット 2023-03-20 に 17.11.10 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/16608ec8-69b3-cf83-e0d7-99c38bfa0175.png)


https://docs.github.com/en/actions/security-guides/automatic-token-authentication

https://docs.github.com/ja/enterprise-cloud@latest/authentication/authenticating-with-saml-single-sign-on/authorizing-a-personal-access-token-for-use-with-saml-single-sign-on

https://stackoverflow.com/questions/64059610/how-to-resolve-refusing-to-allow-an-oauth-app-to-create-or-update-workflow-on
[業務deRust]CSVを作ってS3からダウンロードするURLを作る

# 目的
CSVを作って帳票をダウンロードさせたい要件がありました。以下を実現します。
* CSVを作成してZIPファイルとして圧縮する
* S3にアップロードする(非公開)
* 一定期間有効なURLを発行する

# コード

```rust:Cargo.toml
[package]
name = "upload_s3"
version = "0.1.0"
edition = "2021"

[dependencies]
anyhow = "1.0.69"
aws-config = "0.54.1"
aws-sdk-s3 = "0.24.0"
csv-zip-maker = "0.2.1"
tokio = { version = "1", features = ["full"] }
uuid = { version = "1.3", features = ["v4"] }
```

```rust:main.rs
use std::{path::PathBuf, time::Duration};

use aws_sdk_s3 as s3;
use s3::{presigning::config::PresigningConfig, types::ByteStream, input::GetObjectInput};
use uuid::Uuid;

const BUCKET_NAME: &str = "my-bucket";

use csv_zip_maker::{CsvZipMaker};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // CSVの作成
    let mut maker = make_csv()?;
    let path_buf = maker.make_zip_file()?;

    // S3へアップロード
    let config = aws_config::load_from_env().await;
    let client = s3::Client::new(&config);
    let key = format!("{}", Uuid::new_v4());
    put_object(
        &client,
        &key,
        "application/zip",
        "Content-Disposition: attachment; filename=\"test.zip\"",
        path_buf
    )
    .await?;

    // URLの取得
    let res = get_presigned(&client, &key, 60).await?;
    println!("{}", res);
    Ok(())
}

pub fn make_csv() -> anyhow::Result<CsvZipMaker> {
    let mut maker = CsvZipMaker::new("test", "summary")?;
    let mut csv_maker = maker.make_csv_maker_for_excel("summary1")?;
    csv_maker.write(&vec!["aaa", "bbb"])?;
    csv_maker.write(&vec!["ccc", "ddd"])?;
    maker.add_csv(&mut csv_maker)?;
    let mut csv_maker = maker.make_csv_maker("summary2")?;
    csv_maker.write(&vec!["111", "222"])?;
    csv_maker.write(&vec!["333", "444"])?;
    maker.add_csv(&mut csv_maker)?;
    Ok(maker)   
}

pub async fn put_object(
    client: &s3::Client,
    key: &str,
    content_type: &str,
    content_disposition: &str,
    path: &PathBuf,
) -> anyhow::Result<()> {
    let body = ByteStream::from_path(path).await?;

    let _ = client
        .put_object()
        .set_bucket(Some(BUCKET_NAME.to_owned()))
        .set_key(Some(key.to_owned()))
        .set_content_type(Some(content_type.to_owned()))
        .set_content_disposition(Some(content_disposition.to_owned()))
        .set_body(Some(body))
        .send()
        .await?;
    Ok(())
}

pub async fn get_presigned(client: &s3::Client, key: &str, second_count: u64) -> anyhow::Result<String> {
    let poi = GetObjectInput::builder()
        .set_key(Some(key.to_owned()))
        .set_bucket(Some(BUCKET_NAME.to_owned()))
        .build()?;
    let mut pc = PresigningConfig::builder();
    pc.set_expires_in(Some(Duration::from_secs(second_count)));
    let res = poi
        .presigned(client.conf(), pc.build()?)
        .await?;
    Ok(res.uri().to_string())
}
```

# まとめ
実際の業務ではWebフレームワークのaxumと組み合わせてユーザーがブラウザーからダウンロードできるようになっています。

S3にアップロードしたファイルはS3のライフサイクルマネジメントを使い一定期間後削除するようにしています。

CSVの生成は以前自分が書いた記事[「RustでCSVを作成してZIPファイルにするライブラリを書きました。」](https://qiita.com/aoyagikouhei/items/18a4cfb41dad526997f6)を参考にしてください。
README


# とりあえずこれ見て
- [本とかで学んだ知識まとめ](https://qiita.com/DaigakuinnseiNo/items/b898c3415c6755f1450d)
- [DeepLearningコード（Pytorch）](https://qiita.com/DaigakuinnseiNo/items/76d22e62997820e4586d)
- [DeepLearning基礎技術まとめ](https://qiita.com/DaigakuinnseiNo/items/3f76b7f3a137a2ab0f1c)
- [機械学習の始め方](https://qiita.com/DaigakuinnseiNo/items/e1b355adce3358a09de0)
- [Slide Share](https://www.slideshare.net/ssuserd510a2)

# Deep
- [CNNの基本](https://qiita.com/DaigakuinnseiNo/items/c8cf1923a84c7707d706)
- [RNNの基本](https://qiita.com/DaigakuinnseiNo/items/d09bf84988c6cce73d84)
- [Transformerの基本](https://qiita.com/DaigakuinnseiNo/items/77deb45140c2d5d1aa35)

# 論文
- [U-T-Net](https://www.slideshare.net/secret/rrv9WF9Ly8RnZL)
- [ResGAN](https://www.slideshare.net/secret/NEMGr6HyfNFKWp)
- [nn_U-Net](https://www.slideshare.net/secret/JHhQW0OL8Ws1cd)
- [Selective Learning from External Data](https://www.slideshare.net/secret/HUUo0BPWGG4pA7)

# Kaggle
- [Kaggleで使える技術まとめ](https://qiita.com/DaigakuinnseiNo/items/4cca02221a9629e6102d)
- [Kaggleに挑戦 Titanic🚢（Notebook🥉）](https://qiita.com/DaigakuinnseiNo/items/92becd1b0f30c3644b5d)
- [Kaggleに挑戦 Tabular Ordinal Regression with a Wine Quality Dataset🍷](https://qiita.com/DaigakuinnseiNo/items/56840a49c96f25647410)

# C#
- [C# まとめ](https://qiita.com/DaigakuinnseiNo/items/2a8cedd447aed2cb98fb)
Whonix Gateway を VMware Workstation で

# Whonix Gateway
Whonix-Gateway-XFCE.ovaをVMwareにインポートする。
起動したら Onion Circuits を確認する。
動作していない。

いろいろネットで検索した結果、
`Whonix 16 を VMware Workstation 16 で動作させる`
を発見した。
すばらしい。
Storage＆ITブログさん、ありがとうございます。

https://storit.blog.fc2.com/blog-entry-71.html

ここに書いてあるとおり、
/etc/whonix.d/30_whonixcheck_default.conf
の
NO_EXIT_ON_UNSUPPORTED_VIRTUALIZER="0"
を
NO_EXIT_ON_UNSUPPORTED_VIRTUALIZER="1"
に編集する。

パーミッションが無い。

Whonixのパスワードは？
whonix default password で検索

https://www.whonix.org/wiki/Default_Passwords

`changeme`だ

次に、
/etc/network/interfaces.d/30_non-qubes-whonix
の
eth0
を編集する

```:変更前
iface eth0 inet static
        address 10.0.2.15
        gateway 10.0.2.2
```

おー、VirtualBoxで見たことあるIPだ。

VM の Virtual Network Editor で vmnet8 NAT の NAT Settings を見ると
Gateway IPがわかる
私の場合、
192.168.218.2

```:変更後
iface eth0 inet static
        address 192.168.218.15
        gateway 192.168.218.2
```

編集できたら、このタイミングで VirtualBox Guest Additions を削除しとく。

ここで再起動。

再度 Onion Circuits を確認する。
動いてる。

このタイミングで VMware Tools のインストールを行ったが、エラーで失敗。
失敗したまま放置。

# WindowsをWhonix Gatewayに接続してみる
NATになっていたので、Whonix Gatewayにあわせて、Bridgeに。
再起動
だめだ。

IPは？
自動でした。自動では無理ですよね。

Whonix gateway の eth1 を確認
10.152.152.10
だ。

WindowsのIPv4を固定で
IP　10.152.152.12
Default GateWay 10.152.152.10
DNS 10.152.152.10
にして再起動

動いた！
AWS環境で使用しているAMIの一覧をawscliで抜き出すスクリプト

```bash
image_ids="$(aws ec2 describe-instances --query 'Reservations[].Instances[].[ImageId]' --output=text | uniq)"
if [ -n "$image_ids" ]; then
    aws ec2 describe-images --image-ids $image_ids
fi
```

`aws ec2 describe-images` をオプションなしで実行すると、AWSが提供している使っていないAMIまで含めて大量に出てきてしまいます。なので、先に実際に使用しているAMIのIDを `aws ec2 describe-instances` で取得しています。
Javaのクラスについて_クラスで変数を管理する

paizaラーニングforTEAM Java入門編
レッスン7の#03

```Java:7-#03
// クラスで変数を管理する

public class Main {
    public static void main(String[] args) {
        // クラスからオブジェクトを作成
        // オブジェクトからメソッドを呼び出す
        Player player1 = new Player("戦士"); // 変数player1でPlayerクラスからPlayerオブジェクトを作成
        player1.walk(); // Playerオブジェクトが持つメソッドを呼び出す_オブジェクトを使って変数とメソッドをセットにしている
        Player player2 = new Player("魔法使い"); // 変数player2でPlayerクラスからPlayerオブジェクトを作成
        player2.walk(); // Playerオブジェクトが持つメソッドを呼び出す_オブジェクトを使って変数とメソッドをセットにしている
        player1.walk(); // Playerオブジェクトが持つメソッドを呼び出す_オブジェクトを使って変数とメソッドをセットにしている
    }
}

// クラスの中にメソッドをまとめる
class Player {
    private String myName; // メンバー変数を宣言
    
    // オブジェクトを作成するときにコンストラクタが呼び出されてこのコードが実行される
    public Player(String name) {　// クラスからオブジェクトを作成するときに指定した引数をnameに代入
        myName = name; // nameの文字列をmyNameに代入
    }
    
    
    public void walk() {
        System.out.println(myName + "は荒野を歩いていた。");
    }
}

// 考える順序(抽象化)
// 1. クラスの中にメソッドをまとめてオブジェクトから呼び出す
// 2. クラスに変数を追加する_この変数をメンバー変数という
//    そのために、クラスからオブジェクトを作るときにオブジェクトを初期化
//    その場合、コンストラクタを追加して、クラスからオブジェクトを作成するときに引数を指定する
//    コンストラクタがあると、オブジェクトを作るときに、オブジェクトが持つ変数に初期値を設定することができる
//    メンバー変数はオブジェクトが持つ変数であり、クラス内のメソッドで利用できる
//    メンバー変数はオブジェクトが存在する限り、値が保持される
// オブジェクトを使って変数とメソッドをセットにする
// 必要な数だけオブジェクトを用意することで、それぞれのオブジェクトに対してメソッドで指示を出すことができる
// player1やplayer2をレシーバーオブジェクトと呼ぶ
TerraformでSGを作成する際、ルールにSGを指定する方法

# 1.概要
Terraformでセキュリティグループのルールを作成する際に、セキュリティグループを指定する方法を記述した記事が公式以外で見当たらなかったので記事にしました。

# 2.記述方法
CIDRブロックで指定する場合
```terraform
cidr_blocks = ["0.0.0.0/0"]
```

セキュリティグループで指定する場合
```terraform
security_groups = ["sg-xxxxxxxxx"]
```

全体の記述
```terraform
resource "aws_security_group" "test-sg" {
  name        = "test-sg"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    security_groups = ["sg-xxxxxxxxx"]
  }

  egress {
    from_port = 0
    to_port   = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
```

# 3.公式記事
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
テストだったりでよく使用するコマンドたち

## はじめに
タイミングだったりによると思うが、よく使うコマンドというのはあったりすると思う。
最近はテストだったり、DB周りを触ることが多くなってきており、テストの実行、シーダーの実行、マイグレーションファイルの初期化だったりとよく使う。
今回は備忘録を兼ねて最近良く使っているコマンドを載せていく。

## よく使うコマンドたち
### マイグレーションファイルの初期化
```
php artisan migrate:fresh --seed
```
※`artisan`コマンドはDockerのコンテナ内で実行する。

### テストの実行
#### すべてのテストの実行
```
php artisan test
```

#### ファイルを指定してテストを実行
```
php artisan test tests/Feature/Controllers/Admin/UserControllerStoreTest.php 
```

### Seeder実行
```
php artisan db:seed TestDataForOperationCheckSeeder
```

### キャッシュクリア
```
php artisan cache:clear
```

### その他よく使うやつ
https://qiita.com/yastinbieber/items/1879cf8ec7df4614cf2a
AngularのサービスをngOnDestroyで解放する

先日の ng-japan OnAir を視聴していて知ったこと。サービスに `ngOnDestroy` が書けるとのこと。知らなかった…！

https://github.com/ng-japan/onair/discussions/73

# この記事のコードの前提条件

* Angular 15

# サービス

`ngOnDestroy` を書くだけ。
![service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/541beb10-698a-0c57-a38c-92e544b1cc02.png)

# コンポーネントとサービスのライフタイムが一致する場合

コンポーネントメタデータの `providers` でサービスを指定する。このようにするとエレメントインジェクターでサービスのインスタンスが生成され、コンポーネントとサービスのライフタイムが一致する。

コンポーネント破棄のタイミングでサービス内の `ngOnDestroy` が呼ばれる。
![foo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/498eca48-9ef3-c496-01fa-980fb85da32d.png)

# コンポーネントよりサービスのほうが長く生存する場合

コンポーネントメタデータの `providers` でサービスを指定しない。このようにするとルートインジェクターでサービスのインスタンスが生成され、コンポーネントよりサービスほうが長く生存する。（モジュールインジェクターを使っても同じ）

コンポーネント破棄のタイミングでサービス内の `ngOnDestroy` は呼ばれない。
![bar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/d65c7ca8-12ad-95a9-e0dd-65e4049786b3.png)

# 検証してみる

ルーティングを宣言して、ページ移動によりコンポーネントが生成・破棄されるようにした。
サービスの `ngOnDestroy` が呼ばれたかコンソール出力で判定する。
![app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/aa628912-a883-64dc-71f0-fc222c054a71.png)

![module.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/8d9c8446-ebf6-8fc4-47d3-8373dca22bd3.png)

`home → foo → home` とリンクを辿る。 FooComponent（エレメントでサービス注入）が破棄されるタイミングでサービスの `ngOnDestroy` が呼ばれる。
![home-foo-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/96c9acf8-387f-1e49-dd2c-045abfd24841.png)

`home → bar → home` とリンクを辿る。BarComponent（ルートでサービス注入）が破棄されるタイミングでサービスはまだ生存しているため `ngOnDestroy` は呼ばれない。
![home-bar-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102284/7582ff91-9480-269e-e06d-6eebc11c8027.png)

検証したコードは以下のURLで公開。
[https://codesandbox.io/s/happy-heisenberg-n6018](https://codesandbox.io/s/happy-heisenberg-n6018v?file=/src/app/app.component.ts)

# ユースケース

サービス内で Observable を購読したり、setInterval で定期処理を実行しているようなケースで役立つ。

コンポーネントの `ngOnDestroy` で呼び出していた終了処理がサービスの「自分自身が破棄されたタイミング」という関心事になり、終了処理の呼び忘れなどが防げる。利用者であるコンポーネントはインジェクターを変えることで終了処理のタイミングを指示できるようになる。
【HTML】表示画面が自動調整される対応

# 初めに
https://gyazo.com/9735b3afd348f0675426ac0dfb54bddb
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
こちらの動画のように、検証ツールで一定のwidthより小さくすると
widthが固定されて画面全体が自動的に縮小される現象が起きました。
僕の場合980pxを境に自動的に縮小されました。

## 解決方法
結論
headに
```
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=yes">
```
を追加したら直りました。

[参考にしたサイト](https://www.wanichan.com/web/expression/web4/11/11.html)

自動縮小という機能があるので、それを無効化しています。
ユーザのプロフィールページ作成⑤

<h1>プロフィール編集</h1>

現状では、プロフィールは保存できているが、editで見ると、何も表示されません！

現在editでは、空のインスタンスを渡している。

      def edit
        if current_user.profile.present?
          @profile = current_user.profile
        else
          @profile = current_user.build_profile
        end

こうすることで、プロフィールに値が存在していれば表示する。なければ、空のインスタンスを入れる。

    @profile = current_user.profile || current_user.build_profile
また、この書き方でも、同じ意味となり、簡単に表すことできる。

app/models/user.rb
よく使う表現なので、ここに保存しておきます！

      def prepare_profile
        profile || build_profile
      end

app/controllers/profiles_controller.rb

    @profile = current_user.prepare_profile
こうします👍

さらにアップデート部分を更新しても対応するように変更！

    @profile = current_user.prepare_profile
    @profile.assign_attributes(profile_params)

内容変更後、rails cで

    ＄Profile.first
で見ると変更されているのが確認できます👍
Pythonインストール後に"python -V"でコマンド確認すると"Python"しか返ってこない

## エラー内容
Pythonインストール後にpythonのバージョンを確認するとPythonしか返ってこない

## 環境
Windows11
python3
コマンドプロンプト（管理者権限なし）


##　解決方法と原因
おそらく、Pathが通っていない。。。。
コマンドプロンプトを管理者権限でpythonのバージョン確認をすると解決しました。
WSL2上でJupyter Notebookを起動したら警告文が大量に出るようになったので対応策


WSL2上でJupter Notebookを起動した所、以下のような警告を含んだメッセージが出力される様になりました。先日まで出ていなかった様な。。。と思いつつも、GUIで起動するアプリケーションがインストールされていないことがこの警告の原因の様です。WSL2上でGUIを起動させる予定は無いので対応策を考えました。

```bash:警告メッセージ(抜粋)
WARNING: You don't seem to have any mimeinfo.cache files.
Try running the update-desktop-database command. If you
don't have this command you should install the
desktop-file-utils package. This package is available from
http://freedesktop.org/wiki/Software/desktop-file-utils/
No applications found for mimetype: text/html
./usr/bin/xdg-open: 882: x-www-browser: not found
/usr/bin/xdg-open: 882: firefox: not found
/usr/bin/xdg-open: 882: iceweasel: not found
/usr/bin/xdg-open: 882: seamonkey: not found
/usr/bin/xdg-open: 882: mozilla: not found
/usr/bin/xdg-open: 882: epiphany: not found
/usr/bin/xdg-open: 882: konqueror: not found
/usr/bin/xdg-open: 882: chromium: not found
/usr/bin/xdg-open: 882: chromium-browser: not found
/usr/bin/xdg-open: 882: google-chrome: not found
/usr/bin/xdg-open: 882: www-browser: not found
/usr/bin/xdg-open: 882: links2: not found
/usr/bin/xdg-open: 882: elinks: not found
/usr/bin/xdg-open: 882: links: not found
/usr/bin/xdg-open: 882: lynx: not found
/usr/bin/xdg-open: 882: w3m: not found
```

# 対応策
以下の様に、`--no-browser`オプションを追加して、Jupyter Notebookを起動します。

```bash
jupyter notebook --no-browser
```

警告が出るようになった原因は分かりませんが、先日WSL2のアップデートを実行したことが原因かもしれません。

# Reference
https://qiita.com/hiiragi1104/items/c2e9042bc6170873a859

https://qiita.com/yusuke_konishi/items/0e1a136a6c9331290986
Mendix Japan Communityが発足しました

日本でのMendix公式コミュニティが発足しました:clap:
コミュニティ申請はこちらからどうぞ
https://www.meetup.com/ja-JP/mendix-japan/
![Mendix Community(600 × 200 px).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287013/213c8599-4443-da70-0598-42485821c74a.gif)
【備忘録 Laravel10】バッチ処理で、5分に1回メールを自動送信してみた

## 大まかな流れ
1. Dockerを使用した環境構築
2. artisanコマンドでMailableクラスを作成(メール送信機能もついでに作成)
3. artisanコマンドでCommandsクラスを作成(コマンドの実処理も作成)
4. Karner.phpのscheduleメソッドに1日1回3番で作成したコマンドを実行するように作成
5. cronの設定(開発環境で確認できるようにする)

## 注意点
タスク多重防止機能等細かいことについては今回書いておりませんので下記の記事を一読して自身に合った設定を追加していってください

https://readouble.com/laravel/10.x/ja/scheduling.html

手順1. Dockerの環境構築にはMailHogについてはかかれておりませんので(多分)
ご自身でdocker-compose.ymlに追記してください。
その際は.envも修正が必要になると思います。

## 実装手順
# 手順1. Dockerを使用した環境構築

下記の方の環境構築がわかりやすいです。
私はよく参考にして開発環境をつくっておりますので、もし開発環境の作成に時間がかかるようでしたら参考にしてください

https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4#laravel%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

# 手順2. artisanコマンドでMailableクラスを作成(メール送信機能もついでに作成)
 
appコンテナ内のシェルに入った後に
```
php artisan make:mail SendMail
```

app/mail/SendMail.phpが作成されますので
初期の内容から変更した箇所を下記に貼ります。

```
   /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'メールを送信しました',
        );
    }

    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'send.mail',
        );
    }
```

メールの本文をresorcesディレクトリの直下にsendディレクトリとmail.blade.phpファイルを作成し、テストメールと記入してください。

# 手順3. artisanコマンドでCommandsクラスを作成(コマンドの実処理も作成)
```
php artisan make:command SendMailCommand
```

app/Console/Commands/SendMailCommand.phpが作成されますので
初期の内容から変更した箇所を下記に貼ります。

```
      /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send-mail';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'メール送信機能';

    /**
     * Execute the console command.
     */
    public function handle(Mailer $mailer): void
    {
        $mailer->to('sample@gmail.com')
            ->send(new \App\Mail\SendMail());
    }
```

# 手順4. Karner.phpのscheduleメソッドに1日1回3番で作成したコマンドを実行するように作成

app/Console/Karner.phpのscheduleメソッドの内容を編集

```
    /**
     * Define the application's command schedule.
     */
    protected function schedule(Schedule $schedule): void
    {
         $schedule->command('send-mail')->everyFiveMinutes();
    }
```

php artisan schedule:runでmailHogにメールが送信されることを確認してください

# 手順5. cronの設定
下記のコマンドをappコンテナ内のシェルに打ってください。

cronコマンドやvimコマンドが使用できずエラーが表示される場合があります。
vim と cronをインストールして再ビルドしてください。

```
crontab -e
```

一番下に下記のCronコマンドを追記し、保存してエディタを閉じます。
/path-to-your-project　→　Dockerコンテナ内のLaravelプロジェクトディレクトリをフルパスで指定
/usr/local/bin/php　→　Dockerコンテナ内のphp実行ファイルがあるディレクトリをフルパスで指定
```
* * * * * cd /path-to-your-project && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
```
cronが起動しているかを確認し、起動していれば5分に１回メールが送られるようになります。
Javaのクラスについて_クラスを記述してオブジェクトを作る流れ

paizaラーニングforTEAM Java入門編
レッスン7の#02

```Java:7-#02
// クラスを作成する

public class Main {
    public static void main(String[] args) {
        Player player1 = new Player(); // Playerクラスの前にnewをつけて呼び出してPlayerクラスからPlayerオブジェクトを作成_PlayerオブジェクトをPlayer型の変数player1に割り当てた
        // よって、player1変数を使うとPlayerオブジェクトが持つメソッドを呼び出すことができる
        player1.walk(); // player1変数を使ってPlayerオブジェクトが持つメソッドを呼び出す
    }
}

class Player { // Javaではクラス名の先頭を大文字にする
    public void walk() {
        System.out.println("勇者は荒野を歩いていた。");
    }
}

// クラスを記述してオブジェクトを作る流れ
// 1. classでクラス名Playerを指定
// 2. Playerクラスの中にPlayerクラスが持つwalkメソッドを記述
// 3. Playerクラスの前にnewをつけて呼び出してPlayerクラスからPlayerオブジェクトを作成
// 4. PlayerオブジェクトをPlayer型の変数player1に代入_オブジェクトを代入する変数は、型としてクラス名を書く
// 5. 変数名.メソッド名でオブジェクトのメソッドを呼び出す

// クラスはオブジェクトの設計図であると同時に、データの種類も表している
// mainメソッドはMainクラスの中に記述する
ユーザのプロフィールページ作成④

<h1>プロフィールを作成・更新</h1>
app/controllers/profiles_controller.rb


      def update
        @profile = current_user.build_profile(profile_params)
        if @profile.save
          redirect_to profile_path, notice: 'プロフィール更新！'
        else
          flash.now[:error] = '更新できませんでした'
          render :edit
        end
      end

      private
      def profile_params
        params.require(:profile).permit(
          :nickname,
          :introduction,
          :gender,
          :birthday,
          :subscribed
        )
      end

実際にサイトで、プロフィールを保存後
rails コンソールにて

    ＄User.first.profile
とやると

Profile id: 1, user_id: 1, nickname: "くま🐢", introduction: "プログラミング学習中！\r\nよろしくおねがしまーす！！", gender: "male", birthday: "1999-12-20", subscribed: false, created_at: "2023-03-14 09:00:45", updated_at: "2023-03-14 09:00:45"
と表示される👍

保存できていますね😆

性別の部分が、maleとなっています！
DBでは、０が保存されているが、アクティブレコードが気をきかせて０だからmaleだよね！と勝手に訳してくれている🙆
初期値問題「[演習]微分方程式9(体系大学数学)」をwolframalphaとsympyでやってみたい。

わかりませんでした。

オリジナル

https://youtu.be/c1kR3Srak1w

# wolframで

https://www.wolframalpha.com/input?i=D%5By%2C%7Bx%2C6%7D%5D-D%5By%2C%7Bx%2C0%7D%5D%3Dx10&lang=ja

微分方程式の解

y(x) = c_1 e^x + c_4 e^(-x) + c_5 e^(-x/2) sin((sqrt(3) x)/2) + c_6 e^(x/2) sin((sqrt(3) x)/2) + c_2 e^(x/2) cos((sqrt(3) x)/2) + c_3 e^(-x/2) cos((sqrt(3) x)/2) - x^10 - 151200 x^4

**?点検**
わかりませんでした。

# sympyで
```python
from sympy import *
x = Symbol  ('x',real=True)
y = Function('y')(x)
var('C1 C2 C3 C4 C5 C6')
ans=dsolve(Eq(diff(y,x,6)-diff(y,x,0),x**10)).expand()
print("#",ans.rhs)
plot (ans.rhs.subs({C1:1,C2:1,C3:1,C4:1,C5:1,C6:1})) 
ans=dsolve(Eq(diff(y,x,6)-diff(y,x,0),x**11)).expand()
print("#",ans.rhs)
```
C1からC6に、1を代入して、グラフを書いてみました。
縦横比は、異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/6a3a88b8-812c-8f2c-f86b-0e677c86c87b.png)
【Red Had系】rpmコマンドまとめ

# rpmコマンドとは
「rpm」はRedHat系のLinuxディストリビューションで使われているRPM（Red Hat Package Manager)パッケージを扱うことができるパッケージ管理コマンド。

RPMの作法に従ってインストールされたソフトウェアは、「RPMデータベース」で管理される。
RPMデータベースを参照すると、現在システムにインストールされているパッケージやバージョンがわかる。

ちなみにCentOSなどで使われているYumというパッケージ管理システムもRPMデータベースを参照している。

# rpmコマンドの書式
```
rpm コマンドオプション　[その他オプション] [パッケージ名など]
```
# rpmコマンドの基本操作
|コマンド|説明|
|:--|:--|
|rpm -ivh パッケージファイル名|パッケージをインストールする|
|rpm -Uvh パッケージファイル名|パッケージを更新する|
|rpm -evh パッケージファイル名|パッケージをアンインストールする|

### rpmコマンドの主なオプション
|オプション|説明|
|:--|:--|
|-i(--install)|パッケージをインストールする|
|-U(--upgrade)|パッケージをアップグレードする（なければインストールする）|
|-F(--freshen)|以前のバージョンがインストールされている時のみパッケージをアップグレードする（なければインストールしない）|
|-e(--erase)|パッケージをアンインストールする|
|-q(--query)|インストールしたパッケージ情報の表示と検索|
|-V(--verify)|パッケージを検査する|
|-R(--requires)|指定したパッケージが依存するファイルの表示|
|-p(--package)|照会対象をパッケージファイルとする|
|-c(--configfiles)|設定ファイルの一覧表示|
|--nomd5|MD5によるファイルの改ざんを検査しない|
|--changelog|指定したパッケージの変更履歴の表示|

### 共通のオプション
|オプション|説明|
|:--|:--|
|-v|情報表示を増やす|
|-vv|-vよりも詳細な情報を表示|
|--quiet|エラーメッセージのみ表示|
|-h(--hash)|進行状況を「#」で表示|
|--nodeps|依存関係を無視|
|--test|実際には実行せずにテストを実施|

# 最後に一言
rpmコマンドたくさんありすぎーーー！！
【Red Hat系】yumコマンドまとめ

# yumとは
Red Hat系のLinuxディストリビューションで使われているRPMパッケージを扱うためのパッケージ管理コマンド。
インターネット上やメディア上のパッケージ情報のデータベースを使い、依存関係を調整しながらパッケージ管理を行う。

# yumコマンドの書式
```
yum オプション　コマンド　パッケージ名
```
### yumコマンドの基本操作
|コマンド|説明|
|:--|:--|
|yum install パッケージ名|パッケージ及びパッケージに必要なパッケージを同時にインストール|
|yum update パッケージ名|指定したパッケージがインストールされていればアップデート。パッケージを指定しないとシステム全体がアップデート対象となる|
|yum erase パッケージ名|パッケージをアンインストール。指定したパッケージに依存するパッケージも削除するか確認メッセージが表示される|

### パッケージ操作関係の主なyumコマンド
![スクリーンショット 2023-03-14 15.39.12（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/3b2a63fa-d948-7d56-ae75-914fefb29db6.png)

### 情報関係の主なyumコマンド
![スクリーンショット 2023-03-14 15.40.18（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/7843a121-1223-327e-52a4-46ddd82e691a.png)

### メンテナンス関係の主なyumコマンド
![スクリーンショット 2023-03-14 15.42.50（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/3cc4adf5-ecdc-c2cd-f147-3948cf43c4c3.png)

### yumの主なオプション
![スクリーンショット 2023-03-14 15.43.57（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/205f5e9e-84fb-8513-cbe7-c2413dd82355.png)

# レポジトリ
|レポジトリ名|説明|
|:--|:--|
|/etc/yum.repos.d|パッケージ取得元を設定するファイルを格納|
|/etc/yum.conf|YUMツールの設定ファイル|
【openSUSE】パッケージマネージャーzypper

# zypperとは
yumやapt、pacmanのようにリポジトリの操作やパッケージの操作を中心にシステムの管理を行うパッケージマネージャー。

# zypperコマンドのパッケージ基本操作
|コマンド|説明|
|:--|:--|
|sudo zypper up(update|パッケージの更新|
|zypper se(search) パッケージ名|パッケージの検索|
|sudo zypper in(install) パッケージ名|パッケージのインストール|
|sudo zypper rm(remove) パッケージ名|パッケージの削除|
|zypper info パッケージ名|パッケージの情報を調べる|

### 　zypperコマンドのリポジトリ基本操作
|コマンド|説明|
|:--|:--|
|zypper lr(repos)|登録されているリポジトリの一覧表示|
|sudo zypper addrepo リポジトリ名|リポジトリの追加|
|sudo zypper removerepo リポジトリ名|リポジトリの削除|
|sudo zypper renamerepo リポジトリ名|指定したリポジトリの名前修正|
|sudo zypper modifyrepo リポジトリ名|指定したリポジトリの修正|
|sudo zypper refresh|リポジトリの更新|

### 覚えておくと便利なコマンドたち
|コマンド|説明|
|:--|:--|
|zypper help|zypperのヘルプ画面を表示|
|zypper help コマンド名|zypper固有のコマンドのヘルプを表示|
|sudo zypper clean|ローカルキャッシュを消去|
|zypper lu(list-updates)|アップデートされるパッケージ一覧の表示
|sudo zypper dist-upgrade|ディストリビューションのアップグレードを行う|
[Laravel5, 6] Cache-Controlを設定する

### やりたいこと

LaravelデフォルトのレスポンスヘッダのCache-Controlには `no-cache private`がセットされています。
これに `no-store`を追加し、↓の状態にしたい。
```
no-cache no-store private
```

### 追加方法

Responseのheaderを変更するためのミドルウェア`SetResponseHeader`を追加し、Cache-Controlをセットしました。

```
$ php artisan make:middleware SetResponseHeader
```

```app/Http/Middleware/SetResponseHeader.php
<?php
namespace App\Http\Middleware;

use Closure;

class SetResponseHeader
{
    /**
     * Handle an incoming request.
     *
     * @param  Request $request
     * @param  Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        if (!$response->isRedirect()) {
            $response->header('Cache-Control', 'no-cache, no-store, private');
        }

        return $response;
    }
}

```

あとはKernel.phpに追加したミドルウェアを登録すればOKです。

```app/Http/Kernel.php
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\SetResponseHeader::class, //追加
        ],
    ];
```
Java_ブロックにおける変数のスコープについて

paizaラーニングforTEAM Java入門編
レッスン6の#06

```Java:6-#06
// ブロックのスコープを理解しよう
// ブロック内で宣言された変数はブロックの外側では使えない

public class Main {
    public static void main(String[] args) {
        System.out.println("hello world");
        
        int num = 0; // ifブロック外で変数numを宣言
        if (num == 0) {
            String msg = "paiza"; // ifブロック内で変数msgを宣言
            System.out.println(msg + num); // 変数msgと変数numはifブロック内で使用できる
        }
        // System.out.println(msg); // 変数msgはifブロック外では使用できない
        System.out.println(num); // 変数numはifブロック外でも使用できる
        
        for (int i = 1; i < 5; i++) { // forブロック外で変数iを宣言
            String msg = "Java"; // forブロック内で変数msgを宣言_ifブロック内の変数msgとは独立している
            System.out.println(msg + i); // 変数msgと変数iはforブロック内で使用できる
        }
        // System.out.println(msg); // 変数msgはforブロック外では使用できない
    }
}
Pythonの基礎を学び直す２

関数

関数を用いることで、いっぺんに処理をまとめることができる。Pythonでは関数を使って（呼び出すともいう）関数が持っているさまざまな機能を使っていく
関数の前にdefを入れることで関数が定義される。defは英語でdefine。

例えば！
```python
def FavoriteFood():
    print("オムライス")
    print("麻婆豆腐")
    print("お寿司")
...
>>>
>>>FavoriteFood()

```
```
オムライス
麻婆豆腐
お寿司
```
といった風に、関数で定義した処理が実行できる。
さらに食事によって値段を見れるように的なのも引数を入れることでできる。
（）の中に引数（→関数に渡す値のことを引数という）

```python
def FavoriteFood(price)
    if (price == "オムライス"):
        print("３００円")
    elif(price == "麻婆豆腐"):
        print("500円")
    elif(price == "お寿司"):
        print("１０００円")
    else:
    print("外食控え中")
...
>>>
>>>ichiban("麻婆豆腐")
```
↓
```
５００円
```

関数における返り値
returnが返り値（→関数を実行して得られる結果のことを返り値、または戻り値という）
⚠︎返り値がない場合、「None」を返す

```python
def addsuru(a,b):　#関数の定義
    c = a+b
    return c
print (addsuru(2,3)) #実行。addsuruの関数をすると、上のプログラミングが動いて、返り値がくる
```
↓
```
5
```

さらにこんなことも
```python
>>>bigNumber = addsuru(100,200)
>>>smallNumber = addsuru(10,20)
>>>print(bigNumber)
300
>>>print(smallNumber)
30
```

また引数は最初にいきなり数字を設定、デフォルト値を設定できる。便利
```python
def addsuru(a, b=2): #いきなり先に設定
    c=a+b
    return c
print(addsuru(3)) #実行。３だけあるとなんか掛け算ぽく見えるけど、bがすでに決まっているので、aの分の数字の設定です。つまり,2+3
```
↓
```
5
```

さらにタプル（変わらないリスト）で一気に短縮できたりもする
```python
def add(a,b,c,d,e,f):
    g=a+b+c+d+e+f
    return g
print(addsuru(1,2,3,4,5,6) #長い。。。

#ので代わりに！↓

h = (1,2,3,4,5,6)
addsuru(*h) #このアスタリスクで一気に！
print(h)

```
```
21
```
初期値問題「[演習]微分方程式8(体系大学数学)」をwolframalphaとsympyでやってみたい。

よくわかりませんでした。

オリジナル

https://youtu.be/T-x2_8x6888

# wolframで

https://www.wolframalpha.com/input?i=D%5By%2C%7Bx%2C6%7D%5D%2B3D%5By%2C%7Bx%2C4%7D%5D%2B3D%5By%2C%7Bx%2C2%7D%5D%2BD%5By%2C%7Bx%2C0%7D%5D%3Dcos%28x%29&lang=ja

微分方程式の解
y(x) = c_6 x^2 sin(x) + c_3 x^2 cos(x) + c_5 x sin(x) + c_4 sin(x) + c_2 x cos(x) + c_1 cos(x) - 1/48 x^3 sin(x)

**?点検**
わかりませんでした。

# sympyで

```python
# xｙ’+4y=logx,y(e)=1
from sympy import *
x = Symbol  ('x',real=True)
y = Function('y')(x)
var('C1 C2 C3 C4 C5 C6')
ans=dsolve(Eq(diff(y,x,6)+3*diff(y,x,4)+3*diff(y,x,2)+diff(y,x,0),
              cos(x))).expand()
print("#",ans.rhs)
plot (ans.rhs.subs({C1:1,C2:1,C3:1,C4:1,C5:1,C6:1})) 
#plot (ans.rhs)
# C1*cos(x) + C2*x*cos(x) + C3*x**2*cos(x) + C4*sin(x) + C5*x*sin(x) + C6*x**2*sin(x) - x**3*sin(x)/48
```
C1からC6に、1を代入して、グラフを書いてみました。
縦横比は、異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/a025e17a-3771-0f3b-9e16-ed7566d297fd.png)
社内プロキシ環境下でpythonをexeファイルにしたい


## 実現したいこと 
- pythonをインストールしていないPC環境で、pythonの処理を実行したい
- pyinstallerなるもので、.pyファイルをexeファイルに変換できるらしい
- やってみよう
- しかし、社内のプロキシサーバー関係なのか、pyinstallerをpipインストールができなかった
- ので、pyinstallerインストールの代替策が必要

## やったこと

- pyinstallerを動作させるために、必要なライブラリを手動インストール
- pyinstallerを実行してexeファイル作成

### 環境
``` 
 OS: Windows10
 Python: 3.11
 PyInstaller: 5.8
``` 

### 必要なライブラリのインストール
pyinstallerを動作させるために、必要なライブラリをあらかじめDLしておき、
ローカルファイルからインストールしていきます。

対象ファイル(以下コマンド参照)の`.whlファイル`を、事前にDLしておきます。

https://pypi.org/

``` bash
python -m pip install --no-deps pyinstaller-5.8.0-py3-none-win_arm64.whl
python -m pip install --no-deps pywin32-305-cp311-cp311-win_amd64.whl
python -m pip install --no-deps pywin32_ctypes-0.2.0-py2.py3-none-any.whl
python -m pip install --no-deps pipenv-2023.2.18-py3-none-any.whl
python -m pip install --no-deps altgraph-0.17.3-py2.py3-none-any.whl
python -m pip install --no-deps pefile-2023.2.7-py3-none-any.whl
```

コマンドをまとめて書いていますが、
実際は、後続`pyinstaller`を実行してはエラーで怒られ、足りないライブラリを順次に追加していきました。

### pyinstallerの実行

``` bash
pyinstaller XXXX.py --onefile
``` 

### 実行時成功ログ
サンプルとして参照してください。

``` log
...
8241 INFO: Writing RT_ICON 6 resource with 4264 bytes
8241 INFO: Writing RT_ICON 7 resource with 1128 bytes
8244 INFO: Copying 0 resources to EXE
8244 INFO: Embedding manifest in EXE
8245 INFO: Updating manifest in C:\test_evi\dist\main.exe.notanexecutable
8290 INFO: Updating resource type 24 name 1 language 0
8293 INFO: Appending PKG archive to EXE
8303 INFO: Fixing EXE headers
8906 INFO: Building EXE from EXE-00.toc completed successfully.
``` 

exeファイル化に成功すると、作業フォルダ内に下記のフォルダとファイルが生成されます。
distフォルダ内にあるexeファイルが作成されています。

``` 
build
dist
XXXX.spec
``` 

もしまだ以下のようなエラーが出たら、
`エラー内容: [“ImportError: No module named altgraph”]`
対象をpypiで検索して、対象の`.whlファイル`をDLしてインストールしてね。ということです。

## まとめ

社内のプロキシサーバー環境下で- pyinstallerを動作させるために必要なライブラリを手動インストールし、exeファイル作成するまでの手順についてまとめました。

今回と同じような環境の方が少ない気もしますが、
pyinstallerの動作に必要な依存ライブラリの検索に手間取る人が少しでも役に立つと嬉しいです。

### 参考記事

https://gammasoft.jp/support/pip-install-error/

https://msk-works.netlify.app/pyinstaller/