WordPressでTwitterのJoin the conversationウィジェット→埋め込みタイムラインに切り替えるときの注意点

「 “Join the conversation” ウィジェット」提供終了のお知らせにあるようにTwitterのウィジェットが提供終了になります。

API v1.0からv1.1への移行に伴い、近いうちに ”Join the conversation”の表示のあるTwitter公式ウィジェットが利用できなくなります。今後はサイト上に簡単にTwitterのタイムラインを表示できる「埋め込みタイムライン」をご利用ください。サーバーサイドでAPI 1.1を使って情報を習得して Developer Display Requirements(英語)に従い、ウィジェットをご自分で作成いただくことも可能です

代わりに埋め込み式の埋め込みタイムラインが、ウェジェット設定ページから利用できます。

早速このブログでも置き換えてみたんですが困ったことに最小幅が220pxなんですねこれ。そしてWordPressテーマのTwenty Twelveだとサイドバーの幅が26%なので220pxを用意するにはウインドウ幅が846pxが必要になります。実際試してみたところウインドウ幅800pxくらいまでは大丈夫で、それより狭いとはみ出してしまいます。Twenty Elevenの場合はサイドバーを横に表示するのはウインドウ幅800pxからなのでギリギリ大丈夫かもしれません。

800pxくらいならまぁいいやとしたいところですが、iPadの幅が768なのでタブレットを縦向きにしてサイトを見たときに問題が発生しそうです。

そこでこのブログの対応としてはサイドバーにmin-width:230pxを設定して、サイドバーを表示する最小サイズを720pxまで上げました。Twenty Twelveだと600px以上でサイドバーを表示するのですが、Twitterウィジェット以外でも意図しないところで改行されてしまうウィジェットがあったのである程度サイドバーの幅を確保できないならおとなしくサイドバーはコンテンツの下に回りこませることにしました。

今回の修正で影響を受けるのは600〜720の間のウインドウ幅ですが、そこに入るケースよりも800px前後のタブレット(iPad)の方を優先した形です。というわけで埋め込みタイムラインを入れるときは使っているテーマにでウインドウ幅を狭めたときのレイアウトについて注意してください。

ちなみにChromeのデベロッパーツールを開いて右下のオプションを押すとUserAgentやスクリーンサイズを変えることができます。Chromeのウインドウサイズを小さくしなくてもコンテンツのスクリーンサイズだけを変更できるのでデベロッパーツールを操作しながら調整するときは便利です。

Chrome拡張機能 Manifest V2対応とInvalid manifestと格闘

2012年中に公開しているChrome拡張機能を更新しないといけない件についての件があったので風邪をひいて苦しんでいたが残っていた拡張機能のManifest V2対応を実施した。基本的にContent Security Policyにそって構成を修正するだけで問題なく対応ができたがリリース後にトラップにハマった。

対応ができてローカルで確認済み、拡張機能をアップデートして作業完了!と思ったがなかなかインストール済みの拡張機能がバージョンアップされない。数分でアップロードした内容が反映されるとデベロッパー ダッシュボードでは表示されたし、Chrome Storeで公開される内容も更新されているのだけどバージョンアップされない。

インストールしていない別の環境で試したところ

Error during webstorePrivate.completeInstall: マニフェスト ファイルが無効です。 sendRequest:22
chromeHidden.handleResponse sendRequest:22

というエラーがコンソールに出力されてインストールができないことが判明した。

browser_action > default_iconを消すと直った・・・

結論からいうと”browser_action” > “default_icon”を消すと直った。19×19のアイコンを設定していたのだけどそれがまずかったのだろうか?

Chrome右上のブラウザアクションに表示されるアイコンが何故か19×19という不思議なサイズで実行中はCanvasで書いたImageDataを反映させていたのだけど念のためデフォルトとして19×19のpng画像をmanifestの”browser_action” > “default_icon”に設定していた。background.jsで描画しているのでdefault_iconを消してみたところ更新ができるようになった。

サイズなのか画像が悪かったのかよくわからないがとりあえず結果オーライとした。

その他Invalid manifestにまつわる話

いろいろググったのだがいくつかこのマニフェストファイル問題にまつわる話があるようだ。大きく分けるとアップロード時にコケる問題と、インストール時にコケる問題があって、今回ハマったのは後者の方なのだが後者に関する解決方法は見つけられなかった。

