ページ

2011年10月30日日曜日

◆WPF FirstBinding

[WPF]レイアウトに飽きてきたのでバインディングしてみる

サンプルは基本的に上記サイトからそのまま引用させてもらっている。

<XAML>

<Window x:Class="DockPanel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<Label Content="値:" Grid.Row="0" Grid.Column="0" />
<Label Name="valueLabel" Content="ここに値が来ます" Grid.Row="0" Grid.Column="1" />
<Label Content="概要:" Grid.Row="1" Grid.Column="0" />
<Label Name="descriptionLabel" Content="ここに概要が来ます" Grid.Row="1" Grid.Column="1" />
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" >
<Button Name="incrButton" Content="インクリメント" Margin="2" Click="incrButton_Click" />
<Button Name="decrButton" Content="デクリメント" Margin="2" Click="decrButton_Click" />
<Button Name="dumpButton" Content="Dump" Margin="2" Click="dumpButton_Click" />
</StackPanel>

</Grid>
</Window>

<ソース>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace DockPanel
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
Counter _counter;
BindingExpressionBase _valueBindingExpression;

public MainWindow()
{
InitializeComponent();

//カウンタを作る
_counter = new Counter(){Description="サンプルカウンター"};
InitializeBinding();
}

private void InitializeBinding()
{
Binding valueBinding = new Binding("Value");
_valueBindingExpression = BindingOperations.SetBinding(
valueLabel, Label.ContentProperty, valueBinding);

Binding descriptionBinding = new Binding("Description");
BindingOperations.SetBinding(
descriptionLabel, Label.ContentProperty, descriptionBinding);

// カウンタをDataContextに!
this.DataContext = _counter;
}

class Counter
{
public int Value { get; private set; }
public string Description { get; set; }

public void Incr()
{
Value++;
}
public void Decr()
{
Value--;
}
}

private void incrButton_Click(object sender, RoutedEventArgs e)
{
_counter.Incr();
_valueBindingExpression.UpdateTarget();

}

private void decrButton_Click(object sender, RoutedEventArgs e)
{
_counter.Decr();
_valueBindingExpression.UpdateTarget();

}

private void dumpButton_Click(object sender, RoutedEventArgs e)
{
// カウンタの中身を確認
MessageBox.Show(string.Format("{0}: {1}", _counter.Value, _counter.Description));
}
}
}

バインディングの構文
image


データソースとしてここでは、DataContextに指定したCounterオブジェクトを使用している。
そのDataContextのプロパティ名でBindingオブジェクトを作ってSetBindingするというパターンのようだ。


ソース値の変更を反映するには、値を変更したタイミングでUpdateTargetメソッドを呼んであげる。


Updateを自動的に行うにはデータソースのクラスに
INotifyPropertyChangedインタフェースを実装する。


このインタフェースは以下のイベントの実装を要求する。
event PropertyChangedEventHandler PropertyChanged


