「技術」カテゴリーアーカイブ

【デザインパターン】Adapterパターン

Adapterパターンのコード例です。

Adapterには継承を使ったパターンと委譲を使ったパターンがあります。

まずは継承を使用したパターン。

package org.example.adapter;

public class Adaptee {
    public void methodA()
    {

    }

    public void methodB()
    {

    }
}
package org.example.adapter;

public interface Target {
    public void targetMethod1();
    public void targetMethod2();
}
package org.example.adapter;

public class Adapter extends Adaptee implements Target{
    public void targetMethod1() {
        methodA();
    }

    public void targetMethod2() {
        methodB();
    }
}
package org.example.adapter;

public class Main {
    public static void main(String[] args)
    {
        Adaptee adaptee = new Adaptee();
        adaptee.methodA();
        adaptee.methodB();

        Adapter adapter = new Adapter();
        adapter.targetMethod1();
        adapter.targetMethod2();
    }
}

そして、委譲を使用したパターン。

package org.example.adapter;

public class Adapter implements Target{
    Adaptee adaptee;

    public Adapter()
    {
        adaptee = new Adaptee();
    }

    public void targetMethod1() {
        adaptee.methodA();
    }

    public void targetMethod2() {
        adaptee.methodB();
    }
}

このパターンは元々存在していたクラスAdapteeを使用したいけど、インターフェースが合わない、と言う場合、新しいクラスAdapterを作成して使用できるようにした、というパターンです。

継承と委譲がありますが、自分としては委譲の方がしっくりきます。

【ラズパイ】lircを使用した赤外線信号のトレースと送信

動いた。😄

lircのインストール

$ sudo apt-get install lirc

/boot/config.txtを書き換える。

今回は受信信号をGPIO21、赤外線LEDをGPIO20に接続しています。

# Uncomment this to enable infrared communication.
dtoverlay=gpio-ir,gpio_pin=21
dtoverlay=gpio-ir-tx,gpio_pin=20

/etc/lirc/lirc_options.confを書き換える。

まずはリモコンの信号を受信してデータを取るので、deviceは/dev/lirc1を記入する。

[lircd]
nodaemon        = False
driver          = default
device          = /dev/lirc1

lircdを一時停止。

$ sudo service lired stop

リモコンの信号を読み取る。

以下のコマンドを入力後、リモコンのボタンを押す。

今回は音量UPのボタンを押してみた。

mode2 -d /dev/lirc1 > volup.txt

volup.txtには、いかの様に出力されました。

space 16777215
pulse 9059
space 4508
pulse 632
space 501
pulse 635
space 506
pulse 681
space 455
pulse 682
space 456
pulse 630
space 505
pulse 632
space 505
pulse 584
space 1684
pulse 681
space 455
pulse 584
space 1684
pulse 584
space 1684
pulse 584
space 1684
pulse 585
space 1684
pulse 585
space 1685
pulse 640
space 1581
pulse 689
space 1627
pulse 611
space 524
pulse 611
space 1658
pulse 615
space 523
pulse 615
space 1655
pulse 614
space 522
pulse 615
space 1655
pulse 613
space 1654
pulse 614
space 524
pulse 613
space 527
pulse 609
space 525
pulse 611
space 1658
pulse 588
space 549
pulse 608
space 1660
pulse 589
space 548
pulse 589
space 548
pulse 589
space 1679
pulse 592
space 1677
pulse 590
space 1675
pulse 594
pulse 13407
space 63383
space 40258
pulse 9119
space 2190
pulse 643
pulse 21195
space 121207
space 97010
pulse 9169
space 2141
pulse 688
pulse 22186

このデータの中から、一番最初の

space 16777215

と、後半の

pulse 13407
space 63383
space 40258
pulse 9119
space 2190
pulse 643
pulse 21195
space 121207
space 97010
pulse 9169
space 2141
pulse 688
pulse 22186

の部分は、いらないデータなので削除。

※基本的にpulseから始まり、pulse→space→pulse→・・・と続くので、データの数は必然的に奇数となる。なので、それに当てはまらない部分は余計なデータ。

