OmniAICreator/Qiita-1.07M huggingface dataset:
Bash と Caddy サーバで ActivityPub のインスタンス(5) 他のインスタンス(Misskey系)の投稿に like する

## Misskey 系と Mastodon 系の違い
- アクター名と アクターの ID が違う
- HTTP 署名で求められるヘッダが多い

アクター名とアクターの ID が違うというのは、例えばアクター名が foobar の場合、Mastodon 系ならばアクターの ID はそのまま foobar だが、Misskey 系はそれとは別にある程度ランダムな英数字の文字列が ID として割り振られている。アドレスとして
`https://Misskey系インスタンス/@foobar`
は
`https://Misskey系インスタンス/users/ある程度ランダムな英数字の文字列`
のエイリアス、というか、下のアドレスは上へリダイレクトされる。
なので webfinger を使って rel => self の href の値を求め、そのアドレスへヘッダに "Accept: application/activity+json" を加えて GET リクエストを送り、返ってくる json の inbox タグの値を求める必要がある。
```bash
URL=$(curl https://Misskey系インスタンス/.well-known/webfinger?resource=acct:foobar@Misskey系インスタンス | jq -r '.links[] | select (.rel == "self")'.href)
INBOX=$(curl -H "Accept: application/activity+json" $URL | jq .inbox)
```

Mastodon 系は(現時点では)ヘッダの Date Digest だけを \n で繋げて署名すれば良かったが、Misskey 系は request-target (POST タグの2番めまでの値。POST /users/foobar/inbox HTTP/1.1 ならば、"post /users/foobar/inbox") と Host も求められるようである。


## やること
それ以外は前回とほぼ同じである。前回と違うのは上述の通り。
- webfinger にリクエストを送り、ID (URL) と inbox のアドレスを取得し
- request-target date host digest を \n で繋げたものに署名する

前回は引数で like する ID と、その投稿者の inbox を与えていたが、今回は上述の理由(インスタンスとアクター名を webfinger に入れてアクターの ID を取得しなければならない)のため、対話的に投稿者のインスタンスとアクター名、投稿の ID を入力することにする。ついでに自分のインスタンスとアクター名もここで指定することにする。
```bash:post_like.sh
#!/bin/bash


# 自分のインスタンスとアクター名を @アクター名@インスタンス名 で入力
read -p "@myself@my_instance: " MY
MY_arry=(${MY//@/ })
myself=${MY_arry[0]}
my_instance=${MY_arry[1]}
echo

# 投稿者ののインスタンスとアクター名を @アクター名@インスタンス名 で入力
read -p "@to@to_instance: " TO
TO_arry=(${TO//@/ })
to=${TO_arry[0]}
to_instance=${TO_arry[1]}
echo

# like したい投稿の ID を入力
read -p "which id do you wanna like?: " target_post
echo

unixtime=$(date "+%s")

# 投稿者のインスタンス・アクター名から URL と inbox を取得。また " を外しておく
URL=$(curl https://$to_instance/.well-known/webfinger?resource=acct:$to@$to_instance | jq -r '.links[] | select (.rel == "self")'.href | tr -d "\"")
INBOX=$(curl -H "Accept: application/activity+json" $URL | jq .inbox | tr -d "\"")
# request-target は https://インスタンス 以下である(よって最初に "/" を付ける)
REQUEST_TARGET=$(echo  "/"$(sed -E 's/^.*(https):\/\/([^/]+).([^/]+)/\3/g' <<< $INBOX))

sed -e "s/{id}/$unixtime/g" like.json > live
sed -i "s/{myself}/$myself/g" live
sed -i "s/{my_instance}/$my_instance/g" live
sed -i "s|{target_post}|$target_post|g" live

body=$(cat live | jq -c .)
digest_val=$(echo -n "$body" | sha256sum | xxd -r -p | base64)
date_now=$(date -uR  | head -c -6 | sed -e 's/$/GMT/')

signature_headers="(request-target): post ${REQUEST_TARGET}\ndate: ${date_now}\nhost: ${to_instance}\ndigest: SHA-256=${digest_val}"
echo -e "$signature_headers" > 4_sig_headers # 後に見返すためにファイルに
sig_val=$(echo -en $signature_headers | openssl dgst -binary -sign ./personal/private -sha256 | openssl enc -A -base64)
signature="Signature: keyId=\"https://${my_instance}/users/${myself}#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) date host digest\",signature=\"$sig_val\""


curl -H "Date: $date_now" -H "Digest: SHA-256=$digest_val" -H "$signature" $INBOX -d "$body"
```

基本は前回と変わらないが、微細な違いはコードとコメントを読んでいただきたい。
もちろん Mastodon 系の投稿にもこれで like できるので、以降このスクリプトを基本として他のアクティビティも書く。
AIX Tips: VG typeを見分けるスクリプト例

### 備忘

AIXではnormal, big, scalableといったtypeのVGをサポートしている
これらの判別をスクリプトで行なう例を示す

## 確認環境
- AIX 7200-04-00-0000, 7300-01-01-2246
- C locale


## スクリプト例
```ksh
#! /usr/bin/ksh

vg=$1

MAX_PPs_per_PV=$( lsvg $vg | sed -n "s/^.*MAX PPs per PV://p" | awk '{print $1}' )

if [[ -n $MAX_PPs_per_PV ]]; then
  MAX_PPs_per_VG=$( lsvg $vg | sed -n "s/^.*MAX PPs per VG://p" | awk '{print $1}' )
fi

if [[ -z $MAX_PPs_per_PV ]]; then
  echo scalable vg
elif [[ $MAX_PPs_per_VG == 32512 ]]; then
  echo normal vg
elif [[ $MAX_PPs_per_VG == 130048 ]]; then
  echo big vg
fi


```

- lsvgコマンド出力に MAX PPs per PV: が存在しない場合、scalable vg としている
- normal vg か big vg かの判断は、MAX PPs per VG: の値を利用

## 注意
このスクリプトはAIXのレベル差異などにより意図通り動作しない可能性がある。業務で使用するには、対象レベルでの動作検証を行なっておくこと。
2024/1/16主にITとかセキュリティの記事

GitHubの悪用が増加、サイバー犯罪者に大人気の理由は(1/14)
https://news.mynavi.jp/techplus/article/20240114-2861799/

生成AIによるバグレポートが厄介、頭を抱える開発者(1/14)
https://news.mynavi.jp/techplus/article/20240114-2860400/

TypeScript(Next.js)のCIをGitHub Actionsで構築してみる！(1/14)
https://qiita.com/Senritsu420/items/f51a7eff81a8c1372302

企業の危機管理担当者必見「2024年のリスク予測」(1/14)
https://www.risktaisaku.com/articles/-/87299

VPN大手フォーティネット、脆弱性対策強化　攻撃を遮断(1/14)
https://www.nikkei.com/article/DGXZQOUC0541C0V00C24A1000000/

鳥取県食パラダイス推進課の公式インスタ乗っ取られる　フォロワーに不審なメッセージ　県が注意呼びかけ(1/14)
https://news.yahoo.co.jp/articles/620da7f86d6cae19d3f25f9fbfdf8bb540b514ff

不正アクセスで300万円詐取　容疑で中国籍の男を逮捕　沖縄など9県合同捜査本部(1/14)
https://nordot.app/1119123960056824596

18歳ハッカーが人気ゲーム映像をリーク　医療刑務所で無期限の懲役刑に…(1/14)
https://nordot.app/1119144993019806525

ロシアのサイバー攻撃でウクライナの通信網ダウン、日本も狙われていると思え(1/14)
https://news.yahoo.co.jp/articles/1c907d539a593138b6016fb2379f6860bad6e5fa?source=rss

2段階認証ではスマホの故障に備えよう、固定電話などをサブの認証方法に設定(1/15)
https://xtech.nikkei.com/atcl/nxt/column/18/02676/120500007/
Cloud Logistics ERP Software for Automated Operations

At LogixGRID, we are a team of experts in logistics and tech professionals who are working towards empowering fellow logisticians. Founded with one sole purpose to introduce cutting edge technology to all kinds of logistics service providers. LogixGRID offers cloud based logistics software that helps automate the entire logistics business operations and reduce human error. We are committed to building long-term relationships with our customers/partners by leveraging our technology skills, domain expertise and process to build world-class products. We have more than 40+ carriers and major eCommerce integrations associated with the system that helps you run operations smoothly. Currently being used in 16+ countries.
![Something went wrong]()

https://logixgrid.com/about-us/
Pythonで「関数の定義と関数の呼び出し」の動作を確認してみた

# 概要

Pythonで「関数の定義と関数の呼び出し」の動作を確認してみました。
以下のページを参考にしました。


https://www.javadrive.jp/python/userfunc/index1.html

# 実装

以下のファイルを作成しました。
```sample.py
def myfunc():
    print("Hello")

myfunc()

def myfunc():
    print("Hello")

myfunc()
myfunc()
val = myfunc()
print(val)

def 挨拶():
    print("こんにちは")

挨拶()

def Sample():
    print("Hello")

def sample():
    print("bye")

Sample()
sample()

print(abs(-5))
def abs(num):
    return 0

print(abs(-5))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Hello
Hello
Hello
Hello
None
こんにちは
Hello
bye
5
0
```

# まとめ

何かの役に立てばと。
UnityRoomで動かす!Addressables個人的メモ(デプロイ編)

