2013年6月17日月曜日

Oracle スキーマ内のオブジェクトの全コンパイル

Oracle内スキーマの、全オブジェクトをコンパイルするコマンド。

begin
  UTL_RECOMP.RECOMP_SERIAL('TARGET_SCHEMA_NAME'); 
  --TARGET_SCHEMA_NAME is compile target schema name 
end;



2013年6月6日木曜日

ASP.NET MVC4でSignalRを使用する

ASP.NET MVC4でSignalRを使ってみた。

空のプロジェクトで作成するとどうにもうまく動かないので、基本のサイトで作成してから余分なパッケージやファイルをがさがさ削るという方法で、一番シンプルな形に落ち付けた。

https://github.com/icoxfog417/SignalRonMVC4

Appharborでのデプロイも検証済みなので、無料でサービス公開も可能です。

http://signalronmvc4.apphb.com/



プロキシサーバー下でのGitの設定

プロキシサーバー内でGitの設定を行う場合、http.proxyを設定します。

git config --global http.proxy proxy.host:8080

認証がある場合は、ユーザーID:パスワードを先頭に追加し、@で区切る

git config --global user:password@http.proxy proxy.host:8080


ん?パスワードに@があってうまくいかん!という場合は@をURLエンコードした値(%40)を使用する。
例えば、ユーザーID = user パスワード=p@sswordである場合、以下のように設定する。

git config --global user:p%40ssword@http.proxy proxy.host:8080

設定値は git config --global --list で確認可能。

2013年4月30日火曜日

DOSバッチでの曜日計算 ツェラーの公式

DOSバッチで、日曜の夜だけ特定処理を実行させたいなど、曜日判定を行いたい場合に使用


REM 今日の曜日の算出(ツェラーの公式)


set /A YYYY=%DATE:~0,4% * 1
set /A MM=%DATE:~5,2% * 1
set /A DD=%DATE:~8,2% * 1
echo Today : %YYYY% %MM% %DD%

if %MM% LEQ 2 (
set /A YYYY=%YYYY% - 1
set /A MM=%MM% + 12
)

set /A YOBI=(%YYYY% + %YYYY% / 4 - %YYYY% / 100 + %YYYY% / 400 + (13 * %MM% + 8) / 5 + %DD%) %% 7

if %YOBI% == 0 echo 日
if %YOBI% == 1 echo 月
if %YOBI% == 2 echo 火
if %YOBI% == 3 echo 水
if %YOBI% == 4 echo 木
if %YOBI% == 5 echo 金
if %YOBI% == 6 echo 土

  (参考)http://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F

2013年3月3日日曜日

JavaScript で Decimal 型を実現する

JavaScriptでは数値が全てfloatなので、単純な計算でも結構誤差が出て困ることになる。
検索してもこれといった解決策がなかったので、jasmine入門がてら簡単なクラスを作成した。

<GitHubリポジトリ>
https://github.com/icoxfog417/simple_decimal

よくも悪くも単純であります。


2013年1月13日日曜日

GitHub リポジトリ内のソースコードの検索を行う

GitHubのリポジトリであのメソッドの定義を確認したい、ということが少なからずあるが、標準の検索で引っかからず仕方なくfork/cloneする・・・めんどくさい!と思ったことはないだろうか。

そんなときに仕えるのがAdvanced Searchのオプション。リポジトリ内のソースは以下のように検索できる。

repo:lift/framework  AddUserMenusAfter
例:Liftフレームワーク内のAddIserMenusAfterの定義を検索

repo:ユーザー名/リポジトリ名 検索キーワード で検索ができる。上記の例をそのまま検索窓に入れるときちんと検索されるはず(なぜか何個も引っかかるが・・・)。

これ以外にもいくつか使えるオプションがあり、それは こちら 参照(使えんオプションが多いのは気のせい?)。

これでわざわざローカルに落とす手間が省けます。

<参考>
Search code inside a Github project


2013年1月11日金曜日

TryAndError Appharbor でEntityDataModelを使用する

AppharborでEntityDataModelを使用する際にはまったポイントについてつらつらと書いていきます。

