投稿者「mod_poppo」のアーカイブ

TeXでファイルの更新日時を取得する

TeXでは \today で現在の日付を取得できる。\maketitle\date を省略すると現在の日付になる。

しかし、TeX文書の「内容」に関わる日付と言ったら、ファイルの更新日時ではないだろうか。タイトルのところにファイルの更新日時を(自動で)出す方法はあるか。

ググってみたら割と簡単に答えが出てきた。

pdfTeXだと \pdffilemoddate というプリミティブがあるらしい。例えば \pdffilemoddate{\jobname} と書くとコンパイル中のファイルの更新日時が D:20150829212230+09'00' というようなフォーマットで取得できるようだ。

LuaTeXだと \pdffilemoddate はないが、Luaを使えば同じようなことはできるだろう。まあ自分でLuaコードを書いて実装するのは面倒なので、既製品を使おう。

filemodというパッケージはpdfTeXとLuaTeXで使えて、ファイルの更新日時を取得するだけじゃなくて、\today と同じような読みやすいフォーマットにしてくれるようだ。例えば、ファイルのプリアンブルに

\usepackage{filemod}
\date{\Filemodtoday{\jobname}}

と書けばタイトルの日付がファイルの更新日時になる。

複数のファイルの中で最も新しい更新日時を使いたいときは、試してないけど \filemodNewest を使えば良さそう。

既に書いたように、filemodパッケージはpdfTeXかLuaTeXが必要で、pTeXXeTeXでは動かない。

【2016年12月12日 追記】ε-pTeX では \pdffilemoddate を含むいくつかの pdfTeX primitive が実装されているため、 filemod パッケージを使うことができる。参考:ε-pTeX について

Macのストレージを空けた (2)

関連:Macのストレージを空けた

またMacのSSDの空き容量が減ってきたので、なんとかする。

duコマンドでホームディレクトリ以下を検査して、容量を食っているやつをチェックする。

~/Library/Application Support/MobileSync/Backup/

20GBくらい。

こういうバックアップの類はなるべく消したくないタチなので、できれば外付けドライブとかに移したい。ググったらシンボリックリンクを貼れば良いというのが出てきたが、リンク先のドライブが接続されてない場合の挙動が心配である。

というわけで今回はパス。

~/Library/Developer/Xcode/

7.1GBくらい。

中でも、 iOS DeviceSupport というサブディレクトリが6.3GBほど食っているようである。

ググって調べたところ、新しいiOSデバイス、または新しいiOSの入ったデバイスを接続すると iOS DeviceSupport の中身が増殖するらしい。

$ rm -r 7.1.* 8.0.* 8.1.*

のようにして、最新のバージョン(8.4)以外を削除。

古いHaskell Platform

7.10.2を入れたので7.8.3には消えてもらう。手順は前の記事に書いた。

TeX界隈のロゴをHTML+CSSで

TeXのロゴは、真ん中の“E”の文字が下に下がっていて、2次元的になっている。プレーンテキストではこういうのが表現できないので“TeX”のように小文字で代用するわけだが、HTML文書でそんなことをするのは甘えである。

そこで、HTML+CSSでTeXのロゴを再現してみよう。(TeXのロゴよりもLaTeXの方が見た目を調整する要素が多いので、ここでは、LaTeXのロゴで行う)

案1

愚直に、AとEの位置をCSSのvertical-alignプロパティーでずらした。

表示例: LATEX

コード例(見やすいように改行とか空白とか使ってインデントしている)
[code lang=”html”]
<span style="font-family: serif;">
L
<span style="vertical-align: super;">
A
</span>
T
<span style="vertical-align: sub;">
E
</span>
X
</span>
[/code]

案2

なんか本物はAの文字が小さい気がする。font-size: smallerを指定しよう。

表示例:LATEX

[code lang=”html”]
<span style="font-family: serif;">
L
<span style="vertical-align: top; font-size: smaller;">
A
</span>
T
<span style="vertical-align: sub;">
E
</span>
X
</span>
[/code]

案3

本物は文字の間隔が詰まっている気がする。letter-spacingを指定しよう。letter-spacingの値は、検討の余地があるだろう。

表示例:LATEX

