全力で怠けたい

怠けるために全力を尽くしたいブログ。

Windows で空のドットファイルを作る方法。

隣の人が Windowsドットファイルを作ろうとしてはまったときのメモ。

エクスプローラではドットファイルを作れない

エクスプローラのメニューで [新規作成] -> [テキストドキュメント] を選んで .dotfile のようなファイル名にすると「ファイル名を入力して下さい」というメッセージが表示されて作成できない。既存ファイル名の変更も先頭をドット (.) にすると同じメッセージが表示される。すごく不便。

CLI を使う

PowerShell を使う

個人的にはこれが手に馴染んでる。

PS C:\Users\shrimp>New-Item -Type File .dotfile

    ディレクトリ: C:\Users\shrimp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2016/03/25     12:06          0 .dotfile
cmd.exe を使う
>type nul > .dotfile

>dir .dotfile

 C:\Users\shrimp のディレクトリ

2016/03/25  12:07                 0 .dotfile

echo でもいいけど空ファイルにならない。

>echo.> .dotfile

>dir .dotfile

 C:\Users\shrimp のディレクトリ

2016/03/25  12:07                 2 .dotfile
               1 個のファイル                   2 バイト

他のやり方

適当なテキストエディタで新規ファイル作ってファイル保存したり、スクリプトを書くとか。面倒くさいからやらないけど。

HogeれるところでひたすらHogeってみた + 1

HogeれるところでひたすらHogeってみた #hogedriven - 日々常々

Hoge といえばこんなんあるよー」と Twitter で教えてもらったので Hoge 的なものをもう1つ書いてみる *1

public class Hoge {

    public static void main(String[] args) {
        ((Hoge)(null)).hoge();
    }

    public static void hoge() {
        System.out.println("hoge");
    }
}

コンパイルは通るし実行時エラーも発生しない。ちゃんと "hoge" と出力される。

一瞬「?」と思うけど文法的にはまったくおかしいところもないし動くのも理解できる。まあ、こんな変な書き方する人いないだろうけど。

*1:何年遅れかってツッコミは事実すぎて何も言えない

GVim のフォント設定のオプションの並びを忘れたときのメモ

GVim は vimrc で guifont を使ってデフォルトフォントを設定できる。Windows 版ではボールドやイタリックなどのオプションを指定できるが、めったに設定しないので忘れがちだ。この並びを思い出すのが面倒だったときのメモ。

フォント選択ダイアログでフォントを選択

メニューから [編集] -> [フォント設定] を選択するとフォント選択ダイアログが表示される *1 ので、使いたいフォントやスタイルを選択する。ここではフォントサイズ10の太字「IPAゴシック」を選択した。

フォント設定の確認

コマンドラインモードで設定を確認できるので、vimrc なり gvimrc なりで :set guifont すればいい。

:set guifont?
guifont=IPAゴシック:h10:b:cDEFAULT

結論

こんな面倒なことをしなくてもヘルプを見れば全部書いてある。

	Win32GUIについて				*E244* *E245*
	- フォント名には以下のオプションを指定できる。
		hXX - 文字高が XX (単位はポイント。浮動小数点数でもよい)
		wXX - 文字幅が XX (単位はポイント。浮動小数点数でもよい)
		b   - ボールド (太字体)
		i   - イタリック (斜字体)
		u   - 下線付き
		s   - 打ち消し (文字を横切る線付き)
		cXX - 文字セットが XX。使用可能なものは以下の通り: ANSI,
		      ARABIC, BALTIC, CHINESEBIG5, DEFAULT, EASTEUROPE,
		      GB2312, GREEK, HANGEUL, HEBREW, JOHAB, MAC, OEM,
		      RUSSIAN, SHIFTJIS, SYMBOL, THAI, TURKISH,
		      VIETNAMESE ANSI, BALTIC
		      通常は "cDEFAULT" を使うとよいだろう。

	  オプションの区切りには ':' を使うこと。

*1:コマンドラインモードで「:set guifont=*」でもよい

PowerShell のカレントディレクトリは他プロセスから削除できる。

コマンドプロンプト (cmd.exe) のカレントディレクトリを他のプロセスから削除しようとすると「項目 <パス> を削除できません: 別のプロセスで使用されているため、プロセスはファイル '<パス>' にアクセスできません」というメッセージが表示されて削除できない。セーフティであるとも考えられるが、他のセッションでコマンドプロンプトを開きっぱなしにするようなお行儀の悪いユーザーがいる場合などは不便に感じる。

PowerShell を使えばすべて解決する。

cmd.exe のカレントディレクト

cmd.exe のカレントディレクトリを削除しようとすると切なさあふれるメッセージが表示される。

