旅好きエンジニアのメモ

旅のこと映画、統計、会計、プログラミングなど、気の向くままに語ります

djangoとpostfixでメールを送信する方法

djangopostfix(smtpサーバー)でメールを送信する方法についてまとめていきます。

環境

ubuntu16.04
django1.11

postfixの設定

まず、smtpサーバーとは簡単に言うとメールサーバーのことです。
電子メールを送信したり、受信したりと。

まずは自分のサーバにsmtpサーバーであるpostfixを構築していきます。
以下のサイトがわかりやすいと思います。

www.server-world.info

 

ただsasl設定をしている上記サイトはsaslを設定しているので
これだけではだめでdovecotをインストールして認証OKにしてあげないといけません。

まぁここではDjangoとの連携なのでここでは紹介しません。

Django側の設定

smtpのサーバーが設定できたら
djangoのsetting.pyに以下を追加します。


EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '' #自分でsmtpサーバーに決めたhost名、初期値のlocalhostでもok(smtpに初めから設定されてるので)
EMAIL_PORT = 25
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = '○✗運営局 <support@"ドメイン">' #ドメインsmtpサーバーに追加したものでいいかと ○✗運営局は送信元の名前で好きなのを

あとは
python manage.py shell
で以下のものを自分用に書き換えてテストをしてみましょう。

from django.core.mail import send_mail
send_mail('tetet here', 'Here is the message.', '送信元アドレス',['送信先アドレス'], fail_silently=False)

これだけでできるので認証系のシステムを作成している方は作ってみてはどうでしょうか。

ubuntuで無料ssl設定 Let's Encrypt

SSLとは?

SSLはインターネット上のセキュアな通信のためのプロトコルです。
簡単に言うと、通信の情報(個人情報やクレジットカード情報など)を暗号化して安全に通信するための技術です。

参考に下のは以下のものです。
http://qiita.com/yo1000/items/4e2bea39a4952be074fc

インストール

まず、gitでソースをゲットしよう
git clone https://github.com/letsencrypt/letsencrypt.git

サーバーはnginxを使っています。

設定

証明書の取得は以下のコマンドで
$ ./letsencrypt-auto certonly --webroot -w /usr/share/nginx/html -d "自分のドメイン"
"自分のドメイン"はお名前ドットコムとかムームードメインで取得した自分のサービスで使うものを記載しましょう。

取得ドメイン
"example.com"だったら
$ ./letsencrypt-auto certonly --webroot -w /usr/share/nginx/html -d "example.com"


nginxへの設定は以下を
/etc/nginx/sites-enabled/default
なり
/etc/nginx/sites-enabled/nginx.conf
なり、
自分の設定を呼び出しているところに記載してください。

おそらく、サーバーの設定に不慣れな方はどこに貼るかは難しいと思うのですが頑張ってください。
自分はnginx.confに貼っています


listen 443;
server_name www.encrypt.local;

root html;
index index.html index.htm;

ssl on;
ssl_certificate /etc/letsencrypt/live/www.encrypt.local/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.encrypt.local/privkey.pem;

あとは適当にcronとか設定して上げていいかも
crontabの場所はetc直下にあるかも

経理じゃなくても知っておきたい会計項目

自分の会社は大丈夫なのか?財務体質はどうなのか?

株式投資をする人や経理の人以外でも知っておきたい項目をまとめてみました。

これは結構、就職や転職の時に使えると思います。

転職の際もやはり、財務体質のしっかりした企業を見定めたいものです。

そこで、すべてを網羅するわけではないですが、これだけは見といたほうが良いんじゃないかというのをまとめました。

 

また、これらの項目を見るときは同業種で比べる必要があります。

(例えば小売と商社で比べた時、資本のバランスとか利益率とか比べても企業の商売のあり方が違うので簡単には比べられないです)

 

総資産利益率ROA

総資産利益率ROA)= 売上高/総資産
総資本の有効活用度合いがわかる

 

・売上高総利益率

売上高総利益率 = 売上高総利益 ÷ 売上高
業界によって数値の良し悪しは異なる(商社なら1.5%~2.0% 小売なら20~30%など)

 

・従業員一人当たり売上高=売上高÷従業員数

従業員一人あたりがどのくらい売り上げているかがわかる。
企業自体の売上が高くても、従業員が多いことに原因があるかもしれない

 

流動資産・固定資産

現金、有価証券、売掛金受取手形棚卸資産、債権、前払費用
流動資産とはすぐに現金化できる資産に事で、企業に短期的な支払い能力を表す

 

自己資本比率

自己資本比率(%) = 自己資本 ÷ 総資本 × 100
一般的に20~30%あれば良い
企業の安全性を表す指標