1.DateTime型を使ったらエラーで怒られる
これはAppharborとは関係ないが、モデルでDatetime型の項目を使用していると登録時に「Datetime2 データ型から datetime データ型への変換の結果、範囲外の値になりました」というエラーが出る

原因はよくわからんが、Nullを許可するDatetime?型だとこれを回避できるらしい(VB.NETだとNullable)。

2.DBが最新でないみたいなエラーが起きる
モデルを変更後、マイグレーションをしていないとこのエラーが起こる。

The model backing the 'YourContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

マイグレーションの方法は こちら 参考。EntityDataModelインストール済みなら以下のコマンドを打てばいい。

Add-Migration マイグレーション名
Update-Database 


3.本番であるAppharborと開発環境でConnectionStringを変えたい
これにはWeb.Release.Configを使用する。デフォルトで作成されているので中身を見れば記入方法は分かるが、Release環境時にWeb.Configの値を置き換えることが可能。

 <add name="MyDB" connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
  xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>

ポイントは青字部分で、これでWeb.Config上のnameが一致するものを置き換えてくれる。


4.テストプロジェクトがあるがデプロイ時自動で走るのでこれをやめたい
Appharborへデプロイする際は、テストプロジェクトがあるときそれが実行される。これはこれでいいのだが、DBへアクセスするテストがある場合有難迷惑なのでデプロイ時テストプロジェクトをはずしたいことがある。

こうしたときは、既存のソリューションファイル(.sln)をコピーし Appharbor.sln というファイルを作成し、これを編集しテストプロジェクトを除外する。

Appharbor上では、Appharbor.slnがあればそちらが優先される。


5.ProviderManifestTokenから文字列が返されませんでしたエラーが出る
EntityDataModelはデフォルトでデータベースの作りかえを行うが、普通Appharbor上で使用するDBのアドオンでそんなこと許されるわけないので、DBの作り返しを行わないよう、Global.aspxのApplication_Start でInitializorの設定を行う。

Database.SetInitializer<YourContext>(new CreateDatabaseIfNotExists<YourContext>());

CreateDatabaseIfNotExistsが肝。あとは、ConnectionString aliasにconnectionStringのnameを設定しておく。

とりあえずこれで解決した。こちらのサポートのやり取りを参照。



まだ追記するかもしれないが、とりあえずこれくらいか・・・。こういうところはさくっと行ってほしいんだがな~


2013年1月10日木曜日

OracleからSqlServerへ接続する

OracleからSqlServerへ接続する方法をまとめ。基本的にはODBCデータソースとDBLinkを使用する。イメージ的には、 SqlServer -> ODBCデータソース -> DBLink -> Oracle という形になる。

1.ODBCデータソースの登録
コントロールパネル > 管理ツール > データ ソース (ODBC) を選択。
ここでデータソースの追加ボタンを押し、SqlServerかSqlServerNativeClientのどちらかでデータソースを作成する。
接続するサーバーは サーバー名(IPアドレス)\インスタンス名 が基本だが、サーバー名だけでも良いようだ。SqlServerでインスタンスを作成すると自動的に作成されるようなので、SqlServerを立てている側のサーバーのデータソース設定を見ると正確。

他のログイン設定は、適宜設定。


2.Oracle Database Gatewayの登録
ORACLE_HOME\hs\admin のフォルダにDatabaseGatewayの設定ファイルがある。
ファイル名は init<SID>.ora とする。SIDは任意の名称。dg4・・・とするのが慣例?のようだ(dgはDatabaseGatewayの略と思われる)。

内容は以下の通り。

HS_FDS_CONNECT_INFO = <odbc data_source_name>
HS_FDS_TRACE_LEVEL = <trace_level>

<odbc data_source_name>は先ほど作成したデータソース名、<trace_level>はOFFかONを設定。ONにしておくとoracle_home:[tg4rdb.log].にログを書き出してくれるので、ONにしておくのを推奨。


3.リスナーへの登録
OracleのリスナーにGatewayを登録する。ORACLE_HOME\network\admin にあるlistener.oraにGateway用の以下の記述を追記。

