プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

JavaFXのTooltipの挙動を変えるTooltipBehavior作った話

 JavaFXでTooltipを使ったことがあるだろうか?
 うん、みなまで言わなくてもいい。

  使いにくいよね


 ざっと欠点を挙げるとするならば、

  1. 表示されるまでが遅い
  2. 表示されるまでの時間を変えられない
  3. 表示時間が短い
  4. 表示時間を変えられない
  5. フォーカス持っていないウィンドウでもポップアップする。ついでにウィンドウが一番手前に来る


 屋上へ行こうぜ…久しぶりに…キレちまったよ…な状態になってしまったのは一番最後の項目。
 この症状は複数のWindowを一つのApplicationで開いているときに起こる。(なお、他のプロセスのウィンドウより前に来ることはないっぽい。)
f:id:nodamushi:20150805231216p:plain:w250

f:id:nodamushi:20150805231241p:plain:w250

 これを解消する方法がどうしてもわからんかった。次善策として、フォーカス持っていないウィンドウではせめてポップアップしないようにしたい。


自作TooltipBehaviorを作ってみることにした

 JavaFXにおいて、Tooltipの挙動を決定しているのはTooltipBehaviorというクラスです。
 このTooltipBehaviorはTooltipのシングルトンな内部クラスで、唯一のTooltipBehaviorが色々とEventHandlerを登録したり、今どれが表示されてて、どれが表示されようとしているのかとかを管理しています。
 基本的な処理はこんなかんじ。

  • マウスがホバーしたらactivateタイマーを起動して、時間差でポップアップさせる
  • ポップアップしたら、他に表示されているTooltipは非表示にする
  • ポップアップしたらhideタイマーを起動し、時間差でポップアップを非表示にする
  • マウスが対象ノードから出た場合は、activate,hideタイマーは停止し、現在対象のTooltipが表示中の場合はleftタイマーを起動して時間差でポップアップを非表示にする。
  • マウスプレスされたら全てのタイマーを止め、Tooltipを消す


 この動作を基本として、次の機能を持つ自作TooltipBehaviorを作ることにした。

  1. Tooltip以外のPopupWindowにも使える
  2. フォーカスを持たないウィンドウからもポップアップするかどうか変更できる
  3. 「時間差」を変更することが出来る
  4. 一つのTooltipインスタンスを使い回すことが出来る
  5. 複数の自作TooltipBehaviorインスタンスをまたいで一つだけTooltipが表示できるようにする

というわけで、なんかできた

 成果がこちら。なお、JavaFX8以上が対象。
TooltipBehavior/SinglePopupBehavior.java at master · nodamushi/TooltipBehavior · GitHub
TooltipBehavior/TooltipBehaviorBase.java at master · nodamushi/TooltipBehavior · GitHub
TooltipBehavior/TooltipBehavior.java at master · nodamushi/TooltipBehavior · GitHub

 著作権は放棄してる(パブリックドメイン)のでどなたでも利用改変して問題ありません。
※なお、一部Tooltipの動作がオリジナルのTooltipBehaviorが保持するマウス座標の値に依存している部分があるので、オリジナルのTooltibBehaviorを使わずにTooltipを利用すると、おかしな挙動を示す場合があると思います。
 ただし、その場面はポップアップしているときに、テキストの内容を変更した場合だけのようなので、基本的には問題ないんじゃね、たぶん。



 これらのデモ実行のコードはこちら。
TooltipBehavior/test at master · nodamushi/TooltipBehavior · GitHub

 自作TooltipBehaviorの使い方は至って極シンプルで、最初にTooltipBehaviorのインスタンスを用意しておく以外はTooltip.installを使うのと変わらない

final TooltipBehavior behavior = new TooltipBehavior();
//マウスが乗ってから0.1秒後に表示
behavior.setOpenDuration(new Duration(100));
//ずっと表示
behavior.setHideDuration(Duration.INDEFINITE);
//マウスが放れてから0.3秒後に非表示
behavior.setLeftDuration(new Duration(300));