公開鍵の作成法 環境はubuntuです

公開鍵の作成法

初めてサーバー借りたりして設定するときに、セキュリティのためにも公開鍵を設定してクライアントを制限することが大事なのでメモしておきます。

 

usernameのところはサーバーの@マークの前とかを設定

 

ssh-keygen -t rsa -f ~/.ssh/gce-key -C username

 

公開鍵の確認は以下のコマンドで見れます

cat ~/.ssh/gce-key.pub

文系プログラミング未経験がweb系企業のエンジニアになるまで

私は文系の大学、大学院卒でプログラミングといえば統計解析のためにRを使って解析を行うことぐらいで
ネットワーク?DB?クラス?関数?とかそんなレベルでした。

しかしながら、現在では未だにひよっこながらもweb系企業でエンジニアをやらさせていただいています。

さて、そんな中で文系でエンジニアでどうなのってことについて書いていきたいと思います。

・文系理系とか関係ない

プログラミングって結局は言語を学んでそれを書いていくだけです。
英語を学ぶとか、フランス語を学ぶとかとそんな変わらないです。
言語って主語の後は、述語とか決まっているじゃないですか。
プログラミング言語もそんな感じで色々書き方が決まっているんで、それさえ覚えれば誰でも書けます。

でも、論理的な数学的な才能がいるんでしょ?と言われると思います。
難しい微分とか行列とか普通のプログラミングではなかなか使わないと思います。
(統計のロジック埋め込むとかならいるかもですけど、基本的にいらないです)

ただし、論理的に考えることは大事と思います。まぁ、論理的に考える学問の代表格的なのが数学なのでそう思うのかもしれませんね。
でも、よくよく考えれば、論理的に考えることって仕事をする上でプログラミングじゃなくとも必要じゃありません?
というか文系でも基本的に論文書くときに論理的じゃないと駄目じゃないですか?
直感的な論文? 随筆ですか?感想文ですか?
直感的な論文なんてないので。
文系でもエンジニアは務まります。


・そもそも理系だからといって

全ての理系の人があたかもプログラミングやってるかのような感じですが、
そもそも情報系や組み込み系じゃない限りばりばりプログラミングなんてしないです。
数学者がネットワークの知識を知っているとでも?
知っている人は自分で勉強しています。
文系だからーとか理系だからーとか、そんなこといってやらないとか苦手意識をもつのはどうかと思います。

 

・まとめ

文系でも理系でも関係ないんでやりたいと思う人はガンガンチャレンジすればいいかと!

Sierについて思うこと そのキャリアで大丈夫?(あくまで個人的な意見です)

前提として、まず私自身は前職、中堅のSierにいました。
中堅と言っても案件としては基本的にプライム案件のみでした。
今はweb系の企業に努めています。


・これからプログラミングって必要なのか?

これからの時代、プロジェクトマネージャーにとってもプログラミングのできる人材が求められるようになると思います。
だって、プログラミングわかんない人がどうやって、設計書つくんの?工数導きだすの?
お客さんに合わせればいいの?
そんなことしてたら炎上まちがいなしですね(笑)

いや、経験があればある程度、見積もりとかは出せるとは思いますよ。
でも、プログラミングできる人に比べてどれくらい正確なのって話。
やったことないのに正確に見積もり出せる人は天才です。占い師にでもなりましょう。投資家なんかもいいですね。

・じゃあSierってプログラミングできんの?

これ自体はどういったプロジェクトにアサインされるかによります。
はっきり言って運任せです。
会社の事情もあるし、プロジェクトの進捗にもよるし、難しいですね。

では、プログラミングできたとして、技術力はあがるのでしょうか?
(自分で独学でやってる場合は除きます。そんな人はプロジェクトに関わらずできるようになります)

これまた、あがるともあがらないとも言えないですね。
javaの書き方とか、簡単なsqlの書き方とかはすぐ覚えるんじゃないでしょうか?
でも、それ以上は?
これは自分で勉強するしかないですね。

また、Sierで使う技術は何かとレガシーなものが多いです。
新しいものができるプロジェクトなんて限られているのではないでしょうか。
そうなると、Sierにいて技術を学ぼうなんて幻想にすぎないことがわかります。
(技術は自分で学びましょう)


Sierの中の人は?

結論としては会社によります。
しかしながら、web系と比べて、できる人の数や情報感度が鋭い人はぐっと減ると思います。
もちろんスーパーな人はどこの会社にもいるとは思いますが。
前所属していた会社の経験しかないので、私の話があっているかはわかりませんが、
やはり、自分で独学で勉強している人は少なかったですね。
会社の仕事さえできれば良いや的な。
そんな人ってこれからどうするのでしょうか?
オフショアが失敗のケースが昔は多かったですが、東南アジアのエリートたちは少なくとも昔よりも技術力も語学力も上げているというのに。
どうやってグローバル化の波と戦っていくのでしょうか?


