end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

認知的焦点化理論 - 利己的な人は長い目で見ると損

先程のentryにある「ダニングクルーガー効果」に関連し 「認知的焦点化理論」の存在を思い出したので、メモ

例えば、以下のurlが分かりやすい

利己的な人は長い目で見ると損をする!? 認知的焦点化理論など、運に関する3つの研究を紹介! | データで越境者に寄り添うメディア データのじかん

Highcharts の オレオレ テンプレート

久しぶりに www.highcharts.com を触ったら、随分と忘れていたので、メモ

https://www.highcharts.com/docs/index

↓こう書くと↑こう表示されます

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
  <a href="https://www.highcharts.com/docs/index">Highcharts documents</a>
  <!-- high chartのrendering先 -->
  <div id="chart_container" style="width:800px; height:400px;"></div>
  
  <script src="https://code.highcharts.com/highcharts.js"></script>
  <script src="my_highcharts.js"></script>
  <script>
    let my_charts = new MyHighCharts();
    my_charts.init_chart("chart_container");
  </script>
</body>
</html>
'use strict';

let chart_tmpl = {
    chart   :{renderTo: 'html_id', // 表示先となるhtml element id
              zoomType: 'xy',
              defaultSeriesType:'column'},
    title   :{text: 'end0tknrのHighchartsテスト',
              floating:true,
              style:{fontWeight:"medium",fontSize:"small"}},
    subtitle:{text: '' },
    xAxis: {categories :[], // X軸(横軸)の各値
            startOnTick:false, endOnTick:false},
    yAxis: [ // Y軸(縦軸)は、複数表示可能
        {title :{text:'温度', style:{color:'#89A54E'}},
         labels:{formatter:()=>{return this.value+'℃'},style:{color:'#89A54E'}},
         opposite: true  //trueの場合,グラフ右側に表示
        },
        {title :{text:'降水量', style:{color:'#4572A7'}},
         labels:{formatter:()=>{return this.value +'mm'},style:{color:'#4572A7'}},
         gridLineWidth: 0},
        {title :{text:'気圧', style:{color:'#AA4643'}},
         labels:{formatter:()=>{return this.value +'mb'},style:{color:'#AA4643'}},
         gridLineWidth: 0,
         opposite: true}
    ],
    series:[
        {name:'降水1',color:'#4572A7',type:'column',yAxis:1,stack:'grp1',data:[]},
        {name:'降水2',color:'#BAD1E6',type:'column',yAxis:1,stack:'grp1',data:[]},
        {name:'降水3',color:'#F5F5F5',type:'column',yAxis:1,stack:'grp2',data:[]},
        {name:'気温', color:'#89A54E',type:'spline',/*spline=曲線*/      data:[]},
        {name:'気圧', color:'#AA4643',type:'',/*折れ線*/ yAxis:2,        data:[],
         marker:{enabled: false},     dashStyle:'shortdot'} ],
    tooltip: {formatter:()=>{var unit = {'降水量1': 'mm',
                                         '降水量2': 'mm',
                                         '降水量3': 'mm',
                                         '気温': '°C',
                                         '気圧': 'mb'}[this.series.name];
                             return ''+ this.x +': '+ this.y +' '+ unit; } },
    plotOptions:{ column: { stacking: 'normal' } },
    legend: {layout:'vertical', verticalAlign:'top',align:'left',
             x:120, y:80,       floating:true,      backgroundColor:'#FFF'},
    accessibility:{enabled:false}, //実行時に何やらwarningが表示される為
    credits      :{enabled:false}, //グラフ領域のhigh chartsクレジット非表示
};

class MyHighCharts {
    constructor() {}

    init_chart=(render_html_elm_id)=>{
        // グラフtemplateのdeep copy
        let chart_src =
            Object.assign({},JSON.parse(JSON.stringify(chart_tmpl)));
        // rendering先となるhtml element idの設定
        chart_src.chart.renderTo   = render_html_elm_id;
        // X軸の値
        chart_src.xAxis.categories = ['Jan','Feb','Mar','Apr','May','Jun',
                                      'Jul','Aug','Sep','Oct','Nov','Dec'];
        // X軸の値
        chart_src.series[0].data=
            [49.9,71.5,106.4,129.2,144.0,176.0,135.6,148.5,216.4,194.1,95.6,54.4];
        chart_src.series[1].data=
            [19.9,41.5,76.4,99.2,114.0,146.0,105.6,118.5,186.4,164.1,65.6,24.4];
        chart_src.series[2].data=
            [39.9,61.5,96.4,119.2,134.0,166.0,125.6,138.5,206.4,184.1,85.6,44.4];
        chart_src.series[3].data=
            [7.0,6.9,9.5,14.5,18.2,21.5,25.2,26.5,23.3,18.3,13.9,9.6];
        chart_src.series[4].data=
            [1016,  1016,  1015.9,1015.5,1012.3,1009.5,
             1009.6,1010.2,1013.1,1016.9,1018.2,1016.7];
        // グラフの実体化
        let new_chart = new Highcharts.Chart( chart_src );
    }
}

Sybase (SAP)では WHERE IN句に複数条件はNG

sqlのwhere in って、複数条件(カラム)を指定できるんですね - end0tknr's kipple - web写経開発

上記entryにある通り、mysqlでは WHERE IN句に複数条件を指定できましたが Sybase (SAP)ではNGらしい

なので、SQLの実行速度は遅いでしょうが

SELECT pla.plan_numw, pla.addition_num, pla.revision
FROM plan_attr pla
WHERE (pla.plan_num+pla.addition_num)
   in ('XXXA5001201','XXXA5002101')
go

のように複数カラムを文字列連結し、 疑似的?に複数条件を指定できるようにしてみます

