読者です 読者をやめる 読者になる 読者になる

ぷろみん

プログラミング的な内容を扱ってます

そもそもがそもそもだった

概要 何故またこっちで書こうと思ったのか。 そもそもの動機 将来性を考えると独自ドメインでブログは運用すべき。 なぜなら資産であるブログ記事を検索サイトに模倣と思われず引っ越す方法がないからだ。 ブログを書くモチベーション 結局は多くの人に見て…

ブログを移転します

はてなブログに頼りっきりでしたが、今は便利になって簡単に個人でもブログサービスを始めることができそうなので移転することにしました。 独自ドメインでGhostを使ってやっていこうかと思います。 tcat.space 見た目をもう少しなんとかしないとなーと思い…

C++で無理矢理クロージャを使ってみる

C++

クロージャ 現在クロージャという表現を使う場合状態を持ったラムダを指す場合が多い気がします。 つまり、ワンライナーで書けるクラスといった感じです。これはC++では関数オブジェクト的な手法で似たようなことができますが、javascript程普通なものではあ…

C++の標準描画ライブラリに入るかもしれないCairoのサンプルをwindows向けにビルドしてみた

cairoとC++ 本の虫: Herb SutterがCairoのMLにC++標準規格にCairoを入れられないか打診中 環境 windows msys2 依存関係 $ pacman -S mingw-w64-x86_64-zlib $ pacman -S mingw-w64-x86_64-libpng $ pacman -S mingw-w64-x86_64-pixman $ pacman -S mingw-w64…

基本クラスの継承を考えたデストラクタの属性設定

C++

概要 この記事は間違った情報が多分に含まれるため https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c35-a-base-class-destructor-should-be-either-public-and-virtual-or-protected-and-nonvirtual と https://github.com/…

シングルトンを使うのはやめよう

C++

概要 この記事はC++の作者Bjarne Stroustrup等によって書かれたコーディングガイドラインのAvoid singletonsの箇所の翻訳です。 https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Ri-singleton シングルトンを使うのはやめよ…

DirectX12をビルド可能なプロジェクトを作る

前回 ようやくWindows10にしたのでDX12プログラミングを始めてみた - ぷろみん ビルド New Project -> Win32 Project -> Empty Project 新しく生成されたフォルダに前回ビルドに成功したサンプルの.cppと.hをコピーしてきます。 Solution Explorerのファイル…

ようやくWindows10にしたのでDX12プログラミングを始めてみた

概要 Windows10にしたらまず最初にすべき事といえば・・・ そう、DirectX12プログラミングですよね。 今回はその導入をやってみたのでメモしておきます。 Visual Studioのアップグレード 始めから入ってない人もここで入れるので一緒です。 Direct3D12 開発…

git-flowとhubコマンドを使ってCUIでgithubを活用する

github/hubコマンドを使ってみた - ぷろみんの続きです 概要 git-flowとhubを使います。 インストール $ sudo apt-get install -y git-flow 初期化 $ mkdir foo $ cd foo # hub導入済み $ git init -g $ git flow init # 質問には全部エンター $ git create …

github/hubコマンドを使ってみた

概要 githubをCUIで操作できるhubコマンドの使い方や困った事をメモしました。 環境 debian インストール まず、ビルドにgoが必要なのでインストールします。 私の場合はansibleで入れました。 こんなややこしい方法取らずに適当な方法でインストールした方…

gitの最新版をビルドする

環境 https://atlas.hashicorp.com/ARTACK/boxes/debian-jessieで作成されたdebianのboxを使っています。 $ sudo aptitude update $ sudo aptitude -y install git $ sudo aptitude -y install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-d…

debianでglfwをコンパイルしてwindows向けバイナリを作成する

概要 windows環境での話です。 最近msys-gitやmysy2を使ったりで環境変数やら実行バイナリがごちゃごちゃしてきてしまったので、実験用の環境が欲しくなったので仮想化してみます。 事前準備 管理者権限が必要なパッケージもあります。 chocolatly https://c…

windows.hが必要ないwindows GUIアプリケーションの作り方

