ちゅーりんぐくんの備忘録

Injectionについて

SQL文を単純な文字列として扱うのはよくないです.単純な文字列だと書き換えなどの可能性がある.

 

$sql = "SELECT id FROM np_user WHERE id = '$loginUser' AND password = '$loginPassword';";
$results = $conn->query($sql);

 

そこでPHP Prepare Statementを利用

これはパラメータ部分をSQL文に展開しないものである.

$sql = "SELECT id FROM np_user WHERE id = ? AND password = ?;";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $loginUser, $loginPassword);
$stmt->execute();
$results = $stmt->get_result();

字句解析Part1

大学の講義で字句解析を行ったのでそれについてまとめていきたいと思う.

getchar()

標準入力から1文字分文字を読み取る.

putchar()

標準出力に文字を書き込む.

isalnum()

文字がアルファベットか数字かを判別

isalpha()

文字がアルファベットかどうかを判別

isdigit()

文字が10進数字か判別

ungetc()

第一引数で指定される文字をstreamがさす入力ストリームに戻す.これは数値や文字の終わりを知るために用いる.つまり一文字先を読みそれを読まなかったことにする関数である.

実験メモpart2

多対多接続の設計と実装

必要なもの

サーバプログラム,クライアント側のプログラムが必要

サーバプログラム:EchoBackプログラム(クライアントプログラムから送信されたメッセージを受信すると受信メッセージに追加メッセージを付与して返信する動作)

クライアントプログラム:サーバに負荷をかけるプログラム

サーバプログラムの現状

単一のクライアントからの接続に対して応答可能.しかし複数のクライアントからの接続があると最初に接続したクライアントとの通信が終わるまでほかのクライアントからの接続を受けることができない.

改良点

複数のクライアントからの接続に対して同時に応答できるように拡張

以下の複数クライアントからの応答が可能なプログラムをつくる.

select関数によって多重化したEchoBackサーバ

マルチプロセスによって多重化したEchoBackサーバ

マルチスレッドによって多重化したEchoBackサーバ

非同期I/Oによって多重化したEchoBackサーバ

クライアントプログラムの現状

サーバプログラムに負荷をかけれていない

シングルスレッドでメッセージを送受信を繰り返した場合単位時間あたりの通信は1メッセージとなりサーバにあまり負荷がかからない

改良点

並列処理でサーバに同時接続を行うプログラムを作りサーバに負荷をかける.

 

これらのプログラムを作り以下のことについて調べる.

最も実行速度が速い方法はどれか?

最も通信待ち時間が少ない方法はどれか?

最も通信失敗が少ない方法はどれか?

最も少ないリソースで実行できる方法はどれか?

 

以下からそれぞれのプログラムについて説明する

 

サーバプログラム

1select関数による同期I/Oの多重化えを利用したサーバープログラムの多重化(Np2回目ソースコード)

select関数

OSのシステムコールを活用することで複数のソケットを監視し任意のソケットが読み込み可能な状態となった時点でその情報を返す.その後,読み込み可能になったソケットのみを対象としてブロッキングI/O関数を利用した受信待ちを行ったとしても実質待ち時間なしでデータを受信することができる.

