読者です 読者をやめる 読者になる 読者になる

たけぼーの備忘録

暇を持て余した人間の無意味なブログ

googleは.tkに厳しかった話

お久しぶりです、たけぼーです。

今日は、無料の独自ドメインとして有名な.tkドメインについてです。

.tkの詳しい内容はこちら

 

.tkの取得などは、昔書きましたのでそちらを。

 

さて今日のテーマは、この無料独自ドメインどれだけ効力を持っているか、と言うことについてです。ここでの効力とは、googleからの評価に関するものです。

 

先に結論を言いますと、スパム対策はちゃんとしているけど、.tkのドメインではgoogleの評価を上げる効力は弱い、ということです。

 

つまり、googleからの評価は厳しいのです。

 

私が.tkから.comに変えてみたら

まず、私の経験談をひとつ。

私はいくつか管理しているホームページがあります。その中の一つは、.tkで運用されています。これは、管理を任されたときに、できるだけお金をかけないで運用していくという要望をかなえるため、選んだ独自ドメインです。

このホームページは外部に情報を発信するためのホームページで、かつurl直打ちではなくGoogle検索での流入を狙うページでした。

まあ、これは本来ウェブページとして当然のスタンスですよね。

しかしこのホームページ、一切検索に引っかからない。1日たっても1ヶ月たっても1年たっても、まったく。

私も、SEO対策をたくさん施しました。SEO的効果がある、と見れば試してみましたが、全く変化なし

ターゲットとなる検索キーワードは、一般的なものではなく固有名詞に近いもので、本来ならすぐに検索されるはずです。競合相手もほとんどありません。

 

そのときの現象として、

  • googleでヒットすることは全くない
  • ランキングを調べると、圏外
  • googleのwebマスターツールには登録済み
  • クロールエラーなし。ちゃんとインデックスされてる
  • site:(自分のURL)ではちゃんと検索される

 

これは、完全におかしい。さすがにこれだけ検索に引っかからないと、なにか私の技術不足以外の原因を疑いたくなる。

心当たりは独自ドメイン.tkです。そういえば、無料独自ドメインはスパム認定されたりする、なんて書いてあった気がして、検索してみました。

しかし、.tkでもちゃんと検索されるページも存在する

さらに、.tkドメインは他の.com等ドメイン同等に扱われる、という情報まである。

しかし、もう.tkのせいとしか考えられない。

 

そんなとき、突然ホームページに金をかけていい宣言が出たので、有料ドメインを取得する事を提案したところ、OKが出ました。

そこで早速.comドメインを取得し、サイト移転の設定をして、googleに登録してみました。

すると、なんと1日もたたずに検索にヒットするようになったのです!

 

.tkについて考える

この経験から、やはり.tkはgoogle的に評価が低いのかなと思います。

おそらく、スタート時におけるgoogleの評価が他のドメインより低いのでは?という気がします。確証はないですけど、そんな気がします。

つまり、被リンクも多くコンテンツも充実しているようなサイトなら検索されるけども、かなりコンテンツで評価をあげないといけない、という感じではないでしょうか。

海外の掲示板には、.tkのドメインをとることはseoとして自殺行為だ、とまで書かれているものが存在するため、評価が厳しいという私の予想は当たっている気がします。

 

そのため、被リンクを得にくいサイト(小規模なサイトやブログ)では、.tkなどの無料独自ドメインではなく、ちゃんとお金を払ったものがいいのかな、と思います。サイトが出来立ての頃って、内容とか充実させるのが大変ですから、サクッと検索されるようになった方がいいですよね。

 

最後に

ここでちゃんと言っておきますが、.tkは無料であることだけでも十分素晴らしいサービスです。私的な利用をする(どこかに広めるためでない)ページならこれで十分なのかな、と思います。私もよく利用させてもらってます。

 

自分が.tkについて調べてた時にこういうこと知ってればな、と思いましたので、誰かの参考になれば幸いです。

 

最後に、ここに書いてある内容は筆者の予測がかなり含まれています。それが本当である確証はありませんので、あくまで参考として読んでください。

 

ではまた。

WordPressのプラグイン「Elementor」がすごすぎる

WordPress

