Hatena::ブログ(Diary)

うなてっくろぐ このページをアンテナに追加 RSSフィード

2012-02-18

ChromeのFlash PlayerがMissing Pluginになる件

またなった。ついこないだまで動いていたので変なのーと思いながらググる

Google Chrome で Missing Plug-in な件 - とあるプログラマの日記

しかし歯が立たず。

というかabout:plugins見たらファイルが三つもあってこれ競合しないのかと。

f:id:unarist:20120218140336p:image:w320

このSSのようにChromeと関係なさそうな一つを残して無効化→プラグイン強制終了→リロードで解決したものの、改めて有効化しても再発しないという・・・

同梱するのはいいんだけどユーザーの管理外にあるというのは不安になるなーと思いました。

2012-02-13

告白は人権侵害?

正直言ってあまり考えもまとまっていないのだけど書いてみる。誰か不快にさせたらごめんなさい。悪意はないのです。訴えないでくれるとうれしい。

1

さっき衝撃的なツイートを見かけた。

こないだとあるTV番組(名前は忘れた)でもちょっとした言葉・言い方でセクハラになり得るという話が出ていて疑問符が浮かんでいたのだけど、このツイートで疑問が爆発した。

2

これまで僕は「好きな人に告白する→付き合う→性交」という流れをイメージしていたから、性交してから告白しろというのはちょっと理解できないのだ。付き合ってもいないのに性交なんてのは極端な言い方をすると、酒に溺れたおっさんや、身体を売ってまで稼ぎたい人のする、とてもはしたない事だと思っていた。

で、性交してから告白?それじゃ俺は一生ぼっちじゃないか。

3

個人的なイメージはともかくとして、セクハラだの人権侵害だのという言い方がどうも好きになれない。いいことだとは思わないし、男だし普通に生活できてるし命の危機に脅かされてないから想像できないだけかもしれない。

こうセクハラセクハラ言われちゃ、じゃあ俺たちはびくびくして日々をすごせってのか。それこそ人権・・・ちょっと落ち着こう。

4

言葉の意味も、それにまつわる問題も、今はググればごろごろでてくるのでここであえて書く気はない。というより、書きかけてなくなった。

Wikipediaだと幸福追求権あたりがそれっぽいかなーと。

他人の幸福を邪魔することに相手から文句を言われるのはいいよ。人権侵害もセクハラも間違っちゃいない。けど、マイナスの付加印象がとても大きい。

「あいつセクハラしたんだろ」

発言ってそんなにリスクが大きいの?この程度の言葉ははねのけるぐらいの心を持たないといけないの?

ごめんなさいして、もうしませんして、それでみんな笑えるといいのにな。

笑えないほどの傷を負わせる能力、それはとっても怖いなあって。

2012-02-09

Entity FrameworkとSQLiteとAUTOINCREMENT

本当はCodeFirstしたかったんだけど難しそうなので後回し。

Entity Data Modelデザイナを使えばおおかた簡単にできます。

AUTOINCREMENTキーワード

主キーには連番を使うことが多いですが、SQLiteにもそれを助ける機能が備わっています。

SQLiteにはAUTOINCREMENTというキーワードがありまして、テーブル作成するとき列にこれを指定しておくと、値を指定せずにレコード挿入することで連番を振ってくれます。仕組みとしてはsqlite_sequenceというテーブルに最後に生成した値が記録されていて、それに+1した値を振っているわけです。

またINTEGER PRIMARY KEYな列は先のキーワードを指定しなくても連番が生成されます。こちらはテーブルに存在する値の最大値+1が使われます。

これまではこの二つを気分で使い分けていたのですが、EntityFrameworkと組み合わせるとなるとそうもいかなかった、というお話。

StoreGeneratedPattern

挿入時に自動生成される列を扱うポイントは二つあります。

  • 既定値をINSERTしない

既定値のつもりでも値を指定したら自動生成はされません。

  • 自動生成された値が必要ならばINSERT後にSELECTする

INSERT文がレコード返してくれたら便利なのにね。

これをEntityFrameworkに教える方法としてStoreGeneratedPattern列挙体が用意されています。

http://msdn.microsoft.com/ja-jp/library/system.data.metadata.edm.storegeneratedpattern.aspx

EDMデザイナにも表示されます。

f:id:unarist:20120209192740p:image

AUTOINCREMENTを付けていればこれをIdentityに設定するだけで上手いことやってくれます。

StoreGeneratedPatternとはなんだったのか

ところがAUTOINCREMENTがない場合はいくらStoreGeneratedPattern.Identityを指定しても

  • 既定値をINSERTしない
  • 自動生成された値が必要ならばINSERT後にSELECTする

といった動作をしてくれません。

edmxファイルを比べるとたった一行の違いでした。

<!--AUTOINCREMENTあり-->
<Property Name="Id" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
<!--AUTOINCREMENTなし-->
<Property Name="Id" Type="integer" Nullable="false" />

AUTOINCREMENTがない時はデザイナで設定したStoreGeneratedPatternがSSDLに反映されていないという・・・

CSDLにもそれっぽい記述があって、こちらはAUTOINCREMENTなしでも反映されるのですが、これだけでは動作しないようです。

<Property Name="Id" Type="Int64" Nullable="false" annotation:StoreGeneratedPattern="Identity" />

