プログラミング
C

概要

  • C++とSTLの細かい書き方
  • 未定義
    • O0で動いてO3で死ぬ -> 未定義を踏んでいる
    • O3で動いてO0で死ぬ -> 未定義を踏んでいる

下位ページ

目次

C/C++の発達段階

  • C言語にはいくつかのレベルがある
    • valgrind, テスト,ドキュメント,その他を全て考慮した作業スタイルというか手順総体を学ぶ教育はあるのか?
段階許される開発習得すべき技術
入出力がきちんと動いているかも確認しない
ソースコードコピペをしない再利用性が死んでると,ファイルごとコピーみたくなって,メンテナンス不能なので,マジそれだけはやめて
入出力がきちんと動くことを1回確認する
メモリバイオレーションしない+未初期化変数を使わない共同開発で必須valgrind, cppcheck, コーディングルール.-O0でメモリクリーンを保証できないなら,-O3する資格はない.
変数名をきちんとつける共同開発で必須コーディングルール
アサートを入れるコーディングルール
try-catchする
コメントを適切につける(意味のないのはNo)共同開発で必須コーディングルール
入出力がきちんと動くことをスクリプトで自動確認する=擬似テスト駆動共同開発と大規模開発で必須問題が起きた時にテストを追加していく+サンプルと同様の役割を果たす
メモリリークしない組み込み・OS・サーバアプリケーション
網羅的な入出力できちんと動くことをスクリプトで自動確認テスト駆動=基本的には費用対効果で,網羅するかが決まる.UIとか無理なのもある
変数名,コメント以外のドキュメンテーション外部ライブラリで必須
セキュアプログラミング外部ライブラリで必須fortify, コーディングルール
  • 組織の習熟も必要
    • C++は能力のある人じゃないと書けない,だけではなく,能力のある組織でないと書けないが,C++を書いていいくらいの組織の能力とはなにか.
    • その時代ごとにルールは違う.オブジェクト志向が出ていなかったころのルールと今のルールは違う.
    • もちろん言語ごとにもルールは違う(C++じゃないとvalgrindとか言う必要ないし).
    • コーディングルール,Assert, テスト,valgrind, gdbなどいろいろありすぎるが,全部まさかやっていないよね.

Tips

イディオム

操作プログラム備考
there exists m in N n = 2^mlong long n; n & (n-1)
iのn bit目を参照!!(i&(1<<n))
iのn bit目に1を書き込みi|=(1<<n))
iのn bit目に0を書き込みi&=^(0<<n))
文字列が初めてマッチしたインデックスの取得string s; int i = s.find(to_find_string);find_first_ofではないので注意!見つからなかったらstring::npos(-1)
多次元配列の初期化int dp[2][50][1010]; memset(dp, 0, sizeof(dp));
sumしながらmodもする(sum += a[i]) %= MOD
  • データ
