ゆき社長

シーゲンガーのお勉強 ゲームプログラマ、ゲーマー、色々!

はてな?

最近 はてなブログの中の人の知人が増えてきている

あと 元々アメブロ系の知り合いは多い

そんななか なぜseesaaを使ってたかというと

このブログ 凄いんです

cssをいじり倒すと けっこうなんでも出来るんです

そんなこんなで Javaアプレットを埋めこんで、データをアップロードして

読み込んだり

ほんと 色々と出来て便利!

だけど はてなの知人がいるので 一度はてなも試してみようということに。

プログラム系ははてなおおいしね。

はてな?

最近 はてなブログの中の人の知人が増えてきている

あと 元々アメブロ系の知り合いは多い

そんななか なぜseesaaを使ってたかというと

このブログ 凄いんです

cssをいじり倒すと けっこうなんでも出来るんです

そんなこんなで Javaアプレットを埋めこんで、データをアップロードして

読み込んだり

ほんと 色々と出来て便利!

だけど はてなの知人がいるので 一度はてなも試してみようということに。

プログラム系ははてなおおいしね。

json11 int64_t

C++におけるC++ライブラリの選択肢は色々ある

前は picoJsonを愛用していて、今でも十分に 小さく使いやすい

ヘッダのみで利用できるので、場合によっては今でも使う

けど、json11が評判いいし使っています

実際に使いやすい

ところが json11は uint32、int64、uint64 等がない。

全部において int_value である

プロトタイプをみると intである

C++においては、整数型とビット数が、規格ではちゃんと決まっていない。

処理系やコンパイラでビット数が異なる

一般的な64bitマシンではおおよそ

int: 32bit

long: 32bit

long long: 64bit

である

つまりおおよその処理系では json11の int_value() では 符号あり32bit数しかとれない

そこで double_value() を使って取ると、ちゃんと調査してないけど

53bitまでは取れるはずなので

uint32は取れる

が、int64、uint64に関しては 53ビットしか取れないため、残りの11bit情報が取れない

とりあえず jsonデータを stringにし、内部でint64に変換するのが 楽な気がする

一般的に Javaでも jsonライブラリはライブラリ毎に その辺りも微妙に事情が違うので

今のところは stringで受け渡しすることにした

そのうち json11も uint32 int64 uint64対応入れたいけどね。。。

そして 文字列から int64_tに変換するには おそらく  std::atoll で良いと思う

ただし long long == int64  の処理系限定である

もし long long != int64 処理系だと・・・

この際のベストプラクティスは何なのか・・・

悩みは色々あるけど、64bit環境では おそらくこれで大丈夫かと

ちなみに uint64_tが欲しい時は std::uatoll が使える

json11 int64_t

C++におけるC++ライブラリの選択肢は色々ある

前は picoJsonを愛用していて、今でも十分に 小さく使いやすい

ヘッダのみで利用できるので、場合によっては今でも使う

けど、json11が評判いいし使っています

実際に使いやすい

ところが json11は uint32、int64、uint64 等がない。

全部において int_value である

プロトタイプをみると intである

C++においては、整数型とビット数が、規格ではちゃんと決まっていない。

処理系やコンパイラでビット数が異なる

一般的な64bitマシンではおおよそ

int: 32bit

long: 32bit

long long: 64bit

である

つまりおおよその処理系では json11の int_value() では 符号あり32bit数しかとれない

そこで double_value() を使って取ると、ちゃんと調査してないけど

53bitまでは取れるはずなので

uint32は取れる

が、int64、uint64に関しては 53ビットしか取れないため、残りの11bit情報が取れない

とりあえず jsonデータを stringにし、内部でint64に変換するのが 楽な気がする

一般的に Javaでも jsonライブラリはライブラリ毎に その辺りも微妙に事情が違うので

今のところは stringで受け渡しすることにした

そのうち json11も uint32 int64 uint64対応入れたいけどね。。。

そして 文字列から int64_tに変換するには おそらく  std::atoll で良いと思う

ただし long long == int64  の処理系限定である

もし long long != int64 処理系だと・・・

この際のベストプラクティスは何なのか・・・

悩みは色々あるけど、64bit環境では おそらくこれで大丈夫かと

ちなみに uint64_tが欲しい時は std::uatoll が使える

相掛かり棒銀?

ウォーズの戦法判定では そうなる。

飛車先を交換して棒銀にいった

知り合い(勝手に師匠と呼んでる)より

相手が居玉なのに玉をがっちり囲って戦うという感覚はやめたほうが良いと言われ

居玉のまま戦うことに

相手が棒銀多いから 棒銀をやって対策も勉強する!

ってことで

http://shogiwars.heroz.jp:3002/games/sofi-bakinaf-20151005_000705

色々細かいところはあるけど

相手が角を1筋に上げたのが 大悪手だと思う

