スポンサーリンク

2016年8月28日日曜日

小学生でも分かる相対性理論


相対性理論は難解?

20世紀の物理学の最大の成果は相対性理論と量子力学です。特にアインシュタインの相対性理論は時間の進み方が変化したり、ブラックホールという変なものを生み出してしまったりと、それまでの常識を引っくり返すような結論を導き出し、世間をあっと言わせました。難解な理論の代表とでも言える相対性理論は、専門的な勉強をした人でなければ理解できないと思っている人は多いのではないでしょうか?しかしその根底にあるアイデアは驚くほど単純なものです。

2016年8月26日金曜日

Android Studio で依存性循環に立ち向かう

依存性循環とは

漫然とプログランミングをやっていると、ついクラス間の参照(依存性)に循環が発生してしまいます。オブジェクト指向プログラミングの原則では依存性の向きは一方向であるべきであり、循環は悪しき存在とされています。循環があるとクラス間の結合が密になり、改造に対して脆弱になります。

例えば ClassA が ClassB を参照し、ClassB も ClassA を参照するとクラス間の依存性に循環が発生します。ここで両クラスが別のパッケージに属しているとパッケージ間の依存性循環にもなります。

このように二つのクラス間で相互参照が発生している場合はまだ分かり易いのですが、これが A → B → C → A の様に三つ、またはそれ以上のクラスを介して循環していると直感ではなかなか判別できません。

Android Studio にはこの依存性の循環を検出する仕組みが備わっています。この記事は IntelliJ IDEA にもそのまま適用できる内容ですが、自分のフィールドが Android Studio なので、Android Studio をベースに説明していきます。

2016年8月24日水曜日

Inkscape で正確な U字 を描く

Inkscape で正確なU字図形を描こうと思ったところ、はてどうすればいいのかと迷ってしまいました。分かってしまえばどうってことないのですが、ネット上でもなかなか情報が見つけられなかったので、以下に手順を示します。

Android Activity の onNewIntent() とは

Google のあるサンプルコードを見ていたら Activity の onNewIntent() なるメソッドを使っていました。onCreate()onPause(), onResume() 等はライフサイクルメソッドとしてお馴染みですが、onNewIntent() はあまり見たことがありません。この onNewIntent() が何者なのか調べてみました。

2016年8月23日火曜日

Firebase Analytics が使用するAndroidアプリのパーミッション

Google には現在、「Google アナリティクス」と「Firebase Analytics」の二つの Analytics サービスがあります。Google アナリティクスは昔からあるサービスで、Firebase Analytics は Google が2014年に買収した Firebase 社の流れを汲むサービスです。どちらも似たようなサービスなので、今後両者の関係はどうなっていくのかと思っていましたが、とりあえずはウェブ関係は Google アナリティクス、モバイルアプリは Firebase Analytics という棲み分けになるようです。

2016年8月21日日曜日

Blogger の AdSense 404ページ対策

ブログの404ページにAdSense広告を表示するとポリシー違反になるのはよく知らています。つまらない事でアカウント停止をくらう前に、出来るだけのことはやっておきたいものです。

とは言いつつ、自分も最近まで放っておいて、ようやく重い腰を上げ対策を行ないました。やってみると結構苦労したので、備忘録として記録を残しておきます。


まずBloggerにはAdSense広告を配置するにも様々な方法があります。テンプレートに直接貼り付ける方法やガジェットを使う方法があり、ガジェットを使うにしても、「Google AdSenseガジェット」を使う方法や「HTML/JavaScriptガジェット」を使う方法などがあります。

ここでは比較的よく使われる「HTML/JavaScriptガジェット」で AdSense を貼り付けた場合に適用できる方法を説明します。「Google AdSenseガジェット」にも適用できるかもしれませんが、確認はしていません。

まず404ページで広告を非表示にする方法を調べていると、ざっと以下のページが見つかります。

 Bloggerの404ページでAdSense(アドセンス)を非表示にする
 Bloggerの「404 ページ」をカスタマイズする方法

これらのページで解説しているのは、基本的には以下の様な方法です。

<b:if cond='data:blog.pageType != &quot;error_page&quot;'>
  AdSenseウィジェットのコード
</b:if>

<b:if ..> .. </b:if> タグでAdSenseウィジェットのコードを囲むと説明されています。(Bloggerの管理画面ではガジェットとウィジェットという言葉が混在して使われています。どちらも同じ意味なのであまり気にしないでください。)

Blogger ではレイアウトを定義するのに、HTMLを独自に拡張した構文が使えます。公式な解説は ここ にあります。上のやり方はこれを利用したものです。

たったこれだけの事なので簡単にできると思っていましたが、やってみるとこれがなかなかうまく行きません。

まず Blogger の管理画面から テンプレート → HTMLの編集 を選択し、テンプレートの編集画面に入ります。「ウィジェットへの移動」ボタンからAdSenseを貼り付けたウィジェットを探します。(ここでは「ウィジェット」という言葉が使われています。)「HTML/JavaScriptガジェット」を使った場合は HTML1 とか HTML2 といった id が付いていると思います。