概要 int WINAPI WinMainというエントリポイントにも関わらずヘッダが必要な関数があります。 コンソールアプリケーションでプロジェクトを作るとint main()から始める事ができるが、アプリケーションの動作中ずっと不要なコンソールが出現したままになりま…

Concept Lite(軽量コンセプト)で出来る事

C++

概要 gcc6.0にてConcept Liteのコンパイルができるようになったので、色々と触ってみました。 wandboxを利用すれば簡単に試す事ができます。 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ 書き方 conceptはconstexprな関数や変数としても解釈されるので以下の書き方は両方…

pacmanでglfwを入れる

pacmanでライブラリも入れられるのに気付いていませんでした。 # glfwのパッケージを探す $pacman -Ss glfw mingw32/mingw-w64-i686-glfw 3.1.1-1 A free, open source, portable framework for OpenGL application development (mingw-w64) mingw64/mingw-w…

glewとglfw環境の構築

私の環境はwindows上のmsys2-mingwです。この構成の場合のglfwのlinux向けライブラリの作成方法は分かりませんでした。 存在しないコマンドは適宜pacman -Sで入れてください。 失敗例(msys2-mingw) まず、glewを導入します。 $git clone https://github.com/…

std::vectorの正しい使い方

C++

アンドロイドアプリ作りました play.google.com 良かったらプレイしてみてください。 イテレータ無効化ルール イテレータは容易に無効化されます。 Iterator Invalidation Rules (C++0x) 例えばvectorはコンテナサイズよりも要素が増えた場合、要素が取り除…

privateコンストラクタじゃなくてDefaulted and Deleted Functionsを使おう

C++