//………中略………

final Rectangle r = createNode(size);
//色をツールチップで表示する
final Tooltip tooltip = new Tooltip(r.getFill().toString());
//インストール Tooltip.install(r,tooltip)と同じ
behavior.install(r, tooltip);


 BehaviorTestを実行してみるとこんな画面が出てくる。Tooltip.installを用いたときと(表示スピードが違う以外)同じ動作をする。
f:id:nodamushi:20150805235025p:plain



 BehaviorTestでは色のついたRectagleを作るたびにTooltipも生成している。
 今回はたかが色コードのテキストを表示しているだけなのに、無駄だよね。できるなら一つのTooltipで表示できた方が良いはずだ。


 というわけで、それができるよ、と言うことを示すのがBehaviorTest2。

    //表示前にTooltipの内容をColorの値に更新させる
    behavior.setPopupUpdater((final Tooltip t,final Node n)->{
      if(n instanceof Rectangle){
        t.setText(((Rectangle)n).getFill().toString());
      }
    });

    for(int y=0;y<l;y++) {
      for(int x=0;x<l;x++){
        final Rectangle r = createNode(size);
        g.add(r, x, y);

        //インストール Tooltipは一つのインスタンスを使い回す
        //(TooltipBehaviorがデフォルトのTooltipを持っている)
        behavior.install(r);
      }
    }


 上のように、BehaviorTest2では、Rectangleを作るたびにTooltipを作成すると言うことはしていない。
 代わりに、setPopupUpdaterというメソッドに渡しているラムダ式の中でTooltipの文字列を更新しているっぽい。まぁ、要するにCellと同じ考え方だね。
 むろん、これもちゃんと同じように動作します。

f:id:nodamushi:20150805235834p:plain

 Tooltipを更新するフックの他に、表示するかどうかのフックも用意してあるので、結構自由度が高くて個人的には使いやすいです。




 ところで、自作TooltipBehaviorはオリジナルのTooltipBehaviorと違い、Singletonではないので、複数のBehaviorを定義できます。
 なので、複数のBehaviorを同時に利用すると、こんなことになっちゃったりします。

f:id:nodamushi:20150806000425p:plain


 こりゃ困りまんねん。
 というわけで、自作TooltipBehaviorではGroupという概念で、複数のTooltipBehaviorにまたがっても一つしかTooltipを表示させないように出来ます。

    final TooltipBehavior behavior1 = new TooltipBehavior();
    final TooltipBehavior behavior2 = new TooltipBehavior();

    //BehaviorGroupに登録すると、一つのBehaviorGroupに登録された
    //Behaviorの中では、ポップアップするTooltipが常に一つになります
    final BehaviorGroup group = new BehaviorGroup();
    group.addAll(behavior1,behavior2);

 これをしておくと、問題なく表示されるようになります。

f:id:nodamushi:20150806000712p:plain

 
 


CSSで指定できた方がよくね?

 ここまで作って、欲が出たのか、CSSで指定したくなった。だって、Behavior単位で時間管理するより、Tooltip単位で時間管理できた方が楽に決まってる。

 というわけで、表示までの時間等をCSSで指定できるようにプロパティを追加したTooltipのサブクラスを……… 

    private final class CSSBridge extends PopupControl.CSSBridge {
        private Tooltip tooltip = Tooltip.this;

        CSSBridge() {
            super();
            setAccessibleRole(AccessibleRole.TOOLTIP);
        }
    }

(Tooltip.javaより引用)

 ( ゚д゚)作れねえええええええ CSSBridgeが見えねぇええ




 リフレクションに頼るかどうか悩んだ末、Tooltipを丸コピして、必要なプロパティやBehaviorを追加することにした

