yukuro’s blog

ぽえむ日記

アマチュア無線局免許状が届いた

免許状が届いた

11月9日、無線局免許状が届いた。

初めての開局申請だったので、免許状に書いてあるコールサインを見たときは心が躍った

目的

  • 今回取得した無線局免許状は5.6GHz帯のものであり取得した目的は以下の通り
    • FPV用の5.6GHzVTXを使ってリアルタイムで映像を伝送する
    • (ただ単純に自分の無線局(とコールサイン)が欲しかった...)

取得までの流れ

  • 8月17日 3アマに受かる
  • 8月18日 総務省 電波利用 電子申請・届出システム LiteにユーザーID申請する
  • 8月23日 ユーザーIDが郵送されてくる
  • 9月1日 VTX(Tramp-HV)を注文(HobbyNetで注文したため、系統図がついてきた)
  • 9月23日 ついてきた系統図をもとにJARDに保証申請する
  • 9月27日 JARDから保証完了の連絡が届く
  • 9月29日 保証書と共に電子申請・届出システム Liteに開局申請する
  • 10月18日 電子申請・届出システム Liteから電子納付手続きの連絡が届く
  • 10月25日 電子納付手続きをする
  • 11月9日 無線局免許状が届く
  • 11月11日 審査が終了したとのメールが届く

所感

  • 実質、かかった期間は1ヶ月半ほど
    • 途中、支払いが面倒になったり、申請の入力作業が面倒になったりして、ダラダラしていた
  • JARDの保証は早いと聞いていたけれど、まさか4日で完了するとは思っていなかった
    • TSSも一瞬検討したが「電話しないと申請が進まない」みたいなレビューがあったのでやめておいた
  • 一番長かったのは総務省 電子申請・届出システム Liteでの申請期間で1ヶ月ぐらい

まとめ

  • 無線局免許状が届いたので5.6GHzVTX頑張る
    • 頑張ると言っても映像の伝送だけだと送信機/受信機を買うだけなわけだが...
  • コールサインを得たので他の周波数帯(144MHz帯とか)もとりたいなぁ...

キーボードブリッジを自作した

事の始まり

ノートPCで使いたい

  • メインがノートPCなので、尊師スタイルのように*1して使いたい
  • 尊師スタイルをするためのキーボードブリッジはPFUダイレクトで販売されている
    • 当然ながら、これはHHKB向けの製品
    • Keychron K2はHHKBより一回り大きいので合わなそう

自作する

  • ちょうど大学にレーザープリンターが置いてあったので自作することにした

    1. アクリル板の調達

      • 材料のアクリル板は大学を通じてMISUMI-VONAに発注した。
      • 失敗することを見越して大きめのサイズで発注したが、代金は1840円ほど。
    2. 加工

    3. 加工後

      • 出力が強すぎて、保護カバー(?)の紙が焦げ付いてアクリルとくっついてしまった

完成

感想

  • PFUダイレクトのキーボードブリッジよりも半額以下で自作できた
  • トラックパッドの部分を避けて作れるなど、自作ならではの部分があったので満足

余談

*1:厳密には尊師スタイルはノートPCの上にHHKBを置いて使うことらしい

FDM方式3Dプリンターで作った造形物の積層痕消しの検証

積層痕消したい

方法

  • テストピース(PLA)の積層痕が目立つ部分にアクリサンデーとポリパテを塗り、24時間後の変化を観察する

アクリサンデー

  • まず、アクリサンデーを用いる方式

所感

  • 結構多めに塗るとPLAがドロドロとしてきて溶けていることが確認できた。
    • が、ドロドロしている分、平面にすることが難しい
  • 乾燥後は特に臭いはせず、触るとすべすべ

ポリパテ

  • 次にポリエステルパテを用いる方式(ポリパテはタミヤのポリパテを用いた)

所感

  • 適度に粘性があって塗るというより、盛るといったことが可能
  • 盛った箇所にきちんと色がつくので、サフを吹かなくても大体修正できる
  • 乾燥後は紙粘土に似た独特な臭いがして、(表面処理云々によるんだろうが)触ると粉っぽく感じる

