黒龍's Blog

明日から役立つ無駄知識をあなたに(仮)

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  146  : 記事  0  : コメント  280  : トラックバック  23

ニュース

わんくま同盟に参加させていただきました。
どうぞよろしくお願いします。

自己紹介

コミュニティ

えがクロック

セキュリティなめんなよ

書庫

日記カテゴリ

2009年6月29日 #

久々のエントリ。

.NetからCOMを参照するときのお話し。単体のオブジェクトを使う分には参照するだけでラッパークラスが作られて楽チンに使えますよね。Marshal.ReleaseComObjectさえ忘れなければ何にも悩むことはないと思います。

で、忘れないようにIDisposableなラッパーを作ったりしてusingでウマーな感じにしたり。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

public class ComObj<T> : IDisposable
{
    private bool disposed = false;
    private T target;
    public T Target
    {
        get { return target; }
    }
    private ComObj(){}
    public ComObj(T target)
    {
        this.target = target;
    }
    ~ComObj()
    {
        Dispose(false);
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    private void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing) { }
            if (target != null && Marshal.IsComObject(target))
            {
                Marshal.ReleaseComObject(target);
            }
            target = default(T);
            disposed = true;
        }
    }
}
public static class ComObjUtils
{
    public static ComObj<T> Create<T>(T obj)
    {
        return new ComObj<T>(obj);
    }
}

けどもこれってあんましウマーじゃないよなぁと常々思っておりました。vbscriptからいじるにしても結構コード量増えるんで注意しつつ使うのが落とし所かなぁと。そんなこんなで悶々してたところふと思いついたのが「透過プロキシつかってAOP的に解決できんじゃね?」ってのが発端でごそごそ書いてみました。

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Collections;

namespace COMProxy
{
    public class COMProxy<T> : RealProxy
    {
        private readonly Stack objecctStack;
        public Stack ObjecctStack
        {
            get { return objecctStack; }
        } 


        private readonly T target;
        public T Target
        {
            get { return target; }
        }
        public COMProxy(T target, Type type,Stack objecctStack)
            : base(type)
        {
            this.target = target;
            this.objecctStack = objecctStack;
            this.objecctStack.Push(target);
        }
        public COMProxy(T target, Stack objecctStack)
            : base(target.GetType())
        {
            this.target = target;
            this.objecctStack = objecctStack;
            this.objecctStack.Push(target);
        }
        public delegate IMessage BeforeInvokeDelegate(IMessage msg);
        public delegate ReturnMessage AfterInvokeDelegate(ReturnMessage msg);
        public event BeforeInvokeDelegate BeforeInvoke = delegate(IMessage msg) { return msg; };
        public event AfterInvokeDelegate AfterInvoke = delegate(ReturnMessage msg) { return msg; };

        public override IMessage Invoke(IMessage msg)
        {

            msg = BeforeInvoke(msg);

            IMethodCallMessage methodCallMessage = msg as IMethodCallMessage;
            MethodInfo targetMethod = methodCallMessage.MethodBase as MethodInfo;
            object[] args = methodCallMessage.Args;

            ReturnMessage returnMessage;
            try
            {
                object invokeResult = targetMethod.Invoke(this.target, args);
                //COMオブジェクトを返す場合解放のためにリストに追加する
                if (invokeResult != null && Marshal.IsComObject(invokeResult))
                {
                    Type org = invokeResult.GetType();
                    Type type = (targetMethod.ReturnType == typeof(object)) ? typeof(MarshalByRefObject) : targetMethod.ReturnType;
                    lock (this.objecctStack.SyncRoot)
                    {
                        if (!this.objecctStack.Contains(invokeResult))
                        {
                            invokeResult = Utils.Create(invokeResult as MarshalByRefObject,type, this.objecctStack);
                        }
                    }
                }
                returnMessage = new ReturnMessage(invokeResult, args, args.Length, methodCallMessage.LogicalCallContext, methodCallMessage);
            }
            catch (TargetInvocationException ex)
            {
                returnMessage = new ReturnMessage(ex.InnerException, methodCallMessage);
            }

            returnMessage = AfterInvoke(returnMessage);
            return returnMessage;
        }
        public new T GetTransparentProxy()
        {
            return (T)base.GetTransparentProxy();
        }
    }
    public static class Utils
    {
        public static T Create<T>(T target,Stack objectStack)
        {
            return new COMProxy<T>(target, objectStack).GetTransparentProxy();
        }
        public static T Create<T>(T target,Type type, Stack objectStack)
        {
            return new COMProxy<T>(target, type, objectStack).GetTransparentProxy();
        }
    }
}

