Kamuycikap - SentenceDataBase

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

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対応版)

を参照して下さい。

Gmailで未読メールを一気に既読メールにする方法(マウス版)

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

以前に書いた、未読メールを既読にする方法の手順が実行できなくなってしまったので・・・・
あらたに手順を書きます。

キーボードを利用した情報も記載するので、どちらでもお好きな方で!!(*´∀`)ノ

操作手順

  1. 「/」キーをタイプして、検索窓をアクティブに
  2. 「from:(*)」を検索窓に入力
  3. 検索窓の右端に下向きの三角があるのでクリック。(フィルタ作成ダイアログが表示される)
  4. ダイアログの右下にある「この条件でフィルタを作成」をクリック
  5. 「フィルタの作成を確認」ダイアログで「OK」をクリック
  6. 「既読にする」と「一致するスレッドにもフィルタを適用する」にチェックを入れる
  7. 「フィルタを作成」をクリックする
  8. 未読メールが既読メールになっているので、Gmailの設定(画面右上にある歯車のアイコン)を開く。
  9. 先ほど作成した「条件:from:(*)」がフィルタの中に有るはずなので、チェックを入れて削除。

以下、簡単な説明

「/」キーのタイプで検索窓にカーソル

を出現できます。
検索のショートカットですね。

検索欄にfrom:(*)を入力

します。
これは、届いたメール全部をフィルタリングって意味になります。
つまり、全メールが対象になります。

検索窓の右端に下向き三角

がこっそりと表示されています。
これ、とっても見えにくいです。
from:(*)を入力してからクリックする意味は、自動的にfrom欄に*を入力するため。
なので、from:(*)を入力する前に下向き三角クリックして、from欄に*を入力しても同じことです。

フィルタを作成して実行

です。
下向き三角クリックしてから以降の手順は、フィルタを作成して実行するための手順です。
「既読にする」と「一致するスレッドにもフィルタを適用する」にチェックを入れるのがミソですね。
これを忘れると意味がありません。

フィルタ実行したら削除を忘れずに!

削除しないと、新規受信したメール全てが自動的に既読になっちゃいます。・・・(・∀・i)タラー・・・
さすがにそれはどうかと思いますので、全てのメールが既読になったのを確認したら、作成したフィルタを削除してください。

Emacs Lisp: 再帰の再帰

Emacs Lisp: 再帰再帰

再帰の定石(リスト入れ子バージョン)
●終了条件を調べ、終了なら初期値を返す
●リストの先頭の要素に対して処理をする。リストの先頭の要素がリストなら、そのリストと共に自分を呼ぶ。
●処理結果を引数として自分自身を呼び出す

この辺りから面白くなってきます。
以前、引数のリストの総和を計算する関数を作りました。

(defun sum (lst)
  (cond
   ((null lst) 0)
   (t (+ (car lst) (sum (cdr lst))))))

(sum '(1 2 3))  ;; => 6

この関数をリストのリストを取り扱えるように拡張します。

(defun sum* (lst)
  (cond
   ((null lst) 0)
   ((consp (car lst))
    (+ (sum* (car lst)) (sum* (cdr lst))))
   (t (+ (car lst) (sum* (cdr lst))))))

(sum* '(1 2 (3 4) (5))) ;; => 15

再帰関数では、まずリストの先頭の要素に対して処理を行います。
要素が「アトム」か「空ではないリスト」かで処理を分岐させます。

(consp (car lst)

ですね。
この条件が成り立つとき、リストの先頭の要素はリストです。
なので、定石に従って、自分自身を内側のリストと共に呼び出します。

(+ (sum* (car lst)) (sum* (cdr lst)))

こうなります。
条件が成り立たない時は、リストの先頭要素はリストではないので

(+ (car lst) (sum* (cdr lst)))

となります。