2011年6月25日土曜日

JFreeChartによるグラフ描画

JFreeChartを使うと、javaで割と簡単にグラフを作成することができる。
グラフの種類も様々で、円グラフや棒グラフ、折れ線グラフなど基本どころはもちろん、3DグラフなどExcelでできることはだいたいできそう(たぶん)。
例えば、DBと接続してればそのデータをすぐに可視化できたりする。

まずは、ここからダウンロードしてjarファイルを読み込みます。
ちなみにJFreeChartのwebページはこちら。このページにもサンプルがあるのでおしゃれです。


今回はサンプルということで書いてみました(なので、DBは使わず)。

まずはデータ準備。本の売り上げを表すグラフをつくろうかなということで、Bookクラスと売り上げを管理するクラスをつくります。


public class Book {
 
 /** 本のタイトル */
 private String title;
 /** 本の売れた総数 */
 private int amount;
 /** 月*/
 private int month;
 
 public Book(String t,int a, int m){
  this.title=t;
  this.amount=a;
  this.month=m;
 }
 
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public int getAmount() {
  return amount;
 }
 public void setAmount(int amount) {
  this.amount = amount;
 }
 public int getMonth() {
  return month;
 }
 public void setMonth(int month) {
  this.month = month;
 }

}

import java.util.ArrayList;
import java.util.List;

public class AmountManager {
 private List list;

 /**
  * 売り上げ情報(1月から4月までとする)をリストにいれる。
  */
 public AmountManager() {
  List books = new ArrayList();
  Book b1 = new Book("もしド○", 30, 1);
  Book b2 = new Book("もしド○", 10, 2);
  Book b3 = new Book("もしド○", 40, 3);
  Book b4 = new Book("もしド○", 100, 4);
  Book b5 = new Book("△△コナン", 60, 1);
  Book b6 = new Book("△△コナン", 90, 2);
  Book b7 = new Book("△△コナン", 10, 3);
  Book b8 = new Book("△△コナン", 40, 4);
  books.add(b1);
  books.add(b2);
  books.add(b3);
  books.add(b4);
  books.add(b5);
  books.add(b6);
  books.add(b7);
  books.add(b8);
  this.list = books;
 } 
 
 /**
  * リストを返す
  */
 public List showAll(){
  return this.list;
 }
}

以下はグラフを書くためのクラスです。ウェブで使えるようにしたのでサーブレットになっています。

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;


