読者です 読者をやめる 読者になる 読者になる

きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

Go言語で、ファイルの「所有者」を拾えるか? You、DLL呼び出しちゃいなよ

golang

発端

java.nio.file.attributeで「所有者」情報が取れる。
PowerShellでも取れる。
では、Go言語はどうだ?

調査

たとえば、C++でそれを行う場合、こういうことをする。
Finding the Owner of a File Object in C++ (Windows)


ここで登場する「GetSecurityInfo関数」はGo言語で使われているか?
調べた結果、使われていない。

大抵のdll呼び出しは、"src/syscall/zsyscall_windows.go"を読むと分かる。

「GetSecurityInfo関数」は、「advapi32.dll」に含まれています。
GetSecurityInfo function (Windows)


Go言語は、内部で「advapi32.dll」を読み込んではいるものの、「GetSecurityInfo関数」を呼び出せるようにはなっていません。
今見ているソースはGo1.8です。

挑戦

ネジがゆるい私は、「よし、DLL呼び出してみよう」と、泥船に足を突っ込んだ。

Go内部では、ロードしているDLLですが、変数が公開されていません。
しかたない、自分でロードすんぜ。

var (
    modadvapi32          = syscall.NewLazyDLL("advapi32.dll")
    procGetSecurityInfo  = modadvapi32.NewProc("GetSecurityInfo")
)

はい、ただのもろパクリです。
あ、でもsysdll.Add()を挟むのは除外しました、なぜならばinternalはコンパイルエラーになるからです。

NewLazyDLLやNewProcについては、「src/syscall/dll_windows.go」に書かれています。

Procには呼び出し用のポインタレシーバが付いてます。

func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) 

とりあえず、引数を全部uintptrで渡せってことか。

1つ目の引数 HANDLE

handleには、ファイルハンドルを渡すことになる。
os.OpenFileして、fileからFdを得ると、それはuintptrなので、そのまま渡してみる。

2つ目の引数 SE_OBJECT_TYPE

今回は、SE_FILE_OBJECTを渡したいわけです。
SE_OBJECT_TYPE enumeration (Windows)

enumで先頭が0初期化してますから、2つ目の定数SE_FILE_OBJECTは、1ってことですね。
これをuintptrで渡すとか、まどろっこしいなぁ。

3つ目の引数 SECURITY_INFORMATION

今回はOWNER_SECURITY_INFORMATIONを渡したいので、おそらく1です
DWORDとあるので、uint32にしときます。

4つ目の引数 ppsidOwner 型はPSID

これが受け取りたい。ぜひ受け取りたい。
でもPSIDって何?
どうやら、可変長な構造であるSIDをポイントしているポインターっぽい。

var psidOwner = make([]byte, uint32(50))
sid := (unsafe.Pointer(&psidOwner))
ppsidOwner := uintptr(unsafe.Pointer(sid))

ちょっと変数名をどうするか、ちぐはぐな感じになったが、こんな感じで書いてみた。
これは、「src/syscall/security_windows.go」にあるfunc LookupSIDを参考にしている。

残りの引数

どうせオプションだし、渡さないことにする。

ダメだった点

1をあらわしている引数をuintptrにして渡してるのがどうもダメっぽかったので修正。
最終的にこの形にした。1をベタ書きです。。。ひどい。なんだコレ。

  r1, r2, lastErr := procGetSecurityInfo.Call(handle, 1, 1, ppsidOwner)


なんとか結果が返ってきた。
ここからバッファ渡してるやつをポイントしなおす。

    ownerSID := (*syscall.SID)(unsafe.Pointer(&psidOwner[0]))
    str, convertErr := ownerSID.String()
    if convertErr != nil {

    } else {
        fmt.Printf("string SID = %s\n", str)
    }

    account, domain, accountType, lookUpErr := ownerSID.LookupAccount("")
    if lookUpErr != nil {

    } else {
        fmt.Printf("account = %s\n", account)
        fmt.Printf("domain = %s\n", domain)
        fmt.Printf("accountType = %d\n", accountType)
    }