激しく試行錯誤中でぐだぐだなコードですがやってることはシンプルにメソッド呼出し後にCOMオブジェクト戻す場合は解放に備えてリストに追加してます。てかそれしかしてない^^;

使うほうではこんな感じ

ApplicationClass app = Utils.Create(new ApplicationClass(), COMList);
try
{
    Workbooks books = app.Workbooks as Workbooks;

    Workbook book = books.Open(
        ofd.FileName,
        Type.Missing,
        true,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing);
    foreach (Worksheet sheet in book.Worksheets)
    {
        string cellValue = ((sheet).Cells[2, 2] as Range).Value2.ToString();
        MessageBox.Show("Cell value is " + cellValue);
    }
}
finally
{
    app.Quit();
    while (COMList.Count > 0)
    {
        object comObj = COMList.Pop();
        Marshal.ReleaseComObject(comObj);
    }
}

何となく方向性はあってそうなのでブラッシュアップして使えるようにしたいなぁ。オブジェクトが戻るときとかいやーんな感じのコードになっちゃってますがCOM使う際の手間の軽減になるかも?と思ってます。なんかぼやぼやしてるとC#4.0でいいじゃんwとか言われかねないのでぐだぐだながら放流してみました^^;

実はもっといい方法あったりします??

posted @ 22:35 | Feedback (2)

2009年6月16日 #

横持ちと縦持ち_その後3 ~  縦持ちを横持ちに置換して読み取る

すごくいいエントリだとは思うんですが…なんか単純な二元論に落としこんじゃってるようでもったいなく感じるのは私だけでしょうか?

1~12月の集計的なテーブル相手に読み書き比べるのはナンセンスだと思います。(どちらも横持ちにすべき)

逆に更新ばかりがあるようなら縦にしなきゃ同時実行制御にあたりまくってどうしようもなさそうに思います。

この辺りはバランスというか要件に応じたものをモデリングすることだと思ってます。どっちかがベストとかは違うんじゃないかなと。

きつい言い方になると思いますが速度差縮めるための縦横変換はなんかどちらのメリットもスポイルしてる気がします。

んーばたばたしてるのでこの辺で。

posted @ 23:51 | Feedback (5)

2009年6月6日 #

えっとまずはじめに言いたいのはサロゲートvs複合キー言うな、いきなり正規化崩し言うな、第三正規形で十分って言うな。以上…じゃ全く意味不明なので思うところをつらつらと。

まず、論理設計と物理設計をいっしょくたにしてはいけません。また論理設計段階のモデリングも調査レベルから画面等を考慮したデータの合わせこみ、はたまたチューニング段階までいろいろあるので一口に論理設計といっても抽象度は結構違います。私がこういった話題を目にした時いつも気になるのは初期のモデリング時の業務要件と実装制約が混然一体となって語られているところ。いきなりサロゲートキー入れての話もいいですが思考停止や足かせになりかねないのでちょっと考えてみましょう。

で、よくあるサロゲートいるいらないのお話ですが私はサロゲートキー嫌いじゃないです。かといってオールサロゲートってこともありません。この辺り感覚で決められていることが多いと思うんですが単純にリレーション張るためっていうのも初学者に誤解を与えそうなのでドメイン(定義域)から考えてみたいと思います。

テーブル定義する際に正規化は意識すると思います。繰り返し項目を排除するってやつですね。まずは正規化されていないテーブルから考えるのですが世の中いろいろとシステム化されちゃってるのであちらこちらでサロゲートキーを見かけます。

伝票Noとか社員コードとか正規化以前を考えてもふと出てきちゃいますよね。けどこれって事象の記録には必須じゃないはずです。伝票番号がなくてもいつ誰に何を売ったかが分かれば売上の記録はできますし社員も入社日、氏名、生年月日、現住所など情報を増やしていけばユニークな識別は可能になります。

また、性別や様々な区分にしても同様でコードなんて付けずにそのまま記録して何の問題もありません。

正規化の手始めにで関数従属を切り出すのはいたって普通の手順ですがこの際にサロゲートを意識せず作っちゃってる例が多いと思います。○○コードとか作ってコード+属性値のみのマスターテーブルに切り出してませんか?

