OmniAICreator/Qiita-1.07M huggingface dataset:
Goの空のインターフェースでanyとして扱うことができるのってなんで？


Goの空のインターフェースは、どんな型でも受け取ることができるため、あらゆる型を代入できます。

```go
package main

import "fmt"

func main() {
    var anyVal interface{}
    anyVal = 1
    fmt.Println(anyVal) // 1

    anyVal = "string"
    fmt.Println(anyVal) // string

    anyVal = []int{1, 2, 3}
    fmt.Println(anyVal) // [1 2 3]

    anyVal = map[string]int{"key": 1}
    fmt.Println(anyVal) // map[key:1]
}
```

これがなぜできるのかを知ったときになるほどと思ったため説明していきます。

## インターフェース

そもそもインターフェースとはなんでしょうか？

[こちらの記事](https://qiita.com/tsukasaI/items/7b6516adcf85bb96e249)で説明していますが、インターフェースはメソッドの集まりを示すものになります。

ある型に対してその型が持つメソッドの集まりを定義することができ、具体的な処理の中身を来にすること無く、その型が持つメソッドを呼び出すことができます。

例えば、以下のようなインターフェースがあるとします。

```go
type Stringer interface {
    String() string
}
```

このインターフェースは`String`メソッドを持つ型に対して適用されます。

```go
package main

import "fmt"

type MyString string

func (m MyString) String() string {
    return string(m)
}

func main() {
    var s Stringer
    s = MyString("Hello, World")
    fmt.Println(s.String()) // Hello, World
}
```

このStringerはMyString型以外にも適用することができ、一例としては数値型にも適用することができます。

```go
type StringerInt int

func (s StringerInt) String() string {
    return fmt.Sprintf("%d", s)
}
```

このようにすることでStringerInt型もStringerインターフェースを満たすことができます。

また、インターフェースで期待していないメソッド以外も持っていても問題ありません。

```go
type StringerInt64 int64

// Stringerインターフェースを満たす
func (s StringerInt64) String() string {
    return fmt.Sprintf("%d", s)
}

func (s StringerInt64) Int() int64 {
    return s
}
```

このようにStringerInt64型はStringerインターフェースを満たしているため、Stringer型に代入することができます。

## さて本題

ここまでインターフェースについて説明してきましたが、空のインターフェースはどうでしょうか？

空のインターフェースには満たすべきメソッドが存在しないという状態になります。

つまりどんなメソッドを持っていても、もしくは何もメソッドを持っていなくても空のインターフェースに代入することができます。

このことからint型、string型、slice型、map型、それ以外の任意のstruct型など、どんな型でも代入することができるということになります。

Go 1.18からはanyが導入され、interface{}のaliasとなっています。

## 最後に

（初めてinterface{}が一般的なanyになるか説明できる？と言われたときに説明できなかったのでこの記事で言語化しておきました。）

みなさんはドヤ顔で説明できるようになりましょう！
rustupでRustのバージョンを管理する

## はじめに
どんなプログラミング言語でも、環境ごとにその言語のバージョンを固定して、開発したい場合があると思います。
rustを使っているときもそんな場面はあると思います。

今回は、rustupで簡単にバージョン管理する方法を書いていきます。

## rustupとは
https://github.com/rust-lang/rustup

https://rustup.rs/

rustupとは、公式にはthe Rust toolchain installerとあります。
rustupを使えば、Rustを簡単にインストールし、コンパイラバージョンを簡単に切り替えることができます。

基本的には公式ドキュメントを読めばできることは把握できると思います。

https://rust-lang.github.io/rustup/

## バージョンを指定する
Rustのバージョンを指定する方法は大きく2通りあります。
1. rustupのコマンドを使い、ディレクトリ単位で指定する
2. rust-toolchain.toml、または、rust-toolchainファイルを作成し、プロジェクト単位で指定する

1つ目の方法では、rustup overriveを使用し、ディレクトリにツールチェーンを割り当てることで、そのディレクトリと、そのディレクトリの子ディレクトリで、rustcやcargoを使ってプロジェクトを作成した際に、指定してrustのバージョンでプロジェクトを作成することができます。
``` shell
$ rustup override set [rust version]
```

2つ目の方法では、プロジェクトディレクトリにrust-toolchainファイルを作成することで、rustのバージョンを指定します。こちらの方法ではプロジェクト単位でバージョン指定ができ、複数人で開発をする際などに有用なのではと思います。
またバージョンだけでなく、アプリケーションのプラットフォームなども管理できます。

```
[toolchain]
channel = "nightly-2020-07-10"
components = [ "rustfmt", "rustc-dev" ]
targets = [ "wasm32-unknown-unknown", "thumbv2-none-eabi" ]
profile = "minimal"
```

私は、アプリケーションを開発する場合は、toolchainファイルで管理し、Rustの機能を試す場合などの、リリースするものではない場合には、ディレクトリ単位でバージョン指定し、複数のプロジェクトを作って開発しています。

## おわり
今回は、rustupでRustのバージョン管理をする方法を書きましたが、他にもいろいろな機能があるので、気になった方は試してみてください。
rye導入時にModuleNotFoundError: No module named 'pkg_resources'

## 起きたこと

既存のPythonプロジェクトをryeへ移行した。そのときにPythonを実行したときに以下のようなエラーに会いました。

```
ModuleNotFoundError: No module named 'pkg_resources'
```

## 解決方法
`setuptools`を入れることで解消した。

```bash
rye add setuptools
rye sync
```
自分用のUnity備忘録

当たり判定は`OnCollisionEnter`関数で実現できる。
```cs:
void OnCollisionEnter(Collision collision){
    Debug.Log("Hello, world!");
}
```

シーンの切り替えは`SceneManager.LoadScene`関数で実現できる。
```cs:
using UnityEngine.SceneManagement;

SceneManager.LoadScene("hogeScene");
```

上と併せて衝突時にシーン切り替えをするようにするのであれば
```cs:
using UnityEngine.SceneManagement;

void OnCollisionEnter(Collision collision){
    SceneManager.LoadScene("hogeScene");
}
```
で実現可能。

unityroomのランキング機能を使用するには`UnityroomApiClient.Instance.SendScore`関数を使えば良い。ただし、`Packages/Unityroom Client Library/Api/UnityroomApiClient`をシーンに配置した上で、HMAC認証用キーを入力必要がある。また、これは標準装備されている機能ではないので、https://github.com/naichilab/unityroom-client-library からダウンロードする必要がある（MIT licenseらしい）。
```cs:
using unityroom.Api;

UnityroomApiClient.Instance.SendScore(1, 100f, ScoreboardWriteMode.HighScoreDesc);
```

キーを押した離したの操作は`Input.GetKey`，`Input.GetKeyDmwn`，`Input.GetKeyUp`で実現できる。
```cs:
if(Input.GetKey(KeyCode.A))
    Debug.Log("hoge");

if(Input.GetKeyDown(KeyCode.A))
    Debug.Log("huga");

if(Input.GetKeyUp(KeyCode.A))
    Debug.Log("Wow!");
```

今までのものと併せれば
```cs:
using UnityEngine.SceneManagement;
using unityroom.Api;

void Update(){
    if(Input.GetKeyDown(KeyCode.S))
        UnityroomApiClient.Instance.SendScore(1, 100f, ScoreboardWriteMode.HighScoreDesc);
    if(Input.GetKeyDown(KeyCode.Q))
        SceneManager.LoadScene("hogeScene");
}
```

特定の２つの当たり判定を無くすには
```cs:
Physics2D.IgnoreCollision(hoge, huga, true);
```
とやれば良い。


多分まだまだ増える。
digコマンドを使用してゾーン情報を確認する方法

![dig001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/fbdbc4ab-bc83-3f1b-e06a-23ab2b18db4e.png)

DNSはインターネットの基盤ともいえる機能ではないでしょうか？

そこで今回はdigコマンドを使用してゾーン情報を確認する方法をご紹介します。

## 基本

digコマンドはDNSレコードを確認できるコマンドとなります。

```
dig ドメイン名
```

下記は「www.google.com」を確認した際の例となります。

```
#コマンド
dig www.google.com

#結果
www.google.com.         180     IN      A       142.250.206.196
```

上記「180」はTTLとなります。

「A」はレコードタイプとなります。

「142.250.206.196」はDNSに登録されている値となります。

## オプション

digコマンドでレコードタイプを指定する場合は「オプション」を指定する必要があります。

例えば「MX」レコードを検索したい場合は下記の様に指定します。

```
dig mx ドメイン名
```

上記のオプションの指定は大文字でも小文字でも指定可能です。

下記代表的なレコードオプションとなります。

| オプション | 内容           |
|:-----------|:---------------|
| A          | Aレコード      |
| AAAA       | AAAAレコード   |
| TXT        | TXTレコード    |
| MX         | MXレコード     |
| CNAME      | CNAMEレコード  |
| NS         | NSレコード     |
| ANY        | 全てのレコード |

## 逆引き

digコマンドではIPアドレスの逆引きも行う事が出来ます。

逆引きを行うには「-x」オプションを指定します。

下記は先程の「www.google.com.」検索にて表示された「142.250.206.196」を逆引き検索した例となります。

```
#コマンド
dig -x 142.250.206.196

#結果
196.206.250.142.in-addr.arpa. 86400 IN  PTR     kix07s07-in-f4.1e100.net.
```

逆引きオプションはその他のレコードタイプ指定とは異なり「小文字」のみでの利用となります。

大文字で指定すると下記の様にエラーとなります。

```
Invalid option: -X
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]

Use "dig -h" (or "dig -h | more") for complete list of options
```

## ネームサーバーを指定する方法

次にネームサーバーを指定し検索する方法についてご紹介します。

下記の様に「@」の後にネームサーバーを指定する事が出来ます。

```
dig @ネームサーバー ドメイン名
```

googleのネームサーバーを指定する場合は下記の様になります。

```
dig @8.8.8.8 www.google.com
```

## 短縮表示

短縮表示をお行いたい場合は「+short」オプションを指定します。

短縮を行わない場合は下記の様にヘッダー情報やクエリ情報が表示されます。

```
#コマンド
dig www.google.com

#結果
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.2 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45968
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         296     IN      A       142.250.206.196

```

下記は「+short」オプションを指定した例となります。

```
#コマンド
dig www.google.com +short

#結果
142.250.206.196
```

とてもスマートで読みやすくなりました。

シェルなどで利用する場合は「+short」オプションを使用する事をおすすめ致します!
完成より完遂を目指そう

## はじめに

タイトルに書いてあることを最近感じたので、初めてのポエム投稿ですが書いていきたいと思います。

## 免責

:::note warn
本ポエムに記載するのは新卒が感じた個人の感想です。
:::

## 本文

新卒の同期でスクラム開発をしていたある日、未経験の人から「このプロダクトっていつ完成するの？」という質問を受けました。

この質問を受けたとき、とてもいい質問だと思ったのと同時に、とても難しい質問だと感じました。なぜなら、「スクラム開発、またはアジャイルにおいて、何を以って完成とするか」が曖昧だからです。アジャイルはもともと、「不確実性の高い時代にうまく対処するため」に生まれた開発手法であり、その過程で最終的なゴールが見えないことが前提です。

もちろん、スプリントのゴールやプロダクトとしてのゴールはあります。しかし、「それが初期段階で分かっていればアジャイルを採用する意味があるのか？」とも考えさせられます（もし初期段階でゴールが分かっていればウォーターフォールでよいため）。

私はむしろ、 **ゴールが見えにくいからこそ、ユーザーとの直接対話を通じてゴールを見つけること** がアジャイルにおいて重要だと考えます。そして、そのような状況であるとゴールが常に変わり続けるため、私は「**モノの完成を目指すよりも、スプリントの完遂**」を目指すべきだと思います。

そのほうが目標設定も容易にできますし、メンタル的な面でも安心して開発ができるのではないでしょうか。
Rubyでデザインパターン (5) Singletonパターン

## この記事は何
デザインパターンについて、Rubyでどのような使い方ができるかをまとめた記事です。
デザインパターン自体の解説は詳しく行いません。

## Singletonパターンとは
Singletonパターンとは、特定のクラスがインスタンスを一つのみしか生成しないことを保証するためのデザインパターンです。

詳しくはこちらをご覧ください。

https://qiita.com/shoheiyokoyama/items/c16fd547a77773c0ccc1

## Rubyでのコード例
単純な実装を行うと、以下のようになります。

```rb
class Singleton
  private_class_method :new

  class << self
    def instance
      @instance ||= new
    end
  end
end

puts Singleton.instance == Singleton.instance
```

```:出力結果
true
```

また、Rubyには`Singleton`モジュールがあるため、mixinするだけでSingletonなクラスを作ることが可能です。

https://docs.ruby-lang.org/ja/latest/class/Singleton.html

```rb
require 'singleton'

class SingletonClass
  include Singleton
end

puts SingletonClass.instance == SingletonClass.instance
```

```:出力結果
true
```

## どのような時に使えるか
正直Singletonは使い所が難しいデザインパターンで、実際Rubyで作成したアプリケーションに実装をしたことはあまりありません。
Singletonの難しさについては以下のような記事でも紹介されています。

https://qiita.com/mo12ino/items/abf2e31e34278ebea42c

https://qiita.com/ndxbn/items/c7a37ea950876176bb81

Singletonパターンで実現したいユースケースは

- 何かしらの理由で特定のクラスのインスタンスの生成を一つのみにしたい
- クラスメソッドではなく、インスタンスの形を取って使いまわせるようにしたい（インターフェースの適応など）

のようなレアなケースになるため、普段から多用するようなデザインパターンではないということなのかもしれません。
ツキノワグマでもわかるLinuxコマンド操作

## :ribbon: :cow: はじめに.. :cake: :cherries: ##

みなさんこんにちは！新卒１年目の大澤です！
この記事を開いていただきありがとうございます！

私は先日、社内の研修が終わり、今現在は７月から参画するプロジェクトに向けてITの知識や技術を身につけるために日々トレーニングをしています！✨
そこで、私が最近学習したIT知識は、Linuxのコマンドです！✨

今回は前回より少しだけパワーアップしたLinuxのコマンド操作について皆さんと一緒に学んでいきたいと思いますっっ！

それでは、さっそくLinuxのコマンドの勉強タイムに入ります！✨
本日もよろしくおねがいします！✨



## :cloud_snow: このコマンドたちはなんだろう..?  :penguin: ##

## :wind_blowing_face:　-rwx rwx rwx ##

:star2:　  r (read) ：読み取り権限のことで、ファイルの内容を表示することができ、ディレクトリの場合はその中のファイルとディレクトリを一覧表示できます！
:star2:　w (write)：書き込み権限のことで、ファイルの内容を変更でき、ディレクトリの場合はその中にファイルやディレクトリを作成、削除、名前変更できます！
:star2:　x (execute)：実行権限のことで、ファイルを実行でき、ディレクトリの場合はそのディレクトリに移動できます！

## :wind_blowing_face:　sudo su - ##

 :zap:　sudo su -は、LinuxやUnix系のシステムで使用されるコマンドであり、スーパーユーザー（root）として新しいシェルセッションを開始するために使用します！



   :zap:　sudo：このコマンドは「superuser do」の略で、一時的に管理者権限を借りるために使います。通常のユーザーが管理者権限を持つコマンドを実行するためにつかうことができます！
:zap: 　su：このコマンドは「substitute user」or「switch user」の略であり、指定したユーザーに切り替えるためのコマンドです。su コマンドだけを使うと、パスワードを求められ、rootユーザーのパスワードを入力するとrootユーザーに切り替わります！
:zap:　-：このコマンドは、ログインシェルを起動することができます！新しいシェルセッションが開始され、そのセッションは指定したユーザー（root）の環境変数と設定を読み込むことができます！そのため、rootユーザーとしての新しい環境を取得することが可能になります！

:zap: sudo によって、現在のユーザーが管理者権限を一時的に取得することができます！
 su - によって、rootユーザーとしてログインシェルを開始し、rootの環境変数と設定を読み込むことができます！
これらのコマンドを入力することにより、rootユーザーとして管理者権限で新しいシェルセッションを開始することが可能になります！



## :balloon: :hamster: さいごに.. :strawberry: :gift: ##

これにて、Linuxのコマンド学習を終わります！
みなさん、いかがでしたか～？？
ぜひ、みなさんがこの記事を読んでLinuxのコマンドについて少しでも興味を持ったり、理解することができていたら幸いです！
ここまで拙い文章を読んでいただきありがとうございました！！
では、また次回の記事でお会いしましょう～💖💛
Claude3.5 Sonnetをスマホで検証 -その2 - 話題のパワハラプロンプトを試してみた

# はじめに
こんにちは！
生成AIについて、パワハラプロンプトが有効らしいので試してみました🙂

今回もClaude3.5 Sonnetを利用します。

どのくらい改善するのでしょうか。

# パワハラプロンプトとは
以下のようなプロンプトで、AIの回答が改善されるとのこと。

「では、この出力を60点とします。これを60点とした時に100点とはどのようなものですか？ 100点にするために足りないものを列挙した後に、100点の答えを生成してください」

# 実際にやってみる

今回は、Claude3.5 Sonnetに、懐かしのハンドスピナーのゲームを作ってもらいます。

:::note info
Reactでハンドスピナーのゲームを使って。
:::

かなりシンプルな、C型の曲線が回るゲームが上がってきました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/6e72d58d-45fa-1e6b-e301-4496a2d54f9e.png" width="300px" />

これを改善してもらいましょう。

:::note info
これを60点として、100点のUIにして。
:::

かなり簡略化したプロンプトですが、だいぶ改善されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/bf0dbfd9-18dd-efcf-c084-5c2d2c439300.png" width="300px" />

それでは、同じプロンプトを繰り返してみます。

2回目

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/fd549d8a-2d17-4069-2e90-1989304bf39a.png" width="300px" />

3回目
だいぶレベルが上がりましたね！
200点くらいになってますね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/f6e6dc6b-8306-1a75-7571-f3b305e83614.png" width="300px" />

ハンドスピナーのカラーを変更することもできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/b5296639-af8c-ab89-df26-6f6c67862fd1.png" width="300px" />

最終的に、こうなりました。
GIFに変換しているので分かりにくいですが、めっちゃ回ります😂

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/b9843f67-0e88-5260-1041-560cc1060fd8.gif" width="300px" />

# まとめ
今回は、話題のパワハラプロンプトを試してみました。

短時間でここまで改善できるって、凄いですね！
下手にあれこれ指示を出すより、かなり効果的です。

プロンプトの効果を確認できたので、活用しようと思います😃
PythonでGUIのモーダレスウィンドウを実装する方法

## はじめに 

こんにちは！今回は、PythonでGUIアプリケーションを作成する際に便利な「モーダレスウィンドウ」の実装方法について解説します。

## モーダレスウィンドウとは？

モーダレスウィンドウとは、メインウィンドウとは独立して操作できるウィンドウのことです。モーダルウィンドウとは異なり、モーダレスウィンドウはメインウィンドウの操作を妨げません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/07ce2c28-33bf-23c9-2f0f-eb003835b253.png)

