世界震撼.dev

いつか世界を驚かせるためのメモ

Mactype入れたらWindowsが生まれ変わった

何が言いたいかと言うと「フォントレンダリングを改善したらやる気100倍になった」ということだ。

EclipseのフォントにConsolasを使っているのだが、Consolasは日本語に対応していない。

だから、日本語の表示にはMSゴシックが使われてしまうのだ。

MSゴシックを見ると皆さん気持ちが悪くなるだろう。

何とかできないかと探しているとMactypeなるものに出会った。

導入はインストールするだけ。それだけ。

Before f:id:jlink123:20160801222353p:plain

After f:id:jlink123:20160801221437p:plain

Firefoxを使っているひとは「Firefox で Mactype が効かない時の対処法」を参考に設定してほしい。 ついでにVLゴシックというフォントに変えることをおすすめする。

JavaFXでException in Application start methodって言われて困った話

結論から言うとコンパイルのし忘れという初歩のミスをやらかしてた

JavaFXで作ったものをインポートして利用しようとしたところ

こんな感じに怒られた

Exception in Application start method

java.lang.reflect.InvocationTargetException

~~中略~~

Caused by: javafx.fxml.LoadException:

/C:/Users/h/o/g/e/fxml/StartGUI.fxml:13

fxmlがない?

パスを間違えているのかとフルパスを指定しても変わらない

ちなみにエラーの箇所はこんな感じ(一部伏字)

実にありふれた文

BorderPane root = FXMLLoader.load( getClass( ).getResource( "/**/fxml/StartGUI.fxml" ) );

エラーの下の方をよく読むと、コントローラーが見つからない?と言っている

Caused by: java.lang.ClassNotFoundException: hoge.controller.StartGUIController

パスも間違ってないのになぜだと思いきや

Controllerのコンパイルを忘れている

コピってきたからclassファイルもあるし、修正後のコンパイルに気づかなかった

通りでStackOverflowにも回答がないわけです

初歩的なミスが一番怖い

エラー全文

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Lau
ncherImpl.java:363)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImp
l.java:303)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm
pl.java:875)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(
LauncherImpl.java:157)
        at com.sun.javafx.application.LauncherImpl$$Lambda$48/501263526.run(Unkn
own Source)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException:
/C:/Users/**/**/**/**/fxml/StartGUI.fxml:13

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2595)
        at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:104)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:
918)
        at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FX
MLLoader.java:967)
        at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:21
6)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.ja
va:740)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2701)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2521)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2435)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3208)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3169)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3142)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3118)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3098)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3091)
        at **.fx.StartSet.start(StartSet.java:31)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153
(LauncherImpl.java:821)
        at com.sun.javafx.application.LauncherImpl$$Lambda$51/934820170.run(Unkn
own Source)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(Platfor
mImpl.java:323)
        at com.sun.javafx.application.PlatformImpl$$Lambda$44/661672156.run(Unkn
own Source)
        at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.
java:292)
        at com.sun.javafx.application.PlatformImpl$$Lambda$47/355644776.run(Unkn
own Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformI
mpl.java:291)
        at com.sun.javafx.application.PlatformImpl$$Lambda$45/128893786.run(Unkn
own Source)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch
er.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.ja
va:102)
        at com.sun.glass.ui.win.WinApplication$$Lambda$37/1349277854.run(Unknown
 Source)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: **.controller.StartGUIController
        at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:
916)
        ... 27 more
Exception running application **.fx.StartSet

EclipseでJavaFXのライブラリを除去したらエラーがたくさん出た

以下の記事を参考に設定を変更して見事解決

EclipseでJavaFXを使おうとするとアクセス制限とでる問題の解決方法

環境設定>Javaコンパイラー>エラー警告>「使用すべきでない制限されたAPI」の「禁止された参照(アクセス・ルール)」を「エラー」から「無視」に変更

テキストファイルの重複要素を削除するクラスを書いてみた

引数1に入力元、引数2に出力先のパスを指定する

HashSetにそのままaddすると順序が保持されないなんて初耳だった

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;
import java.util.LinkedHashSet;

class Distinct{

    public static void main( String...args ){
        if( args.length != 2 ){
            System.out.println( "argument error" );
            System.out.println( "argument1 : readfilepath , argument2 : writefilepath" );
            return;
        }
        if( args[ 0 ].equals( args[ 1 ] ) ){
            return;
        }
        File readfile = new File( args[ 0 ] );
        File newfile = new File( args[ 1 ] );
        try(BufferedReader br = Files.newBufferedReader( readfile.toPath( ) , StandardCharsets.UTF_8 );
            BufferedWriter bw = Files.newBufferedWriter( newfile.toPath( ) , StandardCharsets.UTF_8 , StandardOpenOption.WRITE , StandardOpenOption.CREATE_NEW ); ){
            HashSet< String > distinct = new LinkedHashSet< String >( 5000 );
            for( String line; ( line = br.readLine( ) ) != null; ){
                distinct.add( line );
            }
            for( String line : distinct ){
                bw.write( line + "\n" );
            }
        }catch( IOException e ){
            e.printStackTrace( );
        }
    }
}

parseTable.jsとかいう神ライブラリ

parseTable.js - convert HTML table to array of objects · GitHub

最近テーブルをパースするのがだるくてなんかいい方法ないかなと探し回っていたところぴったりのライブラリを見つけた

console.log(JSON.stringify(parseTable(document.querySelector("table")).reverse(),null,"    "));

で出力すれば1行でテーブルをJSONに変換できる

あとはファイルに書き込んでjavaでゴニョゴニョすると

factoryメソッドを少し書き換えればいい感じになる

function factory(headings) {
  return function(row) {
    return arrayify(row.cells).reduce(function(prev, curr, i) {
            // 変更部分 セルの中のhrefからURLを取得できるように変更
        if( curr.childElementCount != 0 ){
            prev[headings[i]] = [ { "name" : curr.getElementsByTagName("a")[0].innerText , "link" : curr.getElementsByTagName("a")[0].href } ];
        }else{
            // 変更前
            prev[headings[i]] = curr.innerText;
        }
      return prev;
    }, {});
  }
}

JDBCでテーブル一覧を取得

try(Connection conn = DriverManager.getConnection(url, user, password);
    ResultSet rs = conn.getMetaData().getTables(null, null, "%", null);
    ){
        final StringBuilder sb = new StringBuilder(  );
        while( rs.next( ) ){
            sb.append( rs.getString( 3 ) +"<br>" );
        }
        System.out.println( sb.toString( ) );
}

JDBCでファイルからデータを読み込んでテーブルに挿入

File file = new File( ABSOLUTE_FILEPATH );
try( BufferedReader br = Files.newBufferedReader( Paths.get( file.getAbsolutePath( ) ) , StandardCharsets.UTF_8 ) ){
    for( String line; ( line = br.readLine( ) ) != null; ){
        stmt.executeUpdate( "insert ignore into TABLENAME (CULUMNNAME) values ('"+ line +"')" );
    }
}catch( IOException e ){
    e.printStackTrace();
}