省エネエンジニア

効率よく稼ぎたい!

【Flutter】Firebase Storageに画像を保存する

こんにちは。
前回、写真を撮る機能をアプリに追加したのですが。

qkuronekop.hatenablog.jp

この撮った写真をFirebase Storageに保存したいと思います。

pubspec.yml

dependencies:
  flutter:
    sdk: flutter
  firebase_storage: 1.0.4

AndroidX関係でエラーになるので、下記のリンク先のバージョンに合わせます。

flutter.dev

import

import 'package:firebase_storage/firebase_storage.dart';

code

  Future<Null> uploadFile(String filePath) async {
    final ByteData bytes = await rootBundle.load(filePath);
    final Directory tempDir = Directory.systemTemp;
    final String fileName = "${Random().nextInt(10000)}.jpg";
    final File file = File('${tempDir.path}/$fileName');
    file.writeAsBytes(bytes.buffer.asInt8List(), mode: FileMode.write);

    final StorageReference ref = FirebaseStorage.instance.ref().child(fileName);
    final StorageUploadTask task = ref.putFile(file);
  }

こんな感じでファイルを作り、Firebase Strageにuploadします。

 RaisedButton(
   color: Colors.grey,
   shape: RoundedRectangleBorder(
     borderRadius: BorderRadius.all(Radius.circular(10.0)),
   ),
   child: Icon(Icons.camera),
   onPressed: () async {
     var filePath = await takePicture();
     if (mounted) {
       setState(() {
         imagePath = filePath;
       });
     }
     await uploadFile(filePath);
   },
 ),

前回作ったカメラ画面のシャッターボタンのonPressed()で、画像のパス取得後にuploadFile()を呼び出しています。

私のアプリの場合には、匿名ログインの機能を入れいているので、この状態で動作させることが可能です。

qkuronekop.hatenablog.jp

が、FirebaseAuthを入れていない場合にはデフォルトでwrite権限がないのでFirebase consoleのStorageメニューを選択し、ルールタブを開きアクセス権の変更をします。

f:id:qkuroneko:20190323074416p:plain

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

ルールをこんな感じに変更します。
これでトークンがなくてもread、writeすることができます。
ちょっと機能を試してみたい場合にはこれでいいかと思います。

こちらを参考にしました。

www.youtube.com

【Flutter】写真撮影をする

Flutterで写真を撮るアプリを作りたいと思ったのでカメラ機能を入れてみました。

使ったプラグインはこちら。

pub.dartlang.org

まだAndroidでしか試してないけどもiOS/Androidで使えます。
Androidの場合minSdkVersion 21です。

使い方

pubspec.yml

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.4.2

これを追加してPackages getします。

camera.dart

カメラ機能を追加する画面をcamera.dartとして作ります。

class CameraView extends StatefulWidget {

  @override
  State createState() => CameraState();

}

class CameraState extends State<CameraView> {
 @override
  Widget build(BuildContext context) {
  }
}

まずはStatefulWidgetで画面を作ります。

class CameraState extends State<CameraView> {

  CameraController controller;

  Future<void> getCameras() async {
    cameras = await availableCameras();
    controller = CameraController(cameras[0], ResolutionPreset.medium);
  }

  @override
  void initState() {
    super.initState();
    getCameras().then((_) {
      controller.initialize().then((_) {
        if (!mounted) {
          return;
        }
        setState(() {});
      });
    });
  }
}

initState()で使えるカメラを取得して、カメラコントローラーの初期化をします。
私が作りたいアプリの場合背面カメラの静止画だけでいいかなと思ったので1種類だけ使ってます。
機種に乗っていればフロントカメラやムービー撮影も使えるようです。

class CameraState extends State<CameraView> {
 @override
  Widget build(BuildContext context) {
    if (controller == null || !controller.value.isInitialized) {
      return Container();
    } else {
    }
  }
}

画面が起動した直後、またはカメラへのアクセス許可がされていない状態ではカメラプレビューを表示できないので、
コントローラーがnullまたはisInitializedfalseの場合にはカメラプレビューではないWidgetを返します。

