株式会社ダイアログ Tech Blog

株式会社ダイアログのエンジニアチームが運営しています。

[Flutter]moorを使用したテーブルの作り方

Flutterにおいて、moorを使用したDBの作成方法を簡単に記載します。 手順にフォーカスするので、細かい解説などは省いてます。

 インストール

pubspec.yamlに追加します(バージョンは確認してください)

dependencies:
  moor: ^3.3.1

dev_dependencies:
  moor_generator: ^3.3.1

テーブルを追加

@DataClassName('Book')
class Books extends Table {
  IntColumn get id => integer().autoIncrement()(); //idの自動採番

  TextColumn get title => text()();

  TextColumn get content => text().nullable()(); //nullの許可
}

usemoorに追記

@UseMoor(tables: [
  Books,])

コマンドを実行

下記コマンドをターミナルで実行し、アプリを再起動します。

flutter packages pub run build_runner build --delete-conflicting-outputs

マイグレーションの追加(追加で作成する場合)

  @override
  int get schemaVersion => 2;

  @override
  MigrationStrategy get migration => MigrationStrategy(onCreate: (Migrator m) {
        return m.createAll();
      }, onUpgrade: (Migrator m, int from, int to) async {
        if (from < 2) {
          // we added the dueDate property in the change from version 2
          await m.createTable(books);
      }
  });

最後に

私は現在、株式会社ダイアログという物流×ITの会社に勤務しております。 現在、エンジニアを募集していて、カジュアル面談も実施しているのでお気軽にご連絡ください!

https://www.wantedly.com/companies/company_3244501/projects

QRコードにも文字コードはある

はじめに

少しニッチな内容なのですが、ハンディターミナル1という機器のアプリケーション開発時に出会った事象をご紹介します。

事象

QRコードの読み取り結果が文字化けする。

原因

読み取った値をShift-JIS に変換して扱っていたが、QRコード文字コードがUTF8だったため、正しく変換されなかった。

対応

今回のHT開発で使用している.NET Compact Framework 3.52には文字コード判別の方法が用意されていないため、第三者作成のDLLを使うかロジックを自作する方法が考えられますが、今回は事前に文字コードが分かっているため、判断ロジックを入れずに対応しました。 以下は文字コード変換部分のコード抜粋です。

// QRコードがShift-JIS の場合
// Encoding クラスに用意されている文字コード以外のインスタンスを取得する際はGetEncoding を使う
System.Text.Encoding sjis = System.Text.Encoding.GetEncoding("shift_jis"); 
byte[] codeData = sjis.GetBytes(code); // code はstring 型の読み取った値
string result = sjis.GetString(codeData, 0, code.length);

// QRコードがUTF8 の場合
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
byte[] codeData = utf8.GetBytes(code); // code はstring 型の読み取った値
string result = utf8.GetString(codeData, 0, code.length);

さいごに

Android/iOS 向けのアプリ開発の場合、上記文字コードの考慮はあまり必要なさそうです。 Flutterのpub.dev で提供されているフリーのバーコードリーダーライブラリでも文字コードを自動的に判別して正しい読取結果を返してくれます。 昨今Windows CE 端末向けの開発は減ってきていると思われますが、ご参考になれば幸いです。

弊社は現在エンジニアを募集しております。 開発だけでなく、お客様の生の声を聴きながら要件定義から納品まで取り組むことも可能です。 選考前にカジュアル面談で弊社のことを知っていただくこともできますので、お気軽にご連絡ください。

https://www.wantedly.com/companies/company_3244501/projects


  1. 物流現場で使われることが多いバーコードを読み取る機械です。「ハンディ」、「HT」と省略されることが多いです。

  2. Windows CEベースのモバイル・組み込みデバイス上で動作するように設計された、アプリケーション開発・実行環境です。.NET Frameworkの完全なコピーではなく、より少ないスペース、リソース環境下において使用できるよう縮小されているため、開発時に利用したい機能が含まれていないことが判明するケースが稀にありました。引用: https://ja.wikipedia.org/wiki/.NET_Compact_Framework

インフラ調査 ~データ分析編~

はじめに

弊社でデータ分析の話もあり、AWSとかインフラまわりをちょこちょこと調べていて備忘録も兼ねてまとめてみた。

AWS

https://aws.amazon.com/jp/redshift/

データウェアハウスは、トランザクションシステムと基幹業務アプリケーションから取得したリレーショナルデータを分析するために最適化されたデータベースです。データ構造とスキーマの事前定義は、SQL クエリが高速になるように最適化されます。業務レポート作成や分析などには、通常、SQL クエリの結果が使用されるためです。データにはクリーニング、エンリッチメント、変換が実施され、信頼できる "単一の情報源" となるようにします。