TooltipBehavior/NTooltip.java at master · nodamushi/TooltipBehavior · GitHub


 うん、まぁ、ねぇ。一応たぶん、動くんだけどね。著作権とかライセンス的にどうなんだろうね、これね
 こいつのSkinに至っては、package名と名前以外完全にコピーだからね。やばいね。よって、NTooltipとNTooltipSkinの著作権は放棄してないよ。たぶん、OpenJDKのライセンスに沿うんだと思うよ。




 というわけで、最後はちょっとあれな感じだけど、結構便利なものが出来たんじゃないかと思ってるよ。

JavaFXのWebViewがマウスイベントでJVMごとクラッシュする

 いろんな訳あってブレークポイントをつけれるエディタを内蔵したいのだ。でも、JavaFXには良いテキストエディタがない。(だいたい、いつになったら全角文字がなんか変な色がつくの直るんだ?)
 
 Threadをまたぐのは正直面倒くさいけど、背に腹は代えられない。SwingNodeでつっこんでやるから、Swingでもいいや、と思ったのだが意外にもSwingも全然ねぇ。


 なら、JavaScriptでもいいよ!ということで、検索してみたら見つけました素晴らしいエディタ。その名もAce

 ブレークポイントあり、Emacsキーバインドあり(超高評価)の素晴らしいエディタです。これだ!これを突っ込もう。


 というわけで、突っ込んでみました。

f:id:nodamushi:20150714231705p:plain

import java.nio.file.Path;
import java.nio.file.Paths;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;


public class AceEditor extends Application{
  public static void main(final String[] args){
    launch(args);
  }


  @Override
  public void start(final Stage s) throws Exception{
    final WebView v = new WebView();
    final Path p = Paths.get("ace","editor.html");
    s.setScene(new Scene(v));
    v.getEngine().load(p.toUri().toURL().toString());
    s.show();
  }

}

 一見問題なさそうに見えます。が、コピー&ペーストができません。
 そして、何よりも問題なのは、マウスクリックしていると、突然不意に落ちること。

f:id:nodamushi:20150714231938p:plain


 残されたログを見ても、やっぱりマウスイベントで落ちているようです。
f:id:nodamushi:20150714232108p:plain


 JRE8u45でも試してみましたが、結果は同じでした。


 むろん、これをFirefoxやChromeで動かしても特に問題は起こりません。
 コピペが出来ないだけだったら、JavaScriptを駆使して何とかなるかなとか思ってたんですが、JVMごとクラッシュするとなると流石にどうもならない。





 これがAceだけに限る問題なのか、WebViewそのものの問題なのか、ちょっと判断がつきませんが、WebViewもまだまだ不安定なんだなと思い知らされました。
 バグレポート?めんどくせ



 一応検索用にエラーコード貼り付け。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=7052, tid=6804
#
# JRE version: Java(TM) SE Runtime Environment (8.0_40-b25) (build 1.8.0_40-b25)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  0x0000000000000000
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#