前者に関していうと、文字コードがおかしいファイル名などが入っていると失敗するという話と、無圧縮でzipにしてアップロードしないと失敗するという問題があるらしい。

わらにもすがる思いでantのzip, OSXの圧縮, WinRARの無圧縮zipとすべて試したけど今回の問題には関係無かったしアップロード自体はできたのでzip圧縮作法に関する問題は現在は起きていないように思えた。

Testerアカウントを使ったテスト方法

現在のChromeデベロッパー ダッシュボードには任意のGoogleアカウントにだけ公開できるようなテスター機能が追加されている。そしてChromeには複数のGoogleアカウントを切り替えて使う機能が追加されている。

ChromeではGoogleアカウントごとに設定(拡張機能を含む)が保存されるのでこの2つを組み合わせると開発用とテスト用のGoogleアカウントをChrome内に混在させることができて、新規インストールやアップデートインストールなどを検証したかったので今回はこれを活用した。

どうでもいいけど、アップロードはできるけどインストールがコケるという問題をテストする場合、何回もバージョンアップして試さないといけないのでものすごく不毛な作業を繰り返していた。このあたりローカルでも問題が再現できるようにしてほしい。

仕事とプライベートをChromeのアカウント切り替えで両立する

最近Google Chromeのアカウント切り替えを活用するようになった。よくよく調べてみるとGoogle Chrome 16、つまり一年前にはリリースされていた機能なのだが目に止まったのは数ヶ月前でなにやら右上のアイコンか何をクリックするとアカウントが切り替えられるようになっていた。

このアカウント切り替え機能がなかなかの作業効率を生み出してくれている。

Retina MacBook Pro(私物)を購入してから調子に乗ってこれで仕事のコードも書いたりしているのだけど(上の人が良いって言ってるんで規則的な話は知ったこっちゃ無い)もともと私物のマシンで開発をしたくなかったのはアカウントがごっちゃになるという点だった。例えばiOS Developer Programにしても個人のアカウントと会社のアカウントを持っているのでそれがごっちゃになって混乱してしまう。混乱しないようにSafariとChromeを使い分けたりもしていたのだがそれはそれでわかりづらい。もちろんChromeのアカウント切り替えがその問題のすべてを解決してくれるわけではないけれど、アカウントに設定できる画像やChromeのテーマによってある程度は関連を理解することができる。

仕事に割り込んでも割り込ませない

調子になって仕事用に取得したGoogleアカウントでGmailアドレスを取得し、会社のメールアドレスをGmailで読めるようにした。.fowardで転送とかそういうことをしなくても今時のウェブメールはPOP/SMTPに普通に対応したメールクライアントになっているようだ。確かにこうなってくるとThunderbirdも新機能の開発辞めたくなるよな。

もともと会社のメールを読めるようにしていなかったのは、そのためにメールクライアントをインストールするのが面倒という点と、仕事のメールなんかプライペートで見たくないという点だった。前者はGmailが解決してくれる。後者はどうか。

実は仕事のメールなんかプライベートで見たくないというのはよく考えると正確じゃなくて、私物のマシンで開発できる時点でプライベートな時間に仕事ができる環境をすでに許している。重要なのはそれをするかどうかを決めるのは自分であって、会社であったりプロジェクトの都合ではないというところにある。

つまりメールにしても俺が読みたいときは読むけど、会社のメールが勝手に割り込んでくることは許さん。ということである。これもアカウントの切り替えによって守ることができて仕事の割り込みをさせたくなければChromeのアカウントを切り替えなければ済む話だった。

アカウント切り替えのショートカット

Windows のキーボード ショートカットによるとCtrl+Shift+MMac のキーボード ショートカットによると⌘-shift-Mでアカウント切り替えのポップアップが表示されるので上下カーソルを使って選択し、切り替えることができる。ウインドウを見失ったときはこれを使うのが良さげ。

世界時計のChrome拡張機能のmanifest version 2対応でやったこと

2012年中に公開しているChrome拡張機能を更新しないといけない件についての対応で世界時計のChrome拡張機能をアップデートしました。

World Clocks

manifest version 2対応でやったこと

実際のところはmanifest version 2対応より、ずっと放置していたレビューを読みなおして要望にいろいろ対応したのとChrome Store向けの画像作成の方が時間がかかっているのだけど・・・とりあえずmanifest version 2で対応したことについて。