## 概要
UnityRoom用に作成したゲームで、Addressablesを用い、サーバー上でアセット管理をするための備忘録です
ストレージにはS3を採用し、CloudFront distributionを経由します

## 環境
Unity2022.3.11f
S3
CloudFront

## 手順
(1)S3のバケットを作成する
・「アクセス許可」内のブロックパブリックアクセス (バケット設定)をオフにする
・「アクセス許可」内のCross-Origin Resource Sharing (CORS)をよしなに設定する
``` :CORS例
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]
```

(2)CloudFrontのディストリビューションを作成する
・作成したS3バケットをオリジンドメインとして指定

(3)Unity上でAddressablesアセットビルドする
・AddressableProfilesのRemote側をCustomに変更し、Remote.LoadPathをCloudFrontのディストリビューションドメインに変更

(4)Unity上でWebGL向けにビルドする
・Compression FormatをGzipに変更

(5)StreamingAssetsをアップロードする
・ビルドファイル内の「StreamingAssets」内のファイル等をS3バケットにアップロード

(6)loader.jsを編集する
・ビルドファイル内の「Build」内の「hogehoge.loader.js」のstreamingAssetsUrl(2か所)を作成したCloudFrontのディストリビューションドメインに書き換え

``` :変更をかける箇所
~
streamingAssetsUrl:"https://hogehoge.cloudfront.net"
~
l.streamingAssetsUrl="https://hogehoge.cloudfront.net"
~

```

(7)UnityRoom上にビルドファイルをアップロードする
・4種ファイルをアップロード

おわり

## 参考

https://im0039kp.jp/%e3%80%90unity%e3%80%91addressables%e3%81%a8aws%e3%81%aes3%ef%bc%8bcloudfront%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6%e3%82%b5%e3%83%bc%e3%83%90%e3%81%8b%e3%82%89%e3%82%a2%e3%82%bb%e3%83%83/

https://note.com/metaformingpro/n/n67d44d6d8452

https://zenn.dev/uimss/articles/9912f9d7147853

https://qiita.com/att55/items/2154a8aad8bf1409db2b
【JavaScript】URL文字列が有効か判定する方法

## `try...catch`を使用する

`URL()`コンストラクターが与えられたURL文字列が有効でなければ例外をスローすることを利用して以下のように判定します。

```js
function isValidURL(url) {
  try {
    new URL(url)
    return true
  } catch {
    return false
  }
}
```

https://developer.mozilla.org/ja/docs/Web/API/URL/URL


## `URL.canParse()`を使用する

`URL.canParse()`の引数にURL文字列を渡すことで有効か判定できます。

```js
function isValidURL(url) {
  return URL.canParse(url)
}
```

https://developer.mozilla.org/ja/docs/Web/API/URL/canParse_static

## 参考

https://developer.mozilla.org/ja/docs/Web/API/URL#%E4%BD%BF%E7%94%A8%E4%B8%8A%E3%81%AE%E6%B3%A8%E6%84%8F
【Unity初心者必見】爆速で初心者を抜け出すためのUdemy講座

# 皆さんこんにちは！

私は、ミラーワールドという地球をデジタルでまるまる再現し、アバターを通じて世界中どこへでも体験することができるプロダクトを開発しています。最近Unityを勉強し始めたのですが、正直言ってUnityは難しいです。勉強がなかなか前に進まず、挫折しそうです。そんな方はたくさんいらっしゃるかと思います。

そんな方々に非常におすすめのUdemyのUnity講座を紹介したいと思います。私は様々なUnityに関する書籍を読んで、挫折を繰り返してきましたが、最も挫折しないような講座になっていると感じたものを紹介します。それはこちらです！↓

[【最短でUnityプログラム脱初心者を目指します！】もっと早く教えてほしかった！Unity C#プログラミング入門](https://www.udemy.com/course/unity-c-sharp-beginner/)

こちらのUnity講座を一通り終わらせてみた感想をこの記事に書きたいと思います。

評価項目としては、

- 内容は理解しやすいか？
- 内容は濃いか？
- Unityはできるようになるか？

の3つで感想を書きたいと思います。

### **▢内容は理解しやすいか？**

理解は非常にしやすい内容になっています。最初に何を勉強するのかを説明し、その後図を用いながら簡単に内容の概念を説明しています。

図を用いて説明した後には、プログラミングのコードを見せながら簡単なチュートリアルを行っています。
### **▢内容は濃いか？**

内容は初心者への理解を主軸としているようですので中濃くらいかと思います。

比較対象としては、英語にはなりますがアンジェラの[WebBootCamp](https://www.udemy.com/share/101qYw3@oOgQs_D2cfhj3ntP4LblWLBSbeYTFu-IdonrkRlIaCQWeKC-X2XebFlMNpbNKxOUlQ==/)の62時間と比較すると学習時間は18時間と短いです。ビジネス系のUdemyでは学習時間が4時間ほどのものもたくさんありますが、プログラミング系の講座内容においては、日本人向けのものは10時間以内が多い中、18時間の内容を提供しているのは、内容が濃いと言えるでしょう。

### **▢Unityはできるようになるのか？**

初心者は確かに脱出することができると思います。なぜなら、基本的なUnityコーディングの知識だけでなく、オブジェクト指向に関する簡単な内容も扱っているため、UnityとC#に関する基本中の基本はしっかりと学べる内容になっています。

### **▢誰が買うべきか？**

買うべき対象は以下の3パターンかと思います。

1. Unityを触ったことがない方
2. Unityを勉強したけど、挫折した方
3. 本で勉強しているけどエラーが発生して前に進みづらい方

1と2については、Unity初心者であればこの講座は非常におすすめです。3については、本での学習経験がある私自身、本ではページをめくるのが大変であり、持ち運びも困難なことから、初心者向けの学習にはこの講座が適していると感じています。

### **▢私が工夫した勉強法**

最後に、私がUnityの勉強をする上で工夫した勉強法を紹介します。

プログラミングや言語学習、筋トレなど、習慣化の際に挫折する主な理由は、「理解できないこと」と「前に進んでいる感覚がないこと」の2つに大別できると思います。どんなにやる気があっても、レベルに合っていない内容は理解が進まず、やる気が出ません。また、レベルが合っていても前に進んだ感覚がなければ、続けるのは難しいですよね。

この2つの理由を解消するための勉強法がこちらです。
### **▢私が工夫した勉強法**

最後に、私がUnityの勉強をする上で工夫した勉強法を紹介します。

プログラミングや言語学習、筋トレなど、習慣化の際に挫折する主な理由は、「理解できないこと」と「前に進んでいる感覚がないこと」の2つに大別できると思います。どんなにやる気があっても、レベルに合っていない内容は理解が進まず、やる気が出ません。また、レベルが合っていても前に進んだ感覚がなければ、続けるのは難しいですよね。

この2つの理由を解消するための勉強法がこちらです。

### **ChatGPT大先生に解説＆問題出しをやってもらう**

という方法です。

理解を促進するためにエンジニアBotに対して大きく分けて2つのことを対話することで、挫折を防ぐことができます。プロンプトもご提示します。

1. **わからないことの解説**
2. **復習問題と解答の提示**
    1. **初心者用**
    2. **上級者用**

**わからないことの解説のプロンプト**

:::note info
📖 あなたはプロのゲームエンジニアであり、UnityとC#に非常に長けています。

下記の分からない内容をわかりやすく解説してください。

▢分からない内容
・～
・～

上記の分からない内容を理解するのに躓くポイントを列挙してください。

その躓くポイントを解消するようにわからない内容を解説してください。
:::

:::note info
📖 あなたはプロのゲームエンジニアであり、UnityとC#に非常に長けています。

下記の分からない内容をわかりやすく解説してください。

▢分からない内容
・～
・～

小学生でもわかるようにわかりやすく説明してください。
その後普通に解説してください。
その後一言でまとめて解説してください。その後、なんのためにそれがあるのかを一言でまとめてください。
:::

**復習問題と解答の提示**
    1. **初心者用**
    2. **上級者用**

下記例です。

:::note info　
あなたはプロのゲームエンジニアであり、UnityとC#に非常に長けています。
if文やswitch文の理解が深まるような問題を初心者向けに作成してください。
その後、解答を提示し、わかりやすくコードについて解説してください。
:::

※初心者を上級者に変更可。


これらの方法を活用することで、Udemy×ChatGPT活用によって普段のUnityの学習をより効果的に進めることができると思います！学ぶ過程での挫折を加速に変え、日々の勉強を充実させることが可能になります。
LiveComponentに閉じた非同期処理の書き方

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

LiveViewのコンポーネントである「LiveComponent」は、他SPA FW同様、画面パーツおよびパラメータのコンポーネント化に便利です

https://hexdocs.pm/phoenix_live_view/Phoenix.LiveComponent.html

しかし、LiveComponent内で閉じた非同期処理は、1つ前のバージョンであるLiveView 0.19までは実現がやりにくかったです

最新バージョンであるLiveView 0.20以降では、これがカンタンに実現できるようになったので、下記にコードを示します

ポイントは、LiveView 0.20で追加された `assign_async` と `handle_async` の連携です

```diff_elixir:lib/basic_web/live/sample_live/index.ex
defmodule BasicWeb.SampleLive.Index do
  use BasicWeb, :live_view
end

defmodule HeroComponent do
  use Phoenix.LiveComponent
  def mount(socket), do: {:ok, assign(socket, :list, [])}
  def handle_event("say_hello", _, socket), do: {:noreply, assign_async(socket, :list, &run/0)}
  def handle_async(:result, {:ok, result}, socket), do: {:ok, socket}
  def run() do
    Process.sleep(1000)
    {:ok, %{list: [:rand.uniform(10)]}}
  end
  def render(assigns) do
    ~H"""
    <a href="#" phx-click="say_hello" phx-target={@myself}>
      <p>Say hello!</p>
      <p><%= inspect @list %></p>
    </a>
    """
  end
end
```

下記で試してみてください

```diff_erb:lib/basic_web/live/sample_live/index.html.heex
<.live_component module={HeroComponent} id="hero" />
```

```diff_elixir:lib/basic_web/router.ex
defmodule BasicWeb.Router do
  use BasicWeb, :router
…
  scope "/", BasicWeb do
    pipe_through :browser

    live "/sample", SampleLive.Index, :index

    get "/", PageController, :home
  end
…
```
【Unity】Glow Shader

## 概要
Sprite用のGlowShaderです。
キャラクターとかに色をつけてバッドステータス風にもできますし、ColorIntensityを調整して点滅させるような演出とかも出来そうです。

通常
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112894/b52e27f8-841f-b8a2-353c-eb4e00736a59.png)

毒っぽい感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112894/dfb4e25c-69a4-895d-151d-c56f5dc3e50f.png)

