はてなブログ内の全記事を効率良く修正するためにインポートが使えるかを実験してみた

つまり、エクスポートしたテキストファイルをローカルで修正した後、これをインポートすることで、実質ローカルで全記事を修正したかのような行動を実現できるかどうか。

結論

無理です。

頑張ってやるとしたら、こうなる

  • (1) エクスポートする
  • (2) エクスポートしたファイルを編集・修正
  • (3) ブログ中の記事をすべて削除する
    • ただし 管理画面からは一度に 20 件ずつしか削除できない
  • (4) 2 のデータをインポートする
    • インポートは結構時間かかる
    • 1記事1秒くらいは見た方がいいかも
    • 内部的には他ドメインの画像を全部解析して、あとでフォトライフにインポートできるようにしている

20件削除縛りと、インポートに時間がかかるのがネックか。

本手順実行時に想定される懸念

  • 削除中にアクセスしに来た人がこんがらがる
  • 削除中にクロールに来た Google が「このブログなんかおかしくね?」と否定的な判断をする可能性

スパム扱いされることはないと信じたいが……。それまで記事がたっぷりあったブログが、いきなりすっからかんになる(なり始める)と、Google さんはどう解釈するのだろうか。

(余談) インポートの仕様

  • インポートは常に 新規追加 の挙動になる
    • たとえば全く同じファイルを n 回インポートしたら、各記事は n 個重複して存在することになる
  • インポートは、インポート後に取り消すことができる
  • 取り消しを行うと、当該インポートの対象だった記事を書き換えていた場合でも、当該記事は消える

はてなブログを新規作成する時に「使用できない文字」が含まれていないのに「使用できない文字が含まれています」と怒られる件

はてなブログ新規作成時に少しハマったのでメモ。

新規作成時に、使用できない文字を使っていないのに

使用できない文字が含まれています。英数字で始まり、ハイフンと英数字が続く必要があります。

とエラーが出て作成できない、という問題に出くわした。

原因

使用禁止キーワードが含まれているせい

たとえば hatena とか。

f:id:stakiran:20190209202032j:plain

対処

使用禁止になっていないキーワードがないかを確認し、削除してから試してみる。

固有名詞系は疑った方が良い

とはいえ非常にレアっぽいので、普通は遭遇しないと思う。

どんなキーワードが禁止されている?

発見したもののみ記載する。

含まれている時点でアウトなキーワード:

  • hatena
  • nintendo

完全一致でアウトなキーワード

  • jkondo
  • staff

私はこれだけしか見つけられなかった。nintendo がダメなのに他の社名は問題ないとか、staff はダメなのに contact や help は問題ない(既に取られてるけど)など、いまいちよくわからない。ちなみに jkondo ははてなの生みの親。

Visual Studio Code でメニューバーとタイトルバーが一緒になっているのを別々に分ける

v1.30.1 の話。

  • ファイル > 基本設定 > 設定
  • 「title bar」で検索する
  • Title Bar Style を native にする
  • VSCode を再起動したら反映される

ちゃんと native 派の利用者の存在を考えてくれているのが素晴らしい。

あと余談だが、1.30 からなのか知らないが 設定を(設定ファイルではなく)インクリメンタルサーチと GUI でいじれるようになっているのがとても便利

OS、言語、フレームワークなどのログレベル名称をまとめてみた

ログレベルを設計するためのインプットとして、OS/言語/フレームワークなどからログレベルがどう定義されているかを調べて、まとめてみた。意外と色んな名称が使われていて、まとめるの大変だった。

前提

注意事項

  • ログレベル名の記述は Camel Case で統一する
  • 言語のログは言語というより標準ライブラリの機能だが、言語のものとして取り上げる
  • 今回選んだ OS、言語、フレームワークなどの選定基準は「テキトー」

情報源

ログレベル(まとめ)

  • Emergency/Severe/Fault/Assert/Unknown
  • Alert/Fatal
  • Critical/Critical Error
  • Error
  • Warning/Warn/Default
  • Notice
  • Info/Information
  • Debug
  • Verbose/Trace
  • Config/Fine/Finer/Finest

ログレベル: ガチでやばい

ログレベル全体を通して一番上にあったやつ。

Emergency

  • syslog

Severe

  • Java

Fault

  • iOS

Assert

  • android

assert というと条件式が偽だったら Abort する命令を思い出すけども。

Unknown

  • Rails

要するに「よーわからん」ってことでしょ。ちょっといいかげんやない?

ログレベル: 割とやばい

ログレベル全体を通して大体一番上(か二番目くらい)にあるやつ。

Alert

  • syslog

Fatal

  • log4j, Rails
  • Ruby

ログレベル: まあまあやばい

いわゆる「エラー」よりもやばい位置づけのやつ。

Critical

  • syslog
  • Erlang, Python

Critical Error

  • Windows

二単語やめてー。

ログレベル: やばい

いわゆるエラー。

Error

  • syslog, Windows, android, iOS
  • log4j, rails
  • Erlang, Python, Ruby, Go, PHP

ログレベル: やばいかも

いわゆる警告。

Warning

  • syslog, Windows
  • Java, Python, PHP, Erlang

Warn

  • android
  • log4j, rails
  • Ruby, Go

おしゃれなのは Warn ってイメージ?

Default

  • iOS

Readable じゃないのでダメだと思う。

