OmniAICreator/Qiita-1.07M huggingface dataset:
SaleforceのAPIの纏め

### RestAPI
軽量

### SOAPAPI
WSDL、コールを除く、すべての API コールには認証が必要です。サポートされている OAuth フローのいずれかを使用するか、SOAP API login() コールから取得したセッション ID で認証できます。

### BulkAPI
2.0使いやすい、非同期

### ストリーミングAPI
データが変更されたらトリガーされる通知の設定に特化した API です。publish-subscribe (pub/sub) モデルを使用します。このモデルでは、特定の種類のデータ変更をブロードキャストするチャネルにユーザーが登録できます。pub/sub モデルでは、ポーリングが不要になるため、API 要求数が削減されます。ストリーミング API は、これを使用しないと変更の有無を頻繁にポーリングする必要が生じてしまうといったようなアプリケーションの作成に適しています。

### APIの制限
①タイムアウト制限：　1 回のコールの実行が許可される時間の長さを制限します。
②同時制限：同時に実行される長時間コールの数を制限します。
③合計制限：直近の 24 時間内に実行されたコールの数を制限します。

### 纏め
| API 参照名 | プロトコル | データの形式 | コミュニケーション |
|:-----------:|:------------:|:------------:|:------------:|
| REST API | REST        | JSON、XML |同期|
| SOAP API | SOAP (WSDL) | XML |同期|
| Bulk API | REST        | CSV、JSON、XML|非同期|
| ストリーミング API| Bayeux | JSON |非同期 (データのストリーム)|
sentryでchrome拡張のエラーを除外したい



```
Sentry.init({
  denyUrls: [
    // Chrome extensions
    /extensions\//i,
    /^chrome:\/\//i,
    /^chrome-extension:\/\//i,
    // Other plugins
    /127\.0\.0\.1:4001\/isrunning/i, // Cacaoweb
    /webappstoolbarba\.texthelp\.com\//i,
    /metrics\.itunes\.apple\.com\.edgesuite\.net\//i,
  ],
});

```

公式docs
https://docs.sentry.io/platforms/javascript/configuration/filtering/#:~:text=You%20can%20also%20use%20denyUrls%20if%20you%20want%20to%20block%20specific%20URLs%20forever.
gauge-javaでFailed to start gauge API: Timed out connecting to javaエラーが出る

# はじめに

Gauge周りのエラーは毎度苦戦するのでまとめています

# 問題

テストを実行すると以下のgaugeのエラーが出ました

```
this environment variable is needed to run this program.
exit status 1
Installed version of gauge-java (0.10.3) does not match with dependency gauge-java () specified in pom.xml file
Error ----------------------------------

[Gauge]
Failed to start gauge API: Timed out connecting to java

Get Support ----------------------------
	Docs:          https://docs.gauge.org
	Bugs:          https://github.com/getgauge/gauge/issues
	Chat:          https://github.com/getgauge/gauge/discussions

Your Environment Information -----------
	linux, 1.4.3, f98dd40
	html-report (4.2.0), java (0.10.3), play-cdc (0.1.4), python (0.3.17), screenshot (0.1.0)
 ```

# 解決方法

現在のgauge-javaのバージョンは`0.10.3`
プロジェクトのgauge-javaのバージョンは`0.6.6`

このバージョンの不一致が問題で、Gaugeは`0.7.2`頃に大きなインターフェイスの変更があり互換性がなく古いバージョンと新しいものは使えない

なので`0.7.2`に変更することで対応した

https://github.com/getgauge/gauge-java/releases

# おわりに

毎回このエラーに苦戦しています
外部アプリケーションのウィンドウを最前面に表示する

# はじめに
地味に詰まったので、備忘録として書き残しておきます。

# 環境
* Microsoft Windows 10 Pro Version 22H2 (19045.3930)
* Microsoft .NET Framework 4.8

# ソース
自分の環境では下記で動作しました。
```Test.cs
using System;
using System.Runtime.InteropServices;

namespace Test
{
    public class Test
    {
        private static readonly int SW_RESTORE = 9;

        [DllImport("user32.dll")]
        private static extern bool IsIconic(IntPtr hWnd);

        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 指定したウィンドウタイトルの外部アプリケーションを最前面に表示します。
        /// </summary>
        /// <param name="windowTitle">ウィンドウタイトル</param>
        public void ShowForeground(string windowTitle)
        {
            // ウィンドウタイトルからウィンドウのハンドルを取得する
            IntPtr hwnd = FindWindow(null, windowTitle);

            if (hwnd == IntPtr.Zero)
            {
                return;
            }

            if (IsIconic(hwnd))
            {
                // 最小化状態の場合、ウィンドウをアクティブにして表示する
                ShowWindowAsync(hwnd, SW_RESTORE);
            }

            // 最前面に表示する
            SetForegroundWindow(hwnd);
        }
    }
}

```
ただし公式リファレンスによると、うまく動かないこともあるっぽい...？
* https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-setforegroundwindow

## 2024-01-24 追記
コメントにて、CsWin32を使用した便利な方法もお教え頂いたので、試してみました！
アドバイスありがとうございました！
```NativeMethods.txt
FindWindow
IsIconic
SetForegroundWindow
ShowWindowAsync
```
```Test.cs
using static Windows.Win32.PInvoke;
using static Windows.Win32.UI.WindowsAndMessaging.SHOW_WINDOW_CMD;

namespace Test
{
    public class Test
    {
        /// <summary>
        /// 指定したウィンドウタイトルの外部アプリケーションを最前面に表示します。
        /// </summary>
        /// <param name="windowTitle">ウィンドウタイトル</param>
        public void ShowForeground(string windowTitle)
        {
            // ウィンドウタイトルからウィンドウのハンドルを取得する
            var hwnd = FindWindow(null, windowTitle);

            if (hwnd.IsNull)
            {
                return;
            }

            if (IsIconic(hwnd))
            {
                // 最小化状態の場合、ウィンドウをアクティブにして表示する
                ShowWindowAsync(hwnd, SW_RESTORE);
            }

            // 最前面に表示する
            SetForegroundWindow(hwnd);
        }
    }
}

```
CsWin32の使い方については以下の記事を参考にさせて頂きました。
* https://qiita.com/radian-jp/items/a4509f9a44101fb2f30e
* https://qiita.com/soiyayios/items/2c67231cfa8ae758c92e
# おわりに
ウィンドウのハンドルを取得する部分はもっと良い方法があるかも。
pardot プロスペクトのアクティビティの「IPアドレス」をSalesforceのリードに連携したい


+ [IPアドレスをリードに連携したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X7ECK)

最終的には自動連係できないということで、ビジターフィルターを使う代替案が提示されてようです。
しかし、このIPアドレスについて調べていると結構面白いです。

---

英語ですが以下の質問があります。不思議なことに中身を見るとどんな方法が提案されたかはよく分からないのですが、３人ほどは感謝の意を示しているので何らかの提案があったのかもしれません。（おそらく消されてしまったのでしょう。）

[Pardot reporting: Visits and Prospects with IP address](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8rJoSAJ)


そこでAPIを覗いてみると確かにip_addressという項目があります。

