ワーク・ライフバランス社の働き方改革講演を聴講したのでまとめる

働き方改革に関する講演を聴く機会があったので、内容をまとめてみる。

まとめ方について

ざっくりと表面だけなぞる。

講演では論理的に、かつ資料や数字などの根拠やソースも適宜用いて説明に割いていたが、そこまでメモできてない&講演資料も展開されてないので、そのあたりのまとめは本記事では一切しない。

講演元

株式会社ワーク・ライフバランス さん。

働き方改革とは何か

「社畜(残業を厭わない男性社員)の長時間労働」に物を言わせた働き方を、社畜以外の多種多様な人間が短時間で成果を出せるような働き方に変えること。

※便宜上、前者を レガシースタイル、後者を モダンスタイル と呼ぶことにする。

働き方改革はなぜ必要なのか?

国視点と個人視点で一つずつ。

理由1. 【国】レガシースタイルがもはや通用しないから

そもそもレガシースタイルが通用していたのは昔の話。

昔:

  • 人口ボーナス期 といって、若者が多く高齢者が少なかった
    • 大量のニーズを満たすために、とにかく労働すればよかった
    • 当時は仕事として重工業(≒力仕事)が多かったため、筋肉の多い男性が適していた
    • 強い労働力を確保するために、会社は社員に重圧(パワハラやハードワーク)をかけた
      • 労働力は替えが利いたので「重圧に耐えられないとクビだよ?」と脅すことで社員を奮起させた

ところが今は時代が違う。レガシースタイルは通用しない。

今:

  • 人口オーナス期 といって、若者が少なく高齢者が多い
    • 技術や文明の発展が進み、ニーズが高度化・多様化している
    • 国が高齢者対応(社会保障)に忙しく、経済発展を後押しできない
    • ただでさえ少ない若者(労働力)が、育児や介護で退いていく

今の時代に対応するためには、働き方をレガシーからモダンに変える必要がある(モダンスタイルの解説は後述します)。そうしないと高齢化社会に押しつぶされちゃうよ。財政破綻するよ。

理由2. 【個人】仕事がなくなっても対応できるよう自己鍛錬が必要だから

  • これからの時代、少ない労働力で成果を出さねばならない
  • 単純な仕事は AI 等、技術によって奪われていく
  • 成果を出すためには自己鍛錬(スキルアップや人脈づくり)が必要

しかし会社で長時間働いていては自己鍛錬する暇もないし、そもそも精力的に生きるための身体や精神が蝕まれているケースもある。働き方改革によりモダンスタイルに変えて、プライベート時間を担保&心身ともリフレッシュしてやれば、どんどん自己鍛錬していけるようになる。

モダンスタイルってどんな働き方?

確たる定義は無かったので、イメージが湧きそうな事項を適当に書き殴ってみる。

色んな人をなるべく生かす

色んな人とは、たとえば以下。

  • 育児に時間を取られる人
  • 介護に時間を取られる人
  • 障害を持っている人

レガシースタイルだと上記の人は切り捨てるが、オーナス期の今、労働力は貴重なので、これらの労働力もなるべく生かさねばならない。そのためには時短勤務やリモートワークなど、レガシーには無かった工夫(色んな人がなるべく働けるような配慮と仕組み)が必要。

短時間で成果を出す

オーナス期の今、労働力の単価は高いので、長時間働いてると人件費がヤバイ。短時間で成果を出さないといけない。といってもいきなり出せるはずもなく、徹底的な効率化とトレーニングが必要(やり方の一部は後述します)。

男性が長時間働かないこと

第一子を出産した後、夫が働き詰めだと、妻は孤独な育児に苦しむことになる。第二子を産む気が失せる。オーナス期を乗り越えるためには子供が必要なので、これはよくない。

じゃあどうすればいいかというと、夫が育児に参画して、妻の負担を和らげること。そのためには夫、つまり男性が長時間働かないことが重要となる。働き方改革=女性の活躍、女性への配慮、と短縮化されがちだけど、そうじゃないよという話。

WFB ではなく WLB

WFB:

  • Work Family Balance
  • 育児や介護を抱えてる人のみが配慮される
  • 独身者などは配慮されない
    • 独身者にも事情があるのに
    • というか事情無くてもプライベート充実させたいやん?自己鍛錬もしたいし

WLB:

  • Work Life Balance
  • 対象は全従業員

働き方改革ってどこまで進んでるの?

国や企業の取り組みをつらつらと。

月100時間超えたら罰則、に法律改正

  • 今までは労働時間長くても罰則は無かった
  • 今後は法律で、月100時間を上限にした罰則を儲ける

勤務間インターバル制度

徹夜明けなどキッツイ時間外労働をしたら、一定時間は強制的に休ませる(インターバル)という制度。

背景:

  • 人間、しっかり寝ないと集中力が回復しない
  • 職種や状況によっては、どうしても時間外の長時間労働が必要になる。どうすればいい?
  • 国「じゃあ仕事終わったら強制的に休ませる制度をつくりますよ(つくることを義務付けしますよ)」

働き方改革改革宣言

「うちは働き方改革してる素晴らしい企業ですよ」ってのをアピールするキャンペーンが活発化している。

企業データを載せたサイト

「女性管理職率」みたいな値を見れるまとめサイトもある。

女性が活躍できる≒働き方改革に取り組んでいる、なので、ここを見れば各企業の取り組み具合がわかる。今時の学生はここから企業を推し量っているらしい。

働き方改革の進め方

