OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者の備忘録】Slackの自分用ダイレクトメッセージを用いて業務効率の改善を行うコツ

　ラバーダック・デバッグとは、**達人プログラマー: 熟達に向けたあなたの旅(原題: The Pragamtic Programmer: From Journeyman to Master)** において、「プログラマーがラバー・ダックを持ち歩き、ラバー・ダックに向かってコードを1行ずつ説明することによりデバッグを行う」という話が元となっている、デバッグ手法である。
 　この場合、「無生物に対して独り言を行う」事によって、「コードを説明して問題の原因を探し出し、デバッグする」ということを行っている。しかしながら、「独り言を行う」という行為は、環境によっては(周りのことを考えると)できないケースがある。
  　そこで、別記事でも述べられているSlackでのダイレクトメッセージによるラバーダック・デバッグについて、実際に3ヶ月ほど実践したときに行った事、コツを挙げる。
   <https://qiita.com/karronoli/items/b1e9c47ad03db2b92a4b>

## チャット用SNSの書き方に則ってアイデアを短く書く
　Slack分報の別記事でも紹介されている書き方のように、チャット用SNS(例として、X(旧Twitter)やLINEなど)のように、一言だけやった(やっている)ことを返すスタンスを取っている。これによって、アウトプットのハードルを下げて、「良いものを出さなければならない」事によるプレッシャーを減らすことはできる。
 　<https://freelanch.co.jp/useful/times/>

## 過去のアイデアが間違っていたとしても、削除・変更するのではなく(必要ならば)線を引く
　~~「過去にあげたけど後々見ると間違っているアイデア」~~
 
　当然だが、誤字があったら文の見やすさの観点から、編集による変更をするべきではある(Slackのようなデジタルツールならばそれを行うのは容易い)。ただし、「思考ルートを保存する」という観点から見れば、過去のアイデアが間違っていたとしても、それは消してしまうべきではない。それは「失敗に至ったルート」としても活用して、消去法で正確なルートを導くことができる。

## コードを読んでいくときは、箇条書きにする
　ラバーダック・デバッグにおける「一行ずつ読む」という特性上、(見やすさ、読みやすさの観点から)Slackの「箇条書き機能」は非常に相性がいい。個人的なおすすめとしては、コード行の把握がしやすい「1. , 2. , 3. , ......」である。以下に例を示す。

 ```
 .......
 const generatePath = (pathname: string, params: object) => {
  // パスの中でコロン（:）で始まるパラメータ名を抽出する
  const paramNames = pathname.match(/:[^/]+/g) || [];

  // パラメータが足りない場合はエラーを投げる
  paramNames.forEach((param) => {
    const paramName = param.substring(1); // コロンを取り除く
    if (!(paramName in params)) {
      throw new Error(`Missing required parameter: ${paramName}`);
    }
  });

  // パスを生成する
  let generatedPath = pathname;
  paramNames.forEach((param) => {
    const paramName = param.substring(1) as keyof typeof params; // コロンを取り除く
    const paramValue = params[paramName];
    generatedPath = generatedPath.replace(param, paramValue);
  });

  return generatedPath;
};
......

1. generatePathはpathname(string)とparams(object)をパラメータとする関数
2. paramNamesは、受け取ったpathnameからコロンから始まるパラメータを取得した配列
3. paramNames.forEach((param) => {});という処理でparamNamesの中の要素paramごとに処理(4~5)
4. 要素paramからコロンを取り除いたparamNameを定義する
5. paramsの中にparamNameが存在しないときはエラーメッセージ
6. 変数generatePathにpathnameを代入
7. paramNames.forEach((param) => {});という処理でparamNamesの中の要素paramごとに処理(8~10)
8. paramNameに、paramの最初の一文字(コロン)を除いた部分文字列を代入しつつparamsのキーとする
9. paramValueは、paramsからキーparamNameを用いて取り出した値
10. 変数generatePathのparam部分について、paramValueに置き換える
11. 変数generatePathを返す
```

## 緩急をつけてこれを行っていく
　「長く続けていく方法」は人によって様々であるので、これについては一個人の意見である。緩急をつけるべきと思っている理由は、「アレやコレをしなければならない」というプレッシャーを除いて、自然と行うことのできる習慣に昇華しようという意図があるためだ。

 ## 後書き
 　個人的にSlackの自分用ダイレクトメッセージを用いて、業務効率の改善を図った際に、行ったことを述べさせてもらった。しかしながら、人によって意見はさまざまであると思うので、「自分が思う業務効率の改善手段」があれば、是非ともコメントなどに書いていただけると、とても助かる所存である。
【初心者の備忘録】別ドメインのURLへの遷移時にRTK Queryのdata依存のブラウザタイトルを確実に更新したい！

　静的なブラウザタイトルはともかく、RTK Queryのdataに依存している、といった動的なタイトルは読み込みが必要になる。今回は、「別ドメインへのURLへ遷移した時に、RTK Queryのdataに依存した、動的ブラウザタイトルを更新する」ケースへの備忘録を書いた。

 　今回のケースに当てはまる条件としては、以下のように定めている。
  1. 遷移元、遷移先ともにTypescriptによって記述、かつ両方管理している 
  2. react-router v6以降を想定
  3. 遷移は関数によって行われる(aタグなどを用いない)
  4. 遷移元ではNext.js関連のライブラリを使わない

## useNavigateは同ドメインのみで用いることが可能

　他のサイトでも述べられているが、useNavigateは、react-router v6において、同ドメインでのページ遷移のみに用いることができるのである。要は、別ドメインでの遷移を無理やり行うと、おかしくなってしまうのである。

<https://stackoverflow.com/questions/71606230/usenavigate-navigate-to-external-link>

 <https://reactrouter.com/en/main/hooks/use-navigate>

 　したがって、読み込みありの遷移方法として、次のように考える必要がある。

 ## 遷移先でRTK QueryのisLoadingを用いる

 　遷移元については、(Next.jsを用いないということは)別ドメインのURLへの遷移の方法は以下のようなものを例として挙げることができる。(方法はこれだけではない)
  ```
  /* 中略 */
  window.location.replace(......); /* ...... に適切なURL(string)を入れる */
  /* 以下中略 */
  ```

 　遷移先のコードにおいては、以下のようなコードを書いておけば良いのである。
  ```
  const { data, isLoading } = useGetHogeQuery(hogeId);
  /* 中略 */
  if(isLoading) {
      return <></>;
  };
/* 中略 */
return (
<>
  {/* ここにReact Helmet等ブラウザタイトル更新用のタグを含め、dataから文字列を受け取る */}
  </>
);
/* 以下中略 */
  ```
  　このように書くことで、RTK Queryのdataが確実にロードされるまで待つことができるので、RTK Queryのdata依存になっている動的ブラウザタイトルは更新される。

## まとめ

　ポイントとしては以下の通りである。
 1. 遷移元は、通常通り別ドメインのURLに対する遷移を行う関数を使う
 (window.locaiton.replaceなど)
 2. 遷移先において、RTK QueryのisLoadingを用いて、dataが更新されるまで待機する
cannot load such file -- sassc のエラー

# エラー文
ローカルホストを立ち上げたら
```
cannot load such file -- sassc
```
のエラーが出た

# 解消法
VSCodeの左のツリーから Gemfileを探して，
```
gem 'sassc-rails'
```
を追記．
その後ターミナルで
```
bundle install
```
すればインストールされて使えるようになる．ローカルホストの立ち上げ直しが必要？
[メモ] Intelli Jでsbtタスク(scalaサーバ)をデバッグ実行する

## やり方(1)

sbtシェルを起動し`Attach debugger to sbt shell`を実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/c641d2fb-53c9-00bc-b1d7-76d1ba0f4fbe.png)


以下のように、Debuggerコンソールで`Connected to the target VM, address: 'localhost:57356', transport: 'socket'`と表示されるのが確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/e5539fd4-a19d-5b57-f4bc-b1876017b55d.png)

なお、これはポート番号は以下のようにconfigに設定されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/690b92b6-740a-9a9e-2b49-8b00d4418a96.png)

自分の場合、やり方(1)だとブレークポイントで実行が停止しなかった。
おそらく、scalaサーバーがメインプロセス(orスレッド)からフォークされたプロセス(orスレッド)で実行されていたからであろう。以下のやり方(2)だとうまくいった。

## やり方(2)

コードの左端で `Debug MyServer`をクリックしてサーバーを起動することもできた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/e508c4be-da30-def8-8806-5f1d220f5b03.png)

sbt shell内でサーバーが起動されているのが確認できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/5461031c-d9ff-39fc-e865-8a07899c89d4.png)
date-fns v4のリリースノートを読もう

date-fns v3から何か変わるのかが気になるので、date-fns v4のリリースノートの要約を書いておく。個人的にいちいち翻訳をするのが面倒だから、というのが動機だ。

<https://blog.date-fns.org/v40-with-time-zone-support/>

## タイムゾーンのサポート