・じゃあweb系っていいの?

個人的には良いと思います。時間の制約やお客さん都合などがSierに比べて少ないし、新しい技術も学べますし。
しかし、勘違いしてはいけないのはSierも悪くはないということです。
技術力のあり、マネジメントのできる人材はSierで非常に貴重な戦力ですし、大手なら一般的なweb系よりも稼げるのではないでしょうか?
また、企業によっては研究開発部門もありますし。

こればかりも企業によります。
でも、なにが大切かっていうと、結局自学自習できないと意味がないってことです。
web系だって自学自習しないと取り残されますし、Sierにいてもそうです。
企業がどうより、自分がどうするか?これが大事だと思います。
そしてweb系は自学自習したり、意欲の高い人が集まる傾向があるので、web系最高となるのです。


・これからのSierってどうなの?

話の肝はここです。結論としてはスペシャリスト集団でなければなくなっていくんじゃないかなーって思います。
普通の技術者レベルが集まってところに受託する意味あります?
ぶっちゃけ内製化が進んでるのに高い金払って受託しようとは思わないですよね。
社内にスーパーな人がいない場合や技術者が足りていない場合にはいいかもしれませんが。
まぁ、昨今技術者が足りていないと言われているので何十年かは持つでしょうが、
グローバルな波が来て技術者が増えてきたら、もう受託はほとんど不要になっていくでしょうね。
(全部がなくなるとかそういう意味ではなく、より強い競争にさらされるので企業に強みが必要ということ)


・まとめ

ざーって思いつくままにかいたのであまり参考にはならないと思いますが、いいたいことは結局自分次第ってことでした。

 

rubyとpython どちらも使ってみての比較っていうか感想

お仕事では主にrubyで趣味やデータ分析などの際にはpyhtonを使っています。
まぁ、どちらも初心者なので的を捉えてるとは言い難いですが、触ってみての感想を書いて行きたいと思います。

直感的に書けるruby,合理的なpython

まず、rubyですが、日本人のMatzが作ったということもあり、日本人に取っては直感的に書けるのではないでしょうか?

例えば、型の確認など

kata = "ストリングだよ"

rubyの場合
kata.class

pythonの場合
type(class)

rubyは”先に変数名を書いて、その後にクラスを調べますよー”って感じですね。
一方、pythonは”先に型を調べるよー”って来て。”なんの?”ってなって"この変数の"ってなる感じです

つまり、
rubyは先に目的語が来て、その後、動詞みたいな感じです。
pythonは先に動詞、目的語が来ています。

pythonはオランダの方が作ったということもあって、やはりプログラミング言語にも作成者の母国語が反映されているのではないでしょうか?

 

case文のないpython

javarubyやってた人に取っては"マジッ"てなるかもしれませんね。
case文だと見栄えが良く、わかりやすいですよね。なんとそれがpythonにはないのです!!

おや、まてよと個人的には思います。
pythonってインデント強制だし

if str in {'a', 'b'}:
print('a, b')
elif str == 'c'
print('c')

のようにif文書けるし、別にcase文いらなくね?
というより、if文で見やすいようにかけるなら大丈夫じゃね?と


日本語文献の少ないpython

言語の難しさ自体に差異はないのですが、日本人がとっつきやすいなーって思うのはrubyです。
rubyっていうよりrailsかもしれませんが。
なんでかというと、pythonの構文とかは日本語文献はそこそこあるのですが、djangoとかflask,
pyramidなどのフレームワークになると一気に日本語文献少なくなります。
まぁ、"stack over flow"見ろよって感じなんですが。。。
英語に苦がないぜ、おれは英語できるぜってドヤ顔したい人はpythonがおすすめです。
日本にいるんだし、おれはスピードを求めてるんだっていう人は、rubyですね。

 

クソみたいなORM?

これは言語飛び越えてフレームワークのレベルになるんですけど
とにかくDjangoのORMはrailsのactive recordに比べてしょぼいです。
特にサブクエリ周りが。。(django.1.11になって改善された?)
あと、”なんでマッパー使っててるのに"or"とかでなんかimportしないといけないんだよっ”とか

しかし、自分はdjangoが好きです(笑)

 

まとめ
好きなの使うべきってことですね。
個人的にはデータ分析も好きなので同じ言語でwebサイト作れるpythonは非常に楽です。
レコメンドエンジンとか機械学習周りとか実装したいなら、同一システムに組み込めますからね。
わざわざ、rubyからpython呼び出すとかしなくていいし。