SID_LIST_LISTENER=
   (SID_LIST=
      (SID_DESC= 
         (SID_NAME=gateway_sid)
         (ORACLE_HOME=oracle_home_directory)
         (PROGRAM=dg4odbc)
      )
   )

gateway_sidは2で設定したSID(ファイル名の一部)。oracle_home_directoryはoracle_homeの値となる。

この設定を終えたのち、リスナーの再起動を行う。
※一度リスナーの再起動に失敗したことがあった。プロセスを見てみるとODBCデータソースがリスナーが起動するのに必要なポートを占有していたようなので、これを切ったところうまく立ち上がった(普通に起きる出来事なのかは定かでない・・・)。


4.接続名の登録
listener.oraと同フォルダにあるtnsnames.oraで定義されているOracleの接続名に追記を行う。

SQL_SRV=
   (DESCRIPTION=
    (ADDRESS= (PROTOCOL=TCP)(HOST=odbc_data_source_host)(PORT=1521))
    (CONNECT_DATA=(SID=gateway_sid))
    (HS=OK)
)

ホスト名が、相手先のSqlServerのホストでなく、ODBCデータソースのホスト(要するに自サーバー)である点に注意。


5.DBLinkの登録
ここまでくればあと一歩である。
以下のコマンドでDBlinkを作成する。なお、作成にはCREATE DATABASE LINK関連の権限が必要なため注意(こちら参考)。

CREATE PUBLIC DATABASE LINK dblink_name CONNECT TO user_name IDENTIFIED BY password USING 'service_name';

サービス名は文字列としてシングルクォーテーションでくくらないといけない点に注意。PUBLICをつけるかどうかは場合によりけり。

これでDBLINKの作成が完了したので、以下のSQL文で動作確認を行う。

select 'X' from dual@dblink_name

これで出力が返ってくれば完成!である。


※一度相手先のSqlServerがとまっていたことがあり、このときOracle側のリスナーも起動が失敗した。再現実験ができていないのだが、もしかしたらリスナー起動時にGatewayの生死判定があり、相手先が止まっていた場合自分も起動しないという迷惑判定があるかもしれないので要注意。


<参考>
Configuring Oracle Database Gateway for ODBC

D Heterogeneous Services Initialization Parameters



2013年1月2日水曜日

Scala Lift lift_basic を読み解く View編

Scala Lift を理解するに当たり、一通りの機能を備えたサンプルであるlift_basicを元にその動作を追ってみる。

Liftのソースコードはこちら。これを書いている時点では2.5-M3が最新である。
Lift Download

ダウンロードしたzipなりを解凍すると中にlift_basic、lift_blankなどのフォルダがある。これらがそれぞれテンプレートとなっており、sbtのコマンドで動かすことができる(動かす方法はダウンロードページ参照)。

0.Liftの特徴
これは様々な解説サイトがあるのでそちらの方が詳しかろうが、「ビューファースト」であるという一言に尽きると思う。
Ruby On Railsなどの最近のフレームワークはモデルに合わせて画面を作るというイメージだが、Liftは画面を作りモデルをそこに適用する、というイメージである。

ユーザーの目に触れる画面は一刻も早く手を付け最も時間をかけたいところであるが、既存のフレームワークでは「モデルがないと画面がつくれない。待って。」とならざるを得ない。それを解決するのがビューファーストであり、それを支援するLiftフレームワークなのである。

(※ビジネスモデルに通ずるモデルの構成をまずきちんと考えるべきという説もあり、この辺りはケースバイケース)。


1.LiftのView
そんなわけで、Liftを読み解くに当たりまず確認するのはやはり画面である。

lift_basic/src/main/webapp/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
    <title>Home</title>
  </head>
  <body class="lift:content_id=main">
    <div id="main" class="lift:surround?with=default;at=content">
      <h2>Welcome to your project!</h2>
      <p>
<span class="lift:helloWorld.howdy">
 Welcome to your Lift app at <span id="time">Time goes here</span>
</span>
      </p>
    </div>
  </body>
</html>

