月別アーカイブ 7月 2019

takahashi 著者:takahashi

Pixel 3aの”この曲なに?”が音楽好きには嬉しい機能だった件

僕は音楽が好きで、よく音楽を聴いています。

飲食店などに行くとBGMとしていろんな楽曲が流れていることがありますが、その曲の中に、”なにこの曲めっちゃいい…!”という曲に出会うことがあります。

そんな時に曲名を知りたい、と思ってもなかなか知るのが難しく、その後も曲名がわからないままもどかしい思いをすることもありました。

スマートフォンが出てきてから、アプリに曲を聴かせるだけで何の曲かを教えてくれる”Shazam”や”Sound Hound”というアプリが出てきたことで、ふとした拍子に気になる曲に出会った時に曲名を知ることができるようになりました。

最近ではGoogle検索にも同様の機能が実装されましたね。

ただ、これらのアプリの唯一の欠点は、開いてから音楽の認識が始まる点。

“おっこの音楽いい…!”って感じてからスマホを取り出してアプリを起動している間に、曲が終わってしまっていた….なんてことも結構あって残念な思いをすることもありました。

Pixel 3(a)には曲のサジェスト機能がシステムとして組み込まれています。

本体の設定から
音→この曲なに?→ロック画面に表示 および 通知 をonにします。

こうしておくと、音楽がかかっているときにロック画面を表示するだけで

こんな風に曲名が表示されます。

曲名を調べるためにアプリ立ち上げる必要もなく、立ち上げ中に音楽が終わってしまった…ということも少なくなってとても便利です。

是非ほかのAndroid端末にも実装されてほしいですね。

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

【Android】現在の位置情報を偽装できるアプリ「Fake GPS location」

アプリ開発の際に、位置情報を偽装したいことがあると思います。
そんな時におすすめの Android アプリが「Fake GPS location」です。
言語は英語なのですが、直感的な操作で使えるので、特に支障はありません。

インストールはこちらから。

Fake GPS location – Google Play のアプリ
https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=ja

 

使い方ですが、アプリを起動すると画面に地図とマップピンのアイコンが表示されるので、まずは画面をスワイプして偽装したい場所にアイコンが来るように調整します。

上の画像では、浜松駅をマップピンに合わせています。
あとは、右下にある三角アイコンの緑ボタンを押せば、設定は完了です!
位置情報を取得してみると、このアプリで設定した場所にいるように表示されるかと思います。
なお、このアプリを起動中は、端末の通知バーに常にアイコンが表示されています。
うっかり消し忘れることもなくて便利です。
また、一時停止は通知バーからも操作できます。

端末によっては、設定から「仮の現在地情報アプリを選択」や「疑似ロケーションアプリ」という項目で Fake GPS アプリを選択する必要がある場合もありますが、その際はきちんと通知してくれるので、それに従って設定しましょう。
なお、上記の設定は、設定 > 開発者向けオプション > 仮の現在地情報アプリを選択(または疑似ロケーションアプリ) という場所にあります。

 

以上、Android 端末で現在の位置情報を偽装する方法でした。
位置情報で、機能の ON/OFF を判断していたりすると、動作検証がなかなか難しかったりしますが、こちらを利用すればかなり簡単に動作を確かめられますね!
くれぐれも悪用せず、便利にお使いください。

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

【node】nodistを使ってもnode.jsのバージョンが変わらない時の対処法

前回は、nodistでnode.jsのバージョンの変更する方法を書いていましたが、これを使ってもバージョンが

変わらないよ~という方向け(というか自分向け)に対処法を書いていきます。

nodistインストール後にnode.jsをインストールした場合は、この「nodist 8.0.0」というおなじみの

インストール方法でサクッとバージョン変更できるのですが逆の場合つまりnode.jsが先にある若しくは

node.jsをインストールした後にnodistをインストールした場合はnodistのコマンドが効かず、先に存在してい

たnode.jsのコマンドが優先して働いてしまうみたいです。なので、実際に違うバージョンのnode.jsをインスト

ールできてもそれ以降はnodistコマンドが邪魔されたままでnode.jsのコマンドを入力している状態となって

いる訳です。

自分の場合は、windows左下のスタート画面内の設定(歯車のアイコン)を押してwindowsの設定という

ページに移動します。真ん中の検索欄で、システム環境変数の編集と検索をしてください。

 

 

すると、予測ワードにシステム環境変数の編集というワードが出てくるのでこれをクリック。

すると、次のようなページに移り変わります。ここで右下の環境変数というボタンをクリックします。

 

 