ログレベル: お知らせ

警告と情報の間くらいのやつ。

Notice

  • syslog
  • Erlang, PHP

ログレベル: 情報

その名のとおり情報。

Info

  • syslog, android, iOS
  • log4j, rails
  • Java, Python, Ruby, Go, Erlang

Information

  • Windows

Windows さん空気読んで。

ログレベル: 細かい

開発者向けの細かい世界。

Debug

  • syslog, android, iOS
  • log4j, rails
  • Python, Ruby, Go, Erlang

ログレベル: めっちゃ細かい

さらに細かい。

Verbose

  • Windows, android

Trace

  • log4j

ログレベル: ばちくそ細かい

Java「どや?親切やろ?」

Config

  • Java

Fine

  • Java

Finer

  • Java

Finest

  • Java

秀丸エディタでファイルマネージャ枠を自動で同期する

秀丸エディタのファイルマネージャ枠(エクスプローラ枠)は便利だが、表示内容が自動で同期されないのが不便だった。自動で同期する方法を見つけたのでまとめる。

方法

  • [マクロ] > [マクロ登録] > [自動起動] > [自動起動マクロを有効にする]
  • [アクティブ切り替え後] を有効にして、以下マクロを指定
loaddll "HmExplorerPane.dll";
#get_1_if_pain_opened = dllfunc("GetMode",hidemaruhandle(0));
if(#get_1_if_pain_opened!=1){
    endmacro;
}

#h = dllfunc("GetWindowHandle", hidemaruhandle(0) );
// 252 同期
#ret = sendmessage(#h, 0x111, 252, 0);

解説

自動同期は以下の二段階で実現する。

  • (1) ファイルマネージャ枠の同期処理を行うマクロをつくる
  • (2) 秀丸エディタに「タブが切り替わる度に指定マクロを実行する」的な仕組みがあるので、ここに 1 を指定する

マクロ解説

loaddll "HmExplorerPane.dll";

これはファイルマネージャ枠を使う際の決まり文句。

#get_1_if_pain_opened = dllfunc("GetMode",hidemaruhandle(0));
if(#get_1_if_pain_opened!=1){
    endmacro;
}

これはファイルマネージャ枠が表示されているかどうかを調べ、されていないならその場で終了する処理。

このような判定を行っておくと、ファイルマネージャ枠を使っていない時に同期処理が走らず無駄がない。

#h = dllfunc("GetWindowHandle", hidemaruhandle(0) );
// 252 同期
#ret = sendmessage(#h, 0x111, 252, 0);

これはファイルマネージャ枠の同期処理を行う。DLL に実装された機能を呼び出す、という使い方になるので表記が多少煩雑。値 252 の部分など、詳細はマクロヘルプを調べたら載ってある。

使い心地

秀丸エディタにこもっている間は使いやすい。自動で同期されるから。

別のウィンドウと切り替えながらだと使いづらいかも。秀丸エディタをアクティブにする度に自動同期が走るので、ファイルマネージャ枠中で別フォルダを開いていた場合も(自動同期されてしまい)カレントディレクトリに戻されてしまう

ホワイトボードみたいな「白紙の好きな位置に書く」をテキストエディタ上で実現する『Freetext』

freetext_demo_1

Freetext とは

ホワイトボードみたいな「白紙の好きな位置に書く」をテキストエディタ上で実現すること。

実現アイデアの肝は以下 4 つ。

  • (1) テキストエディタの フリーカーソル を有効にする
  • (2) 行番号、ルーラー、空白文字表記などをなくして 表示を白紙に近づける
  • (3) 直線をいかに簡単に書くか、など マクロスクリプトで手作業を省力化 する
  • (4) Freetext を実現する専用拡張子を設ける(そうすれば「拡張子別の設定」として Freetext 用の設定を集中的に組み込める)

フリーカーソルとは?

一部のテキストエディタ(特に国産テキストエディタ)には フリーカーソル という機能がある。(この呼び名の)元は一太郎など国産ワードプロセッサから始まった機能っぽい。海外では Virtual Space と呼ぶことが多い。 昔の Visual Studio にはある みたいだが、 VSCode ではまだ実装されていない ようだ。

フリーカーソルを使うと、以下のようなことができる。

    test
              ^^^^^^
            たとえばこのあたりにカーソルを移動させることができる

つまり 行末の先にカーソルを移動させることができる。そこで入力を行うと、間には自動的に半角スペースが挿入されるという仕組み。

サンプル

秀丸エディタで実現した hidemaru_freetext。GitHub に置いた。

以下は画像例。hidemaru_freetext 開発時の思考こねこねを Freetext でやってみた例である。

hidemaru_freetext_image

使い心地

(Good) 好きな位置から書き始められるのは気持ちいい

ホワイトボードに書くみたいに、空間を自由に使って書けるのはとても気持ちが良い。

最大化して、文字サイズも小さくすれば、領域としてはかなり広い。

(Good) アナログよりも速く、キレイ

アナログで手書きだと字を書くのがどうしても遅いし、また汚い(人によるだろうが少なくとも私は苦手だ)。

デジタルだとタイピングによる断然速くキレイに書ける。が、アナログみたいな空間的自由が無く、特にブレストのような発想重視ではやりづらい。

