Javascriptで小数点以下を取り出す

Javascriptで小数点以下を取り出す方法で,すごく短く記述できる方法を初めて知ったのでメモ.

num = 123.456789;
point_num = num - (num | 0);

これだけでpoint_numに小数点以下つまり0.456789が入る.
なんでも,(num | 0)で小数点以下を切り捨てた値(例では123)となり,元の数からこの数を引いてやると,小数点以下の値が取れる.

計算誤差があったりするかは未確認.とりあえず簡易的に取り出したい場合は楽にできそう.

家庭用ゲームのダウンロード販売とか

最近は,スマホや家庭用ゲームでもほとんどゲームがダウンロード販売ができる.
ただ家庭用ゲームを購入する際は,スマホのようにアプリを購入する際はダウロード販売のみだけでなく,
ダウンロード販売と店頭でのパッケージ販売という2つの選択肢が考えられる.

実際どっちを選べばいいのか困ることも多いので,それぞれの購入方法の違いを適当にまとめておく.
(ゲームを購入する側であるユーザの視点からの記述です)

  • 店頭での購入かダウンロードか

当然だが,パッケージ販売の販売の場合店頭での購入(もしくは通販)になり,ダウンロード購入の場合は自宅等でネットワークを介して行う.ダウンロード購入はわざわざ外出したりする必要がない.

  • パッケージの有無

これまた当然だが,パッケージ購入した場合はゲームのデータの入ったメディアや説明書などがついてくる.
パッケージがあることによるメリットとしては,物理的なパッケージでコレクター欲が満たされるが,逆にパッケージが必要ない場合は邪魔でしかない.

  • 価格

通常,発売日の価格はダウンロード販売のほうが少し安い.
ただ各店舗はどんどん値下げをしたりするので,結局はパッケージのほうが安い場合が多い.

  • 購入特典

各販売方法の特性上,店頭でのパッケージ販売は購入特典でいろいろついてきたりするが,ダウンロード販売ではついてこない場合が多い.最近ではダウンロード購入者も特典を享受できるように,ダウンロードコードがついてきて,特別なダウンロードコンテンツを入手できることもあったりする(気がする).

  • 中古販売

パッケージ販売の場合は中古での購入,売却が可能であるのに対し,ダウンロード販売ではそれができない.
前述した価格にも関連するが,中古の場合,価格も新品よりも安い(ことが多い)ので買いやすい.

  • 再購入

パッケージのメディアを紛失,破損してしまった場合,再購入が必要.一方ダウンロード販売ではダウンロードした後HDDなどが故障しても,追加料金なしで再ダウンロード出来る場合が多い.

個人的には,物理的なパッケージや特典が欲しい場合,パッケージ販売が安い場合はパッケージでの購入,物理的なパッケージがいらない場合はダウンロード販売がいいのかな?と思う.
これまではパッケージ購入をすることが多かったけど,一人暮らしをはじめてからは物理的にかさばるのが嫌なのと,もともと中古ショップへの売却はしない人なのでダウンロード販売を利用することが多くなっている.
ただ古いゲームなどでパッケージが圧倒的に安い,あるいはパッケージの特典が欲しい場合はパッケージで購入してます.

printfでchar型の値を2桁の16進数で出力する

C言語で1バイト単位で数値を扱うためにchar型を使用した.その時にprintfで2桁の16進数として出力しようとすると0x80を以上の値は以下のプログラムだとうまくいかない.

#include <stdio.h>

int main(){
  int i = 0;
  char str[] = {'a', 'z', 0xCC, 0x34, 0x80, 0x7F '\0'};

  for(i = 0; str[i] != '\0'; i++){
    printf("0x%02X ", str[i]);
  }
  return 0;
}

実行結果

0x61 0x7A 0xFFFFFFF8 0x34 0xFFFFFF80 0x7F 

こんな感じで4バイト表記になってしまう.
これは(多分)char型の値域は-128〜127なので,str[i]が負数扱いになってその後4バイトにキャストされているのが原因じゃないかと予測.
というわけで一旦符号なしの整数(unsigned int)にキャストしてやることで解決,すると思いきや先と同じ結果に.
どうやらunsigned intの値域に負数はないなので結局同じ結果になってしまうようだ.
しかたないので負数のデータサイズ拡張時には拡張されたビットは全て1で埋められるので,以下のようにして解決した.

#include <stdio.h>

int main(){
  int i = 0;
  char str[] = {'a', 'z', 0xCC, 0x34, 0x80, 0x7F, '\0'};

  for(i = 0; str[i] != '\0'; i++){
    printf("0x%02X ", str[i] & 0x000000FF);
  }
  return 0;
}

実行結果

0x61 0x7A 0xCC 0x34 0x80 0x7F 

なんかもっと良い解決方法がある気がする.

テイルズオブエクシリアで起動時に画面が真っ黒になって進行が停止する?

PS3でテイルズオブエクシリア(以下,TOX)起動時に画面が真っ黒になって進行が停止.
やむを得ず一度PS3をリセットしてもう一度試したら,またもや同様の現象が発生.
そこでたまたまバックグラウンドダウンロードしていたのが悪さをしているのではないかと思い,ダウンロード完了後にもう一度起動すると普通に起動した.

色々試行錯誤した結果どうやらTOX起動時にダウンロード待機中のゲームがある(TOX起動によってダウンロード中のコンテンツがダウンロード待機中となる)ときにフリーズするみたい.
(きちんと検証したわけでは無いのであくまで仮説である.また自分の環境でだけ発生しているのかもしれない.)

ちなみに,ダウンロード中のコンテンツのダウンロードを一時停止している場合や,TOX起動後もダウンロードが続行される場合は問題なかった.

他にも同様の症状が出ている人はいるんだろうか?

Eclipse 3.5.2でソース・ホバーの背景が真っ黒になる

C/C++プログラムのためにUbuntu 10.10でEclipseを使っているときに,自分の環境のデフォルト設定ではソース・ホバー*1の背景色が真っ黒になってコードが見えなかった(下図参照).

*2

調べてみると原因はシステムのデフォルト色が使われる設定になっていて,それが黒になっていたらしい.
というわけで直してみる.

*以下は日本語化したEclipseでの場合です.他の言語でも同様の操作はできると思うので適宜読み替えてください.

  1. 「ウィンドウ」→「設定」で上図のような設定ダイアログが表示される
  2. 設定ダイアログで「設定したいプログラム言語(ここではC/C++)」→「エディター」をツリービューで選択
  3. 「外観色オプション」のところに「ソース・ホバー背景色」があるのでそれを選択.
  4. 選択した右側にある「システム・デフォルト」のチェックを外し,「色」で任意に背景色を設定
  5. 変更を適応

でなおった.こんな感じ.

というわけで一件落着.

*1:ソースコード上の関数等をマウスオーバーしたときに,その定義内容を参照して表示する機能

*2:画像にある関数hogeの戻り値の型と変数の型が一致していませんが気にしないでください.