OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby/classメソッド]このオブジェクトが属しているクラスは何でしょーか！！

# 初めに
「このメソッドの戻り値、どんなクラスに属しているんだ？？」

あるあるな状況ですね。今回はそんな時に使える便利なclassメソッドについて紹介しつつ、クイズをしたいと思います。ぱちぱちぱち。

# classメソッドとは

前述したように、こやつを使うことで、
**簡単にオブジェクトが属しているクラスを確認できます。**
ひええ、それは便利だ。それでは早速用例を見ていきましょう。

```ruby
num1 = 10
p num.class # Integer

num2 = 1.88
p num2.class # Float

str1 = 'あるがままの心で生きようと願うから人はまた傷ついていく。'
p str1.class # String

array = [1, 2, 3, 4, 5]
p array.class # Array

name = {name: "Yamada",age: 26}
p name.class # Hash
```

ほおお、すごい。。
classメソッドの使い方を理解したので、早速クイズです。

参考：

https://www.tairaengineer-note.com/ruby-class/

# 問題
## 第一問
以下のオブジェクトmemberが所属するクラスは何でしょうか？
```ruby
member = Member.where(age: 30, name: "Takashi")
pp member.class
```
## 第二問
以下のオブジェクトis_successが所属するクラスは何でしょうか？
```ruby
is_success = true
pp is_success.class
```
## 第三問
以下のオブジェクトhogeが所属するクラスは何でしょうか？
```ruby
hoge = "nil"
pp hoge.class
```
# 回答
**第一問**
答え：
```ruby
# Member::ActiveRecord_Relation
```
`join`や`where`, `order`など、ActiveRecord::Relationで定義されているメソッドの戻り値はこのクラスのインスタンスオブジェクトになります。正解できましたでしょうか〜

参考：

https://www.docswell.com/s/pink_bangbi/K88ELK-2022-10-22-133810

**第二問**
答え：
```ruby
# TrueClass
```
booleanだと思った人、結構いるんじゃないでしょうか。。
実は**Rubyにはbooleanという型は存在しません。**
true,falseはそれぞれTrueClass,FalseClassに所属する唯一のインスタンスになります。

参考：

https://qiita.com/rotelstift/items/70461f35c0d691e7b246

**第三問**
答え：
```ruby
# String
```
NilClassと思った優秀なあなた！！　残念、これはひっかけ問題です。笑
ダブルクオーテーション（""）がついているのでString型になります。
# 終わりに
いかがでしたでしょうか。今回のclassメソッドには、自動テストコードを書く時にかなり助けられました。
関数やメソッドの戻り値などのデータ型を調べ、想定外のバグを生まないためにも積極的に活用したいですね。
【vite + react + typescript】カレントディレクトリに直接展開

react + typescript環境をviteで構築し、Githubのリポジトリにプッシュしたい。
でも、普通にアプリを作ってしまうと、今いるディレクトリ直下に新たにアプリ名のフォルダができてしまい、`cd アプリ名`でディレクトリを移動するというのが毎回嫌だし、プッシュしづらかった。

カレントディレクトリ直下にreactアプリを展開する方法を調べたのでメモしとく。

## やってみる。
```shell
# reactアプリを生成したいディレクトリへ移動
cd my-directory

# アプリ名のところを「.」にすることで、中身だけ展開できる。
yarn create vite . --template react-ts
```
生成したアプリの中身を見てみると、下記のように展開する事ができました！
```
my-directory
├── index.html
├── package.json
├── public
├── src
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
```
:::note info
（mac）ディレクトリ構成をターミナルから確認するには、`tree`コマンドがオススメ！
```shell
# treeコマンドをインストール
brew install tree

# カレントディレクトリ内の構造を表示
tree -L 1
```
:::

## 参考
https://zenn.dev/ryuu/articles/discovering-the-cra

https://zenn.dev/averu/scraps/454ac8eaa9f119
XPATH 取得したくないタグを取得しない方法

# タグを取得すると階層下の全量が取得されてしまう

たとえばこんなXMLだったとします。

```xml:book.xml
<book>
    <title>とある参考書</title>
    <author>本書太郎</author>
    <price>500</price>
    <publisher>書籍堂</publisher>
    <language>日本語</language>
    <paperback>150</paperback>
    <isbn10>1234567890</isbn10>
    <isbn13>000-1234567890</isbn13>
    <bestsellersrank>100</bestsellersrank>
</book>
```

これに対し以下のようなxpath指定すると全量が取得されます。

```xpath:xpath
/book/*
```

しかし、この中で1つのタグだけがいらない、取得したくない、不要だ、ということがあるかもしれません。

たとえば「paperback」タグだけ不要だったとします。
その場合はnotやselfを使って、以下のように記述することで、指定のタグのみ除去可能です。

```xpath:xpath
/book/*[not(self::paperback)]
```

階層が深くデータ量が多いタグがあったのですが、取得するだけ無駄だったので、どうやって取り除こうかと調べていたら、この方法にたどり着きました。
[AWS Q&A 365][ECS]AWSのよくある問題の毎日5選 #88

# 1. AWS Fargateスケジューリングにおけるスタンドアロンタスクとは何ですか？
答え：スタンドアロンタスクは一度だけ実行されて停止するタスクです。バッチ処理や一度きりのデータ移行など、継続的に実行する必要のないタスクを実行するのに便利です。

# 2. Amazon ECSコンソールを使ってスタンドアロンタスクをどのように実行しますか？
答え：Amazon ECSコンソールを使ってスタンドアロンタスクを実行するには、まず「タスク」タブに移動し、「新規タスクの実行」をクリックします。次に、実行したいタスク定義を選択し、必要なパラメータを設定し、「タスクを実行」をクリックします。

# 3. AWS Fargateスケジューリングにおけるスケジュールタスクとは何ですか？
答え：スケジュールタスクは、定期的に自動で実行されるタスクです。バックアップやデータ同期など、特定の間隔で実行する必要があるタスクを実行するのに便利です。

# 4. AWS Fargateスケジューリングでスケジュールタスクを作成するにはどうすればよいですか？
答え：AWS Fargateスケジューリングでスケジュールタスクを作成するには、Amazon ECSコンソールまたはAWS CLIを使用できます。まず、実行したいタスクのタスク定義を作成します。次に、タスクが実行されるべき時期と使用するタスク定義を指定するスケジュールタスクルールを作成します。最後に、スケジュールタスクに必要なパラメータを設定し、それを作成します。

# 5. AWS Fargateスケジューリングにおけるスタンドアロンタスクとスケジュールタスクの違いは何ですか？
答え：スタンドアロンタスクは一度だけ実行されて停止するタスクであり、スケジュールタスクは定期的に自動で実行されるタスクです。スタンドアロンタスクは継続的に実行する必要のないタスクを実行するのに便利であり、スケジュールタスクは特定の間隔で実行する必要があるタスクを実行するのに便利です。
[AWS Q&A 365][ECS]Daily Five Common Questions #88

# 1. What is a standalone task in AWS Fargate scheduling? 
Answer: A standalone task is a one-time task that runs and then stops. It is useful for running tasks that don't need to be run continuously, such as batch processing or one-time data migrations. 

# 2. How can I run a standalone task using the Amazon ECS console? 
Answer: To run a standalone task using the Amazon ECS console, first navigate to the "Tasks" tab and click "Run new task". Then, select the task definition you want to run, configure any necessary parameters, and click "Run Task". 

# 3. What is a scheduled task in AWS Fargate scheduling? 
Answer: A scheduled task is a task that is automatically run on a regular schedule. It is useful for running tasks that need to be run at specific intervals, such as backups or data syncing. 

# 4. How can I create a scheduled task in AWS Fargate scheduling? 
Answer: To create a scheduled task in AWS Fargate scheduling, you can use the Amazon ECS console or the AWS CLI. First, create a task definition for the task you want to run. Then, create a scheduled task rule that specifies when the task should be run and the task definition to use. Finally, configure any necessary parameters for the scheduled task and create it. 

# 5. What is the difference between a standalone task and a scheduled task in AWS Fargate scheduling? 
Answer: A standalone task is a one-time task that runs and then stops, while a scheduled task is a task that is automatically run on a regular schedule. Standalone tasks are useful for running tasks that don't need to be run continuously, while scheduled tasks are useful for running tasks that need to be run at specific intervals.
Viteでbuild時にハッシュ文字が邪魔なとき

./dist/assets内のindex-6c8dfc51.jsをindex.jsにしたい

```TypeScript:vite.config.ts
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from "vite";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  build: {
    rollupOptions: {
      output: {
        entryFileNames: `assets/[name].js`,
        chunkFileNames: `assets/[name].js`,
        assetFileNames: `assets/[name].[ext]`,
      },
    },
  },
});
```