しかし Freetext なら、自由配置については解決しているため、いわば両者のいいとこどりのような手段を実現できる(というと言い過ぎだが、近い操作感を実現できる)

(Bad) 線で結ぶ、線で囲むなどは苦手

容易に想像できるが、線で結んだり線で囲んだりといったことは苦手である。

テキストエディタの限界ではなかろうか。あるいはエディタのマクロやスクリプトによる自動化処理を工夫しまくれば実現できるのかもしれないが、現状の私の実力では皆目検討もつかない。

ただし、悪あがきとして一部は実現している。

(Bad) カーソル移動の癖が強い

(Vimmer などがどうかは知らないが秀丸エディタマンの私は)カーソルキー/Home/End キーを多用してカーソルを移動させる。ここには「行末で→を押すと次行の行頭に行く」「行頭で←を押すと前行の行末に行く」といった前提も含んでいる。

しかし、フリーカーソルモードだと、この前提が効かなくなるため、「あれ?行頭に移動しねぇぞ」なんてことが起こり、違和感が満載なのである。

フリーカーソル時はフリーカーソルの挙動・癖というものがある。私は Freetext を使いはじめて数日だが、まだ慣れていない。そのうち慣れるだろうが。

「指定フォルダ内の画像ファイルをサムネイルで一覧表示する HTML」をつくる Python スクリプト

ローカルに保存している画像ファイルたちを簡単に俯瞰する手段が欲しいと思っていたが、良い方法が見当たらなかったのでつくることにした。

成果物

GitHub に置いた

github.com

サンプル

指定フォルダ内の全画像を、こんな感じでズラリと並べる。

f:id:stakiran:20190126155213j:plain

クリックすると画像本体を開く。

表示サイズと一行分の画像枚数はスクリプト側でいじる。

# ★ここ
conf_image_x = 150
conf_image_y = 150
conf_image_count_per_line = 6

スクリプト

# encoding: utf-8

import os
import sys

def str2file(filepath, s):
    with open(filepath, encoding='utf8', mode='w') as f:
        f.write(s)

def get_filelist(basedir):
    ret = []
    for path, dirnames, filenames in os.walk(basedir):
        for filename in filenames:
            fullpath = os.path.join(path, filename)
            ret.append(fullpath)
    return ret

MYFULLPATH = os.path.abspath(sys.argv[0])
MYDIR = os.path.dirname(MYFULLPATH)

filenames_all = get_filelist(MYDIR)
filenames_jpg = [filename for filename in filenames_all if filename.lower()[-4:]=='.jpg']
filenames_curdir_removed = [filename.replace('{:}\\'.format(MYDIR), '') for filename in filenames_jpg]
filenames_slash_delim = [filename.replace('\\', '/') for filename in filenames_curdir_removed]

print(filenames_slash_delim)
print('{:} items.'.format(len(filenames_jpg)))

outfilename = 'image_gallery.html'
outstrs = ''

conf_image_x = 150
conf_image_y = 150
conf_image_count_per_line = 6

for i,image_filepath in enumerate(filenames_slash_delim):
    url = image_filepath
    alttext = url

    image_html_template = '<a href="{href}" target="_blank"><img src="{src}" width="{width}px" height="{height}px"></a>'
    image_kwargs = {
        'href'   : url,
        'src'    : url,
        'width'  : conf_image_x,
        'height' : conf_image_y,
    }

    image_html = image_html_template.format(**image_kwargs)

    outstrs += image_html
    outstrs += '\n'
    if i%conf_image_count_per_line==(conf_image_count_per_line-1):
        outstrs += '<br>\n'

html_template = """<html>
<head>
    <title>Image Gallery</title>
    <meta charset="UTF-8">
</head>
<body>
{:}
</body>
</html>"""

html = html_template.format(outstrs)
str2file(outfilename, html)

使い方

  • image_gallery.py など適当なファイル名で保存
  • HTML を生成したいフォルダに、このファイルを配置する
  • python image_gallery.py
  • HTML ファイルが生成されるはず

FAQ

追々使いやすく改造するかもしれないが、とりあえず FAQ の形で書いとく。

Q. ライセンスは?

Ans: MIT

Q. PNG画像は対応してない?

Ans: してない。

適当にスクリをいじって改造してちょ。

Q. 画像ファイルの表示順序はどうなっている?

Ans: よくわからん。

たぶんファイル名と階層がからんだ昇順降順みたいな感じだと思う。

秀丸エディタで単語補完を用いてタグを実現する

ブログにせよタスク管理にせよ「タグ」を付けるというシステムは整理や抽出の観点で重宝するが、テキストに対してこれを行うのは(自力でタグ文字列を書かないといけないので)しんどい。なんとかしたかったが、単語補完を使って少しだけ楽できることがわかった。

方法

  • タグを tag.txt などに一行一タグで書いておく
  • その他 > ファイルタイプ別の設定 > その他 > 単語補完にて以下設定を行う
    • 単語補完の自動表示はオンに
    • 表示形式はリストに
    • 単語補完の検索対象は辞書ファイルにして、上記 tag.txt を指定

運用例

私は GTD をテキスト(Markdown)ベースで構築しているが、いつかやるリスト(いつかやりたいことが何百と並ぶ)にタグを付けたかった。

なので以下のような構成にした上で、単語補完によりタグ名を(自分で覚えて打つことなく)補完で打てるようにした。