ownerSID.String()すると「S-X-X-XX-XXXXXXXX」みたいな形式のSIDが取れてます。
ownerSID.LookupAccount("")するとアカウントがとれました。
このあたりのことは「src/syscall/security_windows.go」を見てください。


こまごました点は考慮していませんが、DLL呼び出せちゃいました。
.

Go言語でzipファイルを作る、ただしWindowsに限る

golang

Go言語でzipファイルを扱うとき、とりあえず"archive/zip"を使いますよね。

しかし、使ってみて、気付いたことがある。

思っていたzipファイルを作ることができなかった。

ちなみに今は古いgo 1.6.2を使ってます。最新は1.8です。

zipのエントリ(zip.FileHeader)を作る方法が複数あるみたいだ。

  • ファイルパスから作る writer.Create(relativepath)
  • FileInfoから作る zip.FileInfoHeader(fileInfo)
  • 自分で作る &zip.FileHeader{}

ファイルパスから作ると細かいことができない。
FileInfoから作ると、unix形式(rwxrwxrxw)が強制される <- SetModeを呼ばせたくない。
仕方ないから自分で作るよ。

属性

一般的なファイルは"A"が7zで表示されます。エクスプローラーの表示を変えれば属性も出せます。

setModeを呼び出すとホストOSがUnixになり、属性もrwx形式になる。
そのため、それは迂回して、自分でExternalAttrsを設定しないといけない。

とりあえず、何を設定すればどうなるのか手で打ち込んでチェックしてみた。

D  ディレクトリ               <- fh.ExternalAttrs = 16
R  読み取り専用               <- fh.ExternalAttrs =  1
H  隠しファイル               <- fh.ExternalAttrs =  2  
A  アーカイブ                 <- fh.ExternalAttrs = 32
S  システム ファイル          <- fh.ExternalAttrs =  4 
I  非インデックス対象ファイル <- 不明。。。力尽きた。
L  再解析ポイント             <- fh.ExternalAttrs = 1024
-  その属性以外

上記の調査は、だいたいあってると思う。
src/syscall/ztypes_windows.go - The Go Programming Language
https://msdn.microsoft.com/ja-jp/library/windows/desktop/gg258117(v=vs.85).aspx


あ、これでいいのかも。

  fh.ExternalAttrs = data.FileAttributes

すみません、dataっつーのは、更新日のところで説明しますが、
fileInfo.Sys().(*syscall.Win32FileAttributeData).FileAttributesということです。

ファイル所有者

java.nio.file.attributeならファイル所有者の情報を取得できるらしい。
goの場合、データをどこから抜いてくるのか発見できてない。
できるんだろうか??

そして、どうやって詰めるんだっけ・・・。
どうも、zipにするときには詰められないように思える。
7zには所有者情報は見えないし。
とりあえず、zipのためには取得する必要はなさそうだ。

おそらく、これを実現するには、fileの情報をもとに、セキュリティ情報を拾って、
その情報をもとにルックアップするイメージなんだろう。(C++でもJavaでもそんなイメージ)

更新日時、作成日時、アクセス日時

更新日時のみであれば、FileHeader#SetModTime(info.ModTime())で十分です。
作成日時とアクセス日時は、FileHeaderのExtraを設定する必要がある。
作成日時とアクセス日時は、FileInfoのSys()から取得する。
とりあえず以下の記事は参考になるでしょう。

 data := info.Sys().(*syscall.Win32FileAttributeData)

これを使ってExtraに突っ込む。
注意事項はリトルエンディアンであるということだ。
どういう[]byteになればいいのかは適宜バイナリエディタでzipファイルを比較確認するほうがいい。
理屈的な形式は、ここが参考になったので是非ご覧いただきたい。
https://opensource.apple.com/source/zip/zip-6/unzip/unzip/proginfo/extra.fld


トルエンディアンを簡単に扱うためには、
"encoding/binary"パッケージのLittleEndianを使うほうが間違いがないが、
bufの先頭から詰めてくるので、Extraのbyte配列に直接詰め込めない。

  binary.LittleEndian.PutUint32(buf, data)

