SewiGの日記
2005-12-02 [金] [長年日記]
■ [Other] 公費って簡単に出るのね
教授が忙しかったので、技術職員の方と無線LANルータを買いに行きました。で、会計は公費なわけです。電話番号を聞かれたので学科の番号を言うとそれではダメだと言います。大学の代表番号でないといけないのですが、普段電話もしない番号がアドレス帳にあるわけも無く困っていたら、店員が勝手に調べてくれて、あとは署名をするだけでした。印鑑も身分証明書もいりませんでした。こんないい加減なシステムなら悪用されかねないような。よほど技術職員の方が貫禄があるように見えたのでしょうか。
■ [tDiary] 日記編集時のRSS送信時間
日記の誤字・脱字を修正したりするとRSSも修正されますが、記事の送信時間が編集したときの日時になって不便だったので、記事の日付とインデックス番号を利用するように変更しました。
makerss.rbの
cache[id] = RDFSection::new( id, Time::now, section )
という記述(2箇所とも)を
cache[id] = RDFSection::new( id, Time::local(date[0,4],date[4,2],date[6,2],0,0,index), section )
にしたら、後はRSSクライアントで日付順にソートすれば見やすいと思います。
2005-12-03 [土] [長年日記]
■ [Shopping] 今週の買い物情報
- コンプエース Vol.4
- アイドルマスター コミックアンソロジー
- 電撃G'sマガジン 1月号
- メガミマガジン 1月号
- COMIC LO No.22
今週は雑誌ばかり買いました。本当はまだ欲しいのがあったんだけど、来週のために残しておかなければならなかったのです。
年末は本当にゲームにグッズに、いろいろと発売されて大変です。
2005-12-06 [火] [長年日記]
■ [Lifestyle] バスカード「長崎スマートカード」がおサイフケータイ対応に
- バスカード「長崎スマートカード」がおサイフケータイ対応に (ケータイ Watch)
さすがバス先進国、長崎。帰省したときに遊んでみよう。携帯電話に専用アプリを導入すれば携帯電話がバスカード対応!
スマートカードと言えば、ICカードへの切り替えも早かったけど、今回も対応が早いとは素晴らしい。
2005-12-07 [水] [長年日記]
■ [Network] SPF導入の大きな動き
- EZwebで「送信ドメイン認証」〜なりすまし対策 (ITmedia)
KDDI全体でSPF/Sender IDの導入が進むそうです。追随して携帯電話各社も導入予定。
そろそろSPF導入するべきなのかと思いながら、とりあえずqmailにはSPFパッチが存在することが分かりました。で、http://www.dnsreport.com/ にて自分の利用しているDNSサーバを調べてみると
Mail | WARN | SPF record | Your domain does not have an SPF record.(以下略)
なんてこった。Dynamic DO!はSPFに対応していないでしょうか。
2005-12-09 [金] [長年日記]
■ [Network] EZwebのブラウザで意図しないWebサイトにReferrerが送信される不具合
ついに、KDDIが公式にリファラ漏れを認めました。私のサーバにもリファラ漏れのアクセスがあり、2005/06/13の日記でも指摘していました。やはり問題の端末は対象機種でした。
auを利用している方は確認してみては?
2005-12-10 [土] [長年日記]
■ [Shopping] 今週の買い物情報
- I've 武道館パンフレット
- ToHeart2 XRATED 初回限定版
- G's Festival Vol.3
- スティックポスターバインダー
- ミニミニガイドブック
I'veの武道館パンフ。歌姫のメッセージが載ってて、DVDにはインタビューも収録されています。
それにしても、ToHeart2関連が凄いです。スティックポスター、テレカ、タペストリーとセットが豪華です。
2005-12-13 [火] [長年日記]
■ [Music][Hardware] AKAIさん・・・
- アカイプロフェッショナルエムアイが破産手続き開始 (カナロコ ローカルニュース)
スラド経由。容量・機能を考えても最近はソフトウェアサンプラが強いですからねぇ。
2005-12-14 [水] [長年日記]
■ [Java][Programming] Default GatewayやDNS Server
java.netを使えば、例えば以下のようにIPアドレスが取得できます。
String address = (java.net.InetAddress.getLocalHost()).getHostAddress();
Default GatewayやDNS Serverは取得する方法がなさそうだったので、Windowsの場合は以下のようにして、外部コマンドの出力を使います。UNIXだったらifconfigを使えばいい。余計な文字はsubstringなんかで適宜消す、と。このままだと、環境依存で気持ち悪いので、Abstract Factoryなどで抽象化して利用できるようにするとなお良し。
Process p = new ProcessBuilder("ipconfig", "/all").start(); java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream())); String address; while ((address = br.readLine()) != null) { if (address.indexOf("DNS Servers") != -1) { System.out.println(address); } }
2005-12-16 [金] [長年日記]
■ [Java][Programming] JavaでSMF (1)
javax.sound.midiはMIDI関連の面倒くさいことをクラスライブラリでやってくれてうれしいのですが、抽象度はそれほど高くないので多少MIDIの知識が必要です。マルチメディア関連はいろいろと面倒なのでメモ。
SMF(Standard MIDI File)の構造は以下のようになっています。
ヘッダチャンクは「MThd」「データ長(固定)」「フォーマット」「トラック長」「タイムベース」から構成されています。トラックチャンクは「MTrk」「データ長」「データセクション」から構成されています。フォーマット1なら複数個のトラックがあります。データセクションは「デルタタイム」「MIDIイベント」から構成されています。数値はリトルエンディアンなのに注意してください。データセクション以外はクラスライブラリがいい感じに面倒を見てくれます。可変長数値とかバイト単位のファイルパース面倒だなぁと思ってる人最適。
データセクションですが、デルタタイムは演奏データの先頭からの相対的位置を表しています。なので番号が若い順に演奏されます。MIDIメッセージは以下のように分類されます。
チャネルメッセージはコンピュータで音楽やってる人にはおなじみのメッセージで、ノートオンやコントロールチェンジやプログラムチェンジなどがあります。システムメッセージはシステムエクスクルーシブなど機器の初期化や特殊な命令を実行します。チャネルメッセージもシステムメッセージも本当はもっと細かく分類できますが、あとは参考書*1を見てください。
トラックはデータを管理しやすいようにまとめているだけなのでさほど重要ではなく、チャネルごとに分けてやるといいでしょう。ここまで来れば、あとは好きなようにMIDIメッセージを作ってタイマーをグルグル回しながらメッセージを送信すればMIDIシーケンサの出来上がりです。
*1 「MIDI1.0規格書」でもいいのですが、MIDIリファレンス&サウンドプログラミング全般の良書として「Windowsサウンドプログラミング」をオススメします。
● KK [初めまして、midi周りについて色々調べていたらここにたどり着きました。 当方、ウェブ系プログラミング言語をちょっ..]
2005-12-17 [土] [長年日記]
2005-12-18 [日] [長年日記]
■ [Programming] Visual Studio 2005 Express Edition 日本語版 無償提供開始
ほとんど機能制限のないMicrosoftが無償で提供する開発環境です。theSpoke向けのProfessinal版無償提供はまだですか。
2005-12-19 [月] [長年日記]
■ [Java][Programming] JavaでSMF (2)
SMFの読み込みはjavax.sound.midi.Sequenceを使えば楽です。まず、以下のようなメソッドでSequenceを作ります。
public void open(File f) { try { sequence = MidiSystem.getSequence(f); if (sequence == null) { throw new MidiUnavailableException("Unavailable sequence."); } tracks = sequence.getTracks(); init(); } catch (IOException e) { e.printStackTrace(); } catch (InvalidMidiDataException e) { e.printStackTrace(); } catch (MidiUnavailableException e) { e.printStackTrace(); } }
それから、シーケンス内部のメッセージを取得していきます。以下は結構いい加減なので適宜データをキャッシュしてください。例では特にメッセージを解析せず内部に格納しています。解析したい場合は、もし独自に再生処理を行いたい場合にはtickとパラメータをまとめたクラスを作ってそれを格納していくといいでしょう。
public void init() { for (int j = 0; j < tracks.length; j++) { for (int i = 0; i < tracks[j].size(); i++) { MidiEvent event = tracks[j].get(i); long tick = event.getTick(); MidiMessage message = event.getMessage(); // ここでMidiMessageを独自に内部形式に data.addElement(message); } } }
MIDIメッセージを解析したい場合、例えばShortMessageは以下のようにします。
if (message instanceof ShortMessage) { ShortMessage s = (ShortMessage)message; if (s.getCommand() == ShortMessage.NOTE_ON) { // なんらかの処理 } // 以下略 }
2005-12-20 [火] [長年日記]
■ [Java][Programming] JavaでSMF (3)
MIDIイベントの作成は前回登場したMidiEventを自分でいくらでも作ればいいだけです。
で、再生ですがこれがけっこう面倒です。方法はいくつかあります。
1. 独自に実装する
動的なデータ変更に対応できて便利なのですが、Win32 + JavaVM環境ではSystem#currentTimeMillisの性能が恐ろしく悪いのであまりオススメできません。とはいえ、J2SE 5.0になってからSystem#nanoTimeが使えるようになってかなり精度が良くなりました。もし独自実装にするにしても、以下のようにループさせるのではなくタイマを使用したほうが、楽で見やすくて良いと思われます。音色ですが、デフォルトではJava Sound Synthesizerで演奏されます。これはSoundbankを変更することでより豪華な音色に変更できますし、指定したMIDIデバイスにも送信できます。
→ソースコード (MIDIPlayer.java, Note.java)
以下にソースコードの要所を示しておきます。
int TPQN = 480; int BPM = 120; int TPS = TPQN * (BPM / 60); long interval = 1000000000L / TPS; long offset = System.nanoTime(); long startTime = offset; long d; for (;;) { while ((d = System.nanoTime()) - offset < interval) { try { NANOSECONDS.sleep(1L); } catch (InterruptedException e) { } } offset = d; // ここに割り込みが入ったときの処理を書く。 // ちなみに、Tickとナノ秒の変換は以下のようにする。誤差は無視しています。 // long t = (long)((double)TPS / 1000000000L * (d - startTime)); }
さらに1の方法でシーケンスをQuickTimeで鳴らしたソースコードです。それにしても、JavaでQuickTimeを扱った日本語の資料が少なすぎです。Windowsなら「C:\Program Files\QuickTime\QTSystem\QTJava.zip」をCLASSPATHに追加してください。
→ソースコード (QTMIDIPlayer.java, Note.java)
2. javax.sound.midi.Sequencerを使用する
これはすごく楽ですし、パフォーマンスも悪くないです。再生させると制御が戻ってこなくなるので再生用にThreadを作るといいでしょう。よほど細かい制御を行わないかぎりjavax.sound.midi.Sequencerで事足りると思います。
→ソースコード (SequencePlayer.java)
3. JMFを使用する
ほとんど2の方法と同様に使用できます。JMFは様々なメディアに対応していてとても汎用的です。ダウンロードはhttp://java.sun.com/products/java-media/jmf/
→ソースコード (JMFPlayer.java)
2005-12-21 [水] [長年日記]
■ [PC][Hardware] HDD市場が
- Seagate、Maxtorを買収 (ITmedia)
これはまたすごい。HDD大手の2社がくっつくとは。なんかコスト効率が良くなって価格が安くなるなんて書いてるけど、そんなことないだろう。むしろ、独禁法ギリギリのマーケティングで消費者が混乱しそうです。まぁ、個人的にSeagateのHDDが大好きなので、Maxtorはどうでもいいのです。
2005-12-22 [木] [長年日記]
■ [Programming][Software] Visual Studio 2005 Professional Edition
そういえば昨日Visual Studio 2005 Professional Editionを手に入れました。Visual Studio .NET 2003 theSpoke Editionユーザだったので、無償で入手。ただ、SQL Server 2005 ProfessitionalやMSDNライブラリは付属せず。
■ [Other] 雪、積もってるよ
「雪、積もってるよ」
「そりゃ、2時間も降ってるからな・・・」
時刻は、04:00am。帰宅しようと外を見たら積雪。誰も足を踏み入れない時間で路面は綺麗に白だ。積雪量自体は大したことないけど、チャリで帰れないから帰るの面倒くさいなぁ。困った困った。
■ [Network] シャープ製au端末
- シャープ製のau端末が来年登場へ (ケータイ Watch)
シャープ信者の私としては少し興味深い記事。今のところコンセプトは決まっていないようだが、ハイエンド向けが出るんじゃないかと予想。
2005-12-26 [月] [長年日記]
■ [Java][Programming] JEditorPaneって便利だね
javax.swing.JEditorPaneってリッチテキストやHTMLも表示できるんだね。しかも編集して、書き出しもできるのは便利。下のソースコードはリッチテキストを表示します。で、コメントアウトを解除して、「ここから」〜「ここまで」をコメントアウトすればHTMLも表示できます。
// JEditorPaneTest.java import java.io.*; import javax.swing.*; public class JEditorPaneTest extends JFrame /* implements HyperlinkListener */ { JEditorPane pane; JScrollPane scroll; RTFEditorKit rtf; DefaultStyledDocument doc; public JEditorPaneTest() { setTitle("JEditorPaneTest"); try { pane = new JEditorPane(); scroll = new JScrollPane(pane); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); /* pane.setPage("http://sewig.jp/"); pane.addHyperlinkListener(this); pane.setEditable(false); */ // ここから rtf = new RTFEditorKit(); doc = new DefaultStyledDocument(); pane.setEditorKit(rtf); InputStream in = new FileInputStream("test.rtf"); rtf.read(in, doc, 0); pane.setDocument(doc); in.close(); // ここまで } catch (Exception e) { e.printStackTrace(); } add(scroll); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(0, 0, 640, 480); setVisible(true); } /* public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { try { pane.setPage(e.getURL()); } catch (IOException ex) { ex.printStackTrace(); } } } */ public static void main(String[] args) { new JEditorPaneTest(); } }
2005-12-28 [水] [長年日記]
● Cogxfckw [If the party's tax and so on. So on japan that basis?, ]
2005-12-31 [土] [長年日記]
■ [Other] 大晦日
なーんか、最近は大晦日って言っても気分は普段と変わらないような気がします。街の風景が変わったから? 自分の気持ちが変わったから? もう、大晦日とか正月とかは特別な行事ではなくなったのかもしれません。店は年中無休でオープンしてますしね。今は自分の気持ちを切り替えるための日だと思っています。今年こそはいい年にしよう、と。
…ということを毎年思っているわけだから、毎年成長してないのかなぁ、と自己嫌悪。幸せはいつ訪れるのでしょうか。
大晦日は無線LANと戯れていました。いつもの環境とは異なるネットワーク図を描いて環境構築。メルコのルータをブリッジにすると本体設定が面倒だぞ、と。
さて、今から仮眠に入って1日を楽しむことにします。皆様、良いお年を。
● Shagyto [If I were a Teenage Mutant Ninja Turtle, now I'd say "Kuwo..]