経済的官能小説

和夫は、月明かりに照らし出された政子の双子の赤字を眺めていた。
政子は無言のまま和夫の格差問題にそっと手を当てると、なんとも愛しそうにやさしく撫ぜた。
和夫は思わず政子の双子の赤字に顔を近づけると、そっと口付けをし、そのまま量的金融緩和の解除に踏み切った。
あらわになった政子の双子の赤字は、今にもはちきれんばかり。
そのまま和夫は、政子の双子の赤字を執拗に攻め立て、それに耐え切れず政子のFRBは更なる利上げに踏み切った。
和夫は一瞬、政子のデフレ傾向が強まると思い、執拗に攻めていた手を休めた。
ところが、政子のGDPはそのデフレ傾向を跳ね返すように大きく伸び、デフレどころかインフレ傾向に傾き始めた。
和夫はそんな政子のインフレを確かめるや否や、大きくなった格差問題をおもむろに政子に押し当てた。
政子は嬉しさと興奮で和夫のはちきれんばかりの格差問題に手を伸ばし、やさしく迎え入れた。
和夫の頭の中は真っ白になり、政子から溢れてくるインフレの波に飲まれながら、大きくなった格差問題を激しく突きつけた。
政子も激しく突きつけられる格差問題に併せて、大きく揺れ動く為替相場に快感を覚えた。
為替相場が揺れ動くにつれ、和夫と政子の貿易摩擦に問題が生じ始めた頃、二人の間でバブルがはじけた。
それと同時に和夫の金融市場はマネーサプライの激増に手の施しようがないくらい、
まさに絶頂と言うにふさわしいほどの混乱の中、和夫と政子はお互いの問題をやさしく撫ぜながら眠りについた・・・。

일본어 히라가나 가타카나 아이폰 추천 어플




「あ」言うてみ










최근 둘째가 아이폰에 빠져있어 그냥 가지고 놀게하는 것 보다
일본어 공부나 시킬까 하고 아이폰에 빠삭한 직원에게 모 괜찮은거 없냐고 물어봤더니 위의 앱을 소개해줬다. 앱 스토어에 들어가보니  마침 85엔 세일중이라 어제 질렀다.
ㅎㅎ 핑크색 아이콘이 좀..야시시하네.ㅡ.ㅡ
일단 실행하면 아래 메인 화면이 나온다 아마 오사카 사람이 만들었나? 신세카이 복어가 보인다.
일단 타이틀화면은 맘에 들었다.  히라가나 / 가타가나 발음 듣기와 간단한 카드 게임이 들어가 있었다. 역시 오사카 사람이 만들었나보다 -_-; 오사카 사투리로 ㅎㅎ 하여간 ...
심플한것이 아이들에게 거부감 없이 일본어와 발음을 접하고 흥미를 유발하기에 충분했다.
첫째는 카드 게임에 빠져 둘이 서로하겠다고 싸운다. 쩝 ㅡ.ㅡ
하여간 맘에 들었음.

일본어를 처음 접하거나 현지 발음을 듣고 싶다면 강력 추천한다.

상세 설명은 아래 링크
http://itunes.apple.com/jp/app/id457126389?l=en&mt=8




타이틀 화면


멀티뷰에서 드래그

CookBook - sample 소스 참조
==========================



#import <UIKit/UIKit.h>
#include "time.h"

//@class UIImageView;

@interface DragView : UIImageView
{
CGPoint startLocation;
}
@end

@implementation DragView

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
startLocation = pt;
[[self superview] bringSubviewToFront:self];
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
CGRect frame = [self frame];
frame.origin.x += pt.x - startLocation.x;
frame.origin.y += pt.y - startLocation.y;
[self setFrame:frame];
}
@end//end of implementation

@interface HelloController : UIViewController
@end

