OmniAICreator/Qiita-1.07M huggingface dataset:
Qiita のストックのダメダメなカテゴリー機能の、今現在の私の運用

Qiitaのカテゴリ機能が欠陥品で、ストックした記事を分類するのに向かないことは以前記事にした。

https://qiita.com/seroqn/items/5d2fdc2df482e0765333

今現在は次のようなカテゴリで運用している。
![qiita-category.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17558/aa6969bb-a9e6-a6cf-737e-a69fa087015b.png)

カテゴリ数を増やして細分するのに全く向いていないシステムなので、カテゴリー数は7つに留めて、そのなかでよく使いそうなものを上位に置いた。
他のカテゴリーにストックが溜まるとパフォーマンスが悪化するが、「あとで読む」だけは例外なので、基本、「あとで読む」にストックして、必要に応じて別のカテゴリーに追加で加えるということにしている。

つまり**「あとで読む」以外のカテゴリーには少数の記事だけを所属させるなら破綻なく運用できそう**ということだ。

「あとで読む」を何でも放り込む Inbox と化させたので、実際にストックだけして未読のもの、途中までしか読んでいないものは「最後まで読んでいない」にストックする。
プロジェクトでの調べものでストックしたものは「tmp：直近プロジェクトで使う」、ザッピング中に見つけた、あとで実践できそうな環境改善などの設定方法などは「tmp：やり終わったら消す」にストックして、これらは終わったらストックから外す。

あとは、保存した記事の中で保存版と思えるものは「定期的に読み返す」「優良記事」にストックする。

なんかすごそうな記事だけど今現在の私では活用できそうな内容は「読むに私のレベルが足りない」にストックする。

技術による記事の分類はしなくても記事についたタグで絞り込めばいいし、あるいはストック一覧の検索窓で「すべて」内を検索して見つける。

今のところこれで運用して、また問題が出たら都度改めるつもり。いずれにせよ、Qiitaのカテゴリ機能は一時的なブックマーク的運用に留めるべきで、几帳面に全ての記事を分類するようなものではない。
ファイルのコピーを連番で1,000個つくるVBScript

動作確認のためのテスト用PDFファイルを連番ファイル名で1000個作る必要があったので、VBScriptでやってみた。

```vb:連番deCopy.vbs
' 選択したファイルをこのスクリプトファイルに直接ドラッグするか、あるいは
' このスクリプトファイルを SendToフォルダに入れて、選択したファイルの
' 右クリックメニューで［送る］から実行する
```

```vb
Option Explicit

Dim file0, fName, startNum, lastNum, digit, padding, ext, i

file0 = WScript.Arguments(0)

fName = GetInput("連番より前のファイル名を入力してください。")
startNum = CLng(GetInput("連番の開始番号を入力してください。"))
lastNum = CLng(GetInput("連番の終了番号を入力してください。"))
digit = CLng(GetInput("連番の桁数を入力してください。"))

padding = String(digit, "0")

With CreateObject("Scripting.FileSystemObject")
    ext = "." & .GetExtensionName(file0)

    For i = startNum To lastNum
        .CopyFile file0, .BuildPath(.GetParentFolderName(file0), fName & Right(padding & i, digit) & ext)
    Next
End With
```

```vb
'// InputBox の入力値を返す

Function GetInput(ByVal msg)

    Dim val

    val = InputBox(msg)
    If IsEmpty(val) Then MsgBox("キャンセルされました。"): WScript.Quit
    If val = "" Then MsgBox "何も入力されていません。": WScript.Quit

    GetInput = val

End Function
presignedurlでファイルサイズを制限したい皆様に贈るpresignedpost [boto3]



# 結論まで言ってしまった。
そう、presignedpostを使えばできる。


# はじめに
私がはじめてpresignedurlと出会ったのは、apigatewayやlambdaのペイロードの容量制限（それぞれ10MBと6MB）によって、lambdaのreturnからs3のファイルを取得することができなかったとき。
こんな時みたいに大きい容量のファイルをダウンロードやアップロードする際に便利なのがpresignedurlだ。便利で使い勝手がいい。だってどんなに大きいファイルでもポンポンs3にぶち込めてしまうだもの。

でも、このurl、入力サイズに制限がない。だからめちゃくちゃでっかいサイズのファイルをs3に直接アップロードできてしまう。そのurlを知っている人なら誰でもね。


そうなのだ、もしそのurlが漏洩してしまったら巨大なファイルをアップロードする攻撃が可能になってしまう。ﾁｮｯﾄｺﾜｲ。

そんなあなたに贈るものが**presignedpost**である。presignedurlの機能をほぼそのままに、ファイルサイズ制限をつけることができる優れものなのだ。


# 使い方

BucketとKey、ExpiresInを指定するのはpresignedurlと一緒。
presignedpostはConditionsというパラメータが追加されて、様々なメタ情報をurlに付与することができる。

例えば以下のように記述すると、入力サイズが0~1000bytesであるファイルのみを受け付けるurlを発行することができる。そのほかはpresignedurlで発行した場合と同じである。実に素晴らしいことではないか。

少し沼ポイントなのが、アップロードしたいデータは、`generate_presigned_post()`の返値`fields`の、一番最後に、key名を`file`として配置しなくてはならないことだ。


```python
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
res = s3.generate_presigned_post(
    Bucket="bucket-name",
    Key="key_name",
    Conditions=[["content-length-range",0,1000]],
    ExpiresIn=3600,
)
url = res["url"]
fields = res["fields"]
fields["file"] = json.dumps("やっほー") #アップロードしたいデータ

requests.post(url=url, files=fields)
```

`boto3.client.generate_presigned_post()`は、以下のようにpost用のurlとその他認証情報の辞書を返す。

```python
{
'url': 'https://bigdata-test10.s3.amazonaws.com/',
'fields': {
    'key': 'key_name',
    'x-amz-algorithm': 'AWS4-HMAC-SHA256',
    'x-amz-credential': 'ASIA**********',
    'x-amz-date': '20211226T022115Z',
    'x-amz-security-token': '************',
    'policy': '************',
    'x-amz-signature': '************'
    }
}
```

# おわりに
presignedpostは、入力サイズなどの様々な制限を付与できるpresignedurlと思っていて差し障りないと思われる。
今回は`content-length-range`にのみ触れたが、他にもコントロールできるメタ情報はたくさんある。

以下を参考にされたい。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_post
https://advancedweb.hu/differences-between-put-and-post-s3-signed-urls/
Vscodeでsettings.jsonの優先順位を利用する

初めにHtmlなどの開発で使っていたVSCodeでPythonの開発をしようとしたときに
どうにか楽に開発環境を分けたいなと思い調べてみました。

まずはVSCodeのsettings.jsonの優先順位についてみていく
![スクリーンショット 2021-12-26 11.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/21f90260-1698-41fa-11ba-fb39e4af49ba.png)


例えば異なる優先度のsettings.jsonで同じ項目の設定をした場合、より優先度の高いものが優先されるため

各settings.jsonの開き方は以下のよう（他のやり方もあると思います）
○ワークスペース設定
プロジェクト毎に作成される。もしない場合は自分で「.vscode」フォルダを作成してもOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/6fd3e653-4eb4-4ce4-6435-99230f868058.png)

○ユーザー設定
ユーザー設定の画面で右上のアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/3c05dd3a-7fb6-7c96-b450-313e941a9eb6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/ec81e044-3fd3-dc59-72da-dc76f2a610b1.png)


○デフォルト設定
Macの場合は「cmd+shift+p」で検索ボックスが開く。そこからみることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/633f6a13-8e22-2028-e79f-d2ff905646b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/f47a50d7-1b30-319f-0fb9-a9594861d220.png)

これらを使い分けてより快適な開発環境を手に入れましょう！

参考記事
・VSCodeにおけるsettings.jsonの優先度について
https://qiita.com/tatsuya_yamakawa/items/df7e5b1b0d7c336af124
Next.js 12(typescript)をDocker上で動かすための手順(色々詰まって悩んだ)

### Next.js 12(typescript)をDocker上で動かすための手順(色々詰まって悩んだ)

## 記事を書こうと思った経緯
Next.jsを使ったことなかったのですが、勉強のためにver.12からやってみたら、色々ハマったので、他の方で詰まった方がおられましたら、参考にしていただけたらと...
初心者の方でも、構築可能な様にしてます。
(すみません。不備あったので編集済みです....)

##目的
swcのエラーを解消して、Next.js 12をDocker上で動くようにする。

##対象
Next.js 12をDocker上で動かしたい方全員が対象
DokcerでNext.js12を使ってみたいけど、環境構築で挫折した方などなど...

##前提
Node v14.18.1が使える状態であること。
Dockerが使える状態であること。(Docker Desktopでも可)

##開発環境
OSはmac想定です。

|環境|バージョン|
|---|---|
|macOS|Monterey|
|Alphine  |3.13|
|Node|14.18.1|
|Yarn|1.27|
|Rust|1.57|
バージョンが違うと動かないことがあるので、注意

##フォルダ構成
```
next_demo/
　├ environment
　│　　　　　　└ docker-entrypoint.sh
　│　　　　　　└ setup.sh
　├ src
　│　　　　　　└ next.jsのソース ← Next.jsをダウンロードしてください。
　├ docker-compose.yaml 
　└ Dockerfile
```

##next.jsのダウンロード (わかる方はスキップOK)
１、next_demoの中に移動
２、yarn create next-app --typescript src を実行


##各ファイルの内容 (コピペどうぞ！)
・docker-compose.yaml

```
version: '3.7'
services:
  next12_demo:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: 'next12_demo'
    volumes:
      - ./src:/usr/src/app
    command: sh -c "sh /docker-entrypoint.sh && cd /usr/src/app && yarn next dev"
    ports:
      - "3001:3000"
    environment:
      TZ: 'Asia/Tokyo'
