2011年11月12日土曜日

11g SQL基礎Ⅰ 受験メモ

というわけで、今日は11g SQL基礎Ⅰを受けてきました。


Oracle Master Bronze ( Oracle Database 11g)を取得するためには
  • 11g SQL基礎Ⅰ
  • Bronze DBA 11g
の両方に合格せねばならず、Bronze取りたかったので今回はSQL基礎。どんなかんじで勉強してきたのかをメモ程度に残します。

<勉強期間>
実質1ヶ月くらい。
→電車の中とか、家に帰ってきてからとか。休みの日とかも。

<勉強法>
SQLの参考書を読みながら、問題を解く。シンプルです。使ったのはこれです。
1周といて、間違えたものをもう一回。

徹底攻略ORACLE MASTER Bronze 11gSQL 基礎I問題集[1Z0-051J]対応 (ITプロ/ITエンジニアのための徹底攻略) [単行本]


あとOracleではないですけど、OSSのDBに触れる機会があったのでそこでSQLを書いたりしてたのも、結構役立ちました。
SQLの構文とかは、やはり単なる暗記では飲み込みが悪いと思います。自分で打って、エラーを返されることで(笑)、身に付きます。
ただ、ルール的なものは座学で頑張りました。例えば、「SQL関数のネストはどのくらいのレベルまでいけるか」とか「V$ビューとはなんぞや」とか。
それで試験前日に模擬試験を解いてみる。合格ラインは60%で、結果は70%くらい。


<試験>
はじまって10秒で「ん?」ってなりました。
。。。模擬試験と違うぞと。
まず問題に出てくるSQLが長い。
要は、問題集でやってきたような1問1問が複合されて出てくるので問題集より難しく見えたというかんじでした。
とりあえずポチポチ押して回答をすすめて、最後10分を残して一通り終了。見直しは結局7問くらいしか終わらず、試験終了。


結果は合格。合格ライン60%の、正答率60%。ぎりっぎりでした。


<振り返り>
問題集はたぶんどれを使っても同じだと思います。どれも「これじゃ足りません」っていうレビューが1つくらいはついてるし(笑)
そういう前提で勉強すると良いかなと思いますー。

2011年9月8日木曜日

JBoss+PostgreSQLでコネクションプーリング

JBossとPostgreSQLでコネクションプーリングしてみました。
Javaです。

まずは、JBossのほうに設定。deployディレクトリに設定ファイルであるpostgres-ds.xmlを入れます。
このdsファイルは、docファイルに各種データベース用のサンプルがあるので、例えばMySQLとつなぎたいとかOracleとつなぎたいという場合でも簡単にできます。

postgres-ds.xml

<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://localhost:5454/test</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>postgres</user-name>
    <password>postgres</password>
    <metadata>
         <type-mapping>PostgreSQL 7.2</type-mapping>
      </metadata>
  </local-tx-datasource>
</datasources>


ではではJavaで実装。
ちょっとクラス分けしてみました。
まずはコネクションを取得するためのクラス。

ConnectionManager.java

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionManager {
 /**
  * コネクションを取得するメソッド
  * @return Connection
  * @throws SQLException
  * @throws NamingException
  */
 public Connection getConnection() throws SQLException, NamingException {
  InitialContext icx = new InitialContext();
  //postgres-ds.xmlに書いたJNDI名を書く。
  //JBossを起動したときにコンソールに表示されるので、それを書くと尚確実。
  DataSource ds = (DataSource) icx.lookup("java:PostgresDS");
  Connection conn = ds.getConnection();
  return conn;
 }

}


こちらはちゃんと実行できるかどうかのテスト用Servlet。

