無印良品の洗濯表示タグが長すぎる問題

無印良品は、かつてバイトをしていたこともあって、とても愛着があって今もよく利用しています。
一時期から、世界中で展開する商品を一元化する流れからでしょうか、洗濯表示タグが異様に長くなってしまいました。
まぁタオルくらいなら許せる気がします。しかし先日買った「携帯用スリッパ」には、さすがにガッカリしました。
www.muji.net

公式画像でもチラ見えしてますが、実際には…

誰がこんなタグをぶら下げて履こうと思うのか…
いくら素敵な製品をデザインをしても、こんなもの付けられたら台無しですね。

こういうことがなぜ起こるかというと、製品設計をしている人が、最終的に顧客の手に渡る状態を知らない、ないし、手出しできないようになっているからだと思うんですね。
よくある例だと、雑誌のインタビューを受けた人が、いざ掲載された記事を読んでみたら、全く意図と違った脚色をされていた、とか。

自分の役割を果たせば仕事は終わり、ではなくて、その先の仕事がどうなっているか、欲を言えばさらに踏み込んでユーザーが実際はどう使っているのか、まで意識できるようにありたいものですね。

Excelセルにサジェスト(予測変換)機能をつける

仕事上、膨大な品目リストから一つの項目を選ばせることが多々あります。
通常は検索やフィルターを使うのですが、リストが別シートにある場合など、行き来する必要があり操作が煩雑になります。
こんなとき、Googleみたいに候補を表示してくれたらいいのに良いのに…なんて思う大抵のことは、誰かがやっている。

language-and-engineering.hatenablog.jp

suugleblog.blogspot.jp

先人は偉大ですね…!ありがとうございます。
この2つを使ってみて色々と気になるところがあったので、コードを整理しつつ両方を切り替えられるようにしてみました。VBEの操作方法や実際の挙動は元記事を参照してください。

標準モジュール

検索セルのあるシート

候補リストを別シートに退避すべきか?

”入力規則のFormula1に直接突っ込める文字数は255文字までの制限があるらしい。”
とのことですが、私の環境ではもっと突っ込めました。一つの項目がよほど長くない限りは、一つ目の方法で良さそうです。つまり、

Const USE_SUGGEST_LIST_SHEET = False

で、ほとんどの場合は十分だと思います。
候補リストを別シートに移した場合の不具合として、検索セルが複数あると、最新の候補がすべてのセルに反映されてしまいます。たとえば、一つ目の検索セルを「はてな」で確定したのに、二つ目の検索セルに「Ya」と入力すると、一つ目のセルにも「Yahoo」「Yaplog」などの候補が入力されてしまいます。
ただ、入力規則に直接入れる方法で保存すると、次に開いたときに同じシートに手動で設定した入力規則が壊れていることが多いようです…。誰か、対策方法が分かったら教えてくださいm(_ _)m
(2017/10/25追記)
どうやら入力規則は255文字以上のリストを表示することはできるのですが、保存ができないためにファイルが壊れてしまうようです。
対策として、255文字を超える場合には省略を示すOVERFLOW_DESCRIPTIONをリストに追加して、それ以上の項目を追加しないように修正しました。他にも、255文字を超える場合のみ候補リストを別シートに退避させる(つまりUSE_SUGGEST_LIST_SHEET = True)ような実装も有効だと思います。
(追記以上)

主な変更点

Application.EnableEvents

参照元のコードのようにApplication.EnableEventsを標準モジュール内に置くと、複数の検索セルがあって同時に削除やペーストをしたときに再帰的に呼び出されてしまい、途中でエラーを出してFalseのまま関数が終了してしまうことがあります。*1
また、シート側で検索結果(例えば入力が確定したかどうか)に応じてシート内の他のセルも編集したいとき、シート側のApplication.EnableEventsの間に処理を入れることで、シートに依存した処理をまとめて記述でき、モジュールの再利用性が高まります。

FindからForeach if Likeに

Findは処理時間が遅いという指摘がされているのと、なぜかMatchCaseが上手く行かなかったのでForeachで辞書項目を回して比較するようにしました。
excel-ubara.com
処理が早くなっただけでなく、内容もわかりやすく簡潔に記述できていると思います。
大文字・小文字を区別したい場合は、