とりあえず自分はこんな感じで書いた。間違ってたらスマン。
序盤は自前でエンディアンを意識して書いたが、後半はbinaryパッケージを利用する関数を用意した。

  data := info.Sys().(*syscall.Win32FileAttributeData)
  var extra []byte
  extra = append(extra, 0x0a, 0x00)             // NTFS @Short
  extra = append(extra, 0x20, 0x00)             // TSize @Short
  extra = append(extra, 0x00, 0x00, 0x00, 0x00) // Reserved @Long
  extra = append(extra, 0x01, 0x00)             // NTFS attribute Tag @Short
  extra = append(extra, 0x18, 0x00)             // Size of attribute#1 @Short
  extra = appendUint32(extra, data.LastWriteTime.LowDateTime)
  extra = appendUint32(extra, data.LastWriteTime.HighDateTime)
  extra = appendUint32(extra, data.LastAccessTime.LowDateTime)
  extra = appendUint32(extra, data.LastAccessTime.HighDateTime)
  extra = appendUint32(extra, data.CreationTime.LowDateTime)
  extra = appendUint32(extra, data.CreationTime.HighDateTime)

あ、すみませんが、infoってのはFileInfoですよ。
filepath.Walkを呼ぶので、WalkFuncを実装していて、引数でFileInfoが渡ってきます。

ホストOS

7zで言うところのホストOSは、FileHeaderのCreatorVersionに相当する。

  fh.CreatorVersion = 11 << 8

意味不明な数字がでてくるでしょう。
goのstructを見ると数字が解るので、それを8ビットシフトして使えばなんとかなる。
この11はNTFS

Creating RHEL7.3 Vagrant Box using Packer and VitualBox on Windows10

Packer Vagrant Red Hat Enterprise Linux
準備するもの。
  1. VirtualBox + Extension Pack
  2. Packer
  3. Vagrant
  4. RHEL

あと、ハッシュ計算できるコマンドも必要かな。
自分の場合はpowershell立ち上げたらmd5sumなどが見つかったけど。
とりあえず、RHEL以外をインストールしてくださいな。

RHELの話

Red Hat Developer Programに参加して、
(登録は必要だけど)無償でRHELを手にいれます。
あくまで個人用で、VirtualBox上で動かします。
VirtualBoxで動かす例は、Red Hatのページでも手順が公開されていますが、
手でペチペチインストールするのが面倒臭くなるので徐々に自動化します。

はじめは手でインストール

anaconda-ks.cfgが欲しいじゃないですか。
それを手直しして、とりあえずこういう感じのにしました。
firewallを書き忘れてたり、ツッコミどころはたくさん。
ミニマムインストールなのに、レポジトリの追加もしてます。
いつか使うかもしれんから勉強のために追加してるだけです。

auth --enableshadow --passalgo=sha512
repo --name="Server-HighAvailability" --baseurl=file:///run/install/repo/addons/HighAvailability
repo --name="Server-ResilientStorage" --baseurl=file:///run/install/repo/addons/ResilientStorage
text
cdrom
firstboot --enable
ignoredisk --only-use=sda
keyboard --vckeymap=jp --xlayouts='jp'
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8
network --bootproto=dhcp --device=enp0s3 --onboot=true --ipv6=auto
network --hostname=localhost.localdomain
rootpw --iscrypted $6$VzSTNp8xLdgMSJNe$Ns6mWbts4wIV9NRt.mZhDaQZLSKuzfEwZ.gXDw3hmVTJtkYbERPhB3jil.OghoOc6yEBtQe6tz9ovbMVvB18E/
services --disabled="chronyd"
timezone Asia/Tokyo --isUtc --nontp
user --name=vagrant --password=$6$hyGjqRR76Cf5KOF9$gwz6bfU8HvYB.15VjAIdKWB8jJAAJ8rlS9kuv6gWfAZNvN9JkmCCJDepiFM4eYNexD2E0.CRjXoEJwOloJUVF. --iscrypted --gecos="vagrant"
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
clearpart --none --initlabel
eula --agreed
reboot

