2009年12月31日木曜日

SyntaxHighlighter導入してみました

「SyntaxHighlighter」とは、Google Codeが提供しているコードハイライターです。
ソースコードに対して、以下のような表示ができます。
public class Test {
    /**
     * mainメソッド.
     * @param args コマンドラインで入力した値
     */
    public static void main(String[] args) {
        System.out.println("よいお年を");
    }
}
Bloggerにこのハイライターを導入する仕方はFaziBear's Blogger Widgetsで、「Add to Blogger」をクリックするだけでおk。他のブログだと、Google Codeからダウンロードして、Javascriptのファイルをブログの適切なフォルダにアップロードするとかしないとか・・・よく分かりませんw 各自で調べてみてください(ぇ

導入後はhtmlで以下のように書けばおk
< pre name="code" class="java" >
public class Test {
    /**
     * mainメソッド.
     * @param args コマンドラインで入力した値
     */
    public static void main(String[] args) {
        System.out.println("よいお年を");
    }
}
< /pre >
preタグでclass="言語"とすればいいらしい。指定出来る言語はC,C++,Java,Python,Ruby,Htmlなどなど
では、よいお年を~(・∀・)ノシ

参考URL:「コードをハイライトする「Blogger Syntax Highlighter」ウィジェット」

Apache Wicket 3

Apache Wicket第1回目第2回目とやってきましたが、codeZineで第3回目のが掲載されていたので(もうだいぶ前ですけど)またやってみました。今度はユーザ認証ですね


ユーザ認証のあるWebアプリを作る場合は

  • ライブラリ: wicket-auth-roles.jarを追加
  • アプリケーションクラス: AuthenticatedWebApplicationクラスを継承して作成
  • セッションクラス: AuthenticatedWebSessionクラスを継承して作成
  • ログインページ用クラス: SignInPageクラスを継承して作成(オリジナルのログインページを作りたい場合はWebPageクラス継承)
  • ログアウトページ用クラス: SignOutPageクラスを継承して作成(オリジナルのログアウトページを作りたい場合はWebPageクラス継承)

が基本。アプリケーションクラスではgetSignInPageClassメソッドをオーバーライドするが、この中にはログインページ用のクラスを返すようにする。そうすることで、ブラウザでアクセスした時にログインページが表示されるようになる。また、認証失敗時にはアプリケーションクラスのonUnauthorizedPageメソッドが呼ばれるのでRestartResponseAtInterceptPageExceptionをthrowしてエラーページにリダイレクトするようにすればよい

Wicketの本があるそうな

2009年12月30日水曜日

[エッセイ]ナーシャ・ジベリ

FFI~III等に携わっていたゲームプログラマーです。




飛空艇でプレイヤーが移動する際のマップ移動処理プログラムを彼が書いたそうなんですが、それがあまりにも複雑怪奇で、しかもほぼバグに近い処理をあえて利用していると言うこともあって、FFIIIの移植が難航したのはそれが原因なんだとか




今更感がありますが、初耳だったので驚きでした。バグを利用するなんて仕事では考えられないなぁw

「ナーシャ・ジベリ」http://ja.wikipedia.org/wiki/ナーシャ・ジベリ#cite_ref-1

2009年11月15日日曜日

[Flex] コンポーネントのスタイルをActionScriptで変更するには?

単純に出来る作業ですが、今までやり方を知らなかったため、メモを残しておきます。


Adobe Flexでアプリケーションを作る場合、アプリケーションに設置するコンポーネント(ラベルやボタン、テキストインプットなど)の文字の大きさや色などのスタイルは以下のように指定できます。


< mx:label id="label" fontsize="18" color="#FF0000"/>


しかし、例えばActionScriptで書かれたイベントハンドラの中で、上のコンポーネントのフォントサイズを変更したい時は以下のように書きます。


label.setStyle("fontSize", 36);


idが「label」のオブジェクトに対して、setStyle関数を呼び出しています。第1引数が変更したいスタイルの名前、第2引数が変更後の値になります。


他のやり方としては[Bindable]メタデータタグをつけた変数を用意するという方法もありますが、これは後日

2009年11月14日土曜日

[Flex] ペイントの描画履歴を残す

