Hatena::ブログ(Diary)

JUNDUの技術大好きメモ

2008-04-30

[] ファイルを開くプログラムの選択ダイアログに表示されなくなったら 01:07

 Windows XPだと、ファイルの関連づけがされていないファイルダブルクリックしたときに、そのファイルを開くプログラムを選択するためのダイアログが表示されます。ここから関連づけも出来るし、一時的に開くだけというのも出来て便利なので、私は多用しています。

 ところが、このダイアログに選択したいプログラムが表示されなくなることがたまにあります。あったはずのプログラムを参照ボタンを押して選択し直しても、リストに表示されないのです。

 どうやらこの現象は、そのプログラムインストールパスを変えてしまった場合に発生するようです。(例えばc:\vim7→c:\vimに変更など) なぜかよくやってしまうので、そんな場合の対処法をメモしておきます。

 まず、レジストリエディタを起動し、HKEY_CLASSES_ROOT\Applicationsを開きます。この中に該当プログラムファイル名(gvim.exeなど)のエントリがあるはずなので、それを見つけ出します。見つかったら、そのエントリ名を書き換えます。削除しても良いはずですが、何かあった時に戻しやすいように私はいつもリネームしてます。もちろん、それでもレジストリが壊れる可能性はあるので、当然自己責任でお願いします。

 該当エントリリネームすると、ファイルを開くプログラムの選択ダイアログで、参照ボタンを押してプログラムリストに追加できるようになります。後は、リストからプログラムを選べば、ファイルが開けるようになります。

あきもあきも 2011/08/17 23:15 「ファイルを開くプログラムの選択ダイアログに表示されなくなったら」
を読んでその通りにやってみたら治ったので嬉しくてコメントを書きました。
ありがとうございます。

