SQLの窓 イラストAC フリー素材

2013年10月11日

Windows ストア用の System.Collections.Generic 名前空間には、SortedList はありません。

System.Collections 名前空間

もちろん、通常の Framework には存在します。
SortedList<TKey, TValue> は、SortedDictionary<TKey, TValue> ほどメモリを使用しません。
と、あるので Twitter API の OAuth のデータを作るのに SortedList を使ったりしてたのですが、Windows Store では、SortedDictionary を使わなくてはいけません。 Microsoft の開発環境はいつのまにこんなに面倒な事になってしましたのでしょう。 それに、Windows8.1 サンプルでは、VB.net が無くなったようですし。
posted by at 2013-10-11 09:08 | C# | このブログの読者になる | 更新情報をチェックする

2013年09月16日

情報が全くみつからない Microsoft.Live

日本語は皆無と言っていいでしょうね。本当にやる気あるんだろうか、Microsoft は。SkyDrive に Windows ストアから API 使おうとしても、年額4,900円払わないといけないし。何がしたいか良く解らない。



英文ページしかないダウンロードページから、Live SDK v5.4 をダウンロードしてインストールすると、『C:\Program Files (x86)\Microsoft SDKs\Live\v5.4\.Net\Bin』にインストールされる。

それを使って LiveAuthClient クラスの 『ExchangeAuthCodeAsync』というメソッドを使ってセッションを取得するんだけれど、それに関する日本語ページが Microsoft のここしかない。が、これは何故か ASP.Net のお話になっている。

わけが解らないけれど、とにかく Windows8 + Visual Studio 2012 のフォームアプリで無事アップロードができる。何がなんだか良く解らない状態。

で、結局 GitHub にあるソースコードが最も信頼できる状態。もう、めっちゃくちゃ。

https://github.com/liveservices/LiveSDK-for-Windows
▲ ここにしか無い・・・・

SkyDrive へ移動( VS2012 用テンプレート )

posted by at 2013-09-16 21:16 | C# | このブログの読者になる | 更新情報をチェックする

2013年09月12日