manifest.jsonの変更

変更部分の抜粋です。

manifest.json(manifest ver1)
  "background_page": "background.html",
  "options_page": "options.html",
  "browser_action": {
    "default_icon": "icon.png",
    "popup": "popup.html"
  }
}

manifest_versionを指定して、content_security_policyを追加。background_pageをbackground:pageに変更、browser_action:popupbrowser_action:default_popupに変更。

manifest.json(manifest ver2)
  "manifest_version": 2,
  "content_security_policy": "script-src 'self'; object-src 'self'",
  "background": {
    "page": "background.html"
  },
  "options_page": "options.html",
  "browser_action": {
    "default_icon": "icon_16.png",
    "default_popup": "popup.html"
  }
}

外部サイトのスクリプトを拡張機能に同梱

manifest.jsonのcontent_security_policyで外部URLを指定せず、すべてのファイルを拡張機能に持つことに。

background.html(manifest ver1)
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
background.html(manifest ver2)
<script src="jquery.min.js"></script>

粛々とhtmlから別ファイルに分離

Content Security Policyではhtml内に直接cssやscriptを記述することを禁止しているので外部ファイルから呼び出すように修正。

background.html(manifest ver1)
<script>
(function($){
    $(document).ready(function() {
....
    });
})(jQuery);
</script>
background.html(manifest ver2)
<script src="background.js"></script>

ライブラリのprototypeを上書きしてContent Security Policy対応

恐れていたのが使っているライブラリのファイルがContent Security Policy対応できていないパターン。

coolclock.js
nextTick: function() {
  setTimeout("CoolClock.config.clockTracker['"+this.canvasId+"'].tick()",this.tickDelay);
},

以下のようなjsファイルを後から読み込んで上書き。

coolclock.js
(function(c){
    c.nextTick = function() {
        // Content Security Policy (CSP)
        // http://code.google.com/chrome/extensions/contentSecurityPolicy.html
        var me = this;
        setTimeout(function(){
            me.tick();
        },this.tickDelay);
    };
})(CoolClock.prototype);

こういうパターン多い気がする。

面倒ですがhtmlで沢山処理をしていなければ、manifest version 2対応はそれほど難しくはないと思います。なお、この拡張機能はgithubにコードを置いています。

初めてのWeb FontをChrome Extenstionで使ってみた

自作の世界時計のChrome Extensionでユーザからデジタル時計周りの要望の声が幾つかありマニフェストバージョン2対応に合わせて実装中。

デジタル時計に専用のフォントを適応させたいのだが、いろいろデザイン作成ツールをインストールしているため、ローカル環境にあるフォントがユーザ環境にも入っているかどうかわからない。それならばWeb Fontを拡張機能に同梱して使えばよいと思った。

Web Fontという仕様があることは知っていたが今まで使ったことがなかったので適応方法から調べた。結果から言うとファイルの配置と、cssの記述だけで済むためChrome Extensionだから特別に何かするということは必要なかった。

調べてわかったのだが、Web Fontで使えるフォントファイルのフォーマットは複数あり、ブラウザによって対応状況が違う。
http://thinkit.co.jp/story/2011/08/18/2233?page=0,1

とはいえ、Chrome ExtensionならChromeだけをケアすればよいのでとくにフォーマットで悩む必要はない。ウェブサイトについても上記を見る限りIE以外はTrueType(.ttf)、OpenType(.otf)でよさそうに見えるが、業界的にはWOFF(.woff)を標準にする流れらしい。

さて肝心のcssの記述方法。まず@font-faceでフォントを定義する。外部サイトのフォントを直接参照しないのであればcssからの相対でurlを指定すればよい。以下のように複数のフォーマットを並べることもできるようだ。

@font-face {
    font-family: 'myfont';
    src: url('myfont.woff') format('woff'),
         url('myfont.ttf') format('truetype');

}

あとは普通にfontを指定するだけ。

body {
  font-family: 'myfont';
}

気になったことを実験

調べれば分かるかもしれないが実際のChromeの動作を見てみる。Chromeのバージョンは22-dev。

Chrome Extensionからも使える?

A. Webサイト同様に使える。

システムに存在するフォント名を定義するとどうなる?

A. 後勝ち。

