2021年12月21日火曜日

近況など

最近は、iChainという保険アプリの会社でサーバーサイドのプログラムを書いています。
言語はというと、最初はRustで書くはずが、協力会社の都合によりJavaで書くことになり、
結局今でも延々とJavaを書いていたりします...

まあそれでもなんとか、Stream APIをフル活用して関数型的プログラムを楽しんでいます。
しかし、Javaの例外処理は嫌ですね。エラー処理はEither(Result)で書きたいところです。
次はVavrにでも挑戦しますか。

2021年2月7日日曜日

W10Wheel .NET 2.7.3

2.7.3

LR系のトリガーを有効にした状態では、AvastのUIに操作が効かなくなり、
タスクマネージャーで、W10Wheel.exeを終了するしかない状態に陥るため、
\\AvastUI.exeを除外する設定を追加しました。
※ AvastのUIがアクティブになると、他の操作をブロックされます。

# 新しい会社で支給されたPCにAvastが入っているため、急遽設定を追加。
# 今後、他でも使えるように、設定の汎用化を検討しています。

2021年1月25日月曜日

W10Wheel .NET 2.7.2

2.7.2

起動時にメッセージの変換をすると、初期化前の状態のため、
設定よりも環境の言語情報が優先されてしまうという問題を修正しました。

# 特に大きな問題ではありませんが、気になるので修正


近況: 2021/01/25

皆様、お久しぶりです。# ここを見ている人はもういないかもしれませんが...

3年と4か月お世話になった株式会社クオリティアから転職します。
残念ながら、クオリティアではレガシーな開発ばかりで
最新の技術に触れることができなかったので、来月からの開発が楽しみです。

クオリティアは色々と問題もありましたが、なかなか良い面も多く、
世間一般から見れば、そこまで悪い会社ではないと思います。
問題としては、10年以上前の古い技術ばかりだということです。
逆に言うと、最新の技術を求めず、安定を求める方であれば
比較的ラクな仕事が多いので、非常にお勧めできます。

※ これは古い製品のほうの開発部署の話です。
新規の開発のほうの部署の実態は全く知りません。
残念ながら、部署間が別の会社かのように分断されていて、
情報がほとんど共有されていません。
いわゆる、情報の透明性が低い会社ということです。

なんだか退職エントリのようになってしまいましたね。
ありがとうございました。

# 明日も休みなので、こんな時間の投稿ですみません。

W10Wheel.NET 2.7.1


GitHubのIssuesにて、プログラム側でも実装を提案されて、
管理者として実行されているかを確認するようにしてみました。
https://github.com/ykon/w10wheel.net/issues/4

確かに、このプログラムは管理者として動かさないと使い勝手が悪いので、
もっと早く実装するべきだったのかもしれません。

>W10Wheelは管理者モードで実行されていないため、
>一部のプログラムでは機能しません。
>そのため、管理者として実行することを推奨します。
>詳細を確認するには、「OK」を押してください。
英語の文章をベースにしたからか、文の繋がりがイマイチですね。
もうちょっと綺麗に繋がらないものでしょうか。

2019年5月6日月曜日

RawInput in Rust

コンソールにマウスの移動値を出力します。


