OmniAICreator/Qiita-1.07M huggingface dataset:
Teradata Vantageクイックスタートガイド

この記事は初めてTeradata Vantageを利用される方向けに、マニュアルからピックアップしたコンテンツを翻訳したものです。
全文は[Teradata Vantage docs](https://docs.teradata.com/)、[Teradata Vantage Getting Started](https://quickstarts.teradata.com/)、および[ホームページ](https://www.teradata.jp/)でご確認いただけます。

:::note warn
警告
本記事は上記各コンテンツを抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

# Teradataが考えるデータ分析環境
テラデータが考える「企業におけるデータ分析環境とはこうあるべき」についてお話します。

データ分析環境の構築を検討する際、「スモールスタート」という言葉にとらわれすぎるがあまり、その環境をどのように成長させるのかという青写真が描かれずその場その場での拡張やシステムの分散によるデータのサイロ化やツギハギされ管理しにくいものとなりがちです。

データ分析環境を導入する際には個人で使用するわけではない企業全体で使用できるデータ分析環境の青写真を描いてみてください。

・[データレイク？データウェアハウス？](https://qiita.com/ykswi/items/0b863dc99411cf4bd4ca)
・[データを統合するということの意味](https://qiita.com/ykswi/items/5fb5667c128c854a04af)
・[データ分析環境のアーキテクチャ](https://qiita.com/ykswi/items/311b42a6db8ea6fc3055)
・[データベースで分析を行う価値](https://qiita.com/ykswi/items/938c3be027e3089a4a95)

# Teradata Vantageって何？
テラデータが提供するVantageの「製品となり」についてお話します。

・[Vantageのラインナップ](https://qiita.com/ykswi/items/1bef399f375e6884f588)
・[Vantageのソフトウェアアーキテクチャ](https://qiita.com/ykswi/items/ed25a13eaf0f85a5103a)

# Vantageのインプリメント（管理者向け設定作業）
Vantageをご利用いただくにあたって行っていただく事柄を解説します。
ここに記載されたことを実施いただければVantageにデータを格納し検索するという基本的な操作が可能となります。

Vantageをお試し利用される場合、まず以下のページにまとめられた方法でVantageのデプロイメントを行ってください。
・[Teradata Vantageのお試し環境の構築方法（まとめ）](https://qiita.com/ykswi/items/ac06fe8b4fef48582e37)

Vantageをご利用いただくにあたって必要な以下のような作業および解説を[Vantage クイックスタート・インデックス](https://qiita.com/ykswi/items/2819ac2ab05218e08eb4)にまとめてあります。
（インデックスページ内の各記事は今後公開していきます）
・デプロイ後最初に行うべきこと - 日本語を利用するためのセットアップ
・デプロイ後最初に行うべきこと - よく行うパラメータ変更（ビジネス利用向け）
・データベース？ユーザー？
・ダウンロードサイトを知ろう！
・Teradata Studio/Studio Expresssを使ってみよう！
・ユーザーデータの格納場所を作ろう！
・テーブルを作ろう！
・プライマリ・インデックスって？
・データを取り込もう！

# ユーザー利用のスタートアップガイド
Vantageを使って用意されたデータ分析環境をご利用いただくユーザーさんに向けたスタートアップ情報です。スタートアップと言いながら少しレベルの高い、そんな処理のチュートリアルも用意しています。

・[データを扱う言語、どれ使います？](https://qiita.com/ykswi/items/71c7bf11ee2541ec7df0)
・[チュートリアルとHowTo（後日投稿予定）]()

# 機械学習でVantageを活用する
Vantageで機械学習によるデータの分析を行うことを考えた際に必要となる情報をまとめています。Vantageをデータベースシステムが持つパワーを生かした機械学習環境としてご活用ください。

・[R/Pythonライブラリ（後日投稿予定）]()
・[Vantageアナリティクス・ライブラリ（後日投稿予定）]()

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
QC七つ道具

# 問題１
### 品質管理に用いられる図の説明をせよ。
#### 散布図とは？
2つの要素間の相関関係を判断するためのグラフ。
点の分布状況が右上がりなら「一方の値が増えると、もう一方も増える」正の相関、右下がりなら「一方の値が増えると、もう一方は減る」負の相関を示している。```相関の強さを表す相関関係は＋１〜−１までの値```をとり、相関係数の絶対値が0.7以上（点が直線状に並ぶ）であれば強い相関があり、逆に0.2以下の（点の並びはバラバラ）ならほとんど関係がない。

#### 親和図法
列挙した項目の中で、```親和性の高いものをグループ化｀｀｀して図にまとめ、問題点を発見・整理するための図法。

# 問題２
### ABC分析に基づく在庫管理に関して適切なものはどれか？
#### ABC分析とは？
```重要度を明確にして、優先管理すべき要素を判断```するための分析手法

# 問題３
### 品質特性値を基に生産ラインの適切な対応はどれか？
#### 管理図とは？
製品の品質管理などに用いる図法。
```限界管理の上限と加減```をグラフに示し、値の変動を折れ線で表す。
打点が上限~下限を超えたり、折れ線が```上昇/下降傾向にあるときは、何らかの問題が発生```しており、対策が必要なことがわかる。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
Go言語でjsonパースしたときにどこがまずかったかを出力する小ネタ。

本記事は [ディップ with 全部俺 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-with-all-me) 3日目の記事になります。

本日は掲題の通り、Go言語に関する記事です。

## どういう記事？

Goでjsonを取り扱うとき、 `"encoding/json"` の `json.Unmarshal` を利用することがあると思います。
エラーハンドリングを `if err !=nil`でやってしまうとある程度の情報は出してくれますが、ズバリこの辺！というのは知り得ない状態になってしまいます。

今回は、エラーのあった前後の文字を出力して、もう少し見やすいログにしようというコンセプトです。

## どうやる？

早速回答から。
``` go
	var data MyDataStruct
	raw, err := ioutil.ReadFile("./example.json")
	if err != nil {
		log.Fatalf("ReadFile Error: %v", err)
	}

	if err := json.Unmarshal(raw, &data); err != nil {
        //ここでパースエラーをキャッチします。
		if err, ok := err.(*json.SyntaxError); ok {
			log.Fatalf("Json Syntax Error(%s): %v", raw[err.Offset-15:err.Offset+15], err)
		}
		log.Fatalf("Json Unmarshal Error: %v", err)
	}
```

errが、jsonパッケージに独自実装されている `SyntaxError` かどうかの型判定を行い。
該当する場合、前後を抜き取る処理をします。
SyntaxErrorを見るとOffsetという項目が用意されており、これがエラーになった箇所が何文字目かを保持しています。

``` go
// A SyntaxError is a description of a JSON syntax error.
type SyntaxError struct {
	msg    string // description of error
	Offset int64  // error occurred after reading Offset bytes
}
```

このOffsetを利用し、読み込んだデータの前後15文字を取得するという処理を書いています。

## まとめ。

ちょっと前までこのコトを知らずいたので、知ったときはめっちゃ便利！と思いました。
ターミナルなど、Colorが使えるものなんかだとjsonを全文だして、該当部分だけ色を買えてみるなど使い方は色々できそうですね。
Vueでのフロント実装をレビューしていて思ったこと

# 環境
Vue3系
TypeScript

# import
## importが沢山になった時

あまりにimportするモジュールが多くなると、
`<script>`内が汚く見えてしまいます。
また、このコンポーネントには何がimportされているのか
見づらくなってしまいます。

そのため、importする種類ごとに分けて記述する方法を取りました。
例えば、`/models`に該当するモジュールは`module`ブロックに、
`/utils`に該当するモジュールは`utils`ブロックに分けて書く感じです。

```vue
<script>
// modules
import User from 'src/modules/User.ts'
import Company from 'src/modules/Company.ts'

// utils
import getUser from 'src/utils/getUser.ts'
import convertCompanyCode from 'src/utils/convertCompanyCode.ts'
</script>
```

## 相対パスと絶対パスの混在
importに相対パスと絶対パスが混在していると、
例えば該当Vueファイルを別ディレクトリに移動させた際にパスが切れてしまったりします。
また見た目も統一感がなくて気持ち悪いです。

例）
```vue
<script>
import User from 'src/modules/User.ts'
import Company from '../../Company.ts'
</script>
```

そこでimportのパスは絶対パスに統一すると良いかなと思っています。

# undefined
## dataの型宣言
```vue
<script>
const userName = ref<string | undefined>('')
</script>
```

こんな記述があって、はてな？となりました。
空文字でdataの初期化ができているのに、どうして`undefined`型を宣言しているのでしょう。

仮にundefinedになる可能性があるのであれば
このように初期段階で空にしておけば良いです。
```vue
<script>
const userName = ref<string>()
</script>
```

もしくは文字型のみで型宣言して、undefinedが代入される可能性のある処理では
このように、代入元がなければ空文字が入るよう記述しておけば良いです。
```vue
<script>
const setUserName = (newValue: string | undefined): void => {
  userName.value = newValue || ''
}
</script>
```

## undefinedの可能性がある引数を取る関数
```typescript
export default (userId: number | undefined): string | null => {
  if (!userId) return null
  return userList.find(user => user.id === userId).name || null
}
```

このように引数にundefinedを取る関数がありました。

undefinedエスケープをする処理が無駄なように見えます。
そもそも`userId`が存在しなかったら、
呼び出し元でこの関数を使用しなければいい話だと思います。

そのため、引数にundefined可能性がある関数は
使用用途や使用方法について精査した方が良いかなと考えています。
Supabase Auth パスワード再発行用のメール送信及びパスワード再設定

# はじめに

Baas(Backend As A Service)で何かサービスを構築してみたいと思い、
firebaseを触ってみようと思ったところ、Firebase の代替と謳われているsupabaseを発見。

簡単なTodoアプリを公式を参考に構築してみましたが、パスワード再設定の部分で少し手こずったので書きます。

簡単なTodoアプリの構築に関してはこちらで解説しております。

https://qiita.com/doyaseizin/items/8820a095a433d09f300d

https://qiita.com/doyaseizin/items/d6e0237b700448cc1826

https://qiita.com/doyaseizin/items/2afe8df35e0a7adc7e00

https://qiita.com/doyaseizin/items/fad493559bd5fad22f02


# 使ったもの

* Vite + Svelte + Typescript
    * @supabase/supabase-js
    * tailwind css

* supabase
    * auth
    * db
    * realtime


# 詰まったこと

1. パスワード再設定用メールの送信メソッドが叩けない
    * `supabase.auth.api.resetPasswordForEmail()`
1. パスワード再設定メール内のredirect_urlがサイトURLに引っ張られる
1. パスワード再設定メソッドが叩けない
    * `supabase.auth.update()`

1と3は同じ原因だったため先に解説します。

## 1. パスワード再設定用メールの送信メソッドが叩けない。<br>及び<br>3. パスワード再設定メソッドが叩けない

### 概要

公式リファレンスや、技術系の記事を読み、パスワード再設定用のEmailを送るために、
`supabase.auth.api.resetPasswordForEmail()`を実行してみたが、`undefinedエラー`になってしまった。
また、パスワード情報を書き換えるために`supabase.auth.update()`をしたが、こちらも`undefinedエラー`になってしまった。

### 原因・解決方法

supabase-jsは2022年10月に**v2**がリリースされ、一部メソッド名が変更となり、
`resetPasswordForEmail`及び`update`のメソッドも変更されていた。

公式のリファレンスでは画面上部に**v1**と**v2**を切り替えるボックスが用意されているので、
こちらでリファレンスを切り替えて、確認した。

参考) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/c2e76037-84f2-764f-0fb5-7db35cc61aad.png)

```javascript
// sendEmail - v1
supabase.auth.api.resetPasswordForEmail()
// sendEmail - v2
supabase.auth.resetPasswordForEmail()

// update - v1
supabase.auth.update()
// update - v2
supabase.auth.updateUser()
```

他にも似たような名前で変更になっているものが多いので、注意が必要でした。

## 2. パスワード再設定メール内のredirect_urlがサイトURLに引っ張られる

### 概要

私の場合、無料枠を利用しているためプロジェクト数に限りがある。
節約のために、localの開発環境と展開しているproduction環境を同じsupabaseプロジェクトで管理していました。

local環境でsendEmailのメソッドを叩き、メールの内容を確認したところ、
`redirectUrl`を指定していたのにもかかわらず、`SITE URL`に登録しているproduction環境へリダイレクトしてしまった。

参考)

```javascript
resetPasswordForEmail(email, {
    redirectTo: 'http://localhost:8080/reset-password',
})
```

### 解決方法

1. supabaseの自分のプロジェクト管理画面を開く
1. サイドメニューから、`Authentication`を開く
1. `Configuration`内、`URL Configuration`を選択し、Redirect URLsに`http://localhost:8080/*`を追加する。

参考) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/63c7c0dd-db5a-c4c5-ffc4-18cb42ae54c1.png)

認証後のリダイレクト先として`localhost`を設定しておく必要がありました。
リダイレクト先に登録していないURLが`redirectTo`で指定されるとSITE URLに飛ぶようになっているようです。


少し苦戦しましたが、supabaseとってもいい感じなので、今後も使って楽々構築していきます。
RSA SSH: Permission denied (publickey,gssapi-with-mic). send_pubkey_test: no mutual signature algorithm

サーバーにsshする時にRSA認証を使っているのですが、MacOSをアップデートしたら
```
Permission denied (publickey,gssapi-with-mic).
```
で入れない。公開鍵や秘密鍵は変えていないんですけど・・。
```
ssh -vvv アカウント名@サーバーIP
```
で出力をよく見ると、
```
send_pubkey_test: no mutual signature algorithm
```
と書いてあり、調べると「RSA SHA-1 hash algorithm」というのが脆弱性から急速に非推奨になっているらしい。MacOS更新でその煽りを喰らった可能性が高い。
とりあえずの解決法は、所定のIPだけ認証形式を使うこと。
```/home/.ssh/config
Host ホスト名orIP
    PubkeyAcceptedKeyTypes +ssh-rsa
```
ベストな解決法ではない...
pythonでの問題「環境構築」メモ ::  ターミナルでpythonと打つとMicrosoft Storeが出ることへの対処

[環境や前提条件]
５年程pythonを使って来ましたが、初めて遭遇した問題解決をメモします。

OS: Win10 professional
言語:Anaconda python version 3.9.13

[状況]

pytharmのターミナル, Win10のコマンドプロンプト, や、Windoows terminalでpythonと打つとMicrosoft Storeが自動的に出てしまいました。

![store.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/6943fc53-bac9-8747-0f73-96f8684ed706.png)

設定でアプリと機能を押すと下記の画面が出ます。

![settei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/1ad97f2c-8b80-d76f-7199-82933d1ae567.png)

このアプリ実行エイリアスを押しますと下記の画面が出ます。
![ailias.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/61c3fa18-ca40-f739-fa98-3ee4b493c3e1.png)

このターミナルの下にアプリインストーラー(pytnon.exe), アプリインストーラー(pytnon3.exe) があったのですが現在では下記の方法で消しています。
なぜなら、何度もオフにしてもオンになってしまうからです。
検索しましたが、どのページもオフにするとかオフにしてからpythonを再インストールするとかです。
https://teratail.com/questions/m3gp2f5lxrwo49
https://qiita.com/ishitoki47259/items/2f8044c24ab328c744c7
[解決方法]
アプリと機能からアプリインストーラーを見ますがグレーアウトになっているためアンインストールできません。
![apply.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/41700c02-cd89-1f36-c2b9-a2a32fba73a7.png)

![apply2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/7973640d-8874-f83b-1404-b1e7edbd0a29.png)

アプリインストーラーをクリックし詳細オプションを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347416/a6360d72-8461-3644-8516-1824e22d233d.png)



リセットボタンを押します

※この対策は、私のPC環境に依存したものかもしれません。
実施される場合は自己責任でお願いします.
.NET6 WebAPIでファイルアップロード

せしまるです。

業務で.NET6使っていて、ファイルのアップロードでちょっと躓いたので備忘録

# 構成

サーバサイド
・.NET6
・C#
クライアントサイド
・Vue3
・TypeScript
・Quasar Framework

# やったこと

クライアントサイドからのファイルアップロード。
画面によって複数ファイルアップロードすることあり

# 本編

ファイル選択はQFileでやってます。
下記フォームデータ作る部分

```UploadCommand.ts
export class UploadCommand extends UploadBase<any> {
  constructor(files: File[]) {
    this.files = files;
  }
  files: File[] = [];
}
```

```UploadBase.ts
~~~省略~~~
this.configure = (config, data) => {
  if (config.headers) {
    config.headers["content-type"] = "multipart/form-data";
  }

  let form = new FormData();
  for (let key in data) {
    // データが複数の場合（複数ファイル）
    if (Array.isArray(data[key])) {
      for (let d in data[key]) {
        // key値「files」に対して複数のファイルをappend
        form.append(key, data[key][d]);
      }
    } else {
      form.append(key, data[key]);
    }
  }
  config.data = form;
};
~~~
```

次にサーバ側で受け取る部分

```TestController.cs
[ApiController]
[Route( "api/test" )]
public class TestController : Controller
{
    [HttpPost]
    [Route( "upload" )]
    public async Task<ActionResult> Insert( [FromForm] UploadCommand command )
    {
        // なにかしらの処理
        return Success();
    }
}
```

``` UploadCommand.cs
public class InsertInformationCommand
{
    // ファイルはIFormFileで受け取る
    // アップロードしたファイルリストがここに入ってくる
    public List<IFormFile> ImportFiles { get; set; }
}

```

サーバ側でのファイルの受け取り方は、
・1ファイルならIFormFile
・複数ファイルならIFormFileCollection、IEnumerable<IFormFile>、List<IFormFile>のどれか

サーバ側で受け取れたならあとは保存するなり読み込んでほげほげするなり。

# おわり

Command/Handlerパターン使ってるのそのまま持ってきてるから見づらかったらすみません。

おわり

参考
https://learn.microsoft.com/ja-jp/aspnet/core/mvc/models/file-uploads?view=aspnetcore-7.0
多対多のアソシエーションを設定する

# はじめに
railsで多対多のアソシエーションを設定する際に必要な知識を忘れないために記録に残します。
なお、テーブル間の関係は、userテーブルとroomテーブルが多対多の関係性であるとする。

# アソシエーションの手順
railsにおいて、多対多のアソシエーションを表現するためには、<strong>中間テーブル</strong>という概念を利用する。
中間テーブルとは、2つのテーブル間に配置するテーブルのこと。

- 中間テーブルに紐づくモデルを作成する
    
        % rails g model room_user

- カラムを設定
中間テーブルのマイグレーションファイルに外部キーを記載

        class CreateRoomUsers < ActiveRecord::Migration[6.0]
          def change
            create_table :room_users do |t|
              t.references :room, null: false, foreign_key: true
              t.references :user, null: false, foreign_key: true
              t.timestamps
            end
          end
        end

        % rails db:migrate

- アソシエーションの設定


            # app/models/room.rb内
            class Room < ApplicationRecord
              has_many :room_users
              has_many :users, through: :room_users
            end
            
            # app/models/user.rb内
            class User < ApplicationRecord
              # Include default devise modules. Others available are:
              # :confirmable, :lockable, :timeoutable and :omniauthable
              devise :database_authenticatable, :registerable,
                     :recoverable, :rememberable,  :validatable
              validates :name, presence: true
            
              has_many :room_users
              has_many :rooms, through: :room_users
            end
            
            # app/models/room_user.rb内
            class RoomUser < ApplicationRecord
              belongs_to :room
              belongs_to :user
            end
技術書本棚を作ってみた

# はじめに
オークファンには技術書購入の制度があります。
Software Design / WEB+DB Pressを定期購読しているほか、会社の技術スタック・メンバーの興味・新規テーマなどの観点から、これぞと思った書籍を購入して、オフィス各所の本棚に蓄積しています。IT企業でたまに見かける **「オライリー全巻購入！」** みたいな偉業はできませんが、月数冊ほど書籍が増えています。

ところが、模様替えによって本棚の一部が立ち退きを強いられました。
そこで、これを機に本棚を購入して、既存の書籍の大部分を集積して整理する話が持ち上がりました。私は本棚の調達と構築を任せていただき、オークファンにある技術書を整理することにしました。
「たかが本棚」と思ったかもしれませんが、いざ数百冊の書籍と向き合うと、いろいろ気づいたことが出てきましたので、それを記します。

# 準備
## 退避
本棚はオフィスの四か所に存在しました。ミーティングスペースに二か所、執務スペース近くに二か所です。
後者の二か所を移動することになったため、書籍を全部取り出します。同時に、書籍のバーコードをスキャンして書籍リストを作ります。

このリストは、ゆくゆくは書籍貸出システムを作り、その入力に転用したいと思っています。
書籍は置いておくだけでは意味がなく、読まれてナンボのもの。記録をつけて貸し借りできる環境を作ることで、書籍もフル活用できるはずです。特にリモート勤務の社員が多いため、誰がいつ借りたかを記録することは必須でした。

## 状況把握
本棚の中身を眺めてみると、本棚に技術書だけが入っているわけではないことは分かりました。
誰かが持ち込んだビジネス書、会社で購入した新書、部活動備品のボードゲーム、貸し借りするマンガ……など、地味にカオスを極めていました。
そのため、まずは技術書とそうでないもの、会社のものと私物を峻別するところからのスタートです。これには全社へ協力を仰ぎ、私物の本は外に出してもらいました。

残りの本棚も空にして、技術書とビジネス書に集約します。今回は技術書本棚がメインですが、ビジネス書の本棚も整備してあります。

## 書籍選定
技術はバージョンアップや時代の変化とともに陳腐化します。技術の方が本の先を行くことは、今では当たり前になっています。
そのため、社内で使用していない技術に関する古い書籍は、定期的に処分します。今回は本棚を全取り換えするタイミングだったので、数十冊の本を除籍します。
同時に、社内で使用しているレガシー技術スタックに関する本は、古くても残します。これは、**レガシー環境ほど、ウェブサイトが先に消滅する可能性が高い**ためです。
あとひとつ、特定の技術に特化しない古典も、積極的に残します。たとえばジェラルド・ワインバーグ『スーパーエンジニアへの道』など。

技術書は必要があって選ぶものですから、表紙が薄くなってきたりページが色あせた本からは、その時代の課題が見えます。
オークファンでは、それがPerlと正規表現でした。「リャマ本」の別名を誇るオライリー「初めてのPerl」と「詳説 正規表現」が数冊積んでありました。これらの本は、古くとも残します。実際オークファンの中にはまだPerlが生きていますし、数年後に入る人が触る機会もあるでしょう。

## 本棚選定
本棚の調達も並行して進めました。検討要素は、積載量と価格とスペース、そして耐震性のバランスです。
図書館のような書架は定番ですがちょっと高い。安価なメタルラックを使うと多くの本が入ることは分かっていますが、奥の本は取り出しにくいし、耐震性にも不安。
というわけでニトリに落ち着きました。

# 再配置
新しく届いた本棚に書籍を入れてゆきます。
これが一番難しいのです。実はいまでも終わっていません。

数百冊ある技術書を、どう並べればいいでしょうか？同じジャンルの本は同じ場所でいいと思いますが、それらのまとまった本を、どういう位置関係で並べるか？
本を並べるたびに、一度立ち止まって考えてしまいました。

私が事前に考えていたのは、以下のポリシーです。
- デザイナー寄りのことは左側
- インフラ寄りのことは右側
- レガシー寄りのことは下
- ビジネス寄りのことは左上

（´-`）.｡oO（うーん……曖昧なポリシーですね……）
実際、本を入れてゆくごとに何度も悩みました。この悩みは、書籍をリスト化した時点で考えるべきだったとは思いますが、どのみち、おそらく考えていた通りに配置することはできなかったでしょう。
内容の話もありますし、物理的サイズの話もあります。二次元に並ぶ書籍リストを三次元に変換してしっかり並べるのは、とても大変でした。

# 結果
いちおう、こんな風になりました。
![IMG_2771.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9384/73fab06f-b7c7-fefc-8f7b-bb6683ce81ab.jpeg)

隣の本棚も多少カテゴライズしたうえで整理しています。
![IMG_3036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9384/45dadf9e-6b01-8bf9-ed0a-d4d281b60cd8.jpeg)


Software Design / WEB+DB Pressは、電子版が出たら古い号を除籍する運用を検討中です。毎月増える本ですが、必要な情報が古い号にあったりするので残しておきたいですよね。

上にあるサイン色紙は、TKO木下さん・山田麻莉奈さん・長谷川玲奈さんのサイン色紙です。
上記の方々と社内で収録したテレビ番組で、いつのまにかADを担当し、その中でプロジェクトマネジメントを学んだ話も、機会があればどこかで語ろうと思います。

# 気づいたこと
## 入門書系が弱い？
本がそれっぽく並んでいますが、入門書系が少ないかもしれません。
二枚目の左上は初心者ゾーンになっていて、『プログラムはなぜ動くのか』などなど置いてますが、これで新卒エンジニアの課題に対応できるだろうか？

## 足りない本がある
これだけ集めても『リーダブルコード』がありません。『Webを支える技術』など、個人的に必携だと思っている書籍も、実は足りませんでした。
書籍リストを作っていた時点では、このことに気づかなかったのです。それは、リストには**何を書いていないかが分からない** という弱点があるためだと思います。
三次元で一覧化することで、ようやくそれが見えました。

あと、メインで使ってるPHPに関する本が、意外と少ない……。ちょっと整え直しましょうか。

## 技術書本棚は生きもの
ここまで整理しても、これで完成ではありません。状況に合わせて本を見繕い、本を購入して配置し、返却された本を適切な位置に並べ、誰かが適当に置いた私物の本を突き返し……と、メンテナンスを続けることで本棚は生き続けます。
このサイクルが止まると、誰も参照しない紙の集積物ができあがってしまいます。参照されない本は負債となり、物理的にスペースを圧迫するだけです。


# 最後に
「この本が足りない！」「この本とこの本はまとめておくべきだ！」など、書籍に関するツッコミがありましたらぜひお願いします。予算の範囲でいろいろ増やしていきたいですね。
ESXi上検証用環境の作り方（個人的な備忘録）

# 初めに

今回の作業は、主に二つの目標です。

- シスログサーバーの作成
- 踏み台サーバーの作成
  
## シスログサーバーの作成に関して

以下の四つとなります。

- ゲストOSの作成
- ゲストのIPアドレス設定
- rsyslogパッケージの設定
- ルーターの設定

### ゲストOSの作成

esxi上の作成となります。  
手順は簡単、ESXiのHPから仮想マシンの作成を選んで、
説明に基づいて進事。  
但し、iosイメージからosをインストールするので、仮想cd/dvd driverは接続のチェックを入れる必要があります。

### ゲストOSのIPアドレス設定

基本的にはNetwork Managerを用いてip address設置。  
途中で一回nmtuiで設置したですが、nmcli device connectの時にエラーが出ってうまくいけませんでした。  
ネットで検索したら多分bugがあるようなので、nmcliで再設定してうまく接続できました。

```bash
nmcli device modify <interface_name> ipv4.address <ip_address>
```

### rsyslogパッケージの設定

一番苦労した所です。  
設定する所自体はあんまり多くないですが、色々調べながら試してみましたので、結構時間がかかりました。  
基本的には/etc/rsyslog.confに対して以下の修正をすれば、/var/log/messagesというファイルで送ってもらったlogを確認する事ができます。(UDPの場合)  

```text
from
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
```

```text
to
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
```

この後もちろんサービスを再起動する必要があります。

```text
systemctl restart rsyslog
```

ssコマンドで今使われているポートの状態を確認する事ができます。  

ここまで簡単だと思うでしょうね。次がめんどくさい所です。  
送って貰ったログをホストごとにファイルで保存するために、rsyslog.confに対してtemplate追加しないといけないです。（知識がないのでログをうまく分類するためには結構苦労しました。）  
exampleとしては下記のように

```text
$template TEMPLATE_NAME,"text %PROPERTY% text", [OPTION]
```

欲しいのはhost毎にフォルダを作って毎日のログを保存するので、以下のように書けばできます。

```text
//fromhost, year, month, dayなどの変数を使う時にダブル%
$template RemoteHosts,"/var/log/hosts/%fromhost%/%$year%%$month%%$day%_message.log" 
*.* -?RemoteHosts
```

templateの所最初にドキュメントを参照して色々作りたいと思いますが、うまく出来ませんでした。今後また勉強する必要があると思います。

### ルーターの設定

この部分はかなり簡単だと思います。  
但し、ciscoのルーターだと、デフォルトでsyslog serverがdisableの状態になってますので、

```text
 (config)#logging on
```

というコマンドによりenableする事ができます。  
詳しく設定は環境により違いますが、大体以下のような感じとなります。

```text
　(config)# logging buffered size //スイッチ内部に保存するログのバッファサイズ
　(config)# logging host ip-address //syslogサーバのIPアドレス
　(config)# logging trap level //syslogサーバに送信する際のメッセージの「level」指定 
　(config)# logging facility facility-type //syslogサーバに送信する際のFacility指定 ( local0 ～ local7 のどの値を使用するかはsyslogサーバの管理者に確認 )
```
すべて設定すると完成ですね。

## 踏み台サーバーの作成に関して

主に下記の2Stepとなります。
- ESXi上仮想踏み台サーバーを作る事
- SSHの場合はSSHのポート転送する事により踏み台サーバー作る完成。

### ESXi上仮想踏み台サーバーを作る
上の手順を参考できると思うので、ここでは省略します。

### SSHの場合はSSHのポート転送する事により踏み台サーバー作る
大体の手順は

```
踏み台サーバーのFW設定確認・変更
           ↓
ローカルssh-keygenで鍵を作成
           ↓
公開鍵をサーバー上に置く
           ↓
（オプション）操作ログを残すための設定
```
こちらの詳しい手順はネット上の資料で色々参考できると思います。
[構築2年目SEがRemminaを使った踏み台サーバを構築してみました](https://www.niandc.co.jp/sol/tech/date20210326_1999.php)
[踏み台SSHサーバー構築メモ](https://qiita.com/u1ymd/items/c5c75c697c39a7881e3e)
[セキュアなSSHポートフォワード管理サーバーを構築](https://hrkworks.com/it/linux/server/sshfw_mngr/)

# 最後
一年以上に経ってから再度振り返ってみたらやはり忘れる部分もあります。
今後二度と同じ作業がないかもしれませんが、備忘録として残しても損はないと思いました。
以上。
DBeaverでのTeradata Vantageの接続設定

著者 Adam Tworkiewicz
最終更新日 2022年9月12日

# 概要

このHow toではDBeaverを使用してTeradata Vantageへの接続を作成する方法を説明します。

# 前提条件

・Teradata Vantageインスタンスにアクセスします。

:::note info
Vantageの新しいインスタンスが必要な場合は、[Google Cloud](https://qiita.com/ykswi/items/10a382de5fa5a4a42c50)、[Azure](https://qiita.com/ykswi/items/2c30aa1f5413b16c838c)、[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドにVantage Expressという無料版をインストールすることができます。また、[VMware](https://qiita.com/ykswi/items/ebe1d854c38db9bb0f51)、[VirtualBox](https://qiita.com/ykswi/items/ffadaa375add309f2075)、または[UTM](https://qiita.com/ykswi/items/94995954ae723185c2f7)を使用して、ローカルマシン上でVantage Expressを実行することもできます。
:::

・DBeaverがインストールされていること。インストール方法については、[DBeaver Community](https://dbeaver.io/download/) または [DBeaver PRO](https://dbeaver.com/download/) を参照してください。

# DBeaverにTeradataの接続を追加する

1．アプリケーションウィンドウの左上にある「プラグアイコン」をクリックするか、データベース → 新規データベース接続と進み、新規接続ウィザードを開始します。
プラグアイコンはこれ
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/960e8e3b-7eee-91e6-a97d-73ca41060f3d.png)


2．Select your database画面で「teradata」と入力しTeradataのアイコンを選択します。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/d4245a12-da6d-1ce7-ac85-c5f4381f56e6.png)

3．メインタブですべての主要な接続設定を行う必要があります。必須項目はHost、Port、Database、Username、Passwordです。

:::note info
DBeaver PROでは標準的なテーブルの並び順だけでなくテーブルを特定のデータベースやユーザに階層的にリンクさせることができます。
データベースやユーザを展開したり折りたたんだりすることで、データベースナビゲータウィンドウを圧迫することなく、あるエリアから別のエリアへ移動することができます。
この設定を有効にするには、［データベースとユーザーを階層的に表示］ボックスをチェックします。
:::

:::note info
多くの環境ではTeradata VantageはTLSプロトコルを使用してのみアクセスできます。DBeaver PROでTLSプロトコルを使用するオプションをチェックしTLSを有効にしてください。
:::

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/713a200a-c1eb-82de-2dd7-e5997b513221.png)

4．「Finish」をクリックします。

# オプションでSSHトンネリング

データベースに直接アクセスできない場合SSHトンネルを使用することができます。すべての設定は「SSH」タブで行うことができます。
DBeaverは以下の認証方法をサポートしています：
ユーザ/パスワード、公開鍵、SSH エージェント認証

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/78c21b8d-6086-306a-7671-1a63e0bf4192.png)

# まとめ

このハウツーではDBeaverを使用してTeradata Vantageへの接続を作成する方法を説明しました。ぜひご活用ください！

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
私が社内交流を積極的にしていたワケ

## まず初めに
皆さんこんにちは。
ちょっとドキドキしながらアドベントカレンダー執筆に手を挙げてみました。
他の皆さんとは少し毛色の違った記事になるかと思いますが、温かい目で見ていただけると嬉しいです。

## この記事を書こうと思った経緯
私は昨年12月1日にCraft Eggへ入社しました。
怒涛の新規案件にシナリオ進行管理として配属され、
目まぐるしい日々を送っていました。
ひょんなことから新規案件から外れることとなり、
今は別案件の収録担当として業務を行っております。

この、新規案件から現在の案件へ移動する間、
少し業務のインターバルが発生し、
同タイミングで社内の交流活性化施策が開始！！
「これは活かすっきゃない！」とたくさん企画を立案していました。

そこには自分なりの”理由”があったのですが、
たまに「どうしてそんなに積極的に動いているの？」と
聞かれることがあったので、
せっかくならまとめてみようと思った次第です。

## 「推し会」企画
私が企画した中でも開催ごとに規模が大きくなったのは
「推し会」でした。
ただただ好きなものを語って下さい！ジャンルは問いません！という、
ざっくばらんで楽しい会です。
キャラを紹介する人もいれば、声優さん、女優さん、癒し系キャラ、歌い手さんなど、
本当にジャンル問わずいろいろとお話してくださいました。

そんな会の開催のきっかけは「みんなの好きなものを知りたい」でした。

## 好きなものって大きな活力
自論なのですが、好きなものを知ると
その人を知ることができると思っています。
例えば、明るいキャラが好きな人は元気づけられるのが好きなのかな、
まったりふわふわしたキャラが好きな人は癒されたいのかな、とか。
ホラー映画の中でもこれが好きならあれも好きかな？とか。

うまく言語化できないのですが、好きなものには傾向があり、
その傾向によって話の幅が広がるし、
逆に知らないことを教えあえたりもするわけです。

## どんなメリットがあるのか
でも、その「好きなもの」を
社内にいる人とお話する機会ってあまりないと思いませんか？

なんとなく、「あれ好きなんだろうなぁ」というのはあっても、
それをきっかけに話をすることは少ないかと思います。
社内での雑談で急に話を振るのも気が引ける、
本当は好きじゃなかったらどうしよう、って遠慮しちゃいそうですしね。

でも、このお互いの「好き」を会を通して知ることで、
大事な【接点】が生まれます。

業務で直接関わることは少ないけれど、ふいにすれ違ったとき、
お互いに教えあった推しの近況を知ってくれていたり、
また話を聞きたいからランチにでも行きましょう、と、
話題と行動の幅も広がります。

もちろん、業務の中で気になったことがあったときに
比較的声をかけやすくなるので、
話を進行するうえで1つの安心材料にもなると思います。

## ＋αの効果
それ以上にコンテンツに対しての愛を正面から受け取ると
ものすごくエネルギッシュで明るいパワーをもらえる気がします。
知らないものに目を輝かせていた子供の時のような、
ワクワクするなにかを目の前にしているようなあの感じ。
私はこの効果が個人的に大好きです。

好きなものに対して感想をもらえれば話した側は素直にうれしくなり、
受け取る側もパワーをもらえる。
こんなにポジティブな空間ってあまりないだろうな、と。
趣味のつながりだけでは得られない、会社の同僚としての距離感だからこそ
この空間が生まれると思っています。

## まとめ
推し会以外にも積極的にほかの企画へ参加・立案していたのも、
基本的にはこの「好きを知りたい」が原動力でした。

好きじゃなければスポーツをしないだろうし、
今はまだ好きになっていなくても
興味があるということは少なからずポジティブな感情があるということ。
そんないろいろな「好き」から、皆さんの人柄を知っていきたかったのです。

もちろん、あまり人に知られたくないなって方も多いと思います。
そういう方には強制せず、気が向いたらぜひ教えてほしいな～のスタンスで、
あくまでもプラスにならないことはしない、がモットーです！

お付き合いいただきありがとうございました！！
All in One SEOの「固定ページ タイトル」が勝手に書き変わってしまう事象について

# 事象について

- 数年前から運用しているWordPressのブログの「固定ページ タイトル」が書き変わってしまうことがある
  - タイミングは現状不明


# 「固定ページ タイトル」 の格納場所

- 「meta_key」カラムの値が「_aioseop_description」から「_aioseo_description」に変わったようだ（途中のpが消えた）

  - 以前: 「wp_postmeta」テーブルの「meta_key」カラムの値が「_aioseop_description」のレコードの「meta_value」 
  - 現在: 「wp_postmeta」テーブルの「meta_key」カラムの値が「_aioseo_description」のレコードの「meta_value」 

## 確認方法

- 下記SQLを実行すると、「_aioseop_description」と「_aioseo_description」があるかを確認できる
  - 「_aioseo_description」だけなら問題ない（または別のところに問題がある）

```sql
SELECT * FROM wp_postmeta where meta_key = '_aioseo_title' or meta_key = '_aioseop_title' order by post_id, meta_id
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302952/d10332a6-fb91-9add-be12-7718236804da.png)

- SQLを実行する際に「Database My Admin」というプラグインが使える
  - https://ja.wordpress.org/plugins/my-database-admin/

# 原因

- 何かのタイミングで「_aioseop_title」のデータが「_aioseo_title」にコピーされて「固定ページ タイトル」が書き変わってしまうと思われる


# 解決方法

- 原因となっている「meta_key」が「_aioseop_title」のデータを削除する、または書き換えればよい


## 削除する場合

```sql
DELETE FROM wp_postmeta where meta_key = '_aioseop_title'
```

## 書き換える場合（削除するのが少し怖ければ）

```sql
UPDATE wp_postmeta SET meta_key = '_delete_aioseop_title' where meta_key = '_aioseop_title'
```
FlashListってどんなライブラリ？

## はじめに

ページング横スクロールで3桁台の数の入力フォームを扱う要件があり、
使用ライブラリに[react-native-reanimated-carousel](https://github.com/dohooo/react-native-reanimated-carousel)を選定していたのですが、ローエンドのAndroid端末で動作があまり快適でない印象を受けました。
そこで前々から動作が軽いと噂程度に聞いていたFlashListについて調べたのでまとめておきます。

## FlashListとは

FlashListは、FlatListよりも軽くて高速に動作するリストビューです。
Shopifyのエンジニアによって作成され、下記を謳い文句に2022年7月にOSS化されました。
* ローエンドの端末でも60FPS以上の安定したスムーズなスクロールが可能であること
* スクロール時に未レンダリングの発生を抑えられること
* FlatListと実装の置き換えが容易であること

ネイティブの変更があるライブラリですが、Expoでもサポートされており使用できます。
また、[組積レイアウト](https://shopify.github.io/flash-list/docs/guides/masonry)も実装できます。

## なぜ軽くて高速なのか

FlashListでは、内部で[RecyclerListView](https://github.com/Flipkart/recyclerlistview)というライブラリを使用しています。
RecyclerListViewではセルリサイクリングを採用しており、RecyclerListViewとFlatListはアイテムのレンダリングの仕組みが異なり、ハイパフォーマンスなスクロールを可能にしています。

## セルリサイクリング

FlatListでは表示予定のアイテムのビューを常にゼロから生成します。
リストをスクロールすると新たなビューが生成され、不要になったビューは破棄されるとともにガベージコレクションが発生します。
スクロールが高速であればあるほど、生成と破棄のコストは増加し、パフォーマンスに影響を与えはじめます。

それに対して、RecyclerListViewではスクロールによってビューポートから外れたビューを破棄せず、別のアイテムの表示に再利用し、FlatListで発生していたメモリー・フットプリントの増加を防ぎます。
再利用されるコンポーネントはアンマウントされず再利用されるため、Propsとして受け取るdataやextraData以外の状態はそのまま引き継がれる点に注意が必要です。
例えば、アイテムコンポーネント内でuseStateを使用する場合には、Propsとして渡されるアイテムのデータが変わったことを検知し、Stateの書き換えが必要になるかもしれません。
他には、アイテムコンポーネント内でScrollViewを使用しているとスクロールのオフセットも引き継がれてしまう点などです。

## 使ってみた感想

Android端末のPixel4aで使用してみた感想になりますが、3桁程度アイテム数が増えてくるとFlatListよりも明らかにスクロールがスムーズであることが体感できました。
（面倒だったので計測とかは行ってないですが:sweat_smile:）
セルリサイクリングに注意は必要ですが、大量のアイテム一覧をスクロールするSNSやECのようなアプリの実装の際に貢献してくれるライブラリだと思います。
FlatListとの置き換えも`estimatedItemSize`を指定するくらいなので、今後機会があれば使ってみたいです。

## 参考

https://shopify.github.io/flash-list

https://shopify.engineering/instant-performance-upgrade-flatlist-flashlist

https://github.com/shopify/flash-list

https://github.com/Flipkart/recyclerlistview
ビルド前後に処理を挟む

# はじめに
「ビルド時に自動でバージョンを更新したい」「エディター上でだけ有効であってほしいアセットがある」など事情は様々でしょうが、そういった場合に使うであろう実装の話。
頻繁に使用する割に結構忘れるので、備忘録的に。

# 開発環境
- Unity 2021.2~

# 実装例
``` csharp
#if UNITY_EDITOR
using UnityEditor.Build;
using UnityEditor.Build.Reporting;

public class CustomBuildPreprocess : IPreprocessBuildWithReport
{
    // 実行順
    public int callbackOrder => 0;

    // 事前実行
    public void OnPreprocessBuild(BuildReport report)
    {
        /* 処理内容 */
    }
}
#endif
```

# 解説
## プリプロセッサディレクティブで条件を指定する
まず全体をプリプロセッサディレクティブで括り、`UNITY_EDITOR`を指定します。
これらの処理はビルドに含めないため、括らないとエラーが出ます。

## usingディレクティブの指定
下記を記述する。
``` csharp
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
```
`UnityEditor.Build`はインターフェース`IPreprocessBuildWithReport`と`IPostprocessBuildWithReport`を使えるようにするのに必要。
`UnityEditor.Build.Reporting`はそれらで実装する関数の引数に指定する`BuildReport`を使うのに必要です。

## インターフェースを継承する
ビルド前かビルド後かで、適切なインターフェースを継承する。
`IPreprocessBuildWithReport`はビルド前、`IPostprocessBuildWithReport`ビルド後の処理を持つ。

## callbackOrderを実装する
callbackOrderはビルドプロセスの実行順を指定します。
小さい数字の方が実行が早いです。

## 割り込み処理の内容を実装する
`IPreprocessBuildWithReport`を継承しているなら`OnPreprocessBuild`を、`IPostprocessBuildWithReport`を継承しているなら`OnPostprocessBuild`を実装する。
引数には`BuildReport`を指定する。

# おわりに
ディレクティブで括って、インターフェースを継承して、関数を実装する。単純ですね。
バージョンによって実装方法が違いますが、現行のバージョンではこれで良いはずです。

# 公式ドキュメント
[Unity - Scripting API: IPreprocessBuildWithReport](https://docs.unity3d.com/ScriptReference/Build.IPreprocessBuildWithReport.html)
[Unity - Scripting API: IPostprocessBuildWithReport](https://docs.unity3d.com/ScriptReference/Build.IPostprocessBuildWithReport.html)
[Unity - Scripting API: BuildReport](https://docs.unity3d.com/ScriptReference/Build.Reporting.BuildReport.html)
【Unity】FindObjectOfTypeで指定したクラスを取得する

__FindObjectOfTypeとは__

特定のクラスが存在するオブジェクトを、すべて取得して、配列に入れる仕組みを作る。
オブジェクトを複製して、すべてに同じスクリプトを追加するううことが出来る。

全てのコンポーネントの中からスプリクトを探すため重い処理となっている。乱用注意。

__基本構文__
```
  変数 = 実装されているクラスのスクリプト名.FindObjectOfType<探すもののスクリプト名>();

```
AWS認定クラウドプラクティショナー合格に向けて Day4

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day3](https://qiita.com/Ayako_0224/private/ed8b349af8366174f8b7)

# AWSの仕組み
インフラやシステム機能をオンライン上で組み合わせてカスタマイズして自分のしたいことを実現する仕組み

# サービス
- コンピューティング(サーバ)
- ストレージ(データを保存)
- ネットワーキング(仮想ネットワークを作成しAWSサービスへの接続を提供)
- データベース・分析
- セキュリティ
- マネジメント(ID管理・モニタリング)
- アプリ結合・連携(メッセージング処理・データの連携)
- 移行と移転(AWS環境にインフラやデータ移行)
- AWSコスト管理(コストの確認や見積もり)
- 開発支援(AWS上でアプリを開発・デプロイ)

# その他のテクノロジー
- IoT
- AI
- ロボット
- 人工衛星
- ブロックチェーン
- 量子コンピュータ
- ゲームテック
- メディアサービス
- VR/AR
- 仕事環境

# グローバルインフラ構成
## リージョン(各地域に1つ)
データセンターが集まっている世界中の物理的ロケーションのこと
北米、南米、ヨーロッパ、中国、アジア、南アフリカ、中東など(日本には東京、大阪(ローカル))
リージョンによって価格や利用できるサービスが微妙に異なる
1つのリージョンにAZが2つ以上で構成される

### 隣接リージョン
広帯域の専用ネットワークで接続されている
ある一定の距離離れている必要がある(災害時などリージョン間で影響されないといった独立性担保のため)
**※中国国内のリージョンは政治的な理由で他のAWSリージョンとは完全に断絶されている(香港は例外)**

## AZ(リージョンに複数設置,基本的なサービスを配置、1つ以上のデータセンター)
AZ...アベイラビリティゾーン
1つ以上のデータセンターで構成された論理的なデータセンターのグループ
1つの複数の物理的なデータセンターで構成されている
AWSリソースを提供するサーバーが仮想化されて設置されている
AZによって1つのデータセンターでは実現できないような可用性、障害に強く拡張性の高いシステム運用が可能になる
各AZには個別に電力、冷却システム、物理的セキリティが備わっている
AZ間は低レンテンシーのリンクで接続されている
アプリケーションがAZ間で分割されていると災害などから安全に隔離・保護することができる
複数AZにシステムを跨いで提供することによって物理的な耐久性などが向上する
が、システム間の連携や共有が一部制限される
リージョンのある国の法律に影響される可能性もあるため考慮する

東京リージョンには4つのAZがある
基本的には利用するユーザーに一番近いリージョンを選択する

## エッジロケーション(コンテンツ配信をするデータ配信用のサーバが設置)
AZを構成するデータセンターとは別にコンテンツ配信を実行する高速・広帯域なネットワークロケーション
リージョナルエッジキャッシュを活用して効率的にデータ配信をすることもできる

## ローカルゾーン(リージョンから遠い場所からサービスを使う場合にここに配置)
レイテンシーの影響を受けやすいアプリケーションをエンドユーザーにより近い場所で実行するためのロケーション

## Wavelength Zone(5Gを使える)
5Gネットワークを利用した高速アプリケーションを開発できるロケーション
通信プロバイダーのロケーションに設置されている
ゲームやライブストリーミングなど低レイテンシーが必要なアプリケーションを実現

## Direct Connect
AWSサービスに専用接続

次の記事は➡︎[AWS認定クラウドプラクティショナー合格に向けて Day5](https://qiita.com/Ayako_0224/items/cc8b881db92cf4f808d6)
【JavaScript】セーブしたら自動でオブジェクトリテラルの前後にスペースを入れたい【VSCode】

# 概要
VSCodeでコードを書いて保存する時、
```js
import React,{useState,useEffect} from "react";
```
これが
```js
import React, { useState, useEffect } from "react";
```
このように自動でなってほしい。自動で括弧の前後とかにスペースを入れたい。

プロジェクト単位ではなく、VSCodeで編集する全てのプロジェクトでこうなって欲しい。

# Vscodeの拡張でPrettierを追加
![スクリーンショット 2022-11-28 15.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637441/cc926e52-a2dc-567b-5f47-fe2bbb0fbc4f.png)

# Prettierの設定

https://ralacode.com/blog/post/vscode-prettier/

こちらの記事を参考に以下を設定
- Format On Saveの有効化
- Default FormatterをPrettierに設定

# Bracket Spacingを有効化
多分デフォルトで有効になっているが一応
括弧の両脇にスペースを入れる設定
これを設定でコピペすると出てくる
```
@ext:esbenp.prettier-vscode bracketSpacing
```

![スクリーンショット 2022-11-28 15.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637441/7b62d528-1fb7-263d-33a3-ef0f51850468.png)

# 参考
https://qiita.com/jnst/items/9f11634bea6c60996daf

https://ralacode.com/blog/post/vscode-prettier/
PietでHello World

# PietでHello Worldする
PietでHello Worldをしていきますが、難易度の評価は難しいです。
愚直に書いていくだけではあるのですが、良いコードにするとなるとなかなか難しいかもしれません。

## Hello Worldを考える
そもそも`Hello World\n`を出力するには何が必要でしょうか。
Pietでは文字の出力は`out(char)`コマンドで行います。
Unicodeにおいて`Hello World\n`のそれぞれに対応する整数は以下の通りです。
```
H  72
e  101
l  108
l  108
o  111
   32
W  87
o  111
r  114
l  108
d  100
\n 10
```

## Hello Worldを考える(コード編)
Pietは分岐がない場合直線上にコードを書けばとても簡単にコードをかけます。
ただそうすると非常に横長のコードになるのでそれを巻いたような渦巻き型のコードや、コードを畳んだ蛇型のコードになることが多い気はします。

ただ、結局コードとして成り立てばいいのでそこまで気にする必要はありません。

なにも気にしないでコードを書くと自分がどこのコードを書いているかを見失う可能性があるので気をつけましょう。

とりあえず`Hello World\n`を出力するコードを見ていきましょう。

![Hello_World.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634586/59c7e115-7e0b-6b99-2333-3903c9e44d58.png)

終了までに実行されたコマンドを確認しようと思いましたが莫大になったので各自確認してみてください。

実行環境はこちらです。
他の実行環境では動作が異なる場合があります。

https://kinumiya-norihito.github.io/web-piet-draw/

さて、インタプリタが読んでいく方向を転換の方法はいくつかあります。
一つは端または黒色のcodelにぶつかること。
もう一つは、pointerコマンドです。
さて、あなたが鮮やかなpietのコードを書きたい場合は積極的に黒を使おうとはしないでしょう。
そのような時にはpointerコマンドを使うわけですが、pointerコマンドで必ず現在の進行方向に対して右へ90度曲がるようにしたい場合は、push、pointerの順にコマンドを実行するようにしたら良いです。

また、`push→push`の順でコマンドを行うのと`push→dup`を行うのはスタックの上では同様の動作ですが、それぞれを使い分ける必要があります。

その一つはcodelが干渉する場合です。
もし、隣接するcodelが不幸にも同じ色になるとそのcodelはひとつのカラーブロックとみなされます。
そうすると意図しない動作が発生する場合があります。
二つ目は見栄えの問題です。
例えば`push`コマンドはそれを行うごとに一段階色が暗くなります。
例えばあなたが明るいイメージで画像を作ることを望む場合はすでに明るい色であれば`dup`を、そうでなければ`push`を使うなどの使い分けを行うと良いでしょう。
これは`add`を使うべきか`mul`を使うべきかといった問題や`pop`を適宜使うべきかなどにも繋がります。
ただ無意味なコマンドを追加しすぎるとコードの見た目はよくなるのに可読性は下がるという他の言語ではなかなか体験できない現象が発生します。
listがNoneかどうかを判定する

# listがNoneかどうかで条件分岐させたい。

Noneと比べるときは、＝ではないという話。
listがNoneの時とそうでない時があり、この条件に従って分岐させたかった。しかし、エラーに阻まれ敗北...

```python:
list = hoge#noneの時もあれば、[810, 114]のように値がある場合もある

if list = None
    print('noneです！')
else
    print('noneではないです。')

```

```
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
```

listが要素を持つとき(Noneではない時)にエラーが出ました。リストは複数の要素を持つので、a.any() or a.all()を用いずにNoneと比べることはできないようです。

# a.any()を使ってみた

```python:
list = hoge#noneの時もあれば、[810, 114]のように値がある場合もある

if any(list) = None
    print('noneです！')
else
    print('noneではないです。')

```
すると、今度はlistがNoneの時にエラー。ダメみたいですね...

```
TypeError: 'NoneType' object is not iterable
```

Noneの時はany()とか使えないよ、Noneだから...という意味でしょうか。

# 解決
listとNoneを比べるときに、`=`ではなく`is`を使うことで解決しました。

```python:
list = hoge#noneの時もあれば、[810, 114]のように値がある場合もある

if list is None
    print('noneです！')
else
    print('noneではないです。')

```
BigQueryのMultiStatement Transaction利用時の現在時刻の罠

以前に以下の記事でBigQueryでsleepをする方法を説明しましたが、これをMultiStatement Transactionと併用する時には注意が必要です。

https://qiita.com/shiozaki/items/e36dd9ba92fb192f8f46

まず、以下のSQLは5秒で終了します。

```sql
BEGIN
  DECLARE now TIMESTAMP DEFAULT CURRENT_TIMESTAMP();
  DECLARE finish TIMESTAMP DEFAULT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 5 SECOND);

  WHILE now < finish DO
    SET now = CURRENT_TIMESTAMP();
  END WHILE;
END
```

一方で、上記のSQLとほぼ同じである以下のSQLは無限ループしてしまいます。


```sql
BEGIN
  DECLARE now TIMESTAMP DEFAULT CURRENT_TIMESTAMP();
  DECLARE finish TIMESTAMP DEFAULT TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 5 SECOND);

  BEGIN TRANSACTION; -- この行を追加しただけ

  WHILE now < finish DO
    SET now = CURRENT_TIMESTAMP();
  END WHILE;
END
```

これら2つのSQLの間にどのような差があるのでしょうか？
下のSQLには、 `BEGIN TRANSACTION` があることから、MultiStatement Transaction機能を利用していることが分かります。
そして、この機能がONになると、CURRENT_TIMESTAMPは現在時刻ではなく、トランザクションを開始した時刻を返すようになります。
そのため、 `now < finish` という式の両辺は常に同じ値になり、式の評価結果は常にFALSEになり、無限にWHILEから抜け出すことができなくなってしまいます。

https://cloud.google.com/bigquery/docs/reference/standard-sql/transactions#datetime_functions_in_transactions
wsl2でdocker-ceが起動しない


## 構成
- Windows11 22H1
- wsl2
- Ubuntu22.04

## 原因
ubuntu22.04では、Firewallサービスはデフォルトでnfkが利用されている模様。
Dockerだとiptablesを利用しているらしい。

## 対処方法
Firewall系のサービスは、iptablesに変更する

```
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo service docker start
```


参考
https://kenichiro246.hatenablog.com/entry/2022/06/12/021152
https://let.blog.jp/article/26308254
Canvaについての初歩的な知識

# ジャンル
　グラフィックデザインツール。SNSへの投稿やロゴ、プレゼンテーション、ポスター、動画などが作成できます。

# プラットホーム
- ウエブ版
- デスクトップ版
    - Windows
    - Mac
- モバイル版
    - Android
    - iOS, iPadOS

# 料金
- Canva Free
    - 5GBのクラウドストレージ
    - 25万点以上の無料テンプレート
    - 100種類以上のデザインタイプ
    - 100万点以上の写真及び画像素材
    - 他人を招待してデザイン作業で連携
- Canva Pro (12,000円/年）
    - 1TBのクラウドストレージ
    - 1億点以上のプレミアムストック写真、動画、オーディオ、グラフック素材
    - 61万点以上のプレミアムテンプレートと無料テンプレート
    - 特定のプロジェクト専用フォルダーの作成
    - マジックリサイズ機能
    - 背景リムーバ
    - 8つのSNSでスケジュール設定
    - 24時間年中無休のカスタマーサポート
- Canva for Teams （18,000円/年）
    - 1TBのクラウドストレージ
    - Canva Proのサービスと機能
    - 承認ワークフロー、アクティビティログ、タスクやロールの割当などチームコラボレーション機能
    - チームのデザインをテンプレートに変換
    - テンプレートのロック機能
    - チームのレポートおよび分析情報
    - SSO
    - ISO27001認定取得及びコンプライアンス
- Canva for NPO （無料）
    - 日本では、特定非営利活動法人（NPO法人）、社会福祉法人、公益社団法人、公益財団法人、非営利の一般財団法人は、無料で使用することができます。
    - 100GBのクラウドストレージ
    - 7,500万点以上の画像
    - 350万以上のグラフィック素材
    - 3000以上のフォント
    - マジックリサイズ機能

# 有料プラント無料プランの違い
　クラウドストレージの容量の違いの他に、有料プランではデザインのサイズを編集中に自由に変更できます。無料プランでは、最初に設定したサイズを編集中に変更ができません。

# Canvaの特徴
　25万点以上あるテンプレートを使えば、誰でも気軽にクオリティの高いデザインを作成できます。また、作業画面もシンプルで、素材をドラッグ＆ドロップするだけで貼り付けることができます。
　日本語フォントも充実しており、日本語のデザインも問題なく作成することができます。

![おうじゃさんといっしょ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/b8ba9560-9167-892e-e6fa-36803e5b67d9.gif)

# 動画編集
![すぷもに.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/4c4abbfc-8f31-9963-d0fa-df7c564b8052.gif)

　有料版では、動画の背景除去もできるようになりました。

https://youtu.be/oq6inUFGAwo

# プレゼンテーション資料
　Canvaでプレゼン資料の作成もできます。デザインのテンプレートが多数ありますので、気に入ったテンプレートを使い、中身を入れ替えていきます。動きのあるものも作成できます。
![プレゼン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/2f320b04-6d7c-93b8-edfc-ec2c7cb6dbdd.gif)

https://youtu.be/js6tx7SaZKs

# 問題点
　たくさんのテンプレートがあるとは言え、どこかが作成したものと被る可能性があります。企業のブランディングに使用する場合は、テンプレートの使用を避けるようにした方がいいでしょう。
　無料版でプレミアムコンテンツを使用すると、ダウンロードできなかったりウォーターマークが入ったり制限があります。

# 学習動画
　このシリーズがわかりやすそうです。

https://www.youtube.com/playlist?list=PLEAiPHB9eMT2KMsrZZOwMiRZeZrrzp-dN
[SAP BTP] Trial Spacesの削除

お疲れ様です。
今回は、Trial環境のSpacesを増やしすぎたのでいい加減整理しようと思った矢先
削除方法がよく分からなかったので備忘録的な記事です。

# Spaces一覧
![スクリーンショット 0004-11-04 13.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/60c278ea-4d7e-72f4-c3d3-4b23ad6da4cf.png)
色々とやっているうちに増えてきたSpaces、、、

# 公式
![スクリーンショット 0004-11-04 14.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/f4dfd157-4ca6-8025-bff1-2f7d20c4f4dd.png)
成程、当然削除は出来る見たいですね。

# 実際に削除して見ましょう!!
![スクリーンショット 0004-11-04 14.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/34710129-d4f6-4962-dea1-8e41f4f58ede.png)
(1)Subaccountsの赤枠部分を押下します。

![スクリーンショット 0004-11-04 14.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/91973eab-798b-9e5f-cf5f-e8fba78da624.png)
(2)②目のアイコンを押下する。
(3)「Spaces」を押下する。

![スクリーンショット 0004-11-04 14.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/13688b3a-e150-3039-5deb-11615b01dedd.png)
(4)削除したいSpacesのゴミ箱ボタンを押下する。

![スクリーンショット 0004-11-04 14.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/71a291fa-b3e6-14b1-f689-ed7a2b259d2d.png)
(5)本当に削除する？っと確認されるので「Delete」を押下する。

![スクリーンショット 0004-11-04 14.19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500270/e8c70a14-9213-ef11-b7aa-93a22277f975.png)
(6)少しだけ待つと更新が入るので削除を確認できます。


# まとめ
SAP関連の検索方法はまだ難しい、、、
Wiki図的なものが無いのでたどり着くまで少し時間が掛かる、、、
今後少しでも解決までの時間短縮できればと思います。
ここまでお読み頂きありがとうございました
MFC から SVG クラスの円弧呼び出しコードサンプル

## MFC(GDI+) と SvgImage の円弧出力
MFC(GDI+) の場合以下のようになります。
```cpp
    Gdiplus::Pen pen(Color(255, 0, 0, 0));
	pGraphics->DrawArc(&pen, 100, 50, 140, 70, 30, 180);
```
SvgImage に書き出すと以下のようになります。
```cpp
	pSvgImage->AddArc(100, 50, 140, 70, 30, 180);
    pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
```
MFC(GDI+) は円弧などをパス出力した際にベジェ曲線に書き換えられます。
角が円弧の多角形などを描く際に便利ですのでパスに出力したいときもあると思います。
パスとして SvgImage に書き出す場合は以下の通りです。

```cpp
    Gdiplus::GraphicsPath path;
    path.AddArc(100, 50, 140, 70, 30, 180);
    Gdiplus::PathData pathData;
    path.GetPathData(&pathData);
    pSvgImage->AddPathData(&pathData);
    pImage->AddAttrStroke(RGB(0, 0, 0), 1, PS_SOLID);
```
AWS IoT RoboRunnerの一般提供が開始されたようです

AWSから2022年11月23日にIoT RoboRunnerの一般提供開始という情報が解禁されました！

# AWS IoT RoboRunnerとは
AWS IoT RoboRunnerとは、ロボットの集団と自動化ソフトウェアを接続するためのインフラストラクチャを提供するサービスです。つまり、ロボット集団を自動化によって管理しやすくなるサービスです。





ちなみにこのサービスは、Amazon倉庫で実際に使われているロボットテクノロジーからの派生みたいです。

AWSブログからは、
>AWS IoT RoboRunner は、ロボットのフリートがシームレスに連携するのに役立つアプリケーションをエンタープライズが簡単に構築しデプロイできるようにする新しいロボティクスサービスです。AWS IoT RoboRunner を使用すると、ロボットを相互に接続したり産業ソフトウェアシステムに接続したりするのに必要な複雑な開発作業を減らして、単一のビューからロボットを相互運用およびオーケストレートできるアプリケーションを簡単に構築できます。
というみたいです。

IoT化が進む世の中で、このようなサービスが一般提供されたことにより、より自動運転や利便性の向上、IoT化が促進されそうです。

AWS IoT Roborunnerの一般提供は、2022年11月23日時点では、バージニアリージョン、フランクフルトリージョンで提供されているみたいです。日本のリージョンでも提供され始めれば、IoT化がより促進されそうです。

現在の見通しでは、日本は少子高齢化などによる生産年齢人口の減少が示唆されているので、産業への自動化に対してこのようなサービスは嬉しいですね。


詳しく気になる方は↓
[AWS IoT Roborunnnerとは](https://aws.amazon.com/jp/roborunner/)

[AWS IoT RoboRunner の一般提供が開始されました](https://aws.amazon.com/about-aws/whats-new/2022/11/aws-iot-roborunner-generally-available/)
AWS認定クラウドプラクティショナー合格に向けて Day3

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day2](https://qiita.com/Ayako_0224/private/d3087ce68ab2ba7cbabb)

# 仮想化
仮想化... 物理的なインフラの構成を仮想化した単位に分けたり統合し利用する技術
SDI(Software Difined Infrascructure)...コードによってインフラ構成を実現する機能
JSONやYAMLファイルで記述することが多い

仮想化領域をセットアップし仮想化ソフトウェアを用いて容量を分割するなどして効率的に利用することができる。

## サーバーの仮想化
１台のサーバ上に複数のOSを動作させる
ホスト型(VMWARE)、ハイパーバイザ型、コンテナ方式(Docker)などがある。
### Docker
環境設定をコードで行うためファイルを共有すれば誰でも同じ環境を簡単に構築することができる
インフラの構築・削除がより簡単に早く行え、CI/CI/CDによる開発も行うことができる
## ストレージの仮想化
複数のストレージを統合してストレージプールを構成する
ブロックレベル仮想化、ファイルレベル仮想化などがある。
## ネットワークの仮想化
新たな仮想ネットワークの構築や制御をソフトウェアにより動的に実施する
SDN/VLANなどがある
## デスクトップの仮想化
サーバ上に置いたPCのデスクトップ画面を他の端末に転送する
セキュアに管理できる
仮想PC方式、ブレードPC方式などがある

## メリット
- 余分なコストがかからない
- 構成やメンテナンスなどの対応の柔軟性がある
- セキュリティ万全

# クラウド
クラウド...他社所有のハードウェアやソフトウェアなどをネットワークを通じて利用するシステムの利用形態

AWSのデータセンターではたくさんの物理的なサーバーを仮想化し、EC2などのサービスで切り分けてサービスを提供している

## 構成要素
- アプリケーション
    - アプリケーション
    - 業務パッケージソフト
    - フレームワーク
- ミドルウェア/OS
    - サーバ
    - DB
    - OS
- インフラ
    - サーバー機器
    - クライアント端末
    - ネットワーク機器

## 特徴
### 基本特性
- オンデマンド・セルフサービス
- ネットワークを介して各種デバイスから利用可能
- リソースの共有が可能
- 拡張が容易
- 稼働状況など計測可能

### サービス
- IaaS
  ハードウェアを借り、ミドルウェア・OSを購入しアプリケーションを開発
- PaaS
　ハードウェア・ミドルウェア・OSを借り、アプリケーションを開発
- SaaS
　ハードウェア・ミドルウェア・アプリケーションを借りサービスを提供

### 提供形態
- オンプレミス(自社所有)
- プライベートクラウド
　自社所有でサーバーを全部買い上げてグループ内でクラウド化して共有する
- パブリッククラウド
　外部のクラウド会社からサーバを借りる

## 進化
クラウドから超分散コンピューティング型のクラウドへと発展
```mermaid
graph TD;
    集中コンピューティング-->分散コンピューティング;
    分散コンピューティング-->クラウドコンピューティング;
    クラウドコンピューティング-->フォグ/エッジコンピューティング;
```

## 代表的なクラウドサービス
- AWS
- Watson(IBM)
- GCP(Google Cloud Platform)
- Azure(Microsoft)

この4つのクラウドサービスを介してIoT,AI,ブロックチェーンのサービスを提供するのが主流になってきている

## クラウドAI
- AWS
    - Amazon ML(機械学習環境)
    - Amazon API(画像識別)
    - Amazon Alexa(音声)
- Azure
    - Azure ML(機械学習環境)
    - Azure API(画像識別)
- Watson
    - Watson ML(機械学習環境)
    - Watson API(言語識別)
- GCP
    - Google ML(機械学習環境)
    - Tensorflow
    - Google API(画像識別)

次の記事は➡️[AWS認定クラウドプラクティショナー合格に向けて Day4](https://qiita.com/Ayako_0224/items/60625e275beba9481aaa)
BigQueryで長さの異なる配列をzipする

以前に以下の記事で2つの配列をzipする方法を紹介しました。

https://qiita.com/shiozaki/items/11c958e21cedfb95b16b

長さの異なる配列に対してこの手法を使うと、zip結果は短い側の配列の長さになり、長い側の配列の末尾は消されてしまいます。

結果の長さを長い方に合わせ、足りない部分はNULLで埋めるにはどのようにすればよいでしょうか？

# 答え
GENERATE_ARRAYした結果とCROSS JOINする

```sql
with data as (
  select ["apple", "pear"] as fruit_en, ["林檎", "梨", "蜜柑"] as fruit_ja
)
select
  fruit_en[safe_offset(i)] as fruit_en, -- デフォルト値をNULL以外にしたい場合はIFNULLも使う
  fruit_ja[safe_offset(i)] as fruit_ja,
from data
cross join unnest(
  generate_array(
    0,
    least(array_length(fruit_en), array_length(fruit_ja) - 1)
  )
) as i
```

なお、leastの代わりにgreatestを使うと、元の記事にあるような長さの一番短いものに合わせたzipが行われます。
CentOS7.9(2009)に対してPython3.11のインストール手順メモ

# CentOS7.9(2009)に対してPython3.11のインストール手順メモ
## 概要
### OS
* ディストリビューション：CentOS 7.9 2009
* インストールオプション：Minimalインストール

### Python3.11
* OpenSSL1.1.1以降が必要。
* CentOS7系はtclが含まれていないことから、tcl関連を考慮した上で、ビルドする必要がある。

## コマンド
### 全体
~~~
$ sudo yum -y install wget perl perl-Test-Simple perl-Test-Harness libffi-devel gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel tcl tcl-devel
$ sudo yum -y groupinstall "Development Tools"
~~~

### Pythonのため既存OpenSSLへのケア
~~~
$ sudo yum list installed | grep openssl
$ sudo yum -y remove openssl.x86_64
$ sudo yum list installed | grep openssl
~~~

### OpenSSL1.1.1sインストール
~~~
$ wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1s.tar.gz
$ tar xzf openssl-1.1.1s.tar.gz
$ cd openssl-1.1.1s
$ ./config
$ make
$ make test
$ sudo make install
$ sudo ldconfig -p | grep libssl.so.1.1s
$ ldd /usr/local/bin/openssl
$ sudo sh -c 'echo /usr/local/lib64 > /etc/ld.so.conf.d/local.conf'
$ sudo ldconfig
$ sudo ldconfig -p | grep libssl.so.1.1s
$ /usr/local/bin/openssl version
$ sudo ln -s /usr/local/bin/openssl /usr/bin/openssl
$ openssl version
~~~

### Python3.11インストール
* configureした際にオプション--enable-optimizationsを求められますが、オプション付けると失敗しました。
* make testで失敗や処理スキップが出ていますが、動いてはいます。結果は備考欄に記載ます。
~~~
$ wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz
$ tar -xzf Python-3.11.0.tgz
$ cd Python-3.11.0
$ ./configure
$ make
$ make test
$ sudo make install
$ sudo ln -s /usr/local/bin/python3.11 /usr/bin/python3
$ sudo ln -s /usr/local/bin/pip3.11 /usr/bin/pip3
$ python3 --version
$ pip3 --version
~~~

### 備考
* Python3.11 make test結果
~~~
Ran 1 test in 12.028s

FAILED (failures=1)
test test_unicodedata failed
1 test failed again:
    test_unicodedata

== Tests result: FAILURE then FAILURE ==

416 tests OK.

1 test failed:
    test_unicodedata

19 tests skipped:
    test_devpoll test_gdb test_idle test_ioctl test_kqueue
    test_launcher test_msilib test_ossaudiodev test_startfile test_tcl
    test_tix test_tk test_ttk_guionly test_ttk_textonly test_turtle
    test_winconsoleio test_winreg test_winsound test_zipfile64

1 re-run test:
    test_unicodedata

Total duration: 13 min 17 sec
Tests result: FAILURE then FAILURE
make: *** [test] エラー 2
~~~
エクセルのVBAでエクセルファイル自身が置かれてるフォルダーパス取得

# やり方

```vb
ThisWorkbook.Path
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/43f75643-a49e-8575-9adf-ddcca0022da3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6d855ba2-f2e9-c5c4-db93-64a0595d1ffb.png)

末尾に『\』は付かない。

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Microsoft Excel for Microsoft 365 MSO (バージョン 2210 ビルド 16.0.15726.20188) 32 ビット
Gitの基礎知識

# Gitとは
データを複数の場所で管理することを可能にしたシステム。
## Gitを利用する2つのメリット
1つ目は、プログラムを以前の状態に変更することができる。
誤って消してしまったコードを復活させたり、新たなバグ発生前のコードに即座に戻したり、上書きする前のコードを見つけたりすることができるようになります。

2つ目は、変更履歴を記録できる。
どこを修正したのか瞬時に分かるため、修正箇所の確認漏れを防止できます。

## 専門用語
### リポジトリ
ファイルやディレクトリの状態を記録する場所。
### ローカルリポジトリ
ユーザのPCにあるリポジトリをローカルリポジトリと呼びます。
### リモートリポジトリ
オンライン上で機能するリポジトリです。複数人とリポジトリを共有することができます。
### ワーキングツリー
ファイルを編集する場所。
### インデックス
コミットするためのファイルを一時的に保管しておく場所。
### コミット
インデックスに置いたファイルをローカルリポジトリに保存する操作
### プッシュ
ローカルリポジトリをリモートリポジトリへアップロードする操作。
### クローン
リモートリポジトリからローカルリポジトリをダウンロードし、複製する操作。
### プル
リモートリポジトリからファイルの変更点のみをローカルリポジトリにダウンロードする操作
### ブランチ
業履歴を枝分かれさせて記録できる操作。
例えばAブランチ、Bブランチという2つのブランチを作ることで、作業の種類ごとに履歴を残すことができます。また、2つのブランチは互いの変更に影響を受けないため、閉口して作業を進めることができます。
## マージ（ファストフォワード)
mainブランチがAブランチ作成時から進んでいない状況での統合の仕方。Aブランチは派生元のmainブランチの履歴を含んでいるため、mainブランチをAブランチの先頭に移動させるだけで、Aブランチの内容を取り込むことができます。
## マージ（ノン・ファストフォワード)
mainブランチがBブランチ作成時から進んでいる状況での統合の仕方。
この場合はマージコミットと呼ばれる新しいコミットを作成し、mainブランチをマージコミットに移動させます。その後、Bブランチをマージコミットに移動させます。
## リベース
mainブランチがBブランチ作成時から進んでいる状況でも、マージコミットを作成せずにBブランチと統合する操作。マージとは異なり、変更履歴を一本化するのが特徴。
## コンフリクト
2つ以上のブランチを統合する際、「同じファイルの同じ行」を編集していた場合に起きる現象です。この時Gitは、開発者自身にコンフリクトの解消を求めます。
## フェッチ
リモートリポジトリの最新情報をローカルリポジトリに取り込む操作。
そのためにローカルリポジトリでは、「リモート追跡ブランチ」を生成します。ローカルリポジトリは「リモート追跡ブランチ」と統合するだけでリモートリポジトリの変更点をローカルリポジトリ内に反映させることができます。

参考記事
https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0
https://qiita.com/gakisan8273/items/0e0ad1fee2a7c623f8d6
https://qiita.com/Tetsu_Oikawa/items/d2426cb49eb379afad54
https://qiita.com/satona-oinuma/items/97205ca0ce04dcae2adb
https://qiita.com/chihiro/items/5d8cb21457a9c707c565
NetBSD/arm進捗-20221128

FreeBSD/armがくそなので、NetBSD/arm 9.99に引越し中です。

|SOC|arch|状況|
|:--|:--|:--|
|STR9102|ARMv4(FA526)|Timer割り込みあがらず|
|IXP422|AEMv4|OpenRD boot仕様調べ中|
|MV88F5181(Orion)|ARMv5|ehciハングアップ|
|MV88F6281(Kirkwood)|ARMv5|普通に使えます|
|5VT1310(RT1310)|ARMv5|未着手|
|M83261(Comcerto)|ARMv6|USB割り込みあがらず|
|A10|ARMv7|普通に使えます|

随時dmesgはNYC*BUG dmesgdにアップしてます。

https://dmesgd.nycbug.org/index.cgi?do=index
Firebase Functionsのデプロイ方法

## はじめに
個人的に忘れやすかったので、メモ程度に🙏

## 01. Firebase Functionsをデプロイしてみる

以下のコードをコマンドラインに打ち込めばデプロイできる
```
firebase deploy --only functions
```

ただこれだと全ての関数が同時にデプロイされてしまう。

特定の関数をデプロイするには以下のコード
```
firebase deploy --only functions:[関数名]

//example
//firebase deploy --only functions:HellowWorld
```

## さいごに
最後までありがとうございました