Scalaは関数型言語の機能を持っているが、このページも関数のように処理される。アバウトに言ってしまうとclassの(lift:で始まる)値=「関数」、classの設定されているHTMLエレメント(divなど)=「引数」となっている。

1.1 スニペット
手近なところで以下の部分を見てみる。

<span class="lift:helloWorld.howdy">
  Welcome to your Lift app at <span id="time">Time goes here</span>
</span>

これは内部要素をHellowWorldクラスのhowdyメソッドで処理してください、という意味である。このように特定の要素を処理するためのクラス(とメソッド?)をスニペット(snippet)と呼ぶ。

lift_basic/src/main/scala/code/snippet/HelloWorld.scala のスニペットを見てみると・・・
class HelloWorld {

  lazy val date: Box[Date] = DependencyFactory.inject[Date] // inject the date

  // replace the contents of the element with id "time" with the date
  def howdy = "#time *" #> date.map(_.toString)

  /*
   lazy val date: Date = DependencyFactory.time.vend // create the date via factory

   def howdy = "#time *" #> date.toString
   */
}

(Boxなどはとりあえず無視し) defで始まるhowdyメソッドの定義に着目する。
"#time *" #> となっているのは、idがtimeのところだけ、という指定である。このほかにもCSSセレクタのような指定が可能である(CSS Selector Transforms 参照)。
このセレクタのようなメソッドはどうやらStringクラスのメソッドが拡張されているようで、セレクタに該当する部分を引数(この場合date.toString)に置換する関数(CssSel)を返しているようだ。

この部分を手動で書くなら、HTMLエレメント(NodeSeq)を受け取って(編集後の)HTMLエレメント(NodeSeq)を返す関数を定義することになる。以下がその例である。

//メソッド定義
 def howdy2(xhtml:NodeSeq):NodeSeq = bind("tag",xhtml,"param1" -> <span>Hellow</span>)

//htmlでの呼び出し
 <div class="lift:helloWorld.howdy2">
    <b><tag:param1 ></tag:param1></b>
 </div>
bind関数によって、対象HTMLエレメント内のtag:param1要素を<span>Hellow</span>に置換するという意味になる。
なお、置換するHTMLエレメントは上記のようにspanタグなどで囲まなくてもSHtmlという関数が用意されており、こちらを使用すると楽。 SHTMLのAPI


1.2 テンプレート
HTMLエレメントには、このスニペット以外にもテンプレートを適用することができる。これが以下の部分である。

    <div id="main" class="lift:surround?with=default;at=content">

surroundはページのテンプレートの指定である。このテンプレートは、lift_basic\src\main\webapp\templates-hidden に配置されており、ここではwith=default; default.htmlを使用すると宣言している。また、at=content の指定によりこのdiv内の要素をdefault.html内のid=content要素に適用するとしている。
これは、surroundという関数にwith、atというデフォルトテンプレート、置換先の要素を指定する引数を渡したかのようでもある。

この部分は <body class="lift:content_id=main"> によりいわば「このページのメイン関数はid=mainである」と指定されており、ページのレンダリングを行う際の処理の開始点となる(※誤りある可能性有。大体そんな感じととらえてください)。


LiftにおけるViewの概要はこんな感じとなる。


2012年12月31日月曜日

Eclipseでコマンドプロンプトのウィンドウ(コンソール)を表示する

Eclipseを使用しているときにコマンドプロンプトでコマンドを打ちたい、ということがしばしばある。cmdで起動してcd~とやるのは面倒なので、Eclipseからできるようにする。

Run > ExternalTools > ExternalToolsConfiguration から、外部ツールの設定画面を呼び出す。



プログラムの外部ツールを新規作成し、設定を行う



Working Directory を${project_loc}にしておくと、プロジェクトのフォルダで起動してくれる。
※プロジェクトを選択しない状態で実行するとエラーが出るので注意

指定の方法は他にもあるので、変えてみたい方はこちらを参考。
External tools


これで設定は完了。あとは、外部ツールから動かせばOK。



2012年12月27日木曜日

SqlServerにSQLのみで画像(バイナリ)データを投入する

