2014年11月22日土曜日

OricoからのcsvデータとMoneyからのエクスポートデータを比較するソフト

OricoからのデータをMoneyへ取り込めなくはないようですが、Moneyを使って自分が把握しているもの以外の請求がないか、確認するために使っています。クレジットを使うのも神経を使う必要はありそうです。不正使用や、誤入力ということも絶対無いとはいえませんので。。。


Vb.net 2012を使ったソフトです。OricoからのcsvデータとMoneyからのエクスポートデータを比較する機能をもたせています。

今まで、手作業で、一致するか確認していたのが、時間短縮なりそうです。
一致したデータは、別のtextboxに移動させるようにしています。


Public Class Form1
    '実行ファイルまたはそのショートカットに、2つのcsvファイル(MoneyからのエクスポートデータとOricoからのcsvデータ)を一緒にドラッグ&ドロップすると、起動して使用できる。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim files As String() = System.Environment.GetCommandLineArgs()
        If files.Length > 1 Then
            TextBox1.Text = "" : TextBox2.Text = ""
            TextBox1.Text = files(1)
            TextBox2.Text = files(2)
            Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")
            TextBox4.Text = trim(My.Computer.FileSystem.ReadAllText(TextBox1.Text, enc))
            TextBox5.Text = trim(My.Computer.FileSystem.ReadAllText(TextBox2.Text, enc))
        Else
        End If
    End Sub

    Private Function trim(st As String) As String
        Dim tmp() As String
        trim = ""
        tmp = st.Split(vbCrLf)
        Dim sst(), a, b, c, d, e As String
        For i = 0 To tmp.Length - 1
            e = ""
            Try
                sst = tmp(i).Split(",")
                a = sst(0) : b = sst(1) : e = (sst(8) + sst(9)).Replace("\", "").Replace("""", "")
            Catch ex As Exception
                'もういっぽうのエクセルデータならよめるはず
                Try
                    sst = tmp(i).Split(",")
                    b = sst(1) : c = sst(2) : d = sst(4).Replace(".0000", "").Replace("-", "")
                Catch ex2 As Exception
                    Continue For
                End Try

                trim = trim + b + "," + c + "," + d + vbCrLf
                Continue For
            End Try
            trim = trim + a + "," + b + "," + e + vbCrLf
        Next
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim st, tmp1(), tmp2() As String
        st = TextBox4.Text
        tmp1 = st.Split(vbCrLf)
        Dim r1(tmp1.Length) As String
        Dim r1flg(tmp1.Length) As Boolean
        For i = 0 To tmp1.Length - 1
            r1(i) = tmp1(i)
        Next
        st = TextBox5.Text
        tmp2 = st.Split(vbCrLf)
        Dim r2(tmp2.Length) As String
        Dim r2flg(tmp2.Length) As Boolean
        For i = 0 To tmp2.Length - 1
            r2(i) = tmp2(i)
        Next
        Dim tmpx1(), tmpx2() As String
        TextBox3.Text = ""
        For i = 0 To tmp1.Length - 1
            r1flg(i) = True
        Next
        For i = 0 To tmp2.Length - 1
            r2flg(i) = True
        Next
        For i = 0 To tmp1.Length - 1
            For j = 0 To tmp2.Length - 1
                If r1flg(i) = False Or r2flg(j) = False Then
                Else
                    Try
                        tmpx1 = r1(i).Split(",")
                        tmpx2 = r2(j).Split(",")
                        ' MsgBox(tmpx1(2) + "?" + tmpx2(2))
                        If Val(tmpx1(2)) = Val(tmpx2(2)) Then
                            Dim reps As New String(" "c, 6 - tmpx1(2).Length)
                            TextBox3.Text = TextBox3.Text + reps + tmpx1(2) + "  <-" + tmpx1(0) + "_" + tmpx1(1) + "=" + tmpx2(0) + "_" + tmpx2(1) + vbCrLf
                            r1flg(i) = False : r2flg(j) = False
                        End If
                    Catch ex As Exception
                    End Try
                End If
            Next
        Next
        TextBox4.Text = ""
        For i = 0 To tmp1.Length - 1
            If r1flg(i) = True Then
                TextBox4.Text = TextBox4.Text + r1(i) + vbCrLf
            End If
        Next
        TextBox5.Text = ""
        For i = 0 To tmp2.Length - 1
            If r2flg(i) = True Then
                TextBox5.Text = TextBox5.Text + r2(i) + vbCrLf
            End If
        Next
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'sortingの機能
        Dim st, tmp1(), tmp As String
        st = TextBox3.Text
        tmp1 = st.Split(vbCrLf)
        Dim r1(tmp1.Length) As String
        For i = 0 To tmp1.Length - 1
            r1(i) = tmp1(i)
        Next
        For i = 0 To tmp1.Length - 1
            For j = i + 1 To tmp1.Length
                If r1(i) > r1(j) Then
                    tmp = r1(i)
                    r1(i) = r1(j)
                    r1(j) = tmp
                End If
            Next
        Next
        TextBox3.Text = ""
        For i = 0 To tmp1.Length - 1
            TextBox3.Text = TextBox3.Text + r1(i) + vbCrLf
        Next
    End Sub
End Class

ネットにアクセスして正規表現を駆使してデータを取り込みつつ、自分の入力したデータを比較できるような家計簿ソフトであればさらに効率的なんですが。

Qtを試してみる

Qt Creater3.1.2を チュートリアルを見ながら試してみた。
チュートリアルの通り、コーディングしてもエラーが発生する。
どうやら、dllは、手動で入れてやる必要があるようだ。
エラーメッセージにしたがって、Windows用のDllを入れてみたところ動作した。
Android,Linux,Macなど様々なOSで動かせるというのがいい。
.netと使い方が似ているところもある。イベントトリガーとイベントハンドラの関係を シグナルとスロットというらしい? それらの接続もしやすいようになっているし、随所に使いやすい工夫がされている。
ただ大変なのは、最新の情報がほとんど英語ということのようだ。

2014年11月20日木曜日

Windows Updateができなくなったパソコン

職場のPCが、突然Windows Updateができなくなって、困ってしまった。
「現在サービスが実行されていないため、Windows Update で更新プログラムを確認できません。
このコンピューターの再起動が必要な可能性があります。」
こんな表示がでる。

例によって、ネットで調べたが、コントロールパネルのサービスで、Windows Updateのサービスを開始するとよいということなので、確かめてみたが、すでに起動している。

Fix itを使ってみるといいという情報もあったので、やってみたが、復旧しない。

スクリプトを作成し、バッチファイルで、コマンドを実行する方法も試したがうまくいかない。

さて、どうしたものかと、あれこれ試行錯誤して、1時間ぐらい粘ったがどうしてもうまくいかない。
あきらめかけて、再インストールかと思ったが、念のため、もう一度、ネットで調べたら
新しい情報を見つける。
http://alphafocus.cocolog-nifty.com/blog/2012/05/tips-windowsupd.html
これも、スクリプトを作成して、実行する方法だったが、こちらの方の方法でやったところうまくいった。

マイクロソフトでぜひ把握してもらって、Fix itに組み入れてもらうと多くの人が助かるかもしれません。

2014年10月17日金曜日

accessのテーブルリンクをモジュールで変更する方法(覚え書き)

ネットの情報を参考に、accessのテーブルリンクをモジュールを使って
変更する方法を考えてみた


Sub HenkoLink(path, tbname)
Dim db As DAO.Database, tb As DAO.TableDef
    Set db = CurrentDb
    Set tb = db.TableDefs(tbname)
    tb.Connect = ";DATABASE=" + path + ";TABLE=" + tbname + ";pwd=****"
    tb.RefreshLink
End Sub

Sub LinkHenkoMacro()
pathd = InputBox("path=\\***\")

'テーブル数が多いときは配列で
Dim tbname(15), dm As String
tbname(1) = "テーブル1"
tbname(2) = "テーブル2"
tbname(3) = "テーブル3"

For i = 1 To 3
 Call HenkoLink(pathd + "test1.mdb", tbname(i))
Next i

'配列使わず、ひとつずつやるなら
Call HenkoLink(pathd + "test2.mdb", "テーブル4")


End Sub


2014年10月6日月曜日

プログラミングHaskell P143 exprs関数について

P143 exprs関数の適用についても、少しくわしく考えてみた。
(途中の式表現は、正しい表現と言えないところもありかも...)

exprs ::[Int]->[Expr]
exprs [] = []
exprs [n]=[Val n]
exprs ns = [e | (ls,rs) <-split ns,  l  <- exprs ls,  r  <- exprs rs,    e <- combine l r ]

combine :: Expr -> Expr -> [Expr]
combine l r = [App o l r | o<- ops]

ops  :: [Op]
ops =[Add,Sub,Mul,Div]

exprs [1,2,3]=[e| (ls,rs) <-split [1,2,3],  l  <- exprs ls,  r  <- exprs rs, e <- combine l r ]
  (ls,rs) <-split [1,2,3]は、次の2とおり
([1],[2,3])           ([1,2],[3])
ひとつめで l  <- exprs ls,  r  <- exprs rs,  e <- combine l r を考えて
  exprs ls=exprs [1]=[Val 1]  
exprs rs=exprs [2,3]= [e | (ls,rs) <-split [2,3],  l  <- exprs ls,  r  <- exprs rs,    e <- combine l r ]
= [e |([2,],[3]),  l  <- exprs [2],  r  <- exprs [3],    e <- combine l r ]
= [e |([2,],[3]), [Val 2], [Val 3],    e <- combine [Val 2] [Val3] ]
=[App Add (Val2) (Val3),App Sub …..4種類の演算]

[Val 1]と[App Add (Val2) (Val3),App Sub …..4種類の演算]についても4種類の演算がある

ふたつめも同様に可能

こんな感じで、すべての演算を表せそうだ。

プログラミングHaskell P142 split関数

プログラミングHaskell 読んでみた。 P142でsplit関数の適用がよくわからなかったので
自分なりに、丁寧にたどってみた。

split  :: [a]->[([a],[a])]
split[] =[]
split[_]=[]
split (x:xs) = ([x],xs) : [(x : ls , rs) | ( ls , rs ) <- split xs]

split [4]=[]

split [3,4]= ([3],[4]): [(3 : ls , rs) | ( ls , rs ) <- split [4]]
         =([3],[4]): [(3: ls , rs) | ( ls , rs ) <- []] = ([3],[4])
split [2,3,4]=([2],[3,4]): [(2 : ls , rs) | ( ls , rs ) <- ([3],[4]) ]
          ==([2],[3,4]): [(2 :[3] ,[4]) ]= [([2],[3,4]),([2,3] ,[4]) ]
split [1,2,3,4]
=([1],[2,3,4]):[(1:ls,rs) | (ls,rs)<- [([2],[3,4]),([2,3] ,[4]) ] ]
=([1],[2,3,4]):[(1:[2],[3,4]),(1:[2,3],[4])]
=([1],[2,3,4]):[[1,2],[3,4]),([1,2,3],[4])]

という感じでいいのだろうか

2014年9月19日金曜日

32bitWindowsにfessをインストールするときは要注意

全文検索を使ってみようと調べたらfessが、使いやすい感じがして、試してみた。(以前はnamazuなどがあったが)
PCに負荷がかかりそうなので、古いPCを使っているLinuxはやめにして、新しいPC(といっても32bitだが)のWin7でやってみた。
ところが、なかなかうまくいかない。
・最新版fessでやってみたが、うまく動作しない。ちょっと古い9.0.2だとうまくいった。標準では、Dosプロンプト画面を表示しっぱなしでないと、サーバーとして動作してくれない。いちおう、端末としても使うPCなので、Windowsのサービスとして登録し、Dos画面は出ないようにした。
最初は、うまくいかない。service.bat installなるコマンドが拒否される。コマンドプロンプトを管理者として実行する。それでも、だめ、原因は、tomcat7.exeが64bit版だかららしい。32bit版のtomcatからtomcat7.exe、tomcat7w.exeをもってきて、上書きしたら動いた。
 localhostとして、アクセスはできたが、他のPCからアクセスできない。ファイアウォールだろうと思って、設定を追加。受信規則に8080ポートを許可とする。これで、やっとうまくいった。
*********
その後、うまくいったと思ったが、どうも、クロールがうまくいかない。思い切ってfessをver4に落としてみたらうまくいった。tomcatの組み合わせがうまくいってないのだろうかどうか?詳細は不明。
**************
その後、また不具合が発生する。ループリダイレクトとのこと。よくわからないので、今度は、もう一度ver9.0.2を試す。tomcat7.exe tomcat7w.exeは32bit版である。今回は、なぜか、クロールができた。はたして、このまま安定運用できるか。
***********************
とりあえず、今のところ安定して稼働している。

fessはTomcatで動いているので、WindowsでTomcatを使う方法を、このセットアップを通して知ることができた。
ポイントは、JAVA_HOMEとJRE_HOMEの環境変数を変更して再起動すること。
startup.batでtimcatが起動すること。他はLinuxとだいたい同じかも。

******************
fess稼働して数ヶ月 なんとか動いていたが、Win7の端末で動かしていたので、さすがに無理があったようだ。端末として使うと、どうしても負荷があるため、通常のソフトが遅くなる。ということで、使用はやめにした。専用のサーバでないときついようだ。残念ながら、メモリ、HDD、CPUそれぞれかなり余裕のあるPCでないと難しいようだ。