Showing posts with label JavaScript. Show all posts
Showing posts with label JavaScript. Show all posts

2014-02-08

Google Keep をエクスポートするブックマークレット「ExKeep」

Catch.com がサービス終了してしまった今、日常のちょっとしたメモを取る Android アプリとして、Google Keep を愛用している。けれど、Keep には今のところエクスポート用のツールが用意されていない。Google Takeout で Google Drive を指定したら?と試してみたけど、Keep のデータは対象外の模様。

バックアップが取れないというのは、やはり不安の種。…ということで、必要は発明の母とばかりに作ってみた。Google Keep で記録した内容を、テキストで書き出してくれるブックマークレット。 上のリンクをドラッグしてブックマークバーへ移動させるか(Google Chrome)、リンクを右クリック後「このリンクをブックマーク」(Firefox)しておいて、PC 版の Google Keep を開いたところで使用する。

これが元の Google Keep の画面だとして、


ブックマークレットを使用してみると、こんな感じになる。これをテキストファイルに貼り付けて保存するのがよいかと。


まあ、インポートする仕組みがないのでアレなんだけれども、大事な文章やアイデアが無に帰してしまうということはなくなるはず。うちの環境(Windows 7、64bit)だと、Firefox でも Google Chrome でも動いた。どんな環境で動いたり動かなかったりするのか分からないけれども、よかったらどうぞ。

2013-06-02

JavaScript の parseInt ではまる



Java の parseInt は特に指定しなければ 10 進数として解析されるので油断していたのだけれど、
JavaScript の場合 parseInt は "010" で 8 進数、"0x10" で 16 進数として解釈されたりするのね。

parseInt("010", 10) とかって、入力値によっては基数を明示しとかないと困ることがあるのか。ほほう。

2012-05-27

Blogger ブログ移行用、MovableType 形式のエクスポートデータの日付を変換するツール

最近投稿のタイトルが長くなってきている気がするのだけれど、まあ、表題の通り。


このツールで自動的にしてくれること:
  • 日本標準時(JST)をグリニッジ標準時(GMT)に変換。 (例: 5/5 08:34 → 5/4 23:34)
  • 24 時間制の時刻を 12 時間表記に。 (例: 23:34 → 11:34 PM)
  • 0 時台は 12 時台へ書き換え(Blogger の仕様)。 (例: 0:12 AM → 12:12 AM)

他のブログサービスのブログデータを Blogger へ移行するときに使用する、エクスポートファイル変換ツール MovableType2Blogger へデータを送る前に、こちらで日時変換を行っておくのがいいかと。






ちなみに、けっこうどうでもいいことだけれど、このツールのコードはこちら。
<script type="text/javascript">
<!--
function getGMTDate(s) {
  var d = new Date(s);
  var h = d.getUTCHours();
  var a;
  if (h > 11) {
    a = "PM";
    h -= 12;    
  } else {
    a = "AM";
  }
  if (h == 0) {
    h = 12;
  }
  return getDecimalNumber(d.getUTCMonth() + 1) + "/" + getDecimalNumber(d.getUTCDate()) + "/" + d.getUTCFullYear() + " " + getDecimalNumber(h) + ":" + getDecimalNumber(d.getUTCMinutes()) + ":" + getDecimalNumber(d.getUTCSeconds()) + " " + a;
}
function getDecimalNumber(n) {
  if (n >= 0 && n < 10) {
    return "0" + n;
  } else {
    return "" + n;
  }
}
function changeDate() {
  var raw = document.getElementById("datechangerin").value;
  var rslt = raw.replace(/^DATE: (.*)$/gm, function(a, b) {return "DATE: " + getGMTDate(b);});
  document.getElementById("datechangerout").value = rslt;
}
function selectResult() {
  document.getElementById('datechangerout').select();
}
//-->
</script>
<form action="" onsubmit="changeDate();return false;">
  <textarea id="datechangerin" name="" rows="10" cols="30"></textarea>
  <input type="submit" value="変換" />
  <textarea id="datechangerout" name="" rows="10" cols="30" readonly="readonly"></textarea>
  <input type="button" onclick="selectResult();" value="全選択" />
