月別アーカイブ 7月 2019

takahashi 著者:takahashi

さくらのクラウドでIPアドレスに逆引き設定をする方法

自前でサーバーを立ててメールサーバーを稼働させる際、立ち上げたメールサーバーが正式なものであることを証明するために、サーバーに割り当てたIPアドレスへドメインの逆引き設定を行う必要があります。

IPアドレスに逆引き設定が適切に行われていないと、不正なメールサーバーからの接続だと判断し、メールの配送や受信を拒否するメールサーバーが存在しているためです。

そんな逆引き設定ですが、自分のドメインを設定したい場合、通常はそのIPアドレスを保有しているプロバイダなどに依頼しないと自分のドメインと紐づけてもらえない場合がありますし、そもそもそういった依頼ができない場合もあるのでちょっとハードルが高めです。(この場合は、自分のドメインの代わりにプロバイダのホスト名が逆引き名に設定されている場合が多いです。)

一方IPレンタルサーバー業者などでは、業者がIPアドレスを保有している場合があるので、レンタルサーバー使用時に、逆引き設定も併せて行うことができるところもあります。

今回は会社でも使用しているさくらインターネットさんのサービス”さくらのクラウド”での逆引き設定方法を紹介します。

サーバ一覧から、逆引きを設定したいIPが振られているインスタンスをダブルクリックします。

するとインスタンスの詳細画面に移行するので、タブからNICを選択します。

“ホスト名逆引きを編集”を選択

逆引きに指定したいホスト名を入力します。

この状態で

nslookup IPアドレス

とすると、

> nslookup IPアドレス
サーバー:  dns.example.com
Address:  XXX.XXX.XXX.XXX

名前:    example.jp
Address:  IPアドレス

のように設定したドメインをIPから引くことができるようになります。

  • この記事いいね! (0)
著者:ym

AWS RDS SQL Server にファイルからデータ復元

先日 RDS for SQL Server を使ってテストしていましたが、無事に .bak ファイルからの復元ができることを確認しました。

ハマった点といえば、アクセスキーの有効期限。

期限の警告はでていたけど、普通にアプリから使えていただので問題ないと思っていたところ、インポートで RDS から S3 への接続で Key Id なんたらとエラーメッセージが表示されました。

まさかこのキーの有効期限だとは思いませんでしたが、アクセスキーを更新して無事インポートができる様になりました。

  • この記事いいね! (0)
著者:杉浦

StrategyパターンとSQL文の構築

 Strategyパターンはコーディングのやり方の一つです。
Strategy パターン – Wikipedia
 
 画像は増補改訂版 Java言語で学ぶデザインパターン入門 | 結城 浩 | コンピュータ・IT | Kindleストア | Amazonより引用。
 Strategyパターンはとある目的を達成するためのアルゴリズムをごっそり代えることを容易にするプログラミングパターンです。業務においては仕様がごっそり変わっても、コードへの影響を小さく抑えるために用います。場当たり的な変更を繰り返すと仕様が変わって、関係を持つクラスやメソッドが変わって、更に共通箇所が変わって、変わった共通箇所に合わせて全く関係ない場所が変わって……なんてことも起き得ます。Strategyパターンを実現する方法の一つは、変わることが予想される領域をあらかじめまとめて、まとめた部分の入出力の型を固定する、というものです。変わることが予想される領域は主に業務知識(八百屋さんのプログラムなら八百屋さんの行う業務についての知識)によって把握します。業務知識に重点を置く設計をドメイン駆動設計と言い、ドメイン駆動設計の説明はエリック・エヴァンスのドメイン駆動設計 | Eric Evans, 和智右桂, 牧野祐子, 今関剛 | 工学 | Kindleストア | Amazonに詳しく載っているらしいです。私は買ったはいいですが未だに半分も理解できていません。
 ドメイン設計ほど大仰でなくとも簡単にStrategyパターンを用いることのできる部分があります。それがSQL文の構築です。データベースからデータを取得する時が特に典型です。データ取得のSQL文の中身は、任意の種類の値を任意の条件で任意の順で取得する、という言葉で抽象化できます。種類がselect, join, group by句あたり、条件がwhrere, join句あたり、順がorder by句になりやすいです。joinが二つあるのは関係するデータを引っ張ってくる理由に見たい、絞り込みたいになりやすいからです。見えない値による順番で値を引っ張ってきたいことはレアです。例えば次の様にクエリ構築をまとめた関数を作れます。

