« 2008年2月 | トップページ | 2008年9月 »

eclipse でjava classファイルの逆コンパイル

java / eclipse / 逆解析

まとめ。
eclipseで逆コンパイルをするにはJadclipseというプラグインを使用します。
他にも方法があるかもしれないですが、私はこれで上手くいったので他は調べてません。

必要なのは、Jadclipseのjarファイルと、実際動かすためのJad.exeの2つ。それぞれ以下から入手してください(2008.04.30.現在のアドレスです)

Jadclipse
http://jadclipse.sourceforge.net/wiki/index.php/Main_Page

jad.exe
http://www.kpdus.com/jad.html

ここで注意をしないといけないのは、Jadclipseのバージョンと、eclipseのバージョンを合わせておかないといけないということ。ずれていると設定しようとした時にエラーが発生してeclipseさんに怒られてしまいます。

で、まぁJadclipseはeclipseのpluginsフォルダに配置して、Jad.exeは…多分適当にどっかに配置して良いと思います。
私はeclipseフォルダの直下に配置しました。

その後、eclipseを起動して、
ウィンドウ > 設定 > Java > Jadclipse
 Path to decompiler というところに、Jad.exeを配置したアドレスを指定します。
 例)C:\test\eclipse\jad.exe
これでOK。eclipseのパッケージ・エクスプローラなどでclassファイルをダブルクリックすれば逆解析してくれます。

自分用備忘録として。

| | コメント (0) | トラックバック (0)

ディレクトリ内EXCELファイル内容の一括検索

EXCEL / VBA / ファイル内検索

秀丸のGREPって便利だなーと前から思っていたのですが、今回ヘッダの一括変換とか該当シートの一括削除とかやっていて、どうもEXCELファイル内容の検索も出来そうだと思って作ってみました。

……Setがどういう働きのものなのか分かってなくて(多分基本中の基本)お陰で(多分)ちょーケアレスミスに気付かず昨日は終電帰りでしたが。出来たので本望です。納品前に使おうっと。

本当は検索結果を表示していく部分も変数で設定した方が良かったんでしょうがベタでやっちゃってます。大した修正じゃないんだろうけど今はこれにて。

Private Sub CommandButton2_Click()
    '================================
    ' ディレクトリ内の全ブックをループ
    '================================
    Dim myPath As String
    Dim myFName As String
    Dim myHeader As String
    Dim myOriginalBook As Workbook
    Dim mySelectSheet As Worksheet
    Dim myResultCellNumber As Integer

    Set myOriginalBook = ActiveWorkbook
'    Set myOriginalBook = Workbooks("3.01.003.99変換テスト.xls")
'    myOriginalBook.Activate
   
    myResultCellNumber = 5
   
    ' 検索対象文字列を取得
    myHeader = Worksheets(1).Range("SEARCH_STR").Value
   
    ' パスを取得
    myPath = ActiveWorkbook.Path
    ' 自ファイルが存在しているディレクトリをカレントディレクトリに設定
    ChDir myPath
    myFName = Dir("*.xls")
    ' ファイルがなくなるまで検索
    Do Until myFName = ""
       
        If Not (myOriginalBook.Name = myFName) Then
            ' ファイルOPEN
            Workbooks.Open Filename:=myFName
   
            '================================
            ' 検索
            '================================
            Dim MySheet As Sheets
            Dim SCount As Integer
            Dim myFoundCell As Range
            Dim myFoundCellLoop As Range
   
            Set MySheet = ActiveWorkbook.Sheets
            SCount = MySheet.Count
            ' 全ワークシートをループ
            For mycount = 1 To SCount
                ' mycount件めのシートをアクティブにする
                Set mySelectSheet = Worksheets(mycount)
                mySelectSheet.Activate
               
                Set myFoundCell = mySelectSheet.Cells.Find( _
                                                What:="rcvo", _
                                                After:=Range("A1"), _
                                                LookIn:=xlFormulas, _
                                                LookAt:=xlPart, _
                                                SearchOrder:=xlByRows, _
                                                SearchDirection:=xlNext, _
                                                MatchCase:=False, _
                                                MatchByte:=False, _
                                                SearchFormat:=False)
               
               
                ' 1件めの検索結果が存在した場合
                If Not (myFoundCell Is Nothing) Then
                    myFoundCell.Activate
                   
                    Dim myFirstCell As String
                    myFirstCell = myFoundCell.Address
                   
                    myOriginalBook.Worksheets(1).Range("A" & myResultCellNumber).Value = ActiveWorkbook.Name
                    myOriginalBook.Worksheets(1).Range("B" & myResultCellNumber).Value = mySelectSheet.Name
                    myOriginalBook.Worksheets(1).Range("C" & myResultCellNumber).Value = myFoundCell.Address
                    myOriginalBook.Worksheets(1).Range("D" & myResultCellNumber).Value = myFoundCell.Value
                    myResultCellNumber = myResultCellNumber + 1

                    ' 以降、検索を継続
                    Set myFoundCellLoop = mySelectSheet.Cells.FindNext(After:=myFoundCell)
                    myFoundCellLoop.Activate

                    Do While Not myFirstCell = myFoundCellLoop.Address
                        myOriginalBook.Worksheets(1).Range("A" & myResultCellNumber).Value = ActiveWorkbook.Name
                        myOriginalBook.Worksheets(1).Range("B" & myResultCellNumber).Value = mySelectSheet.Name
                        myOriginalBook.Worksheets(1).Range("C" & myResultCellNumber).Value = myFoundCellLoop.Address
                        myOriginalBook.Worksheets(1).Range("D" & myResultCellNumber).Value = myFoundCellLoop.Value
                        myResultCellNumber = myResultCellNumber + 1

                        Set myFoundCellLoop = mySelectSheet.Cells.FindNext(After:=myFoundCellLoop)
                        myFoundCellLoop.Activate
                    Loop
                End If
               
            Next mycount

            ' ファイルを保存せずCLOSE
            Workbooks(myFName).Close SaveChanges:=False
   
        End If
        ' 次のファイル名を設定
        myFName = Dir()
    Loop