@implementation HelloController
#define MAXFLOWER 10
CGPoint randomPoint(){
return CGPointMake(random()% 256, random()% 396);
}
- (void)loadView{
UIView *contentView = [[UIView alloc]initWithFrame:[[UIScreen mainScreen] applicationFrame]];
contentView.backgroundColor = [UIColor blackColor];
self.view = contentView;
[contentView release];
// add the flowers to random points on the screen
for (int i=0; i<MAXFLOWER; i++) {
CGRect dragRect = CGRectMake(0.0f, 0.0f, 64.0f, 64.0f);
dragRect.origin = randomPoint();
DragView *dragger = [[DragView alloc] initWithFrame:dragRect];
NSString *whichFlower = [[NSArray arrayWithObjects:@"blueFlower.png",@"pinkFlower.png",@"orangeFlower.png",nil] objectAtIndex:(random()%3)];
[dragger setImage:[UIImage imageNamed:whichFlower]];
[dragger setUserInteractionEnabled:YES];
[self.view addSubview:dragger];
[dragger release];
}
}
@end


@interface SampleAppDelegate : NSObject <UIApplicationDelegate>
{
}
@end

@implementation SampleAppDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
srandom(time(0));
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
HelloController *hello = [[HelloController alloc]init];
[window addSubview:hello.view];
[window makeKeyAndVisible];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
//handle any final state matters here
}


- (void)dealloc
{
[super dealloc];
}

@end //end of SampleApplication implementation

int main(int argc, char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, @"SampleAppDelegate");
[pool release];
return retVal;
}

Swingによる動的インターフェース設計


2006年 4月 25日



Swing UIツールキットは、常に簡単ではありませんが、イベントまたはユーザー・アクションに応じてユーザー・インターフェースを動的に更新することを可能にします。この記事では、動的に更新するUIを構築するための一般的な方法と、その過程で遭遇する可能性のあるいくつかの落とし穴を解説します。また、正しい手法が何であるかを判断するための原則について解説します。



Swingツールキットは、ユーザー・インターフェースを作成するための多彩なツールと、プログラムのライフタイム中にプログラムのインターフェースを変更するための非常に多くのオプションを提供します。これらの機能を注意深く利用すると、ユーザーのニーズに動的に対応し、対話を単純化するインターフェースができあがります。同じ機能を不注意に使用すると、非常にわかりにくく、まったく使用できないプログラムになることもあります。この記事では、動的UIのテクノロジーと概念を紹介し、効果的なUIを構築するヒントを挙げます。Sun JDKに付属のSwingSet2デモ・アプリケーションに基づいて(「 参考文献」参照)、ソース・コードを修正します。このアプリケーションのUIには多数の動的機能が使用されていて、動的UIを理解するための出発点として最適です。




ウィジェットの無効化


最も単純な形の動的UIは、使用不能なメニュー項目またはボタンを灰色で表示するUIです。UIウィジェットの無効化は、すべてのウィジェットに対して同じように作用します。setEnabled()関数は、Componentクラスの機能です。リスト1に、ボタンを無効化するコードを示します。






リスト1. ボタンの無効化













button.setEnabled(false);






見てのとおり、非常に簡単です。問題は、いつボタンを有効または無効にするかです。一般的な設計上の決定は、適用不能なときにボタンを無効にするというものです。例えば、多くのプログラムは、ファイルが最後に保存されてから変更されていないときには、Save(保存)ボタン(および対応するメニュー項目)を無効にします。


ボタンを無効にするときの主な注意点は、適切なときに再び有効にするのを忘れないことです。例えば、ボタンのクリックとそのアクションの完了との間に確認ステップがある場合、確認が失敗した場合でも、ボタンを再び有効にしなければなりません。









使用できないメニュー・オプションまたはダイアログ・ボックスのボタンを灰色表示にするという単純なアクションでも、ユーザーにとってトレードオフがあります。ボタンが灰色表示になっていれば、ユーザーは特定のアクションを実行できないことがすぐにわかりますが、実行できない理由はわかりません。理由を理解できないユーザーにとって、これが問題になるかもしれません(「 一般原則」を参照)。





範囲の調整


ときには、アプリケーションはSpinnerやSliderなどの数値ウィジェットの範囲を動的に調整する必要があります。これは、見かけよりはるかに複雑な場合があります。特にSliderには、目盛り、目盛り間隔、ラベルなど、二次機能があります。表示が醜くなるのを避けるために、範囲とともに調整する必要があるかもしれません。


