OmniAICreator/Qiita-1.07M huggingface dataset:
powershellのrijndealはkeysize 256を許容するのか？

前回記事で書いた内容の続きです。
https://qiita.com/MuscleProgramer/items/b3b38ec76c34bf12f771

前回powershellで鍵長を256bitにできると書いたが
実は.NETで256bitを許容してくれるのは.NET frameworkのみである。

## powershellは.NET frameworkで動くものと.NET coreで動くものが存在する。

Windows powershell→ .NET framework
powershell core→ .NET core

つまりpowershellと言っても2種類存在するのである。

## 2つで rijndealクラスの挙動が異なる
https://teratail.com/questions/137542
上のリンクにある通り、.NET Coreの場合は、BlockSizeを256に設定できない。

こうすると、どう頑張っても鍵長を256bitにすることは不可能になる。

したがってpowershell coreで組んでくださいという話になったら
「不可能です」
と言うしかない。

Windows PowerShellは.NET FRAMEWORKのほうで実装されているので、実装できます。
【Git】error: unable to start editor 'editor'解消法

## 状況
`git commit`した際に以下のようなエラーが発生しました。
```:ターミナル
$ git commit -m "hoge" 
hint: Waiting for your editor to close the file... error: cannot run editor: No such file or directory
error: unable to start editor 'editor'
Please supply the message using either -m or -F option.
```

## 解消法
以下のコマンドを実行し、エディタを設定したところ解消しました。
```:ターミナル
$ git config --global core.editor "code --wait"
```
上記のコマンドはVSCodeに設定する際のものです。
他のエディタに設定する場合には`"code --wait"`の箇所を変更する必要があります。

実行後の`.gitconfig`の内容を確認すると以下のように追記されています。

```:ターミナル
$ cat ~/.gitconfig
<省略>
[core]
        editor = code --wait
```
RubyでPythonのようにfor i in range(n)する

# 普通のコード
rubyの普通のrangeオブジェクトだとこうです
```ruby
(0...n).each do |i|
  puts i
end
```
for文で書き直すと以下。
```ruby
for i in 0...n
  puts i
end
```
# range関数
しかし、私はPythonのようにrangeを書きたいと思いました。
そこで、以下の関数を定義します。
```ruby
def range(l, r=nil, s=nil)
  return 0...l unless r
  return l...r unless s
  (l...r).step(s)
end
```
`range(l)`のとき、`0...l`を返す。
`range(l, r)`のとき、`l...r`を返す。
`range(l, r, s)`のとき、`(l...r).step(s)`を返す。

使い方は以下です。※コロンは不必要、endは必要です。
```ruby
for i in range(10, 20, 2)
  puts i
end
#=> 10
#=> 12
#=> 14
#=> 16
#=> 18
```
【Kotlin】Exposedでタイムゾーン付きのdatetimeを表現する方法

## やりたいこと
- Exposedの `exposed-java-time` はタイムゾーン付きのdatetimeをサポートしていない
- しかし、対応しているDBに対してはタイムゾーンも一緒に保存しておいて欲しい
- 対応していないDBに対しては共通してINSERT/UPDATE時およびSELECT時にはシステムのタイムゾーン設定によらずに、UTCで読み書きして欲しい

というわけで、元々あるAPIだとこれは実現出来ないので、自分で独自にタイムゾーン対応のdatetimeをExposedのTableのAPIに生やしてあげることで対処します。

## というわけで早速実装する
`exposed-java-time`も内部的には似たようなことをしていますが、`ColumnType`を継承して`IDateColumnType`を実装することで独自のカラム型を実装することができます。

:::note warn
以下のコードは `kotlinx.datetime` に依存しているので、入れてない方は予め入れておいてください。
```kotlin
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.3")
```
:::

```kotlin
import kotlinx.datetime.*
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.vendors.*
import java.time.format.DateTimeFormatter

class DataTimeWithTimeZoneColumnType : ColumnType(), IDateColumnType {
  override val hasTimePart: Boolean = true

  override fun nonNullValueToString(value: Any): String {
    if (value !is Instant) {
      error("$value is not Instant type")
    }
    return "'${DateTimeFormatter.ISO_INSTANT.format(value.toJavaInstant())}'"
  }

  override fun valueFromDB(value: Any): Instant {
    return when (value) {
      is Instant -> value
      is java.time.Instant -> value.toKotlinInstant()
      // タイムゾーン情報を付けられないMySQLのようなDBの場合には強制的にタイムゾーンをUTCとして扱う
      is LocalDateTime -> value.toInstant(UtcOffset.ZERO)
      is java.time.LocalDateTime -> value.toKotlinLocalDateTime().toInstant(UtcOffset.ZERO)
      else -> error("$value is not Instant or LocalDateTime!")
    }
  }

  override fun notNullValueToDB(value: Any): Any {
    if (value !is Instant) {
      error("$value is not Instant type")
    }
    if (!currentDBSupportsTimeZone()) {
      // タイムゾーン情報を付けられないMySQLのようなDBの場合には強制的にタイムゾーンをUTCとして扱う
      return value.toLocalDateTime(TimeZone.UTC).toJavaLocalDateTime()
    }
    return value.toJavaInstant()
  }

  private fun currentDBSupportsTimeZone(): Boolean {
    return arrayOf(
      PostgreSQLDialect.dialectName, H2Dialect.dialectName, OracleDialect.dialectName, SQLServerDialect.dialectName
    ).contains(
      currentDialect.name
    )
  }

  override fun sqlType(): String {
    return when (currentDialect.name) {
      PostgreSQLDialect.dialectName, H2Dialect.dialectName, OracleDialect.dialectName -> "TIMESTAMP WITH TIME ZONE"
      SQLServerDialect.dialectName -> "DATETIMEOFFSET"
      else -> "DATETIME"
    }
  }
}

fun Table.datetimeWithTZ(name: String): Column<Instant> = registerColumn(name, DataTimeWithTimeZoneColumnType())
```

流れとしては、タイムゾーン付きの日時型をサポートしているDBの場合はそれにあったカラム型を使うようにして、そうでない場合には読み書きに必ずUTCを使うように実装しています。

## 使ってみる
```kotlin
object Hoge : IntIdTable("hoges") {
  // 今までこのように書いていたのを....
  val hogehoge = datetime("hogehoge")
  // 下のように変えるだけ！
  val hogehogeWithTZ = datetimeWithTZ("hogehoge_with_tz")
}
```

使い方はKotlin側で使用する日時型が`Instant`になる以外は、`exposed-java-time`の`datetime`と一緒ですね！

## さいごに
タイムゾーンの問題はあらゆる日時型においてつきまといます。例えば、システムのタイムゾーンとDBへの接続時のタイムゾーン設定などなど...

こうしたタイムゾーンの問題は、大抵のケースにおいてタイムゾーン情報付きで保管(もしくは読み書き時に必ず決まったタイムゾーンで操作を行うように)できれば解決しますが、上手い具合にExposedはこれをサポートしてないので、独自に実装をすることで解決してみました。
rbenvで指定してるrubyのversionと、実際のversionが違う時の対処



# rbenvで指定してるrubyのversionと、実際のversionが違う
versionがなぜかあっていない。実際のrubyのversionが更新されない。。
OS: Mac
SHELL: zsh
```
$ ruby -v
ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.x86_64-darwin21]

$ rbenv versions
  system
  2.6.9
  3.1.1
* 3.1.2 (set by /Users/<ホームディレクトリ>/.rbenv/version)
```

# よくわからんけどrbenv initをする
すると、eval "$(rbenv init - zsh)"を~/.zshrcに追加すれば、rbenvを読み込んでくれるらしいことがわかる。
```
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init - zsh)"
```
上記のファイルを開いてコピペする。
しかし、追加しただけではどうも反映されていない様子。

# よくわからんけどRubyのPATHを確認する
/usr/bin/rubyとなっている。
でも、rbenv経由でrubyを使用する時は、下記が正しいらしい。
/Users/ホームディレクトリ/.rbenv/shims/ruby
最終rubyに辿り着いたとしても、経路が違うとダメなんだ。。
```
$ which ruby
/usr/bin/ruby
```
# .zshrcを反映させる
下記のコマンドで反映すると、
pathが正しくなったことを確認できた。
```
$ source ~/.zshrc

$ which ruby
/Users/<ホームディレクトリ>/.rbenv/shims/ruby
```
# 最後にrubyのversionを確認する
rubyのversionが反映され、rbenvの指定通りになった。
```
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]
$ rbenv versions
  system
  2.6.9
  3.1.1
* 3.1.2 (set by /Users/<ホームディレクトリ>/.rbenv/version)
```

