IIJIMASが勉強しようとしています。

これからこれから♪

目次

Blog 利用状況

ニュース

わんくま同盟 東京勉強会 #45 数学デー 私の資料(pptxとxlsx)

確率の不思議

わんくま同盟 東京勉強会 #37 私のLT資料

数の冪の和の式 を求めてみよう!

デブサミ09でわんくま同盟の紹介をしたスライド

わんくま同盟 東京勉強会 #26 LT祭りの私のスライド

わんくま同盟 東京勉強会 #23の私のスライド

わんくま同盟 東京勉強会 #18の私のスライド


自己紹介(仮)

IIJIMASと申します。 東京都多摩市在住です。多摩川のそばです。 まだ20代…
10代…でした0x1Fです
昔、家に猫がいました。猫好きです。
ブログは苦手(?)
IIJIMASのSは何って言われます。 IIJIMASって
なんて読むかは自由です。
魚や網間企業とゲームとは無関係です。
数学とか宇宙とかの読み物とか好きです。
血液型:果汁100%A
メタボ予備軍。。。orz
Twitter

...............
MVP 審査応募ページ~ 求む、日本のMVP。
MCTS:.NET Framework 2.0: Windows アプリケーション
MCTS:.NET Framework 2.0: Windows アプリケーション

MCSD.NET:マイクロソフト認定ソリューションデベロッパー(MCSD) Microsoft .NET トラック
Microsoft Certified Solution Developer for Microsoft.NET

リンク

わんくま同盟
わんくま同盟

C#VB.NET掲示板
C#VB.NET掲示板

わんくま同盟 Blog's

ちょっと一言(仮)


書庫

日記カテゴリ

2010年8月1日 #

自作TwitterクライアントをOAuth認証に対応させる。(2)

自作TwitterクライアントをOAuth認証に対応させる。の続き。

  1. クライアントがTwitterにRequest Tokenを要求する。
  2. TwitterがクライアントにRequest Tokenを返す。
  3. ユーザにAuthorizeページでクライアントアプリケーションを「許可」してもらう。
  4. Twitterが暗証番号を表示する。
  5. ユーザがクライアントに暗証番号を入力する。
  6. クライアントがTwitterにAccess Tokenを要求する。
  7. TwitterがクライアントにAccess Tokenを返す。
  8. クライアントにAccess TokenとAccess TokenSecretを保存する。
  9. 以降、クライアントはAccess Tokenを含めてAPIの各リクエストをする。

各手順では細かいパラメータがあります。このうちクライアントに関連づける必須のパラメータConsumer keyと対になるConsumer Secretを取得するためにクライアント開発者はいかのページアクセスしてフォームを埋める必要があります。
「Twitter / Applications: Register」 http://twitter.com/apps/new

Application Name:にアプリケーション名(twitterという文字列を含むことができません!)を入力、Description:に説明(10文字以上)を入力します。Application Website:は必須の項目になっていますので、今回は自分のホームページを設定します。公開クライアントの場合はクライアントのダウンロードサイトやサポートサイト等を指定します。Application Type:はデスクトップアプリケーションの場合Clientを選択します。

これらはあとからでも修正できます。

入力を終え[Save]をクリックすると、Consumer key と Consumer secret の値が表示されます。アプリケーションの端末に保存して使用します。

自分のアプリは複数登録できて、以下のページより入力した情報の確認と修正が行えます。
[Link]「Twitter / Applications」 http://twitter.com/apps

あとは実装です。私の自作クライアントはC#を使用していましたので、「Twitter API Wiki / OAuth Examples」 のリンク先の.NETのさらにリンク先などを参考にしました。それ以外にもすでにいろいろなところでライブラリやサンプルも提供されているようですが、勉強も兼ねてそれらを参考にあえて自分でライブラリ部分もコーディングしました。アプリケーションは公開しませんが、改めて作成して、ライブラリ部分のコードの主要部分をこちらに公開しようかと思います。