こうじゃ！
「react-to-webcomponent」ライブラリを使用し、vite + ReactでWeb Componentsを作成する

## なぜlitでもpreactでもなく、ReactでWeb Componentsを作成するのか？

どうしてもReactでなければ動かないライブラリがあるから。

## どうやって作るのか？

まずは```pnpm create vite```でReact＋TypeScriptの環境をつくります。
そのフォルダに入った状態だと考えてください。

```sh
npm install -D react-to-webcomponent
```

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React + TS</title>
  </head>
  <body>
    <my-element name="yuumillar"></my-element>
    <script type="module" src="/src/main.tsx"></script>
  </body>
</html>
```

こんな感じで、my-elementを使います。普段は```<div id="root"></div>```のようになっているところを、自分の作成したいWeb Componentsにします。

```tsx:main.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import r2wc from "react-to-webcomponent";
import { App } from "./App";

const myElement = r2wc(App, React, ReactDOM, {
  props: {
    name: "string",
  },
});

customElements.define("my-element", myElement);
```

こんな感じでmy-elementを定義してあげます。

```tsx:App.tsx
type AppProps = {
  name: string;
};
export const App = ({ name }: AppProps) => <div>{name}</div>;
```

これが最低限の実装です。html側のpropsを変更すると、App.tsxのnameが変更されます。

## どうやってビルド後に使用するか？

いつも通りにnpm run buildを実行して、distフォルダを作成します。
そこにあるjsファイルを読み込めば、Web Componentsを使用することができます。

```html:anyhoge.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vite + React + TS</title>
  </head>
  <body>
    <my-element name="yuumillar"></my-element>
    <script type="module" src="/dist/src_main.tsx.1e2b0b6f.js"></script>
  </body>
```

こんな感じですな。
これで好きなところでコンポーネントとして扱えます。PHPで動いているレガシーなシステムでもReactが使えます。便利だね。
Access内にダミークエリがあると複数人同時使用で想定外の動作になる

# 想定外の動作が起きる例

下記のようなテーブルとダミークエリがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a98d6bfd-a65b-41b7-a1ea-46ed24301f5f.png)

フォーム上にボタンが二つあり…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b27efd20-096a-8f2f-397d-34f3e5089d1b.png)

それぞれ『ダミークエリのSQL差替』と『ダミークエリ表示』を行っている。

```vb:
'ボタン1クリック動作
Private Sub btn_1_Click()
    CurrentDb.QueryDefs("q_dummy").SQL = "SELECT [苗字] FROM t_1 "
    DoCmd.OpenQuery "q_dummy", acViewNormal, acReadOnly
End Sub

'ボタン2クリック動作
Private Sub btn_2_Click()
    CurrentDb.QueryDefs("q_dummy").SQL = "SELECT [年齢] FROM t_1 "
    DoCmd.OpenQuery "q_dummy", acViewNormal, acReadOnly
End Sub
```

1. AさんとBさんが **同じAccessファイル** を開く。
1. Aさんがボタン1を押す。
1. ほぼ同時にBさんがボタン2を押す。
1. Aさん側の結果が下記になってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b6aec92e-46a6-bd54-b2b0-d3a37caeec83.png)
Aさんとしては『苗字』を抽出したかったのに、Bさんが行っていた『年齢』抽出の結果になってる…。
タイミングによっては逆（Bさんに表示されるのがAさんの処理結果）が起こる場合もある。

# まとめ

複数人で同じAccessファイルを開いた場合、ダミークエリのSQLは共有される。

 ↓ こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/70ac0363-487a-f15c-5a40-a278c0400eeb.png)

# 複数人同時使用禁止をやりたい場合

https://qiita.com/waokitsune/items/ef0e8bdb9557eb2bc993

# バージョン

Windows 10 Pro 22H2 19045.3155
Microsoft Access for Microsoft 365 MSO (バージョン 2305 ビルド 16.0.16501.20074) 32 ビット
Flaskで非同期処理の実装

### 本記事の背景
以前はFlaskで時間がかかる処理で[同期](https://qiita.com/akeyi2018/items/417b17f165178897c726)でやってしまっていたが、本記事は非同期処理を紹介する

### Processの使用
Pythonで非同期のやり方はいろいろありますが、本記事はマルチスレッドのProcessを使うやり方を紹介する
<I>
※公式ページの解説は以下です。
The Process class¶
In multiprocessing, processes are spawned by creating a Process object and then calling its start() method. Process follows the API of threading.Thread. A trivial example of a multiprocess program is
```python
from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
```
</I>

### FlaskでProcessを使用
FlaskでProcessを使用する場合は上記のソースをすこし工夫します。
```python
@app.route('/download', methods=['POST'])
def async_download():
    # グローバル変数を宣言
	global thread
	form = DownloadForm()
	if request.method =="POST":
		url = request.form.get("url")
		tp = request.form.get("tp")
		file_name = request.form.get('file_name')
		if tp == 'mp3' and len(url) > 1:
			thread = Process(target=download_mp3, args=(url,file_name))
            # プロセスをスタートする（thread.join()は実行しない）
			thread.start()
		elif tp == 'mp4' and len(url) > 1:
			thread = Process(target=download_mp4, args=(url,file_name))
			thread.start()
		else:
			return render_template('index.html', form=form)
    # ダウンロード中のページを表示させる
	return render_template('download.html')
```

### 制限事項
ダウンロード中のページの表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/c535c914-dc3d-9e30-bc8a-cc7f1760d93f.png)

※ ダウンロードのプロセスについて
<b>Flaskのフロント側は静的ページ表示しているため、同期処理の動きと異なる。
また、ダウンロード終わっても、ページの遷移はありません。

ただし、ダウンロードモジュールにフック関数を実装して、DBに保存するようなものだったり、Jsonファイルに完了フラグを付けるなりして、別の監視プロセスを走らせることでメッセージの通知を実装すれば、ダウンロード終わったら、Lineにメッセージを通知することも可能です。
それについては、別途で記事にする予定。

### 参考文献

https://docs.python.org/3/library/multiprocessing.html
Makefile警察「ぐぬぬぬ…」


？「プロジェクトでよく使うコマンド Makefile に書いたろー」  
？「`docker compose up -d --wait` っと…」  
👮‍♀「 Makefile警察 だ！」  
👮‍♀「 Makefile は、ソフトウェアのビルドプロセスを自動化するためのファイルだ！」  
👮‍♀「多目的なタスクランナーとして使うな！」  
？「せやったんか。誠にごめんなさい。」  

Makefile は広く使われていますが、時々目的外に使われてしまうことがあります。しかし、そのような使い方にはより適した代替手段が存在します。この記事では、 Taskfile というツールについて解説します。

## Makefile のつらみ

Makefile は主にビルドプロセスを自動化する目的で生まれましたが、様々なコマンドをまとめて実行する便利さから多目的なタスクランナーとしてもよく使われます。しかし、次のような問題があります。

- シンタックスが独特で学習コストが高い
- 複雑ことをやろうとすると可読性が下がりがち
- 時折 Makefile警察 が現れる

これらの点から、 Makefile の代わりになるものを探る価値があります。

## Taskfile の紹介

https://taskfile.dev/

Taskfile は、シンプルで柔軟なタスクランナーです。 YAML 形式でタスクを定義することができます。
Go で作られており、バイナリ単体で動作するため、多くのプラットフォームで簡単に導入できます。

## Makefile と比べたメリット

### メリット

- シンタックスが YAML で分かりやすい
- Makefile より機能が豊富で大抵のことはシンプルに書ける
- **Taskfile はタスクランナーなので Makefile警察 を黙らせられる**

## 書き方

`Taskfile.yml` ファイルをプロジェクトのルートに作成して、タスクを定義します。

例:

```yaml
version: '3'

tasks:
  hello:
    desc: "This task says Hello, World!"
    cmds:
      - echo "Hello, World!"
```

上記の例では、`hello` という名前のタスクを作成しています。このタスクは単純に "Hello, World!" を出力します。

タスクを実行するには、以下のコマンドを使用します。

```sh
> task hello
task: [hello] echo "Hello, World!"
Hello, World!
```

定義してあるタスクの一覧を表示することもできます

```sh
> task --list
task: Available tasks for this project:
* hello:       This task says Hello, World!
```

依存するタスクを並列で実行したり、カレントディレクトリに `Taskfile.yml` がない場合、親ディレクトリを辿って探してくれたり他にも便利な機能がいっぱいあります

## まとめ

Makefile は強力なツールですが、多目的なタスクランナーとして使用する場合には独特のシンタックスや制約がハードルとなることがあります。 Taskfile は YAML をベースにシンプルかつ柔軟なタスクの定義が可能です。プロジェクトの自動化には、適切なツールを選択しましょう。
attr_accessorの使い方とセッターメソッドの注意点

# 対象者

* selfが省略できる時とできない時の違いがわからない方

* attr_accessorの復習をしたい方


# attr_accessorとは
⇨インスタンス変数とセッターメソッド、ゲッターメソッドのこの3つを自動作成してくれる機能（画面上には見えない）。
セッター？ゲッター？となった方は↓を参照してください
https://loveenglish.hatenablog.com/entry/2023/06/30/124228

attr_accessorの例文↓
```

