github メモ

■開発作業
git checkout -b hoge #作業用ブランチを作成
★自由にコード等を編集する.
git commit -m "fix bug" #変更内容をコミット
git push origin hoge #自分のレポジトリにプッシュ
★github ページに言ってPull Request を作る.
★権威ある人に merge してもらう.

■自分のレポジトリを最新の状態に更新する
(git remote add upstream git@github.com:foo/bar.git)← upstream の登録は一度やればいい
git checkout master #作業ブランチを master に
git pull upstream master
git push origin master #自分のレポジトリにpush

■作業ブランチの確認
git branch

■作業ブランチをhogeに変更
git checkout hoge

■url の確認
git remote -v

■originの変更
git remote set-url origin git@github.com:foo/bar.git

■upstreamの変更
git remote set-url upstream git@github.com:foo/bar.git

広告

uniq 的な関数(Haskell)

Haskell のリストから重複要素を除去する関数はnubである.「同じかどうか」を判定する関数を引数に取る nubBy を使いたい場合もある.これらの関数はリスト全体を舐めて重複要素を除去する.

扱っている配列がソート済みである場合も多い.その場合,隣接要素だけ見ていけば重複要素を除去できるはずである.そうすれば少しだけ効率が良いかも知れない.そう考えてこんな関数を書いてみた:

uniq :: (Eq a) => [a] -> [a]
uniq = foldr  uniqAux []
  where uniqAux :: (Eq a) => a -> [a] -> [a]
        uniqAux t [] = [t]
        uniqAux t (u:us) = (if t == u then [u] else [t,u]) ++ us

uniqBy を作るのも簡単である.

※効率がどうこうと言ったが,性能比較はまだしていない.

知られざるZakon

■Elias Zakonの事について調べたので書いてみる.とはいえこの人物にはwikipediaページも作られていないので,そんなに世間から関心を持たれてもなさそうである.私がこれを書く理由は個人的な関心からである.

■そもそもなぜ彼に興味を持ったのか.ここ数年,私は超準解析(Nonstandard Analysis, NSA)の勉強している.この超準解析というものがどのようなものであるかについてはこの記事では扱わない.(私のブログでは過去にこのような記事で少し触れたことがある).超準解析はAbraham Robinson(1918-1974)によって創始された.しかしながら,Robinsonが創始した当初の議論は高階型理論に基づいていることもあって他の数学者には理解が難しかった(というようなことが色々な著者によって述べられている).

しかしながら,W.A.J.Luxemburg編集の1969年の論文集“Applications of Model Theory to Algebra, Analysis, and Probability” に収録された Abraham Robinson and Elias Zakon の論文“A Set-Theoretical Characterization of Enlargements” において,超準解析が数学の「ふつうの言語」である集合論の枠組みで捉えられるようになり,超準解析の普及を後押しした.

もちろん現実はもう少し複雑であり,上の論文集でも超準解析を実現するための方法が幾つか提案されている.とはいえ,いわゆる上部構造によって集合論の中で超準モデルを構成して見せたのは“A Set-Theoretical Characterization of Enlargements”が最初である.上部構造による構成には具体性があるため,あまりモデル理論などの知識がなくても議論を追いやすいのはひとつの魅力ではないかと思われる.実際,M.デービス,斉藤正彦,中村徹の三氏がそれぞれ書いた超準解析入門書でも上部構造の議論が用いられていることに注意すると,Robinson & Zakon は今でもある程度の影響を与えていると考えられる.

ところで,LuxemburgやLoebのように超準解析の「業界」で長く影響を持ってきた人たちと違い,Zakonの名前は目立たない.前述したようにWikipediaページもない.そこで,超準解析の世界にそれなりの足跡を残しつつ無名のZakonという人物についてなんとなく興味を持っていた.

■ふと思いたって検索してみたら彼が “Mathematical Analysis I” という本を書いているらしいことに気づいた:http://www.trillia.com/zakon-analysisI.html 
以下に,この本の「About the Author」というところに書かれていることのうち必要と思われる箇所だけ訳しておく:

■エリアス・ザーコンは1908年に帝政ロシアで生まれ,20世紀ヨーロッパ動乱の余波を受けた.

ザーコンはドイツとポーランドで数学と法学を学び,後に父親の法律事務所に加わった.ドイツ軍の接近から逃れるようにして1941年に彼は家族をシベリアのバルナウルへ家族を連れてゆき,そこで民衆とともに苦難の5年間を過ごした.バルナウルにはレニングラード包囲から逃れてレニングラード工科大学も避難してきており,彼はそこで数学者I.P. Nathansonに会ったのだった.Nathansonの励ましにより,ザーコンは数学の勉強と研究を再開した.

