2012年3月31日土曜日

githubでかっこいいREADMEを書く

githubにアップしたプロジェクトでは、READMEがトップに表示されるようになっており、これがきちんと書かれていると結構目を引く。
ただ、書き方がよくわからない!という場合は他の人をまねすればいい。

適当な、READMEがきちんとしているプロジェクトにアクセスしREADMEをクリックして参照する。ここで「RAW」と書かれているボタンをクリックすると生のファイルが閲覧できるので、どういうふうに書けばどう表示されるのかだいたい分かる。

あとは、このファイルを元に編集していけば良い。すばらしい方がオンライン上でプレビューできるツールを作ってくださっているので、そこにRAWで取得した内容をコピペして編集すればより精度は高まる。

githubプレビューツール

2012年3月30日金曜日

Oracle SqlServer 関数/データ型変換表

Oracle/Sqlserver分について、関数・データ型について変換表を作成してみました。これが必要なくなる日を祈る(一刻も早く業界団体を作成し統一求む・・・)。


各種DB方言変換表
※変換表の追加や他のDBへの変換の追記など歓迎です


参考サイト
Oracle SQLServer 関数対比表

2012年3月21日水曜日

Node.js + express + MongoDB on Heroku でアプリケーションを作成する

最近話題のNode.jsを使ってみよう!ということでアプリ作成の環境構築~Herokuへのデプロイまで、その手順を紹介します。
Node.jsとは、メリットは、という辺りについては割愛して実際作るところのみにフォーカスします。Node.jsについては幾つか批判的な記事もあり、ここも調べてみると面白いです。

・開発準備(各種インストール)
・Node.jsのインストール
Macならmacportを使うなどいろいろと手段はありますが、ここは普通に公式サイトのインストーラーを使うことをお勧めします。
というのも、Node.js本体だけでなくそのバージョン・依存パッケージを管理するNPMというツールも合わせてインストールする必要があり、この相互のバージョン関係などを考えるとめんどくさくなってくるからです。
Node.js公式サイト

公式サイトのインストーラーはNode.jsとNPMをインストールしてパスも通してくれます。便利。

・expressのインストール
ここはNPMが入ってしまえばコマンド一発で、特に難しいことはありません。

expressインストール方法

QuickStartにもあるとおり、グローバルインストールにしないとパスが通らなかったりするため、以下の手順での実行をお勧めします。
 npm install -g express
 express /tmp/foo(開発フォルダ名)
 cd /tmp/foo
 npm install -d

-gオプションをつけてインストールするとパスが通りexpressのコマンドを使えるようになります。
後は、express フォルダ名でexpressで開発を行うためのフォルダを自動的に作ってくれるので、そこに移動し、install -d でその他依存関係のある各種ツールを落として、準備完了。

・MongoDBのインストール
これも普通にインストーラーからインストールすることをお勧めします。

MongoDB公式サイト
QuickStartガイド

インストーラーを使用すれば、特に難しい点はありません。ただ、データを格納するフォルダを自作する必要がある点に注意してください。
標準以外の場所にする場合起動時にオプション指定が必要なので、面倒な場合起動スクリプトをバッチ化(Winならbat、Macならsh)しておくと開発が楽になります。

環境がMacでバッチの作り方がよくわからない、という場合は下記を参照してみてください。ここが一番分かりやすかったです。

シェルスクリプト

MacではWindowsで言うところの環境変数の設定もGUIベースではなく、コマンドから追加します(個人的には ls -a で隠しファイルを含めて表示し、.profile・.bash_profileをopenで開いて直接編集してますが・・・目に見えて編集できるので良い)

・Mongooseのインストール(オプション)
Node.jsでMongoDBを扱う場合、ライブラリがあると楽です。Mongooseはそのうちの一つになります(非同期環境で扱う場合・・・と書いてあるので、ロック等の処理もうまいことやってくれているのかもしれません)。
NPMが入ってれば、こちらもexpress同様インストールは一発です。

mongoose公式ページ

npm install mongoose
でインストール。こちらはグローバルなどは関係なく、プロジェクトのフォルダに直接ファイルを落とす形式のようだ。


