Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Software Development

匿名加工情報の作成に使う鍵つきハッシュの鍵をPBKDF2で生成する

個人情報を含むデータをもとにプログラムのテストデータを作成する場合などには、データの匿名化が必要になります。個人情報保護委員会「個人情報の保護に関する法律についてのガイドライン(匿名加工情報編)」*1には、管理用IDなど特定の個人の識別に使え…

ファイルをAESで暗号化したときに送信先とnonceを共有する方法

AESをECBモードで使っていたり、IVとして固定値を使っていたりするケースがやたら見られるので、 あるファイルをAESで暗号化し、ローカルマシンのストレージ上に保存しておく 暗号化したファイルをリモートマシンへFTP等で送付し、リモートマシンのストレー…

非機能要件の安全率の事例収集

非機能要件の安全率として「どのくらいの安全率なら適切か」という値はありません *1 (研究もないように思います)。IPA 非機能要求グレード *2 の「04_項目一覧.pdf」では、性能目標値の「余裕率」として、1倍・1.2倍・1.5倍・2倍・3倍・10倍以上から選択…

リテラルと定数とEnumとOTLTとResourceと……の使いわけ

プログラム中で変更可能なパラメータ(メッセージ、設定値、エラーコードなど)は、その記述方法を工夫することで、ソースコードの可読性やアプリケーション保守の容易性を向上させることができます。 一方で、大規模なチームでアプリケーション開発を行う場…

What is the difference of RFC 5322, RFC 821 and implementations of javax.mail.internet.InternetAddress ?

Test for RFC 5322: https://gist.github.com/satob/0dc003aefe020d5f1e9263bd7e173f9f (with regexp in http://www.din.or.jp/~ohzaki/mail_regex.htm#RFC) Test for RFC 821: https://gist.github.com/satob/8c5a42cf636732d81b850b58e8808eef (with regex…

メールアドレスのバリデーション方法

じゃぁメールアドレスのバリデーションってどうやったらいいのさ、という話。 satob.hatenablog.com もちろんバリデーションをした後には、メールアドレスの実在性確認のために実際にメールを送信します*1。その前段の、 「じゃぁどんなメールアドレスだった…

What does "the syntax of RFC822" means in javax.mail.internet.InternetAddress ?

Javadoc of JavaMail API says InternetAddress class uses "the syntax of RFC822". https://javaee.github.io/javamail/docs/api/javax/mail/internet/InternetAddress.html Then how about actual implementation? Is it different from some other email…

研究開発費で試作したソフトウェアの滅却のコーナーケース

日本では会計上のルールとして、研究開発費で作成した試作品は、その研究開発が終了した段階で滅却する必要があるわけです。滅却せずに済ませたいなら、作成にかかった費用を費用として計上せずに資産化する必要があります。あるいは、試作品は一度滅却した…

日本政府提供のサポート終了等技術リスト

政府CIOポータルでは、日本の官公庁・地方自治体向け情報システムを開発する際に参照すべき標準ガイドライン群を公開しています。 その中に「政府情報システムにおけるサポート終了等技術への対応に関する技術レポート」という資料が公開されていて、別添資…

GDPRを遵守するためにアプリケーションに必要となる機能

請負開発したシステムでEU域内の個人データを扱う場合、GDPRの遵守は納入先となる顧客が負うことになるわけだけれど、とはいえGDPRに対応するための機能が入ってないと問題になることは見えているので、提案書の段階で必要な機能は機能要件に織り込んでおく…

ID生成方法の評価観点(主にエンタープライズアプリケーションの視点から)

発端 https://www.asahi.com/articles/ASN5N5VR4N5NULFA01F.htmlwww.asahi.com こんな話がありました。 アプリの開発者に対して「こうやってIDを採番したら、処理が競合したときにIDが重複しますよ」という説明をしたときに、「そんなことが起こる確率は低い…

RDBMSに対する考えかた(レコード内での整合性)

一般的なエンタープライズアプリケーションアーキテクチャの考えかたでは、 RDBMSの1レコードはそのまま現実世界の状態をモデル化したもの 画面に表示されているデータの内容と、DB上のデータとは整合しているべき レコードを更新するということは(たとえ部…

エンタープライズアプリケーションの開発ドキュメント作成で気をつけていること

エンタープライズアプリケーション*1を開発するときに、開発方針(従うべきアプリケーションアーキテクチャの説明から、ライブラリ的なプログラムの使い方までいろいろ)を文書化する役目がよく回ってきます。 「このライブラリにはどういう機能があるの?」…

Parasoft Jtest can't ignore Lombok-generated methods/fields

Problem: When you execute static analysis Java sources with Lombok by using Parasoft Jtest, you have to delombok the sources because of Jtest can't handle Lombok's compile-time generated methods/fields. Additionally, Jtest raise alerts wit…

「プログラミングできるのが普通の若者たち」のレベル感

UR都市機構 Open Smart URのコンセプトブック「UR 2030」*1では、「プログラミングできるのが普通の若者たち」という2030年の若者像を示しています。 では、この「若者たち」とは、具体的にどういう人たちから構成されるのでしょうか? SSP*22030(階層と社…

オブジェクトの変換にコンストラクタを使ったときの問題

背景 MyBatisのSqlSession#selectOne()で、クラスAのオブジェクトaを取得している。SELECTの結果が0件だった場合はnullが返る。 オブジェクトaを、別のクラスBのオブジェクトbへ変換したい。 問題となる設計 クラスBのコンストラクタが、引数にクラスAのオブ…

mvn command results in error in Windows

You will get error when you run following Maven command from Windows PowerShell: PS C:\workspace> mvn -B archetype:generate -DgroupId=com.example -DartifactId=hajiboot -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quicksta…

Gotchas in Eclipse JET (JET2)

No uniq() There are no XPath functions to uniq the result of XPath (e.g. text element). If you want to uniq something, you have to implement control break with <c:iterate> like: <c:setVariable select="''" var="control" /> <c:iterate select="XPath to list text elements" var="item" > </c:iterate></c:setvariable></c:iterate>

ソフトウェア考古学論考 (2)

どっちかもいうとこっちが本題。 さて、ソフトウェア考古学の目的としては、 レガシーシステムの保守開発の効率化 システムの仕様理解の補助 の他にも、poorly-documentedなレガシーシステムのソースコードから、その仕様(あるいは意図)を読み解き復元し、…

ソフトウェア考古学論考 (1)

ソフトウェア考古学(Software Archaeology)という考え方は、OOPSLA 2001で提唱されたのが始まりのようです *1。 Wikipediaにある通り *2 、poorly-documentedなレガシーシステムのソースコードやドキュメントをどう読み解くか?というところから始まったよ…

java.text.BreakIteratorによる文字数(grapheme)カウント

JIS X 0213など、シフトJISやマイクロソフト コードページ932以外の文字を業務プログラムで扱う場合には、入力された文字列を証明書などに確実に収めるため、文字数を正しくカウントする必要があります。 JIS X 0213では複数のコードポイントで1文字を表す文…

MyBatisの機能でできないこと

SQL Mapperのコードカバレージを取るツールは(少なくとも公式には)存在しない。 SQL Builderにはシングルクオーテーションなどの文字をエスケープする機能はない。 SQL BuilderはSQL文の一部だけ(WHERE句だけ、など)を作成することはできない。 これが合…

公共分野のシステム開発調達における上下分離のメリット

日本の公共分野におけるシステム開発の調達では、ときどき「上下分離」による調達が行われることがあります。ひとつのシステム開発を、業務設計 or アーキテクチャ設計くらいまでの上流工程と、コーティングを含む詳細設計~テストまでの下流工程に分けて調…

平均的プログラマ以前のメンバーにどう対処していけばよいか? (1/2)

note.mu 非常によい知見というか、経験談の集まりで、共感するところも多く、興味深く読んだ。大学のプログラミング実習の話のようだけど、企業においても、新卒採用で情報系以外の学科から採用をしている場合、状況はあまり変わらない。 以下、上記記事から…

平均的プログラマ以前向けのスキル標準の提案

「Java経験年数〇年以上のプログラマ募集」みたいなフレーズ、よく聞きますよね。で、そのフレーズで実際に人を募集してみて、来た人って期待どおりでしたか? プロジェクトの体制構築、特にトラブル発生時の体制強化に必要な人材を集める場合、求めるスキル…

非手続き型言語における機械的計測可能で客観的なテスト充分性の指標

プログラムをテストするときに、テストの充分性を示す指標として、C0とかC1とかのカバレッジ(コードカバレッジ)がよく使われます。 C0やC1は、実行されたことがない順次処理や、分岐したことがない分岐処理が、プログラム中に残っていないか計測するための…

Pause before HTTP redirect (302) and get redirection URI with Chrome developer tools

Context When you try to attack to OAuth2 Authorization Code Flow with CSRF (See RFC 6749 "10.12. Cross-Site Request Forgery"), you have to pause before redirect in order to get redirection URI, because the redirection URI is unique and wil…

What can you do with account lockout and its unlock

Purpose of account lockout These are some purpose for account lockout, such as: Detect login attempts 1 Example: Logging 2 Slow down login attempts Example: Duration-based lockout, scrypt, Argon2 Interrupt login attempts Example: Requires …

OSSの資産計上

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

A List of What Cannot JCache do

JCache cannot save the order of insertion. You should use LinkedHashMap for that purposes. JCache cannot update whole entries in a cache atomically. You should use AtomicReference or some locking mechanisms for that purpose. (Ofcourse you …