ConnectionGetSample.java

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ConnectionGetSample extends HttpServlet {

 private static final long serialVersionUID = 1L;

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  // 準備
  ConnectionManager cm = new ConnectionManager();
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;

  // SQL文(ここではテストでpostgresユーザーを出すSQLにしてみる)
  String sql = "select * from pg_user";

  try {
   // コネクション取得。
   // ConnectionManagerクラスでthrowしてるExceptionを
   // こっちでcatchする。
   conn = cm.getConnection();

   // SQL実行
   ps = conn.prepareStatement(sql);
   rs = ps.executeQuery();

   // 結果取得→出力
   while (rs.next()) {
    System.out.println(rs.getString(1));
   }

  } catch (SQLException e) {
   e.printStackTrace();
  } catch (NamingException e) {
   e.printStackTrace();
  } finally {
   // クローズ処理
   if (rs != null) {
    try {
     rs.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   if (ps != null) {
    try {
     ps.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   if (conn != null) {
    try {
     conn.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
  }

 }

}




で、できました。

2011年8月20日土曜日

PostgreSQLでポート番号変更

PostgreSQLを起動しようとして、以下なメッセージが出た場合、ポート番号がかぶってます。


$ pg_ctl start
server starting

$ LOG:  could not bind IPv6 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? 
If not, wait a few seconds and retry.
LOG:  could not bind IPv6 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? 
If not, wait a few seconds and retry.
LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432?
 If not, wait a few seconds and retry.
WARNING:  could not create listen socket for "localhost"
FATAL:  could not create any TCP/IP sockets

何回も言われてるますが、5432が使われてるとか。
PostgreSQLはデフォルトではポート番号5432を使うようになってます。かぶってたら違う番号を使うように設定します。

設定はだいたいpostgresql.confというファイルで行います。
最初、portが指定されているところは#でコメントアウトされてますので、#を外して5432以外の番号を指定してあげるだけでOKです。
ここでは5433にしてみました。


$ cd /Library/PostgreSQL/9.0/data //ディレクトリ移動
$ vi postgresql.conf //以下のように編集




では、起動やってみます。

$ pg_ctl start
server starting


できたー!

PostgreSQLのセットアップその2

先の記事で、軽くいい加減なPostgreSQLのインストールを紹介したので、もうちょっと色々設定してみます。

「ターミナルからサーバー起動&停止ができるようにする」ってことしました。

*ここではHogeユーザーがPostgreSQLの実行ユーザーとしてます。セキュリティの観点からroot権限のユーザーだとPostgreSQlは実行できないようになってるのでお気をつけ。

(1)パスを設定する
環境設定ファイルの.bash_profileファイルを開きます。

//ファイルのあるディレクトリに移動
$ cd ~

//ファイルあるか確認
$ ls -a

.
..
.DS_Store
.RData
~~中略~~
.bash_history
.bash_profile
.bashrc

//ファイルを編集
$ vi .bash_profile

//以下の行を追加して上書き
export PATH=$PATH:/Library/PostgreSQL/9.0/bin
export PG_HOME=/Library/PostgreSQL/9.0
export PGDATA=$PG_HOME/data
export PG_LIB=$PG_HOME/lib

//ファイルを再読み込みして設定を反映させる
$ source .bash_profile


PATHにサーバー起動コマンドが入っているディレクトリ(ここでは/Library/PostgreSQL/9.0/bin)を追加することで、どこからでも起動や停止ができるようしています。

また、サーバーを起動する場合には、データベースに格納するデータなどをどのディレクトリに保存するかを設定してあげる必要があります。
それがPGDATAの環境変数で指定してあげた場所です。もちろんこれも任意の場所です。



(2)PostgreSQLのディレクトリの所有者をHogeさんにしてあげる。
コマンドを実行するためには、そのコマンドが入ったディレクトリをPostgreSQLの管理ユーザーの所有物にしなければ!というわけで、しました(これしないと、Permission deniedとかいって怒られます)
この作業はroot権限のユーザーではないとできないので、一度rootになってから、コマンド実行します。


//rootになる。パスワードを求められるので入力。
$ sudo su - 

//PostgreSQLがはいったディレクトリをHogeさんの所有物にする。
# chown -R Hoge /Library/PostgreSQL/9.0 

# ls -l //確認
total 16
-rw-------   1 Hoge  daemon   230 Aug 20 01:15 .bash_history
drwx------   3 Hoge  daemon   102 Aug 20 01:09 Library
drwxr-xr-x  32 Hoge  daemon  1088 Jun  4 19:08 bin
drwxr-xr-x   7 Hoge  daemon   238 Jun  4 19:07 doc
drwxr-xr-x  29 Hoge  daemon   986 Jun  4 19:08 include
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:07 installer
drwxr-xr-x  32 Hoge  daemon  1088 Jun  4 19:08 lib
drwx------  19 Hoge  daemon   646 Aug 20 01:10 olddata
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:07 pgAdmin3.app
-rwxr-xr-x   1 Hoge  daemon   373 Jun  4 19:09 pg_env.sh
drwxr-xr-x  14 Hoge  daemon   476 Jun  4 19:09 scripts
drwxr-xr-x   5 Hoge  daemon   170 Jun  4 19:07 share
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:07 stackbuilder.app
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:09 uninstall-postgresql.app

# exit //元にもどる
logout


厳密にやるなら、パーミッションを700(所有者以外には一切触らせない)とかにすべきなのかもですがローカルで使うだけなので特に設定はしませんでした。


(3)PGDATAフォルダ作成
もともとインストーラーでインストールする時点でこのフォルダは設定してあるのですが、改めて作成します。
私の場合は、現在あるdataフォルダのバックアップをとってから削除をしました。その後、「文字コードUTF8で日本語対応」なデータベースがつくれるような設定をdataフォルダにしてあげました。


//ディレクトリをコピー
$ cp -R /Library/PostgreSQL/9.0/data/ /Library/PostgreSQL/9.0/cdata/ 

//削除
$rm -rf /Library/PostgreSQL/9.0/data/  

$ ls //確認
Library				pgAdmin3.app
bin				pg_env.sh
doc				scripts
include				share
installer			stackbuilder.app
lib				uninstall-postgresql.app
cdata


//initdbというコマンドで、dataディレクトリを作成。
//いろいろ出てくるけど、最後にSuccessって出てくればOK

$ initdb -E UTF8 --no-locale 

creating directory /Library/PostgreSQL/9.0/data ... ok
creating subdirectories ... ok

~中略~
Success. You can now start the database server using:

postgres -D /Library/PostgreSQL/9.0/data
or
pg_ctl -D /Library/PostgreSQL/9.0/data -l logfile start


以上で設定完了です。では、やってみます。

■サーバーの稼働状態を確認します(pg_ctl status)

$ pg_ctl status
pg_ctl: no server running

■サーバー起動(pg_ctl start)

$ pg_ctl start
server starting

■サーバー停止

$ pg_ctl stop
waiting for server to shut down....
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
done
server stopped

できたー!






2011年7月31日日曜日

crontabメモ

crontabの使い方メモ。

■crontabとは?

設定した時間になったら、設定したコマンドを実行する子です。

■crontabの設定例

crontabに-eオプションをつけることで、設定ができます。
実行すると、画面が切り替わります。初めて設定する場合は白紙?な画面。
以降は、viエディタなかんじで記述します。
設定項目は左から「分」「時」「日」「月」「曜日」「実行コマンド」で書く。


$crontab -e

//(例1)毎時10分になると「hello」と出力。
10 * * * * echo "hello"

//(例2)毎日12時になると「iitomo」と出力
00 12 * * *  echo "hello"

//(例3)2分おきにdateコマンドを実行して、ログファイルに出力
*/2 * * * * date >> /Users/dateLog.log


■crontabの確認


crontab に -lオプションをつける。

$ crontab -l
*/2 * * * * date >> /Users/dateLog.log

//実行確認
$ ls
dateLog.log

$ view dateLog.log
Sun Jul 31 15:14:01 JST 2011
~
~
~
~
~
~
~
~
~
~                                                     
"dateLog.log" [readonly] 1L, 29C

■実行するユーザーを限定したいとき

-u オプションをつけてユーザーを限定します。

//user1さんの設定するcrontabを表示する
$crontab -u user1 -l


以上!

2011年7月30日土曜日

Redmineを試してみた。

今回はRedmineというOSSの紹介してみようかと思います。


Redmineというのは、プロジェクト管理のソフトウェアでウェブブラウザを介して使われるものなのですが、OSSなので自由に誰でも使えます。
(ベースはruby on railsらしい)

とりあえず試しにインストールしてみました。

ここ(http://redmine.jp/download/)からダウンロードして、All in oneインストーラを使っていれてみました。オフィシャルじゃないのですが、ちょろっと試してみる分には、こっちでいいかなと思ってこっちにしました。

Macに入れたので、Macを選んで、zipを落として解凍してウィザードたちあげーの、インストール!

とりあえず試しに「飲み会プロジェクト」を立ち上げてみました。



で、一人でやるわけものでもないので、メンバーも追加できたりします。このメンバーにつける権限によって、プロジェクトそのものを管理できる人にしたり、報告だけさせる人にしたりなどいろいろできます。



またまたプロジェクト管理に必要な、wikiだったり共有すべき情報を発進するニュース掲示場所だったり、プロジェクトの進捗管理ができるガントチャートが作成できるようになります。

Redmineでは「チケット」と呼ばれるものがあって、これが要はたぶん「タスク」ってことになってると思います。これを追加/更新していくと、ガントチャートに反映されるようになってます。




















ガントチャートも、スケジュール予定と現在の進捗割合、そして今日の日付が赤いラインで表現されるので、現在の進捗割合がスケジュール予定と比較してどうなのかが一目で分かります。







こういうのを、(すごい地味だけど)エクセルで管理することもできますが、まあなんか自動化してくれるほうが楽だし嬉しいですねー。

10分くらいしかいじってないですが、まあなんか使いやすそうなので試してみると良いんじゃないかなーと思いました!

*チュートリアル?みたいなのがあって、見るだけでもなんとなく雰囲気がわかるのですが、実際自分で触ると結構楽しいので、おすすめ。

2011年7月23日土曜日

【振り返り】プロジェクトマネージメント的な。


前にプロジェクトマネジメントなメモとかいって、投稿したのですが
それについての振り返りをしようかと。

特に「進捗状況の「見える化」」について。

結論としては

・ちょっと工夫した進捗報告の方法が案外良かった!
・自分ができてるとおもっても、できてないってことを実感した

っていう2点です。




では長々と書いてみます。

今回いろいろ縁あって?プロジェクトマネージャーという役割をいただいて、約2週間程行動していたわけですが、まあいろいろありました。
難しいなと感じることがたくさんあって、メンバーに迷惑をかけたなと思うことが今でもたくさんあって。それでも最終日に「お世話になりました」とか丁寧に声をかけてくださったりするメンバーもいて。

そんな中で、進捗をどう周知させるか、っていうのが私の中の一つの課題でした。

私が進捗を把握するのは、ぶっちゃけ簡単で、「どうなってますか?」と聞けばいいのだけど、メンバーが他のメンバーの進捗を知ったり全体の進捗を知るのは難しそうだったので(それぞれやることがおおくて、それで精一杯的な)、
1~2時間に1回のペースでチーム内の進捗報告会を行うことにしてました。そうすることで、私も進捗を把握できるし、メンバー同士も進捗を把握できると思ったから。



そう思ったんですけど、実際はできてませんでした。



あるチームメンバーから「もっと全体の状況を把握したい」と言われて、「え、チーム内進捗会してんじゃん」と思ったんですが、、、

要は、自分の進捗をどうまとめるか、どう表現するかに夢中で、他のメンバーの進捗報告に耳を傾ける余裕はあまりなかったようです。。。

原因としては2点かなと。

(1)余裕をなくしてしまうほどのスケジュールの詰めっぷり(原因は私の時間管理ミス)

(2)「このチーム進捗会は、チームとして全員で進捗を把握するもの」というのを明確に示していなかった(たぶんメンバーは、私のための時間だと思っていたと思われる)

もちろん、「メンバーに聞く気がないのがそもそも!」っていう意見もあるかもしれないけど、たぶんそんなもんだと思う。
中学/高校のときのホームルームの日直の話なんて、誰も聞かないのと一緒でw

そして、どうしたらいいかなーとかんがえて、上の人とも相談した結果

「メンバーの進捗報告を他のメンバーにさせる」ってことをしてみました。

つまり、普通はAさんの報告はAさん自身がするんだけど、そうではなくて、Aさんの報告はBさん、Bさんの進捗はAさんが報告する。というかんじにしました。

そうすると

・他人の進捗をまず「理解」するところから始まるので、その人の進捗は嫌でも把握することになる。
・他人の進捗をしどろもどろながら代わりに報告してるとなぜか「聞いてあげよう」的な空気が生まれるw
・よくわからないけど、盛り上がる

ってことになって、結構いいかんじになりました。

ーーーーー
何かしなければならないことがあって、それに対しての対策を何かしらしたとします。
それだけで「よし、できてる」と思うのは、かなりおバカさんでした。

もっとちゃんと、ある意味「疑いの目」を持って、状況をじっくりと観察して、目標を達成できているかどうかを判断することが重要だな思った訳です。

ーーーーー

#なにこれ、日記?w