%packages
@^minimal
@core
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end

%post

%end

ネットワークはonboot付けてないと面倒です。
付け忘れた場合はあとでks.cfgのfetchに失敗しますよ。
ユーザとパスワードは以下のとおりです。
root/vagrant
vagrant/vagrant
まあ、Vagrant用のBoxを作る前提ですからね。
日本語うざいんで、langをen_US.UTF-8をメインにしてます。

Packerのファイルを作る

ks.cfgを使う設定ファイル(rhel73.json)を書いた。

{
  "description": "creating rhel 7.3 vagrant box",
  "builders": [
	{
	  "type": "virtualbox-iso",
	  "vm_name": "packer-rhel73",
	  "guest_os_type": "RedHat_64",
	  "iso_url": "file:///C:/Users/{{user `username`}}/Downloads/rhel-server-7.3-x86_64-dvd.iso",
	  "iso_checksum": "34a65dbdfb8d9bb19b3a03d278df2a99",
	  "iso_checksum_type": "md5",
	  "ssh_username": "root",
	  "ssh_password": "vagrant",
	  "shutdown_command": "echo 'packer' | sudo -S shutdown -P now",
	  "http_directory": ".",
      "vboxmanage":[
		["modifyvm", "packer-rhel73", "--memory", "2048"],
		["modifyvm", "packer-rhel73", "--cpus", "2"]
	  ],
	  "boot_command": [
		"<esc><wait>",
         "linux ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg ksdevice=enp0s3<enter>",
		 "<wait>"
      ]
	  
	}
  ],
  "provisioners":[
	{
		"type": "shell",
		"inline": [
			"cat <<__EOF > /etc/sudoers.d/vagrant",
			"vagrant ALL=(ALL) NOPASSWD:ALL",
			"__EOF",
			"chmod 440 /etc/sudoers.d/vagrant"
		]
	},
	{
		"type": "shell",
		"inline": [
			"mkdir -p /home/vagrant/.ssh",
			"chmod 700 /home/vagrant/.ssh",
			"chown vagrant:vagrant /home/vagrant/.ssh",
			"cat <<__EOF > /home/vagrant/.ssh/authorized_keys",
			"ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key",
			"__EOF",
			"chmod 600 /home/vagrant/.ssh/authorized_keys",
			"chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys"
		]
	},
	{
		"type": "shell",
		"inline": [
		    "mkdir -p /media/cdrom",
			"mount /dev/cdrom /media/cdrom",
			"cat <<__EOF > /etc/yum.repos.d/rhel-dvd.repo",
			"[rhel-dvd]",
			"name=Red Hat Enterprise Linux 7.3 - x86_64 - DVD",
			"baseurl=file:///media/cdrom/",
			"enabled=0",
			"gpgcheck=1",
			"gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release",
			"__EOF",
			"yum -y --enablerepo=rhel-dvd install bzip2 gcc make kernel-devel",
			"yum -y --enablerepo=rhel-dvd groupinstall \"X Window System\"",
			"mkdir -p ~/guestaddition",
			"mount -t iso9660 -o loop ~/VBoxGuestAdditions.iso ~/guestaddition",
			"~/guestaddition/VBoxLinuxAdditions.run",
			"umount ~/guestaddition",
			"rm -rf ~/guestaddition ~/VBoxGuestAdditions.iso"
		]
	},
	{
		"type": "shell",
		"inline": [
			"yum -y --enablerepo=rhel-dvd install unzip lsof psmisc",
			"umount /media/cdrom",
			"eject -r /dev/cdrom"
		]
	}
  ],
  "post-processors": [
	{
	  "type": "vagrant",
	  "compression_level": 1
	}
  ]
}

vm名なんかは変えてください。
これは手インストール時に使った名前と被らないようにしただけです。
yum.repos.dへの追加には、addonの類が入ってませんが、好みで追加してくださいな。
ksdeviceを書くのは過去の経験からです。
奇妙なヒアドキュメントの書き方がありますが、これで動きます。
あの配列は改行コード付きで連結されるという仕様があるためです。

