ひとメモ

PythonとかFXとか

DockerアプリのHerokuへのデプロイをGitLab CIを使って自動化する

GitHubにpushするだけでHerokuにデプロイできるようになった

Dockerでwebアプリを作成し、それをHerokuにデプロイする際

$heroku container:push web
$heroku container:release web

という感じで、手元でビルドしたイメージをHerokuのContainer Registryにpushしていました。(公式ドキュメント

それだと時間がかかるのと、CI(Continuous Integration:継続的インテグレーション)というのを使ってみたかったので、GitLab CIを試しました。

その結果Git Hubにgit pushするだけで、修正した部分が自動的に反映されるようになりました。便利〜。

なお時間は同じかそれ以上にかかります。
でもPCつけたまま待たなくて大丈夫なのが良い。

関連記事 hwhw.hatenablog.com

手順

※Dockerfile等の説明は割愛します。

  • GitLabのアカウントを作成→GitHubと連携

  • プロジェクトのルート直下に.gitlab-ci.ymlというファイルを作成

  • HerokuのAccount Settings(アプリのSettingsじゃなくて画面右上の)でAPI Keyを取得

  • GitLabのSettings > CI/CD > Variablesで環境変数を設定

    • HEROKU_TOKEN = 上記のHeroku API Key
    • HEROKU_APP = Herokuのアプリ名
  • GitHubにpush → 自動でデプロイ!嬉しい!

.gitlab-ci.yml

そのままコピペで多分動きます。詳しく解説できるほど理解はしてない…。

push-heroku:
  only:
    - master
  image: docker:stable
  services:
    - docker:dind
  script:
    - echo $HEROKU_TOKEN | docker login --username=_ --password-stdin registry.heroku.com
    - docker build -t registry.heroku.com/$HEROKU_APP/web .
    - docker push registry.heroku.com/$HEROKU_APP/web

    - docker run --rm -e HEROKU_API_KEY=$HEROKU_TOKEN wingrunr21/alpine-heroku-cli container:release web --app $HEROKU_APP

参考リンク

ほぼQiita記事のymlファイルまんまですが、それだけだとheroku container:release webの部分が自動でできなかったのでもう一つのリンクを参考に全自動にしました。

HerokuのContainer RegistryベースのデプロイをGitLab-CI上で行う - Qiita

Release container to heroku with Gitlab.ci – Qrated – Medium

Dockerイメージのベースをubuntuからalpineに変えてビルドを高速化する

alpineにすると軽くなると聞いた

↓のwebアプリを作成する際、環境構築にDockerを使っていて、HerokuへのデプロイもDockerごと(?)上げています。
些細な変更をしただけでもビルドにいちいちとても時間がかかっていたので、なるべく速くビルドができないかと軽量化を図りました。

hwhw.hatenablog.com

結果

ubuntuベース 635MB

alpineベース  244MB

391MBの減量に成功

Herokuへのデプロイも少しだけ速くなったような気がします。(計ってないのでわからない)
なおDockerfileの書き方はよくわかっていないので、効率の悪いやり方になってるかもしれません。ご了承ください。

変更点

  • apt installが使えないので、apk addというコマンドを使用します。
  • パッケージの名前を変えないとエラーが起きたりします。python3-pippy-pip など。
  • psycopg2postgresqlを使うためのパッケージ?)をrequirements.txtに入れていましたが、エラーが起きるので調べた結果apk addのところにpy-psycopg2を追加したら動きました。

Dockerfile変更前

RUN mkdir /app

COPY src/requirements.txt /app
COPY ./src /app/src
COPY . /app

WORKDIR /app/src



RUN apt update && apt install python3 python3-pip vim sqlite3 sudo -y
RUN sudo apt install python-dev libpq-dev -y
RUN pip3 install -r requirements.txt




CMD ["python3", "app.py"]

Dockerfile変更後

RUN mkdir /app

COPY src/requirements.txt /app
COPY ./src /app/src
COPY . /app

WORKDIR /app/src



RUN apk add --update python3 py-pip vim sqlite sudo
RUN sudo apk add python3-dev postgresql-dev py-psycopg2
RUN pip3 install --upgrade -r requirements.txt




CMD ["python3", "app.py"]

指定した単語を含むツイートを消去する簡易プログラム書いた(Python)

過去のネガティブなツイートを消したい

前提

Pythonの環境構築、必要なパッケージのインストール、ツイート履歴の取得、Twitterの各種トークンの取得が必要ですが、説明は省略しています。

github.com

検索をかけて出てくるツイート消去ツールがうまく使えなかったので、自分で書きました。以下コード。

コード

