【Android】Realmのモデルクラスを変更後、アプリを再インストールして起動するとRealmMigrationNeededExceptionが発生する

3時間ハマった

事象

Realmのモデルクラスを変更後(カラム名のリネームをしただけ)、アプリの再インストールを行って起動すると RealmMigrationNeededExceptionを吐いてアプリがクラッシュしてしまう。

原因

RealmMigrationNeededException reinstallでググったらissueに挙がっていた・・

github.com

Android6.0からアプリの自動バックアップ機能が実装されたらしく、GoogleDriveに保存するのだとか。
これが原因で、新旧realmファイルがぶつかってMigrationNeddedExceptionを起こしているっぽい。

おそらく再インストール時には以下のようになっている?
アプリのインストール

GoogleDriveからバックアップを取得

バックアップしたアプリに対して更新
(新旧realmファイルがこんにちは)

MigrationNeddedException

対策

公式ドキュメントを見る限り、以下の手順を実施すればよい。
Back up user data with Auto Backup  |  Android Developers

手順1.GoogleDriveからバックアップを削除する

f:id:hikeshiya:20180727221844p:plain
犯人
削除後にアプリを再インストールするとMigrationNeddedExceptionは起こらなかった。

手順2.realmファイルをバックアップ対象から外す

バックアップの設定ファイル(backup.xml)を作成し、AndroidManifest.xmlのapplication要素内にandroid:fullBackupContentを追加する。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hoge">

    <application
        android:fullBackupContent="@xml/backup"

 

/xml/backup.xml

<?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <exclude domain="file" path="default.realm"/>
        <exclude domain="file" path="default.realm.lock"/>
    </full-backup-content>

【Laravel】Oracleへの接続設定の方法(Windows版)

普段はMySQLだけど、どうしてもOracleを参照しないといけなくなったときのTODO

2018/03/27 手順修正

環境

Windows7
Laravel 5.5(PHP7.1)
Oracle9i Database Release 2 (9.2.0)
XAMPP 7.1.7

接続設定の方法

1.オラクルインスタントクライアントを公式サイトからダウンロードする

Link:http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html

オラクルインスタントクライアントとは、OracleDBに接続するためのものを最小限にまとめたライブラリ
ここでは都合により最新バージョンの12.2(2018/03時点)ではなく11.2をダウンロードする

・instantclient-basic-nt-11.2.0.4.0.zip
→フォルダを解凍後、instantclient_11_2にリネームしてCドライブ直下に設置する

2.環境変数を以下の通りに変更する
変数名:PATH
値:C:\instantclient_11_2;<元々の設定値>  

変数名:NLS_LANG
値:Japanese_Japan.AL32UTF8
3.コマンドプロンプトから環境変数が設定されているか確認する
C:\Users\hoge>set
...省略...
NLS_LANG=Japanese_Japan.AL32UTF8
Path=C:\instantclient_11_2;C:\Program Files (x86)~・・・
...省略...
4.C:\xampp\php\php.iniの末尾に追記する
extension=php_oci8_11g.dll
extension=php_pdo_oci.dll

★注意
PHP: 要件 - Manual より

OCI8 が 9iR2 のクライアントライブラリを使っている場合は、PHP から Oracle Database 8i, 9iR2, 10g あるいは 11g に接続することができます。 OCI8 が 10gR2 のクライアントライブラリを使っている場合は、接続できるデータベースは 9iR2, 10g, 11g あるいは 12c です。 OCI8 が 11g のクライアントライブラリを使っている場合は、接続できるデータベースは 9iR2, 10g, 11g あるいは 12c です。 OCI8 が 12c のクライアントライブラリを使っている場合は、接続できるデータベースは 10gR2, 11g あるいは 12c です。

まとめると、
php_oci8_11g.dll: 9iR2、10g、11g、12cのDBに接続できる(9i以前かつ10gR2は接続できない)
php_oci8_12c.dll: 10gR2、11g、12cのDBに接続できる(10g以前は接続できない)

extensionで指定したファイルはC:\xampp\php\extに格納されているが、XAMPP 7.1.7ではphp_oci8_11g.dllがデフォルトで入っておらず、php_oci8_12c.dllのみ設置されている。
9iR2に接続するためにはphp_oci8_11g.dllが必要なため、自力で入手する。(XAMPP5.5.19に発見したのでZIPから取得するとよい)
 
入手後、php_oci8_11g.dlをC:/xampp/php/extに設置する。
※もしphp_oci8_12c.dll適用したい場合、手順1のオラクルインスタントクライアントのバージョンを12してやり直す

5.C:\xampp\xampp-control.exeを起動し、STARTを押してApacheを起動する

起動時に「OCI.dllが見つかりません」的なエラーが出た場合、オラクルインスタントクライアントを参照できていないので環境変数を見直すこと ユーザー環境変数に定義していた場合はシステム環境変数に設定してみる

6.ブラウザからhttp://localhost/dashboard/phpinfo.phpにアクセスし、以下の通りOCI8のブロックが表示されていればOK

