2013.03.14

jQuery 重いらしいcontainsフィルターを書き換えてみる

jQueryの独自フィルターは重いらしい…。
書籍でもお世話になっているこちらのサイト様を参考にへっぽこスクリプトの改善を日々図っている訳ですが。
jQueryを良くする25のTIPS[to-R]
確かにOじろーんちの細い回線では:contains()をセレクターに使っている当ちゅんもす置き場のキノコが一瞬みえちゃう。

WordPressのloopでコメント数を表示してるですが、コメントがある時はキノコを表示。ノーコメントの時はキノコを隠蔽してありますw。
テンプレートタグcomments numberの引数にコメント0の場合にnを、他は数値のみを出力させるようにして、フィルター:containsでnを拾って.remove()。
ちょっと方法を変えました〜WordPress キノコは最初から隠すべき キリッ!(コメント件数の表示)
なぜcssでdisplay:none;にしないのかは、無効な表記がHTMLで繰り返されるのが煩わしかったというか、大した理由ではないのですがなんとなく。

ちょっとハードルが高い気もしますが、勉強がてらなんとか書き換えてみようと思います。

filterを使ってみる

やりたいことは、コメントリンクの中に "n"という文字がある時、表示しない。
まずは文字を探す方法から。

htmlはこんな感じで書き出されています。divの中にa そしてテキスト。
.findでaを見つけるところまでは現状と同じ、そこからfilterで文字の合致をふるい分けできないかやってみました。
filterの引数のコールバック関数でtextを取得して、比較すればいいような気がする…