[code lang=”html”]
<span style="font-family: serif; letter-spacing: -0.1em;">
L
<span style="vertical-align: top; font-size: smaller;">
A
</span>
T
<span style="vertical-align: sub;">
E
</span>
X
</span>
[/code]

案4

最近のSafari、そして直近のFirefoxにはリーディングモードだかリーダーモードが搭載されている。このモードではサイト側で指定したCSSがだいたい無効になる。そうすると、案1〜案3で書いたLaTeXはすべて大文字の“LATEX”になってしまう。これは好ましくない。CSS無効の場合は“LaTeX”になってほしい。

そこで、HTMLとしてはAとEを小文字で書いておき、CSSのtext-transform: uppercaseで見た目を大文字にする。

表示例:LaTeX

[code lang=”html”]
<span style="font-family: serif; letter-spacing: -0.1em;">
L
<span style="vertical-align: top; font-size: smaller; text-transform: uppercase;">
a
</span>
T
<span style="vertical-align: sub; text-transform: uppercase;">
e
</span>
X
</span>
[/code]

ちなみに、この方式で書いた“LaTeX”ロゴをブラウザからコピペした場合、Safariだとすべて大文字で、FirefoxだとAとEが小文字でコピーされた。

おまけ:XeTeX

XeTeXとかいうやつは2文字目のEが反転している。最新のCSS技術を使えば、特定の文字を反転させるのもお手の物である。

表示例:XeTeX

[code lang=”html”]
<span style="font-family: serif; letter-spacing: -0.05em;">
X
<span style="vertical-align: sub; text-transform: uppercase; transform: scale(-1,1); -webkit-transform: scale(-1,1); display: inline-block;">
e
</span>
T
<span style="vertical-align: sub; text-transform: uppercase;">
e
</span>
X
</span>
[/code]

おまけ:WordPressで

このブログはWordPressで動かしているわけだが、LaTeXに言及するたびに長ったらしいHTMLを書き込むのはだるい。また、「以前はこういう書き方してたけどやっぱりこの書き方の方がいいな」となったときにいちいちLaTeXロゴを使っている記事を探して置換するのはだるい。

そこで、WordPressのテーマをいじって、本文中に [LaTeX-logo] と書けばそれがLaTeXロゴを表すHTMLに化けてくれるようにしよう。(こういう風に “[” “]” で囲むやつを、WordPress用語でshortcodeと言うらしい)

テーマのfunctions.phpに以下を書き込む。何をやっているかは、雰囲気でわかるだろう。

[code lang=”php”]
function tex_logo_shortcode() {
return "<span style=\"font-family: serif; letter-spacing: -0.1em;\">T<span style=\"vertical-align: sub; text-transform: uppercase;\">e</span>X</span>";
}
add_shortcode( ‘TeX-logo’, ‘tex_logo_shortcode’ );

function latex_logo_shortcode() {
return "<span style=\"font-family: serif; letter-spacing: -0.1em;\">L<span style=\"vertical-align: top; font-size: smaller; text-transform: uppercase;\">a</span>T<span style=\"vertical-align: sub; text-transform: uppercase;\">e</span>X</span>";
}
add_shortcode( ‘LaTeX-logo’, ‘latex_logo_shortcode’ );

function XeTeX_logo_shortcode() {
return "<span style=\"font-family:serif;letter-spacing:-0.05em;\">X<span style=\"vertical-align:sub;text-transform: uppercase;transform:scale(-1,1);-webkit-transform:scale(-1,1);display:inline-block;\">e</span>T<span style=\"vertical-align:sub;text-transform: uppercase;\">e</span>X</span>";
}
add_shortcode( ‘XeTeX-logo’, ‘XeTeX_logo_shortcode’ );

function xypic_logo_shortcode() {
return "<span style=\"font-family: serif;\"><span style=\"letter-spacing: -0.2em;\">X<span style=\"vertical-align: sub; text-transform: uppercase;\">y</span></span>-pic</span>";
}
add_shortcode( ‘xypic-logo’, ‘xypic_logo_shortcode’ );
[/code]

真面目にやるなら

この記事ではなんとな〜くノリでロゴの見た目を調整したが、真面目にやるならTeXでの \TeX コマンドの定義を見て文字の大きさとか位置を調整するべきだろう。

