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

ASP.NET Core MVCからMySQLに接続

APS.NET Core MVCは以前に数回さわっただけで、まだ使い始めたばかりなので色々調べながら試している状態。

NuGetより
MySql.Data.EntityFrameworkCore
をインストール

appsettings.json

以下を追加。

Startup.cs

using Microsoft.EntityFrameworkCore;
を追加。

ConfigureServices
の中に以下を追加。

MvcBasicContext.cs

作成。

Member.cs

作成。

MySQL

VPS上のMySQLに今回は手動でテーブルを準備。

Controller

追加。

View

試しに呼び出してみる。

CentOSに.NET Coreを入れる + FTPの設定

https://www.microsoft.com/net/learn/dotnet/hello-world-tutorial
を参考にする。

sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-2.1

基本アプリ

dotnet new console -o myapp
cd myapp
dotnet run

ASP.NET CoreWeb

ASP.NET CoreWebアプリケーション
のプロジェクトを作成

Webアプリケーション(モデルビューコントローラー)
を選択。

HTTPS用の構成
のチェックを外す。

ビルド>xxxの発行
にて作成されたファイルを転送し、転送フォルダにて、
dotnet xxx.dll
のように実行する。

その他

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

FTPの設定

VSから発行したいのでFTPを入れる。

インストール

yum install -y vsftpd

設定ファイル

/etc/vsftpd/vsftpd.conf

変更

anonymous_enable=NO
listen=YES
listen_ipv6=NO
tcp_wrappers=NO

コメントアウト削除

ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
ls_recurse_enable=YES

追加

use_localtime=YES
allow_writeable_chroot=YES

起動

systemctl start vsftpd

スタートアップ

systemctl enable vsftpd

ファイアーウォール

firewall-cmd –add-service=ftp –zone=public –permanent
firewall-cmd –reload
firewall-cmd –list-all –zone=public

ユーザー制御

userlist_enableを有効にすると、userlist_denyも有効になる。
ブラックリストがデフォなので対象のユーザー名を削除のみ実行。

ブラックリスト(デフォルト)
userlist_enable=YES
userlist_deny=YES or 記述なし

ホワイトリスト
userlist_enable=YES
userlist_deny=NO

ファイルのパス(必要なら)
userlist_file=/etc/vsftpd/user_list

userlist_enableを優先度が高い禁止リスト
/etc/vsftpd/ftpusers

user_listとftpusersから対象のユーザー名を削除する。

WindowsでNginx+PHP+MariaDB環境

以前は必要になるとxamppを使ってたけど、Nginxの環境はないっぽいので、zipを利用して手動で作ってみる。

Nginx

設定ファイルはもともとのコメント部を消して、とりあえずこんな感じ。
conf/nginx.conf

PHP

ダウンロードして解凍したら、phpというフォルダでnginxの中に入れる。

php.ini-development
をコピーしてphp.iniにする。

MariaDB

ダウンロードして解凍したら、mariadbというフォルダでnginxの中に入れる。

手動でDB作成等に使う場合、まずbinの中のmysqld.exeを起動。次にコマンドプロンプトからmysql -u root のような感じでログインできる。

ここはちょっと怪しいけど、特にiniを作らなくて相対パスで動いてそう、要調査かな。

バッチ作成

終了は強制にしている。

接続

Lanを経由して見る場合、ファイアーウォールに新しい規則を追加する。
とりあえずプライベートの80を許可するだけ見れた。

WordPress

試しにWordpressを入れて見ると、DBの情報入れて送信ところでエラーになった。

エラーの原因は、
mysql_connect()がない。
クオートしない文字列のグローバル定数がない。
ってことらしい。

load.php
の下記の部分に@追加。
$wpdb = @new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST );

php.ini
で、
extension_dir = “ext”
のコメントアウトを消す。
extension=php_mysqli.dll
を追記した。
(もともとコメントアウトされているのとはファイル名が違ったので)

LAN経由で見たらcssとかがおかしくなっていた。
設定>一般>アドレスのところでlocalhostとなっていたので、閲覧しているPCから正しくたどり着けなかった模様。IPアドレスに変更。

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

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が入ってる模様。

過去記事参考

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

ちょっとハマったのは、ドキュメントルートを変えたとき、
ファイル自体に読み取り権限、ドキュメントルートまでの各ディレクトリに
実行権限が必要ということ。

PHP-FPM

yum list installed
確認すると必要なものは入っていた

設定は以下。
/etc/nginx/conf.d/_http.conf
/etc/php7-fpm.d/www.conf

ほとん修正せず動作した。WSLで実行したページも参考

Ubuntu 16.04インストール

コマンド参考

コマンドメモ 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

など参考

旧バージョン削除(MySQL)

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

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

完全削除
yum remove xxx

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

インストール(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で直った。

ユーザ設定(MySQL)

ユーザー確認
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;

文字コード設定(MySQL)

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

以下追加

[mysqld]
character-set-server = utf8

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

ポート設定(MySQL)

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

リッスン状態確認
netstat -tanp

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

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

待受ポート変更

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

個別(MySQL)

ユーザー作成
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

Win側のパスでファイルを管理していてbashでの移動が面倒なのでバッチで対応。
SET HOME=%~dp0
bash.exe

リセット

アプリと機能>Ubuntu>詳細オプション>リセット
スタートメニューにあるUbuntuから起動するとユーザー名、パスワード
を決めるところから。

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無しにすることができる。