OmniAICreator/Qiita-1.07M huggingface dataset:
さくらVPSのubuntuにDocker入れるまで

# 用意した環境
- sakura VPS 1G
- ubuntu 20系

# 初期設定覚え書き
https://qiita.com/shimano_equipped/items/9e6e8f4625e05c7e3b7b

# Docker入れる
## 参考記事
https://www.rough-and-cheap.jp/linux/installing-docker-on-ubuntu/

https://qiita.com/zembutsu/items/fd52a504321dd5d6f0b8

## install log

### Docker 公式からインストール
```
curl -sSL https://get.docker.com/ | sh
```
```
sudo apt -y install docker-compose
```

### かくにん！
```
$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
よかった。
[mac os] localhost に突然接続できなくなった

普段はHomebrewでインストールしたApacheを使っているのですが、突然localhostに接続できなくなってしまいました。

結論としては **launchctl経由で起動していたものを停止** したら直りました。

```shell:shell
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
```

HomebrewでApacheをインストールした際に同じように停止したはずですが、なぜか復活していました。
OCIでObjectStorageからReadableStreamを使用して大容量データをダウンロードするNode.js簡易Webサーバの作成

## 概要
OCIのObjectStorageにあるデータをNode.JSのOCI SDKを使用して取得するサンプルを紹介します。
本稿では例として大容量動画データをHLS形式でObjectStorageに保存し、
[ReadableStream](https://developer.mozilla.org/ja/docs/Web/API/ReadableStream)と再起処理を使用してクライアントにObjectStorageデータを返却する簡易Webサーバを作成しました。


## 準備
### HLS形式データの保存とデータ配信

https://qiita.com/nakasato310/items/bdf430947f516c48276a

こちらの記事にある通り、Digital Media Servicesを使用することで動画コンテンツの作成＆配信までおこなえます。
一方、SaaS観点では、より柔軟に配信Webサーバ側で、
- 独自の認証機能を付与したり
- または各データ配信単位で細かい追加処理（データ加工やAPI連携など）

を実施したいケースがあります。
配信部分を独自実装することで、より柔軟なサーバ実装が可能となり、
ブレークポイント指定して容易にローカル環境で都度デバッグが行えることも魅力です。

本稿では、検証用にNode.jsで動く簡易なWebサーバを作成しました。
Digital Media Servicesとの連携では、OCI Media Flowを使用してObjectStorageに動画コンテンツを保存し、
データ配信部分を今回作成した検証用Webサーバを使用します。
作成したサンプルではnodeコマンドでlocalhost:8080にてサーバを起動し、
クライアントアプリケーションからは対象のファイル(m3u8ファイル等)を指定します。
```shell-session:サーバ起動
    node .\HttpServer.js
```
```javascript:クライアントからアクセス
    play("http://localhost:8080/master.m3u8");          
```

### Node.js版OCI SDKの取得
Node.jsをinstall後、
ローカルの開発環境でDLする場合も基本的には下記コマンドを対象フォルダ内で実行するのみでnode_modeuleフォルダに格納されます。
```shell-session:サーバ起動
    npm install oci-sdk
```


## 実装
ソースは[こちら](https://github.com/masa-ishikawa/nodejs_webserver/blob/main/HttpServer.js)にアップしました。

HLS形式での動画配信では、インデックスファイルのm3u8ファイル内において、同一ファイルに対してバイトレンジを指定して複数リクエストに分割して取得する記述があります。
例えば下記のように1リクエストごとにhttpヘッダでバイトレンジを指定し、サーバ側はその該当部分のデータを返却します。
```shell-session:HTTPヘッダでバイトレンジの指定
    Range: bytes=847-4979123
```
そのため、本検証用WebサーバにおいてもRangeヘッダを解釈し、該当部分のバイト配列のみを返却する実装をしています。
また動画コンテンツのサイズの大きいデータはストリーム形式でデータが取得されるため、再帰処理も必要となります。







## おわりに
Node.jsを使用してObjectStorageから大容量データをReadableStreamで処理して返却する簡易Webサーバを作成しました。
localhostで動かせるため、ブレークポイントを設置してデバッグも容易にできるため、開発時に重宝します。
またlocalhostだけでなく、本サンプルをベースに加工して、OCIのコンピュートインスタンスに載せることも可能です。
参考になれば幸いです。:grinning:
Windows10のタスクスケジューラは『ユーザーがログオンしている…』の設定によって挙動変わることもある

:::note warn
『タスクスケジューラで想定通りに動かない時は、この項目の値を変えてテストするのも一つの手』
というレベルの参考情報となります。
:::

# 現象

```Process.Start()``` で別アプリケーションを起動するC#.NETのexe。

起動する別アプリケーションは下記にアイコンが載るようなもの。
（バックグラウンドで動く系のアプリ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/60d7b8f5-9853-b045-8be1-c1428f51c867.png)

exeをダブルクリックで実行した時の動作は問題無し。

でも **exeをタスクスケジューラ経由で実行したら** 想定通りの動作にならなかった。
（別アプリケーションはタスクマネージャー上だと起動しているが ^マーク内にアイコンが載らないなど、いろいろ想定通りにならなかった）

その時は **『ユーザーがログオンしているかどうかにかかわらず実行する』** にしていた。

逆に下記のように **『ユーザーがログオンしているときのみ実行する』** に変更したら想定通りに動くようになった。
（タスクを実行するユーザーアカウントは変えず）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/22e71f8e-171d-bced-6861-36ede23ce9f3.png)

**『ユーザーがログオンしているときのみ実行する』** の設定でも支障が無い要件だったので、これで良しとした。

# 蛇足

『exeを直接実行すると問題無いのに、タスクスケジューラ経由で実行すると想定通りにならない』ってこと結構ある。

『タスクスケジューラで実行して動作確認』（より本番に近い状況で動作確認）
を忘れないようにしよう！

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2251
Microsoft .NET Framework Version 4.8.04084
UWP Bitmapイメージにテキスト文字列を書き込む

# 実現したい内容

Bitmapイメージに文字列を書き込み、画像としてクリップボードにコピーしたい。

`RenderTargetBitmap`では、UI上に表示したものを画像に生成できるが、画面表示なしで実現したい。

# 対処

Win2Dパッケージの`Microsoft.Graphics.Canvas`を利用する。

:::note info
[Win2D documentation](https://microsoft.github.io/Win2D/html/Introduction.htm)
:::

```C#:書き込み先の準備
CanvasDevice dev = CanvasDevice.GetSharedDevice();
CanvasRenderTarget offscreen = new CanvasRenderTarget(dev, _ClipImageWidth, _ClipImageHeight, (float)_DpiX);
```

画像の書き込み先として仮想のデバイスを準備。

```C#:書式と文字列の準備
CanvasTextFormat fmt = new CanvasTextFormat();
fmt.FontSize = 12;

String sARGB = String.Format("ARGB={0}", ci.ARGB.ToString());
CanvasTextLayout lARGB = new CanvasTextLayout(dev, sARGB, fmt, _ClipImageWidth, 16);
String sTone = String.Format("Tone={0}", ci.ToneItem.Abbr);
CanvasTextLayout lTone = new CanvasTextLayout(dev, sTone, fmt, _ClipImageWidth, 16);

String sName = "";
if (!String.IsNullOrWhiteSpace(ci.Name) && ! ci.Name.Equals("Copied"))
{
    sName = String.Format("Name={0}", ci.Name);
}
CanvasTextLayout lName = new CanvasTextLayout(dev, sName, fmt, _ClipImageWidth, 16);
```

`CanvasTextFormat`で書式を設定。`CanvasTextLayout`でテキスト文字列を作成。例では、3つ用意。

```C#:文字列の書き込み
Color textColor = Colors.White;
if (ci.L > 5.0)
{
    textColor = Colors.Black;
}

using (CanvasDrawingSession ds = offscreen.CreateDrawingSession())
{
    ds.Clear(color);

    ds.DrawTextLayout(lARGB, 8, 0, textColor);
    ds.DrawTextLayout(lTone, 8, 16, textColor);
    if (sName != "")
    {
        ds.DrawTextLayout(lName, 8, 32, textColor);
    }
}
```

画像の背景色を設定の上、`DrawTextLayout`で画像にテキスト文字列を書き込み。

```C#:Bitmapの生成
InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
await offscreen.SaveAsync(ras, CanvasBitmapFileFormat.Bmp);
```

RandomAccessStreamに生成したイメージを書き出し。SoftwareBitmapが必要ならここから生成。

```C#:クリップボードへの貼り付け
RandomAccessStreamReference streamRef = RandomAccessStreamReference.CreateFromStream(ras);