　date-fns v3までは、タイムゾーンを考慮するには、サードパーティ製のdate-fns-tz(<https://www.npmjs.com/package/date-fns-tz>)を使う必要があったが、今回のリリースによってその必要が無くなり、外部パッケージの@date-fns/tzを用いることが可能になった。リリースノートから引用したコードを閲覧すると、
 
 ```js
import { TZDate } from "@date-fns/tz";
import { addHours } from "date-fns";

// Given that the system time zone is America/Los_Angeles
// where DST happens on Sunday, 13 March 2022, 02:00:00

// Using the system time zone will produce 03:00 instead of 02:00 because of DST:
const date = new Date(2022, 2, 13);
addHours(date, 2).toString();
//=> 'Sun Mar 13 2022 03:00:00 GMT-0700 (Pacific Daylight Time)'

// Using Asia/Singapore will provide the expected 02:00:
const tzDate = new TZDate(2022, 2, 13, "Asia/Singapore");
addHours(tzDate, 2).toString();
//=> 'Sun Mar 13 2022 02:00:00 GMT+0800 (Singapore Standard Time)'
```

　(タイムゾーンがサポートされただけではなく、サマータイムも考慮されている。)
　
　その他のことをまとめると、以下のようになっている。

 - 全ての関数において、引数と結果の両方を最初のオブジェクト引数(Date、Date拡張インスタンス)に正規化する(→さまざまな種類のタイムゾーンが混在できる)
 - タイムゾーンが影響する可能性のある全ての関数において、使用するタイムゾーンを明示的に指名できるオプション **in** がある(以下、公式リリースノートより引用)
 
 ```js
import { tz } from "@date-fns/tz";

// Will calculate in Asia/Singapore
differenceInBusinessDays(laterDate, earlierDate);
//=> 262

// Will normalize to America/Los_Angeles
differenceInBusinessDays(laterDate, earlierDate, {
  in: tz("America/Los_Angeles"),
});
//=> 261
```

## バンドルのフットプリント

- タイムゾーンは@date-fns/tzによってほとんど処理される
- TZDate、UTCDateともに他社と比べてサイズが小さい

## 破壊的変更

　まとめると、以下のようになっている。要するに、極端な破壊的変更はない。

- Dual ESM/CommonJSパッケージである(CommonJSサポートの廃止はしていない)
- ESMファーストの書き方となっており、package.jsonに"type": "module"があり、.mjsではなく.cjsがある
- いくつかの型(主に関数ジェネリック)を変更。一応通常の使用に影響はない(エッジケースあり)

---

　**v5.0以降の展望** は公式のリリースノートにはあるが、date-fns v4とは直接関係がないので、今回は翻訳・要約をしなかった。

 　今回の記事ではdate-fns v4のリリースノートの要約を行った。翻訳したパートにおいて足りていない部分などがあったら、是非ともコメント等を残していただけると助かる所存である。
スレッドセーフ等が付いたキューとして使えるSystem.Threading.Channels (2)応用の紹介編

# 概要

[前回の記事](https://qiita.com/spc_ksudoh/items/31265c51922658aa7123)で、排他などもできる便利なキューとしてSystem.Threading.Channelsを使うという切り口で、基本的な使い方の紹介をしました。今回は、ちょっとした応用の使い方を書こうと思います。

# デリゲートを入れて、処理の待ち行列にもできる

「キュー」と言われたときにイメージするのは、やはりデータを入れるキューだと思います。

System.Threading.ChannelsはGenericなので、自由な型を与えることができます。ということは、Action型等のデリゲートを与えることもできます。

つまり、次のようにバラバラの処理の待ち行列としても使えるということです。

```csharp
var queue = Channel.CreateUnbounded<Action>();

//Enqueue側
await queue.Writer.WriteAsync(()=>{
	Console.WriteLine("1つ目のAction");
});

await queue.Writer.WriteAsync(()=>{
	Trace.WriteLine("2つ目のAction");
});

//Dequeue側
await foreach(var dequeueData = queue.Reader.ReadAllAsync()){
	dequeueData.Invoke();
}
```

Enqueue側で入れたバラバラな処理を、Dequeue側では内容を意識することなく順番に実行できています。

# Dequeue側で「空になった」時の処理分岐も可能

シンプルな使い方では、キューの中身があれば取り出し、無ければ待つ、というのを1メソッドで行うシンプルな処理でした。これは便利なメソッドですが、もっと細かく書くこともできます。例えば「空の時だけフラグを立てる」といった処理も可能です。例えば次のようになります。

```csharp
var queue = Channel.CreateUnbounded<Action>();

bool isEmpty;

//Dequeue側
while(true){

	if(!queue.Reader.TryRead(out var item)){
      //キューが空の場合
      isEmpty = true;
      if(!await queue.Reader.WaitToReadAsync()){
          //キューがCompleteされた場合
          break;
      }
      //キューにアイテムが入ってきた場合
      isEmpty = false;
      continue;
	}
	//デキューできた場合
	//itemの処理をする
}
```

TryReadは、取得を試みてすぐに成否を返します。失敗した場合は空なので、WaitToReadAsync()で取得可能になるまで待ちます。これらを利用してReadAllAsync()と同じような使い方になるようにループを組んだものです。キューが空の状態のときだけ、isEmpty=trueになっています。

# 処理が成功するまでキューから消さない事も可能

Dequeue側で取り出した時点でキューから消すのではなく、処理が成功した場合だけキューから消したいというケースも有ります。いわゆるfront→popです。System.Threading.Channelsはそういう処理にも対応しています。TryPeekというメソッドがあり、Peekで取得しても、Readで取得し直すまではキューから消えることはありません。似たようなキューのライブラリを使ったことがあれば、よく出てくる組み合わせだと思います。例えば、次のような使い方になります。

```csharp
var queue = Channel.CreateUnbounded<Func<bool>>();

//Dequeue側
queue.Reader.TryPeek(out var item)

//処理（失敗時は例外を投げる）

queue.Reader.TryRead(out _)
```

この例だと、処理が失敗した場合は例外になってReadへ進まないので、キューの中身は消えません。

シンプルな処理なので、Peekしている間に他スレッドのReadをブロックするような機能はありません。Dequeue側が複数スレッドの場合は、Peek～Read間を排他するなど、何か工夫は必要になると思います。

# まとめ

System.Threading.Channelsは最低限のキューとして使うのも簡単ですが、応用的に「こういう使い方をしたい」という要望にも割と応えてくれます。今回の記事も合わせるとだいぶ色々なケースで使えると思うので、お勧めです。
Agentforce Service Agent

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

--------------
+ [Quick Start: Build Your First Agent with Agentforce](https://qiita.com/Keiji_otsubo/items/e0105f65d4216784d5ad)
+ [Einstein for Service](https://qiita.com/Keiji_otsubo/items/156874f1cca676255ef0)

# Agentforce エージェントとは何ですか?

Agentforce エージェントは、従業員や顧客に専門的な常時サポートを提供するプロアクティブで自律的なアプリケーションです。エージェントには、特定の役割に応じてタスクを実行するために必要なビジネス知識が備わっています。

### エージェントの役割は何ですか?

役割はエージェントの目的です。役割は、実行すべき仕事と、エージェントがチーム内で達成すべきより広範な目標を定義します。

### エージェントの信頼できるデータとは何ですか?

信頼できるデータとは、エージェントが役割を遂行するために必要な情報です。これには、会社のナレッジ記事、CRM データ、データ クラウド経由の外部データ、公開 Web サイトなどが含まれます。

### エージェントのアクションとは何ですか?

アクションは、エージェントがトリガーまたは指示に基づいてジョブを実行するために実行できる定義済みのタスクです。たとえば、フロー、プロンプト テンプレート、または Apex を実行できます。

### エージェントのガードレールとは何ですか?

ガードレールは、エージェントが実行できることと実行できないことを定義します。これらは、人間にエスカレーションするための自然言語の指示である場合もあれば、Einstein Trust Layer に組み込まれたセキュリティ機能から提供される場合もあります。

### エージェントのチャネルとは何ですか?

チャネルは、エージェントが作業できるアプリケーションです。Web サイト、CRM、モバイル アプリ、Slack などがこれに該当します。

https://www.salesforce.com/agentforce/

https://trailhead.salesforce.com/content/learn/modules/agentforce-service-agent-quick-look/get-started-with-agentforce-service-agent

# Agentforce サービスエージェントと Einstein ボットの違い

|違い|Agentforce サービスエージェント|アインシュタインボット|
|:----------|:-------------------------|:-----------------------------------|
|設定|事前に構築されたトピックとアクションを使用して、数分でセットアップできます。AI エージェントは、生成 AI と大規模言語モデル (LLM) を搭載しており、人間と同様の柔軟性と会話機能を提供します。|セットアップでは、顧客の言語を理解してダイアログを設計するために、自然言語モデル (NLM) を手動でトレーニングする必要があります。|
|メンテナンス|すぐに使用できるトピック、アクション、および手順をいくつか更新するか、サービス リクエストの増加に応じて独自のトピック、アクション、および手順をすばやく作成します。自然言語の手順を追加して反復することで、パフォーマンスを簡単に向上できます。|ダイアログとインテントを最新の状態に保ち、サービス要求の増加に応じて新しいダイアログとインテントをトレーニングするには、高度なメンテナンスが必要です。|
|コンテキストと例外処理|人間の言語を理解し、フォローアップの質問や予期しない例外に対応し、会話全体のコンテキストを把握します。|人間の言語を理解できず、最新の質問にのみ応答します。会話全体の文脈がありません。|


# Agentforceエージェントの種類

|種類| 説明|
|:----------------------|:-------------------------------|
|Agentforce サービスエージェント|自然な応答により、24 時間 365 日、チャネル全体で顧客ケースを自律的に解決します。|
|アインシュタイン副操縦士|従業員が日常業務を半自律的に遂行できるよう支援し、生産性を高め、人間と連携します。|
|Agentforce SDR エージェント (営業開発担当者)|インバウンドリードを選別し、販売者向けの会議を予約することで、販売者が 24 時間 365 日パイプラインを自動化できるように支援します。|
|アインシュタインセールスコーチ|各販売者に専用の AI コーチを提供し、各取引に合わせたオンデマンドのリアルなロールプレイとパーソナライズされたフィードバックを通じて、販売者を最高の担当者に育てます。|


# トレイルヘッド

+ [Step not yet complete in Agentforce](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifvrJ)

:::note
My issue was resolved by: Set up>>Agent>>Coral Cloud Agent>>Open in builder>>Experience Management>>This Topics Actions>>Click on " + "  >> Query Records (Beta) >>Finish. 
:::
投稿 79 「ls -a」カレントディレクトリの確認 2024/09/17

本日の勉強時間　3H
```
ls -a 
```

LinuxやmacOSなどのUNIX系オペレーティングシステムで使われるコマンド。

注：マルチタスク、マルチユーザを実現した
　　オペレーティングシステム（OS）の1種。

ls はディレクトリ内のファイルやフォルダをリスト表示するコマンド。


-a オプションを付けると、通常は隠しファイルとして扱われるドットファイル（名前が「.」から始まるファイル）も表示します。

例えば、.bashrc や .gitignore などです。
.gitignoreの中にenvを入れてGitで表示させないような処理を思い出す。


Dockerのコンテナ内でこのコマンドを使う場面としては、
環境設定ファイルやその他の隠しファイルを確認したい場合が挙げられます。

たとえば、Dockerコンテナに入っているときに設定ファイルの調整が必要な場合
ls -a を使ってどのファイルが存在しているか確認し
環境を適切に構成する手助けになります。

自分が今どこにいて、カレントフォルダにファイルやフォルダが存在しているかの確認を行う。
eclipseショートカット

## eclipseショートカット
よく使用するショートカット
### 通常時
- ctrl + Shift + O
必要なクラスを自動インポート
- ctrl + F11
前回の実行の再実行
- ctrl + {
ソースの表示を左右に分割
- ctrl + F3
宣言を開く（メソッド宣言へ飛ぶ）
- ctrl + shift + F
フォーマット揃え（設定要確認）
- alt長押し + 矢印キー
選択している行を移動

### デバック時
- F6
ステップオーバー
- F5
ステップイン
Java メソッドの基本（抜粋）

## 基礎（一部抜粋）
### メソッドの呼び出し方（自クラス）
- staticがついているメソッドからは、staticがついていないメソッドは呼び出せない
- staticではないメソッドは「インスタンスメソッド(動的なメソッド)」とも言う
そのため、インスタンス化する必要がある
1.クラスのインスタンスを作る
```
例）
Main a = new Main();
```
2.クラスのインスタンスを使ってメソッドを呼び出す
```
例）aクラスにprintHelloインスタンスメソッドがあるとする
a.printHello();
```
### メソッドの呼び出し方（他クラス）
- staticなメソッドからstaticなメソッドを呼び出す場合は 
「クラス名.メソッド名」
-  staticなメソッドからstaticでないメソッドをメソッドを呼び出す場合は
1.インスタンス作成
```
例）
Other other = new Other();
```
2.インスタンスを使ってメソッド呼び出し
```
例）otherクラスにprintHelloインスタンスメソッドがあるとする
other.printHello();
```
## オーバーロード
引数（型、数、順序）が異なっていれば同じメソッド名が作成できる。
改修する際に、既存のメソッドをいじると影響範囲がわからない場合、同じメソッド名で引数を変えることで悪影響を与えずに明瞭性や利便性が向上する。
※例えば、printlnにどの型の引数を渡してもエラーにならないのは、オーバーロードされているためである。呼び出し側からしたら意識せずに済むので大変楽。
## staticメソッド
処理内容が決まっているメソッドに対して使用する。
（静的メソッド）
インスタンスメソッドは、中身が決まっていない場合（呼び出し側に詳細処理は任せたい場合）に使用する（動的メソッド）
そのため、インスタンスを作成せずインスタンスメソッドを呼び出しても、中身がないため呼び出せずエラーとなる。

## 命名規則
### 変数名、メソッド名
**方式：ローワーキャメルケース**
- 先頭小文字。他も小文字。
- 複数単語を組み合わせる場合、2単語目以降は単語の先頭を大文字にする
- メソッド名は意味を明瞭にする
例）何かを取得するメソッドの場合
`getSomething`や`getWeather`にする
- 動詞を使用する
メソッドは何らかのアクションを表すため、動詞で始めることが多い
例）`add` `get` `print`
- 短く簡潔に
- 一貫性
同じプロジェクト又は、同じチーム内でメソッド名に一貫性を持たせる。
- 省略形を避ける
### クラス名、インターフェース名
**方式：アッパーキャメルケース**
- 先頭大文字。他小文字。2つ以上の単語を連結する場合に単語の先頭を大文字とする。
### 定数名
**方式：大文字のスネークケース**
- すべて大文字。2つ以上の単語を連結する場合、アンダーバー(_)で連結

## 配列の受け渡し
例）引数が配列
```java
int[] a = {10, 20, 30};
displayArray(a);

static void displayArray(int[] array){
    for(int i=0;i<array.length;i++){
        System.out.println(array[i]);
    }
}
/** 結果：
* 10
* 20
* 30
**/
```
例２）戻り値が配列
```java
int[] a = getArray();
for(i=0;i<a.length;i++){
    System.out.println(a[i]);
}

static int[] getArray(){
    int[] array = {10,20,30};
    return array;
}
```
### 参照型の引数
- 呼び出し側の引数が基本データ型の場合、メソッドの引数に箱ではなく値がコピーされて処理される。
そのため、メソッド内で変数値を書き換えても元の値は上書きされない。

- 呼び出し側の引数が参照型の場合、メソッドの引数に箱（値の住所）がコピーされて処理される。
そのため、メソッド内で参照先データを書き換えた場合、呼び出し側の参照先データに影響する。
（上書きされる）
Android開発における条件分岐とループを理解しよう


Hello Android！
Android開発に限らずですが、
非常によく使われる「条件分岐」と「ループ」について、主に初心者向けに解説しますぜ。
開発の実務においては息を吐くように使うので繰り返し学んで身につけよう！

---

## そもそも条件分岐って？
  
「条件分岐」とは、特定の条件に基づいてプログラムの流れをつくったり変えたりすること。
たとえば、コンビニでたばこを売る店員さんも「この人提示している身分証が20歳以下ならたばこは売れない」というように、その時の動作を決めてますよね？
これプログラムも一緒で明示的にやる感じです。

### ①if文

最も基本的な条件分岐は `if文` です。
これは、英語そのままの意味で「もし条件が成立したら、この処理を実行する」という意味を持っている。

#### 実装例
```kotlin
val age = 18

if (age >= 18) {
    println("あなたは成人です。")
} else {
    println("あなたは未成年です。")
}
// 実行結果 -> あなたは成人です。
```

上記のコードでは、`age` という値が`18`以上なら成人で、それ以外なら未成年と判断するためのプログラム。
`>=` は「以上」という意味で`不等号記号`と呼ばれるものです。(なんか中学生のときやったよね)


---
じゃあif文完全に理解したと思うので以下の条件式を気合いでに実装してみてください。
---

条件：
・数値が50以上の場合は「50以上です」
・それ以外の場合は「50未満です」


※紙に書いてもKotlinPlayGround使ってもいいです。
KotlinPlayGround↓
https://play.kotlinlang.org/#eyJ2ZXJzaW9uIjoiMi4wLjIwIiwicGxhdGZvcm0iOiJqYXZhIiwiYXJncyI6IiIsIm5vbmVNYXJrZXJzIjp0cnVlLCJ0aGVtZSI6ImlkZWEiLCJjb2RlIjoiLyoqXG4gKiBZb3UgY2FuIGVkaXQsIHJ1biwgYW5kIHNoYXJlIHRoaXMgY29kZS5cbiAqIHBsYXkua290bGlubGFuZy5vcmdcbiAqL1xuZnVuIG1haW4oKSB7XG4gICAgcHJpbnRsbihcIkhlbGxvLCB3b3JsZCEhIVwiKVxufSJ9

はいどうぞ！
・
・
・
・
では、答え合わせです。

#### 例題の答え
```kotlin
val number = 80

if (number >= 50) {
    println("50以上です")
} else {
    println("50未満です")
}
// 出力結果 -> 50以上です
```
⇧こんな感じで良いと思います。

----
### ②追加条件を加える：else if

複数の条件をチェックしたい場合、`else if` を使います。
もしも、更に、、、条件を!!!みたいな感じです。

#### 実装例
```kotlin
val score = 85

if (score >= 90) {
    println("優秀です！")
} else if (score >= 70) {
    println("合格です！")
} else {
    println("もう少し頑張りましょう。")
}
// 出力結果 -> 合格です
```

⇧この例では、`score` が90以上なら「優秀です！」、70以上なら「合格です」、それ以外は「頑張りましょう」と表示できるようにするプログラムです。

---
んじぁさっきの応用になるのでやってみますか。
---

以下を実装してみてください
条件：
・数値が50以上の場合は「50以上です」
・数値が80以上の場合は「80以上です」
・それ以外の場合は「50未満です」

はい！いってらっしゃい！
・
・
・
・
良い感じですか？答え合わせです。

#### 例題の答え
```kotlin
val number = 80

if (number >= 50) {
    println("50以上です")
} else if (number >= 80) {
    println("80以上です")
} else {
    println("50未満です")
}
// 出力結果 -> 80以上です
```
⇧余裕ですか、さすがです。

---


### ③複数の条件を使う：論理演算子

`if文` では、複数の条件を組み合わせることもできます。
例えば「且つ（AND）」や「または（OR）」のような条件を扱うことが可能です。
簡単に言えば優柔不断になれます。

#### 実装例
```kotlin
val isSunny = true
val isHoliday = true

if (isSunny && isHoliday) {
    println("今日はピクニックに行こう！")
}
// 出力結果 -> 今日はピクニックに行こう！
```

`&&` は「且つ（AND）」を意味し、両方の条件が `true` の場合に処理が実行されます。
ちなみに「または（OR）」は`||`で表します。

---
もう大体大丈夫ですよね？
では、最後になるので以下のプログラムを作ってみて下さい。
--

条件：
・天気が晴れで休日であれば「今日は良い天気です」
・天気が悪いけど休日であれば「家でゴロゴロします」
・天気が良いまたは、休日であれば「お出かけの計画を立てよう」
・それ以外は「仕事の日です」
さあどうぞ！
・
・
・
・
若干条件が複雑ですかね？答え合わせの時間です。

#### 例題の答え
```kotlin
val isSunny = true
val isHoliday = true

if (isSunny && isHoliday) {
    println("今日は良い天気です")
} else if (!isSunny && isHoliday) {
    println("家でゴロゴロします")
} else if (isSunny || isHoliday){
    println("お出かけの計画を立てよう")
} else {
    println("仕事の日です")
}
// 出力結果 -> 今日はピクニックに行こう！
```
こんな感じです。

---

## まとめ

今回は、Android開発における基本的な条件分岐を簡単にまとめました。
実際実務ではより複雑な条件でループ処理と組み合わせたりすることもあると思いますが基本を理解していれば難しくはないはずです。
何度も練習しましょう！

### ポイントまとめ
- `if文` で条件に応じた動作を設定

- 条件分岐とループを組み合わせて、柔軟なプログラムが書ける


---
わかりにくい部分や、要望、間違えなどあればコメントくれると嬉しいです。
Chromeの地味に便利なショートカット技


テキストのURLをドラッグ＆ドロップすると遷移してくれる

![chrome.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/e618f6ee-2929-cced-33cc-b71ed32fcf8d.gif)

いちいちURLバーに入力する必要がないから地味に便利
Eclipse サーブレット実行で404エラー

## エラー内容
スッキリわかるサーブレット&JSP入門　第2版P.94-97
サーブレットクラスを作成して実行した際に、「404エラー」となる。
（URLとWebServletアノテーションは誤字脱字なし）

## 解決方法
１．タブ「プロジェクト」→クリーン　★重要
２．サーバー再実行
３．サーブレットクラス右クリック>実行>サーバーで実行
[MacOS] 評判最悪のCisco Anyconnect。議論百出の２つのトラブルをぶった斬る魔法の手順。

＜環境は、MacOS14、Sonoma＞


VPNクライアントアプリのCisco Anyconnectは、世界的に非常に広く使われているが、色々なエラーが頻発して、非常に評判が悪い。
Ciscoの公式ページを見ても、有効な解決策は記載されておらず、一般のIT系掲示板とかから、解決法を探すしかない。今回、突然、Anyconnectが動作しなくなったので、アンインストールの上、再インストールという手順を踏んだ。

その過程で発生した２つのトラブル解決策を下記に書く！

＜手順１＞
再インストール時に、「Anyconnectがアンイストールされていないから、インストールできません。」とのエラーが出る。（下）
![anycconnect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/d4d4d1c5-9227-1ece-a389-1a02b00297b6.png)
"AnyConnect Secure Mobility Clientはこのディスクにインストールできません。"

アプリのアンイストールは完了しているのだが、設定が残っている状態。
ターミナルを立ち上げて、下記コマンド実行後、再起動で一発解決。（つまり、手動で設定を消す。）

```
UserXXX@UserXXX-mac ~ % ls /var/db/receipts   // 設定ファイルを見る。
com.cisco.pkg.anyconnect.vpn.bom
com.cisco.pkg.anyconnect.vpn.plist
com.cisco.pkg.jabberplugin.bom
com.cisco.pkg.jabberplugin.plist
UserXXX@UserXXX-mac ~ % sudo rm /var/db/receipts/com.cisco.pkg.anyconnect*　// anyconnectがあれば、消す！
UserXXX@UserXXX-mac ~ %
```


＜手順２＞
新しいバージョンのインストール後に、この訳の分からないエラーが、30秒おき発生。
30秒おきに出てきて、非常にイラつきます！

原因は不明。解決策もネットにロクにないが、Anyconnectをフォルダーごと削除でクリア。再起動は必要です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/bd3afc5c-aa15-3cfe-ace5-b5d451da89ff.png)
"the vpn client agent was unable to create the interprocess communication depot."

```
UserXXX@UserXXX-mac ~ % sudo rm -rf /opt/cisco　// "the vpn client agent was unable to create the interprocess communication depot."エラーを消す、魔法！！！
UserXXX@UserXXX-mac ~ % 　
```

勘が良い人は気づいたと思うが、２の手順で、Anyconnectを完全に消すことになるので、上の問題が同時発生した時は、手順１と２を何度か繰り返す必要がある。
私の場合は、まず、再インストールできないから、まず手順１。その後、２のエラーが出たので、手順２に進む。再起動後に、再度、インストールと言う手順を踏みました！
転職ドラフトを使って転職活動をしてみた話

どうもこんにちは、たくびー(@takubii)です。

今回は転職体験談として記事を書こうと思います。

こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています。

https://job-draft.jp/articles/251

# 登録したきっかけ

エンジニアの転職サイトは様々なものがあります。
その中で最近気になっていたサービスが転職ドラフトでした。
一般的なスカウトサービスと少し異なり、企業様が求職者を指名するという形式に惹かれ登録しました。

# 登録してから

最初の月は指名が0件でした。
レジュメの質や未入力の部分等があったため、そのあたりで他の候補者に遅れをとったかなと自己分析しています。

この件で、指名をもらうのも簡単ではなさそうだと思い、添削サービスを使ってレジュメを洗練させていきました。

翌月以降はボチボチ指名も来て、自分の相場が分かってきました。

# 指名を承諾するまで

結論から言うと、最終的に指名を承諾するまで半年ほどかかりました。
その間に受けた指名数は10件でした。

とても魅力的なオファーは複数あったのですが、今回の転職で求めていたものを達成するために、かなり欲張りつつ進めました。

指名が来た際、その会社のプロフィールやどのような業務を任せていただけるのか詳細に書かれているため、興味のあった企業からのオファーでは自分が入社した後どのように仕事していけるかイメージできて、とても使いやすかったです。

オファーを受けた後は基本的にカジュアル面談を行い、数回面接をするという企業が多かったです。
また、コーディング面談等も実施している企業は多く感じました。
指名＝書類選考の突破みたいなものなので、書類選考で落ちるというような感覚がない点は良かったです。

# 総じて今回の印象

転職ドラフトに参加している企業は魅力的な企業が多く、それらの企業が自分のレジュメを見てくれているというのを感じられるのが良かったです。

今後さらに参加企業が増えていき、エンジニア転職と言えば転職ドラフトだよねという雰囲気になると、エンジニアとしても選ばれているという感覚になり、自己肯定感が高まり、より業務、技術への向上心が上がるのではないかと思いました。

今回内定いただいた企業では私の達成したい目標をほとんど叶えられたので、今後業務を頑張っていきたいと思います。
WebSocketとSocket.IOとは？リアルタイム通信の選択肢

## はじめに
0からチャットアプリの開発をしてみようと思い、開発手法を調べていく中でリアルタイム通信を実現させるためにはWebSocketやSocket.IOという技術が必要だということを知りました。

本記事では、WebSocketとSocket.IOの基本的な特徴や機能を比較し、それぞれの利点や欠点について書き出してみました。

あくまで初心者の見解ですので、もし間違っていたら指摘していただけると幸いです。

## WebSocketとSocket.IOの違い
結論から言うと、WebSocketとSocket.IOの違いはプロトコルかライブラリかという点であり、Socket.IOはWebSocket上に構築されたライブラリであるということです。

以下にそれぞれの特徴を説明します。

### WebSocketの特徴
1. プロトコル
WebSocketはHTML5の一部として定義されている標準化されたプロトコルです。HTTPとは異なり、双方向通信をサポートしており、クライアントとサーバー間の接続を確立します。

WebSocketは非常にシンプルなプロトコルで、軽量。HTTPをアップグレードして接続を確立します。

2. ネイティブAPI
WebブラウザにはネイティブなWebSocket APIがあり、直接使用することができます。JavaScriptを使ってクライアントサイドのWebSocketを簡単に利用できます。

3. 低レベルのプロトコル
WebSocketはHTTPよりも下位レイヤーで動作するため、リアルタイム通信を効率的に実現するためのプロトコルではありますが、開発者はHTTPのような高レベルの抽象化を持っていないので、接続管理、再接続、メッセージフォーマットなどを自身で実装する必要があります。

### Socket.IOの特徴
1. ライブラリ
Socket.IOは、WebSocket上に構築されたライブラリであり、クライアントとサーバーの両方で使用するためのAPIを提供します。

2. フォールバック機能
Socket.IOはWebSocketをサポートしていないブラウザやネットワーク環境のために、他の通信手段(XHR, Long Polingなど)へのフォールバック機能を持っています。これによって、幅広い互換性が保証されます。

3. 高レベルのAPI
Socket.IOは高レベルのAPIである接続管理、再接続、イベント駆動型の通信など多くの便利な機能を提供しています。また、イベントベースのメッセージングシステムをサポートしており、これにより開発が容易になります。

高レベルのAPIとは、低レベルのAPIやプロトコルなどを抽象化し、より簡単に利用できるようにしたものです。これにより、主要なロジックに集中できるため、開発効率、コードの可読性や保守性の向上が期待できます。

高レベルのAPIの例には以下のようなものがある。
・Axios(HTTPリクエスト)
・jQuery(DOM操作)
・React(UIライブラリ)
・Django(Webフレームワーク)
・Socket.IO(リアルタイム通信)

4. 追加機能
接続の再試行や接続の永続化など、追加の便利な機能が組み込まれています。また、名前空間やルーム機能を提供し、複数のクライアント間での通信を容易にします。

#### まとめ
| 特徴 | WebSocket | Socket.IO |
| --- | --- | --- |
| プロトコル | 標準プロトコル | ライブラリ |
| 互換性 | ブラウザ依存 | フォールバック機能 |
| レベル | 低レベル | 高レベル |
| 接続管理 | 自前で実装 | 自動管理 |
| メッセージング | シンプル | イベント駆動型 |
| 追加機能 | 最小限 | 再接続、名前空間、ルーム機能 |

### 最後に
今回、WebSocketとSocket.IOの特徴やそれぞれの違いについて理解することができました。チャットアプリなどを開発する際は、開発効率が上がるSocket.IOライブラリを利用すべきだと思いました。しかし、だからといってWebSocketを学ぶ必要がなくなるわけではなく、WebSocketの基礎知識を理解することも重要であると思いました。
の◯太くん「助けて～！！こたえも～～～ん！！」

## はじめに
　9月上旬から、「kotaemon」というドキュメントとチャットでやりとりができるOSSが流行っているようです（図1参照）。GitHub の Star History を見ると、利用者が急増していることが分かります（図2参照）。Docker で簡単に使えるようなので早速試してみました。今回の例では、LLM に OpenAI の GPT-4o を利用しましたが、他にも、Claude や Local LLM の Ollama も利用できるようです。

- 図1 kotaemon のUI（公式GitHubから引用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/4d66a050-64af-2c9f-030d-0052625194c8.png)

- 図2 kotaemon の Star History（公式GitHubから引用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/618ea31a-578f-0ddc-8df5-e85f617b9efa.png)

## 利用方法

以下の4ステップで、ローカルでウェブサービスが立ち上がり、利用できるようになります。
※ 前提として、Docker環境は構築済みとします。

#### 1. リポジトリのクローン

　公式の README を参考に docker compose にまとめました。

https://github.com/TakanariShimbo/sample_kotaemon

#### 2. `.env.sample` を参考に `.env` を作成

　基本、サンプルそのままでOKですが、OpenAI API は設定する必要があります。また、CHAT MODEL, EMBEDDINGS_MODELは別のモデルも設定可能です。

```.env
GRADIO_SERVER_NAME=0.0.0.0
GRADIO_SERVER_PORT=7860
GRADIO_SERVER_PORT_HOST=17860

OPENAI_API_BASE=https://api.openai.com/v1
OPENAI_API_KEY=<your OpenAI API key here>
OPENAI_CHAT_MODEL=gpt-4o
OPENAI_EMBEDDINGS_MODEL=text-embedding-3-large
```

#### 3. サービス起動

　プロジェクト直下のディレクトリで、コンポーズアップしてください。

```sh
# 起動
docker compose up -d

# 停止
docker compose down
```

　ちなみに、`docker-compose.yaml`は以下のように記載してあります。
```yaml:docker-compose.yaml
version: "3.8"

services:
  kotaemon:
    image: ghcr.io/cinnamon/kotaemon:main-full
    ports:
      - "${GRADIO_SERVER_PORT_HOST}:${GRADIO_SERVER_PORT}"
    env_file:
      - .env
    restart: always
```

#### 4. ログイン

　http://localhost:17860 にアクセスすると、ログイン画面が開くと思うので、以下のように ID, Password 共に  `admin` と入力しログインしてください。すると、図1のような画面が開かれるので、お好みのドキュメントをアップロードして、質問してみてください。kotaemonがなんでも教えてくれるはずです。

```
ID: admin
Password: admin
```

## 参照
- GitHub（公式）

https://github.com/Cinnamon/kotaemon

- 生成AI図鑑
 
https://weel.co.jp/media/tech/about-kotaemon/

- ブログ

 https://zenn.dev/kun432/scraps/c0642e79169635
オッス！AutoScalingでEC2の起動・終了をオート化すっぞ！

# :pencil2: はじめに
2年くらい資格学習だけのエアプ勢だった僕が、いよいよAWSをさわり始めました。
そして最初の試練として上司から以下のような依頼をもらいました。
「EC2インスタンスを2個実行中だけど、営業時間外は使わないから止めてコストカットしよう:point_up:」

# :pencil2: AutoScalingスケジュールで実現！
該当のEC2インスタンスはAutoScalingグループで管理されているので、下記の通りスケジュールを2個作成することで実現はできました。

EC2 >AutoScalingグループ >(僕のAutoScalingグループ名) >
　オートスケーリング >予定されたアクション >予定されたアクションを作成するボタン

- 終了スケジュール
（Japan 06:00~, 希望するキャパシティ:0, 最小キャパシティ:0, 最大キャパシティ:0）
- 起動スケジュール
（Japan 21:00~, 希望するキャパシティ:2, 最小キャパシティ:2, 最大キャパシティ:10）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/24cce9c6-676f-45c8-a9e3-a984facb19f9.png)
※どこのタイムゾーンの設定で時間指定しているかには気を付けて...！

上記の設定は、以下の設定を動的に変化させるスケジュールを組むようなイメージになりますね。
　EC2 >AutoScalingグループ >(僕のAutoScalingグループ名) >詳細 >グループの詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/704d5124-d3d4-195c-7682-ab9585aa262c.png)