/*
[dependencies]
widestring = "0.4.0"
lazy_static = "1.3.0"
[dependencies.winapi]
version = "0.3.7"
features = ["winuser", "winbase", "libloaderapi", "hidusage"]
*/
#[macro_use] extern crate lazy_static;
use std::mem;
use std::ptr;
use std::alloc::{alloc, dealloc, Layout};
use winapi::{
um::{
winuser::{
RegisterRawInputDevices, DefWindowProcW, RegisterWindowMessageW, GetRawInputData,
WNDCLASSEXW, RAWINPUTHEADER, RAWINPUTDEVICE,
WM_INPUT, WM_QUERYENDSESSION, RID_INPUT, HRAWINPUT, RAWINPUT, RIM_TYPEMOUSE, MOUSE_MOVE_RELATIVE,
RIDEV_INPUTSINK, RegisterClassExW, CreateWindowExW, ChangeWindowMessageFilterEx,
GetMessageW, TranslateMessage, DispatchMessageW, MSG, LPMSG
},
libloaderapi::{ GetModuleHandleW },
},
shared::{
windef::{ HWND },
minwindef::{ UINT, WPARAM, LPARAM, LRESULT, LPVOID, DWORD, PUINT, HINSTANCE },
hidusage::{
HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_MOUSE
}
},
};
use widestring::U16CString;
const MSGFLT_ALLOW: DWORD = 1;
lazy_static! {
static ref WM_TASKBAR_CREATED: UINT = unsafe {
RegisterWindowMessageW(U16CString::from_str("TaskbarCreated").unwrap().as_ptr())
};
static ref CB_SIZE_HEADER: UINT = mem::size_of::<RAWINPUTHEADER>() as UINT;
static ref CLASS_NAME: U16CString = U16CString::from_str("W10Wheel/R_WM").unwrap();
}
unsafe fn proc_raw_input(l_param: LPARAM) -> bool {
let mut pcb_size = 0;
let is_mouse_move_relative = |ri: RAWINPUT| {
ri.header.dwType == RIM_TYPEMOUSE && ri.data.mouse().usFlags == MOUSE_MOVE_RELATIVE
};
let get_raw_input_data = |data: LPVOID, size: PUINT| {
GetRawInputData(l_param as HRAWINPUT, RID_INPUT, data, size, *CB_SIZE_HEADER)
};
if get_raw_input_data(ptr::null_mut(), &mut pcb_size) == 0 {
let layout = Layout::from_size_align(pcb_size as usize, 1).unwrap();
let data = alloc(layout);
let mut res = false;
if get_raw_input_data(data as LPVOID, &mut pcb_size) == pcb_size {
let ri = std::ptr::read(data as *const RAWINPUT);
if is_mouse_move_relative(ri) {
let mouse = ri.data.mouse();
println!("{}, {}", mouse.lLastX, mouse.lLastY);
res = true;
}
}
dealloc(data, layout);
return res;
}
false
}
unsafe extern "system" fn window_proc(hwnd: HWND, msg: UINT, w_param: WPARAM, l_param: LPARAM) -> LRESULT {
match msg {
WM_INPUT => {
if proc_raw_input(l_param) {
return 0;
}
},
WM_QUERYENDSESSION => {
return 0;
},
_ => {
if msg == *WM_TASKBAR_CREATED {
return 0;
}
},
};
DefWindowProcW(hwnd, msg, w_param, l_param)
}
unsafe fn message_loop(msg: LPMSG) {
loop {
if GetMessageW(msg, ptr::null_mut(), 0, 0) == 0 {
return;
}
TranslateMessage(msg);
DispatchMessageW(msg);
}
}
fn make_window_class(h_instance: HINSTANCE) -> WNDCLASSEXW {
WNDCLASSEXW {
cbSize: (mem::size_of::<WNDCLASSEXW>()) as UINT,
cbClsExtra: 0,
cbWndExtra: 0,
hbrBackground: ptr::null_mut(),
hCursor: ptr::null_mut(),
hIcon: ptr::null_mut(),
hIconSm: ptr::null_mut(),
hInstance: h_instance,
lpfnWndProc: Some(window_proc),
lpszClassName: CLASS_NAME.as_ptr(),
lpszMenuName: ptr::null_mut(),
style: 0,
}
}
fn make_raw_input_device(hwnd: HWND) -> RAWINPUTDEVICE {
RAWINPUTDEVICE {
usUsagePage: HID_USAGE_PAGE_GENERIC,
usUsage: HID_USAGE_GENERIC_MOUSE,
dwFlags: RIDEV_INPUTSINK,
hwndTarget: hwnd,
}
}
fn main() {
unsafe {
let h_instance = GetModuleHandleW(ptr::null());
let window_class = make_window_class(h_instance);
if RegisterClassExW(&window_class) != 0 {
let hwnd = CreateWindowExW(0, CLASS_NAME.as_ptr(), ptr::null_mut(), 0, 0, 0, 0, 0, ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ptr::null_mut());
ChangeWindowMessageFilterEx(hwnd, *WM_TASKBAR_CREATED, MSGFLT_ALLOW, ptr::null_mut());
let rid = make_raw_input_device(hwnd);
let mut rid_array = vec![rid];
RegisterRawInputDevices(rid_array.as_mut_ptr(), 1, mem::size_of::<RAWINPUTDEVICE>() as UINT);
let layout = Layout::new::<MSG>();
let msg = alloc(layout);
message_loop(msg as LPMSG);
dealloc(msg, layout);
}
}
}
view raw raw_input.rs hosted with ❤ by GitHub

2018年4月8日日曜日

近況 / 2018-04-08

またも、こちらを放置してしまっていて、すみません。
最近は引っ越しなどがあったりで、W10Wheelの改良が進んでいません。
# W10Wheel自体は職場でも家でも常に使っているので、
# 致命的な問題があれば、即対応できるはずです。

# 八丁堀の古いマンションに引っ越ししました。
# 職場(茅場町)まで7~8分という最高の場所です。
# しかし、家自体に色々と問題があり、再引っ越しを計画しています。

