カテゴリー: Development

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タグ内でスクロールさせている。これのせいで、どうもうまくいかない。

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

PostgreSQL サービス開始できなくなる

そもそもの発端は、私がPostgreSQLのpostgreユーザのパスワードを忘れてしまったことにある。

忘れてしまったので、コマンドプロンプトを起動させて再設定をしたその後、pgAdminでローカルのDBにアクセスできなくなってしまった。

あぁ~、またパスワード忘れたかなぁ・・・
あぁ~、再インストールかなぁ・・・

などと思ってコマンドプロンプトからpsqlを起動させてみた。
「つながらないよ」「ホントにDBあんの?」みたいな返答が返ってきたので、「あるよ?」と思ったが、「サービス開始されてないんじゃない?」って思って、Windowsの管理画面を見る。

案の定、サービス起動されてませんがな・・・

パスワードを変えちゃったせいで、起動できなくなっていたようで、さっそく新しいパスワードを設定してサービスを開始。
pgAdminで接続したら、ちゃんと見えるようになった。

なんか、自分で原因作って、自分で悩んで、自分で解決って・・・
一人で遊んでしまった。

PHP覚書 json_encode未対応に対応する

json_encodeはPHP5.2から対応ということで、5.1の環境では使えない。

ということを今日知った。

終わったと思って悠々としていたのに、今日はその対応で必死・・・

といっても、無事終わったけど。

本当にネットって有難い。欲しい情報が見つかるときは・・・だけど

やり方はいろいろあるようだけど、参考にしたのはこのサイト。
ある1つのサンプル PHP5.2以前の環境でのjson_encode

このほか、Services/JSON.phpを取り込む方法もあり。

キュニナル!! PHPのバージョンが低くて「json_encode()」が使えないでござる

なるほど・・・
でもさ、本当は、バージョンぐらい上げてよ!と言いたい。
(まぁバージョン上げたら次はWarningばっかり出るようなことになることもあるんだけど)

PostgreSQL覚書 PSQLを使ってSQLファイルを実行

普段はpgAminを使ってSQLを実行しているのだけど、SQLファイルがデカすぎて、ファイルを開けない場合は、PSQLをつかうか、ファイルの中身を分散してSQLを流していくしかない。

ということで、PSQLを使ったSQLファイル実行。

コマンドプロンプトを開いて、cd等でpostgreSQLのpsql.exeのあるフォルダ(bin)まで遷移し、以下のコマンドを実行

psql -U yyy -h localhost xxx
ユーザ yyyのパスワード:(ここにパスワードを入力してEnter)

xxx => ¥i dump.sql

(xxx:DB名、yyy:ユーザID、dump.sql:SQLファイル名)

DBがローカルにない場合は、localhostの箇所をDBサーバーのIPアドレスに変えればよい。

この例の場合はdump.sqlをpsql.exeと同じフォルダに入れている。

終了するときは、

xxx => ¥q

でpsqlを終了する。

Macは直感的?

「Macは直感的」っていう人がいるけど、私にはサッパリだ。

iPod Touchを買って、手に持った瞬間、「電源ってどこ?」だったし、どうやって電源OFFにするのかも「???」だった。

Macにしても同じ。

マウスボタンが1つのほうがわかりやすい?

2つぐらいなら使いこなせるでしょう。
Windowsを使ったあとでMacを使うと、もう鬱陶しかった。
(家でMacだけ使ってた時は、全然そんなことなかったけど、仕事でWindowsを使い始めたら一変した。)

「な~んで、右クリックがないの!」

みたいな。
もう、マウスパッドの使い方なんて魔法にしか思えん。
でも、ショートカット覚えたら、ショートカットのほうが間違えがないし早い。
(Macってマウスジェスチャじゃなくて、ショートカットだと思う。)

なので、正直、「Macは直感的」って言ってる人は、Macをわかってないか、日本語の使い方間違えてるか、どちらかだと思う。
(私もわかってないけどサ)

そんな私だが、時流に勝てず、今Macを触っている。
というのも、会社でいよいよ「iPhoneアプリを作ってみるべし!」ということになり、私は今Macの使い方から勉強中。

PostgreSQL覚書 配列,縦→横,カンマ区切り

以下のようなテーブルがあったとして
【t_sample】
id,element,rank,…
1,’A’,1,…
1,’B’,2,…
1,’C’,3,…
2,’D’,1,…

これを
1,’A,B,C’
2,’D’
ってな感じで取得する方法

SELECT id
 , ARRAY_TO_STRING(ARRAY(SELECT element
                         FROM t_sample a
                         WHERE a.id = b.id ORDER BY a.rank),',') elements
 FROM (SELECT id FROM t_sample GROUP BY id ORDER BY id) b

ARRAY_TO_STRING:取得した配列をARRAY_TO_STRINGでカンマ区切りにする。

SQL文が少々複雑で面倒だけど、使い勝手はよさげ。

[編集メモ] 2017/3/29 タイトルと見栄えを修正

Excelマクロ覚書 HappyMonday算出

休日を自動的に作成するマクロを作成中、ハッピーマンデーってどうやって求めるのかを考えた。

色々サイトを見たのだけれど、「結局どうやってやるのよ!」とか、「なんでこんなにこねくり回してるのよ!」とか、まぁとにかくあんまり参考になりそうなロジックがきれいに提示されているサイトがなかったので自分で作った。

引数に、年、月、週を設定すると、Date型の日付が返る仕組み

Private Function GetMondayDateFromYearMonthWeek(ByVal y As Integer, ByVal m As Integer, ByVal w As Integer) As Date

Dim t As Date

t = DateSerial(y, m, 1)
t = DateAdd(“d”, (8 – Weekday(t, vbMonday)) Mod 7, t) ‘1週目の月曜日
GetMondayDateFromYearMonthWeek = DateAdd(“d”, 7 * (w – 1), t)

End Function

例えば、GetMondayDateFromYearMonthWeek(2012,9,3) とすると、戻り値は2012/9/17となる。

たぶんうまくいくと思うけど、2012年でしか試してない・・・