データ型関数
reverse(begin(x), end(x)); sort(begin(x), end(x)); find(begin(x), end(x);string, vector, 配列などに使える
string.find(string)文字列から文字列を検索して,初めにマッチした添字を返す.STLのfindは文字列から文字の検索にしか使えない
vector<int>({0, 0})簡単なvectorの作り方

STL

vector

strstream

  • ss.str()は終端文字std::endsを自動挿入しない
       int code = 1000;
       std::strstream ss;
       ss << code << std::ends;

map, reduce, filter

  • サンプルコード
  • transform(1変数版,2変数版がある), accumulate(1変数版のみ), copy_ifが対応
  • 上書きしないで,新たに変数を作って書き込む場合は,back_inserterを使う
  • 2変数版accumulateは作ってしまえという感じある
  • あとiteratorを使いたい場合にも適用不能

量化関数

文法

pure virtual

  • 純粋仮想にはvirtual = 0としなければならない。
  • それを引く仮想にも、virtualとしなければならない。

ゲッタ・セッタの生成プログラム

  • これに"int test"などを入力すると,ゲッタとセッタを出力してくれる
    awk '{printf("%s get%s(void){return %s;}\nvoid set%s(%s %s){%s = %s;}\n", $1, toupper(substr($2, 1, 1)) substr($2, 2), $2, toupper(substr($2, 1, 1)) substr($2, 2), $1, $2, $2 "_", $2);}'
  • 本当はvim scriptでやりたいのだが…

newと実体の動作の違い

  • 完全にコピーコンストラクタがおかしい以外考えられない。
    • new delete newで正常動作して、実体定義、実体代入で正常動作しない

親のコンストラクタを呼ぶ

decisionCross::decisionCross(StockDayStream* stock, int s, int m, int a)
    : decision(stock), _s(s), _m(m), _a(a)
{
}

sstreamとstrstream

  • str()が,sstreamはstd::string型を出力し,strstreamはchar*を出力する
  • strstreamはstd::endsを最後に入れる必要があるが,sstreamは入れてはならない.

coutに表示させる

#include <iostream> 

class HoldingStock {
public:
    int m_code;
    std::ostream& operator()(std::ostream& ros) {
        ros << m_code << " " << m_code << " " << m_sl << " " << m_tp;
        return ros;  
    }                 
};

メモリ管理

  • std::unique_ptrは所有権を唯一(unique)持っているように振る舞うスマートポインタです。
    • つまり、複数のstd::unique_ptrのインスタンスが同一のメモリ領域を管理することはありません。
    • std::shared_ptrと同様に変数の寿命が来た時に、自動でメモリ領域を解放してくれます。

isnanがあいまい

  • std::isnanとすれば解決

absは危険

  • absを使いたいときはstd::absとする.
    • 無名空間のabsの返り値はlongで非常に危険.

fstreamのパターン

 std::ifstream fin(args_csv);
 std::string line;
 while (std::getline(fin, line)) {
   std::string token;
   std::istringstream stream(line);
   while (std::getline(stream, token, ',')) {
     std::cout << '[' << token << ']' << std::endl;
   }
 }

知識

  • 文法とコーディングルールを分離すべきかも
  • 文法
知識名サンプル備考
親クラスがテンプレートクラスである場合、そのメソッドを呼ぶときにはthis->を明示http://d.hatena.ne.jp/tkng/20110419/1303176182
using namespace Namespace;はclassの中に書けない.
using Namespace::Classname;ではClassnameでアクセスできない.
using RoboLink? = ::Link;はclass public: の中になら突っ込める
constメソッドは,constメソッドを持つクラスのメンバ変数を変更しない形式的には,「constメンバ関数内から見た,メンバ変数は実体の場合&aがconst T*型となり,ポインタの場合aがT* const型となる.」と考えるとよい.例えば class hoge {int a; int* getA const { return &a; } };は,constメンバ関数内では&aがconst int*型なのに,返り値がint*なのでアウト,とか.(constメソッドは,constメソッドを持つクラスのメンバ変数を変更しない.クラスが有するHoge型メンバ変数aに対しては,aの中身の無変更を保証するために&aがconst T*型となる.一方,constメソッドを持つクラスが有するHoge*型メンバ変数aPtrに対しては,aPtr自体の無変更を保証する一方,aPtrの中身が変わるどうかは知ったことではないので,int* const a;とポインタ自体の変更を認めなくする.)
「constメンバ関数では、暗黙的に渡されるthisポインタがconstで修飾される」が最も基本的ISO/IEC 14882:2003, 9.3.2 The this pointer[class.this]
静的メンバ関数で,staticを付けるのは定義のみで,実装には付けてはならない
引数1コのみ持つコンストラクタは,暗黙のうちにコピーコンストラクタも定義Hoge(int hoge) { this->hoge = hoge; }はHoge hoge = 10;
引数1コの暗黙のコピーコンストラクタはexplicitで抑制できる
range based forを使っても良いfor(auto& x : v) { x *= 2; } C++17の話も http://qiita.com/rinse_/items/cdfce8aa6a685a8ebe0c http://imoz.jp/note/cpp11.html http://dtyazsk.blog.shinobi.jp/c--/c--11%E8%B6%85%E5%85%A5%E9%96%80 http://minus9d.hatenablog.com/entry/20130815/1376557665
namespaceのエイリアスをすると長い名前を短縮できるnamespace shortname = veryverylongnamespace;namespace netque = torutk::network::que;
namespaceの完全記述using std::endl; using std::cout; using std::cerr;はよく使う
ヘッダファイル中にusingディレクティブを使用するのは禁止
名前空間を複数の場所で定義しても、それらは同一
using宣言は,「それが書かれたスコープに」そのシンボルを追加する.名前空間そのものを取り込むわけではなくあくまでシンボルを取り込む
グローバル名前空間は、namespaceのブロックに囲まれていない場所で,::でアクセスchar path[::FILE_PATH_MAX];
クラス内に効果を持つusingは実はできないやりたいならnamespace E { using namespace std; /*OK*/ class Hoge { public: string s;};} http://blog.wizaman.net/archives/542
Cのconst int* const a;とは,前のconstは中身が変わらないという意味,後のconstはポインタ自体が変わらない前のconstは int const * const としても良い
静的変数・メソッドはアクセス制限のあるグローバル静的メンバ変数はオブジェクトに属するメンバ変数ではなく、クラスに属するメンバ変数です。アクセス制限が設定されていることを除けば、グローバル変数と同じ
epollC++の通信をコンカレントに行うことができるシステム
  • コーディングルール
    知識名サンプル備考
    vector<bool>は使ってはならないhttp://d.hatena.ne.jp/aki-yam/20120307/1331117485
    hppもcppもnamespaceで囲うcppはusing namespace Namespace;でもできてしまうが,非常に不自然な上,明示的でないので,きちんと囲うこと.
    C++ではtypedefの代わりにusingを使う可読性が高く,テンプレートをtypedefできる.http://notmoon.hateblo.jp/entry/2015/05/13/151939 http://cpplover.blogspot.jp/2009/05/ctypedefaliasdeclaration.html http://qiita.com/Linda_pp/items/44a67c64c14cba00eef1
    C++はキャスト演算子を使ってのセマンティクスを明示すべきCのキャストは危険なのとセマンティクスが多義的なので良くない.static_castはいつものキャスト.const_castはconstとvalatileを除去するキャスト.reinterpret_castは基本非推奨.void*, int*への変換でWinAPI32とかで使う.dynamic_castは基本非推奨(継承関係をチェック。キャストできればキャストしてキャスト後の値, キャストできなければfalse.この処理にはポリモフィズムを使用すべき.従来のC風のキャストを使用したコードを安全に置き換える用途以外には使用すべきではありません) http://www.s34.co.jp/cpptechdoc/article/newcast/ http://d.hatena.ne.jp/tmatsuu/20090717/1247835994 http://www.geocities.jp/bleis_tift/cpp/newcast.html
    C++では,Cのポインタのセマンティクスがシンタックスに対しことて多義的なので,スマートポインタ群を使うべき安全性と開発速度の向上が見込めるだけでなく、プログラマの意図に合わせて「ポインタ」を記述し分けることができる.基本的には全部shared pointerで,外に出すときはweakにして責任がないことを明示し,クラス内やメソッド内の限られたスコープの場合はuniqueにする.uniqueだったものを外に出したくなる場合は当然ある.そういう時にはuniqueのポインタをsharedに書き換える.速度は?スマートポインタのいいサンプル集 リンク make_sharedを使うと良い スマートポインタとデザインパターンの連携 unique_ptrの使い方実例
    バージョン管理をnamespaceで実現可能ライブラリ側のコードnamespace XXLib {namespace V1 {バージョン1の機能} namespace V2 {バージョン2の機能} } ライブラリ使用者側のコードnamespace Library = XXLib::V2; Library::func(); // バージョン2の func() を呼び出す
    using namespaceは安易に使わない.特にusing namespace std;std空間の全ての変数を把握したり、拡張を予期するのは無茶
    C++ではcstdioのようにすることによって名前空間に包んだ安全な関数を呼び出せる
    C++では,メンバ関数の初期化をhppで行うべき全てのメンバ変数が少なくとも未初期化でないことが保証できるので嬉しい.速度を超攻めるときはこの限りではない.http://qiita.com/YYSS_101/items/cbd06352e047116359ce
    Cの生ポインタは,誰が開放責任を持つかは自明ではないので,必ず開放責任をコメントを書く
    所有とは、リソースの所有者が(1)自身が所有しているリソースは所有者以外の者からは決して解放されないという権利と(2)自身が所有しているリソースを最後に解放するという義務を負うこと
    C++11の時点で生配列は非推奨一般的に静的配列にはstd::array、動的配列にはstd::vectorが使われています。
    ライブラリは,絶対分かるassertを吐いて死ぬ(Eigen型)か,return 1のエラーコードを返して死なないライブラリは絶対勝手に死んではならない
    継承する時、親と子で同じ変数を持ってはいけない。そもそも親のメンバ変数にアクセスするには、Super::val = 3;
    テンプレート子クラスは、親のメンバ変数にアクセスするときには、必ずSuper<T>::val = 3;
    コンストラクタ・デストラクタでpure virtual関数の実装を呼んじゃダメ!!pure virtual method called普通に
  • 雑学
知識名サンプル備考
C++はセマンティクスとシンタックス,から統一的に理解できるcastは同じシンタックスで複数のセマンティクスが可能だった.ムーブコンストラクタは,セマンティクスに対するシンタックスがなかった.スマートポインタも.
C++11普及していないのはRHELが悪いRHEL 6のGCCのバージョンは4.4である。これは。C++11をまともにサポートしていない。次のRHELのバージョンは7であるが、これにはGCC 4.8が入るものとn思われる。しかし、すでにGCCの安定版は4.9だ。GCC 4.8もC++11実装に不具合が色々あってあまりお勧めできない
スタティックおじさんhttp://itpro.nikkeibp.co.jp/atcl/watcher/14/334361/122100450/
mainの前に関数を呼ぶattribute constructorというものがあるhttp://0xcc.net/blog/archives/000091.html
例外起因のメモリリークRectangle* r(new Rectangle(p1, p2)); if (in_a_mess) throw Mess(); // 例外を投げてみる // ねぇ、例外が投げられたときの後始末は? delete r;
C++11を業務で使うことが許されない場合、Boostライブラリからスマートポインタが利用可能
デストラクタを前提としたC++ではそもそも特別な仕組みを使わないと循環参照の解決は出来ないスマートポインタでたまに「循環参照が~」とか言って文句つける人が居ますが、冷静に考えてみてください、循環参照を発生させた時点でデストラクタの安全な実行が出来ません(片方を先に破棄すると、もう片方のオブジェクトはダングリングポインタを持つことになる)。
g++ --verboseでIオプションの場所が全部出る
gccを使っていれば以下のコマンドで簡単にどの行が何回呼び出されたか調べることもできます。g++ --coverage tmp.cpp -o tmp

疑問と後でまとめる

  • externについて.メソッドでexternをつけるのは慣習でしかない?変数だったらもちろん意味があるんだけど.
  • ただデータ形式を変換するだけのクラス(実体がある必要が感じられないという意味)の実装方法ってどうすればいいんだろう?
  • GoFデザインパターンとはクラスのメソッドを使用するにはそのクラスのインスタンスを生成しなければなりません。しかし、共通ライブラリのように使用頻度の高いメソッドの場合、そのつどインスタンスを生成していては効率が悪いのためstaticメソッドにすることが多い
  • unitテストは全部のテストを統合した実行ファイルを作るべきなのか,一つ一つ実行ファイルを作るべきの?
  • 例えばC++0xマスターが書いたプログラムは共同開発の時にエデュケーションコストを要求することになるが,それは組織の責任であるべきなのか.

例外(try, catch, throw)を学びたい

http://wisdom.sakura.ne.jp/programming/cpp/cpp35.html http://ufcpp.net/study/csharp/misc_exception.html 「メソッドの定める結果を達成できないなら例外を投げる」という方針でOK 利用法上の例外: 利用者側が正しい使い方をしていれば回避できる例外→例外はキャッチしない.例外の発生しうるメソッド本体(Doer: do するもの)に対して、 事前チェック用のテストメソッド(Tester)を用意する方法のことを Tester-Doer パターンやTryParse?パターンを使うと呼びます。これを使う 発生は避けれないが、復帰可能な例外→対処可能なら catch して対処してしまう。対処できない(あるいは、対処をもっと上の階層にゆだねた方がいい)場合catch しない。あるいは、一度 catch して、いくつか必要な操作(中途半端な状態を残さないためにロールバックを行ったり、ログを記録したり)を行ってから例外を再度投げる。標準の例外とは違う処理が必要な場合にのみ、自前で例外クラスを作成する(??).例えば、FileNotFoundException? を catch せずにそのまま上位に流してもいい場面では、自作の例外でラップしたりはしない。 以下の例面白い.ExistsからReadでファイルが消えている可能性を例外で潰す try {

   if (!File.Exists(filename))
   {
       text = "デフォルトのテキスト";
   }
   else
   {
       text = File.ReadAllText(filename);
   }

} catch(FileNotFoundException?) {

   text = "ファイルがなくてもデフォルトのテキストがあれば OK";

} 対処のしようがない致命的な例外は,何もしない.

