OmniAICreator/Qiita-1.07M huggingface dataset:
GASでスプレッドシートの情報をjsonファイルに出力

<h2>はじめに</h2>

<h>最近GASを勉強しているがGASを用いてデータを収集してそのデータをpythonなどで直接使いたいなーと思った。</h>

じゃあJSONファイルあったら良くねと思いコードを書くことにした。
<h2>仕様</h2>
スプレッドシートの情報を一つづつgetして文字列にし最後に文字列にしたものをファイルに移してGoogleDriveに保存している。

一番最初のグループ名は、"Object"となっている
<h2>やり方</h2>

<h5>1,横軸にkeyを縦軸にitemになっている表を使用する</h5>
<table>
<thead>
<tr>
<th>name</th>
<th>age</th>
</tr>
</thead>
<tbody>
<tr>
<td>boy</td>
<td>15</td>
</tr>
<tr>
<td>jem</td>
<td>12</td>
</tr>
<tr>
<td>key</td>
<td>15</td>
</tr>
</tbody>
</table>

<h5>2,そのスプレッドシート上でGASを開く</h5>
なぜならこのコードの(SpreadsheetApp.getActiveSheet();)と書いてあるため

↑どういう意味かというと今開いているスプレッドシートの情報をgetするよていうこと。

<h5>3,コードを貼り付けて実行</h5>
そしたらGoogleDriveに(json_file.json)というファイルができてます。

とっても簡単!!

<h2>コード</h2>

```javascript:main.gs
function sheetjson(){
  var sheet=SpreadsheetApp.getActiveSheet();
  var last_row=sheet.getLastRow();
  var last_column=sheet.getLastColumn();
  var key_range=sheet.getRange(1,1,1,last_column)
  var value_range=sheet.getRange(2,1,last_row-1,last_column);
  var key_list=key_range.getValues();
  var value_list=value_range.getValues();
  // console.log(key_list);
  // console.log(value_list);
  var count=0
  var dicts={}
  var print_list=[]
  var json_dict=[]
  //#json_dictにいったん保存する
  for (var x=0;x<value_list.length;x++){
    for(var y=0;y<key_list[0].length;y++){
      //console.log(key_list[0][y],value_list[x][y]);
      dicts[key_list[0][y]]=value_list[x][y];
    }
    json_dict[count]= JSON.parse(JSON.stringify(dicts));//#値渡し
    count++
  }
  count=0
  for (var x=0;x<value_list.length;x++){
    var tentative_str="{ "
    for(var y=0;y<key_list[0].length;y++){
      if(typeof(value_list[x][y])=="number"){
        tentative_str=tentative_str+String("\""+key_list[0][y]+"\": "+value_list[x][y])
      }else{
        tentative_str=tentative_str+String("\""+key_list[0][y]+"\": \""+value_list[x][y]+"\"")
      }
      if(y<key_list[0].length-1){
        tentative_str=tentative_str+", "
      }
    }
    tentative_str=tentative_str+" }"
    print_list.push(tentative_str)
  }
//#ここの場所を書き換えればグループ名を変更できる。
  var json_code="\"Object\": ["
  for(var x=0;x<print_list.length;x++){
    json_code=json_code+print_list[x]
    if(x<print_list.length-1){
      json_code=json_code+",\n\t"
    }else{
      json_code=json_code+"\n]"
    }
  }
  console.log(json_code)
  createjson_file(json_code)
}
function createjson_file(json) {
  DriveApp.createFile("json_file.json",json)
}
```

<h2>まとめ</h2>

最近は、GASのコードを書いているがとても面白い。サーバもいらないから手軽だし、短いコードでも自動化が簡単にできてしまうこれがいい。
これから、いろいろなことを発信したいと思う!!
[AWS Q&A 365][SNS]Daily Five Common Questions #71

# 1. What are the steps for publishing a message to a topic in Amazon SNS? 
Answer: The steps for publishing a message to a topic in Amazon SNS are as follows: 
Step 1: Create a topic 
Step 2: Create a subscription to the topic 
Step 3: Publish a message to the topic Step 
4: Delete the subscription and topic 

# 2. How can I publish a message to a topic using AWS Management Console? 
Answer: To publish a message to a topic using AWS Management Console, you need to select the topic, click on the "Publish message" button, enter the message in the message body field, and click on the "Publish message" button. 

# 3. How can I publish a message to a topic using AWS SDKs? 
Answer: To publish a message to a topic using AWS SDKs, you need to use the "Publish" API of the Amazon SNS SDK for the programming language you are using. You need to provide the topic ARN and message payload as input parameters to the API. 

# 4. What is the maximum size of a message payload that can be published to a topic in Amazon SNS? 
Answer: The maximum size of a message payload that can be published to a topic in Amazon SNS is 256 KB. 

# 5. Can I publish a message to a topic without creating a subscription to the topic? 
Answer: Yes, you can publish a message to a topic without creating a subscription to the topic. However, the message will not be delivered to any endpoint unless there is at least one active subscription to the topic.
PolarsでMySQLデータベースからデータを読み込む