ジャンプすると以下の様なコードが見つかると思います。これがテンプレートに貼り付けられたガジェット(ウィジェット)コードです。コードが折り畳まれているかもしれませんが、行番号横の三角マークをクリックして展開したものです。ここには広告ユニットコードは含まれていないので、ユニットidで検索しても見つかりません。

<b:section class='tabs' id='crosscol' maxwidgets='1' name='Cross-Column' showaddelement='yes'>
  <b:widget id='HTML3' locked='false' title='スポンサーリンク' type='HTML' version='1' visible='true'>
    <b:includable id='main'>
      <!-- only display title if it's non-empty -->
      <b:if cond='data:title != &quot;&quot;'>
        <h2 class='title'>
          <data:title/>
        </h2>
      </b:if>
      <div class='widget-content'>
        <data:content/>
      </div>
      <b:include name='quickedit'/>
    </b:includable>
  </b:widget>
</b:section>

さて、このコードの中のどの部分を <b:if> .. </b:if> で囲めば良いのでしょうか?

「ウィジェットコードを囲め」ということなので、まずは <b:widget ...> ... </b:widget> の部分を囲んでみました。しかしこれはうまくいきません。というのは、「テンプレートを保存」ボタンを押してもコードを保存してくれないのです。
Bloggerのテンプレートエディタは保存時にかなり色々な事を厳密にチェックしているらしく、少し不備があると全く保存してくません。かと言って、エラーや警告を出してくれる訳でもなく、まったく不親切なエディタです。

次に一つ外側の <b:section ...> ... </b:section> の部分まで囲んでみました。結論から言うとこれは、うまく行くものと行かないものがありました。自分のブログで言うと、ヘッダに配置したものについてはうまく行きましたが、それ意外の部分に配置したものについては、これはまたエディタが保存してくれないのです。これについては理由がさっぱり分かりません。

さてどうしたものかと、更に調べてみると、以下のページが見つかりました。英語版のAdSenseヘルプフォーラムの記事です。
https://productforums.google.com/forum/#!topic/adsense/58zUGFAFh_I

ここに書いてある方法を適用してみたのが以下のコードです。

<b:section class='tabs' id='crosscol' maxwidgets='1' name='Cross-Column' showaddelement='yes'>
  <b:widget id='HTML3' locked='false' title='スポンサーリンク' type='HTML' version='1' visible='true'>
    <b:includable id='main'>
      <!-- Don't show Ads on error page -->
      <b:if cond='data:blog.pageType != &quot;error_page&quot;'>
        <!-- only display title if it's non-empty -->
        <b:if cond='data:title != &quot;&quot;'>
          <h2 class='title'>
            <data:title/>
          </h2>
        </b:if>
        <div class='widget-content'>
          <data:content/>
        </div>
      </b:if>
      <b:include name='quickedit'/>
    </b:includable>
 </b:widget>
</b:section>
 
<b:if ..> のコードをウィジェットの内部の追加します。これであれば保存もでき、うまく動きました。自分のブログに貼り付けてある三つの広告全てに適用しました。

AdSenseの404ページ対策は既にほとんどの人がやっていると思ったていたのですが、具体的なコードまで示して説明しているページが見つからず、結構苦労しました。まさかウィジェットの内部に記述するなんて想像もつきませんでした。しかしみんなどうしているのでしょう?ひょっとして対策をしている人あまりいないのかな?

2016年8月19日金曜日

Androidアプリのパーミッションを確認する方法

Android アプリの生命線とも言えるパーミッション。このパーミッションを確認しようと思ったら、意外にあちこちに情報が分散していて、まとまったものがありません。エンドユーザーの立場で確認する場合と、アプリ開発者の立場で確認する場合ではやり方が全く違います。色々なパーミッションの確認方法を自分なりに整理してみました。

2016年8月16日火曜日

星が一生を終える時


太陽のように明るく輝く星もいつかは燃料を燃やし尽くしてしまいます。しかし恒星の様に大質量の物体は燃え尽きても、そのまま燃えカスの塊として宇宙に浮かんでいることはできません。
そもその恒星が一定の形や大きさを保っていられるのは、重力によって収縮しようとする力と、燃料が燃えて発生する内圧が釣り合っているからです。星が燃え尽きるということは、この内圧が無くなり、重力が梯子を外されたかたちになります。

2016年8月4日木曜日

Google ユーザーが知っておくべき 10 の URL

我々の生活は知らず知らずのうちに Google に絡めとられています。ネットを使う以上何らかの形で Google のサービスに関わっていると言ってもいいでしょう。しかしあまりにも広範囲な Google サービス、なかなか全体像が捉めないものです。そこで Google ユーザが知っておくと便利な URL をまとめてみました。

2016年8月2日火曜日

Genymotion のアップデートでまたエミュレータが起動しなくなった

Android エミュレータの Genymotion を ver.2.7.2 にアップデートしました。Genymotion のアップデートは仮想マシンが引き継げないのは承知してたので、仮想マシンを作り直し、起動してみると、あれれ?起動しません。バージョンアップの度に問題が出るのは Genymotion 毎度のことなので、やれやれまたかといった感じです。