2013年5月3日金曜日

PQI Air Card でnode.js



一部で話題のMicroSDカードアダプタ PQI Air Card ですが、
こいつはMicroSDカードアダプタのくせに内部でLinuxが動いているというキモいアイテム


デジカメ内部でRubyを動かす狂気!無線LAN内蔵SDカードアダプタPQI Air Cardの間違った使い方

この記事を読んでから、Rubyが動くんならnode.jsも動かせるんじゃね?
と思い、ビルドしてみました。


ビルド環境はRaspberry PIのクロスビルド用に用意していたDebianに
元ネタとなったRubyのビルドに使われたSourcery CodeBenchを入れて使用

ごにょごにょとやってビルド完了

やはり元ネタのbusybox全部入りのzipをベースに
できたものをPQI Air Cardに転送

で、おもむろに

# node -v



キタ━━━━(゚∀゚)━━━━!!

結局必要だったのは
node(実行モジュール)とlibstdc++.so
libpthreadに関してはrybyと同じくもともとのやつだとエラーが出たので
zip内のものにシンボリックリンクの張替えが必要です

一応、hellow world的なものも動かして見たましたが
なんとか、動いている様子

んじゃ、次はnpmだなと欲張って

# npm install express

カチャカチャ ターーーン

(数分経過)

npm http GET https://registry.npmjs.org/express
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

はぁ、、、、そうですか、、、、
メモリ足りませんか、、、そうですよね

ということで、npmは使い物にならなさそうです

こんな状態でもちょっとでも、使える可能性を感じた人がいるのであれば
ここに置いときますのでご自由にお使いください

お約束ですが、くれぐれも自己責任でお願いします。



2012年1月22日日曜日

棒読みちゃん for Google+:技術解説

拙作 棒読みちゃん for Google+ についての技術的解説です

「棒読みちゃん for Google+」は棒読みちゃん
読み上げテキストを外部から受信する機能を使用しています。


通信にはSocket通信を使用しますが
Chrome ExtentionだけではSocket通信を行うことができません。

それを解決するため滅びの技術といわれる「NPAPI」というものを使用します。

NPAPIとはFlash Player などのプラグインで使われる
EMBEDタグでOSネイティブの機能を呼び出す技術です。

ようするに、OSネイティブな機能はDLLとして実装します。

(FlashもHTML5に取って代わられ、
NativeClientなどの新しい技術によって
NPAPIは滅びる運命にあると言われています)

今回の機能は以下によって構成されています

  • コンテント・スクリプト
  • バックグラウンドページ
  • オプションページ
  • プラグインDLL

コンテント・スクリプト

Google+ページで動かすJavaScriptです。

DOMNodeInsertedのイベントを監視して
追加されたPOSTから文字列を取り出し
バックグラウンドページに送信します。
バックグラウンドページとのやりとりは

chrome.extension.sendRequest()を使用します。


バックグラウンドページ

バックグラウンド動くため、表示させることはできませんが
EMBEDタグでDLLをプラグインとして貼り付けます。

コンテント・スクリプトからのsendRequestは
chrome.extension.onRequest.addListener()で受信し
送られてきた文字列をプラグインへ渡します。


<embed id="bouyomichan" type="application/x-vnd.bouyomichan"></embed>

のようにしてプラグインを貼り付けることによって

document.getElementById('bouyomichan').talk('hogehoge');

というJavaScriptでプラグインに実装したtalk()メソッドを呼び出すことができます。


オプションページ

ブラウザの「拡張機能」画面から呼び出すオプションを設定する画面です。
設定した値は localStorage をつかって保存します。
デザインが適当なのはそこまで頑張る気力がなかったためです。

プラグインDLL

Socketを使って棒読みちゃんと接続し
文字列を送りつけます。

今回はtalk()というメソッドで棒読みちゃんに文字列を送信しています。
他にも、音声、音量、音程、スピードなどを変更するためのメソッドも
実装しています。

こればっかりはWindowsネイティブな部分なので
VisualC++2010でビルドしました。

このDLLに相当する部分をMacやLinux用に用意すれば
MacやLinuxでも動かせないことはないはず。

とはいっても棒読みちゃん本体はWindows版しかないわけで、、、、

NPAPIを使うにあたって、
色々とサンプルを漁ったりしましたが
唯一動いたのがこちらのものだけでした。

ChromeからプラグインDLLとして認識されるためには
DLLのバージョン情報にMIMETypeなどを定義しなければいけないのだが
これがなかなかうまいように設定できず、苦しみました
上手いことchromeに認識されるとabout:pluginにて確認することができます。