各種手順、手法、考え方などを雑多に書き殴る。

無題

特に名前はついてなかったが、

  • 1 女性の積極採用
  • 2 長期間休んでも就業復帰できる制度の整備
  • 3 長時間残業の是正
  • 4 成果主義の定義修正

これを 4 → 3 → 2 → 1 と取り組んでいくことが改革の目安になるみたい。逆に 1 → 2 → 3 → 4 の順で取り組むのは間違い(1と2を整備しても3と4が無いと結局離れていく)で、この間違い犯しちゃう企業さん、多いらしい。

長時間残業を減らす方法4つ

  • 属人性の排除(たくさん残業してる人の仕事を分散)
  • 不要な仕事を削る
    • 社内資料作成とか
    • 社内でしか通用しない仕事で張り切るのをやめる。言い換えると、対外客に対する仕事のスタンスと同じにする(対外客相手だと余計な仕事はしないよね、それを社内でも心がける)
  • 無駄話を減らす(特に立場のある管理職)
  • ITスキル不足の解消

カエル会議

PDCA サイクルで進められるようなフレームワークがあるみたい。

kaeru_kaigi

出典: タイムリミットはあと2年! 「今」働き方改革が必要な理由 | スマートワーク総研

朝メール

毎朝、今日の予定と一言をメールでチームメンバーに共有する。

自分のデイリータスクリストをつくる習慣づけと、自分の現状を共有する効果がある。

集中タイム

「私、集中してるんで話しかけないでください」な時間帯を設ける&周知させること。

他にも色々

なんか 10-20 個くらい名前が出てたけどメモしきれず。

そういえば「100社あれば100通りのやり方がある!」という一文で締めくくられていたっけな。

働き方改革の事例

企業の例が 10 個はあったけどメモしてないので覚えてない。

書籍って無いの?

これ。

働き方改革の必要性を後押しする理論的・数値的根拠も豊富に載っているっぽい? 講演中も多数紹介されていたが、メモ取れるはずもなく&資料共有もされてないため、ここでは紹介できず。

質疑応答

Q: 定時前に呼び出されて「明日までにやれ」的なことが多いんだけど、どうすればいい?

Ans: 原因を一つずつ潰していくしかない。

  • 例1: 契約が曖昧 → 追加料金もらうようにする
    • 契約を厳しくすると仕事が取りづらい?技術があればそれでも取れるよ

Q: 早く帰るのが絶対に良いわけではない。別に帰りたくない人もいる。そういう人に対してはどう啓蒙すればいい?

Ans: その人の真意を引き出して、会社に居る必然性がなければ帰ってもらう

  • 例: 「もっとバリバリ働きたいんです!」な人
    • 聞き出してみると、真意は「成長したい」「~~になりたい」だった
    • この場合、長時間残業は必要ではない。プライベートでも勉強はできるよね。つーか会社から給料もらいながら成長したいってのは甘えだぞ?

おわりに

SlideShare で資料無償公開したり YouTube で配信したりしてくれたら、もっと広まっていいのになぁと思ったけど、これでご飯食べてるから仕方ないのかな。

(A;;CCLCSWLORC;;;AU) ← こんな呪文みたいな随意アクセス制御リストを読み解いてみた

