BLOGTIMES
» ArchiveList (Tag for "java" )
«Prev || 1 · 2 · 3 · 4 · 5 · 6 ·... | | Next»
2021/02/07

壊れた H2 DB のファイルを修復するには

java 

突然、Gitbuketが JDBC エラーを吐くようになってしまって参りました。

ログを調べて見ると H2 DB に関する見たことがないログを吐いています。
Row "####" not found と言っていますが、これはデータベースファイルが不整合を起こしているようです。

Caused by: org.h2.message.DbException: Row "2515" not found in primary index "PUBLIC.COLLABORATOR_DATA" [90143-199] at org.h2.message.DbException.get(DbException.java:205) at org.h2.mvstore.db.MVPrimaryIndex.getRow(MVPrimaryIndex.java:274) at org.h2.mvstore.db.MVTable.getRow(MVTable.java:338) ・・・・・・

しかたがないので、データベースをリカバリしていきます。

H2 DB には Using the Recover Tool というプログラムが用意されていて、不整合を起こしているデータベースファイルからデータをサルベージすることができます。
サルベージされたデータは SQL としてダンプされているので、あとはこれを元にデータベースを復元してやれば OK。

具体的な手順は H2 DB をダウンロードし、カレントディレクトリにデータベースファイル( data.mv.db )がある状態で以下のコマンドを実行します。

java -cp h2*.jar org.h2.tools.Recover java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:./new -user sa -password sa -script ./data.h2.sql -driver org.h2.Driver -showResults

うまくいけばカレントディレクトリに new.mv.db が生成されているはずなので、あとはこれを元の data.mv.db に上書きしてやれば完了です。

