2007/03/17

BloggerのFeedにも「続きを読む」を適用してみる。

無精をしたいが為に何通りかの方法を試してみたりしてきたBloggerでの「続きを読む」機能ですが、現在はtemplate + javascriptな方法で運用中です。

このFeedを読んでいる方には迷惑な話かもしれませんが、もう少し「続きを楽しむ」って事で、Feedにも適用してみました。


RSSなりAtomなFeedをBlog Readerで購読していると、見かけるのが記事全文を表示しないタイプのFeedです。

BloggerでもSummaryなFeedが用意されているのですが、これは先頭からの文字数規定でSummaryとするタイプであり、折角「続きを読む」な書き方をしているのにちょっと理不尽な感じがしまして、別サーバーを介して<div class="fullpost">内を削るFeedを作ってみました。

実際には私はFeedburnerを利用していますので、こちらにもSummary機能はあるのですが、こちらも規定文字数までを出力するタイプなので、FeedburnerのFeed元を自サーバーに変更して対応しました。

サーバーはASP.Netな環境であり、今回のFeedはc#で書かれたaspxページで提供されています。

BloggerのコンテンツはXHTML 1.0 Strictだと思っていたのですが、私個人がそれをやや無視したコンテンツを書いていたり、Picasaから投稿した際に生成されたと思われる画像への<a>タグのAttributeの記述で要素間の空白が無いケース等があり、xmlなパーサー使って読み込んでremoveChildで消せば楽々だとかの思いは適いませんでした。

今更過去に書いたPostの細部を確認しながら修正する気力も湧かないなかったので、XML Parserを使うのではなく正規表現を交えたコードでゴリゴリと<div class="fullpost">を消しこむようにしました。

それほどASP.NetなサーバーをBloggerのFeedの加工なんかに利用できる方もいるとは思えませんが、コードはこんな感じです。

public partial class atom : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        XmlDocument xml = new XmlDocument();
        WebClient webClient = new WebClient();
        String sFeed = (Request["feed"]!=null
                    ?Request["feed"]
                    :@"http://isawseashell.blogspot.com/feeds/posts/default" );
             
        Stream webDataStream = webClient.OpenRead(sFeed);

        xml.Load(webDataStream);

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
        nsmgr.AddNamespace("atom""http://www.w3.org/2005/Atom");


        XmlNodeList contents = xml.SelectNodes("//atom:entry//atom:content", nsmgr);

        foreach (XmlNode content in contents)
        {
            string sContent = content.InnerText;

            sContent = removeFullpost(sContent);

            content.InnerText = sContent
                + "<br/>【記事全文はBlogサイト I saw seasheels. にて!!】";

        } // __forEach

        Response.Write(xml.OuterXml);

    }

    //
    private string removeFullpost(string sContent)
    {

        Regex rexp = new Regex("<div.*class=.*fullpost.*>");

        int nStartPos = rexp.Match(sContent).Index;

        if (nStartPos > 0)
        {
            int nEndPos = findEndTag(sContent, nStartPos, "div");

            sContent = sContent.Substring(0, nStartPos)
                    + (nEndPos + "</div>".Length + 2 <= sContent.Length
                        ? sContent.Substring(nEndPos + "</div>".Length + 2)
                        : "");
        }

        return sContent;
    }

    private int findEndTag(string s, int nStartPos, string sTagName)
    {
        Regex rexpEnd = new Regex("</" + sTagName + ".*>");
        Regex rexpStart = new Regex("<" + sTagName + ".*>");

        int nEndPos = rexpEnd.Match(s, nStartPos + 1).Index;
        int nInnerStart = rexpStart.Match(s, nStartPos + 1).Index;
        if (nInnerStart > 0 && nInnerStart < nEndPos)
        {
            nStartPos = findEndTag(s, nInnerStart, sTagName);

            nEndPos = findEndTag(s, nStartPos, sTagName);
        }
        else
        {
            nEndPos = rexpEnd.Match(s, nStartPos + 1).Index;
        }

        return nEndPos;
    }

}