# 参考記事
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf
【Udemy備忘録】Next.jsを知る

<!-- =================================================== -->
# 概要
<!-- =================================================== -->
Udemyでかなりお得なセールをしていたので、Next.jsについて学び直しました。
受講したコースは、以前もお世話になった講師の方の最新のコースで、前回同様とても良質だったので、どんなことを学べるのかまとめました。

ただし、有料コースなので**すごくざっくりした紹介程度**です。

:::note warn
どちらもTypeScriptを使っているので、「TypeScriptわからないよー」って人はまずTypeScriptを学びましょう。
:::

<!-- =================================================== -->
# NextjsとSupabaseによる高性能Web開発
<!-- =================================================== -->
すごくおすすめです。
SupabaseというBaaSを使用していますが、本題はNext.jsの仕様の話です。

https://www.udemy.com/course/nextjs-supabase-web-tailwindcss/

### サイトアーキテクチャ
以下のアーキテクチャについて詳しく学べます。
これを知ることで、作成するサービス・サイトをどのような設計で作ればいいのかがわかります。

* SSG（Static Site Generator ）
* SSG + CSF（Client side Fetching）
* SSR（Server side Rendering）
* ISR（Incremental Static Regeneration）
* **on-demand ISR**

とくに**on-demand ISR**は、データベースの状態を監視して、更新があったタイミングで（該当するページの）静的なページを再生成する機能で、データベースに更新がないのに再生成をしてしまうISRに代わる設計手法です。

### Web Vitals
サイトアーキテクチャごとに、Vercelサーバーにアクセスしたときのレスポンス速度や、コンテンツが表示されるまでの速度を計測します。

* TTFB（Time To First Byte）：最初の1バイトを受信するまでの時間
* FCP（First Contentful Paint）：視覚コンテンツの初期表示時間
* LCP（Largest Contentful Paint）：視覚コンテンツの最終表示時間

### Supabase（ざっくり）
Firebaseの後継になるかも？

* Authentication
* Data Table
* Policy

### 状態管理
React-queryはいいぞ。

* Zustand：クライアントサイド
* React-query：サーバーサイド

<!-- =================================================== -->
# [応用編] NextjsとSupabaseによるリアルタイムWeb開発
<!-- =================================================== -->
上記のコースを受講した後に、このコースを受講しましょう。
このコースでは、Supabaseを使ってより実践的なアプリケーションを作ります。なので、Next.jsについて詳しい解説はしていないです。
がっつりコーディングする感じなので、内容的には薄いかなって思いました。

余力のある方は受講する感じで。

https://www.udemy.com/course/nextjs-supabase/

### Subscription
データベースを監視して、変更があった場合に、クライアントサイド側に即座データを反映させる方法を学べます。
これによって、簡単なチャットアプリ（簡易的なTwitter）のようなものを作ります。

### Supabaseの使い方
* Authentication
* Data Table
* Policy
* Storage
* RLS（Row Level Security）
* TLS（Table Level Security）

### E2E（End to End） Test
* Cypress


<!-- =================================================== -->
# 感想
<!-- =================================================== -->
自分のポートフォリオサイトを作るくらいだと、どうしてもNext.jsの機能を活かしきれません。
ですが、こんなにも素晴らしいポテンシャルを持っているので、積極的に使っていきたいです。

あと、普段あんまりカスタムフックを使わないので、カスタムフックの処理はすごく勉強になりました。
Gradleを更新した時のCould not get unknown property 'compile'を直す

# エラー
React nativeのプロジェクトでGradle/ReactNativeを更新した時にこんなエラーが出たりする.
```
* What went wrong:
A problem occurred evaluating project ':app'.
> Could not get unknown property 'compile' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.
```
# 解決

```app/build.gradle
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}
```
↓
```app/build.gradle
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.implementation
    into 'libs'
}
```
crystal の AtCoder における pow の使用（健忘録）

# はじめに
https://qiita.com/Itoi/items/aad133bcd74e147c9e16

@Itoi さんの記事を拝見して、`Ruby`に`Integer#pow`があることを思い出しました。
しかしながら、`crystal`には**mod**する**pow**が無い様です。
とりあえず、自作関数を作ります。
# 自作関数(Ruby)
```rb
def modinv(n, mod)
  n.pow(mod - 2, mod)
end
```
組み込み関数がありますので、シンプルです。
# 自作関数(crystal)
```cr
def pow(v, p, mod)
  ret = 1i64
  while p > 0
    if (p & 1i64) != 0
      ret *= v
      ret %= mod
    end
    v *= v
    v %= mod
    p >>= 1
  end
  ret
end
def modinv(n, mod)
  pow(n, mod - 2, mod)
end
```
自作と言いましても、こちらから拝借したものです。(MIT licenseなので大丈夫！？)

https://github.com/tomerun/CompLib/blob/master/crystal/integer.cr

ちなみに、`ret = 1i64`と`Int64型`にしておかないと、途中で**OverflowError**が発生します。
# C - 経路
https://atcoder.jp/contests/abc034/tasks/abc034_c
# Ruby版
```rb
def nPk(n, k, mod)
  r = 1
  while k > 0
    r *= n
    r %= mod
    n -= 1
    k -= 1
  end
  r
end
def modinv(n, mod)
  n.pow(mod - 2, mod)
end
w, h = gets.split.map(&:to_i)
mod = 1_000_000_007
ans = nPk(w + h - 2, w + h - 2, mod)
ans *= modinv(nPk(w - 1, w - 1, mod), mod)
ans *= modinv(nPk(h - 1, h - 1, mod), mod)
puts ans % mod
```
# crystal版
```cr
def nPk(n, k, mod)
  r = 1i64
  while k > 0
    r *= n
    r %= mod
    n -= 1
    k -= 1
  end
  r
end
def pow(v, p, mod)
  ret = 1i64
  while p > 0
    if (p & 1i64) != 0
      ret *= v
      ret %= mod
    end
    v *= v
    v %= mod
    p >>= 1
  end
  ret
end
def modinv(n, mod)
  pow(n, mod - 2, mod)
end
w, h = read_line.split.map(&.to_i)
mod = 1_000_000_007
ans = nPk(w + h - 2, w + h - 2, mod)
ans *= modinv(nPk(w - 1, w - 1, mod), mod)
ans %= mod
ans *= modinv(nPk(h - 1, h - 1, mod), mod)
puts ans % mod
```
また途中で、`ans %= mod`を入れないと**OverflowError**が発生します。
ということは、Ruby版でも整数のサイズが32bitから64bitに自動的に変換されていることが推測されます。

||Ruby|crystal|
|:--:|--:|--:|
|実行時間(ms)|75|10|
# D - Knight
https://atcoder.jp/contests/abc145/tasks/abc145_d
# Ruby版
```rb
def nCk(n, k, mod)
  a = 1
  b = 1
  i = 0
  while i < k
    a *= n - i
    a %= mod
    b *= i + 1
    b %= mod
    i += 1
  end
  a * modinv(b, mod) % mod
end
def modinv(n, mod)
  n.pow(mod - 2, mod)
end
x, y = gets.split.map(&:to_i)
mod = 10**9 + 7
if (x + y) % 3 != 0
  puts 0
  exit
end
n = (2 * y - x) / 3
m = (2 * x - y) / 3
if n < 0 || m < 0
  puts 0
  exit
end
puts nCk(n + m, n, mod)
```
# crystal版
```cr
def nCk(n, k, mod)
  a = 1i64
  b = 1i64
  i = 0
  while i < k
    a *= n - i
    a %= mod
    b *= i + 1
    b %= mod
    i += 1
  end
  a * modinv(b, mod) % mod        
end
def pow(v, p, mod)
  ret = 1i64
  while p > 0
    if (p & 1i64) != 0
      ret *= v
      ret %= mod
    end
    v *= v
    v %= mod
    p >>= 1
  end
  ret
end
def modinv(n, mod)
  pow(n, mod - 2, mod)
end
x, y = read_line.split.map(&.to_i)
mod = 10**9 + 7
if (x + y) % 3 != 0
  puts 0
  exit
end
n = (2 * y - x) // 3
m = (2 * x - y) // 3
if n < 0 || m < 0
  puts 0
  exit
end
puts nCk(n + m, n, mod)
```
||Ruby|crystal|
|:--:|--:|--:|
|実行時間(ms)|87|12|
# まとめ
+ `crystal`の`pow`対策に詳しくなりました
+ Ruby側の`def modinv`を`def pow; def modinv`にトランスパイルする仕組みがあると便利ですよねえ
+ `crystal`にオープンクラスってあるのかな

