memorandums

日々の作業ログです。

「ジョブカン」コントローラの無線化

背景

大学の勤怠管理としてジョブカンというWebサービスが試験運用中です.出退勤時にWebページを開くのをちょくちょく忘れてしまうのでオリジナルコントローラを何となく作ってみたという記事を以前に書きました.

memorandums.hatenablog.com

コントローラが部屋内にあるので目につくため出勤時・退勤時の忘れは激減しました.それでも出勤直後から会議があったり帰りのバスが迫ってすぐに部屋を出なければならないときなど忘れてしまうことがありました.

実はコントローラを置いている場所がPCの設置場所の都合で部屋の隅なんですが,ランプが光っていても目につかないこともあってできたら部屋の入口付近に置きたいな...とずっと思っていました.

でも,PCを置く場所はないし...コントローラくらいは置く場所があるので無線化できればなんとかなるな...と以前から思ってはいたんですね.で,後期の試験も終わり少し時間が空いたので昨晩作ってみたという記事になります.

無線化

上記で作成したジョブカンコントローラはArduino Nano(中華製)で動作していました.なので,無線機能は搭載されていません.他のマイコンに置き換える必要があるな...とobnizとかM5 Stackとか部屋にあるもので簡単にできないか探っていたのですが,一番簡単そうなのがESP32 Developerでした.これも以前,何かのために購入していたものでした.WifiBluetoothもありますが,今回はPC側でWeb Serialを使っているのでBluetoothを使いました.

ESP32でBluetooth接続で動かした以下の記事を見つけてすぐに動作したのが採用の理由です.ありがとうございます.ほんと,こういう情報提供は嬉しいです.感謝っす.

toyoshi.hatenablog.com

あまり時間がないので簡単に書きます.すいません.

Arduino NanoのコードをそのままESP32に置き換えようとしたのですが,ゲームボタン?を点灯するには5Vが必要になりまして,ESP32のdititalWriteでは3.3Vまでしか出ないということがわかりました.そういえば内部電圧が違ったのでした...昇圧ICを買ってきて...とも思いましたが,面倒だったので,Arduino Nanoはそのままにして,ボタンが押されたときにBluetoothを送る仕事だけESP32に委譲することにしました.プチ贅沢ですが...

回路図書いている時間がないので...申し訳ないですが写真だけ.

見えないと思いますので要点だけ書きます.

Arduino Nano

  • ボタンSWのLED⇒D2
  • ボタンSWの+側⇒D3
  • ボタンSWのGND⇒GND
  • 圧電SP⇒D6とGND
  • ESP32へボタンSWが押されたことを通知する(HIGH/LOW)⇒D4

ESP32

やっつけコードですが一応挙げておきます.

Arduino Nano

bool blinking = false;
int lamp = LOW;
long pre_time = 0;
bool send_flag = false;

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, OUTPUT); //ESP32連携用
  delay(500); //すぐ実行するとスイッチが押されたことになる
}

void loop() {
  //detecting pushing button  
  if (digitalRead(3) == LOW) {
    if (send_flag == false) {
      digitalWrite(4, HIGH);    
      blinking = !blinking;
      if (blinking == true) {
        Serial.println("I");
        beep_in();
      } else {
        Serial.println("I");
        beep_out();
        lamp = LOW;
      }
      send_flag = true;
    }
  } else {
    digitalWrite(4, LOW); 
    send_flag = false;
  }

  //make blinking a lamp
  if (blinking) {
    if (millis() - pre_time > 300) {
      lamp = !lamp;
      pre_time = millis();
    }
  }
  digitalWrite(2, lamp);

  delay(100);
}

void beep_in() {
  tone(6, 1500);
  delay(50);  
  noTone(6);
  delay(50);  
  tone(6, 1500);
  delay(50);  
  noTone(6);
  delay(50);  
  tone(6, 2000);
  delay(300); 
  noTone(6); 
}

void beep_out() {
  tone(6, 2000);
  delay(50);  
  noTone(6);
  delay(50);  
  tone(6, 2000);
  delay(50);  
  noTone(6);
  delay(50);  
  tone(6, 1500);
  delay(300); 
  noTone(6); 
}

