サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
体力トレーニング
satosystems.hatenablog.com
フォントの高さ、というのがプラットフォーム毎に少しずつ違うようなので、簡単にまとめてみた。 ここで言う「高さ」とは、一行表示する際に必要になる高さのこと。つまり、次の行との余白は含まない。 Microsoft (Win32 API) の場合 Height = Ascent + Descent + InternalLeading Win32 API は ExternalLeading というのが特徴的。要するに、上余白と下余白で、そこを API で細かく操作できるのは優位性がある。 Oracle (Java) の場合 Height = Ascent + Descent + Leading Leading は図にはないが、Win32 API の InternalLeading と同じ位置にある。また、図では Ascent がアルファベットの頂点にあるように書かれているが、実際にはもっと高い位置
2015年12月25日から2016年1月3日まで、さくらのレンタルサーバで15年ぐらいメンテナンスしている掲示板の刷新を行った。 元の掲示板は Perl で実装してあって、古い掲示板にありがちなヒアドキュメントで HTML を出力する形式になっていて、メンテナンスが非常につらい。もともと Perl は得意だったんだけど、仕事で使わないのでどんどんスキルが落ちていき、今では調べながらじゃないと書きたいことが書けない。 ということで、年末年始は時間があったので Perl をやめて Haskell で再実装した。 まずは、以下。 さくらのレンタルサーバ スタンダードに Haskell 環境を構築する手順 - Qiita ずっとさくらのレンタルサーバ上で Haskell を動かす環境を作ろうと思っていたんだけど、これがようやくきちんと完成した。 Haskell が動くようになったら cgi: A
まずは以下のコードを見てください。 import java.io.File import java.io.FileOutputStream val file1 = new File("\u30C9ラえもん.txt") val fos1 = new FileOutputStream(file1) fos1.write("ぼく、ドラえもん。".getBytes("UTF-8")) fos1.close() val file2 = new File("\u30C8\u3099ラえもん.txt") val fos2 = new FileOutputStream(file2) fos2.write("ぼく、ドラえもん!".getBytes("UTF-8")) fos2.close() 本エントリとは関係ないですが、こうしたちょっとしたコードを書くのに Scala は非常に良いですね。 さて、「ドラえ
この記事は Haskell Advent Calendar 2014 の 8 日目の記事です。 Haskell で SDL を利用してゲーム的な何かを作成するための入門記事です。 環境構築(Haskell Platform) Haskell の開発環境は Windows/Mac/Linux いずれでも構築可能です。僕は普段は Haskell のコーディングは Linux、特に Ubuntu 14.04 を使用することが多いですが、今回は Mac を選択しました。 Haskell Platform は最新を使用します。僕の Mac には少し古いバージョンが入っていたので: $ ghc --version The Glorious Glasgow Haskell Compilation System, version 7.6.3 以下のコマンドで何がアンインストールされるかを確認し: $ un
今日 Java のインナークラスとリフレクション関連でいくつか発見したことがあったので、ここに残しておきます。 以下のようなコードがあります。 import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Foo { private class Bar { private Bar() { } private void baz() { System.out.println("zap! zap! zap!"); } } private void foo() throws Exception { new Bar().baz(); // (5) Class clazz = Class.forName("Foo$Bar"); // (1) Constructor constructor = cl
ブラウザ上に表示される文字列の幅を取得する必要があり、以下のサイトにたどり着いた。 javascriptで文字列の描画幅を取得する方法 - Qiita 最小のサンプルにすると、以下のようになる。 <!DOCTYPE html> <html> <head> <script type="text/javascript" src="jquery-1.9.1.min.js"></script> <script> function strWidth(str) { var e = $("#ruler"), width = e.text(str).get(0).offsetWidth; e.empty(); return width; } </script> </head> <body> <span id="ruler" style="visibility:hidden;position:absolut
jQuery で Ajax を行うのにあたり、同一ドメインにアクセスする際には問題ないけど、違うドメインにアクセスしようとする場合、何らかの対応が必要になります。 対応方法が3つあるので、簡単にまとめておきます。 ベース実装 まず、今回のエントリのベース実装はこんな感じです。 <html> <head> <script src="jquery-2.0.3.min.js"></script> <script> $.ajax({ url: 'http://www.ekidata.jp/api/l/11302.json', type: "GET", success: function(res) { console.log(res); } }); </script> </head> <body> </body> </html> これをローカルに任意の名前で保存し(jQuery のダウンロードも忘れ
UUID Wikipedia 日本語版によると UUIDは、分散システム上でどこかが統制を取らずとも、一意に特定可能な識別子の作成を目的としており、UUIDは重複や偶然の一致が起こりえないと確信して用いることができる。 UUID - Wikipedia という。しかしながら、高々 122 ビットで表される数値*1である以上、生成し続ければ確実に重複する。 では、それがどれぐらいの確率なのか。 その説明は UUID Wikipedia 英語版に記載されている。英語だったり数式があったりしてわかりづらいが、説明の一部を訳してみたので、重複しない感が多少は分かるかと思う。 例 1 1 兆個 UUID を生成 生成した UUID が重複する確率より、隕石が頭に降ってくる確率のほうが高い 例 2 100 年間、毎秒 10 億の UUID を生成し続ける その後、UUID をひとつ生成 生成した UU
以下のコードを実行すると: import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamTest { static class MyInputStream extends InputStream { int pos; byte[] data = "HelloWorld".getBytes(); @Override public int read() throws IOException { System.out.println("pos:" + pos + " data.length:" + data.length); if (pos < data.length) { return data[pos++]; } else
スタティックイニシャライザというのは Java をやってる人なら何度も使ったことがあると思う。 Java を 10 年以上やっていて「インスタンスイニシャライザ」というものがあることを先日知った。 public class Test { int i; { // このブロックがインスタンスイニシャライザ System.out.println("1:" + i); i = Math.max(1, 2); System.out.println("2:" + i); } public Test() { } public Test(int i) { this.i = i; } } このコードをコンパイルして逆コンパイルすると、以下のようなコードになる。 public class Test { int i; public Test() { System.out.println("1:" + this.
Android タブレットで表示できる JavaScript ベースのチャートライブラリを探したメモ。 探しているものは、棒グラフと折れ線グラフのコンボチャートを表示できて、できればデータを差分追加することできれいに差分更新されるもの。 描画検証に使ったのは Android 4.3 の Nexus 7 にインストールされている Chrome 29.0.1547.72。 Google Charts URL: https://developers.google.com/chart/ License: Google APIs Terms of Service Method: SVG Tablet: NG 他のライブラリと異なり、JS をダウンロードして組み込むのではなく、Google のサーバの JS を直接指定して利用する形式となる。なので、ライセンスは Google サービスの利用規約という
今日遭遇した問題。 以下のコードは、起動引数に何かを与えるとスレッドを起動して無限に待ち、何も与えないとスレッドを起動せずに無限に待つ。 public class Wait extends Thread { public static void main(String[] args) throws Exception { Wait w = new Wait(); synchronized (w) { if (args.length != 0) { w.start(); } System.out.println("AAA"); w.wait(); System.out.println("BBB"); } } public void run() { System.out.println("XXX"); } } スレッドを起動せずに実行すると、以下が出力されて止まる。無限に待っているわけだ。 A
調査がひと段落ついたので冒険の書にセーブ。 XML のパース Haskell の XML パーサは結構種類が豊富です。 Which Haskell XML library to use? - Stack Overflow によると、 xml: 処理が簡単なら haxml: 処理が複雑なら hxt: 矢印が好きなら hexpat: パフォーマンスを望むなら ということらしく、僕は xml を選択しました。 インストールは以下の要領で行います。 cabal update cabal install xml サンプルのお題は、以下のような XML から、タプルのリストで言語とメッセージを取り出すこと。 <?xml version="1.0" encoding="utf-8"?> <root> <greeting> <language>English</language> <message>hel
鈴川エディタというテキストエディタをご存知でしょうか。 私はついさっき*1知りました。 触れ込みは以下の通り。 小さいメモリ(50MB以下)で大規模テキストファイル(300GB、2,000億行)を編集できる世界唯一の超巨大テキストエディター http://www.szkwjp.com/index.html 興味深いのは他のエディタとの比較。 この比較文を元に、それぞれのエディタのデータ構造を想像して楽しんでみます。 比較文が 2008 年と結構古いので、現在のバージョンとは異なる可能性があります。参考程度ということで。 鈴川エディタ なぜ、50MB 以下のメモリで 300GB のテキストファイルが読み込めるのか。その種明かしは、オリジナルのファイルを 2MB 程度の作業用ファイルに分割し、それらを操作しているためだと思われます。 これなら 300GB のファイルを開く際に、最初の 2MB
下手すると PC が起動しなくなります。 コンピュータには 2036 年問題というのがあって、簡単に言うと、2036 年のある時刻以降、内部時計が 1900 年に戻ってしまうというもの。まあこれぐらいならかわいらしい現象です。 僕は実際に 2099 年 12 月 31 日 23 時 59 分ちょうどに設定してみました。そこからの 1 分はまさにカタストロフィでした。 まず、常駐しているアプリが不正終了したりエラーダイアログを出したりして、1 分後の大惨事を知らない僕はこの状況を少し楽しんでいました。エラーダイアログのキャプチャなんかを撮ったりして。 Cygwin で date コマンドを打つと、196x 年ぐらいだったので、まさに 2036 年問題が発生していました。 出てきたエラーダイアログのひとつは .NET Framework のスタックトレースが出ていたので、なんだろうな、と眺めて
Lua が組み込まれているアプリはどんなものがあるか。 ゲーム World of Worcraft: Diablo を世に送り出した Blizzard Entertainment の看板 MMORPG。コア API が Lua でラップされていて、UI なんかはすべて Lua で書かれているらしい。カスタマイズ(というか拡張)も可能で、Lua が使いこなせればウィザードとしてあがめられるとかなんとか。やったことないからよく知らないけど。 ラグナロクオンライン: 今ではパズドラだけど、GungHo と言えば以前はこれだった。ユーザスクリプトでホムンクルスという NPC? の AI を制御できる。バージョンアップで突然こういうことができるようになるのがオンラインゲームのいいところだな。 FF14: オンラインゲームで Lua はお約束なんでしょうか。マクロ一発で着替えたりとか、複雑な手順を簡素
AWK、Ada、Bash、Boo、C、C#、C++、Clojure、D、Erlang、Forth、Fortran、Go、Groovy、Haskell、Io、Java、JavaScript、Lisp、Lua、OCaml、Objective-C、PHP、Pascal、Perl、Pike、Prolog、Python、R、Ruby、Scala、Scheme、Smalltalk、Tcl でフィボナッチ数を求める処理時間を計測してみました。 フィボナッチ数は漸化式で求められます。 F0 = 0 F1 = 1 Fn+2 = Fn+1 + Fn フィボナッチ数を求めるアルゴリズムはいろいろありますが、今回は以下の再帰で求めるアルゴリズムで統一しました。 #include <stdio.h> int fib(int n) { if (n < 2) return n; return fib(n - 2) +
かなりハマったのでメモ。 Android のカスタムリストは BaseAdapter を継承した独自の Adapter を作成し、getView() メソッドを適切に実装することで凝った見た目のリストが表示できる。 やりたかったことは、アイコン付きでかつ場合によってはチェックボックスのが付いているリストの表示。以下のような感じのもの。 これを以下のようなレイアウトで作った。 <CheckableLinearLayout> <ImageView /> <CheckedTextView /> </CheckableLinearLayout> CheckedTextView に標準のチェックボタンを表示するには以下のように行う。 int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; TypedArray ta = getCon
いろいろ調べていろいろ悩んだ末、OpenGL で使用するモデル形式は、DirectX で使用される X ファイル形式にすることにした。 そこにいたる過程を書き残しておこう。 まったく無知だった頃 OpenGL をまったく知らなかった数年前、OpenGL ではどういう形式のモデルデータを採用しているのか調べていた。 結論としては、OpenGL には、DirectX の .x のような標準の形式は存在せず、自分で自分のプログラムにあわせて定義する必要があることを知った。 なんと面倒な、と当時は思った。 六角大王形式 六角大王のデータ構造は、公開されていて、しかもテキスト形式なので、かなり取り扱いが簡単だなー、と漠然と考えていた。自作するなら六角大王形式(.rok)を読み取るようにしよう、と。 ただ、検討する過程で以下のことに気が付いた。 六角大王は左右対称という制限がある モーションも扱いたい
マクロで関数をオーバーライド。 #include <stdio.h> void foo() { printf("foo\n"); } #define foo() printf("FOO\n") int main(int argc, char *argv[]) { foo(); #undef foo foo(); return 0; } 上記を実行すると: FOO foo と表示される。 ポイントは undef の使い方。 マクロは常に関数のスコープをオーバーライドしてくれて、undef することでマクロのスコープが取り消され、再び関数のスコープが見える。関数に対して undef しても全く意味がない(悪さもしないけど)。 僕はよくこのテクニックを駆使して malloc/calloc/realloc/free をマクロでオーバーライドして、メモリリークを見つけるのに使用する。
VMware ゲスト OS から、ホスト OS に戻るホットキーがある。 これが、Windows ホストの場合は Ctrl+Alt だったりする。 はっきり言って、Ctrl+Alt はゲストが Linux の場合で仮想デスクトップの切り替えに使用されるため、非常に不便。 オプション関係をくまなく見たが、設定箇所はなく、ググってようやく設定ファイルで行えることがわかった。 ここに次を追加。 pref.hotkey.shift = "false" pref.hotkey.control = "true" pref.hotkey.alt = "false" pref.hotkey.gui = "true" 64ビットWin7にインストールしたアプリ - VMware Player関連: みズとおかズ 僕の場合は pref.hotkey.shift = "false" pref.hotkey.co
「開発中にデバッグログを出力したい。でもリリース時には出力したくない」、というような要求はかなりの頻度である。 こんな感じでやることになるだろう(デバッグとリリースを切り分ける #ifdef は省略)。 #include <stdio.h> #include <stdarg.h> #define debug1(fmt, ...) printf("%s(%d):" fmt, __func__, __LINE__, __VA_ARGS__) #define debug2(arg) do { printf("%s(%d):", __func__, __LINE__), printf arg; } while (0) int debug3(const char *fmt, ...) { int rc; va_list va; va_start(va, fmt); rc = vprintf(fmt,
バイナリエディタを検討したので、メモを残しておきます。 世の中には実に多くのバイナリエディタが存在しますが、今回検討したのは、Windows で動作する構造体編集機能を持つものです。目的としては、動的構造体定義が行えるかどうかという検証で、今回取り上げたすべてのバイナリエディタで静的構造体編集機能は備わっています。 動的構造体といのはどういうものかというと、以下のようなものです。 struct Data { int length; char bytes[length]; }; こういう構造は実際のところ割と多用されていて、それをバイナリエディタで気軽に確認・編集したいというのが動機です。 xedit 上図は xedit でビットマップの構造体を表示させてみたものです。 Lua でスクリプトが書けるので期待したのですが、動的構造体の定義は行えませんでした。 TSXBIN 上図は TSXBIN
以下ブログで情報をもらった。 MsysGitのシェル拡張をアンインストールする - namutakaの日記 以下は msysgit のコンテキストメニュー。 アイコンのないのが msysgit、アイコンのあるのが TortoiseGit のそれぞれ Git 操作メニュー。 ずらっと出ているのは許容できるとして、削除しようと思ったのが N キーをショートカットに持つメニューが存在すること。N キーは「送る」であって欲しいため、快適な操作にとても邪魔。 上記ブログでは 32bit 版なので、64bit 版だとどうなるかというと、以下の通り。 cd C:\Program Files (x86)\Git\git-cheetah regsvr32 /u git_shell_ext64.dll上記コマンド実行後、以下のように邪魔なものが消えてくれた。
Ubuntu 12.04 LTS への切り替えメモ。 Unity が使いにくい。慣れの問題以外に色々問題がある。 悩ましい問題 Alt+半角/全角キー Alt+Tab でアプリケーションの切り替えは OK。普通の操作だと思う。 しかし Ubuntu で採用されている Unity では、Alt+半角/全角が、同一アプリ内のみでのウィンドウ切り替えという特殊なキーバインドになっている。 なれると便利なのかもしれないけど、これって普通は IME ON/OFF の切り替えでしょ?しかもこのキーバインドは設定変更できない。 無意識に押してしまうキーバインドなだけに、これは悩ましいを通り越して痛すぎる。 Mozc の設定 過去使っていた Mozc は設定ができたのに、今使っている Mozc は設定画面が開けない。 なんで設定ボタンが活性化してないんだろう? 標準で入っていた Anthy も設定ができな
おお! 結構簡単に動いてしまった。 やり方をメモ。 sudo apt-get install wine wget -c http://hide.maruo.co.jp/software/bin2/hm802_signed.exe wine hm802_signed.exe Wine のインストール中に EULA の確認などで入力が必要だけど、基本はこんな感じ。 秀丸のインストールはカスタムにした方がよいかも。特に拡張子の関連付けとか危ない感じがする。 秀丸の機能を少しだけ試してみた。 マクロ 簡単なマクロが動いた。これは超期待。 常駐秀丸 常駐した。ただしショートカットで呼び出すことはできず。 クリップボード履歴 履歴がとれてる。ただし、秀丸以外の履歴はとれず。 grep 動いた。これは便利。 動作 Wine で動いているので、Windows ネイティブのようなサクサク感はない。新しいエデ
昔、ある時、ふと気がついた。 int i; for (i = 0; i < 10; i++) { } for (i = 0; i < 10; ++i) { } 同じ動作をする for ループなんだけど、i++ と ++i の部分で、i++ の方が処理に無駄がある(下の値とインクリメントした値の両方を保持しなきゃならない)から性能面で劣っていないか、と。 結構ずーっと気になっていたんだけど、腰を上げて確認してみたら、gcc ではどちらも同じだった。以下は for ループ内のインクリメント部分の抜粋 movl _i, %eax /* i を eax に読み込み */ addl $1, %eax /* 1 を eax に足し込み */ movl %eax, _i /* eax を i に戻す */ インクリメントの部分は i++ でも ++i でもこのようになっていて、副作用がないので最小のコー
相変わらず Linux 環境でのエディタが定まらないので、評判の良い Editra というクロスプラットフォームなエディタを試してみた。 見た目 これは現在の秀丸で C 言語を表示した場合。 これが設定をいじった Editra。 表示に関する要求として: 行番号表示は当然必要 構文強調は当然必要 空白文字の可視化 タブ文字が見えなければならない 全角スペースも見えなければならない 半角スペースは見えないほうがよい NBSP は見えたほうがよい(重要ではない) 改行文字の可視化 各種改行がわかるように見えること カーソル位置の行が強調される コードブロックの展開・縮小はあれば望ましい(重要ではない) という感じ。 Editra の不満点は: 改行文字の表示がうるさすぎ 全角スペースが表示されない 半角空白は表示される必要はない という感じ。 こちらは同じく設定をいじってある vim。 不満点
自分のためにメモ。 (肯定|否定)(先読み|戻り読み)、覚えづらい。 正規表現 パターン(boost::regex) 説明 肯定先読み (?=regex) regex に一致する文字列が始まる位置にある検索文字列と一致する。一致した文字列は記憶されず、後で使用することはできない。 たとえば "Windows (?=95|98|NT|2000)" は、"Windows 2000" の "Windows" には一致するが、"Windows 3.1" の "Windows" には一致しない。 先読み処理では、読み進まれた文字は処理済みとは見なされない。一致の検出後、次の検索処理は先読みされた文字列の後からではなく、一致文字列のすぐ後から開始される。 否定先読み (?!regex) regex に一致しない文字列が始まる位置にある検索文字列と一致する。一致した文字列は記憶されず、後で使用することは
次のページ
このページを最初にブックマークしてみませんか?
『satosystemsの日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く