Posts tagged: プログラミング

BF4の各月のプレイ時間取得するスクリプト書いた

このエントリーをはてなブックマークに追加
はてなブックマーク - BF4の各月のプレイ時間取得するスクリプト書いた


いよいよ来月がBattlefield Hardline(BFH)の発売日。
今月くらいはBF4休んでうんぬんかんぬん


EMAIL・PASSWORD・USER_IDに自分の値入れておいて実行するだけ。CSVで出力されるからあとは適当に。
USER_IDはバトルログの自分のステータスページの9桁くらい(適当)の数値。

感覚的に先月やり過ぎたかなって思ってて、
実際に1月が一番プレイ時間長くて草。かなり忙しかったはずなのに。



外資系やらIT系やらの経団連に入っていない企業の本採用がすでに始まってて、1月は面接やらで大分メンタル削られてた。
そのストレスのはけ口としてBF4やってしまった感はある


とりあえずこの時期の就活は一段落で開放感あるけど
2月,3月と論文の締め切りあるゆえん2月は研究に全力出す。

さすがに全くやらないとストレスのはけ口がなくなっちゃうから
2月は28時間以下目標で。

今月はがんばるぞい!なんとしても在学中にもう一度海外行くぞい!



バトルフィールド ハードライン [オンラインコード] [ダウンロード]
エレクトロニック・アーツ (2015-03-19)
売り上げランキング: 231

このエントリーをはてなブックマークに追加
はてなブックマーク - BF4の各月のプレイ時間取得するスクリプト書いた

OpenCVで虹顔の識別(※ただし表情がとぼしくて可愛いおにゃのこに限る)

このエントリーをはてなブックマークに追加
はてなブックマーク - OpenCVで虹顔の識別(※ただし表情がとぼしくて可愛いおにゃのこに限る)

はい、ちょっと***な諸事情で、画像中に全く同じ画像が含まれているかを調べる必要があったのですが、自力ではうまく行かず、
OpenCV使ったら一瞬で出来てしまって不覚にも感動してしまいました。
、という更新。

こんな紛らわしい画像(右側は微妙に口の形が違う)も「違う」と判断してくれてさすがです。

 

、何がしたかったのかというと、虹画像の表情を判断したかったわけで、
さらにその表情ごとの画像は一意に決まってるというまあなんともレアケース。

笑ってるときは画像01、泣いてるときは画像02、みたいに。
表情が乏しいとも言います、はい。

むすっとした顔の穹ちゃんはかわいいけどね!!

、これらの画像から、下のおにゃのこの表情が何なのかを調べてみますと、
    

まあよく分かりませんが「一番左の画像が完全に一致」、と判定してくれるわけです。
OpenCV便利すぎくそわろうた、です。

今回はなんとなくC#でOpenCvSharp使いました。
OpenCv:2.1
.NET:4.0
公式のサンプル引っ張ってきただけです、はい。

要なのはこの2行だけで、

Cv.MatchTemplate(target, template, dst_img, MatchTemplateMethod.CCorrNormed);
Cv.MinMaxLoc(dst_img, out  min_val, out  max_val, out  min_loc, out  max_loc, null);

MatchTemplateで各点の相関係数をdst_imgに、
MinMaxLocで相関係数の最大値と最小値とそれぞれの位置を取得できるみたいです。

相関係数が1に近いほど正の相関があるので1に近ければ近いほど、類似の画像が含まれているということになります。
相関係数が1のときは完全に一致。

似たような画像でも0.998とか高めの値が出たので今回はしきい値を0.999にしました、テキトウw

using System;
using System.Collections.Generic;
using System.Linq;
using OpenCvSharp;
using System.IO;

namespace CVSharpTest
{
    class Program
    {        
        static void Main(string[] args)
        {
            //templateフォルダ以下にテンプレート画像を入れておく。
            IEnumerable<string> tempFiles = Directory.EnumerateFiles("./template","*",SearchOption.TopDirectoryOnly);
            Dictionary<string, double> NCCPair = new Dictionary<string, double>();

            IplImage target = IplImage.FromFile("target.png",LoadMode.Unchanged);            
            IplImage template;
           
            foreach (string file in tempFiles)
            {                
                template = IplImage.FromFile(file, LoadMode.Unchanged);
                double ncc = GetNCCMax(target,template);

                //対象画像からテンプレート画像を検索して表示する
                TemplateMatch(target, template);
               
                NCCPair.Add(file, ncc);
                Console.WriteLine("{0}:{1}", file, ncc);
            }

            //「相関係数の最大値が一番高いもの」が一致画像の可能性が高い
            var result = NCCPair.OrderByDescending((val) => val.Value).First();
            Console.WriteLine("MAX:{0} {1}",result.Key,result.Value);
           
            return;
        }
       
