安心・健康・痩せる方法

アンヘルシープログラマーの備忘録

忙しい時期に体に起こったこと、これからどうするか

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に表示されると良いな

★最終的にできた画面 f:id:darakunomiti:20180404231728j:plain

やったこと


とりあえず、表示したい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

f:id:darakunomiti:20171217112716j:plain

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を学ぶ上での普遍的な重要ポイントを書き出してるわけではないことをご了承ください。

www.oreilly.co.jp

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章

特になし

15章 浮動小数点(float)の演算:その問題と限界

浮動小数点についての誤差とかの話が書かれてましたが正直よく分からない(分かろうという気がなかった)

付録 用語集

こういう表現をするんだってのを知ったものだけピックアップ
EAFP(ごめんなさいはお願いしますより楽):try〜catchするような処理
LBYL(飛ぶ前に見ろ/転ばぬ先の杖):キーがあるかどうか先に調べてif文なんかで先に聴いておくような書き方

感想

知っておくと便利だったなぁと思えることが色々出てきたので細かいところが読み飛ばして役立つところだけピックアップして読むにはよかったかなぁと思います。

正直名前空間の説明と浮動小数点の誤差とかの説明はよく分からなかったので基本情報ぐらい取ってコンピューターの基礎でも勉強した方がいいかなぁと思うばかり
pythonは標準モジュールや組み込み関数が充実してるのでその辺をもっと知れたらなぁと思うばかり

pythonチュートリアル メモ 5章まで

とりあえず読んでて知らなかったこと、知らなかったけど便利そうな書き方や考え方を見つけ次第メモしていこうと思います
いわゆるチラシの裏ってやつです

pythonチュートリアル

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とかって付箋紙的な機能あるのかな