VS2010(C#) バッチ(コンソールアプリ) Twitter 投稿

2013年09月10日 : 1〜4 : C#

前期は、Windows ストアと Windows Phone に特化して入力バリエーションと xaml ベースの Binding によるデータ処理を中心に行いました( データは XML で PHP 経由の DB )が、後期はテクニカルにバリエーションを付加しながら、JSON 中心のデータ処理を行います。但し、Windows ストアと Windows Phone に対してのデータ供給は 簡易 Http サーバを作成して対応したいと思います。

■ Twitter API の自分のアプリのトークンを使って投稿するだけの class VS2012_TwitterTwitter API の自分のアプリのトークンを使って投稿するだけの class VS2010_Twitter

バッチ処理は、DB や テキストファイル等を組み合わせた上で タスクスケジューラに登録すれば、最短で 5分間隔で自動投稿が可能になります。

▼ WebClient で Twitter 投稿 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Diagnostics;
using System.Security.Cryptography;

namespace BatchTweet
{
    class VS2010_Twitter
    {
        private string _consumer_key;
        private string _consumer_secret;
        private string _token;
        private string _secret;

        private string _tweet_api = "https://api.twitter.com/1.1/statuses/update.json";

        public VS2010_Twitter(
            string consumer_key,
            string consumer_secret,
            string token,
            string secret
            )
        {
            _consumer_key = consumer_key;
            _consumer_secret = consumer_secret;
            _token = token;
            _secret = secret;
        }

        public string Tweet(string text)
        {

            WebClient wc = new WebClient();

            // ソートされるリスト
            SortedList<string, string> sl = new SortedList<string, string>();
            sl.Add("oauth_consumer_key", _consumer_key);
            sl.Add("oauth_nonce", Nonce());
            sl.Add("oauth_signature_method", "HMAC-SHA1");
            sl.Add("oauth_timestamp", TimeStamp());
            sl.Add("oauth_token", _token);
            sl.Add("oauth_version", "1.0");
            sl.Add("status", Uri.EscapeDataString(text));

            // http ヘッダ用シグネチャ作成
            string work = "";
            foreach (KeyValuePair<string, string> kvp in sl)
            {
                if (work != "")
                {
                    work += "&";
                }
                work += kvp.Key + "=" + kvp.Value;
            }

            string work2 = "";
            // メソッド
            work2 += "POST" + "&";
            // API URL
            work2 += Uri.EscapeDataString(_tweet_api) + "&";
            // Oauth + データ
            work2 += Uri.EscapeDataString(work);

            // OAuth tool チェック用
            Debug.WriteLine(work2);

            string oauth_signature = Signature(work2);

            // ヘッダ情報を作成
            work = "";
            foreach (KeyValuePair<string, string> kvp in sl)
            {
                // oauth_* のみを使用する
                if (work != "")
                {
                    if (kvp.Key.Substring(0, 6) == "oauth_")
                    {
                        work += ", ";
                    }
                }
                if (kvp.Key.Substring(0, 6) == "oauth_")
                {
                    work += kvp.Key + "=" + Dd(kvp.Value);
                }
            }
            // シグネチャを追加( ヘッダーはソートの必要は無い )
            work += ", oauth_signature=" + Dd(Uri.EscapeDataString(oauth_signature));

            // OAuth tool チェック用
            Debug.WriteLine(work);

            // フォーマットは、 OAuth tool で確認。
            wc.Headers["Authorization"] = "OAuth " + work;
            // POST 用ヘッダ
            wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

            // 投稿
            string result = wc.UploadString(new Uri(_tweet_api), "POST", "status=" + sl["status"]);

            return result;

        }

        // ダブルクォートで挟む
        private string Dd(string base_string)
        {
            return "\"" + base_string + "\"";
        }

        private string Nonce()
        {
            Random rand = new Random();
            int nonce = rand.Next(1000000000);
            return nonce.ToString();
        }

        // タイムスタンプ
        private string TimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

        // シグネチャ
        private string Signature(string target)
        {
            string work = _consumer_secret + "&" + _secret;
            byte[] bin = Encoding.UTF8.GetBytes(target);

            HMACSHA1 hmacsha1 = new HMACSHA1();
            hmacsha1.Key = Encoding.UTF8.GetBytes(work);
            byte[] hash = hmacsha1.ComputeHash(bin);

            return Convert.ToBase64String(hash);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BatchTweet
{
    class Program
    {
        static void Main(string[] args)
        {
            VS2010_Twitter twitter =
                new VS2010_Twitter(
                    "Consumer key",
                    "Consumer secret",
                    "Access token",
                    "Access token secret"
            );

            // 投稿
            string json = twitter.Tweet("バッチ投稿1");

            Console.WriteLine(json);

        }
    }
}




posted by at 2013-09-12 22:57 | C# | このブログの読者になる | 更新情報をチェックする

2013年01月05日

C# の delegate : メソッドの引数にメソッドを渡して使用する方法と、JavaScript の function(){} と同じ使用方法( 匿名 )

要するに関数型の変数の宣言。

private delegate void func(string a);

で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。

メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        private delegate void func(string a);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // 呼び出しタイプ1
            func _ptr = debug_string;
            button_action(_ptr);

            // 呼び出しタイプ2
            button_action(new func(debug_string));

            // 匿名処理1
            button_action((string a) => { Debug.WriteLine(a); });

            // 匿名処理2
            button_action(delegate(string a) { Debug.WriteLine(a); });
           
        }

        private void button_action(func ptr)
        {
            // 変数を使ってメソッドを呼び出す
            // ( 呼び出しタイプ1と2では debug_string が呼び出される )
            // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される )
            ptr("デバッグを呼び出す");
        }

        private void debug_string(string a)
        {
            Debug.WriteLine(a);
        }
    }
}

※ 呼び出しタイプ2/匿名処理1/匿名処理2
方法 : デリゲートを宣言し、インスタンス化して使用する

リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。

さらに、最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。

ラムダ式 (C# プログラミング ガイド)


posted by at 2013-01-05 19:32 | C# | このブログの読者になる | 更新情報をチェックする

2012年12月05日

Windows8(C#) の WebView の LoadComplete で取得した URL 内のアクセストークンを Split で取得

本当は、url_params をループして、key_value[0] が "access_token" の場合で取得するのが正しいですが、手っ取り早くテストするコードです。 
        private async void webView_LoadComplete(object sender, NavigationEventArgs e)
        {

            String token = e.Uri.ToString();

            if (token.IndexOf("access_token=") != -1)
            {

                // 0 番目が 位置情報としてのURL 部分
                String[] url_params = token.Split(new Char[] { '?', '&' });
                String[] key_value = url_params[1].Split(new Char[] { '=' });

                ((TextBox)App.mainPage.FindName("PostBody")).Text = key_value[1];
                
            }

        }

関連する記事

Windows8(C#) で Google にログインしてカレンダーの情報を扱う




posted by at 2012-12-05 13:54 | C# | このブログの読者になる | 更新情報をチェックする

2012年11月06日

Facebook C# SDK の 5.4.1.0 のダウンロード

1) github で facebook-csharp-sdk-master.zip をダウンロード

2) 解凍して Source フォルダのソリューションを開いて( Windows Phone で行いました )ビルド

3) .nuget フォルダに NuGet.exe が作成されるので、コマンドプロンプトから、nuget install Facebook -Version 5.4.1 を実行

4) NuGet.exe のある場所に Facebook.5.4.1.0 が作成されて、その中の lib フォルダの中の sl3-wp が Windows Phone 用です。