```

・Dockerfile

```
FROM rust:1.57.0-alpine3.13

COPY /environment /

RUN apk update && \
    apk add vim && \
    apk add nodejs npm && \
    npm install -g yarn && \
    chmod 755 /docker-entrypoint.sh && \
    chmod 755 /setup.sh

ENV HOST=0.0.0.0
EXPOSE 3000
```
※ちなみに、FROMの「rust:1.57.0-alpine3.13」を「node:14.18-alpine3.13」に変更して、
・ apk add nodejs npm && \
・ npm install -g yarn && \
をコメントアウトして実行しても動きますので、rustが必要ない方は、そちらでもOKです。


・docker-entrypoint.sh

```
#!/bin/sh

SETUP_FILE="/setup.sh"

if [ -e $SETUP_FILE ]; then
    sh setup.sh
    rm setup.sh
else
    echo "------- already run setup.sh -------"
fi
```
・setup.sh

```
#!/bin/sh
cd /usr/src/app

echo "------- next-swc-linux-x64-gnu install -------"
yarn add next-swc-linux-x64-gnu
```

## 起動コマンド
```
// docker-compose.ymlファイルのあるフォルダで実行
docker-compose up --build

// コンテナが問題なく動いたら、ブラウザで以下にアクセス
→ http://localhost:3001
```

## イメージにrustを使用した理由
今回の構築では、imageにrustを使用しています。nodeで行ってみようとしたのですが、
以下の理由で、rust:1.57.0-alpine3.13を使用。

```
1、alpineでrustの環境構築がちょっとしんどかった。
2、alpineでの構築をやってみたかった
3、WebAssemblyの高速化を試してみようと思った。
```

## 注意
ちなみに、setup.shを実行せずに、nextを起動しようとすると、以下のようなエラーが発生するのでご注意を!

```
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
error - Failed to load SWC binary, see more info here: https://nextjs.org/docs/messages/failed-loading-swc
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```


## まとめ
swcを無効にすることができるのは知っているのですが、今回はあえて無効にせずにできるか試してみました。
とりあえず、できるようになったが、もっといいやり方ある気がしてるので、最適解をご存知の方は、ご指摘いただけると嬉しいです。

不備がございましたら、それも、ご指摘いただけると嬉しいです。

では.....
ComposerのWindowsインストーラー実行時に発生したエラーへの対処

#環境
Composer ver 2.2.1 
Xdebug ver 3.1.2

#起きたこと
ComposerのWindowsインストーラー「Composer-Setup.exe」のインストール時に以下のエラーが発生した。

Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) :-(

![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2351428/659b2ebf-e61c-f5b7-1a04-311dcaa93e8b.png)

Composerをコマンドラインから実行した時も同様のエラーが表示される。

#原因
Xdebugの設定をxdebug.start_with_request = yesにしてあるのが原因。
必要がないときもXdebugが呼び出されてしまう。

#対処方法
php.iniに以下の内容を追記してログファイルへの書き込みをほぼ無効化する。

```php.ini
xdebug.log_level=0
```

もしくは以下の様にphp.iniを変更して、[Xdebug Helper for Chrome](https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc)をインストールする。
こちらはデバッグを行いたい時に拡張機能でデバッグを有効にする必要がある。

```php.ini
xdebug.start_with_request = trigger
```
npm +TypeScript + Nuxt.js で create したらいきなりThis relative module was not found: ./index.vue?vue&type=script&lang=ts& in ./pages/index.vueというエラーが出た

よくわからないままですが、一応解決できた？ので記録として残します。

![20200811145835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/52321075-73c8-ee0c-f45e-19b4044b2ce7.png)

# 結論
- @nuxt/typescript-runtime と @nuxt/typescript-build の バージョンを固定させた
- 動くようになったけど、結局よくわからないまま

# 現象
TypeScriptを有効にして、あとはデフォルトの設定で作成したNuxtプロジェクトで、
今まで出なかった以下のようなエラーが突然出た。

```
ERROR Failed to compile with 1 errors
This relative module was not found:
./index.vue?vue&type=script&lang=ts& in ./pages/index.vue
```

# 実行環境
- PC: MacBook Pro (Intel Core 2016)
- OS: macOS Montery12.0.1
- Node.js v16.9.1
- Nuxt.js v2.15.8

# package.json
```json
{
  "name": "app",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "lint:js": "eslint --ext \".js,.ts,.vue\" --ignore-path .gitignore .",
    "lint:prettier": "prettier --check .",
    "lint": "npm run lint:js && npm run lint:prettier",
    "lintfix": "prettier --write --list-different . && npm run lint:js -- --fix",
    "test": "jest"
  },
  "dependencies": {
    "@nuxtjs/axios": "^5.13.6",
    "core-js": "^3.19.3",
    "nuxt": "^2.15.8",
    "vue": "^2.6.14",
    "vue-server-renderer": "^2.6.14",
    "vue-template-compiler": "^2.6.14",
    "webpack": "^4.46.0"
  },
  "devDependencies": {
    "@babel/eslint-parser": "^7.16.3",
    "@nuxt/types": "^2.15.8",
    "@nuxt/typescript-build": "^2.1.0",
    "@nuxtjs/eslint-config-typescript": "^8.0.0",
    "@nuxtjs/eslint-module": "^3.0.2",
    "@vue/test-utils": "^1.3.0",
    "babel-core": "7.0.0-bridge.0",
    "babel-jest": "^27.4.4",
    "eslint": "^8.4.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-nuxt": "^3.1.0",
    "eslint-plugin-vue": "^8.2.0",
    "jest": "^27.4.4",
    "prettier": "^2.5.1",
    "ts-jest": "^27.1.1",
    "vue-jest": "^3.0.4"
  }
}
```

# issue を発見したが
調べてみると以下の issue を発見した。

https://github.com/nuxt/nuxt.js/issues/8015

ただ、こちらの issue は2020年9月3日に上がって、
現在は**対応済み**ということで **Closed** になっている。

この記事を投稿しているのは、2021年12月26日なので、
かなり前の issue である。

上記の issue をざっくりと申し上げると、
@nuxt/typescript-runtime と @nuxt/typescript-build のバージョンが原因だったと書かれていました。

一応、修正プルリクは以下です。

https://github.com/nuxt/create-nuxt-app/pull/599

# やってみたこと
とりあえず、動かないので以下のことをやってみました。

- node_modules の再インストール

```
% rm -rf node_modules
% npm i
% npm run dev
```
だめでした。

次に以下のことをやりました。

- issue に書かれているバージョンに固定
- ついでに、@nuxt/typescript-runtime も入れておく

```
% npm i -D @nuxt/typescript-runtime@2.0.0
% npm i -D @nuxt/typescript-build@2.0.0
% rm -rf node_modules
% npm i
% npm run dev
```

動きました。。。

Nuxt.js の同じバージョンで何度もプロジェクトを作っていましたが、
今までこんなことはありませんでした。

すでに issue の方で対応済みのはずなのに、結局よくわからないまま。。
プログラミングに数学やCSは必要なのか？



僕自身は大したエンジニアではないのですが、一応エンジニアとして働いてお金をもらっているし、東工大生なので数学やCSについては学部レベルですが少しは学んでいるというような状態です。プログラミングに数学やCSってどの程度役に立っているのか自分の肌感程度ですがまとめました。
これからエンジニアを目指す方向けに書いていますが、「一人の意見」くらいに受け取って鵜呑みにしないでもらえると嬉しいです。

## 「仕様」を「コード」に変換するのに数学は使わない

プログラミングに数学とCSはいらないというのは正しい側面も持っているような気がします。というのも、プログラミングが「仕様」を「コード」に変換することだとしたら、数学もCSも使わないはずだからです。基本的にはライブラリの仕様とforとifくらいわかっていればコードはかけます。ここに学問的な思想は登場しません。研究室で書くコードのレベルでも実装フェーズになるとやるだけな気がします。
では、どのようなタイミングで、数学やCSを使うのか。
**それは、「要件」を「仕様」に変換するタイミング**だと思います。
しかし、個人開発のWebアプリケーションの開発をするくらいであれば、「要件」を「仕様」に変換するタイミングでも数学やコンピュータサイエンスについて全く勉強するつもりのない人でもこなすことができます。

つまり、エンジニアとして働く上で、数学にしろCSにしろ決して「MUST」ではないという認識を持っていいと思います。(機械学習エンジニアなどの職種ではMUSTです。)

## エンジニアが数学やCSを勉強する意味はない？

それは全くの間違いです。数学もCSも「できたほうがいい」です。
なぜなら、ものの仕組みがわかるようになってくると「簡潔にできるようになる」からです。コードの書き方はわかったけど、完全にはわかってないという人は、必ずなにかしらの形(サンプルコード)に乗っかる必要があります。めんどくさかろうが、期待する動作を得られなかろうがなんだろうがとりあえず、それをコピペすることしかできません。あとから問題のある部分をゴリゴリと別のジョブを立てたりして解決するしかなくなるんです。それが内側で何をやっているのかがわかってくると、より簡潔にやることができるようになるわけです。
そして、物事や現象の根底にあるものというのは、要件がどれだけ複雑になったとしても変わりません。
0→1開発の簡単な要件ならメソッドでパッとかけるで問題ないかもしれません。でも本当に重要で複雑な仕組みを作る際には、ライブラリのメソッドで終わりとかじゃないんです。
自分の書いたプログラムがどのように動作するのかを自分の言葉できちんと説明できるようになる必要があります。
じゃあ、そのライブラリの実装ではうまくいかなかったらどうするんですか？概念としてやりたいことや仕様がわかっていれば、自分で書くこともできます。何が問題で、何を解決する必要があるのかについて議論することもできます。そういうことができるようになる力を身につけなければいけないんです。勉強ってそういうものなんです。そのためには「数学」も「CS」も必要になる場合があります。

### プログラミングに数学をなぜ使うの？

一言で表すなら、「便利」だからです。別に言葉を使って頑張って説明してもいいけど、数式の方がわかりやすくて厳密だよねって感覚で使います。実際に、システムでも計算量とか情報量とかエントロピーとか様々なものを数式を使って定義しています。
なんでそんなに数式がわかりやすいかというと、この変数を増やしたらこの変数は減るなとか、出てきた数式を眺めると現象が活き活きと現れてくるからです。
数学をやっていると、普段無意識に言葉を話すようにスッと式を書くようになるし、スッと式が表す現象が読み取れるようになります。そして、極めて厳密です。だから、めちゃくちゃ便利なんです。
数学が苦手な方は、数式を計算式だと思っているような気がします。だから、読み取れないから言葉で説明してくれというような状態になってしまいます。
東工大のメンバーで議論するときは真逆になります。「言葉ではわからないから式を書いてくれ式を」ってよく言われます。つまり、数式自体が言葉なんです。だから、当然情報科学の分野でも数学は登場します。数学は極めて洗練された美しい言葉だから使われるのです。



## 理想と現実

ここで、現象をきっちりと語っていくことができるようになることを目標に勉強する必要があるという前提に立つわけです。 しかし、そうすると数学上の知識だったりちゃんとした証明が必要になったりするわけです。
その時に、「まず使ってみる」ということが大事になります。
「全部完璧に証明したり、全部完璧に現象を理解したりしなければ何一つ使えません」なんて言ってたら、**何一つ作れないで終わってしまいます**。何かをプログラムで実現するときは常にそうです。

少し思い出して欲しいのですが、高校2年生では、微分と積分の定義について習いますね。この時に「数はいくら細かく分けていってもその間にまだ要素はあるのか？」なんて考えている受験生はほとんどいないと思います。こういうのは、ほとんどの受験生が「事実を事実として受け入れる」という手段をとっているわけです。ところが大学に入学後はこう言ったことが受け入れるわけにはいかなくなってきます。このような順序で問題ありません。
つまり、今持っている知識をベースにして、理屈を展開していき、「ここはわからないな」という部分は念頭に置いて「受け入れる」ということをします。色々動かしてみて馴染むことから入り、他の知識が追いついて準備が整った、あるいは必要性に迫られたという段階でより詳しくみていけばいいということです。
微分積分や極限の概念を理解した後だからこそ、「有理数コーシー列」だの「有理数の稠密生」だの新しい概念に出会っても対応できるのではないかなと思います。

## 私には才能がないなんて言わないで 

とはいえ、「数学とCSについてすごく詳しくないと物の仕組みがわかるようにならないか」というとそれも必ずしもそうとは限らないと思います。Webやスマホの機能開発なら知ってると有利くらいでしかないと思います。

大事なのは、「どうせ実験してもわからないでしょう」とか「私には才能がないから」とか思わないことです。
そして、**「現象を実態を伴って理解しようとする」というスタンスを持ち続けることが大事**だと思います。
数学やコンピュータサイエンスの知識不足にコンプレックスを感じて、本質的なことから避けてしまうことこそがより本質的な問題になります。

最初は動かすところから始め、徐々に「きちっとわかる」ようにしていけば良いと思います。あなたの書いたプログラムは一つのプロセス上で動いていて、CPUクロックごとに命令が呼ばれて動いているという非常にシンプルな状態に必ず帰着できます。そういうものだからです。少しづつ基本的なことから実態を伴って理解できるようにしていけばきっとエンジニアとして活躍できるようになると思います。
リモートサーバーのファイルをAtomで編集したい（踏み台編）

## やりたいこと
SSH接続したリモートサーバーのファイルを、ローカルマシンのAtomで編集したい。
ただしリモートサーバーには踏み台越しじゃないとアクセスできない。

## 環境 & 構成図

構成図は以下の通り。
要するにリモートサーバーにはクライアントから直接アクセスできない環境（踏み台を経由する必要あり）。
繰り返しになるが、この環境で、ローカルマシンのAtomを使ってリモートサーバーのファイルを編集するのが今回の目的。

![Atomでリモートサーバーのファイルを編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/1f595909-15f7-2617-4f15-254614da72e5.png)

- 環境
    - リモートサーバー：Amazon Linux 2
    - 踏み台サーバー：Amazon Linux 2
    - ローカルマシン：Windows 10

## 使うもの

- Atom
    - ローカルマシンのエディタ
    - 拡張機能である"remote-sync"を使用
    - "remote-sync"のインストールについては[こちら](https://www.itcowork.co.jp/blog/?p=3207)を参照

- Tera Term
    - ローカルマシンのSSHクライアント
    - 踏み台サーバーに接続し、"remote-sync"のトラフィックをリモートサーバーへ転送するために使用

## やりかた

ざっくりこれだけ。

1. ローカルマシンから踏み台サーバーにSSH接続
1. SSHクライアントでSSH転送設定
1. remote-syncの接続先にlocalhostを設定

## 手順

### ローカルマシンから踏み台サーバーにSSH接続

Tera Termで踏み台サーバーにSSH接続。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/ac029a76-3e94-3f50-40b0-f008f25ca9f4.png)

手順を知りたい方は[こちら](https://dev.classmethod.jp/articles/aws-beginner-ec2-ssh/)。

### SSHクライアントでSSH転送設定

Tera Termでは次のように設定すればOK。

「設定」→「SSH転送」→「ポート転送」→「追加」で、以下の通り設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/04626165-d7b5-3dc1-7f8c-46f1a3a988d3.png)

- ローカルのポート：なんでもよいが、ウェルノウンポートは避けるのが無難。今回は10022とした。
- リモート側ホスト：リモートサーバーのプライベートIPアドレス。
- リッスン：空欄でOK。
- ポート：リモートサーバーの待機ポート。

これで、localhostの10022番ポートへの通信が、踏み台サーバーを経由してリモートサーバーへ転送されるようになる。

### remote-syncの接続先にlocalhostを設定

ここからはAtomの操作
リモートサーバーに転送したいファイルを含むディレクトリを右クリックし、「Remote Sync」→「Configure」を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/144e5f83-1e69-de13-f8ad-71f390c5b645.png)

「Configure」で以下の通り設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/2ea0cc03-af05-1067-8ec9-5725231db161.png)

- Hostname：localhost
- Port：10022（SSH転送で指定したローカルのポート）
- Target Directory：/home/ec2-user（ファイルを保存したいリモートサーバー上のディレクトリ）
- Ignore Paths：指定なし（ローカルのディレクトリ内で、リモートサーバーに転送しないファイルのパス）
- Username：ec2-user（リモートサーバーへのログインに使用するユーザー名）
- Keyfile Path：リモートサーバーへのSSH認証に使用する秘密鍵のパス
- uploadOnSave：チェックを入れると、ファイル保存と同時にリモートサーバーへアップロードする。

## 動作確認

適当なファイルを作成し、ローカルで保存する。
すると以下の通り、ファイルをアップロードしたよーというメッセージが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/faa577be-84ee-33d1-e96d-3f8850988d19.png)

一応、踏み台からリモートサーバーにSSH接続して確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679836/ad8f5a76-b194-4e89-2b9a-bc8660f1ba76.png)

ちゃんとファイルがアップロードされていることが確認できた。

## まとめ

ということで、踏み台経由でリモートサーバー上のファイルをAtomで編集できるように。
これでファイルのプライマリはGithubリポジトリに置いて、編集するときはローカルのAtomという構図がとりやすくなった。
Starshipをインストールする（Windows）


## Scoopをインストールする
[ScoopのGitリポジトリ](https://github.com/ScoopInstaller/Scoop)にインストール方法が記載されているのでそのまま実行する。

```:powershell
> Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

