PHPのお勉強

2月からWeb業界に転職するつもりなので,PHPの勉強をしている。

基本的にはバスと電車の中で本を読んで,
帰りにコーヒー屋で手を動かしてアウトプットという感じで進めている。

読んでいる本はコレ
一周目が終わって内容を理解したので,アウトプット中。

開発用サーバ: http://52.194.187.169

文法等については後日まとめる。
きちんと寝て,明日に備えよう。
やってきたこと,考えてきたことを出せればいい。

結果はどうあれ,あの日から全力でやってこれた。

以上


host名を設定

IPをいちいち覚えていられないので,
host名を設定する。

  1. vim /etc/hostsで下記の書式に従って設定を追加する。
    1. IPアドレス 任意のhost名

WordPressの新しいエディタ正直使いにくい。

以上

AWSで簡単にwebサイトを

新しくデザインパターンの勉強でもしようかと思って,
Webサイトを作ったので導入方法だけまとめとく

1. lightsailでインスタンスを作成する。

詳細は省略

centosで作った。

2. sshで接続する

ブラウザでも接続できるけど,動きがモッソリしているのでgit-bashで接続した。

  1. アカウントページからpemファイルをダウンロード
  2. 任意の場所に保存(~/.ssh/hoge.pem)
  3. ssh -i ~/.ssh/hoge.pem user@host

3. (L)AMPのインストール

sshで入った後に,

sudo yum install -y httpd

sudo yum install -y mysql-server

sudo yum install -y php

でインストールできる。(mysql-serverはインストールできなかった。)

4. デーモン起動

sudo service httpd start

5. 接続確認

任意のブラウザでhttp://(ホスト名)にアクセスする。

6. 動作確認

サーバ内の/var/www/html/にindex.phpなりindex.htmlなりを作成し,再アクセスする。


今回はgithubのリポジトリから落としてくるように設定した。

7. gitのインストール

サーバ側で,sudo yum -y install git

8. Githubに公開鍵を登録

cd ~/.ssh/

ssh-keygenでEnter連打

cat ~/.ssh/id-rsa.pun

コピった文字列をgithubに登録する。

9. リポジトリをclone

git clone git://github/hogehoge

 

本当にサクッと動くもの作るだけだから,セキュリティとかは保証しない。

以上

LinuCの勉強

パイプリダイレクト

0: 標準入力
1: 標準出力
2: エラー出力
3以降: プロセスが開いたファイル

リダイレクション(標準出力)

出力先を変更する場合

1 > hoge : hogeに標準出力のみを出力
2 > hoge: hogeに標準エラー出力のみを出力
& > both: bothに標準出力,標準エラー出力の両方を出力

リダイレクション(標準入力)

  1. cmd1 < fileA: fileAの内容をcmd1に取り込む
  2. cmd1 < fileA | cmd2: fileAの内容を標準入力からcmd1に
    取り込み出力結果をcmd2に標準入力で渡す。

特殊なファイルや記述

<< here document

cat << eos:指定した文字列が現れるまでの内容を,コマンドの標準入力として扱う。

dev/null

読み込むと常にEOFが返ってくる。


tac

ファイルの内容を最後の行から表示する。


tee

標準入力を別のコマンドとリダイレクトすると同時に,ファイルも格納することが可能。

利用方法

標準入力から読み込んだデータを標準出力とファイルに出力する。

nl /etc/passwd | tee myfile.txt| head -3

パスワードをmyfile.txtに出力すると同時に,先頭3行を表示する。


コマンド同士の結合について

cmd1;cmd2

cmd1実行後,終了コードに関係なくcmd2を実行

cmd1&&cmd2

cmd1の終了コードが0ならば,cmd2を実行

cmd1||cmd2

cmd1の終了コードが0でなければ,cmd2を実行

※ 終了コードは, echo $?で確認可能


grepコマンド

オプション

-v : パターンに一致しない行
-n: 行番号を出力
-l: パターンに一致するファイル名
-i: 大文字,小文字を区別しない


headコマンドに関して

  • デフォルトで10行分出力
  • -100 で100行出力

trコマンド

標準入力から,入力した文字を指定したフォーマットに変換する。

例) 小文字のアルファベットを大文字に変換する。

tr ‘a-z’ ‘A-Z’
キーボード入力: hello
出力: HELLO

例) -dオプションで一致した文字を削除する。

tr -d ‘my’
キーボード入力: My name is yuko
出力: M nae is uko

※ ファイル指定は不可


sedコマンド

  • 単語単位の変換や削除にはsedコマンドを使用する。

LinuCの勉強

メモ書きを転記

プロセス

実行中のプログラムのこと

  • システム上では,常に複数のプロセスが稼働している。
  • コマンド実行で,プロセスは産まれ,プログラムの終了とともに消滅する。

プロセスの生成に関する手順

新しいプロセスは,親プロセスが自分のコピーである子プロセスの生成をカーネルにリクエストし,次に生成された子プロセスの中身が新しいコードに入れ替わる。

プロセスに関連するコマンド

ps: プロセスの情報を表示する基本的なコマンド

pstree: プロセスの階層構造を表示する。

top: プロセスの情報を周期的にリアルタイムに表示する。

プロセスの優先度について

nice値

優先度を表現する指標

プロセスの優先度

CPUによる実行を待つ複数のプロセスのうち,どれを実行するか?

  • niceコマンドで優先度を変更して,実行する
  • 実行中のプロセスから変更する場合は,renice または top コマンドを実行する。