public class ChartSample extends HttpServlet{
 @Override
 protected void doGet
  (HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, IOException {

  // グラフ生成用の元データを用意
 //(データベースとかでひろってきた場合もリストでもってくれば良いかと)
  AmountManager amountManager = new AmountManager();
  List list=amountManager.showAll();

     // グラフの基となるデータセットを用意
  DefaultCategoryDataset data=new DefaultCategoryDataset();

     // データセットに項目名と値のを順にセット
  for (Book book : list) {
   //addValueの引き数は「縦軸の値, 項目, 横軸の値」の順番
   //ただし、第2引数と第3引数は文字列なので変換が必要
   String xValue=Integer.toString(book.getMonth());
   data.addValue(book.getAmount(), book.getTitle(), xValue);
  }
  
     //グラフを生成
     //第1引数:グラフのタイトル
     //第2引数:横軸ラベル
     //第3引数:縦軸ラベル
     //第4引数:dataset()でつくったオブジェクト
     //第5引数:値の向き
     //第6引数:凡例を表示かどうか
     //第7引数:オンマウスにした際に情報を表示を作成するか
     //第8引数:URLを作成するかどうか
     JFreeChart objCht=ChartFactory.createLineChart
    ("カテゴリーA内商品別 月次売上","月","万円",
    data, PlotOrientation.VERTICAL,
                true,false,false);

      //バイナリ出力ストリームにJPEG形式で画像を出力600×400ピクセル)
     resp.setContentType("image/jpeg"); 
     ServletOutputStream objSos=resp.getOutputStream();
     ChartUtilities.writeChartAsJPEG(objSos,objCht,600,400);      
 }
}



#なんかソースのところに</book>みたいなのが表示されるの何でしょう。。。そんなの書いてないのに、、、(java書くときは抜いてください)



このサーブレットを実行すると、結果が出ます。




割と簡単だし、サンプルみるといろんなグラフが書けそうです。



2011年6月18日土曜日

プロジェクトマネジメントなメモ

プロジェクトマネージャーとかその辺についてググッてみた。
気になったところを箇条書き。あと考えたこととか。
ちなみに、お客様とのやり取りとかはあまり考えず(考えなきゃいけないんだけど)
どう内部をまとめるかというところに、特に注目。

「んー、まあそうだよな」ってことが多いけど、
食事内容をメモするダイエットのように、ブログに残しておけばなんか自分の中で意識が変わるんじゃないかと期待してやってみる。

■PMは座らず動き続ける

→メンバーに安心感を与える意味を込めて、あたふたする必要はないけれども、逆にどっしり構えすぎているのもどうかと。座ってないで立って動いてメンバーの状況を確認する。以下のことについては常に配慮をすべきとのこと。
  • メンバーのスキル,得意分野,苦手分野
  • メンバーの体調,睡眠状況,持病の有無
  • メンバーのモチベーション
  • メンバー間のコンフリクト発生有無

→たぶん自分の場合、上記4点について気を配ることはできるけど、これらに関する問題に気が付いたところでどう対処していいのか、どう行動すべきなのかというスキルが身に付いてないように思われ。

キックオフから「プロジェクトの目的」と「絶対に成功させる」ことを伝え続け、メンバーに「できる」という意識を植え付ける

→「宜しくお願いしまーす」ではなくて「成功させる」ことを伝えるというのは忘れがちかもしれない。これたぶん今日のベストヒットなメッセージ。
言葉ではそんなようなことを言っていたとしても、こっちが強く意識しなければ伝わらないよなー。




進捗状況の「見える化」

→確かに。PMにとっても大事だけど、メンバーに対しても大事。もちろんお客様にも。些細なことでも見える化して共有しよう。ちなみにポストイットをぺたぺた貼るのが自分の身の回り流行ってるけど、なんかもっといい方法ないかなと思っている。
個人的には、ポストイットぺたぺた壁に貼るのってブレスト向きだと思っていて、多人数でリマインド目的で何かを共有するにはあまり向いていない気が。。。(単なる思い込みかもしれないけど)
紙を大きくすればいいのかもしれないけど、そうするとポストイットみたいな貼りやすく剥がしやすい利便性が消え失せる。自分のリマインド用にPCにポストイット貼るのは良いと思うけど、、、むー。


人の意見をよく聞き、アプローチされやすい雰囲気を作り出す
→本当に大事。自分の場合は、ちょっと違うかもしれないけど、笑いの絶えないチームにしたい!wだからくだらないことでも話しかけてくれるような人になりたい。。。



んーやっぱりちゃんとしたページで記事として書いている人たちの、見出しのネーミングセンスの良さと来たら、もうね。


【参考ウェブページ】

2011年6月10日金曜日

jQueryで遊んだ

jQueryなるもので遊んでみました。


jQueryというのは、簡単にいうとすごく短いコードで色々とエフェクトの効いたスクリプトを記述することができるってかんじです。
下にリンク貼ったページに色々とサンプルがあるので、そんなのに比べると非常に中途半端なものなんですけど汗、自分が気に入ったものを色々と合体させてちょっとつくってみました。

ということで、以上のことを実際に実装したテストページはこちら

【その1】折り畳み式のメニュー的なもの
htmlは以下。<dd>と<dl>を組み合わせた単純なもの。
ちなみにスタイルシートでおしゃれにしてます。

<div>
    <dl id="menu">
        <dt>
            <a href="" id="cat1">
            <font color="white">親カテゴリ1</font> 
            </a>
        </dt>
        <dd>
            <a href="#">サブカテゴリー1</a> 
            <a href="#">サブカテゴリー2</a>
        </dd>
        <dt>
            <a href="" id="cat2">
            <font color="white">親カテゴリ2</font> 
            </a>
        </dt>
        <dd>
            <a href="#">サブカテゴリー1</a>
        </dd>
        <dt>
            <a href="" id="cat3">
            <font color="white">親カテゴリ3</font> 
            </a>
        </dt>
        <dd>
              <a href="#">サブカテゴリー1</a>
              <br>
    <a href="#">サブカテゴリー2</a>
        </dd>
    </dl>
</div>

scriptのほうがちょっとややこしいかもです(たぶんもっといい書き方があるんだろうけど。。。)

<!-- 親カテゴリごとにidを振って動作を独立させる。-->
<!-- slideDownで下に出しslideupでしまう。flagをつくって、-->
<!--下に出ているときにクリックしたらしまう。-->
<!--しまった状態なら下に出す。-->

$(function() {
 var flag=0;
 $('#menu dd').hide();
    $('#cat1').click(function(){    
     if(flag==0){
        $(this).parent().next().slideDown();
        flag=1;
        return false;
     }
        if(flag==1){
        $(this).parent().next().slideUp();
        flag=0;
        return false;
        }
       
    });
    
    var flag2=0;
  $('#menu dd').hide();
     $('#cat2').click(function(){    
      if(flag2==0){
         $(this).parent().next().slideDown();
         flag2=1;
         return false;
      }
         if(flag2==1){
         $(this).parent().next().slideUp();
         flag2=0;
         return false;
         }
        
     });
     
     
     var flag3=0;
   $('#menu dd').hide();
      $('#cat3').click(function(){    
       if(flag3==0){
          $(this).parent().next().slideDown();
          flag3=1;
          return false;
       }
          if(flag3==1){
          $(this).parent().next().slideUp();
          flag3=0;
          return false;
          }
         
      });
});


【その2】文字数カウント
htmlは単純にtextフィールドと文字数をカウントしてくれるものを付け足しました。

<div>
        <table>
            <tr>
                <td>感想を一言</td>
                <td><input type="text" class="focus" 
                value="キーワードを入力" size="50" />
                </td>
                <td></td>
                <td><div id="count">0</div></td>
        </table>
    </div>

scriptのほうは、以下なかんじです。

<!-- val()とはテキストフィールドやドロップダウンメニュー等の
value属性を取得・操作するのに使用-->
<!-- focusとはカーソルが合っているとき。blurは離れているとき。-->
<!-- カーソルが合わせたとき書かれている文字が
「キーワードを入力」なら(つまり初期状態なら)空にする-->
<!-- カーソルが合わせたとき書かれている文字が-->
<!--「空」以外なら初期状態にする-->


$(function(){
    $(".focus").focus(function(){
         if(this.value == "キーワードを入力"){
              $(this).val("").css("color","black");
         }
    });
    $(".focus").blur(function(){
         if(this.value == ""){
              $(this).val("キーワードを入力").css("color","gray");
         }
    });
});

<!-- 字数を数える.30字の上限超えたら赤くする.セーフなら青-->
<!-- val()とはテキストフィールドやドロップダウンメニュー等の-->
value属性を取得・操作するのに使用-->
<!-- ここでは、$(this)、つまり指定したエリアのvalue属性を取得-->
その長さを.lengthで取ってきているということ-->
<!-- そしてその結果をcounterという変数に格納。-->
<!-- その後、countというidが振られた
パラグラフエリア(pタグが振られているところ)に
.textで書き出す-->


$(function () {
    $(".focus").keyup(function(){
         var counter = $(this).val().length;
       $("#count").text(counter);
       if(counter == 0){
           $("#count").text("0");
       }
       if(counter >= 30){
           $("#count").css("color","red");
       } else{$("#count").css("color","blue");}
   });
});


いろいろと参考にさせていただいたのは→少しのコードで実装可能な20のjQuery小技集

2011年6月5日日曜日

MySQLにおけるテーブルの作成と更新

MySQLでテーブルをつくってみる。
今回つくるのは


