気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
私は現在、「Google App Engine」と「Silverlight」を組み合わせたWebアプリを開発しています。
「Google App Engine」側にはREST型のWebサービスを実装しているのですが、
やはり最初にぶちあたったのが、フレームワークの問題です。

実際、JavaでWebアプリを開発するとなると、ほとんどのケースにおいて、
フレームワークを使うことになると思いますが、「Google App Engine」の場合、
個人で小さなアプリを開発している人も多いのではと思います。

ほんの数画面ほどのものを作るだけなのですが、全く一から「JSP + Servlet」で
作るとコードが煩雑、または冗長になったりしてしまって、日頃きれいなコードを
心掛けている方は、少々不満に感じたりするかもしれません。

だからと言って、フレームワークを使うとなると、それを設定したり、
または使い方を覚えるのが大変で、かえって時間がかかってしまったり
することも有ります。

このジレンマを解決したく、私はGAE専用の超超軽量フレームワークを
作ってみたいと考えました。

私は、このフレームワークを考えるにあたり
「最低限JavaとServlet+JSPを知っていれば、すぐに使える!」
を最大の目標として設定しました。

私が今、ここでフレームワークと言っているのは、
フレームワークを構成するクラス群と
ある一つの考え方です。

■フレームワークを構成するクラス
フレームワークを構成する主なクラスは以下の3つです。

①Actionクラス
StrutsのActionクラスと同じで、実処理を記述したり、
遷移先をコントロールしたりするクラス。

②Dispatcherサーブレット
リクエストされたURLとルールに従って、対応するActionクラスの
対応するメソッドをコールするクラス。(設定ファイルは使いません。)

③HttpBeanManager
リクエストパラメータを、JDOエンティティのインスタンスに設定し、
検証を行うクラス。

①と②については最低限これが無いと、Servletが画面毎に存在する
原始のプログラムになってしまうのと考えたからです。

③についてはrequest.getParameter()をたくさん記述して、
それを一つ一つ各々で検証する部分に時間を割きたくなかったからです。

データまわりはGAEから提供されているので、これで
最低限の見栄えのと生産性が実現できると考えました。

■フレームワークを構成する考え方
次に先に述べた「ある一つの考え方」についてですが、
お気づきかと思いますが、このフレームワークではプレゼンテーション層の
モジュールを一切提供しません。

どうするかと言いますと、原点に立ち返り、JSPの「式」と「スクリプトレット」で
プレゼンテーション層を記述するのです。これが「ある一つの考え方」の内容です。

現在、ほとんどのフレームワークでは、独自のタグライブラリが提供されています。
今や、タグライブラリでJSPを記述するのは当たり前で、「スクリプトレット」と
言われても、言葉すら聞いたことが無いJavaのエンジニアの方もいると思います。

「スクリプトレット」はスパゲティーソースの原因としてバッシングを受け、
ほとんど使われることが無くなっていますが、私は、
「ビジネスロジックはJava側に記述し、スクリプトレットでは記述しない」
という前提の元に、「スクリプトレット」を使用することは、そこまで悪ではないと
考えています。

タグライブラリは確かにJSPをきれいにするのですが、その反面、覚えるのが大変で、
JavaによるWeb開発を難しくする要因の一つになっています。

そして、何よりも、タグライブラリを作ってしまったら、
「最低限JavaとServlet+JSPを知っていれば、すぐに使える!」と
矛盾することになります。

私は、このフレームワークを「Zinbei Framework」と名付けました!
理由は。。。ありません。思いつきです。

少しずつですが、作り上げてこのブログで発表していきたいと思います。

※私は、既存のフレームワークの有効性を否定しているわけではありません。
Javaの開発にもこのような選択肢があっても良いのではと考えているのです。
スポンサーサイト
SilverlightでScrollViewerを使用すると「おやっ」と思うことがあります。
それは、「マウスホイール」によるスクロールが効かないことです。

でも安心してください。ちゃんと対応されています。
XAMLに以下のように記述するだけで、効くようになります。

<ScrollViewer Background="Transparent">

Silverlightでは、Brushを指定していないコントロールに対しては、hittestが有効にならない挙動があるみたいで、
透明なBrushを設定することで、回避できます。

今回はiTextSharpで日本語を出力する方法を紹介します。

