OmniAICreator/Qiita-1.07M huggingface dataset:
Raku で Welcome to AtCoder を解いてみた

[Qiita Engineer Festa 2024（キータ・エンジニア・フェスタ 2024） - Qiita](https://qiita.com/official-campaigns/engineer-festa/2024)
において、約1ヶ月で38記事という大量の記事の投稿を要求されることがわかった。
そこで、あまりコストをかけずに記事数を稼ぐ方法を考えた結果、「Welcome to AtCoder を様々な言語で解く」ことを思いついた。
単に解くだけでなく、使用する言語仕様の解説を入れれば、記事として一応成立するだろう。

# Welcome to AtCoder

[PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)

Welcome to AtCoder では、以下の形式で整数 $a$, $b$, $c$ および文字列 $s$ が入力として与えられる。

```text
a
b c
s
```

この入力をもとに、与えられた整数の和 $sum = a + b + c$ および文字列 $s$ を、以下の形式で出力することが求められる。

```text
sum s
```

# 今回使用する Raku の機能

[Raku 入門](https://raku.guide/ja/)

## 変数

[3. 変数](https://raku.guide/ja/#_%E5%A4%89%E6%95%B0)

```
my 変数名 = 初期値;
```

のようにして、変数を宣言できる。
変数のうち、スカラ (1個の値を格納する変数) の変数名は `$` ではじめ、配列の変数名は `@` ではじめる。

配列の要素には `[]` を用いてアクセスできる。
配列の最初の要素は0番目である。

```
my @numbers = 42, 72, 102;
my $chihaya = @numbers[1];
```

:::note info
Perl とは異なり、配列の要素にアクセスする際も `$` ではなく `@` を用いる。
:::

## 文字列

[1.7.3. クォート](https://raku.guide/ja/#_%E3%82%AF%E3%82%A9%E3%83%BC%E3%83%88)

文字列は、`""` または `''` で囲うことで表現できる。

## 演算子

[2. 演算子](https://raku.guide/ja/#_%E6%BC%94%E7%AE%97%E5%AD%90)

今回は、以下の演算子を用いた。

|演算子|意味|
|:-:|---|
|`+`|数値の加算|
|`~`|文字列の結合|

## 入出力

[6.1. ターミナルを用いた基本的なI/O](https://raku.guide/ja/#_%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AAio)

以下のように `say` を用いることで、「値」を標準出力に出力し、続いて改行文字を標準出力に出力できる。

```
say 値;
```

`get` を用いると、標準入力から1行読み込み、読み込んだ行を表す文字列 (最後に改行文字はつかない) を取得できる。

```
my $line = get;
```

`get` は、式の中で値のように用いることができる。

```
my $greeting = "Hello, " ~ get;
```

## 数値の文字列への変換

[class Int | Raku Documentation](https://docs.raku.org/type/Int)

数値に対して `Str` メソッドを使用すると、数値を文字列に変換できる。

```
my $value = 72;
my $valuestr = $value.Str;
```

## 文字列の操作

[class Str | Raku Documentation](https://docs.raku.org/type/Str)

文字列に対して `split(区切り)` メソッドを使用すると、文字列を「区切り」(文字列) で区切った列を得ることができる。

```
my $data = "12 34";
my @parts = $data.split(" ");
```

文字列に対して `Int` メソッドを使用すると、その文字列が表す整数に変換できる。

```
my $data = "72";
my $dataint = $data.Int;
```

# 提出コード

```
my $a = get;
my @bc = get.split(" ");
my $sum = $a.Int + @bc[0].Int + @bc[1].Int;
say $sum.Str ~ " " ~ get;
```

[提出 #54593970 - AtCoder Beginners Selection](https://atcoder.jp/contests/abs/submissions/54593970)
AWS Global Accelerator

# はじめに
この記事はAWS SAA試験勉強のための、AWS Global Acceleratorに関する知識のまとめです。

# AWS Global Acceleratorとは

AWSの有するグローバルなインフラネットワークを利用して、ユーザーのトラフィックのパフォーマンスを最大 60％ 向上させるネットワーキングサービス。

# 運用の際の注意点
コストと管理の複雑さについては、事前に十分な計画と評価が必要です。

# エンドポイント
Global AcceleratorのエンドポイントとしてALB、NLB、EC2インスタンス、Elastic IPアドレスを設定できます。
S3やCloudFrontはエンドポイントとして設定できません。

# 固定パブリックIPアドレス


Global Acceleratorは2つの固定パブリックIPアドレスを保有しており、ユーザーはこの固定IPアドレスへアクセスします。エンドポイントが増減してもIPアドレスに影響なくサービスを継続できるため可用性が向上します。
LWC 子コンポーネント 画面読み込み時の処理方法

SalesForceのLWCについて、
親コンポーネントから子コンポーネントを呼び出すときに、親から与えられた引数を条件に子の画面表示を変えるという課題があった。

パッと思いついた方法が以下。
・constructor
・connectedCallback等のcallback
・getter

それぞれで動くのか検証してみた。
検証ではmodalを子コンポーネントとして使用。

```javascript:myModal.js
import { api } from 'lwc';
import LightningModal from 'lightning/modal';
export default class MyModal extends LightningModal {
    @api content;//親コンポーネントから渡された値

    // constructor
    check_const = false;
    constructor() {
      super();
      if( this.content = "test" ){ this.check_const = true; }
    }

    // callback
    check_callback = false;
    connectedCallback() {
      if( this.content = "test" ){ this.check_callback = true; }
    }

    // getter
    get check_getter(){
      if( this.content = "test" ){ return true; }
    }

}
```

```html:myModal.html
<template>
  <lightning-modal-header label="My Modal Heading"></lightning-modal-header>
  <lightning-modal-body>

    <template lwc:if={check_const}>constructor</template>
    <br>
    <template lwc:if={check_callback}>callback</template>
    <br>
    <template lwc:if={check_getter}>getter</template>
  
  </lightning-modal-body>
</template>
```

結果、すべて動作した。

どれが正しいのかは状況によるのだろうが、普通にcallbackを使うのがわかりやすくて良いのではという感想。
Nintendo Switch で突然インターネットに接続できなくなったときのトラブルシューティング

自宅で、Nintendo Switch を使用していたら、突然、インターネットに接続ができなくなりました。
ネットワークの接続状況を見たら、こんな状態でした。
![conect_ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763635/893aa6f8-e188-964b-6bb1-15351fd0b8cc.png)

今回は、復旧までのトラブルシューティングを説明していきます。

# 問題箇所の切り分け
まずは、どこに問題があるのかを切り分けます。
1. 自宅のネットワーク環境に問題はあるか？
スマホやPCのブラウザを立ち上げ、インターネットに接続できているのかを確認します。表示するサイトによっては、ブラウザキャッシュが働いている可能性があるため、ニュースなど今まで表示したことがないサイトが表示されるかを確認しましょう。
1. 自宅で契約しているサービスプロバイダー（ISP）でネットワーク障害が発生していないかを確認する
1. Nintendoの公式サイトでネットワーク障害が発生していないかを確認する

上記のどれにも当てはまらない場合、端末の問題の可能性が大きいです。

# 端末本体のネットワーク設定状況を確認する
ここまで分かったことは次の通り。
・上記の図より、端末本体からAP（アクセスポイント）までは接続が出来ている
・APからインターネット（ここでは Nintendoのサーバーと考えられる）に接続が出来ない
・Nintendoの公式サイトでネットワーク障害は発生していない

このことから、ネットワークの接続問題でよくある事例として、DNSによる名前解決ができない可能性を考えました。端末本体のネットワークの設定で、DNSの手動設定について調べてみると、Nintendoの公式サイトに手動設定方法についての記載がありました。[DNSの設定・確認方法](https://support.nintendo.co.jp/euf/assets/themes/nintendo/support/errorcode/notification/3ds_dns.html)
このサイトを見ながら、DNSの手動設定を行ったところ、インターネットへの接続も『OK』となりました。

# DNSの役割
DNSとは「Domain Name System（ドメインネームシステム）」の略で、ドメイン名とIPアドレスを紐付けるシステムです。ネットワークの接続において、通常、DNSは『自動』の設定にすると思います。『自動』の場合、ISPが提供するDNSサーバーに接続します。DNSサーバーのドメイン名とIPアドレスの紐づけ情報が最新でない場合、接続したいサーバへたどり着けません。

# パブリックDNS
実は、上記のDNS手動設定で設定したIPアドレスは、Googleが提供しているDNSでした。[Google Public DNS](https://developers.google.com/speed/public-dns?hl=ja)
このような、自由に接続可能なDNSをパブリックDNSと呼び、Google以外にも、「Cloud flare DNS」「Open DNS」など、いくつもあるようです。

# まとめ
ゲーム機器もそうですが、スマホ、タブレット、PC 以外にも、自宅で使用している機器で、インターネットに接続するものが増えてきております。ハードディスクレコーダ、プリンター、ネットワークカメラ、などなど。今回のトラブルシューティングは、それらのインターネットに接続する機器についても同様に使えるものだと思います。
また、ネットワークの仕組みを理解することで、自己解決出来ることが増えてきます。
今回の内容が、少しでも何かのお役に立てればうれしいです！！
Azure Cosmos: 非同期化時の記録(Flask to Quart)

# 背景

以前やってた際は、Flask だったが、Quart 移行となった際に、躓いた記録

https://qiita.com/baku2san/items/52d004b6087877588a65

# import 変更

```python: 同期
from azure.cosmos import CosmosClient
```
```python: 非同期用へ
from azure.cosmos.aio import CosmosClient
```

# 取得方法の変更

```python: 以前の一例
next_item = next(query_items)
```

```python: 非同期用へ
query_items_response = container.query_items(
    query="SELECT * FROM r WHERE r.id=@id",
    parameters=[
        {"name": "@id", "value": doc_id}
    ]
)

items = [item async for item in query_items_response]
```

https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/cosmos/azure-cosmos/samples/document_management_async.py#L86

# エラー対処
## hypercorn.utils.LifespanFailureError: Lifespan failure in startup. ''DatabaseProxy' object has no attribute 'get_database_client''

え？あるよ、と思ったけど、非同期化したことで、メソッドチェーンを見直さないとダメって話。
Container Client も同様だと思われる。<code>AsyncItemPaged[]</code> なので

```python: 同期
cosmos_client = CosmosClient(
    url=AZURE_COSMOSDB_ENDPOINT,
    credential=azure_credential
    ).get_database_client(
        AZURE_COSMOSDB_DATABASE)
```

```python: 非同期
cosmos_client = CosmosClient(
    url=AZURE_COSMOSDB_ENDPOINT,
    credential=azure_credential
    )
database_client = cosmos_client.get_database_client(
        AZURE_COSMOSDB_DATABASE)
```


## TypeError: ClientSession._request() got an unexpected keyword argument 'enable_cross_partition_query'

aio 用では、対応してないってだけなので、削除すればOK。

必要なら <code>partition_key</code> を検討すれば良さそう

```python: Flask
items = container_alarm.query_items(query=sql_query, enable_cross_partition_query=True)
```

```python: Quart
items = container_alarm.query_items(query=sql_query)
```

https://github.com/Azure/azure-sdk-for-python/issues/30876

# あとがき

非同期を利用したことはあっても、非同期化をしたことがなかったので、なんか不安しかない・・ :sweat: 

https://learn.microsoft.com/ja-jp/rest/api/cosmos-db/

https://learn.microsoft.com/en-us/python/api/overview/azure/cosmos-readme?view=azure-python#using-the-asynchronous-client
【iOS】AndroidエンジニアがSwiftUIを触ってみた感想


普段Androidアプリを開発している私は、興味本位でiOS開発をしてみたくなり、Apple Developerのサイトに公開されているSwiftUIのチュートリアルを見ながら学習しました。

https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

今回はSwiftUIを触ってみた軽い感想を書きます。

**結構楽しいですね。**

## 大まかな感想
Androidの**Jetpack Composeと記述の仕方が似ている**なというのが、第１印象でした。

どちらも宣言型のUIでしたね。

少ない行数である程度の機能を実装できるのは、かなり便利です。

## 良きかなポイント👍
ここでは私が特に良かったと感じたところについてお伝えします。

私の良きかなポイントはこちらです。
- マップの実装が簡単
- Swiftを使用しているため、言語の学習コストが低かった

### マップの実装が簡単
1. ビューファイルを用意した後に`Mapkit`をimport
2. 表示場所を設定するメソッドを用意(position)
3. 初期位置の座標と表示する横幅、縦幅を設定
4. `Map(initialPosition(.position(position)))`でセット

以上でアップル標準のマップが表示されます。

ここまでコードは２０行も書いていません。本当に短いコードでマップが表示されたのは感動しました。

以下はSwiftUI Tutorialsより引用したものです。

```MapView.swift
import SwiftUI
import MapKit


struct MapView: View {
    var body: some View {
        Map(initialPosition: .region(region))
    }


    private var region: MKCoordinateRegion {
        MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: 34.011_286, longitude: -116.166_868),
            span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
        )
    }
}


#Preview {
    MapView()
}

```

↓iPhone12の実機で動作させたスクショです。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/704ced6e-1620-71c1-38b8-6fd222d0f033.png width=300>

### Swiftを使用しているため、言語の学習コストが低かった
これは私が普段使っている言語が関係します。

私が普段使っているのはKotlinといってJavaの後継として開発され、Androidアプリ開発の現場で使用されている言語です。

このKotlinとSwiftUIで使用されているSwiftは文法的にかなり似ています。

それは、初見とは思えないほどスルスルとコードの理解をすることができたほどです。

そのおかげで、今回の学習も通常のプログラミング学習に比べて学習コストが低くなり、特に詰まることなくチュートリアルを終えることができました。


## ちょっと戸惑ったところ🌀
色々収穫があった学習でしたが、Android開発と違って戸惑ったところもあります。

- 実機で動かす時はプロファイルを信頼しなければならない
- １週間で作ったが無効になる

これはswiftUIというよりiOSのシステムにかかってきますが、この２つが特に戸惑ったところです。

### 実機で動かす時はプロファイルを信頼しなければならない

実機をUSBに挿してもなかなか動かないので、どうしたものかと思っていましたが、プログラムを書いているmacとiPhoneを事前にペアリングしないと使えないことを突き止めるのに少し時間がかかりました。

AndroidはデバックモードとUSBデバックを端末側でONにすれば、USBにさしてすぐに実機確認ができます。

しかし、xcodeではペアリングの他にプロファイルのコピーを完了させたうえに、iPhone側でプロファイルを信頼しなければ実機確認できないため戸惑いました。

### １週間で作ったアプリが無効になる
作ったアプリはスマホ側に残りますが、起動できる期間が決まっていることも戸惑いポイントでした。

Androidには特に起動できる期間は決まっておらず、過去に作成したオリジナルのアプリをワンクリックでいつでも起動できます。

しかし、iOSではそこも厳格に定められており、１週間前に作ったアプリをクリックしたところ「起動できません」とポップアップが出現して起動できませんでした。

またxcodeでビルドすれば動くようになりますが、ここでOSの違いを強く実感しました。

## 今後のキャリアのために
少しだけSwiftUIに触れただけでしたが、Androidとの違いを色々感じることができた良き体験だったと考えています。

SwiftUIでアプリをビルドするにはMacが必要ですが、つい最近まで私は持っていませんでした。

正直Macbookはかなり高くて、私が以前購入した大きなデスクトップ型のゲーミングパソコンと価格がほぼ同じだった時は息が詰まりそうになりました。

しかし、今回の出費は決して悪いものでなかったと思えています。

買っていなければ、こうした体験はできませんし、この記事を書くことができませんでしたから。

今後のキャリアのために両方のOSの経験を積んでいくつもりです。
データサイエンティスト検定勉強のメモ(誤差関数)

# この記事について

今月データサイエンティスト検定を受けるので勉強をしていたのですが、解いてる時に誤差関数に関わる問題が他の問題に比べてちょっと時間がかかるのに気づいたので自分用にまとめておきます。

同じように受験予定の人がこの記事見てるかもしれないですね。

# 誤差(損失)関数とは

機械学習モデルの予測値が実測値とどの程度乖離してるかを算出するために使われる関数です。

例を挙げると回帰問題では、損失関数Lを
$$
L = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2
$$
で定義してこれを最小化することで、データに沿った回帰直線の傾きと接点を求めます。

# 問題で出てくるやつら
ここからは問題で出てくるやつらをみていきます。
他にもありますが、一旦3つ。
以下の説明で出てくる変数は以下の通りです。
$y_i$：実測値
$\hat{y}_i$：予測値
$n$：データ数

## MSE

日本語だと平均二乗誤差。英語だとMean Squared Error。

定義式は

$$
\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2
$$

上でも書いたやつ。二乗している関係で大きな誤差を重要視するため、外れ値に敏感に対してなります。

## MAE

日本語だと平均絶対誤差。英語だとMean Absolute Error。

定義式は

$$
\frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|
$$

絶対値で計算するため、MSEに比べると外れ値の影響を受けにくくなります。

## MSLE

日本語だと平均二乗対数誤差。英語だとMean Squared Logarithmic Error。

定義式は

$$
\frac{1}{n}\sum_{i=1}^{n}(log(1 + y_i ) - log(1 + \hat{y}_i))^2
$$

対数変換をかませることで、正解値の分布が大きい場合でも適切な評価をすることができます。

1がどこからきた？って感じですが、これをしないとyが0を取った場合に大数の計算結果が負の無限大になるので、それを回避するため必要です。


# まとめ

結局問題解いてる時に何で惑わされてるかというと、それぞれ何の略だかうろ覚えだったのが問題だった。
このまとめを作る前だと、問題文でMAE(平均二乗誤差)って書かれても引っ掛からなかったかもしれない。

そもそもこれらがなにか分かってなくて、言及された問題を解ける自信がないかも。という方は一度手で計算してみたりスクラッチで実装してみると理解が進んで良いと思います。

# 参考文献
[回帰モデルの評価指標まとめ – MSE、MSLE、MAE、決定係数など](https://pystyle.info/ml-regression-criteria/)
書籍
徹底攻略　データサイエンティスト検定[リテラシーレベル]対応問題集
郵送物（DM）は、信頼性・保存性の２軸で勝負！

# 初めに
郵送物（以下DM）による自社サービスの訴求は、アナログながらお客さまの手元に届くのでCV率が他チャネルよりもいいケースがあるかと思います。

今回は、DMをより効果的に活用する方向性を考えてみたいと思います💡

# 信頼性×保存性
信頼性×保存性の２軸で、クリエイティブを評価してみましょう。
どちらも、DMを受け取る「お客さま目線」で考えるのが大事です！

▼信頼性
・DM発送元の会社は、聞いたことがあるか？
・クリエイティブから、真面目で誠意がある感じがするか？
・極端に「NO1！」や「満足度XX％」のような、煽り文句が多くないか？
・手にしたときの見た目は、シンプルか？（公共機関・インフラなどのイメージに近いか？）

▼保存性
・届いたDMを見て、お客さまは何をしたらいいか？がわかるようになっているか？
・いったん保留しやすいサイズ感、仕掛けがあるか？
・過去に申し込んだ方の実績から、発送と申込日にどのくらいの差があり、その間どうやって自宅に保管されているか考えたことがあるか？　申し込みたくなるきっかけがあるか？

# 終わりに
DMが届くお客さま目線で、DMが届いてからに行動をイメージすることが、より効果的なDM施策につながると思います✨
FlutterのListViewでシンプルなチャット画面を作ってみる

# はじめに
FlutterのListViewを勉強しシンプルなチャット画面を作成しました。
本記事では備忘録も兼ねてまとめたものになります。

# 環境
- Flutter 3.22.1

# ListView
スクロール可能なリスト一覧を作成できるwidget。


# ListView.builder
多数のデータを一覧表示させる際に使用を推奨されるもの。

> 「ListView.builder」で作成すると、実際に表示されている子要素のみビルダーが呼び出されるため随時読み込みなど、多数(または無限)のリストを表示する場合に利用する作成方法です。
引用 ListView 2：https://flutter.ctrnost.com/basic/layout/listview/

# ソース
アプリのホーム画面として`ChatScreen`Widgetを作成しています。
`ListView`を使用して20個のチャットメッセージを生成し、インデックスが偶数のものは自分が送信したメッセージ、奇数のものは相手のメッセージを想定しています。

```dart:main.dart
import 'package:flutter/material.dart';
import 'chat.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: ChatScreen(), 
    );
  }
}

class ChatScreen extends StatelessWidget {
  const ChatScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Chat Example'), 
      ),
      body: ListView.builder(
        itemCount: 20, // リストビューの要素数を設定
        itemBuilder: (context, index) {
          return ChatSample(
            message: '要素 $index', // メッセージの内容を生成 例:要素 1、要素 2・・・
            isMe: index % 2 == 0, // 偶数インデックスは自分が送ったメッセージと仮定
          );
        },
      ),
    );
  }
}

```


下記の`ChatSample`Widgetではメッセージボックスを描画しています。
自分のメッセージかどうかを示す`isMe`のフラグに応じて右 or 左寄せで、背景色が異なるメッセージボックスを描画してます。

```dart:chat.dart
import 'package:flutter/material.dart';

class ChatSample extends StatelessWidget {
  final String message; 
  final bool isMe; // フラグ

  const ChatSample({required this.message, required this.isMe, super.key});

  @override
  Widget build(BuildContext context) {
    return Align(
      alignment: isMe
          ? Alignment.centerRight
          : Alignment.centerLeft, // 自分のメッセージの場合は右寄せ、それ以外は左寄せ想定
      child: Container(
        margin: const EdgeInsets.symmetric(
            vertical: 5.0, horizontal: 10.0),
        padding: const EdgeInsets.all(10.0),
        decoration: BoxDecoration(
          color: isMe
              ? Colors.greenAccent
              : Colors.grey[300], // 自分のメッセージは緑色で表示
          borderRadius: BorderRadius.circular(12.0),
        ),
        child: Text(
          message,
          style: const TextStyle(fontSize: 16.0),
        ),
      ),
    );
  }
}
```

# 実行結果
デバッグして確認すると、次の画像のように相手とやりとりしている事を想定した画面を描画できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/d72deb9c-191f-6148-a264-811971351bf3.png)


# 参考

https://api.flutter.dev/flutter/widgets/ListView-class.html

https://flutter.ctrnost.com/basic/layout/listview/
闘魂Elixir ーー AtCoder Beginner Contest 344(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 344](https://atcoder.jp/contests/abc344)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Spoiler](https://atcoder.jp/contests/abc344/tasks/abc344_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

文字列を分割すればよいので、[String.split/3](https://hexdocs.pm/elixir/String.html#split/3)関数を解法の骨格に使えば良いでしょう。
文字列の連結には、[<>](https://hexdocs.pm/elixir/Kernel.html#%3C%3E/2)を使います。

```elixir
defmodule Main do
  def main do
    s = IO.read(:line) |> String.trim()
      
    solve(s)
    |> IO.puts()
  end
  
  def solve(s) do
    [a, _, b] = s |> String.split("|")
    a <> b
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 344](https://atcoder.jp/contests/abc344)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
コンピュータと会話するためには

# 導入
お疲れ様です！今日は自然言語処理について学習したことをアウトプットします！

## 自然言語処理（NLP）とは
自然言語処理（Natural Language Processing、NLP）とは、人間が日常的に使用する言語をコンピュータに理解させるための技術です。
NLPは、テキストや音声データを解析し、その意味を理解することを目的としています。
この技術は、検索エンジン、音声アシスタント、翻訳アプリなど、日常生活のさまざまな場面で利用されています。

## NLPの歴史と発展
NLPの歴史は長く、1950年代にチューリングテストが提唱されたことに始まります
。それ以来、計算機の性能向上と共に、NLPの技術も飛躍的に進歩してきました。
今日では、機械学習やディープラーニングの技術を駆使して、より自然で精度の高い言語処理が可能となっています。

## コンピュータと会話するためにNLPが必要な理由
コンピュータと自然な会話をするためには、単に言葉を理解するだけでなく、その背景にある文脈や感情も理解する必要があります。
NLPは、これらの複雑なタスクを実現するための基本技術です。

# 自然言語処理の基本概念
## トークン化
トークン化とは、テキストを意味のある最小単位（トークン）に分割するプロセスです。
例えば、文を単語に分割することがトークン化に該当します。

### トークン化の基本手法
トークン化は、スペースや句読点などを基準に行います。以下は、Pythonを使ったトークン化の例です。

```python
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize

text = "自然言語処理を学ぶことは楽しいです。"
tokens = word_tokenize(text)
print(tokens)
```

# 形態素解析

形態素解析とは、単語をさらに細かい意味単位（形態素）に分割し、その品詞を識別するプロセスです。

## 形態素解析の方法とツール

形態素解析には、MeCabやJanomeなどのツールが使用されます。以下は、MeCabを使った形態素解析の例です。

```python
import MeCab

mecab = MeCab.Tagger()
text = "自然言語処理を学ぶことは楽しいです。"
print(mecab.parse(text))
```

# 文法解析

文法解析とは、文の構造を解析し、各単語の関係性を明らかにするプロセスです。依存構造解析や句構造解析があります。

## 例：spaCyを使った文法解析
```python
import spacy

nlp = spacy.load("ja_core_news_sm")
doc = nlp("自然言語処理を学ぶことは楽しいです。")
for token in doc:
    print(f'{token.text}: {token.dep_} -> {token.head.text}')
```

# 自然言語処理の応用

## チャットボットの基本

チャットボットは、ユーザーと会話を行うプログラムです。ルールベースのものと、機械学習ベースのものがあります。

## ルールベースのチャットボットの実装

以下は、簡単なルールベースのチャットボットの例です。
```python
def chatbot_response(user_input):
    if "こんにちは" in user_input:
        return "こんにちは！"
    else:
        return "すみません、よくわかりません。"

user_input = input("あなた: ")
response = chatbot_response(user_input)
print(f'チャットボット: {response}')
```
# 音声認識と音声合成

音声認識は、音声をテキストに変換する技術です。音声合成は、テキストを音声に変換する技術です。

## 例：Google Cloud Speech-to-Text APIとText-to-Speech APIの紹介

Google CloudのAPIを使うことで、簡単に音声認識と音声合成を実装できます。

# 感情分析

感情分析は、テキストの中の感情を識別する技術です。

## 例：テキストデータを使った感情分析の実装

以下は、Pythonで感情分析を行う例です。
```python
from textblob import TextBlob

text = "今日はとても楽しいです！"
blob = TextBlob(text)
print(blob.sentiment)
```

# 実際にコンピュータと会話してみよう

## チャットボットの作成

チャットボットを作成するためには、まず環境を整える必要があります。

## 環境設定と準備

Pythonと必要なライブラリをインストールします。

Pythonでの簡単なチャットボットの作成

以下は、Pythonでチャットボットを作成する例です。
```python
import random

def chatbot_response(user_input):
    responses = ["こんにちは！", "元気ですか？", "今日はどんな日ですか？"]
    return random.choice(responses)

while True:
    user_input = input("あなた: ")
    if user_input.lower() in ["終了", "終わり", "さようなら"]:
        print("チャットボット: さようなら！")
        break
    response = chatbot_response(user_input)
    print(f'チャットボット: {response}')
```

## 音声認識と音声合成の統合

音声認識と音声合成を組み合わせることで、音声を使ったチャットボットを作成できます。

# 学んだことのまとめ

この記事では、自然言語処理の基本概念と、チャットボットや音声認識・音声合成の実装方法について学びました。次に学ぶべきこととして、より高度なNLP技術や、実際のアプリケーションへの応用方法について学んでいきましょう。
闘魂Elixir ーー AtCoder Beginner Contest 345(B)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 345](https://atcoder.jp/contests/abc345)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [B - Integer Division Returns](https://atcoder.jp/contests/abc345/tasks/abc345_b)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

何気に難しい問題です。商と余りを算出して巧みに判定をしました。パターンマッチを上手に使っています。
詳しくは、公式の[解説](https://atcoder.jp/contests/abc345/editorial/9562)に譲ります。

```elixir
defmodule Main do
  def main do
    x = IO.read(:line) |> String.trim() |> String.to_integer()
      
    solve(x)
    |> IO.puts()
  end
  
  def solve(x) do
    do_solve(div(x, 10), rem(x, 10))
  end
  
  defp do_solve(q, r)
  defp do_solve(q, 0), do: q
  defp do_solve(q, r) when r < 0, do: q
  defp do_solve(q, _), do: q + 1
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 345](https://atcoder.jp/contests/abc345)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
AWS超入門

# 導入
## AWSとは
Amazon Web Services (AWS) は、Amazonが提供するクラウドコンピューティングサービスです。
2006年に開始され、現在では世界中の企業や個人が利用しています。
AWSは、コンピューティングパワー、ストレージ、データベース、機械学習など、さまざまなサービスを提供しており、その柔軟性とスケーラビリティから多くの利用者に支持されています。

## なぜAWSを学ぶべきか
AWSは、クラウドコンピューティングのリーダーであり、その知識は現代のIT業界で非常に価値があります。AWSを学ぶことで、インフラのコストを削減し、迅速にスケーリングし、信頼性の高いサービスを提供する能力が身につきます。

# AWSの基本サービス
## コンピューティングサービス
### EC2（Elastic Compute Cloud）とは
EC2は、AWSが提供する仮想サーバーです。ユーザーは、必要な数の仮想サーバー（インスタンス）を起動し、必要に応じてスケールアップやスケールダウンすることができます。

### EC2の基本的な使い方
EC2インスタンスを作成するには、以下の手順を踏みます：
1. AWSマネジメントコンソールにログインします
2. 「EC2」を選択し、「インスタンスの作成」をクリックします
3. インスタンスタイプ、AMI（Amazon Machine Image）、セキュリティグループなどを設定します
4. インスタンスを起動し、接続情報を確認します

### 実際の使用例
例えば、ウェブサーバーをホストするためにEC2インスタンスを使用することができます。
これにより、トラフィックの増加に応じて迅速にスケールアウトすることが可能です。

## ストレージサービス
### S3（Simple Storage Service）とは
S3は、AWSが提供するオブジェクトストレージサービスです。大容量のデータを安価に保存し、簡単にアクセスすることができます。

### S3の基本的な使い方
1. AWSマネジメントコンソールで「S3」を選択します
2. 「バケットの作成」をクリックし、バケット名とリージョンを設定します
3. 作成したバケットにファイルをアップロードします

### 実際の使用例
S3は、バックアップやデータアーカイブ、ウェブサイトのホスティングなど、さまざまな用途に利用できます。

## データベースサービス
### RDS（Relational Database Service）とは
RDSは、AWSが提供するマネージド型のリレーショナルデータベースサービスです。ユーザーは、データベースのインフラ管理をAWSに任せることで、アプリケーション開発に集中できます。

### RDSの基本的な使い方
1. AWSマネジメントコンソールで「RDS」を選択します
2. 「データベースの作成」をクリックし、データベースエンジン（例：MySQL、PostgreSQL）を選択します
3. インスタンスの設定やネットワーク構成を行い、データベースを作成します

### 実際の使用例
RDSは、トランザクション処理が多いアプリケーションや、データベース管理の手間を減らしたい場合に適しています。

# その他の重要サービス
## IAM（Identity and Access Management）
### IAMとは
IAMは、AWSリソースへのアクセスを安全に管理するためのサービスです。ユーザーやグループを作成し、ポリシーを設定することで、アクセス制御を行います。

### IAMユーザーとポリシーの設定
1. AWSマネジメントコンソールで「IAM」を選択します
2. 「ユーザーの追加」をクリックし、新しいユーザーを作成します
3. ユーザーに適切なポリシーをアタッチします

## VPC（Virtual Private Cloud）
### VPCとは
VPCは、AWS上に仮想ネットワークを作成し、リソースを隔離して管理するためのサービスです。ユーザーは、サブネット、ルートテーブル、ネットワークゲートウェイを設定して、自分専用のネットワークを構築できます。

### VPCの基本的な設定方法
1. AWSマネジメントコンソールで「VPC」を選択します
2. 「VPCの作成」をクリックし、CIDRブロックなどの設定を行います
3. サブネットやルートテーブルを追加し、必要な設定を完了します

# 実際にAWSを使ってみよう
## AWSアカウントの作成
1. AWS公式サイトにアクセスし、「アカウントを作成」をクリックします
2. 必要な情報を入力し、アカウントを作成します
3. 登録が完了したら、マネジメントコンソールにログインします

## EC2インスタンスの作成
1. マネジメントコンソールで「EC2」を選択します
2. 「インスタンスの作成」をクリックし、設定を行います
3. インスタンスを起動し、SSHで接続します

## S3バケットの作成
1. マネジメントコンソールで「S3」を選択します
2. 「バケットの作成」をクリックし、バケット名とリージョンを設定します
3. ファイルをアップロードし、アクセス設定を行います

# まとめ
## 学んだことのまとめ
AWSの基本サービスであるEC2、S3、RDS、IAM、VPCについて学びました。これらのサービスを使いこなすことで、クラウド上でのインフラ構築や管理が容易になります。次に学ぶべきこととして、AWSのセキュリティベストプラクティスや、より高度なサービスの活用方法について学んでいきましょう。
いいね！戦略　でチームビルディング

# いいね！戦略とは

TeamsやSlackなど、チャットを使ったコミュニケーションが当たり前になってきましたよね！
ずばり、いいね！戦略＝見たチャットには全部「いいね」する！　という方法です✨

非常にシンプルですよね💡

あなたはいいね！してますか？？

# 心理的安全性との関係性
同僚・上司・部下　いろんな社内の方とのコミュニケーションにおいて、重要になるのはやはり心理的安全性だと思います。　心理的安全性とは、
「発言することに不安がなく、お互いに建設的な議論ができる状態」
と理解しています。

この状態を作るための第一歩として、あなたの発言を受け止めていますよ　という態度を示すのにうってつけなのが、いいね！　なのです・・・

# その他　個人的な工夫

・チャットには、絵文字を積極的に使う。
・意味のない絵文字でもOK。例：文末に、🌴、🎈、🏡、🚄など。
・仕事で距離が近いメンバー（特に部下）からのメッセージには、優先的にいいね！＋返信する
・いいね！だけでなく、文脈に応じたスタンプを探して押す
・ちょっとしたこと（他部署にチームを代表してメールしてくれた　とかのレベル感から）でも、チャットで「ありがとう」をいう🌸
・部下が自席に来たら、作業途中でも手を止め、身体を向けて会話する

# 最後に
初めて部下を持った時から試行錯誤しながらですが、うまくチームビルディングできている感覚があります✨
ぜひ、できることからお試しください！
PythonスクリプトからPowerShellスクリプトを実行する

# 前提
- ユーザは Python スクリプトを実行する
- Python は PowerShell に引数を渡して処理を実行する
- PowerShell は Python に結果を返却する

# 環境
Python 3.12.4

# Pythonの処理
``` a.py
import subprocess
import random

ps_cmd = 'powershell -ExecutionPolicy RemoteSigned -File'
ps_file = 'C:\\PyWork\\IsEvenNumber.ps1'

# 0～9の整数を生成
num = random.randint(0, 9)

# PowerShellのスクリプトを実行して偶数か否か判定する
cmd = subprocess.run(ps_cmd + ' ' + ps_file + ' ' + str(num))

if cmd.returncode == 1:
	# 偶数の場合
	print(str(num) + " is Even")
else:
	# 奇数の場合
	print(str(num) + " is Odd")
```

# PowerShellの処理
``` IsEvenNumber.ps1
# 受け取った引数は $Args[0] に格納される
$num = $Args[0]

if ($num % 2 -eq 0) {
    # 偶数なら 1 を返却
	$result = 1
} else {
    # 奇数なら 0 を返却
	$result = 0
}

# exit 値を返却する
exit $result
```

# 実行結果
``` 
C:\PyWork> python a.py
4 is Even
```

# 参考資料
https://note.com/mahalo_/n/nf4526b16a4b2

https://microsoftou.com/ps-arguments/

https://qiita.com/tanabe13f/items/8d5e4e5350d217dec8f5

https://www.tohoho-web.com/ex/power-shell.html
プロセスとスレッドを理解する

シングルスレッド、マルチスレッド、プロセスなど名前は聞いたことあるものの、それぞれの違いがよくわからないという方も多いのではないでしょうか。（筆者はそうだった）

この記事では、プロセスとスレッドの違いについて解説します。

## プロセスとは

例えばみなさんがあるプログラムを作成して実行したとします。

実行されたときにOSはそのプログラムをメモリ上に展開し、CPUを割り当てて実行します。このプログラムの実行単位をプロセスと呼びます。

このプロセス内のリソースは

- コードセグメント
- データセグメント
- スタックセグメント
- ヒープセグメント

などがあります。

プロセスはOSから割り当てられたリソースを持ち、プロセス間でのデータの共有は簡単ではなく、プロセス間での通信はInter-Process Communication（IPC）を使うことで実現できます。

## スレッドとは

一方でスレッドはプロセス内で実行される単位です。

プロセスは複数のスレッドを持つことができ、スレッドはプロセス内のリソースを共有します。

スレッドはプロセス内のリソースを共有するため、プロセス間の通信よりも効率的にデータの共有ができます。

スレッドにはシングルスレッドとマルチスレッドがあり、シングルスレッドは1つのスレッドで処理を行い、マルチスレッドは複数のスレッドで処理を行います。

シングルスレッドは処理が逐次実行されるため、処理が遅くなることがありますが、データの競合が起こりにくいという特徴があります。

一方でマルチスレッドは複数のスレッドで処理を行うため、処理が高速になることがあるが、データの競合が起こりやすいという特徴があります。

## Goにおけるゴルーチン(goroutine)

Go言語ではゴルーチンという概念があります。

ゴルーチンはGoのランタイムによって管理される軽量なスレッドで、Goのプログラム内で複数のゴルーチンを作成することができます。

ゴルーチンはスレッドよりも軽量で、スレッドの数が増えてもOSのスレッド数が増えるわけではないため、スレッドよりも多くのゴルーチンを作成することができます。

ゴルーチンはGoのランタイムによってスケジューリングされるため、プログラマはゴルーチンの作成やスケジューリングを意識する必要がありません。

Goのゴルーチンはプロセス内のリソースを共有するため、データの共有が容易であり、プロセス間の通信よりも効率的にデータの共有ができます。

（スレッドと記載しましたが厳密にはOSのスレッドとは異なる）
[Unity]UnityNetcodeでマルチプレイヤーを試してみる記事

# 概要
前回の記事[「UnityNetcodeをちょっと触ってみたい人用の記事」](https://qiita.com/kazuma_f/items/dd88c7132c343500702e)の続きです。UI上にNetcodeへの接続用ボタンを用意して、実際に複数プレイヤーが同時に接続する様子を確認していきます。
# 本文
## ネットワーク接続用のボタンを追加する

ネットワークに接続するためのボタンを用意します。

![スクリーンショット 2024-06-15 194524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/167c4a4c-ba32-83f7-aa4a-e8def852e32b.png)

Hierarchyに空のオブジェクトを作り、NetworkConnectをアタッチします。

```cs
using UnityEngine;
using Unity.Netcode;
using UnityEngine.UI;

public class NetworkConnect : MonoBehaviour
{
    public Button createServerButton;
    public Button joinServerButton;
    
    private void Start()
    {
        createServerButton.onClick.AddListener(CreateServer);
        joinServerButton.onClick.AddListener(JoinServer);
    }
    
    private void CreateServer()
    {
        NetworkManager.Singleton.StartHost();
    }
    
    private void JoinServer()
    {
        NetworkManager.Singleton.StartClient();
    }
}
```

ボタンを設定します

![スクリーンショット 2024-06-15 195556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a155e5d5-7d71-2f36-b848-0d5620fe1bbb.png)

Createボタンを押したら無事NetworkPlayer（ニワトリ）がシーンに登場しました。

![スクリーンショット 2024-06-15 202954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/57082839-be7e-d7d9-f8a7-e14a405301fc.png)

## マルチプレイヤーを確認する
メニュー > Edit > ProjectSettings > Player(PCタブ)

:::note info
フルスクリーンだとマルチプレイの確認がしづらいのでウィンドウ表示に切り替えます。動作確認をしやすくするためだけなので必須の手順ではありません
:::

![スクリーンショット 2024-06-15 203605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/79546d1c-90ac-16ec-4084-5f6e12898ff9.png)

メニュー > File > Build Settings

![スクリーンショット 2024-06-15 204308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/42084e1d-f72d-515f-d31a-9635c9ae3281.png)

これでWindowsアプリとしてビルドできると思います。アプリが実行されたら「Createボタン」を押します。続いてUnityEditor上でも実行して今度は「Joinボタン」を押すと２つのアプリからNetcodeでつながった状態になります。

![スクリーンショット 2024-06-15 204728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/6db0af71-2849-7def-e9a0-431a472cb194.png)

# UnityNetcode関連記事目次
[1.UnityNetcodeをちょっと触ってみたい人用の記事](https://qiita.com/kazuma_f/items/dd88c7132c343500702e)
2.UnityNetcodeでマルチプレイヤーを試してみる記事 ← :triangular_flag_on_post:
[3.UnityNetcodeのマルチプレイヤーで位置を同期してみる](https://qiita.com/kazuma_f/items/bd57bc2c18fd0dfa9c71)
[4.UnityNetcodeのマルチプレイヤーで変数を同期してみる](https://qiita.com/kazuma_f/items/907b01705e78bd199fdd)
静的サイトジェネレーターでドキュメント管理を快適に。

## Summary
この記事では、静的サイトジェネレーター「Docsaurus」を使った、軽量で汎用的なドキュメント管理をご紹介します。

## Docusaurusの公式サイト
https://docusaurus.io/


## こんな人向け
1. ドキュメント管理のツール色々試したけど、どれもしっくりこない
   1. Notionだと誰でもサクッと更新できるからミスが怖い
   1. GitHubのwikiだと見栄えが微妙
   1. wordpressみたいなDBありのものは運用が大変
   1. 静的サイトジェネレーターもいい感じのものが多いけど、ちょっと使いにくい


## こんなことできるようになります
1. 静的サイトジェネレーターを使ったドキュメント管理
1. Docsaurusはドキュメント管理をテーマにしたSSGなのでUIが素敵
1. GitLabの無料ホスティングサービスPagesを使うのでサーバーの契約が不要（つまり無料
1. mainにマージされた時にGitLabCICDで自動デプロイされるのでデプロイの手間がない
1. マークダウンでドキュメント管理

## ポイント
### 1. Metaが開発運用
- DosaurusはMeta社が開発して運用してくれてるものです。
- なので、かなり作り込まれていて使いやすい。

### 2. ドキュメント管理のための素敵なUI
- Docsaurusは、ドキュメント管理をテーマにしているだけあって、必要十分な機能と素敵なデザインです。
- 最初から、チュートリアルとブログという２つのリンクやサンプル記事があります。
- これだけでも十分すぎる機能ですよね。

### 3. GitLabで無料ホスティング
- これはDocsaurusというか私個人が思いついたやり方なのですが。。。
- 静的サイトジェネレーターなのでビルド成果物は純粋なhtmlですよね。
- なので、GitLabのホスティングサービスを使って無料で公開します。

### 4. ビルド成果物はGit管理しない
- ビルドしたものはGit管理に含めていません。
- 「じゃあ、何をホスティングしているの？」っていう感じですよね。
- GitLabCICDでビルドし、GitLabのコンテナ内に生成されたビルド成果物を直接ホスティングしています。
- なので、Git管理されていないビルド成果物が公開されていることになります。
- これって、あんまりない運用かもしれませんが、個人的にイケてるポイントです。（SSGならではじゃないですか？


## さあ、始めよう。
```bash
git clone git@gitlab.com:share292508/docsaurus-gitlab-publishing.git
# 👆このリポジトリは僕が公開しているDocusaurusの環境をDockerで作ったものです
git rm .git
git init
git remote add origin {{あなたのGitLabリポジトリURL}}
git add .
git commit -m'Docsaurusを使ったSSG'
git push origin main
```

そう、これだけです。

👆のコマンドを打てば、こんな感じでサイトをリリースできます。

[実際に上記コマンドでリリースしたサイトはこちら](https://docsaurus-gitlab-publishing-share292508-51c4f83f245412c45667316.gitlab.io/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320824/f8a4821c-34f7-7928-d16f-f52e45886665.png)


これだけで、あなたのGitLabリポジトリでサイトをリリースできます。

もしかしたら、何かエラーなどで詰まるかもしれませんので、その時はこの記事にコメントする形で教えていただければ嬉しいです！

それと、「ここもっとこうしたら良いんじゃないかな」っていうアドバイスや改善のアイディアもいつでもお待ちしておりますー。



## 経緯
Docsaurusを使おう！と思ったきっかけは、実はtypescriptとReactを勉強したかったからです。

業務でこの子達を使うことになり、ハンズオンで動かしながらやってみたいと思ったのですが、どうせならフロントの技術をまるっと学びたいなと。

そこで静的サイトジェネレーターを探していたら、Docsaurusを見つけました。

ちょうど、自分用でガイドラインみたいなサイトを作りたいな〜なんて思っていたので使ってみた。

そうすると、少ないコマンドでサクッとサイトを立ち上げることができました。

他のSSGに比べてもかなり簡単でわかりやすかった気がします。

ここら辺にMetaのエンジニアさんたちの優秀さが伺えますね。


## 実は選べる、typescipt
cloneしたリポジトリはtypesciptが設定してあるのですが、「そんなの知らねーよ」って人のためにDocsaurusはjavasriptのみでの構築オプションもあります。

プロジェクト作成時に`javascript|typescript`と選べるので、ご自身でプロジェクトを作成し、選択してみてください。




## 最後に
よくウェブサイトを作るのですが、Wordpressだと重い、HTMLだと軽すぎると思っていました。

特に、数は多くないけどコンテンツを管理したい。っていう場面が結構あるんですよね。

そんな時に、このジェネレーターに出会いました。

いや〜必要十分な機能とすっきりしたデザインなので大好きです。

特に、チュートリアルページの下の方に、「前の記事」「後の記事」みたいなボタンが出てくるのが大好きです。

これから愛用していきます。




## 追記
### 限定公開のドキュメントも公開できるよ
-　上記の作業をGitLabのプライベートリポジトリ（日公開リポジトリ）でやれば、ページは公開されるのですが、リポジトリにアクセス権のあるユーザーのみ表示させることができます。
-　こっちの方が内部ドキュメントとしては安心ですね。
Ubuntu環境でOpenJDKインストール

# はじめに
Ubuntu環境でOpenJDKをインストールする手順を整理しようと思います。

# 環境
Ubuntu 22.04 LTS

# 事前準備
事前にaptをアップデートしておきます。
```console
$ sudo apt update
```

# OpenJDKインストール
OpenJDKをインストールする手順は以下のようになります。

## コマンドを実行してOpenJDKをインストール
`$ sudo apt install openjdk-{バージョン}-jdk`コマンドを実行して、OpenJDKをインストールします。
`{バージョン}`は、インストールするOpenJDKのバージョンを入れます。
以下の例は、OpenJDK 21をインストールするコマンドです。
```console:インストール例
$ sudo apt install openjdk-21-jdk
```

## インストール完了を確認
Javaのバージョンを確認することでインストールが完了できたことの確認ができます。
```console:バージョン確認
$ java --version
openjdk 21.0.3 2024-04-16
OpenJDK Runtime Environment (build 21.0.3+9-Ubuntu-1ubuntu122.04.1)
OpenJDK 64-Bit Server VM (build 21.0.3+9-Ubuntu-1ubuntu122.04.1, mixed mode, sharing)

$ javac --version
javac 21.0.3
```

# その他

## OpenJDKの一覧を確認
複数のOpenJDKがインストールされている場合、`update-alternatives --list`のコマンドを使うことで、インストールされているOpenJDKの一覧確認ができます。
```console
$ update-alternatives --list java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
/usr/lib/jvm/java-21-openjdk-amd64/bin/java

$ update-alternatives --list javac
/usr/lib/jvm/java-17-openjdk-amd64/bin/javac
/usr/lib/jvm/java-21-openjdk-amd64/bin/javac
```

## デフォルト設定を変更
使用するOpenJDKを変更したい場合、`sudo update-alternatives --config`のコマンドを使って設定変更が可能です。

```console:設定の変更例
$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-21-openjdk-amd64/bin/java   2111      auto mode
  1            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      manual mode
  2            /usr/lib/jvm/java-21-openjdk-amd64/bin/java   2111      manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-17-openjdk-amd64/bin/java to provide /usr/bin/java (java) in manual mode


$ sudo update-alternatives --config javac
There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                          Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-21-openjdk-amd64/bin/javac   2111      auto mode
  1            /usr/lib/jvm/java-17-openjdk-amd64/bin/javac   1711      manual mode
  2            /usr/lib/jvm/java-21-openjdk-amd64/bin/javac   2111      manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-17-openjdk-amd64/bin/javac to provide /usr/bin/javac (javac) in manual mode
```

Javaのバージョンを確認して、設定の変更を確認します。
```console
$ java --version
openjdk 17.0.11 2024-04-16
OpenJDK Runtime Environment (build 17.0.11+9-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 17.0.11+9-Ubuntu-122.04.1, mixed mode, sharing)


$ javac --version
javac 17.0.11
```
PCの歴史と操作の変容１

# 日本で手に入ったワンボードマイコン
1976年日本電気(NEC)からTK-80というワンボードマイコンと1976年に日立が出したH68/TRというワンボードマイコンがありました。

・TK-80はインテルのi8080という8Bit CPUが搭載されておりRAM 1Kbyte、ROM 256Byteという仕様でした。

・H68/TKはモトローラのMC6800という8Bit CPUが搭載されておりRAM 1KByteのと4KByteのROMという仕様でした。

# TK-80の操作方法
TK-80はハンドアセンブルという方法で機械語プログラムを作ります。
ハンドアセンブラでは、i8080のアセンブラでまずプログラムを作りニーモニック表と呼ばれるアセンブラとコード(16進数)が対になった表を使ってマシン語に変換し、RAM上に16進数でプログラムを入力して実行するという操作でした。

# H68/TRの操作方法
H68/TRには電卓のような形をしたコンソールがついておりアセンブラレベルでプログラムを作れました。

# 当時のデバック方法
TK-80もH68/TRもハード的に制御されたモニタープログラムというプログラムを使ってステップ動作などが可能で１つの処理毎にレジスタの情報を確認してデバックしていました。

# 現在のマイコン現在
現在も色んな機器を制御するために、PICマイコンやArduinoとばれる小型のマイコンを使って色んなものが作れます。
現在のマイコンでのプログラムは、

・PICの場合チップ内のFLASHメモリにプログラムを書くためのハードウエアで書き込みます。
・Arduinoの場合USBでPCにつないでプログラムを書き込みます。

プログラムの作成はC/C++またはアセンブラで書くことが多いようです。

[次の記事](https://qiita.com/kawamo55/items/ac6c30bc789f3ddc5954)
闘魂Elixir ーー AtCoder Beginner Contest 345(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 345](https://atcoder.jp/contests/abc345)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Leftrightarrow](https://atcoder.jp/contests/abc345/tasks/abc345_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

文字列の先頭が`<`、最後が`>`、中央はすべて`=`である場合に`Yes`を出力し、そうではない場合には`No`を出力しなさいという問題です。ですから文字列の先頭、最後、中央を抜き出して条件を満たすかどうかを判定すればよいわけです。


```elixir
defmodule Main do
  def main do
    s = IO.read(:line) |> String.trim()
      
    solve(s)
    |> IO.puts()
  end
  
  def solve(s) do
    charlist = String.to_charlist(s)
    
    [first | _] = charlist
    [last | _] = Enum.reverse(charlist)
    centers = Enum.slice(charlist, 1..-2//1)
    
    if first == ?< and last == ?> and Enum.all?(centers, & &1 == ?=) do
      "Yes"
    else
      "No"
    end
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 345](https://atcoder.jp/contests/abc345)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
ArchLinuxをRTX4070上で動かした備忘録

# 自己紹介
どうも、しがない大学2年生のuPisciumと申す者です。これが初めて執筆したQiita記事なので生暖かい目でご覧いただけると嬉しいです。それでは早速本題へ...

# この記事の新しい版を投稿したので[こっち](https://qiita.com/upiscium/items/a647fa53a508deffa153)を見たほうがわかりやすいと思います...

# ArchLinuxをRTX4070上で稼働させよう
## 経緯(そんなもん知らんって人は読み飛ばして下さい)
私、最近RTX4070を搭載したラップトップを購入いたしました。そこでとりあえずWindowsを消し飛ばしてArchLinuxを入れたとき事件は起こりました。なんと、GPUのモニタリングがなんかできない! そこでnvidiaのプロプライエタリなパッケージを入れて頑張ることにしました。

## 現状
以下、実機のスペックです。
- CPU `Intel i9 14900(GPU付き)`
- GPU `RTX4070 mobile`
- DE `enlightenment`
(LightDMを使ってEnlightenmentを起動しています〜)

## とりあえず結論
1. `pacman -S nvidia nvidia-utils`でnvidiaのパッケージ達を入れる
2. `yay -S nvtop`でモニタリングできるようにする
3. `/etc/X11/nvidia.conf`を作り以下をぶち込む([ArchWiki](https://wiki.archlinux.jp/index.php/NVIDIA)より引用)
```
Section "Device"
        Identifier "NVIDIA Card"
        Driver "nvidia"
        VendorName "NVIDIA Corporation"
        BoardName "GeForce RTX 4070"
EndSection
```
4. 再起動する
これで私の環境はうまく動きました。

# 追記(2024/06/26)
この記事を書いた後に「そういえば、自分の使っている機種専用のパッケージとか無いんかなー」と思い調べてみると、ありました!
スペックの部分には書きませんでしたが私が購入したのはASUSのROGシリーズという少し知名度がある(?)ゲーミングノートで、そのまま`arch asus ROG`で調べると専用のウェブ付きパッケージ解説サイトがトップに出てきました～(やっぱり、調べるの大事…)
参考までに貼って置きます
[ASUS Linux](https://asus-linux.org/guides/arch-guide/)
このサイト通りにセットアップするとROGシリーズは快適に動かせると思います!

## 参考
[ArchWiki](https://wiki.archlinux.jp/index.php/NVIDIA)

それではまた次の記事でお会いしましょう。
【python】数式の加減算処理

# 数式の加減速処理
今回は文字列で標準入力された加減算を計算し、答えを標準出力する処理を実装しました。

## プログラミング問題
>正しい数式を表す文字列 S が与えられるので、その数式を計算した結果を出力してください。ただし、出てくる計算は足し算・引き算のみとします。

>・ 例
>・ S = "1+1"
>答えは 2 となります。

>・ S = "10+13-21+19"
>答えは 21 となります。

## 実装したソースコード
```python
# 文字列入力関数
def input_str():
  str1 = input()
  return str1

def make_array(str1):
  import re
  array1 = list(map(int,re.split('[+-]',str1)))
  return array1
# 足し算関数
def add(ans,num):
  ans += num
  return ans
# 引き算関数
def gain(ans,num):
  ans -= num
  return ans

def main():
  # 文字列の入力
  str1 = input_str()
  # 入力した文字を配列に分割する
  array1 = make_array(str1)
  # 配列の長さ
  len1 = len(str1)
  # 配列の要素変数
  p = 0
  # 回答変数
  ans = 0
  # 演算記号変数
  calc1 = ""
  for i in range(len1):
      str2 = str1[i]
      if i == len1-1:
        number1 = array1[p]
        if calc1 == "+":
          ans = add(ans,number1)
        elif calc1 == "-":
          ans = gain(ans,number1)
      if str2 == "+" or str2 == "-":
        number1 = array1[p]
        if p == 0:
            ans = add(ans,number1)
        elif p > 0:
            if calc1 == "+":
                ans = add(ans,number1)
            else:
                ans = gain(ans,number1)
        if str2 == "+":
            calc1 = str2
        else:
            calc1 = str2
        p += 1

  print(ans)


if __name__ == "__main__":
  main()

```

## 結果
![answer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/7dcc5327-bb9a-1d7c-451d-49c9520bc72f.jpeg)

# 最後に
プログラミングコンテスト過去問を記事にしました。
【勉強会資料】大規模言語モデル入門 第9章 質問応答

[大規模言語モデル入門](https://amzn.asia/d/16Wzurj ) の輪読会を開催したので、発表に使った資料を一部修正して公開します。

# 質問応答とは
ユーザーが入力する自然言語の質問に対して、適切な回答を出力するタスク。
質問応答のシステムは２種類に大別される。
* オープンブック質問応答
    * 質問文と回答の手掛かりとなる知識が書かれたテキストの両方を用いて、質問の回答を予測して出力する。
    * 文書検索と解答生成の2つのモジュールを繋げた処理が必要となる。
* クローズドブック質問応答
    * 知識源となる文書の検索や読解を必要とせず、システム（大規模言語モデル）に知識そのものを保持させることで質問応答を行う。（最近はこちらが多い。）

# ChatGPTを使ったクイズ解答システムの実装

実際のコードについては、公式のレポジトリにまとまっているので割愛。

https://github.com/ghmagazine/llm-book

実装にあたり、実務でのヒントとなりそうな部分を自分なりに整理した。
* 今回はクローズドブック質問応答にあたるタスクとなる。
* 評価指標として何を使うべきか。
    * よくある指標としては正解率やF値などがある。目的に応じて何が最適化を考えることが大事。
* 金額は入出力のトークン数で決まる。見積もりにはOpenAI製のtiktokenを使う。
    * パラメータで入出力のトークン数を調整することで、安くすることが可能。
* 文脈内学習（第4章を参照）を活用して、正解率を高めるべし。
* 幻覚（Hallusilation）に注意する。第6章で取り上げたようなエラー分析などでどのようなケースにおいて間違いが発生しているのかを確かめるべし。

# 文書検索モデルの実装
前述と同じく割愛。

実装にあたり、実務でのヒントとなりそうな部分を自分なりに整理した。
* こちらはオープンブック質問応答にあたるタスクとなる。
* 文書検索モデルの代表例として、DPRとBPRがある。
    * DPR（Dense Passage Retriever）
        * 質問とパッセージをエンコーダ（BERT）を用いて、埋め込みに変化して、それらの内積が上位となるパッセージを検索結果とする文書検索モデル
    * BPR（Binary Passage Retriver）
        * パッセージの梅凝りをバイナリ化して計算を行うようにする。

# 参考文献
- [大規模言語モデル入門](https://amzn.asia/d/3xTMT8o)
【勉強会資料】大規模言語モデル入門 第7章 要約生成


[大規模言語モデル入門](https://amzn.asia/d/16Wzurj ) の輪読会を開催したので、発表に使った資料を一部修正して公開します。

# 要約生成とは
長い文章を短くまとめた要約文を生成するタスク。言い換えると。長いシーケンスを短いシーケンスに変換する系列変換タスク。

出力形式と入力文章数に応じたタスクがそれぞれ存在する。

出力形式
| 名称 | 概要 | 特徴 |
|:-:|:-:|:-:|
|抽出型要約 |入力テキストから要約に含めるべき重要な単語や文を抽出するタスク | ・事実と異なる内容や文意を大きく取り違えるなどのエラーが少ない。<br>・情報を過度に圧縮した自然な文章を出すのは難しい。   |
| 生成型要約  |  入力テキストから新しい要約を生成するタスク（こっちが一般的らしい） |・自然な文章を生成しやすい。<br>・事実とは異なる要約を生成しやすい。 |

入力文書数
| 名称 | 概要 | 事例 |
|:-:|:-:|:-:|
| 単一文書要約 |１つの文章内容を要約するタスク|・入力テキストから要約に含めるべき重要な単語や文を抽出するタスク<br>ニュース記事の見出し生成<br>・学術論文の要旨生成|
| 複数文書要約 |複数の文章内容を1つに要約するタスク|・Twitterのツイートからイベント情報の要約<br>・特定の商品について書かれた複数の異なるレビュー集合の要約|

他にも検索エンジンのスニペットを作るなど、特定の情報に着目した要約を生成する「クエリ指向型要約」などがある。


# 見出し生成モデルの実装

実際のコードについては、公式のレポジトリにまとまっているので割愛。

https://github.com/ghmagazine/llm-book

実装にあたり、実務でのヒントとなりそうな部分を自分なりに整理した。
* 実装するとしても、うまくいくタスクなのかの見極めや手法の選択が重要。
    * そもそも記事本文から見出しを生成できるか。
    * 見出しに含まれるごくが本文中に現れているか。
    * 抽出型要約と生成型要約のどちらのタスクで解くべきか。

# テキスト生成における探索アルゴリズム
テキスト生成における探索アルゴリズムが存在する。
* 全探索
    * すべてのトークン系列の生成確率を計算し、その中でもっとも確率が高くなるトークン系列を探索する方法。
    * 計算量が膨大になるので、基本はあまり行わない（はず）。
* 貪欲法
    * 各トークンの生成時点で最も確率の高いトークンを選択する方法
    * 各生成時点では最適でも、全体の最適ではないこともあるので注意が必要。
* ビームサーチ
    * 各トークンの生成時点で、特定の数だけ候補（ビーム幅）を残しておき、最終的に全体で最も高い確率となるトークン列を選択する方法。
    * 貪欲法より「適した」トークン列を探索できるが、「最適な」トークン列を得ることは保証されない。

# サンプリングを用いたテキスト生成
確率の高いトークン列を生成することはできるが、全体的に類似したテキストを生成しがちな問題がある。複数パターンから選びたい時は、トークンの生成確率に基づいて、無作為にトークンを選択するサンプリングを行うことで、これを表現できる。

サンプリングによるモデルの制御を行う場合、**温度付きソフトマックス関数**を使うことで調整ができる。
確率分布のなだらかさを調整するイメージで、これにより解答内容の「適切さ」と「多様さ」のどちらに寄せるかを制御することができる。

また、サンプリングには下記のような方法がある。
* top-kサンプリング
    * 確率の高いK個のトークンを候補として抽出し、それらとのトークンに確率を再分配して、トークンをサンプリングする方法
* top-pサンプリング
    * 確率の高いトークンから順に累積確率がpを超えるまで、生成する候補の集合にトークンを追加し、この集合に確率を再分配してサンプリングを行います。

# 長さを調整したテキスト生成
* 最小・最大トークン数を指定して、生成するテキストの長さを調整することも可能。「文字の長さ」ではなく「トークン数」を調整することに注意が必要。
* fixed_model_pipelineのmin_new_tokens, max_new_tokensで調整可能。

# 参考文献
* [大規模言語モデル入門](https://amzn.asia/d/3xTMT8o)
ABC172の包除原理をなるべくわかりやすく説明してみる

## はじめに
ABC172の[E - NEQ](https://atcoder.jp/contests/abc172/tasks/abc172_e)で包除原理を勉強していたところ、かなり理解するのに苦労してしまったので自分の言葉で整理しておきたいと思い、この記事を書きました。同じように苦しんでいる方の一助になれば幸いです。

## 本題

### 問題文

$1$ 以上 $M$ 以下の整数からなる長さ $N$ の数列 $A_1,A_2,\cdots ,A_N$ と $B_1,B_2,\cdots ,B_N$ の組であって、以下の条件をすべて満たすものの個数を求めてください。
* $1\le i\le N$ なる任意の $i$ について $A_i\neq B_i$
* $1\le i\lt j\le N$ なる任意の $(i,j)$ について $A_i\neq A_j$ かつ $B_i\neq B_j$
 
ただし、答えは非常に大きくなる可能性があるので、$(10^9+7)$ で割ったあまりを出力して下さい。

### 制約

* $1\le N\le M\le 5\times 10^5$
* 入力はすべて整数

<br>
包除原理は以下が成立するという原理です。（$N=3$ の場合を考えてみると理解しやすいと思います.）

> 集合 $X$ の要素の個数を $|X|$ とすると集合の列 $X_1,X_2,\cdots ,X_N$ に対して以下が成立する.
>
> $$\begin{align}\left |\ \bigcup_{i=1}^{N}\ {X_i}\ \right | & = \sum_i{|X_i|} - \sum_{i<j}|X_i \cap X_j| + \sum_{i<j<k}|X_i\cap X_j\cap X_k| - \cdots \\\\ &\qquad+(-1)^{N+1}|X_1\cap X_2\cap \cdots\cap X_N| \end{align}$$

原理をなるべくそのままの形で適用することを**易しい説明**とする方針で書いていきます。

一つ目の条件より、以降は $1$ 以上 $M$ 以下の相異なる要素からなる数列を**良い数列**とします。

二つ目の条件について考えます。良い数列の組 $(A,B)$ からなる全体集合を $U$ としたとき、集合の列 $X_i\subset U\ (i=1,2,\cdots ,N)$ を $X_i := \Bigl\lbrace (A,B)\ \Big| \ A_i=B_i \Bigr\rbrace$ という風に定義してみましょう。このようにすることで求める値は $$\left | \overline{X_1\cup X_2\cup X_3\cup \cdots \cup X_N} \right|$$ であることがわかります。少し変形していくと
$$\begin{align} \left | \overline{X_1\cup X_2\cup X_3\cup \cdots \cup X_N} \right| &= \big|U\big| - \left | X_1\cup X_2\cup X_3\cup \cdots \cup X_N \right| \\\\ &= ({}_M P_N )^2 - \left | X_1\cup X_2\cup X_3\cup \cdots \cup X_N \right|\end{align}$$ とできるので後ろの部分を包除原理で求めていきましょう

$$\begin{align}\left | X_1\cup X_2\cup X_3\cup \cdots \cup X_N \right | = & +\sum_i{|X_i|} \\\\ &- \sum_{i<j}|X_i \cap X_j| \\\\ &+ \sum_{i<j<k}|X_i\cap X_j\cap X_k| \\\\\ &- \cdots \\\\ &+(-1)^{N+1}|X_1\cap X_2\cap \cdots\cap X_N| \end{align}$$

$k$行目$\ (j=1,2,\cdots ,N)$ に$k$個選んだときの積集合を足し合わせている項を置いて考えると、$k$行目では${}_N C_k $個の項が足されていることがわかります。ここで、$X_1,X_2,\cdots ,X_N$から$k$個をどのように取り出しても**対称性**から積集合の要素の個数は一定になります。つまり、$k$行目ではその行で固有のある定数を${}_N C_k $回足していることになります！これは$k$の値のみに依存するため$f(k)$とおきましょう。$\left(\left | X_1\cup X_2\cup X_3\cup \cdots \cup X_N \right | = \displaystyle\sum _{k=1}^{N}\ (-1)^{k+1}\{}_N C_k \cdot f(k)\right)$ となっています。

$f(k)$ を求めましょう。良い数列 $A$ と $B$ で一致する場所がすでに $k$ 個選んであるので、そこに入れる整数の選び方が $ {}\_M P\_k $ 通り、残りの $N-k$ 個の場所に $A$ と $B$ それぞれにまだ入れていない整数を入れる方法の総数が $({}\_{M-k}P\_{N-k})^2$ 通りあるので $$f(k)={}\_M P\_k\ ({}\_{M-k}P\_{N-k})^2$$ とわかります。よって答えは $$({}\_MP\_N)^2 - \sum_{k=1}^N{(-1)^{k+1}{}\_NC\_k\cdot {}\_MP\_k\cdot ({}\_{M-k}P\_{N-k})^2}$$
とわかります。これは $0!,1!,2!,\cdots ,M!$ と $(0!)^{-1},(1!)^{-1},(2!)^{-1},\cdots ,(M!)^{-1}$ を $\pmod{10^9+7}$ で事前に計算しておくことで $O(M)$ で求まります。

## ACコード（Python）
$\pmod{P}$ においてある整数ひとつの逆元を計算するのは $O(\log P)$ かかりますが、$1\le a\le N$ なる $a$ の逆元 $a^{-1}$ を列挙するのには $O(N)$ のアルゴリズムが存在します。

https://atcoder.jp/contests/abc172/submissions/54540414

## さいごに
* 僕が見つけた記事には包除原理を使うための集合を具体的に設定しているものがなかったので、それで困っている人に届けばと思います。
* 包除原理をもっと勉強していきます。