class Onepiece 
 attr_accessor :name  

 def initialize()
    処理
　　end 
 
end

onepiece = Onepiece.new
onepiece.name = "ゾロ"
puts onepiece.name 　出力結果　ゾロ
```
```
attr_accessor 好きなインスタンス変数名 
```
上の1行を追加すると↓の例文と同じ意味です。要はゲッターメソッドとセッターメソッドを自動生成してくれる
```
class Onepiece 


def name 　ゲッターメソッド
  @name
end 

def name=(name)　セッターメソッド
  @name = name 
end 

end 

onepiece = Onepiece.new
onepiece.name = "ゾロ"　⇦この書き方でセッターメソッドのよびだし
puts onepiece.name 出力結果　ゾロ
```
上を見てわかる通りattr_accessorを使うとコードがすっきりする。なぜならセッターメソッド、ゲッターメソッドを書かなくて良いから。

#  省略できるself
⇨メソッドの中でメソッドを呼び出すとき
```
class Onepiece 

def dream
  puts "海賊王に俺はなる"
end 

def introduce 
   dream ⇦dreamメソッドを呼び出す。self.dreamと書いても同じ挙動
end 

end 

  onepiece = Onepiece.new
    onepiece.introduce
  出力結果　海賊王に俺はなる
```
要は本来dreamメソッドはインスタンスメソッドなのでdreamメソッドを呼び出す際
```
 onepiece.dream
```
みたいにdreamメソッドの前にはインスタンスが必要。ただメソッドの中で他のメソッドを使用する際selfと記載することでselfがonepice(インスタンス)の代わりになる。
つまりself.dream とonepiece.dream　は同じ意味になる。この時selfは省略可能なのでintroduceメソッドの中でdreamと記載するだけで呼べる。
ただセッターメソッド内で他のメソッドを呼ぶときselfの扱いには気をつけないといけない

# 省略できないself
⇨セッターメソッドの中ではselfを省略する時としない時で意味が変わる。

```
class Onepiece 
  # attr_accessor :name

  def name  #①
    @name
  end 
  
  def name=(value) #②
    @name = value
  end 

  def change_name(name)
   self.name = name  #ここのself.name = nameは②のnameメソッドを呼び出している
  end 
  
  end 
  
  onepiece = Onepiece.new
  onepiece.change_name("サンジ")
  puts onepiece.name #⇦このnameは①のnameゲッターメソッドを読んでいる
selfありの出力結果　サンジ
selfなしの出力結果　nil 
```

```
  def change_name(name)
   name = name
  end 
nameというローカル変数にnameを代入する
```
```
  def change_name(name)
   self.name = name
  end 

②のセッターメソッドが呼ばれインスタンス変数（@name）にvalueが代入される

```


#まとめ

* 基本的にメソッドの中で他のメソッドを使うときはselfを省略できる。

* セッターメソッド内でselfを省略するとローカル変数に代入、selfをつけるとインスタンス変数の値の更新が行われる
Elixirの対話モードでEnumとStreamの動作を確認してみた

# 概要
Elixirの対話モードでEnumとStreamの動作を確認してみました。以下のページを参考にしました。

https://dev.to/gumi/elixir-10-enumstream-4fpb

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Enum.map([1, 2, 3], fn x -> x * x end)
[1, 4, 9]
iex(2)> Enum.map(%{2 => :one, 4 => :two}, fn({k, v}) -> {v, div(k, 2)} end)
[one: 1, two: 2]
iex(3)> Enum.map(1..3, &(&1 * &1))
[1, 4, 9]
iex(4)> Enum.reduce(1..3, 0, &+/2)
6
iex(5)> [1, [[2], 3]] |> List.flatten
[1, 2, 3]
iex(6)> Enum.reduce(Enum.map(1..3, fn x -> x * x end), 0, fn(x, acc) -> x + acc end )
14
iex(7)> 14
14
iex(8)> 1..3 |> Enum.map(&(&1 * &1)) |> Enum.reduce(0, &+/2)
14
iex(9)> 1..3 |> Enum.map(&(&1 * &1)) |> Enum.sum
14
iex(10)> [1, [[2], 3]] |> List.flatten [4, [5]]
warning: parentheses are required when piping into a function call. For example:

    foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

    foo(1) |> bar(2) |> baz(3)

Ambiguous pipe found at:
  iex:10

[1, 2, 3, 4, [5]]
iex(11)> square = Enum.map(1..3, &(&1 * &1))
[1, 4, 9]
iex(12)> sum = Enum.sum(square)
14
iex(13)> range = 1..6
1..6
iex(14)> odd = Stream.filter(range, &(rem(&1, 2) != 0))
#Stream<[enum: 1..6, funs: [#Function<39.58486609/1 in Stream.filter/2>]]>
iex(15)> square = Stream.map(odd, &(&1 * &1))
#Stream<[
  enum: 1..6,
  funs: [#Function<39.58486609/1 in Stream.filter/2>,
   #Function<47.58486609/1 in Stream.map/2>]
]>
iex(16)> sum = Enum.reduce(square, 0, &(&1 + &2))
35
iex(17)> [1, 2, 3] |> Stream.cycle |> Enum.take(10)
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1]
iex(18)> fibs = Stream.unfold({1, 1}, fn({n0, n1}) -> {n0, {n1, n0 + n1}} end)
#Function<61.58486609/2 in Stream.unfold/2>
iex(19)> Enum.take(fibs, 10)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
iex(20)> stream = File.stream!("test.txt")
%File.Stream{
  line_or_bytes: :line,
  modes: [:raw, :read_ahead, :binary],
  path: "test.txt",
  raw: true
}
iex(21)> Enum.take(stream, 10)
** (File.Error) could not stream "test.txt": no such file or directory
    (elixir 1.12.2) lib/file/stream.ex:83: anonymous fn/3 in Enumerable.File.Stream.reduce/3
    (elixir 1.12.2) lib/stream.ex:1517: anonymous fn/5 in Stream.resource/3
    (elixir 1.12.2) lib/enum.ex:3116: Enum.take/2
iex(21)> Enum.take(stream, 10)
[]
iex(22)> 
```

# まとめ
何かの役に立てばと。
[Rubocop エラー　備忘録]　/UselessAssignment : Unless assignment to variable ..........

#### 実行したコマンド
```
rubocop -a
```

#### ご指摘
```
/UselessAssignment: Unless assignment to variable ..........
```

#### ご指摘内容
使用されていないローカルの変数の定義が存在しますよ。

#### 解決法
ご指摘を受けた箇所を削除することで解決しました。
yumコマンド実行時に"SSL certificate problem: certificate has expired"


時々しか使わないCentOS7のサーバでyumコマンドを実行すると、
listの結果は表示されるけど、「証明書の期限が切れている」と言われる。

```
$ sudo yum list --showduplicates gitlab-ce|grep 15\.|tail -n 2
https://download.sublimetext.com/rpm/stable/x86_64/repodata/repomd.xml: [Errno 14] curl#60 - "SSL certificate problem: certificate has expired"
他のミラーを試します。
It was impossible to connect to the CentOS servers.
```
いや、別に証明書を使っているつもりはないんだけど....と
思いつつも検索してみると、ここがヒット