class CameraState extends State<CameraView> {
 @override
  Widget build(BuildContext context) {
    if (controller == null || !controller.value.isInitialized) {
      return Container();
    } else {
      return AspectRatio(
                  aspectRatio: controller.value.aspectRatio,
                  child: CameraPreview(controller)
                 );
    }
  }
}

AspectRatioは縦横比を維持したまま、最大の大きさに広がってくれるWidgetです。
カメラcontrollerが縦横比を持っているのでそれを設定してあげるといい感じの大きさのプレビューが作れます。

CameraPreview(controller)のところが実際のカメラプレビューになります。

class CameraState extends State<CameraView> {

  Future<String> takePicture() async {
    final Directory extDir = await getApplicationDocumentsDirectory();
    final String dirPath = '${extDir.path}/Pictures/own_note';
    await Directory(dirPath).create(recursive: true);
    final String filePath = '$dirPath/${timestamp()}.jpg';

    if (controller.value.isTakingPicture) {
      // A capture is already pending, do nothing.
      return null;
    }

    try {
      await controller.takePicture(filePath);
    } on CameraException catch (e) {
      // エラー時の処理
      return null;
    }
    return filePath;
  }

 @override
  Widget build(BuildContext context) {
    if (controller == null || !controller.value.isInitialized) {
      return Container();
    } else {
      return Column(
            children: <Widget>[
               AspectRatio(
                  aspectRatio: controller.value.aspectRatio,
                  child: CameraPreview(controller)),
               RaisedButton(
                  child: Icon(Icons.camera),
                  onPressed: () async {
                      var filePath = await takePicture();
                  },
               ),
            ]
      );
    }
  }
}

シャッターボタンを追加します。
ボタンWidgetonPressed()takePicture()を呼び出します。
takePicture()では、保存先のパスとファイル名を作り、画像を保存しています。

私が作りたいアプリの場合には、写真を撮った直後に同じ画面内にサムネイルを表示しつつ、
画像をサーバーへアップロードしているのでtakePicture()が成功した場合にはファイルパスを返すようにしました。

f:id:qkuroneko:20190323071353p:plain:w320

色々装飾してますが、こんな感じになります。

ここを参考にしました。

github.com

【Flutter】Flutter + Firebase Authenticationで匿名ログイン

ここ最近はFlutetrで何かアプリを作ってGooglePlayへリリースするところまでやってみたいなと思い、アプリを作り始めています。

ただ、サーバーを用意するのが手間なので、ネイティブ以外の作業は全てFirebaseで賄おうと思っています。

とりあえずはFirebaseをFlutterアプリに入れてみます。
今回はAndroidだけですが、いずれiOSも対応したいと思います。

FirebaseをFlutterアプリへ

Flutter アプリに Firebase を追加する  |  Firebase

結構丁寧にここにやり方が書かれています。
AndroidもしくはiOSアプリにFirebaseを入れたことがある人なら簡単にできると思います。
ただ、途中やり方が変わってきます。

Firebase ConsoleからAndroidアプリを追加します。
google-services.jsonをダウンロードし、android/appに置きます。

gradle

トップレベルのgradleに

buildscript {
    ext.kotlin_version = '1.3.21'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:3.2.1'
    }
}

のように

classpath 'com.google.gms:google-services:3.2.1'

を追加します。

現時点で、もっと大きいバージョンがあるみたいですが、上にリンクしたFirebaseのページには、

注: Flutter は現在、バージョン 3.2.1 の Google サービス プラグインと互換性があります。

とあるので、バージョンは動かさないほうがよさそうです。

app下のgradleには一番下に

apply plugin: 'com.google.gms.google-services'

を追加するだけでOKです。

pubspec.yml

flutter用のfirebase pluginがあるようなので、package getで取得します。

pubspec.ymlに下記を追加。

dependencies:
  flutter:
    sdk: flutter

  firebase_core: 0.2.5+1
  firebase_analytics: 1.1.0
  firebase_auth: 0.7.0

ここでハマったのですが、

firebaseopensource.com

ここを見て最新のバージョンを使おうとすると、package getは問題なく通るのですが、ビルドが通らなくなります。

AndroidX関係でエラーになるので、下記のリンク先のバージョンに合わせます。

flutter.dev

ここに書かれているバージョンに直したところ、問題なくビルドし、機能が使える様になりました。

