2011年10月31日月曜日

ノートPC || タブレット

ノート PC またはタブレットを買おうか迷い中。
携帯はガラケーで、モバイル系一切持ってないので、何かしら欲しいかなと。
携帯で Web を見ることもなく、まったく不便を感じてないんでいらないっちゃいらないんだが・・・

勉強会とか参加したことないので、ちょっと参加してみたいなと。
で参加するならタブレットかノート PC かなと。
開発環境入れれるノート PC のほうが良さげだが。
通信に、WiMAX なりイーモバイルなりが必要になるけど。

ノートならMac Book Air サイズのやつがいい。持ち運びは軽いほうがいい。
ただ、慣れないだけかもしれないがあまり Mac が好きになれない。

11/3 に発売する、ASUS ZENBOOK が結構よさげ。
ディスプレイは、13.3 型がいいかな。ディスクは 128GB で十分な気がする。
なので UX31E-RY128

キーボードが日本語なのが問題だが・・・
売ることがあるとすれば日本語キーボードのほうがいいな。
まぁのどかとかでキーバインド変えちゃうのもありか。
のどかのライセンスも持ってないわけだが。

とりあえず実物触ってから考えよう。

ここまで迷ってると何かしら買うんだろうな・・・

2011年10月28日金曜日

オーバーライド時のアクセス修飾子変更 C++ 編

PHP 編Java 編C# 編に続き、 C++ でも検証。C++ は好きだがこれも慣れていないため、怪しいかも・・・

まず、親クラス。
class ParentClass
{
private:
  virtual void func1() { std::cout << "Parent private func1" << std::endl; }
protected:
  virtual void func2() { std::cout << "Parent protected func2" << std::endl; }
public:
  virtual void func3() { std::cout << "Parent public func3" << std::endl; }
 
public:
  virtual ~ParentClass() {}
  virtual void call()
  {
    func1();
    func2();
    func3();
  }
};
private, protected, public の 3 種類のメソッドと、それらを呼び出すメソッドを作成。

子クラス1 は public に変更。
class Child1Class : public ParentClass
{
public:
  virtual void func1() { std::cout << "Child1 private -> public func1" << std::endl; }
  virtual void func2() { std::cout << "Child1 protected -> public func2" << std::endl; }
  virtual void func3() { std::cout << "Child1 public func3" << std::endl; }
  virtual ~Child1Class() {}
};
シンタックスエラーは起きない。

子クラス2 は protected に変更。
class Child2Class : public ParentClass
{
protected:
  virtual void func1() { std::cout << "Child2 private -> protected func1" << std::endl; }
  virtual void func2() { std::cout << "Child2 protected func2" << std::endl; }
  virtual void func3() { std::cout << "Child2 protected -> protected func3" << std::endl; }
public:
  virtual ~Child2Class() {}
};
これもシンタックスエラーは起きない。

子クラス3 は private に変更。
class Child3Class : public ParentClass
{
private:
  virtual void func1() { std::cout << "Child3 private func1" << std::endl; }
  virtual void func2() { std::cout << "Child3 protected -> private func2" << std::endl; }
  virtual void func3() { std::cout << "Child3 public -> private func3" << std::endl; }
public:
  virtual ~Child3Class() {}
};
これもシンタックスエラーは起きない。

実行してみると、
ParentClass* p = new ParentClass();
p->call();
std::cout << "----------" << std::endl;
delete p;

Child1Class* c1 = new Child1Class();
c1->call();
std::cout << "----------" << std::endl;
delete c1;

Child2Class* c2 = new Child2Class();
c2->call();
std::cout << "----------" << std::endl;
delete c2;

Child3Class* c3 = new Child3Class();
c3->call();
delete c3;
結果は、
Parent private func1
Parent protected func2
Parent public func3
----------
Child1 private -> public func1
Child1 protected -> public func2
Child1 public func3
----------
Child2 private -> protected func1
Child2 protected func2
Child2 protected -> protected func3
----------
Child3 private func1
Child3 protected -> private func2
Child3 public -> private func3

全てのパターンで特に制限なく変更出来ている。
Java とかと逆の制限があったような気がするが、気のせいだったか。

何か間違っている可能性も・・・

Cygwin g++ (GCC) 4.5.3
Visual C++ 2010
でコンパイル。 いくつかの言語で試してみたものの、結果まぁ言語仕様書を読めよということで。

2011年10月24日月曜日

オーバーライド時のアクセス修飾子変更 C# 編

PHP 編Java 編に続き、 C# でも検証。C# は慣れていないため、怪しいかも・・・

