2014年6月22日日曜日

Serviceが起動しない!?

AndroidでServiceを起動させたくて「startService」を呼びました。
普通ならこれでサービスが起動する!はず。
ところが起動してるはずのServiceのonStartCommandが呼ばれない。。。
起動かけてるのはこんなコード。
@Override
protected void onCreate(Bundle savedInstanceState) {
    Intent serviceIntent = new Intent(context, MyService.class);
    startService(serviceIntent);
}
これ以上ないくらいにシンプルなので、間違いようがないのになんで!?

いくら悩んでもわからないので、諦めて就寝。
起きてもう一度Android Studioさんとご対面。
あ!!!!!manifestにService定義がない。
それだけのことでした。

教訓:Service使うときはクラスのひな形作ったらすぐにAndroidManifest.xmlにServiceの定義を書きましょう。

2014年3月7日金曜日

MacBook Airが充電できない

明日はMacBook Air(以下 MBA)とお出かけだ!
バッテリーの残りが半分くらいにまで減ってるから充電しておこう。。。
MagSafe2のLEDが点かないんですけどΣ( ̄Д ̄;)がーんっ!

慌てて原因とか対処法とかをGoogle先生に聞いてみました。
  • アダプタを外して1分待て
  • SMC(システム管理コントローラー)をリセットすべし
  • MBAが冷えてる(MBAを程よく暖める)
どれもやってみましたよ。でもダメだったんです。
うちのMBAはまさかどこかお亡くなりになられたのでしょうか!?
いやいや、たった3ヶ月では逝かないでしょ。逝かないで!!!

MBAがアルミボディということもあって、キンキンに冷えていたので
それならもしかしたらアダプタ側も冷えてるんじゃないの?
ということで、アダプタを暖めてみました。
そしたら復活!
やりましたよ、見事復活。
MBAが寒さに弱いというのは今回検索していてよく書かれていたので
そういうことかと思いつつも、普通の部屋で寒くてダメって。。。
いくらなんでも温室育ち過ぎるんじゃないでしょうか。
もうちょっと頑張ってほしいな。

2014年2月19日水曜日

サインインページみたいなのを作ってみた

サインイン用ページのサンプル作ってみました。
要件は非常にシンプルでこんな感じです。
  • コンテンツのセンタリング
  • マウスホバーで説明表示
  • できるだけJavaScriptは使わずCSSで処理
出来上がったものはこれ。
上が何もしていないとき、下が「email」欄にカーソルをホバーさせたときです。


2014年2月18日火曜日

MacからEC2にSSH

MacのターミナルからEC2のインスタンス(ここではAmazon Linux AMI)にSSH接続したい!
ということで
$ ssh ~/Documents/hoge.pem ec2-user@xxx.xx.xxx.xx

はい、これでつながっ。。。。。てない。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0666 for '/Users/***/Documents/hoge.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/***/Documents/hoge.pem
Permission denied (publickey).

パーミッションがダメって怒られました。
鍵は他の人がアクセスできる状態じゃあダメだよって書いてます。
了解!ならアクセス権変えましょう。
$ chmod 600 ~/Documents/hoge.pem

これでいけるでしょ。ってことでもう一回

$ ssh ~/Documents/hoge.pem ec2-user@xxx.xx.xxx.xx
Last login: *** *** ** **:**:** **** from ******.*************.***.***
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
20 package(s) needed for security, out of 51 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-**-***-***-*** ~]$ 

今度はちゃんとつながりました。
アップデートしろよって出てますが、久々に起動したのでしかたない。
ちゃんと更新しておかなきゃね。

2014年2月16日日曜日

Macで暗号化Zipを作成する方法

Macで暗号化Zipを作成したい!
ところが、コンテキストメニュー(ファイルを右クリックししてでてくるアレ)には普通のZip圧縮しかない。
さぁどうするか。。。

ターミナル開いて、「man zip」 ヘルプ最強!!

「zip -e アーカイブファイル名 圧縮対象ファイル名」

これだけ。

もしディレクトリ単位で圧縮したい場合は「-r」を追加すればいい。

簡単なお話でした。

2014年2月5日水曜日

HTMLとCSSのみで三角形を作る

あるサイトを構築中に、デザインの都合上パンくずリストを使いたくなりました。
ですが、できれば画像ファイルは使いたくない。:hoverで色は変えたい。そしてやっぱりきれいにアロー型にしたい。
ということで、CSSで三角形を作ってみました。
これに:beforeやら:afterやらを組み合わせてやるとうまい具合にパンくず作れるはず!

サイズが縦横共に0なブロック要素に対してborderを設定すると、上下左右それぞれが三角形を構成してくれます。
ちょうど対角線を引いたときの感じで正方形を分割してくれるので、それぞれに好きな色をのせれば、三角形の完成!
<span style="display: inline-block; /* table-cell などでも可(インライン要素になればよい) */
border: .5em solid transparent;
border-left-color: #00f"></span>

2つつなげるとこんなこともできます。わざわざこんな変なことしなくてもグラデーションかけろよって話かもしれませんが(汗)
<span style="vertical-align: middle; position: absolute;">
    <span style="border: .25em solid transparent; display: inline-block; border-left: .5em solid #0f0; border-right: none; height: .5em; position: relative; top: 0;"></span>
    <span style="border: .25em solid transparent; display: inline-block; border-left: .5em solid #00f; position: relative; top: -.25em; left: -.25em;"></span>
</span>
これを書くとこうなります。

2014年1月21日火曜日

Google Play ServicesでGCMを使ってみる(Google Play Services APKの存在チェック編)

詰まったところをピンポイントで覚え書き。
GCMを使おうとSDK Managerで「Google Cloud Messaging for Android Library」をインストール。。。
Derecatedになってるぞ!
GCMのオフィシャルサイトで確認してみると、「Google Play Services」を使いなさいとのこと。
いつの間に変わったのよ!?って、Google I/O 2013の時ですよね。そいえば中継見てましたよ。時間的にめっちゃ眠かった(笑)
そんなこんなでオフィシャルサイトの「Implementing GCM Client」ページを見ながら環境作りました。書いてあるまんま! とりあえずPlay ServicesのAPKがあるかどうかをチェックする必要があるらしいので、そこだけ書いて動かしてみよう。
ManifestにパーミッションとReceiverを追加しておけばよし。ここはGoogle Play Servicesに変わる前と一緒みたい。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.helloworld.app" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission android:name="com.helloworld.app.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.helloworld.app.permission.C2D_MESSAGE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:theme="@style/Theme.AppCompat"
            android:name="com.helloworld.app.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.helloworld.app" />
            </intent-filter>
        </receiver>
        <service android:name=".GcmIntentService" />
    </application>
</manifest>
で、チェック用のメソッドがこれ。
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;

private boolean checkPlayServices() {
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
            GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                    PLAY_SERVICES_RESOLUTION_REQUEST).show();
        } else {
            Log.i(TAG, "This device is not supported.");
            finish();
        }
        return false;
    }
    return true;
}