fc2ブログ

2012-04-09(Mon)

ブログにGoogle Plusボタンを付けてみる

Google Plusコードを取得する
以下にアクセスする。
http://www.google.co.jp/webmasters/+1/button/
以下の画面で画像を選択する。
googleplus001.jpg

以下の画面でコードを取得する。
googleplus002.jpg

テンプレートへの貼付け
取得したコードの
<!-- この render 呼び出しを適切な位置に挿入してください -->
の部分をブログのテンプレートに貼り付ける。
こんな感じでBODYタグの終わりのすぐ上に貼り付ける。
<!-- この render 呼び出しを適切な位置に挿入してください -->
<script type="text/javascript">
window.___gcfg = {lang: 'ja'};

(function() {
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();
</script>
</body>
</html>


FC2のコードを挿入する
<!-- このタグを +1 ボタンを表示する場所に挿入してください -->
の部分にFC2のコードを挿入する。
<!-- このタグを +1 ボタンを表示する場所に挿入してください -->
<g:plusone href="<%topentry_link>"></g:plusone>

あとはブログの文章を書いている中で好きな箇所に入れてください。

流れ的にポチっと押していただければ幸い。


スポンサーサイト



2011-11-12(Sat)

GAE/J エンティティーグループでトランザクションしてみる

GAE/JでACIDを保証するためエンティティーグループトランザクションを使ってみる。
ちなみに、Slim3環境だけどね。
(実験)
(1). ParentエンティティーとChildrenエンティティーを作成。
(2). それぞれのエンティティーは以下のデータを登録する。
 登録するときにChildrenはParentsのエンティティーグループとして登録する。
 
(name, older) -> ("oya1", 60), ("oya2", 50)
 
(name, older) -> ("children1", 2), ("children2", 5)
(3). Parentエンティティーを以下の通り変更しputした後、Childrenを変更しようとした時にエラーを発生させる。

(name, older) -> ("oya1", 61)
(4)."oya1"が60のままなことを確認する。

Controllerだけ記載するしておく。
言葉でメモるよりソースが一番理解できる。

public class ChildrenController extends RestController{
private final static Logger LOG = Logger.getLogger(ChildrenController.class
.getName());

@Override
public void doGet() {
response.setContentType("application/json");
String reg = param("reg");
String oya = param("oya");
String name = param("name");
String older = param("older");
String update = param("update");
String cname = param("cname");
String colder = param("colder");
String pname = param("pname");
String polder = param("polder");

if(null != reg){
/** Childrenデータ登録用 */
LOG.info("reg");
this.regChildern(oya, name, Integer.valueOf(older));
}else if(null != update){
/** 更新用 */
LOG.info("update");
/** トランザクション設定 */
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Transaction txn = datastore.beginTransaction();
/** Parentsエンティティーのolder更新 */
if(SC_OK != this.updateParents(txn, pname, Integer.valueOf(polder)) ){
txn.rollback();
return;
}
/** Childrenエンティティーのolder更新 */
if(SC_OK != this.updateChildern(txn, cname, Integer.valueOf(colder)) ){
/** ここでエラーを発生させてロールバックさせる */
txn.rollback();
return;
}
/** トランザクション終了 */
txn.commit();
}

return;
}


/* Childrenデータ更新処理 */
private Integer updateChildern(Transaction txn,String name, Integer older){
ChildrenDao insChildrenDao = new ChildrenDao();
Children entity = insChildrenDao.getEntity(name);
if(null == entity.getId()){
LOG.severe("ERROR");
return SC_NOT_FOUND;
}
entity.setOlder(older);
insChildrenDao.save(entity);

return SC_OK;
}
/* Parentsデータ更新処理 */
private Integer updateParents(Transaction txn,String name, Integer older){
ParentsDao insParentsDao = new ParentsDao();
Parents entity = insParentsDao.getEntity(name);
if(null == entity.getId()){
LOG.severe("ERROR");
return SC_NOT_FOUND;
}

entity.setOlder(older);
insParentsDao.save(entity);
return SC_OK;
}

/** Childrenデータ登録処理 */
private Integer regChildern(String oya, String name, Integer older){
ParentsDao insParentsDao = new ParentsDao();
Parents entity = insParentsDao.getEntity(oya);
if(null == entity.getId()){
LOG.severe("ERROR");
return SC_NOT_FOUND;
}

/** エンティティーグループ生成 */
/** ParentsのKeyを取得 */
Key parentKey = entity.getId();

/** 取得したParents Keyを今から生成させるChildren Keyにリンクさせる */
Key childKey = Datastore.allocateId(parentKey, Children.class);

/** Childrenデータ登録処理 */
ChildrenDao insChildrenDao = new ChildrenDao(childKey, name, older);
insChildrenDao.saveserlf();
return SC_OK;
}
}


参考:
Google App Engine(トランザクション)
すっきりわかるGoogle App Engine for Javaクラウドプログラミング
はじめてのGoogle App Engine for Java―巨大サーバを利用したWebアプリ開発の基本! (I/O BOOKS)

2011-11-11(Fri)

GAE利用料金計算メモ

新料金体系になって初めてGAE Dashboardをまじまじと見た。
課金のしくみをメモる。

Appengine 1.5.0からFrontend Instance、Backend Instanceという概念ができた。
Frontend Instanceは今までと同じ。
Backend Instanceは複数のインスタンスを作ったり(動的インスタンス)、インスタンス数を指定して常に動かしたり
できるらしい。
今回は、Frontend Instanceしか使わなかったのでDashBoardのFrontend Instance Hoursに着目する。
dashboard_billing_status.png


1 インスタンスで28 hrまで無料なので

Billable =156.43 - 28
= 128.43 (hr)
が課金対象になる。
Priceが$0.04/ Hourなので
Cost = 128.43 * 0.04
= $ 5.14
が課金された。

ただ、上記数値は課金がリセットされる24hrまで7hr残っている状態での計算結果なので実際はどれくらい
かかるのか目安はわからない。
いままでどれくらいかかっているかは下図の利用インスタンス数でみる。
gae_cost_charts.png
緑色の線が課金対象のインスタンス数だ。平均で8個ぐらいかな。

参考
Tari Tari Run
Google App Engine for Java実践クラウド・プログラミング

2011-10-22(Sat)

Google+ APIを使ってOAuth2認証しprofileデータをとってみる(4)

実際にOAuth2認証してみる。
前回のGoogle+ APIを使ってOAuth2認証しprofileデータをとってみる(3)


/** 認証スタート */
response.sendRedirect(authorizationUrl)

すると以下のような画面があらわれる。
oauth2_authorization_screen

これを認証すると指定したコールバックURLがコールされる。

ちなみにGoogle Plusを一度も使っていないGoogleアカウントではerrorパラメータが
ついており以下のif文に引っかかりエラーとなる。


if (error != null) {
response.setContentType("text/plain");
try {
response.getWriter().println("There was a problem during authentication: " + error);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

2011-10-19(Wed)

Google+ APIを使ってOAuth2認証しprofileデータをとってみる(3)

Controllerですべてできたー説明はコメントに記載する。


public class GoauthController extends Controller{
private final static Logger LOG = Logger.getLogger(GoauthController.class.getName());
private final static String CLIENT_ID = "*********************************************";
private final static String CLIENT_SECRET = "***************";
private final static String REDIRECT_URL = "http://***************/Goauth/callback";
private final static String GOOGLE_API_KEY = "***************";
private final static String OAUTH_SCOPES = "https://www.googleapis.com/auth/plus.me";

/** Getですべてをまかなう */
public Navigation doGet(){

response.setContentType("application/json");

String error = param("error");
/** Callbackのパラメータにerrorが含まれていればParmission Errorにする */
if (error != null) {
response.setContentType("text/plain");
try {
response.getWriter().println("There was a problem during authentication: " + error);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LOG.severe("There was a problem during authentication: " + error);
return null;
}

String code = param("code");
/** Callbackのパラメータにcodeが含まれていればOAuth2認証成功 */
if (code == null || code.isEmpty()) {
/** 認証スタートするところ(パラメータにcodeが含まれていない) */
// Now that we have the OAuth 2.0 code, we must exchange it for a token to make API requests.
// Build the authorization URL
AuthorizationRequestUrl authorizeUrl = new GoogleAuthorizationRequestUrl(CLIENT_ID, REDIRECT_URL, OAUTH_SCOPES);

authorizeUrl.redirectUri = REDIRECT_URL;
authorizeUrl.scope = OAUTH_SCOPES;
String authorizationUrl = authorizeUrl.build();

LOG.info("Redirecting browser for OAuth 2.0 authorization to " + authorizationUrl);
try {
   /** 認証スタート */
response.sendRedirect(authorizationUrl);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}else{
/** Callbackがくるところ */
LOG.info("Exchanging OAuth code for access token using server side call");

LOG.info("callback start");
/** AccessTokenRequestを取得 */
AccessTokenResponse accessTokenResponse = null;
try {
accessTokenResponse = new GoogleAccessTokenRequest.GoogleAuthorizationCodeGrant(
new NetHttpTransport(),
new GsonFactory(),
CLIENT_ID,
CLIENT_SECRET,
code,
REDIRECT_URL
).execute();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

/** AccessTokenがとれたーー */
LOG.info("Storing authentication token into the session");
LOG.info("accessToken: " + accessTokenResponse.accessToken);
LOG.info("refreshToken: " + accessTokenResponse.refreshToken);

Plus unauthenticatedPlus = new Plus(Util.TRANSPORT, Util.JSON_FACTORY);
unauthenticatedPlus.setKey(GOOGLE_API_KEY);
GoogleAccessProtectedResource requestInitializer =
new GoogleAccessProtectedResource(
accessTokenResponse.accessToken,
Util.TRANSPORT,
Util.JSON_FACTORY,
CLIENT_ID,
CLIENT_SECRET,
accessTokenResponse.refreshToken
);
Plus plus = new Plus(Util.TRANSPORT, requestInitializer, Util.JSON_FACTORY);
Person profile = null;

try {
profile = plus.people.get("me").execute();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return redirect("/");
}
}
return null;
}



プロフィール

kumagonjp2

Author:kumagonjp2
Python,Django,R,Mongo,MySQL,Struts,Spring,データマイニングなどサーバー関係のメモを残していきます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
雪が3Dで降るブログパーツ ver2

マウスで見る方向変えられます

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR