設定方法や手順など」カテゴリーアーカイブ

デザインパターン一言メモ

Adapter

IAdapterがAdapteeに委譲。

継承で実現する場合もある。

Prototype

IPrototypeが自身を複製。

Memento

OriginatorがMementoを作成、復元。

State/Strategy

IState/IStrategyでポリモーフィズム。

具体的にはclientからIState/IStrategyを利用し、インスタンスもclient内で生成することが多い。
インスタンス生成時に条件分岐等でアルゴリズムの切替え、状態の切替えを実施。

Decorator

IComponentを共通で実装。
ConcreateComponentからDecoratorに処理を委譲。

Composite

IComponentを共通で実装。
CompositeとLeafがある。
CompsiteがIComponentのコレクションを保持。

Proxy

ISubjectを共通で実装。
Proxyが自分で処理をすることも必要ならRealSubjectに処理を委譲することもできる。

Flyweight

FlyweightFactoryでFlyweigthインスタンスを生成し自身のpoolコレクションに保存。
利用時も既にインスタンスが存在すれば、それを利用する。

Singleton

コンストラクタをprivateにする。
自身のstaticメンバーにインスタンスを保存

Iterator

IIteratorにIAggregateのコレクションを保持する。
IAggregateでIIteratorのインスタンス生成して利用する。

Template Method

テンプレートメソッドはabstractメソッドのみ使う。
サブクラスでabstractメソッドを実装。
スーパークラスがサブクラスをコントロール。

Builder

DirectorはIBuilderで定義したメソッドのみ使う。
DirectorがBuilderをコントロール。

Factory Method

Template Methodと同じ構造。
インスタンス生成が必要な部分をサブクラスで実装。

Factory抽象クラスの中で実装したcreateで抽象createProductなどインスタンス生成の手順を定義し、サブクラスでcreateProductを実装する。

インスタンス生成のコントロールを得るという点から下記のような方法が有名。
(Factory Methodをパラメータ化)

Class Test {
Test(int type){
_type = type;
}
}

Class Test{
private Test(int type){ //コンストラクタをprivate
_type = type;
}
static create(int type){ //インスタンス生成メソッドを準備
return new Test(type);
}
}

Abstract Factory

IFactoryでIProduct1,IProduct2の生成を定義。
どのような部品セット(1,2)なのかをIFactoryで定義し、IProductでそれぞれの処理を定義。

Bridge

継承と実装を分離。
機能追加は、Abstractionを継承したRefinedAbstractionに。
実装は、Abstractionより委譲されたImplementorに。

Visitor

IVisitorはデータ構造ごとのvisitを実装する。
IAcceptorのacceptの中でvisitを呼び、自身をvisitに渡す。
ダブルディパッチ。

Chain of Responsibility

IHandlerは転送先のIHandlerを自身に持ち
処理が完了か次が見つからないとき以外は次に転送し続ける。

Facade

サブシステム化し、単純な窓口を提供。

Mediator

IMediatorでIColleaugeを生成しメンバーとして保持、さらにIColleauge.SetMediatorで自身を渡す。
IColleaugeは自身に変更があったらIMediator.ColleagueChangedでIMediatorに通知。
IMediatorはColleagueChangedが呼ばれたとき、保持するIColleaugeすべての状態からロジックを判断する。

Observer

ISubjectがIObserverを保持しISubjectが変化したらIObserver.Updateを呼ぶ。
被験者が観察者のインスタンスを保持する。

Command

処理の呼び出しをメッセージからオブジェクトにする。

ICommandはExecuteを定義し、Receiverを保持。
Receiverは実際のActionを定義しICommand.Excuteの中でReceiver.Actionを呼ぶ。
Invokerは起動者でボタンのようなイメージ。

Interpreter

独自構文の文字列をContextに渡しトークン解析する。
ContextはhasNextやnextTokenなどで解析したトークンを取得できる。

構文解析クラスは文法ごとにIAbstractExpression実装した
TerminalExpression、NonterminalExpressionを準備。
NonterminalExpression1、NonterminalExpression2、TerminalExpression
のようにそれぞれ作成する。

