AndroidのLinearLayoutについて

LinearLayout内に配置した子要素は、そのままの状態でweightを指定しても、正しい描画にならない事がある。heightまたはwidthをwrap_contentから0dpに変更すると正しくweightの指定通り描画される。

Androidアプリ開発でstring.xmlを使用する理由

昔から小規模アプリケーションを開発していると、自然にラベルやボタンのテキストを直打ちしていたので、Androidアプリを初めて作るときはとても戸惑った。直接入力すると警告が出るのです!!

string.xmlに値を登録してから使うのですが、これがまた慣れないと面倒で仕方ない。しかし、多言語対応する場合にはこれがとても大事になるので、しっかりしたいと思う。。。

PostgreSQLストリーミングレプリケーション設定(Windows)

2台構成

host:sv1 ip:192.168.0.100 略称:プライマリ
host:sv2 ip:192.168.0.101 略称:セカンダリ

まずは両ホストにPostgreSQLをインストール。本手順作成時はVer9.2を使用。インストール完了後に両端末で共通の管理者権限を持つアカウントを作成し、サービス実行アカウントをそれに変更する。

プライマリでの作業

コマンドプロンプトを起動し、PostgreSQLのインストールフォルダ内、binフォルダに移動する。

cd "c:\Program Files\PostgreSQL\9.2\bin"

レプリケーション用ユーザーを作成する。

createuser -P -E -U postgres --replication rep_user

作成するユーザーのパスワードを2回入力し、最後にpostgresのパスワードを入力する。コマンドプロンプトの画面は閉じずに次へ。

外部からの通信を許可する。インストールフォルダ内の「data」にある「pg_hba.conf」の最後に下記の行を追加する。

host    replication    rep_user    192.168.0.0/24    md5

postgresql.confの下記8行を編集する。
※synchronous_commitはシステム要件によって変更した方が良い

listen_addresses = '*'
wal_level = hot_standby
fsync = on
synchronous_commit = off
wal_sync_method = fsync
max_wal_senders = 2  ※プライマリを含んだレプリケーションサーバーの数を入れる
wal_keep_segments = 32  ※8~32が目安らしい
synchronous_standby_names = '*'

ついでに下記設定値がシステム要件に合っているか確認する。

max_connections = 300  ※同時接続数
shared_buffers = 1024MB  ※物理メモリの1/4程度
work_mem = 8MB  ※物理メモリの1/500程度だが最大8MB
effective_cache_size = 2048MB  ※物理メモリの1/2程度

postgresqlサービスを再起動。OS再起動でもよい。

セカンダリでの作業

postgresqlサービスを停止した状態で、PostgreSQLのインストールフォルダ内の「data」フォルダ内を空にしておく。

コマンドプロンプトを起動し、PosgreSQLのインストールフォルダ内、binフォルダ内に移動する。

cd "c:\Program Files\PostgreSQL\9.2\bin"

以下のコマンドを実行してプライマリからベースバックアップする。

pg_basebackup -h 192.168.0.100 -p 5432 -U rep_user -D "c:\Program Files\PostgreSQL\9.2\data" -x -c fast -P

インストールフォルダ内の「data」にある「postgresql.conf」を編集する。

hot_standby = on

postgresqlサービスを再起動。OS再起動でもよい。

同じ場所に「recovery.conf」を新規作成、内容は下記の通り。

standby_mode = 'on'
primary_conninfo = 'host=192.168.0.100 port=5432 user=rep_user password=[pass] application_name=sv2'
recovery_target_timeline = 'latest'
trigger_file = 'C:\\\pgsql\\failover-trigger'
recovery_end_command = ''

postgresqlサービスを開始し、ログで正常動作を確認する。

VBでテキストデータの読み書き

Dim stream As Object
Set stream = CreateObject("ADODB.Stream")

'読取専用(1), 書込専用(2), 読み書き(3)
'他のUser読取拒否(4), 他のUser書込拒否(8), 他のUser読書拒否(12), 他のUser読書許可(16)
stream.Mode = 3

'Text(2), Binary(1)
stream.Type = 2

'(Shift_JIS, Unicode)
stream.Charset = "utf-8"

'CR(13), LF(10), CRLF(-1)
stream.LineSeparator = -1

stream.Open

'【書き込みの場合】
'一行(1), 全行(0)
stream.WriteText "テストテキスト", 1
'上書きしない(1), 上書き(2)
stream.SaveToFile "D:\test.txt", 2

'【読み取りの場合】
'stream.LoadFromFile "C:\test.txt"
'Do Until stream.EOS = True
    '一行(-2), 全行(-1)
    'Debug.Print stream.ReadText(-2)