ラムダ

  • 文法
    • [ キャプチャ ] ( パラメータ ) -> ret { 処理; }
  • 最小の例
    int main(int argc, char *argv[]) {
    	[]	// ラムダキャプチャ。スコープの変数を&なら参照=ならコピーでキャプチャ。	()	// パラメータ定義節(省略可能)
    	{}	// 複合ステートメント
    	()	// 関数呼び出し式(定義するだけなら省略可能)
    	;
    	return 0;
    }
  • 戻り値のラムダ
    int main(int argc, char *argv[]) {
    	[]	// ラムダキャプチャー
    	()	// パラメータ定義節(省略可能)
                    -> float  // 戻り値の型の指定(省略可能、省略すると推定される)
    	{return 3.14}	// 複合ステートメント
    	()	// 関数呼び出し式(定義するだけなら省略可能)
    	;
    	return 0;
    }
  • 代入できる
    auto func = []{ std::cout<<"Hello world"<<std::endl;};
  • ラムダキャプチャ補遺
    • =でキャプチャした変数はconstなので代入不能(mutableをパラメータ定義節のあとにつけるとconstが外れる)
      // a,bを参照、それ以外はコピー
              [=, &a, &b] () mutable { } ();
       
              // a,bはコピー、それ以外は参照
              [&, a, b] () mutable { } ();
  • クラスメンバ関数内部のthisをキャプチャしたラムダは、内容を変更可能(thisがポインタなので)
    [=]{this->i = 1;}();
  • functionを使うとラムダを返せる。キャプチャは必ずコピーでなければならない。
    #include <iostream>
    #include <string>
    #include <functional>
    using namespace std;
    std::function< void() > f() {
           string str("Hoge");
           return [=] { cout << str << endl; };
    }
    int main(int argc, char const* argv[])
    {
            auto func = f();
            func();	// 代入して呼び出し
     
            f()();	// 代入せずに、呼び出し
            return 0;
    }
  • std::functionをつかうと関数ポインタのtypedefが楽