まず、親クラス。
class ParentClass
{
  // 仮想または抽象メンバーには、private を指定できません。
  private /* virtual */ void func1() { Console.WriteLine("Parent private func1"); }
  protected virtual void func2() { Console.WriteLine("Parent protected func2"); }
  public virtual void func3() { Console.WriteLine("Parent public func3"); }

  public virtual void call()
  {
    this.func1();
    this.func2();
    this.func3();
  }
}

private, protected, public の 3 種類のメソッドと、それらを呼び出すメソッドを作成。
他と違い、この時点でエラーが発生。仮想関数を private にできないらしい。

子クラス1 は public に変更。
class Child1Class : ParentClass
{
  // オーバーライドする適切なメソッドが見つかりませんでした。
  public /* override */ void func1() { Console.WriteLine("Child1 private -> public func1"); }
  // 'protected' 継承メンバー 'ConsoleApplication1.ParentClass.func2()' をオーバーライドするときに、アクセス修飾子を変更できません。
  public /* override */ new void func2() { Console.WriteLine("Child1 protected -> public func2"); }
  public override void func3() { Console.WriteLine("Child1 public func3"); }
}

func1 は親クラスを virtual 宣言していないためオーバーライド出来ず、コンパイルエラーとなる。
func2 はアクセス修飾子が変更できない旨のエラーがでる。PHP や Java と違い緩い方向にも変更できない。
func1, func2 共に override を外すと、コンパイルは通る。
func2 は override を外しただけでは、override か new を付けろと警告が出る。

子クラス2 は protected に変更。
class Child2Class : ParentClass
{
  // オーバーライドする適切なメソッドが見つかりませんでした。
  protected /* override */ void func1() { Console.WriteLine("Child2 private -> protected func1"); }
  protected override void func2() { Console.WriteLine("Child2 protected func2"); }
  // 'public' 継承メンバー 'ConsoleApplication1.ParentClass.func3()' をオーバーライドするときに、アクセス修飾子を変更できません。
  protected /* override */ new void func3() { Console.WriteLine("Child2 public -> protected func3"); }
}

func1 は同じようにエラー。
func3 はアクセス修飾子の変更によるエラー。

子クラス3 は private に変更。
class Child3Class : ParentClass
{
  // 仮想または抽象メンバーには、private を指定できません。
  private /* override */ void func1() { Console.WriteLine("Child3 private func1"); }
  // 仮想または抽象メンバーには、private を指定できません。
  private /* override */ new void func2() { Console.WriteLine("Child3 protected -> private func2"); }
  // 仮想または抽象メンバーには、private を指定できません。
  private /* override */ new void func3() { Console.WriteLine("Child3 public -> private func3"); }
}

func1 は同じようにエラー。
func2, func3 もアクセス修飾子によるエラーとなる。

実行してみると、
ParentClass p = new ParentClass();
p.call();
Console.WriteLine("----------");
Child1Class c1 = new Child1Class();
c1.call();
Console.WriteLine("----------");
Child2Class c2 = new Child2Class();
c2.call();
Console.WriteLine("----------");
Child3Class c3 = new Child3Class();
c3.call();

結果は、
Parent private func1
Parent protected func2
Parent public func3
----------
Parent private func1
Parent protected func2
Child1 public func3
----------
Parent private func1
Child2 protected func2
Parent public func3
----------
Parent private func1
Parent protected func2
Parent public func3

ほとんどオーバーライド出来ないため、PHP や Java とは異なる結果になった。

private, public -> protected -> private 方向は勿論、protected -> public の変更もできないようだ。

2011年10月23日日曜日

オーバーライド時のアクセス修飾子変更 Java 編

PHP 編 に続き、今度は Java で検証。

まず、親クラス。
class ParentClass
{
  private void func1() { System.out.println("Parent private func1"); }
  protected void func2() { System.out.println("Parent protected func2"); }
  public void func3() { System.out.println("Parent public func3"); }

  public void call()
  {
    this.func1();
    this.func2();
    this.func3();
  }
}
private, protected, public の 3 種類のメソッドと、それらを呼び出すメソッドを作成。

子クラス1 は public に変更。
class Child1Class extends ParentClass
{
  // メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
  // @Override
  public void func1() { System.out.println("Child1 private -> public func1"); }
  @Override
  public void func2() { System.out.println("Child1 protected -> public func2"); }
  @Override
  public void func3() { System.out.println("Child1 public func3"); }
}
func1 は private メソッドをオーバーライド出来ないため、コンパイルエラーとなる。
@Override アノテーションを外すと、コンパイルは通る。