SwingSet2デモでは、このような調整を直接行わないので、このデモに手を加えて、別のスライダーを変更できるChangeListenerを、スライダーにアタッチします。リスト2に示した新しいSliderChangeListenerクラスを入力します。






リスト2. スライダーの範囲の変更













class SliderChangeListener implements ChangeListener {
JSlider h;

SliderChangeListener(JSlider h) {
this.h = h;
}

public void stateChanged(ChangeEvent e) {
JSlider js = (JSlider) e.getSource();
int i = js.getValue();

h.setMaximum(i);
h.repaint();
}
}






3番目の水平スライダーが作成されると(オリジナル・デモでは、すべての単位に目盛りがあり、5、10、11のラベルがあるスライダー)、新しいSliderChangeListenerも作成されて、スライダーをコンストラクター引数として渡します。3番目の垂直スライダー(範囲が0から100までのもの)が作成されると、新しいSliderChangeListenerが変更リスナーとして追加されます。これは期待通りに機能します。すなわち、垂直スライダーを調整すると、水平スライダーの範囲が変わります。


あいにく、目盛りとラベルはまったく機能しません。5目盛りごとのラベルは、範囲があまり大きくなければ問題ありませんが、図1に示すように、11という余分なラベルがユーザビリティー問題になります。






図1. ラベルの混在




図1. ラベルの混在






目盛りとラベルの更新


明らかな解決策は、リスト3に示すように、最大値が更新されたら、単に水平スライダーの目盛り間隔を設定することです。






リスト3. 目盛り間隔の設定













// DOES NOT WORK
int tickMajor, tickMinor;
tickMajor = (i > 5) ? (i / 5) : 1;
tickMinor = (tickMajor > 2) ? (tickMajor / 2) : tickMajor;
h.setMajorTickSpacing(tickMajor);
h.setMinorTickSpacing(tickMinor);
h.repaint();






リスト3は現状では正しいですが、画面に表示されるラベルは変更されません。setLabelTable()を使用して、ラベルを個別に設定する必要があります。もう1行追加すると、修正できます。










h.setLabelTable(h.createStandardLabels(tickMajor));






これでも、最初にセットアップされた奇妙なラベル11が残ります。もちろん、目的は、スライダーの右端にラベルを表示することです。このためには、(新しい最大値を設定する前に)奇妙なラベルを除去してから、新しいラベルを追加します。次のコードは、ほぼ問題なく機能します。






リスト4. ラベルの置換













public void stateChanged(ChangeEvent e) {
JSlider js = (JSlider) e.getSource();
int i = js.getValue();

// clear old label for top value
h.getLabelTable().remove(h.getMaximum());

h.setMaximum(i);

int tickMajor, tickMinor;
tickMajor = (i > 5) ? (i / 5) : 1;
tickMinor = (tickMajor > 2) ? (tickMajor / 2) : tickMajor;
h.setMajorTickSpacing(tickMajor);
h.setMinorTickSpacing(tickMinor);
h.setLabelTable(h.createStandardLabels(tickMajor));
h.getLabelTable().put(new Integer(i),
new JLabel(new Integer(i).toString(), JLabel.CENTER));
h.repaint();
}










一度言ったとすれば、二度言った


「ほぼ」と言ったのは、リスト4のコードでは11のラベルが除去されますが、iに新しいラベルが追加されないためです。代わりに、tickMajor間隔でラベルが表示されるだけです。解決策は、一見、かなり衝撃的なものに見えるでしょう。






リスト5. 表示の強制更新













h.setLabelTable(h.getLabelTable());








この一見つかみどころのない操作が、実際には重大な効果を持っています。ラベル・テーブルが設定されると、スライダーのラベルが生成されます。テーブルの変更に対する特別なコールバックはないので、テーブルに新しい値を追加しても、必ずしも効果があるわけではありません。リスト5の明らかなno-opには、表示を更新しなければならないことをSwingに知らせるという副作用があります。(私がこれを発明したわけではありません。オリジナルのSwingSetコードにそのようなコールが含まれているのです。)


