OmniAICreator/Qiita-1.07M huggingface dataset:
Messaging for In-App and Webの　トレイルヘッド


[Messaging for In-App and Webのまとめに戻る](https://qiita.com/Keiji_otsubo/items/97b3e0c3587bdb6bfa72)


+ [Salesforce Messaging](https://trailhead.salesforce.com/content/learn/modules/salesforce-messaging)
+ [Messaging for In-App and Web Optimization](https://trailhead.salesforce.com/content/learn/modules/messaging-optimization-for-in-app-and-web)
+  [Module : Messaging for In-App and Web Optimization　要約](https://qiita.com/Keiji_otsubo/items/a5476b118813e2d721b1)
+ [Service Cloud: Get Started with Messaging for Web and In-App](https://trailhead.salesforce.com/users/officialblaze/trailmixes/service-cloud-get-started-with-messaging-for-web-and-in-app)
OpenCV binary to grayscale

グレースケール画像を`threshold`関数により２値化.
バイナリデータをgrayscaleに変換したい.

コードは以下.gray,binそれぞれの値を見る.

```
gray = cv2.imread("image.png", cv2.IMREAD_GRAYSCALE)
bin = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
```

- gray データ形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/b034e928-4567-65b3-d8f0-78364d51b827.png)

- bin データ形式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/bba7d90d-01e7-f816-0b08-dcd43cbf46d7.png)

grayscaleデータは通常のopencvのmat形式
binデータは`[しきい値，mat画像]`のような形式

binデータからgrayscale画像を取得するには,`bin[1]`のようにリストの第二変数を取得すると良い．

# 宣伝

販売製品

- 3D Vision Controller ： ロボットアームによる3次元ピッキングを実現可能にします

https://hoshinarobot.base.shop/items/70144084

お仕事依頼

- メールアドレス : ryotaro.hoshina@gmail.com

- coconala : https://coconala.com/users/4162706

- CloudWorks : https://crowdworks.jp/public/employees/5569031
PHPフレームワークLaravel入門第2版を読むときに気をつけること


## 課題

掌田津耶乃著の[Laravel 入門第 2 版](https://www.shuwasystem.co.jp/book/9784798060996.html)は Laravel 6 をベースにかかれているため、2023 年 9 月現在の最新バージョンでは動かないコードがある。

## 環境

WSL2 Ubuntu 20.04.6 LTS
Laravel Framework 8.83.27

## 本の通りでは動かないシリーズ

### p.43 のルート情報の書き方

#### 問題

本の通りに書いても、クラスが見つからないというエラーが出る。

#### 対処法

Laravel 8 では、コントローラのアクション名をフルパスで書く必要がある。

```
Route::get('hello', 'App\Http\Controllers\HelloController@index');
```

## 終わりに

読み進めていくうちにまた動かないコードが出てきたら追記する予定。
NeosVR コンパイラ その6

# 概要
NeosVRのオブジェクトを外部で生成するコンパイラを開発した。
閃いた、コンパイラにapiサーバを使う。
構想編。

# 方針
- LogiXオブジェクトは、いっぱいある。それを、apiサーバに蓄積してメンテナンスして
コンパイル時に、提供する。
コンパイルにapiサーバを使う。邪道だ。

- APIサーバは、Phoenixで、実装する。

以上。
[備忘録] macOS で AWS Session Manager(SSM) を使ってLinuxサーバーに接続できるようになるまで

# はじめに
macOSのターミナルから下記コマンドでLinuxサーバーに接続しようとしたところ、Session Manager プラグイン がないと怒られた。
```
% aws ssm start-session --target ${踏み台EC2のID}
SessionManagerPlugin is not found. Please refer to SessionManager Documentation here: http://docs.aws.amazon.com/console/systems-manager/session-manager-plugin-not-found
```

そこで、Session Manager プラグインをインストールしたのだが、インストールできるまでいくつかのエラーに遭遇したのでここに記す。

# 実施したこと
### [エラー1] SessionManagerPlugin is not found. 

まずは、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-macos-overview.html)の手順に沿って、Session Manager プラグインのインストールを試みた。

インストーラのダウンロード
```
% curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
```

パッケージの解凍
```
% unzip sessionmanager-bundle.zip
```

インストールコマンド実行
```
% sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
```

ここで、下記エラーが発生。
```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

公式ドキュメントに「Python 2.6.5 以降、または Python 3.3 以降が必要」と注意書きがあったので、Pythonのバージョンを確認したところ、Pythonがインストールされていなかった。  
```
% python -v
zsh: command not found: python
```

### [エラー2] zsh: command not found: python

次にPythonのインストールを行う。  
Homebrew はインストール済み、pyenv は未インストールの状態のため、pyenv -> Pythonの順にインストールする。
```
% brew -v
Homebrew 4.0.28
% pyenv -v
zsh: command not found: pyenv
```

下記コマンドで pyenv をインストール後、
```
% brew install pyenv
```

[参考資料](https://prog-8.com/docs/python-env)に従って pyenv の設定を行った。
```
% pyenv -v          
pyenv 2.3.24
% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
% echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(pyenv init -)"' >> ~/.zshrc
% source ~/.zshrc
```

そしていよいよ Python のインストールをしたところ、またエラーが発生した。
```
% pyenv install 3.11.4
...
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

### [エラー3] xcrun: error: invalid active developer path
macOSのアップデート後あるあるのエラーらしく、xcodeをインストールすれば解決するようなので、インストールした。
```
% xcode-select --install
```

### 解決編 🎉
再度Pythonのインストールと設定をすると、無事に Python 3.11.4 を使用できるようになった。  
```
% pyenv install 3.11.4
% pyenv versions        
* system (set by /Users/user/.pyenv/version)
  3.11.4
% pyenv global 3.11.4
% python --version   
Python 3.11.4
```

そして、Session Manager プラグインのインストールも成功。
```
% sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin  
...
Installation successful!
```

最初にやりたかったことである、Linuxサーバーへの接続も無事行えた。
```
% aws ssm start-session --target ${踏み台EC2のID}
Starting session with SessionId: *****
```


# 最後に
参考にした文献を記す。
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-macos-overview.html
- https://prog-8.com/docs/python-env
- https://qiita.com/nishina555/items/e23d73067a5cac182a63
- https://zenn.dev/yogarasu/articles/d48412fa66b040
Xcode 15とWidgetの組み合わせで、WidgetのPaddingが変わってしまう問題の対処法

Xcode 15で、Widgetの見た目に問題が出てきたので、それの対処法について説明します。

## 問題
Xcode 15コンパイルすると、iOS16以前とiOS17で見た目が大きく異なってしまうようになりました。
上下左右のpaddingが勝手に追加されてしまい、元々あったWidgetのレイアウトが崩れてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500709/7a00196e-0d59-a345-9ccd-da600ab60441.png)

## 解消法

```.contentMarginsDisabled()```を呼び出してあげるだけで解決できます。

```swift
struct ConecastWidget: Widget {

    let kind: String = "ConecastWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            ConecastWidgetEntryView()
        }

        .configurationDisplayName("Forcast")
        .description("See the current weather conditions and forcast for a location.")
        .supportedFamilies([.systemSmall])
        .contentMarginsDisabled()
    }
}
```

## 参考
https://developer.apple.com/forums/thread/731423

## 作ってるアプリ
https://apps.apple.com/app/conecast/id6463732588
AtCoder ABC273-A


AtCodeのビギナー用A問題をひたすら解いてます。
簡単なのでモチベーションあがります。
こうしたらOKだったよっていうのを載せます！
（ダメだったよ！ってのも載せてます）

# AtCoder Beginner Contest 273
https://atcoder.jp/contests/abc273/tasks/abc273_a

nの階乗を回答する問題だったので、関数fを作ったのですが、
制限時間の2秒を超えるケースが2つ発生しました＞＜
```
def f(n):
    if n-1==0:
        return 1#f(0)
    else:
        return n*f(n-1)#関数fを再帰する

n=int(input())
print(f(n))
```

行き詰ってコード解説を確認したら、n!を一発で計算する関数math.factorial(n)を利用するコードが紹介されていました。
Pythonのリファレンスで確認してみたら、「n の階乗を整数で返します。n が整数でないか、負の数の場合は、 ValueError を送出します。」と説明が。。。
そのまんまや。
ライブラリもどんなことができるのか、どんどん知識をためないとなぁと思った瞬間。
```
import math

n=int(input())
print(math.factorial(n))
```
自作PC Core i5 7600K版 (2020年組立分)

- Core i5 三号機。主にC#,C++,Arduino,Android開発用。
- うちでは最高性能の7600K。
- 今回使用するケース　LianLi PC-V1100。重厚な総アルミ製。
- 調べた所、2004年に発売された品で当時は3万円位した模様。(中古6800円)
<a href="https://akiba-pc.watch.impress.co.jp/hotline/20041009/ni_i_cs.html">ケース類/関連製品の新製品</A>
![CA1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/869309e3-5689-56b5-f164-13d793d78e3b.jpeg)
- 中はこんな感じ。ベイが多数あるものの未使用。高さキャスタ除く45cm 長さ51cm 幅20cm
![9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/e1350a51-7b21-7a30-3c0b-fdb2a43225c0.jpeg)

- 主役である、インテル製プロセッサ Core i5-7600K。(中古13700円)
![M1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/fc1932ab-0f70-4e20-9df4-28551ad97bc0.jpeg)
- LGA1151ソケット　ここに物を落とすとピンが曲がり廃棄となる。
![31.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/907975d7-f887-e976-c9a6-e021744571a4.jpeg)
- メインボード H170-PROに装着された7600Kと導電性高分子アルミニウム固体電解コンデンサ。VRM(Voltage Regulator Module)電源回路部。青い物はMPUに貼った熱伝導シート。
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/4d09763a-d38c-2c74-0307-8d8004e341e6.jpeg)
- 7600Kに冷却器を装着(中古750円) 
数ミリのサイズの違いで古い規格の物が使えず。もう少し考えてほしい。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/2e377c5b-98a9-209a-4749-9bc7ba8d97ff.jpeg)
- メインメモリ DDR4 PC4-21300 2666MHz 4GB。(中古1780円)
他の機から同様のメモリを取り外して装着。計8GBytes。
![MEM.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/4ca02925-83e3-22f5-04b5-83fad6cc7d94.jpeg)
- スイッチング電源。流用。内部点検、清掃等。(時価2000円位)
あまり安い物は使わない方が良い。
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/047cf07c-38a2-7ac0-e321-286f50636da4.jpeg)
- 仮運転。UEFIの起動確認。H170-PRO全景。パネルスイッチだけはつなげる必要あり。
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/bf2c4427-b5db-fd80-e501-10900c4763d5.jpeg)
- 動作確認後、ケースに組み込み。ちょっと面倒。
![22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/80f78eb2-04a6-c823-cf53-6835edd89fd0.jpeg)
- 新品はこのSSDのみ。240GB。3560円。
![SSD.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/3248c0e5-efe4-675a-4d0d-dddd001717fc.jpeg)
支払額 34000円程。今回は4GBメモリと電源装置は流用なのでそれを加味したとしても38000円程。
次回換装時はケースはそのまま使えるし電源装置も使えるようだったら流用するのでいろいろエコ。
実際、換装した一号機のケースは2004年に購入したものを使用中。
調べ方についての話