# :pencil2: おまけ（CloudFormation）
プロジェクトとしてはEC2インスタンスやAutScalingグループといったリソースをCloudFormationにてデプロイするようにしていたので、
上記のスケジュール作成もCloudFormationスタックのテンプレートに組み込みました。
そのときのテンプレート（yamlファイル）記述は以下になります。

```yaml
  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    # (中略)

  # 終了スケジュール
  ScaleDownScheduledAction:
    Type: AWS::AutoScaling::ScheduledAction
    Properties:
      AutoScalingGroupName: !Ref AutoScalingGroup
      DesiredCapacity: 0
      MinSize: 0
      MaxSize: 0
      Recurrence: '0 12 * * *'  # UTC時間で指定

  # 起動スケジュール
  ScaleUpScheduledAction:
    Type: AWS::AutoScaling::ScheduledAction
    Properties:
      AutoScalingGroupName: !Ref AutoScalingGroup
      DesiredCapacity: 2
      MinSize: 2
      MaxSize: 10
      Recurrence: '0 21 * * *'  # UTC時間で指定
```
※プロパティにタイムゾーン指定は無いので、時間はUTCで指定する

# :thinking: さいごに
今回はAutoScaling管理されていたので上記のような対応をしてみましたが、
EC2インスタンスを止めるためにAutoScalingスケジュールを利用するのは本来の使い方でないような気がしていて少し引っかかっています。
（EC2インスタンスを停止じゃなくて終了してるし）
こういうケースのときにより良いやり方がもしあれば、有識者のみなさん！コメントにてご教授くださいませ！！:bow:
【合格体験記】Python3エンジニア認定基礎試験