Const.cs(定数クラス、IntelliSenseを使いたいだけです()

 

namespace TwitterUtils

{

    /// <summary>

    /// constant

    /// </summary>

    public static class Const

    {

        //URL

        public const string URL_TWITTER = "http://twitter.com/";

        public const string URL_API_TWITTER = "http://api.twitter.com/";

        public const string URL_API_TWITTER_1 = "http://api.twitter.com/1/";

        //API

        public const string API_REQUEST_TOKEN = URL_API_TWITTER + "oauth/request_token";

        public const string API_AUTHORIZE = URL_API_TWITTER + "oauth/authorize";

        public const string API_ACCESS_TOKEN = URL_API_TWITTER + "oauth/access_token";

        public const string API_STATUSES = URL_API_TWITTER_1 + "statuses/";

        //API_METHOD

        public const string API_METHOD_PUBLIC_TIMELINE = "public_timeline";

        public const string API_METHOD_HOME_TIMELINE = "home_timeline";

        public const string API_METHOD_FRIENDS_TIMELINE = "friends_timeline";

        public const string API_METHOD_USER_TIMELINE = "user_timeline ";

        public const string API_METHOD_MENTIONS = "mentions";

        public const string API_METHOD_FRIENDS = "friends";

        public const string API_METHOD_FOLLOWERS = "followers";

        public const string API_METHOD_SHOW = "show";

        public const string API_METHOD_UPDATE = "update";

        public const string API_METHOD_DESTROY = "destroy  ";

        public const string API_METHOD_RETWEET = "retweet";

        public const string API_METHOD_RETWEETS = "retweets";

 

        //FORMAT

        public const string FORMAT_XML = ".xml";

        public const string FORMAT_JSON = ".json";

        public const string FORMAT_ATOM = ".atom";

        public const string FORMAT_RSS = ".rss";

 

        //URL query parameter

        public const string QUERY_OAUTH_CONSUMER_KEY = "oauth_consumer_key";

        public const string QUERY_OAUTH_NONCE = "oauth_nonce";

        public const string QUERY_OAUTH_SIGNATURE_METHOD = "oauth_signature_method";

        public const string QUERY_OAUTH_TOKEN = "oauth_token";

        public const string QUERY_OAUTH_TOKEN_SECRET = "oauth_token_secret";

        public const string QUERY_OAUTH_TIMESTAMP = "oauth_timestamp";

        public const string QUERY_OAUTH_VERSION = "oauth_version";

        public const string QUERY_OAUTH_SIGNATURE = "oauth_signature";

        public const string QUERY_OAUTH_VERIFIER = "oauth_verifier";

 

        public const string QUERY_STATUS = "status";

        public const string QUERY_IN_REPLY_TO_STATUS_ID = "in_reply_to_status_id";

        //constant values

        public const string VALUE_OAUTH_VERSION = "1.0";

        public const string VALUE_HMAC_SHA1 = "HMAC-SHA1";

        public const string HTTPMETHOD_GET = "GET";

        public const string HTTPMETHOD_POST = "POST";

    }

}

 


BasicUtil.cs (名前をBasicUtilという名前にしましたが、Basic認証とは何の関係もありません。単なる文字列操作のメソッドです。)

 

 

namespace TwitterUtils

{

    using System;

    using System.Collections.Generic;

    using System.Text;

    /// <summary>

    /// Util methods

    /// </summary>

    public static class BasicUtil {

        /// <summary>

        /// UrlEncode

        /// </summary>

        /// <param name="src">string</param>

        /// <returns>encoded string</returns>

        public static string UrlEncode(string src)

        {

            string escaped = Uri.EscapeDataString(src);

 

            StringBuilder sb = new StringBuilder(escaped.Length);

            foreach (var c in escaped)

            {

                if (c <= 0x2A && "!&'()*".IndexOf(c) > -1)

                {

                    sb.AppendFormat("%{0:X2}", (int)c);

                }

                else

                {

 

                    sb.Append(c);

                }

            }

            return sb.ToString();

        }

        /// <summary>

        /// IDictionary<string,string> object => Url query string

        /// </summary>

        /// <param name="dic">IDictionary<string,string> object</param>

        /// <returns>Url query string</returns>

        public static string BuildQueryString(IDictionary<string, string> dic)

        {

            StringBuilder sb = new StringBuilder();

            foreach (var item in dic)

            {

                sb.Append(item.Key).Append('=').Append(item.Value);

                sb.Append('&');

            }

            sb.Remove(sb.Length - 1, 1);

            return sb.ToString();

        }

        /// <summary>

        /// Url query string => IDictionary<string,string> object 

        /// </summary>

        /// <param name="queryString">Url query string</param>

        /// <returns>IDictionary<string,string>IDictionary object</returns>

        public static IDictionary<string, string> QueryStringToDictionary(string queryString)

        {

            queryString = queryString.Trim('?');

            var dic = new Dictionary<string, string>();

            if (!string.IsNullOrEmpty(queryString))

            {

                string[] qs = queryString.Split('&');

                foreach (var item in qs)

                {

                    string[] nv = item.Split('=');

                    dic.Add(nv[0], nv[1]);

                }

            }

            return dic;

        }

    }

  

}

 


OAuthUtil.cs (OAuth認証の各手順で使用する値の計算メソッド群です。)

 

 

namespace TwitterUtils

{

    using System;

    using System.Text;

    using System.Security.Cryptography;

    /// <summary>

    /// Utility methods for OAuth

    /// </summary>

    public static class OAuthUtil

    {

        static Random random = new Random(Environment.TickCount);

        /// <summary>

        /// Hash method using HMACSHA1

        /// </summary>

        /// <param name="keyBytes">key</param>

        /// <param name="dataBytes">data</param>

        /// <returns>result</returns>

        public static byte[] ComputeHash(byte[] keyBytes, byte[] dataBytes)

        {

            HMACSHA1 hmacsha1 = new HMACSHA1();

            hmacsha1.Key = keyBytes;

            byte[] resultBytes = hmacsha1.ComputeHash(dataBytes);

            return resultBytes;

        }

        /// <summary>

        /// Hash method using HMACSHA1

        /// </summary>

        /// <param name="keyString">key string</param>

        /// <param name="dataString">data string</param>

        /// <param name="enc">encoding (from string  to byte)</param>

        /// <returns>result string</returns>

        public static string ComputeHash(string keyString, string dataString, Encoding enc)

        {

            byte[] keyBytes = enc.GetBytes(keyString);

            byte[] dataBytes = enc.GetBytes(dataString);

            return Convert.ToBase64String(ComputeHash(keyBytes, dataBytes), Base64FormattingOptions.None);

        }

        /// <summary>

        /// TIME Stamp

        /// </summary>

        /// <returns>TIME Stamp</returns>

        public static string GetTimeStamp()

        {

            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);

            return Convert.ToInt64(ts.TotalSeconds).ToString();

        }

        /// <summary>

        /// random integer between 123400 - 9999999

        /// </summary>

        /// <returns>random integer string</returns>

        public static string GetNonce()

        {

            return random.Next(123400, 9999999).ToString();

        }

 

    }

 

}

 


