OmniAICreator/Qiita-1.07M huggingface dataset:
paizaラーニングスキルチェック「B155:スタンプアート」を解いてみた結果

以下のリンクを「B155:スタンプアート」で検索してください。

https://paiza.jp/challenges/ranks/b/info

▼結果

https://paiza.jp/challenges/share/e2y_HOBlDMcb0HAAmFfaPnDioEbrFaw2sfK_v2MJ_fo?source=social
salesforce 添付ファイルの削除



+ [特定のオブジェクトのアップロード日が古い順から削除を考えていますが、その時にExcelなどで一覧化しレコード名やアップロード日を確認する方法はありますでしょうか。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mLT4)

:::note
以下のアイデアで説明されているようにレポートで簡単にどのオブジェクトのレコードにファイルが添付されているかは分からないようです。

Apexバッチなどを使えば特定のオブジェクトにアップロードされているファイルが検索できるとは思います。

現在、ファイル (ContentDocument) とそれらが共有されているレコード (ContentDocumentLink) に関するレポートは作成できません。「ファイルとコンテンツのレポート」レポート タイプには、実行中のユーザーがアップロードしたファイルのみが表示されます。このレポート タイプは、ファイルが共有されているレコードのタイプに基づいてフィルタリングすることはできません。また、ファイル (または ContentDocument) は、カスタム レポート タイプの作成に使用できるオブジェクトではありません。

https://ideas.salesforce.com/s/idea/a0B8W00000GdmPdUAJ/improve-reporting-on-files-contentdocument

以下ではなかなか面白い方法を考えられていますね。

Tableau を使用して、親 ID を使用する添付ファイル オブジェクトを関連するカスタム オブジェクト レコードに結合しました。

したがって、Tableau または類似のツールがない場合は、添付ファイルまたはコンテンツ ドキュメント オブジェクトとカスタム オブジェクトをエクスポートし、親 ID で結合 (Excel を使用している場合は VLOOKUP) します。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jd7vNSAR
:::
Slackでメッセージ入力欄にフォーカスするショートカット