文字列のやりとりはutf-8で行われ、
棒読みちゃんもutf-8での指定は可能なのですが、
初期に配布したバージョンでは
文字列長の指定を誤っていたため
ゴミまで読み上げることがあったのはナイショだ


今回ちょっとめんどくさかったのは以下2点

  • ストリームのPOSTについてはあっさりと文字列を取り出すことができたのですが、ハングアウトのCHAT部分はiframeで別ページになっててその中の更新を監視しなければいけなかったこと
  • 一度実装できたと思ったらGoogle先生がごっそりDOMの構成かえたため実装しなおしたこと


2012年1月21日土曜日

棒読みちゃん for Google+

一億人のGoogle+ユーザの皆さん
おまたせしました


ちまちま、開発を続けていた「棒読みちゃん for Google+」が
ようやく使用に耐えられそうな段階になりましたので
公開いたします。

あ、Windows専用です


テキスト読み上げソフト「棒読みちゃん」を使用して
ストリームの内容を読み上げます

読み上げる内容は以下になります
  • POST本文(POST主の名前の有無)
  • コメント
  • ハングアウトのchat
ただ、コメント部分の読み上げについては元POSTとは無関係に
追加された順番に読み上げられます。
また、ストリームの勢いがはやいと
コメント読み上げがストリームに追いつかなくなるので要注意

個人的には、実況系ハングアウターの皆さんにつかってみていただきたいと思っています。
(ご意見ご感想お待ちしています)

chat部分はストリーム部分と比べて
Google先生がページ構成をちょくちょくいじるので
突然使えなくなる可能性があるのがめんどくさいかな

現在、Chrome Webストアにて審査待ち(即時公開させろよ)なので、
待てない人は以下から取得してください
審査で却下されたのでここでほそぼそと配布します



起動時に「msvcr100.dllなんたら」なエラーが出る人は
を入れると幸せになれるかも


2011年11月22日火曜日

非公式APIをJAVAに移植してみた その2

サークル限定POSTをできるようにしました

ライセンス形式はTakehiro Takahashi版に準拠し、NYSLとなります



package jp.kaientai.gplus;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import org.apache.http.protocol.HTTP;

public class Gplus {

static final String USER_AGENT = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)";

private String _sendid;
private String _userid;
private DefaultHttpClient http;

private String getMatchString(String patern, String target) {
Pattern pattern = Pattern.compile(patern);
Matcher matcher = pattern.matcher(target);
boolean blnMatch = matcher.find();
if (blnMatch) {
if (matcher.groupCount() == 1) {
return matcher.group(1);
} else {
return null;
}
} else {
return null;
}

}

public Gplus(String user, String pass) throws Exception {
http = new DefaultHttpClient();
Google_AccountLogin(user, pass);
}

/**
* ログイン処理
*
* @param _mailaddress
* @param _password
* @throws Exception
*/
private void Google_AccountLogin(String _mailaddress, String _password)
throws Exception {
String b;
String c;
String d;
HttpResponse execute;
InputStream is;
InputStreamReader isr;
StringWriter sw;
BufferedReader buf;

HttpGet get = new HttpGet("https://accounts.google.com/login");

try {
execute = http.execute(get);

is = execute.getEntity().getContent();
isr = new InputStreamReader(is);
sw = new StringWriter();
buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
b = sw.toString();

} catch (Exception ex) {
throw new Exception(ex);
}
c = getMatchString("name=\"dsh\" id=\"dsh\" value=\"([-0-9]+)\"", b);

d = getMatchString("name=\"GALX\"[ \t\n]+value=\"([-_a-zA-Z0-9]+)\"><",
b);

HttpPost post = new HttpPost(
"https://accounts.google.com/ServiceLoginAuth");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
final List<NameValuePair> params = new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("dsh", c));
params.add(new BasicNameValuePair("GALX", d));
params.add(new BasicNameValuePair("pstMsg", "1"));
params.add(new BasicNameValuePair("dnConn",
"https%3A%2F%2Faccounts.youtube.com"));
params.add(new BasicNameValuePair("timeStmp", ""));
params.add(new BasicNameValuePair("secTok", ""));
params.add(new BasicNameValuePair("Email", _mailaddress));
params.add(new BasicNameValuePair("Passwd", _password));
params.add(new BasicNameValuePair("signIn",
"%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3"));
params.add(new BasicNameValuePair("PersistentCookie", "yes"));
params.add(new BasicNameValuePair("rmShown", "1"));
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
try {
execute = http.execute(post);

is = execute.getEntity().getContent();
isr = new InputStreamReader(is);
sw = new StringWriter();
buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}

} catch (Exception e) {
throw new Exception(e);
}
return;
}