# Python3エンジニア認定基礎試験に合格した話
## はじめに
先日『Python3エンジニア認定基礎試験』を受験し、無事合格しました。

受験した動機については、Pythonの基礎勉強が概ね終わり、Djangoや各種ライブラリの勉強を本格的に始めていく前に、体系的な要素を忘れないうちに資格を先に取っちゃおう！と思ったからです。

結果は以下の通りでした。
準備は十分に行い満点を取るつもりでしたが、対策していない問題が多く、お恥ずかしながら案外分からない問題が所々ある状態でした（笑）

点数：800/1000(合格評価点：700)
準備期間：約2週間弱
教材：Pythonチュートリアル(書籍)、Dive Into Code

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665882/69f2e2ae-266a-703f-30b3-87cd90db80bf.png)

## 学習方法
僕の学習方法は、主に以下の方法で進めました。

1. Pythonチュートリアルで書籍学習(1週間程度)
2. 『Dive Into Code』で試験対策(2～3日)

書籍学習については、本に書いてある項目をひたすらVSCode上で実際に書いてみて、動作を確認しながら仕組みを理解しました。他言語の経験、特にオブジェクト指向系言語を理解されている方なら、特に詰まることなく学ぶことが出来るんじゃないかと思います。

プログラム言語未経験者の方が解説無しで勉強するのはかなり大変だと思いますので、書籍よりも __Udemy__ や __YouTube__ の初心者向け講座などでやった方が堅実そう？

