投稿者「as」のアーカイブ

活動量計

体組成計により、筋肉量が少ない等うれしくないことがわかったワケですが、他にも気になることがあります。

体組成計で計測した結果をスマートフォンに取り込んでアプリで見るわけですが、この「ヘルスプラネット」、使う際に自分の身長や年齢といったプロフィールを登録する必要があります。

で、その中に「身体活動レベル」という項目があり、選択肢が「高い」「普通」「低い」なんですね。そしてこの「身体活動レベル」の選択によって「体重キープの目安」カロリーが表示が変わります。

ほぼ一日机に向かってますから「高い」はない。ので「普通」か「低い」なワケですがここが問題で「体重キープの目安」カロリーが330kcalほど違ってきます。食後のデザートにロールケーキを一切れ食べても安心できるかどうか。

仕事は座りっぱなしとはいえ、毎日飼い犬の散歩でそこそこの速度で数km歩くしそんなに低くもないのでは。と思いつつ下手に安心して余分なカロリーを摂るようになっても困ります。

そんなわけで活動量計「カロリズム AM161」も買ってしまいました。メーカーの思うつぼです。

1週間ほど身につけた結果。活動量、というか消費カロリー非常に低かったです。話になりません。仕事の合間におやつ食べている場合ではないです。

北九州マラソンも近いし、私もランニングでも始めるべきでしょうか。

 

 

体組成計で計った結果は正しいのか

体組成計を買った結果、体重その他もろもろが数値で突きつけられるようになったわけですが、ある程度わかっていた事とはいえ、どうにも痩せすぎ感が。

体脂肪率が低めな点は良いとしても、筋肉、骨量も少なめと表示されると良い気がしません。そして本当に少ないのか気になります。

というわけで、どうにか他の方法で確認したいと思って考えついたのが握力計です。筋力が十分なら筋肉量が少なめに計測されても言い訳が立ちそうな気がしたわけです。

背筋力計の方がより大きな筋肉の筋力を計ることができそうですが、そこそこ良いお値段がします。その点握力計はピンキリで比較的お安い。

早速注文して計ってみました。

結果。利き手はかろうじて平均値、反対は平均値よりも10kg近く低い結果に。どうやら体組成計は正しいようです…

体組成計

長く使っていた体重計のパネルが割れてしまい、体重計を買い換えることになりました。
ちょうどポイントが貯まっていたので少し高機能なモノを買ってみました。

タニタの体組成計 RD-906

計測結果をスマートフォンに転送でき、アプリでグラフ表示できます。

で、体重、体脂肪率はもちろん、筋肉量や基礎代謝、骨量まで判定されるんですね。体重、体脂肪率はこれまでと変化もなく気にならなかったのですが、筋肉量や骨量が「少なめ」表示され少しばかり凹みました。

釣りに行ってへばらないよう、筋力維持程度の運動はしているつもりだったのですが。

それでも数値で判定されると改善しようという気になるので悪くはないですね。

過信禁物油断大敵

いつものように週末夜釣りに行きまして、普段と違う河川の河口まで足を伸ばして見ました。

河口に着くと、先客が多くグーグルマップで目星をつけていたポイントは空いていませんでした。

少し上流側に移動して河川敷に降りようとしましたが、あいにく階段が見当たりません。道路から河川敷までは2m強。石積み斜面で凹凸もあるため、まあ降りられそう。
柵を跨いで石に足をかけると、夜露のためか少し滑ります。

両手に荷物を持ったままでは斜面に対して向き合う姿勢で降りられないため、複数回登り降りしなければ、と思いながらライトで下を照らすと、中程より少し下、脇に少々幅のある足場が見えます。

前向きに降りて、滑ったら逆に踏み込んであそこの足場で踏ん張れば大丈夫だろうと考えて両手に荷物を持ったまま降りたのですが、案の定滑りまして。

予定どおりさらに一歩前に出て予定の足場に着地。と思ったら足場は実はただの枯れ草でそのまま転け落ちてしまいました。

幸い下が草だったことと、脇に抱えていたバッグがクッションになり、ズボンが少々汚れただけで怪我もなくすみましたが、これが磯だったりテトラだったら大変なところでした。

年齢の割にそこそこ足腰丈夫だとか考えて横着になっていました。油断大敵、安全第一ですね。

