diadia

興味があることをやってみる。自分のメモを残しておきます。

初心者向け:webサーバーを作りアクセスしてみる

centos7にnginxだけを試しに導入してみる。

centos7をvirtualboxにインストール。

 

コマンド

$ yum update

$ yum search nginx

nginxがない問題が発生。

その場合は以下を入力。

$ sudo vi /etc/yum.repos.d/nginx.repo

 

ーーーーー内容ーーーーーーーーーーーーーーーーーーーーーーーーーー

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/

gpgcheck=0

enabled=1

 

ーーーーーーーーーーーーーーーーーーーーーーーーーーー

 

$ yum install nginx

$ nginx -v

$ systemctl status nginx

$ systemctl start nginx

 

これでウェブサーバが完成した。これでウェブサーバにアクセスする準備が整った。

アクセス先を確認

$ ip a

ここで表示されたipをブラウザに入力してみると、 サイトにアクセスできない。

サーバーは起動しているのでその他の要素でアクセスできない。

要素:ファイアウォールSELinux

$ systemctl status firewalld

$ systemctl stop firewalld

 

$ getenforce

$ setenforce 0

 

これで再びアクセス先にブラウザを通じて入力する。するとnginxのインストール成功と適切に起動しているというページが表示される。これでオッケイ!

あとは自分の作ったプログラムをnginxにつなげる接着面の設定をしてやれば良い。

ここについてはまた次回分かったら記述する。

 

プログラムの勉強方法について

どうすれば上達するのかについて今思うことを書くとすれば、

それは絶えず情報を頭に入れる。これしかない。

 

しかしながらいろんな記事を読むとプログラミングで遊んだり、いろいろな作品を作ると良いと書いてある事が多い。それはある程度情報を頭に入れたあとに行う段階のことを言っていると思う。

そもそもプログラミングは技術である。

そして人工物と自然物という属性があるとして、どちらが近いかと言ったら人工物よりの技術である。親が子に見せながら魚をさばいたり、絵の書き方と違って、人工成分が多いのだ。

ということは、代々技術を発展させた人々の思想、考えをトレースすることが技術の理解につながる。

ということは試行錯誤はほとんど不要。

特に新参者は自分のレベルを標準レベルに導くために動画やら本から情報を入れれば効率が良い。

 

上記はプログラムをいかにして学ぶか?という側面から考えた。

もう一つ重要な側面があると思っている。それはプログラムを書く際に絶対必要な知識となくても動くプログラムをかけてしまう知識を分けることだと思う。後者の知識はあっても損はないが、前者が欠落していると致命的である。これを分けるための方法論を私は知らないし、どれだけの知識量が必要なのかもわからない。ただインプットすべき知識には優先順位があると思って学習する態度が必要かもしれない。

 

あとはインプットする際にすべてをを理解しようと思わない。絶対力不足が理由で理解できないことがある。だからすべてを理解しようとしないで分かる範囲を広げてくイメージで勉強していく。

 

 

Git push先の変更のやり方

 

sourcetreeが使えない(プッシュできない)ので、gitからbitbucketにプッシュすることにした。ただこのときに色々いじっていたので、git自体も変な設定になっていた。

今回は
$ git push -u origin master
とやったところ、予期もしないリポジトリにプッシュすることになっていた。

