カテゴリーアーカイブ JavaScript

村上 著者:村上

【Cordova】QRコードリーダーを実装するプラグイン「phonegap-plugin-barcodescanner」

今回はCordovaで開発しているアプリに、QRコードリーダーの機能を実装する方法について。
コードがかなり分かりやすかったのでおすすめのプラグインです。
使用したプラグインは「phonegap-plugin-barcodescanner」。
phonegap という名前が付いていますが、Cordovaでも問題なく使えます。

GitHubはこちらから。

GitHub – phonegap/phonegap-plugin-barcodescanner: cross-platform BarcodeScanner for Cordova / PhoneGap
https://github.com/phonegap/phonegap-plugin-barcodescanner

 

早速実装方法ですが、まず下記のコマンドでプラグインを追加します。

cordova plugin add phonegap-plugin-barcodescanner

プラグインの追加が終ったら、config.xml を確認します。
もし、下記の1行が追加されていなかったら追加してください。

<preference name="android-build-tool" value="gradle" />

また、iOSの場合は、info.plist に 「Privacy – Camera Usage Description」の項目を追加しないと、アプリからカメラが起動できないので、こちらも追加します。
設定はこのくらいです。

あとは、下記のコードを記述するだけです。

cordova.plugins.barcodeScanner.scan(
    function (result) {
        // QRコードの読み込み成功
        // 成功時の処理
        // Result: result.text
        // Format: result.format
        // Cancelled: result.cancelled
    }, 
    function (error) {
        // 読み込み失敗
        // 失敗時の処理
    }
);

上記のコードが実行されると、自動的にカメラを使用するかを尋ねるダイアログが表示され、許可を選択すると、画面内に四角形が表示されているQRコードリーダーが起動します。
で、カメラを適当に作成したQRコードにかざしたところ、無事コード内の情報を取得できました。

ちなみに、試しに作ったQRコードは、本記事のアイキャッチ画像でも使用しています。
なお、取得できるのはこのブログのURL https://cpoint-lab.co.jp/です。
このURLは、上記のコードでは、result.text で取得できます。
適当なコードが見つからない場合は、是非ご利用ください。

 

以上、CordovaアプリでQRコードリーダー機能を実装する方法でした。
最初はカメラを扱うということで、難しいのでは…と思っていましたが、実装が楽なプラグインのおかげでかなり簡単でした!
もし似たようなことを行いたいとお考えでしたら、是非ご参考にしてください。

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

【Cordova】iBeaconを扱うための「cordova-plugin-ibeacon」が動作しない時の対処法

先日投稿した、「【Cordova】アプリでiBeaconを扱うための「cordova-plugin-ibeacon」が動作しない【未解決】」という記事の、解決策が見つかりました…!
解決策というより、原因はコードに一部抜けがあったせいなんですけどね!

 

早速ですが、正常に動作したコードはこちら!

    // 位置情報を取得
    cordova.plugins.locationManager.requestWhenInUseAuthorization();
    cordova.plugins.notification.local.registerPermission(function (granted) {
        // console.log('Permission has been granted: ' + granted);
    });

    // delegateの作成と設定
    var delegate = new cordova.plugins.locationManager.Delegate();
    delegate.didDetermineStateForRegion = function(pluginResult) {
        console.log('didDetermineStateForRegion', pluginResult);
    }
    delegate.didStartMonitoringForRegion = function(pluginResult) {
        console.log('didDetermineStateForRegion', pluginResult);
    }
    
    // ビーコンを検知している間呼ばれる
    delegate.didRangeBeaconsInRegion = function(pluginResult) {
        document.getElementById("rangeDiv").value = JSON.stringify(pluginResult);
    }
    
    // ビーコンをキャッチ
    delegate.didEnterRegion = function(pluginResult) {
    }

    // ビーコンの範囲外に移動
    delegate.didExitRegion = function(pluginResult) {
    }

    // delegate の設定
    cordova.plugins.locationManager.setDelegate(delegate);

    // 監視するビーコンの設定
    var uuid = '00000000-1d4e-1001-b000-001c4dbec041';
    var identifier = 'ibeacon';
    var major = 1;
    var minor = 3;
    var beaconRegion = new cordova.plugins.locationManager.BeaconRegion(identifier, uuid, major, minor);
    beaconRegion.notifyEntryStateOnDisplay = true;

    // 監視の開始
    cordova.plugins.locationManager.startRangingBeaconsInRegion(beaconRegion)
        .fail(function(e) { console.log(e); })
        .done();
    cordova.plugins.locationManager.startMonitoringForRegion(beaconRegion)
        .fail(function(e) { console.log(e); })
        .done();

