メモの日々


2003年01月04日(土) 昨日は雪で今日は晴れ

[life] 冬休み出勤(3)

三が日は休んだ。今日は誰もいない。っておれが来た時間が遅いだけだと思うけど。

会社の年賀状が大量に余っておいてあるのを発見。金の無駄使いだ。たかが知れてるけど。

どういうわけかWindows2000に付いてくるピンボールに夢中になってしまい、仕事あまり進まなかった。ピンボールはどうしても少尉以上になれない。下手。


2005年01月04日(火)

  • プリンタ処分はもうすぐ完了します。

やること

  • プリンタ処分
  • リンク元のスリム化
  • ナンバーアナウンス解約
  • tDiaryバージョンアップ
  • FSWikiバージョンアップ
  • 2004年分決算

2006年01月04日(水)

  • 坦々と年が明けた。明日から仕事。
  • 久しぶりに色々なウェブサイトを見た。とても見きれない。

[service] 「Google モバイル 検索メール (Beta)」

試しにメイルを出してみたが返事が来ない。

FAQの「検索メールはどの携帯電話会社のものがサポートされていますか」にウィルコムが含まれていないからかな。なんでや。

[service] 「Google Sitemap」

随分前に使おうとして設定してみたが、「404 (ファイルが見つかりません) エラー ページのヘッダーで 200 (OK) ステータスが返されました」というエラーになってしまい何もできないでいた。

今日やっと思い腰を上げてエラーの解消に手をつけ、.htaccessに

ErrorDocument 404 "The requested URL was not found on this server.

と書くことで対処できた(参考:ErrorDocument ディレクティブのマニュアル)。

でも次はサイトマップというXMLファイルを用意しなければいけないようだ。これはまた今度やろう。

[service][link] 「IBM 情報処理用語英和対訳集」 (IBM)

ネバーバード日記より。便利そう。

[web] 「仕様書に見るHTML」 (The Web KANZAKI)

是非是非読んでおきたいがまだ読んでいない。

[soft][web] 「CSSED - "A GTK-2 CSS Editor"」

よさそうなCSSエディタなんだけど、別途GTKをインストールする必要があるみたいなのが面倒。MOONGIFTより。

[java] 「SWTを用いた JavaからWin32APIへのアクセス」 (いがぴょんの日記ウェブページv2)

SWTで色々やる話をメモ。

[tdiary] 「Graphviz プラグイン」

簡単なノーテーションから複雑なグラフを自動生成する Graphviz というアプリケーションを tDiary 上から利用するためのプラグインです。

現在のところ PNG 形式で生成された画像を埋め込むことができます。

使いたくなることもあるかも。tdiary-devel MLより。

やること

  • 収入印紙
  • 税務署
  • 歯科には保険証

2007年01月04日(木)

[soft][windows] 「TracPack」 (Ultimania Organization)

All-In-One-Tracのようなもの。

All In One Tracと何が違うの?

  • TracのバージョンがAll In One Tracより新しいです(2007/01/01現在)。All In One Tracは0.9.x系ですが、TracPackは0.10.x系を採用しています。
  • 新しいプロジェクトのためのSVNリポジトリとTracプロジェクトをワンストップで作成することができます
  • SubversionのコミットメッセージをTracのチケットのコメントに追加することができます。SubversionとTracがより蜜に連携させることができます。
  • Webの管理画面から様々な設定を簡単に行うことができます。

執筆時時点では、こんなところです。

とのこと。


2008年01月04日(金)

[life] 職場へ

冬休み中だが仕事を進めようと出掛けたが、入館カードが使えず中へ入れなかった。うーむ。

仕方ないのでヨドバシでプリンタインク/CDROM/液晶拭きだけ買って帰ってきた。

[tdiary] カテゴリ関連で二重にHTMLエスケープ

カテゴリページの期間をずらすためのリンクの表示がおかしい件は、HTMLエスケープが二重に行われているからのようだった。他に、カテゴリ内の文字列も二重にエスケープされている所を見つけたので、合わせてパッチを作って送ったら採用してもらえた。


2009年01月04日(日)

[xrea] ウェブサイトのデザインを変えた

軽い気持ちでデザインの変更に手を付けたら大変な時間を要し、正月が終わってしまった。

