Posted by & filed under excel, メモ.

開いた複数のExcelブックを行単位でコピーし、1つのシートに連結するマクロ。 依頼があって書いた。

Option Explicit

Function writeRow(ByVal t As Range, ByVal s As Range) As Range
    s.Copy t
    Set writeRow = t.Cells(2)
End Function

Sub concatenate(ByVal target As Workbook, ByVal sources As Collection)
    Dim t As Range
    Dim src
    Set t = target.Sheets(1).Range("A1")
    For Each src In sources
        Dim srcsh As Worksheet
        For Each srcsh In src.Sheets
            Dim lastRow As Long
            Dim cur As Range
            Set cur = srcsh.Range("A1")
            lastRow = cur.SpecialCells(xlCellTypeLastCell).Row
            Do While cur.Row <= lastRow
                Set t = writeRow(t, cur.EntireRow)
                Set cur = cur.Cells(2)
            Loop
        Next
    Next
End Sub

Sub main()
    Dim target As Workbook
    Dim sources As New Collection
    Dim wb
    
    For Each wb In Application.Workbooks
        sources.Add wb
    Next

    Set target = Application.Workbooks.Add()
    
    concatenate target, sources
End Sub

Posted by & filed under langrid, メモ.

忘れるのでメモ
言語グリッド内のサービスを複合サービスで呼び出す場合は、サービスIDを以下のフォーマットにする。

http://yourhost.com/your/service/?wsdl

認証が必要な場合

http://id:password@yourhost.com/your/service/?wsdl

Posted by & filed under java, langrid.

ドキュメントがないので、ソース から確認した。

バインディング設定内容を以下に記載する。
「バインディング」やそもそもこの記事の主題が何なのか、という点については本家ドキュメントを参照のこと。

  1. MorphologicalAnalysisPL
    サービスタイプ MorphologilcalAnalysis が指定できる。指定されたサービスによる形態素解析が行きの翻訳対象の文に対して実行される。返りの翻訳には実行されない。(返りも要るんちゃうの?と思うが)
    補記2014/4/11: 形態素解析によって辞書単語の抽出精度を上げている。戻りの時には辞書単語の抽出を行わないので不要とのこと。
  2. ForwardTranslationPL
    サービスタイプ Translation が指定できる。指定されたサービスが行きの翻訳を実行する。
  3. BackwardTranslationPL
    同上。指定されたサービスが返りの翻訳を実行する。
  4. BilingualDictionaryWithLongestMatchSearchPL
    サービスタイプ BilingualDictionaryWithLongestMatchSearch が指定できる。指定されたサービスに登録されている単語について、翻訳実行前に置換され、専門用語などの翻訳がおおむね正しくなされるようになる。行きと返り両方について置換がなされる。ちなみにBilingualDictionaryWithLongestMatchSearchCrossSearchを挟む事で複数の辞書が使える。

Posted by & filed under debian, java, Linux.

やっと見つけた。debianでeclipse WTPが動かなくてダダ嵌りしていたが、eclipse.iniを編集して解決できるようだ。
Web browserのメニューを開こうとしたり、preferencesでWeb browserの設定を編集しようとすると、おもむろにeclipseが終了するというもの。

参考: crash: fatal error in soup_session_feature_detach with WebKitGTK+ >= 1.11.91

-Dorg.eclipse.swt.browser.DefaultType=mozilla
-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib64/xulrunner/

Posted by & filed under Linux, ssh, tips.

たまにしかせず、忘れるのでここにメモ。
パブリックキーをなくしてしまったときの生成コマンド。

$ ssh-keygen -y -f ~/.ssh/id_rsa

Posted by & filed under excel, VBA.

三月に一回くらい同じようなロジックを公私共に書いてる気がするので、ここに記す。

実行と同時に開くインプットボックスにパスを書くと、そのパス以下のファイル全てをスキャンし、発見したExcelブックを開き、全シート毎に処理をして、保存して、閉じるという一連の処理を実行する。
 Option Explicit
 ' ここを実行する
 Sub StartProgram()
     Dim filepath As Variant
 
     filepath = InputBox("フォルダパスを入力してください" & vbCrLf & "Ex. C:\Users\Somewhere", "ターゲットフォルダの指定")
 
     ' キャンセルすると "" が入るから、そんときはやめる
     If filepath = "" Then Exit Sub
 
     Dim fso As Object ' FileSystemObject
     Dim a
     Dim fld As Object ' Folder
     Set fso = CreateObject("Scripting.FileSystemObject")
 
     Set fld = fso.GetFolder(filepath)
 
     FolderProcess fld
 End Sub
 
 ' フォルダの中を漁ってXLSファイルを処理する
 Sub FolderProcess(ByVal fld As Object)
 
     ' サブフォルダを掘る
     Dim childFld As Object ' Folder
 
     For Each childFld In fld.SubFolders
         FolderProcess childFld
     Next
 
    ' ファイルを一個づつ見る
    Dim xlsfileRe As Object ' RegExp
    Dim childFile As Object ' File
    Dim mths As Object
    Set xlsfileRe = CreateObject("VBScript.RegExp")
    xlsfileRe.Pattern = ".xlsx?$" ' xlsかxlsxか
    xlsfileRe.IgnoreCase = True

    For Each childFile In fld.Files
        Set mths = xlsfileRe.Execute(childFile.Name)
        ' マッチがなければ違うファイル。
        If mths.Count > 0 Then FileProcess childFile
    Next
End Sub

