スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C の ++

C言語をやり始めて半年ほど。sizeofの次にやられたことです。

とある関数

void hoge(int *a){
*a++;
printf("%d\n",*a);
}


1を渡したら2って出るんじゃないの!

って話です。

「++」と「*」の優先度って「++」の方が高いなんて!!!

どうみたって弱そうじゃん!(筆者は優先度を強さのイメージで捉えているようです)

むぅ。

(*a)++;

とするか

*a += 1;

とすればOKっす。


ねよっと。
スポンサーサイト

ubuntuserverからDebianへ

時代の流れとは反対にubuntuserverからDebianへ移行することにした。
理由は以下。(注:Linux歴が半年もない筆者のレビューです)

~Debian~
○ 初期内容が極端に少ない130Mしかない(不要なものはいれない=セキュリティポリシーに合っている)
○ 伝統と歴史があるディストリビューションである(資料が多い)

× 日本語の対応は悪い(Linux自体がそうなんだろうけど)
× 保守的すぎて最新の技術導入が遅い

△ アップデートが遅い(必要なアプリだけ導入するスタイルを考えると他と比べられない点も)

印象:素直な感じ

~UbuntuServer~
○ インストールが早い
× 無駄なものを入れないといいつつ初期インストールでもいろいろ入ってしまう
× 歴史が浅い
× ベースがDebian/sidからの派生らしい(お試し不安定版)
× 動作させていたが細かいバグが目について困っていた(修正の資料は結構出回っているが面倒)

△ 半年に一回のアップグレードされる(サーバーとしてはいいのかわるいのか・・)
△ アプリが多く導入が楽だがserver用途としてはあまり無意味
△ 日本語化がDebianより楽らしいが9.04、9.10ともに日本に優しいとは思えない

× server版とdesktop版があるせいでWEB資料の検索がうまくいかない
印象:すました感じ


重要なのは印象。ってことで変えることにした。

日本語の問題はどうせリモートで操作だし、まる無視。
そもそもUbuntuはDebian系なので操作はほとんど一緒。fedoraから移行したときの苦労は無かった。



ねよっと。

USBメモリをCDのように使う!

Linuxのインストールをしていて「今更外付けCDってどうなんだろう?・・・」と思い出した。
まてよ。USBブートできるわけだしUSBをCDだと思わせればいいわけだよな~と興味をもちやってみました。

結論:できました。

やり方:
ここでunetbootin-windows-408をダウンロード。
・ISOファイルを用意。
・PCにUSBメモリを差し込む。
・UNetbootinを起動。
・真ん中の「Diskimage」 で「ISO」を選択。右にisoのパスを入力
・一番下の「Type」が「USB Drive」になっているか確認
・一番下の「Drive」で書き込むメモリの差し込んであるドライブを選択
・右下の「OK」を押す
・お菓子をむさぼり、待つ


さっそくOSインストール!おぉ、何の問題も無く動きます。
4GのUSBメモリが900円の時代です。知っていると何かと便利かもしれません。

ちなみにUbuntuServer9.10は上記のものをそのままインストールできました。(最初の画面でinstallを選択)
debianでやってみたところCDドライブを探す画面がでてきちゃいます。
手動で設定する画面を出せたので/dev/sdaとか/dev/sdbなど入れると進めるかもしれませんが、環境によるでしょう。未検証。

OS(でぃすとりびゅーじょん?)はUbuntuServerからDebianになるかもしれない。
Debianは触ってみてとても使いやすい。なんというか「素直
もう少し細かい感想は明日にでも書きます。


ねよっと。

UDP通信

UDP通信の骨組みが完成しパケットを作成していてふと思った。
1パケットでどれくらいの大きさまでいけるんだろう??・・・

早速調べてみた。

・UDP パケットのサイズを 512 バイトより大きくする場合、 ホスト以外のデバイス (ルーターなど)の中には 512 バイトを超える UDP パケットをサポートしていないものがある点を考慮しなければならない

・PC自体(レジストリ)にもUDPパケットの最大サイズを指定するMaximumUdpPacketSizeという項目があり512 ~ 16384 の範囲で指定できる。デフォルトでは1280 バイト。

・Ethernetのフレームサイズの上限は1500バイト。
IP側で分割(Fragmentation)と再組立(Re-assembly)という機能があるため1500以下に規制されることはない。

・IP仕様書には最大長を規定しない代わりに「総てのサブネットワークは少なくとも576バイト長のデータグラムが処理できること」としている。
MTUの大きさに関わらず、576バイト以下でIPデータグラムを実装しろとな。

・IPv4ヘッダは20バイト。

・UDPヘッダは8バイト。(送信元ポート番号)(送信先ポート番号)(UDP長)(チェックサム)

・UDPで「安全」に送れるデータは548バイトまで(576 - 20 - 8 = 548)


結論:上記から最大は512バイトにしておこう。

具体的には:
FPSネットワーク対戦で仮に、

アプリケーションレベルのヘッダ+フッタ=4バイト
登録人数=1バイト
floatのXYZ情報=32bit*3=一人あたりの位置情報は12バイト
視点情報は精度により1バイトから12バイト(悩み中)


とすると
高精度だとして21人分となる。(11:11が限界)
モーション情報を含むとするとやはり視点ベクトルをを痩せさせるほうがいいのかもしれない。
別のパケットを用意して送ることも要検討といったところかな。

FPSやTPSのチーム戦で自分が生き返るまでの時間に仲間の視点になるゲームがよくあるが、照準方向まで再現してくれるものとそうでないものがある。
この辺を削ってしまうと再現しにくいことになる。悩む




話は変わって、1:複数のUDP送信には「マルチキャスト」が言いという話を聞いて調べてみたが、内容を見てみるとゲームに使う「それ」とは勝手が違い流用できず、がっかり。(手間が減り気分が良い。わーい)

ねよっと。

プロパティでカプセル化した先のPrivateメンバがクラス内部から簡単に触れる件。

このように

class hoge
{
private int a;
public int b
{
get { return a; }
set { a = value; }
}
}

せっかくカプセル化したaですが、クラス内部から簡単に触って欲しくないという経験はありませんか?
私はありまくります。

一人でプログラミングしてるので覚えていればどうでもいいのですが。
基本的に「あほ」なのですぐ忘れるんです。ええ鳥のように。3歩っす

変数宣言時に頭に何かつければ保護できると思って探したのですがそれらしいのが見つからず。
C#はこういうときに気の効くいいやつなんだがのぉ~

さっと考えた方法では
・親クラスを作成しaをそのメンバに移動
・子クラス(hoge)からはbでしかアクセスできない

これで保護できるけど視覚的にクラスの全容が見えにくい設計はナンセンス。

結局いつものように
private int _a;//触るな危険
と記述。

結論:アンダーバーは偉大なりね。


ねよっと。
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。