投稿

ラベル(技術系)が付いた投稿を表示しています

【書評】[Ivar Jacobson]モダン・ソフトウェアエンジニアリング

イメージ
Amazonリンク モダン・ソフトウェアエンジニアリング 著者について ivar jacobson ご存知UMLとかを策定した一人らしい。きっと有名人なんだろうね。 書評 書籍概要 標準化団体OMGによって規定された、「Essence」というエンジニアリングの共通的なやりかたについて、その詳解を記した書籍です。 以下ざっくり章の構成。 第1章 この業界、現場やプロジェクト次第で身につく能力とかまちまちですよね。 そんなのでいいの? 共通化できるよね! しました!とのこと。 第2章 そもそもプロジェクトやエンジニアリングなんてのは「なにをもって完了とすべきか」→「そのためになにを?」→「どのように?」で考えるべきで、手法を先に当てはめるものではないよね。 「アジャイルだ」「ウォーターフォールだ」ではなく、ユースケースやユーザーストーリーなどからいいとこ取りして、自分たちに最適なやり方でやろうぜ! とのこと。 第3章 そこで、Essenceです。 いろいろなエンジニアリングで必要不可欠な要素を切り出したりまとめたりして、標準化しました! もうウォーターフォールやアジャイルみたいなパッケージ化された手法に頼らず、全てを自分たちに必要な形で採用することができます! 第4章~第7章 というわけで、顧客、ソリューション、活動、という3層だったり、顧客[機会、ステークホルダー]みたいな細分化だったりを詳解するよ。 あとの章 実際にスクラムチームに適用してみよう。もっと大きな会社構造を表現してみよう。など。 Q. 表題のモダンソフトウェアエンジニアリングとは? A. Essenceです(ドヤァ) Essenceは「カーネル」という、エンジニアリングの本質を表すことができます。 それらは以下となります。 アルファ[Alphas] : エンジニアリングに存在する、必要不可欠な要素です。以下で説明します。 アクティビティスペース[Activi...

【書評】[Robert C.Martin]Clean Architecture 達人に学ぶソフトウェアの構造と設計

イメージ
Amazonリンク Clean Architecture 達人に学ぶソフトウェアの構造と設計 著者について Robert C. Martin。通称「アンクル・ボブ」 50年ぐらいはエンジニア業界に携わってきている、おそらく業界での有名人の一人。 日本でも有名な著書がいくつかある。 CleanCode 、 CleanCoder など。 書評 書籍概要 ソフトウェアエンジニアリングに於いて、アーキテクチャをクリーンに設計するということはどういうことか、その概念を明示し、詳解する書籍。 まずはエンジニアリングの歴史やセオリーを読者に示す。 続けてアーキテクチャの説明を行いつつ、クリーンなアーキテクチャについて詳解する。 その後、変更が多い部分を「詳細」として例示する。 最後に、レイヤードアーキテクチャなどとの相違点や、実践方法などをゲスト執筆者を交えて記載している。 表題の「クリーンなアーキテクチャ」とは 中心となるビジネス要素はしっかり固めておいて、それ以外はいつでも変更可能となるようなアーキテクチャの形状のこと。(概念、考え方) 技術話とかになると書評枠から外れてしまうので、具体的なものはクリーンアーキテクチャでググってください。 有用性 最近(2020年ごろ)のプロジェクトではよく採用されている方針・考え方。 設計を行う人は一度は読んでおいたほうがよい。 概念図は有名なドーナツっぽいあれで、なんならあれがすべて。 原則などの考え方はいつでも有用なので、やり方、考え方は押さえておくととてもよい。 本書の読み方 クリーンアーキテクチャについての記述は後半からになっているので、ある程度のエンジニアはそこまで流し読みでも問題ない。 前半はあくまでもチュートリアルとか予習・復習のフェーズ。 第5部からアーキテクチャ論。 更に、第22章からようやく「クリーンアーキテクチャ」。 点数(10点満点) 対象読者 : ソフトウェアエンジニアリングでの設計の価値をわかり...

Java本格入門 Chapter11 スレッドセーフをたしなむ の一部をJavaで実装。

イメージ
Java本格入門 Chapter11 スレッドセーフをたしなむ の 11-2-3(1)異なるクラスのsynchronizedメソッドは、同期しない。を実装。 書籍の簡略コードではいまいち刺さらなかったので。 実装の参照元ネタ こちらのサイト様のコードを写経させていただきました。 abcdefg..... : Javaでsynchronizedの排他制御を試す ファイル一覧 MyMain.java 実装 MyMain.java public class MyMain { public static void main(String[] args) { MyMain aaa = new MyMain(); aaa.test27(); System.out.println("★★★★★"); } // マルチスレッドでのsyncronized範囲確認 private void test27() { final class AAA { public synchronized void func3() throws InterruptedException { System.out.println(Thread.currentThread().getName() + " : ★ start"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " : ★ end"); } public synchronized void func4() throws InterruptedException { System.out.println(Thread.currentThread().getName() + " : ○ start"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " : ○ end"); } } final class BBB ...

Game Programming Patterns の 第8章 ダブルバッファのコメディ部分をTypeScriptで実装

イメージ
Game Programming Patterns の 第8章 ダブルバッファのコメディ部分をTypeScriptで実装 お勉強。 1フレーム(update())ごとにバッファを入れ替える。 ファイル一覧 doubleBuffer.ts 実装 doubleBuffer.ts abstract class Actor { constructor(name: string) { this.name_ = name; this.currentSlapped_ = false; }; abstract update(): void; public swap(): void { this.currentSlapped_ = this.nextSlapped_; this.nextSlapped_ = false; } public slap(): void { this.nextSlapped_ = true }; public getname(): string { return this.name_ } protected wasSlapped(): boolean { return this.currentSlapped_ }; protected name_: string; private currentSlapped_: boolean; private nextSlapped_: boolean; } class Commedian extends Actor { // 顔の向き public face(actor: Actor) { this.facing_ = actor }; public update(): void { // console.log("name,wasSlapped : " + this.name_ + "," + this.wasSlapped()) if (this.wasSlapped()) { // 自分が叩かれてたら、こんどは顔が向いている方向にいる役者を叩く(どんなコメディだよ) this.facing_.slap() ...

HeadFirstデザパタ 第10章 State をC++で実装

イメージ
自分のお勉強用 : HeadFirstデザパタ 第10章 State をC++で適当に実装 おさらい。 とりあえずStateAとBを順繰りに入れ替えるようなやつ。 お手本を真面目に写経するのは冗長なのでパス。 ファイル一覧 State.h : インターフェイス StateA.h と StateA.cpp : 実装 State.h と StateB.cpp : 実装 GumballMachine.h と cpp state_cpp.cpp : メインクラス 実装 State.h : インターフェイス #ifndef STATE_H #define STATE_H class State { public: virtual ~State() {} virtual void methodA() = 0; virtual void methodB() = 0; }; #endif // !STATE_H StateA.h #ifndef STATE_A_H #define STATE_A_H #include "State.h" #include "GumballMachine.h" class StateA : public State { friend class GumballMachine; public: StateA(GumballMachine* gm):gm_(gm) {} virtual void methodA() ; virtual void methodB() ; private: GumballMachine* gm_; }; #endif // !STATE_A_H StateA.cpp #include "StateA.h" #include using namespace std; void StateA::methodA() { cout << "StateA::MethodA" << endl; } void StateA::methodB() { cout << "StateA::MethodB" << endl; gm_->se...

増補改訂版Java言語で学ぶデザインパターン入門 結城 浩 第6章 Prototype をC++で実装

イメージ
自分のお勉強用 : デザパタ 結城本 第6章 Prototype をC++で適当に実装 C++とデザパタのリハビリを目的として。 Flyweightとなんか脳内で混同してしまう。まぁコンセプトは似てるし仕方ない。 ファイル一覧 Product.h : インターフェイス ProdA.h と ProdA.cpp : 実装 ProdB.h と ProdB.cpp : 実装 Manager.h prototype_cpp.cpp : メインクラス 実装 Product.h : インターフェイス #pragma once #include using namespace std; class Product { public : virtual ~Product() {} virtual void use(string s) = 0; virtual Product* createClone() = 0; }; ProdA.h #pragma once #include "Product.h" class ProdA : public Product { public: ProdA(string s):deco_(s) {} virtual void use(string s) override; virtual Product* createClone() override; private: string deco_; }; ProdA.cpp #pragma once #include "ProdA.h" #include using namespace std; void ProdA::use(string s) { cout << deco_ << " : " << s << endl; } Product* ProdA::createClone() { return new ProdA(deco_); } ProdB.h #pragma once #include "Product.h" class ProdB : public Product { public: ProdB(stri...

HeadFirstデザパタ 第2章ObserverパターンをPythonで適当に実装。

イメージ
HeadFirstデザパタ 第2章ObserverパターンをPythonで適当に実装。 PythonのおさらいとObserverの感触を掴むため、書籍「HeadFirstデザインパターン」の第2章Observerパターンを適当に実装。 ファイル一覧 observer_py.py 実装 from abc import ABCMeta, abstractmethod # このへんインターフェイス定義 class Observer(metaclass=ABCMeta): @abstractmethod def update(temp, humidity, pressure): pass class DisplayElement(metaclass=ABCMeta): @abstractmethod def display(): pass class Subject(metaclass=ABCMeta): @classmethod @abstractmethod def registerObserver(self, observer): pass @abstractmethod def removeObserver(self, observer): pass @abstractmethod def notifyObservers(self): pass # end class Subject class WeatherData(Subject): __temparature = 0 __humidity = 0 __pressure = 0 observers = [] def __init__(self): pass def registerObserver(self, observer): self.observers.append(observer) def removeObserver(self, observer): self.observers.remove(obs...

増補改訂版Java言語で学ぶデザインパターン入門 結城 浩 第17章 Observer をC++で実装

イメージ
自分のお勉強用 : デザパタ 結城本 第17章 Observer をC++で適当に実装 C++とデザパタのリハビリを目的として。 なんかObserverってスレッド化しないと、なんかしっくりこないというか。 イマドキだと関数化なのかな。 写経元は書籍「増補改訂版Java言語で学ぶデザインパターン入門 結城 浩」の第17章 Observer。 ファイル一覧 myObserver.h : インターフェイス myObserverA.cpp と .h myObserverB.cpp と .h NumberGenerator.cpp と .h RandomNumGenerator.cpp と .h observer_cpp.cpp(main部分) インターフェイスを「myObserver」という名称にしています。 普通に「Observer」を使うと、なんだか最近だと標準ライブラリかどこかに存在しているようで紛らわしかったので。 IObserverとしても良かったです。 実装 記載順序は以下とします。 インターフェイス → IF実装 → Subject → Subject実装 → main。 myObserver.h : インターフェイス #pragma once #include "NumberGenerator.h" class myObserver { friend class NumberGenerator; public : myObserver() :next_(nullptr) {}; virtual ~myObserver() {} virtual void update(NumberGenerator&) = 0; private: myObserver* next_; }; myObserverA.h : IF実装その1 #pragma once #include "myObserver.h" #include "NumberGenerator.h" class myObserverA : public myObserver { friend class NumberGenerator; public:...

HeadFirstデザインパターン 第6章CommandパターンをC#で軽く実装。

イメージ
自分のお勉強用 : HeadFirstデザインパターン 第6章CommandパターンをC#で軽く実装。 C#のおさらいとCommandパターンの感触を掴むため、 書籍「HeadFirstデザインパターン」の第6章Commandパターンを適当に実装。 ファイル一覧 CeilingFan.cs ICommand.cs Light.cs NoCommand.cs Program.cs RemoteControl.cs RemoteLoader.cs 実装 前述のファイル一覧の順番とは異なります。 まずはインターフェイスから。 ICommand.cs namespace csConsole { interface ICommand { void Execute(); void Undo(); } } Light.cs : コンクリートとレシーバーその1 namespace csConsole { class Light // レシーバー部分 { public Light(){} public void on() => Console.WriteLine("ライトオン です。"); public void off() => Console.WriteLine("ライトOFF です。"); } class LightOnCommand : ICommand // コンクリート部分 { Light light; public LightOnCommand(Light light) => this.light = light; public void Execute() => light.on(); public void Undo() => light.off(); } class LightOffCommand : ICommand // コンクリート部分 { Light light; public LightOffCommand(Light light) => this.light = l...

windows10 で nvidia のグラボのcode43現象を解決した

■そもそもの発端 2018年秋、OS入れ替え(win7→win10)を行ったら、グラボが認識されなくなった。 リンク → GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019) ■原因(ざっくり) nVidiaの専用ドライバはPC内部に存在しているが、nVidiaの専用ドライバよりもWindowsの汎用ドライバが優先的に使用されている。 ■やったこと とりあえずWindowsが優先的に採用してしまっている汎用ドライバを参照しない状況にした。 ■手順 OSのクリーンインストール(必要なら) 既存の全グラフィックドライバの削除(ここから本筋) 再起動 適用したいnVidia専用ドライバのインストール 再起動 Windowsの汎用ドライバになっちゃってるので、ドライバを元に戻す ■手順の詳細説明(一部) 2. 既存の全グラフィックドライバの削除 について 有名なドライバ削除ツール「 DDU 」(Display Driver Uninstaller)というものを使用します。 リンク : 「 DDUダウンロードページ(別窓) 」 使用時はDDUのチェックボックスから以下を指定します。 ・Windowsが自動でドライバをインストールしないように設定(自動インストールを許可しない) 勝手にやられると、今回みたいなことになってしまうので。 6. Windowsの汎用ドライバになっちゃってるので、ドライバを元に戻す について 再起動したら、なぜかWindowsのドライバが適用されており、code 43 の状況になっていました。 一つ前の世代では確実にnVidiaの専用ドライバがインストール+利用されていたので、ドライバの画面から「ドライバを元に戻す」を押下し、nVidiaの専用ドライバに戻します。 ・ドライバ状況(再起動直後) nVidia専用ドライバ Windows汎用ドライバ : ← いまここ ↓ 実行 : ドライバを元に戻す ・ドライバ状況(元に戻す適用後) nVidia専用ドライバ : ← もとに戻した Windows汎用ドライバ 人によっては、Windowsの汎用ドライバを削除したりと、やり方は色々あるようです。 こちらのサイト様の流れがわかりやすく、検証もわかりや...

C++からjavaを実行する方法。VisualStudio2010とjava8。

参考にさせていただいたサイト。 http://www.ne.jp/asahi/hishidama/home/tech/java/jni_vm.html https://blogs.yahoo.co.jp/dk521123/33067170.html 概要 諸事情あってC++からJavaを呼び出す際のコードです。 先述のサイト様の実装例といったところです。 環境 VisualStudio 2010 sp1 java 1.8 191 WindowsServer2008 sp1 以下コード *blog掲載に際し、一部でプロジェクト固有の文字が入っていたため、適当に削除しました。 **メソッドはblog用に一つにしてありますが、jvm使い回し箇所など適宜関数化すればよいかと思います。 #include #include "myApp.h" #include #include "jni.h" #pragma comment(lib, "jvm.lib") using namespace std; static JavaVM* vm(NULL); int cppExecute ( int id ) { // jvmの用意 JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options[2]; options[0].optionString = "-Djava.class.path=xxx.jar"; options[1].optionString = "-Xmx256m"; //値はblog用に適当 vm_args.version = JNI_VERSION_1_8; vm_args.options = options; vm_args.nOptions = 2; // JVM使いまわしチェック。初回はJVMが未Createなのでそちらのルート。 // 2回目以降はCreate済みのJVMを使用する。 if (vm == NULL ) { // JVMが存在...

java(Apache:Axis)で自己証明書を回避する

何らかの理由でサーバー側の自己証明書を回避する必要があるとします。 その中でも今回は、プロジェクトでApache(Axis)を利用している場合の自己証明書回避コードとなります。 ■コード AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory"); これは公式のWikiにも記載のあるコードです。 Ws Wiki Login FrontPage/Axis/SslUnsignedCertificate 上記の回避コードを処理の先頭にでも入れておけば、自己証明書が回避できます。 ■ちょっとした具体例抜粋 // ■処理ブロック public int doExecute() { try { // サーバー側の自己証明書を回避 AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory"); // サーバー接続処理↓ ... ■余談 グーグルなどで「Java 自己証明書 回避」で出てくるサイトは、 その多くがhttpコネクションを自分で作っているという状況で自己証明書を回避しているサンプルが多く、 この件が書かれた日本語ページがあるのやら無いのやら。

GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019)