文法の体系的な学習が出来たら、あとは『__Dive Into Code__』で2～3週くらい模擬試験を解き、不正解の問題が無くなるまでやれば誰でもほぼほぼ受かる状態までは持っていけます。
https://diver.diveintocode.jp/dive_into_exam/

## 所感
結論から言うと、 __受験して良かった__ です。

『資格勉強は意味がない』『取っても大して評価されない』等の意見が世間では多く、プログラミングについて勉強している初学者がこういった意見に流されて途中で学習を辞める、なんてケースはあるあるじゃないでしょうか。

正直、__資格を取ること自体に意味がない__ という意見は同意します。
僕は業務で4年程度、VB.netやJavaを用いた改修開発をやっていますが、言語はあくまで業務を遂行する上でのツールでしかないです。体系的な勉強を習得しているのは、ある意味当たり前だと思います。

じゃあ、それでも何故受けて良かったのかと言うと、それでも体系的な言語知識の勉強をするのは「__当たり前__」だからです。
僕は今Djangoを用いたWebフレームワーク技術に関心があり個人学習していますが、Python未経験の状態では特有の構文やお作法が分からないと、そもそも技術書やリファレンスに書いてあるコードが読めませんでした。

それに、体系的な学習をしたことで、静的型付け言語しか経験が無かった僕目線でPythonの豊富なライブラリや内包表記といった独特の要素に面白さを感じ、現在の学習モチベーションの土台を作ることも出来たと実感しています。

## 結論
もしこれからプログラミング学習をしてみたい、という初心者の方がこの試験を受けてみようとしているなら、是非自信を持って集中して勉強してみてください。難易度も低めなので、初心者でも頑張れば短期間で十分受かる試験だと思います。

受かったからいい企業に就職出来る、Pythonバリバリ使えるようになる、という訳ではないですが、今後のエンジニアキャリアでPythonを使ってみたいと考えているのであれば、いい足がかりになります。

今後は時間があれば、データ分析の方も学んでみようかと思います。
僕もまだまだ未熟者なので、是非一緒に頑張っていきましょう！
[Salesforce]FormatDuration関数について（数式）

## 初めに

こんにちは、初めまして。
記事を開いていただきありがとうございます。

今日はSalesforceの数式項目で使用できるFORMATDURATION関数についてです。

## FORMATDURATION関数とは

FORMATDURATION関数は、日付/時刻の差（＝経過した日数と時間）を計算してくれる関数です。

例えば、2024/1/1 08:30:00 から 2024/1/1 09:00:00までの経過時間を計算するようなことができます。
この場合は「30分」という形で計算されます。
（この場合、実際に戻ってくる値は"0:00:30:00"となります。）

Salesforceのヘルプでは以下のような説明がされています。

| 関数 | 説明 |
|---|---|
|FORMATDURATION|日数、または times または dateTimes 間の差を HH:MI:SS として省略可能にした秒数を書式設定します。|