OAuthURLBuilder.csOAuth認証で使用するURLを組み立てるメソッドがあります。tokentoken_secret等を保持させるのでインスタンス化が可能なクラスにしました。)

 

 

namespace TwitterUtils

{

    using System.Collections.Generic;

    using System.Text;

    /// <summary>

    ///  OAuth URL methods

    /// </summary>

    public class OAuthURLBuilder

    {

        string oauth_consumer_key;

        string oauth_consumer_secret;

        string oauth_token;

        string oauth_token_secret;

        /// <summary>

        /// constractor

        /// </summary>

        /// <param name="oauthConsumerKey">oauthConsumerKey</param>

        /// <param name="oauthConsumerSecret">oauthConsumerSecret</param>

        public OAuthURLBuilder(string oauthConsumerKey, string oauthConsumerSecret)

        {

            oauth_consumer_key = oauthConsumerKey;

            oauth_consumer_secret = oauthConsumerSecret;

            oauth_token = "";

            oauth_token_secret = "";

        }

        /// <summary>

        /// sets OAuth token

        /// </summary>

        /// <param name="token">OAuth token</param>

        /// <returns>OAuthURLBuilder object</returns>

        public OAuthURLBuilder SetOAuthToken(string token)

        {

            oauth_token = token;

            return this;

        }

        /// <summary>

        /// sets OAuth tokenSecret

        /// </summary>

        /// <param name="tokenSecret">OAuth tokenSecret</param>

        /// <returns>OAuthURLBuilder object</returns>

        public OAuthURLBuilder SetOAuthTokenSecret(string tokenSecret)

        {

            oauth_token_secret = tokenSecret;

            return this;

        }

        /// <summary>