## 実装方法

今回は、PythonのGUIライブラリとして広く使われている`tkinter`を使用して実装します。

```python
import tkinter as tk
from tkinter import ttk

class MainWindow:
    def __init__(self, master):
        self.master = master
        self.master.title("メインウィンドウ")
        self.master.geometry("300x200")

        self.button = ttk.Button(self.master, text="モーダレスウィンドウを開く", command=self.open_modeless)
        self.button.pack(expand=True)

    def open_modeless(self):
        ModelessWindow(self.master)

class ModelessWindow(tk.Toplevel):
    def __init__(self, master):
        super().__init__(master)
        self.title("モーダレスウィンドウ")
        self.geometry("250x150")

        label = ttk.Label(self, text="これはモーダレスウィンドウです")
        label.pack(expand=True)

if __name__ == "__main__":
    root = tk.Tk()
    app = MainWindow(root)
    root.mainloop()
```

## コードの説明

1. `MainWindow`クラス:
   - メインウィンドウを表します。
   - ボタンを配置し、クリックするとモーダレスウィンドウを開きます。

2. `ModelessWindow`クラス:
   - `tk.Toplevel`を継承してモーダレスウィンドウを作成します。
   - 単純なラベルを配置していますが、必要に応じて様々なウィジェットを追加できます。