簡単に言うとpackerは自前サーバを立てて、http_directoryにあるks.cfgを公開します。
bootコマンドを受け付けた側は、ネットワーク経由でそのks.cfgを見に行きます。
そのため、このときにハマるのはたいていネットワーク系の問題です。

あと、今回メモリは2GBしか割り当ててないですが、RHELは4GB(推奨8GB)です。
おそらくそのあたりが原因でkdumpサービスが起動できてないように思います。

いざビルド
 packer build -var "username=myname" rhel73.json

packerがbootコマンドをチンタラ書いてる様子、いとおかし。
自分の記憶では、その部分はgo-vncで投げていたはずです。


あとは、vagrant box addとかしてください。

細かいことは抜きにすれば、おもちゃにできるRHELを手に入れられたので、
RHELのコアダンプを読む方法について勉強してみようかな。


追記:
反省。
いざ起動してみると光学ドライブがないという話・・・。
vboxmessageに何か加えればいけるやろ。

jmockitのDeencapsulationでstatic finalを書き換えできるの?それは使ってるバージョンによる!

Java

今、迷っている。
書き換えられるっぽい過去の経験、書き換えられない最近の経験が混ざっている。


よし、確かめよう。
ダラダラ書く。

Deencapsulationのコードをgithubで読んだ。(もちろんコール先も読んだ)
https://github.com/jmockit/jmockit1/blob/master/main/src/mockit/Deencapsulation.java
static finalを書き換える特殊なコードは書かれていないようだった。
実際に、自宅の環境では書き換えに失敗している。


自分は、こういうことを予想していた。
modifiersの書き換えをしているんじゃないだろうか。
一旦finalを外して書き込むとか。
ところがそういうのをやっていないようだった。
過去の経験はまやかしか?


実際に、modifiers書き換えによるstatic finalフィールドへの書き込み例はネットでも見受けられる。
final修飾子を除去するコードを書いて試している。
だけども、この方法は完璧ではないと感じたことがあるので書いてみる。

①そもそも正攻法ではない。
Fieldオブジェクトのmodifiersのフィールド名称は実装に依存するから、正式な方法とはいえない。
誰でもそう感じるだろう。

②書き換えた内容が残らない(Fieldオブジェクトのmodifiersの話)
Fieldオブジェクトのmodifiersを変更したとしても、
ClassオブジェクトからgetDeclaredFieldし直すと、
そのmodifiersは本来の値に戻っている。
これはFieldオブジェクトが別物なんだから多少納得がいくだろう。
ちなみにFieldクラスのequalsメソッドはmodifiersを評価していないようだ。

③modifiersの一貫性が損なわれる(FieldオブジェクトのoverrideFieldAccessorの話)
次の例ではまた別のことを考える必要がある。
getDeclaredFieldを叩いたのちに、setAcessible(true)して、setに失敗しているコードがまず存在していて、
その後、取り直した別のFieldオブジェクトに対してmodifiers書き換え版のコードでsetを試みるとしよう。
この場合、書き換えは失敗する。

これの怖くて面白いところは、Fieldオブジェクトそのものが返すmodifiersと、
内部のaccessorが持つmodifiers関連変数の一貫性がなくなることだ。

逆にmodifierを書き換えるコードを先に成功させてしまえば、accessorは書き換え可能な状態で残る。
accessorについては、2度目のgetDeclareFieldでも同じインスタンスが設定されているようだ。

ここで言っているaccessorというのはsun.reflect.UnsafeFieldAccessorImpl系の話をしている。
内部で型に応じたUnsafeFieldAccessorImplのサブクラスが作られている。
setするときは、overrideFieldAccessorフィールドに置かれるっぽい。
final付きのFieldの場合とそうではない場合で、setされるaccessorは異なる。
isFinal変数を持つクラスと、isReadOnlyを持つクラスがいて、
isReadOnlyをfalseに書き換えるとfinal修飾子が付いたまま書き換えることができるようになる。

  1. isFinal : abstract class sun.reflect.UnsafeFieldAccessorImpl extends sun.reflect.FieldAccessorImpl
  2. abstract class sun.reflect.UnsafeStaticFieldAccessorImpl extends sun.reflect.UnsafeFieldAccessorImpl
  3. isReadOnly : abstract class sun.reflect.UnsafeQualifiedStaticFieldAccessorImpl extends sun.reflect.UnsafeStaticFieldAccessorImpl
  4. : class sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl extends sun.reflect.UnsafeQualifiedStaticFieldAccessorImpl

