OmniAICreator/Qiita-1.07M huggingface dataset:
Very useful Figma API & plugins

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/397d433a-f9fa-cabd-09a2-49c334ecb6e3.jpeg)

## Plugin

[Scripter](https://www.figma.com/community/plugin/757836922707087381): Speed up your workflow or experiment with the Figma API through scripts.

[Google Sheets Sync](https://www.figma.com/community/plugin/735770583268406934/Google-Sheets-Sync): Sync content from Google Sheets directly into your Figma file

[Node Inspector](https://www.figma.com/community/plugin/758276196886757462): View and copy node properties for plugin development.


## API

```js
// get node text content
const title = figma.getNodeById("1:121")
console.log(title.characters)

// set node text content
title.characters = "abc"

// fetch image from url
figma.createImageAsync(
  'https://picsum.photos/200'
).then(async (image: Image) => {
  const imgnode = figma.getNodeById("1:11")

  // Resize the node to match the image's width and height
  const { width, height } = await image.getSizeAsync()
  imgnode.resize(width, height)

  // Set the fill on the node
  imgnode.fills = [{
      type: 'IMAGE',
      imageHash: image.hash,
      scaleMode: 'FILL'
    }
  ]

}).catch((error: any) => {
  console.log(error)
})

////////////////////////////////////

// Create an instance from the component
const template = figma.getNodeById("1:123")
let ins = template.createInstance()

// get ins children
let person = ins.children[8]

// create style
let styleName = `chinese_tradition_color/${color.name}`
let style = figma.createPaintStyle()
style.name = styleName

style.paints = [{
  blendMode: "NORMAL",
  color: [251, 164, 20], // 淡橘橙
  opacity: 1,
  type: "SOLID",
  visible: true,
}, ]

ins.fillStyleId = style.id

```

## batch create invites  

1. download scripter plugin https://www.figma.com/community/plugin/757836922707087381/scripter
 

2. Enter the following

```javascript
function createPost(template, items) {
  let arr = []
  for (const item of items) {
    let ins = template.createInstance()
    let person = ins.findOne((n => n.name === "#name"))
    ins.name = item.name
    person.characters = item.name
    arr.push(ins)
  }
  return arr
}

const list = [{
    name: "shooter",
  },
  {
    name: "tiny",
  },
  {
    name: "bob",
  },
  {
    name: "alice",
  }
]

const component = figma.currentPage.findOne((n => n.name === "#Poster"))
const posts = createPost(component, list)

```

---

Ref:

https://moonvy.com/blog/post/2022/eszy-use-figma-script/

https://www.hypermatic.com/

https://www.figma.com/plugin-docs/api/properties/nodes-exportasync/

https://www.figma.com/plugin-docs/api/ExportSettings/
Epic Online ServicesとAdvanced Steam Sessionsのメリット・デメリット

・EpicOnlineServiceのメリット
    UnrealEngineを使用しての通信方法であればとても簡単に使用できる。
・EpicOnlineServiceのデメリット
　　使用する準備の手間がとてもかかる。
　　BETAの機能である。
　　別々のPCでテストをする時、２つのEpicのアカウントを用意する必要がある。
・Advanced Steam Sessionsのメリット
　　通信機能の準備が簡単。
　　すごく簡単に組むことができ、ラグも少ない。
・Advanced Steam Sessionsのデメリット
　　サイトからプラグインをダウンロードする必要がある。
　　Visual studioで一度起動する必要があり、BPプロジェクトで導入するには手間が少しかかる。
　　別々のPCでテストする時、2つのsteamアカウントを必要とする。

・まとめ
　　Advanced Steam Sessionsの方が簡単に導入することができる点で優れていると感じた。
sqlite3を使う時に罠にハマった話

## sqlite3を使う時に罠にハマった話

どうも、初投稿の新米システムエンジニア、waddaです。
先日sqlite3を使ってシステムを作る機会があったのですが、
なぜかどうやっても外部キー制約がうまく働かず、調べて見たところ！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3488999/384534d4-5bf7-c329-e05e-dd2d3c935b89.png)

### あああああああああああああ
結構な時間を溶かした気がします。。。。。
有効にするにはホームディレクトリに.sqlitercというファイルを作って
```
PRAGMA foreign_keys=ON;
```
と記述しないといけないみたいでした


同じ罠にハマって時間を溶かす人が少しでも少なくなるよう（いるかわかりませんが）共有させていただきます；；
Fog::AwsでLocalStackで動いているサービスと通信したいとき

開発環境でAWSのサービスの代替としてLocalStackを使ってサービスを立ち上げているときに、fog-awsの設定の仕方がわからなかったので調べた。
host, port, schemeをオプションで設定してあげればOK。

```ruby
Fog::AWS::SNS.new(region: 'us-east-1', aws_access_key_id: 'test', aws_secret_access_key: 'test',
                    host: 'localstack', port: 4566, scheme: 'http')
```
【Mac M1】VSCodeインストール





私ごとですが、パソコンを変えたので
VSCodeも改めて導入！
前回は研修中にサイトから引っ張ってきたけど
今回はHomebrewなんてものも使ってみちゃおう！

と意気込んでみたものの
まさかのうまくいかない事態。。。


結論からお伝えすると安定のM1チップが原因でした。

流石に私にも記事を書けということじゃないかと思い、
いい機会なのでこれも残しておきます。


## M1チップって？？
『M1チップ』は、Appleが独自開発したチップのことで、CPUやGPUなどのPCの動作上、重要なチップを１つのチップにまとめて組み込んだもののようです。
元々はIntel


一番のメリットは、従来よりも処理性能が向上されたこと

そんなM1チップですが、『Virtual Box』のみならず
今回の『Homebrew』をターミナルからインストールするにあたっても、
しっかりと妨げになっているようでした。


## Homebrewのインストール方法
後ほど失敗例も載せますが、先にインストール方法記載しちゃいます。




まずはFinderからアプリケーションを開く

アプリケーションから「ユーティリティ」を開く

![ユーティリティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/32ac2fb5-43f2-28ca-1768-601a23209caa.png)

中にある「ターミナル」の「情報を見る」をクリック

![情報を見る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/1e6bbfa7-9eea-b812-a570-562a90311e23.png)


「Rosettaを使用して開く」のチェックボックスをクリックして有効化する

![Rosseta有効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/e5542180-73bd-2b4a-e1ed-2e57560fe284.png)

ここまでで事前準備が完了になるので
ターミナルを開きます！！！

Homebrewのインストール状況を確認。
~~~md:terminal
brew -v
~~~

![brew-v改.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/eccd818b-1fae-3aec-306d-cab592796aaf.png)


command not found… インストールされていないことを確認！

Homebrewをインストールするために
以下のコマンドを入力


~~~md:terminal
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
~~~

Passwordの入力を求められるので
MacBookのパスワードを入力


![Enter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/881e76f6-1d82-39b2-8cab-4ec8ecc4613f.png)


Enterを求められるのでEnterを押下

![Press Enter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/4ddb66df-07f3-fd27-6021-11249b0a42ac.png)


無事にインストールが完了しました！

先ほどのように確認コマンドを入力すると
ご丁寧にバージョンまで教えてくれてます。。。

~~~md:terminal
brew -v
~~~


![Install完了_確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/5c2899c5-4cb7-27a6-996a-7c33a6941ba9.png)



## VSCodeの導入

以下のコマンドを実行して、VSCodeをインストール

~~~md:terminal
brew install visual-studio-code
~~~
<br />


:::note warn
各サイト上で「--cask」も併せて入力している記載がありますが、
自分はうまくいかず、上記コマンドだと成功しました。
:::


![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2090432/3e6ae285-c414-85ff-d256-e62ea8a63610.png)

インストール完了後、「Launchpad」上にVSCodeがあれば導入完了！

お疲れ様でした！！



## 失敗談

:::note alert
つまづき①
Rosettaを有効化していない
:::
<br />


:::note alert
つまづき②
Command line tools for Xcodeが必要
:::


Macのターミナルで以下のコマンドを入力
~~~md:terminal
xcode-select --install
~~~


command line toolをダウンロードしますか
とポップアップが表示されるのでインストールする。
<br />
<br />


:::note alert
つまづき③
brew cask install visual-studio-codeだとErrorが出現
:::

なんだかcastの仕様が変わったことが原因だとか。。。
SPSS Modelerと商用CPLEXの連携を行う

SPSS ModelerのCPLEXノードは、デフォルトでは組み込まれているCPLEXのCommunityEditionを利用して動いています。

組み込み Community Editionでは、変数は 1000 個まで、制約も 1000 件までに制限されます。 

これを超えるような問題を解こうとすると以下のエラーになります。

>CPLEX コンポーネントの最適化例外:　CPLEX Error 1016: Community Edition. Problem size limits exceeded. Purchase at http://ibm.biz/error1016.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e5f363ac-9e37-d72d-49fc-6855be1c34cf.png)

制限を超えるためには有償版の IBM ILOG CPLEX をインストールします。
導入すべきバージョンはModelerのバージョンによっても異なります。
Modeler 18.4の場合は以下にCommunity Editionのライブラリが入っていました。ここにあるのは22.1.0のバージョンのDLLでしたので、CPLEXの22.1.0を導入します。
C:\Program Files\IBM\SPSS\Modeler\18.4\ext\bin\pasw.cplexopt\opl

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5b5907b3-754a-0842-bd15-9044c65fe942.png)

次に、options.cfg に OPL ライブラリーのパスを追加します。 


```cfg
# Enter in the directory path to the OPL library of full version of CPLEX if you have that installed and want to use it instead of the Community Edition.
# It looks like "<CPLEX Installation Path>\\opl\\bin\\<Platform Name>"
cplex_opl_lib_path, "C:\\Program Files\\IBM\\ILOG\\CPLEX_Studio2210\\opl\\bin\\x64_win64"
```

options.cfgは以下などにあります。
"C:\Program Files\IBM\SPSS\Modeler\18.4\config\options.cfg"
Python・R学習を始めたい人のためのツール・開発環境一覧

企業でデータアナリスト向けの研修を受けられることになったので再びPython・Rの学習を再開しました。今回はまずデータ分析に必要な開発環境・ツールを簡単に紹介しておきます。

# Python
Pythonのインストーラーです。
Pythonそのものを実行するのに必須となります。
https://www.python.org/downloads/

# PyCharm
Pythonの統合開発環境(IDE)の1つです。仮想環境を分けるなど便利機能が備わってます。データ分析・機械学習ではないプログラム・ソフトウェアはこっちで制作しています。
https://www.jetbrains.com/ja-jp/pycharm/

# Anaconda( JupyterNotebook、RStudio )
データアナリスト・AIエンジニアのための開発ツールを合わせた便利なパッケージ集です。Pythonを使ったデータ分析用の開発環境はこれでほぼ整います。個人的にはJupyterNotebook・RStudioをよく活用します。
https://www.anaconda.com/

# RStudio Desktop
Rを実行するための統合開発環境(IDE)です。Rの実行ファイルをDLしたのちに導入してください。Rは統計解析や確率的プログラミングに特化した言語で、平均・標準偏差といった特徴量の算出の他、統計的仮設検定などの統計解析の手法が実行できるようになります。
https://posit.co/download/rstudio-desktop/

# Colaboratory
Googleのサーバー上でWEBアプリケーションや機械学習を実行するためのサイトです。自環境では機械学習に必要なハードがない時などに便利です。
https://colab.research.google.com/?hl=ja
elasticsearch-railsで詳細なログを出す

elasticsearch-railsを使ってelasticsearchとやりとりするときに、詳細な通信ログを見る方法。
`log: true, trace: true`をオプションで渡せばOK

```ruby
Elasticsearch::Client.new(hosts: 'localhost:9999', log: true, trace: true)
```

リクエストとレスポンスのJSONと、curlコマンドまで出してくれる。

```
2023-06-23 00:00:00 +0900: > {"query":{"bool":{"filter":[{"terms":{"id":[999]}}]}},"sort":{"id":"desc"},"size":100,"from":0,"track_total_hits":true,"_source":["id"]}
2023-06-23 00:00:00 +0900: < {"took":6,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":0,"relation":"eq"},"max_score":null,"hits":[]}}

curl -X POST -H 'x-elastic-client-meta: es=7.13.3,rb=2.7.0,t=7.13.3,fd=1.10.2,hc=2.8.3, User-Agent: elasticsearch-ruby/7.13.3 (RUBY_VERSION: 2.7.0; linux aarch64; Faraday v1.10.2), Content-Type: application/json' 'http://localhost:9999/applications/_search?pretty' -d '{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "id": [
              999
            ]
          }
        }
      ]
    }
  },
  "sort": {
    "id": "desc"
  },
  "size": 100,
  "from": 0,
  "track_total_hits": true,
  "_source": [
    "id"
  ]
}'
```
"cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'"の原因

# 発生したこと
いつもの環境とは別の環境で開発を進めようと、
・git clone して、
・python -m pip install -r requirements.txt して、
・uvicorn main:app --reload して、
プログラム(FastAPI)を起動したら、

**"cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_'"**

が発生。

直近のurllib3のバージョン変更によるものですが、日本語の記事が全然なかったので共有です。

# 原因
**原因は「urllib3」が、つい2週間前(2023年6月前半)にLatestが、
1系から2系になったことによるものらしい。**
　⇒botocoreが、urllib3 2.0をまだサポートしていない 。
　　※すぐに、botocore側も追従されるかもですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93661/c184d0c8-f3c9-4f6b-9968-6554f7e5a1f8.png)

