fc2ブログ

怖っ

HDMI端子もってなかったのでアマゾンで購入した。


で。今日来たと。
中国製ですよっていう明白な主張と共に。

ニュース聞いていると、爆発オチが多いから若干怖いなぁと思いつつ。
まぁ、普通に日本で普及しているってことは、問題ないんでしょうけど。


で。
警告カードがあって。【ハードウェアの電源切ってから接続してください】
って書いてある。

あれ?
HDMI端子ってホットプラグ(電源ついたまま接続可、USBとか外付けハードディスクとかがコレにあたる)
対応してなかったのかな?って思って調べる。

すると。
教えて!Watchの内容が一番上にでてきて、
ものすごく当たり前な回答が最初にでてきて。。。最後の方に専門的な方々と思しき人の回答。


>>コレはHDMI接続に限った事ではありませんが 抜き差しに生じる ショックノイズは場合により スピーカーなどを破損させてしまう可能性を持っています

まじすか!
D-sub端子とかDVI端子とかで普通に2、3回やっちゃったんですけど、過去にwwwww
さすがに大丈夫だと思うけどさ・・・


>>気をつけなければならないのは、入力の電力供給能力が大きい場合です。この場合は保護回路を焼きますから、注意しなければなりません

怖っ!マジ怖っ!


>>最終出力先のスピーカでそれこそ爆音が発生することになったりします。

爆発じゃなくて爆音すか!いやそれも怖いけどさ!



接続させるために電源落とすか悩む。めんどくさいからな~
ってか、普通に挿せるはずなんだけどなー。


ちなみに、話変わるけど、こういうときって選択に人の性格でますよね。

1、まぁ壊れることは確率低いから、問答無用で挿す
2、怖いから、電源落として無難に挿す
3、考えるのめんどくさいから、現状維持


