HOME » 技術情報ブログ

技術情報ブログ

技術情報ブログ

近頃、AI という言葉をよく耳にしますね。
実際に AI を仕事に活用しているという話もよく耳にするようになってきました。

皆さんは AI と聞くと何をイメージするでしょうか?

「なんかすごい便利なもの」でしょうか
「chatGPTみたいにしゃべり返してくれるんだよね」でしょうか
「画像生成AIみたいに絵が下手でも代わりに描いてくれるんだよね」でしょうか
はたまた、「SF 映画のロボットの中に知能として入っているもの」のような
未来技術をイメージする人も居るかもしれません。

今回は、そんな AI について簡単に解説します。
ぼんやりした AI のイメージを少しでも明瞭にできたらいいなと思います。

目次
  1. AIの定義
  2. AIのすごいところ
  3. AIの活用例と生成AI

----------------------------------------------------------------------------------------------------

1.AIの定義

AI は Artificial Intelligence の略で、日本語にすると人工知能です。
実は明確な定義は無いとされていますが、
昨今、話題に挙がる AI といえば ディープラーニング(深層学習)の技術が使われているものを指す場合が多いと思います。
ディープラーニングとは機械学習の一種で
文字通り、「機械」に「学習」してもらう技術です。

いきなり用語をいろいろ出しましたが
AI、機械学習、ディープラーニングは図にすると以下の関係です。

tech_blog_20240716_01.png















~機械学習~
「機械」に「学習」してもらうとはどういう事でしょうか。

例えば、AIを使って手書きの数字を判定する場合を考えてみます。
まず、手書きの数字の画像と、それが何の数字なのかのデータを用意します。
これを教師データと言います。

教師データから数字を入力し、アプリに判定してもらいます。
tech_blog_20240716_02.png








判定が正しかったかどうか、不正解なら正解はどれかを入力します。
tech_blog_20240716_03.png








この操作を何度も繰り返します(数万回繰り返します)。
tech_blog_20240716_04.png






























最初は不正解だらけですが
繰り返すことで精度が向上していきます
tech_blog_20240716_05.png









































こうして学習させた結果、
学習に使っていない新しいデータ(たとえばあなたが今手で書いた数字)でも
正解できることが期待できます。
これが機械学習です。

tech_blog_20240716_06.png














いったいどんな計算をすればこんなことができるのかを今回は説明しませんが、
最初に説明したディープラーニングはこれを実現するための計算手法のひとつです。
実はディープラーニングの計算は私たち人間の脳の仕組みがモデルになっています。
人工的に人間の脳を作っていると考えると、確かに人工知能なだぁと実感できますね。

補足になりますが、
今回説明した学習方法を「教師あり学習」といいます。
教師データと呼ばれる手書きデータと正解のペアを用意して機械に学習を行いました。
機械学習では必ずしも正解を用意しません。手書きデータだけで学習させる手法もあります。
そういった学習方法には「教師なし学習」や「強化学習」といったものがあります。
興味を持たれた方は調べてみると面白いかもしれません。

----------------------------------------------------------------------------------------------------

2.AIのすごいところ

さて、前章でAIがどんなものなのか、その学習方法について簡単に説明しました。
本章ではAIのすごいところを考えてみます。

~従来の方法と比べてすごいところ~
また前章の手書きの数字を判定するアプリを例に取ります。
さきほどの学習ではアプリに

  • 0とはどんなもの
  • 1とはどんなもの
                :
  • 9とはどんなもの

という情報は教えていません。
"手書きのデータとそれが何であるか"を繰り返し入力するだけで
機械が勝手にその特徴を認識して判定してくれるようになりました。
実はここがAIのすごいところです。

すごさを実感するために、
AIを使わずに前章の手書きの数字を判定することを考えてみましょう。

0 ~ 9はどんなものかを考える必要が出てきます。
例えば

  • 1、2、3、5、7は輪っかが無い
  • 0、6、9は輪っかが1つ
  • 4は三角形のような輪っかが1つ
  • 8は輪っかが2つ

とすれば4つには分類できるでしょうか。
そこから更に絞り込みます。
0、6、9を区別するには、6は輪の上に曲線が、9は輪の下に曲線が、といったかんじになりそうです。
1、2、3、5、7は線の場所やつながり方も見る必要が出てきそうです。

こう説明するとできるように感じてくるかもしれませんが、実際にはうまく動かないでしょう。
うまく動かない原因としては

  • 輪っかが繋がっていなくて、輪っかとして認識しなかった
  • 画像のゴミを曲線や輪っかと誤認識してしまった
  • 書き方のクセで三角形なのか輪っかなのか区別できない

といったことが起きそうです。

簡単に想像してみるだけでも、機械が手書き数字を認識することはとても難しいことだとわかります。
ですが、これをAIではデータと正解を繰り返し渡すことで簡単に実現できます。

以上のように
人間だとできるのに、機械には難しかったことが
AIの手法を用いることで解決できる可能性があります。
ここがAIのすごいところです。

~人間と比べてすごいところ~
AIを使って人間にできることが機械にもできるようになるとどんないいことがあるでしょうか。

①人間がやるより速い
1つ目は、AIに任せることで人間より圧倒的に早く処理できることです。
AIは学習には時間がかかりますが、1回の実行は短時間で行えます。
先ほどの手書きの数字を判定するアプリを使えば
10000枚の手書きの数字もあっという間にフォルダ分けしてくれるでしょう。

②疲れによる限界・ミスが無い
2つ目は、疲れによる限界・ミスが無いことです。
人間はミスをする生き物です。手書き数字が10000枚もあれば1つくらい「6」を「0」のフォルダに入れてしまうかもしれません。
AIでは(学習結果が変わらなければ)同じ画像は同じ結果になります。
休憩を取る必要もありません。

