TimeTreeAPIを使って共有カレンダーをGoogleカレンダーへ同期する

夫婦のスケジュール共有に2年ほどTimeTreeというアプリを使っています

操作性が良くて気に入っているのですが、TimeTreeの共有カレンダーを外部サービス(例えばGoogleカレンダー)とシンプルには同期できないという不満がありました。

Googleカレンダーと同期することが出来たらアレクサに「今日の予定は?」と聞くだけで予定の確認ができるので便利になるのにと思っていて早2年。運営元に「有料アカウント化してもいいからAPI作って」と問い合わせまで送っていました。

想いが通じて(?)先日、予定取得APIが公開されたので、早速TimeTree共有カレンダー→Googleカレンダー→アレクサで予定確認を作ってみました。

Googleカレンダーへの同期ということで、API取得はGoogleAppsScript(GAS)で作成。TimeTree側に予定が追加されたかを定期的に取得するためにGASにトリガーで定期実行を仕込んでいます。

コードは最後に載せますが、作成にあたっていくつかポイントが

TimeTreeの予定は今日~最大7日分しか取得できない

この制限自体はAPIドキュメントに書いてあるので不便ですが問題ではないでしょう

TimeTreeAPIのタイムゾーンはUTC固定

タイムゾーンを変更できません。
このため日本時間AM9時が日付の切り替わり基準になります。なんとAM9時を過ぎると0時~8時59分までの予定が取得できなくなります。APIドキュメントにUTCと書いてあって嫌な予感したので境界値テストしたら案の定でした。
過去の予定は同期済みであることが期待できるので実用上は大丈夫かと思われます。

GoogleカレンダーAPIの終日予定 EndTimeが1日ズレる

こちらはGoogleカレンダーAPIの仕様のようです。
1月10日~1月13日までという予定をAPIで取得すると、API上は終了日がなぜか1月14日を返してきます。
逆に登録時に 1月10日~1月13日というデータを素直に登録しようとすると、カレンダー上は 1月10日~1月12日の予定として作成されます。
フォーラムでも不可解な動作として疑問を抱いている人が多かったですが、「終日予定の終了時間は翌日の0時0分」というのがGoogleさんの判断のようです。


TimeTree→Googleカレンダーへ同期するGoogleAppsScript

getCalenderId() で同期したい共有カレンダーのIDを調べて、getUpcomingEvents()をトリガーで定期実行する感じです。

Timetreeのパーソナルアクセストークンの取得とかは適当にググりましょう。

//アクセスできるカレンダー一覧の取得
function getCalenderId() {
  //ファイル→プロジェクトのプロパティ→スクリプトのプロパティにて下記プロパティを設定すること
  //プロパティ名:TIMETREE_ACCESS_TOKEN
  //値:Timetreeで発行したパーソナルアクセストークン
  var timetreeAccessToken = PropertiesService.getScriptProperties().getProperty('TIMETREE_ACCESS_TOKEN');
  var options = {
    'method': 'get',
    'contentType': 'application/json',
    'headers': {
      'Accept': 'application/vnd.timetree.v1+json',
      'Authorization': 'Bearer ' + timetreeAccessToken
    }
  };
  
  var timetreeResponse = UrlFetchApp.fetch('https://timetreeapis.com/calendars', options);
  var timetreeJsonData = JSON.parse(timetreeResponse.getContentText());
  for (var i= 0 ;i < timetreeJsonData.data.length ; i++){
    //カレンダー名:カレンダーID をログに表示(表示→ログから確認)
    Logger.log(timetreeJsonData.data[i].attributes.name + ' : ' + timetreeJsonData.data[i].id);
  }
}