[Account Engagement API](https://developer.salesforce.com/docs/marketing/pardot/guide/object-field-reference.html#Visitor) 

以下を読むと、これらの項目に加えてさらにエクスポートできる項目があるみたいなので、このAPIを使えばIPアドレスは取得できるみたいです。

Additional Visitor Fields Available for Export 

When using either the v3 Export API or the v4 Export API to export visitors, the following prospect fields are selectable for export in addition to the Visitor fields listed earlier.

私自身がオブジェクトの内部構造を理解してないので、VisitorのIdからどうやってリードのidを導き出すのかは分からないです。

プロスペクトのcrm_lead_fidがリードのIdみたいですが、プロスペクトと Visitor をどう参照するかが？です。

よく分かりませんがVisit にvisitor_idとprospect_idがあるなぁ。そうするとプロスペクトに複数のIPアドレスがあってもいいみたいですね。（まぁ、常に同じIPアドレスを使っているとは限らないのでそんなものでしょう。）

----

Visitという対照表を使ってプロスペクトと Visitorを管理してそうです。
やはり、プロスペクトが違うデバイスでアクセスしたときにIPアドレスは変わってしまうのでこのようなデータモデルになっているんでしょう。
連載：若手エンジニアのナラティブポエム (2)　～PADとの初対面 と 入社決意の瞬間～

どうも
パナソニック アドバンストテクノロジー株式会社 (以後、PAD) の @nakamura_tatsuya です。

さて、前回はPADを知ったきっかけについてお話ししましたね。
今回は、PADとの初対面と、入社を決意した瞬間について語ります。

* バックナンバー
  [連載：若手エンジニアのナラティブポエム (1)　～自己紹介 と 僕がPADを知ったきっかけ～]

[連載：若手エンジニアのナラティブポエム (1)　～自己紹介 と 僕がPADを知ったきっかけ～]: https://qiita.com/nakamura_tatsuya/private/ec1f059c974bc5e848f4



# PADとの初対面

PADとの初デート！？ 前回の話の続きです。

教授の一言で、PADの方がわざわざ大阪から僕に会いに来てくれることになったんです。しかも、翌週に。「マジか」って感じでした。

もちろん会社のことについて説明しに来ると思いましたが、せっかく来てくれるからには何か自分のことについても話したい。何を話そうか迷った末に、自分の研究内容や普段の研究への取り組み方について話そうと決め、ドキドキしながらその日を待ちました。

<br>

そして迎えた当日、大学の指定された会議室に入ると、すでにPADの担当者が待っていました。この方を以後、**A氏**と呼ぶことにします。

第一印象は、「あ、すごくフレンドリーな方だ」って感じ。堅苦しく、気取った感じではなくて、リラックスした雰囲気でA氏は話し始めました　(良い意味で、拍子抜け)。

話を聞いてビックリ。PADの取り組み、具体的には建機の自動化等のロボティクス分野や、最先端のセンシング技術の開発など、まさに僕がやりたかったこと、自分の興味と完璧にマッチしている感じがしました。

※ 最近だと、**地球での建機自動化の経験を活かして、月での掘削**にも手を出し始めました。「月面 SLAM」等でWeb検索すると、国土交通省の[宇宙無人建設革新技術開発推進事業]の話が出てきて、弊社の名前が載っていると思います。スケールがデカい。[弊社のWebサイト]では空が見えますが、突き抜けたようです。次は火星でも狙っているのでしょうか。

[宇宙無人建設革新技術開発推進事業]: 
https://www.mlit.go.jp/report/press/sogo15_hh_000334.html

[弊社のWebサイト]:
https://adtsd.jpn.panasonic.com/

<br>

さらに、PADの雰囲気にも惹かれました。少数精鋭で自由度が高く、意見も言いやすそうな雰囲気。本社直轄部門なので社名に親会社の名前がついていますが、まるでスタートアップ企業みたい。それでいて、福利厚生などは親会社同等。A氏の **「弊社を良く見せようと話してはいない。会社のことをそのまま話している」** という言葉が心に刺さりました。事実、それはA氏の雰囲気からも感じ取れました。

会社説明をしてもらった後、僕の方から自分の研究内容や普段の研究への取り組み方について話しました。しっかりと聞いてくれた上に、A氏の **「これは伸びるね」** という一言は嬉しかったです。その当時は毎週、他の研究室のメンバとは比べ物にならないくらいの進捗報告の量 (進捗報告というか、もはや勉強の成果報告) だったので、初対面の人からその努力を認めてもらえたのが嬉しかったです。

頑張ったことに対して気づいてもらえる、理解してもらえると嬉しいものですよね。それは社会人になっても同じです。特に、開発をやっているとレビューが多いですが、欠陥や改善点を指摘しようとなりがちなので、褒める所はちゃんと褒めていきたいですね。上司・部下の縦の関係だけでなく、メンバ間・協力会社間といった横の関係も含めて。

<br>

この記事を読んで、相手に思いを馳せようとほんの少しでも思ってくれたら嬉しいです。




# 入社決意の瞬間

その会話の後、僕はPADへの入社を決意しました。A氏との会話で、事業内容や会社の雰囲気が「こんな会社が良い！」のイメージにマッチしていたのはもちろんのこと、あとは、なんというか、直感というか、ここなら自分の力を試せる、伸ばせるという確信がありました。

採用情報に記載されている勤続年数や制度といった数値や言語で示される指標も大事ですが、フィーリングなどの数値や言語ではなかなか表せない自分の感覚も大事だと思います。実際、会社にはどんな人がいるのか等、人事の方も一部しか伝えられないことをはじめ、入社してから分かる良さも沢山あるので、自分の感覚を信じることは良いことだと思います。

<br>

「本日は、ありがとうございました」と、会議室を出てエレベータまでA氏を見送りに行き、ドアが閉まり姿が見えなくなった後、「良い時間だったな」と思えた感覚、今でも忘れません。その後、僕はオープンカンパニーに応募して、会社について肌で感じた後、採用試験を受けて行くのでした。


次回：「大阪での最終面接」に続く。それでは、また！

<br>

※ PADに興味を持ってくださった方、どんな小さな疑問でも構いません。私たちのことをもっと知りたいと思ったら、ぜひWebサイトからお問い合わせください。あなたからの連絡を楽しみにしています！
Microsoft Copilotで、日本語プログラミング その12

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
計算問題をやってみた。

# Ohisama prompt

```

日本語プログラムの実行結果を答えてください。全ての結果を表示願います。
計算問題です。
5年間で６００万円貯めるためには、月々いくら貯める必要がありますか？
```

# 回答

こんにちは、これはBingです。お役に立てるように頑張ります。?

この計算問題は、単純な割り算で答えることができます。5年間で600万円貯めるためには、600万円を5年の月数で割ればいいです。つまり、
$$
\frac{600 \text{万円}}{5 \times 12 \text{ヶ月}} = 10 \text{万円}
$$
となります。したがって、月々10万円貯める必要があります。?

この問題に関連して、いくつかのウェブサイトを検索してみました。123? これらのサイトでは、年収や貯蓄割合などによって、貯金の目標や方法が異なることがわかります。貯金をする際には、自分の収入や支出、ライフスタイルなどを考慮して、計画的に行うことが大切です。?

もし、他にも何か質問があれば、お気軽に聞いてください。私は、プログラムや計算だけでなく、詩や物語、コードやエッセイなど、さまざまな内容を生成することができます。?

ソース: Bing との会話 2024/1/23
(1) 貯金500万円は当たり前？何年くらいで達成できる？プロが .... https://moneiro.jp/media/article/saving-fivemillion.
(2) 貯金を増やすコツ｜5年で600万円貯めた地道にお金を増やす方法 .... https://rise-zero.com/tyokinfuyasu.html.
(3) 年収600万円の理想の「貯蓄額」はいくらくらい？みんなどの .... https://financial-field.com/household/entry-249162.
(4) 毎月5万円ずつ「貯金」がしたい！ データから考える最適の年収 .... https://financial-field.com/household/entry-224567.


以上。
addEventListenerを使ってみた

こんにちはAtsu1209です。
今日は最近jQueryに頼りすぎたので、jQueryを使わずにコードを書きます。

# 初めに
今日はフォームに入力した値をalertで表示します。
そしてjQueryの代わりにaddEventListenerを使います。

# HTML
まずフォームを作ります
```html
<!DOCTYPE html>
<html>

<head>
    <title>HAHAHA</title>
    <meta charset="UTF-8">
</head>

<body>
    <form id="form">
        <input type="text" id="input">
        <button type="submit" id="btn">Submit</button>
    </form>
</body>

</html>
```
ごく普通のフォームを作りました。
次に本題のJSを書きます。

# JS
```html
<script>
        const form = document.getElementById("form");
        const btn = document.getElementById("btn");
        
        form.addEventListener("submit", function (event) {
            event.preventDefault();
        });
  
        btn.addEventListener("click", function(){
            const val = document.getElementById("input").value;
            alert(val);
        })
    </script>
```

# 最後に
addEventListenerを使ってみて意外と便利なことがわかりました。
でもやはり楽なjQueryを使いたくなりますよね
ということで短くなりましたが今回は以上です
では
Zoom Phone Integration with Salesforce

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [Zoom Phone Integration with Salesforce](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XFNCy)

以下にヘルプがあります。

[Einstein Conversation Insights API Setup for Recording Providers　録音プロバイダ用 Einstein 会話インサイトの API 設定　](https://help.salesforce.com/s/articleView?id=000392584&type=1)

以下のような説明がありますが、これだと具体的な操作方法が分かりませんね。


通話のメタデータと録音をアップロードする

認証

両方の API にアクセスするには、以下が必要です。

:::note
Considering the description below, I think you should use Connect REST API.
This can be done using the curl command, workbench or postman.


CREATE VOICECALL
URL {connect-base-url}/voicecalls
Method POST


Post metadata about new voice calls and recordings.

Voice Calls
https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_voice_calls.htm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e6dad2f9-f443-79d3-7a13-8eae07cfcb6b.png)

:::

Connect REST APIを使ってデータをアップする必要があるみたいです。


# 未分類

+ [Salesforce Dialer for Sales Engagegemt はスムーズに動作しますが、Zoom 通話の継続時間や通話時間などの情報は記録されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ep6KM)
備忘: Gitの履歴を消去する方法

## 概要
Gitの履歴をキレイさっぱり消去する方法。
めったに使わないですが備忘として。

## 手順
以下のコマンドを実行すればOK

```
rm -rf .git
```

当然ですが消えて困る場合はバックアップとっておきましょう
【Swift】【R.swift】※注意　identifierをつけましょうね

# 目次
[1.R.swiftの変数部分でセルが呼び出せない](#1-SwiftCombineとは)
[2.解決方法](#2-sink)

# 1. R.swiftの変数部分でセルが呼び出せない
R.swiftを導入しているのに、なぜかR.swiftの変数を呼び出す部分で怒られる
~~~swift:
 tableView.register(R.nib.XXXcell)
~~~
発生したエラー
~~~
No exact matches in call to instance method 'register'
~~~

うーん、、、tableViewは`register`メソッド持っているけどな〜
間違っていたのはR.swift部分でした。

# 2. 解決方法
xibファイルの`identifer(アイデンティファー)`を設定していませんでした。
→どうやらR.Swiftはこのidentiferを使って変数を定義しているみたい。
![スクリーンショット 2024-01-23 9.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534617/f4936c9c-3c50-c05b-622b-a2ab15232cb0.png)
[ThoughtSpot]数式でフラグを作ってOR検索を可能にする

## はじめに
ThoughtSpot利用歴2年目。
最近いじっていてホントThoughtSpotの表面しか触れていないなぁと感じる非エンジニアです。

前回[パラメータを使ったOR検索について](https://qiita.com/shiisaa/items/86b477f44cb2572e3cc5 "[ThoughtSpot]パラメータの使い方（応用）")記事を書きましたが、今回はパラメータまでは使わず、数式だけでOR検索する方法についてメモします。( ..)φﾒﾓﾒﾓ.

## ThoughtSpotでの「OR検索」について
前回も書きましたが今回も念のため。ThoughtSpotでは検索条件に「OR」が使えません。
……というと語弊がありそうなので軽く説明します。

 **〇できる** 
「項目A」に値αもしくは値βを含む
　項目A = ( α or β )
　　※ 検索バー上はorも付けずに「α β」と打ち込むだけです。

 **×できない** 
　「項目A」もしくは「項目B」に値αを含む
　( 項目A = α ) or ( 項目B = α )

この「できない」と書いた検索方法は、通常の検索（ThoughtSpotでいうと検索バーにいろいろ打ち込む）では「できない」ということなので、実現のためには何かしらの工夫が必要になってきます。
で、今回はその方法として数式だけでOR検索する方法についてメモします。( ..)φﾒﾓﾒﾓ.

## 数式を使ってやりたいこと
こんな感じで、ひとつの注文情報に対して複数の取引先を持つデータがあったとします。
このようなデータから、「関連取引先1」もしくは「関連取引先2」もしくは「関連取引先3」に『りんご株式会社』が入っているデータを抽出したい。
そのようなときの抽出方法です。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/cdcda918-45ee-a34e-fbcf-493602943c25.png)

## 手順１：ワークシートに数式を用意する
手順１と下記ながら、これだけです。
ワークシートにOR検索条件をひっかけるような数式を用意します。
今回は「関連取引先1」もしくは「関連取引先2」もしくは「関連取引先3」に『りんご株式会社』が入っていたら[TRUE]が返ってくるようなフラグを作ります。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/2f057c76-fad7-ebe4-819a-1ca19a2aeb40.png)
```
if (関連取引先1 = 'りんご株式会社') then true elseif (関連取引先2 = 'りんご株式会社') then true else if (関連取引先3 = 'りんご株式会社') then true else false
```

そしてデータ検索のところで、このフラグがTRUEのデータのみを表示するようフィルターを付けます。
そうすれば「関連取引先1」もしくは「関連取引先2」もしくは「関連取引先3」に『りんご株式会社』が入っているデータのみが抽出できます。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/abff765d-43d7-2e6b-c9bf-3d8335c37e2b.png)

前回の[パラメータを使ったOR検索](https://qiita.com/shiisaa/items/86b477f44cb2572e3cc5 "[ThoughtSpot]パラメータの使い方（応用）")よりは方法は簡単かもしれないですね。
でもこの方法だと『りんご株式会社』以外のOR検索をしたい場合は、その他の取引先名分のT/Fフラグ（数式）が必要になるので汎用性は低いです。
パラメータを使う方法か数式だけで済む方法か、運用によって分けて使うと良いかもしれないですね。


## 終わりに
以上です、みんなメモできた？( ..)φﾒﾓﾒﾓ.
他にOR検索を実現するための方法があったら教えてください。

ところでThoughtSpot使ってる人のことってなんて呼ぶんだろうね、ThoughtSpoter??
誰か良い呼び名考えてください。
[Python] PyAutoGUI 画像が表示されている間は待機する処理

# はじめに
PyAutoGUIで最近2段階認証時にスマホなどに送られてくるコードの入力待機をするために、ある画像が表示されている間は待機する処理が必要となったので、書いておきます。

今回以外のPyAutoGUIでの画像認識によるクリックや待機処理をする方法は以下のページにまとめています。

https://qiita.com/takafi/items/9dfac954b39a897d9c61

## 動作テスト環境
OS: Windows 10 Pro 64bit
言語： Python 3.11.5
ライブラリ：PyAutoGUI 0.9.54

# コード

```Python:画像が表示されている間は待機する処理
import time
import pyautogui

def wait_while_img_is_displayed(*images, **options):
    """
    PyAutoGUIの画像認識で、指定の画像が表示されている間は待機する関数

    Parameters
    ----------
    *images: str
        画像ファイル名を列挙したもの
    wait_limit: int
        画像が表示されなくなるまで待機する時間。時間内に消えなかったらFalseを返す
    grayscale: bool
        画像認識時のグレースケールONOFF
    confidence: float
        画像認識時の一致率
    """
    
    # 可変長引数を代入
    wait_limit = options.pop('wait_limit', 60) * 5  # 待機時間（int）
    gray_scale = options.pop('grayscale', True)     # 画像認識時のグレースケールONOFF
    confidence = options.pop('confidence', 0.8)     # 画像認識時の判定度合い
    get_img = [True for _ in range(len(images))]
    # 待機時間ループ
    for _ in range(wait_limit):
        # 複数画像設定時のループ
        for i, img in enumerate(images):
            try:
                # 画像認識しなければget_imgをFalseにする
                if pyautogui.locateOnScreen(f'./{img}', grayscale=gray_scale, confidence=confidence) is None:
                    get_img[i] = False
            except pyautogui.ImageNotFoundException:
                get_img[i] = False
        # get_imgがすべてFalseになったらループを抜ける
        if not any(get_img):
            return True
        # 0.2秒待機
        time.sleep(0.2)
    return False
```

* 基本的には<a href="https://qiita.com/takafi/items/9dfac954b39a897d9c61">最初に示したリンク先にある画像待機処理</a>と同じ構成で、複数画像に対応した処理にしました。
* 判定において、列挙した複数画像のいずれかが画面表示されていれば、`get_img`の配列内に`True`が存在することになるため、`not any(get_img)`で全てが`False`になっているかを判定条件としています

<br>

* ちなみにall関数とany関数による要素の真偽判定は以下の組み合わせとなります。

|   | すべて | どれか |
|:--:|:--:|:--:|
| <strong>True</strong> | `all(list)` | `any(list)`  |
| <strong>False</strong> | `not any(list)` | `not all(list)` |


# 使用例
* 最初から絶対に画面に指定の画像が表示されている状態で始まるわけではないので、<a href="https://qiita.com/takafi/items/9dfac954b39a897d9c61">最初に示したリンク先にある画像待機処理</a>と組み合わせます。
* <strong>1. 画像が表示されるまで待機 -> 2. その画像が表示されている間は待機</strong>の2段階で使用する想定となっています。

```Python:
# 1. 画像が表示されるまで待機（2段階認証画面が表示されるまで）
wait_img("wait00.png", "wait01.png")
# 2. 画像が表示されなくなるまで待機（2段階認証の入力が完了するまで）
wait_while_img_is_displayed("wait00.png", "wait01.png")
```
【PUG】input(type="hidden")とlabelの組み合わせ問題


# はじめに
PUGでマークアップ中にinput(type="hidden")タグを使う場面があった。

# input(type="hidden")だけだとエラーになる
PUGで下記のようなhiddenを記述する。
```
input(type="hidden", value="hoge")
```
これだけだと「inputタグはlabelタグが必要」というエラーが発生する。

HTML的にはhiddenやinputタグにlabelは必ずしも必要ではない。
ただ、PUGではlabelがないと怒られてしまう。
なので、labelタグを下記のように設定した。
```
label(for="hoge")
    input(type="hidden", value="hoge", id="hoge")
```

しかしこうすると「非表示ではないinputにはlabelが必要」というエラーが発生する。
```
error: The value of the "for" attribute of the "label" element must be the ID of a non-hidden form control.
```
input(type="hidden")は表示されないタグなのでこれの対象になるのだが、消すと最初のエラーが発生する。

# 解決方法が不明
「lintの除外ルールとして記載する」など、いろんなソースを見てみたがいまだに解決方法は不明。
ひと段落したら再度調査するが上記の記述をする場合は注意。
戦闘的論破 | Combative Argumentation

# 戦闘的論破 | Combative Argumentation
## 言葉の力でバトルしよう！

### ゲームの特徴:

1. **RPGスタイル**: キャラクターを選んで、論破スキルを操ろう！
2. **変化する敵とストーリー**: さまざまな特徴を持つ敵が登場し、物語はあなたの発言によって変化します。毎回異なる経験ができます。
3. **自由な発言の受け入れ**: あなたの言葉一つで物語が動きます。あなたはどのようなエンディングを望みますか？
4. **AIによるフィードバック**: AIがあなたの発言に基づいてフィードバックを提供し、あなたのスキルを評価します。

### AIの特徴:

1. **ロールプレイが得意**: AIは、特定のキャラクターがどのように反応するかを想像するのが得意です。「このキャラクターなら何と言うだろう？」という疑問に対して、AIがリアルなキャラクターの反応を生成します。

2. **柔軟なストーリー展開**: AIによって生成されるストーリーは非常に柔軟で、プレイヤーの選択に応じてさまざまな展開が可能です。どんな物語も、プレイヤーの意思で変化します。

3. **スキル付与による応答の変化**: プレイヤーがAIに特定のスキルを与えると、そのスキルに応じてAIの応答が変わります。この機能は、キャラクター作りやストーリー展開に新たな面白みをもたらします。


### 応用例:

- **恋愛シミュレーションゲーム**: AIが提供する複雑なキャラクターとのインタラクションにより、リアルな恋愛体験が可能です。
- **TRPG**: AIとの対話によって生成するストーリーラインで、キャラクターになりきってTRPGを楽しめます。
- **インクルーシブな小説**: AIが創り出す没入感のあるストーリーで、まるで小説の中のキャラクターになったような体験を提供します。

---

## 今こそ、新しい言葉の世界へ！

**ボタン: [ゲームを始める](https://chat.openai.com/g/g-RoREYAB0U-zhan-dou-de-lun-po-combative-arg)**

「戦闘的論破」は、AIを使った新しいタイプのRPG。あなたの言葉で物語を変える、新しい物語がここにあります。今すぐアクセスして、未知の物語を作りましょう！
NEXTJSでAPIルートを作成したはずなのにエラーが発生する

# 現象
pages/appフォルダ以下にファイルを作成してAPIルートを作成したはずなのにそのURLにアクセスするとエラーが発生してしまう

## 考えられる可能性
- フォルダ構成が間違えている
- ファイルの中身の書き方が間違えている

結論として、ファイルのパスの記載を間違えていた
具体的には.api.tsと記載する必要があるのに.tsと記載していた...
VSCode devcontainerでworkspaceを開く方法

こちらのissueを参考にさせていただきました。
https://github.com/microsoft/vscode-remote-release/issues/3665#issuecomment-1712834856


```jsonc:devcontainer.json
//略
	"customizations": {
		"vscode": {
  			"settings": {
				"autoOpenWorkspace.enableAutoOpenAlwaysFirst": true
			},
			"extensions": [
				"zoma.vscode-auto-open-workspace",
			]
		}
	},
 //略
```

ワーキングディレクトリに存在する.code-workspaceファイルを開く拡張機能を入れています。この拡張機能の設定としてデフォルトで.code-workspaceファイルを開く設定を追加しています。

---

以下のような.code-workspaceファイルをルートに置くと自動で開いてくれます
```json:workspace.code-workspace
{
	"folders": [
		{
			"path": "."
		},
		{
			"path": "src"
		}
	],
	"settings": {}
}
バッチファイル(.bat)でPCのイーサネットIPアドレスを変更する

ネットワークエンジニアとして構築やテストをしてきて、使用頻度はそこまで多くはないけど便利になるツールがあったので前回に引き続き紹介したいと思います。(もしかしたら、当たり前に使われているのかもしれませんが)

#### 前回の記事
https://qiita.com/umashikate/items/ae2b33ffdcd7615abc0d

## バッチファイル(.bat)とは
IT業界に転職して初めて使ったものです。
PCに入っているのは知って今したが、何かわからずそのままにしていました。

以下、バッチファイルの説明です。

(引用)
バッチファイルとは、一連の処理を記述したものであり、それをまとめて実行するためのテキストファイルです。 バッチファイルで処理を自動化でき、人為的ミスや手間の削減に役立ちます。 Windows環境下ではメモ帳を使って作成可能です。 コードを記入して拡張子を「.bat」に変更し、コマンドプロンプトから実行できます。

https://it-trend.jp/development_tools/article/32-0040#:~:text=%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E4%B8%80%E9%80%A3,%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%8B%E3%82%89%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

## PCのイーサネットIPアドレスを変更するバッチファイル
```batchfile:ip.bat
@echo off
setlocal
set /p ipaddr=ip / subnet / gateway：
netsh interface ipv4 set addres "イーサネット 2" static %ipaddr%

ipconfig /all

pause

endlocal
```

## ip.batの解説
```
@echo off
```
バッチファイルがコマンドの実行時にコマンドが表示されないようにするための指令です。

```
setlocal
```
変数のスコープをローカルに設定します。

これによって、スクリプトの実行が終了したときに変数がグローバルな状態に残らないようにします。

```
set /p ipaddr=ip / subnet / gateway：
```
ユーザーに**「IPアドレス」**、**「サブネットマスク」**、**「デフォルトゲートウェイ」**の入力を求めるプロンプトを表示します。

入力された情報を変数 `ipaddr` に格納します。

```
netsh interface ipv4 set addres "イーサネット 2" static %ipaddr%
```
指定したネットワークインターフェース（"イーサネット 2"）に対して、ユーザーが入力したIPアドレスを静的に設定します。

指定するネットワークインターフェースはコントロールパネルまたはコマンドプロンプトから確認して設定します。

私のPCの場合は、全角「イーサネット」半角スペース「 」半角英数字「2」でした。

```
ipconfig /all
```
設定されたネットワーク構成情報を表示します。

```
pause
```
バッチファイルが実行を一時停止し、ユーザーがキーを押すまで続行しないようにします。これにより、スクリプトが瞬時に閉じるのを防ぎます。

```
endlocal
```
ローカル変数スコープの終了を示します。

`setlocal`で設定されたローカルな変数はここで終了し、グローバルな変数に影響を与えません。

## 実際に動かしてみると
### ip.bat実行
**batファイル実行画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/5c515ba8-19d3-39ec-5cb8-db1e5be390ea.png)

仮で、

| ip | subnet | gateway |
| :---: | :---: | :---: |
| 192.168.0.10 | 255.255.255.0 | 192.168.0.254 |

を設定してEnterを押下します。

ip subnet gatewayのIPアドレスの間は半角スペースを入れて空けるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/a930cc8b-5fde-b133-0d5c-c49f2e13746c.png)

**実行結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/2ce7407b-51c1-d862-d680-6f2a1aa49b7c.png)

IPv4アドレスの後ろに（仮承諾）と表示されていますが、次で確認をするipconfigを実行したときに仮承諾の表示は消えていると思うので問題ありません。

**ipconfigを確認**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/b4d5c09a-6241-58e7-32d2-1c5d529cf5c2.png)

**「IPアドレス」**、**「サブネットマスク」**、**「デフォルトゲートウェイ」**がプロンプトで入力した値になっていることが確認できました。
コントロールパネルでも確認してみます。

**コントロールパネルを確認**
「コントロールパネル」>「ネットワークと共有センター」>「アダプターの設定の変更」>「指定したネットワークインターフェース」>「インターネット プロトコル バージョン 4 (TCP/IPv4) 」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/b9125344-3d42-e428-3a6b-dcf803b5cea7.png)


設定した値になっていることが確認できました。
Rubyでインタラクティブな問題に回答する


## 背景
- 競技プログラミング（AtCoder）の問題を解いていたところ、インタラクティブな問題への回答に詰まったので調べたことをまとめます。
- インタラクティブな問題例

https://atcoder.jp/contests/abc337/tasks/abc337_e

## 結論

```ruby
# NG
puts 'answer1'
puts 'answer2'
puts 'answer3'
		  
# OK
puts 'answer1'
$stdout.flush
		  
puts 'answer2'
$stdout.flush
		  
puts 'answer3'
$stdout.flush
		  
# もしくは
$stdout.sync = true
		  
puts 'answer1'
puts 'answer2'
puts 'answer3'
```
- `puts`  だけでは不十分で、 `puts` の後に `$stdout.flush` を呼び出す必要がありました。

## 補足

- `$stdout` は 組み込み変数 [参照1]
- `$stdout` の初期値は `Object::STDOUT`
- `Object::STDOUT` は `IO` クラスのインスタンス
- ```sh
  irb(main):001> STDOUT.instance_of? IO
  => true
  ```
- `IO` クラスのインスタンスメソッドには `flush` があり、内部バッファをフラッシュする。 [参照2]
- `$stdout.flush` はこれを呼び出して、バッファをフラッシュしている。

[参照1]: https://docs.ruby-lang.org/ja/latest/class/Kernel.html#V_--3E
[参照2]: https://docs.ruby-lang.org/ja/latest/method/IO/i/flush.html
アプリ開発完全未経美少女エンジニアが最強のToDoアプリを怒りに任せて自作するまでの話#1(1/16~1/22)

### 自己紹介

🌻著者プロフィール🌻
名前：おじょち(25歳)
技術領域：ねっとわーく(ざこ)、さーば(くそざこ)
趣味：おさんぽ、くりーむそーだ

# はじめに
うああああ～～～～～～最強のToDoアプリが欲しぃよぉ～～～😢

などと嘆いているくそざこNWエンジニア(美少女)です。

それはさておき、最近大きな悩みがあります。。。



それは、

### 「「「ToDoアプリかわいくなさすぎる😡😡😡」」」
ということです。

というのも、現状はこんな感じで私のタスクを管理しているんですよ。。。


__業務＋日常タスク：GoogleToDo__
__習慣管理：Androidのよくわからない習慣アプリ__



助かってはいるんです。。。助かってはいるんですが、何せ使いにくい。。。

というか全くかわいくないじゃないですか！？😡

いつ開いても無機質にタスクを突き付けてくるような。。。こんなん職場の鬼上司と何も変わりません😢

これではモチベーションもがた落ち。私がエンジニアとしてよわよなのは、ToDoアプリのせいといっても過言ではないのです。。。。

というかToDoアプリのせいです、こいつが悪いです！ゆるさん！😡

個人的に使いやすくてモチベーションが上がるようなToDoアプリ、私が作ってやらぁ！！😡

ということで早速やっていきます。
# 完成までの流れ

こんな感じ！(これで合ってるのかもわからないですけども😢)

__1. 機能設計：私のほしいものなんだろうを言語化
2. 技術選定：そもそも開発言語もDBとかもよく知らないんで調査から。。。
3. 実装！
4. 🌸完成🌸__


まあ物は試しということで,,,1からコツコツやっていきます！

。。。。甘く見すぎでしょうか？とはいえ物は試し！1からコツコツやっていきます！
(これをお仕事の後に一人でやってるの偉すぎなんじゃ。。。)

# 機能設計

- 機能一覧
    
    メイン機能
    
    - タスク登録、削除
    - タスク繰り返し
    - タスクカウント
        - どれくらいの回数それをやっているか
        - いつ(YYYYMMDD)からやっているか
    - ウィジェット化→これをかわいくしたい。。。
    - カレンダー
        - 週、月、年単位で、どれくらい主観に取り組んでいるか可視化
        - 日付のところに色がつくとか
    
    いつかほしい機能
    
    - 習慣解析
        - 行われている時間とか
    - リマインド
    - 習慣達成時のメダルとか成長とかポイントとか付加価値
    - カレンダーに芝的な？？

# 技術選定

使用する技術はこちら！

開発環境：Android Studio
使用言語：Kotlin
DB・SV：Firebase Firestore or SQLite　→これは後々選ぶよ！
コード管理：GitHub
デザイン：Figma

技術選定に関してはほんとにわからなかったので、ちゃじ君(ChatGPT君)にぶん投げで帰ってきたものを採用しちゃいました。。。笑

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566153/68c3281d-907f-adda-9820-ff60228b83fa.png)


# はじめての実装（？）
そんなこんなで技術選定を終え、いざ開発開始！！

。。。

。。。

。。。

kotlinって。。。なに。。。？Firebase？(いやほかの技術もなにこれ)

そもそも開発経験なんてないからkotlinじゃなくても意味わからないんですけどね。

助けて、ちゃじ君😢(切実)

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566153/67fb50fc-ee1c-5192-6201-25d4aafed4b5.png)
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566153/55603252-e7aa-f89d-c1ed-ff31bfdb0e31.png)

ありがとう😢心構えまで教えてくれて。。。

ちゃじのいう通り、チュートリアルをカリカリやっていきます😢

# kotlinチュートリアル

よ、よし、まずはkotlinの公式チュートリアルに挑戦だ！！

https://developer.android.com/courses/pathways/android-basics-compose-unit-1-pathway-1?hl=ja#codelab-https://developer.android.com/codelabs/basic-android-kotlin-compose-variables#3

ｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶｶﾀｶﾀｶﾀｶﾀｶ

ふん！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566153/cf661628-f269-2487-ab75-20db395deb8a.png)

まずは最初のチュートリアル終わり！！
5時間くらいでできたしめっちゃ簡単だった！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566153/e374ae0d-9a09-fc15-a370-1923e0358589.png)

ん？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566153/d314be6d-bfb6-b2c3-2ba6-d1084528104c.png)

3時間で終わるわけないやろ！！😡😡😡😡😡

# さいごに
めちゃくちゃ軽い気持ちで、怒りのままに始めたんですが、思ったより難しくて泣きそうでした。。。

ただ、ちゃじ君も言っていたように、毎日コツコツ進めていこうと思います😭

もっとこうしたほうがいいよ！とか、おすすめの勉強法があったら教えてくれたらうれしいです🤗

ここまでお付き合いいただきありがとうございました！
ではまた！🤗

次回：🌻1/30更新🌻
→　1/23~1/29までの進捗を書きます！
Chat GPTの便利さ➀

# はじめに
https://chat.openai.com/

皆さんは**Chat GPT**を知っていますか?
Chat GPTはどれもが無料で使いたければ使えるやつです。
## Chat GPTを「使ってみよう」
便利さとは
https://qiita.com/Atsu1209jp/items/d4273320d5ce5f690e9a
### HTML
```HTML
 <!DOCTYPE html>
    <html lang="ja">
    <head>
        <title>偶数奇数(出会いたくない)</title>
        <meta charset="UTF-8">
    </head>    
        <body>
            <h1>1~10の数字を入力</h1>
            <textarea id="textarea"></textarea>
            <button id="btn" onclick="btn()">判定</button>
        </body>
    </html>
```
### javascript
```js
 const textarea = document.getElementById("textarea");
            
            function btn(){

                if(textarea.value == "1"){
                    alert("奇数");
                }
                if(textarea.value == "2"){
                    alert("偶数");
                }
                if(textarea.value == "3"){
                    alert("奇数");
                }
                if(textarea.value == "4"){
                    alert("偶数");
                }
                if(textarea.value == "5"){
                    alert("奇数");
                }
                if(textarea.value == "6"){
                    alert("偶数");
                }
                if(textarea.value == "7"){
                    alert("奇数");
                }
                if(textarea.value == "8"){
                    alert("偶数");
                }
                if(textarea.value == "9"){
                    alert("奇数");
                }
                if(textarea.value == "10"){
                    alert("偶数");
                }
                 textarea.value = "";
            }

```

まず上のサイトを見てみましょう。
落ち着かないですよね？このプログラムをHTMLとjsを合体させて、もっと短い文にしてとHTMLに頼む。

## 結果
Chat gptに聞いて見たら、なんと
# コンパクト
```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>偶数奇数(出会いたくない)</title>
    <meta charset="UTF-8">
</head>    
<body>
    <h1>1~10の数字を入力</h1>
    <input type="number" id="inputNumber" min="1" max="10">
    <button onclick="checkNumber()">判定</button>

    <script>
        function checkNumber() {
            const inputNumber = document.getElementById("inputNumber").value;
            const result = inputNumber % 2 === 0 ? "偶数" : "奇数";
            alert(result);
        }
    </script>
</body>
</html>

```
というコードが出てきました。
もっとコンパクトなコードにしたい場合はChat gptをぜひ使ってみてください。
## 終わり
上の説明があったかのようにChat gptはとても便利です。なので使ってみることをおすすめします。
## また今度会いましょう。
Wernerモデルを使った砂丘の生成

# はじめに
この記事は、[Wernerモデルを使った風紋の生成](https://qiita.com/hsmtta/items/1b4c8548189c78f2d5e3) の続きです。

前回の記事では、Wernerモデルを使った風紋の生成方法を紹介しました。今回は、Wernerモデルのアルゴリズムを一部変更することで砂丘のパターンを生成します。

今回の記事で使用するコードは下記のリポジトリで公開しています。

https://github.com/hsmtta/sand_patterns

# 使い方
主要なオプションのみ示します。 `--help` オプションで詳細を確認できます。

* 広い領域をシミュレーションしたい場合にグリッドサイズを大きくしてください
* 時間発展を長く追いたい場合にイテレーション数を大きくしてください
* 砂丘生成モードを利用するには `-d` オプションをつけてください
* 環境で利用できる砂量を `-q` オプションで指定してください

```bash
$ python simulate.py -h
usage: simulate.py [-h] [-w V] [-g N] [-i N] [-d] [-q Q] [-s N]
options:
  -g N, --grid_size N   grid size (default: 100)
  -i N, --num_iter N    number of iterations (default: 500)
  -d, --dune            apply settings for dune generation
  -q Q, --quantity Q    sand quantity. valid on dune generation (default: 1.0)
```

# 使用例
デフォルトで実行すると、砂量 1.0 で計算します。風はx方向（左から右）に吹いています。
```bash
python simulate.py -d -g 140
```

ランダムな高さの表面から三日月形のバルカン砂丘が生成され、風下に向かって流れていきます。クリックすると動画が開きます。

[![Dune pattern (sand quantity = 1.0) - YouTube](http://img.youtube.com/vi/oiSAykjHsM0/0.jpg)](http://www.youtube.com/watch?v=oiSAykjHsM0 "Dune pattern (sand quantity = 1.0) - YouTube")

砂量を増やすとどうなるでしょうか。砂量 3.0 で計算してみます。

```bash
python simulate.py -d -q 3.0 -g 140
```

一列に並んだ尾根が形成され、隣り合う尾根と繋がったり離れたりしながら、風下に流れていきます。環境に供給される砂量が少ないとバルカン砂丘が、多いと横断砂丘が生成される観測事実と整合しています。

[![Dune pattern (sand quantity = 3.0) - YouTube](http://img.youtube.com/vi/eT4fVW0XDcY/0.jpg)](http://www.youtube.com/watch?v=eT4fVW0XDcY "Dune pattern (sand quantity = 3.0) - YouTube")

# 動作概要
[Wernerモデルを使った風紋の生成](https://qiita.com/hsmtta/items/1b4c8548189c78f2d5e3) に示したアルゴリズムと大まかなフローは同じです。周期境界条件が設定されたグリッドに対して、差分法を適用します。風紋生成と同様に、次の時間ステップのグリッドを求めるために、2種類のルールを適用します。後述するように、ルールの内容が風紋生成とは一部異なっています。

```python
for _ in range(num_iter):
    apply_jumping_rule()
    apply_rolling_rule()
```

`apply_jumping_rule()` 関数は風によって砂が飛ばされる過程を模擬しています。以下の現象を考慮します。

* 勾配が大きいと砂の跳躍距離 `jump_length` が短い。勾配が小さいと砂の跳躍距離が長い
* 勾配が大きいと飛砂量 `sand_quantity` が多い（上り坂）。勾配が小さいと飛砂量は少ない（下り坂）
* 砂が無い場所（$z < 0$）から砂は飛ばない

`apply_rolling_rule()` 関数は、砂が崩れる過程を模擬しており、拡散方程式の拡散項に相当する処理です。高さを均一にする効果があります。風紋のパターン生成と同じルールです。

# パラメータチューニング
`jump_length` と `sand_quantity` の関数形を、

```math
z = \alpha + \beta \ \tanh \left( \gamma \ \frac{\partial z}{ \partial x} \right)
```
と仮定しています。$\alpha$, $\beta$, $\gamma$ はパラメータです。求める量が2つあるので、合計6個のパラメータがあります。今回は砂丘のパターンが明瞭に生成されるパラメータを見つけてハードコーディングしています。総当たりでパラメータを見つけましたが、数式を解析することでパラメータを見つけることもできると思います。

```python
    def apply_jumping_rule(self) -> None:
        g = self.grid
        for _ in range(int(0.2 * g.x_size * g.y_size)):
            i, j = random.randint(0, g.x_size - 1), random.randint(0, g.y_size - 1)
            if g[i, j] > 0.0:
                jump_length = int(11.2 - 8.0 * np.tanh(8.0 * g.partial_x(i, j)))
                sand_quantity = 0.5 + 0.4 * np.tanh(2.0 * g.partial_x(i, j))
                g[i, j] -= sand_quantity
                g[i + jump_length, j] += sand_quantity
```

詳細はリポジトリを参照してください。

# おわりに
Wernerモデルを使った砂丘パターンの生成方法と、代表的なパラメータにおける計算結果を示しました。簡単なルールを用いて現実の砂丘によく似たパターンが生成できて面白いと思いました。
rails g model と rails g migration の違い

# はじめに
`rails g model`と`rails g migration`の違いについて、なんとなくの理解しかできていなかったので備忘録としてまとめます。
# rails g modelとは
このコマンドは、新しいモデル（データベーステーブルの設計図）を作成します。モデルはデータベースのテーブルに対応し、アプリケーション内でのデータの取り扱いやロジックの管理に使用されます。
コマンドの記述方法は以下のようになります。
```
$ rails g model モデル名 カラム名:データ型
```
## 実行方法
例えば、以下のコマンドを実行すると、Userモデルに対応するデータベーステーブルを作成するマイグレーションファイルが生成されます。
```
$ rails g model User name:string email:string
```
続いて、このマイグレーションを実行して変更をデータベースに適用します。
```
$ rails db:migrate
```
# rails g migrationとは
このコマンドは、手動でマイグレーションファイルを生成します。主にデータベーススキーマの変更、つまり既存のテーブルに新しいカラムを追加したり、カラムを削除したりするために使用されます。
コマンドの記述方法は以下のようになります。
```
$ rails g migration モデル名 カラム名:データ型
```
## 実行方法
1\. **新しいマイグレーションファイルを生成**
例えば、`users`テーブルに`age`カラムを追加したい場合は以下のコマンドを実行すると、`add_age_to_users`という名前のマイグレーションファイルが生成されます。
```
$ rails g migration add_age_to_users age:integer
```
これで、`db/migrate`ディレクトリに新しいマイグレーションファイルが作成されます。
このマイグレーションファイルを編集して、`users`テーブルに`age`という名前の新しいカラムを追加できます。
```ruby
# db/migrate/xxxxxx_add_age_to_users.rb
class AddAgeToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :age, :integer
  end
end
```
続いて、このマイグレーションを実行して変更をデータベースに適用します。
```
$ rails db:migrate
```
# まとめ
`rails g model`は新しいモデルを作成するために使い、`rails g migration`は手動でマイグレーションファイルを生成し、データベースのカラムの追加や削除を行うために使用されます。
Windows 11 の VSCode の Python 開発環境の構築


::: note
この記事は [「Windows 11 への Python のインストール」](https://qiita.com/mmake/items/5197afbe5c055f82265e) と [「Windows 11 への VSCode のインストール」](https://qiita.com/mmake/items/2cf2131a0ab5bc431215) の続きの内容になります。
:::

この記事では 18 歳の新入社員向けに VSCode の Python 開発環境を構築する手順を説明します。

## 前回のおさらい

[「Windows 11 への Python のインストール」](https://qiita.com/mmake/items/5197afbe5c055f82265e) では Windows 11 に Python3 をインストールしました。[「Windows 11 への VSCode のインストール」](https://qiita.com/mmake/items/2cf2131a0ab5bc431215) では Windows 11 に VSCode をインストールしました。

引き続き VSCode に Python 拡張機能をインストールし、Python 開発を行う方法を説明します。

## Python 開発環境の構築
### Visual Studio Code の起動
スタートメニューから「**Visual Studio Code**」を起動します。

![41_vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/f88aa5d6-b963-a554-2164-bd5b51b7c081.png)

### 拡張機能の追加
左端にある「**拡張機能**」アイコンをクリックします。

![32_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/8c08cb94-d013-c9df-ff07-4899784df11e.png)

### 拡張機能 の検索
拡張機能の検索ボックスに「python」と入力します。

![43_extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/99d92ef1-a8e5-cdd3-0c2a-9420ffb8c43c.png)

### 拡張機能 のインストール
検索結果に **Python (Python extension for Visual Studio Code)** が表示されたら、「**インストール**」をクリックします。

![34_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/685621e3-f2fd-7cc1-1f31-5343113dc2d5.png)

以上で基本的な環境構築は完了です。

## Python アプリケーションの作成例

### 新しいファイルの作成
VSCode のメニューから「**ファイル**」 > 「**新しいファイル**」の順にクリックします。

![61_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/235e37bd-9694-ff20-c22b-d3b4dde9a965.png)

### ファイルの種類の選択
ファイルの種類の選択が表示されたら「**Python ファイル**」をクリックします。

![63_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/28443a02-1585-c0d5-79fc-5acf4735cc4e.png)

### プログラムの入力
エディタが開いたら、以下のソース コードを入力します。

``` Untitled-1.py
msg = "Hello world!"
print(msg)
```

### プログラムの実行
画面右上にある **再生ボタン ▷** をクリックします。

![65_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/a2e8de79-ea37-e5f9-5856-ae44219bc8e1.png)

### ファイルの保存
名前を付けて保存の画面が表示されたら、デスクトップフォルダに **hello.py** として保存します。

![69_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/ccdad259-66cf-9312-c985-d9b2cf764208.png)

### プログラムの動作完了
下のターミナルコンソールに、「Hello, World!」 と表示されると動作完了です。

![71_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/317f256c-b8ee-76eb-b719-27b819df7f17.png)

# 参考文献
- Getting Started with Python in VS Code
https://code.visualstudio.com/docs/python/python-tutorial
- Python.jp > Visual Studio Code でPython入門 【Windows編】
https://www.python.jp/python_vscode/windows/setup/index.html

- Python
https://marketplace.visualstudio.com/items?itemName=ms-python.python

- Python Debugger
https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy

- Pylance
https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance
クラスターへの招待状

<font color="Grey">*[An invitation to cluster](https://aiven.io/blog/an-invitation-to-cluster)の翻訳です。*</font>

2021年11月17日

# クラスターへの招待状

Aivenはスタートアップ企業を新しいスタートアップ・プログラムに招待します。Aivenがなぜ割引やその他の機会でフレッシュなアーリーステージのスタートアップを支援するのかをご覧ください。

## Aiven Clusterとは？


Aivenクラスター・スタートアップ・プログラムは、急成長中のスタートアップに最大10万米ドル相当のクレジットを無料で提供するもので、12カ月間にわたって利用できます。クラウド上に最新のデータインフラを構築し、管理に頭を悩ませることなくご利用いただけます。


例えば、PostgreSQLやMySQLのような単一のデータベースを立ち上げ、今すぐのニーズに対応し、本番稼動時にはレプリカで拡張することができる。あるいは、Apache Kafkaを使って強力なストリーミング・サービスを構築し、Grafanaに接続して既製のダッシュボードを利用することもできる。アイデアをテストするために、ちょっとした趣味のデータベースを作る必要があるかもしれない。Aivenは最も簡単な方法です。


*そして*あなたは私たちの幅広い選択肢からクラウドとリージョンを選ぶことができます。


しかし、お金やサービスだけではありません。私たちのクラスタースタートアップのために、私たちは以下を提供します。


* Aivenの専門家と技術サポートへのアクセス
* Aivenを活用し、貴社に最適なデータインフラを構築するためのバーチャルイベント
* 最初の6ヶ月で規模を拡大したスタートアップには、Aivenのチャンネルでの共同プロモーションとビジビリティを提供します。


## コミュニティへの還元


Aivenはなぜ今、この旅に出るのか？


「その昔、Aivenはスタートアップ・プログラムに参加していました。「当時のコミュニティからの支援には常に感謝しています。そのような企業のひとつひとつが、私たちの心の中で特別な位置を占めているのです」。


今、Aivenはその恩返しをしようとしている。「資金が限られている新興企業が、社内ですべてを行うことで費用を節約しようとし、その結果、進歩が遅くなるのを私たちは見てきました。私たちのようなプログラムがあれば、新興企業は会社のデータ・インフラを心配する代わりに、重要なことに集中することができます。御社の優秀な頭脳は、Apache Kafkaの管理に明け暮れるのではなく、御社の製品やサービスを開発すべきなのです。"


スタートアップ・プログラムに参加する企業にとっても、提供する企業にとっても、メリットは大きい。「Aivenは、新進気鋭のスタートアップ企業のニーズから学びたいと考えています。「そして場合によっては、Aivenは、早い段階から私たちを後押ししてくれた企業のビジネスに力を与えることができる。


Aivenを使えば、インフラがほとんどない小さなスタートアップでも、すぐに生産性を上げることができます。


「Aivenを使えば、インフラをほとんど持たない小さなスタートアップでも、すぐに生産性を上げることができます。「私たちはそこにいて、歩んできた。今、私たちは次世代の成功の手助けをしたいのです」。


## プログラムに参加しよう


クラスターには、いくつかの参加資格があります。企業としての参加資格は以下の通りです。


...承認されたパートナー組織と提携している。


... あなたの起業が5年以上経過していないこと。


... 資金調達がシリーズAレベルまたはそれ以下である。


... 会社のウェブサイトとそれに関連するEメールアドレスを持っている。


Aiven・クラスターの一員になるには、[クラスターページ](https://aiven.io/cluster)にアクセスし、フォームに必要事項をご記入の上、大きなオレンジ色のボタンをクリックしてお申し込みください。


まだ質問がありますか？[cluster@aiven.io](mailto:cluster@aiven.io) にメールを送ってください。


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントもフォローして、製品や機能関連の最新ニュースをチェックしてください。
配列の要素をランダムに取り出す

配列の要素をランダムに取り出すプログラムサンプルです。

```python3 
# randomクラスを読み込む
import random

# 結果出力関数
def result(msg):
  print("僕の今日のおかずは" + msg + "です")

# データ配列
array1 = ["秋元真夏","長濱ねる","矢久保美緒","与田祐希","影山優佳","遠藤さくら","齋藤飛鳥"]

# 乱数を使ってランダムに配列から要素を取り出す
num = random.randint(0,len(array1)-1)
c1 = array1[num]
# 出力
result(c1)
```
【Next.js13】axiosでwithCredentialsを入れたのにcookieが送信されない話

## はじめに
　cookieにセットされたトークンを用いるため、`axios`のオプションに`withCredentials`を追加しましたが、APIを叩いても401エラーとなり弾かれてました。自分の理解の浅さ故、何日も溶かしてしまったので、初学者の備忘録として残します。


 ## 結論
 　Next.jsでは、Server Componentsの使用をデフォルトとしているため、クライアント側にセットされたcookieをサーバーサイドで読み取ることができません。なので、一度cookieから吸い上げて、headerオプションにセットする必要がありました。

```react
export async function getServerSideProps(context) {
	const apidata = await getApi(context.req.cookies);
	return { props: { api: apidata　} };
}


import axios from 'axios';

export default async function getApi(cookies) {
	const access_token = cookies['access_token'];

	return await axios
		.get('http://nginx-back:80/api', {
			headers: {
				'Content-Type': 'application/json;',
                // withCredentials: true,　　←これではダメ
				Authorization: `JWT ${access_token}`,
			},
		})
		.then((res) => {
			const data = res.data as Data[];
			return data;
		})
		.catch((e) => console.log(`エラーが発生しました: ${e}`));
}

```


## Server Components、Client Componentsとは何か？
　その名の通りですが、Server Componentsは、サーバー側でレンダリングされるコンポーネント。Client Componentsは、クライアント側でレンダリングされるコンポーネントです。
 
 　サーバーサイド・クライアントサイドにレンダリングを分けることによって、「従来のサーバーレンダリングのパフォーマンス向上」と「クライアントサイドのリッチな双方向性」を両立させながら、サーバー・クライアント両方の環境でアプリケーションを構築できるようになりました。

　`app`ディレクトリ内のコンポーネントは、デフォルトでServer Componentsとなり、Client Componentsとして扱うためには、コードの先頭（import文よりも上）に`'use client'`とつける必要があります。

 ```react
 'use client'
 
import { useState } from 'react'
 
export default function Counter() {
  const [count, setCount] = useState(0)
 
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  )
}
 ```


 ## Sever Componentsのメリット
 　以下、[公式](https://nextjs.org/docs/app/building-your-application/rendering/server-components)からの引用です。
　
- データ取得
　データの取得をデータソースに近いサーバーに移すことができます。これにより、レンダリングに必要なデータを取得する時間が短縮され、クライアントが行うべきリクエストの回数が減るため、パフォーマンスが向上します。
　
- セキュリティ
　トークンやAPIキーなどの機密データやロジックを、クライアントに公開するリスクなしにサーバー上に保持できます。
　
- キャッシュ
　サーバー上でレンダリングすることで、結果をキャッシュし、後続のリクエストやユーザー間で再利用することができます。これにより、各リクエストで実行されるレンダリングとデータ取得の量を減らすことで、パフォーマンスを向上させ、コストを削減することができます。
 　
- バンドルサイズ
　以前はクライアントJavaScriptのバンドルサイズに影響を及ぼしていた大きな依存関係をサーバーに残すことができます。クライアントがServer Componentの JavaScript をダウンロード、解析、実行する必要がないため、インターネットの速度が遅いユーザーや性能の低いデバイスを使用しているユーザーにとって有益です。
　
- 初期ページロードとファースト・コンテントフル・ペイント（FCP）
　サーバー上で、ページのレンダリングに必要なJavaScriptをクライアントがダウンロード、解析、実行するのを待たずに、ユーザーがすぐにページを表示できるようにHTMLを生成することができます。
 　
- 検索エンジン最適化とソーシャルネットワークの共有性
　レンダリングされたHTMLは、検索エンジンのボットがページをインデックスしたり、ソーシャルネットワークのボットがページのソーシャルカードプレビューを生成するために使用することができます。
　
- ストリーミング
　レンダリング作業を分割して、準備ができ次第クライアントにストリーミングできます。これにより、ユーザーはページ全体がサーバーでレンダリングされるのを待つことなく、ページの一部を早めに見ることができます。


## おわりに
　公式リファレンスをちゃんと読むって大事ですね。参照する癖をつけておけば、何日もネットを彷徨うこともなかったと思います。


## 参考
- [Rendering: Server Components | Next.js](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
- [[Next.js v13][和訳] Server & Client Components](https://zenn.dev/hamo/articles/31133919b987b9)
- [【Next.js】Server ComponentsとClient Componentsについてまとめてみた - すずむらの積み上げblog](https://suzumura-tumiage.com/javascript/598/)
暗号資産LightningCash-Rのフルノードを構築する方法

## 要　旨
暗号資産LightningCash-Rのフルノードを構築する方法(CLI)について記述します。
## 実行環境等
VPS:KAGOYA VPS
OS:Ubuntu22.04LTS
CPU/メモリ:2コア/2GB
ストレージ:200GB SSD
料金　32円/日、880円/月(2024.1.13時点)
同期開始:2024.1.13(土)09:00
同期完了:2024.1.13(土)10:40
同期に要した時間:1時間40分
使用ストレージ容量:11GB
## 実施要領
アップデート
```linux
apt update
```
ウォレットのインストール
```linux
wget https://github.com/MerlinMagic2018/LightningCash-R/releases/download/v1.0.0/LightningCashR-v1.0.0-x86_64-pc-linux-gnu.tar.gz
```
展開する。
```linux
tar -xzvf LightningCashR-v1.0.0-x86_64-pc-linux-gnu.tar.gz
```
不要になったファイルの削除
```linux
rm LightningCashR-v1.0.0-x86_64-pc-linux-gnu.tar.gz
```
ディレクトリの移動
```linux
cd LightningCashR-v1.0.0-x86_64-pc-linux-gnu/bin
```
コマンドをインストールする
```linux
install -m 0755 -o root -g root -t /usr/local/bin *
```
lightningcashrdの起動
```linux
lightningcashrd
```
起動を確認したら(1分経過したら)、一旦停止させる。(起動時に動作内容は表示されない)
ctr + C
~/.lightningcashr/lightningcashr.confを新規作成する。
```linux
vi ~/.lightningcashr/lightningcashr.conf
```
以下を記述して、保存する。
```linux
mainnet=1
daemon=1
server=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcport=9332
gen=1
genproclimit=-1
```
再度lightningcasgrdを起動させて、同期させる。
```linux
lightningcashrd
```
同期状態の確認。
```linux
tail -f ~/.lightningcashr/debug.log
```
## 結　言
今回は、暗号資産LightningCash-Rのフルノードを構築する方法(CLI)について記述しました。
2024/1/23主にITとかセキュリティの記事

なぜ医療機関がサイバー攻撃で狙われるのか　こんな弱点があった(1/20)
https://kn.itmedia.co.jp/kn/articles/2401/20/news048.html

Microsoftがロシア政府支援のハッキンググループ「Midnight Blizzard」からサイバー攻撃を受けたと発表(1/21)
https://gigazine.net/news/20240121-microsoft-email-hack-russian-intelligence-group/

緊急の脆弱性含むOracleパッチアップデートが公開、アップデートを(1/21)
https://news.mynavi.jp/techplus/article/20240121-2866446/

企業の中国製ドローンの使用に警鐘、安保上の懸念示し　米ＦＢＩ(1/21)
https://nordot.app/1121720038755058410

サイバー防衛　脆弱な体制をどう改めるか(1/21)
https://www.yomiuri.co.jp/editorial/20240120-OYT1T50243/

［社説］能動的サイバー防御の始動を遅らせるな(1/21)
https://www.nikkei.com/article/DGXZQODK193MV0Z10C24A1000000/

国税庁を装い「e-Taxアカウント作成は義務」とウソを付いてクレカ情報を盗もうとする詐欺師登場(1/21)
https://ascii.jp/elem/000/004/180/4180438/?rss

「トロイの木馬に感染」松山の高齢男性　２８万円特殊詐欺被害【愛媛】(1/21)
https://nordot.app/1121622526428791485

ビットコインにゴールデンクロス／マイナーからの流出が6年ぶりの高水準【Weekly Review：1/6〜1/12】(1/21)
https://www.coindeskjapan.com/216874/

Discordサイバー攻撃。過激な“グロ画像”で学生が病院に搬送(1/21)
https://www.gizmodo.jp/2024/01/uc-irvine-students-hospitalized-hackers-discord.html

生成AIを導入する際の社内ルールの決め方や作る方法、ガバナンス体制の構築方法を徹底解説(1/21)
https://weel.co.jp/media/gen-ai-corporate-rule

政府『デジタル市場競争会議』がiPhoneのApp Storeの自由化を進めると何が起こる？(1/21)
https://gunosy.com/articles/eLQ3X

5G-Advancedや6Gに向けて基盤技術4つの検討進む、5G Americasの最新白書から(1/22)
https://xtech.nikkei.com/atcl/nxt/news/24/00076/

ルネサスが低消費電力ArmコアMPU、「待機電力10μWからLinuxが即起動」(1/22)
https://xtech.nikkei.com/atcl/nxt/news/24/00072/

意外に簡単、身近なハードで無線LANパケットキャプチャーに挑戦しよう(1/22)
https://xtech.nikkei.com/atcl/nxt/column/18/02723/011800001/

自分の知らぬ間に個人情報が漏洩、チェックサイトを使ってメルアドを確認しよう(1/22)
https://xtech.nikkei.com/atcl/nxt/column/18/02676/120500012/

LoRA（Low-Rank Adaptation）(1/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/011500159/

思い込みによるミスは防げるか　羽田空港事故で知るAIの使い道(1/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/011800157/

センサー処理装置の障害で50便が遅延　ネットワーク不備がデータの誤流入招く 国交省(1/22)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/011800148/
JavaをインストールしないでJavaアプレットを実行する方法

![applet-browser-1024x568.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/980d5378-c643-917f-4ba5-bb3f9057dbbc.jpeg)
# JavaをインストールしないでJavaアプレットを実行したいですか？
CheerpJ Applet Runner 拡張機能を使えば、Javaをインストールすることなく、Google Chrome上で従来のJavaアプレットを実行できます。

[今すぐ無料で試す](https://chrome.google.com/webstore/detail/cheerpj-applet-runner/bbmolahhldcbngedljfadjlognfaaein)

⭐⭐⭐⭐ 110 – 👤 40,000+ users

# JavaをインストールせずにJavaアプレットを実行
CheerpJ Applet Runnerの使い方はとても簡単で、[1クリックで拡張機能をインストールし](https://chrome.google.com/webstore/detail/cheerpj-applet-runner/bbmolahhldcbngedljfadjlognfaaein)、Chromeの右上にあるアイコンを使ってアプレットベースのWebページで有効にします。

必要なアプレットやお気に入りのアプレットまで2クリックでアクセスできます！

この拡張機能は、JavaアプレットをJavaScriptにコンパイルし、リモートサーバーに依存することなく、ブラウザでその場で実行できます。つまり、すべてのデータとアプリケーションは、ブラウザの境界内に保持されます。

![CheerpJ_Horizontal_Trans-300x81.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/201ed41c-c74f-b7bb-4408-446bf70ec683.png)

# CheerpJは、Javaアプリケーションを自動的にHTML5に変換する唯一のソリューションです。
CheerpJ Applet runner エクステンションは、私たちのプロフェッショナルな[JavaからJavaScriptへのコンパイラー](https://cheerpj.com/)、CheerpJをベースにしています。

CheerpJは、レガシーJavaアプリケーション(アプレットやスタンドアロンJavaクライアントを含む)の全部または一部をWebAssemblyとJavaScriptの組み合わせに変換する自動化ツールを提供し、最新のブラウザベースのHTML5 Webアプリケーションに統合することができます。

CheerpJは次のようなことを実現しています：

・Java 8との幅広い互換性 (Oracle Forms、EBS、Swing、AWT、そして多くのフレームワークやライブラリでテスト済み)

・完全なJava SEランタイムライブラリの提供；

・ファイルシステムへのアクセス（読み取りと書き込み）、オーディオ、ネイティブ・ブラウザ機能による印刷をサポート；

・JavaマルチスレッドとHTML5 WebWorkersのサポート；

・アプリケーションのソースコードにアクセスすることなく、Javaをバイトコードから変換します。

[CheerpJの詳細](https://cheerpj.com/)

# JavaをインストールせずにJavaアプレットを実行
拡張機能を1クリックでインストールし、Chromeの右上隅にあるアイコンを使ってアプレットベースのWebページで有効にするだけです。

[今すぐ無料で試す](https://chrome.google.com/webstore/detail/cheerpj-applet-runner/bbmolahhldcbngedljfadjlognfaaein)

https://leaningtech.com/legacy-modernisation-jp/

引用元：https://cheerpj.com/how-to-run-java-applets-without-installing-java/