情報工学生の非IT業界エンジニアとしての生き方

 どうも。お久しぶりです。

 別に人事部というわけでもありませんが、何故か採用の場に少し関わる事があったので、珍しく私事を書いてみようかなと思います。(このブログでは基本的には私事は書かないことにしているのですが)



 就職活動中、私には悩みがありました。私は情報工学出身で、学生時代はずっと画像処理やってきたけど、プログラム自体は大学2年生の頃からペイントソフトを作ろうという理由で始めたという出発の遅いカス。プログラムが出来るとは言わないけど、かといって多少プログラムかじってる以外に何か取り柄があるかと言われれば、何もない。となると、自分みたいなのがスキル生かそうとしたら、IT戦士として殉職していくぐらいしか使い道が思いつかない。でも、いや、だからこそ、IT業界には行きたくない。でも、IT業界以外、自分が何できるのかよく分からない。会計?営業?企画?う~ん。イメージ湧かない。


 そういうことで悩んでる人が他にいるのかは知らない。知らないけど、そういうことで何すれば良いのか分からなくて、どうしようもない人が居たなら、少しでも何かの力になれたらと思って、2年前私が思い悩んでいたことと、社会人になってから1年たった感想を少し述べてみようと思います。

 IT業界に行きたくない 行く当てもない 働きたくない

 さて、私が現在の部署に配属されてちょうど一年がたちました。さかのぼること2年前、絶対IT業界には行かない、二度とプログラムは書かない、私はアマグラマだと宣言しました。

 わざわざ、こんなタイトルの記事を読もうって人なのだから、きっと少なからずIT業界に対して否定的なイメージを持っているとおもいます。3K5Kとか?人によって否定的なイメージのとらえ方は違うでしょうが、私がとらえた否定的な面は、なによりもIT業界には特別天才でもない情報工学出身の凡骨なんかお呼びでないってことでした。それの是非については、結局IT業界に行かなかった私がとやかく言う権利はないので、私はそう思ったと述べるだけにしておきます。


 IT業界には行かない。そう決めたはよいが、さて、じゃぁ、何しようか。そう考えたとき、そもそも何もねぇ、って事に気がつきました。考えるのも面倒くさかったので、とりあえず推薦貰えそうな所貰って推薦で適当に受けましたが、推薦なのに落ちました( ゚д゚)


 さて、困った。自分の足で何か探さないといけないぞ。つっても、やりたいこともない。突き詰めて考えればそもそも働きたくない。できる限り部屋でゴロゴロして過ごしてたい。ニート万歳。社会人になった今でも私はなるべく働きたくねーぞ!



2 周りが決まってきたぞ やばいぞ 何でもいいや

 そんな感じで、就活すら止め、テッキトーにグダグダしてた2月~4月。(あれ、推薦結果が出るのって少なくとも4月じゃね?と思ったあなた。鋭いですね。本当のところ言うと、1月でやる気なくなって、推薦すら受ける前から就活放棄しちゃってたんです。)

 しかし、4月も終わろうという頃になると、私以外の研究生達はもうそろそろ全員内定決まってきます。

 やっべ。これ流石にやっべ!!(この段階で推薦以外には何も受けていない)と、さしもの私も焦ったらしく、5月になってから就活再開。


 今年(2015年)の採用計画は大きく遅らされることになったので、まだ間に合う時期だったかも知れませんが、2013年だとどう考えても既に出遅れ。学歴フィルタのおかげで、最終面接までは行くんだけど、「君来るのが遅いよ」とか「やる気ある?」とか「知財なら開いてるよ」とかそんな感じで落とされまくりました。


 で、6社目か7社目ぐらいで、今の会社に偶然説明会に行くことになる。事業内容は半導体。半導体とか全く知らねぇ。ていうか、その会社の事業内容はおろか、その存在まで会社説明会当日まで知りませんでした。そもそも、なんで会社説明会に登録してたのかも分からない。適当に片っ端から登録したんだろう。

 さて、あまりに会社知らなすぎて、志望動機なんてないもんだから「福利厚生が良いから」とかマジで書いて提出した様なこの男、いったいどういう縁があったのか、何故か内々定をもらってしまった。たぶん、学歴フィルタで通ったんだと思っている。学歴なんて意味がないと言われる昨今だけど、私はそんなことはないと思うぞ。


 給料がそんなに良いような会社ではないけど、志望動機にも書いたように福利厚生は良さそうだった。何より、製造業ってのは休みが多い。そして、ITとは全く無関係の半導体会社。特に行く当てがあるわけでもないし、断る理由もなかった私は、特に悩むこともなく、快諾した。

 こうして、電気電子工学科でもない男が、何故か半導体事業の会社に行くことになった。