@font-face {
  font-family: 'Arial';
  src: url('myfont.otf');
}

独自に宣言したfont-face名も2回定義すると後勝ち。ただし、2回目で定義した時に存在しないファイル名を指定したところ1回目で定義したものが適応された。

定義したフォントが有効な空間は?

font-faceの宣言は同じcssに書かないとだめなのか、先に読まれたcssにあれば参照できるのか。

A. 全体空間で使える。

先に読み込んだcssにあるfont-faceの宣言は他のcssからも参照できたし、逆に先に読み込んだcssで指定したfont-faceを後に読み込んだcssに定義しても適応された。ブラウザが良きに計らってくれる模様。

例) main.css, sub.cssの順に読み込んでもMyFontは適応された。

main.css
p {
  font-family: 'MyFont';
}
sub.css
@font-face {
  font-family: 'MyFont';
  src: url('myfont.otf');
}

フォントの大きさとかも定義できるん?

A. できない。

http://www.w3.org/TR/css3-fonts/#font-face-rule を見る限りsrcしか設定できないようだが、mozillaのサイトではまた別の仕様が公開されていたりもする https://developer-new.mozilla.org/en-US/docs/CSS/@font-face ブラウザによってはfont-sizeが使えるような拡大解釈もあるかもしれないが、仕様の準拠が求められている昨今では無いと思われる。

まー、何がしたかったかというとLess使わなくてもfont-face, font-familyだけで管理できるのかなと少し思っただけ。んなこたーない。

まとめ

Web Fontは簡単に使える。モバイルブラウザの対応状況は少し気になるがChrome Extensionで使う分には障壁は感じないし、何より同梱すればトラフィックも気にしなくて済むのでデザイン重視の拡張機能によっては積極的に使えるんじゃないかと思った。

多分Content-Scriptで既存のサイトのフォントを変更して読みやすくしてくれる拡張機能もありそうだ。

肝心のWeb Font本体について

今回は http://www.fontsquirrel.com/fontface からフリーのフォントを探してみた。というか数字と:APMくらいなら自分でつくることも考えたのだがそれは別に機会があれば調べることにする。

Chrome Tech Talk Night #3 行ったので拡張機能の内容をまとめてみる #chromejp

一週間くらいたってしまったが 7/13 に Chrome Tech Talk Night #3 へ行ってきたので今更ながら内容をまとめてみる。

さて、内容は大きくわけると以下のものに分かれる。
1. Chrome拡張をマイグレートしないといけない話
2. 新しいChrome拡張のAPIの話
3. 新しいChrome Appの話

正直Chrome Extension Tech Nightと誤解していたので、Chrome Appの話はかなり面白かった。しかし、長くなりそうなのでこのエントリの話は拡張機能で一旦切ることにする。

Chrome拡張をマイグレートしないといけない話