openpyxl.utils for python による xcelのA1形式座標←→R1C1形式座標の変換

Excel::Writer::XLSX::Utility for perlで excelのA1形式座標←→R1C1形式座標の変換 - end0tknr's kipple - web写経開発

上記entryのようにperlでは Excel::Writer::XLSX::Utility を使用しますが、 pythonの場合、openpyxl.utils.column_index_from_string() や openpyxl.utils.openpyxl.utils.cell.get_column_letter() を使用するようです。

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.utils.cell.html

openpyxl for python の load_workbook()で UserWarning: wmf image format is not supported so the image is being dropped

openpyxl for python で、とある xlsx を load_workbook() したところ、以下のエラー

C:\Users\end0t\python310\lib\site-packages\openpyxl\reader\drawings.py:63:
  UserWarning: wmf image format is not supported so the image is being dropped

wmf は、windows標準のvector画像ですが「not supported」であれば、しょうがいない

perl v.5.38から出力される Locale 'ja_JP.eucJP' is unsupported, and may crash the interpreter.

euc-jpで作成されたコンテンツを扱うサーバのperlをver.5.28→5.38へ更新。

すると、以下の「may crash」のような強め?の警告メッセージが表示。

$ export LANG=ja_JP.eucJP
$ /path/to/bin/perl sample-test.pl
Locale 'ja_JP.eucJP' is unsupported, and may crash the interpreter.

以下のurlによれば、perl 5.38からの仕様変更による表示らしい。

https://perldoc.jp/docs/perl/5.38.0/perl5380delta.pod

次に ver.5.28と ver.5.38 の locale.c を見ると、以下の通りで、 versionにより少々の差はありますが、以前から 「We only handle single-byte locales」らしい。

perl 5.28のlocale.c 抜粋

#  ifdef MB_CUR_MAX

        /* We only handle single-byte locales (outside of UTF-8 ones; so if
         * this locale requires more than one byte, there are going to be
         * problems. */
        DEBUG_Lv(PerlIO_printf(Perl_debug_log,
                 "%s:%d: check_for_problems=%d, MB_CUR_MAX=%d\n",
                 __FILE__, __LINE__, check_for_problems, (int) MB_CUR_MAX));

        if (   check_for_problems && MB_CUR_MAX > 1
            && ! PL_in_utf8_CTYPE_locale

               /* Some platforms return MB_CUR_MAX > 1 for even the "C"
                * locale.  Just assume that the implementation for them (plus
                * for POSIX) is correct and the > 1 value is spurious.  (Since
                * these are specially handled to never be considered UTF-8
                * locales, as long as this is the only problem, everything
                * should work fine */
            && strNE(newctype, "C") && strNE(newctype, "POSIX"))
        {
            multi_byte_locale = TRUE;
        }

#  endif

perl 5.38のlocale.c 抜粋

#    ifdef MB_CUR_MAX
    /* We only handle single-byte locales (outside of UTF-8 ones); so if this
     * locale requires more than one byte, there are going to be BIG problems.
     * */
    if (MB_CUR_MAX > 1 && ! PL_in_utf8_CTYPE_locale
            /* Some platforms return MB_CUR_MAX > 1 for even the "C" locale.
             * Just assume that the implementation for them (plus for POSIX) is
             * correct and the > 1 value is spurious.  (Since these are
             * specially handled to never be considered UTF-8 locales, as long
             * as this is the only problem, everything should work fine */
        && ! isNAME_C_OR_POSIX(newctype))
    {
        DEBUG_L(PerlIO_printf(Perl_debug_log,
                              "Unsupported, MB_CUR_MAX=%d\n", (int) MB_CUR_MAX));
        Perl_ck_warner_d(aTHX_ packWARN(WARN_LOCALE),
                         "Locale '%s' is unsupported, and may crash the"
                         " interpreter.\n",
                         newctype);
    }
#    endif

暫定的に「env LANG=en_US.utf8」を加えて、実行することで、 この警告表示を回避できますが、 eucは随分、マイナーになりつつありますので 根本的には、徐々にでも utf8に移行した方がよさそう。

$ env LANG=en_US.utf8 /path/to/bin/perl sample-test.pl

FreeCADの Compound + boolean演算による一括穴あけ

穴となる円柱をリンクやコピーで複数作成し、 更にCompoundで一体化することで、 boolean減算による複数一括穴あけができるようです。

Compound以外にFuse(Fusion)による一体化でもできる気がしますが、試していません

以下詳細

NGな例 - 穴となる円柱をリンクやコピーで複数作成するのみ

当初、穴となる円柱をリンクで複数作成し、ブーリアン減算を試みましたが、 リンク元の1個の円柱しか選択できず、NG

OKな例 - 更にCompoundで一体化

各穴を複数作成後、更にCompoundで一体化することで、 boolean減算による複数一括穴あけができました。

FreeCAD Part Designで XZ垂直面から押し出す際の向き

FreeCAD Skecher画面で XZ垂直面に四角を描き、 次にPart Design画面のPadで押し出すことで、立体にすると、 手前のマイナスY側に押し出され、直方体が形成されます。

理由は不明ですが「方向/エッジ = カスタム方向」とした上で、 「Y = -1 -> 1」とすると、プラスY側に直方体が形成されるようになります。

FreeCAD Skecherの距離拘束 (Constraint Distance)における +/-

以下の位置関係にある四角スケッチを原点に対し距離拘束を行う場合、 スケッチ側基準の距離となる為、-値(マイナス、負)となるっぽい

一方で、水平距離拘束(Constraint Distance H)や、垂直距離拘束(Constraint Distance V)は、 同様の位置を拘束しても、+値(プラス、正)となるっぽい。

+/-が異なる理由が不明です