2011年10月7日金曜日

F#でFizzBuzz問題

いろんな所で取り上げられてるプログラミングの初歩の初歩ですが…
F#でFizzBuzz問題解くならこんな感じかなぁ。

let FizzBuzz =
    seq {1..100}
    |> Seq.iter (fun x ->
        match x % 3, x % 5 with
           | 0, 0 -> printfn "FizzBuzz"
           | 0, _ -> printfn "Fizz"
           | _, 0 -> printfn "Buzz"
           | _ -> printfn "%d" x)

SyntaxHighlighterがF#対応してないね。
見づらくてごめんよ。

2011年8月5日金曜日

[BookMark]Internet Explorer 9 影響調査報告書

いつになったらIEの呪縛から逃れられるのかわかりません。
IE6に関して言えば、執筆現在でやっと利用率10%を下回ったところです。

IE向けのWEBシステムを提供するSIerとかに勤めてるプログラマとかSEは読んでおいた方が良い記事がマイクロソフトから公開されているのでブックマークを兼ねて紹介しておきます。

Internet Explorer 9 影響調査報告書

今、稼動している IE6、7/8 ベースのシステムを IE9 で運用するためには、どのような点に留意しながら検証を進めればいいか? IE9 で実装された新機能はどのような意味を持つのか? どのような影響が考えられるのか? 情報システム部門やシステム インテグレーターの方々が気になるであろう数多くの点が網羅されています。運用におけるノウハウをテクニカル ドキュメント・ホワイト ペーパーという形でご覧いただき、ご活用ください。
via : Internet Explorer 9 影響調査報告書


余談ですけど、IE6~IE9全てのバージョンで正しく動作、表示させようなんて無謀なのでやめとくことをお勧めしたい。

2011年8月4日木曜日

[PHP]Webページのタイトルを取得する

/**
 * Webページのタイトルを取得する
 */
function getPageTitle( $url )
{
    $html = file_get_contents($url);
    $html = mb_convert_encoding($html, mb_internal_encoding(), "auto" );
    if ( preg_match( "/<title>(.*?)<\/title>/i", $html, $match) )
    {
        return $match[1];
    }
    else
    {
        return "";
    }
}

[PHP]URL短縮用62進数ハッシュ

URL短縮サービスによく使われている手法をメモ
DBに登録された自動発番の数値を単純に0​-9,a-z,A-Zの62進数で変換します。

/**
 * 数値を0-9,a-z,A-Zの62進数に変換する
 */
function getEncodeToBase62($id, $base = 0)
{
    $sbox = array(  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61);
    $char = array( 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122);
    $hash = array();
    $i = 0;
    do
    {
        $hash[$i] = chr( $char[$sbox[(int)( floor( $id / pow( 62, $i )) + $i ) % 62]] );
        $i = count($hash);
    } while(( $base > $i ) || ( pow( 62, $i ) <= $id ));

    return implode( "", $hash );
}

2011年7月5日火曜日

[javascript]ブラウザが食べたCookieを調べる方法

ブラウザがWebページを表示した際にブラウザが受け入れたCookieを表示するには、アドレスバーに以下のコードを入力します。
javascript:document.cookie;

確定後、ブラウザが食べているCookieの一覧が表示されます。
WEBシステムでCookieを使用している際のデバッグとかに便利です。

2011年6月14日火曜日

[C#]サービス作成時、デバッグするときにデバッガを立ち上げる。

C#でWindowsサービスを作成するにあたって、ステップ実行でのデバッグがしたかったので、以下のようにちょっと工夫をしてみた。
Debugモードでビルドされているときに限り、デバッガ選択画面を立ち上がり、アタッチできます。

/// <summary>
/// サービス起動
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
    //デバッグ時のみデバッガを起動します。
    DebuggingProcess();

    //以降サービス起動時に行う処理
}

/// <summary>
/// [デバッグ属性メソッド]デバッガ起動
/// </summary>
[Conditional("DEBUG")]
private void DebuggingProcess()
{
    System.Diagnostics.Debugger.Launch();
}

メソッドにデバッグ時のみ実行される属性を付けます。
[Conditional("DEBUG")]

この属性の付いたメソッドは、Relaseモードで実行された場合には実行されません。
処理自体空振りします。

実行すると、デバッガはどれでデバッグしますか?的なウィンドウが現れ、指定したツールでアタッチできます。
ビルドしてインストールしてサービス立ち上げてデバッガ立ち上げてなんて…サービスのデバッグはホント面倒ですね。

2011年6月9日木曜日

[SQL Server]ANSI_NULLSオプションを取得する。

SQL Serverでは、NULL値との演算は常にNULL値が返ってきます。
WHERE句などでのNULL値との比較も必ずFALSEが返ります。

ANSI_NULLSオプションは、WHERE句などでNULLとの比較を成立させるかどうかを指定できます。
下のT-SQLでNULL値との比較がTRUEかどうかでANSI_NULLSオプションを取得します。