実際は、
NonterminalExpression1.Parse(new Context(文字列))のように渡されると、
NonterminalExpression1の内部でnew NonterminalExpression2.Parse(context)
のように最後のTerminalExpressionまで内部で呼ぶ。

Null Object

IAbstractionをRealObjectとNullObjectが実装。
IAbstraction.Request()でRealObjectを返すが、Request()がNullを返す場合はNullObjectを返す。

MongoDB基礎

インストール

/etc/yum.repos.d/mongodb-org-4.0.repo

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

を記載し、

yum install -y mongodb-org

起動
systemctl start mongod

停止
systemctl stop mongod

再起動
systemctl restart mongod

自動起動
systemctl enable mongod

シェル起動
mongo

シェル終了
exit

Mongoシェルコマンド

db切り替え(作成)
use DB

db削除
db.dropDatabase()

利用中db
db

db一覧
show dbs

コレクション一覧
show collections

コレクション作成
db.createCollection(“コレクション名”)
※Cは大文字

コレクション削除
db.コレクション名.drop()

ドキュメント作成
db.コレクション名.insert({“name”:”taro”,”age”:1})
db.コレクション名.insert({“name”:”taro”,”age”:1, “addr”:”tokyo”})

ドキュメント検索
db.コレクション名.find()
※すべて

db.コレクション名.findOne()
※一つのみ

db.コレクション名.find({“name”:”taro”})
※条件

ドキュメント更新
db.コレクション名.update(検索内容、更新内容)
db.コレクション名.update({“name”,”taro”},{“name”:”jiro”})

通常はフィールドが全て上書きされる。
更新したい場合$setを使う。
フィールドが存在すれば更新、しないと新しいフィールドとして追加される。

db.コレクション名.update({“name”,”taro”},{$set:{“name”:”jiro”}})

ドキュメント削除
db.コレクション名.remove()
※すべて

db.コレクション名.remove(検索内容)

ユーザー

ユーザーはDBごとに作成adminのユーザーは管理者となる。

現在のDBに接続中のユーザー
db.getUsers()
db.system.users.find()

ユーザ作成
※2.4まではaddUser

use name_store

db.createUser({
user:”taro”,
pwd:”123″,
roles:[{
role: “readWrite”,
db: “admin”
}]

})

あるいは

db.createUser({
user:”jiro”,
pwd:”123″,
roles:[“dbAdminAnyDatabase”] 
})

db.createUser({
user:”shiro”,
pwd:”123″,
roles:[“root”]
})

現在の接続先のDBにユーザーがー作成される。
db:は対象のDBというよりロールが存在するDBという意。

主要なロール

read
readWrite
dbAdmin
dbOwner
userAdmin
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase(他のコレクションのfind等できない)
root

ユーザー削除
use db
db.dropUser(ユーザー名)

認証

認証有効化

/etc/mongod.conf
※winならProgram Filesの中

#security:

security:
__authorization: enabled
※インデント必要

ログイン方法

mongo
use admin
db.auth(“taro”, “123”)

NginxとgolangでAPIサーバー

golangもNginxも始めたばかりなので、他のブログの記事を参考にしつつ試験中

Nginxのconfにlocation追加

golang

ちょっと違う書き方

サーバーの開始

func http.ListenAndServe(addr string, handler Handler) err
http.ListenAndServe(“:81”, nil)

第1引数にTCPアドレス
第2引数にHandlerを引数に受け取りサーバーを起動する。

Handlerというのは、http.Handlerインターフェースを実装していればいい。

ちなみに、内部でhttp.server.ListenAndServeを呼んでいる。http.server.ListenAndServeは内部でhttp.Server.Serveを呼んでいる。http.Server.Serveはforループでリクエストごとにgoroutineを立ち上げる。

http.Handle(r)とは

ServeHTTPメソッドを持つインターフェース。
ServeHTTPはリクエストとレスポンスが記述される。
type Handler interface { ServeHTTP(ResponseWriter, *Request) }

http.Handleとは

func Handle(pattern string, handler Handler)
URLとhttp.Handerを実装した構造体を受け取り、ルータに登録。

http.HandleFuncとは

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
URLとhttp.Handerを受け取り、ルータに登録。

HandleだとServeHTTPを定義しHandlerを実装した構造体を渡す必要があるが、HandleFuncの場合Funcのまま受け取れる。

http.HandleとHandleFuncについて

http内でDefaultServeMux(ServeMux)が定義されており、DefaultServeMux.Handler、DefaultServeMux.HandleFuncが呼ばれている。

http.ServerMuxとは

ServerMuxはURLとhandlerを登録しておく構造体。
ServeMux自体、ServeHTTPメソッドを実装している→Handler
mux := http.NewServeMux()
mux.Handle(“/echo”, echoHandler)

http.Handle(r)Funcとは

type HandlerFunc func(ResponseWriter, *Request)
func(ResponseWriter, *Request)の別名でServerHTTPが定義(実装)されている。

Handle(r)FuncとHandleFuncについて

そっくりで混乱するが、HandleFuncはURLとHandlerをServerMuxに登録する。Handle(r)Funcの方は、func(ResponseWriter, *Request)の別名でhttp.Handlerとして使える。

http.ServeMux.HandleFuncとは

URLとfunc(ResponseWriter, *Request)を受け取りルータに登録している

内部でfunc(ResponseWriter, *Request)をHandle(r)FuncにキャストしているHandleに登録している。

http.ServerMux.Handleとは

ServeMuxにURLとHandlerを登録する。

出力関係

Print
標準出力へ

Fprint
出力先を指定

Sprint
文字列で返す。

接尾のfはフォーマット

VPS(ConoHa)設定

VPS契約したので設定。
Ubuntu入れたと思ったけど、CentOSが入ってる模様。

過去記事参考

VirtualBoxにUbuntu 16.04を入れる(通常のインストール含む)

vimシンタックス

手元のWSHに入ってたので流用
/usr/share/vim/vim74/syntax/go.vim
同パスにコピー

.vimrcに追加
autocmd BufNewFile,BufRead *.go setfiletype go

サーバーにSSHで接続する

root@IPアドレス
パスワードは設定済みのrootパスワード

ユーザー作成

過去記事参考

Ubuntu ユーザーの追加、設定、パーミッション

とりあえずrootで作業中。

SSHの設定

過去記事参考

Ubuntu セキュリティ関連設定

設定ファイル
/etc/ssh/sshd_config

ポート変える(49152 – 65535辺り)

再起動
systemctl restart sshd

ちなみに

状態
systemctl status

自動起動有効
systemctl enable

自動起動無効
systemctl disable

独自ドメイン設定

以前、MuuMuuで取得したドメインがあって、
NSをXserverに指定したまま放置していたのでこのドメインを活用する。

メールはそのままXserverで、wwwのみvpsに回す。

xserverのサーバパネルのDNSレコードの設定から編集。

MXはホスト名と内容が同じになっているので、
ホスト名をそのまま独自ドメインで、内容をxserverのドメイン(xxx.xsrv.jp)にする。

Aタイプの3つはIPアドレスをVPSのアドレスに変更する。
(あるいはサブドメインとwww付きを消して1つにしてしまう)

これでしばらく待つと独自ドメインからSSHアクセスできる

Nginx

今回はphp使わないので、初めてのNginxにて。
yum install nginx

基本のルート
/usr/share/nginx/html

コンフィグ
/etc/nginx/nginx.conf

コンフィグの中にincludeがあり、
conf.d以下を読み込んでいる。

アクセスログ
/var/log/nginx/access.log

コマンドメモ Ubuntu

firewalld

定義されているサービス
firewall-cmd –get-services

許可されている情報
firewall-cmd –list-all –zone=public
–list-all
–list-services
–list-port

リロード
firewall-cmd –reload

サービスを許可する
firewall-cmd –add-service=http –zone=public –permanent

許可したサービスを削除
firewall-cmd –remove-service=http –zone=public –permanent

許可するポートの追加
firewall-cmd –add-port=22/tcp –zone=public –permanent

許可するポートの削除
firewall-cmd –remove-port=22/tcp –zone=public –permanent

定義済みサービス(編集はしない)
/usr/lib/firewalld/services

定義済みゾーンの確認
firewall-cmd –list-all-zones

アクティブなゾーンの確認
firewall
cmd getactivezones

Nicに対するデフォルトゾーンの確認
firewall-cmd –get-default-zone