  • タレント表(タレントのID、タレントの名前、所属事務所のID)
  • 事務所表(事務所のID、事務所の名前)


という感じの表をMySQLでコマンドを打ってやっていきます。
また、ここでは事務所表を親表、タレントを子表として、主キーや外部キーも設定してみます。

create table officeTable
(o_id int AUTO_INCREMENT, o_name VARCHAR(20), 
PRIMARY KEY(o_id),index(o_id)) auto_increment=1000, 
engine=INNODB;


o_idというのが事務所IDで、o_nameが事務所の名前。o_idはこのテーブルにおける主キーで、auto increment、つまり自動でどんどん振られていく番号として設定します。そうすることで、だぶりなく、無駄無くIDが振られるわけです。

insert into officeTable(o_name) values('aaaOffice');
insert into officeTable(o_name) values('bbbOffice');

insert文で、レコードを挿入。この後、いろいろやっていくと以下のようになってくれます。



特にo_idを設定しなくても、1000から順番にIDが振られているのがわかります。



次に、タレント表をつくります。

create table t_meibo
(t_id int auto_increment, t_name varchar(20), o_id int, 
primary key(t_id),index (o_id),foreign key(o_id) 
references officeTable(o_id)) 
AUTO_INCREMENT=1, engine=INNODB;

タレントIDであるt_idを主キーとしています。また、先ほどauto incrementとすることで、1から順番にIDを振っていくこととします。さらに、所属事務所のIDは親表である事務所表の事務所IDと同一のものにしたいので、外部キーとして設定します。

では、レコードを登録していきます。

insert into t_meibo(t_name,o_id) values('takahashi',1000);
insert into t_meibo(t_name,o_id) values('tanaka',1000)


無事、登録されました。
ここで、事務所IDとして存在し得ないものを書くと、エラーが起きます。



insert into t_meibo(t_name,o_id) values('takahashi',999);

次回まっではもっとレコードを増やして、テーブル同士の結合などなどに挑戦していきたいと思います。

2011年6月4日土曜日

VBAにおける分岐とループ

分岐とループをテーマに、お年玉プログラムを作成。


からの〜



仕様は以下な感じ。

