OmniAICreator/Qiita-1.07M huggingface dataset:
短縮リンク作成サービスを公開しました！

## 概要
2023年末頃に、短縮リンク作成サービスを開発・リリースしました。きっかけとしては、大手の短縮リンクサービス「bit.ly」をはじめ、類似のサービスにて改悪が立て続けに起きていたことです。もっと便利で簡潔なものが作れるのではと思い、開発してみました。
開発したサービスは以下のものになります。
[https://nlia.jp](N-LIA)

## 技術選定
開発するにあたり、どのような技術(ここでは言語など)を使用して開発するかの選定を行いました。N-LIA開発開始時点での、私の開発経験は以下のような感じです。
- PHP: 3年 (Laravelなどのフレームワークは未経験)
- React: 半年
- MySQL/MariaDB: 3年

短縮リンクサービスの開発を始めるにあたり、DB設計などを考えてみると意外と簡単そうだと感じました。そこで、今回のテーマは「未経験のモダンな技術を使って開発してみる」ということにしました。
ということで、今回採用した技術などは以下の通りです。
**フロントエンド**
- 言語: Javascript(Next.js)
- サーバー: Vercel

**バックエンド**
- 言語: PHP(Laravel)
- サーバー: XServer

## 実装について
実装については、実際のコードを紹介しながら別途記事を作成する予定です。ここではどのような構成かを書きます。
リンクを作成する場合
1. ユーザーがフロントエンドのページを表示
2. フォームに入力後、「リンクを作成」ボタンを押下
3. ボタンが押下されたらreact-hook-formを使用してバリデーションチェック
4. 問題なければaxiosでLaravelのAPIに渡す
5. 渡された情報をもとにMariaDBに登録

リンクにアクセスされた場合
1. 注意画面を表示
2. 登録されたリンク(アクセス先)を取得
3. 注意画面のボタンにアクセス先を設定

詳細の記事は、来週以降に順次公開予定ですので、フォローして気長にお待ちいただけると幸いです。

## 名前について
公開後にN-LIAの名前の由来を聞かれることがあるので。一応、適当に考えた名前です。短縮リンクは、短くなければ意味がありません。また、サイトの信頼性を挙げたいと考え、末尾は「jp」になることが前提でした。また、.の前は最大でも4文字程度に抑えたいと思っていました。4文字でたまたま取得できた文字列が、nliaでした。(入れてみたら取得できたので他の文字列でもおそらく問題ないです)。すべて大文字にして「N」と「LIA」の間に「-」を入れたらかっこよさそうだなと思い、「N-LIA」にしました。一応、読み方としては「エヌリア」です。

## まとめ
今回初投稿なので、ちょっと薄い内容ですが、技術的な記事を3記事程度続けて公開予定ですのでお手柔らかにお願いします。
今回のメインは、使用している技術構成などで、実はモダンな言語が使われているということです。

ちなみにQiitaを始めようと思ったきっかけは、前職の~~パワハラ~~上司に「文章力がない。技術記事とか読んでるの？いや、その文章力の無さは読んでないってことなのよ」という軽いパワハラ的なものを受け、記事を書けば文章力が上がるのではと思ったところからです。

今回の記事は、以上になります。今後ともよろしくお願いいたします。
mvコマンド

## mvコマンドとは
mvコマンドとは、ファイルの移動、ファイル名の変更を行うためのコマンドです。
```ubuntu:usage.ub
mv [option] [移動元ファイルパス] [移動先ファイルパス]
mv [option] [変更前ファイル名] [変更後ファイル名]
```
では、実際に使用例を以下に示します。
まずは、ファイル移動から
```ubuntu:example.ub
>ls
dir1 dir2 file1 file2 file3 file3
>mv file3 dir2
>ls ->現在のファイルにfile3がないことを確認
dir1 dir2 file1 file2
>ls dir2 ->dir2内にfile3が移動したことを確認
file3
```
次に、ファイル名変更
```ubuntu:example2.ub
>mv file2 filename
>ls ->ファイル名がfilenameに変更されたことを確認
dir1 dir2 file1 filename
```
##  代表的なoption
| option | 意味 |
|:-:|:-:|
|-i   |移動先に同名ファイルがあれば、上書きする前に確認する   |
|-f   |強制的に処理を実行し、移動先に同名ファイルがあっても上書きする   |
Reactでチャットアプリなどでメッセージが追加されるたびに下にスクロールさせる  @yukilulu0229

```app.tsx
"use client";


import React, { useEffect, useRef, useState } from "react";
const Chat = () => {
  const scrollDiv = useRef<HTMLDivElement>(null);

  useEffect(() => {
    if (scrollDiv.current) {
      const element = scrollDiv.current;
      element.scrollTo({
        top: element.scrollHeight,
        behavior: "smooth",
      });
    }
  }, [messages]);
  
  return (
    <div className="bg-gray-500 h-full p-4 flex flex-col">
      <div className="flex-grow overflow-y-auto mb-4" ref={scrollDiv}>
        {messages.map((message, index) => (
          <div
            key={index}
            className={message.sender === "user" ? "text-right" : "text-left"}
          >
            <div
              className={
                message.sender === "user"
                  ? "bg-blue-500 inline-block rounded px-4 py-2 mb-2"
                  : "bg-green-500 inline-block rounded px-4 py-2 mb-2"
              }
            >
              <p className="text-white font-medium">{message.text}</p>
            </div>
          </div>
        ))}
        {isLoading && <TailSpin />}
      </div>
  );
};

export default Chat;

```

```
const scrollDiv = useRef<HTMLDivElement>(null);
```

useRefを使う

https://qiita.com/seira/items/0e6a2d835f1afb50544d


```
 <div className="flex-grow overflow-y-auto mb-4" ref={scrollDiv}>
```

refで取得する

```
 useEffect(() => {
    if (scrollDiv.current) {
      const element = scrollDiv.current;
      element.scrollTo({
        top: element.scrollHeight,
        behavior: "smooth",
      });
    }
  }, [messages]);
```
messagesに変化があるごとにスクロールさせる
CpawCTF Q.7 [Reversing] Can you execute ?

## CpawCTF Q.7 [Reversing] Can you execute ?
exec_meをダウンロードしてUbuntuで解析していきましょう。
fileコマンドでexec_meがどのようなファイルなのかを調べます。
```ubuntu:file.ub
>file exec_me
exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
```
実行可能とわかるので実行してみましょう。
```ubuntu:exec.ub
>./exec_me
-bash: ./exec_me: Permission denied
```
実行権限がないので、与えましょう。
```ubuntu:exec.ub
>sudo chmod 777 exec_me
```
もう一度実行してみます。
```ubuntu:exec.ub
 >./exec_me
 cpaw{Do_you_know_ELF_file?}
```
答えが出ました。

## 参考文献
file->https://qiita.com/Uma_adn/items/e0a506c7df141c6c7a36
chmod->https://qiita.com/Uma_adn/items/7ddad0f2f7ddbb5d07a4
chmod

## chmodコマンドとは
chmodコマンドとは、ファイルやディレクトリにアクセスできるかどうかはファイルのpermissionによって決まるため、このpermissionを変更するためのコマンドです。
使い方
```terminal:usage.ub
chmod [option] モード file1 file2 ...
```
| option| 意味 |
|:-:|:-:|
| -R | ファイルとディレクトリを再帰的に変更する  |
| -V |処理した内容を出力   |
| -C | 変更が行われた場合のみ処理内容を出力  |
| -f |  ほとんどのエラーメッセージを出力しない |

### permission(権限)について
permissionとは、ファイルやディレクトリのpermissionは'r(読みだし可能)','w(書き込み可能)','x(実行可能)'の三つのアルファベットで表します。
permissionを与える対象は、「所有者」、「所有グループ」、「それ以外」の三つにあ¥分かれている。
'ls -l'コマンドで表示される内容の先頭の文字はファイルの種類で、ディレクトリは'd',シンボリックは'l',通常のファイルは'-'が表示されます。
通常のファイルであれば'-rw-rw-r--'が表示されます。
| permission | 数値 | 意味 |
|:-:|:-:|:-:|
|r   |4   |読みだし可能   |
|w   |2   |書き込み可能   |
|x   |1   |実行可能   |
|-   |-   |許可なし   |

### permissionの変更
権限を追加 ->'+'
権限を禁止 ->'-'
値を指定   ->'='

```terminal:example.ub
chmod +x myscript #myscriptファイルにxを追加

chmod =rx myscript #myscriptファイルにrxだけを設定、もしもともとwがあったら削除

chmod 755 myscript #myscriptファイルのpermissionを755(rwx r-x r-x)に設定
```
## permissionを与える対象を指定
permissionをを変更する対象を限定したい場合は、所有者なら'u'、所有グループなら'g'、それ以外なら'o'を組み合わせて指定、すべてのユーザーを対象とするなら'c'

```terminal:example.ub
chmod u+x myscript #所有者だけを対象にmyscriptファイルにxを追加

chmod o-rwx myscript #その他だけを対象にmyscriptファイルにrwxを禁止
```
fileコマンド

## fileコマンドとは
fileコマンドとは、file形式を調べるためのコマンドです。
```ubuntu:usage.ub
file [option] file名
```
| option | 意味 |
|:-:|:-:|
|-f   |検証するファイルの名前をリストファイルから読み込む   |
|-L   |シンボリックリンクの参照先を調べる   |
|-z   |圧縮ファイルの中のものを検証する   |
|-b   |出力行の最初にファイル名を表示しない   |
|-N   |出力の整列するためのファイル名への空白の追加を行わない   |
CpawCTF Q6.[Crypto] Classical Cipher

## Q6.[Crypto] Classical Cipher
暗号の中で最も代表的を言ってもいい暗号の一つであるシーザー暗号の問題です。
シーザー暗号とはアルファベットをそれぞれ決まった数だけ後ろか前のものを書きます。
```text:problem.txt
暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
```
https://dencode.com/ja/cipher/caesar
このサイトで解読できます。
また、Pythonで解読することもできます。
```python:solve.py
text = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}"

for i in range(1, 26):
    ans = ""
    for char in text:
        if char.isalpha():
            ascii_offset = ord('a') if char.islower() else ord('A')
            ans += chr((ord(char) - ascii_offset - i) % 26 + ascii_offset)
        else:
            ans += char
    print(f"Shift {i}: {ans}")
```
実行結果は次のようになります。
![スクリーンショット 2024-02-12 134400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685661/5d47bc77-29fe-a34d-f2cb-c02864c8d822.png)
これのShift 3が答えです。

## 参考文献
isalpha()->https://qiita.com/furiirakun/items/c763d4655ae7d7665896
ord()->https://qiita.com/furiirakun/items/5b7397766c0fca04b4fd
islower()->https://qiita.com/furiirakun/items/071c9b07214302c18300
GitHub->https://github.com/furiirakun/onigiri/blob/main/caesar.py
カプセル化、アクセス修飾子

## カプセル化とは
カプセル化とは、クラス内のフィールドやメソッドに対するアクセスを制限するJavaの仕組み。
例えば、個人情報を扱うクラスがあり、このフィールドが外部から書き変えれたり情報を保護できないプログラムは危険。
カプセル化はこのような外部からのアクセスからオブジェクトを守る役目がある。




## アクセス修飾子
カプセル化では、アクセス修飾子のprivateとpublicを使いアクセス制限を行うため、下記の設定を覚えておく。
| アクセス修飾子 | 機能 |
|:-:|:-:|
|  private | 自分のクラス内でのみアクセス可能  |
| アクセス修飾子なし（package private）  |  同じパッケージ内であればアクセス可能 |
| protected  |  継承した子クラス及び自分と同じパッケージからアクセスできる |
|  public |  自分のクラス以外からでもアクセス可能 |

```Java
package text.section_16;

public class Capsule_Tanaka1 {
	
	// id　フィールド宣言　アクセス修飾子private
	private int id = 5;
	
	// コンストラクタ
	Capsule_Tanaka1(){	
	}
	
	//出力するメソッド
	public void output(){
		
		System.out.println("idは" + this.id);
	}
}
```
idフィールドは`private int id = 5;`となっていて、カプセル化されています。
一方で出力メソッドでは`public void output(){`となっており、これは外部からのアクセスのみ許可していることになり安全なクラスと言える。
こちらのクラスに対して下記のコードを実行。
![スクリーンショット 2024-02-12 19.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/eb149589-e1d1-60d9-b58d-002098f03da9.png)
実行結果は、出力メソッドが`public`なので下記の通り表示される。
![スクリーンショット 2024-02-12 19.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/f81ef271-d88e-10ef-278e-54cf6b97ff68.png)

試しに、出力メソッドを`plivate`に変更したら実行結果はエラーになる。＝外部からのアクセスも禁止になる。
```java
// 出力するメソッドのアクセス修飾子をprivateに変更
//出力するメソッド
	private void output(){
		
		System.out.println("idは" + this.id);
	}
 ```

![スクリーンショット 2024-02-12 20.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/acefae52-1ab7-5f1b-3803-e47904ef79dd.png)

## ゲッター
ゲッターによりpublicなメソッドを通して、他クラスのprivateなフィールドの値を取得できる。
```java
// ゲッターの書き方
public 戻り値の型 ゲッターの名前(){
   return this.フィールド変数名;
}
```
先ほどの出力メソッドを消去して下記のゲッターに書き換える。
```Java
public int getId(){
  return this.id;
  }
```
そして一方のクラス呼び出し側の方も、下記のように変更。
![スクリーンショット 2024-02-12 21.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/00c3b850-c01d-df71-9242-590a5ceedf29.png)
実行結果
![スクリーンショット 2024-02-12 21.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/f96ac595-a8a2-1286-4032-44f8970f6a18.png)
(これは、先ほどのPublic voidメソッドとの使い分けはどういうところで判断するのかな？これに関して参考になった[記事](https://computer.sarujincanon.com/2022/03/19/javasettergetter/))
>ではsetterを使うメリットは何でしょう？
代表的なものを2つ上げます

>読取/書込専用にできる
コードチェックができる

publicのメソッドを使用した時と同様、他クラスからprivateなクラスの値を参照できた。

## セッター
セッターは、privateなフィールドの値を編集できるメソッドをpublicで定義。
```java
// セッターの書き方
public void セッターの名前(編集するフィールドの型 任意の引数名){
   this.フィールド変数名 = 任意の引数名
}
```
ゲッターの下に追記
![スクリーンショット 2024-02-12 23.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/99acc053-cc02-0eb4-4c6e-d0b39c24408d.png)
そして、クラス呼び出し側のファイルも下記のように編集。
![スクリーンショット 2024-02-13 0.06.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/681e8669-af1a-d740-08b6-868e0b67035c.png)
実行結果は、idがきちんと、setterで指定した値の7に変わっている。![スクリーンショット 2024-02-13 0.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/5c1f98fb-e68e-309b-9288-033f31fd9c5c.png)
getter/setterはセットで覚えておこう。
【Rails】form_tagとは

# form_tagとは
`form_tag`は、HTMLのフォーム要素を生成するためのヘルパーメソッドの1つです。このヘルパーメソッドは、フォームを手動で構築する必要がある場合に使用されます。特に、モデルと関連付けられていないフォームを作成する場合や、フォームが複雑な場合に便利です。

`form_tag`は、HTMLの`<form>`要素を生成します。このメソッドは以下のように使用されます。
```rb
<%= form_tag('/search', method: 'get') do %>
  <%= text_field_tag(:query) %>
  <%= submit_tag("Search") %>
<% end %>
```
上記の例では、`form_tag`ヘルパーメソッドが`/search`に対するGETリクエストを行うフォームを生成します。フォーム内には、`text_field_tag`を使用して検索クエリを入力するためのテキストフィールドが含まれています。また、`submit_tag`を使用してフォームを送信するためのサブミットボタンが含まれています。

`form_tag`は他にもオプションを受け付けます。例えば、`method`オプションを使用してフォームのHTTPメソッドを指定することができます（デフォルトはPOST）。また、htmlオプションを使用してフォームに任意のHTML属性を追加することもできます。

`form_tag`はRailsのビューヘルパーの1つであり、Railsのフォームを生成するための様々なヘルパーメソッドの中で、特に手動でフォームを構築する場合に使用されます。
【Next.js】Imageコンポーネントの画像が表示できない場合の処理を記述する方法

以下のように記述することで画像の表示に失敗した際に実行する処理を記述できます。

```js
import Image from 'next/image'
 
export default function Page() {
  return (
    <Image
      src="/profile.png"
      width={500}
      height={500}
      alt="Picture of the author"
      onError={() => console.log("画像が表示できませんでした。")}
    />
  )
}
```
【Rails】Strong Parametersとは

# Strong Parametersとは
Strong Parameters（ストロングパラメータ）は、Railsアプリケーションで安全にリクエストパラメータを扱うための仕組みです。これは、マスアサインメント脆弱性（Mass Assignment Vulnerability）を防ぐために導入されました。

マスアサインメント脆弱性は、フォームから送信されるパラメータを使用して、意図しない属性の更新や作成を許可する可能性があるセキュリティ上の問題です。Strong Parametersを使用することで、コントローラーで受け取ったリクエストパラメータから明示的に許可されたパラメータのみを取り出し、使用することができます。

Strong Parametersを使用するには、ストロングパラメータを許可するためのホワイトリストを定義する必要があります。通常、コントローラーのプライベートメソッド内でこれを行います。

# 使用方法
例えば、`create`アクションで`User`モデルに対してパラメータを許可する場合は、以下のようにします。
```rb
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      # 保存が成功した場合の処理
    else
      # 保存が失敗した場合の処理
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end
```
上記の例では、`user_params`メソッド内で`params.require(:user).permit(...)`という形式で、`user`というキーのハッシュ内の特定のパラメータを許可しています。この場合、`:name`、`:email`、`:password`、`:password_confirmation`のみが許可され、他のパラメータは無視されます。

Strong Parametersを使用することで、リクエストからの不正なパラメータの送信を防ぎ、セキュリティを強化することができます。
SQLBuilderの仕様を考える　INSERT仕様検討編

# 目的
GolangのSQLBuilerを作ってみたくて、仕様を考える。
今回はINSERT文の仕様を考えるが、SELECT+INSERTまで考えると複雑になるので
一旦保留にする

# 目指す形
ここではusersというTableに対応したUserというTableモデル構造体がある場合とする。
宣言としては、
```
CREATE TABLE users (
  id int,
  name varchar(10)
)

CREATE TABLE tokens (
  id int,
  user_id int REFERENCES users.id,
  token varchar(10)
)
```
を想定する

## Insert

パッケージ名は仮でpkとして

```go
pk.Insert().Into(pk.Table("users")).Value(1, "test")

// INSERT INTO users VALUES(1, 'test')
```

とすることを考えている。

カラムを限定する場合は

```go
pk.Insert("id").Into(pk.Table("users")).Value(1)

// INSERT INTO users(id) VALUES(1)
```

## バルクインサートの実現に向けて
バルクインサートのためにValuesを何で受け取るべきかを考える。
現在、モデルを定義していないので構造体では難しい問題がある。
またSliceで受け取る場合もデータ型の問題でユーザに難しい作成を強いることになる。

#### 案１
Valueメソッドを連結するパターンとして
```go
pk.Insert("id").Into(pk.Table("users")).Value(1).Value(2)

// INSERT INTO users(id) VALUES(1), (2)
```

をあげられる。ユーザにfor文を強制してしまうが手法の１つしてはありだと考えているので
一応採用する。

#### 案２（保留案）
pk.TableのSliceで受け取るパターン
手間は必要になるが、案１との違いが重要になる。

まずはテーブルに対してのカラム宣言
```go
user := pk.Table("users")

user.SetValue("id", 1)
user.SetValue("name", "test")
```

ここから

```go
pk.Insert().Into(pk.Table("users")).Value(user)

// INSERT INTO users VALUES(1, 'name')
```

といった感じ・・・・
使わない気がするな。
なぜなら、サービスでの利用を考えたときになにかしら構造体でもっていることが一般的。
これはその構造体からの変換処理を求めているので、
こんな面倒なことをせずに案１を使えばいいだけな感覚。
それだったら構造体にタグ設定したほうが扱いが簡単なので、
案２に関しては現時点では保留とする。モデルの対応自体を保留にしている状況でここで定義してしまうと全体適応時に弊害になる懸念があるため。
【Rails】パスワードのハッシュ化

# パスワードのハッシュ化とは
パスワードのハッシュ化は、セキュリティ上の重要な手法であり、ユーザーのパスワードをデータベースに保存する際に平文ではなくハッシュ化された形式で保存することを意味します。これにより、パスワードがデータベース内に暗号化され、万が一データベースが漏洩しても、実際のパスワードを知ることはできなくなります。

# 実装手順
以下は、提供された用語を使用してパスワードのハッシュ化を実装する手順です。

1\. **gem bcrypt**
`bcrypt`は、パスワードの安全なハッシュ化を行うためのライブラリであり、Ruby on Railsのプロジェクトで使用されることがあります。Gemfileに`bcrypt`を追加して、`bundle install`コマンドを実行してインストールします。

Gemfile:
```rb
gem 'bcrypt', '~> 3.1.7'
```
ターミナル:
```
$ bundle install
```

2\. **password_digestカラム**
ユーザーのパスワードをハッシュ化して保存するために、データベースのテーブルに`password_digest`という名前のカラムを追加します。このカラムには、ハッシュ化されたパスワードが保存されます。

例えば、`User`モデルに`password_digest`カラムを追加する場合は、マイグレーションファイルを作成し、`password_digest`カラムを追加します。
ターミナル:
```
$ rails generate migration add_password_digest_to_users password_digest:string
```
生成されたマイグレーションファイル:
```rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :password_digest, :string
  end
end
```
ターミナル:
```
$ rails db:migrate
```
3\. **has_secure_password**
`has_secure_password`は、Active Recordモデルでパスワードのハッシュ化と認証を行うためのメソッドです。これを使用すると、モデル内でパスワードの検証とセットアップが簡単に行えます。
例えば、`User`モデルで`has_secure_password`を使用する場合は、以下のように記述します。
```rb
class User < ApplicationRecord
  has_secure_password
end
```
4\. **remove_column**
`remove_column`は、データベースのテーブルからカラムを削除するためのマイグレーションメソッドです。ハッシュ化前のパスワードを格納していた`password`カラムなどを削除する場合に使用されます。

例えば、`User`モデルから`password`カラムを削除する場合は、以下のようにマイグレーションファイルを作成します。
ターミナル:
```
$ rails generate migration remove_password_from_users password:string
```
生成されたマイグレーションファイル:
```rb
class RemovePasswordFromUsers < ActiveRecord::Migration[6.0]
  def change
    remove_column :users, :password, :string
  end
end
```
ターミナル:
```
$ rails db:migrate
```
以上の手順に従うことで、パスワードの安全なハッシュ化が実装され、データベースに保存されるパスワードが保護されます。
拡散モデル入門①

\# 拡散モデル
## 前がき
拡散モデルの勉強のメモとして残す。
教科書として[『拡散モデル』　岡野原著](https://www.iwanami.co.jp/book/b619864.html)を使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1157150/a4986b04-f7f2-666f-25f0-63e1b95b412e.png)

# 目次
1.生成モデル
2.拡散モデル
3.連続時間化拡散モデル
4.拡散モデルの発展
5.アプリケーション

# 前提
$\bf{x} \in \bf{X}$,訓練データ　$N個　D=\\{\textbf{x}^{(1)},...,\textbf{x}^{(N)}\\}$ が未知の確率分布$p(\bf{x})$から互いに独立にサンプリングされている($\textbf{x}^{(i)} \in \mathbb{R}^d$, $x_i \in \mathbb{R}$)。
生成モデル $q_{\theta}(\textbf{x})$という確率分布を持つ。この確率分布はパラメータ$\theta$で特徴付けられている。


# 　1.1生成モデルとは？
生成モデルとは、対象ドメインのデータ生成できるモデルのことである。
**生成モデルの学習の目標は、目標確率分布$p(\bf{x})$にできるだけ近い確率分布$q_{\theta}(\textbf{x})$を獲得することである。**

近さを定義するには最適輸送距離やKLダイバージェンスがあり、この中ではKLダイバージェンスを用いることが多い。

# 1.2エネルギーベースモデル・分配関数
非負正規化確率密度関数$\gamma_\theta(\bf{x})>0$、正規化定数$Z(\theta)>0$（分配関数とも呼ばれる）を用いて生成モデルは
```math
\displaylines{
q_{\theta}(\textbf{x})=\gamma_\theta(\bf{x})/Z(\theta) \\
Z(\theta)=\int_{\bf{x}^{'}\in \bf{X}}\gamma_\theta(\bf{x}^{'})d\bf{x^{'}}
}
```
で表すことができる。$Z(\theta)$は全てのデータ$\bf{x}^{'}\in \bf{X}$で積分した値であり、生成モデルが確率分布となるような役割がある。
この分配関数は取りうる全てのデータについて積分が必要であるため計算が困難である。



# 公開しながら書く。
【Rails】before_actionとは

# before_actionとは
`before_action`は、コントローラー内のアクションが実行される前に特定の処理を実行するためのフィルターです。これは、アクションの実行前に事前に定義されたコードを実行することができるため、DRY（Don't Repeat Yourself）原則に従ってコードを簡潔に保つのに役立ちます。

`before_action`を使用すると、以下のようなことができます。

1\. 特定のアクションにアクセスする前にユーザーの認証を行う。
2\. 特定のアクションにアクセスする前に、特定の条件が満たされていることを確認する。
3\. 特定のアクションにアクセスする前に、特定のデータをロードする。

`before_action`は、コントローラーのクラス定義内で使用され、指定されたアクションが実行される前に実行されるメソッドを指定します。

例えば、以下のように`before_action`を使用して、特定のコントローラー内のアクションが実行される前に認証を行うことができます。
```rb
class UsersController < ApplicationController
  before_action :authenticate_user

  def index
    # indexアクションの実装
  end

  def show
    # showアクションの実装
  end

  private

  def authenticate_user
    # ユーザーの認証処理
    unless current_user
      redirect_to login_path, alert: "ログインしてください"
    end
  end
end
```
上記の例では、`before_action :authenticate_user`の行により、`UsersController`内のすべてのアクションが実行される前に`authenticate_user`メソッドが実行されます。`authenticate_user`メソッドは、ユーザーの認証を行い、ログインしていない場合はログインページにリダイレクトします。
【Rails】getとpostの違い

# getとpostの違い
RailsにおけるGETとPOSTの違いは、HTTPリクエストの種類とその目的にあります。

# GETリクエスト
- リソースの取得を目的とするリクエストです。
- リクエストされたURLに対応する情報を取得するために使用されます。
- リクエストパラメータはURLのクエリ文字列に含まれます。
- リクエストはブラウザのアドレスバーに表示されるため、ブックマークや履歴に保存される可能性があります。
- キャッシュが可能であり、同じURLに対する複数のGETリクエストは、同じ結果を返す必要があります。
# POSTリクエスト
- サーバーにデータを送信するためのリクエストです。
- リクエストされたURLにデータを送信し、それに基づいて処理を行います（データの作成、更新、削除など）。
- リクエストパラメータはリクエストボディに含まれます。
- データの送信が暗号化され、ブラウザのアドレスバーに表示されません。
- キャッシュされません。

Railsでは、これらのHTTPリクエストを受け取るために、それぞれのリクエストタイプに対応するルーティングメソッドが用意されています。

- **GETリクエスト** : `get`メソッドを使用してルートを定義します。例えば、`get '/posts', to: 'posts#index'`は、`/posts`へのGETリクエストを`PostsController`の`index`アクションにマッピングします。
- **POSTリクエスト** : `post`メソッドを使用してルートを定義します。例えば、`post '/posts', to: 'posts#create'`は、`/posts`へのPOSTリクエストを`PostsController`の`create`アクションにマッピングします。

これらのリクエストを正しく使用することで、Railsアプリケーションのデータの取得や送信を効果的に処理できます。
MATLAB入門者から中上級者まで、おすすめ学習書籍・参考書 8選

https://toarusw.com/matlab-recommend-books/

MATLAB学習おすすめ本・書籍8選
https://toarusw.com/matlab-recommend-books/
紹介記事を作成しました。Webで多くを学べますが手元に本を置いておくのも良い手だと思います。まとまっているので知りたいポイントにすぐアクセスできます。どうせ読むならこれらが良いかと思います。

#MATLAB
#Simulink
#MBD
#おすすめ書籍
【Rails】ロギングとは

# ロギングとは
ロギングは、アプリケーションの実行中に発生する様々なイベントや情報を記録することを指します。これには、リクエストの処理、データベースクエリの実行、エラーメッセージなどが含まれます。ロギングは、アプリケーションの動作を理解し、デバッグやトラブルシューティングを行う際に非常に役立ちます。

Railsのデフォルトのロギング設定では、開発環境とテスト環境では詳細な情報が記録され、本番環境では情報が最小限に抑えられます。これにより、開発中やテスト中はデバッグがしやすく、本番環境ではパフォーマンスが最適化されます。

ロギングは、`logger`オブジェクトを介して行われます。このオブジェクトはRailsアプリケーション全体で利用可能であり、`Rails.logger`を介してアクセスできます。ログレベル（debug、info、warn、error、fatal）を指定してログメッセージを出力することができます。

以下は、ロギングの基本的な使用例です。

```ruby
# デバッグ情報の出力
Rails.logger.debug("This is a debug message")

# 情報の出力
Rails.logger.info("This is an info message")

# 警告の出力
Rails.logger.warn("This is a warning message")

# エラーの出力
Rails.logger.error("This is an error message")

# 致命的なエラーの出力
Rails.logger.fatal("This is a fatal error message")
```
これらのログメッセージは、デフォルトではlogディレクトリ内の`development.log`（開発環境）や`production.log`（本番環境）などのファイルに記録されます。ログレベルやフォーマットなどのロギングの設定は、`config/environments/*.rb`ファイルで変更することができます。
画像に好きなものを登場させるAI HD Painter

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fde37285-c0c3-d587-2fad-e49a9d293be0.jpeg width=400>

画像を塗りつぶして...

![Feb-12-2024 20-38-20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e6209d78-300f-7ddf-b16e-01f4524e1289.gif)

文章を入力　
"suits"

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e4368e70-8467-8c79-aaa0-899157b936f0.jpeg width=400>

**HD Painter** というモデルでできます。

https://github.com/Picsart-AI-Research/HD-Painter?tab=readme-ov-file

[**すぐできるデモ**](https://huggingface.co/spaces/PAIR/HD-Painter)

https://huggingface.co/spaces/PAIR/HD-Painter

![スクリーンショット 2024-02-12 23.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/853c7dce-bb2e-75c4-716b-bce4ca627e80.png)

# 使い方

オープンソースなので、コードからつかえる。

### インストール

```shell
git clone https://github.com/Picsart-AI-Research/HD-Painter.git
cd HD-Painter
python3 -m venv venv
source ./venv/bin/activate
pip install pip --upgrade
pip install -r requirements.txt
```

### 実行

```shell
python hd_inpaint.py --model-id ds8_inp --method painta+rasg --image-path input_image.jpg --mask-path mask_image.png --prompt "prompt text" --output-dir output_dir
```

![スクリーンショット 2024-02-12 23.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/67d8bf99-ce7b-fb2d-ba48-fee990607968.png)

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【Rails】each文とは

# each文とは
Railsの`each`文は、Rubyの標準的な`Enumerable`モジュールから派生したメソッドで、コレクション（配列やハッシュなど）の要素を1つずつ取り出して繰り返し処理を行うためのものです。

主にビューで使用され、データベースから取得したレコードなどのデータを表示する際によく使われます。例えば、コントローラーで取得したレコードをビューで一覧表示する場合に使用します。

以下は、Railsのビューでの`each`文の基本的な使用例です。
```erb
<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>
```
上記の例では、`@users`というインスタンス変数に格納されているユーザーのコレクション（おそらくデータベースから取得したもの）を繰り返し処理しています。各ユーザーの名前を`<p>`タグで表示しています。

`each`メソッドはブロックを受け取り、コレクション内の各要素をそのブロックに渡して処理を行います。ブロック内の変数（この場合は`user`）には、現在の要素が格納されます。

このようにして、データベースから取得したデータなどを一覧表示する際に、`each`メソッドを使用して繰り返し処理を行うことができます。
【Rails】カラムの設定(AUTO INCREMENT, INDEX, DEFAUT)やenumについて

こんばんは！
今日はチーム開発でテーブル定義書を話し合ったので、その際に学んだカラムの設定やenumについて載せます！

## AUTO INCREMENT
　主にPK(主キー)などのデフォルトで、自動的に連番が付与される。(1,2,3…)
 メリットとしては自動で一意性を保て、管理がしやすいことが挙げられる。デメリットはセキュリティ面では１から連番にidを決めるとなると情報を簡単に抜かれてしまう可能性がある(URLなども予測しやすい)ので、ユーザー管理では向いていない。

こちらの記事を参考にさせていただきました↓

https://qiita.com/jnchito/items/79845b02cc197dee3e7c

## INDEX
　あるテーブルの特定のカラムからデータを取得する際に、そのカラムのデータを複製して検索しやすいようにしたもの。主にPK、FKに用いられ、idの情報などを検索したい際に実行速度が上がる。イメージとしては索引のある辞書をひくようなイメージ。逆にindexがない場合に検索をかけると、辞書を1ページ目から順にみてほしい単語を探すイメージで、カラムの一番初めのデータから順に参照する。
　メリットとしては、先述の通り検索時の実行速度が上がることが挙げられるが、デメリットとしては、何でもかんでもindexを使用してしまうと、indexを作る際に時間がかかるためかえって処理速度が落ちてしまう。
 基本的にはある程度多くのデータを格納し、頻繁に検索が行われるカラムに使用すると効果的に用いることができる。
 
こちらの記事がとても分かりやすかったです！↓

 https://plog.kobacchi.com/rails-add-index-to-column/

 ## DEFAULT制約
 　(以前にも載せていましたが、少し情報を追加したかったので載せます。)
  DEFAULT制約は初期値を決める制約。trueかfalseが値としてある場合、初期値をどちらかに決めておくことや、初期値が決まっていて変動することがない場合、数値で初期値(default)を定めることも可能。
  逆に変動することが多いもの(毎回初期値を変えるのはかえって面倒)や初期値という概念がないものには使わない方が良い。

## enum
>　1つのカラムに指定した複数個の定数を保存できるようするためのもの。enumを使うと指定した複数個の定数以外の値は保存できないようにしたり、カラムに指定した定数が入っているレコードを取り出すのが容易になる。

enumは整数か真偽値でDBに保存される。
 使用方法としては、migrationファイルにdefault値を記述し、modelファイルに複数個の定数を定義する。
 
例
 ```ruby:db/migrate/create_xxx.rb
 # カラム部分のみ記載
 t.integer :blood_type, null:false, default: 0
 t.boolean :is_active, null: false, default: true
 ```
```ruby:app/models/xxx.rb
class Xxx < ApplicationRecord
    enum blood_type: { A: 0, B: 1, O: 2, AB: 3}
    enum is_active: { active: true, inactive: false}
```
解説：まずblood_typeではdefaultを0としており、モデルの設定で0はAを示しているので、表示上ではA(型)が初期値になる。is_activeでは初期値をtrueにしており、モデルではtrueをactiveとしているので、表示上ではactiveが初期値になる。

こちらの記事を参考にさせていただきました！

  https://pikawaka.com/rails/enum

今回はすべて英語表記でenumを指定していましたが、日本語設定も可能なので、興味がある方はそちらもぜひやってみてください。
【Rails】whereメソッドとfind_byメソッドの違い

# whereメソッドとfind_byメソッドの違い
`where`メソッドと`find_by`メソッドは、どちらもActive Recordクエリインターフェースを使用してデータベースからレコードを取得するためのメソッドですが、いくつかの重要な違いがあります。

1\. **戻り値の型**
- where: whereメソッドは条件に一致するすべてのレコードを取得し、それらを含むコレクション（ActiveRecord::Relation）を返します。結果が1つ以上のレコードであっても、常にコレクションを返します。
- find_by: find_byメソッドは条件に一致する最初のレコードのみを取得し、そのレコードを返します。結果が1つ以上のレコードであっても、最初の一致するレコードのみを返します。

2\. **返り値が存在しない場合の挙動**
- where: whereメソッドは、条件に一致するレコードが存在しない場合、空のコレクションを返します。
- find_by: find_byメソッドは、条件に一致するレコードが存在しない場合、nilを返します。

3\. **使用法**
- where: whereメソッドは、検索条件を指定するためのハッシュやSQLの条件式を引数として受け取ります。
- find_by: find_byメソッドは、検索条件を指定するためのハッシュを引数として受け取ります。条件が1つしかない場合に使用します。

例えば、以下のような違いがあります。
```rb
# whereメソッドの使用例
# 名前が"John"であるすべてのユーザーを取得する
User.where(name: "John")

# find_byメソッドの使用例
# 名前が"John"である最初のユーザーを取得する
User.find_by(name: "John")
```
`where`メソッドは条件に一致する複数のレコードを取得し、`find_by`メソッドは条件に一致する最初のレコードのみを取得する点に注意してください。
firebaseでRecaptchaVerifierでclearメソッドがうまくいかない

# 背景
firebase authenticationで二要素にsms認証を登録したい。
sms認証のためのショートメッセージの送信にreCAPTCHAを使う必要がある。
reCAPTCHAは処理が完了すると失効されるので、処理が成功しても失敗でもreCAPTCHAをリセットして新しくしたい。

# reCAPTCHAの流れ
- reCAPTCHAのインスタンスを作成
- reCAPTCHAのレンダリング
- ショートメッセージの送信
- リセット処理（reCAPTCHAウィジェットを削除とreCAPTCHAのインスタンスの破棄、新たなreCAPTCHAのインスタンスを作成）

# 発生したエラー
一度ショートメッセージの送信処理を実行し、再度ショートメッセージの送信を使用とすると以下のエラーが出る。
```
reCAPTCHA has already been rendered in this element
```
原因はreCAPTCHAのウィジェットは同じ要素に複数のウィジェットを表示することができず、再度ショートメッセージの送信した時に既存のウィジェットが残っていたため。
この時に行ってしたリセット処理。
```react.js
verifierRef.current.clear(); // reCAPTCHAウィジェットを削除とreCAPTCHAのインスタンスの破棄
// 本来はclear()で済むはずだがうまくいかないので以下も追加
verifierRef.current = undefined; // reCAPTCHAのインスタンスのrefをundefinedにする
reCAPTCHARef.current.innerHTML = ''; // reCAPTCHAウィジェット要素をリセットする
```
`verifierRef.current.clear()`でうまくいかないのでreCAPTCHAのインスタンスのrefをundefinedにしたり、reCAPTCHAウィジェット要素をリセットしたりしたが、エラーは解消できなかった。

# 解決した方法
コンポーネント側にdiv要素を追加し、isShowElementでレンダリングの有無を制御する。
処理が成功しても失敗でも、finallyでisShowElementをfalseにしてウィジェット要素を非表示にする。
isShowElementがfalseになるとuseEffectでtrueになり、新しいreCAPTCHAのインスタンスが生成される。
```react.js
export const Test = () => {
  const { reCAPTCHARef, isShowElement } = useTest();
  return <div>{isShowElement && <div ref={reCAPTCHARef}></div>}</div>;
};
```
```react.js
const reCAPTCHARef = useRef<HTMLDivElement>(null);
const verifierRef = useRef<RecaptchaVerifier>();
const [isShowElement, setIsShowElement] = useState(true);

  useEffect(() => {
    if (!isShowElement) {
      setIsShowElement(true);
      return;
    }
    if (!reCAPTCHARef.current) return;
    const verifier = new RecaptchaVerifier(
      reCAPTCHARef.current,
      {
        size: 'normal',
      },
      firebaseAuth,
    );
    verifierRef.current = verifier;
  }, [isShowElement, reCAPTCHARef]);

  const handleSendPhone = useCallback(async (phoneInfoOptions: PhoneMultiFactorEnrollInfoOptions) => {
    try {
      if (!verifierRef.current) throw new Error('not exist recaptchaVerifier');
      // ウィジェットの表示
      verifierRef.current.render();
      // 指定した電話番号にショートメッセージを送信する
      const phoneAuthProvider = new PhoneAuthProvider(firebaseAuth);
      await phoneAuthProvider.verifyPhoneNumber(phoneInfoOptions, verifierRef.current);
    } catch (error) {
      console.error(error);
    } finally {
      setIsShowElement(false);
    }
  }, []);

```

# 最後に
なんでclearメソッドが使えないのか分からないが、動いてよかった。
【Rails】find_byとは

# find_byとは
`find_by`メソッドは、Active Recordクエリインターフェースを使用してデータベースからレコードを取得するためのメソッドの1つです。`find_by`メソッドは、特定の条件に一致する最初のレコードを取得します。

`find_by`メソッドは、検索条件を指定するためのハッシュを引数として受け取ります。指定された条件に一致するレコードが複数ある場合でも、最初に一致するレコードのみを返します。条件に一致するレコードが存在しない場合は`nil`を返します。

例えば、`User`モデルから名前が"John"である最初のユーザーを取得する場合、以下のように`find_by`メソッドを使用できます。
```rb
# 名前が"John"である最初のユーザーを取得する
User.find_by(name: "John")
```
また、複数の条件を指定することもできます。
```rb
# 名前が"John"かつ年齢が20歳である最初のユーザーを取得する
User.find_by(name: "John", age: 20)
```
`find_by`メソッドは、他のActive Recordメソッドと組み合わせて使用することもできます。例えば、`find_by`メソッドで特定の条件に一致する最初のレコードを取得した後、そのレコードを更新したり、削除したりすることができます。
3倍打点理論の考察

# はじめに
今回は野球についての記事です。
野球の魅力は色々なものがありますが、その中に多くの種類の記録が楽しめる点があります。
打率、ホームラン数、打点といった打撃記録、奪三振、防御率といった投手記録、またそれらをチームとして合計したチーム記録など様々な角度からの記録があり、野球ファンの間でも多く議論されています。

今回扱う記録は個人の打撃記録である打点（Run batted in: RBI）とホームラン（Home Run: HR）数についてです。
下記は2023年のセリーグの規定到達打者のホームランと打点の記録です。
（順番は打率の降順）
|選手|ホームラン|打点|
|:----|:----|:----|
|宮﨑　敏郎|20|71|
|西川　龍馬|9|56|
|サンタナ|18|66|
|牧　秀悟|29|103|
|大島　洋平|0|23|
|大山　悠輔|19|78|
|坂本　勇人|22|60|
|近本　光司|8|54|
|中野　拓夢|2|40|
|大城　卓三|16|55|
|岡林　勇希|3|31|
|岡本　和真|41|93|
|秋山　翔吾|4|38|
|木浪　聖也|1|41|
|坂倉　将吾|12|44|
|佐野　恵太|13|65|
|佐藤　輝明|24|92|
|関根　大気|4|31|
|菊池　涼介|5|27|
|村上　宗隆|31|84|
|吉川　尚輝|7|36|
|オスナ|23|71|
|細川　成也|24|78|
|桑原　将志|7|35|
|石川　昂弥|13|45|
|ノイジー|9|56|
|長岡　秀樹|3|35|


データを見るとHRが多いほど打点も多い事が何となくの傾向として分かります。
次の図は過去10年分のセパ両リーグの規定到達打者のHR数と打点数のプロットです。
![scatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190079/9ee6a338-8001-4fe7-c8d2-d9b1a02b52a0.png)

この図でも打点はHR数と相関があるように見えます。
ではHR数に対してどれくらいの打点数が妥当なのでしょうか。

# 3倍打点理論
この疑問に一つの仮説を立ててくれたのが**3倍打点ニキ**です。
彼によると、**打点はHRの3倍以上ないといけない**そうです。

3倍打点ニキの理論をここでは3倍打点理論と呼ぶことにしますが、3倍打点理論によれば2023年セリーグHR数トップの岡本和真はHR数41に対し打点93とHR数の3倍未満のため評価が低いことになります。

先程の図に3倍打点直線（打点=3*HR数、緑線）と線形回帰した直線（青線）を追加してみます。
![linefit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190079/c3ad107d-a6fe-e048-a548-d18249b0cde3.png)

HR数が少ない打者については3倍打点直線の上側（3倍打点ニキ満足ゾーン）にほとんどの打者が位置しますが、HR数が20本を超えたあたりから3倍打点直線の下側（3倍打点ニキ不満ゾーン）に位置する打者が増えていきます。
これは、野球の性質上打点を稼ぐにはHR以外の方法もあるため、HRが少ない打者は必然的に3倍打点ニキ満足ゾーンに位置しやすくなります。（線形回帰の切片も0では無く約33となってる）
一方HRが多くなってくると、3倍打点を超えるためには3ランHR、満塁HRを打っていく必要があるため3倍打点直線を超えることが難しくなってきます。

以上の理由などから3倍打点理論は多くの批判があるのですが、個人的には3倍打点ニキは「何となくHRが多い打者は打点も多い方が望ましい」という野球ファンの考えを定量的にモデル化したパイオニアとして一定のリスペクトを持っています。一度モデル化がなされればモデルの改良やそもそもモデルの妥当性の議論はどんどん進みます。したがって上記のような、HR数と打点数の比率を打者の優劣の指標とするのは適切ではないという考えが出てくるのですが、このような議論ができるのもその礎として3倍打点ニキが新たな理論を世に出してくれたおかげであると思っています。

# まとめ
3倍打点理論は、必ずしも打者を評価するのに適切ではないかもしれないが、その理論を検証することで様々な考えにたどり着く可能性があります。
【Rails】whereメソッドとは

# whereメソッドとは
`whereメソッド`は、Active Recordクエリインターフェースを使用してデータベースからレコードを取得するためのメソッドです。`where`メソッドは、与えられた条件に一致するレコードを取得するために使用されます。

`where`メソッドは、検索条件を指定するためのハッシュやSQLの条件式を引数として受け取ります。例えば、特定のカラムの値が一致するレコードを取得する場合、以下のように使用できます。
```rb
# カラムnameが"John"であるレコードを取得する
User.where(name: "John")

# カラムageが20より大きいレコードを取得する
User.where("age > ?", 20)
```
`where`メソッドは、条件に一致する複数のレコードを返す場合があります。また、条件に一致するレコードが存在しない場合は空の配列が返されます。

`where`メソッドは他のActive Recordメソッドと組み合わせて使用することもできます。例えば、`where`メソッドで条件に一致するレコードを取得した後、orderメソッドで結果を並び替えることができます。
```rb
# カラムageが20より大きいレコードを取得し、ageの昇順で並び替える
User.where("age > ?", 20).order(:age)
```
このように、`where`メソッドはデータベースから特定の条件に一致するレコードを取得するための強力なメソッドです。
【Rails】authenticateメソッドとは

# authenticateメソッドとは
`authenticate`メソッドは、ユーザーがログインしているかどうかを確認し、ログインしていない場合には適切な処理を行います。

具体的には、`authenticate`メソッドは、ユーザーの認証情報（通常はメールアドレスとパスワード）を受け取り、これらの情報が有効であるかどうかを確認します。有効な場合は、ログイン状態にしてセッションを確立し、アプリケーション内でユーザーが認識されます。無効な場合は、ログインページにリダイレクトされたり、エラーメッセージが表示されたりすることがあります。

`authenticate`メソッドは、主に認証Gem（例えばDeviseやSorceryなど）を使用する際に提供されるものであり、アプリケーション内で独自に実装することはありません。代わりに、これらのGemが提供するメソッドを使用して、ユーザーの認証を行います。

以下は、Devise Gemを使用した場合の例です。
```rb
class SessionsController < Devise::SessionsController
  def create
    user = User.find_by(email: params[:user][:email])
    if user&.valid_password?(params[:user][:password])
      sign_in(user)
      redirect_to root_path, notice: 'ログインしました。'
    else
      flash.now[:alert] = 'メールアドレスまたはパスワードが正しくありません。'
      render :new
    end
  end
end
```
上記の例では、`authenticate`メソッドの代わりに`valid_password?`メソッドを使用して、ユーザーのパスワードが正しいかどうかを確認しています。これはDevise Gemが提供する機能の一部であり、ユーザーの認証を行うために使用されます。
【Rails】ログイン中のユーザーのみ編集・削除できるようにする

ログイン中のユーザーのみ編集・削除できるようにするために`ensure_correct_user`メソッドを作成します。
具体的には、`ensure_correct_user`メソッドは、リクエストされたリソースの所有者がログイン中のユーザーであることを確認します。もしログイン中のユーザーがリソースの所有者でない場合、権限がないことを通知し、適切なリダイレクトを行います。

以下は、このメソッドの説明と使用例です。
```rb
class UsersController < ApplicationController
  before_action :set_user, only: [:edit, :update, :destroy]
  before_action :ensure_correct_user, only: [:edit, :update, :destroy]

  def edit
    # ユーザーの編集ページの表示などの処理
  end

  def update
    if @user.update(user_params)
      redirect_to @user, notice: 'ユーザー情報が更新されました。'
    else
      render :edit
    end
  end

  def destroy
    @user.destroy
    redirect_to users_url, notice: 'ユーザーが削除されました。'
  end

  private

  def set_user
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit(:name, :email, :password)
  end

  def ensure_correct_user
    if params[:id].to_i != current_user.id
      flash[:notice] = "権限がありません"
      redirect_to posts_index_path
    end
  end
end
```
この例では、`UsersController`内で`ensure_correct_user`メソッドが定義され、`edit`、`update`、`destroy`アクションに適用されています。これにより、ログイン中のユーザーが自分のアカウントのみ編集および削除できるようになります。

`ensure_correct_user`メソッドでは、リクエストされたユーザーのIDとログイン中のユーザーのIDを比較し、一致しない場合は権限がないことを通知して適切なリダイレクトを行います。
JavascriptでCloud Storage for Firebaseを操作する

# はじめに
この記事では`Javascript`で`Cloud Storage for Firebase`のデータを取得・更新・削除する方法について書いています。

公式ドキュメントを参考にしています。

https://firebase.google.com/docs/storage/web/start?hl=ja

# 前提
* Cloud Storage for Firebaseの構築が済んでいる
* Cloud Storage for Firebaseに接続できる状態

# Cloud Storage for Firebaseを操作する
下記の方法について説明しています。
1. アップロード
1. ダウンロード
1. 削除

上記のどの操作でもストレージへの参照を作って、その参照先のデータを操作するという流れは共通しています。

## アップロード
大きく下記の2通りのアップロード方法について書いています。
1. **FileオブジェクトかBlobオブジェクトを使ってアップロードする**
1. **Base64などの文字列を使ってアップロードする**

### FileオブジェクトかBlobオブジェクトを使ってアップロードする

まずは参照を作成します。
```js
import { getStorage, ref } from 'firebase/storage'

const storage = getStorage()
const storageRef = ref(storage, 'image.png')
```
`ref`の第二引数にファイルのフルパスを指定します。こちらがアップロード先になります。
下記のように階層をつけることもできます。
```js
storageRef = ref(storage, 'foo/image.png')
```

次にアップロードする方法ですが、`uploadBytes`というメソッドを使います。
```js
import { getStorage, ref, uploadBytes } from 'firebase/storage'

const storage = getStorage()
const storageRef = ref(storage, 'foo/image.png')

uploadBytes(storageRef, file).then((snapshot) => {
    console.log(snapshot.metadata.name) // image.png
    console.log(snapshot.metadata.fullPath) // foo/image.png
})
```
第一引数には先ほど作成した参照入れて、第二引数にはFileオブジェクトかBlobオブジェクトを入れます。 返り値の`snapshot`にはファイルの参照データやメタデータが格納されています。

ここには書きませんが、他にバイト配列を使ってアップロードする方法もあります。

https://firebase.google.com/docs/storage/web/upload-files?hl=ja#upload_from_a_byte_array


### Base64などの文字列を使ってアップロードする
文字列からアップロードするには`uploadString`メソッドを使います。
下記はBase64の文字列でアップロードする例です。
```js
import { getStorage, ref, uploadString } from 'firebase/storage'

const storage = getStorage()
const storageRef = ref(storage, 'foo/image.png')

uploadString(storageRef, base64, 'base64').then((snapshot) => {
    console.log(snapshot.metadata.name)
    console.log(snapshot.metadata.fullPath)
})
```
第二引数にbase64の文字列、第三引数に文字列の形式を入れます。
下記のように第二引数に文字列を入れてテキストファイルをアップロードすることもできます。この場合は第三引数を省略します。
```js
uploadString(storageRef, 'Hello World').then((snapshot) => {
    console.log(snapshot.metadata.name)
    console.log(snapshot.metadata.fullPath)
})
```

## 取得
`getDownloadURL`というメソッドを使ってurlを取得します。
```js
import { getStorage, ref, getDownloadURL } from 'firebase/storage'

const storage = getStorage()
const storageRef = ref(storage, 'foo/image.png')

getDownloadURL(storageRef)
    .then((url) => {
        const img = document.getElementById('myimg')
        img.setAttribute('src', url)
    })
    .catch((error) => {})
```
`getDownloadURL`の引数にファイルへの参照を入れています。返り値はファイルのurlで、それを`img`タグにセットしています。

ちなみにこの方法にはurlを知っていればアクセスし放題というセキュリティ的な問題があります。urlを限られた人にしか共有しないのであれば大丈夫かもしれません。このことついては下記の記事で詳しく書かれています。

https://zenn.dev/akaboshinit/articles/c13b8d3085ac7d

## 削除
`deleteObject`というメソッドを使用します。
```js
import { getStorage, ref, deleteObject } from 'firebase/storage'

const storage = getStorage()
const storageRef = ref(storage, 'foo/image.png')

deleteObject(storageRef).then(() => {}).catch((error) => {})
```
引数には参照を入れます。返り値はありません。

# 参考

https://firebase.google.com/docs/storage/web/start?hl=ja

https://firebase.google.com/docs/storage/web/upload-files?hl=ja

https://zenn.dev/akaboshinit/articles/c13b8d3085ac7d
【Rails】ログイン中にアクセス制限をする方法

# ログイン中にアクセス制限をする方法
ログイン中に特定のページにアクセスを制限するには、以下の手順を実行します。

1\. コントローラーで`forbid_login_user`メソッドを定義します。このメソッドは、すでにログインしているユーザーがログインページにアクセスできないようにするためのものです。
```rb
class SessionsController < ApplicationController
  before_action :forbid_login_user, only: [:new]

  def new
    # ログインページの表示などの処理
  end

  private

  def forbid_login_user
    if current_user
      flash[:notice] = "すでにログインしています"
      redirect_to posts_index_path
    end
  end
end
```
2\. `forbid_login_user`メソッドでは、`current_user`メソッドを使用してログインしているユーザーをチェックします。ログインしている場合は、適切なフラッシュメッセージを設定し、ログイン後のリダイレクト先にリダイレクトします。`redirect_to`メソッドの引数には、リダイレクト先のパスを指定します。

3\. `before_action`フィルターを使用して、`forbid_login_user`メソッドをnewアクションに適用します。これにより、ログインページにアクセスしようとした際に、すでにログインしている場合はリダイレクトされます。

このようにすることで、ログイン中にログインページにアクセスすることを制限できます。同様の手法を他のアクションやコントローラーに適用することもできます。
raspberrypiでfm送信機(トランスミッター)を作ってみた。

raspberrypiで、fm送信機(トランスミッター)を作れるかな〜と思っていたところ、作り方がわかりました。それでは作っていきましょう。
# 準備
# raspberrypiを動かすにあたって必須なもの
* raspberrypi2,3,4,5 zeroなど。
* os書き込む用のmicroSDカード
* キーボード
* マウス
* microHDMiからHDMI変換ケーブル
* type-c acアダプター5V3A
### fm送信機を作るのに必須なもの
* ジャンパ線 3本ぐらい
### あってもいいもの
* 有線LAN
(ちなみに私はraspberrypi4を使いました。)
# 作り方
まず、必要なソフトウェアをインストールしていきます。
```
git clone https://github.com/ChristopheJacquet/PiFmRds.git
cd PiFmRds/src
make clean
make
```
をlxTerminalで実行します。
makeのときにエラーが出たら
```
sudo apt-get install libsndfile1-dev
```
を実行します。
そしてもう一度makeします。
### 送信用のアンテナを接続する
ジャンパ線を用意し、
![canvas (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/113ad81c-ecff-f698-39cb-d37131cc4290.png)
に接続します。
15cmぐらいでいいです。受信できるので。
ちなみに5~6mぐらい飛びます。(それよりちょっと長いかも)
なぜジャンパ線と思った方もいるでしょう。それはしっかりとしたアンテナを接続したりすると、強い電波がでてくる可能性があるためそれを防止するためです。
私の場合は、このように接続しました。
![IMG_20240212_195323.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/505a8762-6106-a00b-8bb4-d9562ba21685.jpeg)
こんな感じで大丈夫です。
## 音声ファイルを放送する
次は、ラジオで流していきます。
ちなみに、wavファイルじゃないと再生できません。(そのため変換しないといけない)
そのwavファイルを、/PiFmRds/srcに移動します。
このコマンドを実行します。
```
cd /PiFmRds/src
sudo ./pi_fm_rds -audio 名前.wav -freq 76
```
ちなみに76の部分は周波数です。好きなふうに変えてください(そのままでも可)
そうするとラジオが聞こえるはずです。
今度は、マイクで直接話すには、
```
arecord -l
```
を実行し、card(カード)とdevice(デバイス)の数字の部分を確認します。
私は、3と0でしたのでplughw:3,0としています。
```
arecord -D plughw:3,0 -f S16_LE -r 22050|sudo ./pi_fm_rds -audio - -freq 76
```
76の部分は周波数です。なので自由に変えてください。
これを実行することで多少の遅延が発生しますが、それはもとからそうです。
できました?できなかった場合はコメントで教えてください それではさようなら。
NoCoderでもDataikuを使ったらコンペに参加できた話

## 初めに
 AIとか機械学習などに興味があり ほそぼそと勉強はしていたものの 仕事はデータ分析などしている部署ではないためコードなど ~~年のため~~すぐに忘れてしまっている筆者です
 勉強を忘れないために、2024年2月15日までSignateで行われている[第2回 金融データ活用チャレンジ]（https://signate.jp/competitions/1325) に仲間、いや師匠たちとともに参加することにしました。

 ## Dataikuとの出会い
 今回のコンペでは、自身の環境で行うほか３つのツールが用意されていました。
 1.[databricks](https://www.databricks.com/jp)
 2.[tableau](https://www.tableau.com/ja-jp)
**3.[dataiku](https://www.dataiku.com/ja/%e8%a3%bd%e5%93%81/)**

 どれも魅力できでしたが、NoCoderでも使えるに加えこのかわいい鳥
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1506086/8293a3f7-6f3a-49d8-16b9-beb7b0247a15.png)　
 に一目ぼれしてDataikuを選択

 ## コンペティションへの取り組み
 ### さっそく使ってみる
 担当者の方がチュートリアルを行ってくれて、ざっとした基本操作を教えてくれました。
 なんと、それだけで私もデータの取り込みからクリーニング、加工、モデル構築、デプロイメント投稿用のcsvまで作成することができました。

### データの理解とデータの前処理
コンペティション開始後、最初に行ったのは提供された金融データの理解です。Dataikuのデータビジュアライゼーション機能を利用して、データの分布や相関関係が簡単にわかるようですが、
~~相関係数とか見ても今はまだその結果の整合性が理解できないので~~。今回は大人の事情でカットして
データに含まれる異常値や欠損値の有無がないかについては、この分析機能を使って確認や置き換えをしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1506086/502425d8-445f-14b0-c86d-20afb850804d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1506086/91add582-bb07-6781-ad82-7496fb85cb5f.png)


データのクリーニングは分析の成功に不可欠です。Dataikuでは、ドラッグアンドドロップでデータ処理のフローを構築できるため、コーディング知識が乏しい私でも簡単にデータの前処理を行うことができました。特に、欠損値の処理など、データ前処理に関する多くのタスクを効率的に実行しました。
Dataikuでカテゴリカル変数は処理してくれるみたいなのでそこは何もしませんでした。


## モデルの構築と評価
Dataikuの自動機械学習（AutoML）機能を使用して、複数のモデルを素早く構築（使いたいものをONするだけ）し、比較することができました。初心者である私でも、モデルのパフォーマンスを向上させるためのハイパーパラメータチューニング（数値いれるだけ。わからないのは初期値のまま）を行うことができました。また、Dataikuで提供される評価メトリクスを用いて、モデルの性能を客観的に判断しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1506086/5903007e-0a76-8ded-ffc3-591c8bf257a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1506086/5a17241d-e656-dc91-260f-951130ce8d0e.png)
どんな特徴量がきいているかも一目でわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1506086/d50fb5a3-f6c3-09c7-a23c-8d77290d3984.png)

## 学びと課題
このコンペティションを通じて、データ分析の基本的な流れと、金融データ特有の扱い方について多くを学びました。Dataikuを使用することで、技術的な障壁を感じることなくデータ分析プロジェクトに取り組むことができましたが、未だにチュートリアルを超えられていないため、より高度な分析を行うためには、統計学や機械学習の理論に関する理解を深める必要があると感じました。

## 結論
Dataikuを使用した金融データ活用コンペティションへの参加は、データ分析の魅力と挑戦を体験する貴重な機会でした。初心者でも手軽に始められるDataikuの使いやすさと、データ分析における深い学びの必要性を実感しました。これからも、Dataikuを活用してさらにスキルを磨き、データドリブンな世界で価値を提供してくれていると思います

そして、鳥グッズが私のところに来ますように
【Rails】authenticate_userとは

# authenticate_userとは
`authenticate_user`は、特定のアクションやリソースへのアクセスを許可する前に、ユーザーがログインしているかどうかを確認します。ユーザーがログインしていない場合は、通常はログインページにリダイレクトされます。

`authenticate_user`メソッドは、一般に以下のような形で使用されます。
```rb
before_action :authenticate_user!
```
上記のように、`before_action`フィルターと組み合わせてコントローラー内で定義され、特定のアクションが実行される前にユーザーの認証を行います。`authenticate_user!`メソッドは、Deviseといった一般的な認証Gemで提供されることが多いですが、自身でカスタムすることも可能です。

例えば、以下のようなコントローラーがあるとします。
```rb
class PostsController < ApplicationController
  before_action :authenticate_user!

  def index
    @posts = current_user.posts
  end
end
```
上記の例では、`PostsController`内のすべてのアクションが実行される前に`authenticate_user!`メソッドが呼び出され、ユーザーがログインしていない場合はログインページにリダイレクトされます。

`authenticate_user`メソッドは、アプリケーションのセキュリティを向上させ、特定のリソースへのアクセスを制御するための重要なツールです。
Wijimoのフロント画面の実装Tip集

Wijmoのフロントの画面を作成するうえでの備忘録です。

# チェックボックスでグリッドの中身を編集制御する画面


```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>編集権限があるグリッドの実装</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="node_modules/systemjs/dist/system.src.js"></script>
    <script src="systemjs.config.js"></script>
    <script>
        System.import('./src/app');
    </script>
</head>
<body>
    <h3>チェックボックスで編集可または不可を実装する</h3>
    <div class="container-fluid">
      <div id="theGrid">
      </div>
    </div>
</body>
</html>
```

```index.js
import 'bootstrap.css';
import '@grapecity/wijmo.styles/wijmo.css';
import './styles.css';
import * as wjGrid from '@grapecity/wijmo.grid';
//
document.readyState === 'complete' ? init() : window.onload = init;
//
function init() {
    //
    // create some random data
    var samples = 'サンプル1,サンプル2,サンプル3,サンプル4,サンプル5,'.split(',');
    var data = [];
    for (var i = 0; i < samples.length; i++) {
        data.push({
            id: i,
            sample: samples[i],
            productsales: Math.random() * 10000,
            expenses: Math.random() * 5000,
            overdue: (i + 1) % 4 == 0
        });
    }
    //
    // default clipboard behavior
    var theGrid = new wjGrid.FlexGrid('#theGrid', {
        itemsSource: data,
        columns: [
            { binding: 'id', header: 'ID', width: 50, isReadOnly: true },
            { binding: 'sample', header: 'サンプル名', isRequired: true },
            { binding: 'productsales', header: '商品売上', isRequired: false },
            { binding: 'expenses', header: '費用', isRequired: false },
            { binding: 'overdue', header: '編集可または不可' }
        ],
        beginningEdit: function (s, e) {
            let item = e.getRow().dataItem, binding = e.getColumn().binding;
            if (item.overdue && binding != 'overdue') { // prevent editing overdue items
                e.cancel = true;
            }
        }
    });
}


```

```index.css
.wj-flexgrid {
  max-height: 200px;
  margin-bottom: 12px;
}

body {
  margin-bottom: 24px;
}

```
【メモ】未使用の依存関係をアンインストール：npm-check


便利ツール　npm-check　を利用した。

## 経緯
EAS buildでアプリがクラッシュした。
クラッシュレポートを確認したところ、とあるパッケージが原因に見えた。
確認すると、使っていないパッケージだった。ほかにも使っていないパッケージがApp.jsに残っていないか確認しようと思った。

## npm-check

https://www.npmjs.com/package/npm-check

> 古い依存関係、間違った依存関係、未使用の依存関係を確認します。

あ、未使用の依存関係以外も教えてくれるのね。

## 使い方

1. ```npm install -g npm-check```

1. ```npm-check```
    いろいろ出力されるが、NOTUSEDのパッケージに注目していく。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676445/ac2b0ac3-5e32-b494-02c7-afc1cf07c870.png)

1. ```npm uninstall package_name```
    コード内でも記載がないことを確認して、1つずつパッケージをアンインストールした。
【Rails】current_userとは

# current_userとは
`current_user`は、ユーザー認証システムで現在ログインしているユーザーを表すメソッドです。通常、Railsアプリケーションでユーザー認証を実装する際に使用されます。

`current_user`は、セッションやCookieを介してユーザーの情報を追跡し、アプリケーション全体で現在のユーザーを参照できるようにします。一般的に、以下のような流れで`current_user`が使われます。

1\. ユーザーがログインすると、そのユーザーの情報がセッションやCookieに保存されます。
2\. ユーザーがアプリケーション内でページをリクエストすると、Railsはそのリクエストに関連付けられたセッションやCookieからユーザー情報を取得します。
3\. Railsは、取得したユーザー情報を`current_user`として公開し、コントローラーやビューで使用できるようにします。

`current_user`を使用すると、ログインしているユーザーに関連するデータや権限を取得したり、表示したりすることができます。一般的な使用例は、コントローラーやビューで次のように`current_user`を使用することです。
```ruby
# コントローラーでの使用例
def show
  @user = current_user
end
```
```erb
<!-- ビューでの使用例 -->
<% if current_user %>
  <p>Welcome <%= current_user.name %></p>
<% end %>
```
ただし、`current_user`を使用するには、ユーザー認証システムが実装されている必要があります。一般的なユーザー認証Gemとしては、DeviseやAuthlogicなどがあります。これらのGemを使用することで、`current_user`メソッドが自動的に提供されるようになります。
【初参加】カンファレンス参加はいいぞ【PHPカンファレンス】

# はじめに
どうもこんにちは、イトイ(@Itoi)です。

エンジニアになって1年半、ずっと憧れていたことがありました。
それは「**大きなエンジニアイベントに行ってみたい！**」というミーハーな内容です。

昨年はAWSのイベントやRubyKaigiもありましたが、どうしても都合がつかず…
そんな私に待望のイベントがありました。

それは **PHPカンファレンス関西2024**！！(2024/02/11(日) 開催)
こちらに参加してきました！

PHPカンファレンスは思っていた以上に楽しく、実りある経験となりました。

この記事で、カンファレンス未体験の方に私が感じた魅力を少しでも伝えられればと思います。
（そして参加者が増え、カンファレンス文化がもっと盛り上がりますように！）

## 魅力1　ノベルティがもらえる
いきなり現金な内容です笑
多くのカンファレンスでノベルティがもらえると思います。
今回はトートバッグに色々入っていて、中を見るのがワクワクしました。

もう1点、参加景品として、参加者のアイコンを載せたトレーディングシールを配っていました。
持っている方は名刺がわりに交換していました。
話すきっかけになってめっちゃいいですね。
私は申し込みが遅くもらえませんでしたが、欲しかった…！

（個人的にはトートバッグと企業ブースでもらったPhpStormシールが満足度高かったです笑）

## 魅力2　技術の勉強になる
カンファレンスでは簡単に学びを得られます。
タイムテーブルを見て「これ気になってたんだよね」というテーマを聞きに行くだけ！
その道のプロが非常にわかりやすいトークでプレゼンしてくれます。

たとえば私は以下のような内容を学びました。
- "品質"とは何か
- TDD未経験者に向けたデモンストレーション
- セッションの技術的背景や仕組み
- クリーンアーキテクチャの概要

「その内容、前から気になってた！」というのが一気に回収できて、知識欲が非常に満たされました。

## 魅力3　プレゼンテクニックの勉強になる
仕事をする以上、自分の仕事を他人に説明することがあると思います。
学業でも発表することが大事ですよね。
その見本をカンファレンスで見ることができます。

わかりやすいスライド、自己紹介、話し方…

そういった内容をスピーカーから学ぶことができます。

## 魅力4　企業ブースで未知のサービスを知れる
私はJetBrains公式パートナーの株式会社サムライズムさんのブースにお邪魔しました。

私が雑に「CI/CDを改善したいのですが…」と話しかけたところ、それはもう、懇切丁寧に説明してくださいました。
（お話ししてくださったエンジニアさん、ありがとうございました！）

最終的に「開発効率を上げるなら」とPhpStormでのコーディングデモを見せてもらったのですが、これがすごかった…
「PhpStormってそんな機能あるの？！」と驚きの連続。
IDE内でブラウザ開けるしDBも直接触れるんですか…？！

普段VSCodeを使用していたのですが、早速乗り換えました。
（※サムライズムさんから1円ももらっていません。クーポンはもらいました笑）

興味のある製品の企業があるなら、お話ししてみると色んな情報をもらえます！

## 魅力5　PHPerに直接会える
実際に「PHPを使ってます！興味あります！」という人と直接会う機会は、そんなにない気がします。
そんな人と会えます。めっちゃたくさん。

それに、オンラインでアカウント名「〇〇さん」を見るより、生で会った方が100倍リアリティあります。(リアルなので当たり前ですが)
直接接することで、より強く印象に残りますよね。
その出会いが、いつかどこかで活きる日が来るかもしれません。

個人的には「こんなにPHP使っている人がいるんだな」「こういう人たちが技術を支えているんだ」と実感できたことが有意義でした。

# 終わりに
いかがだったでしょうか？
カンファレンスの魅力、少しは伝わったでしょうか？

おそらく、カンファレンスの魅力は人によりけりで無数にあると思います。

未体験の方はぜひ一度参加して感じていただければと思います。
また、カンファレンス経験者の方には「こんな楽しみ方もあるぞ！」というコメントをいただければと思います。
お読みいただきありがとうございました！

（PHPカンファレンス運営/スポンサー/スピーカー/参加者の皆さまも、ありがとうございました！）
UiPathの要件ヒアリングについて考えてみた

# 1,はじめに
UiPathを約1年3か月程度の経歴でまだまだ不十分なところがあると思いますが、初めて要件ヒヤリングをする方に向けてまとめました。
下記の記事も書いているので、気になったら見てください。

https://qiita.com/thxUVER2012/items/983df4ece507fa285074

# 2,要件ヒアリングチェックリストを作成する
### (1)要件ヒアリングチャックリスト
例ですが、下記の通りに作成しました。(画像の23行目以降は略しています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/8b02d8e9-e6f8-1672-cdcc-18443e024a06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/7a0d4610-4cf4-21a2-38ca-7da1c0df621f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/ff0f89c0-1842-6f83-22d0-3a4c145c677d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/163a5b09-65dd-df6d-6c2e-6e861a2e06d6.png)

### (2)作成しようと思った経緯
:::note alert
案件で使用するツール(Excel,Web操作など)に合わせて何を聞くかというスタンスでいましたが、このスタンスでは漏れが発生します。
ユーザーと要件を詰めると開発に着手できるような情報が整っていない時があり、開発できる最低基準や時間を短縮するようにできないかと考えました。
:::
:::note info
そこで使用するツール自体があっているかを一からユーザーと確認しつつ、過去にあった要件漏れや保守運用で困ったことを要件ヒアリング時に漏れなく聞けるチェックリストがほしいと思いました。
:::

### (3)使用方法
:::note info
a,ユーザーとMTGで要件を詰めるときにこのチェックリストを使用する。
b,項目から使用するものを選択する。(必須は必ず選択する。)
c,選択された項目を順に確認していき、回答、回答者、回答日付を埋めていく。
d,回答したものを案件関係者が確認できるところに格納する。
:::

:::note warn
決まっていなくて回答できなかったものがある場合は納期時期によって対応を変えること。
例えば、納期まであと2か月しかなく時間がないと想定していたら、すぐにこのチェックリストを用いて上長に報告すること。
:::

### (4)質問/回答の選定
:::note info
a,質問と回答はともに考えておくことが重要で「はい」か「いいえ」で答えられるような質問を構成すること。
b,具体を答えさせるなら具体を引き出さす質問にすること。
c,一人で作成をせずに現場の上長とともに作成すること。
:::

:::note warn
特にCについてですが、現場によって環境は異なります。
そのため、今までの要件チェックリストでは通用しないことがあると思います。
そのようにならないためにも現場の環境について詳しい上長とこの要件チェックリストを作成するといいです。
:::

### (5)要件チェックリストによる効果
:::note info
a,開発のイメージがしやすいです。
b,ユーザー/開発者が漏れていたことに気づけます。
c,開発に着手できる基準を全員で共有ができます。
d,要件ヒアリングのMTG時間を短くできます。
:::

# 3,おわりに
:::note alert
要件を確認するチェックリストの作成はできないとだろうと思っていました。
理由は下記の通りです。
(1)要件チェックリストを作成しても要件漏れが起こる。
(2)どの程度までチェックリストに追加するか基準がない。
(3)チェック数が多くなり、MTG時間が長くなる。
:::

:::note info
作成してみることで(1)~(3)はなかったです。
(1)~(3)が生じる要件チェックリストは、まだ改善ができるものだと認識しています。
まずはチェック数が多くなってもチェックリストを全て書き上げることが大切で、言語化できない場合は質問が定まっていないため要件漏れになる項目かと思います。
質問を洗い出したら、保守運用しやすいロボットにさせるためにはどのチェックリストが必要か検討するといいと思います。
:::