/**
* @param _pageid
*/
private void PlusGetData(String _pageid) {
HttpGet get = new HttpGet("https://plus.google.com/");
try {
get.setHeader("User-Agent", Gplus.USER_AGENT);

HttpResponse execute = http.execute(get);

InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
String b = sw.toString();

_sendid = getMatchString("\"(AObGSA.*:[0-9]*)\"", b);

_userid = getMatchString("key: '2', data:[ ]\\[\"([0-9]*)", b);

} catch (Exception e) {
e.printStackTrace();
}
}

//
/**
* 一般公開でPOST
*
* @param _message
*            POSTの本文
* @param _id
*            G+ページの場合G+のID(G+ページでない場合はnullを指定)
* @param _lock
*            ロックする場合は true 、しない場合は false
* @return
*/
public int Google_Plus_Post(String _message, String _id, boolean _lock) {
return Google_Plus_Post(_message, _id, null, _lock);
}

/**
* サークル指定でPOST
*
* @param _message
*            POSTの本文
* @param _id
*            G+ページの場合G+のID(G+ページでない場合はnullを指定)
* @param _circle
*            公開先のサークルID
* @param _lock
*            ロックする場合は true 、しない場合は false
* @return
*/
public int Google_Plus_Post(String _message, String _id, String _circle,
boolean _lock) {
String e;
String f;
String g;
String circleid;
String scopeType;

try {

e = _message.replaceAll("\n", "\\\\n");
} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
PlusGetData(_id);

if (_lock) {
f = "true";
} else {
f = "false";
}

if (_circle == null) {
circleid = "anyone";
scopeType = "anyone";
} else {
circleid = _userid + "." + _circle;
scopeType = "focusGroup";

}
// JSON
g = "[\""
+ e
+ "\",\"oz:"
+ _userid
+ "."
+ String.valueOf(System.currentTimeMillis() / 1000)
+ ".0\",null,null,null,null,\"[]\",null,\"{\\\"aclEntries\\\":[{\\\"scope\\\":{\\\"scopeType\\\":\\\""
+ scopeType
+ "\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\""
+ circleid
+ "\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":20},{\\\"scope\\\":{\\\"scopeType\\\":\\\""
+ scopeType
+ "\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\""
+ circleid
+ "\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":60}]}\",true,[],false,false,null,[],false,false,null,null,null,null,null,null,null,null,null,null,"
+ f + ",false,false]";

String url;
if (_id.equals("")) {
url = "https://plus.google.com/_/sharebox/post/";
} else {
url = "https://plus.google.com/b/" + _id + "/_/sharebox/post/";
}
HttpPost post = new HttpPost(url);
final List<NameValuePair> params = new ArrayList<NameValuePair>();

// randomize
Random rnd = new Random();
try {
params.add(new BasicNameValuePair("spam", "20"));
params.add(new BasicNameValuePair("reqid", String.valueOf(rnd
.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))));
params.add(new BasicNameValuePair("rt", "j"));
params.add(new BasicNameValuePair("spar", g));
params.add(new BasicNameValuePair("at", _sendid));

post.setHeader("X-Same-Domain", "1");
post.setHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
post.setHeader("Pragma", "no-cache");
post.setHeader("Cache-Control", "no-cache");
post.setHeader("User-Agent", Gplus.USER_AGENT);
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse execute = http.execute(post);

if (execute == null)
{
return 0;
}
InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
System.out.println(sw.toString());

} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
return 1;
}

/**
* Google+の指定のポストを編集
*
* @param _postid
*            POSTのID
* @param _message
*            編集後の本文
* @param _id
*            G+ページの場合G+のID(G+ページでない場合はnullを指定)
* @return
*/
public int Google_Plus_Edit(String _postid, String _message, String _id) {
String e;
String url;

e = _message.replaceAll("\n", "\\\n"); //編集の時はなぜかエスケープの\が3つ
PlusGetData(_id);

if (_id.equals("")) {
url = "https://plus.google.com/_/stream/edit/";
} else {
url = "https://plus.google.com/b/" + _id + "/_/stream/edit/";
}
HttpPost post = new HttpPost(url);
final List<NameValuePair> params = new ArrayList<NameValuePair>();

Random rnd = new Random();
try {
params.add(new BasicNameValuePair("spam", "20"));
params.add(new BasicNameValuePair("reqid", String.valueOf(rnd
.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))));
params.add(new BasicNameValuePair("rt", "j"));
params.add(new BasicNameValuePair("spt", e));
params.add(new BasicNameValuePair("sei", _postid));
params.add(new BasicNameValuePair("sml", "[]"));
params.add(new BasicNameValuePair("madl", "true"));
params.add(new BasicNameValuePair("at", _sendid));

post.setHeader("X-Same-Domain", "1");
post.setHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
post.setHeader("Pragma", "no-cache");
post.setHeader("Cache-Control", "no-cache");
post.setHeader("User-Agent", Gplus.USER_AGENT);
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse execute = http.execute(post);

if (execute == null) {
return 0;
}

InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
System.out.println(sw.toString());

} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
return 1;
}