バグがないことを保証しません。これを利用して発生したいかなる損害についても責任を負いません。利用は自己責任でお願いします。

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import os
import sys

import pandas as pd
import twitter
from requests_oauthlib import OAuth1Session


# In[2]:


consumer_key = os.environ["CONSUMER_KEY"]
consumer_secret = os.environ["CONSUMER_SECRET"]
access_token = os.environ["ACCESS_TOKEN_KEY"]
access_token_secret = os.environ["ACCESS_TOKEN_SECRET"]


# In[3]:


def return_twitter_api():

    api = twitter.Api(consumer_key=consumer_key,
                          consumer_secret=consumer_secret,
                          access_token_key=access_token,
                          access_token_secret=access_token_secret)

    return api


# In[4]:


def delete_tweets(tweet_ids):
    api = return_twitter_api()
    count = 0
    

    
    for id in tweet_ids:
        status = None
        
        try:
            status = api.DestroyStatus(id)
        except:
            if  'No status found with that ID.':
                continue
        finally:
            if status != None:
                count += 1
            else:
                pass

        
    return print("{}件のツイートを消去しました。".format(count))


# In[5]:


tweet_df = pd.read_csv("/hoge/tweets.csv")


# In[6]:


tw_id_and_text_df = tweet_df.reindex(columns=["timestamp", "tweet_id", "text"])


# In[7]:


print("消したいキーワードを入力してください。複数の単語を入力するにはスペースで区切る(cを入力でキャンセル)")
input_words = input().split()
if input_words == ["c"]:
    print("キャンセルしました")
    sys.exit()
elif input_words == []:
    print("単語を入力してください")
    sys.exit()
else:
    pass


# In[8]:


wanna_delete_words = "|".join(input_words)
wanna_delete_df = tw_id_and_text_df[tw_id_and_text_df["text"].str.contains(wanna_delete_words) == True]


# In[9]:


wd_tweet_ids = wanna_delete_df["tweet_id"]


# In[10]:


columns = ["timestamp", "text"]
new_df = wanna_delete_df.reindex(columns=columns)


# In[11]:


print(new_df)
print("対象ツイートは{}件あります。実行しますか? y/N".format(len(wd_tweet_ids)))
ans = input()

if ans == "y":
    delete_tweets(wd_tweet_ids)
else:
    print("キャンセルしました。")

補足

In[2]では環境変数に設定した各種トークンを変数に代入しています。
そのコードをどこにも上げないなら直接ここにconsumer_key = "hogehogefugafuga" みたいに入力してもOK。

In[4]のexcept内では既に別の単語に引っかかって消去済みのツイートに当たった場合No status found with that ID. と返ってくるのでそれを無視しています。
本当はそれが増えてくると実行時間の無駄なので、消去済みのものにはフラグを立てていった方がいいんですが、面倒なのでやってません。

やるならpandasのDataFrameに新しいcolumnを作って、消去済みかどうかの真偽値を入れる感じかな。

In[5]にはダウンロードした自分のtweets.csvファイルのパスを入力してください。

キーワードを複数含むツイートなど、既に消去済みの場合があるので対象ツイート数と消去したツイートの数は異なる場合があります。

心理的安全性の高いマッチングアプリみたいなものを作った

コミュ障向けご飯誘いアプリ

f:id:hwhw:20190529074414p:plain

作ったきっかけ

Twitterしてると「〇〇日に東京行くので、誰かご飯食べませんかー?」みたいな募集を見ることがないですか?
あなたはそれに「行きたーい!」とすぐ返事できるタイプでしょうか。

私は「どうせ私が行きたいと言っても迷惑だろうし…」とウジウジしてしまうタイプです。

なので、気軽に誘ったり誘いに乗ったりできるアプリを作ろうと思いました。

できました

コミュ障向けご飯誘いアプリ

Twitterの相互フォロワーをチェックボックスで選ぶだけで、簡単に誘いをかけることができます。
相互に会いたいと思っている場合だけ、お互いにそれが伝わるようになっています。

誘う人は正直あまり会いたくない人から誘われて断る面倒を避けられ、誘いに乗る側は「え、この人も私に会いたいの…?」とか思われる心配をせずに済むというメリットがあります。

良かったら使ってみてください。
「ここが変」みたいなのも(優しく)指摘してもらえると嬉しいです。

GitHub - hitowaft/NGAC: コミュ障アプリ

使ったもの

  • Docker
  • Python + Flask
  • Heroku
  • Bootstrap

役立った本。一冊あるととても捗った。カバーの触り心地も良くてオススメ。

Bootstrap 4 フロントエンド開発の教科書

Bootstrap 4 フロントエンド開発の教科書

