Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

C#でコントロールをツールボックスに追加したいときの手順

VisualStudio2010のツールボックスにコントロールを追加する

C#で書かれたソースを見ているとたまにこんなのを見かけます。

//WebClientを作成
System.Net.WebClient wc = new System.Net.WebClient();
          
//ダウンロードし終わったら画像に変換
wc.DownloadFileCompleted += ConvertPdfToImg;            // ダウンロード終了したらConvertPdfToImgが実行される(イベントの紐付け)
wc.DownloadFileAsync(new Uri(url), fileName);           // ローカルファイルにデータをダウンロード
               
//後始末
wc.Dispose();

つまり、コードでコントロールを動的に作ってイベントとメソッドを紐付けてるんですね。
個人的にそれが気持ち悪いんです。

そもそも、コントロールの管理は可能な限りGUIで行うべきではないかと思っています。

なので、MicrosoftDeveloperNetworkに記載されていた記事を参考にして、WebClientを追加してみました。

手順

手順はこんな感じです。

  1. [ツール]メニューの「ツールボックス アイテムの選択」をクリック
  2. [.NET FrameWorkコンポーネント]タブをクリック
  3. [Webclient]にチェックを入れる
  4. [OK]ボタンをクリック

すると、ツールボックスにWebClientが追加されていました。(歯車のアイコン)

Microsoftによると

項目は、自動的に[ツールボックス]の適切なカテゴリに追加されます。定義済みのカテゴリの中に、項目に一致するカテゴリがない場合は、[全般]に追加されます。

との事です。


優良アダルトサイト紹介の最終形態!!MaxInfo

子供向けのプログラミング環境でRaspberryPiからあれこれ制御できるかも!?

RaspberryPiにScratchGPIOをインストール

今日、大阪のでんでんタウンArduino同好会によるRaspberryPi講座が開催されました。
今回は子供向けのプログラミング言語であるScratchをGPIOに対応させた言語をセットアップしてみます。

ScratchGPIOの本家にアクセス

RaspberryPiをセットアップすると、標準でScratchはインストールされています。
しかしながら、GPIOを叩くことはできません。
GPIOを制御できるバージョンは別にありますので、それをインストールします。

まずは、本家サイトへアクセス。

本家のインストール説明サイト

isgh5.shをダウンロード

サイトに書いてある下記のコマンドをシェルで実行

sudo wget http://goo.gl/Pthh62 -O isgh5.sh

すると、HOMEディレクトリにisgh5.shがコピーされます。

isgh5.shを実行

下記のコマンドで実行。
実行権限がないので、実行権限を与えてから実行させます。

sudo chmod 755 ./isgh5.sh
sudo ./isgh5.sh

インストール完了のメッセージがシェルに表示されれば成功です。

デスクトップにアイコンができている。

Vncviewerを使ってRaspberryPiにアクセスすると、デスクトップにScratchの新しいアイコンが作成されています。
ダブルクリックで起動できます。

Linux Mint 17 KDEでMonoDevelopをインストール