フォーカスされていない状態で入力を始めると、勝手にメッセージ入力欄にフォーカスが移り入力が始まります。
公式ページ（[Slack のキーボードショートカット](https://slack.com/intl/ja-jp/help/articles/201374536-Slack-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88)）にも記載がなく困っていましたが、フォーカス意識せずそのまま入力すればよかったのですね、、、
![slack.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685785/1b2204fe-6529-013a-9ae8-69e78159af05.gif)
DjangoとLaravelを比較して思ったこと

# 目的
私がDjangoについて、しっかり調べて思ったことを残しておく。
分かりやすい比較などを公開するわけではない。

# 背景
Laravelを１年以上使って、Spirng Bootを少し触って理解できるレベルになったため、少ししか触ったことがないDjangoを改めて勉強した。

# 感想
Laravelは初期のフォルダ数が多いが、ModelやContorolerなどのファイルをどこに格納するのかわかりやすい。その分、フォルダ構成の自由度が下がるが、小規模プロジェクトなら問題なし。
ただし、マイグレーションファイルをいちいち追加するのはめんどくさい（他のFWでも同じ？）

Djangoは初期のフォルダ構成が少なすぎて、何をどこに作成したらよいかわかりにくいかった。
特にDjangoのアプリケーションをどの単位で作成するかが私には判断が難しい。機能単位でアプリケーションを区切るようだが、A機能のModelをB機能から参照するなど循環インポートを気にする必要があるたフォルダ設計の難易度が高い。
上記のようなDjnagoの難しい点をチュートリアルでは解説していないため、ちゃんと使用することを断念した。
昔、Djnagoの仕事をしたときは設計思想は簡略的でModelを使わずに実装していたため、何とかなっていたんだなと実感した。
Djangoで新規開発は大変そうだが、既存改修なら既存設計思想に従えばよいため仕事ができそう。


# 結論
特別な理由がない限りDjangoを避けます。
機会があれば、Djnagoを使うエンジニアに本記事で疑問に思ったことをどうやって解決しているのか聞いてみたい。
【React】props と children の違いについて

# はじめに
業務中に`children`を使った実装を行う際、`props`との違いが気になったため、調べてまとめました。

:::note warn
警告
この記事は個人的なアウトプットのため、誤った情報が含まれている可能性があります。間違いがありましたら、ご指摘をお願いいたします
:::

# propsとchildren

## propsって何？
> React コンポーネントは互いにやりとりをする際に props というものを使います。親コンポーネントは子コンポーネントに props を渡すことで情報を伝えることができるのです。props は HTML の属性と似ていると思われるかもしれませんが、props ではオブジェクトや配列、関数などのあらゆる JavaScript の値を渡すことができます。

https://ja.react.dev/learn/passing-props-to-a-component

`props`はコンポーネント間でのデータのやりとりに使われます。

```react
function Card(props) {
  return (
    <div className="card">
      <h2>{props.title}</h2>
      <p>{props.content}</p>
    </div>
  );
}

// 使用例
<Card title="カードのタイトル" content="カードの内容" />
```
このように`props`を使うと、Cardコンポーネントは親から渡されたタイトルや内容を表示できます。

## childrenって何？
> children は、props である children から受け取った JSX を操作、変換するために用います。

コンポーネントのタグで囲まれた内容全体を渡すための特別な`props`です。

```react
function Container({ children }) {
  return (
    <div className="container">
      {children}
    </div>
  );
}

// 使用例
<Container>
  <h1>これはタイトルです</h1>
  <p>これは説明文です</p>
</Container>
```
このようにすると、Containerコンポーネントは`<h1>`や`<p>`要素を`children`として受け取り、`<div>`の中に配置します。

~~***<font color="Red">注意点として、`children`はその名前でしか認識されないため、例えば次のように名前を変更すると機能しません。</font>***~~

```
function Container({ box }) {
  return (
    <div className="container">
      {box}
    </div>
  );
}

// 使用例
<Container>
  <h1>これはタイトルです</h1>
  <p>これは説明文です</p>
</Container>

```
このコードでは、`Container`に`children`ではなく`box`が指定されているため、囲まれた内容は表示されません。

## propsとchildrenそれぞれの使い所
+ `props`はコンポーネント間でデータのやりとりに使用され、コンポーネントの内容や動作を柔軟に変更できます。

+ `children`はコンポーネントが他のコンポーネントをラップする場合に使うと便利で、レイアウトを柔軟に構築できます。

# 終わりに
`props`と`children`の役割を理解したことで、コンポーネントの設計がより柔軟になりました。今後の実装でも使い分けを意識していきたいと思います。

# 参考

https://ja.react.dev/reference/react/Children

https://ja.react.dev/learn/passing-props-to-a-component

『React の Props と Children の違いをまとめてみた』
https://www.aki--dev.com/entry/2024/05/20/085500#:~:text=props%20%E3%81%A8%20children%20%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9,%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
文字列をサーチして遊ぶ。


x 過去ログを見よ!!
x M5NanoC6で使う予定は、未定
x あえて、答えを見ないで作っているので正しいか不明
x 答えは、アルゴリズムなんちゃら辞典や放送大学のアルゴリズムを見てね。



オンライコンパイラ

https://paiza.io/ja

```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    char *a = "ABC";
    char *b = "0123456ABC012";
    
    char v,w;
    
    int j = 0;
    while(1){
        
        int i = 0;
        while(1){
            v = a[i];
            w = b[i+j];
            if(v == 0 || w == 0){
                break;
            }else if(v != w){
                break; 
            }//endif
            i++;
        }//while i

        if(v == 0) {
            printf("true\n");break;
        } else if( w == 0){
            printf("false\n");break;
        }//endif
        
        j++;
    }//while j

}//main



```

```

true

```


-----------------------




おまけ
-----------------------


```c++



int st_cmp(char *a,char *b){

    //char *a = "ABC";
    //char *b = "0123456ABC012";
    
    char v,w;
    
    int j = 0;
    while(1){
        
        int i = 0;
        while(1){
            v = a[i];
            w = b[i+j];
            if(v == 0 || w == 0){
                break;
            }else if(v != w){
                break; 
            }//endif
            i++;
        }//while i

        if(v == 0) {
            //printf("true\n");break;
            return(j);
        } else if( w == 0){
            //printf("false\n");break;
            return(0);
        }//endif
        
        j++;
    }//while j
}//st_cmp


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int a;

    if(st_cmp("ABC","0123456ABC012") == 0) {
        printf("false\n");
    } else {
        printf("true\n");
    }//endif

}//main






```

```

true

```
Revit APIについてのリンク集（Revit API アドベントカレンダー2024 1日目）

## はじめに

Revitとは、Autodesk社が開発しているBIMソフトウェアです。

BIM(Building Information Modeling)とは、その名の通り建物情報(Building Information)をモデリングすることで建物の企画・設計・施工・運用を行うことですが、RevitはそのBIMソフトウェアとして世界中で多くの建築関係者が活用するものの１つです。

Revitでは、.NET（Revit2024までは.net Framework 4.8、Revit2025以降は.NET 8）を用いてアドインプログラムを開発することができ、そのアドインからRevit本体を制御できるのがRevit APIという位置づけになります。

本シリーズでは、Revitアドイン開発及びRevit APIについての基本的な情報を紹介していけたらと考えております。

## Revit APIに関する情報元

シリーズ最初の今回は、Revitそのものの理解やRevitアドイン開発の参考になるサイトについてご紹介します。

### 公式情報

Autodeskの日本法人による、Autodeskテクノロジー・開発者向け情報についてのblogです。

https://adndevblog.typepad.com/technology_perspective/

英語ではありますが、Revitの中心開発者であるJeremy Tammikさんのblogです。

https://thebuildingcoder.typepad.com/

Revit API 開発者ガイドです。（URLの年の箇所を変更すると過去バージョンの開発者ガイドを参照することも可能です）

https://help.autodesk.com/view/RVT/2025/JPN/?guid=Revit_API_Revit_API_Developers_Guide_html

Revit API についての公式フォーラムです。（前述のTammikさんも頻繁に出現して、時にはblogの題材として取り上げられることもあります）

https://forums.autodesk.com/t5/revit-api-forum/bd-p/160

Revit APIのヘルプは各バージョンのSDKに付属していますが、バージョンをまたいで確認するのに便利なサイトです。（内容自体は基本的にSDK付属のAPIヘルプと同一です）

https://www.revitapidocs.com/

### Revitに関する日本語情報

日本におけるRevitの第一人者である髙取昭浩さんのblogです。

https://www.revitpeeler.com/

建設DXを推進する日本の企業ArentさんによるRevitのTips集です。

https://note.com/arent3d/m/m6e412ee2a319

X(旧twitter)で設備BIMについてたびたび発信されている方のNoteです。

https://note.com/mepbim_gsan/m/m22a5dbed7aaf


次回以降はRevit APIについてもう少し掘り下げていきたいと思います。

## このシリーズの予定

(1) RevitAPIについてのリンク集 ★今回★
(2) Revitでの幾何計算(1)
(3) Revitでの幾何計算(2)
(4) Revit APIでの要素抽出方法あれこれ
(5) Revitアドインのエントリーポイント
(6) RevitでCADっぽい挙動（ラバー・一時図形・ラージカーソル）を実現してみる
(7) Revitアドイン開発 Debug Tips
他職種とのコミュニケーションで実践したこと

## 概要

こんにちは、事業会社でフルスタックエンジニア（現在はフロント）をしているものです。
仕事柄、他職種との交流が多く、アプローチに試行錯誤してきました。
求人サイトでもよく他職種とのコミュニケーションは歓迎事項、必須事項になっていますので一度簡単にまとめようと思いました次第です。

## 対デザイナー

- Figmaに積極的にコメントを行う
- UIコンポーネントライブラリ、既存のコンポーネントの仕様の説明の場を設ける→UIコンポーネントライブラリのドキュメントを共有。
- コンポーネント作成の前に要件や挙動の詳細について打ち合わせしておくと齟齬がなくていい。特にエラーケースや空のケースなどについてのデザインが想定されていない場合もあるので確認しておく。
- 画像の形式は両者で話し合って予め基準を設けておくと良い。SVG or PNG
- Storybookを導入してコンポーネントのカタログとして用いるのは効果的。（ステージ環境などに上げて共有する。）

ポイント：UIコンポーネントライブラリを導入している場合はできるだけそれに沿うようにお願いする。


## 対ディレクター

- 進捗はメンション付きで
- 課題のステータス変更時にはメンションをつける
- 困っていることがあるかを進捗報告時に添える
- なるべく要件や資料は１箇所にまとめてもらうように事前交渉する。スプシ、ワイヤーなどを課題のチケットにまとめてもらう。プルリクエストのレビュアーも確認がしやすい。

ポイント：ディレクターは「結局次に何をするのか」、「現状はどのようか」という情報を特に望んでいるケースが多いため、積極的に情報を伝達する。また、無いなら「無い」という情報も添えておくのはおすすめ。後でのツッコミがへる。

## 対管理職（非エンジニア）

- 体調、現状が快適かどうか、キャリア観、不満点などをいう。
- ここで変に遠慮したりすると現状が変わらないままになるので正直に言っておく。
- 何も言わないと不満はないと認定されてしまう。
- こういうことに取り組んでみたいということは積極的に伝えておく。意外と自信ないタスクでも振ってもらえたりする。
ポイント：遠慮なく正直に話す。現状を伝える。

## 対広報

- GTMの設定やLPなどの作成依頼などがくる。
- 構造よりも見積もりと速度を意識する。
- 広報依頼の課題は納期が厳しめの課題が多いので、必要な情報、記事コンテンツ、画像素材などを早めにもらうように言っておく。
- 定期的に発生する業務も多いのでコンポーネント設計時には拡張性を意識する。テストコードも作成しておき品質を担保しておく。

ポイント：アセット関連は早期に目処を立てておく。マーケティング用語をサラッと学習するとコミュニケーションコストがグッと下がる傾向。


## その他

- とっつきにくい人やキャラクターがわかりにくい人とはランチを1対1で行くのがおすすめ。
  - 複数人でワイワイ行くと結局その人自身を知ることができない。相手の印象にも残りにくい。 
- 一旦度胸や勇気はないものとして話す。
  - 目上の人に恐れず話しかけることを推奨する。コミュニケーション力が高いと評価されやすいので良いかも。
メモ

``` javascript:
// 選択肢の定数
const FRUIT_APPLE = "apple";
const FRUIT_BANANA = "banana";
const FRUIT_ORANGE = "orange";

// 現在選択されているフルーツを取得
function getSelectedFruit() {
    return $("input[name='fruit']:checked").val();
}

// 各フルーツが選択されているかを判定する関数
function isApple() {
    return getSelectedFruit() === FRUIT_APPLE;
}

function isBanana() {
    return getSelectedFruit() === FRUIT_BANANA;
}

function isOrange() {
    return getSelectedFruit() === FRUIT_ORANGE;
}

<form id="fruitForm">
    <label><input type="radio" name="fruit" value="apple"> りんご</label>
    <label><input type="radio" name="fruit" value="banana"> バナナ</label>
    <label><input type="radio" name="fruit" value="orange"> みかん</label>
</form>

```


``` java:

import java.util.*;
import java.util.stream.*;
import javax.faces.model.SelectItem;

public class EnumDistinctExample {
    public enum MyEnum {
        ITEM1(1, "X", "A"),
        ITEM2(1, "Y", "B"),
        ITEM3(2, "Z", "A"),
        ITEM4(2, "W", "C"),
        ITEM5(3, "X", "A");

        private final int a;
        private final String b;
        private final String c;

        MyEnum(int a, String b, String c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }

        public int getA() {
            return a;
        }

        public String getC() {
            return c;
        }
    }

    public static void main(String[] args) {
        // 1. SelectItemリストの作成（aをvalue、cをlabelとして設定）
        List<SelectItem> selectItems = Arrays.stream(MyEnum.values())
                .map(e -> new SelectItem(e.getA(), e.getC())) // aをvalue、cをlabelに設定
                .collect(Collectors.toList());

        // 2. 重複を排除してユニークなSelectItemリストを作成
        List<SelectItem> distinctSelectItems = selectItems.stream()
                .distinct() // SelectItemのequalsとhashCodeを使って重複排除
                .collect(Collectors.toList());

        // 結果を表示
        distinctSelectItems.forEach(item -> 
            System.out.println("Value: " + item.getValue() + ", Label: " + item.getLabel()));
    }
}

```
【Next.js】Server Actions の利用方法

# はじめに
この記事では、Server Actions の利用方法を記載します。
Server Actions はサーバー側で実行される非同期関数です。Next.js のアプリケーションでフォームの送信やデータの変更を処理するために Server Component、Client Component から呼び出すことができます。

https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Next.js 14.2.13
- React 18.3.1
- TypeScript 5.5.4

# 利用方法
`"use server"` ディレクティブで Server Actions を定義できます。`"use server"` ディレクティブの記述場所は2通りあります。

## 非同期関数の先頭
ひとつ目は、非同期関数の先頭です。こちらは Serer Component のみ利用可能です。

以下の例では、`addTask` という非同期関数内の先頭に `"use server"` を記載しています。

```page.tsx
import { revalidatePath } from "next/cache";

// Simulated in-memory task storage
const tasks: string[] = [];

export default function Page() {
  async function addTask(data: FormData) {
    "use server";

    const task = data.get("task");
    if (task && typeof task === "string") {
      tasks.push(task);
      // Revalidate the page to reflect added tasks
      revalidatePath("/");
    }
  }

  return (
    <div>
      <form action={addTask}>
        <label htmlFor="task">Enter Task</label>
        <br />
        <input id="task" name="task" type="text" required />
        <button type="submit">Add</button>
      </form>

      <ul>
        {tasks.map((task, index) => (
          <li key={index}>{task}</li>
        ))}
      </ul>
    </div>
  );
}

```

![Create-Next-App-Google-Chrome-2024-10-27-10-20-02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/95f34c4b-0fa0-44e4-83c2-6c96fc090deb.gif)

# ファイルの先頭
ふたつ目は、ファイルの先頭です。こちらは Server Component、Client Component の両方で利用可能です。

```action.ts
'use server'
 
export async function addTask() {}
```

```page.tsx
'use client'
 
import { addTask } from '@/app/actions'
 
export function Page() {
  return <form action={addTask}>...</form>
}
```

# 参照
- [Server Actions](https://react.dev/reference/rsc/server-actions)
- [Server Actions and Mutations](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations)
文字列の比較で遊ぶ。(サーチの変形版


x 過去ログを見よ!!
x M5NanoC6で使う予定は、未定
x あえて、答えを見ないで作っているので正しいか不明
x 答えは、アルゴリズムなんちゃら辞典や放送大学のアルゴリズムを見てね。


プログラム

オンライコンパイラ

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    char *a = "hogehoge";
    char *b = "hogehoge";
    
    char v,w;
    
    int i = 0;
    while(1){
        v = a[i];
        w = b[i];
        
        if(v == 0 || w == 0){
            break;
        }else if(v != w){
            break; 
        }//endif
        
        i++;
    }//while
    if(v == 0 && w == 0){printf("true\n");}
    else{printf("false\n");}
    
}//main



```

```

true

```
VSCodeのdevContainerからgit pullができない

# 状況

`git@github.com: Permission denied (publickey).` とお叱りを受ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/f34defeb-44ed-b282-537c-c0aed9883877.png)

# うーん
devContainerはsshの鍵をホストマシンと共有するはずでは？公式に書いてあります

https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials#_using-ssh-keys

# ちなみに
pushはできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/e1fbad8a-07a6-8770-c26c-37ba31671c94.png)

# HTTPS接続に変えました。
調査の過程で`git remote -v`をすると、fetchだけSSH接続になっていることが判明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/f503bb3b-8bf3-50e5-0d39-52aae2723d05.png)

どちらもHTTPS接続に変えることで無事にpullできました
```bash:コマンド
git remote set-url origin https://github.com/[Org]/[Repo].git
```



これでいいのか？まぁできたから良し。
VSCodeのdevContainerの設定は毎度つまずくので細かく載せていきたいけど、多分1年後には使えない情報になってると思う。
【Django】API画面で特定のフィールドを非表示にしたい！

現在大学4回生の情報学科の学生です．

研究室での取り組みとしてWebアプリを作成しており，登録した複数のユーザ情報を表示する処理を書く際に，ユーザのパスワードだけは非表示にしたいと感じました．
フロント側の表示処理の部分で上手く解決しても良かったのですが，ハッシュ化されているとはいえ不必要なものをフロント側に送りたくなかったので，Django側で処理を完結させる方法を考えました．

# 本記事の概要
DjangoのAPI画面に表示させるフィールドの一部を非表示にするかつ，オブジェクト作成時にはそのフィールドに値を代入できる方法の説明しています．
要はパスワードなど一度登録したものをそのままブラウザで表示しないようにする方法です．


# to_representationをオーバーライドする
```BaseSerializer```クラスに定義されているメソッドである```to_representation```を再定義することで今回の問題は解決できます．

https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py


例として以下のようなUserクラスを考えます．
```python:models.py
class User(models.Model):
    name = models.CharField(verbose_name='名前', max_length=255)
    email = models.EmailField(verbose_name='メアド', max_length=255)
    password = models.CharField(verbose_name='パスワード', max_length=255)

    def __str__(self):
        return self.name
```

このクラス内の```password```フィールドをAPI画面で表示しないようにするには次のようにシリアライザを定義します．

```python:serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

    def to_representation(self, instance):
        representation = super().to_representation(instance)
        # 非表示にしたいフィールドを削除
        representation.pop('password', None)
        return representation
```

上記コードの```representation```には取得したモデルのインスタンスのkeyとvalueが含まれており，非表示にしたいフィールドをpopすることで，その値を除いたデータを返しています．
こうすることで以下のAPI画面のように，```password```はフィールドとして表示されていないが，フォーム部分には存在している状態を作ることができます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803443/ab853b36-e725-e281-b3b2-2137a2fa3c60.png)

```to_representation```に関しては以下の記事で詳しく解説されていました．

https://qiita.com/shun198/items/b1a58a438e3256ab6ec7#instance%E3%81%A3%E3%81%A6%E4%BD%95


## 上手くいかなかった例
単に```serializers.py```で```password```を明示的にフィールドに含めない方法も思いついたのですが，これではフォーム部分からも```password```がなくなり，設定できなくなってしまいます．
```python:serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        # パスワードをフィールドに含めない
        fields = ['id', 'name', 'email']
```

以下のようにパスワードのフォームがなくなってしまう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803443/5cbca38e-74f0-a415-04bd-ac9c04e3900e.png)

# 終わりに
Djangoで開発をしていると便利すぎて，細かい修正を行うときに大変です・・・
(調査中)Mockito-inlineを使用することで、プライベートメソッドのモック化

Mockito本体では通常、プライベートメソッドの直接モック化はサポートされていませんが、Mockito-inlineを使うと特定の条件で静的メソッドやファイナルメソッドのモックがシンプルに行えるようになります。ただし、プライベートメソッドを直接モックすることは、通常設計の観点からは避けるべきことが多いので、テスト対象の公開メソッド経由でのテストを優先することが推奨されます。

以下はMockito-inlineを用いてのアプローチに関する簡単な説明です。

## 1. Mockito-inline のセットアップ
Mockito-inlineを使うには、プロジェクトに依存関係を追加します。Gradleの場合は次のようになります：

#### gragleを使う場合

```gradle
testImplementation 'org.mockito:mockito-inline:4.x.x'  // バージョンは最新を指定してください
```

#### mavenを使う場合


Mockito-inlineをMavenプロジェクトで使用するためには、依存関係をpom.xmlファイルに追加する必要があります。以下の設定を行えば、Mockito-inlineを使って静的メソッドやファイナルメソッドをモックできます。

Mavenの設定
pom.xmlファイルに以下のように依存関係を追加します。バージョンは最新のものを使用してください。
```xml
<dependencies>
    <!-- Mockito Core -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>4.x.x</version> <!-- 最新のバージョンを指定してください -->
        <scope>test</scope>
    </dependency>

    <!-- Mockito Inline -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>4.x.x</version> <!-- 最新のバージョンを指定してください -->
        <scope>test</scope>
    </dependency>
</dependencies>
```
依存関係の説明
mockito-core は Mockito の基本的な機能を提供するライブラリです。
mockito-inline はインラインモッキングを可能にし、静的メソッドやファイナルメソッドのモックが可能になります。これを追加することで、Mockitoの通常の制約を超えて利用できる場面があります。
例
```xml
<dependencies>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>4.10.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>4.10.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>
```
## 2. プライベートメソッドをモックするための手順
Mockito-inlineでは、従来のMockito.spy()を使った方法と似たように、スパイインスタンスを作成し、公開されているメソッドを使ってプライベートメソッドの挙動を変更することが可能です。ただし、Mockito-inlineでは直接プライベートメソッドをモック化することはできないため、PowerMockitoほどの完全な制御は行えません。

例: スパイを使用して、間接的にプライベートメソッドの挙動を変更する
```java
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.doReturn;

public class ExampleTest {

    @Test
    void testPrivateMethodWithSpy() throws Exception {
        Example example = spy(new Example());

        // 注意: プライベートメソッドを呼び出す公開メソッドを利用
        doReturn("Mocked Response").when(example).publicMethodCallingPrivateMethod();

        // テスト実行
        String result = example.publicMethodCallingPrivateMethod();
        System.out.println(result); // "Mocked Response"が出力されるはず
    }
}

class Example {
    public String publicMethodCallingPrivateMethod() {
        return privateMethod();
    }

    private String privateMethod() {
        return "Original Response";
    }
}
```
## ポイント
Mockito-inlineでスパイを用いると、公開メソッドを通してプライベートメソッドの挙動をモックすることができます。
プライベートメソッドの直接モック化が難しい場合でも、公開メソッド経由でのテストが一般的な方法です。
プライベートメソッドのモック化が頻繁に必要な場合は、クラス設計を見直すことや、テストしやすい構造を考えることも重要です。
javaのapiにレスポンスのbody設定して返却したら、改行コードがあるから解析できずエラーについて、原因として考えられること

JSONの改行コードによる解析エラーが発生する場合、相手先のJavaのAPIの実装が原因である可能性があります。一般的には、JSONのパースは改行やインデント（整形されたJSON）の影響を受けず、正しいフォーマットの文字列であれば正常に解析されるはずです。

**考えられる原因**としては次のようなことが挙げられます：

## 1. **APIが改行や空白を処理できない設計** 

JSON文字列を受け取る際に改行をそのまま文字列として扱う実装になっており、パースに失敗している可能性があります。一般的には改行やインデントを取り除くか無視するような設計が求められます。

## 2. **特殊な文字列エスケープ処理の問題**
改行コードが適切にエスケープされていない、もしくはJSONライブラリが何らかの理由で改行を誤って扱っている可能性があります。

## 3. **文字エンコーディングの違い**

JSONが正しい形式で送信されていても、エンコーディングの問題が絡んでくることがあります。例えば、UTF-8で送信されたJSONを受け取る側が別のエンコーディングで解析しようとした場合、エラーが発生することがあります。

## まとめ

このような場合、**相手のJava側のAPIの実装を改善する余地がある**可能性が高いです。ただし、送信側で改行をすべて除去してフラットな文字列にする対応を試してみて、それでエラーが回避できるか検証してみるのも有効かもしれません。
ティーチ船長にサイトを作ってもらいました!! ( Markdown AI )

## はじめに
日々の活動、ご苦労様です!!
アドカレ3日目!

今回は触ってみた系の記事となっております。
Markdown AIではどんなことができるのかを紹介しており、
画像多めのサクッとした内容です:ok_hand:



## Markdown AI とは？
シンプルなMarkdown記法を使って、誰でも簡単にWebサイトを作成できるプラットフォームとのこと。
試しに自身の過去記事を貼り付けてみました。
- [元記事](https://qiita.com/K-yokosu/items/26ddd709857345be5632)
- [Markdown AI記事](https://mdown.ai/content/5ac97b1f-8792-4a12-8640-363ec2c8929d)

んーーQiitaで記事書くのと何が違うんだ??

というのが最初の感想でしたが後に理解しました。
面白いです:heart_eyes:
疑ってすいません笑

## AIを作れる
こちらを参考にAIを作成してみました！

https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f

名付けて キャプテン・ティーチです!!
船長の言葉は沁みますね:sob:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/c92c7da2-3bc1-c6d4-04b4-fdca07109c23.png)



### どうなってんの？
裏で動いているのはClaudeです。
他にも選択肢があるのでお好みのAIを使うことが出来ます!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/74b65704-a7ee-c4ed-0750-faf036d7ed36.png)

プロンプトを設定してキャラ付けしてあげればティーチ船長の出来上がりです!!

```
応答の最初に「ゼハハハハハ〜」と言う。
質問に答えつつ、以下の台詞を元にした応答を最後に1つ加えてほしい
・「空島はあるぜ」
・「何を悔しがるんだ、姉ちゃん」
・「今の戦いはそいつらの勝ちだぜ」
・「人の夢は…終わらねえ！」
・「笑われていこうじゃねえか」
・「すぐにまた鉢合うさ」
・「このグランドラインにいる限りな」
・「遠慮するんじゃねえよ」
・「俺は、政府側の人間だぜ！」
・「やめときな！」
・「正義だ悪だと口にするのは。この世のどこを探しても答えはねえだろ！」
・「くだらねえ」
・「死ぬも生きるも天任せよ。恐れた奴が負けなのさ」
・「次の一瞬を生きようじゃねえか」
・「よく俺達を助けてくれたな。ありがとよ」
・「改めて歓迎するぜ。いい仲間になれそうだ」
・「自由だよな？　お前」
・「何をしたい？」
```

ちなみに、ラスボスヒグマ説は船長も否定できないみたいです!!!笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/eea37ee5-5c5d-22bd-fae8-5f2957513979.png)

## サイト作成
Markdown AIは Markdown以外にもhtml css javascriptを扱うことができ、公開することも可能なので、最後に船長の作ったサイトを載せておきます:raised_hands:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/033fb4f4-6e9d-9742-4d01-5998f10d13f0.png)

https://mdown.ai/content/5ef0ad0f-e85a-4d39-abbd-3e7a8dd7866d

## 終わりに
最後までお読みいただきありがとうございます!!
今回設定したプロンプトは単純なものですが、それ次第で化けるのが生成AIだと思うのでキャッチアップから逃げてはいけないなと改めて思いました!

### 追伸
アドカレ3記事目終わり〜
書いていて楽しかったです。笑

:santa_tone1::santa_tone1::santa_tone1:
Rustのtrunkのインストール/ビルドが失敗するのをゴリ押しで解決する

# ゴリ押しは正義だった
## 一向に解決しないビルド問題
Rust初心者の僕、Yewを触ろうとするもCargoでtrunkがビルドできない問題に直面。
検索はもちろん、Perplexityなどで調べた方法を次々実践するも解決せず・・・

## 試した方法
- OpenSSLのインストール
- ↑の環境変数を適切に設定する
- ダメだったのでvcrpkgで改めてインストール
- 全然ダメ！！！

## 突然の解決
改めて公式サイトのInstallationを確認していたら、binstallなる導入方法もあるとのことなので実践、無事解決した。
https://github.com/cargo-bins/cargo-binstall
※ binstallは自前でビルドする代わりにバイナリをそのまま持ってくるらしい

### 成功した方法
1. binstallをcargo install cargo-binstall
1. trunkをcargo binstall trunk
1. 何の問題もなくインストール完了！動作も問題なし！

## おわりに
初めての記事がこんなものでどうかと思ったが、意外と情報がなさそうなので投稿してみた。
肝心の問題の原因はさっぱりなのでそこはモヤモヤするものの、いったん使えるようにしてくれたbinstallには感謝・・・
iOSのブラウザでnew Date()の挙動が違うらしい

# はじめに
最近、システム上で日付を選択しても反映されないというバグ報告を受けました。当初は原因がまったく見当つかず、iOSでのみ発生している現象だということすらわかりませんでした。今回は、この問題で自分が実際につまずいた点をメモとして残しておこうと思います。

# 原因
問題の原因は、new Date() の挙動が iOS と Android で異なることにありました。例えば、20xx-xx-xx 形式の文字列を new Date() で日付に変換しようとした際、iOS と Android では解釈が異なります。具体的には、月や日が一桁の場合に問題が発生します。

iOS：new Date("2024-1-5") のようなフォーマット（YYYY-M-D）では、iOS はこれを適切な日付として解釈せず、Invalid Date エラーを返します。
Android：一方、Android はこの形式でも適切に日付として認識するため、エラーは発生しません。
この違いのため、特に一桁の月や日が含まれる日付を扱う際に、iOS でのみ問題が発生することがわかりました。

# 対策
この問題は、月や日付を必ず二桁に調整することで解決しました。一桁の月や日は先頭にゼロをつけて 01 や 09 のように二桁にすることで、iOSでも正しく日付が反映されるようになりました。

# 終わりに
今回、new Date() の挙動が iOS と Android で異なることを知り、非常に勉強になりました。どの OS でも同じ挙動をするように統一してほしいとは思いますが、こうした違いも今後の開発で考慮していきたいと思います。
Qiitaへの毎日投稿を始めようと思う

## 挨拶
こんにちは、エンジニア志望の学生です。

小規模の個人開発や松尾研主催講座への参加、Atcoder等をしています。

今日から毎日投稿をしたいと思います。自分の備忘録的な執筆を目的としているので、拙い文章にはなりますが、温かい目で見守ってくださると幸いです。

## 自己紹介
- 学校 : 高専専攻科
- 研究 : Pythonを使った自然言語処理
- 興味関心 : LLM等新しい技術が好きです。

## 使用したことのある言語
- C : 授業
- Python : 授業、研究、個人開発、GCI講座
- C++ : Atcoder
- HTML/css : 個人開発
- Javascript : 個人開発

## きっかけ・目的
### 1. 備忘録として
これまでいくつかの小規模な個人開発を行ってきたが、ふと思い返した時に、当時使った技術や文法、問題解決の糸口がすぐに出てこなかった。コードを見返せばある程度は思い出すごとができるが、当時の思考、解決のプロセスはもう思い出せない。そんな中、Qiitaをはじめとする技術系ブログへのアウトプットを勧める声を方々で聞き、「これはやるしかない。」となった。

### 2.執筆能力の低下予防
元々文章を書くのが得意な方だったが、高専生活を通した堕落とChatGPTの登場により、文章を生成する能力が極端に下がり、執筆に係る時間が大幅に増えていた。「ChatGPTを使い続ければいいじゃん」という声もわかるが、なんとなく自分の思考能力への影響を危惧し、文章を書く癖を付けようと考えた。

### 3. 「なにかを継続して頑張っている」という事実から生まれる自信のため
高専の授業である程度プログラミングの勉強はしたものの、がっつり触ったのはCくらいで、reactなどの最新のフレームワークに関する知識やDocker、Github等のエンジニアに必須な能力が備わっておらず漠然とした不安を抱いている。これを少しでも解消するために何かできることはないかと思い、「泥臭く頑張る」道を選んだ。

## 今後の目標
- ネイティブアプリの作成
- Typescriptの学習
- 松尾研GCI講座、LLM講座の修了
- ハッカソンへの参加

## まとめ
以上になります。「続けられる」という自信一本勝負で発車しています。よろしくお願いします！ここまで見てくださった方がもしいましたら、励みになりますのでいいねやコメント等頂けると幸いです。😸
線形サーチして遊ぶ。(文字)(線形探索)


x 過去ログを見よ
x M5NanoC6で使う予定は、未定
x あえて、答えを見ないで作っているので正しいか不明
x 答えは、アルゴリズムなんちゃら辞典や放送大学のアルゴリズムを見てね。!!(wikiでは、線形探索)



オンラインコンパイラ


```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    char a = 'S';
    char *b = "0123456S89";
    char v;
    
    int i = 0;
    while(1){
        v = b[i];
        if(v == 0) {
            break;
        } else if (v == a){
            break;
        }//endif
        i++;
    }//while
    
    printf("[%d]\n",i);
}//main


```

```

[7]

```
GASでLINE Bot を作成する際に意外と詰まった罠 [変更が反映されない]

## はじめに
自分がGASでLINE Botを作成した際に、本当に些細なことだけど困ったことをメモしておきます。

## 罠
**コードに変更を加えたらデプロイを押さないと行けない。**

本当にこれだけです！

## 最後に
本当にこの罠に気づかなかったために結構時間を使ってしまったので、自分と同じような人を少しでも減らせればいいなということで、書いておきます。
LeetCodeを1日1題解いてみる (day10)

10日目に取り組んだ問題はこちら！
今日はmediumに挑戦します！

2. Add Two Numbers

https://leetcode.com/problems/add-two-numbers/description/

## 問題文
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.


## 僕の回答

```py
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        l1_size = 0
        l2_size = 0
        l1_current = l1
        l2_current = l2

        # 桁数を取得
        while l1_current:
            l1_size += 1
            l1_current = l1_current.next
        while l2_current:
            l2_size += 1
            l2_current = l2_current.next

        # ２つを合計する
        sum = 0
        l1_current = l1
        for i in range(l1_size):
            sum += l1_current.val * (10**i)
            l1_current = l1_current.next
        l2_current = l2
        for i in range(l2_size):
            sum += l2_current.val * (10**i)
            l2_current = l2_current.next
        # 返すnodeをつくる
        if sum == 0:
            return ListNode(0)

        result_head = None
        result_current = None
        while sum > 0:
            new_node = ListNode(sum % 10)
            sum //= 10
            if not result_head:
                result_head = new_node
                result_current = result_head
            else:
                result_current.next = new_node
                result_current = result_current.next
        return result_head
        
```

## より効率の良い回答例

```py
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        total = ListNode(0)
        curr = total
        remainder = 0
        while l1 or l2:
            one = l1.val if l1 else 0
            two = l2.val if l2 else 0
            summ = one + two + remainder
            remainder = summ // 10
            curr.next = ListNode(summ % 10)
            curr = curr.next
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        if remainder: curr.next = ListNode(remainder)
        return total.next  # totalはダミーヘッドだからnextが初めの値になる
```

### コメント
初めてmediumに取り組んだが、とても難しかった。1時間も時間をかけてしまった。
リンクリストの扱い方やイメージが固まっていないので、もっと使って慣れる必要を感じた。

### 次回はこちら!
https://qiita.com/h_y_s_d/items/6e059bd31d2bdb9423a0
気休め程度のクラッカー防止プログラム[zsh]ログインカウント

実は我が家に継続的に賊が入ってきていて、コンピュータをクラッキングしていきます。axxでバグを流していたのも、一部そいつのせいです。まだ来るのかどうかわかりません。一応気休め程度にスクリプトを作りました。警察に言っても相手にしてくれませんので。

```cnt.sh
#!/usr/bin/zsh
a=`cat cnt`
a=$(("$a+1"))
echo $a >cnt
```

これを、rootとuserの.zshrcで呼び出すようにすると、cntの数値がログイン回数になります。

初期化としてホームディレクトリで`echo "0">cnt`とします。出かけるときに必ず電源を落とさなければ。

`cat cnt`として数値を覚えておけば、ログインされたかどうかわかるかも知れません。+1された値と違っていたら、確実にクラックされています。同じだったらどうかわかりません。

いくらやっても、コンピュータはブラックボックスでいくらでも書き換えがきくので無駄ですが。気休めに。

BIOSは書き換えられてないと思いますが、書き換えられていたら、BIOSをリライトすればよいですが、都合上、汎用性の低い新しいBIOSのないvaioしか手に入らなかったので。

RescueCDから入ることも可能ですが・・・。もうあかん。

BIOSが書き換えられてて、リモート操作をやられてるんなら最悪やわ。

人を見たら泥棒と思え、七たび探して人を疑え。どうしようどうしよう。１か０かじゃ答えが出ない。アウフヘーベンしなければならない。バウムクーヘン食べている場合じゃない。
【kaggle】機械学習イントロ - ランダムフォレスト【備忘翻訳】

# はじめに
当記事はkaggleのLearnの[Intro to Machine Learning](https://www.kaggle.com/learn/intro-to-machine-learning)の[Random Forests](https://www.kaggle.com/code/dansbecker/random-forests)を翻訳して備忘としたものです。
拙い英語力なので間違い等あればご指摘いただけたらと思います。

まとめ:[【kaggle】翻訳記事まとめ【備忘翻訳】](https://qiita.com/leafeon00000/items/71e57af5b2d9b0b7c846)
前:[【kaggle】機械学習イントロ - モデルの検証【備忘翻訳】](https://qiita.com/leafeon00000/private/1672eb0d2e453eca883e)
次:[【kaggle】中級機械学習 - 欠損値【備忘翻訳】](https://qiita.com/leafeon00000/private/4aba0d19685929546855)

:::note warn
当記事に含まれるコードはkaggle内のnotebook内で正常に動作します。動作を試したい場合はkaggleのnotebookで試してください。
:::

----

# ランダムフォレスト
より洗練された機械学習アルゴリズムを使用します。

## イントロ
決定木は難しい決断を迫ります。多数の葉を持つ深いツリーは各予測がその葉に分類される少数の住宅のデータのみから得られるため、過剰適合します。一方、葉の少ない浅いツリーでは、各葉に分類された住宅のデータの違いを多く捉えることができないため、予測のパフォーマンスは低下します。

今日の最も洗練されたモデリング技術でさえ、過少学習と過剰学習の狭間に置かれています。しかし、多くのモデルには、パフォーマンス向上につながる巧妙なアイデアがあります。例としてランダムフォレストを見てみましょう。

ランダムフォレストは多数のツリーを使用し、各ツリーの予測を平均化して予測を行います。一般的に、単一の決定木よりも予測精度がはるかに高く、デフォルトのパラメータでもうまく機能します。モデリングを続ければ、より良いパフォーマンスを示すモデルを学ぶことができますが、その多くのモデルでは適切なパラメータを得ることが難しいです。

## 例
データをロードするコードはすでに数回見てきました。データロードを終えると次の変数が設定されています。
* train_X
* val_X
* train_y
* val_y

<details><summary>データロードのコード</summary>

```python
import pandas as pd
    
# Load data
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Filter rows with missing values
melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                        'YearBuilt', 'Lattitude', 'Longtitude']
X = melbourne_data[melbourne_features]