f:id:takebo_blog:20170317213257p:plain
こんにちは、たけぼーです。
前回に引き続き、WordPressネタです。

管理中のWordPressサイトを3月中にリニューアルしなければならず、最近こればっかりに私の時間がとられてしまっている今日この頃で、せっかくやるんだったらブログに残しておこう、というしょぼい理由でWordPressネタが続いています。すいません…

誰もが思う理想

WordPressって、webの知識がない人でも簡単にホームページができることが特徴です。
私が作成中のページも、基本的にはwebの知識が一切ない人がバンバンページを増やしていく予定なので、WordPressはぴったりです。

しかし、WordPressの標準機能では、やはりhtmlやcssを駆使して作るような複雑なレイアウトを実現することは難しく、プラグインを多用しなければならなかったりします。

ここでみんなが思います(たぶん)。簡単にグレードの高いページが作れないか、と。

ここで登場、魔法の秘密道具。

タッタタタッタッ、タッタタタッタッ、タッタタタッタッターーー。
「エレメンターー」

Elementorという強者登場

すいません、ドラえもん風になってしまいました。いつかやってみたかったんです(笑)

では本題へ。Elementorというプラグインが今回の主役です。

Elementorは、無料のWordPressプラグインで、公式ディレクトリでダウンロードできます。
elementor.com

このElementorは、マウス操作で簡単にホームページをパーツを組み合わせて作り上げることができる、画期的なプラグインです。
ホームページビルダーのような機能を実現してくれます。
こちらの紹介ムービーをご覧ください。

Elementor - The Fastest, Free Live Page Builder For WordPress

このプラグインのいいところは、簡単にブロック分けしたリ、アイコン付きのボタンを配置したり、スライドショーや動画を配置したりといったような、美しいホームページ作りを手助けする機能が満載なところです。

さらに、各要素にcssのclass名を個別に設定することができ、style.cssによるデザインのカスタムも可能です。個人的には、この機能が一番好きです。

これを使えば、インスピレーションで簡単にページを作ることができるので、私のようなwebが専門でない人でも、Wordを操作するようにホームページを作成することができます。

まだまだいいところはたくさんあります。
ぜひ、ご利用ください!

ではまた。

WordPressの無料テーマ「Cronus」が使いやすい

WordPress

f:id:takebo_blog:20170317204434p:plain
こんにちは、たけぼーです。
ご無沙汰していて申し訳ないです…

今日はWordPressネタです。

スタイリッシュなテーマを探す

私が管理を任されているWordPressのホームページがあるのですが、ドメインを変更することになりまして。
じゃあ、いっその事ホームページ一新しちゃえ!的軽い気持ちでレイアウト変更を始めました。

BizVektorから変更

以前はかの有名なBizVektorを使い、ホームページを構築していました。

BizVektorは大変優れたテーマなのですが、スタイリッシュさに欠けると言いますか、現在主流な透明感のあるホームページに憧れていたため、新たなテーマを探しました。
国産のテーマが良かったのですが、どこか スタイリッシュさに欠ける気がしました。

思い切って海外に手を出す

しょうがないので、国産じゃなく海外製のテーマに手を出そう!と思い検索していると、いいのがたくさんでてくるんですよ!
ほんとに素晴らしいものばかりで、これは使える!と思いました。

しかし、海外製のテーマはホームページに分けて書くような、例えば会社概要や活動内容などといった内容を、トップページにまとめて書くというスタイルが主流のようで、すべての内容が1ページに収まるようなつくりとなっていました。
これでもいいのですが、日本ではYahooのようにいろんな情報がブロックでいっぺんにまとまったようなページが人気ですから、今回もそれに見習いたいものです。

こんな条件を加味して探したところ、とてもいいものが出てきました!その名もCronus。

海外製テーマ "Cronus"

Cronusはmythemesさんが開発した無料のWordPressテーマです。
https://ja.wordpress.org/themes/cronus/ja.wordpress.org
このCronusは、Tempoというまた別のテーマの子テーマという形で作られています。
ですから、インストールするテーマは、CronusとTempoのふたつです。
Cronusだけだとエラーが出ますので、ご注意ください。