Adobe Flexで線を描くだけの簡単なペイントツールを作成していたのですが、一度描いて消した絵をふたたび画面に表示させるため、どうしても描画履歴を残す必要があったのでその時のTipsを残します。(と言っても重要な部分のみですが)


基本的には、マウスで絵を描くペイントツールですから、マウスの移動中に発生するイベント(MouseEvent.MouseMove)をハンドリングする関数の中で処理を行うという形になります。


まずは、フィールドとしてはGraphicsオブジェクトと履歴を格納する配列を用意しておきます。
import __AS3__.vec.Vector;
_graphics:Graphics;
_graphicsData:Vector.< IGraphicsdata>


IGraphicsDataインターフェースは描画情報を管理するためのインターフェースです。
次に、イベントハンドリングする関数の中身ですが、まずは色や太さなどの設定を行います。


private function drawing(event:MouseEvent):void
{
// 色の設定
var solidFill:GraphicsSolidFill = new GraphicsSolidFill(LINE_COLOR);
// 線のスタイルの設定(引数は線の太さ)
var stroke:GraphicsStroke = new GraphicsStroke(PEN_SIZE);
// 先端の形(無し、四角、丸み)の設定
stroke.caps = CapsStyle.ROUND;
stroke.fill = solidFill;

次にGraphicsPathオブジェクトに対して、現在のマウスの座標と前回この関数が呼ばれたときのマウス座標を元に線描画の情報を入れます。GraphicsPathクラスは線を描いたところの描画命令とそれらの座標のコレクションになります。そして、先ほど設定した色や太さの情報と一緒に配列にプッシュします。

// 描画履歴を格納
var path:GraphicsPath = new GraphicsPath();
path.moveTo(_prevX, _prevY);
path.lineTo(event.localX, event.localY);
_graphicsData.push(stroke, path);


もちろん、描画も忘れてはなりません。

// 描画
_graphics.lineStyle(PEN_SIZE, LINE_COLOR);
_graphics.moveTo(_prevX, _prevY);
_graphics.lineTo(event.localX, event.localY);


最後にマウス座標をこの関数が再び呼ばれるときに備えて、その座標を別の変数に入れておきます。

_prevX = event.localX; 
_prevY = event.localY;
}


描いた絵を再び表示するためには、以下のように行います。


_graphics.drawGraphicsData(_graphicsData);


以上です。


参考サイト:
     「図形の描画履歴を保存する」 ・・・ http://hkpr.info/flash/game/sample/s088.php

2009年11月7日土曜日

Apache Wicket 2

前回に引き続いてApache Wicketです。codeZineで第2回目が掲載されていたのでちょっといじってみました。

前回はセッションどうするんだろうと疑問に思ってましたが、その点に関しての解説がありました。簡単にまとめると、

・WebPageクラスのオブジェクトはユーザがアクセスするたびに生成される。
・データはフィールドとして用意することで、ユーザはそれに対して取得・設定が出来る。
・ユーザ共通のデータに対してはstaticフィールドを用意する。

だそうです。ということは、ユーザがログインしてからログアウトするまでが1セッションになるので、途中でセッションタイムアウトになることは無いってことですかね・・・

あとは、アプリの作りこみ具合とユーザ数で場合によってはヒープを食いつぶす可能性があるのでそこには注意しないとね


※このブログを書いている時点で第3回目の記事が掲載されています

2009年10月24日土曜日

Apache Wicket

Apache WicketはJavaのWebアプリケーションフレームワークの一つです。JavaのWepAppフレームワークといったらStrutsなんかが有名ですが、従来のWebアプリケーション開発と違うところは

1. JSPを書かない
2. GET、POSTを気にしなくてよい
3. awt、swingのように開発できる

という所ですね。JSPを書かなくてよいということは、MVCモデルのViewはWebデザイナーが、ModelとControllはプログラマがという形で分離できるというところですかね。登場したのが2005年6月らしい。たまたまCodezineのJavaで軽快に使える「軽量フレームワーク」特集~Apache Wicketで簡単Webアプリ作成(1)で紹介されていたので遊んでみましたが、なかなか使いやすいですね!

