よしたく blog

ほぼ週刊で記事を書いています

6月を振り返って

f:id:yoshitaku_jp:20180726014433p:plain

目次

  1. はじめに
  2. tl;dr
  3. 週1回ブログを更新する
    1. はじめてのホッテントリ
  4. 毎月ひとつ新しいことをやるプロジェクト2018年6月版:
  5. まとめ
  6. 過去の振り返り

はじめに

6月の活動を振り返ってみます。(今更

tl;dr

  • 6月を振り返りました
  • ホッテントリ入ったのが最高に嬉しかった!!!

週1回ブログを更新する

yoshitaku-jp.hatenablog.com

yoshitaku-jp.hatenablog.com

yoshitaku-jp.hatenablog.com

yoshitaku-jp.hatenablog.com

yoshitaku-jp.hatenablog.com

はじめてのホッテントリ

ありがとうございます!!!はてなブログに移って、すぐ入れてよかったです。嬉しい!とりあえず、自分の実績一つ解除!

yoshitaku-jp.hatenablog.com

毎月ひとつ新しいことをやるプロジェクト2018年6月版:

なにもやってなかった。 こっちは反省。

まとめ

  • 6月を振り返りました
  • ホッテントリ入ったのが最高に嬉しかった!!!

過去の振り返り

1月はこちら yoshitaku-jp.hatenablog.com

2月はこっち yoshitaku-jp.hatenablog.com

3月はこっち yoshitaku-jp.hatenablog.com

4月はこちらです yoshitaku-jp.hatenablog.com

5月はこちらです yoshitaku-jp.hatenablog.com

Beautiful Soupでhtmlファイルを開こうとするときに出るエラー

目次

  1. はじめに
  2. エラー解決

はじめに

Beautiful Soupを使うときはwebのページをスクレイピングするときが多いと思うが、htmlファイルを開きたいときにエラーが発生したのでメモ。

エラー解決

Beautiful Soupを使って、htmlファイルを開こうとする。

hoge_html = "hoge.html"
bsObj = BeautifulSoup(hoge_html, "html.parser")

こんなエラーが出る。 "hoge.html" looks like a filename, not markup. You should probably open this file and pass the filehandle into Beautiful Soup.

エラーにも書いてあるが、これはファイルのパスを指定してBeautiful Soupに投げているだけなので、

filename = "hoge.html"
hoge_html = open(filename,'r')
bsObj = BeautifulSoup(hoge_html, "html.parser")

ファイルをオープンして再度投げればうまくいきます

Djangoのtemplatesを一つにまとめる

f:id:yoshitaku_jp:20180711100334p:plain

目次

  1. アプリケーション配下にtemplatesフォルダを作る
  2. アプリケーションを追加したときに、またtemplatesフォルダを作るか悩む…
  3. プロジェクト配下にすべてのアプリケーションのtemplatesフォルダをまとめたものを作れば解決
    1. プロジェクト配下にtemplatesフォルダを作成する
    2. setting.pyの設定を変える
  4. 余談

DjangoPythonのWebアプリケーションフレームワークです。いろいろできるので一番人気かな?他にもflaskがありますね。

Django(ジャンゴ)は、Pythonで実装されたWebアプリケーションフレームワーク。(中略)Django の第一の目的は、複雑なデータベース主体の Web サイトの構築を簡単にすることである。Djangoコンポーネントの再利用性と'pluggability'、素早い開発、DRY (Don't Repeat Yourself)の原則に力点を置いている。ファイルやデータのモデルにいたるまで、Python が一貫して用いられている。

wikipediaより

アプリケーション配下にtemplatesフォルダを作る

Djangoでは、htmlファイルが入っているtemplatesフォルダを各アプリケーションの下に配置することがあるかと思います。

例では「groups」アプリケーションの配下でtemplatesを使っています。(わかりやすくするために、必要ではないディレクトリは大幅に削除しています。

.
├── README.md
├── config
│   └── 略
├── db.sqlite3
├── groups
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   ├── models.py
│   ├── tests.py
│   ├── templates
│   │    ├── base.html
│   │    └── groups
│   │       ├── detail.html
│   │       ├── index_page.html
│   │       ├── list.html
│   │       └── regist.html
│   ├── urls.py
│   └── views.py

アプリケーションを追加したときに、またtemplatesフォルダを作るか悩む…

自分の場合は「groups」アプリケーションの他にログイン機能を使う「accounts」アプリケーションを開発途中で追加しました。このタイミングで再びtemplatesフォルダを「accounts」アプリケーションの配下に作るのが嫌でした。

.
├── README.md
├── accounts
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── config
│   └── 略
├── db.sqlite3
├── groups
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   ├── models.py
│   ├── tests.py
│   ├── templates
│   │    ├── base.html
│   │    └── groups
│   │       ├── detail.html
│   │       ├── index_page.html
│   │       ├── list.html
│   │       └── regist.html
│   ├── urls.py
│   └── views.py

プロジェクト配下にすべてのアプリケーションのtemplatesフォルダをまとめたものを作れば解決

プロジェクト配下にtemplatesフォルダを作成する

なので、プロジェクト配下にtemplatesフォルダを作成し、 「base.html」を共通化し、さらに各アプリケーションごとのフォルダを作ってオリジナリティーのある画面を作っていきます。加えて、setting.pyの中も書き換えます。このプロジェクト配下のtemplatesフォルダを見てくれよーって設定にします。

.
├── README.md
├── accounts
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── config
│   └── 略
├── db.sqlite3
├── groups
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── templates
    ├── base.html
    ├── groups
    │   ├── detail.html
    │   ├── index_page.html
    │   ├── list.html
    │   └── regist.html
    └── registration
        └── login.html

setting.pyの設定を変える

setting.pyのTEMPLATESの項を探してください。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
#        'DIRS': [], ここを
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # こうする
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

以上で、Djangoのtemplatesを一つにまとめることができます。 お疲れ様でした。

余談

各アプリケーションの配下にtemplatesフォルダを作成するのにも利点があります。 対象のアプリケーションを別のプロジェクトで使いたいときです。 ときに意識せず、そのままコピーしていけます。

ブラウザからGitHubリポジトリにフォルダを作成する

GitHubはブラウザからだとフォルダーを作成できなくて不便だなぁと思っていたのですが、作成する方法があったので書いておきます。しかし、フォルダだけを作成することはできないようで、ファイルも作ることが前提のようです。

Create New Fileをクリックします f:id:yoshitaku_jp:20180704142102j:plain


ファイル名の入力欄に…

f:id:yoshitaku_jp:20180704142114j:plain

作りたいフォルダの名前を入力して…

f:id:yoshitaku_jp:20180704142116j:plain

「/」スラッシュを押すとフォルダができます

f:id:yoshitaku_jp:20180704142122j:plain

あとは、ファイルを作成して、コミットすれば完成

f:id:yoshitaku_jp:20180704142125j:plain

「folder」フォルダの下に、「file」ファイルができました 分かりづらい名前にしてしまったことは反省している

f:id:yoshitaku_jp:20180704142130j:plain

「file」ファイルを削除したら、「folder」フォルダも削除されたので、フォルダだけ作成するのは難しいのかなって思っています 分かりづらい名前にしてしまったことは反省している f:id:yoshitaku_jp:20180704142137j:plain

ササッとリポジトリを作って試したいときにどうぞ。

社内もくもく会でKaggleをやってみた話

はじめに

社内でもくもく会の第三回・第四回を開催してみました。

今まではハンズオンのような内容をやっていたのですが、 今回は完全に自分のやりたい課題を持ってきて「もくもく」しました。

自分はKaggleをやりました。

Kaggleとは f:id:yoshitaku_jp:20180630152410j:plain

www.codexa.net

もくもく会

第三回では「タイタニックチュートリアル

第四回では「リクルートレストラン客数予想チャレンジ 」

をやってみました。

大切だと感じたこと

  • データの前処理

完全に整備されているデータばかりではない世の中なので、欠損しているデータもあります。 その欠損している部分に対して、何を当てはめるかが結構重要なようです。 チュートリアルの中では、全データの中央値や一番出現頻度の高いものを欠損値に当てはめていましたが、結構センスを問われるところになるんじゃないかなって思いました。 各値の出現回数を取得して、全体の個数から導き出される出現率をもとに、欠損値へ当てはめてみるとか…いろいろやり方はありそうです。

  • 扱いづらそうな値はどんどん置き換える

簡単なところだと性別ですよね。

["Sex"][test["Sex"] == "male"] = 0
test["Sex"][test["Sex"] == "female"] = 1

maleとfemaleを0と1に置き換えてます。文字列よりもゼロイチのほうが絶対に扱いやすい! 前の「データの前処理」と同じですけど、こういう細かいところも重要だと思いました。

  • 目的変数と説明変数をいじってみる

一通り、チュートリアル通りに実行したあと、 目的変数と説明変数を足したり引いたりしたらスコアが上にも下にも大きく変わりました。 実際のデータ分析でも自分の思ったとおりにやっていい方向に行くことはまず無いとおもったので、 試行錯誤しまくるってところですかね。 実際のコンペティションだと提出回数もランキング付で重要になりそうなので、難しいですが…

  • jupyter notebookが使えるようになる

たくさん使うと慣れてきました。 f:id:yoshitaku_jp:20180630152505p:plain f:id:yoshitaku_jp:20180630152501p:plain

まとめ

今回は社内もくもく会Kaggleタイタニックリクルートレストラン客数予想チャレンジを使ってみました。

ちょこちょことコードを書く機会が増えて嬉しいです。 頑張ります。

date型の列にnullが入っているときの検索方法

自分は頭が硬いなぁと思ったのですが...

SQLでdate型の列にnullが入っているものがあり、nullも含めて全件出したいなぁと思っていたんですが、

AND date BETWEEN '1900/01/01' AND '2999/12/31'

これでは、nullが検索結果に出てきません。

そのnullも含めて出したかったときは

AND NVL(?,1900/01/01') BETWEEN NVL(?,'1900/01/01') AND NVL(?,'2999/12/31')

と、nullの値を別のものに置き換えれば検索できました。

簡単なもので躓いたので、ブログに書いて供養

「検索結果をどう出すか」って言うことにおいては、 「検索結果に出てこないもの」を「どうやって検索条件内に入れるか」っていう考え方が一つ増えたいい機会でした。

brew upgrade --cleanupで幸せになる

 

先日、brew cleanupコマンドをすることで8GB近くも容量が空く事件がありました...  

その後はこまめに

brew update

brew upgrade

brew cleanup

 

とやっていたのですが、 brew upgradeの中にbrew updateが含まれていることを知り、さらにはbrew upgradeコマンドのサブコマンド--cleanupがあることまで知りました。

 

つまり

brew update

brew upgrade

brew cleanup

の3つが

brew upgrade --cleanup

で、できてしまうんですね。最高です。

 

今日もやります。容量が無いので。もう意味がないことを知りながら。

DjangoをHerokuにアップロードするまでの手順

ブログでのアウトプット習慣が染み付いてきてコード書きたい!!的な欲望が出てきました。そこで、目に見える成果としてWEBアプリケーションを作ってみることにしました。まずは公開する手順をさっさと身につけようと思い、Djangoをherokuにあげてみることにしました。これはその手順です。

ほぼこちらの記事通りにやりましたが、バージョンが違ったり、ところどころ躓いたところがあったので、 自分なりにアレンジしているところがあります。

qiita.com

TL;DR

  • Djangoをherokuにあげるよ
  • WEBアプリケーションを公開できるよ
  • やった気になれる(戒め

目次

  1. 前提条件
  2. Djangoのプロジェクトを作成する
  3. gitにプッシュする
  4. Herokuにデプロイする

前提条件

Djangoのアプリを作成する

仮想環境に入ります。 まずは、仮想環境を作成しDjangoをインストールする。

YOUR PC:workspace user$mkdir django_heroku
YOUR PC:workspace user$python -m venv django_heroku/
YOUR PC:workspace user$cd django_heroku/
YOUR PC:django_heroku user$ source bin/activate
(django_heroku) YOUR PC:django_heroku user$ pip install django
(django_heroku) YOUR PC:django_heroku user$ pip install django-toolbelt

プロジェクトを作成し、マイグレーションをする

(django_heroku) YOUR PC:django_heroku user$ django-admin.py startproject config ./
(django_heroku) YOUR PC:django_heroku user$ python manage.py migrate

サーバを起動する

(django_heroku) YOUR PC:django_heroku user$  python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
June 16, 2018 - 07:19:32
Django version 2.0.6, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

ブラウザを立ち上げて http://127.0.0.1:8000/にアクセスし、下の画面が出れば成功。(versionによっては違う画面が出ることがあるかも知れません

f:id:yoshitaku_jp:20180616162145p:plain

gitにプッシュする

vim .gitignoreでファイルを作成する

*.pyc
staticfiles
db.sqlite3

gitにコミットとプッシュする

git init
git add .
git commit -m "create Django app"

Herokuにデプロイする

foremanが最新バージョンだと動かないらしいので、0.61をインストールする

初心者がHerokuでハマったポイント - 暗号通貨.py

gem install foreman -v 0.61

Procfileファイルとrequirements.txtファイルを作成する

echo "web: gunicorn config.wsgi --log-file -" > Procfile

pip freeze > requirements.txt

vim config/settings.pyでsettings.pyの末尾に下記の内容を追加する

# Parse database configuration from $DATABASE_URL
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Allow all host headers
ALLOWED_HOSTS = ['*']

# Static asset configuration
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

vim config/wsgi.pywsgi.pyの内容を書き換える

"""
WSGI config for config project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/
"""

import os

from dj_static import Cling #文を新しく記述する
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

application = Cling(get_wsgi_application()) #文を変更する

Herokuアプリを作る

Heroku Command Line Interface (CLI) をインストールしていない場合、インストールする

brew install heroku/brew/heroku

devcenter.heroku.com

Herokuにログインしていない場合、ログインをする ユーザ名とパスワードは、Herokuアカウントを作成したときのもの

heroku login

Herokuアプリを作る

heroku create

Herokuの環境変数を設定する

heroku config:set DISABLE_COLLECTSTATIC=1

Heroku内でマイグレーションをする

heroku run python manage.py migrate

Herokuでアプリケーションが動いてるかを確認する

heroku open

画面が表示されれば成功

f:id:yoshitaku_jp:20180617141908p:plain

まとめ

  • Djangoをherokuにあげました
  • WEBアプリケーションを公開できました

これから開発頑張っていくぞ

おまけ

Djangoのバージョン確認方法

pythonコマンドで起動させて

>>>import django
>>>django.get_version()
'2.0.6'

3ヶ月続けた kakakakakku ブログメンティーを卒業しました

f:id:yoshitaku_jp:20180603231648j:plain

3月から5月末まで id:kakku22 カカカカック さんに技術ブログのメンターをお願いしていました。 2018年になって「アウトプットをする年にする」と自分の中で決めてから、週に一回ブログを書くことを目標として動いていました。しかし、一人でやっているうちに、「記事の質が低いのではないか」「構成が良くないんじゃないか」とか不安になることが多くなっていったんですね。そんなときに、カカカカック さんが「ブログメンティーを募集します」と呟いていたので、お願いすることにしてみました。

卒業するときに知ったのですが、カカカカック さんがブログメンターを始めてから3ヶ月続いた人は自分が初めてなんだそうです!長いことがいいことか悪いことかわかりませんが、初って嬉しいですね。笑 ここでは、良かったことや思い出に残っていることを書いてみようと思います。未来の自分自身のためにと、これからメンターをお願いしようかと思っている人たちのために、なにか参考になれば幸いです。

最初の質問

まずは自分が興味ある技術について質疑応答がありました。今、やり取りさせていただいたDMを読み返しながらかいていますが、自分はこんなことをやりたいと答えていたのかと面白くなります。 自分はこのようなものをあげていました。

  • ADRSIRの使い方
  • ADRSIRの公式ソースを直した
  • alexaとraspberrypiとADRSIRで音声でテレビを制御してみた
  • 機会学習をやりたいので、高校の数学をやり直した
  • AWS 認定ソリューションアーキテクトを受験した
  • Python 3 エンジニア認定基礎試験を受験した
  • 応用情報技術者試験を受験した
  • netkeibaからスクレイピングする
  • プログラマのためのdocker教科書を読んだ
  • データ分析構築基盤入門を読んだ

この内で書いたのは、2.3つぐらいですね。 書き続けているうちに、「こんなネタを書いてみたい!」といろいろ思うようになるので、最初は少なくても大丈夫だと思います。

yoshitaku-jp.hatenablog.com

yoshitaku-jp.hatenablog.com

未来の自分のためにブログを書く

記事の質に関するやり取りの最中でしたが、

基本的には「過去の自分」もしくは「学んだことを忘れた未来の自分」に教える目的でブログを書けば,おのずと質は上がります

とおっしゃっていました。
自分がブログを書き始めた理由は、すぐ忘れる自分のためと、自分が困ったときに助けられたインターネットに貢献して、別の誰かの助けとなりたかったからです。この認識・感覚があっていて安心しました。

人の記事に感謝する気持ちでシェアをする

これは自分が持ち合わせていなかった価値観です。読んで助かって「ありがとう」と思うことはもちろんたくさんありましたが、シェアをするっていう行動を起こしたことまではありませんでしたので学びがありました。また、同じメンティーの方とも、SNS上で仲良くなり嬉しかったです。自然とお互いがRTやいいね!をして、励みにもなりました。

たくさんポジティブフィードバックをいただける

これでもかってぐらい、ポジティブフィードバックをいただけます。笑 GoogleCloudPlatformのCloud Vision APIに関する記事を1つ上げたあとにたくさん褒め言葉をいただけましたし、その後に10記事分になるんじゃないかってぐらい、横と縦に話題を広げてくれました。技術探究心がすごいですね…自分もこれからがんばります。

yoshitaku-jp.hatenablog.com

ブログに関する質問に答えてくれる

Open Graph Protocol(OGP)なんてものは自分は全く知りませんでした。TwitterやFBなどのSNSにシェアしたときにサムネイルが出るアレですね。Wordpressを使っていたときはOGPの設定がプラグインを使って手動だったので、設定がうまくいってないと出ませんでした。そのあたりの質問とか調査にも協力してくれました。

f:id:yoshitaku_jp:20180607145128j:plain

cards-dev.twitter.com

課題点を聞いたらしっかり教えてくれる

3ヶ月目に入るときに、自分の課題点を聞いたらちゃんと教えてくれました。いつも褒めてくださって嬉しいのですが、ちょっと厳しい視点も欲しくなったときに包み隠さず答えてくださったのはすごく嬉しかったです。なので、自分のだめなところ改善したほうがいいところはガンガン聞いてみましょう!

僕は記事のPV数が弱いことが課題でした。もちろん、バズやPV数を稼ぐことが目的ではないですが、多くの人に届けることは必要です。よく書く記事の傾向としてIoTなどを扱っていたので少しニッチな分野だったかなと思います。Webアプリやフロント側、PythonRubyなど流行ってるプログラミング言語などに挑戦して扱っていけばよかったかなと思います。

書くネタをいただける

自分が興味ある分野に関することを提供していただけます。自分はJavaScriptを業務で扱っていたので、Learn to code - for free | CodecademyのReactの記事を書いてみることを提案してもらいました。実際にやってみたところ非常に面白く、ブログの記事もスラスラと書けました。自分の興味ある分野を広げていただいて感謝しかありません。

まとめ

好き勝手書いてきましたが、本当に楽しく過ごせた3ヶ月間でした。現在2700文字ぐらいですが、楽しく過ごせていなかったらここまでかけないと思います。社外にメンターがいるというのも非常に貴重な経験です。自分にサポートするメンバーが出てきたらどう接するかの学びもありました。 ブログでのアウトプットを通して、社内での信頼残高も上がりました(たぶん)。社内・社外問わずイベントに参加しインプットする姿勢、さらにはそれをアウトプットする姿勢が培われたのも自分の中で大きいです。感謝してもしきれません。これからも日々努力して成長していきたいと思います。 本当にありがとうございました。

5月を振り返って

f:id:yoshitaku_jp:20180607134902j:plain 5月の活動を振り返ってみます。

1月はこちら yoshitaku-jp.hatenablog.com

2月はこっち yoshitaku-jp.hatenablog.com

3月はこっち yoshitaku-jp.hatenablog.com

4月はこちらです yoshitaku-jp.hatenablog.com

週1回ブログを更新する

'#oss_gate のもくもく会で、Apache supersetのデモ環境を触ってみた

yoshitaku-jp.hatenablog.com

ラズベリーパイのカメラ設定

yoshitaku-jp.hatenablog.com

macからラズベリーパイのデスクトップ画面を操作するためにVNCを入れた

yoshitaku-jp.hatenablog.com

RPAだけじゃない?! / RPA勉強&LT会!RPALT vol2に参加してきた

yoshitaku-jp.hatenablog.com

NoSQLの基礎知識を読んだ

yoshitaku-jp.hatenablog.com

NoSQL キーバリュー型のまとめ

yoshitaku-jp.hatenablog.com

社内もくもく会でRedashハンズオンをやった話

yoshitaku-jp.hatenablog.com

CodecademyのLearn ReactJS:PartIを受講してみた

yoshitaku-jp.hatenablog.com

社内で読書会 #0 を開催した話

yoshitaku-jp.hatenablog.com

500ユーザ達成

f:id:yoshitaku_jp:20180607133803j:plain

ありがとうございます。 誰かの役に立てたなら嬉しい。

毎月ひとつ新しいことをやるプロジェクト2018年5月版:料理

全然やれませんでした。 自分のコンフォートゾーンの少し外ぐらいのことにチャレンジてみようと思います。 なにか案があったら教えて欲しい…

まとめ

  • 5月を振り返りました。
  • 6月ではてなブログに移りました。
  • 6月は方向性を決めてもっと成長するぞ