## 実装
```
Shader "Custom/Glow"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [NoScaleOffset] _GlowTex ("Glow Texture", 2D) = "white" {}
        _GlowColor ("Glow Color", Color) = (1, 1, 1, 1)
        _Glow("Glow Color Intensity", Range(0, 100)) = 10
        _GlowGlobal ("Global Glow Intensity", Range(1, 100)) = 1
        _EditorDrawers("Editor Drawers", Int) = 6
    }
    SubShader
    {
        Tags {
            "RenderType"="Transparent"
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderPipeline"="UniversalPipeline"
        }
        LOD 100

        Pass
        {
            Name "ForwardLit"
            Tags { "LightMode"="UniversalForward" }

            Cull Off
            Lighting Off
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma shader_feature GLOWTEX_ON
            // make fog work
            #pragma multi_compile_fog

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
                half4 color : COLOR;
            };

            struct Varyings
            {
                float2 uv : TEXCOORD0;
                // フォグの計算で使うfog factor用のinterpolator
                float fogFactor: TEXCOORD1;
                float4 positionHCS : SV_POSITION;
                half4 color : COLOR;
            };

            sampler2D _MainTex;
            sampler2D _GlowTex;
            half4 _GlowColor;
            half _Glow, _GlowGlobal;

            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            CBUFFER_END

            Varyings vert (Attributes v)
            {
                Varyings o;
                o.positionHCS = TransformObjectToHClip(v.positionOS.xyz);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.fogFactor = ComputeFogFactor(o.positionHCS.z);
                o.color = v.color;
                return o;
            }

            half4 frag (Varyings i) : SV_Target
            {
                half4 col = tex2D(_MainTex, i.uv);
                half4 emission;
                #if GLOWTEX_ON
                emission = tex2D(_GlowTex, i.uv);
                #else
                emission = col;
                #endif
                col.rgb *= _GlowGlobal;
                emission.rgb *= emission.a * col.a * _Glow * _GlowColor;
                col.rgb += emission.rgb;
                return col;
            }
            ENDHLSL
        }
    }
    // CustomEditor "GlowShaderMaterialInspector"
}
```
Elasticsearch について調べてみた

社内サービスの検索エンジンでElasticsearchというものを使っているのですが、Elasticsearchについてまだまだ知識が足りないので、まとめて整理してみました

## Elasticsearchとは
公式には以下の記述が。
>Elasticsearchは、様々なユースケースを解決する分散型RESTful検索/分析エンジンです。データを一元的に格納することで、超高速検索や、関連性の細かな調整、パワフルな分析が大規模に、手軽に実行可能になります。Elastic Stackの心臓部となるプロダクトです。

## Elasticsearchの特徴

### 全文検索
全文検索エンジンとは、大量にあるドキュメントデータの中から指定したキーワードを含むドキュメントデータを素早く検索するための仕組み。

### 高速検索処理
- 全文検索のための有限状態トランスデューサを使用したインデックス
- 分析用カラムストア
- 数値データ・地理データを格納するためのBKDツリー

↑により、繰り返し検索・広範囲検索などの実行が簡単となるためデータ活用性をさらに向上させることが可能

### 多様なクエリに対応
- テキスト
- 構造化データ
- 非構造化データ
- 数値
- 地理情報
- メトリック　　など

公式を見ると、その他にもたくさんの機能があるようです。
https://www.elastic.co/jp/elasticsearch

## Elasticsearchの基本概念
- インデックス
データを保存する場所で、RDBでいうテーブル。検索を目的としているため元文書の格納は必ずしも必要ない。

- ノード・クラスタ
可用性・耐障害性を実現するため、複数のサーバー上で実行。このサーバー群をクラスタ、個々のサーバーとノードという。

- レプリカ
それぞれのノードにはシャードのレプリカが存在。更新はもちろんプライマリのシャードに対して行われますが、万が一プライマリのシャードが失われると新しくレプリカのシャードがプライマリとなる。

- シャード
大量のデータを使う際、それぞれのノードでデータを分割して保持。その時にシャードと呼ばれる部分インデックスで分割。

## おわりに
Elasticsearchの特徴を見る限り、Elasticsearchはさまざまな方法で手にしたい情報に辿り着く手段を備えていることから、かなり優れた検索エンジンであることがわかりました。
次回はRuby環境でElasticsearchを利用する一例についてまとめていこうと思います。
Java学習 リスト ArrayList

# リスト
リストは、Rubyの配列と似たデータ管理の仕組みで、以下の特徴がある。

* 要素を順序づけて管理する
* 要素を事後的に追加したり削除できる

また、Javaのリストには、以下の2種類がある。

* ArrayList
* LinkedList

ArrayListの方が使用頻度が高い。

# ArrayList

ArraListは「可変長配列」を使用するための仕組み。
可変長配列とは、文字通り長さ（要素数）を変更できる配列のこと。

Rubyの配列は可変長なので、Javaの配列よりもArrayListの方が性質や使い方が近い。

## ArrayListの使い方

```java
import java.util.ArrayList;

class Main {
  public static void main(String[] args) {
    ArrayList<Integer> scores = new ArrayList<Integer>();

    scores.add(1);
    scores.add(5);
    scores.add(10);
    scores.add(15);

    System.out.println(scores.get(0));
    System.out.println(scores.get(1));
    System.out.println(scores.get(2));
    System.out.println(scores.get(3));
  }
}
```

以下が実行結果
```java
1
5
10
15
```

### ArrayListを使用する際の手順

1. ライブラリをインポートする
2. ArrayListの宣言を行う
3. ArrayListに値を代入する
4. ArrayListから要素を取り出す

### 1. ライブラリをインポートする
ArrayListを使用する際は、ライブラリのインポートが必要になる。
インポートするには、ファイルの冒頭に以下の記述を行う。

```java
import java.util.ArrayList;
```


### 2. ArrayListの宣言を行う
ArrayListの宣言と初期化は以下のように行う。

```java
ArrayList<データ型> scores = new ArrayList<データ型>();
```

先述のコードでは、整数を格納するArrayListを作成したので、以下のように記述した。


```java
ArrayList<Integer> scores = new ArrayList<Integer>();
```

ここでは、以下の２つの動作を行っている。

1. 整数（Integer）を格納するArrayListを「scores」という名称で宣言
2. ArrayListの要素を作成

そして、 1 に 2 を代入している。

また、右辺でも要素のデータ型を指定していますが、これは省略が可能。
以下のように記述しても問題なく動作する。

```java
ArrayList<Integer> scores = new ArrayList<>();
```
右辺の `Integer` の記述を省略している。

### 3. ArrayListに値を代入する

ArrayListに要素を追加するためにはaddメソッドを使用する。
記述は、add(要素として追加する値)のように行います。
先述のコードでは、scoresという名称のArrayListに「1」「5」「10」「15」を追加している。

```java
scores.add(1);
scores.add(5);
scores.add(10);
scores.add(15);
```

addメソッドを使用すると、要素はArrayListの末尾に追加される。

### 4. ArrayListから要素を取り出す

要素を取り出す際は、getメソッドを使用する。

