« 2011年3月 | トップページ | 2011年7月 »

2011年4月30日 (土)

§PostgreSQL(テーブルが見つかりません、リレーションがありませんエラーについて)

PostgreSQLネタの続きです。
データベースが再構築できたと思い、Javaプログラムからアクセスしたところ、テーブルが見つかりませんというエラーが発生しました。pgAdminではきちんと構築されているように見えます。所有者権限も設定されています。
さらに、psql で\dを実行すると、「リレーションがありません」というエラーが表示されテーブルが表示されません。
リレーション?外部参照のことか?ネットで検索してもなかなか解決方法がわからず本当に挫折になりました。

いろいろ見ていると、psqlのリファレンスの”スキーマ”に、search_pathの初期値は$user, publicとなっているが、自分のスキーマにテーブルを構築している場合はset search_path = 自分のスキーマ, publicとしなさいという記述を見つけました。ひょっとするとこれかなと思い、set文を実行した後に\dを実行するときちんとテーブルが表示されませした。

つまり、デフォルトでは明示的にスキーマ名.テーブル名で検索する必要があるということですね。プログラムのSQL文はスキーマ名を省略して記述しているのでpublicスキーマを検索してテーブルが見つけられなかったということになります。

PostgreSQLが起動した時にsearch_pathの設定を有効にする方法がありました。
PostgreSQLインストールパス\data\postgesql.confの#search_path='"$user",public'を#を削除して、'"自分のschema","$user",public'に変更し、PostgreSQLを再起動すれば設定が有効になります。ただし、管理者ユーザで編集しないと変更が反映されないので注意が必要です。
これ以降、Javaプログラムからも正常にアクセスできるようになりました。
めでたしめでたし。

2011年4月29日 (金)

§PostgreSQL(データベースの再構築(移植)手順について)

久しぶりのPostgreSQLネタです。PostgreSQLで作成したデータベースを、pg_dumpで出力したバックアップファイルを使って別のPCに同じデータベースを再構築(移植)しようとしました。pg_dumpのリファレンスを読む限りCreate DatabaseなどすべてのDDL文が生成されると考えていたのですがそうでもなさそうです。生成されたバックアップファイルはどうも不十分なようです。それを踏まえて、再構築の手順を書いてみたいと思います。

話の前提として、AサーバのデータベースをBサーバに新規に構築するものとします。
OSはAサーバがXP、BサーバがWindows7です。Aが8.4.3、Bは9.0.3です。
(1)まずAサーバでpg_dump -U ユーザ名 -f バックアップファイル名 -C -n スキーマ名 データベース名を実行します。バックアップファイルはbk.sqlとします。
(2)最初に書きましたが(1)の命令では以下の部分が出力されません。その部分を実行するDDLを手で作成します。仮にcre_db.sqlとします。pgAdminⅢなどでDDL文がわかりますのでそれをコピペすれば良いでしょう。ただし、create database文はそのままコピーしてもエラーになるので単にcreate database データベース名 WITH TEMPLATE template0;で作成します。
  さらに、AサーバでProgram files\Postgresql\8.4\data配下にtablespaceを作成していた場合、Windows7(Bサーバ)のProgram files配下には作成できないなどの問題が発生する可能性があるので別のフォルダに作成するように記述することをおすすめします。(Windows7の権限強化の関係です)
 ・Create role user文 ・・・pgAdminⅢの「ログインロール」
 ・create database文・・・・create database データベース名 WITH TEMPLATE template0;
 ・create tablespace文・・・pgAdminⅢの「テーブル空間」
(3)Bサーバではまず、PostgreSQLをインストールし、環境変数Pathにインストール先のbinのパスを通しておきます。
(4)上記(2)のtablespace作成先フォルダが存在しない場合は作成しておきます。フォルダが存在しないままCreate tablespaceを実行するとエラーとなるからです。
(5)psql -U postgres -f cre_db.sqlでユーザ、データベース、テーブルスペースを構築します。
(6)psql -U postgres -d データベース名 -f bk.sqlで残りのテーブルやデータを構築します。データベース名を指定しないと、デフォルトのデータベースに作成されてしまうので注意が必要です。