Synapticは失敗するみたい。(´-ω-`;)ゞポリポリ

SynapticからMonodevelopを選択してインストールしてもダメみたい。
起動しかけて、何も表示されずに死んでしまう。
コンソールにも何も表示されないので原因もわからない。

なんとなく・・・・必要なプログラムが入っていないのではないかとおもいつつ。。。。

コマンドラインで、一旦消してから、もう一度入れてみた。

sudo aptitude remove monodevelop
sudo aptitude install monodevelop --with-recommends

インストール完了後に無事に起動することを確認!!

C#でログを残したい時の方法「log4netを使ってみる」

C#log4netライブラリを使うときの導入方法

log4netを利用すると、柔軟な書式でログを残すことが出来るようになります。
自分用のメモな勢いで殴り書き。

手順

  1. log4netのダウンロード
  2. AssemblyInfo.csに設定を追記
  3. 設定XMLファイル作成
  4. log4net.dllを実際のファイルパスに配置
  5. log4net.dllをソリューションエクスプローラーにセット
  6. 参照設定に追加
  7. 対象のフレームワーク設定
  8. 設定XMLファイルを常にコピー
  9. log4net.dllを常にコピー
  10. 導入したいクラスにプロパティを記述
  11. ログを出力

log4netのダウンロード

公式サイトからlog4net.dllをダウンロード
http://logging.apache.org/log4net/download_log4net.cgi

AssemblyInfo.csに設定を追記

ソリューションエクスプローラーの「Properties」にAssemblyInfo.csがあるのでダブルクリックで開く。
一番下に追加

//log4net
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)]

設定XMLファイル作成

ソリューションエクスプローラーの右クリックメニューから「Add」して作成。(テキストファイル)
ファイル名は上記の設定にある「log4net.config」として作成。
公式サイト見ながら設定した。
以下、サンプル

<?xml version="1.0" encoding="UTF-8" ?>
<!-- [log4net.config] -->
<configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <appSettings>
    <!-- log4net 内部のデバッグメッセージを出力 -->
    <add key="log4net.Internal.Debug" value="true" />
  </appSettings>

  <log4net>

    <!-- ファイル出力用 -->
    <appender name="DailyFileAppender" type="log4net.Appender.RollingFileAppender">

      <!-- ログファイルの切替 { サイズ: Size, 日付: Date } -->
      <param name="RollingStyle" value="Date" />

      <!-- ファイル名 -->
      <param name="File" value=".\logs\hogehoge.log" />

      <!-- ファイル書き込み { 追記: true, 上書き: false } -->
      <param name="AppendToFile" value="true" />

      <param name="MaxSizeRollBackups" value="10" />
      <param name="MaximumFileSize" value="1000KB" />

      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <header type="log4net.Util.PatternString" value='[task time="%date{HH:mm:ss,fff}"]%newline' />
        <footer type="log4net.Util.PatternString" value="[/task]%newline" />
        <conversionPattern value="%-5level %date{yyyy/MM/dd_HH:mm:ss,fff} [%thread]] - %message%newline" />
      </layout>

      <!-- 出力するログ レベルのフィルタ -->
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO" />
        <levelMax value="FATAL" />
      </filter>

    </appender>

    <appender name="DebugAppender" type="Foo.Bar.Utility.DebugAppender">

      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <header type="log4net.Util.PatternString" value='[task time="%date{HH:mm:ss,fff}"]%newline' />
        <footer type="log4net.Util.PatternString" value="[/task]%newline" />
        <conversionPattern value="%-5level %date{yyyy/MM/dd_HH:mm:ss,fff} [%thread]] - %message%newline" />
      </layout>

    </appender>

    <!-- デフォルトの出力設定 -->
    <root>
      <level value="ALL" />
      <appender-ref ref="DailyFileAppender" />
      <appender-ref ref="DebugAppender" />
      <!-- appender-ref ref="EventLogAppender" / -->
    </root>

  </log4net>

</configuration>

log4net.dllを実際のファイルパスに配置

VisualStudioで作成したソリューションフォルダの下に、「lib」フォルダを新規作成。
その中にダウンロードした「log4net.dll」をコピーする

log4net.dllをソリューションエクスプローラーにセット

ソリューションエクスプローラーを使って、ソリューション名右クリックから「Add」でディレクトリを追加し、ディレクトリ名を「lib」とする。
ソリューションエクスプローラーのlibフォルダに、ファイラー使ってlog4net.dllをDrag & Dropする。
※上記手順「log4net.dllを実際のファイルパスに配置」でファイラー使ってlog4net.dllをlibフォルダに入れても、ソリューションエクスプローラーには反映されない。

参照設定に追加

ソリューションエクスプローラーの「参照設定」を右クリック。
「参照の追加」→「参照」と進み、libフォルダの中にあるlog4net.dllを指定する。

対象のフレームワーク設定

ソリューションエクスプローラーにて、「プロジェクト名を右クリック」→「プロパティ」。
「アプリケーション」タブにある「対象のフレームワーク」を「.NET Framework4」とする。
※注意!!・・・ダウンロードしたlog4net.dllがコンパイルされたフレームワークでなければ「using log4net;」とソースに書くと「名前空間がみつからない」と怒られる。

設定XMLファイルを常にコピー

ソリューションエクスプローラーにある「log4net.config」を右クリック。
プロパティの「出力ディレクトリにコピー」を「常にコピーする」にしておく。
※exeファイルと同じディレクトリにlog4net.configが吐出される。
log4net.configを好きなディレクトリに配置したい場合は設定しない。

log4net.dllを常にコピー

ソリューションエクスプローラーにある「log4net.dll」を右クリック。
プロパティの「出力ディレクトリにコピー」を「常にコピーする」にしておく。
※exeファイルと同じディレクトリにlog4net.dllが吐出される。

導入したいクラスにプロパティを記述

// usingをお忘れなく
using log4net;
using log4net.Appender;
using log4net.Repository.Hierarchy;

namespace hogehoge
{
    public partial class MainForm : Form
    {
        // log <-- このへんに追加
        private static readonly ILog LOG = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public MainForm()
        {
            InitializeComponent();
            HFRCWatcherInitialize();
        }

ログを出力

こんな感じで出力

string valueStr = "hogehoge";
int valueNumber = 1;

LOG.ErrorFormat("あれやこれやが大変なことになっています:{0}",valueStr);
LOG.InfoFormat("問題なく動いているよ!!: User -> {0}, Number -> {1}", valueStr, valueNumber);



優良アダルトサイト紹介の最終形態!!MaxInfo

ThinkPad X60の液晶が死んだ・・・・時の対処メモ。

Thinkpad X60の液晶が割れた。。。orz

諸事情により、自分が使っていたThinkpad X60の液晶が割れてしまった。。
ので、外部ディスプレイを接続してデスクトップPCのように使う方法を考察。

<<スペック>>
OS:Ubuntu14.04
HDD: 128GB SDD
MEM: 2GB
CPU: インテル(R) Core(TM) Duo プロセッサ T2300 1.66GHz

Ubuntuマシンとしてはまだまだイケるハードですので部品取りにするには惜しいです。

自分用のメモとして、やったことをメモ書き。

外部ディスプレイ接続

普通にRGBケーブルで接続
特になんの設定を行うこともなく、画面にUbuntuデスクトップが表示された。

設定でメインディスプレイを設定

GoogleChrome等、あらかじめインストールされているアプリを起動すると、外部ディスプレイ側にはなんの変化もなし・・・・
潰れてしまった本体の液晶側に表示されていると予想されます。

半ば諦めかけたのですが・・・

Ubuntuの設定を起動してみると、外部ディスプレイ側で起動!!
ディスプレイの設定で、外部接続側をメインとして利用することが可能に!!
これで一応使える。

BIOS画面などを外部ディスプレイに表示したい

が、どうしたら良いかわからず。。。。

google先生に聞いてみると、ThinkPad

「Fn」+「F7」でメイン側と外部側の切り替え

が出来るらしい。
最初からこれやってればよかったかも・・・と思いながら「Fn」+「F7」を押す。
設定が有効になったかどうか画面で確認することは出来ず。。。。

ただ、再起動すると、外部ディスプレイ側にBIOS起動画面が表示されるようになり、「F1」でBIOS画面が表示されるようになった。

ここまでで良しとする。

バッテリーが死んでおり、持ち運びができない状況。
戦闘機的な使い方をしたい場合は、これまたUbuntuがセットアップされているeepcで頑張ることにする。

X60の液晶部品が6000円で販売されているが・・・・
価格.comで、PanasonicのLet's Noteの同スペックくらいのやつが、1万円付近で販売されている。
Let's Note買ったほうがいいかも???との思いもありますが、eepcが使えなくなった段階で、戦闘機としてLet's Noteはありかなと。

Emacs Lisp: 置換(改)

Emacs Lisp: 置換(改)

以前に作ったreplを、リストの入れ子対応にする。
前に作ったものは、第一引数のリストであるlstの中で、第二引数のoldと等しい要素すべてをnewで置き換える関数です。

(defun repl (lst old new)
  (cond
   ((null lst) nil)
   ((eq (car lst) old)
    (cons new (repl (cdr lst) old new)))
   (t (cons (car lst) (repl (cdr lst) old new)))))

(repl '(dog pig dog) 'dog 'rat) ;; => (rat pig rat)

この関数を、関数の入れ子対応に。

(defun repl* (lst old new)
  (cond
   ((null lst) nil)
   ((consp (car lst))
    (cons (repl* (car lst) old new)
          (repl* (cdr lst) old new)))
   ((eq (car lst) old)
    (cons new (repl* (cdr lst) old new)))
   (t (cons (car lst) (repl* (cdr lst) old new)))))

(repl* '(1 2 (2 9) (3 4 2)) '2 '9)  ;; => (1 9 (9 9) (3 4 9))

Gmailで未読メールを一気に既読メールにする方法(キーボード版)

キーボード操作版:Gmailであっという間に未読メールを既読にする方法 (新Gmail対応版)

過去に、未読メールを既読にする方法を残してたんですが、今のバージョンでは通用しません。
なので、今のバージョンで、サクッと未読メールを既読メールにする方法を記載します。

全てキーボードで操作できるので簡単です(*´∀`)ノ