----------------------------------------------------------------------------------------------------

3. AIの活用例と生成AI

AIは様々な分野に応用されています。

  • CT画像を画像認識による病気の早期発見
  • 画像認識による不良品チェック
  • カンニング防止システム
  • 貨物量の予想

また、最近ではAIの技術を更に発展させた生成AIの分野が注目されています。
ここまで説明した従来のAIは、学習データから正解を得るためのものでした。
それに対し、生成AIは、学習データから新しいデータを作ることができるものになります。

  • chatGPT
  • 画像生成AI

などが生成AIに分類されます。

----------------------------------------------------------------------------------------------------

いかがでしたでしょうか。
今回は、AIについて説明しました。
駆け足にはなりましたが、すこしでもAIについてイメージが湧くようになっていると嬉しいです。
かねてから SNS やブログで「C++ は難しい。」といった内容の
投稿や記事を目にすることがあります。

正直私はピンと来ません。
20年近く「C++」をメインに多くのプログラミング言語に触れてきましたが、どの言語もちゃんと難しいです。

日本語も世界でトップクラスに難しい言語と言われますが、多くの日本人はそう捉えてはいないと思います。

しかしながら、比較的機械語に近い形である「C言語」がベースなっていて、
世のエンジニアの多くが躓きがちな「ポインタ」と「オブジェクト指向」という2つの概念の理解が必要。
と書いてみると確かに少し技術的なハードル自体は高い印象は受けますね...。

今回は、そんな「C++」について少し深堀りしてみたいと思います。

目次
  1. 他の言語と比べてどういう特徴があるか
  2. どういった分野、モノに使われているか
  3. なぜ「難しい」と言われているのか
  4. 余談
----------------------------------------------------------------------------------------------------

1. 他の言語と比べてどういう特徴があるか

「C++」の特徴は細かいものも含めるとたくさんあるとは思いますが、
私がこれまでの業務経験の中で強く感じたことを2つ挙げたいと思います。

~自由度が高く、できることが多い~
「好きなことを思い通りに実現できる。」というのが私の「C++」に対するイメージです。
実際、大規模なシステム開発では「C++」を採用していることが多いです。

その反面、実現するための"準備"や"後始末"も全てエンジニアが面倒を見る必要があるため、
ソースコードが長く複雑になりやすい、というデメリットもあります。
その"準備"や"後始末"に不備があることにより思わぬ障害が発生してしまった経験もあります。

~処理速度が速い~
私は業務で大量の数学的な演算を行うことが多いのですが、それらの処理は
「Java」や「C#」といった他の言語と比べると、少なくとも 1.5~2倍 は速いと感じます。
(このあたりは言語によって得意不得意があるのかもしれません。)
また、処理速度だけでなくメモリの消費量も少ないというメリットもあります。

これらは「C++」が持つ「メモリ空間を直接操作することができる」という特性から来ていますが、
この特性はシステムの脆弱性にも繋がっており、所謂「バッファオーバーフロー攻撃」の標的にされる可能性があります。
この「バッファオーバーフロー攻撃」はプログラム側で対策が可能すが、
「C++」ではメモリ(バッファ)管理がエンジニアに委ねられているため、
脆弱性を脆弱なままにしないようプログラミングに気をつける必要があります。

----------------------------------------------------------------------------------------------------

2. どういった分野、モノに使われているか

「1.」で取り上げたようにできることが多く、
『Webブラウザなどアプリケーションの開発』から『ロボットの制御』まで、
幅広い分野で使用されていて、最近なにかと話題のAI分野でも使用されていると聞きます。

皆さんの身近なところでいうと、『Windows』『Microsoft Office』『Google Chrome』も
「C++」を使用して作成されています。

よくゲームをプレイされる方だと、起動時に『Unreal Engine』というロゴを目にすることが多いと思いますが、
これはゲーム製作に特化したエンジンのことで、これも主に「C++」を使用して作成されています。

『自動車の自動運転技術』の開発も主に「C++」が使用されています。

これらはいずれも、実行速度を重視する必要があったり、
最低限の物理メモリで複雑な処理を実現する必要があったりするもので、
先に挙げた「C++」の特徴に合致していますよね。

----------------------------------------------------------------------------------------------------

3. なぜ「難しい」と言われているのか

冒頭に書いたように「C++」ならではの難しさというものにピンと来ていないのですが、
以下の点が難しいと言われる要因なのではないかと考えました。

~ガベージコレクションがない~
これは「2.」で挙げた"後始末"についての話になります。
動的に確保したメモリは、不要になったら解放しないとその分のメモリを占有し続けてしまい、
長時間稼働するシステムの場合、それが原因で動作が遅くなったり停止してしまったりします。

この「不要になったら」というのをを自動で検知してメモリを解放してくれるのがガベージコレクションであり、
「Java」や他の言語にはあるのですが、「C++」にはこの機能はありません。
ですので、確保したメモリが不要になるタイミングを意識してプログラミングする必要があります。

ただし、「C++」でもSTLやスマートポインタを駆使することで、ガベージコレクションの代用は可能です。

~自由度が高すぎる~
「何らかの処理を実現するための方法」が無数にあることにより、
逆にどの方法を採れば良いのかが分からなくなってしまうことがあります。

また、エンジニアによってどの方法を採るのかの基準も異なるため、
他者が書いたソースコードを読むと全く別の言語に見えることがあります。

~テンプレート~
汎用的なプログラムを作成できる「C++」独自の概念です。
使いこなせると処理の再利用がしやすくなり、ソースコードの量を大幅に減らすことができます。
はっきり言ってこれは難しいです。(私は使いこなせていません。)