変更点は、49行目の下記の記述を追加した点です。

cordova.plugins.locationManager.startRangingBeaconsInRegion(beaconRegion)
    .fail(function(e) { console.log(e); })
    .done();

様々なサンプルコードを見比べたところ、ここの記述が不足していました。
で、コードを追加したところ、問題なくビーコンの信号を取得できました!
というわけで、ただの私のポカミスだったわけです。
…凡ミスで恥ずかしい限りです。
今後は気を付けなければいけませんね。

 

ということで、以上、iBeaconを扱うための「cordova-plugin-ibeacon」が動作しない時の対処法でした。
可能であれば、きちんと動作するサンプルコードを改変してアプリ開発を行った方が安全かもしれません。

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

【Cordova】JavaScript上のConsole.log()をXcodeのデバッグエリアに表示する方法

以前からCorodvaアプリを開発していましたが、最近になって便利なプラグインを発見したのでご紹介。
というか、何故これを開発初期に入れていなかったのか…ちょっと後悔しています。

 

おすすめしたいプラグインは「cordova-plugin-console」です。
タイトルにもあるように、こちらのプラグインを導入すると、JavaScript上で記述した console.log() などの結果を、Xcodeのデバッグエリアに表示させることができます。
なお、参考にさせていただいたサイトはこちらから。

Cordova アプリの console.log() を XCode に出力する cordova-plugin-console – Corredor
http://neos21.hatenablog.com/entry/2017/07/10/080000

そして、GitHubのリンクはこちらから。

GitHub – apache/cordova-plugin-console: Apache Cordova Plugin console
https://github.com/apache/cordova-plugin-console

導入方法は、下記のコマンドを実行するだけ。

cordova plugin add cordova-plugin-console

あとは、devicereadyイベントの後に console.log() を記述すれば、それがデバッグエリアに表示されます!
また、試してはいませんが、Android Studio でも同様に使えるそうです。

 

以上、Console.log() をXcodeのデバッグエリアに表示する方法でした。
プラグインの導入だけなので、かなり簡単に行えます!

今まで alert() をメインで使ってきて、そこまで不便は感じていなかったのですが…やはりできるとかなり楽ですね。
Cordovaアプリの開発者はぜひインストールをご検討ください。

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

【Cordova】アプリでiBeaconを扱うための「cordova-plugin-ibeacon」が動作しない【未解決】

今回は、「cordova-plugin-ibeacon」という、CordovaアプリでiBeaconを取り扱うためのプラグインについてです。
Android端末では思い通りに動作したのですが、何故かiOSでは、ビーコンの信号をキャッチできず…。
色々サイトを見て、設定等を変更しているのですが、残念ながら、まだ未解決です。

 

使用したプラグインはこちらから確認できます。

GitHub – petermetz/cordova-plugin-ibeacon: An iBeacon plugin for Phonegap / Cordova 3.x and upwards. Supports both iOS and Android (contributions are welcome)
https://github.com/petermetz/cordova-plugin-ibeacon

で、実際に記述したコードはこちら。

var uuid = '[使用するビーコンのUUIDを指定]';
var identifier = 'ibeacon';
var major = 0;
var minor = 0;
var beaconRegion = null;
// 監視するビーコンの設定
beaconRegion = new cordova.plugins.locationManager.BeaconRegion(identifier, uuid, major, minor);
    
