ロジックサマナー
はじめに
こんばんは,Pyenteです. 私はオタクです.
何故こんなことを言うかというと,タイトル通りロジックサマナーを始めました. ロジックサマナーとは,paizaが公開したサービスで,ユーザはプログラミングをし,アイテムを集めるというものです. いやー絵が可愛いんですよねw オタク心を惹かれます. キャラが少ないのが難点ですが,発想がとても面白いです. こういったゲーム方式のプログラミングってpaizaくらいしかないんですかね? ちなみにコードガールコレクションってのもかなりやってました笑
ロジックサマナーって?
サイトはこちらです. 設定が面白いですね. 召喚獣やアイテムを集めるためにプログラミングをします. あるアイテムが欲しい時,指示通りにプログラムを作るとそのアイテムがGETできます! 難易度も設定されており,簡単なDランクからめちゃ難しいSランクなんてのもあります. 俺の力ではBがギリギリです… もっと勉強が必要ですね…
簡単なのは本当に簡単です. 例えば,以下のような入力があったとします.
Attack Attack Defense Defense Attack
Attackの時はダメージを100与え,Defenceの時はダメージはなしです. このとき,いくつダメージを与えたでしょう? といった問題です. これは簡単ですね.
そしてつまった…
今,魔法陣を解くというランクBの問題を解いているんですが…
3 6 1 8 7 5 3 2 0 0
こんな感じで入力データが渡されます. 最初の数字は何列かっていう指定で,その下に魔法陣があります. この魔法陣は縦,横の合計が一致するという特性があります. 2つの0(必ず0は2つ)に何が入るかを答えろという問題なんですね. 出力はこの入力と同じフォーマットで正解の魔法陣を書けばいいんですが… 入力例を入力するとあってるんですが,提出すると失敗となってしまいます… 何がいけないかわかんないんですねー まぁ,わかったら追記しますわ…
ではでは!
分散システムとは…?
分散システム
分散システムの定義
分散システムは,そのユーザに対して単一で首尾一貫したシステムとして見える独立したコンピュータの集合である.
つまり…
- 自立コンポーネント(コンピュータ)からなる
- ユーザはそれらを単一のシステムとして扱う
重要な特性
- 多様なコンピュータの差異とそれらの通信方法が隠蔽される.
- ユーザとアプリケーションがどんな環境でも一貫性のある方法で分散システムと相互作用できる.
分散システム≒ミドルウェア
要約すると…
分散システムは独立した複数の計算機の集まりで,ユーザからは1つの一貫したシステムに見える
- 分散システムの例
- ATM
- NFSなどの分散ファイルシステム
- WWW
目標
- ユーザとリソースとの接続手段の提供
- 透過性の実現
- 開放性
- スケーラビリティの達成
リソースへのアクセス性の向上
分散システムの主な目標は,ユーザ(またはアプリケーション)が遠隔のリソースにアクセスすることを容易にし,その上,これらのリソースを制御されかつ効率的な方法で他のユーザと共有することである.
つまり:複数ユーザで遠隔リソースを共有
リソースを共有する理由
- 経済性
- 複数ユーザ間での共同作業や情報交換を行うため
接続性やリソース共有が増大すると,セキュリティが重要になる
- 通信において盗聴や妨害に対してほとんど防御していない(e.g.,重要情報が暗号化されていない).
- 通信追跡
分散透過性
- プロセスやリソースが複数のコンピュータにまたがって,物理的に分散されている事実を隠蔽する
- 透過:ユーザやアプリケーションに対して単一のコンピュータシステムに見えるシステムのこと
透過性の種類
- アクセス(access transparency)
- 位置(location transparency)
- リソースがどこに位置するのかを隠蔽する
- リソースに論理的な名前のみを割り当てる(e.g.,URL,DNS,path name)
- 移動(migration transparency)
- リソースが他の位置に移動して良いことを隠蔽する
- リソースが他の場所に移動しても同じURLでアクセスが可能(e.g.,Webサーバが移動しても同じURLでアクセスできる)
- 再配置(relocation transparency)
- リソースが使用中に,他の位置に移動するかもしれないことを隠蔽する
- e.g.,無線通信のローミング
- 複製(replication transparency)
- リソースが複製されていることを隠蔽する
- 可用性や性能向上を目的とした,リソースをコピーし,アクセスされている場所の近くに配置する(キャッシュなど)
- 位置透過性を維持するために,コピーされたリソースは同じ名前を持つ必要がある
- 並行(concurrency transparency)
- 障害(failure transparency)
- リソースの障害と回復を隠蔽する
- 分散システムでは故障したリソースと反応が遅いリソースを区別する(特にネットワークを隔てた離れたリソース)のが困難なため,最も実現が困難である
- 永続(persistence transparency)
- リソースがメモリまたはディスク上のどちらに存在するかを隠蔽する
- e.g.,オブジェクト指向データベース,ライトバックキャッシュ
透過性実現の度合い
- 透過性の度合いを高めるとシステムの性能は悪化する(トレードオフ関係)
障害透過性(e.g.,インターネットアプリケーション)
- サーバに何回か接続を試みた後,接続不可能なら諦める
- サーバの一時的な障害を隠蔽しようとし,何回も再接続を行うことで動作が遅くなる
- 早めに再接続を諦めるかユーザがキャンセルを行う方が良い
- サーバに何回か接続を試みた後,接続不可能なら諦める
複製透過性(e.g.,リソースの複製)
- リソースが異なる大陸など,非常に離れた場所に複数存在するとき,それらの内容が全て同じであることを保証したい -> 複製のどれか1つを変更すると他の複製に変更を電場されるのに非常に時間がかかってしまう
開放性
- 標準化されたサービスを提供する
- e.g.,ネットワークの送受信のルールをプロトコルとして標準化
- 作成者の異なるシステムを相互接続するため,サービスをインターフェースとして定義する
- これにより,異なる作成者が作成した異なる実装を組み合わせることで分散システムを構成できる
スケーラビリティ
- スケーラビリティ:システムを容易に大規模化できること
- システムのサイズ…より多くのユーザやリソースをシステムに追加しやすいため,大規模に実現可能である.
- 地理的な規模…地理的に拡張可能(ユーザやリソースが遠隔に位置する)なシステム
- システム管理…多数の独立した管理組織にまたがっても容易に管理できるので,管理上拡張ができる
スケーラビリティ問題
システムのサイズを大規模化
分散型アルゴリズム
- いかなるマシンもシステム全体の完全な情報を持たない
- 各マシンは局所的な情報のみをもとに意思決定を行う
- 一つのマシンの障害が全体のアルゴリズムの動作に影響しない
- 大域的な時計の存在を仮定しない:分散システムすべての時計を正確に同期させるのは不可能である
地理的なスケーラビリティ
- LAN向けに設計された分散システムをWAN用に大規模化するのは困難
- LAN向けのシステムは同期通信に基づいている
- 同期通信:サービスのリクエストを送信し,停止して応答を待つ
- LANでは通信遅延が小さいため問題ないが,WANでは通信遅延があるため,同期通信を用いた対話的アプリケーションの作成が困難
- WAN上の通信はLANに比べて信頼性が低く,1対1通信である(信頼性が高いブロードキャスト通信が利用できない)
- LAN向けのシステムは同期通信に基づいている
- LAN向けに設計された分散システムをWAN用に大規模化するのは困難
スケーラビリティ問題の解決法
- 通信遅延の隠蔽:地理的なスケーラビリティ問題の解決法
- 分散化:システムを小さい部分に分解し,分散配置する
- e.g.,DNS(Domain Name System),WWW
- 複製化:可用性の増大と性能向上
- 一貫性の問題がある
終わりに
メモ書きになってしまいました. 許してください,なんでもしますから(なんでもとはいってない)
参考はこちらの本になります.
これの1章の途中までをまとめた感じですね,はい. 興味を持ったらぜひ読んでみてください. 英語ならPDFがどこかにありますよ?笑
ではでは,今日はこの辺で…
Nice to e-meet you.
はじめまして,Pyenteです.
Pyenteってどう読むの?って思われるかもしれませんが,これはPythonとSerpente(イタリア語で蛇)の複合語です.
別に蛇が好きなわけじゃないんですがね笑
私はPyente(ピエンテ)って呼んでます.
まぁどうでもいいですね,好きに読んでください笑
さて,私のこのブログを書く目的としてはIT系の勉強をする上でもメモと同じです.
単に勉強するだけではつまらないので,せっかくなら何かに残そうかと…
その結果たどり着いたのがこのブログなわけですが…
卒業論文の時に痛いほどわかったのですが,私には文才のかけらもありません…
その辺りは大目に見てやってください.
何かありましたら,その都度コメントをいただけると幸いです.
これから宜しくお願いします.