ESP32

#include <Arduino.h>
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

#define BTN_SW 12

bool send_flag = false;

void setup() {
  SerialBT.begin("JOBCAN");
  pinMode(BTN_SW, INPUT);
  delay(500); //すぐ実行するとスイッチが押されたことになる  
}

void loop() {
  if (digitalRead(BTN_SW) == HIGH) {
    if (send_flag == false) {
      SerialBT.println("I");
      send_flag = true;
    }
  } else {
    send_flag = false;
  }
  
  delay(100);
}

動かしているところを撮影しました.コントローラを隣においていますが,もちろんBluetoothで接続しているので離れた場所でも動作します.これ嬉しい.

youtu.be

今回やってみて,シリアル通信の無線化はできることはわかっていたけど実際にはやったことなかったんですね...これまで研究室でオリジナルゲームコントローラの制作をしてきたのですがいずれの有線でした.無線対応は簡単にできるな...ということが気づきです.でも,Unity側はどうなるのかな...やってみないとわからないな.また今度.

RubyでファイルにHashを出力しておくとあとで戻すときに簡単と思っていた ⇒ 間違い

背景

研究用ツールで途中結果をRubyのHashを文字列化して出力していました.以下のような感じ(1行だけ).

[{"s"=>"b22/fcbbdb25faf312a2e7a720ed878259e39f371be5", "a"=>"b21/e34c6c9c71e5b6a76bc7efed9d78a681e8817eff", "v"=>{"d"=>4836, "o"=>1}}]

別のツールでこれを読み込んでHashとして使うのに特別なことはしなくてよいと勘違いしていました...

例えば,上の文字列をgets.chompで読み込んで,そのままHash化できると勝手に思っていました.ChatGPTに聞くとto_hってあるから使えよって返事が返ってきましたがそんなメソッドはないとのこと.

調べると以下の記事が見つかりました.色々と方法があるようですが,標準でjsonのパーサがあるのでそれを使うといいよということ.

stackoverflow.com

ただ,JSONでは「key : value」で,RubyのHashは「key => value」なので置換するのに「gsub('=>', ':')」を使う必要があるよってことでした.

コード

上記の文字列を想定して処理するコードは以下のようになります.余計な文字列をsplit処理するコードもついていますが,まぁ何かの役にたてば.

require 'json'

while line = gets
  h = JSON.parse line.gsub('=>', ':')
  puts "#{h[0]['s'].split('/')[1]}\t#{h[0]['a'].split('/')[1]}\t#{h[0]['v']['d']}\t#{h[0]['v']['o']}"
end

結論

RubyのHashオブジェクトをファイルに保存するときにはString形式ではなくJSON形式にしておけばgsubしなくてよいよ.

でわ!

Excelで累積値を求める方法(意外と知らない人いるんじゃないかな・・・ということで書いてみた)

背景

大学の近くにある看護大学校で看護研究の授業を担当させていただいています.2013年からですからもう10年になるんですね...

私は情報系なので医療機関で看護研究の経験はありません.研究者ということで担当させていただいている感じです.

授業を担当するにあたって書店の看護研究コーナーに行って5,6冊本を買ってきてまとめて資料を作りました.主に使っているのが以下の本です.本格的に看護研究するには...恐らく力不足と思われますが,看護師の卵の方が初めて学ぶにはよい本と感じます.薄いけど全般的によくまとめられた本と思います.

2年くらい前に第3版が出版されました.内容を比較してみましたがほとんど変わっていなくてExcelのバージョンが新しくなったのでそれに対応させたという感じの内容でした.名字が同じなのでお子さんかなぁ?どうでもいい話ですが.なかなかいい(美味しい)引き継ぎだなと陰ながら思っていました.

さて,本題.

この担当授業の初回にデータの種類(名義データとか)を演習したあとに度数分布表が出てきます.これがなかなかExcelの練習にちょうどいいんですね.看護大学校の3年生ですが,コンピュータ演習は主ではないので苦手な学生さんもいます.データ入力してグラフを作るくらいならまだしも,統計機能を使うとなると計算式とか相対参照とかを理解していないと難しく感じます.

その問題をちょっと書いてみます.

