tohokuaikiのチラシの裏

技術的ネタとか。

データのどれだけの個数を調べれば、だいたい「まぁ、いいかな」って言えるか。

食品総合研究所 :食品のサンプリングに関するガイダンス〜品質情報解析ユニット から。

10000個、製品があってこの中の不良品を見つけられる確率の話。1個でも不良品があってその存在が致命的な場合は全品検査になる。 全品検査が大変な時は、サンプルN個だけを抜き出して検査をしたいが、どれだけのNを検査すればいいのかの妥当性を知りたい。

ポイントは、見逃し率。これをできるだけ下げたいが、Nが多すぎても面倒なのでその経済効率の最大リターンポイントを見つける。

ただし、1個の検査をするときにその検査による判定は100%の確からしさで判定できるものとする。

用語の設定

  • 不良品率:全体の何%が不良品かの確率。
  • 見逃し率:サンプルN個検査をした際に、どれくらいの確率でそれが「不良品が存在した」と発見できるかの確率。

計算方法

1個の製品をチェックする際に、それが不良品でありかつ不良品であると判定できる確率を計算する。パーセンテージで考えると100掛けたり割ったり面倒なので、確率は少数でやる。

合格品発見確率 = 1 - 不良品率
N個全てが合格品である確率 = (1 - 不良品率)^N (^はNの乗数を意味する)
N個のうち1個でも不良品が見つかる確率 = 1 - (1 - 不良品率)^N 

この「N個のうち1個でも不良品が見つかる確率」というのは、「不良品を発見できる確率」とも言えます。つまり、「1-見逃し率」

1 - 見逃し率 =  1 - (1 - 不良品率)^N 

となる。

Nについて解くと、

N = log(見逃し率) ÷ log(1 - 不良品率)

となる。

はてなスターAPIを使ってはてなブックマークコメントについた★の数を得る

はてなスター取得APIというのがある。

はてなスター取得 API - Hatena Developer Center

これで、はてなブックマークのコメントについた★の数を得ようとする。

例えば、https://anond.hatelabo.jp/20180518171957 に付けた私のブックマークの★の数はこの記事を執筆時点で91個。

このブックマークのURLは、http://b.hatena.ne.jp/entry/364742428/comment/tohokuaiki でカノニカルだと思われる。

なので、先ほどのAPIに従って、
http://b.hatena.ne.jp/entry/364742428/comment/tohokuaiki
をくっつけて
http://s.hatena.com/entry.json?uri=http%3A%2F%2Fb.hatena.ne.jp%2Fentry%2F364742428%2Fcomment%2Ftohokuaiki
で取得できるのかな?と思ったらだめだった。

正解は
http://b.hatena.ne.jp/tohokuaiki/20180525#bookmark-364742428
をくっつけて
http://s.hatena.com/entry.json?uri=http%3A%2F%2Fb.hatena.ne.jp%2Ftohokuaiki%2F20180525%23bookmark-364742428
なのである。なんだよ、このアンカー入りのURLでパーマリンク設定するのって…。

WordPressで特定の投稿タイプで特定の部分だけ自動整形のPタグを消す (wpautopを動作させない)

filterの削除・追加とショートコードを使う

custom_posttype投稿タイプの場合。

<?php
    /* 特定の投稿タイプはautopをしない */
    remove_filter('the_content','wpautop');
    add_filter('the_content' , function($content){
        $post_type = get_post_type();
        if ($post_type != 'custom_posttype'){
            $content = wpautop($content);
        }
        return $content;
    });
    add_shortcode('wpautop', function($attr, $content){
        $post_type = get_post_type();
        if ($post_type == 'custom_posttype'){
            $content = wpautop($content);
        }
        return $content;
    });

で、本文では、

この部分はautopが効く。

[wpautop]
この部分は、そのまま出る。
この部分は、そのまま出る。
[/wpautop]

という感じ。

ApacheのProxyをかます途中でBasic認証を入れてConfluenceにアクセスさせようとしたら失敗した件

よくある1サーバーでConfluenceを複数稼働させたい場合のリバースProxy設定ですね。

こんな感じ。
f:id:tohokuaiki:20180416182940p:plain

あるいは、iptablesで無駄にポートを開けたくない場合とか。

で、内輪向けのConfluenceなんで、Basic認証をかければゼロデイアタックとかも多少は防げるんじゃないかって思ってBasic認証つけたかったんです。

Basic認証は通るけど、ConfluenceでAuthエラー