        /// <summary>
        /// 相関係数の最大値を計算する
        /// </summary>
        private static double GetNCCMax(IplImage target, IplImage template)
        {
            IplImage dst_img;                        
            double min_val, max_val;
            CvPoint min_loc, max_loc;
            CvSize dst_size;

            dst_size = new CvSize(target.Width - template.Width + 1, target.Height - template.Height + 1);
            dst_img = Cv.CreateImage(dst_size, BitDepth.F32, 1);
            Cv.MatchTemplate(target, template, dst_img, MatchTemplateMethod.CCorrNormed);
           
            //相関係数の最大値と最小値を取得
            Cv.MinMaxLoc(dst_img, out  min_val, out  max_val, out  min_loc, out  max_loc, null);
           
            Cv.ReleaseImage(dst_img);

            //相関係数の最大値を返す
            return max_val;
        }

        /// <summary>
        /// 対象画像からテンプレート画像の位置を探す
        /// </summary>        
        private static double TemplateMatch(IplImage target, IplImage template, double limen=0.999)
        {
            IplImage dst_img;
            double min_val, max_val;
            CvPoint min_loc, max_loc;
            CvSize dst_size;

            dst_size = new CvSize(target.Width - template.Width + 1, target.Height - template.Height + 1);
            dst_img = Cv.CreateImage(dst_size, BitDepth.F32, 1);
            Cv.MatchTemplate(target, template, dst_img, MatchTemplateMethod.CCorrNormed);

            Cv.MinMaxLoc(dst_img, out  min_val, out  max_val, out  min_loc, out  max_loc, null);

            if (max_val > limen)            
                Cv.Rectangle(target, max_loc,new CvPoint(max_loc.X + template.Width, max_loc.Y +template.Height),new CvScalar(0,0,250),3);                
           
            Cv.NamedWindow("Image", WindowMode.AutoSize);
            Cv.NamedWindow("Image2", WindowMode.AutoSize);
            Cv.ShowImage("Image", target);
            Cv.ShowImage("Image2", template);

            Cv.WaitKey(0);
            Cv.DestroyWindow("Image");
            Cv.DestroyWindow("Image2");  
            Cv.ReleaseImage(dst_img);

            return max_val;
        }
    }
}

今回の本当の目的はちょっとぴーぴーぴーなことなので詳しくはまあアレなのですが、
OpenCVの便利さ、そして手軽さはすごいなあと。

このエントリーをはてなブックマークに追加
はてなブックマーク - OpenCVで虹顔の識別(※ただし表情がとぼしくて可愛いおにゃのこに限る)

Androidアプリ開発をかじってみる

このエントリーをはてなブックマークに追加
はてなブックマーク - Androidアプリ開発をかじってみる

ヨスガノソラがシリアス展開ならぬ欝展開に突入しついに今期最強アニメが決定したわけですが、穹ちゃんかわいい。

ということで、つい先日DesireHDを入手したのにそのまま放置するのもアレなのでちょっとAndroidアプリ開発をかじってみました。

本は金曜日の空き時間にテキトウに見てきた。

初歩からわかるAndroid最新プログラミング
安生 真 柴田 文彦 藤枝 崇史
インプレスジャパン
売り上げランキング: 1233

とりあえずEclipse+Javaなんてろくにやったことなかったし、Androidアプリ作ってみるのも初めて。

が、この本、超絶初心者向けって感じでEclipseのTipsからプロジェクトの作成やらデバッグ方法やらまで載ってていい感じ。

  • GoogleMAP関連
  • タッチイベント
  • OpenGL
  • 加速度センサー
  • BGM等のファイル
を使ったサンプルアプリ&コードが載っててとりあえず最初だけ。

量少なくてサクッと行くと思ったら「原因場所:不明」なる謎のエラーやら画面が下にスクロールできるの気づかなくてプロジェクトが作成できなかったりと
どーでもいいことに迷ってた。

ついでにJavaはやったことがなくて、C#っぽくテキトウに書いてたらエンクロージングインスタンスうんたんのエラーが出てちょっと困った。
クラスの中のクラスのインスタンス作りたいときは外側のクラスのインスタンスもつくらなきゃいけないみたい。

ということで練習かねてしょぼいカレンダーのree2.phpとdb.php使って番組表と番組データ表示するアプリ作ってみた。

 