#include <bits/stdc++.h>
using function_t = std::function<int(int)>;

その他

  • Cの関数のデフォルト(hppにデフォルトを書くと怒られる) void func(double t0=NAN, double t1=NAN) {} http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01065.html
  • 以下を右辺値参照で何とか実装できないか
    OK
      Vector3d minusg = -g;
      m_baselink->setVd(minusg);
    NG
      m_baselink->setVd(-g);

ラムダ

  • ラムダがいい時は以下の場合である。
    1. 関数オブジェクト作る時、なんでここでしか使わない使い捨て関数を、上の方に別関数として実装しなきゃいけないんだよ!意味論的に近いものは近くにあって欲しいよ!
    2. 文脈まるまるキャプチャする機能を実装するのたるいよ!
    3. 関数名つけるまでもねーよ!!

forループの&の使い方

  • 一般論としては、目的に応じ下記2種類を使い分ける
for (auto&& e : c):要素eを書き換える可能性がある
for (const auto& e : c):要素eを参照するだけ

整理されていないもの

/home/hamko/git/sample/c++/member_function_pointerにメンバ関数のポインタについていい感じにまとめた 一つのcppファイルが,複数の実行ファイルのコンパイルに使われる場合,not usedが現れてしまうがどうすればいい?‘NODATASTRING’ defined but not used [-Wunused-variable] テストを書くメリットまとめ http://www.slideshare.net/hakoika-itwg/4-14292568 僕のテストの問題点として,実際のMakefileとテスト用のMakefileが同じでなければならないのに,Makefileを分けてしまっているせいで何なのかわからなくなっている ただデータ形式を変換するだけのクラス(実体がある必要が感じられないという意味)の実装方法ってどうすればいいんだろう? 間違い探しのページを作りたい 横で比較できる奴 makeのいい感じの依存の作り方 コーディングルールのかなり量があるもの http://d.hatena.ne.jp/prettysoft/20101019/1294164743 名前空間stdってなんであんなにでかいんだ? http://www.sciencemag.org/content/350/6266/1332.full.pdf ar s または ranlib shared_ptrはバイナリ境界を安全に超えられる,とは 尚、配列を使う場合はboost::shared_arrayをどうぞ。 あのリンク構造をスマートポインタに直したら成長できそう valgrind cleanを担保するスケルトンプロジェクト、依存ライブラリの依存関係をmakeするスケルトンプロジェクト テスト駆動のメリットして,間違えて行消しちゃった系も検出できること doxigenが良いのかわからないけど,eigenのドキュメンテーションを参考にドキュメンテーションの方法論を学ぶ gdbももっと勉強しないとやばい ptrdiff_t テストの実行ファイルの分け方は?実務ではどうなっているのだろうか. git commitのコメントメッセージも,コンパイルが通るのかテストが通るのか何なのかは最低限書かないといけない. 並列化のデザインパターンを知りたい namespaceはいいけど,ファイル名が被ったらどうするの? L1-L3の危険を実装したテストがほしい. 最適化済みのコードをデバッグすることは何の役にも立たない(このページはものすごくまともな人が書いていてよい) http://blog-ja.intransient.info/2011/05/c-23.html timer.cppというファイルで,time_valというクラスが実装されているのはどうなんでしょう そのcppにはiostreamはincludeしていないけど,他のhppがincludeしてるから動くみたいなのはありか? バッファオーバーラン https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_01.html ソフトのデプロイ時,利用したライブラリのマイナーバージョンまで言うべきでは effective C++ C++クラス,pubとpriどっちを先に書くべきか .aと.soの違いは? 標準エラーのless eigenは早い http://eigen.tuxfamily.org/index.php?title=Benchmark constexprしりたい ClosedDynamics?を元としたスケルトンプロジェクトを作りたい.静的ライブラリのスケルトンプロジェクトとして優秀なので isnan, constexpr (static constはだめで,static constexprとする必要) http://ja.stackoverflow.com/questions/1920/const%E3%81%A8constexpr%E3%81%AE%E9%81%95%E3%81%84 http://www.slideshare.net/GenyaMurakami/constexpr-10458089 完全hppライブラリはどうやって作るのか? hppとcppを分ける意味って何? inlineの意味 TBB http://www.amazon.co.jp/exec/obidos/ASIN/4873113555/38211352-22/ C++でわかっていないといけないこと http://qiita.com/shirakawa4756/items/7430f447883a74831bf9 委譲のメリットですが、やっぱり動的(実行時)に親クラス(委譲先)を変更できるところでしょう。単に委譲先を固定してしまっている場合はあまり価値は感じられないと思います(海外のコードでは委譲と言えば動的で、静的に固定した委譲というのはあまり見ません)。 OpenGL ライトが有効だと色が変わらない http://dixq.net/forum/viewtopic.php?f=3&t=13583 gdbできないので,終了コード1でエラー吐いて死ぬのためてもらえませんかね boostとコピコンの勉強もだな… vectorにインスタンスを突っ込むときの注意 http://www.himajin2001.com/fswiki/wiki.cgi?page=%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC-%A5%DD%A5%A4%A5%F3%A5%BF%C7%DB%CE%F3%A1%A2vector%A4%CE%CD%EE%A4%C8%A4%B7%B7%EA 文章を書くときは初出の単語は必ず定義をしなければならない.プログラミングのコメントとはそういうものだと思うのだが まずそれが何なのかを言う.初期触覚ポリゴン->PolygonTactileInitial?など 関数の最後以外でreturnやthrowするというのは,関数の後のほうのdeleteを忘れているリスクがある 仕事がある程度の段階まで進むと、 あちこちに歪みやアラが目立ってきて、 全部「 はじめからやり直したい 」という気持ちが強くなってきます。 これを私は「はじめからやり直したい症候群」と呼んでいます。 この症候群の特徴は、以下のような言葉で表現できます。 あっちとこっちが 統一されていない のが気になる いまはAとBとCと別れているけれど実は 汎用的な Gで対応できるはずだ XとYがごちゃごちゃしていてわかりにくいので 全体的に整理 したい 要するに、全部捨ててゼロから作った方が 絶対 よいものになるのだ でも、安易にはじめからやり直すと、 たいていは失敗します。はじめからやり直す場合は,詳細な計画のもとにやりましょう ack https://www.digitalocean.com/community/tutorials/how-to-install-and-use-ack-a-grep-replacement-for-developers-on-ubuntu-14-04 http://lealog.hateblo.jp/entry/2012/10/02/234021 http://yut.hatenablog.com/entry/20110523/1306111855 ack --cpp hoge, ack -l hogeでファイルのみ出力, ack -i hogeで大文字小文字を無視 intとstringの変換http://stackoverflow.com/questions/5590381/easiest-way-to-convert-int-to-string-in-c 複数のgitレポジトリにまたがって開発している場合,TMGLがこれでClosedがこれでTactileGlove?がこれ,とやらないといけない.つらいけどどうすればいいの? CNN http://vision.stanford.edu/teaching/cs231n/syllabus.html 10年保守する可能性のあるライブラリってどうすればいいの?行列演算ライブラリが競合しまくるんだけど Makefile http://pokotsun.mydns.jp/?p=1503 GPGPU http://codezine.jp/article/detail/8429 OpenGLって並列になってるの?だとしたら並列の処理をきちんやらないといけないけど,本当になっているのか,どういう計算順序になっているのか,idleとは一体何なのか,などがわからない std::function http://torini.hateblo.jp/entry/2015/03/22/%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%82%88%E3%82%8A%E3%82%82std%3A%3Afunction%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86 using estimateTorquesFunc? = Eigen::VectorXd? (Closed::Dynamics& d); extern estimateTorquesFunc?* g_estimateTorques; KISSの原則(迷ったらシンプルに) https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87 OpenGL http://cpplover.blogspot.jp/2014/05/opengl.html http://richg42.blogspot.jp/2014/05/things-that-drive-me-nuts-about-opengl.html MVCの必要性とpushMVCとpullMVCの違い http://qiita.com/tshinsay/items/5b1724baf32b8b5113c2 MVCの勘違いわかりやすい,これはVがMを参照しているのでpulllMVC. http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636 MVCのかなり情報量のあるページhttp://kray.jp/blog/think_about_mvc/ ソフトウェアを設計するという感覚がないなあ ビューワのデバッグとかテストってどうするの?UIもそうなんだけど inline http://yukishimakana.blog.fc2.com/blog-entry-10.html コンパイルが通らないということは,バグを未然に防ぐ機能がしっかりと働いているということ,という価値観になるような開発スタイルが大事 ar rcs libclass.a class1.o class2.o class3.o cc main.c libclass.a Linux→winで改行コードが消える問題。nkfの-Lu, -Lwで解決できる。 http://takuya-1st.hatenablog.jp/entry/20100511/1273585953 vimの移動コマンドについてhttp://haya14busa.com/mastering-vim-easymotion/ デバッグとは「ありえたはずの未来」を枝刈りしていくこと.ありえたはずの未来はバグの原因が一個だと前提できれば木構造になる.2個以上だとテーブル構造になりやばい.そのなるべく上流を切る テストをうまくかけるようになると,デバッグの時間をテストの時間に移すことが出来る.テストを書くほうが単純作業ではあるが,かかる時間の分散が低い上,流れ作業というか単純作業なので,全体の頭を使わない感は増す if (testeiofjosidfj)

 cout << “#” << endl;