俺はチキンなので無難に2番ですブフッ∵(´ε(●=(゚▽゚ )
ないと思うけど、ディスプレイ破壊したらたまったもんじゃないし。

ってことで、作業します♪
スポンサーサイト



プログラミングの実は。

時間が一時的に空いたので更新。


個人的な話になるんですが。

プログラミングの話って、理系向きって思っている人が多いんですよね。
なんでなんだろ?



私的にはそんなことないと思っているんですが。
理由は3つある。

【1】、一年頑張れば、最低限の習得はできる
【2】、数学的知識は、そんなに要らない事。(論理的思考の方が大きい)
【3】、プログラミングができるより、人の話を理解できる方がはるかに重要。


【1】、一年頑張れば、最低限の習得はできる
例え、大学から情報工学系の学部でプログラミングをやっていると言っても、
大体の人は、課題がやっとできる程度のプログラミング。
ひどい人はまともにプログラミングができない人もいる。

事実、1年必修のプログラミングの授業でTAをやっていたとき、専門的課程で電気電子系を選ぶ人
の中にはプログラミングが嫌だから、というネガティブな理由も結構いた。
3年の授業では、プログラムのエラーをまともにデバッグ(直すこと)しきれない人もいた。

情報工学系学部の人だからといって、プログラミング能力などその程度の人だっている。
だったら、理系だからというのは、もはや関係ない気がする。
もしかしたら、私がやっていることすら社会では児戯に等しい事なのかもしれない。
(まぁ、それはないと思いたいのですが・・・)

【2】、数学的知識は、そんなに要らない事。(論理的思考の方が大きい)
数学的知識は、持っているに越したことはないのは確か。(様々な数学的知見を生かせるから)
しかし、だからといって現実的に使用することはあまりないと思う。

少なくとも。
行列の詳しい知識を必要とする事はほぼないし。(3次元グラフィックや画像データの処理くらい?)
微分積分も厳密に使用することはないし。(数値のシミュレーションでなら擬似的に使ったことあるけど・・)

最悪、ググってしまえば出てくる数式を忠実に再現してしまうだけで解決するかもしれない。
本当このレベル。じゃあ、どうやってプログラムを作っているのかって?

プログラムなんて、ほぼ日本語でかけるのですよ。
例えば。ファーストフードの話とか。

まず。
ファーストフードとしては、【客が来て注文をする】をしないと
何もできないので、ここまでは前提とする。。。。すると?

1、【レジ】が【客】が注文した商品の代金の合計値を計算
2、【レジ】が【客】に代金を請求
 ├──────────────お金を払わなかった → 注文キャンセル
お金を受け取る
 ↓
3、【レジ】が注文した商品を【調理場】に伝える
4、【調理場】は注文された商品を調理する
5、【調理場】は商品を【レジ】に渡す
6、【レジ】は【客】に商品を渡す

っていう過程をふめばOKである。
じゃ、これをプログラムで書こうと思ったら?
詳しくはめんどくさいので書かないけど、そんな難しくない。

もちろん。
あくまでこれは、ファーストフードを概念で説明したモデルだから
具体的な話にはいるとめんどくさい所はあるんだけど・・・。

でも、根本はこうやってプログラムを組むもの。
どうですか。数学的な話なんてありましたか?


【3】、プログラミングができるより、人の話を理解できる方がはるかに重要。

一般的にプログラムは汎用的に組むことができます。例えば・・・、
例:
(1).書かれた値(入力)を認識して、全ての合計値を出す機能
(2).書かれた式(入力)を解釈して四則演算を可能にする機能

さて、これはどっちのプログラムの方を組むのがいいのでしょうか?



答えは、【プログラムの目的による】です。

例えば、全部の合計値だからといって、23+45+...と書くより、23,45,...,と書いたほうが
列挙しているという直観的意味では分かりやすいですし、理解されやすいかもしれません。
また、簡単な方がプログラムを書く方も楽で、ミスも少なくなります。

逆に、四則演算が必要な事になるのなら実装すべき。電卓で(1)のような機能じゃどうしようもありません。

また、(2)のような複雑な機能の場合、コンパイラ方式のプログラムを採用した場合、
内部にスタックや後置記法を実装しなければいけないかもしれません。

・・・まぁ、つまり、単に合計するより複雑な処理を記述しなければいけません。
時間もコストも余計にかかっちゃうかもしれません。

じゃあ、この差はどこにあるのかって、いったら・・・。
****プログラムの目的、ユーザが欲する仕様**** 次第なんですよ。

それを理解するのは、プログラムを書くより重要。そりゃそうですね。
無駄なモノは作るとコストがかかっちゃいますし、ましてやユーザの目的と違うモノなんて作っちゃったら
コストの無駄なだけではなく、下手すりゃ損害にすらなっちゃいます。

つまり、プログラムを書くより大事なのは、【人の話をちゃんと理解する】こと。
その上で、プログラムを作成すべきなのです。

実際、大手IT企業の求人は、文理は問わないのが普通っぽいです。
少なくとも、理系しぼって集めてた企業は一応なかった気がします。
(まぁ、表向きかもしれませんけど・・・)

だから、プログラミングは難しい。理系じゃないから・・・
って理由で断る人は、個人的には、よくわからない。

まぁ、ブラックがなんたら・・・って聞くからかもしれません。
まぁ社会人になってない自分がこういうのは、おかしいですが。
一部の食品系やサービス業の方がよっぽどブラックだと聞いてます。


まとめ。

プログラミングは、理系・文系というより、その人のモノの捉え方(モデル化)の能力次第だと思う。
むしろ、理系じゃないからやっても、理解できないということはない。

もちろん、その方向に興味がないなら仕方ないブフッ∵(´ε(●=(゚▽゚ )

プログラムの高速化の話

後輩にどんな内容でもいいから書けといわれた。
ちなみに、11月末の方に発表があるんで将棋の話などしてる余裕は基本ありません。
っていうか、何もしてないような感じなので書きようもありません。

と、いうことで、今最近学んだプログラムを高速化する方法に関して簡素に書きます。
使える人もいるかも?・・・まぁ。ほぼ使わないでしょう。


****演算子の高速順****

コンピュータは、基本的に加算しかできません。
本当の話ですよ?

でも加算が使えれば、乗算が使える。
a × b  → (aをb回足しただけ)
例 : 5 × 3 = 5 + 5 + 5 = 15

同様に減算ができれば、除算も。
a÷b → (aがb以下となるまでbを引いた回数)
例: 16÷4 → 16-4=12(1回目) 12-4 =8(2回目) 8-4=4(3回目) 4-4=0(4回目) 0は4未満なので終了。

同様に拡張すれば、対数、べき乗もできます。

ちなみに、これだけでは整数しかでませんが。
実数はちょっと拡張すればできます。


で。なぜこんな話をするのか?一般的に、演算子には難しさが存在します。

(簡単)ビット演算・シフト演算子 → 加算・減算 → 乗算 → 除算・乗除 → 累乗・平方根・三角関数など(難しい)

で、この難易度は、計算の速度に関わってきます。
もちろん。100回くらいの計算なら、どのように書いたって基本的には変わりません。

高速なプロセッサ、例えば自分のCPU(Intel Core i7 3770K 3.5GHz)とかだったら、理論上1秒間に
0.2857ナノ秒×(演算子の単位当たりの命令量)で1命令を実行します。
加算一回であればナノ秒レベル。そんなの100回やっても何百ナノ秒です。
すぐ終わります。

しかし。例えば。通常意味のある計算は、一回の演算では終わりません。
例えば5個の要素の平均を求めるには?
(x0+x1+x2+x3+x4)÷5
つまり。加算4回、除算1回というふうになるわけです。

難しいものを計算しようとすればするほど、一回あたりの計算も増えて。。。。
これを仮に10000回やって。。。
このように多くの繰り返し処理になると、単位当たりの計算時間の高速化が大きな効果をうみます。


例えば。
x^3 + 3x^2 + 3x + 1 = (x+1)^3
について考えてみましょう。

左辺 = x^3 + 3x^2 + 3x + 1 = x*x*x + 3*x*x + 3*x + 1
つまり、乗算5回、加算3回。

右辺 = (x+1) * (x+1) * (x+1)
乗算2回、加算3回(x+1は同じ変数に入れれば加算は減ります)

この動作をN回繰り返すとすれば、左辺と右辺では同じ式ですが
プログラムの速度は (一回当たりの高速率)*N 早くなります。


このテクニックは因数分解の話だけではない。
例えば、演算子の難しさは。乗算<除算 なので
さきほどの平均値なんて、(x0+x1+x2+x3+x4)÷5 より
(x0+x1+x2+x3+x4)×0.2 の方が少し早い。


まだまだあります。
ビット演算子というを最初でいいましたが。(1100(12)は、2進数で1100で10進数で12ってことです。)

これらは、**ビットごと**にAND演算(1と1のときのみ1)、OR演算(1が少なくとも1個あれば1)などを行う演算です。
例えば、 1010(10) と 1100(12) のビットAND演算だったら、ビットごとのANDなら
は、1000(8)となります。

こんなわけわからない演算をどこで使うかって?
いやいや、普通に今見ているインターネットでも使われてますよ?
コマンドプロンプトを開いて、
ipconfig
って打ってみりゃネットワークに関する設定が出てきます。ここのサブネットマスクってので使われていますよ!

ま、簡単にいえば、IPアドレスに関するもんです。
なら、始めっからそう言えって?
すいません。


あと、シフト演算。
これは、桁をシフトする演算。1010(10)を1ビット右シフトすると 101(5)。
逆に1ビット左シフトすりゃ。。仮に正の数なら、10100(20)になります。


これらを使えば、奇数か偶数か判断したいときに楽になる。

普通の人が思うのは、あるxを2で割った時の余りが0なら偶数!1なら奇数!っていう回答。
しかし、それには乗除を用いなければいけません。

しかし。実際はビットAND演算一回だけでいけます。(例:N(確認する数) bitAND 1 → 0(偶数)か1(奇数))


他には。2^iで除算とか乗算とか。
これらは、たった1回のシフト演算だけでいけます。iビット右シフトすれば2^iで除算、
左シフトなら2^iで乗算になるのだ!

あ、もちろんそれ以外はめんどくさいことなるけどね?
まぁ、6の乗算くらいなら、6*N = (4+2)*N = 4N + 2N 使えば結構簡単になるけどね?



さてさて!
これ以外にもあるけど、キリがないので!

ここで、ある程度ぶっちゃけたこと言いますと、
ある程度は実は、コンピュータが最適化してくれます。
まぁ、ここまで出た一部はやってくれちゃうんですね。勝手に。


じゃあ、こんな知識いらないじゃないかって?


ノンノン♪


例えば。コンピュータは言われたことしかできないから、
例えば、さっきいった2^iで割られるかどうかなんて、知ったこっちゃない。
(だって、仮に違ってたらプログラム自体が書き換わってしまう。)


つまり、この部分はプログラマーの腕の見せどころなんですね。
ちなみに、高速化としては、こんなの氷山の一角です。

他には、
1. マルチコアを生かした並列処理
2. メモリの局所参照性を生かしたデータ構造
3. ループの内部の最適化・並列化
4. よりよいアルゴリズム(計算順序・計算方法)の開発

とかがある。
こういうのは、プログラムする言語にも依存してしまうし、コンピュータの構造にも依存してしまう。
特にマルチコアを生かした並列処理なんて、全体のデータの在り方を見直す可能性すらありえる。


3Dのゲームのプログラマーを私がすごいと思うのは、自分が作った高々6万回程度の計算を繰り返し行うプログラムですら、苛立ちを覚える反応性の悪さを生み出してしまう。
それに比べ、現在のデスクトップパソコンのモニターの主流は1920×1080=207万3600個の画素を更新し続けていても、それ相応に反応性の良いゲームを実現する。
いくらビデオカード(グラフィックボード)が高速でも6万とは比べ物にならない。


ゲームクリエイターになろうとは思わないが、この技術だけはいづれ手に入れてみたいものではある。
↑