スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

基本情報技術者試験の過去問で。。。

そーいやうっかり4月の情報処理技術者試験の受験申し込み忘れてたヨ★
ってのに今更ながら気づきました(;´Д`)
2年くらい前までは毎年2回、必ず申し込みしてたってのに、どうもここんとこ怠惰気味orz
秋期こそは忘れずに申し込みたいです(後でGoogleカレンダーに登録しとこう。。。)

アテクシが一番最初に受けた情報処理技術者試験は初級シスアドだったのですが、
当時は今の仕事とは全く無関係な業種に就いていおり、解らない事が多々あったものの、
元々興味のある分野だったので、勉強するのも楽しく一発合格(情報処理技術者の中でも一番簡単だったしネ)
続けて一つ上の基本情報技術者もいってみようか~♪(・ω・)と思い立ったものの、
基本情報の過去問見て「。。。全くわからん(滝汗)」
ってくらい、例えると初級シスアドが草原なら基本情報は氷山くらいな落差が(;´Д`)
(ちなみに旧試験は今よりも遥かに鬼でした。多分今の応用情報をちょっと易しくした位の難易度だと思う)
それでも新試験制度に変わる2年位前には急に難易度下がってきてた気がス。

内容は難しかったものの、試験問題の中には秀逸な問題も多く、
アテクシの場合、PG未経験で今の会社に入社し、「足りない経験は知識でカバー」だったもんで、
今の仕事と全く関係無い内容でも、試験に落ちても、勉強した事が無駄にはならなかったっす。

