2020/07/20


はじめに

2016年にこんな記事を書きました。

Big Sky :: Windows ユーザは cmd.exe で生きるべき。

[D] Windowsはターミナルがダメだから使えないってのは過去の話? 基本的にはいい感じに見えますが、いくつか問題は発覚してます。 http://blog.drikin.com/2015/01/w...

https://mattn.kaoriya.net/software/why-i-use-cmd-on-windows.htm

この記事は日常からコマンドプロンプトを使うユーザに Windows で生き抜く為の僕なりの方法を教授したつもりです。最近は PowerShell を使われる方も多いと思いますが、僕はどうしても PowerShell が好きになれず、未だにコマンドプロンプトで生き続けています。

あれから4年

記事の反響は結構大きく、いろいろなコメントも頂きました。あれから幾らかこのハック方法をアップデートしてきたので、この記事で紹介したいと思います。前の記事では、こんな事を言っていました。

コマンドインから groovy を使った開発を行いたい場合は、まずこのバッチファイル(groovyenv.bat という名前にしています)を実行します。

この方法も確かに良いのですが、使いたい時に xxxenv.bat を起動する手間は意外と大きかったりもするのです。またバッチファイルを作るのも手間でした。でも PATH 環境変数の長さにも限界があるし、毎回毎回 xxxenv.bat を作るのが面倒臭い。

分かります。そこで思いついたのが以下の新しい方法です。

マクロを使え

新しい方法といっても、基本は前の方法と変わりません。レジストリエディタを起動し、以下のキーに AutoRun という文字列値を作ります。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor

文字列値の中身には以下を設定します。

%USERPROFILE%\init.cmd
regedit

こうするとコマンドプロンプトが起動する度に %USERPROFILE%\init.cmd が実行されます。init.cmd の中身は簡単な内容です。

@echo off

doskey /macrofile=%USERPROFILE%\init.macros

if "%CMD_INIT_SCRIPT_LOADED%" neq "" goto :eof
set CMD_INIT_SCRIPT_LOADED=1

set EDITOR=c:/dev/vim/vim.exe
set GIT_EDITOR=c:/msys64/usr/bin/vim.exe
set GRAPHVIZ_DOT=c:/dev/graphviz/bin/dot.exe
set LANG=ja_JP.UTF-8
set GOROOT_BOOTSTRAP=c:\users\mattn\go1.13.5
set CMAKE_GENERATOR=MSYS Makefiles
set GIT_SSH=c:\windows\system32\openssh\ssh.exe

cls

冒頭で init.macrosdoskey で読み込んでいる点を見て下さい。doskey コマンドにはエイリアス機能があるのですが、これを使って特定のコマンドをフルパスで参照しようというハックです。例えば僕の init.macros は以下の通り。

ls=ls --color=auto --show-control-chars -N $*
licecap="C:\Program Files (x86)\LICEcap\licecap.exe" $*
gimp="C:\Program Files\GIMP 2\bin\gimp-2.10.exe" $*
vlc="C:\Program Files\VideoLAN\vlc\vlc.exe" $*
code="C:\Users\mattn\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd" $*
ag=ag --nocolor $*
ssh=c:\msys64\usr\bin\ssh.exe $*
find=c:\msys64\usr\bin\find.exe $*
vi=vim $*
mv=mv -i $*
cp=cp -i $*
rm=rm -i $*
grep=grep --color=auto $*
java="c:\Program Files\Java\jdk-13\bin\java" $*
julia=c:\users\mattn\AppData\Local\Julia-1.3.1\bin\julia $*
conda=c:\users\mattn\Miniconda3\Library\bin\conda.bat $*
vcvars64="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
choco=C:\ProgramData\chocolatey\bin\choco.exe $*
vagrant=c:\dev\vagrant\bin\vagrant.exe $*
docker="C:\Program Files\Docker\Docker\resources\bin\docker.exe" $*
docker-compose="C:\Program Files\Docker\Docker\resources\bin\docker-compose.exe" $*
tinygo=c:\dev\tools\tinygo\bin\tinygo.exe $*

短い名前をフルパスで登録する事で PATH 環境変数を弄る事無く、コマンドを直接実行できる様になるという訳です。

これらのコマンドそれぞれに PATH を通すのは面倒ですし、xxxenv.bat を作るのは面倒ですよね。この面倒さから開放されたのです。メンテするのは init.macros だけなのですから、随分と楽になりました。

注意点

この方法が使えるのは、あくまでインタラクティブシェルの中だけです。コマンドプロンプトから docker コマンドは使える様になりましたが、そのコマンドプロンプトから起動するバッチファイルの中で docker を実行してもパスが通っていないのでエラーになります。ただ、それはそのバッチファイルがちゃんとフルパスで起動するか、バッチファイルの中で PATH を通しさえすれば解決する話です。

実はこの方法は既に 2017 年の時点で思いついていて、ずっとこの環境で実践してきましたが特に問題は起きていません。

Windows のコマンドプロンプトで生きておられる方にオススメしたいハックです。

Posted at by



2020/06/19


元ネタ

作ったもの。

mattn/fakemovie · GitHub
https://github.com/mattn/fakemovie

Go のパッケージにしてあるので、Go の HTTP サーバからサーブする画像全てに再生ボタンを付ける様なミドルウェアを作る事もできてとても便利です。一応、オマケとしてコマンドを用意してあります。

$ fakemovie -r 40 input.png
fakemovie

こんな感じに使えるのでご利用下さい。

Posted at by



2020/06/17


今まで C++ でちょっとしたウェブアプリを作る際は crow という micro-framework を使ってきました。

GitHub - ipkn/crow: Crow is very fast and easy to use C++ micro web framework (inspired by Python Flask)

How to Build If you just want to use crow, copy amalgamate/crow_all.h and include it. Requirements C...

https://github.com/ipkn/crow

ヘッダオンリーで使えてとても便利だったのですが、boost に依存している点があまり好きじゃなかったのと、最近 crow の開発が止まり最新の boost でビルド出来なくなってしまったので、自分で作る事にしました。

GitHub - mattn/clask: Web micro-framework like flask in C++.

# include " clask/core.hpp " int main () { auto s = clask::server (); s. GET ( " / " , [](clask::req...

https://github.com/mattn/clask

C++ から flask ぽく使える事を目指しました。ヘッダオンリーで使えます。HTTP ヘッダを解析する所だけ kazuho さんの picohttpparser を使わせて頂いています。

#include "clask/core.hpp"

int main() {
  auto s = clask::server();
  s.GET("/", [](clask::request& req) {
    return "OK!";
  });
  s.GET("/foo", [](clask::response& resp, clask::request& req) {
    resp.set_header("content-type""text/html");
    resp.write("he<b>l</b>lo");
  });
  s.run();
}

boost にも依存していませんし Windows でも問題なく動作します。ただしコンパイルには C++17 をサポートしているコンパイラが必要です。keep-alive に対応したマルチスレッドなウェブサーバなので、静的な2文字("OK)くらいのコンテンツだと 70000req/sec くらい出ます(ログ出力を無効にした場合/Ryzen 5)。まだまだ実験的ですが、幾らかアプリケーションが作れるまで来たので、今後簡単な C++ のウェブアプリは clask を使って行こうと思っています。ドキュメントが皆無なのですが、これから整備していく予定です。使用例を5つほど用意していますので、興味のある方は pull-request 頂けると嬉しいです。

clask/example at master · mattn/clask · GitHub

Explore GitHub → Learn & contribute Topics Collections Trending Learning Lab Open source guides...

https://github.com/mattn/clask/tree/master/example
Posted at by