Excelを学習中の方にはいい練習問題かと思いますのでぜひやってみてください.

Excelで度数分布表を作成してみる

上記の書籍のデータを使わせていただきますね.もし,いいなと思ったら買ってみてください.よい本です.アフィリエイトはしてませんので僕得ではありませんが.

まず,以下の表を入力します.懐かしいですね?中学くらいでやりましたよね?で,着色セルに数式を入力していくわけです.

問1 相対度数(C列)に数式を入力してください.

  • 相対度数はそれぞれの度数を度数の合計で割って求めます.答えは少し離れた下の方に書きますね.

-

-

-

-

-

-

-

-

-

解答

  • C2の例を示しています.

  • 値は「1/50」ですが,入力する計算式は「B2/B8」になります.マウスをカチカチしてセル番号を選択します.割り算は計算機では「/」の記号を使うんだよ...という感じで思い出してもらいます.
  • さらに,この数式「B2/B8」をC3以下にコピーすると...あれれ...という感じですね.値がおかしいことに気づいてもらってB8を動かさないようにするためドルマークをつけるんだよね?(←既に1・2年で習っているので思い出す子も多い)と.
  • で,答えは「=B2/B$8」になります.どうして?という方は絶対参照・相対参照というキーワードでもっとわかりやすく解説しているページがたくさんありますのでそちらを参照してください.

問2 累積度数(D列)に数式を入力してください.

  • 累積度数はその名の通りで,度数が上から順に累積していく感じですね.D2は1,D3は1+6,D4は1+6+12という感じです.

-

-

-

-

-

-

-

-

-

解答

  • D2は累積するものがないのでB2の値をそのままコピーします.なので数式としては「=B2」となります.

  • で,以下が実はこのエントリーを書きたいなと思ったポイントでした.SUMやAVERAGEとかワークシート関数で求める問題は,関数を知っていればわかるのですが,累積値は計算の仕方を少し工夫する必要があります.答えは以下です「=B3+D2」.

  • 教科書に書かれている数式の通りに考えると,入力する数式は「=B2+B3」としがちなんですね...でも,そうなるとD4の数式は「=B2+B3+B4」となり...数式を1セルずつ入力しなければならない(コピペできない)ので困るんですね.データ個数が少なければいいのですがたくさんあったら嫌になりますよね?

  • D3の数式を下にコピーすると,ちゃんと累積度数が計算できていることがわかります.めっちゃ便利!

実は,これってExcel表計算ソフトと呼ばれるゆえんでもあるんですね.セルに計算結果を書いておいて,さらにその結果を利用して別の計算をする.統計によく出てくる複雑に見える式の多くは線形結合(項をひたすら足し算している)ですが,それらは要素を計算して,最後にSUMすれば簡単に求められます.この辺の感覚がわかると統計ってExcelと仲良しだな...と思えてくるんですね.

あと,累積相対度数もありますが,これはいいですね...度数ではなく相対度数に対して,上記と同じ要領で累積値を求める方法を使えばいいわけです.一応,答えは以下に載せておきます.

というわけで,累積値を求めるときの計算式の書き方でした.

今週も来週〆切の原稿があるので休日出勤なのですが,ちょっと気分転換に書きました.さて16時までに終えて帰るぞ〜.

でわ!

2023/2/4 追記

  • このエントリーを書こうと思ったのは,実は,研究で以下のデータを整理していたときに思い出したんですね.ちょっと一部示します.

  • これは学生さんがプログラミングしていて発生したエラーメッセージのクラス全体の割合(B列)を示しているんですね.どういうエラーで(A列)つまずいたのかを分析するためです.
  • で,この「2022累積」(C列)というところをみていただくと,エラーのうち上位7件のエラーが全体の9割のエラーになる,ということがわかるわけですね.
  • ビジネスでも様々な問題があってそれぞれ手を打っていくというシーンはたくさんあると思います.全部やるのは無理なので優先順位をつけるのは常套手段ですよね?
  • 優先順位をつけて対応したときに,全体のどれくらいの割合を対応したことになるか気になるじゃないですか?それを累積値を示すことによって網羅率が見えてくるんですよね?
  • という感じに使えると思います.数学は役に立たないということはないですよね?はい.