釣り小物

ここのところ、セイゴ・メイタ狙いの夜釣りによく行きます。
あまり面倒なことを考えずに、のんびりやれるのが良いですね。

セイゴ狙いといってもあまり小さいものは食べるところも少ないのでリリースしますが、口が大きく、ガバッと飲み込む感じで喰ってくる上に夜釣りですからどうしても針を飲まれてしまいます。

そこで活躍するのが針外し。ベルモントのメイク針外しを愛用しています。

分かりにくいかもしれませんが、先端脇にあるスリットにハリスを通して魚の口に差し込むと横向きの部分に針がかかって外れます。そして程よく先端の太さがあり、外れた針先が隠れてくれるので外れた針が再度刺さってしまうことがありません。

外し方の図解はGoogle画像検索で。

おすすめです。

ClosedXMLでExcelファイルに画像を埋め込む

公式版が画像埋め込みをサポートしています。
以下の内容は不要な情報となりました。

Excelファイルの出力でClosedXMLを使うことがありましたが、どうも公式のものは画像埋め込みをサポートしていない模様。

「ClosedXML 画像」で検索すると上位に表示されるページC#でExcelに画像データを埋め込む を参考にさせていただきClosedXMLImageSupportを入手しましたが、本家の最新版と開きがあるようなので、ClosedXMLImageSupportから画像埋め込み関係のコードを本家最新版に取り込みます。

ClosedXMLImageSupportのソリューション内にあるClosedXML_Sandboxが動けば良しとして、ざくっと追加、追記します。

  • ClosedXML\Excel\Drawings\
    • 追加:IXLMarker.cs
    • 追加:IXLPicture.cs
    • 追加:XLMarker.cs
    • 追加:XLPicture.cs
  • ClosedXML\Excel\
    • IXLWorksheet.cs
      • 追加:System.Collections.Generic.List Pictures();
      • 追加:void AddPicture(Drawings.IXLPicture pic);
    • XLWorkbook_Save.cs
      • 追加:using A = DocumentFormat.OpenXml.Drawing;
      • 追加:using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet;
      • 追加:private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture)
      • 内部処理追加:private static void GenerateWorksheetPartContent(WorksheetPart worksheetPart, XLWorksheet xlWorksheet, SaveContext context)
    • XLWorksheet.cs
      • 追加:private List pictures
      • 追加:public List Pictures()
      • 追加:public void AddPicture(Drawings.IXLPicture pic)

これでSandboxを実行するとExcelファイルが出力されて画像も埋め込まれています。
が、しかし。

他サイトの記事にもあるように画像の縦横比を無視してセルにフィットしてしまいます。

ClosedXMLImageSupportから取り込んだXLPictureは、AddMarker()でXLMarkerを追加して、一つ目がfrom、二つ目がtoとしてセルの範囲を指定するようになっています。このtoにあたるMarkerのセル位置とオフセットを上手いこと指定してあげれば画像の縦横比を維持して画像を埋め込むことができるようです。

しかし画像はfromで指定したセルの左上から、toで指定したセルの左上までは拡張されてしまうため、画像が収まる縦横セル数を求めた上でオフセットを指定する必要があります。十分大きな範囲を指定してからどうにかする、という手は使えません。

画像のサイズはピクセルですが、Excelのセル高さ(行高さ)はポイント、セル幅(カラム幅)は標準フォントの数字が何文字表示できるか。なので換算が必要になります。

ポイントからピクセルは簡単ですがカラム幅からピクセルはかなり面倒です。

  1. そのExcelブックの標準フォントとサイズを調べ
  2. TextRenderer.MeasureText()にTextFormatFlags.NoPaddingを指定し、0~9について描画時の最大フォント幅を求め
  3. フォント幅からセルのパディングをもとめ
    (パディング = 切り上げ(フォント幅  / 4) * 2 + 1。*2は両サイドにパディングが入るため。+1はグリッドライン分)
  4. カラムのピクセル幅 = カラム幅 * フォント幅 + パディング

となるようです。
このあたりは
ttps://social.msdn.microsoft.com/Forums/en-US/9a6a9785-66ad-4b6b-bb9f-74429381bd72/margin-padding-in-cell-excel?forum=os_binaryfile

関連ドキュメント : MS-OI29500 の 2.1.595 Part 1 Section 18.3.1.13, col (Column Width & Formatting) f. を参考にしました。

