About

地図会社で働いていたプログラマ。

2013年2月15日金曜日

.NET 空文字列とSystem.Emptyの違い


結論から言うと同じ。ただし、.NET Framework 2.0の頃は違った。
2.0以降を使う場合は、コーディング規約や可読性を優先するべし。

What is the difference between String.Empty and “” (empty string)?
http://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and-empty-string?lq=1

In .Net pre 2.0, "" creates an object while String.Empty creates no object. So it is more efficient to use String.Empty.
.NET 2.0以前では空文字列はオブジェクトを生成していた。一方、String.Emptyは作成しない。そのためString.Emptyの方が効率が良かった。

"" would only have created an object once anyway due to string interning. Basically the performance tradeoff is peanuts - readability is more important.
空文字列はどのみち一回だけしかオブジェクトを生成しないため、基本的にはパフォーマンストレードオフは大したことない。可読性を優先するべき。

2013年2月11日月曜日

[翻訳] ロケットはC++で書かれている


reedit: We are SpaceX Software Engineers - We Launch Rockets into Space - AMA
http://www.reddit.com/r/IAmA/comments/1853ap/we_are_spacex_software_engineers_we_launch/



We are software engineers at SpaceX. We work on:
  • Code that goes on rockets and spacecraft.
  • Code that supports the design and manufacturing process of rockets and spacecraft.
We work on everything from large-scale web applications to tiny embedded computing platforms. We build tech stacks on C#/MVC4/EF/MSSQL via REST to Javascript/Knockout/Handlebars/LESS, C++/Embedded Linux, Python, LabVIEW… which all together enables us to build, launch, and monitor stuff that goes to space.
[SpaceX]: 僕たちはSpaceXという会社のエンジニアで、以下のコードを書いているんだ。
  • ロケットと宇宙船のコード
  • ロケットと宇宙船の設計、製造を支援するためのコード

また、僕らは大規模なWebアプリから小さな組み込むソフト等なんでもやる。C# MVC4, EF, MSSQLベースでREST APIをJavascript, Knockout, Handlebars, LESSで使ったり、組み込みLinuxのC++、Python、LabView ・・・などを使っている。

[–]wakanooms 226 ポイント  前
Hello! I have several questions for you guys, I am currently studying for a degree in Astrophysics so what you guys do definitely applies to me! :)
For the space industry, what do you guys find to be the most used/useful programming language, and also which language is best to begin learning in order to progress to others? (I have very very little programming experience and am very interested in getting started as every aspect of the industry/research seems to require a basic understanding in some form of programming)

[質問者]: やあ、いくつか質問してもいいかな。僕は現在天体物理学を勉強しているので、あなた達のやっていることは僕にも関係すると思うんだ。宇宙業界ではどのプログラミング言語が一番使われる/使えるんだい?またどの言語から始めるのがいいのかな?(僕はプログラミングの知識が全然無いけど、業界で必要とされているのでチャレンジしてみたいんだ)

[–]spacexdevttySpaceX[S] 251 ポイント  前
For all software engineers (not space related) C is a great language to get started. It forces you to learn about how the CPU works, how memory works, etc., but high enough you’re not writing assembly. Once you’ve mastered C take a look at C++.

宇宙に関係なくすべてのエンジニアにとって、Cは最初の言語にうってつけだと思うよ。Cは君にCPUやメモリがどのように動くか教えてくれ、かつアセンブリほど低級でもない。CをマスターしたらC++もみてみるといいよ。


[–]droogans 32 ポイント  前
I've heard that the conveniences that C++ provides do not outweigh the cost in complexity that big projects usually create when using some of the advanced features of C++. What advantages do you experience using C++ over C?

[質問者]: 大規模プロジェクトでは、C++の利便性は複雑性を上回ると聞いてるけど、CではなくC++使うことのメリットを感じたことがあるかい?


[–]spacexdevttySpaceX[S] 93 ポイント  前
Encapsulation is the big one
[SpaceX]: カプセル化が一番かな。


[–]rellim7 146 ポイント  前
What experience/schooling does one need to get a job with spaceX? Or intern even?
SpaceXで働くにはどんな経験や勉強が必要ですか?