は,coutだけコメントアウトしてしまうリスクがある.カッコでくくること. http://srz-zumix.blogspot.jp/2015/11/cpplint.html google style guides 任意の多面体形状http://www.wakayama-u.ac.jp/~tokoi/vrml/vrml.pdf オープンソースの定義 http://www.atmarkit.co.jp/flinux/special/opensource/opensource01.html オープンソースの素晴らしさは、世界中の誰もがあなたのソースコードをより良くできることにある ライセンスわかりやすい http://smkn.xsrv.jp/blog/2009/03/summary_for_gpl_mit_cc_etc/ http://d.hatena.ne.jp/cou929_la/20080508/1210252204 日本語に翻訳されたものを置いても、ライセンスとしては効果を発揮しません。 BSDとApache以外は商用だと危険.MITはOKじゃない? ライセンスを適応しないと… http://www.catch.jp/oss-license/2013/09/10/github/ ライセンス,アウトなことを網羅的にまとめたい.GPLで何したらだめとか で,結局使うときと配布するとき,それぞれで何すればいいの? Apacheを使う場合.http://vividcode.hatenablog.com/entry/license/android-app-with-apache-license-2.0 MITを配布する場合,トップフォルダかソースコードにMITだよと書けば良い.http://www.catch.jp/oss-license/2013/09/27/mit_license/ 表にまとまっているhttp://qiita.com/tukiyo3/items/58b8b3f51e9dc8e96886 MPLは,library.cを改変したらlibrary.cをの公開義務有り,http://oshiete.goo.ne.jp/qa/8585493.html ライセンス系は全くきちんとまとまっていないので,表にしてまとめたい GPLにするとこんな面倒なことが http://takeshich.hatenablog.com/entry/2015/01/28/161710 http://takeshich.hatenablog.com/entry/2015/10/04/004036 GPLでは、そのソフトウェアのバイナリ(実行形式ファイル)を入手したユーザが、ソースコードの開示を要求した場合についてのみ、その要求に応えてソースコードを開示する義務があります。 言い換えると、ユーザでない人にまでソースコードを開示する必要はありません。 独占的なユーザがいるばあいは,その人の開示要求だけに答えれば良い.しかし,ソースコードを受け取ったその顧客がアプリケーションやソースコードを有償/ 無償を問わず別の第3者に提供することをを制限することはできません。つまり、誰でもソースコードを手に入れられるという状況を完全に阻止する手段はありません。 MPL: The copyleft applies to any files containing MPLed code. LGPL: The copyleft applies to any library based on LGPLed code. GPL: The copyleft applies to all software based on GPLed code. PL系は,バイナリを使った人がソース欲しいといってきた時には開示しなければならないということ. GPLのライブラリを使っていたが,個人利用だったので公開義務はなかったが,GPLの感染により商用利用を許可しなければならない.しかしある時,共同研究者がバイナリを利用するときに,ソースコードの公開を要求した.共同研究者が卒業して貰ったソースコードを改変して商売をし始めた.これはOK,になってしまう. Githubのプロジェクトの半分はライセンスが無い 著作権法では、ライセンスが無いものを使うと著作権侵害になる Githubはライセンスが無いものはデフォルトでApacheV2かCC-BY扱いにするとか何とかしろ “(C)”、を使うことは法律上なんの意味もありません. Copyrightは国際慣習 線形計画法の計算にはフ リーのラ イブ ラリのGLPK(GNU Linear Programming Kit)4) を用い,二次計画法の計算にはフリーのライブラリ OOQP(Ob ject Oriented software for Quadratic Programming)5) を用いた. EigenはMPL, OpenCVはBSD, OpenGLはSGI (SGI Free License B)?, pukiwikiはGPL, liboctaveはGPL, BoostはBoost Software License, libjpegはBSD-like, liboctaveのライセンスとかってどうやって調べるの?

