OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino UNOとOLED SSD1306で遊ぶ (「46」よろーを表示)


x 過去ログを見よ!!

x Adafruit SSD1306  を　インストール
x Adafruit GFX  を　インストール

x 配線とプログラムは、Arduino UNOと同じ

目的
カラーOLEDのテスト


![o_cop288.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/44f88178-3469-11d7-57d7-5f87ab4d88bc.jpeg)


いろいろ
アクセスカウンターの集計見ているとUNOの人は、UNOしか見てなさそう。
Arduino とか　ssd1306 で見るといろいろ情報があるよ!

Adafruit GFX と　Adafruit SSD1306　系は、高機能なのだけれど
マイコン(小)には、重すぎるのであまり使ってこなかったが
カラーOLED SSD1331とプログラムをほぼ同じに出来るので使い始めた。



```c++



//i2c_ssd1306_46_uno_1


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  //46を設定
  int tempval = 46;

  //表示変換する
  char str1[3];
  str1[0] = '0' + (tempval/10);
  str1[1] = '0' + (tempval%10);
  str1[2] = 0;

  // 1行目に46を表示
  display.println(str1);

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop




```
UIKitで動画を再生・停止・シークする

## 概要
UIKit x Combineでプロジェクトに保存している動画を再生停止する時のメモです。
動画は[Pixabay](https://pixabay.com/ja/)より引用

## 環境
`Xcode14.2`
`iOS 16.2`

## 完成形

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551042/bc1c8651-18b8-8359-79fb-5bfdb66242c3.png" width="200" />

## 大まかな手順
1. 動画を再生するための`UIView`実装
2. 動画の再生・停止を親ViewControllerで管理

### `UIView`の実装
実装は以下です。
特徴的なのはCombineを使って、動画終了のタイミングを親クラスに知らせている箇所です。

```swift:VideoPlayUIView.swift
class VideoPlayUIView: UIView {
    ....
    private func subscribeDidFinishVideoPlay() {
        NotificationCenter
            .default
            .publisher(for: NSNotification.Name.AVPlayerItemDidPlayToEndTime)
            .receive(on: DispatchQueue.main)
            .sink { [weak self] _ in
                guard let self = self else { return }
                self.didFinishVideoPlay.send()
            }
            .store(in: &cancellables)
    }
    ....
}
```

### `ViewController`で動画の再生・停止を管理する
今回はプロジェクトに動画が保存されているので、遅延読み込みしてメモリに保存します。
先程の手順で再生終了のタイミングは取得できるので、取得できしだい動画を停止しリセットします。

```swift:VideoViewController.swift
class VideoViewController: UIViewController {
    @IBOutlet weak var videoPlayUIView: VideoPlayUIView!
    
    private var cancellables: Set<AnyCancellable> = []
    
    private lazy var player: AVPlayer = {
        let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
        return AVPlayer(url: url)
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        subscribeDidFinishVideoPlay()
        setup()
    }
    
    deinit {
        cancellables.forEach { $0.cancel() }
    }
}

// MARK: - SETUP
extension VideoViewController {
    private func setup() {
        videoPlayUIView.player = player
        player.play()
    }
}

// MARK: - SUBSCRIBE
extension VideoViewController {
    private func subscribeDidFinishVideoPlay() {
        videoPlayUIView
            .didFinishVideoPlay
            .receive(on: DispatchQueue.main)
            .sink { [weak self] _ in
                guard let self = self else { return }
                self.player.pause()
                self.player.seek(to: .zero)
            }
            .store(in: &cancellables)
    }
}

```

## 今後の課題
今回はプロジェクトに保存されてましたが、ネットワークから取得した場合や、ストリーミングなど技術的にチャレンジしたい分野です。
今後もこの分野は特に記事を上げたいと思ってます。

全体のソースコードは[こちら](https://github.com/h-taro/video-play-demo)です。

## 参考
https://developer.apple.com/documentation/avfoundation/avplayer
【LIFF・LINEログイン】自動ログインに失敗する・ユニバーサルリンクエラーの解消について

こんにちは。お久しぶりです。

今回は以下の問題について解説していこうと思います。

- [外部ブラウザにおいてLINEログイン（自動ログイン）に失敗する](#自動ログインの問題について)
- [外部ブラウザにおいてLIFFのURLスキーム ``https://liff.line.me/{LIFFID}`` にアクセスした際に、LINEアプリ内のブラウザではなく、外部ブラウザでエンドポイントURLに遷移してしまう](#liffでの問題について)
- [これらの問題の原因について](#これらの問題の原因について)
- [備考](#備考)

:::note warn
今回取り上げるこれらの問題は主にiOS版LINEを利用しているユーザーで発生する場合があるようです
:::

### 自動ログインの問題について

LINEログインの開発者の皆様はエンドユーザーなどからの不具合の報告などで、以下のような一度は目にしたことがあるのではないでしょうか。

- `LINEアプリが未インストール、もしくは、ユニバーサルリンクが正しく動作していません。メールアドレス・パスワードを入力してログインしてください。 `や、類似のエラーメッセージが表示され、LINEログインできない
- 「LINEアプリでログイン」ボタンを押しても、画面リロードが発生するのみでログインができない
- その際に以下のようなエラー画面が表示される

<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620553/3fb0e5b6-5eb9-e11a-d284-85a722960f19.png">

この問題について、「LINE」アプリをインストールしており、正常に利用できる端末においては、エラーメッセージにも記載のとおり「LINEアプリでログイン」ボタンを長押しし、「"LINE"で開く」を押してログインページを開き直すことで、それ以降は外部ブラウザで自動ログインが動作し、また「LINEアプリでログイン」ボタンを押すことでも自動ログインが動作するようになります。

<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620553/e3654014-7a48-7f73-5ce5-2c191d8f8e7d.png">


### LIFFでの問題について

外部ブラウザにおいてLIFF（https://liff.line.me/{LIFFID}） からLIFFアプリにアクセスした場合、通常であれば
[LIFFブラウザ](https://developers.line.biz/ja/docs/liff/overview/#liff-browser)と呼ばれるLINEアプリ内のブラウザでLIFFアプリのエンドポイントURLが開かれます。

しかしながら、何らかの不具合などにより、LIFFアプリがLIFFブラウザで開かず、外部ブラウザでそのまま開かれてしまう場合があるようです。

この問題について、上記LINEログインと同様に、「LIFFのURLスキーム」を「"LINE"で開く」ボタンの押下で開くことで、以降は外部ブラウザでLIFFのURLスキームをタップした際にLIFFブラウザに正常に遷移する動作となります。

※LIFFのURLをiOSの「メモ帳」などに貼り付けると簡単に再現できます。  
※https://liff.line.me/1656508316-k7jNojXm はLINE社が提供するLIFFプレイグラウンドのURLです。


<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620553/fb30041a-a243-d876-8a54-64e0192f5bf7.png">  
  
    
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620553/88daf2b7-2abb-650f-c88c-13f26c138953.png">





### これらの問題の原因について

はっきりとしたことはわかりませんが、これらの2問題に共通することとして、iOSの機能であるユニバーサルリンクを利用しているという点があります。現状、ユニバーサルリンクに関連する何らかの不具合の可能性を推察しています。
上記「"LINE"で開く」操作により、iOSとLINEアプリのユニバーサルリンク設定が再度行われ、正常に動作するようになるのではないかと考えています。

* 自動ログイン

>また、外部ブラウザにおける自動ログインの動作は、iOSのUniversal LinkやAndroidのアプリリンク の機能を利用しています。そのため、この機能が動作する際に表示されることがあるダイアログ、この機能を利用するためのOS側での条件、利用しないための設定方法など、詳細については各OSの仕様を確認してください。
https://developers.line.biz/ja/faq/#how-does-auto-login-work

* LIFF
>ユーザーがLIFF URLにアクセスすると、外部ブラウザまたはLINE上でLIFFブラウザが開きます。どちらの環境で開くかは、iOSの場合はユニバーサルリンク、Androidの場合はApp Links の仕様に従います。
https://developers.line.biz/ja/docs/liff/opening-liff-app/

#### 備考
本問題に関連して、個人的なLINEアプリにおけるユニバーサルリンクの経験メモを記載します。

- これらの問題はiOSのアップデートやLINEのバージョンアップ、Safariブラウザのキャッシュのクリアなどでも解消する場合がありました
- この問題はAndroid環境では発生しないようです
- iOSのユニバーサルリンクはユーザーの**リンクタップ**の操作に反応して動作するようです
- iOSのユニバーサルリンクはサーバーサイドのリダイレクトやjavascriptによるリダイレクト、ブラウザのアドレスバーに直接URLを入力して遷移した場合などでは動作しないようです
- iOSだとSafari以外の外部ブラウザ（ChromeやFireFoxなど）では、少なくともLINEアプリのユニバーサルリンクは正常に動作しない場合があるようです
ROSをuninstallする

ROS（melodic）をuninstallする

```
sudo apt-get remove ros-*
```

※ubuntu20.04にアップグレードするには一度ROS（melodic）をuninstallする必要があった。その後、`sudo do-release-upgrade`によりアップグレード成功した。


# 参考

https://answers.ros.org/question/57213/how-i-completely-remove-all-ros-from-my-system/

https://shikiyura.com/2021/07/do-release-upgrade_on_wsl2/
Arduino UNOでI2CのIDのスキャニング


目的
OLEDのアドレスをさがす。
たぶん3Cだから3Cが表示されたら当たり


![o_cop287.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3d1c2c53-39bc-22ae-4810-ad933a1fc7a4.jpeg)



いろいろ
なんか、見ているとI2Cのアドレスで沼にハマる人おおそう。


元


https://qiita.com/caa45040/items/018948208df4b1f63b8e



プログラムは、STM32G071用と完全に同じ



```c++




//i2c_scanner_071_1

#include <Arduino.h>
#include <Wire.h>

//初期化
void setup() {

  Wire.begin();

  Serial.begin(9600);

  char hex1[] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };

  for (int ii = 1;  ii < 127; ii++ )
  {

    Wire.beginTransmission(ii);

    if (Wire.endTransmission() == 0)
    {
      Serial.print( hex1[  (ii >> 4) ]  );
      Serial.print( hex1[  (ii & 15) ]  );
      Serial.print(",");
    }//if

  }//for

}//setup

//無限ループ
void loop() {
}//loop





```
Unity公式が公開しているプログラミングパターンを読み取ってみた！～その3. LiskovSubstitution(リスコフの置換原則)～

# はじめに
Unity公式がプログラミングパターンのデモを説明書と共に全12種公開していたので、1つずつ読み取っていきたいと思います！
英語の説明書でしたので間違った解釈をしているかもしれませんが、ご了承下さい！
最初の5種は、SOLID原則に沿ったデモとなっており、コードのみが公開されています。
残り7種は、Scene付きのデモが入っていますので、ZIPファイルをダウンロードして試してみてください。
今回は、3つ目のLiskovSubstitution(リスコフの置換原則)についてです。

https://github.com/Unity-Technologies/game-programming-patterns-demo

https://resources.unity.com/games/level-up-your-code-with-game-programming-patterns

# 環境
OS : Windows10
Unity バージョン : 2021.3.8f1

# LiskovSubstitution(リスコフの置換原則)とは
LiskovSubstitution(リスコフの置換原則)は、派生クラスは基底クラスと置き換え可能でなければならないという原則です。
オブジェクト指向プログラミングでは、継承により派生クラスに機能を追加できますが、注意をしないと不必要に複雑になってしまいます。
デモでは乗り物を例にしたコードが掲載されていました。

### 悪いコード
基底クラスをVehicleクラスとして、派生クラスに車やトラックを作成するとなると以下のようになると思います。
```C#
public class Vehicle
{
    public float speed = 100;
    public Vector3 direction;

	public void GoForward()
	{

	}
	public void Reverse()
	{

	}
	public void TurnRight()
	{

	}
	public void TurnLeft()
	{

	}
}
```
しかし、派生クラスに電車を追加したくなったときはどうでしょうか？
電車は、前後に進むことはできますが、方向を変えることはできません。
この設計を修正するには、元のVehicleクラスの機能をインターフェースに移動させます。

### 良いコード
```C#
public interface ITurnable
{
    public void TurnRight();
    public void TurnLeft();
}

public interface IMovable
{
    public void GoForward();
    public void Reverse();
}
```
これでVehicleクラスの機能が2つの前後の動きと曲がる機能のインターフェースに分かれました。
これらのインターフェースは、2つの基底クラスに割り振られます。
```C#
public class RoadVehicle : IMovable, ITurnable
{
    public float speed = 100f;
    public float turnSpeed = 5f;
    public virtual void GoForward()
    {

    }
    public virtual void Reverse()
    {

    }
    public virtual void TurnLeft()
    {

    }
    public virtual void TurnRight()
    {

    }
}

public class RailVehicle : IMovable
{
    public float speed = 100;
    public virtual void GoForward()
    {

    }
    public virtual void Reverse()
    {

    }
}
```
前後左右の動きができるRoadVehicleクラスと前後の動きのみのRailVehicleクラスに分けることができました。
これで、車と電車は同じ基底クラスを共有することなく以下のように実装できます。
```C#
public class Car : RoadVehicle
{

}

public class Train : RailVehicle
{

}
```

# リスコフの置換原則を守るためのヒント
リスコフの置換原則を守るためには、以下4点を念頭に置いておくと良いらしいです。

- 派生クラスで基底クラスの機能を削除していないか
派生クラスで基底クラスの機能を削除している場合、リスコフの置換原則に違反している可能性があります。メソッドを空白にしていても同様に違反している可能性があります。
- 抽象化はシンプルになっているか
基底クラスに追加するロジックが多いほどリスコフの置換原則を守りにくくなります。
- 派生クラスは基底クラスと同じpublicメンバを持っているか
publicメンバは呼び出し時に同じシグネチャと動作も必要です。
- クラス階層を確立する前にクラスAPIを検討する
車と電車は乗り物で考えることができますが、別々の基底クラスを継承する方が理にかなっている場合があります。
- 継承よりも構成を優先する
継承によって機能を渡すのではなく、インターフェースまたは別クラスを作成して、特定の動作をカプセル化することを優先させてください。
# 参考

https://blog.unity.com/ja/games/level-up-your-code-with-game-programming-patterns
DoctrineとEloquent比較大全: テストフィクスチャを作る

day25（から2日遅れの！）今日はテストフィクスチャの作り方を見ていきます！

## Doctrine

```php:Fixtures/AuthorLoader.php
<?php

declare(strict_types=1);

namespace App\Fixtures;

use App\Entity\Author;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Persistence\ObjectManager;

class AuthorLoader implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        for ($i = 1; $i <= 5; $i++) {
            $author = new Author();
            $author->setName('author'.$i);
            $manager->persist($author);
        }
        $manager->flush();
    }
}

```

```php
<?php

declare(strict_types=1);

use App\Entity\Author;
use App\Fixtures\AuthorLoader;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Loader;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

$loader = new Loader();
$loader->addFixture(new AuthorLoader());
$executor = new ORMExecutor($entityManager, new ORMPurger($entityManager));
$executor->execute($loader->getFixtures());

$entityManager->getRepository(Author::class)->findAll(); // 5件登録されている

```

- doctrine/data-fixturesを使います。
- 愚直にエンティティを作ってpersist, flushするという使い心地のため、コード量も多めでやや使いにくいです。
    - それをカバーするために（?）Symfonyアプリケーションのテストフィクスチャとしてはサードパーティのnelmio/alice + liip/test-fixtures-bundle を活用するのが一般的でした。
    - 最近zenstruck/foundryという新しいfixtureライブラリが作られ、こちらはEloquentのfactoryとやや似た使い心地となっています。詳しい使い方はこちら。 https://tech.quartetcom.co.jp/2021/12/20/foundry-the-new-fixtures-for-functional-testing/

## Eloquent

```php:database/factories/AuthorFactory.php
<?php

namespace Database\Factories;

use App\Models\Author;
use Illuminate\Database\Eloquent\Factories\Factory;

class AuthorFactory extends Factory
{
    protected $model = Author::class;

    /**
    * モデルのデフォルト状態の定義
    *
    * @return array
    */
    public function definition(): array
    {
        return [
            'name' => $this->faker->name(),
        ];
    }

    protected static function newFactory()
    {
        return self::new();
    }
}

```

```php
<?php

declare(strict_types=1);

use App\Models\Author;

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/bootstrap.php';

$author = Author::factory()->create();

```

- 所定のファクトリクラスを作り、モデルに紐付けておくことで、モデルからファクトリを呼び出せます。
- factory()->create()によって内部でEloquentによってsave()が呼び出されてDB書き込みが行われるため、UnitTestではうっかり使わないように気をつけましょう。


## あとがき

Eloquentに比べてDoctrineの日本語情報が少ない・Doctrineの日本語情報が圧倒的に「Symfonyの中での使い方」に偏っている、というのを少しでも補いたいと思い、今年は1人アドベントカレンダーに挑戦してみました。
無事に（24時間10分遅れで :sweat_smile: ）完走できてホッとしています。

DoctrineはLaravelの中からも使えますし、ActiveRecordにやりにくさを感じているPHPerには、食わず嫌いせずぜひ試して見てほしいなと思います。
Doctrineを使ってみてなにかご質問あればお気軽に https://twitter.com/77web までどうぞ！！
DRAM とは

## 勉強前イメージ

FRAMとは違うのかな？

## 調査

### DRAM とは

Dynamic Random Access Memory の略で、コンピュータのメインメモリで使われるメモリになります。
こちらはFRAMとは違って揮発性のメモリになります。

DRAMは主に記憶装置として使われていて、CPUとHDD間のデータ受け渡しの役割を担っています。
しかし、コンデンサの電荷として記憶を持っているので維持をするために一定時間ごとにリフレッシュが行われます。
なぜかというとコンデンサに蓄えられた電荷は自然放電によって失われるので
リフレッシュを行うことで自然放電をカバーしてデータ損失の防止を行っています。

また、容量が大きいが低速になります。
理由としてはメモリセルの構造が単純なので容量あたりの製造コストを下げることができます。

### DRAMの規格

DRAMの規格としては以下のようなものがあります。

- SDRAM(Synchronous DRAM)
- DDR SDRAM
- DDR2 SDRAM
- DDR4 SDRAM
- DDR5 SDRAM

特にDDR5は2020年に標準規格が発表され、2021年末から発売された最新なメモリ規格になります。

## 勉強後イメージ

あんまメモリのこと知らんねんけど
メインメモリ以外で使う？

## 参考

- [DRAM（ダイナミックRAM）とは](https://medium-company.com/dram/)
- [DRAMとは？SRAMとの違い・揮発性メモリについて解説](https://tech-camp.in/note/technology/95351/)
Kustoのよく使うクエリ集

Log Analyticsに蓄積されたデータで統計情報をとる場合に使えるKQLを記載します。

:::note info
定期的に使えると思ったクエリをまとめていきます
:::

# サンプルデータ
以下でサンプルデータを作成する
```
datatable(TimeGenerated:datetime, SourceIP:string, DestinationIP:string)[
    datetime(2022/12/26 00:00:01), "1.1.1.1", "192.168.1.100",
    datetime(2022/12/26 00:00:02), "2.2.2.2", "192.168.1.100",
    datetime(2022/12/26 00:00:03), "3.3.3.3", "192.168.1.100",
    datetime(2022/12/26 00:00:04), "3.3.3.3", "192.168.1.100",
    datetime(2022/12/26 00:00:05), "1.1.1.1", "192.168.2.100",
]
```
実行結果は以下の通りになる
|TimeGenerated [UTC]|SourceIP|DestinationIP|
|--|--|--|
|2022/12/26 0:00:01.000|1.1.1.1|192.168.1.100|
|2022/12/26 0:00:02.000|2.2.2.2|192.168.1.100|
|2022/12/26 0:00:03.000|3.3.3.3|192.168.1.100|
|2022/12/26 0:00:04.000|3.3.3.3|192.168.1.100|
|2022/12/26 0:00:05.000|1.1.1.1|192.168.2.100|


# ケース紹介

## 宛先IPに対する送信元IPアドレスのユニーク化と宛先IPアドレスに対するイベント件数の表示

以下のような結果を出したい
|DetinationIP|SourceIP_details|event_count|
|--|--|--|
|92.168.1.100|["1.1.1.1","2.2.2.2","3.3.3.3"]|4|
|92.168.2.100|["1.1.1.1"]|1|

以下のクエリを使う。make_setは重複値を排除する。make_listは重複値も表示する。

```
| summarize SourceIP_details=make_set(SourceIP), event_count=count() by DestinationIP
```

## 宛先IPに対する送信元IPアドレスのユニーク化とその件数ならびに宛先IPアドレスに対するイベント件数の表示

以下のような結果を出したい
|DetinationIP|SourceIP_details|event_count|
|--|--|--|
|92.168.1.100|[{"SourceIP":"1.1.1.1","Count":1},{"SourceIP":"2.2.2.2","Count":1},{"SourceIP":"3.3.3.3","Count":2}]|4|
|92.168.2.100|[{"SourceIP":"1.1.1.1","Count":1}]|1|


以下のクエリを使う。
```
| summarize count() by DestinationIP, SourceIP
| extend summary = bag_pack("SourceIP", SourceIP, "Count", count_)
| summarize SourceIP_details=make_set(summary), event_count=sum(count_) by DestinationIP
```

### 詳細解説
最初にDestinationIPとSourceIPの組み合わせに対するイベント数をカウントする
```
| summarize count() by DestinationIP, SourceIP
```

|DestinationIP|SourceIP|count_|
|--|--|--|
|192.168.1.100|1.1.1.1|1|
|192.168.1.100|2.2.2.2|1|
|192.168.1.100|3.3.3.3|2|
|192.168.2.100|1.1.1.1|1|

その後SourceIPとcount_をまとめた辞書型フィールドを作成する
```
| extend summary = bag_pack("SourceIP", SourceIP, "Count", count_)
```
|summary|DestinationIP|SourceIP|count_|
|--|--|--|--|
|{"SourceIP":"1.1.1.1","Count":1}|192.168.1.100|1.1.1.1|1|
|{"SourceIP":"2.2.2.2","Count":1}|192.168.1.100|2.2.2.2|1|
|{"SourceIP":"3.3.3.3","Count":2}|192.168.1.100|3.3.3.3|2|
|{"SourceIP":"1.1.1.1","Count":1}|192.168.2.100|1.1.1.1|1|

最後にDestinationIP単位に集約し、summaryフィールドのデータを集約し配列に格納し、count_フィールドの合計数を求める
```
| summarize SourceIP_details=make_set(summary), event_count=sum(count_) by DestinationIP
```
XRについてまとめてみた

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# XRとは
XR(クロスリアリティ/エックスアール)とは、AR・VR・MRといった、`現実世界と仮想世界を融合することで、現実にはないものを知覚できる技術の総称`です。
AR・VR・MRのそれぞれの内容については次に示します。

### ■AR
AR(Augmented Reality)は、__拡張現実__ のことを意味します。スマホやタブレット、サングラス等のデジタル端末を通して現実を見ることで、世界を拡張することができます。例えば、スマホのカメラで目の前の机を映した時に机の上に仮想的なモノを投影することができます。つまり、`デジタル端末を通して現実世界を見た時に、まるで現実世界にそのコンテンツがあるかのように見せる`ことができるのがARです。

### ■VR
VR(Virtual Reality)は、__仮想現実__ のことを意味します。主にヘッドマウントディスプレイと呼ばれる専用機器を装着することで、目の前に仮想世界を映し出し、まるで`自身がバーチャル空間にいるように見せる`ことができます。最も有名なのが、PlayStation VRのようなゲームですが、他にも災害訓練として、火災現場をCGで再現するような用途にも使われています。

### ■MR
MR(Mixed Reality)は、__複合現実__ のことを意味します。ARと混同されがちですが、ARは現実世界に仮想世界の映像を投影するだけであるのに対して、MRは`仮想的なモノをまさにそこにあるように存在させる`ことができます。スパイ映画でよく見るような、3D映像として投影された地図(ホログラム)を手で触れて操るような技術がありますが、MRはあのイメージです。

# XRでビジネスはどう変わる？
XRは今後どのような場面で使われていくのでしょうか？
### ①オンライン会議
仮想世界と現実世界を組み合わせるXRは、__最もFace To Faceに近い__ コミュニケーションであると言われています。コロナウイルスの影響でオンライン会議は当たり前となりましたが、画面越しではなく仮想空間で行うバーチャル会議も、XRの技術を使えば可能です。他にも、バーチャル店舗や遠隔からの作業支援等、対面が当たり前であったことも、XRの技術によってオンラインに変わっていくでしょう。

### ②MR × 教育
例えば、製造現場では実際にトラブルが起こった時に初めてその設備に触れることが多々あります。前もって説明書や標準所でなんとなくの機構を理解しておいても、実際のトラブル対応と頭の中で想像するのとでは全く違うため、復旧に想定以上の時間を要することがあります。こうした問題を解決できるのがMRです。前述した通り、MRは仮想的なモノをその場にあるように見せることができます。これにより、実際に体験するとまではいきませんが、より __実際の設備に近い環境で教育を行う__ ことができるのです。



# 終わりに
XRはまだまだ開発の余地がある技術です。XRではハンドトラッキングと呼ばれる、頭や手、体の向き等を検知するための技術が使われるのですが、一昔前からすればその精度も非常に上がってきています。今後の発展が大意に期待され、かつまだまだ伸び代のある技術ですので、今の内にXRについて勉強しておくことは非常に有益になると思います。
最後までお付き合いくださりありがとうございました。
gitのpushとかを簡単に

# gitを簡単に
githubpagesを使っている
プログラムを変えてはgithubに挙げて確認して
ローカルじゃできないのかと
頑張ればできるのは知っているけどそんなのめんどいじゃないか

ということで
どういうことで？

よくあるgitの
add→commit→push
の流れをshellスクリプトとして，run.shにやらせることにしました
本物のアプリを作ってるときにこんなことしてはまじで怒られるかもですが，個人開発
間違えても何も問題ないです
なにかもっといい顔文字あれば教えてください

```shell
if [ "$1" = "" ]
then
    echo 'コメントよこせ'
    echo '( ´ ▽ ` )ﾉ'
else
    echo $1
    echo -e '\e[36mgit add .\e[36m'
    git add .
    echo -e "\e[36mgit commit -m $1\e[36m"
    git commit -m $1
    echo -e '\e[36mgit push -u origin master\e[36m'
    git push -u origin master
fi
```
FRAM とは

## 勉強前イメージ

RAMっぽいけど、なんか普通のRAMとは違うのね？しらんけど

## 調査

### FRAM とは

Ferroelectric Random Access Memoryの略で、強誘電体メモリと呼ばれます。
半導体メモリの一つで、RAMに分類されて通電しなくても記憶を保持する不揮発性メモリになります。
FRAMは登録商標で、一般にはFeRAMと言われます。

強誘電体とは・・・
ぜつんたいの内、プラス・マイナスの電荷の分布が偏り分極に電荷を蓄えられるのが `誘導体` 。
誘導体の内、電圧の加え方で分極の方向を制御できて、電圧を加えなくても状態が維持されるものを `強誘電体` になります。

記憶を維持するメモリセルというものがありますが、電極間の絶縁体として強誘電体をはさむことで
高速な書き込み・通電が途絶えても消えない不揮発性を両立しています。

### FRAM のメリット

- アクセス時間が短い
- 書き換え回数が多い
- データ保持期間が長い

## 勉強後イメージ

USBメモリとかがこれに当たるみたい

## 参考

- [FRAM【Ferroelectric Random Access Memory】FeRAM / 強誘電体メモリ](https://e-words.jp/w/FRAM.html)
RealSense インストール (ROS-Noetic)

realsense-ros install スクリプト,これを実行すればok

```install.sh
# Realsense SDK 2.0 Installation: 
# ref: https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE 
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
sudo apt update
sudo apt-get install librealsense2-dkms -y
sudo apt-get install librealsense2-utils -y
sudo apt-get install librealsense2-dev -y
sudo apt-get install librealsense2-dbg -y

# realnsese-ros install
sudo apt-get install ros-noetic-ddynamic-reconfigure -y
cd ~/catkin_ws/src/
git clone https://github.com/IntelRealSense/realsense-ros.git
cd realsense-ros/
git checkout `git tag | sort -V | grep -P "^2.\d+\.\d+" | tail -1`
catkin build
```

参考: 

- Realsense SDK 2.0 Installation

https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md

- realsense-ros install

https://qiita.com/porizou1/items/be1eb78015828d43f9fb
レジューム とは

## 勉強前イメージ

いやわからん！

## 調査

### レジューム とは

resumeと書き、リジュームとも言われます。

コンピュータの実行状況をメモリに保存して、次使用する際に即座に直前の状態に戻す機能になります。
パソコンなどの機能で、サスペンドとも呼ばれます。

### レジューム の方式

レジュームには特に以下2つの方式があります。

- サスペンド

RAMには通電しておいて直前の状態を保存し、省電力状態で待機する方式。
STDとも呼ばれます。

- ハイバネーション

メモリの内容をストレージに保存しておいて、電源を切る方式。
STRとも呼ばれます。

## 勉強後イメージ

サスペンド・・・聞いたことあったけど
実際スリープ的なやつよね。
あれRAMには電気が通電してるってことか、あまり考えたことなかったから知らなかった・・・

## 参考

- [レジューム【resume】リジューム](https://e-words.jp/w/%E3%83%AC%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A0.html)
【Unity】単純明快なシングルトンもどき

# 概要

唯一性も存在も保証しない代わりに、超絶シンプルなシングルトン（ではない何か）の実装方法を紹介します。

# コード

``` C#
using UnityEngine;

public class Manager : MonoBehaviour
{
    public static Manager Instance { get; private set; } = null;
    private void Awake() => Instance = this;
}
```

# 備考

唯一性を求めるなら普通のシングルトンをおすすめします。
保守性や柔軟性を求めるならサービスロケータやDIをおすすめします。
python処理の進捗可視化

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

通常処理や機械学習、Deeplearningなどの実行時に現在の進捗を確認したいと思ったことはありませんでしょうか。今回はそれが叶えられるライブラリ「tqdm」を用い、プログレスバーで表示してみましょう。
## テスト環境の作成
```
python -m venv tqdmtest
.\tqdmtest\Scripts\activate
```

## ライブラリをインストール
```
pip install tqdm
```

## テスト実行
```python
import time
from tqdm import tqdm

for i in tqdm(range(5)):
    time.sleep(1)
```
![](https://storage.googleapis.com/zenn-user-upload/0ff0713c969e-20221224.png)

### プログレスバーの前に文字を入れる
```python 
from tqdm import tqdm
for i in tqdm(range(5), desc="test"):
    pass
```
![](https://storage.googleapis.com/zenn-user-upload/33273c3627e4-20221226.png)
### プログレスバーの後ろに文字を入れる
```python 
from tqdm import tqdm
for i in tqdm(range(5), postfix="test"):
    pass
```
![](https://storage.googleapis.com/zenn-user-upload/cbdd2c891204-20221226.png)
### プログレスバーを非表示
```disable=True```を引数で指定することで、プログレスバーを非表示にすることができます。

```python 
from tqdm import tqdm
for i in tqdm(range(5), disable=True):
    pass
```
### プログレスバーの表示記号を変更する
```ascii=[記号]```を引数で指定することで、プログレスバー内に表示される文字列を変更することができます。
```python 
from tqdm import tqdm
for i in tqdm(range(5), ascii="//"):
    pass
```
![](https://storage.googleapis.com/zenn-user-upload/93adc92bec00-20221226.png)
sap data warehouse cloud（DWC） 別スペースのテーブルやビューの参照方法

# はじめに
DWCでデータフロー、ビューを作成する際に、別のスペースのビューやテーブルを参照する事が出来ますのでその設定方法についてご紹介いたします。

# サンプルスペース
サンプルとして参照元と参照先の２つのスペースを作成します。（スペースの作成方法については割愛します。）
共有元：TEST_PRODUCTION
共有先：TEST_PRODUCTION2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/618b8964-daab-dd3e-d768-c2035203176b.png)

１．まずは共有元(TEST_PRODUCTION)のスペースにサンプルテーブルを作成し、デプロイします。
　　その後、添付（赤線）の共有アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/a13797cf-15c1-e630-3363-f52cbf33c774.png)


２．テーブルの共有設定画面が表示されるので、共有化したいスペースを選択し、共有ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/5ca14d48-1510-f409-156e-39802b874631.png)

３．共有済みとして「TEST_PRODUCTION2」が追加されました。※アクセスは読み取りのみです。
　　共有元の設定は以上です。次は共有先で共有元テーブルの設定方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/57135bf7-6406-bbb5-025f-aa17714cbddf.png)

４．共有先（TEST_PRODUCTION2）のスペースからビュー作成画面を開きます。
　　すると共有オブジェクトのテーブル配下に上記１～３で設定した「TEST_PRODUCTION」スペースのテーブルが表示し、ビューとして設定する事が可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/81216d3f-8d78-a188-daf3-90236aa6bf7c.png)

# おわりに
スペース内で全て簡潔すれば共有化する必要はないかもしれませんが、ビューやテーブルの数が多くなった場合等、スペース毎に用途を分けて管理したいケースもあるかと思います。そんな場合、上記の方法でスペースを跨いで参照できるのでぜひご活用下さい。
[python] Django 外部キー(Parent)のデータ、filterを用いてChildのデータを参照する


# 環境
Django 3.1.13
python 3.9


# Code
## Model
```python:models.py
from django.db import models
from django.contrib.auth.models import User

class Work(models.Model):
    title = models.CharField('Work title', max_length=255)
    created_by = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title



class Commission(models.Model):
    title = models.CharField('commission title', max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
    parent_work = models.ForeignKey(Work, blank=True, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return self.title

```

このようにCommission(依頼)がWork(仕事)を親として持つModelを考える。



## １つのParentを持つ時(外部キー)のデータ参照する
```python:views.py
def show_commission(request, commission_id):
    commission = Commission.objects.get(pk=commission_id)

    # parent_work = commission.parent_work

    return render(request, 'show_commission.html', {"commission": commission})
```
特に`inner join`などをしなくても外部キーのデータを参照することができる。

## 複数のChildを持つParentからChildのデータを参照する
```python:views.py
def show_work(request, work_id):

    work = Work.objects.get(pk=work_id)
    child_commissions = Commission.objects.filter(parent_work__id=work.id)

    return render(request, 'show_work.html',
                  {"work": work,
                   "child_commissions": child_commissions,
                   })

```
`filter`を用いて、`Commission`モデルから`parent_work.id`が`wokr.id`と一致するすべてのデータを探すことができる。


## 応用：外部－が持つ値で`Filter`参照する

```python
from django.db.models import Q

searched = "abc"
works = Work.objects.all().filter(created_by__username__contains=searched)
```
`Work`の外部ーである`created_by.username`が`searched`の値を含むすべてのデータを参照する

## 応用：Qオブジェクトによる複数条件
```python
searched = "abc"
works = Paginator(Work.objects.all().filter(
        Q(title__contains=searched) , Q(title__contains="cba") |
        Q(created_by__username__contains=searched)
        )
```
`Filter`の条件は
( `title__contains=searched` and `title__contains="cba"` ) or `created_by__username__contains=searched`

`,`は`AND`
`|`は`OR`
として用いられる。


# 関連

https://stackoverflow.com/questions/1981524/django-filtering-on-foreign-key-properties
M5Stack Basicで使う、Grove Moisture Sensor V1.4 (水分センサー) の挙動

地中での水分を計測できる「[Grove Moisture Sensor V1.4](https://wiki.seeedstudio.com/Grove-Moisture_Sensor/)」をM5Stack Basicで使ったときの挙動を調べました。

## 計測環境

- M5Stack Basic (V2.6ではない初期型)
    - Grove Moisture Sensor V1.4 への電源: 3.3V / 5V 両方調査
    - 使用GPIO: 36
- 水: 水道水 (12℃くらい)

以下のように直接水に浸したとき、どのレベルでいくつの値が返ってくるのかを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/41336c6d-34be-4ce1-b140-60830a219330.png)

## 結論

`analogRead()` は、以下のように返ってきます。
いずれにしても、先端が少し浸っている状態ですぐに3.3Vなら100、5Vなら1000近くの数字が得られます。
また、先端の方がかなり鋭敏で、以降はゆっくりした増加になります。浸かっている位置と数値はリニアにならないので注意が必要です。

![3.3Vと5V](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/ecba0e92-dc32-c1c3-1e8c-c423e7463038.png)

#### 具体的な位置 / 3.3V の場合

![id=1Dyd2zyJhex1IuGRJTFDijQvCnqVcCWEdAMHIzXlIClY](https://docs.google.com/drawings/d/e/2PACX-1vTCbsKx3u4OF3nOJVxLXAXxKxGdisU0rBtJ4J2hWHWP6gM7llp_1MVBqgpoj12vpgBfvOB442jbD3PA/pub?w=337&h=370)

#### 具体的な位置 / 5V の場合

![id=1ncWsbsebJYJO0wGn_o3Wq7HS7x7weEhuWaruDkHwQHQ](https://docs.google.com/drawings/d/e/2PACX-1vQg-uUp7ZBalKO8aKjpn3RCFqx2AR732KLNaanX31HeNxMFgAB44A0iM0c94V91j9q1uGYFIiHPgVtX/pub?w=337&h=370)

## 検証に使ったコード(スケッチ)

```c++
static const char _VERSION_[] = "MOIST-SIGFOX-0.1";
#include <M5Stack.h>
static const char TAG[] = "TAG"; // for ESP_LOG*

void setup() {
  delay(1000);
  M5.begin();
  Serial.begin(115200); // for log
  ESP_LOGD(TAG, "--- START: %s", _VERSION_);
  M5.Lcd.sleep();
  M5.Lcd.setBrightness(0);
}

static const uint32_t LOOP_INTERVAL_MS_IN_LOOP = 2000; // msec
void loop() {
  long sensorValue = analogRead(36);
  ESP_LOGD(TAG, "sensorValue: %d", sensorValue);
  delay(LOOP_INTERVAL_MS_IN_LOOP);
}
```

## おわりに

値は水温や水質で変化すると考えられるため、検証は必須です。

また、 https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ には3.3Vで0～700と書かれていますが、おそらくArduino UNO あたりのADC分解能を基に掲載されている可能性があります。
M5Stack Basic(ESP32)では分解能が異なるため、得られる値も異なったということになるかと思います。

EoT
Windowsの検索ボックスでWeb検索しないようにする

## はじめに

Windowsのタスクバーの検索ボックスでWeb検索されると重たい場合（会社PCなど）に、これをレジストリで無効化する。

## やりかた

以下を.regファイルとして保存し(たとえば`StopWebSearch.reg`)、結合する。

```
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Search]
"CortanaConsent"=dword:00000000
"BingSearchEnabled"=dword:00000000
```

## 参考

https://www.pasoble.jp/windows/10/kensaku-web-mukou.html
【Ruby】モジュールの名前空間を深掘りするースコープとグローバル名前空間ー

Moduleの名前空間について簡単にまとめます。
書籍中心に勉強していますので、ご指摘あればコメントお願いいたします。

# 名前空間とは
Moduleを使用して、クラスなどの定義した定数が一意になるようにするための手段です。

開発を進めていくと、他のファイルにあるクラス名を重複するなどの問題が起こる。これを解決する手段として用いられます。

# 定義の仕方

定義したクラス名にmoduleをネストして使用します。

```ruby
module Bar
    class Foo
        def say
            "hello"
        end
    end
end

foo = Bar::Foo.new
foo.say #=> "hello"
```
呼び出す場合は`モジュール名::クラス名`の形を取ります。
ここで、インスタンスを作るときに、`Foo.new`だけの形で定義するとエラーが出力されるので注意しましょう。

# 使用する場面

名前空間を使用する時はプロジェクトのディレクトリ構造に名前空間を合わせます。
上のクラスはBarディレクトリのFooクラスで定義されているということになります。
つまり`Bar::Foo`といる名前は、`Bar/Foo.rb`というファイルに対応していることになります。

# 定数を定義した時

名前空間を使用して、定数を参照したい場合を考えてみましょう。

```ruby
module Bar
    KEY = "password0123"
    
    class Foo
        def say(key = KEY)
            "hello, #{key}"
        end
    end
end

foo = Bar::Foo.new
foo.say  # => "hello, password0123"
```

上の記述の場合は、定数`KEY`を参照することができます。
これは、`Barモジュール`が`Fooクラス`のスコープ内にあるため、参照できています。

では、moduleをクラスの外側に定義してみましょう。

```ruby
module Bar
    KEY = "password0123"
end
    
class Bar::Foo
    def say(key = KEY)
        "hello, #{key}"
    end
end

foo = Bar::Foo.new
foo.say # => NameError
```

この場合はエラーが発生します。
`::`を使用して名前空間を定義していますが、`KEY`定数を参照指定いないようです。
これには、RUBYの定数の探索の仕組みが関係しています。

# RUBYの定数の探索
定数の探索の方法は2つあります。
- 継承階層の探索
- レキシカルスコープの探索

継承階層の探索は、メソッドなどを探索する場合に子クラスから親クラスへ遡っていく方法です。
この継承階層の探索をする前に、まず定数が定義されているレキシカルスコープ内を探索します。

```ruby
module Bar
    KEY = "password0123"
    
    class Foo
        def say(key = KEY)
            "hello, #{key}"
        end
    end
end

foo = Bar::Foo.new
foo.say  # => "hello, password0123"
```
最初の例では、moduleがclassをネストしている形をとり、同じレキシカルスコープ内と言えます。
Fooクラスの中で呼び出しているため、`KEY定数`を使用することができます。

では、エラーが出た方の記述です。

```ruby
module Bar
    KEY = "password0123"
end
    
class Bar::Foo
    def say(key = KEY)
        "hello, #{key}"
    end
end

foo = Bar::Foo.new
foo.say # => NameError
```
これは、moduleがclassの外でendしていますので、レキシカルスコープから外れています。
名前空間でBarモジュールを`::`で修飾していますが、定数の参照はできないようです。

解決法としては、KEY定数にも同様に`::`を使用することで定数を使用することができます。

```ruby
module Bar
    KEY = "password0123"
end
    
class Bar::Foo
    def say(key = Bar::KEY)
       "hello, #{key}"
    end
end

foo = Bar::Foo.new
foo.say # => "hello, password0123"
```

# モジュールでネスとしていないクラスは無名？
クラスを定義するとき、すべてのクラスに名前空間をつけるわけではありません。
では、名前空間を使っていないクラスには名前がないのでしょうか？

実は、名前のつかないクラスはすべてトップクラスのObjectクラスに存在します。

```ruby
class Bar
    def say
        "hello"
    end
end

bar = Object::Bar.new　　# =>::Bar.newでもok
p bar.say # => "hello"
```
この場合、わざわざObjectクラスを参照して定義する必要は全くありません。
このようなトップクラスに存在するクラスをグローバル名前空間に属するとしています。

ちなみに`Object::Bar`を省略した形で、`::Bar`でも呼び出せます。

使用する場面としては、元々Rubyに定義されているArrayクラスを名前空間で定義して、その別名でつけたArrayクラスの中で元にあるArrayクラスを使用したい場合などに活躍します。

```ruby
module Cluster
    class Array
        def initialize (n)
            @disks = ::Array.new(n){|i| "disk#{i}"}
        end
    end
end
cluster = Cluster::Array.new(3)
# => #<Cluster::Array:0x000055fe3b0a6448 @disks=["disk0", "disk1", "disk2"]>
# 書籍を参照
```

# 終わりに

名前空間のレキシカルスコープについて、トップクラスでのグローバル名前空間については理解が深まった気がします。
gemのライブラリに書かれている`::`に恐れずに立ち向かえそうです...!

# 参考書籍
Effective Ruby
DoctrineとEloquent比較大全23: FROMにサブクエリを使う

day23（から3日遅れの）今日はfromにサブクエリを使う方法を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

$sql = <<<EOQ
SELECT t.name, t.books_count FROM (select authors.id, authors.name, count(books.id) as books_count from authors left join books on books.author_id = authors.id group by authors.id, authors.name) as t
EOQ;

/** @var array<array{name: string, books_count: int}> $rows */
$rows = $entityManager->getConnection()->fetchAllAssociative($sql);
foreach ($rows as $row) {
    echo sprintf('%s(%d)', $row['name'], $row['books_count']).PHP_EOL;
}
```

- fromに限らず、サブクエリを使うときはORMではなくDBALで対応することがほとんどです。無理にEntityにマップせずに一旦連想配列を取得して、必要に応じて後でDTOに詰め替えます。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Author;
use Illuminate\Database\Eloquent\Collection;

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/bootstrap.php';

$subQuery = <<<EOQ
select authors.id, authors.name, count(books.id) as books_count from authors left join books on books.author_id = authors.id group by authors.id, authors.name
EOQ;

/** @var Collection<Author> $result */
$result = Author::query()->fromSub($subQuery, 't')->select('t.name', 't.books_count')->get();
foreach ($result as $author) {
    // books_countはAuthorのプロパティではないが、Author::query()で始めたのでAuthorにマップされている
    echo sprintf('%s(%d)', $author->name, $author->books_count).PHP_EOL;
}

```

- Modelは未定義の項目も受け付けるため、サブクエリを使っていてもModelとして取得することができます。
- fromに限らず、DBMSの許す限りselectやwhereにもサブクエリを利用できます。
【Git】git diffで追加された行のみ取得する方法

## 取得方法

次のようにコマンドを実行すると追加された行のみ取得できます。  

```terminal
git diff -U0 \
  | grep '^+' \
  | grep -Ev '^\+\+\+ b/' \
  | sed 's/^+//'
```

- `git diff -U0`  
  前後の行を表示せず差分のみ表示。  
- `grep '^+'`  
  先頭に`+`がついている行を取得。  
- `grep -Ev '^\+\+\+ b/'`  
  先頭に`+++ b/`がついている行を除外。
- `sed 's/^+//'`
  先頭の`+`を削除。

sample.txtを以下の内容で作成して`git add`します。  

```sample.txt
初めからある文章
```

その後に以下のように文章を追加します。  

```sample.txt
初めからある文章
追加した文章
```

そして上記のコマンドを実行します。  

```terminal
$ git diff -U0 \
  | grep '^+' \
  | grep -Ev '^\+\+\+ b/' \
  | sed 's/^+//'
追加した文章
```

`追加した文章`という文言のみ取得できました。
Outlook VBAで「マクロは無効に設定」エラーでマクロ実行できない事象をselfcert.exeで解消。




# 事象
Outlook VBAを実行しようとしたところ、Outlook の開発タブから実行したが実行されない。
開発環境である自身のPC上では問題なく動作するが、ユーザーのPCでのみ事象発生。
VBEから実行すると、セキュリティセンターで、「すべてのマクロを有効にする」としているのに以下の画面が表示された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/0b358f18-f800-60dd-84e1-28bbbf974a29.png)


# 原因
セキュリティセンターの設定にかかわらず、証明書が設定されていないとOutlook VBAを実行できない仕様のようです。
※自身のPCでは引き渡された時、既に設定済み。

事象発生したPCの**VBE-ツール-デジタル署名**を確認したところ、以下のように証明書が設定されていませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/1612a582-2d5a-fef4-d18b-9095d5539a8b.png)


# 対応

**selfcert.exe** を実行し、自己証明書を作成し、VBEに設定します。

自身のPCでは検索で**VBA**と検索すると**VBAプロジェクトのデジタル証明書**として検索できたのですが、ユーザーのPCでは出てこなく、ファイル名を指定して実行でも起動できず。
自身のPCでexeが格納されているフォルダパスはユーザーのPCにはなく、最終的にユーザーPCのエクスプローラーでofficeインストールフォルダ周辺を検索してもらい、発見しました。

起動すると、以下の画面が出るので、適当な名前をつけてOK。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/036ae986-7cd3-f753-cdb8-15ba455a60d9.png)



**VBE-ツール-デジタル署名**から先ほど作成した署名を選択、VBEを保存してOutlook 再起動後にVBAが実行できるようになりました。



# 厄介ポイント

- VBEの画面から実行しないと、エラーメッセージ出ないが実行できない、という挙動になり気が付くのが難しい。
- なぜかユーザーのPCで初回は実行できてしまった。
- selfcert.exeが環境次第で場所が変わる。

# 参考

https://outlooklab.wordpress.com/2007/02/18/outlook-vba-%e3%83%9e%e3%82%af%e3%83%ad%e3%80%81%e3%81%af%e3%81%98%e3%82%81%e3%81%ae%e4%b8%80%e6%ad%a9/

https://www.teijitaisya.com/vba-selfcert/


https://learn.microsoft.com/ja-jp/outlook/troubleshoot/deployment/macros-in-this-project-disabled-outlook
【備忘録】関数の呼び出し元の参照

# 呼び出し元の参照

## 目的
・同じ名前の関数が複数ある場合にどのファイルの関数を使用したのかを探りたい。

## 使用方法
・呼び出し元を知りたい関数の中に記載するだけ。
```php
$dbg = debug_backtrace();
    foreach ($dbg as $dbgrow) {
        echo $dbgrow['file'];
        echo $dbgrow['line'];
        echo $dbgrow['function'];
        echo $dbgrow['class'];
		echo "<br>";
    }
```

## 詳細
function・・・関数名が格納されています。
line・・・行番号が格納されています。
file・・・ファイル名が格納されています。
class・・・クラス名が格納されています。
object・・・オブジェクトが格納されています。
type・・・コール方式が格納されています。　※メソッドの場合は “->”、 静的メソッドの場合は “::” 、関数の場合は空になっています。
args・・・関数の引数のリストが格納されています。
TeachableMachineで作ったモデルをダウンロードしてPythonで実行

# はじめに
TeachableMachineはウェブ上で簡単に機械学習モデルが作成できるウェブアプリですが、それに加えて、作成したモデルをダウンロードしてPythonやJavascriptで作ったアプリケーションで利用することもできます。ここでは、以前作成した[機械学習を使った破断面の画像分類](https://qiita.com/_Moony/items/01ce3d095d95696c399c)のモデルをダウンロードして、Pythonで作ったプログラムで使えるようにしてみました。

# TeachableMachineのモデルのダウンロード
まず、学習後のモデルをエクスポートするため、アプリ右上の「モデルをエクスポートする」をクリックします。
<img width="600" alt="右上-モデルをエクスポートする.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/be7fce3a-424c-375a-9f0c-e340da065897.jpeg">

ここではPythonでアプリケーションを作成するので、①Tensorflowを選び、②モデルをダウンロードをクリックします。
<img width="600" alt="tensorflow-Keras-モデルをダウンロード.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/b79d6193-c068-46b6-7e32-7c465b44441f.jpeg">

keras_model.h5とlabels.txtがダウンロードされます。ここでは、これらのファイルをc:/pythonというフォルダに格納します。
次に、表示されているサンプルプログラムをコピーします。kerasかOpenCV Kerasを選び（ここではKerasを選ぶ）、コピーをクリックすると、サンプルプログラムをコピーできます。コピーしたプロプラムをお使いのエディタにペーストして、名前を付けて保存します。ここでは、プログラムもc:/pythonに保存しておきます。

<img width="600" alt="KerasかOpenCV Kerasを選び、コピーをクリック.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/552900cc-f00b-f4bf-b80a-5bb3e840ea83.jpeg">

エディタにペーストしたサンプルプログラムで、下図の黄色線で示した個所を編集します。

<img width="600" alt="プログラム変更箇所.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/deb5b15c-d31e-aaad-7c37-60d4f3f3d4f1.jpeg">

ここで、test_image.jpgは下の画像です。上記のプログラムを動かすには、この画像をc:/dataに格納します。

<img width="400" alt="test_image.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/87981e9c-936e-b668-b819-c03d3aa97d13.jpeg">

プログラムを実行すると、下のターミナルにClass:2 RockとConfidence score0.978・・・という結果が表示されます。Rockは粒界破面を表すので、正しい結果が得られていることが分かります。

<img width="600" alt="実行結果（Rockと表示）.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/e43652b3-9bf6-a46c-9c00-fe1ad4ebaea3.jpeg">

さて、上記のサンプルプログラムでは画像ファイルが選択できませんので、サンプルプログラムにファイル選択の機能を追加したプログラムを、上記のプログラムやTeachableMachineのモデルなどと一緒に以下に格納しました。

https://github.com/repositoryfiles/fracture

# 動作環境
- Windows11
- VSC 1.7.3.1
- Python 3.8.10
- numpy 1.20.0
- keras 2.11.0
- pillow 9.3.0

# 終わりに

何かのお役に立てれば幸いです。
Ubuntu20.04でTouchpadによる自動Pasteを防ぐ

Ubuntu20.04ではtouchpadの中央クリックがコピペに対応しているようなのでそれを変更する必要があります．
今回の記事では中央クリックを左クリックに対応させようと思います．

# 結論

以下のコマンドをshellで実行すると自動Pasteを防ぐことができます．

```shell
xinput set-button-map <device id> 1 1 3
```

`device id`は `xinput list` で調べることができて，自分の場合は `ASUE1410:00 04F3:3230 Touchpad` という名前のDeviceのIDが12であったため，それを利用しました．

**NOTE**
なお，自分の環境ではrebootするたびに環境変数が元に戻ってしまうようなので `.bashrc` に上述のコマンドを追加しています．

# コマンドの説明

```shell
xinput set-button-map <device id> <左クリックによる操作> <中央クリックによる操作> <右クリックによる操作>
```

1が通常の左クリック，3が通常の右クリック，0が無反応に対応します．
自分は中央クリックであっても，左クリックを意図していることが大半なので左クリックで登録します．
中央クリックを完全に無動作とするためには 0 にする必要があります．

また，`device id`は `xinput list` で取得できます．
自分の場合は以下のような結果が得られました．

```shell
$ xinput list

⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ ASUE1410:00 04F3:3230 Mouse             	id=11	[slave  pointer  (2)]
⎜   ↳ ASUE1410:00 04F3:3230 Touchpad          	id=12	[slave  pointer  (2)]  # <==== これがTouchpad
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ USB2.0 HD UVC WebCam: USB2.0 HD         	id=9	[slave  keyboard (3)]
    ↳ USB2.0 HD UVC WebCam: USB2.0 IR         	id=10	[slave  keyboard (3)]
    ↳ ASUE1410:00 04F3:3230 Keyboard          	id=13	[slave  keyboard (3)]
    ↳ Intel HID events                        	id=14	[slave  keyboard (3)]
    ↳ Intel HID 5 button array                	id=15	[slave  keyboard (3)]
    ↳ Asus WMI hotkeys                        	id=16	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=17	[slave  keyboard (3)]
```
Comfort and convenience functions in the passenger compartment. ボッシュ自動車handbook 11版(109a) p.1408

Comfort and convenience, Comfort and convenience systems in the door and roof areas , ボッシュ自動車handbook 11版(109)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
Vehicle bodies,  1310
Comfort and convenience, 1392
Safety systems in the motor vehicle, 1410
Vehicle security systems, 1430
Automotive electrics, 1450
Vehicle electrical systems for hybrid and electric vehicles, 1560
Automotive electronics, 1620
Entertainment 1780
Drive assistance and sensors, 1804
Drive assistance systems 1872
Future of automated driving 1934
Appendics, 1940

# Comfort and convenience functions in the passenger compartment , p.1408
## Electrical seat adjustment

Figure 1: Electromechanical seat adjustment

## Electrical steering-wheel adjustment

Figure 2 Electrical steering-wheel adjustment
# Reference
 no reference

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221226
ver. 0.02 ありがとう追記 20230620
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
クラウドやレンタルサーバーを正確に理解する

# 始めに
GoogleやAWS等のクラウドサービスとレンタルサーバーの違いなどをなんとなく認識するのではなく正確に理解したいと思い、調べた。それをまとめたい。備忘録のためでもある。前提として、レンタルサーバーは物理ホストを借りること、クラウドはネットワーク上でサービスを利用する技術であることは周知のこととする。
# レンタルサーバーとは
端的に言うと、**物理サーバーを一人もしくは複数人がシェアして借りること**。要は物理的なサーバーを直接借りている。
レンタルサーバーの表現として、シェアハウスがしばしば比喩として使われる。
代表例としてXServer(エックスサーバー)などがある。
# クラウド（クラウドコンピューティング、クラウドサービス）とは
こちらは物理サーバーを直接借りるのではなく、**物理サーバー上で仮想化されたサーバーを利用すること**。
イメージは同じ建物だが部屋割りがされているマンション。
## クラウドサービスは3種類に分類される
- **SaaS (Software as a Service)**
- **PaaS (Platform as a Service)**
- **IaaS (Infrastructure as a Service)**

ではこれら3つの違いは？
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078929/ea07ddd4-0ab6-8239-95e0-b7c96f5f804a.png)[^1]
## SaaS
英語の通り、ソフトウェア（アプリケーション）までサービスとして提供するクラウドサービスのこと。
エンドユーザー向けの印象。特にいじらなくてもそのまま使える。拡張度は低い。
ex)DropBox, Google Drive, OneDrive, Amazon S3
## PaaS
プラットフォーム（OS）までサービスとして提供するクラウドサービスのこと。
提供された開発環境の上でアプリケーションを開発、実行できるため、工数削減につながる。
ex)Azure, AWS
## IaaS
インフラまでサービスとして提供するクラウドサービスのこと。
自由度は高い。企業向け。ex)Google Compute Engine

[^1]:引用元
[PaaSとは？IaaS、SaaSとの違いやメリット、活用方法を紹介](https://www.itreview.jp/blog/archives/8709?utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAqaWdBhAvEiwAGAQltirENzKfG4EeE_TY8KjjnMYWpEO_XAeGuNKTNZhBBJm97fcCgd9MfxoCgoMQAvD_BwE)
AWS Lambdaを使おうとした時の初期設定をメモ書き

自分のメモ書きとして投稿します。

## 経緯

スクレイピングをサーバーサイドで実施したいと思い調べたところ、AWS Lambdaを使うことで、特にサーバーを用意することなく実現できるのではという考えに至った為です。（実際に実現できるかは不明）

## 環境

* Windows10
* Docker Desktop
(未熟者過ぎて他何書けば良いか分かりません）


## 参考サイト

* 全般の流れ
https://zenn.dev/445/articles/29aff4c8ce2e01

* AWSをPowershellから使うための初期導入
https://yoshinorin.net/articles/2018/08/19/aws-tools-for-windows/

* AWSをPowershellから使うための導入後～接続
https://blog.shibata.tech/entry/2018/09/20/185257

* 上記接続時のアクセスキー等の取得
https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/pstools-appendix-sign-up.html

* AWS CLIの導入
https://and-engineer.com/articles/YaH7AxIAACAAhqxI

## AWSの初期導入からプッシュまで
※ 自分の中で試行錯誤した過程を記述している部分もあり、必要のない部分もあるかもしれません

1. 初期導入のサイトを参考にツールをインストール
<https://aws.amazon.com/jp/powershell/>

1. Powershellを管理者権限で起動しモジュールをインストール
```Install-Module -Name AWSPowerShell```

1. スクリプト実行の有効化
```Set-ExecutionPolicy RemoteSigned```

1. Powershellモジュールのインポート（毎回実施が必要との事。省略する際は以下記事参考）
```Import-Module AWSPowerShell```
<https://yoshinorin.net/2018/08/19/powershell-profile/>

1. AWS上でユーザーを作成（権限は自分だけだったのでフルアクセスにしました）
<https://console.aws.amazon.com/iam/>

1. 認証情報を設定（上記で作った際の認証情報を使う）
```Set-AWSCredential -AccessKey {key} -SecretKey {secretKey} -StoreAs {name}```

1. AWS CLIをインストール
<https://awscli.amazonaws.com/AWSCLIV2.msi>

1. Amazon ECRの画面からリポジトリを選択し、プッシュコマンドの表示を選択

1. コマンドを上から順に実施する
  ※ Dockerイメージの構築は既存のDockerイメージをプッシュする際は不要
  ※ 一番上のDocker認証が上手くいかない場合、以下を試す
```Set-DefaultAWSRegion -Region 自分のリージョン```

## おわりに
ここまでで一旦書き終えたいと思います。
Qiitaの投稿になれていないからか、初挑戦のオンパレードだからか、ここまでで終わったーという気になったので、終了したいと思います。
誰かがつまづいたときにこの記事が少しでも参考になれば幸いです。
第10回 UiPath Friends 全国 ～Happy Automation Christmas★2022🎄～ に行ってきたので感じたことをまとめる

# はじめに
12/22（木）に、第10回 UiPath Friends 全国 ～Happy Automation Christmas★2022🎄～ に行ってきました。
ケーキがおいしかったのでその味を忘れないうちに記録として残します。

# 第10回 UiPath Friends 全国 ～Happy Automation Christmas★2022🎄って？
コミュニティであるUiPath Friendsが主催するイベントです。
自分は大手町会場に参加してきました。
Youtubeにもアーカイブが残っていますので、ぜひご覧ください。

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

司会はやまさきあさん(@yamasaki_aaaa )
なんと、企画のリーダーも務められていたとのこと。
その時の記録についても記事にされており、とても読みごたえがありました。
併せてご覧ください。

https://note.com/yamasakiaaaa/n/n42df40cfce9c

# 参加してどうだった？
今回も新たな知見を得られました。

## Studio Webについて

きっかけは、さおさん(@saosao885 )のライブコーディングで、
それまでは全くStudio Webについては知りませんでした。

今回のイベントをきっかけに調べてみて、2022年3月の発表を見つけました。

https://forum.uipath.com/t/studio-web-community-preview/404197

みやぎさん(@miya_gis )の記事も見つかりました。
個人的にまとめられたものとのことですが、非常にわかりやすくまとめられていました。

https://qiita.com/miya_gis/items/8decc5c77d72d6a097ba

# アドカレ参加特典もらえたうれしい

UiPath Friendsのアドベントカレンダー参加していたので、
この時特典ももらえました。ヤッター！！
![F841ED2B-00D0-4B7D-A86C-811F1E4860E5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/16cac525-de7f-2157-1e0b-60e4ea60b004.jpeg)

コースターとノートは座席に置いて威嚇しています。

# おわりに
楽しく学びになるひと時を過ごせてとてもよかったです。
今回は遭難せずにしゅっと会場につくことができました。
運営の方が親切に目印などを教えてくれたおかげです。
今度はLT登壇します！と言ってしまったので、ネタ集めから準備していこうと思います。
ケーキおいしかったです。（2回目）