https://github.com/superrino130/crystal-on-paiza.cloud

https://qiita.com/superrino130/items/273dc5f0a30caa7b009f
git pullとmergeを極力使わず、fetchとrebaseに統一する

# はじめに
`git merge`は、コミットメッセージが作られるので履歴が汚い
`git pull`は、Gitがよしなにマージするので意図しないマージが発生する時がある
ことから、pullとmergeは使わずにできるだけ`git fetch`と`git rebase`に統一するようになった。

# git pullの代替コマンド
```:ターミナル
$ git fetch origin    ←リモートの情報をoriginにダウンロード
$ git checkout ブランチ名
$ git rebase origin/ブランチ名    ←ダウンロードした情報を反映
```
fetchとcheckoutの順番はどっちでも良い。

# git mergeの代替コマンド
例えばmasterブランチの差分を取り入れたい場合
```
$ git fetch origin    ←リモートの情報をoriginにダウンロード
$ git checkout ブランチ名
$ git rebase origin/master    ←ダウンロードしたmasterの情報を取り入れる
```
こちらもfetchとcheckoutの順番はどっちでも良い。

# rebase -iでは色々なことができる
例えば``git rebase -i HEAD~3``とすると、デフォルトのエディタが開き以下の表示になる。
```:ターミナル
pick コミットID① コミットメッセージ①
pick コミットID② コミットメッセージ②
pick コミットID③ コミットメッセージ③

コマンドの説明...
```
これを編集して
```
pick コミットID① コミットメッセージ①
pick コミットID③ コミットメッセージ③

コマンドの説明...
```
として保存&終了すると、コミットID②のコミットが消える。
``git log``で確認してみてください。

上記以外にも、コミットメッセージを変更したりコミットをsquash（まとめる）こともできる。
git rebase iなどでググってみると良い。
「Rust、何もわからない... #2」内容の自分用まとめ

- [connpass - Rust、何もわからない... #2](https://estie.connpass.com/event/246429/)

本当にただのまとめです

追記:本家様で資料が公開されたのでこの記事は無意味になりました。どうしよう。

# 宇宙ツイッタラーX氏：Workspace crate との戦いの歴史

- visibilityの変更はとりあえず`pub(crate)`が一番使いやすい
- 中規模以上のプロジェクトではCargo workspaceで複数のcrateに分割すると便利
- cargo-chefを使えば一度に複数のtomlにdocker用のビルド設定を追加できる
  - https://github.com/LukeMathWalker/cargo-chef
  - 一括ビルドのコマンド：`cargo build --workspace`

# matsu7874氏：actix-webのテストどうしてる？	

- actix-webを使ってWebアプリのテストを書く話
  - https://github.com/actix/actix-web
- クラスのユニットテストを書くときは`#[ignore]`を使って下に直接書くと便利
  - 一括実行は`cargo test --ignore --workspace`

# ばんくし氏：RustとCADDi AI LabとML

- ONNX（ディープラーニングの学習モデルを記述するための言語らしい）を経由してPythonのスクリプトからモデルをぶん投げられるらしい
- Pythonで学習を回して推論をRustにさせるのがセオリーらしい
  - wasmに変換してクライアントサイドで推論できるのがおいしい
- Rustでの機械学習に便利なクレートのまとめ
  - https://github.com/vaaaaanquish/Awesome-Rust-MachineLearning
- その他色々クレートの紹介があったけど失念

何か間違ってたらすいません
JavaScriptで全画面(フルスクリーン)にする【YouTube】


# TL;DR

1. フルスクリーンにできるようWebサーバーを起動

   ```bash
   # wget https://github.com/msoap/shell2http/releases/download/v1.14.1/shell2http_1.14.1_linux_amd64.deb
   # sudo apt install xdotool ./shell2http_1.14.1_linux_amd64.deb
   shell2http /fullscreen "DISPLAY=:0 xdotool key f"
   ```

2. videoにフォーカスして、フルスクリーンにする

   ```javascript
   document.querySelector('video').focus()
   setTimeout(() => fetch('http://localhost:8080/fullscreen'), 1000)
   ```

Google Cloud Skills Boostで動かすと便利です！

```javascript:SkillsBoost.user.js
// ==UserScript==
// @name         SkillsBoost
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.youtube.com/embed/*?playsinline=1&controls=2&modestbranding=1&iv_load_policy=3&rel=0&enablejsapi=1&autoplay=0&origin=https%3A%2F%2Fwww.cloudskillsboost.google&widgetid=1
// @icon         https://www.google.com/s2/favicons?sz=64&domain=cloudskillsboost.google
// @connect      localhost
// @grant        none
// ==/UserScript==

document.querySelector('video').focus()
setTimeout(() => fetch('http://localhost:8080/fullscreen'), 1000)
setTimeout(() => document.querySelector('.ytp-play-button').click(), 1000)
```

# 参考

https://github.com/msoap/shell2http/issues/78

https://stackoverflow.com/questions/63313975/going-fullscreen-with-settimeout
Rubyでシーザー暗号のプログラムを実装

Rubyでシーザー暗号のプログラムを作りました。

:::note warn
補足
- まだ暗号化するだけの処理です。
- 英大文字のみ対応です。
- スペースなどは考慮していません。
:::

<br>

#### シーザー暗号とは
平文の各文字を辞書順にずらして暗号文にする暗号です。

https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7

<br>

#### プログラム

```ruby
def caesar_cipher(string = "ABC", shift = 3)
  charArray = string.chars.map(&:ord)

  charArray.map do |char|
    if (char + shift) < 91
      (char + shift).chr
    else
      (char + shift - 26).chr
    end
  end.join
end

puts caesar_cipher
```

##### 処理の流れ
1. 暗号化したい文字列を用意する
1. 文字列を1文字ずつに分ける
1. 分けた文字を文字コードに変換する
1. 任意の数分だけ文字コードを辞書順にずらす
1. 得られた文字コードを文字に戻す
1. 1つの文字列に結合して暗号文とする

<br>

#### 終わりに
`charArray.map`に渡しているブロックの終わりに`join`で繋げるのは新しい発見でした。でも可読性の低下と、バグの原因になりそうなのであまり多用しないほうがいい気がします。
それにしても文字コードの操作は「プログラムを組んでる」という感じが強くて面白いですね。


<br>

#### 参考

https://gist.github.com/matugm/db363c7131e6af27716c
オブジェクト指向とは...?

Ruby学習中に聞いたオブジェクトという言葉がありますが<br>Rubyという言語自体がオブジェクト指向と呼ばれているらしいです。<br><br>参考資料を見ても、ふわふわとした概念だとあるので、<br>自分なりにまとめてみました。

[1.そもそもオブジェクトとは？](#1-そもそもオブジェクトとは？)
[2.Railsでのオブジェクト指向](#2-Railsでのオブジェクト指向)
[3.現状の認識](#3-現状の認識)
[4.参考文献](#4-参考文献)

<div>
<h2>1.そもそもオブジェクトとは？</h2>
<p>ここでいうオブジェクトとは、<br>『クラス』や『メソッド』を『モノ』として<br>置き換えている？ような印象でした。</p>
</div>

![スクリーンショット 2022-05-25 23.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687611/3f857595-2eeb-a939-bf8a-f1810e5df602.png)



<div>
クラス（モノ）の中には複数のメソッドが定義されていて、<br>中身のメソッドが主にオブジェクトと呼ばれている？<br><br>メソッド　＝　オブジェクト<br>であるなら、そのまとまりである<br>クラス　＝　オブジェクト<br>なのかもしれない
</div>

<div>
<h2>2.Railsでのオブジェクト指向</h2>
RailsのMVCを簡易的にまとめると下のような図になる<br><br>
クラスがオブジェクトであるなら、<br>
これらのオブジェクト同士がやり取りするようにプログラムすること<br><br>指向とはある方向に向かうことだから、<br>
これら(オブジェクト)間でのやり取りができる言語ということで<br>オブジェクト指向と呼ばれているのでしょうか。

![スクリーンショット 2022-05-25 23.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687611/2cf32516-bca2-0ab3-0ae5-700447f432a5.png)

んー。。。
考えれば考えるほど沼にハマっていく。。。
</div>

<div>
<h2>オブジェクト指向を構成する概念</h2>
オブジェクト指向には以下のような概念があるようです
<ul>✔︎カプセル化<br>✔︎継承<br>✔︎ポリモーフィズム</ul>

この中のカプセル化はオブジェクトをカプセル化して<br>外部のプログラムからの誤動作を防止するようなセキュリティのような役割だと認識しています。
他の要素は、まだ経験不足で、理解するに至りませんでした。

</div>

<div>
<h2>3.現状の認識</h2>
オブジェクトはクラスやメソッドなどモノを指していて、<br>オブジェクト指向とはモノ同士でのやり取りができる？ということで認識しています。
</div>

<div>
<h2>4.参考文献</h2>

https://eng-entrance.com/what-oop

https://blog.proglus.jp/4487/

</div>
ADDC構築時に躓いたことメモ

毎回DC構築時にネットワークの設定で躓くのでメモ。
環境は以下
仮想化ソフトウェア：virtualbox
ゲストOS：windows server 2019 datacenter
ホストOS：windows10 home

## DC1（フォレスト内1番最初に構築するDC）のIP/DNS設定※DC2追加前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1307905/eafc2a5c-8ee0-af8b-e9ac-3cefe7290d74.png)
①IPv6はオフにする
オフにしないとIPv6で優先的に名前解決され既存フォレストに対しDCを追加できなかったため

②IPv4の設定は上記の通りとする。
優先DNSサーバはlocalhostを指定する。代替DNSサーバは自身のIPアドレスを指定。

③詳細設定よりDNSサーバに自身のIPアドレスが登録されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1307905/ddee33d9-57ce-a05d-e3ad-c0807c962efe.png)

## DC2（上記で作成されたフォレストに参加させる2台目のDC）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1307905/9ccac4d7-b0d5-0d58-1f60-4564e012e6ed.png)
①IPv6はオフにする
②IPv4の設定は上記の通りとする。
優先DNSサーバはDC1のものを指定。

## 設定後以下を確認して疎通が取れること、名前解決が行えることを確認する
・お互いに疎通が取れているか（ping疎通確認）
・名前解決ができているか確認
　nslookup ドメイン名

トラブルシューティングの詳細は以下参照
https://bizlog.tech/domain-add-computer/

## DC2をドメインコントローラーに昇格させる
以下参照
https://anything-it.info/windows-server-2019-ad-istall-add/

## DC昇格後、DNS設定を以下のとおり変更する
#### DC1
優先DNSサーバ：192.168.17.12（DC2のIPアドレス）
代替DNSサーバ：192.168.17.11(自身のIPアドレス)

#### DC2
優先DNSサーバ：192.168.17.11（DC2のIPアドレス）
代替DNSサーバ：192.168.17.12(自身のIPアドレス)

以上
JavaのServlet(サーブレット)でHello World.

## 環境
- Windows 11
- eclipse 2022-06 [※こちらから日本語版がDownloadできます。](https://mergedoc.osdn.jp/)
- Java, Tomcatは任意のバージョンでどうぞ。
#### 1. プロジェクトの作成
- eclipseの「パッケージ・エクスプローラー」で「動的Webプロジェクトを作成します」を選択し、プロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/608c7890-daeb-c19d-b430-1d35a7a0fad2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/1f1ae2e8-fd47-6540-5caf-611531a7f834.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/a58894b8-c782-79d1-e1e6-593bfd1a42d9.png)
#### 2. パッケージの作成
- 「パッケージ・エクスプローラー」で「src/main/java」を右クリックし、サーブレットクラスを作成する為の新規パッケージを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/06e017a3-dacf-26f8-9180-85d489791add.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/f1bc0b53-4057-1d3a-2f91-7c9d211787df.png)
#### 3. サーブレットの作成
- 先ほど作成した「sample」パッケージを右クリックし、サーブレットクラスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/5eddb9e5-1245-b5e2-acfa-0f76d0411041.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/6a881710-84ad-31b4-2a8d-98a71bb1b942.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/3dde4137-a3a6-b890-f264-02cbe79e43d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/d52c43e2-4e20-0614-b83a-08506860d673.png)
#### 4. Hello Worldを出力するコードを追加
- 28行目からのdoGetメソッドを以下のように書き換えます。
```HelloServlet.java
28	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
29		response.getWriter().append("Hello World!");
30	}
```
#### 5.web.xmlの追加
- 「パッケージ・エクスプローラー」で「WEB-INF」を右クリックし、web.xmlを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/c63fc228-25de-ee2e-f9c7-4ad89fe9cf1e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/ed3f2659-456f-d36f-03c9-3f7b69db3352.png)
- 以下の通りweb.xmlを記述します。
```web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>sample.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
```
#### 6.実行
- 「パッケージ・エクスプローラー」でプロジェクトを右クリックし、サーバーで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/58129b7b-c340-ea45-9406-fa7d3e5189eb.png)
- 以下の通り選択し、完了でOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/e1ed097b-72bd-c6af-c1d9-7e70187eab06.png)
- 以下のURLに接続し、「Hello World!」と表示されれば成功です。
http://localhost:8080/SampleApp/hello
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566009/329f6853-a56d-fe8d-3d44-1254cb9bbaa5.png)
ざっくりとHTML・CSSの用語についてまとめ

