空気清浄機 Trusens Z-1000を買った

空気清浄機 Trusens Z-1000を買ったよ

買うきっかけ:MacBook Proを買ったので

何を言ってるかわからないと思うが、MacBook Proを買ったので、空気清浄機を買うことにした。
……順を追って説明すると、俺の部屋というのはだいぶホコリが多い。 例えば、Nintendo Switchを買って去年の10月末から遊び始めたのだが、1月になると、遊ぶときにまれに「フォーーーーン」という音を立てるようになった。
きっとホコリが溜まって、内部のファンが作動してるんじゃないかと思う。

先代のパソコンを3年ほど使ってから分解したときは、予想通りにファンがホコリだらけだったし。
これではせっかく高価なパソコンを買っても、ホコリのせいで調子が悪くなってしまうかもしれない。
そんなのは嫌だ!
とはいえ、長年溜まった汚れをちょっと掃除したくらいで落とせるとは思えない。
……そうだ。空気清浄機を買おう。

ヨドバシに行くと、多種多様な

特にリビングに置くわけではなく、自室(この言い方は嫌なんだけど、いわゆる子供部屋)にいるから、小型のモデルが良い。

カドーは 水素水だった!

cado ap-c120 (cado Leaf 120)にしようかと思ったわけですが。 見た目が結構おしゃれだし。360度全方位から吸い込めるというし。

事業内容
電子機器製品及び関連商品の企画・設計・製造・販売
水素水関連商品の企画・設計・製造・販売

えっ!? 「水素水」!?

個人的に「水素水」がかなり嫌いなのだ。
なので、水素水関連商品を扱ってると知ってしまったら、 現在の製品一覧には、水素水関連商品は一切入っていない。だから、「会社概要」のページを見なければ気づかなかったかもしれない。

ダイソンの

外資

アコ・ブランズ・ジャパン

包装のビニール袋には、各国の言語で「」という旨が書いてあった。 英語フランス語ドイツ語までは分かったけど 何故か日本語がなかった。 さすがグローバル的商品だぜ。

機能としてはファンと紫外線(UVと書いてある)という単純なものだ。

グローバル「マイナスイオンがどうこう」とか「プラズマがどうこう」とか、そういう「日本でだけ流行ってる要素」をぶち込んで来ないので良いですね。 上記は、もとから目論んでいたわけではなく、買ってから気づいたことだけど。

ちなみに

MacBook Proを使い始めてからずっと、 机の上に持ち運びケースを 使わないときはパソコンを閉じて持ち運びケースの中に入れるという運用をしている。

なので、今も持ち運びケースをパカッと開いて、その上にMacBook Proを乗せて書いている状態である。

pandasでDataFrameの最初(一番左)に列を追加・挿入する方法

pandasでDataFrameの最初(一番左)に列を追加・挿入する方法。
環境:pandasのversionは0.25.3です。

f:id:soratokimitonoaidani:20200202135514p:plain

列名を指定して追加する方法だと末尾(最後、右端)に追加される

既存のDataFrameに1つの列を新規に追加する最も一般的な方法は、df['new_column'] = (追加したい値)だろう。しかしこの方法では、新しい列は一番右に追加されてしまう。

例を見てみよう。

import pandas as pd
pd.__version__
'0.25.3'
df = pd.DataFrame({
    'name'    : ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Fred'],
    'English' : [12, 34, 56, 78, 90, 100],
    'Math'    : [88, 66, 55, 44, 22, 11]    
})

df
name English Math
0 Alice 12 88
1 Bob 34 66
2 Charlie 56 55
3 David 78 44
4 Eve 90 22
5 Fred 100 11
df['new_column'] = 'value'
df['new_column_2'] = ['a', 'b', 'c', 'd', 'e', 'f']
df
name English Math new_column new_column_2
0 Alice 12 88 value a
1 Bob 34 66 value b
2 Charlie 56 55 value c
3 David 78 44 value d
4 Eve 90 22 value e
5 Fred 100 11 value f