https://aws.amazon.com/jp/big-data/datalakes-and-analytics/what-is-a-data-lake/

データレイクでは、基幹業務アプリケーションからのリレーショナルデータに加えて、モバイルアプリケーション、IoT デバイスソーシャルメディアからの非リレーショナルデータも保存されます。データの構造やスキーマは、データをキャプチャした時点では定義されません。つまり、データの保存時には、慎重に設計する必要がなく、この先答えが必要になりそうな質問を把握しておく必要もありません。SQL クエリ、ビッグデータ分析、全文検索、リアルタイム分析、機械学習など、さまざまなタイプのデータ分析を使用し、インサイトを発見できます。

課題としては、 ・データが溢れすぎて目的を失いがち。 ・データのメンテナンスや整理整頓など定期的に管理が必要。 こんな声を見た。 たしかに目的を明確化しておかないと、ただただデータを持っているだけの沼になってしまいそう…。

あと、なんというか構築するのとかセキュリティ面とかいろいろ大変そう。 と、思ったらこんなのもあった。

https://aws.amazon.com/jp/lake-formation/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc

金融サービス向けとかもある。なにがどう見えるのだろうか。

https://aws.amazon.com/jp/blogs/news/amazon-finspace-simplifies-data-management-and-analytics-for-financial-services/

Amazon FinSpace は、履歴データでの作業も簡単にします。信用リスクを計算するモデルを構築したとしましょう。このモデルは利率とインフレ率に依存し、これらは頻繁に更新されます。顧客に関連付けられたリスクレベルは、インフレ率と利率が異なっていた数か月前のものであるため、現在は変わってしまっています。データアナリストがデータを現在の状態、および過去の状態で検証するモデリングは、bitemporal modeling と呼ばれます。Amazon FinSpace では、時間をさかのぼり、モデルが複数の次元に沿ってどのように進化しているかを比較することが容易になります。

おー!なるほど!なんだかおもしろそう!

他参考にしたもの。

https://qiita.com/manabian/items/e689daf5cc006eced737

https://qiita.com/hayao_k/items/906ac1fba9e239e08ae8

5G

だけど、大容量データとか重たい処理するときにちょっと気になるのがネットワークの問題…。

そういえば、先週くらいに「5Gで遠隔医療操作ができるようになる」というニュースを見た。 通信が早くリアルタイム性がある5Gだからこそ成せるのだとか。

https://www.itmedia.co.jp/news/articles/2107/27/news054.html

「既にあるWi-Fiネットワークでもいいのでは」という見方も出てくるだろうが、大規模な工場などの本格的なデジタル化を実現する上では、やはり5Gが持つ高い性能、とりわけ低遅延や多数同時接続といった特徴が重要だという声が多いようだ。それに加えて5Gはもともと広域で利用が想定されており、複数の基地局を設置して広いエリアをカバーするのが得意なことから、大規模な工場や倉庫、さらには港湾など屋外の広いエリアで利用する上ではWi-Fiより優位性がある。

費用が高額とかまだまだネックになるところが多そうで、どこでもだれでもすぐに使えるわけではなさそう。ただ、ネットワークの問題が解消されたら、出来ること見れることがより増えそう。まずは、スマホで体験してみたい…。

さいごに

本当はデータ分析に括らず、自動化ツールとかセキュリティとか気になるものをいろいろ調べていたが、時間の都合上そのまとめはまたの機会に…。

弊社では積極的に新しい技術を取り入れて、もっといいものを作っていこうと頑張っています。 物流、ロジテック、サービス連携、データプラットフォーム等に興味のある方、カジュアル面談もできますので、ぜひお話しできたらと思います。

https://www.wantedly.com/companies/company_3244501/projects

友達とのチーム開発を成功させるためには?〜仲良く学びを深めるために〜

はじめに

エンジニアになりたての頃や、未経験転職からエンジニアを目指すなどの際に 友人とチーム開発をしてプロダクトを作ろうとされる方がいらっしゃると思います。

ちゃんと行うことができればとてもいい経験で、たくさんの学びがあります。

一方で、自分もこれまで友人とのチーム開発を実施し、うまく行ったことやいかなかったことがあるので その背景を伝え、同じ失敗を繰り返さないように、アドバイスできる記事になればと思います。(__)

重要な前置き

※本記事は、比較的実務系経験が浅いかつ、趣味でのチーム開発を想定します。 ※これまで一緒にチーム開発をしたメンバーには本当感謝しており、悪く言うつもりは一切ありません。自分の学びとして、こう言うふうにすべきだったと言う反省を記録したいと思い、まとめてあります。