NICのゾーンを変える(permanetが不要という記事ある要確認)
firewall-cmd –change-interface=lo –zone=public

NICをゾーンから削除(permanetが不要という記事ある要確認)
firewall-cmd –remove-interface=lo

だいたいの流れ。本来サービス登録なんだろうけど。

登録済みのサービスを消す。
firewall-cmd –remove-service=http –zone=public –permanent
firewall-cmd –remove-service=ssh –zone=public –permanent
firewall-cmd –remove-service=dhcpv6-client –zone=public –permanent

必要なポート追加。
firewall-cmd –add-port=54424/tcp –zone=public –permanent
firewall-cmd –add-port=80/tcp –zone=public –permanent

MySQL設定

MySQL 基本SQL

など参考

旧バージョン削除

インストール済みかどうか
yum list installed | grep xxx

コンポネート探す
rpm -qa | grep xxx

完全削除
yum remove xxx

ファイル消す場合
rm -rf /var/lib/mysqlなど

インストール

リポジトリ更新(公式サイト)
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

yum -y install mariadb(clientとcommonが入る)
yum -y install mariadb-server

起動
systemctl start mariadb

自動起動
systemctl enable mariadb

mysql
cant connect to local mysql server through socket
ソケットが見つからないということだが、restartで直った。

ユーザ設定

ユーザー確認
select host, user, password,authentication_string from mysql.user;

権限確認
show grants for root@’localhost’;

ルートパスワード追加
alter user ‘root’@’localhost’ identified by ‘abc’;
(passwordに入る)

set password for ‘root’@’localhost’=password(‘123’);
(authentication_stringに入る)

passwordが古くauthentication_stringが新しいという記載が多いが、どちら入ったとしても動作しているが詳細不明。

パスワード削除
set password for ‘root’@’localhost’=password(”);

匿名ユーザを削除
drop user ”@’localhost’;

未使用ユーザ削除
drop user ‘root’@’::1′;
drop user ‘root’@’127.0.0.1’;

drop userについて、5.0.2以前はrevoke必要。

::1はIPv6におけるlocalhost

TCP経由は127.0.0.1で、ソケット経由はlocalhostとなるが、名前解決(skip_name_resolve)が有効だと、127.0.0.1もlocalhostになる模様。ただし、接続の方法によっては解決されない場合もある。

testデータベースを削除

drop database test;

文字コード設定

/etc/my.cnf.d/server.cnf

以下追加

[mysqld]
character-set-server = utf8

文字コード確認
show variables like ‘char%’;

ポート設定

設定確認
show variables like ‘%port%’;

リッスン状態確認
netstat -tanp

/etc/my.cnf.d/server.cnf

接続もとのIPを限定したい場合
bind-address
にて指定する。すべて受け付ける場合はコメントアウト。

待受ポート変更

[mysqld]
port = (49152 – 65535辺り)

個別

ユーザー作成
grant all on db1.* to ‘user1’@’%’ identified by ‘123’;

DB作成
create database db1 character set utf8;

golang インストールメモ

最近golangをはじめたので。

WSLインストール

sudo apt-get update
sudo apt-get install golang

バージョン確認
go version

> 1.6.2

環境確認
go env

.bashrcに追加
export GOPATH=”$HOME/go”
export PATH=”$GOPATH/bin:$PATH”

Db(SQLite)を使ってみる

go get github.com/mattn/go-sqlite3

package context: unrecognized import path “context”
というエラーがでる。

1.7ではcontextパッケージとして標準パッケージに仲間入りする。
とのことなのでアップデート

sudo apt-get install golang-1.9
sudo mv /usr/bin/go /usr/bin/go.old
sudo mv /usr/bin/gofmt /usr/bin/gofmt.old
sudo ln -s /usr/lib/go-1.9/bin/go /usr/bin/go
sudo ln -s /usr/lib/go-1.9/bin/gofmt /usr/bin/gofmt

これで入った。

Windows用にクロスコンパイル

WSLからだと通常こうなっているので、
GOOS=linux
以下の用にしてビルド
GOOS=windows go build hello.go

WSLと.NET Coreの環境

WSLのインストール

optionalfeaturesにて、Windows Subsystem for Linuxを有効化。

