ぼくの話すことは、全部ネットに書いてある。

ぼくの話すことは、全部ネットに書いてある。

週末引きこもり族がカメラ片手に外へ出ようとするブログ。

桐生着道楽、足利食道楽[栃木県足利市]

両親と足利市に行ってきました。
人がいると、独りよがりに撮影できないのであっさり気味です。

桐生着道楽、足利食道楽と昔から言われていて、群馬県桐生市は服飾が充実しており、栃木県足利市はグルメだとか。

両市は隣接していて観光面でも協力しています。

f:id:aino123:20180422214945j:plain

[DMC-GF1:OM ZUIKO MC 50mm F1.4]

足利学校は昨年訪問したのでスルー。

鑁阿寺

f:id:aino123:20180422215405j:plain

[D5600]

「ばんなじ」と読みます。

鎌倉時代から続く由緒正しいお寺です。
もともと足利氏の館であったため、周囲にお堀があります。

f:id:aino123:20180422215846j:plain

亀が甲羅干ししてました。

f:id:aino123:20180422220113j:plain

[D5600]

境内の巨大ないちょうの木。盛大なゴースト。

はりと

[D5600]

鳩ばかり撮影。

境内にて

[D5600]

織姫神社

f:id:aino123:20180422220609j:plain

[D5600]

鑁阿寺から歩いて10分ほど。

昭和に再建された本殿は、平等院鳳凰堂モチーフだとか。

f:id:aino123:20180422220746j:plain

[DMC-GF1:OM ZUIKO MC 50mm F1.4]

ただの斜めったピンぼけ写真だけど、レンズが素晴らしいのか雰囲気を感じる……。

春もみじ:red leaves in  springtime

[DMC-GF1:OM ZUIKO MC 50mm F1.4]

春もみじ。狂い咲き?なのかと思ったら、そういう品種なんですね。

社殿

[DMC-GF1:OM ZUIKO MC 50mm F1.4]

F1.4だと露出過多でハイキーに。

雑記

このブログで、NikonCanonのフルサイズミラーレス買うぞ~と管を巻いていましたが、最近考えが変わってきました。

ネットだとフルサイズが持て囃されていますが、写真教室でもカメラが趣味の同僚でもフルサイズを使っている人がほとんどいない。

実際APC-Cよりセンサーサイズ小さいマイクロフォーサーズ機に満足してる自分がいるし。レンズの重要性を認識しました。

とはいえ使ったことないのでは酸っぱい葡萄になってしまうので、一度くらい使ってみようかなぁという思いもある。

写真教室通い始めました

第一回はミーティング。自己紹介と教室の概要、写真の講評程度でした。

せっかくのデジカメなんだからとにかく枚数撮るべし!って感じ。

今後月二回づつ、撮影地に行っての実践指導があります。


それはそれとして、土日は近場を散歩。最近体調が芳しく無く、活動に気力を使います。

f:id:aino123:20180415222640j:plain

GF1+OM ZUIKO MC 50mmF1.4

F1.4のボケを見よ!って風が強すぎてピント合いませんでした。

河原にて1

盛大にゴーストが出てるんだぁ。

河原にて3

夕暮れ時です。みんな撮って出しだけど、雰囲気が素敵な気がする。

河原にて4

ただやっぱ100mm単焦点って扱いが難しい。

里山を走る/7000円弱で始めるオールドレンズ沼[倉渕村]

先週風邪でダウンしてたらいつの間にか、近所の桜が散ってました。

桜を求めて山の方へ。

f:id:aino123:20180408004504j:plain

新システム導入

悲報OM-2N修理不可フィルムカメラへの取っ掛かりが無くなりました。
朗報OM-2Nのレンズは良好

……ということで。



f:id:aino123:20180408004832j:plain

OM-2Nのレンズを活かすため、マイクロフォーサーズシステムを構築しました!

オールドレンズのマウントアダプターが一番用意されてるマウントではないでしょうか。

  • ボディ:LUMIX GF1:5000円前後で入手可能。m4/3システムの第一世代。恐らくミラーレス一眼の中古で一番安く出回ってます。
  • マウントアダプター:OM→m4/3:2000円弱で入手。

