何もしないXSLT part.3
何も変更しないXSLTの書き方のXSLT 3.0版をメモしておく。
要点は追加された「on-no-match」という指定。「テンプレートが見つからなかった時」という指定だ。
テンプレートが見つからなかった時はデフォルトのテンプレートが適用されることになっていたのだが、デフォルトのテンプレートの設定を切り替えることができるようになった。
2.0以前はこれが「text-only-copy」という値で固定されていたと考えるといいらしい。今もデフォルトはこれだ。テキストオンリーなので、基本は中身の文字が残る。
下の例にあるように、この値をshallow-copyにするとほとんど何も書かなくてもよくなる。
shallow-copyのshallowは「次の一段階はコピーを適用するが、そこに要素とかがあったらテンプレートを適用せよ」という意味で「浅い」ということらしい。
deepだと「中身の解釈は無視する」。deep-copyはxsl:copyと同じらしい。
設定値は
- text-only-copy
- shallow-copy
- deep-copy
- shallow-skip
- deep-skip
- fail
skipは「中身を捨てる」処理で、shallowなら「中にある要素とかはもう一度テンプレートにかける」がdeepなら「全部捨てる」になる。
failはエラーをはいて変換を止めるための記述。
on-no-matchは本来はモード*1に関する設定なのでモードの名称を指定して属性をセットするものである。
下の記述がよくわからない宣言になっているのは「デフォルト名無しのモード」に対しての宣言だから名前の記述がないせいである。*2
動作モードという全体設定値を変更しているのではない(笑)
3.0はXSLTスタイルシートのパッケージ化とかなかなか豪快な追加仕様があるのだが、あまり使ったことがない。
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0"> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>
*1:XSLTテンプレートのグループ分けをするためのシステム。私は同じ形の名前データでも日本人とアメリカ人で「姓名」「名姓」の順に出力を切り替えたいという時とかによく使う。そういえば、その部分ではモードが違うから注意が必要なのか。
*2:デフォルトじゃなくunnamedだった。そういえばデフォルトのモードのモード名を宣言する方法があったな。まぁデフォルトのデフォルトのモードはunnamedだけど。 https://www.saxonica.com/html/documentation12/xsl-elements/mode.html
URLの表示
邪悪な変更? Chrome 85ではURLバーのドメイン名以外が全て非表示になる可能性も【やじうまWatch】 - INTERNET Watch
URLの偽装については「ユニコードで使える見たことない文字を使った想像外のテクニック」とかがあるので、機械に判断させた「登録されたドメイン」の部分だけを表示する方が安全だと思っている。
「登録されたドメイン」という表現が微妙なのは、「.com.」系のものと「.co.jp.」系のものがあるからである(笑)(あえてルートドメインのドットをつけてみた。)
「.com.」系のgTLDだと二階層目まで、「.co.jp.」系の国別TLDだと三階層目まで。
「google.com.fake.org」だったら一瞥して騙りってわかるけれど、例えば「google.com/apps.fake.org」とか書かれると一目では分からない*1し、「文字の流れを右から左へ」みたいなユニコード制御文字で操作されると見ただけでは絶対分からないからな。
なお、いま該当記事をFirefoxで表示するとURLの「https://internet.watch.impress.co.jp/docs/yajiuma/1259180.html」のうち「impress.co.jp」の部分のみが黒色で、それ以外の部分が淡色で表示される仕様になっていたから、この仕様を過激にしたものだろう。
Chromeではそういう表示になってないので、なぜいきなりそんな先まで進んだのか?と言う気はする。前に一度似たことをしようとしてやめたんだっけ。
トランザクション
読んでいて首をひねる個所が複数あった。
まぁ「何でselectを一つかける前にトランザクション開始したんだ」「rollbackまで一度に書いてから貼れ」っていうのは置いておこう。
現象について
なぜselect一つを実行しただけでテーブルのロックがかかったのかと考えると、どう考えても「ファントムリード対策(トランザクション内部で同じセレクトを発行したのに違う結果が返ってくる可能性があるのでそれを予防する)」が発動していると考えられる。
DBのトランザクションってそこまで考慮してくれたっけ?と思って「トランザクションレベル」で検索すると、PostgreSQLのマニュアルがヒットした。
「リピータブルリード 」か「シリアライザブル」を指定してある場合、ファントムリードが起こらないとされているのでロックはかかるようだ。(バージョンによって若干表記が異なる。)
デフォルトがリピータブルリードらしいので、selectだけでもテーブルロックは発生するようだ。
文中で「明示的ロック」についてのPostgreSQLのマニュアルが引かれているが、それはトランザクションが行ったテーブルロックなので、トランザクションの問題としてはトランザクション分離レベルについて言及するのが正しい。
MySQLでもロックはかかるようなのだが、新しいマニュアルは英語だけだったのでまじめに読んでいない。だが「レコード単位のロックをする」と書かれているようにも見える。
MySQL :: MySQL 4.1 リファレンスマニュアル :: 7.5.9.1 InnoDB と SET ... TRANSACTION ISOLATION LEVEL ...
MySQL :: MySQL 8.0 Reference Manual :: 17.5.1.34 Replication and Transactions
対策について
普通は「selectを一回発行するだけならトランザクションはいらない」「beginからrollbackまでまとめて書いて実行する」のどちらかになると思う。
あるいは「トランザクションレベルを下げる」である。最低レベルの「リードアンコミッティド」で機能的には十分だろうし、それなら多分ロックされない。
その語の記述について
MySQL では
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.5.1 テーブルロックとトランザクションの通信
という項を引いているが、マニュアルを見るところが違う。この件で参照するのはここだ。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.3.1 START TRANSACTION、COMMIT、および ROLLBACK 構文
table lockは明示的にテーブルをロックする命令で、rollbackはトランザクションを巻き戻す命令。系統が違う。
13.3.5.1冒頭の「LOCK TABLES
はトランザクションセーフではないため、テーブルをロックしようとする前に、アクティブなトランザクションをすべて暗黙的にコミットします。」という冒頭の文章を読んで気が付いてほしいところである。
気が付いていないという事はトランザクション中にテーブルロックを明示的に使ってしまって、コミットしてはいけないデータをコミットしてしまうという事故を将来起こす可能性があるので危険である。
逆に「セッションが (たとえば、START TRANSACTION
で) トランザクションを開始した場合は、暗黙的な UNLOCK TABLES
が実行され、既存のロックが解放されます」という記述もあった。
引用されている個所は「トランザクションによって発行されたテーブルロックはロールバックで解除されるが、トランザクション中でユーザーが明示的に行ったテーブルロックはトランザクションの対象にならないので解除されない」と書かれているだけだろう。
何もしないXSLT part.2
最近、また同じようなXSLTを書いたので、前に書いたのと見比べてみた。
前のもの
<xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="*"> <xsl:copy> <xsl:apply-templates select="*|@*|text()" /> </xsl:copy> </xsl:template> <xsl:template match="@*"> <xsl:copy /> </xsl:template>
新しいもの
<xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="node()"> <xsl:copy> <xsl:apply-templates select="node()|attribute::*" /> </xsl:copy> </xsl:template> <xsl:template match="attribute::*"> <xsl:copy /> </xsl:template>
node()になっている方がコメントノードとかもコピーできて良いような気がする。
以前に書いたものはtext()を宣言しているが、これは必要なんだっけ?
…「*」ではテキストノードにマッチしないからか。
「attribute::*」より「@*」の方が文字数が少ない分「正義」かもしれない(笑)
旅館とホテル
外国人が心底ガッカリする「日本の旅館事情」 | レジャー・観光・ホテル | 東洋経済オンライン | 経済ニュースの新基準を見て思ったこと
なんというか、想定している『旅館』がそもそも違ってる気がする。
元々が『富裕層向け』を想定している話だったんだから、『下手すると客より従業員が多いんじゃないかと思う高級旅館』について扱わないといけないはずではないか。
しかし記述されている旅館は団体客向けの2から2.5流の旅館が想定されているようだ。そもそも、旅館もホテルも一流どころは団体客を泊めたがらないものなのだ。なのに『「団体旅行」を対象に発展』してきた旅館を対象に考えているんだからそりゃ話が通らない。
普通に1.5から2流ぐらいをキープしている旅館を想定していると、なに言ってるんだこの人?という気持ちになる。
- 問題点1:長期滞在に不向き
料理は連泊するならそれに合わせて変更されるのが普通。
というか、そもそも旅館にも素泊まりだってあるし、料理が主体のホテルもある。
頭が固すぎる。
- 問題点2:ファミリー層に不向き
コンドミニアムでもない限り普通はホテルもほぼ同じ料金体系だが、何が言いたいのか。
個人的には逆に『旅館に一人で泊まる場合の部屋代上昇が大きい』ことは気になる。たぶん、部屋数が少ない旅館が多いから遺失利益が大きく取られているのだろう。
- 問題点3:ルームサービスが不十分
安い旅館だからだろう。安いホテルと同じ。
だが、旅館には『明示的なリスト』がない事は多い。…しかしホテルのサービスチェックでは『リストに無いこと』を頼むものだったな。
そもそも本来の話である「富裕階級」の宿泊需要に関していえば、最初からサービスのリストなんて気にしないだろう。リストを見るのは金額を気にする人間だ。
普通のレベルの旅館なら、仲居や女将に頼むとたいていの手配はしてくれるだろう。女将はコンシェルジュに該当する(笑)
- 問題点4:「夜のエンターテインメント」がない
意味不明。部屋が寝るところであるだけなのであって、それ以上でも以下でもない。
もし芸者を揚げて騒ぎたいなら座敷に呼んでくれるだろう。京都の一流なら茶屋に移動するものかもしれない。
- 問題点5:老朽化が目立つところも
旅館の営業形態の問題じゃない。
なお、うちの両親は仲居さんにポチ袋に入れた「心付け」を必ず渡そうとする、そういう世代です。かつて日本にもチップはありました(笑)
但し最近は現金を受け取ることが経営側から禁止されているのが普通らしいので、無理に渡さないように。土産物を買っていくといい、とか聞いたことがありますが。
今はその分が宿泊費に含まれているので、その分割高に見えている可能性があります(笑)
あとついているブックマークコメントを見て、『君達は何をしに長期休暇に行くんだ?』と思わされました。長期休暇を一泊二日の連続でこなすつもりか?逆に疲れるぞ?もっとゆっくりこなすものだろう。
そして、ジョブスの定宿だった京都の旅館、アレ一応JTBとかから申し込めることにはなっているんだけど、本当に申し込めるのだろうか。申し込める状態だったのを見たことがない。単に通常は予約がぎっしり埋まっているだけかもしれないけど、基本が「紹介」ベースで客を取ってるのではないかとも感じる。京都だし。*1
■
トランプ政権:定例会見10メディア排除 記者会が抗議 - 毎日新聞
▽新聞
ロサンゼルス・タイムズ
ニューヨーク・デーリー・ニューズ
英デーリー・メール
▽テレビ
CNN
英BBC
▽政治専門メディア・ニュースサイト
ポリティコ
ザ・ヒル
バズフィード
※ジャーナリスト保護委員会(CPJ)の声明から。このほかニュースサイトのハフィントン・ポストも参加を拒否されたとして抗議している
つまりこれらの情報源は「ブライトバード」とは違うという事か(笑)