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

【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

論理包含の定義に関する違和感について

論理学

論理包含という論理演算子があります。A ⇒ B は「AならばB」と読み、ブール代数的には !(A && !B)(または !A || B)と定義されます。

A B A ⇒ B !(A && !B)
T T (T ⇒ T) = T !(T && !T) = !(T && F) = !F = T
T F (T ⇒ F) = F !(T && !F) = !(T && T) = !T = F
F T (F ⇒ T) = T !(F && !T) = !(F && F) = !F = T
F F (F ⇒ F) = T !(F && !F) = !(F && T) = !F = T

後ろ2つ(AがFのとき)の定義に違和感があり、なぜこういう演算を考えたのか腑に落ちませんでした。あまり拘っても仕方ないのですが、一応、自分の中では決着が付いたので、現時点での理解を書いておきます。

続きを読む

MS Officeの数式をTeXに変換

F# Win32

Microsoft Officeで数式を書くのに慣れてTeX形式で入力するのが苦痛になって来たので、変換プログラムを作りました。Windows専用です。

【注】自分の必要とする範囲しか実装していません。変換部は200行程度なので、不足があればその都度手直しして使うことを想定しています。

続きを読む

Windows Updateを無効にするウィルス

ここ半年くらい自分の関係する範囲で、CPU使用率が張り付いてWindows Updateが無効になるという問題が頻発して悩んでいました。結論から言えばExpiroというウィルスの亜種が原因でした。

なお、似たような症状はサービスやドライバの不具合でも発生します。

使用しているウィルス対策ソフトウェアでは検出されなかったため原因を誤認し、ウィルスが原因だと気付くのに半年程度掛かってしまいました。同じ現象で悩んでいる方への情報提供として記事に残しておきます。

【注意】筆者はセキュリティの専門家ではありません。回答できるだけの知見もなく、ご相談には応じかねます。

続きを読む

Springer 無料本の紹介 (2016年1月5日現在)

2015年末にSpringerが本を大量に無料提供して話題になりましたが、特にアナウンスもないまま数日で提供は終了しました。

2016年1月5日現在、無料提供の本がまた少し増えているようです。その中からいくつか面白そうなものを選んでみました。いつまで提供が続くか不明なため、興味のある方はお早目に。

続きを読む

池袋バイナリ勉強会のシリーズ

勉強会

【お知らせ】2015年8月23日をもって会場は閉鎖となりました。一部の勉強会につきましては別会場にて存続します。

池袋バイナリ勉強会では色々なテーマを試して来ましたが、最後に残った勉強会をまとめました。

不定期
池袋バイナリ勉強会看板勉強会です。コンパイラやOSで遊びます。
池袋物理学勉強会古典力学からきっちり学んで、相対論、量子論の理解を目指します。
※ 別会場にて存続
毎月(休日)
初級ラテン語リーディング言語学的意義が非常に大きい言語です。勉強して損はありません。
※ 別会場にて存続
初心者のための線形代数勉強会行列やベクトルの性質を扱う数学の分野を勉強します。
※ 別会場にて存続
隔週(水曜日)
「理論から学ぶ データベース実践入門」読書会リレーショナルモデルによるデータベースの理論を本で勉強します。
※ 別会場にて存続

Windows上のXamarin StudioでF#プロジェクトをビルド

Mono F#

Windows上のXamarin StudioでF#プロジェクトをビルドしようとすると、最近のバージョンでは失敗します。

Xamarin Studio F# Language Binding 結果
4.0.12 3.2.15 OK
4.0.13 3.2.15 ビルドに失敗しました。. MSBuild operation failed
4.0.13 3.2.19 ビルドに失敗しました。. MSBuild operation failed

本体とアドインの組み合わせから推測すると、どうやら本体側の仕様変更が影響しているようです。

【追記】この件に関して、既にgithubのプロジェクトIssueが上がっていました。

続きを読む

NetBSDでMIPSのハローワールド

NetBSD MIPS

NetBSDにはアセンブリ言語のサンプルが入っています。

PowerPC用ですが、MIPSに移植してみます。

PowerPC

主要部分を抜粋します。

_start:
    # write(STDOUT_FILENO, message, MESSAGE_SIZE)
    li      %r0, 4                  # r0: write(2) syscall number.
    li      %r3, 1                  # r3: first argument.
    addis   %r4, %r0, message@h     # r4: second argument.
    ori     %r4, %r4, message@l
    li      %r5, MESSAGE_SIZE       # r5: third argument.
    sc

    # exit(EXIT_SUCCESS)
    li      %r0, 1                  # r0: exit(2) syscall number.
    li      %r3, 0                  # r3: first argument.
    sc

writeシステムコールとexitシステムコールを呼んでいます。

MIPS

MIPSに移植しました。

_start:
    # write(STDOUT_FILENO, message, MESSAGE_SIZE)
    li      $v0, 4                  # v0: write(2) syscall number.
    li      $a0, 1                  # a0: first argument.
    lui     $a1, %hi(message)       # a1: second argument.
    ori     $a1, $a1, %lo(message)
    li      $a2, MESSAGE_SIZE       # a2: third argument.
    syscall

    # exit(EXIT_SUCCESS)
    li      $v0, 1                  # v0: exit(2) syscall number.
    li      $a0, 0                  # a0: first argument.
    syscall

多少文法は異なりますが、処理内容はほとんど同じです。

動作確認

動作確認はgxemul上のNetBSD/evbmips環境で行いました。

# uname -a                                                                      
NetBSD  6.1.2 NetBSD 6.1.2 (MALTA) evbmips
# gcc -nostdlib mips.s                                                          
ld: warning: cannot find entry symbol __start; defaulting to 00000000004000f0
# file a.out
a.out: ELF 32-bit LSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, for NetBSD 5.99.56, not stripped
# ./a.out
Hello, world

gxemulへのインストール方法などは以下を参照してください。

調査方法

MIPSアセンブリには慣れていないので、書き方から調べました。即値やアドレスの代入方法はC言語で簡単なサンプルを書いて確認しました。

test.c

main() {
    int a = 0x12345678;
    const char *b = "abc";
}

アセンブリを出力します。gxemul上で処理するとファイル転送が面倒なため、Windows上でクロスコンパイラを動かしています。(gcc-4.5.4-msys-cross-mipsel-netbsd-6.1.tar.xz

$ mipsel-netbsd-gcc -S test.c

出力されたtest.sを見ると、即値の代入部分はすぐ分かります。

    li      $2,305397760            # 0x12340000
    ori     $2,$2,0x5678
    sw      $2,8($fp)

直後に文字列の代入部分があります。

    lw      $2,%got($LC0)($28)
    nop
    addiu   $2,$2,%lo($LC0)
    sw      $2,12($fp)

GOT経由でポインタを取得しています。これはちょっと複雑なので、GOTを使わないように指示します。

$ mipsel-netbsd-gcc -S test.c -mno-abicalls

単純になりました。

    lui     $2,%hi($LC0)
    addiu   $2,$2,%lo($LC0)
    sw      $2,4($fp)

これを参考にサンプルを移植しました。

余談

バイナリ勉強会で最初に提示するサンプルとやっていることは同じです。

https://bitbucket.org/7shi/ikebin/wiki/pdp11/hello

/ write(1, hello, 6);
mov $1, r0
sys write
hello
6

/ exit(0);
mov $0, r0
sys exit

.data
hello: <hello\n>

NetBSDのサンプルの存在は後で教えてもらいました。最小限のハローワールドを書こうとするとwriteとexitだけになってしまうのは、自然な成り行きでしょうか。