</form>
何かの参考になれば幸い。

2012-05-26

Google マップでクリックした場所の住所と緯度・経度と郵便番号を表示するプログラム


あと郵便番号までわかったら最高なんですけどね・・・。
という一言に、勝手に触発されて作ってみたのが上のマップ。

Google Maps API から緯度・経度情報を取得して、それを JSONP でグルーブテクノロジーの郵便番号検索 API に送り、返ってきた郵便番号を再び Google Maps API でマップ上に情報を表示する…というのが基本的な処理の流れ。

あとは、オートコンプリートの検索窓を付けたり、マーカー、インフォボックス、メッセージの表示方法を API リファレンスを見ながらちょこちょこ変更。

参考にしたのが、以下のサイト。
で、肝心のコードがこちら。
<input id="searchTextField" type="text" size="50" />
<div id='map' style='width:600px; height:600px;'><br></div>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&libraries=places"></script>
<script type='text/javascript'><!--
var ad = "";
var ll = "";
var map = new google.maps.Map(document.getElementById("map"), {
  zoom: 12,
  center: new google.maps.LatLng(35.689479,139.691778),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});
google.maps.event.addListener(map, 'click', function(mouseEvent) {
  getAddress(mouseEvent.latLng);
});
var input = document.getElementById('searchTextField');
var autocomplete = new google.maps.places.Autocomplete(input);
autocomplete.bindTo('bounds', map);
var infowindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker({map: map});
google.maps.event.addListener(autocomplete, 'place_changed', function() {
  var place = autocomplete.getPlace();
  if (place.geometry) {
    if (place.geometry.viewport) {
      infowindow.close();
      map.fitBounds(place.geometry.viewport);
    } else {
      map.setCenter(place.geometry.location);
    }
  }
});
function getAddress(latlng) {
  var geocoder = new google.maps.Geocoder();
  geocoder.geocode({
    latLng: latlng
  }, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      if (results[0].geometry) {
        ad = results[0].formatted_address.replace(/^日本, /, '');
        var ad2;
        if (ad.match(/^([^0-9]+)/)) {
          ad2 = RegExp.$1;  
        }
        ll = latlng;
        var s = document.createElement("script");
        s.charset = "utf-8";
        s.src = 'http://api.postalcode.jp/v1/zipsearch?word=' + encodeURIComponent(ad2) + '&callback=showPostalCode';
s.charset = 'utf-8';
        document.body.appendChild(s);
      }
    } else {
      alert(status);
    }
  });
}
function showPostalCode(data) {
  var l = ll.toUrlValue();
  var p = formatCode(data.zipcode.a1.zipcode);
  marker.setPosition(ll);
  infowindow.setContent(((p)? "<span style=\"color:red;\">" + p + "</span><br />": "") + ad + "<br />" + "<a style=\"color:green;\" href=\"https://maps.google.co.jp/maps?q=" + l + "\" target=\"_blank\">" + l + "</a>");
  infowindow.open(map, marker);
}
function formatCode(c) {
  return (c.match(/(\d{3})(\d{4})/))? "〒" + RegExp.$1 + "-" + RegExp.$2: "";
}
//-->
</script>
とりあえず、Firefox と Chrome では動作を確認。IE は知らない。

Google Maps API、初めて触ってみたものの、なかなか手軽で面白い。地図を使ったウェブアプリ、何かアイデアが浮かんだら作ってみてもいいかも…。

2012-05-06

Blogger のガジェット更新用 API と「クリボウ式 Blogger カレンダー」の話

ずっと以前(もう 5 年以上前 !?)に公開していたカレンダーガジェット がいつの間にか動かなくなっていたので、修正。

試験的にこのブログのサイドバーにも追加してみたので、いろいろ触ってみるといいかと。

どの日付に投稿が存在するかのデータをフィード(JSON)で取ってきて、カレンダー上にリンク表示するというところまでは問題なかったのだけれど、投稿があるとされる日付リンクをクリックしてもその投稿を表示できなくなっていた。