function getUpcomingEvents() {
  //ファイル→プロジェクトのプロパティ→スクリプトのプロパティにて下記プロパティを設定すること
  //プロパティ名:TIMETREE_ACCESS_TOKEN
  //値:Timetreeで発行したパーソナルアクセストークン
  var timetreeAccessToken = PropertiesService.getScriptProperties().getProperty('TIMETREE_ACCESS_TOKEN');

  //ファイル→プロジェクトのプロパティ→スクリプトのプロパティにて下記プロパティを設定すること
  //プロパティ名:TIMETREE_CALENDER_ID
  //値:getCalenderId()で取得したGoogleカレンダーと同期したいカレンダーID
  var timetreeCalenderId = PropertiesService.getScriptProperties().getProperty('TIMETREE_CALENDER_ID');
  var options = {
    'method': 'get',
    'contentType': 'application/json',
    'headers': {
      'Accept': 'application/vnd.timetree.v1+json',
      'Authorization': 'Bearer ' + timetreeAccessToken
    }
  };

  //upcoming_events APIでは当日から7日間分のみ取得可能
  //過去および8日以降の予定は取得できない
  //日付の判定はUTCのためAM9時を過ぎると8:59以前の予定は取得できなくなる
  var getDays = 7;//1-7で指定
  
  //TimeTreeの予定を取得
  var timetreeResponse = UrlFetchApp.fetch('https://timetreeapis.com/calendars/' + timetreeCalenderId + '/upcoming_events?days=' + getDays, options);
  var timetreeJsonData = JSON.parse(timetreeResponse.getContentText());

  //ファイル→プロジェクトのプロパティ→スクリプトのプロパティにて下記プロパティを設定すること
  //プロパティ名:GOOGLE_CALENDER_ID
  //値:同期先のGoogleカレンダーID
  var googleCalendarId = PropertiesService.getScriptProperties().getProperty('GOOGLE_CALENDER_ID');
  
  //Googleカレンダーの予定を取得
  var googleCalendar = CalendarApp.getCalendarById(googleCalendarId);

  var startTime = new Date(Utilities.formatDate(new Date,"JST", "yyyy/MM/dd"));
  var endTime = new Date(Date.parse(startTime) + (getDays * 60 * 60 * 24 * 1000));
  var googleCalendarEvents = googleCalendar.getEvents(startTime, endTime);
  var googleCalendarEventsObjects = {};
  //googleカレンダーの予定を確認
  for (var i in googleCalendarEvents) {
    //予定の説明にtimetreeのeventIdを入れているので、eventIdをkeyにした配列を作る
    googleCalendarEventsObjects[googleCalendarEvents[i].getDescription()] = googleCalendarEvents[i];
  }

  //Timetreeの予定を確認
  for (var i= 0 ;i < timetreeJsonData.data.length ; i++){
    var timetreeEvent = timetreeJsonData.data[i];

    if(googleCalendarEventsObjects[timetreeEvent.id]){
      //googleカレンダーに予定が存在する
      var googleCalendarEvent = googleCalendarEventsObjects[timetreeEvent.id];

      //終日予定かチェック
      if(googleCalendarEvent.isAllDayEvent() == true && timetreeEvent.attributes.all_day == true){
        //どちらも終日予定
        var googleCalendarStartDate = Utilities.formatDate(googleCalendarEvent.getStartTime(),"JST", "yyyy/MM/dd");
        var googleCalendarEndTime = new Date(Utilities.formatDate(googleCalendarEvent.getEndTime(),"JST", "yyyy/MM/dd"));
        var googleCalendarEndDate = Utilities.formatDate(new Date(googleCalendarEndTime.getYear(),googleCalendarEndTime.getMonth(),googleCalendarEndTime.getDate()-1),"JST", "yyyy/MM/dd");//googleカレンダーの終日予定の最終日は1日多く返ってくるので減算
        var timetreeStartDate = Utilities.formatDate(new Date(timetreeEvent.attributes.start_at),"JST", "yyyy/MM/dd");
        var timetreeEndDate = Utilities.formatDate(new Date(timetreeEvent.attributes.end_at),"JST", "yyyy/MM/dd");
        //タイトル、開始、終了日が一致するかチェック
        if(
          googleCalendarEvent.getTitle() == timetreeEvent.attributes.title
          && googleCalendarStartDate == timetreeStartDate
          && googleCalendarEndDate == timetreeEndDate
        )
        {
          //予定変更なし。そのまま
        }else{
          //予定が変更されている。Googleカレンダー側を削除して追加しなおす
          googleCalendarEvent.deleteEvent();
          addEvents(googleCalendar,timetreeEvent);
        }
      }else if(googleCalendarEvent.isAllDayEvent() == false && timetreeEvent.attributes.all_day == false){
        //どちらも終日予定ではない
        //タイトル、開始、終了日時が一致するかチェック
        if(
          googleCalendarEvent.getTitle() == timetreeEvent.attributes.title
          && Date.parse(googleCalendarEvent.getStartTime()) ==  Date.parse(new Date(timetreeEvent.attributes.start_at))
          && Date.parse(googleCalendarEvent.getEndTime()) ==  Date.parse(new Date(timetreeEvent.attributes.end_at))
        )
        {
          //予定変更なし。そのまま
        }else{
          //予定が変更されている。Googleカレンダー側を削除して追加しなおす
          googleCalendarEvent.deleteEvent();
          addEvents(googleCalendar,timetreeEvent);
        }
      }else{
        //予定が変更されている。Googleカレンダー側を削除して追加しなおす
        googleCalendarEvent.deleteEvent();
        addEvents(googleCalendar,timetreeEvent);
      }
      //予定の確認が出来たので配列から削除
      delete googleCalendarEventsObjects[timetreeEvent.id];
    }else{
      //evet_idに一致する予定がgoogleカレンダーに存在しないので追加       
      addEvents(googleCalendar,timetreeEvent);
    }
  }
  
  //Timetree側で削除された予定をGoogleカレンダーからも削除
  for(var key in googleCalendarEventsObjects) {
    googleCalendarEventsObjects[key].deleteEvent();
  }  
}

function addEvents(googleCalendar,timetreeEvent) {
  var title = timetreeEvent.attributes.title;
  var options = {
    //予定の説明欄にtimetree側のeventIdを入れておく。修正や削除判定に利用
    description: timetreeEvent.id
  }
  
  var nowDate = new Date();
  
  if(timetreeEvent.attributes.all_day){
    //終日予定
    var startDate = new Date(timetreeEvent.attributes.start_at.slice(0,10));
    var endDate = new Date(timetreeEvent.attributes.end_at.slice(0,10));
    
    
    //終日予定が複数日にまたがるかチェック
    if(timetreeEvent.attributes.start_at == timetreeEvent.attributes.end_at){
      //1日のみの終日予定

      //終了が過去のものは追加せずにスキップ
      var tmpDate = new Date();
      tmpDate.setDate(endDate.getDate() + 1);
      if(nowDate > tmpDate){
        return;
      }
      googleCalendar.createAllDayEvent(title, startDate,options);
    }else{
      //2日以上の終日予定
      endDate.setDate(endDate.getDate() + 1);//createAllDayEventの不具合?終了日が1日少なくなるので加算
      //終了が過去のものは追加せずにスキップ
      if(nowDate > endDate){
        return;
      }
      googleCalendar.createAllDayEvent(title, startDate, endDate,options);
    }
  }else{
    //時間指定の予定
    var startTime = new Date(timetreeEvent.attributes.start_at);
    var endTime = new Date(timetreeEvent.attributes.end_at);

    //終了が過去のものは追加せずにスキップ
    if(nowDate > endTime){
      return;
    }
    
    //予定を追加
    googleCalendar.createEvent(title, startTime, endTime,options);      
  }
}