データの初期セットとしてDBに画像やファイルのデータを入れたいときの方法。Accessだかフォームだかのツールを使う例が多いが、正直そんなのやってられないのでSQLだけで対処する方法です。

CREATE TABLE myTable(Id nvarchar(max), Document varbinary(max)) 
INSERT INTO myTable(Id,Document) 
SELECT 1,img.BulkColumn
FROM (SELECT * FROM OPENROWSET(BULK N'D:\temp\1.jpg',SINGLE_BLOB) AS i ) img


注意点としては、指定するパスはDBサーバー上のものでないといけない、という点(ローカルのパスを指定してもファイルがないといわれる)。

また、実行には一括処理の行える権限(sysadminかbuiladmin?)が必要。


参考
http://weblogs.sqlteam.com/peterl/archive/2007/09/26/Insert-binary-data-like-images-into-SQL-Server-without-front-end.aspx


2012年12月19日水曜日

ASP.NET ボタン連打による複数回PostBackを防止する

ASP.NETでボタンを連打すると、リクエストは全て処理されるが画面に返されるレスポンスは最後の一回のものになってしまう。

これではいかん、ということで連打を防止する場合以下のようにする。


<asp:Button runat="server" ID="BtnSubmit" 
  OnClientClick="this.disabled = true; this.value = 'Submitting...';" 
  UseSubmitBehavior="false" 
  OnClick="BtnSubmit_Click" 
  Text="Submit Me!" />

ポイントはOnClientClickでボタンを無効化する(ついでにボタンテキストも変えている)点と、UserSubmitBehavior="false"にしてある点。

ボタンを無効化しただけだと、ポストバックが発生しなくなってしまう(無効なボタンからポストバックは発生しない)。UserSbumitBehavior=falseは、webにおけるformアクションに頼らず、とにかくPostBackしなさいという意味になるので、これでOK(名前的に起こさなくなりそうだが・・・)。

ページが再ロードされれば無効化したのもボタンのテキストを変えたのも元に戻るので、これにて一件落着。

参考サイト
http://encosia.com/disable-a-button-control-during-postback/



2012年12月17日月曜日

ASP.NET MVC を Appharbor へデプロイする際の注意事項

少しはまったのでメモしておきます。

ASP.NET MVC (今回は最新の4を使用) をAppharborにデプロイする際、デフォルトでは勝手にライブラリをロードしてくれないようです。そのため、packageフォルダをデプロイ対象からはずしているとビルドエラーになります。

