メモの日々


2001年08月16日(木) カリー

[unix] 時刻合わせ

Linuxの時刻が変だったので変更した。date -s でカーネル時計の時刻を変更できて、clock -w でカーネル時計の時刻をCMOS時計に設定するらしい。CMOS時計ってゆーのはハードウェアの時計らしいよ。リブートするとカーネル時計はCMOS時計の時刻になるのかな。

でもなんかdateの結果とclock -r の結果がぜんぜん違ったんで、なんか変。勘違いしてるのかも。

[サッカー] 日本vsオーストラリア

日本代表、3-0でオーストラリア代表に勝った。双方ミスが多くつまらない試合。中村を出場させないとは、トルシエ解任だな。

会社など

  • Servlet MLに入ってみた。
  • 本所のネットワークを使えるようにした。Linux側のLANケーブルの差込口が間違えていた、というのが結論。
  • で、homeの下にディスク領域がないから、何とかしないといけないです。
  • スクリプトできない。(;_;)
  • テーブル作るのってめんどくさい。たいへん。
  • 明日は打ち合わせがあるからあまり仕事できなそう。
  • 8/25に試験管理ツールのバージョン3がリリースされるそうな。IDTSの掲示板より。まだメンテしてたのね。

2002年08月16日(金) SFA修正した日

会社

  • 14:30〜15:05 SFAの件で田中さんにメイルを書いた。続けてプログラムを見てみるぜ。
  • 〜22:25 ひたすらSFAを調べ続けた。修正終えました。もーイヤ。ColdFusionはやはり駄目だ。
  • 今日はやたらトイレへ行った。飲み物をたくさん飲んだのかもしれない。水分をどんどん取ってどんどん排出すると頭が冴えるようだ。

[windows][soft] Microsoft Project 2002 構築ガイド (リンク切れ)

Project Serverの構築ガイドがあった。しばらくやる気ないけど。

Iプロジェクト

  • 10:00〜11:30 プロトタイプ版を皆に見せた。うむ。
  • 11:50 Project Serverを置き換えられるものを作れれば意味あるかな、とふと思った。

Kプロジェクト

  • 14:00〜14:25 ステータス確認や週間記録をつけた。さぼってばかりなので何もない。

2005年08月16日(火)

  • 地震あり。とても大きな揺れを感じた。職場のご自慢のオイルダンパーが「ギシギシ、ギシギシ」と音を立て恐怖を煽る。
  • 相変わらず他人の作ったPHPプログラムのバグ取りをしている。今日はユーザを登録する画面のバグ修正。コピペされまくっているソースコードにイライライライラ。ナンダコレハヒドイヒドイコノクソコードメ。一人でぶつぶつと悪態をつき少し落ち着く。休み明けなので心に余裕はある。

[howto] 1970年1月1日からの経過秒数を日付時刻に変換

どうするのが簡単なのかな。F先生に色々教わった中から、とりあえず

perl -e 'print scalar localtime(1234567)'

で。長いなあ。

[ruby] 「RubyについてJavaプログラマが知るべき10の事柄」 (Collection & Copy)

www.textfile.orgで日本語訳が紹介されていたのでメモ。

Rubyのカテゴリを遂に作った。

[ruby] 「コーヒーと宝石」 (Koppa World)

ずっと前にブックマークしていたここも一緒にメモ。

このドキュメントでは、Java な人が Ruby に移るときに、知っておいたほうがいいことを脈絡もなく並べます。

[java] 「JSFを信じない人のために: JSFに関するFUDをクリアーする」 (developerWorks)

半年前の記事。信じていなかったのでメモ。長いから読んでない。

Strutsを使った方が簡単だと思っている人達のために念のために言うと、ここで構築した、単純なJSFアプリケーションのStruts版を作るためには、少なくとも2倍の努力が必要だと思います。

やること

  • ブラウンの安い電動歯ブラシ買う
  • 蛍光灯を捨てる
  • 腕時計(8/18)

2017年08月16日(水)