filterの戻り値はObject[a 1113.html#comments]となったし、どうやらできたっぽい…
しかし、スペースや改行が入るとだめな模様。改行や空白が入るブラウザがあるとの情報もありもう一工夫必要ですな。
噂には聞いていた”正規表現”とやらで一致とか、含むとか、ができるとか…

これで□□nでも<br>nでも大丈夫なはず……。
スラッシュで囲うと正規表現となり、オプションmでマルチラインを検索となるらすぃ…。
.parentでaの親要素であるcomm_lに戻って.remove() できた(∩・ω・)∩

正規表現についてはこちらでもっと勉強したいと思うのです。
JavaScript初級者から中級者になろう:四章第六回 正規表現

ちょっと考察…疑惑のスクリプト

でも、.matchの戻り値は配列とのことで一文字しか無いし戻り値は["n"]なんじゃなかろうか?という疑問も。
なんもない時はnullが返る。
これって、.filterが真偽値で判定してるとしたらどうなんでしょう?

要素集合から、引数で渡したコールバック関数で合致と判定しなかった要素を全て削除したものを返す。
この関数は、全ての要素に対して $.each のように順に実行されます。この時にfalseを返せば、その要素は集合から外される。
false以外の値を返せば、その要素は残る。
filter(fn) – jQuery 日本語リファレンスさんより引用

false以外の値を返せば、その要素は残る。という部分が気になります。
nullはfalseじゃないよなぁ。3行目はもしかして、

と書かなくてはならないんだろうか?
しかし、いかにも冗長な気がします。

このメソッドの2番目の構文は、セレクタではなく関数によって要素をフィルタリングができます。要素ごとにその関数を実行し、true(もしくは、真偽値としてtrueと同等の値)を返した場合、その要素は選択されます。そうではない場合、除外されます。
.filter() – jQuery API Documentation 日本語訳さんより引用

ともあり、Firefox、Safariでは動作確認できてますし、まあ、いいかという気が激しくしています。ちゅんもす置き場では.matchのまま行こうかと。

精神上よくない気もするのでもうちょっと書いてみます。Javascriptの.testメソッドは真偽値が返ります。

今回は1文字しか判定してないので真偽明白ですが、’先頭にxxxを含む文字列’とか条件がもっと複雑だったりする場合、.filterするにはこちらの方がいいのかなぁ。

なにはともあれ、速くなるのか?

FirefoxのアドオンFirebugのコンソールで計測してみました。

.find("a:contains('n')")と記述した場合0.689秒かかっております。

0.186秒!!!!!
ぐわーっ!速い!

よし!これで行こう!!
ps.当ブログがなんかおかしなことになっていたら教えて下さい…

2013.01.27

MAMP:LAN上のMacからアクセスするぜ!(しかしなんとなく…)

LAN上の他のMacからMAMPで構築したローカルホストにブラウザから接続するための、またまた備忘録です。
訳わかめなので苦労は尽きません。
検索しまくりで時間を潰すので同じような誰かのお役に立ちたいなぁとは思うものの、完璧に説明できるスキルを持ち合わせておらず…しかも疑問が残る結果ですので、ご利用の際はあくまで解決のとっかかりという感じでゆるーくご理解くださいませ。

MAMPに関して、ちゅんもす開設当初から、いつもこちらのサイトさまを参考にさせて頂いております。

参考サイト:
MAMPを使ってローカルで複数サイトのバーチャルホストを設定&イントラ環境や仮想環境からもそのサイトを確認する設定方法 | THE HAM MEDIA BLOG

上記ページの”仮想PGやイントラネットからアクセス出来るようにするために“という項目を参考に、

/Applications/MAMP/conf/apache/httpd.conf の
#Listen 12.34.56.78:80 という記述の下に
Listen 80 というのがデフォルトであります。
その下に
Listen 5678 (使用中のポートと被らない好きな番号)

Lanからアクセスしたいポートを追加。

/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf で
<VirtualHost *:5678>
 DocumentRoot "/Users/****/site/fugafuga"
 ServerName fugafuga.com
</VirtualHost>

上記ポートの設定を追加。
ブラウザのアドレスバーにhttp://192.168.***.***:5678/を入力すると。
htmlで構成されてる普通のサイトは問題なくLAN内のMacからアクセスできるようになりました。

WordPress 迷走編

WordPressでちょっとつまずく。
Forbidden You don’t have permission to access がでちゃったので、httpd.confの

と、外部からのアクセスを禁止している箇所に、8行目を追加して接続するMacのipアドレスを許可してやりました。
(<Directory />にAllow form ipアドレスと書く暴挙に出ていたので訂正)
こちらのサイト様を参考にさせて頂きました。

参考サイト:
外部からのアクセスを制限する-独学!未経験からWebデザイナーになる!!

しかし!
Listenにて適宜ポートを設定し、httpd-vhosts.confにて設定を加えても、192.168.***.***:1234(適宜ポート)/でアクセスしてもリダイレクト?され192.168.***.***を直に見にいってしまい、階層と今は使っていないWordpressのフォルダが表示されてしまいます。ポート80に接続されているということでしょうか?
(追記:<VirtualHost>のところマッチするVirtualHostを上から順番に探してゆくらしい)
httpd-vhosts.confにMAMP初期設定のDocumentRoot /Applications/MAMP/htdocsも記述してあります。無くてもいいのかな?
適宜ポートが通用しないので、192.168.***.***でアクセスすることにして、尚かつlocalhost部分はコメントアウトしました…消極的解決法。(追記:一番下に追いやりました。)

原因がお判りの方!教えて頂けると助かります(´;ω;`)。

表示されましたが…cssが全く読み込まれてないので、ノーレイアウトの画面が表示されます。
MAMPを入れたホストのMacには、httpd-vhosts.confで設定したServerNameをhostsファイルで対応させ、WordPressのドメインhttp://hogehoge.comでアクセスできるようにしてあるわけだけど…

MAMPを入れたホスト機のhostsファイルの記述
127.0.0.1 localhost fugafuga.com hogehoge.com

しかし、LAN上のクライアントのMacにとっては、WordPressが書き出すurl
href="http://hogehoge.com/wp-content/themes/略/style.css"
などのhogehoge.comの部分は「は?どこなわけ?それシベリア?」状態。
WordPressの一般設定 WordPress アドレス (URL)をhttp://192.168.***.***:8888/WordPressのあるところ
にしてしまう方法もあるようですが、せっかくポート80にしてバーチャルなドメインを設定しているし、またテーブルを書き換える羽目になるのはいやなので、そこんところ触りたくない。

hogehoge.comがどこなのか教えてあげればいいのか!という事で、クライアントのhostsファイルでServerName(ドメイン)hogehoge.comとIPアドレスを対応させてみます。
調べてみたところ、クライアントは自分のhostsファイルに従ってIPアドレスを逆引きしてホストへリクエストを送り、ホストではApacheがバーチャルホストhogehoge.comのルートに導いてくれるんじゃないかと。
………Snow Leopardはさ、hostsファイルのアクセス権変えてmi(エディタ)で開いて直書き保存できたけど、Mountain Lionはできるの?
またまた有り難いサイトさまにお世話になりますよ。

参考サイト:
Mac OS X LionのTerminalにてnanoを使ってhostsファイルを書き換える話(画像付き)。|linker journal|linker

クライアントのhostsファイルに追加
192.168.***.*** hogehoge.com

おお!できた!!(∩・ω・)∩

しかし…こんなのでいいのかかなり不安です。

2013.01.20

jQuery スクロールに付いてくるtopに戻るボタン

先日に引き続き備忘録なんです。
今回はこのブログのヒヨコがにょろっと横から出てきて、にやにやしながら着いてくる スクロールに追随して動く”トップに戻る”ボタンについて。
これがfooterに達したら固定しようという試みです。

元のjQueryはこちらから頂きました。多謝!!!勉強になります!
jQueryでスクロールすると表示する系いろいろ | webOpixel

上記webOpixelさんの

1.ちょっとスクロールしたら「トップへ戻るボタン」を表示
 ・スライドアニメーションして表示

の下からでて来るところを横からでてくるように変更させて頂いて使っております。

いまさら気付いたんですが、iPhoneのサファリで閲覧すると最下部までスクロールした時にfooterにもろかぶりです。
下になってしまうrssアイコンはあまり利用することもないと思いますが、気になるっちゃー気になる。
下までスクロールしたらfooterのちょうどいい位置にボタンが固定されるようにしたい。

webOpixelさんの同ページに“下部までスクロールすると横からスライドして表示”の例を見つけ、参考にさせて頂きました。

しかし、.scrollまわりのバグ?らしくiosのSafariでは期待通りには動きません。
Safari及び普通のブラウザでは正常に動作するのでそのまま使用。
iPhone,iPad,iPod,いちおうAndroidはデフォルトのscriptで使うことにしました。

//追記 jQuery iOSでもひよこを止めろ!
という記事を書きました。ブラウザ共通のスクリプトでひよこを止めることができました。

ひよこを止めろ

まずは使わせてもらっている部分と追加したscript

ハイライトしたところが付け加えた箇所です。

changeBottom = $('body').height() – windowRoll.height() – 190;

bodyの高さを.height()で取得して、そこからウィンドウの高さとボタンをストップさせる位置の下からの距離を引き、基準の高さchangeBottomを決めときました。

if ($(this).scrollTop() <= changeBottom) {

んで、.scrollTop()で取得した数値がchangeBottomより小さい まだ基準までスクロールしてないとき
changeBottomより大きい 基準までスクロールしたときを条件づけ、それぞれに用意したクラスを加えたり除いたりすることにしました。

ボタンはposition:fixedでスクロールしてもウィンドウに位置固定され、追随しているように見えてます。
基準値に達していない時は、fixedでウィンドウの下から20pxの位置に表示されます。
基準値に達した時は、absoluteで親要素に絶対配置されます。

ios対策にデフォルトで使用

//追記 jQuery iOSでもひよこを止めろ!
という記事を書きました。ブラウザ共通のスクリプトでひよこを止めることができました。

そしてios Safari用に振り分けるため
上記jQueryの21行目からのハイライト部分に分岐とclassを追加。

cssは単純に重ならないようbottomのpxを増やしました。
当初fixedを忘れて悲しいことにw

いや〜
使わせて頂いたscriptに少々何か加えただけなんですが、相当時間掛かっちゃいました。
javascriptの基礎が全くないというのはアレです。やりながら覚えるしかないですねぇ。

2013.01.16

備忘録 jQuery .loadでfooterを管理 & ウィンドウサイズで位置変更

備忘録を長年、”ぼうびろく”だと誤認していた管理人です。みなさまいかがお過ごしですか。

ちまちまとメインサイト”さわやかまみれ”に学習を兼ねてjQuerを装備しております。
今回は”footerを外部から読み込む”のと”ウィンドウサイズによって要素の位置を替える”二つのscriptを装備してみました。

.loadで共通コンテンツを一括管理

ページ数が増えてくると各ページのfooterなどの共通のコンテンツをいちいち手動で修正するのは苦行だったりします。
DWのテンプレートやAptanaなどエディタのページ置換を利用するのも手ですが、DW持ってないしw置換もわりと手間が掛かります。

そこでjQueryでAjaxとか言うのを使って、ひとつのhtmlを修正すれば全てのページに反映されるようにして楽しようと思います。
しかし、Javascriptをオフで閲覧する場合は全く持って表示されないことになりますので、とりあえずリンクや新着などの利便性を考えて設置したfooterだけをjQueryで一括管理することにしました。

footerの内容を記述するHTMLファイル/side-footer.htmlを作っておきます。
DOCTYPEやheadは要らないようですが、愛用のAptanaが気にするので自分は一応いれておきました。
読み込みたい部分にidを振っておきます。#footerとしました。

このdivの所(”#footer_wrap”)に、命令.load(外部に作ったファイルside-footer.htmldiv#footerを読み込んでね)
という判りやすいscriptで出来ますた。

パスに注意!
自分の場合は、間抜けなことにリモートとローカルのドキュメントルートのお名前が違うので、相対パスを使っています。
そうすると別の階層につっこんだページではfooterにあるリンクが切れてしまいます。あまりスマートな方法ではありませんが、読み込むhtmlファイルを別階層用に用意しました。
出来うるなら、MAMPなどでローカルサーバを立ち上げ、公開するサーバと同じ環境を構築してフルパスでリンクを貼るのがベターかと思います。
蛇足ですが、サーバを介さずに直接ブラウザでhtmlをプレビューすると.loadが実行されないことがあります。MAMPおすすめ。

Ajaxとやらは、セキュリティ上の理由で別のドメインのファイルにはリクエストできません。実現するにはもっと難しいことをせなばならないようです。クロスドメインでググってみますか。

.loadした部分にscriptが効かないYO!

クリックなどイベントが発生する要素では.liveを使うと良いようです。

【追記】.liveはjQuery 1.9から使えなくなってしまいました。換わりに.onを使うようになりました。
jQuery 1.7から追加されたイベントですので、早めに書き換えるのが吉かもしれません〜

当サイトでは、読み込んだfooter内のボタンをクリックでスクロールしてトップに戻るという処理をしていますが、

と、することでクリックした時にscriptが実行されます。
.liveで使えるイベントではない場合、.loadのコールバック関数とやらを使います。まだちゃんと理解しておりませんので備忘録ということで勘弁してください。事例は次のウィンドウサイズで要素の位置を変化させる”スズメは右にscript”に続きます。

スズメは右に

上記.loadでfooterを読み込んだ訳ですが、footer内のスズメのrssアイコンの位置をウィンドウの幅によって変えたかったとです。

footer_su
wrapにしているdivにcssでmin-width:950pxを指定しており、尚かつアイコンをposition: absolute;right:-15pxでwrap外に出しております。

ウィンドウの幅が950px以下で読み込んだ時、背景が切れるなどかっこ悪いので、jQueryでアイコンのright:-15pxを10pxに替えて内側に表示することにしました。

なんかこんな感じで、ウィンドウの幅を.width()で取得して、不等号(より大きい)という条件にしました。
ウィンドウの幅が982pxより大きい時、cssでright:-15px
そうじゃない時(小さいとき)cssはright:10px
ウィンドウの幅にはスクロールバーの部分も含まれるようなので、標準の17pxを足しておきました。(スクロールバーの分の幅を足して置いた方が余白が出なく安定します。)

そしてこのif〜を.loadで取得したfooter部分に効かせたい訳ですが…ちょっとお悩み。上記の.liveには該当するイベントはありません。

でどーよ? と思いましたがjQuery1.8では非推奨らしいのと(1.7使ってますがw)画像なども全て読み込んだタイミングで働くので画像ばかりのページだと厳しそうです。
.loadのコールバック関数を使えば外部ファイルを読み込んだタイミングで上記のifが読み込めるらしい。

{ }の中に上記のif〜を突っ込んでやればいいような気がします。
しかし、if〜は読み込み時のみならず、ウィンドウリサイズ時にも使い回すのでユーザー定義関数にしときました。

FirefoxとSafariでは動いておりますw

.onで動くようにしたスクロールしてトップに戻るクリックイベントを
.loadのコールバック関数に仕込んでもよろしいかと。かえってスマートかと思われ…。お、.onは勉強なんだからねっ///。

2012.10.19

ローカルのWordPressにリモートのを穫ったどー!

hiyo_funbari_wp
ローカルで試用していたWordPressにリモートの差分を持ってきたい。
というのがそもそもの動機でした。

WordPressが入ったフォルダの中身は直接FTPで上げたので、WordPressが作る.htaccessもだいたい同じになっている。
リモートとローカルの差分はメディアライブラリにブラウザから上げた画像データくらい。
おなじみのFTPでファイルやフォルダをやり取りするだけなので、お気楽です。

リモートのデータベースをインポート

問題なのは、データベースであります。
色々読みあさった結果、ローカルからリモートに上げた時と同じことをすればいいんじゃないかと。
インポートどーん!してみました。
よしっ、おけ!
差分というより、丸ごと移植になってしまいますが…

忘れないように手順。

  • リモートのメディアに上げた画像をFTPでローカルに穫ってくる。(uploadsフォルダごと同期)
    もしかしたらPluginsフォルダも穫って来るといいかもしれないけど膨大なので、手動で合わせている場合はいらないかも。
  • リモートのMySQLデータベースからphpMyAdminのエクスポートを使ってsqlファイルを書き出す。
  • エディタで開いて、19-20行ぐらいにあるデータベース名をローカルものに変更
  • wp_optionsの’siteurl’と’home’をローカルのurlに変更。リモートのurlをエディタで検索してローカルに一括変換して保存。
  • ローカルのMySQLデータベースへphpMyAdminを使い、修正したsqlファイルをインポート。(同じ名前のテーブルがあると不具合があるかもしれないので、テーブルは削除しておいた。)
  • ローカルのWordPressフォルダの中のwp-config.phpはいじってないのでそのまま。
  • http://ローカルのアドレス/wp-adminWordPressへログイン。ユーザー&パスワードはリモートの物になっているので注意。
  • 蛇足:とりあえず、db-managarの警告がうざいのでローカルの物に置き換える。

意外に簡単。
ただ、勉強不足でプラグインの設定など手動で直すことになるのが難点。プラグインの設定は.wp_optionsにあるらしいので、もしかしてエクスポートの際にこれを除外したら良いのかもしれないし、素人には手動が安全なのかもしれない。

これでphpMyAdminでエクスポートしたバックアップを復元するのもばっちり☆?書き換えの手順がいらないくらいで同じだろうと…なんの為にdb-managarを入れているのか謎ですが、勉強になりました。

phpMyAdminを触ったついでに…
セキュリティーを考えてwp_の接頭辞を変えてみる。

恐ろしいのでもちろんローカルでお試しして、旨くいったらリモートに上げるだす。

参考サイト:
[WordPress] テーブルプレフィックスを変更する|unlinked log

こちらのサイトさまを見れば何も言う事無しなんですが…phpMyAdminのSQLのとこ、クエリを実行するってのが初めてだったので、覚え書きします。ドキドキしたw

  • エディタなどを利用して(直書きはこわい)
    を始め全てのテーブルに対してリネームするクエリを書く。詳しくは参考サイト参照
  • phpMyAdminにてデータベースを選択しSQLのタブをクリック。『データベース hogehoge 上でクエリを実行する: 』のフィールドにエディタで書いたクエリをコピペ→実行するボタンを押す。
  • 続いてデータの中に使われているテーブルプレフィックスの部分をエディタで適宜書き換える。
  • 2と同様コピペ→実行。
  • wp-config.phpの
    の箇所を自分でつけたhoge_などに書き換える。

じゃじゃーん!でけた!!
セキュリティーのプラグインなどで簡単に書き換えられるようですが、プラグインの内容が多彩すぎて尻込み。。取りあえず手動でやってみました。

PageTop