memorandums

日々のメモです。

Excel 2016 for Macのカーソルアニメーションを解除する

忙しいときに限ってExcelのカーソルアニメーション効果をどうやって切るんだっけ。。。と。。。探せずにいました。

ちょっと探してもなぜかWindows10の情報しかない。。。

Macの情報もないわけではないのですが、とりあえず検索には引っかかり難かったので1票投じるという意味で書きます。

[Excel]-[環境設定]-[編集]で、以下の画面が表示されますので、チェックを外せばいいですね。いやいや。。。アニメいらないですから。。。

f:id:ke_takahashi:20180119221845p:plain

Javaで得たシリアル値をExcelの日付として扱う

とあるJavaプログラムで、イベントが発生した日時をシリアル値で記録したデータファイルがありました。

データを解析しようとJavaであれこれやっていたのですが、Excelの方がいいなと思い、シリアル値をExcelのワークシートに読み込み、処理しようとすると。。。うまくいきません。調べると起点が違うからでした。

Javaで得たシリアル値はいわゆるUNIX時間で1970年1月1日 0:0:0からの経過ミリ秒数をカウントした値です。

UNIX時間 - Wikipedia

一方、Excelの方は、1900年1月1日を1とした値で、1日過ぎた1900年1月2日であれば2になるという感じです。

変換するには。。。たくさんの方がこれまでブログ等に書かれていて、それらを参照しながら、自分の理解をまとめてみました。車輪の再開発になりますが。。。ご容赦を。

まず、答えを先に書きます。

f:id:ke_takahashi:20180119143411p:plain

A2にJavaで取得したシリアル値を入れます。

変換するための式は上図の通りです。説明します。

シリアル値はミリ秒なのでExcelに合わせて日オーダーに変換するため、シリアル値を(1000ミリ秒 x 24時間 x 60分 x 60秒)で割ります。

そのあとE3の項目を足していますが、これは、UNIX時間の起点とExcelの起点の日数を計算した答えで、UNIX時間にこれを加えることでExcelの日付と同じに扱えるようになります。

また、「+1」がありますが、これが最初わからなかったのですが、上記の通りで、Excelのシリアル値は1900年1月1日が1なんですね。0じゃない。なので1加えています。

最後に「9/24」がありますが、これは日本時間とGMTとの差になります。これは直ぐにわかると思いますが、なぜ「-9/24じゃないのか」が腑に落ちませんでした。

詳しくは以下に書かれていて、とてもわかりやすく書かれているのですが。

[Groovy|Java]タイムゾーンに関するメモ - Qiita

ちなみに、Excelの時間はパソコンで設定したタイムゾーンを起点として計算されます。その上でJavaになります。

Javaのシリアル値はUNIX時間であり、これまでタイムゾーンを意識したことがなかったのですがGMTなのだということです。つまり、日本のタイムゾーンで1970/1/1 0:0:0のシリアル値を取得すると(deprecatedな使い方ですが例外とか面倒なのでごめんなさい)。。。-32400000という答えが返ってきます。

f:id:ke_takahashi:20180119151447p:plain

これは-32400000 = -(9 * 60 * 60 * 1000)となります。日本時間はGMTより+9時間ですから、この結果がマイナスになるのが直感的に理解できませんでした。上記のサイトの説明を読み理解したところでは、getTime()した結果はUNIX時間であり、UNIX時間はGMTで1970/1/1 0:0:0からの経過秒数なのだから、日本で1970/1/1 0:0:0であったときのUNIX時間は-32400000した値になる、ということになります。

特に下線部を直感的に理解するのが難しいですね。。。

地球儀を思い浮かべて。。。グリニッジ天文台に時計を持った人かいて、その人が「今、1970年1月1日 0時0分0秒になったから時計を開始するよ」と言ったとします。そして、日本にいる私が日本で1970年1月1日 0時0分0秒を迎えたときに、今、UNIX時間はいくつ?と尋ねると「32400000」だよと答えてくれます。でも、それじゃ、日本の日時は9時間少なくなっちゃうから、日本では日本で1970年1月1日 0時0分0秒から開始するよ。。。と日付の処理がされます。でも、UNIX時間はあくまで1つなので。。。2018年に日本にいる私がJavaでプログラムを作って日本における「1970年1月1日 0時0分0秒」のときのUNIX時間って?と考えると。。。日本の時計はGMTより9時間分多いんだからGMTを取得するには9時間分引かないといけないね。。。