// delegateの作成と設定
var delegate = new cordova.plugins.locationManager.Delegate();
delegate.didStartMonitoringForRegion = function(pluginResult) {
    // ビーコンの観測の開始に成功
};

delegate.didDetermineStateForRegion = function(pluginResult) {
    // 領域への入退場のステータス変化を検知
};

delegate.didEnterRegion = function(pluginResult) {
    // ビーコンをキャッチした時に呼ばれる
    cordova.plugins.notification.local.schedule({
        title: "iBeacon",
        text: "didEnterRegion",
        foreground: true
    });
};

delegate.didRangeBeaconsInRegion = function(pluginResult) {
    // ビーコンを検知している間呼ばれる
};

// delegate の設定
cordova.plugins.locationManager.setDelegate(delegate);

// パーミッションチェック
cordova.plugins.locationManager.requestAlwaysAuthorization();
cordova.plugins.notification.local.requestPermission();
cordova.plugins.backgroundMode.enable();

// 監視の開始
cordova.plugins.locationManager.startMonitoringForRegion(beaconRegion)
    .fail(function(e) { })
    .done();
}

19行目で、ビーコンが発信している信号をキャッチしたら、通知を飛ばす、という処理を行いたかったのですが、これが動作せず…。
もしや、通知の設定が間違っているのか?と思い、別の箇所で動作確認をしたところ、問題なく動作したので、通知の問題ではなさそう。

また、11行目や15行目の関数内でも、試しに通知の処理を記述して見ましたが、こちらでも問題なく通知がされたので、プラグインにも問題はないようです。
ただ、15行目のビーコンの通知領域への入退場ステータス変化を検知した時に実行される関数では、引数 pluginResult.state が「CLRegionStateOutside(通知範囲から退場)」しか取れていないようだったのが気にかかっています。
どうやら範囲内に入った検知が行えていないようで…でも、その対処法がわからず、悩み続けております。

 

GitHubに、おそらく同じことでお悩みの方の投稿があったので見てはいるのですが、それでも解決できず。
ちなみに投稿はこちら。

IOS Plugin not working…・Issue #167・petermetz/cordova-plugin-ibeacon・Github
https://github.com/petermetz/cordova-plugin-ibeacon/issues/167

こちらの投稿では、locationManager のパーミッションのリクエストをしているかや、XCodeでの設定についての確認があり、それらに対応したのですが、それでも動かず…。
…根が深そうな気がしますね。
一度、プラットフォームの削除と再インストールを試してみようかな?

 

なお、サンプルコードはきちんと動作したので、私のコードもしくは設定が間違っているのは間違いなさそう。
原因がわかったら、また改めてご紹介したいと思います!
それまでしばしお待ちを!

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

【JavaScript】GoogleMapのルート検索機能で経由地追加する方法

タイトル通り、GoogleMapのナビゲーション機能で、経由地を追加する方法です。
HTMLに直接マップを埋め込み、検索する方法と、Maps URLを利用する方法がありますが、今回は前者についてまとめます。

 

まず、GoogleMapを使用する事前準備として、APIキーを取得します。
下記のページから取得できますが、クレジットカード情報を入力する必要がありますので、ご用意ください。

Google Maps Platform
https://cloud.google.com/maps-platform/?hl=ja

また、無料トライアル期間がありますが、それを過ぎると有料になりますので、その点もご承知おきください。

なお、操作をしないと有料サービスには移行しませんので、ご安心ください。

無事APIキーが取得出来たら、あとは下記コードをコピー&ペーストするだけ。
参考にさせていただいたサイトがあったのですが、どのサイトなのかメモをし忘れてしまいました…。

まず、headタグ内で、下記を指定します

<script src="http://maps.google.com/maps?file=api&v=2&key=[APIキー]&sensor=false" type="text/javascript" charset="utf-8"></script>

body は下記のように記述しました

