常陸野ネスト ノン・エール ~ ノンアルビール飲み比べ

常陸野ネストのノンアル
日本の低アルコールビールでいちばんうまい
f:id:nowokay:20210919171339p:plain

おいしい。エールの味がする。
苦めで、ホップの香りもしっかりあって、クラフトビール感があります。
わかりやすく言うと よなよなエールのノンアル版。実際には常陸野ネスト ペールエールのノンアル版というのがいいのだろうけど、伝わりやすさ・・・

ノンアルコールというにはちょっとアルコール高めの0.3%
原材料は麦芽(外国製造)、ホップと炭酸です。


1本あたり240円ですね。

他のノンアルビールについてはこちら。

モレッティゼロ ~ ノンアルビール飲み比べ

イタリアビール、モレッティのノンアル
カートに行くときに早起きしたら @at_tun さんがごほうびにくれた。ありがとう! f:id:nowokay:20210918174325p:plain

0.0%という表記だけど実際には0.05%らしい。 クリーミーで、アロマの匂いがして、ビールでいうとエーデルワイスのような味です。

原材料は水・麦芽・ホップ・アロマ
モレッティビールにはコーンが入っているので、モレッティゼロにもコーンが入ってるかなと思いきや、入ってないようです。

だいたいすぐ品切れになるのだけど、飲み比べセットに入ってるものがありますね。

2021/10/6 ここで買えます
https://item.rakuten.co.jp/tartaruga/653924/

0.05%がどのくらいのアルコールかというと、グレープフルーツ程度、みかん未満という感じか。
f:id:nowokay:20210918175030p:plain
https://www.jstage.jst.go.jp/article/shokueishi1960/33/6/33_6_619/_pdf

他のノンアルビールについてはこちら。

「写経」の原典

書籍とかのサンプルコードをそのまま入力して勉強することを「写経」というけども、それを言い出したのは角谷さん、というメモ。
写経は言葉ではなく心で理解するのが大事。

恐らく2005年7月ごろではないかと思われる。
この夏は写経が来るね, 地震が来た - 角谷HTML化計画(2005-07-23)

角谷さんのブログでの初出も7/15だけど、babieさんのコメントを見るとこの時期にまわりで語ってたことを推しはかることができる。
『カンフーハッスル コレクターズ・エディション』, 『ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道』 - 角谷HTML化計画(2005-07-15)

このころ角谷さんはPofEAA読書会などたくさんの勉強会を主催していたので、そこで広めていたんじゃないだろうか。そもそも「勉強会」という言葉も定着させてないか?

t_wadaの「以前の現場に通いながら」という話はここで語られてる。
第 43 回 和田卓人 さんの巻 | オブジェクトの広場

関数型インタフェースまとめ

Javaには関数型インタフェースがたくさん用意されてるのだけど、なにがあってなにがないのかとかわかりにくいのでまとめている。

ここの最後にまとめていたのだけど、検索しづらいので独立させた
https://nowokay.hatenablog.com/entry/20130824/1377300917

しかし見れたもんじゃないな・・・
下のほうに再掲

第一引数 第二引数 void int long double boolean object R (T=U=R)
    Runnable IntSupplier LongSupplier DoubleSupplier BooleanSupplier Supplier  
int   IntConsumer IntUnaryOperator IntToLongFunction IntToDoubleFunction IntPredicate IntFunction  
int int   IntBinaryOperator          
long   LongConsumer LongToIntFunction LongUnaryOperator LongToDoubleFunction LongPredicate LongFunction  
long long     LongBinaryOperator        
double   DoubleConsumer DoubleToIntFunction DoubleToLongFunction DoubleUnaryOperator DoublePredicate DoubleFunction  
double double       DoubleBinaryOperator      
ObjectT   Consumer ToIntFunction ToLongFunction ToDoubleFunction Predicate Function UnaryOperator
ObjectT ObjectU BiConsumer ToIntBiFunction ToLongBiFunciton ToDoubleBiFunction BiPredicate BiFunction BinaryOperator
ObjectT int ObjIntConsumer            
ObjectT long ObjLongConsumer            
ObjectT double ObjDoubleConsumer            




























第一引数 第二引数 void int long double boolean object R (T=U=R)
    Runnable IntSupplier LongSupplier DoubleSupplier BooleanSupplier Supplier  