概要 参考 Explicitly Defaulted and Deleted Functions privateコンストラクタによるコピー不可クラスにはいくつかの問題があります。 コピーコンストラクタをprivateにするとコンストラクタが必要になる struct NonCopyable { // 何もしない場合でもコンス…

git for windowsからmsys gitに移行しました。

モチベーション 最近サーバを触り始めたので、ConEmuを導入してみました。 フォントや使い心地に概ね満足していたのですが、ローカルでvimを起動すると^Mが付くエラーが大量に出てしまいました。 NeoBundle関係が大体使えなくなってしまっていました。 Kaori…

Visual Studio Community 2015のデフォルトテーマ変更

VS Community 2015をインストールしたら、また白くなっていたので黒に戻そうとしましたが、どこから設定するか調べるのに思ったより手こずったのでメモしときます。 Tools -> Options -> Environment -> General -> Color Theme 一番上にあるのに気付かなか…

静的optional

C++

モチベーション ヘッダの依存性を減らしたい(コンパイラファイアウォールを強くしたい) しかし、動的メモリ確保を行いたくない おしいoptional optionalは静的確保できるポインタの様な物です。 静的型をnullableにする為に使われます。 後でコンストラク…

Caps LockキーをCtrlに置換する

Windowsでの話です。 ソフト入れたり大げさな事せずにできないかと調べたら丁度良い物がありました。 www.edandersen.com Windowsキー+Rで出現する「ファイル名を指定して実行」でpowershellと打ち込んでOKをクリック 立ち上がった青い画面のウィンドウに…

修正:C++のAbstractFactoryはvirtualを使わない

C++

C++のAbstractFactoryはvirtualを使わない - ぷろみん 前回のが抽象化できてない事が発覚したので修正しました。 前回のに修正を乗っけようと思ったのですが、そうするとMixinらへんも関係無くなるので新しいのにしておきました。 抽象化 #include<iostream> namespace</iostream>…

C++のAbstractFactoryはvirtualを使わない

C++

抽象化ができてなかったので修正しました。 修正:C++のAbstractFactoryはvirtualを使わない - ぷろみん 継承 C++では出来る限り継承は使わない方が良いです。 理由としては結びつきが強すぎるからです。 メンバに持って目的の挙動を達成できるのなら、そち…

ポインタよりも参照を使おう

C++

あんまり関係の無い所 int& aとint &aのどちらで書くでしょうか? 私はint &aの方で書きます。 // int i; // int *ip; // int *const ipc = &i; // int &ir = i; int i, *ip, *const ipc = &i, &ir = i; // const int ci = 0; // const int *cip; // const i…

push_backよりもemplace_backを使おう

C++

emplace push_backでは無駄なコストが発生してしまいます。 そこで、直接コンストラクトできるemplace_backがC++11から追加されました。 #include<vector> namespace torini{ struct Data{ Data(int, int, int){} }; } int main(){ std::vector<torini::Data> v; // 無駄にコンスト</torini::data></vector>…

mapよりもunordered_mapを使おう

C++

unorderedとは 要するにハッシュです。検索が早くなるので基本的にはunordered_mapを使いましょう。 mapはorderedつまり常にソートされた状態で保持されますが、これが有効に働くことは連想配列的な使い方ではまず無いでしょう。 でもkeyに複雑な値が来る場…

探して見つかった場合と見つからなかった場合の処理

C++

C++14の機能を利用しているのでコンパイラによってはビルドが通らないです。 ありがち 処理の分割がいまいちで、コードを読む時に分かりにくいです。 また、for内で読み込みと書き込みを同時に行っているのは良くない書き方の兆候です。 #include<vector> #include<utility> i</utility></vector>…

C++14の簡単に利用できる便利な機能

ラムダ引数の自動化 int main(){ std::vector<int> v; // ラムダの引数にautoが使える std::for_each(v.begin(), v.end(), [](auto i){ std::cout << i; }); } ラムダ引数が複雑になった場合記述するのは冗長です。 その冗長性が省略できるのは簡単でかつ便利です</int>…

javascript style guide

方針 知識のある人は既にコードレベルの情報は発信しません。 望むのは正しいコードの書き方なので、それを引き続き探します。 前回の方針とは少し方向を変えて集合知に頼ってみます。 wikipedia やはり困ったらwikipedia。 wikipediaは良いのですが、ページ…

javascriptの情報を拾う場所

javascriptをちゃんと学習する気になったのでメモ 方針 最新の規格等に触れているブログ等を主軸に探します。 javascript draft等で検索 文法 ECMAScript Syntax Grammar 6th Edition / Draft ECMAScript Language Specification ECMA-262 6th Edition – DRA…

ninjaのwindows環境ビルド

環境 windows8.1, visual studio community, python2.7 準備 PATHに追加 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools INCLUDEに追加 C:\Program Files (x86)\Microsoft…

関数ポインタよりもstd::functionを使おう

C++

アンドロイドアプリ作りました play.google.com 良かったらプレイしてみてください。 書きやすさ // 関数ポインタ void (*Func)(void); void (Foo::*Func2)(void); // std::function std::function<void(void)> Func; std::function<void(Foo*)> Func2; これは慣れてないと両方読みづ</void(foo*)></void(void)>…

C++の初期化は分かりにくい2

前の C++の初期化は分かりにくい - ぷろみん newしてもゼロクリアされる訳じゃない struct Foo{ int a; }; // デフォルト初期化、aは不定 auto foo1 = new Foo; // 値初期化、aは0 auto foo2 = new Foo(); 省略可能なのでまさかと思ったら、やっぱりnewにも…

C++の初期化は分かりにくい

アンドロイドアプリ作りました play.google.com 良かったらプレイしてみてください。 概要 C++の初期化関係が複雑に感じたのでまとめました。 初期化の種類 まず、以下の3つの初期化が存在するのが分かりにくいです。 // デフォルト初期化 Foo foo; // 値初…

生配列よりもstd::arrayを使った方が良い理由

C++

概要 生配列を使う人がstd::arrayを使うきっかけになれば良いなと思います。 パフォーマンス 最適化をかければstd::arrayは生配列と全く同じアセンブリを吐き出す事が知られています。 つまり、パフォーマンスに差はありません。 アルゴリズム アルゴリズム…

forに名前を付けてあげましょう

C++

概要 何故forを使うべきでないかを解説します。 比較 とりあえず、forを使った例と使わなかった例を見てみましょう。 // for int items_count = 0; for(auto item: v){ if(item == 3){ ++items_count; } } // non for int items_count = std::count(v.begin(…

Initを作らないで

C++

モチベーション Initとかの関数作る人多いので、無い方が良いって事を伝えたいです。 Initが駄目な理由 一番の理由は標準機能では無いからです。 Initがあるクラスもあれば、無いクラスもある。InitじゃなくてConstructかもしれないし、Startかもしれないし…

shared_ptrとunique_ptrとweak_ptr

C++

モチベーション スマートポインタの使い方を勘違いしている方が多いので スマートポインタの意味 スマートポインタの一番重要な所はポインタに意味付けする事ができる事にあります。 shared_ptrは共有するポインタである事を示し unique_ptrは自分で開放する…

依存関係を隠さないで

C++

モチベーション 依存関係を隠そうとして依存関係を深くしないように。 どちらが良い設計? Foo::Foo() { texture_ = Singleton::GetInstance()->GetTexture(); } // 依存性無しに構築できる? Foo foo; Foo::Foo(const Texture &texture): texture_(texture) …

namespaceとUtilityクラス(staticメンバ関数)

C++

モチベーション namespaceとUtilityクラスでは同じような機能を提供できる。どちらを使うべきか。 namespace namespace Foo { struct Object {}; void Function(Object) {} } int main() { Foo::Object foo; // ADLにより解決されるので簡易にかける Functio…

メンバ初期化子

C++

モチベーション メンバのコンストラクタ初期化子と宣言初期化子って役割被ってるので、どういう時にどっちを使った方が素敵か考えてみました。 コンストラクタ初期化子 class Foo{ public: Foo() // コンストラクタ初期化子 : a_(0) {} private: int a_; }; …

std::experimental::optional

C++

モチベーション ついにoptionalが標準ライブラリに来て嬉しかったので。 optional C++17にはoptionalが追加されるようです。 optionalを使うと以下のような処理が改善されます。 取得に失敗する関数を書く時どうしますか? #include<iostream> struct Foo { Foo()=defa</iostream>…

Pimplイディオムはアンチパターン

C++

モチベーション ある時、Pimplイディオムはアンチパターンという言葉を聞きました。 良いパターンだと思ってたので何でだろうと考えてみました。 Pimplイディオムの利点 class Foo { public: // 公開部分 private: class Impl; std::unique_ptr<Impl> pimpl_; }; </impl>…

UNUSEDをやめよう

C++

モチベーション C++でのCライクなコード撲滅キャンペーン UNUSED voidでキャストすると使われていない変数のwarningを消す事ができます。 #define UNUSED(x) (void)(x) void Func( int a ) { UNUSED(a); } C++ C++では以下のようにスマートに書けます。 void…

RAIIから考える良いクラス設計

C++

モチベーション 良いクラス設計を考える。 RAII RAII(Resource Acquisition Is Initialization) リソースの確保を初期化時に行う手法。 拡大解釈してInit関数作るから大丈夫って考え方もあるみたいですが、私は否定的です。 可能ならばコンストラクタで全て…

スコープ

C++のオススメ学習順 > スコープ namespace、グローバルスコープ、ローカルスコープ等のスコープとインスタンス寿命に関する記事です。 範囲をオブジェクトで表現するメリットについて C++のローカルスコープとオブジェクト寿命

C++のローカルスコープとオブジェクト寿命

C++

モチベーション 一定区間の開始、終了関数やフラグ変数の問題を改善します。 クリティカルセクション 英語wikipedia http://en.wikipedia.org/wiki/Critical_section pthread_mutex_lock( &cs_mutex ); // マルチスレッド処理 pthread_mutex_unlock( &cs_mut…

#ifdefだって置き換えられる

C++

#defineによる定数やマクロの置き換えはconst, constexpr等で可能です。(全部ではないですが) #ifdefの置き換えは可能なのでしょうか? class Calc{ public: void Execute(){ int a = 1; int b = 2; int c = a + b; #ifdef DEBUG std::cout << c; #endif }…

コンパイラファイアウォール

C++

概要 依存関係を減らしコンパイル時間を減らすという考え方です。 手法 インターフェース 前方宣言 PImpl インターフェース インターフェースを継承した様々なクラスを知らずに使えます。 // foo.h struct Foo{ virtual void Func() = 0; virtual ~Foo(){} }…