f:id:qkuroneko:20190315134318p:plain:w320

アプリをインストールすると、Androidアプリが認識されました。

匿名ログイン

Firebase Consoleからプロジェクトを開き、開発→Authenticationページを開きます。

f:id:qkuroneko:20190315134757p:plain:w320

一番下の「匿名」を有効にします。

あとは匿名ログインしたいタイミングで、

FirebaseAuth#signInAnonymously();

を呼び出せはOKです。

私の場合はスプラッシュ画面でしれっとログインしてしまおうと思ったので、こんな風にしてます。

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:own_note/views/todays_photo_list.dart';
import 'package:splashscreen/splashscreen.dart';

class SplashView extends StatelessWidget {

  final FirebaseAuth firebaseAuth = FirebaseAuth.instance;

  Future<FirebaseUser> signInAnon() async {
    FirebaseUser user = await firebaseAuth.signInAnonymously();
    return user;
  }


  SplashView() {
    signInAnon().then((FirebaseUser user) {
      print('User ${user.uid}');
    });
  }

  @override
  Widget build(BuildContext context) {
    return SplashScreen(
      seconds: 2,
      navigateAfterSeconds: TodaysPhotoListView(),
      image: new Image.network(
          'https://flutter.io/images/catalog-widget-placeholder.png'),
      photoSize: 100.0,
      gradientBackground: LinearGradient(colors: [Colors.cyan],
          begin: Alignment.topLeft,
          end: Alignment.bottomRight),
    );
  }

}

雑に実装した感じだとこんな感じ。

www.youtube.com

こちらの動画を参考にしました!

【Flutter】開発をはじめる為に必要なこと

アプリ開発を始める為に必要なこと。
それは、開発環境を整える必要があるということです。

私のおすすめはAndroidStudioを使う方法です。
しかし、これは単に私がAndroidStudioを使い慣れているだけだからかもしれませんけどね。

この記事では、AndroidStudioでの開発環境の作り方をご紹介したいと思います。

環境はwindows 10 home エディションです。
macでもさほどやり方は変わらないです。

https://developer.android.com/studio/?hl=ja

ここからAndroidStudioをダウンロードします。
ページを開くとどんなOSを使っているか勝手に判断してくれるので何も考えずにダウンロードボタンを押せばOKです。

ダウンロードしたexeファイルをダブルクリックしたらインストール完了です。
表示されるモーダルは何も考えずに「Next」連打で大丈夫です。

初めてAndroidStudioを起動した場合は、起動後に表示されるモーダルは「Do not import settings」でいいと思います。

SetUpはデフォルトで問題ないかと思います。
後からいくらでもなんとでもなるので。

f:id:qkuroneko:20190222221711j:plain:w460

この画面が開いたら右下のConfigureを押しPluginsを選択します。

f:id:qkuroneko:20190222222053j:plain:w460

この画面の赤枠のボタンを押して、Flutterを検索します。

f:id:qkuroneko:20190222222318j:plain:w460

Flutterをインストール。
この時にDartも一緒にインストールされます。

インストールが終わったら、AndroidStudioを再起動します。

f:id:qkuroneko:20190222223143j:plain:w460

Flutter Projectを作るためのメニューが増えてると思います。

こちらを選択して、さっそくFlutterProjectを作っていきましょう。

Flutter Applicationを選択してNext。

f:id:qkuroneko:20190222223503j:plain:w460

Flutter SDK Pathに何も書かれていない状態だと思いますので、横にあるView setup docs...をクリックしてSDKがダウンロードできるページを開きましょう。
mac版の場合はここがInstall SDKとなっていて、ここをクリックすることでFlutterSDKをインストールできます。

f:id:qkuroneko:20190304143543j:plain

インストールしたFlutterSDKのパスを入れます。

f:id:qkuroneko:20190304145422j:plain

パスを設定したら、「Next」ボタンを押してアプリを作成しましょう。

プロジェクトができたらとりあえず動かしてみたいですよね。

f:id:qkuroneko:20190304150113j:plain

Tools->ADVManagerを起動し、エミュレータを選択します。

エミュレータは左下の「Create Visual Device..」から作成できます。

f:id:qkuroneko:20190304152057j:plain