・開発
開発の細かいやり方は各種サイトにいろいろ書いてあるため、ここでは知っておくと便利な点に絞って紹介します。

・ファイル分割
Node.jsで開発をやっているととかくファイルがどんどん長くなります。そのためスキーマ定義など、分割できる箇所は分割したくなってきます。
Node.jsでは require のコマンドを使用して外部スクリプトをロードすることが出来ます(指定パスは相対パス)。フォルダを指定した場合は、フォルダ直下の index.js が読み込まれるなど、少し特殊な動作をするのでそこは注意が必要。

Node.jsでのモジュール読込

・expressでのルーティング
expressでは以下のようにルーティングを行います。
 app.get('/user/:id', function(req, res){
      var userid = req.params.id;
      res.render("user",{ requestid : userid });
    });
    getの部分は、メソッド次第でpostやput、delなどに分かれる。
res.sendで単純にデータ送信、renderでviewsフォルダ内にあるjadeファイルを指定することで、データをレンダリングして送ることが出来る(要するにページ遷移する)。
※Ajaxなどで単純にデータを送りたい場合、res.contentType('json');としてres.send(jsonオブジェクト)とすればOK。

・expressでのフォーム項目とその取得
expressでは標準でjadeを使用しているので、jadeでのフォームの作成とその取得方法を紹介します。
・jadeでのフォーム
 form(action='/', method= 'POST')
   input#name(type="text" name=user[name])
   input#email(type="text" name=user[email])
   input(type="submit" value="送信")

・expressでの取得
   var userName = req.body.user.name

nameの指定でオブジェクト名[要素名]にするとjson化してくれるようだ。
事前にapp.use(express.bodyParser()); が必要だが最初から入っていたので問題なしかと。

・MongoDBの起動・終了
mongodbのbinの中にあるmongodを実行する。
 ./mongod --dbpath フォルダ名 でデータフォルダを指定可能。

終了時は、同じくbin内にあるmongoを実行して起動中のDBに接続し、以下コマンドで終了。
 use admin
 db.shutdownServer()
止まらん、という場合はdb.shutdownServer({force : true})で強制終了。

・MongoDBでのデータベース作成・データ検索
まず use データベース名 でデータベースへ移動。MongoDBはデータベースがないけど指定された場合勝手に作ってくれるというフリーダムな仕様なので、特に作成コマンドはないのだ。
ユーザーは、ユーザーを使いたいデータベースに移動した後以下のコマンドで追加する。
 db.addUser(username,password)

いわゆるテーブルのような概念は、コレクションという形で表現される(mongooseで作成するSchemaはこのコレクションと一致する)。DB内のコレクションの一覧は以下コマンドで取得可能。
 show collections

コレクション内のデータは以下コマンドで参照できる。
db.コレクション名.find()
findにはフィルタの引数などを渡すことが可能。find({username:"john"}, {email:true})ならば、usernameがjohnで表示するオブジェクト(いわゆる列)はemailのみ、という形で指定できる。第一引数がフィルタ、第二引数が選択オブジェクトという形で機能する。

MongoDBチュートリアル


・Herokuへのデプロイ
Herokuへの基本的なデプロイの仕方は以下を参照してください。英語ですが一番最新で分かりやすいと思います。
Getting Started with Heroku
Heroku公式 Node.js関連ページ

なお、既に入っている場合念のためgem update herokuでherokuを更新しておいたほうがいいようです。また、デプロイに当たってはSSHキーの作成と登録が必要なので、こちらも参照ください。

Deploying with Git
Managing Your SSH Keys

  この辺りは結構ハマりました・・・。ここは結局公式のドキュメント見るのが一番分かりやすく正確、だったのでうまくいかない場合はHerokuサイト内での検索をお勧めします。

デプロイ時には、依存ライブラリと稼動プロセス?を管理するため、アプリケーションフォルダの直下に以下のファイルが必要です。

・package.json
依存ライブラリを記載します。npm list で依存関係を確認できるので、それを元に追加します。また、このファイルは稼動するNode.js/NPM本体のバージョン宣言も兼ねています。下記のサンプルを参考にしてください(Node.jsのバージョンを指定しないと思わぬエラーが出てハマります)。

