OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubのデフォルトブランチ名を取得する

# やりたいこと・背景

```sh
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:vividmuimui/foo.git
  Push  URL: git@github.com:vividmuimui/foo.git
  HEAD branch: main
  Remote branches:
    bar_branch        tracked
  ```

```sh
  $ git branch -r
  origin/HEAD -> origin/main
  origin/bar_branch
  origin/main
```

上記などのコマンドで表示される `HEAD branch: main` や `origin/HEAD -> origin/main` の `main` の部分を取得したい。

理由としては、リモートリポジトリの設定によって、`master` だったり `main` だったりする。
これをコマンド一発で取れるようにしたい。

# コマンド

```sh
$ git branch -r | grep HEAD | cut -d'/' -f3
# main
```

# 補足: このコマンドをどう使うか

```sh
$ hub compare `git branch -r | grep HEAD | cut -d'/' -f3`...${ここにブランチ名}
```
git push後に上記のようなコマンドを実行するようにすることで、pushしたらPR作成ページが開かれるので便利。
(VS codeでやったらもっと便利なことはありそうだけど。)

具体的には以下のコマンドを git config　として書いて用意している。
```
    # 行末の `newpr` は $0 をうめて、$1に実際の引数を入れるため。これがないと、実際の引数があるときは$0にそれが入るし、実際の引数がないときは$0に`sh`が入ってくるため。
    newpr = "!sh -c ': ${1?require remote branch name}; git switch -C temppr; git push origin HEAD:$1; hub compare `git branch -r | grep HEAD | cut -d'/' -f3`...$1' newpr"
```
`git switch -C temppr` あたりは完全に僕のローカルのブランチの運用に依存しているので、上記コマンドを利用される際はよしなに直してください :pray:
モジュラモノリスのモジュール間通信をMagicOnionでやる

# 内容
モジュラモノリスをaspnetcoreでやろうと思ったときに、モジュール間通信を[MagicOnion]でやれないかと試した内容になります。

# 構成

以下のように作っておけば

```plantuml
title ①モジュラモノリス

node frontend <<aspnetcore>> 
note left of frontend: gRPCサーバー兼
node moduleA <<classlib>>
node moduleB <<classlib>>
node "shared.moduleA" as smA <<classlib>>
node "shared.moduleB" as smB <<classlib>>
frontend --> moduleA: 実装参照。IFと実装を\n関連付けるため
frontend --> smA: IF参照
moduleA --> smA: IF参照
frontend --> moduleB: 実装参照。IFと実装を\n関連付けるため
frontend --> smB: IF参照
moduleB --> smB: IF参照
frontend ..> frontend: magiconionのチャンネルは自分自身
```

以下の構成にするのも容易かと思いました。

```plantuml
title ②マイクロサービス

node frontend <<aspnetcore>> 
node moduleAgRPCサーバー <<aspnetcore>> 
node moduleBgRPCサーバー <<aspnetcore>> 
node moduleA <<classlib>>
node moduleB <<classlib>>
node "shared.moduleA" as smA <<classlib>>
node "shared.moduleB" as smB <<classlib>>
moduleAgRPCサーバー --> moduleA: 実装参照
frontend --> smA: IF参照
moduleA --> smA: IF参照
moduleBgRPCサーバー --> moduleB: 実装参照
frontend --> smB: IF参照
moduleB --> smB: IF参照
moduleAgRPCサーバー --> smA: IF参照
moduleBgRPCサーバー --> smB: IF参照
frontend ..> moduleAgRPCサーバー: magiconionの宛先
frontend ..> moduleBgRPCサーバー: magiconionの宛先
```

今回のサンプルは①を作成したものになります。