これをカラム毎に計算しながら、fromで指定されたセルから画像が上手く収まるカラム数を求めるのは正直辛いです。

ということでClosedXMLImageSupportから取り込んだXLWorkbook_Save.csのAddPictureAnchor()を弄ることでtoを指定せずに縦横比を維持して画像を埋め込むことができるようにしてみました。

まず、XLPictureのフィールドとしてあって使われていないNoChangeAspect, NoMove, NoResizeをIXLPictureでプロパティとして定義しておきます。XLPicture側ももちろん変更。

その上で、XLWorkbook_Save.csに取り込んだAddPictureAnchor()

private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture)
{
    /* 省略 */
    var markers = picture.GetMarkers();
    Xdr.TwoCellAnchor twoCellAnchor;
    Xdr.FromMarker fMark;
    Xdr.ToMarker tMark;
    if (markers.Count == 2)
    {
    fMark = new Xdr.FromMarker
    {
        ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()),
        RowId = new Xdr.RowId(markers[0].RowId.ToString()),
        ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.PaddingX).ToString()),
        RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.PaddingY).ToString())
    };
    tMark = new Xdr.ToMarker
    {
        ColumnId = new Xdr.ColumnId(markers[1].ColumnId.ToString()),
        RowId = new Xdr.RowId(markers[1].RowId.ToString()),
        ColumnOffset = new Xdr.ColumnOffset((markers[1].ColumnOffset + picture.PaddingX).ToString()),
        RowOffset = new Xdr.RowOffset((markers[1].RowOffset + picture.PaddingY).ToString())
    };
    }
    else
    {
    fMark = new Xdr.FromMarker
    {
        ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()),
        RowId = new Xdr.RowId(markers[0].RowId.ToString()),
        ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.PaddingX).ToString()),
        RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.PaddingY).ToString())
    };
    tMark = new Xdr.ToMarker
    {
        ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()),
        RowId = new Xdr.RowId(markers[0].RowId.ToString()),
        ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + extentsCx + picture.PaddingX).ToString()),
        RowOffset = new Xdr.RowOffset((markers[0].RowOffset + extentsCy + picture.PaddingY).ToString())
    };
    }
    twoCellAnchor = new Xdr.TwoCellAnchor(
    fMark, tMark,
        new Xdr.Picture(
            new Xdr.NonVisualPictureProperties(
                new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name },
                new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true })
            ),
            new Xdr.BlipFill(
                new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
                new A.Stretch(new A.FillRectangle())
            ),
            new Xdr.ShapeProperties(
                new A.Transform2D(
                    new A.Offset { X = 0, Y = 0 },
                    new A.Extents { Cx = extentsCx, Cy = extentsCy }
                ),
                new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
            )
        ),
        new Xdr.ClientData()
    );

    worksheetDrawing.Append(twoCellAnchor);
}

これを↓こんな感じで。

private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture)
{
    /* 省略 */
    var xdrPicture = new Xdr.Picture(
                new Xdr.NonVisualPictureProperties(
                    new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name },
                    // ここでIXLPictureに追加したプロパティを使用。
                    new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = picture.NoChangeAspect, NoMove = picture.NoMove, NoResize = picture.NoResize })
                ),
                new Xdr.BlipFill(
                    new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
                    new A.Stretch(new A.FillRectangle())
                ),
                new Xdr.ShapeProperties(
                    new A.Transform2D(
                        new A.Offset { X = 0, Y = 0 },
                        new A.Extents { Cx = extentsCx, Cy = extentsCy }
                    ),
                    new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
                )
            );

    var markers = picture.GetMarkers();

    var fMark = new Xdr.FromMarker
    {
        ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()),
        RowId = new Xdr.RowId(markers[0].RowId.ToString()),
        ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.PaddingX).ToString()),
        RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.PaddingY).ToString())
    };

    if (markers.Count == 2)
    {
        var tMark = new Xdr.ToMarker
        {
            ColumnId = new Xdr.ColumnId(markers[1].ColumnId.ToString()),
            RowId = new Xdr.RowId(markers[1].RowId.ToString()),
            ColumnOffset = new Xdr.ColumnOffset((markers[1].ColumnOffset + picture.PaddingX).ToString()),
            RowOffset = new Xdr.RowOffset((markers[1].RowOffset + picture.PaddingY).ToString())
        };

        var twoCellAnchor = new Xdr.TwoCellAnchor(fMark, tMark, xdrPicture, new Xdr.ClientData());

        worksheetDrawing.Append(twoCellAnchor);
    }
    else
    {
        var ext = new Xdr.Extent { Cx = extentsCx, Cy = extentsCy };
        var oneCellAnchor = new Xdr.OneCellAnchor(fMark, ext, xdrPicture, new Xdr.ClientData());

        worksheetDrawing.Append(oneCellAnchor);
    }
}