確かに右側に追加されている。

先頭(最初、左端)に追加するにはinsertを使う

pandas.DataFrame.insert()関数
公式ドキュメント:pandas.DataFrame.insert — pandas 1.0.3 documentation

メジャーアップデートされた1.0.0のドキュメントを参照していいのか微妙ですが、多分ここに変更はないでしょう。

insertはドキュメントに記載の通り「指定した好きな位置に列を挿入する」関数である。したがってこれで先頭を指定すれば良い。

loc, column, valueは指定必須。

locが「列を挿入する位置」なので、先頭に入れたければ0を指定する。0 <= loc <= len(columns)でなければならない。
columnは列名。
valueは単一の値ならばその値を全行に指定、SeriesやArrayならばそれぞれの値を指定、だろうな。

valueの型は

int, Series, or array-like

って公式ドキュメントには書いてあるけど、文字列(str)を指定して普通に列を追加できたんだけど……あれ?

上に書いたのと同じ文で再度dfを作った後に
df.insert(0, 'new_column', 'value')
df
new_column name English Math
0 value Alice 12 88
1 value Bob 34 66
2 value Charlie 56 55
3 value David 78 44
4 value Eve 90 22
5 value Fred 100 11
df.insert(0, 'new_column_2', ['a', 'b', 'c', 'd', 'e', 'f'])
df
new_column_2 new_column name English Math
0 a value Alice 12 88
1 b value Bob 34 66
2 c value Charlie 56 55
3 d value David 78 44
4 e value Eve 90 22
5 f value Fred 100 11
df.insert(0, 'new_column_error', ['a', 'b', 'c', 'd', 'e'])  # 6行ぶんを書くべきところ、要素数5の配列を入れた

エラー(内容はクリックすると展開されます)

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-11-bca86ac7c013> in <module>
----> 1 df.insert(0, 'new_column_error', ['a', 'b', 'c', 'd', 'e'])  # 6行ぶんを書くべきところ、要素数5の配列を入れた


