OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録] カスタムセルをコードで作成 (UITableViewCell)

Storyboardを使わないカスタムセルの作成方法を、毎回調べてしまうので備忘録として残しておきます。

# 作成
- UITableViewCellを継承したクラスを作成します。
- `init`と入力して3番目くらいに出てくる`init(style:, reuseIdentifier:)`を選択して、親クラスのを呼び出します。
- 出てくる警告の[Fix]を押して`required init?(coder: NSCoder)`を補完します。
```swift
class CustomCell: UITableViewCell {
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setUpViews()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setUpViews() {
        // サブビューの配置を行う。
    }
}
```
`override init(style:, reuseIdentifier:)`内にサブビューのセットアップ処理を書きます。
`required init?(coder:)`は、Storyboardを使わない限り滅多に呼び出されることはありません。

# サブビューの配置
`self`ではなく、`contentView`にaddSubViewします。
```swift
    private func setUpViews() {
        サブビュー.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(サブビュー)
        NSLayoutConstraint.activate([
            サブビュー.xxAnchor.constraint(equalTo: contentView.xxAnchor),
            ...
        ])
    }
```

# 参考
https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview

https://mayugezio.com/create/365bank20/
HTTPクライアントツールどれ使う？

# はじめに

Web/モバイルエンジニアのみなさん

APIをデバッグなどでリクエストするときにはどんなツールを使っていますか？

本記事では筆者がこれまで使ってきたツールの比較を通してどのツールが良いかサクッと比較できるように書きます

## ツール一蘭

筆者が使用経験のあるのは以下。

- curl
- Advanced REST client
- Postman
- REST Client

### curl

公式ページ: https://curl.se/

言わずと知れたコマンドで、URLに対してリクエストを実行できるオープンソースソフトウェア。

インストールしたらコマンドラインでリクエストが実行できる。

```sh

$ curl http://localhost

```

上記コマンドでGETリクエストが発行できる。

POSTを実行したい場合は-X or --requestオプションを追加する。

bodyのデータは-d or --data、ヘッダーは-H or --headerを追加する。


```sh

$ curl http://localhost \
    -H 'content-type: application/json' \
    -X PUT \
    -d '{"foo": "bar"}'

```

CLIですぐに試せるのは非常にありがたい一方でbodyやheaderが長くなるとコマンドが長くなり書きたくなくなってきますね。

### Advanced REST client

Google Chromeの拡張機能で、Chromeのストアから入手可能。
（2022年12月にサポートが終了したようです）

UIはかなりわかりやすいと思っていますがURLとメソッドを指定してリクエストします。

ボディとヘッダーも専用のタブがあるので選択して指定することができました。

### Postman

公式サイト: https://www.postman.com/

Advanced REST clientと同様にUIがわかりやすく、ヘッダーやボディをそれぞれ指定可能。

フォルダ階層で保存することも可能で、エンドポイント毎に保存することで複数のプロジェクトのリクエストを分けたりすることができます。

さらにcurlに出力することも可能で、`</>`マークをクリックするとcURLに現在のリクエストの内容をコマンドとして表示してくれます。

### REST Client

vscodeのサイト: https://marketplace.visualstudio.com/items?itemName=humao.rest-client

Postmanとは異なりコードエディタで準備することが必要

Usageにも書かれているが、URLを記載して`cmd + option + R`でGETリクエストが実行できる。

```http
https://example.com/comments/1
```

POSTでヘッダーとボディを追加する場合は以下のように先頭にメソッド名を書く。

```http
POST https://example.com/comments
Content-Type: application/json

{
    "foo": "bar"
}
```

UIは無いがファイルとして保存することでGitで共有が可能になり、プルリクエスト時に「ファイルに記載のリクエストを実行をする」という使い方ができる。


## どれが良いか

Advanced REST client以外で比較すると以下のようになる

- curl
  - CLIで実行可能
  - オプションで指定する必要があるためパラメータが多い場合はコマンドが長くなる
- Postman
  - UIがありわかりやすい
  - カーソル操作をする必要があるので、ウィンドウの切り替えが必要になる
- VSCode REST Client
  - VSCodeだけで完結して、ファイル保存してGitで共有可能
  - UIが無いため専用のコードに慣れる必要がある

個人的にはPostmanを使っていましたが、VSCodeで作業をまとめたいこととGitでリクエストを管理できるためVSCode REST Clientを積極的に使っています。
Workato：OpenAIに文字数の多いデータを扱わせる方法（翻訳を例に）[前編]

## はじめに

Workatoでも遂に、OpenAI(Chat GPT)のコネクタが登場し、レシピでOpenAIが使える様になりました!

そこで私も、コネクションを張り、主に翻訳でOpenAIを使用しようとしたのですが

長い文章やファイルを翻訳しようとする際に、
1. そもそもOpenAIへの入力時にエラーが出る（以下）
![スクリーンショット 2023-11-25 18.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/f152c972-fa1c-6ee3-8e86-04e79745ce55.png)

2. OpenAIに読み込ませることはできるが、翻訳結果の出力が途中で止まってしまう



などの事態に陥りました。

色々調べたところ、これらは共に**OpenAIをAPI呼び出しする際のToken数に関する制限**に関係していることがわかりました。この記事では、その制限に関する説明や、力技ではありますがWorkato上で制限を回避する方法を説明いたします。

*※なお使用したOpenAIのverはGPT-3.5 turboとなります。*

##  OpenAIのToken数制限

トークンは、テキストを扱う際の基本単位で、通常は単語や文字の一部に対応します。

例えば、英語と日本語で同程度の文章量で、トークン数を見てみると、文字数だけでなく、トークンの作り方・トークン数に差があることがわかります。