いろいろ試行錯誤の末この手順に辿り着きました。皆様の参考になれば幸いです。

2011年4月23日 (土)

∇MS-Officeトラブル解決(サーバ上のOfficeファイルが表示できない)

Office2010の不具合ではないかいう事象が見つかりましたので書いてみたいと思います。
どういう事象かというと、Windows2008 Enterprise Serverに共有フォルダを作成して、サーバ上のOfficeファイルを直接開こうとしたところ、
(1)Excel/PowerPointは、「ファイルまたはフォルダが見つかりません」
(2)Wordは何もエラーは表示されず内容も表示さません
となってしまいました。サーバ上のファイルをローカルに持ってくると問題なく表示されます。この現象はOfficeファイルのみで発生し、テキストや画像ファイルはサーバ上で表示できます。
ネットで調べても解消法がありませんでした。ただ、ファイルが存在するにもかかわらずファイルが見つかりませんということは、サーバ上のパスが関係しているのではないかと感じました。

ひとつ思い当たるフシがありました。それは、サーバの共有名を設定した際に、実際のフォルダと共有名をわざと変えていました(例えば、フォルダ名:hoge、共有名:hogehoge)。ということでフォルダ名と共有名を同じにしたところ、なんと!解消されました。

共有名が実体のフォルダと異なるとファイルを探せなくなるとはバグとしか思えません。Office2003ファイルでも発生することから、MS-Officeの長年のバグということになるのではないでしょうか。日本マイクロソフト社は認識していないのかもしれません。

2011年4月10日 (日)

∇Windows7トラブル解決(プロダクトキーの認証期限切れ)

第7弾はプロダクトキーの認証についてです。
windows7のインストール時点ではプロダクトキーの設定が不要になったようです。これは、「とりあえずある期間はお試しで使って良いよ」といううことらしいです。そしてある期間を超過しようとした時点で「ライセンスが切れるよ!」的なメッセージがいきなり表示されてビックリすることになります。

この忘れた頃に表示されるメッセージを回避するには、インストールした時点でプロダクトキーを設定してしまえば良いわけです。
プリインストール版は自動的にライセンス認証されるようですから関係ありませんが、DVD版は最初にプロダクトキーを設定してしまいましょう。

ちなみに、設定手順は、「コントロール」→「システム」→「プロダクトキーの変更」→「プロダクトキー」に値を入力
「ライセンス認証に成功しました」となれば完了です。

2011年4月 9日 (土)

◆Outlook VBA(複数メールの添付ファイルを一括保存3 と Excel一覧出力)

久しぶりのOutlook VBAネタです。
またまたコメントを頂きましたので
(1)添付ファイル一括保存マクロ
(2)Excel一覧出力
改良してみました。

Excel一覧出力時に添付ファイルにハイパーリンクを設定できないかというものです。
一応できたので公開してみます。
添付ファイル一括保存は保存先に同一ファイル名があるとファイル名を変更してしまうので
メール側の添付ファイル名をその変更したファイル名に変えてやり、Excel一覧出力では
その変更したファイル名で一覧出力するというふうに変更しました。
セルも添付ファイルごとに別々に出力するようにしました。したがって一番右端に出力していきます。
ハイパーリンクを設定したくない場合は、保存先フォルダの指定ダイアログでキャンセルしてください。
一点注意点ですが、メール側の添付ファイル名(FileName)は見た目上変化がありませんが、
管理上のファイル名(DisplyName)が保存したファイル名になります。
詳細は下記ソースを参照してください(ちょっと長いですが)。