  • 名前をユーザーに入力させる。
  • 次に年齢を入力させる。
  • お年玉の金額が表示される。
  • 入力がなかった場合は無限に質問を繰り返す。
  • 一行ずつの処理



つかった構文などの紹介はプログラム内にコメントとして書きました。


 Sub Otoshidama()

 'とりあえずA2からスタート。
 '指定したセルに飛ぶには[指定したいセル].Select
 [A2].Select
    
    '現在のセルが空セルになるまでループを回す
    'if を始めたら必ず最後はend ifでif文を閉じる
    Do Until ActiveCell.Value = ""
         If (ActiveCell.Value <> "") Then
             ActiveCell.Offset(1, 0).Select
         End If
    Loop
    
    '----名前入力部分------
    
    '変数定義
    Dim name As String
    
    '値が入力されるまで質問を続ける
    '<>は「〜ではない」、""は空文字を示す。
    Do Until ActiveCell.Value <> ""
    
        'ユーザーに入力させるウィンドウはInputBox
        name = InputBox("お名前は?", "質問その1", "")
         If (name <> "") Then
             ActiveCell.Value = name
         End If
    Loop
    
    
    '----年齢入力部分------
    
    '移動して年齢入力にうつる
    ActiveCell.Offset(0, 1).Select
    
    '変数定義
    Dim ageString As String
    Dim age As Integer
    
    '値が入力されるまで質問を続ける
    Do Until ageString <> ""
        ageString = InputBox("年齢は?", "質問その2", "")
    Loop
    
    '文字列を整数型に変換し、0以上ならセルに入力させる
     age = CInt(ageString)
     If (age >= 0) Then
        ActiveCell.Value = age
    End If
    
    
    '----お年玉金額判定&入力部分------
    
    '移動して年齢入力にうつる
    ActiveCell.Offset(0, 1).Select
    
    If (age < 5) Then
         ActiveCell.Value = 500
    ElseIf (age < 10) Then
        ActiveCell.Value = 1000
    ElseIf (age < 15) Then
         ActiveCell.Value = 5000
    Else
        ActiveCell.Value = "自分で働け"
        
    End If
    
