スキップしてメイン コンテンツに移動

第13回北海道開発オフに参加してきた

2009/10/24に第13回北海道開発オフが開催されたので参加してきた。二日酔いの為遅刻してしまった。
今回は前回の時に作成した強制シャットダウンにカウントダウン機能を追加する。カウントダウンするということはそれを表示するものが必要。使い慣れているWindowsFormで実装する事にする。Visual StudioのインストールはできないPCの為、テキストエディタでちまちまとがんばった。

メインフォームクラス

画面構成は単純に、小さい画面の中央にラベルを配置した。最大化・最小化ボタンは非表示、サイズ変更も不可とする。
Imports System.Windows.Forms
Imports System.Drawing

Public Class MainForm
    Inherits Form

    Public Sub New()
        InitializeForm()
    End Sub

    Private Sub InitializeForm()
        _lblMessage = New Label
        _lblMessage.Location = New Point(10, 30)
        _lblMessage.Size = New Size(220, 32)
        Me.Controls.Add(_lblMessage)
        
        Me.MaximizeBox = False
        Me.MinimizeBox = False
        Me.FormBorderStyle = FormBorderStyle.FixedSingle
        Me.StartPosition = FormStartPosition.CenterScreen
        Me.Size = New Size(240, 120)
    End Sub

    Private _lblMessage As Label

End Class
これに残りの秒数を受け取るメソッドが必要だろう(本当は開発オフ中にそのメソッドも実装したが、失敗しているようなのでここには載せない)。ここで気がついたが、右上の「×」ボタンも無効にしないとならないかもしれない。

カウントダウンクラス

次はカウントダウンするクラス。Timerクラスを使用して一定間隔で。実はTimerクラスは以下3つが存在する。
  • System.Windows.Forms.Timerクラス
  • System.Threading.Timerクラス
  • System.Timers.Timerクラス
WindowsFormを使うのであれば通常はSystem.Windows.Forms.Timerクラスを使用するらしい。TimerクラスなのにForms名前空間にあるのが、なんとなく気に入らないので使わない。System.Threading.Timerクラスを使う。
Imports System.Threading

Public Class CountDown
    
    Private ReadOnly period As Integer
    Private _remaind As Integer

    Public Sub New(ByVal period As Integer)
        Me.period = period
    End Sub

    Public Sub Start(ByVal remaind As Integer)
        _remaind = remaind
        Dim callback As New TimerCallback(AddressOf DoCountDown)
        Dim timer As Timer = New Timer(callback, Nothing, 0, period)
    End Sub

    Private Sub DoCountDown(ByVal state As Object)
        _remaind -= Me.period
  OnTick(New TickEventArgs(_remaind))
    End Sub

    Protected Sub OnTick(e As TickEventArgs)
        RaiseEvent Tick(Me, e)
    End Sub

    Public Event Tick(ByVal sender As Object, e As TickEventArgs)

End Class

Public Class TickEventArgs
    Inherits System.EventArgs

    Private _remaind As Integer

    Public Sub New(ByVal remaind As Integer)
        _remaind = remaind
    End Sub

    Public ReadOnly Property Remaind As Integer
        Get
            Return _remaind
        End Get
    End Property
End Class
指定の一定間隔(ミリ秒)でTickイベントが発生する。このイベントをハンドルして画面に残り秒数を渡せばよいだろう。
今回はここで時間切れ。後半はテキストエディタでの開発に疲れてきた。やはりGUIアプリケーションをテキストエディタのみで行うのは厳しい。もうそろそろ開発可能なノートPCが欲しいところ。あ、最近新しいOSが発売されたなー。
ランチはまんでがん製麺所につれて頂いた。麺がしっかりしていてとても美味しい。今度このBlogに載せるためにまた行かねば。

コメント

このブログの人気の投稿

VirtualBoxのUbuntu 18.04でNAT + ホストオンリーアダプター

VirtualBoxのVMにインストールしたUbuntu Server 18.04で、ネットワーク割当を「NAT」+「ホストオンリーアダプター」にする場合の設定についてメモ。 VMを作るとき、ゲストOSからインターネットに繋がって、かつホスト-ゲスト間でもつながる環境にしたいとき、VMのネットワーク割当は手っ取り早いのは「ブリッジアダプター」なんだけど、会社のネットワークでは都合がわるかったりするので「NAT」+「ホストオンリーアダプター」にしている。 アダプター1は「NAT」を選択 アダプター2は「ホストオンリーアダプター」を選択 ゲストOSであるUbuntuのネットワーク設定は、NATに該当するNICはDHPCで、ホストオンリーアダプターに該当するNICは固定IPとする。 Ubuntu 18.04ではネットワーク設定はNetplanで行う(Ubuntu 17.10から変わったようだ)。編集する設定ファイルは「/etc/netplan/50-cloud-init.yaml」 network: ethernets: {NATのNIC}: addresses: [] dhcp4: true optional: true {ホストオンリーアダプターのNIC}: addresses: [{固定IPアドレス}] dhcp4: no version: 2 ポイントは、ホストオンリーアダプターに該当するNICの固定アドレスを設定するときに、 ゲートウェイを設定しない こと。 以前に QiitaのVirtualBoxでNAT + Host-Only Network環境を構築する を参考にしていたのに、今回18.04で設定する際にすっかり忘れてはまってしまった。 IPアドレスは「192.168.0.2/24」のようにサブネットマスクも指定する。 NICに指定するデバイス名は以下コマンドで表示されるlogical nameが該当する。 > lshw -class network たいていは「enp0s3」「enp0s8」となるようだ。 設定ファイルを保存したら

画像を切り取って保存する

画像処理において、画像の一部を切り出すことをトリミングというらしい。画像編集ソフトなんかにも大抵「トリミング」機能が実装されているだろう。 そんな画像を切り取る処理を.NETでやってみる。 .NETでは画像を扱う際にはBitmapクラスを使用する。BitmapクラスのCloneメソッドでサイズを指定すれば、そのサイズのBitmapオブジェクトができるので、それを保存すればよい。Cloneメソッドの引数はRectangle構造体とPixelFormat列挙体。 Rectangle構造体とは四角形の位置とサイズを表したもの。元画像の左上を(0, 0)として(X座標, Y座標, 幅, 高さ)の値でRectangle構造体を作成して渡す。PixelFormat列挙体はヘルプを見てもよくわからなかった。とりあえずは元画像の値をそのまま渡す。 例えば photo by tsukacyi のようなユッケの画像をトリミングするプログラムは以下のように書ける '元画像 Dim source As Bitmap source = New Bitmap("source.jpg") '切り取るサイズ Dim rect As Rectangle rect = New Rectangle(30, 80, 400, 320) '切り取り後の画像 Dim trimed As Bitmap trimed = source.Clone(rect, source.PixelFormat) '保存 trimed.Save("trimed.jpg") source.Dispose() trimed.Dispose() トリミング後の画像は以下の通り。

「Lively」ベータ開始

Googleが3D仮想空間 「Lively」 のベータ版を開始したらしいので、試しにやってみた。 グラフィックボードを搭載していない、オンボードなPCなのだが、それなりに動作するのが驚いた。比較されるであろう「Second Life」はやったことなく、3D仮想空間とやらは初めてなのだが、なかなか面白い。 試しに 「Chuta's Room」 を作ってみた。中にいくつかこのエントリへのリンクも仕込んでおいた。もしLivelyから来られた方は、コメントでも残していただけると有難い。