Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2018年08月29日

furusin

Kotlin ExtensionsのParcelizeアノテーションでdata classをスッキリさせる

こんにちは。ピクトリンク事業部の古川です。

今回はKotlinの便利機能である @Parcelize アノテーションについて解説します。

公式ドキュメントはこちらです。

ちなみにこの内容は、2018/08/25に行われたKotlin Fest 2018のセッション(start from Convert to Kotlin by 望月美帆さん)によって少し解説されたものです。

Parcelable とは

Parcelableは、例えばAndroidだとActivity間のデータ通信の際、一時的にデータを保存したい場合に利用します。

Kotlinでは、 バージョン1.1.4からExperimentalとして追加されました。

使い方

利用するにはkotlin-android-extensionsが必要ですので、build.gradleに追加しましょう。

また、Experimentalですので、その情報も追加します。

このアノテーションを利用しなかった場合は次のようになります。

このクラスに次のように @Parcelize アノテーションを追加すると、とてもシンプルになります。

関数すら無くなりました。

もちろん、何か独自のロジックを入れたい場合は追加することも可能です。

ちなみに

このUser.ktクラスをKotlinでなくJavaで書くと、次のようになります。

Javaだと膨大な量ですが、Kotlinだとたったの1行で完結しました!

Kotlin最高!

Kotlinかわいい!


2018年08月27日

Kayo

サーバ増設したらDNSラウンドロビンが壊れた!?

はじめに

みなさん、こんにちは。ピクトリンク事業部インフラ課の藤本佳世です。

 

先日、稼働中のサーバにアクセスが集中したため、サーバ増設を行いました。

その作業の1つとして、DNSラウンドロビン設定に増設したサーバを追加したのですが、上手く負荷分散されず、今まで特に問題なく利用していたDNSラウンドロビンの思わぬ落とし穴にはまってしまったので、忘れないようにブログに書いておきます。

DNSラウンドロビンとは

1つのドメイン名に複数のIPアドレスを割り当て、負荷を分散させる技術のこと。

スライド1

 

メリットは、簡単に設定ができることです。

スライド2
私が行ったように急遽サーバ増設が必要になった場合でも、zoneファイル上の対象ドメイン名に増設したサーバのIPアドレスを追加するだけで負荷分散してくれます。

 

デメリットは、万が一、サーバに障害が発生しても検知することができず、負荷を分散し続けてしまうこと。結果クライアントにエラーが返されてしまいます。

はまったこと

zoneファイル上の対象ドメイン名(test.com)に、増設したサーバ2台のIPアドレスを追加しました。

下記、実際に追加したzoneファイルの中身です。

この変更を加えるまでは、問題なく4台で負荷分散できていたのですが、2台を追加したことで、この2台しか負荷分散ができなくなったしまったのです。

スライド3

原因

DNSラウンドロビンの数に制限があるかなど、色々調べてみましたが、

原因は、増設したIPアドレスの「一致長が変わったのが原因でした。※参考になったURLがこちら

スライド4

4列目のIPアドレスと問い合わせる側の自分のIPアドレス(192.168.0.1)を比較し、一致する部分の長さが最も大きくなるものが使われるようです。つまり、増設した192.168.0.6と192.168.0.7が選択され、それ以外のものは使われなくなってしまったということです。

対応策

一致長が異なるのが問題だったので、これを合わせてやる(別のIPアドレスを使う)ことで増設することができました。

まとめ

DNSラウンドロビンはとても簡単に設定ができるので、弊社でも長らく利用してきました。

今回、思わぬ落とし穴にはまってしまったのですが、DNSラウンドロビンの問題は今回のものだけではありません。例えば、DNSサーバのBINDのバージョン9.13.2(unstable版)では、そもそもラウンドロビンが動作しなくなっているようです。
DNSは名前解決に専念させ、負荷分散はロードバランサに任せるなど、今後もDNSラウンドロビンを使い続けるかどうか慎重な検討が必要のようです。


2018年08月23日

furusin

BottomAppBarにめり込んだFloatingActionButtonを設置する

こんにちは。ピクトリンク事業部の古川です。

今回は、Google IO 2018アプリで突如現れて衝撃的だった、BottomAppBarにめり込んだFloatingActionButtonの実装方法を紹介します。

このようなレイアウトです。

fabWithBottonAppBar

下部のView(ここではおそらくBottomAppBarのみ)にFloatingActionButtonがめり込んでいて、被る部分はうまく避けられています。

