投稿

Cっぽいコードでgtestとgmockを使ってみる その2

Cっぽいコードでgtestとgmockを使ってみる その2 前回 Cっぽいコードのフリー関数に対してgtest, gmockを使った試験ができそうだ、というところまで進めることができましたが、やはり既存のソースコードに手が入ってしまうことが気になっていました。 今回は、そこを改良できないか試してみます。 参考にした情報 以下の情報を参考にさせていただきました。ありがとうございます。 (自分で思いつくのは無理です・・・) ブログ C言語のテストでスタブ関数を使うためのアイデア googlemockでグローバル変数のモックオブジェクトを作れるか 方針を検討する 前回のコード 前回の試験対象関数が書かれたコードはこんな感じでした。 関数名 説明 publicMethod 試験対象の関数。内部で面倒な処理を行う privateMethod01 を呼び出している。 privateMethod01 面倒な処理をしている関数。 publicMethod と結合して試験はしたくない。 # include "capsule.h" # ifdef GTEST // add "_impl" suffix to private function # define FUNC(func_name) func_name ## _impl # else // not to change # define FUNC(func_name) func_name # endif // TEST // Prototype for private function static void FUNC ( privateMethod01 ) ( const uint8_t input , uint8_t & output ) ; # ifdef GTEST // To use mock, replace function call to pointer void ( * privateMethod01 ) ( const uint8_t input , uint8_t & output ) = FUNC ( privateMetho...

Cっぽいコードでgoogle testとgoogle mockを使ってみる

Cっぽいコードでgtestとgmockを使ってみる クラスとか使っていないコードでgtest, ついでにgmockを使うことができないか試してみたのでメモ。 参考にした情報 以下の情報を参考にさせていただきました。ありがとうございます。 ブログ sioaji2012のブログ - 組込C言語でUnitTest 5 GoogleMock 書籍 モダンC言語プログラミング 元のコード 我ながらCだかC++だか分からないコードですが・・・ capsule.h # include <iostream> # include <stdint.h> # ifndef CAPSULE_H_ # define CAPSULE_H_ // Prototype for public function void publicMethod ( const uint8_t input , uint8_t & output ) ; # endif // CAPSULE_H_ capsule.cpp # include "capsule.h" // Prototype for private function static void privateMethod01 ( const uint8_t input , uint8_t & output ) ; // Implement for public function void publicMethod ( const uint8_t input , uint8_t & output ) { std :: cout << "publicMethod called." << std :: endl ; // call private function privateMethod01 ( input , output ) ; return ; } // Implement for private function static void privateMethod01 ( con...

WSLにgoogle testを入れてみる

WSLにgoogle testを入れてみる ふと思い立って試してみたので、メモとして残しておきます。 インストール ソースコードをDL&展開 wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz tar zxvf release-1.8.0.tar.gz cd googletest ビルド cmake が必要なので、インストールします。 sudo apt install cmake mkdir build cd build cmake .. sudo make && sudo make install 成功していれば、 ls /usr/local/lib とした際に libgtest.a libgtest_main.a が表示されるはずです。 使ってみる 適当なコードを用意 サンプルとして超適当なコードを用意します。 gtest_sample.cpp # include <iostream> # include "gtest_sample.h" bool sample_function ( const uint8_t input , uint8_t & output ) { std :: cout << "called sample_function" << std :: endl ; output = input ; return true ; } int main ( ) { uint8_t input = 16 ; uint8_t output = 0 ; bool ret = sample_function ( input , output ) ; std :: cout << "output: " << static_cast < uint16_t > ( output ) << std :: endl ; std ::...

GASをローカルで開発する

GASをローカルで開発する GASでちょくちょくツールを作ったりしますが、オンラインエディタだとバージョン管理しづらい、というかできればGitで管理したかったので、 clasp を入れてみようと思います。 設定 claspをインストール 事前に npm をインストールしておく必要があります。 clasp自体のインストールは、以下のコマンドを実行してGoogleアカウントにログインするだけ。 npm clasp clasp login 以下のような表示がされたらインストール完了のようです。 Authorization successful. Default credentials saved to: ~\.clasprc.json (C:\Users\XXXXX\.clasprc.json). スクリプトをclone 今回は、途中までオンラインエディタで作っていたスクリプトをcloneします。 clasp clone [スクリプトID] ここでスクリプトIDは、オンラインエディタでスクリプトを開いたタブのURLに表示されている https://script.google.com/d/ と /edit?(略) の間の文字列です。 実行すると、 Cloned 2 files. └─ appsscript.json └─ Main.js のようにファイルが取得されます。 これらをGitで管理するようにしましょう。 使ってみる ローカルで修正したスクリプトをpush Gitと同じ感覚でいけます。 clasp push └─ Main.js └─ appsscript.json Pushed 2 files. オンラインエディタで修正したスクリプトをpull こちらもGitと同じ。 clasp pull Cloned 2 files. └─ appsscript.json └─ Main.js 参考情報 以下を参考にさせていただきました。 GAS用のCLIツール clasp を使ってGASをローカルで開発して実行するの巻。 Written with StackEdit .

PlantUMLを使ってみる

