[ Python ] AWS KMS を使って暗号化と復元を行うkms_encrypterを作った

表題の通りです。AWS KMS を使って暗号化と復元を行う kms_encrypter を作りました。

インストール

$ pip install kms_encrypter

使い方

‘YOUR_AWS_KMS_ID’は作成した AWS KMS で作成したキーIDを代入してください。

from kms_encrypter import KMSEncrypter
encrypter = KMSEncrypter('YOUR_AWS_KMS_ID')
msg = 'hello , world'
encrypted_msg = encrypter.encrypt(msg) 
assert encrypter.decrypt(encrypted_msg) == msg 

Vue-TypeScript-Starter を作った

Vue-TypeScript-Starter を使うと Vue + TypeScript + Webpack + ES6 の環境を一瞬で構築することができます。

使い方

 $ git clone https://github.com/haradashinya/Vue-Typescript-Starter.git ${project_name>}
 $ cd ${project_name}
 $ npm install
 $ npm run dev

[Flask-SQLAlchemy] n日以内に誕生日が来るユーザーを近い順に並び替える

User テーブルが birth_date のDateTime 型のカラムを持っていると想定しています。

import datetime
from sqlalchemy import  db, extract, and_
...

def upcoming_birth_date_users(within_days):
    now = datetime.datetime.now()
    # monthdays に within_days の分だけ[(月,日),...]を格納
    monthdays = [(now.month,now.day)]
    then = now + datetime.timedelta(days = within_days)

    while now <= then:
        now += datetime.timedelta(days=1)
        monthdays.append((now.month,now.day))

    months = [monthday[0] for monthday in monthdays]
    days = [monthday[1] for monthday in monthdays]
    # monthdays に含まれているユーザー一覧を取得
    users = db.session.query(User).filter(and_(
        extract('month',User.birth_date).in_(months),
        extract('day',User.birth_date).in_(days),
    )).all()

    # 現在日時から誕生日が近い順に sorted_users にユーザーを格納
    sorted_users = []
    for monthday in monthdays:
        month = monthday[0]
        day = monthday[1]
        matched_users = [matched_user for matched_user in users if matched_user.birth_date.month == month and
         matched_user.birth_date.day == day]
        for matched_user in matched_users:
            # 重複していなければ sorted_users に格納
            duplicates = [sorted_user for sorted_user in sorted_users if sorted_user.id == matched_user.id]
            if len(duplicates) == 0:
                sorted_users.append(matched_user)

    return sorted_users

使い方

30日以内に誕生日を迎えるユーザー一覧を取得したい場合の呼び出しは以下になります。

upcoming_birth_date_users(30)

[ Vue ] vee-validateで入力内容が電話番号かどうかのバリデーションを自作する

vee-validate で入力した内容が電話番号かどうかのバリデーションを行ったのでメモしておきます。

let telephone = {
    getMessage(field,args) {
      return '電話番号は ✗✗✗-✗✗✗✗-✗✗✗✗,または10桁か11桁の数字で半角入力してください';
    },
    validate(value){
      let pattern;
      if (value.indexOf('-') ===  -1){
        // ハイフン無し
        pattern = /^\d{10}$|^\d{11}$/
      }else{
        // ハイフンあり
        pattern = /^\d{2,5}-\d{1,4}-\d{4}$/;
      }
      return pattern.test(value);
    }
  };

Validator.extend('telephone',telephone);

あとは

<input type="text" name="tel" v-validate="'telephone'" placeholder="電話番号を入力"> <div v-if="errors.has('tel:telephone')">{{errors.first('tel:telephone')}}</div>

で入力内容が電話番号かどうかのバリデーションが行えます。

[ Javascript ] 郵便番号から住所を取得する

郵便番号-住所検索APIを使うと簡単に郵便番号から住所を取得できるのでメモしておきます。

まず

  • jQuery 【https://code.jquery.com/jquery-3.1.1.min.js】
  • zipaddr.min.js 【http://api.zipaddress.net/sdk/zipaddr.min.js】
を読み込んでください。

後は以下の関数に郵便番号を引数で渡すと住所の値がdict形式で返ってきます。

  async getAddressFromPostalCode(postcode) {
      const url = 'http://api.zipaddress.net?callback=?';
      let query = {'zipcode': postcode};
      return new Promise((resolve, reject) => {
        $.getJSON(url, query, (json) => {
          if (json['code'] && json['code'] === 404){
            return reject({name: 'NotFoundPostalCode',code: 404, msg: 'does not find'});
          }
          if (json['code'] && json['code'] !== 200) {
            return reject({name: 'InvalidPostalCode',code: 500, msg: 'error'});
          } else {
            return resolve(json);
          }
        });
      });
    }

返り値,jsonの内容は以下になります。

prefaddresscitytownfullAddress
都道府県市 + 町都道府県 + 市 + 町