| 項番 | ページ内リンク |
|:----:|:-------------|
| 1 | [1-Domとは](#1-domとは)|
| 2 | [2-ノードとは](#2-ノードとは)|
| 3 | [3-タグとは](#3-タグとは)|
| 4 | [4-要素と属性とは](#4-要素と属性とは)|
| 5 | [5-セレクタとは](#5-セレクタとは)|

# 1-Domとは
ざっくりというと
* Document Object Modelの略 
* 階層構造を持った文書表現のこと

詳しくは以下の記事を参考にしてください。

https://ja.wikipedia.org/wiki/Document_Object_Model 

https://qiita.com/mzmz__02/items/dc94883c145d143e4fad

# 2-ノードとは
ざっくりというと
* 階層表現の単位
* いろいろな「〜ノード」呼ばれるものがある

詳しくは以下の記事を参考にしてください。

https://atmarkit.itmedia.co.jp/ait/articles/0803/12/news149_2.html

# 3-タグとは
ざっくりというと<>で囲まれたものこと

```:# タグについて
<p>Hello, World</p>
```
上記のようなhtmlの記述があった場合
* \<p> : __開始タグ__
* \</p> : __終了タグ__
* Hello, World : __テキスト__

となる

# 4-要素と属性とは
要素は、ざっくりというと
* Element
* 開始タグから終了タグまでを一つの単位として扱うものこと
```:# 要素について
<p>Hello, World</p>
```
上記のようなhtmlの記述があった場合、これ全てが1つの要素となる。
```:# 要素について
<h1><p>Hello, World</p></h1>
```
また、上記のようにタグをタグで囲まれている場合
* \<h1>\<p>Hello, World\</p>\</h1> : __親要素__
* \<p>Hello, World\</p> : __子要素__

となる。
属性は、ざっくりというと
* Attribute
* タグの中にあるもののこと

```:# 属性について
<a href="/hello"></a>
```
上記のようなhtmlの記述があった場合
* href="/hello" : __属性__
* href : __属性名__
* "/hello" : __属性値__

となる
詳しくは以下の記事を参考にしてください。

https://so-zou.jp/web-app/tech/html/specification/element-attribute.htm

# 5-セレクタとは
ざっくりというと
* htmlの要素を特定できるもの
* CSSやJavaScriptなどで特定のhtml要素を指定したいときに使うもの

```:# セレクタについて
<p id="hello"></p>
<p class="bye"></p>
<a href="/hello"></a>
```
上記のようなhtmlの記述があった場合
タグの種類 : 「p」 や「a」などのタグをセレクタとして利用できる
任意の名前 : idやclassなどに任意の名前を設定し、セレクタとして利用できる
テストメールの送信方法

# はじめに

メールサーバーの動作を確認する際に、メールサーバー内でsendmailを使ってテストをすることがあります。
このテストが頻繁に行われていればコマンドを覚えられるかもしれませんが、実際にはごく稀にしか行われないため、毎回コマンドを使う段階になってから調べていました。

そこで簡単なコマンドではありますが、備忘録としてコマンドをまとめてみました。

# メール送信のコマンド

* `$ echo {本文} |sendmail {宛先のアドレス}`という形でもメールを送信できますが、下記のコマンドの方が汎用性が高くて使いやすいと思います。
* ヒアドキュメントになっているため、`EOL`が出現するまでが本文となるため、改行を入れた本文にできます。

```shell-session: 
[nkojima@akagi ~]$ sendmail -t <<EOL
From: {送信者のアドレス}
To: {宛先のアドレス}
Subject: {題名}
{本文 1行目}
{本文 2行目}
...
EOL
```

# 参考URL

* [コマンドラインからメールを送信する方法](https://laboradian.com/send-mail-from-cmd-line/)
* [sendmail コマンドによるメール発信](https://fumiyas.github.io/2014/12/13/sendmail.postfix-advent-calendar.html)
Salome-Meca v2021 for Windows のディスク容量削減

# 総容量が大きいので減らしたい
7 GB 近くってすごい。どうやらWindows上での依存関係ライブラリをコンパイルできる様に色々入っている様です。
修正・再コンパイルの必要に迫られるのは稀だと思われるので、動作に不要な容量の大きいファイルを削除してしまいました。
<b>6.8 GB → 3.6 GB の削減ができました</b>。

# 削除するファイルの候補
+ *.lib ： コンパイル時にのみ必要になるファイルです。中々のサイズが有ります。
+ *.pdb ： デバッグ用の情報が含まれます。普段実行する際には不要です。
+ *.o ： コンパイル時に生成されるファイルです。これも通常の使用では必要ありません。
+ *.h, *.hpp, *.hxx, *.c, *.cxx ： C/C++ のヘッダ・ソースファイルです。特にヘッダファイル類は数が多いので消してしまいました。
+ *.ilk ： *.lib の親戚と思われます。

# PowerShellで削除する方法
``` PowerShell
#(SM-2021-w64-0.4 ディレクトリに移動しておく)
Get-ChildItem -Path . -Recurse -Include *.lib, *.pdb, *.o, *.h, *.hpp, *.hxx, *.c, *.cxx, *.ilk -File | Remove-Item
```

# コンパイラ系のファイルも削除
LLVM フォルダ と ispc.exe も削除してしまいました。ここまでやると、3.6 GB 程度まで容量が削減されています。

# （おまけ）Code_Aster のファイルも削除
幾つか存在している tests フォルダを削除してしまえば、こちらもある程度容量が削減できます。

# 終わりに
v2019 for Windows も同様の手順で軽量化できます。v2021 は v2019 と比べてまだまだ総ファイルサイズが大きいので、もっと削る手段が有るかもしれません。
Processing 　まとめ　その①

<h1>はじめに
<p>Processingについてまとめます。
<p>備忘録兼初心者のみなさまへ届け！

<h2>Processingってなんぞ？

説明しよう…
>Processingは、キャセイ・レアスとベンジャミン・フライによるオープンソースプロジェクトであり、かつてはMITメディアラボで開発されていた。電子アートとビジュアルデザインのためのプログラミング言語であり、統合開発環境である。アーティストによるコンテンツ制作作業のために、詳細な設定を行う関数を排除している。
[Wikipedia](https://ja.wikipedia.org/wiki/Processing)より

基本的にはJavaベースです。
他言語で開発をしたい場合には、統合開発環境にインポートすることでできる。

<h2>インストール手順

1.Processingのホームページへアクセスしよう！
2.ダウンロード
3.ファイルの解凍
4.起動


<h2>実際にインストール
<h4>1.Processingのホームページへアクセスしよう！

[Processingのホームページ](https://processing.org/)
アクセスすると↓のような画面が出るよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244335/b26b5790-c705-a5e5-cbbb-c995cc8a52dc.png)

<h4>2.Processingのホームページへアクセスしよう！
<h6>ステップ１　Downloadと書いてあるボタンをクリック

画像の赤い丸で囲っている部分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244335/9fcb1eed-19b2-0fdc-922e-7e3c528d130a.png)

<h6>ステップ2　ダウンロード

<h5><font color="Red">注意！  </font>自分のパソコンにあったものを選んでください！！

OSを間違えると以後の作業を行ったとしても正常に動作しません。

<h5>・あなたがWindowsユーザーの場合
<p>①まず、使っているOSが64-bitなのか32-bitなのかを調べます。

　画面左下のWindowsマークを右クリック→システムをクリック

②システム情報を確認
　システム情報という欄があるのでそこを見ます
　下の表に対応するのでそれに合ったものをクリックしてください
| システムの種類に書いてあること | 選ぶもの |
|:-:|:-:|
|  64 ビット オペレーティング システム、x64 ベース プロセッサ |  下の写真の<font color="Red">**赤**</font>丸をクリック| 
| 32 ビット オペレーティング システム、x32 ベース プロセッサ  |  下の写真の<font color="Purple">**紫**</font>丸をクリック | 


<h5>・あなたがMacOSユーザーの場合

下の写真の<font color="Green">**緑**</font>丸をクリック 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244335/819f622e-1c90-0e84-d176-269c9f52001e.png)

ここでは安定版を選んでいます。

<h4>3.ファイルの解凍

・WindowsでChromeを使用している場合ダウンロードが終わると下の写真のようなものが出てきます。それをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244335/8c58ec0f-b6ba-895d-b6ce-e193cef308cc.png)
ほかの場合でもエクスプローラーからダウンロードに保存されています。
エクスプローラーが開くので上のタブから　圧縮フォルダーツール→すべて展開　をします。
ウィザードが出てきますがすべてそのままで進めて大丈夫です。

・Macの場合は、Windowsと同様にインストールされたZipファイルが表示されるのでそれをクリックします。（safariでは右上のとこにアプリが表示されるので次へ進む）
　その後は特にやることはないので次へ

<h4>4.起動

・Windowsの場合
展開したファイルの中身を見ていくと↓のような場所に行きます。その中の**processing.exe**をクリックして起動！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244335/d5f1e214-2666-3ce5-7fbd-4b071b0f604a.png)


・Macの場合
　先ほど表示したところに**processing.app**があるのでクリックして起動！

<h1>終わりに

以上でProcessingのインストールは終了です。
お疲れ様でした！

次は、Processingのライブラリについてまとめていきます。

<h2>よいものゾーン

　　1.　[Processing学習ノート](https://www.d-improvement.jp/learning/processing/)
　　2.　[]()
　　3.  []()
　　4.  []()
C#でファイルをtar.gzに圧縮

# はじめに
C#でtar.gzでファイル圧縮します。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [使用ライブラリ](#使用ライブラリ)
1. [実装](#実装)

<!-- 各チャプター -->
<a id="#使用ライブラリ"></a>
# Chapter1
軽く調べたところSharpZipLibが良さそう
https://github.com/icsharpcode/SharpZipLib

<a id="#Chapter2"></a>
# Chapter2
```言語名:ファイル名.拡張子
        public void CreateTarGz(string outputTarFilePath, List<string> targetFilePathList)
        {
            using (FileStream fileStrem= new FileStream(outputTarFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
            using (GZipOutputStream gzipStream = new GZipOutputStream(fileStrem))
            {
                // 圧縮率を指定
                // １が一番早くて底圧縮、9が一番遅くて高圧縮
                gzipStream.SetLevel(1);
                using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(gzipStream))
                {
                    try
                    {
                        foreach(var targetFilePath in targetFilePathList)
                        {
                            var tarEntry = TarEntry.CreateEntryFromFile(targetFilePath);
                            tarEntry.Name = Path.GetFileName(targetFilePath);
                            tarArchive.WriteEntry(tarEntry, false);
                        }
                    }
                    catch (Exception ex)
                    {

                    }
                }
            }
        }
```
[対処法]pacmanで署名関係のエラーが出たとき

# pacmanで署名関係のエラーが出たとき

具体的に言うと、対処するのは、下記のようなエラーメッセージです。

```
error: パッケージ名: signature from "foo bar <foo@archlinux.org>" is marginal trust
:: File パッケージtarボール is corrupted (invalid or corrupted package (PGP signature)).
```

## 対処

`pacman-key --init && pacman -Sy archlinux-keyring && pacman -Syu`

## エラーの原因

pacmanで使っているキーが古くなっているため、パッケージの署名チェックに失敗しています。
なので、新しく自分のキーをセットアップすることと、開発者キーリングの新しいバージョンを入手することが必要です。


## 背景

DockerにてArchLinuxコンテナを作成後にしている`pacman -Syu`に毎回失敗します。
そして、毎回上記のコマンドで対処しています。
なので、メモを残しておきたかったため投稿しました。

メモよりも、dockerfile作ったほうがいいかもしれません。

## 参考

[pacmanについて － pacman - ArchWiki](https://wiki.archlinux.org/title/Pacman)
[pacman-keyについて － pacman/Package signing - ArchWiki](https://wiki.archlinux.org/title/Pacman/Package_signing)
[archlinux-keyringについて － pacman/Package signing - ArchWiki](https://wiki.archlinux.org/title/Pacman/Package_signing#Adding_developer_keys)
[[SOLVED] Invalid or Corrupted package (PGP signature) / Pacman & Package Upgrade Issues / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=233480)
Rails DM機能4

[Rails DM機能その３](https://qiita.com/drafts/3a16559bedad01be8fe4/edit)の続きです。
## 開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2

```rooms/show.html.erb

<% if  @user.id != @current_user.id  %>・・１
 <% if @isRoom == true %>・・２
 <p><a href="/rooms/<%= @roomId %>">チャットへ</a>・・３
 <% else %>・・４
  <%= form_for @room do |f| %>・・５
 <%= fields_for @entry do |e| %>・・６
 <%= e.hidden_field :user_id, :value=> @user.id %>
 <% end %>
  <%= f.submit "チャットを始める" %>
  <% end %>
   <% end %>
```
## コードの解説
１・・現在ログインしているユーザーではないという条件をつけます。
２・・@isRoomを使用してチャットルームが作成している時と作成されていない時で条件を分岐させます。
３・・@isRoomがtrueの時、つまりチャットが既にある時は、チャットへボタンを出現させ、すでに作成されたチャットへと移行させます。
４・・falseの場合にはform_forを使って、コントローラにパラメーターを送るための記述をします。

レコードには、親モデルのRoomsテーブルと、子モデルのEntriesテーブル両方に保存する必要があるので、
５・・親モデルにform_forインスタンス変数
６・・子モデルにfields_forインスタンス変数とします。
Entriesテーブルのレコードにはuser_idを送る必要があるので、hidden_fieldで@user.idをvalueにおきます。

これで、roomsテーブルに保存されるための準備が整いました。
# 参考記事
[RailsでややこしいDM機能を1万字でくわしく解説してみた](https://qiita.com/bindingpry/items/6790c91f374acc25bea2)
[RailsでDM(ダイレクトメッセージ)を送れるようにしよう](https://qiita.com/ki_87/items/a344ea566c88b10b950c)
Slackアプリに「自分」として投稿させるまで

## 記事を書いた理由
- Slackアプリのホームタブで、ボタンをクリックしたらアプリとしてでなく「自分」として特定のチャンネルに書き込みする機能を実装したかった。
- ググっても情報が微妙に古かった(引数にas_userを使うものしか見つからなかった)。

## だいたいの環境
- Bolt for JavaScript (3.11.0)
    - [日本語のチュートリアル](https://slack.dev/bolt-js/ja-jp/tutorial/getting-started)は一通りやった
- AWS Lambda
    - デプロイ方法は↑のチュートリアルにある。dotenvを使えるようにserverless.yamlのトップレベル？にuseDotenv:trueを追加すると便利。

## chat.postMessage関数のas_user属性は最近のSlackアプリでは使えない
特定チャンネルへの投稿にはWebClientインスタンスの[postMessageメソッド](https://api.slack.com/methods/chat.postMessage)を使うが、アプリとしてでなく操作しているユーザーとして投稿したいときに使うであろうas_user属性は**古い**Slackアプリでは使えない。
令和最新版としては、
```javascript
// Webクライアント初期化
const web = new WebClient('TOKEN')
//　書き込み
const result = await web.chat.postMessage({
  text: '書き込み内容',
  channnel: '書き込むチャンネルのID/ DMを送るユーザーのID',
  username: 'ユーザー名',
  icon_url: 'プロフィール画像のURL',
  icon_emoji: ':smile:' // icon_urlの代わり
})
```
as_userを使う場合必要だったchat:write.customizeなトークンのスコープは不要。
理由は実態としてはユーザー名とプロフィール画像を差し替えたアプリが書き込んでいるため。
ちなみにユーザー名やプロフィール画像を取得したければ先ほどのweb変数を使って
```js
// ユーザーオブジェクトの取得
// https://api.slack.com/methods/users.info#examples
const { user } = await web.users.info({ user: 'ユーザーID' })
// ユーザー名と画像。画像サイズ（_48）は適当
const { display_name, image_48 } = user?.profile
```
## 最後に
Node.js初心者なのもあるが，チュートリアル後にモジュール分割するのに割と詰まったので別に記事を書きたい。参考にした本の読書記録になるかもしれない。
【AWS】S3の用途についてまとめてみる

# はじめに
業務でS3についてまとめる際に、「S3ってそもそもどんな用途で使用されているんだろう？」と疑問に思ったので、わかる範囲でまとめて記事にしていきたいと思います。

:::note warn
本記事ではバージョニング等の機能の紹介は省いております。
純粋に「どう使われているか」についてまとめた記事になっております。
:::

# S3とは？
![S3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/3310991d-258e-7014-59ea-2dd2bdb9f697.png)

S3とは、**Simple Storage Server**の略称になります。
データを格納・管理できるオブジェクトストレージサービスになります。

>オブジェクトストレージとは、記憶装置（ストレージ）の管理・利用方式の一つで、データをオブジェクトと呼ばれる単位で記録する方式。<br>
>利用者の指定したデータのまとまりにストレージシステム側で一意の識別名を割り当て、これを用いてデータの読み込みや書き込みを行なう。ファイルストレージのように階層構造のディレクトリなどはなく、データの存在する装置や装置内での位置などを利用者が意識する必要はない。
引用:[オブジェクトストレージ 【object storage】](https://e-words.jp/w/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8.html)

# S3の用途
S3の用途について掘り下げていきたいと思います。

- データの保管
- 静的WEBサイトホスティング
- ログの保管

## データの保管
一番、ポピュラーな使い方だと思います。

例えば、

- 画像ファイルや動画ファイルの保管
- テキストファイルの保管
- csvファイルの保管

などです。

Lambdaのようなサービスと組み合わせれば、ファイルの取り出しやファイル整形等を実施することが可能です。

## 静的WEBサイトホスティング
S3にHTMLファイル等を置いて、静的なサイトを公開することが可能です。
こちらの方法も企業で使用されていることがあります。

図にすると、以下のようになります。(ざっくりです)

![S3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/74208e3e-5b29-0c21-a06c-ab24f41278a8.png)


別の機会に上記のようにS3とCloudFrontを組み合わせて、静的WEBサイトホスティングをやってみたいと思います。

※余力があれば、Terraformでの管理もやってみます。

## ログの保管
ログの保管もよく用いられる方法になります。

例えば、

- CloudWatchから出力されたログ
- アクセスログ
- AWSの操作履歴(CloudTrailのログ)

などです。

ログの整形や取り出しでLambdaと組み合わせれば、いろいろできそうな気がします。

# さいごに
今回はざっくりベースでの記事になります。
別の機会に何かしらの検証を実施して、それを記事にしていきたいと思います。

# 参考記事
https://service.plan-b.co.jp/blog/creative/4981/
info.plistとは？？

## info.plist??
アプリをビルドする際に予めしらせたい情報を記載するファイル
Bundle identifierなんかもここに記載する。
今回はimage_pickerを使用する際に下記のような記載を追加した。

```
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires to access your photo library</string>
<key>NSCameraUsageDescription</key>
<string>This app requires to add file to your camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app requires to add file to your photo library your microphone</string>
```

ギャラリーやカメラにアクセスすることを許可する記述のよう
【JavaScript】new Array()に関するメモ

## イディオムで覚えていたこと
「指定した要素数の空配列を作り、mapで回して連番を得る」というのをnew Arrayを用いて実現するやり方。
```js
const three = new Array(3).fill();
// three --> [undefined, undefined, undefined]

// 配列の要素自体には用がなく、インデックスで連番を得る
const comics = three.map((el, idx) => { return `『ドラえもん』第${idx + 1}巻`} );
// comics --> ["『ドラえもん』第1巻", "『ドラえもん』第2巻", "『ドラえもん』第3巻"]
```

## ふと疑問: fill()ってなんで要るんだっけ？
### 試してみた
```js
const three2 = new Array(3);
// three --> [<3 empty items>]
console.log(three2);
// undefined
console.log(three2.length)
// 3
const comics2 = three2.map((el, idx) => { return `『ジョジョの奇妙な冒険』第${idx + 1}巻`} );
// three2 --> [<3 empty items>]
```
### わかったこと
`new Array()`に渡した値は単に`length`を定義するだけで、要素は`undefined`ではなく`空のスロット`になる。

[JS公式レファレンスより](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/Array)（強調は筆者）
>Array コンストラクターに渡された唯一の引数が 0 から 232-1 の間 (両端を含む) の整数であった場合は、新しい JavaScript の配列を返し、その length プロパティがその値になります (注: これは arrayLength 個の**空のスロット**を持つ配列であり、実際に undefined の値が入ったスロットではありません)。

### わからんこと
`空のスロット`ってなんだよ…

## 参考記事
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/Array

https://ginpen.com/2018/12/22/empty-slots/
JMeterメモ

## はじめに
Windows 10でJMeterを動かしてみた時のメモを残します。

## インストール
### ダウンロード
https://jmeter.apache.org/download_jmeter.cgi
https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip
70.6MB

### 初期設定
#### 展開
任意のフォルダに展開(125/130MB)
#### 日本語化
https://qiita.com/gtom7156/items/92aab9185c5b7d5feda9

`bin\jmeter.bat`の77行目を書き換える
```
set JMETER_LANGUAGE=-Duser.language="ja" -Duser.region="JP"
```
#### プラグイン
https://jmeter-plugins.org/install/Install/
https://jmeter-plugins.org/get/
> Download plugins-manager.jar and put it into lib/ext directory, then restart JMeter. 

#### 追加プラグインの有効化
* Available Pulgins から
  * `jpgc - Standard Set` にチェックを入れ、
  * `Distribution/Percentile Graphs`にチェックを入れ、
  https://jmeter-plugins.org/?search=jpgc-graphs-dist
  * `Apply Changes and Restart JMeter` をクリックしてインストールします。
## テスト計画の作成
設定用にブラウザが内蔵されているWi-Fi中継器に負荷をかけてみた。

## テスト結果の確認
* テスト計画を読み込む
* スレッドグループ名を右クリックして、「追加」→「リスナー」
   * 結果を表で確認
   * 統計レポート
   * グラフ表示
   * jp@gc - Response Times Distribution
   * jp@gc - Response Times Over Time

## 参考
### インストール&試行

https://qiita.com/shotets/items/d553d7be0d407a9a9a53

### 解説
* [【図解】はじめてでもわかるJMeterの使い方](https://tech-blog.rakus.co.jp/entry/2017/08/24/111332)

### メモのみ

https://qiita.com/takarin0711/items/691f6fa933dd846f0bf4
Requirements on FlexRay, No.5, AUTOSAR R21-11(178) CP

Requirements on FlexRay, No.5, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SRS_FlexRay.pdf


AUTOSAR R21-11記事一覧はこちら。
AUTOSAR 21-11,200文書読んだ。2022年5月にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 目的と成果(Purpose and Outcome)
|item|description|
|:--|:--|
|who|FlexRay user|
|what|there are some differences with ISO TP and AUTOSAR TP|
|importance|  high|
|others| |
|comment| Please read v.2 or v.3, there are initiaters.|

# 用語(terms)

|Term|Description|
|:--|:--|
|SW |Software
|BSW |Basic Software
|DEM |Diagnostic Event Manager BSW module
|ComM |CommunicationManager BSW module
|CC |(FlexRay) Communication Controller
|i.e. |[lat.] id est = [eng.] that is
|e.g. |[lat.] exempli gratia = [eng.] for example

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[GLOSSARY] Glossary, AUTOSAR_TR_Glossary.pdf
[LSA] Layered Software Architecture, AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[VFB] Virtual Function Bus, AUTOSAR_EXP_VFB.pdf
[TPS_STDT_0078] Software Standardization Template, AUTOSAR_TPS_StandardizationTemplate.pdf
[FR_PROT_SPEC] FlexRay Communications System Protocol Specification Version http://www.FlexRay.com
[FR_EPL_SPEC] FlexRay Communications System Electrical Physical Layer
Specification Version 2.1 Revision A, http://www.FlexRay.com
[ISO_10681-2] ISO/DIS 10681-2 , Road vehicles – Communication on FlexRay – Part 2: Communication Layer service

2010年に国際規格になっている。どんだけ古い文書参照してるやんてなった。

ISO 10681-2:2010
Road vehicles — Communication on FlexRay — Part 2: Communication layer services

https://www.iso.org/standard/46047.html

2   Normative references

ISO/IEC 7498-1, Information technology — Open Systems Interconnection — Basic Reference Model: The Basic Model
ISO 7498-2, Information processing systems — Open Systems Interconnection — Basic Reference Model — Part 2: Security Architecture
ISO/IEC 7498-3, Information technology — Open Systems Interconnection — Basic Reference Model: Naming and addressing
ISO/IEC 7498-4, Information processing systems — Open Systems Interconnection — Basic Reference Model — Part 4: Management framework
ISO/IEC 10731, Information technology — Open Systems Interconnection — Basic Reference Model — Conventions for the definition of OSI services

[1]	AUTOSAR, Specification of Module FlexRay Transport
[2]	ISO 14229-1 4) , Road vehicles — Unified diagnostic services (UDS) — Part 1: Specification and requirements
[3]	ISO 14229-2 5) , Road vehicles — Unified diagnostic services (UDS) — Part 2: Session layer services
[4]	ISO 14229-4 5), Road vehicles — Unified diagnostic services (UDS) — Part 4: Unified diagnostic services on FlexRay implementation (UDSonFR)
[5]	FlexRay Communications Systems Protocol Specification

4) Under preparation. (Revision of ISO 14229-1:2006)
5) Under preparation.

# 文書履歴(document history)
ver. 0.01 初稿
ver. 0.02  (Purpose and Outcome are added. 20220604
ver. 0.03 Frexlay Reference 追記 20221127
Greengrass V1でCloudWatchロググループが作られない問題への対応

Greengrass V1のトラブルシュートログです。ググっても情報全く出なかったので書いておきます。


# 事象
Greengrassの設定で以下のようにログをCloudWatch Logsに飛ばすように設定しているのですが、一部のデバイスからログが飛んでいないことに気付きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/19502a88-b3cb-cf8f-038e-2541368e681e.png)


# 調査

以下のログに原因らしきものを見つけました。

```sh
sudo tail -f /greengrass/ggc/var/log/system/localwatch/localwatch.log
```

メッセージを読んでみるとIAMロールが上手くAssumeできてないようです。

>[2022-05-25T15:00:42.882+01:00][WARN]-TES responded with status code: 403 and body: {
  "Message" : "Not authorized to perform assume role"
}
>[2022-05-25T15:00:42.882+01:00][WARN]-failed to send to AWS Cloudwatch  {"errorString": "UnknownErrorOccurred: unable to deal with the exception, logGroupName: /aws/greengrass/Lambda/ap-northeast-1/123456789012/function, logStreamName:2022/05/25/xxxxxx, requestId: [437eb142-c933-4000-7847-980e043f24c5], error: TES responded with status code: 403 and body: {\n  \"Message\" : \"Not authorized to perform assume role\"\n}, retry count: 0\ncaused by: TES responded with status code: 403 and body: {\n  \"Message\" : \"Not authorized to perform assume role\"\n}"}

# 対応

## サービスロール確認
そもそもGreengrassのサービスロールが作成されていることを以下を参考に確認します。通常サービスロールは `Greengrass_ServiceRole` という名前です。

上記のエラーについてはサービスロールを確認するように公式にも書いてあります。

https://docs.aws.amazon.com/greengrass/v1/developerguide/security_iam_troubleshoot.html#troubleshoot-assume-service-role


https://docs.aws.amazon.com/greengrass/v1/developerguide/service-role.html


## サービスロールは存在するがAssumeできてない
この場合は以下の対応で私の場合は上手くいきました。

- Greengrassグループのロール設定を削除してデプロイ
- Greengrass_ServiceRoleを再度設定してデプロイ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/d5ce8ee7-1823-e7b0-6dc5-002b39b5f508.png)


デプロイ後に上記の `localwatch.log` ログを見ていると、CloudWatch Logグループを作成する処理が流れるのが確認できます。
Specification of LIN State Manager, No.255, AUTOSAR R21-11(177) CP

Specification of LIN State Manager, No.255, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_LINStateManager.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 160文書読んだ。2022年5月に半分到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)

|Term|Description|
|:--|:--|
|API |Application Program Interface
|AUTOSAR |Automotive Open System Architecture
|BSW |Basic Software
|BswM |BSW Mode Manager
|ComM|Communication Manager
|DCM| Diagnostic Communication Manager
|DEM |Diagnostic Event Manager
|DET| Default Error Tracer
|ECU |Electric Control Unit
|ID |Identifier
|ISR |Interrupt Service Routine
|Jitter| Difference between longest delay and shortest delay (e.g. Worst case execution time – Best case execution time)
|LIN |Local Interconnect Network
|LinIf| LIN Interface
|LinSM |LIN State Manager (the subject of this document)
|MCAL| Microcontroller Abstraction Layer
|PDU |Protocol Data Unit
|RAM |Random Access memory
|RTE| Run Time Environment
|RX |Receive
|SPAL| Standard Peripheral Abstraction Layer
|SRS |Software Requirement Specification
|SW |Software
|SWS| Software Design Specification
|TP| Transport Protocol
|TX |Transmit
|UART| Universal Asynchronous Receiver Transmitter
|UML |Universal Modelling Language
|URL| Uniform Resource Locator
|WPII |Work Package in AUTOSAR phase 2
|XML| Extensible Markup Language

## 英日単語帳
日本語は仮訳

T.B.D.

# 参考(reference)

[1] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture,
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of Standard Types
AUTOSAR_SWS_StandardTypes.pdf
[5] Specification of Default Error Tracer
AUTOSAR_SWS_DefaultErrorTracer.pdf
[6] Requirements on LIN
AUTOSAR_SRS_LIN.pdf
[7] Specification of LIN Interface
AUTOSAR_SWS_LINInterface.pdf
[8] Specification of Diagnostic Event Manager
AUTOSAR_SWS_ DiagnosticEventManager.pdf
[9] Specification of ECU Configuration
AUTOSAR_TPS_ECUConfiguration.pdf
[10] Specification of LIN Driver
AUTOSAR_SWS_LINDriver.pdf
[11] Specification of Communication Manager
AUTOSAR_SWS_COMManager.pdf
[12] Specification of Basic Software Mode Manager
AUTOSAR_SWS_BSWModeManager.pdf
[13] General Specification of Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[14] ISO 17987:2016 (all parts), Road vehicles -- Local Interconnect
Network (LIN)
[ServiceNow] GitHubとの連携

## 概要

ServiceNowのアプリケーション開発は、Gitでソースコードを管理することができる。

本記事は、ServiceNowとGitHubとの連携方法について記す。

## GitHubアカウントの登録

GitHubでソースコードを管理するために、GitHubのアカウント情報をServiceNowの**Credential**に登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/8a46c9b6-8468-6bb0-6b0c-1bb8eaa80365.png)

Credentialの種類は「Basic Auth Credentials」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/1f0431ff-63a3-e161-0167-f54cbbb0830b.png)

GitHubのアカウント情報を入力する。
* Name: Credentialを識別する名前
* User name: GitHubアカウントのユーザー名
* Password: Personal access tokens

※Personal access tokensの作成方法に関しては、以下を参照
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/ad0bae3a-a1c8-8c09-837c-e9d81d50c797.png)


## GitHubと連携手順

ServieNowとGitHubとの連携手順を、2つのパターンに分けて記載する。

### ServiceNow -> GitHub

ServiceNowで作成したアプリケーションを、GitHubで管理する。

:::note warn
あらかじめGitHubに空のリポジトリを用意している前提で記載する
:::

リポジトリのURLをコピーしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/a4e1d627-5d5c-a1d0-04b2-9ca7ac9ba4f0.png)

Studioで連携するアプリケーションを開き、[Source Control]→[Link to Source Control]を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/197df664-a7e5-b0a3-5e12-a709c1a7f740.png)

各項目を入力し、[Link To Source Control]をクリック。
* URL: あらかじめ確認したリポジトリのURL
* Credential: 作成しておいたGitHubアカウントのCredential

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/632ca817-49f9-83f7-03e2-0039a97204eb.png)

正常に完了すれば、リポジトリに上記で指定したBranchとファイルが作成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/3bb1c861-34f5-7133-704e-6585e4604aa5.png)

### GitHub -> ServiceNow

GitHub上に存在するServiceNowアプリケーションを、自分のインスタンスに取り込む。

Studioを開き、「Select Application」で[Import From Source Control]を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/9a699281-e9e5-072d-0df6-6f53a4571fa1.png)

各項目を入力し、[Import]を実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/3bbbf5b6-17c0-df2e-de4d-022e4b401617.png)