Windows 10 で IME が一切合切動作しなくなった話 にて sc sdset schedule D:(A;;CCDC…… みたいなコマンドを扱ったのだが、このコマンド、何してるのかさっぱりわからん。どうも「随意アクセス制御リスト」という仕組みらしい。

何も知らないのは気持ち悪いので、資料 サービスの随意アクセス制御リストを作成する場合の推奨事項およびガイド に従って読み解いてみる。

今回読みたいもの

以下の呪文。

sc sdset schedule D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;IU)(A;;CCLCSWLORC;;;AU)(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCLCSWLORC;;;BU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

呪文を整理する

上記だと読みづらいので読みやすくしておく。行単位で分けてみた。

sc sdset schedule
D:
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;IU)
(A;;CCLCSWLORC;;;AU)
(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)
(A;;CCLCSWLORC;;;BU)
S:
(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

呪文の構成要素1: sc sdset

sc sdset XXXX で「サービス XXXX のセキュリティ記述子を設定する」という意味になる。つまりは随意アクセス制御リストを指定してセキュリティ設定を変えるということ。

ここでは sc sdset schedule を扱っている。schedule とは Task Scheduler のサービス名。つまり sc sdset schedule は「Task Scheduler のセキュリティ設定を、随意アクセス制御リストを指定して変えますよ」という意味になる。

(おまけ): 設定を見たいなら sc sdshow

sc sdshow XXXXX を実行すると、サービス XXXXX のセキュリティ記述子を閲覧できる。

呪文の構成要素2: D: とか S: とか

Windows のアクセス制御リスト(ACL) には DACL と SACL の二種類ある。

D: は随意アクセス制御リスト(Discretionary Access Control List、DACL) を意味する。本記事で扱うのもここ。例では五つ分のリストがある。

S: は System ACL を意味する。日本語名は不明。用途は管理者がログを見れるようにすることで、いわゆる Windows の「監査」機能に絡む部分。詳しいことはよくわからん。本記事では扱わない。例では一つだけリストがある。

参考: Access Control Lists | Microsoft Docs

呪文の構成要素3: A;;XXXXXXX の部分

いよいよメインに入る。ただし DACL(随意アクセス制御リスト) のみ解説する。SACL は取り上げない。

まず全体像は以下のようになっている。

<可否指定>;;<アクセス許可を変更したい操作名の列>;;;<SID>

これが意味するのは、

「SID が示すオブジェクト」に対して、「指定した操作を行う権限」を、「付与(許可) or 剥奪(拒否)」する

という具合。

可否指定

Aだと許可。Dだと拒否。

SID

SID とはセキュリティ識別子の意で、Windowsのオブジェクト(ユーザー等の資源や各種機能)を識別する識別子のこと。

例: S-1-5-21-917266621-1342861121-1792158721-512

厳密な仕様は英語だが [MS-DTYP]: SID あたりを読むこと。

この SID だが、随意アクセス制御リストでは Well Known SID という「よく使われる SID」の「短縮形」を入力する

短縮形の正式名称は このガイド にて端的にまとまっている。

IU = 対話型ログオン ユーザー
AU = Authenticated Users
BA = ビルトイン (ローカル) の Administrators
SY = Local System
BU = ビルトイン (ローカル) の Users
WD = Everyone (World)

アクセス許可を変更したい操作名の列

アクセス許可を変更したい操作を 2文字1操作 で列挙していく。2文字略称と操作名の対応はやはり このガイド が端的。

例: CCDCLCSWRPWPDTLOCRSDRCWDWO を読み解いてみる

まずは見づらいので分解する。

CCDCLCSWRPWPDTLOCRSDRCWDWO

  ↓

CC
DC
LC
SW
RP
WP
DT
LO
CR
SD
RC
WD
WO

続いて、ガイドを参考に、正式名称を併記してみる。

CC = QueryConf
DC = ChangeConf
LC = QueryStat
SW = EnumDeps
RP = Start
WP = Stop
DT = Pause
LO = Interrogate
CR = UserDefined
SD = Del
RC = RCtl
WD = WDac
WO = WOwn

だいぶわかりやすくなった。この CCDCLCSWRPWPDTLOCRSDRCWDWO という呪文は、「QueryConf と、ChangeConf と、QueryStat と、……WOwn。以上の操作についてアクセス許可を変更したいです」という意味になる。

ここで「QueryConfって何やねん」という疑問が浮かぶ……が、残念ながら解説資料にはたどり着けず。リファンレンスがあると思うんだけどなぁ。ご存知の方、いらっしゃったらぜひ教えてください。とりあえず Start/Stop はサービスの開始/停止だよね?

まとめてみよう

呪文の構造について整理できた。では、今回読みたい呪文について、改めて読み解いてみよう。

もう一度、今回読み解く呪文を載せる。

sc sdset schedule
D:
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;IU)
(A;;CCLCSWLORC;;;AU)
(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)
(A;;CCLCSWLORC;;;BU)
S:                                        ★ 今回は SACL は扱わないので
(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)   ★ この二行の読解はしない。

ここから今回扱わない SACL 部分を省く。

sc sdset schedule                      ★Task Scheduler のセキュリティ設定を、
D:                                     ★随意アクセス制御リストを使って変更する、の意。
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;IU)
(A;;CCLCSWLORC;;;AU)
(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)
(A;;CCLCSWLORC;;;BU)

Task Scheduler のセキュリティ設定を変える、というところまで読めた。残りは、

(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;IU)
(A;;CCLCSWLORC;;;AU)
(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)
(A;;CCLCSWLORC;;;BU)

この部分。

これを上記ルールに従って読み解くと、こんな感じになる。

  • 対話型ログオンユーザーについて、QueryConf, ChangeConf, QueryStat, EnumDeps, Start, Stop, Pause, Interrogate, UserDefined, Del, RCtl, WDac, WOwn の操作を、許可(Allow)します
  • Authenticated Users について、QueryConf、QueryStat、EnumDeps、Interrogate、RCtl の操作を、許可(Allow) します
  • ビルトイン (ローカル) の Administrators について、……
  • Local System について、……
  • ビルトイン (ローカル) の Users について、……
  • Everyone (World) について、……

※すいません、途中で面倒くさくなったので一部書けてません(変換スクリプト書くべきでしょうね。人間がやる仕事じゃない)。

ともあれ、何をやっているのかがなんとなく見えてきた。

おわりに

呪文みたいな随意アクセス制御リストの読み方を最低限理解できたと思う。

これでひとまず「実は rmdir /s /q c:\ みたいな悪さしてるんじゃないか?」という懸念は解消できたかな。

※これは「c:\ 配下の全てのファイルをいきなり削除する」コマンドである。たまーにだけどネット上で「その問題はこのコマンド叩いたら解決するよ」というシャレにならないイタズラをする人がいて、知らない人が泣きを見ることがある。私も Windows 10 で IME が一切合切動作しなくなった話 の対応は機械的にコピペで実行しちゃったので、もしこれと同じ類の罠があったとしたら……と不安になっていた。今回、読み方をこうして理解してみて、罠は無いとわかったので一安心。

参考

p.s. 本記事を全部書いてから気付いたのがが、★1 のページ、日本語で網羅的にまとまっててわかりやすい。この記事書いた意味ないなぁ……

コマンドプロンプト実行時に自動で実行するコマンドを定義する(.bashrc みたいなやつ)

Windows のコマンドプロンプトでも .bashrc みたいなことを実現する方法。

やりたいこと

コマンドプロンプトを実行した時に C:\github\stakiran\dotfiles\autorun\autorun_comp.bat が実行されるようにしたい。

手順

(1) 実行させたいバッチファイルを書く

autorun_comp.bat

@echo off
prompt $$ 