Initializing...
Downloading scoop...
Extracting...
Creating shim...
Downloading main bucket...
Extracting...
Adding ~\scoop\shims to your path.
'lastupdate' has been set to '2021-12-26T11:04:15.3605499+09:00'
Scoop was installed successfully!
Type 'scoop help' for instructions.
```

## Starshipをインストールする
[Starshipのサイト](https://starship.rs/ja-jp/guide/)にインストール方法が記載されているのでそのまま実行する。

```:powershell
> scoop install starship

Installing 'starship' (1.1.1) [64bit]
starship-x86_64-pc-windows-msvc.zip (2.5 MB) [================================================================] 100%
Checking hash of starship-x86_64-pc-windows-msvc.zip ... ok.
Extracting starship-x86_64-pc-windows-msvc.zip ... done.
Linking ~\scoop\apps\starship\current => ~\scoop\apps\starship\1.1.1
Creating shim for 'starship'.
'starship' (1.1.1) was installed successfully!
Notes
-----
Usage: Add 'Invoke-Expression (&starship init powershell)' to the end of your PowerShell $PROFILE.
Prerequisites: A Powerline font installed and enabled in your terminal.
'starship' suggests installing 'extras/vcredist2019'.
```

## PowerShellのプロファイルを設定する
Starshipのインストール時に`Usage: Add 'Invoke-Expression (&starship init powershell)' to the end of your PowerShell $PROFILE.`とあるので、その通りにプロファイルを編集する。

```:powershell
> Write-Output "Invoke-Expression (&starship init powershell)" | Add-Content $profile -Encoding Default
```

編集したプロファイルを適用する。

```:powershell
> . $profile
```
【SAP-C01試験対策】ハイブリットクラウドのまとめ

# はじめに

AWSのハイブリットクライドを学習したので内容をまとめます。

https://www.youtube.com/watch?v=PGyasNJ1QTQ

https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/VPC_VPN.html

# 背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。


# プライベート接続の三種類
- Client VPN：クライアントPCに暗号化ソフトをインストールしVPNでAWSのエンドポイントに接続
- Site-to-Site VPN：ネットワーク機器で暗号化しAWSのエンドポイントに接続
 - エンドポイントをVGW（仮想プライベートゲートウェイ）：一つのVPNに接続
 - エンドポイントをトランジットゲートウェイ：複数のVPCへ接続
- Direct Connect：インターネットを経由せずに閉域網でAWSのエンドポイントに接続

## Site-to-Site VPN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/a1c0e062-6d95-332e-624f-53f12b09e5c6.png)

### 用語
- VPN接続:オンプレミス機器とVPC間の接続。
- VPNトンネル: お客様ネットワークとAWSの間でデータを送受信できる[暗号化された](#IPsec)リンク。高可用性のため冗長化されている。
- カスタマーゲートウェイデバイス: Site-to-Site VPN 接続のユーザー側にあるデバイスまたはソフトウェア
- カスタマーゲートウェイ: カスタマーゲートウェイデバイスの情報をAWSに提供するAWSリソース。

### IPsec
- IPSecトンネル経由で送信されるデータの整合性を保持する。
- IPSecトンネルを経由して送信されるデータは暗号化される。
- IPSecはインターネット経由で送信中のデータを保護する。
- IPSecトンネルのセットアップ中にIDが認証される。

## Direct Connect
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/1f6b9086-eb01-c610-9626-dc0cb5607e40.png)

###仮想IFの三種類
- パブリックVIF：AWS全リージョンへのパブリックIPを介した接続
- プライベートVIF：VPCへのプライベートIPを介した接続
- トランジットVIF：Transit Gateway用のDirectConnectゲートウェイへ接続

※LAG（Link Aggregation Group）：複数のConnectionを集約し、一つの論理IFとして提供
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/5ce015fa-c5a9-10ad-0706-08dd582d259d.png)


### Direct Connect Gateway
- DirectConnect接続を複数リージョンのVPCに接続させる。
- 接続先のVPC間の接続は不可。必要な場合はリージョン内はTransitGatewayまたはPrivateLink、リージョンまたぎはVPCピアリングで対応する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/66e03380-fb2e-f158-74a0-b9f960fe04fa.png)
「サブネット化」の概要についてわかりやすく説明してみた

<h1>サブネット化とは？</h1>
サブネット化（またはサブネッティング）とは、
<b>1つのネットワークを複数の小さなネットワークに分割することです。</b>

ネットワークを分割することで、
<b>①セキュリティの向上
②ブロードキャストの制御
③IPアドレスの節約</b>
などのメリットがあります。

<h2>①セキュリティの向上</h2>
同一のネットワークに所属している端末は、スイッチングハブなどを介して
直接通信ができてしまいます。
社内の他の部署からは見られたくないデータがあったとしても、
見られてしまう可能性があります。
そこでネットワークを分けてルータを中継させることで、
アクセスを制限することができます。

<h2>②ブロードキャストの制御</h2>
1つのネットワーク内に大量の端末が存在すると、
ブロードキャストのパケットが通信に影響することがあります。
そういった影響を、分割することで減らすことができます。
ルータはブロードキャストを通さないため、
ブロードキャストの届く範囲を制限できます。

<h2>③IPアドレスの節約</h2>
アドレスの無駄を減らす点で見ると、
例えばクラスCのIPアドレスを割り当てられたネットワークがあるとします。
![7D774D83-105C-47F3-96A5-660BFE44B311_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/256e73d7-92e2-4806-1821-793ae9da09c0.jpeg)

この場合、最大254個のホストを接続できますが、
接続するホスト数がそれより遥かに少ない場合、
多くのアドレスが使われず無駄になってしまいます。
![スクリーンショット 2021-12-26 9.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/b316c2c3-e070-3c98-9b4b-20cce97ace4d.png)
このような場合、サブネット化によりネットワークを分割すると、
それぞれのネットワーク上で無駄になるアドレスが減ることになります。

<h1>サブネット化の例</h1>
サブネット化には、サブネットマスクが大きく関わります。

IPアドレスは、基本的にネットワーク部とホスト部で構成されています。
サブネット化をする際は、クラスに基づいたIPアドレスのホスト部の一部を
サブネット部とします。
結果、元のネットワーク部とサブネット部を合わせた部分がネットワーク部とみなされます。
ネットワーク部とホスト部の境界を右にずらした形となります。
![スクリーンショット 2021-12-26 9.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/0c51066f-4a8a-1d50-b443-c6944535146c.png)

<hr>

<h1>参考文献</h1>
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313433303531392f63616137346666652d366561332d313161622d363732332d3565386239633366653536622e6a706567.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/311cfad0-d754-ab75-4d0a-adf5e571b591.jpeg)
<a href="https://www.amazon.co.jp/gp/product/B087JKL1JH/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1">シスコ技術者認定教科書 CCNA 完全合格テキスト＆問題集</a>
Tidymodelsによる機械学習を学ぶ(1) お手軽RandomForest篇

## はじめに

機械学習ライブラリといえばPythonのsklearnがスタンダードで、RのcaretがRユーザーの中で細々と使用されているというイメージを持っていました。

ところが、近年になって登場したtidymodelsが強力であるという噂を聞きつけ、素人データ屋を脱却すべくtidymodelsの使用方法について調べてみました。特に難しいことは考えず、お手軽にサクッとやってしまいます。

## 方針

1. irisデータのspeciesをホールドアウト法の枠組みのもとRandom Forestで予測する。
1. 10分割交差検証でRandom Forestのパラメータをチューニングする。

## データを準備する

### パッケージをインストール

まとめてドサッと入れてしまいます。

```r
library(MASS)
library(tidymodels)
library(ISLR)
library(magrittr)
```

### データを用意、分割

使用データはおなじみiris君です。80%をtrain, 20%をtestにしました。(ホールドアウト)

```r
df <- iris
ini_spl <- initial_split(df, prop = 0.8) # ホールドアウト分割
df_train <- training(ini_spl) # トレーニングデータ
df_test <- testing(ini_spl)   # テストデータ
```

## 特徴量エンジニアリング

recipeは様々な特徴量エンジニアリングを行うことができる。。。らしいのですが、面倒くさいので「speciesを他の変数で説明・予測するよ」という構造だけ定義してあげます。シンプル！

```r
rec <- recipe(Species ~ ., data = df_train)
```

## 機械学習モデルの設定

ここは説明が必要な部分かもしれません。TidymodelsはRの各種パッケージをまとめて使いやすくしたものとなっています。

`set_engine('randomForest')`でRの`randomForest`パッケージを使用することを定義しています。`rand_forest`は`randomForest`パッケージの関数です。

また、`tune()`は「これからチューニングするよ」という意味になっています。

```r
model1_tune <-
  rand_forest(mtry = tune(), min_n = tune(), trees = tune()) %>%
  set_engine('randomForest') %>%
  set_mode('classification')
