OmniAICreator/Qiita-1.07M huggingface dataset:
Julia: PostgreSQL のデータを読む (Read)

```julia:postgre_read.jl
#! /usr/bin/julia
#
#	postgre_read.jl
#
#						Dec/28/2021
# --------------------------------------------------------------------
using LibPQ
using DotEnv
# --------------------------------------------------------------------
println("*** 開始 ***")
cfg=DotEnv.config()
user=cfg["user"]
password=cfg["password"]
data_base=cfg["data_base"]

str_connect = "dbname= " * data_base * " host=127.0.0.1 user=scott password=tiger123 port=5432"
conn = LibPQ.Connection(str_connect)
command = "select * from cities"
results = execute(conn, command)
for row in results
	print(row[1],'\t',row[2],'\t')
	println(row[3],'\t',row[4])
end
#
close(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## 確認したバージョン

```text
$ julia --version
julia version 1.10.2
```
Julia: PostgreSQL のデータを作成 (Create)

text_manipulate.jl はこちら
[Julia: text ファイルの crud](https://qiita.com/ekzemplaro/items/5c7f674ee034a33e2553)

```julia:postgre_create.jl
#! /usr/bin/julia
#
#	postgre_create.jl
#
#						Dec/28/2021
# --------------------------------------------------------------------
using LibPQ
using DotEnv

include("text_manipulate.jl")
# --------------------------------------------------------------------
function data_prepare_proc()
	dict_aa = Dict()
#
	dict_aa = dict_append_proc(dict_aa,"t3461","広島",32561,"2013-4-30")
	dict_aa = dict_append_proc(dict_aa,"t3462","福山",81295,"2013-8-10")
	dict_aa = dict_append_proc(dict_aa,"t3463","東広島",28674,"2013-3-14")
	dict_aa = dict_append_proc(dict_aa,"t3464","呉",73612,"2013-2-9")
	dict_aa = dict_append_proc(dict_aa,"t3465","尾道",52391,"2013-8-4")
	dict_aa = dict_append_proc(dict_aa,"t3466","竹原",95187,"2013-1-21")
	dict_aa = dict_append_proc(dict_aa,"t3467","三次",31246,"2013-7-23")
	dict_aa = dict_append_proc(dict_aa,"t3468","大竹",85791,"2013-11-26")
	dict_aa = dict_append_proc(dict_aa,"t3469","府中",24139,"2013-10-15")
#
	return	dict_aa
end
# --------------------------------------------------------------------
function create_table_proc(conn)
	sql_str = "drop table cities"
	println(sql_str)
	aa = execute(conn,sql_str)
	println(aa)
#
	sql_str = "create table cities (id varchar(10) primary key, name text, population int, date_mod date)"
	println(sql_str)
	aa = execute(conn,sql_str)
	println(aa)
#
end
# --------------------------------------------------------------------
function insert_proc(conn,dict_aa)
	for key in sort(collect(keys(dict_aa)))
		print(key, '\t', dict_aa[key]["name"])
		print('\t', dict_aa[key]["population"])
		println('\t', dict_aa[key]["date_mod"])
		ft_aa = "insert into cities (id,name,population,date_mod) values ("
		ft_bb = "'" * key * "','" * dict_aa[key]["name"] * "',"
		ft_cc = "'" * string(dict_aa[key]["population"]) * "',"
		ft_dd = "'" * dict_aa[key]["date_mod"] * "')"
		sql_str = ft_aa * ft_bb * ft_cc * ft_dd
		println(sql_str)
		aa = execute(conn,sql_str)
		println(aa)
	end
#
end
# --------------------------------------------------------------------
println("*** 開始 ***")
cfg=DotEnv.config()
user=cfg["user"]
password=cfg["password"]
data_base=cfg["data_base"]

dict_aa = data_prepare_proc()

str_connect = "dbname= " * data_base * " host=127.0.0.1 user=scott password=tiger123 port=5432"
conn = LibPQ.Connection(str_connect)
create_table_proc(conn)
insert_proc(conn,dict_aa)