DataPackage dpkg = new DataPackage();
dpkg.RequestedOperation = DataPackageOperation.Copy;
dpkg.SetBitmap(streamRef);

Clipboard.SetContent(dpkg);
```

ここでは、例として、クリップボードに生成したBitmapイメージを貼り付け。以下は、生成したBitmapイメージの例。

![生成したBitmapイメージの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729778/3c04cd8c-c8d6-fdf8-0bd3-17584d148149.png)

![生成したBitmapイメージの例2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729778/f081fffb-7497-effe-ddbc-a2372d45143d.png)
Reactでレンダリングを最適化するメモ化とuseCallbackを小学生にもわかるように説明する

# memoとuseCallbackとは
レンダリングのパフォーマンス最適化するためのコードです。

# レンダリングとは
現在のPropsとStateを元に、Reactがコンポーネントに対して、
それらがどのように見えるべきなのかを尋ねるプロセスです。

# レンダリングクを小学生にもわかるように解説
***コンピュータが絵を描いたり、文字を表示したりすること***です。

ex)
ゲームを遊んでいるときにキャラクターが動いたり、風景が変わったりしますよね？ これは、コンピュータが一生画面にその映像を描いているからです。この***画面に映像や文字を描く作業***を***レンダリング***と言います。

同じように、ホームページやアプリでも、***ボタンや文章、画像が表示***されますが、それも***コンピュータがレンダリング***をしているから見えるんです。

レンダリングは「目に見えるものをコンピュータが画面に描くこと」だと思えば分かりやすいです！

# どういう時使うか
処理の重たい子コンポーネントによって、
コンポーネントのレンダリングパフォーマンスに影響が出ているとき使うみたいです。

# 再レンダリングが起きる条件
stateやpropsが更新された時です。
再レンダリングされたコンポーネント配下の子要素は再レンダリングされます。

# Reactの「メモ化」
Reactでは、ページが表示されるたびに、同じものを何回も確認することがありますが、
これは毎回生徒に同じ質問をする先生みたいな感じになってしまいます。
メモ化を使うと、Reactは「前と同じだったらもう確認しないよ」と覚えてくれるので、処理が速くなるんです。

ここからはChatGPTの回答を引用します。

- 例え話：先生と生徒のやり取り
先生（React）は毎日クラス（コンポーネント）にいる生徒に質問をします。「今日は元気？」と聞くたびに、全員が同じ答えでも毎回聞き直してしまいます。

でも、もし前の日に「元気！」って言った生徒が、次の日も同じ「元気！」だったら、もう1回聞くのはちょっと無駄ですよね。

- メモ化は「前の答えを覚えておくこと」
メモ化というのは、先生が前の日の答えを覚えておいて、「同じ答えなら、もう一度聞かなくてもいいや」と判断することです。そうすると、先生は無駄な質問を減らして、他のことに集中できるようになります。

例えば、Aくんが「元気！」って言ったのを覚えておいて、次の日も同じ「元気！」だったら、先生はAくんにもう質問しなくてもいいんです。これが「メモ化」です！


# memoの使い方
簡単な使い方を紹介しておきます。memoはどう言う時に使うかというと
***コンポーネント(ここではChildArea)は、propsが変更されない限り、再レンダリングしない***という意味です。

```child.jsx
import { memo } from "react";

const style = {
  width: "100%",
  height: "200px",
  backgroundColor: "khaki"
};

export const ChildArea = memo((props) => {
  const { open } = props;
  console.log("ChildAreaレンダリング");

  return (
    <>
      {open ? (
        <div style={style}>
          <p>子コンポーネント</p>
        </div>
      ) : null}
    </>
  );
});
```

# useCallback
コンポーネントが更新されると、中にある関数も毎回作り直されます。
***useCallbackを使うと、その関数を「前に作った関数を覚えておいて、再利用する」ようにでき***、
無駄な再作成を防げます。これによってアプリが速く動くようになります。

```App.js
import { useState, useCallback } from "react";
import { ChildArea } from "./ChildArea";
import "./styles.css";

export default function App() {
  # 省略
  const onClickClose = useCallback(() => setOpen(false), [setOpen]);

  return (
    <div className="App">
      <input value={text} onChange={onChangeText} />
      <br />
      <br />
      <button onClick={onClickOpen}>表示</button>
      <ChildArea open={open} onClickClose={onClickClose} />
    </div>
  );
}
```
都合上詳しいアプリの詳細は記載できません。


# 資料

https://www.udemy.com/course/react_stepup/?utm_source=aff-campaign&LSNPUBID=fEh2HjeBHSU&utm_medium=udemyads&ranMID=47984&ranSiteID=fEh2HjeBHSU-_Tz.rbn4Xc7tzVKYhkFVfw

https://qiita.com/70ki8suda/items/be0af031bc32df8f6335

https://qiita.com/hellokenta/items/6b795501a0a8921bb6b5
エンジニアの遅刻対策は、アンミカさんの様に。

エンジニアのマネージメントをしていると困るのがエンジニアの遅刻です。
エンジニアさんは、本当に良く遅刻をしますｗ
・元々ゲームやネットを漁ってたりして寝るのが遅いこと
・食生活が乱れているので早起きができないこと
・仕事が忙しくてよる遅くまで仕事をしていること
等などの理由が考えられます。

# エンジニアに遅刻をするな！と言わない方が良い
多くのマネージャーの方々は、遅刻に対して怒っているのでは無いでしょうか？
これ逆効果です。いくら叱責しても改善されたのを見たことがありません。
本人がその気になっていない限り改善される訳がありません。
大体、エンジニアの勤務条件だって裁量労働制にしているのに時間に対して文句を言うこと自体無茶な話だし、エンジニア側は、だったら仕事減らせとか。結果を出してるので良いだろと思ってるでしょう。

# 具体的に困っている事を相談してみよう
よくあるのは、
・お客さんが朝から問い合わせしてくる事に対して、エンジニアが居ないので回答出来ない。
・相談したいのに何時にくるか分からないので、仕事が進まない。
・開発サーバーが止まってるのに誰も居ないので仕事が進まない
これらの事象に対して、具体的に相談して解決してもらいましょう。
お客からの問い合わせは、マニュアルを準備してくれるかもしれません。何時にくるかは家を出る前にスラックしてくれるかもしれません。開発サーバーは監視スクリプトと自動起動スクリプトを組んでくれます。
そもそもリモートワークなら遅刻の概念もありません。

# それでも困る場合は、ポジティブワードに変換
・今回の目標設定でお客さんへのレスポンス平均スピードを半日すると決めたんだけど、達成するためにマニュアルを一緒に作ってくれないか？
・相談のタイミングが事前に分かると、色々と資料の準備が出来るので、今よりも適切な質問ができそうなので、ちょっとの時間を取ってくれるだけで良さそう。
・○君が休んでいる間に作ってくれたものをしっかりとテストしたい
とか、そのエンジニアに取ってポジティブな未来がある様な言葉にして提案してあげると上手く行きます。
居酒屋の「トイレをきれいに使ってくれてありがとうございます」が良い例だと思います。

そうです。
**アンミカさんの様にポジティブに。**
【PHP】オブジェクト指向の近道 - アクセス権とカプセル化

# アクセス権を設定
アクセス権とは、クラス外からクラス内のプロパティやメソッドへのアクセスを制限するための設定です。アクセス修飾子を使用して、プロパティやメソッドに対するアクセス権を設定します。アクセス修飾子は`public` `private` `protected`の3種類です。

# `public`と`private`
`public`プロパティと`public`メソッドは、どこからでもアクセスできます。`private`プロパティと`private`メソッドは、クラス外からアクセスできません。同じインスタンス内であっても、`private`はクラスが違うとアクセスできません。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/bd5953f2-4906-a794-4a80-d2eda1d3334a.png)

この例では、すべてのプロパティを`private`、すべてのメソッドを`public`に設定しました。このようにすると、メソッドにはアクセスできますがプロパティにはアクセスできません。

プロパティ`name`を`public`にすれば、メソッド`getName()`は必要ないのではという疑問がでます。~~なぜこうするかというと、アクセス修飾子はアクセス権を設定できますが、Read onlyやWrite onlyを設定をすることはできません。そのため、プロパティをRead onlyにする時は、プロパティは`private`にしてReadだけできるメソッドを`public`にします。このようなメソッドを`getter`とよびます。また、Writeだけできるメソッドを`setter`とよびます。~~

PHP8.1以降では、プロパティに`readonly`を指定することが可能になりました。プロパティはできる限り `readonly`に設定し、コンストラクタで初期化し、メソッドでプロパティを変更しないようにすることが推奨されています。

# カプセル化
クラス外からのアクセスが不要なプロパティとメソッドを`private`で隠蔽して、クラスの中身を意識しなくてもよくすることをカプセル化とよびます。カプセル化のメリットは、`public`でクラス外からアクセスできるメソッドのみを保証すれば、その他のプロパティやメソッドはクラス内で自由に変更できることです。原則プロパティとメソッドは`private`、必要最低限のメソッドのみを`public`とするのがセキュアな設計です。

:::note info
プロパティとメソッドは`private`、必要最低限のメソッドのみを`public`とする
:::

# `protected`
アクセス修飾子`protected`のプロパティやメソッドは、クラス外からはアクセスできませんが、子クラスからはアクセスできます。内部処理用のメソッドですが、子クラスでオーバーライドしたいような時に使います。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/7ea32391-1422-c768-3e2a-eef2d6207629.png)

```php
<?php

