今日も窓辺でプログラム

外資系企業勤めのエンジニアが勉強した内容をまとめておくブログ

HHKB + AutoHotKey で、Mac の Command と Control を使い分けられる操作感を Windows でも手に入れる

Windows と Mac の Control キーの違いから生じる問題

Windows ではコピーやペースト等のショットカットの実行に Control キー (Ctrl) を多用します。

一方で Mac では Ctrl キーはカーソル移動等に使うことが多く、コピーやペーストといった操作には代わりに Command キー (Cmd) を使用します。

Mac での Emacs ライクなキー移動等に慣れてしまい、かつ仕事とプライベートでの OS が Win/Mac で異なる場合、Windows を使っている場合にキー移動の効率が落ちたりショートカットが思うように実行できずにストレスを感じてしまうこととなります。

解決策

Happy Hacking Keyboard (HHKB) と AutoHotkey を併用することで解決を試みます。

基本方針としては、Mac のキーを Windows 側では次のように代替し、Windows の左 Ctrl と 右 Ctrl を Mac の Ctrl と Cmd に近い位置に配置することを目指すことになります。

Mac Windows
Ctrl 左 Ctrl
Cmd 右 Ctrl

物理的なキー配置の実現

左 Ctrl を A キーの左隣に、右 Ctrl を Mac でいう Cmd キーのあたりに配置するには、HHKB を購入し、キーマップ変更ツールを使用します。

ショートカットの設定

AutoHotkey にて以下の設定を行います。

  • Mac の Ctrl キーを使ったカーソル移動関連ショートカットを、左 Ctrl キーを使って実現する
  • 上記で使えなくなったショートカットを右 Ctrl との組み合わせで使用可能にする
  • Mac の Cmd キーを使ったショートカットのうち Windows 側でも欲しいものを右 Ctrl との組み合わせで使用可能にする

下記は一例ですが、このような設定ファイルを用意するイメージです。

; Emacs-like keybindings for moving cursor
<^p::Up
<^n::Down
<^f::Right
<^b::Left
<^a::Home
<^e::End
<^d::Delete
<^h::Backspace

; Use Right Ctrl to trigger "Mac Ctrl" shortcuts
>^p::Send "^p"
>^n::Send "^n"
>^f::Send "^f"
>^b::Send "^b"
>^a::Send "^a"
>^e::Send "^e"
>^d::Send "^d"
>^h::Send "^h"

; Mac Command key shortcuts
>^c::Send "^c"
>^x::Send "^x"
>^v::Send "^v"
>^s::Send "^s"

問題点

問題点として、たまにキー入力が AutoHotkey に奪われずに送信されてしまうことがあります。

例えば "左Ctrl + P" を連打してカーソル移動している場合に、ブラウザだったら意図せず「印刷」ダイアログが表示されたり、VSCode だったら意図せずコマンドパレットが表示されたりといった具合に、結構ストレスを感じるので何とかしたいと思っています。

ChatGPT にコーディング面接の面接官をやらせてみる

背景

ChatGPT (GPT-4) が話題ですね。日々驚くべき記事や活用方法を目にしていますが、中でも次の記事のように、プロンプトを与えるだけで自然言語を活用したゲームが簡単に実現できてしまうことに感動しました。

note.com

コーディング面接の問題を解かせるような試みは多くなされている中で、このゲームのプロンプトを元にすれば、コーディング面接の面接官を ChatGPT にやってもらえるのでは?と考え、実際やってみました。

プロンプト

ChatGPT に入力するプロンプトは以下の通りです。まだ試行錯誤があまり行えていない段階のものですが、それでもある程度それっぽく動きます。

出題する問題の分野や難易度は色々調整の余地があると思います。

As a GPT-4 AI interviewer, you'll have a coding interview with a candidate. You'll ask some coding questions to the candidate in the real world., and the candidate would write answers in their favorite programing language or natural language.

# Coding Interview Rules:
* Provide an simple coding questions as an AI interviewr.
* Candidate is human and answers to your questions by programing languages or natural language.

## Basic Interview Process
* First the interviewer does self-introduction shortly as an ice breaking. The candidate do not need to do self-introduction.
* Then, the interviewer ask an easy coding question as a screening question.
* The candidate can ask some questions to clarify their understanding about the coding question.
* If the candidate gives a valid code snippet, the interviewer would move to the next coding question. If not, the interview ends here.
* In the second coding question, the interviewer ask a medium level coding question. The candidate can clarify their task again.
* If the candidate gives a valid code snippet to the second question, the interview gives some extra questions that relates to the code written by the candidate.
* In both first and second question, the interviewer can ask the candidate to rewrite code if time complexity or space complexity is  not acceptable.

## Basic Candidate Profile
* Candidate studied computer science in university.
* Candidate have used Python in their class and research, but the candidate never experienced a professional software engineer.

All Input and output should be in Japanese.

動いている様子

現実のコーディング面接をすぐに置き換えられるとは思わないですが、その可能性を少し感じられたり、少なくとも面接の練習にはなったりするのではないでしょうか。

1問目の肩慣らし問題の様子

2問目の中級レベルの問題の様子

追加質問もしてくれる

最後は面接というよりも教育してくれる

バグは指摘してくれる

SimpleImputerで欠損値を補完する

この記事について

Scikit-learnのSimpleImputerクラスを使用すると、データセットの欠損値を簡単に補完することができます。Kaggleの練習用Competitionでも使われているタイタニックのデータセットを例に、SimpleImputerをどのように使うか見ていきたいと思います。

続きを読む

MT4でカスタム指標を定義してみる

前回はMT4でスクリプトを実行してみました。今回はチャートに自分で定義した指標を描画するカスタム指標を定義してみようと思います。

カスタム指標とは

前回も紹介した通り、カスタム指標 (Custom Indicator) とは独自に作成したテクニカル指標をチャートに描画するためのプログラムです。

カスタム指標には初期化のためのOnInit()関数と実際に指標を計算するOnCalculate()関数を定義しますが、カギとなるのは OnCalculate() 関数で、次のような場合にカスタム指標を計算するために呼ばれます。 1. カスタム指標がチャートに読み込まれ、初期化処理 (OnInit()) が終了した直後 1. 新しいティックを受信したとき

続きを読む