ブラウザからしょぼいカレンダー見ると、2日分のデータが表示されちゃって、
横幅も狭いからちょっと何やってんのかわかりませんね状態

ブラウザからだと狭い、だからスッキリさせましょう的な。

作ったのは昨日で、昨日はうおおおおおおおおお実機で動いた!ってちょっとわくてかしたけど
改めて今日見ると地味にひどいというね

xmlの取得がメインスレッドで行われてるから取得中は操作不能という
そしてなんか色合いしょぼい
PC版しょぼカレの横幅1日分だけの表示っぽくできればいいんだけどなあ。
あるいはウィジェット的な。

とりあえず本さくっと終わらせてJavaもちょっと勉強してみないと難しそう。
C#の知識だけじゃちょっと細かいところは当然ながら無理なんだなあ。

ちょっと「Java Thread」でぐぐってみたけどThread継承したクラスわざわざつくらないとダメなのかな。

試行錯誤しつつコードかいてて気づいたメモ的な記事書きたいけど実験終わったばっかでなんか時期わるいわろす
とりあえずまたもや現実世界が忙しくなりそう、次に暇になるのは冬休みぐらいかな?

本サクッと終わらせる→@ITやらgihyoやらのチュートリアルやってみる→Javaもちょっとやってみる→本テキトウに買ってみる→今日も穹ちゃんかわいいの流れで行こうそうしよう!

このエントリーをはてなブックマークに追加
はてなブックマーク - Androidアプリ開発をかじってみる

iPodTouch/iPhone上でC言語プログラミング

このエントリーをはてなブックマークに追加
はてなブックマーク - iPodTouch/iPhone上でC言語プログラミング

なんとなくCydiaを眺めていたらGNU C Compilerなるものがあったので試しに入れてみた。
iPodTouch/iPhone単体でコンパイル~実行できるのは魅力的。

けっこう試行錯誤したのでどこで何入れたのかあいまいだけど書いておく。
環境は第1世代iPodTouch OS3.1.2。

依存パッケージのlibgccが無いとGCCをインストールできないみたい。

1.最初にlibgccを以下からダウンロード。(指示通りにUAを変える必要あり。)

  http://ipod-touch-max.ru/cydia/index.php?keyword=libgcc&cat=search#

  ダウンロードした後、MobileTerminal、SPC、iFile等でインストール。

  dpkg –install libgcc_4.2-20080410-1-6_iphoneos-arm.deb

2.Cydiaから「GNU C Compiler」をインストール。インストールにはかなりの時間がかかる。

  

3.Cydiaから「iPhone 2.0 Toolchain」「ldid」をインストール

   

と、ここまでいけばMobileTerminalでGCCと打てば何かしらの反応があるはず。

が、コンパイルしようとすると次のようなエラー発生。

ld: library not found for -lSystem

うーむ、どうしたものか・・・

ということでググるとエラーで困っている同志発見、しかも解決方法まで!
How to Make iPhone apps on any OS, on the iPhone itself, for free

適当に足りなさそうなものを入れてみる。

4.fake-libgccをPCからダウンロード&iPodTouchにインストール

  http://modmyi.com/forums/iphone-ipod-touch-sdk-development-discussion/655111-compiling-iphone-3-0-a.html#post4898409

  dpkg -i fake-libgcc_1.0_iphoneos-arm.deb

5.さらに追加

  http://rapidshare.com/files/66800884/lib.rar(Password :aksblog.co.nr)

  lib.rarなるものをダウンロード。パスワードはaksblog.co.nr。

  解凍した後、以下の3ファイルを/usr/libにコピー。

  • libgcc_s.1
  • libSystem.dylib
  • libSystem.B.dylib

と、いうことで試しにコンパイルしてみる。ldid -S で署名無しでも実行できるようになる。


#include<stdio.h>
int main()
{
    printf("Hello World!");
    return 0;
}




gcc -o test test.c
ldid -S test
./test



 


/private/var/mobile$ gcc -o test test.c
/private/var/mobile$ ldid -S test
/private/var/mobile$ ./test
Hello World!

ということで、iPodTouch/iPhone上でもCの開発環境が作れたみたい!
C初心者の俺が何を作るんだって話だがな!

素数のプログラムも普通に動きます。

そのほか、sys30.gzをダウンロードしてくればUI付きのアプリも出来るみたい。(makefileいじれ)

(HelloWork!(hello world).app source code)

これで寝ながらCの勉強が出来る、授業中でも出来る、いつでもどこでもCプログラミング!

でもそんなことするんだったら寝させていただきますww睡眠不足は健康を激しく害すので気をつけましょう