[なぜかhttps通信がエラーになってしまった時の対応【小ネタ】](https://blog.bassbone.tokyo/archives/1384)

こちらのブログには「外部のURLは超有名なサービスのものなので」と
あったけど、こちらはyumの実行。
『サーバ内部の証明書』との説明を読んで納得して
```
$ sudo yum update ca-certificates
```
を実行

```
$ sudo yum list --showduplicates gitlab-ce|grep 15\.|tail -n 2
gitlab-ce.x86_64              15.11.9-ce.0.el7                 gitlab_gitlab-ce 
gitlab-ce.x86_64              15.11.10-ce.0.el7                gitlab_gitlab-ce 
```
先ほどまでのエラーメッセージは表示されなくなった
PythonでCabochaを使用して日本語の文章を係受け分析するための基本的なコード例

```python
import CaboCha

def analyze_dependency(sentence):
    cabocha = CaboCha.Parser()
    tree = cabocha.parse(sentence)

    subject = None
    verb = None
    object_ = None

    for i in range(tree.chunk_size()):
        chunk = tree.chunk(i)
        if chunk.link == -1:  # 係り先がない場合
            for j in range(chunk.token_pos, chunk.token_pos + chunk.token_size):
                token = tree.token(j)
                if token.feature.split(',')[0] == '動詞':
                    verb = token.surface
        elif chunk.link > 0:  # 係り先がある場合
            if chunk.token_pos == tree.chunk(chunk.link).token_pos:  # 係り先のChunkの最初のTokenとリンクしている場合
                if chunk.token_pos > 0:  # 主語がある場合
                    subject = ''.join([tree.token(k).surface for k in range(chunk.token_pos, chunk.token_pos + chunk.token_size)])
                if chunk.link > 0:  # 目的語がある場合
                    object_ = ''.join([tree.token(k).surface for k in range(tree.chunk(chunk.link).token_pos, tree.chunk(chunk.link).token_pos + tree.chunk(chunk.link).token_size)])

    return subject, verb, object_

# テスト用の文章
sentence = "私はリンゴを食べます"

# 係受け分析とSVOの抽出
subject, verb, object_ = analyze_dependency(sentence)

# 結果の出力
print(f"主語: {subject}")
print(f"動詞: {verb}")
print(f"目的語: {object_}")

```
上記のコードは「私はリンゴを食べます」という文章をSVO（主語・動詞・目的語）に分類し、それぞれの要素を出力することが可能です。


```出力結果
主語: 私
動詞: 食べます
目的語: リンゴ
```
配色を決めるのに便利なツール

プライマリーカラー、セカンダリーカラー など配色を選ぶ際によく使用しているツール

- [paletton.com](https://paletton.com/#uid=1000u0kllllaFw0g0qFqFg0w0aF)
- [HUE/360](https://hue360.herokuapp.com/)
OpenAI ChatGPT プラグイン開発 - ローカルサーバー構築でCORS問題を克服する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167934/1e6387f3-b1fe-babe-bd88-d0d0ed9869fe.png)


## はじめに

こんにちは、皆さん。今日は、私たちがOpenAIのChatGPTプラグインを開発する際に遭遇した問題とその解決策について話します。プログラミングの世界は複雑で試行錯誤が必要な場面が多く、特に新しい技術を使いこなそうとするときは、挑戦が待ち受けています。

だからこそ、私たちは自身が学んだことを共有し、一人でも多くの人々の役に立ちたいと思っています。プログラミングの旅を共有することで、私たちは皆さんの旅を少しでも楽にし、時間を節約することができると信じています。それが、私たちがこの記事を書いている理由です。そして、今日共有する解決策が皆さんの問題解決に役立つことを心から願っています。

## 問題：CORSポリシーによるエラー

私たちの目的は、OpenAIのChatGPTプラグインの開発の一環として、ローカルサーバーを構築することでした。しかし、その道のりは予想以上に険しいものでした。次のようなエラーメッセージに直面しました。

```
Access to fetch at 'http://localhost:3333/.well-known/ai-plugin.json' from origin 'https://chat.openai.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

この問題の原因は、CORS（Cross-Origin Resource Sharing）ポリシーです。簡単に言えば、ウェブページは、異なるオリジン（ドメイン、プロトコル、ポート）からのリソースへのアクセスを制限します。このため、'https://chat.openai.com'から'localhost:3333'へのリクエストがブロックされました。

## 解決策：CORSヘッダーの追加

この問題を解決するためには、'Access-Control-Allow-Origin'ヘッダーを適切に設定する必要があります。これにより、特定のオリジンからのリクエストを許可します。以下に、解決策となるコードを示します：

```javascript
const http = require('http');
const fs = require('fs');
const path = require('path');
const cors = require('cors');

const app = express();

app.use(cors());

// Use middleware for setting CORS headers
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', 'https://chat.openai.com');
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, openai-conversation-id');
    res.header('Access-Control-Allow-Credentials', 'false');
    res.header('Cache-Control', 'no-store, max-age=0');
    next();
});

// Rest of your code...

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});
```

ここで、'OPTIONS'メソッドが使われています。これは、通常、クライアントが実際のリクエストを行う前に、プリフライトリクエストとして送られます。これにより、サーバーはクライアントが実際のリクエストを安全に行うことができるかを判断します。

'Access-Control-Allow-Origin', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Headers'といったCORSヘッダを適切に設定することで、'https://chat.openai.com'からのリクエストを許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167934/1b6be1cf-90a4-b557-fe6e-b0d22cb521a1.png)
無事に通信されました

## 結論：知識を共有し、人々を助ける

今日、私たちはOpenAIのChatGPTプラグイン開発における一つの問題とその解決策を共有しました。これが皆さんの問題解決に役立つことを心から願っています。

プログラミングの旅は一人ひとりが孤独に進むものではありません。私たちは皆さんと一緒に学び、成長し、問題を解決したいと考えています。そのために、私たちは自身が得た知識を共有し続けます。

最後に、コーディングはただの技術以上のものです。それは創造性、持続性、そして共感の表現です。そして何よりも、私たちはコーディングを通じて、人々を助け、世界をより良い場所にすることができます。それが私たちの目指す道です。

これからも、私たちと一緒に学び、成長し、問題を解決しましょう。そして、一緒に人々を助け、世界をより良い場所にしましょう。

Happy coding, everyone!
２年目エンジニアが２社目のプロジェクトに参画して２週間を過ごした

およそ一年の研修期間を経て、ようやく案件に携わることになりました。セミかな。
１週間で心折れていたらセミでした。息が切れる様子はないので、どうやら人間であるらしい。
~~でも半人前という意味ではセミプロってか。~~

２週間＝１スプリントということで、ちょうど１スプリントが終わり節目になります。
新人がどんな事を感じているかを知ってもらうべく、簡単に所感をまとめてみました。

## 身構えていたよりも、居心地いいぞ！
- 前職よりも技術レベルが高いので、やっていけるかとても不安だったし、こんなこともできないの！？と失望される不安があったが、意外とわかるし、意外とみんな教えてくれる。
- 先輩たちもエラーが出たら周りに聞いたりしてる。←これすごい安心した。弘法も筆の誤り！？
- なので、技術に関しては思っていたよりも課題を感じていないかも？小さくとも価値を提供できている感はある、枯れ木も山の賑わい。
- プロジェクト固有のエラー周りや、馴染みのない技術面のサポートは受けられる環境にあるので満足度高い。

## ”アジャイル”と一言で言っても、チームによってスプリントの進め方が違う
- 当たり前かもしれないけど、意外と面食らったのがこれ。アジャイルでのチーム開発？そんなんやってたよ！って思ったらなんか自分の知ってるやつと違う…。
- チームには独自の色があるらしい。
- 例えば、デイリーミーティングの時間をしっかり取るチームがあれば、最低限の連絡だけを済ませたら残りは必要に応じて都度個々人と話すチームがある。
- 例えば、ルールや手順はチームで話し合って策定し、開発作業やユーザー体験の向上だけを個人に任せるスタイルと、プロジェクト内のほぼすべてを個人に委ねるスタイル。
- 双方とも、サービスを”なるべく早く、より良くする”ために稼働しているという点では同じだけど、少しずつの違いが積み重なって全く別物の雰囲気を作り出している。
- どちらかがいいとか悪いとかではなくて、違うことを認識することがまず大事だなと感じた。

## 同じ用語なのに異なる使い方をしていて、自分がそれについて分かっているのか分かっていないのかの判断がつかない
- デザインスプリント、という言葉で説明されていた概念がしばらく理解できなかったが、どうも前社で使われていた要件定義とか設計にあたるものだった
- タスク管理、という言葉の認識が違っている気がする？？カンバンに張られているチケットの担当者を変えて、進行中に移して、要件を満たしたらプルリクを出したことが分かるように掲示して完了に移す。みたいな進捗の見える化のことだと思っていたけど違うっぽい
- どの認識が正しいとか正しくないとかは置いておいて、チーム内で使う用語はこういう意味で使ってるよね、みたいな認識合わせが必要だと思う

## 個人的な課題
- 未経験のためフロントエンドが触れない。苦手意識持ってるところも触ってみようという気概はあるので、時間の問題と思う

## その他では

### 会議多くね…？
- 必要性を感じられる会議であればいいと思う。この会議に自分が参加している理由が分からない会議がある。（前職もあったけど）

### アルファベットの略語、必要…？
- 知っている人にしか伝わらない略語が多くて何言ってるか分からない。会議でおいてけぼりになる理由のひとつ

## 心理的安全性について
- コミュニケーションは取れている方だと思う。
- チームの雰囲気はよい方だと思う。ただ、その良い雰囲気を保つため（？）に、心理的安全性はないように感じている…。
- 会議中に分からないことを質問しづらかったり。煮詰まった時の発言にウェルカムムードはないかも
- 分かってないことも、分かってることも伝わってない感じがする
- 考えうる原因はもうちょっと考えたい。

## まとめ
- 前職のチームのいいとこ、めちゃくちゃあったな…！技術レベルは圧倒的に今の方が高いけど、どちらからも学べることがある。
- 書き起こしてみると、どこに満足していてどこに不満を感じているかが自分の中でも明確になってよきだった…！
- これからもサービス、チーム、自分自身をより良くするために頑張っていきます。
dockerでmysqlを動かす時の設定ファイル（メモ）

``` docker-compose.yml
version: "3.9"

