A Day In The Boy's Life -91ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

jQuery Autocomplete Mod はjQueryベースのプラグインで、テキストボックスに入力した情報を元に、Googleサジェストのような機能を簡単に実現することができます。

Ajaxを使って外部プログラムと通信しながら情報を取得し、候補をユーザーに表示することができるほか、予めJavaScript内に定義していた情報から入力された情報を補完するというような使い方もできます。



jQuery Autocomplete Modの設置方法


設置方法は、jQuery Autocomplete Mod のサイトから、下記3つのファイルをダウンロードします。


jquery.autocomplete.js


本体となるJavaScript


jquery.autocomplete.css


検索結果のフォームを表示するためのCSS


indicator.gif


サイト上ではリンクが掲載されていないのですが、検索候補のローディング時に表示する画像。(なくても支障はありません)


これら、3つのファイルをダウンロードし、設置したいサーバー上にアップロードします。

設置場所は、任意でかまいませんがローディング用の画像は、CSS内にパスが書かれているので(デフォルトはCSSと同じディレクトリ)、変更したい場合は修正しておきます。


準備が整ったら、jQuery Autocomplete Modを組み込みたいHTMLを作ります。

今回は、単純に検索ボックスとボタンを用意したシンプルなものです。


<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
<script type="text/javascript" src="./jquery.js"></script>
<script type="text/javascript" src="./jquery.autocomplete.js"></script>
<link rel="stylesheet" type="text/css" href="./jquery.autocomplete.css">
<script type="text/javascript">
$(document).ready(function(){
    $('#search_box').autocomplete('autocomplete.php');
});
</script>
</head>
<body>
<input type="text" name="search" id="search_box" />
<input type="button" value="search" />
</body>
</html>


まず、jQuery本体とjQuery Autocomplete ModのJavaScriptとCSSファイルを読み込むようにします。

次に、jQueryを使用する際に書くお決まりの決まり文句($(document).ready)の中で、使いたい検索ボックスのIDを指定してメソッドを呼び出します。
引数に指定しているのは、Ajaxで通信する先のプログラム名で、今回はautocomplete.phpを呼び出しています。


PHPのプログラム側はどういうものかというと、


<?php

$prefectures = array("あいち",
                     "あおもり",
                     "あきた",
                     "おおさか",
                     "おかやま",
                     "おきなわ");

if (!empty($_GET['q'])) {

    $parameter = explode(" ", mb_convert_encoding($_GET['q'], "EUC-JP", "UTF-8"));

// スペース区切りで検索された場合は、最後のキーワードを検索対象にする
    $search_word = array_pop($parameter);

    $reply = NULL;

    if (!empty($search_word)) {
        foreach ($prefectures as $word) {
// 検索キーワードが含まれている情報を取り出し
            $find = stristr($word, $search_word);
            if ($find !== FALSE) {
                $reply = $reply . $find . "\n";
            }
        }

// ヒットするのものがあればUTF-8に変換して出力する
        if ($reply !== NULL) {
            $result = mb_convert_encoding($reply, "UTF-8", "EUC-JP");
            echo $result;
        }
    }
}

今回は、PHPプログラムだけで検索フォームから受信したキーワード(都道府県)に対する候補を返す仕様にしています。

実際は、DBなどから引っ張ってきて返すプログラムを書いておけばよいと思います。


jQuery Autocomplete Modは、qというパラメータで情報を送信するので、$_GET['q']でキーワードを受け取り、その言葉を含む情報をechoで出力するようにしています。

複数ある場合は、改行キーを入れて出力すれば複数候補を検索フォーム上に表示することができます。

(文字コードをUTF-8で返す必要があります)

繰り返しになりますが、stristr 関数を使って検索しているだけなので、正確な情報を返す仕様のプログラムではありません。


- 検索結果の例
A Day In The Boy&#39;s Life-jQueryAutocompleteMod-1



jQuery Autocomplete Modをカスタマイズする


このまま利用していても良いのですが、幾つか使いにくい点があるので、jquery.autocomplete.jsをカスタマイズをして見ます。


・ キーワードの候補を表示する際に、最低入力する文字数を変更したい


デフォルトだと、1文字入力しただけでキーワード候補を表示する仕様になっています。

あまりに頻繁に通信されるとパフォーマンス上よくない、ということであれば最低何文字入力したら候補を表示するかを変更することができます。


$('#search_box').autocomplete('autocomplete.php', {
    minChars: 2
});