「GET、POSTを知らなくても実装できる」となっていますが、通信量とその処理パフォーマンスの関係は知っておきたいかな・・・あとはこいつのセッション管理はどーすんだろう(;・∀・)

いろいろ調べてると、Eclipseプラグインとして「Wicket Bench」というのがあるらしいので、今度はそれを使っていじってみますかねぇ

※このサイトが不親切なのか、俺が無知なのかよく分からないけど、コードを書いた後に実際に動かすためには、プロジェクト名を右クリックして、「実行」→「サーバで実行」を選択し、「サーバーの選択方法」では「手動で新規サーバーを定義」にし、「サーバーのタイプを選択」では、「基本」→「J2EE プレビュー」で動きますよ

2009年10月17日土曜日

MCP(マイクロソフト認定プログラム)まとめ

科目が多い上に、資格習得のためには下位ランクの必須科目も取らないといけなかったり、なんだかややこしいのでまとめてみた。

①MCPとは
マイクロソフト認定プログラムの略。マイクロソフト関連技術の資格の総称

②資格概要
表:資格マップ
MCITP(マイクロソフト認定ITプロフェッショナル)MCPD(マイクロソフト認定プロフェッショナルデベロッパー)
MCTS(マイクロソフト認定テクノロジースペシャリスト)

・MCTSが土台というか基本の位置づけで、上位としてMCITP、MCPDがある。
・1つの資格に対して、試験を1つ2つ受けて合格する必要がある。
・MCITPとMCPDで資格を取得したいときはMCTSで該当する資格を取得しておく必要がある。

③MCTSの科目(興味あるやつだけ)
資格必須試験の番号必須試験の名前
.NET Framework 3.5 Windows フォーム アプリケーション70-536.NET Framework 2.0 - Application Development Foundation
70-505.NET Framework 3.5 - Windows Forms Applicatioin Development
.NET Framework 3.5 Windows ADO.NET アプリケーション70-536.NET Framework 2.0 - Application Development Foundation
70-561.NET Framework 3.5 - ADO.NET Application Development
.NET Framework 3.5 ASP.NET アプリケーション70-536.NET Framework 2.0 - Application Development Foundation
70-562.NET Framework 3.5 - ASP.NET Application Development
.NET Framework 2.0 Windows アプリケーション70-536.NET Framework 2.0 - Application Development Foundation
70-526.NET Framework 2.0 - Windows-Based Client Development
.NET Framework 2.0 Web アプリケーション70-536.NET Framework 2.0 - Application Development Foundation
70-528.NET Framework 2.0 - Web-based Client Development
.NET Framework 2.0 分散アプリケーション70-536.NET Framework 2.0 - Application Development Foundation
70-529.NET Framework 2.0 - Distributed Application Development

70-536は必須なわけね

※その他は
こちら

2009年10月12日月曜日

[JavaScript] JavaScriptで気をつけるべきこと

・ブロックレベルのスコープが存在しない

if (何かしらの条件) {
var i = 5;
}
document.writeln(i);
C++やjavaなら、if文の中で宣言されている変数はその中でしか使用できないが、JavaScriptはブロックレベルのスコープが無いので、上の例のようにif分の外でも参照できるんだそうです


・関数のスコープ処理の違いについて
JavaScriptでは関数の定義の仕方が3種類(通常のfunction文、Functionコンストラクタ、匿名関数)あるんですが、どうもスコープの処理が違うらしい

var scope = '外のスコープ';

function checkScope() {
var scope = '内のスコープ';

function normalFunc() { return scope; } // (1)
var anonymousFunc = function() { return scope; }; // (2)
var constructFunc = new Function('return scope'); // (3)

document.writeln(normalFunc()); // (1)を実行して表示
document.writeln(anonymousFunc()); // (2)を実行して表示
document.writeln(constructFunc()); // (3)を実行して表示
}

checkScope();

まず外側に「外のスコープ」を表す変数scopeがあり、更にcheckScope関数の中に「内のスコープ」を表す変数scopeがあります。更に中では通常の関数(1)と、匿名関数(2)、Functionコンストラクタ(3)をそれぞれ定義してます。ただ単にscopeの中身を返すだけです。その後にそれぞれ画面に表示させて見ます。すると、(1)と(2)は「内のスコープ」が表示されましたが、(3)だけ「外のスコープ」と表示されました。