[c#] WPFのバインディング処理で投げられた例外をDispatcherUnhandledExceptionイベントのハンドラで受け取る

WPFアプリケーションにおいて例外をApplication.DispatcherUnhandledExceptionイベントのハンドラで受け取ってエラーダイアログを表示するようにしてみたが、バインディングの処理において投げられた例外は受け取れないことを知った。

対処として、例外を投げうる処理をasync/awaitを使った非同期メソッドで実行するようにすればハンドラで例外を受け取れそうなのでサンプルをメモ。

MainWindow.xaml

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Sample"
        xmlns:local_e="clr-namespace:Sample.例外"
        x:Class="Sample.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="300">
    <Window.DataContext>
        <local_e:ExceptionViewModel/>
    </Window.DataContext>
    <Grid>
        <ComboBox Height="20" Width="200"
                  ItemsSource="{Binding Items}"
                  SelectedItem="{Binding Selected}"/>
    </Grid>
</Window>
  • ComboBoxで選択した内容がExceptionViewModelクラスのSelectedプロパティに設定されるようにしている。

ExceptionViewModel.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace Sample.例外
{
    class ExceptionViewModel
    {
        private List<string> items = new List<string>() { "throw", "task", "async" };
        private string selected;

        public List<string> Items => items;

        public string Selected
        {
            get => selected;
            set
            {
                selected = value;
                switch (selected)
                {
                    case "throw":
                        ThrowException(selected);
                        break;
                    case "task":
                        Task.Run(() => ThrowException(selected));
                        break;
                    case "async":
                        Async(() => ThrowException(selected));
                        break;
                }
                Debug.WriteLine($"{selected}: end of property");
            }
        }

        private static void ThrowException(string message)
        {
            Thread.Sleep(3000);
            Debug.WriteLine($"{message}: throw exception");
            throw new Exception(message);
        }

        private static async void Async(Action action)
        {
            await Task.Run(action);
        }
    }
}
  • Selectedプロパティのセッターで例外を投げるThrowException()を呼び出している。
    • 設定値が「throw」の場合は単にThrowException()を呼び出している。ここで投げられた例外は後述のイベントハンドラまで届かない。
    • 設定値が「task」の場合は、Taskクラスを使って別スレッドでThrowException()を呼び出している。ここで投げられた例外も後述のイベントハンドラまで届かない。
    • 設定値が「async」の場合は、非同期メソッドであるAsync()の中でThrowException()を呼び出している。ここで投げられた例外は後述のイベントハンドラまで届く。

App.xaml

<Application x:Class="Sample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Sample"
             StartupUri="MainWindow.xaml"
             DispatcherUnhandledException="HandleException">
    <Application.Resources>
         
    </Application.Resources>
</Application>
  • App.xamlでApplication.DispatcherUnhandledExceptionイベントのハンドラを設定している。

App.xaml.cs

using System.Windows;
using System.Windows.Threading;

namespace Sample
{
    public partial class App : Application
    {
        public void HandleException(
            object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine($"Handled: {e.Exception.Message}");
            e.Handled = true;
        }
    }
}
  • イベントハンドラではデバッグ出力をするだけ。

実行結果

ComboBoxでthrowを選択すると、デバッグ出力には

throw: throw exception
例外がスローされました: 'System.Exception' (Sample.exe の中)
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=Selected; DataItem='ExceptionViewModel' (HashCode=66824994); target element is 'ComboBox' (Name=''); target property is 'SelectedItem' (type 'Object') Exception:'System.Exception: throw
   場所 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
   場所 MS.Internal.Data.PropertyPathWorker.SetValue(Object item, Object value)
   場所 MS.Internal.Data.ClrBindingWorker.UpdateValue(Object value)
   場所 System.Windows.Data.BindingExpression.UpdateSource(Object value)'

と出力される。イベントハンドラには到達していない。バインディングの処理の中で例外がcatchされてしまっているからだろうか。

ComboBoxでtaskを選択すると、デバッグ出力には

task: end of property
task: throw exception
例外がスローされました: 'System.Exception' (Sample.exe の中)

と出力される。イベントハンドラには到達していない。例外はTaskオブジェクトが受け取ったけれども誰も参照しなかったと考えればいいだろうか。

ComboBoxでasyncを選択すると、デバッグ出力には

async: end of property
async: throw exception
例外がスローされました: 'System.Exception' (Sample.exe の中)
例外がスローされました: 'System.Exception' (mscorlib.dll の中)
Handled: async

と出力される。イベントハンドラに到達している。非同期メソッドは便利だと考えればいいだろうか。ただし、要件によっては当該処理を非同期で実行すると問題があるケースもありそう。重複実行を防ぐ必要があるとか。