まとめ

  • 個人的にはアクリサンデーよりもポリパテのほうが扱いやすく感じた
    • ポリパテのほうが盛れるので量の調整が効きやすい
    • アクリサンデーだと曲面に塗るときに流れて行ってしまう
  • 積層痕を消す能力に関しては両者とも同等ぐらい
    • だが、アクリサンデーだと透明なので消えたor消えないがわかりにくいかも

Slackは見ないけどLineは見る人向けSlack App(Event API使用)を作った

概要

  • 「Slackは見ないけど、Lineは見る」という謎の論理を持った人のためにSlackでメッセージを飛ばしたらLineで通知が入るようにした
  • サクッと作れると思ったら、Outgoing Webhookはlegacyとか言われたのでEvent APIを使って作った

前置き

手順

  1. GAS(Google App Script)の設定

  2. Slack Appを作る

    1. Slack API: Applications | Slack からCreate New Appして設定する
      • App Nameには適当な名前を、Development Slack WorkspaceにはSlackで通知させたいワークスペースを選ぶ
    2. Install Appする
      f:id:kuroblo039:20190426185715p:plain
      • 許可云々が出てくるので自分の主義に見合ったら許可
    3. Event Subscriptionsでいろいろ設定
      f:id:kuroblo039:20190426185934p:plain
      • Request URLには控えておいたGASのURLを入力
      • 入力してVerifiedになったら、Subscribe to Workspace Eventsでmessage.channelsを選択する
  3. GASのコードを書き換える

    • 先ほどのAPIの認証が終わったら以下のコードに書き換える
function doPost(e) {
   var params = JSON.parse(e.postData.getDataAsString());
   logging(params);
   
   var api_app_id = PropertiesService.getScriptProperties().getProperty('API_APP_ID');
   var received_app_id = params.api_app_id;

   //APPIDが一致しているか
   if(received_app_id != api_app_id)
   {return;}

   //各種情報
   var postype = params.event.type;
   var postext = params.event.text;
   logging(postext.slice(0,5));
   if(postype == 'message' && postext.slice(0,5) == '@line'){
     var msg = "LINEにも通知したい投稿がSlack上に投稿されました。\n各自「必ず」確認してください。\n内容 : "+ postext;
     send(msg);
   }
}

function send(message)
{
  //lineのほうのトークン
  var token = PropertiesService.getScriptProperties().getProperty('LINE_ACCESS_TOKEN');

  var op =
      {
        "method" : "post",
        "payload": "message=" + message,
        "headers":{"Authorization" : "Bearer " + token}
      };
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
}

//GAS当てにrequestが飛ぶと、スプレッドシートに飛んできたjsonが保存される
function logging(str) {
  var id = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID'), 
      sheet = SpreadsheetApp.openById(id).getActiveSheet(),
      ts    = new Date().toLocaleString('japanese', {timeZone: 'Asia/Osaka'});
  sheet.appendRow([ts, str]);
}