[–]spacexdevttySpaceX[S] 206 ポイント  前
We all come from a diverse background of companies and schools. Most of us are Computer Science students but we definitely have a good amount of EE, Physics, Math, Computer Engineering, and even some self-taught engineers here. For Flight Software, C++ and algorithm/data structure knowledge are very important. For Enterprise Information Systems, C# or Front End experience + great algorithm/data structure knowledge. For Launch Engineering (the team that uses LabVIEW), awesome LabVIEW + great algorithm/data structure knowledge. See the trend? Study math and know your sorting algorithms.
[SpaceX]: 皆様々なバックグラウンド(企業や学校)を持っている。そのほとんどはコンピュータサイエンスだけど、電気工学、物理学、数学、コンピュータ工学、また独習したエンジニアもいる。飛行関連のソフトウェアにはC++、アルゴリズムとデータ構造がとても重要で、エンタープライズシステムはC#かフロントエンドとアルゴリズムとデータ構造の知識が必要になってくる。Launch EngineeringはLabVIEW、アルゴリズムとデータ構造かな。


[–]cochico 109 ポイント  前
wow, you all look really young. How old are you and how did you end up in that (awesome) job ?
[質問者]: 君たちはとても若く見えるね、何歳ぐらい?どうやってそのクールな仕事を得たんだ?


[–]spacexdevttySpaceX[S] 121 ポイント  前
We did a quick informal poll and we think the average software engineer age is about 30.
How did we get here? We applied through the website or were contacted by a recruiter. :)
[SpaceX]: アンケートをとったところ、ソフトウェアエンジニアの平均年齢は約30歳ぐらいだった。どうやって仕事をえたかって?ウェブサイトで応募するかリクルーターを通じてかな。


[–]adrianbedard 37 ポイント  前
I'm studying computer engineering in college. What do I need to know before I can properly intern with SpaceX.

今大学でコンピュータ工学を勉強している。SpaceXでインターンする前に何を勉強したらいい?


[–]spacexdevttySpaceX[S] 51 ポイント  前
On the software side, actual coding experience (hobby or class projects) look great on your resume. We also love to see passion about space; feel free to dork out on your resume or interview. We use C++ a lot but there is also plenty of Python, C# and even some Matlab is used here. Some experience with lower-level systems such as the networking stack doesn’t hurt. Align yourself with a professor and attach yourself whatever he or she is working on. High altitude balloon projects are now relatively easy to get started with a few friends and can be very applicable.

ソフトウェアに関しては、実際のコーディング経験(趣味か授業等)があるといいね。あと、宇宙に関する情熱。僕らはC++でたくさん書いてるけど、Python、C#やMatlabも使ってる。ネットワーク等の低水準システムの経験もあると良い。まずは教授とよく相談して何か初めてみて。高所でのバルーンプロジェクトは友達なんかと比較的簡単に始めやすいと思う。






2013年2月5日火曜日

Windows 8にSQL Server 2008 R2をインストールする


Windows 8 ProにSQL Server 2008 R2をインストールしようとしたらこんなメッセージが出た。



Installing SQL Server on Windows 8
http://blogs.msdn.com/b/psssql/archive/2012/09/01/installing-sql-server-on-windows-8.aspx
Now for SQL Server 2008 R2 (this is the same experience as SQL 2008). First, let me stop and tell you the support compatibility story:
  • SQL Server 2005 and any previous version is NOT supported on Windows 8/Windows Server 2012
  • SQL Server 2008 is supported on Windows 8/Windows Server 2012 but requires a minimum of Service Pack 3
  • SQL Server 2008 R2 is supported on Windows 8/Windows Server 2012 but requires a minimum of Service Pack 1
  • SQL Server 2012 RTM is supported on Windows 8/Windows Server 2012



SQL Server 2008 R2はSP1のみがWindows8に対応しているみたい。以下からダウンロードしてインストールできた。
http://www.microsoft.com/ja-jp/download/details.aspx?id=26729





2013年1月20日日曜日

Windows 8アップグレード後にディプレイ解像度が選択できなくなった



環境
Sony VAIO type L (VPCL13AFJ)
Windows 7 HomePremium x64


Windows 8 アップグレードアシスタントを使用してWindows 8にアップグレードする際、Windows 7からアプリや個人用ファイルを移行するか選択できる。このとき、個人用ファイルのみを選択するとデータのみが移行され、ソフトウェアはきれいになくなってくれるのだが、ドライバ類も移行されずアップグレード後にディプレイ解像度の変更ができなくなった。

NVIDIAから対応するドライバをダウンロードしてインストールしようとしても、なぜかエラーとなってしまった。いろいろ調べた結果、以下にあるアップグレード前のドライバを見つけてインストールできた。

C:\Windows.old\Windows\Drivers\EXE\Graphics Driver (NVIDIA)\setup.exe


2012年12月16日日曜日

はじめてのAndroidアプリ。

 

はじめてのAndroidアプリ。

思ったより簡単だったね!

Screenshot_2012-12-16-22-01-10

 

ソース

// MainActivity.java
package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView text = (TextView)findViewById(R.id.textView1);
text.setText("Hi, This is the very first Android app of mine!");
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}


 



// res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/textView1_text" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="@string/button1_text" />

</RelativeLayout>

2012年12月9日日曜日

[翻訳] 64ビット環境移植における20個の問題【途中】

翻訳元サイト
20 issues of porting C++ code on the 64-bit platform
http://www.viva64.com/en/a/0004/#ID0EMEBK

概要

C++コードを32ビットから64ビット環境へ移植する際に発生し得る問題について述べる。間違ったコードとそれを正す方法を示す。また、これらの問題を診断するコード解析手法についも述べる。

序論

本稿では、32ビットから64ビット環境へ移植手順について議論する。本稿はC++プログラマ向けであるが、別プラットフォームでアプリケーションを移植する全ての人に有用な情報となるかもしれな。著者は64ビット環境移植の専門家と64ビット移植に特化したコード解析ツールViva64ツールの開発者である。

64ビット移植をする際には、他の数千以上もあるプログラムの間違いではないの新しいタイプのエラーを理解するべきである。これらは全ての開発者が経験する不可避の問題である。この記事ではそのような問題に対する準備と対策方法を示す。プロミングだけでなく全ての新しい技術は、いくつかの制限や問題を抱えている。64ビットソフトウェア開発も状況は同じである。われわれは64ビットソフトウェアがIT開発の次のステップだと知っているが、実際はほとんどのプログラマは64ビットプログラム開発に関わっておらず、これらの問題に触れる機会はない。

64ビットアーキテクチャの利点を長々と話すつもりはない。このテーマに関してはたくさんの文献があるので参照されたい。この記事の目的は、64ビットアプリケーションの開発者が直面する問題の考察し、以下を学ぶことにある。
  • 64ビットシステムで起こる典型的な問題
  • それらの理由と対応するコード例
  • エラーの修正方法
  • 64ビットプログラムの間違いを探す方法

この知識によって読者は
  • 32/64ビットシステムの違いを理解できる
  • 64ビットプログラムを開発する際に間違いを避けられる
  • デバッグやテストにかける時間を減らせることで、32ビットから64ビットへの移植をすばやく行える
  • 移植にかかる時間をより正確に見積もることができる

また、この記事の中には多くのサンプルコードが含まれているため、より深く理解するためにぜひ試していただきたい。これは読者にとって64ビットの世界の入り口となるはずだ。まずは、以降の説明の手始めにいくつかの型を思い出してほしい。


整数型とメモリサイズ型
型名型のサイズ
(32ビット)
型のサイズ
(64ビット)
説明
ptrdiff_t3264ポインタの引き算時に使用する符号あり整数型。この型はメモリサイズを保持するのに利用するまた、関数の戻り値の型としてサイズやエラー時に-1を返す。
size_t3264符号なし整数型で、sizeof()等、オブジェクトのサイズや数を保持するのに使われる。
intptr_t, uintptr_t, SIZE_T, SSIZE_T, INT_PTR, DWORD_PTR, etc3264ポインタの値を保持する整数型。
time_t3264秒単位の時間。


この記事では、これらの型を”メモリサイズ型”と呼ぶことにする。この用語はポインタを保持し、プラットフォームが32から64ビットへ変わることによってサイズが変化する全ての型を意味する。たとえばメモリサイズ型として、size_t、ptrdiff_t、全てのポインタ、INT_PTR、DWORD_PTR等がある。


32/64ビットデータモデル
ILP32
(Win*32, UNIX*32, Linux*32)
LP64
(UNIX*64, Linux*64)
LLP64
(Win*64)
ILP64
char8888
short16161616
int32323264
long32643264
long long64646464
size_t32646464
ポインタ32646464

1. ワーニングの抑制

どんなソフトウェアの書籍においても、ワーニングレベルをできるだけ高く設定されていることが推奨されている。プロジェクトをこなしてきたプログラマは経験的に、そのソフトウェアに必要な品質を判断することができる。

しかし、64ビット化においては、重大なバグを見逃すことになる可能性があるので、その考えは改め全てのプロジェクトのワーニングレベルを最高に引き上げるべき。そうしないなら、以下のようなミスを見逃すことになる。

unsigned char *array[50];
unsigned char size = sizeof(array);

// 32bit環境:sizeof(array) = 200
// unsigned charの最大値は255なので400を代入すると変数がオーバーフローする。
// 64bit環境:sizeof(array) = 400

2. 可変個の引数をとる関数

64ビット環境でNGな例
const char *invalidFormat = "%u";
size_t value = SIZE_MAX;

// 64ビット環境ではsize_tは8Byteの符号なし整数型なのでこのコードはNG
printf(invalidFormat, value);


このようなバグは64ビット化だけではない。C++言語の本質的な危険性からきている。この問題を
避けるための方法として、そのような関数の使用は避け、より安全な関数を使うことである。例えば、printfの代わりにcout、sprintfの代わりにboost::formatやstd::stringstreamである。

もし、printfやscanf系の関数を利用したい場合は、以下のマクロを使うとよい。
size_t u;

scanf("%u", &u);  // Win32
scanf("%Iu", &u); // Win64
scanf("%lu", &u); // Linux64

3. マジックナンバー

質の低いコードはマジックナンバーを含んでいる。マジックナンバーはその存在自体が危険であり、アドレス演算、オブジェクトのサイズ、ビット演算等に使われていた場合、64ビット化移植時が困難になる。

以下は64ビット化移植に影響する基本的なマジックナンバーである。


値説明
4ポインタのバイト数
32ポインタのビット数
0x7fffffff32ビット符号付き整数の最大値、また32ビット型の最上ビットのマスク値として使われる
0x8000000032ビット符号付き整数の最小値、また32ビット型の最上ビットのマスク値として使われる
0xffffffff32ビット変数の最大値、またはエラー値-1として使われる

マジックナンバーは、sizeof()演算子や、のマクロで置き換えるべきである。

64ビット環境でNGな例

// 1) intptr_tの動的領域確保にマジックナンバーを使用している。
//    intptr_tは32ビット環境では4byteだが64ビット環境ではは8byte
size_t ArraySize = N * 4;
intptr_t *Array = (intptr_t *)malloc(ArraySize);

// 2) 64ビット環境ではsize_tは8byte
size_t values[ArraySize];
memset(values, ArraySize * 4, 0);

64ビット環境でOKな例
// 1)
size_t ArraySize = N * sizeof(intptr_t);
intptr_t *Array = (intptr_t *)malloc(ArraySize);

// 2)
size_t values[ArraySize];
memset(values, ArraySize * sizeof(size_t), 0);

4. int型数値のdouble型変数への格納

32ビット環境では、intが4byteでdoubleが8Byteのためint値をdouble型変数に格納しても問題なかった。64ビット環境では、以下の図のとおりsize_t等の変数が8byteになるため変数がオーバーフローする可能性がある。
// 1) 32ビット これはOK
size_t val1 = SIZE_MAX; // size_tはunsigned intと同じで4バイト
double val2 = UINT_MAX;

// 2) 64ビット これはNG
size_t val1 = SIZE_MAX; // size_tは4バイトとなる
double val2 = UINT_MAX; // オーバーフロー

5. ビットシフト

64ビット環境のことをあまり考えずにビットシフトをすると、以下のような問題に陥ることがある。

64ビット環境でNGな例
ptrdiff_t SetBitN(ptrdiff_t value, unsigned int bitNum)
{
// 1はint型リテラルなので、4Byteの範囲しか値を取ることができないため、
// 8Byte変数のビットシフトができない可能性がある
ptrdiff_t mask = 1 << bitNum;

return value | mask;
}

ここで何が起きているかというと、
以下の図のように32Bit変数に1の値が入っている場合、32回ビットシフトすると桁があふれて値が0となってしまう。一方、64Bit変数は32回以上ビットシフトしても値があふれることはない。



64ビット環境でOKな例
// 数値1のptrdiff_t変数を生成する
ptrdiff_t mask = ptrdiff_t(1) << bitNum;

ptrdiff_t mask = CONST3264(1) << bitNum;

6. ポインタアドレスの保存

32ビット環境では、intとポインタのサイズがともに4Byteであるため、ポインタをintにキャストしてアドレス演算をすることができた。64ビット環境では、メモリサイズ型のuintptr_t型を使うと別アーキテクチャへ移植できて良い。

64ビット環境でNGな例

1) char *p;
p = (char *)((int)p & PAGEOFFSET); // ポインタをintにキャストしてはいけない

// mallocの戻り値(void *)をDWORD(unsigned int)にキャストしてはいけない
2) DWORD tmp = (DWORD)malloc(ArraySize);

64ビット環境でOKな例

1) char *p;
p = (char *)((intptr_t)p & PAGEOFFSET);

2) DWORD_PTR tmp = (DWORD_PTR)malloc(ArraySize);

64ビット環境でも少ないメモリしか利用していない時は再現しないので、非常に発見が困難なバグになり得る。上記NG例はメモリ使用量が4GBを超えた時点で、動作は未定義となる。

8. 配列のキャスト

64ビット環境では、配列のキャストが危険な場合とそうでない場合がある。
int array[] = {1, 2, 3, 4};
enum ENumbers {ZERO, ONE, TWO, THREE, FOUR};

// 安全なキャスト
ENumbers *enumPtr = (ENumbers *)(array);
cout << enumPtr[1] << " ";

// 危険なキャスト
size_t *sizePtr = (size_t *)(array);
cout << sizePtr[1] << endl;

// 32ビットプログラムでの出力結果: 2 2
// 64ビットプログラムでの出力結果: 2 17179869187


ここで何が起こっているというと、以下の図のように64ビット環境でint、enum型は4Byteだがsize_t型は8Byteのためである。

9. メモリサイズ型を引数に持つvirtualなメンバ関数

virtualなメンバ関数をもつ多くなクラスがある場合、不注意でメモリサイズ型を別の型と混同して使ってしまうことがある。32ビット環境はこれでも問題ない。例えば、基底クラスのvirtualなメンバ関数にsize_tを使い、派生クラスにはunsignedを使ったとしよう。64ビット環境では問題が生じてしまう。

しかし
class CWinApp {
...
virtual void WinHelp(DWORD_PTR dwData, UINT nCmd);
};
class CSampleApp : public CWinApp {
...
virtual void WinHelp(DWORD dwData, UINT nCmd);
};

ここでアプリケーション開発のライフサイクルを考えてみよう。例えば、Microsoft Visual C++ 6.0を使ったCWinAppクラスのWinHelp関数を以下のようにプロトタイプ宣言したとする。
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);

派生クラスのCSampleAppでこの関数をオーバーライドすることに特に問題はない。その後、このプロジェクトはMicrosoft Visual C++ 2005にポーティングしたとする。

FC2→Bloggerに移行する際にやったこと


※以下の設定メモは2012/12/09時点です。Bloggerがバージョンアップすれば手順が変わる可能性があります。

  • FC2からブログ記事をBloggerにインポートする
以下のサイトの手順で問題なく移行可能
http://ss117935.blogspot.jp/2012/05/fc2-blogger.html
  • デザインテンプレートを設定する
Blogger Templatesのページから好きなテンプレートをダウンロードし、以下の手順でBloggerに設定する。
  1. ダウンロードしたページを解凍し、“テンプレート名.xml” ができる
  2. Bloggerの管理ダッシュボード→「テンプレート」→「バックアップ/復元」をクリック
  3. 「ファイルを選択」をクリックし、Bloggerに、“テンプレート名.xml”をアップロードする

  • Google Code Prettifyを導入してコードのシンタックスハイライトをする
Bloggerの管理ダッシュボード→「テンプレート」→「HTMLの編集」を開き、以下のコードをheadタグ内のどこかに挿入する。すると、GoogleのCDNからjquery, prettifyを取得して<pre class=”prettyprint”></pre>内のコードをシンタックスハイライトしてくれる。
<!-- jquery 1.7.2 -->
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js' type='text/javascript'/>

<!-- Google Prettify -->
<link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/>
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/>
<script type='text/javascript'>
$(function() {
  prettyPrint();
});
</script>
</head>

  • table要素のスタイルを設定する
Bloggerの管理ダッシュボード→「テンプレート」→「カスタマイズ」→「アドバンス」→「CSSを追加」をクリックし、以下のコードを追加する

table {
    border: 1px #E3E3E3 solid;
    border-collapse: collapse;
    border-spacing: 0;
}

table th {
    padding: 5px;
    border: #E3E3E3 solid;
    border-width: 0 0 1px 1px;
    background: #F5F5F5;
    font-weight: bold;
    line-height: 120%;
    text-align: center;
}
table td {
    padding: 5px;
    border: 1px #E3E3E3 solid;
    border-width: 0 0 1px 1px;
    text-align: center;
}

参考にさせて頂いたページ

クリボウのBlogger Tips
http://www.kuribo.info/