/** 次の様にニュースモデルに記述 */
public function scopeNewsListSelectQuery(QueryBuilder $query){
    return // 表示したいカラム、計算結果等を決定する部分を構築するクエリビルダの集合
}

public function scopeNewsListWhereQuery(QueryBuilder $query){
    return // 表示したいデータの条件を決定する部分を構築するクエリビルダの集合
}

public function scopeNewsListOrderQuery(QueryBuilder $query){
    return // 表示したいデータの順を決定する部分を構築するクエリビルダの集合
}
/** 次の様にコントローラからクエリの集合体メソッドを呼び出し */
$news_list = query()->scopeNewsListSelectQuery()
                    ->scopeNewsListWhereQuery()
                    ->scopeNewsListOrderQuery()
                    ->get();

 これだけでは一見、単にクエリを分解しただけに見えます。実際は大きな変更や追記が必要になった時、次の様に部分的にまとまりを入れ替えることで変更部を減らせます。
 例えば、ニュースと同じ仕組みでレビューを表示したい、どのニュースとレビューを表示するかはif文で記述すると複雑になるくらい微細に違う条件で決める、となった場合は次の様にできます。

/** 次の様にページモデル(ニュースモデルを抽象化したモデル)に記述 */
public function scopePageListSelectQuery(QueryBuilder $query){
    return // 表示したいカラム、計算結果等を決定する部分を構築するクエリビルダの集合
}

public function scopeNewsListWhereQuery(QueryBuilder $query){
    return // 表示したいニュースの条件を決定する部分を構築するクエリビルダの集合
}

public function scopeReviewListWhereQuery(QueryBuilder $query){
    return // 表示したいレビューの条件を決定する部分を構築するクエリビルダの集合
}

public function scopePageListOrderQuery(QueryBuilder $query){
    return // 表示したいデータの順を決定する部分を構築するクエリビルダの集合
}
/** 次の様にコントローラからクエリの集合体メソッドを呼び出し */
$news_list = query()->scopePageListSelectQuery()
                    ->scopeNewsListWhereQuery()
                    ->scopePageListOrderQuery()
                    ->get();
$review_list = query()->scopePageListSelectQuery()
                    ->scopeReviewListWhereQuery()
                    ->scopePageListOrderQuery()
                    ->get();

 すっきりです。さらに突飛な要求が多く来たとしてもページという枠組みに収まっているならば、そうそう困りません。もし工夫なく作ろうとした場合、変更時に漏れのありがちなコピペコードになるか、複雑で読み難いうえにインデックスも張りにくい謎クエリビルディングをすることになります。
 もし、SelectもOrderも違うとしたら、それはそれで入力部と表示部は同じだがクエリはごっそり代わるというStrategyパターンにするべきでしょう。

  • この記事いいね! (1)
村上 著者:村上

【Cordova】アプリをバックグラウンドでも実行するためのプラグイン「cordova-plugin-background-mode」

現在も引き続き開発中の Cordova アプリを iOS で実行した際、アプリがバックグラウンドになるとビーコンが受信できないという現象が発生していました。
ビーコン受信に使っているのは「cordova-plugin-ibeacon」というプラグインです。
で、どうしてもバックグラウンドで受信したい!との要望があったので、その対策に「cordova-plugin-background-mode」というプラグインをインストールしてみました。

GitHub のページはこちらから。

GitHub – katzer/cordova-plugin-background-mode: Keep app running in background
https://github.com/katzer/cordova-plugin-background-mode

なお、結論から言うと、問題なくバックグラウンドでのビーコン受信を行うことができました!
が、バックグラウンドでも実行しているため、当然ですがメモリの消費は増えます。
あまり重い処理を行うと、バッテリーの消費が早くなったり、端末が熱を持つ可能性もありますので、その点ご了承の上で、実装してください。

 

インストール方法は、まず下記のコマンドを実行します。

cordova plugin add cordova-plugin-background-mode

インストールが終わったら、deviceready が発火した後、任意のタイミングでバックグラウンド処理を有効にする記述を追加します。
私はアプリが起動して、メイン画面が表示されるタイミングで実行しています。
そのコードはこちら。

// バックグラウンドを有効にする
window.cordova.plugins.backgroundMode.enable();
// 下記の書き方でもOK
window.cordova.plugins.backgroundMode.setEnabled(true);

バックグラウンド処理を無効にする時はこちらを実行します。

window.cordova.plugins.backgroundMode.disable();
// または
window.cordova.plugins.backgroundMode.setEnabled(false);

バックグラウンド処理が有効かどうか調べたい場合は下記を実行します

const status = window.cordova.plugins.backgroundMode.isActive();