って事で記憶に残る旧基本情報の過去(難)問を思い出したので、ちょっと思い出しがてらやってみようかなと。
(何時の問題か忘れたので、誰か知ってたら教えてください(;´Д`))
確か7セグメントのデジタル数字に表示する数字を2進数のビット列にして、
そのビット列からどのセグメントを点灯させるかを論理式で表す問題ですた。

例えば、以下のような7セグメントのデジタル数字があるとして、
digital_number1.png

この各セグメントを点灯させる論理式を求めるのですが、
digital_number2.png

aのセグメントを点灯するかどうかを求める論理式は以下のような感じ。
各数値を2進数4桁に変換→各ビットを論理積した後に、点灯する数値のみ全て論理和する。

(WXYZ) + (WX・Y・Z) + (WX・Y・Z) + (W・X・Y・Z) + (W・X・Y・Z) + (W・X・Y・Z) + (W・XYZ) + (W・XY・Z)

で、上記の式にドモルガンとか吸収とか法則使いまくって、結果が多分こうなる(ハズ)

W + Y + (X + Z)・(X + Z)

aセグメントを点灯させるかどうかを判断するには、
表示させたい数値を2進数4桁に変換し、W桁目またはY桁目のビットが1の場合か、
またはX桁目とZ桁目が排他的論理和で0になる時だけ、
aセグメントを点灯させれば良いと(・ω・)

もっと簡単な式にするなら、aセグメントは1と4の時に消灯するので、
1と4が点灯する(=1と4以外が消灯する)場合の反対を求めれば良い。
つまり、

(WXY・Z) + (W・X・YZ)

WY・((X・Z) + (X・Z))
で、反転して

W + Y + (X + Z)・(X + Z)

確かこの問題、午後1の中の1問だった気がする。。。午後の気だるさに加えて、この鬼加減ww
この問題だと4桁のビットを扱うので難解なんですが、2桁だともっと解りやすいんでないかと。
digital_number3.png

これだとaのセグメントを点灯するかどうかを求める論理式は以下のような感じ。

(XY) + (X・Y) + (X・Y)

(XY) + X または Y + (X・Y)

(X + X)・(Y + X) または (Y + X)・(Y + Y)

Y + X

でもってもっと簡単に求めたければ、aセグメントが1の時にだけ消灯するので、
1だけが点灯する(=0と2と3が消灯する)場合の反対を求めれば良い。

X・Y
で、反転して

X + Y

こういう知識って今の仕事でも滅多に使わないし、知らなくても多分支障無いんだけどネ(;´Д`)
でもまぁ知ってるとちょっとだけ世の中の仕組み(の一部)が解ったような気になるのかも?
スポンサーサイト

[.NET Framework] SalesforceのOAuth2.0を使ってChatterに投稿してみる

ども~、お久しぶりの更新でっす(○`ω´○)
最近、会社でGoogle+使いはじめたんですが、ハングアウトとか面白いっす。
もうSkypeとかいらなくね?とまでは言わないっすけど。
今後はブログの更新案内だけTwitterにして、独り言系はGoogle+にしようかと思ってたり。
(誰かアホの子やけど友達になってー(つд∩))

って、関係ない話ですんません(;´Д`)
今回はまたもSalesforceのChatterでOAUTH2.0を使って投稿するサンプルについてです。
またもってのは前にも公開日誌でやってるからですね(・ω・)

[GAE] SalesforceのOAuth2を使ってみる
[Java] Salesforce Chatterに投稿するサンプル

んで今回は、クライアントアプリ&.NET Framework(C#2.0)で行ってみるかな~みたいなノリで。
(しかもRESTじゃなくてSOAPでネ★)

まずDevelopersForceでコンシューマーキーとコンシューマーシークレットを取得します。
取得方法は前回の記事を参照してください。
コールバックURLだけ「oob」とし、他は前回と同じです。

WindowsFormからブラウザを起動し、認証コードを取得します。
※これ以降のソースコードには可読性を重視して例外処理は入っていませんのでご容赦を。

string URL_CALLBACK = "oob";
string CONSUMER_KEY = "Your Consumer Key Here";
string CONSUMER_SECRET = "Your Consumer Secret Here";

// 承認ページを表示
String uriStr = "https://login.salesforce.com/services/oauth2/authorize?response_type=code"
+ "&client_id=" + CONSUMER_KEY
+ "&redirect_uri=" + URL_CALLBACK;
Uri uri = new Uri(uriStr);
Process.Start(uriStr);


続いて、上記で取得した認証コードよりアクセストークンとか、リフレッシュトークン等を取得します。
JSONの解析に、外部ライブラリ「JSON.NET(Newtonsoft.Json.dll)」を使用しています。
確かGETじゃエラーになったのでPOSTにしてます(何でだろ)。

// 送信するデータ
string postStr = "code=[ここに認証コード]";
postStr += "&grant_type=authorization_code";
postStr += "&client_id=" + CONSUMER_KEY;
postStr += "&client_secret=" + CONSUMER_SECRET;
postStr += "&redirect_uri=" + URL_CALLBACK;
byte[] postDataBytes = Encoding.UTF8.GetBytes(postStr);

// リクエストの送信(POST)
Uri uri = new Uri("https://login.salesforce.com/services/oauth2/token");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = postDataBytes.Length;
req.AllowAutoRedirect = false;

System.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
reqStream.Close();

// JSON形式でレスポンス来ます。
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.GetEncoding("UTF-8"));
string jsonStr = sr.ReadToEnd();

// レスポンスからアクセストークンを取得※外部ライブラリにJSON.NETを使用
JObject jObject = JsonConvert.DeserializeObject(jsonStr) as JObject;
string id = jObject["id"] + "";
string issued_at = jObject["issued_at"] + "";
string refresh_token = jObject["refresh_token"] + "";
string instance_url = jObject["instance_url"] + "";
string signature = jObject["signature"] + "";
string access_token = jObject["access_token"] + "";


ちなみに上記で取得したアクセストークンは、1度使用するとすぐさま利用不可になります。
その場合は以下のようにリフレッシュトークンからアクセストークンを再取得する事が可能です。

// 送信するデータ
string postStr = "grant_type=refresh_token";
postStr += "&client_id=" + CONSUMER_KEY;
postStr += "&client_secret=" + CONSUMER_SECRET;
postStr += "&refresh_token=" + refresh_token;
postDataBytes = Encoding.UTF8.GetBytes(postStr);

// リクエストの送信(POST)
Uri uri = new Uri("https://login.salesforce.com/services/oauth2/token");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = postDataBytes.Length;
req.AllowAutoRedirect = false;

System.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
reqStream.Close();

// JSON形式でレスポンス来ます。
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.GetEncoding("UTF-8"));
string jsonStr = sr.ReadToEnd();

// レスポンスからアクセストークンを取得
JObject jObject = JsonConvert.DeserializeObject(jsonStr) as JObject;
string id = jObject["id"] + "";
string issued_at = jObject["issued_at"] + "";
string instance_url = jObject["instance_url"] + "";
string signature = jObject["signature"] + "";
string access_token = jObject["access_token"] + "";


上記のJSONで取得した内容については、こちらに秀逸な記事があるので参照してくれればいんでないかと。
続いて、上記で取得したidとaccess_tokenから、IDサービスの各種情報を取得します。

// リクエストの送信(GET)
string url = id + "?oauth_token=" + access_token + "&format=json";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

// JSON形式でレスポンス来ます。
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.GetEncoding("UTF-8"));
string jsonStr = sr.ReadToEnd();