これで、残る問題は1つだけです。スライダーの端にラベルを表示したいという目的により、図2に示すように、2つのラベルが隣り合って表示されたり、重なり合って表示されたりすることがあります。




図2. スライダーの端のラベルの重なり









この問題には、数多くの解決策があります。その1つは、自分でコードを書き、ラベル・テーブルに値を入れ、早い段階でシーケンスを中止して、シーケンスの最後のラベルをスライダーの端から離すことです。これは読者の皆さんへの宿題にしましょう。






メニューの更新


多くの場合、メニューの変更をメニュー項目の有効化と無効化に制限することは、きわめて実際的です。この手法は、項目の無効化に適用される一般的な注意事項の対象となります。重要な項目を無効化することによって、プログラムがうっかり使用不能な状態のままになるのを避けてください。


メニュー項目またはサブメニューの追加や削除も可能です。JMenuBarを変更するのは、それほど簡単ではありません。バーから個々のメニューを削除または置換するためのインターフェースがないからです。(バーの右端に新しいメニューを追加する以外で)バーを変更したい場合は、新しいバーを作成して、元のメニューと置き換える必要があります。


個々のメニューの変更は、ただちに有効になります。バーや別のメニューにメニューをアタッチする前にメニューを構築する必要はありません。メニュー・オプションの選択を変更する必要があるとき、最も簡単な方法は、特定のメニューを変更することです。それでもやはり、メニュー全体を追加したり削除したりする場合があるかもしれませんが、これは特に難しくありません。リスト6では、メニュー・バーの、特定のインデックスの前にメニューを挿入する方法の単純な例を示しています。この例では、置き換えられるJMenuBarはJFrameオブジェクトにアタッチされることを前提としていますが、メニュー・バーを取得および設定できるものであれば、どんなものでも同じように機能します。






リスト6. メニュー・バーへのメニューの挿入













public void insertMenu(JFrame frame, JMenu menu, int index) {
JMenuBar newBar = new JMenuBar();
JMenuBar oldBar = frame.getJMenuBar();
MenuElement[] oldMenus = oldBar.getSubElements();
int count = oldBar.getMenuCount();
int i;

for (i = 0; i < count; ++i) {
if (i == index)
newBar.add(menu);
newBar.add((JMenu) oldMenus[i]);
}
frame.setJMenuBar(newBar);
}






このコードは、私が最初に試みたものではなく、うまく機能するように手を加えた最終バージョンです。いくつか興味深い奇癖を反映しています。一見して、これを実装するにはgetComponentAtIndex()を使うのが当然のように見えるかもしれませんが、これは非推奨になりました。さいわい、getSubElements()インターフェースが十分に役立ちます。newBar.add()の場合、JMenuへの型変換はおそらく安全ですが、私は好きではありません。getSubElements()インターフェースはメニュー・バーだけでなく、メニューにも作用します。メニューにいくつかの型のサブ要素を持たせることができますが、JMenuBarに追加できる要素はJMenuだけです。したがって、JMenuBar.add()メソッドに渡すためには、要素をJMenuに型変換しなければなりません。あいにく、将来のAPIの改訂でJMenu以外の型の要素をJMenuBarに追加できるようになった場合、返された要素をJMenuに型変換するのは不要になり、安全でなくなります。


リスト6のコードでは、もう1つのかなり微妙なインターフェースの奇癖を反映しています。すなわち、あらかじめ、メニュー・カウントをキャッシュしなければなりません。メニューが新しいバーに追加されると、古いメニュー・バーから削除されます。リスト7のコードも同じに見えますが、機能しません。ループが早い段階で終了します。






リスト7. 終了が早すぎるループ













// DOES NOT WORK
for (i = 0; i < oldBar.getMenuCount(); ++i) {
if (i == index)
newBar.add(menu);
newBar.add((JMenu) oldMenus[i]);
}





リスト7のループは、半分の項目しかコピーしません。例えば、メニュー・バーにそもそも4つの項目があった場合、はじめの2つしかコピーされません。最初の項目をコピーすると、iは1となり、getMenuCount()は3を返します。2番目の項目をコピーすると、iは2となり、getMenuCount()は2を返すので、ループは終了します。バーにメニューを追加すると、別のバーから削除されるという「機能」について記載された資料を見つけることができなかったため、意図的なものではないのかもしれません。それでも、これの対処法は簡単です。


メニュー・バーからメニューを削除するのは、もう少し簡単です。元のバーの他のメニューをすべて、新しいバーにコピーすればよいのです。簡単ですね!


インターフェースでメニューの動的更新を多用する場合は、メニューを常にその場で更新するよりも、メニュー・バーのセットを作成して、セットを切り替えた方がよいかもしれません。ただし、あまり頻繁にメニューを変更すると、ユーザーは混乱するでしょう。









ユーザーはインターフェースの一貫性から恩恵を受けます。特定のメニューは常に同じ場所にあるべきです。ユーザーにとって便利なように、変更の可能性があるメニューはメニュー・リストの右端に置き、変更されないメニューは左側の固定位置に置くようにしましょう。同様に、可能なら、項目は常にメニュー内の同じ位置に置いてください。メニュー項目の位置がころころ変わるよりは、灰色表示の方が、ユーザーにとって目障りではありません。メニューの他の項目の位置が変わらないからです。







ウィンドウのサイズ変更


うれしいことに、通常、ウィンドウのサイズ変更は自動的に行われます。しかし、サイズ変更が持つ意味を考えておく必要があります。非常に小さいウィンドウでは、ボタン・バー、メニュー・バー、および同様の機能が問題になることがあります。プログラムが自分で管理するグラフィカル・パネルは、サイズ変更イベントに対応する必要があります。UI要素のパッキングはSwingに任せてもよいですが、コンポーネントのサイズに気を付けていてください。一度取得した寸法を不用意に使用し続けないでください。


さらに油断できないこととして、スライダーの目盛り間隔など、設計上の決定のなかには、ウィンドウのサイズ変更イベントに応じて適度に更新されるものがあります。幅100ピクセルのスライダーには、幅400ピクセルのスライダーと同じ数のラベルを見やすく表示することはできません。より大きな表示には、まったく新しい利便性機能を追加することによって、UIをさらに充実させた方がよいかもしれません。


とはいえ、ほとんどの場合、ウィンドウ・サイズの変更は無視することができます。ただし、サイズ変更を不必要に妨げたり、オーバーライドしたりしてはいけません。レイアウト・コードには、取るに足りない利便性は必要ありません。最小ウィンドウ・サイズは調整可能かもしれませんが、ユーザーが好きなだけウィンドウを大きくできるようにしておきましょう。






一般原則


Swingツールキットは、UI設計に大幅な柔軟性を与えてくれます。注意して使用すれば、インターフェースをその場で更新するオプションにより、インターフェースは劇的に単純化できます。例えば、メニュー・オプションが適用されるときだけメニューを表示すれば、ユーザーにとって使い勝手がよくなります。


残念ながら、この手法を可能にするAPI機能の中には、やや気まぐれなものがあり、副作用と対話が常に詳しく解説されているわけではありません。動的インターフェースについてのアイデアが浮かんだら、デバッグに少しだけ余分に時間を費やす心積もりをしてください。Swingライブラリーの隅々を調べると、驚くべき動作やバグに対処する必要があることがわかるかもしれません。


明白な実装がなくても、がっかりしないでください。この記事のJMenuBarの例が示すように、あるタスクのサポートがAPIになくても、自分で実装することができるかもしれません(やや間接的ではあっても)。


極端に走るのはやめましょう。動的UIの真価は、本質的な制限をユーザーにわかりやすくすることにあります。理想的には、ユーザーが、インターフェースが変化したことに気づかないことです。選択されたオブジェクトがあるときだけ、プログラムのObjectメニューが使用できるようになっていれば、その他の時間にObjectメニューがなくても、ユーザーは気にしません。


