選挙終わりましたね。下手な事言うと捕まっちゃう(というほどひどいことしなければ問題ないのでしょうけど)期間も終わったし、ちょっと集計して遊んでみましょう。
今回の各党の各地域ごとの得票ちゃんと書いたサイト無かったので
よみうりオンラインより抜き書きしました。中央選管とかにあったのかなぁ。
http://www.yomiuri.co.jp/election/shugiin/2012/kaihyou/yc81.htm
1つ目のテーブル、各党のidと名前
2つめのテーブル各地域のid、名称,議席数
3つめのテーブル各地域における、各党の得票数
4つめのテーブル、ただのカウンター(ドント方式計算のため)CTEでうまく出来るかのテストだったのにうまくいかなかった。
で、以下がソース
declare @党 table
(
id int,
str nvarchar(100)
)
insert into @党 values(1, '民主');
insert into @党 values(2, '自民');
insert into @党 values(3, '未来');
insert into @党 values(4, '公明');
insert into @党 values(5, '維新');
insert into @党 values(6, '共産');
insert into @党 values(7, 'みんな');
insert into @党 values(8, '社民');
insert into @党 values(9, '大地');
insert into @党 values(10, '幸福');
insert into @党 values(11, '改革');
insert into @党 values(12, '国民');
declare @地域 table
(
tiiki int,
str nvarchar(max),
giseki int
)
insert into @地域 values(1, '北海道', 8 )
insert into @地域 values(2, '東北', 14 )
insert into @地域 values(3, '北関東', 20 )
insert into @地域 values(4, '東京', 17 )
insert into @地域 values(5, '南関東', 22)
insert into @地域 values(6, '北陸信越', 11 )
insert into @地域 values(7, '東海', 21 )
insert into @地域 values(8, '近畿', 29 )
insert into @地域 values(9, '中国', 11 )
insert into @地域 values(10, '四国', 6 )
insert into @地域 values(11, '九州', 21 )
Declare @票 table
(
tou int,
tiiki int,
hyou int
)
insert into @票 values(1, 1, 477356) insert into @票 values(2, 1, 692304) insert into @票 values(3, 1, 81838) insert into @票 values(4, 1, 289011) insert into @票 values(5, 1, 333760) insert into @票 values(6, 1, 182968) insert into @票 values(7, 1, 155522) insert into @票 values(8, 1, 48351) insert into @票 values(9, 1, 346848) insert into @票 values(10, 1, 10506) insert into @票 values(11, 1, 0) insert into @票 values(12, 1, 0)
insert into @票 values(1, 2, 805709) insert into @票 values(2, 2, 1238716) insert into @票 values(3, 2, 391216) insert into @票 values(4, 2, 398131) insert into @票 values(5, 2, 725006) insert into @票 values(6, 2, 256838) insert into @票 values(7, 2, 306102) insert into @票 values(8, 2, 160367) insert into @票 values(9, 2, 0) insert into @票 values(10, 2, 14825) insert into @票 values(11, 2, 41587) insert into @票 values(12, 2, 0)
insert into @票 values(1, 3, 976922) insert into @票 values(2, 3, 1820116) insert into @票 values(3, 3, 387625) insert into @票 values(4, 3, 820358) insert into @票 values(5, 3, 1169781) insert into @票 values(6, 3, 367245) insert into @票 values(7, 3, 787462) insert into @票 values(8, 3, 118046) insert into @票 values(9, 3, 0) insert into @票 values(10, 3, 19795) insert into @票 values(11, 3, 0) insert into @票 values(12, 3, 0)
insert into @票 values(1, 4, 1008011) insert into @票 values(2, 4, 1626057) insert into @票 values(3, 4, 448689) insert into @票 values(4, 4, 662743) insert into @票 values(5, 4, 1298309) insert into @票 values(6, 4, 484365) insert into @票 values(7, 4, 762730) insert into @票 values(8, 4, 136889) insert into @票 values(9, 4, 0) insert into @票 values(10, 4, 16620) insert into @票 values(11, 4, 93194) insert into @票 values(12, 4, 0)
insert into @票 values(1, 5, 1323048) insert into @票 values(2, 5, 2020043) insert into @票 values(3, 5, 477309) insert into @票 values(4, 5, 810936) insert into @票 values(5, 5, 1443270) insert into @票 values(6, 5, 447890) insert into @票 values(7, 5, 951294) insert into @票 values(8, 5, 147191) insert into @票 values(9, 5, 0) insert into @票 values(10, 5, 20987) insert into @票 values(11, 5, 0) insert into @票 values(12, 5, 0)
insert into @票 values(1, 6, 682159) insert into @票 values(2, 6, 1162095) insert into @票 values(3, 6, 178403) insert into @票 values(4, 6, 307138) insert into @票 values(5, 6, 707497) insert into @票 values(6, 6, 210219) insert into @票 values(7, 6, 275399) insert into @票 values(8, 6, 128443) insert into @票 values(9, 6, 0) insert into @票 values(10, 6, 15767) insert into @票 values(11, 6, 0) insert into @票 values(12, 6, 0)
insert into @票 values(1, 7, 1321402) insert into @票 values(2, 7, 1966007) insert into @票 values(3, 7, 511048) insert into @票 values(4, 7, 779577) insert into @票 values(5, 7, 1356970) insert into @票 values(6, 7, 387461) insert into @票 values(7, 7, 644087) insert into @票 values(8, 7, 136316) insert into @票 values(9, 7, 0) insert into @票 values(10, 7, 29739) insert into @票 values(11, 7, 0) insert into @票 values(12, 7, 0)
insert into @票 values(1, 8, 1173051) insert into @票 values(2, 8, 2326005) insert into @票 values(3, 8, 481603) insert into @票 values(4, 8, 1234345) insert into @票 values(5, 8, 2999020) insert into @票 values(6, 8, 732976) insert into @票 values(7, 8, 635381) insert into @票 values(8, 8, 133064) insert into @票 values(9, 8, 0) insert into @票 values(10, 8, 33509) insert into @票 values(11, 8, 0) insert into @票 values(12, 8, 0)
insert into @票 values(1, 9, 570764) insert into @票 values(2, 9, 1210400) insert into @票 values(3, 9, 141360) insert into @票 values(4, 9, 493800) insert into @票 values(5, 9, 622226) insert into @票 values(6, 9, 174648) insert into @票 values(7, 9, 209627) insert into @票 values(8, 9, 68653) insert into @票 values(9, 9, 0) insert into @票 values(10, 9, 14383) insert into @票 values(11, 9, 0) insert into @票 values(12, 9, 0)
insert into @票 values(1, 10, 296914) insert into @票 values(2, 10, 567193) insert into @票 values(3, 10, 63830) insert into @票 values(4, 10, 276907) insert into @票 values(5, 10, 394393) insert into @票 values(6, 10, 106976) insert into @票 values(7, 10, 93090) insert into @票 values(8, 10, 42762) insert into @票 values(9, 10, 0) insert into @票 values(10, 10, 8171) insert into @票 values(11, 10, 0) insert into @票 values(12, 10, 0)
insert into @票 values(1, 11, 993317) insert into @票 values(2, 11, 1995521) insert into @票 values(3, 11, 260994) insert into @票 values(4, 11, 1043528) insert into @票 values(5, 11, 1211996) insert into @票 values(6, 11, 337573) insert into @票 values(7, 11, 424892) insert into @票 values(8, 11, 300708) insert into @票 values(9, 11, 0) insert into @票 values(10, 11, 31848) insert into @票 values(11, 11, 0) insert into @票 values(12, 11, 70847)
;
declare @counter table
(
cnt int
)
insert into @counter values(1)
insert into @counter values(2)
insert into @counter values(3)
insert into @counter values(4)
insert into @counter values(5)
insert into @counter values(6)
insert into @counter values(7)
insert into @counter values(8)
insert into @counter values(9)
insert into @counter values(10)
insert into @counter values(11)
insert into @counter values(12)
insert into @counter values(13)
insert into @counter values(14)
insert into @counter values(15)
insert into @counter values(16)
insert into @counter values(17)
insert into @counter values(18)
insert into @counter values(19)
insert into @counter values(20)
;
with カウンタcte(cnt)as
(
select 1
union all
select cnt+1 from カウンタcte
)
select top 10 * from カウンタcte
declare @議席数 table
(
tou int
)
declare @地域議席数 int
declare @地域id int
DECLARE cur CURSOR FOR
SELECT giseki, tiiki FROM @地域
open cur
FETCH NEXT from cur into @地域議席数, @地域id
WHILE @@FETCH_STATUS = 0
BEGIN
insert into @議席数
select top (@地域議席数) tou.id-- tou.str, 党別比例順別得票数.比例票
from ( select hyou.tou, hyou.hyou / カウンタ.cnt as 比例票 from (select * from @票 where tiiki=@地域id) as hyou,@counter as カウンタ ) as 党別比例順別得票数
inner join @党 as tou on tou.id = 党別比例順別得票数.tou
order by 比例票 desc
FETCH NEXT from cur into @地域議席数, @地域id
END
close cur
deallocate cur
select tou, t.str as 党名, カウント
from
(
select tou, count(*)as カウント from @議席数
group by tou
) as 集計
inner join @党 as t on t.id = 集計.tou
--inner join @党 as tou on tou.id = hyou.tou
|
党名 |
カウント |
1 |
民主 |
30 |
2 |
自民 |
57 |
3 |
未来 |
7 |
4 |
公明 |
22 |
5 |
維新 |
40 |
6 |
共産 |
8 |
7 |
みんな |
14 |
8 |
社民 |
1 |
9 |
大地 |
1 |
全国が一区だった場合の計算出している人はちょくちょくいるみたいなので、今の比例代表の仕組みのまま480議席にしてみましょう。
insert into @地域 values(1, '北海道', 21 )
insert into @地域 values(2, '東北', 37 )
insert into @地域 values(3, '北関東', 54 )
insert into @地域 values(4, '東京', 46 )
insert into @地域 values(5, '南関東', 59)
insert into @地域 values(6, '北陸信越', 29 )
insert into @地域 values(7, '東海', 56 )
insert into @地域 values(8, '近畿', 77 )
insert into @地域 values(9, '中国', 29 )
insert into @地域 values(10, '四国', 16 )
insert into @地域 values(11, '九州', 56 )
誤差が出ているところは適当に丸めたので、誤差は気にしないで下さいね。
tou |
党名 |
カウント |
1 |
民主 |
79 |
2 |
自民 |
143 |
3 |
未来 |
23 |
4 |
公明 |
56 |
5 |
維新 |
102 |
6 |
共産 |
27 |
7 |
みんな |
38 |
8 |
社民 |
9 |
9 |
大地 |
3 |
ま、あくまで思考実験なのでこの方が良いとか思っているわけじゃないですよ。
ただこんな割れ方だと政権の行方も大分違うだろうなぁ。
ちなみに全国1区の比例代表の結果とそう違わない値なのが面白くないですね。
http://togetter.com/li/424427
一覧データを作って、そこに画像をはめ込みたい。そんな要望ありますよね。
でも画像はネットの向こう側。できれば非同期で取ってきて取って来られたら画像をはめ込んでいく。みたいな仕組みにしたいですよね。
private BitmapImage _画像;
public BitmapImage 画像{
get {
if (_画像 == null) { 画像取得(); return null; }
else { return _画像;}
}
set { _画像 = value; OnPropertyChanged("画像");}
}
WPFエンジンが画像をバインドに来たときに、初回はnullを返しておいて、非同期に画像取得しに行って、画像が取得されると画像プロパティにsetされるので、再度バインドが取りに来てくれる。こういう目論見です。
画像を取得する実際の処理って言うのは
private Task<BitmapImage> 画像取得Async()
{
return Task.Run(() =>
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(URL);
bi.EndInit();
return bi;
});
}
こういう処理です。
まずはじめに
private async void 画像取得(){画像 = await 画像取得Async(); }
こういう処理を書いてみました。
画像取得が成功して戻ってきたBitmapImageを直接画像に貼り付けるってことですね。
例外発生!
“DependencySource は、DependencyObject と同じ Thread 上で作成する必要があります。"
"Must create DependencySource on same Thread as the DependencyObject."
ここで本当の原因にたどり着けないのが、僕の残念なところですが・・・
エラーが発生したのはOnPropertyChangedの先
場所 System.Windows.DependencyObject.ValidateSources(DependencyObject d, DependencySource[] newSources, Expression expr)
場所 System.Windows.Expression.ChangeSources(DependencyObject d, DependencyProperty dp, DependencySource[] newSources)
場所 System.Windows.Data.BindingExpressionBase.ChangeSources(DependencyObject target, DependencyProperty dp, WeakDependencySource[] newSources)
場所 System.Windows.Data.BindingExpressionBase.ChangeSources(WeakDependencySource[] newSources)
場所 System.Windows.Data.BindingExpression.ChangeWorkerSources(WeakDependencySource[] newWorkerSources, Int32 n)
場所 MS.Internal.Data.ClrBindingWorker.ReplaceDependencySources()
場所 MS.Internal.Data.ClrBindingWorker.NewValueAvailable(Boolean dependencySourcesChanged, Boolean initialValue, Boolean isASubPropertyChange)
場所 MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)
場所 MS.Internal.Data.ClrBindingWorker.OnSourcePropertyChanged(Object o, String propName)
場所 MS.Internal.Data.PropertyPathWorker.OnPropertyChanged(Object sender, PropertyChangedEventArgs e)
場所 System.Windows.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType)
場所 System.ComponentModel.PropertyChangedEventManager.OnPropertyChanged(Object sender, PropertyChangedEventArgs args)
です。
そもそもawaitすれば一度呼び出し元にもどり、非同期処理が完了したらメインスレッド(正確には呼び出し元スレッド)にinvokeされ、後続処理が呼ばれるという認識です。
ですので、
var sync = SynchronizationContext.Current;
var asy = 画像取得Async();
asy.Wait();
sync.Post(o =>
{
画像 = asy.Result;
}, null
);
こんなことすれば、処理が呼び出し元に戻る事も無く、確実にメインスレッドで呼び出されるので大丈夫だろうと思って試してみたところ。
同じ例外発生!!
BitmapImageを非同期の先で作成しているのが悪いんじゃないのか?
private Task<MemoryStream> 画像取得Async2()
{
return Task.Run(() =>
{
var bytes = new WankumaWebClient().DownloadData(URL);
return new MemoryStream(bytes);
});
}
このようなAsyncメソッドにして
var x = await 画像取得Async2();
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = x;
bi.EndInit();
画像 = bi;
このような呼び出しに変えてみたところばっちり動くようになりました。
BitmapImageはWPFのメインスレッドで作成しないといけないのね・・・・今思えば当たり前のことです。
ちなみに
画像 = await 画像取得Async3(new BitmapImage());
こんな感じで、メインスレッドからBitmapImageを供給してやって
bi.BeginInit();
bi.UriSource = new Uri(URL);
bi.EndInit();
こういうロジックを非同期側でやろうとしてもだめでした。
BitmapImageの操作はUIスレッドで!