参考


    at 12:55 |
    2020/11/07

    TIOBE Index で Python が初の 2 位に

    python  java  c 

    プログラミング言語の人気ランキングとしてよく使われている TIOBE Index Python が始めて 2 位になっていました

    C と Java が 1, 2 位を明け渡すのは TIOBE Index 至上初とのこと。
    Java は Oracle の JRE/JDK ライセンス変更以降、退潮傾向が続いているので中長期的にはしょうがないかなという感じもします。

    JavaとCの2大人気に異変、Pythonが2位にーーTIOBE Index | OSDN Magazine

    オランダTIOBE Softwareが発表した最新のプログラミング言語ランキング「TIOBE Index for November 2020」で、Pythonが過去最高位の2位となった。約20年前にTIOBE Indexの作成を開始以来初めてJavaとCが揃って上位2位に入らないという結果となった。


      at 17:05 |
      2020/10/24

      Oracle のクリティカルパッチアップデート(2020 年 10 月)

      oracle  java 

      Oracle のクリティカルパッチアップデートが出ていたのでメモ。

      Oracle Java SE は昨年のライセンス改訂で個人利用・開発目的のみという使途制限がついたので、もう使っている人はかなり少なくなっているかもしれませんが、LTS の Java SE だと 11 系は 11.0.9、8系は u271 になっています。


        at 22:48 |
        2020/08/23

        Ant で起動したプログラムに標準入力から文字列を与える

        java 

        Ant の Java Task*1 でプログラムを起動させたときに、起動されたプログラムの標準入力に対して入力を与える方法を調べてみました。

        結論から述べると、標準入力に渡したい内容のテキストファイルをあらかじめ用意しておき、<java classname="(クラス名)" input="(ファイル名)"> という感じで、input 属性にそのテキストファイルを渡してやると、その内容をプログラムに渡すことができます。

        今回は ./input/ というディレクトリ以下に txt ファイルを作ることにより、それらを1つずつ渡して繰り返しプログラムを実行するための build.xml を作ってみました。for や if を使うために ANT Contrib を使っています。ant なんてもう過去の遺産みたいな感じですが、ちょっとしたことがやりたいときには maven とかよりも融通が利きやすいので便利なんですよね。

        build.xml

        <?xml version="1.0" encoding="UTF-8" standalone="no"?> <project name="hoge" default="run"> <property name="mainclass" value="AppMain" /> <property name="srcdir" value="./src" /> <property name="destdir" value="./bin" /> <taskdef resource="net/sf/antcontrib/antlib.xml"> <classpath> <pathelement location="/path/to/ant-contrib-1.0b3.jar" /> </classpath> </taskdef> <path id="inputs"> <fileset dir="./input" includes="*.txt"/> </path> <path id="classpath"> <pathelement location="./bin"/> </path> <target name="init" /> <target name="compile" depends="init"> <delete dir="${destdir}" /> <mkdir dir="${destdir}"/> <javac srcdir="${srcdir}" destdir="${destdir}" includeAntRuntime="false"> <compilerarg value="-Xlint:unchecked" /> </javac> </target> <target name="run" depends="compile"> <var name="done" value="0"/> <for param="file"> <path refid="inputs" /> <sequential> <echo>-----@{file}------</echo> <java classname="${mainclass}" input="@{file}"> <classpath> <path refid="classpath"/> </classpath> </java> <var name="done" value="1"/> </sequential> </for> <if> <equals arg1="${done}" arg2="0" /> <then> <java classname="${mainclass}"> <classpath> <path refid="classpath"/> </classpath> </java> </then> <else /> </if> </target> </project>

        実行結果はこんな感じになるはずです。

        Buildfile: /path/to/build.xml init: compile: [delete] Deleting directory /path/to/bin [mkdir] Created dir: /path/to/bin [javac] Compiling 7 source files to /path/to/bin run: [echo] -----/path/to/input/1.txt------ [java] 1 [echo] -----/path/to/input/2.txt------ [java] 2 [echo] -----/path/to/input/3.txt------ [java] 3 [echo] -----/path/to/input/4.txt------ [java] 4 BUILD SUCCESSFUL Total time: 753 milliseconds

        at 23:38 |
        2020/07/05

        hprof が Java9 から削除されてた

        java 

        hprof が Java9 から削除されていたことが分かったのでメモ。
        Java の変更点については追いかけていたつもりでしたが、見落としていました。

        hprof について調べたのは 2011 年のことで、学習用にちょうど良いので偶につかっていたのですが、これからは VisualVM あたりをちゃんと使わないとダメそうですね。
        実際に Java8 と Java9 を比較すると、Java 9 以降では以下のようなエラーが出ることが確認できます。

        Java 9 Besides Modules | Learning Quest

        To demonstrate the impact of removing this agent, we can run a Java program with the hprof agent enabled (i.e. using the option -agentlib:hprof) on Java 8 and then on Java 9 (which is added on my system path):
        C:\Users\manouti>D:\Dev\Java\jdk1.8.0_121\bin\java.exe -agentlib:hprof test.ProcessHandleExample
        Running...
        Dumping Java heap ... allocation sites ... done.

        C:\Users\manouti>java -agentlib:hprof test.ProcessHandleExample
        Error occurred during initialization of VM
        Could not find agent library hprof on the library path, with error: Can't find dependent libraries

        In all cases, this agent was not an official part of the JDK and it was rarely used by existing applications.

          at 18:19 |
          2020/03/18

          Java 14 リリース

          java 

          Java 14 がリリースされました。

          このバージョンは LTS ではないのでサポート期間が6ヶ月しかないことに注意が必要です。
          いろいろと新しい機能が搭載されていますが、デベロッパーでなければ基本的にはスルーすべきバージョンです。

          Oracle、「Java 14」を発表 ~Recordクラスがプレビュー導入、switch式が正式機能に - 窓の杜

          米Oracleは3月17日(現地時間)、プログラミング言語「Java」の最新版「Java 14」を発表した。「Java 14」では2つのインキュベーターモジュールと3つのプレビュー機能が導入されたほか、2つの機能が非推奨化、2つの機能が削除された。合計で16の主要な変更が加えられている。


            at 23:18 |
            2020/01/23

            Oracle のクリティカルパッチアップデート(2020 年 1 月)

            java  oracle  virtualbox 

            Oracle が 2020 年 1 月のクリティカルパッチアップデートを出していました。

            Java SE は LTS のものだと 11.0.6*1, 8u241*2 が、VirtualBox は 6.1.2*3 が出ています。

            参考


            at 22:22 |
            2019/10/17

            Oracle のクリティカルパッチアップデート(2019 年 10 月)

            java  oracle  virtualbox 

            Oracle Critical Patch Update がリリースされていたのでメモ。

            Java SE は 11.0.5 / 8u231 がリリースされています。
            VirtualBox は 6.0.14 になったみたいですね。


              at 22:46 |
              2019/07/17

              Oracle のクリティカルパッチアップデート(2019 年 7 月)

              java  oracle 

              3 ヶ月に 1 回の Oracle のクリティカルパッチアップデートが出ています。
              JDK や JRE などの Java 製品を使っている場合にはアップデートが必要になります。

              2019年 7月 Oracle 製品のクリティカルパッチアップデートに関する注意喚起

              PC に Java JRE がプリインストールされている場合や、サーバで使用するソフトウエア製品に、WebLogic Server を使用している場合もあります。利用中の PC やサーバに対象となる製品が含まれていないかについても、確認してください。
              なお、Oracle によると Java SE について、既に公式アップデートを終了している Java SE JDK/JRE 7 および Java SE JDK/JRE 8 も脆弱性の影響を受けるとのことです。


                at 23:20 |
                2019/04/30

                webdrivermanager で ChromeDriver を自動アップデート

                selenium  sh  java 

                久しぶりに selenium のスクリプトを起動しようとしたら、以下のような例外を吐いて起動しなくて困ってしまいました。

                File "/home/hoge/.pyenv/versions/3.7.2/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome version must be between 70 and 73 (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Linux 4.15.0-46-generic x86_64)

                エラーメッセージを読む限り、ChromeDriver と Chrome のバージョンが合っていないというエラーのようです。

                以前書いたとおり Chrome は apt を使って導入しているので、定期的にバージョンアップされます。
                ところが、ChromeDriver は手動インストールなので、これらのバージョンがズレてしまうというのが問題の根本的な原因です。

                エラーが出てから対処するというのでも良いのですが、やはりこういうのは未然に防ぎたいもの。
                というわけで、自動的に ChromeDriver を更新するための良い方法がないかと思って探してみたら、webdrivermanager というプロジェクトを見つけました。

                webdrivermanager はインストールされているブラウザのバージョンに合わせた Selenium 用のバイナリドライバを自動的にダウンロードしてくれるという java のプログラムです。Maven などに組み込んで動かすのが一般的なようですが、今回は単純にコマンドラインから起動して /usr/local/bin/chromedriver を更新するようなスクリプトを組んでみました。無駄な動きがないように、インストールされた Chrome のバージョンをファイルで覚えておいて、バージョンアップされている場合にのみ動作するようにしてあります。


                  at 16:41 |
                  «Prev || 1 · 2 · 3 · 4 · 5 · 6 ·... | | Next»
                  » ArchiveList (Tag for "java" )