★後日解決しました リンク → windows10 で nvidia のグラボのcode43現象を解決した ■こんな事が起きたよ どうやら最近(2018年春~)、グラフィックボード GTX560Ti の nVidia 公式ドライバが機能していない様子。 先日HDDが異音と共に開始しない状況になり、 ついでにOSのお掃除的にwindowsをクリーンインストールで入れ直したところ、 画面がおかしな状況となりまして。 ■自分のグラボ情報 メーカー : msi 名称 : N560GTX-TI TWIN FROZR Ⅱ/OC 発売日:2011年 1月28日 url : MSI公式 : N560GTXTi_Twin_Frozr_IIOC ■状況 *画面コピー等を取得しなかったので、ちょっとうろ覚えです。 ディスプレイ設定画面 : 汎用非 PnPモニターとなる。(普通にモニターはある状況なのに) モニター : 解像度が低下する & 選択肢に適切な解像度が出てこない。 マルチディスプレイ : 認識されない。 デバイスマネージャー -> ディスプレイアダプタ : 黄色のワーニング状況になっている。 詳細を確認するとコード43となっている。 ドライバ : 最新状況で、診断しても「最新です」となる。 他 : NVIDIA コントロールパネル などがない or 選んでもエラーとなる。 ■結果と解消方法 自分環境ではとりあえず、2017年12月にリリースされたものをドライバ適用すると解消する。 下記表参照。 現時点で、2018年以降のnVidiaの公式ドライバは全滅の様子。 将来的にちゃんと動くようになるのか、もうずっと2017年のドライバで行くのかは現時点で不明。 windows7と10でそれぞれ試したので、OSの差異ではなく、ドライバの差と考えている。 ■いちおう適応して確認した一覧 nVidia公式ドライバ置き場より OK/NG ドライバ名 バージョン リリース日 NG GeForce Game Ready Driver WHQL 391.35 27.3.2018 NG GeForce Game R...