これにて「アレクサ今日の予定は?」が実現しました。めでたしめでたし。

ハロー・ワールド 藤井太洋

藤井太洋「ハロー・ワールド」

2018年マイベストワン

SF小説というジャンルで扱われているが全然未来感のない現代の物語

現役エンジニアの人が読むとめちゃくちゃ面白い!絶対読むべき

なにせ作中に出てくる用語やツールが、馴染みのあるものばかり
macbookを使いslackで連絡を取りgithubでコードを共有する
サーバにはAWSを使いマストドン(むしろ懐かしい)やドローンも出てくる

主人公は自称「何でも屋」のエンジニア。この手の物語にありがちなスーパーハッカーではない
Swiftは難しいからJavaScriptを使うと言ってしまうような普通レベルのエンジニア

収録されているのは5つの短編で、1つ1つは50ページくらいなので読みやすい
主人公がトラブルや事件に巻き込まれて、その問題をどうやって対処してくかというストーリーが基本
特別な能力のない主人公だけど「巻き込まれ力」だけは特A級


ハローワールド

表題作
不器用ながらも仲間と作った広告ブロックアプリが突然インドネシアでヒットしたところから主人公の巻き込まれ力が発揮される
登場人物の紹介的な意味合いもあるけど、この短編シリーズを通しての「インターネットは自由でなくてはならない正義感」が込められてる

特定の国家や団体が情報を収集するのはFacebookにしてもGoogleにしてもCIAにしても秘密でやってることがバレるとスキャンダル

※関係ないけど現実世界の日本ではホワイトハッカーさんが秘密裏に改造したノードでIPアドレス収集しまくっても賞賛されるのは何故なのか


行き先は特異点

アメリカ出張中の主人公がレンタカーで山道をドライブ中にGoogleの自動運転車にカマを掘られるところから始まる
センサー満載の自動運転車にカマ掘られる安定の巻き込まれ力
なんでこんな事故が起きたのか、終盤で技術的に面白い説明がなされる
わりと詳しい分野だったしフォーマットも見たことあるはずなのに思いつかなかったネタ


五色革命

タイのバンコク出張中に大規模なデモとクーデターに巻き込まれ道も空港も閉鎖されて滞在先のホテルから出るに出られないタイプの巻き込まれ
小道具としてドローンが出てくるけど、その性能は未来感ある
「豊かさ」と「自由」には関係性がないという事実は特に若者にとって辛い現実となる話
それにしても主人公はラノベのようによくモテる


巨像の肩に乗って

皆さんは「マストドン」を覚えていますでしょうか?

「もし中国でTwitterが利用できるようになったら?」という話
他のFacebookやインスタが使えないのにtwitterだけ中国の国内で使えるようになったとしたら何が起こるのか
カンの良い人なら思い当たる理由によって作中ではtwitterのアカウントを削除する人が次々出ることになる
その避難場所としてマストドンが表舞台に出るという歴史のif展開

書いてて気がついたけど、この話だけ主人公は巻き込まれてない

『インターネットは自由でなきゃならない』

この本の中で一番響いたフレーズ


めぐみの雨が降る

マレーシアで開催されたフィンテック(金融技術工学)イベントに日本からのゲストスピーカーとして招待された主人公。なんやかんやで巻き込まれる
ビットコインの詳しい説明とその歴史が物語の中で説明されてて、その辺にある胡散臭いブログよりよっぽど詳しい

世界で一番電子決済が進んだ国である中国が後半の舞台
お店だけでなく屋台ですらスマホのQRコードで決済できるのは小説の中の架空の話じゃなくて中国の現実

技術的にも政治的にもエレガントであるはずのビットコインが投機の対象となっていることを作者である藤井太洋が嘆いて小説にしたんじゃないかと思えた


以上、5つの短編

そのどれもがある種エンジニアへの「踏み絵」になりえる

作中の取り組みをどう見るかによって、全く違う印象になるかもしれない

5年ぶり帰ってきたコミュニティの水は澄んでいたという話【JAWS FESTA 2018】

11/3に吹田スタジアムでJAWS FESTA 2018が開催されました

写真提供:虎

会場まじ凄かった

ここ最近は登壇やゲストスピーカーで呼んでもらえたりなどで参加している感だけはだしていましたが、コミュニティイベントにスタッフとして参加するのは実に5年ぶりでした

当日の朝の受付の準備でDoorKeeperのアプリを立ち上げたら、5年前のJAWS FESTA 2013懇親会受付の状態で起動して「最後にスタッフ参加したの5年前だったんだ。益子さんと一緒に懇親会の受付したなぁ」と

5年前の受付の様子。2013年京セラドームにて

ひさびさのJAWS-UGは知らない人だらけ

もちろん古くからの知り合いもまだまだ居るのですが、なんというか中心に居るのは知らない人たちばかり

コミュニティって昔は地理的に縛られたものだったわけですよね
村とか地域の組合とかが地域に縛られたコミュニティでした