public static void main(String[] args) {

try {
Gplus g = new Gplus("アカウント", "パスワード");
g.Google_Plus_Post("てすと\n改行", "", "サークルID", false);
g.Google_Plus_Edit("POSTのID","編集は\n甘え","G+ページID");
} catch (Exception e) {
e.printStackTrace();
}
}
}


非公式APIをJAVAに移植してみた


Takehiro Takahashi氏による Google+ 非公式 投稿API for HSP を
JAVAに移植してみました

あくまでも非公式APIなのでGoogle先生の仕様変更によって
つかえなくなる可能性があります

再利用は自己責任でお願いします


package jp.kaientai.gplus;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import org.apache.http.protocol.HTTP;


public class Gplus {


private String _sendid;
private String _userid;
private DefaultHttpClient http;


public Gplus(String user,String pass) throws Exception {
http = new DefaultHttpClient();
Google_AccountLogin(user,pass);
}


private void Google_AccountLogin(String _mailaddress, String _password) throws Exception {
String b;
String c;
String d;
boolean blnMatch;

try {


HttpGet get = new HttpGet("https://accounts.google.com/login");


HttpResponse execute = http.execute(get);


InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
b = sw.toString();


Pattern pattern = Pattern
.compile("name=\"dsh\" id=\"dsh\" value=\"([-0-9]+)\"");
Matcher matcher = pattern.matcher(b);
blnMatch = matcher.find();
c = matcher.group(1);
pattern = Pattern
.compile("name=\"GALX\"[ \t\n]+value=\"([-_a-zA-Z0-9]+)\"><");
matcher = pattern.matcher(b);
blnMatch = matcher.find();
if(!blnMatch )
{
throw new Exception("ログインエラー");
}
d = matcher.group(1);


HttpPost post = new HttpPost(
"https://accounts.google.com/ServiceLoginAuth");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
final List<NameValuePair> params = new ArrayList<NameValuePair>();


params.add(new BasicNameValuePair("dsh", c));
params.add(new BasicNameValuePair("GALX", d));
params.add(new BasicNameValuePair("pstMsg", "1"));
params.add(new BasicNameValuePair("dnConn",
"https%3A%2F%2Faccounts.youtube.com"));
params.add(new BasicNameValuePair("timeStmp", ""));
params.add(new BasicNameValuePair("secTok", ""));
params.add(new BasicNameValuePair("Email", _mailaddress));
params.add(new BasicNameValuePair("Passwd", _password));
params.add(new BasicNameValuePair("signIn",
"%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3"));
params.add(new BasicNameValuePair("PersistentCookie", "yes"));
params.add(new BasicNameValuePair("rmShown", "1"));
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
execute = http.execute(post);


is = execute.getEntity().getContent();
isr = new InputStreamReader(is);
sw = new StringWriter();
buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}


} catch (Exception e) {
e.printStackTrace();
}
return;
}


private void PlusGetData(String _pageid) {
boolean blnMatch;
HttpGet get = new HttpGet("https://plus.google.com/");
try {
get.setHeader("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)");


HttpResponse execute = http.execute(get);


InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
String b = sw.toString();


Pattern pattern = Pattern.compile("\"(AObGSA.*:[0-9]*)\"");
Matcher matcher = pattern.matcher(b);
blnMatch = matcher.find();
_sendid = matcher.group(1);


pattern = Pattern.compile("key: '2', data:[ ]\\[\"([0-9]*)");
matcher = pattern.matcher(b);
blnMatch = matcher.find();
_userid = matcher.group(1);


} catch (Exception e) {
e.printStackTrace();
}
}