from sklearn.model_selection import train_test_split

# split data into training and validation data, for both features and target
# The split is based on a random number generator. Supplying a numeric value to
# the random_state argument guarantees we get the same split every time we
# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)
```


</details>

scikit-learnで決定木を構築した方法と同様にランダムフォレストモデルを構築します。ただし、今回は`DecisionTreeRegressor`ではなく、`RandomForestRegressor`クラスを使用します。

```python
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

forest_model = RandomForestRegressor(random_state=1)
forest_model.fit(train_X, train_y)
melb_preds = forest_model.predict(val_X)
print(mean_absolute_error(val_y, melb_preds))
```

```console:console
191669.7536453626
```

## まとめ
さらなる改善の余地はありそうですが、これは決定木の最も良かった誤差250,000と比べると大きな改善です。決定木の最大深度を変更したのと同じように、ランダムフォレストもパフォーマンスを変更できるパラメーターがあります。しかし、ランダムフォレストモデルの最も優れた機能の一つは、この調整を行わなくても、通常は適切に機能することです。
沼り続けるオンラインゲームのやめ方

## はじめに
オンラインゲームを体験した方であればご理解頂けるかと思いますが、あれは沼ですよね😅
私は「ザ・アンツ」を約2年程続けていました。（出身サーバー: 814）
チャット・戦闘イベント・報酬・デイリータスクなど、ユーザーを離さないための仕組みがしっかりとなされており、面倒に感じても辞められない日々を送っていました。
無課金で課金者に競れるくらいやっていたので妻に怒られることもしばしば...
これを解決するために行なった試行錯誤を書いていきます

本記事の内容は下記2点です
最後までお読みいただけるよう努めます！
- 辞めるまでの過程
- オススメのNotion教材


## 辞めるまでの過程
### 解決策1  ゲーム内のメンバーへ引退連絡
ゲーム内にはギルドのような閉じられたグループがあり、グループ全体メールで引退の旨を熱く発信し、実際やめました!!

でも2週間後に復帰しました...（だせぇぇぇ:expressionless:）

#### 失敗原因
決意だけで辞めたことだと思っています。
実際、再会のキッカケは未経験のイベントが予告されたことで、気持ちが揺らいでしまいました、、、


### 解決策2  他で沼れるものを見つける
敵の敵は味方ということで同レベルにハマるものを見つければ次第に興味が移っていくと考えました。具体的には技術の勉強をそれまでより増やし、専門性を高めようと考えました。

興味が分散はしたが共存しました...（そらそー:triumph:）

#### 失敗原因
ある程度目論見通りでしたが、辞め切れる策ではなかった。
見積もりが甘かった。


### 解決策3  分散先にゲーム性を持たせる
この時点で分散先の技術勉強が興味という観点で上回っていました。
なのでゲーム性を持たせ、習慣化させれば駆逐できると考えました。

成功!!!! （やってやりました:sob:）

#### 成功原因
日々の勉強をタスク化し、学習時間を計測することでデイリータスクとして認識出来たことが大きかったと思います。
また、それらを X・社内discode・Lapras などから辿れるように導線を配置したことで、タスクの着手可能性が上がりました。
ここまでくると、オンラインゲームを続けるのが面倒でアホくさく感じたので、自然に辞めていました。
（夢でゲームしてたのはノーカン:relaxed:）

## 具体的にやったこと
### Notionを活用
- タスク管理
    日々改善が入りますが、現在は日付とステータスで今日のタスク進捗を可視化しています。タイマーを利用し、途中で何度でも中断・再開できるようになったのが最近のお気に入りです（タイマーを取り入れるキッカケになったのはXで繋がれた[Kayさん](https://x.com/wannabean_eng)の一言があったからなので、実はめっちゃ感謝してます笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/cea37a7c-8e5d-8ccc-e983-2266fa101e63.png)

- プロジェクト管理
　タスクをプロジェクト単位でまとめることが出来、進捗率が可視化できるので活用しています。ただ、現在では少し形骸化しています。:sweat_smile:　プロジェクトに含まれるタスクが未知数なので完了に至りづらくなっています。プロジェクトDBに複数のプロジェクトを入れるのではなく、同一プロジェクトのタスクをプロジェクトとして登録するように変更すれば機能する気がしています。現状、必須ではないので後回しにしています。（いつかやる、ほんまにやる笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/cc08d40d-91ec-1f50-ef87-19d31c064097.png)
- ナレッジ管理
　学んだり経験した知見を一箇所に貯めるナレッジ管理を行なっています。ナレッジを利用・更新していくことで、自身にとって最も信頼性の高い知見を蓄えることが出来るので、日々の業務や学習を積めている感覚を持てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/dca92bdf-cf59-417c-715a-746ea71bed62.png)

- タグ管理
　tag専用のDBを作ると全てのDBで共通のタグ利用が出来るので、やらない理由がないです:ok_hand:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/086401ed-b7b9-1320-4ea8-ec81c709439f.png)


## オススメのNotion教材
私が前章のNotion管理に至れた動画です。
どれも素晴らしく、Notion初心者でも問題ありません。

Notionはテンプレートなども多く用意されていますが、自分に合う完璧なテンプレートはないでしょうし、自身の求めるものは日々更新されていきます。（私は今の形に落ち着くまで数ヶ月で10回程更新しました💦）
なのでこういった動画を参考に自分で作っていくのを強く推奨します!!


[タスク管理用](https://youtu.be/-JHuLFryMxM?si=sZZHxtwB5jbL6AFI)
[プロジェクト管理用](https://youtu.be/psD489kFtNg?si=tgxt8t7Rs_Cyd3ke)
[tag管理用](https://youtu.be/cCK_hGfi2cY?si=ysTyU8eRPfBRUAcp)

## 終わりに
最後までお読みいただきありがとうございます!!
今では自分のことを好きになれる日々を送れているので、幸せに過ごせています。
時々、もう少し早く変われていたら...あるいはオンラインゲームに出会わなければ...と邪念がチラつくこともありますが、胸張れる生活をあと18年続ければしょうもない時期を5%に出来るので、誤差にしてやります:relaxed:

### 追伸
アドカレ2記事目終わり〜
書くスピードが上がってきた気がします
まだ元気なんで明日からの記事も頑張ります!

:santa_tone1::santa_tone1:
マスト!! web中級レベルへのudemy必須講座

## はじめに
日々の活動、ご苦労様です!!
私Web業界5年目になるんですが、そろそろ中級エンジニア名乗って良いんじゃないかと思っていました。でもどうやら抜けがあったので、今回ご紹介する講座にて埋めさせていただきました!!

それではオレオレ中級エンジニアが推しに推すudemy講座をどぞ:metal:

最後までお読みいただけるよう努めます！
- オススメのudemy講座
__JavaScriptで学ぶWebアプリ開発の必須知識〜Node.js・Web API・Ajax・async/await〜__


## 推し講座
講師：[しまさん](https://www.udemy.com/user/da-dao-yong-shu/)

https://www.udemy.com/course/web-application-development-with-javascript/?couponCode=CPBRAND24JP

### 推す理由
講座で学べることは他にも多くありますが、個人的にはこの辺りがこれまで手薄だったので特に嬉しいポイントでした！
- Node.jsの役割を把握できる
- webサーバが担ってくれている仕事を知れる

## Node.jsの役割を把握できる
Node.jsが何をしてくれているのか、答えられますか？
私は普段Next.jsを使用しており、NextはNode.jsの頑張りで動くわけですが「実際何してんのよ」と聞かれると気持ちよく答えられませんでした。
そもそもNode.js自体触ることほぼないんでね、普通に仕事する分には詳しく知らなくても問題ないし、仕方ないかなと思ってます。

でもそれじゃ中級にはなれないですよね
個人的に中級とは、普段使用する技術がそれぞれ抽象化してくれてる部分をざっくりとでも理解していることが必須だと思っているので、Nodeのお仕事を知れる良講座です。


## webサーバが担ってくれている仕事を知れる
こちらも似たポイントですね！
webサーバが担う役割を作りながら知れます
下記ポイントを押さえていない方は特にお勧めです
- CORS
- リバースプロキシ
- PRGパターン


## レベル定義
そもそもエンジニアのレベル定義って境界が明確にある訳ではないので、Claudeに回答してもらいました!!

```
初級エンジニア
- HTML、CSS、JavaScriptの基本的な文法と構造を理解している
- シンプルな静的なウェブページを作成できる
- Bootstrap等の基本的なフレームワークを使える
- バージョン管理システム(Git)の基本操作を知っている
- ブラウザの開発者ツールを簡単に使える

