2015年03月14日

【C/C++プログラミング】安全なコーディングのために

ここ半年以上C/C++の開発から遠ざかっている。まあ、理由はプロジェクトに依存しますから仕方ない(;´Д`)
とりあえずOJTで新人が犯した危険なコードとか。
どちらかといえば、新人よりも新人を抱えたOJT担当者が理解しておくべき新人の犯しやすい過ち。

☆"=="のタイプミス
ありがちな"=="のタイプミスでハマる厄介なバグを生むため、結構気をつけるべし
if (a = 1) ...
即値やconst/define値を参照するなら左辺に即値・定数を持ってくればコンパイルエラーで検出できる。
if初め条件式で代入式を使用禁止にすればこの不幸は防げる。そうすればMISRAでも採用されているし、最近のQAC++等では難なく検出できる。
if (1 == a) ...

☆真・偽を理解していないと起きる不幸
「真は偽(0)以外の値」ということを理解していないとハマる。 素直にS_FALSEで判断していれば良いが、C/C++で二値はないということをよく理解する。bool型についても意味をよく理解しないといけない。
#define S_TRUE 1
#define S_FALSE 0
...
int result = 10; // こういう代入自体問題だけど(;´Д`)
...
if (result == S_TRUE)...

☆グローバル変数におけるexternの濫用
そもそも、Cで用いるべきで、C++ではクラスメンバ変数としてできる限りグローバル変数の使用を控えるべき。
規模が大きいと、謎のリンクエラーが頻出する要因にもなる。
externを付けるとグローバル変数スコープは、オブジェクトファイルをまたぐ。つまりxxx.cファイルをまたいだアクセスを許す。当然だがexternを付けたグローバル変数と同一名称は1つのモジュール中に1つしか存在できないため、規模が大きなコードで突貫工事を行うと面倒が生じる。externを使うときは主従関係を考えたい。
また、staticを付けたグローバル変数は暗黙としてオブジェクトファイル内にスコープを制限するため、他の開発者から意図しないexternを行われることを避けることが出来る。

☆#defineよりもstatic constのほうがいい(気がする)
最近のコンパイラ、リンカは頭が良い。Effective C++によればstatic constを使うべきとあるが、#defineを使っても即値表示されたりはしない(多分殆どの環境で)。でも、支障が無いならstatic const使った方がいいんではないだろうか。もし問題があるとすればstatic constはバイナリサイズを定数とそのアライメント分最低でも大きくするくらいではないか。
#define STR_HOGE "hoge" // よく使う方法
static const char* const STR_HOGE = "hoge"; // char*(wchar_t*)はconstで参照先も定数化する!

☆"//"コメントは現今のCコンパイラでは許されている
よく「Cでは"/* ... */"コメントしか使えない」というのは昔の話。ただ、何処のプロジェクトも保身的で、特に組み込み系では今も尚 "//"コメントはQACでわざわざはじくようにされてしまっている。
これもEffective C++で触れられていたが相当昔のプリプロセッサが誤解したことによる。
"1 // これは1"が式として評価されてしまうというもので、今は起きないだろう。
#define S_TRUE 1 // これは1

☆複数行コメントのネストは #if 0 で行う
当たり前なんですが、知らない新人がいる。だが、こんなコードはあくまで暫定的でいつまでも#if 0を残しておくこと自体問題。

宜しければポチっとしてください( ・∀・)

人気ブログランキングへ





posted by 美華子愛♪ at 22:05| 福島 ☀| Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2015年03月12日

【Amazon API】BrowseNodeIdトップノード値のメモ (Version=2013-08-01)

必要に迫られてProduct Advertising APIを扱い始めたのですが、AmazonのドキュメントにあるBrowseNodeIdを設定するとどうもエラーになってしまう事がある。どうなってんの?と思って調べてみたら、Amazon公式が昔からおかしい情報を載せている?或いは頻繁に変わっちゃうのだろうか。。。
なにしろ、昨日初めてAmazonAPIをテストしたんで、よくわからんです。
いずれにしてもこれじゃ使えないため、amazon.co.jp、amazon.comだけ取ってみた。HTMLをgrepで軽く整形して取り込んだため、間違って取り込んだり取りこぼしも有るかも知れませんが、あしからず。

☆amazon.co.jp
カテゴリBrowseNodeId
本・コミック・雑誌465392
DVD・ミュージック・ゲーム561958
家電・カメラ・AV機器124048011
パソコン・オフィス用品2188762051
ホーム&キッチン・ペット13938481
食品・飲料・お酒70903051
ヘルス&ビューティー52374051
ベビー・おもちゃ・ホビー344845011
ファッション・バッグ・腕時計2230006051
スポーツ&アウトドア15337751
DIY・カー&バイク用品2016929051


☆amazon.com
カテゴリBrowseNodeId
Unlimited Instant Videos2858778011
Digital Music163856011
Appstore for Android2350149011
Kindle E-readers & Books5916440011
Fire Tablets5916439011
Fire TV2676882011
Fire Phone9425691011
Books & Audible283155
Movies, Music & Games2625373011
Electronics & Computers1266092011
Home, Garden & Tools1055398
Beauty, Health & Grocery3760911
Toys, Kids & Baby165793011
Clothing, Shoes & Jewelry7147440011
Sports & Outdoors2206626011
Automotive & Industrial15684181
Credit & Payment Products3561432011


無事取れるようになったっぽい。
TestAmazon1.jpg





posted by 美華子愛♪ at 03:34| 福島 ☁| Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2015年03月03日

【C#】Office Word / Excel / PowerPoint でメタ情報を取る方法のメモ