私が気に入った良いところ

このテーマで私が気に入っているところは、主張しすぎない・スタイリッシュ過ぎない、というところです。

スタイリッシュなものを求めていたくせに、どういうことなんだ、とお思いだと思います。
これは、私が管理するページが利益を求めるようなページではなく、あまり派手である必要がないからです。
かといって、今風なホームページにしたい。この派手ではなく今風であるという微妙なバランスを実現したのが、このテーマでした。

また、ほかのテーマの中には、トップページの内容ががちがちに決められていて、逆に使いにくいものも見られましたが、このテーマはそのようなことはなく、自由にカスタマイズできるため、主張が激しくなく使いやすいです。

ちょっと困る悪いところ

このテーマ自体が子テーマとなっているため、functions.phpに書き込んだりするような直接的なカスタマイズは、Cronusのファイル自体に行わなければなりません。
子テーマの子テーマは作成できないため、Cronusが更新されると変更点が消えてしまいます。
ですから、テーマの更新にはご注意ください。


ということで、今日はCronusという素晴らしいテーマをご紹介しました。

ということで、今日はこのあたりで。
ではまた。

BigDecimalで誤差が出てしまった話

プログラミング

こんにちは、たけぼーです。
今日はJavaで正確な数値計算を行うための、BigDecimalについてです。

Androidのプログラミングをしていたら、誤差のない計算が必要になる時がありますよね。
例えば、電卓なんかを作るなら誤差が出たら大変です。

誤差が出る原因は、値をfloat,double型として計算するからです。
どうも、10進数を2進数に直して計算すると、正確に2進数に変換できないということが原因だそうです。

こんなときは、BigDecimal型という特殊な型を使って計算を行えばよいのです。
BigDecimalは、誤差を生じさせないように計算することを目的としたものだそうです。

私もBigDecimalで計算すればいいや、と思って使ったのですが・・・

まだ誤差が出る!!

おいおい、なんなんだこれは。誤差が出ないって言ったから使ったのに・・・

16×0.03(=0.48が正解)を小数点以下第2位まで切り捨て計算したところ、堂々と0.47と表示しやがる。
なんなんだ君は、という気分ですが。

どう調べても、BigDecimalでは絶対に誤差は出ません!と書いてあるので、どこが間違いなのかわかりませんでしたが、やっと解決策を見つけました。

では、解決策へ参りましょう。

BigDecimalで誤差が出ないようにする

原因は、どのようにBigDecimalの生成のときにdouble型が混ざっていたからです。
元のソースは以下のとおり。

//これでは結果が0.47となる
double a = 0.03;
double b = 16;
・・・
BigDecimal db_a = new BigDecimal(a);
BigDecimal db_b = new BigDecimal(b);
BigDecimal db_c = a.multiply(b).setScale(2,RoundingMode.FLOOR);
double ans = db_c.doubleValue();

ここでの失敗の原因は

BigDecimal db_a = new BigDecimal(a);

ここです、悪の根源は。
この生成部分でカッコ内にdouble型のデータを渡していることです。
double型自体が元から誤差を含んでいるものなので、このままでは誤差が受け継がれてしまうようです。

誤差が出ないためには以下のように変更すれば良いのです。

//これで結果は0.48となる
//double から Stringに変更
String a = 0.03;
String b = 16;
・・・
//String型で渡される
BigDecimal db_a = new BigDecimal(a);
BigDecimal db_b = new BigDecimal(b);
BigDecimal db_c = a.multiply(b).setScale(2,RoundingMode.FLOOR);
double ans = db_c.doubleValue();

a,bをString型に変更することで、BigDecimalの生成時には文字列として渡されるので、誤差は出なくなります。
実際に計算すると、ちゃんと正確な値が出ました。

ということで、今日はここまで。
ではまた。

参考

今回参考にさせていただいたのはこちら。非常に助かりました。

www.slideshare.net

cocos2d-xでHelloWordがコンパイルできない

プログラミング

こんにちは、たけぼーです。

最近cocos2d-xに手を出し始めました。
macXcodeを使ってコーディング中です。
今までWindowsを使っていましたが、iOSのプログラミングにはmacが必要ということで移行してきた初心者です。