# 対処
なので、
``` $ pip uninstall urllib3```
で現在のurllib3を削除、

```$ python -m pip install 'urllib3<2'```
で、1.26.16をインストールすることで解消。

どうやら、Lambda上で動かすときにも引っかかるとかいう記事があるので、
引っかかった場合、この変を見てみるとよいかも。

※環境は、WSL2のubuntu 20.04、Pythonは3.9
Googleカレンダーに登録された休日・有給の情報を取得し、勤怠表に反映させてみた

## **はじめに**
社内DXの一環で、スプレッドシートで勤怠管理表のシステム化を図りました。
弊社はタイムレコーダーに紙を突っ込むという~~昭和~~昔ながらの手法を採用していましたが、
この度、覚えたてのGASを駆使して勤怠表の作成を試みました。
早速、その機能とレイアウトを見てみましょう。

## **勤怠表の機能とレイアウト**
以下の画像はスプレッドシートで作成した勤怠表のレイアウトです。
![layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458129/9e3974b8-5f60-125b-6bb7-9c579d883fe1.png)
各々ボタンを押すことで、現在の日付・曜日・出勤時刻・退勤時刻などがシートに記入されるようになっています。
最終行+1行に打刻するようにプログラムしているので、打刻忘れに気が付きやすいです。
備考欄には、出欠の状況が反映されるようにしています(例えば、出勤なら出勤。有給休暇なら有給。在宅利用なら在宅など)。それらを各々数え上げることで出勤日数、在宅利用数、勤務日数、有給休暇数、欠勤数などが弾き出されるようになっています。
カスタムメニューには、集計(総実働時間数)、来月分のシートの生成などが含まれています。
特に変わった機能もなく、一般的な勤怠表のため、コードは割愛します。

## **課題**

打刻忘れに気が付きやすい反面、休日にも打刻する必要があります。休日出勤も厭わないマゾ気質には大きく刺さる仕様となっています。
しかし、この問題はトリガーを土日にセットしておくことで見事解決！.....しなかった。
弊社は土曜日が不定休なため、その都度、トリガーを消しては設置して、、設置しては消して、、を繰り返さなければならず、当然この作業はストレスフルで、非常に面倒臭いです。

幸いにも弊社の休日カレンダーはGoogleカレンダーにて登録・管理されているので、そのイベント情報を取得し、当日に関数(打刻する)を実行するようなスクリプトを作成すれば、無事解決しそうです。
細かい不備はあるものの、勤怠表として十分扱えるものだと思います。


## コード
以下がGoogleカレンダーに登録されたイベント情報を取得し、それが存在する場合のみ関数を実行するスクリプトです。
```
  function set_Calendar() {
  const CalendarID = 'Calendar_ID';  //GoogleカレンダーのID
  const Calendar = CalendarApp.getCalendarById(CalendarID);
  const now = new Date(); //現在の日付を取得
  const events = Calendar.getEventsForDay(now); //本日のイベントを取得

  //イベントが存在する場合にのみ function_rest 関数を実行
  if (events.length > 0) {
      function_rest();  
  }
}
```
これはGoogleカレンダーに登録されたイベント数が、0以上ならfunction_restを実行するプログラムです。
取り敢えず、1行ずつコードを見ていきましょう。

- 1行目　Googleカレンダーに登録したイベントのIDを取得します。
- 2行目　1行目で指定したIDのGoogleカレンダーを取得します。
- 3行目　現在の日時を取得します。
- 4行目　取得したカレンダーにおける今日のイベントを全て取得します。
- 5行目　イベントが1個以上存在する場合のみ、function_rest関数を実行します。

