月別アーカイブ 7月 2019

村上 著者:村上

【Android】「Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.」エラーの対処法

先日報告があったため修正した、Android アプリの不具合です。
WebView のページを開いたところ、何も表示されず真っ白なページになってしまいました。

で、Android Studio で表示されたエラーメッセージは、タイトルにもある通り「Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.」というもので、「証明書チェーンの検証に失敗しました」とのこと。

このエラーは証明書の設定が間違っていることが考えられるので、一度証明書の設定を確認してください。

 

ですが、テスト用の証明書だったりするなど、直すのが難しいことがあるかと思います。
そんな時には、強制的にエラーをスキップする方法があります。

参考にしたサイトはこちらから。

Y.A.M の 雑記帳: Android WebView で https のサイトにアクセスして白画面になるのを避ける方法
http://y-anz-m.blogspot.com/2012/08/androidwebview-https.html

ssl – Android error in webview.loadUrl() – Trust anchor for certification path not found – Stack Overflow
https://stackoverflow.com/questions/33825696/android-error-in-webview-loadurl-trust-anchor-for-certification-path-not-fou

ただし、セキュリティ上は問題があるので、なるべく使わないほうがいいです。
あくまでも、緊急時の対処法ということにしておいてください。

対応方法ですが、WebViewClient を継承しているクラスがあると思うので、そこに下記のコードを記述します。

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) {
    handler.proceed(); 
}

上記を指定すると、SSL でエラーが発生しても無視をしてくれますので、問題のあるWebページでも問題なく表示されます。

 

以上、Android の WebView で SSL 証明書にエラーがある Web ページを表示する方法でした。
ただし、再度繰り返しますが、あくまでも応急処置ですので、リリースするアプリには導入しないことをお勧めします。

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

JMeter でのリモート実行できずに

Apache JMeter はサーバ1台で実行可能ですが、大きな負荷をかける場合は複数サーバに分散する仕組みが用意されています。

しかしこれがうまく動作しないのです。

create-rmi-keystore.sh

jmeter クライアント側で Java の keytool を使用して rmi のキー rmi_keystore.jks を作成。
これをリモート側 (jmeter-server) へコピーして準備します。もちろん rmi という名称部分は同じ様に指示通りに。
jmeter.properties などの .properties ファイル類の server.rmi.ssl.keystore を調整。コメントアウト化されているので、有効化してみたり。戻して見たり。

jmeter-server を起動させ 1099 ポートで待機させます。 クライアントは同じセグメント。

tcpdump しながら 1099 ポートへの通信を確認しているのですが、一行にタイムアウトで接続できず。

リモート実行する形での情報が少ないので非常に困り物です。

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

【Vue】jQueryとVueを共存させる

 デザインはjQueryで作られる、実装はVue.jsで行う。なんやかんやあってこの方式でwebページを作る必要が出てくることがあります。一貫していた方が作りやすいはずなのですが、なんやかんやあってこうなります。
 デザインの実装の際、jQueryとVue.jsを読み込ませるとデザイン時に動いていたイベントが消える時があります。これはVueがテンプレートエンジンも兼ねていることが原因で起きがちです。例えば次の様なシナリオで起きます。

// デザイン時
HTML読み込み完了
↓
jQueryによるイベント付与実行
↓
全てのHTMLに付与されるべきイベントが付与されている

// 実装時
HTML読み込み中、Vue構築中
↓
HTML読み込み完了
↓
jQueryによるイベント付与実行
↓
Vue構築完了。Vue内で定義されたHTML構築を持ってきて描画

 特にVueでAPIの結果をHTMLの一領域に描画する仕組みを作った時はイベントの再定義の絡みで大体こうなります。こうなる時にはVueの中でVueが読み込み完了した場合に実行されるイベントでjQueryによるイベントを定義すると良いです。

export default {
  components: {
  },
  props: {
  },
  data() {
    return {
      
    };
  },
  mounted() {
    // jQueryのイベント付与処理
  },

 このように記述するとコンポーネントが読み込まれるたびにmounted関数が実行され、テンプレート内にjQueryのイベントが付与されます。
 Vue.jsとjQueryの同時実行はJavaScriptファイルが巨大になり初期読み込みが遅くなるため積極的に行うべきでないのですが、デザイナーからいただけるデザインにjQueryでアニメーションがついていることがしばしばあります。そういった際にこのやり方を知っておくと、Vue.jsの便利さから離れないままアニメーションを崩すことも再構築することもなくデザインを再現できます。

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

【cordova】cordovaのプラグインで天気予報を取得する方法

コルドバプラグインの中でも比較的メジャーなプラグインの一つであるcordova-plugin-geolocationですが、

このプラグイン使えば使うほど汎用性の高いプラグインだとじわじわ思い知らされます。

例えば、今いる自分の位置情報を取ってきたり、店舗や施設の位置情報を取って更に機能を展開したりと

短いコードですぐ取得できるので初心者にも易しい取説となっております。

これだけでも便利なのですが、オプションを変更するだけで天気予報も取得できることを知って自分の中で

更に評価が上がっております。

これが使えば天気予報を教えてくれたりその天気の情報によって振る舞いを変える機能を作ったりと

多岐に渡る活躍が期待できそうです。

サンプルコードですが、数十行で事足りるのでこれから実装したいと考えている方は参考にしてみてください。

</pre>
// Success callback for get geo coordinates

var onWeatherSuccess = function (position) {

Latitude = position.coords.latitude;
Longitude = position.coords.longitude;

getWeather(Latitude, Longitude);
}

// Get weather by using coordinates

function getWeather(latitude, longitude) {

// Get a free key at http://openweathermap.org/. Replace the "Your_Key_Here" string with that key.
var OpenWeatherAppKey = "Your_Key_Here";

var queryString =
'http://api.openweathermap.org/data/2.5/weather?lat='
+ latitude + '&lon=' + longitude + '&appid=' + OpenWeatherAppKey + '&units=imperial';

$.getJSON(queryString, function (results) {

if (results.weather.length) {

$.getJSON(queryString, function (results) {

if (results.weather.length) {

$('#description').text(results.name);
$('#temp').text(results.main.temp);
$('#wind').text(results.wind.speed);
$('#humidity').text(results.main.humidity);
$('#visibility').text(results.weather[0].main);

var sunriseDate = new Date(results.sys.sunrise);
$('#sunrise').text(sunriseDate.toLocaleTimeString());

var sunsetDate = new Date(results.sys.sunrise);
$('#sunset').text(sunsetDate.toLocaleTimeString());
}

});
}
}).fail(function () {
console.log("error getting location");
});
}

// Error callback

function onWeatherError(error) {
console.log('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
<pre>
  • この記事いいね! (0)
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)