2014年10月4日土曜日

放送大学大学院の過去問を解いてみる。

放送大学大学院の修士全科生入学者選考筆記試験問題の平成26年と平成25年の第2問ソフトウエア分野だけ一応解いてみました。

平成26年度大学院修士全科生入学者選考筆記試験問題 第2問
(1)
(ア)完全2分木の葉の数は$2^n$、葉以外のノードの数は$2^n-1$
(イ)木が持ち得る葉の最小の数は$2^1$で$2$、最大の数は$2^\infty$で$\infty$だろうか...
(2)
(ア)10011
(イ)引数の値を2進数に変換する

こういうのは実際に書くのが一番確実ですね。
平成25年度大学院修士全科生入学者選考筆記試験問題 第2問
(1)C言語の特徴とよく使われる分野はまとめるのは大変なのでwikipediaを見てね。
(2)
(ア)34512 -> 34152 -> 34125 -> 31425-> 31245 -> 13245 -> 12345
(イ)数字を降順にソートする機能。根拠は...すべての値に対してデータの比較と交換を行っているからでしょうか?
(ウ)$(n-1)+(n-2)+\cdots+3+2+1=\dfrac{n(n-1)}{2}$
(エ)$O(n^2)$

2014年9月27日土曜日

AsynchronousSocketChannelとAsynchronousServerSocketChannelを使ったサンプル

AsynchronousSocketChannelとAsynchronousServerSocketChannelを使って簡単なサーバクライアントサンプルを書いてみました。 Futureが返却されるので非同期タスクを細かく制御できるようです。これだけ長いクラスを使うのだから、それだけの恩恵は欲しいですね。

2014年9月15日月曜日

少しましなWebGLサンプル

はじめてのWebGLのサンプルはindex.htmlにGLSLもJavaScriptもすべて詰め込んでしまっていたので、GLSLをHTMLに書いて、JavaScriptは切り分けるように書き直した。webgl-debug.jsはDebugging - WebGL Public Wikiの物を使えばいいです。

2014年9月8日月曜日

必要条件と十分条件

少し前に考えていたけど必要条件と十分条件という言葉を日常生活や仕事でドヤ顔で使ってしまうと数学ばっかりやってる人にとっては混乱すると思った。まず数学ではこんな感じで定義されていた。

\[ p \rightarrow q が真のとき\\ pはqであるため十分条件である\\ qはpであるための必要条件である\\ 集合で表すとp \subset q \]

でも日常生活や仕事では

「ナシ(p)であるための必要条件は果物(q)であることだが十分条件ではない。
ナシ(p)であるための十分条件は果物(q)であることと黄緑(r)であることだ。」

のような使われ方をすることがあるんじゃないだろうか。(多分ない)
つまり何かを定義するために「必要な」条件と「十分な」条件という意味で使っている例をよく見る。 この文章を、論理式的に書くとこんな形になると思う。

\[ q \rightarrow p = False \\ p \rightarrow q = True \\ q \land r \rightarrow p = True\\ 集合で表すとq \land r \subset p \subset q \]

このとき$q$が必要条件となって$q \land r$が十分条件になるはずなので数学の意味とは若干乖離がある。ここで混乱するのは表現方法や発想は数学と全く異なるのに結果的には数学の必要条件、十分条件の意味としても辻褄があってしまうことだ。 また集合として表現する場合、必要条件が十分条件を含むので十分条件が小さいはずなのだが日常で使う方が条件が 多くなるので最初大きく見えてしまうのも混乱してしまう。
結論としては十分条件と必要条件という言葉は数学以外で使わない方がよいと思った。 あとmathjaxで論理式を使いたかっただけなので間違えていたら指摘してください。

2014年9月6日土曜日

対数微分法を試す

対数微分法はなんか難しそうな関数を微分する方法らしいです。 おそらく両辺をxで微分するところで左辺で合成関数の微分をするところが結構の数の受験生には分かりづらいと思うので式を略さないで書いてみた。

