タイ・チェンマイに行ってきた

タイトルの通りですが、2019年1月末にチェンマイに行ってました。

チェンマイはご飯もうまいし治安もよい、観光名所も多い、さらにショッピングモールが多い上に遅くまでやっているという、一日中いろんなことして遊べる最高の観光地です。

良いとこだったよ!の紹介をしたいので、自分の記録も兼ねてまとめてみました。

続きを読む

Python+Django+MySQL環境でMySQLdbがModuleNotFoundErrorになったときの対処

こんなエラーログ

  File "/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
ModuleNotFoundError: No module named 'MySQLdb'

対処方法

使っているsettingファイルに、以下のコードブロックを挿入する。

import pymysql
pymysql.install_as_MySQLdb()

Python3系でMySQLに接続するときに出るエラーとのこと。
ログが ModuleNotFoundError を出すので、問題の本質を見失う…

参考

https://codelab.website/python3-django-mysql/

Django Rest FrameworkのSerializerでバリデーションをして、ついでにkey名を変更したいとき

Modelから取得したレコードをシリアライズするSerializerでは、入出力するkey(カラム)名が異なる場合、sourceオプションで入力元のカラム名を指定すればよい。
しかし、dictを整形したりvalidationしたいがためだけにSerializerを使う場合、これが逆にする必要があるようだった。
言い換えると、プロパティ名に入力key名、sourceオプションに出力key名を指定すれば実現可能。

Python 3.6.8、Django 2.1.7で検証。

from rest_framework import serializers

class TestSerializer(serializers.Serializer):
    user_name = serializers.CharField(source='name')
    user_age = serializers.IntegerField(source='age')
data = {
    'user_name': 'たろう',
    'user_age': 24
}

serializer = TestSerializer(data=data)

serializer.is_valid()
>>> True

serializer.data
>>> {'user_name': 'たろう', 'user_age': 24}

serializer.validated_data
>>> OrderedDict([('name', 'たろう'), ('age', 24)])

serializer.data じゃなくて serializer.validated_data を使うのも忘れずに。

serializer.data は source -> property で
serializer.validated_data は property -> source
になると考えると覚えやすい。

ちなみにエラーになるデータはこんな感じです。

data = {
    'name': 'たろう',
    'age': 24
}

serializer = TestSerializer(data=data)

serializer.is_valid()
>>> False

serializer.errors
>>> {'user_name': [ErrorDetail(string='この項目は必須です。',  code='required')],  
     'user_age': [ErrorDetail(string='この項目は必須です。', code='required')]}

この使い方の是非はしらない!

Jestでテストを強制的に失敗させたい場合

fail() のようなメソッドが用意されているかと思ったけれど、ないっぽい。

https://stackoverflow.com/questions/42176642/in-jest-how-can-i-make-a-test-fail

StackOverflowおじさんたちは、テストを失敗させたいところで

throw new Error('failed');

としたり

expect(true).toBe(false);

としたりの力業に頼れと仰せだった。
Python慣れしていると微妙に不便。
throw が一番現実的かな。

__init__.pyがないディレクトリに出るエラー

基本的なことなんだけど、この手のエラーに関する日本語の情報が少なかったので書き残し。

pythonディレクトリを作るときは __init__.py が必須。当たり前の話だけど初心者なのでちょっとハマった。
__init__.py がなくても動く場合があるからややこしいんだけど)
ない状態だと、同じ構成の名前空間が同一パッケージ内にあると衝突する。

例えば、

root_dir
├ package_name_A
│ ├ views.py
│ └ tests.py
└ package_name_B
  ├ views.py
  └ tests.py

root_dir
├ package_name_A
│ ├ views.py
│ └ tests
│   └ tests.py
└ package_name_B
  ├ views.py
  └ tests
    └ tests.py

にしたいとき、それぞれの tests/__init__.py を置かないと、

____________ ERROR collecting root_dir/package_name_A/tests/tests.py ____________
import file mismatch:
imported module 'tests' has this __file__ attribute:
  C:\Users\user\Desktop\dir\root_dir\package_name_B\tests
which is not the same as the test file we want to collect:
  C:\Users\user\Desktop\dir\root_dir\package_name_A\tests\tests.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
 generated xml file: C:\Users\user\Desktop\dir\junit.xml

になる。
tests/tests.py が2つあるので衝突する。
もしこれが

root_dir
├ package_name_A
│ ├ views.py
│ └ tests.py
└ package_name_B
  ├ views.py
  └ tests
    └ tests.py

だったら問題なく動く。
ちょっと不思議。

GitHubにDraft Pull Requestが追加されたけど利用制限があるみたい

8/3追記
一部プランで使用できるようになってました。
GitHub Proの人が作ったリポジトリ+Privateで確認。
一方GitHub Free+Privateはまだ未対応でした。ほかはよくわかりません。情報求む。


2/15ごろからGitHubにDraft pull requestという機能が追加されました。
WIPを付けたPRを立てなくてもいい!と期待の機能でしたが、
いざ使おうと思ったらそんなボタンがどこにも存在しない。
よく見ると、全リポジトリに対して開かれた機能じゃなかったようです。

Pull Requestのヘルプページ

https://help.github.com/articles/about-pull-requests/#draft-pull-requests

によると、

Draft pull requests are available in public repositories with GitHub Free and GitHub Pro, and in public and private repositories with GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server.

とのこと。
日本語でまとめると、利用可否は下記のようになっていると書いてあります。

パブリックで対応, プライベートで非対応

パブリックもプライベートも対応

GitHub Proかつプライベートリポジトリでもダメとは。悲しみ…
自分の業務では恩恵に預かれませんでした。
対象リポジトリの拡張を待ちます。頑張ってGitHub先生…

MacOS 10.7 Lion でHTTPのページが開けない&設定からAppleIDを登録できない現象

スタートの状態

会社の先輩ら古めのMacBookを譲り受けた。
初期化済み&初期化後の確認のため、適当なrootユーザー作成済み。
osはMacOS 10.7 Lion。

発生したこと

  • HTTPSのページが開けない
  • 「設定」からAppleIDサインインできない(アプリDLできない、iCloud繋げない)
  • AppleIDサインインできないのでAppStoreからAppダウンロードができない
  • MacOSはAppStoreからダウンロードする必要がある
  • バージョンアップできない
  • Appleの公式サポートに、SSL通信の問題が起きたらバージョンアップしろと書いてあった
  • 詰み

解決方法

やったこと

1. 再初期化
2. ようこそ画面でID登録
3. AppStoreからEl Capitanインストール
4. Mojaveをインストール

※一度El Capitanを挟んだのは、10.7から直接Mojaveにバージョンアップできないため。
Mojaveに直接アップデートできるのは10.8以降。

変わること

  • 設定からどう頑張ってもAppleIDにサインインできなかったが、ようこそ画面からだと一発でサインインできた
  • →AppStoreからアプリを落とせるように→El Capitan、Mojaveがダウンロードできた
  • →バージョンアップしたらHTTPSにつながるようになった

原因

Apple公式でのQAを見るに、10.8.5以前のMacOSSSL周りが死んでるらしい。おそらくこれが原因
https://discussionsjapan.apple.com/thread/110210266?answerId=101111151122#101111151122

とりあえずMacは困ったら初期化