```
## ワークフローの作成

特徴量エンジニアリング（つーか変数の構造）と学習モデルを合わせて一つのワークフローにします。

```r
model1_tune_wf <- workflow() %>%
  add_recipe(rec) %>%
  add_model(model1_tune)
```

## パラメータチューニング

tune_grid関数を用いてグリッドサーチによるパラメータチューニングを行います。tune_grid関数は **パラメータ候補を自動的に用意してくれる** ようです。（ここでは20個用意せよと指定しました）

```r
trees_folds <- vfold_cv(df_train)

tune_spec <- tune_grid(
  model1_tune_wf,
  resamples = trees_folds,
  grid  = 20
)
```
最適パラメータを選択します。ここでは`roc_auc`という指標で選択しました。

```r
best_para <- tune_spec %>%
  select_best("roc_auc")
```

## ベストモデルの作成

`model1_tune` をベストパラメータで更新し、ワークフローを再度設定、`ini_spl` に適用します。

```r
model1_final <- finalize_model(
  model1_tune,
  best_para
)

model1_final_wf <- workflow() %>%
  add_recipe(rec) %>%
  add_model(model1_final)

model1_res <- model1_final_wf %>%
  last_fit(ini_spl)
```
## 予測精度の確認
```r
model1_res %>%
  collect_metrics()