理由はFunctionコンストラクタでは「グローバルオブジェクトからなるスコープチェーンを引き渡す」という仕様で、ようは一番外側のグローバルオブジェクト関連の情報が渡されて、その中にあるscopeを表示するという流れだということです

このコードを書いてて気づいたんですが、関数の中に関数を定義できるんですね。JavaScriptは関数もデータ型として扱ってるからかなぁ

2009年10月4日日曜日

Google Chromeでローカルのファイルをオープンする方法

Google Chromeの上で、「ctrlキー」+「Oキー」を同時に押せば、「ファイルを開く」ダイアログが出てくるので、あとはオープンしたいファイルを選択すればおk

[JavaScript] getYear()とgetFullYear()

JavaScriptの本を参考に勉強してるところですが、時間処理でいきなり「getFullYear()」という関数が出てきまして、「ただ単に年を取得したいのならgetYear()だよなぁ」と思って調べてみると、getFullYearもgetYearも存在するんですね。


var dat = new Date(2009, 9, 4, 16, 33, 00, 000);
document.writeln(dat.getYear());
document.writeln(dat.getFullYear());


どんな結果が返ってくるのだろうと思い、上のようなコードを書きました(インスタンスは2009年10月4日16時33分00秒の000msecです)。getFullYear()の方は、データインスタンスに入ってる年(上の例で言うなら2009)が返されるのですが、getYear()の方はブラウザによって出力結果がまちまちです。

ブラウザ出力結果
InternetExplorer 82009
FireFox 3.0109
FireFox 3.5109
Google Chrome 3.0109

getYear()の定義としては、「1900年からの差分を取得する」だそうですが、IEだけ「データインスタンスに入ってる年を取得する」として定義してるんですね

2009年10月3日土曜日

test2

タイトルをtwitterへ通知するためのテスト

このブログの更新をtwitterに通知してみる

せっかくだから?このブログを更新した際にtwitterに通知して、フォローしている人達に見てもらおう

1. http://twitterfeed.com/へアクセス


2. 「Sign In with OpenID」をクリックして、自分が普段使ってるID(OpenID)を選択

 基本的にはGoogleのアカウントやYahoo!のアカウントが使えるので、普段そのサイトを利用している人は新規発行しなくても使えるはず
 Bloggerのアカウント(ていうか、Googleのアカウントだけど)も使えるので、 僕はこれにしてみました。


3. 前述の2.で選んだアカウントの入力画面が現れるので、ユーザ名とパスワードを入力

 Bloggerを選んだ人はブログのトップのURLを入れる。
 僕のブログのURLはhttp://kawara-tan.blogspot.com/なので、それを入力しました。


4. 「Step 1: Create new feed to」で、「twitter」を選択


5. その右にある「Connect your feed to your Twitter Account」でTwitterアカウントを自動的に取得


6. 「Step 2: Give your feed a name and add the URL」で「Feed Name」と「RSS Feed URL」を入力

 「Feed Name」はただ単にこのフィードの名前をテキトーに決めて入力すればおkで、「RSS Feed URL」はBloggerの場合は以下のようになる。

 http://kawara-tan.blogspot.com/feeds/posts/default?alt=rss

 ようは、ブログトップのURLに「feeds/posts/default?alt=rss」を追記した形ですね。その後に右側の「test rss feed」を押せばURLが正しいかどうかをチェックしてくれる。


7. 細かい設定をしたければ「Advanced Settings」を押して、適当に設定


8. 「Create Feed」ボタンをクリックして完成


これでtwitterfeedが設定した時間になったら(デフォルトでは1時間おき)ブログを見に行き、タイトルと内容?をtwitterでつぶやいてくれます(・∀・)

参考URL
twitterに自分のブログの更新情報を流す方法・・・ http://mitaimon.cocolog-nifty.com/blog/2007/05/twitter_17d4.html

用語解説

JSEclipseを導入する

あまりJavaScriptに詳しくないので勉強しとこうと思いまして、まずは環境構築から始めました。
とりあえず、Adobeが出してるJSEclipseを入れてみました。