一方、オプションが使用できない理由をユーザーが推測できない可能性がある場合は、ユーザーにアクションを実行させて、わかりやすいエラー・メッセージを表示した方がよいかもしれません。これは特に一部のアクションで重要です。保存オプションが無効になっているだけでは、データを保存したい場合にユーザーは不思議に思います。おそらく、プログラムはデータがすでに保存されていることを認識していますが、ユーザーは、それに気づいてなく、保存できないことを疑問に思います。また、ファイルを保存できない特定の理由があるのであれば、それを知りたいと思うでしょう。


インターフェース設計は、長年の研究にもかかわらず、まだまだ多くの点で未熟な分野です。少し実験してみてください。UIの動的変更は、UIをわかりやすく、シンプルにし、応答性を高める素晴らしい機能です。動的UI機能を追加するには、数分間の作業からかなり長時間の作業まで、ある程度の労力が必要です。

Visual C++ 2008 Feature Pack

Your download has started


Visual C++ 2008 Feature Pack Release


If your download does not start after 30 seconds, click here: Start download


Instructions

The Visual C++ 2008 Feature Pack extends the VC++ Libraries shipped with Visual Studio 2008 and is fully covered under Microsoft's standard support policies.


The VC++ 2008 MFC libraries have been extended to support creation of applications that have:



  • Office Ribbon style interface

  • Office 2007, Office 2003 and Office XP look and feel

  • Modern Visual Studio-style docking toolbars and panes

  • Fully customizable toolbars and menus

  • A rich set of advanced GUI controls

  • Advanced MDI tabs and groups

  • And much more!




This feature pack also includes an implementation of TR1. Portions of TR1 are scheduled for adoption in the upcoming C++0x standard as the first major addition to the ISO 2003 standard C++ library. Our implementation includes a number of important features such as:



  • Smart pointers

  • Regular expression parsing

  • New containers (tuple, array, unordered set, etc)

  • Sophisticated random number generators

  • Polymorphic function wrappers

  • Type traits

  • And more!




Note: This feature pack does not include C99 compatibility or support for special math functions.


http://www.microsoft.com/downloads/details.aspx?familyid=7D1DF9CE-4AEE-467F-996E-BEC826C5DAA2&displaylang=ja


Microsoft Visual Studio International Feature Pack 2.0


簡単な説明


Microsoft Visual Studio International Feature Pack 2.0


Microsoft Visual Studio International Feature Pack 2.0 には、.NET 開発者が、対象とする国および地域の要件にあったソフトウェアを開発することを容易にする、コントロールおよびクラスライブラリが収められています。






Microsoft Visual Studio International Feature Pack 2.0 リリースノート


この文書には、Visual Studio International Feature Pack (インターナショナル機能パック) 2.0 の基本機能に関する概要、ダウンロード、及びサポートの詳細が書かれています。本リリースは、バージョン 1.0 (製品名は「Microsoft Visual Studio International Pack 1.0 SR1」です。) の拡張となっており、バージョン1.0 で提供されている機能も同時にお使いになる場合には以下のリンクからバージョン 1.0 もあわせてインストールしてくださいますようお願いいたします (http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=44cac7f0-633b-477d-aed2-99aee642fc10)。




Microsoft Visual Studio International Feature Pack 2.0 の新機能


Microsoft Visual Studio International Feature Pack 2.0 には .NET 開発者が、対象とする国および地域の要件にあったソフトウェアを開発することを支援するための以下のコントロールとクラス ライブラリが含まれています。




Yomigana Framework には以下のクラス ライブラリとコントロールが含まれます。




•クラスライブラリ


◦文字列型を対象に、読み仮名を付ける機能を提供します。また、汎用的なクラスとしてジェネリックを使用したクラスも用意されていますので、読み仮名に限らず、任意のオブジェクトを注釈として文字列に付けることもできますし、文字列でなく任意の列挙可能コレクションに注釈を付けることも可能になっています。


◦文字列を対象とし、読み仮名をつけるクラスでは、読み仮名付きの文字列として並び替えや比較を行うための Comparer が提供されています。


◦相互運用性を考慮し、Unicode の Interlinear Annotation や JIS X 4052 形式の入力と出力を提供します。


•コントロール


◦強化されたASP.NET Ajax、WPF、および Windows フォームのテキストボックスにより、ユーザ入力から読みを取得することができます。


