2013年12月25日水曜日

スマホのWebブラウザから位置情報を取得する

最近のiOS、Android端末は Geolocation API に対応しているので、Webブラウザ経由で位置情報が取得できる。
ただし、ブラウザ側で許可されてないとダメだけど・・・
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <script>
      function getPosition() {
        navigator.geolocation.getCurrentPosition(
          function(position) { // 取得成功
            document.getElementById("lat").value = position.coords.latitude;
            document.getElementById("lng").value = position.coords.longitude;
          },  
          function(error) { // 取得失敗
            switch(error.code) {
              case 1:
                alert("位置情報の利用が許可されていません。");
                break;
              case 2:
                alert("デバイスの位置が判定できません。");
                break;
              case 3:
                alert("タイムアウトしました。");
                break;
            }
          },
          {
            enableHighAccuracy: true
          }
        );
      }
    </script>
  </head>
  <body>
    <input type="text" name="lat" id="lat" value="" />
    <input type="text" name="lng" id="lng" value="" />
    <input type="button" value="取得" onClick="javascript:getPosition();" />
  </body>
</html>

2013年12月20日金曜日

Google Chrome でフォントサイズを10pxより小さくする

Google Chrome にはフォントを自動で調整する機能が付いているらしく、"font-size:8px;"とか指定しても10pxより小さくはならない。
で、以前は以下のような記述で回避していた。
<p style="
  font-size: 8px;
  -webkit-text-size-adjust: 100%;
">小さい文字</p>
が、意図しない使われ方ばっかりされていたせいで廃止になってしまったんだと。
なので今は以下のような対応をしてみている。
<p style="
  font-size: 8px;
  -webkit-transform: scale(0.8);
  display: inline-block;
  -webkit-margin-start: -10px;
">小さい文字</p>

2013年12月16日月曜日

シェルで文字列比較

シェルで文字列比較をしたかったので。
#!/bin/sh

ARRAY=(aaa bbb ccc abc)

for ITEM in ${ARRAY[@]}; do
  case $ITEM in
    *c)
      # ccc, abc
      echo "cで終わる。"
      ;;
    a*)
      # aaa
      echo "aで始まる。"
      ;;
    *)
      # bbb
      :
      ;;
  esac
done
あと、 if とか case の中で何もしたくない時は「:」を使う。

再帰的にファイル数、ディレクトリ数を取得する

CentOSは1つのディレクトリに最大32000個までしかディレクトリを作れない。
でも作るシステムによってはテンポラリのディレクトリとかが溜まって危ないかもしれないのでチェックスクリプトを作ってみた。

#!/bin.sh

DIR=/home/hoge/

Seek(){
  for ELEM in * ; do
    if [ -d "$ELEM" ] ; then
      # ファイルだけなら -type f
      # ディレクトリだけなら -type d
      CNT=`find "$ELEM" -maxdepth 1 -type d | wc -l`
      if [ $CNT -ge 5000 ] ; then
        # 5000個を超えているものだけ出力
        PWD=`pwd`
        echo "$PWD/$ELEM : $CNT"
      else
        # 5000個を超えていないディレクトリだけさらに再帰的に処理
        (cd "$ELEM";Seek;)
      fi
    fi
  done
}

2013年12月2日月曜日

Windows のコマンドプロンプトで grep を使う

Windows のコマンドプロンプトで grep を使いたかったけど無かった。
どうやら findstr を使うらしい。
netstat -an | findstr 5432

2013年11月15日金曜日

SQLiteでテーブルの存在確認

SQLite でテーブルの存在確認をしたかったのでメモ。
SELECT COUNT(*)
  FROM sqlite_master
 WHERE type = 'table'
   AND name = 'table_name';

ブリしゃぶ

週末に家でブリしゃぶをやってみた。
今回は伏見の酒造、英勲の純米酒で。


具材は白菜、ネギ、大根などの野菜とブリとかそれ系の魚。
まあ今回はブリじゃなくてブリの幼魚の「わかし」とカンパチだったんだけども。
ちなみに大根はピーラーで薄く剥いて使うと美味しい。マジ美味しい。



まずは鍋に日本酒と昆布を投入。
沸騰する辺りで昆布は取り出し、後はアルコールを飛ばす。


アルコールが飛んだら野菜を入れて、後は適当にしゃぶしゃぶしてポン酢で食う。
コレだけで超美味い。そして写真を撮り忘れた。

しめは雑炊がいいかと。
水足して、ご飯入れて、塩振って、卵いれるだけ。これも超美味い。


気分の問題かもしれないけど、雑炊までやるなら土鍋の方が美味しい気がする。

2013年11月14日木曜日

MaxClientsとServerLimit