とある論文の採録までの2年半の道のり

背景

授業改善的なある論文を書いて投稿し、色々あって投稿した学会では最終的に不再録となり、別学会に投稿して採録になりました。

もっと若いときなら「不採録」通知を受けたらすぐに諦めていたと思います。

年をとって少しは世の中が見えてくると、採用されるには内容もあるけど、タイミングやそのときの状況だったり判定する人との考え方の相性もあるって思うんですね。

なので、ダメなら別なところに出そうっていう切り替えが自然とできるようになります。

そう考えると年をとるのも悪くないな。。。と思うわけですが。

最近、別の先生から聞いた以下の言葉でも再認識したところでした。

memorandums.hatenablog.com

さて、個人的に思い入れがあったので、この論文が採録されるまでの流れをちょっと記録しておきたいな。。。と思いこのエントリーを書いています。個人メモには既に整理しているのですが。

もし、若い方で私と同じように(←まぁボスからの指導があるでしょうけど)不再録ですぐに自信をなくしがちな方に向けたエールでもあります。

学会名や投稿先は伏せたいと思います。特にそこに何か伝えたいことはないので。一般的な国内の学会になります。

学会とのやりとり

2020年11月14日に初稿を論文投稿した

  • なかなか査読結果がこないな。。。とは思っていたのですが、学生時代のボスに催促するのはみっともないことだと言われたことを思い出し静かに待っていました。
  • 1年たちさすがに心配になり。。。学会に問い合わせてみました。

2021年11月14日に状況がわかった

  • 問い合わせてから1週間くらいして学会から回答がありました。
  • 実は2021年4月に査読結果がメールで送られてきていたんですね。。。
  • その後、学会から確認の連絡として2021年5月に再度の連絡をいただいていました。
  • いずれのメールもGmailの迷惑フォルダに入ってしまっていたため気づかずに自動削除されていたのでした😥
  • Gmailへの文句(というか僕が悪いんですけどね。。。)はここに書きました。どうすればよかったのかはこちらを参照してください。
  • 学会の規定で査読結果の修正指示から3ヶ月以内に返信しなければ再投稿になると書かれていました。
  • 気を取り直してデータを整理し、再度、投稿に向けて準備しました。

2022年1月4日に再投稿した

  • 新しいデータも加えて再度投稿しました。

2022年2月28日に査読結果がきた

  • 1ヶ月で査読結果がきました!しかし「不再録」でした。
  • ただ、査読結果にショートペーパーとして再投稿を勧めるというありがたい助言が書かれていました。
  • 落ち込むと同時に新たに見直してみようと思い書き直しました。長いものを短くするのは結構難しいんです。。。やったことがあればわかるのですが。

2022年3月12日にショートペーパーとして新規投稿しました

  • 何とかこれで通ってくれればいい。。。それだけでした。とにかく前向きに考えないと折れたら終わりなので。

2022年7月28日に査読結果がきました

  • 修正指示が書かれていました。ただ。。。私の理解力の問題だと思うのですが、1つ1つの指示が曖昧で何をしたらよいかわからず、とにかくゴールイメージを想像しながら修正しました。単純な修正ミス(参考文献の記法など)もありました。

2022年8月2日に修正版を再投稿しました

  • とにかく冷静に修正して送りました。

2022年8月18日に査読結果がきました

  • 細かいミスの指摘、あとは曖昧な修正指示でした。何とか読み取って修正しました。

2022年9月6日に修正版を再投稿しました

  • とにかく頑張る。

2022年9月28日に査読結果がきました

  • 細かいミスの指摘、あとは曖昧な修正指示でした。何とか読み取って修正しました。

2022年10月7日に修正版を再投稿しました

  • もう頑張るだけ。

2022年10月11日に査読結果がきました

  • 曖昧な修正指示。。。

2022年10月15日に修正版を再投稿しました

  • もう今度が最後と思って出しました。

