Home > webプログラム > javascript

01月06日 

javascript

javascriptで関数の引数を不定にしてみる

あけましておめでとうございます。
本年もよろしくお願いいたします。

新年一発目のエントリは技術ネタ、というかTipsというか、あんまり使いどころがよく分からんというか。。。

javascriptは関数の引数に変数を与えなくても

JAVASCRIPT:
  1. function hoge() {
  2.      var arg1 = arguments[0];
  3.      var arg2 = arguments[1];
  4.  
  5.     return arg1+arg2;
  6. }
  7.  
  8. var sum = hoge(1, 2);

なんて感じで引数を取ることが出来ちゃうんですけれども、これだと引数の順番が固定になっちゃったりで、いまいちフレキシブルではないので、もうちょっと柔軟に出来んもんか、と考えたのがオブジェクトを渡す方法。

JAVASCRIPT:
  1. function hoge(args) {
  2.     var arg1 = args["arg1"];
  3.     var arg2 = args["arg2"];
  4.  
  5.     return arg1 + arg2;
  6. }
  7.  
  8. var sum = hoge({"arg1":1, "arg2":2});

キーと変数渡してやればどうでしょ?ということで。

で、何の役に立つねん?というとこなんですが、実行したい関数を変数で与えて、その引数が関数毎に微妙に違うけど、処理は共通、みたいな。ややこしや。

JAVASCRIPT:
  1. var funcs = {
  2.     //var getMemberPhoto = function(args) { <- 文法ミス
  3.     getMemberPhoto : function(args) {
  4.         var params = {
  5.             member_id:args["member_id"]
  6.         };
  7.         ...
  8.     },
  9.     //var getCategoryPhoto = function(args) { <- 文法ミス
  10.     getCategoryPhoto : function(args) {
  11.         var params = {
  12.             category_id:args["category_id"]
  13.         };
  14.         ...
  15.     },
  16.     //var getPhotoByPeriod = function(args) { <- 文法ミス
  17.     getPhotoByPeriod : function(args) {
  18.         var params = {
  19.             start_date:args["start_date"],
  20.             end_date:args["end_date"]
  21.         };
  22.         ....
  23.     }
  24. };
  25.  
  26. function getPhotos() {
  27.     var func = $("input[name=select_func]:checked").val();
  28.     var params = {};
  29.     $("#" + func + " .params").each(function() {
  30.         params[$(this).attr("name")] = $(this).val();
  31.     });
  32.  
  33.     if (typeof funcs[func] == "function") {
  34.         funcs[func](params);
  35.     }
  36. }

(追記)JSの文法ミスってました(汗)

HTML:
  1. <label><input type="radio" name="select_func" value="getMemberPhoto" />指定メンバーの画像取得
  2. <label><input type="radio" name="select_func" value="getCategoryPhoto" />指定カテゴリの画像取得</label>
  3. <label><input type="radio" name="select_func" value="getPhotoByPeriod" />期間を指定して画像を取得</label>
  4.  
  5. <div id="getMemberPhoto">
  6.     <select class="params" name="member_id">
  7.         <option value="1">だれそれ</option>
  8.         ...
  9.     </select>
  10. </div>
  11.  
  12. <div id="getCategoryPhoto">
  13. ...
  14. </div>
  15.  
  16. <div id="getPhotoByPeriod">
  17. ...
  18. </div>
  19.  
  20. <input type="button" value="画像取得" onclick="getPhotos" />

と、こんな感じで使えるよね?ということで(引数、微妙にも違ってないし)。
要jQueryなコードで、且つ実際に組んだコードではないので(爆)←古い、動かない可能性大ですが何かの参考にでもなれば。

ってならんな、こんなん。どこで使うねん。

12月24日 

javascript

javascriptのmatchで変数を抜き出す

文字列の中からパラメータを抜き出したいとき、

