2011年2月15日火曜日

Scripting.Dictionaryオブジェクトのソート

あまり必要ありませんが、何かに使えるかもしれないのでメモ。

バリアント配列の初期化に誤りがあったので修正

Private Sub DicSort(ByRef dic As Scripting.Dictionary)
  Dim i As Long, j As Long
  Dim d As Variant
  Dim varTemp As Variant
  Dim varData() As Variant
  
  If dic Is Nothing And dic.Count = 0 Then
    Exit Sub
  End If
  
  'バリアント二次元配列
  ReDim varData(dic.Count - 1 , 1)
  i = 0
  For Each d In dic
    varData(i, 0) = d
    varData(i, 1) = dic(d)
    i = i + 1
  Next
  
  '総当りでソート(バブルソート)
  For i = 0 To dic.Count - 1
    For j = i + 1 To dic.Count - 1
      '比較
      If varData(i, 0) > varData(j, 0) Then
        '次の配列の値が小さい場合は入替
        varTemp = Array(varData(i, 0), varData(i, 1))
        varData(i, 0) = varData(j, 0)
        varData(i, 1) = varData(j, 1)
        varData(j, 0) = varTemp(0)
        varData(j, 1) = varTemp(1)
      End If
    Next
  Next
  
  dic.RemoveAll
  
  For i = 0 To UBound(varData)
    dic(varData(i, 0)) = varData(i, 1)
  Next
End Sub

エラーチェックはしていません。

2011年2月12日土曜日

vbaでhmac

とある事情からvbaのみでhmacができないか調べました。
で、できました。
スーの道具箱/気まぐれ日記/2007-03-08

VBでハッシュを求める *
MD5をVBで処理すると遅くなってしまうので、advapi32.dllを使うと簡単だし速い。
あまりサンプルが見当たらなかったので、書いてみた
ここからコピペして標準モジュールへ貼り付け。
おそらくExcel2000以上で動くと思います。
(vba6なら動くと思います)

Public Function hmac(ByVal key As String, ByVal data As String) As String
  Dim i As Integer
  Dim hash As String
  Dim key_byte() As Byte
  Dim key_len As Long
  Dim data_len As Long
  Dim ipad(63) As Byte
  Dim opad(63) As Byte
  Dim key_hash() As Byte
  Dim data_hash As String

  If key = "" And data = "" Then Exit Function

  key_len = Len(key)

  key_byte = StrConv(key, vbFromUnicode)
  If key_len > 64 Then
      key_hash = StrToBynary(CreateSHA1Hash(key_byte))
      key_len = 20
  Else
      key_hash = key_byte
  End If
  
  ReDim Preserve key_hash(63)
  For i = key_len To 63
    key_hash(i) = 0
  Next

  For i = 0 To 63
    ipad(i) = 0
    opad(i) = 0
  Next

  For i = 0 To 63
    ipad(i) = key_hash(i) Xor &H36
    opad(i) = key_hash(i) Xor &H5C
  Next

  data_hash = CreateSHA1Hash(CStr(ipad) & StrConv(data, vbFromUnicode))

  hash = CreateSHA1Hash(CStr(opad) & CStr(StrToBynary(data_hash)))

  hmac = hash
End Function

Private Function StrToBynary(strHexString As String) As Byte()
  Dim buf() As Byte
  Dim i As Long
  
  ReDim Preserve buf(Len(CStr(strHexString)) \ 2 - 1)
  For i = 0 To Len(CStr(strHexString)) \ 2 - 1
    buf(i) = CByte("&h" & Mid(CStr(strHexString), i * 2 + 1, 2))
  Next
  StrToBynary = buf
End Function


ここを参考にしました。
【Access】vbaでhmacが正しく計算できた!! | プラプラ式技術系 Access流!
HMAC SHA256 BASE64: 逢魔時 ~トワイライト~

2011年1月2日日曜日

明けましておめでとうございます。

2011年になりました。
今年は記事が書けるように頑張ります。

2010年11月5日金曜日

オープンソースERP Adempiereをインストール

オープンソースのERPがないかWebで探していたところAdempiereというものを発見。 さっそくインストール
OS:Ubuntu10.04
Adempiere3.6
DB:PostgreSQL
まず、DB

$sudo apt-get install postgresql
$sudo passwd postgres
新しいUNIXパスワードを入力してください: 
新しいUNIX パスワードを再入力してください: 
passwd: パスワードは正しく更新されました

続いてjava

$ sudo apt-cache search java|grep jre
default-jre - Standard Java or Java compatible Runtime
default-jre-headless - Standard Java or Java compatible Runtime (headless)
gcj-4.4-jre - Java runtime environment using GIJ/classpath
gcj-4.4-jre-headless - Java runtime environment using GIJ/classpath (headless version)
gcj-4.4-jre-lib - Java runtime library for use with gcj (jar files)
gcj-jre - Java runtime environment using GIJ/classpath
gcj-jre-headless - Java runtime environment using GIJ/classpath (headless version)
docbook-jrefentry - DocBook XML JRefEntry DTD
libjrexx-java - automaton based regular expression API for java
openjdk-6-jre - OpenJDK Java runtime, using Hotspot JIT
openjdk-6-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless)
openjdk-6-jre-lib - OpenJDK Java runtime (architecture independent libraries)
あれ、sunがない。ま、いいか。

$ sudo apt-get install openjdk-6-jre openjdk-6-jdk
本体のダウンロード&展開

$ wget http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/441673/pack/winnt/business/hanbai/adempiere360_ja_rev001.zip
$ unzip adempiere360_ja_rev001.zip
$ cd adempiere360_ja_rev001
$ unzip Adempiere360.zip -d ../
$ cd ../Adempiere
ここでRUN_setup.shを実行すればいいようだが、GUIになってしまう。
CUIでインストールする場合は「AdempiereEnvTemplate.properties」をリネームして 「AdempiereEnv.properties」で保存して「RUN_silentsetup.sh」を実行すればいいらしい。ここを参考に内容を書き換え

$ sudo ./RUN_silentsetup.sh
 .
 .
とりあえずインストール終了。
続きは別の日

2009年2月7日土曜日

VBAでPDF

だいぶ時間がたってしまったな。
エクセルのVBEを開いて「libharu\if\vb6」のフォルダにある「*.bas」をインポート。標準モジュールを追加して下記コードを貼り付け&実行する。
Sub test1()
Dim pdf As Long
Dim font As Long
Dim page As Long
Dim fname As String * 256

fname = ThisWorkbook.Path & "\練習.pdf"

pdf = HPDF_New(AddressOf Error_Handler, ByVal vbNullString)

If pdf = 0 Then
Exit Sub
End If

Call HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL)

Call HPDF_SetPageMode(pdf, HPDF_PAGE_MODE_USE_NONE) 'アウトラインやサムネイルを表示しません。

Call HPDF_SetPageLayout(pdf, HPDF_PAGE_LAYOUT_SINGLE) 'シングル表示

'Call HPDF_SetPassword(pdf, "owner", "user")

page = HPDF_AddPage(pdf)

'Call HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE) '横
Call HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT) '縦

Call print_grid(pdf, page)

Call HPDF_UseJPEncodings(pdf)
Call HPDF_UseJPFonts(pdf)

'font = HPDF_GetFont(pdf, ByVal "Helvetica", ByVal vbNullString)
font = HPDF_GetFont(pdf, ByVal "MS-Gothic", ByVal "90ms-RKSJ-H")

'Call HPDF_Page_SetTextRenderingMode(page, HPDF_STROKE)
Call HPDF_Page_SetRGBFill(page, 0#, 0#, 1)
Call HPDF_Page_SetFontAndSize(page, font, 24)

Call HPDF_Page_BeginText(page)

Call HPDF_Page_TextOut(page, 10, HPDF_Page_GetHeight(page) - 50, "ハローワールド hello world")

Call HPDF_Page_EndText(page)

Call HPDF_SaveToFile(pdf, fname)

Call HPDF_Free(pdf)

End Sub

すばらしい!