Boost Software License という、ソースコード配布時にのみライセンス表記等が必要というかなり緩いライセンス http://cpplover.blogspot.jp/2013/03/boostcstdinthppendianhpplimitshpp.html

Apache 2.0ライセンスでオープンソース化,らしいが,内部でMPL使っているんだとMPLで配布しないといけないんじゃないの? OpenMPはAPIの仕様の名前なので、ライセンスはOpenMPを実装するコンパイラ次第だと思います。 http://openmp.org/wp/ zlib/libpngライセンスは要約すると(するまでもないほど短いが)・使うなら勝手に使ってくれ。何も書かなくても構わない。でも書いてくれたら嬉しい。・自分が作ったとかテキトーな事を言ってはいけない。・ソースを流用したときはそのことを明示し、ライセンス条文をつけること。 freeBSDとBSDには関係有り BSDはアカデミックによく使われる 明示レベ得るの分類が面白い http://www.atmarkit.co.jp/ait/articles/0906/26/news129.html 具体的にどう表示すればいいかhttp://www.atmarkit.co.jp/ait/articles/0906/26/news129_2.html 実際にあった例として、To Heart 2 というゲームソフトで、xvidのライブラリが混入していました。これはユーザーによって発見されたのですが、結局このゲーム会社には弁解の余地がなく、GPLに基づきソースコードを公開することを決断しました。これによる損害は、ソフトウェアそのものよりも、むしろソースコードの汚さとライセンス管理能力による会社の信用力低下でした。http://leaf.aquaplus.jp/product/xvid.html プロプライエタリ版を出すことは、本名や住所などの個人情報がネット上でばれるばかりでなく、年末調整や住民税の通知などによってオープンソースをやっていることが会社にばれて解雇されるリスク GPLはバイナリとソースをセットにして渡さなければいけないという意味 クローズドな開発モデルは、もはやオープンソースに人的リソースの点で勝ち目がない.従ってオープンソース大事 GPLの重要なもの,libarc, libxvid, Blender BusyBox?の不正流用によるGPL違反 systemコマンドを介してgzipを使ったら? GLIBCはLGPL 動的リンク(Windowsでいう.dllなど)として使用した場合は、呼び出し元のプログラムにはLGPLを適応させる必要がありません。 BSDとかapacheとかは,みんなに配布しなくてもライセンスを記載しないといけないの?そうだとgithubとかヤバイよね. OSS順守チェッカを確認 全ソフトウェアの公開とは一体何か.ソニーのICOは,プレーステーションの基本システムも公開も必要なのか.GPLに従ったソフトを勝った人と、ソース開示を禁じる契約を結ぶことはできるか GPL違反を裁判にすることはできるの? 自分の,みたいなのを変数名に明示したい場合ってどうすればいいの? 正しいこと,ダメなこと,仮説を元にデバッグするみたいなコメントシートみたいな感じで頭を整理する手法 Jenkinsといった,マルチディストーション間でのテストとかやってみたい. LLVMで画面上の操作を行うためのプログラミング言語を作ってみたい.もうあるのかの確認は必須 必要なときに,無印,&, &&をきちんと使い分ける関数の作り方を教えて下さい. http://srad.jp/~bnez/journal/274056/ 破滅的関数の使い方.この辺理解できるとかっこいいっぽい http://shnya.jp/moin/C%2B%2B%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4#operator_bool.28.29.2BMG5.2FYA- デザインパターンの理解には,このデザインパターンを少し変えたものは何が問題なのか,みたいなのを考えないといけない gitのコミットメッセージをwikiみたいな感じで使う,というのが正しい気がする デザインパターン何種類か http://qiita.com/disc99/items/840cf9936687f97a482b ビルダー「作成物」と「作成過程」と「作成方法」の分離.ディレクターがビルダーインスタンスを持ち,具体的な変更方法はビルダーに移譲する.ビルダーはconstruct関数を何個かもち,これらがビルダーの関数の組み合わせ方を規定する.ビルダーパターンを使うと,今変更すべきなのは作成過程なのか作成方法なのかを選ぶことが出来るようになる.作成過程と作成方法の切り分けは意味的で,作成方法の変更は難しく,作成過程の変更は簡単になるように分離すれば良い?http://hamasyou.com/blog/2004/06/09/builder/