このガジェットの投稿の表示の仕方は、画面遷移なしにブログの投稿エリアのデータだけを動的に差し替えるというもの。Blogger 自体の、ガジェットを編集したときなんかに、リフレッシュなしにその変更が反映される仕組みをそのまま利用している。


Blogger のガジェット更新用 API

たとえば、このブログのカレンダーで 2012-04-30 の日付クリックすると、呼び出すようになっているのが次の URL。

http://kuribo-programming.blogspot.com/?action=nextposts&widgetId=Blog1&widgetType=Blog&responseType=js&path=http%3a%2f%2fkuribo%2dprogramming%2eblogspot%2ecom%2fsearch%3fupdated%2dmin%3d2012%2d04%2d30T00%253A00%253A00%252B09%253A00%26updated%2dmax%3d2012%2d04%2d30T23%253A59%253A59%252B09%253A00%26max%2dresults%3d500

説明のために、青字部分を URL デコードすると、こう。

http://kuribo-programming.blogspot.com/search?updated-min=2012-04-30T00%3A00%3A00%2B09%3A00&updated-max=2012-04-30T23%3A59%3A59%2B09%3A00&max-results=500

アクセスしてみると分かるけれども、2012-04-30 の 00:00 から 23:59 に投稿されたデータを最大 500 件取ってきて表示するという、Blogger ブログの検索ページの URL をそのまま渡している。

あとは赤字部分のパラメータ指定で、取得した投稿データを Blog1 という ID のウィジェット(投稿ウィジェット)に表示するための JavaScript コードが得られる。

実際にアクセスすると、返ってくるコードはこんな感じ。赤字部分に実際の投稿データが入る。

try {
_WidgetManager._HandleControllerResult('Blog1', 'nextposts',{'renderedData': '...'});
} catch (e) {
  if (typeof log != 'undefined') {
    log('HandleControllerResult failed: ' + e);
  }
}


変更点

カレンダーガジェットに話を戻すと…。

ここまで説明してきた Blogger のガジェット(ウィジェット)更新用 API は、これまでと変わらず正確に動くのだけれど、問題はその呼び出し方。カレンダーでは、POST メソッドでパラメータを送っていたのだけれど、いつの間にか

405 Method Not Allowed

になっていたみたい。しょうがないので、日付クリック時には JSONP 的に script タグをドキュメント末尾に追加するようにして、その src に最初の URL を指定することにした。

「動かないし!」とカレンダーに見切りをつけた人も、もう一度ブログにつけてもらえると嬉しかったり…。ガジェット追加は、最初に掲示したリンク先から。


自分の備忘録として記事にしてみたけれども、Blogger ブログの一部分のコンテンツを動的に変えたいプログラマな人は、参考にしてもらえるといいかと。

2012-03-18

blogspot.jp にリダイレクトされてしまう Blogger ブログを再び blogspot.com/ncr にリダイレクトするためのスクリプト

Blogger ブログの blogspot.jp へのリダイレクト騒動と、/ncr でリダイレクトを一時的に停止できる件については、こちらを読んでもらうとして…。 読者に /ncr パラメータをわざわざつけてもらうというのは不可能に近いので、スクリプトで対応したらどうか、と思った次第。 <head> のすぐあとに入れておくのがいいかと。

<script type="text/javascript"> if (!location.hostname.match(/blogspot\.com$/)) {   location.href = "http://" + location.host.replace(/blogspot\.[a-z]+/, "blogspot.com") + "/ncr" + location.pathname + location.search + location.hash } </script>

いや、こういうこともできるよ、という参考程度に考えてもらえるとありがたい。Blogger(Google)の方針とは完全に逆の方向なので、おとがめがあるかもしれず…、あくまで導入は自己責任で。

参考:
追記:

と思ったけれど、このスクリプトだと、Google ウェブ検索のキャッシュで表示されたときにもリダイレクトしてしまいますね…。失敗。

こっちの方がよさそう。
再追記(2012-03-24):

