C#舐めんなよC#だって出来る子なんだぞ!

低レイヤの文字列操作

なんかC#をバカにされてるようで(←酷い被害妄想)イラっときて書いた。後悔も反省もしない。

 

using System;

class Program {
	unsafe static void Main() {
		string fileName = "hoge.ScR";
		char lc = (char)('a' - 'A');
		fixed(char* p_ = fileName) {
			char* p = p_ + fileName.Length;
			if((*--p | lc) == 'r' && (*--p | lc) == 'c' &&
					(*--p | lc) == 's' && *--p == '.') {
				Console.WriteLine("めっかったぜフォー!");
			}
		}
	}
}

 

IntPtrをbyte*にキャスト出来る

NonSoft – Bitmap処理を高速化するサンプル(C#.NET)

のサンプルの

 

byte* adr = (byte*)_img.Scan0;

 

 

ってコードに驚いた。

何故って、今まで

 

byte[] argbValues = new byte[bmpData.Stride * bmp.Height];
fixed(byte* pixel = &argbValues[0]) {
    byte* pixel_ = pixel;
    Marshal.Copy(bmpData.Scan0, argbValues, 0, argbValues.Length);

 

 

ってな感じで配列にコピーしてからその配列のポインタを操作してたから。

早速コード保管庫のコードに反映させましたよっと。

C#|Bitmap処理の高速化

SPDのWindows VISTA / 7 対応に向けて

SPDの動作OSに関しては明記してなくて、

>【動作確認環境】Windows XP

としてるけど、VISTAで”壁紙を変更”メニューが動作しないという報告があったので、次リリースからは【動作環境】Windows XPと明記しようと思います。ただ、VISTA / 7 には対応させたいと思ってます。テスト環境の入手の目処が全く立たないのでどうにも出来ないんですね。ぶちゃけちゃうとお金がない。

“壁紙を変更”が動作しない理由はだいたい検討ついてます。現在はSystem.Diagnostics.Process.Start()メソッドで”desk.cpl”を実行させ、終了時にレジストリから変更された壁紙を取得するという実装になってます。この”desk.cpl”がVISTAでは別の何かなんでしょうね、調べてないけど。ここに独自の”壁紙を変更”画面を実装すればVISTAでも上手く動くんじゃないかと、ブランチを作って実装を始めてます。

もうひとつVISTAでの問題があるんですよね。SPDが実行されていないときに壁紙が変更されても次にSPDが起動されたときにそれを検知してSPDにも反映する機能があるのですが、これがVISTAで上手く動かないみたい。この機能は、SPDの終了時に壁紙を記録したレジストリのキーをSPDの設定ファイルに保持して、次回起動したときに、前回記録したキーと現在のキーを比較する実装になってます。この保持するべきレジストリのキーがVISTAだと違うんでしょうね。XP上でも、IEのメニューから壁紙を変更した場合にSPDで検知出来なかったりするし。関連するレジストリのキーを全部洗い出して保持するのも割に合わないし、この機能は廃止しちゃおうかなぁ…。OSや環境に依存せずに壁紙を取得する方法があればいいんだけどな。やっぱレジストリをゴニョゴニョするのは美しくない。

どんな対策をしようとVISTAも7も持ってないので確認のしようが無いんですけどね。まぁ、何時か環境を入手出来たときに対応作業が楽になればいいなってことで。

※追記(12/7)

VISTA/7でも”desk.cpl”のコマンドは変らないようです。

もしかしたらこれ(Visual Basic 中学校 掲示板 Process.WaitForExitが効かない)が原因なのかも。だとしたらどうにもならないよね、OSの仕様みたいだし。やっぱり独自の”壁紙を変更”画面を実装する方向で良かったのかも。

独自の”壁紙を変更”画面の実装がさっき終わりました。WindowsXPの画面のプロパティにはない壁紙の配置方法が選べます。

・中央に表示

・並べて表示

・拡大して表示

・拡大して表示(アスペクト比維持、余白あり)

・拡大して表示(アスペクト比維持、余白なし)

痒いところに手が届いてるでしょ、と自画自賛。

しばらくの間自分で使ってみて問題が無ければUPします。

言語バー空気読め配布

言語バーって空気読まないですよね。

タスクバーに入れてると作業中の視線移動が多くなるし、デスクトップに置いとくと見失ってしまいます。

テキストボックスをクリックして、『さぁ文章を入力しよう』とタイピングを始めたら、IMEのモードが意図したものじゃなくてイライラ、なんてことがありませんか?

言語バー空気読めはそんな問題を解決します。

起動するとタスクトレイに常駐して、フォーカスが移ったタイミングで言語バーをキャレットの位置に移動し、数秒経ったらウィンドウの外に退避するように言語バーを調教するソフトです。

配布ページ

C#|WebBrowserで表示中のWebページのファビコンを取得

Visual Basic 中学校 掲示板

http://rucio.groupsite.jp/commu/ThreadDetail.aspx?ThreadId=9423

こんなやりとりがありまして。

最初の返信でWikipediaのリンクだけ示したのは、眠くてまともにコードが書けなかったからです。

その後、管理人のるきおさんがコードを書いていたので、僕も書きたくなったわけです。

眠くなかったのでサクっと出来ました。折角なのでC#に書き直してここに記録。

 

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
	public partial class Form1:Form {
		public Form1() {
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e) {
			this.webBrowser1.Navigate("http://blogs.dion.ne.jp/anis7742/");
		}

		private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
			foreach(HtmlElement linkTag in this.webBrowser1.Document.GetElementsByTagName("link")) {
				string relAttribute = linkTag.GetAttribute("rel");
				string iconUrl;
				if(relAttribute == "shortcut icon" || relAttribute == "icon") {
					iconUrl = linkTag.GetAttribute("href");
					if(iconUrl.StartsWith("http")) {        //完全なURLの場合
						this.Icon = getIconFromUrl(iconUrl);
					} else if(iconUrl.StartsWith("/")) {    //絶対パスの場合
						this.Icon = getIconFromUrl("http://" + e.Url.Host + iconUrl);
					} else {                                //相対パスの場合
						this.Icon = getIconFromUrl(e.Url.ToString() + iconUrl);
					}
					break;
				}
			}
			//タグでの指定が無い場合
			this.Icon = getIconFromUrl("http://" + e.Url.Host + "/favicon.ico");
		}

		private Icon getIconFromUrl(string url) {
			using(WebClient webClient = new WebClient())
			using(MemoryStream stream = new MemoryStream(webClient.DownloadData(url))) {
				return new Icon(stream);
			}
		}
	}
}

 

