全力で怠けたい

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

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

Ubuntu 14.04 LTS のハードディスクイメージ zip ファイルの解凍に失敗したときのメモ

Virtual Box 用の Ubuntu 14.04 LTS のハードディスクイメージ zip ファイルの解凍に失敗したときのメモ。

ハードディスクイメージ zip ファイルの解凍に失敗

Ubuntu 公式サイトからハードディスクイメージをダウンロードして unzip したら解凍に失敗した。ちなみにハードディスクイメージのファイルは ubuntu-ja-14.04-desktop-amd64-vhd.zip (md5sum: 8656fa05069fcafc9bf17ddef7b255af)

[shrimp]$ unzip ubuntu-ja-14.04-desktop-amd64-vhd.zip
Archive:  ubuntu-ja-14.04-desktop-amd64-vhd.zip
   skipping: ubuntu-ja-14.04-desktop-amd64/ubuntu-ja-14.04-desktop-amd64.vhd  need PK compat. v4.5 (can do v2.1)

解決策

このあたりを参考にさせてもらって brew で p7zip をインストールして解決。

[shrimp]$ brew install p7zip

[shrimp]$ 7z e ubuntu-ja-14.04-desktop-amd64-vhd.zip

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=utf8,Utf16=on,HugeFiles=on,4 CPUs)

Processing archive: ubuntu-ja-14.04-desktop-amd64-vhd.zip

Extracting  ubuntu-ja-14.04-desktop-amd64/ubuntu-ja-14.04-desktop-amd64.vhd

Everything is Ok

Size:       4831127040
Compressed: 1272077760

p7zip オプションも分かりやすくていい感じ。

7z(1)                                                                       7z(1)

NAME
       7z - A file archiver with highest compression ratio

SYNOPSIS
       7z [adeltux] [-] [SWITCH] <ARCHIVE_NAME> <ARGUMENTS>...

DESCRIPTION
       7-Zip  is  a file archiver with the highest compression ratio. The program
       supports 7z (that implements LZMA compression algorithm), ZIP,  CAB,  ARJ,
       GZIP,  BZIP2, TAR, CPIO, RPM and DEB formats. Compression ratio in the new
       7z format is 30-50% better than ratio in ZIP format.

       7z uses plugins to handle archives.

FUNCTION LETTERS
       a      Add

       d      Delete

       e      Extract

       l      List

       t      Test

       u      Update

       x      eXtract with full paths

感想

7-Zip ってあまり見ないと思ってたけど最近は普通に使われてるのかな。