--[gtd]
    |
    +---inbox.gtdlist
    |
    +---someday.gtdlist
    |
    +---context.txt
    |
    ...

context.txt は以下を書いている。

ccblog        ブログネタ
ccbook        書籍ネタ
ccbusiness    ビジネスアイデアネタ
ccbuy         買う
ccdev         開発
ccfuture      将来に備える
ccnovel       小説ネタ
ccwanttobe    こうなりたい、こうありたい

そして GTD 用のファイルタイプ .gtdlist の設定として、単語補完は context.txt から行うようにしている。

結果として、ccと入力するだけでタグが補完される。いちいち「ブログネタは ccblog で、将来備えネタは cc、えっとなんだっけ……」なんてことにならない。ただ補完された選択肢から選べばいい。

単語補完でタグを運用する際の TIPS

専用のファイルタイプをつくる

私は GTD 用のファイルタイプとして .gtdlist をつくったが、これを安易に「.txt や .md で書けばいいか」と考えて運用すると、txt ファイルや md ファイルならなんでも単語補完が発動してしまう。

タグを自動補完させたいケースは、普通なら限定されるはずだ(私の例でいうと GTD 用のリストを扱う時のみ)。なので、その限定用途用のファイルタイプを、別につくってしまえばよい。

prefix(接頭辞)を設ける

単語補完という性質上、接頭辞は何かしらの文字で統一することになる。

私としては「@」が良かったのだが、秀丸エディタは記号だと単語補完の対象にならない。

仕方なく私は「c」を二つ重ねた。二つ重ねれば他の言葉とバッティングすることはほとんどない。ちなみに c は Context の C である(GTD ではタグのことをコンテキストと呼ぶ)。

補完用のファイル(tag.txt)は txt ファイルにする

秀丸エディタが .txt ファイルにしか対応していないため、Markdown ファイルを使っているからと .md を使うと動作しない。

ブラウザなどウィンドウが勝手に最前面になる(常に手前に表示される)件

Internet Explorer のウィンドウがなぜか最前面になる問題に出くわした。

対処方法

当該アプリを再起動する

原因

Windows の仕組みの話になるが、詳しくまとめておく。

まずウィンドウの表示順序は、Windows の仕組みとして以下のようになっている。

  • 直前にアクティブにした順で手前に表示される
  • ただし「最前面」というモードを有効にすると、そのウィンドウは常に手前に表示される
  • 「最前面」モードのウィンドウ同士でも、直前にアクティブにした順で手前に表示される

また「最前面」モードについては、以下のような発動形態になっている。

  • 「最前面」モードは特殊なツール or アプリ側の「このウィンドウを最前面にする」的な機能を使わない限り、有効になることはない
  • アプリによっては自らを最初から最前面モードにしていることもある

本題に入る。

なぜ Internet Explorer が最前面になってしまったのか。とりあえず、

  • 原因1: 特殊なツールで最前面モードにしてしまった

が考えられるので、覚えがあれば解除する。ない場合は、

  • 原因2: Windows あるいは Internet Explorer あるいは特殊ツールのバグ

だと思われる。

なぜかというと、Internet Explorer には「このウィンドウを最前面モードにする」的な機能がないから。ないにもかかわらず、今回このような現象が起きたので、これはバグとしか言いようがない。Windows のバグか、Internet Explorer のバグか、はたまた(最前面モードを設定しているアプリを使っているなら)そのアプリのバグや誤動作か、よくわからないが、どこかがおかしい。

幸いにも、最前面モードという機能は ウィンドウ一つ一つの単位の設定 なので、いったんウィンドウを閉じて、また開き直せばリセットできる。

Critical Mention ―― チャットで個人宛 Mention(メンション) の乱用を防ぐヒント

チャットで Mention されたので見てみたら、ただの情報共有だった……みたいな感じで最近集中を阻害されているので、どうやったら防げるのだろうと考えている。とりあえず Critical Mention という考え方について、荒削りだがまとめてみる。

Mention の問題点

割り込まれること

割り込まれると今やっている仕事が中断され、短期記憶が失われたり注意力が逸れてしまい、創造性や生産性が損なわれる。

たとえるなら対局中のプロ棋士に対して「ねぇねぇ、今ちょっといい?」と割り込むようなもの。

どうすればいいか?

割り込みを減らせばいい。

具体的には Mention の使い方および通知設定を工夫することで、割り込んでまで見てもらうべき Mention(Critical Mention)の数を減らせば良い

言い換えると、以下の二つが必要とも言える。

  • (1) Critical Mention とは何かをきちんと定めること
  • (2) Critical Mention の利用頻度を下げるようなルールや体制や風土を整えること

Critical Mention を定める

(予備知識) Mention の 4 タイプ

まず前提として Mention の種類をまとめておく。以下 4 種類に分類できる。

  • Important Instant …… 「できるだけ早く反応してくれ。重要な用事だ」
  • Instant …… 「できるだけ早く反応してほしいんだが(最悪反応無くてもまあ良い)」
  • Important 「重要だから必ず読め。対応しろ」
  • Talk …… 雑談でメンションしていじる、個人宛 FYI(例:これあなた向けだよ) など

Critical Mention は Instant である

Instant と Important Instant のみを Critical Mention とする べきである。

Instant 以外の Mention はどう扱うか