失敗の原因と結果、今度どうするか?

失敗の原因とどうなったか、そしてその対策を端的に示します。

  • 最初に目指すものが大きすぎた 初心者が多い中で、フロントエンドやバックエンドチームなどを分けたり、たくさん経験したことのない技術を選定した結果、要件定義だけで終わってしまうなどのことが起こりました。さっさと手を動かす開発をすべきだった。

  • スケジュールが長すぎた 余裕を持ったスケジュールにしようとするがあまり、予定する期間が長くなってしまい、途中でだれてしまった。ここまでにリリースをする、間に合わなかったら解散するorバッファを作って絶対にここで終わらせるなどを決めるべきだった。

  • それぞれの意思がバラバラだった 人によって本業に集中したかったり、本気でチーム開発に全力を注ぎたかったり、参加理由はバラバラです。熱量とも言えると思いますが、それがバラバラだったために、途中抜けしてしまうメンバーがいました。(原因は他にもあったかもですが)最初に、やり切る意思やモチベーション維持の方法を考えるべきだった。

やっておいてよかったこと、今後もやる場合はおすすめの方法

  • 1人ベテランの方や、慣れている方に参加してもらう その人におんぶに抱っこにならないようにすることは大事ですが、本当に全員が詰まった時に相談できる人を開発メンバーとして入ってもらうと良いと思います。全員の学びも増えますし、本当に詰んだ時に救われます。

  • ベースは全員が慣れているフレームワークや言語を選定する 何か新しいことをチーム開発をきっかけに学ぶのは良いことですが、全員が知らないものをベースにすると、キャッチアップも必要ですしコードがカオスなことになります。あまりにも言語特有のエラーにハマってもモチベーションが下がってしまうので、ベースは全員が慣れているものにして、ちょっと学びになるものを盛り込む方が良いと思います。

  • 開発環境とGitFlowやプルリクなどのテンプレを整備する OSの違いで最初にストレスを生んでしまうことは避けたいです。(3人Macで1人Windowsで、Windowsの人がエラー多発して寂しい思いをするなど...)Dockerなどを駆使するのも良いでしょう。また、コードを書く以外の部分に関しても最初に整備をしておき、気持ちの良い開発フローを作っておくのが大切だと思いました。

  • 完成後にどうするか、運用のお金を含めて最初にゴールを決める 完成が一つのゴールですが、やっぱり作ったら運用してみたいと思うのも自然です。誰が運用するのか、お金は誰が支払うのか、万が一大きな問題が起きた時にどう責任を取るのか、そういった開発完了後のことも想定しておいた方が、後々トラブルがないと思います

まとめ

もし、自分が友人とチーム開発をするとしたら、以上のことに気をつけて行いたいと思います。 友達とのチーム開発は楽しく、学びも多いと思いますが、やっぱり限られた時間を投資してみんなで行うものだと思います。

仲良くトラブルなく開発を進めるためにも、相手のことを思いやると同時に、最初に決めるべきところはがっちり決めるのも大切だと考えています。

現在、ダイアログでは採用を行なっています!チーム開発をしっかり行いたい方は、ぜひお気軽にご連絡ください!

www.wantedly.com

[Flutter] Android端末で、Bluetoothペアリング済みの端末の情報を取得する方法

はじめに

Flutterアプリで、Android端末とペアリング済みの端末の情報(端末名、macアドレス)を取得する方法について調べていたのですが、 MethodChannelを利用して、Kotlin側から取得する方法が楽に実装できそうだったので、その際の手順を残そうと思います。

iOSでの実装は今回触れません。

実装

まずはDart側から実装していきます。 MethodChannelを使い任意のタイミングでKotlin側のプログラムを呼び出します。

main.dart

  Future<dynamic> getPairingDeviceInfo() {
    var res = MethodChannel('com.sample_project/bluetooth')
          .invokeMethod('get_pairing_device_info', {});
    return res;
  }

続いてKotlin側で、Dart側から呼び出されるMethodChannelを作成していきます。 Bluetoothペアリング済みの端末情報を取得し、Dart側に返します。

MainActivity.kt

class MainActivity : FlutterActivity() {

    private lateinit var channel: EventChannel

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        var channelBrother = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.sample_project/bluetooth") // dart側で設定したチャンネル名と同じにする。
        channelBrother.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result ->
            when (methodCall.method) {
                "get_pairing_device_info" -> {
                    val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter();
                    val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
                    val deviceName = pairedDevices?.first()?.name // デバイス名
                    val deviceHardwareAddress = pairedDevices?.first()?.address // macアドレス
                    result.success(deviceName.toString())
                }
            }
        }
    }

