2011年5月28日土曜日

Softbankガラケーの画像が表示されない!?

灰皿なうのガラケー対応してから、Docomo、auは画像が確認できたんだけど、Softbankのガラケーだけ、うまくmapが取れていなかったことが、カミさんの携帯で判明。
この原因がわからん。

1件、探してヒットしたのが、3G以前のものはgif形式だとダメでjpgならOK、というもの。
早速、画像の形式を変更してみたけど(こんな感じ&format=jpg)うまく表示されない。

それで、さらに検索していると、同じようなQAを発見。
それによると、GooglemapAPIのバージョンによる記述式が異なり、v1の形式で記載しているからでは?とのこと。
あれ?そもそもv2って出てたの?と情弱ぶりを発揮しながらv2の構文で記述。

んー、出た出た。表示された。
なるほどね、こういうことだったのね。

v1とv2の違いにより変更した箇所はこんな感じ。
・最初んとこ
 V1の場合:<img src='http://maps.google.com/staticmap?
 V2の場合:<img src='http://maps.google.com/maps/api/staticmap?center=
・マーカーの設置
 V1の場合:marker=緯度,経度,色
 V2の場合:markers=color:色|緯度,経度

という話。

2011年5月26日木曜日

[訂正]Excelでカイ二乗検定

昨日の記事に誤りがありました。
最初のクロス集計表で、総合計欄が20の固定値になっておったんですな。
SUMに修正致しました。

正しくは下記の通りです。



確率としては4%に上昇しましたが、まだ5%未満で有意ですね。


しかし不思議なことに、総合計欄を動かすとCHITEST関数の結果も変わるんです。
この関数では合計欄見てないのに。。。なぜだろう?


サンプルファイルをダウンロード

2011年5月25日水曜日

[Excel]簡単カイ二乗検定

こんにちは。部隊長です。
最近統計処理を行う事が多いものですから、復習も兼ねてやり方を書いてみます。

【カイ二乗検定とは?】
クロス集計の結果が、統計的によくある事なのか否かを検定します。
これによって、カテゴリー毎の独立性が立証されるわけです。

【どういう時に使うの?】
例えば前日に酒を飲んだ人たちと、飲まなかった人たちで翌日の起きた時間帯に差があるのかどうかー
なんて事が統計的にわかります。


では、やり方。


1.クロス集計表を準備
検定を行いたいクロス集計表を準備します。




2.期待値を計算
このクロス集計表の期待値を計算します。
期待値とは・・・この例で言うと飲んだ人と飲んでない人を寝坊した人と寝坊してない人の割合で分けた値です。



飲んでなくて寝坊した人の期待値は、「寝坊した人の数×飲んでない人の数÷全体」となります。
これを4つのセルにそれぞれ貼り付けて、値を出します。


3.カイ二乗値を計算
カイ二乗値とは、実測値と期待値のズレを表します。
このズレが統計上の信頼確率範囲内ででるものか、そうでないかを検定するのが今回のゴールです。


各セルごとに「(実測値-期待値)の二乗÷期待値」で算出し、総和がこのクロス集計表のカイ二乗値となります。


4.確率を検定する
求めたカイ二乗値はカイ自乗分布に従います・・・ってなんのこっちゃですね。
詳しくはこちらを見ていただくとして、求めた値がどれくらいの確率で出現するものなのかを算出する関数が「CHIDIST(x,自由度)」です。


今回のクロス集計表は2×2マスですから、自由度は「(行の数-1)×(列の数-1)」で1となります。
算出された確率は・・・0.038 → 3.8%の確率となるわけです。
統計上、信頼確率範囲は用途により95%だったり99%だったりしますが、95%とするのであれば、このクロス集計表の結果から、酒飲んだ人と飲んでない人が寝坊するかどうかは関係が無い事が棄却された事になり、要するに飲んだら寝坊するみたいよ。有意に。って事になるのです。
・・・まどろっこしい。












5.もっと楽に確率を算出する =CHITEST(実測,期待値)


えっ?


カイ二乗値も自由度もいらない・・・



結論:理屈は大事。



2011年5月24日火曜日

位置情報(緯度、経度)をMySQLのGeometry型で保存する

こんばんは。BS事業部隊員です。

今回は、位置情報(緯度、経度)の保存方法を紹介します。

これもまた得意のググりで見つけたものです。
位置情報サービスのはじめ方
Google MapsとMySQLの連携

MySQL(v5.0)のGeometry型.... 便利そう!とういうことで使ってみることにしました。
....
くわしいことは、先輩方のサイトを参考にしてください。詳しく載ってます。

ここでは、ポイントだけ。※ 例の位置情報は適当です。

