2013年12月27日金曜日

自分のプロフィールにも検索結果にも表示されない謎のG+投稿

Google Local Tokyoに批判的意見をGoogle+で再共有したら、自分のプロフィールにも検索結果にも表示されない不思議な投稿になったので、記録として貼っておく。これはたんなるバグか、管理者が裏ワザで操作しているのかどっちでしょうか?
Google+で消された投稿
見えない投稿の URL はhttps://plus.google.com/115653424494952359766/posts/YEDiDGjAkY2 です。

2013年12月21日土曜日

データ専用SIMでCell IDをわかるようにする

日本通信などのようにSMSも音声通話もついていないデータ通信専用SIMをandroidで使うと、
  1. アンテナピクトが立たない
  2. セルスタンバイが異常に電力を消費しているように見える
  3. セルID (携帯基地局のID)がアプリにわからなくなり位置情報が不正確になる
という問題がある。android 4.4ではついに上記の問題がすべて解決されているが、今度は設定→電池→セルスタンバイで詳細を見ると、圏外時間が100%になっているように見えるという新しいバグが生じている。android 4.03から4.3ではXposed(要root)モジュールのドコモSIMパッチャーを使うと上記の1と2は解決する。3については解決しない機種もある(例えばnexus 4)。

電話アプリから *#*#4636#*#* と入力して出てくる隠しメニューで携帯電話情報→CellInfoListRateを押すとセル情報の中にセルIDが表示されている場合、携帯電話自体はセルIDを認識しているがソフトウェアのどこかがアホなのでアプリのセルIDを伝えることが出来ていない。その場合、android 4.3の場合は
GsmCellLocation mNewCellLoc = (GsmCellLocation) getObjectField(param.thisObject, "mNewCellLoc");
List<CellInfo> mLastCellInfoList = (List<CellInfo>) getObjectField(param.thisObject, "mLastCellInfoList");
if (mLastCellInfoList.size() > 0) {
    CellIdentityWcdma ci = (CellIdentityWcdma)callMethod((CellInfoWcdma)(mLastCellInfoList.get(0)), "getCellIdentity");
    if (ci.getCid() != -1) {
callMethod(mNewCellLoc, "setLacAndCid", callMethod(ci, "getLac"), callMethod(ci, "getCid"));
callMethod(mNewCellLoc, "setPsc", callMethod(ci, "getPsc"));
    }
}
というコードをドコモSIMパッチャーに追加して、セルID情報をアプリがアクセスする変数に移してあげるとandroidアプリがセルIDをわかるようになることもある。上記の変更を施したjavaソースをここに置く。コンパイルしてAPKにしたものをここに置く。注意事項:
  • 2013年12月21日にAPKを更新し、繋がっているのにcell IDが表示されないことがある問題をcom.android.internal.telephony.gsm.GSMPhone:getCellLocation()もhookすることで対応した。
  • 上に置いたAPKだけインストールしても何も起きない。まずrootを取ってxposed frameworkをインストールして使えるようにしてから、上に置いたAPKをインストールしてxposed frameworkを起動してドコモSIMパッチャーを有効にして下さい。
  • LTEと2G GSMにも対応しているはずだがテストする環境が無いからテストできていない。上記のコードはWCDMA決め打ちだが実際のソースコードとAPKは決め打ちしていない。
  • Android 4.3でしか効果はない。Android 4.4はデータ専用SIMでもセルIDがアプリに渡されるからこのxposedモジュールは不要。Android 4.2.2以下では関数名や変数名を変更しないといけないが、テストする環境が無いのでAndroid 4.2.2以下用のコードは何もいじっていない。
  • 上記のJAVAソースからAPKをコンパイルして作る場合、ドコモSIMパッチャーの2013年7月26日版のソースコードのjavaファイルを置き換えて、AndroidManifest.xmlのminSdkVersionを18に増やして下さい。

この件は作者の方に以下のようにGoogle+投稿のコメント欄にて連絡済みです。