# サンプル
* [MyModularMonolithSample](https://github.com/kwhrkzk/MyModularMonolithSample/tree/main)

vscodeでコンテナ起動してデバッグ起動すればサーバーが起動します。
ホスト側で
http://localhost:5002
を表示すれば動作します。

# IFと実装の関連付け
[MagicOnion]でIFと実装が別のプロジェクトの場合の関連付けってどうするんだろうと思ってましたが、単純にDIで指定してあげればよかったです。同一プロジェクト内にIFと実装がある場合は指定を省略できるみたいです。

```C#: 抜粋
builder.Services.AddTransient<IModularAUsecase, ModularAUsecase>();
builder.Services.AddTransient<IModularBUsecase, ModularBUsecase>();
```

# まとめ
実装は簡単に出来ました。単純に関数呼び出しするのとほとんど変わらない印象です。
マイクロサービス化するときもgRPCサーバーを立ててチャンネル先を変更すれば良さそうです。
共有する引数や戻り値にはドメイン知識を使わずプリミティブ型に変換してからやりとりすれば密結合を防げると思いました。

# 参考
* [モジュラモノリスのモジュール間通信の話]( https://speakerdeck.com/trrrrrys/moziyuramonorisunomoziyurujian-tong-xin-nohua?slide=19)

[MagicOnion]: https://github.com/Cysharp/MagicOnion
MiniAPI（十九）導入NLogの取り組み


本連載の第8回では、標準のログ機能について話し合いましたが、より柔軟で強力で便利なロギングシステムを求める場合、標準の機能では不十分な場合があります。今回は、そのようなニーズに応える強力で柔軟、便利なログライブラリであるNLogと、それをMiniAPIで使用する方法について紹介します。

まずは、NuGetパッケージ`NLog.Web.AspNetCore`を導入します。コードの実装は非常にシンプルです。
```csharp
using NLog;
using NLog.Web;

// ロガーの起動
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");
try
{
    var builder = WebApplication.CreateBuilder(args);
    // ログの設定
    builder.Logging.ClearProviders();
    builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
    builder.Host.UseNLog();

    var app = builder.Build();
    // ログの使用
    app.MapGet("/logtest", () =>
    {
        app.Logger.LogTrace("LogTrace");
        app.Logger.LogDebug("LogDebug");
        app.Logger.LogWarning("LogWarning");
        app.Logger.LogInformation("LogInformation");
        app.Logger.LogError("LogError");
        app.Logger.LogCritical(new Exception("eLogCritical"), "LogCritical");
        return "logtest";
    });
    app.MapGet("/myvalue", MyService.GetMyValue);
    app.Run();
}
catch (Exception exception)
{
    // 例外時のログ処理
    logger.Fatal(exception, "Stopped program because of exception");
}
finally
{
    NLog.LogManager.Shutdown();
}

class MyService
{
    public static string GetMyValue(ILogger<MyService> logger)
    {
        logger.LogInformation("TestService.GetMyValue");
        return "MyValue";
    }
}
```
NLogの便利さは、その設定の豊富さにあります。ログの方式や情報の収集項目を柔軟に設定できます。NLogの設定は、プロジェクトのルートディレクトリに`nlog.config`ファイルとして保存されます。もちろん、起動ログの`LoadConfigurationFromAppSettings`を変更して`nlog.config`のパスを設定することも可能です。

設定は主に`targets`ノードと`rules`ノードを使用して実施されます。`targets`はログの保存や表示の方式（テキストファイル、JSONファイルなど）やログの内容を`layout`で設定します。具体的な`target`の属性については、https://github.com/NLog/NLog/wiki/File-target を参照してください。`layout`については、https://nlog-project.org/config/?tab=layout-renderers で確認できます。

`rules`は異なる機能モジュールやログレベルなどの情報を設定します。詳細は https://github.com/nlog/nlog/wiki/Configuration-file#rules を参照してください。

以下の例では、公式テンプレートに含まれるallfileとownFile-webの2つのテキストファイルテンプレートと、jsonfileテンプレート、及びカラー化されたコンソールテンプレートが設定されています。（それぞれのテンプレートの属性については公式ドキュメントを参照してください。）

```xml
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"      internalLogLevel="Info">
  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- 以下略 -->
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!-- 以下略 -->
  </rules>
</nlog>
```

`appsettings.json`の設定は以下の通りです。
```json
{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft.AspNetCore": "Trace"
    }
  },
  "AllowedHosts": "*"
}
```

設定に基づき、実際の効果を確認してみましょう。コンソール結果、.json結果、逐一ログファイルの結果を確認すると、設定した通りのログ情報が得られます。

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247484964&idx=1&sn=ab55ffce2744025450dd56d5c2bef1b4&chksm=9f00590ea877d0188e7621e5799dac6e2e6969a2100a84cad7f688ea03f4e4967c4624b1f38d&token=877361727&lang=zh_CN#rd
コンテナ

## コンテナとは
コンテナとは、アプリケーションとその依存環境をパッケージにしたものです。コンテナを作成することで、OSや環境に関係なくアプリケーションを実行することができるようになります。

イメージとしては、必要な道具がすべてそろったキッチンカーのようなイメージを私はもっています。料理をするために必要な機材や道具、食材、作るためのレシピなどを丸々キッチンカーに詰め込むことで、世界中のどこに行っても同じ料理が作れるイメージです。

有名なものでDockerがあります。

## コンテナの作成とデプロイ
コンテナを作成する手順は3ステップです。

### 1.アプリケーションと依存関係を含むコンテナイメージの作成
キッチンカーでいうところの、料理のレシピとそれに必要な機材を準備している感じです。

### 2.レジストリへのプッシュ
キッチンカーに詰め込むイメージです。私はAzureを使うので、Azure ContainerRegistryにプッシュします。

### 3.実行環境にデプロイ
実際に実行する環境へのデプロイ。料理を求める場所にキッチンカーを配車するイメージです。（※実際はコピーを配布するので、キッチンカーは無限に増えます）

## Azureとコンテナサービス
- Azure Container Registry
このコンテナサービスはレジストリサービスでコンテナイメージを格納します。
- Azure Container Apps
コンテナオーケストレーションサービスです。複数のコンテナを自動的に管理し、アプリケーションの実行に必要なリソースを最適化するシステムです。
- Azure Container Instance 
サーバレスコンピューティング環境でコンテナを実行するためのサービスです。
[ruby] Google API Clientでレスポンスを表示する

## レスポンス確認コード

```ruby
require 'google/apis/core/base_service'

Google::Apis.logger = Logger.new($stdout)
Google::Apis.logger.level = Logger::DEBUG
```

標準出力にAPIのレスポンス(HTTP::Messageオブジェクト)が表示されます。

## 背景

Google API ClientライブラリでAPIを叩いていると、エラーが起こってもほとんどエラー情報を得ることができません。APIレスポンスを表示させることで、エラー修正に役立ちそうな情報(ステータスコードとか、リクエストURIとか)を集めることができます。
【Self-instruct】LLM のプロンプト遂行能力を上げるデータを作る方法

# Self-instruct とは？

LLM がプロンプトの指示に従うように学習するには、「人間の指示と解答」データを十分に用意する必要

ただし、以下のような問題点が
- データ収集は高コスト
- データ多様性も重要

→ 「**それなら、AI を使って半自動で多様性のあるデータをいっぱい作っちゃおう**」としたのが **Self-instruct**。

## Self-instruct の手順

Self-instruct の手順は以下の図のような形で行う。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  Self-instruct の手順\n(出典：SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/9bfa36c0-a3a0-f3e4-2207-08ab2574449c.png>
@enduml
```
日本語で説明すると以下。

- Step 0: ベースタスクを用意。
- Step 1: ベースタスクを参考にして、言語モデル (LM) に類似タスクの Instruction を作らせる。
- Step 2: 先ほど作った Instruction が「分類タスク or 非分類タスク」のどちらであるかを LM で識別
    - 分類タスクか非分類タスクで、異なるアプローチが必要なため分けておくのがよい
- Step 3:分類タスクか非分類タスクかを参考にしつつ、LM でタスクを完成させる。
- Step 4: 「ROUGE-L を使い既存のタスクとの類似度が 0.7 未満のタスク」かつ「画像・写真のような言語モデル用のデータとしてふさわしくないキーワードを含まないタスク」をタスクプールに追加する。Step 1 に戻り、これを繰り返す。
ChatGPTにExcelマクロ聞いてみて使えるか試したい

Sub 写真自動配置()
    Dim targetColumn As String
    Dim targetLine As Integer
    Dim targetCel As String
    Dim numShape As Integer
    Dim i As Integer

    On Error GoTo ErrLabel

    targetColumn = "A"
    numShape = ActiveSheet.Shapes.Count

    For i = 1 To numShape
        targetLine = (27 * (i - 1)) + 1
        targetCel = targetColumn & targetLine
        ' 対象のセルの左上座標を取得
        Dim targetLeft As Double
        Dim targetTop As Double
        targetLeft = Range(targetCel).Left
        targetTop = Range(targetCel).Top
        ' Shapeの位置をセルの左上座標に設定
        ActiveSheet.Shapes(i).Left = targetLeft
        ActiveSheet.Shapes(i).Top = targetTop
    Next i

ErrLabel:
End Sub
[ruby] Google API Clientでリクエストbodyを確認する

## リクエストbody確認用コード

```ruby
require 'google/apis/core/base_service'

module Google
  module Apis
    module Core
      class ApiCommand
        alias_method :original_execute, :execute

        def execute(client, &block)
          original_execute(client, &block)
        ensure
          pp body # body表示
        end
      end
    end
  end
end
```

このコードをトップレベルにコピペしてAPIリクエストを実行してください。

## 動作原理
APIリクエストは`HttpCommand`クラスを継承した`ApiCommand`クラスの`execute`メソッドで実行されます。このメソッドはオーバーライドされていないので、実際には`HttpCommand`クラスの`execute`メソッドが呼ばれます。

```ruby
class HttpCommand
    def execute(client, &block)
          prepare!
          opencensus_begin_span
          do_retry :execute_once, client, &block # API通信実行
    ensure
          opencensus_end_span
          @http_res = nil
          release!
    end
end
```

リクエストbodyはこの処理の中の、`prepare!`メソッドでJSON文字列として生成され、`body`プロパティに保存されます。

```ruby
class ApiCommand < HttpCommand
    def prepare!
        ...
        self.body = request_representation.new(request_object).to_json(user_options: { skip_undefined: true })
        ...
    end
end
```

そのため、`execute`メソッド実行後に`ApiCommand`インスタンスの`body`プロパティを確認すると、リクエストで送られたbodyを見ることができます。

なお、`execute`メソッドはAPIエラー時に例外を送出するため、body表示はensure内で行っています。
【Node.js】LambdaからDynamoDBのデータを取得する方法

## はじめに
Lambdaを使用してDynamoDBのデータを取得する方法について紹介します:point_up_tone1:
データ取得までの流れは 画面 → API Gateway → Lambda → DynamoDB となっていますが、画面からLambdaを呼び出すところまでは割愛します。

## ソースコード
userIdを条件にして、データを取得するという例を紹介します。

```javascript
const { DynamoDBClient } = require('@aws-sdk/client-dynamodb');
const { QueryCommand, DynamoDBDocumentClient } = require('@aws-sdk/lib-dynamodb');

const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);

exports.handler = async(event) => {
    // Cloudwatchで確認できるようにログ出力
    console.log(event);

    try {
        // 画面から送られてきたユーザーIDを取得
        const userId = event.queryStringParameters.userId;

        const command = new QueryCommand({
            TableName: 'DynamoDBのテーブル名',
            // 条件を指定
            KeyConditionExpression: 'userId = :userId',
            // KeyConditionExpressionで使用するために:userIdに変数「userId」を設定
            ExpressionAttributeValues: {
                ':userId': userId
            }
        })

        // データ取得
        const response = await docClient.send(command);

        return {
            statusCode: 200,
            headers: {
                'Access-Control-Allow-Origin' : '*',
            },
            body: JSON.stringify(response)
        }
    } catch (error) {
        // Cloudwatchで確認できるようにログ出力
        console.log(error);

        return {
            statusCode: 400,
            headers: {
                'Access-Control-Allow-Origin' : '*',
            },
            body: error.message
        }
    }
}
```

### 補足
API GatewayでLambda プロキシ統合を設定しているため、指定された形でレスポンスを返却する必要がありました。この辺りの設定が上手く出来ていないとCORSエラーが発生してしまうので、ご注意ください:information_desk_person_tone1:

## さいごに
こちらの記事参考になれば幸いです:woman_tone1::point_up_tone1::dizzy:
DASH de ダッシュボード【1．概要編】

# 【概要】

DASHはPythonで書かれたウェブアプリケーションフレームワークで、データ分析等にも使われています。グラフやデザインはPlotlyやDash Bootstrap Componentsなどライブラリも使用できるため柔軟にカスタマイズも可能です。順次コードを紹介していくつもりです。今回はアプリについての説明になります。


# 今回紹介するダッシュボード【動画】
https://youtu.be/cVZJoZAg9EM

---
DASHはおそらくデータ分析で主に使われているのでファイルからデータを読み込んで様々なグラフで分析に用いているようです。
DASHでのリアルタイム処理の記事が少なく、コールバック出力処理が同一IDは一つまでしか使えない制限等もあり、実装にやや癖があります。(DASHはリアルタイムには向いていないかもしれませんFlaskとかの方がいいと思います）

# アプリについて【実装する機能】
(テーマ：PC情報をGUIで可視化してみる)

- 通信中IPアドレス、ポートを取得する

- プロセスやそれを起動している親プロセスも取得する

- 通信先サーバーの位置情報を表示する

- ダッシュボード風なレイアウトにする

- 機能とレイアウトを構造化し、それぞれ独立して動作させる

- リアルタイム（５秒間隔）で全情報を更新する


# ファイルの階層
```
.
├── app.py　# 本体
├── assets
│   └── style.css　# CSS
└── src
    ├── callbacks
    │   ├── update_layout.py    # 処理1
    │   ├── update_interval.py　# 処理2
    │   └── ………etc
    │
    ├── components
    │   ├── layout.py # レイアウト
    │   └── graph.py　# コンポーネント増えたら追加
    │
    └── utils
```
---
機能を追加するに当たってコンポーネントだけでも増加してしまうので、
だいたい上記のように本体とコンポーネント、コールバック処理等全てクラス別に分離させています。
今回のアプリは配置換えや機能の入れ替えを実装しているので、構造化しておかないと機能毎に独立して動作させることが難しくなります。
上記は現在の構造になります。(callbacksが処理の中身/省略してます)
Qiitaで概要編追記しました。

~~note上ではマークダウンが使えないので、ここはとりあえずアプリ置き場にして、今後技術系の記事はQiitaで紹介していきたいと思います。~~


---
【続き】

https://qiita.com/cloudwork0110/items/c4deb573a24f766bfb90
ビューを非表示にする方法の使い分け(SwiftUI)

## はじめに

ビューを非表示にする方法はいくつかあり、どれを採用すればいいかの判断に迷うことがあったのでまとめました。

## 環境

- OS: macOS Sonoma 14.2.1 (23C71)
- Swift: 5.9.2

## 結論

先に結論です。

- トルツメ [^torutsume] → `if` や `switch`
- トルママ [^torumama]
  - 常に非表示（レイアウトのためだけに配置する） → `hidden()`
  - 条件によって表示/非表示を切り換える → `opacity(condition ? 1 : 0)`

[^torutsume]: 取って詰めること。
[^torumama]: 取っても詰めずにそのままとすること。

## 検証

簡単なコードで検証しました。

```swift:ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 16) {
            Text("1")

            if false {
                Text("2") // 非表示
            }

            if true {
                Text("3")
            }

            Text("4")
                .hidden() // 非表示

            Text("5")
                .opacity(true ? 1: 0)

            Text("6")
                .opacity(true ? 0 : 1) // 非表示

            Text("7")
        }
    }
}
```

上記のコードの実行結果です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/50086a6f-f8a2-d8df-c1bc-151e6dc8be76.png" width=50%>

結論に記載した通り、 `if` で非表示にしたビューはトルツメされ、 `hidden()` や `opacity()` を付けて非表示にしたビューはトルママされました。

## 理由

このような結論を出した理由を記載します。

基本的にはすべて `hidden()` の公式ドキュメントに記載されている通りなので、ぜひご参照ください。

https://developer.apple.com/documentation/swiftui/view/hidden()

### トルツメ

まずトルツメですが、モディファイアでは実現できなさそうなので `if` で行っています。
`frame(height:)` に `0` を指定することも思いつきましたが、非表示にはなりませんでした。

```swift:ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 16) {
            Text("1")
                .border(.red)

            Text("2")
                .frame(height: true ? 0 : 100)
                .border(.green)

            Text("3")
                .border(.blue)
        }
    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/732eef18-b5b1-01d4-daaf-e8a1e9a2e5bd.png" width=50%>

