読者です 読者をやめる 読者になる 読者になる

hogashi.*

日記から何から。

MMAって一体

 これは MMA Advent Calendar 2016 - Adventar の4日目の記事です。

 MMAに所属して2年目の部員です。

 とことん忘れる体質を許してほしいのですが、MMAに入ったきっかけとか入った当初とかを殆ど覚えていません。おそらく kyontan とかって人と話をしてたら入っていたのではと思います。

 当時は高校でUbuntuの上辺を扱った程度でコンピュータにはさっぱり詳しくなかったのですが、今はそれよりちょっとは詳しくなれました。周りの人たちが色んなことをしていて、これを作ったとかこれを運用しているとかという話を聞いているとそれなりに知識がついてくるもので、とてもいい環境と言えます。家にマシンが複数台あってネットワークをどうするかみたいなものの考え方もわかってきます。あんまり自分でやっていないままでカーネルとかシェルとかその他未だにふわふわしたままですが。

 して「MMAって一体何をしているの」みたいなことを聞かれることが多いんですが、1日目の記事 (MMAとは(MMA Advent Calendar 2016 1日目) - /var/log/) にあるように、これくらいしか答えられないという話で、なんとかする術として僕のやったことを書きます。賢明な読者はもうお分かりかと思うが本編は終わった。

 長さは長いものの内容は薄いので斜めに読んで下さい。

 電気通信大学という大学には休講という概念があって、講義がお休みになります。広義の休講では自主的なものも含まれるようですが今回は狭義でいきます。

 便利なページがありまして、電気通信大学(学域・学部) 休講のお知らせ というのですが、これを見ることで講義があるか否かを知ることができます。
 大変なのはこのページが不定期で更新されることで、朝見て休講がないままよ~し行くぞと大学に着いたら誰もいないみたいなことがあります。つまりいつの間にか休講になっていたりするということです。

 なんとかして更新を知りたくなるわけで、cronを回すか何かしてみようとなるわけです。curlするとこうなります。

$ curl kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html
<HTML>
<HEAD>
<TITLE>d
        C?M・
            wi
              襴
                wj@
u?ィm点</TITLE>     x
"<meta name='viewport' Content = 'width=320,' height=480, initial-scale=1.0, minimum-scale=1.0,maximum-scale=2.0,user-scalable=yes' />"
<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<H2>d
     C?M・
         wi
           襴
             wj@