もちろん、最新版もビルドされていますが、5.4.1 のコードが動きませんでした・・・




posted by at 2012-11-06 20:07 | C# | このブログの読者になる | 更新情報をチェックする

2012年09月24日

JSON.net の文字列から内容の参照のバターンサンプルがわりと全く無かったので作成

だいぶ前、VB.net で同じような事したんですが、だいぶ変わっていたし、全部見て無いですが、対象によって違うかもしれません。これは Windows Phone の C# です(Windows8 のC# でも動作しました)。

JSON データの整形は、http://winofsql.jp/php/cnvtext/frame.htm から、『JavaScript整形』で可能です。

※ DynamicJson は Windows Phone の環境で使えません。
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Diagnostics;
// PropertyChangedEventHandler
using System.ComponentModel;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace PhoneApp1
{
	public class Class1 : INotifyPropertyChanged
	{
		public Class1(){

			WebClient webClient = new WebClient();

			webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
			// 外部サービスから文字列を取得
			webClient.DownloadStringAsync(new System.Uri("http://textt.net/sworc/20120924055943.txt"));
		}

		// ページ名プロパティ( バインド用 )
		public string pageName { get; set; }

		private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
		{
			if (e.Error != null)
			{
				Deployment.Current.Dispatcher.BeginInvoke(() =>
				{
					Debug.WriteLine(e.Error.Message);
				});
			}
			else
			{
				// オーソドックスなデシリアライズ
				Class2 JsonObject = JsonConvert.DeserializeObject<Class2>(e.Result);

				// 定義済のクラスとして参照( 未定義のプロパティは無視 )
				Debug.WriteLine(JsonObject.id);
				Debug.WriteLine(JsonObject.profile_background_image_url_https);

				// 文字列から JObject を作成
				JObject jo =  JObject.Parse(e.Result);

				// JObject で参照
				Debug.WriteLine(jo["id"]);
				Debug.WriteLine(jo["profile_background_image_url_https"]);

				// JToken で参照
				foreach (JToken jt in jo.Children())
				{
					Debug.WriteLine("-->" + jt.ToString());
					Debug.WriteLine("-->" + jt.First);
					
				}

				// JProperty で参照
				foreach (JProperty jp in jo.Properties())
				{
					Debug.WriteLine( jp.Name + "-->" + jp.Value.ToString());
				}

			}
		}

		public event PropertyChangedEventHandler PropertyChanged;
		public void NotifyPropertyChanged(string propertyName)
		{
			if (PropertyChanged != null)
			{
				PropertyChanged(this,
					new PropertyChangedEventArgs(propertyName));
			}
		}

	}
}


using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace PhoneApp1
{
	public class Class2
	{
		public int id { get; set; }
		public string profile_background_image_url_https { get; set; }
	}
}




posted by at 2012-09-24 21:42 | C# | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します