/usr/local/lib/python3.7/site-packages/pandas/core/frame.py in insert(self, loc, column, value, allow_duplicates)
    3588         """
    3589         self._ensure_valid_index(value)
-> 3590         value = self._sanitize_column(column, value, broadcast=False)
    3591         self._data.insert(loc, column, value, allow_duplicates=allow_duplicates)
    3592 


/usr/local/lib/python3.7/site-packages/pandas/core/frame.py in _sanitize_column(self, key, value, broadcast)
    3747 
    3748             # turn me into an ndarray
-> 3749             value = sanitize_index(value, self.index, copy=False)
    3750             if not isinstance(value, (np.ndarray, Index)):
    3751                 if isinstance(value, list) and len(value) > 0:


/usr/local/lib/python3.7/site-packages/pandas/core/internals/construction.py in sanitize_index(data, index, copy)
    610 
    611     if len(data) != len(index):
--> 612         raise ValueError("Length of values does not match length of index")
    613 
    614     if isinstance(data, ABCIndexClass) and not copy:


ValueError: Length of values does not match length of index

なお、すでにある列名を指定するとエラーValueError: cannot insert new_column, already existsが返ります。
それでは。

pandasのinfer_objects()は文字列を数値に変換しない

pandasのinfer_objects()は、数字の入った文字列('123')を数値(123)に変換しない、という話。

StackOverflowのURL: https://stackoverflow.com/questions/35003138/python-pandas-inferring-column-datatypes/48269724 のコメント

infer_objects()は、DataFrameのメソッドとSeriesのメソッドと両方がある。 pandas.DataFrame.infer_objectsの関数APIpandas.DataFrame.infer_objects — pandas 0.25.3 documentation
pandas.Series.infer_objectsの関数APIpandas.Series.infer_objects — pandas 0.25.3 documentation
(今後メジャーアップデートが来るから、バージョン指定したURLにしておくよ)

pandasの型システムであるdtypeが分かってないんだよね、という人は、以前dtypeについての公式ドキュメントを翻訳したので是非ご覧ください。

linus-mk.hatenablog.com

動作環境

python 3.7.6
pandas 0.25.3

StackOverflowの例

上記のStackOverflowのコメントによれば、pd.DataFrame(['1', '2', '3']) にinfer_objects()を適用しても、数値になってくれないらしい。本当だろうか。

df1 = pd.DataFrame(['1', '2', '3'])
df1.dtypes
0    object
dtype: object

このデータに対してinfer_objects()を適用する。

df1.infer_objects().dtypes
0    object
dtype: object

本当だ。確かにdtypesはobjectのままだ。

infer_objectsは型を「推測」するだけで「変換」はしない

関数名には、convertという単語は入っていない。
関数名の中にあるinferという単語の和訳は「推測する、推論する」であり、「変換する」ではない。
なるほど、ちゃんと考えてこの関数名にしたんだな、と思える。

公式ドキュメント([https://pandas.pydata.org/pandas-docs/version/0.25.3/reference/api/pandas.Series.infer_objects.html:title])の使用例は、確かに型を推測しているのであり、変換してはいない。

# 公式ドキュメントに載っている例

df2 = pd.DataFrame({"A": ["a", 1, 2, 3]})
df2 = df2.iloc[1:]
df2
A
1 1
2 2
3 3
df2.dtypes
A    object
dtype: object
df2.infer_objects().dtypes
A    int64
dtype: object

この例だと、最初に作ったDataFrameにaという文字列が入っていたので、dtypeがobjectに設定された。
数値部分だけを取り出したときも、dtypeは自動的に変換されないので、objectのままだ。 そこでinfer_objects()を適用すると、今あるデータが入る最適な型であるint64が選択された。めでたしめでたし。

なるほど。infer_objects() のやってることが分かったぞ。 じゃあ、全く同じことをやってみよう。ただし、文字列aではなく、浮動小数点数を使ってみよう。

# では文字列の代わりに浮動小数点数ではどうだろうか?

df3 = pd.DataFrame({"A": [9.876, 1, 2, 3]})
df3 = df3.iloc[1:]
df3
A
1 1.0
2 2.0
3 3.0
df3.dtypes
A    float64
dtype: object
df3.infer_objects().dtypes
A    float64
dtype: object

えっ。どういうことなの。今あるデータは整数だけなんだから、それが入る適切な型であるint64が出力されるんじゃないの?
infer_objects() 何もわからない。

じゃあ文字列を数字に変換する方法は?

to_numeric()を使いましょう。

pandasで型を推測するときの規則は? よく分からない……

APIリファレンスには以下のように書いてある。

The inference rules are the same as during normal Series/DataFrame construction.
拙訳:推測の規則は、通常のSeries/DataFrameの作成をするときと同じである。

「通常のSeries/DataFrameの作成をするとき」のdtype推論の規則は、どのようなものだろうか? この疑問の具体的な答えは、pandasドキュメントの中には見つからなかった。
例えば、DataFrameのコンストラクタについてのページ[https://pandas.pydata.org/pandas-docs/version/0.25.3/reference/api/pandas.DataFrame.html:title]では、 「引数dtypeがNoneだったら推測します(infer)」と書いてあるだけだ。具体的にどう推測するかは一切書かれていない。

「通常のSeries/DataFrameの作成をするとき」には、64bitの整数型で収まる場合にはint64型になる。

df_temp = pd.DataFrame({"A": [1, 2, 3]})
df_temp.dtypes
A    int64
dtype: object

例えば、上記と同じデータに対して、データ型int8を指定してDataFrameを作ってみよう。 このDataFrameに対してinfer_objects()を実施すると、 「通常のSeries/DataFrameの作成をするとき」と同じ推測を実行するのだから、上記の結果と同じint64になると期待される。

df4 = pd.DataFrame({"A": [1, 2, 3]}, dtype='int8')
df4.dtypes
A    int8
dtype: object
# 上のdf_tempと同じ型になるのだろうか?
df4.infer_objects().dtypes
A    int8
dtype: object

えっ。どういうことなの。今あるデータに対して、型の推測をいま一度実施して、特にint64が出力されるんじゃないの?
infer_objects() 何もわからない。

今日の結論

infer_objects() 何もわからない。

コートールド美術館展 魅惑の印象派

上野の東京都美術館で開催されていた「 コートールド美術館展 魅惑の印象派」に行ってきた(2019年12月の話)。
東京での開催は12月15日まで。2020年1月から愛知、3月から神戸で開催予定である。
コートールド美術館展 魅惑の印象派

美術研究所による解説図

公式サイトによれば、コートールド美術館は「世界有数の研究機関であるコートールド美術研究所の展示施設」である。 その特徴を活かして、充実した解説コーナーが設けられていた。

絵のうち数枚については、近くに「この部分はこういう特徴があるよ」「この人の衣装にはこういう意味があるよ」と鑑賞のポイントを解説していた。 個人的にはなかなかありがたかった。

印象に残った絵

スーラ 「クールブヴォアの橋」

ジョルジュ・スーラは点描技法を使った絵を多く残した。 31歳で病死してるんだな……早くして亡くなったんか……

「クールブヴォアの橋」はパリのセーヌ川の景色を描いた作品で、図録によれば 「自ら編み出した点描技法を画面全体に用いた最初の作品とされる」。

絵が気に入ったので、ポストカードとクリアファイルを買った。 ……が、ポストカードでもクリアファイルでも色合いがおかしい。 何か暗くてどんよりとした感じになっている。 元の絵の、明るく輝いていた色彩が失われてしまっている。

もとが明るい絵の場合、ポストカードとかはその明るさを上手く再現できないことが多い。 見返してみたら、夏に「松方コレクション」を見に行った時も同じ感想だった。
linus-mk.hatenablog.com

ルノワール「桟敷席」

劇場の桟敷席という、当時としては珍しい題材をとった作品。

桟敷席に集まる人々は、パリの流行の最先端の装いをしているわけで、いわば一種のファッションショーみたいなものだ。 確かに後ろのオジサン……男性(ルノワールの弟)も、双眼鏡を下ではなく上に向けている。

関連する展示として、当時の新聞の風刺画で「大劇場の桟敷席と典型的な人々」というものがあった。 現代風に言えば「劇場の桟敷席にありがちなこと」「劇場の桟敷席あるある」というところだろう。 そういう風刺のやり方は、100年前も現在も同じようなことをしてるなぁと思うと面白い。

モネ「アンティーブ」

南仏に滞在したクロード・モネがそこでの風景を描いたもの。 モネの手紙の文面がカッコいい。 『私は、太陽と刃を交え闘っています。この地の太陽は、なんて太陽だ!黄金と宝石で描かなければならないのです。』

山並みや空に薄いピンクが使われているのが面白い。風景をどういう色で描くか悩んだのかなー。

印象派の絵が多くあったので、珍しく図録を購入した

図録は結構ぶ厚くて場所を取るから基本的には買わない主義なのだが、 今回は好みの印象派の作品が数多くあったので、つい買ってしまった。

(余談:音声ガイドでナビゲーターをしていたのは俳優の三浦春馬だったけど、音声の途中で女性の解説者に交代することが多かった。 三浦春馬自身がしゃべってる部分は、他の美術展と比べても少なかったような気がする。)

森絵都 「風に舞いあがるビニールシート」読書メモ

森絵都風に舞いあがるビニールシート」を読んだ。読書メモ。

どういう本か?

文庫本50ページ程度×6編の短編小説集。
裏表紙の概要によれば、「大切な何かのために懸命に生きる人々を描いた」作品らしいよ。

何で読んだの

図書館が不要になった本を「ご自由にお持ち帰りください」と並べてあったのを見て、読もうと持ち帰った。

比喩表現

そもそもタイトルの「風に舞いあがるビニールシートからして比喩である。

三人は境内の前庭にあるくだんの梵鐘を通りかかった。背後の山を映やす残照を浴び、その黒々とした身をたおやかに揺すっている。(p.161 擬人法)
英文をさらさら追っていた里佳の目が、突然、小石にでも蹴躓いたように静止した。(p.262)

表現の細部

吠え疲れたのか諦念の目を宙にさまよわせる犬も、……

巧みな表現だと思うか、それとも表現が悪目立ちして鼻につくか、ちょっとギリギリのところではないだろうか。

おまけ

森絵都の作品の中で、なぜか中学入試によく出るのは「子供は眠る」である。 年上のいとこ?に表面上従ってきた 「バラバラになって床の上で揺れている貝殻」に傍線が書いてあって、「これは何の暗示でしょうか」という問題があり、 「主人公たちの関係が崩壊したことの暗示」が正解だったような。あれは自分が中学受験したときか、それとも塾で教えているときのことだろうか?

それでは。

濱口桂一郎 「日本の雇用と労働」読書メモ

濱口桂一郎「日本の雇用と労働法」を読んだ。読書メモ。

何の本か? 「現実の労働社会」と「労働法制」の2つを合わせて説明している本

本書がどういう本か、というのは、まえがきでしっかり説明してある。

本書はいささか欲張りな本です。「日本の労働システム」と「日本の労働法制」についての概略を、両者の密接な関係を領域ごとに一つ一つ確認しながら解説している本なのです。

実のところ、現状の「労働システム」と、「労働法」の各法律に書かれていることは、正反対である。 労働システムはメンバーシップ型だが、労働法はジョブ型で書かれている。 それを何とかむりやり継ぎ合わせているのが、判例法理である。(p. 41)
また、雇用契約がほぼ無内容である代わり、就業規則が強い権限を持っていることにも注意する必要がある。 「日本の労働法制の最大の特徴は、就業規則が雇用関係の根本的規範として位置づけられている点にあります。本来であれば雇用契約で定められるべき事項のほとんどが、就業規則に委ねられているのです。そして、雇用契約の締結は就業規則に書かれた事項を一括して合意したこととみなされ、これに基づいて労働条件や人事異動の弾力性や業務命令権の広範さが承認されるという仕組みです(p. 43)」
なにそれこわい。雇用契約を結んだら「就業規則の内容を全部合意した」とみなされるらしい。

以前に読んだ「若者と労働」との違いはというと、本書の方が

  • 労働法制のほうもかなり細かく説明している
  • 歴史的経緯が多い(ので、昔のことはどうでも良いわという人には不向き)
  • 判例の文章からの抜粋が多く出てくる(ので難しい言葉が使われがち)

という特徴がある。
判例に限らず、全体的に文体も硬い。もしも先に「若者と労働」を読んでなかったら、挫折していただろう。日本の労働社会についての本を初めて読もうという人には、絶対に「若者と労働」の方を勧める。

何で読んだの

日本型の労働システムについてより深く理解しようと思ったため。 買ったのは確か、現職のオファー面談に行く前、新宿ブックファーストかな?

面白いところ

  1. 203
    「パートタイマーをしている主婦は、家庭にメンバーシップがあるから、企業に対するメンバーシップが要らない」
    なるほどと目から鱗が落ちた。

pp. 84−89
社員の職務に限定が無いという話。会社側は基本的には好き勝手に社員の職務を変更できるし、その勤務地も変更できる(転勤させられる)。
たぶん外国のジョブ型の労働システムではまずありえないのだろう(文中に詳述無し)。 が、日本のメンバーシップ型の労働システムでは普通のことである。この違いの理由を、東亜ペイント事件・ケンウッド事件などの裁判を引きつつ、説明している。
また「『他の職種には一切就かせない』とまで合意していなければ、デフォルトルールは職種無限定ということ(p. 85)」とある通り、会社側の都合で職種も変更可能である。 事実、最近の富士通は「人事や総務をシステムエンジニアに配置転換するわ」と発表している (富士通、配置転換5000人規模 ITサービス注力で :日本経済新聞)。

なお、育児や介護をしている人に対して配置転換を命じるときには「状況に配慮しなければならない」という規定ができたことが、232ページでは書かれている。育児介護休業法の2001年改正である。
「もっとも、配慮規定ですから直ちに法的拘束力があるわけではありません。(p. 233)」とあるので、法律で「命令してはならない」と決まっているわけではない。 2019年6月にはカネカが育休明けの社員に転勤を命じて炎上したが、あれも別に法律違反では無い。「配慮規定」に違反する可能性があるだけだ。

分からないところ

中途採用・転職活動に関しては、ガッチリ募集条件が書いてあって「ジョブ型」に近いと思うんだけど、その点はどう捉えれば良いのだろうか。 「日本の雇用と労働法」「若者と労働」のどちらにも、中途採用や転職の話はほとんど書いていないので、よく分からない。

おまけ

ちょうど良いタイミングで、中山ところてんさんが本書を読んで感想を書いていた。 以下から始まる連続ツイートを見ると面白いかもしれない。

それでは。

Djangoで NoReverseMatch, XXX is not a registered namespaceのエラー

注意: この記事を書いているのはDjangoの超初心者です。分かっていないところが多々あります。
以下を読む際は、不正確な記述が含まれている可能性があることを考慮してください。


Djangoで NoReverseMatch, XXX is not a registered namespaceというエラーが出たときの対処法。

Djangoでformを作った。 formの中身は今回関係ないので、何でもよい。 例えば、公式ドキュメントのはじめての Django アプリ作成、その 4 | Django ドキュメント | Djangoを改変した例を書いておく。

sample.html

<form action="{% url 'sample_app:vote' question.id %}" method="post"> 
    (中略)
</form>

python manage.py runserverとサーバーを起動して、上記のsample.htmlに対応するページのURLを入力する。
ブラウザに出てきたエラーメッセージは次のとおり。

NoReverseMatch at /(URLのパス)/
'sample_app' is not a registered namespace

NoReverseMatchというエラーの中にはいくつか種類があって、 その中でもXXX is not a registered namespaceというエラーである。

まずフォルダ名を確認した。確かに「sample_app」で、スペル間違いは無かった。 スペル間違いが原因ではないなら、これは(エラーメッセージの通りだが)名前空間にアプリケーション名を登録していないのが問題である。


色々検索したところ、解決法は2つあるようだが、自分の環境で上手くいったのは1つの方法だけだった。

解決法はアプリケーションの中にapp_nameを指定すること

アプリケーションの urls.pyに app_name= 'sample_app' を書き加える。

djangoの公式チュートリアルでもこの方法が記載してある。
はじめての Django アプリ作成、その 3 | Django ドキュメント | Django
「URL 名の名前空間」という、そのものズバリのセクションで説明している。

もう一つの解決法? pathをincludeするときにnamespaceキーワードを指定する

プロジェクトの urls.pyの中で、includeするときにnamespaceを指定する

python - Django - is not a registered namespace - Stack Overflowのベストアンサーなどで書かれている方法だ。

urls.pyの中で

    path('(URLのパス)', include('sample_app.urls' , namespace='sample_app')),

namespace='sample_app'を追加すればよいと書いてある。

しかしこの方法では上手くいかなかった。実行すると、コンソール上でこんなエラーが出てきた。

    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

app_nameを指定していないのに、includeの中でnamespaceを指定するのはダメ、らしい。
うーん。よく分からない。

参考URL

https://stackoverflow.com/questions/41883254/django-is-not-a-registered-namespace/51343021 https://stackoverflow.com/questions/38390177/what-is-a-noreversematch-error-and-how-do-i-fix-it ベストアンサーが、NoReverseMatch全般に関してまとまったアドバイスを書いているので参考になる。