月別アーカイブ 8月 2019

村上 著者:村上

【JavaScript】連想配列から特定の要素を検索する方法

配列の検索方法はよく使うので、ようやく覚え始めたのですが、今回は連想配列の検索方法について。
すぐに見つかるのは find() メソッドや filter() メソッドですが、今回の状況では、あるかどうかだけ分かればよかったので、若干そぐわない…。

ということで、今回参考にさせていただいた記事はこちら。

配列から条件に合うものはfind()で見つけよう。(配列とかおれおれAdvent Calendar2018 – 04日目)|Ginpen.com
https://ginpen.com/2018/12/04/array-find/

 

記事冒頭で、find() メソッドについて紹介されておりますが、その下の「その他のメソッド」の項目で、「あるかどうかだけわかれば良いなら some()」との記載がありました。

サンプルコードは下記のとおりです。

const users = [
    {id: 1, name: "田中"},
    {id: 1, name: "鈴木"},
    {id: 1, name: "山田"}
];
const result = users.some((u) => u.id === [検索したいID]);
if (result) {
    // データが存在した時の処理
} else {
    // データが存在しなかった時の処理
}

some() メソッドを使えば、検索したい値があるかだけを検索することができます。
なお、戻り値は true/false なので、そのまま if 文の条件として使えます。

 

連想配列の検索方法について簡単にまとめると下記のとおりです

  • find():一致した最初のデータを返す
  • filter():一致した全件データを返す
  • findIndex():一致したデータの位置(index)を返す
  • some():一致するデータが存在するかを返す

個人的には filter()some() が使用頻度が高そうだと思うので、この2つは覚えておきたいと思います。

 

以上、JavaScript で連想配列の特定の要素を検索する方法についてでした。
ご参考になれば幸いです。

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

Androidナビを買ってみた

最近、車用のナビ端末を購入しました。

DATAWESTのConnectNaviという機種です。

いままでAndroidタブレットを可能な限り設定でナビさながらに動作するように工夫をしていたのですが、起動が遅かったり、途中で案内が止まってしまったり、万が一電池がなくなってしまった場合はある程度充電されるまで起動ができなかったり…などの問題がありました。

運転中に動作が止まってしまうのはかなり危険なので、思い切って”ナビ化したAndroid端末”から”Android搭載ナビ”に買い換えました。

こちらは車で使用することが前提になっているため、充電が0%でも起動できたり、電源を入れたら自動で起動、OFF時は連動でスリープモードになったり、などナビ用として始めから最適化されてるのはかなりありがたいポイントです。

また、512MB RAMという低スペックではあるのですが、(たまにつっかかることはあるものの)想像していたよりも動作も早いです。

なぜAndroid搭載という特殊なものを選んだのかというと、Androidであれば標準のナビアプリだけでなく、自分の好きなナビアプリと差し替えることが可能だからです。

たとえば、標準のナビアプリは地図更新が無料なのは良いのですが、VICSを受信することができません。

そこで、NAVITIMEなどの有料カーナビアプリをインストールして使うことで、VICS情報も受信することができるようになります。

そういった柔軟性もAndroid搭載のメリットですね。

ただし、なぜかストレージは8GBあるのに、アプリ用の領域には1GBしか割り当てられていないので注意が必要です。(地図完全インストール型のカーナビタイムはインストールできませんでした…)

こういったAndroid搭載ナビもきっと需要も高いと思うので、是非もう少しハイスペック版のものも出してほしいですね。

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

【Laravel】リポジトリlaravel/laravelとlaravel/frameworkの違い

 Laravelのソースコードリポジトリには全く同じ対象について記述されたリポジトリであるlaravel/laravelとlaravel/frameworkの二つがあります。

 laravel/laravel: A PHP framework for web artisans
 laravel/framework
この二つには安定した製品版と開発版の様なものです。もちろんlaravel/frameworkにもmasterブランチがあり、定期的にリリースをしていますがlaravel/laravelはそれ以上に安定です。この二つの最も違う点はcomposerでの呼び出し方でしょう。laravel/laravelは次の様に呼び出され、Laravelプロジェクトの初期状態を作ります。

composer create-project laravel/laravel

 laravel/frameworkは次のように呼び出され、vendor以下にLaravelフレームワークのコードを配置するのみです。

