投稿

9月, 2019の投稿を表示しています

Java本格入門 Chapter11 スレッドセーフをたしなむ の一部をJavaで実装。

イメージ
Java本格入門 Chapter11 スレッドセーフをたしなむ の 11-2-3(1)異なるクラスのsynchronizedメソッドは、同期しない。を実装。 書籍の簡略コードではいまいち刺さらなかったので。 実装の参照元ネタ こちらのサイト様のコードを写経させていただきました。 abcdefg..... : Javaでsynchronizedの排他制御を試す ファイル一覧 MyMain.java 実装 MyMain.java public class MyMain { public static void main(String[] args) { MyMain aaa = new MyMain(); aaa.test27(); System.out.println("★★★★★"); } // マルチスレッドでのsyncronized範囲確認 private void test27() { final class AAA { public synchronized void func3() throws InterruptedException { System.out.println(Thread.currentThread().getName() + " : ★ start"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " : ★ end"); } public synchronized void func4() throws InterruptedException { System.out.println(Thread.currentThread().getName() + " : ○ start"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " : ○ end"); } } final class BBB

Game Programming Patterns の 第8章 ダブルバッファのコメディ部分をTypeScriptで実装

イメージ
Game Programming Patterns の 第8章 ダブルバッファのコメディ部分をTypeScriptで実装 お勉強。 1フレーム(update())ごとにバッファを入れ替える。 ファイル一覧 doubleBuffer.ts 実装 doubleBuffer.ts abstract class Actor { constructor(name: string) { this.name_ = name; this.currentSlapped_ = false; }; abstract update(): void; public swap(): void { this.currentSlapped_ = this.nextSlapped_; this.nextSlapped_ = false; } public slap(): void { this.nextSlapped_ = true }; public getname(): string { return this.name_ } protected wasSlapped(): boolean { return this.currentSlapped_ }; protected name_: string; private currentSlapped_: boolean; private nextSlapped_: boolean; } class Commedian extends Actor { // 顔の向き public face(actor: Actor) { this.facing_ = actor }; public update(): void { // console.log("name,wasSlapped : " + this.name_ + "," + this.wasSlapped()) if (this.wasSlapped()) { // 自分が叩かれてたら、こんどは顔が向いている方向にいる役者を叩く(どんなコメディだよ) this.facing_.slap()

HeadFirstデザパタ 第10章 State をC++で実装

イメージ
自分のお勉強用 : HeadFirstデザパタ 第10章 State をC++で適当に実装 おさらい。 とりあえずStateAとBを順繰りに入れ替えるようなやつ。 お手本を真面目に写経するのは冗長なのでパス。 ファイル一覧 State.h : インターフェイス StateA.h と StateA.cpp : 実装 State.h と StateB.cpp : 実装 GumballMachine.h と cpp state_cpp.cpp : メインクラス 実装 State.h : インターフェイス #ifndef STATE_H #define STATE_H class State { public: virtual ~State() {} virtual void methodA() = 0; virtual void methodB() = 0; }; #endif // !STATE_H StateA.h #ifndef STATE_A_H #define STATE_A_H #include "State.h" #include "GumballMachine.h" class StateA : public State { friend class GumballMachine; public: StateA(GumballMachine* gm):gm_(gm) {} virtual void methodA() ; virtual void methodB() ; private: GumballMachine* gm_; }; #endif // !STATE_A_H StateA.cpp #include "StateA.h" #include using namespace std; void StateA::methodA() { cout << "StateA::MethodA" << endl; } void StateA::methodB() { cout << "StateA::MethodB" << endl; gm_->se

増補改訂版Java言語で学ぶデザインパターン入門 結城 浩 第6章 Prototype をC++で実装

イメージ
自分のお勉強用 : デザパタ 結城本 第6章 Prototype をC++で適当に実装 C++とデザパタのリハビリを目的として。 Flyweightとなんか脳内で混同してしまう。まぁコンセプトは似てるし仕方ない。 ファイル一覧 Product.h : インターフェイス ProdA.h と ProdA.cpp : 実装 ProdB.h と ProdB.cpp : 実装 Manager.h prototype_cpp.cpp : メインクラス 実装 Product.h : インターフェイス #pragma once #include using namespace std; class Product { public : virtual ~Product() {} virtual void use(string s) = 0; virtual Product* createClone() = 0; }; ProdA.h #pragma once #include "Product.h" class ProdA : public Product { public: ProdA(string s):deco_(s) {} virtual void use(string s) override; virtual Product* createClone() override; private: string deco_; }; ProdA.cpp #pragma once #include "ProdA.h" #include using namespace std; void ProdA::use(string s) { cout << deco_ << " : " << s << endl; } Product* ProdA::createClone() { return new ProdA(deco_); } ProdB.h #pragma once #include "Product.h" class ProdB : public Product { public: ProdB(stri

HeadFirstデザパタ 第2章ObserverパターンをPythonで適当に実装。

イメージ
HeadFirstデザパタ 第2章ObserverパターンをPythonで適当に実装。 PythonのおさらいとObserverの感触を掴むため、書籍「HeadFirstデザインパターン」の第2章Observerパターンを適当に実装。 ファイル一覧 observer_py.py 実装 from abc import ABCMeta, abstractmethod # このへんインターフェイス定義 class Observer(metaclass=ABCMeta): @abstractmethod def update(temp, humidity, pressure): pass class DisplayElement(metaclass=ABCMeta): @abstractmethod def display(): pass class Subject(metaclass=ABCMeta): @classmethod @abstractmethod def registerObserver(self, observer): pass @abstractmethod def removeObserver(self, observer): pass @abstractmethod def notifyObservers(self): pass # end class Subject class WeatherData(Subject): __temparature = 0 __humidity = 0 __pressure = 0 observers = [] def __init__(self): pass def registerObserver(self, observer): self.observers.append(observer) def removeObserver(self, observer): self.observers.remove(obs

増補改訂版Java言語で学ぶデザインパターン入門 結城 浩 第17章 Observer をC++で実装

イメージ
自分のお勉強用 : デザパタ 結城本 第17章 Observer をC++で適当に実装 C++とデザパタのリハビリを目的として。 なんかObserverってスレッド化しないと、なんかしっくりこないというか。 イマドキだと関数化なのかな。 写経元は書籍「増補改訂版Java言語で学ぶデザインパターン入門 結城 浩」の第17章 Observer。 ファイル一覧 myObserver.h : インターフェイス myObserverA.cpp と .h myObserverB.cpp と .h NumberGenerator.cpp と .h RandomNumGenerator.cpp と .h observer_cpp.cpp(main部分) インターフェイスを「myObserver」という名称にしています。 普通に「Observer」を使うと、なんだか最近だと標準ライブラリかどこかに存在しているようで紛らわしかったので。 IObserverとしても良かったです。 実装 記載順序は以下とします。 インターフェイス → IF実装 → Subject → Subject実装 → main。 myObserver.h : インターフェイス #pragma once #include "NumberGenerator.h" class myObserver { friend class NumberGenerator; public : myObserver() :next_(nullptr) {}; virtual ~myObserver() {} virtual void update(NumberGenerator&) = 0; private: myObserver* next_; }; myObserverA.h : IF実装その1 #pragma once #include "myObserver.h" #include "NumberGenerator.h" class myObserverA : public myObserver { friend class NumberGenerator; public:

HeadFirstデザインパターン 第6章CommandパターンをC#で軽く実装。

イメージ
自分のお勉強用 : HeadFirstデザインパターン 第6章CommandパターンをC#で軽く実装。 C#のおさらいとCommandパターンの感触を掴むため、 書籍「HeadFirstデザインパターン」の第6章Commandパターンを適当に実装。 ファイル一覧 CeilingFan.cs ICommand.cs Light.cs NoCommand.cs Program.cs RemoteControl.cs RemoteLoader.cs 実装 前述のファイル一覧の順番とは異なります。 まずはインターフェイスから。 ICommand.cs namespace csConsole { interface ICommand { void Execute(); void Undo(); } } Light.cs : コンクリートとレシーバーその1 namespace csConsole { class Light // レシーバー部分 { public Light(){} public void on() => Console.WriteLine("ライトオン です。"); public void off() => Console.WriteLine("ライトOFF です。"); } class LightOnCommand : ICommand // コンクリート部分 { Light light; public LightOnCommand(Light light) => this.light = light; public void Execute() => light.on(); public void Undo() => light.off(); } class LightOffCommand : ICommand // コンクリート部分 { Light light; public LightOffCommand(Light light) => this.light = l

windows10 で nvidia のグラボのcode43現象を解決した

■そもそもの発端 2018年秋、OS入れ替え(win7→win10)を行ったら、グラボが認識されなくなった。 リンク → GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019) ■原因(ざっくり) nVidiaの専用ドライバはPC内部に存在しているが、nVidiaの専用ドライバよりもWindowsの汎用ドライバが優先的に使用されている。 ■やったこと とりあえずWindowsが優先的に採用してしまっている汎用ドライバを参照しない状況にした。 ■手順 OSのクリーンインストール(必要なら) 既存の全グラフィックドライバの削除(ここから本筋) 再起動 適用したいnVidia専用ドライバのインストール 再起動 Windowsの汎用ドライバになっちゃってるので、ドライバを元に戻す ■手順の詳細説明(一部) 2. 既存の全グラフィックドライバの削除 について 有名なドライバ削除ツール「 DDU 」(Display Driver Uninstaller)というものを使用します。 リンク : 「 DDUダウンロードページ(別窓) 」 使用時はDDUのチェックボックスから以下を指定します。 ・Windowsが自動でドライバをインストールしないように設定(自動インストールを許可しない) 勝手にやられると、今回みたいなことになってしまうので。 6. Windowsの汎用ドライバになっちゃってるので、ドライバを元に戻す について 再起動したら、なぜかWindowsのドライバが適用されており、code 43 の状況になっていました。 一つ前の世代では確実にnVidiaの専用ドライバがインストール+利用されていたので、ドライバの画面から「ドライバを元に戻す」を押下し、nVidiaの専用ドライバに戻します。 ・ドライバ状況(再起動直後) nVidia専用ドライバ Windows汎用ドライバ : ← いまここ ↓ 実行 : ドライバを元に戻す ・ドライバ状況(元に戻す適用後) nVidia専用ドライバ : ← もとに戻した Windows汎用ドライバ 人によっては、Windowsの汎用ドライバを削除したりと、やり方は色々あるようです。 こちらのサイト様の流れがわかりやすく、検証もわかりや