カテゴリー: Development

PHP覚書 MDB2 oci8_11gで接続(苦戦)

MDB2Oracle11gに接続しているのだが、なんだか実行速度が遅い。
これはひょっとすると、Oracle10gのクライアントをちゃんとアンインストールしなかったからなのでは?
と思い、Oracle関係のファイルをすべてアンインストール後、再度11gを入れなおしたのだが、これが災いして、11gに接続できなくなった。

php_oci8_11g.dllはモジュールが見つからないとかアラームが出て、Apacheもまともに起動できなくなった。

ウゲェ~

と思い、2,3日を悶々と過ごし、ようやく再接続に成功した。

原因がよくわからないのだが、
結局は、アンインストールしても環境変数にゴミが残ってしまっててダメだったようだ。
環境変数のPathやTNS_ADMINが正しく設定されているか確認後、Windowsを再起動してApacheは起動できた。
phpinfoで確認して、oci8が動作していることも確認。

で、実行速度は・・・と言えば、変わらなかった。
タイムアウトでシステムエラーになるので、php.iniのmax_execution_timeの値を変えてみて、とりあえずエラーにはならないようにしたのだが。

結局SQL文が悪いのか?

VB.net覚書 CSVファイルを読む

どこにでもTipsはあるが、メモ

Imports System.IO.StreamReader を忘れずに。

'Shift-JISでpathのファイルを全量取り込んでClose
Dim sr As StreamReader = New StreamReader(path, System.Text.Encoding.GetEncoding("Shift-JIS"))
Dim buf As String = sr.ReadToEnd()
sr.Close()

'改行コードで分断
Dim buf_line() As String = csv_buf.Split(vbCrLf)
Dim buf_item() As String
Dim cnt As Integer = buf_line.Length

'空ファイルである場合終了
If line_cnt <= 0 Then
    Return False
End If

'csvを1行ずつ処理
Dim i As Integer = 0
For i = 1 To cnt - 1 Step 1
    buf_line(i) = buf_line(i).Replace(vbCr, "").Replace(vbLf, "").Trim()
    If buf_line(i) <> "" Then    'Length>0の方がいいかも
        buf_item = buf_line(i).Split(",")
    End If
Next i

CRCLでぶちってもLFが残るみたいなので、カンマでSplitする前に改行コードを全部Replaceさせた。
普通はCRだけででぶちって、LFは改行として使うのだろう。(セル内改行として必要な場合がある・・・)

全量一括で取り込んだ方が、速度としては早い。
(メモリは喰うので、大量の場合は1行ごとに取り込んだ方がよいのだろう)

Oracle覚書 CREATE USER

ようやくOracle。
Silver Fellowという資格は持っているが、とったのが10年ほど前なのでもう忘れてしまった。

仕事で使わないと忘れてしまうのですよ。

もうDBはできているという前提で。
(DBは管理ツールで作成できるんで、まぁいいとしても、SYSTEM権限のPWって、どうやって決めるのだ・・・と思いつつ、後日に持越し)

CREATE USER [USER_NAME] IDENTIFIED BY [PASSWORD];
GRANT CREATE SESSION TO [USER_NAME];

で、とりあえずユーザをつくって権限を与えるところまで完了。
テーブルとかは、Object Browzerで作るからまぁいいや。

PostgreSQL覚書 日時の差分を日数で取得する方法

日付の差分を日数で取得する方法
first_date,last_dateがTimestamp型の場合、差分は1day 10:20:30 みたいに、日数と時間で表示される。

だけど、日数だけで取得したいときは、

SELECT first_date,last_date, cast(last_date as DATE) – cast(first_date as DATE) term FROM [table_name]

と、キャストして実行するそうだ。
勉強になった。

SQLServer覚書:PostgreSQLを参照する(WinXP/SQLServer2008)

ネットでいろいろ調べてようやく参照できるようになったので、メモ。
PostgreSQLのODBC Driverはすでにインストール済みとして書いてるよ。

まずは、コンパネ→管理ツール→Microsoft ODBC アドミニストレータで、システムDNSにODBCの接続設定を追加する。
(ユーザーDNSじゃないところがポイント)

次に、SQLServerを開いて、新しいリンクサーバーを作成する。
「全般」ページで以下を設定。
 サーバの種類はその他のデータベース。
 プロバイダは Microsoft OLE DB Provider ODBC Drivers
 製品名はPostgreSQL
 データソースは、最初に作成したODBC接続設定の名称

「セキュリティ」ページで以下を設定。
 このセキュリティコンテキストを使用するを選択して、
 リモートログインとパスワードにPostgreSQLのDBのユーザー名とパスワードを入力。

