OmniAICreator/Qiita-1.07M huggingface dataset:
Stackプログラミング言語とは

Stackプログラミング言語は、スタック指向型のスクリプト言語であり、そのユニークな設計と多様な用途に対応するディストリビューションで知られています。以下にその特徴と主なディストリビューションについて詳述します。

https://github.com/stack-community

## 言語の特徴

### メタプログラミング機能

Stackプログラミング言語は、強力なメタプログラミング機能を持っています。この機能により、コードを動的に生成・操作することが可能です。メタプログラミングの利点として、複雑なプログラムの自動生成や高レベルの抽象化が容易になります。例えば、変数名をもプログラムで制御する事ができ、柔軟なシステムが構築できます。

### 動的型システム

Stackは動的型システムを採用しています。これは、変数の型が実行時に決定されることを意味します。動的型システムにより、開発者はコードを書きやすくなり、柔軟なプログラミングが可能となります。静的型システムに比べて型の宣言が不要なため、迅速なプロトタイピングやスクリプト作成に適しています。

### 構文のないデータ構造

Stackのコードは文字列として保持され、構文がなくデータ構造で表現されます。これは他の多くのプログラミング言語とは異なり、非常に珍しい設計です。この特徴により、コードの解析や操作がデータ操作としてシンプルに行えます。具体的には、コードそのものをデータとして扱うことで、プログラムの一部を動的に変更したり、生成したりすることが容易になります。


## 📋 ディストリビューション一覧

Stackのディストリビューションは多岐にわたり、用途に応じて選ぶことができます。以下に主要なディストリビューションを紹介します。