JAVASCRIPT:
  1. var hoge = "/member_id/29/".match(\/member_id\/(\d)\//);
  2. if (hoge != -1) {
  3.     var member_id = Regexp.$1;
  4. }

みたいな書き方が一般的だと思うんだけど、

JAVASCRIPT:
  1. var member_id = "/member_id/29/".match(\/member_id\/(\d)\//)[1];
  2. if (member_id != null) {
  3.     ...
  4. }

みたいな書き方も出来るよ、という覚え書き。
もち、複数の値を抽出したいときは前者の手法を使えば良し、ということで。

11月30日 

javascript

Google Mapで表示位置がおかしくてグレーが表示される時

急に気温が高下するこの季節、椎間板ヘルニアはもとより頸椎ヘルニアも目を覚まし猛威を振るってくれるので2,3日死んでることがあるんですが、今年のは微妙に軽症が続いててシンドイなーと思ってたら、週末に来てくれました。
息してるだけで吐きそうな頭痛w

これはいむら整体院に行くしか!w(日曜日はお休みですよ)

閑話休題。

最初は非表示にしておいて、ボタンを押したときにGoogle Map表示させたい、という時なんかに起き勝ちなんだけど、地図の中心位置がおかしくて、半分がグレーで地図が表示されない、などの症状。

原因は地図を表示させる要素のサイズがまだ確定してない状態でGoogle Mapの処理が走ると、変なサイズで初期化されちゃう、ということらしい。

そんな時は要素のサイズが確定したタイミングで

JAVASCRIPT:
  1. map.checkResize();

案外知らないもので、1ピクセル四方の要素を作ってみたり画面外に要素を置いておいて、とかいろいろ試してみたんですが、結局は上記の1行で済んでしまったというオチなのでありますorz

ちなみに、地図の読み込みが終わったかどうかは

JAVASCRIPT:
  1. var map = new GMap2(document.getElementById('map'));
  2. // その他初期化処理
  3. GEvent.addListener(map, "load", function() { ... });

ではイベントの登録が既に遅い(じゃいつ指定するのよ?と)、ということだそうで(というか使い方が違う?)、地図画像がすべて読み込まれたかどうかを

JAVASCRIPT:
  1. GEvent.addListener(map, "tilesloaded", function() { ... });

で取ることができます。

が一応、"undocumented(ドキュメントに記載されてない)"情報のようなので、将来的な動作が保証されるものではない、ということをご承知おき下さいませ。

Google Map API 小ネタでした。

08月16日 

webプログラム

痩せログ

WS000031嫁と共に腹のサイズが成長し続けている今日この頃ですが、嫁の場合、産み落としてしまえば引っ込む一方、こちらの腹はなんかしないと引っ込まないわけで…
ということで先日から寝る前に腹筋を行ってたりはするんですが…

最近効果があると聞くのは、食べたものとかを記録するレコーディングダイエット。
食べたものを細かく書かないといけないので間食とかしなくなる、前の日に食べた量を確認できることで今日の食事量を調整できる、などなど実体験者の意見もあり、FM802のDJも実践中とか。

そこで燃えてくるのがレコーディングダイエットへの取り組みではなく、ソレ用のシステムを作ろうとしてしまう意識がメタボプログラマーたる所以か…orz

ということでお盆期間を使って作ってみました。その名も「痩せログ」。
サービスとして公開するには細かい調整などが必要なのでボチボチ進めるとして、とりあえず携帯からの投稿や流行のtwitterのBOTにつぶやくと記録できる機能など考えております。
そして、このサービスの怖いところは、登録した人同士には全て公開されてしまうという点。ダイエットをサボっちゃ居られないw
「激励」や「拍手」ボタンなんかも作らないとなぁ。

脱メタボを志すアナタ、乞うご期待w

Progression+Wordpressでポートフォリオ的な

  1. ブログの記事に投稿した画像を抽出して←これはWordpressのテンプレート
  2. Progressionで読み込んで
  3. CoverFlowみたいな←これはPapervision3D

ポートフォリオ的な物を作る。

ということで出来たのがコレ。
http://www.studio-bloom.net/public/portforio/

1は昨日の記事で、
2は案外すんなり行けて、
3で躓いてた。

ローディングのプリローダーなんかの実装がまだだったり、ボタンがボタンとも言えない作りだったりするのは実験だからです。言い訳です。

画面遷移なんかの実装が超簡単に作れちゃうProgression、マジオヌヌメです(というか乗り遅れすぎ…orz)

07月29日 

javascript

IEでjavascriptでのsubmitが実行されない時

連日の妙なバタバタでお疲れ&返信の滞りがちな今日この頃です(関係者の皆様、申し訳ございません)。

そんな時にハマってしまった今回の一件。

「IE6でだけ、javascriptでsubmitさせてるのが効かない」

HTML:
  1. <a href="javascript:void(0);" onclick="hoge();">fuga</a>

JAVASCRIPT:
  1. function hoge() {
  2. ...
  3. document.form.submit();
  4. }

が、FirefoxやChromeでは動くのに、IE6だと動かない罠。

答えは簡単で、

JAVASCRIPT:
  1. function hoge() {
  2. ...
  3. document.form.submit();
  4. return false;
  5. }

末尾でfalseを返しましょう、とそんだけ。

ということで、これは癖を付けておかなくちゃ駄目ですね~

週末は、親族の法事やパノラマ撮影、先輩のお見舞い。今日は今日とてママパパ教室に駆り出され、沐浴のお勉強。そこで妊婦体験とか言いながら疑似体験パーツを着けて辱められウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!
帰ってから収穫したバジルを一杯使った晩飯を作って食ったらバタンQ(古い)。風呂から上がって復活して、一仕事終えたところであります。

家がバジル臭い。

07月18日 

javascript

jQueryでお手軽CSS制御(Chromeでのバグの話も)

CSSの制御というか、Classの制御というか。
CSSを直接触っちゃうより、Classを用意しておいて付加したり外したりのほうが何かと管理もしやすいでしょ?

JAVASCRIPT:
  1. (function($) {
  2.     $(document).ready(function() {
  3.         $('#target tr:odd').addClass('odd');
  4.     });
  5. })(jQuery);

targetというIDを持つテーブルの奇数行trにoddというクラスを追加してあげてます。
行数の多いテーブルだと、いちいち奇数行にクラスを指定してやるのも面倒だし、行の入れ替えが発生した日にゃぁ、アンタ。リアルで「キーッ!!!」って叫んじゃうってモンですよ。

Javascriptの使用がOKだったら、とてもとても助かるね。

でも例えば、テーブルが2つ続いてて、それらにも奇数行毎にClassを付加したい場合、単純に考えて…

JAVASCRIPT:
  1. $('table tr:odd').addClass('odd');

としてしまうんだけど、1つめのテーブルが奇数行(例として5)で終わってしまった場合、2つめのテーブルのtrは「リセットされて1から」ではなく「5の続きの6から」となってしまい、なぜか偶数行スタート(本来は1だから奇数)になってしまい、具合が悪いことになっちゃうんですね~困る。
(解決法、探り中。末尾に空の<tr></tr>入れちゃうのでもOK。だけど文法的にはNG)

さらにGoogle Chromeで発見した不具合。
複数の要素を指定する時、コンマ(,)でセレクタを区切れば同時に選択できるのですが、

JAVASCRIPT:
  1. $('table tr:odd, ul li:odd').addClass('odd');

IEやFirefoxでは意図したとおりの動きになってるんですが、Chromeだけは最初の要素しか識別してくれない。単純な解決方法は、

JAVASCRIPT:
  1. $('table tr:odd').addClass('odd');
  2. $('ul li:odd').addClass('odd');

2行に分割…orz
うーむ、ちょっと切ないですね…

ちょっと検証が甘いですが、便利なjQueryもちょっとした落とし穴が用意されていますよ…というお話しでした。それでも便利すぎて手から離せないjQueryなのです。罪なヤツ。

06月29日 

javascript

jQueryネタで喋ってきました

二宮さん(design studio PENCIL)から「jQueryネタで1時間喋れ」とお達しが来てしまったので、京都で立ち上がったグループ「Web★Choco@KYOTO」でデザイナーさん向けのjQuery導入をテーマに喋ってきました。

資料作りの最中に紆余曲折あり、当初予定していた手法でのプレゼン資料ではなく、パワーポイントで作り直すハメに。これが当日の午前3時。そこからコピペ&原稿追加&アニメーションなどの調整をして、5時半に就寝。早めに起きて再調整。

早めに出て、嫁と外で飯を食ってから行こうと思ったけど結局その余裕もなく、一緒に家を出たものの1本早い電車に乗って、京都は烏丸にある会場「ちおん舎」に向かいました。
天然方向音痴の自分は、当然の如く駅を出て逆に進んでしまい、なかなかの距離を歩いて目的地へ到着。京都の歴史ある建物でのプレゼンです。とても雰囲気が良いです。

しばらく皆さんが集まるのを待って会が始まりました。
スピーカー1人目は二宮さんで、タイポグラフィーの話。

が、資料の最終確認と調整をしてたので、あまり聞いてません(爆)

1つめのレクチャー終了後、自己紹介タイムと休憩時間。当初喋らないはずだった自己紹介も急遽喋ることになり。。。あまり何を喋ったのか覚えてません。休憩時間も手直しやら眠いやら…
そうこうしてたら自分が喋る番になって。

今回は、「過去にトライしたけど挫折した」、「これからちょっと始めてみたい」、というデザイナーさんに向けた内容を心がけてたので、ちょっと自分としては使用するのが微妙な表現方法なども織り交ぜてしまいながらのプレゼンでした(本職のプログラマーさんからすれば反感買うかもしれない的な)。

順を追って見てもらって、考え方や雰囲気を掴んでもらえたらイイかな?という期待を込めて、これまた予定していなかったライブコーディング(実際にその場でコードを書きながら説明する)をやることにしました(決めたのは当日の午前5時w)。

緊張していないように見えて実は相当しているので、ライブコーディングで単純なミスにすぐに気付くことが出来ず大焦りしてしまった場面が。しかし、スピーカーから「あれが悪いんじゃない?」とか声を上げて下さったので、「これはいい(ニヤリ)」と、“みんなでバグを探して考えてみよう“的な流れに無理矢理持ち込んでみたところ、結構な盛り上がりになってくれてシメシメ。
思わぬ所で、雨降って地固まるというか雨のあとは上天気というか。

持ち時間も数分オーバーで収まって、なかなか良いプレゼンだったのではないかな?と、終わった後に声を掛けて下さったリスナーの方達の反応からも伺うことができた気がします。

んで、質問タイムの時に出た「初心者にお勧めの書籍も紹介すべきでは?」という事だったので今日、本屋に行って立ち読んできました。あまり冊数は無かったのですが、その中でも自分的に良書だな、と思ったのはMYCOM BOOKSの「実践!Ajaxフレームワーク jQuery」です。“Ajax“と入っているので、初心者向けとは異なるのかな?と思ったんですけど、意外とそうでもなく今回のプレゼント併せて読むとイイ感じなのでは無いかな?という印象でした。
興味のある方は読んでみて下さいね。

当日使用した資料は、Web★Choco@KYOTOのサイトにあるのですが、登録とかしてなくても見られるのかな?
興味のある方はご覧下さい。

まー、そんなに喋れるネタを持ち合わせている訳では無いのですが、またこういう機会を与えていただければ喋ってみたいと思います。

たぶんVol.2とかもやるのだと思うので、興味のある方はmixiのコミュニティーなど参加してみては如何でしょうか?

06月26日 

javascript

Google Maps API Ver.3を使ってみよう

Mac miniを買いに梅田まで出たものの、売る気の全くない売り場構成&定価販売で買うのが負けな気がしたので買わずに帰ってきました。交通費を考えると、どんどん通販との差が無くなってきてます…orz

ということで今日は技術ネタ、と言えないくらい簡単に使えるようになってしまったGoogle MapsのVer.3の簡単すぎる導入のお話しを。

これまでGoogle Mapは、使用するサイトのURLに対する一意のコードをGoogleから取得して使用してました。なのでローカル開発環境、テスト環境、本番環境とコードを取得しないといけない場合もあって、結構面倒な場面も。。。
Ver.3からはこのコードが廃止されたので、そんなこたぁ気にせずに使えるようになったのです!(ひゅーひゅー!太っ腹~)

さらに、これまで行われてきた細かいバージョンアップで煩雑化していた箇所が大幅にブラッシュアップされて結構素直に使えるような印象です(そこまで深く触ってないのですが…)。

ということで今回は簡単に地図を表示するまでを見てみたいと思います。
続きを読む »

05月16日 

Zend Framework

Zend_Dbの連鎖操作は直下の階層のみ

Zend_Dbでは、テーブル間のリレーションを定義しておけば、親テーブルが削除された時に従属テーブルの対象も一緒に削除してくれる連鎖操作の削除機能があります。

親テーブル(Categories)に従属テーブル(Items)情報

PHP:
  1. protected $_dependentTables = array('Items');

従属テーブルに親テーブル情報

PHP:
  1. protected $_referenceMap = array(
  2.     'Categories' => array(
  3.         'columns' => 'category_id',
  4.         'refTableClass' => 'Categories',
  5.         'refColumns' => 'id',
  6.         'onDelete' => self::CASCADE
  7. );

と設定しておけば、

PHP:
  1. $categories = new Categories();
  2. $categories->find($id)->current()->delete();

とした時に、従属テーブルであるItemsのcategory_idが同一の物は削除される。

駄菓子菓子!

Itemsの従属テーブルとしてAttributesがあったとする。
(Categories→Items→Attributes)
となると、Categoriesを削除した時Itemsが削除されるのだから、当然Itemsの従属テーブルであるAttributesも削除されてしかるべき!と思う訳なんだけど、ところがどっこい、そうは行かない。
削除されるのは直下にあるItemsのみで、それ以降にあるAttributesは削除されない…
ちなみに、Itemsを削除するとAttributesは削除されるので、直下しか削除されないのは明白。。。

で、ググってみたところ一応出てきました解決策。
Zend_Db_Table_Abstractの_cascadeDelete()にある

PHP:
  1. $rowsAffected += $this->delete($where);

PHP:
  1. $toDelete = $this->fetchAll($where);
  2. foreach($toDelete as $row) {
  3.     $rowsAffected += $row->delete();
  4. }

でOKじゃね?との事。とりあえず検証してみたところ、意図したとおり2階層目以降も削除されてるようです。元のフレームワークに手を入れたくない場合は、_cascadeDelete()をオーバーライドすればOK。
参照先

あ、ちなみに_referenceMapの'refColumns'にはプライマリーキーを指定しないと駄目です。←ここでハマった…orz

なんだかバージョンアップごとに色々機能が増えてくれるのはいいんだけど…「Zend_Loaderは2.0で無くすぜ」とかZend_Applicationとか…ラーニングコストは高いよなぁ…
でもZendX_JQueryは興味津々なので、また勉強しなくっちゃ。

« 前の記事 | 次の記事 »