忙しい時期に体に起こったこと、これからどうするか
1月〜3月までデスマっていたのでその時に体に起こった不調をメモしておきます。
12月頭
風邪を引いたような気がする。
仕様は何も決まっていなかった。
2月7日
全身になぞのかゆみと腫れ、最初は電気毛布を消さずに寝ていたので全身低温火傷でもしたかと思ったけど、原因はじんましん。
飲み薬やら塗り薬やらを処方される。
ゴールのイメージは全くできていなかった。
2月以降
休日に夜中や朝まで働いてそのまま月曜日は休みを取って眠り続けると言った生命維持が必要な休息のみをとり続ける。
会社にいても自社にいてもslack通知が来れば24時間365日即時対応を求められるような状態ではっきり言って家にいても退社しても全く心は安まらなかった。
飯寝る仕事以外のあらゆることはできておらず、かなり病んでたと思う。
仕様はもちろん決まらないしテストもほぼなしでとにかく20時頃に欲しいと言われた機能を25時頃本番反映するような生活を続けた。
3月某日
せめてもの憂さ晴らしにSNSで暴れていたら会社のめっちゃ偉い人、1年に10回も顔を合わさないレベルの偉い人よりSNSの利用に関する注意喚起が入る。
中指を立てたかったが本人に言われたわけではないので堪え忍ぶ
3月某日
謎の歯痛。夜中ほとんど寝れず。
翌日痛みは治まったが念のために歯医者に行くも虫歯はないと言われるし歯周病などでもないし原因不明と言われる。
恐らく肩こりとかに起因するものじゃないかと思う。
3月終盤以降
休日に呼び出されることはなくなったのでまぁましにはなったと思う。
しかし、デスマ時にはこんな地獄から抜け出すためにギーラボでイベントを毎週開いてもっと楽にお賃金を稼ぐための行動をするんだと思いつつも現状何も全くできていない。
とにかく眠り続けたいの一心で生きている。
休みの日は11時頃起きてきてお昼を食べたら17時頃まで寝るような生活をしている。
もはや飯と睡眠と合間にアニメを見るだけの生活だ。
4月9日
仕事は落ち着いたが突然謎の歯痛が再発。
翌日になっても全く痛みが引かず。
虫歯がないことは3月半ばに確認済みなのでとりあえず内科に行くも耳鼻科に行けと言われる。
鼻の奥や喉は腫れているのでその影響かもと言うことで痛み止めと抗生物質その他が処方される。
熱は38度弱、原因は不明ながらとりあえず薬を飲み続ける。
本日
薬は尽きる、痛み止めは残っているので痛みで悶絶することはないのだろうが原因が分からないので恐怖の日々は続く。
原因)
年老いてストレス耐性がなくなったのか今までにないストレスを受けて体がおかしくなったのかはよく分からない。
正直あまりの体力低下にこのままでは下請けIT業界で仕事し続けることはもう不可能なんじゃないかと思う。
もちろんデスマを乗り切っても休日が与えられるわけもなく、今月も単価に沿った労働をしなければならない。
ならないが今月すでに2日も休んだため絶賛遅延中、遅延しているのは分かっているが残業する気力もすでにない。
対策)
とりあえずラジオ体操を再開してみた。
あとアニメを見るときは寝っ転がらずに立って腕ふりなんぞをしながらみるようにしてみた。
目に見える効果はまだない。歯痛の原因も分からない。仕事は絶賛遅延中
Django SwaggerにQuery stringの項目も出したい!
環境
Django==1.11
django-rest-swagger==2.1.1
djangorestframework==3.6.1
coreapi==2.3.0
やりたいこと
swaggerにそのapiで対応しているQuerystringの項目名を表示してやりたい。
例) クエリストリングで日付を指定する必要があるapi
xxx.com/api/access_data?start=2013-03-04&end=2018-02-02
QueryStringのチェックはSerializerを使いたいのでSerializerを宣言したらそこの項目が自動的にswaggerに表示されると良いな
★最終的にできた画面
やったこと
とりあえず、表示したいselializerを宣言する
selializer.py
class XxxxParameterSerializer(serializers.Serializer): start = serializers.CharField(help_text='開始日(yyyy-mm)', required=True) end = serializers.CharField(help_text='終了日(yyyy-mm)', required=True)
・Swaggerに返す用のBaseFilterBackendを宣言
ここでSerializerに書かれた内容を読んでcoreapiFieldにセットする。
serializerはserializer_classで宣言したものが渡ってきます。
import coreapi from rest_framework.filters import BaseFilterBackend class SwaggerQueryStringFilter(BaseFilterBackend): """ create query string parameter for swagger """ def get_schema_fields(self, view): fields = [] for key, value in view.serializer_class._declared_fields.items(): field = coreapi.Field(name=key, description=value.help_text, required=value.required, location="query",) fields.append(field) return fields
上記の二つをviewにセットする。
view.py
class MyApiView(APIView): serializer_class = XxxxParameterSerializer filter_backends = (SwaggerQueryStringFilter,) def get(self, request): """ # コメント書くよ """ … return Response(datas)
ベストな方法かどうかは分かりませんが、とりあえず自分はこの方法で解決しました。
こつとしては filter_backends
の宣言を一つだけにして汎用的に使えるようにしたぐらいでしょうか。
他のViewSetとかの時は?
ModelViewSet だと modelやserializerの宣言がされていると思うのでそれが表示されます。
その際には model.pyの書くフィールドの宣言のhelp_textがディスクリプションに表示されるのでhelp_textをがんがん書くといいのかなと思います。
調査するときに困ったこと
swagger 0.3の話がいっぱいあった →swagger0.3と 2系はかなり破壊的な変更がはいっているのでyamlにコメント云々みたいなのは0.3の話なので無視しましょう。
課題
・Django swaggerってexampleとかtypeって表示できないのかなぁ・・・・(今の表示項目だけだとちょっと物足りない)
感想
APIのドキュメントを作るのはしんどいし、なにもないのもしんどいような場合swaggerがドキュメントの代わりを出来れば良いなと思って今回トライしてみました。
ただでさえ少ないDjangoエンジニアでDjangoRestFrameworkを使っててswaggerを使ってqueryStringをここに表示させたいなんて需要日本で他にあるのだろうか・・・
2017年の振り返り
2017年も終わるので振り返ろうと思います。
○お仕事
一年間をDjangoRestFrameworkに捧げました。
分からないから少し分かるになったような気がします。
awsのアソシエイトの資格が取れました。
資格を取るとawsのコンソールを触ることが怖くなくなってきました。
インフラはもう少し面倒見れるようになれればいいなぁと思います。
○健康面
何度か風邪を引いたり腰痛で休んだりしました。
田舎健康おじさんを目指して少し運動しようと思います。
○勉強
この1年ではっきりしましたが自分はファーストペンギンになって新しいものを追いかける力は全くありません。特に未知のものに対しては超苦手でした。
欲しい情報をググってコピペする才能しかありそうになりません。
どうも技術者として生きていく力はなさそうだなーということがはっきりしました。
とはいえ何とかして生きていかなければならないので、とにかく今やってることをきちんとまとめていったりよりよいコーディングをして行ければなぁと思います。
まぁ飛んできた玉を打ち返しつつ、なにか全然違うプログラミング以外のスキルを伸ばしていこうかなと思います。
はっきりいって僕は技術力が一番大事という言説を一切信じていませんがその話は割愛しようと思います。
それではみなさま良いお年を
How to start and stop EC2 with AWS lambda
sorry! my english slill is very low!
英語で書いた方がアクセス数稼げるんでね?って推測を基に怪しい日本語と英語で記事を書いてみようと思います。(en: i think tech blog what written by english can get more access, so I challenge to write blog in English.)
I write start/stop EC2 and set and register_instances_with_load_balancer/ deregister_instances_from_load_balancer.
EC2をlambdaで開始する方法(en:How to start EC2 with lambda?)
runtime: python3.6
import sys import boto3 import os client = boto3.client('ec2') ec2 = boto3.resource('ec2') elb_client= boto3.client('elb') instance_id = os.environ['INSTANCEID'] elb_name = os.environ['ELBNAME'] def handler(event, context): # start EC2 response = client.start_instances(InstanceIds=[instance_id,]) instance = ec2.Instance(id=instance_id) instance.wait_until_running() # add elb response = elb_client.register_instances_with_load_balancer( LoadBalancerName=elb_name, Instances=[ {'InstanceId': instance_id}, ] )
we need set Environment variable like this
EC2をlambdaで終了する方法(en:How to stop EC2 with lambda?)
runtime: python3.6
import sys import boto3 import os from time import sleep client = boto3.client('ec2') elb_client= boto3.client('elb') instance_id = os.environ['INSTANCEID'] elb_name = os.environ['ELBNAME'] def handler(event, context): response = elb_client.deregister_instances_from_load_balancer( LoadBalancerName=elb_name, Instances=[ {'InstanceId': instance_id}, ] ) sleep(10) response = client.stop_instances(InstanceIds=[instance_id4,])
DjangoRest FrameWorkで違うSerializerのfieldを使い回す方法
タイトルが長いですね
何がやりたかったかというと簡単な話です
親のSerializer fields =('項目A', '項目B', '項目B', '項目C') 子のSerializer 親のFields に加えて 項目D
継承使えば簡単でしょって思ってたんですが結果的には継承では上手くいかないことが分かったので
class BaseSerializer(serializers.ModelSerializer): class Meta: model = Mymodel fields = ('field_a', ) class ChildSerializer(BaseSerializer): field_b = serializers.CharField() class Meta: model = Mymodel def __init__(self, *args, **kwargs): self.Meta.fields = list(BaseSerializer.Meta.fields) self.Meta.fields.append('field_b') super(ChildSerializer, self).__init__(*args, **kwargs)
def init()で親のfieldsを読み込むなんて、これ継承の意味ないじゃんって気もします Childの方のfieldsに何かを書くと上書きされてしまうので意味がないし、Baseのfieldsに全部書いておいて不要項目を取り除きながら使う方法もありますが、それだとSerializer呼ぶところ全部に必要項目渡さなきゃ行けないしちょっとめんどい、childの方にfield_aとbを宣言する方法も採れますが、いまいち感満載。
なんか良い方法あるんだろうなぁと思いつつとりあえず自分なりの解決方法だけ残しておきます
pythonチュートリアル メモ 後半
pythonチュートリアル第3版を読んでみてのメモになります。
付箋紙を貼りながら読み進めるスタイルだとブログにまとめる際に楽なので今後もこのスタイルで読書していこうと思います。
自分が知らなかったこと、気になった部分だけどを抽出しているだけなのでpythonを学ぶ上での普遍的な重要ポイントを書き出してるわけではないことをご了承ください。
6章 モジュール
特になし
7章 入出力
ゼロパディングするとき
'12'.zfill(5) >>>'00012'
フォーマット関数にキーワード引数を取れる
"お賃金は{money}円です".format(money="5000兆")
8章 エラーと例外
tryにコードを追加せずにelseに後続処理を書いた方が、
後続処理で予期せず同じ例外をキャッチしてしまう問題を回避出来る。
→だいたいtryの後続にそのまま書いていたので、新鮮な書き方でした。
とはいえ0で割るエラーとかは割り算でしか起こりえないし、他の行で同じエラーが起こることってあんまりないような気もします。
個人的にはtry節にそのまま書いていってもいいんじゃないかなぁと
try: エラーを予見する処理 except: 例外処理 else: エラーにならなかった時の処理
9章 スコープと名前空間
説明が難しいけどこういうことができる。
外側のスコープの変数の値を更新出来る
def friends_test(): def nonlocal_friends(): nonlocal friend friend = "すっごーい" frined = "〜なフレンズなんだね" nonlocal_friends() print(friends) >>> "すっごーい"
10章 標準ライブラリめぐり
関数のコメントを実行出来る
def gacha_cost(cost) """ >>> print(gacha_cost(3000)) 0 """ return 0 import doctest doctest.testmod()
11章〜14章
特になし
付録 用語集
こういう表現をするんだってのを知ったものだけピックアップ
EAFP(ごめんなさいはお願いしますより楽):try〜catchするような処理
LBYL(飛ぶ前に見ろ/転ばぬ先の杖):キーがあるかどうか先に調べてif文なんかで先に聴いておくような書き方
pythonチュートリアル メモ 5章まで
とりあえず読んでて知らなかったこと、知らなかったけど便利そうな書き方や考え方を見つけ次第メモしていこうと思います いわゆるチラシの裏ってやつです
1章
特になし
2章
特になし
3章
・raw文字列を使うと正規表現を無視できる
r'c:\name'
\nの部分を改行として扱わなくなる
・文字列は変更不能体(immutable)
・リストは変更可能体(mutable)
・print関数にendを渡すと表示するたびの末尾に好きな文字を入れられる。
for i in range(100): print(i, end=",") >>0,1,2,3,4・・・
四章
・range()などを反復可能態(itarable)と呼ぶ
・ラムダを使って配列内のタプルのソート
>>>sphere = [(1, 'toyosaki'), (2, 'kotobuki'), (3, 'takagaki'), (4, 'tomatsu')] >>>sphere.sort(key=lamda member: member[1]) [(2, 'kotobuki'), (3, 'takagaki'), (4, 'tomatsu'), (1, 'toyosaki')]
関数名.docで関数の下のコメント行が呼び出せる
5章 リスト
・list名.pop()すると最後に追加された要素を取り出す
aqours= ["千歌", "曜"・・・] aqours.append("黒澤ダイヤ") aqours.pop() 黒沢ダイヤ
・辞書の作り方
tika_idle = dict(name="maison book girl ", rebel="tokuma", members=4)
個人的には下の書き方よりもクォーテーションを書かなくて済む分好きかもしれません。
{"name": "maison book girl", "rebel": "tokuma", "members": 4}
今回読書した分をブログにまとめるために改めて読み返しましたが、時間の無駄なので今後は読書のたび付箋紙とか貼り付けたほうがいいなぁと思いましたkindleとかって付箋紙的な機能あるのかな