Cygwinインストールのメモ

久し振りにCygwinをインストールすることになったので,そのメモ.

環境はWindows 7

CYGWIN環境変数

結構重要そうなパラメータが無くなった?

とりあえずGUIから次のように設定:

CYGWIN=error_start:c:\cygwin\bin\gdb.exe glob:ignorecase winsymlink

Windowsにもログインスクリプトのようなものがあったような気がするけど,どこだっけ?

その他には何も設定していない.
した方が良かったかな?

第18回 未来会議 参加報告

6月18日に,第18回 未来会議を行いました(主催しました).

下は,その個人的な感想です:

  • 1. @Flast_RO 「C++について」

C++0xで新たに追加されたことなどについて紹介.実用的なプログラムを作成する上で必要な機能や標準ライブラリが拡充されたそうです.
しかし,結論としては,現状のCやC++(とプラットフォーム)はまだまだ不十分で,これからプログラミングを始める(特に初学者が)なら別の言語がいいよね,ということに.
原因はいくつかあって,実在するプロダクトの規模やライフサイクル,そのソースコードアーキテクチャが古いものをどう保守するか,というのがその一つらしい.
あと,gccさんはTDDじゃなくてBDDだ,とか.

  • 2. @tadanotokki 「ハードウェア設計について」

ハードウェア設計の工程の解説と,FPGA上の実装の紹介,COJTで行ったことの話.
COJTでの話については,ハードウェアで実装を行う際,処理をクロック内に収めるために行うパイプライニングの紹介を頂きました.
ソフトウェアの場合と違って,そのアーキテクチャをデザインするところから始まるので,アルゴリズムを色々考えるのが好きな人には興味深い対象かなと思います.
ハードウェア実装でアジャイルな開発は無理そう,という点も,技術的な差異を表していると思いました.
実は発表者の方の成果発表を見て,これは良い!と思って声をかけさせて頂きました.もしも今後ハードウェア実装関係で進むのなら,さらに高度なデザイン方法があるので,そこまで行って欲しいなぁ…と思います.

PostScript言語の解説と,基本的な命令から処理の制御を行う文を構成する話.題材としてforの実装.
正直なことを言うと,なぜ発表者はPostScriptに惹かれたのか…そこが最も大きな謎だったのかもしれません.普段は型の話ばかりなのに…
発表者は,言語でプログラムを構築する上での理想的な在り方だとか指針を持っていて,PS言語もこう書きたい,こうあるといいんじゃないか,というのがハッキリしていて,応用のために使っている立場から見ると(もちろん言語そのものにも興味あります)おもしろい見方をしていると感じました.
それと,質疑応答で挙がった「ベンチマークのためのPSファイル」と「古い処理系を修正したり高速化したりするPSの匠」の話も凄く気になりました.それはもうレガシーというか,レジェンドというか,なんというか…深淵…

  • 4. @erutuf13 「Coqで数独

Coqの数独を解くライブラリについて紹介.
形式的な手法や,証明を与える,といったパラダイムは最近ちょこちょこと表われていて,個人的に気になっていました.
ところで,Coq使いも証明をパッと見ただけではそれが何を表わしているのかが分からないそうです…確かにパッと見では大変そう…
実はまだまだその要点を捉えることができていない感じがして申し訳ないのですが,Coqの様な証明支援系は,“プログラム断片の結合”のための表明とそのチェック機能が(型に関するものよりも)優れているのかな,と思いました.違ってたらごめんなさい…

ちなみに最近見たCoqを使ったハードウェア実装関係の論文は「Exact and Approximated Error of the FMA」という論文で,Fused Multiply accumulate-Add(FMA)演算の誤差の算出法に証明を付けているようですね(これもパッと見の判断です.間違えていたごめんなさい).この論文の成果は,ハードウェアを実装したというよりはそのデザインを行う指針に使えるもの,という位置付けかな?

以上です.

参加された皆様,お疲れさまでした.お忙しい中,本当にありがとうございました.

Pythonで,定義されたクラスにメソッドを追加する

import types
 
class A(object):
  def __init__(self, l):
    self.list = l
 
def foo(self, i):
  return self.list[i]
 
# print A.__getitem__ ## => AttributeError: type object 'A' has no attribute '__getitem__'
 
A.__getitem__ = types.MethodType(foo, None, A)
## or
# setattr(A, "__getitem__", types.MethodType(foo, None, A))
 
print A.__getitem__
 
a = A([1,2,3])
print a[0], a[1], a[2]
 
b = A([4,5,6,7])
print b[0], b[1], b[2], b[3]

配列の参照を返す

C++で配列の参照を関数の返り値にするにはどうすればいいかを考えていた.
typedefで型を定義してやるとできるみたい.
arrayを使え,っていう話もある.

#include <iostream>
#include <iterator>
#include <array>
 
using namespace std;
 
struct A {
  A() : v_(1) {}
  A(int v) : v_(v) {}
  int v_;
  friend ostream & operator<<(ostream &o, const A x)
  {
    o << x.v_;
    return o;
  }
};
 
static const int N = 5;
 
struct B {
  static int k;

  typedef A bar[N];
  static bar& foo1()
  {
     static A array[N];
     for (int i = 0; i < N; ++i) array[i].v_ = k++;
     return array;
  }

  static A (&foo2())[N]
  {
     static A array[N];
     for (int i = 0; i < N; ++i) array[i].v_ = k++;
     return array;
  }

  static auto foo3() -> A (&)[N]
  {
     static A array[N];
     for (int i = 0; i < N; ++i) array[i].v_ = k++;
     return array;
  }

  static array<A,N> &foo4()
  {
     static array<A,N> ary;
     for (int i = 0; i < N; ++i) ary[i].v_ = k++;
     return ary;
  }
};

int B::k = 0;

template<class T> void show(const T &x);

template<class T>
void show(const T (&ary)[N])
{
  ostream_iterator<const A> couti(cout, ",");

  cout << ary << endl;
  copy(ary, ary+N, couti);
  cout << endl;
}

template<class T>
void show(const array<T,N> &ary)
{
  ostream_iterator<const A> couti(cout, ",");

  cout << ary.data() << endl;
  copy(ary.begin(), ary.end(), couti);
  cout << endl;
}

int main()
{
  A (&a1)[N] = B::foo1();
  show(a1);

  A (&a2)[N] = B::foo2();
  show(a2);

  A (&a3)[N] = B::foo3();
  show(a3);

  array<A,N> &a4 = B::foo4();
  show(a4);

  return 0;
}

追記

C++0xとBoostのarrayはちょっと違うらしい.
後で調べる.

シンボリックリンクのパーミッション

シンボリックリンクパーミッションは考慮されないと聞いていたのだが,参照先の実行が許可されていても,シンボリックリンク名で実行できなかった.なぜかcdで移動はできた…よく分からない…

chmodコマンドからは,直接シンボリックリンクパーミッションを変更することができないそうだ.なので,umaskを変更してとりあえず対応…しかしumaskの値を「0000」にしたはずなのに,なぜか参照先のパーミッションと同じに…よく分からないなぁ…