// レスポンスからIDサービスの各種情報を取得
jObject = JsonConvert.DeserializeObject(jsonStr) as JObject;
string asserted_user = jObject["asserted_user"] + "";
string user_id = jObject["user_id"] + "";
string organization_id = jObject["organization_id"] + "";
string username = jObject["username"] + "";
string nick_name = jObject["nick_name"] + "";
string display_name = jObject["display_name"] + "";
string email = jObject["email"] + "";
string active = jObject["active"] + "";
string user_type = jObject["user_type"] + "";
string locale = jObject["locale"] + "";
string utcOffset = jObject["utcOffset"] + "";
string last_modified_date = jObject["last_modified_date"] + "";

JObject jObjectStatus = JsonConvert.DeserializeObject(jObject["status"].ToString()) as JObject;
string created_date = jObjectStatus["created_date"] + "";
string body = jObjectStatus["body"] + "";

JObject jObjectPhotos = JsonConvert.DeserializeObject(jObject["photos"].ToString()) as JObject;
string picture = jObjectPhotos["picture"] + "";
string thumbnail = jObjectPhotos["thumbnail"] + "";

JObject jObjectUrls = JsonConvert.DeserializeObject(jObject["urls"].ToString()) as JObject;
string enterprise = jObjectUrls["enterprise"] + "";
string metadata = jObjectUrls["metadata"] + "";
string partner = jObjectUrls["partner"] + "";
string rest = jObjectUrls["rest"] + "";
string sobjects = jObjectUrls["sobjects"] + "";
string search = jObjectUrls["search"] + "";
string query = jObjectUrls["query"] + "";
string recent = jObjectUrls["recent"] + "";
string profile = jObjectUrls["profile"] + "";
string feeds = jObjectUrls["feeds"] + "";
string groups = jObjectUrls["groups"] + "";
string users = jObjectUrls["users"] + "";
string feed_items = jObjectUrls["feed_items"] + "";


。。。ここまで来るのが長い長い(;´Д`)
ここまで来たら、もうChatterに投稿するのは目の前です。

string xml = "\r\n";
xml += "\r\n";
xml += " \r\n";
xml += " \r\n";
xml += " " + access_token + "\r\n";
xml += "
\r\n";
xml += "
\r\n";
xml += " \r\n";
xml += " \r\n";
xml += " \r\n";
xml += " " + user_id + "\r\n";
xml += " メッセージ\r\n";
xml += "
\r\n";
xml += "
\r\n";
xml += "
\r\n";
xml += "
";
postDataBytes = Encoding.UTF8.GetBytes(xml);

// リクエストの送信(POST)
Uri uri = new Uri(enterprise.Replace("{version}", "20.0"));
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "text/xml; charset=utf-8";
req.Headers.Set("SOAPAction", "\"\"");
req.ContentLength = postDataBytes.Length;
req.AllowAutoRedirect = false;

System.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
reqStream.Close();

// XML形式でレスポンス来ます。
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, Encoding.GetEncoding("UTF-8"));
Console.WriteLine(sr.ReadToEnd());

// 接続を閉じる
sr.Close();
resStream.Close();


上記のコードではリクエストのURLにIDサービス情報内のurls.enterpriseを使用しています。
が、人によってはurls.partnerになるんでないかと(・ω・)
上記XMLの<soapenv:Body>~</soapenv:Body>の内容を変更する事により、
他にも取引先の追加やグループへの投稿ができたりします。

■取引先の追加の例




0000000
新宿区
日本
000-0000
東京
西新宿
取引先その1
03-1111-2222
https://www.example.com





■共有の新規投稿




" + user_id + "
★★★メッセージ★★★





■グループの新規投稿




★★★ここにグループID★★★
TextPost
★★★メッセージ★★★





ちなみにグループIDは、ChatterでグループのURLを表示して、そのURL内の
https://na0.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=[ここがグループID]
でっす。

ナドナド、出来る内容についてはWeb Services API Developer's Guideを参照してください。(英語だが/汗)
つか読むのに苦労したっすお。。。(;´Д`)日本語の情報少なすぎ!



【2012/02/07 追記】
サーセン。。。上記のJSON.NETですが、.NET2.0じゃ使えないバージョンのでしたorz
使えるバージョンはJSON.NET1.3.1かそれ以前のバージョンのようです。
(今日、会社で社内アプリに組み込もうとして気づきました(つд∩))

使い方も先述のソースコードとは異なります。
ここで書くとまた長くなるので、サンプル置いとくからコッチ見てちょーん(・ω・)

サンプルソースコード(VisualStudio C# 2.0)
chatteroauth.png

Pagination

Utility

プロフィール

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。