エミュレータを起動した状態だと、画像の赤枠のところで選択できるようになります。
青枠のスタートボタン(又はShift+F10)を押すとビルドが始まり、自動的にエミュレータにアプリをインストールしてくれます。

f:id:qkuroneko:20190304162709j:plain:w320

最初から書かれているコードを実行するとこんな画面になります。
右下のFABをタップしていくことで中央の数字がカウントされていきます。

ここまでできれば環境構築完成です。
これですぐにでも開発が始められますね。
iOSシミュレータでももちろん実行できます。
シミュレータを起動すると、先ほどの画像の赤枠のところで選択できるようになるので、iOSシミュレータを選択してスタートボタンを押せばiOSシミュレータで起動することができます。

【Flutter】悲しいことがありました

2月の頭から週3常駐でFlutterのお仕事をさせていただいていました。
新規で作るアプリで、実装だけでなくコーディング規約やアーキテクチャなども決めさせていただいてました。

私としては、少なくともリリースできる状態になるまで続ける気でいたのですが、
まだ1か月も働いていないのに契約を切られてしまいました。

建前の理由としては、週5で働いてくれる人を優先したいからということでしたが、
結局は私の力不足ということでしょう。

せっかくFlutterの仕事にこぎつけたのに悔しくて悔しくてたまりませんでした。

そこで私は考えました。
もっともっとFlutter力をつけてまたFlutterのお仕事をとって見せるぞ!と。

そんな訳で、来月の常駐のお仕事がなくなってしまったので、
しばらくはリモートのお仕事だけを楽しみつつ、Flutter力を上げまたぼちぼち4月からのお仕事探したいと思ってます。

Flutterを採用するということ

Flutterはまだできて日が浅い技術です。
採用するには不安もあることと思います。

去年頃からエージェントさんにはFlutterのお仕事したいんですけど、募集ないですかね?
などと聞いてはいましたが、正直こんなに早くFlutterの仕事ができるとは思っていませんでした。

Flutter以外にも沢山Android/iOSが両方作れるマルチプラットフォームの技術は沢山ありますが、
どれも決定打にかけるというのが世の中の反応なのではないでしょうか。
また、世界的にはどうなのか分かりませんが、日本においては出始めの技術を採用することに対してもの凄い不安を抱えてしまう傾向にあると感じます。

採用する為の材料

新規でアプリを作るときにその技術を採用する条件がいくつかあると思うんですよね。 例えば下記のような項目が考えられると思います。

  1. 作りたい機能が実現できるか
  2. 開発が容易であるか
  3. 日本語のドキュメントが豊富であるか
  4. 市場にその技術を使えるエンジニアが豊富であるか
  5. 既にリリースされている商業アプリはあるか
1. 作りたい機能が実現できるか

これは真っ先に調査することだと思いますが、ネイティブのSDKで実装する時と同等のことができないと不安、不満であるというのがあると思います。
特にView周りに関しては各社、独自性をアピールするためにごりごりとカスタマイズしたViewを編み出したりしていると思います。
またViewにこだわりがある場合にはアニメーションがつけられるかというのも検討要件の一つになると思います。
今回のお仕事の中でアニメーションは使わなかったのですが、Viewを作るということに関しては問題なく要件通りに作れたと思います。
私はAndroidのお仕事しかしたことありませんが、Androidのlayout.xmlで使えるようなパラメータと同等のものはありましたので、全く同じものを作れと言われたら作れると思います。
ただ、dimens.xmlのようなものが見当たらなかったので固定値を置くクラスを作るとか、Widgetを細かく分けてある程度その中でサイズやマージンを決めてあげるとかの工夫が必要かなって思いました。
また、解像度の違いに対応した場合にはどうするのが最適なのかというのがまだ分かっていません。 Androidだと解像度別のフォルダにそれぞれlayoutやdimensファイルを作って対応したりするのですが、それと同じことができるかはちょっとまだ解決策を見つけられてないです。

2. 開発が容易であるか

これに関してはYES
と声高にアピールしたいです。