3 自分がやってきたことを簡単に捨てられると思うな

 その後、泣きそうになりながらも何とか修了し、残念なことに めでたく社会人になってしまったることが出来きました。

 その頃の私はとにかく、何もかもが嫌だった。何もかも捨ててしまいたいと思っていた。社会人になったら、数年は先輩社員の言うことをハイハイと聞くだけの雑務をこなして適当にお金貰いたいと考えていました。なお、今でも思っています

 私は電気電子回路なんて高校の時に習った内容が最後であったため、どう考えても非即戦力。ゼロからの再出発が出来ると喜んでいました。



 当時の私から見れば運が良かったのか悪かったのか、結果論的にはとても良い巡り合わせの中で、その考えは甘かったと思い知らされることになります。


 製造業では避けて通ることが出来ない工場研修(※ここ重要。きつい人にはきついから覚悟してくべき!)を終えた後、現在もいる部署に配属されました。配属された先は出来たばっかりの新開発事業部。開発事業部の上の組織が何故か広告関係の組織で、理由を聞いてみたら、出来たばっかで今のところ採算性ないし、置く場所がなかったからと言われるなど、期待はされてるけど、まだ地に足はついていない新しい組織。いわば、社内ベンチャーに近い感覚なのかも知れない。

 そんな部署で、私を待っていたのは「デスクトップ用サポートツール一個作って」という一言と、パワポ二枚のこんな画面で、という注文だけ。しかもよくよく中身を詰めていくと、論文漁っても未解決問題だと判明。つまり、誰も答え知らない。ていうか、プログラミングが書ける人が基本的に私しかいない。


 社会人になったら、ただただ先輩社員の言うこと聞いて雑用だけしていたい。何もかも捨てて再出発したい。その私の願いは粉々に粉砕され、想定外の開発をする日々を送ることとなりました。



 ただ、この開発は私にとっては想像以上に楽しかった。
 考えてみて欲しい。与えられた課題に対して、誰も解法を知らない。そもそも私以外プログラムを書く人が私しかいない。
 そうなると、必然的に自分で問題定義をし、自分で調べ、自分で設計をし、自分で実装する。これだけ好き勝手やって楽しくないわけがない。

 
 私の場合、もう一つ幸運だったのが、人に恵まれたこと。先輩社員に恵まれたのもあるが、何より上司が相当ハイレベルな人だった。ハードウェアからソフトウェアまで何でも出来る。ついでに営業も出来る。上司は忙しくて時間がないからプログラムを書いてはいないが、相当書ける人だと思う。
 そういう人は私は傲慢な人間というイメージがあるのだが、上司はそういう人ではなかった。賢くて面倒見のいい人だった。人を使うのも上手い。基本的にやる気というものがない私を引っ張ってくれたのもこの人だ。

 その上司に言われた言葉が「自分がやってきたことを簡単に捨てられると思うな」だった。




 何もIT業界に行かなくても、何も天才プログラマーでなくても、何一つ他の取り柄が見つからなくても、情報工学生を必要としてくれる場所に私は偶然得ました。きっとここに限らず、いろんな所でも必要としてくれる場所はあるんだと思う。


 私が入った企業は一応、人数的にはギリギリ大企業の分類に入る中堅企業ですが、それでも情報工学を専門に学んだ者は非常に少ないし、そういう課題にもあまり取り組んでいない。やっと取り組み始めたところ。そういう場所では、我々はone of themではなく、元々特別なonly oneになれるのかも知れません。

 むろん、少数派だから、よく分かって貰えないから押しつけられる面倒などもあるかもしれません。あのプログラム言語が~~~とか、Vim野郎は引っ込め~~~とか、そんな変な話題に共感してくれる人もいません。課題で困っても、そもそも手取り足取り助けることが可能な先輩もいません。その辺は環境次第ですし、多少は避けて通れないでしょう。

 IT業界に行かないのが正解なのか、行くのが正解なのかについて、IT業界に行かなかった私が勝手に比較して述べるということはしません。

 ただ、私はIT業界に行かなくて良かったと今も思っています。


 もし、IT業界に行きたくないけど、行くあてもなくさまよってる情報工学生がいるのでしたら、ITと無縁そうな中堅企業を受けてみるのも一つの手だと思います。


 冒頭で述べた採用に関わった時に、自分の研究がどう生かせるのか、とかいう質問をされました。その質問が出てくる根本部分が、本当に研究が好きで続けたいからなのか、アイデンティティが消えてしまう不安からなのか、それは私にはわからない。ただ、私のように何もかも捨てたいと思っていた人間からすれば、全て捨てたかったのにあれもこれも残ってしまったと感じている。


 自分の何が生かせるのか?
 そういうことは心配しなくても、自分がやってきた事ってのは意外と自分の手元に残ると思います。