使える場面は限られますが、 `let content: (() -> View)?` のようにビューを返すオプショナルのクロージャを用意し、 `content?()` を実行してもトルツメが実現できます。
詳細は以下の記事をご参照ください。

https://qiita.com/uhooi/items/bab6549451bcf9c75ac5

### トルママ

次にトルママですが、 `hidden()` のドキュメントに従っています。
ただ `hidden()` は表示/非表示を切り替えられないため、 `opacity()` を使うケースのほうが圧倒的に多いと思います。
私は `hidden()` を使ったことがありません。

`opacity(0)` のときはボタンをタップできないので、 `hidden()` と `opacity(0)` は同様の動作になると思います。

```swift:ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 16) {
            Text("1")

            Button {
                print("Foo") // `opacity(0)` だとタップしても出力されない
            } label: {
                Text("2")
            }
            .opacity(0)

            Text("3")
        }
    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/e142f528-444a-0788-c4bd-d891aeb4d91f.png" width=50%>

`Button` に対する `opacity()` の値をいろいろ変えて検証した結果をまとめました。

|opacity|説明|
|:--|:--|
|`1`|少しでもボタンにかすればタップ判定になる|
|`0.9` 〜 `0.1`|だんだんタップ領域が狭くなるが、タップがボタンの中央にかすればタップ判定になる|
|`0.01`|かするだけではタップ判定にならない。タップの中心がボタンのフレームに入るとタップ判定になる|
|`0.001` 〜 `0`|ボタンが完全に見えなくなり、タップもできなくなる|

透過度によってタップ領域が変わるのは学びでした。

## おわりに

ビューを非表示にする方法の使い分けでした。

個人的には `opacity()` より `hidden()` のほうが非表示だとわかりやすいので、表示フラグを渡せる `hidden()` が欲しいです笑
sql select two different join on same date and case

```sql
SELECT D.da, D.x as dx, U.x as ux,
CASE WHEN D.x < 0 AND U.x < 0 THEN 1 ELSE 0 END AS riskStatusQuad
FROM index AS D
LEFT JOIN index AS U
ON D.da = U.da
WHERE D.strategy = 'Backtest'
AND D.code = 'D'
AND U.strategy = 'Backtest'
AND U.code = 'U'
AND D.da >= '2013-12-31'
AND U.da >= '2013-12-31'
ORDER BY D.da ASC;
```
Djotはマークダウン愛から産まれてる ～次代のマークダウン「Djot」をウォッチしよう

## Djot とは？

PandocやCommonMarkの開発者で知られる [jgm](https://github.com/jgm) こと [John MacFarlaen](https://johnmacfarlane.net/) さんが、複雑化したMarkdownへのジレンマ[^1]をカタチにした軽量なマークアップ構文です。

- [Djot](https://djot.net/)
- [Djot Github](https://github.com/jgm/djot)
- [Beyond Markdown](https://johnmacfarlane.net/beyond-markdown.html) こちらがジレンマ、是非ご一読を

- [Djot Github ja](https://github.com/dai/djot/blob/main/README-ja.md)

:::note info
インフォメーション 20240229 09:00:00 JST

- jgmさんに翻訳公開の許諾と公式レポジトリの[discussion](https://github.com/jgm/djot/discussions/275)での告知を許可いただきました


Pandocにも読み書き対応でサポートされました。パーサーや各言語実装の開発も行われていてその注力具合からCommonMarkに取って代わる存在として注目されています

[Djot README 日本語](https://github.com/dai/djot/blob/main/README-ja.md)

Djot Syntax（Djot構文の日本語訳）をはじめ、各文書の日本語訳を更新しました。各リンクは上記日本語版READMEからも辿ることができます。

- [Markdownユーザー向けクイックスタート](https://github.com/dai/djot/blob/main/doc/ja-quick-start-for-markdown-users.md)
- [Djot Syntax 構文 日本語](https://htmlpreview.github.io/?https://github.com/dai/djot/blob/master/doc/ja-syntax.html)
- [チートシート](https://github.com/dai/djot/blob/main/doc/ja-cheatsheet.md)

:::

基本的にCommonMarkによく似ていますがCommonMarkよりも改行やインデントを用いたルールを明確にしバックトラッキングのない解析を軸として緩めるところは緩めた構文。

まったく新しい構文というよりは、あまたあるマークダウンの中で産まれるべくして産まれた存在なのかなと思います。

> What if we weren’t chained to the past? What if we tried to create a light markup syntax that keeps what is good about Markdown, while revising some of the features that have led to bloat and complexity in the CommonMark spec?
> -- [Beyond Markdown](https://johnmacfarlane.net/beyond-markdown.html)

> 過去に縛られていなかったらどうなるでしょうか？ CommonMark仕様の肥大化と複雑化につながった機能の一部を改訂しながら、**Markdownの利点を維持する軽量のマークアップ構文**を作成しようとしたらどうなるでしょうか？

## 各ドキュメント

取り急ぎ以下の3ドキュメントについて翻訳、文書はMarkdownユーザーならとっつきやすく、CommonMarkユーザーなら「なぜこうなったのか？」を動機面からわかりやすく伝わるよう心がけ翻訳をしました。

間違いや誤訳の指摘ご感想があれば参考にさせていただきます。
フィードバックをいただければ幸いです。

1. [日本語版 README](https://github.com/dai/djot/blob/main/README-ja.md)
2. [日本語版 クイックスタート](https://github.com/dai/djot/blob/main/doc/ja-quick-start-for-markdown-users.md)
3. [日本語版 チートシート](https://github.com/dai/djot/blob/main/doc/ja-cheatsheet.md)

（syntax.md ~~/HTMLはサイズXLなので折を見て翻訳します~~ 翻訳完了しました。）


Pandocは[pandoc 3.1.12 (2024-02-14)](https://pandoc.org/releases.html#pandoc-3.1.12-2024-02-14)から正式にサポートを開始しました。

各種実装も増えていくようなので楽しみです。

[^1]: [Beyond Markdown](https://johnmacfarlane.net/beyond-markdown.html)
【Power Automate】席替えするやつ作ってみた

## はじめに
メンバー間のコミュニケーションを活発化させるために、毎週席替えを実施することになりました。
自動でやってくれたら楽だなー、という気持ちよりはただただPower Automateを触りたかったので、席替えするやつ作ってみました。


## 要件
席替え用のフローを作るにあたって、チーム内で下記のような要件が挙がりました。
1. 他PJと接する席は自社の社員(以後グループA)が座ること
1. 席替えついでにレトロスペクティブのファシリテーターも決めること
1. ファシリテーターはSM以外が行うこと

上記の要件を満たせるように適当に作っていきます。


## 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/5d559fce-7178-f9db-fd7b-d024e0847ca6.png)
最終的にこんな感じになります。


## フロー全体

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/7654369e-83ea-5e0b-9a44-d6e87846d403.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/01ea8991-0b3a-58ac-0bc7-cd9212a06f38.png)


## 各ステップ詳細

### 1. グループA
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/10e4a248-eb20-76ac-fdde-beb780f4265d.png)
グループAのメンバ情報をオブジェクト配列に入れています。

idは下記のように設定しており、100~199の乱数を生成しています。
idに乱数を入れることでメンバの順番を入れ替え、席順とファシリテーターをランダムにしています。
> string(rand(100, 199))

### 2. プロパーソート後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/6823a907-c793-97f9-3059-f7c02ca322e5.png)
> sort(outputs('グループA'),'id')

「1\. グループA」で作成したオブジェクト配列をidでソートしています。
乱数が入っているidを昇順にソートすることでメンバの順番をランダムに入れ替えています。

### 3. 残りメンバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/ed428895-e263-f9ef-ef16-60dfb9eccc9d.png)
> variables('groupA')[2].name

グループAの2名とグループA以外のチームメンバをオブジェクト配列に入れています。

グループAの2名を入れているのは、要件「他PJと接する席は自社の社員(以後グループA)が座ること」を満たすためです。
他PJと接する席は2席であるため、余った2名は残りメンバと同じ扱いで再度順番を入れ替えています。

変数「グループA(groupA)」はソート済みであり偏りが発生してしまうため、グループAから取得したメンバのidも再生成するようにしています。

### 4. 残りメンバソート後
> sort(outputs('残りメンバ'),'id')

「2\. プロパーソート後」と同様に「3\. 残りメンバ」をソートしています。

### 5. メンバー全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/a764b5cf-82a2-6816-20d3-0db03832e13c.png)
ファシリテーターの要件を満たすために配列にSM(佐藤)以外を入れています。

オブジェクト配列に役職用のプロパティ値を入れてもいいかなと思いましたが、Power Automateでそこの識別処理を実装するのが(検討時点で)面倒だったのでやめました。

### 6. ファシリ
> variables('member')[rand(0,int(length(variables('member'))))]

ファシリを決めてるだけです。

もっときれいに書けないのかなーとは思っていますが、これで動くしメンバーが変わってもこの部分の修正は必要ないので放置しています。

### 7. Htmlからテキスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/d844abe9-0534-4821-6fd2-2cd71cdedec0.png)
投稿時の体裁を整えています。
テーブル形式で出力したかったのでHtml直書きです。
色分けも同じく直書きです。

この部分はもっときれいに実装したい気持ちがありますが、考えるのが面倒で放置しています。
実装が簡単でもっと良い方法があれば教えてください(他力本願寺)

### 8. チャットまたはチャネルでメッセージを投稿する
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659884/8a166705-86e9-165e-2950-efd2a2854f8f.png)
Teamsのチャネルに投稿しているだけです。
メンションの必要はないため、ただただ投げてるだけですね。


## 終わりに
普通にプログラムを組んだ方が楽な気がしましたが、やったことないことをやるのは楽しかったで良しとしましょう。

フロー作成中に操作性があまり良くないと感じましたが、これは慣れの問題なんですかね？
フローを作成してから記事を書くまでにUIにアプデが入っていて、そこで操作性が改善されたみたいなので、今後更に良くなればいいなー・・・
HTTP callout のまとめ

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



+ [Apex Wrapper SalesforceメタデータAPI（apex-mdapi）で指定ログイン情報の使用](https://qiita.com/Keiji_otsubo/items/43f633ae40495cf1e984)
+ [Apex REST callouts unit](https://qiita.com/Keiji_otsubo/items/eb8295a52993eb82a20a)
+ [Unable to map response for output parameter 2XX of invocable action](https://qiita.com/Keiji_otsubo/items/537b0eb5d3d17be09d5d)
+ [Named credential 指定ログイン](https://qiita.com/Keiji_otsubo/items/00b5e70f3279df9614b2)

# フロー

+ [Salesforce フローを使用して ヘッダーで認証パラメーターを渡す【現状ではできない】](https://qiita.com/Keiji_otsubo/items/d8c5b1ef2b26f6e1f0f2)


# API

+ [Connect REST API エンドポイント /connect/notifications を使用して空の通知リストを受け取りました。](https://qiita.com/Keiji_otsubo/items/f464e090828b7b19de35)
+ [Twitterとの連携](https://qiita.com/Keiji_otsubo/items/653a54b02b375d7486ef)
ARC120 A-Max Add

[公式解説](https://atcoder.jp/contests/arc120/editorial/1924)が天才なので別にユーザ解説は要らない気もする。

# 問題
https://atcoder.jp/contests/arc120/tasks/arc120_a

数列$a=(a_1,a_2,\ldots,a_k)$に対して、$f(a)$を以下の操作を適用した後の$a$の要素の総和と定義する。
```math
\displaylines{
i=1,2,\ldots,kの順に以下の操作を行う： \\

現在のaの要素の最大値をa_iに足す。
}
```
長さ$N$の数列$\lbrace A_N\rbrace$に対して、$1\leq k \leq N$を満たす各$k$に対して、$a=(A_1, A_2, \ldots, A_k)$としたときの$f(a)$を求めよ。

## 制約
* $1\leq N \leq 2\times 10^5$
* $1 \leq A_i \leq 10^7$

#解説
愚直に操作を行うことを考えると、各$k$について$k$回の加算操作が必要になる。$1\leq k \leq N$なので、全ての$k$にわたって愚直に計算する場合その計算量は$O(N^2)$になってしまい、今回の制約では制限時間に間に合わない。

したがって、各$k$について$O(1)$または$O(\log{N})$で総和を計算する方法が存在しそう。

まずは実際に手を動かして、値の更新のされ方を観察する。
$A=(1,2,4,3,2)$を例に、$k=5$の場合を見てみる。
```math
\displaylines{
    初期, (1,2,4,3,2), \max{A}=4 \\
    i=1, (5,2,4,3,2), \max{A}=5 \\
    i=2, (5,7,4,3,2), \max{A}=7 \\
    i=3, (5,7,11,3,2), \max{A}=11 \\
    i=4, (5,7,11,14,2), \max{A}=14 \\
    i=5, (5,7,11,14,16), \max{A}=16 \\
    総和 5+7+11+14+16=53
}
```
これを眺めると、以下の3つのことに気が付く。
* すべての要素が正であるため、操作中の最大値は必ず直前に最大値を加算した要素になる。つまり、１回目の操作を終えて以降はずっと、$i$回目の操作をするときの最大値は$A_{i-1}$である。
* 上記の考察から、初期状態における最大値は全要素に$1$回ずつ加算される。（上の例でいえば、初期の最大値$4$は、$5$回の操作を通じて数列の全要素に$1$回ずつ加算されている）
* 上記の考察から、最大値になる要素は前から順に遷移していくため、数列の長さを$N$とすると$1$番目の要素の値は$N-1$回、$2$番目の要素の値は$N-2$回、... $i$番目の要素は$N-i$回加算されることになる。（上の例でいえば、$1$は$4$回、$2$は$3$回、$4$は$2$回、$3$は$1$回加算されている）

したがって、求めたい総和は、$(もともとの要素の値の和) + (もともとの数列の最大値)*N + \sum\limits_{i=1}^{N-1} (A_i * (N-i))$となる。
このうち、第1項はあらかじめ$\lbrace A_N \rbrace$の累積和を計算しておけば各$k$に対して$O(1)$で求めることができる。また第2項についても累積$\max$を計算しておけば、同様に$O(1)$で求められる。
第3項については難しく見えるが実際には以下のように変形できる。
```math
\sum\limits_{k=1}^{N-1}\sum\limits_{i=1}^k A_i
```
一般化されているとイメージしづらいので、上記の$A=(1,2,4,3,2)$の$k=5$の場合で例示すると、
1は4回、2は3回、4は2回、3は1回加算されることになるが、これは
```math
\begin{align}
    &1 \\
    + &1 + 2 \\
    + &1+2+4 \\
    + &1 + 2 + 4 + 3 \\
