te-touのブログ

音楽制作・車・プログラミング・旅行・その他考えてる事など、備忘録的なことも含めて個人的なページです。

AWS SSH接続時の「port 22: Connection refused」問題




普段プログラマしてますが、大規模開発のなかにいるとサーバー周りのインフラ系に触ることがほぼありません。
なので、素人作業なので認識が大いに誤っているかもしれません。

事象

近頃AWSでサーバー構築をしていました。

インスタンスを立ち上げて、SSH接続して作業後切断します。
後日改めてSSH接続しようとすると、以下のような状態になりました。

$ ssh -i "something.pem" ec2-user@x.xx.xxx.172
ssh: connect to host x.xx.xxx.172 port 22: Connection refused

「port 22: Connection refused」
とりあえず、接続できないことだけは確かです。

対策

結論は「インバウンドルールの設定」でSSHのソースのIPを一度削除してから、もう一度「マイIP」を設定する。
それを行ったところ、

ssh -i "mjerapp.pem" ec2-user@x.xx.xxx.172
Last login: Sat Jul 18 19:34:23 2020 from xxx.xxx.xx.xxx

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

つながりました。

詳細

ネットでいろいろ調べてみても、自身の知識不足からくる理解不足のため意味不明です。

なので、とりあえずport22がビジーになってるならそこをリフレッシュすれば良いかと思い確認しました。

セキュリティグループ → インバウンドルールの設定へ
f:id:te-tou:20200719111253p:plain

ポート22のソースを「マイIP」で設定したはずなのに、「カスタム」になってます。
こういうものなのかな?
f:id:te-tou:20200719111831p:plain

よくわからないけど、以下の手順を実行。

  1. IPアドレスを「×(ばってん)」で消します。
  2. ソースの「カスタム」をリストから選択して「マイIP」に変更。
  3. IPアドレスが設定されると思います。
  4. 「ルールを保存」

この手続きを行ったところ、上記のように再度SSH接続ができるようになりました。

まとめ

おそらく正規の方法では無い上に、場当たり的な対処法かと思います。

なんとなくやったら出来ちゃった的な。

この作業を行うことによってデータが損失する可能性が無いとは言い切れません。
根本的な対処法を確立することが急務です。
手順通りやっても大体うまく行きません。サーバー構築は難しい。


Django weasyprintでPDF出力。(日本語文字化け解消と用紙の設定とURLの引渡)




前回の続きです。
www.te-tou.tokyo

DjangoとweasyprintでPDF出力は無事に出来たものの、激しく文字化けしていました。
f:id:te-tou:20200614144752p:plain
ついでに用紙が縦になっていたり、セルの中の文字が予定外に折り返していたり、印刷したいURLをviews.pyに引き渡したりする方法がよく分かりませんでしたが一通り解決しました。

日本語文字化け解消

views.pyの中でCSSを指定して、フォントを設定してあげたら解消しました。

from .models import Person
from django.http import HttpResponse
from django.template.loader import render_to_string
# CSSもインポートしておく
from weasyprint import HTML, CSS
import tempfile

def generate_pdf(request):
    from django.template.loader import get_template
    html_template = get_template('testapp/scoringsheet_list.html') 

    html_str = html_template.render({

                },request)  

    pdf_file = HTML(request.GET.get('path')).write_pdf(

         stylesheets=[
# CSSを指定してフォントを設定することで、文字化け解消。
                 CSS(string='body { font-family: serif !important }'),
         ],
    )

    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'filename="scoringsheet.pdf"'

    return response

出力結果

f:id:te-tou:20200621160301p:plain
Django weasyprint出力
文字化け解消しています。
ついでに後述する以下も解消されている状態です。

  • 印刷用紙を横向に設定
  • セル内の文字折り返ししない
  • 印刷したいページのURLをtemplateからviews.pyに引き渡し

細かいことは抜きにして、結構きれいにPDF出力出来たと思います。

用紙の設定

weasyprintでlandscapeです。
テンプレートファイル(HTML)にスタイル属性を追加します。

この中に用紙設定を書きます。