iTextSharpで日本語を出力する方法は2通りあります。
1つ目は、ローカルPCにインストールされている日本語のフォントファイルから
Fontオブジェクトを生成する方法です。

   Font font = new Font(
                 BaseFont.CreateFont(@"c:\windows\fonts\msgothic.ttc,0",
                          BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
                 , 20);

Fontオブジェクトの生成には、BaseFontクラスのCreateFontメソッドを使用します。
第一引数で、使用するフォントのフォントファイルを指定しています。ttcファイルは
複数のフォントが含まれるファイルですので、ファイル名の後に、[0]をインデックスと
して、指定しています。
上記サンプルでは「MS ゴシック 標準」フォントを指定しています。

第二引数は、文字エンコーディングを指定します。
日本語の場合は向きに応じて、「IDENTITY_H(横書き)」、「IDENTITY_V(縦書き)」の
いずれかを指定します。

第三引数には、フォントをPDFファイルに埋め込むかどうかを指定しています。

生成したフォントは「Paragraph」や「Chunk」に指定して、使用します。

   document.Add(new Paragraph("日本語出力のサンプルです。", font));

2つ目の方法は、標準で使用可能なビルトインフォントを使用する方法です。
「ビルトインフォント」を使用する場合は、「iTextAsian.dll」ファイルを
参照に追加しておく必要があります。「iTextAsian.dll」は以下のURLからダウンロード可能です。

http://sourceforge.net/projects/itextsharp/files/extras/extras%201.0/

※DLLバージョンを使用すると、「フォントを認識できない」というエラーが発生する場合がありますので、
ソース(iTextAsian-1.0.zip)をダウンロードして、ビルドしたものを使用した方が良いです。

「ビルドインフォント」を使用するためには、以下のようにして、BaseFontのリソースに
登録しておく必要があります。

   BaseFont.AddToResourceSearch("iTextAsian.dll");

staticメンバーのメソッドなので、プログラム実行中に付き、一度実行すればOKです。

ビルドインフォントのFontオブジェクトは以下のようにして生成します。

   Font font = new Font(
                BaseFont.CreateFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED)
                , 20);

こちらも同じくBaseFontクラスのCreateFontメソッドを使用します。
第一引数には使用するフォントを使用します。「iTextAsian.dll」には
以下の3つの日本語フォントが含まれています。
「HeiseiMin-W3」、「HeiseiKakuGo-W5」、「KozMinPro-Regular」

※標準フォントとして、インストールされているフォントはAcrobatの
バージョン毎に異なりますので、Readerで開いた際に、ここで指定された
フォントが存在しない場合は、Readerの判断で、それに応じたフォントが
使用されるようです。

第ニ引数には同じくエンコーディングを指定します。

日本語の場合は、次のいずれかを指定します。
「UniJIS-UCS2-H」、「UniJIS-UCS2-V」、「UniJIS-UCS2-HW-H」「UniJIS-UCS2-HW-V」

いろいろなアプリケーションを開発していると、PDF形式で帳票を出力したいケースが
出てきます。有料のライブラリは多数販売されているのですが、お金を使わずにやりたいと
オープンソースのライブラリを探してみました。

.NET Frameworkから使用できる外国製のオープンソースのライブラリはいつくか有るのですが、
日本語が扱えるとなると、これからご紹介する「iTextSharp」しかなさそうです。
「iTextSharp」はJavaの帳票ライブラリ「iText」の.NET版です。

・iTextSharpをダウンロードする

このライブラリには多様な機能が提供されているので、今後、継続して記事を書いていきたいと思います。
初回の今日はまず、文字列をPDFファイルに出力するだけの簡単なサンプルを紹介します。

iTextのサイトにJava版のサンプルコードが公開されているので
それを参考にC#のコードを書くことが出来ます。

using System;
using System.IO;

using iTextSharp.text;
using iTextSharp.text.pdf;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //作成する文書を表すクラス
                Document document = new Document();

                //PDFをファイルに出力するように設定する
                PdfWriter.GetInstance(document, new FileStream("helloWorld.pdf",FileMode.Create));

                //文書をオープンする。コンテンツを追加する前に必ず実施する必要があります。
                document.Open();

                //段落を追加する
                document.Add(new Paragraph("Hello! World."));

                //文書をクローズする。ここで出力用ストリームがFlushされ、閉じられます。
                document.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
            }
        }
    }
}