#elif defined(_MAC) arduino processing serial OpenMPとpthreadは根本的に違う http://d.hatena.ne.jp/mscp/20081006/1261915755 gdb基本 http://bxyxvzz.hatenablog.com/entry/2015/09/07/181137 並列gdb http://bxyxvzz.hatenablog.com/entry/2015/09/08/083237 実践デバッグ技法,欲しいなあ 二次計画問題のポートフォリオ.というかこの資料わかりやすくて良い.http://www.me.titech.ac.jp/~mizu_lab/text/pdf-file/LP9-QP-problem.pdf 二次計画法とガウスカーネルとSVM.非常にまとまってて面白い.http://censored.hateblo.jp/entry/2015/06/09/160623 二次計画法,OpenCVだけど http://suzuichibolgpg.blog.fc2.com/blog-entry-202.html 二次計画法quadprog++(++出ないのもあるので注意),この解説ページの数式は間違っているので注意.等式系は,同じ方向に固まっているので,マイナスがつかなければならない.g++ main.cc /usr/local/lib/libQuadProgpp?.a http://suzuichibolgpg.blog.fc2.com/blog-entry-218.html quadprog++で例外を返す問題があるらしいが.同じデータ点が複数含まれる場合,QuadProg??++は例外を返すことが知られている.abortが頻繁に発生する場合は,同一のデータ点で2回目以降に現われるものは削除する等の前処理を組み入れると良い.また,オプション課題となっているスケーリングを行うと,aboutが減少するとも報告されている. 2次計画問題の解が制約条件を満たさない場合は,solve_quadProg()に与える引数のひとつであるGの対角成分に微小値を加えよ.これは目的関数に同じ式があるとおきる.最小ノルム解を求めるためには,Gに微小な単位行列を足せば良い.##Failure Location unknown## : Error - Error in cholesky decomposition, sum: 0とでる. G=A^t A, g=-b^t Aとしてx^t G x+g^t xを目的関数とすれば良い 引き継ぎは毎年きちんと保守するという意味でも大事 コア数cat /proc/cpuinfo | grep processor ccacheスゴイhttp://oxynotes.com/?p=6846 気兼ねせずmake cleanできるという感じ でもccache clang++が相性悪い感じがした.後で確認. ccacheを使うと,適切にhppをincludeすることによってコンパイルを高速化するというメリットが生まれる 高速化プログラミング http://fast-programming.aglk.net/matrix-calculation/sample1-C.php OpenMPの罠 http://www.isus.jp/article/openmp-special/32-openmp-traps/ vectorの二次元初期化https://topcoder.g.hatena.ne.jp/n4_t/20090520/1242753566 例:time コマンドで計測した 8 並列の実行時間

 real 9.34    ← プログラム実行にかかった時間
 user 69.38   ← CPUがユーザプログラムを処理した時間
 sys 0.15     ← プログラム実行でシステムが使ったCPU時間
 user 69.38 / real 9.34 = 7.43  ← 8 並列の効果があった

実装とヘッダを分ける理由https://teratail.com/questions/10742 Cのinlineは必ずstatic inlineを使う(Linuxカーネルでもそうしている),なぜならstaticがないとgnu90で関数定義が残ってしまうから.そしてヘッダのみに書く.http://masahir0y.blogspot.jp/2012/08/blog-post.html C++のinline修飾子はhppの方には書かない オブザーバとMVCモデル.MVCはオブザーバより粒度が大きいアーキテクチャ・パターン. MVCのモデル図http://www.basuke.com/2012/12/31/%E7%8F%BE%E5%A0%B4%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%894/ UIアーキテクチャ・パターンの違いhttp://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_10/greatblogentry_10_01.html C++でのMVC例 http://www.slideshare.net/TakashiKomada/mvc-26642187 https://www.ogis-ri.co.jp/otc/hiroba/technical/DesignPatternsWithExample/chapter05.html 0xのshared_ptrでオブザーバとブリッジ http://codezine.jp/article/detail/5327 http://myenigma.hatenablog.com/entry/20140821/1408624373 GLUTを使わないOpenGLhttp://www.codesampler.com/oglsrc.htm http://write-remember.com/program/gof_design_patterns/ 参照型は,ポインタ渡しのセマンティクスを保存して,シンタックスを追加したものと解釈可能 実体はデストラクタがブロックの外で必ず呼ばれるという点で安全. クラスの宣言の中で実装しています。こうすれば、メンバ関数は inline と書かなくてもインライン関数になってくれます。 int*& aPtr;とするとポインタの参照渡しが可能 http://marupeke296.com/DP_Singleton.html コピー禁止.http://marupeke296.com/DXCLS_Noncopyable.html git ci -a -m “”で,added a.cppみたいなのって意味ない気がする.コミットメッセージに残すべき情報とは一体何か? git ci -F- << EOFで,C-dで終わらせると3行かける git commit -m "wa-i1" -m "wa-i2" -m "wa-i3"でもoK コミットメッセージの英語のまとめは重要な気がする vimのqをうまく使う.レコーディングはqajjjjjq @aで,5行下に行くhttp://blog.livedoor.jp/nakamura_tech/archives/51337233.html vim中級者. http://qiita.com/jnchito/items/57ffda5712636a9a1e62 14Gが:14<enter>と同等.短いので便利

