c++でも畳み込みたい!
よくやる処理に、ある配列またはコンテナに入っている要素の総和(マージ?結合?)したいというものがあるので、
簡潔に書ける方法はないかと調べたところ、STLにはstd::accumulate()
があるらしい。
accumulate
(畳み込み)という操作は既にHaskellを学ぶ中で知っていたため概念としてはすぐに理解できたものの、
色々ハマりやすそうなのでテストコードをメモっておく。
#include <iostream> #include <vector> #include <numeric> #include <string> using namespace std; class myClass { public: uint32_t _num; std::string _str; myClass(const uint32_t num, const std::string str){ _num = num; _str = str; } // `+`演算子オーバーロード myClass operator+(const myClass &y) const { return myClass( this->_num + y._num, this->_str + "-" + y._str); } }; // BinaryOperator class myMerge { public: myClass operator()(const myClass &x, const myClass &y) const { return myClass( x._num * y._num, x._str + "," + y._str); } }; int main() { std::vector<string> list = {"hoge", "fuga", "foo", "bar"}; // 初期値をvectorの第一要素とした場合はbegin()+1を開始要素とする string hogefuga = std::accumulate(list.begin() + 1, list.end(), list[0]); std::cout << "hogefuga:" << hogefuga << std::endl; // -> hogefuga:hogefugafoobar // 初期値を定数にしてもよいならbegin()を開始要素にするとわかりやすいかもしれない string hoge = std::accumulate(list.begin(), list.end(), string("")); std::cout << "hoge :" << hogefuga << std::endl; // -> hoge :hogefugafoobar // この書き方をするとコンテナの第一要素が重複してしまうので注意 string hogehoge = std::accumulate(list.begin(), list.end(), list[0]); std::cout << "hogehoge:" << hogehoge << std::endl; // -> hogehoge:hogehogefugafoobar // 要素が1つしかない場合でも動く std::vector<string> lonely = {"alone"}; string sad = accumulate(lonely.begin() + 1, lonely.end(), lonely[0]); std::cout << "home " << sad << std::endl; // -> home alone // コンテナが空になる可能性があるなら2番目の書き方はできない(SEGVが発生する) std::vector<string> empty = {}; std::cout << "からっぽ:" << std::accumulate( empty.begin(), empty.end(), string("")) << std::endl; // -> からっぽ: // std::cout << "からっぽ:" << std::accumulate(empty.begin() + 1, empty.end(), empty[0]) << std::endl; // -> SEGV // 自前クラスに対するaccumulate std::vector<myClass> myList = { {2, "A"}, {3, "B"}, {4, "C"}}; // `+`演算子オーバーロード myClass myAcc = std::accumulate(myList.begin() + 1, myList.end(), myList[0]); std::cout << "myAcc.num = " << myAcc._num << " myAcc.str:" << myAcc._str << std::endl; // -> myAcc.num = 9 myAcc.str:A-B-C // 関数オブジェクト(BinaryOperator)指定 myClass myAcc2 = std::accumulate(myList.begin() + 1, myList.end(), myList[0], myMerge()); std::cout << "myAcc2.num = " << myAcc2._num << " myAcc.str:" << myAcc2._str << std::endl; // -> myAcc2.num = 24 myAcc.str:A,B,C }
参考文献
Testing Casual Talks #2行ってきた。
もう一週間も前だけど行ってきたのでメモを残す。
発表者はDeNAのテスト専任チームSWETの方や、ペパボのインフラの方などWeb系がやはり多かった。
発表内容は以下。
- mruby のテスト方法についての試行錯誤
- スクラム開発において、テストメンバー(非開発者)の関わり方を模索してみた
- 大規模 Web サービスのブラウザテスト自動化・並列化
- ECサービスの負荷テストの裏側
- 継続的Webセキュリティテスト
- Casualにインフラテストへ入門した話
- カジュアルなテスト&仕様書として JSON+node requestのご提案
@hsbt mrubyのテスト方法についての試行錯誤
アプリケーションサーバのnginxのconfigファイルにmrubyを埋め込むことで設定に対するテストが記述できるという話。
現状の分析として、アプリケーションに対するテスト、サーバ構築に対するテストは進んできているが、 ミドルウェアに対するテストはうまくできていないという課題があるという。
コードならテストできるのに…
-> ミドルウェアの設定ファイルをコードとして記述してしまおう!
-> コードだからテストできる!
という発想らしい。
スクラム開発において、テストメンバー(非開発者)の関わり方を模索してみた 境野高義 (@sakaimo)
スクラムチームにQAが最初から最後まで参画するという話。
スプリントの最初の要件定義と、最後のテストに対してPO、開発、QAが関わっていく体制。
仕様の漏れや矛盾がスプリントの最初に摘出できた。
KPTでの分析をしていて、 Problemとしては、QAの性として機能単位でまとめてテストしてしまっていた、 期間的な問題で正常系テストが中心となり異常系までスプリント内でいかなかったなどが挙げられていた。 Tryとしては、ストーリーを予め作成し、スプリントとストーリーを同期させながらテストしていくこと、 プロダクトオーナーを交えて軌道修正をしていくこととしていた。
@deme0607 大規模Webサービスのブラウザテスト自動化・並列化
DeNAのテスト専門チームSWET(Software Engineer in Test)の方の話。
テーマは以下。
- ブラウザ自動テストの構築
- テスト並列化による高速化
- 並列化したテストの向上
ブラウザ自動テストを構築することで、基本的なテストケースは自動化され、人間(QA)がやらなければならない検証に工数を割くことができるようになったという。 新機能や画面はやはり人が試さないと効果を確かめられない。
しかし、ブラウザ自動テストは通信やスナップショットの作成など結構時間がかかる。遅いからといってテストケースを削ると品質が落ちる。 -> 並列化による高速化をした。 ただし、並列化すると遊んでいるノードがもったいないなどの問題が生じるので、実行計画の最適化アルゴリズムを組むなどしているらしい。 cf ビンパッキング問題 - Wikipedia
また、ブラウザの自動テストは落ちやすいという傾向がある。 頻繁にテストが失敗していると、これは落ちても良いテスト、これは落ちてはいけないテスト、などを判断する職人を生んでしまう。 そこで、過去のテスト結果を集計して、「よく落ちるテスト」、「突然落ちるようになったテスト」を分類して、 落ちたらいけないテストをSlackに通知する仕組みを作ったそうだ。
「ECサービスの負荷テストの裏側」@kenchan
負荷テストのツールGatling
の紹介と、レポートで埋められなかった部分を自分たちで解析したという話。
レポートからはレスポンスタイムの最大最小平均値などが出るが、データのばらつきや時系列での分析もしたかった。
->テストの生ログを抽出してgoogle spreadsheetへぶち込みグラフ化。1万件までは耐えられる。
「serverspec x infratasterを使ったサーバテスト入門のカジュアルな話(仮)」@yudoufu
サーバ構築に対して振る舞いテストをやってしまおうという話。 serverspecは設定のテストはできるが動作のテストはできない。 結局ブラウザでポチポチしないといけないので辛い -> TestKitchenで振る舞いテストもできるぞ!
追加の設定項目も少ないのですぐに導入できるらしい。
参加者のブログ記事
Amazon Elastic MapReduce(AWS EMR)を触るだけ触ったメモ
参考ページ
チュートリアル: Amazon EMR 入門 - Amazon Elastic MapReduce
EMRを使うには
- S3にbucketを作成する
net.mindtide.myemrbucket
とした。 - S3に出力ディレクトリを作成する
EMRのクラスターを作成する。
Hiveプログラムのステップを追加する 東京リージョン:ap-northeast-1
- スクリプトの場所:
s3://ap-northeast-1.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q
- S3の場所の入力:
s3://ap-northeast-1.elasticmapreduce.samples/cloudfront
- S3の場所の出力:
s3://net.mindtide.myemrbucket/output
- スクリプトの場所:
プロビジョニングが終わるまでしばらく待つ。*1
- 実行結果が
s3://net.mindtide.myemrbucket/output
配下に出力されたのを確認。 - Hue上でHiveを実行して結果が出たことを確認。
はまったところ
AWSをCLIで操作する
brew install awscli
aws configure
- AMIでユーザに権限を与える
aws ec2 list-instances
などでインスタンスの状態が出力されることを確認
chloe:Desktop usadamasa$ aws ec2 describe-instances --output table --region ap-northeast-1 ------------------- |DescribeInstances| +-----------------+
補完を効かすには、.bash_profileなどに
complete -C $(which aws_completer) aws
を追記する。あとで調べる用語
EMRFS
- EC2インスタンスタイプ
- HUE
*1:結構かかる。5分ぐらい
Effective Modern C++勉強会#2 行ってきた
まとめページ
Effective Modern C++勉強会#2 : ATND
Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14
- 作者: Scott Meyers
- 出版社/メーカー: O'Reilly Media
- 発売日: 2014/11/10
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
近日中にC++を使えるようになっていなければならないという状況におかれている昨今、一番新しいことやってるぽい本の勉強会に行けば雰囲気もつかめるだろうと思って参加。*1
参加してみてやっぱり基礎知識が足りていないので入門書が必要だと痛感する次第。
いい本ないかしら…。
以下メモ書き
item 7 Distinguish between () and {} when creating objects @talos208
初期化子の{}と()の違いを知りましょう。
C++11の初期化方法はいろいろある。
- int z{0}; == int z = {0};
初期化時の=は代入ではない。 代入ではなく、コピーコンストラクタが呼ばれる。
インスタンスができてからの代入は代入になる。
統一的な初期化構文
std::vector
いままで
class Widget { … private: int x{0}; int y = 0; int z(0); // 関数のプロトタイプと解釈されてエラー }
コピー出来ないオブジェクト
例:std::atmicには"="が使えない
std::atomic<int> ai0{0}; std::atomic<int> ai1(0); std::atomic<int> ai2 = 0; // エラー // "{}"内ではnarrowingが禁止 double x,y,x; int sum1{ x + y + z}; // エラー 情報が落ちる int sum2( x + y + z); // 暗黙でintになる
もっとも厄介な解析
Widget w1(10); Widget w2(); // widget型を返す関数w2と解釈される Widget w3{}; // 引数なしの変数初期化 Widget w4; // これだとどうなる?
std::initializer_listとコンストラクタ
コンストラクタのシグネチャによっては全く直観的ではない挙動を引き起こすおそれがある。
Widget(int i, bool d); Widget(int i, double d); Widget(std::initializer_list<long double> il); // これが曲者 Widget w2{10, true} // 3番目のコンストラクタが呼ばれる。 Widget w4{10, 5.0} // 3番目のコンストラクタが呼ばれる。
クラスの提供者はstd::initializer_list<>を引数を御付コンストラクタを加えるときに熟考がいる。
正直ここまで複雑な挙動を理解できる気がしない…。
item8 Prefer nullptr to 0 and NULL
C++はポインタのところに0があったらnullptrに解釈されるが、リテラルの0はintであってポインタではない。
NULLはint以外でも使えるが、intの0と問題は同じ
リテラルNULLに決まった型はない。
nullptrの型はstd::nullptr_tとして、すべてのポインタ型として変換可能
- void f(int);
- void f(bool);
- void f(void*);
f(0) // 1が呼ばれる
f(NULL) // 何が呼ばれるかわからないが、3が呼ばれることはない
f(nullptr) // 確実に3が呼ばれる
item9 Prefer alias declarations to typedefs
ポインタに関連する別名をつけるときは、using句を使おう!
templateを宣言するときとかいいよ。
typedefはコンパイラにやさしくない。
<type_traits>
C++14だとtypename_tでusing版が提供される。 自分でやりたい場合、テンプレートの特殊化には耐えられない?
item10 Prefer scoped enums to unscoped enums
従来のenumは名前空間がグローバル。
enumで使われた定数名は変数名に使えなかったりする。
enum class Colorとかやると、変数名にはパースされない。
列挙型を型として識別されて、変数に変な値は入れたり、比較はコンパイルで怒られる。
Class enumはクラスなので前方宣言できる。
javaとは違って定数はただの定数、メソッドを持ったりはできない。残念…。
item11 Prefer deleted functions to private undefined ones.
c++98では自動生成されたくない関数は未定義privateメンバ関数を宣言していた。
c++11においてはdeletedを使うと、コンパイル/リンク時にエラー検出してくれる。
暗黙の型変換で意図しないやつを関数呼び出しで禁止される。(オーバーロードしてやる)
特定のtemplate特殊化を禁止できる。
=> ホワイトリスト的にはできないのかな?
=> なんでもとれる関数templateをdeleteとしておいて、必要なものだけ定義するという方法で実現できるぽい。
R言語/統計 復習中
データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)
- 作者: 佐藤洋行,原田博植,下田倫大,大成弘子,奥野晃裕,中川帝人,橋本武彦,里洋平,和田計也,早川敦士,倉橋一成
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/08
- メディア: 大型本
- この商品を含むブログ (13件) を見る
学生時代のゼミで触ってはいたけどもうすっかり忘れたので復習。 完全にメモ書きなので新しい情報はないです。
Rで統計解析をはじめよう
R関数
関数 | 用途 |
---|---|
geom_point() | 散布図 |
geom_histgram() | ヒストグラム |
summay() | 要約 |
aes() | “aesthetics(エステティクス、美的要素)”の略でグラフの色付けなどを指定 |
geom_smooth() | 回帰直線の描画 |
lm() | 線形回帰モデルの作成 |
glm() | ロジスティック回帰モデルの作成 |
rep() | ベクトル要素の反復 |
単語帳
英語 | 日本語 |
---|---|
Residuals | 残差(予測値と実績値の差) |
Intercept | 回帰直線の切片 |
Coefficients | 係数 |
Std.Error | 標準誤差 |
Estimate | 推定値 |
t value | T値*1 |
Pr | 相関係数 |
Multiple R-squared | 決定係数 |
Adjusted R-squared | 自由度調整済み決定係数 |
F-statistic | F統計量*2 |
DF | 自由度 |
z value | Z値*3 |
AIC | 赤池情報量基準*4 |
Fisher Scoring | フィッシャー情報量*5 |
deviance | 尤離度*6 |
likelihood | 尤度*7 |
多変量解析:予測モデル
予測モデルとは、どのような要因が結果に影響するかという因果関係を定量的に明確にするための技法。
回帰モデル
線形回帰モデル
目的変数を直線的な関係で予測するモデル。 説明変数が被説明変数(目的変数)に与える影響度を明らかにする。 直線上の点が説明変数に対する目的変数の予測値で、 予測値と実績値との差を残差という。 残差が小さいほどモデルの当てはまり(フィット)がよいと言える。
残差のパターン
残差の表れ方のパターンの例として以下のものがある。 1. モデルに対して程よく散らばっている 1. 放物線を描いている 1. 波のような曲線を描いている
放物線の場合は傾きの変化やフィットしていない値の特徴を分析する。 波の場合は周期性を持って変動する説明変数がないか検討する。
plot関数で出力されるグラフ
グラフ名 | 内容 |
---|---|
Residual vs Fitted | SPC:目的変数値に応じた残差の値を縦軸に表示 |
Normal Q-Q | 観測値の標準化後残差が正規分布に従う場合の期待値をx軸、観測値の標準化後残差をy軸にとったプロット。 |
Sacle-Location | Residual vs Fitted valuesのy軸について平方根をとったもの。 |
Regiduals vs Leverage | Leverage(てこ比)とは回帰分析の観察点(サンプル)毎に説明変数のデータを変えずに目的変数yの値を1だけ変えたときの予測値の変化量 |
引用元:R Linear Regression (線形回帰) (2) 予測モデルの作成と評価 - nakhirotのブログ
ロジスティック回帰モデル
2値データの目的変数(生存/死亡、メダルの裏表)に対して説明変数の影響力を推定する手法。 ある説明変数が変化することで、ある基準(reference)と比較して目的の確率がn倍になる(オッズ比)、という議論ができる。 Rではglm関数を使うことでモデルを構築できる。
決定木モデル
説明変数をツリーのノードとして、説明変数の分岐により目的変数への寄与度を可視化する手法。 より寄与度の高い説明変数がツリーの上に来る。
多変量解析:分類
分類モデルは、多変数のデータの類似関係を定性的に明確化する技法。 大きく分けて==次元縮約==と==クラスタリング==がある。
主成分分析
複数の量的データの類似関係を把握できるように、なるべく情報を落とさず少ない==次元==に要約するときに用いる手法。 複数因子のデータの散らばり(情報)から散らばりが残るような軸(主成分)を見つけ1次元のデータに要約する。 主成分同士の矢印の方向が近しいほど関連が高いといえる。
多次元尺度法(MDS)
データ間の距離や類似度から仮想的なマップを作成する手法。 ブランドイメージを二次元で可視化することでブランド同士のクラスタの分類などができる。 距離の算出手法は別に存在する。 MDSを実行するにはcmdscale関数を用いる。*8
クラスタリング
多数の変数で表現されたデータを、類似度という指標で似ている物同士をグルーピングする手法。 最短距離法などの階層的クラスタリングとk-means法などの非階層的クラスタリングがある。
k-means法
以下の手順でデータをグルーピングする。 1. k個のクラスタの中心の初期値を決める。 2. 各データをk個のクラスタの中心との距離を求めもっとも近いクラスタに分類。 3. 形成されたクラスタに分類されたデータの中心を求める。 4. クラスタの中心が変化しない時点まで2,3を繰り返す。 なお、初期値の扱いには注意が必要。
k-means法は欲張り探索で局所解を求める手法であるため,初期状態によって最終結果は大きく影響されます.一般的な対処法は,初期状態をランダムに変更して複数回 k-meansを実行して幾つかの分割を獲得し,それらの分割の中で評価関数を最小にするものを選びます.*9
*2:F 統計量と t 統計量 - MATLAB & Simulink - MathWorks 日本
*4:赤池情報量基準ってナニ? - hiroyukikojimaの日記
*8:書籍では北海道の都市間距離をプロットしてたけどOSXでは日本語が文字化けしてハマった。解決法はリンク参照。Using CJK Fonts in R and ggplot2 | Hi!!
持ってる曲の一覧を渡すと歌詞を分析してタグ付けしていい感じのプレイリストを返してくれるやつが欲しい。
ただの思いつき。
ほしいもの
例えばあー元気でないなぁ励ましてくれる感じの曲だけ聞きたいなぁってときに、手持ちの音楽データからいい感じにプレイリストを作成してくれるやつ。
どうやればできそうか
- 手持ちの情報をの一覧をもらう
- 曲の歌詞をどっかからとってくる
- 歌詞をなんとかして分析する
- 分析結果をタグ付けする
- タグをぽちぽち選択する
- タグをキーにして曲の一覧を作成する
- 音楽プレーヤソフトが取り込める形のファイルとして出力する
- 音楽プレーヤソフトにインポートする
手持ちの曲の一覧を取得するには
itunesであればXMLファイルにエクスポートができる。
iTunes プレイリストをエクスポートする - YouTube
出力されるファイルの情報は、曲名、アーティスト、アルバム名ほか、最終的なプレイリストデータ作成に必要なファイルの保存場所も含まれる。
曲の歌詞を取得する
著作権的にどうなのかが不明なので要調査。Lyrics Masterがやってることを自分で実装すればいいんだろうけどどういう仕組なのかな…。
歌詞を分析する
いわゆる形態素解析ってやつか。はやりのmecabを使うのがよさそう。
分析結果のタグ付け
はてなダイアリーとかでやってるキーワード自動生成の技術として、マルコフ連鎖モンテカルロが紹介されていたような気がするけどもそれが書いてあった本がなぜか手元にないので間違ってるかもしれない。
タグをぽちぽち選択
jQueryとか使えばいけるやろ!(乱暴)
タグをキーにして曲の一覧作成
曲とタグをペアにしてDBなりに保存しておけば難しいことはなさそう。いや、ここのアルゴリズムが一番肝になるんじゃないか…?
音楽プレーヤソフトが取り込める形のファイルとして出力する
最初にもらったXMLの中身をどっかに保持しておいて、抽出された曲情報だけを取り出してファイル化する。これだけなら簡単だけど、どっかに保持ってどこがいいのかしら。メモリに乗せておける量なのかしら。自分の持ってる2602曲全てをエクスポートすると5.5MBだった。歌詞取得〜タグ付けの処理時間がすぐ終わればいいかもしれないけど結構かかりそうだし…。あ、もらったファイルそのまま置いておけばいいのか。
音楽プレーヤソフトにインポート
手作業でやってもらうしかないのかなぁ。ファイルをダウンロードしたら自動的に取り込まれるような仕組みがあったらいいんだけど。iPhoneでリンク叩くと特定のアプリが起動するあれみたいな。
手持ちの知識で実現可能性を検討してみたけど手を動かせばできそう。 実際作るかは未定。
vimでPHPの開発環境構築するときにしたこと
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
上記のムック第2章 「Webアプリケーション実践入門」 でPHPの演習をするにあたりvimの設定をいじったので備忘録。*1
vim標準のPHP用オプション
" 文字列中のSQLをハイライト let php_sql_query = 1 " Baselibメソッドのハイライト let php_baselib = 1 " 文字列中のHTMLをハイライト let php_htmlInStrings = 1 " <? をハイライト除外にする let php_noShortTags = 1 " カッコが閉じていない場合にハイライト let php_parent_error_close = 1
追加したプラグイン(PHP向け)
vim-twig
evidens/vim-twig
vimのシンタックスハイライトは標準だとTwigテンプレートエンジンに対応しないので導入。
インストールはNeoBundleで一発。
NeoBundle 'evidens/vim-twig'
before
after
vim-php-cs-fixer
stephpy/vim-php-cs-fixer
コーディング規約に合致するかチェック、修正してくれるPHP Coding Standard Fixer*2をvimから叩くプラグイン。
" vim-php-cs-fixer {{{ NeoBundleLazy 'stephpy/vim-php-cs-fixer', { \ 'autoload' : { \ 'filetypes': 'php',},} let s:hooks = neobundle#get_hooks('vim-php-cs-fixer') function! s:hooks.on_source(bundle) let g:php_cs_fixer_level = 'all' " which level ? let g:php_cs_fixer_config = 'default' " configuration let g:php_cs_fixer_php_path = 'php' " Path to PHP let g:php_cs_fixer_enable_default_mapping = 1 " Enable the mapping by default (<leader>pcd) let g:php_cs_fixer_verbose = 1 " Return the output of command if 1, else an inline information. endfunction unlet s:hooks "}}}
単独では動かずphp-cs-fixerを別途インストールする必要がある。homebrewで導入。
brew install homebrew/php/php-cs-fixer
なお、PHP自体もhomebrewで入れておくこと、php.iniのphar.readonly設定をOffにしておかないと警告が出て止まるので注意。
追加したプラグイン(PHP以外)
alignta
テキスト整形プラグインAlignの派生版。 ヘルプテキスト曰く、
alignta では、覚えることを少なくすること、「こう揃えたい」を1回のコマンドで実現できること、に重点がおかれています。
とのこと。 h1mesuke/vim-alignta
これまた導入にはNeoBundle。
NeoBundle 'h1mesuke/vim-alignta'
実行前後のdiffは以下。
変数代入の=を縦に整形 · b7618e6 · usadamasa/Tinitter
*2:checkstyleとかの類い