ザーコンと彼の家族はオーストリアのザルツブルクの難民キャンプで1946年から1949年まで過ごし,そこでヘブライ語を独習した.これは彼が流暢に使えるようになった6つあるいは7つの言語の1つであった.1949年に,彼は新しく建国されたイスラエルへ家族を連れてゆき,ハイファのイスラエル工科大学で1956年まで教えた.イスラエル共和国ではロジックと解析学の彼の最初の研究論文を発表した.

彼の人生を通して,ザーコンは音楽,芸術,政治,歴史,法律,そして特にチェスへの関心を絶やさなかった.彼がチェスのマスター称号を獲得したのはイスラエルにおいてである.

1956年,ザーコンはカナダに移住した.トロント大学では,研究員としてアブラハム・ロビンソンと共に働いた.1957年に,彼は(カナダの)ウィンザー大学の数学科に入り,新しく創設された数学の優等学位プログラムを1960年に得た.ウィンザーでは,彼はロジックと解析学の研究の成果の発表も続けた.このポストマッカーシー時代には,多産にして奇矯な数学者ポール・エルデシュをゲストとして迎えることが度々あった.エルデシュはその政治的見解からほどなくして米国から追放されている.エルデシュがミシガン大学や他のアメリカの大学から数学の議論をするために人々が集まるウィンザー大学で話すこともあった.

ウィンザーにおいて,ザーコンは三巻からなる解析学の本を著した.これは製本され生徒に配布された.ザーコンの目標はなるべく早く厳密な内容を紹介することにあった.こうすることによって後の講義ではこの内容に依拠することが出来るからである.

■余談1. Elias という名前はイスラエルの預言者エリヤに由来する.

■余談2. I. P. Nathanson という数学者のことはWebで調べてもよくわからない.

■余談3. Zakon がすでに故人であることはわかっているが没年はわからなかった.

翻訳に poedit を使う(メモ)

poEdit は本来ソースコードに含まれたメッセージなどをローカライズするためのものらしいが,通常の文書を翻訳するのにも使える.一年ぶりに使おうとしたら使い方を思い出せなくて困ったのでメモしておく.

英文和訳を例にする.

■1.poedit をインストールしておく.Windows版がある.https://poedit.net/download

■2.gettext を使えるようにしておく.
自分はVMWareに入れたUbuntuに入れた.apt-get install gettext みたいな感じで行けたはず.(gettext for Windows というのもあるらしいがしばらくメンテナンスされていない雰囲気).

■3.VMWareのUbuntuとの共有フォルダに翻訳したい英文ファイル(例えばhoge.txtとかhoge.rtfなど)を入れる.以下では hoge.txt として説明する.一文ずつ訳す(おすすめ)ためには,一文ごとに空行を入れておく.

■4.Ubuntuのコマンドラインから 
txt2po hoge.txt hoge.po
として po ファイルを作る.

■5. poedit で翻訳する

■6. Ubuntu のコマンドラインから
po2txt hoge.po hoge.translated
としてやると,翻訳文だけを集めたファイル hoge.translated が得られる.

集合論宇宙についてのメモ

■「集合全体の集まり」を「宇宙(universe)」と呼びしばしば{\mathbf{V}}などと書く.ただし,「宇宙」という言葉はもう少し小さな「集合」を指すために使われることもある.以下ではZFCにおける「集合全体の集まり」の意味で{\mathbf{V}}という文字を使う.ところで,なぜ”V”なのかというと,ドイツ語のVollraumから来ているらしい.voll(いっぱいの)/raum(空間) と分解すれば意味は取れる.

{\mathbf{V}}が集合ではないことは,少なくとも二つの方法で示せる.最初に基礎の公理を使う方法を示し,次に分出公理図式を使うものを示す.

■基礎の公理を用いた証明.
基礎の公理は次のようなものであった:
{\forall x \enskip \left(x \not= \varnothing  \Rightarrow \exists y \in x \enskip \forall t \in x \enskip (t \not\in y)\right).}

さて,{\mathbf{V}}が集合であったと仮定すると{X:= \left\lbrace  \mathbf{V}\right\rbrace}も集合である.この{X}に基礎の公理を適用すると{\mathbf{V}\not\in \mathbf{V}}が得られるが,{\mathbf{V}}はすべての集合を含んでいるのだからこれはおかしい.よって,{\mathbf{V}}が集合として存在するという仮定から矛盾が導かれたことになる.よって{\mathbf{V}}は集合ではない.

■分出公理図式を用いた証明.
分出公理図式は無限個の公理の総称であり,ある集合から部分集合を作ることを可能にする.(分出公理図式は置換公理図式から導くことも可能であり,ZFCの公理群に含めない場合もあるが,何れにせよZFCでは分出「公理」図式は使用可能である).

{\mathrm{V}}が集合だと仮定すると,分出公理図式から{W:=\left\lbrace x \in \mathbf{V} \mid x \not\in x \right\rbrace}も集合となり,特に{W\in \mathbf{V}}である.すると,{W \in W}であると同時に{W \not\in W}であることが導かれてしまう(床屋のパラドックス).よって{\mathbf{V}}は集合ではあり得ない.

■余談
しばしば,{\mathbf{V}}が集合ではないことの直感的な説明として,「{\mathbf{V}}は集合に収まるには巨大過ぎる」と説明されることがある.

ブルバキの位相についてのメモ

大学二年生の夏休みはずっとブルバキの位相の本を読んでいたような記憶がある.Springer から出てた “General Toplogy Chapters 1-4” がそれ.いま思えば別にこれが位相空間を学ぶベストの本ではないと思うが,20歳の頃に悩みながら読んだ記憶が美化されてしまうせいもあってか不思議と嫌いになれず,いまだに手元にこの本が置いてある.

上で《嫌いになれない》と書いた.この本は多くの位相空間の教科書とはなんとなく書き方が違う.なにせ,肝心の位相空間の定義の仕方からして少し変わっている.ややクセがあるのは確かであり,人前で《この本が好き》というのは少し気恥ずかしい.どう書けば《変わってる》感じが伝わるかわからないが,ここでは二点

1.開集合系の定義の仕方
2.フィルターへの偏愛

に絞って説明する.

■1.開集合系の定義の仕方
ブルバキでは集合{X}上の位相構造{T}が次のよう性質を満たすものとして定義されている:
(O1) {T}の集合の合併は{T}に属する.
(O2) {T}の集合の有限交差は{T}に属する.

多くの教科書では{X,\varnothing \in T}も公理になっている.しかし,実はこれは(O1)(O2)から次のように導ける:

・空集合が{T}に属すること:{T}の空部分集合を考える.(O1)により{\bigcup \varnothing \in T}となることから成立.

{X}{T}に属すること:{T}の空部分集合を考える.(O2)により{\bigcap \varnothing \in T}となることから成立.

上の議論には納得が行くだろうか.空集合が{T}に属することの議論には問題がないが,{X}{T}に属することの議論はどうだろうか.そもそも{\bigcap \varnothing}の指示内容は何だろうか——それが存在するとして,それは果たして集合だろうか?

(念のために付言すれば,通常の集合論では{\bigcap \varnothing}を考えない.たとえばキューネン『キューネン数学基礎論講義』p.32とそこにおける議論を見よ).

■2.フィルターへの偏愛
位相空間はフィルターを用いて定義することもできる.この《フィルター》というのはブール代数などでも研究されるフィルターと大体同じ概念である.(Xの冪集合をブール代数とみなしたときの「ブール代数のフィルター」はこの本での「フィルター」になっている).フィルターを通して眺めると連続性の議論がやや代数的な雰囲気になる.とはいえ,この本で扱われている範囲ではあまりフィルターを持ち出して議論する旨味はそんなに感じられない.読んで理解するのが結構大変なわりにはどこへもたどり着けないようなもやもやした気持ちが残る.

■3.おまけ:公理(O3)
先述したように,ブルバキの位相空間の公理は(O1)(O2)で尽くされているのだが,しばらく読み進めるとChap 1 sec8.4 Regular Space Prop.11 に(O3)が登場している.なぜこの公理が(O3)と呼ばれるのにふさわしいのか,などは全く説明されていない.やはりこの本はクセが強い.

(latex)新しいパッケージを入れただけでコンパイルできなくなる問題

■概要:新しいパッケージを入れただけでコンパイルできなくなったら一度関連ファイルを削除してみよう.

■編集しているPDFにハイパーリンクを追加しようと思い,プリアンブルに \usepackage{hyperref} を追加してコンパイルしたところ:
Paragraph ended before \Hy@setref@link was complete.

というメッセージが出て止まってしまった.関連するファイル,つまり hoge.aux, hoge.idx, hoge.out, hoge.log を一度全部削除してからコンパイルしたら通った.これらの関連ファイルはTeXworksの「ファイル」メニューから削除できる.

latexのソースからMeCabを用いて名詞だけ抜き出す

■記事の概要:latexのソースから形態素解析器を用いて名詞だけ抜き出したリストを作る.
■環境:MinGW または MSYS2 (Cygwin でも多分大丈夫だろうな~と思うが試していない)
■主な道具:MeCab, python3, make

■動機と背景:latexで作成しているPDFファイルのページ数が増えてきたので,索引を付けようと考えた.(索引はlatex の\indexという命令で作れるが,この記事ではこれ以上触れない).最初は索引の項目を手で付けていたが,思いついたものを十個ぐらい挙げたら飽きてしまった.そこで,《latexソースファイルの中から名詞だけ抜き出す》ことを考えた.

■環境整備
1.MinGW または MSYS2 については環境整備が済んでいるものとする.
2.MeCabのインストール:Windows用に配布されているバイナリを使う.公式からリンクされているダウンロードページ(http://taku910.github.io/mecab/#download)からBinary package for MS-Windowsという項目の直下の mecab-0.996.exe をダウンロードし,インストールした.インストール時にエンコーディングを指定するように言われる.今回の目的はlatexのソース処理なので utf-8 を選ぶ.(デフォルトだとShift-JPだったように記憶している).
3.Pythonのインストール:Windows用に配布されているバイナリを使う.公式ページ(https://www.python.org/)からDownload/latestに飛び,そこから「Windows x86-64 executable installer」と題されたファイルをダウンロードし,インストールした.この記事が書かれた時点での最新版は3.6.4であった.
4.パスを通す.MecabとPythonがMinGWシェルから見えるようにパスを通す必要がある.(MinGW なら
C:\MinGW\msys\1.0\home\YourUserName, MSYS2 なら C:\msys64\home\YourUserName などに置いてある).bashrc の下の方に次のような行を加える:

export MECABPATH=/c/MeCab
export PATH=$PATH:$MECABPATH/bin

export PYTHONPATH=/c/Python3.6.4
export PATH=$PATH:$PYTHONPATH
export PYTHONIOENCODING=UTF-8

※《/c/MeCab》や《/c/Python3.6.4》は各自のインストールの実態に合わせて適宜変更してほしい.
※最後の《export PYTHONIOENCODING=UTF-8》という行はパスを通しているのではなく,ユニコード文字(utf-8)をpython3で扱うときに必須らしい設定である.

■MeCab用のユーザー辞書作成
MeCab には「微分」や「積分」のような一般的な用語は(Windowsバイナリに同梱の)辞書ファイルに登録されている.しかし,それほど一般的でない用語は登録されておらず,バラバラの言葉や文字として認識されてしまう.そこでユーザ辞書を作成する.ユーザ辞書の元になるデータは次のような形式のcsvファイルである:

無限小,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED
無限大,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED
無限小量,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED
無限大量,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED

「アアアア」などとなっている箇所は本来きちんとした読みを登録するのだが面倒であり,今回の業務と無関係なのでこのようにしてある.(今回は説明を省略するが,一行に一つ単語を書いたファイルからこのようなファイルを自動生成している.)「REGISTERED」は後で解析結果を加工するためのヒントとするための追加タグである.

■Makefileの作成
次のようなMakefileを用意する.

help:
	@grep -E '^[0-9a-zA-Z_-]+[[:blank:]]*:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[1;32m%-30s\033[0m %s\n", $$1, $$2}'

dict : mecab.csv ## add user dictionary for mecab by mecab.csv
	mecab-dict-index -d$(MECABPATH)/dic/ipadic -u ./mecab.dic -f utf8 -t utf8 mecab.csv

mecab : hoge.tex ## analyze hoge.tex by mecab
	$(eval MECAB_OUT := $(strip $(basename .tex $ $(UNIQ)
	python extractNoun.py  $(UNIQ) > $(RESULT)
	rm  $(MECAB_OUT) $(UNIQ)

make dict としてやると mecab.csv が処理され mecab.dic というMeCab用ユーザー辞書が作成される.(helpターゲットのルールについては以前の記事を参考にしてほしい).

make mecab としてやるとまずターゲットの hoge.tex が MeCab で処理され,hoge-out.txt が生成される.このファイルはhoge.texのすべての内容を品詞分解して一行に一つずつ並べたものになっているので重複が多い.そこでhoge-out.txt sort し uniq して重複を除去して hoge-out-u.txtを生成する.(前段の sed については以前の記事を参考にされたい.)今回は「名詞」とタグ付けされたものだけ欲しいので,hoge-out-u.txt を自作のpythonスクリプト extractNoun.py で処理して最終結果の hoge-nouns.txt を得る.

★Makeルールの中で変数を定義する方法については『makefile 動的に変数に代入 共通して使う』を参考にさせて頂いた.

■pythonスクリプト extractNoun.py

# -*- coding: utf-8 -*-
import sys
import re #正規表現
import codecs
import copy

reNegIgnoreFlag = re.compile('REGISTERED')
reNeg = re.compile('接頭詞')
rePos = re.compile('(.+?)名詞')
reNum = re.compile('(\d+)')
reSymbols = re.compile('[!\$%\#&\(\){}\+,\-@\.\\\\=\"\'\*:;\?–\[\]|_`\^,]+')

def main():
    f = open(sys.argv[1], 'r', encoding="utf-8_sig")
    input = f.readlines()

    for line in input:
        myFilter(line)

def myFilter(line):
    pos = rePos.search(line)
    neg1 = reNeg.search(line)
    neg2 = reNegIgnoreFlag.search(line)

    if pos and (not neg1) and (not neg2):
        result = pos.group(1).strip()
        isnumber = reNum.search(result)
        containsSymbols = reSymbols.search(result)
        if (not isnumber) and (not containsSymbols):
            sys.stdout.write(result)
            sys.stdout.write('\n')

if __name__ == '__main__' : main()

解説:関数 main() では,一番目の引数 sys.argv[1] として与えられたファイル名を持つファイルを開き,readlines で行の集まりに分解し,各行を関数 myFilter() で処理している.
関数 myFilter() では,事前にコンパイルされた5つの正規表現 reNegIgnoreFlag,reNeg,rePos,reNum,reSymbols を使って「欲しそうなものを抜き出し,要らないものを弾く」ことをやっている.それぞれの正規表現の目的は次の通り:

・reNegIgnoreFlag:MeCabのユーザー辞書に登録済みの単語を検出するため.(MeCabのユーザー辞書のcsvファイルは索引づくりのヒントファイルを兼ねており,そこにまだ登録されていない単語を探すのが今回の目的なので).
・reNeg:「名詞」タグが付いているもののうち,さらに「接頭詞」というタグが付いたものを排除するため.このタグがつくものは「不」「無」「第」「最」などの一文字単語(?)であり,今回の目的にはノイズなので弾く.
・rePos:「名詞」タグを検出するため.
・reNum:年号などの数字列を弾くため.
・reSymbols:latexソースを自然言語解析器にかけた結果として大量の無意味記号列が(MeCabによって,仕方なく)「名詞」に分類されてしまうためそれらを弾くため.

export PYTHONIOENCODING=UTF-8

pythonでユニコードを扱いたいときは .bashrc にこう書いておくといいみたい.とりあえず,これで sys.stdout.write にまつわる UnicodeEncodeError が解消してくれた.

(latex)mdframed 環境の外に脚注を置く方法(tablefootnote)

mdframed 環境中で\footnoteを使うと,mdframed 環境の「内側に」脚注が作られてしまう.これを回避するためには次のようにすればよい:

% !TEX TS-program = platex
% !TEX encoding = UTF-8 Unicode
\documentclass[16pt]{jsarticle}
\usepackage{minitoc}
\usepackage[dvipdfmx]{graphicx}
\usepackage{textgreek}
\usepackage{tikz}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tablefootnote}

\makeatletter
\AfterEndEnvironment{mdframed}{%
\tfn@tablefootnoteprintout%
\gdef\tfn@fnt{0}%
}
\makeatother

\newcommand{\textgreek}[1]{\begingroup\fontencoding{LGR}\selectfont#1\endgroup}

\title{金について}
\date{}
\begin{document}
\maketitle

金\footnote{ギリシャ語では{\textgreek{qrus\'os}}と呼びます}は(1)希少な鉱物資源であり(2)加工が容易であり、特に伸展性に富む(3)美しい;といった性質により、世界中で珍重されています。

\begin{mdframed}
銀\tablefootnote{ギリシャ語では{\textgreek{ashm\'enio}}と呼びます}は大和言葉では「しろがね」と呼ばれていました。室温における可視光線の反射率は、金属中で最大の98\%です。
\end{mdframed}
\end{document}

つまり上のようにプリアンブルを整備した上で\tablefootnoteを使えば良い.