テンプレートを使わないと実現できないようなことはほとんどないですが、
その場合はソースコードの複雑化と可読性の低下は避けられないです。

----------------------------------------------------------------------------------------------------

4. 余談

近年「C++」に変わるものとして「Rust」というプログラミング言語が注目されており、
私はまだ触れたことはないのですが、こちらも「C++」と同様に処理速度やメモリ消費量に優れているようです。
ですので、もしかすると近い将来では大規模システムの開発は「Rust」が主流になるかもしれません。

しかし、上に挙げた『ロボットの制御』や『自動車の自動運転技術』といったような、限られたリソース内で高効率の処理が求められる分野では、
「ポインタ」と言うメモリに直接アクセスする独自の技術仕様が非常に有効なので、まだまだ「C++」は活用され続けることでしょう。

最後に、私は「C++」が好きなので消えて欲しくないと思っています。

DXとは?

2023/05/19

今回は昨今よく耳にする「DX」の話になります。

DXとはデジタルトランスフォーメーション(Digital Transformation)の略称であり、
2004年に提唱され、2016年に日本国内で定義された考え方です。

ざっくり言うと「IT技術を駆使して製品(サービス)・業務・組織・社会を変革すること」になりますが、
これだけ聞くと「今までのIT化と何が違うの?」と思われるかもしれませんね。

tech_blog_202305_01.jpg

今までのIT化は、以下の2つに焦点が当たっていました。

①モノと情報のデジタル化(デジタイゼーション)
(例)
 ・紙の書類を電子化する
 ・会議をオンライン化する
 ・システムへ顧客や売上を入力する

②業務プロセスのデジタル化(デジタライゼーション)
(例)
 ・タブレット端末の導入
 ・RPA(ロボットによる自動化技術)の導入
 ・電子契約サービスの導入

基本的にIT化は ①デジタイゼーション⇒②デジタライゼーション の流れで進んでいく形になりますが、
ここまでは主に企業・組織自体の業務効率化を目指す段階になります。

DXはさらにその先の概念で、デジタル化を進めることで企業価値を高め、
取引先や顧客を含めた社会全体をより良いものにしていくことを指しています。
考え方としては、②デジタライゼーション を推し進めた結果として ③DX が実現するという流れとなります。

日本は海外に比べてDX化がまだまだ浸透していない面がありますが、国内でもDX化に成功した企業はあります。
以下にその一部を紹介します。

◆くら寿司株式会社(外食)
AI技術(ディープラーニング)を用いて、マグロの目利きアプリ「TUNA SCOPE」を開発。
⇒一部の職人に依存する業務が自動化され、安定した品質と価格で商品が提供可能となった。

◆トライグループ(教育)
スマホやタブレットから無料でオンライン授業を視聴できる「Try IT」のサービスを提供。
⇒端末とインターネット環境さえあれば、時間と場所を問わず誰でも勉強が可能となった。

◆スターバックスコーヒージャパン(外食)
事前に注文と決済を行えるスマホアプリ「MobileOrder & Pay」を提供。
⇒顧客はレジに並ぶ必要がなくなり、商品の受け渡しもスムーズになった。

◆クボタ(建機・農機)
建機・農機の故障診断アプリ「Kubota Diagnostics」を開発。
⇒診断プロセスを効率化し、機械の停止時間を削減することができるようになった。

◆資生堂(化粧品)
顔認証技術とAI技術を利用した「バーチャルメイク」のサービスを提供。
⇒時間帯を問わずオンラインでカウンセリングを受けられ、そのまま商品を購入することができる。

tech_blog_202305_02.jpg

現在多くの企業や組織が自社のビジネスモデルを見直しながらDX化を進めていますが、
まずは現状の分析して課題を明確化することが第一歩となります。

何から着手すればよいのか?どのように実現すればよいのか?費用対効果が見合うのか?
ハイテックスにもDXに関する多くのお問い合わせを頂いており、業務に応じたご提案をさせていただいています。
まずはお気軽にご相談頂ければと思います。

最後は弊社の宣伝のようになってしまいましたが、今回はここまでになります。
次回も乞うご期待ください。
今回は IE(Internet Explorer)のことについてお話したいと思います。
皆さんも使用されていたのではないでしょうか。

IEのサポートは既に終了している
ご存知かとは思いますが、 IEは2022年6月15日(※)にサポートが終了しています。
Windows11 環境ではアイコンすら表示されず、起動できません。
※Windows10 バージョン21H2 のサポート期間。OSやバージョンによってサポート期間が異なります。

私が使用している会社のPCのバージョンは Windows10 21H2 なので IE のサポートが終了している状態です。
ただし、起動自体はできる状態ですので、試しに起動してみますと...

tech_blog_202302_01.png

上記の画面が表示され、Microsoft Edge に自動で切り替わりました。
実質使用できない状態ですね。

サポートが終了しているものを使用するのは危険
Windows Update の更新が滞ってるOSでは、今でもIEを使用できる場合もありますが、
サポートが切れている状態で使用し続けることは、セキュリティ上危険です。
IEに限らず、OS や アプリケーションにはサポート期間というものがありますが、
サポート期間であれば、セキュリティ上の危険が見つかった場合、対応する更新プログラムが提供されます。
Windows Update を実施すれば、更新プログラムが適用されますが、
サポート期間が切れると、上記のような更新プログラムが全く提供されなくなります。
これにより、セキュリティ上の危険が増えていく一方です。
・サポートが終了しているものは利用しない
・Windows Updateを定期的に行う
・サポート期間を把握しておく
というのが大事です!

