詐欺まがいな広告が邪魔くさい

★ベストストア受賞記念セール!!
東芝 dynabook ノートパソコン 2012年 Windows7 Pro DVD-SM テンキー PC XP モード PB451ENBNR5A51

上記のようなタイトルに画像では8GB搭載的な事がデカデカと書かれ、ずうずうしくも80% OFFとも書かれている。
価格は 34800円 である。

OSは結構良く、セレクタブルのWin7Proだという。
これが Ultimate なら "安いかもしれない" と思うところだ。

肝心のCPUはなんと Celeron という貧弱さ。
これは妥当な価格に近いだろうと思ってしまう。

こういう価格の2重表記が詐欺まがいと思えて仕方がない。
ちなみにAmazonとかでは31000円台で売られてる。

GAC内のファイルをコピーするPowerShellスクリプト

PowerShell 1.0でも普通に動きました!

$target = "C:\WINDOWS\assembly"
$copyto = "C:\develop\temp"
$asmname = "アセンブリ名"

dir $target -Recurse |
    ? { $_.Name -match $asmname } |
    % {
        $from = $_.FullName
        $vdr = $from.TrimStart($target)
        $to = Join-Path $copyto $vdr
        $toroot = Split-Path $to -Parent
        if (-not (Test-Path $toroot)) {
            mkdir $toroot
        }
        copy $from $to
    }
      • -

Mercurial リファレンス

■設定ファイル

ファイル名 内容(効果) 保存先
.hgignore リポジトリ除外リスト(addで追加できないようにする) .hgと同じフォルダに作成する事


■.hgignore

syntax: regexp
\.
/bin/
/obj/