苦労したのは

  • XREA故に上部に注入される広告への対処
  • tDiaryにおけるメイン画面とカテゴリ一覧画面の両立
  • 書影のあるページをIEで見るとおかしい
  • これを期にFSWikiをバージョンアップしたら色々問題発生
  • 年明けに伴う微調整も必要だ

など。書いてみたらあまりないなあ。

[xrea] FSWikiを3.6.3にバージョンアップ

上にも書いたけど、久ーしぶりにFSWikiをバージョンアップした。

まずは手元で動作確認をしようとしたら、「Premature end of script headers」というありがちなエラーになり動かない。調べると、wiki.cgi の改行コードが CR+LF になっていた。改行コードを LF に直して試すと別な箇所でエラーに。どうやらあらゆるファイルの改行コードが CR+LF になっており、これを修正しないと動作しない模様。

次のような感じでnkfを使ってチマチマと改行コードを変更していったら動くようになった。

find . -name '*.pm' | xargs nkf -E -e -Lu -d --overwrite

「-E -e」を付けないと勝手に文字コードが変更されてしまうので注意。nkfは癖があるなあ。

FSWikiの掲示板で質問してみたところ、改行コードが CR+LF になっていたのは配布ファイル作成のミスだったみたい。今では改行コードが LF に修正されたものをダウンロードできる。

んで、古いCSSのままFSWikiを入れ替えたらデザインが崩れてしまった。HTMLの構造が少し変わっているようだ。丁度CSSを作り直していた所なので構わないけれど。どうしてもサイドバーをうまくデザインできなかったので、Wikiからはサイドバーを削除した。

tDiaryもバージョンアップしたいけどそれはまた今度。

[tdiary][javascript] tDiaryの各日に編集用リンクを追加するGreasemonkeyスクリプト (3)

サイトのデザインを変更したら以前作ったGreasemonkeyスクリプト

が動かなくなってしまった。

原因は、body直下にmainというclassのdivが存在する前提のスクリプトになっていたため。今回mainを囲む新しいdivを追加したので動かなくなってしまった。なので、HTMLの構造に前提条件を付けずに動くように修正したつもり。

これのためだけにGreasemonkeyをインストールしているが、無駄なのでブックマークレットで作り直したいと思っている。

今気づいたけど、mainを更にdivで囲うのは標準的なサイドバーの作り方と違う。直すべきかもなあ。

[xrea] ウェブサイトのデザインを変えた (2)

というわけで、再度デザイン変更。

  • tDiaryにてmainを囲っていたdivを削除した。これにより、サイドバーの幅を固定にできなくなった。サイドバーの幅がブラウザの幅に比例するのは嫌いだったが、やってみたらそれ程変ではないかも。
  • Wikiのサイドバーを復活させた。

など。

やること

  • 換金

2011年01月04日(火)

[life] ドコモの携帯電話を購入

おれはウィルコムユーザなのだけれど、必要があってドコモの携帯を買った。

ヨドバシカメラで1円のものを購入。ただし、1円にするにはドコモのオプション契約に6つ入る必要がある。オプションに1つ入る毎に500円程度値引きされる仕組みで、オプションに入らなくても3000円ちょっとで買える。オプションは6つとも契約した。そして購入後に不要なオプションは解約した。解約はiモードやPCからすぐに行えた。

携帯本体は1円なんだけど、充電用のACアダプタと卓上ホルダが付属していない機種で、それの購入には代金が必要だった。そして卓上ホルダは売り切れとのこと。ドコモショップに行っても売り切れで、困ったなあ。

帰って色々設定してみたけど、難しい。ドコモなら携帯のメニューは洗練されているかと思っていたけれど、そんなことはなく、何をどこで設定できるのかを覚えるのは大変そう。説明書にもちゃんと書かれていないし。暗証番号が何種類もあるのも面倒だなあ。

やること

  • 定期券

2014年01月04日(土)

[java] JavaFXでFXMLを読み込む

JavaFXを使ってみる。公式ドキュメントは

かな。日本語の情報はJavaFX 2で始めるGUI開発の連載くらいしか見当たらないのでこれを順番に読んでみる。この連載は目次が見当たらず不便。連載の第1回ではFXMLを読み込む例が説明されているのでそれを試してみる。