IDE : Eclipse 3.5 Galileo
プラグイン : Adobe JSEclipse 1.5.5


1. Eclipseを起動して、「ヘルプ」→「新規ソフトウェアのインストール」をクリックしていき、
 「作業対象」のテキストボックスに以下のURLを入れる。

 http://download.macromedia.com/pub/labs/jseclipse/autoinstall

2. リストに現れた「AJAX」にチェックし、「次へ」ボタンを押す。
 ※ネットで調べると、どうもこのリストに出てくる名前が違ったりする…

3. その後は「次へ」を押したり、ライセンスに同意したり、「終了」ボタンを押せばインストールが始まる。

意外と簡単でした(・∀・)

この後はいよいよEclipseでコーディング

2009年5月9日土曜日

JavaでMySQLをいじってみる

DBにアクセスして,データを表示したり更新したりするプログラムを今までに書いたことがないので,簡単にやり方をまとめてみた.言語はJavaです.そろそろ他の言語も知っておきたいよねぇ・・・


1. コネクタを手に入れる.
  JavaとMySQLをつなぐには,それを担うコネクタが必要.そのコネクタを実現してるのが「Connector/J」である.これはMySQL公式サイトのダウンロードページにある.MySQLのヴァージョンが5.1だったので,それに対応したmysql-connector-java-5.1.7.zipをダウンロードする.
余談だが,OracleがSunに買収された今,MySQLの運命はどうなっていくんだろうか…

2. インストール
  インストールといっても大したことはしない.mysql-connector-java-5.1.7.zipを解凍してできたフォルダの中にあるmysql-connector-java-5.1.7-bin.jarをJavaのJREのフォルダのlib\extに入れるだけ.俺の環境でのJREのヴァージョンが1.6.0_13なので,C:\Program Files\Java\jre6\lib\extに入れればおk.

3. PATHの設定
  環境変数であるCLASSPATHに,C:\Program Files\Java\jre6\lib\ext\mysql-connector-java-5.1.7-bin.jarを追加.

4. Javaでプログラミング
  APIはJavaSEのjava.sql.*パッケージを使う.「hellodb」データベースにある「EMPLOYEES」という表から,指定されたIDに該当する従業員を表示させるプログラムとして実装してます.

import java.sql.*;

public class DBTest{
public static void main(String args[]){
String drv = "com.mysql.jdbc.Driver";
   //connectorを指定
String url = "jdbc:mysql://localhost:3306/hellodb";
   //接続するDBの場所

   if(args.length!=1){
System.out.println("usage: java DBTest < id> ");
System.exit(1);
}

try{
Class.forName(drv); //ドライバをセット
Connection con =
DriverManager.getConnection(url, "****", "****");
//DBと接続.
//第2引数はMySQLのユーザ名,第3引数はそのパスワード

String sql = "SELECT * FROM EMPLOYEES WHERE ID = ?";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, args[0]);
//conに対してSQL文をセットした後,そのインスタンスに対して,
//setStringメソッドで,標準入力で得られたIDを?の位置にセット.

ResultSet res = stmt.executeQuery();
//SQL文実行.結果をresに格納

if(res.next()){ //「結果が入っているのなら」
System.out.println("ID:"+res.getString(1));
System.out.println("NAME:"+res.getString(2));
System.out.println("SECTION:"+res.getString(3));
System.out.println("PHONE:"+res.getString(4));
//各レコードを取得.引数の数字は表の列を指定している.
//1なら「左から数えて1番目の列」を意味する.
}else{
System.out.println("該当者がいません.");
}
res.close();
stmt.close();
con.close();
}catch(Exception e){
System.out.println("何かしらのエラーm9(^Д^)プギャー");
e.printStackTrace();
}
}
}

結果はこんな感じ.

それでは!

2009年5月3日日曜日

MySQLをいじってみる

仕事ではOracleのDBを使うんでしょうけど,家でちょっとDBやりたいってのには向かないので,MySQLを入れてみた.
以下,MySQLを使えるようになるまでのログ.

ちなみに,OSはWindowsXPです…

1. MySQL公式サイトで「ダウンロード」する.
今回は「MySQL Community Server」のヴァージョン5.1にしますた.

