OmniAICreator/Qiita-1.07M huggingface dataset:
【Query Builder：Expression】Try using Random function

This time, I will use the **Random** function from among the many expression functions in [Sharperlight](https://sharperlight.com/).
Use this function to randomly calculate a number within the specified range.
### Preparing a query ###
Launch the `Query Builder` from the [Sharperlight](https://sharperlight.com/) application menu.
Create a query using the SAP Business One data model.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/360b98a2-4c9f-02ed-a5f0-d79dbbaed722.png)
The query result looks like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/84cd8f7f-c140-f50b-147e-a45ad2656aff.png)
### Adding the Random function ###
Right-click in the output area and select **Add Expression**.
Enter the **Customise Description** and **Output Name** on the `General` tab.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4274688f-d6db-caf4-80f8-3f0ea97bde3a.png)
Find the **Random** function from the function list, and double-click to transfer the template to the upper editor area.
Edit the template as follows. It returns a number between 1 and 100 randomly.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/46e1274c-d2ec-2d8d-091f-e9a6fd3e66e0.png)
The output items look like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/97e64419-9bc0-7387-f9bf-2c998d188a34.png)
### Preview ###
A value within the specified range is calculated.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0d78cc11-662e-a35d-1ce4-0fdbb82f7ccf.png)

I hope this will help your work.
UiPath よく使う構文まとめ 

# はじめに

UiPathの開発業務で、使用したことが多い文字列操作の構文を自分用にまとめました。
使用頻度が少ないものも、今後の開発に役立つかもしれないので、備忘録として記載しておきます。
※使用頻度は私個人が実務で使用した頻度に基づいて設定しているので、個人差があると思います。

# 文字列操作
## Replace　使用頻度★★★
#### 文字列を任意の文字列にすべて置換する

`"田中太郎".Replace("太","次")`　→　`田中次郎`
文字列「田中太郎」の「太」を「次」に置換する
※「太」が複数ある場合はすべて置換する

`"田中太郎".Replace("三","四")`　→　`田中太郎`
置換したい文字列の中に1つも「三」が入っていないときは何も置換せず、そのままの文字列を返す

:::note
姓名間のスペースの統一（半角スペースor全角スペースorスペースなし）でよく使う
:::

## StartsWith　使用頻度★★★
#### 文字列が特定の文字列で始まるか判定する

`"おはようございます".StartsWith("おはよう")`　→　`True`
「おはようございます」は「おはよう」で始まるので、Trueを返す

:::note
if文の中に入れて使う
:::

## EndsWith　使用頻度★☆☆
#### 文字列が特定の文字列で終わるか判定する

`"おはようございます".EndsWith("ございます")`　→　`True`
「おはようございます」は「ございます」で終わるので、Trueを返す


## Contains　使用頻度★★★
#### 文字列の中に特定の文字列が含まれるか判定する

`"abcde@xxx.co.jp".Contains("@")`　→　`True`
`abcde@xxx.co.jp`は「@」を含んでいるので、Trueを返す

:::note
if文の中に入れて使う
:::

## Split　使用頻度★★★
#### 文字列を区切り文字で分割する

`"ごはん,パン,麺".Split(","c)(0)`　→　`ごはん`
「ごはん,パン,麺」を区切り文字「,」で分割した時の「0番目」の文字列を返す

Split(","c)の<font color='red'>c</font>は、<font color='red'>.ToCharArray</font>でも代用可能
※区切り文字が2種類以上だと.ToCharArrayのみ使用可

:::note
分割した文字列に対して個別に処理を行いたいときによく使う。
`"ごはん,パン,麺".Split(","c)`を配列型の変数に代入し、繰り返し(コレクションの各要素)で処理を行う。
1ループ目・・・ごはんの処理
2ループ目・・・パンの処理
3ループ目・・・麺の処理
:::

## Length　使用頻度★★☆
#### 文字列の文字数を返す

`"Qiita".Length`　→　`5`
「Qiita」が5文字なので「5」を返す

:::note
if文の中に入れてよく使う
`変数名.Length > 0`　など
:::

## IndexOf　使用頻度★★☆
#### 特定の文字列が何番目にあるか返す

`"abcde@xxx.co.jp".IndexOf("@")`　→　`5`
aが0番目として数えて、@は5番目にあるので「5」を返す

:::note
後述するSubstringと組み合わせてよく使う
:::

## Substring　使用頻度★★☆
#### 含まれる文字列を抽出する

`"おやこどん".Substring(0,3)`　→　`おやこ`
「おやこどん」の0番目(お)から3文字を取り出す
`"おやこどん".Substring(3)`　→　`どん`
「おやこどん」の3番目(ど)から最後の文字列までを取り出す

:::note
IndexOfと組み合わせてよく使う
`"abcde@xxx.co.jp".Substring(0,"abcde@xxx.co.jp".IndexOf("@"))`　
↓
`"abcde@xxx.co.jp".Substring(0,5)`
↓
`abcde`
:::

## StrConv　使用頻度★☆☆
#### 文字列の半角⇔全角を変換する

`StrConv("ｵﾊﾖｳ123",VbStrConv.Wide,1041)`　→　`オハヨウ１２３`
半角→全角に変換する

`StrConv("オハヨウ１２３",VbStrConv.Narrow,1041)`　→　`ｵﾊﾖｳ123`
全角→半角に変換する

:::note
住所の正規化などでよく使う
:::


## PadLeft PadRight　使用頻度★★☆
#### 数値や文字列を0埋めする

`"11".PadLeft(3,"0"c)`　→　`011`
3桁になるまで左側(先頭)に0を追加する

`"11".PadRight(3,"0"c)`　→　`110`
3桁になるまで右側(最後)に0を追加する

## Path.Combine　使用頻度★★★
#### フォルダ名とファイル名を結合してファイルパスを生成する

`Path.Combine("C:\フォルダ名","ファイル名.csv")`　→　`C:\フォルダ\ファイル名.csv`

:::note
フォルダ名の末尾に`\`がなくても勝手に生成してくれる
:::

## Path.GetFileName　使用頻度★★★
#### ファイルパスからファイル名を抽出する

`Path.GetFileName("C:\フォルダ\ファイル名.csv")`　→　`ファイル名.csv`

:::note
ファイル名を拡張子なしで取得する方法
<font color='red'>WithoutExtension</font>を使用
`Path.GetFileNameWithoutExtension("C:\フォルダ\ファイル名.csv")`　→　`ファイル名`
:::

# おわりに
自分が実務で使用する際に役に立てばと思いまとめた記事ですが、UiPathを始めたばかりの方や、非IT系からRPAを始めた方の参考になれば幸いです。

# 参考記事・文献
・[UiPath 文字列の半角⇔全角を変換する方法](https://blog-tips.sekenkodqx.jp/2020/02/03/uipath-string-convert-wide-narrow/)

・[津田義史.公式ガイド UiPathワークフロー開発 実践入門.秀和システム,2020](https://www.shuwasystem.co.jp/book/9784798065953.html)
[AWS Q&A 365][ECS]AWSのよくある問題の毎日5選 #82

# 1. AWS Fargateにはどのようなセキュリティ対策がありますか？
回答：AWS Fargateは、ネットワークの分離、暗号化、セキュアなアクセス制御など、複数のセキュリティレイヤーを使用して顧客データを保護しています。また、SOC、ISO、PCI DSSなどのコンプライアンス基準にも準拠しています。

# 2. AWS Fargateはどのようにデータプライバシーを保証していますか？
回答：AWS Fargateは、ネットワークの分離、暗号化、セキュアなアクセス制御を使用してデータプライバシーを提供しています。また、顧客はデータの静止時および転送時の暗号化を行うことができ、AWS Key Management Serviceとの統合もサポートしています。

# 3. AWS Fargateはセキュリティインシデントをどのように処理していますか？
回答：AWS Fargateには、自動監視、アラート、対応メカニズムを含む包括的なインシデント対応プロセスがあります。AWSはまた、顧客がセキュリティインシデントに対応するためのガイダンスとサポートを提供しています。

# 4. AWS Fargateは不正アクセスからどのように保護していますか？
回答：AWS Fargateは、IAMロールやポリシーなどのセキュアなアクセス制御を使用して、認可されているユーザーやプロセスのみが顧客データにアクセスできるようにしています。また、多要素認証をサポートし、アクセスの監視のための監査ログも提供しています。

# 5. AWS Fargate上でのデータ漏洩を防ぐための対策は何ですか？
回答：AWS Fargateは、ネットワークの分離、暗号化、セキュアなアクセス制御など、複数のセキュリティ制御を実装してデータ漏洩を防止しています。また、顧客には潜在的なセキュリティ脅威を監視および検出するためのツールが提供され、データ保護を確保するためのコンプライアンス基準もサポートされています。
[AWS Q&A 365][ECS]Daily Five Common Questions #82

# 1. What security measures are in place for AWS Fargate? 
Answer: AWS Fargate uses multiple layers of security to protect customer data, including network isolation, encryption, and secure access controls. It also meets compliance standards such as SOC, ISO, and PCI DSS. 

# 2. How does AWS Fargate ensure data privacy? 
Answer: AWS Fargate provides data privacy by using network isolation, encryption, and secure access controls. It also allows customers to encrypt data at rest and in transit, and supports integration with AWS Key Management Service for managing encryption keys. 

# 3. How does AWS Fargate handle security incidents? 
Answer: AWS Fargate has a comprehensive incident response process in place that includes automated monitoring, alerting, and response mechanisms. AWS also provides customers with guidance and support to help them respond to security incidents. 

# 4. How does AWS Fargate protect against unauthorized access? 
Answer: AWS Fargate uses secure access controls, such as IAM roles and policies, to ensure that only authorized users and processes can access customer data. It also supports multi-factor authentication and provides audit logs for monitoring access. 

# 5. What measures are in place to prevent data breaches on AWS Fargate? 
Answer: AWS Fargate implements multiple security controls to prevent data breaches, such as network isolation, encryption, and secure access controls. It also provides customers with tools for monitoring and detecting potential security threats, and supports compliance standards to ensure data protection.
Mathematica とWolframAlphaとsympyのsimplifyを調べた。

# MathematicaのSimplify

https://reference.wolfram.com/language/ref/Simplify.html.ja?source=footer

# WolframAlphaのsimplify

＞xについての仮定があるとSimplifyを使ってさらに簡約できる：
https://reference.wolfram.com/language/ref/Simplify.html.ja?source=footer

# sympyのsimplify

https://docs.sympy.org/latest/tutorials/intro-tutorial/simplification.html

#### 事例　ド・モアブルの定理
WolfMoon様より
＞**結果を見て実行するということでしょう。**
https://qiita.com/WolfMoon/items/ad6b23cc72b5b340f27c#comment-4d2f56afa3fe59ef76ef

当初,私は、結果毎にsimplifyを実行が必要な事の意味がわかりませんでした。
**無条件** で、結果にsimplifyをしてくれたらいいのにと思っていました。

ところが、以下のド・モアブルの定理で、
https://qiita.com/mrrclb48z/items/0ca9b513c007b2e297f2#:~:text=%E5%8B%89%E5%BC%B7%E4%B8%AD-,sympy,-%E3%81%A7
＞「真の7倍角の公式」
https://examist.jp/legendexam/2016yokohamasiritu/

「真の7倍角の公式」のケースの時、困るケースがあるみたいです。
勝手に簡略化のしすぎ？は、困ります。でしょうか。
以下の「ド・モアブルの定理」
f=g,#4#で**止まってほしい。** 無条件だと、simplifyの#5#は行き過ぎ。
いいですね。

(でも,simplifyの行き過ぎでも、一つ前に戻る？simplify2があっても、いいような気がしました。）

``` python
from sympy import *
θ=symbols('θ',real   =True)
k=symbols('k',integer=True)
k=7
f=expand_trig(sin(k*θ))
print("#1#",f)
print("#2#",f.simplify())
print("#3#",f.simplify().expand())
print()
g=im((cos(θ)+I*sin(θ))**k)
print("#4#",g)
print("#5#",g.simplify())
print()
print("#6#",(f-g))
print("#7#",(f-g).expand()  )
print("#8#",(f-g).simplify())
#1# -64*sin(θ)**7 + 112*sin(θ)**5 - 56*sin(θ)**3 + 7*sin(θ)
#2# (-64*sin(θ)**6 + 112*sin(θ)**4 - 56*sin(θ)**2 + 7)*sin(θ)
#3# -64*sin(θ)**7 + 112*sin(θ)**5 - 56*sin(θ)**3 + 7*sin(θ)