        /// Gets Signature

        /// </summary>

        private static string GetSignature(string httpMethod, string url, string queries, string consumerSecret, string tokenSecret)

        {

            string sigData = string.Format("{0}&{1}&{2}", httpMethod, BasicUtil.UrlEncode(url), BasicUtil.UrlEncode(queries));

            string sigKey = string.Format("{0}&{1}", BasicUtil.UrlEncode(consumerSecret), BasicUtil.UrlEncode(tokenSecret));

            return OAuthUtil.ComputeHash(sigKey, sigData, Encoding.UTF8);

        }

        /// <summary>

        /// get twitter API Url with OAuth

        /// </summary>

        /// <param name="httpMethod">Http method (GET/POST)</param>

        /// <param name="originalUrl">Original Url</param>

        /// <param name="queries">url queries</param>

        /// <returns>twitter API Url with OAuth</returns>

        public string GetURL(string httpMethod, string originalUrl, IDictionary<string, string> queries)

        {

            var paramsDic = GetDictionaryWithOAuthParams();

            foreach (var en in queries)

            {

                paramsDic.Add(en.Key, en.Value);

            }

            if (!string.IsNullOrEmpty(oauth_token))

            {

                paramsDic.Add(Const.QUERY_OAUTH_TOKEN, oauth_token);

            }

 

            string queryString = BasicUtil.BuildQueryString(paramsDic);

            string signature = GetSignature(httpMethod, originalUrl, queryString, oauth_consumer_secret, oauth_token_secret);

            paramsDic.Add(Const.QUERY_OAUTH_SIGNATURE, BasicUtil.UrlEncode(signature));

            return string.Format("{0}?{1}", originalUrl, BasicUtil.BuildQueryString(paramsDic));

        }

        /// <summary>

        /// Gets DictionaryWithOAuthParams

        /// </summary>

        private SortedDictionary<string, string> GetDictionaryWithOAuthParams()

        {

            return new SortedDictionary<string, string> {

                                                    { Const.QUERY_OAUTH_CONSUMER_KEY, oauth_consumer_key },

                                                    { Const.QUERY_OAUTH_NONCE, OAuthUtil.GetNonce()},

                                                    { Const.QUERY_OAUTH_SIGNATURE_METHOD, Const.VALUE_HMAC_SHA1 },

                                                    { Const.QUERY_OAUTH_TIMESTAMP, OAuthUtil.GetTimeStamp() },

                                                    { Const.QUERY_OAUTH_VERSION, Const.VALUE_OAUTH_VERSION },

                                                };

        }

        /// <summary>

        /// gets RequestTokenURL

        /// </summary>

        /// <returns>RequestTokenURL</returns>

        public string GetRequestTokenURL()

        {

            return GetURL(

                Const.HTTPMETHOD_GET,

                Const.API_REQUEST_TOKEN,

                new Dictionary<string, string>());

        }

        /// <summary>

        /// gets AccessTokenURL

        /// </summary>

        /// <param name="pin">pin number</param>

        /// <returns>AccessTokenURL</returns>

        public string GetAccessTokenURL(string pin)

        {

            return GetURL(

                Const.HTTPMETHOD_GET,

                Const.API_ACCESS_TOKEN,

                new Dictionary<string, string>() { { Const.QUERY_OAUTH_VERIFIER, pin } });

        }

 

 

        /// <summary>

        /// Gets AuthorizeURL

        /// </summary>

        /// <returns>Authorize page URL</returns>

        public string GetAuthorizeURL()

        {

            var queries = new Dictionary<string, string>() { { Const.QUERY_OAUTH_TOKEN, oauth_token } };

            return string.Format("{0}?{1}", Const.API_AUTHORIZE, BasicUtil.BuildQueryString(queries)); ;

        }

    }

}

 


 

  で、これらを使用するコードMain()の含まれるコードなのですが、長くなりましたのでまた後のエントリにします。

posted @ 23:56 | Feedback (4)

自作TwitterクライアントをOAuth認証に対応させる。

先月7月に久々(1年ぶりくらい)にわんくまブログにエントリしました。3エントリ(3日分)です。これでやめたらまさに3日坊主になってしまいます(笑)。毎月1エントリぐらいはしないとということで、8月になったのでエントリしてみます。