{
   "name": "myapp",
   "version": "0.0.1",
   "engines": {
     "node": "0.6.x",
     "npm":  "1.0.x"
   },
   "dependencies": {
     "express": "2.2.0"
   }
 }


・Procfile
プロセスを稼動させるためのコマンドを書いておくファイル。以下でOK。
web: node web.js
※web.jsの部分は必要に応じて変更

・.gitignore
必須ではないですが、ライブラリ系のモジュールについて管理対象からはずします。
 node_modules


なお、Node.jsアプリはHerokuへデプロイしてもそのままでは動かないため、以下のコマンドを打つ必要があります。これは最初の一回だけで、後のデプロイでの実行は不要です。
  heroku ps:scale web=1

デプロイ後、名前を間違ってしまったなどでアプリを削除したい場合はこちらを参照。
herokuを始めてつまったところメモ

Heroku上では heroku logs でログを確認できます。デプロイが何かしらうまくいかない場合ここを参照します。

今回はMongoDBを使用しているので、MongoHQかMongoLabのアドオンを追加する必要があります。無料ですがクレジットカードの登録は必要になります。
接続文字列などはサーバー上のものにあわせる必要があるため、プログラム中では環境変数を使用する必要があります(環境変数は heroku config で確認可能)。
その辺りはこちらをご参照ください。

herokuでNode.jsを使ってchatアプリ その3(MongoDBを利用して、メッセージを永続化)

必要なポイントとしては以下になります(アドオン追加は画面からやった方が楽かも)。

・ポート番号
var port = process.env.PORT || 3000;


・接続文字列(MONGOHQの場合)
var uri = process.env.MONGOHQ_URL || 'mongodb://localhost/mongo_data';
※ユーザー名/パスワードを指定する場合以下のような感じ
'mongodb://username:password@localhost/sample'


これでアプリケーションは動いている!はずです。githubにアプリケーションのコードを上げておきましたので、実際のコードで確認したい場合はご参照ください。

スケジュール調整アプリ

2012年3月13日火曜日

ASP.NET jQuery UI dialogからの非同期更新

jQuery UIで作成したdialog内からポストバックイベントを発生すると、UpdatePanel内にあるにもかかわらず非同期更新されない。
これは、jQuery UIでdialog処理すると、<form runat="server">タグの外に出てしまうためためのようだ。これを回避すには、ダイアログ処理を行った後にフォーム内に復帰させる必要がある。


//ダイアログ設定
$("#dialog").dialog({autoOpen: false});
//dialogにするとなぜかformの外に出てAutoPostbackが捕捉出来なくなるため、この対応を入れる
$("#dialog").parent().appendTo($("form:first"));


2012年2月22日水曜日

WCFサービスを作成する

WCFサービスの作成から動作確認までの手順。ものすごい手間取った・・・
※ASP.NETサイト上で作成することを想定しています。

0.サービスの違い
サービスをつくろうかな、と思うとなんだか同じような名前でいろいろ選択肢があって迷う。
①Webサービス
②WCFサービス
③WCFデータサービス

Webサービスは一般的なSOAP形式のサービスを作成できる。単体で作成、テストが出来るので使いやすい。

WCFサービスは位置づけとしてWebサービスをさらに発展させたものであり、こちらを使った方がいいとマイクロソフトは言っているように思える。ただ、クライアントとサービスでプロジェクトを分けることが前提に作られているようで、気軽に今のWebサイト内に追加、という感じでは使いにくい。

WCFデータサービスは、エンティティデータモデルを外部公開(OData形式)するということを意識して作られているようだ。そのため、WCFサービスより柔軟性は低いが、既にエンティティデータモデルを使用しているならすばやいデータ公開が可能と思う。


1.WCFサービスの作成
新しい項目の追加 > WCFサービスで追加を行う。
こうすると、以下3種類のファイルが作成される
  >AppCode内
①I<入力したサービス名> : サービスの定義が記載されている(ServiceContract)
②<入力したサービス名>  : サービスの実装クラス

  >ルートフォルダ内(右クリックしたフォルダ内)
