Archive for the ‘html’ Category

7月
23

flashcast:フリーで働くITエンジニア集団のブログ: iPhone OS 3.0のSafariでGPS機能を使ったWeb Applicationを作る!(sqlite保存編)の続きです。

前回は表示されている住所の吹き出しの中に、「save」リンクを設け、その住所をSQLiteに保存するようにしましたので、その住所を見るための履歴画面を作ります。

htmlの見た目は極めて単純なものにします。この時点ではかっこよさとかは気にしません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=320px, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>iPhone GPS Sample</title>
</head>
<body>
<div id="header">
<div id="title">Histories</div>
<a href="../sqlite/">back</a>
</div>
<div id="main"></div>
</body>
</html>

データを検索して、1件以上あれば、画面上に表示します。

 function initialize() {
  try {
   db.transaction(
    function(transaction) {
     transaction.executeSql("SELECT dat FROM location ORDER BY id DESC", [],
      setLocations,
      function(error) {
       alert("initialize:" + error.message);
      }
     );
    },
    function(error) {
     alert("initialize:" + error.message);
    }
   );
  }
  catch (error) {
   alert("initialize:" + error.message);
  }
 }

 function setLocations(transaction, resultSet) {
  var html = "";

  for (i = 0; i < resultSet.rows.length; i++) {
   var address = tonosamart.evalJson(resultSet.rows.item(i).dat);

   if (address) {
    html += "<div><p>" + address.Placemark[0].address + "<\/p><\/div>";
   }
  }

  $("#main").html(html);
 }

あれ?うまくいきません。
よく見ると、JSONからオブジェクトに変換するところの正規表現でエラーになってます。

var address = tonosamart.evalJson(resultSet.rows.item(i).dat);

JSONの最後の部分に、ナゾのフィールドがあります。

\”__shared\”:undefined}”

これが正規表現に引っかかってました。何に使うんでしょう・・・
ナゾですが、値が入ってきた時のことも考慮して、SQLiteに保存する前に、

   if (address.__shared == undefined) {
    address.__shared = "";
   }

このような処理を入れることにしました。
やっと、うまくいきました。画面はこんな感じす。

次に、地図の画面から履歴画面に遷移できるようにします。
Google Mapsのカスタムマップコントロールを使います。
コントロール – Google Maps API – Google Code

履歴画面にリンクするだけのものなので、単純なものにします。

 function LocationControl() {
 }

 LocationControl.prototype = new GControl();

 LocationControl.prototype.initialize = function(map) {
  var container = document.createElement("div");
  var control = document.createElement("a");
  control.href = "../history/";
  this.setButtonStyle_(control);
  container.appendChild(control);
  control.appendChild(document.createTextNode("histories"));

  map.getContainer().appendChild(container);
  return container;
 };

 LocationControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT , new GSize(5, 5));
 };

 LocationControl.prototype.setButtonStyle_ = function(button) {
  button.style.color = "#000000";
  button.style.backgroundColor = "#FFFFFF";
  button.style.cursor = "pointer";
 };

画面はこんな感じです。

ここまでで、こんなのができました。もし良かったら、試してみてください!
iPhone GPS Sample

7月
09

flashcast:フリーで働くITエンジニア集団のブログ: iPhone OS 3.0のSafariでGPS機能を使ったWeb Applicationを作る!(google編)の続きです。

画面のデザインを検討します。

とのさまのflashcast:フリーで働くITエンジニア集団のブログ: ipod touch用のWeb Applicationを作成してみる(画面作り編)と同様、こちらを参考にしました。
画面表示関係 – iPhone 3G DevWiki

iPhone特有の書式は基本的にはtonomemoと同じです。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=320px, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />

<meta name=”viewport” content=”width=320px, user-scalable=no” />

iPhoneの操作で地図を拡大・縮小したいので、横幅は320px固定、コンテンツ自体の拡大・縮小は不可にします。

<meta name=”apple-mobile-web-app-capable” content=”yes” />

フルスクリーンモードにします。

地図の表示は、iPhoneの表示領域をフルに使います。

<body onload="initialize()">
<div id="map_canvas"></div>
</body>
body {
margin:0px;
padding:0px;
}

#map_canvas {
width:100%;
height:100%;
}

load時にinitialize関数をコールし、地図を表示しています。

<body onload=”initialize()”>

緯度・経度のデフォルト値は「東京タワー」にしています。「東京タワー」が地図の中心点になります。

var lat = 35.658587;
var lng = 139.745425;

また、DOCTYPEはGoogle Maps推奨のXHTMLにしています。