class Person
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

class Person2 extends Person
{
    private $age;

    public function __construct($name, $age)
    {
        parent::__construct($name);
        $this->age = $age;
    }

    public function getAge()
    {
        return $this->name.':'.$this->age;
    }
}

$person_a = new Person2('suzuki', 28);
$person_b = new Person2('tanaka', 26);

$person_a_age = $person_a->getAge();
var_dump($person_a_age);
```

```sh:実行結果
string(7) "suzuki:28"
```

:::note info
`protected`はクラスを継承した時に使う
:::

# オブジェクト指向の近道（全５記事）
1. [なぜオブジェクト指向が必要か？](https://qiita.com/hyada/items/a50586ff3579c078d2b6)
2. [クラスとインスタンス](https://qiita.com/hyada/items/e86af8baf136ac27d9ae)
3. [継承とトレイト](https://qiita.com/hyada/items/ad9ecc8ddc75404b504e)
4. [アクセス権とカプセル化](https://qiita.com/hyada/items/866ecd191bb25ef5c368)
5. [staticと転送コール](https://qiita.com/hyada/items/238fdda17a6704e4c613)
C#.NETのexe起動時にコマンドプロンプト画面が出ないように設定

# やり方

Visual Studioのプロジェクトのプロパティで設定できる。

プロジェクト右クリック ⇒ プロパティ 。
（ソリューションのプロパティではない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9a05caa8-1ac0-e60a-75c7-744ebd9f4565.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/70278244-c16b-f499-c76b-279be46a5f7f.png)

アプリケーション ⇒ 出力の種類 ⇒ Windowsアプリケーション 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/560d0545-b1e8-9672-26c7-4159d9e1e792.png)

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2251
Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.3.6
Microsoft .NET Framework Version 4.8.04084
Salesforce便利機能02～学習コンテンツで学習項目の割当をしよう

Salesforceの機能として学習コンテンツがございます
今回は学習コンテンツを割り当ててみてみましょう

今回の内容は動画でも公開しています

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/CQRGdlMSDzs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


詳細はこちらのヘルプをご確認ください
https://help.salesforce.com/s/articleView?id=sf.customhelp_lex_learningpanel_add.htm&type=5


こちらの設定をすればガイダンスセンターのアイコンをクリックすれば特定のSalesforceのページに特定のリンクやTrailheadモジュールを表示させることが可能です


![資格.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e2a2e7ba-d773-96ee-f24d-1f34c0b6ab15.png)

設定場所は「学習」の「学習割当の管理」から新規をクリックして作成できます
![新規01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/677dad62-5bb5-dc41-fab0-5e936df1efad.png)


こちらから特定の期日や特定のユーザにモジュールやリンクの割当が可能です

ぜひご確認ください

皆さんいかがでしょうか

こちらをうまく活用すれば、Salesforceの画面にモジュールを出せるので簡単に学習することができますね

ぜひ試してください
ラボ毎に割当てられるロールが違うのか。。。（Google Cloud Skill Boost）

Google Cloud Skill Boostのラボ（Serverless Cloud Run Development）に挑戦しました。
サービスアカウントをサービスにバインドする箇所でエラー連続し数日悩み続けました。
原因はとても単純なことでした。

１）結論
ラボ毎に割当てられたロールが違う

このラボではApp Engine Admin、BigQuery Admin、Editor、Viewerロールが割当されてる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683167/5ca9c708-c115-b150-95b4-2e21d5bae02d.png)

違うラボではOwner、Viewerロールが割当されてる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683167/09752af3-16e2-d795-2457-18a782919302.png)




２）エラー
以下のコード実行するとエラーが出る
サービス（private-billing-service）へサービスアカウント（billing-service-sa-881）を
バインドするもの
gcloud beta run services add-iam-policy-binding private-billing-service 
--member=serviceAccount: 
  billing-service-sa-881@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com 
--role=roles/run.invoker 

エラー：
PERMISSION_DENIED
IAMロールが原因のようだ




３）原因
ラボ利用には制限回数があり、10回程度やると「ラボ制限回数を超過しました」と
そのラボが使えなくなる。
せっかく途中までやったので、バッジ獲得するために、あえて違うラボを利用していた。
自分が挑戦中のラボ（Serverless Cloud Run Development）は利用せずに
違うラボ（Monitor and Log with Google Cloud Operations Suite）を利用していたのが
原因だったようだ。
違うラボ（Monitor and Log with Google Cloud Operations Suite）では付与されてる
IAMロールにサービスアカウントをサービスへバインドする十分な権限がなかった。

通常なら悩まないところだけど、エラーのお陰で遠回りしたけど知識は増えた。
数日間エラーが解決できないと「自分はバカなのか？」と思ったりしてつらいけど
これからもエラーとは諦めずに向き合い続けようと思います。
ドキドキ、論文締め日までカウントダウン！！論文の書き方講座

# 初めに
みなさん、論文書かれていますか？
学部4年生と院生2年生がこの時期大変な時期で、様々なドラマが生まれていることでしょう。
そこで、先輩から教えてもらった論文の書き方をここに記して、皆様に貢献できればと思いここに記しました。
ぜひ、今後の参考にしてください。

12月の今頃参考にしている方はおそらく、来年も大学にいることでしょう。

# 論文の構成

### 0. 初めにの前にアブストラクト（概要が入ることも）
英語論文だったらよくあるやつ

1ページ論文のように初めにから終わりにを本当に簡潔にまとめる
大体10行程度
簡単な構成で書く

### 1. 初めに
- 今世の中にある問題などを書く
- 目的
    - なぜその研究をおこなったか
- 研究のアプローチ
    - どのように解決を行なったか？
   
### 2. 関連研究
- 周りの研究が行なっているものをピックアップする。
- 解決の仕方をあげ、その解決の仕方の問題点、自分の研究の新規性などを書き出す。
- 研究紹介にならないように気を付ける。

#### 関連研究について
関連研究は多いことに越したことはない。

##### 関連研究の量の例
- 4ページ論文
    - 十個以上
- 卒業論文
    - 30個以上
- 修士論文
    - 60個以上

#### 関連研究の探し方について
便利なGoogle検索ツールのようなサイトがあるので、そこで検索してみよう。

- IEEEエクスプローラー
    - https://ieeexplore.ieee.org/Xplore/home.jsp
- Scopus
    - https://www.elsevier.com/ja-jp/solutions/scopus
- ACM
    - https://dl.acm.org/
- Googleスカラー
    - https://scholar.google.co.jp/schhp?hl=ja
- arxiv
    - https://arxiv.org/




### 3. 研究内容
- なぜこの研究をおこなったのか
- 課題解決のアプローチをなぜおこなったのか？
- どうやってストーリーを作るのかの構成を決める

### 4. 評価実験
- この実験が本当に課題を解決できているのか？
- 誰が（エビデンス）どのような実験を行なって、どういった結果を得られたのかを簡潔に正しく書く。
- 結果に対してどのような考察を持ったか
    - 結果が自分が思ったような結果が得られた場合
        - 結果が正しかった要因を考える。
    - 結果が自分が思ったようにうまくいかなかった場合
        - 悪かった要因（嫌な数値が出た理由）を考える。 
- 他の研究と比較する
### 5. 終わりに
- まとめ
- 今後の研究
- 今後の課題
- [研究でやったこと-> 結果 -> 評価実験 ->どういった利益をもたらしたのか]を簡潔に書く。 




# その他気を付ける点

- 簡潔にかく
- わかりやすく書く
- 長文はやめる
- 人の論文をたくさん読んでなれる。
- ですます調はやめましょう。である調にします。
    - 論文は敬うものではなく、言い切る形で書くため。


小題を出して、骨組みを組む

## 細かい点。
誤字脱字、固有名詞の間違い、スペルミス、接続詞が違うなどは気を付ける。
ら抜言葉など、口語と区別を行う。
半角全角のミスをきをつける。

ですます調ではなく、れるられるなど言い切る形で書く。

## 段落
最初に何を述べるのかを書く
その後具体的な内容を書き表す
長文はやめる。



| 概要 |
| -------- | 
| 内容   | 
| 内容    |

## ピリオドとカンマを用いる。
。 -> .
、 -> ,

, .は半角全角を合わせる。
英語論文は半角で合わせて、日本語論文の時は全角で合わせる。

## 論文レビューについて

基本的にはコードレビューの文化と同じ。
どんな些細いなことでも、どんどん意見を言って、より論文をよくしていきましょう！！
基本間違っている内容を指摘しても大丈夫！！→修正をするかどうかは論文を書く側が決めること。　
スペルミスや表記揺れから見つけていくといいと思います。

### やってはいけないこと
人格の指摘
攻撃的なコメント

### 守るべきこと
しっかり相手をリスペクトする。

## 表や図にて気をつけるべきこと
- 数字で値を振り分ける時に、何を示しているのかをしっかりと表す。
- どこで実験を行なったのかを示す。
- 矢印や記号などが大きすぎてないか。
- 正解の値でなかった時に、どのような値が欲しかったのかを示す。。
- この実験を行なった背景を示す。


# 終わりに
ここに書いたことは、うちではこのように行うことが多いという文の体裁ですので、ぜひ様々な論文の書き方を比較して、自分の描きやすい書き方を見つけてみてはいかがでしょうか？
データ移行・データマイグレーション作業時に役立つリンク

kintoneアプリにデータをCSV等で読み込みする際に、エクセル等でデータマイグレーションなどをするが、その際の役立つリンクの備忘録。


# エクセル

## 重複削除

https://support.microsoft.com/ja-jp/office/%E9%87%8D%E8%A4%87%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%A6%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-00e35bea-b46a-4d5d-b28e-66a552dc138d

https://support.microsoft.com/ja-jp/office/%E9%87%8D%E8%A4%87%E3%81%97%E3%81%AA%E3%81%84%E5%80%A4%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B-%E3%81%BE%E3%81%9F%E3%81%AF%E9%87%8D%E8%A4%87%E3%81%99%E3%82%8B%E5%80%A4%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-ccf664b0-81d6-449b-bbe1-8daaec1e83c2

## 関数

### xlookup
https://support.microsoft.com/ja-jp/office/xlookup-%E9%96%A2%E6%95%B0-b7fd680e-6d10-43e6-84f9-88eae8bf5929

vlookupの新しいやつ。古いバージョンだと使えないので注意。
基本はvlookupと同じだけど、キー列とデータ列の位置がどうなっていても問題なく取得できるのでvlookupを使っている場合はxlookupに置き換える方が吉。

### text
https://support.microsoft.com/ja-jp/office/text-%E9%96%A2%E6%95%B0-20d5ac4d-7b94-49fd-bb38-93d29371225c

例えば、数値を文字列に変換するには`TEXT(A1,"@")`とする。
XLOOKUPなどルックアップ系の関数で、検索対象が数値っぽい文字列の時などは、TEXT関数で数値っぽい文字列を文字列に明示的に変換する必要がある。

### value
https://support.microsoft.com/ja-jp/office/value-%E9%96%A2%E6%95%B0-257d0108-07dc-437d-ae1c-bc2d3953d8c2

数値っぽい文字列を数値に変換する時に使う。

### sumif
https://support.microsoft.com/ja-jp/office/sumif-%E9%96%A2%E6%95%B0-169b8c99-c05c-4483-a712-1697a653039b

条件に合ったセルの値をサマリする。

# kintoneのファイル読み込みによるデータ移行について

## 読み込みエラーについて

### エラーの行番号

例えば、下記のような場合。

```
以下のエラーが発生しました。手元のファイルを修正して再度アップロードしてください。
GAIA_IL19: ファイルの4行目のフィールド「顧客番号」の値でのルックアップ（取得）に失敗しました。参照先のアプリでは、該当するレコードが見つかりません。
```

ファイルの4行目は、CSVファイルの先頭から4行目（ヘッダーを含む場合はヘッダーも1行としてカウントする）にエラーがある。


## テーブル内のフィールドをファイル読み込みで更新する

テーブル内のフィールドをファイル読み込みで更新する際の注意点。

テーブル内のフィールドを更新する際はすべてのフィールドを紐付けする必要がある。
https://jp.cybozu.help/k/ja/id/040726.html#import_records_import_recors_failed_1075

一括更新キーを指定して更新する際には、読み込みするファイルの列とテーブルのフィールド名の全てをマッピングする必要がある。
git clone時に、CA certificate key too weakと言われた時の対処

# 前提
* AlmaLinux9
* git clone時に「CA certificate key too weak」と言われた。

# 手順
* 現在の暗号化ポリシーの設定を確認する。
```
update-crypto-policies --show
```
* FUTUREとなっていたため暗号化レベルをDEFAULTに下げる。
```
update-crypto-policies --set DEFAULT
```
* rebootする。
* 以上

# 問題点
この問題はOSハードニングにより、暗号強度を高めていたために発生した。
暗号化強度を落とすことで解消可能ではあるが、逆にセキュリティ強度を下げてしまうことになる。
セキュリティ強度を維持したままgit cloneできる方法を探る必要がある。

## 解決策
Gitlabに関しては、SSHキーを設定すればVMのセキュリティ強度を維持したまま、Gitlabを使用できることがわかった。

### 手順
* 鍵ペア生成
```
ssh-keygen -t ecdsa
```
* 公開鍵（.pubの中身丸ごと）をGitlabのアカウントページ内、SSHキーの欄にコピペ
* ~/.sshフォルダを作成
* ~/.ssh/configファイルを作成
```
Host gitlab.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_ecdsa　←秘密鍵のファイル（.pubついていない方） 
```
* git cloneする。　※git@～の部分は取得したいページの「SSHでクローン」からコピペ。
```
git clone git@gitlab.com:任意のプロジェクト名
```
## 補足
はじめはクライアント側の証明書がTLS1.3の暗号強度に適合していないと思っていた。
でも実際は、サーバー側（アクセス先）の証明書の公開鍵暗号方式が弱かった。
こればっかりはTLS1.3の使用が一般化するまではどうしようもないと思われる。
自前のサーバーならTLS1.3を強制して作成すればよい。
RuboCopで見つけられたバグ Lint/UnreachableLoop

# 最初に

古いRubyライブラリのコミット権限を貰ったのですが、
それがRuboCopにたくさん注意されてました。 

自動で直せるところは自動で直しましたが、
それでもあまりに注意されてるので、
優先順位の低いものは`Enabed: false`で止め、
すぐ直せるところはすぐ直しました。

そうすると、残ってしまったCopがあります。
`Lint/UnreachableLoop`です。それについて書きます。

# `Lint/UnreachableLoop`

```console
RuboCop warned:
W: Lint/UnreachableLoop: This loop will have at most one iteration.
```

「未到達のループ: このループは多くても1回の繰り返しでしょう。」
バグっぽいですし、バグっぽいと思いましたが、バグでした。

```ruby
def foo
  @array.each do |e|
    (中略)
    return ans
  end
