tag:crieit.net,2005:https://crieit.net/users/fooddev24/feed ふーど。@個人開発の投稿 - Crieit Crieitでユーザーふーど。@個人開発による最近の投稿 2020-05-14T10:35:03+09:00 https://crieit.net/users/fooddev24/feed tag:crieit.net,2005:PublicArticle/15898 2020-05-14T10:35:03+09:00 2020-05-14T10:35:03+09:00 https://crieit.net/posts/YouDev 個人開発者をもっと知りたい。YouDevをリリースしました。 <p><img width="610" alt="eyecatch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634341/275b16c8-3136-198f-fa76-a17a4cbb41e1.png"></p> <p><a target="_blank" rel="nofollow noopener" href="https://youdev.tech">YouDev</a>をリリースしました。 2020.5.01</p> <p>YouDevは個人開発者にスポットを当てて、個人開発者をもっと知ってもらう(僕自身が知りたい。。)サービスです。</p> <p>サービスは認知されていても開発者にはスポットが当たってないなと思い、個人開発者は自分がリリースしたサービスをサービスだけでなく開発者自身をもっとアピールしてもいいんじゃないかな?と思い作成しました。</p> <p>常に個人開発者を募集してるので、<strong>自分は個人開発者だ!</strong>って思う人は登録お願いします!</p> <p>なお、改善点もできる、できないに関わらず受け付けております!</p> <h1 id="僕のスペック"><a href="#%E5%83%95%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF">僕のスペック</a></h1> <p>・<strong>へっぽこエンジニア</strong><br /> ・開発歴:3年<br /> ・個人開発歴:半年(2020.01に<strong>今年は個人開発をやる!</strong>と決めた。)<br /> ・開発言語:python(半年)<br /> ・デザインセンス:<strong>皆無</strong> (フレームワーク使わずにデザインは、まじ無理。 )<br /> ・昨今の新技術のスピードにはついていけてない。<br /> ・pythonって熱いんじゃね!?ってただ思ってる<strong>にわか</strong>。<br /> ・個人開発始めた時にQitaに投稿してこう!と思ったが、なんか雰囲気が違った。(へっぽこエンジニアの出る幕なさそう。。)<br /> ・QitaってMarkDownでしか書けないの!?なにそれ無理!</p> <h1 id="YouDevの目指すもの"><a href="#YouDev%E3%81%AE%E7%9B%AE%E6%8C%87%E3%81%99%E3%82%82%E3%81%AE">YouDevの目指すもの</a></h1> <p>とにかく個人開発者ってのを知りたくなった。</p> <p>個人開発者ってどんな人がいてどんな活動してるんだろう?って思った時に役立つようなサービス</p> <p>個人開発者にとって有益な認知拡大の活動の場を目指す。</p> <h1 id="本番環境"><a href="#%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83">本番環境</a></h1> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634341/1bcbb6ea-5688-7434-64bf-ff4024c58342.png" alt="youdev構成図.png" /></p> <p>こんな感じ。</p> <p>DBはPostgresSQLをあまり利用したことがなかったのでMySQLを利用。<br /> 本当はAWSのRDSを利用したかったが、収益化してるサービスでも無いのでEC2の中に大人しくインストールしました。<br /> でも、やっぱりRDS使ってみたい。。</p> <p>S3もできれば利用を避けたかったが、ユーザが登録する画像データもあるので、S3を使うことにしました。<br /> そもそもEC2のストレージ容量が8GBしか無いのでここもでも大人しくS3にしました。</p> <p>ただ、サービス内で共通して利用する画像データやCSS,スクリプト系はEC2側にstaticフォルダを新規で作成してそこから配信してます。(最悪、壊れても良いファイルなので。)</p> <p>ソースコードはprivateのgithubで管理してます。</p> <h1 id="DjangoでAmazon S3を使う"><a href="#Django%E3%81%A7Amazon+S3%E3%82%92%E4%BD%BF%E3%81%86">DjangoでAmazon S3を使う</a></h1> <p>僕は本番環境稼働直後はmediaファイルをEC2のstaticと同じディレクトリで運用していたのでまずはそれらをS3へ移行しなくてはならない。。</p> <h2 id="S3バケットの作成"><a href="#S3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">S3バケットの作成</a></h2> <p>まじはS3のバケット作成をする。</p> <p>ここは基本的につまずきポイントは無かったです。</p> <p>1.バケットの作成<br /> 2.IAMユーザの追加(ここでアクセスキーはコピーしといたほうがいいかも。)<br /> 3.グループの作成(ポリシーはAmazonS3FullAccessを適用)<br /> 4.2で作成したユーザを3で作成したグループに追加<br /> 5.バケットのユーザに2で作成したユーザを追加</p> <h2 id="S3への移行"><a href="#S3%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C">S3への移行</a></h2> <p>まずは以下で認証の確認</p> <pre><code>$ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None None access_key <not set> None None secret_key <not set> None None region <not set> None None </code></pre> <p>設定がされてないと、S3に接続できないので、先ほど作成したユーザのアクセスキーとシークレットキーを設定する</p> <pre><code>$ aws configure AWS Access Key ID [None]: <アクセスキー> AWS Secret Access Key [None]:<シークレットキー> Default region name [None]: <なにも入力してない> Default output format [None]:<なにも入力してない> </code></pre> <p>これでS3に接続できるようになるのでいざ、アップロード!</p> <pre><code><br />$ cd /usr/share/nginx/html/media/ #ここは移行したいファイルがあるディレクトリ $ aws s3 cp --recursive uploads s3://<バケット名>/<フォルダ名> </code></pre> <p>これでいけました!</p> <p>ちなみに<br /> ・--recursive をつけるとディレクトリが対象になります。<br /> ・cp ではなくsyncを使用した場合はコピーではなく同期になります。</p> <h2 id="Django側の設定"><a href="#Django%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A">Django側の設定</a></h2> <p>Django側でmediaファイルのアップロード、参照先をS3に向くように変更して上げなければいけない。</p> <p>DjangoでS3を利用するには以下のモジュールが必要なのでインストール</p> <p>```python:インストール<br /> $ pip install django-storages<br /> $ pip install boto3</p> <pre><code><br />settingに以下を追加する ```python:settings.py INSTALLED_APPS = [ ... 'storages', #追加 ] ... TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', 'social_django.context_processors.backends', 'social_django.context_processors.login_redirect', 'django.template.context_processors.media', #追加 #これを追加してあげることでtemplateから<span>{</span><span>{</span>MEDIA_URL<span>}</span><span>}</span>でS3を参照できるようになります。 ], }, }, ] ... # MEDIA_URL = '/media/' AWS_ACCESS_KEY_ID = '<アクセスキー>' AWS_SECRET_ACCESS_KEY = '<シークレットキー>' AWS_STORAGE_BUCKET_NAME = '<バケット名>' AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME AWS_LOCATION = 'media' DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) </code></pre> <p>これだけでS3へのアップロードおよびS3の参照ができるようになります。</p> <h2 id="使用したライブラリ系"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B3%BB">使用したライブラリ系</a></h2> <h3 id="social-auth-app-django"><a href="#social-auth-app-django">social-auth-app-django</a></h3> <p>Djangoで作成したサービスにソーシャル系サービス(twitter,google,facebook等)でログインできるようにするライブラリです。</p> <p>twitterアカウントでの認証設定</p> <p>```python:インストール<br /> $ pip install social-auth-app-django</p> <pre><code><br />```python:settings.py INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'social_django', #ここを追加 ] ... TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', 'social_django.context_processors.backends',#ここを追加 'social_django.context_processors.login_redirect',#ここを追加 ], }, }, ] ... SOCIAL_AUTH_URL_NAMESPACE = 'social' #AUTHENTICATION_BACKENDSを追加 AUTHENTICATION_BACKENDS = [ 'social_core.backends.twitter.TwitterOAuth', 'django.contrib.auth.backends.ModelBackend', ] #以下は本番環境では環境変数に設定すること! SOCIAL_AUTH_TWITTER_KEY = 'xxxxxxxx' # Consumer Key (API Key) SOCIAL_AUTH_TWITTER_SECRET = 'xxxxxxxxx'# Consumer Secret (API Secret) SOCIAL_AUTH_LOGIN_REDIRECT_URL = '' # ログイン時のリダイレクトURL LOGOUT_REDIRECT_URL = '' #ログアウト時のリダイレクトURL </code></pre> <p>```python:project/urls.py<br /> urlpatterns = [<br /> ...<br /> path('', include('social_django.urls')), #追加#<br /> #↑を追加することで アプリ側から以下URLにアクセスすることで各処理が可能になります。<br /> #ログイン:/login/twitter<br /> #ログアウト:/disconnect/twitter/<br /> #complete:/complete/twitter/<br /> ...<br /> ]</p> <pre><code>/complete/twitter/はtwitterAPIのCallbackのURLになります。 例) ![スクリーンショット 2020-05-12 22.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634341/9372ed3a-53ce-966f-9242-fad1e712c676.png) あとはmigrateすることで利用ができるようになります ```python:migrate $ python manage.py makemigrations social_django $ python manage.py migrate </code></pre> <h3 id="requests-oauthlib"><a href="#requests-oauthlib">requests-oauthlib</a></h3> <p>これはTwitterAPI利用の際のOAuthを数コードで実装できるようになるライブラリです。</p> <p>```python:インストール<br /> $ pip install requests requests_oauthlib</p> <pre><code><br /><br />```python:settings.py TWITTER_ACCESS_TOKEN = 'XXXXXX' #追加 TWITTER_ACCESS_TOKEN_SECRET='XXXXX' #追加 </code></pre> <p>ここでは例として、ユーザ情報を取得する方法を記載します。</p> <p>上記をsettings.pyの任意の場所に記入します。</p> <p>```python:views.py</p> <p>CK = settings.SOCIAL_AUTH_TWITTER_KEY<br /> CS = settings.SOCIAL_AUTH_TWITTER_SECRET<br /> AT = settings.TWITTER_ACCESS_TOKEN<br /> ATS = settings.TWITTER_ACCESS_TOKEN_SECRET</p> <p>def getAccount(request,screen_name):<br /> url = "https://api.twitter.com/1.1/users/show.json" #エンドポイントは公式のドキュメント参照<br /> params = {<br /> 'screen_name':screen_name<br /> }<br /> req = twitter.get(url, params = params)</p> <pre><code>if req.status_code == 200: res = json.loads(req.text) else: res="" print("Failed: %d" % req.status_code) return res </code></pre> <pre><code><br />###MaterializeCSS(デザイン) [公式ドキュメント](https://materializecss.com/) 冒頭で述べたとおり、ライブラリ使わなきゃCSSなんてやってられないです。。。 scssもインストールできるので気に入らなければメインカラー等は一括で変更できます。 **※注意:セレクトボックスは不具合があり、セレクトの選択欄が下のセレクトボックスに重なる場合 正しく選択できない不具合がありました。** 絶望していましたが、以下のgithubに改修コードが上がっていたのでこれを利用すれば解消します! [改修版git hub](https://github.com/Dogfalo/materialize/issues/6444) ###cropper.js 画像をトリミングしてくれるライブラリです。 もちろん、僕が自前でトリミングの処理を実装できるわけもないので利用しました。 何回、ドキュメント読んでも実装方法が謎でしたが、数十回目を通してようやく理解できたのが以下のサイトです。 [へっぽこでも数十回目を通せばわかるはず!](https://simpleisbetterthancomplex.com/tutorial/2017/03/02/how-to-crop-images-in-a-django-application.html) だいたい以上が使用したライブラリです。 #つまずいた ###mysqlのバージョン Django3.0からはmysqlへ接続するドライバはmysqlclient推奨と公式ドキュメントに書いてあるもんだから、大人しくインストールしてみたがエラー。。 ```python: $ pip install mysqlclient > ~ check the manual that corresponds to your MySQL server version for the right syntax to use near 'rsion' at line 1 ~ 謎のエラー 原因:mysqlのバージョンが古いことに起因してるみたい </code></pre> <p>開発環境はAWSのCloud9を利用しているんですが、cloud9だと初期状態でmysqlがインストールされている。</p> <p>が、バージョンが5.5でmysqlclientは5.7からしか使えないみたいだったので、5.5を削除して5.7をインストールしました。</p> <pre><code class="python:"> sudo yum remove mysql* #mysqlの削除 #(慎重な方はsudo yum -y remove mysql-config mysql55-server mysql55-libs mysql55) sudo yum -y install mysql57-server mysql57 sudo yum -y install mysql-devel </code></pre> <h3 id="絵文字をmysqlへ登録"><a href="#%E7%B5%B5%E6%96%87%E5%AD%97%E3%82%92mysql%E3%81%B8%E7%99%BB%E9%8C%B2">絵文字をmysqlへ登録</a></h3> <p>もともとcharsetをutf-8にしていたので絵文字が登録できなかった。</p> <p>設定ファイルの変更</p> <p>```/etc/my.cnf<br /> [mysqld]<br /> character-set-server=utf8mb4</p> <p>[client]<br /> default-character-set=utf8mb4</p> <pre><code><br />mysqlの再起動 ```/etc/my.cnf sudo service mysqld restart </code></pre> <p>すでにテーブルがutf-8で作成済みだったので変更</p> <pre><code class="python:mysql">ALTER TABLE targettable CONVERT TO CHARACTER SET utf8mb4; </code></pre> <p>Djangoの場合、Django側にも設定が必要</p> <p><code>python:settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'xxx', 'USER': 'xxx', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', #OPTIONSを追加 'OPTIONS': { 'charset': 'utf8mb4', }, } }</code></p> <p>これで絵文字の出力、登録ができるようになりました!</p> <h1 id="さいごに !"><a href="#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB%E3%80%80%EF%BC%81">さいごに !</a></h1> <p>今後も色々、頑張って機能追加して行きますので是非とも登録お願いします!<a target="_blank" rel="nofollow noopener" href="https://youdev.tech">Youdev</a></p> ふーど。@個人開発