:: cmd.exe
C:\Users\shrimp\hoge>
# powershell.exe
PS C:\Users\shrimp>rmdir hoge
rmdir : 項目 C:\Users\shrimp\hoge を削除できません: 別のプロセスで使用されているため、プロセスはファイル 'C:\Use
rs\shrimp\hoge' にアクセスできません。
発生場所 行:1 文字:1
+ rmdir hoge
+ ~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\Users\shrimp\hoge:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand

powershell.exe のカレントディレクト

powershell.exe のカレントディレクトリは無言のうちに削除できる。

# powershell.exe
PS C:\Users\shrimp\hoge>
:: cmd.exe
C:\Users\shrimp>dir hoge /b

C:\Users\shrimp>rmdir hoge

C:\Users\shrimp>dir hoge /b
ファイルが見つかりません

PowerShell プロンプトも特におかしな動作はない。

# powershell.exe
# カレントディレクトリは変わらず
PS C:\Users\shrimp\hoge>pwd

Path
----
C:\Users\shrimp\hoge

# カレントディレクトリにアクセスするとエラー
PS C:\Users\shrimp\hoge>ls
ls : パス 'C:\Users\shrimp\hoge' が存在しないため検出できません。
発生場所 行:1 文字:1
+ ls
+ ~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\shrimp\hoge:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

結論

コマンドプロンプトを開きっぱなしにするようなお行儀の悪いユーザーが PowerShell を使ってくれればいいが、そういうユーザーは大概 PowerShell を使いたがらないので何の解決にもならない。

PowerShell は UNC パスをカレントディレクトリにできる。

PowerShell は UNC パスをカレントディレクトリにできる。
# 2015/12/14 に書いた記事を間違って消してしまったので再掲

コマンドプロンプト (cmd.exe) は UNC パスをカレントディレクトリにできない。Command Prompt Here で直接開けなかったり地味に不便。pushd / popd コマンドを使えば自動でネットワークドライブを割り当ててくれるが、popd を忘れると割り当てがそのままになるのが面倒。

PowerShell を使えばすべて解決する。

コマンドプロンプト (cmd.exe)

UNC パスをカレントディレクトリにしようとすると切なさあふれるメッセージが表示される。

C:\>cd \\server1\tmp
'\\server1\tmp'
CMD では UNC パスは現在のディレクトリとしてサポートされません。

解決策

PowerShell プロンプト (powershell.exe) を使う。

C:\>cd \\server1\tmp

Microsoft.PowerShell.Core\FileSystem::\\server1\tmp>

IntelliJ IDEA マウスオーバーで Javadoc (Quick Documentation) を表示するメモ

IntelliJ IDEA でマウスオーバーで Javadoc (Quick Documentation) を表示するメモ。

Javadoc (Quick Documentation) をマウスオーバーで表示したい

Javadoc というか Quick Documentation. デフォルトだと Ctrl + Q で表示されるのだが Vim キーバインドのくせにドキュメントを見たいときに限って手がマウスに乗っている。

解決策

  • File -> Settings -> Editor -> General の Show quick documentation on mouse move にチェックする
  • Delay (ms) でディレイを指定することもできる (デフォルト: 500ミリ秒)

これでマウスオーバーで Javadoc が表示されるようになる。が、フォントがダサいので変えたくて仕方ない。

IntStream を逆順ソートしようとしたときのメモ

IntStream を逆順ソートしようとしたときのメモ。

IntStream の sorted() メソッドは Comparator インタフェースを受けない

IntStream の sorted() メソッドは Comparator インタフェースを受けないので以下のようなコードは書けない。

IntStream reverse = IntStream.rangeClosed(1, 3)
    .sorted(Comparator.reverseOrder()); // コンパイルエラー

解決策

IntStream を Stream<Integer> に変換する

IntStream を Stream<Integer> にすれば sorted() メソッドが Comparator インタフェースを受けるので以下のように書ける。

IntStream reverse = IntStream.rangeClosed(1, 3)
    .boxed()
    .sorted(Comparator.reverseOrder())
    .mapToInt(Integer::new);
IntStream のまま逆順ソートする

IntStream はプリミティブの int に特化した Stream なので Stream<Integer> に変換するほどでもない…というときは以下のようにも書ける。

IntStream reverse = IntStream.rangeClosed(1, 3)
          .map(i -> 3 - i + 1);

実際のところこんな感じのユーティリティメソッドを作っておけば十分な気がする。

private IntStream reverseRangeClosed(int startInclusive, int endInclusive) {
    return IntStream.rangeClosed(startInclusive, endInclusive)
            .map(i -> endInclusive - i + startInclusive);
}

// 使う
reverseRangeClosed(1, 3)
        .forEach(System.out::println);
// 3
// 2
// 1