$ ①関数 y = x^x を微分することにする\\ $
$ 両辺の自然対数をとる \\ \log y = x\log x \\ 両辺をxで微分する \\ \dfrac{d}{dx} \log y = \dfrac{d}{dy} \log y \dfrac{dy}{dx} = \dfrac{1}{y} y' = \dfrac{y'}{y} ... 合成関数の微分 \\ \dfrac{d}{dx} x \log x = x' \log x + x(\log )' = 1 \log x + x \dfrac{1}{x} = \log x + 1 ... 積の微分 \\ 上記から \\ \dfrac{y'}{y} = \log x + 1 \\ y' = y(\log x + 1) = x^x (\log x + 1) $

$ ②関数 y = a^x を微分することにする\\ $
$ 両辺の自然対数をとる \\ \log y = x\log a \\ 両辺をxで微分する \\ \dfrac{d}{dx} \log y = \dfrac{d}{dy} \log y \dfrac{dy}{dx} = \dfrac{1}{y} y' = \dfrac{y'}{y} ... 合成関数の微分 \\ \dfrac{d}{dx} x \log a = x' \log a + x(\log a)' = 1 \log a + x 0 = \log a ... 積の微分 \\ 上記から \\ \dfrac{y'}{y} = \log a \\ y' = y \log a = a^x \log a $

2014年8月31日日曜日

両替問題を解いてみる。

両替問題を解いてみました。 やっていることは1000円を日本の硬貨(500円,100円,50円,10円,5円,1円)の6種類で払った場合の支払うすべての組み合わせの数を計算します。 アルゴリズムとしては高い硬貨から任意の数とっていくことを1000円になるまで再帰的に繰り返しています。 結果としては24万8908通りありました。手で計算するのはやり方が分かりませんが大変そうですね。あとなぜかC言語で書きましたが残念ながら完全に忘れていることが分かりました。

2014年8月27日水曜日

2次方程式の解の証明をMathJaxで書く

MathJaxを試してみました。2次方程式の解の証明も簡単に書くことができました。

$ ax^2+bx+c=0\\ \Rightarrow x^2 + \dfrac{b}{a}x + \dfrac{c}{a}=0 \Rightarrow \displaystyle \left(x^2 + \dfrac{b}{a}x + \dfrac{b^2}{4a^2} \right)-\dfrac{b^2}{4a^2}+\dfrac{c}{a}=0\\ \Rightarrow \displaystyle \left(x + \dfrac{b}{2a} \right)^2 = \dfrac{b^2-4ac}{4a^2} \Rightarrow x + \dfrac{b}{2a}=\dfrac{\pm \sqrt{b^2-4ac}}{2a}\\ \Rightarrow x=\dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $

MathJaxの内容はこんな感じです。

$
ax^2+bx+c=0\\
\Rightarrow x^2 + \dfrac{b}{a}x + \dfrac{c}{a}=0 
\Rightarrow \displaystyle \left(x^2 + \dfrac{b}{a}x + \dfrac{b^2}{4a^2} \right)-\dfrac{b^2}{4a^2}+\dfrac{c}{a}=0\\
\Rightarrow \displaystyle \left(x + \dfrac{b}{2a} \right)^2 = \dfrac{b^2-4ac}{4a^2}
\Rightarrow x + \dfrac{b}{2a}=\dfrac{\pm \sqrt{b^2-4ac}}{2a}\\
\Rightarrow x=\dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$

2014年8月23日土曜日

はじめてのWebGL

かなり前だがOpenGLを少し触ったことがあるので、そのWeb版のWebGLを試してみた。 白い三角形を表示するだけど、さすがOpenGLでめちゃめちゃやることが多い。 ただthree.jsやglMatrix.jsは甘えの思想のもと素のJavaScript/htmlで書いたのでサンプル的にはいいと思います。

2014年8月19日火曜日

ノンブロッキングチャネルを試す

SocketChannel/SocketServerChannelを使ってマルチスレッドでなくても複数のクライアントに対応できるようなサーバができます。これでNode.jsはいらないですね。それにしてもByteBufferは慣れない。

2014年8月14日木曜日

Javaだけで作るWebSocketサーバ

JavaだけでWebSocketを動かすサーバを作りました。 動作としてはブラウザでHTMLを表示した後にWebSocket経由でtestという文字を送受信するだけです。 後は双方向にメッセージをやり取りできるようにするのと、処理を汎用化すれば実用的に使えるようになるはず。 ほとんどはWebSocket サーバの実装とプロトコル解説を参考にさせてもらいました。 引っかかったところとしては、WebSocketのレスポンスヘッダの改行コードがCRLFじゃないといけないところ、慣れていないということもありましたがbyteを使ってバイナリ処理を書くところでした。Java(SE)だけで作ろうとしていたため暗号化部分の処理ができるか心配でしたが幸運なことにJava8でBase64の処理クラスが追加されていたのでBase64の処理を素で書かずにすんでよかったです。

2014年8月13日水曜日

文字列の重複順列を出力する

文字列の重複順列を出力する例をerlangとJavaで書いてみました。 erlangのほうがJavaの5倍も短く書けるので5倍の生産性がありまぁす!といえば経営者たちもerlangを使うことに納得してくれることでしょう。

erlang版
Java版

2014年8月12日火曜日

intの数値をbyte配列に変換する

意外とこういうメソッドがなかったので作ってみた。mainメソッドだけ見ると回りくどいけど必要な人には価値が理解いただけるはず。最近気がついたけどblogに貼付けるだけだったらコメントが入れられるgistだけでいい気がしてきた。

2014年8月11日月曜日

byte型変数を2進数文字列に変換する

Javaのbyte変数をInteger#toBinaryStringで変換しても値がマイナスの場合はうまく変換できないし、8桁にならないので、byte変数を実際の2進数の文字列に変換するようなメソッドをいくつか作成した。最後のtoBinaryString4で0xFFとのANDをとっている理由はByte型からInt型への変換を本気で考えるに任せます。こうゆう知っている人にとっては当たり前だけど知らない人にとっては理解するのに時間がかかる「ちょっとしたこと」をインターネットで共有できるようになったのは大きいと思う。

2014年8月9日土曜日

erlangで一行づつファイルを読む。

io:readだとerlang項とかいうので書かれたファイルしか読まないようなのでio:get_lineを使う必要があるみたいだ。 erlangの書き方は少しだけ分かってきた気がする。

2014年8月6日水曜日

Javaで作るシンプルなテキストチャット

WebSocketを実装しようとしたけど、双方向なプロトコルをいきなり作るのは大変そうだったので大昔に研修で見たことがあるようなテキストチャットをまず作ってみた。意外とクライアントがインプットとアウトプットでスレッドを分けないといけなかったので大変だった。ただクライアントだけが接続が切れた場合に例外が発生したりするので、タイミングによる制御が大切になってきそう。

2014年8月4日月曜日

純粋なJavaで作るHttpServer

WebサーバというとApacheやIISが必要と思うけど純粋なJavaでもHTMLを表示するだけであれば簡単に作ることができる。 com.sun.net.httpserverを使う手もあるけど勉強もかねてHttpServerを書いてみた。 ここではThreadを単純に使っているけどノンブロッキングチャネルを使う方法もあるのでこちらも試したい。

2014年8月3日日曜日

erlangでネイピア数を求める

erlangでネイピア数を求めてみた。 指数表現やelseが使えなかったりとかするので、なかなか難しい。 もっと洗練された書き方ができそうだ。

2014年8月2日土曜日

初めてのerlang

すこし前に話題になった気がするerlangを触ってみました。 色々と今までやってきた言語とは違うけどfor文がないのが辛いですね。。 そこでfor文ぽい処理を書いてみました。自分で書いたんだけどokって何だろう。。 関数脳になるのは長い道のりが必要そうです。

2014年7月30日水曜日

JavaFX8でPPMファイルのビューアを作る

JavaFX8でPPMファイルのビューアを作りました。 表示するだけであればこれで十分だと思います。 まじめに作るのであればPPMファイルの種類別の読み込み、ファイル形式のチェックなど色々細かいことをしないといけなさそうです。

2014年4月13日日曜日

Jetty9.1でWebSocket(JSR365)を使ってみる

一年ぐらい前に書いたJetty9でWebSocketを使ってみる。だとWebSocketのJavaEE仕様であるJSR365には対応できていませんでした。Jetty9.1ではJSR365に対応したようでしたので、それに準拠するように書き直しました。あまりソースはあまり変わりませんが少しシンプルになった感じがします。pom.xmlはgradleを使おうとしたのですがgradleのjetty pluginがバージョン7以降に対応できていないようです。(update jetty plugin to current jetty)


2014年3月5日水曜日

プロジェクトが遅延した場合の対処法

プロジェクト管理について珍しく考えていたので少しまとめたい。ここではプロジェクトが遅延した場合の対処法について書いてみる。ただし内容は経験のあるソフトウエア開発のみに特化しているかもしれない。

プロジェクトが遅延する理由


遅延が発生しないプロジェクトは見たことがない。なぜかを少し考えたところ当たり前だと気がついた。もし90%でできるタスクが100個あったとするとすべてうまくいってスケジュール通りに完了する可能性は0.002% (0.9^100*100) になりほぼ0%になる。だから何もしないでスケジュール通りにうまくいくということは嘘をついているか、すべてのタスクがほぼ機械的にできるようなものか、宝くじに当たるぐらい運がよい時になる。

プロジェクトが遅延した場合の対処法


プロジェクトは絶対に遅延が発生するのでもし発生した場合の対処法を考えたが魔法のような方法はなかった。もし遅延が発生した場合の対処で延々と悩むぐらいであればこの方法ぐらいしかないので機械的に対処するぐらいのほうが気が楽になるのではないかと思う。ここでは内部調整と外部調整に分けて記載してみる。

内部調整


現状の人員、納期、品質を変更しない前提での調整内容をここで記載する。

  • 残業する
  • 単純に作業時間を長くする方法である。いきなり残業するだったので落胆の声が聞こえそうだがもっとも簡単な方法で一番とられやすい対処法だと思う。あまりやり過ぎると体調を崩したり見積もりの基準が定まらなくなるので負担にならない程度で労働基準法の範囲内ですることが前提だ。かっこよくいうと稼働を上げるとか、クラッシング(人員の追加の意味も含むがここではその意味を除く)とも言う。

  • 並行作業する
  • すでに実施可能な先行タスクを並行的に行ってしまうことである。この対処法もよくとられるがうまくやらないと後戻りが発生するリスクもある。かっこ良く言うとファストトラッキングとも言う。PMBOKにもあるので真っ当な方法にも思えるが普通に考えると一人でこれをやろうとすると並行作業することになるので残業は不可避のように思う。

  • 平準化する
  • 一部の人に作業が集中している場合に暇な人ができるのであれば手伝ってあげる。ただ中々タスクを分解するのは難しいケースがあったり分解される方は気分はよくないように思うので皆の協力が必要だ。

  • 効率化する
  • 非効率なやり方をしていないかを見直して効率的なやり方があるのであればそれをもとに再見積もりをする。たとえば明らかに重複している作業がないか、自動化できないか考えてみる。


    外部調整


    もし自分の管理の範囲内で調整がつかない場合は QCD(品質、スコープ、コスト、納期)をステークホルダーと調整する。たとえば納期が絶対であればある機能をけずるとか、単純に納期を延ばしてもらうとかの調整になる。

    上記の対処法をうまくやればほとんどのケースは対応可能と考えられる。ただし最後の外部調整がうまくいかない場合は厄介なことになるだろう。正直言うと自分はこういう調整が好きじゃないしできればやりたくないので予防、調整しやすくする、メンバーで勝手にやれる方法を考えたい。