(トークン数は[こちら](https://platform.openai.com/tokenizer)からテスト・確認することができます。)

<a id="jp-token"></a>
![スクリーンショット 2023-11-25 18.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/e05ba1ab-ed7c-a5a1-d3ff-5d395c6c6aa2.png)
#####
#####
<a id="en-token"></a>
![スクリーンショット 2023-11-25 18.38.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/88d6a66b-273d-21a4-139c-0092a67de677.png)
#####

ここで調べたところ、gpt-3.5-turbo のAPIで最大トークン数は、APIに渡すデータの入力トークン数と、GPTからの出力トークン数を合わせて**4096トークン**までとなっていました。

##

実際にWorkatoのレシピで、OpenAIのAPIに渡すデータの入力トークン数を4000弱とし、翻訳を依頼してみると、

翻訳が途中で終了し、`入力(Prompt tokens)`と`出力(Completion tokens)` の合計が4096前後に制限されていることがわかります。


![スクリーンショット 2023-11-25 18.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/ebe3956e-e618-4fdf-9676-8565957b7799.png)


## 制限を回避する方法（方針）

今回は翻訳（英→日）を例に、入力トークン数が多い時、API制限に引っかからず、全文が翻訳される様なレシピを作成しました。ロジックを組みました。

基本的な方針としては、

- 英語： 50トークンが大体250文字
- 日本語: 50トークンは大体50文字
- 英語の文字数(Characters)は日本語の大体2倍

なことから、翻訳したいデータ(英語)を5000文字ずつ取り出しながら翻訳し、ループを回しながら、翻訳結果を結合していく方針を取りました。

![IMG_8113.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/7aa9d479-0a94-2e4a-e01d-4d4b699d8a58.jpeg)


この時、 切り出した5000文字（英語）は約1000 トークンに相当し、

翻訳後の日本語は、英語の半分の約2500文字(約2500 トークン相当）となるため、

(英語、日本語のトークン数換算の例はページ上部)


各回のAPI呼び出しにおいて、トークン数は約3500トークンとなり、制限である4096トークンを下回ることができます。


##
だいぶ長くなってしまったので、レシピの実装は次回に持ち越したいと思います。
後編をご覧ください！

後編はこちら！
https://qiita.com/tsuyu_masa/items/5dfa405d665a915e06ea
論理ファイルを CPYF したときに作成されるファイルの特徴

## はじめに

あるファイルから、そこに登録されたデータと一緒に、コピーをして新たなファイルを作成したいという場面は多々あるかと思います。

この記事では、そのファイルが論理ファイルだった場合に`CPYF`コマンドを使用すると、どのようなファイルが作成されるかについてご紹介します。


## 論理ファイルを「CPYF」したときの特徴

大きな特徴の一つとして、そもそも`CPYF`では論理ファイルを作成することができません。

コピー元に論理ファイルを指定した場合、作成されるファイルの属性は「PF-DTA（物理ファイル）」となります。

そして以下のようなデータをもつ論理ファイル（キー：コード、削除区分='D'除外）を`CPYF`した場合…

| 削除<br>区分 | コード |
| - | - |
|   | 100 |
|   | 300 |
| D | 999 |
|   | 200 |

↓
↓
↓

| 削除<br>区分 | コード |
| - | - |
|   | 100 |
|   | 200 |
|   | 300 |

このように論理ファイルで指定した条件に従い、データが並び替え／抽出されコピーされます。


ご参考になれば幸いです。最後までお読み頂きありがとうございます。
レーザーポインターのブックマークレット

### ソースコード

以下をブックマークに登録

```js
javascript: {
  window.addEventListener('pointermove', ev => {
    const el = document.createElement('div');
    Object.assign(el.style, {
      width : '10px',
      height : '10px',
      backgroundColor : 'red',
      borderRadius : '50%',
      position : 'fixed',
      left : `${ev.x}px`,
      top : `${ev.y}px`,
      opacity : '1',
      transition : 'opacity .3s',
    });
    document.body.appendChild(el);

    setTimeout(() => {
      el.style.opacity = '0'; 
      setTimeout(() => el.remove(), 300);
    }, 500);
  });
}
```

### デモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/3c257428-43f5-aa5f-ebea-830641d06b71.png)

### 制約

Chromeでテストしたところ、ブラウザがHTMLを開いている時には機能するのですが、PDFを開いているときにはこのブックマークレットは機能しませんでした。

元々PDFをChromeでプレゼンテーションしているときにレーザーポインターを使いたかったので残念。

### 謝辞

@ishi720 さん、スクロールしたときの挙動のご指摘ありがとうございます。
@onjhthrw368 さん、pointermoveイベントでのご提案ありがとうございます。コードまるごと全面採用させていただきました。
重複の削除 Python3編

https://paiza.jp/works/mondai/data_structure/data_structure__set_step2
>N 個の要素からなる数列 A が与えられます。数列 A は昇順にソートされています。A の重複した要素を取り除いて昇順に出力してください。


辞書の作り方を前回学んだので
さっそくここでも。

```py
N = int(input())
A = {int(x) for x in input().split()}
print(*sorted(A))

```

この場合他の作り方もあったので復習で一応やっとく

```py
print(" ".join(map(str, A)))
```
[DAX Studio] 参考ビデオ

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## 参考ビデオ

[SQLBIのユーチューブチャンネルは](https://www.youtube.com/user/sqlbitv)、DAXとTabularエンジンのトピックについて学ぶのに最適な場所です。また、DAX Toolsコースの一環として、[DAX Studioに](https://www.youtube.com/watch?v=gZ4JcqFwJfg&list=PLU6II7MW-aiJ3Z-wbUQ0tkqSbAkyiB3uy)特化した短いビデオのプレイリストもあります。

以下の4本のビデオは、[PowerBi.tipsが](https://powerbi.tips/)2020年に制作したシリーズです。これらのビデオやその他の素晴らしいPower BIコンテンツは、彼らの[youtubeチャンネルで](https://www.youtube.com/channel/UCPwPrIpZwlfIKcoUpRwl9OQ)チェックできます。

## 1 / 4 PowerBI.Tips - チュートリアル - DAX Studio入門 - Darren Gosbell

DAX Studioのダウンロードとインストールから基本的なクエリの実行までをご紹介します。

<iframe width="854" height="480" src="https://www.youtube.com/embed/jpZnCHRauPU" frameborder="0"></iframe>

## 2 / 4 PowerBI.Tips - チュートリアル - DAX Studioにおけるモデルパフォーマンスチューニング - Marco Russo

DAX Studioを使用した表形式モデルの最適化の概要。

<iframe width="854" height="480" src="https://www.youtube.com/embed/ERGpV4yt30w" frameborder="0"></iframe>

## 3 of 4 PowerBI.Tips - Tutorial - DAX Studio 全機能レビュー - Darren Gosbell

DAX Studioの全重要機能のレビュー（2.10.2リリース時点）

<iframe width="854" height="480" src="https://www.youtube.com/embed/SoqF-c4KtHQ" frameborder="0"></iframe>

## 4 / 4 PowerBI.Tips - チュートリアル - DAX Studioクエリのパフォーマンスチューニング - Marco Russo

DAX Studioを使用したDAXクエリとメジャーのチューニング方法のチュートリアル

<iframe width="854" height="480" src="https://www.youtube.com/embed/d6ppyWQU-f0" frameborder="0"></iframe>

このビデオでは、DAX Studio のデバッグ体験を向上させる新機能（列統計のツールチップ、すべてのクエリのキャプチャ・トレース、依存メジャーの定義）を紹介します。

<iframe width="854" height="480" src="https://www.youtube.com/embed/tR9WPT4L87M" frameborder="0"></iframe>

## DAX Studio 2.1 - クエリプランを分析し、[ボトルネックを](https://daxstudio.org/docs/features/output-modes/#dax-studio-21---analyze-query-plans-and-find-bottlenecks "Direct link to DAX Studio 2.1 - analyze query plans and find bottlenecks")見つける

DAX Studioは、クエリプランを分析し、DAXコードのボトルネックを見つけるための重要な機能を導入しました。

<iframe width="854" height="480" src="https://www.youtube.com/embed/MD97SSM12oc" frameborder="0"></iframe>
集合の探索 Python3編

https://paiza.jp/works/mondai/data_structure/data_structure__set_step1

集合をつくってそこから検索せよという問題。

集合を作るのは初めてだけど辞書と同じはず？

とりあえず作ってみた

作った集合をprintしてみたら文字列型だったので事前に検索するのを
文字列型にしたらOKだった

```py
N, B = map(int, input().split())
B = str(B)
A = set(input().split())

if B in A:
    print('Yes')
else:
    print('No')
```
｛｝があるので辞書みたいだが、違うのは、キーがないこと。
他にも　Aをつくるときにintにしていれる方法もあった


```py
A = {int(x) for x in input().split()}
```
DockerFileからImageを作る

# DockerFile入門で勉強したこと

## DockerFile の基本

### 基本のインストラクション

- FROM
  ベースイメージの指定
- RUN
  任意のコマンドの実行、パッケージのインストールや最新化、作業ディレクトリを作成してることもよくある
- ENV
  環境変数の設定、文字コードやタイムゾーンを設定する
- COPY
  ローカルのファイルを DockerImage にコピーする、設定ファイルをコピーするに使う
- WORKDIR
  RUN で作成した作業ディレクトリを設定する

### マルチステージビルド

- 最終的に必要なイメージだけを作成し、イメージをできる限り小さく保つ
- 複数環境向けの管理
  - build 時に target ステージを指定することで環境ごとの Image を作成できる

### DockerHub
Dockerイメージの共通サービス。公開されている公式イメージのDockerFileを確認すると勉強したことを復習できる

### まとめ
DockerFileの作成から環境構築の勉強しようと考えていたが、逆だってことに気づいた。作りたい環境構築を想像しないとDockerを使って構築もできない。
DockerFileを使用してイメージを作ることは術的に難しくないけど、作成する環境の方の解像度を高めないといけない

# 参考
- [マルチステージ ビルドを使う](https://docs.docker.jp/build/building/multi-stage.html)
- [【入門】Docker Hubとは？概要と仕組み、基本的な使い方を解説](https://www.kagoya.jp/howto/cloud/container/dockerhub/)
- [Dockerfile を書くベストプラクティス](https://docs.docker.jp/develop/develop-images/dockerfile_best-practices.html)
vim/neovimで動くchatgptクライアントを作りなおした

# 申し訳ありません
と、どうせ居ないであろうユーザーの人に謝っておきます。
このvim pluginを大幅に書き直して、破壊的に更新しました。

https://qiita.com/uesseu/items/f223dcfd8655b778163a

# 何がいけなかったのか
前書いたのは、とりあえずchatgptとお話するぶんには便利でした。しかし、徐々に僕の中でこういう声が聞こえてきました。
- 👶「テンプレートくらい使わせろ」
- 👶「お前は毎回『お世話になっております』ってchatgptに言うのか？」
- 👶「ていうか、バグ多すぎ死ね！」
- 👶「関数多すぎ、名前空間汚しすぎ死ね！」
- 👶「お前はopenai以外は使わないのか？ラマやアルパカは？🐴」
- 👶「ninco.vimの作者は暗いから話しかけるのやめとこう」

# 大幅に改善したが…
上記に対策を立てました。

テンプレート、openai以外を使う機能を追加しました。
バグも前よりは少ないです。また、グローバルな関数を減らしました。
これにより、以前に比べてずっと良くなりました。

ですが、その過程で、UIが破壊的に更新されてしまいました(´・ω・｀)

https://github.com/uesseu/ninco.vim

# 使い方
雰囲気的にはこんな感じ。API_KEYはopenaiを使うときだけに必要。自宅GPUサーバー持っている人はurlでそれを指定すればよろしい。
あとは…下記のようにvimrcを書くと\dの後にgnってやればプロンプト出てきて、無事に使えるはず。visual modeでも。
手元では使えている。llamaで立てたopenai互換ローカルサーバーも含めて。

```vim
let g:ninco#single_mode = 1
let g:api_key = "[API_KEY]"
let g:ninco#gpt_model = "gpt-3.5-turbo"
let g:ninco#gpt_url = "https://api.openai.com/v1/chat/completions"

nnoremap <leader>d :call NincoEnableWindow(g:api_key, g:ninco#gpt_model, g:ninco#gpt_url)<CR>
nnoremap <leader>c :call NincoEnable(g:api_key, g:ninco#gpt_model, g:ninco#gpt_url)<CR>

" Compress log
nnoremap gc :call NincoCompress(5)

" Normal mode
nnoremap gn :call Ninco("", "")<C-F>04f"<C-C>

" Visual mode
vnoremap gn :<C-E><C-U>call Ninco("", "", GetVisualSelection())<C-F>04f"<C-C>
```

# 反省だけなら猿でも出来る🐵
まず、vim pluginを作るときにはUIを定めような！
とはいえ、僕しか使ってないと思うから良いんだけど！

# 感想
自分でダメ出ししておいて言いますが、僕は使います。
あと、vimのdoc書くの面倒臭すぎて死ぬ。
商品の検索 (paizaランク C 相当)

https://paiza.jp/works/mondai/data_structure/data_structure__dict_boss

>N 個の文字列 S_1, ... , S_N と、Q 個の文字列 T_1, ... , T_Q が与えられます。各 T_i について、以下の処理を行ってください。
・ S_j == T_i を満たす最小の j を出力する。ただし、そのような j が存在しない場合は -1 を出力する。

という問題。

下以外はとくに難しいところはなく、すぐ解けた。
ポイントは
該当する要素のインデックスを調べるというところ。
見つかったかどうかのフラグ変数を実装したところ。
そしてループで該当するものが見つかったら
その場でbreakしないといけないところ。


```py
N,Q = map(int,input().split())
S = [input() for _ in range(N)]

for _ in range(Q):
    target = input()
    flag = 0
    for i in S:
        if i == target:
            order = S.index(i)
            print(order+1)
            flag = 1;
            break;
    if flag == 0:
        print(-1)

```


答えを見ると辞書検索やっていた。
前回もそれだったけど、ここじゃ思いつかなかったんだ。。。

>T が S に含まれているかどうかを毎回愚直に線形探索することで解くこともできますが、辞書を用いると単純かつ高速に探索することができるようになります。
S_1, S_2, ..., S_N の順で、以下のルールに従って辞書に S_i を登録します。
S_i がすでに登録されている場合 : 何もしない
S_i がまだ登録されていない場合 : キーを S_i、値を i として辞書に登録する

前回のを思い出しながらやってみる




```py

N,Q = map(int,input().split())

#辞書作成
S ={}
for i in range(N):
    value = input()
    if value not in S:
        S[value] = i + 1
#検索
for _ in range(Q):
    value = input()
    if value in S:
        print(S[value])
    else:
        print(-1)
```

なるほど辞書検索ってこうやるんだな。。。
勉強になりました
TrueNAS Scale のインストール時に "unable to find a medium containing a live file system" が出たので忘備録

# はじめに
　TrueNAS Scaleをインストールする際に```unable to find a medium containing a live file system```が出てしまい、インストールに失敗しました。日本語の記事も少なく、海外のスレッドでも未解決のまま放置されているものも散見され、解決に半日を費やしました。  
　同じ事象を引いたときのために防備録を残しておきます。 

# 今回の解決方法
　今回はインストール用に用意したUSBストレージを指すUSBポートの位置を変更することで解決しました。
 
# 起きたこと
## 今回のHWの構成
| 種類 | 構成 | 個数 |
|:-----------|------------:|:------------:|
| CPU      | intel Core i3-13100        | 1        |
| mather board     | ASUS PRIME B760M-A D4     | 1       |
| RAM       | CMK64GX4M2E3200C16         | 2 (合計64G)         |
| strage (boot用)     | crucial P3 Plus CT1000P3PSSD8JP           | 1           |
| strage (pool用)     | WDC_WD80EAZZ-00BKLB0       | 2       |
| USB storage    | 転がっていたやつ     | -      |

## 今回のバージョン
| | |
|:------:|:-------------|
|使用したiso | TrueNAS-SCALE-23.10.0.1.iso |
|rufus | rufus-4.3p |

## インストール失敗までの流れ
- インストールUSBストレージにtrueNAS scaleを書き込んだ
- インストール先のPCの```フロントパネルのUSBポート```にメディアを差し込んだ
- インストールの選択画面が出てくるまで待機
- インストールを選択
- 上記のエラーが出てインストールが停止する

## 解決方法
インスールメディアのUSBストレージをリアパネルのUSB2.0のポートに差し込んだ。
今回はこのポートのみが正解でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/749215/192e63c8-86b6-c11f-73f5-10df0c0defb3.png)
https://www.asus.com/jp/motherboards-components/motherboards/prime/prime-b760m-a-d4/

# その他
　この分野に詳しくないので、間違いがあれば補足をお願いします。
　今回のエラーはインストールを開始したタイミングで、インストール用のメディアが見つからないことが原因の一つとしてあるようです。
　自分で書いていて矛盾しているのはわかっています。インストールの選択画面はインストール用のUSBストレージから持ってきているので、それを認識していないという表記は矛盾しています。
 しかし、エラーが出た画面で用意されているシェルを叩くと、HDDは認識しているものの、USBストレージが表示にない状態でした。（その副作用か、/boot.logの中身がなにもありませんでした）
 マザーボード側のポートも全て試しましたが、このポートのみが成功しました。追試も３回行いましたが、今のところ安定してインストールが可能でした。その他のポートは全滅でした。
 
# 参考
https://devicetests.com/fixing-unable-to-find-medium-error-ubuntu-usb
https://askubuntu.com/questions/15425/error-when-installing-unable-to-find-a-medium-containing-a-live-file-system
【GitHub】ローカルでは表示される画像が，GitHub Pagesで正しく表示されないときの解決方法

画像の拡張子の .PNG と .png の大文字と小文字の違いで，ローカルでhtmlファイルをブラウザで開くと問題なく表示される画像が，GitHub Pages上だと表示されませんでした．

Windowsの<b>ローカル環境ではURLの大文字と小文字が区別されません</b>が，<b>GitHub Pagesでは大文字と小文字の区別がされる</b>ようです．
AI Builder プロンプトビルダーについて

今回は、Igniteで発表された、AI Builderのプロンプトビルダーについて現在の情報をまとめます。

AI Builderでは、Azure AIを使用しており、Azure OpenAI Serviceの機能を使用できるAI Builder GPTモデルも用意されています。
そのようなLLMモデルをより簡単に使用するために用意された一つの機能がAI Builderのプロンプトビルダーです。

# プロンプトビルダーとは
```Microsoft Learn抜粋.txt

プロンプトビルダーは、GPT プロンプトの構築、テスト、展開を担う、AI Builder の新しいインターフェイスです。
この新しいインターフェイスを使用すると、プラットフォームのコンポーネントやコパイロット全体にわたって使用できるカスタムプロンプトを作成できます。
```

プロンプトビルダーとは、つまり、生成AIに対する指示内容（＝プロンプト）を事前に用意しておくことができる機能で、いろんなアプリやフローの中で、そのプロンプトをテンプレートとして使うことができます。
「こういうときのタスクにはこういうプロンプトがいい」とテンプレートを用意しておくことができるため、
生成AIの機能を使うときの障壁となる、「プロンプトの書き方がわからない」というハードルを下げてくれる機能になっています。

そして、このビルダーの中にプロンプトのテスト機能などの便利な機能も備えております。

現時点(2023/11/25)ではまだリリースされておりません。今度のリリース予定に含まれる機能となっていますが、実際に使えるようになるまでには少し時間がかかりそうです。

https://learn.microsoft.com/ja-jp/power-platform/release-plan/2023wave2/ai-builder/gpt-prompt-builder

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e50788f7-648a-dbdf-7b38-794acda32967.png)




実際に触るときには、Power AppsやPower Automateのスタジオを開き、[詳細]>[AIハブ]>[AIプロンプト]で見ることができますが、まだ編集などは（動的な値の挿入などでエラーになり）、まだ使うことができないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/18349d65-b23f-843e-d794-2c8a68713c9b.png)


プロンプトビルダーには二種類のプロンプトがあります。
- 事前構築済みプロンプト
- カスタムプロンプト

# 事前構築済みプロンプト
事前構築済みプロンプトは、Microsoftチームによって作成および微調整された事前設定済みのプロンプトで、作成者が一般的なタスクを簡単に達成できるように支援します。
様々なユースケースにおけ生成AIの使用方法を示すテンプレートを提供し、インタラクションを簡素化します。

現在、サンプルとして用意してくれている事前構築済みプロンプトは以下です。
- テキスト分類
- 苦情に応答する
- 要約
- 感情分析
- 情報抽出

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/6f1745b2-c69a-9ff8-d8d1-186a0769408b.png)

テキスト分析系でもともと存在していたAI Builderのモデル以下のモデルはプロンプトビルダーでプロンプトのサンプルを用意しておくことで簡単にGPTモデルで実現できるので、置き換わっていきそうですね。

- 感情分析
- カテゴリ分類
- エンティティ抽出
- キーフレーズ抽出
- テキスト翻訳
- 言語検出

# カスタムプロンプト
プロンプトを独自に詳細に作成することで、特定のビジネスニーズに合った応答を生成することができます。これにより、LLMモデルはさまざまなタスクを達成するための柔軟なツールに変わります。

例えば、費用対効果を算出したいような場面は組織の中でたくさんあると思いますが、それを***プロンプトビルダーで用意しておくことによって独自の「費用対効果算出モデル」を用意しておくことができる***ようなイメージです。


以下のように動的な値を入れて、その時の入力値に応じて出力ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/3571340e-0561-0e2b-f490-8bac2190e99f.png)


# まとめ
AI BuilderのGPT（テキスト生成）モデルや今回お話したプロンプトビルダーによってさらに、生成AIを使ったアプリ・フローが作成しやすくなりますね。
今後、本格的に使えるようになるのが楽しみですね！


GPT（テキスト生成）モデルについては以下をご参照ください

https://learn.microsoft.com/ja-jp/ai-builder/prebuilt-azure-openai
paloaltoの解析講座3：Wireshark

<!--
2023/11/13
-->
* paloalto解析講座の続き

https://unit42.paloaltonetworks.jp/using-wireshark-identifying-hosts-and-users/

## UserAgent から Windows OS Version を 特定

|Windows NT Version|Windows OS Version|
|---|---|
|Windows NT 5.1|Windows XP|
|Windows NT 6.0|Windows Vista|
|Windows NT 6.1|Windows 7|
|Windows NT 6.2|Windows 8|
|Windows NT 6.3|Windows 8.1|
|Windows NT 10|Windows 10 または Windows 11|

## 解析講座で使用したFilter
* 名前解決をするプロトコル
ホスト名の確認が可能。
![screenshot 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/88c5efd7-c60c-e81f-ef33-b6ece21773e8.png)
![screenshot 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/8e5f0bf3-8174-1bde-a55c-77dfa4c6455a.png)
~~~Filter:Dynamic Host Configuration Protocol
dhcp
~~~
~~~Filter:NetBIOS Name Service
nbns
~~~
<br>

* ヘッダーの指定方法
一般的にWebブラウザが作成するヘッダーとのこと
`http`だけだと、ブラウザでないHTTPの通信も表示される
~~~Filter:HTTP from Browser
http.accept_language
~~~
<br>

* ケルベロス認証からホスト名の確認が可能
![screenshot 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/a6a7c20a-dc20-3257-5288-69e59017962d.png)
* Columnに追加を選択。
![screenshot 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/ed5371b1-9a38-6675-44f8-580ee321bc7d.png)
* Columnに一覧で確認できるようになった。
![screenshot 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/255a0c49-8176-f760-57d0-8a49ec63002b.png)

~~~Filter:Kerberos Authentication
kerberos.CNameString
~~~
<br>

* LDAPからホスト名の確認が可能
![screenshot 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/495f8d51-9fc0-3617-2c94-51d1936dd67a.png)
~~~Filter:Lightweight Directory Access Protocol
ldap contains "CN=Users"
~~~
<br>

* IP以上のレイヤーから、平文のASCII文字列検索
~~~Filter:Computer Name (Windows)
ip contains "DESKTOP-"
~~~

## 文字列の検索
* `Edit` `Find Packet…`を選択して、入力欄を表示
![screenshot 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/9ae68704-f25b-d77b-72ab-617828e26c6c.png)
<br>

* `Packet details` `String`を選択し、検索を実行
Wiresharkでデコードされた結果からも検索できる
![screenshot 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/ecb2611b-f0aa-15bd-598d-766a736984d8.png)
<br>

* 以上です。
Best Water Treatment (ETP, STP, WTP, RO) Solutions in Bangladesh

Founded in 2013 Green Genesis Engineering Ltd. is a professional engineering company doing green business and offering water purification and related services with a team of professional and skilled workers & management offering a large portfolio of water treatment/management services designed to help plant personnel and end-user organizations to get the most out of their water treatment system. We offer dependable, high-quality products in Bangladesh that are rather difficult to find if purchased directly from the manufacturers. We are, therefore, dedicated to bringing the greatest valued solutions and providing the supreme customer experience in meeting water treatment and environmental solutions needs through our pioneering technology solutions, products, and services. Green Genesis Engineering Ltd. is now acclaimed to be the best one-stop service and solution provider in water, wastewater, desalination, demineralization, effluent, and sewage treatment in Bangladesh. We will continue to make optimistic contributions to industry, society, and the environment.
10の割り算　割られる数が1000ぐらいまで正しい

xコメントも見てください。

10の割り算　割られる数が1000ぐらいまで正しい


目的
温度センサー等の値から数値の文字列に
変換したい。

原理

(x * 204.8)/2048 = x * 1/10 

(x * 205  )/2048 = だいたい x * 1/10

例 温度が27度の時

( 27 * 205 ) >> 11 = 2 (小数点以下切り捨て) 


オンラインコンパイラ


https://paiza.io/ja


```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int al;
    
    al=27;
    al=(al*205)>>11;
    printf("%d\n",al);
    
}

```

```

2

```
javaのString.Intern()メソッドとパフォーマンス

## String.Intern()メソッド
文字列オブジェクトの正準表現を返します。
文字列のプールは、初期状態では空で、クラスStringによってプライベートに保持されます。
internメソッドが呼び出されたときに、equals(Object)メソッドによってこのStringオブジェクトに等しいと判定される文字列がプールにすでにあった場合は、プール内の該当する文字列が返されます。そうでない場合は、このStringオブジェクトがプールに追加され、このStringオブジェクトへの参照が返されます。
## パフォーマンス影響
サンプルコード(intern()メソッド使用しない)
```java
public class StringInternTest {

  public static void main(String[] args) {
    final int maxCount= 1000 * 10000;
    String arr[] = new String[maxCount];
    
    Integer data[] = new Integer[] {1,2,3,4,5,6,7,8,9,10};
    long start = System.currentTimeMillis();
    for (int i=0; i<maxCount; i++) {
      arr[i] = new String(String.valueOf(data[i%data.length]));
      // arr[i] = new String(String.valueOf(data[i%data.length])).intern();
    }
    long end = System.currentTimeMillis();
    System.out.println("The execute time is:"+ (end-start));
    try {
      Thread.sleep(1000000);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
```
結果
```
The execute time is:3085
```
javaVisualVM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/12893a2d-a67f-f57f-82a6-c7d8f48faf4f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/6863442f-383c-76d6-79b0-817ef1691fb6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/f2aa56fc-d7a7-631a-f279-f480f721a93f.png)
サンプルコード(intern()メソッド使用する)
```java
public class StringInternTest {

  public static void main(String[] args) {
    final int maxCount= 1000 * 10000;
    String arr[] = new String[maxCount];
    
    Integer data[] = new Integer[] {1,2,3,4,5,6,7,8,9,10};
    long start = System.currentTimeMillis();
    for (int i=0; i<maxCount; i++) {
      // arr[i] = new String(String.valueOf(data[i%data.length]));
      arr[i] = new String(String.valueOf(data[i%data.length])).intern();
    }
    long end = System.currentTimeMillis();
    System.out.println("The execute time is:"+ (end-start));
    try {
      Thread.sleep(1000000);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
```
結果
```
The execute time is:839
```
javaVisualVM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/4524b230-28e7-1f26-1191-955cb5806c64.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/f547e3f3-1b1a-58eb-468e-18b5ec9ba653.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/6452b5c2-914b-3e3d-2d45-8b3c7d26700b.png)
ですので、intern()メソッドを使用すると、プールにあるものを使って、メモリ領域の節約ができって、GC回数を減らして、パフォーマンス向上ができました。
カラー液晶座標変換の為に320倍して遊ぶ


カラー液晶座標変換の為に320倍して遊ぶ

目的
コンパイラーの最適化に頼らず
計算方法を指定する
あんまり、使う機会は、ないが

理論
alを8倍する
alから1倍を2回足す
答えをさらに32倍する

320倍になる


80倍とか640倍とか
同じ方法で出来る


オンラインコンパイラ


https://paiza.io/ja


例


```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int al;
    
    //ex 9
    al = 9;
    
    al=(al<<3)+al+al;
    al=al<<5;
    
    printf("%d\n",al);
    
     //ex 10
    al = 10;
    
    al=(al<<3)+al+al;
    al=al<<5;
    
    printf("%d\n",al);
    
}

```


```

2880
3200


```
Pythonでのツール作成時に困ったこと③


①csv出力
取り込んだデータをcsv出力するツールを依頼されたため作成したところ
to_csvでcsv出力時し、出力されたcsvをExcelで開こうとしたら文字化けしてしまう

メモ帳で開くと文字化けせず開くことができる

調べたところ、文字コードの問題でした
to_csvのencodingはデフォルトがutf-8になっているため、Excelで開くと文字化けしてしまう

ここを変更することで文字化けは解消される
今回依頼されたツールではutf-8が良いそうなので、デフォルトのままとしました



②完了メッセージ
処理の完了をわかりやすくするためメッセージボックスを実装したところ
最前面に表示されず、見落としてしまう

以下を実装することで最前面に来るようになった
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root. attributes('-topmost',True)
messagebox.showinfo('処理の完了', '処理が正常に終了しました')


しかし今度はTKのウインドウが開いてしまう、処理の完了で閉じるので処理には影響ないが消したい

こちらを消すために以下を追加
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root. attributes('-topmost',True)
root.withdraw()
messagebox.showinfo('処理の完了', '処理が正常に終了しました')

これでTKが表示されず、完了メッセージも前面に来るようになった


いろいろ調べたところ、rootのタイトル画面とラベルを以下のように設定しても表示できました
ただし以下のコードだとボタンがなく、画面表示が自動となります
root = tk.Tk()
root. attributes('-topmost',True)
root.title('処理の完了')
label = tk.Label(root, text='処理が正常に終了しました')
label.pack()
root.mainloop()
mindの研究 その37 - mindで再帰を書いてみた

# 概要
mindが謎なので調べてみた。
練習問題やって見た。

# 練習問題
mindでハノイの塔を書け。

# サンプルコード

```

ハノイの塔とは
　数１は　変数
　数２は　変数
　文字列１は　文字列
　文字列２は　文字列
　文字列３は　文字列
　数１に　入れ
　文字列１に　入れ
　文字列２に　入れ
　文字列３に　入れ
　数２に　数1を　入れ
　もし　数１が　１より　小さい　ならば
　　終り
　さもなければ
　　文字列２をつみ
　　文字列３をつみ
　　文字列１をつみ
　　数１から　１を　引いて
　　ハノイの塔し
　　「ディスク」を　表示し　数１を　数値表示し　「を」を　表示し　文字列１を　表示し　「から」を　表示し　文字列２を　表示し　「へ移動」を　表示し　改行する
　　文字列１をつみ
　　文字列２をつみ
　　文字列３をつみ
　　数１から　１を　引いて
　　ハノイの塔し
　つぎに
　。

メインとは
　「B　」をつみ
　「C　」をつみ
　「A　」をつみ
　３をつみ
　ハノイの塔する。


```

# 実行結果

```
>hanoi
ディスク1をA　からC　へ移動
ディスク2をA　からB　へ移動
ディスク1をC　からB　へ移動
ディスク3をA　からC　へ移動
ディスク1をB　からA　へ移動
ディスク2をB　からC　へ移動
ディスク1をA　からC　へ移動

```


以上。
「ファイル使用中」のメッセージが表示されたときにまず確認すること

## はじめに

ファイルに対してオブジェクト操作をした際、（画像１）のような「ファイルは使用中である。」というメッセージが表示されたことはないでしょうか？

（画像１）
![checkObjectRock_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/59a68579-6a70-c394-d01e-168c6d25eaf8.png)

この記事では、「ファイルは使用中である。」というメッセージが表示されたときに、まず確認すべき事をご紹介します。


## 確認コマンド

`WRKOBJLCK OBJ(ライブラリー/ファイル) OBJTYPE(*FILE) MBR(*ALL)`

（画像２）のような結果が出力されます。

（画像２）
![checkObjectRock_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/14527402-5f6c-8a79-0cc8-80f2b398b4ac.png)


## 原因

（画像１）に表示されているメッセージから、対象のファイルが他のユーザーに使用されていることにより、オブジェクトがをロックされていることが考えられます。

そのため`WRKOBJLCK`コマンドで、対象ファイルに対するロックを確認しています。


ご参考になれば幸いです。最後までお読み頂きありがとうございます。
Render.comで「No open HTTP ports detected・・・」というエラーが出た場合の対処法

Render.comで「No open HTTP ports detected　・・・ Web Services | Render · Cloud Hosting for Developers」というエラーが出てデプロイはできてもWebアプリケーションに接続できないという事象が生じることがあります。
今回はその解決法を説明します。Dockerを使用しているという前提です。

# PORTを指定する
解決法自体は公式ドキュメントに記載されています。

https://render.com/docs/web-services#host-and-port-configuration

次は具体例で手順を説明していきます。
例えば、docker-compose.ymlで以下のようにポートをしていたアプリケーションをRender.comにデプロイする際にPORTを8080に指定したい場合を想定します。
```
・
・
・
    ports:
      - 8080:8080
・
・
・
```
このケースではWeb Serviceを作成する際に「Advanced」をクリックし、以下のように環境変数に「PORT」、値として「8080」を指定します。
![スクリーンショット 2023-11-25 191648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/e8c620ed-8339-f3d8-7c0f-3d852823cac1.png)
既にWeb Serviceを作成している場合には以下の画像のとおり設定します。そして、必要に応じて、再度「Deploy latest commit」をしてください。

![スクリーンショット 2023-11-25 190522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3439167/8e5ef11d-35f0-9ed6-65e1-980a7e0ea01c.png)

以上です。
「取得」メソッドの命名では適切な動詞をチョイスしよう

# はじめに
ひとえに「取得」といっても、データベースからの取得、外部APIからの取得など、細かなニュアンスが異なる「取得」がある。
各パターンに応じて適切な動詞を用いた命名を行いプログラム保守性を高める。

# 結論
|動詞 |ニュアンス |
|-----------|------------|
|get|オブジェクトからprivateなフィールドの値を取り出す。|
|fetch|外部サービス(API等)へ通信してレスポンスを取得する。 |
|retrieve|データベースやストレージを検索しリスト等を取得する。(汎用的)|
|find|データベースやストレージを検索し1件だけ存在するユニークデータを取得する。(限定的)|
|select|配列などのコレクションから条件にマッチするデータを取得する。|

# 補足
- なんでもかんでも雑に`get`と命名するのは処理のヘビー具合が感じ取れないのでアンチパターン。アクセサ (getter / setter) やプロパティ以外では回避すべき。
- `select`はSQL文のSELECT文実行するだけの処理に使っても良い（現にそのような命名をするライブラリは多い）。ただしSELECT文以外の加工処理が含まれそうであれば`retrieve`が無難。
- `search`は使わない。英単語としての目的語は場所を取る。プログラミングの文脈での使用に即するのは`search for`という表現になるが、冗長。そもそも「取得する」という意味合いが薄いので、代わりに`retrieve`を推奨。

# 参考
https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923
アラームの代わりに指定時刻に言葉を喋る

# はじめに
アラームの代わりに指定時刻に言葉を喋るようにしました。
指定時刻が現在時刻を過ぎている場合は、翌日の指定時刻に喋ります。
# 使用方法
■単独で使用する方法
python3 /home/XXXXXX/test.py 17時0分犬の散歩の時間です

# 指定された時刻に言葉を喋るプログラム(test.py)

```py
import subprocess
import argparse
import time
import re
from datetime import datetime, timedelta

def extract_time_from_string(text):
    # 文字列から時刻を抽出するための正規表現
    time_pattern = re.compile(r'(\d{1,2})時(\d{1,2})分')

    match = time_pattern.search(text)
    if match:
        # マッチした時刻を取得
        hour, minute = map(int, match.groups())
        print(hour, minute);
        return datetime(datetime.now().year, datetime.now().month, datetime.now().day, hour, minute)
    else:
        # マッチしない場合は現在時刻を返す
        return datetime.now()

def speak_at_time(text):
    # 文字列から抽出した時刻を取得
    start_time = extract_time_from_string(text)

    current_time = datetime.now()
    time_to_wait = start_time - current_time
    if time_to_wait.total_seconds() < 0:
        # 待機時間が負の場合、翌日の同じ時刻まで待機する
        wait_time = timedelta(days=1) + time_to_wait
    else:
        wait_time = time_to_wait

    # 待機
    time.sleep(wait_time.total_seconds())

    # 文字列を喋る
    cmd = "/home/XXXXXX/speak.sh " + text;
    subprocess.run(cmd, shell=True)
    subprocess.run("sleep 5", shell=True)
    subprocess.run(cmd, shell=True)

if __name__ == "__main__":
    # 起動オプションの文字列（時刻を含む）
    parser = argparse.ArgumentParser()
    parser.add_argument("param")
    args = parser.parse_args()
    text = args.param

    # 文字列を喋る
    speak_at_time(text)
```
# speeak.shについて
下記の記事を参考にしてください
[音声合成の３つの方法]
(https://qiita.com/kobbeko/items/51daa9e7e6e6aadb1cf5)
闘魂Elixir ── "闘魂"とは<<0xE99798::24, 0xE9ad82::24>>である

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

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



# はじめに

「闘魂とは、己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことだと思います」とアントニオ猪木さんは、引退試合でドン・フライ選手をくだしたあとのセレモニーで発言されました。

[Elixir](https://elixir-lang.org/)における"闘魂"とは、`<<0xE99798::24, 0xE9ad82::24>>`のことです。
果たしてどういうことでしょうか！？

# What is [Elixir](https://elixir-lang.org/) ?

[Elixir](https://elixir-lang.org/)という素敵なプログラミング言語があるのですね。
その素敵具合は「[Elixir Saves Pinterest $2 Million a Year In Server Costs](https://paraxial.io/blog/elixir-savings)」によく現れています。開発者も経営者もこの事実に瞠目することでしょう。 **$2 Million/年の節約ですってよ！、奥さん。**

https://paraxial.io/blog/elixir-savings

# "闘魂"とは、<<0xE99798::24, 0xE9ad82::24>>のことです

[Elixir](https://elixir-lang.org/)の文字列はビットストリングの一種です。
論よりRunです。

```elixir
iex> "闘魂" = <<0xE99798::24, 0xE9ad82::24>>
"闘魂"
```

マッチします。

```elixir
iex> Kernel.match?("闘魂", <<0xE99798::24, 0xE9ad82::24>>)
true
```

`true`です。

## ビットストリング

ビットストリングとはこういうものです。

```elixir
<<0b1000::4>>
```

2進数0b1000(10進数で8)を4bitで表現しています。

## コードポイント

```elixir
iex> ?闘
38360

iex> ?闘 |> Integer.to_string(2)
"1001010111011000"
```

?でコードポイントを調べることができます。

https://hexdocs.pm/elixir/1.15.7/String.html#module-unicode-and-code-points

## コードポイントをUTF-8で符号化する

https://qiita.com/omiita/items/50814037af2fd8b2b21e#%E3%82%82%E3%81%86%E5%B0%91%E3%81%97%E6%99%82%E9%96%93%E3%81%8C%E3%81%82%E3%82%8B%E6%96%B9%E3%81%B8

の解説の通りです。

1001010111011000を4bit, 6bit, 6bitにわけて、先頭からE0, 80, 80を足すわけです。
[Elixir](https://elixir-lang.org/)ではビットのパターンマッチもお手のものです。

```elixir
iex> <<a::4, b::6, c::6>> = <<?闘::16>>

iex> a
9

iex> (a + 0xE0) |> Integer.to_string(16)
"E9"

iex> b
23

iex> (b + 0x80) |> Integer.to_string(16)
"97"

iex> c
24

iex> (c + 0x80) |> Integer.to_string(16)
"98"

iex> <<a + 0xE0, b + 0x80, c + 0x80>>
"闘"
```

"魂"も同じ要領で確かめてみてください。


# 使い所

たとえば、文字列の末尾が`"Z"`のときにAの処理をしたい、それ以外はBの処理をしたいというようなときに使えます。（まあ文字列が3個の英字とかって言う時しか末尾のパターンマッチでは書きにくいのかもしれません。先頭なら書きやすいとおもいます。残りは`rest::binary`でパターンマッチできるので）

```elixir
defmodule Awesome do
  def hoge(<<_, _, ?Z>>>), do: :a
  def hoge(_), do: :b
end
```

実践例は以下にあります。

https://qiita.com/torifukukaiou/items/def2390e9b725d4b2b98


# さいごに

[Elixir](https://elixir-lang.org/)における"闘魂"とは、`<<0xE99798::24, 0xE9ad82::24>>`であることを示しました。
文字列はビットストリングの一部です。

人類は不老不死の霊薬を意味する素敵なプログラミング言語[Elixir](https://elixir-lang.org/)を手に入れました。並行処理を他のプログラミング言語よりも比較的容易に書くことができます。それはきっとコンピュータ資源を有効活用できることにつながるでしょう。巡り巡って世界平和に貢献できることでしょう。

さあ、そこのあなたも[Elixir](https://elixir-lang.org/)の世界へようこそ。
_手始めに[エリクサーチ](https://elixir-lang.info/)なんていかがでしょうか。私のオススメです。_

---

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

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
Raspberry PiとGoogle Meetでお手軽ペットカメラ

この記事は2020年12月26日から開催された技術書典10にて頒布した「KLabTechBook Vol.7」に掲載したものです。
…

https://makiuchi-d.github.io/2023/11/25/klabtechbook7-petcam.ja.html
変数のスコープ JavaScriptとPHPの違い

## JavaScript(letとconst)
1. {}でエリアが形成される
1. 内のエリアで、外のエリアで宣言された変数を扱うことはできる
1. 外のエリアで、内のエリアで宣言された変数を扱うことはできない
1. 外の複数のエリアで同名の変数が宣言されているとき、最も近いものが扱われる
#### 2. 内のエリアで、外のエリアで宣言された変数を扱うことはできる
```test.js
const a = 'aaa'
{
    console.log(a) // aaa
}
```
#### 3. 外のエリアで、内のエリアで宣言された変数を扱うことはできない
```test.js
{
    const b = 'bbb'
}
console.log(b) // ReferenceError: b is not defined
```
#### 4. 外の複数のエリアで同名の変数が宣言されているとき、最も近いものが扱われる
```test.js
const a = 'a1', b = 'b1'
{
    const a = 'a2'
    console.log(a, b) // a2 b1
    {
        console.log(a, b) // a2 b1
    }
}
```
## PHP
#### functionの内から外で宣言された変数を扱うことはできない。外から内もできない。
```test.php
$x = 'xxx';
function f () {
    echo $x; // Undefined variable $x
    $z = 'zzz';
}
f();
echo $z; // Undefined variable $z
```
## まとめ
* JSではとにかく"{}"（ifやfor、関数（関数宣言、関数式、アロー関数いずれでも）など）でエリアが形成される
* PHPではfunctionでエリアが形成される。ifやforではエリアが形成されないので、内から外の、外から内の変数を扱うことができる
【備忘録】サーバーへGitプライベートリポジトリをクローンする

### はじめに

Gitでプライベートにしているリポジトリをレンタルサーバーへクローンする方法を備忘録として残します。

### ローカルのターミナルからサーバーへアクセスする

#### 【１】ローカルでSSHの秘密鍵を生成する

```
cd ~/.ssh
// 新規作成の場合
ssh-keygen -t ed25519 -C "キーにつける名前"

// すでにed25519がある場合、新しい名前で作成
ssh-keygen -t ed25519 -f ~/.ssh/新しいキー名
```

#### 【２】Xserverに公開鍵をセットする

![スクリーンショット 2023-11-25 18.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/b98ad783-ae1f-4337-b352-a15b834d6b25.png)

設定が反映しているか確認する。

#### 【３】ローカルのターミナル内でSSHエージェントに秘密鍵を追加する

```
ssh-add ~/.ssh/秘密鍵
```

#### 【４】ターミナルからサーバーへアクセスする

```
ssh -p 10022 Xserverでのユーザー名@Xserverでのホスト名
```

これでアクセスできます。

### サーバー内にプロジェクトリポジトリをクローンする

#### 【１】サーバー上にSSHキーを生成する

```
cd ~/.ssh
// 新規作成の場合
ssh-keygen -t ed25519 -C "キーにつける名前"

// すでにed25519がある場合、新しい名前で作成
ssh-keygen -t ed25519 -f ~/.ssh/新しいキー名
```

#### 【２】GitHubにSSHキーを登録

![スクリーンショット 2023-11-25 16.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/bb3ab65e-9515-75f5-5612-0b2046ef6946.png)

#### 【３】GitHubとの接続確認

```
// サーバー内に.sshディレクトリがあるか確認
ls ~/.ssh
```

```
cd 対象のドメインディレクトリ

// まだ接続できていないはずです
ssh -T git@github.com
```

```
// サーバーとGithubを接続するため、SSHエージェントを起動する
cd 対象のドメインディレクトリ
eval $(ssh-agent)

// SSHエージェントに秘密鍵を追加する
ssh-add ~/.ssh/秘密鍵のファイル
```

```
// Githubとの接続を再確認
ssh -T git@github.com
```

上記が成功すると、"Hi ユーザー名"のように返ってきます！

#### 【４】クローンできるか確認

```
Cloning into '〇〇'...
remote: Enumerating objects: 560, done.
remote: Counting objects: 100% (126/126), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 560 (delta 51), reused 90 (delta 34), pack-reused 434
Receiving objects: 100% (560/560), 249.58 KiB | 0 bytes/s, done.
Resolving deltas: 100% (252/252), done.
```

無事できました。
かなり初歩的なところで躓き過ぎたので、また改めて仕組みから勉強しなおそうと思います。
ESXi環境へのAmazonLinux2023インストール

# 1. seed.iso 起動イメージ作成

## 1.1 Linux環境にログインする
ここではRHEL環境にログインする

## 1.2 適当な場所に seedconfig フォルダを作成する
ここでは /tmp 配下に作成する
```shell: shell
cd /tmp
```

## 1.3  meta-data ファイルを作成して、ホスト名を設定する
```shell: shell
# vi meta-data
local-hostname: <vm-hostname>
```

## 1.4 user-data ファイルを作成して、rootユーザとec2-userのパスワードを設定する
```shell: shell
# vi user-data

#cloud-config
#vim:syntax=yaml

users:
# A user by the name 'ec2-user' is created in the image by default.
- default

ssh_pwauth: true

chpasswd:
  list: |
     root:<myrootpassword>
     ec2-user:<mypassword>
  expire: false
```

1.5 seed.iso 起動イメージを作成する
```shell: shell
# yum install xorriso
# mkisofs -output seed.iso -volid cidata -joliet -rock user-data meta-data
```

# 2. Amazon Linux 2 仮想マシンイメージをダウンロード
https://cdn.amazonlinux.com/al2023/os-images/latest/

# 3. ESXi でOVAファイルを使って仮想マシンを作成する
　　　→起動はまだ行わない

# 4. 仮想マシン構成を開いてCD/DVDドライブに seed.iso を設定する

# 5. 仮想マシンを起動して、root or ec2-user でログインする

https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2-download.html

https://korodes.com/aws_01/

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_cloud-init_for_rhel_8/introduction-to-cloud-init_cloud-content#doc-wrapper
flaskでuser_agentのbrowserが取れなかった話

久々の投稿。
最近、生成AIのプロジェクトに関わることが増えてきたので、とにかくPythonをかけるように勉強中です。

Head First Pythonを読んでいるのですが、その中で、browserを取る下記のコードが書かれてた。
```python
res.user_agent.browser
```

しかし、上記は「None」となってしまう。
```python
dir(res.user_agent)
```
とすると、browserはあるので、取れるはずだが、、正直理由はわからない。

根本原因は分からなかったので、他の方法がないかを探したところ下記で動作する。
```python
from ua_parser import user_agent_parser

parsed_string = user_agent_parser.Parse(str(req.user_agent))
browser = parsed_string["user_agent"]["family"]
```

これで、browserに「Chrome」や「Safari」が入ることになる。
試されたい。


# 参考
[uap-python](https://github.com/ua-parser/uap-python)
[Can't get user browser with flask request](https://stackoverflow.com/questions/73404940/cant-get-user-browser-with-flask-request)
[DAX Studio] View Asオプション

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## View As

**View As**オプションは**Advanced**タブにあり、RLS(行レベルセキュリティ) ロールを簡単にテストできます。

![viewas-button-8f104f33a02ce0945b4d7210af384217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/551eb499-8b69-467d-a6ec-d4d192c341e4.png)

これにより、選択したロールの機能をテストして、クエリが正しくフィルタリングされたデータを返すことを確認したり、Server Timingsトレースを実行して、これらのロールがクエリに与える影響を測定したりすることができます。

**View As**ダイアログにはモデル内のロールのリストが表示され、テストするロールを選択することができます。

![view-as-dialog-3a927c75dc5f08b4e6473ce025d5b4be.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/81bf43ea-0de5-b53f-430a-040abdf295d3.png)

:::note
動的なセキュリティを持つロールをテストする場合、テストしたいロールにチェックを入れ、他のユーザオプションにチェックを入れて、他のユーザになりすます必要があります。(すなわち、USERNAME()またはUSERPRINCIPALNAME()関数を参照するもの)をテストする場合、テストしたいロールにチェックを入れ_、_別のユーザになりすますために**Other User**オプションにチェックを入れる必要があります。
:::

**View As**オプションが有効な場合、クエリエディタの上部に黄色の情報バーが表示されます。情報バーの右側にあるXをクリックすることで、**View As**モードを終了することができます。

![viewas-results-c6cd4bf2dbcbf8ebc0c10b37be39dab2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/dbe7ccb8-bfe5-25bf-1d3f-f8de6ba9a2ef.png)

## RLS の役割のベンチマーク

性能比較をより簡単にするために、ベンチマーク機能に新しいオプションが追加され、**View Asを**アクティブにした状態でベンチマークを開始すると有効になります。

![benchmark-rls-ce0aacfcf7fee3947e81dc3706baa9d1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/4db255db-2f2f-85e8-9897-71b5b922b6ab.png)

2 回目のパスのオプションをオンにすると、ベンチマーク結果には、RLS の役割が有効であったパスの 2 つ目の列が含まれます。

![benchmark-rls-results-4c5b8fb09ac5ec18b4abb29bc7029499.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/865fa57e-1507-39c0-cb1f-1d5628ae76fa.png)
[DAX Studio] モデル メトリクス

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## モデル メトリクス

DAX Studioには、データモデルを分析し、メモリ使用量をレポートする機能があります。これは、パフォーマンスチューニングの際に非常に役立ちます。データ構造に必要なメモリが多いほど、処理とクエリの両方が遅くなるからです。

:::note
すべてのメトリクスは、モデルがメモリにロードされるときに使用されるメモリに関連しています。モデルがディスクに保存される際、余分な圧縮が適用されるため、ビュー・メトリクス画面で報告される合計サイズよりも小さくなる可能性があります（ただし、サイズが大きくなる珍しいケースも見られます）。
:::

メトリクス機能は、DAX Studio リボンの**Advanced**タブにあります。メトリクスのセクションには3つのボタンがあります：

-   **View Metrics**: 現在のモデルを分析し、レポートを作成します
-   **インポートメトリクス**：これは、以前に保存された.vpaxファイルを開きます
-   **Export Metrics**: .vpaxファイルが作成され、後で開くことができます

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/b3495e01-be9f-d581-fff1-b1ad1768ba66.png)

## メトリクスをみる

**View Metrics**オプションを選択すると、以下のタブがあるウィンドウが表示されます。

### テーブル メトリックス

最も重要で実用的な情報が表示されるため、これがデフォルトのビューです。テーブル情報が表示されますが、テーブルを展開してそのテーブルのカラム情報を見ることもできます。デフォルトでは、最もメモリを使用しているテーブル/カラムが最初に表示されるようにソートされています。

![table-metrics-16ac8fbe9c5d1e6dc81599a3fd66e482.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/cdfc53e2-c02f-7bc6-d115-4a94130c0f28.png)

### コラム・メトリクス

このビューでは、テーブルタブと同じ情報が表示されるが、テーブル内の列はグループ化されず、すべて1つのフラットリストでソートされる。

![column-metrics-587ed69e98c88f425d365a9625875e1a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/15af0096-d31f-dc79-9e4c-b0620b7ca41b.png)

### リレーションシップ

このタブには、モデル内のリレーションシップに関する情報が表示されます。

![relationship-metrics-fb9b7eed155143152c0f9ca94cf44461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/42bebd90-cfb7-d4d6-9b20-fd2fc8b6f1b5.png)

### パーティション

デフォルトでは、すべてのテーブルには少なくとも 1 つのパーティションがあります。AzureAS、SSAS on-prem、または Power BI でインクリメンタル処理を有効にした大規模モデルの場合、複数のパーティションを持つテーブルが存在することがよくあります。このビューには、それらのパーティションに関する情報が表示されます。

![partition-metrics-b0e8316f17ed4dc660ae070ce30708c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/7060c1e1-e03d-d932-0bd5-0854c56553ae.png)

### 概要

このビューには、モデルの総メモリ使用量情報、互換モード、最後に処理された時期、この分析が実行された時期に関する情報が表示されます。

![summary-metrics-fb7bcc9ec4ee73cc9e285a3b0b69e065.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/51680c6a-c037-7c49-5a79-6f4c1eeb9a8e.png)

## 必要なパーミッション

View Metrics 機能では、データに対するクエリと、モデル・メタデータに対する DMV クエリの両方を実行する必要があります。メトリクスを表示またはエクスポートするエンド・ユーザーは、これらのクエリーを実行するために、データ・モデルへの読み取り/書き込みアクセス権を持っている必要があります。

| 環境 | 最小パーミッション |
| --- | --- |
| Power BI Desktop / SSDT / Power Pivot | n/a - ユーザーはデフォルトでフルパーミッションを持っています。 |
| Power BIプレミアム（XMLAエンドポイント） | コントリビューター |
| Azure AS / SSAS | データベース管理者 |
[DAX Studio] メタデータ ペイン

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## メタデータ ペイン

DAX Studioには3種類のメタデータペインがあります。すべてのメタデータペインでは、項目をダブルクリックしてエディターの現在の位置に挿入するか、項目をドラッグしてクエリペインの選択した位置にドロップすることができます。

### モデルのメタデータ

モデル メタデータ ペインには、現在接続されているデータソースに関する情報が表示されます。ペインの上部にあるデータベース ドロップダウンとモデルドロップダウンを使用して、表示するメタデータを選択することができます（Excel や Power BI Desktop などの一部のデータソースでは、データベース ドロップダウンは無効になっています）。 [モデル・メタデータ](https://daxstudio.org/docs/features/model-metadata/) ペインでは、モデル内のさまざまなオブジェクトに関する情報を表示できます。

![Metadata-Panes_ModelMetadata-c166c21fa5171859412832ebb79fa45a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/c12c921b-0e80-0a32-0515-fe3054edffec.png)

### ファンクション メタデータ

関数ペインには、利用可能なすべてのDAX関数が表示されます。この情報は毎回データ ソースからクエリされるため、関数のリストは常にそのデータ ソースで利用可能なすべてのリストを表している必要があります。これは、Power BI Desktop のように、毎月の更新で新しい関数が提供される可能性があるデータ ソースで非常に便利です。

![Metadata-Panes_FunctionMetadata-0f26fbfafe616711b9f2492c573ca3d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9dfbc2fb-beae-a5e0-495d-e01f72e0dff1.png)

### DMVメタデータ

[DMV（Dynamic Management Views](https://daxstudio.org/docs/features/dmv-list/)）は、データソースから情報を問い合わせる方法です。データの構造に関する情報と、"サーバ "の内部状態（メモリ使用量や現在のセッション数や接続数など）に関する情報の両方を得ることができます。

![Metadata-Panes_DMVs-f6c00aa781e72214dc4a79e1443a3953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/774be6bc-61ae-24d5-cd15-9da1e4c2fc38.png)

# モデルのメタデータ

表形式の Analysis Services モデルおよび PowerPivot モデルには、多次元および表形式のクライアントからクエリを実行する機能があります。この機能では、メタデータが表形式で表示され、メタデータペインからクエリペインに項目をダブルクリックまたはドラッグすると、表形式の名前形式になります。

バージョン 2 では、階層と KPI がサポートされています。表形式の用語では、階層は基本的にレベルの集まりであり、KPI は 3 つの異なるメジャー (Actual、Target、Status の各 1 つ) を保持するコンテナです。

![Model-Metadata_metadata-cdc072d9b0d150b72a4d62a991217324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/039ebcb0-4591-d2f1-2e41-bb083cc686a5.png)
[DAX Studio] MDXサポート

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## MDXサポート

DAXクエリを実行するだけでなく、DAX Studioから[MDX](https://learn.microsoft.com/en-us/sql/mdx/mdx-language-reference-mdx?view=sql-server-ver16)クエリを実行することもできます。

MDXを実行する機能は、Microsoftの表形式エンジンによって提供されています。DAX Studioはクエリーテキストをデータソースに送信し、結果を表示するだけです。

## 制限事項

MDXクエリーには以下の制限があります。

-   シンタックスハイライトは MDX 言語をサポートしていません
-   DAX StudioはMDXコード補完機能を提供しません
-   DAX Studioは生データのみを表示し、マルチディメンジョナルモデルで設定可能な追加フォーマット情報（背景色、前景色、フォーマット文字列など）は要求しません

## パフォーマンス

DAX Studioのパフォーマンスは、他のツールからMDXクエリを実行するのとほぼ同じです。ただし、MDXクエリには、2つの返り方があることに注意してください。

-   行セット - 行と列の2次元配列
-   セルセット - 多次元構造

DAXクエリは行セット形式でのみデータを返すため、DAX Studioではこの構造を使用します。これは、Report Builderなどのツールで使用される形式でもあります。一方、Excelはセルセット形式を使用しているため、セルセットを使用するExcelのようなツールと行セットを使用するDAX Studioのようなツールの間でパフォーマンスに差が出る可能性があります。

MDXはまた、異なるキャッシュ特性と異なる内部セマンティクスを持つため、MDXクエリと同等のDAXクエリではパフォーマンスに差が生じます。

MDXクエリに特に興味があるのであれば、[MDX Studioという](https://www.sqlbi.com/tools/mdx-studio/)MDX言語専用のツールがあります。
[DAX Studio] Power BIパフォーマンスデータのロード

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## Power BIパフォーマンスデータのロード

現在、Power BI Desktopには、パフォーマンスアナライザを実行する機能があります（「表示」リボンから表示できます）。

![powerbi-perf-analyzer-e17b2cad1d90d743c04fed3b568d2d6d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d91e22bf-9309-f6fc-e534-4c44f45a577c.png)

これにより、Power BI レポート内のさまざまな操作のタイミングを記録できます。

この機能では、各ビジュアルのタイ ミングの内訳をツリーレイアウトで表示します。また、生のパフォーマンスデータをjsonファイルにエクスポートすることもできます。

DAX Studioを使用すると、パフォーマンスデータをインポートしてグリッドにロードすることができます。また、ダブルクリックすると、低速のクエリをエディタに表示し、パフォーマンスを改善するための作業を行うことができます。

![dax-studio-powerbi-perf-data-c4c02bd111c79ecab6fa756bdea8e84a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/29635440-6738-1170-73bb-75d526c015c3.png)

:::note
DAX StudioはPower BIから他の期間をインポートしません。これは、ビジュアルが処理待ちのキューに入れられた時間が大部分を占めるためです。これは、Power BIでレンダリングを行うjavascriptエンジンがシングルスレッドであるためです。
:::
[DAX Studio] コード補完のサポート

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## コード補完サポート

Dax Studioは完全なコード補完をサポート

:::note
現在、DAX Studioはコード補完で変数をサポートしていません。
:::

コード補完は、常に列の前にテーブル名を付け、メジャーの前にテーブル名を付けないというベスト・プラクティスに基づいています。したがって、`'テーブル名'[`と入力すると、テーブルのすべての列に対するコード補完が表示されます。しかし、`[`と入力すると、モデル内のすべてのメジャーのリストが表示されます。

「関数」と「キーワード」の両方が表示されます。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/41e5b119-9410-c5f5-54f9-c8a699ca3cc6.png)

### テーブル

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/a69ffdb7-b9db-f372-d014-3a36c26e88b4.png)

### コラム

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/c22be0c5-2c8b-5b05-0ba0-4d122e62c5d8.png)

### メジャー

![intellisense_measures-3add4643b16fdc79abf1a2fedf2d229e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/c58dc277-7918-39c1-1c0e-b6988d928e06.png)