元のコードはMarker一つの場合にfromをtoとしても使い、常にTwoCellAnchorを使っていますが、これをOneCellAnchorを使うよう変更しています。あとnew PictureLocks()の箇所ですね。
これでExcelで普通に画像を挿入した場合と同じように埋め込まれるようになりました。

using (FileStream strm = new FileStream(@"sample.png", FileMode.Open))
{
    XLPicture pic = new XLPicture { ImageStream = strm, Name = "test image" };
    pic.AddMarker(new XLMarker { ColumnId = 2, RowId = 3 });
    worksheet.AddPicture(pic);
}

ついでにXLPictureのResize()も少し手を加えると拡大縮小して埋め込めるようになります。

IXLPictureのプロパティにしたNoMoveをtrueにすると埋め込んだ画像が移動できなくなります。NoResizeをtureにするとサイズが変更できなくなります。

XLPictureのPddingX, PddingY(またはEMUOffsetX, EMUOffsetY)にピクセル単位で値を指定するとXLMarkerで指定したセルからのオフセットとして画像が埋め込まれます。XLMarkerのColumnOffset、RowOffsetでもオフセットによる位置指定ができますが、こちらはEMUで指定する必要があるので面倒です。

EEMUOffsetX, EMUOffsetYは設定した値がPaddingX、PaddingYから取得される際にConvertToEmu()を通るので、「設定したピクセル値がEMUに変換されるオフセット」のようです。EMUのつもりで設定するとおかしなことになります。

節分の鬼

家族が仕事の関係で子供にバレンタインデーのチョコレートを配ったようなのですが
並んでいるチョコの箱を見た幼児の言葉が「あれ何かな?」「豆じゃない?」だったとか。

幼稚園や保育園では節分の豆まきはしてもバレンタインデーのチョコレートは配らないんでしょうね。

ここから幼稚園や保育園での豆まきの話になりまして、最近は鬼に豆を投げた後、鬼が謝ってきてもう悪いことはしないから友達になってくれる?等と言ってくるそうです。

でも来年はまた鬼が来て豆をぶつける訳で、全く反省していなかったという事になりませんかね。
やはり鬼らしく「覚えてろ!来年も来るからな!」ぐらいの捨て台詞を言って欲しい気がします。

「夜一人でトイレに行くときは後ろに気をつけろよ!」とかだと苦情がきそうですが。

セイゴ釣り惨敗

某河口に父とセイゴ釣りに行きまして。
父はアオケブ餌釣り、私はルアーでした。

ルアー釣りは仕掛けが簡単ですから、父が仕掛けを作っている間にサクッと一投目。
ルアーはラパラ CD5。

テトラ際にきたところでヒット。25cmぐらいのメッキでした。

本命ではないけれど幸先が良いと喜んだものの、後がまったく続かず。
私のほかにもルアー釣客が2、3人来ましたが、全く釣れずに引き上げていきました。

対して餌釣りの方はコンスタントに良サイズのアジを上げ続け、後半本命セイゴも立て続けにヒット。
惨敗でした。

帰りの車では鼻高々講釈を聞かされる羽目になり、次回は私も餌釣りの準備をして行こうと思いました。

明治時代の建造物を世界遺産登録する一方で古墳を破壊するという一貫性のなさ

東日本最古の古墳「高尾山遺跡」が取り壊されそうというニュース。
http://j-town.net/shizuoka/column/gotochicolumn/208387.html

地元の方々の、生活上の利便性もあるのでしょうが、壊したものは決して戻せず先の世代に残すことができなくなってしまうのですからよくよく検討していただきたいと思います。

国立競技場の件もそうですが、一度決定した計画は決して変更しないという姿勢はどうにかならないものでしょうか。