end
```

わかりやすく書くと、こんな感じです。
実際には、メソッドはもっと長く、もう少しだけネストしてました。

まぁ、`return`の書く場所を間違えたのでしょう。
Rubyが`end`だらけになって「どの`end`だ?」ってなるのは、あるあるかもしれません。

# 対策

- VSCodeなどでは、拡張機能でインデントに色をつけて見やすくする。
- RuboCopの優先順位の高いものをやる。
  - 優先順位が低いものは、切る。後回し。
  - そのライブラリでは、`Merics`は優先順位が低かったです。
- 複数パターンの場合もテストする。
- 不用意に`return`を書かない。
MySQLでテーブルの抽出を行う。

# mysqlに接続
```
***********@mbp ***** % mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28 Homebrew

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```
# データベース（スキーマ）の一覧を表示
```
mysql> show databases
    -> ;
+---------------------------+
| Database                  |
+---------------------------+
| ******_development        |
| ******_review_development |
| ******_review_test        |
| ******_test               |
| information_schema        |
| mysql                     |
| performance_schema        |
| sys                       |
| training                  |
+---------------------------+
9 rows in set (0.00 sec)
```
# ******_developmentのデータベースを表示させる
### 失敗
```
mysql> show ******_development
    -> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'garden_development' at line 1
