2011/02/28

魔法使いの弟子(その9-1) ~Pythonはじめました~

【ミッション: 是非 Python やりましょう (`・ω・´)】

東京大学の mono さんから、Python という言語を勧められた。しかもだいぶ前に

ぼくは当時、3D プログラミングに興味があったのだが、どうやら Python ならばそっち方面にも強いらしい。

というわけで、そろそろぼくも Python をやってみようかなと思った。どんだけ放置してたんだよ、と。

2011/02/26

敢て毀傷せざるは孝の始めなり

【ミッション: 自傷行為(詳細は後述)】

昨日・今日は国立大学の二次試験のため、ぼくは学校に立ち入る事ができない。

いわゆる『入試休み』を無為に過ごすのも勿体無いということで、首都圏企業の第一次選考を受ける事になった。しゃりんくんにも会える(前回記事参照)。

が、その前に、ひとり秋葉原で遊ぶ事にした。
 

2011/02/21

Be with You ~いまあい~

【ミッション: たっきぃさんと親睦を深めよう】

ビックカメラで張っていればたーせるさんに会えるらしい。
……というわけで、たっきぃさんに会う事になったよ。割と突然の展開でぼく自身びっくりだ。

2011/02/20

魔法使いの弟子(その8-4) ~PHP×jQuery~

【ミッション: 動きをつけて写真を魅せたい Ver.2】

今日は、ぼくがちょっと前に書いた記事の中で(名前だけ)触れられている Smooth Div Scroll を使って楽しい事をしよう。

ありもののサンプルをそのまま使うのも面白くないので、覚えたての PHP を組み合わせて TwitPic の新着画像を動的に表示する仕組みを作ってみる。

ほんものはマウスを動かすと左右にスクロールするよ。

ここで、非実在ご愛用者の声をご紹介しよう。大好評である(嘘)。
【ご愛用者の声】
ライソさん(20歳) - 茨城県つくば市

私は、ハンドボールサークルの Web サイトを運営しています。今まで、サイトの更新が面倒でどうしようもありませんでしたが、このシステムを使えば TwitPic に画像を投稿するだけで自動的に Web サイトの方にも新しい写真のサムネイルが載るので、大変重宝しています。たーせるさん本当にありがとうございました。
※あくまで利用者の感想であり、製品の効能を保証するものではありません。
実際、サークル専用の Twitter アカウントを作ればそういう使い方も可能だし、更新しやすい仕組みを整備しておけば、後任の管理者に業務を引き継ぐ事も容易になる。

2011/02/19

魔法使いの弟子(その8-3) ~PHPに挑む~

【ミッション: PHP でアクセスカウンタを作れ】

前々回のあらすじ: XAMPP 入り USB メモリを作ってみた。
前回のあらすじ: MySQL をてきとうに動かしてみた。

いよいよ PHP に手を出すときがきた。

とはいってもぼくは初心者だし、簡単なところから始めようと思う。

文字列を出力する手段である echo の存在を知ったぼくは、まず以下の HTML ファイルを作ってみた。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>たーせるのホームページ</title>
    </head>

    <body>
        <p><?php echo 'おまえは、もう、氏んでいる'; ?></p>
    </body>
</html>
うまく行けば、北斗の拳(アニメ版)の有名なセリフが表示されるはずだが……。

ファイル名は baka.html である。 baka って…。

あるぇー。何も表示されてない。どうしようどうしよう。

2011/02/18

魔法使いの弟子(その8-2)

【ミッション: MySQLをためす】

前回のあらすじ: XAMPP 入り USB メモリをてきとうに作ってみた。

そしてさっそくそれを持って学校に行った。

当然ながら、USB メモリは使用する環境によって、G ドライブだったり M ドライブだったりする。つまり、XAMPP が導入されているフォルダのパスがコロコロ変わっちゃうのだ。

このままでは XAMPP を起動できないので、ひとまず XAMPP を導入したフォルダの中にある setup_xampp.bat というバッチファイルを一回実行する。これでパスが再設定される。

とりあえず Apache と MySQL だけ起動しておこう。学校のパソコンでもちゃんとできたよ。やったね、ネス。
さてさて、せっかく MySql サーバが起動しているのだから、ためしに少しいじっちゃえ。

魔法使いの弟子(その8-1)

【ミッション: PHP がんばりませう!】

Twitter で、らいんくんから PHP のお勉強のお誘いを受けた。
なになに、PHP は『PHP: Hypertext Preprocessor』の略語らしい。

GNU (GNU's Not UNIX) といい XNA (XNA's Not Acronymed) といい、なにゆえコンピュータの世界の人々って再帰的頭字語を好むのだろう。

ぼくにとって PHP は初体験に近い言語である。なんか HTML のときと違って、Web ブラウザだけでは動作確認できず、テスト用 Web サーバを構築して、そこに PHP のインタプリタを導入しなければならないらしい。

サーバ構築にビビっているぼくにとって、まず初めの一歩である環境構築からして一筋縄では行かない。どうせ PHP で Web アプリ的なものを作るのは遥か先の話だし、まずは学習用のお手軽コースで行こう。

2011/02/16

魔法使いの弟子(その7-1)

【ミッション: Windows プログラミングに挑戦せよ】

中学の頃、ぼくは生まれて初めて C 言語の入門書を買った。

しかしそこに書いてあったのは、退屈なコマンドラインアプリケーションばかり。 GUI アプリケーションの構築を夢見ていたぼくにとって、それはあまりにもショッキングな現実であった。

そんなぼくも、やがて C 言語をひととおり学び(全然身についていないが)、ついに GUI アプリに手を付ける日が来た。

2011/02/14

天氣晴朗ナレドモ浪高シ

【ミッション: しゃりんくんと再会せよ】

突然だが、首都圏で開催された企業説明会に参加してきた。本来はこっちがメインミッションなのだが、諸般の事情によりこれを書くわけにはいかない。

その代わり、今回は追加ミッションとして、iPhone アプリ開発者のしゃりんくんと再会を果たしたのでそっちを報告しよう。
しゃりんくんの名刺の裏

2011/02/11

就活戰爭開戰セリ

実は今日、Win32 API と OpenCV の連繋(特に HBITMAPIplImage 構造体(or cv::Mat クラス)の相互変換)に言及する予定だった。

で、実際にサンプルまでは一応作ったのだが、説明するのが非常に面倒だったので全てぶん投げてしまった

こんな日もあるさ。たーせるだもの。

というわけで…。



【緊急ミッション: 就活戦線に突入せよ】

マスメディア曰く、今は「史上最悪の就職氷河期」らしい[要出典]。そんな中、ぼくも就活戦線に飛び込む事になったよ!
ぼくの戦闘服(パークサイドホテルにて)
本日より6日連続で企業説明会のスケジュールが入っている。

正直、不安ではないと言えば嘘になるが、この状況でもスリルを愉しむ余裕がぼくの中にまだ残っている。絶望はしていない。

2011/02/10

魔法使いの弟子(その6-1)

※ 今日は C++ と Windows プログラミングのお話だよ。

ぼくが C++ 言語で GUI プログラムを作るときには、なるべくユーザインタフェースと中核処理のコードを分離したいなと思っている。その理由は、ライブラリへの依存度をなるべく下げて他の環境への移植性を高める為と、処理そのものの安定性を保証する為である。

たとえば Windows API を積極的に用いて作成したプログラムは、当然ながら Windows 環境で動作させる事が前提となり、移植性は考慮の対象外になりがちだ。また、サードパーティ製ライブラリがプログラム全域に亘ってかっちり食い込んでいると、ライブラリの仕様変更に伴って厖大な修正作業が必要になる事がある(生産性も低下する)。もしかしたら、ライブラリに潜在するバグが処理に何らかの影響を及ぼす事だってあるかも知れない。

だが、本質的な処理をライブラリ非依存で書く事ができれば、当然ながら“本質を損なわずに” C++ の処理系を有する他環境へ移植する事が容易になるだろう。何らかの不具合が生じたときにも、その責任の所在も突き止めやすくなる。

では、これを実現するにはどうすればよいだろうか。

実はそれほど面倒な事ではない。ライブラリが独自に拡張したデータ型と、言語仕様で定義されている型を相互に変換する処理を実装すれば、(ライブラリ非依存の)中核処理の結果を Windows API から利用したり、あるいはその逆を行ったりする事ができるようになる。

Windows API の内部では、typedef を駆使しておびただしい量の型が定義されており、必要に応じてこれらを C++ で用意されている標準的な型に変換する必要がある。今回はその一例として、 Windows で定数文字列を表すためによく用いられる LPCTSTR 型から、 std::string 型への橋渡しを考えてみよう。

場合によっては、 Adapter パターンを適用した本格的なクラス設計が必要になる事もあるが、今回は変換用の関数を作るだけで充分だ。

2011/02/09

魔法使いの弟子(その5-1)

【ミッション: 動きをつけて写真を魅せたい】

つくば大学のらいんくんは、どうやら Smooth Div Scroll のサンプルがいたく気に入ったらしく、JavaScript (というかjQuery)に興味を持ったようだ。そうだよね、らいんくんもそろそろそういうお年頃だよね。

ただ、jQuery の知識は必ずしも必要ではなく、 Java + α の知識だけでも割と簡単にこんなものが作れる。


2011/02/08

魔法使いの弟子(その4-1)

【ミッション: LaTeX の数式を簡単に画像化したい】

前回のあらすじ: PDF のスナップショットツールを用いて切り抜いた領域から超てきとうに透過画像を生成するプログラムを作った。

ところが、調べていくうちに、

> platex tmp.tex
> dvipng -T tight -bg Transparent tmp.dvi

というコマンドを打てば、dvi ファイルから自動的に透過 PNG 画像が生成されるという衝撃の事実が判明した。

2011/02/07

魔法使いの弟子(その3-1)

【ミッション: ファイルのドラッグ & ドロップをサポートしたい!】

今さらながら、O'reilly の “JAVA SWING HACKS” に載っていた HACK #59 『ファイルをドラッグ & ドロップする』 を試してみた。

これは、アプリ画面上部のアイコンをドラッグ & ドロップすると、テキストエリアに入力した内容でファイルが作られるのだ。

アイコンをドラッグ & ドロップすると、その先に「myfile.txt」が作られる。
ファイルの中身はアプリのテキストエリアと同じ。

本に載っている断片的なソースコードを継ぎ合わせると、だいたい以下のようになる。

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceAdapter;
import java.awt.dnd.DragSourceContext;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.filechooser.FileSystemView;

// ドラッグ&ドロップのテスト
public class FileDropper {
    public static void main(String[] args) throws IOException {
        JFrame frame = new JFrame("Drag and Drop File Hack");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        FileSystemView fsv = FileSystemView.getFileSystemView();
        Icon icon = fsv.getSystemIcon(File.createTempFile("myfile.",".txt"));

        frame.getContentPane().setLayout(new BorderLayout());
        JTextArea text = new JTextArea();

        JLabel label = new JLabel("myfile.txt",icon,SwingConstants.CENTER);
        DragSource ds = DragSource.getDefaultDragSource();
        DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(
                label,
                DnDConstants.ACTION_MOVE,
                new FileDragGestureListener(text));

        frame.getContentPane().add("North",label);
        frame.getContentPane().add("Center",text);

        frame.pack();
        frame.setSize(400,300);
        frame.setVisible(true);
    }
}

class FileDragGestureListener extends DragSourceAdapter implements DragGestureListener {
    JTextArea text;
    Cursor cursor;
    
    public FileDragGestureListener(JTextArea text) {
        this.text = text;
    }

    public void dragGestureRecognized(DragGestureEvent evt) {
        try {
            // 一時ファイルを生成
            File temp_dir = File.createTempFile("tempdir",".dir",null);
            File temp = new File(temp_dir.getParent(),"myfile.txt");
            FileOutputStream out = new FileOutputStream(temp);
            out.write(text.getText().getBytes());
            out.close();

            // 適切なアイコンを取得
            FileSystemView fsv = FileSystemView.getFileSystemView();
            Icon icn = fsv.getSystemIcon(temp);

            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension dim = tk.getBestCursorSize(icn.getIconWidth(),icn.getIconHeight());
            BufferedImage buff = new BufferedImage(dim.width,dim.height,BufferedImage.TYPE_INT_ARGB);
            icn.paintIcon(text,buff.getGraphics(),0,0);

            // ドラッグイメージをセットアップ
            if(DragSource.isDragImageSupported()) {
                evt.startDrag(DragSource.DefaultCopyDrop, buff, new Point(0,0),
                        new TextFileTransferable(temp),
                        this);
            } else {
                cursor = tk.createCustomCursor(buff,new Point(0,0),"billybob");
                evt.startDrag(cursor, null, new Point(0,0),
                        new TextFileTransferable(temp),
                        this);
            }

        } catch (IOException ex) {
            /* なんかバグってるよ */
        }
    }

    public void dragEnter(DragSourceDragEvent evt) {
        DragSourceContext ctx = evt.getDragSourceContext();
        ctx.setCursor(cursor);
    }

    public void dragExit(DragSourceEvent evt) {
        DragSourceContext ctx = evt.getDragSourceContext();
        ctx.setCursor(DragSource.DefaultCopyNoDrop);
    }
}

// 一時ファイルを保持するTransferable
class TextFileTransferable implements Transferable {
    File temp;

    public TextFileTransferable(File temp) throws IOException {
        this.temp = temp;
    }

    public Object getTransferData(DataFlavor flavor) {
        List<File> list = new ArrayList<File>();
        list.add(temp);
        return list;
    }

    public DataFlavor[] getTransferDataFlavors() {
        DataFlavor[] df = new DataFlavor[1];
        df[0] = DataFlavor.javaFileListFlavor;
        return df;
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
        if(flavor == DataFlavor.javaFileListFlavor) {
            return true;
        }
        return false;
    }
}

このサンプルは、 Java アプリケーションから外部へファイルをドラッグ & ドロップするというものだが、逆に外部からファイルを Java アプリケーションへドロップできたら何かと便利そうである。

2011/02/06

魔法使いの弟子(その2-1)

とりあえずブログを作ってみた。まだ方向性は決まっていない。

ぼくはいつも前後関係が逆で、物事をやり始めた後で目的を見出す人なので仕方ない。パソコンや iPhone も、買った後で何に使うかを決めたくらいだし。

たぶんこのブログは身辺雑記とかお散歩カメラの写真とかをぺたぺた貼りまくる事になる気がする。

とはいえ、ただ写真を貼るだけではあまりおもしろくないので、遊び心を込めて、セロテープでぺたっと留めてみる事にした。
うん、おもしろい(どこが)。でも毎回加工するのは手間がかかる。そうだ、SD カード内の写真を一括してセロテープぺったん画像に変換するようなプログラムを作ろう。

2011/02/05

魔法使いの弟子(その1-2)

【ミッション: LaTeX の数式を簡単に画像化したい】

前回のあらすじ: とりあえず PDF ファイルのスナップショットツールで得たスクリーンショットを、クリップボードから取得することに成功した(まぁネット上に転がっていたソースコードをパクって劣化させただけなのだが)。

そういえばこんなゴミみたいなものを作ったんだった。

魔法使いの弟子(その1-1)

学校の授業で LaTeX を習ってからというもの、ぼくが作るほとんどの文書が LaTeX で組版される事となった。

出来上がったドキュメントの一例

LaTeX の魅力の1つとして、数式の審美性が極めて高い事が挙げられる。

ぼくは、LaTeX の美しさに魅せられるうちに、(たとえユーザのカスタム性が低い)ブログ上であっても LaTeX の高品質な数式を利用したいなと考えるようになっていった。