If strKey = "" Or UCase(item.Value) Like "*" & UCase(strMatch) & "*" Then

からUCaseを取り除いてください。*2

(2017/10/25追記)
Like比較に使われるワイルドカード(?、*、#、[、])が含まれた語でも検索できるようにしました。なお、strMatchという別の変数を使ったのは、strKeyを完全一致の判定に使用しているためです。*3
(追記以上)

なお、辞書範囲から空白項目を除去するためにSpecialCellsを使っています。この関数は特定の種類のセルのみを抽出できる関数ですが、数式と文字列のどちらかを指定する必要があります。冒頭のDICTIONARY_CELL_TYPEで指定してください。該当セルがない場合、ランタイムエラーになります。ちょっとクセのある関数なので、不具合が生じる場合はMSDNを参照してみてください。
Range.SpecialCells メソッド (Excel)

確定時の処理と戻り値

二つ目の記事では候補が1つになった場合に確定としていましたが、辞書に「goo」と「Google」がある場合に確定できません。本記事のコードでは検索語と候補の文字列が完全一致した場合にのみ確定としています。
戻り値には完全一致した辞書項目のセルを返しています。完全一致した場合のみの処理は以下のように記述できます。

If Not( Suggest(DicSheetName, DicRangeAddress, target, target.Count = 1) Is Nothing ) Then
    '処理内容
End If

また、辞書シートの検索範囲以外から情報を得ようとする場合、たとえば、A列の検索範囲に「Google」などの項目が入っていて、B列に「https://google.com」などのURLが格納されている場合、

Dim foundCell As Range
Set foundCell = Suggest(DicSheetName, DicRangeAddress, target, target.Count = 1)
If Not( foundCell Is Nothing ) Then
    '処理内容、例えば
    'target.Offset(0,1) = foundCell.Offset(0,1)
End If

といった記述が可能です。*4

注意事項

辞書に同じ項目が複数存在するときは、最初の項目が返ってきます。
記事に焼き直したところはデバッグしてないので、もし間違いがあったら教えてください。

*1:この場合、復帰するにはイミディエイトウィンドウなどからApplication.EnableEvents = Trueに設定する必要があります。

*2:And→Orに修正しました(2017/10/25)

*3:現行の実装では"[]"を検索することはできません。また、Replaceは関数とRangeオブジェクトのメソッドとでは実装が異なるようで注意が必要でした。参照:【VBA入門】Replace関数とReplaceメソッドで文字列の置換 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

*4:Range.Offset プロパティ (Excel)

結婚式で感じたジェンダーの話

先日、友人の結婚式に出席しました。いやー、めでたい!という気持ちはさておき、その中で違和感を感じた、とある風習について。

美味しい手料理を作ってあげるよ

ファーストバイトってあるじゃないですか。ケーキすくって、あーんってするやつ。
この儀式にはこんな由来があるそうで

新郎から新婦への一口は「一生食べるものに困らせないから」、新婦から新郎への一口は「一生おいしいものを作ってあげる」という意味が込められています。
ファーストバイトとは - コトバンク

その披露宴でも同じ説明をされていたのだけど、自分の結婚式では絶対言わせたくないな、と思った。だって、嫁が稼いだっていいし、旦那が料理作ってもいいじゃないか。

プリンセス願望とヒモ夫

女の子が抱く「いつか王子様が迎えにきてくれる」というプリンセス願望は、「早く結婚して仕事を辞めたい」という寿退社願望に近似する。王子様が養ってくれるからだ。*1
女性の活躍に関する意識調査2017 ソニー生命保険
この調査によると、有職女性の約4割が「本当は専業主婦になりたい」と回答したそうだ。一方、専業主婦が「外に働きに行きたい」と回答したのも約4割。結局は無い物ねだりというところか。

逆に、専業主夫はどうだろう。
“家事”に関する意識調査 - ワタベウェディング
先ほどよりも調査対象が既婚の20〜40代と狭いが、25%が専業主夫を希望しているそう。想像していたよりも多いぞ…!しかし、そう思ってはいても口に出すと冗談にしかならない。なんせ夫は「一生食べるものに困らせない」社会的責務を負っているからだ。

実際に稼いでいるのは

労働力調査*2から、夫および妻が就業者であるかどうかで専業主婦/夫の世帯数を見積もってみよう。

調査年度 共働き 専業主婦 専業主夫
2013年 1,345 843 117
2014年 1,374 813 119
2015年 1,384 785 120
2016年 1,423 765 119

(万世帯)
比率にするとこんな感じ
f:id:ndanah:20170827192058p:plain:w400

年度によらず約5%、1/20世帯が専業主夫ということになる。実際には配偶者のうち非就労者が家事を担当しているとは限らず、例えば病気や障害などで働けない場合も含まれるので、これより少ないと考えて良いだろう。メディアなどで取り上げられることも多くなったとはいえ、専業主夫はまだまだ少数派のようだ。

家庭から挑戦できる社会は来るか

本当に男女平等な社会なら、もっと専業主夫が増えてもいいはずだ。合理的に考えれば、稼ぎの少ない方が家庭に入った方が効率が良い。雇用が男女均等になれば、妻の収入が上回る世帯は増える。しかし「男が働き女が支える」という刷り込みは、まだまだ根深い。この刷り込みがある限り、雇用側は退社リスクのある女性に責任のある役職を与えることに躊躇してしまうだろう。結果、男女の収入格差は埋まらない。

実際、寿退社したい…と思っている女性は結構いると思う。

女性の希望が通りやすいであろう結婚式でファーストバイトが定番化していることも、女性自身が「男が働き女が支える」思想を支持しているように思う。*3

私は、女性がプリンセス願望を口にしなくなるのではなく、男性も同じことを言えるようなることが本当の平等ではないかと思う。
生活収入が確保できれば、スタートアップのような不安定だが面白い仕事にだって挑戦できる。夢は主夫をしながらリモートワーク、なんて、いつかそんな人生プランを公言できる社会は来るだろうか。

*1:プリンセスは専業主婦ですらないが、王家としての役割を果たす"仕事"をしていることは、あまり言及されない。

*2:統計表一覧 政府統計の総合窓口 GL08020103から「IV-7 妻及び夫の就業状態・農林業・非農林業・従業上の地位・月末1週間の就業時間・月間就業時間,世帯の家族類型別夫婦のいる世帯数」を参照、他年度も同様。

*3:古い家族観をもつ親族へのポーズとも考えられるが。

どんな料理も箸で食べる日本の雇用文化

洗い物をしていてふと思ったこと。

日本人は調理するときも食べる時も箸を使うけど、箸を使わない文化もあるよなぁ。何使って料理するんだろう。

中華といえば、中華鍋に「おたま」ですよね。
パスタを和えるなら「トング」でしょうか。
目玉焼きやステーキは「ターナー(フライ返し)」ですね。

食べる時はどうでしょう。
洋風のコース料理では、皿ごとにナイフやフォークを使い分けますよね。すなわち、道具の役割が明確に決められているといえます*1

一方、和食の場合は、最初から最後まで同じ箸を使い続けます。これは箸が便利で万能だとも言えるけども、どんな料理にも箸を使うという日本人の文化だともいえます。この文化が日本のメンバーシップ型雇用をもたらしたのではないか。知らんけど*2

コース料理のナイフやフォークのように、役割を決められるのがジョブ型。割り当てられた料理(仕事)がなくなれば御役御免で下げられてしまいます。
和食では、どんな料理が運ばれてきても、うまく箸を使いこなすことが求められます。そしてその食事の始まりから終わりまで、テーブルに残ります。終身雇用ですね。

メンバーシップ型では、与えられた仕事をこなす能力よりも、総合的な期待値として対価が支払われます。平等ではあるけど不公平でもある。
そして、やりたい仕事が出来るかどうかは、ほとんど運に任されます。置かれた場所で咲く、というやつですね。豆を掴むのが得意な人に汁物が運ばれてくることもある。

最近、馴染みのない仕事から戻ってきたので、適材適所だなぁと思いました。単に慣れの問題かもしれませんが…
次はどんな料理が運ばれてくるのやら。

*1:とは言っても、かつての西欧文化では何でもナイフで食べた、という文献を読んだことがあるが、何に書いてあったかは思い出せなかった。例え話なのでマジレスは要らないのだ!

*2:"『諸説あります』を関西弁で表しますと『知らんけど』になります"

あたりまえ品質を疑え

掃除をしていて、ふと気づいたこと。
アイリスオーヤマのサーキュレーターなんですが、分かりますか?

配線が結束バンドで固定されているんですよ。
いや、私ならやりませんね。成型部品に固定用のフックをつけます。製品の見える部分に結束バンドなんて…

しかしよく考えてみると、成型部品だと金型も複雑になりますし、耐久性がないと折れてしまう可能性もあります。また、設計によっては留め具用のパーツが必要になるでしょう。
それに比べ、結束バンドなら耐久性の実績もよく知られていますし、汎用品なのでコストも安い。

顧客が欲しいモノとは、「必要な機能を必要なだけ(過不足なく)搭載したモノ」(常務の大山繁生氏)
アイリスオーヤマに見る 中途技術者の輝かせ方 - 日経テクノロジーオンライン

見える部分に結束バンドなんて…と思っていると、"必要十分"で勝負しているアイリスオーヤマや中華メーカーに駆逐されていくのでしょうね。
常識を疑え、という戒めでした。

アラサーが夏目漱石の「それから」を読んで、麺麭(パン)のために働らくことに思いを馳せる

最近、まとまった暇ができると青空文庫を読んでいます。

 青空文庫は、誰にでもアクセスできる自由な電子本を、図書館のようにインターネット上に集めようとする活動です。
 著作権の消滅した作品と、「自由に読んでもらってかまわない」とされたものを、テキストとXHTML(一部はHTML)形式に電子化した上で揃えています。
青空文庫編 青空文庫早わかり

リーダーアプリもあります。

play.google.com

今日、題材にするのはこちら。
夏目漱石 それから

読みはじめたきっかけ

学生の頃から続いている勉強会がありまして、ある回で「みんなの生きがいってなに?」というような題材を取り上げました。そのときに課題本にしたのが「仕事なんか生きがいにするな」。かなりセンセーショナルなタイトルですよね。

この本もとても面白いのですが、このなかで引用されていたのが夏目漱石の「それから」でした。

「猛烈には働らけるかも知れないが誠実には働らき悪いよ。食う為の働らきと云うと、つまり食うのと、働らくのと何方が目的だと思う」
「無論食う方さ」
「それ見給え。食う方が目的で働らく方が方便なら、食い易やすい様に、働らき方を合せて行くのが当然だろう。そうすりゃ、何を働らいたって、又どう働らいたって、構わない、只麺麭が得られれば好いと云う事に帰着してしまうじゃないか。労力の内容も方向も乃至順序も悉く他から制肘される以上は、その労力は堕落の労力だ」

この考え方、とても極端ではありますが、私にはかなり共感するものがありました。
というのも、私と同世代の人たちはいま、この種の選択に直面しているように思うのです。

安定した生活とやりがいのある生活は二者択一なのか

主人公の代助はいわば高学歴ニートで、親が資産家なので働く必要がありません。
代助の旧友、平岡は地方で会社員をしていましたが、(自主)退職させられた末、代助を頼って東京に戻ってきます。平岡にとっては、生活をするためには何であろうと(パンのために)働くしかないわけです。

一方、代助はいろんな言い分を並べつつも、実のところ自分のやりたいことを見つけられずにいます。そんな代助も、親から持ちかけられる縁談を断り続けていたため、下手すると勘当されてその安定した地位を失いかねません。

彼の頭の中には職業の二字が大きな楷書で焼き付けられていた。それを押し退けると、物質的供給の杜絶がしきりに踴り狂った。

代助は自分の感情に誠実にあり続けますが、結局のところそれは財政的な安定が前提となっていることがわかります。前提が崩れれば、彼もまたパンのために働かざるを得ません。

ところで、今日のTwitterでこんな話題がありました。

このツイートは就活生に向けた講演会の話ですが、私たちの世代はもう少し上で、会社に入って数年経ち社会の現実が見えてきた頃。
就活時に「安定した大企業」に就職した人たちにとっては、今がもう一度選び直せるチャンスかもしれません。でも、代助のようにやりたいことが見つからず、安定した地位からは抜け出しづらい。仮に「ヘンな仕事して楽しく生きる」ことを胸に秘めていたとしても、結婚や家族のためにそれを諦めることもあるでしょう。
平岡のようにパンのために働いて生きていたら、クラスメイトの代助に笑われるだろうか?

私も含め、みんながどう舵を切っていくのか、楽しみです。

bitFlyerでbitcoinをはじめる(後編)

前回の記事
ndanah.hatenablog.com

bitFlyer ビットコインを始めるなら安心・安全な取引所で

bitcoinの購入

銀行口座の承認が降りたので、bitcoinを購入してみます。
ひとまず一番低い手数料の分水嶺がある10万円以上20万円未満を狙って、0.25BTC(今日時点で11万くらい)を購入してみます。
手数料一覧・税 - ビットコイン(Bitcoin)の購入/販売所/取引所【bitFlyer】

ホームから「取引所」か「ビットコイン」を開き、買いたいビットコインを入力します。

「買う」をタップして注文を確定します。

これでbitcoinを手に入れました!

ウォレットをつくる

ウォレットにはいろんな種類があり、一般に

【セキュリティ】
コールド>デスクトップ>ウェブ
【利便性】
ウェブ>デスクトップ>コールド
ビットコインの使い方を知るには、ビットコインを保管するウォレットや取引所の区別から | Hello Vandle[ハローバンドル]

と言われています。bitFlyerに入れたままの状態はいわばウェブウォレットに入っている状態で、運営が不正をしたりハッキングされたりするとbitcoinを失うことになります。なので、高額なbitcoinをウェブウォレットに入れておくのは危険だというのが通説です。
個人的には、ウェブウォレットに移すならbitFlyerに入れたままのほうが良いと思います。別のウォレットに移すのにも送金手数料取られますし。
というわけで、今回はデスクトップウォレットのBitPay(旧Copay)を利用します。
copay.io

私はMac+iPhone使いなので、この組み合わせでインストール手順を追っていきます。
どの環境でもアプリ画面は一緒だと思います。

Mac版のインストール

Copayのサイトからダウンロードのリンクを辿っていくと、GitHubに飛ばされます。
列挙されているリンクのうち、末尾が.dmgのものをクリックしてダウンロードします。*1
f:id:ndanah:20170814174544p:plain:w350
インストールして起動すると、エラーが出て開けない。
f:id:ndanah:20170814174611p:plain:w350
こういうときはcontrolを押しながらクリックして開くと、このアプリケーションを信頼するか聞いてくれるようになって開けます。
OS X Mavericks: 開発元が未確認のアプリケーションを開く

あとはこのサイトを見ながらやればOKです。なぜか英語版で起動したので、英語が読めない人はスクリーンショットの日本語を見ながら進めましょう。
bitclubfun.com

日本語へはSettings→Languageから切り替えられます。ついでに表示通貨もJapanese Yenに変えておきましょう。

BitPayの画面から受取でQRコードを表示

bitFlyerのアプリから、Pay→送金→QRコードをスキャンして送金

これでウォレットに送金できます。送金手数料がかかるので全額は送れません。0.24BTC送金しました。

iPhoneにウォレットを同期する

Mac側のBitPayから、設定→ウォレットと連動から対象のウォレットを選び、その他のオプション→ウォレットをエクスポート→QRコードと選ぶと、ウォレットを表すQRコードが表示されます*2

iPhoneApp StoreからBitPayアプリをダウンロードします。
appsto.re

この画面の「バックアップから復元」を選びます。

右側のアイコンをタップすると、QRコードの読み取り画面になるので、これでMac側のQRコードを読み取ります。

これでMaciPhoneとで同じウォレットを管理できるようになりました。

*1:前ページでプラットフォーム選んだ意味なくないかこれ

*2:要するにこれがウォレットの秘密鍵ということですね