services:
  mysql:
  #  platform: linux/x86_64
    image: mysql:8.0.28
    platform: linux/amd64
    container_name: mysql-container
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 
      TZ: "Asia/Tokyo"
    volumes:
      - data-volume:/var/lib/mysql
      - ~/path_to_file:/path_to_file

volumes:
 data-volume:
```

path_to_fileはマウントさせたいファイルです
data-volumeでデータの永続化をしています
【Ubuntu】動作が重いとき

# はじめに
Ubuntuを使用している方で、
「最近PC重いな...」
というときに役立つコマンドを紹介します。

# 環境
Ubuntu20.04

---
### コマンド

たったこれだけ。

`sudo sysctl -w vm.drop_caches=3`

`sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"`

Bashにまとめて定期的にcronで定期実行することをおすすめします。
```clear_cpu_cache.sh
#!/bin/sh

sudo sysctl -w vm.drop_caches=3
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
```

PCが2,3年以上前の方は、買い替えもアリかもしれません。
intelも飛躍的に進化してるし、MacのM2チップは神。

以上、ご拝読いただきありがとうございました！
CakePHP4.4 で 404エラーを別のログファイルに記録する

・参考資料 https://tt-computing.com/cake4_0-log-404

CakePHP3.10 で作られたシステムを CakePHP4.4.14 への移行を行いました。実施する上で既に実施された方々の十分な資料が有ったので、比較的スムーズに行きました。

ただ一点 404エラーを別ログファイルを記録する方法だけは**参考資料**通りでも上手く行かないので、試行錯誤してやっと出来る様になったので、こちらで情報を共有させて下さい。CakePHP 4.4 でエラー処理の仕組みを上位互換無い形で変更した事が原因です。

普通マイナーバージョンアップ時にこういう上位互換性が無い様な変更はして欲しくは無いですね。CakePHP5 がリリース候補 RC1 が出ているので、そこで入れるのはかまわないと思うのですが。

**config/app.php**
・エラーログのクラス指定と404エラーログの指定
```
    'Error' => [
        'errorLevel' => E_ALL  & ~E_DEPRECATED & ~E_USER_DEPRECATED,
        'skipLog' => [],
        'log' => true,
        'trace' => true,
        'ignoredDeprecationPaths' => [],
        'logger' => App\Error\CustomErrorLogger::class, // ← 追加
        ],

    /*
     * Configures logging options
     */
    'Log' => [
		・・・・・
        // 以下を追加
        'error404' => [
            'className' => FileLog::class,
            'path' => LOGS,
            'file' => 'error_404',
            'url' => env('LOG_ERROR_URL', null),
            'scopes' => ['error404'],
        ],

```

**src/Error/CustomErrorLogger.php**
・エラーロガーの実装
```
<?php
declare(strict_types=1);

namespace App\Error;

use Cake\Core\Exception\CakeException;
use Cake\Log\Log;
use Psr\Http\Message\ServerRequestInterface;
use Throwable;
use Cake\Error\ErrorLoggerInterface;
use Cake\Error\ErrorLogger;

class CustomErrorLogger implements ErrorLoggerInterface
{

    /**
     * @inheritDoc
     */
    public function logMessage($level, string $message, array $context = []): bool
    {
        $logMessage_instance = new ErrorLogger();
        return $logMessage_instance->logMessage($level, $message, $context);
    }

    public function log(Throwable $exception, ?ServerRequestInterface $request = null): bool
    {
        // 404 扱いとする Exception
        $targetExceptions = [
            'Cake\Controller\Exception\MissingActionException',
            'Cake\Http\Exception\NotFoundException',
            'Cake\Http\Exception\MissingControllerException',
            'Cake\Http\Exception\InvalidCsrfTokenException',
            'Cake\Routing\Exception\MissingRouteException',
            'Cake\Routing\Exception\MissingControllerException',
            'Cake\View\Exception\MissingTemplateException',

        ];
        // 404 の場合は別ファイルにログを記述
        $get_class_string = get_class($exception);
        if (in_array(get_class($exception), $targetExceptions)) {
        // 独自のログ内容
            $url = $_SERVER['REQUEST_URI'];
            $ip = $_SERVER['REMOTE_ADDR'];
            $ip2 = $_SERVER['HTTP_X_FORWARDED_FOR']??''; //  プロキシサーバーを通すと真のクライアントIP が取れないので、こちらを取得
            $ua = $_SERVER['HTTP_USER_AGENT'];
            $message = "{$url}\t{$ip}\t{$ip2}\t{$ua}\n\n";
            return Log::error($message, ['scope' => 'error404']);
        }       
        $log_instance = new ErrorLogger();
        return $log_instance->log($exception, $request);
    }
}
```
ネットを検索しても CakePHP4 の情報は本当に少ないので驚きました。公式マニュアルの日本語版でも、カスタムエラーログの部分は英語のままになってました。

自分の様な苦労をしない様に情報共有出来て、これが参考になれば嬉しいです。また改善案とかございましたら教えて下さい。
【PostgreSQL】文字列関数について

# 【PostgreSQL】文字列関数について

##  文字列関数とは
文字列関数とは文字列に対して処理を行った結果を返す関数。

| 関数 | 説明 |
| :---: | :--- |
| lower(文字列) | 指定した文字列を小文字に変換して返す |
| upper(文字列) | 指定した文字列を大文字に変換して返す |
| char_length(文字列) | 指定した文字列の文字数を返す |
| octet_length(文字列) | 指定した文字列のバイト数を返す |
| trim(元文字列[, 除去する文字列]) | 指定した元文字列から除去する文字列を取り除いて返す<br>除去する文字列を省略した場合は、デフォルトで空白文字が設定される |
| lpad(元文字列, 文字数[, 追加する文字列]) | 指定した元文字列の先頭に、文字数に達するまで追加する文字列が埋め込まれる<br>追加する文字列を省略した場合は、デフォルトで空白文字が設定される |
| rpad(元文字列, 文字数[, 追加する文字列]) | 指定した元文字列の末尾に、文字数に達するまで追加する文字列が埋め込まれる<br>追加する文字列を省略した場合は、デフォルトで空白文字が設定される |
| substring(文字列, 開始位置[, 文字数]) | 指定した文字列の開始位置から、文字数分の文字列を取得して返す<br>文字数を省略した場合は、デフォルトで末尾までに設定される |
| replace(文字列, 置換前の文字列, 置換後の文字列) | 指定した文字列中の置換前の文字列を、置換後の文字列に置き換えて返す | ## 使用例
#### 使い方
##### lower
``` sql
postgres=# SELECT lower('TOM');
 lower 
-------
 tom
(1 行)
```
##### upper
``` sql
postgres=# SELECT upper('tom');
 upper 
-------
 TOM
(1 行)
```
##### char_length
``` sql
postgres=# SELECT char_length('postgresql');
 char_length 
-------------
          10
(1 行)
```
##### octet_length
``` sql
postgres=# SELECT octet_length('ab c');
 octet_length 
--------------
            4
(1 行)

```
##### trim
``` sql
postgres=# SELECT trim('yxTomxx', 'xyz');
 btrim 
-------
 Tom
(1 行)
```
##### lpad
``` sql
postgres=# SELECT lpad('hi', 5, 'xy');
 lpad  
-------
 xyxhi
(1 行)
```
##### rpad
``` sql
postgres=# SELECT rpad('hi', 5, 'xy');
 rpad  
-------
 hixyx
(1 行)
```
##### substring
``` sql
postgres=# SELECT substring('Thomas', 2, 3);
 substring 
-----------
 hom
(1 行)

postgres=# SELECT substring('Thomas', 3);
 substring 
-----------
 omas
(1 行)
```
##### replace
``` sql
postgres=# SELECT replace('abcdefabcdef', 'cd', 'XX');
   replace    
--------------
 abXXefabXXef
(1 行)
```
【Swift】提出しても必ずリジェクトされるアプリの現状「App Boost」

## アプリ作成の動機
App Storeでは、ランキングに入らない限り、または検索でヒットしない限り、アプリはダウンロードされません。このような状況下で、個人開発者にはアプリを広める手段が限られています。そのため、アプリを拡散するための手段を提供するアプリがあれば便利だと感じました。