「Java 10」がリリースされたことは確認しています。
// exewrapの対応次第、こちらもアップデートを行う予定です。

これからも細かいバグの修正であれば対応可能ですが、
本体のこれ以上の改良は自分だけの力では難しいかもしれません。

# もう少しまとまった時間が確保できれば、
# Electronを使ってGUIを作ってみるとか、
# 本体をRustで書き直すとかやってみたいところです。

WindowsのAPIに詳しい人がいましたら、
是非とも改良を手伝ってくれるとありがたいです。

2018年1月4日木曜日

W10Wheel v2.7 (Java and .NET)

https://github.com/ykon/w10wheel/releases
https://github.com/ykon/w10wheel.net/releases
  • メニューとダイアログテキストの日本語化
  • 言語変更対応のため、メニュー周辺の大規模リファクタリング
  • VHAdjusterの改良 (カーソルを毎回変更しないように)
  • VHAdjuster有効かつHorizontalScroll無効の場合に、水平スクロール可能な問題を修正
メニュー周辺を大きく変更したため、新しくバグが発生してしまった可能性もあります。
翻訳漏れや、何か問題を見つけた場合は、報告をよろしくお願いします。

また、日本語化の内容ですが、大きく意訳しているところもあります。
何か違和感を感じたりした場合は、改善案をご提示いただけると幸いです。
https://github.com/ykon/w10wheel/blob/master/src/main/scala/hooktest/Locale.scala
https://github.com/ykon/w10wheel.net/blob/master/W10Wheel/src/LocaleData.fs

2017年12月24日日曜日

W10Wheel - 日本語化

現在、ロケールまた設定で言語を切り替える仕組みを作り、
メニュー項目とダイアログのテキストの翻訳中です。
Java版(Scala版)のみですが、70%ほど終わりました。

カタカナにするか漢字にするかなどで悩み、意外と時間が掛かります。
残念ながら、今日中には終わらなそうです。

2017年12月10日日曜日

W10Wheel - ON/OFFボタンの表示改善

こちらのサイトを見ると
http://did2memo.net/2017/07/09/w10wheel-net/
>> OFFと書いてあるのが、オフにするボタンかと思った
との記述があり、表示方法を改善したいと思います。

以下の候補がありますが、どれがいいでしょうか。
また、他に良い方法があったら教えてください。

1. ON (--> OFF) / OFF (--> OFF)
2. ON (to OFF) / OFF (to ON)
3. ON/OFF # 文字列は変更しない

# 普通の設定画面を作ったほうがいいとは思いますが、
# なかなか実装が大変そうで取り掛かれていません。
# 現在仕事でWeb系のプログラムを触っているので
# HTML, CSS, JavaScript(もしくはAltJS)で設定画面を作って、
# ブラウザからHTTPで設定を受け取ろうかとも考えています。

W10Wheel v2.6.5 (Java and .NET)

URL:
https://github.com/ykon/w10wheel/releases/
https://github.com/ykon/w10wheel.net/releases/

共通:
* IOの高負荷状態に、入力キューが溢れていた問題を修正

Java:
* exewrapをv1.2.3に更新
実行時にVMオプションを変更する機能を追加
詳細: https://exewrap.osdn.jp/

変更自体は小さいのですが、重要なコアにあたる部分の修正です。
これによって高負荷状態での安定性が少し改善するかもしれません。
# Java版では並列性も改善します。


追記: (2017-12-12)
昨日今日と試した結果、少しなんてものではなく劇的な改善でした。
ESETのファイルスキャン時に不安定になることがありませんでした。
長く患っていた、この問題を修正することがやっとできたようです。

しかし、もっと早く気付くべきでした。
この問題のコードは一番最初から存在していました。
今まで不安定な状態を放置して申し訳ございませんでした。

2017年10月28日土曜日

アンチウイルスソフト

アンチウイルスソフトがファイルスキャンしている時など、
IOが高負荷状態になると、W10Wheelの動作が不安定になります。
現在は「Esc+クリック」の状態初期化で一時的な対処となっています。
この現象は解決したいのですが、何かいい方法が見つかっていません。


追記: (2017-12-12)
v2.6.5にて修正されました。

W10Wheel 2.6.3 (Java)

https://github.com/ykon/w10wheel/releases

exewrapを更新しました。
> Java9のパスをレジストリから検出

2017年10月22日日曜日

W10Wheel 2.6.2 (Java版のみ)

https://github.com/ykon/w10wheel/releases/

Java9との互換性が上がっているようです。
ただし、現時点のexewrap(1.2.0)はJDK9をインストールした環境で
JRE9を自動的に見つけられません。
# JAVA_HOMEにパスを設定すると動きます。