設定>更新とセキュリティ>開発者向けにて、開発モードを選択。

Microsoft Storeアプリでディストリビューションをインストール。

最初の起動でユーザー名とパスワードを決める。

sudo apt-get update
sudo apt-get install gcc

起動用ショートカット
SET HOME=%~dp0
bash.exe

WSLに.NET Coreをインストール

https://www.microsoft.com/net/learn/get-started/linux/ubuntu16-04
を参考にする。

wget https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb

sudo dpkg -i packages-microsoft-prod.deb

インストール有無の確認
sudo apt-cache policy apt-transport-https
必要なら、
sudo apt-get install apt-transport-https

sudo apt-get install dotnet-sdk-2.1

通常の使い方

アプリ作成
dotnet new console -o myapp

実行
dotnet run
(myappの中で実行)

Visual Studioでプロジェクト作成

Visual Studioから、
ASP.NET Core Webのプロジェクトを作成する。

プロジェクトの右クリックから発行をして、WSL側のフォルダに保存。

転送フォルダにて、
dotnet WebApplication1.dll
を実行

an assembly specified in the application dependencies manifest…
とエラーがでた。

プロジェクトの右クリックから、
csprojを編集する。

以下の部分のVersionをubuntu側に合わせる。
<PackageReference Include=”Microsoft.AspNetCore.All” Version=”2.1.2″ />

dotnet –info
でバージョン確認できる。

.NET Core runtimes installed
の部分のバージョンを見る。

dotnet WebApplication1.dll
で実行。

自動起動

WSLなので.profileに入れてプロセスと同時に立ち上げる。

/usr/bin/dotnet /mnt/g/Dropbox/Workspace/Bash/html/WebApplication1.dll > /dev/null 2>&1 &

C# エンコードオブジェクト取得

メソッド
System.Text.Encoding.GetEncoding(“utf-8”)

静的プロパティ
System.Text.Encoding.UTF8

コンストラクタ
new System.Text.UTF8Encoding(false)
ASCIIとUnicodeは、Encodingクラスから派生した専用クラスがあり、falseにするとBOM無しにすることができる。

UbuntuをLiveCDから起動

もしsshがなければ、
sudo apt-get install openssh-server

起動する。
/etc/init.d/ssh start

パスワードが空なので、
passwd

パスワードを指定したらTeraTermなどでログインする。
ユーザー名はubuntuとなっている。

Dockerメモ

ちょっとだけ触ってみた。

Registry
↑ Push
↓ Pull
Image  ← Dockerfile
↑ Commit
↓ Run
Container

インストール
apt-get install docker.io
service docker start

起動
sudo cgroupfs-mount
sudo usermod -aG docker $USER
sudo service docker start

利用方法

pull
イメージ取得

docker pull mysql:5.7.22 タグでバージョン指定もできる

images
イメージの一覧

rmi
イメージの削除

rmi {REPOSITORY} latestが消える
rmi {IMAGE_ID}

run {起動したいイメージ}
コンテナ作成

–rm 利用後コンテナ削除
–name 作成するコンテナに名前をつける
-it 中に入れる
-d バックグラウンドで起動
-p ポートマッピング
-v コンテナとホストのディレクトリをつなげる {ホスト側:コンテナ側}

docker run –rm -it –name aaa “mysql:5.7.22” /bin/bash
docker run –rm -v “/home/okamura:/home” –name bbb -it “mysql:5.7.22” /bin/bash
docker run –rm -d –name aaa -e “MYSQL_ROOT_PASSWORD=123” “mysql:5.7.22”
docker run –rm -it –name aaa -e “MYSQL_ROOT_PASSWORD=123” “mysql:5.7.22”
docker run -it -p 81:80 ddd /bin/bash

ちなみにMySQLの場合
Can’t create/write to file ‘/tmp/xxx’で落ちる。要調査。

docker stop
コンテナ停止

入っている場合は
exit
または、
Ctrl+Dでbashプロセスを止めると、コンテナも停止する

docker start -i {NAMES}
コンテナ再実行

docker exec -it {NAMES} bash
起動済みのコンテナに入る

ps
動いているコンテナ

ps -a
停止しているコンテナ

rm {NAMES}
コンテナの削除