すると、下記のようなページがでてくるので下の欄からpath変数を探して編集を押してください。

 

 

ここで各アプリのパスが列挙されますが、その中でnodistとnode.jsのパスに着目します。この時に

node.jsのパスがnodistのパスより上にあればビンゴです。nodistのパスを「前へ」コマンドでnode.jsより

上にくるようにしてok若しくは適用を押してコマンドを再起動してnodist 8.0.0を実行してみましょう。

その後にnode -vで確認すると正常にバージョンが変更できていることがわかると思います。

この方法を知るまではバージョンの変更方法がわからなくて詰みかけていたので本当に助かりました。

同じような症状で困っていたら参考にしてみてください。

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

【PHP】DI(依存性注入)を用いたコードの追い方

 DI(Dependency injection)(依存性注入)とはコード内で外部への依存を直書きするのでなく、外部から引数、セッターなどで依存する部分を与える実装のことです。例えば、次です。

use Illuminate\Contracts\Hashing\Hasher as HasherContract;

class DatabaseUserProvider implements UserProvider
{
    /**
     * The hasher implementation.
     *
     * @var \Illuminate\Contracts\Hashing\Hasher
     */
    protected $hasher;

    /**
     * Create a new database user provider.
     *
     * @param  \Illuminate\Contracts\Hashing\Hasher  $hasher
     * @return void
     */
    public function __construct(HasherContract $hasher)
    {
        $this->hasher = $hasher;
    }
    /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        return $this->hasher->check(
            $credentials['password'], $user->getAuthPassword()
        );
    }
}

 DatabaseUserProviderクラスがインスタンス化された際にHasherContract型の引数$hasherを要求し、$hasherを保持します。保持した$hasherをvalidateCredentialsメソッド内で用います。
 外部から依存するモノを与えるため、テストし易かったり変更し易かったりするのですが、あまりに自由で今稼働しているコードでは何が実体化しているのかわかりにくく、追うのが少し難しいです。上記コードなら$this->hasherって何?となってIDEの機能で型を追ってもHasherContractというインターフェースが現れて終わりです。HasherContractを満たすどのHasherクラスが使われているか分かりません。
 hasherの中身、ひいては実際の動作を知りたい時は、まず依存性が実際に注入された際のコードを動かし、その時のhasherの中身に何が入ってるのか調べる必要があります。PHPならば次の様に出来ます。

    public function __construct(HasherContract $hasher)
    {
        var_dump(get_class($hasher));exit;
        $this->hasher = $hasher;
    }

PHP: get_class – Manual
 get_class関数でインスタンスそのものに、あなたのクラス名は何ですか、と尋ねます。得られたクラス名が今稼働しているシステムで注入されているクラスの名前です。例えば、ここでBcryptHasherという実装クラスが呼ばれているとわかったら次の様に型付けをします。

class DatabaseUserProvider implements UserProvider
{
    /**
     * The hasher implementation.
     *
     * @var \Illuminate\Hashing\BcryptHasher
     */
    protected $hasher;

    /**
     * Create a new database user provider.
     *
     * @param  \Illuminate\Hashing\BcryptHasher  $hasher
     * @return void
     */
    public function __construct(BcryptHasher $hasher)
    {
        $this->hasher = $hasher;
    }
    /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        return $this->hasher->check(
            $credentials['password'], $user->getAuthPassword()
        );
    }
}

 こうするとIDEのジャンプ機能はインターフェースHasherContractでなくクラスBcryptHasherを参照するようになり、静的にコードを追うことが格段に楽になります。注意点として直し忘れがあります。DIを駆使したコードほど直し忘れると型エラーで派手に事故ります。

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

ヨーロッパのGNSSシステム”Galileo”に大規模障害発生中。Galileoを使用した一切の測位が不能に

ふとTwitterを見たらこんなつぶやきが…

なんとGNSS(各国が運用している全地球測位システムの総称)の一種であるヨーロッパの”Galileo”の測位衛星が、全機一斉に使用不能になっているようです。

ヨーロッパのガリレオ全地球測位システム まさかの完全停止 – Togetter

記事を書いた時点でもまだ死んでいるみたいですね…

Constellation Information – European GNSS Service Centre

なお、Togetterによると、今回の問題はGST(Galileo System Time)に異常がでているのではないかという情報も出ていますが、公式発表がない為、詳細は不明です。

いずれにせよ、いつ復旧するかわからない状況となっていますので、Galileoを使用したシステムを構築している場合は注意が必要そうです。

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