<body onload="initialize()" onunload="GUnload()">
    <form>
        <input type="text" size="20" id="from" value="出発地点" />
        --><input type="text" size="20" id="step1" value="経由地1" />
        --><input type="text" size="20" id="step2" value="経由地2" />
        --><input type="text" size="20" id="to" value="到着地点" />
        <input type="button" id="btn1" value="ルート案内" onclick="dispRoute()" />
    </form>
    <div id="map_canvas" style="width: 100%; height: 350px"></div>
    <div id="route" style="width: 100%; height: 200px;overflow: scroll"></div>
</body>

JavaScrip は以下のとおりです。

var map;
var directions;

function initialize() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"));
        map.setCenter(new GLatLng(35.681379,139.765577), 13);
        directions = new GDirections(map, document.getElementById('route'));
    }
}
function dispRoute() {
    var from = document.getElementById("from").value; // 出発先
    var step1 = document.getElementById("step1").value; // 経由地1
    var step2 = document.getElementById("step2").value; // 経由地2
    var to = document.getElementById("to").value;     // 目的地

    directions.clear();

    var pointArray = [from, step1, step2, to];
    directions.loadFromWaypoints(pointArray, {locale: 'ja_JP'});
}

bodyが読み込まれたタイミングで initialize() を実行してマップを表示し、ルート検索ボタンをクリックすると、dispRoute()が実行されます。
なお、今回はテストとして、経由地を2か所指定してあります。
で、上記を実行したところ、当然ではありますが、2点の経由地を通るルート検索を無事に行うことができました。

 

以上、JavaScriptを使ってGoogleMapで経由地ありのルート検索を行う方法でした。
機能としては、やはりGoogleMapはとても優秀ですね。
デザインを凝るならMapboxがおすすめですが、ナビゲーション機能とか、あとは日本語対応している点では、GoogleMapが優れていると思います。
ナビゲーション機能重視なら、GoogleMapをおすすめします。
開発したい機能に応じて使い分けてください。

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

【JavaScript】Mapboxの「There is already a source with this ID」エラーの対処法

先日投稿したMapboxのエラーについて、対処法が分かったのでご紹介!
というか、まさにほぼ同じことにお悩みの方がいらっしゃり、そこで対処法が紹介されていたので、それをコピー&ペーストしたら、動きました。
検索が下手だったようです…反省。

なお、以前の記事はこちらから。

【JavaScript】Mapboxで「There is already a source with this ID」エラーが発生【未解決】
https://cpoint-lab.co.jp/article/201808/【javascript】mapboxで「there-is-already-a-source-with-this-id」エラーが発生【未解決】

ざっくりと状況を説明すると、Mapboxで追加できるナビゲーション機能を追加してから一旦削除し、もう一度追加しようとすると、「There is already a source with this ID」という IDの重複エラーが発生し、ナビゲーション機能を追加できない状態でした。

 

さて解決策ですが、ナビ機能を削除する、removeControl() を実行したタイミングで下記の項目も削除するだけでした。

map.removeLayer('directions-route-line');
map.removeLayer('directions-route-line-alt');
map.removeLayer('directions-hover-point-casing');
map.removeLayer('directions-hover-point');
map.removeLayer('directions-waypoint-point-casing');
map.removeLayer('directions-waypoint-point');
map.removeLayer('directions-origin-point');
map.removeLayer('directions-origin-label');
map.removeLayer('directions-destination-point');
map.removeLayer('directions-destination-label');
if (map.getSource('directions')) map.removeSource('directions');

なお、この解決策が紹介されていた投稿はこちらから。

Error when adding controls dynamically #5089・mapbox/mapbox-gl-js・GitHub
https://github.com/mapbox/mapbox-gl-js/issues/5089

実際に、ソースコードに追加するとこのような感じ。

var directions;
function navi() {
    if(['条件:ナビ機能が追加済みだったら']) {
        map.removeControl(directions);

        /* ここから */
        map.removeLayer('directions-route-line');
        map.removeLayer('directions-route-line-alt');
        map.removeLayer('directions-hover-point-casing');
        map.removeLayer('directions-hover-point');
        map.removeLayer('directions-waypoint-point-casing');
        map.removeLayer('directions-waypoint-point');
        map.removeLayer('directions-origin-point');
        map.removeLayer('directions-origin-label');
        map.removeLayer('directions-destination-point');
        map.removeLayer('directions-destination-label');
        if (map.getSource('directions')) map.removeSource('directions');
        /* ここまで */

        directions = null;
    } else {
        directions = new MapboxDirections({
                        accessToken: mapboxgl.accessToken
                    });
        map.addControl(directions, 'top-left');
    }
}

どれか一つがなくてもダメなようで、試しに2行ほど削除してみたのですが、当然ながらその行でエラーが発生し、実行できませんでした。

作業は以上で完了です。
画面をリロードして動作確認をしたところ、問題なく動作しました!

 

以上、Mapboxのエラーの対処法でした。
前回の記事でも書いたのですが、Mapboxのナビ機能ってそこそこサイズが大きいので、特にスマートフォンでは表示/非表示を行いたかったんですよね。
最初はCSSを操作して、ナビゲーションウィンドウを消すことも考えたのですが、ウィンドウが見えないだけでナビ機能は有効だったので、どうしても機能自体のON/OFFを切り替えたかったんです。

あとは…ラベルとか、ナビの道順のところを日本語化できないかな…と考えています。
こちらもとっかかりが見つかったら、改めてご紹介したいと思います。

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

【JavaScript】Mapboxで「There is already a source with this ID」エラーが発生【未解決】

タイトルにも書いてありますが、未解決です。

先日からMapboxを触っているのですが、その中でナビゲーション機能を追加・削除したいと考えています。
で、追加して削除までは成功したのですが、その後もう一度追加しようとすると、「There is already a source with this ID」というエラーが発生している状況です。
Google翻訳に掛けたところ「このIDを持つソースが既に存在します。」とのことだったので、削除したコントローラのデータが一部残っているのではと思っております。

ちなみにエラーが発生しているソースコードはこちら。

var directions;
function navi() {
    if(['条件:ナビ機能が追加済みだったら']) {
        map.removeControl(directions);
        directions = null;
    } else {
        directions = new MapboxDirections({
                        accessToken: mapboxgl.accessToken
                    });
        map.addControl(directions, 'top-left');
    }
}

このコードを実行すると、1回目の追加と削除が成功した後、10行でエラーになります。

まだしっかりと読めてはいないのですが、下記の記事が同じ原因で発生しているように見えるので、時間をとってしっかり確認したいと思います。

layers don’t show up after removing them and adding them again・issue #5440・mapbox/mapbox-gl-js
https://github.com/mapbox/mapbox-gl-js/issues/5440

 

CSSでの単なる表示・非表示の切り替えも考えたのですが、検索窓が見えないだけで実行されてしまうので、結局この方法がベストかな、と考えています。
解決策が分かったら、また改めてご紹介したいと思います!

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

【JavaScript】Mapboxを使って場所の検索機能を実装する方法

最近、Mapboxを業務で使っているので、今回もMapboxで実装できる機能の紹介を。
できることが多すぎて、いっそ何ができるのかわかりにくいので、個人的に使えそうだと思った機能をピックアップしていこうと思います。
前回はナビゲーション機能でしたが、今回は場所の検索機能について。

公式サイトのサンプルはこちらから。

Add a geocoder|Mapbox
https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-geocoder/

 

まず、実装できる画面はこちら。

画面左上に検索窓が表示されるので、こちらに検索したいキーワードを入力します。
試しに「浜松駅」と入力しましたが、問題なく機能しました。

実装方法ですが、まず下記のJSファイルとCSSファイルを読み込みます

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D'https%3A%2F%2Fapi.mapbox.com%2Fmapbox-gl-js%2Fplugins%2Fmapbox-gl-geocoder%2Fv2.3.0%2Fmapbox-gl-geocoder.min.js'%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
<link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v2.3.0/mapbox-gl-geocoder.css' type='text/css' />

次に、下記のコードを追加します。

map.addControl(new MapboxGeocoder({
    accessToken: mapboxgl.accessToken
}),"top-left");