メインクラス

JavaFXにはjavafx.application.Applicationクラスが用意されている。ひとまずはこれのサブクラスでmain()を実装すればよさそう。

package hello;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Hello extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
	Parent root = FXMLLoader.load(getClass().getResource("Hello.fxml"));
	primaryStage.setScene(new Scene(root));
	primaryStage.show();
    }

    public static void main(String[] args) {
	launch(args);
    }
}
  • main()ではApplication.launch()を呼び出す。
  • そうするとApplication#start()が呼ばれるようなので、ここでメインウィンドウを作成する。
  • StageがSwingのJFrameみたいなものなのかな。
  • StageにはSceneを設定している。
  • SceneにはParentを設定している。
  • ParentはFXMLLoader.load()を使ってFXMLから作れるみたい。

FXML

メインクラスでロードしているFXMLは次のような感じ。

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="300">
  <children>
    <Label text="ハロー" />
  </children>
</AnchorPane>
  • ルート要素をAnchorPaneにしている。このクラスがParentのサブクラスだからFXMLLoader.load()の戻り値をParent型の変数に代入できるみたい。
  • AnchorPaneの大きさを指定していて、それがウィンドウの大きさに影響する。
  • FXMLの要素にはimportしたクラス名を指定できる。

実行結果

Helloを実行すると次のようなウィンドウが表示された。

表示されたウィンドウ


2020年01月04日(土)

[dev][c++] CMakeを使う

CMakeについてメモ。

ドキュメント

リファレンス。

ガイド的な文書。

基本

C++のコードをCMakeでビルドする例を示す。ファイル構成は次の通りとする。

.
├── CMakeLists.txt
├── src
│   ├── CMakeLists.txt
│   ├── hello.cpp
│   ├── hello.h
│   └── main.cpp
└── test
    ├── CMakeLists.txt
    ├── main.cpp
    └── test_hello.cpp

testのビルドは後回しとして、まずsrc配下のプログラムをビルドできるようにする。CMakeLists.txtとsrc/CMakeLists.txtをそれぞれ次のように書く。

cmake_minimum_required(VERSION 2.8)

add_subdirectory(src)
add_executable(hello
  main.cpp
  hello.cpp
)
  • cmake_minimum_requiredは書かないと警告が出るので書く。2.8かかなり昔のバージョンだがCentOS 7のCMakeはこのバージョン。
  • add_subdirectoryでsrc配下のCMakeLists.txtを読み込むことを指示する。
  • add_executableでビルドする実行ファイル名とそれをビルドするためのソースファイル群を指定する。ここにヘッダファイルも記述すべきかはよくわからない。ヘッダファイルを含めないとIDEを使った場合にヘッダファイルが表示されないかもしれないが、ビルドするだけならヘッダファイルを含める必要はない。
    • add_executableにソースファイルを列挙するのはできれば避けたい。fileのGLOB_RECURSEを使うと手動での列挙を避けられるが、これを使うとソースファイルの増減時に手動でのCMakeの再実行が必要になり運用が面倒になる。GLOBはリファレンスマニュアルに「We do not recommend using GLOB to collect a list of source files from your source tree. 」と言及されており、また上でリンクしたEffective Modern CMakeにも「Don't use file(GLOB) in projects.」とあり使用が推奨されていない模様。
    • file(GLOB)にはCONFIGURE_DEPENDSというオプションがある。これはCMake 3.12で追加されておりfile(GLOB)の問題を一部解決するものみたいなのだけれど、試せていない。

CMakeLists.txtとソースコードを用意したら、cmakeコマンドを実行するとビルド環境(LinuxならMakefile)が作られる。

$ mkdir build
$ cd build
$ cmake ..

ビルドを行うにはビルド環境にて--buildオプション付きのcmakeコマンドを実行する。

$ cd build
$ VERBOSE=1 cmake --build .

これで build/src/hello が作られる。環境変数VERBOSEをセットするとビルド時のコマンドが出力されるようになるので指定している。CMake 3.14で--verboseオプションが追加されており、これを使うと環境変数は不要なのかもしれないが試せていない。

cmake --buildはCMakeLists.txtが更新されているとビルド環境の再構築(上記の「cmake ..」相当)もしてくれる。

ビルドタイプの切り替え