```
### 成功
```
mysql> show tables from ******_development;
+------------------------------+
| Tables_in_******_development |
+------------------------------+
| a                            |
| h                            |
| l                            |
| p                            |
| p                            |
| s                            |
| u                            |
| v                            |
+------------------------------+
8 rows in set (0.00 sec)
```
# データベースの中のテーブルのカラムの情報を表示させる。
```
mysql> SHOW COLUMNS FROM ******* FROM ******_development;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | tinyint     | NO   | PRI | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
# テーブルの抽出をする
### 失敗
```
mysql> select * from *********;
ERROR 1046 (3D000): No database selected
```
### 成功　useでデータベースを対象にしてから抽出作業に移る
```
mysql> use ******_development;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
```
```
Database changed
mysql> select * from *******;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | a            |
|  2 | b            |
|  3 | c            |
|  4 | d            |
+----+--------------+
4 rows in set (0.01 sec)
```
# 感想
当たり前のことだけど忘れていた。
また同じ内容の記事をあげそうだ。
Apexにつかわれているオブジェクト項目の調査１(WorkBench)

### 要件
オブジェクト項目定義画面に「使用場所」ボタンで、該当項目の使用場所が見れますが、逆にApexになんの項目が使用しているかを調べるとき、ソースを見る以外、ToolingApiで調査できる
Salesforceの環境で、バッチやフロー、トリガーが同じように機械的に抽出できる

### 案
・WorkbenchでToolingApiで、MetadataComponentDependencyに関連項目で抽出する
・実際の抽出はVBAのマクロでやるので、別記事にする

### 実現メモ
①WorkBenchまたPostmanで、MetadataComponentDependencyからApex、Flow名と参照している項目Idを取得する
```
/services/data/v56.0/tooling/query/?q=select+MetadataComponentId,MetadataComponentName,MetadataComponentType,RefMetadataComponentId,RefMetadataComponentName,RefMetadataComponentType+from+MetadataComponentDependency+where+MetadataComponentType+in ('ApexClass') and RefMetadataComponentType in ('CustomField') order by MetadataComponentName
```
Workbenchの結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/c3528d98-66cd-2e0c-f710-3ff14674cae9.png)

②項目Idより、項目名とObjectIdを抽出する
上記①の図の一番目の項目IDより
```
/services/data/v56.0/tooling/query/?q=select+id,NamespacePrefix,developername,TableEnumOrId+from+CustomField+where+id+in+('00N10000009BweUEAS')
```
結果（項目名：StackTrace）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/27a23753-cfd9-2f52-bfb4-9b2004f242bb.png)

⓷TableEnumOrIdより、オブジェクト名を抽出する
```
/services/data/v56.0/tooling/query/?q=select+id,NamespacePrefix,developername+from+CustomObject+where+id+in+('01I10000001IdQ4EAK')
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/9608b780-8e65-34f3-e4b3-9869596867b5.png)

実際のオブジェクト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/07f9e525-1daf-4f5b-9f95-d2c6eee0dc61.png)
[OCI]Autonomous Database：Goで書かれたアプリケーションからAutonomous Databaseに接続してみた時のメモ

# はじめに
OSがOracle Linux 7.9のComputeインスタンスに、Go言語とOracle Instant Client、Go DRiver for ORacle（godror）をインストールしてAutonomous Databaseに接続してみた時のメモです。

# 1. GoとOracle Instant Clientのインストール

```
sudo yum install -y oracle-instantclient-release-el7 oracle-golang-release-el7
sudo yum install -y git gcc golang
sudo yum install -y oracle-instantclient-sqlplus
```
# 2. godrorのインストール

```
go mod init github.com/godror
go get github.com/godror/godror@latest
```

# 3. tnsnames.oraの作成

```
mkdir /home/opc/tns
vi /home/opc/tns/tnsnames.ora
```
```txt:tnsnames.ora
adb = コンソールの「DB接続」から取得した接続文字列
```

# 4. アプリケーションの作成

```
vi db.go
```

```go:db.go
package main

import (
    "os"
    "fmt"
    "database/sql"
    _ "github.com/godror/godror"
)

func main(){

    os.Setenv("TNS_ADMIN", "/home/opc/tns")
    db, err := sql.Open("godror", "username/password@adb")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer db.Close()

    rows,err := db.Query("SELECT TO_CHAR(sysdate,'YYYY/MM/DD HH24:MI:SS') FROM dual")
    if err != nil {
        fmt.Println("Error running query")
        fmt.Println(err)
        return
    }
    defer rows.Close()

    var thedate string
    for rows.Next() {
        rows.Scan(&thedate)
    }
    fmt.Printf("The date is: %s\n", thedate)
}
```

# 5. アプリケーションの実行

```
[opc@gotest ~]$ go run db.go
The date is: 2022/11/22 14:20:45
[opc@gotest ~]$
```

# 参考情報
・[Oracle Instant Client](https://www.oracle.com/database/technologies/instant-client.html)
・[Go DRiver for ORacle](https://pkg.go.dev/github.com/godror/godror#section-readme)
Jetpack Composeで動的に表示を切り替える

# 初めに
今回は`JetpackCompose`で実装している時に動的に表示を切り替える簡単なやり方を紹介していこうと思います。
### 本文
早速紹介していこうと思います。
まず、下記のメンバー変数を`@Composable`内部で宣言してください
```kotlin
val visible = remember { mutableStateOf(false) }
```
こうすることで宣言した`@Composable`が除去されるまで再度`compose`されても`remember`が`visible`の状態を監視し続けてくれます。
この`visible`を切り替えたい`View`の`expanded`に設定をしてあげることで簡単に表示を切り替えることができます。
表示・非表示の切り替えだけでなく、状態を監視してくれてるので`EditText`などへの入力がされた時に随時更新したい場合などでも使うことができます。
### 最後に
公式のサイトを参考にすごく噛み砕いて説明をしてみました。
https://developer.android.com/jetpack/compose/state#state-in-composables
もし誰かのお役に立てれば幸いです
falseになる変数を波括弧で囲むとtrueとして判断されるので注意が必要

falseが詰まった変数を波括弧で囲んでしまい、なんでfalseなのにtrueとして判断されちゃうのかな〜と5分くらい詰まったのでメモ。

falseを波括弧で囲んだコードがあるとする。
```typescript:サンプルコード
const thisIsFalse = false

if ({thisIsFalse}) {
    console.log("HOGE");
} else {
    console.log("HUGA");
}