Polarsでは[read_database](https://pola-rs.github.io/polars/py-polars/html/reference/api/polars.read_database.html)メソッドを使ってMySQLなどのデータベースから読み込むことができます。

## 準備
特にMySQLデータベースから読み込むときには[connectorx](https://github.com/sfu-db/connector-x)というエンジンを用いているため、これをインストールする必要があります。さらにpyarrowというものも必要でした：
```bash
$ pip install connectorx pyarrow
```

## 使い方
引数にはSQLクエリとuriを渡します。uriはMySQLの場合は`mysql://{username}:{password}@{server}:{port}/{database}`です。
```python
import polars as pl

username = 'root'
password = ''
server = '127.0.0.1'
port = '3306'
database = 'test'

uri = f'mysql://{username}:{password}@{server}:{port}/{database}'
query = 'SELECT * FROM users'
df = pl.read_database(query, uri)
```
基本情報受験メモ20230528

バックエンドエンジニアの大和道子です。
今回は2023年度の基本情報技術者試験を受験したときの備忘録を公開します。

# はじめに
基本情報技術者試験を受けました。記憶が新しいうちに受験メモを。

# 目次
[ライターについて](#ライターについて)
[私の受験概要](#私の受験概要)
[注意点](#注意点)
[科目A・科目Bについて](#科目a・科目bについて)
[受験当日](#受験当日)
[CBT試験について](#cbt試験について)
[おすすめ勉強法](#おすすめ勉強法)

# ライターについて
文学部国分学科を卒業後、IT企業でC#のプログラマとして研修中です。ITパスポートを1年前に取得しています。

# 私の受験概要
+ 受験日：2023/5/28
+ 方式：CBT試験
+ 受験料：7,500（税込）＋払込手数料308＝7,808
+ 得点（合格点）：科目A：825/1000点、科目B：880/1000点（どちらも600点が合格基準）

# 注意点
+ 特別な理由がない限り、[CBT方式](https://faq.cbt-s.com/CBT%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F-61b1cbc1d9bd4e001da670fc)での試験なので、事前に[CBT受験者サイト](https://cbt-s.com/examinee/examination/fe)でのマイページ登録が必要
+ 土日は争奪戦だから、早めの申し込みが必須！！！
+ [**基本情報技術者試験2023年4月からの大幅改定**](https://www.ipa.go.jp/news/2022/shiken/henkou20220425.html)
<table>
 <caption>変更点</caption>
 <thread>
  <tr>
   <th>旧試験</th> <th>新試験</th>
  </tr>
 </thread>
  <tr>
   <td>午前・午後</td> <td>科目A・科目B</td>
  </tr>
  <tr>
   <td>午前・午後で別日受験が可能</td> <td>科目A・科目Bで別日受験は不可能</td>
  </tr>
  <tr>
   <td>午前：150分</td> <td>科目A：90分</td>
  </tr>
  <tr>
   <td>午前：80問</td> <td>科目A：60問</td>
  </tr>
  <tr>
   <td>午後：150分</td> <td>科目B：100分</td>
  </tr>
  <tr>
   <td>午後：11問から5問選択</td> <td>科目B：20問全問必須</td>
  </tr>
  <tr>
   <td>午後：C, Java, 表計算などとセキュリティ問題</td> <td>科目B：独自の疑似プログラミング言語16問とセキュリティ問題4問</td>
  </tr>
</table>

# 科目A・科目Bについて
　・科目A感想・アドバイス
　　・満点に対して合格点の割合が低いので、当日解けない問題は飛ばして解ける問題を確実に解く
　　・とはいえ、読解力があれば確実に絞り込める問題も多い。時間も豊富にあるので一見して解けない問題も後から戻って問題文をよく読む
　・科目B感想・アドバイス
　　・セキュリティ問題は読解力問題が多いので、疑似プログラミング言語より先に解いても良いかも
　　・疑似プログラミング言語は、自分が知っている言語の文法に直してメモすると、意外と簡単にわかる

# 受験当日
+ 土日はほとんど埋まっていたので、仕方なく日曜日の17時半からの試験に申し込みました。
+ 当日は17時10分くらいに会場に到着
    →身分証を見せて注意事項を聞く
    →「すぐ試験を開始しますか？」と聞かれたので、すぐ開始
    →科目Aに60分、休憩時間に1分、科目Bに70分かけて退出
    →19時40分ごろにビルを出る

# CBT試験について
+ [CBT試験とは](https://faq.cbt-s.com/CBT%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F-61b1cbc1d9bd4e001da670fc)
　Computer Based Teting。「CBTの多くが1年間を通じて好きな日時で受験できる上、試験会場となるテストセンターも47都道府県のすべての県に国内最大300ヶ所以上の会場があり、従来の紙試験に比べると受験者の利便性や公平性は飛躍的に向上します。」
　メリットとデメリットを挙げてみましたが、圧倒的にデメリット・注意点が多くなりました:sweat_smile:

+ メリット・アドバイス
　・受けられる日時の選択肢が多い
+ デメリット・注意点
　・試験前の期限までにお金を払い込まないと、当日試験が受けられない 
　・一回受験すると、再受験の間に開ける必要がある期間がそれぞれの試験によって決められている
　　＝一回落ちたらすぐに再受験できるわけではない
　・色んな試験を受ける人が常に出入りするので、周囲の音がそこそこある
　　→イヤーマフがある会場が多いが、筆者がつけたやつは耳が痛くなった…
　・紙に書き込めない
　　→極力オンラインでサンプル問題を解くなどして慣れるしかない
　・画面が明るい、などディスプレイ表示であることのデメリット
　　→困ったことがあったら、すぐ机上のボタンを押して試験官を呼んでいい

# おすすめ勉強法
+ まだ改定初年度なので、過去問がありません。しかし、[サンプル問題](https://www.ipa.go.jp/news/2022/shiken/tsunen.html)が9割解ければ大丈夫だと思います。
+ 重要な知識が聞かれるということについては変わらないので、過去の問題集や参考書でも9割解ければ合格はできると思います。
+ 少し特殊な勉強法ですが、科目A対策にも。
　・知らない単語を[e-words](https://e-words.jp/)などで調べる。
　　→その説明の中に知らない単語が出てきたら、その単語を調べる
　　→知らない単語が出てこなくなるまでやる
　・過去問や問題集ではカバーできない新しい知識も問われるので、知識は多いに越したことはありません。
【Python】回帰分析を始めてみる

# はじめに

回帰分析をpython で手軽にそれっぽく行う方法を調べた結果を紹介します。


# 回帰分析

目的変数 $y$ を説明変数$x$ で $y=ax+b$ と説明してやろう、ということで頑張ります。^^)

### scikit-learn を使う

この業界のマナーなのかもしれませんが、学習データについて入力 x と出力 y の組み合わせがあったとして、

- 学習: x, y　に合うようモデルパラメータを推定するには、model.fit(x,y)
- 予測: x に対応する y の予測するには model.predict(x)

とすれば良いです。何と分かり易い設計なのだろう。素晴らしい。



```python:simple01.py
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression

rng = np.random.RandomState(0)
X, y = make_regression(n_samples=20, n_features=1, random_state=0,
                      noise=4.0, bias=100.0)

print(f'x: {type(X)} shape: {X.shape}')
print(f'y: {type(y)} shape: {y.shape}')

model = LinearRegression(fit_intercept=True, 
                         copy_X=True,
                         n_jobs=1,
                        positive=False)

model.fit(X, y)
y_train_pred = model.predict(X)
```

これでモデルに係数と切片が保存されています。それぞれ model.coef_, model.intercept_ で参照できます。詳しくは仕様で attributes を確認しよう。

https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html


おまけ？として、決定係数は ```model.score(X,y)```でえられるようです。

下記でプロットしたらこうなりました。

```python
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8,5))
ax.plot(X, model.coef_ * X + model.intercept_, label=f'model (R2={model.score(X,y)})')
ax.plot(X, y, 'k.', label='data')
ax.plot(X, y_train_pred, 'ro', label='prediction')
ax.grid(True)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
plt.show()
plt.savefig('simple01.png')
```

![simple01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/e6faa62e-ed36-bce3-92de-f6a71ceacb34.png)

とりあえず下記に保存しました。
https://github.com/torupati/study_regression

# まとめ

とりあえず回帰分析ならこれでできそうな気がした。仕事、うまくいくかなぁ。疲れた。。。
(2023/05/29)

- 下記を参考にさせていただきました。多謝。

https://www.dpac.dpri.kyoto-u.ac.jp/enomoto/pymetds/Huber.html

https://di-acc2.com/programming/python/12253/

https://realpython.com/linear-regression-in-python/

https://medium.com/geekculture/simple-linear-regression-analysis-using-python-c5b2f637942



  -
Route53で設定したサブドメインが稀にDNS_PROBE_FINISHED_NXDOMAINが出て困っていた

## 使用
- Lightsail(DNSゾーン、ロードバランサー)
- お名前.com
- Route53
- Amplify

## 解決前の状況
### バックエンド
- Lightsail
    - インスタンス
    - ロードバランサー
    - DNSゾーン
- お名前.com

#### やっていたこと
LightsailのDNSゾーン作成(example.com)
ロードバランサー割り当て
DNSゾーン作成後に表示されるNSレコードをお名前.comのネームサーバーに登録

### フロントエンド
- Amplify
- Route53
- お名前.com
#### やっていたこと
Route53でホストゾーンを登録(sub.example.com)
Route53でホストゾーン登録後に表示されるNSレコードをお名前.comのネームサーバーに登録
Amplifyのカスタムドメインで作成でroute53で登録したサブドメインを設定

## 何が問題だったか
1.1.1.1(CloudFlare)のDNSサーバーを使用した場合DNS_PROBE_FINISHED_NXDOMAINが起きていた
また、8.8.8.8(Google Public DNS)の場合は、連続で実行すると失敗していた

```
nslookup example.com
> 成功

nslookup example.com 1.1.1.1
> 失敗
** server can't find example.com: SERVFAIL

nslookup sub.example.com
> 成功

nslookup sub.example.com 1.1.1.1
> 失敗
** server can't find example.com: SERVFAIL
```


## 対応
- Lightsailで使用していたDNS設定をRoute53に移行
- サブドメインを単体でホストゾーン登録はしない
- Amplifyのカスタムドメイン登録で、先ほど移行したRoute53に登録されているドメインからサブドメインを設定する

#### やったこと
- LightsailのDNSゾーンを削除
- Route53にお名前.comで登録されているドメイン名でホストゾーンを作成(example.com)
- 作成されたNSレコードをお名前.comのネームサーバーに登録
- AレコードでLightsailのロードバランサーを指定
以下参考↓
https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/add-alias-record-for-lightsail-load-balancer#add-address-record-route-53
- Amplifyのカスタムドメイン設定→sub.example.comとして登録

待つ

##### 反映確認のため自分の環境で使用しているDNSサーバーのキャッシュをクリアをした
macOSの場合
`sudo killall -HUP mDNSResponder`

反映された

再度最初に失敗していたnslookupを確認
```
nslookup example.com
> 成功

nslookup example.com 1.1.1.1
> 成功

nslookup sub.example.com
> 成功

nslookup sub.example.com 1.1.1.1
> 成功
```

## 参考
https://qiita.com/aburasoba/items/2c8d992b051e87565951#amplify-でサブドメインを指定する

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/add-alias-record-for-lightsail-load-balancer#add-address-record-route-53

https://qiita.com/tannh/items/b02a8f550ca2f8f2d6b6

https://dnschecker.org/country/jp/

https://www.nslookuptool.com/ja/
初学者メモ　enumとは

# はじめに
記念すべき初投稿！
enumを使えるようになりたい初学者の振り返りメモです

# enumとは
- enumは「enumeration：列挙」の略
- 名前を整数の定数に割り当てるのに使われるデータ型
- そう、「整数の定数に割り当てる」データ型なのです（ここが抜けていてとんでもない目にあいました）

# 手順
1. Gem記述
1. 日本語化
1. ビューで呼び出す

# 実装
### ①今回はGemを使用
```:Gemfile
gem "enum_help"
``` 
bundle installを忘れずに

### ②モデルにenumを定義
```:student.rb
enum gender: { female: 0, male: 1 }
```
今回はStudentモデルのgenderカラムに定義
0→female、1→maleとします

### ③日本語化
まず、国際化（i18n）という仕組みを使用可能に
```:config/application.rb
config.i18n.default_locale = :ja
```

続いて、「config/locales」直下にファイルを作成
日本語の指定を記述
```:ja.yml
ja: #日本語の設定
  enums: #enumの設定
    student:　#モデル名（Studentモデルに対して）
      gender: #カラム名（genderカラムに対して）
        female: "女性"
        male: "男性"
```
階層構造を意識します
「female→女性、male→男性」として日本語の指定完了

### ④ビューファイルで呼び出す
投稿フォームを作成
```:new.html.erb
#...略
<div>
    <%= f.label :gender, '女性' %>
    <%= f.radio_button :gender, Student.genders.key(0) %>
    <%= f.label :gender, '男性' %>
    <%= f.radio_button :gender, Student.genders.key(1) %>
  </div>
#...略
```

投稿後の一覧
```:index.html.erb
#...略
<%= student.gender_i18n %>
#...略
```
「カラム名_i18n」で日本語でその人の性別が表示されました

# 失敗談
今回、何度やっても日本語にならず苦戦
その理由は・・・
```:migrateファイル
#...略
  t.string :gender
#...略
```
データ型が文字列になっているというオチでした
ロールバックして、integerに書き換えました
```:migrateファイル
#...略
  t.integer :gender
#...略
```
記録に残し、記憶に残す！

# まとめ
- enumは整数の定数に割り当てるデータ型
- gemで簡単に使用可能
- 国際化（i18n）によって、日本語化も可能
- 呼び出すときは、「カラム名_i18n」

初投稿で拙い部分もあるかと存じます
ご指導、ご指南いただけると幸いです！！
開発者をキレさせる３つの魔法の言葉

# なぜ人はいがみ合うのか
エンジニアとマーケは敬遠の中だと昔から言ったものだ。
浅いIT業界の歴史の中で今も昔もいがみ合っているのだから、
これはどうしようもない問題なのかもしれない。

だが、同じ会社で働く仲間である以上、仲良くしたいと私は思う。

そこで、エンジニアの視点から見た一方的な偏見に満ち溢れた感想を綴ってみたいと思う。

# ここに○○を出すだけだからすぐできるでしょ？
エンジニアの脳はこの言葉を聞くと活性化する。

その画面にはその情報を持っていない。
データ構造的に取得できない。
それを出すことでUIが崩壊する。

とまぁ基本はそんなことが走馬灯のように走り抜けていく。
軽はずみに知識もなく「すぐ」できるなどと言ってしまう浅はかさは、要らぬ軋轢を生みかねない。

# これと同じの作ってほしい
他社の製品を片手に、そんなことを平然と言ってくる輩もいる。
それと同じのは、その製品を作っている会社に言ってくれ？

ゴ〇ィバのチョコレートを作って欲しいと言われて果たして作れるだろうか。
ハーゲンダ〇ツが食べたいときにハーゲ〇ダッツの紛い物を買って満足できるだろうか。

そんなことは到底不可能だ。
是非、もう少しまともな要件の握り方をしてきてくれ。

# できる。できる。何でもできる。
競合を蹴落とすため、時にはそんなことを言ってしまうかもしれない。
A社でできることはすべて弊社の製品で実現可能です。
そういうことはA社の製品で実際すべての機能を試してから言ってほしい。

基本、そんなに万能ではないし主義の違いから必ずできないことがある。
できるとしたらそれは製品の差別化ができていないのと同義だ。


# 最後に
よく聞く言葉を並べてみたが、普段、軽はずみにこのようなことを言ったりしてはいないだろうか？
もし言っていたとしたら、五寸釘と藁人形には気を付けていただきたいと思う。
二度とこんなことを言わないと神に誓えば少なからず赦されるはずだ。

と、まぁ今回は要件定義時やプリセールスのタイミングで言ってはいけない言葉を並べてみました。
是非、もっと実りある具体的なセールストークでじゅちゅうをかくとくしてほしいものですね
Ruby2.1技術者認定試験 Silver(s.size問題解説)

```ruby
lang = ["python", "ruby", "perl", "c#", "swift"]
result = lang.inject(0) { |i, s| s.size > i ? s.size : i}
puts result
```

Q.何と出力されるかという問題

【解説】

今回は、使うメソッドや演算子の基本の形をまずみていきます。

○injectメソッド

```ruby
配列.inject(初期値){|第1引数, 第2引数|　処理}
```

<aside>
💡 ブロックの第1引数は初回のみ、injectメソッドの引数（初期値）が入る。２回目以降は前回のブロックの戻り値が入る。ブロックの第2引数は配列の各要素が順番に入ります。ブロックの戻り値は次の回に引き継がれ、ブロックの第1引数に入ります。繰り返し処理が最後まで終わると、ブロックの戻り値がinjectメソッドの戻り値となります。

</aside>

参考：プロを目指す人ののためのRuby入門[改訂2版]p429伊藤淳一　技術評論社
○条件演算子（三項演算子）

```ruby
式 ? 真だった場合の処理 :　偽だった場合の処理 
```

参考：プロを目指す人ののためのRuby入門[改訂2版]p67伊藤淳一　技術評論社
○sizeメソッド

```ruby
"文字列".size
```

で、文字列の文字数を返します。

上記injectメソッドと条件演算子（三項演算子）、sizeメソッドの問題です。

```ruby
lang = ["python", "ruby", "perl", "c#", "swift"]
result = lang.inject(0) { |i, s| s.size > i ? s.size : i}
puts result
```

```ruby
lang = ["python", "ruby", "perl", "c#", "swift"]
result = lang.inject(0) { |i, s| 
```
部分は、

1回目のループではiに初期値0が入り、配列langの最初の要素”python”がsに入ります。

次に|i, s| s.size > i ? s.size : iの処理をします。これはsの文字数がiより大きければ、sの文字数を返し、そうでなければ、iの文字数を返す、といった処理です。

[１回目のループ処理内容]

１回目のループではiに初期値0が入り、配列langの最初の要素の”python”がsに入ります。

次に”python”の文字数（つまり6）とi（つまり0）を比べます。

s.size > iは、6>0となるので、真です。なので戻り値は6となります。

[2回目のループ処理内容]

２回目のループでは、iに6が入り、、配列langの2番目の要素の”ruby”がsに入ります。

次に”ruby”の文字数（つまり4）とi（つまり6）を比べます。

s.size > iは、4>6となるので偽です。なので戻り値は6となります。

[3回目のループ処理内容]

3回目のループでは、iに6が入り、、配列langの3番目の要素の”perl”がsに入ります。

次に”perl”の文字数（つまり4）とi（つまり6）を比べます。

s.size > iは、4>6となるので偽です。なので戻り値は6となります。

この処理を繰り返すと最も文字数の多い文字列の文字数が戻り値となります。

つまり、配列langの中で最も文字数の多い、resultの文字数の6が戻り値になります。

A.6
Ruby2.1技術者認定試験 Silver（sprint問題解説）

```ruby
p sprintf("%#b", 20)
```

Q.出力結果は何か？

sprintfは与えられた引数を指定の文字列に返すメソッド

```ruby

sprintf( "フォーマット", 戻したい値 )
```

そして、

“#%b”の部分は以下の記述を参考に計算します。

2進、8進、16進の指示子(b, B, o, x, X) ではそれぞれプレフィックスとして "0b", "0B", "0", "0x", "0X" を付加します。 C 言語と同様引数が 0 の場合にはプレフィックスが付加されません。

<aside>
💡 2進、8進、16進の指示子(b, B, o, x, X) ではそれぞれプレフィックスとして "0b", "0B", "0", "0x", "0X" を付加します。 C 言語と同様引数が 0 の場合にはプレフィックスが付加されません。

</aside>

```ruby
p sprintf("%#b", 10)#=> "0b1010"
p sprintf("%#B", 10)#=> "0B1010"
p sprintf("%#b", 0)#=> "0"
p sprintf("%#o", 10)#=> "012"
p sprintf("%#x", 10)#=> "0xa"
p sprintf("%#X", 10)#=> "0XA"
```

引用元：https://docs.ruby-lang.org/ja/latest/doc/print_format.html

つまり、%#の次の文字がb,Bなら2進数、oなら10進数、x,Xなら16新数に第2引数を直して欲しいという問題です。

今回は、”%#”の次の文字はbなので、先頭に「0b」をつけて20を2進数に直します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3354671/f9e3470c-e522-cf1b-0e0e-41b9ab010fe3.png)



引用元：[https://medium-company.com/2進数/](https://medium-company.com/2%E9%80%B2%E6%95%B0/)

のように計算するため、20は2進数で、10100となる。

なので、0bに20を2進数で表した「10100」をつなげた

0b10100が答えとなる。

<aside>
💡 A.0b10100

</aside>
AI初心者のための「人工知能の種類」ガイド

AIは、デジタルマーケティング戦略を革新し、クライアントのニーズをより深く理解するための強力なツールとなります。

それでは、まずはAIの基本的な種類から見ていきましょう。

## 弱いAI（Narrow AI）
弱いAIは特定のタスクに特化した人工知能です。たとえば、SiriやAlexaのような音声アシスタント、メールフィルタリングや個人の購入パターンを分析するレコメンデーションエンジンなどが含まれます。これらのAIは特定のタスクを自動化し、優れたパフォーマンスを発揮しますが、それらのタスクの範囲外では働くことができません。

## 強いAI（General AI）
強いAIは、人間と同様に複雑な問題を解決できる能力を持つAIを指します。このAIは自己意識を持ち、新しい環境に適応し、それに対して学習する能力を持つとされています。ただし、この種類のAIは現在の技術ではまだ完全には実現されていません。

## スーパーAI
スーパーAIは人間の知識と能力を超えるAIを指します。これはまだ理論的な概念であり、現実的には存在していません。しかし、その可能性が科学者やエンジニアに議論と研究の対象となっています。

さて、次にAIの技術的な種類を見てみましょう。

## 機械学習（Machine Learning）
機械学習はAIの一部門で、アルゴリズムと統計を使用してデータから学習し、特定のタスクを自動化します。こうしたアルゴリズムはデータのパターンを検出し、そのパターンを使用して未来の結果を予測します。

## 深層学習（Deep Learning）
深層学習は機械学習の一種で、人間の脳のニューロンネットワークを模倣したニューラルネットワークを使用します。多層のニューラルネットワークは、大量のデータを入力として受け取り、それぞれの層で情報を解析・抽象化します。これにより、画像認識、自然言語処理、音声認識などの複雑なタスクを処理することが可能となります。

## 自然言語処理（Natural Language Processing, NLP）
自然言語処理はAIが人間の言語を理解し、生成するための技術です。チャットボット、音声認識、翻訳システムなどはこの技術を使用します。これにより、マーケターは顧客の意見や感情をより深く理解したり、ユーザーとのコミュニケーションを自動化することが可能となります。

## 強化学習（Reinforcement Learning）
強化学習はAIが特定の環境で最適な行動を学ぶ技術です。AIは行動の結果からフィードバック（報酬）を得て、より良い結果を達成するための行動を学びます。例えば、AIがゲームをプレイする際には、勝利するための戦略を学習するために強化学習を使用します。

以上がAIの主要な種類と技術です。
「配列のすべての要素が条件を満たすならtrueを返す」関数に空配列を渡したら、trueになるべき理由

:::note warn
もう数年も数学をやってないので、間違っていたら教えてください。
:::

https://twitter.com/fumieval/status/1663161595009314819

話題に乗っかって。

tureを返す、falseを返す、例外やその他の値を返す、といったリプライがついていますが、原則としてtrueを返すのが一般的です。実際の言語で検証していただければわかりますが、汎用的な配列操作関数であればまず間違いなくtrueを返す実装になっています。

JavaScript
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every
.NET 
https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.all?view=net-7.0
Python
https://docs.python.org/ja/3/library/functions.html#all
Swift
https://developer.apple.com/documentation/swift/array/allsatisfy(_:)


# なぜなのか ～Vacuous Truth～
ざっくり言うと、数学的にそれが一番自然であり、一般的だからです。古典理論や集合論でこのような状況はtrueです。これは初学者を混乱させる命題として、**Vacuous Truth**と呼ばれています。(決まった訳語は無いですが、「空虚な真」などと訳されます）

https://en.wikipedia.org/wiki/Vacuous_truth

このワードで検索してもらえるとたくさん解説が出てくるほか、私が中途半端に古典理論を解説するより大学の講義資料等を参照していただくほうがまとまっているかと思いますので、細かい解説はそちらに任せようと思います。

ちなみに、このような「ある配列（集合）に対して、すべてのxが条件を満たす時～というのは、」数学の記号では$\forall$をつかって表すことができます。汎用的な「配列のすべての要素が条件を満たすならtrueを返す」関数はこれに基づいて実装されていると言えます。

# trueになるべき理由
ということで、汎用的な状況タイトルの通りtrueになるべき理由は以下です

* trueを返すのが最も数学的に便利で合理的である
* 古典理論をやった人は、プログラミングでも同様にtrueを期待する
* 様々な言語の標準実装でも（主に上記の理由から）trueを返す
* 標準実装に慣れている人は、他の状況でも同様にtrueを期待する

一般的にtrueが期待されるので、true以外の結果になるのであれば説得力のある理由が求められることでしょう。

# 珍しい例
Swiftでは、import Foundationすると、`"abc".contains("")`がfalseを返します。空文字でフィルタリングしたら全てfalseになってしまうので困るという記事がありました。
https://apprythm.com/382/

これは哲学的な理由……ではなく、どうやらCocoa(Objective-C)の呼び出し連携の都合らしいです。
https://github.com/apple/swift/issues/62269

他に、ある程度汎用的な関数でtrueを返さな例をご存知の方は教えてください。

# 補足
もちろん、具体的な状況では、falseや例外を返したい状況があります。
いくつか検討してみます。サンプルコードはJavaScript風の疑似言語です。

**テストの点が全て70点以上なら合格**
```javascript
function all( 点数一覧 ) {点数一覧.every(x=> x>=70)}
all([70,80]); //true
all([50,80]); //false
all([]); //true
```
これは、テストを1つも受けていないので、falseにするのが正解かもしれません。
「テストを1つ以上受ける」という隠れた条件を書き忘れているのが問題です。

**条件を全て満たすデータベースのレコードを削除する**
```javascript
function all( 値, 削除条件 ) {削除条件.every( x => x(値))}

val = 50;
if(all(val, [100以下, 偶数])) delete(val); // trueなので削除
if(all(val, [100以下, 奇数])) delete(val); // falseなので削除
if(all(val, [] )) delete(val); // 常にtrueなので、valの値に関わらず削除
```

条件が空だったら全部のレコードが削除されることになるでしょう。データベースの中身を全て削除する、という操作を普通は行わないのなら、例外を出して止まるのが安全です。deleteAllみたいな別の関数を呼び出すように誘導するのが良いでしょう。

どれにせよ、このような検証をする関数は`「配列のすべての要素が条件を満たすならtrueを返す」関数`ではなく、`特定のデータ検証を行う関数`と考えるべきです。allやeveryのように汎用な名前をつけず、具体的で慎重な命名が求められるでしょう。

# まとめ
迷ったときには、使っている言語の標準ライブラリをすぐに確認しましょう。また、さらに複数の言語の標準ライブラリを調査することで歴史的な事情や数学的な裏付けが見えてくる場合もあります。

逆に言語ごとに差異があったり、変わったオプションが用意されている場合もあります。

例：空文字に対するSplit

https://twitter.com/wonderful_panda/status/1406850885171380225
GPTを本格的にアプリに入れ込んでみる時の裏技

GPTはみんなもすでに知っていると思うので、説明を割愛します。実現したいのは、アプリの中にGPT APIを埋め込んで、GPTの活用を自動化します。

# 今回の課題

1. LLMは強大と言っても、GPTのようなサービスはプログラミングのように毎回指定した通りに結果を出す保証がない
1. 自作モデルであれば、seedを指定して、ある程度再現性をコントロールできますが、GPT/Bardなどは指定できない
1. GPT APIを使うとtemperatureの設定がありますがそれでも一致の結果を出させる保証がない

# 問題例

## タスク説明

### 文章から名詞と動詞の抽出

入力：文章
ほしい出力：名詞と動詞、それぞれの詞の種類

見やすくために、ChatGPTでデモします。

![Screenshot from 2023-05-30 22-33-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/c6910431-7912-c61b-3d68-9b0ce1293d84.png)

結果としては決して悪くはないです。もし自動化アプリのロジックに入れ込むと、大体このような感じで、

```
# 1回目のロジック

空白の行と説明の行を削除

for 行 in 文章
  if 最後の4文字は (名詞)
    then (名詞)の前の文字は名詞
  elif 最後の4文字は (動詞)
    then (動詞)の前の文字は動詞
```

ただしプロンプトを変えずもう1回出力すると、

![Screenshot from 2023-05-30 22-34-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/832d9f07-21d7-6386-61ef-bc3e8529ed8d.png)

アウトプットが完全に変わりました。これで上記のロジックで処理できなくなります。

```
# 2回目のロジック

空白の行と最初の説明を削除

「名詞」と「動詞」でstrからlistにsplit
「名詞」の後ろのエレメントは名詞、
「動詞」の後ろのエレメントは動詞

```

2パターンを用意すれば問題解決できそうだけど、もう1回生成すると、

![Screenshot from 2023-05-30 22-41-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/1c205eba-786a-975c-cc7b-c80de03335ce.png)

3回目の結果、さらに後ろに追加補足もあります。「名詞」・「動詞」検出で結果を抽出すると、うまく抽出できない可能性が高いです。

これは自然言語処理のデメリットですが、せっかく強大なLLMがあるのに、結果を毎回手動でチェックしないといけないのは、あまりよろしくないですね。

## 50点の改善案

まずプロンプトを少し変えます。ほとんどのユーザーも知っていると思いますが、例を与えると、ある程度フォーマットをGPTに覚えさせるので、かなり効果があります。

![Screenshot from 2023-05-30 22-54-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/15cd63d9-7e24-f077-2aa7-1481467ee7e8.png)

すでにほしい結果がもらえるようです。ただし実際に自動化にすると、たまり予想外の入力もあります。

![Screenshot from 2023-05-30 22-58-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/7cff1305-bd27-32a3-f586-969330a51f18.png)

![Screenshot from 2023-05-30 22-59-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/bdc9d621-512b-6e26-67a6-6200c5bac6f7.png)

例えば、動詞がない時、出力フォーマットが変になります。本当に本番環境で使いたいであれば、このような状況も避けたいです。

## 80点の改善案

ここからは一番重要な改修（マジック）です。要点はLLMがもともとソースコード作成が得意ので、ソースコードで出力させます。

![Screenshot from 2023-05-30 23-07-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/9e58cb8d-4968-e829-30be-69a585aa04a9.png)

![Screenshot from 2023-05-30 23-07-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/e22c7eab-e270-6738-48b4-eb4239662184.png)

整形しなくてもそのまま使えます。

# 

いかがでしょうか
次回はまた別の裏技を紹介します。
嫌われないコードレビューの仕方

現業務でコードレビュアーとして認定されて多分４年近く経ちました。
様々なプロジェクトでいろんなコードをレビューしていく中で学んだことと気づいたことをまとめます。

これはコードレビューに限らず、社会人として誰かに指示をしなければいけない状況では共通する物があると思います。
（「嫌われないコードレビュー」としていますが、私が嫌われていないことと、これを実践した人が嫌われないことは保証していません）

## 1. どんな気持ちでコードレビューを投げてきているか想像してみる
意外と大事です。
例えば、
- 新卒入社して現場入って初めてレビュー出してる人
- CTOからのレビュー依頼

の２つでは意味が全然違うのはわかるかと思います。
前者であればなにかヘマをしていないか、変なミスしてたら怒られるんじゃないかみたいな気持ちになっていてもおかしくはありません。
あなたの会社がまともなのであれば、この場合は指導、育成の意味も込めてレビューをしてあげる必要があります。

CTOからのレビューはサラっと且つ丁寧に返しましょう。(笑)

## 2. 曖昧な指示をしない
コードレビューだとやってしまいがちですが、「結局どうすればいいのかわからない」指示はNGです。

NG）規約違反です。
OK）メソッドの引数のカンマの後には半角スペースが一つ必要です。（コード規約）

GitHubやAzure DevOpsではSuggestion機能もあるので、併せて使うと良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199145/c456c283-8ef8-586c-ea62-a1a08cc42027.png)

## 3. 根拠のない”指示”はなるべくしない（提案はOK）
その修正をするに足る理由がない修正は指示しないほうがいいでしょう。
レビュアーは基本複数人いるので、レビュアーによるバラつきが多くなってしまいます。（ある程度は仕方ないですが）

NG）これはアンチパターンなのでXXをYYに修正してください。
OK）公式ドキュメントによればこれはアンチパターンなのでドキュメントを参考に修正してください。（URL）

ただし、「なんか微妙だな～」と思うシーンは、プログラマであればあると思います。
この違和感は経験に基づいたもので、無視するにはもったいないので、「私はXXXXだと思うのですがどうですか？」といった形で、議論を展開し、レビュイーとの間でコミュニケーションを取るのがいいです。

## 4. キツい言い方にならないように気をつける
上２つのOK例は実はあんまりOKではなくて、結構言い方がキツいです。
CTO相手等であればまあ別にいいんですが、1.で述べたように相手が新人等であればコードレビューを出すのがメンタル的に嫌になってしまうかもしれません。
コードレビューは中長期的に生産性を上げるための活動なので活発に行われるべきです。
なので、レビュアーもレビューイも気持ちよく完了できるように、なるべく物腰やわらかに書くのがいいです。
「コードを否定しない、提案する」が一番いいやり方だと思います。

NG）
ネストが深いので読みづらい。早期returnするといいです。

OK）
このメソッドですが、早期returnすることで可読性を上げられるかと思います。
ガード節と言ったりもするので調べてみてください。
Qiita 初投稿！

こんにちは

いつも仕事で行き詰まった時、Qiitaに助けられている駆け出しエンジニアです。
今回は「Markdown記法 チートシート」を見ながら、初投稿できればと思います！

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

# 簡単な自己紹介
２０代初心者エンジニアです。
主にPythonでの開発、AWSサービス（Lambda、DynamoDB、APIGateway）を扱っています。
未だに自分の分野は何？　まあ、フルスタックエンジニアになれればいいか！

趣味は、ランニング・野球・バスケ、Youtube・旅行・etc..です。→ 仕事と趣味が全然違う（笑）
専門的な発信がいつかできるように、、、修行中です。

# なぜQiitaをはじめた？
私が<strong>Qiita</strong>を始めたきっかけは、日々のインプット量に対してアウトプットが少ないため
全く知識が定着しないと感じたからです。。。以下私の思考回路

「YouTube」→　動画の容量保管大変そう、、編集できなさそう
「Twitter」→　アンチ怖い・技術発信には向かない？
「インスタ」→　オシャレじゃない
「Qiita」→　いつもお世話になっております。楽しそう!  **決定**

# どう使っていく？
* 日々の簡単なTipsをあげていく
* 備忘録として
* 気軽に楽しく

# おわりに
皆さん楽しめたでしょうか？（てか見る人いないか）
ひっそりとやっていければと思います。
よろしくどうぞ！！！

:::note info
ただ使ってみたかっただけ
:::

<details><summary>今回Qiitaでこんな感じに書きました。ご参考までに</summary>

```rb
こんにちは

いつも仕事で行き詰まった時、Qiitaに助けられている駆け出しエンジニアです。
今回は「Markdown記法 チートシート」を見ながら、初投稿できればと思います！

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

# 簡単な自己紹介
２０代初心者エンジニアです。
主にPythonでの開発、AWSサービス（Lambda、DynamoDB、APIGateway）を扱っています。
未だに自分の分野を知っていない。フルスタックエンジニアになれればいいや！

趣味は、ランニング・野球・バスケ、Youtube・旅行・etc..です。→ 仕事と趣味が全然違う（笑）
専門的な発信がいつかできるように、、、修行中です。

# なぜQiitaをはじめた？
私が<strong>Qiita</strong>を始めたきっかけは、日々のインプット量に対してアウトプットが少ないため
全く知識が定着しないと感じたからです。。。以下私の思考回路

「YouTube」→　動画の容量保管大変そう、、編集できなさそう
「Twitter」→　アンチ怖い・技術発信には向かない？
「インスタ」→　オシャレじゃない
「Qiita」→　いつもお世話になっております。楽しそう!  **決定**

# どう使っていく？
* 日々の簡単なTipsをあげていく
* 備忘録として
* 気軽に楽しく

# おわりに
皆さん楽しめたでしょうか？（てか見る人いないか）
ひっそりとやっていければと思います。
よろしくどうぞ！！！

:::note info
ただ使ってみたかっただけ
:::

```
</details>
GCP事始め (学習メモ)

# Google Cloudの強み

- 膨大なデータ分析領域(分散処理)
- 10億人以上が利用するサービスを支える分散テクノロジーをクラウドサービスとして利用できるのがGCPの強み

# BigQuery

- 膨大なデータを超高速に廉価に処理できる
- 並列分散処理によって超高速なデータの検索を実現している

# GoogleのサービスはGCP上で稼働している

- GCPを使う＝Google検索、Googleマップ、YouTube、Gmailなどと同等の技術を受けられるということ
- リージョン間接続には、インターネットではなく専用回線によるグローバルネットワークを利用している

# GCPとAWSの違い

- テクノロジーを牽引するGCP、サービスを牽引するAWS
- GCP
    - Googleエンジニア(特にソフトウェアエンジニア)がターゲット
    - 自社で開発した分散技術をクラウド化
    - シンプルな選択肢、本当に必要なものだけを提供しGoogleのベストプラクティスを利用してもらうことを重視
    - Datacenter as a Serviceの思想「サーバーを意識せずに1台のスパコンを使っているように ITサービスを使えるようにする」→優れたサーバーレスサービスを数多く展開
- AWS
    - ITエンジニア、基盤エンジニアがターゲット
    - 仮想マシン、ストレージ、ネットワークなど汎用的なインフラを早々にクラウド化して企業に浸透させた
    - 豊富な選択肢、Amazonの「Everything Store」の遺伝子感じさせるサービス拡張方針

# 参考

Google Cloud エンタープライズIT基盤設計ガイド
OSの秘密: コンピュータ初心者のためのガイド

こんにちは、みなさん！今日は、これまで名前は聞いたことがあるけれども、具体的に何をするものかよく分からないという初心者の皆様に向けて、OS（オペレーティングシステム）についてお話ししようと思います。OSは、文字通りあなたのコンピュータを「操作」するシステムです。これなしではコンピュータはただの鉄の塊に過ぎません。

## OSって何？
OSは、コンピュータのハードウェアとソフトウェアの間の橋渡し役です。コンピュータハードウェア（CPU、メモリ、ディスクドライブなど）が実際に動くためには、何らかの指示が必要です。それらの指示を与えるのがOSの仕事です。また、OSは我々が普段使うアプリケーション（Webブラウザ、ワードプロセッサ、ゲームなど）がハードウェアリソースを効率的に使用できるようにもします。

## 主要なOS
主要なOSには、Windows、Mac OS、Linuxがあります。

Windows - 世界で最も広く使われているOSです。使いやすさと互換性の高さから、個人用途からビジネスまで幅広く活用されています。

Mac OS - Apple製品に専用のOSです。使いやすさと美しさを兼ね備え、クリエイティブな作業に特化しています。

Linux - オープンソースのOSで、自由なカスタマイズが可能なことが特徴です。サーバーや組み込みシステムなど、専門的な用途でよく使用されます。

## OSの選び方
最適なOSを選ぶためには、自分が何をしたいのか、どのようなことが必要なのかを考えることが重要です。たとえば、ゲームを主に楽しむのであればWindows、映像編集やデザインを主にするならMac OS、システム開発やサーバー管理をするならLinuxが適しています。

OSはコンピュータの中心的存在であり、コンピュータがどのように動作するかを決定します。自分のニーズに最も合ったOSを選ぶことで、より効率的に作業を行うことができます。

## OSのアップデートとは？
OSは常にアップデートされています。開発者たちは新機能を追加し、既存の問題を修正し、セキュリティを強化するためにアップデートを行います。これらのアップデートは、コンピュータのパフォーマンスと安全性を保つために非常に重要です。したがって、アップデートの通知が来たら、可能な限り早くアップデートすることをお勧めします。

## まとめ
OSは、コンピュータが正常に機能するための中心的存在です。それはハードウェアとソフトウェアの間のインターフェースであり、アプリケーションがハードウェアリソースを効率的に使用できるようにします。Windows、Mac OS、Linuxという3つの主要なOSがあり、それぞれが独自の強みと特性を持っています。最適なOSを選ぶには、自分のニーズと目的をよく理解することが重要です。そして、OSは定期的にアップデートされるため、最新の状態を保つことで、コンピュータのパフォーマンスとセキュリティを維持することができます。
【履歴書つくるクン制作】一日目・どういったものを作成するか

最近LaravelとPHPを一通り出来るようになってきたので、新しいWEBアプリでも作成しようかと思い本記事を投稿いたしました。

# 作成に至った経緯

転職を私自身26歳ですが、4回行っています。
毎回履歴書を作成するのが億劫になり、またパソコンを身長した際にOfficeを購入しないとエクセル操作が出来ず履歴書作成が手間だなと感じました

今後より実力主義社会になった場合、スマホやパソコンだけあれば完結するサイトが欲しかったため自作します
※そういったサービスあるにはありますが、ログインしないと使えなかったりと・・色々改善出来る場所はあるのかなという印象です

# 作成期間

一旦機能部分については、フォーム形式で入力していきＰＤＦ出力するものを考えています
認証機能などは考えてないため本機能部分のみは2週間で作成する予定

ＷＥＢデザインの知識がないため、本機能が作成完了後
ＵＩ部分は調べつつ修正、認証機能を設ける事で以前の入力データが保持されているなどを追加していく予定です

# 作成後

まずはＰＣ版を作成しＵＩや機能ともに満足いく結果になったら
ＩＯＳ版とＡｎｄｒｏｉｄ版をリリースしたいと考えています

ＤＬ数が一定数に達した場合は、パソコンがお金なくて購入出来ないといった大学生も利用出来るよう各学校への営業活動なども実施していきたいと考えています。

途中で飽きたらすみません
関数型インタフェース

## 関数型インタフェース
関数型インタフェースは、Javaの機能の一つであり、1つの抽象メソッドを持つ特殊なインタフェース。
ラムダ式やメソッド参照などの機能と組み合わせて、より簡潔かつ柔軟なコードを記述するための基盤となっている。
defaultメソッドやObjectクラスのメソッドのオーバーライドは抽象メソッドとしては扱われないので、以下は関数型インタフェースである。
```.java
@FunctionalInterface //開発者に関数型インタフェースと伝えるもの　動作に影響はない
interface Animal {
    void cry(); //抽象メソッド
    default void eat(省略); //defaultメソッド
    boolean equals(Object object); //Objectクラスのメソッド
}
```

#### 関数の代入
関数型インタフェースを使用することで、ラムダ式の関数を変数に代入することができる。関数型インタフェースは、特定の型の関数を表現できる。以下は代表的な関数型インタフェースとその用途、実装するメソッド。
|型名|用途|実装するメソッド|
|:--|:--:|--:|
|Function|入力値を処理して別の型を出力する|apply|
|Operator|入力値を処理して同じ型を出力する|apply|
|Consumer|入力値を処理して出力しない(戻り値無し)|accept|
|Supplier|入力値無しで出力する|get|

## 使い方
関数型インタフェースを使うことで、ラムダ式でコードを簡潔にすることができている。
### Function
引数で受け取った文字列の長さを出力するラムダ式を格納。
それをapplyで実行している。
```java
public class Main {
    public static void main(String[] args) {
        Function<String, Integer> func = s -> s.length();
        int len = func.apply("ratuki");
        System.out.println(len); //6
    }
}
```
**比較**
関数型インタフェースを使わない場合
```java
public class Main {
    public static void main(String[] args) {
        String input = "ratuki";
        int len = calculateLength(input);
        System.out.println(len); // 6
    }
    
    public static int calculateLength(String s) {
        return s.length();
    }
}
```

### Consumer
引数の値をprintlnで表示するラムダ式を格納。
それをaccdptで実行している。
```java
Consumer<String> printString = str -> System.out.println(str);
printString.accept("Hello, World!");
```
**比較**
関数型インタフェースを使わない場合
```java
public class Main {
    public static void main(String[] args) {
        MyConsumer printString = new MyConsumer();
        printString.accept("Hello, World!");
    }
}

class MyConsumer {
    public void accept(String str) {
        System.out.println(str);
    }
}
```
### Supplier
引数無しで0〜99の数値をランダムで返すラムダ式を格納。
それをgetメソッドで実行している。
```java
Supplier<Integer> randomNumberSupplier = () -> {
    Random random = new Random();
    return random.nextInt(100);
};

int randomNumber = randomNumberSupplier.get();
System.out.println(randomNumber);
```
**比較**
関数型インタフェースを使わない場合

```.java
public class Main {
    public static void main(String[] args) {
        MySupplier randomNumberSupplier = new MySupplier();
        int randomNumber = randomNumberSupplier.get();
        System.out.println(randomNumber);
    }
}

class MySupplier {
    public int get() {
        Random random = new Random();
        return random.nextInt(100);
    }
}
```
gitクローン時の「nosupported authentication methods available」エラーと解決方法

個人開発をしている際、自分でリポジトリを作成してそこにソースをぶちこんでいただけなので
gitクローンをすることってありませんでした。

gitクローンを実行したところ、次のエラーが表示され少しつまったため残しておきます。

エラー文
```
Disconnected: No supported authentication methods available (server sent: publickey)
```

調べてみたところ、SSH接続の認証鍵設定がおかしい？
とのこと


以下手順を実行して解消されました

### 1.PuTTY key Generatorを起動し、Generateを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/dab0af80-d001-7384-1874-deebfcc44661.png)

### 2.緑のバーが100%になるまでマウスを動かし続ける（動きによって鍵を作成してくれている？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/dec2736d-d18d-bf2a-ff59-8f82255f6eed.png)

### 3．作成されたら「save private Key」を押下して適当なローカルフォルダに保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/b0b3b935-e415-e95a-2b1e-94fe5b496bf5.png)


### 4．作成されたファイルはこんな感じになってます
```
PuTTY-User-Key-File-3: ssh-rsa
Encryption: none
Comment: rsa-key-20230530
Public-Lines: 6
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Private-Lines: 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
Private-MAC: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

```
### 5．Public-Lines:6～Public-Lines:4～の間の文字（XXXになっている箇所）をコピーする
※XXXは人によって変わります

### 6.自身のgitからsettingページの「SSH and GPG keys」を開く

SSH keysから「New SSH Key」を押下

押下後以下内容で設定して、「Add SSH Key」を押下

```
title：自分の好きなタイトルでおｋ
key type：Autuentication Key
Key：
ssh-rsa {5.でコピペした内容}
```

例）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/898ec250-0608-ac49-3749-88f266a2046e.png)

### 7.再度gitクローンを実施する

その際に、3．の手順で保存したファイルをPutty鍵として登録してあげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/91e25e34-bab1-7d72-72a3-debca96ed3e4.png)


以上で解消されクローン出来ました。
【Git】ローカルのコミット履歴を全部消す方法

# 目次
[1.はじめに](#1-はじめに)
[2.概要](#2-概要)
[3.実行したこと](#3-実行したこと)
[4.おわりに](#4-おわりに)
[5.参考](#5-参考)


# はじめに
:::note warn
こちらは、個人の学習記事になります。以下の点をご承知おき下さい。
- 学習中の内容になります。必要に応じて都度加筆・修正致します。
- 出来る限り正しく記載するよう努力致しますが、間違い、ミスも御座います。コメントにてご指摘、アドバイス頂けたら幸いです。
- <b>二次情報としての使用は推奨致しません。</b>ご了承ください。
:::

# 概要

　ふと、コミット履歴を確認した時、コメントが「〇〇の変更」とか「△△の実行」とか言葉足らずだったり、GitHub上の差分を見てもコメントとなんの整合性もなくて「ハァ…？」ってなっちゃったので調べました。

　どうしてもGitのコミット履歴(git log)を綺麗にしたい場合。<font color="red">チームや共同で開発する場合は非推奨、扱い注意。</font>学習や個人開発で整理したくなったりした場合にでも。

# 実行したこと

次のコマンドを順に実行しました。
```
git checkout --orphan tmp
git commit -m "Initial Commit"
git checkout -B master
git branch -d tmp
```

#### 1.`git checkout --orphan tmp`　
orphan オプションによって、独立した（親を共有していない）ブランチを切ることができる。ブランチを完全に切り分ける。

#### 2.`git commit -m "Initial Commit"`
独立している `tmp`ブランチにコミット。`tmp`上ではこれが最初のコミットとなる。

#### 3.`git checkout -B main`

B オプションで `main`ブランチを上書き。この時点で main ブランチは先程の1コミットログだけが残る。

#### 4.`git branch -d tmp`

tmpブランチは空になり必要なくなったので、消す。


<details><summary><b>コマンドログ</b></summary>

1.`git checkout --orphan tmp`　


```
Mac:documents ryojigoto$ git checkout --orphan tmp
Switched to a new branch 'tmp'
```

2.`git commit -m "Initial Commit"`

```
Mac:documents ryojigoto$ git commit -m "Initial Commit"
[tmp (root-commit) 4dda201] Initial Commit
 2 files changed, 5 insertions(+)
 create mode 100644 README.md
 create mode 160000 src
```

3.`git checkout -B main`
```
Mac:documents ryojigoto$ git checkout -B main
Switched to and reset branch 'main'
```

4.`git branch -d tmp`
```
Mac:documents ryojigoto$ git branch -d tmp
Deleted branch tmp (was 4dda201).
```


最後に`git log --onelone`で確認して`"Initial Commit"`だけになっていたので、大丈夫そうです。



</details>






# おわりに
 　学習始めの時は、とにかくコミットもプッシュも「出来れば問題ないだろ！！！」なんて考えていましたが、段々履歴を確認するにも「このコミットは一体何の為にやったの？」とか「何を意識して学習に取り組んでいたんだ？」と思うようになり、今回無理やりやったというのが経緯です。GitもGitHubもぐちゃぐちゃになっていたので、今後は日頃から丁寧に記録を残していかねば。と自覚するきっかけになったのでよかったです。




# 参考


- https://qiita.com/okashoi/items/6b1a8ca9a4b001200167
- https://it-memo.work/github-git-rm-cached-command/
Spotifyにログイン時、自動ログインを回避する方法

リダイレクトするURLに
    show_dialog=true
を加えると自動ログインされない

```javascript
const url = `https://accounts.spotify.com/authorize?client_id=${CLIENT_ID}&response_type=code&redirect_uri=${REDIRECT_URI}&state=${state}&scope=${scope}&prompt=login&show_dialog=true`;
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601978/16c44196-5007-b287-a653-e71aa2050127.png" width="500px">
Laravelのexample-appをVS CodeのDev Containersで動かす

## 前提

DockerやVisual Studio Codeなどはインストール済みと仮定する。

## プロジェクトの作成

適当なディレクトリで以下を実行すると、example-appディレクトリ内にlaravelのアプリが作成される。

```
curl -s "https://laravel.build/example-app?with=mysql,redis&devcontainer" | bash 
```

ポイントは、`&devcontainer`の部分で、これを指定すると、`.devcontainer/devcotainer.json`が自動で作成される。
`with`クエリでは、`mysql,redis,meilisearch,mailpit,selenium`などが選択可能。

途中でパスワードの入力が求められる。

## devcontainerの立ち上げ

`example-app`ディレクトリをVisual Studio Codeで開き、コマンドパレットから`Dev Containers: Rebuild and Reopen in Container`を選択して、Docker環境が立ち上がる。

## サーバーの立ち上げ

コンテナ内で以下を実行することで、サーバーが立ち上がるはずである。

```
php artisan serve
```
npm startしたらそのポートは使われてるよとエラーが

　Nodejsをリモートサーバで動かそうと思って以下のような画面が出てきてプログラムがスタートできないことがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/1793e3a4-b3ec-8e8a-f2b3-2de8b2d15533.png)
エラーの内容はこのポート、30000は既に使われているからそのポートを使うように設定したプログラムは起動できませんよということですね。プログラムを起動したままサーバへの接続が切れてしまったとかいろんな理由が考えられます。
どうすればいいでしょうか？
そのプログラムを終了させればいいのですね。
流れは
どのプログラムがそのポートを使っているのかをlsofコマンドで調べる
そのプログラムのID、PIDを見る
killコマンドでPIDを指定してプログラムを終了する。

では入力例を見ていきましょう。
lsofコマンドは-i -P オプションをつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/0a4ce1f6-2d88-2801-5805-85301dcec5d0.png)
ポート30000を使っているプログラムが見えますね。そしてPIDは956493となっています。
killコマンドで終了させましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/9698ca70-57da-2f4c-0e4c-829dad86d969.png)
これで終了しました。確認するためにはもう一度 lsof -i -P を入力してみましょう。
そのあとnpm start コマンドでプログラムは無事スタートするでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/a5a94563-f01d-d2bd-47e0-62081e563742.png)
Excelパスワード機能について

普段ClosedXMLを利用したExcelファイルの作成をしています。
今回、情報を保護するため、Excelファイルを開く際のパスワードをClosedXMLで作成できるかどうか調べたときのメモを書きます。

# 目次
　[結論](#結論)
　[まとめ](#まとめ)

#### 結論
ClosedXMLでExcelを開くときに利用するパスワードをつけることはできなさそうです。

GitHubのリファレンスを見た範囲では、あくまで、タブ「校閲」にある保護の機能を利用できるようです。
保護の機能を使って、シートを増やしたり削除をするシートの構成を保護するブックの保護や、行の追加削除をできなくようにする等のシートの保護がClosedXMLで利用できるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/63d2344b-591a-4608-d8e7-f7b93144ade7.png)

参考リンク

https://closedxml.readthedocs.io/en/latest/features/protect.html#modification-protection

#### まとめ
ClosedXMLではありませんが、別ライブラリの「EPPlus」でExcelを開くときのパスワードを操作できるようです。
自分でまだ動かしてみたことはありませんが、使う機会があれば調査したいと思います。

https://qiita.com/ishisaka/items/eba0c1f1d53d471c9b6f

https://chawatoyo.blog.fc2.com/blog-entry-42.html
URP14のRendererFeatureで複数のポストを使用した際に前のポストを後ろのポストが上書きしてしまう問題

# 概要
URP12からURP14へ移行時に詰まったポイントをメモ程度にまとめています、前提として下記の記事を巡回済みの方が対象です。
・https://zenn.dev/sakutaro/articles/convert_blitter

# 解決策
上記の記事に下コードという表記があるが
```rb
   public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
   {
       if (renderingData.cameraData.isSceneViewCamera)
       {
           return;
       }

       var cmd = CommandBufferPool.Get(ProfilerTag);
       Blitter.BlitCameraTexture(cmd, cameraColorTarget, cameraColorTarget, material, 0);
       context.ExecuteCommandBuffer(cmd);
       CommandBufferPool.Release(cmd);
   }
```
#
このコードではうまく動いているように見えるが、
同じバッファに同一シェーダで読み書きしてはいけないと言うUnityのルールに反しているため、
同一のバッファに書き込めているように見えて内部では別の状態として保存されている。
なので複数のRendererFeatureを使用すると、
イメージ的にはSource側のcameraColorTargetには前回の処理後の状態が入るはずだが、
実際にはScriptableRenderFeatureが始まったときのバッファの状態が入ってくる。
```rb
   public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
   {
       if (renderingData.cameraData.isSceneViewCamera)
       {
           return;
       }

       var cmd = CommandBufferPool.Get(ProfilerTag);
       Blitter.BlitCameraTexture(cmd, cameraColorTarget, bufferTarget, material, 0);
       Blitter.BlitCameraTexture(cmd, bufferTarget, cameraColorTarget);
       context.ExecuteCommandBuffer(cmd);
       CommandBufferPool.Release(cmd);
   }
```
なので上記のように一旦別のバッファに描画し、それをメインバッファにコピーするとうまく複数の描画が行なえます。
Windowsの業務アプリのエンジニアから見たAndroidアプリの違いまとめ

# 概要

転職活動の一環としてかなり昔（AndroidStudioがなかった頃）に触っていたAndroidアプリについてもう一度勉強し直していた。
その出力として、自分が感じていたWindowsアプリとAndroidアプリの差分をまとめておく。
自分と同じような経歴の人がAndroidアプリを作るときに助けになれば幸い。

## 開発環境

比較対象はこのような感じになる

### Windows

- 利用言語
  - C#
- プラットフォーム
  - .Netもしくは.Net Framework
- UI
  - WPF

### Android

- 利用言語
    - Kotlin
- API
    - 31

# 共通点

とりあえずざっくりとだが、変化点を確認する前に共通点を上げておく

- どちらもMVVMパターンが推奨されている
- C#自体がJavaを意識した言語であるため、言語自体に共通点が多い
    - 個人的にはコレクション操作がLINQと同じように使えて便利だった

また、プロジェクトの構成としてどちらもDIモジュールを使うとする。

# 変化点

## APIの安定性

下手すると20年前のコードがそのまま動くぐらいの.Net系と比較してしまうとAndroidのAPIは
不安定さを感じてしまう。

Android Studioのテンプレートは結構な確率で陳腐化しているし、個人サイトの情報も数年前の情報であるとより良い方法があることも多い。
最初から[公式のWebサイト](https://developer.android.com/)から情報を得るのが無難そうだった。
※ただしその内容が使えるかどうかは結局自身で判断する必要がある。（後述）

## ライフサイクル

手っ取り早く言うと、C#のGUIでは基本的にユーザがウィンドウを閉じる操作などを行ったときにGUIの破棄が起こるが、Androidはシステムが積極的に使わないUIをより積極的に廃棄する。
文法レベルでイベントがサポートされているC#プログラマとしては、これにより**事実上イベント駆動ができなくなっている**点が大きな差異だと感じた。

例えばMVVMで、フラグメントがViewModelからイベントを受け取ろうとしたらこんな感じになるだろうか。
(必要なライブラリに関しては省略。)

```kotlin
class SampleFragment: Fragment{
    private val viewModel: SampleViewModel by viewModels()

    override fun onResume(){
        viewModel.setOnEventTriggeredListene(eventListener)
    }

    private val eventListener = SampleEventListener{
        // 実際の処理がこの辺に入る
    }
}

class SampleEventListener(val onEventTriggered: () -> Unit)

class SampleViewModel: ViewModel{
    private val listener: SampleEventListener?

    fun setOnEventTriggeredListene(eventListener: SampleEventListener){
        listener = eventListener
    }
}

```

（雑な実装だからというのもあるが）このような実装だと様々な問題が出てきてしまう。

- 画面回転などでFragmentを再生成するため、ViewModelが古いフラグメントの参照を持ち続ける
  - 単純にリークしてるし、その後のイベントが動作しない、もしくはクラッシュの原因になる
- 単純にイベントハンドラ、購読、解除の実装を全イベントに対して行わなければいけないため、可読性がガタ落ちする
  - 特にイベントハンドラはイベントの数だけ作る事になり、大量のほぼ同じ内容のクラスが生成されることになってしまう
- 別にViewModelの話だけではなく、どこにイベントリスナを置いてもライフサイクルの話がついて回るため、頭のリソースを大量消費する

このような問題から、AndroidのAPIで提供されているもの以外はLiveDataなどの他の方法を先に考える必要がある。

## UIテスト

結論から手早く言うと、**まともな方法では非同期の処理が含まれているUIのテストはできない**。
Googleが提示している方法がこれだが…

https://developer.android.com/training/testing/espresso/idling-resource?hl=ja

要は「Thread.sleepを使いたくなかったら本番コード内にUIテストを行うときの実装を入れてね」と言っている。
株式会社ゆめみさんのコードチェック中に上記アドレスの通りに実装したが、
しっかりと「本番コード内にテストコードが紛れている」判定をもらっているため、
やっぱりおかしな実装だったらしい。
上記のアドレスのどの実装方法を使ってもダメ出しが入る未来しか見えないため、
まともな非同期のUIテストはできない、という結論になった。

（ちなみにゆめみさんのコードチェック自体は上記のイベント絡みの部分で可読性がガタ落ちさせてしまったり、
ここのテストコードでも評価を落としたこともあり、不合格となった。）

## DIコンテナ

これは違いというより、個人的に戸惑った部分。
KotlinのDIコンテナ(Hilt)ではアノテーションでクラス間の関係の情報を用意して、コードを自動生成して対応するようだ。

https://developer.android.com/training/dependency-injection/hilt-android?hl=ja#hilt-modules

アプリケーションのエントリポイントがわかりにくいからというのは理解できるが、
ぱっと見では到達不能コードを作り込んでるように見えてしまう。
TDDなどのリファクタリングを比較的多く行う開発手法では自動的にチェックさせる方法が必要になりそうだと感じた。

ちなみにC#の方はMicrosoft.Extensions.DependencyInjectionを使う場合、
下記のように依存性の登録を行うようなコードを何処かに書く必要がある。

https://learn.microsoft.com/ja-jp/dotnet/core/extensions/dependency-injection-usage

# まとめ

AndroidのAPIやライブラリはライフサイクルの存在により独特な進歩を遂げており、
主にWindowsのアプリを今まで作ってきた自分にとっては、それが大きな参入障壁になっているという印象を受けた。

メモリやCPUが進歩していることもあり、もうそろそろ力技で解決ができないのかな、とは少し思っている。
【学習記録】コードを書くときの手順

# 目次
[1.はじめに](#1-はじめに)
[2.概要](#2-概要)
[3.学習内容](#3-学習内容)
[4.おわりに](#4-おわりに)
[5.参考](#5-参考)


# はじめに
:::note warn
こちらは、個人の学習記事になります。以下の点をご承知おき下さい。
- 学習中の内容になります。必要に応じて都度加筆・修正致します。
- 出来る限り正しく記載するよう努力致しますが、間違い、ミスも御座います。コメントにてご指摘、アドバイス頂けたら幸いです。
- <b>二次情報としての使用は推奨致しません。</b>ご了承ください。
:::

# 概要

　YouTuberの山浦清透さんが主催する「アプレンティスシップ」の募集テストを受けさせていただきました。結果的には今回は参加する機会を(こちらの都合上で)頂けなかったのですが、参考にさせていただいた動画が、コードを書く時の手順・考え方が他の場面でも有用だったので記録しました。


# 学習内容


#### コードを書く時の基礎的な手順
コードを書く時「どう書き始めたらいいかわからない！」「何処でエラーが起きているかがわからない！」「案件を満たして書くってどうしたらいいの？」みたいな、何したらいいか分からんの極みになった時の手順が説明されていた。

## 具体的な方法

#### コードを書き始める時に必要なこと(準備)
     
- プログラムを実行できる環境を整える（IDEなりVScodoなりターミナルなり）
- 関数を定義し、関数を呼び出す形をファイルに記載
- 処理を記載
- 実行



#### コードを書く時の基礎（実行手順）

    
- コードを実行できる状態を用意する。
  関数を定義し、関数を呼び出す（外枠だけをまず書いておくというイメージ。）

- 小さく実行しながら、動作を確認する。<font color="red"><b>※ここが一番大事</b></font>
    実行→動くか確認→少し書き足す→実行→動くか確認（繰り返し）
    。<font color="red"><b>大きい単位で一気に実装しようとするのでなく、細かく確かめて動かしていくことが大事</b></font>

- 書く時の基本ステップ
    1. ロジックを考える。（例：四角形の面積を求める為のロジックはどう言うものなのか考える、調べる）
    2. 処理を日本語コメントで順に記載する。
    どういう処理をするのか分解して書いていく。
    3. 日本語コメントを一つずつコードに置き換える。
    日本語をコードにしていく。一つずつすること。
    4. 要件を満たしている状態にする。
    動いたら、最終的に要件通りか確認して修正していく。





# おわりに



どのコードを書くにしても、分からなく手が止まってしまうので、この考え方が有用だと思いました。

GitHubにプルリクエストする時なんかも、細かい単位でコミットするかと思いますが、それを「手元でコードを書く時」という更に小さい単位で書く感じなんだな〜と思ってます。
RaiseTechの講義内でも、似たような事を講師の方々は仰っていた記憶があるので、もしかしたら、当たり前中の当たり前なのかもしれないです。とても大事な事だと思いますし、手が動かなくなりがちなので意識したいです。







# 参考


- https://www.youtube.com/watch?v=AdguxgpH514&t=816s
ChatGPTみたいに文字をぬるぬる出す方法。

# 概要

ChatGPTのAPIを利用して、文字をぬるぬる出すチャットアプリ（サンプルコード）を実装しました。
（websocketを使っています。）

# 環境
Windows11 Flask 2.3.2 Python 3.9.6 JavaScript

# メイン部分はこんな感じ

```Python:Python Flask
#返答
response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
                {"role": "system", "content": "あなたは###です。"},
                {"role": "user", "content": message}
            ],
        stream=True   
    )

    for chunk in response:
        #文字列送信
        emit('message', {'type': 'text', 'data': chunk["choices"][0]["delta"].get("content", "")}, json=True)
```

全体のソースはこちら

https://github.com/hues4789/DoctorGPTAPI
LinuxサーバOSインストール後初期設定

# はじめに
Linuxサーバ(RedHat系)をインストール直後にやっておくべき初期設定について覚書がてらまとめておきます

# 設定項目

## ネットワーク設定


## SELinux無効化
```Linuxコマンド
vi /etc/selinux/config

[変更前]
SELINUX=enable

[変更後] 
SELINUX=disabled
```

## Firewalld無効化



## ホスト名設定
設定ファイルを変更する方法
```Linuxコマンド
vi /etc/hostname


```
hostnamectlコマンドの使用

## rootユーザSSH接続無効化

## SSH鍵認証設定

## SSHクライアント設定(LogMeTT)

## NTP設定
【C#】デフォルト引数を使用したコンストラクタについて


# はじめに
デフォルト引数を使用することによって、
コンストラクタのオーバーライドを省略する記述方法を初めて知ったので、
簡単にまとめてみました。<br>



| 環境| | 
|:--:|:--:|
| OS       | Windows10 22H2 
| エディター | Visual Studio 2022|


## コンストラクタをオーバーロードする場合
コンストラクタの引数が1つの場合と2つの場合がある際、
コンストラクタのオーバーロードが必須だと思っていました。

```c#:main.cs
    public static class main
    {
        // メイン エントリ ポイント
        static void Main()
        {
            // インスタンス生成
            Animal r = new Animal("うさぎ");
            Animal t = new Animal("かめ",10);
        }

    }
```



```c#:Animal.cs
     public class Animal
    {
        public int id;
        public string name;

        // 引数が1つの場合のコンストラクタ
        public Animal(string name)
        {
            this.id = 0;
            this.name = name;
            Console.WriteLine(name + "さん、" + "はじめまして！");
        }

        // 引数が2つの場合のコンストラクタ
        public Animal(string name, int id = 0)
        {
            this.id = id;
            this.name = name;
            Console.WriteLine( name + "さん、" + "いつもありがとうございます！" );
        }

    }
```
## コンストラクタの引数にデフォルト引数を使用する場合
デフォルト引数を使用すると、コンストラクタの引数が1つの場合も2つの場合も
共通のコンストラクタを使用できるので、オーバーロードする必要がなくなります。
コンストラクタの引数が1つの場合、idには0が設定されます。
```c#:Animal.cs
    public class Animal
    {
        public int id;
        public string name;

        // コンストラクタ
        public Animal(string name, int id = 0)
        {
            this.id = id;
            this.name = name;

            if (id == 0)
            {
                Console.WriteLine(name + "さん、" + "はじめまして！");
            }
            else
            {
                Console.WriteLine( name + "さん、" + "いつもありがとうございます！" );
            }
        }
}
```




```c#:result
うさぎさん、はじめまして！
かめさん、いつもありがとうございます！
```

このように、デフォルト引数を使用することによって、
コンストラクタの数を減らし、
記述を短くすることができました。


# 最後に
ここまでお読みいただき、ありがとうございます！
C#初心者かつ初めての技術記事で、読みにくい部分や間違っている箇所があるかもしれません。
申し訳ありませんが、ご指摘いただけると幸いです。
PrologでHelloWorldプログラムを実装してみた

# 概要
PrologでHelloWorldプログラムを実装してみました。以下のページを参考にしました。

http://s-taichan.blogspot.com/2012/12/prolog-hello-world.html

# 環境構築
以下のコマンドを実行しました。
```
$ sudo apt install gprolog
```

# 対話シェルから実行
以下のコマンドを実行しました。
```
$ prolog 
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 23 2020, 20:14:50 with gcc
By Daniel Diaz
Copyright (C) 1999-2020 Daniel Diaz
| ?- write('Hello World').
Hello World

yes
```

# プログラム作成
以下のソースコードを作成しました。
```hello.pl
hello_world :- write('Hello World!').
```

# 対話シェルでコンパイル＆実行
```
$ prolog 
GNU Prolog 1.4.5 (64 bits)
Compiled Feb 23 2020, 20:14:50 with gcc
By Daniel Diaz
Copyright (C) 1999-2020 Daniel Diaz
| ?- [hello]
.
compiling /home/xxxxx/prolog/hello.pl for byte code...
/home/xxxxx/prolog/hello.pl compiled, 2 lines read - 307 bytes written, 6 ms

(1 ms) yes


| ?- hello_world.
Hello World!

yes
```

# まとめ
何かの役に立てばと。