子クラス2 は protected に変更。
class Child2Class extends ParentClass
{
  // メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
  // @Override
  protected void func1() { System.out.println("Child2 private -> protected func1"); }
  @Override
  protected void func2() { System.out.println("Child2 protected func2"); }
  // Child2Class の func3() は ParentClass の func3() をオーバーライドできません。スーパークラスでの定義(public) より弱いアクセス特権を割り当てようとしました。
  // @Override
  // protected void func3() { System.out.println("Child2 public -> protected func3"); }
}
func1 は同じようにエラー。
func3 は PHP と同じように、public -> private への変更でエラーとなる。func1 とは異なり、アノテーションを外しただけではエラー。定義自体を削除。

子クラス3 は private に変更。
aclass Child3Class extends ParentClass
{
  // メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
  // @Override
  private void func1() { System.out.println("Child3 private func1"); }
  // Child3Class の func2() は ParentClass の func2() をオーバーライドできません。スーパークラスでの定義(protected) より弱いアクセス特権を割り当てようとしました。
  // @Override
  // private void func2() { System.out.println("Child3 protected -> private func2"); }
  // Child3Class の func3() は ParentClass の func3() をオーバーライドできません。スーパークラスでの定義(public) より弱いアクセス特権を割り当てようとしました。
  // @Override
  // private void func3() { System.out.println("Child3 public -> private func3"); }
}

func1 は同じようにエラー。
func2, func3 でエラーとなる。やはり、厳しい方向への変更はできないようだ。

実行してみると、
ParentClass p = new ParentClass();
p.call();
System.out.println("----------");
Child1Class c1 = new Child1Class();
c1.call();
System.out.println("----------");
Child2Class c2 = new Child2Class();
c2.call();
System.out.println("----------");
Child3Class c3 = new Child3Class();
c3.call();

結果は、
Parent private func1
Parent protected func2
Parent public func3
----------
Parent private func1
Child1 protected -> public func2
Child1 public func3
----------
Parent private func1
Child2 protected func2
Parent public func3
----------
Parent private func1
Parent protected func2
Parent public func3

エラー部分を削除したソース、結果共に、PHP と同じようになった。

protected -> public への変更はできるが、public -> protected -> private への変更はできない。
private はオーバーライドできない。

余談だが、コンパイルエラーとなるのはやはりいい。

2011年10月21日金曜日

オーバーライド時のアクセス修飾子変更 PHP 編

オーバーライド時にアクセス修飾子の変更を検証。

まず、親クラス。
class ParentClass
{
  private function func1() { echo "Parent private func1\n"; }
  protected function func2() { echo "Parent protected func2\n"; }
  public function func3() { echo "Parent public func3\n"; }

  public function call()
  {
    $this->func1();
    $this->func2();
    $this->func3();
  }
}
private, protected, public の 3 種類のメソッドと、それらを呼び出すメソッドを作成。

子クラス1 は public に変更。
class Child1Class extends ParentClass
{
  public function func1() { echo "Child1 private -> public func1\n"; }
  public function func2() { echo "Child1 protected -> public func2\n"; }
  public function func3() { echo "Child1 public func3\n"; }
}
シンタックスエラーは起きない。

子クラス2 は protected に変更。
class Child2Class extends ParentClass
{
  protected function func1() { echo "Child2 private -> protected func1\n"; }
  protected function func2() { echo "Child2 protected func2\n"; }
  // Access level to Child2Class::func3() must be public (as in class ParentClass)
  // protected function func3() { echo "Child2 protected -> protected func3\n"; }
}
func3 の変更でエラーとなる。public を protected に変更できないようだ。

子クラス3 は private に変更。
class Child3Class extends ParentClass
{
  private function func1() { echo "Child3 private func1\n"; }
  // Access level to Child3Class::func2() must be protected (as in class ParentClass)
  // private function func2() { echo "Child3 protected -> private func2\n"; }
  // Access level to Child3Class::func3() must be public (as in class ParentClass)
  // private function func3() { echo "Child3 public -> private func3\n"; }
}
func2, func3 でエラーとなる。やはり、厳しい方向への変更はできないようだ。

実行してみると、
$p = new ParentClass();
$p->call();
echo "----------\n";
$c1 = new Child1Class();
$c1->call();
echo "----------\n";
$c2 = new Child2Class();
$c2->call();
echo "----------\n";
$c3 = new Child3Class();
$c3->call();
 