'################################################################################
'# <機能名>      選択メールの添付ファイルを指定フォルダに一括保存
'# <機能概要>    選択メールの添付ファイルを指定フォルダに一括保存する
'################################################################################
Sub 選択メールの添付ファイルを指定フォルダに一括保存()
    Dim cDir As String, oSel As Object, oF As Object
    Dim myOlApp As New Outlook.Application
    Dim myOlExp As Outlook.Explorer
    Dim myOlSel As Outlook.Selection
    Dim myNameSpace As Outlook.NameSpace
    Dim myFolder As Outlook.MAPIFolder
    Dim mySendFolder As Outlook.MailItem
    Dim myCopiedItem As Outlook.Items
    Dim lMax As Integer, i As Integer
    Dim MyTitle As String
    Dim Leng As Long, hWnd As Long, ret As Long

    Dim myAttachments As Outlook.Attachment
    Dim MsgTxt As String, a As String
    Dim myExlApp As Object, Files As Object
    Dim lSubject As String
    Dim fs As Object
    Dim lpath As String, lVal As String
    Dim cnt As Integer
   
    On Error Resume Next
    Set myOlApp = CreateObject("Outlook.Application")
    Set myOlExp = myOlApp.ActiveExplorer
    Set myOlSel = myOlExp.Selection
   
    Set myExlApp = CreateObject("excel.Application")
    cDir = myExlApp.GetSaveAsFilename("DUMMY", "全ファイル(*.*),*.*", , "保存先フォルダ指定")
    If cDir = "False" Or cDir = "FALSE" Then GoTo p_exit
   
    cDir = Mid(cDir, 1, InStrRev(cDir, "\") - 1)
   
    '現在のウィンドウタイトル取得
    hWnd = GetActiveWindow()
    MyTitle = String(250, Chr(10))
    Leng = Len(MyTitle)
    ret = GetWindowText(hWnd, MyTitle, Leng)

    Set fs = CreateObject("Scripting.FileSystemObject")
    '選択されたメールの添付ファイルを保存
    On Error GoTo 0
    For Each oSel In myOlSel
        i = i + 1
        ret = SetWindowText(hWnd, oSel & "(" & i & "/" & myOlSel.Count & ")" & "を処理中...")
        For Each oF In oSel.Attachments
            lpath = cDir & "\" & oF.FileName
            'lpath = cDir & "\" & oF.DisplayName
            If Not (fs.FileExists(lpath)) Then
                oF.SaveAsFile lpath
            Else
                cnt = 0
                Do Until Not (fs.FileExists(lpath))
                    cnt = cnt + 1
                    lVal = Mid(oF.FileName, 1, InStrRev(oF.FileName, ".") - 1)
                    lVal = lVal & "_" & cnt & Mid(oF.FileName, InStrRev(oF.FileName, "."))
                    lpath = cDir & "\" & lVal
                    oF.DisplayName = lVal
                Loop
               
                oF.SaveAsFile lpath
            End If
        Next
       
    Next
   
    ret = SetWindowText(hWnd, MyTitle)
    MsgBox "終了しました。総数:" & i
    ret = Shell("c:\windows\explorer.exe " & cDir, vbNormalFocus)

p_exit:
    Set fs = Nothing
    Set myExlApp = Nothing
    Set oSel = Nothing
    Set oF = Nothing
    Set myOlApp = Nothing
    Set myOlExp = Nothing
    Set myOlSel = Nothing
   
End Sub


'################################################################################
'# <機能名>      選択メール情報をExcel一覧化
'# <機能概要>    選択メールの内容をExcelブックに一覧化する
'################################################################################
Sub 選択メールの情報をExcel一覧化()
    Dim myOlApp As New Outlook.Application
    Dim myOlExp As Outlook.Explorer
    Dim myOlSel As Outlook.Selection
    Dim MsgTxt As String, a As String
    Dim Files As Variant, oF As Variant
    Dim myExlApp As Object, oNewWb As Object, oSel As Object
    Dim i As Integer, j As Integer
    Dim lSubject As String
    Dim lMsg As String
    Dim lSentOnBehalfOfName As String
    Dim lSenderName  As String
    Dim lReceivedByName  As String
    Dim lReceivedOnBehalfOfName   As String
    Dim lReplyRecipientNames  As String
    Dim lTo  As String
    Dim lCC  As String
    Dim lBCC  As String
    Dim lCreationTime  As String
    Dim lSize  As Long
    Dim lsenderemailaddress  As String
    Dim lTempFile  As String
    Const cSt As String = "31665"
    Const cEd As String = "掲載内容に"
   
    '現在のウィンドウタイトル取得
    Dim Leng As Long, hWnd As Long, ret As Long, lMax As Long, MyTitle As String
    hWnd = GetActiveWindow()
    MyTitle = String(250, Chr(10))
    Leng = Len(MyTitle)
    ret = GetWindowText(hWnd, MyTitle, Leng)
   
    Set myOlApp = CreateObject("Outlook.Application")
    Set myOlExp = myOlApp.ActiveExplorer
    Set myOlSel = myOlExp.Selection
   
    '新規ブック作成
    Set myExlApp = CreateObject("excel.Application")
    Set oNewWb = myExlApp.workbooks.Add
    '一覧整形
    myExlApp.ActiveWindow.Zoom = 85
    With oNewWb.sheets(1)
        .cells.WrapText = True
        .Range("A1:N1") = Array("件名", "本文", "受信日時", "サイズ", "送信者表示名", "送信者", "受信者表示名", "受信者", "", "TO", "CC", "BCC", "送信者Address", "添付ファイル")
        .Columns("A:A").ColumnWidth = 32
        .Columns("B:B").ColumnWidth = 40
        .Columns("C:D").ColumnWidth = 15.71
        .Columns("K:k").ColumnWidth = 15.71
        .rows("2:2").Select
    End With
    myExlApp.ActiveWindow.FreezePanes = True
    With oNewWb.sheets(1)
        .Range("A1").Select
    End With
   
    MsgBox "添付ファイルがある場合、その保存先フォルダを指定してください。"
    cDir = myExlApp.GetSaveAsFilename("DUMMY", "全ファイル(*.*),*.*", , "保存先フォルダ指定")
    If cDir = "False" Or cDir = "FALSE" Then
        cDir = ""
    Else
        cDir = Mid(cDir, 1, InStrRev(cDir, "\") - 1)
    End If
    i = 1
    lMax = myOlSel.Count
    For Each oSel In myOlSel
       
        lSubject = oSel.Subject
        lMsg = oSel.Body
        lSentOnBehalfOfName = oSel.SentOnBehalfOfName
        lSenderName = oSel.SenderName
        lReceivedByName = oSel.ReceivedByName
        lReceivedOnBehalfOfName = oSel.ReceivedOnBehalfOfName
        lReplyRecipientNames = oSel.ReplyRecipientNames
        lTo = oSel.To
        lCC = oSel.CC
        lBCC = oSel.BCC
        lCreationTime = oSel.ReceivedTime
        lSize = oSel.Size
       
        i = i + 1
        a = lSubject & " (" & i - 1 & "/" & lMax & ")"
        ret = SetWindowText(hWnd, a & "を処理中...")
       
        oNewWb.sheets(1).cells(i, 1).Value = lSubject
        oNewWb.sheets(1).cells(i, 2).Value = lMsg
        oNewWb.sheets(1).cells(i, 3).Value = lCreationTime
        oNewWb.sheets(1).cells(i, 4).Value = Format(Int(lSize / 1024), "##,###") & "KB"
        oNewWb.sheets(1).cells(i, 5).Value = lSentOnBehalfOfName
        oNewWb.sheets(1).cells(i, 6).Value = lSenderName
        oNewWb.sheets(1).cells(i, 7).Value = lReceivedByName
        oNewWb.sheets(1).cells(i, 8).Value = lReceivedOnBehalfOfName
        oNewWb.sheets(1).cells(i, 9).Value = lReplyRecipientNames
        oNewWb.sheets(1).cells(i, 10).Value = lTo
        oNewWb.sheets(1).cells(i, 11).Value = lCC
        oNewWb.sheets(1).cells(i, 12).Value = lBCC
        oNewWb.sheets(1).cells(i, 13).Value = lsenderemailaddress
        lTempFile = ""
        j = 0
        For Each oF In oSel.Attachments
            lTempFile = lTempFile & oF.DisplayName & Chr(10)
            oNewWb.sheets(1).cells(i, 14 + j).Value = oF.DisplayName
            If cDir <> "" Then
                oNewWb.sheets(1).Hyperlinks.Add Anchor:=oNewWb.sheets(1).cells(i, 14 + j), Address:= _
                        cDir & "\" & oF.DisplayName, TextToDisplay:=oF.DisplayName
            End If
            j = j + 1
        Next
       
       
    Next

    myExlApp.Visible = True
   
p_Error:
    Set oF = Nothing
    Set oSel = Nothing
    Set myExlApp = Nothing
    Set oNewWb = Nothing
    Set myOlApp = Nothing
    Set myOlExp = Nothing
    Set myOlSel = Nothing
    ret = SetWindowText(hWnd, MyTitle)
    MsgBox "終了しました。総数:" & i - 1
End Sub

2011年4月 7日 (木)

∇Windows7トラブル解決(クライアント証明書がインストール出来ない)

第6弾はクライアント証明書についてです。
XPで実行出来ていたクライアント証明書のインストールがwindows7ではエラーが出て正しくインストールできません。いろいろネットで検索してみたもののどれも自分の事象を解決するには至りませんでしたがなんとかネットの情報をあれこれ総合した結果以下の手順で出来ました。なおこの手順は一般ユーザ権限で設定できます。
具体的には、まずIEメニュー「インターネットオプション」→「セキュリティ」タブ→「信頼済みサイト」→「サイト」→「このゾーンのサイトにはすべてサーバの確認(https:)を必要とする」チェックを外し
「このWebサイトをゾーンに追加する」欄に自社の証明書発行サイトを記述し→「追加」→「閉じる」
次に、
「このWebサイトのセキュリティ証明書には問題があります。」と表示されている状態で、
「このサイトの閲覧を続行する(推奨されません)。」をクリック、
URL欄の横に表示されている「証明書のエラー」をクリック、
「証明書の表示」をクリック、
「証明書」 画面の「全般」タブで、「証明書のインストール」をクリック、
「証明書をすべて次のストアに配置する」を選択し、「参照」ボタンをクリック
「物理ストアを表示する」をチェックし、
「信頼されたルート証明機関」の配下にある「レジストリ」 を選択して、「OK」をクリック
「次へ」
「セキュリティ警告」画面が表示されたら「はい」でインストール完了。
再度、該当のサイトにアクセスすれば上記の証明書エラーは表示されなくなるはずです。

2011年4月 2日 (土)

∇Windows7トラブル解決(自PCへのログインはユーザ名だけではログイン出来ない)

Windows7トラブル解決の第5弾はログインユーザについてです。
本当は一番最初に書くべき事象だったかもしれませんが、XPから移行して最初にビックリすることかもしれません。
それは、社内PCはドメインユーザの利用が一般出来ではないかと思いますが、ソフトのインストールといったPC設定ではPC管理者のユーザに切り替えて作業
を行う必要があります。その際に入力するログインユーザ名は、単純に自PCの管理者ユーザ名と入力してもログイン出来ないということです。
最初は管理者パスワードを間違えたのかと何度も入力しなおしました。それでもログイン出来ません。
よくみるとログイン先のドメイン名がネットワークドメインになっているので、ひょっとしてということで、

 コンピュータ名\管理者ユーザ

と入力するとログインできました。
これは、ドメインに参加していないPCであればコンピュータ名を入力する必要はありません(デフォルトのログイン先が自PCだから)が、一度ドメインに参加するとログイン先のデフォルトがドメインになるからです。
XPでは自PCかドメインかといった接続先をリストボックスで選択していましたが、windows7ではなくなったからでしょうかね。
UAC画面でも同様なので最初はほんと戸惑いました。

« 2011年3月 | トップページ | 2011年7月 »