ここではプロンプト文字列を $ に変えるだけ、というシンプルな例。

その気になれば doskey でエイリアスを設定したり、set で環境変数いじったりもできる。ただし doskey には環境変数の伝搬が無い(ゆえに更に cmd を立ち上げると引き継がれない)ので 一工夫 必要。

(2) コマンドプロンプト起動時の自動実行を有効にする

レジストリをいじって、1 のバッチファイルを指定してやる。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="C:\\github\\stakiran\dotfiles\\autorun\\autorun_comp.bat"

参考

Windows 10 で IME が一切合切動作しなくなった話

1時間くらい格闘した。

現象

  • 日本語が打てない
  • Google 日本語入力のツールバーが出ない
  • 以下を試しても効果無し
    • コントロールパネルや設定から言語関連の設定をいじる
    • Google 日本語入力を上書きインストールする

なんていうか根本からイカれてるな、という感触。

原因

Task Scheduler サービスが無効(Windows 起動時に起動しない設定)になっていた

Task Scheduler は Windows の各種サービスやら何やらをスケジューリング実行するサービスなんだけど、IME 関連の機能は全部ここから起動されるようになっている。なので Task Scheduler 自体が起動してないと IME も起動されない。

解決方法

一言で: Task Scheduler を有効にした上で Windows を再起動する

参考: タスクスケジューラの無効状態を戻せません - マイクロソフト コミュニティ

以下、詳細手順。

  • 1: sc sdset schedule D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;IU)(A;;CCLCSWLORC;;;AU)(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCLCSWLORC;;;BU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD) を実行する
    • これしないと services.msc から Task Scheduler の設定を変更できない
  • 2: services.msc から Task Scheduler を有効にする
  • 3: Windows 再起動

これで IME も起動して日本語入力も打てるようになるはず。