IEモードについて
また、2023年2月14日に一部のバージョンの Windows 10 で完全に無効になる予定とあります。
Internet Explorer 11 デスクトップ アプリケーションのサポート終了
着実に廃止化が進んできていますね。

どうしても IE を利用したい場合の方法の1つとしては、Microsoft Edge の「IE モード」機能を利用することです。
IE モードとは簡単に言うと、Microsoft Edge や Chrome 等で非対応のIE ベースの Web サイトを
直接 Microsoft Edge からアクセスできる機能です。 
利用方法はいくつかあるようですが、ここでは Microsoft Edge の設定メニューから設定する方法を紹介します。

Microsoft Edge の「設定」メニューを開く
「既定のブラウザ」メニューを開く
「Internet Explorer に Microsoft Edge でサイトを開かせる」で「互換性のないサイトのみ」または「常に」を選択する
「Internet Explorer モード (IE モード) でサイトの再読み込みを許可」で「許可」を選択する
「Internet Explorer モード ページ」に IE モードで開きたい URL を追加する

tech_blog_202302_02.png

IE モードに指定した URL のページを開くと、下記が表示され、IE モードで表示されていることが確認できます。

tech_blog_202302_03.png
移行の準備はお早めに
IEモードについては、 2029 年までサポートされる予定ですが、あくまでこれは暫定処置です。
IE のサポートについても当初は2025年10月までだったのが前倒しされて2022年6月になったので、
どうなるか分からないというのが現状です。
いずれにせよ、いつかは(はやいうちに)IE は使用できなくなります。
まだ使えるから大丈夫と思っている方、
なるべく早く、Microsoft Edge や Chrome 等のブラウザへの移行をご検討下さい!

以上になります。
次回のブログも乞うご期待下さい!
はじめまして、富山オフィスの上田です。
入社 10 年目で、最近では Java や JavaScript を使った Web システムを開発しています。

みなさん、 Windows11 は使っていますか?
Windows10 を使っていれば、無料アップデートではありますが、
ハードウェアが対応していないとアップデートできないなど
実は触ったことが無いという人も多いのではないでしょうか。

実は、私も自宅や職場のPCは Windows10 のままで、Windows11 はアプリのテストで少しだけ触った程度です。
Windows11 が出たのは 2021/10/5 です。
なんともう 1 年以上が経っています。
SE としてこれはマズい!ということで、今回はこのテーマにしてみました。

「Windows11 にするとどう変わる?」

Windows11 では Windows10 と何が変わるのでしょうか。
Webサイトで調べてみると次のようなことが書かれています。

・タスクバーが中央寄せ
・新しいデザイン
・ウィンドウのスナップ機能
・Androidアプリが実行できる
・セキュリティの強化

この中では、「ウィンドウのスナップ機能」が気になるので、操作感を見ていくことにします。
早速ですが、Windows11 を起動し、適当に 3 つほどウィンドウを用意しました。

tech_blog_202212_01.png

最大化にマウスカーソルを合わせるとこのようなポップアップが表示されます。

tech_blog_202212_02.png

移動したいレイアウトの形状にマウスカーソルを合わせクリックすると...

tech_blog_202212_03.png

ウィンドウが移動しました!
ちなみに ウィンドウのタイトルバーを掴んで、赤丸矢印のように画面端に持って行き...

tech_blog_202212_04.png

↓のようになったら、離します。

tech_blog_202212_05.png

これでもウィンドウはスナップします。Windows10 でも出来た方法ですね。
ただし、Windows10 では、スナップした残りの領域がウィンドウを指定する画面になっていましたが、Windows11 ではそれが無くなったようです。
個人的には要らない動作だったので、嬉しい変更です。

tech_blog_202212_06.png

(参考)Windows10 では、スナップした残りの領域がウィンドウを指定する画面になっていました。

tech_blog_202212_07.png

いかがでしたでしょうか。
今回は Windows11 のウィンドウのスナップ機能の紹介でしたが、
ほかにも Windows11 にはいろいろな新機能・変更点があるようなので、使いこなしていきたいですね。
はじめまして、富山オフィスの田財です。
私は普段  C++ を利用してシステム開発することが多いので、これに関連したテーマにしたいと思います。
テーマは「C/C++ のコンパイル時最適化に注意する」です。

まず、C/C++を含むプログラミング言語は、言語仕様に従ったソースコードから、
機械語あるいは元のプログラムよりも低い水準のコードに
変換(コンパイル)するコンパイラが存在します。(コンパイラ(Wikipedia)より引用)

また、C/C++の一般的なコンパイラには「最適化」という機能が備わっています。
ソースコードをコンパイルする際に、より高速で動くプログラムとなるように
ソースコードの示す結果が変わらない範囲で最適化してコンパイルする、という機能です。

今回はこのコンパイル時最適化についてのお話ですが、
テーマの本題に入る前に、まずはこの最適化がどのような機能なのか、説明します。

例を1つ提示してみます。


上記のソースコードは、10 の階乗に 0 ~ 9 を順に掛けて、
都度標準出力する単純なものです。
実は、このソースコードには、効率の悪い処理となっている部分があります。

プログラミング経験のある人であれば一目でわかるかもしれませんが、


の部分です。
このソースコードだと、i が 0 ~ 9 の範囲で順に 1 ずつ増えていく間に
何度も 10 の階乗を計算しているため、効率が悪いです。
最適化案としては、「上記の部分を for (int i = 0; i < 10; i++) {} の外に出す」でしょうか。
こんなイメージです。


これであれば、10の階乗の計算を最初に一度行うだけで済みますね。

では、実際にコンパイラに最適化してもらいましょう。
VisualStudio 2015 で、 /O2 で最適化した結果を逆アセンブルで見てみます。

20220819-1.png




注目は

20220819-2.png


の部分です。
・10 の階乗を何度も計算する必要が無いこと
・この計算結果は常に変わらないこと
を見事看破したコンパイラは、コンパイル時に


の部分をあらかじめ計算してしまい、x375F00(10進数で 3,628,800) という数字をそのまま使った処理にしています。
この数字を使って、出力に使用する変数が x229B600(10進数で 36,288,000) になるまで都度足しては出力する、
という内容に最適化したようです。

最適化した結果をソースコードに直して比較すると、以下のようになるでしょうか。

○最適化前

○最適化後

こちらが想定していた最適化案よりも、さらに効率が良いですね!

このように、コンパイラの最適化はとても賢いです。
コンパイラの最適化機能はどんどん発展しており、プログラマがあまり意識せずとも
高速に動作するプログラムが作成できるようになってきています。

さて、ようやく本題です。
上の例で示した通りとても賢い最適化機能ですが、一方で、
この機能によってプログラマが意図しないプログラムになってしまうこともあり、注意が必要です。
今回は、その1例を紹介します。

例えば、以下のようなソースコードがあります。


パスワードを char pwd に代入して操作し終わった後、
速やかに memset で 0 初期化するソースコードです。
いつまでもメモリ上に残存していることは、セキュリティ上リスクがあるためにこのようにしています。

さて、これが最適化されるとどうなるでしょうか。
先ほどと同じく、VisualStudio 2015 で、 /O2 で最適化した結果を逆アセンブルで見てみます。

20220819-3.png

memset  の下に命令が何もありません。
メモリを覗いてみると、return 0 まで辿りついても当然、パスワード("abcd")が残ってしまっています。

20220819-4.png

これはどういうことでしょうか。

pwd は if (GetPassword(pwd)) {} 以降一切利用されない変数です。
コンパイラ目線で見れば、プログラムが終了したら勝手に開放されるのだから、
今後利用されない変数 pwd をわざわざ 0 初期化しなくても良いはずだ、と判断できます。
そのため、最適化によって memset~ の一文はコンパイルせずにスキップしてしまっています。

このように、プログラマの意図しない最適化により、セキュリティ上リスクのある
プログラムになってしまったり、想定しない動作を引き起こすことがあるのです。

今回の例の回避策として、例えば以下のようにします。


最適化結果を逆アセンブルで見てみます。

20220819-5.png

今回はちゃんと命令がありますね。
メモリを覗いてみると、

20220819-6.png


のタイミングで、1変数ずつ0初期化されていっています。

20220819-7.png


20220819-8.png


無事、すべて 0 初期化されました。

20220819-9.png

Windows API には、最適化によってスキップされないことを保証する
ZeroMemory(), SecureZeroMemory() があります。
これらを使うことで、意図しないスキップを回避することが出来ます。

コンパイル時最適化には、他にもプログラマが意図しない結果を引き起こすものがあります。
他の事例は機会があればまたいずれ。

ハイテックスではこのような事例も考慮して、日々開発を行っています!
はじめまして、富山オフィスの小坂です。
今年の4月で入社11年目になりました。
自分はまだまだ若い気持ちでいますが、新入社員の方を見ると歳を感じますね...。

さて、久しぶりではありますが技術ブログの更新です。
前回の更新が5年前のようで...スミマセン。

復帰第1回目のテーマは...
「C++ CString 文字列比較ってどれが速いの?」

Windowsのアプリ開発でよく使われているライブラリと言えば「MFC」が思い浮かぶと思います。(もしくはATL)
更にその中で、文字列を扱うクラスと言えば「CString」がありますね。
サイズを気にせず代入や結合が簡単にでき、フォーマットや文字列比較もできるという、至れり尽くせりな便利クラスです。

ということで、今回は「CString」について紹介していきたいと思います。
といっても全部紹介していると日が暮れるので「文字列比較」、更にはその「処理速度」にスポットを当てて話をしたいと思います。

文字列比較でよく見るコードは以下のような比較演算子を使った形ですね。
  1. CString str1 = _T("abc");
  2. CString str2 = _T("123");
  3. bool bSame = false;
  4. if (str1 == str2) {
  5.   bSame = true;
  6. }


上記のようなコードでもプログラム的に問題はありません。
しかし処理速度の観点から見ると、もっと良いコードが書けます。

ではどのようなコードが速いのか?
検証を行ってみたので、その結果を紹介したいと思います。

【検証内容】
以下の文字列の比較を 1,000,000回 行った速度を計測。

Vdk4jQnifyheeUVSJMAD2FdUXyCfR9HRTACieCMBVDguC3ALbU
vDK4JqNIFYHEEuvsjmad2fDuxYcFr9hrtacIEcmbvdGUc3alBu

使用した関数は以下の4つ。
  • Cstring::Compare
  • Cstring::CompareNoCase
  • _tcscmp
  • CStringの等価演算子(==)

【検証コード】
比較結果をbool型の変数に代入するだけのシンプルなコードです。
測定する関数以外のコードはコメントアウトしています。
  1. bool bSame = false;
  2. CString str1 = _T("Vdk4jQnifyheeUVSJMAD2FdUXyCfR9HRTACieCMBVDguC3ALbU");
  3. CString str2 = _T("vDK4JqNIFYHEEuvsjmad2fDuxYcFr9hrtacIEcmbvdGUc3alBu");
  4. // 測定start
  5. auto start = std::chrono::system_clock::now();
  6. for (int i = 0; i < 1000000; i++) {
  7.   //bSame = (0 == str1.Compare(str2));
  8.   //bSame = (0 == str1.CompareNoCase(str2));
  9.   //bSame = (0 == _tcscmp(str1, str2));
  10.   bSame = (str1 == str2);
  11. }
  12. // 測定end
  13. auto end = std::chrono::system_clock::now();
  14. // ミリ秒→秒 変換
  15. double dSec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() * 0.001;
  16. // 出力
  17. CString strResult = _T("");
  18. strResult.Format(_T("%lf"), dSec);
  19. ::AfxMessageBox(strResult);

【検証結果】
結論:_tcscmpが一番速い
  • Cstring::Compare
  • 0.030
  • Cstring::CompareNoCase
  • 1.380
  • _tcscmp
  • 0.003
  • CStringの等価演算子(==)
  • 0.037
  ※5回計測した平均値、単位は[秒]

上記の結果を見ると、基本的には「_tcscmp」を使うのが良さそうですね!

【Tips】
今回の速度計測に用いたライブラリ「std::chrono」を簡単に紹介しておきます。
C++11から導入された標準ライブラリで、現在時刻の取得や時間計測ができます。

以下は処理時間を計測する時のサンプルコードです。
  1. auto start = std::chrono::system_clock::now();
  2. // この間に測定したい処理を書く
  3. auto end = std::chrono::system_clock::now();
  4. // 処理時間を取得(ミリ秒→秒に変換)
  5. double dSec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() * 0.001;

応用すればラップタイムの出力もできるので、ぜひ使ってみてください!

以上、いかがでしたでしょうか?
ちょっとテーマがピンポイントすぎたかもしれませんが、皆さんのお役に立てれば幸いです。

次回も乞うご期待ください!
ありがとうございましたm(_ _)m
前回の技術ブログでは、なぜエクセルで見積書や請求書を作成・管理すると、いずれ大変になるのか?
という話題で、エクセルやアクセスを使った社内システム利用時の問題点についてまとめました。
今回はさらにもう1歩進んだ、エクセルやアクセス利用時の落とし穴についてご紹介したいと思います。


office-1356793_960_720.png
顧客リストや案件管理、日報、売上の管理など、エクセルやアクセスでされている企業は多いと思います。
手軽に利用し始めることができるため、関数やマクロを使いこなせれば、とても心強いビジネスツールとなります。
しかし、皆様のお悩みとして下記のようなお声をよくお聞きします。

  1. エクセルやアクセスのバージョンが変わったので利用できない
  2. エクセルやアクセスのバージョンが変わった際に、それまでのバージョンで動いていた処理が動作しなくなることがあります。
    しかもそのシステムの定義書や設計書などが存在せず、開発者の頭の中だけに設計図があることが多く、さらに悪いことにシステムを作った人の異動や退職等で改修が不可能な場合は、そのシステムは使い物にならなくなったり、改修費用が想像以上にかかったりします。

  3. 間違って更新、削除してしまう
  4. 何時間もかけて作成した集計表などを共有サーバにアップした際に、他の人の別のシートやデータベースの更新作業を行ったエクセルでアップロードされてしまい、せっかく作った物が更新、削除されてしまったことはありませんか?
    結局、それまでの各々の作業時間がムダになりますし、似たような名前のファイルが作成され、何度もファイルの中身を確認しては入力し直し...の繰り返しで思いのほか手間がかかります。

  5. 属人化や維持メンテの問題
  6. どんな会社にも1人はいる"エクセルマスター"、"アクセス名人"。
    複雑な関数やマクロを駆使して出来上がった、超便利なエクセルファイル。
    ただしコピー&ペーストを繰り返しているうちに値がおかしくなっていき、原因を探ろうにも、参照先をたどっていくのが難しっかたり、その作った人が急に休職、退職してしまったら...もう誰にも直せません。

  7. 細かい権限設定ができない
  8. 特定の部署や、特定の関係者だけで把握したり、利用したいデータがあるのに、ユーザによって編集・参照権限をデータの項目ごとに設定できずに困ったという経験はありませんか?
    また設定とか確認のプロセスとか細かいことが沢山あって、利用する際に逆に複雑怪奇になってしまうことも多々あります。


accountant-1794122_960_720.png
取り敢えずエクセルでやっておこう!の前述のような困った状態から脱却し、会社全体の利益を考えたパッケージソフトやシステム化を考えたいというお客様はお気軽にご相談ください。
「どこから手を付けてよいか分からないし、とりあえず今動いているからしばらくこのままでいいや」とお考えの方や、「どうせ高いんでしょ」と諦めている方も多いと思います。
しっかりとした業務分析や課題整理を行った後に導入するパッケージソフトやシステム化によって、エクセルでの作業をただ単純に効率化させるというだけではなく、会社全体として利益を生む、自社にマッチしたシステムが出来上がります。

f4be6bf966a34e724766e1a4cfec84cf_m.jpgハイテックスでは、ITを活用した業務改善のお手伝いをさせて頂いております。
また、ご提案の際は、費用対効果を明示した上でシステム導入のメリットとデメリットをご説明させて頂きます。
小さな業務改善も近い将来の大きなビジネス変革につながっていきますので、先ずはお気軽にご相談頂ければと思います。
 ここ数年、Microsoft Excel(エクセル)/Microsoft Access(アクセス)に関することの相談が多くなってきており、今年もすでに何件もの相談をいただいています。先日もある企業様から、見積管理から始まり、施工管理、販売・売上管理、マーケティング管理、顧客管理、在庫管理、シフト管理などといった一連の業務について、「長年エクセルで頑張ってやってはきたつもりだが、うまくいかないことが年々増え、限界かな?と感じるようになってきたが、どのようにすればいいですか?なにか解決策はないですか?」との相談をいただきました。