Java : Java でUnicode文字列処理中に「�」という表示が出てくる現象。Replacement Character。

根本原因 *ブログのラベルは「Java」としましたが、「Unicode」「文字コード」と置くのが正確ですが、まぁそのへんはもう暗黙の前是ということで。 Unicodeにおいて、なんらかの文字コードでマッピングが失敗する場合、その取扱いできない文字は「�」(U+FFFD)に置換されます。 プログラム内の文字列処理中にこの状況になると、当然「�」になってしまいます。 詳細は自分が説明するよりも、とても詳しいブログがあったので、ぜひそちらを → 「 あしのあしあと : Javaにおける文字コード周りの話(5) 」 自分が遭遇した状況 MySQLで、どこかのフィールド値が「NUL文字」(U+0000)の場合、これを取得すると「�」になっていました。 [テーブル状況(簡易)] id str 1 あいうえお 2 かきくNULLNULL ↑をDAOなどでゲットすると、「1 : あいうえお、2 : かきく��」。 対応 U+0000以外にも同様の対応が必要な文字はあるので、とりあえずcharとして取扱い、OK/NG判定したりしました。 この辺はプロジェクトの状況ごとに対応するしかないと思います。

Servlet : 最近のサーブレット定義ではweb.xmlで外部参照ができなくなっています。

Servlet2とかの時代、web.xmlでは外部xml参照が可能であった。 こういう状況 → Google検索「 webxml entity 」 これらは、昨今のセキュリティ事情に合わせて使用不可となっている。(2015年ぐらい以降) 参考 : https://bugzilla.redhat.com/show_bug.cgi?id=1069911 脆弱性としては XXE attack で、外部xmlを任意のファイルで成りすまして悪さをするというもの。 いわゆるDLLハイジャックと同じ考え方。 ■ 以前はOKで、最近は読み込めなくなっている具体例 どういうコードがNGかというと、こんなタイプ↓ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app [ <!ENTITY test0 SYSTEM "aaa/test0.xml"> <!ENTITY test1 SYSTEM "aaa/test1.xml"> ]> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <!-- サーブレット設定 --> &test0; &test1; </web-app> これは、xmlパース時にエラーとなる。 以下、エラーログ↓ org.apache.catalina.startup.ContextConfig parseWebXml 重大: アプリケーションのweb.xmlファイル jndi:/localhost/xxx...

Java : [標準API]Map<String,Object>型を JSONパース可能な1行のString型に変換。

標準APIのみで、Map<String,Object>(最終的にはMap<String,String>)を、JSONのパースが可能な1行の文字列に変換する再帰関数。 Java1.8。 以下コード。 /** * Map 型をJSONパース前のString平坦文に変更。 * @param map : Map<String,Object>型で定義されている。終端の要素はMap<String,String>であってほしい。 * @return 引数 map をString型に変換した状態。 */ @SuppressWarnings("unchecked") private String mapToString(Map<String, Object> map) { String sss = "{"; for (Entry<String, Object> e : map.entrySet()) { if ( e.getValue() instanceof Map ) { sss += "\"" + e.getKey() + "\":"; sss += mapToString((Map<String, Object>)e.getValue()); sss = sss.substring(0, sss.length() - 1) + "},"; } else { sss += "\"" + e.getKey() + "\":\"" + e.getValue() + "\","; } } return sss.substring(0, sss.length() - 1) + "}"; } こういう状況なら、JavaScrirptで以下のような取扱いが可能。 var j = JSON.parse(sss)