Xcodeの洗礼

初めてcocosのプロジェクトを作成し、さあコンパイルしてみよう!と意気込んでいたその時!

謎のエラーに見舞われたのです・・・

HelloWorldScene.cppの70行目あたりにある

sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

が赤く表示され、EXC_BAD_ACCESSと表示されています。

What's!? なんじゃこれ!

これがmacの洗礼なのか・・・
なんて思いながら、google先生に聞いてみました。

すると、参照している画像が上の処理を行ったときにメモリに存在しないことが原因である、ということがわかりました。
いやいや待ってくれ。一行前に追加したばかりの画像が次の行で消えているってどういうことなんだ!?

困り果てて諦めようとしていたその時、spriteの文字にカーソルを合わせると、NULLと表示されていることに気づきました。

え!?NULLじゃダメでしょ!

またまたgoogle先生に聞いてみたところ、やっと解決策が見つかりました!
ありがとう、google

コンパイルエラーを治す

これによると、このプロジェクトのbuild Settingsの項目が関係しているらしい!

では、直してみましょう。

プロジェクトのトップに表示されている青マークをクリック
f:id:takebo_blog:20170228171633p:plain
私の場合、プロジェクト名をTestとして作成したため、Testと表示されています。
この中のBuild Settingsをクリックすると、項目がたくさん出てきます。
この中の『All』を選択し、検索欄にmetaと入力することで、Compress PNG Files - Packagingの項目を表示させます。
この中のRemove Text Metadata From PNG Files の項目をNoにしてから再度コンパイルすると、動きました!
f:id:takebo_blog:20170301101358p:plain


これなんのための設定なんだろ、わからん。

まあ、成功したからいいですよね!笑


ではまた。

firebaseのNotificationでプッシュ通知をやってみる

プログラミング

こんにちは、たけぼーです。
今回は、googleが無料で提供しているfirebaseのNotificationを使ってみようと奮闘しました。

きっかけは、プッシュ通知とかできたらかっこよくね?という安直なもの。
いやー、苦戦しました。
素人の私がかっこよさだけでやると大変なことになりましたよ。
ですが、今後プッシュ通知は何かと役に立つので、いい経験になったと思います。

今回参考にさせていただきましたサイトはこちら

qiita.com

このページを見れば、利用登録からプッシュ通知の送信まで、一気にわかります。
正直、私が新たに書く必要がない 笑

ですが、ところどころハマったポイントがあったので、そこを書こうと思います。


では、まいりましょう。

まずは、ここに書いてあるようにやっていったのですが、いざやってみますと、エラーで落ちてしまう。
なぜなんだ・・・

エラーをよーく見てみると、なにかしらのパーミッションが足りません、的なエラーが出ました。
google大先生に聞いてみると、どうもAndroidManifestに

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

を、足さなければならないらしいです。それ先に言ってくれよ・・・

こんなの誰も書いてなかったので、もしかしたらfirebaseと関係ないのかもしれません。
ですから、エラーが出たときだけ試してみてくださいね!

これでエラーもなく通知を受け取れるようになったわけですが、実はこれ、アプリがバックグラウンドにいるときだけなんです。
バックグラウンドならシステムが自動で通知を生成してくれるのですが、アプリが起動しているときにはまたもやエラーが出てしまいます。

これは、firebaseのメッセージを受信するserviceがアプリの中にないからで、公式のガイドにもonMessageReceivedを作成するように書かれています。

ということで、サクッと作成してみます。
もはや実用的かはわかりませんが、とりあえず通知が表示されるようになります。

package ... ;

import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.NotificationCompat;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import java.util.Map;

public class NotificationService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
        builder.setSmallIcon(R.drawable.ic_stat_create);
        builder.setContentTitle(getString(R.string.app_name));
        builder.setContentText(remoteMessage.getNotification().getBody());
        builder.setColor(ContextCompat.getColor(getBaseContext(),R.color.colorPrimary));
        builder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS);
        builder.setAutoCancel(true);
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        builder.setContentIntent(contentIntent);

        NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
        manager.notify(1, builder.build());
    }
}

Serviceとして認識させるため、AndroidManifest.xmlに追記しました。

