<   2014年 06月 ( 19 )   > この月の画像一覧
.NETでTwitterを検索する
目的
.NETを用いてTwitterの検索を行う。

環境
Windows7
VisualStudio Express 2013 for Windows DeskTop

LINQ to Twitter
LINQ to TwitterはLINQを用いてTwitterの操作を行える。
http://linqtotwitter.codeplex.com/

このライブラリSystem.Net.Http.Primitivesに依存しているので、以下のようにインストールすること。

1. プロジェクトの参照設定でNuGetパッケージの管理を選択する
b0232065_00401670.png
2.Microsoft HTTP Client Libraryをインストールする
b0232065_00405023.png
AccessTokenとAccessTokenSecretの取得方法
クライアントアプリケーションでAccessTokenとAccessTokenSecretを取得するには次のように認証用のURLを開いて、PINコードを取得して、それを使用して認証を行う。

C#でOAuthでTwitter 
http://d.hatena.ne.jp/nojima718/20100129/1264792636

なお、CONSUMERKEY,CONSUMERSECRETはTwitterDeveloperでアプリケーションを追加してキーを発行する。
https://dev.twitter.com/

LINQ to Twitterでツイートを検索する

var singleAuth = new SingleUserAuthorizer
{
CredentialStore = new SingleUserInMemoryCredentialStore
{
ConsumerKey = this.auth.ConsumerKey,
ConsumerSecret = this.auth.ConsumerSecret ,
AccessToken = this.auth.AccessToken ,
AccessTokenSecret = this.auth.AccessTokenSecret
}
};
var str = "";

var twitterCtx = new TwitterContext(singleAuth);
var searchResponse =
await
(from search in twitterCtx.Search
where search.Type == SearchType.Search &&
search.Query == txtSearch.Text &&
search.Count == 100
select search)
.SingleOrDefaultAsync();

if (searchResponse != null && searchResponse.Statuses != null)
searchResponse.Statuses.ForEach(tweet =>
str += String.Format("CreatedAt: {0}, User: {1}, Tweet: {2}\r\n",
tweet.CreatedAt,
tweet.User.ScreenNameResponse,
tweet.Text));

txtLog.Text = str;


[PR]
by mima_ita | 2014-06-29 00:49 | .NET
Redmineのプラグインでログを残したい場合
Redmineのプラグインのデバッグでログを残したい場合は次のようにすればよい。

Rails.logger.info "executing command: #{out['command']}"

下記のファイルにログが出力される。
/var/lib/redmine/log/production.log

[PR]
by mima_ita | 2014-06-28 03:29 | ruby
IO.popenのwriteのエンコードが正常に動作しない場合
次のようなコードがあったとする。

# coding: utf-8
msg = "Alice->Bob: あiいいあああ\n"
c = nil
IO.popen
('/usr/bin/plantuml -pipe', 'r+b'){|f|
f.puts '@startuml'
f.write msg
f.write '@enduml'
f.close_write
c = f.read
}

この際、UTF-8の文字をいくらwriteしても正常にわたらない場合がある。
この場合、Encoding.find("locale")の値を確認してみる。

もし、UTF-8になっていなければ、いくらinternal_encodingやexternal_encodingをいじっても正常に動作しない。


[PR]
by mima_ita | 2014-06-28 03:25 | ruby
RedmineのWikiでUMLを記述する方法
目的
RedmineのWikiにシーケンス図やユースケースなどのUMLを記述する。

前提:
JAVAが動くこと
Redmineが動作すること
Apache2でRedmineが動いていたものとする

手順:

1. PlantUMLを下記よりダウンロードして任意のフォルダにおく
http://plantuml.sourceforge.net/download.html

 この例では下記にあるとする.
 /share/plantuml.jar

2. ラッパー用のシェルスクリプトを記述する。
 この例では/usr/bin/plantuml に記述するものとする。


#!/bin/bash
/usr/bin/java -Djava.io.tmpdir=/var/tmp -jar /share/plantuml.jar ${@}



3. Redmine用のプラグインを下記からダウンロードする
https://github.com/cdwertmann/wiki_external_filter

4. 3のファイルをRedmineのプラグインにコピーする。
この際,フォルダ名はwiki_external_filterとする。
デフォルトはwiki_external_filter_masterになっており、名前が違うと正常に動作しない

例:/var/lib/redmine/plugins/wiki_external_filter

5. 下記に書き込み権限を与える。
 /var/lib/redmine/public/plugin_assets/