ExcelAcess.png さまざまな業務シーンで利用されているエクセルやアクセス。特にエクセルは簡単に管理が行えて、金額や数値の集計を行うには大変便利です。エクセルのシート間やファイルごとの集計も、マクロやVBAを利用することで、集計の自動化も可能で、データ管理や集計処理、一覧管理にはとても便利なものです。
しかし、扱う品目や項目が増えてきたり、データ量が多くなってくると、途端に管理するのが大変となってきます。また、どのエクセルファイルに何を記録してあるのかなど、すぐに必要な情報に辿り着くのも難しくなってきます。
さらには、見積管理だけと思って始めたものが請求管理、顧客管理、在庫管理などと業務量や取り扱うデータが広がっていったり、多拠点・多人数の大勢での情報共有となると、機能的制約で問題視されたり、管理できなくなってきたりします。

Excel(エクセル)も一応デジタルなのに、なぜこのような課題が出てくるのでしょうか?

答えは簡単で、Excel/Accessはあくまでも小規模利用を想定したファイルベースのアプリケーションであり、見積管理や顧客管理を行うための専用のツールではないからです。ただ見積管理ができそうなツール(Excel)が目の前にあったから普及しただけです。最初からインストールされていたPCなら新たに費用も発生せず無料ですし、また取っ付き易くて始め易いですから・・・

【Excelの限界点】
  1. 検索の手間
  2. お客様の名前や見積番号・顧客IDなどの簡単な条件での検索はできますが、「昨年10月ごろ?に見積した○○様の物件で...」などと複雑な検索条件を組み合わせて探すのが難しく、電話がかかってきたタイミングで目視で探したり、チェックしたりと手間が生じます。

  3. データ容量増大による処理速度低下
  4. iraira.jpgファイルベースであるが故の制限も多くあります。昨今では、データベースで画像やPDF文書のようなバイナリデータを扱うケースも増え、適用業務の拡大とも相まって、データサイズは日々増大する傾向にあります。
    PCのスペックにも依存しますが、データサイズが大きくなり2,000件以上の見積管理(見積履歴や接触履歴などを含む)を行うのは、検索や編集時に"画面が止まる"というストレスを感じることもあるでしょう。
    また、ファイルベースであるということでは、容量を2ギガバイト以上に拡張することはできません。対象ファイルのデータ容量が拡大すれば、どこかでファイル自体を分割しなければならず、ファイルを分割すれば、当然ファイル管理は煩雑となり、データを更新するにも対象のテーブル/ワークシートが見つからない、あるいはデータ分析を行うにも複数のデータベース/ワークブックからデータを抽出し、再結合するなどの余計な作業を強いられることにもなりかねません。

  5. マルチユーザー環境での不満、同時に編集ができない
  6. 008_3d_200x150.jpg業務量が増えてくると、一般的にはデータを複数のスタッフで共有したり、スタッフ間でデータ交換を行う必要が出てきます。ところがエクセルの効果的な活用とは、単一スタッフによる集計・加工や、複数スタッフ間での情報閲覧に限定されものです。逆に言えば、複数のスタッフがひとつのエクセルファイルに書き込んだり、変更を加えるような業務活用には不向きです。たとえば同時に電話が鳴った場合など、誰かがエクセルを更新しているときには、その作業が終わるまで待たないといけません。スタッフ全員の待ち時間コストを合算すると組織全体では大きなロスとなります。

  7. データ管理が個人に依存しているため、組織で管理できていない
  8. 見積管理、請求管理、顧客管理などと、スタッフの増加や売上の拡大に伴い作業量は飛躍的に増えていくものです。
    また、データが分散するため、同じような情報が点在したり、担当者がいないと何もわからない状況も起こり易いものです。さらには、マクロを駆使し作り込んだエクセルでも企業規模の拡大や使用期間が経てば、限界を感じてしまいます。エクセルはもちろんデータそのもののバージョン管理にも手間がかかります。

  9. セキュリティが不安
  10. binary-code-1.jpg個人情報保護法がニュースや雑誌の紙面をにぎわせることが時々ありますが、ファイルコピーによって重要な情報が社外に持ち出されてしまうことが懸念されます。もちろん、適切なファイルセキュリティを設定すれば、ある程度は防げる問題かもしれませんが、データベースをファイル単位で管理している以上、そのセキュリティレべルには限界があります。ついうっかり忘れて全員から丸見えだったり、閲覧・編集など多彩なアクセス権の設定や、「住所」だけ見せたくないなど項目ごとのアクセス権の設定など、難しいものがあります。

  11. 何回もの入力手間とミス
  12. 各担当者から渡されるデータをエクセルで管理している場合、行のマージ、転記、シートの統合という細々とした作業が発生します。細かな作業を人手に任せると必ずある一定の割合でミスが混ざりこみます。ミスは発生当初ですぐに発見できれば大した問題になりませんが、遅くなると手戻りコストが大きくなります。
    また、見積管理で入力したデータを請求管理や顧客管理で使おうとすると、その都度に再度入力しなければならず、二度手間三度手間の入力となりまず。さらにエクセル管理の場合、各担当が持っているデータを集めないといけないので、リアルなデータ反映はどうしても遅くなります。

  13. バックアップの管理コスト
  14. ファイルベースなので、バックアップ作業はファイル単位で行わなければなりません。これは小規模利用での手軽さという意味ではいいですが、扱うべきデータ容量が増大したり、ファイルが分散した場合に、バックアップに要する工数は幾何級数的に増大していきます。また、バックアップに際しては誰も更新を行っていないことをまず確認してからでないと開始できない、という運用上の手間も発生します。

  15. 他の拠点や外出先では閲覧できない
  16. 組織が成長して拠点が増える場合や、営業など事前に社内で確認していたとしても、全てを事前に確認することは難しく、急な予定があれば事前確認できないケースがあります。こういった場合の閲覧はもちろん編集には対応できず、クラウド化対応や専用ビューアなどとひと手間かけた工夫が必要となってきます。