TwitterにWMPで再生中の曲を自動投稿するBOT作ってみた

作者より超お願い。りすにんぐなうがWindows7で動かないのです。作者はWindows7を持ってないのでお手上げなのです。Windows7で動くようにしてくれる人、絶賛募集中です。パッチをくれてもいいし、派生版として公開してくれてもいいです、NYSLですから。

Windows7のUIPIによってWMPからのメッセージがフィルタリングされてりすにんぐなうに届かないんじゃないかと考えているのですが、単純にWin32APIのChangeWindowMessageFilter関数を呼び出しても動かないようです。困りました…助けTE!

ClpBdImg0[1]

作成に至った経緯はこんな感じで超抜粋。

kyubot 【 @mitsugogo より急募】WMPで再生中の曲をTwitterに投稿するプラグ印

anis774 @mitsugogo 詳細希望。面白そうなら作ります

mitsugogo @anis774 Windows Media Playerで再生している曲名やアルバム名などをTwitterに流したいんです。今使ってみているプラグインですと、日本語で若干文字化けが発生するようなので・・・

anis774 @mitsugogo ちょっとやってみますね

sedna2501 @anis774 欲張り言うとこんな感じの無理でしょうか? ちょっとtext編集出来ると嬉しい・・・ http://d.hatena.ne.jp/brazil/20070413/1176394371

てな感じ。

OAuth対応の最新版

listeningnow_ver_1_52.zip(18.4KB)

OAuth対応の最新版のソースコード(VC# 2008 Express Edition向け)

listeningnow_src_ver_1_52.zip(36.3KB)

BASIC認証の旧バージョン

listeningnow_ver_1_01.zip(17.8KB)

作者:あにす

連絡先:anis774_for2ch@yahoo.co.jp

ライセンス:NYSL

【りすにんぐなうってなに?】

Windows Media Player で再生中の曲名をTwitterに投稿するBOTだよ。

【使い方】

WMPをメッセンジャーに曲名が送信されるように設定してね。

settings.iniを適当に編集してね。

intervalの単位は秒だよ。

りすにんぐなう.exeを起動してね。

起動したらintervalで設定した秒数ごとにタイマーが走るよ。

WMPから曲名を受信したらテキストボックスの内容が更新されるよ。

タイマーの時間が来たらテキストボックスの内容がTwitterに投稿されるよ。

それまでの間に投稿する内容を編集出来るよ。

タイマーの時間が来てもテキストボックスの内容が前回の投稿時から変わってなかったら投稿されないよ。

テキストボックスにフォーカスがある間はタイマーの時間が来ても投稿されないからゆっくり編集出来るよ。

テキストボックスの内容の投稿に成功するとボタンが押せなくなるよ。

settings.iniは正しく編集しないと容赦なくエラーで落るよ。

%0は曲名、%1はアーティスト名に置換されるみたいだよ。

何かあったらTwitterで@anis774に突っ込んでね。メール送っても気付かないかもね。

Ver 1.51 → Ver 1.52

・自動投稿をOFFにしても、手動で投稿した際に自動投稿が再開されてしまう不具合を修正。

Ver 1.50 → Ver 1.51

・自動投稿の有効/無効の切り替え機能を追加。

・入力文字数のカウンターを実装。

Ver 1.01 → Ver 1.50

・OAuthに対応。

・前回終了時のウィンドウの位置、サイズで起動するように変更。

Ver 1.0 → Ver 1.01

・曲名、アーティスト名が空白の場合にポストしないように修正。