ググったらそういうことをやっている人がいたのでリンクを貼っておく。

JavaScript近代史

先月はECMAScript 2015 (ECMAScript 6)が採択され、また、WebAssemblyが発表された。多分これらは現代のWebプログラミング言語の歴史に残る出来事だろう。しかし、ここ10年ぐらいのJavaScript/ECMAScriptの歴史と背景事情みたいのをまとめた文章のようなものをあまり見かけないので、ちょっとだけ書いてみることにする。(というよりは「ちょっとだけ調べてみた」の方が適切。あんまりまとまってないし)

続きを読む

Xy-picとdvisvgm

LaTeXで図式を書くのに、Xy-picというパッケージがある。このパッケージで書いた図式を、dvisvgmコマンドでSVG形式に変換しようという話。

大まかな流れ:

  1. Xy-picで作った図式を含むLaTeXソースをコンパイルしてDVIファイルを作る。
  2. DVIファイルをdvisvgmコマンドでSVG形式に変換する。

今回ハマったポイント(結論):

  • Xy-picにはPostScriptやPDFなどのバックエンド(ドライバー)を指定しよう。
  • dvisvgmに--no-fontsを指定することでSVGファイルの文字を正しく表示できるようになる。

以下、結論に至るまでの過程: 続きを読む

Macの受信メールから自動でリマインダーを作成する

何日までに○○しなさいというメールが届いた!けどほったらかしておいたら期限を過ぎていた!そういう経験、あるよね?

library-mailそこで、そういうメールが届いたら自動でMacの「リマインダー」に登録されるようにしよう!という話。
続きを読む

豊穣圏の教科書

最近、豊穣圏(enriched category)という概念に触れることがあって、それの標準的な教科書って何かなあと思ったら、G.M.Kelly “Basic Concepts of Enriched Category Theory”というのがそれっぽくて、しかも無料でPDFをダウンロードできるらしい。

MacLaneのCWMには豊穣圏の名前といくつかの例は出てくるけどちゃんとした定義は出てこない。まあ、ちゃんとした定義を書こうとするとモノイド圏(monoidal category)の定義をしてうんたらしないといけないようだが。

豊穣圏というのは(今の自分の理解で)大雑把に言うと、圏のhom-setに単なる「集まり」以上の構造が入ったものである。例えば、加群の圏には、それぞれのhom-setにアーベル群の構造が入っているので、アーベル群の圏 Ab でenrichされた圏の例となっている。

別の例を挙げると、各hom-setにゼロ射が入っている圏は、それぞれのhom-setに点つき集合の構造(ゼロ射が基点)が入っているとみなせる。つまり、ゼロ射を持つ圏は、点つき集合の圏 Set* でenrichされた圏と言える。

各hom-setに構造が入っていればいいというものではなくて、Ab-enriched categoryだと射の合成が双線形、Set*-enriched categoryだとゼロ射(hom-setの基点)を合成するとゼロ射、という風に、合成の方にも条件が付いてくる。この辺の条件を表現するのに、モノイド圏の構造が必要になる。

Aterm MR03LNを一ヶ月ほど使った感想

Aterm MR03LNを買ってから一ヶ月ほどが経って、実際の使用感も大体分かってきた。

Bluetooth接続

普通のWi-Fi接続とは排他的に使うようになっていて、本体のタッチパネルまたはスマートフォン・タブレットのアプリで切り替えられる。

Bluetooth接続はWi-Fiと比べるとやはり遅い。Googleマップを表示させると遅さを感じる。

面倒な点としては、ルーターの電源投入後、あるいはWi-Fiからの切り替え後、タブレットを操作して手動でつなぎに行かないといけない。

AndroidのNexus 7ではBluetooth機器を個別に切断できるが、iPadだとそういうのはできないので注意

2016年4月27日追記:いつの間にかiOSでもBluetoothアクセサリの「接続解除」(ペアリング解除ではない)ができるようになった。参考:他社製の Bluetooth アクセサリを設定して使う – Apple サポートの「Bluetooth アクセサリの接続を外す」

Wi-Fi接続

言うことなし。5GHz帯にも対応しているようだが、試してない。

リモート起動