Instant 以外――つまりは Critical Mention 以外のメッセージについては こちら(Mention を受けた側)のタイミングで読みたい時に読む で良い。

そもそもコミュニケーションはお互いが拘束されるためコストの高い作業である。少ないに越したことはない。特にクリエイティブな仕事のように「個人の集中」を要する場合は、なるべく個人で集中できる環境を整えるべき。

具体的には、コミュニケーションは可能な限りリアルタイムではなく キューイング (要件があれば突っ込んでおく。相手は空いた時に見て対応する。自分のキューも空いた時に適宜確認して対応する)にする。

キューイングなら、自分のキューを適切に確認して対処しさえすれば 個々は邪魔されることなく仕事ができるし、リアルタイムではないがコミュニケーションも取れる。

Critical Mention の運用を阻む原因

私が障害だと感じている原因(特に組織や人に絡むもの)を雑多に取り上げる。

ただし、いくつか注意を。

  • 現実は会社やチームにもよる
  • 本項で取り上げるのは私の観測範囲における場合である
  • 私自身のことは棚に上げる(私も下記全てに完全に当てはまらないかというと必ずしもそうではない)

チャンネル内容を定期的に確認しない人たち

たとえば「連絡事項を #news チャンネルに流しておくから、各自確認して、必要なら各自対応するように」と運用したとする。

このとおりに対応してくれる人は驚くほどに少ない。そもそも見ていなかったり、あるいは見てもその場で後回しする → 忘れる、で結局対応しなかったりする。彼らの言い分として「面倒くさい」「忙しい」などがあるが、要するに情報源を定期的にチェックする要領が無い or 方法を知らないだけである。中には「言われなければ読まなくていいか」という確信犯さえもいる。

※このような(連絡事項などの対処を)自律的に行う作業は、頭だけでは行えない。タスク管理という専用の技術を使う必要がある。

ともあれ、上記のような「各自見といてね」運用は大体破綻する。結局、誰かが Mention や口頭などでフォローすることになる。つまり Critical Mention を使うことになる。

効率、生産性、創造性に無頓着な人たち

「コミュニケーションはリアルタイムよりもキューイング」という発想が通じない人も意外と多い。

効率や生産性といった概念に無頓着で、たとえば PC をデフォルト設定のまま(たとえば IE やメモ帳をそのまま)使っていたり、起動に何十秒と待ち時間があっても平然としていたり、小さな画面の小さなキーボードのノート PC だけで煩雑な作業をしていたりする。

そもそも彼らは ものづくりという創造を知らない ため、これに起因する事項にはまるでピンと来ない。当然クリエイターの性格や性質などは知らないし、考慮や配慮もできない。どころか自分たちの常識(大半はクリエイターにとって害となるもの)を押し付けてきて邪魔してくる。何もしない方が何倍も助かる ことも少なくない。

こういう人たちが多いと、当然ながら Critical Mention という考えも通じない。

職位や立場にこだわる人たち

要するに 「下っ端が何を言っているんだ」 である。

私は本記事のような提案をしたことがあるが、決まって「生意気」「自分勝手」などと称された。別にそのような言動をしたつもりはない。ただ情報として、提案として、雑談チャンネルに書いただけである。

他にも 「従ってたまるか」「これが俺のやり方なんだ!」的なプライド が邪魔をしているケースもある。特に上位職になると、そのやり方でそこまで昇進したわけで、自信の塊なので、これが強い。

正論が常に最適とは限らないことも、人が感情的な生き物であることも、組織である以上立場といった要因があることも知っているが、これらは思っているよりも深く根付いている。下っ端の意見は、まずまともに取り扱われない、読まれないと考えた方がいい。情報や意見の価値はそれらそのものではなく、その発信者で決まる。下っ端というステータスは価値が低いし、一度「こいつはなんかよくわからんことをほざく失礼なやつ」とレッテルを貼られれば、もう挽回はできない。スパム扱いになりさがる。

ルールの遵守に腰が重い人たち

要するに 仕事においてもずぼら な人たちである。

私生活がずぼらなのは勝手だが、仕事はチームプレーなのだから秩序と効率は必要だ。そしてそれらを担保するには何らかの「仕組み」が必要である。だからこそルールだとか規約だとかガイドラインとかいったものがある。プログラミングの世界でもその手のやり方やドキュメントは普通にある。つくるし運用する。

チャット、もっと言えばコミュニケーションのやり方についても同じだ。

ずぼらな人たちはこのような制定や運用を好まないし、「面倒くさいから」「テキトーでよくね?」と従わない。また、このような過ごし方にも慣れていないので腰も重たいし、まして自ら考えて定めようとは思わない。

ここまでを踏まえて、どう行動するか(整備するか)

一案を雑多に取り上げる。ただし検証などはしていない、ただの想像であり、机上の空論かもしれない。

[管理] 雑談チャンネルをつくる

雑談は「見なくてもいい、反応しなくてもいい」チャンネルとして整備する。

間違ってもここに反応必須の連絡事項や相談などを書いてはいけない。

※ただし雑談で話題を振られるケースについてはここでは議論しない(振られたのに無視したら心証が悪い、など対人関係的に考慮すべき事項が出てくるが、本記事で扱う分野ではない)。

[管理] 連絡事項チャンネルをつくる

各自見ておいてね、各自締切までに対応しておいてね、といったネタについても、専用のチャンネルをつくり、そこに投下する。