2022年11月8日に査読結果がきました

  • なんと「不採録
  • 査読結果に書かれていた不再録理由はこれまでやりとりした修正指示には全く触れられていない理由が多くを占めていました。そこが不足しているならもっと早く指摘してくれたら直したのに。。。
  • 何を思っても「不再録」の事実は変わりませんので、とりあえず、学会には長きに渡り査読ありがとうございましたと感謝のメールを返信しました(←まぁ不要だったかもですが)。
  • どういう状況であれ、これだけ数多くのやりとりに付き合ってくださったわけですから。よい方向に考えるしかありません。
  • 「ガーン」とはなりましたが、メゲていても何も生まれませんので、他の投稿先を探しました。論文の主張内容を評価してくれそうな学会がいくつかあり、さらに査読体制と査読期間が明記されいている学会を探し出し、そこのフォーマットにあわせて論文を調整しました。

2022年11月13日に別の学会に新規投稿しました

  • お陰様で論文の内容がかなり整理されていたので、あとは図表などのフォーマットを合わせる作業が主になりました。不再録通知から5日後に投稿することができました。

2023年2月2日(本日)、採録通知がきました🎉

  • 査読コメントがいくつかありましたが、条件採録ではなく、採録との結論をいただきました。
  • 実はこの学会は査読期間の目安として1ヶ月とあったので12月には査読結果がくると思い確認のメールを出したばかりでした。すぐに返信があり「評価がワレたので再査読をしていたので時間がかかった」とのことでした。やはり評価がわかれる論文だったのだな。。。と改めて思いました。
  • それでも評価してくださったことに感謝です。これで研究成果が日の目をみることができそうです。

教訓

  • 査読体制・査読方法・査読期間などが明記されている投稿先を選択しよう
  • 査読結果が迷惑メールフォルダに分類されていないか日々チェックしよう
  • 査読期間を過ぎても結果がこない場合は、少し待って(僕は期間の2倍を目安にしました)できるだけ丁寧に問い合わせましょう
  • 査読結果に対しては悪く考えてもきりがないので、あくまで冷静に前向きに取り組み丁寧に返信しよう
  • 不再録でもその原稿は捨てずに再投稿を目指そう
  • 流行りにあやかり dic.pixiv.net

でも、よかった。

湾曲ディスプレイを利用する認知的な弊害!?

ほぼ一日中モニターを見ているので、これまで色々な形式でのマルチディスプレイを試してきました。

そんなところへ大型ディスプレイ(湾曲)が出てきて、おお、これはいいなぁ。。。と思い、研究費で購入させてもらいました。3年前ですからちょうどコロナ1年目という感じです。

ちょっと明るすぎる(瞳の色素が薄いためか明るさに弱い)のが唯一の欠点でしたが、非常に満足して使ってきました。

最近、ちょっと環境を変えたいと思い、スタンディングデスクから下ろしていました。

memorandums.hatenablog.com

ディスプレイ面が大きいので何かにあたって破損しないようにディスプレイ面を壁に向けて置いていたのですが。。。本日、再び使おうと戻してみると。。。なぜか画面端が割れていました。私の不注意で😥

画面の1割も満たない場所が欠けている状態なので、何とか使おうと色々と試行錯誤したのですが、10分くらい使っていると画面全体が暗転してしまいます。。。これでは使えません。

とりあえず保証書をみると5年保証(故意は対象外でしょうけど)と書かれていたので、フィリップスのサービスに連絡は入れてみました。

とりあえず作業にモニターは必要なのでゼミ室で余っていたモニターを持ってきて設置してみると。。。

驚きました。

僕の目には以下のように見えるんです。。。最初、持ってきたモニターがおかしいのかと思いました。

恐らくですが、湾曲ディスプレイを長年見続けていたせいで脳が適応してしまったのかと思います。

メガネをかけて適応するのに似ていますね。

いや、発見というか驚きでした。

たぶんしばらくすると慣れるのでしょうけど。。。

とりあえず修理できるのか?修理するにも巨大な箱は捨てちゃったし。。。パネルだけ送ってくることもまず無理だろうな。。。と思うし、うーん。。。やってしまった。

また、変化があれば報告します。

2023/2/2 追記

早速、フィリップスのサポートから返信がありました。

お写真を確認しましたが、液晶内部のパネル割れになります。 パネル破損に関しましては保証対象外につき、有償修理でのご案内になります。