```

```
# A tibble: 2 x 4
  .metric  .estimator .estimate .config             
  <chr>    <chr>          <dbl> <chr>               
1 accuracy multiclass     0.967 Preprocessor1_Model1
2 roc_auc  hand_till      1     Preprocessor1_Model1
```

それなりに予測できていました。

## 参考文献

- https://juliasilge.com/blog/sf-trees-random-tuning/  
  (tidymodels開発者のJulia Silge氏のブログ。作業手順・コーディングはこの記事に準拠しつつ、本 Qiita 投稿では新たにirisデータに適用したかたちとなっています / I followed the analysis and coding procedures described in this blog, and applied the iris data to them.)

## おススメ講座

初めてtidymodelsに触れたのはshunさんのtidymodels講座です。非常に網羅的かつ詳細な説明で勉強になりました。

https://www.udemy.com/share/105ozu3@V4afT6vJWRoD4oEOD0I-3o0JmFNzJr67Hs2RvH0VKlandtEyKLVUIK3FivxwuHTxtA==/
Dynamics 365 Finance and Operations ~ Power Appsを活用する④ ~

[前回](https://qiita.com/TaichiKayama/items/c4f2a971653a51512654)、FO の発注書画面の補助アプリとして「発注追跡」なるPower Apps アプリを作成しましたが、今日はそのアプリを少しリッチにしようと、マップを埋め込んでみようと思います。

① 動的なマップコントロールができる機能があるようなので、これを使ってみたいと思います。この機能は追加設定しないといけませんので、[こちら](https://qiita.com/h-nagao/items/0853240d3eda7adff548)の方のブログを参考に設定してみました。ありがとうございます。

② マップを埋め込みます。緯度と経度のデータを連携することで、マップのピンが正しい場所に打点されるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/43fb4d9b-982f-919a-171f-39e5815a7ab3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/d2bbb513-3ad5-8690-5748-292eb803762f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/35c5953c-9696-0db4-de57-aaa92367ca7d.png)

③ あとは、状態遷移（ステータス）もこんな感じで見やすくするのもアリですね。これもIF文で簡単にできるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/57672e01-49df-f9d9-d2f4-2d85d6d81688.png)

公式Docsのサンプルにも同じような感じのアプリを作っていましたね笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/09b5fda8-0e90-7a26-be03-febc06f8b1e1.png)

https://docs.microsoft.com/ja-jp/business-applications-release-notes/April18/dynamics365-finance-operations/embedding-powerapps-workspaces-forms
速攻でオートロードがしたいです......


# Composerを使ってオートロードする

PHPでオートロードするにはComposerが必要なので、まだインストールされてなければ
・Windowsをお使いの方は[こちら](https://weblabo.oscasierra.net/php-composer-windows-install/)
・Macをお使いの方は[こちら](https://qiita.com/tomk79/items/e6e1db94ea8b661b1e86)
を参考にしてインストールを行ってください。


まずはプロジェクトのルートディレクトリにcomposer.jsonファイルを作成します。
そして以下の内容を記述します

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "./"
        }
    }
}
```
[PSR-4](https://www.php-fig.org/psr/psr-4/)のルールに従い、現在のディレクトリ(composer.jsonを作成した階層)をトップレベルの`名前空間 App\`として、ルートディレクトリ配下のApp\から始まる名前空間のクラスやインターフェースをオートロードしてくれる設定です。

ターミナルでcomposer.jsonのあるディレクトリまで移動し`composer dump-autoload` コマンドを実行します。

するとvendorディレクトリが作成され、autoload.phpが生成されます。
これで`vendor/autoload.php` をインクルードするだけでオートロードしてくれます。
あとはuseでクラスに指定してある名前空間の完全修飾名を指定してあげれば、クラスを定義しているファイルをインクルードしなくても使えるようになります。

```php:sample.php
<?php
require_once `vendor/autoload.php`;

use App\Sample\MyClass;
// 名前空間 App\Sample\　配下のMyClassクラスをオートロード
```

##クラス以外のファイルのオートロード

また、関数を定義してあるファイルなど、クラスやインターフェース以外のファイルもオートロードしたいといった場合には

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "./"
        },
        "files": [
            "sample/function.php"
        ]
    }
}
```
`"files[ ]"`にルートディレクトリから、オートロードしたいファイルまでのパスを記述することでオートロードすることができます。

上記のようにしてcomposer.jsonを更新した際にはターミナルで`composer update`コマンドを実行して内容を更新してください。
Macの日本語入力でカタカナ変換するときはoption+x を使おう

- control+K だと別の動作が割り当てられてうまく動かないことがあるため。
- F7キーは押しにくいため

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/5ec5456d-b7b6-c4c1-c46f-0d1165df0df0.png)











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DebianでのRisa/Asirインストール

Debianパッケージ情報を ```/etc/apt/sources.list.d/``` にファイルとして保存

- [Debian package for amd64](http://www.math.kobe-u.ac.jp/OpenXM/Current/index.html#apt)

```shell-session
$ sudo vim /etc/apt/sources.list.d/asir.list
$ sudo cat /etc/apt/sources.list.d/asir.list
deb http://www.math.kobe-u.ac.jp/deb2/ unstable/
deb http://www.math.kobe-u.ac.jp/deb2/ mathlibre2020/
```

- [Debian package for amd64](http://www.math.kobe-u.ac.jp/OpenXM/Current/index.html#apt)
  - 上記URLにある公開鍵をDLして~/Downloads以下に保存する想定

```shell-session
$ sudo apt-key add ~/Downloads/mathlibre.pub 
$ sudo apt-key add ~/Downloads/debian-math.kobe-u.ac.jp.pub 

$ sudo apt-get update
$ sudo apt-get install openxm
```

起動!

```shell
$ asir
This is Risa/Asir, full GMP Version 20210326 (Kobe Distribution).
Copyright (C) 1994-2000, all rights reserved, FUJITSU LABORATORIES LIMITED.
Copyright 2000-2021, Risa/Asir committers, http://www.openxm.org/.
GC 7.6.12 copyright 1988-2018, H-J. Boehm, A. J. Demers, Xerox, SGI, HP, I. Maidanski.
Debug windows of ox servers will not be opened. Set Xm_noX=0 to open it.
OpenXM/Risa/Asir-Contrib $Revision: 1.157 $ (20200320), Copyright 2000-2019, OpenXM.org committers
helph(); [html help], ox_help(0); ox_help("keyword"); ox_grep("keyword");
     for help messages (unix version only).
http://www.math.kobe-u.ac.jp/OpenXM/Current/doc/index-doc.html
```
neosでlogix その41

# 概要

niosでlogixやってみる。
練習問題、やってみる。
構想編。

# 練習問題

cpuを実装せよ。  
１から１００まで、数えよ。

# 方針

レジスタマシンを作る。
機能毎に、実装する。

# 命令セット

命令セットを作る。

|code|ニーモニック|動作|
|:--|:--|:--|
|0| nop 		|	- |
|1| ifc adr 	|	if (c > 0) pc = adr |
|2| ldb i 	|	b = i |
|3| ldc i 	|	c = i |
|4| inc 		|	b = b + 1 |
|5| sub 		|	c = c - 1 |
|6| out 		|	tostr b |


# １から１００まで、数える。

```
  ldb 0
  ldc 100
loop:
  inc
  out
  sub
  ifc loop
  nop
```

# ハンドアセンブル

```
2 0
3 100
4 0
6 0
5 0
1 2
0 0