ビルド環境構築時にcmakeコマンドにCMAKE_BUILD_TYPEを指定することでコンパイルオプションを切り替えることができる。

$ cmake .. -DCMAKE_BUILD_TYPE=Debug

手元のCMake 2.8だとCMAKE_BUILD_TYPEを切り替えることでGCCのコンパイルオプションが次のように変わる。

未指定オプションなし
Debug-g
Release-O3 -DNDEBUG
RelWithDebInfo-O2 -g -DNDEBUG
MinSizeRel-Os -DNDEBUG

コンパイルオプションの明示的な指定

コンパイルオプションをカスタマイズしたいときにはtarget_compile_optionsを使う。例えば src/CMakeLists.txt に次のように追記する。

target_compile_options(hello
  PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>
  PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall>
  PRIVATE $<$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>:-ggdb3>
)
  • 条件に応じて異なるオプションを指定するためにgenerator-expressionsを使用している。
  • Visual C++に対しては/source-chasetオプションを使用してソースコードの文字コードがUTF-8であることを通知している。
  • GCCに対しては、CMAKE_BUILD_TYPEがDebugの場合にオプションを追加するようにしている。
  • target_compile_optionsで指定したオプションは、CMAKE_BUILD_TYPEにより付与されるオプションより後ろに指定される。

インクルードディレクトリとリンクするライブラリの指定

インクルードディレクトリはtarget_include_directories、リンクするライブラリはtarget_link_librariesで指定できる。

Boost.Logを使用する例を記す。

src/CMakeLists.txt に次を追記する。

find_package(Boost 1.71 REQUIRED COMPONENTS log thread)
find_package(Threads REQUIRED)

target_include_directories(hello
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
  PRIVATE ${Boost_INCLUDE_DIR}
)
target_link_libraries(hello
  PRIVATE ${Boost_LIBRARIES}
  PRIVATE ${CMAKE_THREAD_LIBS_INIT}
)
  • find_package(Boost)でBoostを見つけさせる。また、ライブラリとしてlibboost_logとlibboost_threadを使うことを指示している(libboost_threadを指定しているのはlibboost_logが必要としているため。CMakeのバージョンが高い場合はthreadを明記しなくてもこの依存関係は自動的に解決される)。
  • libboost_threadをリンクするにはスレッドライブラリが必要になるため、find_package(Threads)で見つけさせる。これもCMakeのバージョンが高い場合は明記しなくて大丈夫そう。
  • target_include_directoriesでインクルードディレクトリを指定する。find_package(Boost)が変数Boost_INCLUDE_DIRにBoostのインクルードディレクトリを設定するのでそれを使っている。
  • target_link_librariesでリンクするライブラリを指定する。find_packageが変数Boost_LIBRARIESと変数CMAKE_THREAD_LIBS_INITを設定するのでそれを使っている。CMakeのバージョンが高い場合は ${CMAKE_THREAD_LIBS_INIT} と書く代わりに Threads::Threads と書ける。

また、本質的な記述ではないが、CMakeLists.txt の方には次を追記している。add_subdirectory()より上に書く必要がある。

set(Boost_USE_STATIC_LIBS ON)
set(Boost_NO_BOOST_CMAKE ON)
  • Boost_USE_STATIC_LIBSはBoostのライブラリを静的に(libboost_log.aを)リンクするためのもの。動的リンクする場合は不要。
  • Boost_NO_BOOST_CMAKEはBoostに添付されているCMake設定ファイルを読み込まないようにするもの。手元の環境ではこうしないとfind_package(Boost)が失敗してしまうために指定した。

テストのビルド

後回しにしていたtestディレクトリ配下のビルドをできるようにする。まず CMakeLists.txt に次を追記する。

enable_testing()
add_subdirectory(test EXCLUDE_FROM_ALL)
  • enable_testingはビルドするだけなら不要だが、CMakeを通じてテストの実行も行うのなら必要になる。Visual Studioを使うならこれでVisual Studioのテスト機能と連携するようになるので便利。
  • add_subdirectoryに指定しているEXCLUDE_FROM_ALLは、デフォルトのビルド時にはテストのビルドを行わないようにするため。これによりtest配下のコードはビルドターゲットを明示的に指定した時だけビルドされるようになる。