/etc/lirc/lircd.conf.d/配下に、任意の名前.confでファイルを作成。

$ vi /etc/lirc/lircd.conf.d/tv.conf

ファイルの中身はこんな感じ。

begin remote
 name tv
 flags RAW_CODES
 eps 30
 aeps 100
 gap 200000
 toggle_bit_mask 0x0

 begin raw_codes
 name volup
 9059 4508 632 501 635 506 681 455 682 456 630 505 632 505 584 1684 681
 455 584 1684 584 1684 585 1684 585 1685 640 1581 689 1627 611 524 611 1658 615
 523 615 1655 614 522 615 1655 613 1654 614 524 613 527 609 525 611 1658
 588 549 608 1660 589 548 589 548 589 1679 592 1677 590 1675 594

 name voldown
 9087 4478 609 526 588 550 609 527 588 549 609 526 610 527 608 1659 611
 526 610 1659 608 1658 612 1661 606 1658 608 1660 607 1660 611 526 611 1658 610
 527 609 1659 610 1658 608 1659 609 1662 606 528 608 528 608 530 610 1658
 608 528 608 530 608 526 610 529 608 1658 609 1659 608 1657 610
 end raw_codes
end remote

2行目のnameはファイル名と合わせた方が混乱が少ない。

begin raw_codesの中にname コマンド名を記入し、次の行に信号データのみを羅列。※エディターの置換機能を使えば簡単

赤外線を送信する。

/etc/lirc/lirc_options.confを書き換える。

送信を行うので、lirc0に書き換える。

[lircd]
nodaemon        = False
driver          = default
device          = /dev/lirc0

lircdを起動。

$ sudo service lired start

confの中身にエラーがあれば以下のコマンドでエラーが出力される。

$ sudo systemctl status lircd.service

以下のコマンドで作成したファイルが見えればOK。

$ irsend LIST '' ''

devinput-32
devinput-64
tv

赤外線LEDをテレビに向けて、コマンドを入力する。

$ irsend SEND_ONCE tv volup
$ irsend SEND_ONCE tv voldown

ようやくテレビが反応してくれました。

参考にしたサイト。

https://deviceplus.jp/hobby/entry_y18/

http://yukidfg.jpn.ph/2018/02/23/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%82%92%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%81%AB%E3%81%97%E3%81%A6%E5%AE%B6%E9%9B%BB%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B/

【COCOS2D-X】ステータスを表示

数字は完全にランダムです。

ちょっとゲームらしくなってきたでしょ。

#ifndef PROJ_ANDROID_CHARACTER_H
#define PROJ_ANDROID_CHARACTER_H

#include "cocos2d.h"

class Character {
public:
    int Hp;
    int MaxHp;
    int Mp;
    int MaxMp;
    int Power;
    int Speed;
    int Magic;
public:
    Character();
    ~Character();
};


#endif //PROJ_ANDROID_CHARACTER_H
#include "Character.h"

Character::Character()
{
    MaxHp = cocos2d::random<int>(0, 100);
    MaxMp = cocos2d::random<int>(0, 100);
    Power = cocos2d::random<int>(0, 100);
    Speed = cocos2d::random<int>(0, 100);
    Magic = cocos2d::random<int>(0, 100);
}

Character::~Character()
{

}
#ifndef PROJ_ANDROID_GAMESTATUS_H
#define PROJ_ANDROID_GAMESTATUS_H

#include "cocos2d.h"
#include "Character.h"
#include <list>

class GameStatus {
private:
    static GameStatus *gameStatus;
public:
    std::list<Character*> *Charactors;
private:
    GameStatus();
    ~GameStatus();
public:
    static GameStatus* GetGameData();
    static void Destroy();
};


#endif //PROJ_ANDROID_GAMESTATUS_H
#include "GameStatus.h"

GameStatus *GameStatus::gameStatus = nullptr;

GameStatus::GameStatus()
{
    Charactors = new std::list<Character*>();
    for(int i = 0; i < 4; i++)
    {
        Character *character = new Character();
        Charactors->push_back(character);
    }
}

GameStatus::~GameStatus()
{
    for(Character *character = Charactors->front(); Charactors->empty() == true; character = Charactors->front())
    {
        delete character;
        Charactors->pop_front();
    }
    delete Charactors;
}