◦強化された ASP.NET のラベル コントロールにより、ルビ表記タグを使った表示ができます。


Chinese Text Alignment Class Library and TextBox Controls には、簡体字中国語の均等割り付けを支援するための Windows フォームと WPF のテキストボックス コントロール、および簡単に中国語固有の均等割付を用いて文字列を描画できるクラス ライブラリが含まれています。




Chinese Auto Complete Class Library and TextBox Controls には、簡体字中国語と繁体字中国語のオートコンプリートを支援するための Windows フォームと WPF のテキストボックス コントロール、および簡単に基本コントロールに IME 入力を考慮したオートコンプリート機能を提供するライブラリが含まれています。




Korean Auto Complete Class Library and ComboBox Controls には、韓国語のオートコンプリートを支援するための Windows フォームと WPF のコンボボックス コントロール、および簡単に基本コントロールに IME 入力を考慮したオートコンプリート機能を提供するライブラリが含まれています。




Numeric Formatting Library は 5つの言語を対象に、数値データを数字文字列に変換するクラス ライブラリを提供します。2.0 ではアラビア語が対象に加えられました。


Related Resources



Related Downloads



What Others Are Downloading


TCP의 TIME_WAIT상태 (SO_REUSEADDR)

http://wwwi.tistory.com/tag/winsock

TCP의 서버 프로그램을 종료한 바로뒤 다시 서버를 기동하면
bind에서 에러(Address aleady in use)로 끝날 때가 있다.

TCP의 서버 프로그램을 종료하고 다시 기동시켰는데 왜 bind가 되지 않을까?
라고 생각하며 시간이 지난후 다시 기동시키면 문제업이 bind가 된다.

이 문제는 TCP 자체 사양에 의하여 일어나는 문제이다.
구체적으로는 TCP의 TIME_WAIT상태가 bind를 fail시킨다.

서버는 TCP 세션을 받은 상태에서 close하면 TIME_WAIT상태가 된다.
이때 주의해야되는 것은 TCP 서버의 TIME_WAIT가 발생하는 경우와
발생하지 않는 경우가 있다는 것이다.

TCP서버 쪽에서 close를 먼저 실행하면 TIME_WAIT상태가 발생하지만
TCP클리아언트 쪽에서는 먼저 close를 실행해도 서버 쪽에
TIME_WAIT가 발생하지 않는다.
더 구체적으로 쓴다면 클라이언트가 먼저 FIN을 송신하면 TCP서버 쪽에는
TIME_WAIT상태에 빠지지않는다.

TIME_WAIT상태는 "netstat -na" 명령을 도스창에서 쳐보면 확인할 수 있다.
TCP세션이 확립된 경우 "netstat -na"를 쳐보면 ESTABLISHED라고 표시되어진다.
TCP세션이 종료된 후 "netstat -na" 명령을 쳐보면 TIME_WAIT생태를 볼수있다.

TIME_WAIT상태는 같은 포트를 다른 프로세스가 이용하는 것을 막기 위해
TCP 규격으로 규정되어져있다.
TIME_WAIT상태의 포트와 동일한 포트를 bind하려하면 bind는 실패한다.
단 끝나버린 프로세스가 쓰고 있는 포트 번호를 바로 쓸 수 없으면 곤란함으로
TIMW_WAIT상태로 남아있는 TCP세션이 있더라도 bind할 수 있는 방법이 있다.
그 방법이 SO_REUSEADDR을 유효하게 하는 것이다.

SO_REUSEADDR를 유효하게 하는 방법은 setsockopt함수를 이용하여
소켓에 옵션을 설정할 수 있다.


#include

#include


int main()