こういった村的なコミュニティでは、古参メンバーが幅を利かせてしまうことが多かった。むしろ古参が幅を利かせるのが自然だったように思います

インターネットの登場で、地域に縛られず「興味」という軸で人が集まりやすくなって新しい形のコミュニティが形成されました
JAWS-UGもそんなコミュニティの一つなのですが、ここではコミュニティへの貢献が全てであり新参も古参も関係ない!という精神をビシバシ感じたわけですよ

そんな感覚を抱きながら友岡さんの基調講演を聞いたわけですが、ここで語られたオープンソースの思想で私の感じていた感覚がなんと言語化されたのです

Give & Take という発想はない
Giveし続ける権利を必死で守る
Giveすることを排除する組織と戦う

ここのところ感じていた感覚をコレほどまでに端的に言語化いただいて、ほんと友岡さんには感謝しかないです

技術コミュニティに限らず最近流行りのオンラインサロンでもなんでもいいのですが、参加しておいて「なんかうまく活用できない。GiveばかりでTakeがない」とかほざいている人は滝に打たれながらGiveについての考えを改めたほうがいい

役ただずならコミュニティでの影響力は下がりますし、むしろ老害ならコミュニティからは速やかに排除されるべきです
Takeしてやろうなんて発想をのさばらせておくと某CMSコミュニティみたいに、その役割を終えることになっちゃいます。詳しくは知らんけど

ひさびさに戻ってきたから余計に皆がGiveしている姿を強く感じたんだと思います

また、コミュニティに新しい人が入ってくること自体も驚異的で、よくある技術コミュニティの問題として新しいメンバーが入ってこないてのがあると思うんですよ
参加者も固定化されて蛸壺化するような事例も多いと思います
JAWS-UGは、AWSが強烈な魅力を放ってくれているおかげで新しい人の獲得をやってこれたというのはあるのかなと思います

コミュニティに戻った私を「鮭が川に帰ってきてくれたみたい」と形容いただきましたが、皆さんがJAWS-UGという川を綺麗にしてくれていたから戻ってこれたんですよ

ありがとうございます

カテゴリー: AWS

CMC_Meetup 大阪キックオフ

ブログ書くまでがCMCって小島さんが言ってたような言ってなかったような

小島さんが綺麗になった伊丹空港に降り立ったのをFacebookで見かけて
「あー、そうかCMC meetup大阪あるのか」と気が付いて時間もあることだし顔出してきました

会場はグランフロントのXSERVERさん

オシャレなオフィス=受付にバーカウンター の法則
業務ではAWS、個人ではさくらインターネット派なのですが、何かのご縁とパンフだけは貰っておきました

ということで小島さんのターン

※コミュニティマーケティングについてはこちらもご参照ください。
「広告費ゼロで新規顧客を獲得できるコミュニティマーケティングって何ですか?」(Web担)
https://webtan.impress.co.jp/e/2018/03/07/28085

オンラインで知っていたので、オフラインでお話聞けて良かったです

その後、神戸のAlexaDaysの懇親会でお会いした大学生が登壇していたのですが、なんか知らない間に別人のようになってました


悪い大人たちのせいでコミュニティに巻き込まれた実例を目の当たりに。ほんとビックリした

最近ひさびさにこうやってコミュニティに顔出すようになって実感しているのですが、続いてるコミュニティって新しい人だらけですよね
むしろ昔の人とか全然いなかったりして、巻き込み巻き込まれ発展していってるんだなと常々思います

あと、11月のラスベガスのre:Inventに行こうと誘われたわけですが、AWSの中の人でもない人たちが純粋に誘ってるのは「これ!今のこれが、コミュニティマーケティング!」って感じでした

それなりに良いプロダクトなら絶対にファンはいると思うんですが、まぁ普通はバラバラだったりするのは問題ですよね
バラバラに存在しているファンを束ねるために、今回のようにオフラインの場が1回あるだけで動くこともありますしね

 

re:Inventは前向きに検討します。(行けたら行くわ)

LTE Cat.M1には可能性を感じる件

先週、組み込みとIoTのイベントに行ってきました。

http://www.jasa.or.jp/etwest/

元通信業界の人間としてLTE Cat.M1に期待するところがあって、業界の温度感というか、そういうの見てみたかった感じです

実際行ってみたら、驚きのワイシャツの白さ(洗濯CM並感)だったでした
いつものラフな格好とコート&シエルのリュックスタイルだったので、ブースの説明員の人が「コノ人、声かけていいのか?」と判断迷ってるのを感じた

いろんなブース回っていると、どんな立場や業種なのか聞かれるわけですよ
「エッジ(デバイス)側の人ですか?」みたいな

そんな時は「クラウドの方から来ました」で乗り切っていました。嘘は言ってない
IoTのデータはクラウドで処理というのが定番のようで「クラウドから」は全然通じてた

ブースうろうろして感じたこと

とりあえずIoTやりたいからって「画像処理でディープラーニングして工場のラインを自動化」とか溢れすぎてて、そんなみんなで同じもの作っても売れないよね

NFCとか規格マッチョすぎ、もう人類はQRコードで決済システム十分だと思い始めてないか?

Cat.M1について

そもそも LTEと言えば5Gでしょとなりがち
5Gは高速大容量で期待もされてるし、サービスインしたら魅力的なユーザー体験が訪れるんだろうなとは思う
ただ、5Gを使うほどのコンテンツって限られてしまうと思うんだよね
例えば、リアルタイムでのVRスポーツ観戦とか面白い体験なんだろうけど、そんなに毎日要らないでしょと