f:id:hikeshiya:20180322130348p:plain

7.C:\xampp\xampp-control.exeからSTOPを押してApacheを終了する
8.Laravel-oci8をcomposerでインストールする
composer require yajra/laravel-oci8:"5.5.*"

LaravelというフレームワークにはIlluminate/DatabaseにDB操作を行うモジュールが実装されていて、Laravel-oci8はこれをOracle向けに拡張したもの。
Laravel-oci8とLaravelのバージョンと統一しないといけないため、Laravelのバージョンが5.6の場合は"5.6.*"と指定しないといけない。
github.com

手順6でOCI8のブロックが表示されていない場合、インストール時に以下のエラーが発生する

yajra/laravel-oci8 v5.5.5 requires ext-oci8 >=2.0.0 -> the requested PHP extension oci8 is missing from your system.
9.Laravelのプロジェクトフォルダを開き、以下の内容で各ファイルを編集する

config/app.php(Laravel 5.5以上の場合のみ追記する)

Yajra\Oci8\Oci8ServiceProvider::class,

 
config/database.php

    ...省略...

    'connections' => [
       'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            ... 省略 ...
       ],
       'oracle' => [
            'driver' => 'oracle',
            'host' => env('DB_HOST2', '127.0.0.1'),
            'port' => env('DB_PORT2', '3306'),
            'database' => env('DB_DATABASE2', 'forge'),
            'username' => env('DB_USERNAME2', 'forge'),
            'password' => env('DB_PASSWORD2', ''),
            'unix_socket' => env('DB_SOCKET2', ''),
            'charset' => env('DB_CHARSET2', 'AL32UTF8'),
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],

    ...省略...

 
.env

# mysql
DB_HOST=192.168.xxx.xxx
... 省略 ...

# oracle
DB_HOST2=192.168.xxx.xxx
DB_PORT2=8000
DB_DATABASE2=hoge_db
DB_USERNAME2=hoge
DB_PASSWORD2=hoge
DB_CHARSET2=AL32UTF8
10.コマンドプロンプトからローカルサーバーを起動する
php artisan serv
11. プロジェクト内の適当なファイルに以下のコードを記載し、OracleDBを参照できていれば接続設定完了
$rows = \DB::connection('oracle')->select('SELECT * FROM TEST_TABLE');
dd($rows);

【Android】ボタンを押した時に波紋状のエフェクトを出す(Ripple Effect)

ボタンの背景色を変更するためにbackgroudで色指定をするとRipple Effectが表示されなくなる。
backgroudを変更するとRipple Effectの設定が上書きされて無くなってしまうため、自分で設定しないといけない。

Ripple Effectとは

ボタンを押したときに出る波紋状のエフェクトのこと。
Andoroid5.0ではRippleDrawableが導入され、実装が楽になった。
 

実装方法

ここではAndoroid5.0以降を対象に、RippleDrawableを利用して実装する。
やり方としては単純で、RippleDrawableを記述したXML(button_ripple.xml)を作成しておき、ボタンのbackground(activity_main.xml)からそれを呼び出すだけ。
(XMLじゃなくてJavaからでも実装できるが、ここではXMLからで実装する)

 

/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="@drawable/button_ripple"
        android:text="リップル!" />
</RelativeLayout>

 

/drawable/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/button_highlight_color">
    <item android:drawable="@color/button_color" />
</ripple>

 

/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="button_color">#ffffaab3</color>
    <color name="button_highlight_color">#ff4081</color>
</resources>

【Windows】Node.jsでMySQLを使う

備忘録のメモ

 

目的

・ローカル環境に設置したMySQLデーターベースに対して、Node.jsを使って参照(SELECT)する

 

必要なもの

・Node.js(https://nodejs.org/ja/

・XAMPP(https://www.apachefriends.org/jp/index.html

 

インストール方法についてはネット上にたくさん資料があるので割愛

 

とりあえずどちらもインストールまで終わったら、設定とかは何もしないで、まずはXAMPPのコンパネからApacheMySQLを起動する。赤丸のところね!

 

f:id:hikeshiya:20170111000726p:plain

 

起動したらMySQLのAdminをおして、phpMyAdminを開いて適当なデータベースを作成する。

ここでは「test」というデータベースに、「Book」というテーブルを作成。テーブルのカラムは「id」と「title」を作成。適当な値も入れとく。よくわからんかったら、いくらたつおのサイトでも見たらいい

 

f:id:hikeshiya:20170111001358p:plain

 

これでDBはOK。後はNode.js。

Node.jsのインストールディレクトリに以下のtest.jsを配置。

 

test.js

var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
port : 3306,
database : 'test'
});

connection.connect();

connection.query('SELECT * from Book;', (err, rows, fields) => {
if (err) throw err;

console.log('The solution is: ', rows);
});

connection.end();

 

次に以下のコマンドプロンプト上で「npm mysql install」を入力して、MySQLに接続するためのドライバをインストールする。

 

後はそのままコマンドプロンプトからjsファイルを実行させればOK

 