int   IntConsumer IntUnaryOperator IntToLongFunction IntToDoubleFunction IntPredicate IntFunction  
int int   IntBinaryOperator          
long   LongConsumer LongToIntFunction LongUnaryOperator LongToDoubleFunction LongPredicate LongFunction  
long long     LongBinaryOperator        
double   DoubleConsumer DoubleToIntFunction DoubleToLongFunction DoubleUnaryOperator DoublePredicate DoubleFunction  
double double       DoubleBinaryOperator      
ObjectT   Consumer ToIntFunction ToLongFunction ToDoubleFunction Predicate Function UnaryOperator
ObjectT ObjectU BiConsumer ToIntBiFunction ToLongBiFunciton ToDoubleBiFunction BiPredicate BiFunction BinaryOperator
ObjectT int ObjIntConsumer            
ObjectT long ObjLongConsumer            
ObjectT double ObjDoubleConsumer            

20年前にPHPでJavaカスタムタグのようなものを実装していた

2001年くらいにPHPJavaカスタムタグのようなものを実装したのを発掘したので放流。

PHPでJavaのカスタムタグっぽいものを実装した2001年 · GitHub

メーリングリストでやりとりをしてたときに
「できらぁ!PHPJavaカスタムタグの実装できらぁ!」
「え、PHPJavaカスタムタグを?」
ってなって、一晩でがーっと作った記憶。
自分だけしか使わない前提で、%var%で変数が埋め込まれる程度のものを作ったのだけど、1年くらい実プロジェクトで使っていた。
600行くらいでコンパクト。
当時は元気があったんだな。

PHP4の時代で、テンプレートエンジンもなかったというかPHP自体がテンプレートエンジンというイメージで まだテンプレートエンジン需要も あまりなかったんじゃないかと。
SynfonyやZend Frameworkもまだ出ていなかった。

こんな感じのテンプレートを書く。

<php:switch condition="%user_type%">
    <php:case value="2">
        <h1>提案書一覧</h1>
    </php:case>
</php:switch>
<pg:exec result="rtn">
    <pg:title field="youki_type_cd">
        <b><pg:result field="youki_type_nm">種類</pg:result></b><br>
        <ul>
    </pg:title>
    <pg:aif href="teian.php?teian=" field="teian_cd"><pg:result field="teian_nm">提案書名</pg:result></pg:aif><br>
    <pg:total field="youki_type_cd">
        </ul>
    </pg:total>
</pg:exec>

そうするとこんなPHPが生成されて、あとはそのままこれを実行する。
そういう動きもJSPのカスタムタグと同じ。
勢いで書いたわりにはよくできてるな。