ちなみに、先にmodifiersを書き換えてfinalがついてない場合は、
isReadOnlyを持つクラスは使われていないようだ。(Qualifiedが付かないクラスが使われている)




うーん、Javaの実装に依存するなら、成功したのは非OracleJavaだったからかな。
OpenJDK7の実装もOracleと同じっぽい。
自宅の環境はOracleJavaのjdk1.8.0_121(最新)にあげて試した。
IBMJavaでも試したいのでWASDを用意した。8.5.5.11。
fixpack11から標準でJava8っぽいな。
IBM Java8およびJava7で試したがやっぱりできないよ。
やっぱり過去の経験はまやかしか?



ここからgradleでテストするように変更を加えた。(build.gradleを用意した)
すると、どうだろう、テストが成功し始めるではないか。
はぁぁぁぁぁぁあ!?
落ち着けオレ。
ちゃんと調べた。
凡ミス、modifierの書き換えが一番初めに動いたせいだ。


ふむ、一般的な解決策は、static finalのインスタンスを置き換えるのではなく、
static finalのインスタンスをDeencapsulationでgetして、それをMockUp(インスタンス)して期待する動作を書くとかだ。
インスタンスを引数に渡すとmockitoのspy相当になる。

jmockitのMockUpの場合、インスタンスを書き換えてるからクラスも同じ、setし直しは不要。
mockitoでspyした場合、別クラスの別インスタンスができてるのでsetし直しが必要で、static finalにsetできず困る。


static finalを書き換える方法については、他にsun.misc.Unsafeを使う方法がネットで調べられる。
まあ確かに一番強力な方法であるが、これも正攻法ではない。説明しないでおく。
正攻法でstatic finalを書き換える方法はない。


まやかしがまだ信じられないので追加調査。
やっぱりまやかしではなかったぞ。
jmockitの古いバージョンではmodifiersを書き換えとるやないか。
Dropped the support for setting static final fields through the Deenc… · jmockit/jmockit1@3819065 · GitHub
えっと、どのバージョンまで書き換え可能なんだ・・・。
1.24まで書き換え可能、1.25から書き換えできない。
1.25は2016年6月26日リリース。issues#281でdropしている。

jmockitのバージョンをあげるときの悲鳴は不可避や。

インフルエンザではなく風邪の模様

職場でインフルエンザA型感染者が2名出現。

 

火曜日の昼に、自分も不思議な熱を感じはじめたため、水曜日の午前中に内科に行ってきた。

結論は陰性で問題ない。

 

ここから先は、ふだん行かない場所(内科、処方箋受付)に行ったので、気になったことについて書く。日頃から気付いたことについて考え、なぜそう考えるのかと根源を求める性格。

 

社会人になって内科に行った記憶がない。

風邪を引いても市販の薬と大量の飯で治すタイプだ。

待ち合いはご老人が多い。

ああ、そうか、子供は小児科に行くもんな。

トイレの場所がカーテンの奥とあるが、不思議なところに誘導するんだな。

内科で言われたことで疑問に思ったこと。

インフルは初日から症状がでる。

むむむ、そんな話は聞いたことがない。

潜伏期間とかあるじゃん。

しかも、職場で流行しているのが、インフルエンザのA型なのか、B型なのかを聞いてこなかった。潜伏期間に差があるだろう。。。

医者が操作してソフトが気になった、UIが。。。聖路加病院とかはもっと綺麗なUIだったが、町のお医者さんでは無理からぬこと。

