JavaScript – ページのURLを重複とゴミを除去して取得する

こんな感じで取得する

var result = Array.prototype.map.call(document.getElementsByTagName('a'), function(img) {
return img.getAttribute('href');
}).filter(function(url) {
return !(/^#/.test(url) || /^javascript/.test(url));
}).filter(function (url, index, self) {
return self.indexOf(url) === index;
});
console.log(result);

mapでURLを取得し、filterでゴミを除去している。重複はfilterしてindexOfで除去している。

更に応用を効かせて目的のURLだけを取得したい場合はさらにfilterを追加して正規表現を追加すればいい。取得されるURLが相対URLであり、絶対URLで得たい場合はmapで期待するパスを先頭に追加すればいい。

デベロッパーツールを開いてコンソールで上記コードを貼り付けて実行すればその場でURLも取れる。そこからそのままAjaxの処理などを追加してコンテンツをどんどん抽出するものもJSで生成すれば、実行することでコンテンツ一覧を取得でき、それをエクセルに貼り付けて。。といったこともできるんじゃないかなw

シェルスクリプトで外部コマンドの結果を得て変数に格納する

PHPで生成した値をshellで受け取りたいといった場合はこんな感じでやる

hoge=(`php date.php`)
echo $hoge

date.phpの中身はこんな感じにして実行すると

<?php
date_default_timezone_set('Asia/Tokyo');
echo date(DateTime::ATOM);

以下のように結果を得ていることを確認できる

$ sh test-shell.sh
2015-11-02T14:52:24+09:00

shellだけで実現できない処理とか一部OS間の差異を吸収したい時に役立つ

JavaScript – クロスサイト間のAjax通信ではリクエストが2回送信される

Ajaxでクロスサイトで通信していたら重複したリクエストが検出された。一回目は何もデータが入っておらず、2回目はデータが入っているという現象である。ネットワークを見ていたらmethodにOPTIONSという通信があって気づいたんだが、クロスサイトで通信する場合は確認用のリクエストを送るそうだ。

Präparat Blog: 異なるドメインのURLからデータを参照する方法 - Cross-Origin Resource Sharing

また、条件によって実際のリクエストを行う前に「このリソースにこのメソッド、ヘッダで参照できますか?」という preflight リクエストを行うことがあります

その条件っていうのが以下のような感じらしい。どうしてもpreflightリクエストさせたくない場合はContent-Typeに気を使ってみるといいかもしれない。

developer.mozilla.org

また application/x-www-form-urlencoded、multipart/form-data、または text/plain 以外の Content-Type とともに POST を行う場合、例えば application/xml または text/xml を用いて XMLペイロードをサーバーへ送るために POST を用いるような場合は、リクエストでプリフライトを行います。

受け側はmethodを読んで挙動を変えなければいけないなw

JavaScriptには遅延処理と定期実行はあってもsleepは無い

JavaScriptでスリープと検索するとsetTimeoutとかsetIntervalとかでの実装が紹介されていると思うが、本当の意味でのスリープは多分存在しないと思う。もしあったら教えて!

ほぼ実用的ではないけどforを1万回回すとかの方法で遅延させることならできると思うが。。スリープ的な処理になるのかは不明。

Ajaxとかで非同期の処理をやっていると、0.2秒で良いから停止してくれれば通信処理を楽にかけるしコードもシンプルになるんだけどな。でもそこがJavaScriptの良いところかという独り言。

Genymotionの端末でconsole.logを確認する

adb devicesで現在起動している端末のホスト名とポート番号を確認できるので、それを使ってログを確認する方法がある。ただしオブジェクトの中身を展開したりとiOSシュミレーターのようなことをすることはできないのが難点である。

$ ./adb -s localhost:5555 logcat | grep browser

Thanks

5509.hatenablog.com

Genymotionを入れた場合のadbコマンドの場所

abdコマンドはAndroid SDKを入れると入るんだっけ?いちいち入れるのもなあ、そもそも入れてたしAndroid Studio入れてるしどっかに入っているんじゃないかと思って検索したら、Genymotionに付属であるっぽかった。

/Applications/Genymotion.app/Contents/MacOS/tools/adb devices

ちゃんと実行できる

$ /Applications/Genymotion.app/Contents/MacOS/tools/adb devices
List of devices attached

GenymotionのhostsをMacと同期する

iOSシュミレーターなんかはMacのhostsが反映されているけど、Genymotionはデフォルトでは反映されていないが、hostsファイルをマウントすることで解決することができるようだ

adb root
adb remount
adb push /etc/hosts /system/etc

Thanks

qiita.com