3. `open_modeless`メソッド:
   - ボタンクリック時に呼び出され、新しい`ModelessWindow`インスタンスを作成します。

## 実行結果

このスクリプトを実行すると、まずメインウィンドウが表示されます。「モーダレスウィンドウを開く」ボタンをクリックすると、新しいウィンドウが開きます。このモーダレスウィンドウは、メインウィンドウとは独立して操作可能です。

## まとめ

Pythonのtkinterライブラリを使用することで、簡単にモーダレスウィンドウを実装できます。この方法は、複数のウィンドウを同時に操作する必要があるアプリケーションの開発に非常に有用です。

モーダレスウィンドウの利点:
- メインウィンドウの操作を妨げない
- 複数のタスクを同時に処理できる
- ユーザーインターフェースの柔軟性が向上

ぜひ、あなたのアプリケーションにモーダレスウィンドウを取り入れて、ユーザビリティを向上させてみてください！
Angular でコンポーネントのテンプレートに補間を追加しました。

キリが悪かったのでキリのいいところまでやり終えました。
早速、記事を投稿します。
前回からの続きで全く画面更新がなく、ほんとにうまくいってるのか心配でした。
ようやく、思ったとおりに動いていることが確認できました。
何回にも分けて投稿しましたが、ひとつの記事にしてもいいのかなと思いました。
それはそれで、今日の勉強した記録を残します。

前回のコンポーネントのテンプレートにプロパティバインディングを追加した続きになります。

https://qiita.com/monotoneboy/items/d590766b47d39ebf97e7

#### １．プログラムを更新します。
##### １ー１．main.component.ts のテンプレートのタグを更新します。
``` diff
import { Component, Input } from '@angular/core';
import { Encyclopedia } from '../encyclopedia';

@Component({
  selector: 'app-main',
  standalone: true,
  imports: [],
-  templateUrl: './main.component.html',
-  styleUrl: './main.component.css'
+  template: `
+  <h3>ID:{{ encyclopedia.id}}</h3>
+  <h3>NAME:{{ encyclopedia.name}}</h3>
+`
})
export class MainComponent {
  @Input() encyclopedia!: Encyclopedia;
}
```
（アウトプット）
![1-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/3e43ee86-8adf-f785-1da9-efc61f7c09ed.png)

main.component.ts の ID、NAME に app.component.ts で設定した値が表示されました。

無事に思ったとおりになりました。
Pythonのスクリプト内でバージョンを確認する方法

``` check_version.py
import sys

v = sys.version_info
print(v)

if (v.major == 3 and v.minor >= 7) or (v.major >= 4):
	print('version 3.7 or more')

if (v.major == 3 and v.minor <= 7) or (v.major <= 2):
	print('version 3.7 or less')

# > python check_version.py
# sys.version_info(major=3, minor=12, micro=4, releaselevel='final', serial=0)
# version 3.7 or more
```
ABC247Dを解いた

筆者は執筆時点レート600弱の茶色コーダ

最近の目標はDPとセグ木をマスターすることで、
6月20日に行われたADTの時間内にDPを解く事ができたのでまとめておく

ABC271D

https://atcoder.jp/contests/abc271/tasks/abc271_d

ADTの問題ページ

https://atcoder.jp/contests/adt_all_20240620_3/tasks/abc271_d

# 実装コード

部分和問題に解の復元を追加した問題で、ADTの時間中に鉄則本を読みながらであるが実装できた

```python
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N, S = rLI()
    A, B = [], []
    for _ in range(N):
        a,b = rLI()
        A += [a]
        B += [b]
    dp = [[False]*(10100) for _ in range(N+1)]
    dp[0][0] = True
    for i in range(N):
        a, b = A[i], B[i]
        for j in range(10100):
            if dp[i][j]:
                if j+a < 10100:dp[i+1][j+a] = True
                if j+b < 10100:dp[i+1][j+b] = True  
    print("Yes" if dp[N][S] else "No")
    if dp[N][S]:
        select=""
        cur = S
        for i in range(N,0,-1):
            a, b = A[i-1], B[i-1]
            if dp[i-1][cur-a]:
                select+="H"
                cur -= a
            else:
                select+="T"
                cur -= b
        print(select[::-1])
                
if __name__ == '__main__':
    main()


```

# まとめ
ADTの時間中にDP問題があり、それをACできたのでまとめた。
今後ABCでDP問題があれば時間内に解きたい[^ABC359]。

# 余談

この問題、Xの投稿によれば、鉄則本の応用問題とほぼ同じだったらしい。

[^ABC359]: このADTの次の土曜日(6/22)にDP問題でたけどDPだと分からなくて解けなかったのは内緒
【R】散布図にグリッド線を入れる

# はじめに

Rで散布図を描くと「まっさらなプロットエリア内にデータが点として描画」されますが、今回はプロットエリア内にグリッド線（罫線的なもの）を入れる方法を備忘録としてまとめてみました。

（論文等で散布図にグリッド線を入れている図はほとんど見かけないので、まさに「誰得」的な記事ですね...）

# 使用するデータ