高速な5Gとは、いわば真逆の規格がカテゴリーM1(Cat.M1)
低速な代わりに低コスト、省電力
ドコモでは今年中にサービスインの予定

Cat.M1のような低速だけど低コストのような通信規格は結構たくさん出てる
LoRaとかSigfoxや、NB-IoT

その中でも、Cat.M1が個人的には良いなと思うポイント

・セルラー回線なので、ほぼ全国カバー
・移動してもつながる

まぁ利用用途によって選べばいいんだから、どの方式が優れてるとかない
それでも、この2点は「その辺にあるものを繋ぐ」という利用用途では強いと個人的には思っている

今までは、「繋ごう」と思うとwifiとか設定してたわけですよ
パスワード入力したり、AOSS使ってみたり

ディスプレイない機器はもっと大変
Amazon ダッシュボタンみたいに超音波使ったりとか、NetureRemoでも専用アプリから設定とかね

ハッキリ言ってめんどくさいわけですよ
それどころか、パソコン詳しくない普通の人にとって見れば絶望的に「繋がらない」世界なわけですよ

そこへ、Cat.M1のような「sim刺さっててたら通信出来ちゃいます!」
って存在がくると、キャズム超えちゃうんじゃないかと思いません?

LTE4G/3Gのモジュールは5000円とかしてたわけですよ
そんなんでは、数千円の商品に3Gモジュール載せようとか誰も考えない

それに対して、Cat.M1のモジュールって500円くらい
これなら製品に乗せるかどうかの選択肢になりえると思う

「その辺にあるものを繋ぐ」で特に可能性を感じるのは、個人的には「遊び」
その辺のおもちゃが繋がったら楽しいなと思うのは、現実と仮想のクリスマスツリーにも通じてる

通信モジュール入りのボードゲームで一緒に遠くの友達と遊べたりとか
SDカードなんか使わなくても、音声データ追加出来る妖怪ウォッチとか
そういったモノこそ普通の人に望まれてると思う

このへん書くと長くなる

simもSORACOMさんのおかげで、すごく良い市場が出来上がっている
SORACOMが無かったら日本の通信業界の未来はもっと暗かったと本気で思う

そんなこと考えていたらタイムリーなことにSORACOMからCat.M1のIoTボタンが発表された
https://soracom.jp/registration/soracom_ltem_button/

ということでSORACOM最高!という話しでした。(あれ?)

<直交> Orthogonal 3部作について

 

イーガンの<直交> Orthogonal 3部作を読み切った
めちゃくちゃ難解だったけど、読んでよかったと素直に思えた

「謎技術でワープできます」というチープなSFを完全に置いてけぼり
作品独自の物理法則を定義して数学の力で物語の中の科学者が世界のなぞに挑んでいく

作中の世界設定を正面から扱う姿から圧倒的な説得力に満ちた世界観が広がる
現実の科学史にほぼ対応するような実験結果が作中で行われことでリアリティが半端ない

もちろん物理法則の違いから異なる結果になることもあるが、「作中の宇宙ではそういうもんだ」と読み進めていけば何とかなる
バーナード嬢曰くでもイーガン作品を読むにあたって以下のように紹介されている

ハードSFを読むうえで求められるリテラシーとは
「難しい概念を理解できる知識を持っているか」ではない

「よくわからないままでも物語の本質を損なわずに作品全体を理解するコトが可能な教養のラインを感覚で見極められるかどうか」・・・・・・だ

とはいっても、「分からない」にも程があった
おおよそ我々の宇宙での物理法則と作中世界での物理法則の発見の対応は以下の通り

(1巻)クロックワーク・ロケット:特殊相対性理論
(2巻)エターナルフレイム:量子力学
(3巻)アロウズ・オブ・タイム:一般相対性理論

読んだら考察ブログを書こうと考えていたが、「考察」をしようなんて考えが甘すぎた

1巻の巻末に公式の「虎の巻」が収録されており、丁寧な考察というか世界設定に対する数学的な説明がなされていた
正直、この丁寧な解説を読んでも理解できているか自分でもよく分からなくなったけど、まぁ吐き出すために書く

この<直交>シリーズは、我々の宇宙とは「ちょっとだけ」物理法則が違う宇宙が舞台

物理法則のちょっとの違いとは、、<直交>宇宙では時間と空間を等価に交換できるということ
「虎の巻」を参考にプログラムにするとこんな感じ

// 我々の宇宙で空間を移動した人の主観時間
主観時間 = sqrt(時間^2 – (距離/光速)^2);

// 直交宇宙で空間を移動した人の主観時間
主観時間 = sqrt(時間^2 + (距離/光速)^2);

直交宇宙では移動前の系の時間に対して、移動した側の主観時間が上回るので「未来」を進むことができる
つまり我々の宇宙の相対性理論のちょうど逆になっている

我々の宇宙において光速に近い速度では2項目がマイナスに作用することで「主観時間」が減少する。
光速に近い宇宙船で地球に戻ると減少した主観時間では1年しかたってなくても地球時間で100年たっていたというSFでありがちな現象が起きるわけだ。

しかし直交宇宙では2項目がプラスに作用して「主観時間」が増加する
光速に近い宇宙船で地球に戻ると増加した主観時間では1年たっていても地球時間では1日しかたってないという逆ウラシマが起きる

この逆ウラシマが3部作を通しての物語の中心になる