 End Sub


ちなみに、ifの中の条件はカッコでくくってても、カッコが無くてもあっても大丈夫みたいです。
VBAでメソッド分け的なことはどうするんでしょ。。。読みにくくて仕方ない(長いから)。

勉強します。

Mac OS XにPostgreSQLをインストール

今度はPostgreSQLをインストールしてみた。

とりあえず、dmgファイルを、Webからダウンロードするところから始めました。
Download PostgreSQL

そして実行すると以下のようなウィンドウが出てくるので、その中にあるインストーラ的なものをダブルクリック。


パスワードなどを入れて、「いざインストール!」と思いきや、
「Your system seems to be configured with less than 32MB of shared memory ...」的なエラーメッセージが出てきてしまいました。
つまり、共有メモリが足りないらしい。さらに、「READ MEファイルを読みなさい」と書いてあったので、読んでみると、その設定方法っぽいものが書いてあるので、言われた通りにしてみます。

 $ sudo vi /etc/sysctl.conf                                                                      

コマンドを入れると、以下のようなものができます。
(sudoというのは、すべてのファイルに無制限で入れるroot権限でプログラムを実行できるコマンド。viというのは、編集できるテキストエディター的なものらしい。参考ページには、「使いこなすにはすごく苦労するテキストエディターです」と書いてありました。
つまり、/etc/sysctl.confというファイルをroot権限で編集するというコマンドなわけでした)



そして、「esc」を押し、「:wq」を入力してenterを押して、内容保存。
ここでreboot、つまりOS自体を再起動しなければならないので、再起動。
そこからもう一度、インストーラーを開くと、ウィザードが立ち上がりました。

あとは以下のページを参考にするとできます。

参考にしたのは、このページ→Mac OS X で PostgreSQL を使ってみよう

インストールが完了すると、同時に「スタックビルダー」のウィザードが立ち上がりました。これはここで設定しなくても、のちのちできるので別によいのですが、JDBCも使いたかったので、一緒にインストールをしてしまいました。

完成したあとのアプリケーションフォルダはこんなかんじです。



とりあえず試しに起動だけしみます。
一番下にある、「SQL Shell (psql)」を起動します。そうすると、PostgreSQLが起動し(見た目はターミナルですが)、「データベースどうするか」「localhostでいいのか」などなど聞かれるので、特に設定が無い限りはenterを押し続けます。

終了するときは、¥qで終了です。


ひとまず、無事にインストールもできたようなので、今後いじっていこうと思います。


参考ウェブページ:

2011年6月1日水曜日

MySQLでwikipediaデータを遊んでみる~part2

前回のエントリーに引き継き、sqlコマンドをひたすら叩く。

(再び)テーブル要素について整理しますと、

  • cl_to→カテゴリー名
  • cl_sortkey→記事名(厳密にはソートするためにある列だが、英語なので、そのまま記事名となる。例えばこれが日本語だと、「日本語」という記事に対して「にほんご」と振ってある(らしい))
  • cat_page→そのカテゴリに属する記事ページの数


という感じです。

では本題です。

今回は以下の関数を主に扱いました。

<グループ関数>

  • ave(平均を求める)
  • max(最大値を求める)
  • sum(合計を求める)
  • count(行数をカウント)
  • group by(グループ化)
  • having




【各カテゴリーに属してるページ数の各種データを表示】
select AVG(`cat_pages`), MAX(`cat_pages`), sum(`cat_pages`) , 
COUNT(`cat_pages`) from `category`;

他にも、min(最小値を求める)もあります。





【タイプごとのページ数(のべ)を出す】
select `cl_type` , count(*) from categorylinks group by `cl_type`


groupe byは複数の列でグループ化、ここではタイプごとにグループ化しています。




【記事ごとにカテゴリー数を表示する(10以上のカテゴリーに属するもののみ)】
select `cl_sortkey` ArticleName, count(*) CategoryCount 
from categorylinks 
group by `cl_sortkey` having count(*) > 10



havingは中に集合関数を入れたいときにwhere句の代わりに使用します。



結合や副問い合わせについては、別途テーブルを用意したほうがいいなーと感じたので、また後日。