・packageのフォルダは基本.gitignoreではずす(重いので)
・しかし、この場合packageのロードが行われずビルドエラーになる(MSB3245 xxx but it didn't exist. が多発する)。

対応として、ビルド時にpackageをロードするようプロジェクトを設定する必要があります。

その方法は公式サイトで公開されています。

パッケージ再ロード設定


このページではプロジェクト>右クリックで「Enable NuGet Package Restore」をしてくれといっているのだが、私の場合「え?そんなメニューないんですけど」という状態でした。
そんなときはこちらをご参考。

Enable NuGet Package Restoreを表示する方法


それでも出ないという場合(私の場合・・・)は、ツール>ライブラリパッケージマネジャー>パッケージマネージャーコンソール でNugetのコンソールを起動し、以下コマンドを実行。


Install-Package NuGetPowerTools
Enable-PackageRestore

Nugetのコンソールツールをインストールして、そこから実行します。

これを実行するとNugetの実行ファイルがプロジェクト内にロードされ、ビルド時にパッケージを読み込んでくれるようになります。

あとはAppharborへデプロイすればビルド完了となると思います。

参考までに、今回使用した.gitignoreを掲載。


*/packages/*
/packages/*
obj/
bin/
TestResults/
_ReSharper.*
*.csproj.user
*.resharper.user
*.resharper
*.suo
*.cache
*~
*.swp
*.resharper.user
*.rptproj.user
*.db
*.sdf
*.tmp



2012年11月28日水曜日

ASP.NET UpdatePanel内なのにPostBackが発生する

UpdatePanelで囲っている、もしくはTrigger指定しているのになんでPostBackするの、という時にはClientIDModeをチェックする。

ClientIDMode=Staticだと、コントロールのIDが一意に特定できず(ViewStateに保管されたIDと一致しない?)PostBackしてしまうことがあるようだ。なので、AutoIDなどにする。
特に、子要素を持つコントロール(xxxリスト、GridViewなど)は注意が必要。

マスターページなどを使っている場合IDにプレースフォルダのIDが付加されたりするのでClientIDMode=Staticを使いたくなる。なのでこの仕様はちときつい・・・

2012年11月25日日曜日

作業の流れで覚える Git コマンド

Gitのコマンドについて、大体の作業の流れに沿ってまとめました。GitHub想定。

○初期設定編
*ユーザー名/メールアドレスの設定
git config --global user.name "Suzuki Taro"
git config --global user.email taro@example.com

*エディタの変更
git config --global core.editor notepad

*改行コードの扱い
大体GitHub上にあがっているのは改行コードLFなので、Windowsの場合以下の設定をしておくとチェックアウト時LF - >CRLF、コミット時CRLF->LFの変換を自動で行ってくれる。
git config --global core.autocrlf true

Mac/Linuxの場合はCRLFが混じっていると困るので、チェックアウト時CRLFをLFに換えてくれる設定をしておくとよい。
git config --global core.autocrlf input

*プロキシ環境の場合
ユーザ認証なし
$git config --global http.proxy http://proxy.server.com:port

ユーザ認証あり
$git config --global http.proxy http://user:pass@proxy.server.com:port

設定結果の確認
$git config --get http.proxy


参考サイト:ssh over proxyでgithubをアクセスする(Windows)

○通常時編
1.ソースをとってくる(forkした後の自分のリポジトリから~というイメージ)
git clone git@xxxxxxxx.git

2.ソースの編集後、リポジトリに追加
git add . 

3.コミット
git commit -m "メッセージ"

4.リモートにアップロードするため、リモートを追加
git remote add リモート名(originなど) master

5.リモートに送信
git push リモート名 master


○初めてのpull Request編
1.通常時編と同様。リポジトリをフォーク+クローン

2.ブランチを作成 ※決してmasterで作業しない。
git checkout -b (ブランチ名)
ブランチ名はxxSpikeなどSpikeをつけたりdevelopとしたり・・・といろいろあるようだが、見たところ修正点がわかれば何でもいい感じだ

3.fork元のリポジトリを変更追尾用のupstreamとして登録しておく
git remote add upstream git://xxxxxx.git

4.ブランチで作業(git add / git commit)

5.fork元を更新し、元リポジトリで更新が行われていないか確認
git checkout master
git pull upstream master
マスターブランチに移動して、pullで更新するそのあと自分のブランチに戻り、差分確認。
git checkout myBranch
git diff master

横着する場合は、リモートのブランチと直接比較する方法もある。元リポジトリのmasterブランチと現在のブランチの差分を比較している。
git diff upstream/master

万が一変更が行われていた場合、rebaseなどを使用し対応。ここは細かい話になるため、その他の詳細記事を参照。

6.pull Request
元リポジトリの差分を取り込んでおり、自分の変更点はbranchにまとまっている!となれば、githubにpushし、その後pullRequestを行う(これは画面から行う)。
git push origin ブランチ名
※originはGitHubのリモート

事前にコミットまとめなさいよ、という話があるかもしれない。実際そうしたほうがいいが、マージをする際に取り込むブランチ上のコミットはまとめることができるので、そこまでするかなという気もする(タイプミスとかは確かにアレだが・・・)。
まとめる場合、rebaseを使用する。こちら を参考。

なにより、小さく速くやる、ということがpull Requestでは重要と思う。


○あるある編
*gitignoreを追加するのを忘れたので、直前の git add . を全部取り消したい
git rm -r --cached .

*git addでの変更内容を事前に確認したい
git status もしくは
git diff  --cached
※ファイルの一覧でいいんだよ!という場合は 
git diff --cached --name-only

--cachedってなんなの?という場合こちらを参考。

*コミットメッセージに誤字脱字。修正したい
git commit --amend -m "(新しいコミットメッセージ)"
git commit --amend で、単純にコミットの取り消しになる。

*コミット先を間違えた。取り消したい
git reset HEAD^
上記に引き続きとても分かりやすい記事があるのでこちらを参考。みんなHEADとかインデックスとか何言ってんの?という場合にもとても良いです。

*削除したファイルがgit addで追加されない
git add -u
を実行





Scala Lift を Heroku で稼働させる

えらく苦労したが、ScalaのLiftをHeroku上で動かせた。

○前提インストール
  Scala (やたら重い気がするが気のせいか?)
  SBT  Scalaにおけるビルド/パッケージ管理ツール
  Lift   今回は下記のGitリポジトリに含んでいるのでダウンロードの必要はないが、一応

後はHerokuツールともちろんGit。Heroku自体へのGitを使用したデプロイの方法はいろいろと解説されているので、ここでは詳しく触れません。

WindowsではSSHキーの作成がめんどいと感じるかもしれませんが、GitをインストールすればGit Bashからssk-keygenを使用できるため、こちらでキー生成を行えばわざわざPuttyなどからやらなくて済みます。

Liftのスタートアップスクリプトはbashで書かれていてコマンドプロンプトからうまく動かなかったりするので、なにかコマンドを実行する際はGit Bashを使うことをお勧めします。


○方法
さっさといこう!ということでGitHubからcloneで。
  lift_basic_heroku

こちらのリポジトリをcloneして、あとはReadmeの通りに行けばHerokuへデプロイできると思います。


2012年8月18日土曜日

ソースコードのバージョン管理の考え方

ソースコードのバージョン管理については、GitやSubversionなどの様々なツールがある。最近導入の検討を行ったが、「そもそもどういう風にバージョン管理をしたいのか」という明確な戦略がないと、ツールの操作と手間に振り回されてしまうと感じた(振り回されたのだが・・・)。

なので、まずはバージョン管理の目的とその戦略についてまとめてみた。


<バージョン管理の目的>
バージョン管理の目的は2つあると思われる。

1.マイルストンの設置
 ある時点の安定した状態を記録しておき、いざというときにそこに戻れるようにする。また、そこからどのような作業が行われたのか、差分を確認できるようにする。リリース管理ともいえる。

2.分業の実施
 分業を実施するため、個々人(あるいはチーム)の作業エリアを別々のバージョンとし、最終的にマージを行う。

サウンドノベルのゲーム(かまいたちの夜etc)などをやったことがある人は、ゲームオーバーになった時どの章から再開するのか選べて便利だな、と思ったことはないだろうか(下図参照)。




これは立派なバージョン管理ではないか。①のマイルストンの管理ができていることで、ここまではうまくいっていたのにな~というところから再スタートできる。

ゲームでは分業することはあんまりないと思うが、仮に上記のようなゲームの攻略本を作るとしたら、「オマエはAルートで俺はBルート」のような形で担当を分け、最後にお互いのセーブデータをマージする・・・ということができたらいいだろう。
この時の「お互いのセーブデータ」がつまるところバージョンに当たり、②の目的で使っていることになる。


<バージョン管理の戦略>
では、どのような形でバージョン管理を行えばよいだろう。バージョン管理の手法としては、以下2つが考えられ、これはなにもソースコードの管理だけでなく企業の予算立案などでも使われている考え方である。

1.スナップショット型
ある時点での作業内容を保管しておくことで、バージョン管理を行うタイプである。これは、先ほどのサウンドノベル型に近い。

登場するバージョンは基本的に 作業バージョン・リリースバージョンの2種類である。作業バージョンでの作業がひと段落したら、その時の状態をリリースバージョンとして保管するという形式である。



○メリット
作業する場所が一つなので、作業はしやすい。複数機能を開発している場合、いい意味でも悪い意味でも、既存への影響を早めに知ることができる(同じ場で作業しているので)。

×デメリット
性質上ある機能の分だけ切り出すということは難しい。そのため、複数の機能が同時並行的に開発されていて、できた機能は一刻も早くリリースしたい・・・というような環境では不向き。
上記の例だと、機能Bの開発終了段階ではまだ機能Aの開発が終わっていないため、単純に作業バージョンをコピーするのでなく、安定板であるVer1に対し機能Bの変更のみ反映させるといった作業が必要になる。
→大きい機能でも、リリース可能な状態をキープする戦略があるとよいか。

上記点を考えると、開発する機能・納期が明確に決まっているような案件の場合、または特定機能を全員で開発していくような場合に向いていると思われる。


2.ローリング型
作業を始める前に、その作業を行うための箱を作る方式。



○メリット
他の開発の影響を気にすることなく作業できる。それと、万が一やっぱりこの機能やめた、という場合でも作業用のバージョンを消すだけで済む。

×デメリット
他機能がリリースされた際、そのリリース内容を取り込みながら開発を行っていく必要がある。そのため、長期にわたる機能開発の場合取り込み作業が大変。また、他機能の開発で自分の機能に大きく影響を与える変更があった場合、その検知が遅れることになる。
→機能開発のサイクルを一定にする工夫があると運用しやすいか(長短入り乱れると長の開発が割を食う)

上記点を考えると、不特定多数で作業する場合やリリースする機能は作りながら決めるぜ、というような場合に向いている。


以上が、バージョン管理の目的とその戦略についてである。ツールを選ぶ前にこの辺りをよく考えておくと、どんなツールでどういう風に管理するのがいいのか見通しが立てやすくなると思う。



2012年8月2日木曜日

AppHarbor と GitHub の連動設定(ServiceHook)

GitHubにpushしたらAppharborにも自動的にpushしたい!という場合ServiceHookの機能を使用する。その設定方法について解説します。

まず、GitHub側のリポジトリのAdminからServiceHookを選択



Appharborの設定は以下のようになっている。



ここで、Application SlugとTokenは、Appharbor上の以下の設定を入れる。

・Application Slug
 Appharbor上のアプリケーション名
 (カンマ区切りと言うことなので他のものでもいいのかもしれない)

・Token
BUILD URLの、authorizationの値を設定する。BUILD URLをクリックするとクリップボードに値がコピーされるので、それをテキストエディタなどに貼り付けてauthorizationの値をTokenに設定する


あとはActiveにチェック。

こうすることで、GitHubにpushするとAppharborにも反映されるようになる(ブランチがmaster以外の場合どうなるの?という点はちょっと未確認)。







2012年7月17日火曜日

NPOI 日付が割り算として計算されてしまう

NPOIでせっかく日付書式を指定してデータを出力しているのに、"2012/x/x"と入力するとなぜか1900/x/xといった日付になることがある(見かけ上正しく出ているが、一旦セルを編集するとおかしくなる)。

これは、スラッシュが日付書式でなく割り算として解釈され、計算された値が日付として表示されるためこのような奇妙な事態となる。

この元凶はExcelのツール>オプション>移行>式入力を変更するというチェックである。

普通にExcelを新規シートを作成した際はこのチェックボックスは付かないが、NPOIから作成する場合なぜかデフォルトTrueなので、Falseにしてやる必要がある。


        hssf.CreateSheet("Sheet1")
        Dim sheetObj As HSSFSheet = hssf.GetSheet("Sheet1")
        sheetObj.AlternativeFormula = False
        sheetObj.AlternativeExpression = False


AlternativeFormulaが「式入力を変更する」のオプションに該当。ついでに「計算方式を変更する」のオプションであるAlternativeExpressionもFalseにしておいたほうが良いだろう(こちらも普通に新規シートを作成する際はチェックが付いてない)

2012年7月12日木曜日

SqlServer SELECT文からテーブルを作る ( テーブル作成クエリ )

SELECT文からテーブルを作成する機能が(Accessのテーブル作成クエリに該当)、なんとSqlServerにもある。
データをどこかしらから持ってきて、とりあえずテーブルに入れたい場合などに重宝すると思います。

SELECT 'JOBS'  AS NAME , 0.000 AS SARALY INTO EMP_TABLE


データをまじめに設定しておくとテーブル型も結構正確になります(上記の場合、数値は小数点以下桁数3桁がきっちり設定される)。