省略時の文言もパラメータにしようとかは思っていますが、現在はこんな感じて書いてあります。そしてこれをホスティングしているサーバーのURLをFeedBurnerのFeed元に指定しいます。

今現在このBlogのFeedを見ると記事が省略されいるかと思います。

このコードをHostingしているサーバーの規約・制約があるのでサービスとして公開する事は出来ませんが、Adsense等の広告収入がServerのレンタル代(月1000円程度)をカバー出来るようになったらなぁ・・とかと夢を見ています(笑

こんな感じで実はちょっと迷惑は機能を実装したりして、自己満足に浸っていられるのがPrivateなBlogの良さではないかと。

続きを読む・・

2007/03/14

Bloggerのフィードを投稿日(Published date)順で。

このBlogでも自身のFeedを最近の記事としてFeed Widgetで利用していますが、BloggerのFeedはデフォルトでは更新日時順でソートされています。

これはある意味正しいし、「仕様です」と言われればそれまでなんですが、実はパラメーターで投稿日順に変更出来ることがわかりました。

Google Operating System Blogの記事ですが、Sort Blogger's Feeds by Published Date によると、フィードのパラメーターとして"orderby=published"を渡せば良いとの事。

早々に設定しましたが良い感じです。更新日時と投稿日のどちらでソートするかは好みですしょうが、選択肢が選べるのは良いことです。

ちなみに自分のBlogのFeed URLは、
  • http://YourBlogName.blogspot.com/feeds/posts/default

  • になりますが、これにパラメーターを付けて以下のようにします。
  • http://YourBlogName.blogspot.com/feeds/posts/default?orderby=published


  • ですがこの設定をする機能はBloggerの管理画面には用意されていません。

    Feed URLはテンプレート中の<b:include data='blog' name='all-head-content'/>の中に含まれていて、そのままではテンプレートをHTMLの編集でも出来ません。

    このタグは、実際にBlogが表示される際に<meta>タグと<link>タグに展開されます。

    ですので自分のBlogをブラウザで表示し、そのソースから>head<タグ内の<meta>タグと<link>タグFeed部分を抜き取り、テンプレート中の<b:include data='blog' name='all-head-content'/>部分と置き換える必要があります。

    つまり以下のようになっているのを、

    <head>

    <b:include data='blog' name='all-head-content'/>

    <title>
    <data:blog.pageTitle/>
    </title>


    実際に表示されたページのソースからコピーして以下のように置き換えます。

    <head>

    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
    <meta content='true' name='MSSmartTagsPreventParsing'/>
    <meta content='blogger' name='generator'/>
    <link href='http://isawseashell.blogspot.com/feeds/posts/default?orderby=published' rel='alternate' title='I saw seashells. - Atom' type='application/atom+xml'/>
    <link href='http://isawseashell.blogspot.com/feeds/posts/default?orderby=published' rel='alternate' title='I saw seashells. - RSS' type='application/rss+xml'/>
    <link href='http://www.blogger.com/feeds/37681533/posts/default' rel='service.post' title='I saw seashells. - Atom' type='application/atom+xml'/>
    <link href='http://www2.blogger.com/rsd.g?blogID=37681533' rel='EditURI' title='RSD' type='application/rsd+xml'/>

    <title>
    <data:blog.pageTitle/>
    </title>


    上記の<link>タグの内、rel='alternate'となっているの2つが通常のフィードURLになります。(RSSとAtom)

    ちなみにテンプレートを編集する際には「ウィジェットのテンプレートを展開」のチェックをする必要があります。詳細な手順はこんな感じです。テンプレートの編集はやや難易度が高いというか失敗すると困るので事前の保存は欠かさずに。



    この辺りの変更は「続きを読む」機能シリーズ(笑で散々やりましたけどね。

    このorderby=publishedは、 "Bloggerに「関連記事リスト」を。"にも追加しましたが、こっちはリストの評価方法を再検討する必要があるんで、これに関してもそろそろ手を入れてみたいと思ってます。

    続きを読む・・

    Adsense を 自分でクリックしない為に。-3

    私の用にGoogle Adsenseからの初回入金は1年ぐらい先みたいな、自分でサイトを見ながらデザインとか記事を見直したりしていて、閲覧者の大多数を自分が占めているような場合は、その初回入金までの間に自己クリックによりGoogleよりAdsense Accountを停止されないかと、サイトを見るたびにナーバスになったりしていませんか?

    前回Adsenseの自己クリックを防止する為にProxomitron用のフィルターをまた更新しました。中々うまく書けたのではないかと思っているのですが、リンクを貼ってくれたサイト(Adsense Trick)の方に尋ねた所、サイトに書き込まれた設定を自分でProxomitronに設定するのはやや難しいような話でした。


    今回はフィルターを書き換えより、主として設定方法を簡易化しました。

    最初にGoogle Adsenseにログインして、アカウント情報から自分のAdsense-Id(16桁の数字)を取得するといいでしょう。Adsense-Idは、Adsense管理画面の以下の部分です。



    Adsense-Idが判ったならば、今回はマージ(統合)可能なProxomitronの設定ファイルを作りましたので、これをここからダウンロードして下さい。

    ファイルはzip形式で圧縮してあります。zipを展開すると、中身はProxomitronの設定ファイル(adsense.cfg)と自分のAdsense-idを書き込むリストファイル(myAdsenseId.txt)が入っています。リストファイルは中身が空になっていますが取り敢えずは気にせずに。



    この空のリストファイル(myAdsenseId.txt)をインストールしたProxomitronのListsフォルダにコピーして下さい。





    次にProxomitronを開き、メニューから「設定ファイルの併合」を選び、zipファイルに入っていたAdsense.cfgを指定してください。





    これによりフィルターが現在の設定にマージされ、Proxomitron画面の下部に「併合完了」の文字がでます。



    フィルターは併合(インストール)されましたが、この状態だとアクティブになっていません。フィルターの状態を確認しても、インストールした二つのフィルターは赤色で無効になっています。



    これを有効にする為には画面の設定保存ボタンを押してください。





    そしてメニューから「デフォルト設定のリロード」を選択し実施ください。



    これによりフィルターは有効になります。

    次に、自分のAdsense-Idをリストに登録します。これはProxomitorn画面からではなく、タスクバーアイコンから行います。タスクバーのアイコンを右クリックしてメニューから、「ブロックファイルに追加」を選び、myAdsenseIdを選択します。







    「URLをBlock Fileへ追加」画面が現れますから、自分のAdsense-Idを入力しOKボタンを押してください。



    これで全設定は完了です。後はブラウザのProxy設定をすればフィルターは動きます。自分のサイトを見て確認してください。

    上記の手順によりフィルターの設定はかなり簡略化されたと思うのですが如何でしょうか?

    次回には、自分のサイトで指定したIDの広告が表示された場合に、それをログファイルに書き出すフィルターを書く予定です。

    これはAdsense広告で自分のサイトには相応しくない広告が表示される事がある場合、Adsense設定のフィルター機能を使いますが、これはURL単位でしか指定できません。ですがこれらの広告は同一のAdsense-Idで多数のサイトを運営しており、気が付く度にフィルターに足していくのが面倒なので、自分で一通りサイトを巡回した後に、ログファイルにそのAdsense-Id広告のURLを吐き出すように出来ないかと考えています。

    近日中には作成する予定で、うまく機能したらまた記事にします。

    続きを読む・・

    2007/03/13

    Access2007 新機能 複数値フィールド -- 01

    前回のMulti-valued field(複数値フィールド)に関しての続きです。

    個人的にはRapidな開発領域から外れるような形でのMicrosoft Accessによるシステム開発にはあまり気乗りがしないのですが、今更ですがこれだけPCが普及した社会であり、企業内の机の上にはPCが基本である現状でもあり、日常的な細かな業務もPCで管理出来るようにして業務効率を上げたいとの要望は尽きることなくあるわけで、専用で高価なSystemを程でもないような領域では、Access2007のアプローチは有効であろうと思います。

    目指すべきMicrosoft Accessでのシステム開発のポイントは、如何にコードを書かずに済ますかだと思います。色々と細かい事をフォローしようとするとVBAコードの記述が必要になってくるのですが、そのような局面を如何に減らすかがポイントではないでしょうか。

    まずは前回作成したテーブルに対して、Access2007の基本機能でシンプルにフォームを作ってみます。テーマはあくまでもRapidな開発を考えてですので、スクラッチから(Formデザインで初期から)作成等はしません。

    このAccessの機能によるフォームの自動作成のポイントは、テーブルデザイン時に各フィールドを適切に設定しておく事です。入力ルールやIMEの制御等を含めて、テーブルのデザインとして設定することで、フォーム作成時に後から余計な設定をする必要がなくなります。

    前回のテーブル作成時にMulti-valued field(複数値フィールド)を設定しましたが、作成時にはフィールドの型としてLookup Wizard(ルックアップウィザード)を選びましたが、作成したテーブルのフィールド型は参照しているテーブルのPrimary Key(主キー)の型となります。(※ 主キーとして複数フィールドを設定している場合はもう少し複雑な事になりますが、これは別途記述したいと思います。)

    作成(設定)時はLookup Wizardを選びますが、



    作成されたテーブルのフィールド型はNumber型になっている。(参照先の主キーの型)



    上記のように複数値を許可して作成したフィールドも型としては特に追加されたタイプではなく、複数値型が新たに追加されたわけでは無い事がわかります。

    フォーム作成の対象となるテーブルを選択した状態でCreateメニューからFormボタンを押す事で、テーブルの各フィールド設定に基づいて自動的に作成されます。



    作成されたフォームは以下のようになります。



    複数値フィールドと設定したVendorsはテキスト型ですが、入力はキーボードからの文字入力は出来ず、ドロップダウンリストからの選択になります。



    このようにテーブルのデザイン時に設定してあれば、シンプルな操作で入力フォームが作成できます。

    同様の事を複数値フィールド機能を使わずに、テーブル同士を繋ぐ副テーブルを使った場合のフォームの作成ステップを考えると雲泥の差に感じます。

    話はちょっとズレますが、実はこの別テーブルで関連付けした場合でもフィールドにルックアップの設定をしておけば、Accessはやや強引ながらもボタン一発で自動的に複数値を入力可能なフォームを作成してくれます。



    ちょっとだけVendor入力のサブフォームのサイズを修正しましたが、それなりに使えるフォームです。入力規則はしっかりとフォローされますし、副テーブルにはデータが自動的(?)に入りますし。

    ちなみに上記フォームの基となるテーブルと関連テーブルはこんな感じです。



    このサブフォームもAccess2007からの新機能だと思います。従来はサブフォームはWizardを使うにしても別途作成する必要があったのですが、Access2007だとTableを直接参照する事が出来ます。



    ですがこれが通用するのもフォームだけでレポート(帳票)作成となると別です。ボタン一発で作成したレポートを比較してみましょう。

    まずは複数値フィールドを使ったテーブルから作成したレポート。



    そして、副テーブルを使ったパターンのテーブルから作成したレポート。



    上記のように副テーブルを使ったパターンでは、単純にAccessまかせではレポート(帳票)として使い物になりません。サブレポートを使うなり、VBAコードをレポート内に入れてレコード単位で子要素を取得して表示するような処理をしなければなりません。

    つまり複数値フィールドを使用するメリットは別途副テーブル等を作成/管理する手間の面よりも、レポートやフォーム作成時の簡易性にあると思います。

    VBAで制御コードを書いたSpecialなフォームやレポートにはデザインや入力性では敵わないのですが、作成必要な時間、つまりはコストを考慮した場合には検討する価値のある物なのではないでしょうか。

    以上のような形で、複数値フィールド(Multi-valued field)に関して見てきましたが、次回にはその内部的な面を調べてる予定です。

    またここまで使ってきた上でAccessの機能に「これはちょっと・・」的な事を思う面もあるので、それらも書きたいと思います。

    続きを読む・・

    2007/03/12

    Adsense を 自分でクリックしない為に。-2

    以前に「Adseseを自分でクリックしない為に」という記事でThe Proxomitronを使ったフィルターを書きましたが、その時のあまりにも適当であったフィルターを改善しました。

    対象となるのは「コンテンツ向け AdSense」のみですが、完全にクリックが出来なくなりますから、自分のサイトを安心して閲覧する事ができます。

    またAdsense IDにて絞込みますので、他のサイトを閲覧する際には影響を及ぼしません。

    最初に具体的にどうなるのかを説明します。まずは通常はブラウザの画面でURLしているテキストを右クリックすると、「リンク先のURLをコピーする」等のメニューが出てきます。



    Adsenseの表示されている領域でもこれは同様ですが、フィルターを適用後はこのメニューが出てこない=リンク先が無くなります。



    そして操作ミスが怖くて中々出来ない、Adsense領域内のテキストも安心して選択できるようになります。



    上記のように、Adsense広告を単なるテキストとして表示するようになるフィルターです。Adsense広告の改変は規約で禁じられていますが、自分が自身のサイトをローカルで表示する場合のみへの適用であり、他の方への影響をまったくありませんから、この方法ならば問題は無いかと思います。

    The Proxomitronのインストールに関しては、Proxomitron-Jを参照してください。

    私が使用してるのは、Proxomitron Ver.Naoko 4.5 "May" 版になります。Proxomitron-Jによると、バージョンに関しては以下の解説があります。

    Proxomitron の最新版 Ver.Naoko-4.5 には、「May(5月)」バージョンと呼ばれるものと「June(6月)」 バージョンと呼ばれるものがあります。公式に "May" が公開されたあと、いくつかの仕様変更、バグ修正などが行われて非公式に公開された(存在が明らかになった)ものが "June" です。 "June" は現在の最新版であり、おそらく最終版です。

    ファイルは日本語化パッチも含めて、Proxomitron-JのDownloadページから入手可能です。

    個人的には最近の記事でも書きましたが、インストーラ無しのでzip形式で提供されている、"Proxomitron Ver.Naoko 4.5 "May" [ZIP] ( 1.08MB )"をお勧めします。

    初期のInternet Explorer等に対する設定の方法は、インストールと削除の仕方(Proxomitron-j)を参照してください。また"Webブラウジングを快適にする「The Proxomitron」(MYCOMジャーナル)"にも詳細な解説があります。

    私が今回書いたのは「Webページフィルタ」ですので、ウェブページフィルタダイアログに対する解説(Proxomitron-J)も参照しておいてください。

    テキストで書かれたフィルターをインポート機能で取り込む事が出来ますので、ウェブページフィルタダイアログに対する解説(Proxomitron-J)の「ウェブフィルタをシェアする」という項目も要チェックです。

    今回の書いたフィルターは二つあります。これは<a>タグを取り除くものと、その周りを取り巻くonclick(),onfocus()等のイベントハンドラを無効にするフィルターになります。

    まずは<a>タグを取り除き、リンク先に飛べなくする為のフィルター。


    [Patterns]
    Name = "Anti Self Click Adsense"
    Active = TRUE
    Multi = TRUE
    URL = "*.googlesyndication.com/$TYPE(htm)"
    Limit = 2048
    Match = "$NEST(<a*href=$AV(*0000000000000000*)*>,\9,</a>)"
    Replace = "\9"



    Match の後で0000000000000000(16桁)となっている部分には自身のAdsense-Idが入っています。 画面でみとるこんな感じです。



    このフィルター指定されたAdsense-idを含むはリンク先(href)が設定されいてる<a>タグを取り除き、内部のタグ・テキスト(=innerHTML)に置き換えます。

    Multitが(True)有効になっている事に注意してください。次のフィルターと同一の領域を対象とする為に 「複数のルールのマッチを許可する」必要があります。

    このフィルターだけで<a>タグが消えますので、Adsense広告は表示されていても単なるテキストになりますので、クリックしてもリンク先に飛ぶ事は無くなります。

    ですが、この<a>タグの外側の<td;>タグにonfocus(),onclick()等にイベントが設定されており、クリックするスクリプトのエラーが発生します。スクリプトを解析していませんが、これらのイベントがクリックと同等影響を及ぼす事を懸念して、これらイベントも取り除くフィルタがこれです。


    [Patterns]
    Name = "Anti Self Click Adsense2"
    Active = TRUE
    Multi = TRUE
    URL = "*.googlesyndication.com/$TYPE(htm)"
    Bounds = "$NEST(<td,*href=$AV(*0000000000000000*)*,</td>)"
    Limit = 4096
    Match = "(\#(onclick|onmouseout|onmouseover|onmousedown|onfocus)=$AV(*))+"
    " \# "
    " $SET(9=\@)&"
    Replace = "\9"


    Bounds の中でで0000000000000000(16桁)となっている部分には自身のAdsense-Idが入っています。 画面でみとるこんな感じです。



    このフィルターで、onclick,onmouseout,onmouseoveronmousedown,onfocusの各イベントを消しています。こちらもAdsense-Idで絞り込んでいますので、他のサイト閲覧時の影響を排除しています。

    どちらのフィルターも"*.googlesyndication.com/$TYPE(htm)"とURLマッチを設定していますので、通常のブラウジング時でもフィルターによるパフォーマンスの低下を意識することが無いレベルではないか思います。

    これら2つのフィルターにより、自分のサイト上のAdsene広告(「コンテンツ向け AdSense」のみ)はマウスで触り放題になりますので、日々安心ではないでしょうか。

    続きを読む・・

    Windows Vista で NASに接続 -- 2

    Windows Vista で NASに接続する際に、強化されたセキュリティ設定の為に認証が出来ない問題に関しての記事を「 Windows Vista で NASに接続」で書きましたが、かなりの数のアクセスを頂いているようです。

    改めて読み直すと、殴り書きのような文書でもありお恥ずかしい限りですが、このトラブルで困っている方の多くがWindows Vista のHome Editionでレジストリ変更をするハードルの高さに躊躇してるのではと思い、レジストリ変更の為のファイルを用意してみました。

    ファイルを用意したといっても、数行のテキストが入ったファイルを設定の数(0,1,2,3)と作っただけです。これだけだと寂しいので、画面を交えて説明したいと思います。

    作成したファイルはzip形式でアーカイブしてあり、ダウンロードはここからどうぞ。ファイルの中身は以下のようになっていますので、ファイルを展開してから使って下さい。




    レジストリの変更はWindows OSならびにPCの動作環境に、復旧困難な深刻なトラブルを起こす可能性があります。レジストリ操作を直接、もしくは以下ののファイルを利用しての変更行う際には、それらのリスク承知の上、自己責任にてお願いします。



    これらのレジストリファイルは、Windows VistaからNASに接続できない問題に対処する為に、lmcompatibilitylevelを変更する為のものであり、ダブルクリックする事でレジストリの値を変更します。

    変更するレジストリは以下の場所になります。
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\lmcompatibilitylevel


    ファイルはそれぞれ、lmcompatibilitylevelを以下のように変更します。
    • lmcompatibilitylevel_0.reg は lmcompatibilitylevelを0
    • lmcompatibilitylevel_1.reg は lmcompatibilitylevelを1
    • lmcompatibilitylevel_2.reg は lmcompatibilitylevelを2
    • lmcompatibilitylevel_3.reg は lmcompatibilitylevelを3
    Windwos Vistaの場合、初期値は3です。まずはlmcompatibilitylevel_0.reg を使って、lmcompatibilitylevelを0に変更して接続を試してみてくたさい。

    lmcompatibilitylevel_0.reg をダブルクリックすると、レジストリに登録する旨のメッセージが表示されます。

    ここで「はい」を選ぶことで、レジストリの値が変更され、その旨のメッセージが表示されます。


    以上で設定変更は完了です。基本的には再起動無しで設定は即座に反映されるとの事ですが、念のため再起動して接続を試みる事をお勧めします。

    これでNASに接続が出来るようになったならば、1、2 と値を上げて試して下さい。正常に接続できる一番大きな値にしておくことが、セキュリティ的には良いかと思います。(NTLMv2が使える局面では利用するのがBetter。)

    続きを読む・・

    2007/03/10

    アプリケーションのインストール。(foxit reader)

    OSの入れ替えをする際に、それ以上に面倒なのが各アプリケーションのインストールですよね。Version upやOSが不安定になってきたらから再インストールって以前は結構やってました。Windows95系ならば半年は持たなかったような気もしますし、NT系でもXP以前は定期的に入れ替えをしていまたし。

    Vistaを入れる前にって事で、現在使ってSoftwareでこの手間を省けるものはないか、それに移行できないかと整理中です。


    インストールの手間を省くとは、インストール等を起動してのインストールするのではなく、ファイル・フォルダを配置(コピー)してたら、それでOKみたいなSoftwareです。実際にはアプリーションが初回起動時にレジストリに設定等を記録しているソフトウェアもありますので、完全にフォルダ・ファイルのみって事ではないですが、OS環境への設定とそれに対する依存度が低い事は確かです。

    この手のソフトウェアは特定のフォルダ下に整理してまとめておくと、そのフォルダ毎コピーする事で他のPCで同様の環境を使う事ができて便利です。

    今一番のお気に入りはやはり、Foxit Readerですかね。Acrobat Readerが一時期(5.0とか)で非常識なほど重くなり代替として使い始めたのですが、非常に軽く・安定しており、とても気に入っています。



    Foxit ReaderはFreeで提供されていますが、Windows向けの場合、その提供パッケージがインストーラー付きで.exeと.msi形式で、そしてインストーラー無しのzip形式で提供されいています。



    このzip形式をダウンロードして、解凍して好みのフォルダに配置すればインストールは完了で、起動時にデフォルトのPDFリーダーとして登録されますので、手間もかからないのでインストーラーを使わなくても問題ありません。

    後は日本語のUI(ユーザーインターフェイス)と東アジア言語のサポートをダウンロードしてアプリケーションと同一のディレクトリに追加します。本来はFoxitに自動でダウンロードする機能があるのですが、私の環境の為かうまく動かなかったてので、手動でダウンロード・インストールを行います。



    上記のUI language PackageとEastern Asian Language Supportをダウンロード。

    UI language packageは展開すると、沢山の言語のUI設定が入っていますが、日本語が目的ならば、lang_jp_jp.xmlのみをアプリケーションディレクトリにコピーすればOKです。



    Lanuguage Supportは圧縮ファイルを展開すると、fpdfcjk.binというファイルが入っていますので、これをFoxit Readerに入っていた物と置き換えます。



    最後にFoxit ReaderのショートカットをデスクトップなりQuick launchに登録して完了です。(基本は関連付けされての起動であって、単体で起動することないので、起動用のショートカットはあまり使いませんが・・)

    Microsoft Office 2007もPDF出力は出来るようになりましたのが、表示に関してはFoxit Readerでどうでしょうか?

    続きを読む・・

    Access2007 新機能 複数値フィールド -- 00

    Access2007の機能に関して少しずつですが評価をしていますが、今回はMulti-valued field 複数値フィールドに関して、サンプルを作りながら考察してみました。

    以前に、attachment型に関しても同様にサンプルを作り考察し、Microsoft Access 2007でDAOのバージョンが上がっているという事までがわかりました。

    今回はAttachment型のようにMailを対象データとしたような感じで、ちょっとだけ実際の使用例・モデルを考えてみました。

    商品のマスタテーブルと、その仕入先の関係です。ここではある商品の仕入先が複数存在するモデルを想定し、各商品毎にその仕入先を列挙する必要性がある形を考えました。図にすると以下のような形です。


    現実世界ではPCなりCDコンポなりの特定商品は、そのメーカ独自の商品ですから、複数の納入先があるような事はあまりないのですが、あくまでもAccess評価のモデルケースですので気にしない事に。

    このようなモデルで必要となるテーブルを通常のリレーショナルなデーターベースで考えた場合は、以下のようになるかと思います。(フィルードは最少にしてあります。)


    商品マスタと製造元(仕入先)マスタの他に、それをつなぐテーブルが別途必要になってきます。これはある商品に対しての製造元が複数存在する場合があり、その件数も不定である事を想定しているからです。

    この形の場合に商品マスター管理画面の作成を考えた場合、仕入先(製造元)を複数入力ができるUI(ユーザーインターフェイス)を考慮する必要があります。Rapid的な開発ケースではこの手間が結構惜しかったりもします。

    これとは別に単純に製造元を3つなり5つと取り決めて、商品マスタ上に「仕入先1」「仕入先2」「仕入先3」のような形のフィールドを作成するケースもあるかと思います。



    このような場合は「仕入先」に件数に対して制限が出来てしまい、データ構造としては柔軟とはいえない形ですが、そのような制限下であれば逆に、アプリケーションの開発効率、特に画面まわりの開発は楽になります。このような形はテーブルが正規化されていないとなる訳ですが、開発効率を優先し採用する場合もあるかと思います。

    これらの方法に対してAccess2007で加わったのが、複数値フィールドです。テーブルりデザインは以下ようなイメージになります。


    結果的には最初の2例の良い所取りのような形です。ポイントはフィールド名でVendorsと複数形にしている所で複数のVendorIDがこのフィールドに入るイメージです。複数の値が入るフィールドのイメージはRDBMS等を扱っているとデータベースのフィールドとしては捉えずらいですが、メールの宛先欄をイメージして貰えればわかりやすいかと思います。( ※ 多分このMulti-valued field(複数値型)もAttachmentと同様にメールの格納を意識して作られた形ではないかと思いますが、今回は敢えてメールとは別のモデルを想定しています。)


    具体的に上記の形でテーブルを作成してみます。まずはVendorテーブルから。



    別に特色のないシンプルなテーブルで、各フィールドの型にも特に深い意味はありません。

    次にMulti-valued field(複数値型)を採用するItemテーブルです。



    最終列のVendorsをMulti-valued field(複数値型)にするには、Fieldのデータ型でLookup Wizardを選びます。

    ウィザードの最初の画面では「既存のテーブルかクエリーから選ぶ」を選択します。


    デーブルは予め作成してあるVendorテーブルを選択。


    ここで選択するのは結合Keyとなるフィールドではなく、画面上に表示したいフィールドだと考えてください。この例(画面)ではIDとVendorNameを選択していますが、Vendorテーブルの主キーであるIDはここで選択しなくても自動的に追加されます。


    次に表示時のOrderを指定します。フィールドとAsc/Descが選べます。


    ここで各列の表示したい幅を設定します。結合キーとなるフィールドは隠した方(Hide key column)が、画面上の見栄えもユーザーの理解も良いケースが多いかと思います。


    ここで作成してたLookup列にラベル名を付けます。またこの画面でMulti-valued fieldにする為の指定(AllowMultiple Values)を行います。Multi-valued field(複数値型)を設定出来る機能/画面がここしかないような気がしてるのですが、非常に分かり図らい場所ではないかと・・。


    フィールドをMulti-valued field(複数値型)にした変更はUndoできなくなるとの確認メッセージ。


    リレーションシップを作れるようにする為にはテーブルの設定を保存する必要がある。



    これで出来たテーブルをデータシートビュー開くとこんな感じの画面で入力が出来るようになります。ちなみにこの画面からはVendorの追加は行えず、Vendorの追加はVendorテーブルを開いて別途行います。




    値はキーボードからの文字列の入力ではなく、ドロップダウンからの選択になり、値を選択すると以下のようにカンマ区切りで表示されます。



    以上のような手順で複数値フィールドを扱うテーブルの作成まで出来ました。Microsoft Access上なので、このままでもデータシートビューからの入力もできますので、個人的な用途であればこれでも十分かもしれません。

    ですが評価としてそうも行かないので、次回・それ以降でForm(画面)作成とAccess2007のデータ・内部構造に触れたいと思います。

    続きを読む・・