備忘録
Word / Excel / PowerPointいずれもほぼ同じ方法でメタ情報を取れるが、若干の違いがある。
取れる情報と取れない情報とがある。取れない情報は取ろうとすると例外が発生する。
なお、Application.Quit()に失敗するとWordとかが開きっぱなしになってしまうので注意。

☆依存関係
using Word = Microsoft.Office.Interop.Word;
using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;

☆Wordのメタ情報を取る
        public static void ListWord()
        {
            object oMissval = Missing.Value;
            object oFile = @"C:\test\test.docx";
            Word.Application wApp = null;
            Word.Document wDoc = null;
            object oReadonly = false;
            object oSaveChange = false;
            try
            {
                wApp = new Word.Application();
                wApp.Visible = false;   // Wordを非表示にする
                wDoc = wApp.Documents.Open(ref oFile, ref oMissval, ref oReadonly, ref oMissval, ref oMissval,
                    ref oMissval, ref oMissval, ref oMissval, ref oMissval, ref oMissval, ref oMissval,
                    ref oMissval, ref oMissval, ref oMissval, ref oMissval, ref oMissval);
                object builtProp = wDoc.BuiltInDocumentProperties;
                Type builtPropType = builtProp.GetType();
                for (int i = 1; i <= 50; i++)
                //int i = 1;
                {
                    try
                    {
                        object prop = builtPropType.InvokeMember("Item", BindingFlags.GetProperty, null, builtProp, new object[] { i });
                        Type propType = prop.GetType();
                        object propVal = propType.InvokeMember("Name", BindingFlags.GetProperty, null, prop, new object[] { });
                        Console.WriteLine(String.Format("Name  {0} = {1}", i, propVal));
                        propVal = propType.InvokeMember("Value", BindingFlags.GetProperty, null, prop, new object[] { });
                        Console.WriteLine(String.Format("Value {0} = {1}", i, propVal));
                    }
                    catch
                    {
                    }
                }
            }
            catch
            {
            }
            finally
            {
                // 確実にドキュメントのクローズとWordを終了させる!
                ((Word._Document)wDoc).Close(ref oSaveChange, ref oMissval, ref oMissval);
                ((Word._Application)wApp).Quit(ref oSaveChange, ref oMissval, ref oMissval);
            }
        }

☆Excelのメタ情報を取る
        public static void ListExcel()
        {
            object oMissval = Missing.Value;
            string strFile = @"c:\test\test.xlsx";
            Excel.Application eApp = null;
            Excel.Workbook eBook = null;
            object oReadonly = false;
            object oSaveChange = false;
            try
            {
                eApp = new Excel.Application();
                eApp.Visible = false;   // Excelを非表示にする
                eBook = eApp.Workbooks.Open(strFile, oMissval, oReadonly, oMissval, oMissval,
                    oMissval, oMissval, oMissval, oMissval, oMissval, oMissval,
                    oMissval, oMissval, oMissval, oMissval);
                object builtProp = eBook.BuiltinDocumentProperties;
                Type builtPropType = builtProp.GetType();
                for (int i = 1; i <= 50; i++)
                //int i = 1;
                {
                    try
                    {
                        object prop = builtPropType.InvokeMember("Item", BindingFlags.GetProperty, null, builtProp, new object[] { i });
                        Type propType = prop.GetType();
                        object propVal = propType.InvokeMember("Name", BindingFlags.GetProperty, null, prop, new object[] { });
                        Console.WriteLine(String.Format("Name  {0} = {1}", i, propVal));
                        propVal = propType.InvokeMember("Value", BindingFlags.GetProperty, null, prop, new object[] { });
                        Console.WriteLine(String.Format("Value {0} = {1}", i, propVal));
                    }
                    catch
                    {
                        continue;
                    }
                }
            }
            catch
            {
            }
            finally
            {
                // 確実にドキュメントのクローズとExcelを終了させる!
                eBook.Close(oSaveChange, oMissval, oMissval);
                eApp.Quit();
            }
        }
☆PowerPointのメタ情報を取る
        public static void ListPowerPoint()
        {
            string strFile = @"c:\test\test.pptx";
            PowerPoint.Application pwApp = null;
            PowerPoint.Presentation pwPresent = null;
            try
            {
                pwApp = new PowerPoint.Application();
               // pwApp.Visible = MsoTriState.msoFalse;   // PowerPointを非表示にする
                pwPresent = pwApp.Presentations.Open(strFile, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
                object builtProp = pwPresent.BuiltInDocumentProperties;
                Type builtPropType = builtProp.GetType();
                for (int i = 1; i <= 50; i++)
                //int i = 1;
                {
                    try
                    {
                        object prop = builtPropType.InvokeMember("Item", BindingFlags.GetProperty, null, builtProp, new object[] { i });
                        Type propType = prop.GetType();
                        object propVal = propType.InvokeMember("Name", BindingFlags.GetProperty, null, prop, new object[] { });
                        Console.WriteLine(String.Format("Name  {0} = {1}", i, propVal));
                        propVal = propType.InvokeMember("Value", BindingFlags.GetProperty, null, prop, new object[] { });
                        Console.WriteLine(String.Format("Value {0} = {1}", i, propVal));
                    }
                    catch
                    {
                        continue;
                    }
                }
            }
            catch
            {
            }
            finally
            {
                // 確実にドキュメントのクローズとPowerPointを終了させる!
                pwPresent.Close();
                pwApp.Quit();
            }
        }





ラベル:C#
posted by 美華子愛♪ at 19:29| 福島 ☁| Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。