# はじめに
　ここ最近、わからないところを調べることができない人が増えていると聞いて、実際にそのような人がいることを実体験した出来事があったので語っていく。

　ここからは友人の話になるのだが、友人はまだパソコンを使い慣れていないレベルなので、この記事を読むときは温かい目で読み進めてください。
　そして、調べ方についてVSCodeにPythonの環境を構築しながら進めるが詳しい内容については書かないので、もし、VSCodeにPythonの環境を構築したいときは他の記事を参照していただきたいです。

# 話をしよう
　友人にVisual Studio Code(以下 VSCode)の入れ方とC言語の環境構築を教え終わった後、「Pythonを使ってcsvファイルにデータを書き込む方法がわからない」と話していたので、どこがわからないのかを聞くと、「どうやってデータを書き込めばいいのかわからない」と返ってきた。
　そこで、一度自分で調べてみたのかを聞いてみると「詳しくは...調べていない...」と返ってきたので、おそらくプログラムが苦手というよりかは調べ方が苦手なのではと思ったが、調べ方なんてどうやって教えるんだ？と頭を抱えた。
　とりあえず自分で調べながらPythonでcsvファイルにデータを書き込んでみようと思ったが、ちょうどPythonの環境構築をしていないじゃないか！！(歓喜)
　せっかくなのでVSCodeにPythonの環境を自分で調べて構築してみようと提案して、友人の調べ方を見てみると、まぁ、できていない。調べ方に答えはないと思うがそう思ってしまうほどに調べ馴れていない感じがひしひしと伝わった。
　では、友人がどのように調べていって目的を達成したのかを記す。

## キーワードを考えて検索をしよう
　さすがに、最初に何をしたら良いのかわからない状態で調べものをさせるのはさすがに酷なので、まず、自分でVSCodeにPythonの拡張機能の追加するところを目的にした。
　早速、検索エンジン(Google先生)を開いて調べてみようというところで、テキストボックスにカーソルを合わせたところで友人の手が止まった。見た感じなんて調べたら良いのかわからない様子だった。そこで**目的のキーワードを考えて**それを検索にかけようと言葉をかけると、キーワードを考えているところから、そもそも**目的が定まっていない**感じがした。
　なので、まず何をするのかを思い出してみようと声をかけると、「VSCode Python」と入力し検索にかけた。すると、VSCodeにPythonの拡張機能を追加する方法が載っているサイトが多数引っかかった。

## 自分が望んでいるサイトを見つけよう
　では、ここからどのサイトを参照するかを決めていく。検索に関連したサイトは数多とあるので、その中から自分が望んでいるサイトを見つける作業をしなければならない。なので、無難に上から一つ一つサイトを開いていって探していく。
　友人は開いたサイトの文章を上から順に読み進めていたので、これだと日が暮れると思い、**一度ざっと目を通して目的に関係のあるサイトかを見極めた**ほうが良いよと声をかけた。その中で**図や表(特に最後)に目を向けて**しようとしていることにあっているかを見たほうが良いとアドバイスをした。そして、友人が望んでいるサイトを一つ見つけることができた。

## 実際に真似をしよう
　見つけたサイトに載っていることを真似をして、**そのサイト通りに動くのかを確認**する。コマンドプロンプトを使うなどいろいろ困難はあったが、何とか最後まで進めることができた。しかし、思ったように動かない。ここで、何が原因なのかをさらに調べる必要が出てきた。

## 問題が増えたら解決方法を調べる
　これらの工程を繰り返すように、まず何ができないのかを検索するとPythonをインストールする必要があることがわかった。では、Pythonの入れ方が載っているサイトを探して、見つけたサイトの通りにインストールした。そして、もう一度止まったところを行うと、上手くサイト通りに動くことができた！！
　これで友人はVSCodeにPythonの環境を自分で調べて構築することができた！！

# まとめ
　何かを調べるときは、項目に合わせてまとめると以下のことを意識しよう。

1. キーワードを考えて検索する
目的を明確に定めて、その目的のキーワードを考えて検索する。
検索するキーワードは5W1Hを心がけることで見つけやすくなる。
この時、有益なキーワード、無益なキーワードを考えると検索結果の質が良くなる。

1. 自分にあったサイトを見つける
ざっと目を通して目的に関係のあるサイトかを見極める。
※ 注意点として、更新日をよく確認したほうが良い。特にテクノロジー系のサイトでは、もののバージョンがすぐに更新されるため、1年でも古い記事では参考にできないことがある。

1. 実際に真似をしてみる
最初に、我流ではなく、確実に動くサイトの通りに進めることで、今抱えている問題を洗い出すことができる。

1. 問題が増えたら1.～3.を繰り返す
洗い出した問題を調べて解決して、目的を目指す。

　そして、自分で調べてもわからず、誰かに相談しに行くことが必ずある。そのために、これらの手順をメモをすることをお勧めする。何をしようとしているのか、何をしたのかを完全に覚えられる人は良いが、もし、覚えられなかったとき、何をしようとしているのかが伝わらない、何をしたのか覚えていないなどで相談が円滑に進まなくなることがある。ほかにも、自分がやったことを見返すのにそのメモが非常に役に立つ。そのために、余裕があればで良いので作業した内容をメモに残すことを勧める。

# さいごに
　近年では、ChatGPTなどの生成AIを用いて調べ物をする方法が広まっているが自分が抱えている問題を提示する以上、必ず直面する問題であると考えています。これは、質問や相談の仕方でも当てはまるため、ある程度調べるコツを身に着ける必要があります。この記事で調べ方のコツやその重要性を知るきっかけになればと思います。
GoでFizzBuzz

### FizzBuzzとは

数列を1つずつ表示する。ただし3で割れる数が来たら「Fizz」
5で割れる数が来たら「Buzz」。3でも5でも割れる数が来たら「FizzBuzz」と表示する

### ソースコード

```
package main

import "fmt"

func main() {
	for i := 1; i <= 20; i++ {
		if i%3 == 0 && i%5 == 0 {
			fmt.Println("FizzBuzz")
		} else if i%3 == 0 {
			fmt.Println("Fizz")
		} else if i%5 == 0 {
			fmt.Println("Buzz")
		} else {
			fmt.Println(i)
		}
	}
}
```

有名すぎて何度もやってるけど違う言語で初めて書くと改めて楽しい。
# mysql-connecor-pythonで生じたエラー[No module named 'mysql.connector'; 'mysql' is not a package]  ##

## エラー内容

```bash
No module named 'mysql.connector'; 'mysql' is not a package
```

```bash
$ pip install mysql-connector-python
```

上記のように確実にインストールしているのに、なぜかエラーが発生していた。

## 原因

ファイル名を’mysql.py’に設定していたことが原因。

自身のプログラムの’connector’を探していたため、エラーが発生していた。
Oracle:SET VERIFY ONの使い方