中級エンジニア
- フロントエンドフレームワーク(React, Vue, Angular)を使いこなせる
- レスポンシブデザインの実装が可能
- APIとの連携と非同期処理の実装ができる
- バックエンド言語(Node.js, Python, PHP)の基本的な知識がある
- WebpackやBabelなどのビルドツールを理解している
- コードの設計とリファクタリングの基本を理解している

上級エンジニア
- マイクロサービスアーキテクチャの設計と実装ができる
- パフォーマンス最適化と高度なセキュリティ対策の知識がある
- サーバーレスアーキテクチャの構築が可能
- WebSocketやリアルタイム通信技術に精通
- CI/CDパイプラインの構築と管理ができる
- テスト駆動開発(TDD)を実践できる
- クラウドインフラ(AWS, GCP, Azure)の高度な知識がある
- 複雑な大規模アプリケーションの設計と実装が可能
```
ふむ、悪くない定義なのではないでしょうか :thinking:
本講座では下記ポイントの向上に適しています
```
中級エンジニア
- APIとの連携と非同期処理の実装ができる
- バックエンド言語(Node.js, Python, PHP)の基本的な知識がある
```

## 終わりに
最後までお読みいただきありがとうございます!!
本講座に辿り着けたのは、connpassのイベントに参加してNest.jsの有効さを知り、前知識としてNode.jsを押さえようと考えたことがキッカケでした。
今回の講座で学んだことをNest.jsでの学習に繋げたいと思います!

### 追伸
アドカレ6記事目終わり〜
完走25記事は諦めましたが、熱を持てる記事はまだあるので今後も書いていきます!

:santa_tone1::santa_tone1::santa_tone1::santa_tone1::santa_tone1:
:santa_tone1:
## 参考
https://www.udemy.com/course/web-application-development-with-javascript/?couponCode=CPBRAND24JP
読みやすいSQLとは

# はじめに
どのように書けばSQLは読みやすくなるのか、試行錯誤しています。
ある程度まとまったので、記事にしてみました。

SQLスタイルガイドが私のイメージに近かったので、参考にしています。

https://www.sqlstyle.guide/ja/

# 予約語を大文字にするか、小文字にするか…
大文字、小文字問題は未だ解決していない問題ですが、
目的はテーブル名、フィールド名と見分けやすくすることです。

オブジェクトの命名規則は殆どが以下のケースに当てはまると思います。
* パスカルケース（先頭大文字で単語の先頭が大文字）
* キャメルケース（先頭小文字で単語の先頭が大文字）
* スネークケース（アンダーバーで小文字を結合）
* コンスタントケース（アンダーバーで大文字を結合）
* 日本語（SQL ServerやAccessで割と見かける）

コンスタントケース以外は名称に小文字が多くなるので、予約語は大文字で書いています。

# カンマは先頭か末尾か…
Pythonなどのプログラムではカンマは末尾に付けるように言われていますが、
フィールドの区切りが見分けやすくなるので、先頭に付けています。

# どこを揃えるか…
「SELECT」の後ろのスペースの位置を揃えています。
副産物として各行の1文字目がスペースになります。
各行を文字連結してもエラーにならないので、ソースコードに組み込む場合にも有効です。

また、「JOIN」の後ろのスペースと「ON」の後ろのスペースを揃えています。
これにより、複数のテーブルを結合した時に見やすくなります。

# サンプル
```sql:SQLServer
SELECT CASE obj.type
         WHEN 'U' THEN
           'テーブル'
         WHEN 'V' THEN
           'ビュー'
         ELSE
           'その他'
       END AS 種類
     , obj.name AS オブジェクト名
     , col.name AS カラム名
     , type_name(col.user_type_id) AS 型
  FROM sys.objects AS obj
 INNER JOIN sys.columns AS col
         ON obj.object_id = col.object_id
 WHERE obj.type IN ('U','V')
   AND col.is_nullable = 1
 ORDER BY obj.type
        , obj.object_id
        , col.column_id