以上のように、情報資産の有効な利活用、さまざまな管理データからの高度な集計や分析、組織内での効果的な情報共有を行いたいなら、そろそろ別な方法の考え時かもしれません。

d0749a71d946d1f81ff6b7f5367.jpg なお、Postgressなどのデータベースや、Ruby on Railsなどのシステムのオープンソース(無料で利用可能)が普及したことで、システムの開発期間が以前より格段に短く、低価格でシステム開発が可能となってきています。エクセルファイルによる管理に限界や不便を感じましたら、一度、クラウドWEBシステム、オーダーメイド開発の導入を検討してみたら如何でしょうか。思ったよりも、低価格で簡単に導入することができると思います。

長引く不況を背景に、システム需要も変わってきています。
今後のシステムに求められるものは何か、
弊社社長 下坂 芳宏へのインタビューをまとめました。


P7314179.jpgビジネス環境の変化に通用するために


「日本経済が低迷を続けるなかで、どの業種も『今のままじゃだめなんじゃないか』という危機感を持っています。
人件費の安い東南アジアを生産拠点にして作られる他国製品に、国産品は、価格で勝つことが難しくなってきている。これまで通りのやり方が通用しなくなってきているんですね」


――システムについての要望も変わってきている?
「『手作業でやってきたことをコンピューターで置き換える』ような作業の効率化を図るシステムから、"儲けを生み出すシステムづくり"にニーズが変わってきている。企業の想いがそれだけ変わってきているということです」


商品の価値を伝える、売り方を変える


――具体的にはどんな要望があるのか?
「例えば、これまで直販していなかったメーカーが、自社で売ることを考えている話をよく聞きます。
これまでは、メーカーが問屋や代理店を通して販売してきましたが、このルートも守りつつ、新たに自社で直販をやるためにシステムをどう変えたらいいか、という相談を受けます。
代理店は、そのメーカーの商品だけを扱うわけではないので、エンドユーザーにもっと安くしてと言われたら、外国産の似たような商品を売ることもある。メーカーのこだわりや、なぜこの価格なのかという価値を伝えてくれないので、価格だけで負けてしまうことがあるんです」


エンドユーザーの声が届くように


「今は、楽天やヤフーなどのショッピングサイトが充実していますので、ネット通販を始めることも非常に手軽です。しかし、大手のモールの中では、店が多すぎて埋もれてしまったり、手数料が高くて続かないケースも多いんですね」


――ECサイトシステムに求められていることは何か
「自社商品の魅力やこだわりを直接伝えるには、エンドユーザーと直接つながるルートが必要です。それにより売上アップを図るのはもちろん、ユーザーからのフィードバックをもとに、更に魅力のある商品づくりにつなげていく動きが求められています」


P7314184.jpg情報の活用により新しいサービスをつくる


「また、近年増えてきた動きとして、センサーの活用が挙げられます。センサーネットワーク技術の発達により、遠隔地や、人が入ることのできない場所などから、センサーで実に詳細な情報が得られるようになりました。
例えば、メンテナンス頻度の低い設備など、これまでは、故障した場合にサービスマンが故障個所を調べに行き、想定外の故障や部品がない場合には、改めて修理に行かなければならなかった。
それが、センサーから得た情報を活用することによって、必要な部分を的確に短時間で修理することが可能になりました。
この動きで何が変わるのかというと、機械が止まる時間を短縮できるので、非稼働による損失を減らすことができます。また、メーカーがデータを得ることでメンテナンスサービスの魅力が上がり、その結果、保守売上が上げるという効果も期待できます」


儲けにつながるシステムづくりが求められている


「今までのシステムはなぜ儲けにつながらなかったのか。それは、システム側も、クライアント側も、双方に踏み込みが足りなかったんだと思います。手作業をコンピュータに置き換えるところで止まるのではなく、もっとその先に踏み込んだものが、今後は必要になってくるはずです」


――ハイテックスができることは?
「お客様と話をしていると、クライアント側も、問題点がはっきりわかっていない場合も多いのです。
弊社では、お客様が何に困っているのか、この先どうなりたいのかを、直にやりとりして、ひとつひとつ洗い出していく作業を、時間をかけて、一緒に進めていきます。
また、新しい儲けにつながる動きを考えていくため、これまでと違う業務の流れが発生します。仕事の方法の再整備や、業務改革も含めて話をします。
その後、お客様の『こんなことをやりたい』という要望を満たせるよう、ハードや回線、ネットワークを含め、予算の範囲内でどこまでできるかを提案していきます」

トップページ | 技術情報ブログの記事一覧 | 

お電話でのお問い合せ:076-452-6280

メールフォームでのお問い合わせ・ご相談はこちら

弊社開発実績はこちら

新規開発からシステムリフォームまで、豊富な実績でお応えします。

ソフトウェア開発実績はこちら

製品パッケージのご案内

ワンストップで利用出来るハイテックスのパッケージソフトウェア。

製品パッケージはこちら

ハイテックスの特徴

経験豊富なスタッフがローコストで使いやすいソフトを開発します。

ハイテックスの特徴はこちら

よくある質問

システム開発についての疑問点に丁寧にお応えします。

よくある質問はこちら

料金の目安

ご予算に応じてシステムのご提案をいたします。

料金の目安はこちら

無料相談受付中

専門スタッフがシステムのご提案をいたします。

無料相談お申し込みはこちら

採用情報はこちら

経済産業省認定情報処理支援機関

Copyright Hitechs Inc. All Rights Reserved Worldwide.