既に山ほどTwitterクライアントはありますが、自分好みの機能がない場合があります。その場合は自分で作成してしまうのもよいプログラミングの練習になって面白いです。Twitter APIの勉強にもなります。私ももちろんTwitやモバツイなどの有名なツイッタークライアントにお世話になっていますが、実は一昨年ごろから自分専用の自作クライアントを作成していました。公開はしていないので好き勝手にいろいろな機能を仕込んだりできます。

以前、in_reply_to_status_idが追加されたころには@をつけなくても、リクエストにin_reply_to_status_idに実際の誰かのつぶやきのstatus_idを仕込めば相手の返信リストに発言を入れることができて驚かせるというようないたずらもできました。今は@もないと相手の返信リストに入らなくなっています。

また、タイムライン取得などAPI制限と呼ばれる1時間当たりの実行回数制限があるAPIがありますが、以前は、POSTでもタイムラインを取得できてAPIが減らさずに済むという裏技もありました。今はGETしかつかえないようです。さらに、タイムラインの取得にcountパラメータを知っていると便利です。公式サイトやcountなしの場合のタイムラインは基本的に20発言しか表示できません。countを使うと以前は800件、現在は200件ぐらい取得できます。これを使って、Javascriptのbookmarkletで「一行Twitterクライアント」「Twitterのユーザ発言を過去にさかのぼるBookmarklet」を日記のネタにしたりしました。

Twitterより4月にセキュリティの弱いBasic認証を終了するという発表がありました。

「Twitterブログ: ベーシック認証について」 http://blog.twitter.jp/2010/04/blog-post_30.html

こうした利点を備えるOAuthの普及が進んだことから、われわれはベーシック認証への対応を2010年6月30日をもって終了する予定です。このためそれ以降は、ベーシック認証を行っていたサービスが利用できなくなる可能性がありますのでご注意ください。

Basic認証は単純な認証方式で、ユーザ名・パスワードが端末のどこかに保存され、通信の度に毎回ネットワークに流されます。たしかにいろいろな不安要素があります。

クライアントが既にこれ以外の認証方式に対応していればいいのですが、Basic認証しか使っていないものは対応しなければならなくなりました。

この期限は6月の発表で延長されました。

「Twitterブログ: Twitter APIデベロッパー・コミュニティへのお知らせ (OAuthへの移行に関しての期限延長)」 http://blog.twitter.jp/2010/06/twitter-api-oauth.html

8月16日から8月31日の間、毎日APIを呼ぶ回数制限(rate limit)を毎日減らします。(1時間あたり10コールの単位で減らします。) 8月31日からはベーシック認証のAPIコールに対しては全てHTTP 403エラーを返します。

9月にはBasic認証のみだとAPIを利用できなくなってしまします。

私も自分の自分しか使用していない自作クライアントをTwitterのOAuth認証に対応させることにしました。
[Link]「OAuth - Wikipedia」 http://ja.wikipedia.org/wiki/OAuth

OAuth認証の手順は以下に仕様があります。(英語)
[Link]「OAuth Core 1.0」 http://oauth.net/core/1.0/#anchor9

実装例は以下にあります。
[Link]「Twitter API Wiki / OAuth Examples」 http://apiwiki.twitter.com/OAuth-Examples

OAuthの認証手順は大まかには「OAuth Core 1.0のページ」 の図に書いてあるとおり以下の流れです。

今回の場合、図のConsumerがTwitterクライアント、Service ProviderがTwitterです。

  1. クライアントがTwitterにRequest Tokenを要求する。
  2. TwitterがクライアントにRequest Tokenを返す。
  3. ユーザにAuthorizeページでクライアントアプリケーションを「許可」してもらう。
  4. Twitterが暗証番号を表示する。
  5. ユーザがクライアントに暗証番号を入力する。
  6. クライアントがTwitterにAccess Tokenを要求する。
  7. TwitterがクライアントにAccess Tokenを返す。
  8. クライアントにAccess TokenとAccess TokenSecretを保存する。
  9. 以降、クライアントはAccess Tokenを含めてAPIの各リクエストをする。

各手順では細かいパラメータがあります。

クライアントがデスクトップアプリケーションの場合、ユーザにTwitterのwebページで許可してもらって、そこで表示される暗証番号(PIN, oauth_verifier)を入力してもらわないといけません。