記述は、get(取得したい要素のインデックス） のように行う。
配列から要素を取り出す際と同様に、「1番目」の要素を取り出したい時は、インデックスとして「0」を指定する。

先述のコードでは、scoresから、1番目、2番目、3番目、4番目の順に要素を取得している。

```java
scores.get(0)
scores.get(1)
scores.get(2)
scores.get(3)
```
AIチャレンジ racing 現在１位のパラメータを公開！！

# はじめに
<!-- 発端や概要を記載 -->
皆さんはAIチャレンジの取り組みはどうですか。
1月15日(月)現在、私たちiASLが１位を取っている現状です。
ここで、私たちのAIチャレンジのレポジトリを公開しようと思います。参考にしていただけると幸いです。

testというブランチにはいっていると思います。（多分）
[iASL-Github](https://github.com/iASL-Gifu/aichallenge2023-racing/tree/test)


自分がどこのパラメータをいじったかを軽く紹介します。

# 目次
[1.Map](#1-map)
[2.lookaheadgain](#2-lookaheadgain)
[3.制御系自作パッケージ](#3-制御系自作パッケージ)
[4.おわりに](#4-おわりに)

# 1. Map
過去の[私の記事](https://qiita.com/Arata-stu/items/6708b7604d97c8dfa0ba)でMapファイルの編集について書いています。VectorMapBuilderを利用したことがない方はそちらもぜひ参考にしてください。

Map編集で大事なことは、速度、経路の主に２つになります。ストレート区間ではしっかりアクセルを踏み込み、次のコーナに向けてぎりぎりまで攻めています。また、コーナでは、速度とライン（トレードオフ）を調整し、最適解を探します。特に第１コーナセクションはルート取りが一番むずかしかったと感じています。アクセルやブレーキを変更すると、マップの調整も必要になるので結構世話のかかる問題児ですが、タイムの短縮には欠かせない作業です。

以下は私なりのコツです。
・NPC車両はイン側（主に右側）を走行する。　
→　その逆に経路を生成すると簡単に避けれる。

・カーブ途中でlaneを分けない。　
→　１度が制御が入力されない時間が生まれる？（やってみるとわかります。アウトに膨らむと思います。）

・ブレーキは段階的に。
→　車は球には止まれない。（もしかしたら違うかも）

細かいことは、実際にファイルを見てみてほしいです。
# 2. lookaheadgain
こちらも、[過去の記事](https://qiita.com/Arata-stu/items/4b03772348dca4f7ef89#Chapter1)で紹介しています。
私たちは、これを0.25あたりに設定しています。（初期は0.4）第一コーナを抜けたあと、ゆるやかなカーブがあると思います。そこで、アクセルを踏むために調整しています。スピードが乗った状態で経路追従するために低めに設定しました。

注意点は、急ハンドルになりがちなことです。人は快適には乗れませんね。
# 3. 制御系自作パッケージ
こちらは、自作のアクセルブレーキの制御のパッケージになります。Autoware Micro既存の制御を利用しても良いのですが、accel、 brake map.csvというものを編集しないといけません。[こちらの記事](https://zenn.dev/ttanaka3/articles/4c1b6dea256ea5)から参照しました。このファイルが個人的に読みづらかったのと、編集するのが難しいと感じたため、自作でつくることにしました。自作パッケージの作り方については、またAIチャレンジのすゝめの方で紹介しようと考えています。

このパッケージが何をしているかだけ簡単に紹介します。
入力:現在速度、目標速度（laneletで定義される制限速度）
出力:アクセル、ブレーキ


現在速度と目標速度の差を利用し、どのくらいアクセル、ブレーキを踏むかを出力しています。はじめは、フルスロットルで加速し、目標速度に近づくにつれ、アクセルを弱めていくような感じです。

この手法の注意点は、目標速度付近になると、アクセルをほとんど踏まなくなことです。150km目標のとき、145kmくらいからは、ゆっくりな加速となります。本当に150km出したいときは、制限速度をあえて160kmくらいに設定し、加速をうながしましょう。

ここにノードを追加しています。
![autoware-micro-node-diagram-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673708/7ee99d56-5c34-32cd-6c31-9d49134903b0.png)

# 4. おわりに
非常にざっくりした紹介になってしまいましたが、意外と手をつけていることは少ないです。これからまだ、改善点があると思うのでお互いに頑張っていきましょう。気になった方はぜひiASLのgithubを活用してください。

ここらで、私たちは学生実験に取り組まないといけません。(単位のために！！！)では、次回まで！
<a id="#reference"></a>
# 参考文献
- [AIChallenge入門ガイド(2)](https://zenn.dev/ttanaka3/articles/4c1b6dea256ea5)
ようつべ体験記14

[前回](https://qiita.com/matsukatsu/items/e84221513425bcf6f4dd)の投稿から2ヶ月半ほど空いてしまいました。
転職、退職など諸々の活動があり、動画投稿は続けていたもののブログまで書いていられませんでした。

さて、2ヶ月前は何をしようとしていたのでしょう...

- インプレッション数と視聴回数を右肩上がりの状態に戻す事
    - 13日間公開して低く停滞してしまう動画は、さっさと非公開にしてしまう

- 通常の3倍ぐらいのスピードで視聴回数を稼ぐ動画
    - 次はこれ以上の動画を出さないと足を引っ張りそうで辛い

などと申しておりました。


### 全体の振り返り
ひとまず、2ヶ月半のチャンネル全体の動向を振り返ってみます。
前回から11本動画を公開しました。
運用ルールに則って5本の動画の評価が良くなかったので非公開にしました。

![Frame 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/32d74592-fa67-0f29-5d6f-7b7c1c151b93.png)

通常の3倍見られた動画以降の成績を、野球で例えるとこんな感じだったように思います。

1. ホームラン
1. 内野ゴロ(非公開)
1. 二塁打
1. 三振(非公開)
1. 三振(非公開)
1. 三振(非公開)
1. 三振(非公開)
1. 振り逃げ
1. ヒット
1. 三塁打
1. 二塁打
1. ヒット

ホームラン以降の1ヶ月半ほど、かなり苦戦が続きました。
ホームランにあやかった動画で相乗効果を得たいと思って出したものが、ことごとくスベりました。


### インプレッション数、視聴回数
「インプレッション数と視聴回数を右肩上がりの状態に戻す」と当時は言っていました。
視聴回数を Daily、Weekly、Monthly で見たグラフを貼ります。
![スクリーンショット 2024-01-15 14.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/61b921a9-c3d7-e266-7bdc-7316fe83e925.png)

実際には Daily でみた場合にはかなり上がり下がりするし、週や月単位での変動もしています。
開始から1ヶ月半の時点では Daily の視聴回数が右肩上がりに見えていましたが、4ヶ月半継続してみたところ、Daily で一本調子の右肩上がりは高すぎる目標だとわかりました。

Weekly でみた場合も、すごくウケた時だけかなり上がって、そこからは次のウケまで下がり続けるという形になっています。
チャンネルの成長を継続できているかを測るのは Monthly でみた場合に右肩上がりが維持できるかどうか、ぐらいで今は良さそうに思います。
そういう見方をした場合、全期間を通してだいたい右肩上がりにできてはいました。

これまでは9月中旬に落ち込んだ事を気にしてきましたが、それよりは12月の落ち込みの方がチャンネルへの影響は大きそうです。
11月中旬から12月上旬にかけて三振の山を築いた事で、12月のインプレッションが極端に減り、結果として視聴回数が11月より減ったようです。

三振続きだった理由はホームランにあやかろうと何度か挑戦したのですが、出し方がまずく乗せられなかった為です。
失敗は失敗なのですが、その後に出た三塁打は失敗の反省を生かして上手く合わせられたものなので、失敗はあったものの成功の糧になりました。
克服できたはずなので、今後は気にしないで良いと思っています。


### 通常の3倍ぐらいのスピードで視聴回数を稼ぐ動画の後
上でも触れましたが、やはり三振が続きました。
ここでの失敗から、ホームランの勢いに乗せるには「関連するテーマ」というよりは「ほぼ同じもの」を出すべきだったとわかりました。
その後、三塁打となった動画は、以前出した動画が伸びてきたのに合わせてほぼ同じものを出したことで、公開から2週間に関しては通常の2倍ほどの視聴回数を稼ぐ動画にすることができました。
以前出した方もそれなりに伸びていたので、今回に関してはそちらの勢いを削ぐこともなさそうでした。

ちなみに `3.二塁打` は、ホームランの勢いを殺したくなかったので、ホームランとなった動画とは関係がないテーマで、おそらく当たるだろうというものを出したものです。


### 今後
そろそろ、用意していたネタが尽きてきました。
不評だった動画は非公開にしていってるので、しばらくはそれらのリメイクや従来とは別のアイデアを試してチャンネルを継続してみようかと思います。

![チャンネル登録者数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/3806b909-cc8b-3284-afce-bbfc18a4b359.png)

現時点でチャンネル登録者数が 66 まできました。
100 も感じられるところまで来たので、ひとまず 100 までいくとどうなるのかは体感してみたいと思います。
Laravel 10でCloudWatchにログを保存しようとするとMonolog\LogRecord $recordでエラーになる

# はじめに
以前は使用できていた`maxbanton/cwh`のライブラリが
Laravel 10で使用できない状況に陥ったので対処策を入れてみました。

# 本編
## 事象について
AWS✖️Laravelでログ機能をCloudWatchで実装する際に
以下のライブラリを使用しようとするとエラーが出ることが判明しました。

https://github.com/maxbanton/cwh

Laravel 10より以前は使えていたのですが、
どうやらLaravel 10でMonolog 3にアップデートにされたことに伴い、
Monologの引数が配列→`Monolog\LogRecord`に型が変わったために
以下のようなエラーが発生し、実行できなくなっていたようです:sob:

```
Declaration of write(array $record) must be compatible with write(Monolog\LogRecord $record)
```

## 解決策

ライブラリのファイルを複製して
該当箇所の型を書き換えたハンドラークラスを作成することで
無事に実行できるようになりました:ok_hand:


一例として置いておきます。

【前提】　
```composer require maxbanton/cwh```をインストールして
使用しようとしていたものと想定しています。

【解消方法】

1. 以下に格納されているライブラリの実体ファイルをコピーし、
自分のプロジェクト配下に配置する（以後`MyCloudWatch`クラスとする）

    ```
    ./vendor/maxbanton/cwh/src/Handler/CloudWatch.php
    ```

2. （tanerincode 氏のコミットを参考に）変更内容を反映する

3. 元の`CloudWatch`クラスを使用している実装箇所を、
`MyCloudWatch`を向くように置き換える

```php
use Maxbanton\Cwh\Handler\CloudWatch;

class hoge{
  public function huga(){

    $handler = new CloudWatch(....略....）;
  
  }
}
```

↓
```php
use MyHandler\CloudWatch;

class hoge{
  public function huga(){

    $handler = new CloudWatch(....略....）;
  
  }
}
```

# おわりに
国内外問わず開発者さんのGithubなどに上がっているソースコードを見てみると
ありがたいことに解消PRが見つかったりしますね:bow:
英語を恐れず（Google翻訳をお供に）根気強く探してみることが
大事だなと改めて認識するなどしました。

# 参考記事

https://qiita.com/matsumura-yzrh/items/c12ca5d67d1edf393625#monolog-%EF%BC%93%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%AB%E3%82%88%E3%82%8Blog-records%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E5%A4%89%E6%9B%B4

# Special Thanks!! :)

tanerincode 氏:sunglasses:

https://github.com/maxbanton/cwh/pull/117/commits/092c3bec6e8e80bdc526326641e4fa8cf26e669d

ちいかわ部隊の皆さん（身内ネタ）
コマンドラインからtsvファイルの３列目が最も大きく、かつ、４列目が最も小さい行を出力したい

コマンドラインからtsvファイルの３列目が最も大きく、かつ、４列目が最も小さい行を出力したい

具体的には以下のようなtsvファイルが対象

```test.tsv
// tsvファイルの３列目が最も大きく、かつ、４列目が最も小さい行を出力したい
xxxx	128.602585	47.06927	263.6026	false	false
xxxx	224.301987	47.69094	379.302	false	false
xxxx	225.673233	47.60213	355.673218	false	false
xxxx	235.9356	47.95737	395.9356	false	false
xxxx	246.987518	100	371.987518	true	false
xxxx	254.395447	100	434.395447	true	false
xxxx	372.219635	100	1012.2196	true	false
```

以下のようにすればOK
3列目の最大値を取得し、3列目が最大値のものを4列目で昇順ソートする
（追記）タブは環境によって上手く区切れたり区切れなかったりしたので一度スペース(" ")に置換してから処理すると安定した、、もっといい方法がある気はする、、

```bash
FNAME="test.tsv"
MAX_K3=`cat ${FNAME}/result.tsv | sort -nr -k3 | head -1 | cut -f3`
BEST_TIME_LINE=`cat ${FNAME} | sed -e 's/\t\+/ /g' | awk -F" " '$3 ~ /'${MAX_K3}'/ {print $0}' | sort -n -k4 | head -1`
BEST_TIME=`echo "${BEST_TIME_LINE}" | cut -d" " -f3-4 | tr " " "_"`
```
```
$ echo ${BEST_TIME}
100_371.987518
```

もっといい方法がありそうな気がする、、

# 参考

https://qiita.com/miminashi/items/a0d22ada995b8bbdff16

https://scrapbox.io/t-Impression/csv%E3%82%92grep

https://ksomemo.github.io/contents/qiita/awk%E3%81%AE%E4%B8%AD%E3%81%A7%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E5%A4%89%E6%95%B0%E3%82%92%E6%89%B1%E3%81%86.html

https://gist.github.com/mu373/ea55c6554f3d17a6c4252d45afec4390

https://maku77.github.io/sed/sed/shrink-spaces.html
Java学習 配列

# Rubyの配列との違い
Rubyの配列は、格納する要素の数を最初に決める必要がない。
Javaの配列は、格納する要素の数を最初に決める必要がある。また、後で要素数を変更することができない。
要素を増やす場合、サイズの大きな配列を新たに作成して元データをコピーする、ArrayListというリストの一種を使用する2つの方法がある。
ArrayListとは、要素の数を変更できる配列のようなもの。そのため、ウェブアプリケーション開発ではよく使用される。

# Javaの配列
## 配列の使い方

```java
class Main {
  public static void main(String[] args) {
    int[] scores;
    scores = new int[3];

    scores[0] = 1;
    scores[1] = 5;
    scores[2] = 10;

    System.out.println(scores[0]);
    System.out.println(scores[1]);
    System.out.println(scores[2]);
  }
}
```
以下が出力される。
```
1
5
10
```

## 配列を使用する際の手順
Javaで配列を使用する際は、以下の手順が必要になる。
1. 配列の宣言
2. 配列の要素を作成し、配列に代入
3. 配列の要素に値を代入

### 1. 配列の宣言を行う
配列の宣言は以下のように行う。

```java
int[] scores;
```

変数を宣言する時と同様。
変数宣言時 `int score;`
配列宣言時 `int[] scores;`
「 int 」は要素として格納したいデータ型を指定するもので、long型の整数を格納する配列なら `long[] scores;` のように宣言する。

### 2. 配列の要素を作成し、配列に代入
次に、配列の要素を作成して、それを配列に代入する。

```java
scores = new int[3];
```

上記の右辺部分( `new int[3];` )でint型の要素を３つ作成。
そして、上記のように配列scoresに代入している。
ここまでのコードで、「配列の宣言」「配列に３つの要素を代入する受け皿を用意する」の2つのことができた。

### 3. 配列の要素に値を代入
最後に代入を行う。

```java
scores[0] = 1;
scores[1] = 5;
scores[2] = 10;
```

記述の仕方はRubyと同様。
「1番目」を表すインデックスとして「0」、「2番目」を表すインデックスとして「1」を指定することもRubyと同じ。

また、配列の要素を取り出すときは、以下のように行います。

```java
scores[0]
```
この書き方もRubyと同様。

配列の基本的な使い方は以上です。

# 配列のさまざまな記述方法
配列の宣言方法として、以下の３種類がある。

## 1.配列の宣言と同時に、要素の作成も行う方法

```java
int[] scores;
scores = new int[3];
```

上記は、以下のように1行で記述することもできます。

```java
int[] scores = new int[3];
```

## 2.配列の宣言時に型推論を使用する方法

変数の宣言で使用した型推論は、配列でも使用することができる。

```java
var scores = new int[3];
```

## 3.配列の宣言から値の代入まで全て同時に行う方法

配列の宣言時に代入する値が確定している場合は、以下のように宣言と代入を同時に行い、記述を省略することができる。

```java
int[] scores = {1, 5, 10};
```

簡潔に記述できるが、宣言時に代入する値が確定していない場合は使用できない。
事前作成されたコンパートメントのナビゲートおよびコンパートメントの作成


## コンパートメントとは
コンパートメントの説明の前に、その上位概念としてテナンシの説明を行う必要がある

### [テナンシ](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/GSG/Concepts/concepts-account.htm#concepttenancy)とは
クラウドリソースを作成、管理、および編成できるOracle Cloud内のパーティションである。

### [コンパートメントとは](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/GSG/Concepts/concepts-account.htm#conceptcompartment)
テナンシ内を区切るパーティションである。通常プロジェクトごとにコンパートメントを作成し、それぞれのコンパートメント内にOCI内のクラウドリソースを配置していく。

各リソースはコンパートメントごとに管理されているため、属性が同じリソースにまとめてアクセス制限などを付与したい場合も、ポリシーをコンパートメントに適用するだけで済むため、管理が楽になる。

## コンパートメントの作成手順

1.「メインメニュー」を開き、「アイデンティティとセキュリティ」を選択。

<img width="80%" alt="choose identity and security" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458009/bf753d30-7e34-681a-83db-9ef6a803798a.png">

2.「アイデンティティ」で「コンパートメント」を選択
<img width="80%" alt="choose compartment" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458009/e1d8b70e-466e-d49d-8b99-82a9126fa975.png">


3.自分に割り当てられているコンパートメントを選択する、「コンパートメント情報」タブには、親コンパートメント、OCIDなどの情報が表示される
<img width="80%" alt="confirm compartment" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458009/20402fab-8875-2a23-fd59-4c55bb2a186e.png">


<img width="80%" alt="confirm compartment" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458009/76c842e1-8406-206c-e988-01c7beeeb84d.png">

4.「子コンパートメント」で「コンパートメントの作成」を選択
<img width="80%" alt="create compartment" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458009/df255e97-2671-4c95-8b72-13f01c3275ee.png">

5. 次を入力し、「コンパートメントの作成」を選択
* 名前：コンパートメントの一意の名前を入力する。テナンシー内の全てのコンパートメントで一意である必要がある
* 説明：コンパートメント関連の説明を入力する
* 親コンパートメント：現在のコンパートメントがデフォルトで表示される。

<img width="80%" alt="input necessaries" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458009/afedc27f-7491-a34e-2910-88dfb07de0c3.png">
AIコードエディタCursorをサクッと触ってみた

## この記事で分かること

- 生成AI搭載のコードエディタCursorの概要

## Cursorエディタとは

- 生成AI（ChatGPT）を標準搭載しており、AIとペアプロするような感覚でコーディングができる
- VSCodeをフォークして作られており、VSCodeの機能はそのまま使える

## インストール

- 公式サイトからインストーラーをダウンロードする
    - [Cursor - The AI-first Code Editor](https://cursor.sh/)

## すごい機能その１：学習機能
- チャット欄に`@`を入力後、`+ Add new doc`を選択し、外部サイトのドキュメントのリンクを貼るとそのサイトについて学習してくれる
    - ChatGPTの弱点であった最新情報へのキャッチアップについても対応可能

## すごい機能その２：New AI Project
- File → New AI Project...を選択
- What do you want to build?と聞かれる
- 「DynamoDBにアクセスし、ユーザー一覧を表示するWebアプリ」などと記入する
- 自動的に必要なファイルを全て作成してくれる（ただしバグ有り）
- 【注意】無料版だと生成に時間が掛かる

## 基本的な使い方

#### Ctrl + L（Command + L）でChatGPTとの対話ウィンドウが開く
- ChatGPTと同じ要領で使用可能

#### 特定のコードを範囲選択し修正を指示する
1. 対象範囲選択
2. Ctrl + K（Command + K）
3. 修正内容を指示

例）
- オリジナルのコード
```JavaScript
export const getAllPokemon = (url) => {
  return new Promise((resolve, reject) => {
    fetch(url)
      .then(response => response.json())
      .then(data => resolve(data))
      .catch(error => reject(error));
  });
};
```

- 指示内容
```
async/awaitを使って書き換えて
```

- 修正結果
```JavaScript
export const getAllPokemon = async (url) => {
  try {
    const response = await fetch(url);
    const data = await response.json();
    return data;
  } catch (error) {
    throw error;
  }
};
```

#### コードにエラーがあるとき（赤波線が出ているとき）修正方法を教えてくれる
- エラー箇所にカーソルを合わせると`AI Fix in Chat`というボタンが表示される
- クリックするとチャット欄に対策や修正されたコードが表示される

#### シンボル機能
- チャット欄に`@`を入力するとファイル等を参照できるようになる
    - 特定のコードを全て貼り付けるのに便利
- AWS、Flutter等の外部のサイトのドキュメントを参照できる 

## 料金体系とプラン毎の主な機能
- 無料版
    - GPT4.0が50回まで
    - GPT3.5が月に200回まで
- Pro版（$20/月）
    - 高速なGPT4.0が月に500回まで（500回を超えたら低速GTP4.0）
- Business版（1ユーザー$40/月）
    - Pro版の全機能
    - OpenAIがデータを保持しない

料金体系の詳細はこちら
https://cursor.sh/pricing

--- 

## 参照

- [Cursor - The AI-first Code Editor](https://cursor.sh/)
Flutter の iOS をターゲットにしたビルドで Xcode で起きていたエラーと対策

Flutter の iOS をターゲットにしたビルドで Xcode に関係するエラーが起きていて理由も対策もわからなかった。

Failed to build iOS app
Error (Xcode): Sandbox: rsync.samba(87976) deny(1) file-write-create /Users/.../.../.../.../build/ios/Release-iphoneos/Flutter.framework

Error (Xcode): Sandbox: dart(87954) deny(1) file-write-create /Users/.../.../.../.../build/ios/Release-iphoneos/.last_build_id

Error (Xcode): Flutter failed to write to a file at "/Users/.../.../.../.../build/ios/Release-iphoneos/.last_build_id".

以上のような感じ。それこそ　chtGPT　にきいてもわからない。
メッセージで書き込めない、ということがわかるだけ。

ちなみに、コンソールから
touch /Users/.../.../.../.../build/ios/Release-iphoneos/.last_build_id
とか　
mkdir /Users/.../.../.../.../build/ios/Release-iphoneos/Flutter.framework　
とかはできる。

google で　
flutter build ios Error (Xcode): Sandbox: rsync.samba(87976) deny(1) file-write-create build/ios/Release-iphoneos/Flutter.framework　
で検索してみると、まずは日本語の記事がみつかった。

https://tech.amefure.com/swift-xcode-build-error-sandbox

つまり、プロジェクトの中の　ios/Runner.xcworkspace　または　Runner.xcodeproj　を　Xcode　で開いて
　中央のペインでなにもタブが開いていなかったら
　No selection とあるはずなのでそれをクリックして Runner になったところで再びクリック
　そして　Runner　の　Project　と　Targets　が開くようにする。
　Targets　としての　Runner　が選択されているはずだが
選ばれていなければ　Target としての　Runner　をクリック
同じ中央のペインの上部の３行めメニューの中から　Build Settings　をクリック
４行めのフィルタに　sandbox　と入れると多くの項目がしぼりこまれてその結果から
Build Options　の　User Script Sandboxing　を見つけ出す。
その設定値が　Yes　になっているはずだがこれを　No　にする。

これでうまくいった。
この設定はXcodeの側としてSandboxingするかどうか（つまり他には触らせないか）
という意味らしい。Flutterのbuild側から書き換えを許すということは、Xcodeの
Sandboxではなくなるので、No とでもいうことなのだろう。しらんけど。

Xcodeの15になってからこれの初期値がYesになったという。
それ以前は　No　だったので気が付かなかったというわけ。
VSCode 個人的におすすめの拡張機能達!!

# VSCode 個人的におすすめの拡張機能達!!

## 開発環境におすすめな拡張機能

- [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot)
  - ※有料
  - 個人的に生成されるコードの精度にまだ満足はできていないが便利
    - 地味で簡単な作業なら一瞬で終わらせてくれるのでCopilotなしには戻れない・・
- [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
  - スペルミスに素早く気づけてワンクリックで修正可能で便利
- [Turbo Console Log](https://marketplace.visualstudio.com/items?itemName=ChakrounAnas.turbo-console-log)
  - ワンタッチで対象の値のログが出せて便利
- [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens)
  - エディタ上にエラーメッセージが表示されて便利
- [Git Graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph)
  - 起動や動作は早いしGraphは見やすいので便利
- [Material Icon Theme](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme)
  - 百聞は一見にしかず。。インストールしてみると分かります。ファイル達が直感的に見やすくなり便利
- [change-case](https://marketplace.visualstudio.com/items?itemName=wmaurer.change-case)
  - snake case などに一瞬でできるので便利

## メモとかの環境におすすめな拡張機能

- [:emojisense:](https://marketplace.visualstudio.com/items?itemName=bierner.emojisense)
  - VSCodeで絵文字が表示できて便利。
    - 個人的に。VSCodeにチャットの返信の下書きとかをよく書くので割と使う
ABC059 ARC072 の問題を解いてみました

## A問題

文字列の1文字目の文字コードから 32 を引けば、小文字から大文字に変換することができます。
なので、この処理をそれぞれに行えば解くことができます。

~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  string s[3];
  for(int i = 0; i < 3; i++){
    cin >> s[i];
    printf("%c", s[i][0] - 32);
    //小文字から大文字に変換する
  }
  cout << "\n";
}
~~~

ASCII コードとは

https://qiita.com/heeroo_ymsw/items/c6e15d5f9246b4e842eb


ASCII コードの表はこちら。

https://qiita.com/adrian-zulnedi/items/dfa756eb5029012f614e



## B問題
https://atcoder.jp/contests/abc059/tasks/abc059_b

数字として普通に受け取ってしまうと、C++ではオーバーフローしてしまいます。
なので、文字列として扱いましょう。
もし、$A, B$ の文字列の長さが異なるなら、その長さで判定して、そうでなければ、$A, B$ の大小で判定すれば良いです。

~~~C++:C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  string a, b;
  cin >> a >> b;

  //文字列の長さでの処理
  if(a.size() > b.size()){
    cout << "GREATER" << endl;
    return 0;
  }
  else if(a.size() < b.size()){
    cout << "LESS" << endl;
    return 0;
  }

  //文字列の長さが同じだった場合への処理
  if(a > b){
    cout << "GREATER" << endl;
  }
  else if(a < b){
    cout << "LESS" << endl;
  }
  else{
    cout << "EQUAL" << endl;
  }
}
~~~

また、Python を使用すると、オーバーフローについて考える必要がありません。

~~~python:Python
a = int(input())
b = int(input())
if a > b:
  print("GREATER")
elif a < b:
  print("LESS")
else:
  print("EQUAL")
~~~


## C問題
https://atcoder.jp/contests/abc059/tasks/arc072_a


* すべての$i(1≦i≦n)$ に対し、第 $1$ 項から第 $i$ 項までの和は $0$ でない
* すべての$i(1≦i≦n−1)$ に対し、$i$ 項までの和と $i+1$ 項までの和の符号が異なる

という条件を満たすために必要な最小の操作回数を求めます。

まず、2つの条件から、1つの項の正負を決めることによって、他の項の正負が定まることがわかります。
なので、1番目の項を正にする場合と、負にする場合の操作回数を求めて、少ない方を出力します。

$a_i$までの総和の正負が、目的の正負と異なるならば、
* 負になるべきなら 総和が -1 になるように $a_i$ を変更
* 正になるべきなら 総和が  1 になるように $a_i$ を変更

という処理を行えばよいです。




~~~C++
#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n;
  cin >> n;
  vector<long long> a(n), ans(2);
  ans[0] = 0, ans[1] = 0;
  for(int i = 0; i < n; i++) cin >> a[i];
  //入力を受け取る
  
  for(int i = 0; i < 2; i++){ //1番目の項を負の数にするかせいのかにするかのループ
    long long sum = 0;
    for(int j = 0; j < n; j++){ 
      sum += a[j];
      if(j % 2 == i){ // j番目の項の目的が負の数なら
      
        if(sum >= 0){ // j番目までの総和が正の数なら
          ans[i] += abs(sum + 1);
          //総和が -1 になるまで操作する
          sum = -1;
        }
      }
      else{ // j番目の項の目的が正の数なら
      
        if(sum <= 0){ // j番目の項の目的が正の数なら
          ans[i] += abs(sum - 1);
          //総和が  1 になるまで操作する
          sum = 1;
        }
      }
    }
  }
  
  cout << min(ans[0], ans[1]) << endl;
}
~~~

## D問題
https://atcoder.jp/contests/abc059/tasks/arc072_b
SQLを復習する 〜その１〜

# エンジニア転職をして4ヶ月ほどが経った
私は昨年、未経験からエンジニアに転職をしました。業務の中でSQL文を使用してデータを操作する機会が増えてきたので、改めてSQLについて学習をしたいと思い議事録としてこの記事を投稿しています。

今回は、[スッキリわかるSQL入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB222%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295005096/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2UT5U7286ZHF0&dib=eyJ2IjoiMSJ9.h53fz4JjQCIk92EybIMclGkdD_BlJfrTLRV6da9dN9LRyg3bG6c1JcfdLMsmEKliX_Ztivlht1WXxgnptWtkx1vGH0wtClUhItvJAZwNtkxDwsruKav3rqTbFHTlAwbFDTci0nTsUBzXv1dTB8HH4onqdV8-zu3b7tLv0YL14PCMnUB6u9JgcTF8Rfn0kyx3s2McsTNY3FnrfWaD-aozAm7HNfO4oY-Aj6Wy6lbiyOE.dUjh7qBmUeUOYiKApxRcmLJXsyNE2UnhRbva_PCQkRo&dib_tag=se&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8Bsql&qid=1705357275&sprefix=%E3%81%99%E3%81%A3%E3%81%8D%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8Bsql,aps,172&sr=8-4)を使用して学習を進めています。


# すべての列を取得する
```
SELECT * FROM テーブル名;
```
SELECTには取得したいカラム名
FROMには検索したいテーブル名

# 条件付きの検索
```
SELECT * FROM テーブル名 WHERE 条件;
```
`WHERE 年齢 > 20`とすることで年齢が20歳以上のデータを取得することができる

# データの追加
```
INSERT INTO テーブル名
    VALUES (データの値);
```

# データの更新
```
UPDATE テーブル名
SET 更新する値
WHERE 条件式;
```

# データの削除
```
DELETE FROM テーブル名
    WHERE 条件式;
```

# まとめ
- SELECT文
    - ある条件を満たす行を探し、その行の内容を取得する
- UPDATE文
    - ある条件を満たす行を探し、その号の内容を書き換える
- DELETE文
    - ある条件を満たす行を探し、その行を削除する
Pandasチートシート

仕事でpandasを使うプロジェクトにアサインしたので
勉強がてらまとめてみよう。

# 参考文献
https://www.shuwasystem.co.jp/book/9784798058757.html

サンプルデータ

https://www.shuwasystem.co.jp/support/7980html/5875.html

# 基本操作

## csv読み込み: read_csv()
```python
master = pd.read_csv(csv_file)
```
DataFrame型

## 先頭5行表示: head()
```python
master = pd.read_csv(csv_file).head()
```

## 件数取得: len()
```python
len(master)
```

## ユニオン結合: concat()
```python
tra_1 = pd.read_csv(csv_file1)
tra_2 = pd.read_csv(csv_file2)

transaction = pd.concat(
    [tra_1, tra_2],
    ignore_index = True
)
```
データ数を行方向に増やす(縦に結合する)

### ignore_index = True
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/a9e9541d-fe6a-43f6-8710-8fb5b92e242f.png)

### ignore_index = False
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c6ee78bf-6418-91fa-ad69-286c5f0527c3.png)

## ジョイン結合: merge()
```python
 join_data = pd.merge(
        base_pd, 
        add_pd[["transaction_id", "payment_date", "customer_id"]],
        on="transaction_id", 
        how="left"
    )
```
`第一引数` ベースとなるDataFrame
`第二引数` **どのテーブル** から **どのカラム** を追加するか
`第三引数` キー
`第四引数` どこに追加するか
※ここの関数での第n引数です

横にデータを増やす

:::note info
joinするときの考え方
①足りない(付加したい)データ列は何か？
②共通するデータ列は何か？
:::

## カラム合計: sum()
```python
join_data["price"].sum()
```

## nullチェック: isnull()
```python
join_data.isnull().sum()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/9fb047d9-5be1-9101-9979-ecfdf838acb3.png)

欠けているデータ数をカラム毎に数える

## 数値集計: describe()
```python
join_data.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/4edad127-3a17-3f2c-36c0-9c3a5ca99b68.png)

数値データの集計をしてくれる
|  | describe |
|-----------:|:------------|
| count       | データ件数 |
| mean     | 平均値 |
| std       | 標準偏差 |
| min         | 最小値 |
| 25%       | 四分位数(25%) |
| 50%    | 中央値(50%) |
| 75%    | 四分位数(75%) |
| max    | 最大値 |

## データ型: dtypes
```python
join_data.dtypes
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/b1e7b74f-6f8a-a94f-e969-2dec83308ff9.png)

## 行の参照: iloc
```python
df.iloc[10]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/ecb1a0c1-11e0-6c2d-b5d4-6d64c24a308f.png)

## 特定のセルの参照: at
```python
data.at[3, "transaction_id"]
```
カラム名指定

## 特定のセルの参照: iat
```python
data.iat[3, 5]
```
インデックス指定
Oracle cloud の学習記録

この記事は、以下のPDFに記載のハンズオン形式の演習を実際に行ってみた記録の目次をまとめています。

[Activity Guide: Oracle Cloud Infrastructure Architect Associate](https://learning.oracle.com/public_content/ohr/media/japan/S1104309GC10JP2_ag.pdf)
記事はOracle Profile作成後でないと閲覧できませんのでご注意ください。

[アイデンティティおよびアクセス管理（IAM）：IAMコンポーネントの作成](#)
　[事前作成されたコンパートメントのナビゲートおよびコンパートメントの作成](https://qiita.com/wakasagi135/items/ce026501f4e9792b25b1)
　[事前作成ユーザーのナビゲートとユーザーの作成（作成中）](#)
　[事前作成されたグループのナビゲート、グループの作成およびグループへのユーザー追加（作成中）](#)
　[事前作成済みポリシーのナビゲートおよびポリシーの作成（作成中）](#)
　[動的グループの作成（作成中）](#)
ITパスポート データとAI

・データをどのように活用していくか
・AIとはなにか
を抑える

# データの活用
■データサイエンス
莫大な量の情報を分析し、予測やシミュレーションを行う分野

テキストマイニング(テキスト文章を解析する)、
レコメンドエンジン(その人がどういうものが好きなのかを予測して商品をお勧めする)
などがこの分野での研究対象

データサイエンスの専門家を「データサイエンティスト」という

■DX:ディジタルトランスフォーメーション
ディジタル技術の活用により
既存の価値観や枠組みを大きく変え、生活をよりよいものへと変えていくこと

■BI:Business Intelligence:ビジネスインテリジェンス
企業内で蓄積された様々なデータを分析し、経営戦略の決定に活かすこと

■データウェアハウス
業務データをまとめて保存しておくシステム
分析がしやすい形式で保存しておく

※データウェアハウスとデータベースの違い
データベースはサービスを提供するために最適化されたデータの保管場所、データウェアハウスは分析のためのデータを保存しておく場所(分析に主眼を置いている)

# AIとはなにか
■AI
Artificial Intelligence:人工知能
人工的に作られた知能や技術のこと

■機械学習
パソコンが、データから学習し、出力を行う
「データから学習」の部分のこと

■学習と推論
人がパソコンへ学び方を教え、データから学習をさせるようにする
そして、「パソコンへ入力→パソコンが学習→出力」といった流れが「推論」

ここでの学習とは、分類すること
データの特徴からパターンを見つけること

■機械学習における学習の種類
・教師あり学習
人が答えを与える

・教師なし学習
人が答えを与えない(分からない)

・強化学習
生物の進化の過程のように、
設定された報酬を最大化するよう動作を変えていきながら学習を行う方法

# ディープラーニング
■特徴量
特徴を数値で表したもの
例)ある文字に、いくつかのフォントがあったとする
文字のフォントの
・横の長さ
・縦の長さ
・丸まっている部分の大きさ
などの特徴を数値であらわしたものが「特徴量」

特徴量の中から、効果的なものを選び出す必要がある
→これをデータから行うのが「ディープラーニング」

■ニューラルネットワーク
人間の頭の中のニューロンを模して作られたもの
→ニューラルネットワークをパワーアップさせたものが「ディープラーニング」

# AIと社会
■人間中心のAI社会原則
AIのメリットを最大限活かすとともに人々がAIに対して抱く不安を解消していくことを目的として、
政府が策定した基本理念

・Dignity:人間の尊厳が尊重される社会
過度に効率性を追求するのではなく、人間らしさを大切にすべきであるといった内容

・Diversity&Inclusion:多様な背景を持つ人々が多様な幸せを追求できる社会
多様性を実現していくために、AIを活用していくべきであるといった内容

・Sustainability:持続性のある社会
地域格差解消や気候変動への対策など、持続可能な社会の実現にAIを活用していくべきである

■データに関する規制
・GDPR:General Data Protection Regulation
EUで定められた一般的なデータの取り扱いを定めた規則
EU域内だけではなく、関係するすべての主体に適用される

・COPPA(コッパ):Children's Online Privacy Protection Act
アメリカの法律
インターネット上での子どもの安全を守るためのもの
sakuraのレンタルサーバにGitリモートリポジトリを新規で作成しWindowsにGitローカルリポジトリを作成する方法（tortoiseGit編）

久しぶりに新しくGitリポジトリを作成しようとするとやり方を忘れていることが多いため備忘のために記載する。
尚、ssh公開鍵認証の設定は終わっている状態で実施している。

# ◆大まかな手順
> [sakuraサーバ]
①sakuraサーバにgitフォルダを作成する
②作成したフォルダをgit initで初期化する
[Windows(tortoiseGit)]
①tortoiseGitにて「Git クローン(複製)」を行う
②最初のコミット＆プッシュ

# ◆詳細手順
## [sakuraサーバ側]
### ①sakuraサーバにgitフォルダを作成する
- Puttyなどでsakuraサーバにログインする
- gitフォルダを作成する（gitと分かるように「.git」と付けるとイイ!）
>```
>mkdir xxxxxx.git
>```
### ②作成したフォルダをgit initで初期化する
- 作成したgitフォルダに移動しgit initで初期化する
>```
>cd xxxxxx.git
>git init --bare --share
>```
各パラメータの意味
　git init　・・・　Gitリポジトリを初期化するための基本コマンド
 　--bare　・・・　ベアリポジトリを作成。
  　　　　　　　　　ベアリポジトリにはプロジェクトのファイル自体は含まれず
　　　　　　　　　バージョン履歴やメタデータなどの情報のみが含まれる
　--share　・・・　リポジトリへのアクセス権限を他のユーザと共有する

- 初期化されると↓のようなメッセージが出る。　sakura側は以上で終了。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964854/e25433ec-97b7-cfaf-d5fa-e0e1e6738590.png">

 
## [Windows(tortoiseGit)側]
### ①tortoiseGitにて「Git クローン(複製)」
- 任意の位置で右クリックし「Git  クローン(複製)」を選択する
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964854/03bae3af-3a90-c7d1-2a47-7cfd1ded9729.png">

 - GitリポジトリのURLとPutty鍵を指定し「OK」を押下する
 <img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964854/ec8f4cb6-f591-d57e-059a-be4edda1ead6.png">

- URLにはsshでパスを指定する。（httpsでも良いけど・・・）
「ssh://xxxx@xxxx.sakura.ne.jp」のxxxx部分は自分のさくらアカウントと同じ(はず)
「/home」以降はgitフォルダがある位置のフルパス
- Putty鍵は別途作成していたものを指定する
 　
- こんな感じでCloneが完了する
 <img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964854/5cbb2711-a226-4c85-970f-7b9b031d810d.png">
　

### ②最初のコミット＆プッシュ
- フォルダにREADME.mdなどを作成しコミットする（そのあとプッシュする）
　備忘：最初はmasterブランチにREADME.mdファイルをコミット＆プッシュする
 　　　　開発はdevelopブランチを作成しそこで行う（featureブランチも利用する）
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964854/d3914cbf-f5ef-93fb-21b2-a77acc9a2e07.png">


 ## 以上で完了
Customizable Sequencer Track トラックを使ってみた話

今回は、上手く行かなかった話になります。
再生されているレベルシーケンサーの時間を見て、アクターへアクション(パラメータの変更、関数呼び出し)させたい方法をがないかを健闘した話です。
今回、さわってみたのは、『[Customizable Sequencer Track](https://docs.unrealengine.com/5.0/ja/customizable-sequencer-track-in-unreal-engine/)』というプラグインになり、ブループリントだけで、独自のトラックが作れるとのことであったので、検証してみました。
現在は、ベータ版が公開されており、リンク先がドキュメントになります


# 確認環境
Windows 11 Pro
UnrealEngine 5.3.2

# できる事

* 独自の『トラック』『セクションが』作成できる
* C++ではなく、ブループリントだけで完結する
* 作成したトラックやセクションの『セクションの開始』『セクションの終了』等イベントを取得する事が出来る

 :::note info
 セクションの開始と終了に合わせておけば、特定のセクションが終わったタイミングのトリガーになりそう。
 レベルシーケンサーの終了を検出するトリガーにできそう。
:::

# できない事

* Tickを作れないが『SequencerTrackInstance』を継承したクラスで『OnUpdate』を呼び出せる
* キーフレームを打てず、トラックとセクションしか作成できない

:::note warn
例えば、OnUpdateで、現在のフレームを監視させて、時間を見てアクターへのトリガーに出来ないかと調べてみましたが、プラグイン内で用意されている物だけでは出来ません。
また、トラックからシーケンスの情報は取れると、何かできるかも知れないが、実現するにもデモ、エンジン改造が必要です。
:::

# まとめ

今後のアップデートでキーフレームを打てるようになると、もっと使い方の幅が広がりそうです。今後のアップデートに期待ですね。
現状だと、セクションの区切りを監視させておく用途など、使えるかも知れません。
Kaggle参戦記：スコアを刻んで14位に。驚きの新事実が発覚。

こんばんは。今日も地道にスコアを刻んで0.972になりました。現在14位。話によると、パブリックLBのスコアは基本、[当てにならない](https://propen.dream-target.jp/blog/kaggle_shakedown)らしいので、一週間後には「ぬか喜びだったね」で、終わってしまうかもしれません。まあ、その時は笑い話にでもしましょう。

# 驚きの新事実。データが改ざんされている？

これまで、手元のAUCとLBスコアの大きな乖離（手元でAUCが0.999出ていても、LBスコアが0.7くらいになることがざらにある）について、ある違和感を抱いていました。最初は、元のソースコードで使っている特徴量抽出手法が、過学習を引き起こしやすいせいなのかと思っていたのですが、ごくごく単純で過学習など起こしそうにない「タイプミスに着目した手法」でもスコアの乖離が起こっていました。

そこから導かれる仮説は1つ。「運営のデータでは、タイプミスが手掛かりにならないような細工が施されているのではないか」ということです。例えば、「運営のデータには、人間の書いた文章もリライトされてタイプミスが除去されている」可能性。もう一つは「AIの書いた文章に意図的にタイプミスが入れ込まれている」可能性も考えられます。で、結論からすると、「人間の文章にもAIの文章にも無作為にノイズがまぜられている可能性が高い」ことが分かりました。

「変なデータを見つけた」という[参加者からの投稿](https://www.kaggle.com/competitions/llm-detect-ai-generated-text/discussion/452279)を見てみると、運営のトレーニングデータの中に「もともとは人間が書いたエッセイのコーパスに含まれている文章で、同じ文章のすべての単語の綴りの「s」が「i」に置換されている」データが含まれていることが分かりました。例えば、「The electoral college is something that has been loved.」が「The electoral college ii iomething that hai been loved.」になってる！これは私の手元のデータでも確認ができました。

というわけで、最初は「人間の文章かAIの文章かを見分けるタスク」だと思っていたものが、実際は「わざと人間の文書かAIの文章かを見分けにくくした文章を見分けるタスク」になっていた、というお話でした。

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666147/5cb9b5a3-33b3-6f01-9538-e78b99bfa9e2.jpeg">

コンペを盛り上げるためにアルファベットの「s」を「i」に置き換える運営者（[Bing Image Creator](https://www.microsoft.com/ja-jp/edge/features/image-creator)）

これらのノイズが、プライベートLBのデータにも含まれているのか、それともパブリックLBのデータだけがひっかけ問題になっていて、プライベートLBは普通のコーパスで評価されるのか、真実は分かりません。いずれにせよ、「運営のデータ」に対する、過度な仮説と適応は行わず、ノイズに対してロバストな分類器の改善に取り組んでいこうと思います。締め切りまで残り1週間！
C言語のmake時に構造体のサイズをチェック

1. **構造体の定義:** まず、チェックしたい構造体を定義します。
1. **サイズを出力するコードの追加:** プログラム内で、sizeof演算子を使用して構造体のサイズを取得し、それを出力するコードを追加します。
1. **Makefileの編集:** makeを使用してビルドする際、サイズチェックのためのターゲットをMakefileに追加することができます。

```c
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int a;
    double b;
    char c;
} MyStruct;

#define EXPECTED_SIZE 24

int main() {
    size_t size = sizeof(MyStruct);
    if (size != EXPECTED_SIZE) {
        fprintf(stderr, "Error: Size of MyStruct is %lu, but expected %d\n", size, EXPECTED_SIZE);
        return EXIT_FAILURE; // 非ゼロのステータスコードで終了
    }
    printf("Size of MyStruct: %lu\n", size);
    return EXIT_SUCCESS; // ゼロのステータスコードで終了
}
```
```makefile
all: check_size

check_size:
    gcc -o check_size size_check.c
    ./check_size
```
Qiitaデビュー

初めまして。
LaughCatと申します。

ずっと興味のあった Qiita ですが、ついにデビューです。
エンジニアとしての記録を残すため、アプリ開発など、稚拙ながら公開していこうかなと思います。

まずは、Javaが書けるので、Spring Bootを使って簡単なアプリケーションを作っていこうかなと計画してます。
よかったら、応援お願いします！