public int Google_Plus_Post(String _message, String _id, boolean _lock) {
String e;
String f;
String g;
try{


e = _message.replaceAll("\n", "\\\\n");
}catch(Exception ex)
{
ex.printStackTrace();
return 0;
}
PlusGetData(_id);


if (_lock) {
f = "true";
} else {
f = "false";
}


// JSON
if (_id == "") {
g = "[\""
+ e
+ "\",\"oz:"
+ _userid
+ "."
+ String.valueOf(System.currentTimeMillis() / 1000)
+ ".0\",null,null,null,null,\"[]\",null,\"{\\\"aclEntries\\\":[{\\\"scope\\\":{\\\"scopeType\\\":\\\"anyone\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\"anyone\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":20},{\\\"scope\\\":{\\\"scopeType\\\":\\\"anyone\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\"anyone\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":60}]}\",true,[],false,false,null,[],false,false,null,null,null,null,null,null,null,null,null,null,"
+ f + ",false,false]";
} else {
g = "[\""
+ e
+ "\",\"oz:"
+ _userid
+ "."
+ String.valueOf(System.currentTimeMillis() / 1000)
+ ".0\",null,null,null,null,\"[]\",null,\"{\\\"aclEntries\\\":[{\\\"scope\\\":{\\\"scopeType\\\":\\\"anyone\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\"anyone\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":20},{\\\"scope\\\":{\\\"scopeType\\\":\\\"anyone\\\",\\\"name\\\":\\\"\\\\u5168\\\\u54e1\\\",\\\"id\\\":\\\"anyone\\\",\\\"me\\\":true,\\\"requiresKey\\\":false},\\\"role\\\":60}]}\",true,[],false,false,null,[],false,false,null,null,null,null,null,null,null,null,null,null,"
+ f + ",false,false]";
}


String url;
// 謚慕ィソ
// randomize
if (_id.equals("")) {
url = "https://plus.google.com/_/sharebox/post/";
} else {
url = "https://plus.google.com/b/" + _id + "/_/sharebox/post/";
}
HttpPost post = new HttpPost(url);
final List<NameValuePair> params = new ArrayList<NameValuePair>();


Random rnd = new Random();
try {
params.add(new BasicNameValuePair("spam", "20"));
params.add(new BasicNameValuePair("reqid",
String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))));
params.add(new BasicNameValuePair("rt", "j"));
params.add(new BasicNameValuePair("spar", g));
params.add(new BasicNameValuePair("at", _sendid));


post.setHeader("X-Same-Domain", "1");
post.setHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
post.setHeader("Pragma", "no-cache");
post.setHeader("Cache-Control", "no-cache");
post.setHeader("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)");
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse execute = http.execute(post);


InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
System.out.println( sw.toString());


if (execute != null) {
return 1;
} else {
return 0;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}


//Google+の指定のポストを編集 _postid:ページID, _message:編集後の本文 _id: ページの場合
public int Google_Plus_Edit( String _postid, String _message, String _id)
{
String e;
String url;
try{
e = _message.replaceAll("\n", "\\\n");
}catch(Exception ex)
{
ex.printStackTrace();
return 0;
}
PlusGetData(_id);


if (_id.equals("")) {
url = "https://plus.google.com/_/stream/edit/";
} else {
url = "https://plus.google.com/b/"+ _id + "/_/stream/edit/";
}
HttpPost post = new HttpPost(url);
final List<NameValuePair> params = new ArrayList<NameValuePair>();


Random rnd = new Random();
try {
params.add(new BasicNameValuePair("spam", "20"));
params.add(new BasicNameValuePair("reqid",
String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))
+ String.valueOf(rnd.nextInt(10))));
params.add(new BasicNameValuePair("rt", "j"));
params.add(new BasicNameValuePair("spt" ,e));
params.add(new BasicNameValuePair("sei" ,_postid));
params.add(new BasicNameValuePair("sml","[]"));
params.add(new BasicNameValuePair("madl","true"));
params.add(new BasicNameValuePair("at", _sendid));


post.setHeader("X-Same-Domain", "1");
post.setHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
post.setHeader("Pragma", "no-cache");
post.setHeader("Cache-Control", "no-cache");
post.setHeader("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)");
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse execute = http.execute(post);


InputStream is = execute.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
StringWriter sw = new StringWriter();
BufferedReader buf = new BufferedReader(isr);
for (String line; (line = buf.readLine()) != null;) {
sw.write(line);
}
System.out.println( sw.toString());


if (execute != null) {
return 1;
} else {
return 0;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

public static void main(String[] args) {


try{
Gplus g = new Gplus("アカウント", "パスワード");
g.Google_Plus_Post("てすと\n改行", "", true);
g.Google_Plus_Edit("POSTID", "編集は\n甘え", "");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

2011年11月2日水曜日

ゆるゆりの起動アニメーションを作ってみた

ゆるゆり はっじまるよ~

ということでAndroid用の起動アニメーションを作ってみた



http://dl.dropbox.com/u/20155466/yuruyuri_bootanimation.zip

設定方法については書きません
分かる人のみ自己責任で使用してください

2011年10月25日火曜日