$AmericanLeagueEastDivisionTeams = array( 'BAL' => array('city' => 'Baltimore', 'name' => 'Orioles'), 'BOS' => array('city' => 'Boston', 'name' => 'Red Sox'), 'NYY' => array('city' => 'New York', 'name' => 'Yankees'), 'TB' => array('city' => 'Tampa Bay', 'name' => 'Rays'), 'TOR' => array('city' => 'Toronto', 'name' => 'Blue Jays'), );shuffle()してみると…
shuffle($AmericanLeagueEastDivisionTeams); var_export($AmericanLeagueEastDivisionTeams);↓結果(見やすいように整形済み)
array ( 0 => array ('city' => 'Boston', 'name' => 'Red Sox'), 1 => array ('city' => 'Toronto', 'name' => 'Blue Jays'), 2 => array ('city' => 'New York', 'name' => 'Yankees'), 3 => array ('city' => 'Tampa Bay', 'name' => 'Rays'), 4 => array ('city' => 'Baltimore', 'name' => 'Orioles') )はい。キーが破棄されて、数字キーに割り当て直されちゃいます。じゃあ、array_rand()でランダム順のキーを取得しよう、と思った。
$len = count($AmericanLeagueEastDivisionTeams); $abbrs = array_rand($AmericanLeagueEastDivisionTeams, $len); var_export($abbrs);↓結果
array ( 0 => 'BAL', 1 => 'BOS', 2 => 'NYY', 3 => 'TB', 4 => 'TOR', )よし、この「キーがランダム順に入った配列」を使おう。…あれ?並べ変わってなくね?たまたまかな(^o^;
再実行→やっぱりおんなじ→再々実行→やっぱりおんなじ→(無限ループ)全件取得する場合は並べ換えて紅の豚?マニュアルに書いといてよ。そんなこと。。
まあ、array_keys()を使ってそれをshuffle()すれば同じ事はできるか。$abbrs = array_keys($AmericanLeagueEastDivisionTeams); shuffle($abbrs); var_export($abbrs);↓結果
array ( 0 => 'NYY', 1 => 'BOS', 2 => 'TB', 3 => 'BAL', 4 => 'TOR', )当然ながらうまくいく。再実行すればまた並び変わる。せっかくだから、関数化しておくか。PHPオリジナルの命名則にあわせて、ashuffle()と名付ける(※)。オリジナルのshuffle()が並べ替えが成功したかどうかを返しているので、とりあえずtrueを返すことにする。
function ashuffle(&$array) { $keys = array_keys($array); shuffle($keys); $res = array(); for ($i = 0, $_l = count($keys); $i < $_l; $i++) { $res[$keys[$i]] = $array[$keys[$i]]; } $array = $res; return true; }これで、
ashuffle($AmericanLeagueEastDivisionTeams); $rank = 0; foreach ($AmericanLeagueEastDivisionTeams as $abbr => $team) { printf("%d: %s %s (%s)¥n", ++$rank, $team['city'], $team['name'], $abbr); }↓結果
※:蛇足。この記事を書く時に、そういえば、もうすでに誰かが作ってるよな。"ashuffle()"って名前で。っと思ってググってみたら、どうやら無いみたい。。ってことは、このページがひっかかるようになるんだ。ウシシ( ̄ー ̄)
hoge.php?foo=var hoge.php?foo=var&PHPSESSID=(SSID1) hoge.php?foo=var&amp;PHPSESSID=(SSID1)&PHPSESSID=(SSID2) ... hoge.php?foo=var&amp;amp;amp;amp;amp;PHPSESSID=(SSID1)&amp;amp;amp;amp;PHPSESSID=(SSID2)&amp;amp;amp;PHPSESSID=(SSID3)&amp;amp;PHPSESSID=(SSID4)&amp;PHPSESSID=(SSID5)&PHPSESSID=(SSID6) ...すなわち、
hoge.php?foo=varにアクセスがあって、セッションIDがついてないのでつけましょう。そしてリダイレクト。
hoge.php?foo=var&PHPSESSID=(SSID1)おやおや、セッションIDがついてないのでつけましょう。そしてリダイレクト。
hoge.php?foo=var&amp;PHPSESSID=(SSID1)&PHPSESSID=(SSID2)っという具合に、無限に繰り返し、URL長エラーになるまで繰り返してた。っということ。
原因は、"&"であるべきセパレータが"&"になっていること。"PHPSESSID"のつもりが、"amp;PHPSESSID"になっちゃったわけだ。
さて、誰の仕業だろう?プログラムで発行しているときにやっちまった?Net_URLを使ってるから、この子のせい?PHPが自動で付けたもの?Apacheが変換した?
とまあ、色々調べてしまったよ。結論を言うのは簡単だなぁ。。その結論とは、PHPの設定がヘンだった。それと、PHPの設定をNet_URLが忠実に読み込んでいたから。
Net_URL::getQueryString()で、クエリストリングのセパレータを、ini_get('arg_separator.output')で取ってきてます。
んで、オイラのWindowsなxampp環境では、php.iniファイルで下記の通り指定していた。arg_separator.output = "&"
むむむ。なんでこんなことしたんだっけ?はい。これをコメントアウトして、サービスを再起動すると、…ちゃんと動いた。
以下、苦労した原因を箇条書きしておく。繰り返さないように(´・ω・`)BroadcastReceiverを使って、ほとんどすべてのブロードキャストを受け取ってToastでポップアップ表示する。という、うっと惜しい(なぜか変換できない)Widgetを作ってみたわけだが、いつの間にか勝手に泊まる。いや、止まる。
さて、グーグル先生に相談だ(音符
BroadcastReceiverに寿命があって、寿命が尽きたことを知る手段でもあるのではないかと探したんだけど、うまくいかない。んで、それは置いておいて、別件でサービスについて調べてたんだけど、…これは、という情報があった。
こちらに曰く、Android は、メモリが少なくなってくると...サービスも止められてしまうことがある ... システムがサービスを停止させた場合、メモリに余裕が出来るとシステムが再度起動してくれるああ、そんなこと聞いたことある。聞いたんじゃなくて読んだんだけど。<どうでもいいだろ
システムから起動された時は Service::onStart は呼ばれず、Service::onCreate までしか呼ばれないこれだ(゚∀゚)!確かに、ServiceのonStartでBroadcastReceiverをregisterReceiverしておった。onCreateでレジストしてもよかろうもんがじゃ。これで、止まっても復活してくれるのかなぁ。
やってみるけど、いつ勝手に止まるか、そしていつ再起動するかがわからないから、テストがムズイね┐(´д`)┌
こんなものが欲しい人は居ないと思うけど、どうぞ。(次のページにあります…アクセス解析のためです(ノ´∀`*))
ところで、某ブログにも書きましたが、真面目に使うなら、こっちのほうが良いですよ。画面を点けたら秒時計(マーケット)スリープ状態から画面点灯した時のみ、通知領域に時分秒の時計をしばらく表示してくれます。ロック解除しなくても見られるのがステキですね。…ワタシも使ってます(^o^;
jQuery 1.4.4 で使えなくなってるセレクタ - m2
まあ、検索にヒットしやすくなるということで書きます。
htmlでこんなフォーム部品があって、その値をjQueryで使用する場合。<input type="text" name="arr[key]" size="8" />
なにかの都合で、PHPなどでフォーム値を配列として取得したいな、というわけで、name属性に配列を指定しています。ここがミソ。
jQueryで取得はこうしていた訳だが(ホントは"["や"]"などの記号はエスケープしなきゃいけないみたいだけど…)var val=$(":input[name=arr[key]]").val();
これが、jQuery1.5にしたら動かなくなった。
どうすればいいのかというと、とりあえず↓のようにすれば動きました。var val=$(":input[name='arr[key]']").val();つまり、「foo='var'」と、右辺をクォートすればよいようです。やってみてないけど、シングルとダブルクォーテーションを入れ替えてもよいと思われ。
var val=$(':input[name="arr[key]"]').val();
WebアプリでCSVを吐き出して、利用者様にはExcelで開いてもらう場合、おそらく巷で良く起こっていると思われる現象…『電話番号の最初の"0"が表示されんぞゴルァ』
というわけで、CSV形式ではなく、Excelが直接読める形式にすることによって、Webアプリ側で書式設定を施す。という方法。
というお話は今回のメインではないので、詳しく知りたい方は上記キーワードでググれかし。
で、上記方法で、セル内改行を行いたい場合に困った。まずは、改行文字のみだと、その部分に空白が表示されるだけ。というわけで、PHPでいうところのnl2br()で<br>タグに変換すると…なんか、改行の数だけ行数が増えて、同行の改行なしのセルは勝手に結合されて、、、
グーグル先生に聞いてもご機嫌ナナメだし…でも、ヒントは賜った。
Excelシート自体が検索に引っ掛かり、そのソースが表示された。…実際に作ってソースを解析すればいいんだ。さあ、Excelを起動、セル内改行を作って、「Webページとして保存」。テキストエディタで開く。どんなスタイルを使っているんだ…?
紆余曲折を経て、br {mso-data-placement:same-cell;}brタグ全体に指定されてたのね…orzセルに指定されたスタイルのどれが効いてるのか必死に探しちまったよ。早く気付けよ、俺。というわけで、さっきのスタイル指定を
なぜかperlを使わなければならなくなり…。phpだったらfile_get_contentsなんだけどなぁ…。という訳で。
Webページの取得
use LWP::Simple; my $cont = get('http://example.com/');これで行けたっ!useってなに?な状態だけど、魂塊(※)はそれでヨシ!もういいよ。三項にならなくてゴメンナサイ。
※:今回を無理に誤変換した
ついでに書いておくと、Basic認証が必要な場合。use LWP::Simple; my $cont = get('http://example.com/gw.php?n=2'); if (!$cont) { $cont = get('http://id:pw@example.com/test/gw.php?n=2'); }そう、サブディレクトリでテストしていて、そっちにはBasic認証かかってやがる。って場合に上記が使える。さらに言うと、こちらはPHPで、あちらはPerlな*.cgiで、それぞれ開発してて、いざ、ガッチャンコ!…できねーよ。。ナレーション『説明しよう。PHPさんとCGIさんは仲が悪くて共存できないのである。ってな場合に、こんな風にすると良いんじゃないかと。
さて、もっと愚痴るか(^^;Perlなあちらさん。昨今超スタンダードなPerl言語の勉強をする機会を提供して下さり、誠にありがとうございました。感涙をこらえることができません。厚かましいとは存じますが、ひとつご質問がございます。御社が会社理念となされていらっしゃる、CONSUITATIONSOLOUTIONとは何語ですか?当方外国語の心得が無く、浅学の身にて、このような言語は目にしたことがございませんので、ご教授頂ければありがたく存じます。
注:カギ括弧"『"は閉じないのがオシャレなのです(自己満足
is_category と in_category …どう違うねんっ!というお話。
◎is_category()Function Reference/is category « WordPress Codex◎in_category()
テンプレートタグ/in category - WordPress Codex 日本語版
通常、このタグはループの中で使いますが、ループ外で使いたい場合は、 事前に変数 $post の値をセットしておく必要があります。
<?php $post = $wp_query->post; include(TEMPLATEPATH . in_category('17') ? '/single2.php' : '/single1.php'); ?>
つまり、is_category の検査対象は表示中のページ、in_category の検査対象は特定の記事、ということか。なので、is_category はそのまま使えて、in_category はループ内か、あらかじめ対象の記事を指定しておかなければ使えない、ちゅうこと。
拡張子がhtmlなPHPファイルをそのままPHPとして動かす場合、HTML先頭の宣言がPHPとして解釈され、結果エラーとなる。PHP開始タグを「」としても良い。という、『ショートオープンタグ』なる設定があって、デフォルトで有効になっている故である。
よって、この『ショートオープンタグ』設定を無効化すればよい。ただ、この設定を行うためのディレクティブ"short_open_tag"なのだが、『変更の可否』がPHP_INI_ALL、ただし、PHP <= 4.0.0 では PHP_INI_ALL、PHP < 5.3.0 では PHP_INI_PERDIR。だそうで、PHP5.3.0以降なんてまだあまりつかわれていないだろうから、PHP_INI_PERDIRであって、つまり『php.iniかApacheのhttpd.confか.htaccessで設定する必要がある』ので注意が必要。。(ini_set()できません、ってこと)
AddType application/x-httpd-php .html php_flag short_open_tag off
ちゃんと動くかは環境次第なので、あしからず。
例えば商品紹介Flashで、1.Flash内でカテゴリーを選択2.カテゴリーごとの商品が一覧表示される3.商品を選ぶと商品購入ページに飛ぶ4.ブラウザの戻るボタンでもどる5.Flashが最初から再生される6.再度カテゴリーを選択...これがまあ普通だった訳だが。deep linking なる手法で解決する方法が発明されていたようで。
初めて見たのは、…って、紹介しようとしたら、かわっとるがや。やめちゃったのか…なにか問題ありなの?やめてよ。。
やめないで~。やめないで~。やめて~。…やめるのをやめて~。っていうやりとりを思い出した。。(O橋K泉議員辞職会見より)
基、上記フローの、「4」で「2」に戻りたい、という話。こういうのを使うのが通例みたいだけど、今回はもっと軽く実現したい。というわけで、コレ。Flashから任意のJavaScriptを走らせる+結果を受け取る!受け取り
var locationHash:String = String(ExternalInterface.call("function(){return location.hash}")); var categoryId:int = int(locationHash.substr(1));言うまでもないが、文字列として使うならint()は不要。カテゴリー切り替え時
ExternalInterface.call("function(h){location.hash=h}",categoryId);こうしておくと、URLの最後に"#123"とかついて、他のページから戻ってきたとき受け取れる。ここで、IEユーザーに朗報。"swfobject.js"を使ってswfを配置すると、
var locationHash:String = String(ExternalInterface.call("function(){return location.hash}")); trace(locationHash);が
nullになって誤作動してくれるぞorz...
ありがとうIE、Microsoftバンザ~イ┐(’Д`)┌
"AC_RunActiveContent.js"だとダイジョぶみたいだけど。