## アプリの目標
前述したように、このアプリの目的は、アプリの拡散手段を提供することです。

## 完成したアプリの機能
- TL画面（いいね！機能）
- ToDay画面
- ゲーム画面
- アプリ画面
- アプリ追加申請画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/6bfa4c04-54b8-264d-c04a-4c6607a8f294.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/351f3d83-60f4-22bc-c880-8d309c151877.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/0107f9b5-b917-04ce-4608-abd5bf36cf79.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/400d4a84-4f38-f876-79d2-59e3a798756a.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/f202c4d6-eea2-0788-0af5-f93586bcfcab.png" width=50%>

## リリース後のリジェクト内容
### 一回目
アプリ追加申請時に、AndroidアプリかiOSアプリかを選ぶラジオボタンで、「Android」という文言を使用していたため、リジェクトされました。このため、判断をURLで行うように修正する必要がありました。

### 二回目から六回目
ガイドライン3.3.2違反としてリジェクトされました。以下はその内容です。

> ガイドライン 3.2.2 - ビジネス - その他のビジネスモデルの問題 - 許容されない
>
> App Storeと似たような方法で、自分自身のアプリ以外のアプリを購入またはプロモーションするために表示しています。フィルタリング、ブックマーク、検索、または推薦の共有などの機能は、App Storeと大きく異なるとはみなされません。
>
> 対処方法
>
> この問題を解決するには、アプリを評価し、App Storeと機能的および視覚的に異なる特徴を取り入れてください。または、健康管理、航空、アクセシビリティなどの特定の承認済みニーズ、または特定のユーザーグループに対して有意な付加価値を提供するように、アプリの内容を修正および制限することもできます。

リジェクトの原因は、アプリがApp Storeのランキングに影響を与える可能性があるためです。実際、大手のアプリレビューサイトもアプリとして提供していないのは、この問題が原因の可能性が高いと考えられます。
また、下記ガイドラインにも明記されていました。

https://developer.apple.com/jp/app-store/review/guidelines/#unacceptable

## 最後に
アプリの制作時間は一週間と短かったですが、広告収益はこのアプリに頼る予定だったため、計画が台無しになったことは非常に悲しいです。ただし、リジェクトの内容はガイドラインに明記されているだけでなく、理にかなっていると言えます。この問題を最初に確認しなかったのは私のミスです。

皆さんも、アプリを作り始める前にしっかりとリジェクトの内容を確認しましょう。

## 最後に2
めっちゃ悔しいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい

https://apps.apple.com/jp/developer/kira-soga/id1542553141
Flaskで時間がかかる処理を同期処理でやってしまいたい場合

### 本記事の背景
ダウンロードなど時間がかかる処理を行う場合、先にResponseを返さないと応答なしエラーが表示されてしまいます。
これを回避するためにマルチスレッド処理が良いのですが、マルチスレッドをちゃんと理解しないと実装が難しいと思われます。
もう一つは非同期を実装する方法です。こちらは、Pythonの非同期を使うやり方がありますが、asyncやawaitに対して理解が必要になります。

そこでマルチスレッドを使わずに普通の関数でやってしまいたい時に本記事を参考にしてください。
但し、簡易なメッセージのみ表示するので、カッコ悪い部分は勘弁してください。

### Streaming Contents
使い方は簡単です。Flaskで提供しているStreaming Contentsを使うと簡単な実装で済みます。
※こちらは非同期ではなく、同期処理になります。

```Python
# stream_with_contextインポート
from flask import Flask, stream_with_context

#時間がかかる処理関数
def download_mp3(url, file_name):
	yield "Start:<br>"
	ins = networkmusic(url, file_name)
	ins.download()
	yield "END"

# ルーティング関数
@app.route('/download', methods=['POST'])
def download():
	if request.method =="POST":
		url = request.form.get("url")
		tp = request.form.get("tp")
		file_name = request.form.get('file_name')
		if len(url) >=1 and len(file_name) >=1 :
            # streamを使ったWebの更新
			return app.response_class(stream_with_context(download_mp3(url,file_name)))
		else:
			pass
```

### 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/fbbaeb23-7df0-4a37-c302-5f407df9b681.png)


### メリット
・実装が簡単
・非同期処理の実装が不要
・リアルタイムで処理結果が見れる

### デメリット
・UIがダサい
※ただし、よりよい改善方法が見つかれば、少し良いUIを実装することも可能

### 別解
FlaskのResponseを使用しても同様な効果が得られる
```python
from flask import Flask, Response
return Response(download_mp3(url,file_name), mimetype='text/event-stream')
```

### 参考文献
Flask 公式ページ
https://flask.palletsprojects.com/en/2.1.x/patterns/streaming/
paiza.ioでelixir その239

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

# 参考にしたページ。

https://qiita.com/RyoWakabayashi/items/fe12267d48a8e950d844

# サンプルコード

```

defmodule Main do
  @words ["eraser", "erase", "dreamer", "dream"]
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end
  def solve(input) do
    s = String.trim(input)
    Enum.reduce(@words, s, fn word, acc ->
      String.replace(acc, word, " ")
    end)
    |> String.trim()
    |> case do
      "" -> 
        "YES"
      _ -> 
        "NO"
    end
  end
end


"""
erasedream
"""
|> Main.solve()
|> then(&(&1 == "YES"))
|> IO.inspect

"""
dreameraser
"""
|> Main.solve()
|> then(&(&1 == "YES"))
|> IO.inspect

"""
dreamerer
"""
|> Main.solve()
|> then(&(&1 == "NO"))
|> IO.inspect





```

# 実行結果

```
true
true
true

```

# 成果物

https://paiza.io/projects/y6D4lTz0St_ogL-b_xp3Dw?language=elixir


以上。
Windows10でhostsファイルにDNSレコードを追加する方法

# 1.hostsファイルを開きます。
エクスプローラーから以下のファイルを開きます。
　C:\Windows\System32\drivers\etc\hosts
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493245/191a8206-8245-87f4-14b4-8983019f47ad.png)
# 2.レコードを追加する
以下のようにIPアドレスとホスト名を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493245/54651f1f-b721-b822-0149-caa5c078cd55.png)
CAFA 5 Protein Function Prediction やりたいことメモ(2023/06/30)


# はじめに
<!-- 発端や概要を記載 -->
以下のkaggle コンペについての覚書です。