インフルエンザの検査は、鼻の穴の奥から検体を採取する。怖い。差し込まれるものが硬いのか柔らかいのか不安になった。

小さいころ耳鼻咽喉科でしょっちゅう鼻に金属製の器具を差し込まれていたので耐性がある。

 

念のため風邪薬の処方箋を受け取る。

処方箋も久しく受け取ったことがないな。

 

くすりの福太郎に向かう。

40分待ちだそうだ。

長いね。待ち行列を計算するか考えたが、今回は計算しないことにした。

ジェネリックに変更しますかという質問をされた気がする。

はあ、知るかボケ。そう思った。

日本語を話せ。何を言ってるのか分からない。

「同じ効能で低価格なお薬がございますが〜」くらいを言えるようになったほうがいい。

変更するメリット・デメリットが伝わるようにしてくれ。

また、たとえ効能が同じだとしても、医者が処方した薬以外に変更してよい法的な根拠とはどこにあるのか気になった。

 

初来店のため問診票のようなものを書く。

個人情報保護法の記載は、待ち合い室に貼ってあるとか書いてあるのだが、私の視力ではどこに貼ってあるのか確認できなかった。

ふぅ、一字一句の事実確認をしていくのは職業病だ。。。

 

 

待ち行列における女性比率の高さに驚いた。

今回はたまたまなのか。

文句をいう女性がいた。

日本には心のゆとりが足らないんじゃないか。

諸般の事情で順番が前後することがある。

小さな電光掲示板には32番まで呼びましたとある。

あれよあれよという間に私の41番まできた。

32番と思しき女性が立ち上がり文句を言いにカウンターに迫っている。

人がイライラしているのを見ると気分が悪くなる。

あと、女性比率の高さを見て、医療費の男女内訳とか統計があったりしないのかなと思った。

 

薬を配達にきた人が2回はいた。

受け渡しの確認作業をしている。

なんか、受け渡しもそうだけど、効率化できる要素はたくさんありそうだ。

カプセルとかの調合がいらない薬ならロボット任せになる時代はくるかもしれない。

 

 

待ち合いに置いてある雑誌は、なんで美容院に置いてるような雑誌なのか気になった。

男は迷わずMONOマガジンだと。

 

椅子の後ろに張り紙でQRコードがあったので、お薬手帳のアプリをダウンロードしてみた。

これのUIはとてつもなくダサい。

利用者は誰だ。比較的不健康な人だ。

年に1回くらいしか医者にかからない人には必要ないだろ。

基本、老人相手だ。

ただ、スマホを使える老人に限られる。

まず、文字は大きくあるべきだろうし、

ボタンも大きめの方がいい。

画面遷移のたびに画面下部が右からスライドしてくるのがウザい。

職場で私はスマホアプリを作ってないので、こんなところで市場調査しても意味ないのにな。

 

 

 

 

世界最高峰の頭脳集団 NASAに学ぶ決断技法

世界最高峰の頭脳集団NASAに学ぶ決断技法―不可能の壁を破る思考の力

この本を読了した。

 

寸評する。

 

私が感じている問題意識に対して、

相当量の光明を与えてくれた。

その意味で良著と言える。

 

だが、読みにくい。非常に読みにくい。

文章がかなり説明的だ。

図表はそこまで悪くないんだけど、それを頑張って文章で説明している部分が野暮ったい。

「虞(おそれ)」という読みにくい漢字を多用するのはまず変えたほうがいいだろう。

 

 

この本には、大事なことが書いてあると感じているが、これを実践するのはなかなか大変そうだという予感もある。

ただ、より良い意思決定をするために、この本に書いてある内容は見逃せない。

 

 

合理的意思決定、それをここ数年考えている。

情報がデータとして揃うことは少ない。

そんな中で意思決定をする必要がある。

そしてだいたい決断をあまり先伸ばせない。

不確実な部分をどうするべきか。

自分は意思決定をする人間ではないが、意思決定を求める人間ではありえる。

そうなったときに、どのように意思決定を求めることがより合理的な意思決定に繋がるかを悩んでいる。

 