```
情報発信が生む「年収200万up」の可能性

## はじめに
日々の活動、ご苦労様です!!
今回のアドカレは私にとって初参加になりますので、気合・体力共にみなぎっております故、ご期待ください :muscle:

本記事の内容は下記3点です
最後までお読みいただけるよう努めます！
- 前回の転職活動の失敗
- 転機と転職成功の吉兆
- 私が行なっている情報発信



## 転職活動の失敗
失敗と題しておりますが転職先の会社がダメだったという訳ではなく、むしろ私にとってはとても良い会社です!!（今時珍しく、月に一度は飲み会がありますし、会社が負担してくれます:relaxed:）

何が失敗かというと、自分の中で掲げた目標やゴールを達成できないまま、焦るように転職活動を開始・終了してしまったことを悔いていることにあります。


具体的目標として以下を挙げていて、これらを達成してから転職活動を開始するつもりでした
- モダンな技術で溢れまくったポートフォリオを作る
- 個人開発でサービスを公開する。なんならちょっと収益出す


やばいでしょ？(笑)
今となっては壮大すぎるというか、結果が欲しすぎて非現実的な計画を練っていたなと反省してます。
勿論、人によってはクリアしてしまう方もいるのでしょうが、私の場合は時間だけが過ぎ、達成できない自分を少しづつ嫌いになりながら日々を送っていました...
あと前職を辞めてから転職活動を始めたのもマズかったですね!
貯金が減っていくのはめーっちゃキツイです💦

最終的に今の会社に入社してからは、切り替えて働いていましたが、「自分はこんなもんかな」っていう諦めがあったかもしれません。

## 転機と転職成功の吉兆
転職してからは、業務は卒なくこなせていたものの、スキルアップのための研鑽が続く時期と途切れる時期を繰り返す日々でした。



### 転機
ある時、ターミナルで作成したファイルの中身を保存するための「:wq」コマンドを忘れてしまったことがありました。
この程度のことは特に珍しくなく、ちょっと検索すれば、「あーこれこれ」で終わることです。ただ不思議とこの時だけは悔しくて、なんとかしたいなぁと真面目に思いました。

__まさかのこれが転機でした（笑）__

身につけたはずの知識が抜けていくことに虚しくなり、学習方法の仕組みに目をむけるキッカケになりました。詳細は別記事で記載するため省きますが、Notionを活用することでinput・outputや復習、それらを継続出来る仕組みを築くことができました。

また、次の記事に出会えたことで「Lapras」を始めることになりました。

https://qiita.com/Sicut_study/items/3aff558ec4f4f2dcbe27#1-lapras%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B%E3%81%9F%E3%82%81

言わずと知れた有名サービスかと思いますが、私はほんの数ヶ月前まで知らなかった...ので簡単に説明すると、Qiita,X,Github,その他媒体での行動データを分析・スコアリングしてくれるサービスで、技術者と企業それぞれが幸せになりやすい採用支援サービスです。


### 転職成功の吉兆
Laprasを始めて1ヶ月程経過した後、転職状況を「なし」→「中」に変更しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/a9a0cab7-ba0c-f540-72af-1e3bc282e537.png)

希望年収を600万に設定していましたが数週間の内に、興味通知10件・カジュアル面談5件と想像以上の反応をいただきました!! 
求人票を見ても希望年収を超えるものばかりですし、さらにはるか上の金額を記載されている企業様もいました。（逆に怖い😅）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/c7e32525-a3c4-ad80-9b1b-2466ed595615.png)



## 私が行なっている情報発信
具体的に日々行なっていることは下記になります。
- [Github](https://github.com/K-yokosu "Github")のPublicリポへコミット
- [X](https://x.com/yokosu_k "X")にてタスク内容を毎日投稿
- 日々の[学習記録](https://sunny-jupiter-2ad.notion.site/12b3b1edd9ae8000b7e8fbe0e07a15b5 "学習記録")をつける
- [AtCoder](https://kenkoooo.com/atcoder/#/table/jonasan "AtCoder")でのコンテスト参加や過去問での練習

これらはどれも特別なことではないと思っています。
早い人はずっと前からやっているし、もっと多くのタスク量をこなしている方もいるはずです。
なので自分が継続していることがすごいことだとは全く思いません。
だからこそ、 __公開するだけで__ ここまで可能性を感じられることに驚いています。

情報発信と言うと、ハードルが高く聴こえてしまいがちですが、
自身の情報も十分価値になり得るのだと知れたので、私と同じような状況にいる方には特にお勧めします:raised_hands:

## 今後の活動
ここまでとても嬉しい反応を頂けているので、実際に転職活動を開始した時にも同様の反応を頂けるよう努めます!!
また、「転職ドラフト」にも参加してみるつもりです！
「本記事のカレンダー元だから、最後に名前出しとこ」とかではないですよ（笑）
前回転職時にも認知はしていたものの利用するには至りませんでした。
というか至れませんでした。
次回は満を持して参加できるよう日々の活動を継続します。

## 終わりに
最後までお読みいただきありがとうございます!!
技術者としてまだまだ未熟者ではありますが、どこかの誰かに刺さるような記事が書けるよう、これからも精進してまいります!!

### 追伸
アドカレ1記事目終わり〜
記事書くのって疲れるけどちょっと楽しいすね!
まだまだ元気なんで明日からの記事も頑張ります!

:santa_tone1:
PHPのGDライブラリを用いて文字列を描画する その２

# はじめに
本稿は、[PHPのGDライブラリを用いて文字列を描画する](https://qiita.com/kk_outlaw/items/d52657fdccf7ff093f19)の続きとなっています。
前回書ききれなかった、文字列を斜めに描画する方法について説明します。

# 描画領域の座標系について
このサンプルコードは前回説明したものと同じになりますが、imagettfbbox()にテキストを回転させる角度を度数法で指定します。
```php
$bounding_box = imagettfbbox(
    $font_size,
    $text_angle, //第２引数で角度を指定する
    $font_file_name,
    $text
    //PHP8.0では引数にarray $options = []が追加されている
);
```

# 開始位置を指定して文字列を描画する
ここからが曲者になります。

まず、文字列を描画するコードは前回のものを踏襲します。
```php
imagettftext(
    $image, //あらかじめ生成した空のイメージ
    $font_size,
    $text_angle, //0°(水平)を基準として任意の角度に回転させることができる
    $min_x * -1, //テキストの開始位置のX座標
    $min_y * -1, //テキストの開始位置のY座標
    $foreground_color, //文字色
    $font_file_name, //.ttfファイルのパス
    $text //描画する文字列
);
```
テキストの開始位置のX座標、Y座標が不思議な値になっているのが分かると思いますが、この理由を以下で説明します。

まず上記のコードで、角度0°、フォントサイズ32、フォントに[Noto Serif Japanese](https://fonts.google.com/noto/specimen/Noto+Serif+JP)のNotoSerifJP-Regular.ttfを指定して描画し、各バウンディングボックスの座標を取得してみます。

![logo_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893745/bc7f7b6e-a02c-d1bf-b97d-22b5fc0243fb.png)

青い文字列の４隅に書かれた黒い座標がバウンディングボックスの座標です。
X座標は左から右に大きくなり、Y座標は上から下に大きくなる、すなわち座標系で言うところの第４象限です。
これ自体はプログラミングでは珍しいことではないと思いますが、上端のY座標が負の値になっていて、第１象限にはみ出しています。
つまり、このケースでは正しく描画するためにはY座標を36ピクセルずらしてやる必要があるということです。

文字列を回転させた場合はさらにややこしくなります。
フォントの条件をそのままに文字列の角度を100°とした場合のバウンディングボックスの座標を取得してみます。

![logo_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893745/977526ae-72d0-5470-144a-2b4c56ceb85d.png)

ほぼ第２象限に飛び出しているのが分かります。
これを正しい範囲に収めると、以下のような座標になります。

![logo_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893745/2fbf2766-0aff-a9ba-69a1-967b8df44349.png)

つまり、文字列を描画する範囲としては、(0, 0)～(115,449)となります。
この(115, 449)とは、もとの座標系でそれぞれX軸、Y軸の最小となっていた値にマイナスを乗じたものです。

また、imagettftext()の仕様上、描画の開始位置は見た目の左上ではなく、文字列の１文字目の左下を起点とします。

ここまでが、上記サンプルコードでX軸、Y軸の起点に一見奇妙な値が入っている理由になります。

# サンプルについて
前回の記事でも紹介したGitHub上のサンプル( https://github.com/kk-outlaw/php_gd_string )ですが、スクリプトにGETパラメータで文字列の角度を与えることができます。
まずはビルトインサーバでスクリプトを立ち上げ…
```
>php -S localhost:8080 gd_string.php
```
angleパラメータで角度を指定してみます。

![degree60_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893745/139f0cd7-3985-2856-e8d0-7249fc755108.png)

# 終わりに
GDライブラリで文字列を描画するサンプルは多く見つかったものの、文字列を回転させた場合の仕様についてはなかなか参考文献が見つからず、バウンディングボックスの数値と睨めっこしていて気づくことができました。

# 参考文献
PHP: imageftbbox - Manual https://www.php.net/manual/ja/function.imageftbbox.php
PHP: imageftbbox - Manual https://www.php.net/manual/ja/function.imageftbbox.php
phpのGDライブラリを試してみました！ #PHP - Qiita https://qiita.com/laughool/items/8ccdb6d51dceea5fb593
svgやdrawioなどのXMLファイルの色をグレースケール化するツールを作りました

## はじめに

タイトルの通り、svg や drawio などの XML ファイルの色をグレースケール化するツールを作りました。SVG や CSS のフィルタ機能によるグレースケール化ではなく色自体を変更しています。

仕組みは単純に XML ファイルの中からタグに含まれている `#FF0000` `#00FF00` `#0000FF` のような形式の色を示す文字列をグレースケール化の計算式に当てはめて `#4C4C4C` `#959595` `#1D1D1D` のような文字列に置換しているだけです。さすがに埋め込み画像は変換できないのであしからず。