7六歩で香車取り馬つくりを見せてもよかったけど

棒銀成功しそうなのに角交換されるのも シャクで 角をいじめに一筋からせめてゲームオーバー

棒銀は一手受けをみすると 速攻で終わる

やっと21級なので もっと勉強する!

相掛かり棒銀?

ウォーズの戦法判定では そうなる。

飛車先を交換して棒銀にいった

知り合い(勝手に師匠と呼んでる)より

相手が居玉なのに玉をがっちり囲って戦うという感覚はやめたほうが良いと言われ

居玉のまま戦うことに

相手が棒銀多いから 棒銀をやって対策も勉強する!

ってことで

http://shogiwars.heroz.jp:3002/games/sofi-bakinaf-20151005_000705

色々細かいところはあるけど

相手が角を1筋に上げたのが 大悪手だと思う

7六歩で香車取り馬つくりを見せてもよかったけど

棒銀成功しそうなのに角交換されるのも シャクで 角をいじめに一筋からせめてゲームオーバー

棒銀は一手受けをみすると 速攻で終わる

やっと21級なので もっと勉強する!

Java8

Java8をそろそろ勉強。

Java7は正直ほとんど見てないんだよね 6ぐらいで終わってる

でも8はJavaが大きくかわった一歩なので 調べるべき!

まず、ラムダが出来た。これは大きい

今までは interface classを 無名関数として newしてattachしていた

それは冗長なコードで処理速度も遅く、綺麗なコードではなかった

もちろん classのメンバ関数を作りattachも出来るが

immutableにするほうがベストで メンバ関数で渡すのは アンチパターン

それが、ラムダ式で指定できるのだから

何も問題ない

そして、関数ポインタ(関数オブジェクト)が存在せず

関数オブジェクトを表現するために classをnewするという

C言語にも劣る冗長でオーバーヘッドの多い仕様が改善され

FunctionInterfaceというものが出来たらしい

(細かい中身は追っていないが、これを作った目的考えると、関数オブジェクトのような オーバーヘッドの少ない作りになっているはずである)

既存の関数を関数インタフェースに渡せる。つまり関数ポインタが使えるといっても良い

そして 定義済みの関数インタフェースが提供されているが

これは完全なC#のオマージュであろう。

アイコン業界ではオマージュは晒し処刑対象らしいが

プログラムの世界では、いい方向に向かうなら歓迎だ

そして StreamAPI

C#LINQ式のオマージュ

こういういい部分は取り入れるべきだろう

LINQ式についてはパフォーマンスに問題があるという人もいるし

誤差範囲という人もいて、速度評価は難しいが

時代の流れや可読性を考えると

速度は誤差範囲内で積極的に使うべきだと思う

C++においては 今のところLINQ式は取り入れないと発表があるが

LINQライクなライブラリもあり

使ってみて評価しようと思う

そのたOptionalやらDataTimeやら

Java8は良くなったと思うが

やはり

ジェネリクスに関して

Object型を経由させる部分が

どうしてもネックになっていると思う

ジェネリクスさえ ちゃんと解決できれば

まだまだ現役言語になると思う

そして 一番危険視してたのが

interfaceのdefault実装

今までJavaという言語は、継承は単一継承しか許さず

interfaceのみ多重で継承させ

実装は単一継承というポリシーを守ってきた

もちろんこれには問題があり、interfaceを継承すると

何度もinterfaceの実装コードを書く必要があるという問題

なぜかJavaにはmixed-in がないため、中途半端と思っていた

今回は本当はJavaのポリシー変えたくないが

いろいろな理由からinterfaceにデフォルト実装をつけれるようになった

どう考えてもJava設計者としては つけたくなかった機能だと思うが・・

そして そのためにJavaでは多重継承が可能になった

そのため 多重継承につきもののダイヤモンド継承問題が発生した

ダイヤモンド継承は簡単にいえば多重継承することで、同じ親クラスが多重に存在し、どれを呼ぶかわからなくなる問題

C++では、多重の親クラスのメソッドを呼ぶ際に、スコープをつけて呼ぶことでかいけつさせているが

多重継承を許可するPythonではC3線形化アルゴリズムという

コンパイラが総合的に判断し、適した方のメソッドを呼ぶ事で解決させる

具体的には最も近い親を呼ぶ

それでも解決出来ない場合はJavaでは C++と同じく、オーバーライドしスコープを指定する

C++の多重継承と implementsによる多重継承の違いは

C++は本当に多重継承なので、インスタンス変数を持つため

状況は更にややこしいが

Javaの場合は interfaceはあくまでinterfaceで、インスタンスをもたない為

static finalでない変数は存在しないので問題ない

というところまで考えて 安心した。

結論で言うと Javaは多重継承ではなく mixed-inを採用したということ

やはり 未だ インスタンス変数まで持つ事のできる真の多重継承は人類にはまだ早い