```

# プログラムカウンタ部

- 入力

パルス、行番号

- 出力

パルス、プログラムカウンタ

- 動作

タイマーでプログラムカウンタをインクリメント

- node

timer, write, int

# ROM部

- 入力

パルス、プログラムカウンタ

- 出力

パルス、オペコード、オペランド

- 動作

プログラムカウンタの示すＲＯＭ内容を命令デコードして出力する

- node

multiprexer

# 実行、レジスタ部

- 入力

パルス、オペコード、オペランド

- 出力

パルス、ｃレジスタ、パルス、行番号

- 動作

命令を実行する

- node

demultiprexer, int, write, +, -.

# アウト、表示部

- 入力

パルス、ｃレジスタ

- 出力

なし

- 動作

ｃレジスタの値を文字にして表示する

- node

write, tostr, string

以上。
fmt.Printfは中身をstringしないとエラーになる

go言語でfmt.Printfを扱う時にint型を表示しようとしてエラー出してしまうので、備忘録


```go

package main

import (
	"fmt"
	"strconv"
)

func main() {

	var s string = "5"
        // int型に変換
	i, _ := strconv.Atoi(s)

	fmt.Printf(i)  # こちらはエラーになる
	// fmt.Printf("%v", i) # こちらはエラーにならない

}

```

実行結果

```

# command-line-arguments
.\main.go:17:12: cannot use i (type int) as type string in argument to fmt.Printf   

```
Databricksにてデータ オブジェクトの特権と動的ビュー関数（行レベルセキュリティ、列レベルセキュリティ）に関する検証

## 概要
Databricksにてデータ オブジェクトの特権と動的ビュー関数（行レベルセキュリティ、列レベルセキュリティ）に関する検証を実施した際のノートブックを共有します。

Databricksにて実施可能なデータストアシステムへの権限付与項目、あるいは、データへの権限付与項目を、下記表に示します。

| 分類                             | 権限付与項目                                                 | 可否 | 実施方法                                        |
| -------------------------------- | ------------------------------------------------------------ | ---- | ----------------------------------------------- |
| データストアシステムへの権限付与 | SQL命令（DDL、DCL）相当に対する実行の権限付与                | 〇   | `CREATE`権限、あるいは、`OWNER`権限を付与する。 |
| データストアシステムへの権限付与 | オブジェクト（スキーマ）一覧の閲覧の権限付与                 | 〇   | `USAGE`権限と`SELECT`権限を付与する。           |
| データストアシステムへの権限付与 | データ参照の権限付与                                         | 〇   | `USAGE`権限と`SELECT`権限を付与する。           |
| データストアシステムへの権限付与 | データ挿入・更新・削除の権限付与                             | 〇   | `MODIFY`権限を付与する。                        |
| データへの権限付与               | ルールベースによる行レベルセキュリティ                       | 〇   | 動的ビュー関数を利用。                          |
| データへの権限付与               | データ権限（認可）テーブルを利用した行レベルセキュリティ     | 〇   | 動的ビュー関数を利用。                          |
| データへの権限付与               | 列への参照権限付与による列レベルセキュリティ                 | ×    |                                                 |
| データへの権限付与               | 動的データマスキングによる列レベルセキュリティ（ルールベース） | 〇   | 動的ビュー関数を利用。                          |
| データへの権限付与               | 動的データマスキングによる列レベルセキュリティ（データ権限（認可）テーブル） | 〇   | 動的ビュー関数を利用。                          |


下記を事前に実施する必要があります。<br>
 
1. ワークスペースレベルでのテーブルアクセス制御を有効にすること<br>
2. クラスター作成権限を拒否して、テーブルアクセス制御が有効なクラスターのみ利用するように設定すること<br>
3. `SELECT ON ANY FILE`権限を拒否すること<br>

下記の実行を許容する場合には、`USAGE`と`SELECT`だけでなく、`READ_METADATA`も許可する必要があります。<br>

1. `EXPLAIN`<br>
2. `DESCRIBE TABLE`<br>
3. `SHOW CREATE TABLE `<br>
 

データストア（データ分析基盤）におけるデータへの権限付与（認可、アクセス制御）の詳細については、下記の記事で整理しております。

https://qiita.com/manabian/items/ad7c5927817e7d76be0b

## ノートブックについて
ノートブックをGithub Pagesに公開しておりますので、詳細はそちらのノートブックで確認してください。
`01_configure_data_object_privileges`にてデータへの権限付与の実施と管理者による実行結果の表示を、`02_read_from_database_with_data_object_privileges`にてデータへの接続が制限されているユーザーの実行結果の表示を実施しております。前者と後者のノートブックを比較しながら、どのような結果となっているかご確認ください。

- [01_configure_data_object_privileges](https://manabian-.github.io/databricks_tecks_for_qiita/#data_object_privileges_test/01_configure_data_object_privileges.html)
- [02_read_from_database_with_data_object_privileges](https://manabian-.github.io/databricks_tecks_for_qiita/data_object_privileges_test/02_read_from_database_with_data_object_privileges.html)

## 参考リンク

- [クラスターのテーブル アクセス制御を有効にする - Azure Databricks | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/security/access-control/table-acls/table-acl)
- [データ オブジェクトの特権 - Azure Databricks | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/security/access-control/table-acls/object-privileges)
- [ワークスペースのテーブルアクセス制御を有効にする-Azure Databricks | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/administration-guide/access-control/table-acl)
文字コードは奥が深そう,おもしろそう

- 16進数で表現
hexdump

- 文字コードを変換
nkf

## なぜ「縺」と文字化けするのか
あ　→（UTFー８）　E3　81　82
縺　→　（shift-jis）E3 81
で81までがかぶってしまうため。
データベース設計においてのインデックスの仕組み

# 結論

```
「テーブルとは別に検索ように最適化された状態のデータ」
```

データベースの性能を向上させる方法の一つです。

「探すレコードを識別するデータの項目」
「対象レコードの格納位置を示すポインタ」
で構成されており、これを利用してデータの格納位置を特定し、その位置を直接アクセスする事で、表の検索速度を上げることができます。


###Rubyにはindexメソッドがあります。

##indexメソッドの使い方


```
オブジェクト.index(“検索したい部分文字列”)
配列の場合は、配列.index(“検索したい配列の要素”)
両者とも見つからない場合はnilが返す。
```

## 終わりに
初学者です。理解しておくべき事と思い記録しました。
実際に使ったことがないので浅い知識だと思いますが、
また使ってみて、わかりやすく説明できたらと思います。
プログラマーになりたいあなたへ

# はじめに
<!-- 発端や概要を記載 -->
先日、高校生のなりたい職業がプログラマーであるとの記事を読んで、プログラマーになるだけならすごく簡単だよとということを伝えるべく記事を起こした。プログラミングというのは難しいとっつきにくいとの印象があるが、実はそうではない。平たく言えば、機械に命令して、作業を肩代わりしてもらう手順書を作成しているようなもんである。小さい子に夕飯のおつかいを頼むのにメモ書きを渡すようなもの。ドラマや映画のスーパーハッカーのように達するには相当の努力というかいろんなコンピュータの作法を頭に叩き込む必要はあるだろうが、彼らも最初からスーパーハッカーだったわけでないはずだ（多分）。その多くは、パソコンの画面に文字を表示させるという単純なプログラムを組んできたのではないだろうか。そこで、今回は、プログラミングの知識がない高校生がプログラミングが以下に簡単なものかということを体感していただければと思う。
https://www.itmedia.co.jp/news/articles/2112/24/news111.html

# 目次
<!-- タイトルとアンカー名を編集 -->
1. Windowsでの初めてのプログラミング
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Windowsでの初めてのプログラミング
そうだ、固いことを言わずに学校などで使われるWindows10で事前準備なしでプログラミングしてみよう。そう、これができればもうあなたはプログラマーだ。  
まず初めに、windowsの画面の右下にここに入力して検索の画面に「ここに入力して検索」という枠がある。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381513/f4aa3bd8-fdcc-78e8-9d30-311d04a3aee8.png)  
この枠に cmd と入力してみよう。するともっとも一致する検索結果のところにコマンドプロンプトというアプリが表示されるはずだ。それを選択し立ち上げてみよう。すると下のような黒画面がでてくるはずだ。そう、テレビで見たことがある天才プログラマーがピコピコ文字を打っている画面である。ここまでくれば、もうあなたは半分プログラマーになりかけている。あと一息だ。


![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381513/959cbc64-78bb-8118-6b4a-4bc2704ca90f.png)

プログラミングの世界では、コントロールしたい機器の画面に"Hello world!"と表示させるということができれば、まずは入門完了とされている(多分)。ということで、これからあなたはwindows10に命令を下し、この黒い画面に"Hello world!"と表示させてみよう。以下の文字列を黒い画面に入力してみよう。おっと、Enterキーを押すのは待ってくれ、全部半角で入力できているか確認しよう。全角文字が入っていたら動かないぞ。スペースも半角だ。確認ができたら、Enterキーを押そう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381513/f234489a-694a-08df-e662-0f67fe3abd6d.png)

以下のようにあなたが打った文字のしたに"Hello world!"と表示されれば完璧だ。そうもうあなたは、あなたのwindows10に命令を下し、黒い画面に"Hello world!"という表示を表示させることができたのである。これは立派なプログラマーの一員ではないか。これが何に役に立つかって？今回はechoという命令しか使わなかったが、ほかのアプリを起動したり、ファイルをフォルダーからフォルダーにコピーしたり、使い方はググれば無限大にある。あなたがマウスでポチポチしていた作業を天才ハッカーは想像力を働かせ、このような命令文を駆使し、様々なことをやってのけているだけである。この黒い画面を立ち上げた段階でもうあなたは自分のパソコンの制御を手中に収めている、すなわちもはや自分のパソコンをハックしているといっても過言ではない(言い過ぎ)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381513/0b0ead03-3096-1286-4a7f-b0c78fa7bb6c.png)

<a id="#Chapter2"></a>
# おわりに
今回はwindowsに最初から入っている機能を使ってプログラマーの入門をしてみた。またの機会に、AIを構築するうえで非常に相性がよく、将来性のあるプログラミング言語と呼ばれるpythonのHello worldについても書いてみたいと思う。

<a id="#reference"></a>
# 参考文献
- [Hello world](https://ja.wikipedia.org/wiki/Hello_world)
- [コマンドプロンプトを使った](https://somachob.com/bat-open-folder/)
高階関数とコールバック関数の違い

# はじめに
高階関数とコールバック関数の違いについて整理したいと思います。

# 定義
**高階関数**:他の関数を引数として受け取る関数
**コールバック関数**:高階関数に引数として渡される関数

# 具体例
```javascript:main.js