採用に関して

弊社では、現在、エンジニアを募集しております。 物流に興味・関心がある方はもちろん、 Flutterやモバイル開発に強みがある方、心よりお待ちしております!

https://www.wantedly.com/companies/company_3244501/projects

Flutterで設定画面を実装してみた

はじめに

Flutterで設定画面を実装することになり自前で作ろうかと思っていた矢先、 ググったら良さげなパッケージがあったので、使ってみたら設定画面が楽に実装できました。

https://pub.dev/packages/settings_ui

本記事で実際にできる画面がこちら。 AndroidiOSでUIがよしなに変わってくれるのも嬉しいところ。

Android iOS
Screenshot_1639098059.png   Simulator Screen Shot - iPhone 12 Pro Max - 2021-12-10 at 10.56.10.png 

では、早速実装していきます。

設定画面実装

pubspec.yamlにsettings_uiを追加

dependencies:
  settings_ui: ^1.0.0

利用できるWidgetについては以下の4つで、これらを組み合わせて設定画面を作っていきます。 - SettingsList - SettingsSection - SettingsTile - CustomSection

まずは、ScaffoldのbodyにSettingsListを配置します。

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Settings UI')),
      body: SettingsList( 
        sections: [
          // SettingsSectionを並べていく。
        ],
      )
    );
  }

次に、SettingsListのsectionsに、以下3つのwidgetを配置していきます。

  • SettingsSection → 設定の種別ごとに配置、tilesにSettingsTileかCustomSectionを配置
  • SettingsTile → 設定項目
  • CustomSection → 説明文が必要な場合や、スライダーなどを実装したい際に配置
        sections: [
          SettingsSection(
            title: 'Common',
            tiles: [
              SettingsTile(
                title: 'Language',
                subtitle: 'English',
                leading: Icon(Icons.language),
                onPressed: (context) {
                  Navigator.of(context).push(MaterialPageRoute(
                    builder: (_) => LanguagesScreen(),
                  ));
                },
              ),
              CustomTile(
                child: Container(
                  color: Color(0xFFEFEFF4),
                  padding: EdgeInsetsDirectional.only(
                    start: 14,
                    top: 12,
                    bottom: 30,
                    end: 14,
                  ),
                  child: Text(
                    'You can setup the language you want',
                    style: TextStyle(
                      color: Colors.grey.shade700,
                      fontWeight: FontWeight.w400,
                      fontSize: 13.5,
                      letterSpacing: -0.5,
                    ),
                  ),
                ),
              ),
            ],
          ),
        ],
      )

SettingsTileのonPressedで次の画面へ遷移し、 LanguageであればEnglish、Japaneseなどを言語を選択するLanguage選択画面を実装します。

Language選択画面は、同じようにSettingsList > SettingsSection > SettingsTileを順に配置し、 SettingsTileのonPressedで、SharedPreferencesを使って選択された値を保存するだけです。

これで設定画面のUIと機能が実装できました。

採用に関して

弊社では、現在、エンジニアを募集しております。 物流に興味・関心がある方はもちろん、 Flutterやモバイル開発に強みがある方、心よりお待ちしております!

https://www.wantedly.com/companies/company_3244501/projects

【新しいことにチャレンジできる環境】エンジニア社員インタビュー Part1

2020年7月に、エンジニア4名とコンサルタント1名が入社してくれました! 今日はエンジニアの堀越さんに話を聞いてみました(^^)/

f:id:dialog_tech:20211208124944p:plain

入社の決め手は?

自分を大切にしてくれる、と感じたからです。具体的には、一次面接で働いている方々の雰囲気がとても優しいと感じたこと、もう一つは自分で作成したポートフォリオを細部まで見てくださり、意見や良いところを評価してくださったからです。 また、最終面接で社長のビジョンを聞いたときに、この会社ならばいろいろなことに挑戦できるし、一方で守備の部分もしっかりされているなと将来性を感じたからです。 いろいろなことに挑戦したい反面、私は未経験でさらに転職するということから、将来に向けて腰を据えて働ける場所を探していました。 そんな中で、自分を大切にしてくれそうなダイアログで働きたいなと感じました。

入社後のギャップは?

入社後のギャップに関して感じたことは、大きく分けて以下の4点が挙げられます。 ・質問がし易い ・物流業界が予想以上に面白い ・自分で業務や企画の提案がし易い ・自分で業務時間を決められるので、最高率で働くことができる

<質問がし易い>