上記設定で .NET系(F#でしか確認してません) の要らないファイルは除外できる。


■コマンド
gitと同じ感じ、時間が空いたときに追加予定

(おまけ) Excel DNA for F# の日付の注意点2

日付に関して別の問題が発覚!

ExcelDNAで日付を入力したセルに対しての読み取り方法

  1. 「yyyy/MM/dd」の形式のデータDouble型のシリアル値になる。
  2. 「yyyyMMdd」の形式のデータはDouble型の数値になる。

シリアル値の変換は以下のコードを利用
(おまけ) F#でExcelの日付データのシリアル値をDateTime型に変換する。


Double型の「yyyyMMdd」は文字列にしてDateTime.TryParseすれば簡単に変換できる。
Double型の「yyyyMMdd」は文字列にして"/"を挿入して DateTime.TryParse すれか、TryParseに書式指定できたと思われるので、書式指定アリで変換する。



これらを踏まえた関数を用意すると非常に便利である。
※カルチャ(ロケール?)がja-JPであることが大前提のコードとなります。

//■テストコード
> (tranDate "20001231").Value.ToShortDateString();;
val it : string = "2000/12/31"
> (tranDate 20001231.).Value.ToShortDateString();;
val it : string = "2000/12/31"
> (tranDate 36891.).Value.ToShortDateString();;
val it : string = "2000/12/31"
//■ソースコード
open System

/// Excel日付の規定値
let excelBaseDate = DateTime.Parse("1899/12/31")

/// DateTimeに変換する。
let tranDate (value:obj) =
    let text = Convert.ToString(value)
    if String.IsNullOrEmpty text then None
    else
        let text = if text.Length = 8 then text.Insert(6, "/").Insert(4, "/") else text
        let (b,dt) = DateTime.TryParse text
        if b then Some dt
        elif value.GetType() = typeof<Double> then
            let x = value :?> Double
            let x = if x < 59. then x else x - 1.
            Some <| excelBaseDate.AddDays x
        else None
    • -

(おまけ) F#でExcelの日付データのシリアル値をDateTime型に変換する。

Excelのバグで1900/2/29の日付が存在します。
そのため、それ以降の日付のシリアル値に誤差が生じるたりします。
それも踏まえた形で関数を作成。

この関数はExcel-DNAくらいでしか使わないと思われます。


■実行結果

> getDate 36526;;
val it : DateTime = 2000/01/01 0:00:00 {Date = 2000/01/01 0:00:00;
                                        Day = 1;
                                        DayOfWeek = Saturday;
                                        DayOfYear = 1;
                                        Hour = 0;
                                        Kind = Unspecified;
                                        Millisecond = 0;
                                        Minute = 0;
                                        Month = 1;
                                        Second = 0;
                                        Ticks = 630822816000000000L;
                                        TimeOfDay = 00:00:00;
                                        Year = 2000;}
> getDate 73051;;
val it : DateTime = 2100/01/01 0:00:00 {Date = 2100/01/01 0:00:00;
                                        Day = 1;
                                        DayOfWeek = Friday;
                                        DayOfYear = 1;
                                        Hour = 0;
                                        Kind = Unspecified;
                                        Millisecond = 0;
                                        Minute = 0;
                                        Month = 1;
                                        Second = 0;
                                        Ticks = 662380416000000000L;
                                        TimeOfDay = 00:00:00;
                                        Year = 2100;}

ソースコード

open System

/// Excel日付の規定値
let excelBaseDate = DateTime.Parse("1899/12/31")
/// Excel日付シリアル値をDateTimeに変換する。
let getDate x =
    let x = if x < 59 then x else x - 1
    excelBaseDate.AddDays(float x)
/// Excel日付シリアル値をDateTimeに変換する。
let getTryDate x =
    try
        Some <| getDate x
    with
    | _ -> None
    • -

F#で Shift-JIS 文字列のカットと左詰右詰

右詰の文字列カットはとりあえずこの仕様のままにします。
違和感はありますが、日本では入力が左から右なので問題ないと判断。


■実行テスト

> padLeftText '@' 10 "1234567890";;
val it : string = "1234567890"
> padLeftText '@' 10 "123456789";;
val it : string = "123456789@"
> padLeftText '@' 10 "123456789あ";;
val it : string = "123456789@"
> padRightText '@' 10 "1234567890";;
val it : string = "1234567890"
> padRightText '@' 10 "123456789";;
val it : string = "@123456789"
> padRightText '@' 10 "123456789あ";;
val it : string = "@123456789"

ソースコード

open System
open System.Text

/// 左詰右詰の判別共用体
type PadType = PadLeft | PadRight

/// SJISエンコーディング
let sjis = Encoding.GetEncoding(932)

/// 指定サイズ内に収まる形で文字列をカットし指定文字で左詰または右詰した文字列を返す。
let padText (enc:Encoding) pt pc size (text:string) =
    text
    |> Seq.scan (fun (_,size) c ->
        let s = string c
        s,size + enc.GetByteCount(s)) ("",0)
    |> Seq.takeWhile (snd >> (>=)size)
    |> Seq.fold (fun (a,_) (s,c) -> a+s,c) ("",0)
    |> (fun (s,c) ->
        if c = size then s
        else
            let pad = (new String(pc, size-c))
            match pt with
            | PadType.PadLeft -> s + pad
            | PadType.PadRight -> pad + s
    )

/// 指定サイズでカットした文字列を指定文字で左詰めした文字を返す。
let padLeftText = padText sjis PadType.PadLeft

/// 指定サイズでカットした文字列を指定文字で右詰めした文字を返す。
let padRightText = padText sjis PadType.PadRight
    • -

実戦投入してみた

F# + ExcelDNAで実戦投入してみたところ、VBAで作るより多分早く作れたと実感できました。

ただし、F#に結構慣れており、かつVBAをまったく使っていなかったからなのと、VBAで作成した過去の遺産がないからだとも考えられます。

VBAなんかで作るより、F#で作るほうが少なくともアルゴリズム部分はめちゃくちゃ簡単に短くかけるのが素晴らしいです。
それ以外の面も .NET Framework の恩恵でとても楽にコーディングできるのが魅力的ですね。

ExcelDNAで面倒だと感じたのは Excel に入力された日付データの取得が面倒でした。
Excel上のシリアル値で取得してしまう為、1900年1月1日からの日数のDouble型の数値で取得されてしまいます。

なので日付か数値かをExcelReferenceでは判断できず、判断用のコードが必要になります。
尚、セル情報で文字列データを取ってきたとしても、Double値になるので注意が必要です。

それ以外は非常に便利だと感じます。
このままVBA撲滅を目論見たいと思います。