一番は開発環境を作るのがすごく簡単です。
VSCodeやInteliJ(AndroidStudio)で開発できます。
私はAndroidStudioを使っていますが、AndroidStudio上でDartのインストールもできるし、FlutterSDKのインストールもできるし、Flutterプラグインがあるのでそれを入れておけば開発で使いたいあれこれが追加されるのでとても便利です。
コマンドを一切打たなくても開発環境ができあがります。
iOSの開発をしたい場合にはcocoapodを自力でインストールしなければならないのですが、もともとiOSをやってた人なら息をするかのようにやってることだと思うので問題ないと思います。

次に、「学習コストが……」ってやつ、よく言われますよね。
学習コストは低いんじゃないかと思ってます。
Flutterの一番の特徴はViewの作り方だと思います。
そこさえコツを掴んでしまえば後は他の手段でアプリを作るときと変わらないかと思います。
Dartの書き方は普段良く使うKotlinと結構違うのでそこは苦労しましたが、なんとなく書けるようになってくると思います。

3. 日本語のドキュメントが豊富であるか

これはゼロではないが多くはないです。
もちろん、日本人の方も沢山の方がブログやqiitaで記事を投稿していて凄く参考になりました。

flutter-jp.connpass.com

FlutterMeetupなども開催されていて、日本でも積極的にFlutterの情報を発信していこうという姿勢が見られますね。

qiita.com

このブログを書いている時点でのQiitaに投稿されたFlutterタグのつけられた記事数は501件です。

一方、ReactNativeは945件。

qiita.com

なんとなく近しいかなって思ったReactNativeと比較してみました。
後発だった割に記事数はなかなかのもんだと思いますね。
全部読んだ訳ではないので記事の精度とかは分からないのですが、数字上では凄い勢いで増えてるんじゃないかと思われますね。

ただ、やっぱり公式サイトや公式のサンプルコード(Github)、英語圏の方の書かれたブログ、StackOverflowとか見ることで解決できることもあったので、まったく英語を読まずに開発するということは難しいと思います。

4. 市場にその技術を使えるエンジニアが豊富であるか

これは未知数ですよね。
でもゼロではないと思ってます。
開発担当のエンジニアが辞めた後に後任をすぐに探せるかっていうのはやっぱり気になるところですよね。
せっかく作ったアプリを開発し続けることができなくなってしまっては元も子もないですし。

しかし、現時点では少ないかと思います。
ただ、先にリンクを貼ったconnpassのFlutter Japan User Groupには現時点で779人の人が登録しています。
すべてがエンジニア職の人ではないかもしれませんが、これだけの人がFlutterに関心を寄せているってことだと思います。

なので、Flutterを流行らせてFlutterやれるエンジニアを増やしていく事が重要かと考えています。

5. 既にリリースされている商業アプリはあるか

これは実際に聞かれたことがあって、FlutterよりReactNativeのがまだ実績あるんじゃないって反応でした。
しかし、これだってゼロじゃないです。

使った事ないですけど、AlibabaさんのアプリとかFlutter製らしいじゃないですか。

商業アプリかどうかは分かりませんが、Flutterで作られたアプリを登録するサイトらしいです。

itsallwidgets.com

結構沢山ありますよね。
なのであまり恐れず使っていけばいいんじゃないかと思います。
少なくとも、ネイティブの機能をメインで使うようなアプリ以外であれば充分Flutterで対応できるんじゃないかと思います。

今後の展開と目標

3月は結構時間があるので、Flutterの勉強をしていこうと思います。
また、日本語でのFlutterの記事数を増やす貢献を微力ながらしてきたいと思います。
全然アクセスのないブログですが、少人数でもエンジニアさんの目に止まりFlutter始めるきっかけとかになってくれると嬉しいです。
また、Flutterエンジニアが増えることにより、Flutter案件が増えるといいなと思ってます。
そして、もう一度私もFlutter案件にかかわる事ができたらいいなと思ってます。

【Android】Android Bazaar and Conferenceへ行ってきました

こんにちは。
先週の土曜日、abc2018へ行ってきました。

abc.android-group.jp

途中、道に迷いちょっと遅刻気味で会場へ到着してしまったので私が聞いたのは吉岡さんの基調公演の途中からでした。

以下、各公演の感想とか。

IoT機器との連携で広がるAndroidの可能性と懸念される脅威への対策