業務に合流する前に、最初に簡単な研修と、先輩のエンジニアの皆様1人1人との面談の機会をいただきました。 その結果、フルリモートで業務をすることになっても、事前にある程度コミュニケーションを取っていただけたため、とても質問がしやすかったです。 Slack上でのコミュニケーションも活発にとられているので(面白い絵文字があったり、何気ない技術的な良い記事を共有したり…) そういう意味でも、困ったときに一人で悩まないような優しさを感じました。 さらに、業務以外でも聞きにくいこと(事務手続きや会社でふと疑問に思ったことなど)を聞きやすくするために、チーム以外の先輩がメンターについてくれる制度がありました。このおかげで、いろいろな質問ができ、安心して働くことができています。

<物流業界が予想以上に面白い>

私はもともと、物流業界の知識は0でした。どんな技術も好きになる自信はありましたが、エンジニアとして勤務するにあたり、そこに興味を持てるかが少し不安でした。 しかし、入社後はその興味がとても強くなりました。一番大きな理由としては、自分がつけた機能が、実際に物流業界で働く方の力になっていることを理解できたからです。 面接の時点で、代表からざっくりとした『物流にシステムが関わってくる部分』の説明を聞いていましたが、ダイアログにジョインしてから、弊社のシステムを導入しようとしている企業の倉庫を、実際に見学する機会がありました。 そこで、実際に自分の開発する機能がどこで使われるのかを目で確認し、役に立っているという実感を持てたので、より物流業界に自分の力を生かすにはどうすればいいか考えられるようになりました。 そのような視点で働いてみると、日常の多くに物流は隠れています。 そんな『物流』を探しながら、頭でこんなシステムがあったらどうだろう、と考えられるようになったので、日々がとても楽しくなりました。

<自分で業務や企画の提案がし易い>

自分の業務が終わっている前提で、新たな取り組みや企画の提案をした場合、通してもらえることが非常に多かったです。 例えば、空き時間でQiita(技術ブログのようなもの)の作成を提案したらすぐにやらせていただけたり、現在のシステムに新たなものを入れるのはどうかと考えたときに、一緒に検討していただけたりするなど、ちゃんと耳を傾けてもらえました。 中々他の業務で忙しいと、新たな提案を進めていくのも難しいことだと思っていたのですが、とても話を親身に聞いていただけるなと感じています。

<自分で業務時間を決められるので、最高率で働くことができる>

フルリモート、(コアタイムのある)フレックスという働き方が初めてだったのですが、これが非常に自分に合っていました。 早起きが得意なタイプなので、夕方どうしても予定が入りそうなときは早く起きて仕事、夕方に早く切り上げるといった自由度があるので、最高の効率で働けているなと感じています。 ですから、自分の時間も増え、勉強ややりたいことの時間の確保ができました。ただ、家にいることで比例して体重も増えたので、ジムに通い始めました。笑 そんな時間をとることができたのも、ダイアログのエンジニアならではの働き方なのかなと思います。 一方で、一緒に働いている姿がお互い見えなくなるので、ちゃんとしたアウトプットで成果を見せる必要を感じています。

働いてみてのやりがいは?

一つは仕事を早く終わらせて、+αの自分の挑戦したいことをやらせてもらえることです。アウトプットがしっかりしているという前提は当然必要ですが、先にも述べたとおり会社にプラスになりそうなビジョンがあれば、提案がし易い雰囲気があります。受動的ではなく、能動的にいろいろなことに取り組めているので、非常にやりがいをもって仕事に取り組むことができています。 もう一つは、先輩が褒めてくださることです。もちろん、取引先や顧客の皆様に喜んでいただけるのは嬉しいですが、いいコードがかけたり、ロジックが思いついたときに、先輩方が温かい言葉をかけてくださることが多いので、そのためにも頑張ろうという気持ちになります。

どんな人と働きたいか?(応募者へのメッセージ)

まだ1ヶ月しかっ経っていませんが、私は、ダイアログに来て欲しい人は「他の人に優しくできる人」だと考えています。 これまで、自分が仕事に取り組む上で余裕がなかったり、大変だったりすると他の人に辛く当たってしまったり、周りに迷惑をかけてしまったりすることが多くありました。 ダイアログではまだ経験値の不足から量的に大きな業務に取り組めていないので、少しだけ時間の余裕がありますが、今後はそうも言っていられないと思います。 そんな中で、優しくしてくださる皆様のおかげで働くモチベーションがとても高いので、将来的にも自分が後輩に優しくなれたらいいなと思っています。 ですから、ダイアログを志望する方は、他の人に優しくできて、モチベーションを刺激してあげられるような人だといいなと感じています。

株式会社ダイアログでは、エンジニアメンバーを募集しています! 詳しくはWantedlyこちらのページをご覧ください。