なお、返却される値は true/false です。

基本的な関数は以上です。
他にも、バックグラウンドの ON/OFF を検知したタイミングで、任意の処理を実行したり、Android 限定ですが、プログラム側からアプリをバックグラウンド/フォアグラウンドに移動させたりすることもできます。
このあたりは、ドキュメントをご確認ください。

 

以上、Cordova アプリをバックグラウンドでも実行するためのプラグイン「cordova-plugin-background-mode」のご紹介でした。
是非ご活用ください。

  • この記事いいね! (0)
takahashi 著者:takahashi

Pixel 3aではWi-FiにつなげたままWi-Fiテザリングが可能…!

他のスマートフォン同様、Pixel 3aにもテザリング機能がついているのですが、従来のスマートフォンと異なる点が一つあります。

実はWi-Fiにつないだまま、テザリングを行うことが可能になっています。

以前メイン機として使用していたXperia Z5では、テザリングをonにするとWi-Fiが無効化されてしまいますが、Pixel 3aではWi-Fiを有効にしたままテザリングもできるようになっています。

これができると何が良いかというと、例えばWi-Fiの電波が悪いとき、 Pixel 3aを中継器代わりに使用することができます。

また、PCを Pixelにつないだまま、近くに利用可能なWi-Fiがあれば Pixel 側で自動でWi-Fiに切り替えてくれますし、Wi-Fiとの接続が切れてしまった際には自動でモバイル回線に切り替えてくれるので、PC側で接続先を切り替えることなく、最適な回線が使用できるのでとても楽です。

他にも、複数のWi-Fi端末を持っていて、外出先で複数端末をWi-Fiにつなげたくなった時も、あらかじめPixelとだけ接続できるようにしておけば、外出先のWi-Fiの接続設定を使用する全部の端末に入力する必要がないのも便利ですね。

こういった仕組みはWindowsやLinuxなどでは既に使用可能になっていましたが、モバイル機器でできる機種は多くありませんでした。(AndroidだとGalaxyやP20 Proなどで独自に対応しているようです。)

意外に重宝する「Wi-Fiブリッジ」機能 – ケータイWatch

今回Pixel 3aにWi-Fiの中継機能が搭載されたということは、(ハードウェアさえ対応していれば)Android上で標準機能になる可能性も大いにありそうな気がしますね。

今年の秋にはAndroid 10 が正式にリリースされる予定となっていますが、こういった細かい部分の機能の進化も是非注目していきたいです。

  • この記事いいね! (0)
asaba 著者:asaba

【java】HasuMapを使ってキーと値を一緒に取得する※自分用

javaにはphpのようにforeachで回す手段が無く、代わりに拡張for文を使ってキー・値を取得する方法が用意されています。

例えば、hasumap配列に格納したキーと値を取り出すには以下のようにentrySet・getKey・getValueを使って取り出すことができます。

</pre>
import java.util.HashMap;
import java.util.Map;