今回の最終形態は次のような画面を目指します。

bottomnavigationviewsample-MainActivity-08212018170527

事前準備

app/build.gradleに必要なものを追加します。

 

BottomAppBarを設置する

今回実装したい方法を実現するには、BottomAppBarを利用します。

また、BottomAppBarはCoordinatorLayoutを親に持つ必要があることに注意してください。

ここまでで、次のようなとてもシンプルな画面が完成しました。

bottomnavigationviewsample-MainActivity-08212018173254

ちなみに

の「56dp」は、Google IO 2018アプリBottomNavigationViewの高さを参考にしました。

Material Design Guidelineにも56dpにするように指定されています

FloatingActionButtonを設置する

次に、めり込ませるFloatingActionButtonを設置します。

重要なのは

この部分です。

この1行だけで、BottomAppBarによしなに設置してくれます。

これだけで、BottomAppBarにFloatingActionButtonがめり込みました。

bottomnavigationviewsample-MainActivity-08212018173937

ちなみに、BottomAppBarの

を “end” に変えると、FloatingActionButtonが右側に設置されます。

bottomnavigationviewsample-MainActivity-08212018174105

おまけ

これだけだとシンプルすぎるので、BottomAppBarにBottomNavigationViewを追加します。

まずはBottomNavigationViewで表示するためのメニューを res/menu/bnv_menu.xml に用意します。

次に、BottomNavigatoinViewをBottomAppBarの中へ追加します。

これで次のような画面が完成しました!

bottomnavigationviewsample-MainActivity-08212018170527

BottomNavigationViewのItemが選択された時に画面(Fragment)を切り替えたい場合は次のようにします。

まとめ

とても簡単に実装できました!

これをうまく活用すれば、リッチでかっこいい画面が作れるかもしれませんね!


2018年07月30日

Kayo

便利なtmux-xpanesのご紹介

みなさん、こんにちは。ピクトリンク事業部インフラ課の藤本佳世です。
今回は、使ってみてとても便利だった「tmux-xpanes」をご紹介したいと思います。

 

すでに「tmux-xpanes」ご存知の方いらっしゃるかもしれませんが、とても便利なコマンドです。

私は業務でよくサーバにsshログインし、コマンドを実行します。よくあるケースが、10台のサーバに配置された同じサービスをそれぞれ起動したりします。今までは、1台ずつサーバにsshログイン→起動→起動確認→次のサーバという動作を繰り返していました。

 

繰り返すのはとても面倒ですし、時間もかかります。そんな時見つけたのが「tmux-xpanes」です。「tmux-xpanes」を使うと、このような10回繰り返す操作を1回で済ませることができるのです。更に、サービス起動を同じタイミングで実施したいという場合にもとても便利です。

 

「tmux-xpanes」のインストール方法や詳細については、公式のREADME.mdに詳しく書かれているのでご覧ください。

使い方

例として、test-01~04というサーバにログインして、一度に4台すべてのhttpdを起動させます。
まず、ターミナルを開いてサーバにログイン。–sshオプションをつけて、sshログインします。
※他にもオプションがありますが、私が良く使うのはsshです。その他のオプションについては、先ほどの公式README.mdを見て下さいね。

<実際の画面>

1

Enterを押すと、画面が4分割され、サーバ4台にログインできました。

<実際の画面>

2

あとは、httpd起動コマンドを入力するだけですが、4サーバで同時にコマンドが打てます。

<実際の画面>

3

無事4台同時に起動することができました。

<実際の画面>

4

最後に

「tmux-xpanes」は、複数台同時にコマンドが打てるので、仕事も捗ります。

みなさんも是非、この便利な「tmux-xpanes」コマンド使ってみて下さい。
ただし、間違ったコマンドを打ってしまうと大変なことになったりもしますので、操作するときは気をつけて下さいね。


2018年07月19日

Spring Boot 2系でServiceによる起動をさせてみる

こんにちは、フリューのジョンです。

以前CentOS7でのSpring Bootの起動について記載させていただきました。
CentOS7でのSpring Bootの起動について

その後Spring Boot 2系がリリースされましたが、Gradleの場合は若干修正になりました。
とはいえ①の部分のみです。

Spring Boot 1系ではbootJarというタスクではなく以下のようなものでした。

今後はbootJarタスクを利用してやるようです。

詳しくは https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html を参考にしてください。