そうすれば各々は「自分のタイミング(空いた時など)で読んで対応する」だけで済む。割り込みは生じない。

[個人] 了解や完了をリアクションする

連絡や依頼について、何もリアクションがないと「できたの?できてないの?」と不安になり、結局あとで Critical Mention なり口頭なりで割り込む必要性が生じてくる。

そうならないためにも、リアクションはする。

[個人] 定期的にチェックして対応する、という仕事術を覚える

私が思うに、仕事は頭の中だけで行うものではない。それはプログラミングで言えば Main 関数に何の関数化やクラス化もせずにブワーっと書くようなものである。終わらせるのは早いが、優先度の低いものはおろそかになるし、そもそも考慮事項が多いと破綻する。

ではどうするかというと、タスク管理である。

たとえば下記のようなルールを定め、日々まわせるような仕組みをつくる。

  • 連絡事項チャンネルは一日最低一回は目を通す
  • 目を通した内容のうち、対応が必要なものは TODO リストに入れる
  • TODO リスト内の TODO は一日最低一回は目を通し、必要に応じて対処する
  • すべての TODO について、期限以内に対応できるよう、計画的に対処する
  • 無理ゲーや「これやる必要ある?」などは、すぐに相談して調整する

上記のようなことは我流の思いつきでできることではない。タスク管理という専用の考え方が必要になる。……が、現状タスク管理に関するわかりやすい資料などはなく、一部の物好きや意識高い系しか知らないのが現実だ。

その他

おわりに

Critical Mention という概念について取り上げ、Mention という名の割り込みが乱用される問題を軽減するためのヒントを模索してみた。 一部不満たらたらしてるのはご愛嬌。。。

Excel で時刻の差分を分単位で計算する

Excel で 16:09 と 12:11 から 238 分の差がある、みたいな計算がしたかったので調べた。

やり方

  • 計算対象のセルには普通に hh:mm で記入
  • 差分計算を行うセルには以下を記入
    • =(D4-C4)*24*60 のように引き算と 24*60 の掛け算を
    • 書式は [表示形式]タブ > [分類] から 標準 を選ぶ

ちなみにセル書式は Ctrl + 1 で開ける。

気になる挙動やら疑問やら

12:11 - 16:09 の結果は?

Ans: -238

マイナスになる。

hh:mm 以外の不正値を使って計算したらどうなる?

Ans: そもそも計算以前にセル内で正しく時刻表示されない

たとえば 23:60 という値(60分という書き方はない)を入れてみると、「1900/1/1 0:00:00」になったり「1」になったりする。 正しい時刻表記でない場合、その時点で当該セルの値がおかしくなる ので(おかしいことに)すぐ気付ける。

書式設定で「分単位で表示」みたいな表示形式があるのでは?

Ans: 無い。

もしあったら教えてほしい。

参考

Slack でステータス(ログイン状態)を常にオンライン(アクティブ)にする

Slack では 30 分放置すると強制的に Away(離席中) になってしまう。この挙動を変えることはできない。これは「離席中であることをシステムが保証してくれる」点では素晴らしいが、離席しているのがバレるというデメリットもある。というわけで、でもないのだが、離席中にならないようにする方法を考えてみた。

最初に結論

  • Slack の設定上からは(REST API を使っても)実現できない
  • 常にアクティブを実現したいなら、(30分未満の頻度で活動を行う)ツールやスクリを仕込むしかない
  • で、できたの?
    • Ans: 一応できたっぽい
    • AutoHotkey で「Slack のブラウザウィンドウの定期的なアクティブ化を自動化する」でいけた

まずは仕様をまとめとく

ステータスとログイン状態

Slack の用語では

  • ステータス(Status)
  • ログイン状態(Availability)

の二つがある。

ステータスとは「会議中」や「病欠」など、自分で任意に設定できる テキスト

ログイン状態は アクティブ(Active) or 離席中(Away)のいずれか二値を取る状態

本記事でいうステータスとは後者、ログイン状態のこと。以降では「ログイン状態」という呼称を使うことにする。

ログイン状態の仕様

一言で:

  • Slack の仕様なので 変更や停止は不可能
  • 30分 未活動だと離席中(Away) になる

Slack のステータスを設定する – Slack によると、離席中と判断されるのは、

  • デスクトップの場合、『非アクティブ状態が 30 分間続いた』
  • Webブラウザの場合、『ブラウザの非アクティブ状態が 30 分間続いた』
  • モバイルの場合、『アプリを切り替えた』『Slack を終了した』『画面をロックした』

続いて REST API として User presence and status | Slack を見てみると、

  • active と away の二値
  • 30分未活動なら away になる。これは slack の仕様で変更不可、停止不可
  • user.setPresence を使えば away(ずっとaway) or auto(上記の30分awayルール) をセットできる
    • 常に active は無理

常にアクティブにする戦略を考える

デスクトップアプリ、Webブラウザ、モバイルと 3 パターンあるが、モバイルは除外する。

いずれにせよ「30分活動しなかったら離席中になる」仕様なので、だったら 30 分以内に何かしら活動する よう仕込めばいい。

残る不明点

  • 活動とは何か
  • どうやって活動を仕込むか

活動については(よほど Slack の実装がひねくれてなければ) mouseover, mouseclick あたりが該当するだろう。つまり Slack の画面内でマウスカーソルを動かす or マウスクリックできればいい。