* [以前に散布図を描画する方法を紹介した記事](https://qiita.com/nkojima/items/c008adec58c7834edfc1)で使った、樹高と標高のデータを使用しました。
  * ファイル名は `tree_height.csv` となります。


# 作成したコード

* 以下のコードではX軸とY軸の両方にグリッド線を入れており、その際に「`plot`関数を呼び出した時点ではX軸とY軸の目盛りを描画せず（`xaxt="n", yaxt="n"`）、グリッド線付きで軸目盛りを後から描画する」という方法を使っています。
  * グリッド線はX軸のみ、あるいはY軸のみに設定することも可能です。
  * もっとスマートな方法があるのかもしれませんが、私の知る限りではこの方法が良いと考えています。
     * グリッド線を単純に入れるだけであれば、`grid`という関数を利用した方がスマートなコードになります。（@WolfMoon さん、コメントありがとうございました）
* グリッド線を入れると凡例がグリッド線と重なって見づらくなるため、凡例の背景を白で塗りつぶしています（`bg="white"`）。

```r:グリッド線付きの散布図の作成
# データを読み込む。
setwd("C:\\")
tree_height <- read.table(".\\tree_height.csv", header=TRUE, encoding="CP932", sep=",")

# 縦横5インチの作図エリアとする。
dev.new(width=5, height=5) 

# type="n"を指定して、散布図の「枠」だけを作成する。
plot(tree_height$altitude, tree_height$tree_height, 
  main="標高と樹高との関係", 
  xlab="標高(m)", ylab="樹高(m)", 
  xlim=c(250,500), ylim=c(6,16),  # X軸とY軸の範囲を指定
  xaxt="n", yaxt="n",             # X軸とY軸を描画しない
  type="n"                        # 点をプロットしない
  )

# X軸とY軸の目盛りを描画する際に、グリッド線（点線）を入れる
# tck: グリッド線の太さ
# lty: グリッド線のタイプ
# las=1: 軸の値を水平に表示
axis(side=1, at=seq(250,500,50), tck=1.0, lty="dotted", las=1)
axis(side=2, at=seq(6,16,2), tck=1.0, lty="dotted", las=1)

# 東斜面のデータを白丸（〇）で描画する。
points(tree_height$altitude[tree_height$direction == "east"], 
  tree_height$tree_height[tree_height$direction == "east"], 
  pch = 1, cex = 1.5)

# 西斜面のデータを黒丸（●）で描画する。
points(tree_height$altitude[tree_height$direction == "west"], 
  tree_height$tree_height[tree_height$direction == "west"], 
  pch = 16, cex = 1.5)

# 散布図の右上に凡例を表示する。
# 文字サイズは通常（cex = 1）で、記号のサイズは1.5倍（pt.cex = 1.5）に設定
legend("topright", 
  pch = c(1, 16), 
  cex=1, pt.cex=1.5,
  legend=c("east", "west"),
  bg="white"                 # 凡例の背景を白で塗りつぶす
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/959075c1-f874-bbf3-43e4-8f1836756312.png)

# その他

* X軸とY軸の目盛りの間隔は「やや広め」くらいにしておいた方が見やすいです。
  * グリッド線を入れるとプロットエリアがごちゃごちゃするので、目盛りの間隔が狭いと非常に見づらくなります。
* グリッド線は`plot`関数で作った図であれば利用出来るので、折れ線グラフなど別のタイプの図でも同じ方法を活用できます。

# 参考URL

* [【R】散布図を描く方法](https://qiita.com/nkojima/items/c008adec58c7834edfc1)
* [Rによる散布図の描画](https://data-science.gr.jp/implementation/ida_r_scatter_plot.html)
PythonでGUIのモーダルウィンドウを実装する方法

## はじめに

こんにちは、Pythonエンジニアの皆さん！今回は、PythonでGUIアプリケーションを作成する際に便利な「モーダルウィンドウ」の実装方法について解説します。

## モーダルウィンドウとは？

モーダルウィンドウは、メインウィンドウの上に表示される小さなウィンドウで、ユーザーの注意を特定の操作や情報に集中させるために使用されます。モーダルウィンドウが開いている間は、メインウィンドウとの対話ができなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/633c98b9-e33a-f7ec-1968-5b856f85db76.png)


## 実装方法

今回は、Pythonの代表的なGUIライブラリである`tkinter`を使用して、モーダルウィンドウを実装します。

### 1. 必要なライブラリのインポート

```python
import tkinter as tk
from tkinter import ttk
```

### 2. メインウィンドウの作成

```python
class MainWindow:
    def __init__(self, master):
        self.master = master
        self.master.title("メインウィンドウ")
        self.master.geometry("300x200")

        self.button = ttk.Button(self.master, text="モーダルウィンドウを開く", command=self.open_modal)
        self.button.pack(expand=True)

    def open_modal(self):
        ModalWindow(self.master)
```

### 3. モーダルウィンドウの作成

```python
class ModalWindow(tk.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)
        self.title("モーダルウィンドウ")
        self.geometry("250x150")
        self.transient(parent)
        self.grab_set()

        label = ttk.Label(self, text="これはモーダルウィンドウです")
        label.pack(expand=True)

        close_button = ttk.Button(self, text="閉じる", command=self.destroy)
        close_button.pack(expand=True)

        self.wait_window()
```

### 4. アプリケーションの実行

```python
if __name__ == "__main__":
    root = tk.Tk()
    app = MainWindow(root)
    root.mainloop()
```

## コードの解説

1. `MainWindow`クラスでメインウィンドウを作成し、ボタンを配置します。
2. ボタンがクリックされると`open_modal`メソッドが呼び出され、`ModalWindow`クラスのインスタンスが作成されます。
3. `ModalWindow`クラスは`tk.Toplevel`を継承しており、新しいウィンドウを作成します。
4. `transient(parent)`メソッドで、モーダルウィンドウをメインウィンドウの子ウィンドウとして設定します。
5. `grab_set()`メソッドで、モーダルウィンドウにフォーカスを設定し、他のウィンドウとの対話を禁止します。
6. `wait_window()`メソッドで、モーダルウィンドウが閉じられるまでプログラムの実行を一時停止します。

## まとめ

以上が、Pythonのtkinterライブラリを使用してGUIアプリケーションにモーダルウィンドウを実装する方法です。モーダルウィンドウを使用することで、ユーザーの注意を特定の操作に集中させ、より直感的なユーザーインターフェースを作成することができます。

ぜひ、皆さんのアプリケーションにも取り入れてみてください！
ControllerAdviceの設定ミスでCircular view path のエラーが発生してしまった話

# はじめに
Spring Webの`@ControllerAdvice`を使用した例外のハンドリングをしようとしたら`Circular view path`のエラーになってしまったので原因と解消方法を記載します。

# 対象のコード
エラーが起こった際のコードがこちらです。
`@ControllerAdvice`を久しぶりに行ったのもあり、こんなコードになっていました。

```kotlin
@ControllerAdvice
class ExceptionHandler {
    
    @ExceptionHandler(Exception::class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    fun handleException(e: Exception): String {
        return "internal server error."
    }
}
```

そして、このコード部分を通るようなリクエストを行うと以下のエラーが発生しました。
```log
jakarta.servlet.ServletException: Circular view path [internal server error.]: would dispatch back to the current handler URL [/api/internal server error.] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
```

# 原因と解消方法
この原因は、`@ResponseBody`を付与していなかったためです。
そのため、handleExceptionからの返却値をSpring MVCがビュー名として解釈し、そのURLに再度ディスパッチしようとして無限ループになっていたのです。
`@ResponseBody`を付与する、またはStringではなくResponsEntityを返却するようにすれば、このエラーは発生せず、適切にハンドリングされました。
【ゼロからのOS自作入門】WSLでHelloWorldする

## はじめに
ゼロからのOS自作入門を買いました。
HelloWorldで行き詰ったので、上手くいった手順の書き残しておきます。

## 環境
- Windows 10
- WSL2（Ubuntu）

## 手順
### WSL2をセットアップする
書籍通り行う。

### Ubuntuをインストールする
書籍通り行う。


### Hello worldする
ここから本題の「Hello, World!」を表示するOSを立ち上げます。
まず初めに、書籍ではバイナリエディタでプログラムを写経することがオススメされていましたが、そこで詰まりそうだったためサポートサイトで提供されている完成ファイルを使用しています。

#### 環境構築
Ubuntuのコンソールでプログラムをエミュレートするための環境を構築します。
私はここで詰まったのですが、書籍ではなくサポート用のGithubに手順が記載されています。

https://github.com/uchan-nos/mikanos-build

まず、「ビルド環境の構築 > リポジトリのダウンロード」を行います。
Ubuntuのコンソールで下記コマンドを順番に実行します。
```
$ sudo apt update
$ sudo apt install git
$ cd $HOME
$ git clone https://github.com/uchan-nos/mikanos-build.git osbook
```
lsコマンドでosbookディレクトリができているのが確認できました。
続いて、「ビルド環境の構築 > 開発ツールの導入」を行います。
Ubuntuのコンソールで下記コマンドを順番に実行します。
```
$ sudo apt install ansible
$ cd $HOME/osbook/devenv
$ ansible-playbook -K -i ansible_inventory ansible_provision.yml
```

#### ハローワールドプログラムの実行
書籍に戻り、「1.4 エミュレータでのやり方」を進めていきます。
まず、ハローワールドプログラムをDLします。（本当は写経すべきですが）
Ubuntuのコンソールで下記実行します。
```
$ curl -O https://raw.githubusercontent.com/uchan-nos/mikanos-build/master/day01/bin/hello.efi
```
lsコマンドで「hello.efi」というファイルをDLできたのが確認できます。
続いて、ディスクイメージ作成のために下記を実行します。
```
$ qemu-img create -f raw disk.img 200M
$ mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img
$ mkdir -p mnt
$ sudo mount -o loop disk.img mnt
$ sudo mkdir -p mnt/EFI/BOOT
$ sudo cp hello.efi mnt/EFI/BOOT/BOOTX64.EFI
$ sudo umount mnt
```
lsコマンドで「disk.img」というファイルができたのが確認できます。
続いて、ディスクイメージをQEMUで起動するために下記を実行します。
```
$ qemu-system-x86_64 -drive if=pflash,file=$HOME/osbook/devenv/OVMF_CODE.fd -drive if=pflash,file=$HOME/osbook/devenv/OVMF_VARS.fd -hda disk.img
```
QEMUのウィンドウが立ち上がり、「Hello, world!」が表示されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/660a05ad-201d-2ea6-f39c-740253d8dda4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/3cc28fcf-7347-cd28-0fe7-56055a35f65d.png)


## run_qemu.shでの実行方法
```
$HOME/osbook/devenv/run_qemu.sh osbook/devenv/mnt/EFI/BOOT/BOOTX64.EFI
```
Ruby, Ruby on Railsのselectメソッドについて

### 読んで欲しい人

- selectメソッドがわからない人
- 過去の自分

### 動作環境

- ruby 3.3.0
- Rails 7.1.3.3

### selectとは

- Enumerableモジュールの一部
- 文字列、配列、ハッシュに対して検索を行えるメソッド

**Enumerableモジュールとは**

- 繰り返し処理を行うためのモジュール

Enumerableモジュールに定義されているメソッドは全て`each`を用いて定義されてる。

`each`を基盤として、より複雑な操作を簡単に行うための道具箱がEnumerableモジュールという感じ。

### モデルに使う時

前提：下記のusersテーブルがあるとする

|id  |name  |email  |
|---|---|---|
|1  |jojo  |jojo@example.com  |
|2  |dio  |dio@example.com  |
|3  |hoge  |hoge@example.com  |

普通に情報を取得すると下記

```ruby
User.all

# 発行されるSQL
SELECT `users`.* FROM `users`

[ #<Cat id: 1, name: "jojo", email: "jojo@example.com", created_at.......>, 
#<Cat id: 2, name: "dio", email: "dio@example.com", created_at.......>, 
#<Cat id: 3, name: "hoge", email: "hoge@example.com", created_at.......>, 
]
```

#### 1. selectステートメントを利用する

`select`の引数に指定カラムを入れると、指定したカラムのみの配列を取ってくれる
```ruby
User.select(:name)

# 発行されるSQL
SELECT "users"."name" FROM "users"

[ #<User name: "jojo", id: nil>,
#<User name: "dio", id: nil>,
#<User name: "hoge", id: nil>,
]
```

#### 2. ブロックを引数を利用して、配列のArray#selectメソッド的に使う

Array#selectメソッドを使用して、データベースから取得したオブジェクトの配列に対して条件を適用する場合

`user.id.odd?`でtrueのみの要素で配列を作ってくれる

※`odd?`は偶数かどうかを真偽で返してくれる

```ruby
User.select { |user| user.id.odd? }

# 発行されるSQL
SELECT "users".* FROM "users"

[ #<Cat id: 1, name: "jojo", email: "jojo@example.com", created_at.......>, 
#<Cat id: 3, name: "hoge", email: "hoge@example.com", created_at.......>, 
]

```


### 配列に使う時

```ruby
numbers = [1, 2, 3, 4, 5]

even_numbers = numbers.select { |number| number.even? }
puts even_numbers # => [2, 4]

```

`numbers`配列の中身1つ1つを`even?`メソッドで確認して、`true`のものだけを格納してる

※`even?`は偶数かどうかを真偽で返してくれる

### ハッシュに使う時

```ruby
scores = {
  alice: 85,
  bob: 90,
  charlie: 78,
  diana: 92
}

# スコアが80以上の生徒だけを抽出
high_scorers = scores.select { |name, score| score >= 80 }
puts high_scorers # => {:alice=>85, :bob=>90, :diana=>92}
```

ハッシュにもいい感じ

### 学びと感想

- Railsを触っていて、当然ですがRubyのメソッドがわからないとお話にならないなと学べました
- 配列やハッシュを用いてデータを活用できれば、Railsでやれることが増えるなと思いました。

### 参考記事

https://pikawaka.com/rails/select

https://style.potepan.com/articles/30673.html
日付管理はバックエンドで行うべき理由

# はじめに

データベースにレコードを保存する際、作成日時や更新日時などの日付カラムをどこで生成するかは重要な設計のポイントです。本記事では、日付はフロントエンドではなくバックエンドで振るべき理由について解説します。

## 一貫性の確保

バックエンドで日付を管理することで、一貫性のあるタイムスタンプを保証できます。異なるクライアントからのリクエストでも、サーバー側で一元的に日付を生成するため、タイムゾーンの違いやクライアントの時計設定によるズレを防ぐことができます。

## セキュリティ

フロントエンドから送信される日付は、クライアント側で操作される可能性があります。ユーザーが意図的に不正な日付を送信するリスクを避けるためにも、信頼性の高いサーバー側で日付を生成することが重要です。

## 正確なタイムスタンプ

サーバーサイドで日付を生成することで、サーバーの正確な時間を使用できます。これにより、データベースに保存される全てのレコードが正確なタイムスタンプを持つことができます。特にログ管理や監査の際に、この正確さは非常に重要です。

## 管理の簡略化

日付の管理がバックエンドで一元化されるため、コードの複雑さを減らすことができます。フロントエンドとバックエンドの両方で日付を扱う場合、それぞれの整合性を保つための追加のロジックが必要になりますが、バックエンドで統一すればその必要がなくなります。

## パフォーマンス

日付の生成はサーバー側で行われるため、クライアント側の処理負荷を軽減できます。特に、リソースが限られたモバイルデバイスなどでは、この負荷軽減がユーザーエクスペリエンスの向上に寄与します。

## JSON のシリアライズとデシリアライズの問題

フロントエンドとバックエンド間でデータをやり取りする際、JSON 形式を使用することが一般的です。しかし、日付のシリアライズとデシリアライズに関しては注意が必要です。

### シリアライズの問題

フロントエンドで日付を生成し、その日付を JSON 形式でバックエンドに送信する際、タイムゾーンの違いが問題になることがあります。異なるタイムゾーンのクライアントからのリクエストでは、一貫性のある日付が送信されない可能性があります。

### デシリアライズの問題

バックエンドで受け取った日付をデシリアライズする際、クライアントがどのタイムゾーンで日付を生成したかを把握していないと、誤った日付がデシリアライズされる可能性があります。これにより、データの一貫性が失われるリスクがあります。

## まとめ

以上の理由から、作成日時や更新日時などの日付カラムはバックエンドで振るべきです。一貫性、セキュリティ、正確性、管理の簡略化、パフォーマンスといった多くの利点があり、バックエンドでの日付管理は推奨される設計方法です。また、JSON のシリアライズとデシリアライズに関する問題も防ぐことができます。

日付管理のベストプラクティスを採用することで、より信頼性の高いシステムを構築しましょう。
Amazon BedrockでClaude3.5を触ってみる part1

# 前置
数日前にリリースされたClaude3.5 Sonnetが現時点の性能が非常に良いという情報がXに流れてきた
せっかくなので触ってた
https://claude.ai/chats

レスポンスも早い。
Claude公式サイトは英語だが日本語での回答もしてくれる。

AI回答曰くAmazon BedrockにもClaude 3.5 Sonnetは対応しているようなので、いい機会だし触ったことがないサービスの1つであるBedrockを触ってみようと思う。

![スクリーンショット 2024-06-25 202342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/83280570-d27c-7f27-4919-12299becbc5d.png)

(ちなみに筆者は生成AIについてはChatGPTをシステム開発で軽く使っているくらいの知識しかない)

# 本題
という訳で早速触って行こうと思う。

会社の学習用AWSアカウントを利用してBeadrockにアクセスしてAnthropicを選択
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/16514750-a83f-56b8-5e30-19c752c6721e.jpeg)

...ﾑ? 3.5が選択できない。
Claude公式サイトで直接聞いた回答には誤答があったのか？
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/62a8953b-cac2-d446-7722-0476cc40df5c.jpeg)


そんなことは一切なく料金表を見る限りそもそも東京リージョンは最新バージョンをまだサポートしていないらしい。~~早くサポートしてほしい~~
https://aws.amazon.com/jp/bedrock/pricing/
![スクリーンショット 2024-06-25 204623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/47781c2e-049a-98ec-7fa6-f936a81664ba.png)


リージョンをバージニア北部にしてみたら選択肢に追加された。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796391/d21b2bee-1fe5-7ce5-e7ec-48f7b5bda799.jpeg)


この後実際に触ってみたいのだが、オンデマンド料金で1000トークン当たり入力0.003USD、出力0.015USDと円換算しても微額ではあるが、会社のアカウントではあるため一応確認を取る必要がある。(今年転職したばかりなので)

という訳で許可を得てから書くpart2で実際に触ってみようと思います。
APIも対応しているみたいなので、Claudeとの単純な会話プログラムでも作ってみようかな。
https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html


part2 → 許可を頂いたので調査＆執筆中
Discordでアプリの認証設定の解除する

# はじめに
DiscordのActivity開発で認証処理を再度確認したいときに認証解除する方法のメモです。

# やりかた
[ユーザー設定]->[連携済みアプリケーション]
任意のアプリを「認証解除」をする

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553099/ad7e70c6-eb9f-3613-8859-857abd8b7a1e.jpeg)
Javaのコンパイルとは　

# 概要
### この記事で何がわかる？
+  Javaのコンパイルとは何か
+  コンパイルの実行方法

### 今回で覚えておきたいこと
+ コンパイルの流れ

# コンパイルとは

- 「コンパイル」とはプログラミング言語を機械語に変換すること
    - コンパイルのためのソフトウェアを「コンパイラ」という
- JavaはOSに依存しないシステム開発を実現している
    - これは直接OSに合わせてコンパイルするのではなく、一度中間言語に翻訳し、その後それぞれのコンピュータのJVMのインタプリタが機械語に翻訳するという処理の流れ
- ソースコード→コンパイラ→中間言語→JVM→インタプリタ→機械語という流れ
- コンパイルすることによって中間言語に翻訳されるが、これがクラスファイル（javacコマンド実行後）
- その後javaコマンドを実行することでJVM後の処理が行われる

# 実際にコンパイルを行う流れ(windows)
1. textファイルでJavaのプログラムを作成(サクラエディタなど)
1. コマンドプロンプトにて`javac [ファイル名].java`というコマンドを実行
    + これによってファイルをコンパイルすることができ、[ファイル名].classというファイルが作成される
3. 再度コマンドプロンプトで`java [クラスファイル名]`というコマンドを実行
3. Javaのプログラムが実行される
    ※ .classはつけないこと！

# まとめ
+ コンパイルをすることによってコンピュータがプログラムを読むことができるようになり、プログラムが実行される
+ VSCodeやEclipceで開発するとすぐに実行してくれるが、内部でどんなことが起こっているのかざっくりでいいから知っておこう！
Scala 3で型情報を標準出力する方法

# 概要

Scala 3では、型情報を取得して標準出力するための新しい方法が提供されています。
この記事では、`inline`を使用して、型情報を標準出力する方法について説明します。
以下に、具体的なコード例とその実行結果を示します。

## コード例

まず、型情報を取得するためのメソッド`Lib#of`を作成します。
ここでは`inline`関数とマクロを使用して、型情報を文字列として取得します。

```scala:Lib.scala
import scala.quoted.*

object Lib {
  inline def of[A]: String = ${impl[A]}
  def impl[A](using Type[A], Quotes): Expr[String] =
    Expr(Type.show[A])
}
```

次に、このライブラリを使用して型情報を標準出力するメインプログラムを作成します。

```scala:Main.scala
inline def printTypeInfo[T](value: T): Unit = {
  println(Lib.of[T])
}

val intVal = 42
val strVal = "Hello, Scala 3"

@main def main: Unit =
  printTypeInfo(intVal)
  printTypeInfo(strVal)
```

上記のコードを実行すると、以下のような結果が得られます。

```txt:実行結果
scala.Int
java.lang.String
```

## 解説

### Lib.scala の詳細

- **`inline def of[A]: String`**: これはインライン関数で、型 `A` の情報を取得するための入り口となるメソッドです
- **`def impl[A](using Type[A], Quotes): Expr[String]`**: この関数はマクロ実装で、型 `A` の情報を文字列として取得し、それを `Expr[String]` として返します。`Type.show[A]` を使用して型 `A` の情報を取得しています。

### Main.scala の詳細

- **`inline def printTypeInfo[T](value: T): Unit`**: このインライン関数は、`Lib.of[T]` を呼び出して型情報を取得し、それを標準出力します。
- **`@main def main: Unit`**: メインエントリーポイントです。この中で、`printTypeInfo` 関数を呼び出し、変数 `intVal` と `strVal` の型情報を出力しています。

## まとめ

Scala 3では、`inline` とマクロを使用することで、型情報を簡単に取得し、標準出力することができます。
デバッグやロギングに使えそうですね。
PRに対して意識が変わりました 〜エンジニア2年目の夏〜

PRっていいですよね。
起票側だけでなくレビュー側も刺激が得られる貴重な場面だと思います。

私、もうすぐ業界3年目を迎えます。
親身なレビュワー方に恵まれているのもあって、PRを通してとても成長の実感を感じています。

**気づけばこの1年間で「起票→マージ」されたPRは350をこえてました…。**
（びっくり 😳）

PRで溢れている環境に身を置く前の心境、筆者の環境がPRで溢れ出した時の心境、現在の心境を綴ります。

筆者がPRにおいて重視していることのみを知りたい方は[こちら](#決めたこと)。

## PRってなぁに？
PullRequestへの馴染みがない人に一応説明します。
> 行ったコードの変更をレビューしてもらい、それを元のコードベース（リポジトリ）に統合するためのリクエスト。

要は...。
実装コードを他者に見てもらう。OKだったらマージしてもらう。っていう仕組みです。

## はじめまして、 PR。
PRに対して一番最初に思ったことはこれです。

**「めっちゃ FB もらえるシステムじゃん。」**

細かい作法、新しいテクニック、パフォーマンスへのチューニングだったりと、レビュワーからの指摘がめちゃくちゃありがたい。

PRの数に比例して自身の成長を感じていました。

## でも…。
慣れもあいまって、PRに対する「軽視」「勘違い」「不満」を覚えていました。

### 軽視していたこと
「正直、実装が多少雑でもレビュワーの方が気づいてくれる。」そう思っていたのは事実…。
（ほんとすみませんでした）

スピード感をかなり優先していたので、一時期ちょっとしたケアレスミスが山程ありレビュワーを困らせていたこともありました。

### 勘違いしていたこと
- 教育の場！！
- 他の人のコードを吸収できる貴重な場！！

本音ですが、品質担保という視点を無視して自分の成長に都合のいい捉え方をしていたのは事実です。

### 不満に感じていたこと
- かなりこだわって実装したのになんでつっこむの？
- 重箱の隅じゃね…？
- 後ででいいんじゃね？一旦マージしたくない？

レビュワーの真意を捉えきれず、不満を抱えていたこともありました。

## 意識が変わりました。 PRって「報告書」だよね！！
### え、「報告書」なの？
技術面でかなりお世話になっている先輩から以前「PRは報告書と思ってください」と言われたことがありました。

**「単なるコードの提出ではなく、報告書のような役割を果たすもの」** だと思います。
変更点やその理由、影響範囲を詳細に記述することで、ドキュメントとして残せますよね。

### 品質担保
報告書でありながら、品質を保証するための工程管理表の側面を持つとも感じています。

例えば…。
- チーム内で決めているコーディング規約を守れていない状態
- リントのエラーを見過ごしている状態
- SOLID原則に沿っていない状態

この状態を見過ごしたまま、主となるブランチにマージされてしまうってよくないですよね。

チームや開発ルールによって、**重視すること**は異なるかと思いますが、
他エンジニアへの配慮や納品というゴールが待っている以上、品質保証は絶対に必要だと思います。

品質がイマイチな商品を見て、店頭で買う人って稀ですよね。

## なんで急に意識が180度も変わった。
結構ここ数ヶ月で刺激されたイベントがありました。

### フィードバックもらえる環境は当たり前じゃない

やっぱり一番は **フィードバックいただける環境って当たり前じゃない。どんな小さいことでも言ってもらえるのはありがたい** です。

FB は当たり前じゃないです。ちょっとした心理的影響だったりプロジェクトの方針だったりでレビューがないがしろになるケースもあります。
（あまり健全じゃないですが。）

### レビューする側の機会が増えた
- このまとめ方は、簡略かつどんな作業をしたかわかりやすいな
- 仕様を別ドキュメント化しているのは整理されるからいいな

とか、他人のPRを見ることで刺激が増えました。
（なんだかんだ私もレビューをする機会が増えてきたんですよね。）

逆に、読みづらいPRに触れることでNGなパターンを学ぶこともできました。

### 勝手な行動…？
「めんどいし書くほどのことでもないからPRには書いてない。でも実は対応してた。」
これって勝手な行動ですよね。

勝手な行動を取るやつってレッテルを貼られるだけでなく、評価の機会を失うことにも繋がります。
## 決めたこと
この記事を書くにあたって、今までのPRについて振り返ってみました。
### 概要が伝わるタイトルを書く。
新機能なのか、バグ対応なのか、ドキュメント追加なのか、その程度でいいと思います。

概要がわからないPRは報告書としてやばいです。

### 「やったことを報告しない」はありえない。
勝手な行動をしない。小学生でも守れますよね。

もちろんどの粒度で記載するかはプロジェクト次第ですが、「追加対応」等に箇条書きで書くだけでも、あるとないじゃ全然違いますよね。

### PR内での説明で収まらないなら別でドキュメントを作成する
「簡易なリリースノート」って意味でも、ドキュメント化にへの意義があると思います。

### 実装の意図は明確に記載する
「かなりこだわって実装したのになんでつっこむの？」
この不満って、レビュワー側が悪いわけではなく単純に私の説明が不足しているだけですよね。
- 「他の機能との統一性を考慮して汎用的に実装しました。」
- 「〜という理由で局所的な対応が適してると判断してこのアプローチを採用しました。」
- etc…

ひとことあるだけで全然違うと思います。

### PRの起票にそんなに時間をかけない
日報や報告書に、そこまで時間をかけないですよね。

「思ったよりまとまらない」「前提の仕様を説明したい」っていう場合は、ドキュメントを別で用意したほうがいいのでそちらに工数を割いたほうがいいと思います。

### 文章以外でコミュニケーションを取る
出社しているなら意図を対面で話して聞く。
リモートならWeb会議で聞く。

報告書に関することって大事なやり取りだと思います。
文章だけじゃ伝わらないこともあると思いますよね。ショート(10分)でも説明する機会があれば全然違うと思います。

※ もちろん文章だけで済むように起票しておく。というのが理想ですよね。

### まとめ
エンジニアであればPRって避けては通れないですよね。
レビュー内容によっては、渋い報告書になることもあります。
実装は悪くないのに伝え方が悪くてリジェクトされることもあるかもしれません...。

それでも...。
それでも、僕は今日もPRを出し続けます。

---

時系列形式で文章を書く機会があまりないので読みづらかったかもしれません。
ここまで読んできただきありがとうございます。
ZIO Schemaのvalidate機能を使ってみる

# 概要

ZIO Schemaは、スキーマ定義ライブラリです。
本記事では、`Schema#validate` メソッドに焦点を当て、データ検証を行う方法を解説します。

# Schema#validate とは？

`Schema#validate` は、特定のスキーマに対して値を検証し、その結果を `Chunk[ValidationError]` として返すメソッドです。検証は、スキーマに定義された型情報や制約に基づいて行われます。

# サンプルコード

下記の例では、`Person` スキーマに `age` が 18 歳以上であるという制約を設け、`validate` メソッドで検証しています。
有効な値の場合は空の `Chunk` が返されます。

```scala
import zio.*
import zio.schema.*
import zio.schema.validation.*

object Main extends ZIOAppDefault {
  case class Person(name: String, age: Int)

  object Person {
    implicit val schema: Schema[Person] = Schema.CaseClass2[String, Int, Person](
      id0 = TypeId.fromTypeName("Person"),
      field01 = Schema.Field(
        "name",
        Schema[String],
        get0 = _.name,
        set0 = (person, newName) => person.copy(name = newName)
      ),
      field02 = Schema.Field(
        "age",
        Schema[Int],
        get0 = _.age,
        set0 = (person, newAge) => person.copy(age = newAge),
        validation0 = Validation.greaterThan(17)
      ),
      construct0 = (name, age) => Person(name, age)
    )
  }

  val validPerson = Person("Alice", 30)
  val invalidPerson = Person("Bob", 15) // 18歳未満のため無効

  val result1: Chunk[ValidationError] = Person.schema.validate(validPerson)
  val result2: Chunk[ValidationError] = Person.schema.validate(invalidPerson)

  override def run: ZIO[ZIOAppArgs, Any, Any] = Console.printLine(
    (
      Person.schema.validate(validPerson),
      Person.schema.validate(invalidPerson)
    )
  ) // (Chunk(),Chunk(GreaterThan(15,17)))
}
```

# 検証ルールの定義

ZIO Schema は、様々な検証ルール (`Validation`) を提供しています。

* `Validation.minLength(s)`: 文字列長の最小値
* `Validation.maxLength(s)`: 文字列長の最大値
* `Validation.regex(regex)`: 正規表現
* `Validation.greaterThan(n)`: 数値の下限
* `Validation.lessThan(n)`: 数値の上限

これらのルールを組み合わせることで、複雑な検証ルールも表現できます。

# まとめ

`Schema#validate`により、データ検証を簡潔に行うことができました。
ユーザーが入力したものをjsonに変換するものを作ってみた

# 初めに
今回はユーザーがテキストボックスに入力した内容をJsonに変換するプログラムを書いてみました。
# ファイル構成
今回はhtmlファイル一つで行きます。
# コピペ
以下のコードをコピペします:
```html:main.html
<!DOCTYPE html>
<html>
<head>
    <title>文字列をJsonに変換するプログラム（?）</title>
    <style>
        body {
            min-height: 100%;
            display: flex;
            flex-direction: column;
            text-align: center;
        }
        button {
            height: 30px;
            background-color: black;
            color: white;
            border: none;
            margin-top: 10px;
        }
        input[type="text"] {
            height: 30px;
            border: 1px solid black;
            margin-top: 10px;
        } 
        footer {
            width: 100%;
            height: 100px;
            background-color: rgb(97, 97, 97);
            color: white;
            font-weight: 1;
            flex-direction: column;
        }
        button:hover {

            background-color: rgb(90, 90, 90);

        }
        header {
            width: 100%;
            height: 100px;
            background-color: rgb(97, 97, 97);
            color: white;
            font-weight: 1;
            flex-direction: column;
        }
    </style>
</head>
<body>
    <header>
        <h1 style="font-weight: 1;">文字列をJSONに変換するプログラム</h1>
    </header>
    <main>
        <p>ここに文字列を入力</p>
        <div id="properties">
            <div id="property0">
                プロパティ名:<input type="text" id="name0">設定:<input type="text" id="value0">
            </div>
        </div>
        <button onclick="removeUnder()">一番下のプロパティを削除</button>
        <br><button onclick="addTop()">一番下にプロパティを追加</button>
        <br><button onclick="convertToJson()">JSONに変換</button>
        <div id="jsonResult"></div>
    </main>
    <footer>
        <p>©2024 </p>
    </footer>
    <script>
function addTop() {
  properties.insertAdjacentHTML('beforeend',
    '<div>プロパティ名:<input type="text">設定:<input type="text"></div>');
}

function removeUnder() {
  properties.children.length > 1 && properties.lastElementChild.remove();
}

function convertToJson() {
  const names  = [...properties.querySelectorAll('input:nth-child(odd)')] .map(v => v.value.trim());
  const values = [...properties.querySelectorAll('input:nth-child(even)')].map(v => v.value.trim());
  const jsonObject = {};
  names.forEach((v, i) => v && (jsonObject[v] = values[i]));
  jsonResult.textContent = JSON.stringify(jsonObject);
}

    </script>
</body>
</html>
```
※修正をGPTにやってもらいました。
# 仕組み
1,ユーザーがプロパティ名とその設定をテキストボックスに入力します
2,Jsonに変換を押すとconvertJson()が実行されます
3,convertJsonで、ユーザーが入力したすべての情報をjsonObjectに格納して、stringfyでjsonに変換しています。
# 最後に
みなさん、いかがだったでしょうか、今回はユーザーが入力したものをJsonに変換するというプログラムを書きました。
それではまたお会いしましょう！
ZIO Schema の defaultValueについて

# 概要

ZIO Schemaは、スキーマ定義ライブラリです。
この記事では、ZIO Schemaの`defaultValue`という機能について、サンプルコードを交えて解説します。

# defaultValue とは？

`defaultValue: Either[String, A]` は、`Schema[A]` に対してデフォルト値を計算して返すメソッドです。

戻り値は Either 型で、

* **Right(a):** デフォルト値 `a` (型 `A`) が正常に計算された場合
* **Left(error):** デフォルト値の計算に失敗した場合、エラーメッセージが返されます

# 標準的な型のデフォルト値

ZIO Schema は、標準的な型（`String`、`Int`、`Boolean`、`LocalDateTime`、`UUID` など）に対して、デフォルト値を自動的に計算します。

* `String`: 空文字列 (`""`)
* `Int`: 0
* `Boolean`: false
* `Option[A]`: None
* その他の型: その型のゼロ値 (例えば、`List` なら空リスト)

# サンプルコード

`DeriveSchema.gen`でスキーマを自動導出し、
`schema.defaultValue`でデフォルト値を生成しています。

```scala
import zio.{Console, ZIO, ZIOAppArgs, ZIOAppDefault}

import java.util.UUID

object Main extends ZIOAppDefault {
  import zio.schema._
  case class Person(id: UUID, name: String, age: Int, isStudent: Boolean = false)
  implicit val schema: Schema[Person] = DeriveSchema.gen[Person]

  val defaultPerson = schema.defaultValue.toOption

  override def run: ZIO[ZIOAppArgs, Any, Any] =
    Console.printLine(schema.defaultValue) // Right(Person(df02ab42-f649-4802-a2e6-1e7309568b1c,,0,false))
}
```

# まとめ

ZIO Schema の `defaultValue` は、データの初期化や欠損値の補完など、様々な場面で役立つ便利な機能です。デフォルト値を適切に活用することで、より安全で信頼性の高いアプリケーションを開発できます。
【未完】画像アップロードするfile_fieldのCSSを変えて、選択したファイル名を表示させたい

# はじめに
Rails勉強中です。
Active Storageで画像のアップロード機能を導入したけど、デフォルトのボタンのデザインから変更するために一苦労、さらに選択した画像のファイル名を表示するために苦戦している最中です。

ここまでの経緯を一応残しておこうかなと思います。

# Active Storageの導入
Acrive Strageの実装は、こちらの記事を参考にしました。
https://qiita.com/trafford_777/items/339ac0416b1505fa0fc6
https://prograshi.com/framework/rails/active-storage/#google_vignette

Active Strage導入時点のfile_fieldのデザインでは、ファイル名は表示されているようです。

# file_fieldのデザイン変更
デザインの変更は、こちらの記事を参考にしました。
https://qiita.com/Yukina_28/items/4a8332354f6cb7c7a6f6

file_field自体のCSSは変更できないので、file_fieldにlabelを追加して、file_field自体は非表示にし、labelにCSSを当てて好きなデザインに変更していく方法です。

この際、file_fieldを非表示にしてしまうためか、ファイル名の表示がなくなってしまいました。

# アップロードしたファイル名を表示させたい
こちら以降は実際の実装ができていません。

参考になりそうな記事として下記を見つけました。
https://qiita.com/hirogw/items/b4937dbb0ea5f0b60085
ファイル名の表示を取り戻すためには、JavaScriptを使用して実装するようです。
勉強不足でJavaScriptが扱いきれず、こちらでモタモタしています。

# おわりに
未完成な投稿で失礼いたしました。
ここまで読んでいただき、ありがとうございました。

未来の自分、無事実装しておくれ〜
nuxt-i18nとは

## 🏆 ゴール 🏆
nuxt-i18nについて簡単な理解と使用方法について知る

:::note info
使用方法については動くかの検証をしていないので本ドキュメントでは実装における大体知識が理解できれば良い
:::

## 前提

https://qiita.com/nekomanju/items/82c6cf2d61b5b94095d8

Vue i18nの理解ができている

## nuxt-i18nってなに？

nuxt-i18nは、**Nuxt.js用のi18nのライブラリ**です。

Vue.js用のi18nライブラリであるVue i18nにいくつかの機能が追加され、Nuxt.jsでの使用に特化しています

## vue i18n と nuxt-i18n どっち使えばいいの？

> Vue i18nにいくつかの機能が追加され

のようにVue i18nをもとにNuxt.jsで作られているので、Nuxtであれば ```nuxt-i18n``` の選択肢で良さそう

## 言語ファイルを作成
ここでは、langディレクトリにJSON形式で英語と日本語の言語ファイルを作成します。

```json:lang/ja.json
{
  "HELLO_WORLD": "こんにちは、世界"
}
```

```json:lang/en.json
{
  "HELLO_WORLD": "Hello World"
}
```

## nuxt-i18nの設定ファイルを作成
nuxt-i18nの設定をオブジェクトとして記述します。
nuxt.config.jsファイルに直接書いてもいいのですが、それなりに長いので別ファイルに切り出します。

nuxt-i18nには多くの設定項目がありますが、ここでは最小限のもののみを指定しています。

- ```locales```：使用する言語のリスト
  - ```code```：URLなどに使用される識別子
  - ```iso```：ISO形式の言語コード（詳細は後述）
  - ```file```：言語ファイルのファイル名
- ```defaultLocale```：デフォルトの言語
- ```lazy```：言語ファイルを使用してレイジーロードをするか
- ```langDir```：言語ファイルのディレクトリ

## ISO形式の言語コード
ISO形式の言語コードは、以下のいずれかの形式で指定する必要があります。

- [ISO 639-1](https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7)のコード（言語コード）
    - ```jp```
    - ```en```
- ISO 639-1のコード（言語コード）と[ISO 3166-1 alpha-2](https://ja.wikipedia.org/wiki/ISO_3166-1)のコード（国名コード）をハイフンで結合
    - ```en-US```
    - ```ja-JP```

## プロジェクトにモジュールを追加
```nuxt.config.js```ファイルの```modules```に、```nuxt-i18n```とオプションオブジェクトを配列として追加します。

```js:nuxt.config.js
import i18n from './nuxt-i18n.config'

export default {
  modules: [
    ['nuxt-i18n', i18n]
  ]
}
```

ここでは、さきほど作成した設定ファイルをインポートしてオプションとして使用しています。
```nuxt.config.js```ファイルが肥大化するのを許容できるのであれば、以下のようにリテラルで書いてもいいでしょう。

```js:nuxt.config.js
export default {
  modules: [
    ['nuxt-i18n', {
      locales: [
        {
          code: 'en',
          iso: 'en',
          file: 'en.json'
        },
        {
          code: 'ja',
          iso: 'ja',
          file: 'ja.json'
        }
      ],
      defaultLocale: 'en',
      lazy: true,
      langDir: 'lang/'
    }]
  ]
}
```

## コンポーネントで使用
nuxt-i18nの言語ファイルで定義したリソースは、コンポーネント内では```$t(キー)```という形式で使用します。

```js:pages/index.vue
<template>
  <div>
    <span>{{ $t('HELLO_WORLD') }}</span>
  </div>
</template>
```

こうすることで、表示中の言語に対応する文字列が表示されます。

## 引用

https://qiita.com/munieru_jp/items/d7e9f98b5ab5960e7a93
Microsoft365の管理者がユーザーのメールを確認する

## MS365のメールはテナント管理者から見えるのか？

委任ユーザーにするとか他の手はありますが、
複数ユーザーを対象にしようとすると手間が多い。
委任設定だとちょっとだけ確認するみたいな時には使いづらいし、それ用のメールが使えるユーザーを用意しなくてはいけない。

## 管理者がユーザーのメールボックスにアクセスするには

Microsoft Graph APIで見られます。
ただしちょっと面倒。

Entra管理センターのアプリケーション、APIのアクセス許可に「Mail.ReadWrite:Read and write access to user mail」があります。
これ入れとけば見られる？

とはいきません。
Exchange OnlineとEntra管理センター(Microsoft Graph API)の連携は完全ではないようです。

Exchange Onlineでの設定も必要です。

https://learn.microsoft.com/ja-jp/graph/auth-limit-mailbox-access

この設定、Microsoft Graph APIでメール関連ではいろいろ使うことになるので忘れずに。
さらにここに書いてある通り、反映に時間がかかる。
この設定はもちろん、対象グループの所属を変えても同様に反映に時間がかかるので
上手くいかないな？と思っても結構待ってから試してみた方がいい。


あとはAPIのmessagesを叩けば表示される。

https://learn.microsoft.com/ja-jp/graph/api/user-list-messages?view=graph-rest-1.0&tabs=http
actix-webでweb制作を行う

## 初めに

![rust002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/7a442d69-a3b5-c0f4-af0d-8487382589ee.png)

 最近、巷で人気となっている言語の1つに「Rust」があります。

 「Rust」は「C」に置き換わる事が期待されている低レイヤー言語となります。

そんな 「Rust」でweb制作してみたいと思った事はございませんか？

そこで今回は「actix-web」でweb制作を行う方法についてご紹介させていただきます。

## フレームワーク

![rust001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/616ebec1-b3d3-aabe-0ffa-fc6adb28bec3.png)

Rustには「Rocket」や「axum」、「actix-web」等の有名なweb開発フレームワークがあります。

今回は最も有名と言われている「actix-web」を使用しweb制作を行います。

下記「actix-web」の公式サイトとなります。

https://actix.rs/

## Rustのインストール

「Rust」でwebを作るぞ!と言ったものテスト環境に言語がインストールされておりませんでした。

下記コマンドを使用してRustのインストールを実行します。

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

インストールが完了したら「cargo」のパスを通します。

詳しくは下記をご確認よろしくお願い致します。

https://r1999.com/2024/05/10/linux%e3%81%a7rust%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e3%82%92%e8%a1%8c%e3%81%86%e6%96%b9%e6%b3%95/


## 新しいプロジェクトの作成

始めに「cargo」を使用して新しいプロジェクトを作成します。

今回は例として「web-test」として作成致しました。

下記作成コマンドとなります。

```
cargo new web-test
```

上記作成すると下記のメッセージが表示されます。

```
Creating binary (application) `web-test` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
```

## 依存関係の設定

次に先程作成したプロジェクトディレクトリに移動します。

```
cd web-test
```

「Cargo.toml」ファイルにwebフレームワークの依存関係を記述します。

今回は下記の様に記述しました。

```
[package]
name = "web-test"
version = "0.1.0"
edition = "2021"

[dependencies]
actix-web = "4"
```

## プログラムの作成

続いて「src」配下の「main.rs」にHello World!のプログラムを追記します。

下記コマンドで移動します。

```
cd src
```

下記コマンドで編集を行います。

```
vi main.rs
```

今回は公式サイトに記載された下記のコードを貼り付けました。

```rust
use actix_web::{get, web, App, HttpServer, Responder};

#[get("/")]
async fn index() -> impl Responder {
    "Hello, World!"
}

#[get("/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
    format!("Hello {}!", &name)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(index).service(hello))
        .bind(("IPアドレス", 8080))?
        .run()
        .await
}
```

作成したコードは「argo run」を使用し実行する事が出来ます。

```
cargo run
```

上記実行しました所、gccコンパイラがインストールされてい為、エラーとなりました。

```rust
error: linker `cc` not found
  |
  = note: No such file or directory (os error 2)

error: could not compile `libc` (build script) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
```

下記コマンドを使用し「gccコンパイラ」のインストールを行います。

```
dnf install gcc
```

上記インストール後再び、「argo run」を使用し実行します。

```
cargo run
```

## 動作確認

![rust003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/e1d8938f-21bc-6e6f-d7e6-2a2fa43dcf13.png)

最後に指定したIPアドレスをweb経由でアクセスします。

上記画像の様に「Hello, World!」が表示されていれば成功です。

※ファイヤーウォールで指定したポートを許可する必要があります。
相談がしやすい内部定例会の運営方法

## はじめに

◆この記事は何？
相談がしやすくなるような内部定例会の進め方を紹介する記事です。

「内部定例会でメンバーから相談を引き出せていない」という課題の解決に繋がれば幸いです。

◆対象は？
- 定例会の運営に悩んでいる方々
- メンバーからの相談が少なくて困っているリーダー

## 先に結論
- 課題ではなく**困りごと**を聞く
- **書いてもらう**
- 相談・議論のアクションを事前に設定しておく

## 内部定例会のアジェンダ

内部定例会のアジェンダを以下のように設定することで、相談を引き出しやすくかつ効率的に進行できます。

1. アジェンダ整理
1. 進捗共有
    1. 昨日やったこと
    1. 困ったこと
    1. 今日やること
    1. 不安なこと/懸念点
1. 情報共有
1. 相談したいこと・議論したいこと

まず、「アジェンダ整理」では、その日の定例会の流れを確認します。
大きく①進捗共有②情報共有③相談したいこと・議論したいことの三つに分けることで効率よく進行できます。

相談や議論には時間がかかる可能性があるため、進捗共有や情報共有の後に行います。必要に応じて、後半のセクションでは参加メンバーを限定することも可能です。

## 進捗共有では困りごとを聞く

「課題は何か？」と直接聞いても、答えにくいことがあります。課題を自覚し言語化するのは難しいためです。そこで、「困ったこと」や「不安なこと/懸念点」を聞くことをおすすめします。

メンバーの困りごとがチームの課題につながるため、結果的に重要な課題を引き出せます。小さな困りごとでも大切にし、改善していくことが重要です。

例えば、「必要なドキュメントがどこにあるか分からなかった」という困りごとから、情報共有の仕組みを改善するきっかけになるかもしれません。

## 定例会の進行方法

内部定例会では、**口頭だけでなく書くこと**が重要です。

以下の手順で進めることをおすすめします：
1. 上記のアジェンダをテンプレート化する
1. チームメンバー全員が編集できるドキュメントを用意する
1. 定例会の開始前に、全員（リーダーも含む）が内容を記入する

書くことには以下のメリットがあります
- 書いている過程で新たな困りごとに気づく
- 他のメンバーの記入内容から、自分の相談したいことを思いつく

## おわりに

この記事では、相談がしやすくなるような内部定例の運営方法を紹介しました。

皆さんのチームの内部定例会の改善に繋がれば幸いです。