例:
chmod go+w /var/lib/redmine/public/plugin_assets/

6. 解凍したディレクトリに存在するconfig/wiki_external_filter.yml を redmineのconfigにコピーする。
 例:
  /var/lib/redmine/config
 
7. wiki_external_filter.ymlのplantumlにおけるパスを適切に指定する。
 ※この例だと修正不要のはず

8. apache2の起動時のlocaleをutf-8とする。
 これを怠ると、日本語が適切に表示されなくなる。
 /etc/apache2/envvars の下記を修正
 export LANG=ja_JP.UTF-8
 
 なお、下記の戻り値がUTF-8ならば日本語が使えるようになる。
 Encoding.find("locale")

9. apache2を再起動

10.redmineの管理メニューより、キャッシュの保持時間を指定する。
  デフォルトは0であるが、この場合は、キャッシュを保持せず画像が絶対に表示されない。

  管理>プラグイン>Wiki External Filter Plugin の設定

  「Cache expiration time 」に十分大きな数値を入力
b0232065_03141636.png


11. 下記のような文章をWikiに記述する

{{plantuml
ジョニー-> ジャック: 求愛
ジャック-> サラ: 求愛
サラ->ジョニー: 求愛

}}

b0232065_03143326.png


[PR]
by mima_ita | 2014-06-28 03:16 | memo
javascriptやnode.jsにおけるプロパティの存在チェック
オブジェクトobjでプロパティxの存在をチェックする方法

// 駄目な例:
if (obj.x) {
// プロパティがある場合
}

もし、obj.xがnull,0,undefined,""の場合、プロパティがないと見なされる。


正しく判断する例1
if (x in obj) {
// プロパティがある場合
}

正しく判断する例2
if (obj.hasOwnProperty('x')) {
// プロパティがある場合
}