余裕じゃん・・と思ってこんな感じでProxy設定にBasic認証の設定をかけたわけです。

<VirtualHost *:80>
    <Location />
        Order deny,allow
        Allow from all
        AuthType Basic
        AuthName "Authentication"
        AuthUserFile /etc/apache2/htpasswd
        Require valid-user
    </Location>
    ProxyTimeout 8000
    ProxyRequests Off
    ProxyPreserveHost On
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1
    ProxyPass / http://localhost:8090/ retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse / http://localhost:8090/
</VirtualHost>

すると、こんなエラーが出る。
f:id:tohokuaiki:20180416183247p:plain

HTTPステータス 401 - Basic Authentication Failure - Reason : AUTHENTICATION_DENIED
type ステータスレポート
メッセージ Basic Authentication Failure - Reason : AUTHENTICATION_DENIED
説明 This request requires HTTP authentication.
Apache Tomcat/8.0.50

なんでTomcat側でエラーが出るんだ????

と思い、Tomcat使ってるのはConfluenceなのでこちら側を疑う。Confluenceで一旦ログイン後に、ApacheBasic認証をつけるとこのエラーは出ない。

ということは、Confluenceは

  1. COOKIEによる認証を試みる
  2. COOKIE認証に失敗した場合、Basic認証のAuthorization ヘッダから認証を試みる

となっているのではないか???

余計なことしてほしくないなぁ…と思い、そのAuthenticateをしているだろうプラグインを探す。
f:id:tohokuaiki:20180416182401p:plain

なんとなくこいつっぽいなーって思い、「無効」にしたが全然だめだった。

Confファイルを探すもなんか見つからない…。

ということで、Apache側で設定

だったら、Proxyする際にAuthenticationヘッダを送らなければいいんじゃんって思って、Apacheにmod_headersを導入

# a2enmod headers

した後に、apache.conf(debianなんでsites-enables内だけど)を書き換えて

    RequestHeader unset Authorization

を追加。

すると問題なくConfluence側がBasic認証をやめてくれた。

Confluence、REST and os_authTypeとか読むとquery stringsにos_authType=basicって入れないとBasic認証ヘッダをスルーしてくれそうなんだけどな。ま、いいや。。

PHPで制御文字を取り除く

ほかのプログラミング言語はたくさんあったのだけどPHPが無い。

Strip control codes and extended characters from a string - Rosetta Code

こんな感じかな。

<?php
function stripCtrlCode($string)
{
    $ctrl_code = array(
        "00", // NULl(ヌル)
        "01", // Start Of Heading(ヘッダ開始)
        "02", // Start of TeXt(テキスト開始)
        "03", // End of TeXt(テキスト終了)
        "04", // End Of Transmission(転送終了)
        "05", // ENQuiry(問合せ)
        "06", // ACKnowledge(肯定応答)
        "07", // BELl(ベル)
        "08", // Back Space(後退)
        /*    "09", // Horizontal Tabulation(水平タブ) */
        /*    "0A", // Line Feed(改行)*/
        "0B", // Vertical Tabulation(垂直タブ)
        "0C", // Form Feed(改ページ)
        /*    "0D", // Carriage Return(復帰)*/
        "0E", // Shift Out(シフトアウト)
        "0F", // Shift In(シフトイン)
        "10", // Data Link Escape(伝送制御拡張)
        "11", // Device Control 1(装置制御1)
        "12", // Device Control 2(装置制御2)
        "13", // Device Control 3(装置制御3)
        "14", // Device Control 4(装置制御4)
        "15", // Negative AcKnowledge(否定応答)
        "16", // SYNchronous idle(同期信号)
        "17", // End of Transmission Block(転送ブロック終了)
        "18", // CANcel(取消)
        "19", // End of Medium(媒体終端)
        "1A", // SUBstitute(置換)
        "1B", // ESCape(拡張)
        "1C", // File Separator(ファイル分離)
        "1D", // Group Separator(グループ分離)
        "1E", // Record Separator(レコード分離)
        "1F", // Unit Separator(ユニット分離)
        );

    $code_array = array();
    foreach ($ctrl_code as $code){
        $code_array[] = hex2bin($code);
    }

    return str_replace($code_array, "", $string);
}

って作った後に軽くググったら

制御文字を取り除く方法(改行コードは保持) - Qiita

<?php
return preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $string); 

ってあって、なんだか ( ´_ゝ`)って表情になった。