GameStatus * GameStatus::GetGameData()
{
    if(gameStatus == nullptr)
    {
        gameStatus = new GameStatus();
    }
    return gameStatus;
}

void GameStatus::Destroy()
{
    delete gameStatus;
}
    // ステータスウィンドウの配置
    auto xpos = (visibleSize.width - sprite->getContentSize().width * scaleRate) / 2.0;
    float windowScale = 0;
    float windowHeight = 0;

    Sprite *charaStatusWindow[4];
    auto chara = GameStatus::GetGameData()->Charactors->begin();
    for(int i = 0; i < 4; i++)
    {
        charaStatusWindow[i] = Sprite::create("btn02_03_s_bl.png");
        if (charaStatusWindow[i] == nullptr)
        {
            problemLoading("'btn02_03_s_bl.png'");
        }
        else
        {
            if(windowScale == 0 || windowHeight == 0)
            {
                windowHeight = charaStatusWindow[i]->getContentSize().height;
                windowScale = (visibleSize.height / 4) / windowHeight;
            }
            charaStatusWindow[i]->setPosition(Vec2(xpos + origin.x,origin.y + windowHeight * i * windowScale));
            charaStatusWindow[i]->setAnchorPoint(Vec2(0,0));
            charaStatusWindow[i]->setScale(windowScale);

            this->addChild(charaStatusWindow[i], 1);
        }

        auto offset = charaStatusWindow[i]->getContentSize().width / 10.0;
        auto hpLabel = Label::createWithTTF("Hello World", "fonts/msgothic.ttc", 12);
        if (hpLabel == nullptr)
        {
            problemLoading("'fonts/msgothic.ttc'");
        }
        else
        {
            hpLabel->setAnchorPoint(Vec2(0, 1));
            hpLabel->setPosition(Vec2(origin.x + xpos + offset, origin.y + windowHeight * (i + 1) * windowScale));

            this->addChild(hpLabel, 2);

            auto hpStr = String();
            hpStr.appendWithFormat("HP : %d", chara.operator*()->MaxHp);
            hpLabel->setString(hpStr.getCString());
        }

        auto MpLabel = Label::createWithTTF("Hello World", "fonts/msgothic.ttc", 12);
        if (MpLabel == nullptr)
        {
            problemLoading("'fonts/msgothic.ttc'");
        }
        else
        {
            MpLabel->setAnchorPoint(Vec2(0, 1));
            MpLabel->setPosition(Vec2(origin.x + xpos + offset, origin.y + windowHeight * (i + 1) * windowScale - hpLabel->getContentSize().height));

            this->addChild(MpLabel, 2);

            auto mpStr = String();
            mpStr.appendWithFormat("MP : %d", chara.operator*()->MaxMp);
            MpLabel->setString(mpStr.getCString());
        }
        chara++;
    }

ウインドウ周りのクラス設計もちゃんと考えないといけないね。

あと、C++のList型は、他のプログラムのList型の様に使用できなくて、ちょっとめんどい。

完全にイテレータパターンのクラスなので、少々扱いづらい。

慣れるしか無いんだけど。

あと、乱数はcocos-2dxに搭載されているものが使用できます。

C++標準の乱数よりも使いやすいです。

【デザインパターン】Singletonパターン

Singletonパターンのコード例です。

package org.example.singleton;

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {

    }

    public static Singleton getInstance() {
        return singleton;
    }

    public void method1() {

    }
}
package org.example.singleton;

public class Main {
    public static void main(String[] args) {
        Singleton obj = Singleton.getInstance();
        obj.method1();
    }
}

Singletonはプログラム上にインスタンスが一つしか存在しない場合に使用されます。

インスタンスの取得はgetInstance()で取得して使用します。

このインスタンスは常に同じもので、一つのインスタンスをみんなで使い回すというイメージですね。

よく使われるパターンです。

【ラズパイ】リモコンの赤外線通信を再現してみる。

まずは、前回のプログラムを元に、以下のようなプログラムを作成しました。

import RPi.GPIO as GPIO
import time