5年間の保証は自然故障による不具合に対応するもので、 パネル破損は自然には発生しない為、外からの力による障害という判断となります。 液晶外部は強固に作られておりますが、内部は比較的脆く、何かが当たったり、 ぶつかったタイミングで破損してしまう場合があります。

今回のお客様の不具合も上記の内容により、保証対象外、有償という判断となり、 液晶パネル、バックライト交換費用としまして概算20万円前後の費用が発生致します。

もちろん、わざとではないのですが。。。自然故障ではないのでしかたがないです。20万円は新品より髙いわけですから実質、対応しないということでしょう。廃棄か。。。申し訳ないです。

壁に向けていたので何かの拍子にあたったというわけではないのになぜか割れていたのが不思議でしたが「内部は比較的脆く」をみて何となく思い出しました。この製品は「持ち手」がないんですね。。。たまたま画面端を強く握ったような記憶があります。本体を移動するためですね。たぶん、湾曲ディスプレイ全般に当てはまる気がします。この製品をお持ちの方はどうぞご注意ください。

VLOOKUP関数のお供にIFERROR関数を使うと便利でした

研究データを整理していてVLOOKUPのありがたさを再認識しているところです。

とはいえ、検索範囲が左列だけという仕様はなんだかな。。。と思ったりしていました。それでも他の選択肢がないので(VBAで関数自作するか?⇒面倒)、使うしかないのですが。

memorandums.hatenablog.com

VLOOKUPで検索したときにキーが指定した検索値が見つからなかったときに「#N/A」と表示されます。ちなみにNot Applicableの略語らしいですが要は「なし」ということで。

このデータをSUM関数などで集計しようとするとエラーになるんですね。嫌なヤツです。

ぐぐりました。

窓の杜さんに解説がありました。いくつか対処があるようです。IF関数は思いつきましたが面倒そうだな。。。と思ったのですがIFERROR関数を使うと#N/Aだったときの値を指定するだけなので楽ちんです。

forest.watch.impress.co.jp

例えば、とあるセルに「VLOOKUP〜」と書いていたとして、エラー処理するには「IFERROR(VLOOKUP, "エラーだったときの値")」と書けばいいようです。

私のケースでは0でいいので「IFERROR(VLOOKUP, 0)」と書きました。

はい、解決しました。

これくらいの話ならツイッターにつぶやいておしまいだったのですが。。。ツイッターを辞めたので何か発見してもメモすることが難しい。。。

Joplinというメモアプリを使っていてそこに個人メモすれば済む話ですが、せっかく書くなら同じようなことで悩んでいる人の解決の手助けになるかも、と思うので発信しています。

誰かに見られることを意識すると文章もそれなりにちゃんと書きますから、結局はあとで見返したい自分にとって利があります。

でわ!

ExcelのHYPERLINK関数を使ってローカルファイルにアクセスするまとめページを作ってみた

研究のツールとして、たくさんあるフォルダにブラウザで次々とアクセスするようなページが必要になりました。ローカルファイルに対してもHTMLのAタグは機能しますので、例えば、「設計書」というフォルダにアクセスするハイパーリンクは「設計書」と書けばよいわけです。これが前提になります。

で、フォルダ一覧はMacであればlsコマンドで、Windowsであればdirコマンドで出力できますので、いちいちHTMLを作るのは面倒です。lsコマンドなどの出力からHTMLを自動生成できたらいいな、という話です。

多くの人にとってはちょっとよくわからない話ですね。。。たぶん。

で、このまとめページを作成するのにExcelが使えないかな。。。と探してみたところHYPERLINK関数ってのがあることを知りました。最初、Webページやシートなど固定的な文字しか与えられないと思っていたのですが、実はセルを参照することができるため、セルに書かれた文字列をフォルダ名としてハイパーリンクを作成することができるんですね。素晴らしい!

で、それを絵で解説するのはなかなか難しいし、あとで見る気もしないな。。。と自分でも思ったので動画にしました。興味がある方は動画を見てください。わかりやすいか。。。は微妙ですが、僕自身はわかるのでまぁいいかなと。

youtu.be

MacかつMacExcelでデモしていますが、もちろんWindowsでも使えるテクと思います。

でわ!