入力値に問題がなければ以下のように表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358025/97fb8b5a-8485-ecc1-1306-a12f677dffcb.png)
AWS Lambda(Python)にインストールされているライブラリ一覧

# AWS Lambda(Python)にインストールされているライブラリ一覧

## 概要

AWS Lambdaはサーバーの管理を必要としないプログラム実行環境です。
API GatewayやCloudWatch Eventsなどをトリガーとして設定することで、非常に簡単かつ手軽にコードを動かすことが出来ます。  
扱えるプログラミング言語としては、PythonやNode.js, Goなどメジャーな言語はだいたいサポートされていますが、ググって出てくる情報の多さからPythonが使われることが多い印象です。  

そこで、Lambdaに用意されているPython実行環境にはじめからインストールされているライブラリとそのバージョンを調べたので、調べ方と合わせてまとめました。

## 調べ方

簡単です。  
標準モジュールのpkg_resourcesを使うことで、その環境にインストールされているライブラリを一覧表示することができるので、これをLambada自体で実行するだけです。

```python
import pkg_resources

def lambda_handler(event, context):
    for dist in pkg_resources.working_set:
        print(dist.project_name, dist.version)
```

記事執筆時点（2022/05/23）では、Lambadaに用意されているPythonランタイムとしてバージョン3.6, 3.7, 3.8, 3.9があるので、各バージョンのランタイムで実行した結果を以降に記します。