* SPREADSHEET_IDは作成したスプレッドシートのURLの後にくっついてるもの(https://docs.google.com/spreadsheets/d/XXXXX のXXXXX)
* API_APP_IDはSlack API設定ページのBasic Informationにある
* LINE_ACCESS_TOKENに関しては後述

  1. Line Notifyを設定する
    1. Line Notify にLineのアカウントでログインしてマイページに進む
    2. Tokenを取得する
      f:id:kuroblo039:20190426193752p:plain
    3. 出てきたTokenを先ほどのGASのプロパティに設定する

動かしてみる

  • Slack上の任意のチャンネルで「@line」をつけてメッセージを送ると、Line Notifyから何かしらのメッセージが来ているはずです
    f:id:kuroblo039:20190426200027p:plain

トラブルシューティング(動かないときは)

  • Google Drive上に置いてあるスプレッドシートでログを確認し、Slackからjsonが送られているか、jsonをparseできているか等を確認する
  • GAS上で上記の function send(message) のみを動かしてLine Notifyから通知が来るか確認する
    • 通知が来ると [ トークン名 ] undefined の形で表示される

思ったこと

  • 以外に簡単にできる(Line Notifyが使えない頃は通知のためだけにチャットボットを作っていたので)
  • これでSlackを見ないという可能性は排除できたので、それでも見ないなら、その団体に興味がないということかもしれない

センサ:トラブルシューティング

  • 幾つかのセンサを触ったのでそれぞれのトラブルシューティングを書く

    MPU6050

  • 使用センサ
  • 使用ライブラリ
  • 原因
    • センサ値を格納するバッファがいっぱいになってバッファがオーバーフローする
    • 大半の場合、ループの中のDelayが大きすぎてバッファが大きくなってしまっている
  • 解決策
    • センサ値を取得するループの中で使用しているDelayを無くすor少なくする
    • センサ値を格納するバッファのサイズを大きくする(あまり効果ないかも...)
    • resetFIFOする
MPU6050 mpu;
mpu.resetFIFO();

Exampleの中でDMP ready! Waiting for first interrupt...で止まる

  • 原因
    • INTERRUPT_PINで指定したピンが接続されていない
  • 解決策
    • INTERRUPT_PINで指定したピンがセンサ及びマイコンボードに挿さっているか確認する

BMP280

GPS

送信されてきたデータが途切れ途切れになる

$GPGGA,084$GPGGA083$GPGGA083$GPGGA083...
  • 原因
    • 観測データを取得するループの中でDelayをして受信バッファがオーバーフローしている
    • 使用したセンサは計測をやめる処理をできないものだったので、受信バッファに観測データが止めどなくたまり続けた
  • 解決策
    • 受信バッファに何もなくなるまでwhileでDelayなしで観測データを受信する

ESP32を触ってわかったこと

  • 今回、Esp32に触れる機会があったので色々調べた&試した結果を備忘録&ロステク防止のために書いておく

デュアルコア

  • Esp32はデュアルコアを搭載しており、FreeRTOSの一部のAPIが使える
  • Esp32でデュアルコアのタスクを生成させるにはxTaskCreatePinnedToCoreを宣言する必要がある
BaseType_t xTaskCreatePinnedToCore(
        TaskFunction_t pxTaskCode,          
        const char * const pcName,           
        const uint16_t usStackDepth,          
        void * const pvParameters,            
        UBaseType_t uxPriority,             
        TaskHandle_t * const pxCreatedTask,    
        const BaseType_t xCoreID               
    );
  • 各引数に関して
xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
  1. pxTaskCode

    • タスクのポインタ
  2. pcName

    • タスク名。デバッグの時に使う
    • 最大長はconfigMAX_TASK_NAME_LENに定義されているが、デフォルトでは16。
  3. usStackDepth

    • スタックメモリサイズ。(byte数で指定)
    • 8192byteが推奨
  4. pvParameters

    • タスク関数に渡す引数
    • 多くのサイトではNULLとなっている
  5. uxPriority

    • タスクの優先度(1~25で指定)(1は最も高く、25が最も低い)
    • setup()とloop()は1になっている
  6. pxCreatedTask

    • タスクハンドルポインタ(作成したタスクを参照するためのハンドルを返す)
    • TaskHandle_t型の引数を定義して、そのアドレスを指定
  7. xCoreID

    • CPUのコア番号
    • Esp32-DevkitCの場合はデュアルコアなので0か1を指定する
    • CPU0ではシステムタスク(システムの基幹に関わるタスク)を行っている
  8. xTaskCreatePinnedToCoreを宣言した時点でそのタスクは始まるので、loop()を2つ置きたいとかの用途ならsetup()の最後に置くのがよさそう

vTaskDelay

  • vTaskDelayは指定チック数分だけそのタスクを遅延させ、他のタスクをその間に実行する
  • xTaskCreatePinnedToCoreuxPriorityで同じ優先度を指定するとそれらのタスクは交互に実行される
  • ある処理にかかるティック数は次の通りで確認できる
TickType_t starttick = xTaskGetTickCount(); 
/*
hogehoge
*/
TickType_t endtick = xTaskGetTickCount(); 
TickType_t executiontick = endtick - starttick;
  • 今回試してみたところ、ティック数は常に一定でもなかったので、↑のexecutiontick×2ぐらいの気持ちで指定するとよさそう
  • 尚、これをタスクに入れないとウォッチドッグタイマ(WDT)が介入できずcore~'s panicになってEsp32が再起動するので注意
  • なので遅延の必要が特にない場合はvTaskDelay(1)をそれぞれのタスクに入れておくとよさそう

GPIO

  • パっと見るとEsp32のGPIOは豊富にあるように見えるが、実際のところ色々な制約があり、思ったほど自由ではないというのが個人的な印象。
  • Esp32のGPIOのピンアサインについては以下のスイッチサイエンスさんの記事が詳しいかと思います
  • 個人的にハマったところをまとめていく
  • GPIO6 ~ 11は入力ピンとして使いずらい
    • GPIO6~11は内蔵Flashと接続されているらしく、Esp32の起動時にHighだと以下のようなエラーを吐いて起動しない cpp flash read err, 1000 ets_main.c 371 ...
  • GPIO0,2はブートモードの設定に使われるので使わない

UART

  • Esp32にはUART0~2の3つのUARTがある
  • UART0はPCとのシリアル通信に使われる
  • UART1は(RX,TX = 9,10)、UART2は(RX,TX = 16,17)がデフォルトで使用可能だが、WROOM32ではUART1のデフォルトが使用不可なため、以下のようにする必要がある。
HardwareSerial HOGEHOGE(1);
HOGEHOGE.begin(115200, SERIAL_8N1, 18, 19);
  • 注意
    • UART1を使用する場合、HardwareSerial HOGEHOGE(1)か、Serial1のように宣言する必要がある。
    • HardwareSerial Serial1と宣言すると cpp error: conflicting declaration 'HardwareSerial Serial1' とのエラーを吐かれる

Tips

センサ値をコア間で共有する

  • センサ値をコア間で共有して何かの処理を行いたいとき、2つの方策が考えられる
    1. センサ値をグローバル変数にする
      • センサ値が連続で続く場合、一つの値しか共有できないのであまり使いたくない
    2. センサ値をキューに格納して各コアでキューからセンサ値を出す
      • この方法なら連続的なデータでも取得できる
/* setup内 */
QueueHandle_t queue_magnitude;
queue_magnitude = xQueueCreate(512, sizeof(double));

/* CPU0(センサ値取得側) */
double magnitude;
BaseType_t data_magnitude = xQueueSend(queue_magnitude, &magnitude, 0);

/* CPU1(センサ値を使って何かする側) */
double magnitude;
BaseType_t data_magnitude = xQueueReceive(queue_magnitude, &magnitude, 0);

参考文献

TUCTF2018 Writeup

TUCTF2018 Writeup

今回解けたのは4問

Misc

Literal

問題のサイトに行くとWikipediaにリダイレクトされるので、Chrome Developper tool > Network > Preserve log にチェックを入れてリロード。
すると、Literal.htmlが見えるので、chromeのタブでview-source:(URL)/Literal.htmlでソースを見るとウサギ(?)のコメントが見える。
(ここは何を基準に基準にすればいいのかわからなかったけれど)Python使って余計な文字(重複する文字とか)を消した。

APL

WikipediaによるとAPLとは昔のプログラミング言語らしい。
そこでこんなサイトを見つけたので実行してみた。
https://tryapl.org/

2行を実行した後は a と打つだけで中身が見える。
中身はAsciiコードになっているので、それらを変換した。

Web

Colonel Mustard's Simple Signin

usernameにsqlインジェクション

' or 1=1 --

を仕掛けると出てくる。

Mrs. White's Messy Maids

コメントに

<!-- I might kill if I could find him. Stupid Mr. /Boddy -->

とある。
Mr.の後に/があり、違和感があったので(URL)/Boddyにアクセスしたら出来た。