<service
      android:name=".NotificationService">
      <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT"/>
      </intent-filter>
</service>

こちらを参考にさせていただきました。
qiita.com

これで、アプリが起動していてもプッシュを受け取ることができるようになりました。

最後に、システムが自動で通知を生成する場合(アプリがバックグラウンドにいる場合)通知に表示されるアイコンが真っ白になってしまいました。
これは、通知に表示されるアイコンが自動的にアプリのランチャーアイコンになるからです。
要するに、アイコンのシルエットが表示されるので、白いものが表示されるのです。
私はすでに通知用のアイコン(背景を透明にしてあるアイコン)がありますので、それを表示させたい。

こいうことで、システムに通知用アイコンを指定するため、AndroidManifest.xmlに追記しました。

<meta-data 
      android:name="com.google.firebase.messaging.default_notification_icon"
      android:resource="@drawable/ic_stat_create"/>
<meta-data 
      android:name="com.google.firebase.messaging.default_notification_color"
      android:resource="@color/colorPrimary"/>

これで、無事に通知を受け取ることができるようになりました!

ということで今回はここまで。ではまた。

Androidで起動時にアイコンを表示する

プログラミング

お久しぶりです、たけぼーです。


今日は、タイトル通り起動時にアイコンを表示させることを考えます。

例えば、LINEを起動したら、緑の背景にLINEのマークが表示され、そのあとメイン画面に切り替わりますよね。
今回はあれを自分でやってみよう!ってなわけです。


起動時に表示されるあの画面をスプラッシュ画面と言います。
実は、例の画面がスプラッシュというなんて知らなかったんです・・・
ですので、「あれ作りたいなー」と軽い気持ちで検索しても、全然出てこなかった 笑
スプラッシュ画面で検索すると一発なんですけどね 笑


検索すると、Activityを起動させてスプラッシュを表示させ、そのあとMainActivityにintentする、っていうものがたくさん出てきます。
こうすると、起動したときにスプラッシュを表示しながら、何かの処理を行うことができるようです。
例えば、初期データのダウンロードなんかを行うことができますね(たぶん)。

しかし、これでは、スプラッシュの前に一瞬ブランクが表示されるようです。
これでは少しダサい気がします。
今回の私の目的は、起動時にそのブランクが表示されるのをスプラッシュでごまかすことが目的だったりするので、この方法ではまずいんです。

ということで他の方法を探したところ、ありました。画期的な方法が(たぶん自分が知らなかっただけ)。


ということで、その画期的(?)な実装方法をメモしておきます。


まず最初に、背景色を決めてcolors.xmlに記述しておきます。

colors.xml

<resources>
    ...
    <color name="colorBackground">#fafafa</color>
</resources>

また、styles.xmlにスプラッシュ画面用のテーマを用意します。
以下のテーマを追記します。

styles.xml

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/splash</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
</style>

そして、drawable内にsplash.xmlを作成し、以下のようにします。

splash.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <item
        android:drawable="@color/colorBackground"/>
    <item
        android:gravity="center">
        <bitmap android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

最後に、AndroidManifest.xmlのMainActivityの部分を以下のようにします。

<activity
      android:name=".MainActivity"
      android:theme="@style/SplashTheme">
     <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
</activity>

要するに、themaを追記するだけです。

これだけで、簡単にスプラッシュ画面が出来上がります!
とても簡単ですよね!?

最後に注意が一つ。

これでスプラッシュを作ると、MainActivityの背景がスプラッシュ画面と同じになってしまいます。
ですから、activity_main.xml内のトップレベルのところで、背景色を指定してください。
例えばこんな感じ。

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:autofit="http://schemas.android.com/apk/res-auto"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.hoge.hoge.MainActivity"
        android:background="#fafafa">

これで、背景色は固定され、スプラッシュ後はいつものMainActivityが表示されます。

じつは、この背景色の指定をしていなかったため、MainActivityの背景が変な色になって困りました・・・
まあ、未熟者の私がスプラッシュに手を出したからですね 笑


今回は、こちらのページを参考にさせていただきました。
sakebook.hatenablog.com


ということで今回はここまで。ではまた。