けんたろうけんたろう 2011/08/22 12:02 私も困っていたのですが助かりました。ありがとうございます(´・∀・`)ノ

たいたい 2013/03/21 13:12 ありがとうございます

ま 2014/02/13 15:44 当方はWindows7ですが、同じ現象が出て困っていました。
レジストリのデータのパスが前のになっておりましたので、正しく修正したらリストに出てきて登録できました。ほんとに助かりましたー。
ありがとうございます!!

トラックバック - http://d.hatena.ne.jp/JUNDU/20080430

2008-04-28

[] ポートを開いているプロセスを特定する 15:00

使いたいと思ったポートが何者かに使われていたとき、どのプロセスが使ってるのか知りたいってことありますよね。そんなときは、netstatに-oオプションをつけるとプロセスIDを表示してくれるようになるらしいです。例えば、以下のようにして調べられます。ちなみに-aは全部表示、-nはアドレスポートを数値形式表示のオプションです。

一番右側のPIDのところに出てくるのがプロセスIDになります。

C:\>netstat -nao

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1064
  TCP    0.0.0.0:389            0.0.0.0:0              LISTENING       124
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:515            0.0.0.0:0              LISTENING       1404
  TCP    0.0.0.0:2030           0.0.0.0:0              LISTENING       292
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       2008
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       996
  TCP    0.0.0.0:10002          0.0.0.0:0              LISTENING       624
  TCP    0.0.0.0:10005          0.0.0.0:0              LISTENING       624
  TCP    0.0.0.0:10006          0.0.0.0:0              LISTENING       624
  TCP    0.0.0.0:11039          0.0.0.0:0              LISTENING       1900
  TCP    127.0.0.1:1067         0.0.0.0:0              LISTENING       2392
  TCP    127.0.0.1:4403         127.0.0.1:4404         ESTABLISHED     2464
  TCP    127.0.0.1:4404         127.0.0.1:4403         ESTABLISHED     2464
  TCP    127.0.0.1:4405         127.0.0.1:4406         ESTABLISHED     2464
  TCP    127.0.0.1:4406         127.0.0.1:4405         ESTABLISHED     2464

で、プロセスIDが分かったら、tasklistコマンドで実行ファイルとぶつけるです。これで分かれば、問題ないけど、svchost.exeとかだと、どのサービスか分からないですね。

C:\>tasklist

イメージ名                   PID セッション名     セッション# メモリ使用量
========================= ====== ================ ======== ============
System Idle Process            0 Console                 0         16 K
System                         4 Console                 0        236 K
smss.exe                     688 Console                 0        388 K
csrss.exe                    736 Console                 0     14,296 K
winlogon.exe                 760 Console                 0      3,876 K
services.exe                 804 Console                 0      5,632 K
lsass.exe                    816 Console                 0     35,456 K
svchost.exe                  996 Console                 0     37,860 K
svchost.exe                 1064 Console                 0     34,064 K
svchost.exe                 1152 Console                 0     75,356 K
svchost.exe                 1272 Console                 0     26,200 K

そこで、/svcオプションの登場。これを使えば、svchost.exeでも中身が分かるってことです。

C:\>tasklist /svc

イメージ名                   PID サービス
========================= ====== =============================================
System Idle Process            0 N/A
System                         4 N/A
smss.exe                     688 N/A
csrss.exe                    736 N/A
winlogon.exe                 760 N/A
services.exe                 804 Eventlog, PlugPlay
lsass.exe                    816 Netlogon, PolicyAgent, ProtectedStorage,
                                 SamSs
svchost.exe                  996 DcomLaunch, TermService
svchost.exe                 1064 RpcSs
svchost.exe                 1152 AudioSrv, Browser, CryptSvc, Dhcp, dmserver,
                                 ERSvc, EventSystem, helpsvc, HidServ,
                                 lanmanserver, lanmanworkstation, Netman,
                                 Nla, RasMan, Schedule, seclogon, SENS,
                                 SharedAccess, ShellHWDetection, srservice,
                                 TapiSrv, Themes, W32Time, winmgmt, wuauserv,
                                 WZCSVC
svchost.exe                 1272 Dnscache
svchost.exe                 1308 LmHosts, RemoteRegistry, SSDPSRV, WebClient

この手順はWindows XPWindows Server 2003で使えるらしいので、私はこれだけで十分そうです。似たようなことをやるために、WindowsではfportやActivePortsってソフトウェアがあるらしいです。ちなみにUnixの場合はlsofって外部コマンドが使えるらしいです。入れてないから試せませんでしたが。。。

なお、今回の手順はこちらの情報に基づいてます。というか、そのままです。

http://www.atmarkit.co.jp/fwin2k/win2ktips/236portcheck/portcheck.html

トラックバック - http://d.hatena.ne.jp/JUNDU/20080428

2008-04-26

[]Java並行処理プログラミング読了 22:59

JavaEE 勉強会のお題になっていたので読み始めたこの本ですが、とっても面白かったです。マルチスレッドとか、簡単なことしかやったことありませんでしたが、この本を読むと何かマルチスレッド無駄に使いたくなります。

Java5で並行処理の為のライブラリがこんなに充実していたことも今更ながらに勉強になったので、読んで良かったです。勉強会自体に全然参加できなかったのは心残りでしたが。。。

せっかくなので、あとがきにあったお題をやってみました。こんな感じかなぁ?

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author jundu
 * 
 */
public class ThreadTest2 implements Runnable {

    private static final String[] jn = { "0", "1", "2", "3", "4", "5", "6",
            "7", "8", "9" };

    private int id;

    private String ids;

    private CountDownLatch latch;

    public ThreadTest2(int tid, CountDownLatch latch) {
        id = tid;
        ids = id < 10 ? jn[id] : String.valueOf(id);
        this.latch = latch;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Runnable#run()
     */
    public void run() {
        System.out.println(ids + "番のスレッドをスタートします");
        long stime = System.currentTimeMillis();
        for (int i = 0; i < 20000; ++i) {
            for (int j = 0; j < 20000; ++j) {
                double p = i * j;
                p = Math.sqrt(p);
            }
        }
        stime = System.currentTimeMillis() - stime;
        System.out.println(ids + "番のスレッドは" + stime + "ミリ秒かかりました");
        latch.countDown();
    }

    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        if (args.length < 1) {
            System.out.println("使い方: java ThreadTest2 x");
            System.out.println("xでスレッド数を指定してください。");
            System.exit(1);
        }

        int cpu = Integer.parseInt(args[0]);

        ExecutorService exec = Executors.newFixedThreadPool(cpu);
        CountDownLatch latch = new CountDownLatch(cpu);
        for (int i = 0; i < cpu; ++i) {
            exec.execute(new ThreadTest2(i, latch));
        }
        latch.await();
        exec.shutdown();
    }

}
トラックバック - http://d.hatena.ne.jp/JUNDU/20080426

2008-01-15

[] コンポーネント自動登録 01:01

DWRSeasar2対応をするに当たって、dwr.xmlを書かなくても良い仕組みを考えています。AutoRegisterと同じようにdiconファイルを記述することで、コンポーネント自動的にDWRから呼び出せるようにするわけです。例えば、こんな感じですね。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
          "http://www.seasar.org/dtd/components23.dtd">
<components>
    <include path="aop.dicon"/>
    <include path="s2dwr.dicon"/>
    <component class="org.seasar.dwr.example.remote.echo.EchoService">
        <aspect pointcut=".*">aop.traceInterceptor</aspect>
    </component>
    <component class="org.seasar.dwr.example.remote.calc.CalculatorService">
        <aspect pointcut=".*">aop.traceInterceptor</aspect>
    </component>
    <!-- dwr.xmlを書く代わり -->
    <component class="org.seasar.dwr.autoregister.DwrAutoRegister">
        <initMethod name="addClassPattern">
            <arg>"org.seasar.dwr.example.remote"</arg>
            <arg>".*Service"</arg>
        </initMethod>
    </component>
</components>

果たしてニーズがあるのか分かりませんが、私は設定ファイルを書くのが面倒に感じられたので、こんな仕組みを用意しようと思っています。

# これくらいしかS2的なことをやるところがないという話もありますが(^^;

トラックバック - http://d.hatena.ne.jp/JUNDU/20080115

2007-12-30 S2DWRをちょっとずつ進めてみる

とりあえず冬休みになったので、DWRと戯れています。まずは、竹添さんのコードを参考にS2Creatorを作りつつ、気になっていたDWRから呼び出すコンポーネントアスペクトをかけるとListやMapなどのジェネリクス対応がうまくいかなくなる問題の調査です。

最初にDWRの調査。Java1.4の場合ジェネリクスがなかったのでListやMapの中に入れるべきインスタンスが特定できません。そのためにdwr.xmlの<signatures>という設定にJava5に似た構文で型の情報を定義できるようになっています。Java5の場合は、ジェネリクスを使っていれば、そこから情報を取ってくれるようです。

ところが、S2AOPを使った場合にこの処理がうまく動かなくなります。Java1.4の場合は、設定に書かれたクラス・メソッドと型を関連づけて保持しているので、S2AOPがエンハンスしたクラスの場合、元のクラスと異なるため設定が見つけられなくなります。

また、Java5の場合はエンハンスした結果できたサブクラスにジェネリクスの情報が引き継がれていないため、Java1.4と同じ状況になってしまいます。

この問題に対応するため、以下の日記では型情報を探しにいく時に、対象がエンハンスした結果できたサブクラスクラス名に$$EnhancedByS2AOP$$を含む)の場合にスーパークラスを探して、そっちを処理されています。

http://d.hatena.ne.jp/masapon1967/20060831/1157086213

これを参考にやろうとしたのですが、DWR1.xと2.xでコードが変わっていて、同じ方法は使えませんでした。仕方なく、インバウンド処理の中でやることにしました。具体的には、インバウンド時に呼び出されるHtmlCallMarshallerとPlainCallMarshallerをそれぞれサブクラス化し、その中で型情報を取得する時にスーパークラスを参照することを考えています。

ただ、この実装が果たしてよいのかどうか、まだちょっと迷いがあります。今のところ、このタイミングでいい気はしているのですが、本当に他にないのかどうか。。。 もうちょっと他のコードを書きつつ悶々としてみます。

トラックバック - http://d.hatena.ne.jp/JUNDU/20071230