2012年8月5日日曜日

Operaユーザースクリプトを有効にする

URLに「opera:config#UserPrefs|UserJavaScript」と入力し、「User JavaScript」「User JavaScript on HTTPS」をチェックし、「User JavaScript File」にJSファイルを保存しているフォルダを指定する。
設定後はブラウザの再起動が必要。

20120805_202500_001

2012年7月29日日曜日

FirefoxでYahooのトップページを表示すると重い

FirefoxとFlashプレーヤの相性が悪いことが原因らしい
Flashプレーヤの設定ファイルmms.cfgを編集してオプションを追加すると、スムーズに表示できるようになる

mms.cfgの場所
32bit版 Vista/7の場合
C:\windows\system32\macromed\flash
64bit版 Vista/7の場合
C:\windows\syswow64\macromed\flash

追加するオプション
ProtectedMode=0

参照サイト
FirefoxでFlash、Youtubeが再生出来ない問題2012年6月

2012年6月18日月曜日

[c#]Twitterクライアントを作成するためのリンク集

以下のサイトを参考にすると、作成できるかも。昔はBASIC認証でもアクセスできていたみたいだけ、OAuth認証というものを使わなければアクセスできなくなったらしい。結構難しそう・・・。

C#でOAuthでTwitter - nojimaの日記

Twitterを活用したプログラムをC#で作成しよう

Twitterに自分で作成したアプリケーションを登録する (2012年3月版)

twitterizer(http://code.google.com/p/twitterizer/)

Twitterizer(http://www.twitterizer.net/)

30分で誰でも作れるTwitter Bot開発・運用手順 – Ruby Twitter bot

リンク先の①、②を組み合わせて1分おきに、タイムラインをコンソール出力するプログラムを作ってみました。
初回起動時に保存される設定ファイルは「C:\Users\<ユーザーID>\AppData\Local\ConsoleTwitter」に保存されるようです。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Xml;
  7. using System.IO;
  8. using System.Security.Cryptography;
  9.  
  10. namespace ConsoleTwitter
  11. {
  12. class Auth {
  13. const string REQUEST_TOKEN_URL = "https://twitter.com/oauth/request_token";
  14. const string ACCESS_TOKEN_URL = "https://twitter.com/oauth/access_token";
  15. const string AUTHORIZE_URL = "https://twitter.com/oauth/authorize";
  16.  
  17. private Random random = new Random();
  18.  
  19. public string ConsumerKey { get; private set; }
  20. public string ConsumerSecret { get; private set; }
  21. public string RequestToken { get; private set; }
  22. public string RequestTokenSecret { get; private set; }
  23. public string AccessToken { get; private set; }
  24. public string AccessTokenSecret { get; private set; }
  25. public string UserId { get; private set; }
  26. public string ScreenName { get; private set; }
  27.  
  28. public Auth(string consumerKey, string consumerSecret) {
  29. ServicePointManager.Expect100Continue = false;
  30. ConsumerKey = consumerKey;
  31. ConsumerSecret = consumerSecret;
  32. }
  33.  
  34. public Auth(string consumerKey, string consumerSecret, string accessToken, string accessTokenSecret, string userId, string screenName) {
  35. ServicePointManager.Expect100Continue = false;
  36. ConsumerKey = consumerKey;
  37. ConsumerSecret = consumerSecret;
  38. AccessToken = accessToken;
  39. AccessTokenSecret = accessTokenSecret;
  40. UserId = userId;
  41. ScreenName = screenName;
  42. }
  43.  
  44. public void GetRequestToken() {
  45. SortedDictionary parameters = GenerateParameters("");
  46. string signature = GenerateSignature("", "GET", REQUEST_TOKEN_URL, parameters);
  47. parameters.Add("oauth_signature", UrlEncode(signature));
  48. string response = HttpGet(REQUEST_TOKEN_URL, parameters);
  49. Dictionary dic = ParseResponse(response);
  50. RequestToken = dic["oauth_token"];
  51. RequestTokenSecret = dic["oauth_token_secret"];
  52. }
  53. public string GetAuthorizeUrl() {
  54. return AUTHORIZE_URL + "?oauth_token=" + RequestToken;
  55. }
  56. public void GetAccessToken(string pin) {
  57. SortedDictionary parameters = GenerateParameters(RequestToken);
  58. parameters.Add("oauth_verifier", pin);
  59. string signature = GenerateSignature(RequestTokenSecret, "GET", ACCESS_TOKEN_URL, parameters);
  60. parameters.Add("oauth_signature", UrlEncode(signature));
  61. string response = HttpGet(ACCESS_TOKEN_URL, parameters);
  62. Dictionary dic = ParseResponse(response);
  63. AccessToken = dic["oauth_token"];
  64. AccessTokenSecret = dic["oauth_token_secret"];
  65. UserId = dic["user_id"];
  66. ScreenName = dic["screen_name"];
  67. }
  68. public string Get(string url, IDictionary parameters) {
  69. SortedDictionary parameters2 = GenerateParameters(AccessToken);
  70. foreach (var p in parameters)
  71. parameters2.Add(p.Key, p.Value);
  72. string signature = GenerateSignature(AccessTokenSecret, "GET", url, parameters2);
  73. parameters2.Add("oauth_signature", UrlEncode(signature));
  74. return HttpGet(url, parameters2);
  75. }
  76. public string Post(string url, IDictionary parameters) {
  77. SortedDictionary parameters2 = GenerateParameters(AccessToken);
  78. foreach (var p in parameters)
  79. parameters2.Add(p.Key, p.Value);
  80. string signature = GenerateSignature(AccessTokenSecret, "POST", url, parameters2);
  81. parameters2.Add("oauth_signature", UrlEncode(signature));
  82. return HttpPost(url, parameters2);
  83. }
  84. private string HttpGet(string url, IDictionary parameters) {
  85. WebRequest req = WebRequest.Create(url + '?' + JoinParameters(parameters));
  86. WebResponse res = req.GetResponse();
  87. Stream stream = res.GetResponseStream();
  88. StreamReader reader = new StreamReader(stream);
  89. string result = reader.ReadToEnd();
  90. reader.Close();
  91. stream.Close();
  92. return result;
  93. }
  94. string HttpPost(string url, IDictionary parameters) {
  95. byte[] data = Encoding.ASCII.GetBytes(JoinParameters(parameters));
  96. WebRequest req = WebRequest.Create(url);
  97. req.Method = "POST";
  98. req.ContentType = "application/x-www-form-urlencoded";
  99. req.ContentLength = data.Length;
  100. Stream reqStream = req.GetRequestStream();
  101. reqStream.Write(data, 0, data.Length);
  102. reqStream.Close();
  103. WebResponse res = req.GetResponse();
  104. Stream resStream = res.GetResponseStream();
  105. StreamReader reader = new StreamReader(resStream, Encoding.UTF8);
  106. string result = reader.ReadToEnd();
  107. reader.Close();
  108. resStream.Close();
  109. return result;
  110. }
  111. private Dictionary ParseResponse(string response) {
  112. Dictionary result = new Dictionary();
  113. foreach (string s in response.Split('&')) {
  114. int index = s.IndexOf('=');
  115. if (index == -1)
  116. result.Add(s, "");
  117. else
  118. result.Add(s.Substring(0, index), s.Substring(index + 1));
  119. }
  120. return result;
  121. }
  122. private string JoinParameters(IDictionary parameters) {
  123. StringBuilder result = new StringBuilder();
  124. bool first = true;
  125. foreach (var parameter in parameters) {
  126. if (first)
  127. first = false;
  128. else
  129. result.Append('&');
  130. result.Append(parameter.Key);
  131. result.Append('=');
  132. result.Append(parameter.Value);
  133. }
  134. return result.ToString();
  135. }
  136. private string GenerateSignature(string tokenSecret, string httpMethod, string url, SortedDictionary parameters) {
  137. string signatureBase = GenerateSignatureBase(httpMethod, url, parameters);
  138. HMACSHA1 hmacsha1 = new HMACSHA1();
  139. hmacsha1.Key = Encoding.ASCII.GetBytes(UrlEncode(ConsumerSecret) + '&' + UrlEncode(tokenSecret));
  140. byte[] data = System.Text.Encoding.ASCII.GetBytes(signatureBase);
  141. byte[] hash = hmacsha1.ComputeHash(data);
  142. return Convert.ToBase64String(hash);
  143. }
  144. private string GenerateSignatureBase(string httpMethod, string url, SortedDictionary parameters) {
  145. StringBuilder result = new StringBuilder();
  146. result.Append(httpMethod);
  147. result.Append('&');
  148. result.Append(UrlEncode(url));
  149. result.Append('&');
  150. result.Append(UrlEncode(JoinParameters(parameters)));
  151. return result.ToString();
  152. }
  153. private SortedDictionary GenerateParameters(string token) {
  154. SortedDictionary result = new SortedDictionary();
  155. result.Add("oauth_consumer_key", ConsumerKey);
  156. result.Add("oauth_signature_method", "HMAC-SHA1");
  157. result.Add("oauth_timestamp", GenerateTimestamp());
  158. result.Add("oauth_nonce", GenerateNonce());
  159. result.Add("oauth_version", "1.0");
  160. if (!string.IsNullOrEmpty(token))
  161. result.Add("oauth_token", token);
  162. return result;
  163. }
  164. public string UrlEncode(string value) {
  165. string unreserved = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
  166. StringBuilder result = new StringBuilder();
  167. byte[] data = Encoding.UTF8.GetBytes(value);
  168. foreach (byte b in data) {
  169. if (b < 0x80 && unreserved.IndexOf((char)b) != -1)
  170. result.Append((char)b);
  171. else
  172. result.Append('%' + String.Format("{0:X2}", (int)b));
  173. }
  174. return result.ToString();
  175. }
  176. private string GenerateNonce() {
  177. string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  178. StringBuilder result = new StringBuilder(8);
  179. for (int i = 0; i < 8; ++i)
  180. result.Append(letters[random.Next(letters.Length)]);
  181. return result.ToString();
  182. }
  183. private string GenerateTimestamp() {
  184. TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
  185. return Convert.ToInt64(ts.TotalSeconds).ToString();
  186. }
  187. }
  188. class TweetEntity
  189. {
  190. public string UserName = "";
  191. public string Tweet = "";
  192. public string PostedTime = "";
  193. public override string ToString()
  194. {
  195. return UserName + "\r\n" + Tweet + "\r\n" + PostedTime + "\r\n";
  196. }
  197. }
  198. class Program
  199. {
  200. const string CONSUMER_KEY = "hogehogehogehogehoge";
  201. const string CONSUMER_SECRET = "fugafugafugafugafugafugafugafuga";
  202. static readonly string LOG_FILE = AppDomain.CurrentDomain.BaseDirectory.Substring(0,
  203. AppDomain.CurrentDomain.BaseDirectory.LastIndexOf("bin")) + "bin\\ConsoleTwitter.log";
  204. static void Main(string[] args)
  205. {
  206. int timespan = 60000;
  207. List prevTweetList = new List();
  208. List currTweetList = new List();
  209. for (; ; )
  210. {
  211. try
  212. {
  213. currTweetList = GetTweet();
  214. DisplayTweet(prevTweetList, currTweetList);
  215. prevTweetList = currTweetList;
  216. }
  217. catch (Exception ex)
  218. {
  219. Console.WriteLine(ex.Message);
  220. Console.WriteLine(ex.StackTrace);
  221. }
  222. System.Threading.Thread.Sleep(timespan);
  223. }
  224. }
  225. private static List GetTweet()
  226. {
  227. List tweetList = new List();
  228. Auth auth = GetAuth();
  229. // タイムラインから50件取得してみる
  230. Dictionary parameters = new Dictionary();
  231. parameters.Add("count", "50");
  232. string pagedata = auth.Get("http://twitter.com/statuses/home_timeline.xml", parameters);
  233. //Debug(pagedata);
  234. string tag = "status";
  235. XmlDocument xdoc = new XmlDocument();
  236. xdoc.LoadXml(pagedata);
  237. XmlElement root = xdoc.DocumentElement;
  238. XmlNodeList mylist = root.GetElementsByTagName(tag);
  239. for (int i = 0; i < mylist.Count; i++)
  240. {
  241. TweetEntity tweet = new TweetEntity();
  242. tweet.UserName = mylist[i].ChildNodes[11].ChildNodes[1].InnerText; // User name
  243. tweet.Tweet = mylist[i].ChildNodes[2].InnerText; // Tweet
  244. tweet.PostedTime = mylist[i].ChildNodes[0].InnerText; // posted time
  245. tweetList.Add(tweet);
  246. }
  247. return tweetList;
  248. }
  249. private static void DisplayTweet(List prevTweetList, List currTweetList)
  250. {
  251. StreamWriter wr = new StreamWriter(LOG_FILE, true, Encoding.GetEncoding("Shift_JIS"));
  252. foreach (TweetEntity currTweet in currTweetList)
  253. {
  254. bool isNew = true;
  255. foreach (TweetEntity prevTweet in prevTweetList)
  256. {
  257. if (prevTweet.ToString() == currTweet.ToString())
  258. {
  259. isNew = false;
  260. break;
  261. }
  262. }
  263. if (isNew)
  264. {
  265. Console.WriteLine(currTweet.ToString());
  266. wr.WriteLine(currTweet.ToString());
  267. }
  268. }
  269. wr.Close();
  270. }
  271. private static Auth GetAuth()
  272. {
  273. Auth auth;
  274. var settings = ConsoleTwitter.Properties.Settings.Default;
  275. if (string.IsNullOrEmpty((string)settings["AccessToken"]))
  276. {
  277. auth = new Auth(CONSUMER_KEY, CONSUMER_SECRET);
  278. // リクエストトークンを取得する
  279. auth.GetRequestToken();
  280. // ユーザーにRequestTokenを認証してもらう
  281. Console.WriteLine("次のURLにアクセスして暗証番号を取得してください:");
  282. Console.WriteLine(auth.GetAuthorizeUrl());
  283. Console.Write("暗証番号:");
  284. string pin = Console.ReadLine().Trim();
  285. // アクセストークンを取得する
  286. auth.GetAccessToken(pin);
  287. // 結果を表示する
  288. Console.WriteLine("AccessToken: " + auth.AccessToken);
  289. Console.WriteLine("AccessTokenSecret: " + auth.AccessTokenSecret);
  290. Console.WriteLine("UserId: " + auth.UserId);
  291. Console.WriteLine("ScreenName: " + auth.ScreenName);
  292. // アクセストークンを設定ファイルに保存する
  293. settings["AccessToken"] = auth.AccessToken;
  294. settings["AccessTokenSecret"] = auth.AccessTokenSecret;
  295. settings["UserId"] = auth.UserId;
  296. settings["ScreenName"] = auth.ScreenName;
  297. settings.Save();
  298. }
  299. else
  300. {
  301. // 設定ファイルから読み込む
  302. auth = new Auth(CONSUMER_KEY, CONSUMER_SECRET,
  303. (string)settings["AccessToken"], (string)settings["AccessTokenSecret"],
  304. (string)settings["UserId"], (string)settings["ScreenName"]);
  305. }
  306. return auth;
  307. }
  308. private static void Debug(string s)
  309. {
  310. StreamWriter wr = new StreamWriter(LOG_FILE + ".DEBUG.txt", true, Encoding.GetEncoding("Shift_JIS"));
  311. wr.WriteLine(s);
  312. wr.Close();
  313. }
  314. }
  315. }

2012年5月30日水曜日

Windows Live Writerを使ってみる

ブログを書くのに神的によいそうなので、使ってみる。
すべてのプログラム-Windows Live-Windows Writerを選択する。
使用許諾はOKする。
Windows Live Writerの構成では「次へ」を選択する。
20120530 Windows Live Writer 1
20120530 Windows Live Writer 1 posted by (C)てる

ブログサービスの選択では「他のサービス」を選択する。
20120530 Windows Live Writer 2
20120530 Windows Live Writer 2 posted by (C)てる

ブログアカウントの追加で、ブログ情報を入力する。
20120530 Windows Live Writer 3
20120530 Windows Live Writer 3 posted by (C)てる

ここがすごいところなのだが、上記で「次へ」とした後に、ブログに接続して、情報を取得してきてくれる。ブログの選択はそのまま「次へ」。
20120530 Windows Live Writer 4
20120530 Windows Live Writer 4 posted by (C)てる

ここも「次へ」でよい。
20120530 Windows Live Writer 5
20120530 Windows Live Writer 5 posted by (C)てる

以下がブログ作成画面で、タイトルと本文を少し入力したところ。
20120530 Windows Live Writer 6
20120530 Windows Live Writer 6 posted by (C)てる

機能的には、

  • 複数のブログに対応している
  • エディタ上での編集、プレビュー(テンプレートも含んでのプレビュー)、HTMLの直接編集が可能
  • エディタ上での編集は、フォントスタイル、段落、リンク等の挿入、表の挿入などができる
  • 新規の投稿、投稿されたものの修正、削除などができる
など、なかなかよさそうである。

2012年4月3日火曜日

RLO対策

以下のサイトに従って、「secpol.msc」を実行して、ソフトウェア制限のポリシーを設定する。
ファイル名は「左から右に読む」とは限らない?! - @IT
なお、設定後は、「gpupdate.exe」を実行して更新を反映後に、再ログインをする必要がある。

2012年3月22日木曜日

Excelのクリップボードがおかしくなる


Firefoxアドオンの「Skype Click to Call 5.10.0.9560」を有効にしていると、
Excelでコピー時にテキスト情報のみしかコピーされないようになる。
(書式情報がコピーされなくなる)

「Skype Click to Call 5.10.0.9560」を無効にすることで、この現象が解決できる。

組み合わせは Windows 7 + Office 2010 + FireFox 11 で発生した。

※Internet Explorer 、 Google Chrome 用の「Skype Click to Call」アドオンでも同様の現象が発生した。

2012年2月10日金曜日

PrimoPDFのファイル名の文字化けを解消

1.以下からPriMoreV4.vbeをダウンロードする。

厳選! PDFフリーソフト PrimoPDFのファイル名の文字化けを解消する
http://pdffreesoft.gjpw.net/Entry/72/

2.PriMoreV4.vbeを「C:\Program Files\Utility\PdfTools\activePDF\PrimoPDF」にコピーする。

3.ポートの構成を変更する。

Redirect this port to the program:
  C:\Program Files\Utility\PdfTools\activePDF\PrimoPDF\primorun.exe
Arguments for this program are:
  C:\Program Files\Utility\PdfTools\activePDF\PrimoPDF\primopdf.exe
    ここを↓に変更する
  Cscript.exe "C:\Program Files\Utility\PdfTools\activePDF\PrimoPDF\PriMoreV4.vbe"
Output:
  Program handles output
Printer:
  なし
Run:
  Hidden
Run as User
  チェック