## 実装

正規表現で色の部分を抽出し変換するという単純な内容なので説明するまでもないでしょう

```perl:grayscale
#!/usr/bin/env perl
use strict;
use warnings;

my $text = join("", <>);
$text =~ s/(<[^>]+>)/convert($1)/ge;
print $text;

sub convert {
    my ($text) = @_;
    $text =~ s/(?<![0-9a-z])[#]([0-9a-f]{6})(?![0-9a-z])/grayscale($1)/gei;
    return $text;
}

sub grayscale {
    my ($hex) = @_;
    my ($r, $g, $b) = map { hex($_) } ($hex =~ /../g);

    my $gray = int(0.299 * $r + 0.587 * $g + 0.114 * $b);
    return sprintf("#%02X%02X%02X", $gray, $gray, $gray);
}
```

使い方

```console
$ grayscale image.svg
```

## さいごに

元図自体はカラーで作成するが、モノクロのデータを（編集可能な形で）欲しいと思い作りました。最初はそのようなツールを探したのですが意外と見つからなくて困りました。よくよく考えてみればグレースケール化なんて単純な計算なわけで、自分で作ったほうが早かったですね。

ちなみに、画面上での確認は Windows や macOS のアクセシビリティ機能で画面全体をグレースケール化できるので、それを使えばソフトウェアの機能に依存せずにできます。Windows はショートカットキーがあるので切り替えも楽ですね。macOS はショートカットキー割り当てられないのだろうか？
【TailwindCSS】HTMLのスケルトンを生成する方法