メソッドを呼び出す際に、上記のようにプロパティを指定します。

上記の場合は、2文字以上入力しないとキーワード候補が表示されなくなります。


・ Ajaxで通信する際にキーワード以外のパラメータを渡したい


デフォルトだと、キーワードをqというパラメータで指定したプログラムへ送信します。

これ以外に送信したいパラメータがある場合は、下記のように指定します。


$('#search_box').autocomplete('autocomplete.php', {
    extraParams: { foo: 'bar' }
});


上記の場合は、fooというパラメータ名でbarというデータをキーワード情報と一緒にautocomplete.phpへ渡してくれます。


・ 検索候補の中から選択しても、繰り返し検索できるようにする


デフォルトだと、一度検索候補の中からキーワードを選択してしまうと、取り消して再度別のキーワード候補を表示するということができません。

それを可能にするには、jquery.autocomplete.js内の下記の箇所を変更します。


options.cacheLength = options.cacheLength || 0;


上記のプロパティは、検索フォームの中で指定できるのですが、なぜか反映されないので、直接JavaScript本体を修正するようにしています。


・ キーワード候補を確定させたときに、検索ボックスからフォーカスが外れないようにする


表示されるキーワード候補の中から選択すると、検索ボックスからフォーカスが外れる仕様になっています。

これだと、続けて検索する(後述)のようなことも難しいので、そのまま検索ボックス内にフォーカスしたままになるように変更します。


87         case 13: // return
88             if( selectCurrent() ){
89                 // make sure to blur off the current field
90 //              $input.get(0).blur();

313         ).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this); $input.get(0).focus(); });


本体のJavaScriptコードの90行目辺りに書かれているblur()をコメントアウトし、313行目辺りに書かれているロジックにforcus()を追加しています。


・ 複数のキーワードを並べても候補を表示できるようにする


Googleで検索するときのようにスペース区切りで複数のキーワードを並べても候補の表示と選択ができるようにしてみます。
先ほど書いた、通信先のautocomplete.phpでは、スペース区切りだった場合、分割して最後のキーワードに該当する候補を返す仕様にしています。


一方、jQuery Autocomplete Mod本体では、選択したキーワード候補を確定すると、検索ボックスにそのキーワードのみしか表示してくれません。

スペースで区切った場合、前回のキーワードを残しつつ、新たに入力したキーワードで検索して候補を表示するようにしてみます。


178         prev = v;
179
180         var set_data = '';
181         var prev_box_data = $input.val().split(' ');
182         var word_cnt = prev_box_data.length;
183         if (word_cnt > 1) {
184             for (i = 0; i < word_cnt; i++) {
185                 if (i == 0) {
186                     set_data = prev_box_data[i];
187                 } else if (i == (word_cnt - 1)) {
188                     set_data += ' ' + prev;
189                 } else {
190                     set_data += ' ' + prev_box_data[i];
191                 }
192             }
193         } else {
194             set_data = v;
195         }
196
197         $results.html("");
198         $input.val(set_data);


178行目辺りを上記のようなロジックに変更します。

やってることは、検索ボックスに入力された情報($input.val)をスペースで分割し、それまで入力されていた情報と今回新たに候補から選択された情報を合わせて、再び検索ボックスにセットするということをしています。


- 検索例
A Day In The Boy&#39;s Life-jQueryAutocompleteMod-2


若干、Googleサジェストとは挙動が違うのですが、スペースを入れた場合、そこから新しく別のキーワードで候補を表示しています。

本当に、Googleサジェストのようにしたければ、候補を検索して返すautocomplete.php側で、渡された情報を全て結合して返すような仕様にすればよいと思います。


検索ボックスも、こういう風な実装をしておけば、ユーザーも便利に使えるかもしれませんね。





HTMLのある要素の上にマウスカーソルを乗せると画像が表示され、カーソルを外すと画像が消えたりするデザインのサイトをよく見かけたりしますが、どう実装するんだろうってことで調べてみました。


ようは、こんな感じ。


- DIV要素にマウスカーソルを乗せてみる

A Day In The Boy&#39;s Life-hover-1


- DIV要素からマウスカーソルを外す(下のDIV要素にカーソルを合わせる)
A Day In The Boy&#39;s Life-hover-2


2番目のDIV要素にマウスを合わせると虫眼鏡のアイコンが表示され、マウスを3番目のDIV要素に合わせると先ほど表示したアイコンが消え、マウスを合わせた3番目のDIV要素内に表示されます。