【サービス】画像を送ると文字起こししててくれるLINEアカウント「文字起こしばりぐっどくん」

とても便利なサービスを紹介している記事を見つけたので、共有&備忘録のためにまとめ。

読んだ記事はこちらから。

LINEに画像を送ると、AIが3秒で文字起こし 「企業や役所の働き方変える」 長崎のベンチャーが開発 – ITmedia NEWS
https://www.itmedia.co.jp/news/articles/1907/11/news110.html

 

長崎県西海市のベンチャー企業「西海クリエイティブカンパニー」が7月3日からLINE上で公開しているサービスで、LINE アカウント「文字起こし ばりぐっどくん」です。
こちらは友達申請をするとすぐ使え、文字起こしをしたい画像を送ると、数秒でテキストを返してくれるのだとか。
手書き文字は分かりませんが、名刺などの印字されているものでしたら問題なく変換ができるとのこと。
チラシなどの紙媒体に記載されたデータの取り扱いがかなり便利になりそうですね!
また、役所などの紙を扱うことが多いお仕事ではとても役立ちそうですね。
幸い、紙データを扱うことはそこまで多くありませんが、たまに紙データからテキストを抜き出したいことがあるので、使う頻度はそこそこありそうです。

なお、こちらのサービスですが、非エンジニアの担当者の方が、約1週間で作り上げたものとのこと。
文字起こしには、Google Cloud Platform の画像認識サービス「Cloud Vision」を使用しているそうです。
面白そうなので、時間があれば是非触ってみたいですね!

 

以上、画像から文字を起こしてくれるLINEアカウント「文字起こし ばりぐっどくん」のご紹介でした。
いざというときに便利そうなので、この後にでも友達申請をしておこうと思います。

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

【node.js】node.jsのバージョンが8以下だとcreate-react-appが使えなくなりました

react初級者が手っ取り早くreact開発をするのに便利だったcreate-react-appですが、知らない間にnodeの

バージョンが低いとcreate-react-appでテンプレートを作れなくなっていました。

今の自分のnodeのバージョンが6.3.10だったのですが、試しにcreate-react-app toyBoxで適当にテンプレを

作ろうと思って実行したところ、このようなエラーが出ました。


Y<span style="color: #ff6600;">ou are running Node 6.10.3.</span>
Create React App requires Node 8 or higher.</span>
Please update your version of Node.</span></span>

分かりやすい。このエラーが出た場合は今のnodeから8以上のnodeに切り替えてください。

nodistをインストールしている場合は、コマンドでnodist +8.0.0でnodeのバージョン(8以上なら何でもいい)を

インストールします。その後に同じくコマンドでnodist 6.11.3と打ち込んで現在のnodeから実際に8.0.0に

切り替えます。

node -vでバージョンを確認して8.0.0になっていれば切り替え成功です。ここで再度create-react-app toyBox

を打ち込んでみましょう。緑色の文字でsuccessが出れば成功になります。

もし、正常に動かないまたはnode.jsのバージョンが変わらなかった場合は一回node.jsをアンインストール

することをお勧めします。

 

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

【PHP】Adapterパターンであるカラムの値によって大きく振る舞いを変えるテーブルの扱いを多少マシにする

 ときおり扱い難い定義のデータベースを扱う必要が出てきます。特定のカラムによって値の意味や他テーブルとの関係が大きく変わるテーブルはその一つです。
 例えば、usersテーブルにtypeカラムがあり、typeによって仮会員か一般会員か特別会員か区別するとします。それぞれ似た様で確かに違うモノです。仮会員はメールアドレス等いくつかのデータがnullでも良し、の様に別のふるまいが要求され、それが増えてくると、usersテーブルを扱うのはだんだん面倒になってきます。早い時点でuserテーブルをリファクタリングできていれば問題にならないのですが、そうならないまま既存データやコードが積み重なり今更変える時間がない、ということもあります。アダプターパターンを用いることでデータベース定義を変えないままこれを緩和できます。
 アダプターパターンは増補改訂版Java言語で学ぶデザインパターン入門 | 結城 浩 |本 | 通販 | Amazonでは次のように説明されています。

「すでに提供されているもの」と「必要なもの」の間の「ずれ」を埋めるようなデザインパターン、これが
Adapterパターン
です。

 この考えに従えば「すでに提供されているもの」はtypeによってデータの意味が大きく変わるテーブル、「必要なもの」はデータの意味ごとのテーブルです。多くのフレームワークで採用されているORM(オブジェクト関係マッピング)は1テーブルに1モデルの原則で使いやすい様に作られています。これを1つの意味に対して1モデルになる様に用います。
 具体的にはマッピングの時点でwhere句を用いて、あるテーブルの特定のtype1つに対して1モデルの様にします。
 例えばLaravelならば