1.Geometry型とは
MySQL4.1以降で用意されている空間情報を扱うデータ型

2.テーブル定義
対象カラムの型をGeometryとするだけ。
CREATE TABLE points (
  point_id INT NOT NULL
 ,latlon GEOMETRY NOT NULL
 ,PRIMARY KEY (point_id)
 ,SPATIAL KEY (latlon)
) Engine=MyISAM;
latlonカラムをSPATIAL INDEXとするため、MyISAMで使用します。

3.データの挿入
INSERT INTO points (
  point_id
 ,latlon
) VALUES (
  1
 ,GeomFromText('POINT(137.111 35.222)')
);
GeomFromTextはGeometry型に変換するMySQLの関数です。

4.データの取得
① 位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
 ,ASTEXT(latlon) as geomtext
FROM points;
Xは経度、Yは緯度、ASTEXTは文字表現を返す関数です。

② 指定した範囲内の位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
FROM points
WHERE MBRContains(GeomFromText('LINESTRING(140.00 36.00, 139.20 35.55)'), latlon);
MBRContains、LINESTRING関数については、このサイトに詳しく載ってます。

③ 2点間で一番近い位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
 ,GLength(GeomFromText(CONCAT('LineString(137.111 35.222,', X(latlon), ' ', Y(latlon),')'))) AS len
FROM points
ORDER BY len
LIMIT 0 , 1
GLength関数は、2点間の距離を取得します。

かなり、省略してしまいましたが、こんな感じです。
足りない情報は、追記していきます。では。

2011年5月21日土曜日

Bloggerに「いいねボタン」を記事毎に設置したい

こんばんは。BS事業部隊員です。

今度は、最近当社で使い始めたFacebook。
このブログにも、いいねボタンを設置しました。

※ とりあえず、宣伝。。
当社のFacebookファンページ

ググってみました。

・bloggerでFacebookの「いいね」(Like)ボタンを設置するには


まるコピで、設置完了。

① [デザイン] - [HTML編集]で、「data:post.body/」を検索。

② その下あたりに、以下を追加。

<iframe allowTransparency='true' expr:src='&quot;http://www.facebook.com/plugins/like.php?href=&quot; + data:post.url + &quot;&amp;layout=standard&amp;show_faces=false&amp;width=100&amp;action=like&amp;font=arial&amp;colorscheme=light&quot;' frameborder='0' scrolling='no' style='border:none; overflow:hidden; width:450px; height:40px;'/>


以上で、設置完了です。

いっぱい、押していただけるよう、頑張ります。では。

[ExcelVBA] AdvancedFilterでGroupBy

こんにちは。部隊長です。
おなじみExcelVBAのAdvancedFilterを使って、ExcelのデータをDBのようにGROUP BYしてしまおうというネタです。

メニューから行くとフィルタオプションというのがありますが


これを使います。
一番最初にやるのは、GROUPしたい項目を抜き出すことです。
抽出元のシートから、ヘッダーにする項目をコピーし、抽出先のシートに貼っておきます。
同時に、データの抽出先としても貼りつけておきましょう。
この時に、抽出条件の下に条件を書けば任意のデータを抽出する事ができます。
ここでは鈴木さんの年齢をGROUPしてみます(どんだけ鈴木さんいんだよって話ですが)


抽出条件に="鈴木"と書いているのは、単に「鈴木」と書いた場合部分一致になってしまうからです。
また、部分一致の挙動が2002と2003以降等Excelのバージョンで異なるため、
誤動作を防ぐためには="○○"と書くとよいです。
先頭に=を書くと数式扱いになってしまいますので、セルの書式を文字列にするか、
先頭に「'」を打って文字列にしましょう。


それでは先程のフィルタオプションメニューを開き、
まずは抽出先に「選択した範囲」として、データ元にしたいセル範囲を指定しましょう。


次に先ほど用意した抽出先と出力先をそれぞれ
「検索条件範囲」と「抽出範囲」に指定します。

※抽出条件は、指定するしないに関わらずタイトル行入れて最低2行指定!



設定画面に戻ったら、「重複するレコードは無視する」にチェックを入れます。
じつはコレでGroupできるのです。



準備が終わったらOKを押してみましょう。
うまく抽出されましたか?



で、タイトルにVBAって書いたのに長々と操作の説明になってしまいましたが、
コードはこんな感じです。
データシートのフィルタモード解除、出力先のクリアを追加しています。
GROUPしたい場合、unqにTRUEを指定して下さい。


