Archive for the ‘JavaScript’ Category

位置情報取得と測地系のあれこれ

iPadで位置情報取得

iPadで位置情報をとりたかったので、書いてみた。

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script type="text/javascript">
<!--
function getpos(position){
 posstr = "Lon=" + position.coords.longitude + 
          " / Lat=" + position.coords.latitude ;
 alert(posstr);
}
function getposi(){
 navigator.geolocation.getCurrentPosition(getpos);
}
//-->
</script>
</head>
<body>
<a href="#" onClick="getposi();">POSITION</a>
</body>
</html>

geolocationって、iPadやiPhoneだけじゃなくて、FireFoxでもとれるのね。
ちなみに世界測地系。

参考:Geolocation API Specification

ちなみに、Androidでも似たようなかんじで取得できる。
これに関しては参考になるページがあったので紹介。
Android携帯でブラウザから緯度経度情報を取得 – PHP,MySQL,Flexな日々+イラストとか

日本測地系と世界測地系

実は400m程度ずれてるので補正が必要。
これに関しては「日本測地系」「世界測地系」で調べればいっぱい出てくる。
APIによって測地系が違ったりするので、このへんは変換が必要。

参考になりそうなとこ。

script.aculo.us の Sortable をdivのスクロール内で複数使う場合の注意事項

今朝、tweetAngelをいじってて初めて気づいたこと(爆)
左側の選択画面で、スクロールしたあとにドラッグドロップしたら・・・変なとこに飛んじゃうんですよ。
いろいろ調べたら・・・div要素でscrollをありにしてある場合、scrollオプションを指定しないとだめみたいです。

該当箇所を引用すると、

scroll
Default: none
When the sortable is contained in an element with style overflow:scroll, this value can be set to the ID of that container (or the container’s DOM object). The scroll position of the container will now move along when the sortable is dragged out of the viewable area. The container must have overflow:scroll set to include scroll bars. Does not yet work for scrolling the entire document. To get this to work correctly, include this line in your code before creating the sortable: Position.includeScrollOffsets = true; Update: Scrolling the whole document does work (at least on Safari 3.2 (Mac), IE7 and Firefox). Use scroll: window

そんなわけで、ざっと要約すると、

  • スクロール要素のidを(Sortable.createの)オプション引数に渡せ
  • Sortable.createする前にPosition.includeScrollOffsets = true;を実行しろ

・・・ってことです。
つまり、こう。

    Position.includeScrollOffsets = true;
    Sortable.create( category_name , {scroll: 'choicetweet'} );

そして。
スクロール要素内に複数のSortableリストがある場合、リストを増やしたときは全部に対して再度Sortable.createしないとだめくさいです。

    Position.includeScrollOffsets = true;
    for ( i = 0 ; i <= newCatNo ; i ++ ) {
      Sortable.create("tw_cat_" + i + "_body" , {scroll: 'choicetweet'});
    }

おまけ。
JavaScriptの連想配列ってなーに?ってかたのために。
JavaScript の配列と連想配列の違い – IT戦記

その月の週数を求める

社内wikiにも書いたんですがもったいないのでこちらにものせちゃうことにしました。
Ajax絡みで第何週を選択するときに使うのによく使いそうなのでね。

問題

YYYY年MM月は第●週まである。●を求めよ
※ただし日曜はじまりとする

解答

3年分のカレンダーとにらめっこすれば見えてくると思います。
calコマンド多謝(笑)

  • 基本的に●=5
  • 2月の場合
    • 閏年であれば(29日)無条件に●=5
    • 閏年でなければ(28日)、1日が日曜日であれば●=4、それ以外は●=5
  • 2月以外の場合
    • 1日が土曜日であれば、無条件に●=6 (30日からが第6週になる)
    • 1日が金曜日であれば、31日の月(1,3,5,7,8,10,12)が ●=6、それ以外は●=5

なお、曜日判定は「Zellerの公式」で一発で片付ける。これは各自ぐぐってね。

せっかくなので、JavaScriptによる実装例を。(あくまで例)

function getWcount( iYear , iMonth ) {
   iYearN = iYear ; iMonthN = iMonth ;
   if ( iMonth == 1 ) { iMonthN = 13 ; iYearN = iYearN - 1 ; }
   if ( iMonth == 2 ) { iMonthN = 14 ; iYearN = iYearN - 1 ; }
   iWday = Math.floor( iYearN +
                       Math.floor(iYearN/4) - 
                       Math.floor(iYearN/100) +
                       Math.floor(iYearN/400) +
                       Math.floor( ( 13 * iMonthN + 8 ) / 5 ) + 1 ) % 7 ;
   iWcount = 5 ;
   if ( iMonth == 2  )  {
      if ( ( iYear % 4   ) == 0 &&
           ( ( iYear % 100 ) != 0 || ( iYear % 400 ) == 0 ) ) {
           // leap year !
           iWcount = 5 ;
       } else {
           if ( iWday == 0 ) { iWcount = 4 ; }
       }
   } else {
       if ( iWday == 6 ) { iWcount = 6 ; }
       if ( iWday == 5 ) {
           if ( iMonth == 1 || iMonth ==  3 || iMonth == 5 ||
                iMonth == 7 || iMonth == 8 || iMonth == 10 ||
                iMonth == 12 ) {
                iWcount = 6 ;
           }
       }
   }
   return iWcount ;
}

余談ですが、Zellerの公式で「3月始まり」になってることにお気づきでしょうか?
そういえば3月始まりというと、昔の暦のはじまりだよねーと。
ええ・・・9月~12月の呼び名が2つずれてるねとか。

参考: