前回インポートについて書きましたが、DBAのロール権限を持っていないと出来ないことが発覚。
(これに気づくまで約1日かかってました。最初から知ってる人に聞くのが一番って事ですね)
まずはじめに権限を持ってるユーザーでログインします。
ロールをユーザーに付与する
GRANT ロール TO 権限を与えるユーザー名 [IDENTIFIED BY password][WITH ADMIN OPTION];
ロールをユーザーに付与するには、GRANT文で付与するロール名を指定し、TO句で付与するユーザー名を指定します。
IDENTIFIED BY句
IDENTIFIED BY句に続けてパスワードを指定すると、既存ユーザーを明確に識別できます(ユーザーが存在しない場合は新規にユーザーが作成されます)。
WITH ADMIN OPTION句WITH ADMIN OPTION句を指定すると、
・ロールがGLOBALロールでない場合、そのロールをほかのロールに付与可能
・ロールをほかのロールから取り消すことが可能
・ロールへのアクセスに必要な認可を変更するため、ロールを変更可能
・ロールを削除可能になります。
ということです。
2007年12月13日木曜日
[oracle]ユーザーに権限を与える
2007年12月11日火曜日
[oracle]dmpファイルのインポートとエクスポート
そんなに項目がないのであればツールなどでSQLを書けばいいんだけれど、かなり大きなモノになると大変なのでdmpファイルにするらしい。
oracle crientがインストールされていることが最低条件です。
dmpファイルの作成方法
DOSプロンプトを開いて
exp ユーザ名/パスワード@設定しているtns file=作ったファイルを置く場所¥ファイル名 log=ファイルを置く場所¥作ったファイルに関するログファイル
これでdmpファイルという形でエクスポートされている。
次にインポート
imp ユーザ名/パスワード@設定しているtns file=dmpファイルが置いてある場所¥ファイル名 log=dmpファイルが置いてある場所¥作ったファイルに関するログファイル
これでインポートできるはずです。
どうやらバージョンが違うoracleでエクスポートするとインポートできないらしい。
まぁそれ以前に同じバージョンで渡されたdmpファイルがインポートできなかったのでこれであっているかの自信がないです。
[oracle]ユーザーの追加
まずはじめにDOSプロンプトを開いて
sqlplus ユーザー名/パスワード@設定しているtns
と入力しSQLPLUSを開く
SQLPLUSを開いたら
登録したいユーザー名とパスワードを入力する。
create user '登録したいユーザー名' identified by '登録したいパスワード';
権限を与えるために
create role '登録したユーザー名'_ROLE ;
を入力し、権限を与える内容を入力
例)
grant
ALTER PROFILE
,ALTER SESSION
,ALTER SYSTEM
,ALTER TABLESPACE
,ALTER USER
,CREATE PROCEDURE
,CREATE PROFILE
,CREATE PUBLIC SYNONYM
,CREATE ROLE
,CREATE ROLLBACK SEGMENT
,CREATE SEQUENCE
,CREATE SESSION
,CREATE SYNONYM
,CREATE TABLE
,CREATE TABLESPACE
,CREATE TRIGGER
,CREATE VIEW
,EXECUTE ANY PROCEDURE
,SELECT ANY DICTIONARY
,SELECT ANY SEQUENCE
,SELECT ANY TABLEto '登録したユーザー名'_ROLE;
これらの権限を与えるため
grant '登録したユーザー名'_ROLE to '登録したユーザー名' ;
これでユーザーの登録が完了するはず。
2007年11月29日木曜日
[linux]MySQLの文字コード変更方法
どうやらwebサーバとしてMySQLを使う際に文字コードを変更しなければならないらしい。
それも自分で設定ファイルを作成するとのこと。
#vi /etc/my.cnf
これで新規作成する。
その前に現在の設定を確認する。
mysql> status
で確認できます。
mysql> status;
--------------
./mysql Ver 14.12 Distrib 5.0.27, for pc-linux-gnu (i686) using readline 5.0
Connection id: 7110
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: dtdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.27-Max
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: ujis
Db characterset: ujis
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /tmp/mysql.sock
Uptime: 2 houts 1 min 14 sec
ってな感じになっていると思います。
必ずしも一緒ではないのでご注意。
見てのとおりcharactersetは4種類定義されています。これらを変更するために先ほども書いた設定ファイルを作成します。下記例はEUC-jpに設定しています。
設定する値はSHOW CHARACTER SETで確認できます。
my.cnf
[client]
default-character-set=ujis
[mysqld]
port=3306
default-character-set=ujis
[mysql]
default-character-set=ujis
設定がうまくいったかどうかは、statusで確認してください。
2007年11月22日木曜日
[フリーウェア]CSEでMySQL
Common SQL DeveloperというSQLのかなり優秀なフリーウェアがあるが、oracle接続とかでしか触ってなかったのでMySQLで使ってみようと試みた。
どうやらCSE自体では3以降(?)はODBC接続を行わなければならないらしい。
そんなわけでODBCの設定。
まずはODBCのドライバインストール。
ドライバのインストールだけなので完全インストールである必要はない。
割と早く終わるので終わったら管理ツールにてデータソースの設定。
とりあえずMySQLのODBCを選択して、データソース、ユーザー名、パスワードを入力。
そのほかは空欄でいいはず。
とりあえずこれで設定完了。
後はいつも通りCSE開いて接続してODBC汎用選択して必要事項入力してコネクショーーーン!!
で接続できるはずです。
ん?
なんかいい加減?
2007年11月21日水曜日
[Ruby]簡易掲示板
#! /usr/bin/ruby -Ks
require "rexml/document"
require "open-uri"
require "kconv"
require "cgi"
cgi = CGI.new
# 天気予報
def weather
title = ""
tenki = ""
doc = nil
gaikyou = nil
open('http://weather.livedoor.com/forecast/webservice/rest/v1?city=63&day=tomorrow'){f
doc = REXML::Document.new(f)
}
doc.elements.each("lwws/title"){element
title = element.text.tosjis
}
doc.elements.each("lwws/telop"){element
tenki = element.text.tosjis
}
doc.elements.each("lwws/description"){element
gaikyou = element.text.tosjis
}
puts "#{title}: #{tenki}".tosjis,"\n"
print "\n"
puts "#{gaikyou}".tosjis, "\n"
end
# Webページの表示
print "Content-type: text/html\n\n"
print <
EOF
# プログラム実行
weather
#ヘッダ部出力
print <
EOF
2007年11月19日月曜日
[Linux]Windows上からLinuxのGUIを表示させる vnc
現在業務はWindowsで行ってますが、たまにlinuxを触りたくなるのでそのときいちいちモニタやらを入れ替えるのが面倒です。
なのでwindows上でやれるvncを使います。
vncサーバをlinuxに、vncクライアントをwindowsにそれぞれインストールする必要があります。
linux
「apt-get install vnc vncserver」
vncを起動します。
初回の起動のみパスワードを聞かれます。これは外部PCからアクセスするときに入力するモノです。
「New~~~」と表示されればOKです。
そのままwindowsでvncビューワを実行しても良いのですが、そのままだととても寂しい画面が表示されてしまいます。
実際使うんだったらその画面のまま使いたいですよね?
方法があります。
viエディタを使って「/root/.vnc/xstartup」を編集します。
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
export LANG XMODIFIERS="@im=kinput2"
kinput2 -canna -cannaserver localhost &
exec gnome-session &
色の部分を付け足してください。
※「twm & 」をコメントにして「exec gnome-session &」を付け加える
export以下は日本語入力を可能にさせる設定です。
これでwindows上でlinuxのGUIが使えるようになったともいます。
[Linux]ファイルサーバSamba
これからはGUIをベースに書いていきます。
GUIメニューよりデスクトップ→システム管理→Synaptic パッケージマネージャ
「samba」を検索
samba、samba-client、samba-common
とりあえずこれらをインストール指定にしてください。
全ての指定が完了したら適用してください。
しばらくするとインストールが完了します。
次に設定です。
現在のままでは外部PC(windows他)ではネットワークリソースは存在はしていますが、中にはいることが出来ませんので設定します。
はじめにセキュリティのためにsambaのユーザーとパスワードを設定します。
smbpasswd -a XX ←XXというユーザーを追加する
New SMB password: パスワードを入力する(画面に出てこないのでお間違えのないように)
Added user XX.
となれば成功です。
次にviエディタで「/etc/samba/smb.conf」と入力してください。
設定に必要な部分を見ます。
workgroup = WORKGROUP ワークグループ名を指定する。
netbios name = FILESERVER 共有サーバー名
hosts allow = 192.168.0. 127. Sambaへの接続を許可するIPアドレスを指定する。 の例では
192.168.0.と127.で始まるアドレスのみ接続できる
load printers = no プリンタを共有しないときはnoに変更
security = share ユーザー名とパスワードを使ってアクセス制御する。
encrypt passwords = yes 暗号化したパスワードを使うか。 現在のWindowsはすべて暗号化
パスワードに対応している。
unix password sync = yes SambaとLinuxのパスワードを同期させるか。
これで基本設定は完了します。
共有フォルダを設定したい場合、下に進むにつれて[public]と書いてある場所があります。
[public]
comment = public Space for Everyone
path = /var/samba/public
writable = yes
これをLAN内全て使用できる状態にするには下記のように追加すればよいと思います。
(←から先はコマンドの説明です)
[server] ←共有名
comment = public Space for Everyone←コメント
path = /var/samba/public←共有したいディレクトリのパス
writable = yes←書き込み許可
read only = no←読み込み専用
guest ok = yes←ユーザー以外の使用
public = yes←パスワードなしでのアクセスを許可。アクセス制限を「share」に設定する必要あり
browseable = yes←共有フォルダの一覧に表示させるようにする。noなら隠しになる
create mask = 0777←共有ファイルに作成されるファイルパーミッションを設定
create masl = 0777←共有フォルダに作成されるファイルパーミッションを設定
これを上書き保存してviエディタを終了してください。
最後にsambaを再起動してください。
/etc/rc.d/init.d/smb restart
システムが起動したときに自動起動の設定をします。
chkconfig smb onと入力してください
chkconfig --listと入力すると自動起動の確認が出来ます。
「smb 3:on4:0n5:0n」
となっているのを確認してください。
確認方法は、実際に共有のパスをアドレスに入力してください。
[Linux]Webサーバ「Apache」のインストールと設定
OSのインストールをする際に完全インストールまたはインターネットサーバを選択しておけばインストールされています。
現在インストールされているのはApache2ですが、業務で使っているのがApache1.3なのでまずはダウングレードします。
「apt-get remove apache2」で削除し「apt-get install apache」でインストールします。
Apacheを起動してインストールされているかを確認します。
起動のコマンドは「/etc/rc.d/init.d/httpd start」
ちなみに「/etc/rc.d/init.d」コマンドはアプリの起動や停止、再起動などでよく使うので覚えておいて損はしません。
確認方法は、webブラウザを起動して「http://localhost/(またはIPアドレス)」を入力し実行すると、テストページなるモノが表示されるはずです。
表示されなかった場合は何らかの失敗があるか、設定が必要だと思います。
次に設定について。
コマンド入力に「vi /etc/httpd/conf/httpd.conf」と入力してください。
ちなみに「vi」とはviエディタのことです。
viエディタでhttpd.confというファイルを編集するという意味です。
開くとものすごい量のテキストが表示されます。
編集したい場所をスクロールで探すのも結構苦労します。
そのときに検索しますよね?
windowsの検索とやり方が違うので注意してください。
viエディタは入力モードとコマンドモードというモノがあります。
入力モードはテキスト入力、コマンドモードはviエディタのコマンド入力で切り替え方は、入力モードのトキは「a」キー入力、コマンドモードは「etc」キー入力で切り替えます。
さて問題の検索方法ですが、コマンドモードに切り替え「/」の後に探したい文字列を入力してください。
例)サーバの名称の設定を探すとき「/ServerName」
すると検索文字列を探します。
もし選択された文字列が編集したい場所と違うときは「n」キーを入力してください。
すると次を検索します。
さてこれで一通りapacheの設定をしようと思います。
CGIを使えるようにする
どうやらApacheの標準設定ではCGIが使えないみたいです。
なので設定の変更をします。
まずCGIを使うにはperlが必要らしいのでperlのインストールを行います。
「apt-get install perl」
もしインストールされていた場合、されているとメッセージが出るので確認のためにやってみるのもいいと思います。
CGIの実行を許可するには、
「#AddHandler cgi-script .cgi」の「#」を外してください。
※「#」はコメントです。
これで設定は終わりです。
他にもいろいろと設定がありますが、詳しくはここを見ておけば大丈夫だと思います。
http://vine.1-max.net/apache.html
最後に保存と終了方法ですが、viエディタのコマンドモードで「:w」と入力してください。
その後「:q」と入力してください。
「:w」は上書き保存「:q」は終了です。
モノ2つの動作をまとめて行いたいときは「:wq」と入力してください。
パーミッションの変更
設定がOKでも外部で見ることが出来ないなら意味がありませんよね。
そこでフォルダの読み出しの許可を設定します。
「chmod 755 home/httpd/cg-bin」と入力してください。
もしならなかったのであれば、GUIで見た方がいいでしょう。
「コンピュータ→ファイルシステム→home→httpd」と入っていくと「cgi-bin」フォルダが見つかると思います。
それを右クリックしプロパティを選択してください。
アクセス権タブの読み込みと実行の全てのチェックをしてください。
数値形式が「1600755」になればOKです。
これでパーミッションの設定も完了しました。
Apacheを再実行して、cgi-binフォルダに適当なcgiファイルをおいて、検証してみてください。
最後に自動起動の設定をします。
chkconfig httpd onと入力してください。
chkconfig --listと入力し、
「httpd 3:on4:on5:on」
となっているのを確認してください。
[Linux]apt-getコマンド
とりあえずインストール済みという仮定のもと書きますね。
使用するOSは「Vine Linux4.1」ですが、コマンドの場合特に代わりはないので気にせず始めましょう。
ルートでログインしてください。
まずはアップグレード「apt-get upgrade」
メニューにある「GNOME端末」というコマンドライン端末を使用します。
※もしここで「root」以外でログインしている場合は「su -」と入力してください。
その後パスワードの入力を求められるので「root」のパスワードを入力してください。
「apt-get update」と入力して、最新のアップデート情報を取得してください。
※最新のアップデート情報が存在する場合「apt-get upgrade」を入力してください。
今回はOS全体のアップグレードを行うので「apt-get dist-upgrade」を入力してください。
時間はかかりますが、これでアップグレードの完了です。
もしネットにつながらないなどの場合はネットワークの設定を見直してください。
パッケージのインストール「apt-get install パッケージ名」
パッケージ=アプリケーションと思ってください。
apacheをインストールしたいなら「apt-get install apache」の用に入力すれば、インストールされます。
MySQLやこの後紹介するSambaのインストールを行う場合、複数インストールを行います。
その際いちいち一つずつインストールするのでは手間がかかりますよね?
その手間を省くには、「apt-get install」の後に、パッケージを空白置きに書いていってください。
例)「apt-get install MySQL-server MySQL-Max Mysql-client」
パッケージ削除「apt-get remove パッケージ名」
インストールがあるなら当然アンインストールもあります。
書き方はインストールと代わりありません。
「install」を「remove」に変えるだけです。
とりあえず必要なところはこれくらいですかね。
2007年11月17日土曜日
まとめ
とりあえず今まで自分で作ったり、業務で覚えたことをまとめてみました。
入社して勉強してきた過程でこれらのことが自分で出来るようになれてホントよかったです。
まぁまだまだですけどね。
ゲームプログラミングで大体C言語を覚えて、それから入社していろんな言語を覚えてきたけど
、やっぱし基本をしっかり身につけないと危険ですね。
さてはじめははてなブログで書いてました。
ソースコードが色付けで表示されるというところはよかったんだけれどあまりにも使いにくかったのであけました。
現在過去含め合計10個くらい(移転とか内容別に書いたりとかで)ブログを書いてきましたが、アレは初めてですね。
慣れるしかないのね。
さて今の業務が終わったら、社内サイトシステムを2人でがんばって作り上げていく予定です。
Ruby覚えたりLinux覚えたりとまたタイヘンですけど、まぁ興味があれば何でもやるのでなるようになるでしょう。
次回はLinuxのことでも書いて行こうと思います。
今現在中でLinux扱える人俺しかいないみたいなんで(本当かなぁ?)、いなくなってもいいようにかけること書いていきますね。
いとふゆ
[C#]時間数値化、数値時間化、月末日付をまとめたC#用クラス
public class Common
{
CSScript cs = new CSScript();
//*** strTimeに入っている値を数値(分)に変換して返します。 ***
// strTime : 計算対象の時間。必ずhh:mm形式で入力するようにしてください。
// 変換できないときは0を返します。
public int 時間_数値化(string strTime)
{
int wkHour;
int wkMinute;
if( strTime == null)
{
return 0;
}
//時間を取得
wkHour = (int)CSScript.Val(CSScript.Left(strTime, strTime.IndexOf(":", 1) - 1));
wkMinute = (int)CSScript.Val(CSScript.Right(strTime, 2));
try{
return wkHour * 60 + wkMinute;
}catch(Exception){
return 0;
}
}
//*** ↑の処理で数値化された時間を元に戻します。変換失敗時は空文字列を返します ***
public string 数値_時間化(int lngTime)
{
if(lngTime == 0)
{
return "";
}
try
{
return CSScript.Fix(lngTime / 60, 0) + ":" + string.Format( "00", lngTime % 60);
}catch(Exception){
return "";
}
}
//*** 月末日付を取得します ***
// 変換できなかった場合は0を返します。
public int 月末日付(string strMonth)
{
DateTime dt =DateTime.Now;
return DateTime.DaysInMonth(dt.Year, (int)CSScript.Val(strMonth));
}
VBで作ったのをC#にする際に、勢いのままクラスも直していたのでついでなので乗せておきます。
ってかなんかインデントがおかしい
[C#]文字列操作関係クラス
public class CSScript
{
#region "IsNull"
//空白判定(戻り値:True=空白, False=空白では無い)
public bool IsNull(string text)
{
//空文字判定
if( text == null)
{
return true;
}
//""文字判定
if( text == "")
{
return true;
}
return false;
}
#endregion
#region"NZf"
//空文字を変換
public int NZf(string a)
{
if(IsNull(a) == true )
{
return 00;
}
else
{
return (int)Val(a);
}
}
#endregion
#region Left メソッド
/// -----------------------------------------------------------------------------------
///
/// 文字列の左端から指定された文字数分の文字列を返します。
///
/// 取り出す元になる文字列。
///
/// 取り出す文字数。
///
/// 左端から指定された文字数分の文字列。
/// 文字数を超えた場合は、文字列全体が返されます。
/// -----------------------------------------------------------------------------------
public static string Left(string stTarget, int iLength)
{
if (iLength <= stTarget.Length) { return stTarget.Substring(0, iLength); } return stTarget; } #endregion #region Mid メソッド (+1) /// ----------------------------------------------------------------------------------- ///
/// 文字列の指定された位置以降のすべての文字列を返します。
///
/// 取り出す元になる文字列。
///
/// 取り出しを開始する位置。
///
/// 指定された位置以降のすべての文字列。
/// -----------------------------------------------------------------------------------
public static string Mid(string stTarget, int iStart)
{
if (iStart <= stTarget.Length) { return stTarget.Substring(iStart - 1); } return string.Empty; } /// ----------------------------------------------------------------------------------- ///
/// 文字列の指定された位置から、指定された文字数分の文字列を返します。
///
/// 取り出す元になる文字列。
///
/// 取り出しを開始する位置。
///
/// 取り出す文字数。
///
/// 指定された位置から指定された文字数分の文字列。
/// 文字数を超えた場合は、指定された位置からすべての文字列が返されます。
/// -----------------------------------------------------------------------------------
public static string Mid(string stTarget, int iStart, int iLength)
{
if (iStart <= stTarget.Length) { if (iStart + iLength - 1 <= stTarget.Length) { return stTarget.Substring(iStart - 1, iLength); } return stTarget.Substring(iStart - 1); } return string.Empty; } #endregion #region Right メソッド (+1) /// ----------------------------------------------------------------------------------- ///
/// 文字列の右端から指定された文字数分の文字列を返します。
///
/// 取り出す元になる文字列。
///
/// 取り出す文字数。
///
/// 右端から指定された文字数分の文字列。
/// 文字数を超えた場合は、文字列全体が返されます。
/// -----------------------------------------------------------------------------------
public static string Right(string stTarget, int iLength)
{
if (iLength <= stTarget.Length) { return stTarget.Substring(stTarget.Length - iLength); } return stTarget; } #endregion #region Val メソッド (+2) /// ----------------------------------------------------------------------------- ///
/// 指定した文字列に含まれる数値を変換して返します。
///
/// 任意の有効な文字列。
///
/// 指定した文字列に含まれる数値。
/// -----------------------------------------------------------------------------
public static double Val(string stTarget)
{
// Null 値の場合は 0 を返す
if (stTarget == null)
{
return 0;
}
int iCurrent = 0;
int iLength = stTarget.Length;
// 評価対象外の文字をスキップする
for (iCurrent = 0; iCurrent < chone =" stTarget[iCurrent];">= iLength)
{
return 0;
}
bool bMinus = false;
// 先頭にある符号を判定する
switch (stTarget[iCurrent])
{
case '-':
bMinus = true;
iCurrent++;
break;
case '+':
iCurrent++;
break;
}
int iValidLength = 0;
int iPriod = 0;
double dReturn = 0D;
bool bDecimal = false;
bool bShisuMark = false;
// 1 文字ずつ有効な文字かどうか判定する
while (iCurrent < chcurrent =" stTarget[iCurrent];" chcurrent ="="" chcurrent ="="" chcurrent ="="" chcurrent ="="" chcurrent ="="" chcurrent ="="" dreturn =" (dReturn">= '1') && (chCurrent <= '9')) { iCurrent++; iValidLength++; dReturn = (dReturn * 10) + double.Parse(chCurrent.ToString()); } else if (chCurrent == '.') { iCurrent++; if (bDecimal) { break; } bDecimal = true; iPriod = iValidLength; } else if ((chCurrent == 'e') (chCurrent == 'E') (chCurrent == 'd') (chCurrent == 'D')) { bShisuMark = true; iCurrent++; break; } else { break; } } int iDecimal = 0; // 小数点が判定された場合 if (bDecimal) { iDecimal = iValidLength - iPriod; } // 指数が判定された場合 if (bShisuMark) { bool bShisuValid = false; bool bShisuMinus = false; double dCoef = 0D; // 指数を検証する while (iCurrent < chcurrent =" stTarget[iCurrent];" chcurrent ="="" chcurrent ="="" chcurrent ="="" chcurrent ="="" chcurrent ="="">= '0') && (chCurrent <= '9')) { dCoef = (dCoef * 10) + double.Parse(chCurrent.ToString()); iCurrent++; } else if (chCurrent == '+') { iCurrent++; } else if ((chCurrent != '-') bShisuValid) { break; } else { bShisuValid = true; bShisuMinus = true; iCurrent++; } } // 指数の符号に応じて累乗する if (bShisuMinus) { dCoef += iDecimal; dReturn *= System.Math.Pow(10, - dCoef); } else { dCoef -= iDecimal; dReturn *= System.Math.Pow(10, dCoef); } } else if (bDecimal && (iDecimal != 0)) { dReturn /= System.Math.Pow(10, iDecimal); } // 無限大の場合は 0 を返す if (double.IsInfinity(dReturn)) { return 0; } // マイナス判定の場合はマイナスで返す if (bMinus) { return -dReturn; } return dReturn; } /// ----------------------------------------------------------------------------- ///
/// 指定した文字に含まれる数値を変換して返します。
///
/// 任意の有効な文字。
///
/// 指定した文字に含まれる数値。
/// -----------------------------------------------------------------------------
public static int Val(char chTarget)
{
return (int)Val(chTarget.ToString());
}
/// -----------------------------------------------------------------------------
///
/// 指定したオブジェクトに含まれる数値を変換して返します。
///
/// 任意の有効なオブジェクト。
///
/// 指定したオブジェクトに含まれる数値。
/// -----------------------------------------------------------------------------
public static double Val(object oTarget)
{
if (oTarget != null)
{
return Val(oTarget.ToString());
}
return 0D;
}
#endregion
#region Fix
/// ------------------------------------------------------------------------
///
/// 指定した精度の数値に切り捨てします。
///
/// 丸め対象の倍精度浮動小数点数。
///
/// 戻り値の有効桁数の精度。
///
/// iDigits に等しい精度の数値に切り捨てられた数値。
/// ------------------------------------------------------------------------
public static double Fix(double dValue, int iDigits)
{
double dCoef = System.Math.Pow(10, iDigits);
return dValue > 0 ? System.Math.Floor (dValue * dCoef) / dCoef:
System.Math.Ceiling(dValue * dCoef) / dCoef;
}
#endregion
}
C#です。はいC#ですよ。
お前出来んのかよ!とか聞かないでください。
VBのフォーム制御をCやJavaで書いてるって感覚だけでやってるんですから。
さて雑談はこれくらいにしておいて。
文字列操作です。
VB6にある関数や、先にも書いた関数があります。
まぁ半分コピーですけどね。
VB6にある関数は結構便利だったりします。
C#にあるかもしれないけど、言語が変わっても大丈夫だと思えるようにしたいのでこれを作ってみました。
[VB]月末日付取得
'*** 月末日付を取得します ***
' 変換できなかった場合は0を返します。
Public Function 月末日付(ByVal strMonth)
'*** 月末日付を取得します ***
' 変換できなかった場合は0を返します。
Public Function 月末日付(ByVal strMonth)
Dim dt As DateTime = DateTime.Now
月末日付 = 0
On Error Resume Next
月末日付 = Date.DaysInMonth(dt.Year, strMonth)
End Function
時間数値化と同じ内容のときにあったものです。
俺がなかったら今頃この仕事やめてます。
ウソですw
.NETと書いているけれどVBでも使えるはずです。
元はExcelVBAなんで。
[VB.NET]時間を数値化、数値を時間化
Public Class Common
Dim cs As New CSScript
'*** strTimeに入っている値を数値(分)に変換して返します。 ***
' strTime : 計算対象の時間。必ずhh:mm形式で入力するようにしてください。
' 変換できないときは0を返します。
Public Function 時間_数値化(ByVal strTime As Object) As Long
Dim wkHour As Long
Dim wkMinute As Long
If strTime = "" Then
時間_数値化 = 0
Exit Function
End If
'時間を取得
On Error Resume Next
wkHour = Left(strTime, InStr(1, strTime, ":") - 1)
wkMinute = Right(strTime, 2)
If Err.Number = 0 Then
時間_数値化 = wkHour * 60 + wkMinute
Else
時間_数値化 = 0
End If
End Function
'*** ↑の処理で数値化された時間を元に戻します。変換失敗時は空文字列を返します ***
Public Function 数値_時間化(ByVal lngTime) As String
If cs.IsNull(lngTime) Then
数値_時間化 = ""
Exit Function
End If
On Error Resume Next
数値_時間化 = Fix(lngTime / 60) & ":" & Format(lngTime Mod 60, "00")
If Err.Number <> 0 Then
数値_時間化 = ""
End If
End Function
End Class
前にやった業務(トラウマ)でこんなことをしていたので、使えるかもしれないからメモっておきますね。
まぁこれの元が滅茶苦茶なExcelVBAで、VB.NETで使いたくなって少し改変したのだけれど、
メソッド名が漢字なのはその名残だと思ってください。
[VB.NET]空白判定と空文字変換
空白判定「IsNull」
'空白判定(戻り値:True=空白, False=空白では無い)
Public Function IsNull(ByVal text As String) As Boolean
'Nothing判定
If IsNothing(text) = True Then
Return True
End If
'空文字判定
If text Is String.Empty Then
Return True
End If
'""文字判定
If text.Trim = "" Then
Return True
End If
Return False
End Function
空文字判定「NZf」
'空文字を変換
Public Function NZf(ByVal a As Object)
If IsNull(a) Then
NZf = "00"
Else
NZf = a
End If
End Function
どんな経緯で使ったかは覚えてないけれど、あったら助かったクラスより抜粋。
「NZf」は「IsNull」がないと使えないという罠は気にしてはいけないのですよ。
[VB]文字列から特定の文字を抜き出し表示する
'必要な変数の宣言
Dim strArray() As String
Dim strTxt As String
'対象の文字列
strTxt = "2007/11/16"
'Splitを利用して対象の文字列を"/"で区切り、配列に代入する
strArray = Split(strTxt, "/")
'"/"で区切れた文字列をつなげる
Textbox.Text = strArray(0) & strArray(1) & strArray(2)
結果:

今回は"/"で区切る。
区切りの数が多くなった場合どうしたらいいのかな?
Forで回せば大丈夫だと思いたい。
とりあえず現在の業務終了予定。
絶対ダメ出し食らうけど、こっちもこっちで言い訳があるんでまぁ五十歩百歩だろうね。
[VB]あるデータを2つのテキストボックスに分割して表示させる方法
'必要な変数を宣言
Dim iFind As Integer
Dim stTarget As String
'初期化
stTarget = "11:00"
'先頭から':'を検索し、見つかった位置を取得する
iFind = InStr(1, stTarget, ":")
'先頭から↑で見つけた':'の一つ手前の位置までの文字列を取得する
textbox1 = Mid$(stTarget, 1, iFind - 1)
'↑で見つけた':'の一つ後ろから末尾の文字列を取得する
textbox2 = Mid$(stTarget, iFind + 1)
結果:

チョッチ仕様変更と来て、DBへの登録はいいものの表示になるとどうしたらよいものかと調べたら、いい感じに検索方法を2つ見つけたので組み合わせてみたらできた。
「InStr」は文字の検索方法です。
今回は時間を分割表示したいなど(あるとは思わないけど)、':'の位置を取得してます。
例では先頭からということで'1'を指定していますが、ここは2文字目でも4文字目でも指定可能です。
「Mid$」は文字列の一部を取得する方法です。
1では先頭から「InStr」で取得した':'がある位置の一つ手前までの文字列を取得しています。
2では「InStr」で取得した':'がある位置の一つ後ろから末尾の文字列を取得してます。
末尾なので引数省略が可能となってます。
説明って難しいね。