結論を先に

  1. 「/」をタイプして、検索窓をアクティブに
  2. 「is:unread」と入力してEnterキーを押すと、未読メールだけがフィルタリングされる
  3. 「* → u」と順番にタイプして、未読メールを選択状態にする
  4. 「Shift + i」とタイプして、未読メールを既読にする

では、説明!!

検索窓をアクティブにする

キーボード「/」キーを押すと、検索窓にカーソルが移動します。

未読メールだけにフィルタをかける

検索窓に

is:unread

と入力してEnterキーを叩くと、未読メールだけが画面上に表示されます。

未読メールを選択状態に!

「*」をタイプし、その後に「u」をタイプします。
私のキーボードはUS仕様なので「*」はShift + 8なのですが、日本語キーボードの場合はShift + :ですね。
「*」タイプ後に、「u」をタイプしますと、未読メールにチェックが入ります。

未読メールを既読にする!!

これも簡単。
Shiftキーを押しながらiキーを押すと選択されているメールが既読になります。

複数ページある場合は

  1. 「* → u」と順番にタイプして、未読メールを選択状態にする
  2. 「Shift + i」とタイプして、未読メールを既読にする

を繰り返します。
まぁ、、、たくさんある場合はコレって面倒なんですけれどね。

コレが面倒な場合は、マウス操作版:Gmailであっという間に未読メールを既読にする方法 (新Gmail対応版)

を参照して下さい。