#4# -sin(θ)**7 + 21*sin(θ)**5*cos(θ)**2 - 35*sin(θ)**3*cos(θ)**4 + 7*sin(θ)*cos(θ)**6
#5# -57*sin(θ)**7 + 91*sin(θ)**5 - 35*sin(θ)**3 + 7*sin(θ)*cos(θ)**6

#6# -63*sin(θ)**7 - 21*sin(θ)**5*cos(θ)**2 + 112*sin(θ)**5 + 35*sin(θ)**3*cos(θ)**4 - 56*sin(θ)**3 - 7*sin(θ)*cos(θ)**6 + 7*sin(θ)
#7# -63*sin(θ)**7 - 21*sin(θ)**5*cos(θ)**2 + 112*sin(θ)**5 + 35*sin(θ)**3*cos(θ)**4 - 56*sin(θ)**3 - 7*sin(θ)*cos(θ)**6 + 7*sin(θ)
#8# 0
```
ESXiのcronがうまく動かないからVMのcronでESXiのシェルスクリプトを動かした話

# はじめに
ESXiでvmのバックアップをしていて，それをcronでスケジューリングしていましたが，なぜかうまく動かなくなってしまいました(´;ω;｀)

そのため，vmの方のcronでESXiのシェルスクリプトを動かしましたので，そのやり方について解説します．

# 環境
- ESXi8.0
- VM
    - ubuntu22.04 LTS
- Python 3.10.6

# 鍵交換
まず，vmからESXiにアクセスしてシェルスクリプトを動かしたいので鍵交換をします．
鍵はvmで
```
ssh-keygen -t rsa
```
このコマンドで作成します．

:::note warn
**ed25519**ではなく**rsa**で作ったのはed25519だとうまくsshできなかったからです．
この辺よくわからなかったので，知っている方がいれば教えていただけると幸いです．
:::

そうしたら作成した鍵の.pubの公開鍵をscpコマンドでESXiに転送します．
```
scp 公開鍵パス ユーザ名@サーバ名:保存先パス
```
~/と保存先パスに書けばホームディレクトリを指定できます．

ここでちゃんとできていればESXiのパスワードが聞かれます．
パスワードを入力したら送れるはずなので，一度ESXiでlsなどして確認してみてください．

鍵交換はauthorized_keysに鍵をコピーしないといけないのでESXiで
```
cat 公開鍵パス >> /etc/ssh/keys-root/authorized_keys
```
をしてください．

:::note warn
**/.ssh/** ではなく **/etc/ssh/keys-root/** のauthorized_keysに追記するようにしてください．
でないとvmからssh出来ないです．
:::

確認のためにcatなりでauthorized_keysの中を確認して公開鍵が追記されていれば完了です．

# ESXiのシェルスクリプトを動かす
ここでvmにESXiのシェルスクリプトを動かすシェルスクリプトを作ります．
```
ssh -i 秘密鍵パス ユーザ名@サーバ名 . シェルスクリプトパス
```
なんとこの1行だけで出来てしまいます．

試しに適当なシェルスクリプトを実行してみて，パスワード入力なしに出来ていればOKです．

# cron
vmのcronの設定をします．

```
* * * * * echo "The script ran at $(date)"  >> ログのパス
* * * * * vmのシェルスクリプトのパス >> ログのパス
```

1行目はその日付，2行目はシェルスクリプトの実行結果をログに保存しています．
左側の*マークに日時を指定するのですが，ここの時間はUTCになっているので気を付けてください．

これで実行できていればログに結果が出力されるはずなので，それが確認できていればOKです．
syslogでもcronの動作を確認できるので，そっちも確認してみるといいかもしれません．

これでvmからESXiのシェルスクリプトを動かすことができました！

# おわりに
今回はvmのcronでESXiのシェルスクリプトを動かしましたのでその解説をしました．
ESXiのcronが動かない謎が解けてないですが，とりあえずはこれでバックアップができるので一安心です．
Discord WebHookを使った通知をちゃちゃっと作る

# はじめに

Makefile内でDiscordのWebHookを使っていたのを見て、かっこよかったのでメモ

## WebHook URLの取得

Discord > テキストチャンネルの編集ボタン > 「連携サービス」 > 「ウェブフック」 から取得できます。

## curlを使って送信

curlを使えば簡単に送信できます。

`-F`オプションを使います。

```
 -F, --form <name=content>  Specify multipart MIME data
```

### 送信したいのがテキストの場合


```sh
curl -X POST -F content="Hello, world!" https://discord.com/api/webhooks/****/**** &> /dev/null
```
## 送信したいのがファイルの場合

ファイルのパスの前に@をつけないといけません。

```sh
curl -X POST -F file=@test.txt https://discord.com/api/webhooks/****/**** &> /dev/null
```
Swiftで解くAtCoder（ABC306）

# 1.はじめに
この記事では、[AtCoder（ABC306）](https://atcoder.jp/contests/abc306)のA~D問題をACしたコードの公開, 説明を行います。
Swiftを使ってコンテストに参加する方の参考になれば幸いです。

# 2.事前準備
標準入力を読み込むためのメソッドです。
コードの先頭に貼り付けて、適宜使用します。
```Swift
import Foundation

// 標準入力から整数を読み込む
func readInt() -> Int{
    return Int(readLine()!)!
}

// 標準入力から整数列を読み込む
func readInts() -> [Int]{
    return readLine()!.split(separator:  " ").map { Int(String($0))! }
}

// 標準入力から文字列を読み込む
func readString() -> String{
    return readLine()!
}

// 標準入力から文字列配列を読み込む
func readStrings() -> [String]{
    return readLine()!.split(separator:  " ").map { String($0) }
}
```

# 3.A - Echo
問題文や制約は[こちら](https://atcoder.jp/contests/abc306/tasks/abc306_a)からご確認ください。
```Swift
let N = readInt()
let S = Array(readString())

var answer = ""
for i in 0..<N {
    answer += String(S[i])
    answer += String(S[i])
}

print(answer)
```

# 4.B - Base 2
問題文や制約は[こちら](https://atcoder.jp/contests/abc306/tasks/abc306_b)からご確認ください。
```Swift
let N = 64
let A = readInts()

var sum: UInt64 = 0
var multiplier: UInt64 = 1
for i in 0..<N {
    if A[i] != 0 {
        sum += UInt64(A[i]) * multiplier
    }
    multiplier = multiplier * 2
}

print(sum)
```

# 5.C - Centers
問題文や制約は[こちら](https://atcoder.jp/contests/abc306/tasks/abc306_c)からご確認ください。
[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)によるDifficultyは159になります。

【説明】
各数字の現れた回数を管理する辞書を用意します。
数列Aを先頭から順に確認し、二回現れた数字から順に別の配列に追加し、最後に出力します。
```Swift
let N = readInt()
let A = readInts()

