スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ニコニコ動画の検索API

  • 2016/03/08 22:46
  • Category: Web
ニコニコ動画における検索APIについてのまとめ的なもの。
現時点で3種類あるようです。


内部で使用している検索API
http://www.trinity-site.net/blog/?p=201
http://qiita.com/sampleb3/items/f75173167e22fbbe4d90
ニコニコ動画で内部的に使用されているAPI。
「ニコニコ動画 検索API」でぐぐるとよく出てきます。
ログインが必要で、パラメータをつけてGETリクエストすればjsonが返ってきます。

例:
http://ext.nicovideo.jp/api/search/search/minecraft?mode=watch&order=d&page=1&sort=n


スナップショット検索API
http://search.nicovideo.jp/docs/api/snapshot.html
2014年10月15日公開。
「ニコニコ動画のコンテンツを解析する目的で検索/取得する際に利用できます」とのこと。AM5:00に更新されるので、実際の検索結果とはほぼ一致しません。
ログインは不要で、以下のようなjsonを http://api.search.nicovideo.jp/api/snapshot/ へ向けてPOSTします。ただ、返ってくるのが4行のjson objectなのでやや扱いにくいです…

{
"query":"minecraft",
"service":[
"video"
],
"search":[
"title",
"description",
"tags"
],
"join":[
"cmsid",
"title",
"view_counter"
],
"filters":[
{
"type": "range",
"field": "view_counter",
"to": 10000
}
],
"from":0,
"size":3,
"sort_by":"view_counter",
"issuer": "your service/application name"
}



コンテンツ検索API
http://ch.nicovideo.jp/nico-lab/blomaga/ar930955
http://search.nicovideo.jp/docs/api/search.html
2015年11月19日公開。
ニコニコの動画や静画、生放送などを横断的に検索するAPIです。2015年のMashup Awards 11向けに提供されたAPIを新しくしたものらしいです。
ログイン不要、GETリクエストすると整形式のjsonが返ってくるので結構使いやすいですね。

動画検索の例:
http://api.search.nicovideo.jp/api/v2/video/contents/search?q=minecraft&targets=title&fields=contentId,title,viewCounter&filters[viewCounter][lte]=10000&_sort=-viewCounter&_offset=0&_limit=3&_context=apiguide
スポンサーサイト

C# Math.Powのパフォーマンスについて

  • 2016/03/02 14:33
  • Category: C#
.NETのMath.Powを使う場合、指数部に整数を指定するのであれば、Math.Powよりもx * xのように演算子を使う方が高速です。


//最適化でコードが削除されないように一部対処してます。

Math.Pow5937ms
x * x * x115ms


50倍も差が出ました。Math.Powではdoubleを指定できるので、汎用的に使える分、処理は遅くなるということでしょうか…
MSDNに書いてある通り、引数がNANやInfであったときに特定の値を返すので、引数の判断にも時間がかかっていそうです。


Reference Sourceでメソッドの実装を見ようとしたところ、
http://referencesource.microsoft.com/#mscorlib/system/math.cs,95354113fadc3083,references
public static extern double Pow(double x, double y);
externが付いていました。もっと低レイヤーで実装されているようです。


さらに調べてみると、Stack Overflowから
http://stackoverflow.com/questions/9652549/self-made-pow-c
http://opensource.apple.com/source/Libm/Libm-315/Source/ARM/powf.c
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
Cでの実装が見つかりました。(といってもAppleのものですが)
軽く読むだけでも、単なる掛け算とは比較にならないほどの処理をしてるのが分かりますね…

C#でオブジェクトを再帰的にダンプする

  • 2016/02/24 02:11
  • Category: C#
個人的に使っていたダンプクラスを手直ししたので、ついでにGitHubに挙げておきました。
https://github.com/KkGh/DebugLib/blob/master/Dumper.cs
DebugLib.Dumperがそのクラスです。
リポジトリには他にもいくつかクラスが入ってますが、特に参照はしていないのでDumper.csだけで利用できます。

ダンプ用メソッドはDump()とDumpToString()の2つです。2つともobjectの拡張メソッドにしているので、instance.Dump()でコンソールへ出力、instance.DumpToString()でstringを返します。
クラスならプロパティを、コレクションなら各要素をリフレクションで再帰的に列挙します。
基本的なフォーマットは「プロパティ名 = 値 (値の型)」ですが、コレクションの要素を列挙する場合には「[インデックス] 値 (値の型)」となります。