[PR]
by mima_ita | 2014-06-27 00:20 | node.js
インストールできない環境でmsiを展開してみる
環境によっては、管理者権限が与えられずにソフトウェアのインストールがままならないことがあります。

                       ヘ(^o^)ヘ いいぜ
                         |∧  
                     /  /
                 (^o^)/ てめぇが何でも
                /(  )   ソフトウェアの使用を制限できる
       (^o^) 三  / / >    ってなら
 \     (\\ 三
 (/o^)  < \ 三 
 ( /
 / く  まずはそのふざけた
       幻想をぶち殺す

実は、msiのファイルに関してはインストールを行わずにファイルを展開することができます。

start /wait msiexec /a node-v0.10.28-x64.msi targetdir="c:\test"

このようにmsiのファイル名と展開先のディレクトリを指定すると、targetdirで指定したディレクトリにファイルを展開した内容を解凍します。

運が良ければ、これで動作します。

もっとも、そもそもの実行に管理者権限がいるものは、なにやっても無駄なのであきらめましょう。

[PR]
by mima_ita | 2014-06-19 19:44 | memo
windowsでpatchコマンドを使えるようにする。
GNU diffutils 2.7.2 (Win32 版)とGNU patch 2.5.4 (Win32 版)を入手
http://cetus.sakura.ne.jp/softlab/toolbox1/index.html#difpat

Vista以降ではpatch.exeにmanifestを追加して、管理者権限以外でも動作するようにする。
Windows patch.exeが管理者権限を要求してしまう
http://sceneryandfish.withnotes.net/?p=1632

VS2008でmanifestを適用した例。
http://needtec.sakura.ne.jp/release/patc254w.zip

[PR]
by mima_ita | 2014-06-19 01:01 | memo
jasmine-nodeのXML出力で日本語のファイル名にならない場合
jasmine-nodeは--junitreportを使用することでXML形式としてテスト結果を出力できる。
しかし、jasmien-nodeが使用しているjasmine-reportersの不具合で日本語が正常に動作しない。

以下のようなファイルが存在するとする。

describe("test\\足し算の確認", function() {
beforeEach(function() {
// テスト前処理
});

afterEach(function() {
// テスト後処理
});

it("足し算が正しい", function() {
expect(addition(1, 2)).toEqual(3);
});
});


この場合、期待の出力結果としては、記号が除去されたファイル名「TEST-test足し算の確認.xml」が作成されることが期待される。
しかし、げんじょうは「TEST-test.xml」となる。

これを修正するパッチは以下のとおりである。

jasmine-nodeのバージョン:1.14.3
修正パッチ:
http://needtec.sakura.ne.jp/release/jasmine.junit_reporter.js.patch

パッチ適用のコマンド例:
patch -u ../node_modules/jasmine-node/node_modules/jasmine-reporters/src/jasmine.junit_reporter.js < jasmine.junit_reporter.js.patch


[PR]
by mima_ita | 2014-06-19 00:21 | node.js
JSONファイルにコメントをつけたい場合どうするか?
概要
JSONファイルにコメントをつけたい場合どうするか?

対処案1
データにコメントを混ぜる


{
"id":1,
"text":"test",
"comment": "このデータはhogeです"
}


対処案2
コメント行を自力で抜く


// 参考 https://github.com/lorenwest/node-config/blob/master/lib/config.js
var fs = require('fs');
console.log(readJson('/share/test.json'));

function readJson(fullFilename) {
var fileContent;
try {
fileContent = fs.readFileSync(fullFilename, 'UTF-8');
} catch (e2) {
throw new Error('Config file ' + fullFilename + ' cannot be read');
}
var configObject = JSON.parse(_stripComments(fileContent));
return configObject;

function _stripComments(fileStr) {

var uid = '_' + +new Date(),
primitives = [],
primIndex = 0;

return (
fileStr

/* Remove strings */
.replace(/(['"])(\\\1|.)+?\1/g, function(match){
primitives[primIndex] = match;
return (uid + '') + primIndex++;
})

/* Remove Regexes */
.replace(/([^\/])(\/(?!\*|\/)(\\\/|.)+?\/[gim]{0,3})/g, function(match, $1, $2){
primitives[primIndex] = $2;
return $1 + (uid + '') + primIndex++;
})

/*
- Remove single-line comments that contain would-be multi-line delimiters
E.g. // Comment /* <--
- Remove multi-line comments that contain would be single-line delimiters
E.g. /* // <--
*/
.replace(/\/\/.*?\/?\*.+?(?=\n|\r|$)|\/\*[\s\S]*?\/\/[\s\S]*?\*\//g, '')

/*
Remove single and multi-line comments,
no consideration of inner-contents
*/
.replace(/\/\/.+?(?=\n|\r|$)|\/\*[\s\S]+?\*\//g, '')

/*
Remove multi-line comments that have a replaced ending (string/regex)
Greedy, so no inner strings/regexes will stop it.
*/
.replace(RegExp('\\/\\*[\\s\\S]+' + uid + '\\d+', 'g'), '')

/* Bring back strings & regexes */
.replace(RegExp(uid + '(\\d+)', 'g'), function(match, n){
return primitives[n];
})
);
};
}



[PR]
by mima_ita | 2014-06-18 19:56 | node.js
Node.jsでIPv6を扱う
Node.jsでIPv6を扱う場合はipv6というモジュールを使用するとよい。
https://github.com/beaugunderson/javascript-ipv6

IPを数値に変換した場合、JavaScriptの仕様上、double型と扱われ、精度が落ちる。
このライブラリではbigIntegerというライブラリを用い、それを回避している。
もし、IPの範囲の検査で大小を比較する場合は、bigIntegerが提供しているcompairToを用いて行うこと。
まちがっても自分ですべての配列の大小を比較する車輪の再開発みたいなことはしてはいけない。


なお、ドキュメントなんてものはないから、ソース読んで自分で使い方を調べなければならない。
以下に最低限必要な操作は記述した、サンプルを示す。



var v6 = require('ipv6').v6;
var address1 = new v6.Address('2001:0:ce49:7601:e866:efff:62c3:fffe');
var address2 = new v6.Address('2001:0:ce49:7601:e866:efff:61c3:0002');

// アドレスの比較をする場合はbigIntegerに変換して、compareToで比較すること
var bi1 = address1.bigInteger();
var bi2 = address2.bigInteger();

// thisがでかければ+
console.log(bi1.compareTo(bi2));
// ひとしければ 0
console.log(bi1.compareTo(bi1));
// 引数のほうが大きければ-
console.log(bi2.compareTo(bi1));

// サブネットマスクを指定して、開始アドレス、終了アドレスも取得できる。
address1.subnetMask = 64;
console.log(address1.startAddress());
console.log(address2.endAddress());


// 省略形で表示も可能
address1 = new v6.Address('2001:0:0:0:0:0:0:1');
// 2001::1 と省略形で
console.log(address1.correctForm());


[PR]
by mima_ita | 2014-06-13 22:17 | node.js



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