AndroidアプリやIoTアプリのセキュリティのお話でした。
2017年頃から日本でもスマホアプリをターゲットとするマルウェアが増えてきているというお話でした。

例えばストアに掲載されているようなアプリでもマルウェアを混入の上、リパッケージングされて出回っているとか。
実験的にすでにストアに掲載されている有名アプリに自動で悪質なプログラムを混入の上、
リパッケージングして問題なく動くかという実験をしたらしいですが、結構高い確率でそういうこともできちゃったらしいです。

GooglePlayに関しては、ストア側が監視していて怪しいアプリはどんどん削除されていっているらしいです。

ところで、GooglePlayが使えない中国では怪しいアプリが蔓延していたそうですが、
現在ではサードパーティのストア側がソースコードの難読化をしてくれるサービスを開始したようでかなり安全になってきているそうです。

これからスマホやIotアプリがどんどん普及していくと思うので、
ユーザーさんに安心して使ってもらう為にもセキュリティを気にしてアプリを作る必要があるなと思いました。
具体的にどうやるかは要調査ですね。

データ主導社会の実現に向けて

通信技術において法律をどうしていくかっていうお話でした。
話が難しくてよくわかってないところもあるのですが、
とりあえず来年5Gがくるぞってところだけ覚えてきました!

現在日本で普及しているモバイル通信は4G(LTE)だと思いますが、
これよりも超高速で5Gになると二時間の映画が3秒でダウンロードできるってことでした。

2019年から大都市近郊から徐々にってことなんで、日本全国で使えるようになるにはしばらく時間がかかると思うのですが、
5Gが普及しつつかつ携帯料金問題とかも解決したら大容量をモバイル通信でもフラットに使えるようなアプリ作り放題ですかね!?

スマホでもスピーカーでも!誰でもできるGoogleアシスタントアプリ開発

こちらはお二人でのセッションでしたね。
Googleアシスタントを使ったアプリの作り方のお話。
具体的にツールの使い方やプログラムの書き方を交えてのセッションでとても面白かったです。

具体的にGoogleAssistantアプリを作る為には以下の3つのサービスを駆使するとできます!

GoogleAssistantというと言葉での会話が中心かと思いますが、
人間っていい加減なので言葉だけじゃ伝わらないんですよね。
例えば「ねぇ、アレってどうなってんの?」とかって会話の中で結構頻繁に使いますよね。
"アレ"って言葉を言う時にジェスチャーで何かを伝えてるかもしれないし、
何かを指差しているかもしれない。

そんなこんなでGoogleAssistantでは画像も駆使しつつ会話ができます。
これもデバイスに画像を表示できる環境があるかどうか、状況はどうか(運転中に画像を見てもらおうとしたら危ないですよね)
などなどの分岐もしつつ画像も使えます。

他にもリスト表示、カード表示、スマートディスプレイ限定のTable表示とかもできるらしいです。

そんなこんなでGoogleAssistantアプリ作ってみたくなりました。
肝心なアイディアがないので、のんびりとアイディアを練ろうと思います。

ICT社会、次の10年に求められるモバイルの役割

こちらのお話は中国の深センと青森のICT事情!

深センでは急速にICT環境が整ってきているようで、
町中に監視カメラが張り巡らされドライバーや通行人の顔認証までしているようです。
違反をすればすぐさま自分の携帯へ罰金の通知が飛び、
大きなサイネージに違反者の顔が映されると。

なんだか近未来ものの映画みたいですね!

中国ではAlipayのようなQRコード決済が流行していてどのお店でも導入しているみたいです。
電子マネー決済やクレジットカード決済よりも優れている点は店側に読み取り機器がいらないことですね。
QRコードさえあればいいので飲食店なんかではテーブルにQRコードを貼っておくとかしておけばテーブルで決済ができちゃう!
というなんとも場所を取らなくて便利な決済方法ですよね。
スマホを持っている事が前提なので、スマホを持っていない人は結局現金決済になっちゃうんですが……。

さて、一方青森の決済事情ですが……。
実は青森も密かにQRコード決済が普及しつつあるそうです。
実際使っている人がいるかどうかはさておいて、青森銀行とOrigamiが連携できるということで、
青森銀行がOrigamiPayを推しているそうです。
そんなこんなで青森ではOrigimiPay加盟店がちらほら増えてきているらしいのです。