var numberCount = Dictionary<Int, Int>()
var answer = [Int]()
for i in 0..<3*N {
    if numberCount[A[i]] != nil {
        numberCount[A[i]] = numberCount[A[i]]! + 1
        if numberCount[A[i]] == 2 {
            answer.append(A[i])
        }
    } else {
        numberCount[A[i]] = 1
    }
}

let result = answer.map(String.init).joined(separator: " ")
print(result)
```

# 6.D - Poisonous Full-Course
問題文や制約は[こちら](https://atcoder.jp/contests/abc306/tasks/abc306_d)からご確認ください。
[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)によるDifficultyは596になります。

【説明】
動的計画法を用いてアルゴリズムを作成します。
dp[i][j]を、i番目の料理まで食べるか下げるか選択した時、
お腹を壊している（j=1）、お腹を壊していない（j=0）場合のおいしさの総和の最大値とします。
```Swift
let N = readInt()
var X = [Int]()
var Y = [Int]()
for _ in 0..<N {
    let nextLine = readInts()
    X.append(nextLine[0])
    Y.append(nextLine[1])
}

var dp = [[Int]](repeating: [Int](repeating: 0, count: 2), count: N)
dp[0][X[0]] = max(Y[0], 0)
for i in 1..<N {
    if X[i] == 1 {
        dp[i][1] = max(dp[i-1][1], dp[i-1][0] + Y[i])
        dp[i][0] = dp[i-1][0]
    } else {
        dp[i][1] = dp[i-1][1]
        dp[i][0] = max(dp[i-1][1] + Y[i], dp[i-1][0] + max(Y[i], 0))
    }
}
let answer = max(dp[N-1][1], dp[N-1][0])

print(answer)
```

# 7.さいごに
間違いや改善点等あれば、ご指摘いただけると幸いです。
何卒よろしくお願いいたします。
スタティック変数とは

## スタティック変数

クラスに関連付けられた変数
そのクラスのすべてのインスタンスによって共有される特殊な変数

インスタンス変数とは異なり、スタティック変数は、クラスレベルでのデータを表現するために使用する

:::note
スタティック変数は、クラス内に定義され、staticキーワードで修飾される
それにより、スタティック変数はクラス自体に関連付けられ、各インスタンスではなくクラス自体に属す
→クラスのすべてのインスタンスで同じ値を共有し、変更が反映される
:::

## スタティック変数の特徴

クラスレベルの変数
各インスタンスではなくクラス自体に属す
クラスのすべてのインスタンスで同じ値を共有



インスタンスが生成される前に初期化される
→プログラムが実行される間ずっと存在する


インスタンスメソッド内から参照できる
直接インスタンス変数にアクセスはできない


スタティック変数
クラス内の共有データやカウンター、定数、設定値など、インスタンス間で共通の情報を保持するために使用される

他のメンバ変数やメソッドからも参照できる
→共有のデータを追跡するために便利

Javaでのスタティック変数の宣言と使用例

```java

public class Counter {
    static int count; // スタティック変数 count

    public Counter() {
        count++;
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();

        System.out.println("Count: " + Counter.count); // クラス名を使ってスタティック変数にアクセス
    }
}
```
Counterクラス内にcountというスタティック変数を宣言
各インスタンスが生成されるたびに、コンストラクタ内でcountが増加
main()メソッド内では、Counter.countを使ってスタティック変数にアクセスし、最終的なカウントの値を表示

スタティック変数はクラス全体で共有される
→1つのインスタンスの変更が他のインスタンスにも反映される
コンストラクタとは？

コンストラクタはプログラミングでの重要な用語の一つです
最初の方にclassと呼ばれる処理の中で、どうやって処理するのかを作っておき
命令されたら処理がされます

例えば
自転車classがあったとします

自転車はママチャリやロードバイクなど色々あります。
それぞれにブレーキがついていますよね

要は自転車classでいつでもブレーキをしていいように
ブレーキの仕組みをつけておきます
(ブレーキをつけておくことをプログラミングでは"メソッド"という)

そこでブレーキのレバーを引いたら(=命令出したら)
ブレーキが利くのです

要はいつでもブレーキを利かせられるように
準備をしておくためのものであります
こういう知識があってもいい思ったこと (ハードウェア編)

# 発端

- エンジニアの仕事をする上でプログラムが書ける以外にも必要なことがあるんじゃないかなと思ったことがあったので，いくつかのポイントについて書く．
- プログラムを書くための知識ではないが，知ってないと，色々困りそうだなと思って，まとめ，インデックス的な立ち位置
- 新しいことは無いです．
- さらっとしています．
- たまたま見ていて知らない人が居たので，ということなので万人受けは考えてないです．
- 意図的に省いている情報があります．(素早く理解するため
    - クロック，メモリとか
- 改めて読んでも，基本情報の範囲な気はする

## デジタル信号

- 元々の信号(値) はアナログです
    - 値が 1, 0 みたいになっているというよりは，0.6, 0.8 みたいになり得る．
    - 閾値を使って，アナログ値 → デジタル値(0, 1) に変換している．

### Refs

- [アナログ信号 vs. デジタル信号 | 寄稿文 | MPS](https://www.monolithicpower.com/jp/analog-vs-digital-signal)

## 論理回路 / 計算機

- 0, 1 の値を入手することができると考えると，それを複数使って計算することができる．
- 例えば，論理回路を形成することができる．
    - 例，2入力，1出力 の AND 回路
- 論理回路を複数使うことで，計算を行うことができる．
    - 例，4bit入力 + 4bit入力 → 4bit出力 加算器

### Refs

- [ダイオードを使った論理回路の基礎 | CQ出版社 オンライン・サポート・サイト CQ connect](https://cc.cqpub.co.jp/system/contents/2250/)
- [基本情報でわかる 論理演算 「真理値表を書けば、半加算器と全加算器の仕組みがわかる」| 基本情報技術者試験 受験ナビ](https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/mastering_tech/digital_logic/)

## CPU 機械語 アセンブラ

- 計算機を束ねて，複数の計算をできるようにしている．
    - 処理を指定して，それを行うことができるようにしている．
- 処理を連続で実行することで，計算を行う
- 連なって記載された処理は機械語になっていて，それを CPU で実行する
    - 例，64bit 入力，レジスタなどに情報を保持することができる．
        - 1つ1つの処理(命令バイト列)の先頭部分に命令(オペコード) が入っている．

### Refs

- [x86_64 機械語入門](https://tanakamura.github.io/pllp/docs/x8664_language.html)
- [8086 命令デコーディング](https://blog.tiqwab.com/2019/01/06/8086-decoding.html)
    - Intel CPU に限っても，3 byte までは存在しそう．
    - > 2.1.2 Opcodes
A primary opcode can be 1, 2, or 3 bytes in length. An additional 3-bit opcode field is sometimes encoded in the ModR/M byte.
    - これを読むと**先頭** というのも微妙かもな．Prefix が optional と書いてある．
- [8ビットCPU Z80 (命令セット)](http://www.yamamo10.jp/yamamoto/comp/Z80/instructions/index.php)
- [ARM Instruction set (Part 3) | Azeria Labs](https://azeria-labs.com/arm-instruction-set-part-3/)
PythonからAzure Application Insightsにログを送信する（SDK使用）

船井総研デジタルのよもぎたです。

Azure Application InsightsにPythonプログラムからログを送信する方法を調べたので、共有いたします。

Application Insightsについては[こちらのドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview?tabs=net)を、使用するOpenCensus Python SDKについては[こちらのドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/opencensus-python)を参考にしました。

# 大まかな流れ
* Application Insightsを作成して接続文字列を確認します。
* OpenCensus Python SDKを導入します。
* ログを送信するプログラムを作成して実行します。
* Application Insightsで送信されたログを確認します。

:::note info
[OpenCensusパッケージは廃止が発表されています](https://opentelemetry.io/blog/2023/sunsetting-opencensus/)。Azureではサポート終了の1年前にはアナウンスがあるそうです。後継となる[OpenTelemetryパッケージは、2023年6月現在Azureではパブリックプレビュー段階です](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/opentelemetry-enable?tabs=python)。いずれOpenTelemetryに移行していく必要があります。
:::

# 具体的な流れ（作業手順）

## Application Insightsの作成

ここは割愛させていただきます。PortalでもIaCでもAzureCLIでも、お好みの方法で作成してください。Functionsなどを作成したときに一緒に作っていることもあるかと思います。

## 接続文字列の確認

Azure Portalから確認するのが一番簡単かと思います。ログ出力先のApplication Insightsを開き、左側のメニューの「概要」を選択すると、右側に接続文字列が表示されます。

![Appinsights-python-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/acdda8e0-c00f-cc6a-7603-b69b1773418f.png)

## OpenCensus Python SDKの導入

次のコマンドでSDKをインストールできます。必要に応じてvenvなどで仮想環境を作って実行してください。Functionsに組み込む場合は、requirements.txtへの追記もお忘れなく。

```
pip install opencensus-ext-azure
```

この記事作成時のopencensus-ext-azureパッケージのVersionは1.1.9でした。

```
pip list | Select-String opencensus-ext-azure

opencensus-ext-azure     1.1.9
```
opencensus-ext-azureパッケージの[PyPIのページはこちら](https://pypi.org/project/opencensus-ext-azure/)です

## PythonプログラムからApplication Insightsにログを送信する

### 概要
Pythonのloggingパッケージを使います。まず、loggerオブジェクトのインスタンスを取得します。次にそのインスタンスのaddHandler関数でAzureLogHandlerをハンドラーとして追加します。そうすることでwarning関数などでApplication Insightsにログを送信できるようになります。

### 実際のコード
たとえば、Application InsightsにWarningレベルで *Hello Application Insights.* と出力するPythonプログラムは次のようになります。

```python
import logging
from opencensus.ext.azure.log_exporter import AzureLogHandler

