プログラムでモデルとクエリ結果をJOINしてみた
はじめに
SQLが書けない環境でJOINを共通的に使えるようにするために
プログラム
private static <T, D extends Cloneable> void join(boolean p1, List<D> p2, Map<String, List<T>> p3, Function<D, String> p4, Map<String, BiConsumer<D, T>> p5) throws CloneNotSupportedException {
for (int i = 0; i < p2.size(); i++) {
String key = p4.apply(p2.get(i));
if (p3.containsKey(key)) {
if (p5!= null)
p5.get(key).accept(p2.get(i), p3.get(key).get(0));
for (int n = 1; n < p3.get(key).size(); n++) {
D clone = CloneUtils.cloneObject(p2.get(i));
if (p5!= null)
p5.get(key).accept(clone, p3.get(key).get(n));
p2.add(i++, clone);
}
} else if (p1) {
p2.remove(i--);
} else {
if (p5!= null)
p5.get(key).accept(clone, p3.get(key).get(n)); //nullを設定できれば
}
}
}
利用例
List<・・・> ‘daoList;//結合したいデータ
List<Cloneable> ‘dtoList;//結合されるソース
・・・
Function<daoモデル, String> key1 = m -> ・・・;//結合キーの左
Function<dtoモデル, String> key2 = m -> ・・・;//結合キーの右
join(true, dtoList, daoList.stream().collect(Collectors.groupingBy( key1 )), key2 , daoList.stream().collect(Collectors.toMap(key1 , m -> setter, (m1, m2) -> m1)));
ひとこと
SQL書かないでね・という開発ではORMを調べるのも大変になりますが、それよりも仕様理解に充てる時間を増やしたいときはこんな感じで進めていくのも一案。
CISCO 841M 設定:その14:別LANに設置したプリンターから印刷する
はじめに
L3スイッチが4ポートあり、それぞれVLAN1, VLAN2, VLAN3, VLAN4で分離したとしても、ルーティング機能により、VLAN2⇔VLAN3などVLANをまたいだ通信を遮断している状態で始まりです。今回は例として、VLAN2にネットワーク接続されたプリンターを使ってVLAN3から印刷できるようにアクセスリストを考えてみようと思います。
VLAN2は「192.168.20.0/24」、VLAN3は「192.168.30.0/24」、プリンターは「192.168.20.100」とします。
機材
・CISCO 841M本体
・KAUMO USB RJ45 シリアルコンソールケーブル
・Win10 ノートPC
ACLグループVLAN2
access-list 名前 可否 プロトコル 受け先 受け元 のイメージで
access-list 120 permit tcp 192.168.20.100 0.0.0.0 eq 515 192.168.30.0 0.0.0.255
access-list 120 deny ip any 192.168.30.0 0.0.0.255
access-list 120 permit ip any any
ACLグループVLAN3
access-list 名前 可否 プロトコル 送信元 送信先 のイメージで
access-list 130 permit tcp any 192.168.20.100 0.0.0.0 eq 515
access-list 130 deny ip any 192.168.20.0 0.0.0.255
access-list 130 permit ip any any
まとめ
プリンタポート番号は、その機種によって違うと思います。(515番や9100番とか)。。また、プリンタ検索用のUDPは設定してないので、PCへプリンタを追加するときは、プリンタのIPアドレスを直指定しました。。(PCからプリンタ検索で探すことはできません) 、 という限定的な設定ですが、設定イメージをメモとしました。 今回は単一機種のVLANですが、多段ルータでも同じ要領で設定。。。
ASP MVCのViewでコントローラー名やアクション名を取得
はじめに
Razor(レイザー)のレイアウトファイルにページのタイトルなどの出力処理をまとめたいと思い調査したメモ
実行中のコントローラー名を取得
@Url.RouteCollection.GetRouteData(Context).Values["controller"]
実行中のアクション名を取得
@Url.RouteCollection.GetRouteData(Context).Values["action"]
画面タイトルなどデータベースで管理してコントローラーからビューに渡す方法をよく使いますが、アクション数が100個程度であれば、レイアウトファイル内で分岐処理をするほうがお手軽、、まあ十分かなと思い実装を試しました。
モデルを介さない値はViewに渡さない