①Activityを継承したclassを作成する
②res→layoutにレイアウト用xmlを作成する
※コピーして作ってtools:contextを変更すると楽かも
③AndroidManifest.xmlのApplicationNodesにActivityを追加する
AndroidのLinearLayoutについて
LinearLayout内に配置した子要素は、そのままの状態でweightを指定しても、正しい描画にならない事がある。heightまたはwidthをwrap_contentから0dpに変更すると正しくweightの指定通り描画される。
Androidアプリで画面の回転を固定
AndroidManifest.xmlのアプリケーションで設定する。
// 縦画面固定 <activity android:screenOrientation="portrait">
// 横画面固定 <activity android:screenOrientation="landscape">
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
Accessでフォームが開かれているか確認
CurrentProject.AllForms("formName").IsLoaded
VBAを書く前に認識しておきたいこと
まずは、開発環境を整える。
・オプションの「自動構文チェック」OFF
・オプションの「変数の宣言を強制する」ON
・オプションの「エラートラップ」をエラー発生時に中断に
VBA全般に関する注意事項
・連想配列はScripting.Dictionaryを使う
・Classは作れるが継承ができない
・ガベコレあるがバグがあるらしくNothingで開放した方がいい
AccessのVBAに関する注意事項
・「Form_formName」と「Forms!formName」は別物
※DoCmdで操作できるのは!付きの方
MS Accessでフォームが最小化されているか確認する
なぜか最小化状態のフォームは下記のサイズとなる
Forms("formName").WindowHeight = 420 Forms("formName").WindowWidth = 2400