Graphicを設定したRadioButtonをSkinで使うと表示がおかしくなる

 ControlのSkinにRadioButtonを使う。RadioButtonには画像も表示させたい………。そんなに特別な場面ではないだろう。ところが、おそらくJavaFX8のバグと思われる妙な挙動をしたので、ここで報告しておく。すでにバグとして登録されているかはよく知らない。

 問題となるソースコードは次のようなもの。基本的には、TilePaneを拡張し、子要素に二つのRadioButtonを並べたSkin2というクラスを4つ表示しているだけだ。
 ただし、この二つのRadioButtonには、GraphicとしてAというラベルとBというラベルを設定している。

//import は略
public class Test extends Application{

  @Override
  public void start(final Stage stage) throws Exception{
    //-fx-skinでSkin2をskinに指定
    final Control2 c2 = new Control2();
    //createDefaultSkinでskinを指定
    final Control3 c3 = new Control3();
    //直接Skin2を表示
    final Skin2 s = new Skin2(null);
    //もう一回表示
    final Control2 c22 = new Control2();

    final VBox v = new VBox();
    v.setPadding(new Insets(50));
    v.getChildren().addAll(c2,c3,s,c22);
    stage.setScene(new Scene(v));
    stage.show();
  }

  public static class Control2 extends Control{
    public Control2(){
      setStyle("-fx-skin:'"+Skin2.class.getName()+"'");
    }
  }

  public static class Control3 extends Control{
    @Override
    protected Skin<?> createDefaultSkin(){
      return new Skin2(this);
    }
  }

  public static class Skin2 extends TilePane implements Skin<Control>{
    Control c ;
    public Skin2(final Control c){
      this.c = c;
      final RadioButton
      r1 = new RadioButton("a"),
      r2 = new RadioButton("b");
      r1.setGraphic(new Label("A"));
      r2.setGraphic(new Label("B"));
      getChildren().addAll(r1,r2);
      r1.setSelected(true);
    }

    @Override
    public Control getSkinnable(){return c;}
    @Override
    public Node getNode(){return this;}
    @Override
    public void dispose(){}
  }

  public static void main(final String[] args){launch(args);}
}

これを実行すると次のようになる。
f:id:nodamushi:20150302185844p:plain

最初と最後が明らかにおかしい。ボタンはないし、●は変なところに表示されているし、aと表示されていない。しかし、二つ目の「○B b」は正しく表示されている。

Skinで表示すると問題なのかと思ったが、createDefaultSkinを用いると、あら不思議、二列目のように正しく表示されている。ということは、リフレクション関連のバグ?

というわけで、どーいうことなんですかねぇ、これ。

ToggleButtonの集合を簡単に扱えるようにしてみた

 はてなにお布施の時期が過ぎていたので、ついでにはてなブログに移行してみました。プロの値段…高いよ………。

 さて、そんなこんなで、今日もJavaFXネタ。
 RadioButtonって複数のRadioButtonを並べて表示するって使い方が普通の場面だと思う。でも、これをするには

  1. 複数のRadioButtonを用意して
  2. ToggleGroupを用意して
  3. ToggleGroupにRadioButtonを追加して
  4. レイアウト用PaneにRadioButtonを代入して
  5. ToggleGroupのselectedToggleプロパティを監視して必要な値に変換させる

 ってな感じで面倒くさい

 というわけで、もうどっかにあるんだろうけど、この手順を簡略化するクラスを作ってみました。(長いので続きに。もしくはToggleButtons.java)

 で、それを使うと以下のように短く書けます。

//importは略
public class Test extends Application{