jQuery+CSSによる画像の表示・非表示の実装


作成したHTMLはこんな感じ。


<html>
<head>
<meta content="ja" http-equiv="content-language"/>
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/>
<script type="text/javascript" src="./jquery.js"></script>
<script>
$(document).ready(function(){
    com = $("div.comment");
    for (i = 0; i < com.length; i++) {
        com.eq(i).hover(function(){
            $("img.search_btn", this).css("visibility", "visible");
        },function(){
            $("img.search_btn", this).css("visibility", "hidden");
        })
    }
})
</script>
<style type="text/css">
<!--
div.comment { width:400px; height:25px; text-align:right; background-color: #CECECE; }
img.search_btn { visibility:hidden; }
-->
</style>
</head>
<body>
<br />
<br />
<div class="comment"><img class="search_btn" src="./search_button.gif" /></div>
<br />
<div class="comment"><img class="search_btn" src="./search_button.gif" /></div>
<br />
<div class="comment"><img class="search_btn" src="./search_button.gif" /></div>
</body>
</html>


まず、DIV要素内に画像タグを埋め込んでおき、それをCSSで非表示(visibility:hidden)にしておきます。

次に、jQueryのロジック部分で


    com = $("div.comment");
    for (i = 0; i < com.length; i++) {
        com.eq(i).hover(function(){
            $("img.search_btn", this).css("visibility", "visible");
        },function(){
            $("img.search_btn", this).css("visibility", "hidden");
        })
    }


というところでDIV要素のオブジェクトを取得し、その数だけhover(マウスオーバー、マウスアウト時の挙動)を設定します。

画像の表示、非表示は同じくCSSの情報をセットすることでコントロールしています。

(visibility:visibleで画像を表示)

hover内の最初のfunction()で定義するのがマウスオーバー時の挙動、次のfunction()で定義するのがマウスアウト時の挙動です。



jQueryのDOM操作による画像の表示・非表示の実装


以下、余談にはなりますがDOMを追加・削除することでも画像の表示、非表示を実現することは可能です。

こちらは、まったくCSSに頼らないやり方になります。


まず最初に、DIV要素内に埋め込んでいたIMGタグとそのCSS部分を削除しておきます。


<style type="text/css">
<!--
div.comment { width:400px; height:25px; text-align:right; background-color: #CECECE; }
-->
</style>
</head>
<body>
<br />
<br />
<div class="comment">&nbsp;</div>
<br />
<div class="comment">&nbsp;</div>
<br />
<div class="comment">&nbsp;</div>
</body>


次に、jQueryのロジック部分を下記のように編集。


$(document).ready(function(){
    com = $("div.comment");
    for (i = 0; i < com.length; i++) {
        com.eq(i).hover(function(){
            $(this).append("<img class='search_btn' src='./search_button.gif' />");
        },function(){
            $("img", this).remove();
        })
    }
})


実装方法にあまり変わりはないのですが、マウスオーバー時にIMGタグを追加し、マウスアウト時にIMGタグを削除するというやり方になります。

ただ、マウスオーバー・マウスアウトごとに要素の追加・削除が行われるのでパフォーマンス的には先ほど紹介したCSSによる実装よりは劣ります。

何らかの理由でその要素のCSSの変更ができないって場合は、こちらの方法でいけるかもしれません。





平成21年度春季:情報処理技術者試験[プロジェクトマネージャ]を受けてきた 」の続き。


昨年、見事すっころんだプロジェクトマネージャの試験ですが、3度目の正直でなんとか合格できました。

答えあわせすらしてなかったので、あまり期待していない状況の中、IPAから合格通知が届いてかなりびっくりって感じでしたが。

ということで、今回合格できた2010年春季の情報処理技術者試験、プロジェクトマネージャ編の対策のまとめを書いておきます。

来年受講される方のお役に立てれば幸いです。



午前一、午前二試験の対策ポイント


午前一試験が50分で30問、午後二試験が40分で25問という形式で出題されます。(合格基準は全体の60%を正解していること)

この対策としては、基本的に過去問題をひたすらやる感じで何とかなると思います。

ただ、この春に受けた試験では(午前二しか受講しなかったのでなんともいえないところもありますが)、過去問題以外のものが結構な割合で出ていました。(私の勉強不足だったのかもしれませんが)

まったく異なる分野から出題されるということはあまりないので、基本的に過去問題をやりつつその問題を解くにあたっての知識を頭に入れておけば、あまり惑わされずに済むと思います。


あと、もう一つ大きなポイントになりそうなのが、昨年から午前一の試験を合格できれば、次回の試験で午前一の受講をパスできるようになってます。(2年間有効)

なので、(こんなこと言うのもなんなんですが・・・)「今回あんまり勉強しなかったから合格無理」と受講そのものをパスしてしまうより、午前問題だけでもしっかり勉強して受講しておいたほうが、再度受講する際の負担が軽減できてよいかと思います。

私も昨年受講した際に、午前一の合格基準点をクリアできていたため、今回は午前二からスタートするということができました。

これは、当日の受験開始時間を遅くスタートできますし、何より全ての勉強をやり直す必要がなく、勉強そのものの負担を軽減することもできます。


情報処理教科書 [秋期]高度試験午前I・II 2014年版 (EXAMPRESS)/松原 敬二
¥3,002
Amazon.co.jp

午後一試験の対策ポイント


私の中では、一番鬼門となった試験で、前回もここをクリアすることができませんでした。

試験内容は、全4問の中から2問を選択して、それを1時間半で解答することになります。(合格基準は、全体の60%以上を正解していること)


午後一の試験は、プロジェクトマネージャの仕事で担当となる領域 (@ IPAによるプロジェクトマネージャ試験 シラバス)の中から、設問となるプロジェクト計画・実行中における問題や役割、とるべき行動について解答していくという内容になります。

これも、対策としては過去問題を取り扱った参考書に沿って問題を解いていくというのが有効ですが、正直解答方法というのはかなりブレがでてきます。

私も最初は、国語の問題を解いているようなもので、その答えは人それぞれによって考え方がことなるのでは、と戸惑うところも多くありました。


ただ、試験問題の多くは、QCD(品質・コスト・納期)に関する問題が多く出ます

そのポイントを抑えておけば、正解から遠い答えを出す、ということはなくなるのではないかと思います。

あとは、それを繰り返して考え方を定着していけば、正解を導きやすくなっていきます。


- 試験でよく出てくるQCDに関する問題


実環境の早期利用 環境に慣れる(開発やテストの効率化[D])、環境上の不具合を早期に発見でき対策できる(結果として品質が確保できる[Q])
同一仕様での改修 改修箇所を減らして不具合を低減させる[Q]、改修量を減らして工数を削減する[C]
代替案の実施 納期を守る[D]
※ 別業者への対応依頼など
未経験者の要員投入 開発経験不足による生産性の低下[D]、品質の低下[Q]
チェック表の利用用途 客観的、定量的に分析できる[Q]
工期途中での仕様変更 手戻り・見直しの発生[D]
仕様変更による影響 工数の増大[D]、品質の低下[Q]
仕様決定の遅延の影響 工数の遅延[D]
仕様決定遅延への対策 仕様のわかるメンバ(業者)の投入(参画)[Q]、仕様のわかるメンバによるドキュメント整備[Q]
仕様変更への対策 窓口を通した一元管理[C]、開発範囲を絞る[D]、費用と納期の再見積もりを実施[C]
仕様追加によるリリース 現段階でリリースし後で追加開発する[D]、追加機能のリリース時の必要性[D]
仕様の追加対応 契約の範囲外のコスト増大[C]、契約時に対応工数の上限や範囲を設定[D]
※ 契約範囲外の対応依頼など
納期に間に合わない場合の対応 優先順位を決めて段階的に後続の工程開始[D]、後続の工程を含めて平行作業を実施[D]
※ バグ修正して品質が確保されたものから結合テスト開始など
プロジェクト内での交渉 トップマネジメントを含めて組織として対応[D]
リリース時期 リリース納期の前提条件[D]
※ 利用者へ周知済みであること、保守契約切れなど
開発の前提条件 開発範囲と問題発生時の責任・対応範囲[Q]
現時点で対応できないことへの対応 過去の同種システム開発から類推[Q]
要員の再配置 開発を経験したノウハウを持った要員を投入できるため[Q]
新旧システムの平行稼動 両システムの処理結果の突合せ[Q]
後続工程の前倒し 問題が発生しても対応期間に余裕が持てる[D]
後続工程の承認なしでの実施 承認が得られなかった場合に手戻りが発生[D]
請負契約での違反 成果物の随時引き渡し[O]、契約関係の無いメンバーへの指示[O]


多くの問題を解いていく中で、問題・解答のある種パターンのようなものが出てきたりしますので、その対策をしておくことで、試験当日に問題文を読みながら「この文章は問題に出てきそうだからマークしておこう」とか「この設問はこのパターンの解答をすればよい」とか推測しながら解くこともできます。

もちろんこれらの問題だけでなく、選択する問題によっては計算問題なども出てきますので、幅広い分野の過去問題を解いておき、しっかり準備しておく必要はあると思います。


後は、問題文の中で展開されるプロジェクトの背景をきちんと理解できる読解力を鍛えておくことでしょうか。

プロジェクトマネージャ(自分の立場となる人)、勤める会社や上司、受注先の企業とその責任者、協力会社やプロジェクト遂行上のチーム構成、各企業との契約関係や納期などなどその中で展開されるストーリーを紐解き、関係性を理解しておかないといけません。

この辺は、問題文を読みながらその関係性を図示するなど整理方法が有効になってくるかと思います。


情報処理教科書 プロジェクトマネージャ 2014年版 (EXAMPRESS)/翔泳社
¥3,024
Amazon.co.jp

午後二試験の対策ポイント


一番最後に待ち受けるのは、論文です。

こちらは全3問の中から1問を選び2時間で設問に沿って、自分が今まで経験したプロジェクトに関して工夫した点や問題点とその対策について論じていくことになります。

設問のパターンは大体どれも同じで


[設問ア] 自分が携わったプロジェクトの特徴や構成について800字以内で述べる

[設問イ] 問題文に沿って、その理由や問題点、工夫した方法などを800字以上1600字以内で述べる

[設問ウ] 設問イで答えた内容に対し、評価や課題、最終的な結果などを600字以上1200字以内で述べる


というパターンになります。

問題は、午後一と同じプロジェクトマネージャの担当する領域の中から出題され、簡単に「プロジェクトマネジャーの仕事とはこういうものです、こういう問題が発生したときはこういう対応をすべきです」という説明が行われるので、それに沿って上記のような設問に答えていくことになります。


PCで書いていくのであれば、2時間というのはそれなりに余裕のある時間ですが、紙に書いていくとなるとかなり大変でほとんど時間はありません。

何より、文章を構成する上で大きなミスをしてしまった場合は、簡単に修正することもできず致命的となってしまうこともあります。

なので、実際の時間の中で原稿用紙などに書いて感覚をつかんでおいた方が良いと思います。

何よりも、最近は仕事で文字を書くことが少ないので漢字を忘れてたりします・・・。


いきなり紙に書いて練習するのはしんどいので、最初はWordなどで論文を書き上げるというのも良いと思います。

当日、いきなり問題文を読んでそれに関連した自分の担当のプロジェクトを思い出しながら文章を構成していくということをやっていると、全然時間が足りません。
なので、予め過去の問題で論文を書いておき、当日使いまわせる文章を頭の中に入れておくことが重要になってきます。

問われる内容は問題によっては異なってきますが、どの問題でも論文で描く背景のプロジェクトは予め用意しておくことができます

解くに設問アは、プロジェクトの概要を聞かれることがほとんどのため、予め描くプロジェクトを決めておいて臨めば時間短縮にもつながると思います。


午後二の論文も、午後一と同じく参考書を見てもあまりはっきりとした答えが出てくるものでもありません。

また、論文の内容を丸々コピーすることも不可能なので、対策をしていてもはっきりとこれでいけるという確信がもてなかったりもします。


しかし、論文に各内容は午後一の対策で書いたQCDに関して自分のプロジェクトのストリーに当てはめていくのが有効だと思います。

設問にあるように、問題点とその工夫を論ずるところが中心となるので、まずは自分で「あのプロジェクトのことを書こう」と決め、その中で発生した問題や課題を3つほどピックアップし、それらの対策をQCDの観点から解決に導いたストリーを作り上げるというイメージでしょうか。


まずは、自分なりに論文を書いていき、参考書にある論文と読み比べながら、自分の論文の中にない視点というもを肉付けしていくという方法が良いと思います。

それを繰り返し、問題のジャンルを変えて幾つか当日に引き出せる引き出しを作っておくことで、時間が足りないということなく、試験に臨めるようになるのではと思います。


プロジェクトマネージャ合格論文の書き方・事例集 (情報処理技術者試験対策書)/岡山 昌二
¥3,150
Amazon.co.jp

受験勉強のお役に立てれば幸いです。