イベントを追加したCounterクラスを以下に引用する。

        class Counter:INotifyPropertyChanged
{
private int value;
public int Value
{
get { return value; }
set
{
this.value = value;
OnPropertyChanged("Value");
}
}

private string description;
public string Description
{
get { return description; }
set
{
this.description = value;
OnPropertyChanged("Description");
}
}

public void Incr()
{
Value++;
}
public void Decr()
{
Value--;
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}

プロパティが沢山あったら書くのが面倒くさそう。
ほとんどが定型的な処理なので何かしらVSのサポートがあったもよさそうなものだが・・・。
(WPFが浸透して行かない理由の1ではなかろうか。)


個人的には文字列指定の多用も好きになれない。(リフレクションでゴネゴネするらしいが)

2011年10月26日水曜日

◆WPF パネルを使ってコントロールを幾つか追加する

レイアウトに挑戦

Hello World からもう少し進んでWindowに幾つかコントロールを追加する。
Windowsは子どもがひとつしか持てない仕様になっているので、子どもをたくさん持てるパネルコントロールに纏めて配置してから追加する。

パネルコントロールにはGridやStackPanelなど幾つか用意されている。

// need to add System.Xaml.dll , WindowBase.dll , PresentationCore.dll , PresentationFramework.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows;
using System.Windows.Controls; //PresentationFramework.dll

namespace WPFFirstPanel
{
class Program:Application
{
[STAThread]
static void Main(string[] args)
{
new Program().Run(new FirstPanelWindow());
}

}

class FirstPanelWindow : Window
{
public FirstPanelWindow()
{
InitializeComponent();
}

private void InitializeComponent()
{
this.Title = "FirstPanel";
this.Height = 400; this.Width = 400;
var stPanel = new StackPanel();
var btn1 = new Button() { Width = Double.NaN, Height = 20, Content = "Hrizontal", Margin = new Thickness(5) };
var btn2 = new Button() { Width = Double.NaN, Height = 20, Content = "Virtical", Margin = new Thickness(5) };
var btn3 = new Button() { Width = 200, Height = 20, Content = "btn3", Margin = new Thickness(5) };
btn1.Click += new RoutedEventHandler((o, e) => { stPanel.Orientation = Orientation.Horizontal; });
btn2.Click += new RoutedEventHandler((o, e) => { stPanel.Orientation = Orientation.Vertical; });

stPanel.Children.Add(btn1); stPanel.Children.Add(btn2); stPanel.Children.Add(btn3);
this.AddChild(stPanel);

this.SizeToContent = SizeToContent.WidthAndHeight;
}
}


}

--


<キーワード>
コードでAutoサイズを指定する
画面サイズを中身のサイズに合わせる

2011年10月25日火曜日

◆ページファイルを再作成してシステムを高速化

VS Express(C#)が最近よく落ちる。

障害が発生しているアプリケーション名: vcsexpress.exe、バージョン: 10.0.40219.1、タイム スタンプ: 0x4d5f2a6b
障害が発生しているモジュール名: kernel32.dll、バージョン: 6.1.7601.17651、タイム スタンプ: 0x4e211318
例外コード: 0xc0000005
障害オフセット: 0x0002cf79
障害が発生しているプロセス ID: 0x1708
障害が発生しているアプリケーションの開始時刻: 0x01cc92cfeb77a3e9
障害が発生しているアプリケーション パス: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\vcsexpress.exe
障害が発生しているモジュール パス: C:\Windows\syswow64\kernel32.dll
レポート ID: ce8fde33-fec3-11e0-837b-001d92804a05

調べてみると、DLLとかが実際に壊れているかTEMPフォルダーやページファイルが悪さをしている可能性が高いらしい。

DLLについては先日システムファイルチェッカーを掛けたばかりなので大丈夫だと思う。
となると一時ファイルが怪しげ、ということでTEMPフォルダをクリアした後にページファイルを別ドライブに移してみた。

見事、解決!!

嬉しいことにシステムがかなり高速化した。
体感速度がだいぶ違う。

ページファイルのフラグメントがシステム速度に影響することは知っていたが、固定サイズで設定してあれば大丈夫なのかと思っていた。

固定サイズでも安心できないのね・・・・。

定期的にクリアしよう。(家のマシンも早速やらなきゃ)

◆Hello XAML

xamlで書いてみよう

今度はXAMLで書いてみるパターンだ。

デフォルトのXAMLファイルを以下のように修正した。
・GridをStackPanelに変更
・StackPanelの子どもにボタンを追加
・ボタンのクリックイベントハンドラーにメッセージボックス表示を追加

2011-10-25 14h12_44

2011-10-25 14h13_43

2011-10-25 13h42_39

この程度のXAMLであればHTML的な知識とWindowsフォームの知識でもまだまだついていける。

2011年10月24日月曜日

◆WPFでHelloWorld

WPF入門してみた

なにはなくともHelloWorld。

基本はコンソールアプリからでしょ、って事でコンソールプロジェクトからWPFフォームをXAMLを使わずに表示してみた。

XAMLを使わなければWindowsフォームとイメージ的にそれほどの違いはない。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows; //added
using System.Windows.Controls; /added

namespace HelloWPF
{
class Program:Application
{
[STAThread]
static void Main(string[] args)
{
new Program().Run(new HelloWindow());
}

class HelloWindow : Window
{
public HelloWindow()
{
this.Title = "Hello WPF!!";
this.Width = 400;
this.Height = 300;
var btn = new Button();
btn.Content = "Show Message";
btn.Click += (sender, e) => { MessageBox.Show("Clicked"); };
this.AddChild(btn);
this.Show();
}
}

}
}

コンソールプロジェクトから作ると参照設定が色々足りないが、コンパイラーの仰せのとおり追加していけば問題ない。

◆WPF再入門

数年前、WPFが出始めの時にちょこちょこ触ったのだが、仕事の関係で最近はずっと放置していた。

WPFはWindowsフォーム等と比べると高機能な分、若干難しいため当時は多少使えたのだが今となっては殆ど忘れてしまった。

特に、当時はあまり体系だった説明をした日本語リソースが無かったために、中身を理解せずにサンプルを真似て動いて満足していた。
なので、忘れるのも早かったと反省しもう少し理論的に理解しながら再入門してみようと思う。

幸い、あれからだいぶ時間が経ったために以下のような詳しい解説も出ている。
WPF入門 - @IT
この記事を理解しながら、当時よく参考にしていたかずきのBlogをもう一度なぞっていこうと思う。

WindowsフォームからWPFへの移行はもっと速い速度で行われると思ったのだが、デスクトップアプリケーションの比率が下がり、HTML5の出現でSilverLightの扱いも微妙になったためか思いの外WPFは浸透していないようだ。
ただし、今後WindowsPhoneが普及するとどうなるかわからないし、どちらにしてもWPF自体はWindowsOSの基本テクノロジーに変わりは無いのでどこかでちゃんと勉強しておかないと・・・。

2011年10月20日木曜日

◆Windows Live Meshが同期エラーになる

一昨日くらいから同期エラーになり数分おきにログインダイアログが表示される。(インターネットに繋がらないと文句を言う)

障害が発生しているアプリケーション名: WLSync.exe、バージョン: 15.4.3538.513、タイム スタンプ: 0x4dcdaf2f
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 6.1.7601.17651、タイム スタンプ: 0x4e211319
例外コード: 0x80000003
障害オフセット: 0x0001280c
障害が発生しているプロセス ID: 0xee0
障害が発生しているアプリケーションの開始時刻: 0x01cc8df039102e95
障害が発生しているアプリケーション パス: C:\Program Files (x86)\Windows Live\Mesh\WLSync.exe
障害が発生しているモジュール パス: C:\Windows\syswow64\KERNELBASE.dll
レポート ID: a8eb1943-f9e4-11e0-83ba-001d92804a05

ネットワーク環境自体は全く普通の状態。

まるでウイルスの様に鬱陶しい。(プロセスを見つけてKillするしかなくなる)

別のPCでは同期できているようなので、このPC固有の問題のようだ。

ネットでもあまりそれらしい情報は出ていない・・・。
問題が出たら再インストールって解決策が多いようだ。

仕方が無いので一旦アンインストールして再インストール。
っと思ったが、インストーラが「インターネットに繋がらない」とエラーを吐く。

・・・。

うちの会社のファイアウォールが悪さしている可能性も無いではないが、雰囲気的にはモジュールの不整合が起きてるっぽい・・・。

探してみるとオフライン版のインストーラーが有ったのでこいつをダウンロードしてインストール。

エラーは出なくなった。

2011年10月16日日曜日

◆Windows8に触ってみる

普段、製品前のバージョンに触ってみるといったことはやらない。
人柱になるほどパソコンとか好きなわけではないしそれほどのパワーユーザーでもないので。

ただ、今回事情がありWindows8をインストールしてみた。

インストール環境はVirtualPCにと思ったのだが、現時点でVirtualPCへのインストールはサポートされていないようだ。

となると、素のPCに入れるかVHDブートするかHyper-Vに入れるかVMWareに入れるかといったあたりになる。
VMWareは使ったことがないのでパス。
VHDブートが最適のような気もするが、ブートマネージャは置き換えられてしまいそうに思うのでちょっと躊躇してしまう。
Hyper-Vを使うにはServer環境を作らなければいけないので、これもまた面倒なのだが、やはり昨今何かとHyper-Vが使えると便利なのでひとつ環境を作ることとした。(Windows7とのマルチブート)

これまでインストールしたことのない無線LAN環境へのインストールだったのでネット接続にちょと戸惑った。

まず、そもそもホスト側での無線LAN構築でWLanapi.dllが見つかりませんというエラーが出る。
Serverでは、Windows7でデフォルト有効になっている機能でも無効になっているケースが多いので何か機能が足りないのだろう。
調べてみると「ワイヤレスLANサービス」機能を追加する必要があるらしい。
image

こいつを入れてホスト側はとりあえず解決。

次はゲスト側なのだが、こちらもちょっと設定が必要。
通常は「仮想ネットワークマネージャ」から「外部」ネットワークの追加でホストのNICを指定してあげればよい。
image
image

だが、無線LANの場合は追加するNICの選択肢として表示されてこないのだ。
これも調べてみると、どうも無線LANは直接的にはサポートされていないらしい。
回避策としてはいくつかあるようなのだが、今回はお遊び環境なので一番簡単そうな「ブリッジ接続」にしてみた。
方法はいたって簡単で、先ほどの「仮想ネットワークの作成」で「外部」ではなく「内部」を選択して追加する。
するとホスト側に追加した接続が表示されるので、
image

その追加されたネットワークと無線LANネットワークを同時に選択して右クリックから「ブリッジ接続」を選択してあげればよい。
ゲスト側では、設定画面で追加した「内部」ネットワークを指定しておくだけ。
image

DHCP環境であればこれだけでゲストOSでもホストの無線LANが使えるようなる。
(DHCP環境でなければ適宜IPアドレスの指定も必要なる思われ)

 

これでやっとWindows8に取り掛かれる。

Windows8のHyper-Vへのインストール自体はこれまでと違ったところは特になく、巷で見かける「メトロ」がすぐに表示された。
image

操作は若干癖があり慣れが必要と思われるが個人的には好印象。
すでに解説記事とかもいろいろと出回っているので一度そういった記事を見てから触ってみたほうがよいだろう。

イメージ的にはWindows8 = Windows7 + WindowsPhone
といった感じで、2つの異なるOSを切り替えながら使えるOSになっている。

アプリケーションのプラットフォーム(API)も別々のようなので2つのShellを纏っているというよりは、リソースを共有しながら動く2つのOSと捕らえたほうが理解しやすいような気がする。

両者間の移動は、メトロ側へは「Windows」キーで、旧インタフェース側へは「Windows + D」キーで(すなわちデスクトップの表示)で行える。
(Windowsキーを頻繁に使うことになるので全画面表示で操作するのが吉と思われ)
デスクトップの表示はメトロ画面でタイル表示されている「DESKTOP」をクリックしても表示できる。

旧インタフェース側では「スタートメニュー」が使えないので「Windows + R」で直接アプリケーションを起動するのが良さそうだ。(一度起動してしまえば普段使うものについてはピン止めしておけばよい)

 

WindowsPhoneユーザーに対しては、PCにおいても同じ環境と同じ操作性を提供し、既存のPCユーザーに対しては、これまでどおりの環境を提供しつつ「WindowsPhone」ってこんな感じなんだぁ、というエクスペリエンスを提供する。
その2つを変に融合することなく、シームレスに行き来できる別世界として提供するMSならではのなかなかうまい戦略ではなかろうか。

メトロ側がプライベートユース、旧インタフェース側がビジネスユースと捕らえることもできそうだ。

開発者としても、特に「スマホなんて関係ありません」という人はこれまでとなんら変わらぬ世界で生き続けることができるし、WindowsPhone開発者は普通にWindowsPhoneアプリを作ればそのままでPCでも動いてしまうという一粒で二度おいしい世界が簡単に手に入る。

なんとすばらしい世界なのだろう。
これでMSも安泰だ!!

なんてなるのだろうか(笑)

以上、まったく個人的で無責任な感想です。

2011年10月3日月曜日

◆Bloggerにログインできない

ダッシュボードにはアクセスできている(ログイン状態)のだが、通常のBlogページを表示すると未ログイン状態で表示されてしまう。

なので、そこから編集ボタン等もクリックできない。
ログインをクリックするとダッシュボードに戻ってしまう。

コメントを投稿しようとして「Bloggerアカウント」を選択すると、以下のようなエラーになる。

申し訳ありませんが、リクエストを処理できませんでした。

次のエラーが見つかりました。
Input error: Cookie value is null for FormRestoration

インタフェースが新しくなったあたりから発生している現象のような気がする。

たまたまかと思ったが、複数PCで同じ現象が発生するため調べてみた。
いろいろ操作していると「お使いのブラウザはBloggerでサポートされなくなりました」みたいなメッセージが出て、一瞬Googleも大胆なことをやるもんだと思ってしまった(笑)

どうやら一旦ログアウトしてログインしなおせば解決するようだ。

2011年10月1日土曜日

◆エース内海で相性の良い広島、落とせない一戦

10月1日、広島戦。
先発は内海と大竹。

巨人はエース内海で相性のよい広島戦となれば絶対に落とせない一戦。
1回、スリーボールノーストライクから赤松にまさかのホームラン。
まぁ、これは仕方がない。

3回、巨人は阿部のヒットで同点。
今の巨人の唯一の得点パターンだ。

しかし、大竹はスピードもない、変化球も切れないコントロールも悪いで全く冴えないにも関わらず今日も巨人打線は全く勢いがない。

普通にやれば勝つだろうが、もう少し早めにうち崩して楽な試合にしたいものだ。

7回、鈴木がノーアウト1塁で代走に出てチャンスとおもいきや牽制死。
おもいっきり雰囲気の悪い中で脇谷が粘ってヒット。
藤村が見事にレフトオーバーで同点。(成長したものだ)
長野のセンター前ヒットで藤村が生還して勝ち越し。
タイミングはセーフだったがブロックされて完全なアウトの雰囲気。
審判が藤村の勢いに釣られたか?
まぁ、何にしてもあのヒットでセーフのタイミングで返って来る藤村の足の勝利なのだろう。

あとはいつもどおり広島の中継ぎが崩れて巨人の大勝。
脇谷のタイムリーが光った。

脇谷が活躍してくれれば残りの試合、大きな戦力だが1試合だけで信用はできないだろう。

脇谷や矢野、古木といった準レギュラークラスはなかなか良さそうなのだが坂本の調子が全く上がらないのが巨人にとっては痛い。
長野、阿部といったところは安定してきているので坂本さえ調子を出せばかなりの打線なのだが・・・。

ラミレスあたりもたまにホームランを打ってくれれば良いのだが今年はさっぱり。

残り試合スパートして逆転するような勢いは感じられない。

6-2で巨人の勝ち。

◆相性頼みの広島戦

9月30日、広島戦。
先発は東野と福井。

東野は相変わらず立ち上がりが悪く1点を先制される。
福井は大したことは無いが巨人打線はいつもどおり全く打てず。(ヒットすら出ない)

嫌な流れだったが、野村監督、いつもの焦りが出て福井を5回で交代させてくれる。
まぁ、これで巨人の勝ちはだいたい見えた。

中継ぎが弱い上にサファテまで帰国したとあっては、先発が5回でマウンド降りたらどうにもなるはずがない。
原監督以上にダメダメ采配。
広島の残るコマははっきり言って左バッターに対する青木だけ。
その青木も右には通用しないので当然1回しか投げられない。
とにかくリードさえ許さずに回がすすんで行けばいずれ広島の方で自滅してくれる。

8回、まったく予想したとおりにビッグイニング。
岸本があろうことか先頭の藤村に四球。
どうぞ点をお取りくださいってな感じだ。
長野が繋いで阿部がタイムリーで勝ち越し。
はっきり言ってこれだけでも十分だが、あとは広島がメロメロになり、矢野の満塁ホームランで勝負あった。

点差はついたがどちらのチームもまったく強さは感じさせない。
どちらがより弱いかを競っているような試合。

巨人は坂本が今日もタコタコでなんとも調子がでない。

相性から来る野村監督の焦りで頂いただけの勝利。

矢野のホームランは素晴らしかったが伏兵の活躍だけではあまり喜んでは居られない。

CSまでにいかに主力バッターの調子を整えるか・・・。

亀井あたりも全くダメだしな・・・・。
いっときでも良いから一昨年の亀井に戻ってほしい。

9-2で最終回出て行って1点取られるようではマイケルも頼りにはならんな・・・。

9-3で巨人の勝ち。

◆西村崩れて惨敗

9月29日、横浜戦。
先発は西村と小林。

小林って誰?って感じだが、まぁ球を見ると大したことは無いので良しとしよう。
しかし、これがまた巨人打線、さっぱり打ち崩せない。
たまたま高橋にホームランが出て1点先制したが、それっきり。

そうこうするうちに西村がなぜか連打を浴びて4点を取られてノックアウト。
最近安定していたが、まぁたまにはこんなこともあるだろう。
ピッチャーの弱い横浜相手なのでこういう時こそ打線がカバーする時なのだが、相変わらずコンスタントに打つのは長野だけ。
坂本は毎日毎日タコのオンパレード。

反撃の気配も見せずに惨敗。

この時期にきて最下位チーム相手にこれでは見ている方もしらける。
渡辺オーナーも思わず「自殺する」なんてコメントを出したほどだ。

ただ、今年はどこのチームも打つわけでは無いので贅沢は言っていられない。
なんとか藤村や橋本が塁に出て長野や阿部に繋げたい。

長野にこれ以上望むのも酷なのだが、たまにはホームランも打って欲しい。

2-5で巨人の負け。

◆巨人、辛勝

9月28日、横浜戦。
先発は福田と加賀。

福田は久しぶりの先発。
相変わらずコントロールが悪く四球を連発。
いつまで持つのやらと思っていたが、点を取られそうで取られない。
まっすぐにはある程度力があるが、変化球が全く決まらずに苦しい投球。
低めの変化球を全部見逃されるのは、切れが悪いのフォームに問題があるのか。
どちらにしても苦しいピッチング。
その割に結果として抑えてしまうのは、そこそこの球が行っているのか横浜打線が悪すぎるのか判断に苦しむ。
どちらにしても、中日、ヤクルトあたりのねちっこい打線にはひとたまりもないだろう。

巨人打線も相変わらず。
加賀はそれなりのピッチングはしているが点を取れないほどではない。
長野、阿部がそれなりに活躍しているので1,2番が出ればある程度点を撮れそうなのだが、やはり坂本が悪すぎる。
今年の坂本、全くバッティングの意図が分からない。
初球の好球を見逃して2球目以降の外のボール球に手を出す機会が多すぎる。
なぜ苦手な外の球ばかりに手を出すのか。
しかも狙って思い切り打つのではなくへっぴり腰で手打ち。
技術以前の問題だ。
外角球打ちの練習はシーズンオフにやるとして、今は頭を切り替えてインコースよりの球に絞って対応すべきだ。

運良く抑えてきた福田も7回、伏兵細山田にホームランを打たれる。
こりゃ今日もダメかと思ったが、9回に山口が長野に四球を出してチャンスをくれる。
阿部が繋いで、古木がしぶとく2点タイムリー。
古木は打率は悪いがチャンスに強い。

その裏、久保が危ういピッチングだったがなんとか抑える。

勝つには勝ったがチームとしての強さは全く感じられない試合。

まぁ、良いか・・・・。

2-1で巨人の勝ち。

私が最近チェックした記事