‘Tips’ カテゴリの記事
世の中猫も杓子もスマートフォンのような風潮ですが、アクセス解析を見るかぎりではまだまだ携帯電話(いわゆるガラケー)が圧倒的に優勢です。
当然、サイトを作る際にも携帯電話を無視するわけにはいかないので、携帯用にもページを作ります。
HTTPリクエストの UserAgent を見て PC 用のページと 携帯用のページを切り替えるようにしているのですが・・・。
困ったこと
困ったことがいくつか出てきました。まずは、今回のケースでやりたいことを書いておきます。
- 携帯電話専用ページにしたいので、PCからアクセスがあったら QRコードのページへリダイレクトする。
- 携帯電話からのアクセスだったら、コンテンツを表示する。
- 検索エンジンからも利用者を誘導する。
これらのために、携帯 or PC での振り分け、QRコード作成&リダイレクト、検索エンジンへの登録、を行ないました。
PCでアクセスすると、期待通りQRコードのページへとリダイレクトされ、そのQRを使って携帯電話で目的のページにアクセスできました。
携帯電話で、URLを入れてアクセスすると、これも期待通り目的のページが表示されました。
ところが、検索すると思った通りになりません。
まず、検索結果の中身が、リダイレクト先(QRコード表示用ページ)になっていました。これでは中身に何を書いても検索キーワードに反映されません。
また、検索結果をクリックすると、Google や Yahoo が(勝手に)携帯電話用に変換してしまう。ずっと下の方にある「ページを直接表示する」で、目的のページを表示できるものの、そんなことをしてくれる一般ユーザはまずいないだろう。
問題点
1つ目の問題点は「検索エンジンが(目的のページではなく)リダイレクト先のページをクロールしている」こと。
2つ目は「元々携帯電話用に作ったページなのに、GoogleやYahooが携帯電話ように変換してしまう」こと。
これは携帯用のページだ!
2つ目はわりとあっさりと解決。Google に説明があったので、コレの通りにしました。
この指定は(同じエンジンを使っているから当然ですが)Yahooにも効果がありました。
リダイレクト前の内容をクロールしろ!
ページのリダイレクトに、meta タグの redirect 要素を使っていたのですが、どうやら検索エンジンはこの要素をたどってくれるらしい。
ほとんどの場合はその方が好都合なのですが、今回のケースでは余計なお世話。
そこで、どうやら「検索エンジンはJavaScriptを無視する」らしいことを利用して、JavaScript( location.href ) でリダイレクトするようにしました。
解決
以上の対策で、目的が達成できました。
とあるお客様からの相談で、「(Webサイトの)画像をクリックしたら、声が流れるようにしたいけど、できるものですかね?」という案件をいただいていました。
その当時は、私たちとは別の業者さんがサイト管理をされていたので、あまり深入りせずに「できますよ。今は私がサイトを触るわけにはいかないので、声の録音方法と、業者さんに送る方法を教えますね」程度の対応に留めておきました。
確かに要求事項はクリアしているけど・・・
数日後、件のお客様から「お陰さまでできました」と連絡があり、そのページを見せてもらいました。
画像をクリックすると、別ページに遷移して殺風景なプレイヤーが表示されて声が流れ始めました。ファイルのダウンロード速度もやや気になる。
参考のためにコードを見てみると、お客さんが送ったwavファイルに a タグでリンクを張っているだけでした。HTML5対応のブラウザならば内蔵プレイヤーで、そうでなければプラグインのプレイヤーで再生されるわけです。
うーん、確かに「画像をクリックしたら声が流れる」という要求はクリアしているし、お客さんも文句はないみたいだけど・・・。本当にこれでいいのか?
今回の要求の意図しているところって、「見ている人が画像(サイト主の顔のイラスト)をクリックしてみたら、声が出てきてびっくり」みたいな遊び心&いたずら心なんじゃないかと思うのですよ。少なくとも、私はそう受け取りました。
それが、ページは遷移しちゃう(声の主のイラストが見えなくなる)わ戻るボタンを押さなきゃいけないわでは、仕掛けの魅力が半減ですよ。
ある案件で、Excelシートを全自動で作る必要が出ました。
まあ、その程度はVBAで解決・・・、と思ったら、条件付き書式に指定した式がずれてしまう・・・。
初めは凡ミスかと思ってコードを確認しても、おかしな点は見当たらない。
で、ネットで調べてみたら、マイクロソフト公認のExcelのバグでした。
バグの概要
バグが発生する条件は、
- Excel2000以降(少なくとも2007では発生)
- 条件付き書式はVBAで指定する
- 条件は 相対セル参照 で指定する
- 選択したセル以外に条件付き書式を指定する
というもの。詳細はマイクロソフトのページをみてください。
回避方法
今回の案件では、上の3つはどうしても回避できない項目でした。
(マイクロソフトのページでは、「VBA使うな」とか「絶対参照で書け」なんて回避方法が紹介されてました)
でも、最後の「選択したセル以外に~」という項目は回避できます。
要は、「条件付き書式を指定したいセルを選択しておけばOK」ということです。
実際、そのようにコードを組んだら、あっさりと解決しました。
ちなみに、マイクロソフトのページにあったコードを、この方法で回避するとこうなります。
Sub Example() Dim rOrgSelect As Range ThisWorkbook.Worksheets(1).Range("A1").Select With ThisWorkbook.Worksheets(1).Range("B1") Set rOrgSelect = Selection .Select .FormatConditions.Delete .FormatConditions.Add Type:=xlExpression, _ Formula1:="=A1=1" .FormatConditions(1).Interior.ColorIndex = 46 End With rOrgSelect.Select End Sub
2,6,7,15行目が、Excelのバグを回避のために追加した行です。
最新用語がすぐに変換できるようになる辞書や予測変換が便利なGoogle 日本語入力。
たまに(ひっそりと)停止してしまうのが玉にキズです。
そんな時の対処方法です。
- [ALT]+[半角/全角] で日本語入力をONにする(すると、MS-IMEなど別のIMEが動く)
- [Shift]+[Ctrl]でIMEを切り替える
(設定によっては、[Shift]+[Ctrl]ではないかも)
SharpSsh は.NET 環境で SSH 接続をするための ライブラリ です。
今回、とあるシステム開発のために、VC# で SFTP を行う必要があったので、使ってみました。
とても簡単に使えて便利なのですが、ファイル更新時刻を取得/設定できなかったので、それ用の関数を追加しました。
変更箇所
SharpSshはソースも公開されているので、簡単に機能追加ができます。
今回手を加えたのは、Sftp.cs というファイルです。public class Sftp のブロックの中に以下のコードを追加しました。
namespace Tamir.SharpSsh
{
public class Sftp : SshTransferProtocolBase
{
(略)
// MTime
public int GetMTime(string path)
{
Tamir.SharpSsh.jsch.SftpATTRS attr;
try
{
attr = SftpChannel.stat(path);
return attr.getMTime();
}
catch (Exception e)
{
return 0;
}
}
public void SetMTime(string path,int mtime)
{
try
{
SftpChannel.setMtime(path,mtime);
}
catch (Exception e)
{
}
}
(略)
}
}
実はSharpSsh ライブラリのソース内では、SFTPの(たぶん)全ての機能を使えるように実装されているのですが、外部に公開されている関数がごく一部なのです。
なので、今回組んだのは機能を外部に提供する部分だけです。
使用上の注意
この機能(リモートファイルの更新時刻を取得/設定)を使いたかったのは、ローカルファイルのそれと比較してどちらか新しい方を残す、ということをしたかったのです。
ところが、.NET で使われるファイル更新時刻の表現方法は DateTime 型で、今回作ったGetMTime()関数とは異なる形式です。
DateTime 型は、1601/01/01 00:00:00 からの経過時間を 100ns で割った値です。
片やGetMTime()の戻り値はUNIX形式。つまり、1970/01/01 00:00:00 からの経過時間(秒)です。
そこで、DateTime 型を UNIX形式に変換する関数を作りました。
static int DateTime2UnitTime(DateTime dt)
{
const long basetime = 116444736000000000L;
// ( = DateTime(1970,1,1,9,0,0,0).ToFileTime() )
return (int)((dt.ToFileTime() - basetime) / 10000000);
}
basetime定数は、1970/01/01 09:00:00(DateTime が日本時間なので9時です。本来ならUTCに合わせて作るべきなのですが・・・)を ToFileTime()関数でlong型にしたもの。1601年から1970年までを、100ns単位で表したものです。
で、それを知りたいDateTimeから引いて、秒単位に直すと 目的のUNIX形式になる、というわけです。
他にも
他のSFTPの機能も簡単に実装できるので、そのうち作りたいと思います。
WordPressでもHTMLベタ書きでも、タグの説明のためにタグを書きたい時には困ります。
なにしろ、普通にタグを書くと、表示されずにタグとして働いてしまうのですから。
今日は、タグをそのまま表示する方法を紹介します。
金曜の昼に、お客様から「メールがなかなか届かない」という第一報が入りました。
メールマガジンを発行するために、Mailman というメーリングリストシステムを使っています。試しに会員登録をしてみたが、仮登録メールがなかなか届かないとのこと。
このサーバはお名前.com の VPS で、Mailman、WordPress、Subversion、Redmine などなど、いろいろなサービスを動かしているので、問題が複雑に見えてしまいました。
原因が分かった今となっては、「なんであの時気がつかなかったのか!」と思うことばかりですが、臥薪嘗胆の意味を込めて、恥を公開しておきます。
以前、「最近の投稿」に日付を入れる方法を紹介しました。
同じ悩みを持つ方が多かったようで、けっこうなアクセス数がありました。
今回は、ITPK版ページ ウィジェットを作ってみます。

親兄弟ページへのリンク
やりたいことを大雑把に書くと、「現在表示中のページの、親ページと兄弟(姉妹?)ページを表示する」ということです。