以下のサイトに対象のHTMLを入力するとスケルトンが生成されます。

https://skeletongenerator.com/

![スクリーンショット 2024-11-08 0.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/01f57ec7-f48d-b21d-3bee-7249104c5a13.png)

![スクリーンショット 2024-11-08 0.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/970c17e4-2c7f-0f20-705d-b939383c2f66.png)
Code Spell Checkerのエラー指摘の色を変える方法

setting.jsonに以下を追加する

```
"workbench.colorCustomizations": {
        "editorInfo.foreground": "#eee8aa",
        "editorInfo.background": "#eee8aa",
    }
```
## 注意点
他のエラーメッセージの色も変わってしまう
LaTeXの``Overfull \hbox (10.07695pt too wide)``メッセージとか

## 参考
https://github.com/streetsidesoftware/vscode-spell-checker/issues/128
Excelが応答待ちになったとき強制終了させるフロー

## 応答待ちのExcelを強制終了させるフローです

### 自己紹介

初めまして！駆け出しRPAエンジニアをやっているロンメルです！
初投稿となりますが、暖かく見守ってくださると嬉しいです！

### フローを作ろうと思った経緯

Excelが応答待ち状態になったとき、再起動を待っている時間がもったいなく感じたことはありませんか？

まさに、作業中の私です･･･

そんな感想をお持ちである、画面の向こうのあなたに！
お得なUiPathのフローをお伝えしましょう（半分ネタ的なものですが･･･笑）！！

### フローの中身

フローとしては、非常にシンプルなものとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920549/3a11ded8-4355-e393-32b2-5bf15f0861e1.png)

①プロセス強制終了アクティビティ1つとプロセス名に"Excel"と書くだけです！
また、プロセス名にPowerPointであったりWord、Chromeと書くと、該当するアプリやブラウザを閉じることもできます！

②上記アクティビティを作ったら「実行」ボタンを押して～自動で閉じてくれます（再起動ウィンドウ待たないで、強制的に閉じます！）！

:point_up:ただ、注意点としては強制終了させるので、強制終了させる前に必ずセーブの推奨orセーブしなくても良い内容か確認した方がいいです！

### まとめ

このように、Excelを強制終了させるフローを紹介しました。
今後も、どんどんQuitaに「これはイイ！」と思ったもの投稿していきますので、よろしくお願いします(_ _)