composer require laravel/framework

 GitHubから確認できるリリースの頻度もまるで違います。laravel/laravelが下の様に一気にバージョンアップしてるのに対し、

laravel/frameworkは週一で定期的にアップデートしています。

 最新の機能や残存するバグなどを見るにはlaravel/frameworkを追うのがやりやすいです。

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

VSCodeでプレゼンテーションモードを実現するプラグイン”Presentation Mode”

勉強会などで実際にコーディング風景を画面に映しながら説明をする際、エディタのフォントサイズを上げたり、ズームしたりして文字の大きさを大きくしたうえで使うことがあるかと思います。

しかし、普段からよく使うエディタでこういった変更を行ってしまうと後で戻すときに”アレ…普段って何pxで設定してたっけ…”ってなってしまうことがあります。

VSCodeでは、一時的にプレゼン用に一発で大きく全画面表示することができ、プレゼン終了後に元の大きさに一発で戻すことができるプラグインがあります。

Presentation Mode – Visual Studio Market Place

このプラグインをVSCodeにインストールした状態で

Ctrl + shift + P

キーを押してコマンドパレットを表示し

presentation mode

と入力します。

すると

“Presentation mode”

という選択肢が出てくるので選択します。

左側が、通常の画面なのですが、これが一発で右側のように全画面表示になります。
また、プレゼンテーションモード中にEscキーを押すとすぐに解除され、一発で元の画面に戻ります。

Escキーですぐに戻ってしまうのが若干難点に感じますが、人前でライブコーディングする場合などにとても便利な機能です。

興味のある方は是非一度試してみてはいかがでしょうか。

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

Windows10 1903でついにサウンド設定が設定アプリに移動

Windows 10 1903で、ついにサウンド設定が”設定アプリ”に移動しました。

1809まではこのように従来のWindowsと同様の設定画面だったのですが、1903からは

こんな形で、設定アプリに移動しました。