console.log({thisIsFalse})
```

実行するとこんな感じに出力される。
```出力結果
HOGE
[object Object]
```

[JavaScriptのif文は、`Falsy`である値以外は全て`Truthy`として判断されるらしい。](https://developer.mozilla.org/ja/docs/Glossary/Truthy)
今回の例では`Falsy`として判断される８つ全てに当てはまらなかったため、`Truthy`として判断されたようだ。
Kubernetes関係メモ

適宜更新していきます。
|日時|更新内容|
|---|--|
|2022/11/15|初回|


# 定番
- [CNCF Cloud Native Interactive Landscape](https://landscape.cncf.io/)
- [Kubernetesドキュメント](https://kubernetes.io/ja/docs/home/)


# 記事など
- [Kubernetes道場](https://cstoku.dev/posts/2018/k8sdojo-01/)
- [独学Kubernetes　コンテナ開発の基本を最速で理解する](https://qiita.com/Brutus/items/d19af6b9c55de93663f6)
- [今こそ始めよう！Kubernetes入門 記事一覧](https://thinkit.co.jp/series/7342)
- [Kubernetes をこれから始める人に抑えてほしい！フォローすべきユーザーと読むべきもの一覧](https://www.wantedly.com/companies/wantedly/post_articles/30236)
- [今からでも遅くない! Kubernetesを最速で学ぶための学習法とは](https://thinkit.co.jp/article/18079)
- [Introduction to Kubernetes](https://cybozu.github.io/introduction-to-kubernetes/)
- [Docker が分かる人のための Kubernetes 入門](https://github.com/inductor/docker-to-k8s)
- [おうちKubernetes Cluster構築してみた](https://zenn.dev/saw/articles/create-home-k8s-cluster)
- [3時間弱でEKSに入門できるハンズオン、Introduction to Amazon EKSをやってみた #AWSSummit](https://dev.classmethod.jp/articles/aws-summit-online-2020-hol-06/)
- [Azure Kubernetes Service(AKS)を勉強するときのまとめ](https://blog.nomupro.com/entry/2020/01/04/221157)
- [社内のKubernetesクラスタ運用を効率化する基盤について](https://knowledge.sakura.ad.jp/31773/)

# Kubernetes Hard Way
- [Kubernetes(K8s)を仮想環境でHard Wayに構築してみた](http://c.itdo.jp/technical-information/docker-kubernetes/kubernetes-hard-way/)
- [Kubernetes The Hard Way - Proxmox (KVM)](https://github.com/infra-workshop/kubernetes-the-hard-way-on-proxmox/tree/japanese)

# Youtubeチャンネル
- [Kubernetes Meetup Tokyo](https://www.youtube.com/c/KubernetesMeetupTokyo/videos)
- [CNCF [Cloud Native Computing Foundation]](https://www.youtube.com/c/cloudnativefdn/featured)
- [CloudNative Days](https://www.youtube.com/channel/UCMBw1Z3fmhe-2l-iq2p4rNw/featured)


# 動画
- [インフラエンジニアBooks#03 青山真也氏と読む「Kubernetes完全ガイド 第2版」](https://www.youtube.com/watch?v=jg-PGHedqMo)
- [YouTuber、自宅kubernetesクラスタはじめたってよ](https://www.youtube.com/watch?v=DuymC2o-uzA)
- [OpenStack建てたい話してたらKubernetesの勉強会になった(飲酒)](https://www.youtube.com/watch?v=7BLmtR1nhcY)
- [【作業配信】今日こそKubernetes構築入門する（kubernetes-the-hard-way-on-proxmox）](https://www.youtube.com/watch?v=sdg4kh1coL4)
- [How to Build an Awesome Kubernetes Cluster using Proxmox Virtual Environment](https://www.youtube.com/watch?v=U1VzcjCB_sY)
- [[挫折したエンジニア向け] Kubernetesの仕組みをちゃんと理解する (入門/基本編)](https://www.youtube.com/watch?v=r0NpHb-6IvY)

# 本
- [Kubernetes完全ガイド 第2版](https://www.amazon.co.jp/dp/4295009792/)
- [Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術](https://www.amazon.co.jp/dp/4295006637/)
- [実践入門 Kubernetesカスタムコントローラーへの道 (技術の泉シリーズ)](https://www.amazon.co.jp/dp/B0851QCR81/)
- [AWSとTerraformで学ぶプロダクションレディなKubernetes (技術の泉シリーズ)](https://www.amazon.co.jp/dp/B08ZBZCMX7/)

# イベント
- [Kubernetes Novice Tokyo #22](https://k8s-novice-jp.connpass.com/event/262918/)
- [Cloud Native Days Tokyo2022](https://event.cloudnativedays.jp/cndt2022)
- [Kubernetes Meetup Tokyo #54](https://k8sjp.connpass.com/event/264501/)
- [KubeDay-Japan](https://events.linuxfoundation.org/kubeday-japan/)
- [OOD2022 Kubernetes アップストリームトレーニング（ハイブリット開催）](https://ool.connpass.com/event/264395/)
【OpenLayers】ポイントデータを表示する

## はじめに
この記事は#30DayMapChallenge2022 15日目の記事です。
テーマはFood/drinkです。
OpenLayersを使ってスターバックスのポイントデータを表示してみます。

![image](https://raw.githubusercontent.com/tjukanovt/30DayMapChallenge/main/images/flyers/30dmc-2022.png)

https://30daymapchallenge.com/

## OpenLayersとは
簡単にダイナミックなマップを設置することができるJavaScriptライブラリ
地図タイル、ベクトルデータ、マーカーを表示することができる
フリーかつオープンソースで、2条項のBSDライセンス（FreeBSDとしても知られています）の下でリリースされている
執筆時の最新バージョンはv7.1.0でした


## ポイントデータを取得する
QGISのプラグイン「QuickOSM」を使って日本のスターバックスのポイントデータを取得します。
QuickOSMについては[こちら](https://qiita.com/asahina820/items/39ea4de4a7b6b5072998)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/52fe1e26-ae1c-71a7-197c-a0aa3d1f8844.png)

## ポイントデータを表示する

```index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8" />
        <title>サンプル</title>
        <meta name="description" content="サンプルです" />
        <link href="style.css" rel="stylesheet" />
        <!-- OpenLayers -->
        <script src="https://cdn.jsdelivr.net/npm/ol@v7.1.0/dist/ol.js"></script>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@v7.1.0/ol.css" />
    </head>
    <body>
        <div id="map"></div>
        <script src="main.js"></script>
    </body>
</html>
```

```style.css
body {
    margin: 0;
    padding: 0;
}
#map {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 100%;
}
```

```main.js
const style = {
    Point: new ol.style.Style({
        image: new ol.style.Circle({
            radius: 3,
            stroke: new ol.style.Stroke({
                color: 'rgba(52, 152, 219, 1.0)',
                width: 5,
            }),
            fill: new ol.style.Fill({
                color: 'rgba(52, 152, 219, 0.8)',
            }),
        }),
    }),
};

const styleFunction = function (feature) {
    return style[feature.getGeometry().getType()];
};

const vectorSource = new ol.source.Vector({
    url: 'data/starbucks_point.geojson',
    format: new ol.format.GeoJSON(),
});

const vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    style: styleFunction,
});

const map = new ol.Map({
    layers: [new ol.layer.Tile({ source: new ol.source.OSM() }), vectorLayer],
    view: new ol.View({
        center: ol.proj.transform([139.68786, 35.68355], 'EPSG:4326', 'EPSG:3857'),
        zoom: 6,
    }),
    target: 'map',
});
```

ポイントデータのスタイルを定義します（今回はサークルにしました）
GeoJSONを読み込み、スタイルを設定します。
Mapオブジェクトに作成したレイヤを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/b2c1f7a4-32c1-fe10-2f2e-8181e5adc45c.png)

ポイントデータを表示できました！
LeafletやMaplibre GL JSよりもコードが複雑になります。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/a316a6f6-7857-8cd6-d39a-8f4891679b2e.png)

やはり首都圏はスターバックスが多いですね～


# 参考文献
https://openlayers.org/en/latest/examples/geojson.html
React 関数コンポーネントのお型付け

React には `React.FC` という型が存在します。
それを使えば大抵の関数コンポーネントに型注釈を書くことができるのですが、それに頼りたくない場合もあると思います（ジェネリクスを使いたい場合など）。
では、その場合はどうすれば良いのでしょうか。

`React.FC` の型定義[^1]は

[^1]: 本記事で参照している型は @types/react v18.0.21 のものです。

```typescript
    type FC<P = {}> = FunctionComponent<P>;

    interface FunctionComponent<P = {}> {
        (props: P, context?: any): ReactElement<any, any> | null;
        propTypes?: WeakValidationMap<P> | undefined;
        contextTypes?: ValidationMap<any> | undefined;
        defaultProps?: Partial<P> | undefined;
        displayName?: string | undefined;
    }
```

となっています。
ところで `JSX.Element` という型があるのですが、こちらは

```typescript
        interface Element extends React.ReactElement<any, any> { }
```

となっています。
よって、関数コンポーネントの型注釈は以下で良いことになります。

```tsx
const MyComponent = (props: Props): JSX.Element => {
  return <p>hello!</p>;
};
```

ちなみに React 公式ドキュメントである [How to Upgrade to React 18](https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-typescript-definitions) 曰く、children の型は以下で良いようです。

```typescript
interface Props {
  children?: React.ReactNode
}
```

`React.PropsWithChildren` という型があるのですが、そこからも children は `React.ReactNode` で良いことが伺えます。

```typescript
    type PropsWithChildren<P = unknown> = P & { children?: ReactNode | undefined };
```
sign_and_send_pubkey: no mutual signature supported エラー

## 環境など
クライアントOS： `macOS Ventura 13.0.1`
サーバOS（繋がらなくなった）： `AWS Amazon Linux AMI release 2015.03`
サーバOS（繋がる）： `Amazon Linux AMI release 2018.03`
やりたいこと： `sshログイン`

## はじまりは

今まで何十回となくログインしてきたサーバに、ある日（2022年に入ってから）を境にログインできず、以下のエラーが表示されるようになった。

```
% ssh serverA
sign_and_send_pubkey: no mutual signature supported
ec2-user@nn.nn.nn.nn: Permission denied (publickey).
```

## TL;DR

macOSのバージョンアップにより、クライアント側のOpenSSLのバージョンが上がったから。
Montereyの途中からのような気がするが、もしかするとVenturaからかもしれない。
持っている MacBook はすべて Ventura に上げてしまったので、もう分からない。

## 解決方法

~/.ssh/config を使っているが、下記の2行を追加した。

```
  PubkeyAcceptedKeyTypes=+ssh-rsa
  HostKeyAlgorithms=+ssh-rsa
