タグ

ブックマーク / blog.64p.org (62)

  • KeyScripten.app:マクロの未来を切り開くプログラマブルキーボードシステム - tokuhirom's blog

    QMK で増井さんの Dynamic Macro を実装してみた のだが、Mac のレイヤーで普通にやりゃいいんじゃないかという話になったので、やってみた。 rust で実装できないかなぁと思って調べてみたところ rdev を使えば良さそうだということがわかった。が、rdev は Mac, Windows, Linux をサポートしていて抽象化レイヤーとなっていて、要件を満たせないということがわかった。 rdev を見ていると、CGEventTap というAPIがあることがわかって、これをベースにやれば良さそうだった。 CGEventTap を使うと、マウスとキーボードのイベントを取れる。CGEventCreateKeyboardEvent, CGEventCreate とかして CGEventPost すればキーボード入力イベントがポストできる。ということがわかり、これを使えば Dyna

    tagomoris
    tagomoris 2024/01/18
    便利かもしれん / 途中唐突に語調が変わっててウケるw ChatGPTに書かせたのかな
  • あるプロジェクトを Gradle kotlin DSL に移行した - tokuhirom's blog

    あるプロジェクトを Gradle kotlin DSL に移行した お仕事プロジェクトの一つを gradle kotlin dsl に移行させてみた。 理由としては以下。 gradle kotlin dsl を利用すると、人によるブレが少ない parenthesis の省略などができないので gradle 5.0 がリリースされると kotlin dsl が正式版となる。 実際に触ってみたい といったところで、デメリットとしてはとりあえず以下がある。 git clone して ./gradlew build したときの速度が groovy 使ってる場合よりもやや遅いらしい で、実際に触ってみた感じの感想は以下。 ドキュメントが少ない(公式ドキュメントは現状 groovy で書かれているし) プラグインごとに github.com を検索して回らないと書き方がよくわからない 現状では無理して

    tagomoris
    tagomoris 2018/11/16
  • tokuhirom's blog

    Re: Java 7 時代の String#split() 事情 http://blog.k11i.biz/2013/05/java-7-stringsplit.html http://d.hatena.ne.jp/chiheisen/20110801/1312119289 Java 7 以後では String#split(String) で、引数が1文字の場合は最適化が効いて、高速になるという話。 社内でなんか話題になってたので最近の JVM だとどうなのかなーと調べてみた(元エントリは5年前のもの)。 (Pattern#split にもいずれ同様の最適化が入る可能性はあるので、このベンチマークの傾向は今でも一緒なのかなーと気になったため) https://travis-ci.org/tokuhirom/java-string-splitting-benchmark 元のコードは手でベン

    tagomoris
    tagomoris 2018/07/17
  • tokuhirom's blog

    Ruby の deserializer の速度比較 ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16] require 'msgpack' require 'benchmark' require 'json' # https://github.com/fluent/fluentd/blob/master/lib/fluent/plugin/parser_ltsv.rb class LTSV def self.parse(text) r = {} text.split("\t").each do |pair| key, value = pair.split(":", 2) r[key] = value end r end def self.generate(data) data.map {|k,v| k+":"+v }.j

    tagomoris
    tagomoris 2018/02/01
    msgpack や json はC拡張なのに較べてRubyで書かれたLTSVはな……
  • tokuhirom's blog

    kotlin で native code を生成 kotlin native を楽しみたい androidkotlin が話題なので、kotlin native を試してみました。 kotlin native を利用すると、kotlin のコードをネイティブコードにコンパイルできます。 https://github.com/JetBrains/kotlin-native git clone [email protected]:JetBrains/kotlin-native.git しておいて ./gradlew dependencies:update ./gradlew dist す。Hello.kt を作成する。 fun main(args : Array<String>) { println("Hello, world") } 以下のように、コンパイルする。 ./dist/bin

    tagomoris
    tagomoris 2017/05/18
  • golang プロセスのモニタリングってみんなどうしてるんですかね、という話 - tokuhirom's blog

    [9:43 AM] tokuhirom plack のアプリだと Plack::Middleware::ServerStatus::Lite とかで監視したりしますけど、go だとそういうのってどうやるのが一般的なんでしょうか? [9:47 AM] macopy https://github.com/fukata/golang-stats-api-handler github.com GitHub - fukata/golang-stats-api-handler: Golang cpu, memory, gc, etc information api handler. golang-stats-api-handler - Golang cpu, memory, gc, etc information api handler. [9:47 AM] https://golang.org/pk

    tagomoris
    tagomoris 2017/02/22
    golangにおけるServerStatus::Lite的なやつ
  • hotspot の NullPointerException 時の表示をわかりやすくできないかなあと思って調べたけど挫折した - tokuhirom's blog

    解決したいこと foo.bar(baz.boz()); みたいなケースで、NPE が発生した場合に、foo が null で例外発生したのか baz が null で例外発生したのかわからん やってみる bash configure --with-native-debug-symbols=internal --enable-headless-only --with-debug-level=slowdebug --disable-warnings-as-errors make 動かしてみると以下のような出力を得られる。 Exception in thread "main" java.lang.NullPointerException at NPE.main(NPE.java:4) これは以下のソースから出力されている。Thread 単位で uncaught exception が発生させられ

    tagomoris
    tagomoris 2016/10/17
  • 俺がレビューコメントでよくつけるやつ - tokuhirom's blog

    的にメンバーは良いコードを書くという前提で暮らしています。 良いと思います。テストがあるともっと良いと思います。 変更が軽微で、まあテストなくてもいいけど、あったほうがより良いよねえ、という時に使う 動いてるんならいいと思います 処理が複雑なので、実際に動かしてみないとうまく動くかどうかコードをパッと見ただけだったらよくわからないけど、動いてるんならちゃんと動いてるんだろうな、という気がするときに使います。 lgtm シフトキーをオスのもめんどくさいなって時には小文字で書きます。 コメントが無いとあとでなんだかわからなくなっちゃうかも? ちょっと複雑な処理なのにコメントないときとか wiki へのリンクを貼ってくだされ~ 仕様がちょっと複雑だったり、後から経緯おえないと死ぬな、という時に言います 日語でOK 英語でコメントついてるけど、コメントの内容が端折り過ぎで説明不足なときにいい

    tagomoris
    tagomoris 2016/08/04
    lgtm
  • [ruby] 10s 10m みたいな文字列から秒数を求めるには chronic_duration を使う - tokuhirom's blog

    https://github.com/hpoydar/chronic_duration なにかの実行間隔のような設定がある場合、chronic_duration を利用してパースすることができる。 実行例は以下の通り。integer をそのまま渡すとエラーになるので、integer が渡ってきそうなケースでは to_s して渡すようにするのがよさそう。 パースできない場合には nil が返ってくるので、nil もケアしてあげる必要があります。 [1] pry(main)> require 'chronic_duration' => true [2] pry(main)> ChronicDuration.parse(3) NoMethodError: undefined method `downcase' for 3:Fixnum from /Users/tokuhirom/.rbenv/v

    tagomoris
    tagomoris 2016/05/17
    へえ、知らんかった、と思ったがちょっと対応幅が広過ぎる感があるな……
  • javaagent として動く java のサンプラを書いた - tokuhirom's blog

    java アプリケーションのサンプリングを簡単にやるための簡単なライブラリを書いた。javaagent の習作的なやつです。 https://github.com/tokuhirom/java-samples/tree/master/nanojsampler たんに、定期的に Thread.getAllStackTraces() して、よしなに集計した結果を jmx に流し込んでいる。 package me.geso.nanojsampler; import javax.management.*; import java.lang.instrument.Instrumentation; import java.lang.management.ManagementFactory; import java.util.Comparator; import java.util.List; impo

    tagomoris
    tagomoris 2016/05/09
  • gradle が混乱したときにとにかく念入りにキャッシュ消したい時にうつコマンド - tokuhirom's blog

    gradle を使っている時に、変なライブラリを依存に加えた結果、依存関係が混乱し、どうにもならなくなるときがある。 そんな時は設定を戻してから以下のように打てば、とにかくキャッシュは消えて、とりあえずなんとかなる気がする。 pkill -f gradle; rm -rf ~/.m2/repository/ ~/.gradle/caches/ .gradle; ./gradlew --recompile-scripts --refresh-dependencies --rerun-tasks clean check

    tagomoris
    tagomoris 2016/02/15
  • Perl5 での Plack に当たる Crust をみんなで作った話 - tokuhirom's blog

    この記事は Perl 6 Advent Calendar 2015 の1日目です。 Perl 6 は、2015年のクリスマスにリリースされることになっており、我々としてはそれを待ち受ける必要があると考えました。 Perl6 がリリースされた暁には、いろいろ遊ぼうかなという気持ちをみなさんお持ちだと思います。 Perl6 には夢が詰まっており、様々な機能が含まれている夢の言語です。 そういった、夢の機能については今後、クリスマスまでの間に、語られていきますが、稿では、現実的な話をします。 今年のクリスマスに Perl6 がリリースされるぞ、という宣言がでたわけですが、そうなってくると、Perl6 をクリスマスから早速遊びたいなと思うわけですよね。 そして、私は web engineer なので、 Perl6 が出たら早速 web application を書きたいと思うわけです。 しかし、

    tagomoris
    tagomoris 2015/12/01
    “そういった、夢の機能については今後、クリスマスまでの間に、語られていきますが、本稿では、現実的な話をします。”
  • Java 8 の DateTimeFormatter の曜日等のフォーマットについて - tokuhirom's blog

    DateTimeFormatter を利用して曜日などのフォーマットを行おうとすると、実際どういうふうにフォーマットされるのかよくわからんということになる。 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html をちらっと見ると、以下のように書いてあって、各シンボルが何を表すのかよくわからない。 Symbol Meaning Presentation Examples ------ ------- ------------ ------- G era text AD; Anno Domini; A u year year 2004; 04 y year-of-era year 2004; 04 D day-of-year number 189 M/L month-of-year n

    tagomoris
    tagomoris 2015/07/13
    これはまた使うのが難しい感じだなw
  • Graceful shutdown on Embedded Jetty - tokuhirom's blog

    You should set following 2 options. server.setStopAtShutdown(true); server.setStopTimeout(7_000); setStopAtShutdown sets code Runtime.getRuntime().addShutdownHook to stop Jetty at JVM shutdown phase. ref. https://github.com/eclipse/jetty.project/blob/master/jetty-util/src/main/java/org/eclipse/jetty/util/thread/ShutdownThread.java setStopTimeout is required. Without this option, Jetty kills all co

    tagomoris
    tagomoris 2015/07/09
    Norikraでもgraceful stopするべきかな
  • Server::Starter から簡単に Java プロセスを起動できるようになった - tokuhirom's blog

    JVM には inetd から起動するときのために、file descriptor 0 をソケットとして開く機能がついている。Jetty 等もこの機能に対応しているので、簡単に利用できる。 file descriptor を 0 に固定出来る機能が Server::Starter にあればよかろうということで、以下のような指定で起動できるように実装した。 $ start_server --port=20000=0 java EchoServer この機能により、Java も LL と同様な形態でアプリケーションを運用することが可能となる。 Java では昔から ClassLoader 機構を利用することによりホットデプロイを行うことが可能だが、リソースの解放が漏れるなど開発時の難しさが指摘されている。 Server::Starter 方式では JVM のプロセスごと死ぬので、綺麗な状態で都

    tagomoris
    tagomoris 2015/05/29
  • TokuLog 改めB日記

    HTML の pre を折り返したい HTML の pre 要素を利用して表示させているときに、通常は長い行があっても折り返されない。 折り返したい場合は以下のようにする。 .wrap { white-space: pre-wrap; word-wrap: break-word; } gradle の detekt と detektMain の違い ./gradlew detekt では一件も検出されないが、detektMain だと検出されまくるという時がある。 一般的な checkstyle などのプラグインではcheckstyleMain は checkstyle をメインソースセットに対してだけ実行するという意味なので、checkstyleMain と checkstyleTest を足したものにだいたい等しいのだが、detekt の場合は違う。 detektMain/detekt

    tagomoris
    tagomoris 2015/05/29
    おおっ
  • Perl6で「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目を解いてみた - tokuhirom's blog

    http://qiita.com/tag1216/items/25ff0f957340c54ae73c Perl6 だと eval が EVAL になってるのと、文字列結合演算子が ~ になっているのと実行が異常に遅いこと以外は違いはない。 calc(1, 1); sub calc { my ($b, $n) = @_; if ($n==9) { say $b if EVAL($b) == 100; } else { for ('+', '-', '') { calc($b ~ $_ ~ ($n+1), $n+1); } } } Perl5 なら以下のように極めてわかりやすく記述することが可能。 my $x = 1; for ('+', '-', '') { my $x = $x . $_ . 2; for ('+', '-', '') { my $x = $x . $_ . 3; for

    tagomoris
    tagomoris 2015/05/27
    Perl5 ダイナミックスコープ最高!
  • Java の AST を解析できる javaparser がアツい!!! - tokuhirom's blog

    https://github.com/javaparser/javaparser javaparser は Java をパースして AST にしてくれるライブラリである。 この手のライブラリは数多あるのだが、ほとんどのものが Java 1.5 ぐらいでメンテナンスが止まっている。 実際このライブラリもメンテナンスが止まっていたのだが、Java 1.8 対応版とし開発が再開されたものだ。 このライブラリはパーサーライブラリであるから、文字列をパースして AST を構築してくれるというものになっている。 実際どのような AST が構築されるのかが気になるところなので、構築された AST をダンプできるツールを groovy で書いた。 #!/usr/bin/env groovy @Grab('com.github.javaparser:javaparser-core:2.1.0') impor

    tagomoris
    tagomoris 2015/05/21
  • gradle で maven central にあげる - tokuhirom's blog

    ちょっと前に gradle で maven central にあげようとしたら極めて困難な印象で挫折していたのだが、最近試したらすんなりといったのでご報告申し上げます。 単に gradle が難しいというよりは、maven central 等の toolchain 的な部分に関する知識がだいたいわかったので、すんなりわかったという点も多いんですが。 まず、gradle に maven central にアップロードする方法は、実は公式サイトにまとめられています。 http://central.sonatype.org/pages/gradle.html的にはこの通りに設定すればいいのだが、このドキュメント、gnupg とかについてはすでに設定済みだ、というような前提に基づいているので注意が必要。 アカウントの取得等についてはモリスさんのエントリを読めばよろしい。 http://tag

    tagomoris
    tagomoris 2015/04/20
  • GS Collections Kata をひと通りやった - tokuhirom's blog

    GS Collections というゴールドマン・サックスさんが出してる Java 用のコレクションライブラリがある。 Java Day Tokyo/JJUG CCC 2015 Spring で知ったのだが、これは以下のような利点を持っているようだ。 使いやすいインターフェース メモリ使用量が標準のコレクションよりもよい場合がある Multimap や sortedbag などの標準にはないコレクション GS Collections には GS Collections Kata という、チュートリアルがある。これは junit test case の形式をしていて IDE で読みこめばすぐに試せる。 順番に指示通りにやっていけば試せるんで、なかなか良い。 例も Company, Order, Supplier, LineItem など具体的で、わかりやすい。結構手間かかってるな、という印象

    tagomoris
    tagomoris 2015/04/17