OmniAICreator/Qiita-1.07M huggingface dataset:
keypointsMultiArrayから機械学習用データを取得する

# HandPoseのkeypointsMultiArrayのデータを活用したい

iOS14以降ののCoreMLでは、画像情報から手や体の特徴点座標を取得することができます。この特徴点情報を活用して、さらにもう一段ポーズやアクションの機械学習・推論を行いたいと思い、CoreMLで得られるkeypointsMulitiArrayの構造について調べてみました。Vision frameworkおよびCoreMLを使ったポーズ推定の手順や、機械学習用データフォーマットであるMLMultiArrayについては、以下の記事が大変参考になりました。

[Qiita MLMultiArrayとポインタ](https://qiita.com/drafts/8cf48a604ee296f2f14d)
[WWDC2020 Detect Body and Hand Pose with Vision](https://developer.apple.com/videos/play/wwdc2020/10653/)

ポーズ推定で得られる特徴点の情報は、
1. 画像(CGImage)に対してVNImageRequestHandlerを設定
2. handlerでVNDetectHumanHandPoseRequestを実行
3. HandPoseRequest.resultsから、keypointsMultiArrayを取得

の手順で取得できます。エッセンスは以下のコードです。
~~~ handPose.swift
let handPoseRequest = VNDetectHumanHandPoseRequest()
let handler = VNImageRequestHandler(cmSampleBuffer: sampleBuffer, orientation: .up, options: [:])

do {　try handler.perform([handPoseRequest])
　　　　guard let handPose = handPoseRequest.results else {return}
       //keypointsMultiArrayで特徴点情報を取得できる
       guard let keypointsMultiArray = try? handPose.first.keypointsMultiArray() else {return}

   　　} catch {
    //エラー処理
      }
~~~

## keypointsMultiArrayとは何者か？
このkeypointsMultiArrayのデータ構造については、公式サイトを見てもよく分かリませんでしたが、そんな時参考になったのが、CoreMLの姉妹パッケージ（？）CreateMLでした。
CreateMLは、iOS上でノンコードで機械学習できるアプリケーションで、その中の１つのHandPoseClassificationを使うと、さまざまな手の形を認識する推論モデルを作ることができるようになっています。生成された推論モデルの情報をみてみると以下の記載がありました。
> Input
> MultiArray (Float32 1 × 3 × 21)
> A hand pose to classify. Its multiarray encoding uses the first dimension to index time over 1 frame. The second dimension indexes x, y, and confidence of hand pose keypoint locations. The last dimension indexes the keypoint type, ordered as wrist, thumbCMC, thumbMP, thumbIP, thumbTip, indexMCP, indexPIP, indexDIP, indexTip, middleMCP, middlePIP, middleDIP, middleTip, ringMCP, ringPIP, ringDIP, ringTip, littleMCP, littlePIP, littleDIP, littleTip.

つまり、HandPoseClassificationのinputデータは画像そのものではなく、特徴点の座標情報が格納された[1 x 3 x 21]のMultiArrayということになります。ちなみにkeypointsMultiArrayは
~~~ keypointsMultiArray.swift
print(keypointsMultiArray.shape) //[1, 3, 21]
print(keypointsMultiArray.count) //63
print(keypointsMultiArray[0][0][0])   //MultiArrayといいつつ一次元配列で格納されているのでエラー
print(keypointsMultiArray[0])  //wristのx座標
print(keypointsMultiArray[21])  //wristのy座標
print(keypointsMultiArray[42])  //wristの信頼度
~~~
となっていて、上記のMultiArrayとkeypointsMultiArrayとは同一のものと考えて良さそうです。つまり、keypointsMultiArrayは１次元配列で、wrist, thumbCMC, thumbMP, thumbIP, thumbTip, indexMCP, indexPIP, indexDIP, indexTip, middleMCP, middlePIP, middleDIP, middleTip, ringMCP, ringPIP, ringDIP, ringTip, littleMCP, littlePIP, littleDIP, littleTipの順に最初の21点がx座標、次の21点がy座標、その次の21点が信頼度という形でデータが格納されていることがわかりました。ただし、
~~~ keypointsMultiArray.swift
print(keypointsMultiArray[100])   //配列の要素数を超えるインデックスに関わらず、エラーにならず値を持っている。
~~~
要素数を超えた配列indexを指定してもエラーは起こらず、何らかの値を持っていることがわかります。
（普通ならOut of Range FatalErrorと怒られる）
不思議なことですが、最初の63データがHandPose推定の第一候補で、それ以降も第二候補以降のデータが格納されている可能性もあるのかもしれないと思いました。
ただいずれにせよ、更なる機械学習用inputとしては第一候補のみで十分ですので、最初の63データを活用していくことにします。これでHandPoseの座標情報を機械学習の入力データとして活用する準備ができました。
Ruby 練習問題５ ~ if → unlessへの書き換え ~

こんにちは、プログラミング初学者"fujitacoma"です！

今回は、Ruby練習問題シリーズの５回目です。
unless文を使用した条件式の記述問題ですね。

それでは早速始めます！

# 問題
次のif文をunlessというメソッドを用いて書き換えてください。

```ruby
if a + b > 0
  puts "計算結果は0より大きいです"
end
```
## ヒント
### unless
unlessとはifとは逆で、条件式がfalseの場合に処理が実行されます。

__ifを使用した場合__
```ruby
if 条件式
  条件式がtrueの時に実行する処理
else
  条件式がfalseの時に実行する処理
end
```
__unlessを使用した場合__
```ruby
unless 条件式
  条件式がfalseの時に実行する処理
else
  条件式がtrueの時に実行する処理
end
```

# 解答と解説

### 模範解答
```ruby
unless a + b <= 0
  puts "計算結果は0より大きいです"
end
```
### 解説
まず問題のコードについて解説を行います。`a + b > 0`という式は、
__「a + b が0より大きいとき」にtrue__ となり、
その結果`end`までの処理が実行され文字列が表示されます。
```ruby
if a + b > 0
  puts "計算結果は0より大きいです"
end
```
上記のコードのifをunlessに変更したらどうなるかを見てみましょう。
```ruby
unless a + b > 0
  puts "計算結果は0より大きいです"
end
```
この場合、__「a + b が0より大きい」という条件式がfalse__ の時に文字列が表示されます。
つまり、__「a + b が0より大きくないとき」__ に文字列が表示されます。

しかし、これだと条件式と行いたい処理の内容に齟齬があるため、編集が必要です。
このように演算子を`>`から`<`に変更するとどうでしょうか。
```ruby
unless a + b < 0
  puts "計算結果は0より大きいです"
end
```
この場合は、 __「a + b が0より小さい」__ という条件式がfalseの時、
つまり __「a + b が0より小さくないとき」__ に文字列が表示されます。
しかし`a + b`が`0`の場合でも、__「a + b が0より小さい」という条件式がfalse__ となるため文字列が表示されてしまいます。

`a + b`が`0`の際に文字列を表示させないようにするには、
__「a + b が0以上のとき」にfalse__ になる条件式に変更します。
下記のような演算子`<=`を使用したコードとします。

```ruby
unless a + b <= 0
  puts "計算結果は0より大きいです"
end
```

# 最後に
いかがでしたでしょうか！

「〜よりも」、「〜以上」、「〜以下」、「〜を含む」など、
それぞれの条件を正しく理解して、それに合った演算子を使用するのが大切ですね！

ここまでお読み頂き、有難うございました！
wireshark(GUI)をMacにbrewでインストールする方法

# WireShark(Mac)にインストールする

## バージョン情報

Mac Monterey 12.4
WireShark Cask 3.6.6

## コマンド

パスワードが求められる

```
brew install --cask wireshark
```

## GUIを呼び出し

⌘+スペース、"wireshark"

![スクリーンショット 2022-07-16 10.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/1089840d-a295-7736-d19c-11d3d186c58f.png)

エンターキー実行

![スクリーンショット 2022-07-16 10.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/91eb21d7-a5f0-7ec9-d745-49092f149c3c.png)

絞り込みに"tls"と入力するとTLSのProtocolで絞り込みでき、Server Helloの詳細などが確認できる
PL/SQLでWhereが効かないんだけど！

# 結論
PL/SQLの変数名はカラム名と一致させないようにしようね、という話。

# Where句指定してるのに全件取れるんだけど！
```sql:hoge.sql
--宣言は省略
CREATE PACKAGE BODY hoge AS
    FUNCTION getUserName(id VARCHAR2) RETURN VARCHAR2
    IS
        username VARCHAR2;
    BEGIN
        SELECT NAME
        INTO username
        FROM USERS
        WHERE USERS.ID = id; --主キー

        RETURN username;
    END;
END hoge;
/
```
これを`execute name := hoge.getUserName('1234')`すると、
> ORA-01422: 完全フェッチがリクエストよりも多くの行を戻しました

となってしまった。  
主キー指定しているんで、1レコードしか返って来ないはずなのに。  
試しにレコード数を確認して見る。
```sql:hoge.sqlちょっと改造
--宣言は省略
CREATE PACKAGE BODY hoge AS
    FUNCTION getUserName(id VARCHAR2) RETURN VARCHAR2
    BEGIN
        SELECT NAME
        FROM USERS
        WHERE USERS.ID = id; --主キー

        DBMS_OUTPUT.PUT_LINE(SQL%COUNT);
        DBMS_OUTPUT.PUT_LINE(id);
    END;
END hoge;
```
してみると、
> 15,332
> 1234

ID指定してるのに全レコード抽出されとるやんけ！ Where効いてないとか何事なんだ！  
Where効かないことなんてある！？

# よく見れ
```sql:hoge.sqlのSELECT文
        SELECT NAME
        FROM USERS
        WHERE USERS.ID = id; --主キー
```
カラム名と変数名が一緒。  
ということは、SELECT文の中では`id`はカラム名と解釈されて、
```sql:hoge.sqlのSELECT文のOracle側の理解
        SELECT NAME
        FROM USERS
        WHERE USERS.ID = USERS.ID; --主キー
```
と等価になる。  
そりゃ全件取得されるわ。
[Laravel, MongoDB]mongoDBのupdate処理時の注意点

# はじめに

業務でLaravel×MongoDBを使う場面でMongoDBはLaravel標準ではデフォルトでサポートしていないので、MongoDBをEloquentチックに使える**[laravel-mongodb](https://github.com/jenssegers/laravel-mongodb)** というライブラリを使っております。

その中でEloquentとはちょっと違う挙動で戸惑った時のメモです。

## 前提

環境は

- Laravel 8.0.17
- laravel-mongodb 3.8.4

ライブラリはインストール済みです

```powershell
composer require jenssegers/mongodb
```

## DB

今回mongoDBにあるテーブルは`talks`というテーブル

| カラム名 | 型 | 説明 |
| --- | --- | --- |
| _id | string | 一意のID |
| body | string | 本文 |
| read_at | datetime | 既読時間 |
| created_at | datetime | 作成時間 |

## ソースコード

### モデル

App/Models/Talks.php

```php
<?php

namespace App\Models;

use Jenssegers\Mongodb\Eloquent\Model;

class Talk extends Model
{
    /**
     * コレクション名.
     *
     * @var string
     */
    protected $collection = 'talks';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'body',
        'read_at',
    ];

    /**
     * 保存時、取得時にMongoDateとCarbonの形式の変換を行うカラムの設定。
		 *
     * @var array
     */
    protected $dates = [
		'read_at'
	];
}
```

`use Jenssegers\Mongodb\Eloquent\Model;`でライブラリを読み込んで、extendsしています

### コントローラ

↓App\Controllers\TalkController.php

```php
public function detail($id)
{
		...
		$talk = Talk::findOrFail($id);
        $talk->whereNull('read_at')->update(['read_at' => now()]);
		...
}
```

挙動としてはトークの詳細画面に遷移した際に、「未読状態」のトークのread_atに日時(Carbon)を入れて「既読状態」にする、といった感じ

# 動作確認

## 想定挙動

上記のコードでTalkControllerのdetailアクションを実行してみた

想定挙動はCarbonのnow()を保存しに行くので、以下の様にISODate(<現在日時>)になると思っている。

```php
{
	...
    read_at: ISODate('2022-07-16T00:56:15.378Z'),
	...
    created_at: ISODate('2022-07-16T00:56:15.378Z')
}
```

## 実際の挙動

ただ、実際は以下のようになった

```php
{
	...
    read_at: {},
	...
    created_at: ISODate('2022-07-16T00:56:15.378Z')
}
```

空のオブジェクトが入ってきた。。。

## 調査結果

### 原因

mongoDBへの`update()`処理時だけこの挙動になるとのissueを見つけた

https://github.com/jenssegers/laravel-mongodb/issues/2177 

※どうやらsave()はnow()でも想定通りの挙動になるらしい
※そして、isssueに挙がっている挙動では`date`として日時が保存されたオブジェクトが保存されるらしい。ちょっと自分の挙動と違ったが、一旦スルーする。

### 対応策

挙動は違えど、「Carbonを使っている」という共通点があったので上記issueに記載してあった「UTCDateTimeクラスを使いましょう」という助言に従い、以下の形で修正した

↓App\Controllers\TalkController.php

```php
public function detail($id)
{
		$talk->whereNull('read_at')->update(['read_at' => new UTCDateTime(new DateTime)]);
}
```

現在時刻が欲しいのでDateTimeクラスのインスタンスを引数にしてみた

再度detailアクションを実行してみると以下の様に想定通りの値に更新されていることを確認

```php
{
		...
    read_at: ISODate('2022-07-16T00:56:15.378Z'),
		...
    created_at: ISODate('2022-07-16T00:56:15.378Z')
}
```

やったね。

## 所見

save()メソッドはCarbon使えるのに、updateは使えないのか…というのは意外な落とし穴でした。

mongoDBの使用パターン上、複数レコードの特定カラム（今回だとtalksのread_at）を一気に更新するって処理って結構多いはずなので、ここはCarbonでも対応できるようになってほしいなあ、と思った僕のワガママです笑

mongoDBは少し触りだしたばかりなので、引き続き気づきがあれば投稿します。

最後までお読みいただきありがとうございました。
【C++】基礎を学ぶ⑲～継承～

# 継承
**既存**のクラスを**引き継いで**新しいクラスを作るための仕組み
引き継ぎ**元**クラスを**基底クラス**、引き継いで新しく定義したクラスを**派生クラス**という

## 継承の構文
```cpp
class 基底クラス{
  型1 メンバ変数1;
  型2 メンバ変数2;
  ...
  型a メンバ関数a
  ...
}

class 派生クラス : アクセス指定子 基底クラス{
  型3 メンバ変数3;
  ...
  型b メンバ関数b;
  ...
}
```

## 継承を用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Human {
  public:
    string name;
    void show(){
      cout << name << endl;
    }
};

class Student : public Human {
  public:
    void derived(){
      cout << "Studentは派生クラスです" << endl;
    }
};

int main() {
  Student Taro;
  Taro.name = "taro";
  Taro.show();
  Taro.derived();
  return 0;
}
```
```
taro
Studentは派生クラスです
```

## アクセス指定子`protected`
基本・派生クラス内でのみアクセスできる

## `protected`を用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Human {
  protected:
    string name;
  public:
    void show(){
      cout << name << endl;
    }
};

class Student : public Human {
  public:
    void setName(string str){
      name = str;
    }
};

int main() {
  Student Taro;
  // Taro.name = "taro"; ビルドエラーが発生する
  Taro.setName("taro");
  Taro.show();
  return 0;
}
```
```
taro
```

## コンストラクタが呼ばれる順番
**基底クラス**から順にコンストラクタが呼ばれる

## サンプルプログラム
```cpp
#include <iostream>
using namespace std;
 
class Human {
  public:
    Human(){
      cout << "Humanクラスのコンストラクタ" << endl;
    }
};

class Student : public Human {
  public:
    Student(){
      cout << "Studentクラスのコンストラクタ" << endl;
    }
};

int main() {
  Student taro;
  return 0;
}
```
```
Humanクラスのコンストラクタ
Studentクラスのコンストラクタ
```

## 次の記事
[【C++】基礎を学ぶ⑳～多態性～](https://qiita.com/rapirapi/items/7391e70fbcd0a7c5fbf9)
htmlタグの属性修正できない場合

htmlタグの属性修正できない場合（親設定済み）、以下の例をとする
あず、既存属性を削除してから設定する。
   
                         $('iframe').each(function () {
                                $(this).removeAttr("height");
                            });

                            $("iframe").css({
                              'height': '550px',
                              'border': '2px solid'
                            });

●iframeの高さを自動的に調整してくれるスクリプト
 
<iframe src="http://www.example.com/" class="autoHeight"></iframe>

(function (window, $) {
    $(window).on("load", function () {
        $('iframe.autoHeight').each(function () {
            var D = $(this).get(0).contentWindow.document;
            var innerHeight = Math.max(
                D.body.scrollHeight, D.documentElement.scrollHeight,
                D.body.offsetHeight, D.documentElement.offsetHeight,
                D.body.clientHeight, D.documentElement.clientHeight
            );
            $(this).removeAttr("height").css('height', innerHeight + 'px');
        });
    });
})(window, jQuery);
macOSMontereyにUbuntu22.04LTSの仮想マシンをインストールする

タイトルの通り。自分の備忘記録として。インフラ初心者なのでお手柔らかにお願いします。

ネットワークの勉強をしたく、学習用の環境が必要になったため、MacOSMoneteryに、vagrantを使ってVirtualbox上にUbuntuのマシンを立てました。

# 環境
- os macOSMoneterey

# 前提条件(バージョン）
- vagrant 2.2.19
- vagrant box  ubuntu/trusty64
- virtualBox 6.1.34

# 手順
#### XCode Command Line Toolsのインストール
ターミナルを起動。以下のコマンドでXcode Command Line Tools をインストールする。今回は違うけど、アプリ開発とかで必須のコマンドツール。我のロースペックPCでは30分近くかかった。
~~~
$xcode-select --install
~~~

#### Homebrewのインストール
macOS用の、パッケージ管理ツール。デファクトスタンダードらしい。公式のサイト[https://brew.sh/index_ja](url)で以下のコマンドを取得してそのまま実行。インストールすると、brewコマンドが使えるようになる。
~~~
$/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
~~~

#### vagrantとvirtualboxのインストール
以下のコマンドでインストールする。これもちょっと時間がかかった。
~~~
$brew install vagrant virtualbox
~~~

#### 仮想マシンイメージ(vagrant box)のインストール
公式サイトより任意の仮想マシンイメージを選び、以下のように名前を指定して追加登録する。
~~~
$vagrant box add ubuntu/trusty64
~~~
以下のコマンドで、きちんと登録されていることを確認する。
~~~
$vagrant box list
~~~
仮想マシンを扱うための、作業用ディレクトリを任意の名前・場所に作成する。
~~~
$mkdir ~/virtualmachines/ubuntu
~~~
先ほど作成したディレクトリに移動し、仮想マシンのinitファイルを作成する。
~~~
$cd ~/virtualmachines/ubuntu
$vagrant init ubuntu/trusty64
~~~
initファイルが作られたことを以下のコマンドで確認できる。
~~~
$ls
~~~
先ほどのディレクトリで、仮想マシンを起動する。
~~~
$vagrant up
~~~
以下のコマンドで、仮想マシンの状態を確認できる。runnningになっていたら良い。
~~~
$vagrant status
~~~

#### 仮想マシンへログイン
ssh接続でログインする。完。
~~~
$vagrant ssh
~~~

#### 雑記
実は途中まで、ホスト環境ではなく、すでにある別のVM環境でやっていた。なんかうまくいかなくて気づいた。アホすぎる。環境間違いよくやってしまう。気をつけねば、、。とりあえず新しい環境ができたので、煮たり焼いたりして楽しもうと思います。
【AWS】開発者ツール

# CI/CD
「Continuous Integration（継続的インテグレーション）」
「Continuous Delivery（継続的デリバリー）」の略。

アプリを作ったとしてもそれで終了ではない。バグの修正や機能追加等で、リリース後も様々な対応が必要となる。その度に、ソースコードのビルドやデプロイといった開発プロセスが発生する。個人で作っているような小さなアプリであれば小回りが効くが、企業で多くの関係者がいるプロジェクトの場合だと（人為的なミスを避けるためにも）自動化を検討する必要がある。

あまりにも分かりやすいので参考サイトの解説を引用。
テスト→ビルド→デプロイを自動化してくれるツールだが、最後のデプロイに関しては人の責任で行うということ。

>まず、開発されたソースコードがバージョン管理ツール(Git)へコミットされると、CIによって自動的に「コードにエラーがないか」「既存の機能を破壊していないか」といった各種のテストが行われます。これにより「仕様どおりの機能が実装されているか」「既存のコードに影響はないか」といった確認が自動的に行われます。つまり、CIを実施することでバグを早期に検出したり、リリース用のブランチへバグが混入することを防げるのです。
CIによるテストをパスしたら、次はCDによってコードがリリース用のブランチにマージされ、ビルドが行われます。CDによってビルドされたアプリケーションは、自動でテスト用のサーバーに「デリバリー」され、すぐに動作確認が行えるようになります。これを「継続的デリバリー」と呼びます。
なお、「継続的デリバリー」では、変更したコードをテスト用のサーバーまでは自動でデリバリーしますが、本番環境へのデプロイは行いません。実際に本番環境へデプロイするかどうかは、都度人間が判断して行います。本番環境へのデプロイまで自動的に行うことは「継続的デプロイ」と呼び、両者は区別されています。
CI/CDは、単に作業効率を上げるだけでなく、テストやビルド作業から属人性を無くせるのがメリットです。つまり、テスト担当者ごとによる品質のばらつきや人的ミスを排除できるのです。品質を確保しつつリリースを高速化するため、こうした「新機能をコミットしたら自動でテスト・ビルド・デプロイを実行し、テスト環境ですぐに動作確認が可能。場合によっては、本番リリースまでも自動で行う」というCI/CDパイプラインの構築は非常に重要となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/92eda16a-aaef-14e3-6ef3-808dbad50042.png)
画像引用：[CI/CDとは](https://pfs.nifcloud.com/navi/words/ci_cd.htm)


# AWSで提供されているCI/CDツール
1. CodeCommit
ソースコード管理のためのGitリポジトリサービス。要はGitHubのこと。AWS提供ツールのため、各種AWSツールとの親和性が高い、セキュリティが強い、等の特徴がある。
1. CodeBuild
ソースコードのコンパイル/ビルド環境を提供するサービス。
継続的な開発が行われる開発現場では、最新ソースコードのビルド→実行までの流れを自動化することが多い。そのための専用のサーバーを調達して、Jenkinsのようなソフトウェアを導入したビルド環境を構築している。その辺りを一括で行なってくれるのがCodeBuild。

1. CodeDeploy
ビルド済みのモジュールのサーバーへのデプロイを自動化してくれるサービス。
個人で運営している小さなサービスであれば特段気にならないが、企業が提供する大規模なサービスの場合、一気にすべてのサーバーへのデプロイをせず、少しずつシステムを停止することなくデプロイをしたい、等のニーズが多くある。その際に途中でソースコードに問題が発覚した際の切り離し対応等、ビルドの方式を細かく検討していく必要が出てくる。その辺りの悩みを解決してくれるのがCodeDeploy。
CodeDeployは、EC2やLambda、オンプレサーバーに対してデプロイが可能。（※対象サーバーにCodeDeployエージェントがインストールされていることが必要）
デプロイ時の細かい設定（どこに何を配置するか、デプロイ前後の特定の処理を行う等）はappspec.ymlで定義することができる。

1. CodePipeline
上記3つ（CodeCommit,CodeBuild,CodeDeploy）は便利なサービスであるが、それぞれ「独立」したサービスとなっている。ただサービス運営において「ソースコード管理・ビルド・デプロイ」は３点セットである。このままだと「ソースコードが変更されたことを検知してビルドする」「ビルドの完了を待って検証完了にデプロイする」といった前段待ちが必要となってしまう。一連の流れを一括で管理してあげるのがCodePipelineである。
具体的には「ソースコードのpush→（Pushを検知して）ソースコードのビルド→（ビルド完了を検知して）デプロイ」が自動化されたパイプラインを作成してくれる。

1. CodeStar
上記4つのサービスを利用したCI/CD環境を自動構築してくれるサービス。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/2e4afb84-75e0-5d9c-892b-8b9b263b2cda.png)
画像引用：[【AWS】CodePipeline(コードパイプライン)とは何か？メリットは？コード変更後のデプロイを自動化する手順を実例で解説（セキュリティの高いプロジェクトのCI/CD化）](https://prograshi.com/platform/aws/how-to-use-codepipeline/)


# 参考
・[CI/CDとは](https://pfs.nifcloud.com/navi/words/ci_cd.htm)
・[【AWS】CodePipeline(コードパイプライン)とは何か？メリットは？コード変更後のデプロイを自動化する手順を実例で解説（セキュリティの高いプロジェクトのCI/CD化）](https://prograshi.com/platform/aws/how-to-use-codepipeline/)
Summer’22　SalesforceのLightning環境のレポートで行制限ができたのけどつまづいたこと

SalesforceのLightning環境でSummer’22からLightning環境のレポートで行制限ができるようになりました

Limit Results in Tabular Reports
https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_reports_limit_results_tabular_report.htm&type=5&release=238

しかしながら、この行制限には制約がいくつかありました

・つまづきポイント１　表形式でないといけない
グループ化したレポートでは行制限が使えないです

・つまづきポイント２　項目に対し昇順か降順かの設定をしないといけない

項目に対して何かしらの昇順、降順の設定をしないと、添付画像のように「行制限を追加」が灰色で設定ができません
![行制限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e3bf258e-cd0b-de36-f6a8-055d981e7631.png)
 

項目に対して何かしらの昇順、降順の設定をすると、「行制限を追加」が設定可能になります
![行制限追加２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/dbf9d163-262b-2149-166f-3afe97be60a5.png)
【まとめ】【書籍】オブジェクト指向でなぜ作るのか(第2版)

題名の書籍を読んていて気になったところや気付きを書いています。

## インスタンスについて

**"インスタンスはヒープ領域に作られるため、シンプルなロジックになり、再利用性と保守性が高い。"p47**

**1.シンプルなロジック**
　なぜシンプルなロジックになるのか分からない。

**2.再利用性**
　ヒープ領域は、RAM上に動的に確保される記憶領域である。そのため、領域の確保や解放が任意に行えるため、再利用性と保守性が高い。
　ヒープ領域を用いるデメリットは、ヒープ領域が有限のメモリ領域であるため、メモリ使用量に注意する必要がある点である。
【1】https://uquest.tktk.co.jp/embedded/learning/lecture16.html

-----------

## クラス・ポリモーフィズム・継承

**"クラス：関連性の強い関数とグローバル変数を1つにまとめたもの"
"ポリモーフィズム・継承：共通関数では対処できない重複したコードを一本化する仕組み"p78**

クラスのメリット（まとめる）：
①複数の関数をまとめられるため、全体の部品数を減らせる。
②名前付けが楽になる。同一クラス中で命名が重複しなければ良い。
③メンバ関数が探しやすい

インスタンス変数：ローカル変数とグローバル変数の中間の性質を持つ。

---

ポリモーフィズムとは、抽象クラスでメソッドを定義すると、それを継承したクラスでもそのメソッドを使用することが出来るということ？

継承は、メンバ変数やメンバ関数を継承して、それを拡張した実装が出来ることをいう？

パッケージを用いることで、クラス名の重複を気にせ右、クラスを使用できる。

---

## 関数型言語とオブジェクト指向の関係

**"関数型言語の関を値として扱えることは、ポリモーフィズムと同じ効果である。"**

　関数型言語では、関数を入れ替え可能とする。一方、ポリモーフィズムでは、オブジェクトを入れ替え可能とする。以上の理由から両者は同じ効果であるといえる。

---

## **用語**

コンパイラ方式：ソースコードを機械語に変換してから実行する。速度が速い。しかし、機械語のコードは異なる環境のハードウェアに配布して動かすことはできない。
インタプリタ方式：ソースコードをその場で逐次解釈して実行する。すぐに結果を確認できる。同じプログラムを異なる環境で動かすことが出来る。

仮想マシン：中間コードをCPUが直接実行できる機械語に変換する仕組み。
中間コード：特定の機械語に依存しないコード。

インスタンスを示す変数には、インスタンスのポインタを代入する。

メソッドテーブルの存在意義とは？p149
→ただ単にメソッドテーブル経由で、各クラスのインスタンスのメソッドを呼び出しているだけ？

---
【参考文献】
https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654
久しぶりにGNS3（その14：SNMP）

# SNMP
久しぶりにSNMPを扱う機会があり、テスト環境を探していたところ、GNS3上のルーターにSNMPエージェントを動作させ、snmpwalkによりMIB取得するのがイージーであることがわかったので、ここに記録。

## 環境
![topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/cfc80b3e-6fbf-093d-6d1c-0de35661c7c9.png)
ルーターR1にSNMPエージェントを動作させ、VMであるxubuntu-1にて、SNMPマネージャーであるsnmpwalkを実行する。xubuntu-1はDHCPによりIPアドレスを取得。

## ルーターR1の設定
関連するところのみ記載。
```
ip dhcp excluded-address 192.168.1.1 192.168.1.11
ip dhcp pool P1
   network 192.168.1.0 255.255.255.0
   default-router 192.168.1.1 

interface FastEthernet0
 ip address 192.168.1.1 255.255.255.0

snmp-server community public RO
```
IPアドレス設定、DHCPサーバー設定、SNMPエージェント（snmp-server）設定である。SNMP設定に関しては、コミュニティ名は「public」、読み取りのみ「RO」とした。本設定については、検索すれば、多数の情報が見つかる。

## xubuntu-1でのsnmpwalkのインストール
```
$ sudo apt install snmp
```

## 検証（snmpwalk実行）
```
$ snmpwalk -c public -v 2c 192.168.1.1

iso.3.6.1.2.1.1.1.0 = STRING: "Cisco IOS Software, C1700 Software (C1700-ADVIPSE
RVICESK9-M), Version 12.4(23), RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2008 by Cisco Systems, Inc.
Compiled Sat 08-Nov-08 18:56 by prod_rel_team"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.9.1.201
iso.3.6.1.2.1.1.3.0 = Timeticks: (43094) 0:07:10.94
iso.3.6.1.2.1.1.4.0 = ""
iso.3.6.1.2.1.1.5.0 = STRING: "R1"
iso.3.6.1.2.1.1.6.0 = ""
iso.3.6.1.2.1.1.7.0 = INTEGER: 78

（多数続く）
```
このときのWiresharkデータ。
![Wiresharkキャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/15183f9b-0f6c-1a6a-ec3c-d5d28b39e029.png)
snmpwalkにOID(MIB)を指定しないと、MIB-2「1.3.6.1.2.1」ツリーから、get-next-requestにより検索するようだ。

例えば、特定ツリーを指定する。
```
$ snmpwalk -c public -v 2c 192.168.1.1 1.3.6.1.2.1.3
iso.3.6.1.2.1.3.1.1.1.2.1.192.168.1.1 = INTEGER: 2
iso.3.6.1.2.1.3.1.1.1.2.1.192.168.1.12 = INTEGER: 2
iso.3.6.1.2.1.3.1.1.2.2.1.192.168.1.1 = Hex-STRING: D0 01 04 80 00 00 
iso.3.6.1.2.1.3.1.1.2.2.1.192.168.1.12 = Hex-STRING: 00 0C 29 D4 53 93 
iso.3.6.1.2.1.3.1.1.3.2.1.192.168.1.1 = IpAddress: 192.168.1.1
iso.3.6.1.2.1.3.1.1.3.2.1.192.168.1.12 = IpAddress: 192.168.1.12
```
「1.3.6.1.2.1.3」は「atサブツリー」と定義されており、IPアドレスとMacアドレスとの関係が記述される。上記の「192.168.1.12」は、xubuntu-1のIPであり、「00 0C 29 D4 53 93」はそのMacアドレスである。xubuntu-1でのifconfigの結果は下記のとおり。
```
$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.12  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::d6f7:f199:b697:802f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d4:53:93  txqueuelen 1000  (イーサネット)
```

## 最後に
snmpwalkには多数のオプションがあるが、基本的な使い方は上記であろう。
neosでlogix その85

# 概要
neosでlogixやってみる。
neosdbを取得できるNeosUtilConsoleやってみた。

# 参考にしたページ。

https://util.neos.love/

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/04335231-835f-f308-aa17-0ffb1d31d6d7.png)

# 手順

- 「https://util.neos.love/inventory/v1/top」を開く。
- 「neosrec:///U-ohisama/R-0ee1ec21-db19-425b-ba63-9a699caff48e」をopen
- fizzbuzzの...をクリック
- Copy AssetUriをクリック


以上。
日本語文章からイラストを生成するAIのデモンストレーションを公開しました

# 文章→イラスト生成AI

最近、マルチモーダルAIというのが流行っているようです。

特に、大規模言語モデルと拡散モデルを組み合わせた、文章からイラストを生成するモデルは、GoogleやOpenAI等が様々なAIを作って日進月歩の感があります。

そんな中、日本語で指示した文章から、イラストを生成するAIのデモンストレーションを作成しました（↓）

[http://ailab.nama.ne.jp/#text2image](http://ailab.nama.ne.jp/#text2image)

上のサイトにアクセスして、AIに描かせたいイラストの内容を指示すると、AIが何かを描いてくれます。

### 実行例

とりあえず簡単な例。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595605/d21c806d-387f-fbab-27a0-e959bc68ddde.png)

まぁまぁ文章から特徴を捉えてイラストを生成している事が解ります。

固有名詞はどうでしょう？

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595605/9fce56d1-f0a6-234e-dd45-c38cf093c093.png)

固有名詞や、複雑な形状をしている物体の場合、細部が歪んでしまいますが、何を描こうとしているのかはだいたい掴めます。

初音ミクさんは拡散モデル界隈にも名が知れているようですね。さすが。

そしてドナルドトランプの癖の強さよ。こういった固有名詞だと、学習データに含まれている欧米寄りのバイアスが如実に表れます。

しばらくデモンストレーションを動かしているので、興味のある方は遊んでみてくれればと。
Web APIにアクセスするためのURIの考え方

## はじめに
Web API: The Good Parts （水野 貴明  (著)）を読み、APIにアクセスするためのURI（APIエンドポイント）の考え方の部分をまとめます。
2章2.2の部分に当たります。

## 参考
- Web API: The Good Parts 水野 貴明  (著)https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864

## エンドポイントの基本的な設計
良いURIの設計とは、
**「覚えやすく、どんな機能を持つURIなのかが一目でわかる」**
というのが原則です。

#### 短く入力しやすいURI
- 言葉を重複させない
- 類似した概念を示す言葉を複数含めない

#### 人間が読んで理解できるURI
- そのURIを見れば、それ以外の情報がなくても、何を目的としたものなのかが分かる
- むやみに省略形を使わない
    - 国際規格として標準化されているものは使ったほうが良い（jp等）
- APIでよく使われている英単語を利用する
    - 例えば検索用のAPIでよく使われるのは「search」（ある場所において探す）であって「find」（あるものを探す）ではない。
    - 一般的にAPIで使われている単語を知るには実際に他のAPIを見てみるのが一番
        - [Programmable WebのAPIディレクトリ](https://www.programmableweb.com/category/all/apis)には数多くのAPIが登録されている。
- スペルミスをしない
- 和製英語は避ける

#### 大文字小文字が混在していないURI
- 大文字小文字はどちらかに統一したほうがよい
- 標準的に選択されているのは小文字

#### 改造しやすいURI
- URIを修正して別のURIにするのが容易
    - 例
    `http://api/items/:id`
    idの番号を変えれば別のアイテムの情報にもアクセスできる

#### サーバ側のアーキテクチャが反映されていないURI
- どんなサーバソフトウェアを利用しているか、どんな言語を使って実装を行っているか、サーバサイドのディレクトリやシステム構成がどうなっているかは、**利用者的には全く必要がありません**。
- サーバ側のアーキテクチャを反映してしまうと、サーバの脆弱性をついて攻撃を受ける可能性を上げてしまう。

#### ルールが統一されたURI
- 利用する単語、URIの構造を統一する

## おわりに
開発者側の視点ではなく、利用者が見て何ができるのか分かるというのが大切だと学びました。
一目で見て何ができるAPIなのか分かるエンドポイント設計をしていきたいです。
ロボット外見のアバターをVRChatにアップロードする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png"> じぶんメモ

# この記事のターゲット
* [Unity/VRChatにロボット系3Dモデルをインポートして動かす全行程](https://qiita.com/Ninagawa_Izumi/items/974c047fdd6327621b3a)
* [ロボットタイプのアバターにUV展開でマテリアルをはる手順](https://qiita.com/Ninagawa_Izumi/items/98cea4ab34970d3667d6)

の続きの記事です。
ロボットタイプのオリジナルアバターの作成ができたのでVRChatにアップロードするぞ、という時の備忘録です。

# やるべきことのポイント
* Unityのバージョンを[VRC対応にピッタリ合わせる。](https://docs.vrchat.com/docs/current-unity-version)
* UnityのビルドはPCとAndroid両方できるようにしておく。
* VRCSDK3-Avatarを使えるようにする。
* まずアバターをVRCSDK3経由でPC用にビルドし、アップロードする
* 同じくアバターをAndroid用にビルドし、アップロードする。ただしブループリントを先のものと合わせる。

やりかたは検索で出てきます。

# はまり回避
* UV展開を利用してBlenderで作ったfbxをインポートする際、その時に使ったUV展開用画像ファイルも同じ場所にインポートするのを忘れずに。ドラック＆ドロップでOKで、うまくいけば自動で認識され、アバターに色がつく。
* Android対応のシェーダーが表示されない場合がある。その時は適当なMaterialを新たに作成して貼り付け、その後元のUV展開マテリアルを貼り付け直すとシェーダーが選べるようになる。かも。
* シェイプキーを利用する場合は、Blenderからエクスポートする際の設定でモディファイアをオフにしておく。

以上

# まえの記事

https://qiita.com/Ninagawa_Izumi/items/974c047fdd6327621b3a

https://qiita.com/Ninagawa_Izumi/items/98cea4ab34970d3667d6
【PostgreSQL】システム日付の取得

SQLで現在のシステム日付を取得する文法って、いつも覚えられなくてググるので、この機会に備忘のためにメモ。
様々なデータ型で取得できるので、その方法も合わせて。

## 日付のみ形式
**「CURRENT_DATE」** を使う
~~~ query.sql
SELECT CURRENT_DATE;
~~~

~~~ result.sql
2022-07-16
~~~

## 時間のみ形式
**「CURRENT_TIME」** を使う
~~~ query.sql
SELECT CURRENT_TIME;
~~~

~~~ result.sql
08:25:36.000000-00
~~~

## 日付+時間のみ形式
**「CURRENT_TIMESTAMP」** を使う
~~~ query.sql
SELECT CURRENT_TIMESTAMP;
~~~

~~~ result.sql
2022-07-16 08:25:36.000000-00
~~~

[日付/時刻関数と演算子 - 現在の日付/時刻](https://www.postgresql.jp/document/7.2/user/functions-datetime.html)
練馬Perlプログラミングクラブ2022年8月27日(土) ココネリ 3階

練馬Perlプログラミングクラブ

開催日：2022年8月27日(土) 9時～ 12時
開催場所：練馬区立 区民・産業プラザ(ココネリ 3階) 研修室１ 西側
どなたでも参加できます。参加費は無料です。事前に「練馬Perlプログラミングクラブ」への登録が必要です。小学生・中学生の方は、保護者の方とご一緒にご参加ください。

お問い合わせ先: Perlクラブ(株)
TEL 03-6281-5440 (平日・9時～17時)
メール: support@perlclub.net
Webサイトお問い合わせフォーム

https://perlclub.net/event/nerima_program_club
【PostgreSQL】シーケンスの扱い方

シーケンス操作の文法について、いつも忘れてしまうため、備忘のためにメモ。

## シーケンスオブジェクトの作成
シーケンスオブジェクト作成のsqlです。

~~~ create_seq.sql
CREATE SEQUENCE [シーケンス名];
~~~

## シーケンスの現在値を確認
現在値の確認には、**「currval」** を使用します。
~~~
SELECT currval('[シーケンス名]');
~~~

もしくは、シーケンス名に対してSELECT文を発行するだけです。
現在値の数字は、**「last_value」** カラムに記載されます。

~~~
SELECT * FROM '[シーケンス名]';
~~~

## シーケンスに任意の値を設定
**「setval」** を使います。

~~~
SELECT setval('[シーケンス名]', [数値]);
~~~

## シーケンスを1つ進める
シーケンスを1つ進める場合、上述のsetvalでもできますが、**「nextval」** を使うとより便利です。

~~~
SELECT nextval ('[シーケンス名]');
~~~

★参考
[シーケンス操作関数](https://www.postgresql.jp/document/7.3/user/functions-sequence.html)
laravel8でwebpackではなくvitaがデフォルト読み込みになっているのを修正@vite(['resources/css/app.css', 'resources/js/app.js'])

laravel8をインストールすると、
新規登録、ログインページでvitaが読み込まれており、
@vite(['resources/css/app.css', 'resources/js/app.js'])
が直に表示されていたため、修正。

```app.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" content="{{ csrf_token() }}">

        <title>{{ config('app.name', 'Laravel') }}</title>

        <!-- Fonts -->
        <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap">

        <!-- Scripts -->

//コメントアウト
{{--        @vite(['resources/css/app.css', 'resources/js/app.js'])--}}

//2行追加
        <link rel="stylesheet" href="{{ mix('css/app.css') }}">
        <script src="{{ mix('js/app.js') }}" defer></script>

    </head>


```

```guest.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" content="{{ csrf_token() }}">

        <title>{{ config('app.name', 'Laravel') }}</title>

        <!-- Fonts -->
        <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap">

        <!-- Scripts -->

//コメントアウト
{{--        @vite(['resources/css/app.css', 'resources/js/app.js'])--}}

//2行追加
        <link rel="stylesheet" href="{{ mix('css/app.css') }}">
        <script src="{{ mix('js/app.js') }}" defer></script>

    </head>
    <body>
        <div class="font-sans text-gray-900 antialiased">
            {{ $slot }}
        </div>
    </body>
</html>

```
ブログの機能を移行します。

こんにちは。

Qiitaで記事を更新していたのですが、噂に聞いていたちくちくと小言のようなコメントがつきはじめましたので、ブログの機能を移行することにしました。

https://ameblo.jp/toivokitahara/

今後はこちらを更新してまいります。
よろしくお願いいたします。
パイ村 Part.2　データ分析のための環境構築（とりあえずPython動かしてみる）


# はじめに

Pythonをかじってみたい。データ分析の知識も身に付けたい。
ということからスタートしてみましたが、まずはPythonを使ってデータ分析を行う環境を作ります。

Pythonをインストールし、その他のいろいろなパッケージを使用する必要があるらしく、
個別にインストールすると面倒らしい。

なので、Anacondaというものをインストールし楽に環境構築します。
Anacondaはディストリビューションということらいしいですが、
つまりは、いろんなパッケージが纏まっているものだと想像しています。

**<font color="red">Pythonでデータ分析を始めるには必要なものが揃っているということらしいっす。</font>**

ちなみに、私の環境はWindows10です。

# Anaconda の インストール

早速、Anacondaをインストールしていきましょう。

https://www.anaconda.com/download

上記URLにアクセスしダウンロードをクリックします。

<img width="400" alt="download" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/59a5778c-58ca-2e6f-9bf3-03a5811f9921.png">

<br />

インストーラーをダブルクリックしインストールを開始します。

<img width="450 alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/22b0eb52-ebe9-6506-9023-117eb93e8bba.png">

デフォルトで進めます。

<img width="450" alt="2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/22b0eb52-ebe9-6506-9023-117eb93e8bba.png">

I Agree　で進めます。

<img width="450" alt="3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/47a9a62a-85f7-c9fc-f841-a5144ab96767.png">

私は、All Usersで進めました。
個人（家庭）のPCで特にJust Meを選択する必要性がないです。。。。

<img width="450" alt="4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/fb11fcbf-5f37-fbbe-a98a-85c5d40eadb5.png">

インストール先も特に変更せず、Nextをクリックします。

<img width="450" alt="5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/3d3d4c0f-79ab-9b5e-b7e9-db6c873d3bc0.png">

デフォルトのまま進めました。

<img width="450" alt="6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/65f0198a-c88a-842d-a224-b9c3b620783b.png">

Nextをクリック

<img width="450" alt="7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/bff9c5e6-db71-48a2-5852-b77e144a0b47.png">

Nextをクリック

<img width="450" alt="8" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/ba24356c-3a95-6cbe-3ba5-45b678e0fb58.png">

<font color="red">インストールは、デフォルトのまま進めました。</font>

# Anaconda，Python起動確認

スタートメニュー

Anaconda 用のコマンドプロンプトを起動します。

<img width="200" alt="start1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/22c3a7ac-f585-f0ff-2e94-b2a5a0f1291a.png">

プロンプトに

```python
python
```

と入力しEnterを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/d428b18b-222e-80b6-a4b2-05d35c580466.png)

Pythonが対話モードで起動しました。

```python
print('Hello Python')
```

と入力してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/4833b0e4-5f3f-e84f-8f28-21553afd1eee.png)

<font color="red">Python が起動できることが確認できました。</font>

次はちょっとだけデータ分析っぽいこと出来たらいいなと思います。
Yoloのアノテーション・ファイルを視覚化する

![96020970-686b-4fc1-9e1e-8810cfaaaef0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5187b18b-7fe8-dac1-149d-318aecf58347.jpeg)
# このアノテーション正確だっけ？
物体検出データセットで、ボックス・アノテーションを行ったけど、ちゃんとボックスをつけられているか確認したい時ってありますよね？

# かんたんにつかえる視覚化ツール

これでボックスとラベルを視覚化できます。

https://github.com/waittim/draw-YOLO-box


classes.txtにラベル名を記載します。

データのパスを記載します。

```draw_box.py
label_folder = 'path_to_labels_dir'

raw_images_folder = 'path_to_images_dir'

save_images_folder = 'path_to_results_dir'  

name_list_path = './name_list.txt'  

classes_path = './classes.txt'
```

実行。

```shell
python draw_box.py
```

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

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【シェルスクリプト】特殊変数一覧

## 特殊変数一覧

| 変数 | |
| :-----: | :------ |
| $# | 引数の数。 |
| \$0 |  起動中シェルスクリプト名を取得。 |
| `$1` ~ `$n` | シェル引数の値。 e.g. `$1`は第1引数, `$3`は第3引数 |
| $* | 引数すべてを1つに連結して参照。  |
| $@ | シェルスクリプトやシェル関数の引数すべてを個別に参照 |
| $? | 最後に実行したコマンドの終了ステータスを取得。|
| $$ | 実行中のシェルのプロセスID。 |
| $- | シェルの起動時のフラグや`set`コマンドを使って設定したフラグの一覧。 |
| $! | `&`で複数コマンドを実行した際のプロセスID。|
【macOS App】ヘルパーツールをインストールする

こちらの続き

https://qiita.com/nonoi-tk/items/e7bf917db125a4eacdf2

# ヘルパーツールをインストールするための許可を作成

成功したらauthRefに参照が却ってくる。
```
    var authRef :AuthorizationRef?
    var flags = AuthorizationFlags( rawValue : 0)
    var status = AuthorizationCreate(nil, nil, flags, &authRef);
```

# ヘルパーツールをインストールするための権限を要求
成功したらauthRightsが却ってくる。
```
    var authItem = AuthorizationItem(name: kSMRightBlessPrivilegedHelper, valueLength: 0, value: nil, flags: 0 )
    var authRights = AuthorizationRights( count: 1, items: &authItem )
```

＃　セキュリティサーバーに必要な許可を与えるフラグを作成
必要なものは以下の3プロパティ。
- `interactionAllowed` ユーザーとの対話を許可
- `extendRights` 要求された権限（ここではヘルパーツールインストール）を許可
- `preAuthorize` 要求された権限を事前承認できるように
```
    flags = AuthorizationFlags([.interactionAllowed, .extendRights, .preAuthorize])
```

# 管理者ユーザー認証を行う
AuthorizationCopyRightsの呼び出しに成功したら「xxxが新しいヘルパーツールを追加しようとしています。許可するにはパスワードを入力してください」というダイアログが表示される。
```
    status = AuthorizationCopyRights(authRef!, &authRights, nil, flags, nil)
```


# ヘルパーツールをlaunchdにジョブ登録する
管理者ユーザーで認証されたのち、ヘルパーツールのインストール許可が下りる。
SMJobBlessを呼び出してインストールを実施。
bundleidが登録したいヘルパーツールのbundleid。
```
SMJobBless(
        kSMDomainSystemLaunchd,
        bundleid as CFString,
        authRef,
        &cfError)
```

一度インストールしたら、ヘルパーツールが自動的に動作するようになる。
以下のファイルの存在有無でインストールが必要かどうか判断しても良いだろう。
- `/Library/LaunchDaemons/<bundleid>.plist`
- `/Library/PrivilegedHelperTools/<bundleid>`

このあとはipcによりヘルパーツール側の処理を呼び出すことで、毎回管理者ユーザー認証を求められずに特権処理を行うことができる。

お疲れ様でした。
Twitter Developer Platformへの登録とElevatedの申請を行う方法

## はじめに
Twitter Developer Platformの登録とElevatedのアクセスレベルへの申請までの手順をご紹介します。

## Twitter Developer Platformへの登録

### Twitter Developer Platformへアクセスし右上のsignupをクリックする

https://developer.twitter.com/en

### 各項目を埋めてLets do thisをクリック

- **Twitter Account**
    - ログインしているアカウント名が表示されます
- **Email**
    - ログインしているアカウントに登録されているEmailアドレスが表示されます
        - 登録していない場合は設定しましょう
:::note warn
連絡が取れるEmailアドレスか確認してください！
:::
- **What country are you based in?**
    - 居住国を選択します
- **What's your use case?**
    - 使用目的を選択します
        - 私はMaking a botを選択しました
- **Will you make Twitter content or derived information available to a government entity or a government affiliated entity?**
    - 政府機関関係ですか？と聞かれています
        - 基本的にはNOで問題ないと思います
- **Get involved and updated**
    - ニュースレターが必要な場合はチェックしてください

### 規約を確認
問題なければ**Accept Terms & Conditions**にチェックを入れて**Submit**を押してください

### Emailを確認
TwitterからEmailが届くので、本文内の**Confilm your email**をクリック

### 登録完了！
![スクリーンショット 2022-07-13 12.46.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206155/93931f1d-ac19-d058-d952-7f831ada66d6.png)

## Elevatedの申請

### 下記にアクセスする
https://developer.twitter.com/en/portal/products/elevated

**Do you need Elevated access for your Project?**の**Apply**をクリックする

### 各項目を埋めてNextをクリック
- **What's your name?**
    - ログインしているアカウント名が表示されます
- **What country are you based in?**
    - 居住国を選択します
- **What's your current coding skill level?**
    - 自分のスキルレベルを選択します
- **Want updates?**
    - アップデート情報が必要な場合はチェックしてください

### またまた各項目を埋めてNextをクリック（英語で）
DeepLで翻訳すると楽です

https://www.deepl.com/ja/translator

- **How will you use the Twitter API or Twitter Data?**
    - TwitterのAPIやデータをどのように使用するかを200文字で記入します
    - APIを使用して解消したい課題やユーザーストーリなど大目的を詳細に記入します
- **Are you planning to analyze Twitter data?**
    - 取得したデータを分析する場合はYESを選択します
    - 分析する内容と手法または技術を100文字で詳細に記入します
- **Will your App use Tweet, Retweet, Like, Follow, or Direct Message functionality?**
    - ツイート、リツイート、いいね,フォロー、DMを使用する場合はYESを選択します
    - 何にどのような操作を行うのかを100文字で詳細に記入します
- **Do you plan to display Tweets or aggregate data about Twitter content outside Twitter?**
    - 政府機関関係でデータを表示する場合はYESを選択します
    - 表示する予定の政府機関をすべて記入します

### 情報を確認
問題なければ**Next**を押す

### 規約を確認
問題なければ**Submit**を押す

### 申請完了！
Twitterからの承認メールを待ちます。

### 申請が通らなかった場合
記載内容について詳しい説明を求めるメールが日本語で届きました。
調べたところによると、今回の申請を含め**３回まで**説明のチャンスがあるらしいです。
できるだけ詳細に記載することをおすすめします！
Swift FireStore でwhereFieldとorderを同時に使いたい！

## 目的
Swiftを用いた開発で、FireStoreの whereField と order を同時に使用する方法を述べること
※ `whereFieldの対象要素 ≠ orderの対象要素`の時だけ


## 結論！
**コンソール画面に出てくるURLへアクセスして「複合インデックス」を作成して、5分後同じプログラムで実行し直す**


## 解決策！
`複合インデックス`を作成して、5分くらい待つ [(参考サイト)](https://puroguradesu.hatenadiary.jp/entry/2020/03/11/035156)

<br>

**複合インデックスの作成方法**
コンソール画面にURLが出ているので、それにアクセスして、説明されるままインデックスを作成する。
```
The query requires an index. You can create it here: https://console.firebase.google.com/xxxxx....
```

<br>

**なぜ5分まつ？**
複合インデックスが反映されるまでに時間がかかったから。
※ 筆者だけかもしれません。筆者は反映の確認を5分後にとれました。


## この記事どういう時に使えるの？

**「whereField と order を使って情報を取ってきたい。のに、なぜか取得できない！ なぜ❓」** という人がいる時。
<br>
具体的に、下のFireStoreモデル図やプログラムをもとに『日本国籍のユーザーをid順に取得したい』という場合を考える。
`whereFieldで国籍を指定, orderでid順に並び替え` を行う。が、うまくいかない！

```FireStoreモデル図.
"Users"
    |_   userId01  --  "country" : "Japan"
         userId02      "id"      : 1
            ・
　　　　　　　　　　　　　　　　　  　　　・
　　　　　　　　　　　　　　　　　  　　　・

```

```FetchJapaneseUserModel.swift
・・・

// 日本国籍のユーザードキュメントをid順に並び替え取得する
let userRef = Firestore.firestore().collection("Users")      
userRef
    .whereField("country", isEqualTo: "Japan")
    .order(by: "id")

・・・
```


## なぜうまくいかない！？
`orderの要素 = whereFieldの要素` が原則だから。

👇 [参考サイト](
https://firebase.google.com/docs/firestore/query-data/order-limit-data?hl=ja)より抜粋
<img width = 90% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/32b64e4e-183d-c4e4-7809-df0547cf0f7c.png">

```FetchJapaneseUserModel.swift
・・・

// 🙆‍♂️ → id順に並び替えたいのに、国籍順に並び替えている。意味ない！
let userRef = Firestore.firestore().collection("Users")         
userRef
    .whereField("country", isEqualTo: "Japan")
    .order(by: "country")


// 🙅‍♂️
let userRef = Firestore.firestore().collection("Users")        
userRef
    .whereField("country", isEqualTo: "Japan")
    .order(by: "id")

・・・
```


## 確認
同じプログラムで再度実行すると、日本国籍のユーザードキュメントをid順に並び替え取得を行えた ✌️


## 補足 : whereField, order とは？
`whereField` : 条件に一致するものを通す
`order` : 並び替える (昇順:Ascending, 降順:Descending)


## 参考サイト

https://puroguradesu.hatenadiary.jp/entry/2020/03/11/035156

https://firebase.google.com/docs/firestore/query-data/order-limit-data?hl=ja

https://firebase.google.com/docs/firestore/query-data/index-overview?hl=ja
DjangoでImportError: cannot import name ‘force_text’ from ‘django.utils.encoding’と出たときに試してみてほしいこと

# はじめに
Djangoのimportエラーで徹夜で対応し、疲れてしまいました。同じ境遇の人が減ることを願って備忘録として残しておきます。[元ソース](https://exerror.com/importerror-cannot-import-name-force_text-from-django-utils-encoding/#:~:text=.utils.encoding'-,To%20Solve%20ImportError%3A%20cannot%20import%20name%20'force_text'%20from%20',Your%20error%20should%20be%20solved.)

# 原因
パッケージのバージョンによってはDjango4に対応していないみたいです。
以下の対応が難しいと感じたら以下の表を見てDjangoのバージョンとpythonのバージョンを決めてください。[ソース](https://github.com/graphql-python/graphene-django/pull/1275#issuecomment-1031498875)
![スクリーンショット 2022-07-16 1.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326068/bb3df5d2-1d16-e25f-867e-887e62d5c635.png)

# 対応策
上記のような対応が難しいorもう環境を変えるのは面倒だという人は以下を試しましょう。
モンキーパッチ的な方法になりますが、パッケージのソースコードを書き換えます。

例えば以下のようなエラーが出ていたとします。
```
ImportError: cannot import name 'force_text' from 'django.utils.encoding' (/Users/abemaru/.local/share/virtualenvs/my_graphql_demo-5o5fYzSh/lib/python3.9/site-packages/django/utils/encoding.py)
```
であれば以下のコマンドを打って
```
% vi ~/.local/share/virtualenvs/my_graphql_demo-5o5fYzSh/lib/python3.9/site-packages/graphene_django/utils/utils.py
```
utils.pyの`force_text`をimportしているところを`force_str`に置き換えて保存してください。
```utils.py
# 下のままだと動かないので
# from django.utils.encoding import force_text
# 下に置き換える
django.utils.encoding import force_str 
```

これで動くはずです。動かない場合はわかりません。ごめんなさい。

# さいごに
abemaruはモンキーパッチを覚えた！
最初から動くバージョンでやりたかったデス。
Deno in Docker

deno の動作環境をDockerで構築したのでその時のチラウラメモです。
Webサーバとしてではなく、単にTypeScriptのコードをDenoで実行してみよう、というスタンスです。

deno: https://deno.land/

```:Dockerfile
FROM debian:stable-slim

WORKDIR /app

RUN apt-get update \
  && apt-get install -y curl zip unzip git \
  && apt-get clean \
  && curl -fsSL https://deno.land/x/install/install.sh | sh

ENV DENO_INSTALL="/root/.deno"
ENV PATH="$DENO_INSTALL/bin:$PATH"

COPY . /app
```

```./main.ts
console.log('deno is running!');
```

```:terminal
$ docker build . -t deno
$ docker container run --rm deno deno run main.ts
```

これで、ターミナルに `deno is running!` が出力されました。
「後でやろ」を忘れないためにobniz【簡単】ボタンぽちだけ

### はじめに
「ちょっと後でやろ」って思ってたら忘れてしまう経験はありませんか？
私は数えきれないくらいあります。
グリルや電子レンジの中に忘れられた食べ物たち・・・
5分とか10分先にリマインドしてほしい、でもめんどくさいことは嫌だという方向けです。
ぽちっとボタンを押すだけで、うっかり忘れが防げます。

①これ忘れそう、後で知らせて！って時にボタンをぽち
②設定した時間経過後、音楽が流れる
それだけの仕組みです。

![9122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/27ea8325-3749-886d-2681-0e6d43b9588f.jpeg)


### 使用したもの
※全てobnizスターターキットに含まれています。
obniz Board
USB micro B cable
ブザー　Keyestudio_Buzzer
スイッチボタン Keyestudio_Button

### 準備
obnizの準備は公式HPを参考にします。
https://obniz.com/ja/doc/reference/board-1y/quick-start/

### コード
```html
<html>
 <head>
   <script src="https://unpkg.com/obniz@3.x/obniz.js"></script>
 </head>
 <body>
   <script>
     var obniz = new Obniz("6000-8382"); // ここに自身のobniz IDを入力する
     var btn = 0
     var sp = 9

     obniz.onconnect = async function () {
       obniz.onloop = async function () {
        var speaker = obniz.wired("Keyestudio_Buzzer", {signal: sp, vcc:sp+1, gnd:sp+2});
        var button = obniz.wired("Keyestudio_Button", {signal:btn, vcc:btn+1, gnd:btn+2});
    
          await button.stateWait(false); 
          await obniz.wait(10000)

          speaker.play(130.815)
          await obniz.wait(200)
          speaker.play(130.815)
          await obniz.wait(200)
          speaker.play(146.835)
          await obniz.wait(400)
          speaker.play(130.815)
          await obniz.wait(400)
          speaker.play(174.62)
          await obniz.wait(400)
          speaker.play(164.82)
          await obniz.wait(800)
          speaker.play(130.815)
          await obniz.wait(200)
           
          speaker.play(130.815)
          await obniz.wait(200)
          speaker.play(146.835)
          await obniz.wait(400)
          speaker.play(130.815)
          await obniz.wait(400)
          speaker.play(196.0)
          await obniz.wait(400)
          speaker.play(174.62)
          await obniz.wait(800)
          speaker.play(130.815)
          await obniz.wait(200)
          speaker.play(130.815)
          await obniz.wait(200)
          speaker.play(261.63)
          await obniz.wait(400)
          speaker.play(220.93)
          await obniz.wait(400)
          speaker.play(174.62)
          await obniz.wait(400)
           
          speaker.play(164.82)
          await obniz.wait(400)
          speaker.play(146.835)
          await obniz.wait(800)
          speaker.play(233.082)
          await obniz.wait(200)
          speaker.play(233.082)
          await obniz.wait(200)
          speaker.play(220.00)
          await obniz.wait(400)
          speaker.play(174.62)
          await obniz.wait(400)
          speaker.play(196.0)
          await obniz.wait(400)
          speaker.play(174.62)
          await obniz.wait(800)
          speaker.stop()
      }
    }
    </script>
 </body>
</html>
```



### カスタマイズ
```javascript
await obniz.wait(10000)
```
初めに出てくるawait obniz.waitの（）内の数字を希望の数字に変更する。
（ミリ秒表示）

制作物は違いますが鳴る音楽はこれと同じHappy Birthday to youです。
https://twitter.com/ped_yi/status/1516426706340433928
google-cloud-firestore v2.7.0 はぶっ壊れている

# 2.7.1が出たみたい

https://rubygems.org/gems/google-cloud-firestore/versions/2.7.1

# 問題

https://github.com/googleapis/google-cloud-ruby/issues/18832

```rb
firestore = Google::Cloud::Firestore.new
doc = firestore.doc("test/test")
doc.set(foo: 123)
doc.get.fields
# => {"foo"=>{:null_value=>:NULL_VALUE, :boolean_value=>false, :integer_value=>123, :double_value=>0.0, :timestamp_value=>nil, :string_value=>"", :bytes_value=>"", :reference_value=>"", :geo_point_value=>nil, :array_value=>nil, :map_value=>nil}}
```

documentのfieldの値が今までなら文字列のfieldは文字列で、タイムスタンプのfieldはTimeオブジェクトで、と素直に使える状態だったが、`v2.7.0`はどうもこの辺りがおかしい動作になっていて、上記のようにデカ目のHashが返ってくる、ので大体のアプリケーションでは値が取れずに死ぬ。

# 解決

```Gemfile
gem "google-cloud-firestore", "2.6.6" 
```

`2.6.6`に固定する。
その言葉ってどういう意味ですか？専門用語・社内用語を教えてくれるLINE Bot

# はじめに
私はスーパーマーケットに勤務しており、現在はポスターやPOPの作成・校正・手配など販促物の面で店舗をサポートする部署で働いています。


そんな私の業務におけるささやかな悩み……
ポスターやマニュアル作成、社内用資料作成時に**この言葉って合ってる？？**
会議時に飛び交っている**用語どういう意味？？？**
また特に接客業では多く使われているものが**社内の隠語**
転職者や会社が合併するなどしたせいで前の会社の隠語と今の会社の隠語ごちゃ混ぜになっている人も多々います。
これでは特に新人の子なんかには意味や指示が伝わらないですよね……

**手軽に言葉の意味を確認したい！**
⇒みんなが手軽に使っているツールで用語確認できたらよいのでは？

というわけでLINE Botを少し勉強してみました。

# 使用したもの
* [LINE Developers](https://developers.line.biz/ja/)
* [withMake](https://www.make.com/en)
* Google スプレッドシート

# 作り方
LINE Bot初心者なのでまだまだ複雑なものは作れません。
というわけで構造は超単純！
1. スプレッドシートに用語とその意味を記入しておく
1. LINEで知りたい用語を入力
1.  その用語がスプレッドシート内にあるか検索しあればその意味を返信
1.  無ければ「○○という用語はありません」と返信

* **用語登録用スプレッドシート**
![スプレッド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728013/3b21487d-a57c-5673-cc97-dfae0e09646b.png)


A列に用語、B列にその用語の意味

* **Makeの全体図**
![Make-L1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728013/b4b1b856-a206-5d38-043f-af4631b25f26.png)

# 実装
ひとまず動きました。

https://twitter.com/akao_DX/status/1547966265821900800?t=lipWXX6nTlPuiLP_qY9uHQ&s=19



# 次への課題
* 現状用語が完全一致じゃないと検索にヒットしないので、用語がうろ覚えだと検索できません…
⇒あいまい検索で候補をいくつか表示できるような感じにできればもっと実用性が上がるかも？
* 用語の数を増やせば増やすほどレスポンスが遅くなってしまい最終的にはエラーになることもありました。
⇒この作り方だとスプレッドシートに記入しておける用語数に限界がありそうです…
処理を早くできるような作り方を今後探っていきたいと思います。


以上
初心者の拙い内容でしたが最後まで読んでいただきありがとうございます。
少しでも何かの参考になれたら幸いです。
今後もいろいろと挑戦して発信できたらと思います。
PHP - とある月の月末の日付を取得する

少々まわりくどいようですが、これが安全な手続きのうちのひとつです。
## サンプル
~~~PHP
<?php
  // test.php
  $str = '2022-07-16';
  $str = date('Y-m-01', strtotime('1 month', strtotime($str)));
  echo date('Y-m-d', strtotime('-1 day', strtotime($str)));
?>
~~~
~~~
$ php -f test.php
2022-07-31
$ 
~~~
Zigを使ったwindowsでのC言語開発環境

# 概要

- プログラム言語zigのコンパイラにccが付属している
- windows上で手軽にC言語の開発環境を整える方法として割と良さそう

# 環境構築

## パッケージマネージャ chocolateyのインストール

powershellを管理者モードで起動し、以下のコマンドを実行してインストールします。

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

細かいことは公式ホームページに書いてあります。
心配な方はぜひこちらを参考にインストールしてください。
[chocolatey install](https://chocolatey.org/install)

## zigのインストール

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

```powershell
choco install zig
```

こちらも細かいことは公式ホームページを読んで下さい。
[Zig Getting Started](https://ziglang.org/learn/getting-started/)

インストール完了後、以下のコマンド

```powershell
zig cc -v
```
を実行し、エラーが表示されなければ成功です。

mingwを使った環境構築よりも楽ではないでしょうか？

# 使用例

他のccと同じように、

```powershell
zig cc file.c
a.exe
```

でコンパイル・実行できます。

余談ですが、zig ccはクロスコンパイル機能があり便利らしいです。
c言語だけでなく、C++のコンパイラも付属していて、`zig c++`で使えます。

また、zig自体も面白い言語なのでぜひ触ってみてください！
[zig programing language](https://ziglang.org/)

# 実行環境

```powershell
choco -v
1.1.0
zig version
0.9.1
```

エディション	Windows 11 Home
バージョン	21H2
要塞ホスト とは

## 勉強前イメージ

firewallと同じくらいのところにいて、誰も入ってこないか確認するホスト？

## 調査

### 要塞ホスト とは

英語でbastion hostと呼ばれるホストになります。
このホストはトラフィックを処理・フィルタリングして悪意のあるトラフィックがネットワークに入るのを防ぎます。
例としてはfirewallやルータ、またFTPサーバやメールサーバもこれに当たる場合があります。
DMZに置かれることが多いです。

要塞ホストが外部からの攻撃で陥落すると自由にアクセスできるようになってしまうためセキュリティ対策がなされた強力なサーバで
その役割以外のアプリケーション以外は入らないようになっています。

## 勉強後イメージ

難しいことかいてあるけど、元々のイメージは間違っててDMZにある機器。
外部からのトラフィックを受信する仕事で単一のアプリケーションしか動かない。
外部からのアクセスがあるので、セキュリティは強いサーバ
ってことかな？
webサーバとかもこれにあたりそう。
あんまり要塞ホストなんていい方しないんかね。

## 参考

- [ファイアウォール構築におけるスクリーンホストとデュアルホームの違い](https://www.internetacademy.jp/it/management/security/difference-between-screenhost-dualhome.html)