計7000円也

これで気になってたロシアレンズとかにも手が出せます。

古い機種で妥協するなと怒られそうですが、これからC社N社のフルサイズミラーレ控えてるのでそこまで投資できません。PEN-Fとか気になってきましたが……。

里山を走る

今回も明確な目的地もなく、とりあえず妙義山にナビをセットして走り出しました。

途中気になる脇道を見つけたらナビをオフにして気ままにドライブ。

見つけたのは地蔵峠林道という人気の少ない峠道。松井田町倉渕村をつないでいます。

里山が色とりどりの花々に飾られて、日本の原風景といった風情。

ドライブ楽しみすぎて写真撮ってない……。

里山の社:Shrine of woodlands

GF1+OM ZUIKO MC 50mmF1.4。撮って出し。
うまく言葉で表現できないけど、甘いボケ味な気がする。

マニュアルフォーカスでピントが決まるときもちいい。

m4/3は35mm換算だと約2倍の焦点距離なため、だいたい焦点距離100mmになってます。
ちょい画角がきつい。

散り際

GF1+OM ZUIKO MC 50mmF1.4。撮って出し。

まだまだ、このレンズの実力が引き出せてない。
明るいとこだとやっぱファインダーほしいなぁ。液晶だときつい。

若者たちの祭典/ぐんまプログラミングアワード2018見学・撮影してきた

f:id:aino123:20180325191941j:plain

昨年から開催されているぐんまプログラミングアワード

  • ジュニア部門:小・中学生対象。Scratchというプログラミング学習ツールを使って作成したプログラムのプレゼンテーション。
  • テクニカル部門プログラミングコンテストのように問題の解答スピードを競う。
  • アプリケーション部門:アプリケーションのアイディアのプレゼンテーション

という3つの部門でコンテストが行われました。

f:id:aino123:20180325193444j:plain

会場は群馬県庁わきの群馬会館。
写真は群馬県庁=群馬で一番高いビルです(ちなみに2位は高崎市庁)。

ブース出展

f:id:aino123:20180325192543j:plain

協賛企業様のブース出展。子どもを対象としたロボット作成講座などがありました。

f:id:aino123:20180325193139j:plain

乗れる!恐竜ロボット。
やっぱりこういう被写体は人も含めたい。
コミュ障だからなかなか言い出せないんだよなぁ。

コンテストの模様

写真撮影全面OKでした。むしろSNSで拡散してくれとのことです。

迷惑にならないようにバリアングル液晶閉じて撮影しました。
地味な一眼レフ機のメリット。スマホでの撮影より目立たなくていいですね。
ノイズも少ないし。

オープニング/パフォーマンス

来賓席・主賓積にはスーツのおじさんたち。

f:id:aino123:20180325194009j:plain

爆音で始まるあかぎ団(ご当地アイドル)と初音ミクのライブ

ライブ中清聴して、最後に盛大な拍手

オーケストラのコンサートかな?

f:id:aino123:20180325194717j:plain

ゲストのちょまどさん挨拶。

主賓席の最前列が「ちょまどさんご両親席」だったが少し面白かった。

f:id:aino123:20180325195725j:plain

LEDとプロジェクションマッピングを用いたパフォーマンスかぐづち-KAGUZUCHI-

会場がかなり盛り上がりました。

シャッタースピード早すぎて、光の軌跡が途切れる。
静止画で撮るもんじゃないです。


雷光炎舞かぐづち-KAGUZUCHI- Promotion Video Ver6

火はさすがに使ってないけどこんな感じ。

各部門の様子

f:id:aino123:20180325194955j:plain

テクニカル部門は別会場で競技。

f:id:aino123:20180325195145j:plain

ジュニア部門の発表。
ブロックを組み合わせる感じでプログラムが作れるようです。
プログラムも発表もしっかりしていて驚かされました。

f:id:aino123:20180325200659j:plain

アプリケーション部門は大学生~高校生。
需要と収益化を意識した発表が多くさすがといったところ。

f:id:aino123:20180325200737j:plain

気に入ったのが、沖縄からきた高校生2人が発表したサーチマップ