これをいきなりイメージしちゃう人は思考停止しちゃってますのでまずはやめてみないといけません。実際のところコードがなくてもリレーションは張れるのですから。(いわゆる正規化の手順の話でも当たり前のように取引先コード、取引先名等のコードありきの関数従属がありますので困ったものですが…)

そうなると「同じならリレーションいらなくね?」「コード入れたほうが容量小さくね?」「そもそもマスタいらなくね?」って言う意見はどれも正しいです。ではなぜこういったマスタがあるのかを考えてみましょう。

まずリレーションを張るにしてもコードを入れないと参照先も自身の属性も同じになってしまいますよね。ここで不要!と結論付けるのはまだ早くてテーブルを切ることで入りうる値の範囲が限定できます。これが定義域(ドメイン)をテーブルで表現したということです。性別ならば男、女、不明というテーブルを作ることでこの範囲に限定されるわけですね。数値や文字列も同じようにテーブルを設けて制限をかけたりできますがDBの機能を使って実現(型もそうですしチェック制約などの範囲チェックも同様)するほうが多いです。単純な値(性別や区分)はDBの機能でもやれると思いますがまずは値の範囲を規定する、その実装はテーブルでもできるしDBの機能でもできる。という思考手順を踏んだほうがいいと思います。

単純な属性値ひとつじゃない複数のケースも同様で値の組み合わせに対してとりうる組み合わせををテーブルに記録します。

じゃなぜコードを入れるの?って話になるんですが容量的な意味合いと変更可能性が主な理由になります。男、女など意味は変わりませんが表示項目としてとらえるのであれば十分に変更の可能性があります。まずそもそも定義域としての流れなので変更可能性を考慮して表示項目は別に設けたほうがよいでしょう。

テーブルイメージだとこんな感じですね。

識別子 属性値
男、女など 男性、女性など

男とか女とかダイレクトに書いてあるとコードっぽくないですが意味わけされたのでこれでも立派にコードです。画面項目ではなく区別するために導入されているのでコードもサロゲートキーであると言えると思います。

組み合わせ項目にしても同様ですが容量的にも無駄が多くなりますから○○IDなんて付けたりします。流石にコード体系考えて人が意識して何かの識別子をつける意味もあまりないので数値の連番を振ったりしますね。

結局のところコード+属性値という形はきちんと正規化された形ではあるのですが丸暗記的な思考停止ときちんと意味を考えながらでは意味合いが変わってくると思います。

実際のところチューニング意図を踏まえてどんどん正規化していけばかなりの項目が自然とサロゲート+属性値になるのは確かなんですがきちんと説明できない場合や複合キーがあまりない場合正規化度合いの低い状態で早期の思考停止になっちゃってませんか?

正規化の最終段階での制約の除去と未正規化テーブルのビジネスルールの消失をまぜこぜにしないように。

ちょっと長くなったので今回はこの辺で。

posted @ 16:21 | Feedback (4)

Windows 開発統括部 Blog : メモリ保護 ( DEP/NX Memory Protection ) 機能の IE7 と IE8 の違い

微妙に違いがあるようです。Windows Server 2003 は IE7 は有効で IE8 は無効っていう風に読めるんですがほんとかな?

posted @ 11:39 | Feedback (1)

2009年3月22日 #

よく見りゃ前回書いてないし^^;おまけにタイトル大阪便器妖怪とかでるし・・・orz