\end{align}
```
と書き直すことができる。これは初項から第$k$項までの和を、$k$を$1$から$N-1=4$まで増やしながら足し上げているわけなので、総和記号を使って書き表すと
```math
\sum\limits_{k=1}^{4} \sum\limits_{i=1}^k A_i
```
となる。

このように変形してしまえば、$\sum\limits_{i=1}^k A_i$は初項からの累積和そのものなので、これを$k=1$から$k=N-1$まで足し上げるというのは、累積和の累積和に相当する。
したがって、第1項に必要な累積和に対し、さらにその累積和を事前計算しておけば、第3項についても$O(1)$で求めることができる。
全体では、累積和・累積$\max$・累積和の累積和の前計算に$O(N)$、その後各$k$に対し$O(1)$で$f(a)$を求める計算を$1 \leq k \leq N$に対して行うので、計算量は$O(N)$となる。
したがって全体でも$O(N)$で計算でき、これは制約に対して十分小さく、制限時間内に計算することができる。

# 提出した解答
https://atcoder.jp/contests/arc120/submissions/49192024
rex0220 計算式プラグイン 組織選択項目の親組織を取得

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、組織選択項目の親組織を取得します。

# 概要

組織選択項目で指定された親組織を取得して、文字列項目に親組織名、組織選択項目に親組織をセットします。

![2024-02-20_11h20_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cd265027-3215-16f4-2588-ed08293e7441.png)

# 計算式プラグイン設定

UINFO, OINFO, GINFO 関数を使用する場合は、プラグイン設定画面で「ユーザー情報」をチェック

![2024-02-20_11h20_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9703f18c-d2c3-dc1a-57f0-a0992a5f304e.png)

```.js
OPTION: ユーザー情報

