Author Archives: AKIYAMA

2018-12-11 ,

Node.jsで書いたプログラムをタスクトレイに入れる

Node.jsで書いたものをWindows上で起動させっぱなしにする方法は色々あるみたいなんですがどれも今ひとつよく分からなかったのでやりたいことは単にコンソールウィンドウが鬱陶しいからタスクトレイに押し込んで欲しいというだけだったのでそういうことをするプログラムを作りました。

misohena/trayrun: Execute windows application under task tray

Visual Studioでビルドしてtrayrun.exeを作成。

trayrun.exeへのショートカットを作成して、ショートカットのプロパティから色々変更。

リンク先
c:/hogehoge/trayrun.exe /c "node.cmd start" /title "my node app"
作業フォルダー
Node.jsで書いたもののディレクトリ

みたいにすればOKです。

ショートカットをスタートアップに入れておけば起動時に開始されます。

後はタスクトレイのメニューからコンソールウィンドウを表示したり隠したり出来ます。

で、絶対同じようなものは既にあるんだろうなぁと検索したら同じ名前のものが見つかりました。まぁ、そうですよねw

2018-11-14 ,

Google Calendarで過ぎた日の色を変える(2018)

Google Calendarで過ぎた日の色を変える が動かなくなって久しいので調べて書き直しました。

DOMを見たところ、カレンダーの各セルにdata-datekeyという属性があったのでこれを使えば簡単そうだなと。 このdatekeyの数字の意味については Googleカレンダーのdata-datekeyの謎 で。

次のようなユーザースクリプトを作ってGreasemonkeyなりTampermonkeyで使えばOKでした。

(function(){
    'use strict';

    var timer = null;
    function schedule(){
        if(timer){
            clearTimeout(timer);
        }
        timer = setTimeout(update, 200);
    }

    function update(){
        const PAST_COLOR = "#eeeeee";
        const TODAY_COLOR = "#ffffaa";

        const now = new Date();
        const todayKey = (now.getFullYear()-1970)*512+(now.getMonth()+1)*32+now.getDate();
  
        const cells = Array.prototype.slice.call(document.querySelectorAll("[data-datekey]"));
        cells.forEach((e)=>{
            if(e.dataset.datekey < todayKey){
                e.style.backgroundColor = PAST_COLOR;
            }
            else if(e.dataset.datekey == todayKey){
                e.style.backgroundColor = TODAY_COLOR;
            }
        });
    }

    var observer = new MutationObserver(schedule);
    observer.observe(document.body, {childList:true, subtree:true});

    update();
})();

DOMが書き換わってから100msだと切り替えたときにたまに元に戻ってしまうことがあったので200msにしました。

2018-11-14

Googleカレンダーのdata-datekeyの謎

Google Calendarで過ぎた日の色を変えるが大分前から動かなくなっているので新しいカレンダーのデザインを調べたのですが、日付のセルに data-datekey という属性が指定されているのに気がつきました。

今日11月14日だと data-datekey="24942" となっています。

最初はどこかの起点から経過日数かと思ったのですが、逆算してみると1950年8月1日??

よく見てみると、月の間や年の間で日数が飛んでいます。ははぁ、これは y*Y+m*M+d みたいな形式だなぁ。

24609 2018-01-01
24927 2018-10-31
24929 2018-11-01
24958 2018-11-30
24961 2018-12-01
24991 2018-12-31
25121 2019-01-01

うーん……2018年1月1日から2019年1月1日が 25121-24609=512 (=2^9)、11月1日から12月1日が 24961-24929=32 (=2^5)。

  • 1年で512
  • 1月で32
  • 1日で1

つまり

(y-1970)*512 + m*32 + d

※(m、dは1から始まる月、日)

ビット演算でやるなら

((y-1970)<<9) | (m<<5) | d

ですね。