u?ィm点</H2>     x
<font color='red'>
                   wアⅲVXe?pX[h?X??「ト <BR>
                                          wアⅲVXe?pX[hェA<strong>ⅲ
                                                                  靏Z^[
                                                                       ・
?ュセウ「B<BR>ヲⅲ                                                           nVXe?pX[h</strong>??靹湜?オスB</font><BR>[Uシヘ?ィ・キフ?イ
(後略)

 charset=Shift_JISとの指定があります、あいにくUTF-8環境なのでnkfでねじ伏せます。

$ curl kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html | nkf -Sw
<HTML>
<HEAD>
<TITLE>電気通信大学(学域・学部) 休講のお知らせ</TITLE>
"<meta name='viewport' Content = 'width=320,' height=480, initial-scale=1.0, minimum-scale=1.0,maximum-scale=2.0,user-scalable=yes' />"
<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<H2>電気通信大学(学域・学部) 休講のお知らせ</H2>
<font color='red'>★ 学務情報システムのパスワード変更について ★<BR>学務情報システムのパスワードが、<strong>(後略)

 すごいですね。上の文字化け状態でもわかりますが、HTMLタグが大/小文字混じっているとか、fontタグとか、沢山使われていて良いです。何より良いのは4行目で、クオートがついていて丁寧です。
 view-source:http://kyoumu.office.uec.ac.jp/kyuukou/kyuukou.htmlとかすれば同じものが見られます。

 まぁ実はこの辺りは変わらないので特に気にしないでokです。
 必要なのは下の方にある表です。

<TABLE BORDER=2>
<TR BGCOLOR=#DDDDDD>
<TD ALIGN=CENTER><B>クラス</B></TD>
<TD ALIGN=CENTER><B>月日</B></TD>
<TD ALIGN=CENTER><B>時限</B></TD>
<TD ALIGN=CENTER><B>科目</B></TD>
<TD ALIGN=CENTER><B>担当教員</B></TD>
<TD><B>備考</B></TD>
</TR>
<TR>
<TD ALIGN=CENTER>
(後略)

と続きます。これを

  • うまいことパースして
  • 更新されてるか確認して
  • うまいこと通知する

ことがしたいですね。

 パースは何も考えずにシェルスクリプトでやりました。awkとか使ってコクを出します。

$ curl kyoumu.office.uec.ac.jp/kyuukou/kyuukou.html | nkf -Sw | egrep -i '<(tr|td)' | tr -d '\r' | sed 's/<\/\?b>//ig' | sed 's/<\([^\s>]\+\)\s\+[^\s>]*>/\1 /i' | sed 's/<\(tr\|td\)>/\1 /ig' | sed 's/\(tr\|td\) /\1,/ig' | sed 's/<\/\(tr\|td\)>//ig' | awk 'BEGIN{FS=",";f=0} /TD/{s=s "|" $2} NR>1 && /TR/{print s "|";s="";if(f==0){print "|:---|:---|:---|:---|:---|:---|";f++;}} END{print s "|";}'

 パイプ9本で済みます。2016/12/04/00:00現在ではこんな感じ↓になります。

|クラス|月日|時限|科目|担当教員|備考|
|:---|:---|:---|:---|:---|:---|
|3S・電子工学コース・光エレクトロニクスコース・応用物理工学コース|12月2日(金)|1|熱・統計物理学基礎|尾関|&nbsp;|
|1年昼・クラス4・9・10|12月2日(金)|2|Academic Written English Ⅱ|上原|&nbsp;|
|2昼|12月2日(金)|4|英語演習|上原|&nbsp;|
|1K|12月3日(土)|2|Academic Spoken English Ⅱ|○ロイ|&nbsp;|
|1K|12月3日(土)|3|Academic Written English Ⅱ|○ロイ|&nbsp;|
|2I・I2クラス|12月5日(月)|2|情報・通信演習2|西(一)|&nbsp;|
|2I・I2クラス|12月5日(月)|3|基礎電気回路|西(一)|&nbsp;|
|3S生体機能システムコース|12月5日(月)|3|分子分光学|山北|&nbsp;|
|1年昼・クラス9|12月6日(火)|2|微分積分学第二 |山口(耕)|&nbsp;|
|1年昼・クラス7・8・12|12月6日(火)|3|Academic Spoken English Ⅱ|上原|&nbsp;|
|1年昼・クラス9|12月6日(火)|3|物理学概論第二|來住|&nbsp;|
|1年昼・クラス12|12月6日(火)|4|微分積分学第二 |山口(耕)|&nbsp;|
|1年昼・クラス3・4・6|12月6日(火)|4|Academic Spoken English Ⅱ|上原|&nbsp;|
|上級科目|12月6日(火)|5|Preparation for Graduate School|上原|&nbsp;|
|人文社会|12月7日(水)|1|地理学B|○戸田|&nbsp;|
|2M|12月8日(木)|2|プログラミング演習|結城|&nbsp;|
|2I・I1クラス|12月8日(木)|4|基礎電子工学|○望月|&nbsp;|
|2I・I2クラス|12月13日(火)|2|プログラミング通論(I2クラス)|○丸山|&nbsp;|
|II類第4クラス|12月14日(水)|1|確率統計|川端|&nbsp;|
|2I・I2クラス|12月15日(木)|4|情報通信と符号化|川端|&nbsp;|
|3K・EMCコース|12月17日(土)|4・5|専門実験B テーマ5(応力解析)担当:梶川のみ休講|梶川|対象はグループA。なお、17日の補講については10日の実験の際に相談して決めます。|
|人文社会|12月21日(水)|5|歴史学B|○倉橋|&nbsp;|
|人文社会|1月4日(水)|1|文化人類学B|○執行|&nbsp;|
|1年・Ⅱ類|1月4日(水)|1|力学|柳澤|&nbsp;|
|2I・I2クラス|1月4日(水)|3|生涯スポーツ演習B(卓球)|○額谷|&nbsp;|
|2I・I1クラス|1月4日(水)|4|生涯スポーツ演習B(卓球)|○額谷|&nbsp;|
|クラス4・9・10|1月13日(金)|2|Academic Writing in English Ⅱ|○近藤(良)|&nbsp;|
|1年昼・クラス6|2月3日(金)|1|線形代数学第二|○中井|&nbsp;|
|1年昼・クラス5|2月3日(金)|2|線形代数学第二|○中井|&nbsp;|

 これで扱いやすいmarkdownの表ができました。列の数は固定なので便利ですね。

 これをcronして、md5sumか何かで更新されたか否かを見て、SlackだとかLINE Notifyなんかに投げてあげれば、スマートフォンで更新通知を受け取ることができます。

 残った欲望としては自分に関連するところだけを通知したいんですが、講義によって様々な分け方が存在するため、出てくるパターンの全貌が不明です。収集して図鑑みたいにするとできそうですね。

お後

 明日の記事は未定のようです。 id:masn19 さんです。よろしいようで。[追記(0:50)]

 ブログ(?)を書くのは深夜になることが多いのは不思議です。最近殆ど文章を書かずに居たのでリハビリです。同時に適当に文章を並べ連ねる練習です。

 最近はバイト先が変わったり課題に埋もることが多かったりと妙な忙しさで過ごしています。
 難しいのはやる気と記憶で、何れも少ないとかなり困ります。課題が提出できません。

 おそらくは睡眠不足が大ボスなので寝ることをしていきたいです。

 追伸: ファミコンミニカービィをクリアしました。78%だけど。

拡張機能「twitter画像原寸ボタン」ver.2.1.2公開

GoogleChrome 拡張機能

 拡張機能twitter画像原寸ボタン」ver.2.1.2です。
 先日のver.2.1.1で修正した部分でバグが出たので更に修正をしました。

 使い方などは2.1.1の記事(下リンク)を参照してください。ここには更新内容について書きます。

hogashi.hatenablog.com

更新内容

 「リンクを共有ページでEnterが効かない」問題を報告頂いたので、それを含めて画像が無い場合はEnterの本来の動作を止めないよう修正しました。

 DM、リンク共有ページなどで改行などができなかった問題が改善されます。
 設定で「Enterキーで画像を開く」をOFFにして対策をしていた場合は戻してOK(なはず)です。

 まだ修正できてないとか、新しく変になったとかありましたらお伝え下さい。

雑記

 今回のバグは完全に盲点で(僕が共有などをあまり使わないのが大きいですが)、地味に不便なバグでした。

 コードのお話としては、修正にあたって、ドメインtwitter.com(manifest.jsonで振り分けできない)だしDOM構造は(おそらく)似ていて、色々判別するのが大変だと思うので、例外処理の判別式は変えませんでした。
 というかそもそも処理手順をミスっていて、「ブラウザ本来の挙動を取りやめる」処理をするのが早すぎていました。画像のURLが取得できなかったら、その処理は行うべきではありません(ブラウザ本来の挙動をさせてあげるべき)でした。なのでそこだけ変更しました。

拡張機能「twitter画像原寸ボタン」ver.2.1.1公開

GoogleChrome twitter 拡張機能

 拡張機能twitter画像原寸ボタン」ver.2.1.1を公開しました。

 更新内容は、真ん中あたりに書きました。何が変わったの?が知りたい方はどうぞ。

 求める権限に「閲覧履歴の読み取り」がありますが、閲覧履歴を読み取ることはしていません
 ※タブ間の設定共有のために、タブ操作の権限を使っていて、それが「閲覧履歴の読み取り」と表示されています。公式ドキュメント: chrome.tabs - Google Chrome

インストール

Chromeウェブストア:

Grease/TamperMonkey(リンクをクリックでインストールが始まります):
tooi-forGreaseTamperMonkey.user.js


上記2つはGitHub上で公開しています。
GitHub - hogashi/twitterOpenOriginalImage: is a GoogleChrome extension which opens original image to new tab.

概要・使い方

 Twitter公式Web/TweetDeckで、画像ツイートに原寸表示用ボタンを設置する拡張機能です。

1. Twitter公式Webの

  • タイムライン
  • ツイート詳細
  • 画像ギャラリー

と、TweetDeckの

  • タイムライン

で、「Original」と書かれたボタンを設置します

 Originalボタンをクリックすると、原寸画像が別タブで開きます
 ※原寸画像とは……画像URLに「:orig」を足すだけです。

 複数画像は、1枚目がアクティブなタブとなって枚数分タブが開きます。

2. Twitter公式Webのツイート詳細では、Enterキーでも原寸を別タブで開けます

3. 画像を開いたページ(URLが「https://pbs.twimg.com/~」)では、[Ctrl]+[s](または[Cmd]+[s])で拡張子を校正して保存します
 ※保存先は、Chromeの設定「ダウンロード保存先」で指定された場所です。

表示/動作設定

 Chrome右上の拡張機能のボタン(もしくはChrome拡張機能一覧から拡張機能のオプション)で、設定画面が開きます。

 各種動作をする/しないを選び、「設定を保存」をクリックすると設定が保存されます
 ※ページを再読み込みしないと反映されないと思います。

更新内容

  • TweetDeckタイムラインでボタンが表示されない問題を修正した(設定でcolumnをnarrowにしても表示されるようにした)
  • 画像ページ(URLが「https://pbs.twimg.com/~」)で保存できない問題を修正した
  • [Ctrl]+[s]と[Cmd]+[s]両方で画像の拡張子を校正するようにした
  • 画像の拡張子校正をスムーズにした
  • 設定画面をマテリアルデザインっぽくした
  • ボタンにフォーカスがあるときEnterを押しても2タブ開かないよう(1タブに)修正した
  • TweetDeckで動画ツイートにボタンをつけないようにした
  • 使うメモリを減らすべくbackground pagesをevent pages形式にした
  • ~Monkey用のuserjsをver.2.1.1に更新した

 ちらほらと「TweetDeckでボタンが表示されない」というのを見かけるのですが、この更新で修正されたら良いなと思っています。されなかったらご連絡下さい。

連絡先

 何かあれば

にお伝え下さい。

似た拡張機能の紹介

 別タブなんて煩わしい!とか、一気に保存したい!という方はこちらをどうぞ。
furyu.hatenablog.com

 右クリックで保存だけしたい!方はこちらをどうぞ(Chromeウェブストア)。
chrome.google.com

その他・雑記

 これからTweetDeckのツイート詳細や画像ギャラリーにゆったりと対応していきたいと思っています。
 GitHubのREADMEも古いので書き直したいです。

GoogleChrome拡張機能「twitter画像原寸ボタン」とChrome53

GoogleChrome twitter 拡張機能

 Chrome53がリリースされましたが、伴ってGoogleChrome拡張機能twitter画像原寸ボタン」ver.2.1 の一機能が止まった報告です。

 この修正を含んだ更新は、近々行います。

状況

 Chrome53において、twitter画像原寸ボタンver.2.1の「[Ctrl-s]時に画像の拡張子を校正する」機能が止まりました
 原因は(ご指摘を受け)判明したので、次の更新(近々します)で修正予定です。

 これによって、[Ctrl-s]を押しても保存がされなくなっています。ブラウザ本来の保存動作も動きません。

 Chrome52では動作します。

一時策

 マウスで画像を右クリックして「名前を付けて画像を保存」を使えます。

 [Ctrl-s]については、「[Ctrl]+[s]で拡張子を校正」設定をオフにすると、ブラウザ本来の保存動作がされます。
 ただ、拡張機能が更新されたら戻してください。(やっぱりブラウザ本来の動作が良い!となったら戻さずOKです。)

 更新のお知らせはブログで記事を書くくらいになります。

原因

 今のところの原因(?)については前記事に書きました(正しいかどうかはわかりません……)

hogashi.hatenablog.com

Chrome53でnew CustomEvent('click')がマウスクリックじゃなくなった?

GoogleChrome

 GoogleChromeをバージョン 53.0.2785.89 mにアップデートしたら、new CustomEvent('click')がマウスクリックの挙動をしなくなった*1

結論?

 先に考えたことを書くと、CustomEvent - Web APIs | MDN によればCustomEvent

The CustomEvent interface represents events initialized by an application for any purpose.

イベントを勝手につくるためのものだから、CustomEventでつけたイベント名がclickだったとしても、MouseEventclickとは区別されるようになった、のだろうと思う(詳しい方よろしければお教えください)。

環境

OS: Windows7
Chrome: バージョン 53.0.2785.89 m

状況

 対象のエレメントelemに対して、クリックイベントを起こしたい。

elem.dispatchEvent(new CustomEvent('click'));

 これがChrome52ではクリックイベントとして動いていたのだけれど、Chrome53から動かなくなった。戻り値はtrueなのだけど、見た目には何も起こっていない状態。

 ちなみに、new MouseEvent('click')を使うと、ちゃんとクリックされた挙動が起こる*2elem.click()でも起こる。

MDN

 CustomEvent() - Web APIs | MDNMouseEvent() - Web APIs | MDN も健在だが、後者のブラウザ対応状況では Safari の Basic support に「?」がついている。

結び

 これからはclickにはMouseEventを使います。

*1:自分が書いたコードに指摘を頂いた(ありがとうございます)。

*2:*1に同じ

 なんとなく、大学数学を勉強するごとに、今まで習ってきた数学を俯瞰するみたいに(一般化されて)見方が変わるように感じている。それはそうと今日は勉強していた訳でなく、単に人に数学の話をしていたら突然それが起こって驚いた。

 複素関数の話を、「y=f(x)」くらいならわかる人に説明しようとしていたところ、「複素数が関数で映る?みたいな言い方をされるんだけど」とかいうふんわりした言葉で喋っていたらわからんみたいな顔をされていた。とにかくわかる概念から理解していかないといけないのでy=f(x)で説明しようとしたら、「数直線上のxってのがfって関数でyに映る」とかいう自分も聞き覚えのない考え方がスラスラ口から出てきた。聞き手はわかってくれたようでよかったんだけど自分はびっくりながら話を続けていて、「複素数は実数にひとつ次元が足されるから数直線じゃ表せなくて平面になって、平面から映った先も平面だからいっこで表すにはy=f(x)の座標平面みたいな2次元じゃ無理*1で」とかどんどん喋っていた。
 つまり「数直線上の実数xを関数で映した先の数直線上の値がy」という考え方が会話の中で湧いて出た。「y=f(x)のグラフはその映る前と映った先の点(無限個)を結んだ、映る前後の関係性を表すもの」とかいう言葉も出てすごかった。

 複素関数の理解が若干追いついてなかったところだったので今日の会話で助かった。会話できる頭を維持していきたい。

*1:2次元と2次元で4次元グラフになるのだろうか