全力で怠けたい

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

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

ServerSocket の SO_REUSEADDR ソケットオプションの初期設定は誰が決めているのか

ふと ServerSocket の SO_REUSEADDR ソケットオプションが気になったときのメモ。

Java API 仕様

API 仕様には以下のように記述されている。ということは Java は我関せず?

ServerSocketが作成されるときに、SO_REUSEADDRの初期設定は定義されていません。アプリケーションはgetReuseAddress()を使用して、SO_REUSEADDRの初期設定を確認できます。

http://docs.oracle.com/javase/jp/8/api/java/net/ServerSocket.html#setReuseAddress-boolean-

SO_REUSEADDR ってなに?

SO_REUSEADDR は、サーバに TIME_WAIT 状態のアドレスに bind することを許します。

Programming UNIX Sockets in C - Frequently Asked Questions: サーバアプリケーションの作成 (TCP/SOCK_STREAM)
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-4.html

ちょっと乱暴だが、固定ポートに bind するサーバー以外では気にしなくても大丈夫ぽい*1

SO_REUSEADDR の初期設定

import java.io.IOException;
import java.net.ServerSocket;

public class PrintReuseAddress {

    public static void main(String[] args) throws IOException {
        boolean reuseAddress = new ServerSocket().getReuseAddress();
        System.out.printf("SO_REUSEADDR: %s", reuseAddress);
    }
}

これを手近なマシンで試してみた結果が↓これ。

まとめ

OS というか OS の TCP スタック実装によるのだろうか。
Java は我関せず?とも思っているけど、実は仕様で定められているのだろうか。

補足

OS X のデフォルトはやっぱり true の模様 http://lists.apple.com/archives/java-dev/2004/Dec/msg00570.html

*1:固定ポートに bind するクライアントもあるらしい

Invoke-WebRequestコマンドレットのエイリアスがcurl, wgetという落とし穴

職場 PC が Windows なのだが UNIX ライクなコマンドが使いたくて Gow を使っている。ところが、最近 PowerShell を 3.0 にアップデート*1したところ curl が上手く動かなくなった。調べたところ、Invoke-WebRequest コマンドレットのエイリアスcurl, wget が割り当てられているのが原因だった。忘れたときのためにメモしておく。
 

curl がエラーになる

PS >curl --silent http://www.yahoo.co.jp/
Invoke-WebRequest : 引数 'http://www.yahoo.co.jp/' を受け入れる位置指定パラメーターが見つかりません。
発生場所 C:\Users\ebi\bin\download.ps1:100 文字:1
+   curl --silent "http://www.yahoo.co.jp/"
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest]、ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

 
エラーメッセージを読むと curl を Invoke-WebRequest コマンドレットとして実行しているのだが、まさかと思いつつエイリアスを調べてみるとそのまさかだった。
 

PS >Get-Alias -Definition Invoke-WebRequest

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           curl -> Invoke-WebRequest
Alias           iwr -> Invoke-WebRequest
Alias           wget -> Invoke-WebRequest

 

解決

curl, wget のような紛らわしいエイリアスは要らないので削除する。

PS >Remove-Item -Path Alias:curl
PS >Remove-Item -Path Alias:wget

PS >Get-Alias -Definition Invoke-WebRequest

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           iwr -> Invoke-WebRequest

 
これで curl.exe が使われるようになるがエイリアス削除は現在のセッションにしか反映されない。そこで $profile の中でエイリアス削除するようにした。
 

結論

Invoke-WebRequest コマンドレットに curl, wget みたいなエイリアスがあっても使いやすいとは思えない。と思ってしまうのだが、みんなどうなのだろう。

*1:ハンコが何個必要になったかは書かない

リスクに対処する方法

トム・デマルコ熊とワルツをを読んでいる。
9章「リスク管理のしくみ」ではプロジェクトを開始する前にリスク・リスト*1を作成し、それに対処する方法が書かれている。本文ではデンバー国際空港の自動手荷物処理システムの失敗を例えにしているのだが、読むうちに脳内で RPG 風の例えに変換されてしまった。しかし、なかなか分かりやすいように思えるしそう外れていないように感じたのでメモしておく。

リスクに対処する方法

熊とワルツをではリスクに対処する方法を4つ上げている。

  • 避ける
  • 抑制する
  • 軽減する
  • かわす
避ける

そのプロジェクトの中でリスクをともなう部分に手を付けないこと。リスクを避けると当然の結果として、リスクをともなう領域に入ることで得られる利益を見逃すことになる。

抑制する

リスクが実現した場合にかけなければならない時間と資金を準備しておくこと。個々のリスクを抑制してもあまり意味はなく、リスク全体をひとまとめに抑制するべき。

軽減する

リスクが実現する前に、後の抑制コストを軽減するための措置をとっておくこと。

かわす

上記のようなことは何もしなかったが、たまたまリスクの襲来をまぬがれる場合をいう。リスクをかわそうと計画する場合、天に祈るのが通例である。

ぼくがかんがえたさいきょうのたとえ

プロジェクトは、名作ドラゴンクエスト3*2のゲーム開始直後、アリアハンからナジミの塔にいって盗賊の鍵を入手することとする。道中には毒攻撃をしてくるバブルスライムや後列攻撃*3してくるフロッガーがいる。こいつらの出現確率は概して低いが、時として高い確率で出現することがある。

避ける

毒を受けたくないしうっかり後列の魔法使いを殺されても困るので勇者を廃業して自宅警備員になる。他の勇者候補が魔王を倒してくれればいいが、最悪の場合は魔王によって世界が滅びる*4

抑制する

毒を受けても大丈夫なように毒消し草を買ったり、フロッガーの後列攻撃をすぐ回復できるように薬草を多めに買っておく。しかし、毒を受けなかった場合は毒消し草の代金が無駄になるし、フロッガーが前列攻撃してきた場合はダメージが小さく済むため薬草の代金が無駄になる。

軽減する

フロッガーの後列攻撃に備えて後列の装備を充実させる。装備を充実させるためのお金がかかるが、後列攻撃を受けてもダメージが小さく済むので用意しておく薬草を減らせる。一度で攻略できず何度もアタックする場合は、抑制するよりも安くあがる。

かわす

毒消し草や薬草は用意しない。バブルスライムフロッガーに遭遇しないことを祈りながらナジミの塔に突入する。遭遇しても毒や後列攻撃を受けなければ万事OK!何かあったら即リセット。

結論

本文中の定義で十分だしそのほうが分かりやすかった。

*1:過去プロジェクトで発生した問題。当初の予想からどれくらい逸脱したか、その原因はなにかをリストにする

*2:初めてプレイした思い出深い RPG である

*3:主に標的になるのは守備力が低い魔法使いだろう

*4:ゲームシステム的にありえないが、そもそもなぜゲームしてるのかという話になる