<?//switch
if (!isset($__phptag_switch_1)) $__phptag_switch_1 = new SwitchTag;
$__phptag_switch_1->parenttag = null;
ob_start();
?><?=$user_type?><?$__phptag_switch_1->attr["condition"] = ob_get_contents();
ob_end_clean();
if ($__phptag_switch_1->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>
    <?//case
if (!isset($__phptag_case_2)) $__phptag_case_2 = new CaseTag;
$__phptag_case_2->parenttag = &$__phptag_switch_1;
$__phptag_case_2->attr["value"] = "2";
if ($__phptag_case_2->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>
        <h1>提案書一覧</h1>
    <?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_case_2->doEndTag();
?>
<?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_switch_1->doEndTag();
?>
<?//exec
if (!isset($__phptag_exec_3)) $__phptag_exec_3 = new PgExecTag;
$__phptag_exec_3->parenttag = null;
$__phptag_exec_3->attr["result"] = "rtn";
if ($__phptag_exec_3->doStartTag() == TAG_BODY_INCLUDE){
$__phptag_exec_3->doInitBody();
while(true){
if ($__phptag_exec_3->doBeginBody() == TAG_SKIP_BODY) break;
ob_start();
?>
    <?//title
if (!isset($__phptag_title_4)) $__phptag_title_4 = new PgResultTitleTag;
$__phptag_title_4->parenttag = &$__phptag_exec_3;
$__phptag_title_4->attr["field"] = "youki_type_cd";
if ($__phptag_title_4->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>
        <b><?//result
if (!isset($__phptag_result_5)) $__phptag_result_5 = new PgResultTag;
$__phptag_result_5->parenttag = &$__phptag_title_4;
$__phptag_result_5->attr["field"] = "youki_type_nm";
if ($__phptag_result_5->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>種類<?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_result_5->doEndTag();
?></b><br>
        <ul>
    <?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_title_4->doEndTag();
?>
    <?//aif
if (!isset($__phptag_aif_6)) $__phptag_aif_6 = new PgResultIfLinkTag;
$__phptag_aif_6->parenttag = &$__phptag_exec_3;
$__phptag_aif_6->attr["href"] = "teian.php?teian=";
$__phptag_aif_6->attr["field"] = "teian_cd";
if ($__phptag_aif_6->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?><?//result
if (!isset($__phptag_result_7)) $__phptag_result_7 = new PgResultTag;
$__phptag_result_7->parenttag = &$__phptag_aif_6;
$__phptag_result_7->attr["field"] = "teian_nm";
if ($__phptag_result_7->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>提案書名<?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_result_7->doEndTag();
?><?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_aif_6->doEndTag();
?><br>
    <?//total
if (!isset($__phptag_total_8)) $__phptag_total_8 = new PgResultTotalTag;
$__phptag_total_8->parenttag = &$__phptag_exec_3;
$__phptag_total_8->attr["field"] = "type_cd";
if ($__phptag_total_8->doStartTag() == TAG_BODY_INCLUDE){
$__phptag_total_8->doInitBody();
while(true){
if ($__phptag_total_8->doBeginBody() == TAG_SKIP_BODY) break;
ob_start();
?>
        </ul>
    <?
$page_content = ob_get_contents();
ob_end_clean();
if ($__phptag_total_8->doAfterBody($page_content) != TAG_BODY_AGAIN) break;
}
}
$__phptag_total_8->doEndTag();
?>
<?
$page_content = ob_get_contents();
ob_end_clean();
if ($__phptag_exec_3->doAfterBody($page_content) != TAG_BODY_AGAIN) break;
}
}
$__phptag_exec_3->doEndTag();
?>

List.of(123, "hoge")の型がこわい。泣きそう。

List.of(123, "hoge")がどんな型になるかを見てみたら、きっとList<Object>になっていて「Objectはどんな値にも対応するんですよー」みたいな説明ができると思っていたら、実際は泣くほど怖い型が出てきた。

`List<Serializable&Comparable<? extends Serializable&Comparable<?>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>&java.lang.constant.Constable&java.lang.constant.ConstantDesc>

という型になっている。

f:id:nowokay:20210624205343p:plain

パッケージ名が邪魔くさいので消してみると

List<Serializable&Comparable<? extends Serializable&Comparable<?>&Constable&ConstantDesc>&Constable&ConstantDesc>

となる。 Genericsは怖いのでComapableのGenericsを消してみるとこんな感じ。

List<Serializable&Comparable&Constable&ConstantDesc>

だいぶ怖くなくなった。

ところで、ConstableとかConstantDescってなんだ?知らない子ですね。

これはJava 12で導入されたConstant APIのインタフェース。
JEP 334: JVM Constants API

Java 11であればこんな感じになる。

jshell> List.of(123, "test")
$1 ==> [123, test]

jshell> /v $1
|    List<Serializable&Comparable<? extends Serializable&Comparable<?>>> $1 = [123, test]

これならわりと怖くない。
ComparableGenericsを取り除くとList<Serializable&Comparable>となって、これなら付き合ってあげていいかなという気持ちになる。こうやってインラインで書ける。

ところでJava 12以降でも、LocalDateなどとの組み合わせであれば怖くない型になる。

jshell> List.of(123, LocalDate.now())
$2 ==> [123, 2021-06-24]

jshell> /v $2
|    List<Serializable&Comparable<? extends Comparable<?>>> $2 = [123, 2021-06-24]

LocalDateにはリテラルがないからConstant Poolに入ることがないのでConstableなどが付かないんだろうか。Comparableの中にSerializableがないのもよい。

あと、Streamとの組み合わせであれば望み通りList<Object>が得れる。

jshell> List.of(123, Stream.of())
$3 ==> [123, java.util.stream.ReferencePipeline$Head@5ef04b5]

jshell> /v $3
|    List<Object> $3 = [123, java.util.stream.ReferencePipeline$Head@5ef04b5]

しかし値がな。