とりあえず、この本から使えそうなエッセンスを抜き出して試していってみよう。

 

 

2016年 大道芸ワールドカップ in 静岡 初日

東京駅からひかりで1時間。

静岡に行きました。

大道芸ワールドカップのリピーターです。

自宅から脚立持参。

 

 

寸評をば。

 

コミックトリオ エクイヴォキー

非常に優秀。正統派コメディ。笑かしてくれます。こういうのを一本必ず見ておきたい。

 

 

ラソテッラ

何かの間違いか。本来男性含む3人なのに、女性2人しかいませんでした。技のバリエーションが減ってしまい、リピーターとしては満足できませんでした。過去に見た自転車モノではトップランクの芸を持ってます。

 

 

うつしおみ

日本人のエアリアルとはアラ珍しい。

エアリアルの技術が非常に高かったと思う。今後の活躍が期待されます。

 

 

イズマ

キレイ、カワイイ。AKBとかにいそう。

しかし和風マジックのはずなのにコンタクトジャグリングから入ってきたのが不満。

全体的にどこで拍手をすべきか悩む。

あと、道具が小さい。それは良くない。

ここで拍手、みたいに、客に拍手をしてもらう時間を与えてほしい。

この世界観の出し方は、屋外では不向きではないだろうか、コンクール向きに思える。

着物脱いだら華奢でした。

 

 

ジェフ ヘス

少し下品な笑いかな。あんまり好きになれなかった。笑える悪ふざけみたいな感じ。

 

 

カナ∞

とにかく元気、客の煽り方に慣れている。フープ芸に磨きがかかってる。見て損はない、いや見た方がいいと推薦していいレベル。

メイン広場で演技できるまでに成長したな。

なんかスイスで賞を取ってきたとか解説されてた。

もうほとんど完成形なんだけど、このあとどうするんだろね。

 

 

クロキキィブラザーズ

大道芸の中では演目が異色。レベル高く、ちゃんと笑わしてくれるし、スゴイと感じさせてくれる。しかし、持ちネタのオチ、途中で気付けたよ、その演目のオチのパターンは少ないから予想できる。でも世界各国で活動できると感じさせられた。

ここ数年、韓国のパフォーマーに感心させられる機会が増えてきた。

 

 

と、ここまで見たあとで、25周年記念特別企画 ザッツ 笑 タイムのチケットを購入。

当日券、初日は840枚も販売されてましたよ。

個人の結論を先に書いておくけど、買うほどの価値はなかったかな。普通のプレミアムのほうは完売してて、そっちのほうが見る価値があると思う。

 

 

開演の一時間前、開場の30分前くらいから並ぶといい。

夜は寒い。ほんとに寒い。寒さ対策をしましょう。野球のナイターを見るのとさほど変わらない寒さです。

ざっくりと500人くらいが来場していたんではないだろうか。

 

 

重複したパフォーマーを除いて寸評。

 

 

イェンタウンフールズ

古典だね。ほとんど古典だね。物足りなかったよ。でも小さい子供にはウケると思うんだ。

すごい長いやつは良かった。

 

 

フレイザー フーパ

客いじりの天才だ。

客が天才だ。

 

 

エル グラン ディミトリ

スベりまくってた。

日本人向きではない気がする。

 

 

ル ヴレ マジョー

んー、ディミトリほどではないが、評価は低い。

 

 

ハイドラゴン

昨年のチャンピオン。

エアリアルなんだけど、手放し多め、妙にゆったり。地味に難しいことをやってるような印象を受けた。他のエアリアルの人はけっこうスピード感歩く技も入れてるんだ。

変な角度で考えると、エアリアルより、おじいちゃんのアコーディオンが実はスゴイのかも。

 

 

エアリアルの技で目を惹くものの一つにこういうのがあります。上から下へ向かって歩くやつです。体は水平、足で布もしくは紐の上を歩くやつ。体重を手では支えてません、体に巻きつけた部分で支えて、歩く歩幅で緩めて、下に降りてくるんです。

 

明日もちょっとだけ見てきます。