about.origami.com

ところでなぜ青森ではクレジットカード決済や電子マネー決済は普及しなかったか。
JR東日本の政策が大きいのではないかという話でした。
青森では駅の改札でSuicaはもちろん使えないし、JRバスも現金のみ。
切符を買う券売機ではクレジットカードが使えないので現金のみ。

とういう地方あるある事情により電子マネーやクレジットカード決済が普及しなかったのではないかという見解でした。

以前、電子マネー決済のお仕事したことがあるのですが、
電子マネーの技術やSuicaの技術ってかなりブラックボックスなところがあって、
情報が独占されている感じがしました。
セキュリティを守る為には必要な事なんでしょうけどね、気軽に導入できる技術ではないなと感じています。

QRコード決済であれば個人でも使える会社さんもあるので、
これが流行れば手軽にスマホでものを売り買いできる時代がやってくるんじゃないかと思います。

PWA A Go-Go!!

PWA(Progressive Web Apps)はWebアプリをネイティブアプリのように見せる事のできる技術ということですね。
そもそも私はPWAという言葉をこの日初めて聞いたので理解が浅いです。

Webアプリに対して、プッシュ通知を送信したりホーム画面にアイコンを追加する事ができ、
あたかもストアから落としてきたアプリのように見せることができるそうです。

また、画面のキャッシュなんかもできるので一度読み込んでおけばオフラインでも一度開いた事のある画面であれば使う事ができます。
このキャッシュも短時間でのクリアができるので、頻繁に更新のかかる画面では数分、数時間でキャッシュクリアとかすればOKって話だったと思います。

この発表をしてくださった進藤さんが作ったWordPress用のプラグインを使うと簡単にPWAができます!
ってことでしたので、WordPressを使っている方はこちらをチェックです。

wordpress.org

私もWordPressで作ったサイトを持っているのでさっそく導入してみようと思いました。

Flutterアプリ開発 実践編

この日、一番聞きたかったセッションがこちらです。
Flutterというと、Viewを作るのにコードをもりもりネストさせて書いていくというイメージありますよね。
実はGUIのエディタがありました。

http://mutisya.com/

ちょっと使ってみましたが、使いにくいかもしれない。。。。
現状はもりもりコードを描くしかなさそうです。

さてさて、Flutterにもさっそく様々なプラグインが登場しつつあるようです。

pub.dartlang.org

こちらのサイトで使いたい機能を検索できるようです。
これは便利ですね。
導入の仕方もこちらを見れば手順が全部書いてある様です。

便利ですね。

個人的に作りかけているFlutterアプリがあるので、
年内にはリリースしたい!

と言う訳で、盛りだくさんで楽しいカンファレンスでした。

【Android】ポリシー違反に対応

こんにちは。

最近、話題になっている「Android 広告 ID の使用ポリシー及び Google Play デベロッパー販売 / 配布契約 4.8 への違反」のメールが私のところへも届きました。

f:id:qkuroneko:20181005083502p:plain

これにより、以前公開していたアプリ「Uroovy」が削除されてしまいました。

この規約違反は広告IDを収集しているならばプライバシーポリシーをアプリ内に表示しなさいよってことなんですよね。

Uroovyは広告表示を行なっていないので、表示義務はないはずなんですが、

広告IDを使っている覚えがないのにGoogle Playからポリシー違反を通告されたけどFirebaseのせいだった

こちらの記事を読んで、身に覚えがあるなーと。

UroovyもFirebaseを使っているのでそれが原因ではないかと思いました。

対応

上の記事にある通りに「広告 ID の収集を無効にする」フラグをfalseにしました。

参考:

https://firebase.google.com/support/guides/disable-analytics

リリース

上の対応を実施し、新たにバージョンコードを振りなおして再度GooglePlayに申請してみました。

復活

play.google.com

その日のうちに公開が開始されました。

めでたしめでたしです。

その他

久々にUroovyのプロジェクトを開いたので、諸々のバージョンもあげておこうと思い、 Kotlinのバージョンを最新「1.2.71」にあげたところRealmを使っているところが永遠とクラッシュするようになってしまいました。

バージョンを「1.2.51」にしたところ解消されました。