起動するのにルーターに触らなくてもいいのは便利。Wi-Fiで繋ぐようにしていれば、起動後自動でつながってくれる。

電池の持ち

そんなにヘビーな使い方をしなければ、外出している間は持つ。

付属のクレードルに置いても、USBケーブルの挿し方が悪いのか充電されていないことがあった。(充電状態になればクレードルのランプが点灯するので、クレードルに置いた時に充電されているかチェックできる)2016年4月27日追記:この現象は結局、使っていたUSBケーブルの問題だった。クレードルは悪くなかった。

IPv6

IIJmioのSIMなので普通にIPv6で繋がるっぽい。IPv6だからといってこれといったメリットを感じているわけではないが。

IIJmioとかのサイトにアクセスすると「CONNECTED via IPv6」と出る。

TypeScript 1.5でのlet文

ECMAScriptの変数のスコープが不思議な挙動をするのはよく知られた話だ。ECMAScript 5での変数のスコープは以下のいずれかに大別される(はず)。ブロックスコープがない。

  • グローバルスコープ
  • 関数スコープ
  • catchスコープ

普通に使う変数が関数スコープしかないのは不便、ということで、MozillaはJavaScript 1.7(2006年頃)でlet文を導入した。が、しかし、他のブラウザには普及せず、Mozillaの独自拡張に留まることになった。

時は過ぎ、ECMAScript 5が制定され、次はECMAScript 6という流れになってきた。そして、ECMAScript 6にはlet文が導入されることになった(MozillaがJavaScript 1.7で導入したものとは微妙に仕様が違う)。めでたしめでたし。

ECMAScriptに静的型を付けたTypeScriptは、当初はlet文をサポートしていなかった。それが、TypeScript 1.4で、ECMAScript 6へコンパイルする場合のみlet文をサポートするようになった。

が、ECMAScript 6(のlet文)に対応していないブラウザはまだまだたくさんある(今調べてみたら、IE11ではES6のlet文に対応しているけど、Safariでは対応していないようだ)。できれば、TypeScriptのようなaltJS言語でlet文を使いつつ、コンパイル後のJavaScriptでは従来のvarを使ってほしい。

が、let文を従来のJavaScript (ECMAScript 5)に変換するのはそう自明なことではない。特に問題になるのは、ループ内の変数を、ループの外に持ち出される関数で使っている場合だ。[code lang=”js”]
var a = [];
for (var i = 0; i < 5; ++i) {
let x = i * i;
a.push(function() { return x; });
}
[/code]上のコードを下のように単純にvarを使うと挙動が変わってしまう。[code lang=”js”]
var a = [];
for (var i = 0; i < 5; ++i) {
var x = i * i;
a.push(function() { return x; });
}
[/code]このコードを正しくECMAScript 5に翻訳するには、即時実行関数(IIFEを使って以下のようにしなければならない。[code lang=”js”]
var a = [];
for (var i = 0; i < 5; ++i) {
(function() {
var x = i * i;
a.push(function() { return x; });
}());
}
[/code]こういう非自明、というかパフォーマンスに影響するところがあるので、TypeScript 1.4ではES5へのコンパイル時にlet文がサポートされなかったのだろう。

が、しかし、TypeScript 1.5ではES5へコンパイルする場合でもlet文が部分的にサポートされるようになるようだ。「部分的に」というのは、ループが絡まない、変数のスコープのチェックと名前の変更で済む場合、のようだ。[code lang=”js”]
{
let x = 123;
console.log(x); // OK
}
console.log(x); // エラー
[/code]
ループが絡む、IIFEを使った変換が必要な場合は、

test2.ts(2,1): error TS4091: Loop contains block-scoped variable 'x' referenced by a function in the loop. This is only supported in ECMAScript 6 or higher.

というエラーが出た。
[code lang=”js”]
let a: Array<() => number> = []
for (var i = 0; i < 5; ++i) {
let x = i*i;
a.push(() => x);
}
a.forEach(console.log);
[/code]

GitHubでの該当するIssue/Pull Requestは以下のようだ。

let文のサポートとしては不完全とはいえ、varの関数スコープのせいで意図しない同名の変数を参照していた〜〜みたいな事故は防げると思われるので、積極的に使っていきたい。