2015.11.19

書き込めんかった......User-Agentにお試しのが残っていた......元のに戻したら、いけた......

他にも変なのあるのかな???0.8.9.4が欠番っぽいので、何かしようとしていたんだろう......

また、今度差分を確認しておこう......

http://uktaniyama.web.fc2.com/tools/2.html

2015-11-19 v0.8.9.5

  • 書き込みのUser-Agentが不正でかけなかったのを修正。

| | コメント (0) | トラックバック (0)

2015.11.18

新しいhtml形式に対応

かんたんにしか確認していないので、解析できないかも。

http://uktaniyama.web.fc2.com/tools/2.html

2015-11-18 v0.8.9.4

  • ・新しいhtml形式に対応。

| | コメント (0) | トラックバック (0)

2015.03.13

いろいろ暫定

ある日突然ってことで、急遽あげてみた。read.cgiでの動作はほとんど確認していないので、読めないところがあるはずです......読めなかった場合はここのコメントにURLを書いといてください。

http://uktaniyama.web.fc2.com/tools/2.html

2015-03-13 v0.8.9.1

  • jbbs.shitaraba.netに対応。
  • ホームページの移転に対応。でも、cgiは動かない......どうしよう。まあいいか。
  • [2ch]mode=cgiでread.cgi経由で読めるようにした。

| | コメント (0) | トラックバック (0)

2015.02.19

つれづれなるままに

ココログにログインできない。
appの方から入れたのでまあいいか。って、IE6だと、ダメってことか。
hpがとんだ。というか、しらっとniftyのプランを下げたら、消えた。どこかにバックアップがあるはずだが見つからない。ftpだけはまだ生きているかな。でも、だいぶたつから無理だろうな。
さて、久しぶりにC++のコードを見た。
ちょっとコーディングしたけど、VisualStudioってもう使いづらい。
eVCでもやらないとだめなのよね。
とりあえず、html->datしたけど、古いロジックなのでいまいち動かない。
jsでエンコードが一部かかる予感だけど、まあ何とかなるだろう。
まあ、そんな感じ。

| | コメント (0) | トラックバック (0)

2013.07.10

[WinRT]続・非同期と排他

ちょこちょことasync/await周りを眺めてみた。やはりロックは別途必要な模様。

ロックがないままのasync/awaitって利用価値ってどのくらい?
そもそも、async/awaitはどうだろう。ちょこちょこっとしたのが非同期になっちゃっているんでやむなくのものかなという気もしつつ。便利は便利かも。
でも、WinRTからC#に入ってくると、ロックの使い方がよくわからない。
・lockステートメント:簡単だけど、awaitが中では使えない。
・Monitor.Enter/Exit:lockステートメントの実体。
書くことはできるけど使えない。
Monitor.Enter(object);
Debug.WriteLine("ENTER");
doSomething();
Debug.WriteLine("EXIT");
Monitor.Exit(object);

としても、ガンガンENTERが被る。たぶん、全部UIスレッド呼び出しだから、再入可能で入ってくるのかなと。

・Mutex・Semaphore・SemaphoreSlim:どれでも使えそう。でも、C#なら、SemaphoreSlimがいいっぽい。
MSDN:Semaphore と SemaphoreSlim参照。 あと、usingを使うと、勝手に解放されてくれるらしいので、その仕組みを使って、ざっくりでっち上げた。

public class AsyncLock
{
    private SemaphoreSlim _semaphore;
    public AsyncLock()
    {
        _semaphore = new SemaphoreSlim(1);
    }
    public AsyncLock(int initialCount)
    {
        _semaphore = new SemaphoreSlim(initialCount);
    }
    public AsyncLock(int initialCount, int maxCount)
    {
        _semaphore = new SemaphoreSlim(initialCount, maxCount);
    }
    public class Locker : IDisposable
    {
        private SemaphoreSlim _semaphore;
        internal Locker(SemaphoreSlim semaphore)
        {
            this._semaphore = semaphore;
        }
        public void Dispose()
        {
            _semaphore.Release();
        }
    }
    public async Task

LockAsync()     {         await _semaphore.WaitAsync();         return new Locker(_semaphore);     } }

無名クラスも作れない模様なので、usingのために、IDisaposableを返すようにして、派生クラスをLockerとして公開したけど、名前は適当。Lockにしてみたけど、Lock lockってのは書けないので、まあいいやと。

AsyncLock lock = new AsyncLock();
async void Foo()
{
    using(AsyncLock.Locker locker = await asyncLock.LockAsync()){
        doSomething();
    }
}

という感じで使う。AsyncLock.Lockerにしているけど、当然IDisposableでも大丈夫。なんとなく雰囲気で。でも、Async並びすぎ。 さて、IDisposableから、delegateを受け付けるようにして、それをラムダ式で渡せるクラスがあれば、いいけど、探すのが面倒なので、この辺にて。

| | コメント (0) | トラックバック (0)

2013.07.09

[WinRT]非同期と排他

よくわからない......async/awaitでなんとなく排他制御はうまくいくようになっている。

async Task Func1Async() {
    Func2();
    await Func3Async();
    Func4();
}

とあったとき、ちゃんとFunc1Async()->Func2()->Func3Async()->Func4()の順番で同じスレッドで呼ばれる。
でも、Func4()は、Func3Async()の後処理として呼ばれる。 これは、Func1Async()の呼び出し側でもawaitしないとダメであることを意味する。

GoodFunction()
{
    await Func1Async();
    Func1After();
}
BadFunction()
{
    Func1Async();
    Func1After();
}

このBadFunction()の例では、Func1Async()->Func2()->Func3Async()で別スレッド処理を呼び出して、その後Func1After()が呼ばれる。その後Func3After()のスレッドが終了後後処理としてFunc4()が呼ばれる。
awaitを使うと関数内の非同期呼び出しをしらっと同期関数っぽく書くことはできるけど、その書いた関数が同期関数になるわけではない。
理解してみると、当然だけど、最初はいまいち納得しなかった.......

さて、そのようにして調子づいて書いていたんだけど、やっぱり排他が必要な目にあった......

ReadDataAsync()
{
   if(completed)  return;①
   using(TextReader reader = await GetReaderAsync()){②
      doSomething();③
      complted = true;④
   }
}

この③・④の処理は、②の後処理スレッドとして実行される。別の呼び出しの、①の判定処理のが先に行われる場合がある。とりあえず、今回は、③の前に、判定をもう一個入れたんだけど、おおむね大丈夫だけど、やっぱり駄目かもしれない。さらに、ReadAsync()とか使うと、まるでうまくいかない.......どうすればいいんだろう.......lock使うと怒られるし......AsyncLockなるソースが落ちていたのでそれを使うのがいいのかな。でも、標準でもっとうまくできるよね......そういうもんなのかな........とはまり中。

そもそも、こんな事態になっていることが間違い???

| | コメント (0) | トラックバック (0)

2013.07.07

[WinRT]LastModifiedをとる。

今までは、Socketを使って自前でやってきたけど、今回はSystem.Net.Http.HttpClientを使っている。

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
HttpResponseMessage response = await httpClient.SendAsync(request,HttpCompletionOption.ResponseHeadersRead);
using (Stream readStream = await response.Content.ReadAsStreamAsync())
using (Stream writeStream = await UK2chUtil.GetStreamForWriteAsync(filename))
{
    await readStream.CopyToAsync(writeStream);
}

こんな感じでやっていて、response.Headersにあるかと思って、調べまくったけど、全然入ってこない.......サーバーからやってきていないかと、あきらめようとしたけど、ふと、MSDNでHttpResourceMessage.Headersの型が、HttpResponseHeadersでその上がHttpHeadersそれを見ると派生クラスが3人いる。

System.Net.Http.Headers::HttpHeaders
    System.Net.Http.Headers::HttpContentHeaders
    System.Net.Http.Headers::HttpRequestHeaders
    System.Net.Http.Headers::HttpResponseHeaders

HttpResponseHeaders・HttpRequestHeadersは応答と要求で残りのHttpContentHeadersはコンテンツ?でresponseからは直接は見れない......さらにさまよって以下のようにとれるようでした。

response.Content.Headers.LastModified

便利なんだろうけど、なかなか情報にたどり着けないので、だんだんとつまらなくなってくる.....

| | コメント (0) | トラックバック (0)

2013.07.01

[WinRT]MessageDialogを表示する

WinRTでは、MessageBoxがない。そのため、Windows.UI.Popups.MessageDialogを表示する。いままでの、「Yes」/「No」を問い合わせるために「UICommand」をわたしたりと大変。

var dialog = new MessageDialog("眠たい?");
dialog.Commands.Add(new UICommand("はい",(command)=>{Debug.WriteLine("眠たいです。");}));
dialog.Commands.Add(new UICommand("いいえ",(command)=>{Debug.WriteLine("眠たくないです。");}));
await dialog.ShowAsync();

ここで、C#では、拡張メソッドというのがあって、クラス自体を拡張できる。そこで、AddCommand(string,int)で受け取るものを考えてあげると、もう少し簡単になるはず。ということで、

public static class MessageDialogExtentions
{
    public const int Yes = 1;
    public const int No = 0;
    public const int Cancel = -1;
    private static int result;
    public static async Task<int> GetAsync(this MessageDialog self)
    {
         result = Cancel;
         await ShowAsync();
         return result;
    }
    public static MessageDialog AddCommand(this MessageDialog self, string label, int no)
    {
        self.Commands.Add(new UICommand(label, (command)=>{ result = no });
        return self;
    }
}

のようなものを考えた。すると、

var ans = await new MessageDialog("眠たい?").AddCommand("はい",Yes).AddCommand("いいえ",No).GetAync();
if(ans==Yes)
{
    Debug.WriteLine("眠たいです。");
}
if(ans==No){
    Debug.WriteLine("眠たくないです。");
}

のようになる。でも、次のことが気になる。

AddCommand("はい",Yes)とかが冗長
AddYes()を追加してあげる。さらに、YesNoだけのメソッドを追加。
static int resultが微妙。
大丈夫だろうけど、残念。

とくに2番目のは気になる......

......

......


そういえば、ShowAsyncって何を返すんだっけ?と調べてみると、押されたボタンのIUICommandを返すらしい。さらに、IUICommandはobject Idも持っている。じゃあ、object Idにintを渡せば解決!

で、結局こんな感じ。

public static class MessageDialogExtentions
{
    public const int Yes = 1;
    public const int No = 0;
    public const int Cancel = -1;
    public static async Task

YesNoAsync(string content)     {         return await new MessageDialog(content).AddYes().AddNo().GetAsync();     }     public static async Task

GetAsync(this MessageDialog self)     {          IUICommand command = await ShowAsync();          return (int)command.Id;     }     public static MessageDialog AddCommand(this MessageDialog self, string label, int no)     {         self.Commands.Add(new UICommand(label) { Id = no });         return self;     }     public static MessageDialog AddYes(this MessageDialog self)     {        return AddYes(self, "はい", Yes);     }     public static MessageDialog AddNo(this MessageDialog self)     {         return AddNo(self, "いいえ", No);     } }

使うときには、

var ans = await new MessageDialogExtentions.YesNoAsync("眠たい?");

こんだけ。
と、使うのは簡単だけど、ここまでやる必要あったのかな??? それに、拡張メソッドを使ったメリットは、特にない気も.....

| | コメント (0) | トラックバック (0)

2013.06.09

Windowsストアアプリの開発

難しい......単純にJSONをいじろうとしてうまくいったけど、コンソールからは動かない......

よくわからない.......
どうやら、ライブラリ?を追加してあげる必要があるらしい。
cscに以下の参照を追加してあげることでWinRTのライブラリが参照できて、JSONも無事使えるようになった模様。
/R:"C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd"
/R:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Runtime.dll"
ということで、プラグインの中のVALUEをJSONで置き換えてみようか。
でも、JSONValueの使うのも割と大変なのよね。

| | コメント (0) | トラックバック (0)

Windowsストアアプリの開発

なぜだかわからないけど、2台体制となって、1台はゲームマシンでもう1台は開発マシンに。Windows8は相変わらずよくわかっていないけど、ゲームマシンとしては楽しい。いろいろなものが遊べる。日本語だけよりも、英語を追加すると相当いろいろなものが増える。今は、Monsters Love Candyにはまり中。

Windowsストアアプリのゲームがいろいろあるんだけど、Freeだけど課金性のがいろいろ混じっているのがちょっと微妙。もう少し区別つけてくれればいいのだけど。

というようにゲームにはまっているのですが、HelixもGETして開発をはじめてみました。とりあえず、2++をポーティングしてみようかと。久しぶりのWindows開発ですが、Eclipseより難しい。慣れの問題もあるけど、補完機能が微妙。それ以上に色遣いがよくわからん!選択したところをコピーしようとメニューをクリックすると選択色が変わる。標準黒色-選択中青(だっけ?)なんだけど、メニューを表示すると黒になる。標準時とは違うっぽいけど、よくわからない。

他にも、知らないことがいっぱいあるので、シックハック中。

| | コメント (0) | トラックバック (0)

より以前の記事一覧