(ソケットとはコンピュータネットワークの接続の末端でネットワークプログラミングに必要となるライブラリのAPI

 1select関数に引数として与える監視するソケット情報を生成

 サーバソケット

 クライアント管理配列に登録されたソケット

 2select関数を実行してソケットを監視

 3-1読み込み可能となったソケットが新規のクライアントからの接続の場合accept関数で新規のクライアントからの接続を受け入れ当該クライアントとの通信用のソケットを生成する.生成したソケットをクライアント管理配列に登録

 3-2読み込み可能となったソケットが既存のクライアントからのEchoBack要求ならばEchoBack通信を行う.

 

2マルチスレッドを用いたサーバプログラムの多重化(Np3回目のソースコード)

 

 

3マルチプロセスを用いてサーバプログラムを多重化(Np4回目のソースコード)

 

クライアントプログラム

サーバに対して1接続につきM回のEchoBack通信を実施する

M回のEchoBack通信をN並列で実行する

 

 $tcpbenchmark 192.168.1.101 1000 1 30 100

第一引数:接続先IPアドレス

第二引数:接続先ポート番号

第三引数:試行数

第四引数:スレッド数(N)

第五引数:EchoBack回数(M)

 

機械学習の基礎

ラベル付きのデータを用意して学習モデルを構築する方法。
具体的には所得の関係を調べたいと思ったら、人々の詳細のデータ(性別、職種、年齢などの属性)を集めたデータベースを用いて、所得データをラベル付する
 
ラベル付きのデータを用いないで、学習モデルを構築する方法。与えられたデータだけでその潜在的な本質を抽出する必要がある。
 
分類の仕方
二値化
数値を0か1に変換すること。設定した閾値によって二値化することができる。
 
平均値引き
任意の値の平均値を任意の値に引く。こうすることで、特徴量の中心が原点になる。これをほどこした平均値の値は1に近づき、標準偏差は1になる。
 
スケーリング
複数の特徴量を同じスケールにすること正規化と標準化がある
 
正規化
L1正規化 ベクトルの要素の絶対値の和が1になるようにするもの
L2正規化 各行の要素の二乗の和が1になるようにするもの
 
ラベルには単語や数字が使われる。数字の場合はそのまま用いることができるが、単語の場合は、単語に数字を対応付けるようにラベル付けをする必要がある。
scikit-learnパッケージを用いる
encoder.fit(単語のリスト)でラベルと数字が対応付けされ、それがencoder.classes_に格納されている。
ラベル付けが完了したら以降はtransform()メソッドで単語を数字にinverse_transform()メソッドで数字から単語に変換することができる。

2Dゲーム基本マニュアル

任意のキャラクター(メイン)の動かし方

 画像を用意する.アニメーションについては後ほど解説.画像をSceneに張り付けることでだいたいはSprite Rendererがそのオブジェクトにくっつくがなかった場合はGetComponentから追加する.そしてSpriteに,動かす画像を張り付ける.

今回はマリオのようなアクションゲームを創造しているのでキャラクターの動きは倉庫番のような動く→停止→動くのような離散的動きではなく,移動ボタンを押しっぱなしなら,連続的に動くキャラクターを作成していく

Input

これはキャラクターを動かすのに非常に重要でInputでキーボードからの入力を受け付けることができる.

float controlThrow = Input.GetAxis("Horizontal");

Horizontalは横移動のときに用いられる.そしてこの例ではcontrolThrowに格納されているが,これをログで観測すると右矢印を押し続けるとcontrolThrowの値は0から小数を刻みジョジョに増加する.最終的には1が観測された逆の左も同様に-1が観測された.

よってこの値をvelocityの値に代入することで移動が可能になる.

Vector2 playerVelocity = new Vector2(controlThrow * runSpeed, myRigidBody.velocity.y);
myRigidBody.velocity = playerVelocity;

もしくは以下のような記述でも動かすことができる.

if (Input.GetKey("left"))
{
myRigidBody.velocity = new Vector3(-10.0f, 0, 0);
}

 

また内容を更新します...........

C言語のポインタ周りに関するまとめ

変数宣言をするとメモリのある領域が確保される.

代入するとメモリ領域の指定番地に情報が書き込まれる.

取得することでメモリ領域の指定番地から情報を読み出すことができる.

 

アドレスを取得する際には &変数 で獲得することができる

たとえばアドレス情報を格納するときにlongを使うとする.

long people = 64873437;

long people_a = (long)&people;

このようにしてしまうとアドレス情報とデータの区別がつきにくくなってしまうので実際はlongなどの型は用いない

ではアドレスを格納する変数の宣言はどのようにするのか.以下のようになる.

void* 変数名

これは通常のvoidとはまったく関係がない

このようにアドレス情報が格納される型をポイント型という. 

しかしvoid*型の変数の先頭のアドレスしか格納されていない.

 

よって実際にはint*型などを用いることが多い.

もともとのint型は4byte領域なのでint*型にすると先頭アドレスから4byte分取り出される.

 

アドレスに実際書きこまれている情報を取り出すときは *ポインタ変数名 でとりだす

int a = 46;

void* add = (void*)&a; とする

この時プリント文で出力すると以下のようになる

a->46

add -> 3921283492

 

*add -> 46

このことから実質的にaと*addは同じものである

 

ポインタの存在意義を問われるとやはり一番に言えるのはメモリの節約により高速に動作する関数が欠けることであろう.

例えばある変数 int a = 100; というものを関数などに直接渡したら,300バイトぐらいの領域を使うことになる.しかしあのアドレスすなわち &aのみを渡せば,たったの4バイトですむ.直接値などを渡す方法を値渡しといい,アドレスだけを渡す方法をポインタ渡しという.

 

ネットワークプログラミング3

マルチスレッド

マルチプロセスよりもリソース消費が少ない

プログラムがシンプルでわかりやすい

マルチタスク

CPUの処理時間を微小時間に分割して複数のタスクに切り替えることで疑似的に同時に実行すること

マルチスレッドはスレッド単位で並列に実行

またメモリ領域を共有しているためスレッド間では共有メモリを通じて情報のやり取りを行うことができる.ただリソース競合を避けなければならない

 

マルチスレッドはマルチプロセスに対して時間コストと空間コストが少なくて済む,これはマルチプロセスはプロセス全体の複製が必要だがスレッドは実行コンテキストの複製のみでよい.

移植性が高い

マルチスレッドはPOSIX準拠のpthreadライブラリが標準

リソース管理の安全性が低い

リソース共有するのであるスレッドが破綻すると他スレッドに影響を及ぼす

 

ptreadの代表的なAPI

すべてptread_ではじまるが省略している.

create() スレッド生成

exit() 現在のスレッドを終了

cancel() 指定したスレッドの実行をキャンセル

join() 現在のスレッドを他のスレッドが終了するまでブロック

(指定したスレッドの終了を待つブロッキング関数

tryjoin_np:ノンブロッキング

timejoin_np:タイムアウト設定可能)

kill() スレッドへのシグナル送信

detach() スレッドにリソースを開放

self() 自身のスレッドIDを呼ぶ

 

スレッド生成の流れ

void型のポインタの返り値をとりvoid型のポインタの引数をとる関数をつくりpthread_createに与える.

スレッド終了の流れ

複数のスレッドが並列実行するため各スレッドの処理が終わったらスレッドを終了させる.(pthread_exitを用いる) 

1.他スレッドから終了したスレッドの終了ステータスを取得したい場合があるため別スレッドで終了したスレッドをjoinする(joinして終了スレッドを取得したら開放することができる.)

2.スレッド終了時に自動的にリソース開放を許可する設定を行う(終了ステータスを獲得できなくなる)

pthread_join

第一引数でスレッド生成時に獲得したスレッドIDを指定

第二引数で終了ステータスを取得可能

 

スレッド間の通信の仕組み

マルチスレッドは共有メモリうぃ通してデータのやり取りが可能

3つのthreadを実行した場合2つのスレッドがほぼ同時に開始するとその値がほぼ同時に更新されずれが生まれる.また一つのスレッドを少し早めに開始するともう片方のスレッドで例えば31に更新されたとして、早く始めたスレッドがそのあとに29を更新したら29が31の後に入ってしまう.

解決策

MUTEX:競合状態を避ける目的でクリティカルリージョンをロックする仕組み

クリティカルリージョン

 ある部分の実行を開始したプロセス/スレッドが他のプロセス/スレッドが同じ部分を実行する前にその処理を終了する必要があるコード領域

 

MUTEXによる排他制御:pthread

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

~~

pthread_mutex_lock(&m);

~~

pthreafd_mutex_unlock(&m);

これで常に正しい結果を得られる.

マルチスレッドで計算しても常に正しい結果を得られることをスレッドセーブという概念で評価する

スレッドセーフではない場合

複数のスレッドでリソースを共有している場合

グローバル変数,static変数,共有ファイル,共有メモリ,参照ポインタによるアクセスに依存処理した場合スレッドセーフでない関数を利用している場合