// 親組織名 SINGLE_LINE_TEXT
LET(ocodes,SEL_CODE(ユーザー所属,"array"), // 組織コード
  pcodes,OINFO(ocodes,"parentCode"), // 親組織コード
  OINFO(pcodes,"name")  // 親組織名
)

// 親組織 ORGANIZATION_SELECT
LET(ocodes,SEL_CODE(ユーザー所属,"array"), // 組織コード
  pcodes,OINFO(ocodes,"parentCode"), // 親組織コード
  SET_CODE(pcodes)  // 親組織セット
)
```

## 親組織名取得の計算結果

OINFO 関数で、組織名を配列で取得し、文字列項目にセットすると、カンマ区切りの文字列に変換されます。

![2024-02-20_11h24_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/26b7bdbd-e17a-b8b5-a52a-50101357e295.png)

## 親組織セットの計算結果

SET_CODE 関数で、組織コードを指定すると、組織選択項目の設定形式に変換されます。

![2024-02-20_11h25_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c472e3f0-627a-9610-dc4a-e44b9126b57e.png)
Sales Engagement (旧称 High Velocity Sales)

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

+ [Salesforce Sales Engagement](https://qiita.com/Keiji_otsubo/items/e9896e6cf990433f33e8)


[Sales Engagement (旧称 High Velocity Sales)](https://help.salesforce.com/s/articleView?id=release-notes.rn_sales_se.htm&release=240&type=5)

含まれる機能の範囲をより適切に反映するために、High Velocity Sales の名前が Sales Engagement に変更されました。セールス ケイデンスの名前がケイデンスに変更されました。ケイデンス ステップの完了時にフローを実行し、ケイデンス ステップとして画面フローを使用し、付属のフロー テンプレートを使用して Sales Engagement に自動化を迅速に追加し、関連する請求書の収集にケイデンスを使用します。

+ [Sales Engagement](https://help.salesforce.com/s/articleView?id=sf.high_velocity_sales.htm&type=5)

生産性の高いワークスペースを使用して、インサイドセールスプロセスを加速します。マネージャはケイデンスを使用して、さまざまな種別の見込み客を処理する方法を営業担当に示す、カスタムセールスプロセスを作成できます。それらのケイデンスは、営業担当の作業キュー、セールスコンソール内に表示される ToDo リストに表示されます。また、Sales Dialer、リードスコアリング、標準のレポートなど、生産性を向上させるその他の機能を使用することで、営業チームは以前と比べるとほんのわずかな時間で見込み客の処理に必要なすべてを入手できます。

+ [Sales Cadence](https://qiita.com/Keiji_otsubo/items/703c9f71789cffe5a955)
+ [High Velocity Salesライセンスがないと表示できないカスタムボタン](https://qiita.com/Keiji_otsubo/items/9fce65a2e7dd748a6126)


# 未解決

+ [Pardot と Salesforce Engagement を使用している人はいますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIPaP)
Windowsのbat（コマンドプロンプト）でプリンター情報取得

# 名前だけ

```bat:
wmic printer get name
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/67029844-c462-08ae-a2b3-13fe1bff25a6.png)

# ステータスなどの情報も少しだけ取得

```bat:
wmic printer list brief
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7040cf0c-581f-83a5-8c6e-b8742eeb1c36.png)

# 割と詳細

```bat:
cscript C:\Windows\System32\Printing_Admin_Scripts\ja-JP\prnmngr.vbs -l
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/be3fcd99-e7d4-0eb3-8e80-ddc89f591edf.png)

# 詳細

```bat:
wmic printer list full
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c95f6018-c48d-44c1-8f78-b904de9641af.png)

# 参考サイトさん

https://thejuraku.com/pc/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E2%80%95%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99/

# バージョン

Microsoft Windows [Version 10.0.19045.4046]
WSL（Ubuntu22.04）環境構築




基本:

```sh
sudo apt install -y \
  zip \
  unzip \
  make \
  jq
  shellcheck \
  manpages-ja \
  manpages-ja-dev \
 direnv
```

direnv:

`vi ~/.bashrc`

```diff
+ eval "$(direnv hook bash)"
```

AWSCLI:

```sh
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
rm awscliv2.zip
rm -rf aws
```

Node.js, nmp

https://qiita.com/nouernet/items/d6ad4d5f4f08857644de
c++で標準入力から1行毎に読み込む

スクリプト系言語たとえば、python等でテキスト、データ処理をする場合に自分は結構やる方法で、標準入力からEOFまで１行単位にレコードを読んで行くというコードが、どうもc++でちゃんと記述されているページあまり見つからなかったので備忘録的に記載しておく。

```c++
#include <iostream>
#include <string>
using namespace std;
int main(){
  string buff;
  while(getline(cin, buff)){
    // なにかしたい場合ここで処理する
    cout << "[読み込んだデータ]" << buff << endl; 
  }
}
```
Windowsのコマンドプロンプト（bat）でプリンターのポート一覧を取得

# やり方

```bat:
cscript "C:\Windows\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs" -l
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/20555d72-3257-a4de-4405-8f26156f7ff2.png)

# 参考サイトさん

https://selog.hatenablog.com/entry/%3Fp%3D948

https://qiita.com/nichatter/items/c85e74e73bfbf26baf1d

# バージョン

Microsoft Windows [Version 10.0.19045.4046]
Reactユーザーが一生勘違いしているVueの双方向データバインディングについて、そろそろ分からせたい