スマホアプリで、目的地に行く途中におすすめスポットがあればお知らせしてくれるというもの。
ターゲットはインスタグラマー。

 

こういった若々しい発表見ると自分もなにか作りたくなりますねぇ。

足元の春。家の周りを散歩してみた

試練:A Trial

今日は祝日なので出かけようと思ったらまさかの雪

春分の日なのに……。

車で出かけるのはやめて、家の周りを散歩してみました。
なんだそりゃって感じですが、小学校以来自宅周りの散歩なんてやったことない気がする。

トップの写真はつくし

雪を耐えてる春の草木を撮りたかった。

やっぱ一眼でローアングル撮影は重量的にキツイ。

f:id:aino123:20180321182835j:plain

Green&White

麦畑とまだ植えられていない畑で色がくっきり別れています。

f:id:aino123:20180321183309j:plain

桜はまだつぼみ。あともう一息で開花です。

さとつの知らないアクセサリーシューの世界

フラッシュとかを取り付けるこの部分。
アクセサリーシューと呼ぶそうです。
特に電子接点があるものはホットシューとも呼ぶと。

ヤシカY35を見てたらアクセサリーシューが付いてたので、フラッシュ以外に何か付けられないか色々調べました。

※注意:Canon製品には特殊規格のホットシューがあり、汎用品が使えない場合があるそうです。自己責任で!「それ使っちゃダメー!」キヤノンのカメラ EOS用のホットシューカバーはコレだよ! – プライベーティア フォトワーカー

アクセサリー系

ホットシューカバー

単純に接点を保護するためのカバーです。

シンプルなものから、フィギュアが乗ってる変わり種とかもあります。

自分は画像と同タイプの水準器付きをD5600につけてます。
ただ、ファインダーと同時に見れないし、ライブビューでも使いにくい。
三脚を使うときは三脚についてる水準器を使ってしまいます。
正直水準器としての出番はないです。

SDカードケース

ケーキ型のケース。かわいいが邪魔ではないだろうか。

ファインダー系

外付ファインダー

カメラによっては外付の電子ビューファインダーが用意されてます。

PLファインダー

PL効果確認用ファインダー

D5600のファインダーで見ても効果がわかりにくいので、ちょっと欲しい。

ドットサイト照準器

超望遠でも被写体を素早くファインダーに捉えることができます。

野鳥撮影とかで大活躍。

フィールドモニタ

みたまんま。ライブビューをでかく表示するためのモニタ。

特殊用途系

リモコンシャッター

www.kickstarter.com

スマホをリモコンにして露出やシャッタースピード、シャッター間隔などを細かく設定できます。

Kickstarter内に類似の製品が幾つも存在している模様。

サムレスト

ホールド感を増すためのグリップです。

アクセサリーシューが平らな天面にあるミラーレスやコンデジ

マイク

動画取る人向け。

露出計

フィルムカメラで、露出を計算するための機械……らしい。

マウント系

スマホ用マウントや

GoPro用マウントがあります。

雑記

最後の方めっちゃ適当……。

それはそれとして、クラウドファンディング中のYashicaから連絡がありました。

The Team have been totally dedicated to the digiFilm Camera Project working hard for the optimum solution in order to make Y35 even better.

Of course, it can’t be an excuse of oversight in updating. We are so sorry for that. We are going to inform the latest status soon and continue to have frequent update posted at regular basis.

意訳

チームは、Y35をより良くするために熱心にやってきたよ!

もちろん、更新低下の言い訳にはならないことは判ってるよ。すまないと思ってる。

最新情報を伝えられるよう努力するよ。

 

PrimeFaces6.1コンポーネントDataTableハック[Java EE/Jakarta EE]

会社で所属部署が変わり、Webアプリケーションの開発を行うことになりました。
使用するのはJakarta EE(Java EE)+GlassFish+PrimeFaces

f:id:aino123:20180312195526p:plainどう見てもトランスフォーマーモチーフ。

業務でJava使うのは初(チームメンバーも案件で使ったことないという……)。

ハックとかそんな大層なものでもないけれど、日本語資料が少ないので記録として残しておきます。