/** User.php */
class User{
  // 仮会員、一般会員、特別会員に関する大量のメソッド
}

となっている1つのモデル定義ファイルを明示的なテーブル指定とグローバルスコープによって

/** TemporaryUser.php */
class TemporaryUser{
    protected $table = 'users';
    public funtion boot(){
        parent::boot();
        self::addGlobalScope('decide_user_type', static function (Builder $query) {
            $query->where('type', config('const.user.type.temporary'));
        });
    }
    // 仮会員に関するメソッド
}
/** GeneralUser.php */
class GeneralUser{
    protected $table = 'users';
    public funtion boot(){
        parent::boot();
        self::addGlobalScope('decide_user_type', static function (Builder $query) {
            $query->where('type', config('const.user.type.general'));
        });
    }
    // 一般会員に関するメソッド
}
/** SpecialUser.php */
class SpecialUser{
    protected $table = 'users';
    public funtion boot(){
        parent::boot();
        self::addGlobalScope('decide_user_type', static function (Builder $query) {
            $query->where('type', config('const.user.type.special'));
        });
    }
    // 特別会員に関するメソッド
}

と分割した3ファイルに分割します。完全に共有する部分は、ユーザ特性としてtraitを用意し、3会員モデルクラスそれぞれにuseさせることで整理できます。
 テーブルを分割する例を挙げましたが逆に複数のテーブルや設定等をまとめた上でカプセル化されたEntityクラスを作るというのもまた別のAdapterパターンの活用です。

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

やっぱりAndroidにも随時アップデートは必要。Googleが対策するも不正なアプリに感染する端末が出現した事案

ニュースサイトのGigazineを見ていたところ、下記の記事を見つけました。

2500万台のAndroid端末が感染しているマルウェア「Agent Smith」見つかる – Gigazine

ネット上で Agent Smith という不正なマルウェアが発見されたという内容。

ユーザーが気づかないうちに正式なアプリを不正なアプリと置き換えてしまうというなかなか悪質なマルウェアなのですが、マルウェアが不正な操作を行う際に利用していたAndroidの脆弱性について、Googleは2017年時点でこの脆弱性に気づいており、すぐにパッチをリリースしています。

ところがご存知の通り、Androidのアップデートを適用するかどうかはキャリアやメーカーにゆだねられており、大抵の場合(特に古い端末は)キャリア・メーカー側でアップデートを止めてしまっているのが現状です。

OSはシステムの根幹ですが、一方で大変複雑なプログラムなので、どんなに優秀な開発者が集まったとしても潜在的なバグからは逃れることはできません。

なので、OSへの定期的なセキュリティアップデートは必ずなければならない存在なのですが、Androidについては上記のような現状なのでかなり対応がザルになっています。

最近自分はPixel3aに乗り換えましたが、理由の一つとして、アップデートが全く振ってこない他社のスマートフォンにうんざりしていたという部分もあります。(本当は端末のサポート期間が長く、かつ端末がサポートされている期間は随時アップデートが降ってくるiPhoneに変えようと思ってました。)

Googleもようやく、他社へのAndroidの随時アップデートを義務化する動きが出てきて改善しつつあるようですが、昨今の状況を考えると、現時点では残念ながらメーカー製のAndroidはもっともセキュリティ的に脆弱なスマートフォンだと言われても致し方ないのかもしれません。

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

【cordova】cordova-plugin-email-composerで簡単にメールフォームを作成する

cordova-plugin-email-composerは、導入するだけでメールのフォームをそのままアプリに取り入れることができます。

よくあるメールを送ってお問い合わせしてくださいというアレです。アプリでは主に設定画面やパスワードを忘れたときのために

導入されることが多いと思われます。

導入方方法もとても簡単で、以下の通りに通常のプラグインと同じようにサンプルを入れるだけで機能してくれるのでおすすめです。


mailSend(){
  window.cordova.plugins.email.isAvailable(function (hasAccount) {
    if (hasAccount) {
      window.cordova.plugins.email.open({
        to: "username@gmal.com",
        subject: "テストメール",
        body: "こんにちは!",
        isHtml: false
      });
    } else {
      window.ons.notification.alert({
        message: "There is no email client available."
      });
    }
  });

subjectとbodyにapiなどから取得した値を格納した変数を入れることが出来れば使い幅がぐっと上がりそうですね。

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