というわけでedmxを手動で直せばAUTOINCREMENTなしでも自動生成が使えましたとさ。めでたしめでたし。

2012-01-27

TLBのないコンポーネントvsCOM相互運用

「ねーねーWindowsMediaFormatSDKをC#で使いたいんだけどー」

既に立派なライブラリ*1があるのでこれを使えばいいんだと思います。はい。

ですがせっかくなので練習も兼ねて自分でラップしてみることにしました。

通常タイプライブラリが用意されていればTlbImpを使ったりVSから参照追加できたりと簡単なのですが、このSDKはタイプライブラリがない?のでC++のヘッダファイルを元に自分で書くわけです。

相互運用ことはじめ

インターフェイスに付けるお約束属性。

//属性の型が以前に COM で定義されたことを示します。
[ComImport]
//自動 GUID が望ましくない場合に、明示的な System.Guid を指定します。
[Guid("96406BD8-2B2B-11d3-B36B-00C04F6108FF")]

HRESULTの扱い

おそらくComImportのおかげですが、HRESULTを返す関数はvoidとして書くことで例外に変換してくれます。最後の引数がoutならこんな書き方も。

HRESULT GetOutputFormatCount(DWORD dwOutputNumber, DWORD *pcFormats)
/* ↓ */
void GetOutputFormatCount(uint dwOutputNumber, out uint pcFormats);
/* ↓ */
uint GetOutputFormatCount(uint dwOutputNumber);

COMじゃないけどHRESULTを返すAPIにはPreserveSigをfalseにすることで同様の変換をしてくれます。

[DllImport("WMVCore.dll", PreserveSig = false)]
public extern static IWMReader WMCreateReader(
    IntPtr pUnkReserved,
    WMT_RIGHTS dwRights);
// HRESULT WMCreateReader(... , IWMReader **ppReader)相当

インターフェイスがIUnknownなのかIDispatchなのか

ってのは勝手に判断してくれる or IUnknownが既定値かと思ったら、デュアルが既定値のようです。

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IWMStatusCallback
{
}

付け忘れたら何も言わずに落ちた。

void*の渡し方

なにかしらのポインタ・・・objectのことか!と思って書いたら、呼び出されるときにアクセス違反で殴られました。

かといってIntPtrは扱いにくいのでこんな方法でお茶を濁してみる。

void OnStatus(
    [MarshalAs(UnmanagedType.IUnknown)] object pvContext);

refやoutでもないのに何が違うのかは謎だけど、C#から使う分にはこれでもいけるはず。

インターフェイスの継承(実装ではない)

struct IWMStatusCallback : public IUnknown
{
public:
    HRESULT OnStatus(...) = 0;
}
struct IWMReaderCallback : public IWMStatusCallback
{
public:
    HRESULT OnSample(...) = 0;
}

こんなのをC#で書くと

interface IWMStatusCallback
{
    void OnStatus(...);
}
interface IWMReaderCallback : public IWMStatusCallback
{
    void OnSample(...);
}

こうなりそうなんですが、またもアクセス違反。

で、こう書けばいいらしいんだけど

// 1.継承は残す
interface IWMReaderCallback : public IWMStatusCallback
{
    new void OnStatus(...);
    void OnSample(...);
}
// 2.継承とはなんだったのか
interface IWMReaderCallback
{
    void OnStatus(...);
    void OnSample(...);
}

なんともよくわからない。一応インターフェイスを明示せずに実装していればC#上でも両インターフェイスの実装として扱われるはず。

MSDNに気になる記事はあったものの*2いまいち理解できず。

デバッグ実行なのにデバッガが例外を捕捉できない

コンポーネント側で発生した各種例外はそのままでは捕捉できないらしい。

プロジェクトのプロパティを開いて、デバッグ→アンマネージコードのデバッグを有効にするにチェックすると、VC++のような例外画面が現れるようになる。ただし.NETの例外ポップアップが使えなくなるようなので、落ちなくなったらチェック外した方がよさそう。

to be continued...?

2012-01-26

Googleの新プライバシーポリシーと利用規約を読んでつらつらと

※以下、執筆時に私が確認した内容を元に感想等を述べているだけです。なんら保証しませんあしからず。

これまでは Google 全体で 60 を超えるプライバシー ポリシーがありましたが、今回、これらをより短くて読みやすい 1 つのポリシーに統一することにいたしました。

...

今回の変更は重要ですので、Google の新しいプライバシー ポリシーと利用規約を是非ご確認ください。これらの変更は 2012 年 3 月 1 日より有効となります。

https://www.google.com/intl/ja/policies/

こういうときぐらい読まないとね。そこ、暇人とか言わない。

新しい Google のプライバシー ポリシーと利用規約を読む必要がありますか?

  

もちろん読んでいただく必要があります。法的な文書は、読み物としては味気ないこともありますが、非常に重要なものです。ですから、初めて Google をご利用になる方も、長年ご利用いただいている方も、ぜひ一読して Google の取り組みをご理解ください。あまり時間がない方のために、こちらによくある質問とその答えを掲載しています。

https://www.google.com/intl/ja/policies/faq/

よくある質問の一番目にこんなのを用意してくれてるわけだし。

で、私が気になった部分を抜粋してみました。

続きを読む