(本当はHelloBitbucketにプッシュしたいところ、test5というリモートリポジトリだった。

 

今回得られた情報を整理したい。

 

まずプッシュ先の確認をどのように確認するか?
$ git remote -v
これで確認できる。表示されるのはhttpsでプッシュする場合とsshでプッシュする場合の2通りあり、さらにfetchの場合も表示される。つまり合計4つのパターンが表示される。
ここで自分が送信したいリモートリポジトリか確認すること。もし送信先が誤りの場合、いかの方法で送信先を変更することができる。ちなみに、
$ git remote -V をするとヘルプの表示になる。

 

送信先の変更(https)
$ git remote set-url origin <url>
これで送信先を変更することができる。
またbitbucketのリポジトリurlは以下のように構成されている。
https://@bitbucket.org//.git

※ユーザ名とアカウント名は同じと考えて良いと思われるので神経質にならないでオッケイ!ソース:https://ja.confluence.atlassian.com/bitbucket/update-your-username-226165171.html のビックリマーク参照

また実際にこーどを打ち込む際に"https://....."とクォーテーションマークでくくってあげないとうまくコードが読み込まれなかった。

コードを打ち込んだら
$ git remote -v で確認したり、

再び

$ git push origin master

でプッシュしてみると、送信したい先にプッシュできるようになっています。

gitメモ

gitはできるだけやらないように避けてきたけど、sourcetreeがどうしても使えないのでやらざるを得ない。

問題はbitbucketに繋げないことが最大の問題だが。。。

 

メモしておく。

$ git checkout (branch-name)

これは今編集しているブランチところから入力先のブランチに移動するときに使用する。

 

$ git branch 

これは今自分がどのブランチで編集を進めているか確認するために使う。

 

$ git add (file-name) 

これは今いるブランチにファイルを追加したいときに使う。

 

$ git commit -m 'this is a pen'

これは編集内容を記憶して更にメッセージを付け加えておくコマンドである。

 

$ git log 

コミットの履歴を見る。

 

使い方の流れ:

レポジトリ作りたいところにディレクトリ作成。$ mkdir xx

git のレポジトリを作成する。$ git branch master

そのレポジトリを初期化する。$ git init 

レポジトリ内にファイルを作成する。ex. $ touch index.html

レポジトリに反映させる?これから変更した内容を追跡させるように登録する。

$ git add (file-name)

変更した内容を記録する $ git commit -m "this is a pen"

django リダイレクトについて

URL dispatcher — Django 1.4.6 documentation

 

 

クラスベースビューには、データ表示系のもの(ListViewやDetailView)とデータベース編集系のもの(CreateView,Updateview,DeleteView)がある。

データベース編集系には一種の特徴がある。フォームにデータ入力し送信すると、別のページに飛ばすことが一連の流れとして組み込まれている。詳しくは下記に補足1として後述する。

そういうわけでこちらが飛ばす先のページを予め設定していないとエラーになってしまう。

エラー:リダイレクト先を設定してねって。

 

 

このリダイレクト先を設定する方法について少しわかったのでまとめておく。

リダイレクト先を決める機能はsuccess_url である。

使い方は簡単でsuccess_url=reverse_lazy('urls.pyで定めたビューネーム')と設定すれば良い。詳しく知りたい場合は補足2参照。

 

ただしurlが動的な場合には、話が違ってくる。

なぜならこの方法が通用しないから。

reverse_lazyの引数にビューネームに加え、遷移したい数字等も必要になるのだ。

要は、success_url=reverse_lazy("ビューネーム",4)みたいなことがしたいわけだ。

でこの4は状況にによっては5や6にしたいってわけ。

get_success_url(self)を使うと、urls.pyの urlが取得できると思われる。

pathの第一引数のこと。

def get_url_success(self):

     return reverse_lazy("urls.pyのname",kwargs={"pk":self.kwargs["pk"]} )

 

 

 

(補足1)edit系のクラスベースビューにリダイレクトが組み込まれている件について

edit系(CreateView,Updateview,DeleteView)にはそれぞれsuccess_url (※デフォルトでNone設定)属性をもつ。継承時には、この属性を定めてあげないとリダイレクト先に飛べずにエラーとなってしまう。例としてCreateViewを見てみる。
CreateViewはBaseCreateViewのpostメソッドを読み込む。このpostメソッドはProcessFormViewのpostメソッドを読み込む(つながる)。そしてform_validメソッドを読み込むことになる。

class BaseCreateView(ModelFormMixin, ProcessFormView):
    ...省略...
    def post(self, request, *args, **kwargs):
        self.object = None
        return super().post(request, *args, **kwargs)

https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L160

class ProcessFormView(View):
    ...省略...
    def post(self, request, *args, **kwargs):
        """
        Handle POST requests: instantiate a form instance with the passed
        POST variables and then check if it's valid.
        """
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L129

form_validメソッドはまずModelFormMixinのほうを読み込む。ここでフォームに入力されたデータが新たに作られる。作られたのちFormMixinのform_validメソッドを読み込む。読み込んだ先はHttpResponseインスタンスの生成につながる。この引数にget_success_url()メソッドがあり、ここでsuccess_urlが必要になる。

class ModelFormMixin(FormMixin, SingleObjectMixin):
    ...省略...
    def form_valid(self, form):
        """If the form is valid, save the associated model."""
        self.object = form.save()
        return super().form_valid(form)

https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L123

class FormMixin(ContextMixin):
    ...省略...
    def form_valid(self, form):
        """If the form is valid, redirect to the supplied URL."""
        return HttpResponseRedirect(self.get_success_url())

https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L55

get_success_url()メソッドはModelFormMixinを読み込む。ここでCreateViewの継承したクラスにsuccess_urlを設定していないと、get_absolute_urlを取得しようとする。それでもできなかったものは"No URL to redirect to. Either provide a url or define"" a get_absolute_url method on the Model."というエラーを吐き出すことになる。

class ModelFormMixin(FormMixin, SingleObjectMixin):
     ...省略...
    def get_success_url(self):
       
        """Return the URL to redirect to after processing a valid form."""
        if self.success_url:
            url = self.success_url.format(**self.object.__dict__)
        else:
            try:
                url = self.object.get_absolute_url()
            except AttributeError:
                raise ImproperlyConfigured(
                    "No URL to redirect to.  Either provide a url or define"
                    " a get_absolute_url method on the Model.")
        return url

https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L110

(補足2)success_url=reverse_lazy('urls.pyで定めたビューネーム')の使い方について

reverse_lazyとreverseの使い方は以下のように使う。
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
https://docs.djangoproject.com/ja/2.2/ref/urlresolvers/#django.urls.reverse

reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
https://docs.djangoproject.com/ja/2.2/ref/urlresolvers/#django.urls.reverse_lazy
要するにどちらもviewnameを記述すればよい。viewnameはurlconf(urls.py)で記述したname="hoge"のhogeを書くか、views.function_nameみたいな形でも良い。
今回の記事でなぜreverse_lazyを使ったのかについては以下の根拠がある。

Some common cases where this function is necessary are: providing a reversed URL as the url attribute of a generic class-based view. providing a reversed URL to a decorator (such as the login_url argument for the django.contrib.auth.decorators.permission_required() decorator). providing a reversed URL as a default value for a parameter in a function's signature.

generic class-based viewのurlアトリビュートとしてURLをreverseで使いたいときにはreverse_lazyが必要になる、ということだそうだ。今回はedit系のViewのurl(success_url)属性を定めるのでreverse_lazy()を採用する。

ネットワーク系のメモ

プロトコル=通信技術のネットワークのルール

 

サーバー構築

まずサーバ構築とは、サービスを提供する状態に設定すること。

サーバーとして利用する際には、DHCPではなく「固定IPアドレス」に設定する必要がある。

サーバーは安定的な通信が可能な有線ネットワークに接続することが望ましいそうだ。

DHCPのこと

あまり良くわからなかったけど、なんかうまくまとめてあったのでメモしとく。

DHCPとは? - ネットワークエンジニアを目指して

 

DHCPは例えばパソコンを立ち上げるだけで勝手にIPアドレスを各デバイス(ノード、エンドポイント)に割り当てることができる。

ちなみにDynamic Host Configuration protocolの略。

そしてネットワークに存在しているノードはすべてIPが割り振られているという事実も知っておくこと。

 

今疑問に思うことは、DHCPでIPを割り当てられてるならmac起動時もIPがかわるのではないか?macのIPに基づいてvirtualboxCentOSサーバのIPを設定してるんだけどこれだと毎回設定しないといけないんじゃ??

デーモンってなに

デーモンはUNIX系OSで特定の機能を提供するプログラム。windowsでは同じようなものをサービスという。コンピュータやOS起ち上げ時に自動的に実行される。

末尾にdがついているものがデーモンのファイル判断する材料になる。

デーモンの種類

主に多くのプログラムが共通して必要とするシステム関連の処理をになうもの

systemd,syslogd

 

ハードウエア制御に関連するもの、通信ネットワークを通じて外部の相手から届く要求を処理するもの

inetd,tcpd,httpd,ftpd,smtpd,imapd,dhcpd,smbd,sshd

 

指定された時間にプログラムを起動する機能を提供するもの

crond

 

 

 

 

 

 

 

デーモンとは - IT用語辞典

サーバー設定 アクセスできるようにするには

virtualboxにCentOS7を入れてそこにSSHで接続しようと試みているけどできない。

そこを突破したい。

 

virtualboxのアダプターはブリッジアダプター。

 

PSコマンドはプロセスの動作状況を確認するためのコマンド。

 

/etc/rc.d/init.d/sshd startと入力してもそのようなファイルやディレクトリはないと出てしまう。実際ディレクトリinit.dには

functions netconsole network  README しかない。sshdは存在してなかった。

cat README | less した結果、いかの文章があった。

 

’’’

/etc/rc.d/init.d/に伝統的な(今まで使ってきた)initスクリプトを探していませんか?そしてそれらがどこかに行ってしまっていると。

ここに今どうなっているのか説明します。

native systemd service filesによってinit スクリプトが置き換えられた OSをあなたは使っています。このservice filesはinitスクリプトにとても良く似た機能を提供しています。

このservice filesを利用するには、単純にsystemctlをよびだすこと。そしてそれは(直近に?)起動しているすべてのservice(他のunitも)の一覧をアウトプットします。

また次のものがほしければsystemctl list-unit-filesを使いなさい。

stopped,disabled,masked の状態を含めたすべてのunit filesのリスト

各々サービス(service)をstart ,stop するときには以下のコマンドを使います。

systemctl start foobar.service 

systemctl stop foobar.service

更に詳しいことはsystemctl(1)を参照してください。

注意。。。。省略

 

systemctl(1)

systemd(1)

http://0pointer.de/blog/projects/systemd-for-admins-3.html 

http://www.freedesktop.org/wiki/Software/systemd/Incompatibiities

 

やり方が分かってきた。

ssh接続するには、ssh用のデーモン(サービス)を起動する必要がある。

そしてlinux系のデーモンは最後にdがつく。だからサーバーsshdを起動させれば良いと思う。そしてCentOS 7からはsystemctl を使う。具体的には

systemctl start foobar.service これでサーバーにデーモンを起動させることができる。

デーモンの起動したかどうかの確認のコマンドは

systemctl status foobar.service

あとは実際にssh のあとにIPを入れるので、サーバーにそのIPを設定してやればいいわけだ。

 

具体的にデーモンの稼働は、

systemctl start sshd.service 

systemctl status sshd.service

デーモンの自動起動

systemctl enable sshd.service

 

IPの変更

nmcli connection modify [device-name] ipv4.adrresses "x.x.x.x/x  x.x.x.x" 

ネットワークの自動接続

nmcli connection modify [device-name ] connection.autoconnect "yes"

ちなみにIPの変更してから起動させるべきか、デーモンを起動させてからIPを変更しても大丈夫なのかまだ確認できていない。

 

 

linux 良さげなリンク

Linux Networking-concepts HOWTO

Linux Networking-concepts HOWTO

 

Linux Networking-HOWTO

https://www.tldp.org/HOWTO/NET3-4-HOWTO.html

 

   Linux Advanced Routing & Traffic Control HOWTO

https://linuxjf.osdn.jp/JFdocs/Adv-Routing-HOWTO/index.html

プログラミングなんで難しいかわかった

ネットワーク設定系

コンピュータが吐き出す結果の意味がわからないからだ。

結局その結果を見てもどんな意味かわからないからだめなんだ。

これは本を見れば解決していける内容だ。

 

django

よくわかってないけどdjangoの関数はおそらくdjangoでしか使えない。

だからその関数がどのような情報を吐き出すか確認することができない。