### 使い方

置換変数を含むSQLを実行する時に、置換前後のSQLを実行するために使う

### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/e2e23342-b775-701e-84e3-db55bef21e73.png)

旧と新の結果が明示される
【Unity】Audio Source の Output をスクリプトから設定する

# 概要
Output の項目をスクリプトから自動で設定したくなったので調査。

# 実装方法
AudioMixer内の、SEという名前のグループを自動で設定する。
```c#:AudioModule.cs
    var audioSource = GetComponent<AudioSource>();
	if (audioSource)
	{
		var mixer = UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEngine.Audio.AudioMixer>("Assets/Datas/Audio/AudioMixer.mixer");
		audioSource.outputAudioMixerGroup = mixer.FindMatchingGroups("Se")[0];
	}
```
【Unity】Cinemachine Impulse Source をスクリプトから設定

# 概要
Cinemachine Impulse Source 内のいくつかの変数を、スクリプトから自動で設定したくなったので調査したので結果をまとめておく。

# Impulse Type
Legacy に設定する。
```c#:ImpulseModule.cs
var definition = GetComponent<CinemachineImpulseSource>().m_ImpulseDefinition;
definition.m_ImpulseType = CinemachineImpulseDefinition.ImpulseTypes.Legacy;
```

# Raw Signal
6D Shakeを設定する
```c#:ImpulseModule.cs
var definition = GetComponent<CinemachineImpulseSource>().m_ImpulseDefinition;
definition.m_RawSignal = UnityEditor.AssetDatabase.LoadAssetAtPath<SignalSourceAsset>("Assets/Datas/Misc/6D Shake.asset");
```

# Frequency Gain
5を設定する
```c#:ImpulseModule.cs
var definition = GetComponent<CinemachineImpulseSource>().m_ImpulseDefinition;
definition.m_FrequencyGain = 5;
```
FizzBuzzを0byteで実装する