Dockerのimageを再ビルドせずに新しいパッケージを使う(docker commit)

Docker(docker-compose)、Python、FlaskでWebアプリを作ってます。

DockerfileにRUN pip3 install -r requirements.txt と記述し、アプリで使用するPythonのパッケージをインストールしているのですが、初心者なので必要なパッケージがわからず、開発が進むにつれてアレもコレも入れなくちゃ…となることがありました。

その際requirements.txtにパッケージ名を追記し、Dockerのイメージを再ビルドしていましたがめちゃくちゃ面倒です。

そういう時はcommitを使えばいいよと教わったので、手順をメモ。

手順

docker-compose upでコンテナを立ち上げ、
docker exec -it コンテナID bashでコンテナ内のbashを開きます。
(コンテナIDはdocker psで確認)

そこでpip3 install 必要なパッケージを実行し、必要なものをインストールします。

終わったらCtrl+Dでコンテナを抜けておきます。

そしてdocker commit コンテナ名 新しく作るイメージ名とすると、必要なパッケージがインストールされた新しいイメージが作成されます。
後はdocker-compose.ymlのimage名をその新しいものに置き換えるだけ。

以上です。イメージのビルドと違って一瞬で終わります。便利〜

Railsでボキャビル支援のwebアプリ作った(未完成)

興味のある英文記事から単語を抜き出すアプリを作った

こんにちは。ひとです。

読みたい英文記事があっても、知らない単語ばかり出てきて読み進めるのが大変じゃないですか?

そんな時はこれ。↓

ボキャビルサポーター

作りました。

まだ完成品とはとても言えないのですが、何とか使えなくもないレベルなので紹介させてください。

前提

私がよく利用している英単語学習アプリ、"iVoca"は単語帳を自作して勉強することができます。
そのフォーマットに合わせて、知らない単語を収集・出力し、効率よく単語帳を作ることを目的としています。

単語の学習自体は以下のサイトで進めることになります。

Home - 英単語タイピングゲーム iVoca

後述しますが、基本的には英語版のWikipediaから単語を抽出します。

使い方

トップページの真ん中にあるテキストボックスに知りたい単語を入力します。

次の画面で、頻出単語2800程度を除いた単語リストが出てきます。
ラジオボタンで知らない単語(覚えたい単語)を選び、一番下の送信ボタンを押します。

iVocaにそのまま貼り付け可能(←ここ微妙・字数制限に注意の項目を参照)なフォーマットで覚えたい単語リストが出てきます。copyボタンでコピーできます。

iVocaでブックを自作して、貼り付けます。
自分だけの単語帳を使って楽しくお勉強(^ν^)!

注意点など

怪しい訳に注意

トップページで入力する単語は、英語でも日本語でも大丈夫です。
日本語で入力した場合は、Googleの無料APIを使って単語を翻訳した上で、英語版Wikipediaの記事を探しにいきます。

日本語で入力した場合は全く関係のない記事が選ばれることもあります。
(例:青虫って入力したら鵜についてのページが出た。caterpillarのはずがcormorantで検索)

これはGoogleの翻訳がなぜかそうなってるからです。
調べたい言葉が英語で何と言うのかわかっている場合は、英語で入力することをオススメします。

単語の訳出にはフリーの英和辞書を使ってますが、こちらも正しさを保証しません。今のところそこまで突飛な間違いはなかったですが、怪しいなと思ったら念の為調べてみた方が良さそうです。

字数制限に注意

訳が推奨文字数の60文字を大きく超えていることがよくあります。 この場合、copyボタンを押す前に自分で適当な長さに編集する必要があります。
なお、知らない単語を選ぶ画面で訳文が編集可能なテキストボックスに表示されてはいますが、そこで編集しても最終のリスト出力画面には反映されません

本当はここで字数制限を超えていたら赤く表示したりして、お好みに編集した訳でリストを出力できたらいいんですが、まだそのあたりは未完成です。

なぜ作ったか

一時期Progateの有料会員になってRails講座を一通りやりました。
せっかく勉強したからにはRailsを使ってみたかったので、以前からの趣味である英語の勉強を兼ねて作りました。

かかった期間はギリギリ人に見せられる内容(一応動く程度)を作るのにちょうど3週間で、今もチマチマと改良しています。

ちなみにProgateで学べた部分はあんまり活かせてません…。