地図を含むページでは、標準準拠の XHTML を使用することをお勧めします。ブラウザにより、ページ上部にある XHTML DOCTYPE が検出されると、「標準準拠モード」でページのレンダリングが行われます。これにより、レイアウトや動作をブラウザにかかわらず、より正確に予測できるようになります。この宣言がないページは「下位互換モード」でレンダリングされ、ブラウザごとにレイアウトが異なる原因となる場合があります。

Google Maps API の概念 – Google Maps API – Google Codeより引用。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

ただ、DOCTYPEを指定するとなぜだか地図が表示されなくなってしまいます。

いろいろ試したところ、cssに以下の定義を追加すれば表示されることがわかりました。

html, body {
width:100%;
height:100%;
}

ナゾです。

あと、とのさまのflashcast:フリーで働くITエンジニア集団のブログ: ipod touch用のWeb Applicationを作成してみる(画面作り編)にあるように、

window.scrollTo(0,1);

と書くとアドレスバーを隠せますが、heightを100%にしていると効かないようです。サイズ指定した場合、iPhoneを横向きに変えたりするとサイズが合わなくなり、Google Mapsのフッターが出なくなったりするので今回はアドレスバーを隠すのはやめました。

var map;
var geocoder;

var lat = 35.658587;
var lng = 139.745425;

function initialize() {
map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(lat, lng), 15);
//map.setUIToDefault();
GEvent.addListener(map, "click", getAddress);
geocoder = new GClientGeocoder();
}

function getAddress(overlay, latlng) {
if (latlng != null) {
geocoder.getLocations(latlng, showAddress);
}
}

function showAddress(response) {
map.clearOverlays();

if (response != null && response.Status.code == 200) {
place = response.Placemark[0];
point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
marker = new GMarker(point);
map.addOverlay(marker);
marker.openInfoWindowHtml('<b>Address:<¥/b>' + place.address);
}
else {
alert("Not found.");
}
}

表示は極力、地図だけにしたいのでGoogle Mapsのデフォルトコントロールは非表示にしています。

//map.setUIToDefault();

ここまでで、こんなのが出来ました。

地図上のタップした位置の住所を表示します。もし良かったら、試してみてください!
iPhone GPS Sample

■参考サイト
Google Maps JavaScript API Example: Reverse Geocoder
画面表示関係 – iPhone 3G DevWiki
flashcast:フリーで働くITエンジニア集団のブログ: ipod touch用のWeb Applicationを作成してみる(画面作り編)

2月
16

Google、Yahoo!、Microsoftが、検索エンジンに新しい仕組みを導入することに決めたそうです。

<link rel=”canonical” href=”http://www.example.com/xxx.html”>

と記入するだけの簡単設定で、検索エンジンがそのページを301でリダイレクトされたのと同じ感じに扱ってくれるそうです。
(あくまでも、検索エンジンがそう扱うだけで、リダイレクトはされません。)

同一ドメイン内のみという制限事項があるようですが、反面、301では対応できないパラメータ違いにも対応できるので、素敵な機能だと思います。

せっかくなので、いろいろなことを簡単に説明

301 Moved Permanentlyは、永久にURLが移動したことを表します。
引っ越し用みたいな感じです。

たとえば、以下のように.htaccessに設定することで旧ドメインから、新ドメインにリダイレクトさせることができます。

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*)$ http://www.new.example.com/$1 [R=301,L]

こうして、301を明記することにより、検索エンジンに、正しい情報を教えることができます。
※逆に、メンテナンス中などの場合は302を使えば、「一時的なリダイレクト」ということを教えられます。

で、この301なんだけど、ドメインの移動、URLの移動のほかに設定しておいたほうがいい項目があります。
重複コンテンツの正規化と呼ばれるものです。

重複コンテンツというのは、同じ内容なのに、違うURLなページのことを指します。
人間からみれば、内容が同じなのでURLが違っても問題ないですけど、検索エンジンは、URLが違ったら別のページだとおもうかもしれません。

これによって、以下のような問題が起こる可能性があります。

・評価の分散
検索エンジンがページごとに、何らかの方法で評価を付けているとします。
※たとえば、リンクされてたら1点とか。
当然、点数が多いほどいいのですが、URLが違うことによって点数が分散してしまい、評価が低くなる恐れがあります。

・フィルタリング
検索エンジンは、重複コンテンツをフィルタリングして、メインと判断したページだけを表示する場合が多いです。
このとき、自分が意図していないフィルタリングをされる可能性があります。

「えーでも、同じ内容のページなんて作らないよ。」と、思いがちですが、少なくとも2点は注意しないといけません。
それが、「wwwの有無」と、「index.htmlの有無」です。

たとえば、
http://www.example.com/
http://example.com/
http://www.example.com/index.html
http://example.com/index.html
この4個はすべて同じ場所を指すとします。
人間だったらわかりますが、検索エンジンは別々のものだと思ってしまう恐れがあります。