追記で載せたリンク先のスクリプトも、blogspot.ca など、ほかの国別ドメインへリダイレクトされたときに、スクリプトが止まらなくなって無限ループに陥ってしまう問題があるみたい。「今のホストが blogspot.com じゃなかったら、blogspot.jp を blogspot.com へ書き換えた URL へジャンプする」という流れで、書き換えが行われなくてもページ移動してしまうため。

で、僕も再びスクリプトを書き直し。blogspot.ca とかの国別ドメインでも、Google ウェブ検索のキャッシュでも問題ないようになったはず。
<script type='text/javascript'>
var hostName = location.hostname;
if (!hostName.match(/blogspot\.com$/) &amp;&amp; hostName.match(/blogspot\.[^.]+$/)) {  
  location.href = "http://" + location.host.replace(/blogspot\.[^.]+/, "blogspot.com") + "/ncr" + location.pathname + location.search + location.hash;
}
</script>

2012-02-09

Firefox の JavaScript で innerText が取得できない件

Blogger のウィジェットでこれいいかもと思ったものの、 Firefox では正しく動かず…。Firebug で調べてみると、innerText が undefined になるのが問題だったよう。IE はともかく、Firefox だけ無理というものがあるとは知らなかった。

結局、同じ用途だと Firefox は、textContent を使うのがいいらしい。でも textContent にすると、今度は IE で動かなくなるようで…。 判定が面倒な場合は、このエントリにあるとおり、innerHTML で代用するのがいいのかも。

2011-08-06

Flickr 写真ページから YYYY:MM:DD 形式の撮影日時を取得するブックマークレット



Flickr の写真ページって、こんな風に撮影日時が書かれているんですけど、直感的にわかりにくいのです。で、作ってみたのがこのブックマークレット。 ブックマーク(ツール)バーに入れて、Flickr の写真ページでクリックするとプロンプトが出てきて、「2010:12:23」のようなフォーマットされた撮影日時が、簡単にコピーできます。



なんでこんなものが要るかというと、ローカルで写真を探すときのため。この写真ってどこで撮ったものだっけ?とか、一緒にどんなもの撮ってたっけ?と気になった時に、PC の Picasa の検索欄にこの「2010:12:23」とかって文字列を貼り付けると、同じ日に撮影した写真がすぐさまサムネイルつきで出るという、幸せ。

YYYY/MM/DD 形式で出して、OS の検索機能で同じことするぜ!という人は、下のをどうぞ。 まあ、どちらにせよ Flickr に Exif はずして写真を載せている人は無理なんですけどね。

2011-07-24

Google+ でオリジナルサイズの画像を保存する方法

Google+ のストリームに流れてきた画像を、投稿されたままのオリジナルの大きさで保存したい!という人は、以下の方法を試してみてください。

画像 URL のパラメータを操作する

  • 1.投稿内の画像をクリックせずに、右クリック、メニューから「新しいタブで画像を開く(Google Chrome)」、もしくは「画像だけを表示(Firefox)」を選びます。
  • 2.Google+ の画像の URL は、次のように、s*** でサイズ(写真の長い方の辺の長さ)、h*** で写真の高さ、w*** で写真の幅などが、いずれか一つ指定されています。その数値指定部分、以下の URL でいえば
    https://lh5.googleusercontent.com/-SptSIXvKSOY/Tiq6Im7Wy8I/AAAAAAAADzg/h6c25cj2IEY/s400/DSC_0850-.JPG
    赤字部分を、どの場合も s0 に置き換えて
    https://lh5.googleusercontent.com/-SptSIXvKSOY/Tiq6Im7Wy8I/AAAAAAAADzg/h6c25cj2IEY/s0/DSC_0850-.JPG
    という URL にアクセスするだけで、簡単にオリジナルサイズの画像をゲットすることができます。
もちろん、Google+ プロフィールから Picasa ウェブアルバムを探し、そのアルバムから画像を「ダウンロード」する手もあるんですが、Picasa ウェブアルバムが見つからない場合も多いので、上記の方が確実でおすすめです。