Apache の MaxClients を増やす時は ServerLimit 以上の値には出来ない。
設定すると以下のようなエラーが吐かれる。
WARNING: MaxClients of 500 exceeds ServerLimit value of 256 servers,
 lowering MaxClients to 256.  To increase, please see the ServerLimit
 directive.
なので場合によっては ServerLimit も変更する必要が有るのだけれど、ServerLimit は graceful では反映されない。
まあ graceful すると以下のようなメッセージで教えてくれるけど。
[warn] WARNING: Attempt to change ServerLimit ignored during restart
なのでこういう時はちゃんと restart するべし。

アクセスされるURLによってログファイルを分ける

Apache でアクセスされるURLによってログファイルを分けたかったので調べた。
ログの設定はよく以下の感じで書いてある。
CustomLog logs/access_log combined
これを例えば /hoge/ 以下にアクセスされたものを別のファイルに出したい時は
SetEnvIf Request_URI "/hoge/" hogelog
CustomLog logs/hoge.log combined env=hogelog
みたいな感じでいける。
ただこれだと access_log の方にもログが出るので、そっちに出したくない場合は
CustomLog logs/access.log combined env=!hogelog
とかしてやるといい。
あとは SetEnvIf は複数指定出来るので
SetEnvIf Request_URI "/hoge/" hogelog
SetEnvIf Request_URI "/fuga/hoge/" hogelog
CustomLog logs/hoge.log combined env=hogelog
とか
SetEnvIf Request_URI "/hoge/" hogelog other
SetEnvIf Request_URI "/fuga/" fugalog other
CustomLog logs/access.log combined env=!other
CustomLog logs/hoge.log combined env=hogelog
CustomLog logs/fuga.log combined env=fugalog
とかも出来る。

2013年11月12日火曜日

ジャストミート

ロケットニュースで紹介されていた生ハムの原木セットが欲しくなって横浜まで行ってきた。
【価格破壊】夢の生ハム原木まるごと・ナイフ・台がセットで1万円! 横浜市中央卸売市場のあまりに安すぎる良心的肉店『ジャストミート』
場所は横浜駅から徒歩15分ちょいの横浜中央市場の関連棟の一番奥。
※ジャストミートのホームページに有る地図だと別の建物にピンが落ちているので要注意。

で、行ってみるとクリスマス向けにアピールしてた。


でも「年内販売本数に限りがあります。」って書いてある。
お店の人に話を聞いたら、予約が殺到して今だと2週間以上待ちなんだって。

とはいえ予約しないと始まらないのでとりあえず予約。
あとはお店から連絡があるのを待つのみと。


店の前には沢山それらしき商品がディスプレイされていたけど、コレ本物なのかしら?

2013年11月11日月曜日

コースター

ビールのコースターがだいぶ集まってきたので、ダイニングテーブルに並べてみた。
透明のテーブルシート的なのを被せているのでこのまましばらく使ってみる。


逆から見るとこんな感じ。


ちなみにほとんどがドイツビールのヤツ。

2013年11月5日火曜日

PHP から Google のハングアウトへメッセージを送信する

XMPPHP という非常に便利なライブラリが有るので、使わせてもらう。
ダウンロードして解凍したら、XMPPHPディレクトリを以下のスクリプトを同じ階層に置いて使う。

<?php

include 'XMPPHP/XMPP.php';
$conn = new XMPPHP_XMPP(
    'talk.google.com',  # ホスト
    5222,  # ポート
    'username',  # 送信者のアカウント
    'password',  # 送信者のパスワード
    'xmpphp',  # リソース
    'gmail.com',  # サーバ(省略するとホストが使用される)
    $printlog=false,  # ログをプリントするか
    $loglevel=XMPPHP_Log::LEVEL_INFO  # ログレベル
    # LEVEL_ERROR, LEVEL_WARNING, LEVEL_INFO, LEVEL_DEBUG, LEVEL_VERBOSE
);
try {
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message('hogefuga@gmail.com', 'Hello, world!');
    $conn->disconnect();
} catch (XMPPHP_Exception $e) {
    die($e->getMessage());
}

ハングアウトに限らず XMPP に対応したアプリなら連携できるはず。

Linux でフロッピーのマウント

CentOS5 で開発ツールだけインストールしたらフロッピーがマウント出来なかったので・・・

1. マウントポイントの作成
mkdir /media/floppy

2. fstab の編集
vim /etc/fstab

/dev/fd0  /media/floppy  auto  pamconsole,exec,noauto,managed 0 0

3. マウント
mount /media/floppy

ま、今時使うことは無い気はするけど。

Vim で改行コードとか文字コードの確認とか設定

改行コードの確認
:set fileformat?
改行コードの設定
:set fileformat=unix
※unix = LF, dos = CRLF, mac = CR