あとは後始末として必要なら

  • 4: sc sdset schedule D:(A;;CCLCSWLORC;;;AU)(A;;CCLCSWRPDTLOCRRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCLCSWLORC;;;BU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

も実行しておく(Task Scheduler の設定を変えられないよう元に戻す)。

FAQ

Q: 結局 Task Scheduler が無効になった原因は何?

Ans: 不明

ググってみると「Windows Update のせい」という見解が多い模様。

Q: この呪文みたいなコマンドは何?

アクセス制御エントリという Windows の仕組みらしい。呪文みたいな構文は「セキュリティ記述子定義言語 (SDDL) 構文」と呼ぶのだとか。ガッツリ勉強しないとさっぱりわからないレベル。

参考: サービスの随意アクセス制御リストを作成する場合の推奨事項およびガイド

Go 言語の遅延実行 defer がピンと来なかったのでわかりやすくまとめた

具体例で段階的に理解を試みるアプローチ。

初期化、処理、後始末をする例

例として初期化、処理、後始末をするコードを考える。

package main

import "fmt"

func initialize(){
    fmt.Println("初期化")
}

func work(){
    fmt.Println("なんか処理する")
}

func terminate(){
    fmt.Println("後始末")
}

func main() {
    initialize()
    work()
    terminate()
}

実行結果は以下のとおり。

初期化
なんか処理する
後始末

処理の途中でエラーが起きたとする

ここで、処理の途中で何かエラーが起きたとしよう。コードでは panic() 関数を使って無理矢理発生させている。

package main

import "fmt"

func initialize(){
    fmt.Println("初期化")
}

func work(){
    fmt.Println("なんか処理する")
    panic("処理の途中でなんかエラー起きた") // ★
}

func terminate(){
    fmt.Println("後始末")
}

func main() {
    initialize()
    work()
    terminate()
}

実行結果は以下のとおり。

初期化
なんか処理する
panic: 処理の途中でなんかエラー起きた

エラーが起きた時に後処理が実行されてない。後処理は必ず実行するものだ。実行させたい。さてどうするか。

後処理を実行させるために defer を使う

ここで defer が登場する。

package main

import "fmt"

func initialize(){
    fmt.Println("初期化")
}

func work(){
    fmt.Println("なんか処理する")
    panic("処理の途中でなんかエラー起きた")
}

func terminate(){
    fmt.Println("後始末")
}

func main() {
    initialize()
    defer terminate() // ★defer付けた&順番変えた
    work() // ★
}

実行結果は以下のようになる。

初期化
なんか処理する
後始末
panic: 処理の途中でなんかエラー起きた

エラーで落ちる前に後処理(後始末)が実行されている。defer を指定し、かつ実行順序を(エラーが発生する)work() の前に書いたおかげだ。

この defer、内部的には何してんの?

ただ、これだけだと defer について、まだピンと来ない。

もう一つ例を出す。

package main

import "fmt"

func initialize(){
    fmt.Println("初期化")
}

func work(){
    fmt.Println("なんか処理する")
    panic("処理の途中でなんかエラー起きた")
}

func terminate1(){
    fmt.Println("後始末1")
}

func terminate2(){
    fmt.Println("後始末2")
}

func terminate3(){
    fmt.Println("後始末3")
}
func main() {
    initialize()
    defer terminate3() // ★ defer を使った呼び出しを複数定義してみた
    defer terminate2() // ★
    defer terminate1() // ★
    work()
}

これを実行すると以下結果が出る。

初期化
なんか処理する
後始末1
後始末2
後始末3
panic: 処理の途中でなんかエラー起きた

defer の定義では 3 → 2 → 1 と書いているが、実際は 1 → 2 → 3 の順で実行されている。これはどういうことか。

結論を言うと スタック である。もっと言うと 「スコープから抜ける時に必ず実行するヤツら」スタック だ。

まず defer X を行うと、内部的には X がスタックに入れられる。で、このスタックだが、(この defer を定義したスコープから抜ける時)に Go 言語がチェックして、中身を全部実行するようになっている。実行順はスタックだから LIFO、つまり後入れ先出しだ。

ここでもう一つ重要なのは エラーが起きた時もスコープを抜ける ということ。

func main(){
  work1()
  work2() // ★ここでエラーが起きたら、ここで main() のスコープを抜ける
  work3() //   work3 以降は実行されない
  work4()
}

ここまで押さえれば defer の挙動についてイメージが湧くと思う。

おわりに

まとめ:

defer X は「スコープから抜ける時に必ず実行するスタック」に X を Push する処理である

TODO: Go言語の実装を見て真実を確かめる(いい線言ってるとは思う) or ご存知の方教えてください。。。

Minio のアクセスキーは最低3文字、シークレットキーは最低8文字必要

最低限の config で Minio を動かしたい場合、アクセスキーやシークレットキーも手抜きするんだけど、 Unable to load the configuration file: invalid credential in conf エラーが出てしまう。具体的に何がおかしいかまでは出ない。

調べてみたところ、たぶん以下が Minumun な config.json だと思う。

{
    "version": "26",
    "credential": {
        "accessKey": "333",
        "secretKey": "88888888"
    }
}

アクセスキーは最低3文字、シークレットキーは最低8文字必要みたい。

念の為ソース見てみると、pkg/auth/credentials.go#L28 このあたり。抜粋すると、

const (
    // Minimum length for Minio access key.
    accessKeyMinLen = 3

    // Maximum length for Minio access key.
    // There is no max length enforcement for access keys
    accessKeyMaxLen = 20

    // Minimum length for Minio secret key for both server and gateway mode.
    secretKeyMinLen = 8

    // Maximum secret key length for Minio, this
    // is used when autogenerating new credentials.
    // There is no max length enforcement for secret keys
    secretKeyMaxLen = 40

    // Alpha numeric table used for generating access keys.
    alphaNumericTable = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    // Total length of the alpha numeric table.
    alphaNumericTableLen = byte(len(alphaNumericTable))
)

うん、間違いなさそう。

オブジェクトストレージサーバー Minio を簡単に試してみた on Windows

前提

  • Windows Server 2016
  • Minio Verion: 2018-06-29T02:11:29Z

Minio とは?

  • オブジェクトストレージサーバー
  • 実行ファイル minio.exe 一つで動くシンプルさ
  • ブラウザ用 UI も
  • Amazon S3 互換のインターフェイス体系(CLIとかREST APIとか)なので S3 勢には使いやすい

動かすまで

ディレクトリ構造

たとえば以下のように配置する。

+ minio
 - minio.exe
 + data
 + config
  - config.json

実行コマンドライン

$ cd <WORKDIR>\minio
$ minio.exe --config-dir config server data

これで「config フォルダ配下の設定ファイルを使って」「data フォルダ配下にデータを格納する」オブジェクトストレージサーバーが立ち上がる。

アクセスする

minio.exe を実行すると、利用に必要な情報が色々アウトプットされる。

$ minio.exe --config-dir minio\config server minio\data

Endpoint:  http://10.0.0.1:9000  http://127.0.0.1:9000
AccessKey: aaaa
SecretKey: aaaaaaaa

Browser Access:
   http://10.0.0.1:9000  http://127.0.0.1:9000
...

たとえばブラウザで使いたいなら Browser Access 部分の URL を開けばいい。開くとアクセスキーとシークレットキーを訊かれるので、表示されてるのを打つ。

ブラウザ UI

アップロード:

  • バケットを作る(Create Bucket)
  • バケットの中にファイルをアップする(Upload file)

ダウンロード:

  • バケットを開く
  • 表示されたファイルを選択して Download object

config.json について

まずは何も作らないで minio.exe を立ち上げる。するとデフォ設定で config.json が生成。これをベースにカスタマイズする。

ガイドは Minio Server config.json Guide - Minio あたりを読む。

最低限の config.json

アクセスキーは最低3文字、シークレットキーは最低8文字あれば動く。

{
    "version": "26",
    "credential": {
        "accessKey": "333",
        "secretKey": "88888888"
    }
}

これに満たない場合、 Unable to load the configuration file: invalid credential in conf みたいなエラーが出てしまう。

config の version って何?

ガイドでは

determines the configuration file format. Any older version will be automatically be migrated to the latest version upon startup. [DO NOT EDIT THIS FIELD MANUALLY]

と言っている。要するに「Minio のバージョン毎に微妙に config のフォーマットが異なる」という状況があるのだが、「どのバージョンのフォーマットを使うのか」という指定をこの version フィールドで行う。基本的に minio.exe 側で決めるためユーザーはいじってはならない。

もうちょっと中身を知りたいなら ソースを見る のもアリ。構造体でズラっと定義してある。

data はどのように保存される?

たとえば

$ minio.exe server data

と実行した(data フォルダ配下に保存)上で、バケット bucket1, bucket2 にそれぞれ data1.txt と data2.txt をアップロードした場合。

data
├─.minio.sys
│  │  format.json
│  │  
│  ├─buckets
│  │  ├─bucket1
│  │  │  └─data1.txt
│  │  │          fs.json
│  │  │          
│  │  └─bucket2
│  │      └─data2.txt
│  │              fs.json
│  │              
│  ├─multipart
│  └─tmp
│      └─xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
├─bucket1
│      data1.txt
│      
└─bucket2
        data2.txt

噛み砕くと、こう。

+data
 +bucket1
  -bucket1にアップしたファイル
  -...
 +bucket2
  -bucket2にアップしたファイル
  -...
 +その他内部的な設定情報など

Windows の at コマンドでリマインダーを実現する

Windows にデフォで入ってる at コマンドを使えば、コマンドラインからワンライナーでリマインダ-を実現できる。コマンド派にとっては実用的なリマインダーになるかもしれない。

前提

  • Windows 7 Pro
    • Home だと本記事の方法は使えません
    • Win10 以降でもダメです

リマインダーを登録する

at HH:MM msg console MESSAGE を実行する。

$ at 11:20 msg console リマインダーです
新しいジョブをジョブ ID = 4 で追加しました。

すると 11:20 になった時に、以下ダイアログが表示される。

f:id:stakiran:20180705195003j:plain

登録済のリマインダーを確認する

at を実行する。

$ at
状態 ID     日付                    時刻          コマンド ライン
-------------------------------------------------------------------------------
        2   明日                    11:20         リマインダーです

リマインダーを削除する

at 2 /delete で ID=2 のリマインダーを削除。

at /delete で全てのリマインダーを削除(確認アリ)。

at /delete /yes で全てのリマインダーを削除(確認無し)。

Q: 即座に実行されるリマインダーは登録できますか?

Ans: できません

たとえば現在時刻が 11:25 の時、at 11:25 msg console リマインダーです を実行したとしても、このリマインダーは即座に表示されません。翌日の 11:25 に表示される リマインダーとみなされてしまいます。

Q: Win10 以降の OS で使いたいんですがどうすればいいですか?

Ans: schtasks コマンドを使ってください

ただし at コマンドよりもだいぶ引数が煩雑で面倒くさいです。

Markdown を HTML で読む手段として MkDocs と MDwiki を試したので優劣を書く

Markdown は書きやすく、そこそこ読みやすい記法だが、それでも plain text なので不便である。定石は HTML に変換して読むことだと思う。で、その変換手段として色々あるんだけど、今回は MkDocs と MDwiki を比較してみる。

前提

記事のまとめ方

  • V.S. の形で「どちらが優れているか or ドローか」を主観でまとめている
  • 細かい使い方や拡張方法などは取り上げない

MkDocs とは?

いわゆる静的サイトジェネレータ(ビルドすることで原稿ファイルから HTML ファイルを生成するタイプ)。分かる人向けに言えば「Markdown で書ける Sphinx 」。

MDwiki とは?

mdwiki.html#!index.md にアクセスすると index.md を HTML に変換して表示してくれるツール。

使い分けについて

「一人用 or チームメンバー間で見るだけ」みたいな小さい単位で、てっとり早く HTML で読みたいなら MDwiki。

ただ MDwiki は読み心地が微妙なのと、カスタマイズの能力にも限界があるのとで、そのうち物足りなくなってくる。そうなったら MkDocs が良いだろう。導入やカスタマイズは難しいが、MDwiki を凌ぐ読み心地とカスタマイズ能力を持っている。

(1) 導入面

Winner: MDwiki

導入ハードル

Winner: MDwiki

MDwiki はダウンロードした MDwiki.html を配置するだけで完了する。MkDocs は Python と pip のインストールが必要。

HTML 変換の手間

Winner: MDwiki

MDwiki はページ読込時に動的に変換するので変換コストはゼロ。MkDocs は事前にビルドが必要。

ライセンス

Winner: MkDocs

MDwiki には additional terms(追加条項)として「(MDwikiのクレジットが表示された)フッターを消すなよ」等があり、商用ユースでは若干不格好かなという印象。

(2) 見た目

Winner: MkDocs

URL のキレイさ

Winner: MkDocs

  • MkDocs: https://example.com/hoge.html
  • MDwiki: https://example.com/index.html#!hoge.md

CSS カスタマイズ

Draw.

どちらも CSS をいじって見た目をカスタマイズできる。

テーマの変更

Winner: MkDocs

MkDocs はサポートしている。MDwiki はサポートしていない。

(3) 生成サイトの使い心地

Winner: MkDocs

TOC(目次)

Winner: MkDocs

MkDocs は TOC の生成が安定しているし、テーマ次第だが見出し階層をインデントで階層表示してくれたりもして見やすい。

というより MDwiki の TOC は出来が悪い。中見出し(## ...)しか表示してくれない、目次が長いと見切れたり消えたりするバグがあるなど。

ナビゲーションバー

Draw.

どちらもサポートしている。ネストも可能。

細かいことを書くと、

  • MDwiki: navigation.md に書き並べる&表示は画面上部にバーのみ
  • MkDocs: mkdocs.yml に書き並べる&表示はテーマ次第(上部にバーだったりサイドバーだったり)

全文検索

Winner: MkDocs

MkDocs は検索できる。それでもデフォルトでは日本語検索できなかったりするが、 material テーマでは設定を追加すればできるようになる みたい。

MDWiki は検索機能がそもそも無い。

見出しのアンカーリンク

Draw.

MkDocs はテーマによって生成したりしなかったり。

MDwiki は生成するが、アンカーマークが見出し行の次行に表示される(そして表示時に行が動的に一つ増えるため表示全体がずれる)のが微妙。

ローカルサイトへのアクセス

Winner: MkDocs

MkDocs だはローカルに置いた index.html も普通に読める。

MDwiki だと IE と Chrome では読めない(Chrome ではコマンドライン引数を付け加えればできる)。これは MDwiki は動的に md ファイルをロードするせいでブラウザ側のセキュリティに引っかかってしまうため。

(4) Markdown 記法

Winner: MDwiki

サブリストのネスト表記

Winner: MDwiki

MDwiki は 2 スペースでも動く。MkDocs では 4 スペースでないと動かない。

URL の自動ハイパーリンク化

Winner: MDwiki

MDwiki はしてくれる。MkDocs はしてくれない。

(5) その他未分類

SEO 効果

Winner: MkDocs

MkDocs は静的サイトなので SEO 対策できる。というより MDwiki がコンテンツを全部動的に生成するために SEO 対策しづらい。

サポート状況

winner: MkDocs

MkDocs は 2018/06/28 現在も活動している。MDwiki は(いつからか知らないけどたぶんここ数ヶ月の間に) Read Only になっている

Python boto3 で InsecureRequestWarning を消す方法2つ

方法1: 環境変数を使う

PYTHONWARNINGS 環境変数に "ignore:Unverified HTTPS request" を書いておく。

以下は Windows の例。" があると動かないので注意。

$ set PYTHONWARNINGS=ignore:Unverified HTTPS request
$ python script_with_boto3.py

方法2: urllib3.disable_warnings() を使う

urllib3.disable_warnings() を使えば良いことは知っていたが、消えてくれない。なぜだと思ったら、

import botocore.vendored.requests.packages.urllib3 as urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 上記コードは boto3 を import する前に実行する必要アリ !!
import boto3

これで解決。 「Boto3にバンドルされてるrequests」にバンドルされてる urllib3 に対して disable_warnings() してやる必要があった。

が、これはトリッキーだし、OS によっては使えないらしいので、方法1 が確実だと思う。

参考

suppressing warnings for unverified certificates? · Issue #699 · boto/boto3

秀丸エディタマクロの利用ハードルを下げるために知っておくと良いこと

秀丸エディタのマクロ機能は便利ですが、マクロと聞くと「難しそう」「いまいちよくわからない」「結局マクロを使うために何をすればいいの?」とハードルの高さを感じる方も多いのではないでしょうか。

というわけで、ハードルを下げるために知っておくと良いことをまとめてみます。

マクロの登場人物

まずマクロを語る上で欠かせない登場人物をまとめます。

マクロファイル

秀丸エディタをどう操作するかという命令(スクリプト)を記述したファイル。拡張子は .mac。

スロット

秀丸エディタに用意されている「実行したいマクロを配置する穴」のこと。 この穴に入れたマクロでないと実行できない。一つのスロットには一つの .mac ファイルを入れる。スロットは計80個ある。

マクロを実行するまでの流れ

登場人物を把握したところで、続いてマクロを実行するまでの流れを取り上げます。

  • (1) 入手
    • .mac ファイルを自分で書く or 誰かが書いたものを入手する
  • (2) 登録
    • .mac ファイルをスロットに入れる(登録する)
  • (3) 呼び出し方法の割り当て
    • スロットに入れたマクロをどうやって呼び出すかを決めて設定する
    • 例1: スロットに「ショートカットキー」を割り当てる
    • 例2: ツールバーに「スロットを呼び出すボタン」を配置する
    • 例3: その他メニュー > コマンド一覧 > メニュー/マクロ から直接呼び出す
  • (4) 呼び出し
    • (3) で割り当てた方法を使って呼び出す

重要なのは .macファイルの準備スロットへの登録呼び出し方法の割り当て という 3 ステップが必要という点です。逆を言えば、この 3 ステップさえ抑えておけばマクロを簡単に使えるようになれます。

各ステップについて

以降は、各ステップの手順について画像付きで紹介していきます。

(1) .mac ファイルの入手

入手方法として以下があります。

.mac ファイルはどのフォルダに配置しても構いませんが、便宜上「マクロを置く用のフォルダ」を決めて、そこにまとめるのが楽でしょう。

(2) .mac ファイルをスロットに登録

次に .mac ファイルをスロットに登録しましょう。

f:id:stakiran:20180627203459j:plain

マクロ > マクロの登録を開きます。

f:id:stakiran:20180627203518j:plain

マクロ登録画面が開くので、空いているスロットに「表示名」と「.macファイルのパス」を入力します。

パスは「...ボタン」を使えばファイル選択ダイアログで選べるので楽です。

(3) スロットに入れたマクロに呼び出し方法を割り当てる

スロットに入れたら、呼び出し方法を割り当てます。ここではツールバーにボタンを配置する方法と、ショートカットキーで呼び出せるようにする方法の二つを取り上げます。お好みの方法を使ってください。

3-1: ツールバーに割り当てる

f:id:stakiran:20180627203821j:plain

まずはツールバー領域を右クリック > ツールバー詳細を。

f:id:stakiran:20180627203848j:plain

するとツールバーカスタマイズ画面が開くので、右ペインに上図のようにスロットを表示させた後、追加ボタンで左ペイン(ツールバー)に追加していきます。

f:id:stakiran:20180627204028j:plain

完了すると、ツールバーにボタンが表示されると思います。これをクリックすると当該のマクロ(ここでは change_tabname マクロ)を実行できます。

3-1: ショートカットキーに割り当てる

f:id:stakiran:20180627204127j:plain

その他 > キー割り当てを開きます。

f:id:stakiran:20180627204137j:plain

キー割り当て画面が開くので、まず左ペインで「割り当てたいショートカットキー」を選びます。上図は Alt + R に割り当てる例です。

続いて、そのショートカットキーに対応する操作を右ペインから選びます。スロットに登録したマクロを選びます。

OK ボタンを押すと、設定したショートカットキーで対応するマクロを呼び出せるようになります。

(余談) 実は割り当てなくても呼び出せる

実はツールバーやショートカットキーに割り当てなくても、スロット内のマクロを呼び出すことができます。

f:id:stakiran:20180627204355j:plain

その他 > コマンド一覧を開きます。

f:id:stakiran:20180627204404j:plain

すると左上にメニューが出ます。メニュー/マクロ > 開きたいマクロ、と辿って実行することができます。

(4) 呼び出し

あとは割り当てた方法(ショートカットキーを押す、ツールバー上のボタンをクリックする)でマクロを実行するだけです。

おわりに

もう一度まとめると、マクロを実行するまでに必要なことは以下 3 手順です。

  • (1) マクロファイル(.mac)を入手する
  • (2) 秀丸エディタのスロットにマクロファイルを入れる
  • (3) スロットに呼び出し方法を割り当てる

ここさえ抑えておけば混乱はしません。あとは手を動かすだけです。

マクロはとても便利なので、利用を渋っている方も、これを期に利用してみるといかがでしょうか。まずは公式サイトの マクロライブラリ あたりを見てみると、便利なマクロが見つかることでしょう。

DES, AES, TKIP, WEP, WPA, WPA2 の違い

紛らわしいので違いを簡単にまとめた。

DES と AES と TKIP

いずれも暗号化方式(データをどうやって暗号化/復号化するかというアルゴリズム)。

安全度: DES < TKIP < AES

  • DES は古い。セキュリティが弱い。使ってると解読される恐れがあるので使わないべき。
  • AES は現在の主流。
  • TKIP は DES と AES の間くらいの強さ。AES が使えるなら使わなくてもいい。

WEP と WPA と WPA2

いずれも「無線通信のセキュリティに関するプロトコル」。これらプロトコル中には「どの暗号化を使うか」という項目があり、それ次第で WPA/AES(AESを使う)、WPA/TKIP(TKIPを使う) などに分かれる。

安全度: WEP < WPA < WPA2

  • WEP は古い。セキュリティが弱い。使ってると通信を乗っ取られる可能性がある。使っちゃダメ。
  • WPA は現在の主流。
  • WPA2 は WPA よりも更にセキュリティが強い。主流になりつつある。使えるなら使えばいい

Python の xlrd ライブラリを用いて Excel ファイルのシート内容を Markdown に落とす

Excel ファイルは非常に読みづらいので、Markdown に変換して「表ではなくテキストファイルを読む感覚で」読み進めたいなと思った。Python の xlrd ライブラリだと簡単に Excel ファイルを辿れそうだったので、今回試しに作ってみた。

以下 xlrd の使い方やテクニカルな部分をさらっと解説。

xlsx ファイル全般情報

open_workbook() で読み込んで、nsheets でシート数、sheet_names() でシート名のリストが取れる。

import xlrd
bookobj = xlrd.open_workbook(ファイル名)
sheet_count = bookobj.nsheets
sheet_names = bookobj.sheet_names()

各シートへのアクセス

open_workbook() で手に入れたオブジェクトの sheet_by_index() を呼ぶ。引数に「取得したいシートの番号」を入れる。番号は 0 オリジン。つまり一番左のシートが 0 番で、一つ右は 1 番、次が 2 番……という風に対応付いている。

sheet = bookobj.sheet_by_index(取りたいシートの番号)

あとは、得られた sheet オブジェクトに対してあれこれ操作する。今回はシート中の全セルの内容が欲しいので、

  • ncols でシートのカラム(列)数、nrows で行数を取得
  • ncols と nrows の値でループして、各セルにアクセスする

というやり方を使った。

xsize = sheet.ncols
ysize = sheet.nrows

for y in range(ysize):

    for x in range(xsize):
        cell = sheet.cell(y, x)
        value = cell.value

ここで value(セルの値) は以下のように変換される。

  • 値が文字列 → string 型
  • 値が数字 → int or float 型

セルには文字列も数字も入っていることがあるので、「文字列だったらこうする」「数字だったらこうする」と条件分岐をしっかり書いておいた方がいい。

列番号を列名(0,1,2→A,B,C)に変換する

Excel だと列は A, B, C, ... AA, AB, ... という風にアルファベットで列を識別するが、xlrd 上では番号で識別される。

表示する際、番号よりも列名の方が直感的でわかりやすいので、本スクリプトではついでに変換も行っている。といっても xlrd の機能ではないので自分で頑張って書かねばならない。

def column2alphabet(column_number):
    div = column_number
    s = ''
    temp=0
    while div>0:
        module = (div-1)%26
        s = chr(65 + module)+s
        div = int((div-module)/26)
        return s

なにやら割り算と剰余が登場しているが、この変換はいうなれば 10 進数を 26 進数に変換するようなものである。26 進数は 26 通りの表現パターン(ここではアルファベットa-z)があるので、元の 10 進数を 26 で割った余りを見ることで「26パターンのうちの何パターン目か」を順に取得していっている……とでも言えばいいか。進数変換はそういうものだ。

参考(というかほぼ流用): python - Convert spreadsheet number to column letter - Stack Overflow