そこで、通常は

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example¥.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://www.example.com/$1 [R=301,L]

こんな感じで、表記を統一します。

ただ、それでも解決しないのが、パラメータの有無による出し分けです。
たとえば、パラメータの一部に会員番号などを付けて出し分けているケースです。

こういった場合に、効果を出すのが、今回のrel=”canonical”です。

http://www.example.com/index.html?user=0001
http://www.example.com/index.html?user=0002
http://www.example.com/index.html?user=0003
http://www.example.com/index.html?user=0004

こんな感じのページだった場合、

<link rel=”canonical” href=”http://www.example.com/index.html”>

と書いておけば、全て同じページに扱ってくれることになります。
ページの内容も、大体同じなら使っていいみたいなので、動的なページを作る場合は、必須になっていくのではないでしょうか!

検索ロボットと仲良くして、検索されやすいページを作りたいですね!
ちなみに、Googlebotは、こんな感じらしいです。
Official Google Webmaster Central Blog: First date with the Googlebot: Headers and compression
かわいいですね!

1月
25

適当なjavascriptやcssがエラーにならない理由

質問されたのでメモ

適当なjavascriptでも動くことは動きます。

たとえば

alert(1)
alert(2)

とか

alert(1)

の後に、セミコロンがないからエラーになる気がしますが、javascriptの場合は動きます。

どうしてでしょうか?

答えは、仕様で決まっているからです。
「自動セミコロン挿入」と呼ばれるもので、
特定条件に合致するセミコロンは省略してもいいことが決まっています。

ある種の ECMAScript 文 (空文 (empty statement), 変数文 (variable statement), 式文 (expression statement), do-while 文 (do-while statement), continue 文 (continue statement), break 文 (break statement), return 文 (return statement), turhow 文 (throw statement)) はセミコロンで終了しなければならない。そのようなセミコロンは、ソーステキスト内に常に明示的に出現してよい。しかしながら、簡単にするために、ある位置ではソーステキストからセミコロンを省略してよい。この位置は、それらの位置のソースコードトークンのストリームにセミコロンが自動的に挿入されるという言葉で説明される。

7 字句について (Lexical Convention)より引用
なので、最初に「適当なjavascript」といいましたが、実際は「適当じゃないjavascript」ということになりますね。

この規則は、一瞬、便利なような気もするけど、そうでもないです。

たとえば、

return 10;

と書きたかったのに間違えて改行を入れてしまい、

return
10;

となってしまった場合などには、「自動セミコロン挿入」のおかげで

return ;
10;

こんなコードに変換されて、戻り値を返さなくなってしまいます。

なので、ちゃんとセミコロンはつけたほうがいいです。

もうひとつ、思い当たるのがvarの省略です。
javascriptはvarを省略できるので、適当な感じがしますが、これも意識しないで省略するとおかしな感じになります。

たとえば、

x = 10;
alert(x);

と、

var x = 10;
alert(x);

の結果は

10
10

と、同じですが

x = 10;
function f(){
 x = 5;
}
f();
alert(x);

と、

var x = 10;
function f(){
 var x = 5;
}
f();
alert(x);

の結果は

5
10

と、違います。

これは、varを省略すると、グローバル変数になってしまうからです。

似たような感じで、適当なcssでも動くことは動きます。

cssの場合は、以下のような設計原則があり

上位互換性及び下位互換性 CSS2利用者エージェントは, CSS1スタイルシートを理解できる。CSS1利用者エージェントは, CSS2スタイルシートを読むことができ,理解しない部分を破棄できる。 CSSをサポートしない利用者エージェントは, スタイル拡張した文書をも表示できる。当然,CSSによって可能になったスタイル拡張はレンダリングされないが,内容はすべて表示される。

Introduction to CSS2より引用
そのため、以下のような決まりがあります。

利用者エージェントが不正なスタイルシートの一部を無視しなければならない場合もある。この標準情報(TR)は,無視の意味を,利用者エージェントが不正な部分の最初及び最後を発見するために構文解析するが,それを除けば,不正な部分がそこに存在しないものとして動作すること,と定義する。

CSS2 syntax and basic data types

簡単に言うと、文法エラーがあったら、なかったことにするということです。

なので、最終的にはエラーではなくなり、適当なCSSでも大丈夫という結論になります。
(もちろん、意図した結果にはならないです。)

たとえば、

 div {
  margine:10px;
 }

のように、marginのスペルを間違えたりしたら、

 div {
 }

のようにしか解釈されないです。

こんな感じで、javascriptやcssは、適当に作っても動くことは動きます。

とはいえ、それでいいわけではありません。
HTMLもそうですが、シンタックスエラーでブラウザが停止したりしないので、大丈夫だと思っている方が多いです。
それぞれ規約があるのですから、それに従い作成するべきですし、たとえ規約に沿っていても、省略すべきでない部分は、省略しないで記述するべきです。