const calc = (x,y) => {
  return x + y;
}

const sum = (x,y,calc) => {
  const total = calc(x, y)
  console.log(`合計値は${total}です`);
  // 合計値は30です
}

sum(10,20,calc)

```

上記の定義と照らし合わせると、sum関数はcalc関数を引数として受け取る関数なので高階関数となり、calc関数は高階関数であるsum関数に引数として渡されているのでコールバック関数となります。

# さいごに
何か間違いなどがあればご指摘していただけるとありがたいです。

# 参考
https://www.javadrive.jp/javascript/function/index16.html#section1
go チャネルから送る値がなくなっても チャネルから値を繰り返し受信し続けることによるエラーの確認。


closeしない場合のエラー内容確認


```go

package main

import "fmt"

func routine1(int_slice []int, channel_kun chan int) {
	sum := 0
	for _, v := range int_slice {
		sum += v
		channel_kun <- sum
	}
	// close(channel_kun)
}

func main() {
	int_slice := []int{1, 2, 3, 4, 5}
	channel_kun := make(chan int, len(int_slice))
	go routine1(int_slice, channel_kun)
	for i := range channel_kun {
		fmt.Println(i)
	}
}


```

実行結果

```

1
3
6
10
15
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        C:/Users/addre/dev/go_channel_close/main.go:18 +0x145
exit status 2

```

## 結論
分かりずらい。
とりあえずrangeの行でエラーが出ている時は、channelがcloseしてないということを疑えば良いかな...
【Salesforce】テキスト型の日時情報から日付/時間の数式を作成する方法

日付と時間が別々のテキスト型としてあるときに、それらを結合して時差も考慮した日付/時間の数式を作成してみました。

#前提
* yyyyMMddとして入るテキスト型項目（testdate__c）
- hhmmssとして入るテキスト型項目（testtime__c）
- 値は日本標準時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/0fd5fc6f-0fb5-c8d3-1479-7f67bf1e6900.png)


#作成方法
戻り値が日付/時間の数式項目を下記の数式を参考に作成します。
値を日付/時間のフォーマットに合うように加工してあげます。
加工しただけだと時差分ずれてしまうので、最後の「- (9/24)」で修正しています。

```
DATETIMEVALUE(
    LEFT(testdate__c, 4) & "-" & MID(testdate__c,5,2) & "-" & RIGHT(testdate__c,2)
    & " "
    & LEFT(testtime__c, 2) & ":" & MID(testtime__c,3,2) & ":" & RIGHT(testtime__c,2)
) - (9/24)
```
時差を考慮した日付/時間の数式項目が作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2003505/eb37de32-84a6-fdb6-cdab-f4267cee789f.png)
ビッグデータ分析基盤構築の初歩【Azure】

この記事では、Azureをベースに「ビッグデータの分析基盤を作りたいけど、どう作ったらよいかわからない」という人のために、基盤構築の基本としてビッグデータの定義や、ビッグデータ基盤の構築方法などのビッグデータ分析基盤の基礎に加え、構築の際に抑えておくべき3つのポイントを紹介します。

## そもそもビッグデータとは?
ガートナーのアナリスト、ダグ・レイニーによると、ビッグデータの特性としてボリューム（データ量）、速度（入出力データの速度）、バラエティ（データの種類t囲）があると定義しており、一般的にはこの３Vの要素を備えるデータをビッグデータと呼びます。

- High Velocity(高頻度)
- High Variety(様々なデータ)
- High Volume(大容量)

https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF#cite_note-25

## ビッグデータ処理基盤構築における２つのアプローチ
**Schema on Write**

- 従来型のアプローチ
- データを抽出・加工してからデータウェアハウス(統合的な分析用に時系列・目的別に整理されたデータ)に保存
- データウェアハウスのデータをもとにレポートやダッシュボードの作成

**Schema on Read**

- ビッグデータの利用拡大によって、主流になりつつあるアプローチ
- データの処理頻度でデータフローを分ける
- データ形式によらず蓄積
- 用途に応じて、利用時にデータを加工

## ビッグデータ処理基盤構築における３つのポイント
### 適切なアプローチの採用
将来あらゆるデータ分析に対応するため極力生データで保存し、利用時にスキーマ、データ構造を定義して読み出す方法です。従来のSchema on writeとの違いは以下のとおりです。

|  Schema on Write  |  Schema on Read  |
| ---- | ---- |
|  ユーザーの活用シナリオを想定してスキーマを定義  |  将来あらゆるデータ分析に対応するため極力生データで保存 |
|  ETL(抽出・変換・保存)でデータ抽出  |  利用時にスキーマ、データ構造を定義  |
|  シナリオ外のデータは埋没. |    |

どちらを選ぶべきかは扱うデータや用途によりますが、Schema on Readにすることで、保存するデータサイズも抑えられ、想定外のユースケースにも対応可能となるなどの利点が考えられます。

ただし、データ取得時に毎回データを加工する必要があるため、通信コストが増大したり、データの受け取り側の処理が煩雑化するなどの欠点もあることに注意が必要です。

一見Schema on Writeのほうが理にかなっているようにも思えますが、今後長期間に渡って利用するのであれば、拡張性の高いSchema on Readを選ぶのが得策に思えます。

### 適切なプラットフォームの選択
|オンプレミス|	PaaS|
| -- | -- |
|汎用性を重視する必要がある|	部分的な機能拡張が可能|
|部分的な需要増加に対して全体を拡張する必要がある|	要求に応じてサービスの選択、細分化が可能|
| |	新機能・新技術を導入しやすい|

### データ処理頻度に応じたサービスの選定
リアルタイムに大量のデータ処理が必要であれば、Stream Analyticsのようなリアルタイム処理に対応したサービスを使い、バッチ処理でも問題なければ、直接ストレージに保存してから分析をするといったように、データの処理頻度によって構成も変わってきます。

データの経路をコールドパスとウォームパスに分けるLambda Architectureや、その他Kappa Architectureなどの考え方も参考になります。詳細はMicrosoftのビッグデータアーキテクチャを参照してください。

https://docs.microsoft.com/ja-jp/azure/architecture/data-guide/big-data/

## まとめ

最適なビッグデータ処理基盤構成は、用途や規模などによって異なるため、各種Azureサービスの概要や特徴を把握した上で構成を練っていく必要があります。

Azureサービスの種類は多く、似たようなサービスがもありますので、まずは上述した内容を頭に入れつつ、まずは各種サービスについて把握することから始めてみることをおすすめします。サービスの内容については、[Microsoftの開発者向け年次カンファレンスde:code2020の公開資料](https://www.microsoft.com/ja-jp/events/decode/2020session/search.aspx)などでがわかりやすいため、Azureの公式ドキュメントと併用すると理解の手助けになると思います。
まだWEBAPIを使ったことがないので少し知識を入れてみる

## RESTAPIとは
RESTとはアーキテクチャスタイルのこと。
RESTによる実装例の一つがWEB。
構成する要素が6つある。
・クライアント・サーバ
・ステートレス・サーバ
・キャッシュ
・統一インターフェース
・階層化システム
・コードオンデマンド

## URIフラグメントとは
WEBページ内部の位置を示す。
＃以下で表す
例；https://momotech-school.com/#trial

## URIと文字
URIではASCII文字が使える
・アルファベット
・記号
・数字
※日本語は使えない
→のでエンコーディングしてあげる必要がある

## クールURI設計方法
①プログラミング情報に依存した情報は含めない
例；ファイル拡張子、開発用ディレクトリ
※小文字が望ましい
②メソッド名やセッションIDは含めない
③リソースを指し示す名詞を指定する
④バージョン番号を含める
⑤他言語拡張子を入れる

## URIの変更方法
301リダイレクト：恒久的なURI
302リダイレクト：一時的なURI
※SEOを引き継ぐことができる
WSL2でDocker やるときに気を付けること



## tl;dr;

Docker Desktop for Windows から WSL2のUbuntu20.04環境上でのDockerに切り替えた際に結構ハマったのでその忘備録にメモ

## `/etc/resolv.conf `に `nameserver 8.8.8.8` を追記する

コンテナ環境内で `npm install` を使用したとき、

```bash
npm ERR! code EAI_AGAIN
npm ERR! syscall getaddrinfo
npm ERR! errno EAI_AGAIN
npm ERR! request to https://registry.npmjs.org/autoprefixer failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org
```

な感じでエラーが出た。
どうもDNS解決ができなくてハマっていたらしい。
原因は [この記事](https://qiita.com/kkato233/items/1fc71bde5a6d94f1b982) にあるように WSL環境のnameserver設定がおかしくなっていることがあるようだ。

対策として、`/etc/resolv.conf `に `nameserver 8.8.8.8` を追記する

## コンテナ環境のIPアドレスを参照しておく

コンテナ内のサーバーにアクセスしようとして`localhost:{port}`でアクセスしようとしたら接続できなくてハマった。
原因は上のリンクにもある通り、WSL2に仮想ネットワークアドレスが割り振られるため。

WSL2のシェルで` hostname -I` などでIPアドレスを確認して`localhost`の代わりに使用する
ほかの方法としては、
未検証だが[WSL2で起動したサーバーに外部の端末からアクセスする](https://gunmagisgeek.com/blog/other/7171)方法もあるようだ
プログラマー孔子「名不正則言不順」

チームメンバーの子路(しろ)がプログラマー孔子に尋ねました
「衛ＰＭが先生をお迎えして炎上を収めるとしたら、先生はまず何をなさいますか？」
プログラマー孔子は、
「まず変数名を正すつもりだ。」
と答えられました。それを聞いた子路が、
「これだから先生は、本当に遠回りがお好きですね。どうして変数名を正す必要がありますか？」
と言ったので、孔子は
「名が正しくなければ変数も関数もメソッドもクラスも順当ではなく、変数も関数もメソッドもクラスも順当でなければ進捗もあがらず、進捗があがらなければ設計やリファクタリングも盛んにならず、設計やリファクタリングが盛んでなければ炎上もぴったり収らず、炎上がぴったり収らければチームメンバーは{心理的安全性が無くて}キーボードとマウスの置きどころもなくなる。だからプログラマーは正しい名をつけたらきっとコードで伝わるし、コードで伝わったらきっと炎上が収まるようにする。プログラマーは自分の名付けについては決していいかげんにしないものだよ。」

## 漢文
>子路曰、衛君待子而爲政、子將奚先、子曰、必也正名乎、子路曰、有是哉、子之迂也、奚其正、子曰、野哉由也、君子於其所不知、蓋闕如也、名不正則言不順、 言不順則事不成、事不成則禮樂不興、禮樂不興則刑罰不中、刑罰不中則民無所措手足、故君子名之必可言也、言之必可行也、君子於其言、無所苟而已矣。

## 現代語訳
>名が正しくなければことばも順当でなく、ことばが順当でなければ仕事もできあがらず、仕事ができあがらなければ儀礼や音楽も盛んにならず、儀礼や音楽が盛んでなければ刑罰もぴったりゆかず、刑罰がぴったりゆかなければ人民は{不安で}手足のおきどころもなくなる。だから君子は名をつけたらきっとことばで言えるし、ことばで言ったらきっと実行できるようにする。君子は自分のことばについては決していいかげんにしないものだよ。（『論語』（岩波文庫）金谷治訳注）

## リーダブルコード
- 2章　名前に情報を詰め込む
- 3章　誤解されない名前


## ポエム
現代のプログラマーは、昔だったらどんな仕事をしていたか考えていたのですが
ふとリーダブルコードと論語がひらめいて
春秋戦国時代の諸子百家みたいな人達だったかもしれないと思いました
【SAP-C01試験対策】デプロイ方式のまとめ

# はじめに
AWSのデプロイ方式について公式ドキュメントを参考に学習したので内容をまとめます。

https://www.slideshare.net/AmazonWebServicesJapan/awswebinaraws-54198407

https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-aws-elastic-beanstalk

https://d0.awsstatic.com/whitepapers/overview-of-deployment-options-on-aws.pdf

https://docs.aws.amazon.com/ja_jp/whitepapers/latest/overview-deployment-options/aws-cloudformation.html



# 背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。


# デプロイ戦略
- In place：既存のインスタンスに新しいバージョンをデプロイする
 - All at Once：一気に更新
 - Rolling：数台ずつ更新
 - Rolling with additional Batch：Rollingに加え新規インスタンスを追加して台数を維持
- Blue/Green：新しいインスタンスに新しいバージョンをデプロイして切り替える
 - Rolling with additional Batch：同上
 - Immutable：新しい環境のリリース後、ヘルスチェックをしロードバランシングを切り替える
 - URL SWAP、Route53：新しい環境のリリース後、環境を切り替える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/382ef09f-8bf8-ead9-d9e4-0779a4d602ab.png)


# デプロイ用のサービス
1. Elastic Beanstalk：アプリケーションの新しいバージョンを実行する環境を作成。URL SWAPが可能。
1. Opsorks ：ChefやPuffetを利用してアプリケーションの更新と展開をサポート。All at Onceのみ可能。
1. Cloud Formation：CloudFormationテンプレートを更新して、環境内のリソースを変更
1. CodeDeploy：アプリケーションに対し最新のバージョンをプルする
1. ECS/EKS：コンテナ化されたアプリケーションをサポート
右クリックメニューからファイルのパス（またはファイル名）をクリップボードにコピーする VBScript

エクスプローラでファイルを選択して［Shift］キーを押しながら右クリックすると〔パスのコピー〕というメニューが現れて、それを実行するとファイルのパスをクリップボードにコピーしてくれる。
複数選択したファイルのパスも一度にコピーしてくれるので結構便利なのだが、ダブルクォーテーション付きでコピーされるのと、ファイル名だけ欲しい場合は一旦メモ帳などに貼り付けてフォルダパスの部分を削除する必要があるのが若干面倒くさい。

そこで、右クリックメニューから複数ファイルのパス（またはファイル名）をクリップボードにコピーする VBScript を作ってみた。

```vb:ファイル名取得（昇順）.vbs
' エクスプローラーで選択したファイル（複数可）をこのアイコンにDrag&Dropすると、
' ファイル名（またはパス）をソートしてクリップボードにコピーする。
' SendToフォルダにこのファイルを置くと、選択したファイルの右クリックメニューの
' ［送る］でパスを取得できる。
' ※ 一度に選択できるファイル数の上限：パスの総文字数が32,699未満（Windows7、10の場合）
```
```vb
Option Explicit

Dim args              '// 選択したファイルパスの配列
Dim folderPath        '// フォルダのパス
Dim i                 '// 配列のループカウンタ
Dim fileNames         '// ソート前のフルパスリスト
Dim fileNamesArray    '// ソートされたフルパスの配列
Dim sortFileNames     '// ソートされたフルパスリスト
Dim msg               '// パスかファイル名かの選択メッセージ

Set args = WScript.Arguments

'// D&Dした複数ファイルのフルパスを改行で繋いだリスト（文字列）にする
folderPath = CreateObject("Scripting.FileSystemObject").GetParentFolderName(args(0)) & "\"

For i = 0 to args.Count - 2
    fileNames = fileNames & args(i) & vbcrlf
next

fileNames = fileNames & args(i) '// 末尾に改行を入れないようにするため、最後はループから外す

Set args = Nothing

'// フルパスを配列にしてソートする（フルパスは2次元目に格納されている）
fileNamesArray = SortRecordset(Split(fileNames, vbcrlf))

'// ソートされた配列を改行で繋いだリスト（文字列）にする
For i = 0 to UBound(fileNamesArray, 2)
    sortFileNames = sortFileNames & fileNamesArray(0, i) & vbcrlf
next

msg = "フォルダのパスも含めますか？" & vbcrlf & vbcrlf
msg = msg & "［はい］フルパス" & vbcrlf & "［いいえ］ファイル名のみ"

If Msgbox(msg, vbYesNo) = vbNo Then
    sortFileNames = Replace(sortFileNames, folderPath, "")
End If

CreateObject("WScript.Shell").Exec("clip").StdIn.Write(sortFileNames)   '// クリップボードにコピー
WScript.Echo "以下のファイル名リストをコピーしました。" & vbcrlf & vbcrlf & sortFileNames
```
```vb
'// ソート関数
Function SortRecordset(arry)
    Dim i
    With CreateObject("ADODB.Recordset")
        .Fields.Append "Field1", 200, 2047      '// 引数は、順にカラム名、型、文字バイト数
        .Open

        '// データをレコードセットに追加していく
        For i = 0 To UBound(arry)
            .AddNew
            .Fields("Field1").Value = arry(i)
        Next

        .Sort = "Field1 ASC"        '// ASC(昇順)／DESC(降順) ※省略した場合は昇順
        SortRecordset = .GetRows    '// GetRowsは2次元配列を返すので要注意
        .Close
    End With
End Function
```