どうやって仕込むか

実現方法として以下 2 パターンが考えられる。

  • (1) ブラウザの機能(拡張機能など)でマウス操作をエミュレート
  • (2) OSの機能(たとえばクリック自動化ツール or マウス操作を行えるスクリを書く)でマウス操作をエミュレート

また、いずれにしても仕込む際は以下 3 ケースを考慮する必要がある。

  • (A) 離席中(Slack のウィンドウを30分以上アクティブにしなかった)
  • (B) 離席中(Slack のウィンドウはアクティブだが、30分以上操作しなかった)
  • (C) 離席中(PC ロックをして30分以上経った)

注意すべきが (C)。PC ロックすると画面が PC ロック画面になってしまうため、特に (2) で「指定座標をクリックする」ようなやり方を採用していた場合に、自動化が効かなくなる。

試してみた

本題。以下方法を試した。

  • [1] Firefox Quantum + Tampermonkey で、Slack の入力欄を 1 秒間隔でクリックするスクリプト
  • [2] Windows + AutoHotkey でウィンドウアクティブ化を自動化するスクリプト

各方法に関する詳細解説は割愛。スクリだけ載せる。

[1] (失敗) Tampermonkey でクリック自動化

結果:

  • PC ロックして放置 → 動作せず(30分で離席中になった)
  • PC ロックせずに放置 → 動作せず(30分で離席中になった)

Tampermonkey – Get this Extension for Firefox (ja)

// ==UserScript==
// @name         Slack always active
// @namespace    http://tampermonkey.net/
// @version      0.1
// @author       You
// @match        https://(YOUR-TEAM).slack.com/messages/(CHANNEL_ID)/
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
// @grant        none
// ==/UserScript==

function touch(){
    $('#msg_input').click();
}
$(function(){
    setInterval(touch, 1000);
});

スクリプト解説:

  • Slack のメッセージ入力欄を 1 秒ごとにクリックする
  • メッセージ入力欄にフォーカスが当たる = Slack 側で Active とみなすのでは?という仮説
  • 結論: 仮説は間違っていた

[2] (成功) AutoHotkey でウィンドウアクティブ化を自動化

結果:

  • PC ロックして放置 → たぶん成功?
  • PC ロックせずに放置 → 成功
#Persistent
#WinActivateForce

Loop
{
  SetTitleMatchMode, 2

  WinActivate, Slack - Mozilla Firefox
  sleep, 1000*3

  WinActivate, ahk_class Progman
  sleep, 1000*30
}

スクリプト解説(AHKスクリプトに書いてたコメントを載せただけなので多少見づらいが):

; Slack のブラウザウィンドウを指定インターバルでアクティブにする. ただし,
; - 既にアクティブの場合は何もしないに等しくなるので,
;   別のウィンドウ(ここではデスクトップ)をアクティブにする操作もはさむ.
; - PCロックから復帰した時に Slack が Active かどうかを見たいので,
;   Slack ウィンドウがアクティブになりづらいように Sleep する.
;   (はさむ方のウィンドウを長めにアクティブにする)
;   → 何が言いたいかというと、PC ロックを解除した直後に
;      「PC ロックせずに放置」時の挙動で Active になったのを
;      「あ、PC ロックして放置しててもアクティブじゃん」と誤解してしまうのを
;     防ぎたいという話.

『PC ロックして放置 → たぶん成功?』って何?:

  • 30分以上ロックして放置する実験がだるかった
  • 数回ほど試したけど、ぶっちゃけ上記の『「あ、PC ロックして放置しててもアクティブじゃん」と誤解してしまう』をしてしまったかもしれないので「成功!」と言えない
  • 気が向いたら実験し直す予定

参考

本記事を書くきっかけになった記事。

Auto mouse mover.

などヒントが得られた記事。

Windows 7 で太った Temporary Internet Files を削除する

Windows を重くする一因、「ファイルが多い」「ファイルサイズがでかい」を軽減するために、あちこち不要ファイルを削除してまわっている。Temporary Internet Files(インターネット一時ファイル)もその対象で、規模は(環境次第だが当環境では)ファイル数何千、サイズも 1 GB 超だった。

早速消そうとしたのだが、ちょっと苦戦したのでメモ。

Temporary Internet Files フォルダの開き方

ファイル名を指定して実行などから「shell:cache」で。

すると「C:\Users\...\AppData\Local\Microsoft\Windows\Temporary Internet Files」みたいなフォルダが開かれるはず。

Temporary Internet Files フォルダの中身について

インターネットの一時ファイルが置いてある。

ファイルを削除する

本題。ちょっと面倒くさい(複数のやり方が必要)。

(1) インターネットオプション

ファイル名を指定して実行などから「inetcpl.cpl」で開く。

[全般] タブ > 閲覧の履歴 > [削除] ボタン > インターネット一時ファイル及び Web サイトのファイル

これで Temporary Internet Files の 一部のみ 消える。全部は消えてくれない。その証拠に、Temporary Internet Files のプロパティからサイズを見ても、あまり変わってないと思う。

(2) 隠しファルダ内

実は Temporary Internet Files 内には隠しフォルダがあって、Office 系の一時ファイル も保存されている。こいつらが何百 MB を占めていることが多い。