'Loop

stream.Close
Set stream = Nothing

VBでファイルを開く・保存ダイアログ

WindowsAPIを使用する


#If VBA7 Then
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Private Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As LongPtr
        hInstance As LongPtr
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As LongPtr
        lpTemplateName As String
    End Type
#Else
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
#End If

Private Const OFN_HIDEREADONLY = &H4        '読み取り専用オプションを非表示
Private Const OFN_FILEMUSTEXIST = &H1000    'ファイルの存在確認

Public Function fileOpenDialog(ByVal hwnd As Long, ByVal initialDirectory As String, ByVal initialFileName As String, ParamArray fileFilters() As Variant) As String
    Dim openFile As OPENFILENAME
    Dim result As Long
    fileOpenDialog = ""
    openFile.lpstrFilter = createFilterString(fileFilters)
    openFile.nFilterIndex = 1
    openFile.hwndOwner = hwnd
    openFile.lpstrFile = String(201, 0)
    #If VBA7 Then
        openFile.nMaxFile = LenB(openFile.lpstrFile) - 1
        openFile.lStructSize = LenB(openFile)
    #Else
        openFile.nMaxFile = Len(openFile.lpstrFile) - 1
        openFile.lStructSize = Len(openFile)
    #End If
    openFile.lpstrFileTitle = openFile.lpstrFile
    openFile.nMaxFileTitle = openFile.nMaxFile
    openFile.lpstrInitialDir = initialDirectory
    openFile.lpstrFile = initialFileName & String(201 - Len(initialFileName), Chr(0))
    openFile.lpstrTitle = "ファイルを開く"
    openFile.flags = OFN_HIDEREADONLY + OFN_FILEMUSTEXIST
    result = GetOpenFileName(openFile)
    If result <> 0 Then
        fileOpenDialog = Trim(Left(openFile.lpstrFile, InStr(1, openFile.lpstrFile, vbNullChar) - 1))
    End If
End Function

Public Function fileSaveDialog(ByVal hwnd As Long, ByVal initialDirectory As String, ByVal initialFileName As String, ByVal fileExtension As String) As String
    Dim openFile As OPENFILENAME
    Dim result As Long
    fileSaveDialog = ""
    openFile.lpstrFilter = fileExtension & "ファイル (*." & fileExtension & ")" & Chr(0) & "*." & fileExtension
    openFile.nFilterIndex = 1
    openFile.hwndOwner = hwnd
    openFile.lpstrFile = String(201, 0)
    #If VBA7 Then
        openFile.nMaxFile = LenB(openFile.lpstrFile) - 1
        openFile.lStructSize = LenB(openFile)
    #Else
        openFile.nMaxFile = Len(openFile.lpstrFile) - 1
        openFile.lStructSize = Len(openFile)
    #End If
    openFile.lpstrFileTitle = openFile.lpstrFile
    openFile.nMaxFileTitle = openFile.nMaxFile
    openFile.lpstrInitialDir = initialDirectory
    openFile.lpstrFile = initialFileName & String(201 - Len(initialFileName), Chr(0))
    openFile.lpstrDefExt = fileExtension
    openFile.lpstrTitle = "ファイルの保存"
    openFile.flags = 0
    result = GetSaveFileName(openFile)
    If result <> 0 Then
        fileSaveDialog = Trim(Left(openFile.lpstrFile, InStr(1, openFile.lpstrFile, vbNullChar) - 1))
    End If
End Function

Private Function createFilterString(ByVal fileFilters As Variant) As String
    Dim filterString As String
    filterString = ""
    For i = 0 To UBound(fileFilters)
        Dim filter() As String
        filter = Split(fileFilters(i), "|")
        If Len(filterString) > 0 Then
            filterString = filterString & Chr(0)
        End If
        If UBound(filter) = 1 Then
            filterString = filterString & filter(0) & Chr(0) & filter(1)
        ElseIf UBound(filter) = 0 Then
            filterString = filterString & filter(0)
        End If
    Next i
    createFilterString = filterString
End Function

VBAを書く前に認識しておきたいこと

まずは、開発環境を整える。
・オプションの「自動構文チェック」OFF
・オプションの「変数の宣言を強制する」ON
・オプションの「エラートラップ」をエラー発生時に中断に

VBA全般に関する注意事項
・連想配列はScripting.Dictionaryを使う
・Classは作れるが継承ができない
・ガベコレあるがバグがあるらしくNothingで開放した方がいい

AccessのVBAに関する注意事項
・「Form_formName」と「Forms!formName」は別物
 ※DoCmdで操作できるのは!付きの方