PrimeFacesコンポーネント(DataTable)拡張

PrimeFacesのコンポーネントは便利な半面小回りが効きません。
デモでは単体で動作している機能も、複合して使おうとすると思わぬ競合で動かないときがあります。

そういった時、必要になるのがextend

例1:DataTableのバグを直してみる~ColumnToggler+CellEdit~

表の項目の表示非表示を切り替えられる「ColumnToggler」。
便利ですが、「Cell Edit」と組み合わせると、Tabキーによる移動の挙動がおかしくなります。
PrimeFacesはTab移動を「tabCell」というFunctionで実装していますが、非表示の項目にまでフォーカスを合わせてしまうからです。

修正してみます。

primefaces/datatable.js at 6_1 · primefaces/primefaces · GitHub

GitHubソースコードから、Functionをコピーして追記(バージョンに注意)。

if(PrimeFaces.widget.DataTable) {
    PrimeFaces.widget.DataTable = PrimeFaces.widget.DataTable.extend({
    tabCell: function(cell, forward) {
        var targetCell = forward ? cell.next() : cell.prev();
        if(targetCell.length == 0) {
            var tabRow = forward ? cell.parent().next() : cell.parent().prev();
            targetCell = forward ? tabRow.children('td.ui-editable-column:first') : tabRow.children('td.ui-editable-column:last');
        }
        if(targetCell.is('td.ui-helper-hiden')){ //☆隠されたセルに移動したら再帰
            this.tabCell(targetCell,forward);    //☆
        } else {                                 //☆
            this.showCellEditor(targetCell);
        }                                        //☆
    }
}

☆が追記行です。

私は、上記のようなコードを「primefaces-patches.js」として保存し、JSF側で「<h:outputScript name="primefaces-patches.js" library="js" target="head"/>」のように読み込ませています。

例2:CellEdit中に右クリックしても編集終了しないようにする

CellEditで地味に厄介なのが、テキストボックスの編集中に右クリックすると編集終了してしまうとこ。

コンテキストメニューを使っての編集ができません。
なので、入力領域内での右クリックで編集が終了しないようにします。

if(PrimeFaces.widget.DataTable) {
    PrimeFaces.widget.DataTable = PrimeFaces.widget.DataTable.extend({
    bindEditEvents: function(cell, forward) {
        this.super(); //☆一部の動作を上書きできればいいので、元Functionを呼ぶ。
        var $this = this; //☆
        if(this.cfg.editMode === 'cell') {
            var cellSelector = '> tr > td.ui-editable-column';
            
            this.tbody.off('click.datatable-cell', cellSelector)
                        .on('click.datatable-cell', cellSelector, null, function(e) {
                            $this.incellClick = true;
                            
                            var cell = $(this);
                            if(!cell.hasClass('ui-cell-editing')) {
                                $this.showCellEditor($(this));
                            }
                        });
                        
            $(document).off('click.datatable-cell-blur' + this.id)
                        .on('click.datatable-cell-blur' + this.id, function(e) {                            
                            if(!$this.incellClick && $this.currentCell && !$this.contextMenuClick && !$.datepicker._datepickerShowing) {
                                if($this.cfg.saveOnCellBlur) {          //☆
                                    if(!e.target.classList.contains("ui-inputfield") || e.button !== 2) //入力領域外での右クリックまたは左クリックなら編集終了
                                        $this.saveCell($this.currentCell);
                                }                                       //☆
                                else
                                    $this.doCellEditCancelRequest($this.currentCell);
                            }
                            
                            $this.incellClick = false;
                            $this.contextMenuClick = false;
                        });
}

ちなみに、セル編集中のcontextMenuと行選択時のcontextMenuを使い分けたい時は

<p:contextMenu for="table" beforeShow="return PF('theWidget').currentCell == null;">
    hogehoge
</p:contextMenu>

のようにすればOK。セルが編集中ならcurrentCellに値が入っています。

例3:CellEditにおいてEnterキー、矢印キーで上下移動する

Excelっぽい移動を実装します。

if(PrimeFaces.widget.DataTable) {
    PrimeFaces.widget.DataTable = PrimeFaces.widget.DataTable.extend({
    enterCell: function(cell, forward) {                                 //☆tabCellを元に新規作成
        var tabRow = forward ? cell.parent().next : cell.parent().prev();//☆移動方向判定
        var targetCell = tabRow.children('td.ui-editable-column:first'); //☆次の行の先頭を取得
        for(var i = 0;i < cell[0].cellIndex;i++) {                       //☆
            targetCell = targetCell.next();                              //☆
        }                                                                //☆
        this.showCellEditor(targetCell);                                 //☆
    },                                                                   //☆
    showCurrentCell: function(cell) {
        ~略~
        //bind events on demand
        if(!cell.data('edit-events-bound')) {
            cell.data('edit-events-bound', true);
            
            inputs.on('keydown.datatable-cell', function(e) {
                    var keyCode = $.ui.keyCode,
                    shiftKey = e.shiftKey,
                    key = e.which,
                    input = $(this);
                    
                    if(key === keyCode.ENTER || key == keyCode.NUMPAD_ENTER) {
                        $this.saveCell(cell);
                        
                        $this.enterCell(cell,!shiftKey);                 //☆
                        
                        e.preventDefault();
                    }
                    else if(key === keyCode.UP) {                        //☆
                        $this.saceCell(cell);                            //☆
                        $this.enterCell(cell,false);                     //☆
                        e.preventDefault();                              //☆
                    }                                                    //☆
                    else if(key === keyCode.DOWN) {                      //☆
                        $this.saceCell(cell);                            //☆
                        $this.enterCell(cell,true);                      //☆
                        e.preventDefault();                              //☆
                    }                                                    //☆
                    else if(key === keyCode.TAB) {
                        if(multi) {
                            var focusIndex = shiftKey ? input.index() - 1 : input.index() + 1;
                            
                            if(focusIndex < 0 || (focusIndex === inputs.length) || input.parent().hasClass('ui-inputnumber')) {
                                $this.tabCell(cell, !shiftKey);                                
                            } else {
                                inputs.eq(focusIndex).focus();
                            }
                        }
                        else {
                            $this.tabCell(cell, !shiftKey);
                        }
                        
                        e.preventDefault();
                    }
                    else if(key === keyCode.ESCAPE) {
                        $this.doCellEditCancelRequest(cell);
                        $this.currentCell = null;
                        e.preventDefault();
                    }
                })
                .on('focus.datatable-cell click.datatable-cell', function(e) {
                    $this.currentCell = cell;
                });
        }
    });
}

tabCellを元にenterCellを新規実装。
キーイベントを追加してます。

例4:CellEditで編集した行に色を付ける

DataTableにおいて、行ごとに色を付けるためにはrowStyleClassを用います。

<p;dataTable id="mytable" widgetVar="theWidget" value="#{Bb.view}" var="item" rowKey="#{item.id}"
  editable="true" editMode="cell" selectionMode="single" selection="#{Bb.selected}"
  rowStyleClass="#{Bb.update_item.contains(item) ? 'update' : null}">
    <p:ajax event="cellEdit" listner="#{Bb.onCellEdit}" update=":form:msgs" />
    <hogehoge />
</p:dataTable>

管理ビーンのonCellEditでは、ArrayListであるupdate_itemにselectedをAddしてます。
PrimeFacesのDataTableは編集時、編集が行われた行のみ再描画します。
しかし、rowStyleClassの判定を再実行するためには、DataTable自体の再描画が必要です。

しかしながら、テーブル全体を無理やり再描画してしまうと、再描画とcellEditイベントが競合してしまい、挙動がおかしくなることがあります。

そこで、cellEditRequest発行時にスタイルシートを適応します。

if(PrimeFaces.widget.DataTable) {
    PrimeFaces.widget.DataTable = PrimeFaces.widget.DataTable.extend({
    doCellEditRequest: function(cell) {
        this._super(cell);                 //☆
        cell.parent().addClass('update');  //☆
    });
}

ここで設定する'update'は再描画を行うと消えてしまいますが、再描画時にrowStyleClassの判定が行われることで設定し直されます。

参考資料

stackoverflow.com