配置が換わっていて、最初どの機能がどこにあるのかわからなくて戸惑いました(;´∀`)

どの機能がどこへ移動したのか、把握するまでには少し時間がかかりそうですね…

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

【JavaScript】ArrayBufferを16進数の文字列に変換する

需要があるのかは全く分かりませんが… ArrayBuffer を16進数の文字列に変換する方法についてです。
先日ご紹介した Cordova のプラグイン「cordova-plugin-ble-central」で、接続したデバイスからデータを取得したのですが、返却される値が ArrayBuffer で、そのままでは扱えないため、変換処理が必要でした。
GitHub のページにもその旨が記載してあり、変換用のコードも掲載されていました。

function bytesToString(buffer) {
    return String.fromCharCode.apply(null, new Uint8Array(buffer));
}

が、データ受信に成功した時に得られるデータを他アプリで確認したところ、どうやら16進数の文字列のようでしたので、上記コードではなく自分で実装しました。

 

変換方法ですが、下記の記事を参考にさせてもらいました。

【Node.js】Uint8Array <-> 16進数文字列の相互変換 – Qiita
https://qiita.com/Appseed246/items/7cbab7a13f0b09cfec55

実際に書いたコードは下記のとおりです。

const hex = Buffer.from(new Uint8Array([変換したいArrayBuffer])).toString("hex");

まず、ArrayBuffer を Uint8Array に変換し、それを toString メソッドを使って 16進数に変換しました。

そして、今回使ってみるまで知らなかったのですが、toString メソッドって 10進数だけじゃなく、2進数や 16進数に変換することもできたんですね…!
今まで、ただ単に数値などを文字列に変換することにしか使っていなかったので知りませんでした。
こちらに関しては、下記の記事が参考になりそうです。

2進数・16進数・10進数-JavaScript入門
https://www.pazru.net/js/number/6.html

 

以上、ArrayBuffer を 16進数文字列に変換する方法でした。
もし使う機会がありましたら参考になれば幸いです。

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

【php】viewファイル生成で気づいたこと

laravelのことですが、viewsフォルダ内にindex.phpとindex.blade.phpと同じ名前のファイルを置くとします。

localhost:8080/helloで開くとindex.blade.phpのviewを開くようになっている。

調べたところlaravelではviewに同じ名前のファイルが存在するときはテンプレートファイルであるBlade.○○.phpを

優先しているみたいです。

すっきりしました。

 

ルーティングは以下の構文です。

</pre>
Route::get('hello', 'SampleController@index');
<pre>

説明不要ですがページを開いたときにSampleControllerクラスのindexメソッドにアクセスしています。

コントローラ内でviewに渡す変数は以下のようになっています。

</pre>
<span class="k">return</span> <span class="nx">view</span><span class="p">(</span><span class="s1">'hello.index'</span><span class="p">)</span><span class="o">-></span><span class="na">with</span><span class="p">(</span><span class="s1">'test_1'</span><span class="p">,</span><span class="nv">$data</span><span class="p">);</span>
<pre><span class="p">



view内のhello.indexはhelloフォルダのindexファイルという意味になります。

先ほど見た通りindexファイルは二つ存在していますね。ですがlaravelはBladeファイル

を優先しているのでBlade.index.phpが呼ばれています。



withメソッドは変数をviewに渡す役割をしています。同じような役割の

compactで書くとこんな感じになります。



<span class="k">return</span> <span class="nx">view</span>(<span class="s1">'hello.index' , </span></span><span class="nb">compact</span><span class="p">(<span class="s1">'test_1'</span>,<span class="nv">$data))</span></span><span class="p">
</span></pre>
<pre>

どちらでも結果は同じですが個人的にはwithのほうが見やすいかなーと思っています。

 

おまけ程度にcontrollerでviewに値を渡す方法説明しましたが少しずつMVCの概念が分かってきたので

次は良い説明ができればいいなと思っております。

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

【PHP】ホモグラフ攻撃と踏み台にされないための対策

 ホモグラフ攻撃とは直訳で人間的図形攻撃です。具体的に何をするかというと、視覚的に似た別の文字を用いてユーザの想定と異なる動作を誘発させます。特に重要で代表的な例はURLにおける攻撃で次例です。

https://www.аррӏе.com/
https://www.apple.com/

 上の二つのURLは異なるURLです。上の側だけ英語小文字に似た文字でドメイン名を記述してあります。これでユーザを誤ったURLへ飛ばし、飛び先のページで実行されるコードに悪意あるコードを仕込むことによって本格的な攻撃をします。
 この攻撃はユーザの運用によって完璧に防ぐことは困難です。いちいち文字コードや言語情報をチェックしていたらとても耐えられない不便をこうむります。この点、ブラウザがいくらか対策してくれています。例えばGoogle Chromeはο(オミクロン)を使ったgoogle.comへのアクセスを次の様に止めてくれます。

 PHPはホモグラフ攻撃の対策(主に踏み台にされないため)としてホモグラフ攻撃用文字列を検出するためのクラスSpoofcheckerを持っています。これを使えば怪しげな投稿やメールアドレスの多くを弾けます。
PHP:Spoofchecker-マニュアル
 簡単な使い方は次です。

public function isSafe($value){
    $checker = new Spoofchecker();
    $checker->setRestrictionLevel(Spoofchecker::制限レベル);// PHPリファレンスに記述はない(!?)が実装されている
    $checker->setChecks(Spoofchecker::チェックルール);

    return !$checker->isSuspicious($value);// isSuspicious関数は疑わしい時にtrueを返す
}

 制限レベルはPHP:Spoofchecker-マニュアルの定義済み定数の内のASCIIからSINGLE_SCRIPT_RESTRICTIVEまで、チェックルールはSINGLE_SCRIPT_CONFUSABLE以下です。デフォルトレベルはHIGHLY_RESTRICTIVE、デフォルトルールはSINGLE_SCRIPTです。詳しい各ルールの説明ドキュメントはPHPリファレンス内に存在しません。
 雑に使ってもそれなりに役に立つのですが、せっかくなのでルールの詳細が知りたいです。C言語で構築されたPHPのSpoofcheckerの実装は次です。これを読めば多少わかります。
php-src/ext/intl/spoofchecker at 49a4e695845bf55e059e7f88e54b1111fe284223 · php/php-src
 このディレクトリの内部を読むとC言語のuspoof機能を使っていることがわかります。C言語のuspoof機能のリファレンスは次です。
ICU 64.2: uspoof.h File Reference
 両方を参照すると制限レベル、チェックルールの二段階設定であることがわかります。
 制限レベルはICU 64.2: uspoof.h File Reference#URestrictionLevelで説明されています。日本で使うサービスとしてはデフォルト制限レベルであるHIGHLY_RESTRICTIVEがふさわしいでしょう。HIGHLY_RESTRICTIVEは日本語セット、中国語セット、韓国語セットのいずれのセットの中に納まらない文字列を怪しい文字列として疑うレベルです。
 チェックルールはICU 64.2: uspoof.h File Reference#USpoofChecksで説明されています。制限レベルをそのまま適用するRESTRICTION_LEVELが扱いやすそうです。PHPのデフォルト設定はSINGLE_SCRIPTですが、SINGLE_SCRIPTは既に非推奨でRESTRICTION_LEVELに置き換えられます。
 リファレンスが不親切で実装まで調査しましたが単に次のように使えばよさそうです。

public function isSafe($value){
    $checker = new Spoofchecker();

    return !$checker->isSuspicious($value);// isSuspicious関数は疑わしい時にtrueを返す
}

ちなみに各制限、各ルールで最上部の例のapple.comが安全ならtrue,違うならfalseにする関数でテストしたところ次結果になりました。読みづらいのは申し訳ないですがコピペとか見ている画面のデザイン変更で対応していただきたいです。

SINGLE_SCRIPT_CONFUSABLE MIXED_SCRIPT_CONFUSABLE WHOLE_SCRIPT_CONFUSABLE ANY_CASE SINGLE_SCRIPT INVISIBLE CHAR_LIMIT
HIGHLY_RESTRICTIVE true true true true false true true
MODERATELY_RESTRICTIVE true true true true false true true
MINIMALLY_RESTRICTIVE true true true true true true true
UNRESTRICTIVE true true true true true true true
SINGLE_SCRIPT_RESTRICTIVE true true true true false true true
  • この記事いいね! (2)
村上 著者:村上

【Android】「Could not find com.android.tools.build:aapt2:3.4.1-5326820」エラーの対処法

最終更新日が1年半位前のアプリを修正した時に遭遇したエラーの対処法についてです。
タイトルにもある通り、「Could not find com.android.tools.build:aapt2:3.4.1-5326820」というエラーメッセージで、何かのビルドツールが見つからないとのこと。
が、このエラーメッセージだけでは何が足りないのかが分からないので調べたところ、下記の記事がヒットしました。

[Android]「Could Not Find com.android.tools.buildaapt2:3.2.0-4818971」という謎のエラーが出てビルドできない場合の対処法
https://minpro.net/could-not-find-com-android-tools-buildaapt2

なおエラーを検索する際は、メッセージ最後の「-5326820」を消して検索すると、エラー内容を紹介した記事にヒットしやすかったです。

 

さて、今回のエラーの対処法ですが、プロジェクトレベルの「build.gradle」に下記の一行を追加するだけでした!

...
allprojects {
    repositories {
        google()  // この1行を追加する
        mavenCentral()
    }
}
...

上記のコードの通りに allproject > repositories 内に google() を追加します。
で、build.gradle ファイルを変更したので、Sync Now を実行します。
作業は以上で終了です!
あとは通常通りビルドを行ったところ、問題なく動作しました。

 

以上、「Could not find com.android.tools.build:aapt2:3.4.1-5326820」エラーが発生した時の対処法でした。
参考になれば幸いです。

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

AWS と鍵閉じ込め

今回のAWS障害の影響で、自転車の鍵が開かなくなって動けなくなったとツイートが有りました。

すでにAWSの報告も出ている様です。空調管理の障害の様ですね。

東京リージョン (AP-NORTHEAST-1) で発生した Amazon EC2 と Amazon EBS の事象概要
これらのインスタンスとボリュームの復旧には時間がかかり、一部につきましては基盤のハードウェアの障害によりリタイアが必要でした。

ちょっとこの「リタイヤ」が基になりますが。どういう意味だろうか、データ損失といういみなのかな。

他人任せるとこれです。AIも同じ部類かな。
大手サービス事業者側は、今回のAWS障害で別ゾーンや別リージョンとの冗長性も強化するのだとは思います。改善改善で良くなれば良いですが。
この程度であればなんとかなりますが、人の命に関わるところは自ら制御しないと行けないですね。

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