このプラスマイナスの違いの部分は、我々の宇宙ではローレンツ因子として定義されている部分(たぶん)
ローレンツ因子と含む式として、相対論的質量の式に当てはめてみると

// 我々の宇宙の相対論的質量
運動している系の質量 = 静止質量 / sqrt(1 – (速度/光速)^2);

// 直交宇宙の相対論的質量
運動している系の質量 = 静止質量 / sqrt(1 + (速度/光速)^2);

速度を光速に近い値にして計算してみると、我々の宇宙では質量が大きくなる
このため我々の宇宙では速度を上げていくと質量が増えていき運動量を上げることが困難になっていき、ついに光速では質量無限大になるため光速を超えるのは式の上では不可能

対して、直交宇宙では速度が上がるにつれて質量が軽くなる!
光速に到達することが可能なうえに、さらに速度を得ることが可能となる

このように直交宇宙の光速に近い慣性系の解釈には、我々の世界の特殊相対性理論のほぼ逆と理解すればよく、1巻までは中高校生レベルの数学で付いていくことができた

1巻では最終的に山まるごと宇宙船にして飛ばすという計画を実行するのだが、作中の様子を見るにコンピューターは存在しない時代で紙とインクで計算をしていた
我々の世界での宇宙開発も最初期は似たいような感じだったことを考えると「なくはないかな」という感じではある
それでも9000メートル級の山を1つ第3宇宙速度で打ち出すというのは、直交宇宙の物理法則があってこそだ
ちなみに、テストを兼ねた有人ロケットの初試験では死者が出る。ロケット開発史として、その過程がとてもリアル


2巻になると、いよいよ分けわからなくなるのだけれど、作中の鏡が粒子にさらすと不連続に曇っていく現象なんかは我々の宇宙の光電効果だろうとか、この現象を説明する過程で出てきた比例定数であるパトリジアの定数は我々の宇宙でのプランク定数なんだろうとか、なんとか対応付けすることで理解の助けにはなった

とはいえ、そもそも我々の宇宙の量子力学が直感的に理解しがたい内容なので、直交宇宙の量子の振る舞いも謎だった

タイトルであるエターナルフレイム<永遠の炎>が発見されるのだけど、これってE=mc^2が直交宇宙ではマイナスになってるからという理解であってるのだろうか?
我々の宇宙では質量をエネルギーに変換できる。例えば核反応や反物質との対消滅でエネルギーが取り出せる

直交宇宙では逆になって質量を獲得するとエネルギーが増える(という理解であってる?)
増えた質量は光として放出することで辻褄を合わせたシステムがエターナルフレイムなんだろうか。このあたりは自信ない

作中では反物質との対消滅でエネルギーが生成されたような描写があるし、この解釈は間違っているのかな


3巻アロウズ・オブ・タイムは、「時間の矢」を扱う
特殊相対性理論に加速系まで拡張した一般相対性理論もここから
恒星の重力を使って理論の検証をするところは我々の科学史と同一でこれまたリアル

ロケットの進行方向が折り返し地点で減速、その後加速して逆転
この加減速にあたって我々の世界での一般相対性理論に対応していく感じだろうか

宇宙全体の曲率から宇宙の形を求めていく部分は、残念ながらさっぱりだ
直交宇宙はその性質から有限である必要があるという前提そのものが分らんかった。。。

直交宇宙の物理法則を活用することで未来からの情報を得る<メッセージシステム>と、未来の自分からのメッセージを受け取ってしまった人がどうなってしまうのかの哲学的思考実験は楽しめた

3巻まで来ると物理法則と数学が大学院レベルに到達。それでも物語そのものが面白く読み切れた
時間の矢が反対の惑星に降り立った時の足跡の描写とか、どんな想像力があればあんな魅力的な文章にできるのか

ここらで力尽きた。また考えまとまって時間あったら何か書くかも

JAWS DAYSに行ってきた話

ブログを書くまでがJAWS DAYSということで書きます

JAWS DAYS 2018

Amazon Web Services のユーザーグループが主催している年1回の大規模イベントJAWS DAYS

2月に神戸で開催されたAlexa Day 2018のスキルコンテストで優勝したときに、今回のJAWS DAYSでのLTの特別枠を頂けたので参加しました

というわけでスピーカー参加

Alexa Ninjaですって!カッコいい

もちろんAmazon Alexaのシャツ着用

 

数年ぶりのJAWS DAYS参加だったんですが、とにかく人多い

上の写真のような会場が9つも隣接していたのですが、人気のセッションは立ち見が出ていました。1400人ほど来場していたようです

個人的に衝撃だったのが、受付時に全員に渡されるレシーバー

海外ゲストのセッションもあったので同時通訳にも使われていましたが、それだけではありませんでした

今回の会場は、大きな空間を200人~300人ほど収容スペースになるようにパーティションで区切ってセッションブースを作成していました

このようなレイアウトだと、隣接するセッション会場同士がオープンにつながっているため、普通だったら隣の音が聞こえてしまうはずです

同じようなレイアウトで開催していた過去(ほんの数年前)のイベントでは課題として上がっていたかと記憶しています

レシーバーを全員に配布することでセッション会場ごとにチャンネルを分けて隣接するセッションの音を分けることができるというのは、まぁお金さえかければできるよねって感じだったのですが、ユーザーコミュニティのイベントでやってしまうのはホントすごいですね

コミュニティの活動を離れている間に、こういった細かい課題を解決するノウハウが蓄積していったんだなと感じました

お昼は、お弁当とお茶が参加者へ無料で配られました