End Sub

| | コメント (0) | トラックバック (0)

ディレクトリ内EXCELファイルの対象シート削除

EXCEL / VBA / 対象シート削除

昨日投稿した、ヘッダの一括変換に続いて。

Private Sub XXXXXX()
    '================================
    ' ディレクトリ内の全ブックをループ
    '================================
    Dim myPath As String
    Dim myFName As String
    Dim myDelSheet As String
    Dim myOriginalBook As Workbook
   
    Set myOriginalBook = ActiveWorkbook
   
    ' ヘッダ部接頭語を取得
    myDelSheet = Worksheets(1).Range("DELETE_SHEET").Value

    ' パスを取得
    myPath = ActiveWorkbook.Path
    ' 自ファイルが存在しているディレクトリをカレントディレクトリに設定
    ChDir myPath
    myFName = Dir("*.xls")
    ' ファイルがなくなるまで検索
    Do Until myFName = ""
        If Not (myOriginalBook.Name = myFName) Then
            ' ファイルOPEN
            Workbooks.Open Filename:=myFName

            '================================
            ' 全シート内で、削除対象同じシート名があれば削除
            '================================
            Dim MySheet As Sheets
            Dim SCount As Integer
            Set MySheet = ActiveWorkbook.Sheets
            SCount = MySheet.Count

            ' シート数が1件だった場合は削除できないのでスルー
            If Not SCount = 1 Then
                ' 全ワークシートをループ
                For mycount = 1 To SCount
                    ' mycount件めのシートをアクティブにする
                    Worksheets(mycount).Activate
               
                    ' 削除対象のシートが存在した場合
                    If ActiveSheet.Name = myDelSheet Then
                        ' シート削除の確認メッセージを非表示
                        Application.DisplayAlerts = False
                        
                        ' シート削除
                        ActiveSheet.Delete
                        
                        ' 確認メッセージを表示するよう修正
                        Application.DisplayAlerts = True
                   
                        ' ループを抜ける
                        Exit For
                    End If
                Next mycount
            End If
   
            ' 一番先頭のシートをアクティブにする
            Worksheets(1).Activate
            
            ' ファイルを保存してCLOSE
            Workbooks(myFName).Close SaveChanges:=True
        End If

        ' 次のファイル名を設定
        myFName = Dir()
    Loop
End Sub

| | コメント (0) | トラックバック (0)

ディレクトリ内EXCELファイルのヘッダ/フッタ一括変換

EXCEL / VBA / ヘッダ一括変換

今やってるプロジェクトで設計書がちょー大量にあってえげつない感じです。そして更にそれの印刷用のヘッダとかフッタが統一されてなくて、1つずつ手でなんて直してられっかばかやろう的な。

てことで、EXCELマクロで一気に更新!てことで作ってみました。VBAは初心者レベルなので色んな入門サイトさんのパーツ繋ぎ合わせ状態ですが、動いたのでまぁいいか!ということで。備忘録です。

    '================================
    ' ディレクトリ内の全ブックをループ
    '================================
    Dim myPath As String
    Dim myFName As String
    Dim myHeader As String
    Dim myOriginalBook As Workbook
   
    Set myOriginalBook = ActiveWorkbook
   
    ' ヘッダ部接頭語を取得
    myHeader = Worksheets(1).Range("HEADER_STR").Value
   
    ' パスを取得
    myPath = ActiveWorkbook.Path
    ' 自ファイルが存在しているディレクトリをカレントディレクトリに設定
    ChDir myPath
    myFName = Dir("*.xls")
    ' ファイルがなくなるまで検索
    Do Until myFName = ""
        If Not (myOriginalBook.Name = myFName) Then
            ' ファイルOPEN
            Workbooks.Open Filename:=myFName
   
            '================================
            ' 全シートのページ設定を変更する
            '================================
            Dim MySheet As Sheets
            Dim SCount As Integer
            Set MySheet = ActiveWorkbook.Sheets
            SCount = MySheet.Count
            ' 全ワークシートをループ
            For mycount = 1 To SCount
                ' mycount件めのシートをアクティブにする
                Worksheets(mycount).Activate
                With ActiveSheet.PageSetup
                    .LeftHeader = myHeader & Left(Right(ActiveWorkbook.Name, (Len(ActiveWorkbook.Name) - 5)), (Len(ActiveWorkbook.Name) - 9))
                    .CenterHeader = ""
                    .RightHeader = "&A"
                    .LeftFooter = ""
                    .CenterFooter = "&P / &N"
                    .RightFooter = ""
                    .FirstPageNumber = xlAutomatic
                End With
            Next mycount
   
            ' 一番先頭のシートをアクティブにする
            Worksheets(1).Activate
            
            ' ファイルを保存してCLOSE
            Workbooks(myFName).Close SaveChanges:=True
        End If

        ' 次のファイル名を設定
        myFName = Dir()
    Loop

…応用は色々出来そうなので、ひな形として残しておく。

| | コメント (1) | トラックバック (0)

« 2008年2月 | トップページ | 2008年9月 »