③<入力したサービス名>.svc : サービスのアクセスポイントとなるファイル

実態としては、③→①→②の順に処理が解決されていくイメージとなる

2.各種設定
①サービスコントラクト
外部からアクセスする処理(つまりメソッド)を定義するが、この際設定すべきアトリビュートがいくつかある。
必須:<OperationContract()>
            サービス用のメソッドであることの宣言?
任意:<WebGet()>/<WebInvoke()>
GETで使用する場合WebGet、POSTで使用する場合WebInvokeを指定する。クライアントの呼び出しとサーバー上の設定が合っていないと405 Method Not Allowedが発生することがある。
JSON以外を使用する場合は、RequestFormat/ResponseFormatで形式を設定すること。


②サービス実装
サービスの実装。ASP.NETでも稼動させる場合?クラスにAspNetCompatibilityRequirementsの指定が必要。


③web.config
system.serviceModelの部分がWCFサービスのホスティングに関わる箇所になる。
services、behaviorsはデフォルトで追加されるし内容もそれほど分かりにくくないが、注意すべきはbehaviorsの中のendpointBehaviorsだ。これを設定しないとクライアントから呼び出せない。
serviceにはbehaviors/serviceBehaviorsが対応し、
serviceのendpointにはendpointBehaviorsが対応する。
endpointBehaviorsのbehaviorにenableWebScriptかwebHttpを設定しておくことでクライアントから呼び出すことができるようになる。

endpointBehaviorsとwebHttpはどちらを設定しても一見同じに見えるが、endpointBehaviorsの場合受け取ったオブジェクト.d(例:msg.d)の中にデータが格納されるという違いがある(webHttpはそのまんま)。


3.テスト・呼び出し
サービス側のテストは、デバッガを起動すると「指定された値は無効なコントロール文字を含んでいます。」というエラーが出てどうにもうまくいかない。
ただ、幸いにしてサービスの実装は単なるクラスなので、これをコードビハインドでテストしたほうがよっぽど早い。

クライアント側は、AJAX呼び出しを行い動作の確認を行う上記の設定を行えばJQueryの$.ajaxから呼び出せるはずなので、それで動作を確認すればよい。


4.参考サイト
WCFサービスの作成方法
10 行でズバリ !! サービスの作成 (WCF) 
RESTでJSONなサービスをWCFで作ったり使ったりする

JQueryからの呼び出し
jQueryを使ってWCFのサービスにアクセス

2012年2月15日水曜日

VisualStudioからSqlServerへ接続する

開発機のクライアントにVisualStudioが入っており、DBサーバーにSQLServerが入っている、という環境でクライアントのVisualStudioからDBサーバー上のSQLServerデータベースへ接続する方法をまとめました。

・準備
・DBサーバーにpingが通るか確認する。
例えばDBサーバーが「DBSERVER01」であった場合そこにpingを打って通るかどうか確認しておく
・サービスが開始しているか確認する。
DBサーバー上でSQLServerのサービスが稼動しているか確認する

・サーバー側設定
①SqlServer構成の設定
SqlServer Configuration Manager(SqlServerxxxx > 構成ツールから起動)を起動し、SqlServerネットワークの構成 > (インスタンス名)のプロトコルで、TCP/IPが無効になっていれば有効にする(※なお、後述するが名前付きパイプはこの時点では無効にしておいたほうがいい)。
この際、TCP/IPで右クリック>プロパティから、IPAllのセクションでTCPポート1433を設定しておく。

運がよければこれだけで接続可能になる。VisualStudioのサーバーエクスプローラーから、サーバー名、ユーザー/パスワード、データベース名を指定し、テスト接続でOKが出ればとりあえず安心(サーバー側は・・・)

②WindowsFireWallの設定解除
うまくいかない場合、WindowsFireWallの設定を見る。有効になっている場合、SqlServer用のポート1433を開ける必要がある。
Windowsファイアウォールから例外のタブへ行き、ポートの追加から1433を登録する(名前は何でも良い)。追加した名前にチェックを入れ、再度トライ。
(可能なら再起動したほうが良いかもしれない)