これ以上プログラムのロジックをいじる必要は無いと思うが、ご意見ありましたら以下のコメント欄などでお知らせ下さい。

2013年12月20日金曜日

Google Mapバージョン6(Androidアプリ)

Android版Google Mapはバージョン6からバージョン7になって

  • My Mapが未だに復活していない。
  • 公共交通機関を用いたナビが復活していない。知らない土地(外国含む)でバスに乗りGPS位置情報で降りるバス停が近づくと教えてくれるのが大変便利だったけど、バージョン7では公共交通機関のナビそのものが未だに復活していない。
という残念な変更が行われています。そこで最後のGoogle Mapバージョン6のAPKファイルを置いておきます。

インストール方法

端末に最初からインストールされたGoogle Mapがバージョン6以下またはインストールされていない場合


  1. Google Playでアプリの自動更新を禁止する
  2. Google Mapをアンインストールする
  3. 上記のGoogle Mapバージョン6APKをダウンロードしてインストールする

最初からGoogle Mapバージョン7がインストールされている場合

この場合、残念ながらGoogle Mapをアンインストールするためにroot権限を取る必要があります。

  1. Google Playでアプリの自動更新を禁止する
  2. Google Mapを普通のやり方でアンインストールする
  3. root権限を取る(これは1の前でもよい)
  4. Root Uninstallerなどのアプリを用いて最初からインストールされているGoogle Mapをアンインストールする
  5. 上記のGoogle Mapバージョン6APKをダウンロードしてインストールする
何かトラブルなど有ったら下のコメント欄に書いて下さい

2013年10月1日火曜日

LFGideos X1インストール記

LFGideos X1日本通信のideos (Huawei U8150B)にインストールしたときの覚書

ideos(日本通信が売っている8150Bのほうでemobileが売っているのはダメ)のメリットは

  1. SIMフリー
  2. FOMAプラスエリア対応
  3. 標準サイズのSIM対応
で、これらの特徴はなかなか他の端末では得られないからまだ手放せません。しかしそのままでは動作が遅すぎ不便すぎるのでROMを交換したほうが快適になります。
  • Google Play開発者サービスをインストールできない。これは最近のGoogle製アプリの大半で必要になり、Google製アプリの最近のバージョンを起動すると自動的にGoogle Play開発者サービスをインストールしようとし、失敗してアプリが起動しない。
  • Googleアプリを更新されると上記の症状で使用不可能になることがあるから、Google Playの自動更新をOFFにして勝手にアプリを更新されないようにする。特にYoutubeを更新すると使えなくなるから、更新してはいけない
  • Google+やgoogle my tracksアプリは古いバージョンのapkを拾ってきてインストールする。Google+はバージョン3.5.3、my tracksは2.02をインストールできる。
  • 実メモリーが少なすぎるからSwapper for Rootをインストールすると多少動作が速くなる。
Google Play開発者サービスをインストールする方法をご存知の方は教えて下さい

2013年6月7日金曜日

ガラパゴス化のすすめ

私は以下のような背景で日本の鎖国を推薦しているのですが、誰からもまったく賛成してもらえません。なお最初の段落の外国からの投資は2011年の外国からの対日投資がマイナスだった、すなわち投資が引き上げられていた、という下記記事が背景にあります。

「米国化」が進む日本、いずれ「三つ子の赤字」に陥る

外国から見て日本が投資先として魅力的にするためにどうすればいいか検討するためには、まず外国人や企業の背景や置かれている立場を理解して外国からの目線で考えないといけないけど、9割くらいの日本人はそういう外国人の立場に立って考えてみることが嫌いか、そもそも日本人以外の人間が存在することを認識していないと思います。大阪の橋下市長の発言は日本国内向けとしてはまあいいかも知れないけど、外国からどういう反応を受けるかまったく想定していないように見える。橋下さんの脳内では、日本国外には人間がそもそも存在していないとしか思えない。だけどそれは橋下さんだけが特別ではなくて、日本の外側に日本とはまったく違う背景・前提・世界観・常識で生きている人間がいるってことを実感としてまったく分かっていない日本人が9割くらいを占めていて、そういう9割の世論に沿って日本の進路が決まってくるので、外国から見てどう見えるかという観点とはまったく無関係に日本は今後も進んでいくと予想します。たまたままぐれで日本が外国から見て投資先として魅力的になる可能性はあるけど。