' ファイル一個の処理
Sub FileProcess(ByVal f As File)
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = Application.Workbooks.Open(f.Path)

    For Each ws In wb.Sheets
        SheetProcess ws
    Next

    ' なんか警告言うてくることがあるので、黙らせる
    ' とりあえずこれだけでなんとかなったけど、ならない場合はググってください。
    Application.DisplayAlerts = False
    wb.Save
    wb.Close

    ' 黙らせたやつを戻す
    Application.DisplayAlerts = True
End Sub

Sub SheetProcess(ByVal ws As Worksheet)
    ' ここでシートごとの処理

    ' 試しにA1セルにみたよと入れる。
    ws.Range("A1").Value = "みたよ"

End Sub

Posted by & filed under debian, Linux, RAID, tips.

前回の投稿からかなり経ったが、続き。

あれから難なくRAID5の構築自体は完了したのだが、GRUBからの起動時にちゃんとinitが実行されないという障害にドハマりして、記事の纏めに時間が掛かってしまった。

とりあえず前回作成したRAID5の癖にディスクが2本しかないアレイに、もう一つのディスクを追加する。

# fdisk -H224 -S56 /dev/sda
前回sdbとsdcをアレイ構築に使った。パーティションIDを'fd'に指定するとmdadmが自動識別してくれるので、やっておくと絶対によい。作ってしまったsdb, sdcのパーティションについても、後から変更できる。

# mdadm /dev/md0 --add /dev/sda1
スペアとしてディスクが追加される。

# mdadm --grow /dev/md0 --raid-devices=3
RAID5のアレイが3本になり、パーティションサイズが拡張される。操作はバックグラウンドで実行されるが、ディスクのサイズによって非常に時間が掛かる。ちなみに自分の古いPCでは操作の完了まで20時間かかった。

# cat /proc/mdstat
この結果で状況が監視できる。

# resize2fs /dev/md0
サイズ拡張。自動でパーティション最後まで拡張してくれる。
ここ以降は/(root)をRAID5にした場合に必要な操作
# dpkg-reconfigure grub-pc
障害時に起動しないトラブルを避ける為、アレイに属するディスク全てをgrubのインストール先ディスクとして選択し、再構成しておく。

# update-initramfs -u -k all
initrdを更新する

本来はここまでの操作で再起動すれば普通に立ち上がってくるのだが、自分のケースではRAID5アレイをROOTに使っていたために、GRUBでブートができなくてハマった。
原因はカーネルがディスクドライバをロードする前にinitrdスクリプトのmdadmコマンドが実行されてしまい、initrd中にROOTが発見できないということであった。
以降はinitrdでrootが見えずフォールバックしてしまう人向け。

# cp -a /usr/share/initramfs-tools/scripts/local-top/mdadm /etc/initramfs-tools/scripts/local-top
# vi /etc/initramfs-tools/scripts/local-top/mdadm
viで編集し、冒頭にsleep 5を挿入する。アレイ認識の実行前にディスクドライバがロードが完了するようにする。

# update-initramfs -u -k all
設定弄ったら、initrdは忘れず更新する

今日はここまで。

Posted by & filed under 未分類.

先日Chinachuサーバで愛用していた2TBのWD20EARSが2歳半という若年で他界したので、反省を生かし、今回はRAIDを組む事にした。
マザーボードに組込まれているRAIDコントローラはマザーボードが逝ったときに詰むことがあるので、ソフトウェアRAID(5)を利用する。

これまでWD20EARSを2本所有しそれぞれにmpegを満タンに近い状態まで保存していた。
よってデータを整理するにしてもRAID構築の為に3本購入することは避けられないかと考えていたが、実はそんな必要はなくRAID5をスモールスタートさせることができるという記事を見付けたので、それに従って操作をした。

参考 Convert Linux Software RAID1 to RAID5

# fdisk -H224 -S56 /dev/sdb
パーティションを切る…

# apt-get install mdadm
# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 /dev/sdb1 /dev/sdc1
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Jan 5 02:20:38 2014
Raid Level : raid5
Array Size : 1949087232 (1858.79 GiB 1995.87 GB)
Used Dev Size : 1949087232 (1858.79 GiB 1995.87 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Sun Jan 5 02:20:38 2014
State : clean, degraded
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Name : debian:0 (local to host debian)
UUID : d2ce37ab:e16aa688:79e4e309:90078281
Events : 0

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 0 0 1 removed

2 8 33 - spare /dev/sdc1
detailの内容を出力するとraid5になっている
これで、データの移行が完了したところでmdadm –growを使いディスクを追加すると、リバランスが実行されて3本になる、らしい。

今日はここまで。続きは後日。

Posted by & filed under 未分類.

久々にdebianにSun JDKを入れようとしたら、知らん間にパッケージがなくなっていた。
ググると、日本語サイトではOracle本家からダウンロードして色々ガチャガチャする手順しかみつからなかったので、英語で見付けた以下ページを参考に実施した。

上記サイトが運用しているUbuntu向けパッケージリポジトリに、OracleJDKのインストーラ(のラッパー)が登録されているので、それを追加する。
ちなみに参考ページではsources.listを更新しているが、この手順ではsources.list.dを使っている。
sources.list.dの方が、イジったところが明確になるし、移行の時もマージの面倒がなく、使いやすいと思う。

$ su -
# cat <<EOF > /etc/apt/sources.list.d/webupdjava.list
> deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main
> deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main
> EOF
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
# apt-get update
# apt-get install oracle-java7-installer
# exit
これでOK。
環境によっては、update-alternatives が必要になるかもしれない。