{

WSADATA wsaData;

SOCKET sockSvr;

SOCKET sockSS;

int nlen;

struct sockaddr_in addrSockSvr;

struct sockaddr_in addrSockclt;

BOOL bValid = 1;


// 윈속 초기화

WSAStartup(MAKEWORD(2, 0), &wsaData);


// 소켓 만들기

sockSvr = socket(AF_INET, SOCK_STREAM, 0);


// 소켓 설정

addrSockSvr.sin_family = AF_INET;

addrSockSvr.sin_port = htons(333);

addrSockSvr.sin_addr.S_un.S_addr = INADDR_ANY;


// 소켓 옵션 설정

setsockopt(sockSvr, // SOCKET

SOL_SOCKET, // level

SO_REUSEADDR, // Option

(const char *)&bValid, // Option Value

sizeof(bValid)); // Option length


bind(sockSvr, (struct sockaddr *)&addrSockSvr, sizeof(addrSockSvr));


// TCP클라이언트로 부터 접속 요구를 대기

listen(sockSvr, 5);


while (1) {


// TCP클라이언트로 부터 접속 요구 받기\tab

nlen = sizeof(addrSockclt);

sockSS = accept(sockSvr, (struct sockaddr *)&addrSockclt, &nlen);


// 문자송신

printf("%s 로부터 접속 (포트번호:%d)\n",

inet_ntoa(addrSockclt.sin_addr), // IP어드레스

ntohs(addrSockclt.sin_port)); // 포트번호


send(sockSS, "안녕", 5, 0);


closesocket(sockSS);

}


// 윈속 종료

WSACleanup();


return 0;


}


日本語形態素解析器Senを導入する

SenJAVAで書かれた日本語形態素解析器です。

辞書を使って日本語の文章をトークナイズします。

下は「SenJAVAで書かれた日本語形態素解析器です」をSenでトークナイズした例です。

f:id:knaka20blue:20080923141617j:image

  • Solrに組み込むことで、日本語文章を意味のある単語単位にトークナイズして検索・インデキシングができるようになります。
  • これにによってNグラム方式よりも精度の高い( ノイズの少ない )検索結果を得ることができます。ただし、再現率はNグラム方式より劣ります。この辺の話はちょっとややこしいので改めて。

では、れっつインストール

ダウンロード

下からsen-1.2.2.1.zipダウンロードして解凍する。

https://sen.dev.java.net/servlets/ProjectDocumentList?folderID=755&expandFolder=755&folderID=0

unzip sen-1.2.2.1.zip
インストール

utf-8 で使うための設定

% cd sen-1.2.2.1/conf
%vi sen.xml
<!-- charset>euc-jp</charset -->
<charset>utf-8</charset>

% vi sen-processor.xml
<!-- charset>euc-jp</charset -->
<charset>utf-8</charset>

% cd sen-1.2.2.1/dic
% vi dictionary.properties
//sen.charset=EUC-JP
sen.charset=utf-8
注) dic.charset=EUC-JPは変更しないこと
辞書のインストール
% cd sen-1.2.2.1/dic
% ant
ここでインストールされる辞書は ipadic-2.6.0 なのですが、ipadic-2.7.0が既に出ているので新し物好きな人は build.xml を修正すると幸せになれると思います。

最近はNAIST-jdicの人気も高いのでこちらをつかうのもオサレです。

インストール
% mv sen-1.2.2.1/ $HOME/local

動作確認
環境変数の設定

% vi ~/.cshrc
setenv SEN_HOME $HOME/local/sen-1.2.2.1
setenv CLASSPATH $SEN_HOME/lib/sen.jar:$CLASSPATH
bashの人は適当に読み替えてください。

動作確認

% sh $HOME/local/sen-1.2.2.1/bin/sen.sh
適当な日本語を入れてトークナイズされればおk
すもももももももものうち」 がお約束です。

f:id:knaka20blue:20080923144658j:image

ではでは

[Solr][Sen] 日本語形態素解析Senを導入する その1 Senインストール

[Solr][Sen] 日本語形態素解析器Senを導入する その2 lucene-jaのインストール

[Solr][Sen] 日本語形態素解析器Senを導入する その3 インデキシングする

[Solr][Sen] 日本語形態素解析器Senを導入する その4 再現率が高いNグラム

[Solr][Sen] 日本語形態素解析器Senを導入する その5 精度なら形態素解析

[Solr][Sen] 日本語形態素解析器Senを導入する その6 Nグラムと形態素解析には一長一短あり。目的に応じて使い分けよう


原文先: http://d.hatena.ne.jp/knaka20blue/20080922/1222104683