サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Appleイベント
zenn.dev/koduki
はじめに 最近書いてるソフトウェア設計シリーズです。今回は例外に関して。以前、以下のような記事を書いたのですが、もう少し深堀して書いてみました。 ちなみにソフトウェア設計シリーズは他には以下を書いています。 モジュールになぜ分けるのか? モジュール、依存、そしてカプセル化 モジュールをどう分割するのか? 簡潔さは力なり? 予測可能な振る舞いと簡潔さについて ドキュメントとしてのコメント TL;DR 例外は「原則」キャッチしない 業務例外や必ずハンドリングさせたい例外はOptionalなど戻り値の方が便利 だいたい以下の図が言いたい事のすべて 例外処理とは? 「例外処理(Exception Handling)」は言語に依らず普遍的な関心事です。端的に言えば例外処理は異常やシステムの動作に不備が発生した際の特別な分岐処理です。リカバリやリソースの解放、あるいはユーザへの通知などがありますね。
はじめに 前回に引き続き、ソフトウェア設計に関しての自分の考え方を整理していきたいと思います。今回は前回のモジュールの話の後続として、依存(=モジュール結合度)の話です。 モジュールの依存と種類 コードの複雑さをもたらすものの一つが、モジュールへの依存です。依存とはモジュールAとモジュールBの関係性のことです。あるモジュールのインタフェースに依存が多ければ多いほど、複雑性が高いと言えます。また、前回と同様にここでいうモジュールとは言語機能ではなく、関数/クラス/サービスなどの何等かの機能の塊です。様々な依存が考えられますが代表的なものは以下となります。 外部モジュールへの依存(メッセージ/データ結合) 構造体など入出力I/Fへの依存(スタンプ結合) グローバルな値への依存(共通結合) データフォーマットへの依存(外部結合) 実行順の依存 トランザクション境界の依存 基本的には古典的な結合度
はじめに 前々回や、前回に引き続き、ソフトウェア設計の指針に関する話をしたいと思います。 関数やクラス、そしてサービスなどシステムの塊の単位をモジュールと呼び、モジュールを作る事で、認知負荷を下げ複雑性と戦うという話をしてきました。では、モジュールは「いつ」分割するのが良いでしょうか? また、他にも共通モジュールを不用意に作ってしまって苦労した人も多いのでは無いでしょうか? 今回はそのあたりの話をしていきます。 TL;DR 以下があればモジュール設計を見直す 単純な要件/普段の利用に対して、タイプ量や約束事が多い 共通モジュールが「使われ方」に依存する モジュールの役割を一言で説明できない コード管理や性能/データ整合性など利用に際してのペナルティが高い 分割 is NOT 正義 - FizzBuzz Enterprise Edition 複雑性を排除するためにモジュール分割をすることは重
はじめに 最近、APoSD(A Philosophy of Software Design)を読んで、ソフトウェア設計に関して色々思う事が出来たというか、整理してみたくなったので、記事にまとめてみました。なお、APoSDの言葉を多用はしていますが解説記事という分けでは無く、自分の考え方の言語化にしっくり来たので使わせてもらってるという感じです。 TL;DR モジュールとは関数/クラス/サービスなどの何等かの機能のまとまり 良いモジュールは複雑性を隠蔽する 複雑性を隠蔽しないモジュールの価値は低い モジュールとは? プログラムは正しく動くことがまず何より大事ですが、その次というかほぼ同じくらい大事な事が読みやすく拡張しやすいことですよね? コードは圧倒的に読みものなので、どう読みやすく、つまり理解しやすい状態にしておくかは重要な事です。APoSDでは複雑性が低いコード、という言い方をしていま
はじめに ChatGPTの肝になる機能の一つが Function Calling です。これはLLMで質問の内容を解析して、必要な関数を呼び出すというものです。 「必要な関数」 をどのように判定しているかといえば、それは関数の説明文から判断します。今までもキーワードに応じて何かの処理をするようなプログラムは良くあったと思いますが、LLMの強力な言語処理能力を使うことで 「呼び出すべき関数」 と 「適切な引数」 を自動的に判定してくれます。SiriやAlexaみたいなツールが簡単に作れちゃいます。 今回はそのFunction callingをLangChain経由で使って天気予報APIをAITuberの「紅月れん」から呼べるようにしたので、その試行錯誤等を載せておきたいと思います。 なお、AITuber自体の作り方やLLMに関する全般的な話は下記の記事で取り扱っていますので、良ければ読んでみ
はじめに パスワードは古来より認証に良く使われる方法ですが、その運用の難しさからセキュリティの懸念とその対策としての運用の複雑さ(複雑で長い文字列、90日でパスワード変更など)が要求される大きく問題をもった仕組みです。 その根本的な解決策としてFIDO Allianceを中心に推進されている 「パスワードレス」 が注目されています。これはPINや生体認証とデバイス認証を使ったMFAからなっており、フィッシングやパスワード流出に強い上に、ユーザも複雑なパスワードを覚えなくて良い、という大きなメリットがあります。最近はこの流れでPassKeyというものが登場し、Apple/MS/Googleのプラットフォーマが対応したことで、本格運用に乗せれるフェーズになってきました。というわけで以下に解説動画を作ったのですが、動画中で時間の都合で触れきれなかったところや、JavaScriptによる実装のサン
はじめに あけましておめでとうございます。去年は何といってもAIの年でした。ChatGPTやStableDiffusionが2022年末に登場してから、想像を超えてAI周りが進化しましたね。今回は年の初めという事もあり、前から興味のあったAITuberを作ってみる事にしました。 「AITuberを作ってみたら生成AIプログラミングがよくわかった件」 って本も買ったし。LLM部分だけでは無く、OBSやYouTubeのコメント取得などAITuberに必要な内容が一式揃っていて非常に参考になりました。 また、私はプログラミングは多少できますが、イラストや音楽に関しては全くスキルの無い人間です。そのためそのあたりに関してはStable DiffusionやSunoAIの力を借りて作っているので、結果的にオール生成AIという感じですね。そのあたりも含めて記事にまとめたいと思います。 TL;DR 素の
はじめに 最近、若手のコードレビューをしていて例外の使い方を教える機会があったので、ブログの方にもまとめたいと思います。今回はバッチ編。オンラインだとまた少し違う観点があると思います。また、言語はJavaを前提していますが考え方は例外機構をもつ言語ならあまり変わりません。 TL;DR 例外は原則キャッチしない。バッチは速やかに殺せ 個別箇所でログを出さずに必要な業務情報はExceptionを入れ子にして乗せる 長いバッチのためにはスキップもやむなし 原則、例外はキャッチしない JavaにはErrorとExceptionが存在し、OutOfMemoryErrorとかプログラム上ではどうしようもないものがエラー、ファイルが存在しない(FileNotFoundException)とかプログラム側でハンドリングするもの、と教科書では習うと思います。なのでException系はキャッチするものと、と
はじめに TerraformやVaultを開発するHashiCorpは自社製品をOSSのMPL(Mozilla Public License v2.0) から、ソースコードは公開するも一部の利用に制限があるBSL(Business Source License) への変更をアナウンスしました。 これは2018年のRedisを皮切りにMongoDBやCockroachDB、ElasticSearchなど多くのプロダクトで進められている脱OSSの流れです。商用のオープンソース[1]と言われてしまうこともある最近のこの動きの理由は何故なのか? という点を以下の動画で解説しました。 動画中では尺の都合で端折った個所も多いので、こちらの記事の方にもまとめておきたいと思います。 OSSとは? OSSの定義 まず、OSS(オープンソース)とはなんでしょうか? これはRMSのフリーソフトウェアを源流とする
はじめに 先日、下記のようなツイートを見つけて、そういえば趣味で個人開発してたときには然程気にしてなかったけど、仕事で運用するようになって先輩たちから学んだり自分で身につけたチップスってちょこちょこあるよねー、とふと思ったので、Webアプリケーション開発に関わるものをいくつかまとめてみました。 特に体系的/網羅的という程でもないですし、最近はFWや色々な仕組みでカバーされてるものも多いですが備忘録として。 Tips 機械が読めるログを作る これは割と重要なのですが、ログは人間が読むものではなく機械が読むものです。それはZabbixだったりDatadogだったりSplunkだったりgrep/awkだったりツールは何でも良いのですが、古の時代はさておき現代ではログは機械が読めることが最重要です。 まず大前提として構造化されている必要があります。言うまでもないですが「フリーフォーマット」のログの
本記事はGCP(Google Cloud Platform) Advent Calendar 2022 2日目の記事です。 3日目: k8s × IAP @po3rin さん です。 TL;DR Edge Security PolicieでバックエンドバケットにもIP制限が可能に ただしGCSが公開状態だとそちらのURLにアクセスは出来てしまう 署名付きURLでプライベートなGCSでCLBからのアクセスが可能だが課題は残る はじめに クラウドを使っていても、社内向けシステムやテスト環境はインターネット上に公開したくないので、IP制限を掛けたいケースは良くありますよね? GCPの場合、いくつか方法はありますがWebシステムの場合はCloud Load Balancing (CLB)とCloud Armorを組合わせてやるのが一般的だと思います。GCEに置いたシステムだろうとGKEだろうとCl
はじめに WASMをブラウザの外で動かすトレンドに関して「Linuxコンテナの「次」としてのWebAssemblyの解説」というタイトルで動画を投稿したのですが、動画では話しきれなかった内容をこちらの記事で補完したいと思います。 2022年もWebAssembly(WASM)の話題が多く発表されましたが、そのひとつにDocker for DesktopのWASM対応があります。FastlyやCloudflareもエッジ環境でWASMを動かすソリューションを持っていますし、MSのAKS(Azure Kubernetes Service)でもWASMにpreview対応しています。WASM Buildersでも2023年のWASMの予想としてWASMのアプリケーションランタイム利用に関して言及されました。 WASMといえば元々ブラウザ上で高速にC++のコードなどを実行するところから始まっている
はじめに Ruby 3.2よりWASIベースのWebAssemblyサポートされました。 これによってRubyをブラウザ上で実行できるようになるわけですが、実はWASMはブラウザの外での動作も可能になっており、OSに依存しないライブラリを作ったり、Edge Computingで実行させたり、シングルバイナリの実行可能ファイルにしたりと色々な事が出来るようになります。 今回はRubyのWASM対応でどんなことが出来るようになったかをまとめたいと思います。 WebAssemblyとは? WASMに関して少しおさらいをしておきましょう。 WebAssemblyは仮想命令セットアーキテクチャです。WASMとも言います。RustやCをはじめとした多くの言語からコンパイルする事が出来、Webブラウザの中で高速にそしてセキュアに処理を実行するための仕組みとして登場しました。 元々ブラウザ向けに登場した仕
はじめに 私はGCPのCloud Runがお気に入りのサーバレス環境なのですが、一番得意な言語であるJavaを使った場合のスピンアップタイムの悪さには頭を悩ませています。 ローカルでは1,2秒で起動する場合でも、何故かCloud Runに持って行くと他の言語と比べても劇的に遅くなるのですよね... GraalVMのネイティブイメージを使えばGoなどと遜色無く瞬時に起動するのですが、ネイティブイメージへの変換は癖も強いため通常のJVMでも改善できないかとチューニングを試してみました。 TL;DR 最終的に60%程起動速度を改善 9秒台が3秒台になっているので体感としては結構変わる native-imageが使え無いケースでもこのくらいなら許容出来そう もちろん完全停止状態以外のレスポンスは3秒とか言わずミリ秒オーダー 準備と基礎値の計測 まずはアプリケーションを準備する必要があります。今回は
はじめに 開発をしてると画像や生成されたHTMLなどをローカルのHTTPサーバにホスティングしたり、フロントエンド書いてて取り合えずモックのAPIサーバを立ち上げたいときは良くあります。 そのたびにいつも「ワンライナー HTTPサーバ」でGoogle先生に聞いたり、自分のコマンド履歴から探してるんですがめんどくなってスクリプト書いたのでメモに残しておきます。そのうち作ったこと自体忘れると思うので。。。 httpd4test Rubyベースの簡易Webサーバ。WEBrickのラッパー カレントディレクトリのWebホスティングをサポート API用にEcho Serverをサポート (CROS対応済み) DockerがあればRubyは無くても動作 インストール 内部でDockerを利用しているので、事前にDockerが動作する事は確認。 $ sudo sh -c 'curl https://ra
はじめに 先日、JakartaOne Live Japan 2022というイベントで登壇させていただく機会を頂きました。 QuarkusやHelidonのような新しめのEEフレームワークがこれまでのPayaraやWebLogicとどう違うのか? CloudRunのようなサーバレス環境でMicroProfileのどの機能が効果的に働くのか? という点を最近のWeb開発周りのトレンドと絡めながら話ました。上記のようにアーカイブ動画も公開されていますが、せっかくなのでQuarkusがサーバレス環境で実行に最適化されるまでの周辺事情等をまとめたいと思います。Javaだけに留まらず最近の環境事情の整理にも役立つかと思います。 TL;DR Quarkus/Helidonは軽量で高速な新しいEEフレームワーク コンテナや、サーバレス、クラウドネイティブなど最新のトレンドに基づいた設計 GCPのCloud
たまに使うけど、だいたい忘れてるのでメモ。 とりあえずシンプルに とりあえずこんな感じ。それにしてもInputStreamをStringにするのは昔に比べて随分らくになったよなー. public static void main(String[] args) throws Exception { var result = execCommand("ls", "-l"); System.out.print(result.get("stdout")); System.err.print(result.get("stderr")); System.out.println("status: " + result.get("status")); } Map<String, String> execCommand(String... cmds) throws IOException, Interrup
はじめに Javaの開発環境としてはNetBeansを良く利用していたのですが、最近はVSCodeのdevcontainerが非常に便利なので良く利用しています。今回、Quakus + Firestore向けの開発環境をdevcontainerで構築したので備忘を兼ねて残しておきます。 TL;DR devcointer + docker-composeで開発環境をポータブルに Docker in Dockerの代わりにPodman in Dockerをすると簡単 GOOGLE_APPLICATION_CREDENTIALSの偽装を忘れずに VSCode Dev Containerとは? Dev ContainerはWSLやSSH、VS Code ServerなどのVS Code Remote Developmentファミリの一つです。 Dockerコンテナに開発環境を入れそこに接続する事で
はじめに 夏休みというと自由研究の季節ですが、プログラミング言語を自作してみるのも面白いか、と思い以下の動画を作ってみました。 私自身も十年ぶりくらいにプログラミング言語を実装してみて、だいぶ忘れていて部分もあったので整理を兼ねてサマリを記事にしておこうと思います。 なお、コードは以下にコミットしています。良ければ参考にしてください。 この記事では簡単なプログラミング言語の座学的な所から始めて、FizzBuzzやフィボナッチ数列を実行できるような言語にまで育てていきます。 プログラミング言語と処理系 まずは基本的なプログラミング言語に関わる概念をおさらいをします。動画では第一回、第四回の一部でも解説をしています。 高級言語と低級言語 プログラミング言語は英語や日本語のような自然言語とは異なり、誰かがコンピュータの振る舞いを記述するために作り出した人工言語です。大きく分けて高級言語と低級言語
はじめに 普段、個人でWebアプリを書くときにはこだわりが無いのでBootstrapを使っていました。ただ他にもっとシンプルなの無いかなぁ、と探してたらWater.cssというclasslessなCSSフレームワークを見つけました。 HTMLタグに直接装飾がマッピングされているので、それっぽいデザインが簡単に出来ます。ダークモードが中々良いですね。 ただBootstrapのようにグリッド機能が無さそうなので、レイアウトがちょっとめんどそうだな。。。と思いつつも今回は簡単なUIだから久しぶりにfloatとか手書きすることに。そして記憶の彼方にいったやり方を調べてたらCSS Grid Layoutという機能が標準搭載されてる事を今更知りました。中々便利そう&私のようにBootstrap + JQuery時代で止まってる人も居るかもしれないので、簡単に紹介しておこうと思います。 TL;DR CS
はじめに ITニュースの方でも話しましたが、ここ数日、例の本でWeb3がとても話題ですね。まあ、炎上なので良い事では無いのですが、せっかくなのでその根幹技術らしいブロックチェーン周りの自分の理解を整理してみることにしました。とりあえず、簡易なブロックチェーンを作ってNFTやスマートコントラクトについても少し考えていきたいと思います。 なお、ネタでは無く詳しくない分野なので勘違いとかあると指摘してもらえると嬉しいです。 注意 あくまで私の理解のアウトプットなので実際の挙動や仕様とは異なる可能性があります 実践的で本格的な仕様や実装ではなく、あくまで基本的な理解のためのサブセットの作成 データの自由化!とかそういう話はしません ブロックチェーンを作ろう! ハッシュ値による改ざんの困難性 そもそもブロックチェーンとは何でしょうか? 一般には改ざんに強いP2Pな台帳という理解かな、と思います。暗号
はじめに 初期化処理が重いインスタンスってありますよね。代表的な例だとJDBCコネクションとか。Factoryパターンで初期化を隠蔽するような奴は概ね重いのはどの言語でも一緒だと思います。 こういった重い処理を例えばループなどで大量に初期化してしまうのはかなりのコストになってしまい、特にバッチのようなチリツモな処理では無視できないほど実行時間に影響を与えてしまう恐れがあります。 そういった場合はSingletonなどを使ってインスタンスの生成コストを隠蔽しますが、マルチスレッド環境下だと影響が出る場合もあります。以前、そういうケースでバグってるのに出くわした事があるので、記憶の整理がてらまとめておこうと思います。 コード例はJavaですが、あまりJavaかどうかには依存しない考え方になっていると思うので、他の言語が得意な人は疑似コード程度に思っておいてください。 なお、JDBCを始めとした
はじめに 分析のために昨年対比や昨月対比を求めたい事は結構あります。「去年に比べて〇×がどのくらい削減されています」とか「毎月△□ずつ伸びています」とかですね。ありふれた用途ですがトランザクションテーブルのように追記しかされないとか、そもそも分析しやすいテーブルならなんら問題ないのですが、それが更新主体のマスタテーブルだったら? 例えば、サーバ管理台帳からサーバ台数の増減を調べようとしたり、顧客マスタから有料会員の増減を調べようとしたり... DWHに既存のテーブルを突っ込んで 「さあ分析するぞ!」となって困るやつですね。元々の業務テーブルは分析の為では無く業務自体のために作られてるので仕方がない。 ここ最近、たまたま同じような質問を受けたので、ぱっと思いつた内容を整理を兼ねて書いて置きたいと思います。「もっと、こういうやり方が良いよ!」 というコメントなり指摘は大歓迎です。 TL;DR
はじめに こちらの動画でも紹介したのですが、春は新人エンジニアの季節。そして去年や一昨年前の新人たちが2年目から3年目になる季節です。というわけで、そんな彼らが初級者から中級者になるためにオススメの本を紹介したいと思います。 この記事では動画の内容に加えて「どんな本を何故紹介するのか?」という観点も合わせて加筆しています。 ラインナップ 紹介する本は以下のラインナップです。超有名本を含めて 「アーキテクチャ」 「運用」 「コーディング」 「インフラ」 「データベース」 とWebアプリケーションエンジニア必須の6カテゴリから1つずつ選出してみました。 UNIXという考え方―その設計思想と哲学 ITIL はじめの一歩 スッキリわかるITILの基本と業務改善のしくみ リーダブルコード ―― より良いコードを書くためのシンプルで実践的なテクニック レガシーコード改善ガイド Webエンジニアが知って
はじめに Nuxt.js + TypeScriptを今試し中なのだけど、TypeScriptでのイベントの取り扱いが面倒なので、とりあえずStructural Subtypingを適用してみました。 今のところ問題なさそうなんだけど、軽く探して見た限りだとあまり類似のアプローチ無いし悪手なのかな? てか、FWとか一般的なライブラリで対応してるけど見つけれてないだけの気がしてならない。。。 TL;DR Event型を取り扱うときはtargetの型が不明なのでコンパイルエラーになる事がある event: { target: HTMLButtonElement }型を指定するのが一番手っ取り早い 求む、もっと手軽な対応方法 TypeScriptでのEvent型の取り扱いの罠 クリックイベントが発生したHTMLのノードに対して作業したい事は良くあるかと思います。 例えば下記のように 「クリックした
自称Webプログラマ。Youtube (https://www.youtube.com/@koduki)とかもやってます。BlueSky始めました。https://bsky.app/profile/koduki.nklab.dev
はじめに 富士通がついに2030年にメインフレーム市場から撤退し、66年の歴史に幕を閉じるという話が出てきました。 富士通といえば国産大型コンピュータの先駆けであり、IBM互換機を作って巨人IBMに食らいついたベンダーでもあります。そんなわけで中々に歴史の転換点を感じる話題ではあるのですが 「ところでメインフレームって何? 」 という方も多いでしょう。という分けで名前は聞いたことがるけど実態が良く知らない「メインフレーム」 に関して少しだけ解説をする動画を作りました。 この記事は動画では話しきれなかった事も含めて、もう少し深堀した解説をしていきたいと思います。ちょっと長くなりましたが、前半が歴史の話で後半がアーキテクチャの話になるので好きな所にジャンプして読んでみてください。 メインフレーム? 汎用機? ホスト? メインフレームは他にも汎用機とかホスト機と呼ばれることもありますよね。Wik
こちらはJava Advent Calendar 2021の11日目です。 はじめに 「Apache Log4j」ライブラリに致命的なリモートコード実行の脆弱性が発見され現在絶賛対応中の方もいらっしゃるかと思います。 ここで重要になってくるのが影響調査には自分たちの改修しているコード本体だけではなく、OSSの依存ライブラリも含まれることです。log4j2は超広範囲に利用されていますから、逆にJavaのコードは潜在的に対象、くら言ってしまっても良いですが、もう少しマイナーなライブラリだとそもそも対象となるコードを探すのが大変です。pom.xmlをgrepしただけでは見つけれないですから。 この手の依存性チェックをするツールはありそうだと思ってたけど、特に今まで使った事はなかったので今回はMavenプラグインのOWASP Dependency-Checkを試してみました。 今回サンプルに利用舌
この記事はterraform Advent Calendar 2021の8日目です TL;DR 「エンタープライズ企業のベスト プラクティス」等にマッチしたTerraform環境の作成 CloudBuildとGitHubを使いGitOps/継続的デプロイ(CI/CD)を実現 Stateを分けるためにプロジェクトは環境単位に グループや権限のアサインなどプロジェクト管理作業がTerraformにより大幅に効率化 はじめに GCPでIaCと言うと、GCPネイティブのCloud Deployment Managerがあります。ただ、少し触った限りでは情報量が少ないのとYAML, Python, Jinjaが混在していて記述の揺れが多そうな印象を個人的に受けました。と言う分けで、こういう時はマスに乗るべきとTerraformを利用することにしたのですが、AWS等に比べると情報がやはり少ないです。そ
次のページ
このページを最初にブックマークしてみませんか?
『kodukiさんの記事一覧』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く