これで、OKボタンを押せば、リンクサーバが出来上がり。

あとの注意点は、Select文は、OPENQUERYを使うというところ。

SELECT * FROM OPENQUERY([リンクサーバ名],’SELECT * FROM [スキーマ名(public)].[テーブル名]’)

といった感じ。

丸一日かかって、OracleとPostgreSQL両方のDBを参照するやり方がわかった。
やっぱり、勉強が足りないな。

[追記:64bit版OS利用時(WindowsServerとか)]
64bit版OSの場合は、PostgreSQLのODBC Driver(64bit版)をインストールすれば、あとは同様に処理ができるようである。

他のサイトでもこの手の記事は多いんだけど、設定のテキストボックスに何を入れていいかまで書いてないのだ。
ここまで書いてもらえないと、応用力がないのでわからんのよ、私は。

Windows8 Pro

とりあえず、アップグレード版を購入して、VirtualBoxに入れてみる。
今使っているPCのOSは、Win7。
だけど、もともとWinXPのアカウントが1個あまってるので、アップグレードは7からというより、XPからのアップグレードというつもりで買った。

まぁ、今使ってるノートPCにアップグレードして失敗したら洒落にならない。
で、私、VirtualBox使うのも初めて・・・

ってか、Win8に設定して起動。って、動かないし・・・

vt-xがどうのこうのってエラーが起きて起動しないよ・・・

ということで、まずはBIOSの設定で、Virtualization TechnologyをEnabledにして再起動。
今度は、とりあえずうまくいくが、インストールすぐにエラー。

メモリが4GBないと駄目って・・・

しょうがないからメモリを4GBに設定。
(こんなにメモリがいるんじゃ、WinXPの入った古いノートPCにアップできないじゃないのよ!!とか思うけど、まぁしょうがない。)

で、XPを入れてからアップデートでWin8にしようとしたところ、ドライバーがないとかで失敗。
Win8のDVDで一からインストールすると、なんとか入ってくれた。
(なーんだ、はじめからDVD入れたらよかったんジャン・・・馬鹿な私)

なんとか入ってくれたヨ。
とりあえず、今日は寝て、明日から使ってみよう・・・って思ったらもう明日になってしまった。

PostgreSQL覚書 Tableの内容をファイル保存

psqlでテーブルの内容をドカーンとファイルに落とす。

psql
DB名 #= COPY [テーブル名] TO [ファイル名] (FORMAT csv);

ファイル名のところは、
E’D¥:¥¥xxx.csv’

というように、エスケープ処理が必要になることを忘れない。

逆に、CSVファイルのデータをテーブルに保存する場合は、

psql
DB名 #= COPY [テーブル名] TO [ファイル名] with csv;

PostgreSQL覚書 コマンド文字化け対応(Win)

psqlのコマンドのエラーが文字化け・・・

エンコードがUTF8になっているのが原因なので、都度エンコードをWindows用にSJISにしてあげる。

psql
DB名#= ¥encoding;

で現在の文字コードが確認できる。

psql
DB名#= ¥encoding SJIS;

で文字コードをSJISにしてくれる。

ActionScript3.0覚書 コンボボックスのTextFormat設定

ライブラリに含まれているコンボボックスのフォントを変更したいときは、スクリプトで設定する。
ラジオボタンやテキストボックスならば、

obj.setStyle(‘textFormat’,tf);

と書いてしまえば済むが、コンボボックスの場合はテキスト部分と、下に表示されるプルダウン部分両方の書式設定が必要となる。

//obj変数には、コンボボックスのインスタンスを設定しておく
var tf:TextFormat = new TextFormat("MS ゴシック", 18, 0x333333, true);

obj.textField.setStyle('textFormat',tf);
obj.textField.setStyle('disabledTextFormat',tf);
obj.dropdown.setRendererStyle('textFormat',tf);
obj.dropdown.rowHeight = 28;

ついでにrowHeightで、フォントサイズに見合った行の高さを設定しておくとよい。

ActionScript3.0覚書 ブラウザからAIR起動

久しぶりにActionScriptをやった。

ブラウザからローカルにインストールされているAIRアプリを起動する方法。
起動時にブラウザを閉じる処理を入れているけれど、これだと確認ダイアログが出てくるので、実際は別のJavaScriptを読んでいる。

launchApplicationは、マウスクリックイベントとかでしか動かない。
dispatchEventとかでマウスクリックイベントを無理やり呼び出してみたけど、launchApplicationだけ動かなかった。(他の行は動いてんのにぃ・・・)