''' TEST
Private Sub test()

    Dim sh As Worksheet
    Dim db As Range, crt As Range, ext As Range
    
  '' 結果のシート
    Set sh = ThisWorkbook.Worksheets("抽出結果シート")
  '' データ範囲指定
    Set db = ThisWorkbook.Worksheets("データ").Range("A:X")
  '' 抽出条件(タイトル含め条件の行数全部)
    Set crt = sh.Range("A2:B3")
  '' 抽出先(タイトル行のみ指定)
    Set ext = sh.Range("D2:E3")
    
    If doAdvancedFilter(db, crt, ext, True) Then
       '’成功
    End If
    
End Sub

''' AdvancedFilter実行
''' データレンジのシートがフィルタされてたら解除する
''' 抽出レンジのデータは末尾までクリアする
''' 検索レンジが1行の場合エラー
''' 検索レンジは2行以上指定すること
Public Function doAdvancedFilter(ByVal dbRange As Range, _
                            ByVal crtRange As Range, _
                            ByVal extRange As Range, _
                            ByVal unq As Boolean) As Boolean

On Error GoTo Err:
    
    Dim sht As Worksheet
    
    If crtRange.Rows.Count <= 1 Then
        MsgBox "抽出条件が不正です"
        Exit Function
    End If
    
    Set sht = dbRange.Parent
    If sht.FilterMode Then sht.ShowAllData
   
    '' 最大行数
    Dim mxR As Long
    Set sht = crtRange.Parent
    mxR = sht.Rows.Count
    
    '' extRangeクリア
    Dim fCell As Range
    Set fCell = extRange.Range("A1")
    fCell.Offset(1, 0).Resize(fCell.Offset(1, 0).End(xlDown).Row - fCell.Row, extRange.Columns.Count).Clear
   
    '' Filter実行
    dbRange.AdvancedFilter xlFilterCopy, crtRange, extRange, unq
    
    doAdvancedFilter = True
    Exit Function
    
Err:
    MsgBox Err.Description

End Function

抽出条件を色々工夫して大変なデータ処理を楽に済ませちゃいましょう!


Bloggerでソースコードをかっこよく表示したい

はじめまして。ビジネスサービス事業部隊員です。

我が事業部隊長の命を受け、ブログに参戦することになりました。
よろしくお願いします。

あいさつはこのくらいにして、、


このブログのソースコードをきれいに表示しようと、早速ググッてみたところ、

・コードをハイライトする「Blogger Syntax Highlighter」ウィジェット     http://www.kuribo.info/2008/06/blogger-syntax-highlighter.html

Syntax Highlighter」というライブラリを発見。
 ※ ソース→http://code.google.com/p/syntaxhighlighter/

簡単だね。と思われましたが、そうでもなく、、

・Blogger Syntax Highlighter 導入(いろいろトラブった)
    http://micchysdiary.blogspot.com/2011/04/blogger-syntax-highlighter.html

最近の古い(?)ブラウザじゃないと簡単にはいかない模様。

・BloggerにおけるSyntaxHighlighterの使い方
    http://moririn-web.blogspot.com/2010/03/bloggersyntax-hilighter.html

ここの情報が比較的新しいらしいので、ここを参考に実践してみました。

[手順]
① Bloggerの設定から、[デザイン] - [HTMLの編集]で、上記サイトよりコピーしたソースを<head></head>内に追記。保存。


これだけ。簡単でした。

var sample = function(){
alert="Hello!! World!!";
}

が、こんな感じになります。

var sample = function(){
 alert="Hello!! World!!";
}

いいかんじ~

使い方は、

// ここにコードの内容

「*****」は、ここから使いたい言語のBrush aliasesに書き換えればOK!

エディターでソースを書いて、[HTMLの編集]で<pre>~</pre>で囲むだけ。

では。

2011年5月18日水曜日

facebook open graph error. Try again shortly or reload the page -

facebookにFAQを追加しようとFAQアプリを追加。
FAQを、「灰皿なう」に追加してみたのですが、facebook open graph error. Try again shortly or reload the page -なるメッセージが表示され上手く動作していない模様。


その対応策を調べても英語サイトばっかで良くわからん。

そこで試しに「会社のページ(IT-CRAFT)」に追加してみたところ、正しく動作。
この二つのページの違いで影響しそうなところは・・・・

年齢制限。
そこで年齢制限を変えてみた。

この年齢制限を「誰でも」にしてみたら、正常に動作した。


・・・という話です。

2011年5月16日月曜日

Windows2008Server タスク起動備忘録

Windows2008Serverのタスクスケジューラでbat形式のファイルを実行する場合。

プログラム/スクリプト欄にcmd.exeを指定する。
引数の追加欄に/c batファイル名を指定する。

すると、動きます。備忘録的な。

ADODBとASP.net

