2014年7月28日月曜日
C#応用 – LINQプログラミング 10 (Exercise1)
さて、LINQプログラミングの第10回は
Exercise1 拡張メソッドとラムダ式を
見ていく。
IEnumerableに対しての検索機能とジェネリックコレクションの利用方法を習得する。
まずは、Ex01.slnのソリューションファイルを開くと
ソリューションエクスプローラのProgram.csはこの様になっている。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ex01
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> dicLines = new Dictionary<string, string>();
#region dictionaryの初期化
dicLines.Add("A", "都営浅草線");
dicLines.Add("I", "都営三田線");
dicLines.Add("S", "都営新宿線");
dicLines.Add("E", "都営大江戸線");
dicLines.Add("G", "東京メトロ銀座線");
dicLines.Add("M", "東京メトロ丸ノ内線");
dicLines.Add("m", "東京メトロ丸ノ内線方南町支線");
dicLines.Add("H", "東京メトロ日比谷線");
dicLines.Add("T", "東京メトロ東西線");
dicLines.Add("C", "東京メトロ千代田線");
dicLines.Add("Y", "東京メトロ有楽町線");
dicLines.Add("Z", "東京メトロ半蔵門線");
dicLines.Add("N", "東京メトロ南北線");
dicLines.Add("F", "東京メトロ副都心線");
#endregion
//ここに追加(その2)
foreach (var item in dicLines.MyFindAll("東","ノ"))
{
Console.WriteLine("{0}\t{1}", item.Key, item.Value);
}
Console.WriteLine("Hit any key...");
Console.ReadKey();
}
}
static class MyDicExtention
{
/// <summary>
/// Dictionaryの独自拡張メソッド
/// </summary>
/// <param name="dic">対象となるDictionary(Key=String,Value=String)</param>
/// <param name="containsValue">Valueに含むべき文字列</param>
/// <param name="containsValue2">Valueに含むべき文字列(その2)</param>
/// <returns>絞り込まれた結果の列挙</returns>
public static IEnumerable<KeyValuePair<string, string>> MyFindAll
(
this Dictionary<string, string> dic,
string containsValue,
string containsValue2
)
{
//ここに追加(その1)
return dic.Where(x => x.Value.Contains(containsValue)
&&
x.Value.Contains(containsValue2)
);
}
}
}
自分で追加する部分は、緑のコメントで ここに追加 となっている下の
青文字部分である。
実行結果は次の通り。
単に実行しただけでは、
それが、検索結果だと分かりにくい。
解説
最初に追加した部分(その1)は Dictionary の拡張メソッド「MyFindAll」の実装を
定義している。「MyFindAll」内では Dictionary に対して、引数で与えられた2つの文字列を
Value に含む要素で絞込みを行い、結果を返却している。
次に追加した部分(その2)では、上記 MyFindAll を呼び出して結果を取得し、
Consoleに出力を行う。
参考
その1で追加したソースコードを以下のように変更しても、同じ結果が取得できる。
foreach (var item in dic)
{
if (item.Value.Contains(containsValue) &&
item.Value.Contains(containsValue2))
{
yield return item;
}
}
もちろん、実行結果は同じである。
今日の名言
幸福の秘訣は、自分がやりたいことをするのではなく、自分がやるべきことを
好きになることだ。
ジェイムズ・M・バリー
我々は幸福も不幸も大げさに考えすぎている。自分で考えていることほど
幸福でもないし、かといって決して不幸でもない。
オレン・ド・バルザック
黄金のように貴重な時間の瞬間の機会を大いに利用し、自分の手に届く限りの
良いものをつかみ取ることは、人生における偉大なる芸術行為だと言える。
サミュエル・ジョンソン
環境だけで人間の幸不幸が決まるのではないことは、明らかだ。幸福だとか
不幸だとかいう気持ちの在り方は、こうした環境をどのように受け止めるかに
よって決定される。「天国は心の中にある」とはキリストの言葉だが、
地獄もまた同様である。
デール・カーネギー
2014年7月11日金曜日
C#応用 – LINQプログラミング 9
さて、LINQプログラミングの第9回
今回は、拡張メソッドについてである。
拡張メソッド
既に存在するクラスに機能を付加する。
var query = any.Where(x => myInclude(x)).Select(x => new { StationName = x });
foreach(var item in query)
{
Console.WriteLine(item.StationName);
}
拡張メソッド(1)
既に存在しているクラス(コンパイル済みのものを含む)に対してメソッドの追加が行える機能である。
たとえば、以下のようなものがある。
using System;
namespace MIC
{
public static class StringExtension
{
// stringに対しての拡張メソッドである
public static string AddABC(this string s)
{
return s + "ABC";
}
}
}
拡張メソッド(2)
使用方法は次のようになる。
using MIC; // MICの拡張メソッドを使用するため
中略
string name = "マイクロソフト";
Console.WriteLine("{0}", name.AddABC());
拡張メソッドの記述方法
作成の条件は次の通り。
- staticメソッドである
- staticクラスに記述されている
- 第一パラメータの先頭にthisキーワードが記述されている
- 第一パラメータの型が追加先となる型である
拡張メソッドの特性
拡張メソッドは以下の特徴がある。
- 拡張メソッドの記述先をusingされなければ拡張されない
- 同じ名前の拡張メソッドをもつ
異なる名前空間を使用するのは不可
例:同名の拡張メソッド「Ex」を持つ名前空間「NS1」と「NS2」を同時には使用できない - usingされるとsealedされたクラスも拡張可能
- 元となる型のprivateやprotectedのメンバにはアクセスできない
- 拡張メソッドは元のクラスの振る舞いは変更できない
追加された拡張メソッド
List<T>のメンバを確認した
⇒実はList<T>ではなく、IEnumerable<T>の拡張メソッド
⇒つまり、これらの拡張メソッドは列挙に対して作用する機能
実装はSystem.Linq.Enumerableクラス
ソースコード内の構文で
F1を押すと簡単にWebのマニュアルを
参照できるので非常に便利である。
今日の名言
人間にとって可能なあらゆる真に健康な楽しみを味わうことは、人間が初めて
この世に創造された時以来、可能であったし今でも可能である。そしてこれらの
楽しみが得られるのは主に心が平安である時である。麦が成長するのを見守る、
畑で鋤や鍬をふるって息を切らす、本を読み、考える、愛する、望む、神に祈る
これらはすべて人間を幸福にする事柄である。時折疲れ果てた王や虐げられた
奴隷が、この世の真の王国がどこにあるのかを見出し、庭の畑の一うねに
無限で真の領土を建設することがある。
ジョン・ラスキン
私の言い方は、行く手を遮る不幸に対してことごとく頭を下げろと主張している
ように聞こえるだろうか?断じてそうではない!それでは単なる運命論ではないか。
事態を好転させるチャンスがある限り闘うべきだ!けれども、常識で判断して
もはや万事休すとなれば、「悪あがきをしたり逆転を望んだりしない」ことが
正気の沙汰というものだ。
デール・カーネギー
2014年7月1日火曜日
C#応用 – LINQプログラミング 8
さて、C#応用 LINQプログラミング
第8回である。
今回は、型とプロパティの説明である。
型・プロパティとLINQ
式の中で実行させたい処理を記述する際に必要である。
var query = ary.Where(x => myInclude(x)).Select( x => new { StationName = x } )
foreach(var item in query)
{
Console.WriteLine(item.StationName);
}
var query の部分では型推論(後述)を行っている。
new { StationName = x } は初期化子で匿名型(後述)である。
自動実装プロパティ
private string = _prop1;
public string Prop1
{
get { return _prop1; }
set { _prop1 = value; }
}
上記と同様のことが下記で実現する。
public string Prop1 { get; set; }
また、set のみ private にすることも可能である。
public string Prop1 { get; private set; }
型推論
LINQを実現するにあたり、Saftyな型システムを維持しつつ可読性やコーディングへの
負担を減少させるための仕組みが必要となった。 ちなみに、読み方は 「バル」らしい。
var a = 2; // aはint
var b = "abc"; // bはstring
var c = (int) 1; // cはint
var d = new Hoge(); // dはHogeクラスのインスタンス
使用時の注意点
セットされる値からコンパイラが自動的に型を推論するため、変数への初期化が必須である。
数値や文字はリテラルもしくは書式により判定される。
var キーワードはローカルスコープのみ利用できる。
オブジェクト初期化子
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
var p new Person() { Name = "舞黒 太郎", Age = 20 };
公開されているフィールド・プロパティにコンストラクタを呼び出すことなく
値を割り当てることができる。
ただし、Null許容型(Nullable)には利用できない。
コレクション初期化子
var plist = new List<Person>
{
new Person() { Name = "舞黒 太郎", Age = 30 },
new Person() { Name = "大手 花子", Age = 25 }
};
IEnumerableを実装するコレクションクラスを初期化する際に、
1つ以上の要素を初期化子として指定できる。
Addメソッドを複数回呼び出さなくともコンパイラによって呼び出しが追加される。
匿名型(Anonymous Type)
型推論、オブジェクト初期化子を利用し、型(クラス)を定義しないままの
オブジェクトを生成できる。
var p = new { Name = "舞黒 太郎", Age = 30 };
Console.WriteLine( "{0} 年齢は {1}", p.Name, p.Age);
これらは暗黙的に以下のことを行っている。
▻ 読み出しのみのプロパティとreadonlyのprivateフィールドを持つクラスの
インスタンスを生成(つまり値は初期値から不変となる)
▻ 各プロパティ・フィールドの型はオブジェクト初期化子で初期化される値から推論される。
▻ クラスの定義そのものは公開されないため、匿名となる
▻ プロパティの並び順は厳格に保存される
上記のことから、var キーワードの利用が必須である。
匿名型の内部表現
以下の表現は
var p = new { Name = "舞黒 太郎", Age = 30 };
コンパイラでは近似となる以下のコードに置き換わる。
internal sealed class 匿名クラス<TName, TAge> {
private readonly TName __name;
private readonly TAge __age;
public TName Name { get { return __name; } }
public TAge Age { get { return __age; } }
}
var p = new 匿名クラス<string, int> { Name = "舞黒 太郎", Age = 30 };
ラムダ式(2)
ラムダ式とは式とステートメントを含めることができる匿名関数であり、
デリゲート型または式ツリー型を作成するために使用できる。
・デリゲート
delegate int dd(int i)
dd myFunc = x => x * x; // xがint型であることがコンパイラにより推論されている
int v = myFunc(5);
・式ツリー
Expression<dd> = x => x * x;
今日の名言
賽が投げられた自分の運命に自分自身を適応させよ。運命の女神が、
ともに生きるように定めた仲間を愛せよ。
マルクス・アウレリウス
ほとんどたいていの物事は、何の疑いもなく朗らかに受け入れれば、
様相を新たにする。
ヘンリー・S・ハスキンズ
この世であなたの主な目標は幸福である。幸福は健康とか名声には
左右されない。もっとも健康は幸福に大いに関係があるが、しかし幸福に
なれるかどうかを大きく左右するものがたった一つある。それは物の考え方だ!
自分の欲しいものが手に入らなければ、自分が今持っているものに対して
感謝することだ。些細なものが手に入らないからと愚痴を言わないで、
自分には感謝すべき大きなものがあることを常に考えるべきだ。
デール・カーネギー
真に人間らしい結びつきを得るには、人類が昔からやってきた通りにすれば
よい。神から与えられた我々の境遇、幸運の星のもと、我が祖国に
生まれた幸せを、スポーツマンのような態度で快く受け入れることだ。
ギルバート・キース・チェスタートン
2014年6月26日木曜日
C#応用 – LINQプログラミング 7
さて、C#応用 LINQプログラミング
第7回である。
ウォッチは 変数を選んで
Ctrl + Q
ForEachメソッド
.NET Framework 3.5のコレクションクラスから
ForEachメソッドが追加された。
List<int> l = new List<int>();
l.Add(1);
l.Add(2);
l.Add(3);
l.ForEach((int i) => { Console.WriteLine(i); });
FoaEachメソッドに繰り返しを行いたい処理のdelegateを渡すことができるメソッドである。
自作すると、このような形式である。
public class Range
{
public static ForEach(int from, int to, Action<int> act)
{
for(int i = from; int <= to; i++) act(1);
}
}
// 別メソッド
Range.ForEach(0, 10, (i) => { Console.WriteLine("{0}", i); });
yeildとは?
IEnumeratorを実装するクラスの自動生成を行う。
public class Counter : IEnumerable<int>
{
public int CountStop;
// ジェネリックのIEnumeratorを利用
public IEnumerator<int> GetEnumerator()
{
for (int i = 1; i <= CountStop; i++)
{
yield return i;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
動作としては、処理の中断である。
仮にCountStopに 10 をセットすると、先ほどのクラスは以下と同等である。
public class Counter : IEnumerable
{
public IEnumerator<int> GetEnumerator()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
yield return 6;
yield return 7;
yield return 8;
yield return 9;
yield return 10;
}
}
public class Counter : IEnumerable
{
public IEnumerator<int> GetEnumerator()
{
int i++;
if (i > 5) yield break;
yield return i;
}
}
yield return や yield break と組み合わせることで構文として意味を持つようになる。
今日の名言
人生はまさにブーメランだ。人に与えたものは手元に返ってくる。
デール・カーネギー
誰でも悩みや恐怖やさまざまの病気を追放できる。そして自分の心の
持ち方を変えることにより、人生を一変させることができる。私には
わかっているのだ!なぜなら、そうしたまさかと思われるような変容が
実際に起こるのをこの目で何度も見届けてきたから。あまりにもたくさん
見すぎて、もはや大して驚かないくらいだ。
デール・カーネギー
自分の今行っていること、行ったことを心から楽しめるものは幸福である。
ヨハン・ウォルフガング・フォン・ゲーテ
ありとあらゆるものに心から興味を持ち、自分の道を歩むに従ってどんな時と
機会が手を差し伸べているかをとらえる目を持ち、自分の手を置けるものは
何物も逃さない者、そうした人間は、短い人生のうちに何と多くの素晴らしい
冒険を手に入れることだろうか!
ローレンス・スターン
2014年6月18日水曜日
C#応用 – LINQプログラミング 6
さて、C#応用 LINQプログラミング
第6回である。
応用編なので、まだまだ続くし
内容は濃い。
匿名メソッド
匿名メソッドはメソッドをわざわざ生成せずとも定義可能である。
これにより、イベント定義なども簡単なものであればインラインでできるようになる。
delegate int MyDelegate(int i);
class MyClass
{
public void Run()
{
MyDelegateL a = delegate(int i)
{
i++;
return i;
};
Console.WriteLine(a(10));
}
}
ラムダ式
匿名メソッドでは受け渡しできたものはメソッドへの参照であり、コードの一部ではない。
delegate int MyDelegateL(int i);
class LambdaExpression
{
public void Run()
{
MyDelegateL a = (int i) => // i という引数で扱う
{ // 何か処理を行うのは{}の部分である
i++;
return i;
};
Console.WriteLine(a(10));
}
}
どちらで書いても、11を出力というのは変わらない。
1つだけで実行してるため、何とも味気ない結果である。
外部変数のキャプチャ
ラムダ式が上位スコープの変数を参照しているとき、その変数の寿命を
ラムダ式の寿命が尽きるまで延命する機能である。
delegate void MyDelegate();
MyDelegate GetSayMessageMethod()
{
string msg = "Hello!";
return () => { // 引数がないことを明示している
Console.WriteLine(msg);
};
}
// 別メソッド
MyDelegate say = GetSayMessageMethod();
say();
(参考)定義済みdelegate
・ .NET Framework 3.5からサポートされるようになった
Action
・ 戻り値がvoidのdelegate
・ 引数をジェネリックで0個~4個まで指定できるActionが定義済み
ex) Action<T1, T2, T3, T4>
・ 引数を1つに戻り値がboolのジェネリックなdelegate
Func<TResult>
・ ジェネリックで戻り値と引数を0個から4個まで指定できるdelegate
ex) Func<T1, T2, T3, T4, TResult>
例によって 11 を出力するプログラムではこの様になる。
class LambdaExpression2
{
public void Run()
{
Func<int, int> a = (int i) =>
{
i++;
return i;
};
Console.WriteLine(a(10));
}
}
コードの方に#region という見慣れない
ディレクティブがある。
アウトラインで折りたたみや展開ができる機能らしい。
このように必要に応じて表示・非表示を切り替えたいデモの場合には最適だ。
列挙子とLINQ
取得した結果を簡単に扱うために必要である。
isInclude myInclude = delegate(string param)
{
if (param.StartsWith("新"))
{
return true;
}
else
{
return false;
}
};
var query = ary.Where(x => myInclude(x));
foreach(var item in query) // この部分で使用される
{
Console.WriteLine(item);
}
C# 1.X および.NET Framework 1.X では以下のような列挙をサポートするための
インターフェースが定義されている(変形のIterator)
C# 2.0以降では、ジェネリック版もある。
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
IEnumerable を実装すると
public class Counter : IEnumerable
{
public int CountStop;
public IEnumerator GetEnumerator()
{
return new CounterEnumerator(this);
}
}
そして、IEnumerator を実装すると
public class CounterEnumerator : IEnumerator
{
private int _counter;
private Counter myCounter;
public CounterEnumerator(Counter counter)
{
myCounter = counter;
Reset();
}
public bool MoveNext()
{
_counter++;
return _counter <= myCounter.CountStop;
}
public object Current
{
get { return _counter; }
}
public void Reset()
{
_counter = 0;
}
}
利用するには、ということで
while を使う場合と
foreachを使う二通りが
挙げられている。
実行結果としては、どちらでやっても
1~10までを表示する。
今日の名言
愚か者は幸福がどこか遠いところにあると思い込んでいる。利口者は幸福を
足元に育てる。
ジェイムズ・オッペンハイム
幸運は毎月やってくる。だがこれを迎える準備ができていなければ、ほとんど
見過ごしてしまう。今月こそ幸運を見逃すな。
デール・カーネギー
人を幸福にするものは、どれだけたくさんのものを持っているかということではなく、
手持ちのものをどんなふうに楽しむかということである。
チャールズ・H・スパーション
どんな時でもそうだが、今度も大変よい機会だ、それをどう扱うかさえ知っていれば。
ラルフ・ワルド・エマーソン
人間の幸不幸は運によるところも大きいが、その人の気質によるところも、
これに劣らず大きい。
ラ・ロシュフコー
チャンスが目の前に現れた時にこれをつかむ人間は、十中八九成功する。不慮の
事故を乗り越えて、自力で自分のチャンスをつくり出す人間は、百パーセント
成功する。
デール・カーネギー
2014年6月13日金曜日
C#応用 – LINQプログラミング 5
デモとハンズオンを収めたCDには
デモが4つあった。
実際に見たもの以外もありそうだ。
さて、C#応用 LINQプログラミング第5回である。
今回はLINQ実装からとなる。
LINQ実装
.NET Frameworkに含まれるLINQ実装は次の通り。
・ LINQ to Object
・ LINQ to ADO.NET
> LINQ to SQL
> LINQ to Entities
> LINQ to DataSet
・ LINQ to XML
LINQ to Objectとは?
- オブジェクトのコレクションを操作するものである。
- System.Linq名前空間にある。
- ユーザ作成のオブジェクトだけでなく、多くのオブジェクトに対するクエリが記述できる。
> ディレクトリにあるファイル
> レジストリ
> Process
> ログ
> etc...
LINQ to ADO.NETとは?
・ LINQ to SQL
.NETのカスタム型と物理テーブルのスキーマ間でのマッピングを処理する。
・ LINQ to Entities
LINQ to SQLと酷似しているが、永続化層に直接データベースを利用するのではなく、
概念Entitiy Data Modelを利用し、物理データへの依存しない構造を実現する。
概念Entitiy Data Modelを利用し、物理データへの依存しない構造を実現する。
・ LINQ to SQL
DataSetに対してクエリを行う実装である。
LINQ to XMLとは?
・ XMLデータに対するクエリ、データ操作が可能な実装である。
・従来のXML操作に加え、LINQをサポートする新しいクラスを提供する。
LINQの関連構文についてLINQ to XMLとは?
・ XMLデータに対するクエリ、データ操作が可能な実装である。
・従来のXML操作に加え、LINQをサポートする新しいクラスを提供する。
LINQを扱う上で避けては通れない構文・構造がある
- デリゲート
- 拡張メソッド
- 匿名型・型推論
- オブジェクト初期化式
デリゲートとLINQ
式の中で実行させたい処理を記述する際に必要である。
isInclude myInclude = delegate(string param) // この部分の定義され
{
if (param.StartsWith("新"))
{
return true;
}
else
{
return false;
}
};
var query = ary.Where(x => myInclude(x)); // この部分で使用される
デリゲートとは?
1つもしくは複数のメソッドをカプセル化するクラスで、一般的には関数へのポインタである。
デリゲートは複数の関数のポインタを保持できる。
CD LINQDemo02-03-Delegate
Delegate1x.cs
デリゲートの記述
「new デリゲート名」が暗黙的に変換されるようになり、メソッド名を単純に指定する
だけで同様のことができる。
CD LINQDemo02-03-Delegate
Delegate20.cs
メインはこのように書いてあるので、
static void Main(string[] args)
{
Delegate1x s1 = new Delegate1x();
s1.Run();
Delegate20 s2 = new Delegate20();
s2.Run();
Console.ReadLine();
}
両方あわせて実行すると、11が2回でる。
今日の名言
一つの点で幸福になれなければ、他の点で幸福になればよい。こうした目標転換を
するには処世訓はあまり役に立たない。なぜなら、健康と人柄のよさが一番の問題
だからだ。多くの人間が幸福を追い求めるさまは、まるでうっかり者が帽子を追いかける
ようだ。ちゃんと手にするか頭にかぶっているのに、自分では気づかない。
ウィリアム・シャープ
幸福は物事の味にあって、物事そのものにあるのではない。幸福になるのは、自分の
好きなものを持っているからであり、他人が良いと思うものを持っているからではない。
ラ・ロシュフコー
人間が幸福であるかは、その人の人生に起こる様々の出来事をどういう目で見るか、
ということにかかっており、そうした出来事の性質そのものにはそれほど関係がない
ということを、私はますます信ずるに至った。
ウィリアム・フォン・フンボルト
2014年6月7日土曜日
C#応用 – LINQプログラミング 4
さて、C#応用 – LINQプログラミングの
4回目である。
今回はエンティティ間の関係の
記述の話からである。
エンティティ間の関係の記述例
// リレーショナルモデル
class Customer
{
public string Name;
public string Office;
}
class Order
{
public string CustomerName;
public string ItemName;
public int Qty;
}
// リレーショナルモデル
var result = from c in Customer
join o in Order
on c.Name equals o.CustomerName
select new
{
c.Name,
c.CompanyName,
o.ItemName,
o.Qty
};
class Customer
{
public int ID;
public string CompanyName;
public Order[] Orders;
}
class Order
{
public string ItemName;
public int Qty;
}
// 2関係
Customer[] customers = ・・・;
var results = from c indexer customers
where c.ID == 9
from o in c.Orders
select o;
.NETで利用される言語は手続き型プログラミング言語である。
手続き型プログラミング言語:問題の解法を記述する
宣言型プログラミング言語:問題そのものを表現する
LINQはC#, VB.NETに宣言的なプログラミングを持ち込んだものである。
・ 開発者は必要とする結果を宣言的に記述する
・ 結果を抽出する方法はLINQの実装が考慮すべきこと
従来のプログラミングとの対比
何百社もある、会社名のリストからMicrosoftを抽出したい場合
C#(Not LINQ)
List<string> CompanyNames = …;
List<string> Results = new List<string>();
foreach(string c in CompanyNames)
{
if (c == "Microsoft")
{
Results.Add(c);
}
}
return Results;
C#(LINQ)
List<string> CompanyNames = …;
return from c in CompanyNames
where c == "Microsoft"
select c;
LINQの方がコードが短く、分かりやすく表現されている。
次回、LINQ実装に続く。
今日の名言
満足するための秘訣は、自分の手元にあるものをどうやって楽しめばよいか
知っていること、そして、自分の手の届かないものに対する、ありとあらゆる
欲望を捨て去ることである。
林語堂
自分の目の前にある事実そのものは、それをどんなふうに受けとめ、考えるか
ということにくらべれば、それほど重要ではない。事実に対する考え方によっては、
まだ何も手を打たないうちに、人を敗北させるかもしれない。事実に打ち負かされる
のは、自分が事実に打ち負かされていると考えるからだ。
ノーマン・ヴィンセント・ピール
陽の当たる場所ばかり見ていれば、影は見えません。
ヘレン・ケラー
登録:
コメント (Atom)
