受け取った人は、とりあえず座って食べるためにセッション会場にたくさん置いてある椅子に座りますよね

そこで、このお弁当代を出したといっても過言ではないスポンサー企業がランチセッションと称して、10分程度の発表を行う

参加者は、座る場所と食事が得られてハッピー

スポンサーは、今回のようなイベントに参加する熱量の高い参加者に自社を直接アピールする機会を得られてハッピー

運営は、お昼に会場の外に参加者を出さずに会場内で完結さえることができてハッピー

誰も損してない!Win-Win-Winですね。

むかしはランチセッションなんてなかったように思うのですが、いろいろ工夫してるんだなと思いました

午後からは、会場内をウロウロと

AWSかるた遊んだり

記念撮影してみたり

 

7年ぶりにJeff Barrさんにも会えました

大阪の居酒屋で一緒に撮った写真を見せたら覚えていてくれたようでした

Jeffさん、1日中こうやって誰かと写真撮っていましたね。いい人だ


懇親会

懇親会は、A,B,C会場をぶち抜いて行われましたが、これまた人多い

同じ会社のエンジニアの子も参加していたはずなのですが、お互い1日中会場にいたのに会えたのは、この懇親会の直前

次に会えたのは帰る間際

特定の誰かに会うの大変でした

お会いできなかった人もいて残念(玉川さんとか)

懇親会のLT大会では、AWS芸人の清水さんの人類代表クラスのLTのあとでしたが、なんとか会場を沸かせることができたと思います

ただ、自分がLT大会の投票外だったのを知らず「投票してください~」て言ってて恥ずかしかったです

LT資料

動画


ひさびさのJAWSのイベント参加でしたが、ホントにコミュニティの成長を感じました

古参メンバーが中心てこともなく、ちゃんと課題を翌年の新しいメンバーに伝えていきノウハウを蓄積して、洗練され組織化されたコミュニティに成長してるんだなと

7年前の大阪の居酒屋での1枚

「ここにきている人たちは自分のパッションでここにいる」みたいなことジェフが言ってましたが、そんな人たちがこの写真を撮ってから7年で千数百人も集まるなんて、なんか感無量

数年ほどコミュニティから遠ざかってましたが、また恩返しができるように少しずつ関りを増やせたらなと思います

カテゴリー: AWS

コンテストで大賞をとった話

MaBeee祭 2017というコンテストで大賞をいただくことが出来ました!

人生の中でコンテスト出て大賞なんて、そうそうない経験なので備忘録としてブログにまとめておきます

 

  • コンテスト出場の理由