test/CMakeLists.txtは次のように書く。src/CMakeLists.txtとそれほど変わらない。

find_package(Boost 1.71 REQUIRED COMPONENTS unit_test_framework)

add_executable(hello-test
  main.cpp
  test_hello.cpp
  ../src/hello.cpp
)
target_compile_options(hello-test
  PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>
  PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall>
  PRIVATE $<$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>:-ggdb3>
)
target_include_directories(hello-test
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../src
  PRIVATE ${Boost_INCLUDE_DIR}
)
target_link_libraries(hello-test
  PRIVATE ${Boost_LIBRARIES}
)

add_test(NAME test-hello
  COMMAND hello-test --log_level=test_suite --report_level=short
)
  • テストにBoost.Testを使ったのでfind_packageによりlibboost_unit_test_frameworkを検索している。
  • add_testでテスト名と実行するコマンドを指定する。ここではコマンドとしてadd_executableによりビルドした実行ファイルを指定している。log_levelなどはBoost.Testの方のオプション。

上述の通りtestディレクトリにはEXCLUDE_FROM_ALLを指定しているので、テストをビルドするには次のようにターゲットを明示する必要がある。

$ cd build
$ VERBOSE=1 cmake --build . --target hello-test

テストの実行にはctestコマンドが使えるが、特にこのコマンドを使う必要はない気がする。

インストールの設定

ビルドされた実行ファイルを既定のディレクトリへインストールする設定を追加する。src/CMakeLists.txtに次を追記する。

install(TARGETS hello RUNTIME DESTINATION bin)

これで、生成されるMakefileにインストール用のターゲット(install, install/strip, install/local)が追加される。上のように書くと、インストール先は /usr/local/bin 配下になる。

$ make -C build install

CMake 3.15でcmakeコマンドに--installオプションが追加されているので、このバージョン以降ならインストールにもcmakeコマンドが使えるみたい。

ビルド用のMakefileを用意する

cmakeコマンドの発行は色々面倒なので、Makefileを用意したくなる。次のような感じ。

SHELL := /bin/bash
CMAKEFLAGS := -DCMAKE_BUILD_TYPE=Release

build_release_dir := build-release
build_debug_dir := build-debug

.PHONY: release
release: $(build_release_dir)/Makefile
	cd $(<D); VERBOSE=1 cmake --build .

.PHONY: debug
debug: CMAKEFLAGS := -DCMAKE_BUILD_TYPE=Debug
debug: $(build_debug_dir)/Makefile
	cd $(<D); VERBOSE=1 cmake --build .

.PHONY: test
test: CMAKEFLAGS := -DCMAKE_BUILD_TYPE=Debug
test: $(build_debug_dir)/Makefile
	cd $(<D); VERBOSE=1 cmake --build . --target hello-test
	$(<D)/test/hello-test --log_level=test_suite --report_level=short

.PHONY: install
install: release
	$(MAKE) -C $(build_release_dir) install/strip

.PHONY: clean
clean:
	rm -rf $(build_release_dir) $(build_debug_dir)

$(build_release_dir)/Makefile $(build_debug_dir)/Makefile:
	mkdir -p $(@D)
	cd $(@D); cmake .. $(CMAKEFLAGS)

最終的な状態

最終的なCMakeList.txtは次の通り。

cmake_minimum_required(VERSION 2.8)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_NO_BOOST_CMAKE ON)

add_subdirectory(src)

enable_testing()
add_subdirectory(test EXCLUDE_FROM_ALL)

最終的な src/CMakeList.txt は次の通り(行の順序は入れ替えた)。

find_package(Boost 1.71 REQUIRED COMPONENTS log thread)
find_package(Threads REQUIRED)

add_executable(hello
  main.cpp
  hello.cpp)
target_compile_options(hello
  PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>
  PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wall>
  PRIVATE $<$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>:-ggdb3>
)
target_include_directories(hello
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
  PRIVATE ${Boost_INCLUDE_DIR}
)
target_link_libraries(hello
  PRIVATE ${Boost_LIBRARIES}
  PRIVATE ${CMAKE_THREAD_LIBS_INIT}
)

install(TARGETS hello RUNTIME DESTINATION bin)

test/CMakeList.txtは上述のまま。