2013年2月24日日曜日

VBAでのマージソート サンプル

Excel VBA で配列をソートしたい場合は、ワークシートに出力して Excel のソート機能を使うのが、実装も処理速度も最も良い!のだけれど、そうも行かない事情はよくある話かなぁ?

仕方なく配列のソートを実装する場合のサンプルです。配列をソートする関数などは VBA には残念ながら無く、このコードは他言語のマージソートを VBA に移植したものです。

他言語のMerge Sort
http://www.codecodex.com/wiki/Merge_sort

'マージソート
'配列の添字の最小値は0に限定します
Public Sub MergeSort(List() As String)
    Dim min, max, max1, max2, size As Long
    min = LBound(List)
    max = UBound(List)
    size = max - min + 1

    If min <> 0 Then
        '最小値は0に限定
        Error 1
    ElseIf max = -1 Then
        '配列に要素が無い
        Exit Sub
    ElseIf size = 1 Then
        '配列要素が1つ
        Exit Sub
    End If

    max1 = Int(max / 2)     '少数は切り捨て
    max2 = max - max1 - 1
    Dim List1() As String
    ReDim List1(min To max1)
    Dim List2() As String
    ReDim List2(min To max2)

    Dim idx, idx1, idx2 As Integer
    idx1 = min
    For idx = min To max1
        List1(idx1) = List(idx)
        idx1 = idx1 + 1
    Next

    idx2 = min
    For idx = max1 + 1 To max
        List2(idx2) = List(idx)
        idx2 = idx2 + 1
    Next

    MergeSort List1
    MergeSort List2

    idx = min
    idx1 = min
    idx2 = min
    Do While (idx1 <= max1 And idx2 <= max2)
        If List1(idx1) <= List2(idx2) Then
            List(idx) = List1(idx1)
            idx = idx + 1
            idx1 = idx1 + 1
        Else
            List(idx) = List2(idx2)
            idx = idx + 1
            idx2 = idx2 + 1
        End If
    Loop

    Do While (idx1 <= max1)
        List(idx) = List1(idx1)
        idx = idx + 1
        idx1 = idx1 + 1
    Loop

    Do While (idx2 <= max2)
        List(idx) = List2(idx2)
        idx = idx + 1
        idx2 = idx2 + 1
    Loop

    Erase List1
    Erase List2
End Sub

2013年2月23日土曜日

Excel シートに挿入したボタンが小さくなってしまう

Excel のワークシートに挿入したコマンドボタンが、クリックするたびに小さくなってしまう現象がありました。クリック毎には再現せず、発生する状況は特定できませんが、Excel の既知の問題のようです。

(ここでの コマンドボタン とは、コントロールツールボックスのボタン、もしくはActiveXコントロールのボタンのこと)

ActiveXコントロールとワークシートはあまり相性が良くないようです。
コマンドボタンはユーザフォームに使うのが適当で、ワークシートにはフォームコントロールのボタンを使うのが適当です。もしボタンの見た目を変更したいのであれば、イメージを使う方法があります。

ただ若干の違いがあります。
  • Excelフォームのボタン
    • 押すとヘコむ
    • onmouseover でマウスポインタが指になる
    • 見た目が地味
    • 印刷すると、もっと地味
  • イメージ等のボタン
    • 押してもヘコまない
    • onmouseover でマウスポインタが指になる
  • ActiveX コマンドボタン
    • 押すとヘコむ
    • onmouseover でマウスポインタが矢印になる
    • 印刷すると、元のサイズと違う


Excel でコントロールをクリックするとコントロールやフォントのサイズが変わる
http://support.microsoft.com/kb/417966/ja

Excel 2010 のボタンの大きさが小さくなる
http://answers.microsoft.com/ja-jp/office/forum/office_2010-excel/excel-2010/9ace220e-7e6c-4d2a-9e61-fdbdf2d6b12f

2013年1月12日土曜日

Illustrator CS2 / Photoshop CS2 が無料で配布されている

CS2 といえば、もう7年以上前の製品ですが、
Adobe 製品が無料で配布されることになりました。

最新のじゃないと支障があるのなら仕方ないですが、
通常の利用であれば、まだまだ使えますよね。

http://www.adobe.com/jp/downloads/cs2_downloads/index.html
  • Creative Suite 2
  • Acrobat 3D 1.0 for Windows
  • Acrobat Standard 7.0
  • Acrobat Pro 7.0
  • Acrobat Pro 8.0
  • Audition 3.0
  • GoLive CS2
  • Illustrator CS2
  • InCopy CS2
  • InDesign CS2
  • Photoshop CS2
  • Photoshop Elements 4.0/5.0
  • Adobe Premiere Pro 2.0

2013年1月1日火曜日

Cassandra をVPS環境(最小スペック)で試してみる

Cassandra のシステム要件は、以下のとおりです。
  • メモリ:1GB以上を推奨
  • CPU:最低限度の指定は無し(ただし大部分の負荷はCPU依存)
  • ディスク:インストール後のサイズは 56MB(ビッグデータを扱うならば、もちろん潤沢に)
http://wiki.apache.org/cassandra/CassandraHardware_JP

DTI の ServersMan@VPS(Entryプラン)の場合、利用できるスペックは以下のとおりです。
  • 保証メモリ:512MB
  • 最大メモリ:1GB
  • HDD:10GB

もちろんメモリサイズが Cassandra のシステム要件を満たさない。だが試動するくらいなら何とかなるだろうか・・・

Cassandra における最大ヒープサイズのデフォルトサイズは、メモリ総量を元に以下のとおり定義されています。
  • 2GB以下では、メモリ総量/2
  • 2GB~4GBでは、1GB
  • 4GB~32GBでは、メモリ総量/4
  • 32GB以上では、8GB

では VPS ならば保証/最大メモリのどちらがメモリサイズの判断材料になるのか?
ただメモリ使用量を保証メモリ以内に収めないと異常終了します。

# free -m
             total       used       free     shared    buffers     cached
Mem:          1024        108        915          0          0          0
-/+ buffers/cache:        108        915
Swap:            0          0          0

total メモリが 1G となっており、VPS のスペックのうち最大メモリサイズがメモリ総量となっています。これだと最大ヒープサイズはメモリ総量の半分 512M となります。デフォルト設定のまま起動してみると、

# $CASSANDRA_HOME/bin/cassandra -f
xss = -ea -javaagent:/usr/local/apache-cassandra-1.1.8/lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms512M -Xmx512M -Xmn128M -XX:+HeapDumpOnOutOfMemoryError -Xss180k
(中略)
ERROR 23:29:25,767 Exception encountered during startup
java.lang.OutOfMemoryError: unable to create new native thread


やはり駄目でした。
Cassandra起動中のメモリサイズを追跡してみると、使用中のメモリは一時的に 578MB 増加しています。メモリサイズが全然足りないですね。

今回使用した環境は以下のとおり
  • DTI の ServersMan@VPS(Entryプラン)
  • CentOS 6.3(64bit)
  • Java 1.7.0_09
  • Apache Cassandra 1.1.8


<参考資料>
最大ヒープサイズの変更は、$CASSANDRA_HOME/conf/cassandra-env.sh で設定します。
※ただ、通常はこの設定を変更する必要は無いはずです。
MAX_HEAP_SIZE="4G"
HEAP_NEWSIZE="800M"