package {

	import flash.net.URLRequest;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.system.LoaderContext;
	import flash.system.ApplicationDomain;
	import flash.events.Event;
	import flash.events.MouseEvent;

	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.display.Sprite;
	import flash.external.ExternalInterface;
	import flash.events.EventDispatcher;

	[SWF(width=600,height=120,backgroundColor=0xffffff)]
	public class Main extends Sprite {

		private var air_url:URLRequest = new URLRequest("http://airdownload.adobe.com/air/browserapi/air.swf");
		private var air_swf:Object = null;
		private var appID:String = "xxxxxxxxxx";
		private var pubID:String = "";
		private var args:Array;
		private var tx1:TextField = new TextField();
		private var btn:Sprite = new Sprite();

		public function Main() {
			tx1.defaultTextFormat = new TextFormat("", 12, 0x0033ff, true);
			tx1.autoSize = "left";
			tx1.x = 0;
			tx1.y = 10;
			tx1.width = 600;
			tx1.selectable = false;
			addChild(tx1);

			// air.swf起動
			var loader_obj:Loader = new Loader();
			var info:LoaderInfo = loader_obj.contentLoaderInfo;
			var loader_context:LoaderContext = new LoaderContext();
			loader_context.applicationDomain = ApplicationDomain.currentDomain;
			info.addEventListener(Event.INIT , loadInit);
			loader_obj.load(air_url,loader_context);
		}

		// 初期状態
		private function loadInit(e:Event):void {
		air_swf = e.target.content;
		try {
			tx1.text = "しばらくお待ちください。" ;
			air_swf.getApplicationVersion( appID, pubID, getVersion);
		} catch( err:Error ) {
			tx1.text = err.message ;
		}
		}

		// バージョン確認
		private function getVersion(version:String):void {
			if (version == null) {
				tx1.text = "アプリがインストールされていません。" ;
			} else {
				tx1.text = "下のボタンをクリックして、アプリを起動してください。" ;
				btn = createButton();
				addChild(btn);
				btn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
				air_swf.launchApplication( appID, pubID, args);
					ExternalInterface.call("window.close()");
				});
			}
		}

		// ボタン生成
		private function createButton():Sprite{
			var tx:TextField = new TextField();
			var btn:Sprite = new Sprite();

			tx.width = 100;
			tx.defaultTextFormat = new TextFormat("", 20, 0xffffff, true);
			tx.text = " 起動 ";
			tx.autoSize = "center";
			tx.x = 0;
			tx.y = 8;
			tx.selectable = false;
			btn.addChild(tx);

			btn.graphics.lineStyle(1, 0xBBBBBB);
			btn.graphics.beginFill(0x9933ff);
			btn.graphics.drawRoundRect(0, 0, tx.width, 40, 20, 20);
			btn.graphics.endFill();
			btn.x = 100;
			btn.y = 50;
			return btn;
		}
	}
}

appIDには起動させるAIRのアプリIDを設定。
また、起動時に引数を渡したいときは、launchApplicationの3つめの引数にセットしておく。

起動させるAIR側は、ブラウザからの起動を可能にするため、(xxx)-app.xmlのallowBrowserInvocationタグ内をtrueにセットしておく。

 <allowBrowserInvocation>true</allowBrowserInvocation>

CSS覚書 :nth-childの使い方(1データ複数行の場合)

:nth-childの使い方を調べていたのだけれど、やってみたら「???」な記事もあったので、Firefoxで動作確認した具体的な情報を載せておく。

1データ2行で構成されているテーブルの場合は以下の通り。

table tr:nth-child(4n),
table tr:nth-child(4n-1) {
    background: #fff;
}
table tr:nth-child(4n-2),
table tr:nth-child(4n-3) {
    background: #f0f0f0;
}

「table」の横にクラス名をつけて(「table.classname」みたいに)、1データ1行のテーブルと分けておくとよい。
CakePHPをやっていると、CSSの勉強にもなってウレシイ。

CakePHPはじめてみた

CakePHPを使えば楽にWebサービスを作ることができるよ!

と言ってたので、時間を見つけてやり始めることに。
インストールして、チュートリアルを見ながら一つずつファイルを作成して、

ほうほう、なるへそ。こいつは早い

って感心したのだが、もっと早くできる方法。

そう焼くんだよ。Bakeだよ。

ってあるのは知ってたけど、

いや、これも勉強だよ!

って、使わずにいたけど、やっぱりやり方を知っておいた方がいいわね、と思ってコマンドプロンプトを開いてやってみたら・・・