f:id:hikeshiya:20170111002413p:plain

 

ちゃんとDB参照できてるね

【Android】backgroundで背景色を指定するとクリックエフェクトが出なくなる理由

備忘録

詳細は以下のページを参考に

 

独自のBackgroundでRipple Effectを使用する - Firespeed

 

▼理由

・そもそもクリックエフェクト(※1)はbackgroundに実装されている。

・だからbackgroundに背景色を指定するとクリックエフェクトが無効になる。

 

▼対策

backgroundに背景色を指定するとき、一緒にクリックエフェクトも明示的に実装しないといけない。

 

※1 クリックしたときに波紋状に広がるエフェクト。Ripple Effectっていうらしい。

 

 

HTML5プロフェッショナル認定試験 レベル2に合格した話

f:id:hikeshiya:20160710194905j:plain
受けてきました、レベル2。

html5exam.jp

この資格、あまり人気がないせいか受験記なるものがほとんど無い。特にレベル2。
(2014年9月リリースであまり月日が経っていないからみんな知らない?資格名がダサい?w)

ということで、受けようかなって考えている人のために受験記?を。

結果

受験日:2016年6月某日
問題数:44問
合格ライン:70点
自分の点数:70点

やばすぎw
試験時間は全問見直せるくらい余裕あったかな。

どんな試験

一言で言うと、主にJavaScriptの試験です。
言語仕様や最近のWeb技術の問題とか、まぁ色々だ。でもフレームワークJQueryあたりは出ない。詳細は公式で!

利用した参考書

まず最初に購入した参考書(以下、緑本と呼ぶ)はこれ。
level1の時はこのシリーズの赤本にお世話になった人が多いんじゃないかなー。

HTML5プロフェッショナル認定試験 レベル2 対策テキスト&問題集 (Mynavi Examination Library)

HTML5プロフェッショナル認定試験 レベル2 対策テキスト&問題集 (Mynavi Examination Library)

公式認定の参考書だけど、受験した感想だと
この参考書だけで合格することは難しいと思う。。。


なぜかというと、本試験のlevel2の試験問題パターンは以下の2種類が挙げられるのだけども、

1.知識問題 ※公式のサンプル問題
以下の選択肢のうち、プリミティブな文字列が生成されるスクリプトを二つ選びなさい。


A.Number(100)
B.new Date()
C.String('abc')
D.new String('abc')
E.Date()

2.コードリーディング問題 ※公式のサンプル問題
以下のスクリプトを実行したとき、変数aの値を選択しなさい。

  function f(){
  		f = 10;
  }
  var a = f();

A.undefined
B.NULL
C.10
D.エラーになる

緑本の演習問題は、コードリーディング問題が全く載っていない。
※受験時の問題は全て選択式で、level1で出題された記述(入力)問題はなかった。公式には多少出題されるってあるけど、たまたま?

また、WebWorkersやGeolocationAPIなどを含めた試験範囲を広くカバーしているが故に、
JavaScriptの基本仕様について学ぶには解説が浅く、力不足の感が否めない。特にJavaScript未経験なら尚更かな。


ちなみにこの緑本だけやりこんだ後、公式のサンプル問題に挑戦してみたら
ほとんど解けなかったw

というわけで、Amazonレビューを参考に、こちらの参考書(以下、白本と呼ぶ)をポチ。

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで


Amazonで高評価の参考書を書店で見て回ったんだけど、
基本仕様についてはサンプルコード+図表で解説されてる箇所が多いのでこの白本が一番理解しやすかったなぁ。

ただ、こちらはあくまで入門書であって試験対策本ではない。
だから演習問題は無いけど、読みこめばコードが何でこういう動きになるのか、ってのが理解できてくると思う。




え?そもそも緑本の他に試験対策本とかないのかって?


f:id:hikeshiya:20160630001133p:plain
※2016年7月現在


察せよ・・・


勉強法(?)


厚い参考書と(現実に)向き合うのが辛いので
「じっくり時間をかけて読まずに、期限を決めて流し読みを何周もする。」方法でやってた。1週間に緑本1周とか。
最初の1周が特にしんどいけど、乗り越えると達成感が少しでて2周目のモチベにつながる。

JavaScriptは未経験だったし、
参考書を読んでいまいち理解できない場合は、実機でサンプルコードの動きを確かめたくらいかな。
サンプルコードにconsole.log()を挟んで、処理がどのような順序で動き、その際にどのような変数が
受け渡しされているのか・・・という感じ。
緑本も白本もサンプルコードはダウンロードできないので仕方なく手打ちで。まじめんどくさい。

後はひたすら緑本の演習問題やってた気がする・・・。

他には公式主催のポイント解説セミナーに参加したり。

感想

f:id:hikeshiya:20160702230200j:plain

HTML/JavaScriptスマホアプリ作ってみよかなーっと思い立ち、
予備知識がある程度欲しかったので受けたこの試験。

ギリギリではあれど、ようやく一区切りつけたからやっとゆっくりできる。
気が向いたらレベル1の受験記でもかこかな。