2. mysql-essential-5.1.34-win32.msiをダブルクリック.
いくつか聞かれるが,「Setup types」のところでは「custom」にして,次のウィンドウでインストール先を「C:\mysql」とする.
デフォルトは「C:\program files\mysql」で,別にこれでもいいと思うんだが…

3. 初期設定の項目では「Detailed Configuration」を選択し,各項目では以下を選択.
・Developer Machine
・Multifunctional Database
・Decision Support(DSS)/OLAP
・Manual Selected Default Character Set /Collation
・characterset → SJIS
・Install As Windows Service → チェックを入れる
・Service Name → MySQL(デフォルト)
・Launch the MySQL Server automatically → チェックを外す
・Include Bin Directory in Windows PATH → チェックを入れる

あくまで個人的に利用するだけなんで…

4. PC再起動したら,MySQLサービス起動.プロンプト上で
% net start mysql

なんかエラーが出たら,C:\mysql\my.iniを編集するか,それができなかった再インストール(´・ω・`)

5. SQLを動かす.プロンプト上で
% mysql -u root -p

その後にPASSを聞かれるが,これは初期設定時に登録したPASS

6. SQLプロンプトが表示されて,SQL文を書きまくり(・∀・)


この後はJDBCドライバを入手してJavaでDB操作だな.
てか,未だにこのブログに使い慣れないっていう…

参考URL:MySQL初心者入門講座

2009年4月12日日曜日

[programming]配列の要素を回転させるプログラム


最近は友達から借りたプログラミングの本を読んで時間を潰すことが多い.どれも難しい問題ばっかりで理解するのに苦労する.今日はその中から1つ問題をチョイス.

「要素がn個の配列をi要素分だけ回転させる(後ろに持っていく)プログラムを書きなさい」っていう問題がある.ようは,

1,2,3,4,5,6,7,8,9,10

と入ってる配列を「3回転させてね♪」と指定したら,

4,5,6,7,8,9,10,1,2,3

とすればいいので,例えば以下みたいなプログラムのように,1回ずつ移動させる関数を定義し,その関数を3回呼び出せば実現できる.
・・・
int a[n]; //要素n個で配列を定義
・・・
int func(){
int tmp = a[i];
int i;
for(i=0; i< n; i++){
if(i==n-1) a[i] = tmp;
else a[i] = a[i+1];
}
}

しかし,問題には条件があって,「メモリを数十バイトしか使わずに実行時間もnに比例するだけ」のプログラムにしないといけない.このプログラムだとnに比例しないのでダメなのである(´・ω・`) 配列を複数個用意するなんてもっての外である.



じゃあ実際にどうやってそれを実現するのかというと,本に書いてあるヒントでは,a[0]を1時保管用のtに入れておき,その後はa[0]にa[i]を入れる.次はa[i]にa[2i]を,a[2i]にa[3i]・・・てな感じで移していく.つまり,3つ移すのなら3つ置きにずらしていけばいいということですな,なるほどぅ

で,書いたのがこれ

for(m=0; m< gcd(n, i); m++){
//最大公約数に達するまでm番めのグループを移動する
tmp = a[m]; //一時保管庫へ
j = m; //転送先を初期化
while(1){
k = j; //転送先をセット
j = j + i; //転送元をセット
if(j< n){
a[k] = a[j]; //移す
}else{ //転送元添字がn以上だったら
j = j%n;
if(j==m){ //転送元添字がmと同じなら
a[k] = tmp; //一時保管用のを移す
break;
}
a[k] = a[j];
}
}


なんか,もうちょっとまとまって書けないのかねぇ(´・ω・`)
本のヒントの通りに書いたわけだが,for文で最大公約数に着目してループしている.ここがどうしても理解できないorz 確かに移動できてるんだけどねぇ

bloggerを使ってみる

ども,かわらです.

プライベートなことは今まで通りmixiでやっていくとして,自分が経験した技術関係のログは外部のブログにしようと思って,googleのbloggerを利用することにしますた.どうぞヨロシク(・∀・)


まあ,仕事が本格的になってくると書く暇がなくなる気がするので,実際にこのブログを運用していけるかどうかは不明ですががががg




それでは