この部分を不要にしたxAuth認証というものがありますが、

「Twitter API Wiki / Twitter REST API Method: oauth access_token for xAuth」 http://apiwiki.twitter.com/Twitter-REST-API-Method:-oauth-access_token-for-xAuth

In order to get access to this method, you must apply by sending an email to api@twitter.com ? all other applications will receive an HTTP 401 error.

と書かれているとおりapi@twitter.comにメールを送って承認してもらわなければなりません。自分しかユーザがいないクライアントの場合にはこれをするのは気が引けます。承認されないかもしれません。

また、xAuthはユーザにとっても、クライアントにユーザ・パスワードに入力する必要があるので、端末のどこかに保存されるというBasic認証と同様の不安要素が残ってしまいます。

というわけで、結局、OAuth認証に対応させようというわけです。

長くなってしまったので、実装編(?)は別のエントリにします。

posted @ 22:09 | Feedback (3)

2010年7月19日 #

書籍「はじめての Visual Studio 2010」(秀和システム)のご紹介

6月29日に techbank.jp著「TECHNICAL MASTER はじめての Visual Studio 2010 」(秀和システム) という書籍が発売されました。

紀伊國屋書店新宿本店3階、新宿南店5階に平積み確認! はじめてのVisual Studio 2010地元の本屋さん

私も Chapter 11 アプリケーションの配布

  • 11-01 セットアッププロジェクト [配布]
  • 11-02 ClickOnce [配布]
  • 11-03 ASP.NET配置 [配布]

を担当させていただきました。まさに、はじめての執筆体験でした(笑)

「はじめての Visual Studio 2010」では、Visual Stusio 2010の機能に関してまんべんなく触れられているとおもいます。Microsoft Visual Studio 2010 Professional以上のエディションを使用する方を対象としています。一部上位のPremiumやUltimateにしか含まれない機能もあります。

下記の目次の見出しに気になるキーワードがあったらぜひ!!