これらフォルダの存在は dir /a コマンドで見れる。

$ cd
C:\Users\....\AppData\Local\Microsoft\Windows\Temporary Internet Files

$ dir /ad /b
Content.IE5
Content.MSO
Content.Outlook
Content.Word
...

Content.XXXX フォルダである。 Temporary Internet Files といいつつ、インターネット無関係の Office 系の一時ファイルも保存しているのである

これらの一時ファイルを消すには、エクスプローラーから上記フォルダ名を入力して開き(あるいはコマンドプロンプト上で操作してもよいが)、中身をまるごと消せば良い。

その後、Temporary Internet Files フォルダのプロパティからサイズを見てみると、減っているはず。

Before/After

(1) と (2) で一通り消せば、1GB が 20MB くらいになったりする。

秀丸エディタ上でアウトライナーを実現する houtliner

秀丸エディタ上でアウトライナーを実現する houtliner を公開した。

中身

  • 強調定義ファイル
  • マクロ
  • バッチファイル(一部機能をマクロから呼び出して使う)

入手、インストール、マニュアルについて

入手とインストールについては以下。

アウトライナーのコンセプトについて

2ペイン

アウトライナーには 1 ペイン型と 2 ペイン型があるが、houtliner は 2 ペイン型。

以下の 2 つのペインがある。

  • アウトラインを書き連ねていく「編集領域」
  • アウトライン全体(セクション、レベル1、レベル2の計 3 段)を俯瞰したり操作したりする「アウトライン枠」

アウトライン枠の表示位置は上・下・左・右から選べる。また非表示も可。

情報の構造(ファイル/セクション/アウトライン/ズーム)

情報の構造としてファイル、セクション、アウトライン、ズームがある。

  • ファイル
    • .outline ファイル
    • 複数のセクション、複数のアウトラインを持てる
  • セクション
    • 複数のアウトラインを持てる単位で、フォルダみたいなもの
  • アウトライン
    • 箇条書き
    • レベルは無限だが、色分けされるのはレベル6まで
  • ズーム
    • 箇条書き一行に「ファイル一つ分の記入領域」を付与したもの

文法

  • セクションは「・・」はじまりの行
  • アウトラインは「・」はじまりの行
  • アウトラインのレベルは 半角スペースの個数 で区別する
    • レベル1は0個、レベル2は1個、レベル3は2個……
  • 強調系は以下のとおり
    • 引用は「>」はじまり(全角可)
    • (TODOリストなどの)完了は「x」または「X」はじまり(全角可)
    • 太字は「@」で囲む(全角のみ)
    • かっこ(「」と『』)
    • リテラル(バックチック ` で囲む)

日本語を書く

houtliner は日本語でアウトラインを書くことを想定している。

ゆえに以下性質がある。

  • 箇条書きの「・」にせよ太字の「@」にせよ全角文字
  • 他の文法についても全角文字半角文字どちらでも強調されるようになっている(全角のまま打つことを考慮している)
  • 日本語文でよく使う「」『』も強調する

サポートする操作

アウトラインプロセッシングを円滑にするために、色々と操作を用意している。

  • 折りたたみ(現在位置のアウトライン表示を折りたたむ)
  • 移動 …… 現在位置のアウトラインやセクションを、一つ前または後に移動
  • 並び替え …… アウトラインやセクションを D&D で並べ替え
  • フォーカス …… 現在位置のアウトライン以外を編集できないようにする(現在位置のみの編集に集中するモード)

なぜ houtliner を使うのか(他のアウトライナーではダメなのか)

オフラインで使いたいから

アウトライナーとして名を馳せているのが WorkFlowy や Dynalist だが、これらはクラウドサービスである。オンラインでないと使えない。

テキストエディタの便利機能をフル活用したいから

私がクラウドサービスでテキスト編集を行わない理由の一つが、エディタとして貧弱だからである。ローカルのテキストエディタの方が高速だし、何より高機能でカスタマイザブルだ。テキストエディタに慣れていると、クラウドはストレスでしかない。

さて、アウトライナーだが、これは小説やプログラミングのようにガシガシテキストを書くものだと私は考えている。ゆえにガシガシ書けるポテンシャルが必要だ。少なくとも WorkFlowy や Dynalist 程度では務まらない。

たとえば秀丸エディタには以下機能がある。

  • 検索/置換
  • 行ブックマーク
  • ファイルブックマーク
  • ウィンドウ分割(一ウィンドウ内を縦横or上下で二画面に分割する)
  • ファイルマネージャ枠(今開いているファイルのあるフォルダ内を一覧表示するペイン)

ブラウザアプリのただのテキストエリアよりも何倍も、何十倍も使いやすい。

データをファイルで扱いたいから

私はエンジニアということもあり、アウトラインを書いたデータはファイルとして管理したい。バージョン管理したいし、grep をはじめツールやスクリプトでの利活用・加工編集もしたい。

houtliner は .outline ファイルという形でデータをつくるため、ファイルとして管理することができる。

秀丸エディタ上で使いたいから

これは完全に私の好みだが、私が普段使っている秀丸エディタ上で実現したかった。

FAQ

Q. 1ペインは実現できない?

Ans: できない

秀丸エディタの仕様上、できないと思われる。

詳しくは 秀丸エディタで 1 ペインのアウトライナーを実現できない理由 - stamemo を。