去年の12月に個人的な思い付きと目標として子供たちのために現実のクリスマスツリーとマインクラフト内のクリスマスツリーを連動させようとしました。(詳しくはコチラ

プラグイン作成だけで無事動き、子供も喜んでくれて楽しんでくれましたがクリスマスツリーの片づけとともに忘れ去られていました。

その後、たしか6月ごろだったと思うのですがMabeee祭の一次エントリーをMakuakeからのメールで偶然見かけ、「去年作ったツリーのやつ応募してみようかな」とエントリーすることに。

エントリーの時点でモノは出来ていたので心配はなかったのですが、別の心配が一つ。

最終選考まで残ったら作品もって東京に行かなければならないと参加規約に書かれていましたが、妻が第三子を妊娠中で順調にいけばコンテストがあるのは妊娠9ヶ月あたり。

第二子の時は切迫早産気味で妊娠後期には一時入院もしていたことを考えると心配ではありました。

一次選考通過後、妻に相談したところ快く行ってきていいよとのお言葉。ありがたいです。

その後、コンテストまで作品の展示用の手直しと動画作りを準備していました。

 

 

  • コンテスト当日

9/16の朝、スーツケースにクリスマスツリーを詰め込み伊丹空港に向かいました。

台風が近づいてる3連休に季節外れのクリスマスツリー持って、我ながら何してるんだろう

台風の影響もなく飛行機は順調に飛び、12時前には到着

会場はスマートニュース本社

さっそくクリスマスツリーの準備をします。

開始時間まで1時間ほどあったので、他の参加者の作品もチラチラ見て回りました

お隣さんの作品

 

VRゴーグルで操縦席の視点を体感しながら操縦できる作品

ザクは偉い人の指示で付けた飾りだそうです

 

 

こちらは対戦ゲームな作品。材料はほとんど100均だそう。

他の作品でも100均とソレノイドスイッチの万能ぶりを痛感しました。

 

筋肉の動きを感知するセンサーを付けての紙相撲

実際に体験させてもらいましたが、ぐっと力を入れると動き始めるのは凄かったです。こんなセンサーも買おうと思えば個人でも買えるのは凄い

 

全体で40作品ほどあり、ゆっくり他の作品も見たかったのですが自分の作品の説明もしないとだったので時間が足りませんでした。残念

 

コンテスト開始です

スタッフの人は青いTシャツ着ていました

 

一般参加の人に作品の説明をしたり、動画撮影やプレスの方からインタビューを受けたり

作品の説明を繰り返していたら、あっという間に審査発表の時間に

まずは各審査員賞が発表されます。

 

正直、せっかく参加したからには1つくらい賞取れたらいいなぁ~。家族のもとに手ぶらでは帰れないなぁ~。なんて考えていましたが、次々と発表される審査員賞では呼ばれず。

 

わりとガッカリしながら迎えた最後の大賞の発表

 

 

 

自分の作品が呼ばれたときは、聞き間違えかと思ったほどビックリしました

こんなことなら全身サンタコスチュームで待機しておくべきだった

賞状なんて貰ったの何年ぶりだろう

 

大賞の賞品で頂いたBOCCO

家にいる子供と外にいる親のスマホを繋いでくれるメッセージデバイス。小学生の子供がいるので使うの楽しみ!

 

その後、懇親会が始まりました。

まずはMaBeeeケーキを囲んでみんなで写真撮影

 

審査員の方々と作品についてお話させていただきました。審査員全員が私の作品を評価してくださったみたいでホントにありがたいことです。

あと「amazonでヘリウムガスがタンクで買える」という情報を得たのが衝撃でした。

 

ノバルスのCTOの方からプロトタイプのMaBeeeを見せてもらいました。

3Dプリンターで外枠を作り2種類の基盤を無理やり組み合わせて作ってたそうです。

なかなかの手作り感

 

ここのところ仕事ではクラウド最高ということでハードからは遠のいていましたが、やっぱりモノはいいなぁと思いました。

 

子供のために作ったモノが、こんな形で評価をいただけてホントに嬉しかったです。

 

子供の笑顔プライスレス

Scratchを使ってみた

プログラミング開発環境Scratchをさわってみたので、その記録

どうせなら子供と一緒にやろうかと思ったもののITリテラシーの低い我が子たちはiPhoneでマインクラフトが限界で、PCのマウス操作ができないので今回は見送り

ブラウザさえあればScratchのプログラムは作れるけど最低でもタブレットを要求されるようで、iPhoneでは動かないみたい。iPadかなにかを買ったら再挑戦しよう

Scratchさわってみた感想は、さすが「マサチューセッツ工科大学のメディアラボが作成した初心者の学習用プログラム言語」、非常に洗練されている

特にリファレンスに頼ることもなく適当に作っても動くものができた。それがコチラ

※iPhone/iPadでは動かないです。PCかFlashが動くAndroid推奨

※音を出さないと意味不明かも。ペンとかクリックしてね。

 

Scratchつかってみて感銘を受けた特徴を書き出してみる

  • 変数は宣言しただけで画面に表示される

    例えばマウスクリックで「Score」という変数を作ると、まずは画面に「Score 0」表示される。画面やコンソールに変数の内容を表示するための(初心者にとって)オマジナイのようなコードは不要。簡単に画面から非表示にすることもできるけど「変数を作ると画面に表示される」がディフォルトであるとか、初心者の気持ちわかってる感がステキ。デバッグも楽

  • オブジェクト指向という考え方を身につけられる

コードは背景画像(ステージと呼ぶ)かキャラクターなどの画像(スプライトと呼ぶ)にしか書けない。あるキャラクターを動かしたかったら、そのキャラクター画像のスプライトにコードを書かないといけない。自然とプログラムをステージやスプライトといったオブジェクトごとに書くことになる。また「何を動かすのか」が解決済みなのでコード部分で指定する必要がないのでシンプルにもなる。ちなみにScratchがオブジェクト指向言語であるかどうかの論議があるらしい。怖いね

  • メッセージ駆動を自然と覚えられる

イベントとしての「メッセージを送る」「メッセージを受ける」が、それぞれ1つのブロックで表現されるので非常に使いやすい。他のオブジェクトに影響を与えたい場合はメッセージを使うことになるのでイベントを受け取るということが自然と理解できてくる。メッセージは複数のオブジェクトで並行して受け取れるので、並列プログラムも気が付いたら組んでいたみたいなことが起きる。スゴイ

  • 「もし~なら」の条件には条件判定のブロックしか入れられない

ブロックのピースに形があってブロックの形が違う組み合わせは入れることができない。視覚的にできないことが示されるので、初心者にありがちなシンタックスエラーの洗礼を避けることができる。しあわせ

  • ブロック塊をクリックするだけで、そのブロック全体をテストできる

実行と編集の区別がないのでブロックをクリックしたら作ってる途中でも一連の処理がバンバン走る。実行されるのはブロックの塊単位なので同じスプライト内でも他のブロック群は処理されない。ユニットテストやりやすい。ステキ

  • 作品をソースコードごと世界に向けて公開できる

Scratch公式トップページで、たくさんの作品がソースコードごと公開されていてる。「中身を見る」というボタンを押すだけでソースの編集画面になり改造することができる。改造した作品はリミックスとよばれて公開される。オープンソースソフトウェアという概念を体験する分かりやすい仕組みが整っている言語がほかにあるのだろうか

 

以上

今度は書籍みながら子供とやってみようかな

オープン・オーガニゼーション

img_3222

この本を読むまで、レッドハットという会社についてあまり知らなかった。

技術力あってコミュニティに貢献しているんだろうなとは思っていたしRHELは素晴らしい。しかし会社内部そのものはよく知らなかった。

企業向けのビジネスをしているからだろうか?勝手に、よくある普通の(本書の言葉を借りればピラミッド型の)組織っぽいイメージがなぜかあった。

考えてみれば当たり前なのかもしれないが、オープンソースのコミュニティに属していて、その精神に共感している人が普通の組織で満足するはずがないよね。

オープンソースソフトウェアの世界では、影響力を持ちたければ出世するのではなく、周囲からの信頼を得なくてはいけない。そうでなければ誰も話しすら聞いてもらえない。

信頼を得るためには、何をするにしても自分がすることを周りに説明して納得してもらう。

レッドハットは理想の組織の形の一つなんだなぁ