鎖国しちゃうと、オイルが無くて農薬と化学肥料も十分に使えるかどうか謎なのでから1日15時間くらい人力だけで畑を耕したり刈り入れしたり雑草を取ったりウンコから作った堆肥を撒きます。人力がとにかくいるので子供を生んだお母さんも子供をおんぶ紐で背負って産後1週間くらいから畑に出ます。農閑期以外は土日休日まったく無しです。それだけやって天候不作だと餓死者が出る世界を想定しています。気骨の無い人は当然死ぬし、一生のほぼ全てが労働だけで終わるので萌え萌えキュンも無いです。でもそうやれば外国人とかかわり合いにならなくて済むから生き残った日本人はハッピーだと妄想しているんだけど、まったく誰も賛成してくれないんですよねー。藤原正彦先生も、江戸時代の日本人はこの段落のような生活で幸福だったと書いています。

鎖国した場合にはオイルが無いからトラクターとかは使用不能だと思いますが、農薬と化学肥料が使えるのかどうかを今のところ判定できていません。 また、機械と農薬と化学肥料を使えない江戸時代は3000万人くらいの人口しか養えなかったので、そこからはみ出した人は餓死することを想定しています。

2013年6月5日水曜日

Google+ APIが現在バグっています

Google+ APIで特定の記事についたコメント一覧を取得する

が、何件コメントが有っても2件しかコメントを返さなくなっています。上記の関数を使ってWEBページにG+コメントを表示するデモページでもコメントが17件本来あるのに2件しか表示されなくなったいます。このG+記事にはコメントが17件付いていますけど、HTTP APIを用いてコメントを取得しようとすると下記のように2件しか取得できません。

この件はGoogle+ Developer Forumでも話題になっています。

$ wget -t 1 -S -O - https://www.googleapis.com/plus/v1/activities/z125jb5yhq3dyfwe5224exwiqruvtda0i/comments?key=AIzaSyA5ti-m7T8gFzR5uuMR6EJB7KygMaDr0hk
--2013-06-05 20:08:29--  https://www.googleapis.com/plus/v1/activities/z125jb5yhq3dyfwe5224exwiqruvtda0i/comments?key=AIzaSyA5ti-m7T8gFzR5uuMR6EJB7KygMaDr0hk
www.googleapis.com (www.googleapis.com) をDNSに問いあわせています... 74.125.31.95
www.googleapis.com (www.googleapis.com)|74.125.31.95|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています...
  HTTP/1.1 200 OK
  Expires: Wed, 05 Jun 2013 11:08:30 GMT
  Date: Wed, 05 Jun 2013 11:08:30 GMT
  Cache-Control: private, max-age=0, must-revalidate, no-transform
  ETag: "egWOTnJQshDUW7mcQ5TTH5LK5kQ/scHVPJwUGGN-8wgFh93QhFozvKc"
  Content-Type: application/json; charset=UTF-8
  X-Content-Type-Options: nosniff
  X-Frame-Options: SAMEORIGIN
  X-XSS-Protection: 1; mode=block
  Server: GSE
  Transfer-Encoding: chunked