本日は、C#からIEの履歴にアクセスするためのTipsを紹介します。

IEの履歴にはCOMインターフェース「IUrlHistory」を使用すると、アクセスできます。
このコンポーネントからIEの履歴の一覧を取得したり、履歴を削除(正確にはクリア)したり、
履歴を追加したり(あまり使わないと思いますが)することが出来ます。

そして、大変すばらしいことに「IUrlHistory」のC#用Wrapperクラスを
提供してくれている方がいます。

「IUrlHistory」のC#用Wrapperのダウンロード

Wrapperライブラリはソースコード形式で提供されていますので、
ダウンロードしたファイルを展開して、「UrlHistoryLibrary」プロジェクトをビルドします。

そして、生成されたアセンブリ「UrlHistoryLibrary.dll」を、利用するプロジェクトから参照設定すれば
Wrapperライブラリを使用できるようになります。

以下は、履歴の一覧を取得するコードです。
using UrlHistoryLibrary; //Wrapperライブラリ

・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・
    public partial class MainWindow : Window
    {
        private UrlHistoryWrapperClass urlHistory;

        public MainWindow()
        {
            //Wrapperクラスをインスタンス化
            urlHistory = new UrlHistoryWrapperClass();
        }

・・・・・・・・・・・・・・・・・・
        public  List<STATURL> GetHistoryList()
        {
            List<STATURL> historyList = new List<STATURL>();

            //履歴の一覧の列挙を取得
            UrlHistoryWrapperClass.STATURLEnumerator enumerator
                                         = urlHistory.GetEnumerator();

            //1件ずつ列挙する
            while (enumerator.MoveNext())
            {
                historyList.Add(enumerator.Current);
            }

            return historyList;
        }
    }

「STATURL」は1つの1つの履歴レコードの情報を管理する構造体オブジェクトで、
この構造体から履歴のURLやTitle、最終訪問日などの情報にアクセスすることが出来ます。

次に履歴の削除について、紹介します。
履歴の削除には、ClearHistory()を使用してユーザの全ての
履歴を削除してしまう方法と、DeleteUrl(String url)を使用して
指定された履歴のみを削除する方法があります。

後者のDeleteUrlの方が使い勝手が良さそうなのですが、
以下のページにも記述されている通り、このメソッドでは、
IEの履歴フォルダーのエントリーを削除することが出来ません。

http://support.microsoft.com/kb/327569/ja

実質的には「DeleteUrl(String url)」は役に立たないメソッドのようです。

新年明けましておめでとうございます。
2011年がみなさまにとって良い年になりますようお祈りいたします。

昨年は全くこのブログを更新することが出来なかったにも関わらず
多くの方に訪問していただきありがとうございました。

今年は何とか頑張って更新をしていきたいと思いますので
どうぞよろしくお願いします。

昨年は、スマートフォンとクラウドがIT業界の話題の中心でしたが、
今年はどんな年になるのでしょうか?

私が現在、特に注目しているのは「Google Chrome OS」です。
「Chrome OS」上では、全てのアプリケーションがWebアプリケーションとして
提供されることになるので、クライアントアプリが存在しません。

確かにPC利用の目的のほとんどがWeb閲覧であったり、ほとんどの業務アプリが
Webアプリケーションとして提供されている昨今では、それでよいのかもしれませんね。

そういえば、かつては、Java仮想マシンのみが稼働する「Java OS」なんていうのもありましたね。
結局、Windowsの壁を崩すことができませんでしたが。。

私はWindowsの競合となる製品が世に出てくることはユーザにとっては
良いことだと思いますし、「Chrome OS」は実際にWindowsのシェアの何割かを
奪うのかなと想像しています。

ただ、私は個人的には全てのアプリケーションがWebアプリケーションになる
未来を想像したくないです。

私はWindowsというプラットフォームはアプリの開発者にとっては魅力的な
プラットフォームだと思っていますし、Webアプリでは実現できない豊かな
表現力はユーザにとってもメリットがあると思っています。

むしろ「Google Chrome OS」の出現によって、「Windows」の改善が
進むことを期待したいと思っています。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。