def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21,GPIO.IN)
    try:
        while True:
            out = GPIO.input(21)
            if out == 0:
                print(1)
            else:
                print(0)
            time.sleep(0.0001)
    except KeyboardInterrupt:
        GPIO.cleanup()

__main__()

0.1ミリ秒周期で赤外線通信の受信信号を読み取って、0/1で出力するプログラムを作成してみました。

これを使用して、テレビのボリュームUP/DOWNの信号を読み取って、

こんなプログラムを作成して、赤外線LEDを点灯させるプログラムを作成。

import RPi.GPIO as GPIO
import time

pattern = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,
           0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
           1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1]


def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(20,GPIO.OUT)
    try:
        for out in pattern:
            GPIO.output(20, GPIO.HIGH)
            time.sleep(0.0001)
        GPIO.output(20, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()
    GPIO.cleanup()

__main__()

import RPi.GPIO as GPIO
import time

pattern = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
           0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,
           0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
           0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,
           1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1]


def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(20,GPIO.OUT)
    try:
        for out in pattern:
            GPIO.output(20, GPIO.HIGH)
            time.sleep(0.0001)
        GPIO.output(20, GPIO.LOW)
    except KeyboardInterrupt:
        GPIO.cleanup()
    GPIO.cleanup()

__main__()

これで、リモコンの信号を再現できるはず!

そう思っていましたが、

テレビは何も反応しませんでした。

やっぱり考えは甘かったか。

そこで、ネットの情報を探してみると、

こんなサイトを見つけました。

https://deviceplus.jp/hobby/entry_y18/

リモコンの信号を読み取って、再現するライブラリがラズパイにあるらしい。

しかも、このサイトの中では、音声でテレビをコントロールしようともしている。

ならばこっちは、最終的にAlexaでコントロールできるようにしてしまおうか。

できるよね?

知らんけど。

いろいろ調べてみる。

【ダイエット支援】【入力履歴機能】管理者アカウントを登録

残りは管理者画面を管理者以外アクセスできないようにする対処を入れます。

まずは、管理者アカウントを登録。

<?php

use Illuminate\Database\Seeder;

class ManagerAccountSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert(['name' => 'manager', 'email' => 'manage@gmail.com', 'password' => bcrypt('manager')]);
    }
}

実際運用するときはもちろん値書き換えるよ。

あとは、このアカウント以外は管理者画面に入れないようにする。

class MaintenanceController extends Controller
{
    public function index()
    {
        if(Auth::user()->email == 'manage@gmail.com') {
            return view('maintenance');
        }else{
            return redirect('/home');
        }
    }
}

管理者以外は/homeにリダイレクトさせています。

まぁ、管理者は一人しかいないから、権限管理とかは使用せずに決め打ちでいいかと思います。

できれば一箇所変更すれば対応できるようにしたかったけど、うまい方法が見つからなかった。

WordPressに記事をコマンドラインから投稿する。

ブラウザで無くても投稿することができれば、自動化できるんじゃないかって思って。

手段を調べてみると、コマンドラインから投稿できるwp-cliと、リモートから投稿できるREST APIがあるらしいけど、

今回は簡単なwp-cliを使用してみました。

さすがに本番環境で試すのは勇気がいるので、あらかじめローカルのテスト環境で試してみてます。

Hyper-Vの仮想環境があれば簡単にサーバを構築できます。

とはいっても、インスタンス作成してからWordPressが動くまでに1日かかりましたが。

wp-cliのインストール

こちらの記事を参考にしました。

https://knowledge.cpi.ad.jp/cms/wordpresswp-cli2/

https://wp-cli.org/ja/

WordPressを設置しているディレクトリで以下のコマンドを実行。

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

wp-cli.pharというファイルがダウンロードできるので、それがWordPressのディレクトリにあればOK。

WordPressに記事を投稿するコマンド

$ php wp-cli.phar post create --post_status=publish --post_auther=1 --post_category=2 --post_title=<タイトル> --post_content=<記事の本文> 

まぁ、オプションの順番はどうだっていいのですが。

–post_status

publishにすると記事は公開状態になります。