結果は、
Parent private func1
Parent protected func2
Parent public func3
----------
Parent private func1
Child1 protected -> public func2
Child1 public func3
----------
Parent private func1
Child2 protected func2
Parent public func3
----------
Parent private func1
Parent protected func2
Parent public func3

親クラスは当然の結果が出ている。
子クラス1の func1 は、親クラスの func1 が private なためオーバーライドできずに、親クラスの func1 が呼ばれている。
子クラス2の func1 も同様。func2, func3 はオーバーライドしていないためそのまま親クラスのものが呼ばれている。
それぞれの子クラスで、call を再定義してやると、それぞれの func1 が呼ばれる。

protected -> public への変更はできるが、public -> protected -> private への変更はできない。
private はオーバーライドできない。

歯!?

歯が抜けた








実は、インプラントのかぶせ物。
仮付けして、もうかれこれ 1 年半。
過去に本付けして 2 度ほど割れてしまったので、今回長めに様子を見ることになってた。
そろそろ様子見も終わりで衛生士さんに見てもらったら本付けしようという段階だったわけだが。

通ってる歯医者は、夜21時ぐらいまでやってて土日もやってるので結構人気で予約が取れない。
3 ヶ月に 1 回定期健診の葉書がくるんだがそこから予約が 1 ヶ月になるので結果、 4 ヶ月検診になってしまっている。

外れたのですぐに電話したら、1週間後なら予約が取れると。正確には無理やりねじ込むからすごい待つことになるらしい・・・
痛みがあるわけでもないので、緊急性は低いしまぁ仕方ないか。

2011年10月20日木曜日

org-mode の HTML エクスポートの文字コード

さっそくはまったエピソードを。

普段、Windows 上での作業なので、文字コードの設定は japanese-shift-jis-dos にしているんだけど、org-mode で書いたものを HTML にエクスポートするので、UTF-8 がいいかなと思い、変更方法を調査。

とりあえず、ファイルの文字コードを UTF-8 にしてエクスポート。(C-x Enter f)
なぜか文字化け。meta タグ等の charset は変わるものの、文字コードは Shift_JIS のまま。
次に、それぽい変数 org-export-html-coding-system を発見したので設定してみた。*scratch* にて
(setq org-export-html-coding-system 'utf-8)
そしてエクスポートするが同じ症状。
なぜだということで、elisp は全く詳しくないがソースを見てみることに。とりあえず
M-x describe-variable org-export-html-coding-system
から開始。すると、org-html.el でそれっぽいところが。
(coding-system (and (boundp 'buffer-file-coding-system)
            buffer-file-coding-system))
(coding-system-for-write (or org-export-html-coding-system
                 coding-system))
(save-buffer-coding-system (or org-export-html-coding-system
               coding-system))
(charset (and coding-system-for-write
          (fboundp 'coding-system-get)
          (coding-system-get coding-system-for-write
                 'mime-charset)))
org-export-html-coding-systemは nil のままだと、バッファの文字コードで決まるようにみえる。
最初のアプローチであってるように見えたが・・・
再起動等やってやり直してみるもやはり同じ症状。
M-x describe-coding-system すると utf-8 になってるように見える。

色々ググッてみると、emacs 23.3 では日本語処理あたりに不具合があるとか。
Magic Comment でいけたというのを見かけたのでつけてみた。
# -*- coding: utf-8 -*-
するとうまくいくものといかないものと。
キャッシュされてるのか日付みたりしてるのかなんなのか、出力されないものがような。何度かやってたら、全て UTF-8 になったので釈然としないがこれでよしということに。

で、家帰ってこれ書くために同じ事やってみたら、最初のアプローチでいける・・・
org-export-html-coding-system の設定でもいける・・・

何か勘違いしてたのか、会社の設定と違うところがあるのか不明・・・
とりあえず、Magic Commentは付けたままの方向に。

2011年10月19日水曜日

ブログ開始

、初めてのブログ作成。

祝うべき日です。初めてなので何を書いていいのかわからないけど・・・ 。

タイトルにあるように、日々学んだことなんかを書いていこうかなと。

技術的なメモはこれまで、Wiki に書いてたんだけど使い勝手がイマイチなので、 org-mode で保存しようかと移行中。

色々あって週末ぐらいしか繋がらないけど、
http://technicalknowledge.moe.hm/
にエクスポートしてアップしてるとこ。
なので技術的というより、しょうもないことではまったこととか、日々の日記が主になるかも。


特に趣味も無いので書くことがあまりなさそうだけど、ぼちぼち続けていければいいかな。