これから改善したいこと

  • クリックするのは面倒なので、キーボードで知ってる単語知らない単語を振り分けできるようにしたい。
    どういう技術を勉強すればできるようになるのかもまだわからない。

  • 訳文が60字を超えていると警告を出す。自分で編集した訳文でリストを表示。

  • 使っているとすでに覚えた単語が増えてくるので、簡単な会員登録をしてそれぞれの既に覚えた単語は省く機能?

  • 怪しい訳語があった場合すぐにチェックできる機能が欲しい。
    今のところはchrome拡張でiKnow!のポップアップ辞書とか使うのが良さげ。

  • 30分以内に次の画面に行かないとサーバーが停止して(?)、選択したデータが飛ぶかもしれないのでその対策。

  • URL入力でもうまくスクレイピングできるようにする。

  • スマホでも使えるようにする。

おまけ

読みたい英文記事のURLを入力するとそのページの単語を抜き出せる可能性があります…が、うまく動かない場合も多々あります。仕様です。

お世話になったリンク

何か変なところがあれば(いっぱいあるとは思いますが)、教えてくれると嬉しいです。
読んでくれてありがとうございました。

夜間のブルーライトをカットしたら寝つきが良くなった

ブルーライトをカットするためにアンバーグラスを買ったよ

夜間にアンバーグラスをかけ始めてまだ5日目ですが、明らかに寝つきが違うと体感しています。
寝る直前までスマホを使ってるにも関わらず。

おかげでメンタルの調子も割と好調。

以下詳細。
(2018/10/17:追記あり

夜にブルーライトを浴びると体内時計が狂いやすいらしい

何年か前からブルーライトの害はよく言われていますね。

パソコンを使う時には既にブルーライトカット機能付きメガネを使ってるよという人もいるのではないでしょうか。
PCやスマホを夜使わないようにしていても、室内照明が普通の蛍光灯だとブルーライト浴びまくりです。

それで私も気になってはいたのですが、最近まで買わずじまいでした。

夜なかなか眠れない…

私はメンタルの病気持ちなのもあって、ストレスを抱えやすくそれが睡眠に影響しているようでした。

具体的には、

0時頃に数分瞑想してから布団に入る→
寝ようとするも眠れず、10分後くらいに「眠れない…」などとツイートする→
それからまた10分くらい呼吸に集中するなどして寝ようとする→
やはり眠れずTwitterを眺める(この時点で1時くらい)→
過去のことなどをウジウジ考えながら気付いたら眠っている

という感じ。
あとは夜中に良く目がさめるのと、朝も起きる予定の数時間前に目が覚めてしまったり。
比較的すぐ眠れる日もあったし、そこまで深刻な不眠でもないけれどそれなりに辛かったのです。

そこで出会ったのがアンバーグラス

アンバーグラスって聞いたことあります?
私はこのブログを見て知りました。
ガチで夜のブルーライトを対策するためにオレンジのサングラスを買ったりとか | パレオな男

何でもその辺のメガネ屋さんで売ってるブルーライトカットメガネより、カット率が高いのだとか。
影響を受けやすい私は、早速紹介されていた商品を購入しました。

かけ始めた日の夜から寝つきが良くなった

寝る3時間前くらいからかけるといいとの事なので、私は21時頃からこのメガネをかけるようにしています。

かなり視界はオレンジになります。
外国人向けに作られていて大きいのか、かけ心地はお世辞にもいいとは言えません…。
ゴーグルっぽい感じで湯気がこもるので、お風呂上がりすぐは手持ちのサングラスをかけています。

初日はかけ心地が悪くて、買うの失敗だったかなと思ったのですが、いざ寝ようとするとあら不思議。すぐ眠れる。
ただその日は前日が睡眠不足だったので、そのせいもあるかなと思っていました。

しかしその次の日も次の日も、すぐ眠れる。
体感では5分以内には眠れてるという感じ。
わー、これはすごい!

そんなわけでアンバーグラス、オススメです。

注意点

朝は逆に光をしっかり浴びなければ、体内時計がリセットされません。
このメガネをかけるのは、少なくとも日が落ちてからが良いと思います。

私は軽い不眠でしたが、日常生活に支障が出るほど眠れないという方は他に原因があるかもしれないのでまずはお医者さんにかかってください。

上でも言いましたがかけ心地は正直良くないです。
グラスの下部が頰の上部に乗っかる形になるので、頰の脂や基礎化粧品がベタッとグラスに付きます。

慣れますが、気になりそうな人はとりあえずその辺のブルーライトカットメガネでもいいかも。

2018/10/17:追記

このメガネをかけ始めてから1ヶ月以上経ちましたが、相変わらず寝付きは良くなったままです!
お酒を飲んで帰って興奮状態にある時でも割と早く眠れるのでもう手放せないですね。

これをかけてると、寝る直前までスマホ見たりパソコンしてても大丈夫なのがありがたい。(流石に頭をフルに使うような作業した後は、やや寝付くのが遅くなりますが…)
改めてオススメですー。