  public static void main(final String[] args){launch(args);}

  @Override
  public void start(final Stage primaryStage) throws Exception{
    final String[] fileList={"None Selected",
        "Lenna","Mandrill","Aerial","Earth","Girl","Parrots","Pepper","Siboat"};
    final ToggleButtons buttons = new ToggleButtons();
    //画像付きRadioButtonを追加
    for(int i=1;i<fileList.length;i++){
      final String fname = fileList[i];
      buttons.createItem(fname,Test.class.getResourceAsStream(fname+".jpg"));
    }
    //選択されているToggleButtonは数値になっている
    buttons.selectedProperty().addListener(new InvalidationListener(){
      @Override
      public void invalidated(final Observable observable){
        System.out.println(fileList[buttons.getSelected()+1]);
      }
    });

    primaryStage.setScene(new Scene(buttons.asFlowPane()));
    primaryStage.show();
  }
}

 実行するとこんな感じ
 f:id:nodamushi:20150301174913p:plain

続きを読む

タスクバーにタッチキーボードを表示させないorツールバー自体を削除する方法

 Windows8.1を使い始めてから1ヶ月ぐらい。私は特に8.1に大きな不満はない(でもWindows10に速攻で乗り換えるつもり)のですが、一つだけ文句があった。それは、Wacom Intuos5、つまりペンタブレットを挿すたびにこれ→が表示されること。


 検索するとちまたではタッチキーボードのサービスをオフにすれば出てこないよ!とか出てくる。むろん、そんなことは既に試した。だが、このアイコンだけは何故か出てくる!!(ちなみに、サービス停止してるので、このアイコンをクリックしても何も起こらない。)
 というわけで、何とかしてみた。なお、下記の方法を試すときは必ずバックアップを取った上で自己責任でお願いします。


1.諸根源のファイルを削除する

 最初はツールバーからこいつを削除する方法を探していたのだが、私の検索方法が悪いのか、そもそもそんな方法はないのか見つけられなかった。だったら、諸悪の根源であるファイル自体削除しちゃえば良いんじゃね?
 で、その諸悪の根源のファイルは

C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe

である模様。こいつの名前を_TabTip.exeとかに変更してみると、見事、ペンタブを挿しても表示されなくなりました。特にペンタブが使えなくなるとかの問題もない………とおもう。↓試し書き


 なお、リネームするにはこいつの所有権を奪う必要があるので、ファイルを右クリック→プロパティ→セキュリティのタブ→詳細設定ボタンでTabTip.exeのセキュリティの詳細設定を開き、所有者をAdministratorsになり適当に変更してください。


2.ツールバー自体を無効化する

 1をやった後にふと思ったのだけど、ツールバー要らなくね?ということで、そもそもツールバーを非表示にしてしまえ!ということで検索してみたら、ジャストな情報ありました。 Taskbar Toolbars - Enable or Disable
 上記リンクから画像↓のボタンをクリックしてファイルをダウンロードし、実行するだけ(レジストリを変更するので、不安な人は要バックアップ)
 





 これでツールバー自体が表示されなくなります。やったね。

JavaFXのLineChartがわりと高性能になった件

 ども、一ヶ月ぐらい前に作った自作のLineChartをちまちま更新していたら、何か結構高性能になったんじゃね?ってことで、動画にとって見ましたのでご紹介。
 機能としては、「データを拡大して、スライドさせることが出来る」「マウスポイントに追従してデータの位置を取得できる」「複数のLineChartの端を一致させたまま配置できる」「複数のLineChartでスクロールバーやマウスポイントを同期させられる」「大量のデータを入れてもとりあえず固まらない」あたりです。
NodamushiChart(Github)


 とりあえず、動画とか初めてキャプチャして、それをそのままYoutubeにぶち込んだだけだから画質とか酷いけど、気にしないで。てか、相当昔に取ったnodamushiのアカウントに付けてた名前が田中太郎って宇宙人かよ。(ネタ分かる人居るのかな)