月別アーカイブ
検索

‘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 日本語入力

たまに(ひっそりと)停止してしまうのが玉にキズです。

そんな時の対処方法です。

  1. [ALT]+[半角/全角] で日本語入力をONにする(すると、MS-IMEなど別のIMEが動く)
  2. [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の機能も簡単に実装できるので、そのうち作りたいと思います。

3週間ほど前に海外からの攻撃を受けていたサーバ。最近は順調に動いています。

それでも「定期的にログは見よう」と思っていたのに、気がつくと3週間経っていました。

久しぶりに見てみると、、、

続きを読む »

HTMLエスケープ

HTMLエスケープ

WordPressでもHTMLベタ書きでも、タグの説明のためにタグを書きたい時には困ります。

なにしろ、普通にタグを書くと、表示されずにタグとして働いてしまうのですから。

今日は、タグをそのまま表示する方法を紹介します。

続きを読む »

金曜の昼に、お客様から「メールがなかなか届かない」という第一報が入りました。

メールマガジンを発行するために、Mailman というメーリングリストシステムを使っています。試しに会員登録をしてみたが、仮登録メールがなかなか届かないとのこと。

このサーバはお名前.com の VPS で、Mailman、WordPress、Subversion、Redmine などなど、いろいろなサービスを動かしているので、問題が複雑に見えてしまいました。

原因が分かった今となっては、「なんであの時気がつかなかったのか!」と思うことばかりですが、臥薪嘗胆の意味を込めて、恥を公開しておきます。

続きを読む »

以前、「最近の投稿」に日付を入れる方法を紹介しました。

同じ悩みを持つ方が多かったようで、けっこうなアクセス数がありました。

今回は、ITPK版ページ ウィジェットを作ってみます。

親兄弟ページへのリンク

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

続きを読む »

2011-06-11 : post-commit スクリプトを修正しました。

昨日の記事で紹介した、”Subversionのリポジトリをsvnsyncコマンド使ってミラーリングする”方法の追記です。

昨日は簡単に書くと、本家リポジトリのコミット完了後に分家リポジトリにsvnsyncを発行する、というところまでやりました。

今回は、分家サーバが稼働中のときだけ svnsync する、という処理を加えましょう。

続きを読む »