はやっ!!!

早すぎ。おまけに完璧。
あぁ、そういうことなのね。人の忠告(じゃないけど)には素直に従うものです、ハイ。

Apache覚書 WindowsXP Virtual Hostの設定

色んな開発案件があって、その都度httpd.confのDirectory設定を変えていたが、いい加減Virtual-Host設定をして複数のプロジェクトを同時に見えるようにしとかなきゃ!!って思って1か月、いや2か月?

とりあえず、仕事が1つ一段落したので、ちょっとやってみた。
環境はWindowsXPなので、
C:\WINDOWS\system32\drivers\etc\hostsファイルを開く

127.0.0.1 localhost

という記載の後に、同じような感じで設定を付け足す。
例えば、
127.0.0.1 test1.localhost
127.0.0.1 test2.localhost

みたいな感じ。行右側に「#」付で何のサーバなのか書いておくと分かりやすいかも。

次は、Apacheのconf/httpd.confファイル。ここに各Directory単位の設定を設ける。
<Directory “D:/Apache2.2/htdocs/test1”>
    Order allow,deny
    Allow from all
</Directory>
<Directory “D:/Apache2.2/htdocs/test2”>
    Order allow,deny
    Options All
    llowOverride All
    Allow from all
</Directory>

そして、conf/httpd.confファイル内で、VirtualHostの設定ファイルを使うよ!宣言をする。(ってか、VirtualHost設定ファイルを読み込みます!設定をする)
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
Includeの左についている「#」を外して、ファイルを保存。

最後は、conf/extra/httpd-vhosts.confファイルの編集。
<VirtualHost *:80>
    ServerAdmin xxx@xxxxx.co.jp
    DocumentRoot “D:/Apache2.2/htdocs/test1”
    ServerName test1.localhost
    ErrorLog “logs/t1-error.log”
    CustomLog “logs/t1-access.log” common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin xxx@xxxxx.co.jp
    DocumentRoot “D:/Apache2.2/htdocs/test2”
    ServerName test2.localhost
    ErrorLog “logs/t2-error.log”
    CustomLog “logs/t2-access.log” common
</VirtualHost>

ルートフォルダをそれぞれ別のフォルダに設定、サーバー名はhostsの設定に合わせ、ログファイルも別に設定しておけば、わかりやすい。
これを保存して、Apacheを再起動。
http://test1.localhost/とhttp://test2.localhost/と、それぞれページの出力を確認できたら、うまく設定できたことに。

Apache覚書 rewriteを有効にする

httpd.confの編集を行う。

  • 1つ目
    LoadModule rewrite_module modules/mod_rewrite.so
    の左の「」を取る
  • 2つ目
    <Directory>
      Options FollowSymLinks
      AllowOverride None
      Order deny,allow
      Deny from all
    </Directory />
    というようなDirectory設定の場合、
    <Directory>
      Options All
      AllowOverride All
      Order deny,allow
      Deny from all
    </Directory>
    に書き直す

以上で、Apache再起動後、rewriteが有効に

jQueryで並び替えしたいけど、できなかった話

jQueryのSortable機能を利用して、要素の並び替えがドラッグ&ドロップでできるらしく、人のコードを真似して作ってはみたのだが・・・・

IEとFirefoxその他では、挙動が違う!!

ってことで、あぁ・・・困った。
こういうことが起こると、IEなんぞいつまで開発するんだ!って思う。
(勘弁してほしいのね)

Firefoxならば、UL構造でもTABLE構造でもちゃんと動くのだけれど、IEはULなら動くけど、TABLEの場合、

1) TBODYタグを追加して、そのTBODYタグをid=”sortable”にするということ
2) TABLEタグをstyle=”position:relative;”にすること

が必要なのだ。
全くめんどっちぃ=と思うが、とりあえずここまではOK。

ところが、TABLEをさらにDIVタグで囲んでいるところ(※)があって、そこはどうしてもうまくいかなかった。1つめの並び替えは問題なくいくのだが、続けてドラッグ&ドロップすると、半透明で表示される要素がカーソルの位置ではなく上の方にあるではないか・・・

どうも、並び替えた後の位置が正しく設定されていないようで、アレコレと無い脳みそをフル活動させてみたのだが、どうも私には無理!な範疇に入ってしまったようなので、もう、DIVの中身のTABLEをUL構造に変更して事なきを得た。

(※)表示範囲が決まっているけどTABLEがデカいということで、DIVタグ内でスクロールさせている。これのせいで、どうもうまくいかない。

結局、解決はできなかったという、悲しいお話。