https://www.kaggle.com/competitions/cafa-5-protein-function-prediction


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [問題設定](#Chapter1)
1. [お手本になるノート](#Chapter2)
1. [やりたいこと](#Chapter3)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 問題設定
タンパク質(? DNAかも?)のアミノ酸配列からタンパク質の機能を予測したい。

[予測元]
アミノ酸配列はFASTA形式というのを使う。
以下の例はkaggleで提供されているデータベースの中のID P20536 というタンパク質のアミノ酸配列を示している。
```
>P20536 sp|P20536|UNG_VACCC Uracil-DNA glycosylase OS=Vaccinia virus (strain Copenhagen) OX=10249 GN=UNG PE=1 SV=1
MNSVTVSHAPYTITYHDDWEPVMSQLVEFYNEVASWLLRDETSPIPDKFFIQLKQPLRNK
RVCVCGIDPYPKDGTGVPFESPNFTKKSIKEIASSISRLTGVIDYKGYNLNIIDGVIPWN
YYLSCKLGETKSHAIYWDKISKLLLQHITKHVSVLYCLGKTDFSNIRAKLESPVTTIVGY
HPAARDRQFEKDRSFEIINVLLELDNKVPINWAQGFIY
```
sp|P20536|UNG_VACCC というのはデータの出典元である [UniProtKB](https://www.uniprot.org/help/uniprotkb) の中でのID。sp から始まっていたら実測結果あり、tr から始まっていたら計算による予測のみ。
IDの後にはsp-シリーズのみ慣用名とかが書いてあり、その下の行がアミノ酸配列。

[予測対象]
予測したいものは遺伝子オントロジー(GO)。
タンパク質の機能と GO term が一意に紐づいている。
GO term は大分類、小分類みたいな順序関係が入った半順序集合。
obonet っていう python ライブラリで networkX 形式で見られる。グラフは有向非巡回グラフ(DAG)となる。

やることは、FASTA形式のアミノ酸配列を与えられて、発現するGO term とその発現確率を求めること。

<a id="#Chapter2"></a>
# お手本になるノート

https://www.kaggle.com/code/henriupton/proteinet-pytorch-ems2-t5-protbert-embeddings

中の文章からのコピペ↓

1. 学習済みのタンパク質機能予測モデル（T5、ProtBERT、EMS2）から埋め込みベクトルを収集する。

2. train_termsファイルからラベルを生成：全タンパク質セットで上位600個の頻出GO用語を考慮し、K個のGO用語がタンパク質に含まれる真の確率（0または1）を示す長さKのスパースベクトルを各タンパク質について生成する。

3. Protein IDとエンベッディングを扱えるPytorch Datasetクラスを作成する。

4. 予測用のPytorch Modelクラスを作成：ここではMultiLayerPerceptronとConvNN1d Networksを検討。

5. 重みとバイアスパッケージ(Wandb)を使って、F-1メジャーを使った交差検証を行い、ハイパーパラメータのチューニングを行う。

このノートでは目的変数のデータは自分で作ることになっているけど、同じものを作ってくれている人がいるのでそれを使えばいい。
https://www.kaggle.com/datasets/siddhvr/train-targets-top500


<a id="#Chapter3"></a>
# やりたいこと
* 現状 GO terms の親子関係を活かせていない。「子の GO term をもつ &rArr; 親の GO term をもつ」となるはずだから、親の GO をもつデータに制限すれば子の GO を持つ割合も上がって予測しやすくなりそう。
* ハイパラチューニングができる気がしない。AutoMLで何か使えないか探す。
* 一度embeddingをしたから見えなくなっているけど説明変数に外れ値がある。異様に長い配列とか、ぜんぜん出現しないアミノ酸が登場するとか。ここらへんのお掃除もちゃんとしたほうがいいと思う。
OpenWrt 21.2 カスタムフィード

# はじめに
::: note
### 初心者対応構成
- スクリプトでの自動設定
- UCIとLuCi及びWinSCPにて比較しながら作業がおススメ
:::

::: note
### [PowerShell](https://learn.microsoft.com/ja-jp/powershell/scripting/what-is-windows-powershell?view=powershell-7.4)で[SSHアクセス](https://openwrt.org/docs/guide-quick-start/sshadministration)

- [PowerShellの開始](https://learn.microsoft.com/ja-jp/powershell/scripting/windows-powershell/starting-windows-powershell?view=powershell-7.4) (キー入力)：`Win`+`x` > `a` > `はい`
※Windows7以降標準搭載

```sh
ssh root@192.168.1.1
```

<details><summary>ssh root@192.168.1.1のショートカット作成（デスクトップ）</summary>

```powershell:powershell
$DESKTOP = ([Environment]::GetFolderPath("Desktop") + "\192.168.1.1.lnk")
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$DESKTOP")
$Shortcut.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$Shortcut.Arguments = '-windowstyle hidden -ExecutionPolicy RemoteSigned "Start-Process ssh root@192.168.1.1"'
$Shortcut.IconLocation = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,0"
$Shortcut.WorkingDirectory = "."
$Shortcut.Save()

```

- `強制的に貼り付け`
- `yes`

---

</details>

<details><summary>SSHログイン出来ない場合:exclamation:</summary>

known_hostsクリア
- `C:\Users\yourusername\.ssh\known_hosts` ※Windows隠しファイル
```powershell:powershell
Clear-Content .ssh\known_hosts -Force

```
---
OpenSSHのインストール
※Windows 10 Fall Creators Update(1709)以降標準搭載
- 機能の確認
```powershell:powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

```
- 機能のインストール
```powershell:powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

```
---

</details>

:::

:::note 
### 前提条件
- ファームウェア対応：21.02
:::

::: note
### [カスタム フィード](https://openwrt.org/docs/guide-developer/feeds#custom_feeds)
- [パーソナル OpenWrt OPKG サーバー](https://github.com/lrdrdn/my-opkg-repo)
- [my-opkg-repo/generic/](https://github.com/lrdrdn/my-opkg-repo/tree/main/generic)
```bash
sed -i 's/option check_signature/# option check_signature/g' /etc/opkg.conf
echo "src/gz custom_generic https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/generic" >> /etc/opkg/customfeeds.conf
echo "src/gz custom_arch https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}')" >> /etc/opkg/customfeeds.conf

```

確認方法
```bash
opkg print-architecture

```
:::
実はあったSerializedDictionary


## SerializeできるDictionaryが欲しい、、、

Unityで開発している際に「DictionaryをSerializeしたいな」とか「DictionaryをJson化したいな」と思うことありますよね。(私はありました)
ただ、SerializeするにはGoogleで調べた限りPairをListで作って`SerializeDictionary`というようなクラスを自作で用意する必要がありそうでした。

## 実はあったSerializedDictionary(注意点有)

たまたま見つけたのですが、`UnityEngine.Rendering`に`SerializedDictonary`クラスがありました。(英語でも検索に出てこなかったのであまり使われないのでしょうか、、、？)

https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@14.0/api/UnityEngine.Rendering.SerializedDictionary-2.html

> Unity can't serialize Dictionary so here's a custom wrapper that does. Note that you have to extend it before it can be serialized as Unity won't serialized generic-based types either.

SerializeできるようにWrapしてあると書いてあります。

:::note warn
ただしSerializeFieldを付けただけだとInspectorには表示されますが編集ができません、、、
内部に2つのリストを持っていてInspectorに2つ表示されますが、片方を編集したタイミングで`OnBeforeSerialize`が呼ばれてしまうので、もう片方のリストがnullだよと怒られます。
`PropertyDrawer`使えば対応できると思います(多分
:::

## 使い方

```cs
// シリアライズ化
//note: Inspectorには表示されるが編集ができない為、Editor拡張を作る必要有
[SerializeField]
SerializedDictionary<ulong, string> serializedDictionary;

// Json化は渡すだけでOK
var json = JsonUtility.ToJson(serializedDictionary);
serializedDictionary = JsonUtility.FromJson(json);
```

`SerializeField`を付けてInspectorに表示できますしJsonにもできます。
また既存の`Dictionary`を変更したい場合も、内部で`Dictionary`を継承しているので`SerializedDictionary`に変更するだけでOKです。

## おわりに

2023/07/01 誤字を修正

速度については検証しきれてません。ただサクッと少量のDictionaryをSerializeするには何も導入する必要がないので有用なのではないでしょうか。

Unity/C#といえばこの方の記事にもSerializableDictonaryがあります。

https://neue.cc/2016/03/21_526.html
PDFSharpにて日本語フォントを使用するための設定

## はじめに

C#でPDF生成を行う際に、日本語フォントで正常に表示することが出来なかったので、
PDFSharpを使用して日本語フォントを正しく表示するための設定方法について説明します。

## 実行環境

実行環境は以下となります。

- .NET Framework 4.7.2
- PDFSharp 1.50.5147

## PDFSharpでの日本語フォントの設定

PDFSharpでは、以下の手順を実行することで日本語フォントの正しい表示を実現できます。

1. 日本語フォントをプロジェクトに追加します。フォントファイル（例: `ipaexm.ttf`）を用意してください。
2. `FontResolver`クラスを作成します。以下に修正後のコードを示します。

```csharp
using System.IO;
using PdfSharp.Fonts;

public class FontResolver : IFontResolver
{
    private readonly string _fontPath;

    public FontResolver()
    {
        _fontPath = Path.Combine(Directory.GetCurrentDirectory(), "Fonts", "ipaexm.ttf");
    }

    public byte[] GetFont(string faceName)
    {
        using (var fontStream = File.OpenRead(_fontPath))
        {
            var fontData = new byte[fontStream.Length];
            fontStream.Read(fontData, 0, fontData.Length);
            return fontData;
        }
    }

    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        return new FontResolverInfo(familyName);
    }
}
```

修正後のコードでは、`FontResolver`クラスが使用されます。このクラスは、`IFontResolver`インターフェースを実装し、日本語フォントのパスを指定して読み込む役割を果たします。

3. PDF生成のコードで、`FontResolver`クラスを使用して日本語フォントを設定します。以下に例を示します。

```csharp
// PDF生成のコード
var fontResolver = new FontResolver();  // FontResolverのインスタンスを作成
GlobalFontSettings.FontResolver = fontResolver;  // PDFSharpのフォント解決にFontResolverを設定

// ここからは通常のPDF生成処理
var document = new PdfDocument();
var page = document.AddPage();
var gfx = XGraphics.FromPdfPage(page);

XFont font = new XFont("IPAex明朝", 12, XFontStyle.Regular); 

 // 使用する日本語フォントを指定

gfx.DrawString("テキストの表示例", font, XBrushes.Black, new XRect(50, 50, page.Width - 100, page.Height - 100), XStringFormats.Center);  // テキストを表示

document.Save("output.pdf");
```

上記のコードでは、`XFont`クラスを使用して日本語フォントを指定し、`gfx.DrawString`メソッドで日本語テキストを表示しています。フォント名とサイズ、スタイルを適宜変更してください。

以上の手順を実行することで、PDFSharpで日本語フォントを正しく表示し、テキストを表示することができます。

## まとめ

C#でのPDF生成において日本語フォントを正常に表示するにはそれ用の設定が必要でした。
上記コードを使用することにより、PDF生成において正常に日本語フォントが利用され、
正常に日本語テキストが表示することが出来ました。
プロンプト１つで動画が完成!? ～GPT×プラグインVisla~

## ChatGPTへの指示１つで、動画ができる？

ChatGPT＋Visla（プラグイン）

※ここでは、プラグインを使いますので有料課金「GPT-4」が必須です。

「Visla」というプラグインを使うことで、プロンプト１つで動画のアウトライン（大まかな台本）を作成し、動画として出力までしてくれます。

Vislaについての詳細は [公式ページ](https://www.visla.us/chatgpt-plugin)をご確認ください。

```
私が経営する新しくオープンした、ドーナツ屋さんの宣伝を行うビデオを作りたい。ビデオの内容をブレストて、ビデオ制作のインプットになる、アウトラインを箇条書きで提示してください。
```

この指示で出来上がったアウトラインがコチラです。

```
1. ビデオの開始：郊外のドーナツ屋の外観を映し、店名の看板を大きくクローズアップ。

2. 店内の雰囲気：店内のカフェスペースを映し、客が楽しくリラックスした雰囲気を感じることができます。

3. ドーナツの製造過程：ドーナツが作られていく過程、とくに揚げている工程を映し、手作りされることを強調します。

4. メニューのハイライト：店の特別なドーナツを紹介します。これには、ドーナツがディスプレイに並べられる様子や、料理が提供される様子の映像が含まれます。

5. カスタマーレビュー：幾つかの短いクリップで、満足した顧客がドーナツの美味しさや店の経験について語ります。

6. ビデオの終わり：店のロゴと連絡先情報を表示し、視聴者に訪れるように促します。
```

このアウトラインに対して下記のように回答をして、しばらく待つと…

```
ビデオが作成できたら、教えてください。
```
おおよそ1分～2分程度で、ビデオが出来ましたというメッセージが表示されます。

```
ビデオの作成が完了しました！以下のリンクからご覧いただけます：

https://app.visla.～…

ビデオの詳細は以下の通りです：

タイトル: Discover Our New Donut Shop - A Sweet Experience Awaits

説明: Take a virtual tour of our new donut shop. Experience the fun and relaxed atmosphere, see how our donuts are handmade from fresh ingredients, and hear from our satisfied customers. A sweet experience awaits you at our shop.

タグ: donut shop, donuts, new shop, shop tour, promotional video

ビデオを保存または編集するためのクレームコードは 「XXXXXXX」です。このコードは24時間後に失効しますので、ご注意ください。
```
出来上がった動画は、回答の中にあるURLから確認ができ、ダウンロードも可能です。実際に出来上がった動画を、下記へ貼っておきます(画像をクリックすると閲覧可能です)。


[![](https://miuradonuts.com/wp-content/uploads/2023/06/スクリーンショット-2023-06-30-133416.jpg)](https://miuradonuts.com/wp-content/uploads/2023/06/GPT-Visla.mp4)


…と、クオリティは正直そこまで高くないのですが、プロンプト１つでここまでの動画が出てくるのは凄いことです。

## どんな使い方ができるのか、私の感想
ここでできた動画は、クオリティもそうですが、素材に使われている元ネタの著作権などが不明なため、成果品とすることはできません。しかし、動画制作の下絵としては、十分活用ができると思います。

「こんなイメージで動画をつくって欲しい」という「絵コンテ」としての使い方が、最もベターで威力を発揮しそうです。

動画制作の依頼を受けて、せっかく作ったのに「ダメ出しがめちゃくちゃ降ってくる」こと、ありますよね。かといって、絵コンテでイメージを共有するのは、実はなかなかハードルが高い（イメージを絵で伝えるのって、結構大変なんです）。

動画制作前のイメージのすり合わせとしては、抜群に簡単なので、そうした使い方がオススメだと感じました。皆さんも、ぜひ使ってみてはいかがでしょうか。

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/30/prompt-002/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
ハードディスクの新しい領域を作り、使用するまで

vmware + centos7環境使用

1 vmwareのcentos7の設定画面で仮想ハードディスク追加
  →centos7のディスクツール or dfコマンドで、/dev/sdbに追加されていることを確認。
2 fdiskで/dev/sdbに対して、パーティション追加
  →基本パーティション/dev/sdb1 
3 mkfsで/dev/sdb1にxfsファイルシステムを作成
4 mountで/dev/sdb1を/mntにマウント
/mntで仮想ハードディスクにアクセスできる

ラベル使うなら、追加設定
6 e2label /dev/sdb1 /labelname    
7 /etc/fstabにLABEL=/labelname /labelmnt  default 0 0
再起動する。
これでcentos7にログインした時点で/labelnameで仮想ハードディスクにアクセス可能
【Vue.js】あなたの身近にいる特級呪物キメラコード

# ストーリー(特級呪物ができるまで)

## **1. 設計フェーズ：共通処理の効率化を目指して**

私たちの開発チームのAさんとBさんが集まって、新たに制作する予定のXXXWebサイトについて話し合いました。

Aさんが提案してくれました。「XXXWebサイトでは、無限スクロールを多用する予定ですよね。しかし、設計を深く考えずにただ実装に取り組んでしまうと、同じようなコードを何度も書く羽目になり、結果的には冗長で非効率な（WETな）コードが出来上がりそうです。なにか、共通部分をうまく抽出して効率的に扱う方法はありませんか？」

Bさんがその提案に対して、「Vue.jsのmixinが使えるんじゃないかと思います。これはCSSの「mixin, include」に似た機能で、異なるコンポーネントで共通のコードを整理し、一つのファイルにまとめることができるんです。」と返答しました。

Aさんはこのアイデアに明らかに興味を引かれたようでした。「それなら、オブジェクト指向でいうところの継承のような形で、コードを使い回せるというわけですね？」

Bさんの肯定的な返答を受けて、Aさんは満足げにうなずき、「それなら、是非mixinを試してみましょう！」と提案しました。

## **2. 実装フェーズ：mixinでの共通処理の実現**

実装の途中、Bさんは一つの問題に直面しました。あるページでは、無限スクロールの前にあらかじめ10件のデータを取得するという要件がありました。そこでBさんは、この要件に対応できるようにmixinの共通処理を修正しました。

そしてAさんにコードレビューを依頼し、Bさんは「mixinファイルを変更したんですが、動作には問題なさそうです。プルリクエストを作成しますね。」と報告しました。

Aさんも問題が無いと確認し、「mixinファイルの修正、問題なさそうですね。プルリクエストを承認します。」と応答しました。

その後も開発進行中に、AさんとBさんは同じような事態に数回遭遇しましたが、その都度mixinファイルを修正して解決しました。

## **3. リリースフェーズ：スムーズなリリース**

そしてついに、私たちはXXXWebサイトを問題なくリリースすることができました。

## **4. メンテナンスフェーズ：mixinを活用した修正作業（3ヶ月後）**

3ヶ月後、新たにチームに加わったCさんが、XXXWebサイトのYYYページの修正を担当することになりました。CさんはAさんとBさんにヒアリングしたところ無限スクロールのmixinファイルを修正することでページの修正が簡単にできると話していたことを思い出しました。

そこでCさんは、mixinファイルを修正し、YYYページを更新し、デプロイを実行しました。

## **5. 修正後のデプロイ：予期せぬ問題**

しかし、全てが順調というわけではありませんでした。YYYページは問題なく動作したものの、他のZZZページがエラーページを表示してしまうという、予期せぬ問題が発生しました。さまざまな無限スクロールに対応したmixinファイルは複雑に入り組み簡単な修正でもどこに影響を及ぼすかわからないキメラコードになっていました。

# 原因

言うまでもなく様々なページの無限スクロール機能に対応すべくmixinファイルを修正したことが原因です。

リリースフェーズでは開発者がAさん、Bさんが完全にmixinファイルの内容を理解して作業を行ったためスムーズにリリースできましたが、少し時間を空けるとどのように作成したかを忘れているため、Aさん、Bさんが修正を行ったとしても問題なくデプロイすることは難しくなります。

# 対策(と言うか戒め)

## 共通処理を書いているファイルを作成する時は最小限の処理に抑える

様々なケースに対応できる共通処理を目指すのではなく、全てのケースで必要なものだけ記述するようにします。

## 共通処理に機能追加を行ってはならない

共通処理に機能追加をすると言うことはキメラコードにすると言うことです。機能追加を行うくらいならWETになってもいいので新たに別で共通処理を記述する方がメンテナンスしやすいです。

# ちなみに

- 上記のストーリーは業務で実際に発生した問題をもとに作成しています。
- Vue.jsのmixinはアンチパターンらしいです。