<style>
  @page {
      size: landscape;
      margin: 0.2in 0.1in 0.2in 0.1in;
</style>

landscapeが用紙横印刷ですね。
この辺りにA3とか書いておけば、印刷用紙サイズも変更できます。初期値はA4みたいです。
ついでに用紙の余白も設定しときます。

セル内の文字折り返し禁止

これもテンプレートファイル(HTML)にスタイル属性を設定します。

<style>
  @page {
      size: landscape;
      margin: 0.2in 0.1in 0.2in 0.1in;

# 文字折り返し禁止
  table tr span {
	    white-space: nowrap;
  }
</style>

white-space: nowrap;です。
「table tr span」のclass名は、table rawで横列(ヘッダ)部分を折り返し禁止にしています。

印刷したいページのURLをviews.pyに引き渡す。

PDF変換する流れは、

  1. 対象のページへアクセス
  2. 「PDF出力」ボタンを押下し、対象のページをPDF変換

という想定です。

そのため、まず始めに対象ページに「ボタン」をつけます。
template(HTML)

f:id:te-tou:20200621163111p:plain
Django PDF出力ボタン追加
こんな感じです。

次にそのボタンに自分のページのURLを引数として持たせます。
Django(python?)で今アクセスしているページのURLを取得する方法は、

{{ request.build_absolute_uri }}

と書くと、フルパスを取得してくれます。

ソースは下記の通り。
template(HTML)

<form action="/exportpdf/shinsa/" method="get" target="_blank">
    <input  type="hidden" name="path" value={{ request.build_absolute_uri }} >
    <button type="submit"> PDF出力 </button>
</form>

これでボタンを押下した際に、自分のページのURLを引数に持たせることができました。

次に、views.pyで受け取ります。
viewsで引数を受け取るために、

request.GET.get('name属性')

これでリクエストを受け取ります。

views.py

from .models import Person
from django.http import HttpResponse
from django.template.loader import render_to_string
from weasyprint import HTML, CSS
import tempfile

def generate_pdf(request):
    from django.template.loader import get_template
    html_template = get_template('testapp/scoringsheet_list.html') 

    html_str = html_template.render({
                },request)  
# request.GET.get('ボタンのnameを指定')
    pdf_file = HTML(request.GET.get('path')).write_pdf(

         stylesheets=[
                 CSS(string='body { font-family: serif !important }'),
         ],
    )
    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'filename="scoringsheet.pdf"'

    return response

これでviews.pyにURLを直書きしなくても、印刷したいページのURLを受け渡せます。
templateファイルを指定しているので、なんでも良いわけでは無いと思います。が、同一のページでクエリで集計していたり抽出している結果を出力したい場合に有効だと思います。
はっきり言って仕組みを完全に理解していないので、そこそこ怪しいです。

まとめ

普段バッチプログラムとか作っていると、htmlを忘れるので当然のことがなかなかできなくなります。
特にCSS。

課題

CSSファイルをstaticで作ったのにファイルが読み込めません。的なエラーが出てしまいました。
なので今はtemplate(HTML)ファイルにスタイルシートを直書きしてます。
はっきり言ってダサいので、この辺りをきれいにしたいです。




www.youtube.com
www.facebook.com

Django weasyprintでPDF出力。(インストールと各種エラー対応と最終的に文字化け)




掲題の通り、Djangoで作成した画面をweasyprintを使ってPDF出力して印刷できるようにします。


まずは、weasyprintをインストールします。
しかし、いろんな物に依存関係があるようなので色々パッケージのインストールが必要です。
エラーを確認しながら進めます。なんか行き当たりばったりです。

環境
  • python : 3系
  • Django : version 3.0.2
  • SQLite
  • macOS Catalina

とりあえず、何かしらのアプリが作成されていることが前提です。
ついでにHomebrewもインストールされていることも前提です。

weasyprintインストール

Djangoのバーチャル環境にインストールするので、アプリをアクティベートしてからターミナルで以下のコマンドを打ちます。

pip install WeasyPrint

pipを最新化しろとメッセージが出たので、アップグレードします。

python3 -m pip install --upgrade pip
ソース

ざっくりソースを書きます。
views.py

from .models import Person
from django.http import HttpResponse
from django.template.loader import render_to_string
from weasyprint import HTML
import tempfile

def generate_pdf(request):
    from django.template.loader import get_template
# テンプレートを指定
    html_template = get_template('testapp/scoringsheet_list.html') 

    html_str = html_template.render({
#引数とかある場合は、ここに設定する。
      'Member': Member,
      'Scoringsheet': Scoringsheet,
                },request)  

    pdf_file = HTML('http://127.0.0.1:8000/scoringsheet?event=4').write_pdf(
# weasyprintではCSSを指定してあげないと参照してくれないようなので、必要なら指定する。
# 今回は特に使わないのでコメント
#        stylesheets=[
#           CSS('/static/css/something.css')
#        ],
    )

    response = HttpResponse(pdf_file, content_type='application/pdf')
# ダウンロードした時のファイル名称を設定。
    response['Content-Disposition'] = 'filename="scoringsheet.pdf"'

    return response

urls.py

urlpatterns = [
# weasyprint
    path('generate/pdf/', views.generate_pdf, name='generate_pdf'),
]
試しにPDF化実行すると、各種エラー発生

urlsに書いたアドレスにアクセス。
ローカルサーバーだと、以下のようなアドレスです。
http://127.0.0.1:8000/generate/pdf/

エラーが出ました。

django OSError: no library called "cairo" was found

cairoってのが無いようなので、サーバーを落としてHomebrewでインストールします。

brew install python3 cairo pango gdk-pixbuf libffi

再度サーバー起動。またエラー。

no library called "libcairo-2" was found
cannot load library 'libcairo.so': dlopen(libcairo.so, 2): image not found
cannot load library 'libcairo.2.dylib': dlopen(libcairo.2.dylib, 2): image not found
cannot load library 'libcairo-2.dll': dlopen(libcairo-2.dll, 2): image not found

なんか、色々ネットで対処法を探しているとpython3系ならpip3でインストールしないといけない。らしいので再度weasyprintをインストール。

pip3 install WeasyPrint

必要かどうか不明ですが、ここでもう一度cairoをインストール。

brew install cairo

また別のエラーが出ました。
もしかしたら、前にも出ていたかもしれませんがここで気がつきました。

Error: The following formula
  [#<Dependency: "python@3.8" []>, #<Options: []>]
cannot be installed as binary package and must be built from source.
Install the Command Line Tools:
  xcode-select --install

xcodeがバーチャル環境にちゃんと入っていないのかな?
よくわかりませんが、サーバーを落としてxcodeをインストール。

xcode-select --install

再度サーバー起動。またエラー。

    raise OSError(msg)
OSError: cannot load library 'pango-1.0': dlopen(pango-1.0, 2): image not found.  Additionally, ctypes.util.find_library() did not manage to locate a library called 'pango-1.0'

pangoってのが無いようなので、サーバー落としてpangoをインストール。

brew install pango

サーバー再起動。成功です。

PDF出力テスト

PDF出力するURLにアドレスにアクセスして、PDF出力テストします。
派手に文字化けしてしまいました。
(Djangoのテンプレート画面)

f:id:te-tou:20200614144612p:plain
Django テンプレート
(weasyprintでPDF出力結果)
f:id:te-tou:20200614144752p:plain
weasyprint PDF出力結果

日本語と数字が全滅です。
HTMLにはちゃんと文字コード指定をしてるのですが、関係ないようです。
ちなみに改ページしても、ヘッダはページごとについてきたので安心しました。

今後の課題

まずは上記の文字化けをなんとかしないといけません。
それが出来たら、A4で横向き(landscape)出力設定をしたいです。
現状調べたところ、よくわからないです。

まとめ

weasyprintはインストールが一つでは済まないのが難点です。
ソース自体はサンプルコードが結構落ちているので、とりあえずはなんとかなります。
しかし、細かい不具合についての対処法はあまり無いように感じました。この辺りは結構努力が必要そうです。
最後に、Djangoのテンプレート通りに出力はしてくれない様なのでCSSはweasyprint用にCSSはちゃんと指定した方が良いみたいです。

ついでに

(上記のソースでは関係ありませんが)ソースの書き方によっては、日本語があるとユニコードエラーが出るようなのでoutput.nameを以下のように変更。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 10: invalid start byte
output = open(output.name, 'r')
↓fix
output = open(output.name, 'rb')




www.facebook.com
www.youtube.com

ホンダビートPP1 オーバーフェンダー化(計画2・アーチ上げの費用とか)

 

 

続きです。

www.te-tou.tokyo

 

先日入手した汎用オバフェンをのこぎりで切り落として、ざっくりサイズを合わせてみました。

f:id:te-tou:20200607225044j:plain

ホンダビート  オーバーフェンダー

ちなみに取り付け前は、こんな感じ。

f:id:te-tou:20200607225159j:plain

ホンダビート  ノーマルフェンダー

やっぱり迫力が違います。

f:id:te-tou:20200607225421j:plain

ホンダビート  オーバーフェンダー

f:id:te-tou:20200607225454j:plain

ホンダビート  オーバーフェンダー

どんな感じで取り付けるかを考えつつ、フェンダーのアーチ上げをする場合の費用を近所の評判が良さそうな板金修理屋さんに聞きに行きました。

ずばり、リヤフェンダー2個で約10万円。

内訳を簡単に見ると、

  • アーチ上げのためのフェンダーカット
  • 切った部分にシール材を注入して処理
  • 汎用フェンダーの塗装
  • オバフェン取り付け などなど

内容としてはかなりきれいに仕上げてくれそうな感じでした。

しかし、10万かー。

あとは、構造変更とか諸々の手続き・ホイールとかワイドスペーサーとかの費用などなど。手間と時間はかかるけど、やっただけの満足感を得られるとは思います。

だがしかし、心は折れ始めました。

アーチ上げしないで取り付けられないかとは考えていますが、車高調はこれで車高一番高い位置っぽいからタイヤを外に出すと間違いなくフェンダーに当たっちゃいます。

タイヤを小さくするかなーとか考えつつ、なんかさっくり解決したいです。

 

 

www.youtube.com

www.facebook.com

ホンダビートPP1 オーバーフェンダー化(計画)

 

かねてから、ホンダビート の車幅の狭さがかっこ悪いと常々思ってました。

しかし、車幅を変更するということは構造変更やらなんやら結構一大事です。

 

とまあ、長年色々考えていましたが汎用オーバーフェンダー買いました。

f:id:te-tou:20200606222151j:plain

汎用オーバーフェンダー

たしか、片側8cm。

 

実際の取り付けとかは今は考えず、とりあえず位置合わせしてみます。

f:id:te-tou:20200606223304j:plain

ホンダビート オーバーフェンダー

でかいな。

長い部分は切り落とすとして、やっぱりこうした方がカッコいい。

f:id:te-tou:20200606223639j:plain

ホンダビート  オーバーフェンダー

なかなかの迫力です。

しかし、でかい。

f:id:te-tou:20200606223812j:plain

ホンダビート

真横から見ると、元のフェンダーが見えてしまってます。

タイヤもどうせやるならツライチにしたいので、深リムホイールに変えるかワイドスペーサーをかませるか対応すると思うのでフェンダーのアーチ上げが必要です。

流石にアーチ上げは専門の板金屋さんに頼まないとですが、どれくらい予算がかかるか不明です。

f:id:te-tou:20200606224318j:plain

ホンダビート  オーバーフェンダー

これくらいワイドな方がカッコ良いです。

さてさて、どうするか。

 

汎用オバフェン自体は7千円しないくらいでしたが、実際の取り付けとかタイヤ周りをいじるとなると結構予算がかかりそうなので悩みます。

 

 

www.youtube.com

www.facebook.com

Django win10にanacondaインストールしてDjangoの開発環境をつくる。

 

タイトルがカタカナと横文字が多くてバカっぽいですが、win10でanacondaからのDjango開発環境作成の走り書きメモです。

anacondaインストール

まずは、anacondaインストール。

www.anaconda.com

このリンクの下部に環境(macとかwinとかbitとか)ごとのダウンローダがあるので、PCにダウンロードしてからexeを開くとインストール開始。

途中選択画面で迷ったら、ググればなんとかなります。

pathを通す

コマンドプロンプトを使って、どこのディレクトリにいても呼び出せるようにパスを通しておきます。

 

まず、win10で環境変数を開きます。

win10はコントロールパネルの開き方からしてわかりづらいのですが、画面左下の「ここに入力して検索」に「環境変数」と入力すると候補を出してくれます。

f:id:te-tou:20200523161352p:plain

win10 環境変数の開き方

下図のように「環境変数」を押下し、pathを選択して「編集」を押下。

f:id:te-tou:20200523162840p:plain

win10にanacondaの環境変数追加

下記のパスを新規に追加します。

  • C:\Users\(ユーザー名)\Anaconda3
  • C:\Users\(ユーザー名)\Anaconda3\Scripts
  • C:\Users\(ユーザー名)\Anaconda3\Library\bin
コマンドプロンプトで確認

pythonのバージョン情報を確認してみて、ちゃんと表示されたら良しとします。

  • python -V

f:id:te-tou:20200523165223p:plain

python -V

ついでにPower shellで使えるようにするには、PsCondaEnvが必要らしいです。

下記コマンドでインストールできます。

  • conda install -n root -c pscondaenvs pscondaenvs
仮想環境作成

仮想環境がなんたるかは、とりあえず開発環境をいれる「箱」を作るイメージだとおもっています。

たくさん作れるし、いらないのは消せるし。

ちゃんと箱を分けておけば、箱の中が混ざり合わなくて変なことも起こらないし程度に認識してます。

 

なので、ざっくり「箱」の名前を決めます。⇒とりあえす「test」にしときます。

コマンドプロンプトで下記のコマンドを打って仮想環境を作成します。

  • conda create -n test ⇒「test」の部分は任意の名称をいれます。

途中で「proceed?」と聞かれるので、「y」で返します。

仮想環境確認

下記のコマンドで環境情報を確認できます。

  • conda info -e

f:id:te-tou:20200523174904p:plain

conda info -e

「test」という環境が作成されました。

環境のアクティベート

下記のコマンドで仮想環境をアクティベートします。

  • activate test ⇒「test」の個所は作成した仮想環境名

f:id:te-tou:20200523174935p:plain

仮想環境をactivate

activate コマンドを打つと、(test)というのがプロンプトの先頭に表示されます。

 

ここでもう一度、仮想環境確認コマンド。

  • conda info -e

f:id:te-tou:20200523233043p:plain

conda info -e after activation

アクティベートした「test」環境に*(アスタリスク)マークがつきました。

 

ちなみにアクティベートをやめるときは、以下のコマンドで。

  • deactivate

先頭の(test)が消えます。

 仮想環境にDjangoをインストール

仮想環境の中にDjango開発ができる材料をインストールします。

  • conda install django

f:id:te-tou:20200523233731p:plain

conda install django

「proceed」は「y」でenter。

そうすると、目盛りが動いてさいごに「done」が表示されてインストールが終わります。

 

インストールを確認するために、コマンド打ちます。

  • conda list

f:id:te-tou:20200523234413p:plain

conda list after django install

リストが表示され、Djangoがインストールされてることがわかりました。

 

ここまでで、win10にanacondaインストールしてDjangoの開発環境をつくりました。

まとめ

windowsでの環境構築はめんどくさい。

 

 

www.youtube.com

www.facebook.com

Rakuten UN-LIMITを契約(めっちゃWi-Fiがダメダメなので)

 

2020年4月以降、クラウドsimを使った容量無制限サービスの「めっちゃWi-Fi」が使い物にならないくらい速度が出なくなってしまいました。

www.te-tou.tokyo

なので、巷で話題の楽天アンリミットを契約しました。

東京にいるなら、23区内を拠点としている場合は現状かなり良い契約だと思います。楽天ポイントもたまるし。

Wi-Fiルーター的に使えれば良いと考えています。

折角なので、ちょっと興味があった楽天ミニも合わせて購入しました。

 

早速、Rakuten UN-LIMITの公式サイトから申し込み。

 

楽天ミニ到着

申し込みからちょうど2日で荷物が自宅に届きました。

f:id:te-tou:20200511004234j:plain

Rakuten MINI

アンドロイド端末のRakuten MINIはeSIMにのみ対応しているので、simカードはありません。

f:id:te-tou:20200511004945j:plain

内包物は至ってシンプルです。

コネクタはUSB~C。

f:id:te-tou:20200511004455j:plain

Rakuten MINI と iPhone11 大きさ比較

Rakuten MINIに新色としてクリムゾンレッドとかありましたが、手持ちの物と統一感があった方が洒落てるかと思い白を選択しました。

とりあえず箱から出して、iPhone11との大きさ比較。

Rakuten MINIかなり小さいです。あと、この白は高級感があって良いです。

逆に、iPhone11は大きい。私は手があまり大きくないので片手で使うのは結構しんどいです。

設定

眺め終わったら、電源を入れて設定してゆきます。

f:id:te-tou:20200511005617j:plain

Rakuten MINI 手順書

基本的に手順書に沿って操作してゆけば良いので簡単です。

いろんな人がこの設定方法を記事にしているので、迷ってもなんとかなります。

しかし、仕方ないことですが「〜アプリに〜を許可しますか」で必ず「はい」を選択しないといけないのはやや抵抗があります。しかし、仕方ない。

 

eSIMの設定も記憶に残らないくらい簡単に出来ました。楽天モバイルのアプリの最新版をダウンロードして、どこかのボタンを一つ押す程度の作業でした。

これで楽天モバイルのネットワークにつながります。

速度(世田谷区付近)

速度がどんなもんか見てみます。(20200510.世田谷区付近)

f:id:te-tou:20200511010247j:plain

Rakuten UN-LIMIT速度

結構良い方だと思います。

時によっては50Mbpsくらい出たりもします。

 

翻って、めっちゃWi-Fi。(20200510.世田谷区付近)

 f:id:te-tou:20200511010434p:plain

もはや死亡レベルです。yahooのトップ画面表示するのもやっとです。

これで毎月料金取られるのには不満です。改善するまで無料にしてくれないかな。

悪口を言わないことにはおさまりません。

まとめ

ともあれ、楽天アンリミットが開通しました。

ただ、立川周辺の都下を寝城にしているので対応エリアが早く広がって欲しいです。

 

Rakuten MINIの使用感については、小さいながらもそんなに不便では無いです。

おそらくqwerキーは相当使いづらいとは思いますが、フリック入力で日本語打つ分には全然問題ないです。

当面は「ポータブルプレイヤー兼、Wi-Fiルーター + α」みたいな感じで使えば良いと思ってます。電話機としては優秀ですが、これひとつメイン端末にするには勇気が必要です。

ついでに付与ポイント予定

オンラインから手続きすると楽天ポイントがジャンジャン貯まりますね。

SMSアクティベーションを正しく行うことがポイント付与の条件みたいです。

network.mobile.rakuten.co.jp

期間内にちゃんと手続きすると還元されるポイントはざっと下記の通りです。(多分間違っていないと思います。)

  • オンライン手続き→3000p
  • 申し込み事務手数料ポイントで返還→3300p
  • 楽天ミニ購入+プランセット→5000p
  • 紹介コード適応(楽天モバイルID)→2000p(紹介した人は3000p)

上記合計で13,300ポイントですね。端末買ったり事務手数料払ったりするんで現金は使いますが、これだけポイントバックされればかなりお得な気がします。

紹介コード適応は手続きの途中で入力する必要があるのですが、よく注意しないと見逃してしまいそうな場所にあるので事前にどこに入力するか調べてから手続きした方が良さそうです。

 

 

www.facebook.com

www.youtube.com