というなんともアホらしい想像をしてしまうのでした。

とりあえず上記で計算できることを確かめています。間違いはないと思います。ただ、上記の説明には怪しいところが多々あると思います。まだしっくりきていません。

簡便に計算するには以下の式でもいいと思います。

Excelのシリアル値=UNIX時間/86400000+25569.375

電流センサーで電流を計測してみる(その2)

講義が終わってから、昨晩、以下のようなものを作って試し運転してみました。

memorandums.hatenablog.com

自宅に持ち帰り、深夜にブレーカー付近に設置して実験してみました。

エアコンはついていない状態です。2.5Aでした。冷蔵庫(もう10年くらい使っていますが)と蛍光灯が1つ付いている状態です。

f:id:ke_takahashi:20180117110722p:plain

さらに別の部屋の蛍光灯をつけたら以下です。1Aくらい増えました。

f:id:ke_takahashi:20180117110913p:plain

さらにテレビをつけました。2 Aくらい増えた感じです。

f:id:ke_takahashi:20180117110943p:plain

さらに電子レンジをつけると。。。8.5Aくらい増えました。確か850Wだったはずなので。

f:id:ke_takahashi:20180117111054p:plain

さらに電気ポットをつけました。また8Aくらい増えて。。。

f:id:ke_takahashi:20180117111201p:plain

うちは契約は30Aなので。。。エアコンつけた状態で電子レンジに電気ポットをつけると落ちる。。。のは間違いありませんね。。。

このセンサーを常設するか。。。は迷うところです。現状、Webで確認するようにしているのですが、これでは「危険」を知らせることができません。確認するのにスマホを取り出すのも面倒です。

こういうときはアシスタント的なものがあったらいいな。。。と思いますね。

例えば

私「OK、グーグル。今、消費電力は?」

アシスタント「2200Wです」とか。

もっと積極的にサポートしてくれるなら。

アシスタント「そろそろやばいっすよー。あと?アンペアいくと落ちます。気をつけてください。」

とか言ってくれる。

まぁ、ここまでやらなくても、とりあえず現状の電流値を何らかの方法で可視化することと(例えばLEDとか)、基準値を上回ったら警報を鳴らすとかはArduinoでもすぐに作れます。

また、空き時間みつけてやってみたいなぁ。

電流センサーで電流を計測してみる(その1)

寒くなると電気製品をよく使うのでブレーカーが落ちないかヒヤヒヤしたりします。でも、あとどれくらい余裕があるのかわかりません。で、そんな装置は今なら売ってるだろうと探してみるといろいろありました。例えば、以下です。

電力モニター

電力モニター

1万円か。。。微妙な値段です。

作ったら安いかな?と思って調べるとチャレンジした方がたくさんいるんですね。で、それを真似してみましたよ、という話です。

回路は以下を参考にしました。

Arduinoで電力計:自分の家の電気の利用パターンを知りたい - IoTラボ

ソフトは以下を参考に(というかそのままもらいました)

家庭で消費電力を計測する。Arduino,XBee,クランプ式電流センサ

電流センサーはモノタロウが一番安かったので購入。あとは100オームと4.7kオームの抵抗でした。コンデンサは買ったけど利用していません。

コードは以下の通りです。

//電流センサーから電力等を計算するコードは以下のURLを参照しました。
//http://tyk-systems.com/PowerMeasure/PowerProgram.html

#include <MsTimer2.h>
#include <Bridge.h>
#include <BridgeServer.h>
#include <BridgeClient.h>

BridgeServer server;

int aveN = 10;
int sumN = 100;

float sensV0 = 0;
float sensV1 = 0;
float sensV0ave = 0;
float sensV1ave = 0;
float SumW = 0;
float Read0 = 0;
float Read1 = 0; 

float Coeff = 0.1464; //ArduinoのAnalogInputの値を電流値(A)に変換する係数
//電流計は1mV=30mA設定。電圧計測5.0V=1024