```

使っている鍵の形式によっては、 `ssh-rsa` の部分が `ssh-dss` になったりする。

## SSHのバージョン

#### クライアント側（macOS Ventura 13.0.1）
`OpenSSH_9.0p1, LibreSSL 3.3.6`

#### サーバ側（繋がらない、というか繋がらなくなった）
`OpenSSH_6.2p2, OpenSSL 1.0.1k-fips 8 Jan 2015`

#### サーバ側（前と変わらず繋がる）
`OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017`
TextViewでRtL言語も強制的にLtR方向に表示する

## はじめに
RtLの言語の文字が入っているTextViewにより大きくレイアウトが崩れてしまったため、強制的にLtR方向になるように指定したい。
RtL言語へのローカライズ対応予定がないため今回は強制的にLtRにしたが、多言語対応の面ではレイアウトをRtLに対応させた方が良い

https://developer.android.com/training/basics/supporting-devices/languages?hl=ja


## 修正
xmlにて以下のように`android:textDirection="ltr"`指定すると強制的にLtR方向に指定できる

```xml:activity_main.xml
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:textStyle="bold"
        android:textDirection="ltr"
        />
```

textDirectionには言語の方向指示に依存しつつ、デフォルトの方向を指定する`ContentOrLtr`などもある

## 参考

https://developer.android.com/reference/kotlin/androidx/compose/ui/text/style/TextDirection.Companion#Ltr()

https://stackoverflow.com/questions/55120991/how-do-i-force-textview-containing-ltr-characters-to-right-aligned-on-rtl-envir
【PHP】オブジェクト指向の近道 - 継承とトレイト

# クラスの継承
クラスはプロパティとメソッドが入った箱ですが、クラスの継承は、クラス（親クラス）をコピーして新しいクラス（子クラス）を作成することです。

継承はコピーですから、子クラスでも親クラスのプロパティとメソッドを利用できます。親クラスをベースに、子クラスで独自にプロパティやメソッドを追加やオーバーライド（上書き）します。親クラスと子クラスがまったく別物なら継承してはいけません。`Person`を継承して`age`を追加した`Person2`を作成する例です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/e40ba299-7837-26fd-7aec-280d62dc9d05.png)

`Person2`のクラス定義です。
```php
class Person2 extends Person
{
    private $age;

    public function __construct($name, $age)
    {
        parent::__construct($name);
        $this->age = $age;
    }

    public function getAge()
    {
        return $this->age;
    }
}
```
`extends`でクラスを継承します。親クラスからの変更分を子クラスでコーディングします。`Person`を継承したので、`Person2`でも`getName()`を使えます。

追加したプロパティ`age`をセットするために、コンストラクタをオーバーライドしました。プロパティ`name`は、親クラスのコンストラクタを転送コール`parent::`してセットしました。転送コールは、後ほど説明します。追加した`getAge`をコールすると`age`を取得できます。

```php:メソッドをコール
$person_a = new Person2('suzuki', 28);
$person_a_age = $person_a->getAge();

var_dump($person_a_age);
```
```sh:実行結果
int(28)
```

:::note info
クラスを継承して子クラスを作成できる
:::

# トレイト
トレイトは、クラスと似たソースコードの再利用性を高めるための工夫です。`trait`でプロパティやメソッドを定義し、それをクラスで`use`すると、クラス定義内に書き込んだものと同様に扱えます。

トレイトはクラス定義の一部であり、トレイトからインスタンスを作成することはできません。PHPの単一継承の制約を緩和するためにトレイトを利用できます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/09669948-910e-dd0b-aa86-35c33678790d.png)

トレイトを使った`Person2`のクラス定義です。
```php:トレイト
trait Age
{
    private $age;

    public function getAge()
    {
        return $this->age;
    }
}
```
```php
class Person2 extends Person
{
    use Age;

    public function __construct($name, $age)
    {
        parent::__construct($name);
        $this->age = $age;
    }
}
```

# オブジェクト指向の近道（全５記事）
1. [なぜオブジェクト指向が必要か？](https://qiita.com/hyada/items/a50586ff3579c078d2b6)
2. [クラスとインスタンス](https://qiita.com/hyada/items/e86af8baf136ac27d9ae)
3. [継承とトレイト](https://qiita.com/hyada/items/ad9ecc8ddc75404b504e)
4. [アクセス権とカプセル化](https://qiita.com/hyada/items/866ecd191bb25ef5c368)
5. [staticと転送コール](https://qiita.com/hyada/items/238fdda17a6704e4c613)
【PHP】オブジェクト指向の近道 - クラスとインスタンス

# クラスとインスタンス
オブジェクト指向は、変数と関数をまとめて箱に入れて、ソースコードの再利用性を高める工夫です。この変数と関数をまとめる箱をクラスと呼びます。クラスに入れた変数をプロパティ、関数をメソッドと呼びます。呼び方が違うだけで、プロパティは変数、メソッドは関数です。

クラス`Person`に入れることで、変数と関数を一つにまとめることができました。しかし、`Person`には`suzuki`も`tanaka`もあり、一つの箱だけでは不十分です。そこで、クラスをコピーして増やせるようにしました。クラスをコピーして生成するのがインスタンスです。生成したインスタンスのプロパティを変更して、`suzuki`や`tanaka`などのオブジェクトを作ります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/173e0d7b-a825-ff2e-98f3-9d88b3ccca57.png)

# クラスを定義
`Person`のクラス定義です。前半がプロパティ（変数）の定義、後半がメソッド（関数）の定義です。`__construct()`はコンストラクタと呼ばれる特別なメソッド（マジックメソッド）で、インスタンス生成時に自動的に実行されます。

```php
<?php

class Person
{
```
```php:プロパティ定義
    public $name;
```
```php:メソッド定義
    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
```
```php
}
```

:::note info
クラスはプロパティ（変数）とメソッド（関数）を定義する
:::

# インスタンスを生成
`Person`からインスタンスを生成しましょう。PHPの変数は、数値や文字列などのスカラー変数、複数の変数をまとめた配列、そしてオブジェクトの3つに大別できます。クラスから生成したインスタンスは、オブジェクト型の変数に代入して使用します。

| 変数のタイプ | 使い方 |
| ---- | ---- |
| 数値、文字列 | `$a=1;` `$a=’suzuki’;` |
| 配列、連想配列 |`$a=[1, 2, 3];` `$a=[‘name’ => ‘suzuki’];` |
| オブジェクト | `$a = new Class();` |

`Person`のインスタンス生成と、プロパティ`name`を取得するソースコードです。インスタンスは`new`で生成します。2つのインスタンスを生成して、`$person_a` `$person_b`に代入しました。

```php:クラス定義
<?php

class Person
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}
```
```php:インスタンス生成
$person_a = new Person('suzuki');
$person_b = new Person('tanaka');
```

オブジェクト指向は、車やリモコンなどさまざまな物にたとえて説明されることがありますが、これらの例は抽象的すぎて、初級プログラマにとって理解が難しいかもしれません。再利用性を高めるために、関連するプロパティ（変数）とメソッド（関数）をまとめる箱がクラスであり、クラスからインスタンスを生成してオブジェクト型の変数に代入して使うという考え方がオブジェクト指向の基本です。

:::note info
クラスから生成したインスタンスはオブジェクト型の変数に代入して使う
:::

# プロパティとメソッド
インスタンスのプロパティとメソッドには、アロー演算子`->`でアクセスします。プロパティは`$a->property`で、メソッドは`$a->method()`でアクセスできます。生成したインスタンスのメソッド`getName()`をコールしました。これでインスタンスのプロパティ`name`が取得できます。

```php:メソッドをコール
$person_a_name = $person_a->getName();

var_dump($person_a_name);
```

```sh:実行結果
string(6) "suzuki"
```

コンストラクタの処理を説明します。`new`でインスタンスを生成した時の引数`suzuki`は、そのままコンストラクタの引数`$name`に渡されます。`$name`はメソッド（関数）内でしか利用できないローカル変数のため、他のメソッドでは利用できません。引数とプロパティの`$name`は外見上は同じように見えますが、実際には異なる変数です。

`$name`を`getName`で参照できるように、コンストラクタでプロパティに引数の値をセットしました。自インスタンスのプロパティには、疑似変数`$this`でアクセスします。疑似変数`$this`もオブジェクト型の変数で、自動でインスタンス自身が代入されます。疑似変数`$this`はインスタンス内で自インスタンスをあらわす変数ですので、インスタンス外では使用できません。

```php:プロパティをセット
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962814/030dce67-0c7f-9bd7-a45f-2d37d7979993.png)

:::note info
クラス定義では疑似変数`$this`で自インスタンスのプロパティやメソッドにアクセス
:::