JavaScript : 自分のWebコンテンツ配下のローカルファイルを読み込む

今どきの色々なライブラリを使えないような状況で、 どうしてもローカルファイルを読み込む必要があるときのJavaScriptコードです。 XMLHttpRequest を使用して読み込みましょう。 Chrome、Firefox、IEで共通です。 *Webコンテンツ外のC:ドライブのどこか~などを指定するわけではありません。 ■準備 例えばこんなディレクトリ構成だったとして。 WebContent css data target.json img js jsp WEB-INF classes ... ■コード例 下記例ではjsonファイルを読み込んで、関数内でパースします。 // JSONファイルの読み込み。 function readJSON(){ var f = "data/target.json"; var retJson; var obj = new XMLHttpRequest(); obj.open( 'get', f, false ); //ファイルオープン : 同期モード obj.onload = function() { try { retJson = JSON.parse(this.responseText); //JSON型でパース。 } catch (e) { alert("コマンド定義ファイルの読み込み、解析に失敗しました。"); } } obj.send(null); //ここで読込実行。 return retJson; } ちなみに、WebContent外のファイルは流石に読み込めないと思います。

Java : ServletConfig::getInitParameter()で引数がnullの場合、APサーバーによって挙動が異なる。

例えばこういう状況。 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp){ String s = getServletConfig().getInitParameter(null); 普通はあんまり考えられませんが、あったとして。 環境が変われば挙動も変わるという、当たり前のことなのですが、いちおう軽く確認しました。 何かのお役に立てれば。 Tomcat6 : null が返却される。 Tomcat9 : NullPointerException がスローされる?(*未検証) Wildfly10 : IllegalStateException がスローされる。 以下でざっくりと補足。 ■Tomcat6 null が返却される。 挙動としてはHashMapのnullの挙動と同じ。内部ではきっとこうなってるんじゃなかでしょうか。 //HashMapのnull指定時の挙動テスト。 HashMap map = new HashMap (); try { String s = map.get(null); System.out.println(s); } catch ( Exception e ) { System.out.println(e.getMessage()); } ■Wildfly10 IllegalStateException がスローされる。 /** * Returns a String containing the value of the named * initialization parameter, or null if the parameter does * not exist. See {@link ServletConfig#getInitParameter}. * * This method is supplied for convenience. It gets the * value of the named parameter from the servlet's * ServletConfig object. * * @param ...

ExcelVBA : 表示されない名前の管理を出すマクロ

企業内で長い期間使い回されてきたエクセルは、数式->名前の管理がぐちゃぐちゃになりがちで、 結果、ファイルサイズは肥大し、シートをコピーするとよくわからない確認ダイアログボックスが出現して煩わしいです。 画面から全部消したと思っても、状況は改善されない。 という状況で使うマクロ。 見えていない名前の定義が出てきます。 出現させたあとはエクセルのリボンで、数式 -> 名前の管理 で不要分を削除するとよいでしょう。 Public Sub DisplayNames() Dim o As Object For Each o In Names o.Visible = True Next End Sub

Java : processbuilder 標準出力 タイムアウト

( 1つ前の投稿 から続けて) Java(1.8)で外部シェルを実行するというお話、その2。 いったん作成したが、「タイムアウトとかほしいよね」とのことでタイムアウト判定を入れることになった。 単純にタイムアウトだけであれば タイムアウト付きwaitFor() が使えたと思う。 ただ、この関数は標準出力バッファが詰まった時点で、エラー扱いで処理が戻ってきた。 理想のタイムアウトの挙動は以下であった。 タイムアウトになるまではずーっと標準出力を受け取っていてほしい。 タイムアウト時点で、そこまでの標準出力を全部受け取っていて、最後に「と、ここまでやったけど、ここでタイムアウトしました」ぐらいの結果返却。 というわけで、前回の「標準出力バッファを吸い出しながら処理するコード」を元にして、タイムアウト処理を追加する形で実装。 コードは以下。 ちなみに、タイマーに内部クラスを使用しているのは好みです。 当然、System.currentTimeMillis() と if文でも同様のことが出来ますし、ここでは一つの例ということで。 // cmd[] は とりあえずこんな → [0]:ユーザー用コマンド名称、[1]:処理開始日時、[2]:外部実行のシェル名、[3]~ : 引数情報(可変長) private List&ltString&gt cmdExecute(String[] cmd) throws Exception { // タイムアウト用タイマー : 内部クラス class CmdTimer extends TimerTask { private boolean isTimeout = false; private Process p = null; public CmdTimer( Process p ) { this.p = p; } public boolean getIsTimeOut() { return this.isTimeout; } @Override public void run() { this.isTimeout = true; try { ...