draftにすると下書き状態になります。

post_auther

投稿者IDを指定します。

投稿者IDは以下のコマンドで投稿者一覧を表示するとわかります。

$ php wp-cli.phar user list

–post_category

カテゴリIDを指定します。

カテゴリIDは以下のコマンドでカテゴリ一覧を表示するとわかります。

$ php wp-cli.phar term list category

【デザインパターン】Prototypeパターン

Prototypeパターンのコート例です。

package org.example.prototype;

import java.io.Closeable;

public interface Prototype extends Cloneable {
    public void method1();
    public void method2();
    public Prototype createClone();
}
package org.example.prototype;

import java.io.IOException;

public class ConcretePrototype implements Prototype {
    public ConcretePrototype() {
        super();
    }

    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }

    @Override
    public Prototype createClone() {
        Prototype prototype = null;

        try {
            prototype = (Prototype)clone();
        }catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototype;
    }
}
package org.example.prototype;

public class Main {
    public static void main(String[] args){
        Prototype PrototypeObject = new ConcretePrototype();
        Prototype cloneObject = PrototypeObject.createClone();
        cloneObject.method1();
        cloneObject.method2();
    }
}

Prototypeインターフェースを実装したConcretePrototypeを作成し、以後、createClone()メソッドを使用して複製したものを使用する、という使い方をします。

Cloneableを実装しないとClone()実行時にCloneNotSupportedExceptionが発生するみたいです。

これ、Java以外にもC#とかにも無いっすかね?

※C#ではICloneableを実装すると使えるみたいです。

あと、Cloneは参照型のメンバーがいた場合、複製したObjectも複製前と同じ参照先を参照するらしいです。

完全に複製するには、CloneをOverrideして、参照型のメンバーをさらにCloneする、というやり方が必要になるようです。

Cloneを使用する場合はその当たり気をつけないといけないですね。

【北海道大戦】リソースファイルをパッケージ化

使用しているライブラリ、Altseedには、リソースファイルを一つのファイルにパッケージ化するツールが用意されていて、

これを使えば、大量のファイルでかさばることもないし、勝手にデータを書き換えることもできなくなります。

使用する場合は、こんな感じでエンジンに登録するだけ。

            asd.Engine.File.AddRootPackage("hokkaido.pack");

で、フォントやテクスチャ画像は、ソースを変更する必要は無いのですが、

マップデータを記述しているjsonファイルは標準機能で読み出しているので、

これに関してはちょっと細工が必要になります。

        private const string _filename = "hokkaido.json";
        public static MapData Load()
        {
            string str = string.Empty;
            asd.StreamFile stream = asd.Engine.File.CreateStreamFile(_filename);
            List<byte> buffer = new List<byte>();
            stream.Read(buffer, stream.Size);
            string json = Encoding.UTF8.GetString(buffer.ToArray());
            return JsonConvert.DeserializeObject<MapData>(json);
        }

CreateStreamFileでjsonファイルを取り出し、

readメソッドでデータをバイトのリストで取得。

これをjsonに変換するには、さらにbyte配列に変換して、文字列に変換して

これでようやくjsonからオブジェクトに変換出来ます。

めんどくさい。

でも、これだけで動いたからまだマシな方だと思うけど。

【ラズパイ】リモコンの赤外線を受信してみる。

赤外線受信モジュールの出力をGPIO21番に接続し、

以下の様にプログラムを組んでみました。

import RPi.GPIO as GPIO
import time
import datetime

def __main__():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(21,GPIO.IN)
    GPIO.add_event_detect(21, GPIO.BOTH, callback=callback)
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        GPIO.cleanup()

def callback(channel):
    print(str(GPIO.input(21)) + " " + datetime.datetime.now().isoformat())

__main__()

GPIO21の信号が変わったタイミングで割り込みを発生し、そのときの出力値と時間を標準出力で表示させます。

ただ、このテレビのリモコン、電源ボタンを押しっぱなしにしないと信号が出ないみたいで、

で、なおかつ、押しっぱなしにすると信号が出続けるもので。