イメージ
PlantUMLを使ってみる ドキュメントを作るとき、図も文章やコードと同じようにGitで差分管理できると嬉しいなぁ、と思っていました。 そこへテキストベースで各種UML図が作成できる、 PlantUML なるものがあると後輩に教えてもらったので、少し試してみることにしました。 (UMLも勉強したことなかったので、ちょうどいいやと) 環境 VSCodeにPlantUML Extensionを導入 VSCodeから、 PlantUMLのExtension をインストールします。 これだけだと動作しないので、追加でツールのインストールが必要です。 Windowsの場合、Extensionの Quick Install for Windows の項目に書いてある通り、Chocolateyで PlantUMLのパッケージ をインストールするのが簡単でした。 試してみたこと 今回は「カレーをつくる」ことをざっくり他の誰かに説明したい、という場合を考えました。 説明に必要な要素はこんな感じだと思います。 どんな道具や設備があるのか 1.で何をするのか 2.によって何が得られるのか 1-3をどのような手順で行うのか シーケンス図 を使えば説明できそうですが、 道具や設備をいつから片付けられそうか 道具や設備でやることのすべて は「ざっくり」という今回の目的からすると不要な気がしたので、もう少し見やすい(見やすそうな) コミュニケーション図 を使ってみることにします。 コミュニケーション図(?)を描いてみる 自分はチキンラーメンにお湯を注ぐくらいしか料理できないですが、自分の想像を説明する体で作ってみました。 PlantUMLのコードは以下の通りです。 @startuml title カレーをつくる '要素 actor Me agent 冷蔵庫 agent シンク agent コンロ agent 炊飯器 '要素間のコミュニケーション Me -up->> 炊飯器 : 1. ご飯を炊く 炊飯器 .down.>> Me : ご飯 Me -left-> 冷蔵庫 : 2. 肉と野菜取り出し 冷蔵庫 .right.> Me : 肉と野菜 Me -down...

Evernoteに英単語・フレーズ帳をつくる

イメージ
Evernoteに英単語・フレーズ帳をつくる Evernoteのノートを英単語帳として使える素晴らしいアプリ( Everword )を見つけたので、GASでスプレッドシートからノートを追加できるようにしてみます。 準備 Evernote転送用メールアドレスを確認 Evernoteには、メールでノートを追加できる機能があります。 このときに使用する送信先が、 Evernote転送用メールアドレス です(Web版からも確認することができます)。 Evernote転送用メールアドレスは、 アカウント設定 -> アカウント概要 -> メールの転送先 に記載されています。 ノートの構成を検討 Everword では、ノートのタイトルが「問題」、ノートの内容が「回答」として扱われます。 勉強に使うことを考えると、 問題:覚えたい単語やフレーズ 回答 単語やフレーズの和訳 使われている単語・イディオムの辞書的な意味 解説やその他の説明 出典(本やアニメなどのタイトル) あたりが入っていればよさそうです。 スプレッドシート作成 こんな感じのスプレッドシートを作ります。 ※ここでは、辞書サイトとして Weblio辞書 を利用させていただきます。 1-2行目:各種設定 保存先ノートブックを設定 出典を設定 使用する辞書サイトを設定 3行目~:ノートの内容と辞書サイトから単語・熟語を取得 ノートの内容 A列:覚えたい単語やフレーズ B列:単語やフレーズの和訳 C列:使われている単語・イディオムの辞書的な意味(F列からコピペ) D列:解説やその他の説明 辞書サイトから単語・熟語を取得 E列:調べたい単語・イディオム F列:辞書サイトでの検索結果まとめ G列~:辞書サイトを使うためのデータ列 シートの利用イメージ シートはこんな感じで使う想定です。 本やアニメ等を見て、覚えたい単語・フレーズをA列に、日本語をB列に書く フレーズの中から、さらに辞書サイトで意味を調べたい内容をE列に書く F列に辞書サイトの検索結果が表示されるので、それをC列にコピーする その他、気になることを調べたりしてD列に記入する 1-4を繰り返す 最後にGASを実行して、Evernoteに...

WindowsからOmnifocusに複数タスクを一括登録する

イメージ
WindowsからOmniFocusに複数タスクを一括登録する 普段のタスク管理はiPhone/iPadのOmniFocusを使っています (OmniFocusならMac使えばいいんでしょうが) 。 普段の思いつきタスクなんかを追加する分にはアプリからの入力でも不自由を感じませんが、勉強とかで沢山のタスク(参考書の「§〇ー〇を読む」とか)をチマチマ追加するのが面倒で、まとめて放り込みたかったので Mail Drop とGASを使って試してみました。 準備 Mail Dropのアドレスを取得 Omni Sync Serverの 管理ページ を開き、 ADD AN ADDRESS ボタンを押すと、下側にMail Drop用のアドレスが表示されます(赤枠)。 このアドレスがMail Dropの送信先アドレスになります。 やってみる スプレッドシートにタスクを書き出す Googleドライブから新規のスプレッドシートを開いて、タスクをセルに入れていきます。 参考書の場合は、 このように 目次が掲載されているページを探すと楽です。 Mail Dropではメモも追加できるので、気になることがあれば書いておきます。 GASでスクリプトを書く 構成としてはこんな感じです。 スプレッドシートのタスク範囲を配列に取得する 取得したアイテム分だけメールを送信する メールの送信は sendEmail メソッドで実行します。 実行すると(当然ですが) メール送信されます ので、送信先アドレスの設定を間違えないようご注意ください。 function myFunction() { // Mail Dropの送信先アドレス var DEST_ADR = "YOUR_MAIL_DROP_ADDRESS"; // シートを取得 var sheet = SpreadsheetApp.getActiveSheet(); // タスク範囲を取得 var items_array = sheet.getDataRange().getValues(); // アイテム数だけ繰り返し for (var i = 0; i < items_array.length; i++) { // 先頭はタ...