
new 修飾子は派生元のメンバを継承し、上書きしつつも今までの継承関係を完全に断ち切るものでもある。サンプルソースを元に詳しく説明。
どう言う事かというと、
using System;
public class Car{
public virtual void BrakeOn(){
Console.WriteLine("フロントタイヤのブレーキパッド作動");
}
public void SpeedUp(){
Console.WriteLine("ガソリンの噴射量をUP!");
}
}
public class HybridCar : Car{
public override void BrakeOn(){
Console.WriteLine("ブレーキパッド作動に加え充電開始!");
}
new public void SpeedUp(){
Console.WriteLine("ガソリンの噴射&モーター電力をUP!");
}
}
public class test{
public static void Main(){
HybridCar foo = new HybridCar();
Car bar = new HybridCar();
Console.WriteLine("BrakeTest (overrideの場合)");
foo.BrakeOn();
bar.BrakeOn();
Console.WriteLine();
Console.WriteLine("SpeedTest (new演算子の場合)");
foo.SpeedUp();
bar.SpeedUp();
}
}
HybridCarの派生元であるCarクラスにはBrakeOnメソッドとSpeedUpメソッドを定義。片方はvirtual,SpeedUpはvirtualですらない。
その2つをHybridCarでは定義する。通常virtualでないSpeedUpメソッドはHybridCarでは警告が発生する。(警告だからコンパイル通っちゃうけど)new修飾子をつけて宣言する事で正常にコンパイルは終了する。
BrakeTest (overrideの場合) ブレーキパッド作動に加え充電開始! ブレーキパッド作動に加え充電開始! SpeedTest (new演算子の場合) ガソリンの噴射&モーター電力をUP! ガソリンの噴射量をUP!
BrakeOnはoverrideです。たとえCar型として実行した場合もHybridCarで「上書き」した動作をする。
SpeedTestはnew演算子です。HybridCar型で実行した場合のみHybridCarで実装された動作をし、Car型として実行した場合はCarで実装された動作を実行すると。本家ヘルプをみると「隠蔽」と言っているのはこの辺の事ですね。
Javaではない「virtual」を持つC#なのに「隠蔽」されるにしても全てのものに出来てしまうのは、どうなんだろう。と思ってしまう。
virtualのメソッドをnewする時は実行時動作の違いに注意が必要ですね。
というか、使う時には慎重に。
svn://myhost/projectで繋がるのにsvn+ssh://myhost/projectだと"Error * No repository found〜"となってしまう問題の解決。
svn+ssh接続だと、サーバーにsshで接続後、svnはssh接続による認証の成功によりsvn固有の認証は行われない。svnserve -t→トンネルモードという状態で起動(ユーザー単位)し、実行される。
svnserveをデーモン起動、もしくはinetedとかによって起動し、さらに-r /usr/local/svnrepo/とか指定をしてると先ほどの罠が発動。
実際にはsvn://myhost/usr/local/svnrepo/projectであるが-rを指定しているからsvn://myhost/projectでOK.
しかし、svn+ssh://のトンネルモード実行時には-r指定はされない為、myhost/projectをみに行ってしまい、No repository foundとなる。
つまり、-r指定をやめたもの、先ほどの例だと svn+ssh://myhost/usr/local/svnrepo/project と指定すれば良いんだけれど何とかする方法は無いだろうか。で、見つけたのが以下の方法。
SSHは公開鍵/秘密鍵でのログインとする。それはauthorized_keysファイルを使うため。
このファイルの中には通常、公開鍵の情報を記述する。こんな感じ。
ssh-dsa AAAABtce9euch.... user@example.com
TYPE KEY COMMENT という構成。
ここには、command="program"を加える事が出来る→
command="program" TYPE KEY COMMENT
commandフィールドが設定されると 通常の svnserve -t のかわりに SSH デーモンがその名前のプログラムを実行するらしい。(でも、これってsvn+ssh以外でもSSH使う場合、どうなんの?)これで、トンネルモード実行に-r引数を設定できる。
command="svnserve -t -r /usr/local/svnrepo/" TYPE KEY COMMENT
トンネルモードのsvnserveはそのSSHログインしたユーザーの権限で起動するから、ユーザを一つのグループにまとめ、umask を注意して設定する必要がある。
上記svnserveをラッパースクリプトにして、その中で umask を設定するようなものにしたほうが良いね。
Date,Timestamp の時刻部分のクリア方法。
いつも日付部分を抜き出して文字列から生成。とかでクリアされたインスタンスを取得〜みたいな感じでやってます。
時刻部分(HH:mm:ss.nnnnnn)のクリアって、王道で行くとこんなカンジなんですかね。 めんどくさ。
/**
* 時刻部分をクリアしたTimestampを取得
* @param timestamp
* @return
*/
private Timestamp clearTime(Timestamp timestamp){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp.getTime());
//時刻AM_PM/HOUR/MINUTE/SECOND/MILLISECOND/HOUR_OF_DAY のクリア
calendar.clear(Calendar.AM_PM);
calendar.clear(Calendar.HOUR);
calendar.clear(Calendar.HOUR_OF_DAY);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
return new Timestamp(calendar.getTimeInMillis());
}
WindowsXP Pro SP2 + ASP.NET +Oracle9iClient(開発環境) でのWebアプリ制作中、 ASP.NETの実行時のみでOracleへ接続する部分で下記のエラーが出ます
=================================================================================== アプリケーションでサーバー エラーが発生しました。 System.Data.OracleClient requires Oracle client software version 8.1.7 or greater. ===================================================================================
1.Oracleのoci.dllへのアクセス権がない
oracleフォルダのアクセス権にASP実行ユーザ"ASPNET"を追加する。
2.NTFSセキュリティ設定で"Authenticated Users"というグループ?を一度外して再度付け直す
環境によってはフォルダに"Authenticated Users"がはじめから設定しておらず、その時には"Authenticated Users"を追加しても問題が解決しない。ということがあるようだ。
P.S. WinXP Helpより。
Authenticated Users (グループ)
(S-1-5-11) ID が認証されたすべてのユーザーおよびコンピュータ。Authenticated Users には Guest は含まれません。
これは Guest アカウントにパスワードがある場合も同様です。
もしかしたら、あとから追加されたASPNETというユーザーが"Authenticated Users"のリストに追加されていなかったのだろうか。


●現在地点
スタートより220km
【GPS情報】
●現在地点
スタートより148km
1日目Goal!
●現在地点
スタートより105km
【GPS情報】

February | ||||||
Sun |
Mon |
Tue |
Wed |
Thu |
Fri |
Sat |
1 |
2 |
3 |
4 |
5 |
6 |
|
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
||||||