void setup() {
  pinMode(13, OUTPUT);
  
  MsTimer2::set(500, calcEP);
  MsTimer2::start();    

  Bridge.begin();
  server.listenOnLocalhost();
  server.begin();

  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

void led13_flash() {
  static int led = HIGH;
  digitalWrite(13, led);
  led = !led;
}

void calcEP() {
  led13_flash();

  sensV0ave = 0;
  sensV1ave = 0;
  for (int j = 0; j < aveN; j++) {
    sensV0 = 0;
    sensV1 = 0;
    for (int i = 0; i < sumN; i++) {
      Read0 = (float) analogRead(A1);
      Read1 = (float) analogRead(A2);
      Read0 = abs(Read0 - 512);
      Read1 = abs(Read1 - 512);
      sensV0 = sensV0 + Read0 * Read0 / sumN;
      sensV1 = sensV1 + Read1 * Read1 / sumN;
    }
    sensV0ave = sensV0ave + Coeff * sqrt(sensV0) / aveN;
    sensV1ave = sensV1ave + Coeff * sqrt(sensV1) / aveN;
  }
  SumW = sensV0ave + sensV1ave; //200Vでは2本の端子の和で総電力量となる。
}

void loop() {
  BridgeClient client = server.accept();

  if (client) {
    String command = client.readString();
    command.trim();
    if (command == "power") {
      client.println("Status: 200");
      client.println("Content-type: text/plain");
      client.println("Access-Control-Allow-Origin: *");
      client.println();
      client.println("<p>sensor1 : ");
      client.println(sensV0ave);
      client.println("(A)</p><p>sensor2 : ");
      client.println(sensV1ave);
      client.println("(A)</p><p>Total : ");
      client.println(SumW);
      client.println("(A)</p>");
    }
    client.stop();
  }
  
  delay(100);
}

Coeffってやつの求め方がよくわからなかったのですが、サイトの説明を何度か読むうちに理解できました。

この電流センサーのサイトに以下の表があります。電流センサーの間に100オームの抵抗を入れましたので、100オームの線をみます。そこで、貫通電流(測る対象)の例えば60Aの出力電圧は。。。2000mVになっていますよね?(交点に赤丸を入れました)。つまり、計測対象の線に60A流れたら100オームの両端には2Vの電圧が発生するということになります。「60A => 2V」 の関係になる。ほぼ線形と考えて、両辺?を2000で割ると「30mA => 1mV」になります。これはあとで使います。

f:id:ke_takahashi:20110413032749j:plain

さらに、電圧の変化をArduinoのAnalogInputで計測するわけです。電圧は5Vで、AnalogInputは0-1023までの1024段階で読み取れますので、5Vを1024で割ると0.00488281になります。つまり、1ステップあたり0.00488281(V)になり、mVにすると4.88281(mV/step)になるわけです。AnalogInputで得た値に、この値をかけてやることでmVがわかるわけです。さらに、上記で求めた関係を使うと、AnalogInputの値(step)
x 4.88281(mV/step) x 30(mA/mV)で、mAに変換することができます。どうせならAで知りたいので。。。1000で割ってやると上記のコード中の「Coeff = 0.1464」が出てくるわけです。はい。面白いですねぇ。

ちなみに上記のコードは、Arduino Yunを使っています。どうせならスマホとかで電流値を確認したいですからね。

さあ、実験です。

私の研究室になぜか大きなブレーカーがあります。実はこれはちょっと離れたところにある演習室のエアコンのブレーカーなんですね。とりあえず電流センサーを黒と赤の線に繋げ、演習室のエアコンを入れに行きました。

f:id:ke_takahashi:20180116205116j:plain

エアコン停止中
f:id:ke_takahashi:20180116205222p:plain

エアコン稼働中
f:id:ke_takahashi:20180116205233p:plain

おおよそ30Aです。ブレーカーをみると30Aなので。。。いい感じです。

さらに、100Vの電気ポットで計測してみました。卒業した学生さんがゼミ室に置いていったものです。

f:id:ke_takahashi:20180116205353j:plain

ポット停止中
f:id:ke_takahashi:20180116205427p:plain

ポット稼働中
f:id:ke_takahashi:20180116205456p:plain

このポットには電力値などが書かれていませんでした。ググって見ると「100V-550W」とありました。

5.46Aいいですね。。。いい感じです。

とりあえず作ったので、自宅で試してみたいと思います。結果が出たらまたご報告します。はい。

ちなみに電流センサーの取り付け方は以下が参考になります。

http://www.ecoichi.com/material/Method_of_measuring_power_energy.pdf

Excelの回帰分析でエラーがでる。。。解決(盲点)

とあるデータをもとに、Excelの分析ツールで重回帰分析をしたら。。。以下のエラーメッセージが表示されまして。。。困りました。

回帰分析LINEST()関数エラー 入力範囲をチェックしてください。

実際のExcelのデータとエラーメッセージは以下の通りです。

f:id:ke_takahashi:20180115174806p:plain

データの選択範囲は間違ってないし。。。初見ではわかりませんでした。ぐぐってもわからない。

選択の仕方によっては以下のようなメッセージにもなります。

回帰分析X範囲の行と列の番号は、同じにできません。

f:id:ke_takahashi:20180115175004p:plain

(いつものことですが)もう、何を言っているのかさっぱりです。。。

で、よーーーーくみると、C列とE列の間がおかしい。。。再表示してみると。(・_・;)

f:id:ke_takahashi:20180115175216p:plain

一番最初のエラーメッセージが正しかったのですね。。。独立変数の値がおかしかったわけです。

ぐぐってもなかなか出てこなかったのでとりあえず記録しておきますね。将来の自分のためにも。

BT-200とSSE-TN1Sを繋ぐことはできないらしい。。。

テニスをずーっとやってきたゼミ生が、卒業研究として、ソニースマートテニスセンサー(SSE-TN1S)の情報をシースルー型HMDの1つであるEPSON BT-200に表示しよう。。。という研究(というか開発かな?)をしていました。

あまり進捗がなく。。。最近になってごにょごにょやっているようで、頻繁に質問にくるようになりました。

ちょっと手伝っていると。。。実は、動作環境的にできないことがわかりました。

SSE-TN1SのAndroidのバージョンは4.1以上とあります。ソニーのページは見辛く探せなかったのですが、Amazonの仕様表によると4.1以上と書かれています。

EPSON MOVERIO スマートグラス BT-200

EPSON MOVERIO スマートグラス BT-200

0.1違いなのですが。。。ダメなものはダメです。adb installができません。裏技があるのかもしれませんが。

ちなみに、現行機種のBT-300はAndroid5.1ですから。。。動作しますね。。。新しいやつ買えってことです。。。こんなの調べればすぐにわかったのになぁ。。。なぜいまごろわかるんだろう。。。

とりあえず同じようなことを考えている人がいたらと思い記録しておきます。

あ、とりあえず表示はしたいので。。。ないなら作るしかないというところです。ざっと探してみると、シースルー型のHMDを自作している人はそれほど多くないようです。一応、履歴を残しておきます。

Building a DIY AR Device For Under $30 - VRScout

MRの普及を加速させるDIYタイプのMRヘッドセット「Holokit」 | VR Inside

論文書いている人もいました。

http://wearables.unisa.edu.au/wp-content/uploads/2016/10/A-Low-Cost-Optical-See-Through-HMD-Do-It-Yourself.pdf

mastodon4jをEclipseで動かすまでの作業ログ

今日から授業開始です。その今日に限って雪。。。福岡で雪。。。ありえない。。。幸いなことに午後からの授業だったので慌てずに済みました。

その授業で、とある学生さんの個人プロジェクトで、raspberry piでmastdon4jなるものを動作させようとして詰まっているという話を聞きました。twitter4jみたいなもんなんだろうな。。。くらいに思っていました。mastdonはほとんど使っていないのですが。。。せっかくなので使ってみようとごにょごにょしてみました。その学生さんが参考にしたサイトは以下です。

Mastodon APIを叩くJavaライブラリを作った - Qiita

実は、同名のライブラリが他にも公開されているようで、ぐぐるとそちらがトップにきますが。。。とりあえずこっちで動かしてみました。その学生さんはWindowsだったのですが、僕はMacVMWindowsでやってあげようかと思ったのですが、遅いので。。。たぶん、以下の手順はWindowsでも参考になると思います。はい。

ちなみに、上記の記事は昨年の4月に公開されたようですが、「具体的な使い方は後日」と書かれているのに後続記事がない状況です。自分用に作られたとのことで。。。しかたがないですね。利用させていただく身としては。とりあえず、これを動作させるまでの作業ログを書きます。ビルドや使い方がそもそも正しいのかわかりませんが。。。ドキュメントがないのでなに分。

ここから本題です。

上記のプロジェクトではビルドツールとしてmavenが必要とのことで、MacにHomebewでmavenを導入します。Windowsでは別の方法になると思います。簡単です。はい。

brew install maven

次に上記で公開されている2つのプロジェクトをクローンするまでもなく「DOWNLOAD ZIP」を洗濯いや選択してダウンロードして展開しておきます。

https://github.com/hecateball/mastodon4j
GitHub - hecateball/mastodon4j-sample

続いて、Eclipseを起動します。Eclipseは最新版?のOxygenを使いました。Eclipse起動後に、[File]-[Import]を選択し、[Maven]-[Existing Maven Projects]を選択しNextをクリックします。

Root Directoryにmastodon4j-masterを選択してFinishボタンを押します。mastdon4jというプロジェクトがインポートされていると思います。

さらに下図のようにpom.xmlを右クリしてmaven installを選択します。

f:id:ke_takahashi:20180111002523p:plain

上記でビルドが成功すると、下図のようにjarファイルが生成されます。このプロジェクトはこのまま放置します。

f:id:ke_takahashi:20180111002618p:plain

また、[File]-[Import]を選択し、[Maven]-[Existing Maven Projects]を選択しNextをクリックします。

Root Directoryにmastodon4j-sample-masterを選択してFinishボタンを押します。mastodon4j-sampleというプロジェクトがインポートされていると思います。

このプロジェクトで、さきほどと同じように、pom.xmlを右クリしてmaven installを選択します。成功すると、下図のようにmastodon4j-sample-1.0.jarが生成されます。

f:id:ke_takahashi:20180111003043p:plain

続いて、user.propertiesというファイルをダブクリして開き、それぞれの=の後ろに自分のmstdnの情報をいれていきます。既に値の入っているプロパティはそのままにします(いじるなって書いていますからね)。

f:id:ke_takahashi:20180111003223p:plain

修正が終わったら、下図のようにjarファイルを実行するための実行構成を作成します(具体的には、jarファイル上で右クリックしRun Asを選択しRun Configurationを選択して、下図のように情報を入力してRunボタンを押します。(たぶん、このやり方は間違いで、pom.xmlを右クリしてmaven generate-sourcesを選択すればこれと同様のことができるはずなのですが。。。xmlを追うのが面倒だったので簡単な方法で逃げました。とにかく、どんな方法でもPropertiesGeneratorクラスを実行できればいいはずです)

f:id:ke_takahashi:20180111005107p:plain

うまく行けば、下図のようにmastdon4j.propertiesというファイルが生成されます。ちなみにリフレッシュをしないと表示されません。Eclipseの嫌なところですね。。。

f:id:ke_takahashi:20180111005135p:plain

これでやっと準備完了。

また、最初にインポートしたmastodon4jのプロジェクトに移動し、まず、さきほど生成したmastdon4j.propertiesをプロジェクト直下にコピーします。これから作成するクラスが実行時に参照できる位置にあればいいということです。

次に、テスト用に新規作成でクラスを作成します(なにも考えずデフォルトパッケージにしました)。クラスの使い方は最初よくわからなかったのですが。。。よーくみればmastodon4j-sample内のPropertiesGeneratorで使用例がそれとなくありますので、それを参考にしました。

import mastodon4j.Mastodon;
import mastodon4j.MastodonFactory;
import mastodon4j.entity.Status;

public class M {
	public static void main(String [] args) {
		Mastodon m = MastodonFactory.getInstance();
		for (Status s : m.getPublicTimeline(true)) {
			System.out.println(s.getContent());
		}
	}
}

とりあえず、普通にこのクラスを右クリして実行すればJava Applicationとして実行できるはずで、動けばパブリックタイムラインがEclipseのコンソールに表示されるはずです。はい。

ちなみに、新しくプロジェクトを作成して、mastodon4j-1.0.jarを参照すれば動作するのかと思ったのですが、依存ライブラリが他にもあるようで、簡単には動きませんでした。追うのが面倒なので、結局、mastodon4jのプロジェクトの中にテストクラスを入れてしまったということです。はい。

とりあえず、上記の学生さんを対象として、手順を細かく書きました。

長かった。。。今1時。これから風呂入らないと。。。明日は雪。しかも早朝から飯塚で非常勤。早く起きて移動しないと間に合わないんだよなぁ。。。ハゲの進行が。。。orz