#
close(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## 確認したバージョン

```text
$ julia --version
julia version 1.10.2
```
djangoでwebサービス開発 1

# はじめに
本記事は、Djangoによるwebアプリを開発したときのメモです。

## Djangoにした経緯
まず、「CtoCのwebアプリ」を開発したいと思い、言語・フレームワークの以下の観点で選定を行った。
 
   - 人気がある
   - 将来性がある
   - 簡単

最終的にRubyとPythonに絞られたが、Pythonは機械学習にも強く、「Ruby on Rails」よりも「Django」の方がわかりやすそうということで、Djangoで開発することに決定した。

## Djangoについて
Djangoは、ドキュメントがしっかりしていて、以下のリンクのチュートリアルをやることで一通りのことを学ぶことができる。
[Djangoドキュメント](https://docs.djangoproject.com/ja/3.0/)


## 環境
```
$ python --version
Python 3.7.0
```
## 今回の流れ
webサービスを作成している中で、つまずいたとこを何回かに分けて記載する。
今回は、djangoのインストールから簡単な画面表示まで。

1. Djangoのインストール
2. プロジェクトの作成
3. データベースの作成
4. 開発サーバの起動
3. アプリケーションの作成
4. view,urlの作成
5. 画面表示

## 1. Djangoのインストール
以下のコマンドでdjangoをインストールする。

```
$ pip install django
```

2019/12にdjangoは3.0をリリース。今回は、バージョン指定せずに最新版を使用。

```
$ pip show django
Name: Django
Version: 3.0.7
```

## 2. プロジェクトの作成
startproject [プロジェクト名] でプロジェクトを作成する。今回は、mysiteをプロジェクト名とした。

```
$ django-admin startproject mysite
```

プロジェクトを作成すると以下ファイルが作成される。

```
mysite/mysite/asgi.py
             /__init__.py
             /settings.py
             /urls.py
             /wsgi.py
      /manage.py 
```

## 3. データベースの作成
データベースは、プロジェクトを作成したときに作成される「settings.py」で設定する。

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

デフォルトでsqlite3が指定されているが、mysql/oracle/postgresqlにも対応している。
ここの設定を変えるだけで、使用するDBを変えることができる。
今回はデフォルトの「sqlite3」とする。

テーブルの作成は、プロジェクトディレクトリ(mysite)に移動して、migrateコマンドを実行する

```
$ python manage.py migrate
```

:point_right:後ほど記載するが、djangoは、modelを作成し、以下のコマンドを実行するだけでDBにテーブルが作成される。
　- python manage.py makemigrations
　- python manage.py migrate

## 4. 開発サーバの起動
ここで、djangoの起動確認ができる。
djangoには、開発用サーバを起動するコマンドがあり、そのコマンドを実行することでwebサーバを用意せずに試験することができる。

```
$ python manage.py runserver
```
ブラウザで「http://127.0.0.1:8000/ 」にアクセスし、以下の画面が表示されれば成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662753/8c872eb9-aee6-1535-9491-58cfb9a235b3.png)


## 5. アプリケーションの作成
プロジェクトにアプリケーション（機能）を作成する。今回は、pollsという名前で作成。

```
$ python manage.py startapp polls
```

アプリケーションを作成すると以下ファイルが作成される。

```
mysite/polls/__init__.py
             admin.py
             apps.py
             migrations/__init__.py
             models.py
             tests.py
             views.py
```

## 6. view,urlの作成
まずは、簡単な画面表示をするため、viewとurlを編集する。
djangoのチュートリアルと同じです。


```python:polls/view.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

```python:polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

```python:mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```

これで、polls/を表示すると、polls/view.pyのindexが呼ばれ、その内容が画面に表示されるようになる。

## 7. 画面表示
再度、開発用サーバを起動。

```
$ python manage.py runserver
```
ブラウザで「http://localhost:8000/polls/ 」にアクセスして、以下が表示すれば成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662753/f441ff69-96fb-bdec-6765-4060a74902ff.png)

## おわり
次回はmodelの作成とbootstrapの導入です。
UriからByteArrayに変換したい

#やりたいこと
サーバーに渡せるようにUriからbyteArrayに変換してMultiPartBodyにする前準備をしておきたい

###コード
```decoder.kt
val imageStream: InputStream? = context.contentResolver.openInputStream(imageUri)
val bitmap = BitmapFactory.decodeStream(imageStream)
val byteArrayOutputStream = ByteArrayOutputStream()
val compressFormat = when (mimeType) {
     MediaType.Jpeg -> {
          Bitmap.CompressFormat.JPEG
     }
     MediaType.Png -> {
          Bitmap.CompressFormat.PNG
     }
     else -> {
          throw IllegalStateException("media type not found")
     }
}
bitmap.compress(compressFormat, 100, byteArrayOutputStream)
byteArrayOutputStream.toByteArray()
```
`MediaType`は個別で用意している`enum class`になっており、`MediaType`によりBitmap作成時のFormatが変わります
予期しない`MediaType`が帰ってきた場合、`IllegalStateException`が帰ってくるようにしています
`bitmap.compress()`の引数は(`Bitmap.CompressFormat`,`Int`, `OutputStream`)
となっており`フォーマット方法`、`クオリティ`、`ByteArrayOutputStream`が実体となっています
rails6.1から追加された`compact_blank`について

# 概要

例えば、Arrayにnilが入りうる可能性がある場合にnilを取り除きたいケースがあった場合に最小の行動で表すと`reject(&:blank?)`を使っていたがその処理のショートハンドができました。

```ruby
> [1, 2, nil, 3, "", []].compact_blank
=> [1, 2, 3]

> [1, 2, nil, 3, "", []].compact_blank
=> [1, 2, 3]
```

# 追加されたPR
https://github.com/rails/rails/pull/36412
論理演算（演算子）の覚え書き

# 前書き
論理演算の結果と変換方法を覚えておくのは基本ですが、ど忘れしてしまうこともあると思われるので書き残しておきます。

# 論理演算の種類とその処理
```
true  () true
true  () false
false () true
false () false
```
上記の()の中に演算子を入れた結果を下に記します。

## AND
記号は`&&`。論理積という。

```
true
false 
false 
false
```

## OR
記号は`||`。論理和という。

```
true
true 
true 
false
```
## NOT
記号は`!=`または`!(変数)`。否定という。

```
false
false 
true 
true
```
## XOR
記号は`^`。排他的論理和という。

```
false
true 
true 
false
```

# 変換方法
ド・モルガンの法則という。
論理和と論理積を入れ替えます。今回は`A`と`B`の論理計算を行っているとみなして書きます。

```
!(A && B) = !A || !B
!(A || B) = !A && !B
```

# 後書き
今回はNOR・NANDを省いて書きましたがORとANDを否定したものなので必要ないかなと思いました。
flutter　actioncable



```dart:sample.dart

  @override
  void initState() {
    super.initState();

    conectarCanal(_action_cable_url);
    subscribeChanel();
    
  }

  // WebSocket通信
  void conectarCanal(String url) async {
    actionCable = ActionCable.Connect(url,
    onConnected: () {
      setState(() { isConnected = true; });
    },
    onConnectionLost: () {
      setState(() { isConnected = false; isSended = false; });
    },
    onCannotConnect: () {
      actionCable.disconnect();
      setState(() { isConnected = false; isSended = false; });
    });
  }

  void subscribeChanel() async {
    var headers = await getTokens();
    int customer_id = int.parse(headers['id']);

    print("ActionCableに接続します.........");
    actionCable.subscribe(
      "Appointment",channelParams: {"id": customer_id}, 
      onSubscribed: () {
        print("ActionCableに登録が成功しました");
        setState(() { isSubscribed = true; });
      },
      onDisconnected: () {
        print("ActionCableに失敗してしまいました");
        setState(() { isSubscribed = false; isSended = false; });
      },
      onMessage: (Map message) {
        print("メッセージを受け取りました");
        initialize();
        // setState(() {});
      }
    );
  }
  // ここまで

```
負荷対策 ~ debounce ~

## 経緯
とある案件で、位置情報を取得するケースがあり、位置情報が取得できた回数分React Hooksの副作用が動いてしまい、エラーが起きることがあった。そこで間引きを使って最後に取得した位置情報だけを利用したらうまく行ったので、同じようなことで困っている方の力になれたらと思いここに残そうと思いました。

もし、至らないところがあれば、ご指摘いただけたらと思います。

## 割と一般的な方法
```js
const debounce = ((callback, interval) => {
  let timerId

  return (callback, interval) => {
    if (timerId) {
      clearTimeout(timerId)
    }

    timerId = setTimeout(() => {
      console.log('debounce：' + interval)
      callback()
    }, interval)
  }
})()
```


使い方

```js
const CallBackGeo = () => {
  setGeoLocationState({
    latitude: latitude,
    longitude: longitude,
    accuracy: accuracy,
  })
}

debounce(CallBackGeo, 1000)
```

## Custom Hooks

```js
import { useState, useCallback, useRef } from 'react'

const useDebounceCallback = (callback, delay = 300) => {
  const [val, setVal] = useState()
  const decounceTimer = useRef(null)

  const dispatch = useCallback(
    (_val) => {
      clearTimeout(decounceTimer.current)

      decounceTimer.current = setTimeout(() => {
        setVal(callback(_val))
      }, delay)
    },
    [callback, delay, decounceTimer]
  )

  return [val, dispatch]
}

export default useDebounceCallback

```

使い方

```js
  const double = useCallback((val) => {
    return val * 2
  }, [])

  const [DebounceDoubleValue, setDebounceDoubleValue] = useDebounceCallback(
    double,
    1000
  )

  const onStartGetPositionHandler = () => {
    setDebounceDoubleValue()
  }

```
nvmを使って、Node.jsをインストールする

# nvmをインストールする
GitHubのnvmのサイトのインストール手順に従い、以下のコマンドを実行します。

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
```

詳細は以下のサイトを参照してください。
https://github.com/nvm-sh/nvm

# Node.jsをインストールする
以下のコマンドを実行します。
(Node.jsのバージョンの12の最新版をインストールしています。)

```
nvm install 12
```

# インストール結果を確認する
以下のコマンドを実行します。

```
node -v
npm -v
```
VScodeからSSH経由でDocker Containerにアクセスしてみた

# はじめに
何番煎じかも分からないが，VScodeのRemote containerを使ってみたのでメモ．
※VScodeで`Remote-SSH`を使えている人向けに書きます．

# できること
- `ローカルPC` -> `SSH` -> `サーバ` -> `Docker Container` のように，リモートのDocker Containerへの接続
- リモートのcontainer内のファイルをVScodeで直接開ける
- Dockerの基本操作がGUIからできる（多分）

# 環境
- 【ローカル】: VScodeに`Remote-SSH`がインストール済み
- VScode -> Remote間でSSHの公開鍵は設定済み
    - つまり，パスワードなしでSSH接続できる状態で，
    - VScodeの`Remote-SSH`でサーバに接続してファイルの編集ができる

# 手順
1. VScodeの「拡張機能」タブから，`Remote-Containers`をインストールする
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/cdf6313f-2d3d-85e6-93e0-a992522d7bea.png)

1. `Ctrl+Shift+p` -> `connect to host` でSSH経由でリモートに入る
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/41a0520b-4eed-b9f0-fd2a-b1384c4d083b.png)
1. `Ctrl+Shift+p` -> `attach to running container` でContainerに入る
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/ad709a79-7b2d-5d78-b76d-0915a254455c.png)

# まとめ
リモート上のDockerに直接接続できるのはうれしすぎる．
いよいよ全部VScodeで開発が完結できそうな気がしてきた．
Databricks SQLのコンセプト

[Databricks SQL concepts \| Databricks on AWS](https://docs.databricks.com/sql/get-started/concepts.html) [2022/6/23時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

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

本書では、Databricks SQLを効果的に使用するために理解する必要がある基本的なコンセプトを説明します。

# インタフェース

このセクションでは、Databricks SQLのアセットにアクセスするためのインタフェースであるUIとAPIを説明します。

**UI:** ダッシュボード、クエリー、SQLエンドポイント、クエリー履歴、アラートに対するグラフィカルインタフェースです。
![](https://docs.databricks.com/_images/landing-dbsql.png)

[REST API](https://docs.databricks.com/sql/get-started/concepts.html) Databricks SQLオブジェクトに対するタスクを自動化することができるインタフェースです。

# データ管理

[ビジュアライゼーション](https://docs.databricks.com/sql/user/visualizations/index.html): クエリー実行結果のグラフィカルなプレゼンテーションです。

[ダッシュボード](https://qiita.com/taka_yayoi/items/834bef9aa784e1a045d8): クエリーのビジュアライゼーションとコメントのプレゼンテーションです。

[アラート](https://docs.databricks.com/sql/user/alerts/index.html): クエリーから返却されたフィールドが閾値を超えた際の通知です。

# 計算リソース管理

このセクションでは、Databricks SQLにおけるSQLクエリーを実行するために理解すべきコンセプトを説明します。

[クエリー](https://docs.databricks.com/sql/user/queries/index.html): 適正なSQL文です。

[SQLウェアハウス](https://qiita.com/taka_yayoi/items/23d7789198c2dcd66381): SQLクエリーを実行する計算リソースです。

[クエリー履歴](https://docs.databricks.com/sql/admin/query-history.html): 実行済みクエリーとパフォーマンスに関する情報の一覧です。

# 認証、承認

このセクションでは、Databricks SQLのユーザーとグループがアセットへのアクセスを管理するために理解すべきコンセプトを説明します。

[ユーザーとグループ](https://docs.databricks.com/sql/admin/users-groups.html): ユーザーはシステムへのアクセス権を有するユニークな個人です。グループはユーザーのコレクションです。

[パーソナルアクセストークン](https://docs.databricks.com/sql/user/security/personal-access-tokens.html): [Databricks integrations guide](https://docs.databricks.com/integrations/index.html)にあるツールやREST APIがSQLエンドポイントにアクセスする際に認証に用いられる文字列となります。

[アクセスコントロールリスト](https://docs.databricks.com/sql/user/security/access-control/index.html): オブジェクトへのアクセスに必要となるプリンシパルにアタッチされるアクセス権のセットとなります。ACLのエントリーでは、オブジェクトとオブジェクトに許可されるアクションを定義します。ACLのそれぞれのエントリーではプリンシパル、アクションのタイプ、オブジェクトを指定します。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
MySQLのdumpをレストアする際に "ERROR 1050 (42S01) at line 1596: Table 'user' already exists"  と出てきてしまうときの対処法

#背景
10.6.5-MariaDB にて、データベースの移動を`--all-databases`で行っていた時に出たエラーの対処方法

```
mysqldump -u root -p --all-databases > all-databases.sql

mysql -u root -p < all-databases.sql
```

以下のエラーが発生
`ERROR 1050 (42S01) at line 1596: Table 'user' already exists`

#原因
これは`mysql.user`テーブルがMariaDB 10.4でビューに変更されたことと関係があるようで
[MDEV-22127](https://jira.mariadb.org/browse/MDEV-22127) に具体的な問題・解決策についてのドキュメントがあります。

#解決策
`all-databases.sql`のDumpファイルの先頭に以下の2行を追加することで解決しました。
また、schema以外のデータベースのみをDumpすることでも回避できます。

```
DROP TABLE IF EXISTS `mysql`.`global_priv`;
DROP VIEW IF EXISTS `mysql`.`user`;
```
C# の配列でキーワードを含む要素番号を取得したい。

C#でのお話。

例えば配列があります。
その配列に入る値は次のように、イコールで[ 項目名 ⁼ 値 ]なんて挟まれている、ただしその順番がランダムになったりする配列です。

```c#:配列のパターン1
string[] data = new string[] { "prmt=AE", "nullid=AC", "testid=AA", "patt=AD", "check=AB" };
```

となる場合もあるし

```c#:配列のパターン2
string[] data = new string[] { "testid=AC", "nullid=AE", "prmt=AD", "check=AA", "patt=AB" };
```

となる場合もあるなんて時。
ここで項目名の順番が一緒なら話は早いんだけど項目名の順番がランダムなのでまずはその順番を特定する必要がある。この時に、"testid="を含む要素は幾つ目なのか？　を調べたくなるじゃないですか。あれ？　調べたくならない？
で、ネットを色々とみてみるけどどうにもいい感じに解決してくれない。困ったときはfor文頼みだ！　とばかりに以下のように解決しました。

```c#:解決方法（"prmt"の要素番号を検索）
string[] data = new string[] { "testid=AC", "nullid=AE", "prmt=AD", "check=AA", "patt=AB" };
int ii = 0;
for (int i = 0; i <= data.Count() - 1; i++)
{
    if (data[i].Contains("prmt="))
    {
        // ここで i に要素番号が入るのでその後の処理をする。
    }
}
```

他にいい方法ってないんですかね？
AzureADでSAML連携時にNameIDをSAMアカウント名を使用する

# はじめに
AzureADでSAML連携を行う際、NameIDにUPNやメールアドレスを使用するのが一般的ですが、SP側のアカウント名がADアカウントのユーザ名(SAMAccountName)を設定される場合があります。
ここではSAMAccountNameを使用したSAML連携方法について記載します。

# 前提
本手順では、AzureADconnectを用いてID連携をされているケースが前提となります。
また、代替ログインIDを使用して連携しているケースでの手順となります。

AzureADのUPN:myname@hoge.com
オンプレADのUPN：K12345@hoge.local
※「K12345」は社員番号等を想定し、SP側のログインIDを社員番号としている場合

#設定手順
### □ 属性とクレームを設定
エンタープライズアプリケーション→シングルサインオンのセットアップで、
「一意のユーザID」を既定値の「userprincipalname」から変更するため、「編集」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124085/55830a67-fb0e-9154-352e-fd10f1a72aa0.png)

「一意のユーザ識別子(名前ID)」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124085/bb0794db-90a6-cde0-986b-3a0871da9a05.png)

「名前識別子の形式」を既定値の「電子メールアドレス」から「指定なし」に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124085/fc3ab9d7-9d94-d95e-393f-92196cd6541a.png)

ソース属性を「user.onpremisessamaccountname」に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124085/823b9241-bace-c704-7453-5825672736a9.png)

:::note info
「user.onpremisessamaccountname」はオンプレの Azure AD から同期され SAM アカウント名
:::

一意のユーザIDが「user.onpremisessamaccountname」に変更された事を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124085/96141827-2bf0-8109-2fa1-7b33f0516698.png)

上記で、UPN属性ではなく、SAMAccountNameを用いたSAML連携が可能となります。

#補足
上記のようなSAMAccountNameを用いてSAML連携を行う場合、SP側のNameIDフォーマットが
「urn:oasis:names:'tc:SAML:1.1:nameid-format:emailAddress」となっている場合不一致が生じ、SAML連携に失敗します。

今回の手順では、SP側が「urn:oasis:names:'tc:SAML:1.1:nameid-format:unspecified」に対応している場合に成功する事を確認しています。

#参考
[アプリのSAMLトークン要求をカスタマイズ](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/active-directory-saml-claims-customization)
Powershell Empireのインストール方法

# はじめに
Powershell Empireは仕様の大きな変更があり、googleで調べた操作方法と違うことがあります。そこで、今回はPowershell Empire(2021年12月現在)のインストール方法と簡単な操作方法を紹介します。

# インストール方法

インストール方法によって、若干操作が変わるので、注意が必要です。

今のヴァージョンでは、毎回サーバーを立てる必要があります。

尚、環境はVirtulBox上のkali linux(ver. 2021/4)を使っています。

## git cloneでインストール

GitHubは以下の通りです。

https://github.com/BC-SECURITY/Empire

```console
cd /opt
sudo git clone https://github.com/BC-SECURITY/Empire.git
cd /opt/Empire/setup/install.sh
```

もし、インストール時にエラーが出た場合は、以下のurlを参考にすると解決するかもしれません。

https://airman604.medium.com/installing-docker-in-kali-linux-2017-1-fbaa4d1447fe

terminalのtabを二つ作り、Powershell Empireを起動します。

### server側

```console
/opt/Empire/ps-empire server
```

以下の画面が出てくれば、成功です。

![server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/4d03e42f-6e53-cf9c-e414-e1067476ec02.png)

### client側

```console
/opt/Empire/ps-empire client
```

以下の画面が出てくれば、成功です。

![client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/69fd97df-3613-3956-7124-72924aeab40e.png)

## packageでインストール

packageでインストールでインストールした方が簡単です。

```console
sudo apt install powershell-empire
```

terminalのtabを二つ作り、Powershell Empireを起動します。

### server側


```console
sudo powershell-empire server
```

以下の画面が出てくれば、成功です。

![server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/4d03e42f-6e53-cf9c-e414-e1067476ec02.png)


### client側

```console
sudo powershell-empire client
```

以下の画面が出てくれば、成功です。

![client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/69fd97df-3613-3956-7124-72924aeab40e.png)

# 簡単な操作方法

## listeners一覧を見る
リバースシェルでアクセスするsudo powershell-empire serverコマンドで立てたサーバの一覧です。

初めてのログイン時は何も出現しません。

![Screen Shot 2021-12-28 at 10.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/1e18b27b-4f9e-eb2e-d5c8-525c6aa27538.png)


## listeners詳細を見る。

色々とセッティングした後の画面です。
portを設定しないとエラーが出ます。
192.168.56.30はkalilinuxのipアドレスです。

![Screen Shot 2021-12-28 at 10.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/775fef6f-6c1a-34af-e873-0c460d96b260.png)

設定する時は、以下のコマンドを実行してください。

```console
set Port 80
```

設定を反映させるには、以下のコマンド打ってください。

```console
execute
```
ついにめちゃくちゃリアルな架空の顔生成をiOSでできるようになった 【StyleGANをCoreMLでかんたんにつかう】

#リアルな画像を生成する機械学習モデルをiOSでつかう

「この人物は存在しない」というWebページをご存知ですか？
このページにアクセスすると、高画質の人物写真が表示されます。

<img src="https://user-images.githubusercontent.com/23278992/147519198-16a9725d-704c-4ed5-9fa9-c7eaf52182d4.png", width=700>

https://thispersondoesnotexist.com/

リロードすると別の人物が表示されます。これらの人物は、存在しません。
StyleGANという機械学習技術によって生成された画像です。

この記事では、StyleGANをiOSでつかって、かんたんに架空の人物画像を生成する方法を示します。

#超強力画像生成、しかしiOSで使えるのか。。。
StyleGANは人物の顔だけでなく、絵画やアニメの画像も生成できます。
もしもiOSで扱えたら、楽しいアプリができそうです。

しかし、StyleGANは2010年代後半に発表された技術ですが、これまで（僕の知る限りですが）iOSで使えた事例はあまり見かけませんでした。
Webサーバーで実行して、というのはあるのですが、もし端末上で実行できれば、通信も必要なく、速い。
**モデルが大きすぎたり、
構造がなんか複雑そうだったり**
というのがネックだったのではないかと僕は想像します。


#MobileStyleGANが現れた
2021年、モバイル用に軽量化されたMobileStyleGANが登場しました。

https://github.com/bes-dev/MobileStyleGAN.pytorch

このモデルはかんたんにCoreML形式に変換でき、iOSでつかうことができます。
３８MBという軽量サイズ（量子化前）、生成に1秒程度しかかかりません。
これなら、iPhoneでの使用にじゅうぶん耐えられると思います。

#具体的手法

### １、モデルを取得する
#####PlanA:
MobileStyleGANのリポジトリのCoreMLエクスポートスクリプトを実行すると、CoreMLモデルが取得できます。
出力は多次元配列(1024*1024 MLMultiArray)です。

#####PlanB:
CoreML-Modelsから変換ずみのMobileStyleGANのCoreMLモデルがダウンロードできます。
出力は画像（1024*1024 CVPixelBuffer）です。

https://github.com/john-rocky/CoreML-Models

### ２、画像生成

#####Swiftでモデルを実行する

MobileStyleGANはMappingNetworkとSynthesisNetworkの二つのネットワークで構成されています。
[1, 512]のランダムシードを作成し、マッピングネットワークに渡します。
マッピングネットワークの出力をシンセシスネットワークに渡します。


```swift
// Mapping

let mappingNetwork = try mappingNetwork(configuration: MLModelConfiguration())
let input = try MLMultiArray(shape: [1,512] as [NSNumber], dataType: MLMultiArrayDataType.float32)
            
for i in 0...input.count - 1 {
    input[i] = NSNumber(value: Float32.random(in: -1...1))
}

let mappingInput = mappingNetworkInput(var_: input)
            
let mappingOutput = try mappingNetwork.prediction(input: mappingInput)
let style = mappingOutput.var_134
            
// Synthesis
            
let synthesisNetwork = try synthesisNetwork(configuration: MLModelConfiguration())
            
let synthesisInput = synthesisNetworkInput(style: style)
let output = try synthesisNetwork.prediction(input: synthesisInput)
```

#####Xcodeサンプルプロジェクトを使って画像を生成する
MobileStyleGANをiOSでつかうサンプルプロジェクト

https://github.com/john-rocky/CoreML-StyleGAN

フォトライブラリから画像を選んでモデルを実行するかんたんなサンプルです。
Githubからクローンしてビルドすると、ボタンを押して顔画像を生成できます。1枚1秒程度で生成します。

<img src="https://user-images.githubusercontent.com/23278992/147398067-03c1d145-5617-4a53-b79b-5458e7d5891e.PNG", width=400>

#おもしろいアプリができたらいいな

512のランダムシードから画像を生成するので、3 * 10の1000乗　通りぐらいのパターンの画像が作れると思います（あってるかな？）。

<img src="https://user-images.githubusercontent.com/23278992/147397892-773c55ca-55fc-422b-a95b-a729eda04077.JPG", width=400><img src="https://user-images.githubusercontent.com/23278992/147397894-e2d3a1ef-7afa-410a-9580-f09ef7157c50.JPG", width=400>
MobileStyleGANをつかってiPhoneで生成した画像

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
TypeScriptチートシート１（基本）

<h2>1:boolean,number,string</h2>

```typescript
let aaa: boolean = true
let bbb: string = "string"
let ccc: number = 100
let ddd: number = 3.14
let eee: number = -1
```

<h2>2:型注釈と型推論</h2>

明示的に書かなくても、代入した型から推測してくれる

```typescript
let aaa = true
let bbb = "string"
let ccc = 100
```
<h2>3:オブジェクトに型を付ける</h2>


```typescript
const person: {
  name: string;
  age: number;
} = {
  name: "jack",
  age: 20,
};

```
<h2>4:配列</h2>


```typescript
const fruits:string[] = ['apple','banana','grape']
```
<h2>5:Tuple型</h2>

厳しく型注釈
要素の数、各要素の型をきめる

```typescript
const book:[string,number,boolean] = ['business',1500, false]
```

可変長（レストパラメーターにも使える）

```typescript
const friends :[string, ...string[]] = ["masaki","nana","keisuke"]
```

<h2>6:enum</h2>

上から0、1、2となる

```typescript
enum CoffeeSize {
    SHORT,
    TALL,
    GRANDE
}

const coffee = {
  hot: true,
  size: CoffeeSize.TALL,
};
```
<h2>7:any</h2>
なんでも入る
javaScriptの世界と同じ
あんまり使わない方がよい

<h2>8:Union型</h2>
複数の型を定義できる

```typescript
let unionType: number | string = 10;
let unionTypes: (number | string)[] = [21, "hello"];
```
<h2>9:Literal型</h2>
この型以外入りません

```typescript
const apple: 'apple' = 'apple'
let clothSize :'small'|'medium'|'large' = 'large'
```
<h2>10:typeエイリアス</h2>
型を変数に入れるイメージ

```typescript
type ClothSize = 'small' | 'medium' | 'large'
let clothSize: ClothSize = 'large'
```
<h2>11:関数に型を付ける</h2>
戻り値は型推論されるが、引数はされない

```typescript
function add(num1: number, num2: number): number {
  return num1 + num2;
}
```
<h2>12:戻り値void</h2>

```typescript
function say(): void {
  console.log("hello");
}
```
<h2>13:関数型</h2>
関数を保持する変数に型を付ける


```typescript
function add(num1: number, num2: number): number {
  return num1 + num2;
}

//anotherAddに型を付けて関数addを代入している
const anotherAdd: (n1: number, n2: number) => number = add;
```

関数のtype

```typescript
type IsPositiveFunc = (num: number) => boolean
const isPositive: IsPositiveFunc = num => num >= 0;
```
<h2>14:callback関数</h2>


```typescript
function doubleAndHandle(num: number, cb: (num: number) => void): void {
  const doubleNum = cb(num * 2);
  console.log(num * 2);
}

doubleAndHandle(21, (doubleNum) => {
  return doubleNum;
});
```
<h2>15:never</h2>
決して何も返さない

```typescript
function error(message: string):never {
    throw new Error(message);
    // while (true) {
        
    // }
}
```

<h2>17:null　undefined</h2>
・null 値が欠如している
・undefined 初期化されておらず値が割り振られていない
できるだけundefinedを使う

<h2>any　unknown</h2>
・any どんな型でも許容する＝全く安全ではない
・unknown どんな型になるのか不明
AWS Toolkitをインストールする

WebStormを起動します。

メニューから、「Plugins」をクリックします。
![スクリーンショット 2021-12-28 10.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/06a05ed2-e9ae-0185-4500-a178c85700b0.png)

Marketplaceから、AWS Toolkitを探し、「install」をクリックします。
![スクリーンショット 2021-12-28 10.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/d4a18aec-eb01-057b-258e-0a53825a0775.png)

WebStormを再起動します。
【GAS】日々送る業務メールの下書きを自動作成

# 毎日、業務開始・終了のメールを送るのだが
現在、週３〜４回参画している案件で業務をする際に必ず開始のメールを送ってます。<br>
こんな感じの・・・・<br>
![スクリーンショット 2021-05-03 23.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610555/55c69feb-ca53-ba22-3441-ffd89e430852.png)
<br>
## でも、いちいち宛先や件名を入力するのはめんどくさい<br>
毎回、to,cc,件名,本文などを入力して送るのはかなり面倒だし時間ロスになる<br>
## なら自動で下書きを作ってしまおう！
宛先や件名、本文のテンプレートはいつも同じだからできそうだ！<br>
では早速、やってみよう！<br>
### 1.まずはスプレッドシートを用意
今回、宛先や本文などをメンテナンスが簡単に出来るようにスプレッドシートに書き込みます。<br>
「下書き作成」ボタンにはスクリプト作成後に、紐づけたマクロを登録します。<br>

![スクリーンショット 2021-05-04 0.25.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610555/a957bfcd-13f0-647e-9588-f38fdd085118.png)
### 2.B列の各行を下書き作成用のパラメータにする
作成時に設定するパラメータは以下のセルを参照する<br>
Toは１行目<br>
Ccは２行目<br>
件名は３行目<br>
本文は４行目<br>
<br>
### 3.スクリプトを作成しよう
次にスプレッドシートからスクリプトエディタを開き以下のコードを実装します。<br>

```javascript:create_email.gas
function creat_email() {
//シートをアクティブにする
  var sheet=SpreadsheetApp.getActiveSheet();
//シートから値を取得する
  //メールの宛先を取得
  var To=sheet.getRange("B2").getValue();
  //メールのccを取得
  var cc=sheet.getRange("B3").getValue();
  //メールの件名を取得
  var subject=sheet.getRange("B4").getValue();
  //メールの内容を取得
  var body=sheet.getRange("B5").getValue();
//メールの下書き作成
  GmailApp.createDraft(To, subject, body,{cc: cc});
}
```

<br>
### 4.実行すると・・・・
おぉ、ちゃんと下書きが作成されている！！！<br>
これで定型作業が一つ自動化できた！<br>
![スクリーンショット 2021-05-04 0.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610555/f45f2f45-c255-41de-f635-d7163a78967b.png)
# まとめ
これを使えば、「To、Cc、件名、本文のテンプレート」が決まっているメールであれば自動で下書きを作成する事ができます！<br>
他にも「トリガー」を設定すれば、決まった時間に作成してくれるので是非ご活用ください！<br>
Visual Studio Code で Python のプログラムを書いてみた(その2)

---
**はじめに**
Visual Studio Code で Python のプログラムを記述し "Hello Python!" と表示をさせた。
※[Visual Studio Code で Python のプログラムを書いてみた(その1)](https://qiita.com/ytetsuo/items/4b194070037b8ffcc048)


これで、あとは コードを書いていくだけ・・・と思っていたら 次の２点でハマってしまった。
1. Anaconda (Python用 プラットフォーム) が使えない
2. [import serial] という単純な ライブラリー が読み込まれない
※2. の原因は、1. であった。

---
**1.Anaconda (Pyton用 プラットフォーム)を選択する**
\<Ctrl> + \<Shift> + \<P> で コマンドパレットを開き[Python:インタープリンターを選択]において
使用するインタープリターを選択する。
&emsp;※ここでは、Anaconda を選択する。(職場ではAnacondaを使っている人が多いため)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/57cd462c-63d5-28ce-de6b-52d2463c06eb.png)
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/95a8bba3-b14e-81da-6a52-bc732016ae7e.png)

一度、ターミナルを閉じた後 VSC を終了して再起動する

---
**2.Pythonのプログラムを読込み実行する**
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/c786bce8-c0a3-c5b0-491b-764ac4144d91.png)

![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/829a92c3-8563-85fc-8936-86545f434d2c.png)
☆anaconda3/python.exe で実行されていることが分かる

---
**3. Python で Serial 通信を行う準備**
ここまでで、ようやく Visual Studio Code で Pythonが使える様になった。

シリアル通信を行うためには、Visual Studio Code のターミナル上で下記を実行

~~~
pip install pyserial
~~~

**4.プログラムを作成**
&emsp;下記のプログラムは、Digital Multi Metter(HIOKI DMM7276) を USB接続 <仮想シリアルポート(COM8)>
&emsp;で PCと接続させコマンド [*IDN?] で、 測定器識別情報を取得す簡単なプログラム
&emsp;[HIOKI,DM7276-01,211126428,V1.07] と応答がある。やっと出来た！

~~~py
import serial

SerDevice = serial.Serial('COM8', 115200, timeout=1)

SerDevice.write("*IDN?".encode())

#end of Command
SerDevice.write(b"\r")

L_RecieveData=SerDevice.readline()
RecieveData = L_RecieveData.decode()
print(RecieveData)

SerDevice.close()
~~~
---
☆2021年12月28日(火) 午前10時40分 初版(Ver1.00) 作成
☆2021年12月29日(水) 午後 0時15分 Ver1.10:言語指定してカラーライズを行った
☆2021年12月30日(水) 午後 4時35分 Ver2.00:全体を見直し書き直し
☆2023年09月06日(水) 午後 3時10分 Ver2.01:間違い修正
☆2024年12月17日(火) 午前11時45分 Ver3.00：全体を見直し書き直し
---
JupyterLab の Config option `template_path` not recognized by ... への対処法

Anaconda を導入し、JupyterLab を起動するとタイトルにも書いた Config option `template_path` not recognized by ... というエラーを吐く。この対処法を記す。

[Config option template_path not recognized by LenvsLatexExporter. Did you mean one of: template_file, template_name, template_paths?#1529](https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1529) によると、`nbconvert` のバージョンが問題らしい。

現在のバージョンが `nbconvert==6.3.0` であったので、以下コマンドでダウングレードする。

```bash
$ conda install -c conda-forge nbconvert==5.6.1
```

これでタイトルのエラーは出なくなった。

ついでに以下エラーも対処しておく。

```bash
Generating grammar tables from /home/user/anaconda3/envs/test/lib/python3.10/site-packages/blib2to3/Grammar.txt
Writing grammar tables to /home/user/.cache/black/21.12b0/Grammar3.10.1.final.0.pickle
Writing failed: [Errno 2] No such file or directory: '/home/user/.cache/black/21.12b0/tmp7hd0mq3k'
Generating grammar tables from /home/user/anaconda3/envs/test/lib/python3.10/site-packages/blib2to3/PatternGrammar.txt
Writing grammar tables to /home/user/.cache/black/21.12b0/PatternGrammar3.10.1.final.0.pickle
Writing failed: [Errno 2] No such file or directory: '/home/user/.cache/black/21.12b0/tmpmdc62nvt'
```

上記は black を使用している場合のエラー。ディレクトリを手動で作成しないといけないため以下で作成。（作成するディレクトリは black のバージョンによって異なるため、エラーをもとに判断。）

```bash
$ mkdir -p /home/user/.cache/black/21.12b0
```

これで black によるエラーも解消した。
PostgreSQL: An old version of the database format というエラーの解決方法

PostgreSQL がエラーで起動できない時の対策です。

エラーメッセージ

```text
Dec 28 09:54:55 iwata systemd[1]: Starting PostgreSQL database server...
Dec 28 09:54:55 iwata postgres[8549]: An old version of the database format was found.
Dec 28 09:54:55 iwata postgres[8549]: See https://wiki.archlinux.org/index.php/PostgreSQL#Upgrading_PostgreSQL
Dec 28 09:54:55 iwata systemd[1]: postgresql.service: Control process exited, code=exited, status=1/FAILURE
Dec 28 09:54:55 iwata systemd[1]: postgresql.service: Failed with result 'exit-code'.
Dec 28 09:54:55 iwata systemd[1]: Failed to start PostgreSQL database server.
```

データの削除
root で行います。

```text
# cd /var/lib/postgres/data
# rm -rf *
```

データベースの初期化
postgres で行います。

```text
su postgres
initdb -D /var/lib/postgres/data
```

サーバーの起動

```bash
sudo systemctl start posgresql
```
【Access】MicrosoftAccessでレスポンシブなSPAを表現する

# 概要

MicrosoftのAccessでレスポンシブなSPAを表現する場合の押さえどころについて、
チャット風のサンプルアプリを作成した。

# メインの画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/26dcb3e1-e951-87f0-249d-7aa9d4910afb.png)

よくある構成として、画面左側がサイドメニュー、右側がメインコンテンツになっている。
サイドメニューとメインコンテンツは帳票フォームのサブフォームになっている。

サイドメニューはトークルームレコードを、メインコンテンツはトークルームごとの会話レコードを、
それぞれのテーブルから表示している。

# 画面の動き

## Point1

トークルームはメニューから選択し、画面内で切り替える。

![roomchange.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/13ed085f-37b3-b8ea-3801-a4e4a7c30c77.gif)


## Point2

ウィンドウサイズに追従して高さと幅を最大に保つ。
サイドメニューは固定幅、コンテンツ部が残りすべて、となる。

![sizechange1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/a24dfc40-596e-8028-fd03-347dd407a10b.gif)

## Point3

ウィンドウ幅を一定以下まで縮めるとサイドメニューが自動的に閉じ、
コンパクトに使用可能となる。

![sizechange2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/36693d4b-e1f1-bedd-55e5-629fe4c4453e.gif)

# 実装のポイント

メインフォームの `Form_Resize` に以下のコードを記載するだけで一応の要件は満たせる。
この考え方で大体の画面構成には応用が効くはず。

``` vb
Option Compare Database
Option Explicit

Private Const SIDE_MENU_WIDTH As Long = "3221"

Private Sub Form_Resize()
    With Me

        '幅が9600twip以下の場合はサイドメニューを閉じる
        If .WindowWidth < 9600 Then
            .SIDE_MENU.Width = 0
            .CONTENT.Left = 0
        Else
            .SIDE_MENU.Width = SIDE_MENU_WIDTH
            .CONTENT.Left = SIDE_MENU_WIDTH
        End If
        
        '高さはどちらも常にフル
        .SIDE_MENU.Height = .WindowHeight
        .CONTENT.Height = .WindowHeight

        If .WindowWidth - .SIDE_MENU.Width >= 0 Then

            '幅はコンテンツ側が可変なので (ウィンドウ幅 - サイドメニュー幅)で
            .CONTENT.Width = .WindowWidth - .SIDE_MENU.Width
            
            '各コントロールの調整
            .CONTENT.Controls("TALK_CONTENT").Width = .CONTENT.Width - .CONTENT.Controls("TALK_CONTENT").Left * 2 - 300
            .CONTENT.Controls("Btn_Dummy").Width = .CONTENT.Width - .CONTENT.Controls("Btn_Dummy").Left * 2 - 300
            .CONTENT.Controls("Input_Message").Width = .CONTENT.Width - .CONTENT.Controls("Input_Message").Left * 2 - 300
            .CONTENT.Controls("Btn_Submit").Left = .CONTENT.Width - .CONTENT.Controls("Btn_Submit").Width - 460
        End If
    End With
    
End Sub
```

# 余談

トークルーム内はLINEのように、自分が左側、相手が右側で分けたくて
レコードセットのユーザー名をキーに振り分ければ余裕だろうと考えていたが不可能だった。
展開されたコントロールはクローンのような状態なので個別に操作ができなかった。
サイドメニューでやっているようにクリックされたレコードはどれか、などは判別できる

近い機能で条件付き書式があるが、こちらもコントロール自体の操作は不可。
擬似的にそれっぽくは…がんばれば出来なくはないのかな、

そもそも論、Accessでチャットアプリを作り込む意義などはなかった…
Julia: sqlite3 のデータを削除 (Delete)

## プログラム

```julia:sqlite3_delete.jl
#! /usr/bin/julia
#
#	sqlite3_delete.jl
#
#					Dec/28/2021
# --------------------------------------------------------------------
using SQLite
# --------------------------------------------------------------------
println("*** 開始 ***")
file_db = ARGS[1]
key_in = ARGS[2]
println(key_in)
conn = SQLite.DB(file_db)

command = "delete from cities where id = '" * key_in * "'"

rr = DBInterface.execute(conn,command)

println(rr)
#
DBInterface.close!(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## 確認したバージョン

```text
$ julia --version
julia version 1.8.5
```
Julia: sqlite3 のデータを更新 (Update)

## プログラム

```julia:sqlite3_update.jl
#! /usr/bin/julia
#
#	sqlite3_update.jl
#
#					Dec/28/2021
# --------------------------------------------------------------------
using SQLite
# --------------------------------------------------------------------
println("*** 開始 ***")
file_db = ARGS[1]
key_in = ARGS[2]
population_in = ARGS[3]
println(key_in,'\t',population_in)
conn = SQLite.DB(file_db)

today = Libc.strftime("%F", time())
println(today)

ft_aa = "update cities set population = " * population_in
ft_bb = " , date_mod = '" * today * "'"
ft_cc = " where id = '" * key_in * "'"
command = ft_aa * ft_bb * ft_cc

rr = DBInterface.execute(conn,command)

println(rr)
#
DBInterface.close!(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## 確認したバージョン

```text
$ julia --version
julia version 1.8.5
```
Julia: sqlite3 のデータを読む (Read)

## プログラム

```julia:sqlite3_read.jl
#! /usr/bin/julia
#
#	sqlite3_read.jl
#
#					Dec/27/2021
# --------------------------------------------------------------------
using SQLite
# --------------------------------------------------------------------
file_db = ARGS[1]
println("*** 開始 ***")
conn = SQLite.DB(file_db)

command = "select * from cities"

stmt = DBInterface.prepare(conn,command)

results = DBInterface.execute(stmt)

rowid = DBInterface.lastrowid(results)
for row in results
	print(row[1],'\t',row[2],'\t')
	println(row[3],'\t',row[4])
end
#
DBInterface.close!(stmt)
DBInterface.close!(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## 確認したバージョン

```text
$ julia --version
julia version 1.8.5
```
Julia: sqlite3 のデータを作成 (Create)

## プログラム

text_manipulate.jl はこちら
[Julia: text ファイルの crud](https://qiita.com/ekzemplaro/items/5c7f674ee034a33e2553)

```julia:sqlite3_create.jl
#! /usr/bin/julia
#
#	sqlite3_create.jl
#
#					Feb/26/2023
# --------------------------------------------------------------------
using SQLite

include("text_manipulate.jl")
# --------------------------------------------------------------------
function data_prepare_proc()
	dict_aa = Dict()
#
	dict_aa = dict_append_proc(dict_aa,"t0711","郡山",52761,"2013-2-22")
	dict_aa = dict_append_proc(dict_aa,"t0712","会津若松",17295,"2013-3-15")
	dict_aa = dict_append_proc(dict_aa,"t0713","白河",31674,"2013-8-14")
	dict_aa = dict_append_proc(dict_aa,"t0714","福島",43612,"2013-6-9")
	dict_aa = dict_append_proc(dict_aa,"t0715","喜多方",72391,"2013-9-4")
	dict_aa = dict_append_proc(dict_aa,"t0716","二本松",25187,"2013-2-21")
	dict_aa = dict_append_proc(dict_aa,"t0717","いわき",81246,"2013-1-23")
	dict_aa = dict_append_proc(dict_aa,"t0718","相馬",45791,"2013-10-26")
	dict_aa = dict_append_proc(dict_aa,"t0719","須賀川",74139,"2013-12-15")
#

	return  dict_aa
end
# --------------------------------------------------------------------
function create_table_proc(conn)
	sql_str = "drop table if exists cities"
	println(sql_str)
	aa = DBInterface.execute(conn,sql_str)
	println(aa)
#
	sql_str = "create table cities (id varchar(10) primary key, name text, population int, date_mod date)"
	println(sql_str)
	aa = DBInterface.execute(conn,sql_str)
	println(aa)
#
end
# --------------------------------------------------------------------
function insert_proc(conn,dict_aa)
	for key in sort(collect(keys(dict_aa)))
		print(key, '\t', dict_aa[key]["name"])
		print('\t', dict_aa[key]["population"])
		println('\t', dict_aa[key]["date_mod"])
		ft_aa = "insert into cities (id,name,population,date_mod) values ("
		ft_bb = "'" * key * "','" * dict_aa[key]["name"] * "',"
		ft_cc = "'" * string(dict_aa[key]["population"]) * "',"
		ft_dd = "'" * dict_aa[key]["date_mod"] * "')"
		sql_str = ft_aa * ft_bb * ft_cc * ft_dd
		println(sql_str)
		aa = DBInterface.execute(conn,sql_str)
		println(aa)
	end
#
end
# --------------------------------------------------------------------
println("*** 開始 ***")
file_db = ARGS[1]
dict_aa = data_prepare_proc()
conn = SQLite.DB(file_db)
create_table_proc(conn)
insert_proc(conn,dict_aa)
#
DBInterface.close!(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## 確認したバージョン

```text
$ julia --version
julia version 1.8.5
```
AWS Certified Cloud Practitioner 合格しました

先日、AWS認定クラウドプラクティショナーの試験を受験し、合格しました！
その記録を残しておきます。

AWSを業務で扱い始めて2年余りです。これまでにアソシエイトとスペシャリティを全部取得しました。残りはクラウドプラクティショナーとプロフェッショナルのみという状況でした。アソシエイトを受ける前に最初にクラウドプラクティショナーを取ればよかったのですが、取りそこねていたので、いまさら受験することにしました。

今回の受験は、前回のネットワークスペシャリティ受験の1時間後です。AWSの認定資格としては10個目、今月（2021年12月）は5個目です。今月はこれで最後です。

2021年12月の受験履歴 (リンク先は合格体験記)

- [データアナリティクス専門知識](https://qiita.com/suzuki-navi/items/936741e02a5869856ad8)
- [SysOpsアドミニストレータアソシエイト](https://qiita.com/suzuki-navi/items/ebfde17bfed3eec97261)
- [セキュリティ専門知識](https://qiita.com/suzuki-navi/items/867c7f48b1c39e179808)
- [ネットワーク専門知識](https://qiita.com/suzuki-navi/items/94f0d4092cc113d82a2f)
- クラウドプラクティショナー (今回)

# 勉強方法

PDFで公開されているサンプル問題を見ました。以上。

# 試験当日

これまでスペシャリティの問題ばかり解かされていた私にとっては、クラウドプラクティショナーは問題文も短いし、選択肢もサービス名を選ぶだけというシンプルなものが多くて、試験中は和みました。それでもちょくちょく知らないサービス名やキーワードがが出てきて、確信の持てない問題もある程度ありました。

90分65問ですが、ゆっくり40分ぐらいで一巡し、見直しフラグを付けた数問だけ見直しをして終了にしました。

# 結果

スコア 834 でした。間違えた問題が結構あったんだな。難しいと感じたセキュリティスペシャリティよりも、簡単だと感じたクラウドプラクティショナーのほうがスコアが低い！なんでだ・・・

# 所感

スペシャリティやアソシエイトを全部取ってきたけど、それでもわからないサービス名がちょくちょく出てきました。勉強不足だったか。

オンプレと比較したクラウドのメリットを問う問題がたくさんありました。内容はいまさら当たり前のことでしたが、オンプレが当たり前だった時代との違いを改めて認識しました。
【初心者向け】Qlik Senseのロードスクリプトの使い方：データの縦持ち変換

#	本記事は
ロードスクリプトの標準機能を使って、複雑な操作なしで複数のカラムを１つにまとめて比較することができるようになります。
#１：作業イメージ
今回はデータの縦持ち変換について学習していきます。
例：下のデータでは縦持ち変換するとどのようになるか確認しておきましょう。
食品,日用品,電化製品の３つから**商品カテゴリ**というカラムを作成します。
##(Before)カテゴリ別購入品
<table><tr><th>名前</th> <th>食品</th><th>日用品</th><th>電化製品</th></tr><tr><td>さとう</td> <td>○</td><td>○</td><td>×</td></tr><tr><td>すずき</td> <td>○</td> <td>×</td><td>×</td></tr><tr><td>たなか</td> <td>○</td> <td>×</td><td>○</td> </tr></table>
##(After)カテゴリ別購入品
<table><tr><th>名前</th> <th>商品カテゴリ</th></tr><tr><td>さとう</td> <td>食品</td></tr><tr><td>さとう</td> <td>日用品</td></tr><tr><td>すずき</td> <td>食品</td></tr><tr><td>たなか</td> <td>食品</td></tr><tr><td>たなか</td> <td>電化製品</td></tr></table>



#２：作業
##①データの確認/データロード
今回の作業では下記のデータを使用します。
表をそのままコピーしてからExcelなどに貼り付けで使用できます。

| 名前       | 一般食品 | 青果 | 水産 | 惣菜 | 日用品 |
|:----------:|---------:|-----:|:-----|:----:|:------:|
| さとう     | 1        |      | 1    | 1    | 1      |
| すずき     | 1        |      | 1    | 1    | 1      |
| たなか     | 1        |      | 1    | 1    | 1      |
| たかはし   | 1        | 1    |      |      |        |
| なかじま   | 1        | 1    |      | 1    | 1      |

データの読み込みが終わったら、
テーブル名に「読み込み用テーブル」と名前を付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/a2385d8d-fa73-224b-5647-1a13abed9b1b.png)

##②コーディング
下記のイメージの通りです。
コーディングが完了したら「データのロード」で読み込みましょう！
コロンとセミコロンの違いに注意してください。そのままコピーでも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/474fee76-8ded-fea6-f993-fc0c05dec659.png)

```
作成テーブル:
CrossTable('商品カテゴリ','フラグ',1)
Load
    名前,
    一般食品,
    青果,
    水産,
    惣菜,
    日用品
Resident 読み込み用テーブル;

Drop Table 読み込み用テーブル;
Drop Field フラグ From 作成テーブル;
```


##③テーブル確認/チャートの作成
完了したら想定通りにデータが抽出できているか確認します。
上の作業イメージの通りに入っているのでチャートを使用してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/71e6b2df-5fe7-2885-4c08-c602180cc672.png)


チャートから「棒チャート」をドラッグすると下記の画面になります。
イメージの吹き出し通りに作業してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/0f678c95-a407-519d-9168-8cd16d025685.png)


完了したら「スタイル」→「色と凡例」→「軸ごと」を選択します。
すると、基本的な棒チャートが作成できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/752aefe5-a0e5-a547-a79f-ea6d455f3013.png)
<dd><strong>
「カテゴリごとに比較をしたい」という時にはぜひ縦持ち変換を思い出してください！！</strong></dd>
統計検定2級の合格方法

#はじめに
先日、CBT方式試験で統計検定2級に合格しましたので合格までなにしたか記録しておきます。
#試験について
簡易的にですが、試験の概要を記載しておきます。（2021年度6月時点）
問題数：大体30問程度
時間：90分
電卓の持ち込み：可
試験範囲：https://www.toukei-kentei.jp/cbt/cbt_about/grade2/

#成績
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/01ce8ff5-f238-ee05-ad14-f78538e96728.png)
有楽町で受けて、
試験自体は70分程度で終わりました。
試験結果は画面に速攻で出てきました！
点数は上記の通りぎりぎりです。

#勉強方法（３つ！）
##[①統計学の時間（無料）](https://bellcurve.jp/statistics/)
「統計検定2級　勉強方法」で調べたら間違いなく上記のリンクサイト出てきます。
私は高校数学には自信があったので、STEP1基礎編から読みました。
あまり難しい式は「ふーん、そうなのか」程度にしてどんどん読んでいきましょう！
たとえば、下記の式は標準正規分布の確率密度関数（μ=0、σ=1のとき）を表したものですが、覚える必要はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577830/b5f1c7a1-482c-95db-178a-124f7187c1d7.png)



##[②過去問（有料）](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-2%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2017%E3%80%9C2019%E5%B9%B4/dp/4788925524/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A+%E9%81%8E%E5%8E%BB%E5%95%8F&qid=1631098445&s=digital-text&sr=1-2-catcorr)
過去問は購入しました。（2000円くらいです）

公式のHPで無料1回分を公開しているので試しに一度解いてみるといいかもしません。（無料のものは正解がありますが解説は付いていないです!他のサイトで解説をみましょう！）
問題を解いてみるとわかりますが、試験時間が足りません。
私は6回分の過去問を2周しましたが、1周目は全然時間が足りませんでした！
ありきたりなアドバイスですが、解き直しに時間をかけて理解することも大切です。しかし難しいものは飛ばして過去問を通して挑戦していくといいと思います。安定して8割程度取れるまでは何度でも挑戦しましょう。

##[③統計学演習（有料）](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%BC%94%E7%BF%92-%E6%9D%91%E4%B8%8A-%E6%AD%A3%E5%BA%B7/dp/4563008702/ref=asc_df_4563008702/?tag=jpgo-22&linkCode=df0&hvadid=295662004514&hvpos=&hvnetw=g&hvrand=4809640000792140108&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009221&hvtargid=pla-525303494128&psc=1&th=1&psc=1)
統計学演習をおすすめします！（2500円くらいです）
自分はすべての問題を行っていませんが、検定や推定、確率を求める問題についてはある程度演習しました。勉強全般に言えますが、数学では特に反復練習が最も重要なプロセスです。沢山問題を解いて解答の瞬発力を鍛えたい人や①統計学の時間と過去問だけでは不安な方にはとても良い問題集だと思います！
【追記】無料で読めるサイトもあるそうです！
http://www.math.s.chiba-u.ac.jp/~yasuda/statEN2/statENSYU.html


#統計学へのモチベーションをあげる！
##※試験対策している本ではないです。
###[数学ガール秘密のノート/やさしい統計（有料）](https://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%82%AC%E3%83%BC%E3%83%AB%E3%81%AE%E7%A7%98%E5%AF%86%E3%83%8E%E3%83%BC%E3%83%88%EF%BC%8F%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E7%B5%B1%E8%A8%88-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B01MSJMKMW)
（1500円くらいです）
統計学をこれから学習していくか悩んでいる人やこれから勉強しようと思っている人、他にも数学が好きな人におすすめです！
タイトルにもありますが、内容がやさしい統計学の本です。
サンプルで無料読める部分もあるのでぜひ！



#まとめ
ちなみに上記の勉強法を用いて、資格取得までの学習時間は、30時間程度です。
また、試験では時間が足りない人がほとんどだと思います。私は本番の試験ではわからない問題はすぐ飛ばしていったので時間が残りました。すべての問題に取り掛かれるようにわからないものは飛ばして、どんどん進めていきましょう。
例えば、1分考えてわからない場合は次の問題にいく。など自分の中でルールを作っておくといいかもしれないです

最後に。。。
私は優秀賞など選ばれませんでしたが、統計検定では優秀賞の方を表彰しています。
何点以上で表彰されるのかなどの情報はわかりませんが、受験者数に対して表彰されている人がかなり少ない印象でした。
[統計検定HP：優秀賞リンク](https://www.toukei-kentei.jp/cbt/past/)
AWS CDK(Python) 環境構築メモ

自分用メモです。
ご参考になれば幸いです。

■ローカル環境（Windows）へのCDK環境構築手順
・git導入（サンプルコードダウンロード用）
https://git-scm.com/download/win

・AWS CLI導入
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html#install-msi-on-windows

・クレデンシャル登録（AWS Configure実施※対象リージョン分実施)
aws configure
aws configure --profile us-east-1

・Node.js8.0以上導入
https://nodejs.org/ja/

・CDK導入
コマンドプロンプトで下記コマンド実行
npm install -g aws-cdk

・Python3導入
https://www.python.org/downloads/windows/

・エディタ（VisualStudio Code＋Python拡張）
https://code.visualstudio.com
[Dockerfile]RUN命令での set -e に意図はあるのか？


Dockerfile 眺めていると、１つのRUN命令で複数の処理を記載する際に２通りの記載があります。
下記のpythonイメージのDockerfileの例だと、

https://github.com/docker-library/python/blob/db32c7803dfc67e5a359514371e66d6405695e45/3.10/bullseye/Dockerfile

### ①処理を && で繋げるだけのパターン

```
# make some useful symlinks that are expected to exist
RUN cd /usr/local/bin \
	&& ln -s idle3 idle \
	&& ln -s pydoc3 pydoc \
	&& ln -s python3 python \
	&& ln -s python3-config python-config
```

### ②set -ex で開始して && で繋げるパターン

```
RUN set -ex \
	\
	&& wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" \
	&& wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" \
	&& export GNUPGHOME="$(mktemp -d)" \
・
・
・
	&& ldconfig \
	\
	&& python3 --version
```


どう使いわけるんでしょうか？

##### ①処理を && で繋げるだけのパターン
こちらについては、シェルの && 演算子で繋げていって、
処理が成功(exit 0)すれば順次処理していく形か。

##### ②set -ex で開始して && で繋げるパターン
こちらについても、処理成功で次処理を実行していきたいという意図は同じ。
set の -x オプションはデバッグ用途？長いRUN命令書いている際に便利なのだろうか。
set の -e オプションは non-zero で終了した際に停止したい場合。
ん？ && で事足りるのでは？
RUN 失敗すれば docker build も停止するので、Dockerfileの１つのRUN命令内においてのでの set -e 有無は意味をなさない気がする。
好みの問題？

https://stackoverflow.com/questions/47143319/what-does-set-x-do-in-dockerfile
https://stackoverflow.com/questions/50319492/difference-between-and-set-ex-in-dockerfiles
AWS SAM CLI をインストールする

# インストールする
Homebrewを使って、AWS SAM CLIをインストールします。
以下のコマンドを実行します。

```
brew tap aws/tap
brew install aws-sam-cli
```

インストールを確認します。
以下のコマンドを実行します。

```
sam --version
```

# アップグーレードする
以下のコマンドを実行します。

```
brew upgrade aws-sam-cli
```

# アンインストールする
以下のコマンドを実行します。

```
brew uninstall aws-sam-cli
```
Dockerをインストールする

# Dockerをダウンロードする
以下のサイトからDokcerをダウンロードします。
https://docs.docker.com/desktop/mac/install/

# Dockerをインストールする
ダウンロードしたファイル(docker.dmg)をダブルクリックします。

インストーラの画面が表示されます。
画面の指示に従って、DockerアイコンをApplicationsフォルダにドラック＆ドロップします。
インストールが始まります。
![スクリーンショット 2021-12-28 7.01.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/8027d983-76b5-b229-7d64-e865ef8ef729.png)

# Dcokerを起動する
LauncpadからDockerアイコンをクリックし、Dockerを起動します。

# Dockerコマンドの実行を確認する
ターミナルを起動します。
以下のコマンドを入力します。

```
docker ps
```