なお、2の手順で、URL 中に s*** などのパラメータが見つからない場合は、投稿内の画像がすでにオリジナルです。大きくはならないので、あきらめてそのまま保存してください。

ちなみに、この Tips は、Picasa ウェブアルバムの画像や、同じ Picasa ウェブアルバムのシステムを使っている Blogger でも、使えます。興味のある方は本家ブログをどうぞ。

ブックマークレットを使用する

上記の手順を自動で行うブックマークレットを置いておきます。

以下のリンクをドラッグしてブックマークバーへ移動させるか(Google Chrome)、リンクを右クリック後「このリンクをブックマーク」(Firefox)してください。 このブックマークレットは、Google+ のストリームで画像をクリックした後に押すことで、Google+ のビューアーで表示している画像のオリジナルを表示します。

Google+ は仕様の変更が頻繁に起こるため、もしこのブックマークレットが使えなくなった場合には、コメント欄で教えてもらえるとうれしいです。

2011-06-17

typeof x == 'undefined' がいい感じ

JavaScript で、変数が定義されているかどうかのチェックするための方法 3 つ。
  • (!x)
  • (x == undefined)
  • (typeof x == 'undefined')
詳しい違いについては、こちらが参考になった。 で、たとえば、
<script type="text/javascript">
  var color = "FF0000";
</script>
<script type="text/javascript" src="check.js"></script>
っていう風に呼び出される check.js の中で、呼び出し元で色が指定されていたらその色を、指定されていなかったらデフォルトの青色を使う、みたいなことをしたい場合には、
  • (typeof x == 'undefined')
を使うのが一番いいみたい。というか、ほかのだと、color が書かれていない場合にエラーが出てしまう。カスタマイズ可能な、スクリプトを公開するときなんかには、気を付けないと。

2010-12-12

Firefox で画像の幅と高さをコピーするためのブックマークレット

ブログに画像を載せる時、
<img src="http://example.com/image.jpg" />
と書いたあと、実際にそのページを Firefox で表示してみて、

画像の右クリックから「画像だけを表示」、Firefox のタイトルバーに表示されている幅と高さを img の width と height の要素に転記する…というようなことをしてきたのだけれど、転記の際にけっこう忘れてしまうので、ブックマークレットにしてみた。



WxH

需要があればどうぞ。

2010-11-07

JQuery のプラグイン Tablesorter が便利な件

JQuery でいろんなプラグインを試しているところ。
で、発見したのが各項目でソートできるテーブル「Tablesorter」。
NoタイトルURL
1クリボウの Blogger Tipshttp://www.kuribo.info/
2クリボウの写真日記http://kuribo-photo.blogspot.com/
3クリボウのプログラミングひとりごとhttp://kuribo-programming.blogspot.com/
4Japanese Bloggers Infohttp://japanese-bloggers.appspot.com/

HTML で記述するテーブルには thead、th、tbody と class="tablesorter" が必須。
JQuery のコードと Tablesorter のコード、スタイルシートを読み込ませて、
$(function() {
  $("#myTable").tablesorter();
});
とするだけ。

非常に便利なので、Japanese Bloggers Info でも、登録ブログ一覧のリストに使ってみたところ。
とはいえ表示させる件数が多いとやっぱり…重いね。

2010-03-25

サムネイルのプリロード

Japanese Bloggers Info で、サムネイル画像をプリロードさせることに。最初のページ表示で少しもたつく気がするけれど、ブログのプレビューは画像読み取り時間がなくなり快適に。
var thumbs = new Array(blogurls.length);

function preload() {
  for (var i = 0; i < blogurls.length; i++) {
    thumbs[i] = new Image();
    thumbs[i].src = "http://capture.heartrails.com/medium?" + blogurls[i];
  }
}

if (window.addEventListener) {
  window.addEventListener("load", preload, false);
} else if (window.attachEvent) {
  window.attachEvent("onload", preload);
} else {
  window.onload = preload;
}

Zenback - Everyone's Related Posts