logger = logging.getLogger(__name__)
logger.addHandler(AzureLogHandler(connection_string="Replace with your connection string"))

logger.warning("Hello Application Insights.")
```

## 送信されたログを確認する
Potalから確認するのがお手軽です。ログの検索には、[Kusto照会言語（KQL）](https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/)を使います。

PortalでApplication Insightsを開き、左側のメニューの「監視」セクションの「ログ」を選択します。右側でクエリを実行できるようになります。

上記のプログラムで送信したログはtracesテーブルに記録されているので、次のようなKQLで確認することができます。

```
traces
| order by timestamp desc
| take 10
```

クエリを入力したら、青い「実行」ボタンをクリックします。ログの量やクエリの複雑さによっては待たされるでしょうが、この位のテストであれば、すぐに結果が返ってくるはずです。結果は、クエリの下のエリアに表示されます。

![Appinsights-python-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822136/9722b30d-2313-158f-3fde-c5035513e68e.png)

# まとめ

簡単ですが、PythonプログラムからApplication Insightsにログを送信する手順をご紹介いたしました。Pythonプログラムにログ出力を組み込んでいくはじめの一歩にはなるかと思います。

最後までお読みいただきありがとうございました。引き続きよろしくお願いいたします。
【Query Builder：Expression】Try using Val function

`Val()` is a function that converts a string to a number.
### Preparing a query ###
Launch the `Query Builder` from the [Sharperlight](https://sharperlight.com/) application menu.
Create a query using the SAP Business One data model.
The **Reference 1** field is a string type, but it is likely to have numeric values, so I will use it.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3c1a7a78-77d7-cea1-0001-c18a563ddef8.png)
The query result looks like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/80d744fd-7afa-6993-5b93-4e9886773cba.png)
### Adding the Val function ###
Right-click in the output area and select **Add Expression**.
Enter the **Customise Description** and **Output Name** on the `General` tab.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9f62cbda-4abf-4e6e-435f-d9be00a95e15.png)
Move to `Expression` tab, 
Find the **Val** function from the function list, and double-click to transfer the template to the upper editor area.
Specify the **Reference 1** field.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/64c09436-cf69-7ded-9b47-c2bc48d61500.png)
The output items look like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d4f7da70-516c-a0ac-2115-4aa6f304b751.png)
### Preview ###
You can see that it has been converted to a number.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f2aa1992-41cc-322e-0351-dd55ef06ccdd.png)

I hope this will help your work.
個人的なFlutter/Dartのおすすめ教材

# 環境構築

### [[Flutter大学](https://flutteruniv.com/)] Flutterの環境構築

https://www.youtube.com/playlist?list=PLuLRJz1UnJzE4-HlkLTG8ARbZ2TDBNHzZ

# 勉強法など

### [[@_mono](https://twitter.com/_mono)]Flutterの効率良い学び方

https://medium.com/flutter-jp/flutter-learning-c5640c5f05b9

### 日本語でFlutterに入門する勉強方法

https://kimuralog.com/?p=1456


# Widget関連

## [MIXI]Flutter23新卒研修

### スライド
https://speakerdeck.com/mixi_engineers/2023-flutter-training

### Youtube
https://www.youtube.com/watch?v=9IqUQ2TXacI

## [MIXI]Flutter22新卒研修

### スライド
https://speakerdeck.com/mixi_engineers/2022-flutter-training-fix

### Youtube
https://www.youtube.com/watch?v=oQCJZFqDwIo

### [[Flutter大学](https://flutteruniv.com/)] Flutterの超入門

https://www.youtube.com/playlist?list=PLuLRJz1UnJzHX1dDN-jnaa7gQ3Av7eEmJ

### [Flutter] Flutter Widget of the Week

 https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG

### [Flutter] Widget catalog

https://docs.flutter.dev/ui/widgets


# Firebaseなど

### [[@_umatoma](https://twitter.com/_umatoma)]Flutterで始めるアプリ開発
https://www.flutter-study.dev/




# しっかりとしたアプリを作る

## [ゆめみ]課題研修

https://github.com/yumemi-inc/flutter-training-template


## [ゆめみ]採用研修

https://github.com/yumemi-inc/flutter-engineer-codecheck





# 最後に

もし、これもあるよ！！という方がいましたら、教えていただけると幸いです！みんなでいいFlutter生活を送りましょう！！！

僕もじっくりと勉強していきます！！
【AWS】AWS Organizationsとは

# AWS Organizationsとは

複数のAWSアカウントを利用している場合に、統合管理を行うマネージド型サービスです。
利用可能なサービスをAWSアカウント単位で制限するSCP(サービスコントロールポリシー)が扱えるようになっています。


# AWS Organizationsでできること

〇複数アカウントの一元管理
AWSアカウントをグループ化してポリシーを適用し、一元的に管理します。

〇新規アカウントの作成管理
コンソール/SDK/CLIでAWSアカウントを新規作成して、作成内容をログ管理できます。

〇請求とコストの一元管理
複数AWSアカウントの請求を一括化できます。

〇アカウント間のリソース共有
AWSアカウント間やUO間でリソースの共有を行えるようになります。共有できるリソースを複数アカウント個別で作成する必要はなくなり、運用上のオーバーヘッドが削減されます。


# Organizationsの選択

支払一括代行とアカウント全体管理の2つの方式を選択できます。

## Consolidated Billing Only

支払一括代行のみを実施する場合に選択します。

ボリュームディスカウントを統合できるため、コストメリットが発生します。

ボリュームディスカウントとは
まとめ買いをすろことで1つあたりの単価を抑えること。

## All Feature

支払一括代行も含めて、企業内の複数アカウントを統制したい場合に選択します。

# アカウントの設定

AWSアカウントの中からマスターアカウントを選定します。

メンバーアカウントはマスターアカウントから招待を承認するとメンバーアカウントとして登録できます。メンバーアカウントから削除するには独立したアカウントとして請求処理など設定する必要がありましたが、コンソールから容易に削除できるようになりました。

# IAMとAWS Organizations

IAMはAWSアカウント内のユーザー管理を実施します。
Organizationsは複数のAWSアカウント自体の管理を実施します。

# IAMポリシーとSCP

IAMはAWSアカウント内のユーザーへの許可権限を付与し、SCPはAWSアカウント全体の権限付与が可能な範囲を決めます。

# SCP

SCPには、許可する範囲を指定するホワイトリスト形式と、拒否する範囲を指定するブラックリスト形式が存在します。

ホワイトリスト形式に加えて拒否設定が追加されると、明示的か拒否設定が優先されます。

# リソースのシェア

AWS Organizationsのメンバーアカウント間でリソースを共有できます。

## RAM(AWS Resource Access Manager)との連携

・異なるAWSアカウントとリソースを共有する仕組みです。
・AWS Organizationsの組織内のアカウントや組織外のアカウントとの共有も可能です。
・1つのVPC共有して、複数のアカウントのリソースを展開することができます。
・リソース間の通信が用意になります。

## リザーブドインスタンスの共有

・AWS Organizationsの機能です。
・アカウントでリザーブドインスタンスの共有がオンになっていると使えます。
・AWS Organizationsを利用した一括請求でリザーブドインスタンが共有されます。

# 参考記事

https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_introduction.html

https://www.ashisuto.co.jp/db_blog/article/aws-organizations.html
Linux ~ユーザーとグループ~

:::note info
授業でユーザーとグループのとこがわかりにくかったので自分用にメモ
:::

## ユーザー名とユーザーID
**ユーザーに割り当てられている固有のID番号：<font color="RED">ユーザーID(UID)
</font>**
- UIDを確認するにはidコマンドを使う
- ユーザー名とUIDが格納されているのは`/etc/passwd`
```: UIDの確認方法
$ id ユーザー名
```

## ユーザーの種類
#### 管理者(root)ユーザー
別名：**スーパーユーザー** , **root**
ホームディレクトリ：/root

Linuxのインストールやセッティング,アプリケーションのインストールなどのシステム全体の制御する権限を持つ

**rootユーザーの利用方法**
```: ユーザー名なし → rootユーザーに切り替え
$ su -
```

```: ユーザー名あり → 指定したユーザーに切り替え
$ su ユーザー名
```
#### 一般ユーザー
ホームディレクトリ： /home/ユーザー名

システムプログラムなどを実行するためのユーザー

```: ログインしているユーザーを確かめる
$ who
```

## ユーザー、グループの管理
**グループとは?**
ユーザーをまとめて管理するための機能
- すべてのユーザーは何らかのグループに所属しなければならない
- 複数のグループに所属できる
- ユーザーを作成すると、自動的ユーザー名と同じ名前のグループが作られる(プライマリグループ)

```: 所属グループの確認方法
$ groups ユーザー名
```
#### 1.ユーザーを作成する
```: ユーザーの作成
# useradd ユーザー名
```
| オプション | 内容 |
|:-:|:-:|
|  -g , -G |  プライマリグループ、セカンダリグループを指定 |
| -m  |  同時にホームディレクトリを作成 |
|  -D |  ユーザー作成時のデフォルト設定を表示 |

#### 2.パスワードを設定する
- 作成したユーザーには必ずパスワードを設定する必要がある
- パスワードが格納されているのは`/etc/shadow`
```: パスワードの設定
# passwd ユーザー名
```

#### 3.グループを作成する
- グループ情報が格納されているのは`/etc/group`
- ユーザーのプライマリグループは`/etc/passwd`の第4フィールドに
GID(グループID)で書かれている
```: グループを作成
# groupadd グループ名
```
#### 4.指定したユーザーを、指定したグループへ参加させる
```: ユーザーの情報を変更
# usermod -G グループ名 ユーザー名
```
#### 5.ユーザーの削除
-rを指定することで同時にホームディレクトリも削除してくれる
```
# userdel [-r] ユーザー名
```
#### 6.グループの削除
```
# groupdel グループ名
```
年金の電子申請をしよう

# e-govアプリにログイン

・手続き検索
・手続き名称から探すに
月額算定基礎届 と入力


健康保険・厚生年金保険被保険者報酬月額算定基礎届（単記用）（２０１９年５月以降手続き）

をクリック

・申請書入力へ

で入力ができる。

半角カナではなく、全角カナで入力すること。

ただし、7月1日から10日までに申請しないと弾かれるとのことなので
注意することが必要
【Elasticsearch】インデックス（Index）って何？

## 登場人物
かーくん：だいちの息子、リアルはパパと言ってくれない1歳4ヶ月の男の子。
だいち：かーくんのパパ。パパ歴1年4ヶ月、嫁とかーくんをこよなく愛してる。

## 質問はふいにやってくる…
ある日、だいちと息子のかーくんはリビングで一緒に過ごしていました。かーくんは最近Elasticsearchについて学び始め、新しい概念について質問を思いつくたびにだいちに聞いていました。

かーくん「ねえ、パパ。Elasticsearchのインデックスって何？」
だいち「インデックスね。それは、Elasticsearchでドキュメントを整理するための場所だよ。」

かーくん：「それってどういうこと？」
だいち：「うーん、例えば、図書館の本棚を想像してみて。本棚にはたくさんの本が整理されているよね。それぞれの本棚がElasticsearchの"インデックス"に相当するんだ。」

かーくん「なるほど、でも、そんなにたくさんのインデックスがあったら、探しているインデックスを見つけるのは大変じゃない？」
だいち「それがElasticsearchのすごいところなんだ。Elasticsearchは各インデックスの内容を解析して、キーワードとその位置を記録しているんだ。だから、特定のキーワードを含むインデックスをすぐに見つけ出すことができるんだよ。」

かーくん「へえ、それなら大量のデータでもすぐに検索できるんだね！」
だいち「その通り。それに、インデックスは一つ以上のシャードに分割されるから、データと処理を複数のサーバーに分散させることができるんだよ。」

かーくん「シャードって何？」
だいち「シャードは、インデックスを小さな部分に分割することで、データを複数のサーバーに分散させることができるんだ。これにより、大量のデータを効率的に処理したり、一部のサーバーが故障してもシステム全体が動き続けたりすることができるんだよ。」

かーくん「なるほど、だからElasticsearchはデータを効率的に検索できるんだね！」
だいち「その通り！さすが、かーくん。早くも理解が深まってきたね。」

かーくんはにっこりと笑い、新たに得た知識を消化するためにパソコンに向かいました。
SlackのGitHub連携設定を適切にする(個人開発向け)

前提として、すでにSlackにGitHubアプリをインストールし、任意のチャンネルにGitHubアプリを招待している状態を想定しています。

未実施の場合は、[GitHubとSlackを連携させて通知を自動化するまでの手順](https://zenn.dev/kino_puehddby/articles/d6172cb5503166)などを参考に、設定してください。

## 設定方法

### 設定をリセットする

GitHubのアプリを招待すると、設定せずともさまざまな通知をチャンネルに投げてくれます。

ただし初期状態では、イシュー、プルリクエスト、プッシュ、リリース、デプロイの5つが通知対象になっている(subscribeしている)ため、たいていは「不要に感じる通知」も多く存在します。

そのためまず**初期設定を全部無効化する**のが良いと思われます。とくに個人開発の場合はイシューやPRに関する通知は不要でしょう。

```
# 下記スラッシュコマンドを設定したいチャンネルで投稿する
# （owner/repoは、適切なものに変更する。以下同）
/github unsubscribe owner/repo issues pulls commits releases deployments
```

その後、必要に応じてsubscribeを有効化していけば、適切な頻度・内容の通知が届きます。

### mainブランチに対するpushをもとに発火するワークフローをsubscribe

小さめな個人開発の場合は、GitHub上でのさまざまな操作の通知は必要なく、「**ワークフローの成否を監視する**」ぐらいで十分な場合がほとんどではないでしょうか。

そのため、たとえば本番環境へのデプロイなど、mainブランチにpushされたときに開始されるワークフローの監視を行います。

```
/github subscribe koboriakira/packers-news
workflows:{event:"push" branch:"master"}
```
 
なお`push`を`pull request`にすれば「mainブランチに対するPRが作成されたときに発火するワークフロー」をsubscribeしたりも可能です。「自動テストの成否を確認する」ようなワークフローはこちらに該当するでしょう。

### mainブランチ(デフォルトブランチ)に対するコミットをsubscribeする

そのほか、mainブランチに入るコミットを注視したいケースもあるかと思います。

その場合は、次のスラッシュコマンドを利用します。

```
/github subscribe owner/repo commits
```

そのほか「こんなのもよく使いそう」などあれば、ぜひコメントください！

## 参照

[integrations/slack: Bring your code to the conversations you care about with the GitHub and Slack integration](https://github.com/integrations/slack)
RailsでのHTMLエスケープとhtml_safeを使用する方法

## 概要
RailsでのHTMLエスケープとhtml_safeを使用する方法を記述致します。

## HTMLエスケープとは

HTMLエスケープは、文字列内の特殊な文字（`<`、`>`、`&`、`'`、`\`など）を対応する[HTMLエンティティ](https://developer.mozilla.org/ja/docs/Glossary/Entity)に置き換えることを指します。例えば、`<`は`&lt;`、`&`は`&amp;`になります。この処理は、ユーザーが入力したデータをそのままウェブページに表示するときに重要となります。ユーザーがHTMLタグを入力した場合、そのまま表示するとウェブページの構造を壊す可能性があります。