何と実装は以上で完了です!
とても簡単ですね!
また、第2引数の「top-left」を変更することで、表示位置も調節できます。
例えば、右下に配置したい場合は「bottom-right」と指定します。

 

以上、Mapboxのマップに検索窓を追加する方法でした。
ただ、検索後、その場所に移動はしますが、マップピンが立つなどの機能はないので、そこは自分で実装する必要がありますね。
が、簡単な検索ならこれで十分すぎるくらいの機能だと思います。

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

【JavaScript】Mapboxを使ってルート検索を行う方法

Mapboxでルート検索を行いたかったので調べてみたところ、プラグインがあったので試してみました。
導入もとても簡単で、しかも無料とのこと!

なお、今回参考にさせていただいたサイトはこちらから。

Mapbox でルート検索を試してみた – マルティスープ株式会社
https://maps.multisoup.co.jp/blog/2818/

なお、GitHubはこちらから。

GitHub – mapbox/mapbox-gl-directions: Directions plugin for mapbox-gl-js using Mapbox Directions API.
https://github.com/mapbox/mapbox-gl-directions

 

さて、ルート検索プラグインの導入方法ですが、まずMapboxのアカウントを作成し、画面上に地図を表示させるところから行ってください。
こちらの方法については、下記の公式サイトをご確認ください。

Welcome to Mapbox | Mapbox
https://www.mapbox.com/install/

上記の方法で地図が表示出来たら、下記のコードを追加します。

まずは、プラグインを使用するためのJavaScriptファイル及びCSSファイルの読み込みです。

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D'https%3A%2F%2Fapi.mapbox.com%2Fmapbox-gl-js%2Fplugins%2Fmapbox-gl-directions%2Fv3.1.1%2Fmapbox-gl-directions.js'%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
<link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-directions/v3.1.1/mapbox-gl-directions.css' type='text/css' />

次に下記のJavaScriptコードを追加します。

// アクセストークン設定
mapboxgl.accessToken='xxxxxxxxxxxxxxxxxxxxx';
// 地図生成
var map = new mapboxgl.Map({
    container: 'map',
    center: [地図の中心座標],
    zoom: 10,
    styles: 'mapbox://styles/mapbox/streets-v10'
});

// ここから下のコードを追加
map.addControl(
    new MapboxDirections({
        accessToken: mapboxgl.accessToken
    }), 'top-left');

なお、地図生成のコードは既に追加されているはずなので、12行目以降のコードを追加してください。

そうすれば、下記のようにルート検索用のメニューが表示されるはずです。

ルート検索を行いたい場合は、地図上で出発地点と到着地点をクリックすればOKです。
ルート検索後は、車や徒歩、自転車から移動手段を選択できます。
また、ルートも3候補くらい出してくれます。

ただ、Googleマップのように建物名や住所では検索できないのが少し難点ですね。

 

以上、Mapboxでルート検索をする方法でした。
検索機能は少し限定的ですが、導入は簡単だし、何よりも無料なので、簡単なルート検索機能の導入でしたら是非お試しになってはいかがでしょうか。

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

javascriptにおける型変換による計算のさわり

 javascriptは型変換を行うことによって記述から予想される実行結果と実際の実行結果が異なることが起きやすい語です。それぐらい大きく変化の起きる型変換を用いた小ネタです。

+[]

 これの実行結果が
 
 です。javascriptは正負の様な数式符号がついた対象を数字として扱う動作があります。大体、空っぽい対象は0、trueっぽい対象は1として評価されます。そのためこの様な結果になります。これを利用すると次の様なこともできます。

 この手の型変換をこれでもかと利用した方法に記号プログラミングというものがあります。例えば、Aを表すコードは次になります。

(([][($+[])[-~-~-~[]]+(({})+[])[-~[]]+([][![]]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]+(!![]+[])[-~[]]+($+[])[-~[]]+($+[])[-~-~-~[]]+(!![]+[])[+[]]+(({})+[])[-~[]]+(!![]+[])[-~[]]])+[])[-~-~-~[]*-~-~-~[]]
  • この記事いいね! (0)