| name | overview |
|------|----------|
| [StackLang](https://github.com/stack-community/stack-lang) | 最初の実装。シェルベースの機能に特化しています。 |
| [StackServer](https://github.com/stack-community/stack-server) | サーバーサイド開発向け。<br>簡単にWebシステムを構築できます。 |
| [StackWasm](https://github.com/stack-community/stack-wasm) | WebAssemblyによる実装。<br>オンライン実行環境で使用されます。 |
| [StackGUI](https://github.com/stack-community/stack-gui) | GUIアプリケーションを開発できます。<br>ウィンドウにはWebテクノロジを使用します。 |
| [NumStack](https://github.com/stack-community/stack-num) | 科学技術や数学計算向け。数学者にとって有用です。 |
| [JStack](https://github.com/stack-community/stack-java) | Java VM上で動作するように設計されています。<br>Javaの豊富なエコシステムを利用できます。 |
| [StackUltimate](https://github.com/stack-community/stack-ultimate) | 各ディストリビューションの全機能を含んでいます。<br>非常に重くコアユーザー向けです。 |



## 結論

Stackプログラミング言語は、そのメタプログラミング機能、動的型システム、構文のないデータ構造といったユニークな特徴を持っています。これにより、開発者は柔軟かつ効率的にプログラムを作成・管理することができます。また、用途に応じて選べる多様なディストリビューションが存在し、幅広い開発ニーズに対応可能です。Stackはまだ発展途上にありますが、今後の成長が期待されます。

このように、Stackプログラミング言語は多岐にわたる機能と柔軟性を持ち、開発者に多くの可能性を提供しています。メタプログラミング機能や動的型システムを活用することで、複雑なプログラムの生成や管理が簡単になります。さらに、さまざまなディストリビューションを通じて、特定のニーズに対応した開発が可能です。Stackコミュニティに参加し、この言語の成長に貢献することで、さらに多くの革新的なプロジェクトを実現できるでしょう。
Tableau 外部アクション試してみた

## はじめに
Tableauで分析した結果から、Salesforceのフローを動かす機能があったので触ってみました。
（Tableauの内容なので、Salesforceのフロー作成は割愛します。）

[外部アクションの統合](https://help.tableau.com/current/pro/desktop/ja-jp/external_actions.htm)

## 方法
1. Salesforceの自動起動トリガーフローを作る
1. ダッシュボードのオブジェクトにワークフローを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/48d4aafe-1892-0d77-21cb-e31235b58217.png)
1. Salesforceの認証をする（sandboxに接続したい場合は「カスタムドメインを使用」から）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/50c1dae4-3383-2b4d-f55a-41756ea90c68.png)
1. フローを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/33e39562-86a8-c0e2-9493-8c23ecafb2a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/23bf8c6f-8f17-d288-41d3-ace1a60db723.png)
1. 外部アクションを行うシートと、一度に送信できるマーク数の上限数を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/962e95b5-9e76-b34f-c9e3-051409fbf931.png)
1. フローの変数にTableau側の数値を割り当てる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/d904b157-12b1-3b4b-e615-f0a71e19d11b.png)
1. 実行ボタン書式を設定して完了

すると、
設定した上限以内のマークを選択しているを選択している時だけ、ボタンが押せるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/f23853c4-5b08-9029-7570-54bdc91651f5.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986320/fe3ffa03-b9ec-a9af-310d-697d4b89454d.png)

## 注意事項
- 割り当てられるのは、マークの中にあるデータのみ
    - グラフにないデータも送信したい場合はツールヒントに入れておこう
- 複数マークのデータを送信する場合
    - 数値は合計値が送信されるので、切り分けたい場合はコレクション変数をフローに作成しておく必要がある

## さいごに
Tableauでの設定はすごく簡単でした。
Tableauで分析したデータをSalesforceに送って、自動でTodoや商談を作成したりSlackに通知を飛ばしたり、色々便利なことができそうです。
が、僕はSalesforceはまだまだ勉強中なため、活用事例ができたら追って記事化していきます。
Alibaba Cloudを使って爆速でサーバーを立てる

## はじめに
クラウドコンピューティング技術は、今日のデジタルビジネスの基盤となっています。今回はクラウドのサービスの内、アリババグループによって提供されるAlibaba Cloudについて紹介していきます。

またAlibaba Cloudを使ってサーバーを立てる方法について紹介します。

## Alibaba Cloudの特徴
Alibaba Cloudは他のクラウドサービスに比べてコストが安いです。なのでスモールスタートでサーバーを借りたいときはAlibaba Cloudが選択肢に入ると思います。

またUIがわかりやすく、初心者でも操作しやすい&AWSやGCPの経験は簡単に移行できます。

さらにアリババクグループは中国の会社なだけあって、中国特有の規制やインターネット環境に適応したサービスを提供しています。このため、中国市場への進出を検討している場合は有効だと考えられます。

https://sbopsv.github.io/cloud-tech/introduction/introduction05.Usefulness

## Alibaba Cloudでのサーバーの立て方

Alibaba Cloudでサーバーを立てるためには、Elastic Compute Service(ECS)を使えば良いです。

https://www.alibabacloud.com/product/ecs?accounttraceid=e43ec189e3be4a24bde07973875b389cxldk


https://sbopsv.github.io/cloud-tech/introduction/introduction08.compare


Alibaba Cloudにログインして、Elastic Compute Serviceを検索します。
以下の画面のCreate ECS Instanceでインスタンスを作成できます。


![ 2023-12-17 15.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/ee985009-b97b-de03-4787-058bf013fba9.png)

Custom Launchを選択し、サーバーのコスト設定を選びます。
サーバーを定常運用させたい場合はSubscription、従量制で使いたい場合はPay-as-you-goを選択します。

![ 2023-12-17 15.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/1fd75017-e5d1-d603-483e-637fefb5a8cd.png)

次にインスタンスタイプを選びます。インスタンスタイプはCPU数やメモリ、用途などで細かく設定できます。

:::note 
インスタンスタイプの選択で、コストがわかりやすく表示されるのが良いですね。
:::

![ 2023-12-25 20.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/5452a98f-1888-4ca2-1113-4f139cec9190.png)

次にImageやストレージを選択します。UbuntuやCentOS、Windows ServerなどImageの種類も豊富です。

![ 2023-12-25 20.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/91071787-eb48-dcf7-d4f0-7da17211ee6a.png)

ネットワークの設定を行います。ここではVPCやセキュリティグループを指定します。
パブリックIPアドレスを設定したい場合はここで設定します。

![ 2023-12-25 20.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/9ede418f-833a-d5ef-6015-c99ff0d069bf.png)

:::note warn 
ここではIPアドレスを公開した時のセキュリティ対策ができません。セキュリティ対策を行いたい場合は、別途Cloud Firewallを設定してください。
:::

https://www.alibabacloud.com/product/cfw


ログイン方法等のインスタンスの設定が終われば、インスタンスを作成できます！（大体2-3分ほどで作成されます。）


:::note warn
実際にサーバーを立てるためには、クレジットカードの認証が必要です。
:::



### ECSサーバーへのアクセス
インスタンスのConnectボタンを押せば接続できます。

![ 2023-12-17 15.56.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/28a7339f-c9e5-c880-2488-56f1ee697735.png)

インスタンス作成時に設定したログイン方法でログインできます。

簡単です！


### 注意点:コストについて
ECSのサーバーは設定によっては停止していても値段がかかります。筆者の場合は、停止した状態でもサーバーのIPが表示されていたので、おそらくElastic IPアドレスを取得した状態でコストがかかっていたと推測されます。


## おわりに
Alibaba CloudはUIがわかりやすいので、AWSやGCPを触っている方はすんなり使えるのかなと思いました。

Alibaba Cloudの方がコストが安くなるケースが往々にしてあるので、AWSやGCPからの移転について一考の余地はあるのかなと思います。
Pythonでプロ野球データを年度別にクローリングしCSVに保存してみよう

# はじめに
この記事では、Pythonを使用してプロ野球選手の打率データを年度別にウェブからクローリングし、CSVファイルに保存する方法を詳しく解説します。データ収集から分析までの一連のステップを学び、データ活用の基盤を築きましょう。

# 必要なライブラリ
このプロジェクトを実行するために必要なPythonライブラリは次の通りです。必要なライブラリがインストールされていることを確認しましょう。

-requests: ウェブページからデータを取得するためのライブラリ。
-BeautifulSoup: HTMLデータを解析するためのライブラリ。
-pandas: データの整理とCSVファイルへの保存に使用するライブラリ。

# コードの概要
このプロジェクトのコードは、以下の手順で実行されます。

1. 年度ごとにデータをクローリングし、ウェブページから取得します。
1. HTMLデータを解析してテーブルデータを抽出します。
1. データを整理し、年度ごとにCSVファイルに保存します。

# 年度別にデータをクローリング
**コード説明**
年度ごとにデータをクローリングするために、forループを使用します。指定した年度から過去に遡りながらデータを収集し、CSVファイルに保存します。

```python:python
import requests
from bs4 import BeautifulSoup
import pandas as pd

# 開始年度と終了年度（過去から遡る）
start_year = 2023
end_year = 2009

for year in range(start_year, end_year - 1, -1):
    file_path = f'pro_baseball_data_{year}.csv'
    if year == start_year:
        url = 'https://baseball-data.com///stats/hitter-all/avg-1.html'
    else:
        formatted_year = year - 2000  # 年度の形式に変換（例: 2023 -> 23）
        url = f'https://baseball-data.com/{formatted_year:02d}/stats/hitter-all/avg-1.html'
    
    response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        table = soup.find('table')
        rows = table.find_all('tr')
        data = []

        for row in rows[1:]:
            cols = row.find_all(['td', 'th'])
            row_data = [col.get_text(strip=True) for col in cols]
            data.append(row_data)

        columns = [col.get_text(strip=True) for col in rows[0].find_all(['th', 'td'])]
        df = pd.DataFrame(data, columns=columns)
        df.drop(df.index[-1], inplace=True)

        df.to_csv(file_path, index=False)
    else:
        print(f"Failed to retrieve the page for year {year}. Status code: {response.status_code}")

```
**ループの詳細説明**
1. `start_year`と`end_year`で取得したいデータの範囲を指定します。
1. forループで年度ごとにデータを取得します。年度ごとのデータはCSVファイルに保存されます。
1. `file_path`でCSVファイルの保存先を指定します。
1. `url`でデータを取得するウェブページのURLを構築します。
1. `requests.get()`でウェブページからデータを取得します。
1. ウェブページから取得したデータを解析し、必要な情報を抽出します。
1. データを整理して`pandas`の`DataFrame`に格納します。
1. `DataFrame`をCSVファイルに保存します。

:::note warn
**注意点**
1. クローリングを行う際は、対象ウェブサイトの利用規約を遵守してください。
1. ウェブサイトの構造が変わると、コードの調整が必要になる可能性があります。
:::


# まとめ
Pythonを使ってプロ野球のデータをクローリングし、年度別にCSVファイルに保存する方法を学びました。これにより、データ分析や研究のための基盤が整いました。データ収集の基本をマスターし、さまざまなプロジェクトで活用しましょう。
【Swift】コード上で色を視覚的に認識できるように使用する

# はじめに
Xcodeでは色を視覚的に認識できるように使用できる`#colorLiteral`というものがあります。
これを多用するのは良くなさそうですが、色の定義部分で使用するにはひと目でわかるので便利そうです。

補完などは出ないのでコードのコピペで使用しましょう

# どのように表示されるの？
![スクリーンショット 2023-12-25 20.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2e74d928-9cdb-bc15-a6ae-fa2d2497d8c3.png)

# 実装
```swift
#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)

#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)

#colorLiteral(red: 1, green: 0, blue: 0, alpha: 1)

#colorLiteral(red: 0, green: 1, blue: 0, alpha: 1)

#colorLiteral(red: 0, green: 0, blue: 1, alpha: 1)
```

# おわり
即変換されてしまうので、色を調節しながら定義するとかは向いてなさそうです。
vonageでSMS送るまで

# Vonage APIを使ってSMSを送るまで
SMSを送るのにVonage APIを利用してみます。

## nodeで実行
```
npm install @vonage/server-sdk
```

vonage.js ファイルを作成

```
const { Vonage } = require('@vonage/server-sdk')

const vonage = new Vonage({
  apiKey: "{ここにapikeyを入力}",
  apiSecret: "{ここにapisecretを入力}"
})
const from = "Vonage APIs"
const to = "{ここに電話番号を入力}"
const text = 'A text message sent using the Vonage SMS API'

async function sendSMS() {
    await vonage.sms.send({to, from, text})
        .then(resp => { console.log('Message sent successfully'); console.log(resp); })
        .catch(err => { console.log('There was an error sending the messages.'); console.error(err); });
}

sendSMS();
```

[公式のここにのってる](https://dashboard.nexmo.com/getting-started/sms)

これを実行

```
PS C:\Users\username\Desktop> node vonage.js
Message sent successfully
{
  messages: [
    {
      to: 'phone number',
      'message-id': 'xxxxxx',
      status: '0',
      'remaining-balance': '1.82300000', //残りクレジット
      'message-price': '0.07350000', //料金
      network: 'xxxxxx',
      messageId: 'xxxxxx',
      remainingBalance: '1.82300000',
      messagePrice: '0.07350000'
    }
  ],
  'message-count': '1', //メッセージ件数
  messageCount: '1'
}
```

## 本当にSMSが来た、簡単、すげぇ！！
![S__22978575.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3353450/0c80ef8c-a20e-4e5e-d1f8-7225a2d8299f.jpeg)

これなら二段階認証とかも作りやすそう!!
ただ高いかな...為替とかにもよるけどしっかりとクレジットを見ておく必要がありそう!!
以上!!
An executable bug report for Action Cable

So this is kind of last minute, but I thought it would be interesting to try and create a [bug report template](https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#create-an-executable-test-case) for Action Cable.

After having wasted maybe an hour or so trying to parse the browser logs, only to realize that Chrome prepends the file/url and line number before simply `[object Object]` style -- I ended up just writing to a `<textarea>` the data from the websocket. I think this is a step in the right direction though, and it was a fun experiment at least.

Here it is.

```ruby
# frozen_string_literal: true

require "bundler/inline"

gemfile(true) do
  source "https://rubygems.org"

  git_source(:github) { |repo| "https://github.com/#{repo}.git" }

  gem "rails", github: "rails/rails", branch: "main"

  # system test dependencies
  gem "puma"
  gem "capybara"
  gem "selenium-webdriver"
end

require "action_controller/railtie"
require "action_cable/engine"

class TestApp < Rails::Application
  #config.load_defaults Rails::VERSION::STRING.to_f

  config.root = __dir__
  config.eager_load = false

  config.logger = Logger.new($stdout)
  Rails.logger  = config.logger

  config.action_cable.cable = { "adapter" => "async" }

  routes.append do
    get "/test" => "test#index"
    get "/broadcast" => "test#broadcast"
  end
end

class TestController < ActionController::Base
  include Rails.application.routes.url_helpers

  def index
    render inline: DATA.read
  end

  def broadcast
    ActionCable.server.broadcast "test_channel", { message: "hello" }
    render plain: "ok"
  end
end

class TestChannel < ActionCable::Channel::Base
  def subscribed
    stream_from "test_channel"
  end
end

Rails.application.initialize!

require "minitest/autorun"

class BugTest < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome do |driver_options|
    driver_options.logging_prefs = { browser: "ALL" }
    driver_options.add_argument("--headless=new")
  end

  test "sends logs from the server" do
    # page.driver.browser.logs.get(:browser)
    visit "/test"

    click_button "Broadcast"
    logs = find("#log")
    assert_equal '{"message":"hello"}', logs.value
  end
end

__END__
<html>
<head>
  <script type="importmap">
    {
      "imports": {
        "@rails/actioncable": "https://jspm.dev/@rails/actioncable"
      }
    }
  </script>

  <script type="module">
    import * as ActionCable from "@rails/actioncable"

    ActionCable.logger.enabled = true

    const consumer = ActionCable.createConsumer()

    consumer.subscriptions.create("TestChannel", {
      received(data) {
        document.getElementById("log").value = JSON.stringify(data)
      }
    })
  </script>
</head>
<body>
  <button onclick="fetch('/broadcast')">Broadcast</button>
  <textarea id="log"></textarea>
</body>
</html>
```
田代砲

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の25日目🎄の記事です。

最終日クリスマスはこの記事でやはり締めたいと思う。

# 田代砲

田代砲は、2001年に雑誌「TIME」の「パーソン・オブ・ザ・イヤー」のインターネット投票で、1位を田代まさしにしようとして使われたことからそのツールにこの名前がついた。

田代砲は、インターネット投票でシステム的に大量投稿を行うツールを指す。
現在でいうDoS攻撃そのものでもちろん違法である。
このツールは、2ちゃんねるで「田代祭り」と言われる企画が集まったことが発端となって生まれた。
ツールはインターネット上で配布され、誰でも簡単に利用できるようになっていた。

その祭りが功を奏してMasashi Tashiroはぶっちぎりの1位の票を集めたが、インターネット投票はあくまで参考値という前提だったので、実際に田代まさしがパーソン・オブ・ザ・イヤーになることはなかった。

# その後の影響

その後もポケモンやイナズマイレブンの人気投票でも同様にイタズラが行われ、一番人気のないマイナーなキャラがぶっちぎりで優勝するという事態が相次ぎ、運営も当初「1位のキャラをグッズ化」と明言していたのに、「全員をグッズ化」に方針を変更するなど対応に追われた。

現在ではこの対策が行われ、同じIPの一定時間の投票は１票としかカウントしないなどの対応をとっている。
しかしながら、それはそれで同じイントラ拠点にいる複数人の投票が１票になってしまうため、正しい投票とは言えなくなってしまう。
匿名のお手軽投票はしにくくなるが、何かのアカウントに基づいた投票にするか、reCAPTHAなどを導入するのが賢明であろう。

# 犯罪行為ではあるが

こういった行為は不正アクセス防止法違反で犯罪ではあるが、誰かに大損害をおわせているわけでもなく、誰かの利益のためにやっているわけでもなく、ただのジョークでやったという点を私は評価したい。

ただのジョークでなんの得にもならないのに、ツールを開発し、みんなに頒布し、祭りをせっせと盛り上げる、そんな馬鹿馬鹿しいことに全力を使えるギークが私は嫌いではない。

メリークリスマス。
ORANGE pico で ASCIIART (マンデルブロ集合)

[ORANGE pico](http://www.picosoft.co.jp/orange/) で [Retro PC Gallery](http://haserin09.la.coocan.jp/asciiart.html) に掲載されているプログラムを~~パクり~~移植し、マンデルブロ集合の描画を行ってみた。

# プログラム

```
10 tcolor=rgb(255,255,255)
20 mptr 0
30 mdata 64,160,160,224,160,160,64,0,64,192,64,64,64,64,224,0,64,160,32,64,64,128,224,0,64,160,32,64,32,160
40 mdata 64,0,32,96,160,160,224,32,32,0,224,128,192,160,32,160,64,0,64,160,128,192,160,160,64,0,224,160,32,64
50 mdata 64,64,64,0,64,160,160,64,160,160,64,0,64,160,160,96,32,160,64,0,64,160,160,160,224,160,160,0,192,160
60 mdata 160,192,160,160,192,0,64,160,128,128,128,160,64,0,192,160,160,160,160,160,192,0,224,128,128,192,128,128,224,0
70 mdata 224,128,128,192,128,128,128,0,0,0,0,0,0,0,0,0
80 cls
90 for y=-12 to 12
100 for x=-39 to 39
110 ca!=x*0.0458
120 cb!=y*0.08333
130 a!=ca!
140 b!=cb!
150 for i=0 to 15
160 t!=a!*a!-b!*b!+ca!
170 b!=2*a!*b!+cb!
180 a!=t!
190 if a!*a!+b!*b!>4.0 then break for
200 next
210 gput 4*(x+39),8*(y+12),8,8*i,tcolor
220 next
230 next
240 if inkey()=0 then goto 240
```

オリジナルのプログラムと比べて、ORANGE pico で動かすため以下の変更を加えている。

* ASCIIART では横幅約80文字の表示が要求されるが、ORANGE pico のテキスト画面は横幅40文字しかないので、[美咲フォント](https://littlelimit.net/misaki.htm) (美咲ゴシック第2) の半角文字をグラフィック画面に描画することで横幅80文字の描画を実現した。
* ASCIIART のプログラムでは通常の変数に実数が格納できることを仮定しているが、ORANGE pico の通常の変数は整数しか格納できないので、`!` を追加して浮動小数点数を扱えるようにした。
* ORANGE pico では浮動小数点数を整数 `4` と比較すると Type mismatch エラーが出てしまうので、浮動小数点数 `4.0` との比較にした。
* ASCIIART のプログラムでは `GOTO` を用いて `FOR` のループから脱出しているが、ORANGE pico でこれを行なうと `for` と `next` の対応関係が崩れて誤動作の原因になるので、`break for` に置き換えた。
* 文字の出力処理を変更した。空白 (0-origin で 16番目) を含むフォントデータを数値順に連続して並べることで、条件分岐なしで描画できるようにした。
* 「OK」に邪魔されずに出力結果を見られるよう、最後にキー入力の待機を追加した。

# 実行結果

![ORANGE pico でマンデルブロ集合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/f4e785fe-5098-901e-90aa-15007a05aefb.png)

約5秒で描画が完了した。

# おまけ：for～next の対応関係の破壊

`next` を実行せずに `for` を実行し続ける、以下のプログラムを実行する。

```
10 cnt=0
20 for i=1 to 5
30 print cnt
40 cnt=cnt+1
50 goto 20
```

すると、「471」の出力に続いて「Out of memory in 20」が出て出力が止まった。

続けてもう一度実行すると、数値の出力はされず、すぐに「Out of memory in 20」が出た。
一旦 `new` を実行し、プログラムを入力し直して実行しても、すぐに「Out of memory in 20」が出る状況は変わらなかった。

逆にエラーが出るまで `for` なしで `next` を実行し続けることによる復帰を試みたが、効果はみられなかった。

```
10 next
20 goto 10
```

このプログラムを実行すると「NEXT without FOR in 10」と表示されるが、その後先ほどのプログラムを実行すると、かわらず数値は出力されずに「Out of memory in 20」が出た。

`?rnd(0)` などによるリセットを行えば復帰できるようだが、今回はリセットせずに復帰する方法を見つけることはできなかった。
【UEFN】ビジュアルエフェクトパワーアップをVerseで扱ってみる

## 背景
自作で制作した特殊能力を視覚的にわかりやすくしたかったのでビジュアルエフェクトを付けたかったので調査しました。

## やること
トリガーを押したらエフェクトを付与すること

### 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/b1U_DWIp2-Q?si=YZkYkfyaEQduuehb" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 実装
### 利用するDevice
#### トリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/f74de02f-5e42-99ff-0c77-530fe97c50bc.png)
#### ビジュアルエフェクトパワーアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/8748d08c-434a-6616-fa8b-e207ed6df25a.png)
設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/6bc8c893-541e-b566-74ea-3867f56c283a.png)
赤線で囲んだところでエフェクトのデザインができる感じでした。今回はくっきりとした水色のアウトラインが出るようにしました。


### 全体コード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

visual_effect_powerup_controller_device := class(creative_device):

    @editable
    VisualEffect:visual_effect_powerup_device=visual_effect_powerup_device{}

    @editable
    Trigger:trigger_device=trigger_device{}

    OnBegin<override>()<suspends>:void=
        Trigger.TriggeredEvent.Subscribe(OnIntaractable)

    OnIntaractable(QAgent : ?agent):void=
        if (Agent := QAgent?):
            VisualEffect.Pickup(Agent)
```

トリガーを押して``agent``を取得して``VisualEffect.Pickup()``の引数に入れるだけで指定のプレイヤーに付与できる感じでした。

## まとめ
こちらもとても簡単に実装できました！簡単にビジュアルエフェクトを付与できるので、片手間で見た目を良くしたいときにとりあえず使えそうです！！

本日をもって2023年アドベントカレンダー25日連続投稿が終わりました。達成感がすごい、、、

最後の方はかなりギリギリに書いたので質が落ちちゃったのが反省になります。

来年はやめておこうかなｗ

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/MehcNhyxdq
Storybookでネストされたコンポーネントの並び順が変わらなかった理由

Storybookでのコンポーネントの表示順は基本的にはアルファベット順になります。
ただ、`h2`や`h3`をそれぞれコンポーネントで作成した場合は、タグのレベル順に並び替えた方がわかりやすいと思います。

公式書き方を参考にしましたが、少しハマったのでメモとして残します！

https://storybook.js.org/docs/7.4/writing-stories/naming-components-and-hierarchy

## 並び順が変わらないのは`title`を指定がなかったことだった…

いくつか考えられる理由はあるのですが、**一番先に確認してもらいたいのはstoriesファイルに`title`を指定しているか**です。

私の書いていたコードは指定せずにお任せ状態でしたので`title`を追加したところ表示順が変わりました！

```diff_javascript
const meta = {
+  title: 'Components/Heading/SecondaryHeading',
  component: SecondaryHeading,
  argTypes: {
    children: { control: 'text' },
  },
} satisfies Meta<typeof SecondaryHeading>
```

preview.jsには下記のように追加します。

```diff_javascript
const preview = {
  ...,
  parameters: {
+    options: {
+      storySort: {
+        order: [
+          [
+            'Heading',
+            ['SecondaryHeading', '＊', '＊'],
+          ],
+       ],
+      },
+    },
  },
}
```

Headingの一つ下の階層に並び替えをかけたいのでHeading全体を`[]`で囲んで指定します。



## その他並び順が変わらない原因
私は最初に下記の点を疑いました。

- 正しい設定ファイル（.storybook/preview.js）に記述されているか
- ストーリー名が不一致になっていないか（小文字と大文字は区別されます）
- Storybookのバージョンは大丈夫か
- 古いキャッシュが残っていないか

Storybookのバージョンは公式サイト左上あたりにあるバージョン選択する箇所から対応のバージョンのリファレンスを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/1e59649c-c7b6-dbeb-3a82-02ce7488e43f.png)


Storybookのキャッシュが古い設定を保持している場合があるようです。
Storybookを再起動するか、`node_modules/.cache` ディレクトリを削除してから再試行すれば良いみたいです。

## まとめ
`title`を明示的に指定しなくてもディレクトリ構造でよしなにStorybookは表示してくれます。

:::note alert
それに甘えていた結果今回ハマってしまいました…。
:::

並び替えたいコンポーネントだけ指定することでも並び替えは可能ですが、コード全体の一貫性がなくなるので全てのstoriesファイルに`title`を指定しておくのが良いと考えます。

また、3階層目を並び替えたい場合は拡張機能を利用する必要がありそうです。

https://storybook.js.org/addons/storybook-multilevel-sort
【非エンジニア向け】SlackのスタンプリアクションをトリガーにNotionデータベースへレコードを追加する方法（Zapier使用）

## はじめに
Slackの投稿を忘れないように、どこか別の場所へ溜めておきたいことはありませんか？
今回はSlack・Notion・Zapierを使用し、Slack投稿へスタンプを押したら、Notionのデータベースへレコードを追加する方法を記載します。

SlackとNotionを下準備に使い、本番設定のワークフローはZapierで組んでいきます。
※Zapierとは、様々なWebサービスやアプリ（例えばGmailやSlack、Googleスプレッドシートなど）を連携し、ノーコードで自動化できるアメリカ発のサービスです。例えば「スプレッドシートの内容が更新されたらSlackでメッセージを送信する」といったワークフローを、プログラミングの知識がなくても実装することができます。


## 実現したいこと
- Slackで特定の投稿へ、特定のスタンプを押す（リアクションする）
- 上記をトリガーにしてNotionのテーブルに1レコードが追加される


### 実現のためのステップ

#### 事前準備

SlackとNotionにそれぞれ下準備をします。
Slackにはスタンプ、Notionにはデータベースを用意しておきます。

1.Slackに特定のスタンプを予め登録しておきます。
今回は```カイゼンコーポ```というスタンプを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/51f00a50-cc66-9784-318f-35c5b91414fb.png)
※時間の都合上、スタンプの登録方法は省略してます。

2.続いて、Notionには受け皿となるデータベースを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/a7d3d2e5-43ad-e61a-6f2b-2c58b757ac25.png)
※テストのため極力シンプルなデータベースにしてます。

#### Zapierの設定

ここまででトリガーとなるSlack、受け皿となるNotionの準備が整いました。
続いて、Zapierの設定に移ります。

Zapierで今回使用するのは下記の2つのアクションです。
1. New Reaction Added in Slack
2. Create Database item in Notion

Slackでの新しいリアクションをトリガーに、Notionのデータベースへ1アイテム（レコード）が追加される。やりたいことそのままですね。笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/72af929a-70a5-0338-ec75-f6c40434c753.png)

##### 1.New Reaction Added in Slack
Accountまでの基本設定を行った後、Reactionで特定のスタンプを選択します。
Channel・Userで特定のチャンネルやユーザがリアクションした時に限定することも可能です。（今回は指定しないので空欄にしています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/10a0e8b0-4dd3-341e-5daa-36c9aa60d69c.png)

##### 2.Create Database item in Notion
Slackと同様Accountまでの基本設定を行った後、Actionにてレコードを追加するデータベースを選択します。

データベースを選択すると、対象データベースが読み込まれカラム名が表示されます。

すべてのカラムが読み込まれていますが、今回は「名前」と「コメント」カラムを使います。

「名前」にはSlack投稿の文字列（Messaging Text）をそのまま挿入するようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/0f2d9352-188b-8082-9238-6405840fd40a.png)

「コメント」にはSlack投稿を見つけやすいように、投稿のURLを挿入するようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/62c2fbe1-3523-3726-5b02-281db6658c2b.png)

テストをしつつ、これにて基本設定は完了です。

### Slack投稿にスタンプを押してみる

Slack投稿に```カイゼンコーポ```スタンプを押してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/51f00a50-cc66-9784-318f-35c5b91414fb.png)

Notionのデータベース内にある「名前」にSlack投稿のテキストが、「コメント」にURLが挿入されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627761/9d83a6ff-c82d-49ed-d671-9384f8df24d4.png)


## おわりに
Slackでの重要な投稿を振り返って探すのが大変。
忘れないうちにデータベースへ登録し、ナレッジやタスクとして蓄積しておくために使っている機能のご紹介でした。
インフラエンジニアでなくても頭の片隅に置いておきたい、AWS CloudFrontの設定で要注意なこと

**この記事で伝えたいこと**


会員登録のあるサイトでは、CloudFrontのキャッシュポリシーは「Caching Disabled」にすること。さもないとユーザ間でセッション情報が共有されてしまう可能性がある。この問題が見つかった時に検索してもなかなか情報にたどり着かなかったので書き残しておきます。

※解決された方は筆者ではありません。（筆者はAWSについては全く詳しくないです）






# 経緯
Laravelによる新規ECサイト開発の中盤で発覚。テスト環境を複数人が操作していた時に、カートの中身がいつの間にか変わっている現象がたまに起こりました。カートの中身だけでなく、マイページで情報を参照したら他人のアカウントでいつの間にかログインしていることになっていました。どうやら複数人で同時にAuthを同じルートで参照することで後にアクセスした人がその前にアクセスした人のユーザ情報を参照してしまうようでした。

# 解決
結局は最初に書いたようにCloudFrontのキャッシュポリシーの初期設定が「Caching Disabled」になっていなかったことで意図せずユーザ情報をキャッシュしてしまっていたことが原因でした。が、答えにたどり着くまで2週間強もの間、・Authの呼び出し方が悪いのかも　・Routeの設定が悪いのかも　とLaravelのロジック側の問題ではないかとも考え既存のコードの修正を何回も行い、またはAWSのセッション管理の設定が悪いのではとRedisに切り替えなどで先輩のエンジニアたちが時間を溶かしました。なぜセッションが共有されてしまうのか、検索しても答えにたどり着かなかったのです。

備忘録としてここに記します。**Amazon CloudFront のキャッシュポリシーは「Caching Disabled」にしないと、セッション情報が共有されてしまう場合がある、と。**
VirtualBoxからHyper-Vに乗り換えてちょっと感動した話

## はじめに
　私は、日頃から仮想マシンにHyper-Vを愛用していますが、以前はVirtualBoxを利用していました。VirtualBoxからHyper-Vに乗り換えたときの感動を記事にしたいと思います。

## VirtualBoxとHyper-Vの違い
　はじめに、私も結構素人なので、間違っていたら指摘していただけたらと思います。VirtualBoxはホスト型といって、仮想化を実現するアプリケーションソフトウェア（応用ソフトウェア）をOSにインストールするタイプになっています。それに対して、Hyper-Vはハイパーバイザー型といってOSの機能の中にある仮想化を実現する仕組みを利用するタイプになっています。なので、初めからOSに組み込まれているハイパーバイザー型の方が高速に動作するということですね。

## Hyper-V速っ！
　そう思いました。WindowsやLinuxのインストールが、VirtualBoxと比べ物にならないぐらい一瞬で終わって、感動しました。また、操作性や安定性にも優れていて、長期間運用しても問題ありませんでした。
![スクリーンショット 2023-12-25 232758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/201448b7-2a16-a2af-7c2f-7ec2824a6f5e.png)
　こういう業務用っぽいウィンドウも結構好きだったりします。

## おわりに
　こんな記事を書きましたが、現在、ProxmoxVEへの移行を検討しています。Proxmoxもハイパーバイザー型なのでパフォーマンスに関しては十分なのですが、まだ検証が足りてないと思っているので、どのような構成で運用しようか吟味していきたいと思います。
SwiftUIでAppleWatchのモーションデータを取得する

# はじめに
こんにちは、HappyManaです。
AppleWatchでSwiftでモーションデータを取得する方法はあったのですが、SwiftUIに書き直したかったので、SwiftUIでAppleWatchのモーションデータを取得して表示する処理を書きました。

# コード
```
import SwiftUI
import WatchKit
import CoreMotion

struct GetMotionData: View {
    
    private var motion = CMMotionManager()
    
    @State var roll: Double = 0
    @State var pitch: Double = 0
    @State var yaw: Double = 0
    @State var rotationRateX: Double = 0
    @State var rotationRateY: Double = 0
    @State var rotationRateZ: Double = 0
    @State var gravityX: Double = 0
    @State var gravityY: Double = 0
    @State var gravityZ: Double = 0
    @State var accelerationX: Double = 0
    @State var accelerationY: Double = 0
    @State var accelerationZ: Double = 0

    // 取得を開始
    func startUpdates() {
        if motion.isDeviceMotionAvailable {
            motion.deviceMotionUpdateInterval = 1 / 60
            motion.startDeviceMotionUpdates(to: OperationQueue.current!) { [self] (motionData, error) in
                guard let data = motionData else {
                    print("Device Motion Error: \(String(describing: error))")
                    return
                }

                roll = data.attitude.roll
                pitch = data.attitude.pitch
                yaw = data.attitude.yaw
                rotationRateX = data.rotationRate.x
                rotationRateY = data.rotationRate.y
                rotationRateZ = data.rotationRate.z
                gravityX = data.gravity.x
                gravityY = data.gravity.y
                gravityZ = data.gravity.z
                accelerationX = data.userAcceleration.x
                accelerationY = data.userAcceleration.y
                accelerationZ = data.userAcceleration.z
                
                let motionDataString = "\(roll),\(pitch),\(yaw),\(rotationRateX),\(rotationRateY),\(rotationRateZ),\(gravityX),\(gravityY),\(gravityZ),\(accelerationX),\(accelerationY),\(accelerationZ)"
                print(motionDataString)
            }
        }
    }
    // 取得を終了
    func stopUpdates() {
        if motion.isDeviceMotionAvailable {
            motion.stopDeviceMotionUpdates()
        }
    }

    // view
    var body: some View {
        VStack(spacing: 1) {
            Text("roll: \(roll)")
            Text("pitch: \(pitch)")
            Text("yaw: \(yaw)")
            Text("rotationRateX: \(rotationRateX)")
            Text("rotationRateY: \(rotationRateY)")
            Text("rotationRateZ: \(rotationRateZ)")
            Text("gravityX: \(gravityX)")
            Text("gravityY: \(gravityY)")
            Text("gravityZ: \(gravityZ)")
            Text("accelerationX: \(accelerationX)")
            Text("accelerationY: \(accelerationY)")
            Text("accelerationZ: \(accelerationZ)")
        }
        // 画面が表示されたら取得を開始する
        .onAppear {
            startUpdates()
        }
        // 画面が非表示になったら取得を終了する
        .onDisappear {
            stopUpdates()
        }
    }
}

```
【docker-compose】DB起動時にSQLが実行されない

# 事象
`/docker-entrypoint-initdb.d`にSQLファイルを配置した後、`docker-compose up -d`してDockerコンテナを作成・起動した。<br>
しかし、DBサーバを確認してもテーブル/データが作成されていない。

# 環境
- ローカルPC内でdocker-compose.yamlを用いてDockerコンテナ起動
- DB：PostgreSQL
- docker-compose.yaml内で`volumes:`オプションを用いて`/docker-entrypoint-initdb.d`をマウントし、起動時に実行してほしいDDLを配備してある。

# 解決法：DBサーバ起動時のログを確認する
下記コマンドで、DB起動時のログが出力される。SQL実行時のログも確認できる。
```powershell
docker-compose logs <サービス名(例:db)>
```
サービス名とは、`docker-compose.yaml`の`services:`の次階層に指定している名前のことを指す。<br>
ログでエラーが吐かれている箇所を確認したら、エラー内容に合わせてデータを修正し、再度コンテナを作成すればOK。
```powershell:エラーログ例
psql:/docker-entrypoint-initdb.d/ddl.sql:136: ERROR:  relation "table_name" does not exist
```
自分の場合よくあるエラー原因は、`create table`や`create view`の実行順序の関係だったり、`create table`で作成するテーブルと`insert`するデータのDDLの間でカラムの不整合が生じている事だったりする。<br>
起動時に実行してほしいSQLファイルが複数ファイル存在する場合は、外部参照の都合を考えつつ、SQLファイルのファイル名先頭を実行してほしい順番でナンバリングするようにしている。

# おわりに
ネットで、「初期SQLは文法エラーがあった場合でもログ等に出力されないからDDLとにらめっこして原因を探すしかない」みたいな内容を見かけたので、そう思っている方を救うつもりで書きました。
カンナムスタイル

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の24日目の記事です。

# カンナムスタイルの栄枯

「カンナムスタイル」は、韓国のポップ歌手PSY（サイ）の大ヒット曲で、YouTubeでの再生回数が21億4748万3647回を超えた。
この再生回数は、YouTubeを運営する米グーグルが設定した再生数を記録するカウンターの限界を超えたため、対応を迫られる事態となった。
具体的には、YouTubeのカウンターは32ビット整数で表現されており、プラスの値では21億4748万3647が最大値だった。
しかし、「カンナムスタイル」の再生数があまりに多かったため、グーグルはカウンターを64ビット版に入れ替えるアップグレードを行った。これにより、「9,223,372,036,854,775,808（922京3372兆368億5477万5808）」回までの再生を記録できるようになった。

# カンナムスタイルの盛衰

この事件が、YouTubeのランキングが再生時間に基づくアルゴリズムに変更されるきっかけとなった。
事実、再生時間に基づくランキングに変更した直後、カンナムスタイルのランキングがぶっちぎりの1位からランク外まで落ちることとなった。
Node-REDはBunの夢を見るか?

本稿は [Node-RED Advent Calendar 2023](https://qiita.com/advent-calendar/2023/node-red) の23日目の記事です。

## まえがき

ウェブ・フロントエンド開発の周辺で、昨年2022年後半辺りから、個人的に少しずつ気になっていた、JavaScriptランタイム「Bun」が、今年の秋2023年9月にリリースされました。

先月、11月10日に参加した Node-RED Tokyo Con 2023 in Tokyoでは、また新しい技術の紹介があり、特に気になったのは、エッジデバイスに移植されたMCU版のNode-REDでした。
https://github.com/phoddie/node-red-mcu

少し目を離していたら、MCUに移植？そんな事を考えちゃうの誰？と思って開発者をみたら、Peter Hoddie 氏の名前…なんか覚えがある。
おぉ以前 IoTさわってた頃に目にした、JavaScriptでIoT開発するKinoma Createの人だ！

そう思い出しながら、そうか…Node-REDの移植って考えたこと無かったなぁ。

またその頃、ウェブサイトの制作のためJAMstack周りを思案中で、Bunはインストールして少し試した程度だったけど、いつか近いうちに深掘りしようと思ってた。

JavaScriptランタイムであるNode.jsとBun。

その名のとおりNode.jsで動くNode-REDが、Bunでも動かせるのか。
Node-REDの移植…からそんな妙な興味が湧いてきた。フロントエンド開発界隈でさえ、前のめり感のあるBunの上でNode-REDがうまく作動するのか？そんなトライアルです。

開発環境：Ubuntu 23.10 (Mantic Minotaur), 12MB, 古いAcerデスクトップ Intel i5

（記事執筆中）
完走した感想

# カレンダー全埋めできた感想
くぅ～疲れましたｗ これにて完結です！
実は、ネタでチーム内に参加表明したらよいしょされたのが始まりでした
本当は話のネタなかったのですが
ご好意を無駄にする・・・・

という有名なコピペをまねしたくなるくらいには頑張った感あります。

# 心残り
[折り返し記事](https://qiita.com/yaikawa227/items/03b6d3a084c864e1f39f)にも書いたのですが、
かなり突発で参加するかー、といった感じだったのでまともな記事がほとんど用意できなかったのが心残りです。

ただし、内容はおいておいてとりあえず何かをアウトプットする、という目標は無事に達成できたのでそこはよくやった自分と思ってます。

# 今後について
今後はちゃんと時間をとって技術系の投稿をしていきたいと思います。
個人開発等しつつ困ったことだったり頑張ったことだったりをとりあえずぽんぽんと書いていけるようになればいいかなと思いつつ、チーム内みんな頑張ってカレンダーやりとげた（はず）のもあるので、今後ともみんな何かしらかのアウトプットを続けられるようにチーム内でも励ましあっていければいいなと思います。
気づいたらwindowsもいろいろ変わってた話

# はじめに
windows11を利用しており、最近ちょこちょこ変わったなーと思ったことを書いてみる

# windows copilotが利用できるようになった
win+Cを押すことで画面右側よりニョキニョキっとcopilotが生えてくるようになった。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/3d70d1de-e38a-db4e-eb10-3cb01c615cb5.png" height=40% width=40%>

それにより気軽にcopilotの利用ができるようになり、自分のPCのインストールされてるアプリの一覧等もAIに聞いて回答してもらえるようになりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/aadb0ec7-c0c4-54c7-5485-9fd8dc41c23f.png" height=40% width=40%>

いくつかPCの設定変更などもできるようなので、あの設定項目どこだっけな・・・みたいなものなどがあればcopilotに指示を出して一発で変更、などもできるかもしれないですね。

# ペイントがかなり進化してた
個人的にこれが一番びっくりでした。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/81ab4c40-7097-e28e-410b-36912f66bee1.png" width=70%>

まず何か見た目がおしゃれになってました（小並感）

個人的にかなりいいなと思った機能が、画像の背景を削除して透過画像を作ってくれる機能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/7dce9acd-99a4-1e58-c8ca-5a5dd7c355d7.png" width=70%>

このようにただただかわいい愛猫の写真をペイントに張り付けて**背景の削除**ボタンを一回クリックするだけで下みたいな透過画像が一発でつくれちゃいます

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519878/c6afd0c6-7e8b-212c-abe8-24acd4770247.png" width=70%>

他にもレイヤー機能の追加などが行われており、ちょっとした画像の編集などもできそうな気がします。

windows11以外ではできないことかもしれないですが、windows11をもしご利用でしたらいろいろと触ってみるのも新しい発見に出会えてよいかもしれないです。

# おわりに
あまりwindows自体を気にする機会がなく、油断したらすぐいろいろ変わってたりするので定期的にいろいろ触ってみるのもいいかもしれないですね。
少し前も会社のPCをリプレイスした際にWSL2のインストールが1コマンドで一瞬で終わるようになってたりではえ～すっごいってなったのでwindowsの動向にもアンテナを張っておいていいかもしれないとおもいました。
メンバー側としてのCo-Active for Organizationを受けてみての所感

# はじめに
Co-Active for Organizationとはコーチングの中の一つであり、
上司と部下で協働して成果を出していきましょうといったものです(詳細略)。

2か月ほど前に社内の管理職の方々が研修を受けたみたいで、
別チームの課長より研修の実験台なってくれや！といった感じで面談に誘われました。

# 面談どうだった？
受けてみた印象では割とよくある**なぜなぜ分析**のようなものを一緒にやる形での進行のように感じました。
普段の１：１の面談では固定化された内容に対して順次話していく形で進んでおり、チーム内でも最速で１：１面談を終わらせるものである私はほぼ業務連絡みたいな感じで感じていました。

今回の実験台となった面談では一つのテーマに絞って深く話せるのが大きく違うな、と感じました。
また、面談相手が自分の部署の役職者ではないことがかなり大きいなと感じており、
自部署に対するもやもやなどがかなりすっきり解消したように感じました。

# 今後取り入れるとしたら
自部署の役職者とやるよりは四半期ごとなどに他部署の役職者と実施したほうが、
自分の悩みや部署へのもやもやがより客観的に整理できていいと思います。

自部署の役職者とやるのもいいと思いますが、効果としては他部署の方と実施するほうが大きく感じました。

# さいごに
最近は社内の役職者を中心にマネジメント系をどうにか伸ばそうと頑張ってくれてるように感じます。
マネジメント系も体系的なものを学んだあとに自分の組織に合った形に落とし込むことが大事だと思うので、
自分もチーム単位でのマネジメントなどを学んでみるのも性に合ってるかもしれないと思いました。
見積の精度を上げたかった

# はじめに
業務で案件対応を進める中で、見積の精度ってどうやったら上がるんだろう、という悩みを抱えています。

# よくある対策シリーズ
- 作業の細分化を行い、細かく見積もりましょう
- 類似する作業の実績をもとに算出しましょう

上記2点は良く聞いており、実施しているものの案件によってはどうしても差が大きくなってしまう

# プランニングポーカー
作業の細分化をしたうえで[Hatjitsu](https://hatjitsu.toolforge.org/)のようなものを利用し、
各メンバーが作業毎にどの程度かかりそうか、といった形で数値を示しすり合わせていく手法

実施したものについては高い精度で実施できているように思える。

# 見積がぶれる要因
既存の処理に関する仕様の把握が甘いと作業時に思わぬ工数が発生しがち。
ここについてどうしたものかと悩み中。バッファを多めに積むしかないのだろうか・・・

# 今後の対応
既存処理に関しての対応ももっと細かく細分化したうえでの見積を実施してみようと思う（実際にコード軽く見るくらいをやる）
見積の工数が増えそうなものの、後からお替り方式よりはそちらの方が健全な気がするので、そういった方針にしたい。

見積の精度については一生ついて回る問題だと思っているので早めにこのあたりのスキルを延ばしたいところ
懐かしき日のおもひでぽろり

# はじめに
カレンダーの題材をおもひでぽろぽろにしてるので今の所属会社での印象深い開発関連の話を振り返ってみる

# 音声入力系のシステムで音声に合わせた波形を表示する
canvasを利用しつつ、入力音声に合わせて波形を表示するようなものを作成していました。
最初はフーリエ変換とかいるのか・・・？となりつつ何かいい方法がないか調べてみたら
web audio apiとかでできそうだったのでやっほーいとなった記憶があります。
やっぱり目で見て楽しめるものを作成できるのが開発してる上では楽しいですね

```javascript:過去に書いたコードの一部
  function draw() {
    const barWidth = canvas.width / analyserNode.fftSize;
    const array = new Uint8Array(analyserNode.fftSize);
    analyserNode.getByteTimeDomainData(array);
    drawContext.fillStyle = 'rgba(255, 255, 255, 1)';
    drawContext.fillRect(0, 0, canvas.width, canvas.height);

    for (let i = 0; i < analyserNode.fftSize; ++i) {
      const value = array[i];
      const percent = value / 255;
      const height = canvas.height * percent;
      const offset = canvas.height - height;
      drawContext.fillStyle = 'lime';
      drawContext.fillRect(i * barWidth, offset, barWidth, 2);
    }
    requestAnimationFrame(draw);
  }
```

# 振り返ってみて
最近作るシステムではあまりこういった形で動きのあるものを作る機会がなかなかない状態ですが、
目で見て楽しいシステムのようなものも作ってみたいので個人開発等でそのあたりに挑戦していけたらいいなと思います。
学科試験内容をみてみた

# はじめに
webデザイン技能検定の学科試験でどのような出題がされるかをざっくりまとめてみる。
軽く過去問に目を通してみての所感等の備忘です。

# 3級の学科試験
〇✖問題が10問と4択問題が15問の構成

カラーコードの問題で「color: #ff0000;」を指定すると文字色は青になる(〇か✖か)、みたいな問題がでている回もあったりで、普段コードの値を気にせず拡張機能に頼っている私はお祈り鉛筆するしかないパターンが出てくるかも

運転免許の学科試験みたいに~~性格悪そうな人が考えたような~~回りくどい聞き方はないのでシンプルに知識バトルしようぜ！といった内容になりそう

〇〇ガイドラインより◇◇は▽▽である、みたいなパターンもあったりするので、割と真面目に勉強しないとポロポロ得点落として涙ぽろぽろしちゃいそう

4択問題でもCSSのコメント形式は次のうちどれか、等がありCtrl＋/ のショートカットでコメントアウトするマンからすると、あれ？どれだっけってなったりすることもありそう

CSSのプロパティやHTMLの要素の問題も多くあるのでここでも基礎的な知識が求められそう。


# 2級の学科試験
〇✖問題が15問と4択問題が25問の構成

傾向的には3級と同じだが、サーバ証明書の話や無線LANの暗号化方式の話も問題として出てくる
SQLインジェクション対策の話や、Cookieの話、HTTPのレスポンスコードの話などもあり、割とシステムよりな話が出てくる~~webデザインってシステム構成的な意味でのデザインなの・・・？~~

お問い合わせフォームを設計する際に配慮すべき点として最も適切なものを、以下より1つ選択しなさい。や、ターゲットユーザになったつもりで評価対象のウェブサイトを操作することによって、様々な問題点を指摘する、ユーザビリティの評価手法は何か。最も適切なものを以下より1つ選択しなさい。
等のデザイン的な話の問題も出てくる

# 全体を通してみて
実技試験より学科試験の方が合格率低いんじゃないかな、といった気がした。
求めてたデザインに関する知識ではないが基本情報的なにほひを感じるテストな気がするので、
復習もかねて2級の学科試験対策をしていく形でお勉強してみようと思いました。
実技試験内容を見てみた

# はじめに
webデザイン技能検定の実技試験でどのような出題がされるかをざっくりまとめてみる。
軽く過去問に目を通してみての所感等の備忘です。

# 3級の実技試験
3級は超基本的なHTMLやCSS等への理解が多そう。
既存のファイルに対してリンクの不備を正したり、CSSで文字の中央寄せ等を行う程度の出題。
ある程度の知識があれば特に手が止まることなく問題の指示通りの修正ができるかと思う。
新人に対してこれやってみてレベルで依頼をする際のレベルくらいに思う

# 2級の実技試験
部品の作成等が出てくる。
拡張子を指定した画像パーツの作成等があり、利用できるツールにphotoshop等が入っているあたり、
そのあたりの操作知識も求められそう~~photoshopとか使ったことないから割と絶望かも~~

アニメーションバナーの作成等もあり、webシステムというよりはwebページの作成に重きを置いた内容になってそう？
パーツの作成を経て指定されたデザインでページの作成を行う感じの流れになっていたりもするので、
画像作成やバナー作成できなければ雪だるま式に失点しそう。
そのあたりを学習して対応できるようになればそこまで難しくはなさそう

# 全体を通してみて
実技試験はネット利用不可な状態でやるのでシンプルに基本的なCSSやJSの記述がある程度求められそう。
ただし、UI/UX等の専門的な知識はあまり必要なさそうで、基本的に指示された内容の実装ができるか、といった内容になっているように思える。

どちらかといえば実技は最低限これくらいはできるよね、の確認がメインになっていそうだなと思いました。
webデザイン技能検定ってなんなの？

# はじめに
[以前の記事](https://qiita.com/yaikawa227/items/202836adc76c20e592c8)でwebデザイン技能検定なるものについて触れたものの内容的にどうなの？と思ったので過去問等に触れてみた。

# どんな内容？
名前の割にデザイン技能以外の設問も多そうです。
インターネットの仕組み等の基本情報に出そうな問題から、JISやISO等他の標準規格・関連規格の動向だったりも出るようです。
他にも産業財産権や著作権等の法務ネタも出たりします。

デザインに関するものではインフォメーションデザインやインタフェースデザイン、ユーザビリティ等の学びたかったやつも出るようです。

上記は筆記試験で、実技試験もあるようです。

# おわりに
ちょうど本日(12/25)から試験の申込が始まっているので、2級・3級の過去問を見つつ、試験日までに取得できそうな方にも仕込みをしようとおもいます。
高校生におすすめのVPSはこれや！

## はじめに
　結論から申し上げますと、**ConoHaのVPS**です。その理由を現役高校生の私が解説していきます。

## 理由１：安い！
　価格が安いことは高校生にとってメリットしかないと思います。一番安いプラン（1Core, 512MB）だと、一年間の契約で３２１円しかかかりません。（２０２３年１２月２５日時点の価格）他社よりも安いのに、コントロールパネルの操作性はピカイチですし、何かあったときのサポートも充実しています。

## 理由２：クレジットカード不要！
　クレジットカードを作成できない高校生にとって、クレジットカード必須のサービスは利用することができません。ですが、**ConoHaチャージ**という機能を利用することで、コンビニなどから前払いして利用できます。

## 理由３：クーポンがもらえる！
　少ししか使わないのに、一か月も契約するなんてことはありません。登録時に500円分のクーポンがもらえたり、誕生日に500円分のクーポンがもらえたたりします。また、紹介制度を利用すれば、紹介した側も紹介された側もクーポンがもらえます。

## おわりに
　私も現在、ConoHaのVPSを利用しています。また、ConoHaのVPSは最近リニュアルされてGPUサーバーも利用できるようになったみたいなので、AIなどの開発をしたい方におすすめだと思います。
Stimulusの使い方簡単まとめ

# はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー24日目です。

自分なりに整理するために、Stimulusの使い始め方についてまとめておきます。

# Stimulusとは

Stimulusは、JavaScriptフレームワークでです。Webページに富んだインタラクティブな機能を簡単に追加できます。Railsによって開発されたこのフレームワークは、DOM要素とJavaScriptオブジェクトを「コントローラ」として結びつけることで、ユーザーインターフェースの振る舞いを容易に管理します。StimulusはHTMLマークアップ内で独自の属性を使用し、JavaScriptのコードを宣言的に適用します。これにより、クリーンで保守しやすいコードを書くことが可能になり、特にRailsアプリケーションにおいて効果を発揮します。Stimulusは、非同期通信、フォーム処理、アニメーションなどの複雑なUIの操作を容易に実現できるため、フロントエンド開発の生産性を高めます。

# Stimulusの使い方
Stimulusを使用してRails7アプリケーションにインタラクティブな要素を追加する例を紹介します。

ボタンをクリックするとテキストが変わるシンプルな機能を作成します。

### Step1 Railsアプリの準備

Rails7で、新規アプリを作ります。`rails new`してください。
Rails7では、esbuildを使用している場合、Stimulusはデフォルトで含まれています。

### Step2 Stimulusコントローラの作成
app/javascript/controllersディレクトリに新しいStimulusコントローラを作成します。例えばexample_controller.jsという名前でファイルを作成します。

```javascript:app/javascript/controllers/example_contoller.js
// app/javascript/controllers/example_controller.js
import { Controller } from "stimulus"

export default class extends Controller {
  static targets = ["output"]

  changeText() {
    this.outputTarget.textContent = "テキストが変更されました！"
  }
}
```

このコードにおける`static targets = ["output"]`は、コントローラが操作するDOM要素を指定します。`changeText`メソッドは、ボタンがクリックされたときに実行されるアクションです。

このメソッド名はなんでも良く、後でこのメソッドの名称をHTMLに直接書くことになります。

### Step3 ビューを編集
Stimulusコントローラをビューに統合します。例えば`app/views/home/index.html.erb`に以下のように記述します。

```erb:index.html.erb
<div data-controller="example">
  <button data-action="click->example#changeText">テキストを変更</button>
  <p data-example-target="output">ここが変わります</p>
</div>
```

`<p data-example-target="output">`とある部分が、Stimulusのコントローラにある`static targets = ["output"]`と対応しています。ここが、操作を行うDOMの紐付けです。

また、`<button data-action="click->example#changeText">テキストを変更</button>`の部分で、「クリックしたらexample_controller.jsにあるchangeTextが動く」ということを指定します。

# Stimulusの使い道
Stimulusは、以下のような用途で使用することが考えられます。Turboと組み合わせてさまざまなことに使えます。もっと応用的な使い方もあるかもしれません。今後さらに便利な使い方を見つけていきたいです。

**フォームのリアルタイムバリデーション**
ユーザーがフォームに入力すると、その場で入力内容の検証を行い、フィードバックを提供します。

**非同期によるモーダルウィンドウの表示**
サーバーからデータを非同期で取得し、モーダルウィンドウ内に表示します。例えば、ユーザーの詳細情報や画像ギャラリーなどです。

**ドロップダウンメニューの動的制御**
クリックやマウスオーバーによってドロップダウンメニューを表示・非表示します。

**トースト通知**
サーバーからのレスポンスやユーザーのアクションに基づいて、画面の一部に短い通知メッセージを表示します。

**無限スクロール**
ユーザーがページの下部に到達すると、自動的に追加のコンテンツを読み込みます。

**タブ切り替え**
ページ内の異なるセクション間でのタブベースのナビゲーションを実現します。

**スライダーやカルーセル**
画像やコンテンツのスライダーを操作して、様々なアイテムを表示します。

**自動補完機能**
ユーザーがフォームフィールドにタイプすると、関連する提案がリアルタイムで表示されます。

**インタラクティブなチャートやグラフ**
データの視覚化に役立つ、インタラクティブなチャートやグラフを表示します。

**アコーディオンメニュー**
クリックでセクションを展開・縮小し、コンテンツを表示・非表示にします。
はまちちゃん事件

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の23日目の記事です。

# はまちちゃん事件

「はまちちゃん事件」とは、2005年に大手SNS「mixi」で発生した現象である。この事件では、多数のユーザーが「ぼくははまちちゃん！」というタイトルの日記を次々と公開するという事態が発生した。そのきっかけは、あるユーザーが投稿した日記で、その日記の本文には「こんにちはこんにちは!!」という言葉とともに特定のURLが貼り付けられていた。

この現象の原因は、Webアプリケーションの脆弱性の一種である「クロスサイトリクエストフォージェリ（Cross Site Request Forgeries：CSRF）」によるものだ。
この脆弱性は、正規ユーザーの操作で意図しない結果を引き起こす。
具体的には、ユーザーが特定のURLをクリックすると、そのユーザーの日記に「ぼくははまちちゃん！」というタイトルで新たな日記が自動的に書き込まれるという現象が発生した。
このURLをクリックしたユーザーも同じ投稿がされ、その投稿にはさらに同じURLが含まれていたため、被害者は連鎖的に広がった。

この事件をきっかけに模倣犯が現れ、あちこちのサイトでCSRFの脆弱性をつくイタズラが横行した。もちろん犯罪だが当時はその認識が薄く、実際この時期にそれで逮捕された人はいないと思われる。

この事件は、Webアプリケーションのセキュリティ問題を一般に広く知らしめるきっかけとなった。

はまちちゃん事件を通じて、Webアプリケーションのセキュリティ対策の重要性が改めて認識されたと言えるだろう。
その4

```
using Reactive.Bindings;
using System;
using System.Windows;

public class SubViewModel
{
    public event EventHandler RequestClose;
    
    // サブ画面が閉じられたことを通知するReactiveProperty
    public ReactiveProperty<bool> IsClosed { get; }

    public SubViewModel()
    {
        // ReactivePropertyを初期化
        IsClosed = new ReactiveProperty<bool>(initialValue: false);
    }

    // サブ画面を閉じる処理
    public void CloseSubWindow()
    {
        // 他の必要な処理があればここに追加

        // ReactivePropertyの値を変更して閉じられたことを通知
        IsClosed.Value = true;

        // ViewModelがUIの閉じる操作を通知
        RequestClose?.Invoke(this, EventArgs.Empty);
    }
}
```
```
public partial class SubWindow : Window
{
    private readonly SubViewModel _viewModel;

    public SubWindow()
    {
        InitializeComponent();
        _viewModel = new SubViewModel();
        DataContext = _viewModel;

        // ViewModelからの通知を購読
        _viewModel.RequestClose += (sender, e) => Close();
    }
}
```
```
using Reactive.Bindings;
using System;

public class MainWindowViewModel
{
    // サブ画面のViewModel
    private readonly SubViewModel _subViewModel;

    // サブ画面が閉じられたことを通知するReactiveProperty
    public ReadOnlyReactiveProperty<bool> SubWindowClosed { get; }

    public MainWindowViewModel()
    {
        // サブ画面のViewModelを初期化
        _subViewModel = new SubViewModel();

        // サブ画面が閉じられたことを通知するReactivePropertyを公開
        SubWindowClosed = _subViewModel.IsClosed.ToReadOnlyReactiveProperty();

        // SubWindowClosedが変更されたときの処理をSubscribeで登録
        SubWindowClosed.Subscribe(isClosed =>
        {
            if (isClosed)
            {
                // サブ画面が閉じられたときの処理をここに追加
                Console.WriteLine("サブ画面が閉じられました。");
            }
        });
    }
}

```
Raspberry Pi 400 日本語キーボードバージョンを色々触ってみた際の備忘メモ

Raspberry Pi 400 日本語キーボードバージョンを色々触ってみた際の備忘メモ

## Raspberry Pi 400 日本語キーボードバージョン

Raspberry Piとキーボードが合体している（キーボードの中にRaspberry Piが入っているらしい、未分解）
- Processor: Broadcom BCM2711 quad-core Cortex-A72 (ARM v8)
- RAM: 4GB LPDDR4-3200
- 約15000円(2023/6時点)

[Raspberry Pi 400 日本語キーボードバージョン](https://www.amazon.co.jp/RaspberryPi-Raspberry-Pi-400-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3/dp/B09R6H27JY/ref=sr_1_6?keywords=raspberry+pi+%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89&qid=1687278975&sr=8-6)

![スクリーンショット 2023-06-24 10.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/b05086e0-13dc-885d-7cf2-500801a0be47.png)


## LED ON（Lチカ）

GND,GPIO14にLEDをつないで以下コマンドを実行

```
echo 14 > /sys/class/gpio/export # GPIO14を有効化
echo out > /sys/class/gpio/gpio14/direction # 出力ポートにする
echo 1 > /sys/class/gpio/gpio14/value # GPIO14をON
```

LEDがチカりと点灯すればOK

#### （注意）i2cをする場合はi2cをenableにしておく

以下のようにする

https://qiita.com/dz_/items/ead14b05879c9acc3507

```
$ i2cdetect -y 1
Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory
```

```
sudo raspi-config
```

3 Interface Options --> I2C をenabledにする
これでI2Cのデバイスが見つかります

```
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --
```

## 環境センサをNodeREDで利用

環境センサ: 「M5Stack用温湿度気圧センサユニット Ver.3（ENV Ⅲ）」
https://fabcross.jp/news/2021/20210818_switchsciense_m5stacki2cenvsensor.html

(抜粋)
- 温度／湿度／気圧の測定ができる
- 寸法が24.2×32.2×8.1mmで重量5g
- Grove互換ケーブル1本が付属し、単価は913円（税込）


## `node-red-contrib-sht` ノードのインストール

ハンバーガー、パレットの管理、ノードの追加から`node-red-contrib-sht`を選択して追加

## `chart/gauge` グラフ作成
https://docs.plathome.co.jp/docs/openblocks/fw4/tutorial/mqtt/check/#フローの作成

## `node-red-dashboard` ノードのインストール

ハンバーガー、パレットの管理、ノードの追加から`node-red-dashboard`を選択して追加

https://qiita.com/takeyan/items/fff5e8d64da25220a0c0

## ダッシュボードのレイアウト変更
https://ameblo.jp/gameprograming/entry-12734501051.html

グラフ表示例

![dashboard_takada.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/954d2161-00b6-baa5-74a5-9c57e20a21e9.png)

## 値に応じて不快度を計算してどこかに通知
http POST/GETリクエスト
https://qiita.com/wataash/items/72b49509c3964294dd67
https://qiita.com/youtoy/items/0bfce1a022c716573f32

例えばNodeREDに出力する場合は以下

https://ameblo.jp/gameprograming/entry-12638982979.html
> あとは小数点以下の桁が多すぎるのが気になるので整えます。
ここはfunctionノードを使います。
changeノードの後ろにfunctionノードを入れます。
参考記事のとおり入力しますが、私は小数点第1位までの表示としました。

# まとめ

LチカとNodeREDを使っただけのメモでしたが、他にも色々できそうな気がしています

# 参考

https://confrage.jp/node-red%E3%81%A7http-request%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A7api%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/max
リモートデスクトップのプロトコルは○○○に限ると思う

## はじめに
　私は、日常的にリモートデスクトップを利用しています。その中で、思うことがあります。「RDPええやん！」と。なのでその魅力について記事にしたいと思います。

## なぜRDPなのか？
　それは、レスポンスがよいからです。これは、リモートデスクトップをする上でとても重要だと思います。リモートデスクトップ接続で作業しているのに、手元のパソコンで作業しているような状態が一番理想ですよね。
　また、クリップボードの共有、ドライブやプリンターのリダイレクト機能があることも良きと思う点です。

## VNCじゃダメなのか？
　Linuxの場合は、RDPよりもVNCの方が優れていると思います。XRDPを導入してもレスポンスがよくないことがよくあります。

## おわりに
　これからもRDPを愛用していこうと思います。また、ApacheGuacamoleなどの環境構築も勉強していきたいと思います。
WinMX

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の22日目の記事です。

# Winny以前に流行ったWinMX

映画化もしたので **Winny** は最近の人でもどんなものか知ることになったのではないかと思うが、 **WinMX** がWinny以前に一世を風靡していたことはご存知だろうか。

WinMXは、2001年にFrontcode Technologiesが開発したファイル共有ソフトである。
Napster互換のプロトコルを利用した中央サーバ型のファイル交換機能と、独自プロトコルを利用したサーバに頼らないピュアP2P型ネットワーク機能の両方を併せ持つ。
Windows 98以降のWindowsで動作し、2バイトコードを扱えることから日本では利用者が多かった。

Winny同様に音楽や、映画などの違法なコンテンツがやりとりされた。といっても、当時はこんなソフト使わなくてもYahooで検索したら出てくるくらいにインターネットの世界はザルではあった。
私は当時大学生であったが、学内のネットワークで常時WinMXを起動していたものがいたらしく、そのWinMXが学内ネットワークのパケットを使い果たし、1年に渡り通信が重い状態が続いて問題になったことがある。

その後、WinMXは、2001年11月に著作権侵害をしたとして学生が逮捕され、2005年9月21日にホームページと全WinMXネットワークが閉鎖された。
このWinMXの盛衰により、Winnyの栄枯が始まった。

しかしながら、その後のWinnyの行方は皆様の知るところの通りである。