## Python3.6の場合

```python
urllib3 1.26.6
six 1.16.0
s3transfer 0.5.0
python-dateutil 2.8.2
jmespath 0.10.0
idna 2.10
chardet 4.0.0
certifi 2020.11.8
botocore 1.21.56
boto3 1.18.55
setuptools 40.6.2
pip 18.1
```

## Python3.7の場合

```python
urllib3 1.26.6
six 1.16.0
s3transfer 0.5.1
requests 2.26.0
python-dateutil 2.8.2
jmespath 0.10.0
idna 2.10
charset-normalizer 2.0.12
chardet 4.0.0
certifi 2020.11.8
botocore 1.23.32
boto3 1.20.32
setuptools 47.1.0
pip 20.1.1
```

## Python3.8の場合

```python
urllib3 1.26.6
six 1.16.0
s3transfer 0.5.2
python-dateutil 2.8.2
jmespath 0.10.0
botocore 1.23.32
boto3 1.20.32
setuptools 56.0.0
rapid-client 0.0.0
pip 22.0.4
```

## Python3.9の場合

```python
urllib3 1.26.6
six 1.16.0
simplejson 3.17.2
s3transfer 0.5.2
python-dateutil 2.8.2
jmespath 0.10.0
botocore 1.23.32
boto3 1.20.32
awslambdaric 2.0.0
setuptools 58.1.0
pip 22.0.4
```

## まとめ
PythonでAWSリソースを操作するときに使うboto3やbotocoreといったライブラリはやはりインストールされているようです。
また、python-dateutilライブラリもLambdaの用途的に日付や時刻を扱うことが多いので納得です。
ちょっと以外だったのは、Python3.7には含まれていたrequestsライブラリが3.8以降には入っていないことです。urllibはあるので、そちらを使えということでしょうかね。