シグナルについて

  • SIGHUP(1): 端末の切断によるプロセス終了
  • SIGINT(2): 割込みによるプロセスの終了
  • SIGKILL(9): 強制終了によるプロセスの終了
  • SIGTERM(15): Default
  • SIGCONT(18): 一時停止したプロセスの再開

killコマンドについて

kill コマンドで,プロセスを指定する場合は,killallを使用する。

基本コマンドとファイル操作

シェル変数

設定されたシェルのみが使用できる変数
setコマンドで確認する。

環境変数

設定されたシェルとその子シェルで起動したプログラムが使用する変数
envコマンドで確認する。
declare -xまたは,exportで設定可能。

 

以上

ジェネリックとデリゲート

ジェネリクス型

  • クラスのメンバを宣言するときに,

public class SomeClass{

	private strig member1;
	private int member2;

	someClass(){
		this.member1="hoge";
		this.member2=7;
	}
}

としてしまうと,member1member2には,それぞれStringintしか使用できなくなる。

  • ジェネリクスを使用すると,メンバ変数の型をインスタンス時に指定することができる。

public class SomeClass<T1, T2>{

	private T member1;
	private T2 member2;

}

public static void main(String args[]){
	SomeClass<String, int> obj = new SomeClass<String, int>();
}

デリゲートについて

  • 匿名関数
    • メソッドの型

// 単なる型
public delegate void TestMethod(String s);

  • 使用方法は,作成した型で変数を作成し使用する。

public delegate void TestMethod(String s);

TestMethod test = delegate(String msg){
	MessageBox.Show(msg)
};

test("test");
test("hoge");
test("fuga");

  • .NETのフォームのイベントハンドラ等で使用されている。
  • 引数を使用しない匿名関数は,Actionという名前で宣言されている。

Action act = delegate(){
	MessageBox.Show("Action");
}

act()

ラムダ式

  • いちいちdelegateを書くのが面倒くさいので,ラムダ式を使用する。

TestMethod test = delegate(String msg){
	MessageBox.Show(msg)
};

TestMethod test = (nsg) => {
	MessageBox.Show(msg)
};

TODO: C#の部分をJavaに置き換え

以上

~/.ssh/configについて

時間がないので10分で

Host: 任意のホスト名

HostName: ホスト名

Name: ユーザ名

Port: ポート番号

IdentityFile: 任意の鍵

ssh 任意のホスト名

で指定した接続が可能

以上

[Python]親クラスで子クラスのメンバを使用する。

コード

 coding=utf-8

from abc import ABCMeta, abstractmethod

class Parent(object):
    
    @abstractmethod
    def hoge(self):
        print(self.name)

    @abstractmethod
    def fuga(self):
        print(self.age)

    @abstractmethod
    def fuga2(self, age):
        print(age)

class Child(Parent):

    def __init__(self):
        self.name='nekonisi'
        self.__age='26'

    def hoge(self):
        super().hoge()

    def fuga(self):
        super().fuga() #error

    def fuga2(self):
        super().fuga2(self.__age)

if __name__ == '__main__':
    child = Child()
    child.hoge()
    # child.fuga() #error
    child.fuga2()

実行結果

nekonisi

26

解説

  • 親クラスParentで,hoge, fugaメソッドを宣言して子クラスChildで使用する。
  • その際に,子クラスのメンバを使用したいが,プライベートメンバだと,親クラスで参照できないためエラーになってしまう。
  • 回避策として,fuga2では子クラスのプライベートメンバを引数として渡してあげて実行している。

問題

  • 複数のプライベートメンバを使用するときに,引数が増えてしまう。
  • 自インスタンスを引数として渡してあげる方法もダメだった。

解決策

  • 会社の先輩に聞いたら,「できるわけねーだろ」とのこと
  • そもそも設計思想がおかしい。
    • 子クラスのメンバを使用したメソッドが親クラスにあること自体がおかしい。
  • 下記のように修正
# coding=utf-8

from abc import ABCMeta, abstractmethod

class Parent(object):

    def __init__(self, name: str, age: int):
        self.__name = name
        self.__age = age
    
    @abstractmethod
    def hoge(self):
        print(self.__name)

    @abstractmethod
    def fuga(self):
        print(self.__age)

class Child(Parent):

    def __init__(self):
        super().__init__('nekonisi', 26)

    def hoge(self):
        super().hoge()

    def fuga(self):
        super().fuga()

if __name__ == '__main__':
    child = Child()
    child.hoge()
    child.fuga()

 

そうすると,コンストラクタのオーバロードとかもしたくなっちゃう。

追記

オーバーロードは下記のように実現する。

# coding=UTF-8

class hoge(object):
    def __init__(self, name=None, age=None):
        if name is None:
            name = 'noname'

        if age is None:
            age = 0

        self.__name=name
        self.__age=age

    def introduce(self):
        print('My name is ' + self.__name)
        print('I\'m ' + str(self.__age) + ' years old.')

if __name__ == '__main__':
    obj1 = hoge()
    obj2 = hoge('nekonisi', 26)
    obj3 = hoge('konisi')

    obj1.introduce()
    obj2.introduce()
    obj3.introduce()

実行結果

My name is noname
I'm 0 years old.
My name is nekonisi
I'm 26 years old.
My name is konisi
I'm 0 years old.

 

以上