## RailsにおけるHTMLエスケープ

Railsでは、ビューで表示するテキストはデフォルトでエスケープされます。これは、Railsのセキュリティ機能の一部で、スクリプト注入攻撃を防ぐためのものです。

例えば、以下のように`<h1>`タグを含む文字列を表示しようとすると：

```rb
<%= "<h1>Hello, World!</h1>" %>
```

実際には、以下のようにエスケープされて表示されます。

```html
&lt;h1&gt;Hello, World!&lt;/h1&gt;
```

## RailsでHTMLエスケープを回避する方法

エスケープを回避するには`html_safe`メソッドを使うことができます。これにより、HTMLタグがそのまま表示されます。

```rb
<%= "<h1>Hello, World!</h1>".html_safe %>
```

ただし、この方法は注意が必要です。ユーザーからの入力をそのまま`html_safe`メソッドでエスケープせずに表示すると、スクリプト注入攻撃につながる可能性があります。

そのため、ユーザーからの入力をエスケープせずに表示する場合は、他の対策（例えば、入力のサニタイズ）も合わせて行う必要があります。

## まとめ
HTMLエスケープとそのRailsでの利用について記述致しましたが、注意点も含めて、適切にエスケープを管理することが必要です。

## 参考
- [HTML特殊文字のエスケープ - Ruby on Rails入門](https://www.javadrive.jp/rails/template/index7.html)
- [【Rails】html_safeを使用することで発生する脆弱性とその対策 - Qiita](https://qiita.com/fumi238000/items/6f2db70fd44409c0d9a2)
SDKとは/SDKとAPIの違い

# はじめに

AWSの勉強中に疑問に思ったSDK(ソフトウェア開発キット)とAPI(アプリケーションプログラミングインターフェース)の違いを調べ、まとめました。

SDKとAPIはどちらも、開発者が一からシステムを構築せずともアプリケーションに新しい機能を機能を追加できます。

では、実際のアプリケーションを構築する際にはどちらを採用するのが最適か、考えられるようになれたらいいな。と思います。

# SDK(Software Development Kit)とは

アプリケーションを開発するために必要な、プログラムやAPI、サンプルコード、技術的な説明資料などをパッケージにしたものです。

SDKを使えば、機能を実現する技術の詳しい仕組みを理解していなくても、少ない理宇力でアプリケーションに新しい機能を実装できます。さまざまなソフトウェアベンダーが独自のSDKを提供し、自社製品とサードパーティー勢を含む他のアプリケーションを簡単に連携できるよう支援しています。

# API(Pllication Programming Interface)との関係性

SDK→アプリケーション開発キット
API→アプリケーションコードを呼び出すインターフェース

あくまでAPIはソフトウェアやプログラム、Webサービスを繋ぐもので単体では動作できません。
APIはライブラリ機能、サンプルプログラムなどとともにSDKに含まれるツールの1つです。

# SDkを使用するメリット

〇複数の機能を備えている
〇Webサイトの表示速度を維持できる
〇システム開発時間の短縮
〇開発費、人権費の削減

# SDKのデメリット

〇バグが含まれている可能性
〇導入により使いにくくなる場合がある


# APIの長所

〇効率的な開発ができる
〇ユーザーの利便性を向上できる

# APIの短所

〇仕様変更などの影響を受ける
〇活用には専門スキルが必要

# SDKとAPIの使い分け

APIはアプリケーションやソフトウェアが用意されていることが前提であり、それら自動連帯させるプラットフォームの役割を担っています。

一方、SDKにはアプリケーションやソフトウェアを構築するためのツールがパッケージ化されており、APIも含まれています。そおためアプリケーションやソフトウェアから開発する場合はSDKを使うことでコストが削減できます。

# SDKを使用する際に注意点

〇ライセンス契約や規約の内容の確認
〇バグやアップデートの対応
〇想像以上よりもコストがかかることも

# 参考記事

https://techtarget.itmedia.co.jp/tt/news/1911/07/news06.html

https://www.strategit.jp/column/sdk-api/
VSCodeでキーボードマクロを使いたい

# キーボードマクロ

キーボードマクロは同じ操作を繰り返し実行させることができる便利な機能です。
テキスト加工などの作業で使いこなすと作業効率が劇的に向上します。

## VSCodeとキーボードマクロ
VSCodeにはデフォルトでキーボードマクロ機能が存在しないため拡張機能を利用します。

## インストール

### VisualStudioマーケットプレイスから
こちらのリンクから Install をクリックしてインストールします。
https://marketplace.visualstudio.com/items?itemName=tshino.kb-macro

### VSCodeの拡張機能から
「keyboard」などのキーワードで検索して「Keyboard Macro Beta」をインストールしても良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/3859f1e2-d056-34a7-4120-7cbbf917faeb.png)



## 使い方

### 記録 (Record)

操作を記録開始・終了する際に次のショートカットキーを使います。

macOS
control+option+r

Windows
Ctrl+Alt+R

### 再生 (Playback)

記録した操作を再生する際に次のショートカットキーを使います。

macOS
control+option+p

Windows
Ctrl+Alt+P
homebrewでnodenvを更新する際の注意点(shimsの再生成)

## はじめに
homebrewで管理しているnodenvをアップデートする際に、`brew upgrade`だけだと上手くいかなかった、という話です。
バージョン固有の問題かは不明ですが、他に同じ問題に当たった人の参考になることを願って共有します。

## 結論
homebrewでnodenvをアップデートする際は、古いshimsを削除して再生成しましょう。
```PowerShell
rm -r .nodenv/shims/
nodenv rehash
```

## あらすじ
- M1 Macにて、nodenvのアップデートをおこなった（homebrewで`1.4.0`から`1.4.1`）。
- アップデート後にnpmコマンドを実行したらエラーが出た。
- 原因は、shims内で、実行可能ファイルへのファイルパスが旧バージョンのままになっていたこと。
- `.nodenv/shims`を削除して`nodenv rehash`で解決した。

### shims内のファイルパスが旧バージョンのまま
以下に示すのは、npmコマンド実行時に出たエラーメッセージの一つです。
```shell-session:エラーメッセージ
/Users/{username}/.nodenv/shims/node: line 21: /opt/homebrew/Cellar/nodenv/1.4.0/libexec/nodenv: No such file or directory
```

問題となっているファイル`.nodenv/shims/node`を確認してみると
```shell:.nodenv/shims/node
# *中略*
exec "/opt/homebrew/Cellar/nodenv/1.4.0/libexec/nodenv" exec "$program" "$@"
```
ファイルパスの途中で、旧バージョンのものであろうディレクトリ`1.4.0`を指定していました。

#### そもそもshimsとは
- shimとは、ターミナルから入力されたnode.jsのコマンドと、nodenvで設定されたnode.jsバージョンのコマンド実行ファイルを仲介するスクリプト。
- `nodenv rehash`にてshimが生成される。
- 新たなnpmパッケージをインストールした際には、rehashで該当パッケージのコマンドのshimを生成する必要がある。

`nodenv rehash`を実行する必要があるのは、新規npmパッケージをインストールした時、という認識でした。しかし、どうやらnodenv自体をアップデートした際も実行する必要がありそうです。

### shimsを再生成
単に`nodenv rehash`を実行したところ、shimsは更新されませんでした。
shims内のファイルを全て削除した後に再度実行したところ、エラーが解消されました。
```PowerShell
rm -r .nodenv/shims/
nodenv rehash
```

```shell:.nodenv/shims/node
# *中略*
exec "/opt/homebrew/Cellar/nodenv/1.4.1/libexec/nodenv" exec "$program" "$@"
```
shimsの中身を確認すると、ファイルパスも現バージョンの`1.4.1`になっていました。

## 参考文献

https://mogulla3.tech/articles/2021-07-12-understanding-rbenv-4/

https://mogulla3.tech/articles/2020-12-29-01/

:::note info
この記事はニジボックス投稿リレー企画、3日目の記事です。
次の投稿は[@sakamuuy]()さんです！
:::
Railsでよく使いそうなルーティングのやり方

## 概要
Railsでよく使いそうなルーティングのやり方について記述します。

## 基本的なルーティング

ルーティングは`config/routes.rb`ファイルで定義します。最も基本的な形式は以下の通りです。

```ruby
get 'products' => 'products#index'
```

これはHTTP GETリクエストを`products`パスに送ると、`ProductsController`の`index`アクションが呼び出されることを意味します。

別の書き方として`to:`を用いた表現もあり、次のように書くことも可能です。

```ruby
get 'products', to: 'products#index'
```

## リソースルーティング

RESTfulなリソースに対する標準的なCRUD操作を設定するための短縮形です。

```ruby
resources :products
```

この一行で、以下の7つのルーティングが自動的に生成されます。

- index: `GET /products`
- show: `GET /products/:id`
- new: `GET /products/new`
- create: `POST /products`
- edit: `GET /products/:id/edit`
- update: `PATCH/PUT /products/:id`
- destroy: `DELETE /products/:id`

## ネストしたリソース

あるリソースが他のリソースに従属する場合、リソースをネストすることができます。

```ruby
resources :products do
  resources :comments
end
```

この場合、`comments`は`products`にネストされ、コメントを一意に特定するためにはその親となるプロダクトのIDが必要になります。

## 名前付きルート

特定のルートに名前を付けることができます。これにより、ビューやコントローラ内でそのルートを簡単に参照することができます。

```ruby
get 'products/:id/purchase' => 'products#purchase', as: 'purchase'
```

この場合、`purchase_path`というヘルパーメソッドが自動的に生成され、ビュー内で使用することができます。

`to:`を用いた書き方であれば、次のようになります。

```ruby
get 'products/:id/purchase', to: 'products#purchase', as: 'purchase'
```

## ルートの制約

ルートには制約を設けることが可能です。例えば、パラメータに特定の形式を強制することができます。

```ruby
get 'products/:id' => 'products#show', id: /\d+/
```

この場合、`:id`パラメータは数値でなければならないという制約が設けられています。

以上がRuby on Railsでよく使うルーティングの基本知識になります。適切なルーティング設定により、アプリケーションの動作を効率的にコントロールすることができます。

## 参考
- [ルーティング(routes) | Railsドキュメント](https://railsdoc.com/routes)
- [Ruby on Railsの基本的なルーティング - Qiita](https://qiita.com/new1/items/f13de9194c6ef6fd8d2e)
ABAP Platform 1909, Developer Edition for DockerのHDBライセンスの更新方法

個人ディスクトップにABAPプログラムやらCDSの検証用にとABAP Platform 1909, Developer Edition for Dockerを入れているのですが、久しぶりに起動してみたところ起動しない！
ヤバい…いろんな検証プログラム等々が無駄になってしまう……と少々焦りながら調べてみました。

## 1.現状把握
とりあえず実行したターミナル画面を見てみると…
![ターミナル画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/c5410940-4ac8-3825-8fb1-b98976745306.png)
どうやらHANA DBのライセンスが切れている模様。

導入時に見ていたブログを見に行くと2022年10月13日更新でABAP Platform, Developer Edition for Dockerは提供することができなくなったと書いてある…
ブログのタイトルにも「No Longer Available」の文字が……

https://blogs.sap.com/2021/02/15/sap-abap-platform-1909-developer-edition-available-soon/

Docker Hubも一応見に行くと……
![Docker.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/26604729-75d4-ca94-ac92-2bd65ccee1c1.png)
まぁ、そうですよねw

## 2.HBDライセンス更新方法
ABAPのライセンスの更新はよく行っていたので、同じような方法で出来ないかと探しているとライセンス更新方法のブログがありました。

https://blogs.sap.com/2022/08/12/update-abap-and-hana-license-for-the-abap-platform-developer-edition-for-docker/

どうやら下記サイトからHDB SAP HANA Platform Edition (64GB)のライセンスキーをダウンロードしてHDBのライセンスを更新してあげれば起動できそう。

https://go.support.sap.com/minisap/#/minisap
### HDBライセンスの生成・ダウンロード
先ほどのサイトにアクセスしHDB SAP HANA Platform Edition (64GB)を選択して、

![HDBライセンス1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/ffc1dbda-4501-5835-457f-cc61c275dc6f.png)

必須事項を入力・チェック(※ここでは入力は省略)して「Generate」ボタンをクリックすると、
(ハードウェアキーは導入時にダウンロードした「readmeliecense」の中にABAPライセンスとHDBライセンスのテキストファイルがあるのでそこから確認できます)

![HDBライセンス2_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/6edf2e58-74ad-2bdf-6891-69430c8dd1e0.png)

テキストファイル「HDB.txt」が生成されダウンロードされます。

### HDBライセンスのインストール
ライセンスのインストールは下記サイトを参考。

https://blogs.sap.com/2021/04/22/how-to-install-a-new-license-in-your-sap-abap-platform-developer-edition/

書かれているのはABAPライセンスのインストールですがHDBライセンスのインストールも同じように行えるはずなのでダウンロードされたテキストファイルのフォルダからプロンプトを起動…なんですが環境がVMware上にあるのでまずはファイルをコピペ。

ABAPライセンスも切れているはずなのでABAPライセンスも生成・ダウンロードしてコピペしておきます。
![VMファイル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/5fee594f-fef9-b73a-d628-1fbcbe89cc4d.png)
フォルダからターミナルを開いて以下コマンドを入力して実行。
* HDBライセンス
`docker cp HDB.txt a4h:/opt/sap/HDB_license`
* ABAPライセンス
`docker cp A4H.txt a4h:/opt/sap/ASABAP_license`
(コンテナ名をa4hから変更している場合はコマンドにあるコンテナ名を変更します)

これで有効なライセンスがインストールされました。(されたはずです…)

### 起動確認
ABAPライセンスとHDBライセンスもインストールできたの起動確認……
……
…
![起動確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/7ed18370-196f-fd02-e1d6-4e7f2cb159e3.png)
無事に起動成功！！

GUIも立ち上がるか確認。
![GUI画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110632/54795f9a-dc88-06b5-d375-44cd2381ec1f.png)
こっちも大丈夫そう。よかった、検証で作ったプログラム達無駄にならなくて済んだ……

## 3.最後に
無事起動して安心はしましたがこれを3か月ごとにABAP・HDB両方やるのは……(ﾒﾝﾄﾞｸｻｲ)
何とかHDBライセンスを伸ばした形で再提供か新しいバージョンをと思いますが、ブログやブログのコメントなどを読んでるとなかなか厳しそうですね。個人的には是非復活してもらいところです。
Databricksジョブのタスク間の情報の共有

[Share information between tasks in a Databricks job \| Databricks on AWS](https://docs.databricks.com/workflows/jobs/share-task-context.html) [2023/5/15時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksジョブのタスク間で任意のパラメーターを引き渡すために*タスクバリュー*を活用することができます。Databricksユーティリティの[taskValuesサブユーティリティ](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-jobs-taskvalues)を用いることで、タスクバリューを引き渡すことができます。taskValuesサブユーティリティによって、タスクは後段のタスクで参照可能な値を出力することができるシンプルなAPIを提供し、より表現豊かなワークフローを作成することが容易となります。例えば、ジョブの実行の際に、異なるタスク間で機械学習モデルの評価に関する情報のような、メトリクスやIDをやり取りすることができます。それぞれのタスクでは複数のタスクバリューを設定、取得することができます。タスクバリューは、Pythonノートブックで設定、取得が可能です。

# タスクバリューの活用

taskValuesサブユーティリティは、2つのコマンドを提供します: 変数を設定するための`dbutils.jobs.taskValues.set()`と編集を取得するための`dbutils.jobs.taskValues.get()`です。2つのノートブックタスク: `Get_user_data`と`Analyze_user_data`があるものとし、`Get_user_data`タスクからユーザー名と年齢を`Analyze_user_data`タスクに引き渡したいものとします。以下のサンプルでは、`Get_user_data`タスクでユーザー名と年齢を設定しています。

```py
dbutils.jobs.taskValues.set(key = 'name', value = 'Some User')
dbutils.jobs.taskValues.set(key = "age", value = 30)
```

- `key`は、タスクバリューのキー名です。この名前はタスクでユニークでなくてはなりません。
- `value`は、このタスクバリューキーの値です。このコマンドは内部で値をJSONフォーマットで表現できる必要があります。値のJSON表現のサイズは48KiBを超えることができません。

以下の例では、`Analyze_user_data`タスクで値を取得しています。

```py
dbutils.jobs.taskValues.get(taskKey = "Get_user_data", key = "age", default = 42, debugValue = 0)
dbutils.jobs.taskValues.get(taskKey = "Get_user_data", key = "name", default = "Jane Doe")
```

- `taskKey`は値を設定したジョブタスクの名前です。コマンドがこのタスクを発見できなかった場合、`ValueError`が発生します。
- `key`はタスクバリューのキー名です。コマンドがこのタスクバリューのキーを見つけられなかった場合、(`default`が設定されていない限り)`ValueError`が発生します。
- `default`は`key`が見つからなった場合に返却されるオプションの値です。`default`を`None`にすることはできません。
- `debugValue`は、ジョブの外で稼働しているノートブック内からタスクバリューを取得しようとした際に返却されるオプションの値です。これは、ノートブックを手動で実行して、デフォルトの`TypeError`を発生させるのではなく、何かしらの値を取得したいデバッグのケースで有用です。`debugValue`を`None`にすることはできません。

タスク間でのコンテキストを共有するさらに複雑な例として、さまざまな個人の属性に対して、個人の収入を予測する複数の機械学習を含むアプリケーションと、3つのタスクのアウトプットに基づいてベストなモデルを特定するタスクがあるものとします。`Logistic_Regression`、`Decision_Tree`、`Random_Forest`という3つのタスクでモデルが実行され、`Best_Model`タスクがこれら3つのタスクのアウトプットに基づいてベストなモデルを特定します。
![](https://docs.databricks.com/_images/classifier-graph.png)

ベストなパフォーマンスを示すアルゴリズムを特定するために、それぞれのモデルの精度(分類器がどれだけ良好に収入を予測したのか)がタスクバリューとして引き渡されます。例えば、`Logistic_Regression`タスクに関連づけられたロジスティック回帰ノートブックには以下のコマンドが含まれます。

```py
dbutils.jobs.taskValues.set(key = "model_performance", value = result)
```

それぞれのモデルタスクは、`model_performance`キーに値を設定します。`Best_Model`タスクは、それぞれのタスクの値を読み込み、最適なモデルを特定するためにそれらの値を使用します。以下のサンプルでは、`Logistic_Regression`タスクによって設定された値を読み込みます。

```py
logistic_regression = dbutils.jobs.taskValues.get(taskKey = "Logistic_Regression", key = "model_performance")
```

# タスクバリューの参照

タスク実行後にタスクバリューを参照するには、タスクの[タスク実行履歴](https://docs.databricks.com/workflows/jobs/monitor-job-runs.html#task-history)に移動します。**Output**パネルにタスクバリューの結果が表示されます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Docker】docker-compose up でうまくコンテナが起動状態にならない時の対処法

この記事は2023年6月に作成した記事です。

# はじめに
**書いた人**
最近Dockerについて勉強を始た初心者です。

**環境**
macOS Monterey == 12.5
Docker == 23.0.5

# 問題の内容
docker-compose up を実行しても `~~ exited with code 0`と出力されて起動状態が継続されない...

# 解決方法
docker-composeファイルに以下の1文を記述することで解決できました!
~~~docker-compose.yml
    tty:true
~~~
ttyについて調べてみると、「対話的なセッションやコマンドラインの操作を許可する」といった説明がされていました。
簡単にいうと、「起動状態を維持して、コマンドラインから色々できるよ」といった感じだと思います。

私も初心者なので、間違いが含まれるかもしれませんが、その際いはコメントなどで指摘していただけると幸いです！
AWS Kinesisシャードの情報が少ないので調べてみた

# シャードとは
ストリーム内の一意に識別されたデータレコードのシーケンス
ストリームは複数のシャードで構成され、各シャードが容量の1単位になる。
各シャードは、読み取りに対して最大5つのトランザクションをサポートできる。
最大総データ読み取りレート：２MB/秒
書き込みの場合：最大1000レコード/秒、最大1MB/秒(パーティションキーを含む)のデータ書き込みレートです。
ストリームのデータ容量は、ストリームに指定したシャードの数によって決まる。
ストリームの総容量はシャードの容量の合計。

# リシャーティング
シャードを操作することをリシャーディングと呼ぶ。
リシャーディングは2つの操作があります。
シャードの分割と結合です。

# シャードの分割と結合

・シャードの分割では、1 つのシャードを 2 つシャードに分けます。分割によりストリーム内のシャードの数が増えるため、ストリームのデータ容量は増えます。		
一方で、Amazon Kinesis Data Streamsはシャード単位で請求されるため、分割によりストリームのコストが増えます。
リシャーディングは、1 回のオペレーションでシャードに分割できる数と 1 回のオペレーションで結合できるシャードの数が 2 個以下に限られるという意味で、常にペアワイズです。リシャーディングオペレーションの対象となるシャードまたはシャードペアは、親シャードと呼ばれます。リシャーディングオペレーションを実行した結果のシャードまたはシャードペアは、子シャードと呼ばれます。

・シャードの結合では、2 つシャードを 1 つのシャードに組み合わせます。結合によりストリーム内のシャードの数が減るため、ストリームのデータ容量 とコストは減ります。		

簡単に言うとこういう事になります。
分割:データ容量↑	コスト↑
結合:データ容量↓	コスト↓


# シャードの種類
シャードは2種類ありホットシャードとコールドシャードがあります。
ホットシャードは予測以上のシャードのことです。
コールドシャードは予測以内のシャードことです。

パフォーマンスが落ちている場合はホットシャードを強化するため分割しましょう。

以上です。
半開区間の魅力 〜プログラミングでのスマートな区間の扱い方〜

# はじめに
こんにちは、kenです。
今回は「プログラミングで区間を扱いたいときは半開区間が良いよ」という話をします。
もしかしたら有名な事実かもしれませんが、友達にこの話をしたら知らなかったという顔をされたので、自分の理解を深めるためにも記事にすることにしました。

:::note warn
数学で区間を扱う際は実数上で考えることが多いかと思いますが、この記事では区間を考える際、整数全体の集合上での区間を考えることにします。
また以下では`left`（または`l`）と`right`（または`r`）という文字式を使って説明しますが、このとき`left` $ \leq $ `right`という関係性は常に満たされているものとします。
:::


# 半開区間とは？
半開区間の前に、開区間と閉区間についておさらいしておきます。
開区間は`(left,right)`のように表され、両端点を**含まない**`left`から`right`までの区間を表します。
一方で閉区間は`[left,right]`のように表され、両端点を**含む**`left`から`right`までの区間を表します。
例えば開区間`(1,5)`は1と5を**含まない**1から5までの区間を指すので、2,3,4がこの区間の表す集合となります。
逆に閉区間`[1,5]`は1と5を**含む**1から5までの区間を指すので、1,2,3,4,5がこの区間の表す集合となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/6bfd01dc-9ee1-02f3-ef94-f2439a8f3eec.png)


そして、今回紹介したい半開区間はこの２つを組み合わせたような区間です。
半開区間は一般的に`[left, right)`のような形で表され、`left`から`right`までの区間を表しますが、端点は`left`を**含み**`right`は**含みません**。
さっきの例でいくと、`[1,5)`は1を含み5を含まない1から5までの区間を指すので、1,2,3,4がこの区間の表す集合となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/16f15ba5-78cb-243e-9741-107d8cfe2804.png)


半開区間という概念を初めて聞いたという方もいらっしゃるかもしれませんが、きっと今までに触れてきたことがあるはずです。
例えばPythonでfor文を書くときなどに使用される`range`関数は半開区間を使っています。
次のコードの`range(1,5)`は先程の記号を用いて表すと`[1,5)`、つまり1,2,3,4を表しています。
```python
for i in range(1,5):
    print("i=%d" % i)
# i=1
# i=2
# i=3
# i=4
```
# 半開区間のメリット
一見、中途半端にも思える半開区間ですが、開区間、閉区間よりも良い性質を持っています。

## 空の区間が表現できる
`[a,a)`という区間は`a`以上`a`未満の区間を表すので、この区間の中には要素が存在しません。つまり空の区間です。
空の区間の表現は閉区間でやろうとするとうまくいきません。
一応`left` $ \leq $ `right`という関係性を無視して`[a,a-1]`というように書けば空の区間にはなりますが、左右の大小関係が逆転しているのは気持ちが悪いです。

## 区間内の個数を数えやすい
半開区間の場合`[left,right)`に含まれる要素の数は、`right-left`で求めることができます。
開区間`(left,right)`の場合だと`right - left - 1`、閉区間`[left,right]`の場合だと`right - left + 1`となるので、余計な$\pm$1がついてしまいややこしいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/c185ee1e-88ff-4210-ac2c-298c6d4c979a.png)
## 分割がしやすい
半開区間`[left, right)`を`mid`を境目として2つの区間に分割する場合は`[left,mid)`と`[mid,right)`というように書けます。
しかし開区間`(left,right)`でこの分割をしようとすると`(left,mid)`と`(mid-1,right)`となってしまい分割されてる感が伝わりにくいですね。
閉区間`[left,right]`でも`[left,mid-1]`と`[mid,right]`となってしまい、やはり余計な$\pm$1がついてしまいます。
## 区間同士の隣接がわかりやすい
2つの区間があったとき、その端と端を繋げて1つの区間にできるかということを考えてみます。
例えば区間Aが1,2を、区間Bが3,4,5を表している場合、この区間Aと区間Bをつなげると1,2,3,4,5とひとまとまりの区間になるので区間Aと区間Bはいわば隣接しているといえます。
半開区間だと`[left,mid1)`と`[mid2,right)`が隣接しているかどうかは`mid1 = mid2`で判定できます。
一方で開区間`(left,mid1)`と`(mid2,right)`が隣接しているかどうかは`mid1 + 1 = mid2`となり、またもや余計な+1が入ってきます。
# まとめ
確かに半開区間には開区間や閉区間より良い性質があることがわかりました。
絶対的に区間は半開区間で表したほうが良いということではありませんが、このような良い性質があるということは頭の片隅においておいたほうが良いかもしれません。

間違いなどありましたらコメントにてご指摘ください、ここまで読んでいただきありがとうございました。

# 参考
[Always use \[closed, open) intervals](https://fhur.me/posts/always-use-closed-open-intervals)
「docker-compose」が長いのでaliasを作成した

# はじめに
dockerを使っていて「docker ~~」「docker-compose ~~」と打つのは面倒なのでaliasを作成してコンパクトにしたいなと思いました。

本記事の対象者はlinux初心者やプログラミング初心者、aliasについて知らない人を対象としております。修正点や改善点などがございましたコメントお願いします！

## aliasとは
alias(エイリアス)は、シェルコマンドのショートカットを作成するための機能です。長いコマンドや頻繁に使用するコマンドに対して、短い名前を割り当てることができます。これにより、コマンドの入力が簡単になり、タイプミスを減らすことができます。

エイリアスは、シェルセッションが終了すると消えてしまいます。つまり、ターミナルを閉じて再度開くと、そのセッションで設定したエイリアスは利用できなくなります。

エイリアスを永続的に設定するには、シェルの設定ファイルにエイリアスの定義を追加します。bashを使用している場合は.bashrc、zshを使用している場合は.zshrcという設定ファイルにエイリアスを追加します。

## 手順

### 1.現在のユーザーのデフォルトのシェル確認

```
echo $SHELL
```
このコマンドは、`$SHELL` 環境変数の値を表示します。`$SHELL` 環境変数は、現在のユーザーのデフォルトのシェルを指定します。


出力結果が /bin/bash ならば、現在のシェルは Bash です。/bin/zsh ならば、現在のシェルは Zsh です。macOS Catalina (10.15) 以降では、デフォルトのシェルが Bash から Zsh に変更されています。

### 2. .zshrcファイルを開く
```bash:zshの場合
$ open -e ~/.zshrc
```
次に自分が設定したいaliasを作成します。
```bash: .zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
alias dc='docker-compose'
alias dcb='docker-compose build'
alias dcr='docker-compose run --rm'
alias dcu='docker-compose up -d'
alias dcd='docker-compose down'
alias dce='docker-compose exec'
alias dcl='docker-compose logs'
alias dps='docker ps'
alias di='docker images'
alias dr='docker rm'
alias dri='docker rmi'

```
今回はよく使うコマンドのaliasを作成しました。
### 2. .zshrcファイルを開かずコマンドで入力

上記では.zshrcファイルを開き自分で追記しましたが、コマンドで追記する方法もあります。
```zsh :
echo "alias dc='docker-compose'" >> ~/.zshrc  
```

### 3. 変更を反映
設定を反映させるためには、設定ファイルを再読み込みするか、新たにシェルを起動します。設定ファイルを再読み込みするには、以下のコマンドを実行します：
```bash :zshの場合
$ source ~/.zshrc 
```
正常に再読み込みが行われれば、aliasで定義したショートカットコマンドが使えるようになっています。

## まとめ
今回はdockerに関するaliasを作成しました。aliasはdockerに限らず様々なコマンドのショートカットに使えるので、使いこなすことで開発効率を上げることができます。
オープンソースのサーバーレスフレームワーク"Skeet"で作成したデモAIチャットアプリがローンチ

![SkeetDemoPublished.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/9ec87760-27e0-4aab-20db-5cdc2564bd7f.png)

ELSOUL LABO B.V. (エルソウルラボ, 本社: オランダ・アムステルダム)は 19 日、Firebase 上にゼロメンテナンスのサーバーレスアプリを構築するオープンソースライブラリである"Skeet"で作成したデモ AI チャットアプリのローンチを発表しました。

このデモを利用することでプランナーや開発者は予め、"Skeet"を使ってどんなアプリを作ることができるか想像しやすくなります。

Skeet デモ AI チャットアプリ: https://skeeter.app/

## どんなアプリがつくれるの？デモ AI チャットアプリを使って想像してみましょう

![SkeeterAppSample16-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/68df24e5-616a-feec-44d3-f2b9bf5092b4.png)


Skeet は Firebase 上に自動スケールするアプリを構築できるフルスタックサーバーレスフレームワークです。

今までアプリのリリースやサービス公開には、アプリケーションコードとサーバーの用意が必要で、特にサーバーの構築・管理には大きなコストがかかっていました。

Google Cloud、Firebase の提供するサーバーレス環境はこのサーバー構築・管理を不要にします。すべてのサーバーインフラはユーザーの使用に合わせて自動でスケーリングするため、詳細なアクセス予想や負荷対策のリソース管理はもう必要ありません。

Skeet は iOS・Android・Web アプリの開発のために、これらのサーバーレス製品をワンコマンドで構築・管理できます。そのため、Skeet 開発者はすぐにアプリケーションのロジックに取り掛かることが可能です。そして、書いたアプリのデプロイは保証されています。

Skeet を使えば、ChatGPT API を活用したアプリケーションもすぐに構築しリリースすることが可能です。

Skeet チュートリアルを完了させた状態のアプリをデモとして公開しています。

Skeet デモ AI チャットアプリ: https://skeeter.app/

このデモの様に、一般的にアプリケーションが行う認証やデータベースの利用等、アプリの開発及び公開に必要なものはすべて揃っています。

バックエンド、フロントエンド共に TypeScript を利用していますが、必要に応じて Python 等もバックエンドとして関数毎に利用できるため、機械学習が必要になった場合にも対応できます。

Skeet を活用してたくさんの役に立つアプリが生まれることを信じて、これからも開発・改善を続けてまいります。

## 新しいアプリ開発を体感してください

![EffortlessServerlessSkeet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/eb7c7918-7bcc-c816-f3fd-1aee26d47c8a.png)


新しいアプリ開発を体感してください。

すぐに iOS・Android・Web アプリを開発し公開できます。

Skeet チュートリアルでは、実際にこのデモのような AI チャットアプリを構築し、すぐにリリースすることができます。

ぜひお試しいただけますと幸いです。

Skeet チュートリアル: https://skeet.dev/ja/doc/backend/quickstart/
オフライン環境でのAppstream2.0・WorkSpacesの利用

# はじめに
下記要件でAWS上に踏み台環境を構築できないか検討した場面があり、その備忘になります。

＜要件＞
・踏み台サーバをサーバレス(EC2を使わず)に実装したい
・ミドルウェアを使用したい
・クライアント端末はインターネット接続不可

# 結論
Appstream2.0とWorkspacesの使用を検討しました。
結果、クライアント端末がインターネット接続不可の場合は、どちらも使用できませんでした。
(AWSサポートに問合せし、使用できない旨、返信がありました。)
ログインする際に、認証情報をAWSマネジメントVPCから取得する必要がありますが、
エンドポイント等には対応しておらず、インターネット経由での接続のみになる為です。