2026年2月8日日曜日

Excelマクロの呪縛を解く。20年目のエンジニアがkintone集計ツールにkrewDataを選んだ理由

 



1. はじめに:エンジニアがkintoneに触れる

ずっとスクラッチのシステム開発(フルスクラッチでの設計・実装)を主戦場としてきた私ですが、最近はお客様から「開発コストを抑えたい」「導入後、自分たちで保守・運用できる仕組みにしたい(ノーコード)」という切実な声を多く聞くようになりました。

そこで数あるノーコードツールの中から、特にカスタマイズ性の高いkintoneに着目しました。

背景にあるのは、多くの現場で「負の遺産」となっている「Excelマクロのブラックボックス化」という普遍的な課題です。これをkintoneという近代的なプラットフォームで、いかに「持続可能な形」に再構築できるか。そこがエンジニアとしての私の挑戦の始まりでした。

2. 直面した課題:標準機能だけでは超えられない「集計の壁」

RDB(リレーショナルデータベース)でいう「テーブル」を、kintoneでは「アプリ」という単位で扱います。

「社員マスタ」「サービスマスタ」といったマスタデータを参照し、日々の活動を記録する「トランザクションアプリ」を作ること自体は、kintoneの標準機能で驚くほどスムーズに実現できました。

しかし、大きな壁となったのが「複雑な集計ロジック」です。

単なる数値の足し算ではなく、以下のようなビジネスルールが絡む場合、標準機能だけでは対応が難しくなります。

• 「利用開始月は無料にする」

• 「解約日が15日以前なら当月分は0円、16日以降なら満額請求」

これをノーコードで、かつ誰が触っても壊れない「堅牢なシステム」として実装するには、標準機能の枠を超える必要がありました。

3. 解決策の比較:DataCollect vs krewData

この「標準機能の限界」を突破するための外部サービスとして、市場で圧倒的なシェアを持つのが、トヨクモ社の『DataCollect(データコレクト)』と、メシウス社の『krewData(クルーデータ)』です。

■ DataCollect(関数型・リアルタイム集計)

アプリの画面上で、Excelのように数式(SUMやIFなど)を直接入力して計算させるツールです。

• メリット: Excelの延長線上で設定できる手軽さがある。

• 懸念点: 数式の中にロジックが隠蔽されがち。数が増えると「どのフィールドにどんな式があるか」の把握が難しく、スクラッチ開発でいう「スパゲッティコード」に近い状態になるリスクを感じました。

■ krewData(ETL型・バッチ処理集計)

複数のアプリからデータを吸い上げ、工場のライン(フローチャート)のように加工して、別のアプリへ一括で書き出すツールです。

• メリット: データの結合(JOIN)やフィルタリングの流れが視覚的に固定される。

• エンジニア視点: データフローが可視化されているため、不具合時の切り分けが容易で、構造が非常に直感的です。冒頭にフローイメージも作ってみました。

4. 決め手は「3年後のメンテナンス性」と「デバッグ」

システムは「動く」のは当たり前です。本当に大切なのは「3年後に自分以外の誰かがメンテナンスできるか」という点です。

お客様の中にはExcelに詳しい方もいらっしゃいます。しかし、なまじExcelが使えてしまうと、複雑な数式を無理やり組み込んでしまい、結局「作った本人しか直せない」状態に戻ってしまう危険性があります。

その点、krewDataは「数式を意識させすぎない」UIです。集計や条件分岐がノード(図)として表現されるため、エンジニアも非エンジニアも同じ土俵で「データの流れ」を理解できます。結果的に、これが「お客様自身で運用を回せる」という真のノーコードの価値に繋がると確信しました。

5. まとめ:エンジニアがノーコードを扱う「真の価値」

Excelで実現されている現行業務には、必ずといっていいほど「泥臭く複雑な条件」が潜んでいます。

その要件をただツールに詰め込むのではなく、いかにシンプルで安定した「データのパイプライン」に落とし込めるか。そこがエンジニアの腕の見せ所です。

道具が変わっても、設計思想の重要性は変わらない。そう感じたツール選定でした。


2026年2月1日日曜日

マクドナルドの闇!?フィレオフィッシュのチーズが「半分」なのは、実は計算し尽くされた戦略だった件




 1. 衝撃の発見:その時、事件は起きた

マクドナルドで不動の人気を誇る「フィレオフィッシュ」。

ホカホカのバンズを何気なくめくってみたら……




「えっ、チーズが半分しかない!?」

これ、マック好きなら一度は経験したことがある「フィレオフィッシュあるある」かもしれません。私も最初は「バイトの店員さん、忙しくてちぎれちゃったのかな?」と、クレームを入れる寸前までいきました。

2. 発覚した衝撃の事実:ミスじゃなかった!

怒りに震えながら(?)念のためネットで調べてみると、Yahoo!知恵袋や元店員さんの証言で驚愕の事実が判明。


「フィレオフィッシュのチーズは、最初から半分(1/2枚)が正規のレシピです」


なんと、入れ忘れでも手抜きでもなく、マクドナルドの厳格なルールだったのです。

3. なぜ「半分」なのか?マックのこだわり(という名の正当化?)

なぜ、わざわざ1枚を半分にする手間をかけてまで「半分」にこだわるのか。そこには深い(?)理由があるようです。

• 味のバランス: 白身魚の繊細な味を殺さないよう、チーズの主張を抑えるため。

• コスト管理: …という側面も否定はできませんが、公式には「最高の味のバランス」を追求した結果だとか。

ちなみに、ダブルチーズバーガーにはあんなにチーズが入っているのに、フィレオフィッシュだけがこの扱い。まさに「選ばれし半分の美学」ですね。

4. まとめ:知らぬは客ばかりなり

「チーズ半分」を知らずに食べ続けている人は意外と多いはず。

次からフィレオフィッシュを食べる時は、そっとバンズをめくって「今日も正しく半分だな」と、職人のこだわりを確認してみてください。




【失敗談】3COINSタブレット(2525/PRE-GHTB)をドアベル専用モニターにする計画が崩壊した話。CloudEdgeは動くのか?

 


1. 導入:完璧な計画だった。

「玄関のインターホン(CloudEdge)を、キッチンで座ったまま確認したい。」

そんな願いを叶えるべく、3COINS(スリコ)で1万円のタブレット(2525/PRE-GHTB)を購入。

「Android 15だし、アプリの要求はAndroid 5.0(Lollipop)以上。勝ったな。」

そう確信してレジへ向かったあの時の自分に、今の私は言いたい。「ちょっと待て」と。

2. 期待に胸膨らむ「開封の儀」



• パッケージを開けると、1万円とは思えない綺麗な大画面。

• 「これがサブ機として動けばコスパ最強伝説の始まりだ」とワクワクしながら電源をON。

3. スムーズなセットアップ



• 初期設定はいたって順調。Android 15 (Go Edition) の軽快な動きに、「お、意外とイケるかも?」と期待値は最高潮に。

4. 運命の瞬間:Google Playストアの無慈悲

いよいよ本命のアプリ「CloudEdge」をインストールしようと検索バーに打ち込みます。検索結果に出てきたアイコンをタップした瞬間、目に飛び込んできたのは……



「……えっ?」

アプリ名で検索はできるのに、、、

OSのバージョンは足りているはずなのに、、、なぜ?

5. なぜ拒絶されたのか?(技術的な考察)

調べたところ、原因はおそらくこれです。

• Android Go Editionの制限: 低スペック端末向けの「軽量版Android」であるため、特定の高度な機能やハードウェア要件(映像のエンコード/デコード等)を必要とするアプリが制限されることがある。

• カメラ・マイクの権限や解像度: ドアベルという「リアルタイム映像」を扱う特性上、このタブレットのチップセット(Allwinner A333)がサポート対象外と判断された可能性。

6. まとめ:1万5000円の勉強代

今回の教訓。

「Androidのバージョンが最新でも、Go Editionには見えない壁がある。」

CloudEdgeをタブレットで使おうと思っている皆さん、安物買いの銭失いにならないよう、せめて「Go Edition」ではない普通のAndroidタブレットを選ぶことを強くおすすめします……。

2026年1月28日水曜日

【Azure】WAFとの死闘168時間。ASP.NET CoreアプリをAzure WAFで守ろうとして学んだこと

 



1. イントロダクション

Azureを勉強して、ASP.NET Coreでポートフォリオ兼用のWebアプリを公開してみた。

「せっかくなら実戦的に」とAzure Web Application Firewall (WAF) を導入したが、ここからが本当の戦いの始まりだった……。

2. 最初の壁:ログインできない!

公開直後、ログインしようとすると謎の403エラー。ログを確認すると……

Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)

何が起きていたのか?

ASP.NETの認証用Cookieに含まれる記号の多さが、「攻撃用コードを隠している」と判定されていた。

• 原因: WAFの「異常検知ルール(942450など)」。

• 気づき: セキュリティを強くしすぎると、標準的なフレームワークの挙動すら「悪」とみなされる。

3. 第二の壁:いたちごっこの泥沼

特定のCookieを除外設定(Exclusion)して「勝った!」と思ったのも束の間。今度は別のログが。

• SQL Injection Attack: SQL Tautology Detected(1=1攻撃の誤認)

• Multiple URL Encoding Detected(二重エンコードの誤認)

しかも、よく見るとCookieだけでなく、URLの引数(ARGS)でも発生している。

ここで私は、「1つ1つ除外設定を書いていたら、いつまでもアプリがまともに動かない」という現実に直面した。

4. 決戦:ログから読み解く「真犯人」

WAFのログに記録された detail_message_s をデコードして、じっくり眺めてみた。

そこには、攻撃コードではなく、ただの「日付データ」や「パスワードの記号」があった。

今回の学び(技術的な急所)

1. 多重エンコードの正体: URLの中にURLを入れる(ReturnUrl)際、記号が %252F のように多重変換される。これはモダンなWebフレームワークの「標準仕様」であって攻撃ではない。

2. パスワードの宿命: 強力なパスワードには記号が必須。これをWAFのSQLIルールで検査すること自体が、実はアンチパターン。

5. 解決策:多層防御の再設計

「WAFの設定をいじり続ける」のをやめ、「どこをWAFに任せ、どこをアプリに任せるか」の役割分担を見直した。

• WAF側: パスワードやReturnUrlなど、正規の処理で記号が入り混じる箇所は、勇気を持って「検査除外」または「特定ルールの無効化」を行う。

• アプリ側: ASP.NET Core Identityを正しく使い、「パラメータ化クエリ(静的プレースホルダ)」と「アカウントロック機能」を有効にする。

6. おわりに:本当のセキュリティとは

WAFは「魔法の杖」ではなかった。

ただボタンをポチポチして「最強」に設定するのではなく、「自分のアプリがどういうURLを吐き出し、どういうCookieを使うのか」を理解して、初めて正しく運用できる。

「いたちごっこ」を終わらせたのは、WAFの知識ではなく、自作したASP.NET Coreのソースコードの中にあった一行のエビデンスだった。


2026年1月25日日曜日

【Azure】 ASP.NETアプリを公開したら、正常な通信がブロックされまくった話(解決編)




Azureを勉強して、ASP.NETでWebアプリを作ってみました。
Application Gateway(WAF)も立てて、セキュリティは万全!……のはずが、いざ公開してみると、自分や友人のログインが突然ブロックされるという謎の現象に遭遇しました。
今回は、初心者がハマりがちな「WAF運用いたちごっこ」の正体と、スマートな解決策を共有します。

1. 犯人は「ランダムすぎるCookie」

ASP.NET(特にCore)には、セキュリティを守るための仕組みが標準で備わっています。
その代表格が、以下のようなCookieやトークンです。
• .AspNetCore.Mvc.CookieTempDataProvider
• .AspNetCore.Antiforgery
これらの中身は、セキュリティのために「推測不可能なランダム文字列」になっています。
ところが、このランダムな文字列の中に、たまたまSQLインジェクション攻撃に似たパターン(-- など)が紛れ込んでしまうことがあるのです。

2. 初心者が陥る「ID除外の罠」

WAFのログ(Log Analytics)を見ると、「ルールID: 942440 でブロック」と出ます。
そこで「よし、この 942440 を許可リストに入れよう!」と設定するのが、最初の落とし穴です。
実は、Cookieの中身は毎回変わるため、「昨日は 942440 だったけど、今日は 942441 でブロックされる」という現象が起きます。これが「いたちごっこ」の始まりです。

3. 正解は「変数のグローバル除外」

特定のルール番号を許可するのではなく、「この名前のCookieについては、WAFの全検査をスキップしていいよ」という設定をするのが正解です。
設定のコツ(Azureポータル)
WAFポリシーの「管理ルール」→「除外」設定で、以下のように登録します。
• 一致変数: 要求のCookieの名前
• セレクター: .AspNetCore.Mvc.CookieTempDataProvider
• ルールセット: ここを特定のIDにせず、全体(Global)にするのがポイント!
これで、どんなランダムな値が入ってきても、WAFが「あ、このCookieは安全な枠組みのやつだね」とスルーしてくれるようになります。

4. もっと安心するために:Azure Advisorを活用しよう

「除外設定を増やすとセキュリティが弱くならない?」と不安になるかもしれません。
そんな時は、Azure Advisor や Microsoft Defender for Cloud の「セキュリティ態勢」をチェックしましょう。
「基盤となる CSPM(無料版)」を有効にするだけで、Azureが「他にも設定ミス(暗号化漏れなど)はない?」と自動で診断してくれます。今回のWAF設定だけでなく、サイト全体の健康診断をセットで行うのが、モダンなクラウド運用のコツです。

最後に

WAFは「ただ置くだけ」では、時に味方を攻撃してしまうことがあります。
「いたちごっこ」に疲れたら、ぜひ除外設定の「範囲(スコープ)」を見直してみてください。
「ログを見て、原因を突き止め、ベストプラクティスを適用する」。この流れを一度経験すると、クラウドのセキュリティがぐっと身近に感じられるようになりますよ!  

【おまけ】WAFのブロック理由を特定するKQLクエリ

Azure WAFが「何を」「どのルールで」ブロックしたのかを調べるためのクエリです。
Azure Portalの Log Analytics で実行してください。

1. 直近のブロック履歴を一覧表示する

まずは「何が起きているか」の全体像を把握するクエリです。

// WAFのブロックログを新しい順に100件表示
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" 
| where Category == "ApplicationGatewayFirewallLog"
| where action_s == "Blocked"
| project TimeGenerated, clientIp_s, requestUri_s, ruleId_s, Message, details_data_s
| order by TimeGenerated desc
| take 100


2. 特定のCookieが原因でブロックされているか特定する

今回の「犯人(Cookie)」を追い詰めるためのクエリです。

// 特定のCookie名が含まれるブロックログを抽出
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" 
| where Category == "ApplicationGatewayFirewallLog"
| where action_s == "Blocked"
// ↓ここに調べたいCookie名(.AspNetCore.Mvc.CookieTempDataProviderなど)を入れます
| where details_data_s contains "CookieTempDataProvider" 
| project TimeGenerated, clientIp_s, ruleId_s, details_data_s, details_message_s
| order by TimeGenerated desc

3. どのルールIDによく引っかかっているか集計する

「いたちごっこ」が起きていることを証明するためのクエリです。

// ブロックされたルールIDのランキングを表示
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" 
| where Category == "ApplicationGatewayFirewallLog"
| where action_s == "Blocked"
| summarize Count = count() by ruleId_s, Message
| order by Count desc


ワンポイントチェック
ruleId_s: どのルールに触れたかがわかります。

details_data_s: Cookieやリクエストの中身の「どの文字列」がダメだったのか、具体的な中身が表示されます。ここを見て Password=... ではなく、ランダムな英数字の羅列であれば、誤検知の可能性大です!