③SQL Server Browserを起動する(別名の設定を使用している場合に必要?)
いろいろなサイトで起動させるべきと書いてあるが、必要なかった(2008R2では少なくとも)。そのものの内容を見ると、別名を使用している場合に必要なのではないか。。。という気がする。
名前付きパイプの設定を有効にする場合、セットで有効化するとよいと思われる(未検証)。ただ、この場合別名でアクセスしないとエラーになるので注意。

④データベースがリモートアクセス可能になっているか確認する
デフォルトチェックが入っているので、ここがオフになっていることは余りないが、、、
サーバーのプロパティ>接続から「このサーバーへのリモートアクセスを許可する」にチェックが入っていることを確認する。


・クライアント側設定
基本的にサーバー側に接続できたらOKなことが多いが、ここでもヤマがあることがある。
Oracleなど他DBサーバー同様、クライアント用の設定がクライアントにインストールされている必要があるのだ。
具体的には下記参照。

Microsoft.SqlServer.Management.Sdk.Sfcエラー

なお、ダウンロード先のFeature Packのサイトは一見いつもの「ダウンロード」を押しても何もインストールされない(テキストだがhtmのようなファイルが落ちてくる)。ナメとんのか、という気持ちを抑えて下のほうに行くと各種パッケージをダウンロードできるようになっているのでご注意を。

必要なのは下記モジュール。SQLServer以外のものもしこたまあって検索するのが激しく面倒だが、以下テキストは実際のサイトの語尾から取ったので検索に使えると思う。


・Native Client
・SQL Server システム CLR 型
・共有管理オブジェクト


これで晴れてVisualStudioからアクセスできるようになったはずだ。

SqlServer データベースを作成する

SqlServerはインストールできた。で、その後データベースを作成するには・・・?の手順をまとめました。

・前提
以下の要件を満たすデータベースを作成します。
・データベース名はSQLTEST
・このデータベースへのアクセスに使用するユーザーはsql
・スキーマもsqlとする(sql.testtableといったようにオブジェクトを管理する)

・作成
①データベースを作成する
システム管理者権限(saユーザー)でデータベースSQLTESTを作成します。
これは新しいデータベースの作成で難なく可能

②ログインを作成する
セキュリティ>ログインから、データベースアクセス用ユーザーsqlを作成する。

③スキーマを作成する
データベースSQLTESTで、セキュリティ>スキーマからスキーマsqlを作成する。
※SQLServerでは、Oracleと異なりユーザーとスキーマはイコールではないので別々に作る必要がある(これが良いか悪いかは・・・)

④ユーザーを作成する
データベースSQLTESTで、セキュリティ>ユーザーからユーザーsqlを作成する。
ここで、規定のスキーマに③で作成したスキーマを指定、ユーザーが所有するスキーマで③で作成したスキーマにチェック
※SQLServerでは、ログイン(認証情報)とデータベースユーザーは別なのだ。

⑤ユーザーに権限を付与する
①で作成したデータベース(SQLTEST)で右クリック、データベースのプロパティ>権限を選択し必要な権限を割り当てる。

⑥ログインの設定の見直し
ログインは、作ったままだと既定のユーザー/スキーマがdboになっている(ログインのプロパティ、ユーザーマッピングで確認)。
ここで、④で作成したユーザー(sql)を設定しておく。


以上で終了となる。なお、ここで作成したユーザーsqlはシステム管理者/データベース所有者ではないため、このユーザーでテーブルなどを作る時逐一メッセージが出る(権限を持っているかは関係ない)。

実際はsaユーザーでテーブルを作ればよいのだが、テーブルなどのオブジェクト作成もsqlで行う場合このメッセージはかなり邪魔になる。
そのため、こうした場合はsqlユーザーのデータベースロールのメンバーシップでdbownerを割り当てる(ただ、セキュリティ上言うまでもなくよろしくないので、この場合はデータベース開発用に使用するユーザーsqlに加え、システム側から使うselect用ユーザー(sqlselect)などを作成した方が良いだろう)