このエントリーをはてなブックマークに追加
はてなブックマーク - iPodTouch/iPhone上でC言語プログラミング

ubuntu+MonoDevelopで遊んでみた!

このエントリーをはてなブックマークに追加
はてなブックマーク - ubuntu+MonoDevelopで遊んでみた!

生協のPCにはubuntuのブータブルUSBメモリが着いてくるとのことで、なんとなく作ってみた。
案外いいかんじ。新PC来たらHDDにインストールしちゃおうか。



Screenshot-2


Read more »

このエントリーをはてなブックマークに追加
はてなブックマーク - ubuntu+MonoDevelopで遊んでみた!

C#で2chのスレッドdat取得(差分も)

このエントリーをはてなブックマークに追加
はてなブックマーク - C#で2chのスレッドdat取得(差分も)

C#で2chのSubject.txt取得に続いて、今回は個々のスレッドのdat取得。

前回とほとんど変わらないが差分の取得やらdat落ち判定やらで僅かに長くなった。

datファイルはhttp://サーバ/板名/dat/スレッド番号.datにある。

(例)http://yutori7.2ch.net/news4vip/dat/1269850034.dat

初回dat取得時に応答ヘッダのLast-Modified(更新時刻)とRange(ファイルサイズ)を取得、次回それを付加して差分のみ取得。


※わざわざ差分取得せず毎回全部取得も出来る。


Read more »

このエントリーをはてなブックマークに追加
はてなブックマーク - C#で2chのスレッドdat取得(差分も)

C#で2chのSubject.txt取得

このエントリーをはてなブックマークに追加
はてなブックマーク - C#で2chのSubject.txt取得

botにも使っていたのだがこの際整理。

スレタイ一覧(subject.txt)はhttp://サーバ/板名/subject.txtにある。
(例)http://yutori7.2ch.net/news4vip/subject.txt


というわけでコード。

public string GetSubjects(string URL)
{
    //正規表現でサーバーと板の名前取得
    Match m = Regex.Match(URL, @"http://(.*?\.2ch\.net)/(news4vip)/");
    string server = m.Groups[1].Value;
    string board = m.Groups[2].Value;


    //リクエスト作成
    Encoding enc = Encoding.GetEncoding(932);
    HttpWebRequest req = null;
    try
    {
        req = (HttpWebRequest)WebRequest.Create(string.Format("http://{0}/{1}/subject.txt", server, board));
    }
    catch
    {
        return null;
    }

    // ポストデータ作成
    req.Method = "GET";
    req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6 (.NET CLR 3.5.30729)";
    req.Referer = string.Format("http://{0}/{1}/", server, board);
    req.Accept = "gzip";
    req.Timeout = 20000;


    //レスポンス取得、読み込み
    string dat = null;
    try
    {
        WebResponse res = req.GetResponse();
        Stream resStream = res.GetResponseStream();
        StreamReader sr = new StreamReader(resStream, enc);
        dat = sr.ReadToEnd();
        sr.Close();
        resStream.Close();
    }
    catch
    {
        return null;
    }
           
    //dat本文を返す
    return dat;
}

簡単にスレッド一覧が取得できる。

GetSubjects("http://yutori7.2ch.net/news4vip/")

などとすれば

1269606079.dat<>【来たれ声優】声劇つくっちゃおうぜ!【立てよ企画】 (171)
1269760693.dat<>好きな娘に一人でパフェ食ってるところ見られたwwwwwwwww (162)



UNIX時間.dat<>スレタイ(レス数)\n

と返ってくる。


参考:と~く2ちゃんねる

このエントリーをはてなブックマークに追加
はてなブックマーク - C#で2chのSubject.txt取得

会話は難しい。

このエントリーをはてなブックマークに追加
はてなブックマーク - 会話は難しい。

無能BOTに関連検索ワードWeb APIを用いてリプライに対応させることにした。
リプライ飛んで着たらテキトーに関連語探してマルコフ+DBで。


まだまだ実装したばっかりで適当。
もっとしっかり構想を練らなければ。

とりあえず適当に質問やら会話文やらを入力してみた。


最近アニメ見てる?


最近ソング見てるんですから……!いや、どうしましたよ!!
最近無料見てる方が偉いんだろ!!ヒーロー気取りかぁ?

許容範囲内。

カーディガンズってそんなに昔なの?

カーディガンズってそんなに酷いかな?

質問返しw

あれ見てたんだw


ごめんね、ごめんね…姉さん…良い?

姉さんじゃねえ!!!しかも何かえろいぞ!!!

テストは嫌いだな

センターは…知ってるの?
テストは沢尻エリカきらいだな、これで……ダメですね

テストは沢尻知りません><そもそもテストは生き物じゃありません><

まーそれでもなかなかいい感じだ。



問題は処理時間。
毎回毎回関連検索API使ってるから、10件もリプライ飛んでこようものならだいぶ時間がかかるだろう。


ここは関連語もDBに入れるか・・・?




まあまだ許容範囲内の速度だ。とりあえずこれでうpしてみるか。
単語1文字でリプライされると仕様上うまくマルコフ連鎖できない。

1文字で来たら・・・検索APIでその語句を含む適当な文章取得してそれマルコフ用テーブルにぶち込んで新たな文章生成するか。





とりあえず今日は引きこもった。部屋から出たのは食事と風呂くらい。
TVも見なかった。まあ母親も仕事でいなかったし。


C#の教本半分ほど終わった。
前半は簡単だったからサクサク、結局BOT作って遊んだ。


カバンはTHE NORTH FACEのやつ通販で頼もう。
明日は余裕があったら立川いって靴と洋服見てこよう。


ついでにC#の基礎固めも。今月中にC#終わらせてC++の基礎くらいは出来るようにしたい。
ああそうだあとDuoかってTOEICに備えよう。

このエントリーをはてなブックマークに追加
はてなブックマーク - 会話は難しい。

無能風BOT完成

このエントリーをはてなブックマークに追加
はてなブックマーク - 無能風BOT完成

ひとまず完成。
主にMeCab+Yahoo形態素分析API+SQLiteを利用した。



MeCabの辞書にwikipediaのタイトルとHatenaKeyWordを追加、んで2chのSSスレから会話分6万行ほど抜き出してそれをMeCabで分かち書き、マルコフ連鎖用テーブル作ってDBにぶち込んだ。

で、あとはTLからpostを取得、その文章とDBを元にマルコフ連鎖で新たな文章を生成、post。

 


近々このブログを知り合い等に公開する(・・・のだろうか)ことも考えてIDは乗せないことにしよう。


しかし全く新しい文章が出来たときのwktkは半端じゃないな


反捕鯨団体シー・シェパードの元船長、ピーター・ベスーン容疑者(44)が、調査捕鯨船団の監視船「第2昭南丸」に侵入した事件で、海上保安庁は14日午前、ベスーン容疑者を艦船侵入容疑で東京地検に送検した。ベスーン容疑者の身柄は同日中に、東京・葛飾区の東京拘置所に移される。


反捕鯨団体シー・シェパードの元メイドに会うとそんなに嫌そうなのか…ま、まあいいや、やっぱり地の文のやりとりの中に出して食べてみます

いまどうしてる?

いまどうした所で何がなんだかわからねぇが敵の隙に小用を済まそうと思っているだけで完全に私を笑わせてあげるよね、その………

2chのSSスレから会話分6万行ほど抜き出してそれをMeCabで分かち書き

2chのアニメキャラ板のビリビリスレ、mixiのビリビリコミュ、その他ビリビリ関係の無い人を好きになってますぅ!!

結局のところ最初の2単語しか利用してない。
若干、というかしばしば電波的な内容になるゆえBOTだと疑う人も多いだろう。



意味不明な文章をできるだけ減らす方向で行くか、それとも電波多めを目指すか。
今後の方向性を定めなければ。



できるだけ減らすなら・・・やはり”学習”させることが必要だな
「不適切な文章を報告」みたいに、1文ずつこれはいい、これはだめって評価して、単語のつながりの”正しさ”をパラメータ化しようか。

いずれにしてもDB再再再再構築だけはゴメンだ。方向性と仕様を定めよう。


 


今後の目標


  • まともな文章を出力するようにする

このエントリーをはてなブックマークに追加
はてなブックマーク - 無能風BOT完成

C#でTwitterAPI使って(417) Expectation Failed

このエントリーをはてなブックマークに追加
はてなブックマーク - C#でTwitterAPI使って(417) Expectation Failed

人工無能風twitterBOTも完成、さてさて試しに動かすか、というところで地震。

ついでにTL遅延。

APIからは正常に取得できてるのか・・・な?

で、テスト稼動したところ、


リモート サーバーがエラーを返しました: (417) Expectation Failed


そういえば前回もこんなことがあったがすっかり忘れていた。

100-Continue 応答?なるものがあるらしく、.NETからtwitterにPostするときは


System.Net.ServicePointManager.Expect100Continue = false;

とすれば問題ない。

このエントリーをはてなブックマークに追加
はてなブックマーク - C#でTwitterAPI使って(417) Expectation Failed

Dansette