[FizzBuzzを1byteで実装する](https://zenn.dev/ymg_aq/articles/5fa3ab90971f86)
が面白かったので、FizzBuzzを0byteで実装できる言語を作ってみた。~~(手抜き)~~

# FizzBuzz文字列

まず、正の整数 n について、「nまでのFizzBuzz文字列」を以下のように定義する。

整数 $i = 1, \ldots, n$ について、 $S_i$ を以下のように定義する。

* $i$ が15の倍数のとき $S_i$ は "FizzBuzz"
* $i$ が15の倍数ではなく、かつ3の倍数のとき $S_i$ は "Fizz"
* $i$ が15の倍数ではなく、かつ5の倍数のとき $S_i$ は "Buzz"
* $i$ が3の倍数でも5の倍数でもないとき $S_i$ は $i$ を0～9のアラビア数字を通常の意味で用いて十進数で表した文字列。ただし、一番左の文字は必ず0以外とし、カンマ・小数点・空白など0～9以外の文字は用いない。

整数 $i = 1, \ldots, n$ について、$T_i$ を $S_i$ の後ろに1個の改行を結合した文字列と定義する。

「nまでのFizzBuzz文字列」を、$T_1, T_2, \ldots, T_n$ をこの順番で結合した文字列と定義する。

# FizzBuzzF\*ck

言語「FizzBuzzF\*ck」は、[Brainfuck](https://www.muppetlabs.com/~breadbox/bf/) を以下のように拡張した言語である。

* プログラムの実行開始直前 (配列をゼロで初期化した後) に、配列の先頭から連続した部分に、1要素に1文字ずつ「100までのFizzBuzz文字列」を1個格納する。ただし、文字コードはASCIIとし、「改行」は1個のLF (0x0A) とする。配列の余った部分はゼロのままとする。配列の要素数が足りない場合は「100までのFizzBuzz文字列」の配列に収まる最初の部分のみを格納する。
* プログラムの実行終了直後に、1回、配列のポインタが指している要素からポインタ以降初めてゼロが現れる直前の要素までを出力する。すなわち、`[.>]` を実行する。ただし、同じ要素は高々1回のみ出力する。

プログラムの最初に `[-]>[>]<[[-]<]` を実行することで、配列をゼロで初期化してポインタを配列の先頭に戻せる。
これはBrainfuckの初期状態と同じである。
さらに、プログラムの最後に `[-]` を実行することで、配列のポインタが指している要素をゼロにでき、出力を抑制できる。
これらを用いることで、任意の Brainfuck のプログラムを FizzBuzzF\*ck に移植できる。

なお、Brainfuck とは異なり、FizzBuzzF\*ck の F\*ck は大文字の F とアスタリスクを用いるのが正式な表記である。

# 処理系

処理系を実装した。
[mikecat/fizzbuzzf_ck: A language derived from Brainf\*\*k which enables to implement FizzBuzz in 0 bytes.](https://github.com/mikecat/fizzbuzzf_ck)

# 実行例

```
$ wc examples/fizzbuzz.fbf
0 0 0 examples/fizzbuzz.fbf

$ python fizzbuzzf_ck.py examples/fizzbuzz.fbf
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

$
```

# おまけ

冒頭で紹介した記事には、Qiita版が存在する。
[FizzBuzzを1byteで実装する - Qiita](https://qiita.com/ymg_aq/items/b8e5d26035180bc8797e)

# おまけ2

実は15年くらい前から似たコンセプトの言語あった…

* [BrainCrash](https://web.archive.org/web/20120622134755/http://cfs.maxn.jp/neta/BrainCrash.php)
* [BrainCrashとは (ブレインクラッシュとは) [単語記事] - ニコニコ大百科](https://dic.nicovideo.jp/a/braincrash)
【Github】cloneしたファイルがレポジトリにpushできない場合の対処法

# 起きたこと
表題の通り、githubにて他人のファイルをcloneしたものを編集し、自分のリポジトリにpushしようたしたところ、以下のエラーが生じた。

```
ERROR: Permission to (clone元のgitのURL) denied to 自分のユーザー名.
fatal: Could not read from remote repository.
```

# 原因
permissionがdenyされてしまっているので、以下のコマンドでpush先を確認してみる。

```:ターミナル
$ git remote -v
```
↓
```:ターミナル
origin  git@github.com(clone元のgitのURL)  (fetch)
origin  git@github.com(clone元のgitのURL)  (push)
```

push先がclone元のリポジトリになっていることが判明。

# 解決方法
pushしたいリポートのURLを変更する。

```:ターミナル
git remote set-url origin (pushしたいレポジトリURL)
```

変更できたか確認する。
```
$ git remote -v
```
↓
```
origin  https://github.com/変更後のユーザー名/変更後のリポジトリ名 (fetch)
origin  https://github.com/変更後のユーザー名/変更後のリポジトリ名 (push)
```

無事に変更ができたので push が出来るようになりました。

# 参考
https://docs.github.com/en/get-started/getting-started-with-git/managing-remote-repositories
【積読】RESTにおけるリソースという概念について

:::note
RESTにおいてリソースは重要な概念。
本記事にはリソースについてまとめています。
:::

## リソース
Webにおけるリソースの例。
* 東京の天気予報
* 技術評論者の「Webを支える技術」のページ
* 新横浜駅の写真


上記はいずれもリソースで、Web上には多様なリソースが存在する。

:::note
リソースを一言で表すと、「**Web上に存在する、名前を持ったありとあらゆる情報**」
:::

リソースが**名前**を持つとはどうゆうことか？
人間の場合は、同姓同名の人も多く存在するが、そのくらい曖昧でも特に問題はない。
プログラムの場合は同姓同名を見分けてくれないので、名前は必ず他のものと区別できる必要がある。**リソースの名前は、あるリソースを他のリソースと区別して指し示すためのもの。**


#### リソースの名前としてのURI
リソースの名前とは**URI**のこと。
冒頭で取り上げたリソースは、下記のようなURIで識別できる。

* 東京の天気予報
    * https://weather.yahoo.co.jp/weather/jp/13/?day=1
* 技術評論者の「Webを支える技術」のページ
    * https://gihyo.jp/book/2010/978-4-7741-4204-3
* 新横浜駅の案内図
    * https://railway.jr-central.co.jp/station-guide/shinkansen/shin-yokohama/map.html


:::note
* リソースとは、Web上の情報である
* 世界中の無数のリソースは、それぞれURIで一意の名前を持つ
* URIを用いることで、プログラムはリソースが表現する情報にアクセスできる
:::

#### 複数のURIを持つリソース
1つのリソースは複数のURIを持つことができる。
例えば、もし今日が2010/1/1の場合、次の2つのURIは同じリソースを指す。
* http://weather.example.jp/tokyo/today
* http://weather.example.jp/tokyo/2010-01-01

それぞれ同じリソースを指すが、URIの意味合いが異なります。
最初のURI：「今日の東京の天気」
二番目のURI：「2010/1/1の東京の天気」

:::note
リソースに別名のURIをいくつか付けることで、クライアントがリソースにアクセスしやすくなる。一方で、どれが正式なURIか分かりづらいという欠点も併せ持つ。
:::

#### リソースの表現と状態
「リソース」は”Web上に存在する情報”という抽象的な概念。
サーバーとクライアントの間で実際にやり取りするときには、何らかの具体的なデータを送信しあいます。この具体的にやりとりするデータのことを「**リソースの表現**」という。

1つのリソースは複数の表現を持つことができる。HTML形式でも、テキスト形式でも、PDFでも、画像でも、表現が可能。HTTPの仕組みを利用すれば、1つのURIで複数の表現が可能。

またリソースには**状態**が存在する。時間の経過に従ってリソースの状態が変化すると、その表現も変化する。天気予報の例で言えば、現在の予報が「晴れ」でも、数時間後には「曇り」に状態が変化するかもしれない。

---

参考文献

技術評論者「Webを支える技術」

https://gihyo.jp/book/2010/978-4-7741-4204-3
Google Chromeのウィンドウ消す順番間違えた！

# はじめに
&emsp;この記事は私が無知ゆえに必要な記事のタブがあるウィンドウを先に消して焦り散らかしたが、ブラウザは神だったって話です。

# 結論

&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;**「Ctrl + Shift + T」**

&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;押せばすべてが解決！！！！！！！！！

# まとめ
&emsp;ブラウザって、かしこいなぁ。。。
<br />
&emsp;私はChromeを使用しているのですが、ウィンドウ復元できないブラウザとかってあるのかな？
私の検索力では設定や何らかのエラーをはいて復元できなケースがあることくらいしか見つけらなかった。<br />
詳しい方、よければコメントで教えてください。
Julia言語に触れてみよう

『１週間で学べる！Julia数値計算プログラミング』の第１章を参考にJulia言語の環境構築についてメモ。

# インストール

PCの環境は
- OS：Windows11 Home 22H2
- CPU：11th Gen Intel(R) Core(TM) i7-1185G7

Juliaインストール手順
1. [Julia言語オフィシャルサイト](https://julialang.org/downloads/)からインストーラ「julia-1.9.3-win64.exe」をダウンロードする。
1. インストーラ実行し、途中画面で"Add Julia to PATH"にチェックを入れる。
1. コマンドプロンプトを立ち上げ、「julia -v」を入力し、バージョンが表示されればOK（2023.9.21時点では最新バージョンは1.9.3）。

# Juliaを実行する

コマンドプロンプト立ち上げ、「Julia」を入力することで対話型実行環境REPLが立ち上がる。REPL上でコマンドを入力することでJuliaを使用することができる。

## Visual Studio Codeで実行する

- コマンドパレット上で「julia start REPL」を実行することで、JuliaのREPLが起動する。
- jlファイルを作成後、ファイルを右クリックし、「Julia: Execute File in REPL」を実行することでjlファイルを実行することができる。
- jlファイル上では、ギリシア文字は、例えば、「\pi」と入力し、「Enter」を押すことで$\pi$に変換される。

### Visual Studio Codeのセットアップ

Julia拡張機能をインストール
1. 「Ctrl + Shift + X」を押し、拡張機能を表示する。
1. 検索欄に「Julia」と入力し、「Julia」をインストールする。
1. [Julia拡張機能のリポジトリ](https://github.com/julia-vscode/julia-vscode)にて追加される機能を確認することができる。

## Google Colaboratoryで実行する

[参考](https://leadinge.co.jp/julialang/2022/04/04/googlecolab/)の通りすることでGoogleColaboratory上でJuliaを動作させることができる。

# 計算してみる

四則演算だけでなく、三角関数や複素数などを扱える。Google Colabで以下の計算を入れてみた。
```julia:計算式
println(3+5-2*4+5/3)
println(3^2+sqrt(2))
println(2*pi)
println(2\pi)
println(cos(2*pi))
println(BigFloat(2\pi))
```
```:計算結果
1.6666666666666667
10.414213562373096
6.283185307179586
1.5707963267948966
1.0
1.5707963267948965579989817342720925807952880859375
```
Google Colab上では、\piが$\frac{\pi}{x}$と扱われてしまっている。LLVMへの入力を見てみると、
```julia:\pi
function p(x)
  return x\pi
end
@code_llvm p(2)
```
```:\piのLLVM入力
;  @ In[14]:7 within `p`
define double @julia_p_1213(i64 signext %0) #0 {
top:
;  @ In[14]:8 within `p`
; ┌ @ operators.jl:693 within `\`
; │┌ @ promotion.jl:382 within `/`
; ││┌ @ promotion.jl:350 within `promote`
; │││┌ @ promotion.jl:327 within `_promote`
; ││││┌ @ number.jl:7 within `convert`
; │││││┌ @ float.jl:146 within `Float64`
        %1 = sitofp i64 %0 to double
; ││└└└└
; ││ @ promotion.jl:382 within `/` @ float.jl:408
    %2 = fdiv double 0x400921FB54442D18, %1
; └└
  ret double %2
}
```
割り算として解釈されてしまっている。ローカルのコマンドプロンプト上でやってみると、
```julia:ローカル
julia> 2\pi
1.5707963267948966
```
同じ結果になった。\piをTabキーで$\pi$に変換していれば、$2\pi$として解釈されるがそれ以外の時は割り算として解釈される。なお、Google Colab上では、Tabキーを押しても変換されなかった。

# 演算子

juliaでは様々な演算子が用意されている。以下の実験をしてみる。
```julia:演算子
function sc(x)
  if x>0 || 1/x==0
    println("OK:",x)
  end
end
sc(1)
sc(0)
```
```:演算結果
OK:1
```
if文に$x>0$と$\frac{1}{x}==0$の論理和を設定し、ショートサーキットが行われているかどうか確かめた。$sc(1)$ではエラーが出ず、$sc(0)$では処理がちゅうだんしｔことより、ショートサーキットが行われていることがわかる。

# 参考

- [Julia言語オフィシャルサイト](https://julialang.org/downloads/)
- [『1週間で学べるJulia数値計算プログラミング』](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7%E5%AD%A6%E3%81%B9%E3%82%8B-Julia%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E6%B0%B8%E4%BA%95-%E4%BD%91%E7%B4%80/dp/4065282829)
- [Julia拡張機能GitHubリポジトリ](https://github.com/julia-vscode/julia-vscode)
- [https://leadinge.co.jp/julialang/2022/04/04/googlecolab/](https://leadinge.co.jp/julialang/2022/04/04/googlecolab/)
Xcode15でビルドするとUserDefaultsからのUserAgentの変更ができなくなる(iOS17のみ)

Xcode15でビルドするとUserDefaultsからのUserAgentの変更が効いてないことがあったので調べてみました。

# 調査内容
こちらのコードをXcode15でビルドし、各OSでの出力(UserAgent)を確認します。

## サンプルコード

```swift
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        UserDefaults.standard.register(defaults: ["UserAgent": "test user agent"])
        return true
    }
}
```

```swift
import UIKit
import WebKit

class ViewController: UIViewController {
    let webview = WKWebView()

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        webview.evaluateJavaScript("navigator.userAgent;") { result, _ in
            print("UserAgent: \(result ?? "nil")")
        }
    }
}
```

## 結果
iOS17だとUserAgentが変わっていません！

| iOS 15.0 | iOS 16.4 | iOS 17.0 |
|---|---|---|
| UserAgent: test user agent| UserAgent: test user agent | UserAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 |

ちなみにXcode14.3.1でビルドしたものをiOS17で動かした場合は、`test user agent` になっていました。

## 対策
WKWebViewの[customUserAgent](https://developer.apple.com/documentation/webkit/wkwebview/1414950-customuseragent)を使えばOK
```swift
webview.customUserAgent = "test user agent"
```

## まとめ
UIWebView時代の名残りでUserDefaultsのUserAgentを使ってる方はXcode15に移行する際にご注意ください
CCNA勉強　３日目

CCNAの動画教材を勉強してから３日が経ちました。
いよいよ用語がわけわからん状態です。

・ルーティング
・CEF
・ロンゲストマッチ、デフォルトルート
・スタティックルーティング
・ダイナミックルーティング
・ルーティングプロトコル
・ルート集約
・OSPFのコンバージェンス

上記について行いました。

CEFはARPテーブルとルーティングテーブルを両方確認しなきゃならないのをあらかじめ双方の情報をリンクさせておくことによって確認を１回で済ませる

ロンゲストマッチは複数のルーティングが重なった時に一致点が長ければ長いほど優先される

デフォルートはインターネットなどに接続しているのをいちいちルーティングテーブルに書いていくと膨大な量になってしまうのでこことここに当てはまらなかったらここに行くようにと設定すること

スタティックルーティングはゴールに行くためにはここに行くと１つ１つルーティングテーブルに記載していくこと　事故った時は対処できない

ダイナミックテーブルはつながってるどおし自動に判別してここが事故ったから別ルートでいけるという優れもの

ルーティングプロトコルは同接続のルーターなどがあった場合何を優先させるのかそのルールを決めてる　　rip ospf EIGRP 等　プロトコルにより優先度が変わってくる

ルート集約は１つのルーターにネットワークが複数多くつながってるとき集約することができる。　


ざっと上記のような理解です。少し違うかも。。。。

明日も頑張ります
【Next.js】Imageを親要素のサイズに合わせる方法

以下のように記述することで`Image`を親要素のサイズに合わせられます。

```jsx
import Image from 'next/image'
 
export default function Page({ photoUrl }) {
  return (
    <div style={{ position: 'relative', width: '500px', height: '300px' }}>
      <Image
        src={photoUrl}
        alt="Picture of the author"
        sizes="500px"
        fill
        style={{
          objectFit: 'contain',
        }}
      />
    </div>
  )
}

```

親要素には`position: "relative"`, `position: "fixed"`, `position: "absolute"`のいずれかを設定する必要があります。
【RaspberryPi】ピン配置確認コマンド

`pinout` コマンドでピン配置を確認できる。
(なにこれめちゃめちゃ便利、、、)

```bash
$ pinout
,--------------------------------.
| oooooooooooooooooooo J8   +======
| 1ooooooooooooooooooo  PoE |   Net
|  Wi                    1o +======
|  Fi  Pi Model 4B  V1.2 oo      |
|        ,----. +---+         +====
| |D|    |SoC | |RAM|         |USB3
| |S|    |    | |   |         +====
| |I|    `----' +---+            |
|                   |C|       +====
|                   |S|       |USB2
| pwr   |hd|   |hd| |I||A|    +====
`-| |---|m0|---|m1|----|V|-------'

Revision           : c03112
SoC                : BCM2711
RAM                : 4GB
Storage            : MicroSD
USB ports          : 4 (of which 2 USB3)
Ethernet ports     : 1 (1000Mbps max. speed)
Wi-fi              : True
Bluetooth          : True
Camera ports (CSI) : 1
Display ports (DSI): 1

J8:
   3V3  (1) (2)  5V
 GPIO2  (3) (4)  5V
 GPIO3  (5) (6)  GND
 GPIO4  (7) (8)  GPIO14
   GND  (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
   3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
 GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
   GND (25) (26) GPIO7
 GPIO0 (27) (28) GPIO1
 GPIO5 (29) (30) GND
 GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
   GND (39) (40) GPIO21

POE:
TR01 (1) (2) TR00
TR03 (3) (4) TR02

For further information, please refer to https://pinout.xyz/
```
【RaspberryPi】MacOSでラズパイにシリアル接続してみる

昔購入して埋もれていたUSBシリアル変換アダプタを使ってラズパイとシリアル通信してみたいと思います。

今回利用するデバイスはこれ。

[FTDI USBシリアル変換アダプター（5V/3.3V切り替え機能付き） | スイッチサイエンス](https://www.switch-science.com/products/1032)


# ■ ピン

<img width="300" alt="IMG_1115.jpg (292.9 kB)" src="https://img.esa.io/uploads/production/attachments/5809/2023/09/21/19598/4aa9770d-9e74-4d9b-bcc1-819d828da4ff.jpg">

- `DTR` : 接続しない
- `RX` : ラズパイの GPIO14 (UART TX) 端子に接続
- `TX` : ラズパイの GPIO15 (UART RX) 端子に接続
- `VCC` : 接続しない
- `CTS` : 接続しない
- `GND` : ラズパイの `GND` 端子に接続
- 電圧切替えジャンパ : 5V


<img width="500" alt="スクリーンショット 2023-09-21 22.43.23.png (308.3 kB)" src="https://img.esa.io/uploads/production/attachments/5809/2023/09/21/19598/d9445341-4069-4ff5-bd57-8bf19319a57c.png">

# ■ シリアル通信

## ラズパイのシリアル通信を有効化

※ ラズパイで実行

```bash
有効化
sudo raspi-config nonint do_serial 0

# 確認
sudo raspi-config nonint get_serial
```

## FT232RLのデバイスドライバをインストール

今回利用するUSBシリアル変換アダプタには、FTDI社製のFT232RLが利用されているのでドライバをインストールします。
ドライバのダウンロードはこちら: https://ftdichip.com/drivers/vcp-drivers/
※ FTDI社のドライバはICに関わらず共通らしいです。

## Macからラズパイに接続

```bash
# USBシリアルデバイスのデバイスファイルを探す。
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel  0x9000002  9 18 22:47 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel  0x9000004  9 21 21:33 /dev/tty.usbserial-AI045C7T  ★ これ
crw-rw-rw-  1 root  wheel  0x9000000  9 18 22:46 /dev/tty.wlan-debug

# screenコマンドでUSBシリアルデバイスに接続
# screen デバイスファイル ボーレート
$ screen /dev/tty.usbserial-AI045C7T 115200

```

接続できた

```bash
# 接続後Enterを押して、ログインプロンプトが表示されれば成功
raspberrypi login:

# ログイン
raspberrypi login: xxxxxxxxxxxxxxxxxx
Password:

# コマンド実行
$ ls
Bookshelf  Documents  Pictures  Public     Videos
Desktop    Downloads  Music     Projects  Templates
```

## 接続の終了

- `Ctrl + a`
- `k` (kill windowコマンド)
- `y` (yes)

# ■ シリアル通信について

シリアル通信がよくわかっていなかったので、少し調べてみた。
ラズパイとMacはUSBシリアルデバイスを通してデータをやり取りするわけですが、この通信はUART通信と呼ばれる方式を利用しています。


UART通信で利用する信号線は下記2つのみです。
UART通信はSPIやI2Cと異なり、クロック用の信号線が無く、非同期でデータが送受信されます。そのため、デバイス同士にマスター・スレーブのような関係もありません。

- TXD (Transmit Data: データ送信)
- RXD (Receive Data: データ受信)

<img width="700" alt="スクリーンショット 2023-09-21 23.20.44.png (63.6 kB)" src="https://img.esa.io/uploads/production/attachments/5809/2023/09/21/19598/e2edfb75-2483-4511-83a2-73bfd4eebdcd.png">

## 通信タイミング

UARTにはタイミングを制御するためのクロック信号線がないため、通信開始前に予めデバイス間で通信速度(ボーレート)を定めておきます。
よく利用されるボーレートはこのあたりだそうです。

```
1200 bps
2400 bps
4800 bps
9600 bps
19200 bps
38400 bps
57600 bps
115200 bps
```


# ■ 参考
- [MacOSのUSBシリアル通信方法](https://www.chihayafuru.jp/tech/index.php/archives/3689)
- [よく分かる！ シリアル通信基礎講座](https://emb.macnica.co.jp/articles/8191/)
【完全無料】Google ColabでOpen InterpreterをLlama 2で動かす

## 宣伝
Flutterに関する技術ブログを運営しています。
ご興味のある方は、よかったらご覧ください♪
https://flutterdevelop.blog/

## はじめに
Open Interpreterを使ってみたいけど、Webの情報は全てGPT-4を使ったものばかり。。。
無料で使えるLlama2を利用した方法はどこにも情報がありませんでした。

だったら仕方ないから、自分で調べるしかないよね！！


:::note warn
心配無用だとは思いますが、一応、、、
現在、Google Colaboratoryでは、画像AIの「Stable Diffusion」の使用が制限されています。
状況によっては今後「Open Interpreter」も制限がかかる可能性があります。
:::


## 環境
実行環境：Google Colaboratory(無料版)
CPU：T4 GPU


## 手順

#### 前段

公式の手順通りに、やってみると以下のようなエラーが発生します。
今回の手順はこれを回避できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/463416e5-0289-8b62-a8a2-10f6d0613346.png)


#### １\. open-interpreterをインストール
Google Colab にopen-interpreterをインストールします。
```ruby:pip
pip install open-interpreter
```
<br>

#### ２\. 環境の準備
使用するモデルはHugging Faceにある「TheBloke/CodeLlama-7B-Instruct-GGUF」です。

Google Colab で以下のコードを実行します。
```ruby:Google Colaboratory
import interpreter
!interpreter --model TheBloke/CodeLlama-7B-Instruct-GGUF
```
<br>

実行すると以下のメッセージが出力されます。
見えにくいですが、"See More"の下に入力フォームがあるので、好きなものを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/52ea1983-f10f-05df-7614-173e68f5bd7b.png)
ちなみに、私は何を入れてもSmallしか選択できませんでした。
何を入れると良いのかご存じの方はご教授ください。。:cry::cry::cry:

<br><br>


次は以下のメッセージが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/26ac659d-1a7f-8c59-84c4-38acc39666e7.png)
右側に入力フォームがあるので、「y」を入力します。

<br><br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/2bbb2e5b-f924-547b-214b-32dde1eea745.png)
そうすると「Y」って言ってないけど、モデルのダウンロードが始まりました！！

<br><br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/903b5cbe-9035-95d7-de2d-9392655e1a2d.png)
「ラマのパッケージをインストールしていいか？」と聞かれるので、「ｙ」を入力します。

<br><br>

#### ３\. 命令実行
終わったみたいなので、命令を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/e5d98082-6c94-7241-e214-510246296008.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/ce977358-3ea8-cd0c-e071-1a31fa3e9f09.png)
「何したいか言ってや！！」と言われます。
日本語が入力できなかったので、試しに「Output Hello World」と入力します。

<br><br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/7c62e9e1-aa36-1c6e-84e1-f3a9cfeff110.png)
コードを実行してよいか聞かれるので「ｙ」と入力します。

<br><br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/ef3292a9-92cd-e404-2244-05ca5a6299c5.png)
出力できたみたいです。

<br><br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/2e831edf-e11d-f7af-5b3c-05e932f793c8.png)
「まだ何かやりたいことあるか！？」と聞かれましたが、疲れたので終了しました。

<br><br>

## おわりに
結構レスポンスが遅いです。
また、メッセージも以下のように１ワードごとに１行使うためちょっと見にくいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561397/50a9f503-265f-2c50-89e6-6b90afb46f3e.png)


Chat-GPTで動かしている記事を見ると、そんなに使いづらそうに見えないため、
工夫次第で、バリバリ実用的になるかもしれません！！

アドバイスがあれば、コメントください:blush::blush::blush:
不要なexportや依存関係を削除できるKnipの使い方


## はじめに

JavaScriptやTypeScriptでコードを書いているとき、こんな経験はありませんか？

- exportしているのに、他のどこからもimportされていないクラスや関数があった
- 以前は使っていたが、今は使っていない依存関係がpackage.jsonに残っていた

ファイル内でどこからも参照されていないクラスや関数は、ESLintで検出できます。しかし、exportされている場合、どこからもimportされていなかったとしてもESLintでは検出できません。

このような問題を解決できるのが「[Knip](https://github.com/webpro/knip)」です。

## Knipとは

Knipを使うと、未使用のファイル、依存関係、exportを検出できます。

JavaScriptとTypeScriptの両方に対応しており、webpackやESLint、JSDocなども考慮しながら動作します。

https://github.com/webpro/knip

## Knipの使い方

まずは、Knipをインストールします。

```console
npm install -D knip
```

KnipにはwebpackやESLint、JSDocなどを考慮するさまざまなプラグインがあります。必要な[プラグイン](https://github.com/webpro/knip#plugins)が自動で有効化されるので、基本的に設定は不要です。

次のコマンドを実行すると、不要なファイルや依存関係、exportなどを検出できます。

```console
npx knip
```

また、設定は``knip.json``で変更できます。ここでは、よく使う設定を紹介します。すべての設定は[公式ドキュメント](https://github.com/webpro/knip#readme)で確認できます。

```json:knip.json
{
  "entry": ["src/index.ts"],
  "project": ["src/**/*.ts"],
  "ignore": ["**/*.d.ts", "**/fixtures"],
  "ignoreDependencies": ["hidden-package"]
}
```

``entry``ではエントリーファイルを指定し、``project``では検査対象となるファイルを指定できます。

「Knipでは不要なファイルや依存関係だと表示されるが、実際にはどこかで利用している」といった場合は、``ignore``や``ignoreDependencies``を使います。``ignore``で指定されたファイルと、``ignoreDependencies``で指定された依存関係は除外されます。

## まとめ

不要なexportを検出できるツールを探していたときに見つけたKnipを紹介しました。実際に使ってみていますが、依存関係やファイルの消し忘れも防げるので便利です。ぜひ使ってみてください！
ミーティングで質問して得られるもの5つ



# 目次

[1. はじめに](#1はじめに)
[2. 本記事の対象者](#2本記事の対象者)
[3. 結論](#3結論)
[4. 得られるもの5つ](#4得られるもの5つ)
　[自身が得られるもの](#自身が得られるもの)
　[チームメンバーに効果をもたらすもの](#チームメンバーに効果をもたらすもの)
　[チーム全体に効果をもたらすもの](#チーム全体に効果をもたらすもの)
[5. まとめ](#5まとめ)
[6. おわりに](#6おわりに)


# 1.はじめに

ミーティングや雑談の時間は、お互いの仕事の状況や、初めて聞く知識を吸収できる貴重な時間だと思います。
しかし、「自分だけがわからない状況かもしれない」と思って躊躇してしまうときもありました。
今回は **「質問することで得られるもの」** を整理していきたいと思います！


# 2.本記事の対象者

- 質問するときに緊張してしまう方
- 質問が後回しになってしまう方

:::note warn
この記事は 「とにかく質問しよう！」ということを推奨するものではありません。
**「調べた上で質問をすること」** を想定しています。
:::


# 3.結論

- まずは一歩踏み出そう
- 失うものはない、得られるものは多い


# 4.得られるもの5つ

## 自身が得られるもの

①質問の回答

②悩み続けたであろう時間

早めに聞ければ聞けるほど、前に進むことができます。

## チームメンバーに効果をもたらすもの

③復習になる・理解につながる

④新たな議題のきっかけになる（方法の見直しなど）

質問のやり取りを聞いていた方に質問を深掘りしていただいたり、「Aの実装をこうするなら、Bはどうしますか？」というように他の疑問も併せて解消されることがありました。

## チーム全体に効果をもたらすもの

⑤質問しやすくなる

- 自身が得られるもの：質問を繰り返していくことで、質問へのハードルが下がる、質問の仕方がわかるようになる

- チームメンバーに効果をもたらすもの：他の人が質問した後だと質問しやすくなる（少しハードルが下がる😃）


# 5.まとめ

気になることは積極的に質問しましょう！


# 6.おわりに

本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありませんのでご了承ください。

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。
GPT-4より性能が高い（らしい）言語モデルが公開されたみたいなので、出力内容を確認してみる

# GPT-4を上回る（らしい）性能のXwin-LMが公開される
詳細は下記記事にまとめられています。
[GPT-4を上回るオープンなLLM誕生？ 中国研究者らが「Xwin-LM」公開](https://www.msn.com/ja-jp/news/techandscience/gpt-4%E3%82%92%E4%B8%8A%E5%9B%9E%E3%82%8B%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%81%AAllm%E8%AA%95%E7%94%9F-%E4%B8%AD%E5%9B%BD%E7%A0%94%E7%A9%B6%E8%80%85%E3%82%89%E3%81%8C-xwin-lm-%E5%85%AC%E9%96%8B/ar-AA1h1kfU)

なんでも、言語モデルのベンチマークテストでGPT-4よりも良い成績を出したのだとか。
ベンチマークテストの結果と出力内容を確認できるサイトは下記にあります。
[AlpacaEval Leaderboard](https://tatsu-lab.github.io/alpaca_eval/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124676/76a1bbb7-a734-e7ae-ecc6-7cd0f44ac1b0.png)
ベンチマークサイトの画像。モデル名の横のテキストマークを押すと、出力内奥を確認できます。

# 実際の出力内容はどんなもんなのか？
ベンチマークテストで質問される内容とそれに対する出力結果が見れるようになっていたので、いくつか抜粋して比較してみようと思います。
（ベンチマークテストはすべて英語だったので、下記は日本語に翻訳しています。質問文は検索用として原文も記載しています。）

## 「12個の卵があるとします。2個を落とし、5個を食べました。残りは何個でしょうか？」
原文：Suppose I have 12 eggs. I drop 2 and eat 5. How many eggs do I have left?
### GPT-4の回答：
あなたは残り5つの卵を持っています。
### Xwin-LMの回答：
もし最初に12個の卵があって、そのうち2個を落とし、5個を食べたら、残りは合計5個の卵になります。これは、最初に12個の卵があり、そのうち2個を落として10個になり、その後5個を食べて残り5個になったからです。

Xwin-LMは回答が長いですね…この質問に関してはGPT-4のほうが優れた回答なのではないでしょうか

## 大和戦艦は何年に建造されましたか？
原文：What year was the Yamato Battleship built?
### GPT-4の回答：
大和戦艦は1937年から1941年の間に建造されました。それは1941年12月16日に日本帝国海軍によって就役しました。
### Xwin-LMの回答：
大和戦艦は、日本帝国海軍のために第二次世界大戦中に建造されました。その建造は1937年に始まり、1940年8月8日に進水しました。大和は大和型戦艦の先頭艦であり、これらは最大かつ最強の戦艦でした。この船は、現在の奈良県として知られている古代の日本の大和省にちなんで名付けられました。

こちらもGPT-4のほうが必要最低限の出力をしているように見られます。

## ドイツ語を話すことができますか？
原文：Do you know how to speak German?
### GPT-4の回答：
はい、私はドイツ語を話すことも理解することもできます。ドイツ語での質問や助けが必要な場合は、遠慮なくお尋ねください！
### Xwin-LMの回答：
はい、私はドイツ語を話すことも理解することもできます。基本的なフレーズや文法、または他のドイツ語に関連する質問についてお手伝いできます。何か助けが必要なことがあれば、遠慮なくお尋ねください。

この質問はそれほど出力の差を感じませんが、やはり端的なのはGPT-4のように見えます。

# ベンチマークでは好成績でも…
ベンチマークテストの出力内容を見る限りでは、現時点でGPT-4のほうが優れているのではないかなと感じました。理由は主に下記2点です。
1. 質問に対して必要な情報を絞って回答できている。
2. ！を使って文章に抑揚をつけるなど、コミュニケーション能力高そう

※すべての出力内容を見たわけではなく、あくまでも主観による感想ですので、気になる方は実際の出力結果を眺めてみてください
WSL2でのローカル開発でhostsに任意のホスト名を追加する


## 課題

「フロントエンド開発のためのセキュリティ入門」という本を読んでいて、クロスオリジンの検証をハンズオンがあり、hosts ファイルにホスト名を追加するという設定方法が紹介されていた。
自社開発でも hosts ファイルは編集しているため、そのやり方はわかったが、WSL2 上で開発していて、普段の設定方法ではうまくいかなかった。

## 環境

WSL2
Ubuntu 20.04.6 LTS

## 解決方法

以下の issue を見て、解決した。

[参考にした issue][def]

[def]: https://github.com/microsoft/WSL/issues/5728

具体的には、Windows の hosts ファイルの指定として、以下のようにした。

```
::1 example.test localhost
```

issue 自体は 2020 年のもので、もっと良い解決方法があるかもしれない。

## おわりに

まだ WSL2 と Windows の関係がよくわかっていないが、とりあえずハンズオンを進めることはできるようになった。
仕組みについてはおいおい勉強する。
LeetCodeのCar Fleet解いてみた

# 始めに
今回はLeetCodeのMedium問題に挑戦してみた
結論から言うと自力で解くことができなかったので素晴らしい解答をしてる方のコードを参考にしました。
間違いやより良い解法があればご指摘お願いします🙇‍♂

# 問題
https://leetcode.com/problems/car-fleet/description/

片側1車線の道路にn台の車が走っており、前の車に追いついたらその車で同じ速度で走る。
同じ速度で走る車は1グループとみなし、最終的に目的地に到着するグループ数を計算する問題。
ちなみに目的地まで追いつかなかったら1台を1つのグループとしてカウントする

正直問題文も長いし、色々理解するのに時間がかかった...

# 考察
この問題は目的地までに前の車に追いつくか？と言う視点が重要
目的地までの距離をスタックで管理すれば解けそうだ

- 位置と速度のペアが作り、ソートすれば計算しやすいかも
- 追い越しは禁止(追いついたら同じ速度になり車団の一部になる)
- 目的地までの距離の計算方法
- 目的地までの距離をスタックで管理


前の車に追いついたら速度は前の車と同じになるので後ろの車はスタックから消す。
これを繰り返すことで**stackの数 = 車のグループ数**


# 解法
## 位置と速度をグループ化
zipを使わずにfor文を回して[[position, speed]]の形にしても良い。
そして、グループ化したpairを降順にソートして目的地までの距離が近い順に並べる
```python
def carFleet(self, target: int, position: List[int], speed: List[int]) -> int:
    # [(position, speed)]のデータ構造にする
    # zipでまとめると楽
    pair = [(p, s) for p, s in zip(position, speed)]
    pair.sort(reverse=True)
```

## 目的地までの時間をスタックに追加
**目的地までの時間 = (target -  p) / s**

```python
stack = []
for p, s in pair:
    stack.append((target -  p) / s)
```

## 1台前の車に追いついた場合、後方の車を削除
考察で書いた通りお越しは禁止なので追いついた時点で前の車の速度と同じになる。
つまり、1つのグループとなるので後方の車はスタックから削除する
```python
if len(stack) >= 2 and stack[-1] <= stack[-2]:
    stack.pop()
```

## スタックの数を返す
スタックの数　= 車のグループ数となる
```python
return len(stack)
```

コードの全体を載せておく
```python
def carFleet(self, target: int, position: List[int], speed: List[int]) -> int:
    pair = [(p, s) for p, s in zip(position, speed)]
    pair.sort(reverse=True)

    stack = []
    for p, s in pair:
        stack.append((target -  p) / s)
        if len(stack) >= 2 and stack[-1] <= stack[-2]:
            stack.pop()

    return len(stack)
```

# 感想
正直この辺の問題は初見で解けないことが増えてきた...
特にEasyまではアルゴリズムを知っているだけで解ける問題があったが、Medium以上はアルゴリズム+考察力が必要。
定期的に復習しながらいろんなパターンを経験するしかないかな
Netlify の仕様変更が原因で急にステータスチェックが終了しなくなった問題。

こんにちは。みなさんは Netlify を使っていますか？　
今日 Netlify で急に ステータスチェックが永遠に終わらないという事態に陥りました。

解決までにかなり時間を使ってしまったので、他の人には時間を無駄にして欲しくないので、書いておきます。

## 現象

タイトルの通りですが、今日 Netlify でホスティングしているサイトに修正を加えようと、いつもの通り PRを作成すると、 

**「Some checkes haven't completed yet」** 

と表示され、その下を見ると 

**「Mixed content  - xxx - Waiting for status to be reported」** 

と表示されて、永遠にステータスチェックが終了しませんでした。

![スクリーンショット 2023-09-21 22.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142797/13e21a25-458f-e3ec-a5c2-2d51916ec8fd.png)

Mixed content を引き起こしている原因がないか、http でリクエストしているコンテンツを探すのですが、ありません。（そもそも、チェックが発火していない？）

その数日前の PR は問題なく動いていたのに。。。🤔

## 原因

結論から言うと、2023/09/19 に、Netlify が Mixed Content チェックを 無効化する修正を行なっていたからでした。

> On September 19, 2023, we’ll disable mixed content detection and the related GitHub checks.

Netlify ブログより引用
https://www.netlify.com/blog/deprecation-of-post-processing-asset-optimization-feature/


ブランチプロテクション を有効化し、ステータスチェックオプション（**Require status checks to pass before merging** ）に、Mixed Contentチェックを追加していた場合は、、存在しないチェックの終了を、永遠に待ち続ける事になっていたのです。

## 解決方法

GitHub のブランチプロテクションルールの **Require status checks to pass before merging** オプションから、Mixed Content チェックを外してください。
複数のファイルから指定の文字列を有するファイルを抽出する

# 備忘録
使いたいときに自分で使う

```python:main.py
# osモジュールをインポート
import os

# ディレクトリのパスを指定
dir_path = r"C:\Users\taizu\Desktop\judge"

word = 'tyogokin' #検出するワード

# os.walk関数でディレクトリ内のファイルを再帰的に探索
num = 0
for root, dirs, files in os.walk(dir_path):
    # ファイルの絶対パスを生成
    for file in files:
        file_path = os.path.join(root, file)
        # 絶対パスを出力
        try:
            with open(file_path, encoding="utf-8") as f:
                s = f.read()
            if str(word) in s :
                num += 1
                print(file_path)
        except :
            pass
print('')
if int(num) == 0 :
    print('検出されませんでした。')
else :
    print(str(num) + '個のファイルで「{}」が検出されました。'.format(str(word)))

```
ネットワークセキュリティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/b4d2b059-a9e7-42d5-7d01-6291511ec84f.png)
１：IDS IPS
　ファイアウォールの設置とともに侵入検知システム（IDS）や侵入防止システム（IPS）を設置することも多いです。
　IDSは、不正アクセスと思われるアクセスが発生すると、管理者宛に電子メールを送ったり、ランプを点灯させたりする装置です。あくまで検知するだけで侵入を防ぐことはしません。
　IPSは、不正アクセスと思われるアクセスが発生すると、該当の通信を遮断し、侵入を防ぎます。誤検出（フォー留守ポジティブ）と見逃し（フォールスネガティブ）に注意しなければなりません。不正アクセスとみなす条件を正確に指定しないと、誤検出や見逃しが多発してしまい、有効に活用することができません。テスト期間を十分に取って、調整を行ってから実践に投入する必要があります。

「ハニーポット」
　あえて攻撃を受けさせるために設置する囮システムをハニーポットと言います。ハニーポットを攻撃者に実際に攻撃させて、不正アクセスなどの攻撃の手口を収集します。収集した情報をもとにパターンファイル（シグネチャファイル）を作成して、IDSやIPSに設定します。IDSやIPSはパターンファイル中に定義されたパターンの通信の有無を確認し、不正アクセスを検知します。

２：ペネトレーションテスト
　設置したファイアウォールやWAF、IPSが正しく機能するの以下どうかを調べるために、実際に攻撃を仕掛けて、システムへの侵入を試みるテストのことをペネとレーションテストと言います。ペネトレーションテストを実施することによって、見落としていたセキリュティ上の脆弱性を発見することができます。

３：ファジング
　検査対象のソフトウェアに対して、問題を引き起こしそうなデータ（ファズ）を入力して、その応答や挙動を観察することで、検査対象のソフトウェアのセキュリティ上の未知の脆弱性を見つける手法をファジングと言います。ファジング用のソフトウェア（ファジングツール）を利用して、比較的容易に検査データを生成することができ、費用対効果が高い検査方法です。
(備忘録) App Router 和訳 Rendering

# これは何？
和訳したものを忘れないようにした備忘録です。内容については保証しません。

https://nextjs.org/docs/app/building-your-application/rendering

# Rendering
Renderingとはコードをユーザインターフェースに変換することである。ReactやNext.jsを使えば、ハイブリッドWebアプリケーションを作ることができる。ここで、ハイブリッドWebアプリケーションとは、コードの一部をClientやServerでレンダリングできるものである。このセクションは、これらのrendering環境やストラテジー、ランタイムの違いについての理解を助けるだろう。

## 基礎
とりあえず以下の3つはおさえておくこと。

- アプリケーションコードはServerとClientで実行される
- ユーザの来訪もしくは操作によってリクエストは開始され、レスポンスを返して終了する
- ネットワークの境界によってサーバとクライアントのコードが分割される。

## レンダリングされる環境
レンダリングされる環境は、ClientとServerの2つある。

- Client (=デバイスの上で動いているブラウザ)は、サーバに対してリクエストを送る。サーバから帰ってきた結果、つまりレスポンスをユーザインターフェースに反映させる。
- Server (=アプリケーションコードが載っているデータセンターのコンピュータ)は、Clientからのリクエストを受け取り、適切なレスポンスを返す。

歴史的に、開発者はServerとClientで異なる言語を使う必要があった。Reactが登場し、開発者は同じ言語やフレームワークが使用できるようになった。これによってだいぶ楽に書けるようになった。

ところが、これら2つの環境はそれぞれの機能や制約がある。そのため、Server向けのコードとClient向けのコードはいつも同じではない。状態管理やデータフェッチのような操作はどちらか一方の環境の方でやった方が適している。これらの違いを理解することが、効果的にReactとNext.jsを利用する鍵となる。

## Request-Response Lifecycle
大雑把に言えば、すべてのウェブサイトは以下のライフサイクルに従う。

1. UserAction: ユーザはウェブアプリケーションを操作する。クリックだったり、フォームの送信だったり、直リンクのことである。
1. HTTP Request: ClientはHTTPリクエストをるサーバに対して送信する。どんなリソースか、どんなメソッドか、その他必要に応じて必要なデータも。
1. Server: Serverはリクエストを処理し、適切なリソースを返す。このプロセスではルーティングやデータフェッチなどを行う。
1. HTTP Response: リクエストを処理した後は、ServerはHTTPレスポンスをClientに返す。このレスポンスにはステータスコードとリクエストされたリソース(HTML, CSS, JSなど)を返す
1. Client: CLientはリソースを解析し、ユーザインターフェース上にレンダリングする
1. User Action: ユーザインターフェースがレンダリングされたら、ユーザは操作を行い、その後、全体のプロセスが再度行われる。

ハイブリッドWebアプリケーションを作成する上で考えるべきことは、(1)どのようにライフサイクルの中の仕事を分離するかと(2)ネットワーク境界をどこに配置するかである。

## Network Boundary
ウェブ開発において、ネットワーク境界とは、異なる環境を分離するための概念である。例えば、ClientとServerだったり、Serverとデータストアだったり。

Reactでは、client-serverのネットワーク境界を置く場所を選択できる。(選択できるとはいえ、合理的に決める必要はあるだろうが・・・）

仕事は2つに分けることができる。 client module graphとserver module graphである。server module graphはServerでレンダリングされるすべてのコンポーネントを含んでおり、client module graphはその逆である。

module graphを可視化して考えることは、アプリケーション中のファイルがどのように依存しているかの理解の助けになる。

その境界を決めるために"use client"が使用できる。逆に"use server"もあが、これを使えばClientに対してServer上で仕事せよと伝えることができる.

## Building Hybrid Applications
これら2つの環境が動いている時、コードの流れが一方向であると考えれば良い。別の言い方をすれば、ServerからClientに対してデータが流れる。

もしClientからServerに対してアクセスする必要がある場合は、元のリクエストを使い回すのではなく、新しいリクエストを送り直す。これによって、どこでコンポーネントがレンダリングされているのかとネットワーク境界がどこにあるのかの理解を簡単にする。

実際には、まずサーバで何が実行されるかを考えて、その後クライアントで対話型アプリケーションが作られると考えるべきである。

このコンセプトを理解しておくと、ClientとServerコンポーネントを同じツリーにおく時にわかりやすい。
datetimeモジュール

### 日付と時刻
Pythonには、年月日や時分秒といったデータを扱うために、dateやtimeという専用のデータ型が用意されている。
日付を表現するデータ型は「date型」です。date型には、その日が何曜日なのかを計算するメソッドが備わっている。また、「time型」は時間を表現します。これらの型はよく似たデータ型なので、「datetime
」というモジュールにまとめられている。

実際に使ってみましょう。

組み込みデータ型ではないデータ型を使う場合は、そのモジュールを呼び出す手順が必要です。
```python
>>> import datetime
```
ここで何も表示されなければ、正常にdatetimeモジュールが読み込まれたことになります。
まず、特定の日を表現するdate型データの実体を作ってみましょう。
```python
>>> day = datetime.date(2030,4,14)
```
datetimeモジュールの中のdate型を使うので、datetime.dateになっています。型の名前であるdateの後に、丸括弧に続けて数字を3つ書いています。年、月、日の順に、数字をカンマで区切って指定しています。完成したデータには、dayという変数を付けています。
print関数を使って変数dayを確認してみましょう。
```python
>>> print(day)
2030-04-14
```
dateはデータ型の名前そのものですが、見方を変えるとdatetimeが持っているdateという関数のようにも解釈できます。つまり、ある型の実際のデータを用意するには、その型と同じ名前のメソッドを呼ぼ出せばいいのです。この"型と同じ名前のメソッド"のことを初期化メソッドと呼びます。このように作成されたデータ型の実体のことをインスタンスと呼びます。

### date型のメソッドを使う
date型には、その日が何曜日かを計算するメソッド「weekday」が備わっています。このメソッドは、曜日を0から始まる数字で返し、0は月曜日を表します。

▼weekdayメソッドが返す数字と曜日の対応
|0|1|2|3|4|5|6|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|月|火|水|木|金|土|日|

先程作った日が何曜日なのか調べてみましょう。
```python
>>> day.weekday()
6
```
戻り値が6ですので2023年4月14日は日曜日だと分かります。

date型は実態がなくてもみんなで使えるメソッドとして、todayというメソッドを持っています。これはモジュールと型さえ分かっていれば使えるメソッドです。todayはその名の通り、今日を示す新しいdate型を作ってくれます。
```python
>>> kyou = datetime.date.today()
>>> print(kyou)
2023-09-21
```
Officeファイル用pythonライブラリを古いoffice形式(ppt,doc,xls)でも使おう

## 背景
Officeファイルを読み込めるpythonライブラリは便利ですが古いタイプのファイル、拡張子で言うと.ppt,.doc,.xlsでは使えないことがあるのは残念です。どうすればよいでしょう。
## 分解して考える
1. 古いタイプのファイルを何とかして読み込む
2. あたらしい形式で一時フォルダに保存
3. 使いたいpythonライブラリに渡す

## win32com.client 使おう
win32com.client(正式なライブラリ名はpywin32)を使うと楽です。環境に入っているということを前提として進めます。

ここではpptのファイルパスを渡すと、一時フォルダ内にpptxに変換したうえで保存し、そのパスを返す関数を考えます。基本的には.docでも.xlsでも同じです。

``` python:pptからpptxに変換する関数
import win32com.client

def ppt2pptx (ppt_path):
    try:
        pptApplication=win32com.client.Dispatch('PowerPoint.Application')
        ppt=pptApplication.Presentations.Open(ppt_path,WithWindow=False,ReadOnly=True)
        ppt.SaveAs(r'C:\2pptx_temp'+'\\'+ppt_path.split('\\')[-1]+'x',24)
        pptApplication.Quit()
        return r'C:\2pptx_temp'+'\\'+ppt_path.split('\\')[-1]+'x'
    except Exception:
        print (ppt_path + 'をうまく開けません')
        return r'Error'
```


## 動作確認
変換する元ファイルを用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/4ba74d54-f3b0-2838-9d2a-47c16b429646.png)


``` python
import os
import win32com.client

os.makedirs(r'C:\2pptx_temp',exist_ok=True)

def ppt2pptx(ppt_path):
    try:
        pptApplication=win32com.client.Dispatch('PowerPoint.Application')
        ppt=pptApplication.Presentations.Open(ppt_path,WithWindow=False,ReadOnly=True)
        ppt.SaveAs(r'C:\2pptx_temp'+'\\'+ppt_path.split('\\')[-1]+'x',24)
        pptApplication.Quit()
        return r'C:\2pptx_temp'+'\\'+ppt_path.split('\\')[-1]+'x'
    except Exception: 
        print (ppt_path + 'をうまく開けません')
        import traceback
        traceback.print_exc()
        return r'Error'

ppt2pptx(r"C:\ppt\aaaaaa.ppt") 


#output
'C:\\2pptx_temp\\aaaaaa.pptx'
``` 

ちゃんと変換されてました。よかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471244/656b5052-ba45-da2e-a998-20e24b035d39.png)


## 念のための注意
・最終的に返されるのは変換後のファイルの「パス」であって、変換後のファイルではない
・当然だがシステムにOfficeがインストールされてないとだめ