簡単に振り返りをば。

  • 「ASP.NET 2.0 Provider Model 概要」とりこびと lv2くま~

    ASP.NETで全般的に用いられてる拡張の仕組みであるProvider Modelについての紹介。こういった思想を踏まえて作るとぽいよね~って思えました。けどやりすぎ注意なんだろうなぁ^^;

  • 「twitterのbot作るよー。」坂上ひさとさん lv1くま~

    あっさりと作れるもんだとびっくり。さこったーなんてのがあるんだなぁ。思わず眼鏡bot作ろうかと思ったのは秘密。

  • おひるごはん

    会場近くのラーメン屋さんで味噌の餃子セットをチョイス。にんにくがちょっぴり入ってたので午後からくさかった人すみません。味はまぁまぁよかったです。

  • LTは秘密~wなんだけどちょっと紹介するならGr○○vyすげー、VMWareFusionとな!?、COLORSとあとぐぐれw、ゾンビ欲しいぃ~~って感じです。

  • 「ジェネリクスを使おう!」凪瀬悠輝 lv3くま~
  • javaのジェネリックスを紹介。classにかかるものだけだったんですがコレクションの<? extends>、<? super>あたりで頭がショートしました。javaは要素の代入互換だけじゃないのかな?いまいちメリットがつかめなかったです。自己言及型のジェネリックスも継承でいけるよとか。

  • 「ソフトウェアを美味しく解析する方法」willさん lv2くま~
  • 最初はx86のインストラクチャとかの紹介で皆ポカーンフェイス(別名豆鉄砲フェイス)になってたんですがclack me出てきたあたりから皆食いつく食いつくwガシガシ解析していくさまはブラッディ・マンデイのファルコンのようでした。今はPCいじっててもオタクっぽくないいい世の中になりましたね~。

  • 「Visual Studio によるデバッグ技法」囚人 lv1くま~

    マネージコード中心にデバッグの技法をあれこれ。これは便利なので皆に伝えようと思いました。

  •  

    次回はいつもとは趣向の違うまっちゃ139さんとの合同勉強会です。

    お申し込みはこちらから

    posted @ 0:14 | Feedback (0)

    2009年2月1日 #

    無事勉強会終了しました。普段ルータ代りにしているEeePCにうっかりWindows7を入れていたんですがいつもどおりに使えたのでよかったです。SkypeやらLimeやらの文字入力がちょっと重いので切れないかドキドキしてましたが^^; 来月は戻してるかもですが。

    posted @ 22:36 | Feedback (0)

    2008年12月31日 #

    振り返ればあまりエントリ数もなくこれといった活動はできてませんでした^^;

    今年も大阪勉強会へ参加しつついろいろなことを吸収できればいいなぁと思います。

    それではあと少しで今年も終わりですが来年もよろしくお願いします。

    posted @ 19:20 | Feedback (0)

    2008年12月3日 #

    張っていきなり噴いた。これは反則w

    image

    ブログパーツ配布元

    posted @ 18:06 | Feedback (2)

    2008年11月27日 #

    某氏のブログエントリより

    ディベロッパー製品開発統括部 Blog : Visual Studio 2008 Service Pack 1(SP1)用Intellisenseの修正プログラムが公開されました

    posted @ 14:45 | Feedback (1)

    2008年11月24日 #

    ずきんさんとこより

    IT Community Impact!ストリーミング - インフラ管理者の独り言(はなずきん@酒好テム管理者)

    Internet Week 2008ってのがあるみたいです。秋葉だそうです。ストリーミングがあるようなのでコソーリ見ることにします。

    posted @ 23:23 | Feedback (2)

    2008年11月19日 #

    これだろうか。わんくまメールはスパムがかなり来てたんですが驚くくらい減ってます。

    一時的でも効果あり:スパム流通量が激減、米大手ISPが業者の接続遮断 - ITmedia エンタープライズ

    posted @ 19:27 | Feedback (2)

    いろいろと選択肢があるのですが私はstsadm.exeを使ってます。で、知ってる人には当たり前なのかも知れないのですが-backupmethodオプションを使ってとったバックアップはstsadm.exeだけじゃなくてサーバの全体管理 -> サーバ構成の管理にあるバックアップから復元できるようです。

    image

    ちなみにこんなバッチを作ってタスクスケジューラに放り込んでます。

    ディレクトリ構成はこんな感じを想定。

    <退避先>
     ├\backup(バックアップファイルが入る)
     ├\old(1世代前のバックアップファイル)
     └\log(ログ置場)

    フルバックアップ用cmd)

    rd /S /Q <退避先>\old
    md <退避先>\old
    move /Y <退避先>\backup <退避先>\old\%date:~-10,4%%date:~-5,2%%date:~-2,2%
    md <退避先>\backup
    "%CommonProgramFiles%\Microsoft Shared\Web Server Extensions\12\BIN\stsadm.exe" -o backup -directory <退避先>\backup -backupmethod full >> <退避先>\log\%date:~-10,4%%date:~-5,2%%date:~-2,2%.log

    差分バックアップ用cmd)

    "%CommonProgramFiles%\Microsoft Shared\Web Server Extensions\12\BIN\stsadm.exe" -o backup -directory <退避先>\backup -backupmethod differential >> <退避先>\log\%date:~-10,4%%date:~-5,2%%date:~-2,2%.log 

    フルバックアップと差分を適度なタイミングで組み合わせればいい感じになると思います。(このcmdだとフルバックアップは1日以上のタイミングを想定)

    posted @ 13:24 | Feedback (0)

    2008年11月17日 #

    があるみたいですね。Tech・Ed 2008 と同じ会場みたいです。そういえば Tech・Ed 2008 の Post Conference DVD っていつ届くんだろう??

    posted @ 10:28 | Feedback (2)

    2008年11月6日 #

    Urlscan Filter v3.1 はインジェクションなどの URL に細工したリクエストをブロックしてくれる IIS 用のツールなんですがこれを入れると Windows Share Point Services 3.0 の Wiki や画像を入れたドキュメントリストなどが 404 エラーを起こすようになります。 WSS を使っている方はご注意を。

    posted @ 16:13 | Feedback (0)

    2008年11月3日 #

    わんくまのRSSが更新されてないとおもったらなにやらエラーで失敗している。

    DTD 付きのフィードはサポートされていません。

    どなたかご存じ?

    posted @ 14:11 | Feedback (2)

    2008年10月30日 #

    DFSでオンデマンド認証(適当語)がしたいの続き

    どうやら再認証しないのは仕様みたいね・・・。

    Windows Server 2003 および Windows 2000 で DFS 配下のリンクにアクセスした時にエラーが表示される

    んむーどうしたものやら。

    posted @ 19:03 | Feedback (0)

    // GetOSVersion.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
    //
    
    #include "stdafx.h"
    #include "Windows.h"
    #include 
    
    
    #define PLATFORM_ID 0
    #define MAJOR_VERSION 1
    #define MINOR_VERSION 2
    #define BUILD_NUMBER 3
    #define HELP 4
    #define SYNTAX_ERROR -1
    
    int _tmain(int argc, _TCHAR* argv[])
    {
     OSVERSIONINFOA OsVersionInfo;
     OsVersionInfo.dwOSVersionInfoSize = sizeof( OsVersionInfo );
     GetVersionExA( &OsVersionInfo );
     
     
     int resultType = SYNTAX_ERROR;
     if(*++argv != NULL)
     {
      if(**argv == '/')
      {
       std::string command = (*argv+1);
       if(command.compare(_T("Platform")) == 0)
       {
        resultType = PLATFORM_ID;
       }
       else if(command.compare(_T("Major")) == 0)
       {
        resultType = MAJOR_VERSION;
       }
       else if(command.compare(_T("Minor")) == 0)
       {
        resultType = MINOR_VERSION;
       }
       else if(command.compare(_T("Build")) == 0)
       {
        resultType = BUILD_NUMBER;
       }
       else if(command.compare(_T("?")) == 0)
       {
        resultType = HELP;
       }
      }
     }
     else
     {
      resultType = PLATFORM_ID;
     }
    
     int resultCode = 0;
    
     switch(resultType)
     {
     case HELP:
      std::cout 
       << "GetOsVersion : OSのバージョンを取得します。" << std::endl 
       << "/? : このメッセージの表示。" << std::endl
       << "/Platform : プラットフォームIDを取得。" << std::endl
       << "/Major : メジャーバージョンを取得。" << std::endl
       << "/Minor : マイナーバージョンを取得。" << std::endl
       << "/Build : ビルドナンバーを取得。" << std::endl;
      return 0;
     case PLATFORM_ID:
      resultCode = OsVersionInfo.dwPlatformId;
      break;
     case MAJOR_VERSION:
      resultCode = OsVersionInfo.dwMajorVersion;
      break;
     case MINOR_VERSION:
      resultCode = OsVersionInfo.dwMinorVersion;
      break;
     case BUILD_NUMBER:
      resultCode = OsVersionInfo.dwBuildNumber;
      break;
     default:
      std::cout 
       << "オプションが不正です。" << std::endl << std::endl
       << "GetOsVersion : OSのバージョンを取得します。" << std::endl 
       << "/? : このメッセージの表示。" << std::endl
       << "/Platform : プラットフォームIDを取得。" << std::endl
       << "/Major : メジャーバージョンを取得。" << std::endl
       << "/Minor : マイナーバージョンを取得。" << std::endl
       << "/Build : ビルドナンバーを取得。" << std::endl;
      return -1;
     }
     std::cout << "Platform is " 
      << (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ? "Windows" : "WinNT") 
      << ", MajorVersion = " << OsVersionInfo.dwMajorVersion 
      << ", MinorVersion = " << OsVersionInfo.dwMinorVersion
      << ", BuildNumber = " << OsVersionInfo.dwBuildNumber << std::endl;
     return resultCode;
    }
    
    
    posted @ 16:46 | Feedback (5)

    DFSでドメインにルートをいくつか作る

    \\hoge.localとか

    そこにフォルダを切ってターゲットをぶら下げるんだが認証要らないとこもあるのでDFSホストしてるディレクトリのACL、共有のアクセスはEveryoneの読み書きを付与。

    \\hoge.local\backupこれは認証なしのターゲットにリンク

    (\\smb\backup実際はこういう共有先)

    \\hoge.local\sharedこれは制限したいので認証ユーザのみとしたい

    (\\smb2\backup実際はこういう共有先)

    やりたいこととしては\\hoge.local\sharedにつないだ時点で認証ダイアログが出るような形にしたいのですがすんなりとエラーになってくれやがります

    このとき\\smb2\backupなり\\smb2なりにつなぐと認証要求のダイアログが出てきちんとアクセスできます。

    やっぱりDFSって認証が必要な単位でルートわけないとだめなんでしょうか?なんかうまい設定方法ないものだろうか…。

    posted @ 14:09 | Feedback (1)

    2008年10月25日 #

    孤月/永倉えいるさんのWMセッション。芋星を手にしてからWM開発にはまっているそうです。WMはeVC++でお仕事したことはあるんですが最近の.Netは触ってないですねぇ。.Net1.1の頃にとんでもなく遅かったのがトラウマになっちゃって^^; 私もセッション聞いてからゆるふわ開発してみようかなw

    その他のセッションはこんな感じ。

    • 10:30 ~ 10:40 わんくまについて等
    • 10:40 ~ 11:25 「わんくまに見る勉強会開催のススメ」中博俊 lv0くまー
    • 11:35 ~ 12:20 「AOPによる二次キャッシュのすすめ (S2Cachingを例にして)」たにごん lv2くまー
    • 12:20 ~ 13:20 おひるごはん
    • 12:50 ~ 13:20 ライトニングトーク 5分間の真剣勝負
      • たか2
      • hashy
      • taknb2nch
    • 13:20 ~ 14:05 「なんだかちょっとまわりと違う子供をとりまく世界」Mr.T lv0くまー
    • 14:15 ~ 15:00 「誰にでも出来る情報収集と情報公開」はなずきん lv1くまー
    • 15:10 ~ 15:55 「たまには化学とかどうでしょう?」牟田口 lv1くまー
    • 16:05 ~ 16:50 「ゆるふわWindowMobile開発」こげつ lv1くまー
    • 18:00~ 懇親会~

    会場が変わったこともあってまだ席に空きはありますよ~。ぜひご参加をw

    申し込みはこちらから

    posted @ 15:18 | Feedback (0)

    2008年10月24日 #

    WSH、Power Shellの人として有名なむたぐちさんのセッション。学生時代は化学を専攻してらしたそうで面白い話が聞けそうです。私は化学とかさっぱりなのですがわかりやすく教えてもらえると期待^^;

    その他のセッションはこんな感じです。

    • 10:30 ~ 10:40 わんくまについて等
    • 10:40 ~ 11:25 「わんくまに見る勉強会開催のススメ」中博俊 lv0くまー
    • 11:35 ~ 12:20 「AOPによる二次キャッシュのすすめ (S2Cachingを例にして)」たにごん lv2くまー
    • 12:20 ~ 13:20 おひるごはん
    • 12:50 ~ 13:20 ライトニングトーク 5分間の真剣勝負
      • たか2
      • hashy
      • taknb2nch
    • 13:20 ~ 14:05 「なんだかちょっとまわりと違う子供をとりまく世界」Mr.T lv0くまー
    • 14:15 ~ 15:00 「誰にでも出来る情報収集と情報公開」はなずきん lv1くまー
    • 15:10 ~ 15:55 「たまには化学とかどうでしょう?」牟田口 lv1くまー
    • 16:05 ~ 16:50 「ゆるふわWindowMobile開発」こげつ lv1くまー
    • 18:00~ 懇親会~

    申し込みはこちらからw

    posted @ 12:51 | Feedback (2)