実際、仕事をしていると感じるのですが、プロのデザイン会社の方でもこのあたりの認識が甘いことが多いです。
中には、指摘に対し「動くからいいでしょ?」「別料金になります。」などと言ってくる会社もあります。

仕様を理解して、正しいコードを書くよう心がけましょう!

※実際は適当ではなく、考えてそういう選択をすることもあると思います。その点は否定しません。
たとえば、javascriptのセミコロンやvarなどは、適切に省略すればjsの容量が減るのでサーバの負担を減らすことができます。

10月
17

こんにちは、ふぐの会、メンバーのせみです。
この度、縁あってお初でBLOGを書かせていただきます。
フリーの身としては二年目とヒジョーに浅く、知識も駆け出しなのですが、
みなさんと一緒に知識を共有したいと思いますのでどうぞ、よろしくおねがいします。

さて、今回記念すべき第1回はホームページのかっこいいボタンが簡単に作れるよ!のはなし。
自分は今、嫁の両親が経営してるイタリアレストランのホームページを素人ながら今つくっています。
リンクボタンやタブボタンなど、かっこいいボタンをつくろっかなぁなんて思っているんです。

イラストレータやPhotoShop等で技術があれば、簡単に作ることができるんですが、
自分には、そこまでの作成技術やデザインの才能がありません。そこで、サイトを見回っていたら、ButtonMakerさん。なんていう便利サイトがございまして、

そこはなんと!

自分が作成したいサイズや背景色など入力するだけで、かっこいいオリジナルボタンが自動生成してくれるんですね~。なんて、、便利なんだ~。。

今回作ったのはこんなです。


サイズ     縦30pix 横100pix
背景色1   #18008C
枠線カラー  #C6C6C6 太さ2pix
背景ライン  種類なし
テキスト文字 Semi
フォント    (J) HGRSKP
文字カラー  #FFFFFF
文字サイズ  20point
クリア調    1

ButtonMakerさん。ありがとうございます。これからもチョイチョイ使わせていただきま~す。
みなさんもよかったら行ってみてください。

ボタン素材 自動生成サイト – ButtonMaker

flashcast立ち上げメンバーだった「せみ」が、当コミュニティーを脱退したため、blog引っ越し時点(2009年9月11日)の執筆者は「もじゃもじゃ」とさせていただきました(2009年9月11日追記)。

  • Search:
  • flashcastとは?

    東京を中心に、現在フリーランスとして活動しているITエンジニア、および、かつてフリーランスとして活動していた起業家達が立ち上げたコミュニティーです。

    みんなで集まって面白いことをやろう!形に残そう!ということで、ブログをはじめました。

    技術情報や、フリーエンジニアに役立つ情報などを、ご紹介できたらと思っています。

    お問い合わせ:
    info@flashcast.jp
  • カレンダー

    2010年7月
    日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日
    « 6月    
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • メンバー紹介

    もじゃもじゃ
    flashcastのリーダー

    3年ほどフリーのITエンジニアとして活動。現在は、社員2名の株式会社を経営しています。

    一攫千金を夢見る野心家です。

    ライブキャスト

    yasu
    ダイバー

    自宅サーバーでホームページを作り始めました。

    少しずつ記事を増やしていきますので足を運んでください。

    よろしくお願いします。

    sa-sa-ki.jp

    のら
    たびびと

    ねこ好きに悪人はいなーいっ!!

    バイクや車も好きです。

    めぐ
    デザイナーのたまご

    音楽とデザインとお酒をこよなく愛する永遠のダイエッター。

    現在ペンタブレットでイラストを勉強中。

    Hiro
    コンサル

    PMやSEの案件を業務委託で請けることが多いですが、小規模案件も受託でやっています。

    得意な分野はマイクロソフト製品や関連技術によるシステム構築です。

    KEI
    取締役の風格

    最年少なのに、メンバーで1番の貫禄の持ち主!?

    C#や.netなどサーバ側の開発が得意。

    ろっきー
    美食家★パパ

    自分にとっての息抜きは、ドライブして温泉に入って、美味しいご飯を食べる事。

    ココロとカラダのリフレッシュを大切にし、日々の仕事に励む一児の父親です。

    郵便番号検索

    my-hobby

    とのさま
    げーむのおうさま

    大人なのに好きなことしかやらない駄目人間。

    Web系が得意、アクセスは苦手><

    tonosamart.com

    セクレタリアト
    ギャンブラー

    フリーランス時代は仲間の現場を探すことが多く、それをきっかけに会社を設立。

    現在はSI業に特化せず、他の業種にも興味を持ち始めています。

    メドレー株式会社

  • 広告