[コンテキストごとの数式の演算子と関数(help.salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.customize_functions.htm&type=5)

上記リンク先だとFORMATDURATION関数の詳細なリファレンスページへのリンクはありませんでした。

## 必要な値（引数）

FORMATDURATION関数は２つの日時の差分を計算する関数なので、
FromとToの2つの日付/時刻データが必要となります。

* 最低限必要な値を指定したFORMATDURATION関数
FORMATDURATION(StartDateTime__c, EndDateTime__c) 
※StartDateTime__cとEndDateTime__cは日付/時刻形式のカスタム項目です。

## 帰ってくる値（戻り値）
FORMATDURATION関数の戻り値はテキスト型です。
引数として指定した２つの日時の差（秒単位）を日数＋時刻の形式で返してくれます。

### 注意ポイント
FORMATDURATION関数で返される値は<font color=red>0:</font>00:00:00で、
時刻形式ではなく、日数＋時刻の形になっています。
そのため、関数の戻り値をそのままTIMEVALUE関数等に渡すことはできません。

余談：
動作検証しているときに、先頭部分の「0:」を見落としており、
時刻に変換できずちょっとハマってしまいました。

* ちなみに関数のリストから引用すると以下の式が挿入されます
FORMATDURATION(numSeconds[, includeDays] | dateTime/time, dateTime/time) 
numSeconds[, includeDays] の部分に関しては、これがどういった挙動を示すか、
細かい動作については分かっていません。
（リファレンスのリンクをご存じの方、教えてください。）

## 最後に

日付時刻の計算は皆さんが独自の計算式で対応は可能されることも多いと思いますが、
始終の長さを求めたい場合にはFORMATDURATION関数も思い出してみてください。

テキストのままだとデータとして再利用が難しいですが、
独自の計算式で対応していたところを関数で対応できれば記述が明確になるので、
あるとうれしい関数かなと思います。
formタグ（POST）のname要素って本当に必要なん？

こんにちは！駆け出しエンジニアとして現在フロントエンドについて理解を深めている私ですが、先日Reactの勉強をしていた際にふと思ったことをまとめてみました。

# 詰まったところ
Reduxを使ってステート管理をしていたところ、ステートの更新に伴った再レンダリングが行われず、頭を抱えました。ほぼ同じ実装のコンポーネントはしっかりと動いていたのに。ステートって更新されたら基本再レンダリングじゃないの...？

React×Readuxの再レンダリングの仕組みをしっかりと理解できていないのかと思いましたが、まさかのformタグのname要素の付け忘れによるものでした。

そこで、そんなにname要素って重要なの？っていう疑問が湧いたので調べてみました！

# tl;dr
HTMLでフォームを作成してデータをどこかに送信したいときは、ほぼ確実に必要と言えるでしょう！


# 本題
では、本題に入っていきます。

### name属性なし
例えば以下のコードでフォームを実装したとします。

```HTML
<form action="#" method="POST">
  <label for="name">名前: </label>
  <input type="text" id="name" required />

  <label for="email">メールアドレス: </label>
  <input type="email" id="email" required />

  <input type="submit" value="登録" />
</form>
```
inputタグにtypeを指定しています。一見よさそうに見えますが、inputタグで受けとったデータはどこに行ってしまうのでしょうか？

以下のようにリクエストのペイロードが生成されずに正常にデータが送信できていないことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805028/1ba398f0-e9dd-253f-e84a-f8c143ba7784.png)

### name属性あり
では、name属性を付与するとどうなるか見てみます。
```HTML
<form action="#" method="POST">
  <label for="name">名前: </label>
  <input type="text" name="name" id="name" required />

  <label for="email">メールアドレス: </label>
  <input type="email" name="email" id="email" required />

  <input type="submit" value="登録" />
</form>
```
すると、先ほどは存在しなかったペイロードが生成されリクエストが無事に送信できていることがわかります。
***POSTリクエストでデータを送信する際は特別な理由がない限り、name属性は必要であるということがわかりました！***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805028/0a0181a5-240f-af7c-4079-cb3f43544b5d.png)

## 結論
| name属性あり | name属性なし |
|:-:|:-:|
| ペイロードが送信される | 送信できない |

ご覧いただきありがとうございました！！！

次回はGETメソッドについて同じような比較を行っていきたいと思いますっ！
DroidKaigi 2024: if-else と ?.let-run はどちらが好みか？

Day3の企業ブースにあった (A) と (B)、どっちが好みか？という問いを考案しました。

個人的な考えでは

- Kotlinに慣れていない人でもわかりやすいのは(A)
- いかにもKotlinぽいのは(B)
- xがvar変数でスマートキャストが効かない時は(B)にするか、(A)だと一時変数を定義するしかない
- `hoge()` がnullを返す場合は(A)と(B)で結果が変わってくる
- (A)だと二者択一という意図、(B)だと `run { }` がフォールバック的な意図が感じられる

という感じで迷います。

単純そうに見えて議論を深められるポイントがいくつかあり話題作りになればいいなと思っていました。
普段実装していて自分自身悩むことが多いので、単純にどっちの方が人気のある書き方なんだろう？という興味もありましたね。

**(A)**
```kotlin
return if (x != null) hoge(x) else {
  fuga()
  fuga2()
}
```

**(B)**
```kotlin
return x?.let { hoge(x) } ?: run {
  fuga()
  fuga2()
}
```

（昼過ぎくらいに見に行った時には半々くらいでしたね。投票してくださった方、ありがとうございました。）
Windows11 24H2でローカルアカウントはできるのか？

**Windows11** の **24H2** において **ローカルアカウント** のOS設定ができないかもという噂が流れました。みなさん覚えてますか？これを検証するために自宅で余っていたWindow11Proのデスクトップに実際に24H2を入れてみました。

# 行ったこと

以下に雑多ですが手順を書きます。走り書きですが、いちおうするべきことはしています。

### 用意したPC

「[**HP ProDesk 400 G5 SFF**](https://jp.ext.hp.com/desktops/business/prodesk_400_g5_sf/)」です。スペックのスクショは↓ です(24H2入れたあとのですけどね)。なお本体は中古で買ってからWindows11のISOで **クリーンインストール** してます。

![H24H2jpeg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/c40dc749-a913-4c97-5040-890ebfcba0f7.jpeg)



### ストレージ初期化

まず確実を期すために、↓ のM.2ストレージを摘出してNTFSフォーマットしました。摘出自体は簡単でした。

![20240915_105754933.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/5f0d558c-8f4a-91b9-e8fd-64da78c83879.jpeg)

### ISOのダウンロード

[Download Windows Insider Preview ISO](https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewiso) からダウンロードしました。なおこのリンク先は[The Windows Insider Program](https://www.microsoft.com/ja-jp/windowsinsider/) に自分のマイクロソフトアカウントでログインし登録しておかないといけませんね。

![24H2 ISO MS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/d8ab1497-6776-85aa-34f5-eeca81b67589.jpeg)

画面の下端の↑ から今回は、「**Windows 11 Insider Preview (Dev Channel) - Build 26100.1150**」をダウンロードしました。24H2の情報は [Windows 11, version 24H2 - Wikipedia](https://en.wikipedia.org/wiki/Windows_11,_version_24H2) にもありますよ。

### ISOを焼く

今回まで知らなかったのですが、Windows11のネイティブなISO焼く機能にはUSBメモリーに焼くことが出来ないのですね。なのでわざわざこちらを買ってきました。 [Rufus](https://rufus.ie/ja/)を使って焼くことも考えたんですが、あくまでネイティブな機能でということで今回は使いませんでした。

![20240915_172524125.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/c5a6ccc6-dace-cc94-5849-dc441f3072bf.jpeg)



### ブート

ずいぶんと手順を端折りますが(HPのUEFIわかりにくい💦)、下記まで来ました。いらない領域はいったん全削除してから開始します。なお、ここからしばらくLANケーブルを抜いてます。

![20240915_111125099.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/72253041-729b-4070-ee8a-40df77d7b803.jpeg)

### セットアップ

で、以下が始まりました。ここからは待つんです。

![20240915_111151476.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/82ca5e4c-2121-3c40-069e-248031f5662f.jpeg)

### 肝心のコマンド入力

入力するのは↓ です
```
cd oobe
BypassNRO.cmd
```
とりあえず、 **だめ** という噂でしたが、↑ が通じました。
![20240915_112744085.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/6bb29209-252b-20a2-c996-5687c7e3aa02.jpeg)


### ローカルアカウント総仕上げ

インターネットに接続しないを選びます。あとは一般的な手順通りに進んでください。

![20240915_112850352.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/66899229-6020-df9a-1699-8ed4c145cf32.jpeg)


### 確認

手順が最後まで進んだあと、PC名称を変更してからLANケーブルを接続してOS認証を通してください(マザボードに付帯したOSライセンスがパスするはずです)。これでちゃんとローカルアカウントでOS認証も通っているのが確認できましたね。

![H24H2jpeg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/c40dc749-a913-4c97-5040-890ebfcba0f7.jpeg)


# まとめ
「**24H2でもローカルアカウントはOK**」が結論です。さて、正式な24H2を待ちましょう。
【Amazon SageMaker】SageMaker-Python-SDKでS3の画像ファイルを読み込む

### 導入
Amazon SageMakerにおいて, Canvasストレージに設定したS3バケット内の画像データになるべく簡易な方法でアクセスしたい.
SageMaker-Python-SDKを使用すると, 比較的コード量を抑えられそうである.

### 使い方

Byteデータの画像への変換にPIL(pillow), S3へのアクセスにsagemaker(SageMaker-Python-SDK), SageMaker-Python-SDKのアウトプットをPILで受け取れる形式にするためにio(PythonのIOモジュール)を使用する.

```python
from PIL import Image
import io
import sagemaker
```

SageMakerの「Canvas ストレージの設定」にて, Amazon S3 アーティファクトの場所として以下のように設定されているとする.

`s3://sagemaker-ap-northeast-*-************`

ここにS3バケットを作成し, ファイルを配置する.

RGB画像1枚であれば以下のように読み込める.

```python
file = 's3://sagemaker-ap-northeast-*-************/<bucket-name>/<file-name>.png'
img = Image.open(io.BytesIO(sagemaker.s3.S3Downloader.read_bytes(file))).convert("RGB")
```
フォルダ内の全ファイルにアクセスする場合はlistが使える.

```python
folder = 's3://sagemaker-ap-northeast-*-************/<bucket-name>/<folder-name>'
file_list = sagemaker.s3.S3Downloader.list(folder)
```

### 実は......

sagemaker.s3.S3Downloader.read_bytesは中でio.BytesIOのストリームに対して.read()とデータ化しているため, ストリーム ⇒ データ ⇒ ストリーム, と無駄な相互変換が行われる.

これを防ぐためにはread_bytesを少し改造した方がよい.
```python
from sagemaker.session import Session
from sagemaker import parse_s3_url

@staticmethod
def read_s3_bytes(s3_uri):
    bucket, object_key = parse_s3_url(s3_uri)

    bytes_io = io.BytesIO()
    Session().s3_resource.Bucket(bucket).download_fileobj(object_key, bytes_io)
    bytes_io.seek(0)

    return bytes_io

file = 's3://sagemaker-ap-northeast-*-************/<bucket-name>/<file-name>.png'
img = Image.open(read_s3_bytes(file)).convert("RGB")

```
※処理時間的なメリットが大きいというわけではない


参考
SageMaker-Python-SDK github (https://github.com/aws/sagemaker-python-sdk)
エンジニアが使ってる難しい単語あるじゃん

# エンジニアが使ってる言葉がよくわからない！
ふつうに横文字すぎるし．意味が取れないし，ちょっと教えてもらうにも初歩的すぎる感じもするし，教えてもらった結果うーん結局よくわからないかもってなったら申し訳ないし，てかこれよく分かってなくてもプログラム書けるし！って思いながら早半年，いや，2年ぐらい経ってるのかも．そろそろ**かっこいいえんじにあ**を目指したくなってきたので，**クラス**がさ，**インスタンス**をさ，みたいな会話もしたいなとか．

# 勉強すればいいんでしょ勉強すれば！
とはいえ，どうやって勉強するの？ってなったので，思い切って**すでにかっこいいエンジニア**な人に聞いてみたら「ふつーに本読めばいける」・・・・・・

**私「うそつけ！わからんけど！ほんと？！じゃあいける！」**(この間2秒)

こんなにも単純な人間がいる？ってなるぐらい単純な人間だったので勉強してみます．まあ，”ふつーに本読む”といっても，本当に辞書を引いていれば分かるみたいなもんでもないと思うので，さっき話を聞いた**かっこいいエンジニア**が業務で使ってた（多分）Ruby on Railsを勉強しながらその辺の言葉を完全に使いこなせる**イキりえんじにあ**に大変身しちゃいたいと思います．**もしなんか違うよそれは！みたいなのがあったら教えてください！**

読んでる本：[Ruby on Rails 6 超入門](https://www.amazon.co.jp/Ruby-Rails-%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798059064)

# 単語集
#### クラス
値や処理をひとまとめにして扱える部品．オブジェクトの設計図．クラスの中にメソッドを入れる．
定義されたクラスをもとに，オブジェクトを作成する．

#### メソッド
すごく長ーーーーーいプログラムを書いても動くけど，そうじゃなくて関数にしたらいいよね！ってなるときの，関数の部分のこと．プログラムを処理ごとに分けている．

#### オブジェクト
特定の機能に関するメソッドや変数などをひとまとめにしておくもの．

#### インスタンス
クラスから作られたオブジェクト．実際に動くもの．

#### initializeメソッド
インスタンスを作成するときに，newというメソッドを呼び出す．このとき，必要な変数に値を設定しておきたいときがある．そんなときにinitializeメソッドを用意して使えるようにする．「コンストラクタ」，「イニシャライザ」と呼ばれる．newするときに自動的に動く．

#### インスタンス変数
メソッドの外に変数を持っていける．アクセサをしっかり使うことでより便利になる．

#### クラスの継承
クラスを継承することで，子クラスに書いていないメソッドでも，親クラスに書いてあるメソッドなら使用することができる．同じ名前のメソッドが両方に存在している場合，子クラスのもので上書きされて使用される（オーバーライド）
TradeWaltz: 貿易のデジタルトランスフォーメーション 貿易DX

概要
TradeWaltzは、ブロックチェーン技術を活用した貿易情報連携プラットフォームです。このプラットフォームは、
貿易に関わる全てのステークホルダー（輸出入者、物流会社、銀行、保険会社、行政機関など）を繋ぎ、
貿易業務のデジタルトランスフォーメーションを実現します。


主な機能と特徴

貿易情報の一元管理:
TradeWaltzは、貿易に関する情報や書類をクラウド上で一元管理します。これにより、紙ベースの書類や分散したデータの管理が不要になり、業務効率が大幅に向上します。

ブロックチェーン技術の活用:
ブロックチェーン技術を活用することで、データの改ざん防止や信頼性の確保が可能です。これにより、貿易書類の真正性が保証され、トラブルのリスクが低減されます。

多様なステークホルダーとの連携:
輸出入者、物流会社、銀行、保険会社、行政機関など、多様なステークホルダーが一つのプラットフォーム上で情報を共有し、効率的に連携できます。

業務プロセスの可視化と効率化:
貿易業務の進捗状況をリアルタイムで把握できるため、業務の可視化と効率化が実現します。また、重複作業の削減やミスの防止にも寄与します。

導入事例
三菱商事プラスチック株式会社:
TradeWaltzの導入により、貿易業務の効率化を実現し、業務にかかる時間と労力を大幅に削減しました。
富士フイルムロジスティックス株式会社:
貿易業務の完全電子化を目指し、TradeWaltzを活用して業務改革を推進しています。

まとめ
TradeWaltzは、貿易業務のデジタルトランスフォーメーションを実現するための強力なツールです。ブロックチェーン技術を活用した信頼性の高いプラットフォームであり、多様なステークホルダーとの連携を強化し、業務効率を大幅に向上させます。貿易業務のデジタル化を検討している企業にとって、TradeWaltzは非常に有用なソリューションとなるでしょう。
VB.NETと.NET Framework 4.8.1

概要
.NET Framework 4.8.1は、Microsoftが提供する最新のフレームワークの一つで、特にVB.NET開発者にとって重要なアップデートです。このバージョンは、既存の.NET Framework 4.8からのインプレース更新であり、
いくつかの新機能と改善が含まれています。

主な新機能と改善点
ARM64サポート:
.NET Framework 4.8.1は、Windows 11以降のARM64アーキテクチャをネイティブにサポートしています。
これにより、ARM64デバイス上でのアプリケーションのパフォーマンスが向上します

アクセシビリティの向上:
Windows Formsアプリケーションのアクセシビリティが強化され、スクリーンリーダーやその他の支援技術との互換性が向上しました。これにより、より多くのユーザーがアプリケーションを利用できるようになります

パフォーマンスの最適化:
ガベージコレクションやJITコンパイルの最適化により、アプリケーションのパフォーマンスが向上しています。
特に大規模なデータ処理やリアルタイムアプリケーションで効果を発揮します

インストール方法
.NET Framework 4.8.1は、以下の方法でインストールできます：

Windows Update: 推奨される更新プログラムとして提供されます。
Microsoft Update Catalog: スタンドアロンパッケージをダウンロードしてインストールできます

開発者向けリソース
公式ドキュメント: .NET Framework 4.8.1の詳細なリリースノートや開発者向けガイドが提供されています。
Visual Studio: 最新のVisual Studioを使用することで、簡単にアプリケーションを.NET Framework 4.8.1に
アップグレードできます

まとめ
.NET Framework 4.8.1は、VB.NET開発者にとって重要なアップデートであり、
パフォーマンスの向上やアクセシビリティの強化など、多くの利点があります。最新のフレームワークを活用して、より高品質なアプリケーションを開発しましょう。
AC100V　位相制御　LED球の　ちらつきを　防ぐ考察

### 矩形波（擬似正弦波）100～120Hz　

周波数が低いので　撮影時などちらつきが出ます。
安価ＤＣ／ＡＣインバータを使ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/fe4aae68-ae1d-bf66-5f99-55414471965e.png)

https://www.nanzu.jp/syohin/inverkki.htm

順方向LED点灯電圧のバラつきによる、点滅には矩形波ACのほうが有効ですが、
安価なものがどこまで、安定しているかが、問題ですが、試す価値はあると思います

### 矩形波の500Hz以上の

理想は　500Hz以上の　安定化された、矩形波の交流制御が理想です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/90c6f506-cc24-11fd-d976-e0d9111eba13.png)

電球に　コンデンサーなど　入っている場合過電流になるので注意が必要です

### 交流安定化電源装置

どこまで安定した交流電源かが最大の課題ですが　
100～120Hz　ですと同様に　周波数が低いので　撮影時など、ちらつきが出ます。

また　正弦波ですので　順方向LED点灯電圧のバラつきによる、点滅の可能性があります。
https://www.omron.com/jp/ja/news/2012/03/p0301.html

#### 参考映像
LED位相制御試験3アナログ調光器　　https://youtu.be/kOg7-X_J3hU
LED位相制御調光試験2　　　　　　　https://youtu.be/Ll3vVfGKxfg
LED位相制御調光試験1　　　　　　　https://youtu.be/qpTUGPu5lcU


#### 以上の問題点を　考えると　AC100V位相制御シャンデリア球の制御は困難です
実績のある　DC24V（AC24V兼用）　シャンデリア球を　お勧めします。

https://mediaface.co.jp/leddimming/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/28af43c1-cf92-fe48-65d2-5eac9e9cfbc1.png)


#### 東芝さんもDC電球出しましたね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/12123655-1e14-4eac-d4fe-9194fe36e83f.png)

https://www.tlt.co.jp/tlt/products/art/catalogue/led/led_theater_lamp.htm


#### LED位相制御試験3アナログ調光器　　https://youtu.be/kOg7-X_J3hU 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/96373f21-5e75-7319-c9e4-63538fedb7d7.png)
今日の関数: TODAY

TODAY 関数は、現在の日付を自動的に表示するために使用されます。請求書や報告書など、日付が頻繁に必要な書類に便利です。

使用例:

=TODAY()

この例では、セルに現在の日付が表示されます。引数は必要ありません。

メリット:

毎回手動で日付を入力する手間を省けます。
書類を開くたびに最新の日付が自動的に表示されます。
注意点:

TODAY 関数はファイルを開くたびに日付が更新されます。固定したい場合は、日付をコピーして値として貼り付けると良いでしょう123.
ServiceNowのScript IncludeからSlack Webhookを呼び出して投稿する

# 課題：
ServiceNowのRESTMessageV2を利用してSlackのWebHookを呼び出すスクリプトインクルードを作成する。

# スクリプトインクルード
```
    sendSlackMessage: function(serviceUrl, message, username) {
        var baseUrl = "https://hooks.slack.com/";
        var webhookUrl = baseUrl + serviceUrl;
        try {
            var payload = {
                text: message,
                username: username
            };
            var request = new sn_ws.RESTMessageV2();
            request.setEndpoint(webhookUrl);
            request.setHttpMethod('POST');
            request.setRequestHeader('Content-Type', 'application/json');
            request.setRequestBody(JSON.stringify(payload));
            var response = request.execute();
            var responseBody = response.getBody();
            var httpStatus = response.getStatusCode();

            if (httpStatus == 200) {
                gs.info("message sent correctly.");
            } else {
                gs.error('Failed to send message');
            }
        } catch (e) {
            return JSON.stringify(e.message);
        }
    },
    type: 'SlackUtilTest'
};
```

# スクリプトインクルードを呼び出すスクリプトの例
```

var serviceUrl = "services/AAAAAA/BBBBBBBB/CCCCCCC"; // webhookのサービルURL
var message = "テストメッセージ"; // 投稿するメッセージ
var username = "ozawa";         // 投稿者
var slackPost = new SlackUtilTest();
slackPost.sendSlackMessage(serviceUrl, message, username);
```
以上
「ZennのほうがQiitaより優しい論」と「いいね数一定仮説」


「QiitaとZennの違い！」みたいな記事を見ていると
「ZennはQiitaよりいいねが貰いやすい！」みたいな文言を目にすることがある。

「だからZennの住民はQiitaよりも優しいんだ！」みたいなことも言っていたりする。

https://web.archive.org/web/20230417011735/https://zenn.dev/tsut_ps/articles/763fe34aa47b4c

https://zenn.dev/hero_blog/articles/qiita-or-zenn#%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%882%3A-%E8%AA%AD%E3%81%BE%E3%82%8C%E3%82%84%E3%81%99%E3%81%95

しかし、それは違うのではないか？と思う。
それを書いていく。

## いいね数一定仮説

以下の仮説を立てる。

>1サービスに対し1日で1ユーザーがつける「いいね」は投稿される記事数に関係なく一定である。

これが正しいと仮定するとZennのほうがQiitaよりも「いいね」が貰いやすい現象に説明がつく。

ZennのほうがQiitaよりも投稿される記事数が少ないため、
相対的に1つの記事に集中する「いいね」の数が増えるという現象が起こる。

逆にQiitaのように投稿数が多いプラットフォームでは、ユーザーの「いいね」は多くの記事に分散されてしまう（もしくはひとつに過度に集中する）。
その結果、「いいね」が少ない記事が増えてしまう。

という訳だ。

## で？

つまり、「いいね数一定仮説」が正しかった場合、

冒頭に書いた「だからZennの住民はQiitaよりも優しいんだ！」という主張は通らない。

ただ単に1日に投稿される全体の記事数が少ないため、それぞれの記事が見られやすく、「いいね」が付きやすいだけだ。
これはただの現象であり、それが住民の優しさと直接関係しているわけではない。

## 余談

Qiitaはviewsのわり「いいね」が少ない。
Zennはviewsが少なくても「いいね」が多い。
だからZennのほうが優しいんだ！

みたいな意見を見たことがあるが、これはあることを考慮していない。

そのviewsは「登録しているユーザー」と「登録していないユーザー」のviewsの和であるということだ。

QiitaのほうがZennのよりも謎にSEOが強い。
仕事で調べものをしているときにもよく出てくる。

つまりQiitaのほうが「登録していないユーザー」のviewsが多くなるということだ。

そして、大事なことだが、「登録していないユーザー」は「いいね」が押せない。

そう、「登録していないユーザー」は「いいね」が押せない。
その通り、「登録していないユーザー」は「いいね」が押せない。

大事なことなので3回書きました。

つまり、「登録していないユーザー」のviewsが多いQiitaはZennと比べると
`いいね数÷views`の値が小さくなってしまうのだ。

これは当たり前の現象であり、やはり、これもプラットフォームの住民の優しさとは無関係であると言えるだろう。

<!-- 予言：はてブで、「なるほど、だからこの記事はいいねがつかないのか」って書かれそう -->

## チラ裏

「東京は冷たい、田舎は優しい」論にも適用できそう。

## 予防線

統計はとってないので、実際ZennのほうがQiitaよりも投稿記事が少ないとかは分かりません。ただの偏見です。
Anaconda + PowerShell: promptを (env) parent/current> に

AnacondaをPowerShellで使用すると、デフォルトだとカレントディレクトリのフルパスが表示され、見づらいです。そこで（環境名）に続けてひとつ上のディレクトリと現在のディレクトリのみ表示されるようにプロンプトを改良しました。

### 設定方法
PowerShellにて `> notpad $PROFILE` より設定ファイルを開きます（これだとメモ帳ですが、任意のエディタでOKです）。

設定ファイルに以下のコードを書き込みます。
```
function prompt {
	"(" + $env:CONDA_DEFAULT_ENV + ") "  `
    + $(Split-Path $(Split-Path $(Get-Location) -Parent) -Leaf) `
	+ "/" + $(Split-Path $(Get-Location) -Leaf) + "> "
}
```
（※ 「`」は次の行までコードが続くことを示す） 

すると以下の様に、良きに表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264339/79be8555-1c26-9abc-af6c-0c388a985253.png)



#### 蛇足
AnacondaのPowerShellのプロファイル設定、デフォルトだと起動時にエラー吐かれるのは僕だけでしょうか？設定＞プロファイル＞コマンドラインを以下にするとうまく動いてくれています（ソース忘れました）。

```
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\ProgramData\anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\ProgramData\anaconda3' "
```
【初心者向け】プログラミング言語を日本語として理解する

## 概要
プログラミングを始めたばかりで中々覚えることができない。
色んな言語を触りたいけど一から勉強するのは疲れる。
とりあえず実装できたけど正直どう動いているのか理解していない。
過去この様なことを経験して悩んでいましたが、「日本語として理解」したら思いのほか簡単に解決できたのでこの記事ではTypeScriptの記述でどういったことなのかを説明します。※TypeScript限定ではないです。
今後のプログラミングの勉強や新しい言語取得への手助けになればと思います。

## この記事で取り上げるもの
- 変数
- 条件分岐
- ループ

## プログラミング言語の日本語化
### 変数
TypeScriptやjavascriptで言えば **"let name"**、**"const name"**、**"var name"**。
phpは **"$name"**、Pythonは **"name"** といった感じで変数を定義します。
変数名からどいったものかはある程度理解できますが、経験からすると変数の意味をちゃんと理解していないとバグを生み出すことが多々あります。
今回のパターンを日本語として理解するとなると「name　⇒　名前」となりますが、これはコーディングしている内容がシンプルな場合は問題が発生する可能性は低そうですが私はなるべく避けるようにしています。
例えば今回は **氏名**という変数を定義したい場合は「fullName」や「firstName」、「lastName」にするなどです。
これは可読性の問題な気がしますが、こういった形で定義しておけばどんなに長い変数名であっても **氏名**という2文字の日本語で読み替えることができます。

### 条件分岐
ほとんどの言語に登場してくる**if ～**ですが、条件が複雑にであればあるほど最適化やコーディングが大変でミスもしやすいです。
```Typescript
if (A === B ) {
    // 処理A
}
else if (C === D) {
    // 処理A
}
else {
    // 処理B
}
```
この条件文をそのまま日本語にすると
**「AとBが一致したら処理Aを実行して、そうでない場合はCとDが一致するかを判定し、一致した場合は処理Aを実行して、どれにも該当しない場合は処理Bを実行する。」**
となります。日本語としてちょっと読みづらいですね。
これをより分かりやすい形にすると
**「AとBが一致するかCとDが一致した場合は処理Aを実行し、そうでない場合は処理Bを実行する」**
とした方がまとまりがあって読みやすくなりました。
そしてこの日本語をコードに変換すると
```TypeScript
if (A === B || C === D) {
    // 処理A
}
else {
    // 処理B
}
```
とすることができ余計な条件式を省略することができました。
コード⇒日本語にすることで整理することができました。

### ループ
ループは「**繰り返し処理を実行する**」場合等に使用されるます。
しかし、**for**や **while**といった様に同じ繰り返す処理だとしてやりたいことが違い記述も変わってきます。
例えば
```TypeScript
for (const a of A)
```
といった場合は日本語に表すと「**Aの中身に対して１要素ずつ処理を実行する**」となります。

**while**の場合は
```TypeScript
let count = 0;
while (count < 3)
```
といった記述となり、日本語に直すと「**countが3未満であれば繰り返し処理を実行する**」 となります。
同じ繰り返す処理だとしても目的やによって記述も変わってきます。
結果的にはどちらの記述でも実現は可能ですが、可動性や意図しない動きをした時のデバッグも楽になります。

## まとめ
私はプログラミングの勉強を始めたとき記述ばかり覚えることに必死だったのですが、勉強するときまず最初に考えることは **何をしたいかを明確に**ということだと思っています。
初歩的なことではありますが、いきなり「条件分岐を覚えるぞ！」となってググっても"条件分岐とは～"や"こういった形で記述します"という情報ばかり…
覚えなくていけないことに変わりはないのですが、いざ業務や自作アプリを作ろうとしたときに記事に書いてある内容しか覚えておらず結局のところどういった処理をしていたのか理解できていなかったということがあります。（少なくとも私はそうでした…）
なので **日本語で何をしたいかを明確に**した状態で「この処理をするには～」といったことをググったりChatAIに投げたりすると言語への理解が深まり、綺麗コードを書くことができるようになると思います。

私は初めはどうしたいかをメモに起こしてから色々調べたりしてました。