Ernest Delgado(@edr)さんがわざわざ日本に来てくれて説明してくれた。内容は以下のGoogle IOのセッションと同じもの。 ( https://mkw.st/p/io12-whats-next-for-chrome-extensions/#1 )

manifest version 2に挙げないと行けない件については
Chrome Storeから拡張機能更新しろよ案内が来た
2012年中に公開しているChrome拡張機能を更新しないといけない件について
にて把握していたのである程度は聞き流した。

ここで聞きたかったのは何故そこまでしてマイグレーションすることにしたか。 拡張機能向けのAPIはChromeの様々なリソースにアクセスできたり、Ajaxでクロスドメイン制約を受けないのでXSS攻撃を受けると通常のWebサイトのそれ以上の被害をユーザが受けることになる。

これにはhttpやinlineスクリプトを禁止すると脆弱性の94%を防げるだろうという研究があると紹介された。 ( https://mkw.st/p/io12-whats-next-for-chrome-extensions/#9 ) manifest version 2で外部スクリプトの読み込みが以上に厳しくなったのはこれが根拠となっているようだ。

さらにContent Security Policy(CSP)についてはHTML5ROCKSの記事もあわせて紹介があった。( AN INTRODUCTION TO CONTENT SECURITY POLICY )

CSPは別にChrome拡張にかぎらずセキュリティを高める点で通常のサイトでも必要になってくるものだ。Googleには開発者のセキュリティ意識を教育するという面もあるんじゃないかと思う。HTML5アプリのメインとなるJavaScriptはクライアントサイドで動くものだからそのあたりの意識の徹底化は必要になってくるはず。

「過去のバージョンはmanifest versionを上げないと動かなくなる」と言われるとすごい足切りに聞こえるけど、「新しいセキュリティガイドラインを作成したのでそれに対応してもらえない拡張機能は停止します」と言われればこれはiOSアプリのガイドラインなんかで近いことはあるので納得できる。

新しいChrome拡張のAPIの話

これも Ernest さんから。まず、現在あるChrome拡張の問題として必要な機能を以上のパーミッションを定義させてしまう、拡張機能のプロセスによってリソースを大量に消費してしまうというものが紹介された。

それを改善する一つの方法として新たにEvent Pageが提供される。これを使うとsetTimeoutのようなイベントをChromeが起こしてくれるのでそれ以外は拡張機能は眠っていてよいということになる。

キーボードショートカットがサポート。拡張機能がキーボードショートカットを実現しようとするとContent Scriptをすべてのサイトに突っ込んでキー入力をウォッチしないといけないがそれが過度のパーミッションだったという話。ショートカットはmanifestに定義してコマンド名をつけておくとイベンドが通知されるのでコマンド名を見て何かするという感じ。

Web Request APIでネットワークレベルでいろいろ制御できるらしい?英語も日本語もついていけなかったのでこれについてはあとで調査が必要。

Active Tab Permissionsが追加。ユーザから見ると勝手にタブを追加されたり、削除する権限を求められるのは「ん?」ってなるから。アクティブなタブ(ページ)で何か処理したいだけという時に使うだけでよいのだろうか。さらっと流されたのでこれも説明についていけなかった。

最後にSandboxページの追加。これは先程のセキュリティの問題に絡む。Sandboxページ内ではセキュリティによる制限を受けないで処理が実行できるので他のページではできない処理をSandboxページ内で処理して結果をメッセージで受け取るということができる。具体的にSandboxで何が制約されないかはこれも調べてみないとわからない。

と、新しいAPIの紹介は以上。まだ対応中のAPIもありどうやらmanifest version 2と同期するAPIでは無いようなのでひとまずセキュリティ(manifest version 2)対応と新しいAPIの対応はひとまず別のマイルストーンで扱ってよいと思う。(セキュリティ対応次第ではSandbox Pageだけは使う必要がある)

その他参考リンク

DevelopersサイトのChrome情報
https://developers.google.com/chrome/

chrome.com(立ち上げ中とのこと)
http://developer.chrome.com/apps

githubにGoogleChromeアカウントでその中にサンプルがある
http://github.com/GoogleChrome

Chrome Storeから拡張機能更新しろよ案内が来た

2012年中に公開しているChrome拡張機能を更新しないといけない件についてにてManifest Versionを更新しないといけない件の記事を書いたがGoogleからメールでお知らせもきた。

Hello!

The last few months, the Chrome Web Store team has been working on improving the Chrome extension system’s performance and security. As part of this effort, we are making a few changes that will impact the extensions and packaged apps you have posted there. We are sending this note to make you aware of these changes and to provide some guidance on how to address these.

Manifest_Version 1: Manifest Version 1 has been deprecated since Chrome 18, and when Chrome 21 hits stable in mid-August the Chrome Web Store will no longer accept new items with manifest_version 1. Converting to manifest_version 2 should be very simple for the majority of developers, and we encourage all developers to update their extensions and packaged apps as soon as possible. Review our deprecation schedule to determine when to update your items in the store.

Ads Monetization for Extensions: We are updating our ad policies to allow extensions to monetize through ads. Please ensure your extensions are in compliance by reviewing our extension ads policy guidelines.

If you have any questions, please contact us at the developer forum.

Best,
The Chrome Web Store Team.

既存の(Manifest Version 1の)拡張機能はChrome 18から deprecated 扱いにされている。今後の扱いのスケジュールに関しては前回の記事を書いた時から変わっていない模様。

手元ではManifest Version 2の対応を進めているので対応方法の記事も後日書こうと思うが単純にManifestを変えるだけでは上手く行かないことがあり、対応工数についてはContent Security Policy (CSP)周りの対応が鍵を握ることになる。

2012年中に公開しているChrome拡張機能を更新しないといけない件について

久しぶりにChrome Extensionの開発でも再開しようと思って昔のプロジェクトをChromeで実行してみたらManifestバージョンを上げやがれという警告がでた。

この拡張機能をインストールしようとしたときに、次の警告がありました。

リンク先の内容を読むと、Manifestバージョンを2にしないといけなく、1のままのやつは以下のような対応がなされるらしい。(2012/06時点)

Chrome 21 (Beta:2012/07上旬; Stable:2012/08中旬)

  • Web Storeは新しいmanifest version 1の拡張機能をブロックする
  • Web Storeは既存のmanifest version 1の拡張機能の更新を許す

Chrome 23 (Beta:2012/09下旬、Stable:2012/11上旬)

  • Web Storeはmanifest version 1の拡張機能の更新をブロックする
  • Chromeはmanifest version 1の拡張機能のパッケージングをやめる

2013/1Q

  • Web Storeはmanifest version 1の拡張機能をウォール、検索結果、カテゴリページから削除する
  • manifest version 1の拡張機能の開発者にはメールが通知される

2013/2Q

  • Web Storeはmanifest version 1のすべての拡張機能を取り下げる
  • 開発者には最終通知がメールされる

2013/3Q

  • Chromeはmanifest version 1の拡張機能の読み込み、実行をやめる

これらをまとめると以下のようになる

  • 開発者にはおおよそ2012年中にmanifest version 2へ対応することが期待されている
  • 開発者が対応しない場合、2013年からユーザがmanifest version 1の拡張機能を見つけにくくなる
  • 開発者が対応しない場合、2013年後半からmanifest version 1の拡張機能は使えなくなる

Manifest Version 1はChrome 18で非推奨になっているらしい。18とか言われてもしらんがな。Wikipediaによると

2012年3月28日 – バージョン 18.0 が正式公開 (v.18.0.1025.142)。

なのでManifest version 2にしたら動かなくなるというユーザはいないと考えてよいのだろうか。逆にmanifest version 2の拡張機能に更新されたら困る場合はChromeが更新しないようにしてくれることを普通に期待するが。

2012/07/07追記: マニフェストにminimum_chrome_versionが書けるのでmanifest version 2の拡張機能は”minimum_chrome_version”:”18″とすれば良いかもしれない。

まず現時点で通知しろや!と思っているのだがメールをすっ飛ばしているだけで通知はされていたのだろうか。あるいはChrome 21から始まっているだけにかなりタイムリーに見つけただけでこれから通知されるのかもしれない。

2012/07/04: 無事メールによる通知がきました

具体的に何をしないといけないかは後でまとめるとしてとりあえず対応しないといけないことがわかったことだけ記録。最近Googleは過去APIの切り捨てが厳しい。

Google Chrome Extensionの作成メモ公開

Google Calendar for Todayを作るにあたってまとめていたGoogle Chrome Extensionの作成メモを公開してみます。

/memo/chrome-extension/

他のやつの言う事は信じない。信じられるのは本家のドキュメントのみ!という考えのため基本的に本家のドキュメントの抜粋みたいな感じです。他の人のメモは断固無視した自分がこんなメモを公開するのは若干矛盾していますが自分用の備忘録ということで。。。

My Google Calendar 改め Google Calendar for TodayをGoogle Chrome Extensionでリリース

Yahoo WidgetでつくっていたMy Google CalendarをChrome Extensionに移植してみました。
https://chrome.google.com/extensions/detail/mkaaneppndljkmpgdcglnpfagfhjhipc

しかし世の中にはもっと高機能なカレンダーextensionがあるもよう。
https://chrome.google.com/extensions/detail/emambmpgicpidmncfacjkeicobamadod

やりたいことと名前が一致しなくなっているのを前々から感じていたため(全然カレンダーっぽくないので) Google Calendar for Todayという名前でリリースしました。

実際にやりたいことは今回のリリースでは全然できてなくて今回はChrome Extensionの勉強みたいな感じ。このwidgetの思想自体は最初につくったYahoo WidgetのMy Outolook Todayのころから変わっていなくて

「次の会議どこ??」
「あと何時間集中できるん??」

という今日をいかにして乗り切るかという自分の関心事を解決するためにつくっています。

なので明後日以降の予定とかどうでもいいや、というかもうGoogleカレンダー普通に開いて見てください。ごめんなさい。って感じです。