public class Main {

public static void main(String[] args) {

Map<String, String> map = new HashMap<>();
map.put("name", "asaba");
map.put("job", "programmer");

for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
<pre>

hashmapを使う時はimportでimport java.util.HashMap;とimport java.util.Map;と定義しないとno such no fileのエラーが

出るのでそこは注意しなければですね。

片方だけ取ってくる方法も存在するのでそこは作りたいものに合わせて調整する必要があります。(簡単ですが)

  • この記事いいね! (0)
takahashi 著者:takahashi

Androidで常に通知バーに出す必要がない通知アイコンを隠す方法

またしてもAndroid浦島太郎案件…

Android 8から新しい通知機能に対応したアプリの通知を最小化(通知バーからアイコンのみを非表示に)する機能が追加されたことはご存知でしょうか。

僕はPixel3aを購入してしばらくしてようやく、この機能の存在に気づきました(;´∀`)

AndroidにはWindowsと同様の通知領域があり、様々な通知を通知バーに表示することができてとても便利なのですが、最近はあらゆるAndroidアプリがこぞって通知を出すようになってしまい、ユーザーが本当に見たい通知が埋もれてしまって見逃す、という状況が多くなってきてしまいました。

画像は自分が所有するXperia Z5(Android 6)の通知領域の画面

Android OS開発者側もこの問題を認識しているようで、Androidのバージョンを追うごとに様々な改善策が導入されています。

そういった改善策のうち、Android 8 から導入されたのが”通知の重要度”機能です。

Android 8.0 通知と重要度の関係を覚えて通知を使いこなそう! – FeeeeeLog

“通知の重要度”設定は、アプリの各通知ごとに重要度レベルを付けることができ、それに応じて通知方法が変化する、という機能です。

例えば、セキュリティソフトのESETをインストールして常駐させているのですが、

デフォルトではこんな風に常に通知バーにアイコンが表示されています。

ESETが動作しているのがわかるのはありがたいのですが、確認したいときにだけ確認できればいいので、常に通知バーにアイコンを表示させておく必要はありません。

そこで、このESETの常駐アイコンを通知バーから見かけ上だけ消してみます。

まず、Androidのシステム設定から”アプリと通知”という項目をタップすると、下記のメニューが表示されます。

一覧にアプリが出ている場合はそのアプリをタップ、もし出ていない場合は”228個のアプリをすべて表示”をタップします。

目的のアプリをタップします。

通知をタップします。

動作をタップします。

“ポップアップで知らせて最小化”を選択します。(※Android 8 の場合は表記が異なります。)

これで通知バーから

こんな感じでESETのアイコンが消えましたが、

通知領域を開いたところにはこのように引き続き表示されています。

ちなみに、通知を長押しして出てくるメニューから最小化を選んでも同じ設定が可能です。

通知のレベルをユーザーが細かく指定できるのはありがたいですね。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】JavaScriptのlocalStorageで保存した値が消える

Corovaアプリを開発中、localStorage で保存した値が、消してもないのに消えるという現象に遭遇しました。
結論から言うとただのプログラムのミスだったのですが、調べているときに、localStorage の利用はあまり推奨されないという記事をいくつか見つけました。

一番詳しいと思った記事がこちら。
ローカルストレージに簡単な解決策はない | Mozilla Developer Street (modest)
https://dev.mozilla.jp/2012/03/there-is-no-simple-solution-for-local-storage/

いくつか抜粋すると、

  • ストレージの上限に達した事を知る上手い仕組みがない
  • localStorage はファイルの読み込み/書き込みが絡むため、システムによっては時間がかかることがある
  • 速く動いているように見せるため、ブラウザは最初のリクエスト時にデータをメモリ上にロードする。そのため多くのメモリを食ってしまう
  • localStorage は永続的なため、そのサイトやサービスをもう使わなくなっても、データがブラウザの立ち上げ時にロードされ続けてしまう

上記のようなデメリットが挙げられます。

また、私の体感ですが、書き込み・読み込みに若干のタイムラグが発生する場合があるように感じました。
そのため、データを保存直後に読み出すなどをした場合に、データが取得できないということもあり得るかもしれません。

 

特に重要なデータを保持しないのであれば、localStorage でも問題ないと思いますが、そうでない場合、プラグインの「cordova-plugin-nativestorage」の使用をおすすめします。
GitHub のページは下記から確認できます。

GitHub – TheCocoaProject/cordova-plugin-nativestorage: Cordova plugin: Native storage of variables in Android, iOS and Windows
https://github.com/TheCocoaProject/cordova-plugin-nativestorage

使い方は下記のとおりです。

// データの保存
NativeStorage.setItem([キー名], [値], [成功時の処理], [失敗時の処理]);
// データの取得
NativeStorage.getItem([キー名], [成功時の処理], [失敗時の処理]);
// 全データの取得
NativeStorage.keys([成功時の処理], [失敗時の処理]);
// データの削除
NativeStorage.remove([キー名], [成功時の処理], [失敗時の処理]);
// 全データの削除
NativeStorage.clear([成功時の処理], [失敗時の処理]);

ほとんど localStorage の使い方と同じなので、分かりやすいかと思います。
また、localStorage と違って、成功/失敗時の処理を追加できるため、確実にデータが保存できたかどうかが確認できるのは良いですね。
仕様に合うのであれば、localStorage よりもこちらの使用をおすすめします。

 

以上、Cordova アプリでの localStorage の使用の是非と、代替となるプラグイン「cordova-plugin-nativestorage」のご紹介でした。
是非ご活用ください。

  • この記事いいね! (0)
著者:杉浦

【PhpStorm】ショートカットキーのリストを表示するショートカットキー

 PhpStormのできることは膨大でそのできることに対応しているショートカットキーの数もまた多いです。その様に多いショートカットキーを覚えられる人は稀でしょう。これの対策なのかいくつかのショートカットキーをグループ化したショートカットキーのリストのポップアップを表示するショートカットキーが用意されています。このリストをクイックリストと言います。
クイック・リスト – 公式ヘルプ | PhpStorm
クイックリストの設定 – 公式ヘルプ | PhpStorm
 私がよく使うのは大体次の三つです。
 Alt+Enterによる今カーソルが当たっているコードを改善する提案の表示。厳密にはクイックリストと違いますが感覚的に似ているので挙げました。

 Ctrl+Shift+Alt+Tによるリファクタリング操作の表示。

 Ctrl+Nによる何かしらの目印の名前検索の表示。これはTabで選択を動かせます。

  • この記事いいね! (0)
takahashi 著者:takahashi

Pixel 3aをセットアップしてみた。

前回の記事で、Pixel 3aの開封の様子をご紹介しました。

Pixel 3a を買ってみた!

今回は続きの初期設定をご紹介します。

Pixel 3aを初めて起動すると、こんな画面が表示されます。

デフォルトは英語ですが、Englishの部分をタップすると言語を日本語に変更することができます。

開始をタップして初期設定を開始します。

設定項目としてはWi-Fiの設定をしたのち、次のような画面が出てきます。

次へをタップすると

データを移行するために、今まで使用していたスマートフォンとUSBケーブルを接続するように求められます。
USBケーブル同士を接続して認識されると、なんと旧端末のXperia Z5側の画面が自動で切り替わりました …!

Xperia Z5はPixel 3aが発売されるはるか前に発売された端末のはずです。
いつの間にこんな機能が付加されていたのでしょうか…?(多分PlayStoreで更新可能なGoogleのサービス周りにくっついてるのだと思いますw)

暫くすると、Pixel側で旧スマホの画面を確認するように表示され、旧端末側でロックを解除するように求められます。

旧端末側で画面ロックに使用していた認証情報(画像の場合はPINコード)を入力します。(打ち間違いでエラーが出てますね…すみません💦)

認証に成功すると、旧端末側の画面が画像のようになりますので”コピー”をタップします。

まずはログイン中のGoogleアカウントがすべて引き継がれます。

Googleアカウントのセキュリティの設定によってはPixel側でパスワードを求められるので入力します。

アカウントのコピーが完了するとPixel側に引き継がれたアカウントのメールアドレスがすべて表示されるので、旧端末でログインしていたGoogleアカウントがすべて表示されているかどうかを確認します。

全てリストされているのを確認して次へをタップ。

Googleアカウント以外のデータのコピーが開始されます。

自分の環境の場合、30~40分ほどかかったと思います。

データをコピーしている間、Pixel側では引き続き設定をつづけることができます。
次へをタップします。

スマートフォンのデータを随時バックアップしておくかの設定です

この設定をonにしておくと、端末の設定などのデータや、データバックアップに対応したアプリのデータ、インストール済みアプリのリストなどを自動でバックアップしてくれるので、例えば端末の初期化や次回乗り換える際に再セットアップの時間を短縮することができます。

プライバシーに気を使ってるなどの理由がない限り、onにしておいて損はないと思います。

次は指紋認証の設定。

万が一指紋認証できなくなった際の、代わりのPINコードを設定します。

裏面のセンサーに数回触れて指紋を登録します。

完了すると上の画像のような画面になります。

次はGoogleアシスタントの設定。

”OK Google”と呼びかけただけで反応してもらえるようになります。

次はPixel 3aの特徴でもあるActive Edgeの設定。
Pixel 3シリーズの端末は、本体側面をぎゅっと握るだけでGoogleアシスタントを起動することができるようになっています。

ここでは、どれだけ強く握ったら起動するかの設定を行います。

次はスリープ状態のときに情報を表示し続けるかの設定です。

有効にしておくと、こんな感じで常時表示されます。(タップ操作は受け付けないので、この状態のまましまっても大丈夫です。)

そのほか追加設定も行えます。

こちらについては、僕は今回はスキップしました。
設定としてはこれでだいたい全部です。

あとは先ほどから実行している旧端末からのデータコピーの完了を待ちます。

コピーが完了するとこのような画面になります。

機種によって異なるのかもしれませんが、自分が使用しているXperia Z5からのコピーでは、上の写真のようになりました。
本体だけでなく、SDカードに入っていた写真類もコピーされるようです。

アプリはここですべてコピーされるわけではなく、旧端末にインストール済みになっていたアプリと同じアプリをPlayStoreから自動で取得してインストールする仕組みになっていて、設定完了後にインストールが開始されるようになっていました。

アプリのインストールが完了すれば、晴れて使用できる状態になります。

記事として説明すると結構長い量に見えますが、実際はとてもシンプルな設定項目もなく、SIMの設定も含め、可能な限り自動で行ってくれる点は好印象でした。

  • この記事いいね! (0)