コードはコミットメッセージによって必ずドキュメント化されている.それを抽出するための方法など. http://postd.cc/every-line-of-code-is-always-documented/ http://qiita.com/itosho/items/9565c6ad2ffc24c09364 特に「Fixed a bug where (バグを修正した)」「Changed (変更した)」の部分にはほとんど情報がありません。バグ修正や変更を目的としないコミットが一体どれほどありますか?メッセージは プログラムを主語とする動詞句 で書くべきです。(そして主語はいつもプログラムなので省略します)http://qiita.com/magicant/items/882b5142c4d5064933bc Git は、各コミットメッセージの一行目だけを取り出してそれを一覧表示するなど、一行目を特別に処理する機能が多いので、一行目にできるだけ多くの情報を凝縮させることは重要 開発フロー研修 http://qiita.com/awakia/items/c571e93e96a1ec28044f#_reference-8e828835a5c8cede9bd2 指摘に関しては、下手に疑問形にすると嫌味っぽくなるし、素直にこうしたほうが良いと言ったほうがわかりやすくて良い gitのコミットメッセージの形式.1行しかコミットメッセージを書かないのは不届きである. https://blog.unasuke.com/2015/what-happens-if-you-write-something-on-the-second-line-of-the-git-commit-message/ コーディング哲学 https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself アンチパターン https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 学校の勉強でやったこととやっていないことを明確化したい.開発フローを知らなすぎでしょ 「簡潔な設計で十分なところに、過剰に複雑なデザインパターンの使用を強制する。」のはだめ http://mojix.org/2013/02/10/design-pattern-refactoring switchをポリモーフィズムにするなど,面白そうな話がある.「クラスの抽出」「継承を委譲に置き換える」「引数オブジェクトの導入」あたりだ。これらのリファクタリングを私がよく使うということは、それが私のコードの弱みを突いている、ということを意味している。つまり、私のコードはクラスが肥大化しすぎであり、継承を使いすぎであり、引数をバラバラのまま渡しすぎなのだ。 http://typea.info/tips/wiki.cgi?action=PDF&page=%A5%EA%A5%D5%A5%A1%A5%AF%A5%BF%A5%EA%A5%F3%A5%B0 具体例pdf https://ja.wikipedia.org/wiki/%E9%8A%80%E3%81%AE%E5%BC%BE%E3%81%AA%E3%81%A9%E3%81%AA%E3%81%84 https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%81 アンチパターン https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 リファクタリングカタログhttp://refactoring.com/catalog/ http://mojix.org/2012/11/21/beck-impl-pattern カルト的コーディングhttps://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%82%B4%E3%83%BB%E3%82%AB%E3%83%AB%E3%83%88%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0 コード自身を説明するような無駄なコメントを加える、ガベージコレクションが問題なく自動的に処理してくれるようなオブジェクトの解放コードを記述する、単純なオブジェクトの生成にもファクトリーオブジェクトを用いる、等。これらはしばしば、プログラマがプログラミング言語に不慣れな場合に、または単に熱心過ぎる場合に引き起こされる。 再利用可能なプログラムコードの開発には、1回限りのプログラムコードの開発と比べて、2倍、3倍の労力がかかる。

普通のコンストラクタ,普通のコンストラクタとして機能するコピコン(CIntArray? array2(array1);),引数渡しで呼ばれるコ

子テンプレートの中身が、親クラステンプレートの変数をアクセスするためにはなぜかthis->が必要問題 https://qiita.com/kaityo256/items/2f24662a9ab8341ad6f4 two phase lookupといって、テンプレートがないものはコンパイル時に確定するが、テンプレート系は実行時に型チェックが行われるため。 なぜ実行時にチェックが行われるかというと、テンプレートの特殊化のため、Tによって指す実体が変わりうるし、Tによってはシンボルそのものがない可能性すらあるので。 まず、シンボルはテンプレートパラメータ付きかどうかで大別される。 テンプレートパラメータ付きじゃないと、即刻どこのシンボルを指しているかを静的に決めようとする。なので、この時コンパイラはテンプレートという可能性を考えないので、親テンプレートを見に行かないでグローバル空間とかしかいかない(なるべく実行時に決めたがる遅延名前解決をしているので) 親テンプレートにアクセスさせたい場合は、シンボルがテンプレートパラメータを持っていないといけない。

https://programming-place.net/ProgrammingPlacePlus/cpp/language/023.html テンプレートの完全特殊化やテンプレートの部分特殊化は、テンプレート仮引数に特定の型が当てはめられたときにだけ使われる、特別版を定義する機能 例えば比較演算子を定義したい場合、intだったらそのままの変数を比較すればよいが、文字列のchar*を比較する場合はちょっと違うはず。 完全特殊化は、デフォルトのtemlate <T> inline std::size_t Lengthにたいして、template <> inline std::size_t Length<char>のような定義をすることでT=charの時だけ実装をすげ替えることができる。完全特殊化すると、クラステンプレートではなくクラスになる。 部分特殊化は、クラステンプレートに一部の部分のみを実体化する。なので、部分特殊化すると 関数テンプレートと通常の関数があり、どちらにも適合するときには、通常の関数の方が優先されるので、普通にオーバーロードすればよい

unordered_map が諸々の事情で遅いというのがあります。Google では独自 hash map を使っていてオープンソース化されています https://abseil.io/docs/cpp/guides/container の flat_hash_map ですね


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-07-31 (日) 18:25:14 (632d)