ここで、function_rest関数は「休日」と打刻する関数を想定しています。
また以下は、Googleカレンダーに登録したイベント名が「有給　名前」と一致した場合に限り、function_rest関数を実行するプログラムとなっています。

```
function checkEvents() {
  const calendarId = 'Calendar_ID'; 
  const calendar = CalendarApp.getCalendarById(calendarId);
  const now = new Date();
  const events = calendar.getEventsForDay(now);
  
  for (let i = 0; i < events.length; i++) {
    if (events[i].getTitle() === '有給　名前') {
      function_rest();
    }
  }
}
```

これらの関数を毎日定刻（例えば、午前0時など）にトリガーの設定を行なうことで、
会社カレンダーに準じた休日、および有給の打刻を自動で行なってくれるようになります。


## **まとめ**
以上、Googleカレンダーに登録した休日・有給の情報を取得し、それをスプレッドシートで作成した勤怠表に反映させる方法についてでした。
土日が完全に休日の会社にとっては無縁な機能ですが、土曜日が不定休な弊社にとっては嬉しい機能だと思います。
土曜日が不定休で、スプレッドシートで勤怠表を自作してみようとしている方が居られるなら、是非試してみて下さい。
Angularで使える高機能グリッドライブラリ

# はじめに

toB向けのシステム開発に携わっていると、"Excelライクなグリッド機能"をシステム上に実装して欲しいという要望が度々上がることがあります。ユーザーの多くがシステム外ではExcelやGoogleスプレッドシートで業務しているため、システム内でも似たような操作性や機能を提供することを求められます。
具体的には、セル同士を矢印キーやTabキーで移動したり、セルをダブルクリックすると編集モードに切り替わってデータ入力ができたり、フィルタリングやソートの機能が提供されているか等です。

上記を満たすExcelライクな操作/機能を提供してくれるライブラリはいくつか存在するため、記事にまとめました。私の周りではAngularを採用しているケースが多いため、Angularをサポートしているライブラリをピックアップしています。

# グリッドライブラリ
- ag-Grid
  - 公式サイト: https://ag-grid.com/
  - Github: https://github.com/ag-grid/ag-grid¥
  - 料金: 無料（より高機能を求める場合は有料版もあり）
- Wijimo
  - 公式サイト: https://www.grapecity.co.jp/developer/wijmo
  - Github: なし
  - デモサイト: https://demo.grapecity.com/wijmo/demos/Grid/Overview/angular
  - 料金: 有料（無料版はウォーターマークが表示される）
- PrimeNG
  - 公式サイト: https://primeng.org/
  - Github: https://github.com/primefaces/primeng
  - デモサイト: https://primeng.org/table
  - 料金: 無料
 
## ag-Grid