## はじめに
ReactユーザーがVueの欠点として必ず挙げるもののひとつに **双方向データバインディング** があります。
彼らの主張によるとVueでは双方向データバインディングができてしまうことでデータの更新がカオスになってしまうと言うのです。

では何故実際にVueでデータの更新がカオスになって困ったという記事を全く見ないのでしょうか？
VueユーザーがReactユーザーに比べて優れているからでしょうか？

いいえ、違います。

そもそもVueの双方向データバインディングはただのシンタックスシュガーであり、本質はReactと同じ単方向データバインディングだからです。

## なぜ双方向データバインディングがダメと言われるようになったのか

その昔、フロントエンドのフレームワークはAngular一強という時代がありました。
当時、Angularは双方向データバインディングを採用したイケてるフレームワークとして多くのプロジェクトで使われていました。

しかし、アプリが複雑化していく中でAngularの双方向データバインディングの問題点を指摘する声があがりはじめます。

それはまさに冒頭で書いたデータの更新がカオスになってしまうというものでした。

しかし、これは厳密には双方向データバインディングによる問題ではありません。
問題の本質は、値の所有者である親が、子からの変更を受け入れるかどうかを決められなかったことにあります。

https://docs.angularjs.org/guide/component

コンポーネントが受け取る値を双方向にするかの設定は受け取る側にありました。

そのため子に渡した全ての値は子孫に更新される可能性があり、どこで更新されたのかはその値を受け取った全ての子孫をたどる必要がありました。

この、どの値がどこで更新されているのか特定しにくいということが過剰に問題視され、双方向データバインディングはダメだという意見が広まったように記憶しています。

ただ、Webアプリでは基本的になんらかの操作を起点に処理が実行されるので、実際にはそんな手に負えないようなことにはなったことはありません。

とりあえず双方向データバインディングをダメということがかっこいいみたいな風潮もあったように思います。

## ReactとVueで値の更新の流れの違い

これを説明するために、inputタグからの入力をpタグに表示する簡単な例をReact、Vueでそれぞれ実装してみます。

まず、単方向データバインディングといわれるReactでの例を見てみましょう。

```jsx
import { useState } from 'react';

function Example() {
  const [value, setValue] = useState("");
  function handleInput(e) {
    setValue(e.target.value);
  }
  return (
    <div>
      <input value={value} onChange={handleInput} />
      <p>{value}</p>
    </div>
  );
}
```

次に、Vueの例です。

```vue
<script setup lang="ts">
import { useState } from "./use-state";

const [value, setValue] = useState("");
function handleInput(e) {
  setValue(e.target.value);
}
</script>

<template>
  <div>
    <input :value="value" @input="handleInput" />
    <p>{{ value }}</p>
  </div>
</template>
```

なんということでしょう。それぞれの書き方の違いはあるもののほとんど同じです。

実際にはReactに寄せるためだけに以下のコンポーザブルを実装していますが、 `value属性` で値を渡し、 `input` イベントで値を更新するという流れは全く同じです。
（ReactのonChanageはinputイベントでも発火します）

```ts
import { ref } from 'vue'
export function useState(initialValue: string) {
    const value = ref(initialValue);
    const setValue = (newValue: string) => {
      value.value = newValue;
    }
    return [value, setValue] as const;
}
```

## Vueの双方向データバインディングとは

冒頭にも書きましたが、Vueの双方向データバインディングは単なるシンタックスシュガーです。

つまり、 `v-model` を使うことで上で書いた例を下記のように**簡単に記述することができるというだけ**なのです。

```vue
<script setup lang="ts">
import { ref } from "vue";

const value = ref("");
</script>

<template>
  <div>
    <input v-model="value" />
    <p>{{ value }}</p>
  </div>
</template>
```

## まとめ
双方向データバインディング自体に問題はありません。安心して使いましょう。
【XMonad】ManageHookに指定するWM_CLASSの調べ方とない場合の指定方法

XMonadをインストールしただけの状態ではパッケージのコメントが確認できず、何をどうやって指定すれば良いか分からなくなってしまうことが多々あるのでまとめます。

# はじめに

この記事では、XMonad.ManageHookに指定するWM_CLASSの調べ方と、取得できなかった場合の指定方法を紹介します。

```hs
myManageHook :: ManageHook
myManageHook = composeAll
    [
      -- ここに指定する文字列の調べ方
      className =? "zoom" --> doFloat
    ]
```

## 環境

- XMonad: xmonad 0.18.0

## 対象読者

- WM_CLASSの調べ方が分からない方
- Haskellの環境構築をしておらずclassNameなどのコメントが確認できない方

:::note warn
この記事の内容について
この記事ではHaskellの環境構築を行いません。
:::

## この記事を読むとできるようになること

- **WM_CLASSの取得**
- **WM_CLASSがない場合の指定方法**
- ManageHookに指定する値について

# WM_CLASSの調べ方