目次:

  • Chapter 01 Visual Studio 2010のインストール
    • 01-01 インストール手順 [インストール]
  • Chapter 02 Visual Studioの開発環境とIDE
    • 02-01 プロジェクトとテンプレート [IDE]
    • 02-02 インストール済みテンプレートの検索 [IDE]
    • 02-03 開発環境のカスタマイズ [IDE]
    • 02-04 ツールバーのカスタマイズ [IDE]
    • 02-05 マルチモニタ対応 [IDE]
    • 02-06 旧バージョンからの移行 [IDE]
    • 02-07 VS拡張(VSIX)を活用する [拡張機能マネージャー]
  • Chapter 03 ビルドとデバッグ
    • 03-01 ビルド設定 [ビルド]
    • 03-02 デバッグの基本 [デバッグ]
    • 03-03 IntelliTrace機能 [デバッグ]
    • 03-04 ピン設定機能 [デバッグ]
    • 03-05 ブレークポイントのラベル付け [デバッグ]
    • 03-06 ダンプ出力機能 [デバッグ]
    • 03-07 呼び出しの階層化・実行フロー把握 [デバッグ]
    • 03-08 スレッド単位デバッグ機能 [マルチスレッド]
  • Chapter 04 コーディング支援
    • 04-01 豊富なエディター機能 [エディター]
    • 04-02 IntelliSenseとコードスニペット [スニペット]
    • 04-03 リファクタリング [リファクター]
    • 04-04 メンバー逆生成機能 [リファクター]
  • Chapter 05 Visual Studio 2010で作成するアプリケーション
    • 05-01 Windowsフォームアプリケーション(Visual C#、Visual Basic) [実装]
    • 05-02 Webアプリケーション [実装]
    • 05-03 Officeアプリケーション [実装]
    • 05-04 SharePoint対応アプリケーション [実装]
    • 05-05 WCFとWFアプリケーション [実装]
    • 05-06 Visual Studio 2010で強化されたMFCアプリケーション開発 [実装]
  • Chapter 06 テスト機能
    • 06-01 単体テスト機能 [テスト]
    • 06-02 TDDサポート [テスト]
    • 06-03 計画、実行、追跡ツール [テスト]
    • 06-04 テスト自動化機能 [テスト]
    • 06-05 レコーディング機能 [テスト]
  • Chapter 07 アーキテクチャ設計
    • 07-01 UML [設計]
    • 07-02 レイヤー図 [設計]
    • 07-03 アーキテクチャエクスプローラー [設計]
    • 07-04 依存関係グラフ [設計]
  • Chapter 08 データベースとデータアクセス
    • 08-01 SQL Serverデータベースプロジェクト [データベース]
    • 08-02 SQL CLR [データベース]
    • 08-03 ADO.NET [データベース]
    • 08-04 ADO.NET Entity Framework [データベース]
    • 08-05 LINQ to SQL [データベース]
  • Chapter 09 言語拡張と.NET Framework 4対応
    • 09-01 LINQ と拡張メソッド [言語追加機能]
    • 09-02 マルチコア対応と並列プログラミング [言語追加機能]
    • 09-03 Dynamic Language Runtime(DLR) [言語追加機能]
    • 09-04 Managed Extensibility Framework(MEF) [言語追加機能]
    • 09-05 Visual Basic言語拡張 [言語追加機能]
    • 09-06 Visual F#サポート [言語追加機能]
  • Chapter 10 クラウド開発
    • 10-01 Windows Azure(クラウド開発) [Windows Azure]
  • Chapter 11 アプリケーションの配布
    • 11-01 セットアッププロジェクト [配布]
    • 11-02 ClickOnce [配布]
    • 11-03 ASP.NET配置 [配布]

今後、業務でVisual Stusio 2010を使用する予定のある方、職場オフィスの本棚に数冊いかがでしょうか?

よろしければ、Visual Stusio 2010に関心をもつ同僚の方にこちらの書籍をご紹介ください。
#ちなみに、職場の同僚が1冊買ってくれました!私が手に入れる前に(笑)

posted @ 4:01 | Feedback (0)

2010年7月12日 #

超モバイルPC Viliv N5 買いました!

韓国のYukyung Technologies社の4.8"ノートPC Viliv N5を買いました!

BRULEが売っているSSD 64GBのWindows 7 Home Premiumモデルを買いました。

  • CPU: IntelR Atom? processor Z520 (1.33 GHz)
  • メモリー: 1GB DDR2 SDRAM 533Mhz
  • バッテリー: 最大6時間稼動(動作再生最大4時間) 消費電力15W
  • ドライブ: 64GB SSD
  • 本体サイズ: 172(W) x 86(L) x 25(H)mm
  • 本体重量: 388 g

DSCN5002 DSCN5003DSCN5006

これなら本当にポケットに入れて持ち歩けます!メモリーは1GBしかないし、CPUはAtomなのでエクスペリエンスインデックスは1.9しかありませんが、今のところ遅いと思ったことはないです。ここ数日、一日中充電なしで持ち歩いた日もありましたが、バッテリーは実際に6時間はもっていると思います。ただかなり裏面に装着したバッテリーが熱を持ちます。

ポイントデバイスはキーボード右上、クリックボタンはキーボード左上にありますのでニンテンドーDSiのように立ったまま両手もちで操作できます。

先日購入したバッファロー×ドコモのモバイルWi-Fiルーター Portable Wi-Fi DWR-PGと持ち歩いてどこでもインターネットできます!実際にここ数日試しました!快適です。両デバイスとも速度もバッテリーのもちも良好です。

もちろん、Windows 7ですので、Flip 3D([Windowsロゴキー]+[tab])もできますし、Internet Explorer 9 platform previewも動作しますし、テーマパックも設定できます!実際Visual Studio 2010 /*未来はコードで創られていく*/ Windows 7 テーマパックbridge.themepackを設定しています。

DSCN5005 DSCN5007

実際にこれで作業するかわかりませんが、Office2010も入れてみました。今、Visual Studio 2010もネタとしてインストールしているところです(笑)

posted @ 1:04 | Feedback (0)

2010年7月4日 #

モバイルWi-Fiルーター買いました!

ご無沙汰です、このブログに最後にエントリしたのが昨年の五月ということに気づいて、久々にブログ書く練習も兼ねてエントリします。

先週の話ですが、念願の、インターネット(笑)を買いました!

バッファローのポータブルWi-FiルーターDWR-PGです。

6/26にわんくま東京勉強会の最中、少し抜け出して新宿西口ヨドバシカメラで1円で買いました。ドコモ2年縛り、プロバイダはmopera固定ですが実売価格34800円ほどの物が1円で買えてしまうのは得した気分になってしまいます。Wi-Fi端末は6台まで接続できるようです。

100704_01_DWR-PG100704_02_DWR-PG

さっそく、勉強会で少しだけ使用してみました。速度は充分だと思いました。

実は、まだ活用できていません…持っているノートPCは2台ともDELL製15.4ノート重さ2Kg以上なのであまりモバイル向きではありません…それしかないので、いつも、勉強会にはそれを持っていっているのすが…

モバイルPC早く欲しいです…

また、ニンテンドーDSiのブラウザで外でインターネットできることも確認しました。ドラクエ9のWi-Fiショッピングも外でできることを確認しました…DSiでのインターネットは正直ちょっと辛そうです…

新型のiPod Touchや新型のPSPが出たら狙います(笑)いつ出るのでしょうか…iPad も次のモデルが出たら…

…という単なる練習エントリでした…

posted @ 21:53 | Feedback (4)

2009年5月30日 #

XMLが好きになれない。

概念や価値は認めます。

確かにXMLはテキストベースのツリー構造で何でも表現できる素晴らしい仕組みです。異なるコンピュータ間でも、情報を正確にやり取りできます。例えば、CSVと違って、列の順番や意味を別ルートで事前連絡しなくてもタグによって列の意味がそのXML文書だけで分かります。また、事情により送信側で列の順番を入れ替えても、受信側で混乱することはないなど、CSVよりもメリットが多いです。テキストなのにテキスト以上のものを表現できるのも素晴らしいです。冗長性のおかげで、どこか壊れても修復できる可能性が少しあります。また、数多くの標準化がなされているので異なる環境間でも正確に情報伝達ができることもよいことですね。

最近はさまざまな設定ファイルも、XMLになっています。これはどうかと思います。運用する人またはユーザが設定を変えられるアプリケーションの場合、XMLをいじってもらうのたぶん無理なので、別途、設定ツールを用意しなければなりません。XMLに比べれば昔ながらの.iniファイル、または、Javaの.propertiesつまり「設定名=設定値」などの方が、人間にはやさしいので誰でも設定できるのではと思います。というわけで、設定ファイルにXMLを使うのは個人的に好きではありません。

何か理由があって、設定ファイルにXMLを使う流れになってるのかもしれません。私が知らないメリットもあるのかもしれないです。ご存知であればどなたか、設定ファイルをXMLにする上述以外のメリットを教えてください。また、アプリケーションの設定として皆さん何をお使いですか?

あと、XMLを編集するエディタの決定版といったものってありますか。あれば、教えてください。

posted @ 10:58 | Feedback (16)

Excelの使い方・使われ方

いつも、思ってましたが、Excelってすげー!って改めて思いました。

もはや表計算ソフトを超える使われ方をしている。さまざまな使われ方をするExcel。確かにテキストエディタの次に気軽に入力しやすい。Webアプリの入力フォームなんて到底かないません。多分コピペでの貼り付け先ってExcelが一番多いのでは?(推測)

よく「えっ!?そんなことまでExcelでやってるのー!?」とか驚かされることが多いです。Microsoft Officeの他の製品の役割を奪っていたりします。Wordの代わりとして、「~書」がExcelなんてのはざらにあるし、Visioの代わりとして気軽にExcelで図形ドローしたり(絶対座標だから?)、プロジェクトの進捗管理にProjectではなくExcelっていう場合も多い。人間の見た目で「表」を表せるからAccessの代わりにExcel使うこともあるだろうし、コピペの貼り付け先という意味では、OneNoteのお株も奪っていたりする(知名度?)。他のオフィスに表を貼り付ける時もExcelを経由する。VBAっていうとExcelなイメージがある(偏見だろうか?)。企業では、ある意味.NET FrameworkよりもOSの上のプラットフォームとして普及していると言えるかもしれない。「その道のプロ」な人も多いと思う。職人技でExcelを使いこなす。それはそれですばらしい。そういうの見たい。

で、意外な使われ方をしているのを見たとか意外な使い方している、知っている方!コメントください。大いに盛り上がりましょう(←他人のふんどしで盛り上がろうとしている)

posted @ 2:24 | Feedback (7)