# オブジェクト指向の近道（全５記事）
1. [なぜオブジェクト指向が必要か？](https://qiita.com/hyada/items/a50586ff3579c078d2b6)
2. [クラスとインスタンス](https://qiita.com/hyada/items/e86af8baf136ac27d9ae)
3. [継承とトレイト](https://qiita.com/hyada/items/ad9ecc8ddc75404b504e)
4. [アクセス権とカプセル化](https://qiita.com/hyada/items/866ecd191bb25ef5c368)
5. [staticと転送コール](https://qiita.com/hyada/items/238fdda17a6704e4c613)
【テトリス作成⑤】数値を丸めるクラスについて深掘る

こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119

★★★★★随時更新★★★★★
2022.11.22追記
2022.11.30追記
2022.12/7追記
★★★★★★★★★★★★★★★
```
Rounding.cs
        public class Rounding : MonoBehaviour →
        public static class Rounding 

{
    ①public static Vector2 Round(Vector2 i)
    {
        ②return new Vector2(Mathf.Round(i.x), Mathf.Round(i.y));
    }

    ①public static Vector3 Round(Vector3 i)
    {
        ②return new Vector3(Mathf.Round(i.x), Mathf.Round(i.y));
    }
}

```
丸める処理は何回か行う為、クリプト作成して使いまわせるようにする
①Vector2、Vector3のiを丸める
②~~xyを返す~~
変数iに近いxy(z)のを生成する。
　　
MonoBehaviourについて
https://qiita.com/hanatan079/items/b42e499ec2cd9d134fb0
Round関数について
https://qiita.com/hanatan079/items/a109b40b0e159779590c

```
(見本)Board.cs

    //④ブロックが枠内にあるのか判定する関数を呼ぶ関数
        public bool CheckPosition(Block block)
        {
            foreach (Transform item in block.transform)
            {
                //変更
                Vector2 pos = Rounding.Round(item.position);
                //new Vector2(Mathf.Round(item.position.x),Mathf.Round(item.position.y));

                if(!BoardOutCheck((int)pos.x, (int)pos.y))
                {
                    return false;
                }
                //⑥移動先が空いているのか確認する関数を呼ぶ
                if (BlockCheck((int)pos.x, (int)pos.y,block))
                {
                    return false;
                }
            }
            return true;
        }



```
```
 Vector2 pos = new Vector2(Mathf.Round(item.position.x),Mathf.Round(item.position.y));
//こっちに変更
Vector2 pos = Rounding.Round(item.position);

```
丸める関数（ファイル）の呼び出し
MYレビュー観点

## はじめに
業務で第三者レビューアとして色々なドキュメントをレビューさせていただいております。
その際に私が特に気をつけて見ているところを挙げたいと思います。

## 全体
まずはどの工程のドキュメントについても気にしていることです。

|No.|観点|ポイント|
|---|---|---|
|1|上位ドキュメントと整合性がとれている|各工程の担当者ごとに認識が異ならないように|
|2|表記ゆれがない|〃|
|3|文字の見切れがない|正しく伝わらない可能性がある|
|4|罫線が欠けてない|〃|
|5|誤字脱字がない|〃|

まぁ、普通ですね。
ここらへんは、レビュー前に作成者ご自身でチェックして解決しておいて欲しいところです。

## 設計
次に設計です。

|No.|観点|ポイント|
|---|---|---|
|1|入出力先が明記されている|影響確認をするために必須|
|2|条件に該当しない場合の結果が明確になっている|ELSEの場合の処理が明確になってないと意図しない動きをする場合がある|
|3|変数やテーブルを使用する場合、初期化を考慮している|変数のクリア漏れなどあるあるです|
|4|論理名、物理名が記載されているか|どちらかしか記載されていない場合、正しく伝わらない場合がある|
|5|記載内容が処理単位でまとめられている|共通処理なのか個別処理なのかなど正しく伝わらない場合がある|

設計に関しては、システム特有のルール等や癖？もあると思いますので、できれば有識者の確認をしてもらったほうが良いと思います。

## テスト設計
さ、ついにテストに入ります。

|No.|観点|ポイント|
|---|---|---|
|1|改修前後の比較をする場合、確認する項目や観点が明記されている|実際は更新日など差異が出ることが多い。差異が出てもいい項目はテスト設計時に明確にしておかないとテスターが混乱する|
|2|何のためのテストなのか明記されている|例えば「フラグ確認」だけなど、何（処理のどの部分）を担保するテストなのかわからない記載は避けるべき。テスト漏れにつながる|
|3|テスト環境が明記されている|本番環境とかけ離れた環境でテストを行っても意味がなかったり、明記されていないと環境が原因の不具合に気づけなかったりする|
|4|テスト実施の条件が明記されている|条件が明記されていないとテスターが間違った条件でテストを実施してしまう可能性がある|
|5|テスト実施の手順が明記されている|手順が明記されていないとテスターが間違った手順でテストを実施してしまう可能性がある|
|6|テスト実施の期待値が明記されている|例えば「正常に終了すること」だけでは、何をもって正常に終了したのか判断できない場合や間違った判断をしてしまう可能性がある|


## テスト結果
よし、テスト実施が終わった！
と油断しないでください。ただ実行しただけではダメです。
きちんとエビデンスを残しましょう。

|No.|観点|ポイント|
|---|---|---|
|1|テストの終了条件を満たしている|たまにテストやり忘れてる人もいます・・・|
|2|エビデンスの不足がないか|テストの実施はしたがエビデンスは取ってない人もいます・・・|
|3|エビデンスのどこを確認して結果を判断したのかわかるようになっている|ただ画像を貼り付けてるだけだとわかりません（それでOKの場合はOKですが）|

## 最後に
以上が私がレビュー時に見ている観点でした。
あくまで一例ですので、参画しているプロジェクトや対象のシステムによっては異なってくる部分もあるかと思います。

レビューアの人に参考にしてもらえると嬉しいですが、**個人的にはレビューイの方に気にしていただいて貰えた方がレビューアとしても指摘が少なくなって楽になるので嬉しいなと。**
【PHP】オブジェクト指向の近道 - なぜオブジェクト指向が必要か？

# ソースコードの再利用
プログラミングにおいて、同じソースコードを何度も書かないこと（ソースコードの再利用）は非常に重要です。同じソースコードを何度も書くと、労力がかかるだけでなく、読みにくいソースコードになってしまいます。

ソースコードの再利用というと、まず関数が思い浮かびます。このソースコードのように、関数を活用すれば、一般的な機能は効率的にコーディングができます。さらに、関数の部分を別ファイルに切り出せば、必要な時にそのファイルを`include`して関数をコールすることで、ソースコードの再利用もできます。

```php
<?php

function getName($person)
{
    return $person['name'];
}

$person_a = ['name' => 'suzuki'];
$person_b = ['name' => 'tanaka'];

$person_a_name = getName($person_a);
```

:::note info
プログラミングにおいて関数などの再利用性を高めるための工夫は大切
:::

# オブジェクト指向とは
オブジェクト指向プログラミング（以下、オブジェクト指向）は、関数のように同じコードを何度も書かない（再利用性を高める）ための工夫です。再利用性を高める工夫で、オブジェクト指向でないとコーディングができない訳ではありません。そのため、なぜオブジェクト指向が必要なのかを理解することが難しいかもしれません。この記事では、初級プログラマにとって第一の関門であるオブジェクト指向の必要性と仕組みを説明します。 

:::note info
オブジェクト指向は再利用性を高めるための工夫
:::

上記ソースコードでは、`$person_a`にも`$person_b`にも`name`があり、その`name`を取り出すために`getName()`という関数を作成しました。つぎの`$person_c`を作る時にも、これらの変数と関数は必要になりそうです。それなら、`Person`に関わる変数`name`と関数`getName()`を箱に入れて一つにまとめておけば、つぎの`Person`を作る時に便利そうです。

このように、変数と関数をまとめて箱に格納し、再利用性を高めるのがオブジェクト指向の工夫です。また、関係する変数と関数がまとまっているため、読みやすいソースコードにもなります。

:::note info
オブジェクト指向は変数と関数をまとめて再利用性を高める
:::

小規模システム開発ではソースコードが少量であるため、このようにソースコードを整理して再利用性を高めることはあまり必要ないかもしれません。しかし、大規模システム開発や他のプログラマーのソースコードを読む際には、このように変数と関数を整理して再利用できることは非常に重要です。

# オブジェクト指向の近道（全５記事）
1. [なぜオブジェクト指向が必要か？](https://qiita.com/hyada/items/a50586ff3579c078d2b6)
2. [クラスとインスタンス](https://qiita.com/hyada/items/e86af8baf136ac27d9ae)
3. [継承とトレイト](https://qiita.com/hyada/items/ad9ecc8ddc75404b504e)
4. [アクセス権とカプセル化](https://qiita.com/hyada/items/866ecd191bb25ef5c368)
5. [staticと転送コール](https://qiita.com/hyada/items/238fdda17a6704e4c613)