文字コードの確認
:set fileencoding?
文字コードの設定
:set fileencoding=utf-8
※utf-8, shift_jis, euc-jp 等々

Linuxで一括改行コード変換

CentOS だと yum で unix2dos とか dos2unix がインストール出来るのそれを使うと楽。
yum install dos2unix
でもって find あたり使って一括処理してやるとか。
find . -regex '.*\.js' -exec dos2unix {} \;

2013年5月29日水曜日

.NET Framework で WebBrowser コントロールを使用する際に IE のバージョンを選択する

VBとかC#でWebBrowserコントロールを使用する時に、IEのバージョンを指定したい時が有る。
そんな時はレジストリをいじるといいらしい。

32 bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
64 bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

ここに使用したいEXE名(myapp.exe 等)で新規DWORD値を追加する。
で、以下の通りに値を指定する。

  • 9999 (0x270F)
    • IE9のスタンダードモード。!DOCTYPEは無視する。
  • 9000 (0x2328)
    • IE9のスタンダードモードがベースだが、!DOCTYPEに従う。
  • 8888 (0x22B8)
    • IE8のスタンダードモード。!DOCTYPEは無視する。
  • 8000 (0x1F40)
    • IE8のスタンダードモードがベースだが、!DOCTYPEに従う。
  • 7000 (0x1B58) 
    • IE7のスタンダードモードがベースで、!DOCTYPEに従う。
ちなみに、VisualStudio で開発・デバッグ中にこの機能を有効にしたい場合は myapp.vshost.exe も追加しないといけない。

2013年4月12日金曜日

Google Map で指定した緯度経度からずらしてアイコンを表示したい

カスタムOverlayViewを使うと出来る。
function custom_marker(map, lat, lng) {
  this.lat_ = lat;
  this.lng_ = lng;
  this.setMap(map);
}

// OverlayView を継承
custom_marker.prototype = new google.maps.OverlayView();
// draw 処理
custom_marker.prototype.draw = function() {
  if (!this.div_) {
    // 出力したい要素を生成
    this.div_ = document.createElement("div");
    this.div_.style.position = "absolute";
    this.div_.innerHTML = "<img src='images/custom_marker.png' alt='' />";
    var panes = this.getPanes();
    panes.overlayLayer.appendChild(this.div_);
  }
  // 緯度経度を Pixel に変換
  var point = this.getProjection().fromLatLngToDivPixel(
    new google.maps.LatLng(this.lat_, this.lng_)
  );
  // 100px ずらす
  this.div_.style.left = point.x - 100 + 'px';
  this.div_.style.top  = point.y - 100 + 'px';
}
// remove 処理
custom_marker.prototype.remove = function() {
  if (this.div_) {
    this.div_.parentNode.removeChild(this.div_);
    this.div_ = null;
  }
}

var cm = new custom_marker(map, 35.689487, 139.691706);

PHPとVB.NETでデータを加工してやり取りする

生データが嫌だけどお手軽にやりたいならビット反転して送るとか。

PHP側
$filename = "hoge.txt";
if ($handle = fopen($filename, "r")) {
  while (!feof($handle)) {
    $s = fread($handle, 1024);
    echo ~$s;
  }
}
fclose($handle);

VB.NET側
Dim filename As String = "hoge.txt";
Dim contents As String = "";
Dim bs(1024 - 1) As Byte
Dim readSize As Integer
Dim fs As New System.IO.FileStream(filename, IO.FileMode.Open, IO.FileAccess.Read)

While True
  readSize = fs.Read(bs, 0, bs.Length)
  If readSize = 0 Then
    Exit While
  End If
  For i As Integer = 0 To bs.Length
    bs(i) = Not bs(i)
  Next
  contents += System.Text.Encoding.UTF8.GetString(bs)
End While
fs.Close()

PHPでマルチバイトを含んだディレクトリのリストアップ

PHPでディレクトリをリストアップして、aタグでパラメータとして渡せるようにしてみる。
<?php

$dir = "/hoge/fuga";
if (isset($_REQUEST["dir"]) && $_REQUEST["dir"]) {
  $dir = mb_convert_encoding($_REQUEST["dir"], "SJIS", "UTF-8");
}
$html = "";

if ($dh = opendir($dir)) {
  while ($entry = readdir($dh)) {
    if (is_dir($dir . DIRECTORY_SEPARATOR . $entry) && $entry !== "." && $entry !== "..") {
      $html .= 
        "<a href=\"dir.php?dir=" . urlencode(mb_convert_encoding($entry, "UTF-8", "SJIS")) . "\">" . 
        mb_convert_encoding($entry, , "UTF-8", "SJIS") . 
        "</a><br />";
    }
  }
}

?><html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <?php echo $html; ?>
  </body>
</html>