ag-Gridはグリッド機能に特化したライブラリで、一部の機能を除いて無料で利用することができます。無料版ではフィルタリングやソートなどのグリッドの基本的な機能が提供されています。特に拡張性が高い印象があり、[イベントハンドラ](https://www.ag-grid.com/angular-data-grid/grid-events/)の提供が豊富なのでフックして振る舞いを変更することや[セルに独自のコンポーネントを割り当てること](https://www.ag-grid.com/angular-data-grid/component-cell-renderer/)が可能です。

- [デモサイト](https://www.ag-grid.com/example/)

また、大規模なデータセットを扱うことに長けている印象があり、行列を仮想化してブラウザでのレンダリング範囲を最小限に抑えることやそのレンダリング範囲を開発者が調整することが可能です。有料版の機能ではありますが、[Server-Side Row Model](https://www.ag-grid.com/angular-data-grid/server-side-model/)と呼ばれる機能が提供されていて、フィルタリングやソートなどの処理をサーバーサイドで行い、ページング無しで遅延ロードを実装することができます。また、クライアントでのデータ変更をサーバーに通知して、ダイナミックにデータを変更することもできます。

一方で過剰にカスタマイズしすぎるとパフォーマンスが著しく低下するため注意が必要です。セルに独自のフィルタリング機能付きのドロップダウンリストを組み込んだのですが、1セルあたりのDOMが増加することやAngularのライフサイクルメソッドが意図しないタイミングで実行される（行が必要時のみレンダリングされるため）ことを考慮しておらず塵積でパフォーマンスが低下しました。（パフォーマンスが低下すると、スクロール時のレンダリングが追いつかずグリッド内が白く表示されます。）
パフォーマンス低下に関する注意事項は[ココ](https://www.ag-grid.com/angular-data-grid/scrolling-performance/)にまとまっていますので参考にしてください。

## Wijmo

WijmoはUIコンポーネント群を提供するライブラリで、グリッドの他にチャート作成やユーザー入力UIなど、Webアプリケーションを作る上で一般的に必要とされる機能を提供します。このライブラリの使用には、開発用と配布用のそれぞれ別々のライセンスが必要で、無償版も利用可能ですが、その場合は画面上にウォーターマークが表示されます。

このライブラリは昔からtoBシステム向けのライブラリを提供してきたGrapeCity社によって提供されています。そのため、WijmoのUIは非常に完成度が高く細かいところに手が届く印象を受けます。例えば、Excelのように複数のシート構成のグリッドを画面上に描画したり、Excelのデータをインポート・エクスポートしたりする機能は、ag-Gridで実現しようと思うと開発が伴いますが、Wijimoは標準機能として提供しています。
- [Excel入出力のデモ](https://demo.grapecity.com/wijmo/demos/Grid/FlexSheet/ExcelImportExport/angular)

また、有料のライブラリであるためサポートが手厚いです。メールで質問や不具合を問い合わせすれば数日で解決策を提供してもらえ、問い合わせた内容は[ナレッジベース](https://developer-tools.zendesk.com/hc/ja/sections/360000728116-%E4%B8%8D%E5%85%B7%E5%90%88-%E5%88%B6%E9%99%90%E4%BA%8B%E9%A0%85)というサイトに掲載されます。
ag-Gridと比較すると細かな不具合や制限が多い印象がありますが、👆で問題を解決するための詳細な解説や回避のためのサンプルコードが提供されているため、解決に時間を費やす必要がなく業務ロジックの実装に集中できます。

## PrimeNG

PrimeNGは、Wijimoと同様にUIコンポーネント群を提供するライブラリです。一部の機能にTableと呼ばれる機能があり、フィルタリング、ソートなどの基本機能が提供されています。有料版もありますが、ほとんどの機能を無料版でも利用することができます。

ただ表形式のビューワーとしては扱いやすいのですが、セル上でデータ入力を頻繁に行うユースケースには不向きな印象です。スタイリングの調整やカスタマイズ次第かも知れないですがが、標準ではセルに入力フォームを埋め込んだ感じで`選択モード > ダブルクリック > 編集モード`のような操作ができません。また、ag-GridやWijimoに比べてフックできるイベントが少ないため、独自の動作を追加するなどのカスタマイズがし辛い印象があります。

- [セル編集](https://primeng.org/table#cell-edit)

ただ今どきなデザインテーマが揃っていたり、有料版ではありますがFigma UI Kitをサポートしているため、Excelライクな機能要件よりもデザインを重要視する場合であれば採用しても良いのかなと思います。
Amazon SQSのDVA試験用メモ

# はじめに
DVAの認定試験勉強用にAmazon SQSについて、メモとして残したいと思います。

# SQSの概要
メッセージのキューサービス。
Lambdaなどのサービスからメッセージを送信し、キューに格納後、別のサービスでメッセージを取得して後続処理の実施が可能。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html

# SNSとSQSの違い
公式ドキュメントにサービスの違いについての記載がある。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-difference-from-amazon-mq-sns.html

### SNS
メッセージなどの通知を行うサービス。
Publisher(発行者)とSubscriber(購読者)の間に入り、Publisherが発行したメッセージや通知をSubscriberに配信する。

>Amazon SNS の使用、配信者から受信者 (または生産者から消費者) へのメッセージ配信を提供するマネージドメッセージングサービスです。発行者は、論理アクセスポイントおよび通信チャネルであるトピックにメッセージを送信することで、受信者と非同期的に通信します。クライアントは、Amazon SQS、HTTP、E メール、モバイルプッシュ通知、モバイルテキストメッセージ (SMS) Amazon Kinesis Data Firehoseなどのサポートされたエンドポイントを使用して Amazon SNS トピックにサブスクライブし発行されたメッセージを受信できます。

### SQS
メッセージのキューイングを行い、入ってきたメッセージを他のサービスに連携して、疎結合を実現する。
入ってくるデータの順序は順序が保証されるFIFOを選択することが可能。

>Amazon SQS の使用、分散されたソフトウェアシステムとコンポーネントを統合および分離できる、分散されたソフトウェアシステムとコンポーネントを統合および分離できる、ホストされたキューを提供するマネージドサービスです。

##  キューの種類
|種類| 配信順序 | 配信方式 | スループット |料金 | デフォルト | 
| ---- | ---- | ---- |---- |---- | ---- |
|スタンダードキュー| 保証しない |少なくても1回| ほぼ無制限 | - | ○ |
|FIFOキュー| 保証する | 1回 | 最大300件/秒 | スタンダードキューより高い | -|

###  大事な用語
- メッセージ重複排除ID
- メッセージグループ ID
- 受信リクエスト試行ID
- シーケンス番号

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-key-terms.html

## ポーリング方式
キューの状態を監視する方式のこと。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html

ショートポーリングはサーバーの一部をサンプリングし、すぐに応答を返す。
>ショートポーリングとすると、ReceiveMessageリクエストは、サーバーのサブセット (加重ランダム分散に基づく) のみを照会し、レスポンスに含めることができるメッセージを検索します。Amazon SQS は、クエリでメッセージが見つからなかった場合でも、すぐにレスポンスを送信します。

ロングポーリングはすべてのサーバーに問い合わせをし、待機時間の経過後に応答を返す。
>ロングポーリングとすると、ReceiveMessagerequest は、すべてのサーバーにメッセージを問い合わせます。Amazon SQS は、最小 1 つからリクエストで指定された最大メッセージ数まで、使用可能なメッセージを収集した後、レスポンスを送信します。Amazon SQS は、ポーリングの待機時間が経過した場合にのみ空の応答を送信します。


## 遅延キュー
メッセージの配信を遅延せるかどうか。
遅延キューを設定するとコンシューマーが取得可能になるまでの時間を設定できる。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

- メッセージタイマー
特定のメッセージのみを遅延させたい場合はこちらを使用する。遅延キューと同時に設定されている場合はメッセージタイマーが優先される。

## 可視性タイムアウト
設定することにより、他のコンシューマーが同じメッセージを処理することを防ぐことができる。
同一のメッセージを他のコンシューマーから見えないくしたい場合に設定する。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

## デッドレターキュー
処理が失敗したメッセージなどがキューに居続けることを防止する。
原因などを別のキューに移すことにより、エラーの原因の調査を行いやすくする。
自動で作成されたりはしないので、最初にキューを作成する必要がある。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html

## メッセージの削除
コンシューマーがメッセージを取得し、処理が完了してもキュー内のメッセージは削除されない。
キュー内のメッセージを削除する設定を行う必要がある。
【Push Notifications Console】APNsプッシュ通知のテスト方法

WWDC 2023のセッション「[Meet Push Notifications Console](https://developer.apple.com/videos/play/wwdc2023/10025/)」にて、プッシュ通知のテストができるコンソールが紹介されていたので早速触ってみました。

# 何がうれしい？
- ログの機能がついたので、通知が届かない場合の調査がしやすくなった。
- 今までAPNs経由でプッシュ通知を飛ばすには、curlコマンドを叩いたり、サードパーティー製のツールを使う必要があったが、今後それらが不要になる（はずだった。。 ※後述）

# Push Notifications Consoleの使い方
まずは、[Push Notifications Console](https://icloud.developer.apple.com/dashboard/notifications/)にアクセス。

通知を送りたいアプリのバンドルIDを選択します。
<img width = 300 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/1f8f88cc-7dc4-d56b-7b0e-c26ba77b14ba.png">

通知を新規作成するときのコンソールはこんな感じです。（左上のメモのアイコンから新規作成できます）
<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/17bdd68e-641b-7c14-cf43-74bb7ed48e13.png">

`JSON View`をONにすると、直接JSONで書くこともできます。
<img width = 500 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/9db9953c-cd0c-1c7d-86f3-3358ea169596.png">

右上の`Get cURL Command`からcurlコマンドを生成してくれる機能もあります。
<img width = 400 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/87674f26-9c0f-2ec7-cea3-4c770c5fc320.png">

`Name`と`Device Token`以外はデフォルト値が入っているので、この2つを入力して`Send`を押すと通知を送信することができます。
通知の受信に成功すると、`successfully delivered to the target device`というLogが表示されます。
<img width = 600 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/05f731ff-224b-ae89-01fb-76232c10abb2.png">

試しに端末の電源を切った状態で通知を送信したら、`discarded as device was offline`となりました。（今まで使っていたサードパーティ製のツールだとsuccessとしか出なかったので、ログによってより詳細な情報が分かりそうです）
<img width = 600 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/a0a3f268-99f5-ff7d-deb0-6d6ad1772330.png">

こんな感じで使い方はとても簡単でした。

# Push Notifications Consoleへの不満
このコンソールによってサードパーティー製のツールが不要になるかと思いきや、まだ微妙な点が。。
- ~~送信履歴から同じ通知を再送する機能がない（全く同じ内容の通知データをコピペで作らないといけない）~~（追記: 再送信機能が追加されました👏）
- 送信履歴の削除・順番の入れ替えができなく、通知の種類ごとのテンプレートをまとめることができない

~~とくに1つ目が致命的だと思っていて、同じ通知を複数回送りたいケースはよくあるので再送機能がないと使う気になれない。。~~

# まとめ
今のところは使い勝手が悪く、しばらくは今まで通りサードパーティー製のツールに頼ることになりそうです。 
ただ、ログが見れる機能は便利なので、”テスト通知がなぜか届かない！”みたいなときはコンソールを使ってログを見ると原因が分かるかもしれません。
php artisan session にご注意

`php artisan session`

と打ったら`Do you want to run "session:table" instead?  (yes/no) [no]:`と、コマンドを提案された。

現在保存してるセッションの一覧でも表示してくれるのかな...？と希望的観測で`yes`と打ったら、


` Migration created successfully.`

`create_sessions_table`Migration ファイルが作成されてしまった。

リモート先でやったからファイルを消さなければならなかった。悲しき備忘録として。
Equirectangular画像座標を球面座標に変換する方法

## Abstract
360度カメラでよく使われているEquirectangular画像上の座標を、球面上の3次元座標に変換することは、カメラと対象物の位置関係を知る上でかなり重要です。ここではその方法をまとめます。
イメージとしては、下画像のようなEquirectangular画像上の座標から
![equirectangular_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/d2f2c343-ea01-d984-9fda-92908ccfa325.png)
球面座標に変換します。
![sphere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/899cddc3-15df-9323-deae-ff3463672605.png)


## Algorithm
### 1. Equirectangular画像座標を正規化する
座標の原点が左上にある場合は次のような変換で、正規化を行うことができます。

```math
\begin{align}
    center_x &= equi_x-width/2 + 0.5 \\
    center_y &= (-1)\times equi_y+height/2+0.5 \\
    norm_x &= center_x/(width/2-0.5) \\
    norm_y &= center_y/(height/2-0.5)
\end{align}
```

変換後の座標系です。
![norm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/04591226-22ba-9fc5-dd41-2d2545a36ab7.png)

### 2. 経度と緯度を計算する
ここでは経度と緯度と言っていますが、ヨーとピッチのことです。正規化されたx, yの値は-1~1をとるので、経度の場合は$π$、緯度の場合は$π/2$ をx,yに掛けることで求めることができます。

![spherical.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/0b4d439c-9cc2-85ec-c85e-64755fbb1ab7.png)

```math
\begin{align}
    longitude &= norm_x\times\pi \\
    latitude &= norm_y\times\frac{\pi}{2}
\end{align}
```

## 3次元ベクトルを計算する
経度と緯度を用いて、半径1の球面座標を計算します。

```math
\begin{align}
    x &= cos(latitude)\times sin(longitude) \\
    y &= cos(latitude)\times cos(longitude) \\
    z &= sin(latitude)
\end{align}
```

## Code
全体のコードは[こちら](https://github.com/Hiroaki-K4/3d_computer_vision/blob/main/equirectangular_to_sphere/equirectangular_to_sphere.py)です。 equirectangular_to_sphere.py を実行すれば試すことができます。
Equirectaungular画像座標での各点([0, height/2–1], [width/2–1, 0], [width/2–1, height/2–1], [width/2–1, height-1], [width-1, height/2–1]) は、下画像のような球面座標(緑点)に変換されます。

![sphere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/78d2ed6f-3d4f-5965-a323-74cb5e9385f5.png)

## Referrence
- [Converting dual fisheye images into a spherical (equirectangular) projection](http://paulbourke.net/dome/dualfish2sphere/)

## Dataset
- [Insta360 X3 vs X2 Camera Review | DOWNLOAD REAL Footage](https://www.youtube.com/watch?v=gsQcw1NZDR4)
Dockerについてわかったこと

:::note info
Dockerについて初心者なりにわかったことを書いていこうと思う。
:::

通常、プログラミングでアプリケーションなどを作ったときはそのアプリケーションを他のサーバーや環境で動かそうと思ったら、そのアプリケーションで使われているプログラミング言語やデータベースのMySQLなどをインストールしないとアプリケーションは動かない。
<h1>しかし！Dockerを使うとそんなめんどくさいインストールとかとはおさらばできるのだ！</h1>

　・まず、Dockerとはコンテナ型仮想環境を作成・実行・管理するためのプラットフォームのこと。
　・コンテナ型仮想環境とはアプリケーションとその実行環境を１つにまとめあげて動作させる技術のこと
　　で、簡単にいうとコンテナはアプリケーションに必要な物（プログラミング言語やその他ツール）をまとめた箱のこと。

<h2>Dockerのイメージ図</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3484022/ac66ac18-8aea-555e-efb2-0eb945b7fd11.png)
引用：https://o2mamiblog.com/docker-beginner-1
図のようにコンテナを起動する手順的には以下のとおりである。

1\. まず、クライアント（Dockerクライアント）がコマンド（指示書）を打つ
2\.それが、Dockerデーモンに渡され、渡されたデーモンさんがその指示書を受け付けて、Docker機能に命令を出す。（例：DockerイメージやDockerコンテナの作成など）
3\.DockerHubなどのリポジトリから公式のイメージを取得（pull）。（簡単に言えば、ポケモンゲームのカセット）
4\.(ここからは例を持ち出して説明)持ってきたポケモンのカセット（イメージ 1）をローカルイメージという場所に保存。
5\.DockerFileにポケモンのカセットを「In!」してチョーエキサイティング(保存)する。
6\.そのポケモンのカセットを改造したいなら何か追加して（なければそのままで）「自作のイメージ」を作成する。（build）（例：railsなどのフレームワークだったり、ラジバンダリー）
7\.これまでで作ったイメージをもとにコンテナ(仮想環境)を作成する。（create）
8\.コンテナを起動する。（start）

<h2>Dockerのメリット</h2>

・1台のサーバー上に複数のアプリケーション実行環境（Dockerコンテナ）を作成・利用できる。※サーバーの有効活用や、サーバー機の節約が可能

・アプリケーション実行環境（Dockerコンテナ）の他サーバーなどへの移転、他ユーザーとの共有※Dockerコンテナの移転や共有は複雑で手間のかかる操作を必要とせず、簡単に実行可能

・Dockerコンテナでアプリケーションの開発環境を作成し、インターネット上で他エンジニアと簡単に共有できる

<h1>終わりに</h1>
　Docker を使えば、例えば、10台のサーバーで同じアプリケーションを起動させたいとき、通常はサーバー1台ごとに起動させたいアプリケーションのプログラミング言語やデータベースのツールのインストールなどの仮想環境構築をしなければならないが、Docker はそんなことをしなくてもDocker さえあればアプリケーションを起動することができるので自分も使えれば使っていこうと思う。
Amplifyのビルド設定も環境変数もコード管理できる

Amplify勉強中に発見して、意外と言及している人が少ないかも？と思ったことを書き留めておきます。

## `amplify.yml` ファイルは、コンソールでしか触れないわけではない

Amplifyでのビルド設定で使うamplify.ymlは、アプリのリポジトリの中でコード管理ができます。AWSコンソール上、矢印で示したところにも書いてあります。

> リポジトリのルートにamplify.ymlとしてデプロイして、この設定を上書きすることができます

![amplify_ビルド設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259081/db1d6683-06ad-760e-a506-22921a74e7d2.png)

### 注意点

AWSコンソール上にある `amplify.yml` は、デフォルト設定という立ち位置なので、リポジトリ内のコードと置き換わらないようです。
別の言い方をすると、デプロイをするときに、リポジトリの中に `amplify.yml` があればそれを使うだけで、サーバー上にあるアプリの設定ファイルがそれで上書きされるわけではないです。
リポジトリ内に `amplify.yml` を配置し、そのファイルの手順でデプロイがされた後、コンソールを見に行くと置き換わっていなかったのでそう判断しました。

## ビルド設定の環境設定は、 `amplify.yml` に書ける

コンソールからアプリに環境設定ができることはご存知の方が多いと思います。以下のような画面で設定できます。

![amplify_環境変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259081/10d1fbff-f47d-3945-e1c8-086b78bffce4.png)

この環境変数は先ほどの `amplify.yml` でも設定できます。

以下のAWS公式のドキュメントに記載があります。

[ビルド設定の構成 - AWS Amplifyホスティング](https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/build-settings.html)

> **env** - 環境変数をこのセクションに追加します。また、環境変数はコンソールを使用して追加することもできます。

コードにするとこんな感じです。

```yaml:amplify.yml
version: 1
env:
  variables:
    key: value  // ←ここ
backend:
  phases:
    preBuild:

    // 以下略
```

サーバー上で管理する方が望ましい、ということでなければ、 上で紹介した `amplify.yml` のコード管理と組み合わせて、環境変数もコード管理できますね。

#### 雑談　

公式ドキュメントを読むのはちょっと気合がいりますが、ちゃんと読むといろんなことが書いてありますね。
Dartのnull許容型について

# null許容型とは？
文字通り変数にnullが代入されることが許容される型。変数宣言時はサフィックスに?をつける
```dart
int? a;
```


変数を宣言するとき、特にサフィックスをつけないで変数を宣言する場合は非null型になる。したがってC言語のように宣言だけしておくことができない。
```dart
int a;// Compile Error : The non-nullable local variable 'a' must be assigned before it can be used.
int a = 1;
```

null許容型に対してサフィックスで!をつけることで「この値はnullではありません」とプログラマが教えてあげることができる。（非null型へのキャスト）絶対にnullにならない保証がある時のみ!をつけよう。
```dart
void main() {
  int? a;
  test(a!);// Runtime Error
}

void test(int arg) {}
```

## memo
積論理演算は第一条件がfalseだった場合第二条件以降は評価されない。
```dart
void main() {
  List<int> list = [];
  list.isNotEmpty && list[100] == 100 ? print('Error') : print('OK');
// output :OK
}
```
論理ボリュームが見えない問題

# 背景
サーバ再起動後、論理ボリュームをマウントしようとしたところエラーになり困ったので備忘録的に残しておきます。
また、デバイスパスも見えなくなっていました。

# 環境
RHEL8
# 原因・解決法
再起動によって非アクティブになっていた事が原因
下記の通りボリュームグループをアクティブ化すれば見えるようになる。
①lvdisplayで「LV Status available」であるか確認。
Not availableの場合は下記を実施する。

②vgchange -ay [論理ボリューム名]

例.vgchange -ay hoge01
ちなみにaはavailable、yはyesの意味である。
nオプションもあり、noの意味で非アクティブ化をしたいときに使用する。

③lvdisplayで「LV Status available」であるか確認。

再起動しても自動アクティブにしたい場合は下記の方法を実施する。
「/etc/lvm/lvm.conf」の「auto_activation_volume_list = []」に記載を入れるとそれ以外は再起動時、Not availableとなるが、
記載をしない、項目を消した場合の挙動はすべての論理ボリュームを有効化する。

以上。
「org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped」が発生する原因

# はじめに
タイトルにあるエラーが発生したときの調査結果を残しておく。載せてるコードは実際のものではなく、エラーを発生させるための最小限のコード。

# 環境
- Java8
- JavaEE7（参照実装Payara4.1）

# エラーを発生させるプログラム

以下はEntityManagerをInjectさせるために定義

```java:EntityManagerProducer.java
@ApplicationScoped
public class EntityManagerProducer {

    @PersistenceContext
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return entityManager;
    }
}
```

```java:User.java
@Entity
@Table(name = "user")
public class User {
    @Id
    private Integer id;

    public Integer getId(){
        return this.id;
    }
}
```

```java:UserController.java
@ApplicationScoped
@Path("users")
public class UserController {
    @Inject
    private EntityManager entityManager;
    
    @GET
    public Response list(){
        IntStream.of(2,1,3).parallel().forEach(l -> {
            entityManager.createQuery("SELECT u FROM User u WHERE u.id = :id", User.class)
                .setParameter("id", l)
                .getResultList()
                .stream()
                .findAny();
        });
        return Response.ok().build();
    }
}
```


# 対応方法

## その１）parallel()を使わない

```java:UserController.java
@ApplicationScoped
@Path("users")
public class UserController {
    @Inject
    private EntityManager entityManager;
    
    @GET
    public Response list(){
        IntStream.of(2,1,3).forEach(l -> {
            entityManager.createQuery("SELECT u FROM User u WHERE u.id = :id", User.class)
                .setParameter("id", l)
                .getResultList()
                .stream()
                .findAny();
        });
        return Response.ok().build();
    }
}
```

## その２）EntityManagerのDIにPersistenceContextアノテーションを利用する

```java:UserController.java
@ApplicationScoped
@Path("users")
public class UserController {
    @PersistenceContext
    private EntityManager entityManager;
    
    @GET
    public Response list(){
        IntStream.of(2,1,3).parallel().forEach(l -> {
            entityManager.createQuery("SELECT u FROM User u WHERE u.id = :id", User.class)
                .setParameter("id", l)
                .getResultList()
                .stream()
                .findAny();
        });
        return Response.ok().build();
    }
}
```

# おわりに

原因と対応方法はわかったけど、```@PersistenceContext```と```@Inject```のライフサイクルなど詳細な仕組みの違いなどはよく理解していない。ただ一つ言えることは、I/Oが発生する処理では```parallel```を利用しない方がいい。
[Unity初級]クラスの配列について

# 概要
クラス型の配列を使おうとしてつまづいた時の事を共有したいと思います。
# 本文
TestClassの配列を用意して初期値を設定するため0番目の要素に値を入れようとしたら
```cs
    class TestClass
    {
        public string name;
        public int age;
        public TestClass(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
    }

    private TestClass[] testClass = new TestClass[5];

    void Start()
    {
        testClass[0].name = "鈴木";
        testClass[0].age = 37;
    }
```

以下のようなエラーが表示されました。
`NullReferenceException: Object reference not set to an instance of an object`

この場合は以下のように書けばエラーは表示されなくなります。

```cs
    class TestClass
    {
        public string name;
        public int age;
        public TestClass(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
    }

    private TestClass[] testClass = new TestClass[5];

    void Start()
    {
        testClass[0] = new TestClass("鈴木", 37);
        testClass[1] = new TestClass("榊原", 14);
        testClass[2] = new TestClass("森田", 51);
        testClass[3] = new TestClass("山田", 19);
        testClass[4] = new TestClass("藤井", 23);
    }
```

最初のnewで配列を宣言して
```
private TestClass[] testClass = new TestClass[5];
```
次のnewでクラスのインスタンスを生成する。２段階の手順が必要だったんですね。（最初のコードでエラーが出たのはインスタンスが作られてないのにそれにアクセスしようとしているから）
```
testClass[0] = new TestClass("鈴木", 37);
```
データローダ関係 バッチ処理


+ [パスワードの暗号化について、パスワード＋セキュリティトークン](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000074q6wX)

:::note
パスワード、セキュリティトークンを一緒に暗号化するようです。

I had this same issue and was able to resolve it without using IP range.
The password and security token have to be encrypted together.
So, the encryption command looks like this:

```
encrypt -e [password][SecurityToken] c:\SALESFORCE\thekey.txt

For example:
encrypt -e mypasswordqk51o6MA7MuVDO2ac3qZ4Evk8 c:\SALESFORCE\thekey.txt
```
 
This creates an extremely long encrypted password string to put in the process-conf.xml file, but it worked.

https://developer.salesforce.com/forums/?id=9062I000000g4EaQAI
:::

+ [データローダーのバッチ起動結果がコマンドプロンプト上にもログにも出力されない件について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FY5e0)

:::note
データローダのログファイルの表示
https://developer.salesforce.com/docs/atlas.ja-jp.dataLoader.meta/dataLoader/loader_troubleshooting.htm
:::

+ [データローダ バッチ構築時のログインエラー](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000KhVdqSAF)

:::note alert
Failed to send request to https://test.salesforce.com/services/Soap/u/56.0/
:::

GUIでは問題なくコマンドラインの時だけ。

:::note
試しているネットワークにプロキシサーバーが設定されていませんか？

https://developer.salesforce.com/forums/?id=906F00000008jojIAA
:::

+ [データローダーの自動化（バッチ処理）について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KZQAG)

:::note
以下の設定で時間起動なのでタスクスケジューラを使えば時間起動での自動化可能です。

バッチモードでの実行 (Windows のみ)
https://developer.salesforce.com/docs/atlas.ja-jp.244.0.dataLoader.meta/dataLoader/loader_batchmode_intro.htm
:::

+ [データローダをバッチモードで実行する際処理が途中で終了してしまう](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LrLmp)

:::note
データローダーのログファイルがあるみたいです。

データローダーのログファイルの表示
https://help.salesforce.com/s/articleView?id=sf.loader_troubleshooting.htm&type=5
:::

+ [データローダをバッチモードで使用した場合のサクセスエラーcsvの出力先を指定する方法はありますでしょうか？](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epkQO)

:::note
process.statusOutputDirectory　に設定していますか？

OSがWindowsなら　 c:\dataloader\status　のように設定できると思います。

https://developer.salesforce.com/docs/atlas.ja-jp.dataLoader.meta/dataLoader/loader_params.htm
:::
Sales Agreements and Forecasting in Manufacturing Cloud

# Sales Agreements and Forecasting in Manufacturing Cloud>Create Accurate Account Forecast. 

+ [Mass Update Button is not available in Dev Org Trailhead Account](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QKp7I)

:::note
 I ended up adjusting the Manufacturing Account's Forecasting  adjustment period to 30 days from start of month. I had it at 7 as that was what the previous trailblazer had asked me to input. There was no where on this trailhead asking to adjust it to a day later than today's date (today being May 19th). As soon as I did that, I was able to adjust the Marketing growth and the Mass Update appeared on the screen. This was poorly explained in the trailblazer with a lot of time wasted to troubleshoot this on my own. I recommend you update the trailblazer instructions. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bd8c6787-a405-c258-f55b-593e24349140.png)

:::

# We can’t find the product Hammer H500 with the required quantity on the order. Check the criteria and try again.

+ [We can’t find the product Hammer H500 with the required quantity on the order. Check the criteria and try again.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000BslYc)

:::note
Please take this as a feedback that while the Challenge tries to fetch the Orders created against the Sales Agreement, it should not run its loop only on the first active order Fetched. One Sales Agreement can have multiple orders being activated over the period of time and can have same and/or different set of products added against them
:::


+ [We can’t find the product Hammer H500 with the required quantity on the order. Check the criteria and try again.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BslYcSAJ)
+ [Hi, I'm facing an issue where it says, "We can't find the product Hammer H500 with the required quantity on the order. Check the criteria and try again."](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000074WE1q)
Windowsへのmd-to-pdfインストール

Windows環境で `md-to-pdf` をインストールする際は、先に `puppeteer-core` をインストールしておくこと。

```
PS> npm install puppeteer-core
PS> npm install md-to-pdf
```

# 問題

Windows環境で何も考えずに `npm install md-to-pdf` すると、失敗する。
エラー内容は、Chromium最新版のインストールに失敗した旨のもの。

# 考察

`md-to-pdf` はMarkdowsをPDFに変換するツールだが、内部では……

1. MarkdownからHTMLを生成
2. ヘッドレスブラウザのChromiumでレンダリングし、PDF保存

……みたいな動きをしているらしい。ヘッドレスブラウザをハンドリングするのに使われるのがPuppeteer。
`npm install md-to-pdf` すると、依存ライブラリである `puppeteer` がインストールされようとし、この `puppeteer` がヘッドレスブラウザのChromiumをインストールしようとして、ここで失敗する。ちなみに `npm install puppeteer` としてもPuppeteer単体でインストールしようとしても同じように失敗する。

> 既定では、Puppeteerをインストールすると、インストーラーは、Microsoft Edgeも構築されているオープンソースブラウザーである最新バージョンのChromiumをダウンロードします。**Microsoft Edgeがインストールされている場合は、puppeteer-coreを使用**できます。puppeteer-coreは、Microsoft Edgeなどの既存のブラウザーインストールを起動するPuppeteerの軽量バージョンです。  
> （[Puppeteer の概要 - Microsoft Edge Development | Microsoft Learn](https://learn.microsoft.com/ja-jp/microsoft-edge/puppeteer/)）

こう書かれているので(1)npmがインストールしようとしているChromiumuとEdgeがインストールしているChromiumuがコンフリクトする、(2) `puppeteer-core` はインストール可能、(3)md2pdfにも `puppeteer` の代わりに依存ライブラリとして認識してもらえるかもしれないと仮説を立てて、やってみた。

# 結論

Edgeが入っているWindows環境では `md-to-pdf` インストール時には先に `puppeteer-core` をインストールしておけば良さそう。

```
PS> npm list
`-- (empty)
```
```
PS> npm install puppeteer-core
PS> npm install md-to-pdf
```
```
PS> npm list
+-- md-to-pdf@5.2.4
`-- puppeteer-core@20.7.3
```

実行も問題なかった。

```
PS> npx md2pdf ".\hogehoge.md"
  √ generating PDF from .\hogehoge.md
```

# 参考情報

* [Puppeteer の概要 - Microsoft Edge Development | Microsoft Learn](https://learn.microsoft.com/ja-jp/microsoft-edge/puppeteer/)
switch文からswitch式へ: Dart3の新機能"switch式"解説

# はじめに
Google I/O 2023が先日行われ、その中で注目すべき発表がありました。それは、Dart3の正式リリースです。Dartのメジャーアップデートは５年ぶりで、様々な新機能や改善が実施されました。その中でも今回注目したいのは、まさに"スイッチ"を入れる新機能、"switch式"です。

今までにswitch文で困ったことはありませんか？特に、enumを用いて変数に値を代入したいときには、このswitch式が非常に便利です。この記事では、その使い方を詳しく解説します。これからswitch式を使おうと考えている方、もしくはすでに使っていて少し混乱している方の役に立てれば幸いです。

# 使えるようになった！switch式のパワー
実際のプログラムでイメージを掴んでみましょう。以下のようなコード、書いてみたくなりますよね？
```sample.dart
final favoriteAnimal = switch(selectedAnimalType){
    case AnimalType.dog:
        'いぬ';
        break;
    case AnimalType.cat:
        'ねこ';
        break;
    case AnimalType.bird:
        'とり';
        break;
}
```
ですが、このような書き方は従来のswitch文ではできませんでした。しかしDart3のリリースにより、switch式が導入されたことでこのような書き方ができるようになりました！
switch式を用いると、上記のコードは以下のように一新されます。
```sample.dart
final favoriteAnimal = switch(selectedAnimalType){
    AnimalType.dog => 'いぬ',
    AnimalType.cat => 'ねこ',
    AnimalType.bird => 'とり',
}
```
単に変数への値の代入が容易になるだけでなく、コード自体も圧倒的にシンプルで読みやすくなりました。煩雑だったcaseやbreakといった記述を省くことができ、アロー関数を用いた直感的な表現が可能になったのです。

# 文から式へ：switch式の原理
ではなぜ従来はできなかった変数への代入ができるようになったのでしょうか？
それは、switchが文から式へと変わったからです。
文と式はプログラムをする上での基礎となる2つの概念です。
厳密には違うかもしれませんが、文とはif文やswitch文などの事を指し、``アクションを実行する``もので、式とは``値を評価``するものと理解していいと思います。

例えばif文ですが、これは条件分岐し、条件に応じたアクションを実行するものです。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/7d9ce43e-3a74-a560-e2a9-2bf4133a22f6.png)

これに対し、式では式自体が評価され、評価された値に変化するというような理解です。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/dbac8fd4-76be-38c0-df65-575ba04db445.png)


# switch式の頼もしい味方：網羅性チェック
switch式にはもう一つ素晴らしい特徴があります。それが「網羅性チェック」です。
switch式では、switchで分岐したいケースの処理を記述しているかをチェックし、カバーしていない場合はコンパイル時にエラーを出力してくれます。
そのため、enumに新たな値を追加した場合switch式にも処理を追加しない場合はエラーとなります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582866/80a1625b-d9ab-24e9-831c-6184430af294.png" width="600">

# 条件の組み合わせ：AND条件、OR条件、デフォルトケースの書き方
switch式での&条件はor条件は以下のようにそれぞれ&&と||を使用して記載でき、デフォルトケースは_(アンダーバー)で記載します。
```sample.dart
final favoriteAnimal = switch (selectedAnimalType) {
    AnimalType.dog && AnimalType.cat => 'いぬ & ねこ',
    AnimalType.bird || AnimalType.hippo => "とり or かば",
    _ => "デフォルトケース",
};
```

# まとめ：switch式が開く新たな可能性
switch式を使用することで、パターンに応じた変数の代入やflutterでのwidget表示が非常に簡単になり、コードの可読性も向上します。
今回紹介した以外にもクラスを用いたパターンマッチやdart3で導入されたrecordを用いたパターンマッチなどでも使用できるため様々な場面で利用ができそうです。
# 参考記事
https://www.christianfindlay.com/blog/dart-switch-expressions
GitHub コード確認依頼の方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/06175d91-b966-cf54-f790-18ac2b7cdb53.png)
１：コードの確認依頼をする機能
　機能実装のためにコードを追記したり、保守のために修正したりするときにブランチは作成されます。そのため、そのコードは誰かにチェックをしてもらう必要があります。そこで役立つのがプルリクエストです。

２：プルリクエストとは
　ブランチでのコミット履歴を残すと共に、各コミットにおける変更修正にコメントをつけることができるGitHubの機能のことを言います。以下の動画のような形で、1つのブランチでの作業について、コードを確認しつつコミュニケーションが取れる掲示板のようなものがプルリクエストです。

３：プルリクエストを作成
　プッシュができていれば、GitHub Desktop上に「Preview Pull Request」ボタンとプルダウンが表示されています。プルダウンを開き、「Create Pull Request」を選択して「Create Pull Request」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/45e05ed6-2bce-b026-2d3b-5e54e5669224.png)
すると以下の画像のようにブラウザが起動して、プルリクエスト作成画面が表示されます。以下のように情報を入力してプルリクエストを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/09970882-fc2b-09b3-47e8-61e82351013f.png)

４：プルリクエスト作成時のポイント

①プルリクエストの詳細には、What（何を）とWhy（なぜ）を書く
　What（どのような実装をしているのか）とWhy（なぜこの実装が必要なのか）を書くことで、このブランチは何を実装していて、なぜその実装を行ったのかが他の人に伝えることができます。

　Whatをしっかり書くことで、他者にコードを見てもらう際に、スムーズな理解を促すことができます。アプリケーションの機能が複雑になればなるほど、コードを読んだだけでは、何をしているのか把握することは難しくなるからです。

　また、Whyをしっかり書くことで、本来の目的に沿ったコミュニケーションが可能です。実装目的が伝わっていないと、欲しい意見をもらうことはできません。

②マークダウン表記で書くこと
　マークダウンとは記法の一種です。マークダウンを使ってシンプルな記法でHTML文書を書くことができます。
Google Drive等からダウンロードした連番zipを、構造を保持して解凍する方法(Mac)

# 目的
Google Drive等から巨大ファイルをダウンロードすると、圧縮後のサイズが2GBに収まるように分割された連番zipが得られる。
GUI操作で解凍すると別々にフォルダが展開されてしまいマージが大変なので、構造を保持したまま解凍したい。

# 方法([stack overflow](https://stackoverflow.com/questions/68201952/merge-combine-multiple-downloaded-zip-files-from-google-drive-on-mac))
ターミナルで以下を入力
```zsh
# 連番zipファイルのあるディレクトリ(DirectoryA)に移動
cd DirectoryA
# 解凍先フォルダ(combined)作成
mkdir combined
# すべてのzipファイルをcombinedに解凍
for archive in *.zip
do
unzip "$archive" -d combined
done
```
Backtesting.py を使って FX の勝てる手法を探してみた (1)

MT4のストラテジーテスターを使ってEA(Expert Advisor：自動取引プログラム）のバックテストをしていましたが、MQL4言語の生産性の低さに「なんとかならんかなー」と思っていた矢先、Pythonでバックテストができる[Backtesting.py](https://kernc.github.io/backtesting.py/ "Backtesting.py") なる存在を知りました。

FXの自動取引プログラムとして「環境認識」「エントリーポイント」「利確ポイント」「損切りポイント」をPythonで実装しバックテストして、勝てる手法はどのような組合せなのかを客観的に評価してみたいと思います。

# 対象とする手法

すべての組合せをバックテストすると天文学的な数字の組合せになるので、まずは環境認識なし、利確と損切りは固定値として、どのエントリーポイントが優秀なのかを調査してみます。

バックテストするエントリーポイント一覧は、以下の記事にまとめてありますので、そちらを参照してください。

[Backtesting.pyを使ってFXの手法を実装してみた]

# バックテスト条件

以下、今回実施するバックテストの条件です。

1. 環境認識は「なし（Non）」とする。
1. すべてのエントリーポイントについてバックテストする。
1. 取引時間はロンドン市場の9時から17時のみとする。
1. 利確ポイントは50pips固定とする、
1. 損切りポイントは50pips固定とする。
1. 通貨ペアは USDJPY だけとする。
1. 時間軸は 4h, 1h, 30min, 15min とする。

# バックテスト結果

各時間軸ごとに「Profit Factor が高い手法ベスト5」と「SQNが高いベスト5」を抽出しました。

結果をご紹介する前に、バックテストの評価基準項目を解説します。

* Trades … トレード回数
* Win Rate … 勝率
* Avg Trade … 一回の取引における平均損失
* Profit Factor … 総利益の総損失の比率
* SQN …　「期待値/標準偏差×√100」で計算されるシステムの品質の評価値で、System Quality Numberの略。数値に対する評価は「1.6～平均以下」「2.0～平均」「2.5～良い」「3.0～優秀」「5.1～最高」「7.0～聖杯」と言われている。

また、以下が結果の表における手法の列の解説です。手法の意味は「[Backtesting.pyを使ってFXの手法を実装してみた]」を参照願います。

* setup … 環境認識の手法。今回は環境認識は「なし」とするなので、一律「Non000」となっています。
* trigger … エントリーポイントの手法。英数字で手法を表しています。
* profit …　利確ポイントを決定する手法。今回は5opips固定とするので、一律「Fix003」となっています。
* loss … 損切りポイントを決定する手法。今回は5opips固定とするので、一律「Fix003」となっています。

以下が「Profit Factor が高い手法ベスト5」です。赤枠については自身の評価が高い手法です。詳細は追って説明します。
![バックテスト結果 Profit Factor ベスト5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100918/5ce033f8-591f-c086-205e-622c016cfa0a.png)

以下が「SQN が高い手法ベスト5」です。
![バックテスト結果 SQN ベスト5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100918/72ba78cc-9ec9-7b3b-4ed4-27c16b7749c2.png)

# 評価

Profit Factor が高い手法の中で、今後環境認識をプラスして評価することを考えると、少しでもトレード回数が多い方がいいと考えています。

上記を踏まえ「Profit Factor が高い手法ベスト5」および「SQN  が高い手法ベスト5」の中から自身がオススメする手法を各時間軸ごと二つずつ選出しました。

| 時間軸 | trigger | Trades | Win Rate | Profit Factor | SQN |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 4H | Mav005 | 159 | 56.0 | 1.59 | 2.63 |
| 4H | Mav004 | 176 | 52.3 | 1.14 | 0.43 |
| 1H | Bko000 | 3439 | 51.3 | 1.08 | 2.02 |
| 1H | Bbd000 | 2303 | 50.9 | 1.05 | 0.94 |
| 30min | Bko000 | 5702 | 51.1 | 1.09 | 2.96 |
| 30min | Bbd000 | 3929 | 50.6 | 1.03 | 0.82 |
| 15min | Bbd000 | 6762 | 50.2 | 1.10 | 3.38 |
| 15min | Bko000 | 8736 | 49.5 | 1.07 | 2.72 |

上記で登場したエントリーポイント（trigger）の手法は以下の通りです。詳細は「[Backtesting.pyを使ってFXの手法を実装してみた]」を参照願います。

* Mav004 … 【移動平均線】超短期移動平均線が短期移動平均線上抜けで買い
* Mav005 … 【移動平均線】短期移動平均線が超短期移動平均線上抜けで売り
* Bko000 … 【ブレイクアウト】直近高値のブレイクアウト
* Bbd000 … 【ボリンジャーバンド】終値が+2σを上抜けで買い

まずは、エントリーポイントのみを使った手法の評価ができました。今後は、今回評価が高かったエントリーポイントに環境認識のフィルタをプラスして、さらに精度の高い手法の組合せを模索していきたいと思います。

[Backtesting.pyを使ってFXの手法を実装してみた]: https://qiita.com/naninuneter55/private/665c46d8ccb700ce08cb
字句解析器生成器(Lexical analyzer generator)のルール定義における、包含的/排他的スタート

# lex と flex と rex

ゆるく違いを述べる。

- lexは、ユーザーが定義したルールを元に、Cで書かれた字句解析器を生成してくれる。
- flexも、ユーザーが定義したルールを元に、Cで書かれた字句解析器を生成してくれる。Lexの改良版。
- rexは、ユーザーが定義したルールを元に、Rubyで書かれた字句解析器を生成してくれる。[rexical](https://github.com/tenderlove/rexical)というgemで配布されている。

# ルール定義 - スタート状態

"ユーザーが定義したルール" の書き方は以下を参照。
- flexは、http://quruli.ivory.ne.jp/document/flex_2.5.4/flex-ja_2.html
- rexは、https://github.com/tenderlove/rexical/blob/master/DOCUMENTATION.ja.rdoc

さて、flexとrexでは、このルールの中で、`スタート状態`を定義することができる。

## rexの例で説明

rexの例([ref](https://github.com/tenderlove/rexical/blob/master/DOCUMENTATION.ja.rdoc))で説明する。

```sh
class MyLexicalAnalyzer

# マクロ定義。要はルール内で使い回される定数の定義。
macro
DIGIT         \d+
IDENT         [a-zA-Z_][a-zA-Z0-9_]*
BLANK         [\ \t]+
REMIN         \/\*     # /* つまり、 複数行コメントの始まりを表す
REMOUT        \*\/     # */ つまり、 複数行コメントの終わりを表す


# ルール定義。
# [state]  pattern  [actions] の順に並んでいる。
rule
      {REMIN}                 { state = :REM ; [:REM_IN, text] }
:REM  {REMOUT}                { state = nil ; [:REM_OUT, text] }
:REM  (.+)(?={REMOUT})        { [:COMMENT, text] }
      {BLANK}
      -?{DIGIT}               { [:NUMBER, text.to_i] }
      {WORD}                  { [:word, text] }
      .                       { [text, text] }
```

この中で、以下がスタート定義を表している。

> state = :REM
> :REM

先述の例だと、`:REM  {REMOUT} {state = nil; [:REM_OUT, text]}`のルールが適応されるのは、`stateが:REMである時に{REMOUT}patternが現れた`場合のみ。

さて、ここから、包含的/排他的スタート (inclusive/exclusive)の違いを説明する。rexでは、

> 続く英字が小文字のとき、包含的スタート状態となる。
> 大文字のとき、排他的スタート状態となる。

つまり、
- actionsの中で`state = :rem`と記述されると、包含的スタート状態のステートである`:rem`に遷移する。
- actionsの中で`state = :REM`と記述されると、排他的スタート状態のステートである`:REM`に遷移する。

これらの違いを例を出して説明する。
(stateの指定がない)`{WORD} {[:word, text]}`というルールは、

- 現在のステートが(包含的スタート状態のステートである)`:rem`の場合に、`{WORD}`patternが現れたら、この行は適応される。
- 現在のステートが、(排他的スタート状態のステートである)`:REM`の場合には、`{WORD}`patternが現れても、この行は適応されない。

要は、`state≠:REM`,`state≠:rem`の時に違いが発生するということである。

## flexのドキュメントの引用

http://quruli.ivory.ne.jp/document/flex_2.5.4/flex-ja_2.html#Start-States-Explained

より、

> これまでのところでは、 Flexが異なる２種類のスタート状態をサポートしている事実から目をそらしてきました。 ２つのスタート状態とは、 包含的スタート状態（%s）と排他的スタート状態（%x）のことです。 これら２つの相違点は、 排他的スタート状態が活性化された場合は、 その状態に属するルールだけが活性化されるのに対して、 包含的スタート状態の場合は、 その状態に属するルールとスタート状態への参照を持たないルールの両方が活性化されるという点にあります。 この違いを示す例を挙げると、 以下のようになります。
>	
> %s state1
%%
<state1>"one" printf("two");
"three"       printf("four");
>
> この場合、 state1状態が活性化されている場合は‘one’を‘two’に置き換え、 state1状態が活性化されているか否かにかかわらず‘three’を‘four’に置き換えます。 デフォルトのルールにより、 その他のテキストはstdoutに出力されます。 これに対して、
>	
>%x state1
%%
<state1>"one" printf("two");
"three"       printf("four");
>
> は、 state1状態が活性化されている時は‘one’を‘two’に置き換え、 state1状態が活性化されていない時のみ‘three’を‘four’に置き換えます。 デフォルトのルールにより、 その他のテキストはstdoutに出力されます。
>
> このことは、 排他的スタート状態が使われる場合には、 マッチしないテキストがstdoutに出力されてはならないのであれば、 すべての可能な入力にマッチするルールを、 個々の排他的スタート状態が持たなければならないことを意味しています。 包含的スタート状態の場合は、 あらゆる状態において有効な、 スタート状態への参照を持たないルールを１つ持つ必要があります。
> 
> 注： 排他的スタート状態はPOSIXの一部であるにもかかわらず、 Lexではサポートしていません。