DECLARE @NULL_VALUE AS bit 
SET @NULL_VALUE = NULL 

IF NOT EXISTS(
    SELECT
        'ANSI_NULLS = OFF'
    WHERE
        @NULL_VALUE = NULL
) 
BEGIN 
    SELECT 'ON' AS [ANSI_NULLS_OPTION] 
END 
ELSE 
BEGIN 
    SELECT 'OFF' AS [ANSI_NULLS_OPTION] 
END 

ただし、今後のSQL Serverでは、ANSI_NULLSは常にONとなり、
SET ANSI_NULLS OFF を設定するアプリケーションすべてでエラーが発生するようになってしまうそうです。

NULL値との条件指定をする時は必ず" IS NULL "を使うのがベストです。

詳細は下記URLを参照のこと。
SET ANSI_NULLS (Transact-SQL)
http://technet.microsoft.com/ja-jp/library/ms188048.aspx

ちょっと考えればわかるようなことを真顔で書くのが私です。

2011年6月8日水曜日

T-SQLでキャッシュクリアするには…

DBCC使うんです。
同じセッションでクエリの実行速度判定をしたい場合とかは、キャッシュクリアしたほうが正確な測定ができます。
最近のSQL Serverは頭が良くて困るね(いい意味で
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

2011年4月30日土曜日

Adobe Acrobat か Reader の実行ファイルパスをレジストリから取得する

PDFファイルを印刷したいという要望があり、それの補助用メソッドです。

public static string GetPdfViewerPath()
{
    string path = String.Empty;
    Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe");
    if (rKey == null) rKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe");

    try
    {
        // レジストリから読み込み
        path = rKey.GetValue("").ToString();
    }
    catch (System.Security.SecurityException) { throw; } //レジストリキーからの読み取りに必要なアクセス許可がユーザーにありません。
    catch (System.UnauthorizedAccessException) { throw; } //必要なレジストリ権限がユーザーにありません。
    //catch (System.ObjectDisposedException) { throw; } //破棄されたキーを参照した場合
    //catch (System.IO.IOException) { throw; }
    catch
    {
        throw new ApplicationException("AdobeR AcrobatR もしくは ReaderR がインストールされていないため、PDFファイルの印刷ができません。");
    }
    finally
    {
        rKey.Close();
        rKey = null;
    }

    return path;
}

途中、try-catchでSystem.ObjectDisposedExceptionとSystem.IO.IOExceptionの捕捉をコメントにしているのは、その2つの例外が発生した場合にもインストールされていないと判断するためです。


以下余談

Adobe Reader単体でコマンド引数を使用して直接印刷をかけるのは止めたほうがいいと個人的には思う。
何故かというと、Adobe Readerに直接PDFファイルのパスを渡して印刷する方法だと、Adobe Reader自体の画面表示させないように設定してもバックグラウンドで動かなかったり、印刷完了しても画面が閉じられずプロセスが残ってしまうことがあるからです。
印刷はできるけどね。

こればかりは何ともいえないところですが、回避策としてとりあえず2点。
1. タイムアウトを指定して、印刷されたであろう時間が経過した後にプロセスをkillする
2. プリンタのキューを監視してプリンタへの印刷指示が完了したことを確認後プロセスをkillする


出来れば、Adobe Acrobat SDKでそれ用のプログラムを作成することをおすすめする。

なんかいい方法ないもんかね。

2011年3月6日日曜日

Android開発環境構築メモ

いろいろと自分用のメモでもあるので、
細かいところや説明とかは一切省くことにする。
※Windows用です。

  1. JDK
    http://java.sun.com/javase/ja/6/download.html
  2. Android SDK
    http://developer.android.com/intl/ja/sdk/index.html
  3. Android SDKのPATH設定
    任意の場所に設置後Toolディレクトリに対してPATHを通しておく(できればその後に再起動)
  4. Eclipse (というかPleiades)
    http://mergedoc.sourceforge.jp/
  5. Eclipse→Android Pluginインストール
    1. Eclipse起動。
    2. [メニュー]→[ヘルプ]→[新規ソフトウェアのインストール]
    3. 名前は任意(Androidとか入れとけ。)
    4. [ロケーション]は[ https://dl-ssl.google.com/android/eclipse/ ] うまくいかないなら[ http://dl-ssl.google.com/android/eclipse/ ]
    5. 取り合えず全部入れとく。
    6. インストール後、再起動を勧められるので従う。(本来は最適化もしたいところ[Eclipse終了後、-cleanオプション])
    7. Android SDK入れたとこにあるSDK Manager.exeを実行してSDKとかAVDとかいろいろ入れる。
  6. あとは作る。とにかく作り出す。

2011年3月3日木曜日

SQL Serverでクエリを使ってテーブルの列情報を取得する

SQL Server 2000以降ならつかえたはず。
知っといて損はないクエリ。

意外とこういうことできることを知らない人が多い気がする。
…うちの会社はね。

後付でテーブル設計書作るときに必要な情報も大抵はこれでOKかと。