0 2020-11-24T10:14:30.712150
1 2020-11-24T10:14:30.718138
0 2020-11-24T10:14:30.765131
1 2020-11-24T10:14:30.765352
0 2020-11-24T10:14:30.804348
1 2020-11-24T10:14:30.812659
0 2020-11-24T10:14:30.817313
1 2020-11-24T10:14:30.817765
0 2020-11-24T10:14:30.818497
1 2020-11-24T10:14:30.818897
0 2020-11-24T10:14:30.819593
1 2020-11-24T10:14:30.820053
0 2020-11-24T10:14:30.820533
1 2020-11-24T10:14:30.821233
0 2020-11-24T10:14:30.821634
1 2020-11-24T10:14:30.822347
0 2020-11-24T10:14:30.822964
1 2020-11-24T10:14:30.823503
0 2020-11-24T10:14:30.824101
1 2020-11-24T10:14:30.824575
0 2020-11-24T10:14:30.826361
1 2020-11-24T10:14:30.826822
0 2020-11-24T10:14:30.827364
1 2020-11-24T10:14:30.827968
0 2020-11-24T10:14:30.829730
1 2020-11-24T10:14:30.830241
0 2020-11-24T10:14:30.832033
1 2020-11-24T10:14:30.832501
0 2020-11-24T10:14:30.834314
1 2020-11-24T10:14:30.834766
0 2020-11-24T10:14:30.836554
1 2020-11-24T10:14:30.837033
0 2020-11-24T10:14:30.838794
1 2020-11-24T10:14:30.839353
0 2020-11-24T10:14:30.841086
1 2020-11-24T10:14:30.841601
0 2020-11-24T10:14:30.842042
1 2020-11-24T10:14:30.842722
0 2020-11-24T10:14:30.844382
1 2020-11-24T10:14:30.845010
0 2020-11-24T10:14:30.845743
1 2020-11-24T10:14:30.846213
0 2020-11-24T10:14:30.847861
1 2020-11-24T10:14:30.848455
0 2020-11-24T10:14:30.849055
1 2020-11-24T10:14:30.849573
0 2020-11-24T10:14:30.850183
1 2020-11-24T10:14:30.850725
0 2020-11-24T10:14:30.852405
1 2020-11-24T10:14:30.852972
0 2020-11-24T10:14:30.853503
1 2020-11-24T10:14:30.854129
0 2020-11-24T10:14:30.854628
1 2020-11-24T10:14:30.855277
0 2020-11-24T10:14:30.855717
1 2020-11-24T10:14:30.856376
0 2020-11-24T10:14:30.858106
1 2020-11-24T10:14:30.858635
0 2020-11-24T10:14:30.859222
1 2020-11-24T10:14:30.859775
0 2020-11-24T10:14:30.861550
1 2020-11-24T10:14:30.862049
0 2020-11-24T10:14:30.863799
1 2020-11-24T10:14:30.864357
0 2020-11-24T10:14:30.864821
1 2020-11-24T10:14:30.865492
0 2020-11-24T10:14:30.867127
1 2020-11-24T10:14:30.867739
0 2020-11-24T10:14:30.869522
1 2020-11-24T10:14:30.870102
0 2020-11-24T10:14:30.871770
1 2020-11-24T10:14:30.872296
0 2020-11-24T10:14:30.912677
1 2020-11-24T10:14:30.921864
0 2020-11-24T10:14:30.923867
1 2020-11-24T10:14:30.924497
0 2020-11-24T10:14:30.972354
1 2020-11-24T10:14:30.981305
0 2020-11-24T10:14:30.985768
1 2020-11-24T10:14:30.986297
0 2020-11-24T10:14:30.986901
1 2020-11-24T10:14:30.987434
0 2020-11-24T10:14:30.987902
1 2020-11-24T10:14:30.988581
0 2020-11-24T10:14:30.989105
1 2020-11-24T10:14:30.989750
0 2020-11-24T10:14:30.990292
1 2020-11-24T10:14:30.990898
0 2020-11-24T10:14:30.991490
1 2020-11-24T10:14:30.992017
0 2020-11-24T10:14:30.992618
1 2020-11-24T10:14:30.993143
0 2020-11-24T10:14:30.994968
1 2020-11-24T10:14:30.995415
0 2020-11-24T10:14:30.995996
1 2020-11-24T10:14:30.996558
0 2020-11-24T10:14:30.998247
1 2020-11-24T10:14:30.998835
0 2020-11-24T10:14:31.000531
1 2020-11-24T10:14:31.001089
0 2020-11-24T10:14:31.002897
1 2020-11-24T10:14:31.003358
0 2020-11-24T10:14:31.005463
1 2020-11-24T10:14:31.005794
0 2020-11-24T10:14:31.007627
1 2020-11-24T10:14:31.007885
0 2020-11-24T10:14:31.009823
1 2020-11-24T10:14:31.010188
0 2020-11-24T10:14:31.010786
1 2020-11-24T10:14:31.011313
0 2020-11-24T10:14:31.013177
1 2020-11-24T10:14:31.013577
0 2020-11-24T10:14:31.014196
1 2020-11-24T10:14:31.014723
0 2020-11-24T10:14:31.016505
1 2020-11-24T10:14:31.016988
0 2020-11-24T10:14:31.017615
1 2020-11-24T10:14:31.018132
0 2020-11-24T10:14:31.018801
1 2020-11-24T10:14:31.019244
0 2020-11-24T10:14:31.021049
1 2020-11-24T10:14:31.021532
0 2020-11-24T10:14:31.022264
1 2020-11-24T10:14:31.022711
0 2020-11-24T10:14:31.023231
1 2020-11-24T10:14:31.023825
0 2020-11-24T10:14:31.024497
1 2020-11-24T10:14:31.024954
0 2020-11-24T10:14:31.026808
1 2020-11-24T10:14:31.027232
0 2020-11-24T10:14:31.027891
1 2020-11-24T10:14:31.028356
0 2020-11-24T10:14:31.030251
1 2020-11-24T10:14:31.030616
0 2020-11-24T10:14:31.032629
1 2020-11-24T10:14:31.032920
0 2020-11-24T10:14:31.033644
1 2020-11-24T10:14:31.034099
0 2020-11-24T10:14:31.035998
1 2020-11-24T10:14:31.036321
0 2020-11-24T10:14:31.038409
1 2020-11-24T10:14:31.038591
0 2020-11-24T10:14:31.040637
1 2020-11-24T10:14:31.040889
0 2020-11-24T10:14:31.085001
1 2020-11-24T10:14:31.090315
0 2020-11-24T10:14:31.142103
1 2020-11-24T10:14:31.143617
0 2020-11-24T10:14:31.317687
1 2020-11-24T10:14:31.317986
0 2020-11-24T10:14:31.320925
1 2020-11-24T10:14:31.321246
0 2020-11-24T10:14:31.321999
1 2020-11-24T10:14:31.322382
0 2020-11-24T10:14:31.324284
1 2020-11-24T10:14:31.324646
0 2020-11-24T10:14:31.325373
1 2020-11-24T10:14:31.325785
0 2020-11-24T10:14:31.326453
1 2020-11-24T10:14:31.326927
0 2020-11-24T10:14:31.327589
1 2020-11-24T10:14:31.328064
0 2020-11-24T10:14:31.329898
1 2020-11-24T10:14:31.330335
0 2020-11-24T10:14:31.330809
1 2020-11-24T10:14:31.331572
0 2020-11-24T10:14:31.333278
1 2020-11-24T10:14:31.333753
0 2020-11-24T10:14:31.335543
1 2020-11-24T10:14:31.336043
0 2020-11-24T10:14:31.336674
1 2020-11-24T10:14:31.337190
0 2020-11-24T10:14:31.338941
1 2020-11-24T10:14:31.339489
0 2020-11-24T10:14:31.341160
1 2020-11-24T10:14:31.341743
0 2020-11-24T10:14:31.343484
1 2020-11-24T10:14:31.343990

たぶん、この中に電源の信号パターンがあり、繰り返し送信されているものかと。

それと、この信号を再現させるために、大体0.1ミリ秒ごとに0/1のパターンデータを作成して、送信するっていう形の方が良いのかな。

ちょっとこれを元に考えてみます。