[xprop](https://www.x.org/releases/X11R7.5/doc/man/man1/xprop.1.html)コマンドを実行し、取得したいアプリケーションのウィンドウをクリックすることで取得できます。

```bash
$ xprop | grep WM_CLASS
# アプリケーションをクリック
WM_CLASS(STRING) = "Navigator", "firefox"
```

"Navigator"と"firefox"という2つの文字列が表示されました。
classNameを使う場合は、2番目の"firefox"を指定します。

```hs
myManageHook :: ManageHook
myManageHook = composeAll
    [
      className =? "zoom" --> doFloat,
      className =? "firefox" --> doFloat
    ]
```

# WM_CLASSがない場合の指定方法

例えばBraveのピクチャインピクチャモードなどはWM_CLASSが存在しません。
そのような場合は、WM_NAMEをtitleとマッチさせます。

```bash
$ xprop | grep WM_CLASS

$ xprop | grep WM_NAME
WM_NAME(UTF8_STRING) = "ピクチャー イン ピクチャー"
_NET_WM_NAME(UTF8_STRING) = "ピクチャー イン ピクチャー"
```

```hs
-- Brave-browser Picture in Picture
title =? "ピクチャー イン ピクチャー" --> doFloat
```

# ManageHookに指定する値について

（それぞれのコメントを確認すれば済む話ですが、わたしはXMonadのみをインストールして開発環境を構築していないため）
XMonad.ManageHookの[ドキュメント](https://hackage.haskell.org/package/xmonad-0.18.0/docs/XMonad-ManageHook.html)に解説が載っています。

## className

> **className** :: Query String
> Return the resource class; i.e., the second string returned by WM_CLASS.
>
> *https://hackage.haskell.org/package/xmonad-0.18.0/docs/XMonad-ManageHook.html#v:className*

classNameはWM_CLASSの2番目の値を返します。

そして`=?`と`-->`はそれぞれ、結果が等しい場合はTrueを返す、Trueを返したらManageHookを実行する、という意味です。
そのため、`className =? "xxx"`には結果が等しくなるようにWM_CLASSの2番目の値を指定すれば良いことになります。

## appName

> **appName** :: Query String
> Return the application name; i.e., the first string returned by WM_CLASS.
>
> *https://hackage.haskell.org/package/xmonad-0.18.0/docs/XMonad-ManageHook.html#v:appName*

appNameはWM_CLASSの1番目の値を返します。

例えば前のセクションでWM_CLASSを確認したfirefoxの例では、

```hs
appName =? "Navigator" --> doFloat
```

となります。

WM_CLASSを調べた数はそう多くありませんが、現時点ではWM_CLASSが一つしかないアプリケーションには遭遇していません。

また、resourceというappNameの下位互換エイリアスも存在します。

## title

> **title** :: Query String
> Return the window title.
> 
> *https://hackage.haskell.org/package/xmonad-0.18.0/docs/XMonad-ManageHook.html#v:title*

titleはウィンドウのタイトルを返します。

確かにBraveのピクチャインピクチャモードのタイトルを確認してみると、「ピクチャー イン ピクチャー」と表示されています。

WM_NAMEはウィンドウのタイトルと一致するようなので、WM_CLASSがない場合はtitleを使うことでフロート表示などをすることができます。

# まとめ

今回の記事では、XMonad.ManageHookに指定するWM_CLASSの調べ方と、取得できなかった場合の指定方法を紹介しました。

# 参考

https://unix.stackexchange.com/questions/241931/how-to-float-a-window-which-has-wm-name-but-no-wm-class
GASの実行許可について

# はじめに
Spreadsheetをデータベースにしたり、SpreadsheetをExcelのマクロと同様に業務効率を上げるために使ってたりするので、マクロと違って操作する人に一度実行許可を付与してもらわないといけない為、手順をここに記す

## 手順1：AppsScriptのエディタを開く
+ Spreadsheetのメニューから「**拡張機能**」をクリック
+ 開いたメニューの「**AppsScript**」をクリック
+ 別ウィンドウでAppsScriptのエディタが開くのでそちらに切り替える

![スクリーンショット 2024-02-20 9.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/e15f38bb-882d-f627-ebfd-f82b1b3fa037.png)


## 手順2:何かしらプログラムを実行する
+ 実行許可の承認フローに入る為、指定されたプログラムを実行します
:::note info
作成した人から「**このプログラム**を実行してください」みたいな指定がない場合は以下のプログラムをエディタの一番上に追加して実行しましょう
:::
```JavaScript:gas.gs
const test = () =>{
    console.log('承認フロー')
}
```
:::note warn
追加した場合は、「Ctrl + S」か「command + S」で必ず保存しましょう
:::

![スクリーンショット 2024-02-20 10.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/7d1fe97b-dcfc-18de-01ee-e06cbd996cf4.png)


+ メニューから実行したいプログラムを選択します
:::note info
ここでは、上記の「test」という何もしないプログラムを追加したので「test」を選択し、クリックします
:::
![スクリーンショット 2024-02-20 10.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/bc844b15-7bf0-9406-44ea-9e2de791e7b3.png)


+ 実行するプログラム名の2つ隣にある「**▷実行**」をクリックします
![スクリーンショット 2024-02-20 10.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/a4829607-fb3c-b539-8ada-cd4a60ae715b.png)

## 手順3:実行許可承認のフロー
+ 実行ボタンを押すと初回及び新しい機能が追加された場合などに「承認が必要です」のダイアログが出現します
![スクリーンショット 2024-02-20 10.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/c0db560a-3865-7387-6bd5-4d81b4b17ad9.png)

+ 「**権限を確認**」ボタンを選択します

+ アカウントの選択
アカウントの一覧が表示されますので、プログラムを実行するアカウントを選択してください
:::note info
ここでは自分のアカウントを選択します
:::
![スクリーンショット 2024-02-20 10.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/b2ac818f-5da7-4992-9979-522adb46b2a4.png)

+ プログラムの実行を行うのに必要な権限のリクエストが表示されます
![スクリーンショット 2024-02-20 10.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/2f082476-9ee5-07fb-153f-ef5f6031c3f0.png)

+ 「**許可**」ボタンを押下します

## 手順4:警告の表示を確認
:::note info
ここから先は無料のGoogleアカウントのみ表示されます
:::

+ 左下にある「**詳細**」ボタンを選択します
![スクリーンショット 2024-02-20 10.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/3b0da11e-e1d5-8c58-1d8c-e38bca002ab7.png)

+ 下に表示された「**安全ではないページに移動**」を選択します（無題のプロジェクトという表示は変わります）
:::note alert
信頼出来る人が作成したプログラムではない場合は、注意が必要です
:::
![スクリーンショット 2024-02-20 10.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56585/3fd7a1d8-33da-43bf-221d-151b98af7be0.png)

:::note  info
手順4は手順3の前に表示されることがあります
その場合は、手順4→手順3と進めてください
:::

# 終了
以上で必要な承認作業が終了です
これ以降は承認作業無しでプログラムが実行されます

:::note info
新しい機能が追加されてそれまでに使用してなかったツール（GmailやGoogleDocsなど）が使用される場合などは再度、この作業が必要になります
:::
InboundEmail オブジェクトの使用


+ [InboundEmail オブジェクトの使用](https://help.salesforce.com/s/articleView?id=sf.code_inbound_email.htm&type=5)

Apex メールサービスドメインが受信するすべてのメールについて、Salesforce は、そのメールの内容と添付ファイルを含む個別の InboundEmail オブジェクトを作成します。Messaging.InboundEmailHandler インターフェースを実装する Apex クラスを使用して、受信メールメッセージを処理できます。そのクラスで handleInboundEmail メソッドを使用して、InboundEmail オブジェクトにアクセスし、受信メールメッセージの内容、ヘッダー、および添付ファイルの取得と、その他多数の機能を実行することができます。



# 類似の質問

+ [カスタムオブジェクトに関する受信メールを受信する方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A85XESAZ)
+ [電子メールを受信できるカスタム オブジェクトを作成するにはどうすればよいですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X9m3g)
ゲストユーザーとなっているテナントのPower BI Serviceにログインする

以下のリンクからログイン
https://app.powerbi.com/singleSignOn?ctid=[ディレクトリID]

この画面ではゲストユーザーのUPNを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/f63cbf4d-0d5e-5e9b-d85a-60c46dd77696.png)

Entra ID認証の画面の際は親ディレクトリのUPNで認証
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/3db7c6d5-a350-dde0-f51a-945c0bfb6ae9.png)
Microsoft Copilotで、日本語プログラミング その19

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
問題が、思いつかないので教えてもらった。

# Ohisama prompt

```

競技プログラミングの上達に必要な、 "学ぶべき" アルゴリズムを教えてください。
```

# 回答
競技プログラミング（競プロ）は、問題を解くことでプログラミング能力を競う大会です。競プロで上達するためには、様々なアルゴリズムやデータ構造を学び、それらを問題に応用できるようになる必要があります。

競プロで学ぶべきアルゴリズムは、レベルによって異なりますが、一般的には以下のようなものが挙げられます。

- 初級者：全探索、二分探索、深さ優先探索、幅優先探索、動的計画法、ダイクストラ法、ワーシャルフロイド法、クラスカル法、素数判定、べき乗計算、逆元計算、累積和など
- 中級者：座標圧縮、半分全列挙、行列累乗、ダブリング、Grundy数、ローリングハッシュ、平方分割、最大流、最小カット、二部グラフ判定、二部マッチングなど
- 上級者：セグメント木、遅延評価セグメント木、Binary Indexed Tree、Lowest Common Ancestor、Heavy-Light Decomposition、Convex Hull Trick、Z-algorithm、Suffix Array、Segment Tree Beats、Persistent Data Structure、Treap、Link-Cut Tree、Mo's Algorithm、Dynamic Connectivityなど

これらのアルゴリズムやデータ構造を理解するためには、本やウェブサイトなどの教材を利用すると良いでしょう。例えば、以下のような教材がおすすめです。

- [競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77の技術](^4^)：競プロで必要なアルゴリズム・データ構造・考察テクニックを丁寧に解説した本です。例題や演習問題も豊富にあります。
- [レッドコーダーが教える、競プロ・AtCoder上達のガイドライン](^1^)：AtCoderでレッドコーダー（レーティング2800以上）になるためのガイドラインを書いたウェブサイトです。初級編、中級編、上級編の3つに分かれており、それぞれに必要なアルゴリズムやデータ構造が紹介されています。
- [プログラミングコンテストチャレンジブック（蟻本）](^3^)：競プロでよく使われるアルゴリズムやデータ構造を網羅的に解説した本です。初級から上級までのレベルに応じた問題があります。

これらの教材を参考にして、競プロで学ぶべきアルゴリズムを身につけてください。競プロは、アルゴリズムやデータ構造だけでなく、数学や論理的思考なども必要とします。競プロで上達するには、多くの問題に挑戦し、自分の弱点を克服することが大切です。競プロは楽しくて面白いものですので、ぜひ挑戦してみてください。?

ソース: Bing との会話 2024/2/20
(1) 競技プログラミングの鉄則 アルゴリズム力と思考力を高める77 .... https://honto.jp/netstore/pd-book_31847742.html.
(2) レッドコーダーが教える、競プロ・AtCoder上達のガイドライン .... https://qiita.com/e869120/items/eb50fdaece12be418faa.
(3) 競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77 .... https://www.amazon.co.jp/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E9%89%84%E5%89%87-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%8A%9B%E3%81%A8%E6%80%9D%E8%80%83%E5%8A%9B%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B77%E3%81%AE%E6%8A%80%E8%A1%93-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E7%B1%B3%E7%94%B0/dp/483997750X.
(4) レッドコーダーが教える、競プロ・AtCoder上達のガイドライン .... https://qiita.com/e869120/items/acba3dd8649d913102b5.
(5) 『競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める .... https://booklog.jp/item/1/483997750X.



以上。
VSコード htmlの基本構文を一気に設定する


htmlファイルを作成し
VSコードに　html:5  と書いて + Tabキーを押します
![html.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/bc62e066-91fc-04b4-ef6d-07e432c74146.png)

そうすると基本構文が一気に書き出されます
![kihon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717237/f5200f37-6f14-57e8-2c28-c6ea8f5f2202.png)
dSYMをBitrise上に保存する

dSYMをBitrise上に保存する方法です。

CIでipaファイルを作成してAppStoreConnectにアップロードしていると、たまにdSYMが手元になくて困るパターンがあるかもしれません（Crashlyticsへのアップロード失敗するなど）。そういった場合に備えてdSYMを保存しておくとよいかもしれません。ipaファイルもCIでビルドしたものをダウンロードしたいような要件でも同じ方法で対応できます。

## 方法
BitriseにはArtifactsというビルド時に生成されたファイルやデータがあります。これらを毎回取っておくとデータ量がすごいのでデフォルトでは削除するようになっています。

指定してやると消さずに残すことができます。

以下のように `$BITRISE_DEPLOY_DIR` に残したいファイルを配置し、`deploy-to-bitrise-io` を行うことで$BITRISE_DEPLOY_DIRに配置したファイルが保存されます。


```yaml
## bitrise.yml
    - script@1:
        title: save artifact
        inputs:
        - content: |-
            cp *.dSYM.zip $BITRISE_DEPLOY_DIR
    - deploy-to-bitrise-io@2.7.3: {}
```

あくまでこれは [deploy-to-bitrise-io](https://github.com/bitrise-steplib/steps-deploy-to-bitrise-io/tree/master) のデフォルトの挙動となっています。

Exampleにもあるように `deploy-path` を指定してやることで$BITRISE_DEPLOY_DIR以外のpathも利用することができます。

```yaml
- deploy-to-bitrise-io:
    inputs:
    - deploy_path: /path/to/a/single/file.txt
```

```yaml
- deploy-to-bitrise-io:
    inputs:
    - deploy_path: /path/to/a/folder
```

成功するとArtifactsのところで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6149/910bd043-de61-15cf-ca19-805715c21c9b.png)
[翻訳転載] Golang Tip #1: 1行のコードで関数の実行時間を計測する

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1725431804667244715?s=20

[Tip #2のマルチステージdefer](https://qiita.com/a10a/items/890dee753883decbfd42)を使用する方が良いと思う。

このPostをした後に改善版としてTip #2をPostしたのかもしれない

# Golang #1: 1行のコードで関数の実行時間を計測する

![image](https://pbs.twimg.com/media/F_H3DlDasAA_9SH?format=jpg&name=medium)
Ubuntuでaptを用いずGoインストール

[CircleCIのcimg-go](https://github.com/CircleCI-Public/cimg-go/blob/main/1.22/Dockerfile)や、公式の[インストール手順](https://go.dev/doc/install)を参考に作成。

Install:

```sh
## バージョン情報を記載
$ GO_VER="1.22.0"
$ ARCH="amd64"

## ダウンロード
$ curl -sSL "https://go.dev/dl/go${GO_VER}.linux-${ARCH}.tar.gz" | sudo tar -xz -C /usr/local/

## PATHを通す
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
$ echo 'export PATH="$(go env GOPATH)/bin:$PATH"' >>  ~/.bashrc

$ source ~/.bashrc

## 動作確認
$ go version
go version go1.22.0 linux/amd64
```

Uninstall:

```sh
$ rm -rf /usr/local/go
$ sed -i '/export PATH=$PATH:\/usr\/local\/go\/bin/d' ~/.bashrc
```

VS Code:

```
echo "check_certificate = off" >> ~/.wgetrc
```

上記で code .で起動。
[翻訳転載] Golang Tip #2: Golang Tips #2: マルチステージdefer

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1726279577327342009?s=20

`defer`を工夫すると呼び出し時とdefer時（これをなんて言うかわからない）の処理を１つの関数で書くことができる、という内容になります。

個人的にはなるほど確かに賢いな、と思う反面、メインの処理で`defer`を見た時に考慮すべきことが増えそうなので、濫用すべきではないかと思いました。

後続のPostに投げられている実行時間計測では便利のかも、と思いつつ、計測開始タイミングは指定できる一方計測終了タイミングは`defer`のタイミングでしかないので使いづらいのでは、と思ったり。

![image](https://pbs.twimg.com/media/F_T6MCQaUAAEHN9?format=jpg&name=medium)

# Golang Tips #2: マルチステージdefer

`defer`だけで、ある関数を別の関数の最初と最後の両方で実行することができる。

![image](https://pbs.twimg.com/media/F_T1aJraoAAjED7?format=jpg&name=medium)
Oracle のlogon triggerによるシノニム機能実現

# シノニム機能

Oracleはシノニム利用して、他スキマーのテーブルにOwner名省略してアクセス可能です。

例：

+ 二つスキマーがあります、APPOとAPP1
+ APPOにT1というテーブルがあります
+ APP1からAPPO.T1にSELECTします
```
--Schema: APPO
SQL> CREATE TABLE T1(NAME1 VARCHAR(50));
Table created.
 
SQL> INSERT INTO T1 VALUES('YEAR2024');
1 row created.
 
SQL> COMMIT;
Commit complete.
 
SQL> SELECT * FROM T1;
NAME1
--------------------------------------------------
YEAR2024
 
SQL> GRANT SELECT ON T1 TO APP1;
Grant succeeded.
 
--Schema: APP1
--直接アクセス
SQL> SELECT * FROM APPO.T1;
NAME1
--------------------------------------------------
YEAR2024
 
--SYNONYM作成してアクセス
SQL> CREATE SYNONYM T1 FOR APPO.T1;
Synonym created.
 
SQL> SELECT * FROM T1;                                 
NAME1
--------------------------------------------------
YEAR2024
```
# logon triggerによるシノニム機能実現
+ シノニム利用のアクセスはシノニム作成する手間がかかりますから、logon triggerでシノニム作成せず、シノニムのようにアクセス方法を紹介します。
+ sysユーザー下記のlogon trigger作成
```
--sysユーザーで下記のtrigger作成
create or replace trigger TR_LOGON
after logon on database
declare
        v_username      varchar2(20);
begin
        SELECT sys_context('userenv','SESSION_USER') INTO v_username FROM DUAL;
        if sys_context('userenv','isdba') = 'FALSE' then
             if v_username != 'DBSNMP' and v_username != 'SYS'
                and v_username != 'SYSTEM'
            then
                if (v_username = 'APP1')
                then
                    execute immediate 'alter session set current_schema=APPO';
                end if;
           end if;
       end if;
end;
/
```
+ 対象テーブル(T1)の権限付与のみ、シノニムのようにアクセス可能になります
+ 上記の例
```
--Schema: APPO
SQL> CREATE TABLE T1(NAME1 VARCHAR(50));
Table created.
 
SQL> INSERT INTO T1 VALUES('YEAR2024');
1 row created.
 
SQL> COMMIT;
Commit complete.
 
SQL> SELECT * FROM T1;
NAME1
--------------------------------------------------
YEAR2024
 
SQL> GRANT SELECT ON T1 TO APP1;
Grant succeeded.
 
--Schema: APP1
--直接アクセス
SQL> SELECT * FROM APPO.T1;
NAME1
--------------------------------------------------
YEAR2024
 
#SYNONYM作成せずアクセス
SQL> SELECT * FROM T1;                                 
NAME1
--------------------------------------------------
YEAR2024
 
--sys/system　からシノニム作成されてないことを確認
SQL> select count(*) from dba_synonyms where synonym_name='T1';
  COUNT(*)
----------
         0
```
+ 上記のlogon trigger方式は権限的にシノニム作成と一緒で、object ownerから権限付与されてないobjectにアクセスできないです。
# ユースケース
+ よく利用されているユースケースを一つ紹介します。
+  アプリ用アカウントのパスワードは定期的に変更必要なケース
    + 三つアカウント作成
        + APPO：全ObjectのOwner
        + APP1：アプリ用
        + APP2：アプリ用
    + APP1とAPP2は交代方式でアプリ側に利用していただく
    + パスワード変更シナリオ
        + APPOのパスワード変更はアプリに影響がないため、いつでも変更可能です。
        + APP1とAPP2のパスワード変更はrolling方式で変更
            + 仮に現在アプリがAPP1を利用してDBに接続している
            + APP2はアプリに未使用のため、APP2のパスワードを変更します
            + アプリ側はAPP1からAPP2に利用切替していただく
            + APP1のパスワードを変更します
# 最後
+ logon triggerを活用すれば、他にも色々実現できます。
    + 例：Oracle DB ACLの実装やログイン履歴ロギング等々。