現在、保守しているシステムでASP.net(Visualstudio2003) + ADODBといった構成のものが有ります。
開発当時は、様々な技術の過渡期であったことからこのような構成になったことが推測されます。

ただ、これまでこの環境下で安定的に運用されていたシステムですが、いきなり不機嫌になり、
「System.NullReferenceException : オブジェクト参照がオブジェクト インスタンスに設定されていません。」
が出現。
ん?

えーーーー!なにこれ!?こんなの初めて出たし、そんなところに変更加えたりしていないんだけど!
データかな?
と思い調査すると、データには問題なし。まぁ、そりゃそうだよね、これまで動いていたんだし。

更に、開発環境では上記事象が発生せず、本番環境のみで発生するという状況。
ソースを比較しても全く同じ。
参照設定等の環境周りについても同じ。

これには参った・・・・
が、これじゃないっすか?「http://support.microsoft.com/kb/810098/ja」なったことありんす。的な助言を受けて、あー、きっとこれだと、これしかない!と。

それで、該当プロジェクトの参照設定を外してロジックを見直してGO!
具体的には adodb.~ を全て削除して、
dim con,rs
con = Server.CreateObject("ADODB.Connection")
rs = Server.CreateObject("ADODB.Recordset")
といった感じに変更。

で、先方のテスト環境へ設置後、動確OK!
本番もOK!
いやぁ、良かった!

SqlServer2005のアンインストール

過程がわからないので、どういう順序でそうなっていたかは不明なのですが、とあるサーバにはSqlServerの2005と2008がセットアップされていました。

ちなみに、OSはWin2008Std。

ただ、2005については正しくインストールされていない可能性があるので、一度、アンインストールして再度、インストールしたいとの事。

まずは2005の削除、ということでアンインストールに臨みます。
しかし、「プログラムと機能」の一覧でSqlServer2005が表示されないので、どうしようかと。
ぐぐったところ、http://support.microsoft.com/kb/909967/ja でやり方が示してあったのでその通りに実行。

  1. SQL Server 2005 のインストール元のメディアを用意します。
  2. サポート ファイルをインストールするには、Servers\setup\sqlsupport.msi ファイルをダブルクリックします。
  3. コマンド プロンプトで、次のコマンドを実行します。
    "%ProgramFiles%\Microsoft SQL Server\90\Setup Bootstrap\ARPWrapper.exe /Remove" #ちなみに僕はSetup Bootstrapに移動して「ARPWrapper.exe /Remove」を実行。
     まぁ、同じことだけどね。

すると、見慣れた画面が表示され、無事、対象のインスタンスのみアンインストールに成功。
ここで失敗すると、また面倒だと思ったのですが素直に削除されてくれてよかった。

で、再度2005を入れて無事、作業完了。

2011年5月10日火曜日

facebookとtwitterを連動させてみた

なるほど、FaceBookってすごいな!
「何が」といわれてもあれだけど。
ちなみに、うちのサービスのFaceBookを登録したのね。「灰皿なう」という喫煙所を検索するサイトなんだけど。
FaceBookにはご存じの通り、ウォールがあるんだけど、こことTwitterを連動できるとの事でやってみた。
まぁ、通常とおり自分のとこに投稿するのは大したことじゃないんだろうけど、ここでのミッションは、あくまでつぶやいた内容が「灰皿なう」としてウォールに投稿することだ。

その方法としては、FaceBookからTwitterを連携するときに、多分、サービスサイトの管理者になっていたらだと思うんだけど、チェックボックス的なものが二つ表示される。

その片方のチェックボックスの傍らにはドロップダウンリストがあって、そこには自分が管理者になっているサイトが一覧されるから、今回対象とした「灰皿なう」を選択したわけ。

説明がわかりにくくて申し訳ないけど、まぁ、そんなわけです。

あまりにわかりにくそうだから、その途中途中の画像を上げてみた。


2011年5月5日木曜日

いまさらですが「いいね!」

会社のサイトに「いいね」ボタンを付けてみました。
なんだか、自分で「いいね!」をクリックするのはちょっと照れ臭いなぁ。

知り合いに、片っ端からクリックしてもらうことにしよう。(笑

「いいね!」ボタンの付け方は簡単。
http://developers.facebook.com/docs/plugins/ のLike Button に移動して、そこにある入力項目(URL to Like )に対象のURLを入れる。
それで、僕はスペース的にこじんまりとさせたかったので、Send Button等は未チェック状態にしてLayout Style はbutton_countをチョイス。

で、「Get Code」をクリックすればコードが表示されるので、上段(iframe)の内容をコピーして、対象となるサイトのお好きなところに埋め込みます。
 
ついでに、会社のFaceBookも作成。