変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2016 / 5月

C言語は難しいのか?

C言語は難しいと云う風評があるらしい。
実のところ、C言語はマクロアセンブラ並みの簡単な言語で、決して難しくはない。
ただ、書いた奴が下手だったらどうしようもない。
if(  i == 1 ) は
if( i=1 ) とやってしまいそうなので
if( 1==i ) が望ましいとかは
そういう知ったかブリはどうでもいい。
どうしてもトラブルの原因だっていうなら
if( i=1 )をワーニングくらい出すように要望書を書けばいいのだ。
それをしないから「知ったかブリ」でしかないのだ。
で、閑話休題。
例えば、実行時のパラメータとして、1~3を指定できるとしよう。
int  option = -1; /* 0 でもいいし、99でもいい。1~3以外なら何でもOK */
if ( isdigit(argv(1)) ) {
option = atoi(argv(1)));
}
switch(option) {
default: /* error */ break;
case 1:   1 の処理(); break;
case 2:   2 の処理(); break;
case 3:   3 の処理();  break;
}
void 1 の処理() {  … }
void 2 の処理() {  … }
void  3 の処理() {  … }
な感じに書いてくれれば、
短いので読みやすいがこれを
if ( !strcmp(argv(1),”1″) {
長い1の処理
・・・
※が延々と続く。
・・・
} else if ( !strcmp(argv(1),”2″) {
長い2の処理
・・・
※が延々と続く。
・・・
} else if ( !strcmp(argv(1),”3″) {
長い3の処理
・・・
※が延々と続く。
・・・
} else {
エラーの処理
※が延々と続く。
}
と書かれただけで、長くて読みにくい。
だが、これは他の言語でも同じハズだ。
 
よく見かけるログ出力にしても
int debug_flag = 0;
if( debug_flag && ログ処理(・・・とっても長い・・・) );
を1999年頃のプリプロセッサなら・・・
int debug_flag = 0;
#define DEBUG_LOG(…)  if( debug_flag && ログ処理(__VA_ARGS__) );
で済むハズ。※もう少し古いと妙な書き方になる。
そんな3簡単に気づたプチなアイデアすら出てこない。
思いつかないだけなのか?
もしかしたら今現在の一般的なC言語の参考書の出来が悪すぎるのかもしれない。
それ以上に
一番問題なのは
テスト・エミュレーターを作る気が全くないことかもしれない。
予算とか時間とか理由はついて来るが・・・
 
本当のところは
UIと云えばGUIしか見えない時世なので
 
エミュレーターって何?
何作ればいいんだぁ?
 
なんだろうなぁ・・・(終わってる
※エミュレーター:実機でテストすると延々と終わらないテストを手っ取り済ませるためのツール。実機が数MHzから数GHzに高速化されたら、すたれてしまったらしいが、シェルスクリプトとC言語のプログラムの組み合わせを考えると、シェルスクリプト自体がエミュレータでもあるが、今となってはエミュレーターという昔の臓器の名残(≒尾てい骨)の扱いになっている。



GeForce GTX 1080の記事を眺めながら・・・

最近FF14に復帰して以来、パソが時々フリーズするになったので、気になって仕方がないGeForce GTX 1080。
性能が上がっているのに消費電力(TDP)が200W未満なのが一番気に入っている。
VRAMは諸所の都合でHBM2ではなくGDDR5Xでメモリバスは256bitになっているが、メモリの性能がずば抜けているので、大きな問題にはならないらしい。
まだ時々めまいがするので、VRやHMDは使わないつもりなので、オーバースペックかもしれないが、同じグラボ(HD7950)を何年もFF14でプレイするのはさすがにグラボに負担(特にファン)がかかるだろうから、来年中には何かにアップグレードしようかと思っている。
※ID(ダンジョン)を初回クリアした後にエフェクト満載のムービーが流れるとグラボのファンの回転数が一気に上がるのでムービーが一番無理をかかっている気がしている。
FF14ではPS4のゲームパッドを使っているので、HMDを装備してプレイしても支障はない様な気もするが、HMDを装着したままキ-ボードでチャットは無理だろう。
え?常時ソロプレイだからチャット不要のハズ?
ID(ダンジョン)では「初見です。よろしくお願いします。」と、ちゃんと挨拶してますよ。
※「初見です。」と云わないと・・・「ギミックを踏んで頓死しても蘇生してもらえない」
※ボクが行く様なIDでは慣れれば誰も死なないから・・・ボスを倒した後にHP0に気が付くヒーラーは多い。
ゲームパッド使用時もキーボードは必須です!
ただボクの予算は少ないので、いづれAMDがPolarisのミドルレンジのグラボが出し、nVidiaが対抗してミドルレンジのグラボ(1060かな?)が出るだろうから、そのどちらかがボクの本命になりそうだ。
それに(グラフィックスの性能次第だけど・・・)、2016年中に出るかもしれないZen(APU版)を水冷し、mini-ITXケースという選択肢も残っている。
年末には、どれになっているだろうか?



【EXCEL】 セキュリティ警告を消す方法

ファイルサーバのEXCELファイルを開くと セキュリティ警告 のバーが出る。
しかし、このバーを閉じ保存しても、開くとまた出てくる。
なので、ファイルのある場所を「信頼できる場所」に登録しなければならないらしい。

EXCELから セキュリティ警告を消す方法

  1. ファイル⇒オプション
  2. 左のセキュリティセンター
  3. 右の【セキュリティセンター】ボタン
  4. 「信頼できる場所」を押す
  5. 下の「プライベート ネットワーク上にある信頼でいる場所を許可する」にチェックを入れる
  6. 【新しい場所の追加】ボタン⇒セキュリティ警告を表示したくないEXCELファイルのおいてある場所を入力
  7. 【OK】ボタンを押して保存

当然サブフォルダも含める様にした方がいい。



【CentOS7】 DiCE for Linux インスト失敗

CentOS5か6の頃、WAN側のIPアドレスを正しく取得できなかったので、Windows版のDiCEを今も使っている。
4月中はほとんど入院していた。
その間、自宅のWindowsのPCは停止したままだった。
もし3か月も入院していたら、
そして真っ先にルータがリセットする様な事態が発生していたら、
ここのブログのDDNSのアカウントの自然消滅という非常に厄介なことになっていたハズである。
今はCentOS7になっているし、再びDiCEを試してみる。
DiCE for Linux のバージョンは当時のままだった。
でもとりあえずやってみる。
wgetでダウンロードしてみると、URLのとおり download.cgi?p=diced019 というファイルが出来上がる。
名前をdiced01913.tar.gz に変更し、/usr/local/bin から tar zxvf diced01913.tar.gz で解凍。
setarch `uname -m` /usr/local/bin/DiCE/diced と実行すると
/usr/local/bin/DiCE/diced: ファイルが存在しません と云う内容のメッセージが出る。
lsコマンドで調べると実際にはファイルは存在していた。
dicedを直接実行してみると
/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
と出てくる。
setarch が/lib/ld-linux.so.2の部分を省いて「diced」と「No such file or directory」を直結し、/usr/local/bin/DiCE/diced: ファイルが存在しません となったらしい。
別にsetarchだけではない。パッケージが足りない時は大抵のアプリは同じ様にトンチンカンなメッセージを吐き出すのだ。
そして/lib/ld-linux.so.2 は64bit版のOSで32bit版のアプリを動かすためのパッケージらしい。
だったら32bit版のLinuxでDiCEを動かせばいいはずだが・・・

※CentOS7から64bit版しか存在しないのだ。

yum install ld-linux.so.2 でライブラリィを追加して、再びsetarchで実行してみる。

※古いプログラムなのでTeraTermをEUCに変えないと文字化けする。

しかし、WAN側のIPアドレスを取得させてみると、ダンマリになってしまった。
多分、CentOS7で LANアダプターの名前がeh0 ではなく enp3s0 のようにランダムなものに変わったせいな気がする。
※通常のアプリからeth0などと指定することは滅多にないが、LAN関係のコマンドが吐き出すテキストをgrepやawkで欲しい部分だけ切り取ってくる場合には重要なキーワードだ。
今ではinet-ip.infoなどの外部のWEBサービスを使えば・・・
# curl inet-ip.info
xxx.yyy.zzz.www
と簡単に教えてもらえるが、当時は そういうサービスも無かったのかもしれない。
しかもdicedはバイナリーな実行プログラムだった。
当然ソースは無い。
と云う訳で、ここで投了。
rm -rf /usr/local/bin/DiCE
yum -y remove  ld-linux.so.2
で、使っていないパッケージを消去。
今後もWindows版を使い続けるしかないようだ。
と思ってたら
利用しているDDNSのサイトに「Linux用のIPアドレス更新サンプルスクリプト(専用)」を発見。(気が付かなかった
ちゃんとWAN側のIPアドレスが得られるのでクローンに登録。
コレで解決。(完了!
と思ったけど 動かない
/var/log/cron を見ると
crond[638]: (*system*) RELOAD (/etc/cron.d/ddns)
crond[638]: (CRON) bad command (/etc/cron.d/ddns)
なぜだろう???
# crontab設定例(/usr/local/ddns/ddns.plにスクリプトを置き10分間隔で実行)
# 5,15,25,35,45,55 * * * * /usr/local/ddns/ddns-update.pl
のドコがおかしいのかな?
あ、crontabじゃなくて cron.d に置いたから
*/10 * * * * root /usr/local/ddns/ddns-update.pl
とユーザ名を指定しないといけない。
※ */10は10分間隔で実行の指定。5,15,25,35,45,55とほぼ同じ。
というかcrontabは各ユーザごとのcron機能なのでユーザ名の設定は省かれている。
と思った方がよさそうだ。
/etc/cron.d/ddnsの最終形

# DDNS
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
*/30 * * * * root /usr/local/ddns/ddns-update.pl

使用した先のddns-update.plは通常時は標準出力に何も書かないのでメールは飛んでこない(らしい
30分間隔にしたのは、もしメールが飛ぶような状況になったら10分間隔はちょっとマズいと思ったから。
そして、もしかしたらメールが飛んでくるかもと思い
待っていると
仕事メアドに続々と迷惑メールが届くのでした。(どうにかならないのかな?
とりあえずDiCEのためにWindowsのPCを立ち上げなくても良くなったので良しとしよう。




top