長さ: 特定できません [application/json]
`STDOUT' に保存中

    [<=>                                    ] 0           --.-K/s              {
 "kind": "plus#commentFeed",
 "etag": "\"egWOTnJQshDUW7mcQ5TTH5LK5kQ/scHVPJwUGGN-8wgFh93QhFozvKc\"",
 "title": "Google+ List of Comments for an Activity",
 "items": [
  {
   "kind": "plus#comment",
   "etag": "\"egWOTnJQshDUW7mcQ5TTH5LK5kQ/mcBpYjFXrhKAFa8MJXGdw2j6DIo\"",
   "verb": "post",
   "id": "z125jb5yhq3dyfwe5224exwiqruvtda0i.1360594391049454",
   "published": "2013-02-11T14:53:11.049Z",
   "updated": "2013-02-11T14:53:11.049Z",
   "actor": {
    "id": "113706774556650311061",
    "displayName": "Sancho Virág Attila",
    "url": "https://plus.google.com/113706774556650311061",
    "image": {
     "url": "https://lh3.googleusercontent.com/-9AVmWRcEmwA/AAAAAAAAAAI/AAAAAAABgrM/zA_wxyVts7s/photo.jpg?sz=50"
    }
   },
   "object": {
    "objectType": "comment",
    "content": "Sorry for a lot of comments, but I have a new problem. :)\u003cbr /\u003eAll page shows all posts which created for one only. What could be the problem?\u003cbr /\u003e\u003cbr /\u003eExample I shared this the test shared post which included comments: \u003ca href=\"http://goo.gl/mltze\" class=\"ot-anchor\" rel=\"nofollow\"\u003ehttp://goo.gl/mltze\u003c/a\u003e\u003cbr /\u003eBut the same G+ comments included on this page also: \u003ca href=\"http://goo.gl/BTNxV\" class=\"ot-anchor\" rel=\"nofollow\"\u003ehttp://goo.gl/BTNxV\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e(tnx \u003cspan class=\"proflinkWrapper\"\u003e\u003cspan class=\"proflinkPrefix\"\u003e+\u003c/span\u003e\u003ca href=\"https://plus.google.com/113265892681003873244\" class=\"proflink\" oid=\"113265892681003873244\"\u003eMartin Matysiak\u003c/a\u003e\u003c/span\u003e)"
   },
   "selfLink": "https://www.googleapis.com/plus/v1/comments/z125jb5yhq3dyfwe5224exwiqruvtda0i#1360594391049454",
   "inReplyTo": [
    {
     "id": "z125jb5yhq3dyfwe5224exwiqruvtda0i",
     "url": "https://plus.google.com/102817283354809142195/posts/Ch1e36yt4aD"
    }
   ],
   "plusoners": {
    "totalItems": 0
   }
  },
  {
   "kind": "plus#comment",
   "etag": "\"egWOTnJQshDUW7mcQ5TTH5LK5kQ/8waRZoGwv8DlAa-CZPGS0-mydoQ\"",
   "verb": "post",
   "id": "z125jb5yhq3dyfwe5224exwiqruvtda0i.1360697414606157",
   "published": "2013-02-12T19:30:14.606Z",
   "updated": "2013-02-12T19:30:14.606Z",
   "actor": {
    "id": "102817283354809142195",
    "displayName": "Jenny Murphy",
    "url": "https://plus.google.com/102817283354809142195",
    "image": {
     "url": "https://lh4.googleusercontent.com/-yth5HLY4Qi4/AAAAAAAAAAI/AAAAAAAAPVs/fAq4PVOVBdc/photo.jpg?sz=50"
    }
   },
   "object": {
    "objectType": "comment",
    "content": "\u003cspan class=\"proflinkWrapper\"\u003e\u003cspan class=\"proflinkPrefix\"\u003e+\u003c/span\u003e\u003ca href=\"https://plus.google.com/113706774556650311061\" class=\"proflink\" oid=\"113706774556650311061\"\u003eSancho Virág Attila\u003c/a\u003e\u003c/span\u003e They both contain the same ID on lines 68 and 131 respectively:\u003cbr /\u003e\u003cbr /\u003e  &lt;div class=&quot;g-comments-for z12ewluort3ygpsqo04cgrmi1y2rvrqgwlk0k&quot;&gt;&lt;/div&gt;\u003cbr /\u003e\u003cbr /\u003ez12ewluort3ygpsqo04cgrmi1y2rvrqgwlk0k is the value that controls where the JavaScript will pull the comment from."
   },
   "selfLink": "https://www.googleapis.com/plus/v1/comments/z125jb5yhq3dyfwe5224exwiqruvtda0i#1360697414606157",
   "inReplyTo": [
    {
     "id": "z125jb5yhq3dyfwe5224exwiqruvtda0i",
     "url": "https://plus.google.com/102817283354809142195/posts/Ch1e36yt4aD"
    }
   ],
   "plusoners": {
    "totalItems": 0
   }
  }
 ]
}
    [ <=>                                   ] 3,532       --.-K/s 時間 0.001s

2013-06-05 20:08:30 (5.12 MB/s) - stdout へ出力しました [3532]

2013年6月1日土曜日

Google+の記事についたコメントをブログやWEBページに貼り付ける

ブログやWEBページにGoogle+から付けられたコメントを表示する方法には
がありますけど、上記のやり方は特定のURL(WEBページ)と関連したGoogle+コメントしか表示できません。従って、例えばNoz Oさんのブログのように、最初にGoogle+に投稿した記事をその後にブログ記事にした場合、元のGoogle+記事がブログと関係づけられていないから、Google+コメントを上記のやり方ではブログに表示できません。そういう場合に、Google+の投稿についたコメントをG+以外のWEBページやブログに貼り付けるやり方を説明します。
  1. APIキーというものを以下の手順で取得します
    1. https://code.google.com/apis/console/をクリックして下さい。
    2. 左側の「Service」をクリックしてから「Google+」をクリックして下さい。始めての場合は「OFF」を「ON」にする必要があります。
    3. 左側の「API Access」をクリックするとAPI keyが表示されます。
  2. 対象となるGoogle+記事の記事IDをhttp://wheresgus.com/urltoidに記事のURLを入力して取得します。リンク切れの場合はhttp://gusclass.com/blog/2012/12/18/getting-an-activity-id-from-a-google-post-url/から辿って下さい。その方法がうまく動かない場合Google+記事のHTMLソースを表示して「data-update-id」をサーチすると記事IDがわかります(2013年6月1日現在)。例としてhttps://plus.google.com/102903912989809953917/posts/dxwNTTYaBmqの記事IDはz13odvgjpw2uvvzyw04cdfcjlxnyvtzpqy40kであることがわかります。
上記の準備が終わったら、下記のJavascriptをHTMLを直接編集してコメントを設置したい場所に貼り付けてください。APIキーと記事IDを上記で得たものに置き換えて下さい。

<div class="g-comments-for 記事ID"></div>
<script type="text/javascript">
// This file was originally made by Jennifer Murphy, and
// downloaded from http://little418.com/2011/12/google-comments-on-your-static-html-blog.html

var commentr = commentr || {};
var apiKey = "APIキーをhttps://code.google.com/apis/console/をから入手して下さい";

function commentrLoad() {
  gapi.client.load('plus', 'v1', commentr.go);
  gapi.client.setApiKey(apiKey);
}

// search for g-comments-for classes
commentr.go = function() {
  //  Find the comment elements to process
  var fetchElements = document.getElementsByClassName('g-comments-for');
  for (var i=0; i < fetchElements.length; i++) {
    var activityId = fetchElements[i].classList[1];
    commentr.fetchComments(activityId);
  }
}

commentr.fetchComments = function(activityId) {
  var request = gapi.client.plus.comments.list({
    'activityId': activityId,
    'maxResults': '500'
  });
  request.execute(commentr.parseComments);
}

commentr.parseComments = function(responseJson) {
  var activity = responseJson.items[0].inReplyTo[0];
  var comments = responseJson.items;

  //find element to insert into
  var insertionElements =
      document.getElementsByClassName('g-comments-for ' + activity.id);
  var insertionElement = insertionElements[0];

  var newContents = "";
  for (i = 0; i < comments.length; i++) {
    var actor = comments[i].actor;

    var commentBody = comments[i].object.content;

    //do the insertion
    newContents += "<dt><a href='" + actor.url + "'><img src='" +
        actor.image.url + "'> " + actor.displayName +
        "</a>:</dt><dd>" + commentBody + "</dd>";

  }
  insertionElement.innerHTML = "<dl>" + newContents +
      "</dl> <p class='g-commentlink'>コメントを追加するには <a href='" +
      activity.url + "'>ここ (Google+に移動)</a> をクリックして下さい.</p>";
}
</script>
<script type="text/javascript" src="https://apis.google.com/js/client.js?onload=commentrLoad">
</script>

以下実施例です。プロフィール画像の後に改行が入ることが気に入らない場合、プロフィール画像はHTMLのdtで実現されているので関連するスタイルをCSSで調整して下さい。


以下はグーグルブロガーが提供するこのブログ記事へのコメント欄です

2013年5月22日水曜日

wheezy (Debian Linux 7.0)にアップグレードしたらpukiwikiが動かなくなった

Debian Linux 7.0 wheezyにアップグレードしたらpukiwikiが動かなくなって困っている人は結構いるのではないかとおもいます。私の場合は下記で解決しました。
  1. Error: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20100525/suhosin.so'  というエラーがerror.logに書いてある場合、wheezyでphp5-suhosinパッケージが無くなったことが原因なので、apt-get --purge remove php5-suhosin するとこのエラーは消える
  2. ここに書いてあるやり方でpukiwikiのソースを修正する。hex2binとhtmlspecialchars関数がphp 5.4で変わっているのが原因でそこらへんを修正すればうまく動くようになる。
本家pukiwikiは現状ではメンテナンスと更新がほとんど行われていない。Pukiwiki plus!やpukiwiki advanceという派生版はある程度更新されているようである。

2013年5月19日日曜日

Google Schemer

Google Schemer はGoogle+の自分のサークルに入っている人のやりたいことや趣味を表示してくれて、自分のやりたいことや趣味も他人に表示してくれる面白いサービスで、Androidアプリ もある。

しかし、自分が登録したやりたいことを削除したら新しいことを登録できなくなり、まともに使えなくなった。なので自分のandroid端末からアンインストールした。

2013年5月17日金曜日

ubuntuとdebian linuxにおけるMIME補助プログラムの設定

ubuntu 13のmew (emacs上メールリーダー)では、ワードファイルが添付されたメールに既に無くなったoofficeを起動するし、PDFとPostsciriptにはそれぞれ標準でインストールされないxpdfとgvを起動しようとし、その度にファイルが無いと言われて不便極まりない。以下のような設定を.emacsですれば直る。
(setq mew-prog-msexcel-ext "libreoffice")
(setq mew-prog-mspowerpoint-ext "libreoffice")
(setq mew-prog-msword-ext "libreoffice")
(setq mew-prog-ooffice "libreoffice")
(setq mew-prog-pdf-ext "evince")
(setq mew-prog-postscript "evince")
なお、mew取説の該当部分はここ

2013年5月13日月曜日

NFSホームディレクトリでログイン出来なくなった


  • Debian/Linux 7やUbuntu Linux 13.04のクライアントから
  • Debian/Linux 6で動いているNFSサーバーを
マウントしてホームディレクトリをNFS上に置くと、クライアント側でユーザーがgdmやlightdmでログインできなくなる。そのとき
  • サーバー側で kernel:  lockd: cannot monitor クライアントパソコン名
  • クライアント側で lockd: server サーバー名 not responding, still trying
というエラーメッセージが出る。その理由は、gdmやlightdmなどのデスクトップマネージャーが、ホームディレクトリ上のファイルをロックしようとしているが出来ないことが原因となっている。

対応策としては、なぜかNFSがtcp経由で行われているので、クライアント側の/etc/fstabにproto=udpを付け加えれば直った。proto=udpを付けると、クライアント側で「lock,local_lock=none」付けてNFS経由でのロッキングを完全に行うようにしても、今のところ問題なく動作している。なお、ロッキングがうまくいっていないときは、ここにあるサンプルプログラム がうまく動かずクライアント側で実行したときにハングアップするが、ロッキングがうまくいくようになると前述のサンプルプログラムがうまく動作するようになる。