サンプル


staticプロパティでインデントサイズや型の表示・非表示などを設定できます。
DateTimeのように、そのままダンプするとやたら長い結果を吐くクラスもあるので、TypesAsStringに型を追加すれば再帰せずToString()の結果だけを出力できるようにしました。


モノによってはかなり冗長な出力になりますが、デバッグ用に作ったものということで…
それと今の処理ではコレクションが持つプロパティ(List<T>.Countなど)を表示できないので、今後色々と変更するかもしれません。

WPFのListBoxをチルトホイールで横スクロールする

  • 2016/02/03 22:35
  • Category: WPF
WPFのListBoxは、マウスのチルトホイールを左右に傾けても横方向にスクロールしてくれません。
MouseWheel、PreviewMouseWheelイベントも回転にしか対応していないようで…


仕方ないので、まずはWndProcをフックして横スクロールイベントを検知します。
http://stackoverflow.com/questions/4158101/how-to-horizontally-scroll-in-wpf-using-mouse-tilt-wheel
チルトホイールを傾けたときのメッセージはWM_MOUSEHWHEEL(0x020E)、wParamの上位16ビット(wParam.ToInt32() >> 16)がスクロールした方向です。
左に倒すと-120、右に倒すと120になります。


次にListBoxをスクロールするために、ListBoxの子要素のScrollViewerを操作します。
ScrollViewer.LineLeftScrollViewer.LineRightで左右にスクロールできます。
傾け続けた場合の挙動は、スクロールバーの端にあるボタンを長押ししたときと同じ(?)ようです。


コード全体は以下のようになりました。前回と同じくBehaviorです。
カーソルがListbox内にあるときだけスクロールするように、MouseEnter、MouseLeaveでフラグ管理して制御してます。
53行目のVisualTreeHelpers.FindVisualChildはググればすぐに出てくる…と思います。



WPFで数字のみ入力可能なTextBox

  • 2016/01/22 01:29
  • Category: WPF
数字のみ入力できるTextBox用ビヘイビアを作ってみました。





半角数字以外の文字入力を禁止するため、以下のような処理をしています。


1.数字以外の半角文字
PreviewTextInputイベントで正規表現にマッチしなければ拒否しています。
ただし半角スペースを入力したときにはPreviewTextInputが発生しないので、代わりにPreviewKeyDownで検知してます。
wpf - Why does PreviewTextInput not handle spaces? - Stack Overflow


2.全角文字
InputMethod.SetIsInputMethodSuspendedでtrueを指定してIMEを無効化すればいいようです。


3.貼り付け
DataObject.AddPastingHandlerで貼り付け時(Pastingイベント)のイベントハンドラを登録、数字以外の文字が含まれているときにキャンセルしています。


4.再変換
https://social.msdn.microsoft.com/Forums/ja-JP/27e12b0d-8ba9-4db6-8b10-28807668af77/textbox?forum=wpfja
>WPFのTextBoxだと、入力済み文字列を選択してスペースを押す事で再変換等もされます。
上でSetIsInputMethodSuspendedを使ってIMEをOFFにしているのでスペースを押したときの再変換はされませんが、TextBoxのコンテキストメニューには再変換候補がしっかり表示されてしまうため.xamlの方でTextBox.ContextMenuを書き換えて対処しています。


普通に使う分にはこれで問題ない・・・と思います。
といってもキーボード以外のデバイス(手書き入力、音声入力、タッチキーボードなど)を使えば数字以外を入力できてしまいます。
一応対処しようとしたのですが、検証中に謎の例外やエラーでクラッシュすることが多々あり、正直諦めました。
(InputMethod.SetIsInputMethodSuspendedでtrueを設定して手書き入力すると落ちる?)


補足
Extended WPF ToolkitのIntegerUpDownはアルファベットも全角文字も入力できますが、フォーカスが外れたときに内容をチェックして、数字以外の文字が含まれていると入力前の値に巻き戻すといった動作をするらしく。
TextBoxでもTextChangedで同様の処理をすれば、手書き入力等に対応できるかもしれません。

Pagination

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。