OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 294 D問題　解説(Pythonコード付)

# はじめに　
　本記事はPythonでAtcoderにチャレンジしているけど、Pythonはコード例がないため解説がわかりにくい！と感じている方を対象としています。 
　私自身大してレートも高くないので、不備等あるかもしれませんがご了承くださいm(_ _)m
　質問や指摘などもコメント等に書いてくださったら対応していきたいと考えていますのでどしどしコメントしてください。(内容がわかりにくいぞ！みたいな文句でもオールオッケーです笑)
# AtCoder Beginner Contest 294 D問題
　問題のURLはこちらです。[AtCoder Beginner Contest 294 D問題](https://atcoder.jp/contests/abc294/tasks/abc294_d)
# 使う手法　

 今回は**優先度付きキュー**を使っていきます。
 優先度付きキューはデータ構造の一つで、一般的なキューは配列に入れた順番通りにタスクを処理しますが、これに優先度をつけてることで処理する順番を変えていきます。　
　詳しくは[こちら](https://qiita.com/ell/items/fe52a9eb9499b7060ed6)を見てみてください。
 
# 考え方 
　今回の問題は、優先度付きキューである「called」と、集合型である「go」の二つのデータ構造を使って状態を管理していきます。「called」はすでに呼び出された人間を格納し、「go」は受付に向かった人を格納します。　
　クエリに沿って見ていくと、クエリ1が発生した際には一番小さい値の人をcalledに格納し、クエリ2が発生した際には呼び出された人の値をgoに格納し、クエリ3が発生した際にはcalledから値を取り出し、goに格納されていなければその値を出力する、といった形で処理を行なっていきます。　
　Pythonではheapqと呼ばれるライブラリがあり、こちらで作成した優先度付きキューは値が最も小さいものをpopできるので、今回はこちらを用いてコーディングを行なっていきます。

# 実装例　
```python
import heapq
#標準入力 
n,q = map(int,input().split())
#状態を管理するcalledとgoの作成
called = list()
go = set()

#calledを優先度付きキューに変換
heapq.heapify(called)

#呼ばれていない人の中で、最小の値を管理する。初期値は1であり、クエリ1が実行されるたびに+1していく。
min_num = 1
 
for _ in range(q):
　#クエリの受け取り
  eve = list(map(int,input().split()))
  if eve[0] == 1 :
　　#min_numをcalledに追加する。
    heapq.heappush(called,min_num)
    min_num += 1
  elif eve[0] == 2 :
    #受付に行った人の値をgoに追加する。
    go_num = eve[1]
    go.add(go_num)
  else :
    booler = True
    while booler :
　　　 #calledから値が最も小さなものを取り出す。
      k = heapq.heappop(called)
　　　 #取り出した値がgoに格納されているか調べる。
      if k not in go :
        print(k)
        booler = False
　　　　　#取り出した値は消えてしまっているため、ここで一度追加する。
        heapq.heappush(called,k)
        break
```

# 最後に　
　上に挙げたコードをPythonで実行すると、2問ほどTLEになってしまいます。なので、上記のコードを実行する際には言語をPyPyにして実行してください。
　久々の投稿で、文章がわかりにくいところもあると思うので、その時は遠慮なくコメントしてくださいm(_ _)m
Googleデジタルマーケティング＆Eコマース：ウェルカム・メール

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# ウェルカム・メール

ウェルカム・メールは、新規の顧客や購読者に送るメールです。

ウェルカム・メールは、相手に対する第一印象のようなものだと考えてください。もし、あなたが誰かを初めて家に迎え入れるとしたら、どのようにするでしょうか？ 水やスナックを出すかもしれません。それと同じように、ウェルカム・メールを送るときにも気を配りたいものです。

ウェルカム・メールは、マーケティングファネルの中の「検討」ステージに入ります。このステージは、ユーザーが既にマーケティングメールの購読を選択した状態であることを忘れないでください。つまり、彼らはより多くの情報を求めているのです。購読をクリックすることで、これらの顧客はあなたのビジネスに関する追加情報を受け取りたいと判断したことになります。この時期は、潜在顧客が購入したいと思うような商品やサービスを送ることで、リードを育成する絶好の機会です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6e48259a-790b-c59f-e054-8cbae7b8f162.png" width="600">

ウェルカム・メールを作成する際には、

- あなたの何を知ってもらいたいか？
- あなたのビジネスのアイデンティティのどの部分が、絶対に含まれていなければならないか？

### <font color="MediumBlue">会話調の魅力的な文章</font>

良いウェルカム・メールには、会話調の魅力的な文章が含まれています。そして、あなたのブランドの特徴やブランドストーリーを簡潔に伝えることです。

### <font color="MediumBlue">コール・トゥ・アクション</font>

ウェルカム・メールには、コール・トゥ・アクションも含まれるべきです。コール・トゥ・アクションとは、お客様に次に何をすべきかを簡潔に伝える指示です。

- 例えば、商品を購入するよう促す文章や、「はじめに」と書かれたメール内のボタンをクリックすると、ランディングページに移動し、そこでアカウントを作成できるようにするなど、さまざまな方法があります。コール・トゥ・アクションを控えめにするか、より直接的なものにするかは、購読者が何をよく利用するかによります。

## 送信タイミング

- 初めての購読者や製品を購入した顧客に感謝するとき
- アプリをダウンロードした際に、初めてアプリを使用することを促すとき
- ウェルカム・メールに割引コードを記載し、商品の購入を促すとき

## ウェルカム・メールの例

以下のキッチン用品の会社から届いたこのメールは、まさにウェルカムメールのあるべき姿です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/26bc123d-a8eb-37af-c239-b2ac8fdd7a47.png" width="600">

まず、送料無料コードのようなインセンティブをトップで提供しています。送料無料のコードを提示することで、あなたが食器の購入ボタンをクリックする可能性が高くなることを知っているのです。これは素晴らしい戦略です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/a22c16e7-536e-8cb6-29ec-30dfa7e95ad2.png" width="400">

そして、このメールには、創業者が直接書いた会社の背景についての手紙が含まれています。これは個人的なタッチを加えるだけでなく、メールのコピーを会話的で魅力的なものにします。特に創業者からのメモでは、創業者がすべての食事に特別感を与えるという会社の目標について触れています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f59d19c0-76d3-5ad5-d316-1d071b4d56f1.png" width="400">

最後に、ソーシャルメディアへのフォローとオンラインショップへの誘導を促すことで、このメールは締めくくられます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6173936e-9afe-1601-3099-653ab5057c88.png" width="400">
【VBScript】静的配列と動的配列について



# 目次

[1. はじめに](#1はじめに)
[2. 環境](#2環境)
[3. 静的配列と動的配列の違い](#3静的配列と動的配列の違い)
[4. 配列の初期化](#4配列の初期化)
[4-1. 静的配列](#4-1静的配列)
[4-2. 動的配列](#4-2動的配列)
[5. 参考](#5参考)
[6. おわりに](#6おわりに)

# 1.はじめに

現在VBScriptを実務で使用しています。VBSCriptでは配列の種類が複数あります。

今回はVBScriptの静的配列と動的配列についてまとめます。


# 2.環境

- Windows 11 Pro 22H2
- Microsoft-IIS/10.0
- ASP 5.8 (16384)

# 3.静的配列と動的配列の違い

| 項目 | 内容 | 
|:-----------|:-----------|
| 静的配列| 要素数が決まっているときに使用する | 
| 動的配列| 要素数が決まっていないときに使用する|

▼静的配列
配列を宣言するときに、（）内に最大の要素数を入れます。

```vb
Dim arr(2)
arr(0) = "a"
arr(1) = "b"
arr(2) = "c"

Response.Write(arr(2)) '-> c
Response.Write(arr(3)) '-> 宣言していないのでエラー
```
最大の要素数を入れずに宣言をした場合、エラーになります。
```vb
Dim arr()
arr(0) = "a"
arr(1) = "b"
arr(2) = "c"

Response.Write(arr(2)) '-> エラー
```

▼動的配列
配列を宣言するときに、（）内に最大の要素数を入れます。

```vb
Dim arr() '何も指定しない※このときの要素数は0

Redim arr(2) ' ()内に最大の要素数を入れる
arr(0) = "a" 
arr(1) = "b"
arr(2) = "c"

Response.Write(arr(2)) '-> c
```
`Redim 配列名（最大の要素数）`とすると、動的配列の要素数を変更することができます。

:::note warn
Redimを使用すると、配列のデータは全て削除されます。
格納されているデータを残したまま要素数の変更をしたい場合は、
`Redim Preserve 配列名（最大の要素数）`とします。
:::

▼Redim

```vb
Dim arr() '何も指定しない※このときの要素数は0

Redim arr(2)
arr(0) = "a" 
arr(1) = "b"
arr(2) = "c"

Response.Write(arr(2)) '-> c

Redim arr(3)
arr(3) = "d"
For Each a In arr
    Response.Write a 'a～cは削除されてdのみ
Next
```

▼Redim Preserve

```vb
Dim arr()
Redim arr(2)
arr(0) = "a" 
arr(1) = "b"
arr(2) = "c"

Response.Write(arr(2)) '-> c

Redim Preserve arr(3)
arr(3) = "d"
For Each a In arr
    Response.Write a '-> a～d
Next
```


# 4.配列の初期化

配列の初期化は`Erase 配列`と書きます。

:::note warn
**なぜ初期化を行うのか？**
→もしも初期化をしない状態でその変数を用いて演算処理を行おうとすると、
例外（実行時エラー）が発生し、プログラムが止まってしまうため
:::

## 4-1.静的配列

すべての要素が空の文字列になります。要素数は変わりません。

```vb
Dim arr(2)
arr(0) = "a"
arr(1) = "b"
arr(2) = "c"

For Each a In arr
    Response.Write a　'-> a～c
Next

Erase arr
For Each a In arr
    Response.Write a ' 何もなし
Next

Response.Write(UBound(arr)) '-> 2(最大値の要素数)

If IsArray(arr) Then
    Response.Write "True" '配列なのでTrue
Else
    Response.Write "False"
End If
```

## 4-2.動的配列

メモリを開放します。要素数は0になります。

```vb
Dim arr()
Redim arr(2)
arr(0) = "a"
arr(1) = "b"
arr(2) = "c"

Redim Preserve arr(3)
arr(3) = "d"
For Each a In arr
    Response.Write a '-> a～d
Next

Erase arr ' 配列の初期化（メモリを解放）
For Each a In arr
    Response.Write a　'何もなし
Next

If IsArray(arr) Then
    Response.Write "True" '配列なのでTrue
Else
    Response.Write "False"
End If
```


# 5.参考

https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/w8k3cys2(v=vs.110)

https://step-learn.com/article/vbscript/047-array-redim.html

https://uxmilk.jp/48990

https://step-learn.com/article/vbscript/046-array-erase.html

https://style.potepan.com/articles/3356.html


# 6.おわりに

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。
【Tableau】Null値の表示を別の文字へ変更する

# はじめに
こんにちは。
今回はTableau初心者向けの小ネタとして、
Null値のデータを別の文字列に置換する方法をお伝えします。
※ver2022.3を使用

# メジャーのNull置換
メジャー(数値項目)にNullがある場合は、書式設定から置換可能です。

以下のようなシートを作成してみました。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/77e35599-aec0-42e1-211a-d12d21f47ac8.png)
※データソースは「サンプルスーパーストア」(ダミーデータ)を、一部データを削除して使用。

赤枠部分にNullのデータが含まれています。
Nullの場合は「-」を表示するよう設定してみましょう。

①Null値の置換を行うメジャーのフィールドを右クリックし、書式設定をクリックします。
②「ペイン」タブで「特殊な値」内の「テキスト」へ「-」と入力します。
![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/7ffa3005-78b8-ff6b-1a55-615860baf553.gif)
 
# ディメンションのNull置換
ディメンション (分析軸などの項目)にNullがある場合は、計算フィールドを使用する必要があります。

下のようなシートを作成してみました。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/995214cf-1632-2c92-ea15-575b5b2294af.png)
先ほどとは異なり、文字列型ディメンションのフィールドにNullが含まれています。
この場合は書式設定でのNull値の置換はできないため、計算フィールドを使用します。

①Null値の置換を行うフィールドを右クリックし、「作成」-「計算フィールド」をクリックします。
②計算フィールド名と計算式を編集します。
　今回は顧客名がNullの場合は「-」を表示させるIF分を作成します。
```
IF ISNULL([顧客名]) 
 THEN "-"
 ELSE [顧客名]
END
```
③Null値の置換を行うフィールドを、①と②で作成した計算フィールドに置き換えます。
![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/33778450-286b-8b0c-0ca0-0eda3235ccdf.gif)

# おわりに
今回はTableau初心者向けの小ネタとして、
Null値のデータを別の文字列に置換する方法をお伝えしました。

以上となります。
最後までご覧いただきありがとうございました。
【Github】Github Educationに三度目の正直で通ったのでメモ

# GitHub Educationとは?
GitHub Educationっちゅうのはまぁその名のとおり学生向けプランで、本来企業向けの有償機能をある程度制限はありつつも無料で利用できるものです。Azureのクレジットの他、JetbrainsユーザーであればSpaceやIDEのUltimate版を利用することもできます。

https://blog.jetbrains.com/ja/2019/08/22/2105/

# 申請方法
Githubは日本で割と使われてますが、いうて海外の企業なので申請は全部英語です。日本語でもごり押しできるかもですが基本はじかれます( ﾉД`)ｼｸｼｸ…。

詳しい方法は別の記事だったりググってもらえばわかるのですが(じゃあなぜ書いた)、コツとしては上記のとおり英語で行くことです。審査のための身分証も英訳したものを隣において撮影する必要があります。とはいえどわかればいいレベルなので、Deeplとかの機械翻訳で十分です。

タイミングにもよりますが、なぜか深夜に申請すると一瞬です。(アメリカ時間だから?)

まとめると、
> - 基本英語申請
> - 身分証も英訳をする
> - 深夜に申請すると早い

ですかね。

それでは良きGitHubライフを。

## 参考

[たいしん](https://qiita.com/SNQ-2001)様の記事から

https://qiita.com/SNQ-2001/items/796dc5e794ac3f57a945
dotnet publishコマンドで発行プロファイル（.pubxml）を指定してフォルダ配置を行う方法

```dotnet publish```コマンドを使い、発行プロファイル（.pubxml）を指定して、```WebPublishMethod=FileSystem```による発行を行う場合の注意事項をメモ書きでまとめる。

尚、この内容は.NET Core 3.1と.NET 5環境で試しているが、様々な要因が重なっており、何が影響を及ぼしているのか完全には分かっていない為、間違っている可能性も高いことに留意されたい。

今後間違いに気づいた場合はこの記事を随時修正していく。

参考URL:.NET6での発行プロファイルによるコマンドライン発行
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-6.0


# 私が良く使うコマンドライン引数の例

```
dotnet publish App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 -p:EnvironmentName=Production --output "C:\deploy\Release\App1"
```

以下に一つ一つ説明する。


## ```-p:```の引数は、msbuildに渡される引数

```dotnet publish```が行っているのは、msbuildを内部的に呼び出してビルドを行い、結果を指定場所に発行する、という処理になる。
その為、msbuildに渡す引数を```-p:PropName=PropValue```で指定できる。

## ビルド構成の指定（Release/Debug/Staging）

-p:Configuration はビルド構成を与えるオプションであり、-c と同じように見えるが、参考URLによれば publishの場合はこちらを指定するらしい。
逆に```dotnet build```では -c オプションを指定する。直感的には逆じゃないのかと思ってしまう。

コマンドの実行結果にdllの出力結果がフルパスで表示されるので、そこが正しく「Release」（Releaseビルドを指定した場合）になっているかを確認すること。

## -p:PublishProfileに指定するのは「プロファイル名」

- profile1.pubxml ではなく profile1
- フルパスで指定する方法はいまだにわからない

尚、.csprojのパス指定はカレントディレクトリからの相対パスで行けるが、その場合でもこのPublishProfile指定は「プロファイル名」だけで良い。
対象のプロジェクトが決まったら、そこから```Properties/PublishProfiles/{PROFILE NAME}.pubxml```が検索されるようだ。

```
dotnet publish App1/App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 -p:EnvironmentName=Production --output "C:\deploy\Release\App1"
```

注意点として、プロファイル名の指定が間違っていても、コマンドはエラーを吐いてくれない。
なので、例えば```<EnvironmentName>hogehoge</EnvironmentName>```をpubxmlに指定し、出力結果のweb.configに正しく```hogehoge```がASPNETCORE_ENVIRONMENTとして設定されているか確認することで、コマンドが正しくプロファイルの場所を認識しているか確認すると良い。

## pubxmlのPublishUrlは無視されるので--ouputオプションを指定する

```xml
<PublishUrl>C:\deploy\Release\App1</PublishUrl>
```

上記のように書いてあっても無視され、出力先は以下のように```bin\{PROJECT CONFIGURATION}\{TARGET FRAMEWORK MONIKER}\publish\```というフォルダとなる。
（この例は、.NET5.0で、win-x64向けのReleaseビルドを行った場合）。

```
bin\Release\net5.0\win-x64\publish\
```

```dotnet publish``` コマンドの引数に```--output "C:\deploy\Release\App1" を追加すると、出力先を指定できる。

```
dotnet publish App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 --output "C:\deploy\Release\App1"
```

## EnvironmentNameの設定

ASPNETCORE_ENVIRONMENT環境変数を指定する為の設定。web.configに反映され、最終的にはappsettings.*.jsonの選択が行われる（Developmentならばappsettings.Development.jsonが追加で読み込まれて反映される）。

基本的には、pubxmlにEnvironmentNameプロパティを追加する。

```xml
<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
```

ちなみに、EnvironmentNameプロパティがないpubxmlを```dotnet publish```を使って発行したら、web.configに```Development```が書き込まれた。
この値がどこからやってきた規定値なのか今のところわかっていない。

また、コマンドラインから指定する場合、次のように書く。こうすると、pubxmlの値を置き換えて実行できる。

```
dotnet publish App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 -p:EnvironmentName=Production --output "C:\deploy\Release\App1"
```

## pubxmlの値をコマンドライン引数で置きかえできるかは試してみないとわからない

これまで見てきたように、<XXX>aaa</XXX>というpuxmlのプロパティは、```-p:XXX=aaa```というコマンドライン引数で置き換えできることが多い。
しかし、どのプロパティが置き換え可能かは、実際に実験してみないとダメだろう。

# トラブルシューティング

## .StaticWebAssets.xml" は見つからなかったためコピーできません

このエラーが出たら、dotnet restore を試してみると良い。

```
dotnet restore
```
Googleデジタルマーケティング＆Eコマース：アクイジション・メール

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# アクイジション・メール

企業として、より多くの顧客を獲得することが大きな目標の一つである可能性が非常に高いです。

- 顧客を獲得するための戦略とは何でしょうか？
- どのようにすれば、人々が行動を起こすほど興味を持つようになるのでしょうか？
- どのようにすれば、潜在顧客を既存顧客に変えることができるのでしょうか

これらの疑問に対する答えが、メール・マーケティングにおける「アクイジション・メール」です。

アクイジション・メールは、新規顧客を獲得するために送られるメールであり、企業の成長には欠かせないものです。マーケティング・ファネルと関連づけると、アクイジション・メールは認知ステージに含まれると考えてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/2bc74b9c-37f3-38ee-764b-e559aac96e6e.png" width="600">

良い顧客獲得メールの秘訣は、潜在顧客が欲しいと思う前に、何かを与えることです。必ずしも物質的なものである必要はありません。

- ダウンロード可能なガイド、製品カタログ、PDF、無料トライアルなどのアイテム
- 間接的な褒め言葉、ポジティブな言葉など、相手が気持ちよくなるようなもの
- 新しい情報、教育的な情報
- あなたの製品がどのようなものであるかを紹介

### <font color="MediumBlue">メールコピー</font>

アクイジション・メールにおいて、成功するキャンペーンと失敗するキャンペーンの違いを生むもう一つの側面は、コピーです。アクイジション・メールでは、すでに興味を持っているけれども、まだその製品に完全にはコミットしていない人に向けて発信していることもあります。しかし、多くの場合、そのメールはこれまで一度もあなたのブランドと接触したことのない、まったく新しい受信者に送られるものなのです。

気の利いた、ユニークで包括的なコピーを使うことで、大きな違いを生み出すことができるのです。メールコピーとは、メールの本文と件名のことを指します。

## アクイジション・メールの例

### １

以下のメールでは、ソーシャルメディア上の写真やビデオを編集する会社から、注目を集めるソーシャルメディアビデオの作り方を紹介しています。これは素晴らしい例で、潜在顧客に新しいものを提供しようとしていることがすぐにわかります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d2e6eae4-6b97-0191-3b04-f13b85207889.png" width="600">

- 季節感やムードといったトピックを使って、オーディエンスがより魅力的な投稿をする方法について具体的な説明がされています。
- 短い文章で、ストレートにオファーを伝えています。
- 「Spring into action with video（動画で行動を起こそう）」という言葉をトップに使っているのは、言葉遊びのようなものです。

新しい季節の到来と、動画投稿による迅速なアクションの両方を顧客に促しています。

### ２

次に、こちらの化粧品会社では、お客様が自分のスキンケアに合う製品をマッチングさせることができるインタラクティブなメールを配信しています。この企業は、インタラクティブなメールにすることで、見込み客に自分だけの貴重な情報を提供し、その情報をもとに購買につながるようなオファーを出しています。このメールが効果的なのは、メッセージ全体を通して明確なコール・トゥ・アクションを使用しているためです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6a1ae104-ad9d-28c0-1a2c-576bf74b4a77.png" width="600">

- ページ上部のバナーでは、今すぐ購入すると10％OFFになるキャンペーンを実施しています。
- 本文の各アイテムの下には、小さな「Shop Now」ボタンがあります。
- 割引だけでなく、ミニスキンケアレッスンも受けられるのです。
- 最後に、このメールに添えられた件名は、「Our number 1 most asked question」となっており、興味を持った人がクリックし、自分も経験したことのある質問かどうかを確認するよう促すティーザーとしての役割を担っています。これは、メールを開いてもらうことで、顧客に一歩近づくための素晴らしい戦術なのです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4bf2a8fa-e1b6-1022-f07d-73ac266db4f4.png" width="600">
デモ

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="YzOONjw" data-user="otomadddd888888" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/otomadddd888888/pen/YzOONjw">
  Untitled</a> by glass (<a href="https://codepen.io/otomadddd888888">@otomadddd888888</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
多項式(x+1)^2023をx^2で割った余り「2023立教大学」をwolframalphaとsympyでやってみた。

WolframAlphaにPolynomialMod関数がありました。
sympyにdiv関数がありました。
多項式を忘れていました。

オリジナル

https://www.youtube.com/watch?v=N2PZKW-H3RQ

大学入試数学問題集成＞テキスト
未登録

# wolframで

https://www.wolframalpha.com/input?i=PolynomialMod%5B%28x%2B1%29%5E2023%2C+x%5E2%5D&lang=ja

# wolframで(失敗例)
できると思いましたが、できませんでした。
判別？(気を利かし）してはくれませんでした。

https://www.wolframalpha.com/input?i=%28x%2B1%29%5E2023+mod+x%5E2&lang=ja

標準の計算時間制限を超えました...mathematicaならできますか？

https://www.wolframalpha.com/input?i=%28x%2B1%29%5E2023+%E3%82%92x%5E2+%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E4%BD%99%E3%82%8A&lang=ja

https://www.wolframalpha.com/input?i=%E5%A4%9A%E9%A0%85%E5%BC%8F%28x%2B1%29%5E2023+%E3%82%92%E5%A4%9A%E9%A0%85%E5%BC%8Fx%5E2+%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E4%BD%99%E3%82%8A&lang=ja

# sympyで(【なぜ数】なぜを深堀る高校数学様の方法で)
「多項式に関する剰余の定理（じょうよのていり、英: polynomial remainder theorem）」を勉強中

# sympyで
div関数でできました。modでは、できませんでした。

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
```python
from sympy import *
x=Symbol('x',real=True)
print("#",Mod((x+1)**2023,x**2))
print("#",div((x+1)**2023,x**2))
# Mod((x + 1)**2023, x**2)
# (途中省略.... ,2023*x+1)
```
③web上で、上記のソースをコピー貼り付けでも、できました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
計算時間は約2分です。資源の無駄使い。ごめんなさい。

https://live.sympy.org/



# 参考

https://reference.wolfram.com/language/ref/PolynomialMod.html

https://www.google.com/search?q=wolframalpha.com+%E5%A4%9A%E9%A0%85%E5%BC%8F+%E5%89%B2%E3%82%8A%E7%AE%97&rlz=1CAUHAM_enJP1038JP1038&oq=wolframalpha.com+%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%80%80&aqs=chrome.1.69i57j33i160.24009j0j7&sourceid=chrome&ie=UTF-8

https://showa-yojyo.github.io/notebook/python-sympy/polynomials.html#id4

https://www.google.com/search?q=sympy+poly+div&rlz=1CAUHAM_enJP1038JP1038&oq=sympy+poly+div&aqs=chrome..69i57j33i160l2.14593j0j7&sourceid=chrome&ie=UTF-8


https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E3%81%AE%E5%AE%9A%E7%90%86#:~:text=%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E5%89%B0%E4%BD%99%E3%81%AE%E5%AE%9A%E7%90%86,a)%20%E3%81%A7%E3%81%82%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E5%AE%9A%E7%90%86%E3%80%82

https://en.wikipedia.org/wiki/Polynomial_remainder_theorem
ChatGPT でプログラマが不要になるの？

# プログラム組めるなら、Excel のワークシート関数位楽勝でしょ？
今日は単なる愚痴です。
Twitter で **「ChatGPT でプログラマが不要になる！」** と話題になっていたので、「プログラムが組めるのなら、Excel のワークシート関数ぐらい楽勝でしょ？」と思ったんです。
会社の上席者からよく「こうなる様な関数組んで〜」という相談が結構あるので、そういう面倒を ChatGPT に投げれるなら、楽になると思ったわけです。
## 頼むよ、ChatGPT
A〜Fのセルの内容に対して
+ その内容が **①のパターン** の時は、EとDにこういう結果
+ その内容が **②のパターン** の時は、EとDにこういう結果
+ その内容が **③のパターン** の時は、EとDにこういう結果
+ その内容が **④のパターン** の時は、EとDにこういう結果

となるような関数を教えてという風にお願いしたら、①〜④のパターンそれぞれのパターンの関数を記載するんですよ。
「①〜④のパターンを同時に満たす関数を教えて」
とお願いしても、余り状況が変わらず。
最終的には、こんな風に言われてしまいました。
`Something went wrong. If this issue persists please contact us through our help center at help.openai.com.`
## 効き方が悪かったのかもしれない・・・
Google での **ググり方** にもコツがあって、コツをつかんでる人は目的の情報に早くたどり着けますが、そうじゃないと検索結果から目的の情報を探す時間が膨大になります。
何となくですが、ChatGPT も聞き方が悪いと希望の答えが返ってこない気がします。
どちらにしても、誰もが気軽に使えるようになるには、まだ少しかかりそうな予感。
# プログラマが不要になるのは、何時でしょうかね？
昔 BASIC でプログラムを組んでた時に、行番号がなぜ「10きざみ」なのか。
```BASIC:変更前
10 A=1
20 A=A+1
30 IF 10>A THEN GOTO 20
40 PRINT A
```
ここで行番号10と20の間に処理を追加したくなった時、20以降の行番号を全てずらすと大変ですし、GOTO文の行番号が変化して直すのが超大変。
```BASIC:変更後
10 A=1
15 INPUT "加算する数値を入力";B
20 A=A+B
30 IF 10>A THEN GOTO 20
40 PRINT A
```
その時は、上記の様に間の番号を使えば良いんです。その理由を聞いたときは「凄い、頭良い！」って思ったんです。
しかし、そも行番号を書かなければならない言語系と言うのがナンセンスだと気が付いたときには、昔の感心は何だったんだと思いましたね。
まぁ、当時のマシンスペックだとこうなっちゃうんでしょうけど。
しらんけど。
-個人開発-　思い立ったが吉日

# 個人開発してみたよ＾＾

### 作ったものみてくだ祭

サイト名：NetaNeta
サイトリンク：https://www.netaneta.jp
対象ユーザー：YouTubeリスナー、YouTuber（全層向け）、TikTokリスナー、TikToker、配信者、VTuber、ニコニコリスナー、ニコ生主etc...
使用用途：企画を思いついた時、企画が見つからない時、暇つぶし

サイト紹介：
╭━━━━━━━━━━━━━━━━━━━━━━╮
　全YouTubeリスナーの『見たい』を募り、
　全YouTuberに企画を届け、期待に応える。
╰━━━━━━━━━━━━━━━━━━━━━━╯
　↑をコンセプトに動画企画を投稿できるSNS

![100-400.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019677/11f7f9ed-b1a1-b505-c982-d5aff01ad0e1.jpeg)
![posts.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019677/836612ed-3ffb-a994-71bf-d705b0dce58e.jpeg)

まだまだ改善の予知ありですが、頑張って作成しておりますゆえに何卒よろしくお願い致す所存

## 思い立った日
YouTubeを見ている時によく「この人にこんな企画やって欲しいな」とか、逆に「こんな企画やってる人いないのかな」と思うことがよくあり、周りの数少ない友人にも聞いたところおもったことがあるという友人が多かったので、これ大体の人１つくらいは「やって欲しい企画」考えたことあるんじゃね？そう思いました。

そこでリスナーが企画を投稿できるSNSサイトがあったら最強なのでは？と思い立ち
プログラム初心者のわたくしは独学で勉強しながらSNSサイトの作成を始めました

## 吉日じゃなかった日々 ／ 結果吉日
初心者のため環境構築すらままならなく、開発環境構築の３ヶ月の期間を要してしまい（通常は長くても１時間程度）NetaNetaの作成をなんども諦めそうになりながらも必死に作り完成させました！！
制作チームはわたくし１人だったために1週間のうち３日程度しか寝れない週が続きとてもしんどかったですが、１つまた１つ機能が増えていくたびに喜びが増えていきどんどん楽しくなっていきました＾＾



なのでもしこれを見ていただいて興味が湧いたら一度
NetaNeta（https://www.netaneta.jp）
を見ていただきたいです。
そして、記事にできると感じていただけたら記事にしていただきたいです。
厚かましい要望で申し訳ありませんがよろしくお願いいたします。
paiza.ioでelixir その213

# 概要
paiza.ioでelixirやってみた。
udp使ってみた。

# サンプルコード

```


{:ok, socket} = :gen_udp.open(8789, [:binary, {:active, false}])
|> IO.inspect
:ok = :gen_udp.send(socket, {127, 0, 0, 1}, 8789, "hey there!")
|> IO.inspect
:gen_udp.recv(socket, 0)
|> IO.inspect

{:ok, socket} = :gen_udp.open(8679)
|> IO.inspect
#{:ok, socket} = :gen_udp.open(8680)
#|> IO.inspect
:ok = :gen_udp.send(socket, {127, 0, 0, 1}, 8679, "hello")
|> IO.inspect
:gen_udp.recv(socket, 0)
|> IO.inspect

#flush()
#|> IO.inspect

{:ok, socket} = :gen_udp.open(8669, [:binary, {:active, false}])
|> IO.inspect
#{:ok, socket} = :gen_udp.open(8680)
#|> IO.inspect
:ok = :gen_udp.send(socket, {127, 0, 0, 1}, 8669, "hello")
|> IO.inspect
#Kernel.flush
#|> IO.inspect
:gen_udp.recv(socket, 0)
|> IO.inspect

#{:ok, socket} = :gen_udp.open(0, [:inet, :binary, active: :once])
#{:ok, socket} = :gen_udp.open(1900, [:binary, {:active, false}])
{:ok, socket} = :gen_udp.open(0, [:binary, active: :once, broadcast: true, reuseaddr: false])
|> IO.inspect
:ok = :gen_udp.send(socket, '239.255.255.250', 1900, "hello")
|> IO.inspect
:gen_udp.recv(socket, 0)
|> IO.inspect




```

# 実行結果

```
{:ok, #Port<0.5>}
:ok
{:ok, {{127, 0, 0, 1}, 8789, "hey there!"}}
{:ok, #Port<0.6>}
:ok
{:error, :einval}
{:ok, #Port<0.7>}
:ok
{:ok, {{127, 0, 0, 1}, 8669, "hello"}}
{:ok, #Port<0.8>}
:ok
{:error, :einval}
```

# 成果物

https://paiza.io/projects/dwaOdc0fF-3iXVAMIAfrWQ


以上。
stl to pcd

以下記事を参考にstlデータをpcdデータに変換しました 

https://qiita.com/haxhimitsu/items/710969f72a3019b18da1

- meshlabのインストール (参考: https://www.kkaneko.jp/tools/ubuntu/ubuntu_meshlab.html)

```
sudo apt -y install meshlab
```

- pcl_toolsのインストール

```
sudo apt-get install  pcl-tools
```

- meshlabを開いて，stlをインポート`export as name`で拡張子にobjcet fileを指定.(何故かフィアル名拡張子.offになったけどobjに変更して保存.)

- meshlab下記手順で引用の通りサイズを変更.(自分は各軸0.001倍でうまくいきました)

`Filters`→`Normarls,Cnrvatures and Orientation`→`Transform:scale`

- obj pcd 変換

```
pcl_mesh_sampling input.obj  output.pcd -leaf_size 0.001
```

- pcdファイルの確認

```
pcl_viewer output.pcd
```

![Screenshot from 2023-03-20 17-25-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/d2419ada-c0fb-89b0-0c9b-cca7582e1276.png)
macOSからmsx0へシリアルコンソール接続する一番簡単な方法

## 本題

USB で Mac と msx0 を繋いだ状態で OS 標準のターミナルで以下のコマンドを実行すれば繋がります。

```bash
screen `ls /dev/tty.usb*` 115200
```

多分これが一番早いと思います。

> M5Stackの[公式ドキュメント](https://github.com/m5stack/m5-docs/blob/master/docs/en/quick_start/m5core/m5stack_core_get_started_Arduino_MacOS.md)によると、「Click the link on the right to download the CP210X driver..」と中々面倒くさそうな手順が書かれていますが、msx0用途ならサードパーティーソフトは一切不要でscreen（OS標準コマンド）だけで問題無さそうです。

## 補足事項

- `tty.usbserial-` が複数存在する環境の場合は `ls /dev/tty.usb*` で調べて直接指定してください
- キーボード入力内容がmsx0側で表示されます
- 終了方法: `Control+A` → `k` → `y`
- M5のトレースログも表示されるようです（これはこれで便利）

> なお、この手順だとエミュレータのトレースログが拾えるようです。例えば、ディスクを挿入しない状態で files を実行してみたところ、何やら面白げな表示がされました。 _（msx0がまだプロト段階のものだからなのかもしれませんが）_
>
> ```
> files
> [ 19538][E][vfs_api.cpp:29] open():  does not start with /
> [ 19539][E][vfs_api.cpp:29] open():  does not start with /
> [ 19539][E][vfs_api.cpp:29] open():  does not start with /
> [ 19546][E][vfs_api.cpp:29] open():  does not start with /
> File not found
> Ok
> ```
>
> ちなみに、私の環境ではWiFiのAP設定がミスっているのか、以下の警告が一定間隔で出続けてましたｗ（なんで繋がらないか分からなかったので無事解決）
>
> ```
> [2593141][W][WiFiGeneric.cpp:955] _eventCallback(): Reason: 201 - NO_AP_FOUND
> ```

## 【補足事項2】セットアップユーティリティ関連の操作

- リセットボタンを押してから `esc` 連打で入れる
- M5Stack側のシステムボタンの入力は効かない
- カーソルキー（カーソル移動）とスペースキー（決定）で操作可能

## 【補足事項3】スクロールできない

デフォルトではマウスで履歴をスクロールすることができませんが `vi ~/.screenrc` で以下の行を追記すればスクロールできるようになります。

```
termcapinfo xterm* ti@:te@
```

## ぼやき

M5StackにSDカード挿した状態でMacにUSB接続したらリムーバルメディアとして認識してくれないのかな...SDカードをちまちま抜き差しするのが面倒くさいです。もしくは、ssh接続に対応してくれればscpでSDカード内のファイルのやりとりがクライアントPC間で簡単にできそうな気がします。（SSLがアレという事であればftpでも）
rbenv: version `x.x.x` is not installedエラーの解消法

# 初めに
今回はRubyでバージョンのエラーが起こったときの解決策を紹介していきます
### 本文
今回紹介していくのは下記のようなエラーが発生した場合の対応です
```
% bundle install
rbenv: version `3.2.0' is not installed (set by /Users/~~/.ruby-version)
```
まず、インストールできるRubyのバージョンを確認します
```
% rbenv install --list
```
まずは`brew`と`benv`のアプデートをしていきます
```
% brew update && brew upgrade ruby-build
```
こうすることでインストールできるバージョンが変わっているはずなので、再度下記のコマンドを使用してほしいバージョンが取得できるようになってるかを確認します
```
% rbenv install --list
```
取得したいバージョンを指定してダウンロードし、設定をしたら終了です
ダウンロードや設定の方法は下記の記事にまとめてあります
https://qiita.com/ryuji_sato/items/f38e1fe3368f2dbfeed5
### 最後に
今回はRubyのバージョンエラーを解消する方法を紹介していきました
どなたかのお役に立てれば幸いです
PL-900: Microsoft Power Platform Fundamentals それってどういう事？ (2)

# 選択、選択肢
こんな問題がありました。

> 不動産会社は、Microsoft Dataverse を使用してアパートを追跡することを計画しています。
> アパートが賃貸可能か、販売可能か、またはその両方かを格納する新しい列を作成する必要があります。
> どの列タイプを使用する必要がありますか?
> 1. 選択
> 2. 選択肢
> 3. はい・いいえ
> 4. 顧客

正解: **選択肢**

Google翻訳で変換すると、**Choice: 選択**、**Choices: 選択肢**となるようです。
ちょっと意味がわかりません。

ドキュメントを見てみると、日本語のページでは選択肢が2つありました。

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/types-of-fields

英語版では、やはりChoiceとChoicesに分かれています。

https://learn.microsoft.com/en-us/power-apps/maker/data-platform/types-of-fields

|Power Apps データ型|Power Apps data type|ソリューション エクスプローラーの種類|API の種類|
|---|---|---|---|
|選択肢|Choice|オプション セット|PicklistType|
|選択肢|Choices|MultiSelect フィールド|MultiSelectPicklistType|

Choiceの方はラジオボタン(どれか1つ)、Choicesの方はチェックボックスやリストボックスといった使い方でしょうか。
選択というと好きなものを組み合わせられる感覚があるし、
選択肢というとどれか1つを選ばなければならない印象があるのですが
意味は逆のようです。
むしろ英文のままの方が意味が伝わるような...

実際にPower Appsで列を作成する時は**データの種類**は選択肢しかなく、
**複数の選択肢を選択できます**にチェックを入れることでChoicesに、
チェックを外せばChoiceの方になるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/0d43cce2-152b-f283-224b-393ecc79b3e3.png)

選択肢で作成した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/7402af14-9215-e954-45b6-7f3099d725e1.png)

選択肢(複数の選択肢を選択できます)で作成した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/481edb8b-ec72-367b-f853-71c77d0fc37d.png)

# 結論

- **選択肢** (Choice): どれか1つ選択
- **選択肢(複数の選択肢を選択できます)** (Choices): 組み合わせて選択

日本語版の試験はどのように出題されるんでしょうね？
【Flutter】アプリバージョンを表示する

# はじめに

自分が作成したアプリに`package_info_plus`を使用して、
アプリバージョンを表示する方法を学んだため、記事にしてみました。

# package_info_plus とは？
iOS の CFBundleVersion や Android の versionCode など、アプリケーションパッケージに関する情報を照会するための Flutter プラグイン。

（[Flutter公式ドキュメント](https://pub.dev/packages/package_info_plus)より引用）

# 開発環境
- macOS Monterey 12.5
- Android Studio Chipmunk | 2021.2.1 Patch 1
- Flutter 3.3.10

# 事前準備
## ①　pubspec.yaml に追記
pubspec.yaml に、`package_info_plus` パッケージを追加します。
※2023/03 時点の最新バージョンが `^3.0.3` だったため、最新を設定しています。

```yaml: pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  package_info_plus: ^3.0.3
```

## ②　パッケージをダウンロード
下記コマンドを実行して、パッケージをダウンロードします。

```
$ flutter pub get
```

## ③　クラスにパッケージをインポート
`package_info_plus` を使用したいクラスにパッケージをimportします。

```dart
import 'package:package_info_plus/package_info_plus.dart';
```

# package_info_plus の使い方
PackageInfo にて `version` を指定するとアプリのバージョンが取得できます。
また、`buildNumber` を指定することでアプリのビルド番号が取得できます。

```dart
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;
```

# アプリバージョンの表示

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: Text(title),
      ),
      body: const MainPage(),
    );
  }
}

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

  /// 表示用のアプリバージョンテキストを返却します。
  Future<String> getVersionInfo() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    var text = 'バージョン:${packageInfo.version}(${packageInfo.buildNumber})';
    return text;
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          FutureBuilder<String>(
            future: getVersionInfo(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              return Text(
                snapshot.hasData ? snapshot.data : '',
                style: Theme.of(context).textTheme.headline6,
                textAlign: TextAlign.center,
              );
            },
          ),
        ],
      ),
    );
  }
}
```

上記ソースコードでビルドをするとアプリバージョンが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076680/509af97b-7ee9-8927-e09d-55d8c5b9bcf0.png" width="350">


# さいごに
package_info_plus を使用したアプリバージョンの表示方法を紹介しました。

今回紹介した以外にも下記のアプリに関するパッケージも取得できるので、
同様の方法で取得・表示することが可能です。
- `appName`: アプリの名前
- `packageName`: アプリのパッケージ名


# 参考サイト
- [package_info_plus | Flutter Package - Pub.dev](https://pub.dev/packages/package_info_plus)
特定のディレクトリ以下のみアクセスできるSFTPユーザを作成する

表題のとおりです。
調べればめっちゃ出てくるけど、やることを過不足なく揃えた自分版のメモです。

## 今回の環境
一応。
```sh
cat /etc/redhat-release 
```
```
Rocky Linux release 8.7 (Green Obsidian)
```
IPアドレス制限でパスワードログインするものとする。

## 手順
以下手順は root ユーザで設定する。

1\. 2. はユーザを2つ以上作る際ははじめの1回だけでよい。

`newgroup` `newuser` `child` `/path/to/symbolic_link` は適宜変えてね。

1. 「特定のディレクトリ以下のみアクセスできるユーザ」用のグループを作る
   ```sh
   groupadd newgroup
   ```
2. 特定のディレクトリ以下のみアクセスさせないための設定
   ```sh
   vi /etc/ssh/sshd_config
   ```
   末尾に追記する
   ```sh
   Match Group newgroup
        ChrootDirectory %h
        PasswordAuthentication yes
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp
   ```
3. ユーザを作成、パスワードを設定
   ```sh
   # g を大文字にするとプライマリグループではなくなってしまう。
   useradd newuser -g newgroup
   passwd newuser
   ```
4. ChrootDirectory で指定されるディレクトリに必要な制約を満たすための設定
   ```sh
   chown root:root ~newuser
   chmod 755 ~newuser
   ```
5. SSH ログインを禁止
   ```sh
   usermod -s /sbin/nologin newuser
   ```
6. 「特定のディレクトリ」を作成
   ※ホームディレクトリ自体を「特定のディレクトリ」にすることはできない
   ```sh 
   mkdir ~newuser/writable
   chown newuser:newgroup ~newuser/writable
   # 必要に応じて子ディレクトリ作成
   mkdir ~newuser/writable/child
   chown newuser:newgroup ~newuser/writable/child
   ```
7. 「Webサーバーが参照したいのにそこだとドキュメントルート外なんですけど…」みたいな場合は、ドキュメントルート内からシンボリックリンクを張って対処する。
   ```sh
   # ちなみに、シンボリックリンクは相対パスで張った場合は相対パスのまま（シンボリックリンク自体を移動させるとリンク先も移動する）だが、~を使った場合は絶対パスに変換される。
   ln -s ~newuser/writable/child /path/to/symbolic_link
   # -h を付けないとリンク先の所有者を変更してしまう。
   chown -h newuser:newgroup /path/to/symbolic_link
   # シンボリックリンクにはパーミッションの設定は無い（リンク先のパーミッションで制御する）ので、所有者だけを変えればよい
8. 外部向けの場合はIPアドレス許可設定をし直す（コード省略）
PL-900: Microsoft Power Platform Fundamentals それってどういう事？ (1)

# はじめに
Microsoft 認定資格 Power Platform Fundamentals(PL-900)の学習をしています。
単純に **選択問題に答えて700点以上とれれば合格**
という試験なのでガリガリ問題集を解いて理解する、という学習をしているのですが
それだけだと何を学んでいるのかよくわかりません。
なので、実際に触れて理解します。

:::note
演習問題は、以下の**無料の練習用評価を受ける**から学習できます。
英語なので、ブラウザの翻訳機能を使うと楽です。
(但し変な訳になる場合があるので、わけがわからなかったら原文も読んだ方が良いです)

[試験 PL-900: Microsoft Power Platform 基礎 - Certifications | Microsoft Learn](https://learn.microsoft.com/ja-jp/certifications/exams/pl-900/)
:::

:::note
Power Appsを個人で利用する場合は、開発者プログラムから無料で利用できます。
(とは言っても、勤務先(会社名)の入力が必須なので、企業で働いている人向け)
本番環境で利用できない等、制限があります。

[個人で無料で始める Power Apps 2020年最新版【8月】 | PowerPlatform.work](https://www.powerplatform.work/PowerApps%E3%82%92%E5%80%8B%E4%BA%BA%E3%81%A7%E7%84%A1%E6%96%99%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B/)
[Microsoft 365 開発者プログラムへようこそ | Microsoft Learn](https://learn.microsoft.com/ja-jp/office/developer-program/microsoft-365-developer-program)
:::

# 問題と解答

> Microsoft Power Platform と Microsoft Dataverse を使用してソリューションを構築します。
> Microsoft Dataverse サブスクリプションに付属する既定の通貨テーブルを使用する必要があります。
> 通貨 テーブルのテーブル タイプを決定する必要があります。
> どのテーブル タイプを識別する必要がありますか?
> ・標準
> ・活動
> ・カスタム
> ・仮想

正解: **標準**

## Microsoft Dataverseって何？

Power Platformで利用するデータソースのようです。

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/data-platform-intro

## どうやって使うの？

Power Appsで左ペインの"テーブル"をクリックすると、このような一覧が現れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/f16f97a9-7826-2616-4901-fe1d0f5a8be4.png)
**Activity** や **Standard** があり...どうやらStandardが **標準** テーブルのようです。
**通貨型** がありました。Standardです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/a615c171-0995-80b5-a71e-167c67a7d716.png)
クリックすると、予め列が用意されている事がわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/68a97ffa-4309-3d02-16c8-1b03e87a63cd.png)

又、以下のラーニングの3つ目に演習があります。

https://learn.microsoft.com/ja-jp/training/modules/get-started-with-powerapps-common-data-service/

新しいテーブルを作ろうとすると、**高度なオプション**→**種類**に、`標準` `活動` `仮想`がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/b86c6f97-fa5a-f7d8-068a-91d2c718c91f.png)

# 結論

一体何が違うのか？**新しいテーブル**の**詳細情報**をクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116331/a6b265b0-aaf9-d560-bc2a-5385d7789b43.png)

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/create-edit-entities-portal#create-a-table

> **種類**
> テーブルの種類を選択します。
> ほとんどのテーブルには標準を使用します。
> 活動テーブルは、ユーザーまたはチームのみが所有できる特別なテーブルですが、組織が所有することはできません。
> 仮想テーブルでは、テーブルに外部ソースからのデータを入力する必要があります。

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/types-of-entities

> 活動は、カレンダーにエントリを作成できるアクションと考えることができます。

という事でした。
問題で問われているのは既定のテーブルを利用するシチュエーション、という事でしょうか。
翻訳の問題かもしれませんが、問題の意図もわかりにくいものが多いです。

標準テーブル(すぐに使えるテーブル)に、**通貨** があるよ！
これを覚えておけば良いのではないでしょうか。

# 参考

https://learn.microsoft.com/ja-jp/training/modules/introduction-common-data-service/3-identify-entities-fields
helix-editor の行頭・行末への移動キーを変更


[helix-editor](https://helix-editor.com/) を使っていて戸惑ったのでキーマップを変えたというお話。

## 背景
`vim`を使用する際に割りと多用するのが、行頭・行末への移動。
`helix-editor`では、`Home`キーと`End`キーとなっている。ノートパソコンなら`Fn`+○キーでさほど困らないかもしれないが、フルキーだと、ホームキーから離れているので押しにくい。

## 変更点
`vim`と同じに`0`,`$`を移動キーにする。

`:config-open`とするなどして、config.tomlを開いて
```toml:config.toml
[keys.normal]
0 = "goto_line_start"
"$" = "goto_line_end"
```
を追加して保存。

## 結果
`0`,`$`でそれぞれ、行頭、行末への移動ができた。

解決。

## あとがき
今回は、変更したいキー`0`,`$`ともに割り当てられていなかったので干渉なく変更できた。
SynologyのNASでsudoなしでdockerコマンドを実行する

root以外のユーザーにDockerコマンドの実行を許可したいが

いつもの方法で作業しようにもgroupaddコマンドが使えないので、いきなり入り口で止まってしまった。
```
~$ groupadd
-sh: groupadd: command not found
```
以下の手順でdockerグループを作成して、自分のアカウントをdockerグループに追加した

dockerグループを作成
```
$ sudo synogroup --add docker
Group Name: [docker]
Group Type: [AUTH_LOCAL]
Group ID:   [65536]
Group Members:
``` 
docker.sockの所有グループを変更
```
$ sudo chown root:docker /var/run/docker.sock
```
自分のアカウントhogeをdockerグループに追加
```
$ sudo synogroup --member docker $USER
Group Name: [docker]
Group Type: [AUTH_LOCAL]
Group ID:   [65536]
Group Members: 
0:[hoge]
```
一旦ログアウトしてログイン
```
$ exit
logout
$ ssh rainuser@192.168.1.10
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
[C#]ある文字列の中の特定の文字列をループして抜き出す。

C#には string.IndexOf() という、ある文字列の中から特定の文字列が最初に出てくるインデックスを返す関数があります。

具体例
```C#:Test.cs
using System;
class Program
{
    static void Main()
    {
        string input = "ABCDEFGABCDEFG";

        string t = "EFG";

        // resultには5が格納される
        int result = input.IndexOf(t);
    }
}
```

しかし、２つ目の"EFG"のIndexは返してくれません。
意外とオンラインのテストで使うことが多いので備忘録も兼ねてループして文字列から特定の文字列を取り出す関数を作りました。

```C#:Test2.cs
using System;
class Program
{
    static void Main()
    {
        string input = "ABCDEFGABCDEFG";

        string t = "EFG";

        int count = 0;

        while (count + t.Length <= input.Length) {
            
            // 最初はresに5が入る
            int res = input.IndexOf(t, count);

            if (res == -1)
                return;

            // 5番目からlength分出力
            Console.WriteLine(res + input.Substring(res, t.Length));

            // 次の文字に移動
            count = res + 1;
        }
    }
}
```

このコードを実行すると、、

4EFG
11EFG

と出力されます。

前の数字はIndex、EFGは特定の文字列として出力されます。
Visual Studio Code includePath の修正

組み込み開発なんかで include の候補が沢山あって VSCode が迷う時の対策方法。

基本的には Cmd+shift+P > C/C++: Edit Configurations (JSON) または `.vscode/c_cpp_properties.json` を直接開いて includePath を追加編集すれば良い。ただ、候補が沢山あって欲しいバージョンを上手く探してくれない時があるので、以下のようにして推理する。

* Cmd+shift+P > C/C++: Log Diagnostics
* なんとなく解決のヒントがずらずら出てくる。

例えば includePath がこうなってるとする。

```json
"includePath": [
    "${workspaceFolder}/**",
    "~/sdk/sysroots/hoge-linux-gnueabi/usr/include/**",
    "~/sdk/sysroots/hoge-linux-gnueabi/usr/include/hige/include/**"
 ],
```

優先したいヘッダが `${workspaceFolder}/include/fuge/myheader.h` にあるけど `**` があるのに見つけてくれない時は `"${workspaceFolder}/include",` のように指定しろと `C/C++: Log Diagnostics` がアドバイスしてくれるので言われた通りにする。

(どこで調べたのか忘れてしまったので参照省略)
tauri devコマンドで特定のファイルの変更を検知しないようにする

## 方法
`.taurignore`ファイルを`src-tauri`フォルダ配下(`tauri.conf.json`があるフォルダ)に置き、指定のファイルパスを`.taurignore`ファイルに記載する。

## ファイルの変更を検知しないようにした経緯

`tauri`でアプリを開発しており、データベースを`sqlite`にしていたところ、データベースにコネクションを張る際に、一時ファイルを作成していた。(shmファイルとwalファイル)
そのため、ファイルの変更が検知され、リビルドが行われ続けていた。

## 参考

https://stackoverflow.com/questions/75640909/stop-tauri-application-from-reloading-after-changes
Dockerが起動しないときの（ブリッジ作成時のエラー）備忘録

# 症状
よく見るエラー
```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```
`sudo service docker stop および start`でもdockerが起動しない

## エラー
**ログ確認**
```
cat /var/log/docker.log
```

どうやらブリッジ作成の際に重複しているのが問題らしい
```
failed to start daemon: Error initializing network controller: 
Error creating default "bridge" network: Pool overlaps with other one on this address space
```

## 対処法
/var/lib/docker/networkからソケット削除
環境構築初期段階なので`rm -rf /var/lib/docker/network/*`で雑にやった

## 結果
`sudo service docker start`でうまく起動した

## 参考文献
https://stackoverflow.com/questions/40524602/error-creating-default-bridge-network-cannot-create-network-docker0-confli
【Tableau】軸の値とツールヒントの値に対し、別々に書式設定する

# はじめに
こんにちは。
今回はTableau初心者向けの小ネタとして、
Tableauのグラフで軸の値とツールヒントの値に対し、別々に書式設定する方法をお伝えします。
※ver2022.3を使用

# 軸の書式設定を変更するとツールヒントにも適用される
以下のようなグラフを作ったとします。
画像の状態では、軸は整数、ツールヒントは小数点以下4桁まで表示されています。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/f066d39d-2d0a-a124-b01d-b46846320e0c.png)
※データソースは皆さんご存じの「サンプルスーパーストア」(ダミーデータ)を使用。

ここで、軸の値を少数点以下2桁まで表示するよう変更してみます。
手順は以下の通りです。
①軸にカーソルを合わせて右クリック→「書式設定」をクリックします。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/b969bd33-0383-462a-12fa-c79668ba275a.png)

②左側の書式設定ペインで「軸」タブを選択し「スケール」-「数値」プルダウン内で「数値(カスタム)」を選択し、小数点を2に設定します。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/1b4c6797-6fee-d723-345e-4e9ad4a76f52.png)

軸の値が整数から少数に変わりました。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/a7ee4f3f-6438-a751-681a-9b34eea9c47c.png)
しかし、ツールヒント内の値も小数点以下2桁までの表示になってしまいました。
 
# ツールヒント個別の書式設定をする
どうやら、軸の書式設定がツールヒントの値にも適用されているようです。
上記の状態から、ツールヒント内の書式のみ変更してみます。

①対象のフィールド(今回は「数値」フィールド)を複製し、マーク内の「ツールヒント」へドラッグ&ドロップします。
　必要に応じて、計算方法を変更します(以下の例では合計から平均に変更しています)。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/31b3b6a1-7edb-d392-8307-39b3bd09fb66.png)

②①で追加したフィールドを右クリック→「書式設定」をクリックします。
　「ペイン」タブを選択し「規定」-「数値」プルダウン内で「数値(カスタム)」を選択し、小数点を3に設定します。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/b7634628-3f26-113e-1423-2eabe053928e.png)
 
③マーク内の「ツールヒント」をクリックし、ツールヒントを修正します。
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/44544425-3154-d63b-299d-0a461603b698.png)

軸の値とツールヒントの値に対し、それぞれに任意の書式設定をすることができました。
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/904c24ca-d8b1-3e32-cfee-554e82486f7e.png)
 
# おわりに
今回はTableau初心者向けの小ネタとして、
Tableauのグラフで軸の値とツールヒントの値に対し、別々に書式設定する方法をお伝えしました。

以上となります。
最後までご覧いただきありがとうございました。
paizaラーニング レベルアップ問題集 新・Bランクレベルアップメニュー JavaScript 【計算 1】マンハッタン距離

【計算 1】マンハッタン距離 (paizaランク C 相当)

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__taxi_distance

# 解答例
1〜N(>3) 番の番号が振られた地点のユークリッド距離とマンハッタン距離を計算し、配列に格納する。
配列を近い順に並べ替える。
近い３地点を出力する。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [P_x, P_y] = lines[0].split(" ").map(Number);
const N = Number(lines[1]);

const euclid = [];//ユークリッド距離
const manhattan = [];//マンハッタン距離

//距離を計算して配列に格納
for (let i = 1; i <= N; i++) {
  const [x, y] = lines[i + 1].split(" ").map(Number);
  //ユークリッド距離
  const l_e = Math.sqrt((x - P_x) ** 2 + (y - P_y) ** 2);
  euclid.push([l_e, i]);//[距離, 地点]で格納
  //マンハッタン距離
  const l_m = Math.abs(x - P_x) + Math.abs(y - P_y);
  manhattan.push([l_m, i]);//[距離, 地点]で格納
}

//距離が近い順に並べ替え
euclid.sort((a, b) => a[0] - b[0]);
manhattan.sort((a, b) => a[0] - b[0]);

//距離が近い３地点を出力
euclid.slice(0, 3).forEach(v => {
  console.log(v[1]);
});
manhattan.slice(0, 3).forEach(v => {
  console.log(v[1]);
});
```
docker endpoint for "default" not foundの解決方法

# はじめに
dockerで環境を構築しているときに以下のエラーに遭遇しました。
解決方法について、自分用メモとして残します。

```shell:エラー文言
$ docker-compose up
docker endpoint for "default" not found
```

# 原因
色々調べていくと、こんな記事がありました。
[[BUG]docker endpoint for "default" not found #9956](https://github.com/docker/compose/issues/9956)

質問者さんは再インストールしたら直っちゃった...と言って顰蹙を食らってますが。。。(笑

コメントを読んでいって以下のコマンドを実行してみました。

```shell:実行結果
$ docker context ls
unexpected end of JSON input
```

ちなみに中身は空でした。

```shell:実行結果
$ cat meta.json


```

コメントのとおりmeta.jsonを削除してdockerを再起動したら動くようになりました。
gasでslackのapiを触ってみる。




<p>みなさんの中には、slackでの活動内容を取得して<b>スプレッドシートに吐き出しつつ、視える化</b>したいと思ったことがある人がいるのではないでしょうか。</p>

<p>そのためにはslackのAPIを手足のように触れる必要があるのですが、残念なことにslackapiの触り方に関する記事はあまり見かけません(僕が勉強した時だけで今はあるのかな？)。</p>

<p>と言うわけで、slackAPIの触り方を実例と合わせて紹介していきます。</p>


<h1>slackAPIの触り方</h1>
<a href = "https://youtu.be/TLFG_YHmY_E">こちら</a><p>の動画に軽くまとめたので、apiでどんなことができるかわからないと言う方はご参照ください</p>

<h1>事例~gasによるslackIDの取得~</h1>
    <p>incoming webhookを用いた自動投稿をやっている方はそれなりにいるのかなと思います。この際に個人にメンションをつける際には<b>slackID</b>が必要になりますのでこれを自動で行う方法の紹介です</p>
    <p><b>URLやTOKENの入手方法が分からない方</b>は上の動画参照です</p>

<p>以下はチャンネル参加者のslackIDを全て入手するコードです</p>

```javascript:qiita.js
function userID取得(){

  const url = "channel.readのconservation.membersにおけるURLを貼ってください";
  var options = {
    "headers":{
      "Authorization": "TOKENを張ってください"
      },
    "method" : "get",
    "contentType": "application/x-www-form-urlencoded"
  };

  const response = UrlFetchApp.fetch(url, options).getContentText();
  const members = JSON.parse(response).members;
  return members;
}
```

<p>続いて、slackIDに対応する名前も取得する方法</p>

```javascript:qiita.js
function 試し() {
  //全員分のslackOD取得
  var members = userID取得();
  
  var options = {
    "headers":{
      "Authorization": "TOKENを指定してね"
      },
    "method" : "get",
    "contentType": "application/x-www-form-urlencoded"
  };
  //S02KQKERQPM
  var membersList = []
   

  //ここではusers.infoを使用していて、このメソッドでは、一人一人urlが異なっています
  for(i=0;i<members.length;i++){
    const url = "https://slack.com/api/users.info?user=" +members[i]+ "&pretty=1";
    const response2 = UrlFetchApp.fetch(url, options).getContentText();
    //console.log(response2);
    const memberName = JSON.parse(response2).user.profile.real_name;
    console.log(memberName);
    const memberId = JSON.parse(response2).user.id;
    membersList.push([memberName,memberId])
  }
```

<h2>まとめ</h2>

<p>以上のような形でslackから情報を得ることができます。これ以外にも、会話の内容やスタンプを押したかなど、さまざまな情報を得ることができますので、是非試してみてください</p>
t.belongs_to()

```rb
# Adds a reference.
      #
      #  t.references(:user)
      #  t.belongs_to(:supplier, foreign_key: true)
      #  t.belongs_to(:supplier, foreign_key: true, type: :integer)
```
# 出典
https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L478:~:text=%23%20Adds%20a%20reference,true%2C%20type%3A%20%3Ainteger)

# belongs_toはreferencesのエイリアスなので
```rb
add_reference(テーブル名, リファレンス名, オプション引数)
```
# 出典
https://railsdoc.com/page/add_reference#:~:text=%E8%AA%AC%E6%98%8E-,%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%82%92%E8%BF%BD%E5%8A%A0,true,-%E4%BE%8B

# 感想
真似してみたらよかった
これで最初から関連付けのついた外部キーの設定ができる
DynamoDBで大量のデータをCreate時、Throughput exceeds

備忘録です。

## 事象

Lambdaで作ったGoのバッチで440万件ほどのアイテムを作ろうとした所、下記エラーが出て途中終了していた。

```shell
{
  "errorMessage": "operation error DynamoDB: PutItem, exceeded maximum number of attempts, 3, https response error StatusCode: 400, RequestID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, api error ThrottlingException: Throughput exceeds the current capacity for one or more global secondary indexes. DynamoDB is automatically scaling your index so please try again shortly.",
  "errorType": "withStack"
}
```

再実行しても、10分程で同様のエラーが出てエラー終了する。

## 原因

DynamoDBに設定されたキャパシティーを超えるリクエストを行うと400エラーを返却する様子。

### AWSサポートからの回答

```
DynamoDB では内部的に自動でスケーリング処理を実行しており、その際一時的に API リクエストに対して 500 エラーを返す場合がございます。
また、その他の一時的な内部の問題により 500 エラーを返す場合もございます [1] 。
キャパシティーモード（オンデマンドモード / プロビジョニングモード）によらず同様のエラーが発生する可能性があります。
AWS では日々サービス改善に努めておりますが、一時的なエラーを完全に防ぐことは困難であること、ご理解いただければと存じます。
```

## 対応

バッチが止まってから4回時間を数分開けつつ再実行した所、その後数時間実行してもエラーが出なくなった。
AWS DynamoDBのスペックが勝手に上がっているのか、何度か再実行すれば拡張される様子。
大量データをCreateする場合は特に、再実行しても途中から問題なくアイテムを作成出来るように設計した方が良さそう。

## 参考

* [Why is my Amazon DynamoDB table being throttled?](https://aws.amazon.com/premiumsupport/knowledge-center/dynamodb-table-throttled/)
Ubuntu Mate のタスクバーに Taskwarrior のActiveなタスク名だけ表示する

ToDo管理にTaskwarriorを使い始めた。「あれをやらなきゃ」と思った時に、マウスを動かすのが億劫だからだ。
マウスは害悪だ。マウスポインターを目で追ってアイコン等に合わせる事に使う事にも人間は労力を使う。
そのごく僅かな労力だとしても、それが積み重なる事による無駄を自覚すべきだ。
エンジニアよ、怠惰であれ。

Taskwarriorを使いはじめて、まずやったのは Ctl+Alt+Tでターミナルを起動した時に毎回自動的に task を実行する、というものだ。
これは安直にこれでいい。

```.bashrc の末尾
task
```

しかし、休憩から戻ってきた時や、割り込みタスクをさばいた後、「さて、何してたんだったかな…」と思った時、
毎回ターミナルを開くかというとそうではない。
ターミナルを開かなかった場合に、うっかり別のタスクを思い出してしまい、そちらの手を動かしてしまう事がある。
そのため、画面のどこかに常に今やっているタスクを表示しておきたい。

最初はまずターミナルで定期的に task を表示させ続けてそれを最前面に表示させていた。

```taskshow.sh 
#!/bin/sh
while true
do
  task 
  sleep 10
done
```

だがシンプルに邪魔である。

表示したいのは「今着手中の１件」でいい。であれば、Mateパネルに単に出ていて、自動で更新されればよい。

良いものがある。
![2023-03-20_14-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148579/32290058-8618-c2ac-4aac-624f02938b8e.png)

先に、「Taskwarriorのアクティブなタスクのタスク名だけ表示するコマンドライン」を作る。
アクティブなものだけ表示する、は `task active` で出るが、色々余計な項目が出るので別な report を定義する。

```~/.taskrc の末尾
report.headline.columns=description
report.headline.filter=+ACTIVE
```

これで `headline` というアクティブなタスクの名前だけ出す定義ができる。

```bash
$ task headline

Description             
今のアクティブなタスク

1 task
```

ヘッダとタスク数の表示が邪魔である。

```bash
$ task rc.verbose=nothing headline
今のアクティブなタスク
```

大変よろしい。

あとはこれを先ほどのアプレットのコマンドに設定する。
少し飾りなどをつけるため、`sh`で括って…

```
sh -c "echo 📝DOING Now:【`task rc.verbose=nothing headline`】"
```
![2023-03-20_16-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148579/4a62e6f2-93fe-d9fe-1287-cb3d61af1920.png)

完成。