サイバー大学生のマルチリンガルな日々

現役サイバー大学生3年生が外国語からプログラミング言語を使った日々を垂れ流す

元ホームレスが機械学習とディープラーニングをしてみた

 

どうもお久しぶり! ホームレスのhumuです。

 

最近忙しかったのと、Qiita記事に浮気をしていたのであまり投稿出来てなかったですw。

 

今回は最近流行りの機械学習ディープラーニングをしていこうと思います!

 

使うデータはkaggleコンペティションにあるIMDBデータ!

 

www.kaggle.com

 

こちらのデータは過去10年間にIMDB(internet movie database)で2006年から2016年の人気のあった映画1000本が用意されてます。

 

今回はそのデータを使って映画のレビューから映画に対して肯定的な意見か否定的な意見かを判定し予測するモデル(AI的な何かw)を作ります。

 

では、手を動かしながらやっていきます!

 

まずはデータ分析で使われるpandas 、numpyやデータ可視化のmatplotlib、ディレクトリ操作のosなどのライブラリを入れていきます。

import pandas as pd
import numpy as np
import os
from IPython.display import HTML
import matplotlib.pyplot as plt
%matplotlib inline
import japanize_matplotlib

 

ファイル読み込み

 

分析のためにデータをわかりやすくpandas のDataFrame型に整形する関数を定義します。

 

今回は、0~10までの評価値がレビューに付与されているので肯定or否定に分けるので

7以上を肯定つまり1,4以下を否定つまり0としてラベル付けします。(中間値となるものは元からデータ側で分けれていますのでご安心ください。)

 

def mk_dataframe(path):
"""
pathに元ずいてdataframeを作る。
path:str
train or test/pos or neg
files:list
text data to read
"""
data = []
files = [x for x in os.listdir(path)
if x.endswith('.txt') ]
 
for text_name in files:
# ファイルを読み込む
with open(path+text_name,'r') as text_data:
text = text_data.read()
# IDとreview読み込み
text_num = text_name.rstrip('.txt')
ID,review = text_num.split('_')
# バイナリー値の代入
if int(review) >= 7:
label = "1"
elif int(review) <= 4:
label = "0"
else:
label = ""
data.append([ID,review,label,text])
df = pd.DataFrame(data,
columns=['ID','review','label','text']
,index=None)
return df

 

kaggleのデータセットから持ってきた訓練用とテスト用のnegative positiveのデータをそれぞれデータフレームとして変更します

 

# それぞれのデータを読み込む
train_pos_df
= mk_dataframe('../aclImdb/train/pos/')
train_neg_df
= mk_dataframe('../aclImdb/train/neg/')
test_pos_df
= mk_dataframe('../aclImdb/test/pos/')
test_neg_df
= mk_dataframe('../aclImdb/test/neg/')

 

また、後でデータを分割した時値が固まらないようにデータフレームをシャッフルするような関数を定義します。

同時にネガティブなデータとポジティブなデータを結合します。

 

def shuffle_data(pos_data,neg_data):
'''
posとnegのdataframeを結合する
'''
full_df = pd.concat([pos_data,neg_data]
).sample(frac=1,random_state=1)
 
return full_df
# 訓練用とテスト用データの作成
train_df = shuffle_data(train_pos_df
,train_neg_df)
test_df = shuffle_data(test_pos_df,test_neg_df)
train_df.shape,test_df.shape
train_df.head(10)

 

f:id:humuhimi:20190719222539p:plain

train_df 10行分

一行目のtrain_dfの文章を出力します。

# 文章のサンプル表示
HTML(train_df.text.iloc[0])

 

f:id:humuhimi:20190719222833p:plain

一つ目のデータのレビュー

 

固有の評価数とラベル数を分析します。

 

# ユニークな評価数 ラベル数
print('review:\n{0}\nlabel:\n{1}'.format(
train_df.review.value_counts()
,train_df.label.value_counts()))

 

f:id:humuhimi:20190719223022p:plain

固有の評価数とラベル数

 

テキストの長さと量の分布を可視化します。

 

plt.figure(figsize=(15, 10))
plt.hist([len(sample)
for sample in list(train_df.text)]
,50)
plt.xlabel('テキストの長さ')
plt.ylabel('テキストの量')
plt.title('テキストの分布',color='gold')
plt.show()

f:id:humuhimi:20190719223304p:plain

テキストの長さとテキストの量の分布
前処理(labelを使う場合)

 

ここからデータを綺麗にするための必要となるデータクレンジングや前処理をしていきます。

まずは上記にあったデータを予測する(文章から肯定か否定か)ための特徴量(X)と出力結果(肯定か否定か)であるラベル(y)に分割します。

# X,yにデータを分ける
train_data = train_df.iloc[:,2:]
train_X = train_df.iloc[:,3].values
train_y = train_df.iloc[:,2].values
print(train_y.shape)

train_y.shapeの結果は(25000,)で25000個の出力結果があったことが伺えます。

 

次にone-hotエンコーディングをすることでカテゴリ変数(ここではレビュー内の単語)を機械がデータを理解しやすい形に整形します。

 

from sklearn.feature_extraction.text
import CountVectorizer
CountVector = CountVectorizer()
docs = train_X
bag = CountVector.fit_transform(docs)
print(CountVector.vocabulary_)

 

f:id:humuhimi:20190719230648p:plain

それぞれの単語とそれに対応するカラム名

それぞれの特徴量の形状を出力します。

# # ダミー化させた特徴量の抽出
train_X_features = bag.toarray()
print(train_X_features.shape)

 

結果:(25000,74849)

 

それぞれのボキャブラリー(単語)を出力する。

vocab = CountVector.get_feature_names()
print(vocab)

 

それぞれの単語の数を出力する。

# ボキャブラリーの数それぞれ
dist = np.sum(train_X_features,axis=0)
print(dist)

 

ボキャブラリーとそれぞれの単語の数の対になった出力結果を出します。

print("count:word")
for word,count in zip(vocab,dist):
print("{0}:{1}".format(count,word))

 

f:id:humuhimi:20190719232632p:plain

ボキャブラリと個数の対
機械学習モデル作成(labelを使う場合)

 

ここから機械学習していこうと思います。

2値分類のアルゴリズムとしてRandomForestClassifierを使います。

train_test_splitを使って、train用データを75%test用データを25%に分割します。

また評価指標のメトリクスとしてaccuracy_score,roc_auc_scoreを使います。

 

1.train_test_splitでX_train,X_test,y_train,y_testに分ける

2.clfに分類機を入れる

3.clf.fitでX_trainとy_trainで機械学習モデルを作成する

4.分類機でX_testを入れることでy_testの予測値であるy_predを生成する

5.accuracy_scoreでy_testとy_predの正当率を評価する

6.最後にaccuracyスコアとroc_aucスコアを予想する

 

from sklearn.ensemble
import RandomForestClassifier
 
from sklearn.model_selection
import train_test_split
 
from sklearn.metrics
import accuracy_score,roc_auc_score

X_train,X_test,y_train,y_test
= train_test_split(train_X_features,train_y)

clf = RandomForestClassifier(n_estimators=100)
 
clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
 
accuracy_score =
accuracy_score(y_test.astype('int')
,y_pred.astype('int'))
 
roc_auc_score =
roc_auc_score(y_test.astype('int')
,y_pred.astype('int'))
 
print("accuracy_スコア:{0}\nroc_aucスコア:{1}\n"
.format(accuracy_score,roc_auc_score))

 

予測結果は以下でした。

accuracy_スコア:0.84464
roc_aucスコア:0.8448087599614857

 

Keras API 深層学習モデル作成(label使う場合)

 

tensorflowとkerasのバージョンを確認する

 

# tensorflowとkerasのバージョン確認
from __future__ import absolute_import,
division,
print_function,
unicode_literals

import tensorflow as tf
from tensorflow.keras import layers

print(tf.VERSION)
print(tf.keras.__version__)

バージョン↓↓↓

1.14.0
2.2.4-tf

 

1.tensorflow.kerasで入力層(Input)を用意する

2.layers.Denseで中間層を作る(活性化関数はreluを使用する)

3.出力層には活性化関数にsoftmaxを使用する

 

from tensorflow.keras import Input
# 入力層の作成
inputs = tf.keras.Input(shape=(74849,))
# 中間層
x = layers.Dense(64,activation='relu')(inputs)
x = layers.Dense(64,activation='relu')(inputs)
# 出力
predictions =
layers.Dense(10,activation='softmax')(x)

 

ではディープラーニング用のモデルを作る

 

1.inputとoutputの変数をモデルに指定する

 

2.深層学習の方法をmodel.compileで指定する(optimizerに最適化するための関数を入れる:lossに損失関数を入れる:メトリクスに評価指数を入れる)

 

3.深層学習のモデルに学習させる(batch_sizeはデータを一括処理する単位を入れる。:epochsに損失関数を最小にするための学習回数を入れる)

 

# モデル作成
model = tf.keras.Model(inputs=inputs,
outputs=predictions)
# コンパイルして学習方法を指定
model.compile(
optimizer=tf.train.RMSPropOptimizer(0.001),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
 
# 5エポック分学習
model.fit(X_train,y_train,
batch_size=32,
epochs=5)
 
# train_y.shape,train_X_features.shape
 
Epoch 1/5
18750/18750 [==============================] - 29s 2ms/sample - loss: 0.0640 - acc: 0.9795
Epoch 2/5
18750/18750 [==============================] - 29s 2ms/sample - loss: 0.0513 - acc: 0.9837
Epoch 3/5
18750/18750 [==============================] - 27s 1ms/sample - loss: 0.0360 - acc: 0.9887
Epoch 4/5
18750/18750 [==============================] - 25s 1ms/sample - loss: 0.0263 - acc: 0.9922
Epoch 5/5
18750/18750 [==============================] - 22s 1ms/sample - loss: 0.0183 - acc: 0.9948

 

 

X_trainで学習したモデルでX_trainとy_trainを評価してみます。

そして結果は損失関数(loss)と評価結果(acc)を出力する。

今回の結果はおよそ0.99なので過学習だと思われますが今回はとりあえず、ディープラーニングをしていこうという程なので今は置いておきます。

 

train_score = model.evaluate(X_train,y_train)
print(train_score)
print(model.metrics_names)
 
18750/18750 [==============================]
- 18s 957us/sample - loss: 0.0116 - acc: 0.9967
[0.011612714384999126, 0.99674666]
['loss', 'acc']

 

また、損失関数でsparse_categorical_crossentropyを使ってるので、結果が指数など0,1で出ないので、numpyのround関数を使って0.5以上を1とし、0.5以下を0とする。

y_pred =
np.round(model.predict(X_test,batch_size=5))
 
y_pred[:10]
 
y_test[:10]
 
array(['0', '1', '1', '1', '1',
'1', '1', '1', '0', '1'], dtype=object)

 

ここでテストデータを使ってモデル評価をします。

test_score = model.evaluate(X_test,y_test)
 
print(test_score)
 
6250/6250 [==============================]
- 6s 891us/sample - loss: 0.1961 - acc: 0.9546
[0.19614510532215237, 0.95456]

 

出力結果は約0.95でした。

 

ほとんど予測できてますね。

 

こんな感じでホームレスが機械学習ディープラーニングをしていきました!

 

大学のテスト期間あけました!そんで、仕事も決まりました笑

f:id:humuhimi:20190210135732j:plain

長州島



お久しぶりです!

サイバー大学生三年生のhumuです!

 

2週間以上更新していなかったので、超久しぶりになるのですが今日からまたちょこちょこ更新していこうと思います。

 

とりあえず、今日は近況を報告しますと

 

東京にてAI専門のとあるベンチャー企業から内定をいただきました!わーい

また、給料も前の会社に比べて(まあ3ヶ月しか働いていないのですが笑),

月額5万円ほど上がるので心を新たに切り替えて立派なデータサイエンティストになれるように精進していこうと思います。

まあでも、面接で社長と1時間半ぐらい話して小学生の時から大学生の時まで聞かれて内心ドキドキしました笑

 

4月から仕事を始めるつもりなので、ギークハウス住民にはまたお世話になります。

宜しくお願いします。 

また、4月まではほぼ大阪の実家にいるので会える人はまた会いましょう!

 

来週からは気分次第で、ソフトウェア工学に関してやAI関連に関しての情報を発信していくつもりなので暇な方や興味ある方は見てみてくださいね!

また、来週には旧正月の休日があけるので深センにできるだけ情報を集めに行こうと思います。

 

今後とも宜しくお願いします

 

etc

ちなみに、今日はまた長洲島の兄貴にお世話になっています笑

f:id:humuhimi:20190210135945j:plain

長州島学生の皆さん

また、謎にこの島の高校生?の友達がいっぱいできたので、時間がある限り交流を深めていこうと思います。

また、日本語はやっぱり人気なので、機会があればみんなに日本語の学習とかさせれたらいいなあって思いました笑

f:id:humuhimi:20190210135748j:plain

長州島にいた可愛い猫



 

 

 

 

 

 

香港の離島でホームレスしてみた②

どうも ホームレスのhumuです。

 

昨日はちょっと体調不良のため、急遽ホームレスから尖沙咀駅の重慶大厦で格安ホステルに泊まりました。

 

そこから本来は香港の漁村が残るランタオ島の大澳に行こうとしたのですが、中環駅から行こうとしたところ行けないということになってしまい急遽すぐに出発する船に乗りました🚢。

 

 

(まあ、なんというかどこでもいいから離島に離れて心休まりたい気分だった。)

 

 

 

そこで11時45分発のチケットを11時44分に買って最後の乗客として長洲島行きに急いで乗り込みました!

f:id:humuhimi:20190117133646j:image

 

45分ぐらい船に揺られてたどり着いた島がこんな感じ。

f:id:humuhimi:20190117150549j:image

 

そこで、まずホームレスできる場所を探してみた。

ホームレスはまず昼のうちに寝床を探さないといけない

なぜなら、

  1. 知らない土地では、明るいうちにホームレスするのに適した場所を見つけないと夜になるとより見つけづらくなってしまうから。
  2. 野犬がでる地域があるので、野犬がいない場所 もしくは人が多いけどホームレスできる場所を探さないといけないから
  3. 昼の方が人が多いので、道を聞いたりするのに適している

 

っていうことで

まあ、ぶらぶらしてみた

 

そしたら、さすが香港 长洲島にも公共の図書館があった。

f:id:humuhimi:20190117150621j:image

しかし、閉まる時間が早い。

f:id:humuhimi:20190117150635j:image

 

そんなこんなで疲れたので、とりあえず休憩できるカフェを探してみた。

f:id:humuhimi:20190117150920j:image

そこで、コーヒーを啜ってマックをポチポチしてるとそこの店のオーナーが話しかけてきた。

(ちなみに、その時は店長と気付いてなかった笑 見た目が若々しくて好青年って感じだったからだ)

 

オーナー:やあ、君一人で来たのかい?

僕:そうです。日本から来ました。

オーナー:じゃあ、今日どこで寝るの?

僕:いや、ホームレスなのでそこら辺で寝ます

→事前にホームレスできるであろう場所をピックアップしていたので写真を見せた

こんな感じ↓

f:id:humuhimi:20190117151059j:image

オーナー(爆笑):ワロター よかったら、長洲を自転車で一緒に回ろうよ! ここら辺全体を紹介するよ!

→そして、その兄さんは実はこの長洲で地元を盛り上げる事業活動をしている方だった。

そんなことを知る由もなく、謎で愉快な1日が始まることになる。

 

とりあえず、自転車を借りて漕いで1分もしないうちについたよって言われてみたら、

まさかの海!? what's!

f:id:humuhimi:20190117151159j:image

とりあえず、船に乗ろうって言われてえっどういうことって思いながら写真の船に乗って船を乗り移って行いった。

 

初めてこんなプライベート船に乗った。

中はこんな感じらしくセレブチックな雰囲気に心踊る

f:id:humuhimi:20190117151435j:image

f:id:humuhimi:20190117165031j:image

合計3つの船に乗ることが出来た!

 

これらの船は長洲で開催するイベントで使うパーティー用の船らしい

それから陸地に向かいった。

 

そこで地元の色々な店を周りたどり着いたのが、new York timesに取り上げられた香港 长洲在住の日本人がオープンしている店だった↓

f:id:humuhimi:20190117172803j:image

いろんな有名人が来ている店で、日本情勢と世界情勢について語り合った。

 

f:id:humuhimi:20190117172810j:image

 

最後に記念撮影と記録を残してそこを後にした。

 

その後もなぜかいろいろな有名人などを紹介してもらい、20、30年前の香港・中国のサッカー元代表の1人が飯を奢ってくれた。

f:id:humuhimi:20190117173033j:image

 

そこでなぜか偶然好きな歌(中国語)が一緒で意気投合!

めっちゃ気に入られたので、今度またあって一緒に歌う約束ができた。

そんで、一緒にカラオケに行きました。

f:id:humuhimi:20190117224102j:image

なんかブログで書いてもあまり頭がまとまらないけど、とりあえずまあ色々ありました。

色々ありすぎて、流れだけ書くことになったけど

ホームレスとしてこの人たちに親切にされて感じたことは....

彼らは、無意識に善を施せたり全く知らない人に親切にしてくれた。

 

ここの人達に出会い感じたこと

 

なんというか。人間の温かみを感じた。

香港にいた時も、日本にいた時も温かみあったはずだが視野が狭くなりすぎていて全然気付かなかった。

 

それはIT関係やし、家族内でも孤立していたし、与えられる関係だけで完結していたからかもしれない。

また、会った人達にはそれぞれ具体的な使命みたいなものを感じた。

確かに、俺にも目標はあるけど

大きな視野から自分の使命とかを考えられなかった。

昔は会ったし、大学生前のホームレス期には会ったはずなんだが、

最近、自分にないものを比べては羨ましがったりしていたが、やっぱりそれは視野が狭くなっていただけなんだな。

闇が深くなったっていう友達もいたが、そうではなくより視野が狭まり その視野に固執するようになっただけだと思う。

これからは、無意識に視野が狭まらないように注意する。

そして、俺も彼らみたいに何かを周りに与えていける人間になる。

結局は、不器用な人間だから自分の時間ではやることやって、余った時間は他人に使うくらいでやっていこうと思う。

まあ、周りに使うっていっても大した能力もクソもないから、できるだけ周りを笑かしたり思い付いたできることをしてあげるだけでいいからちょっとづつ、できる事をして行こうと思う。

 

 

pythonでスマホアプリを軽く作ってみた

f:id:humuhimi:20190114213911p:plain

kivyウェブページ

 

どうも!ホームレスエンジニアのhumuです

 

今日は、pythonで用意されているGUIアプリを開発するためのマルチプラットフォーム用のオープンソースライブラリの「kivy」について紹介したいと思います。

 

 

kivy.org

 

 

iphoneやandoridのスマホアプリやmacOSやwindowsOS上で動く動作するマルチプラットフォームアプリについて紹介します。

 

特徴として、macOS、windowsOS,Linux上で同一のプログラムを動かすことができます。

 

また、raspbbery pi上でも動かすことができ、タッチ機能をサポートしているためタブレット利用も可能です。

 

オープンソースで提供され、商用利用も可能です。

 

コードを書く際はpythonコードとUIのコードをわけて書きます。

 

UIはkivy独自のkv言語を使用していきます。

 

まずkivyをインストールしましょう!

 

 

pythonのパッケージ管理コマンドのpipでインストールしてみよう↓

 

 

早速"hello world"してみましょう!

 

以下のコードを書き込んでみてください ↓

 

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
def build(self):
return Button(text='Hello World')

TestApp().run()

 

Appクラスはアプリを作る上で必須のクラスで継承した上で、必要なボタンなどを追加していき走らせます。

 

そうするとちゃんと、hello worldと出力されましたね!

 

デスクトップではこんな感じです↓

 

f:id:humuhimi:20190114221427p:plain

hello world with kivy

次は、kv言語を使っていきましょう!

pythonファイルを↓

from kivy.app import App
 
class TestApp(App):
pass
 
TestApp().run()

 

kvファイルを

BoxLayout:
orientation: 'vertical'
 
Button:
text: "Hello World"
Label:
text: "Hello World2"
TextInput:
text: "Hello World3"

 にしてください。 

 

そうすると、このようになります↓

 

f:id:humuhimi:20190114223458p:plain

kivy with .kvファイル

 

kvファイルはUIを担当しています

また、orientationでverticalを指定しているので、縦に並んだ形になります。

ちなみに、horizontalで横並びになります。

*orientation指定はウィジェットの並び方なので注意してください

*kivyではUIパーツのことをwidgetと呼びます。

 

 

最後に、ボールが跳ね回るアプリを作ってみた

 

main.py

#:kivy 1.0.9
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.clock import Clock
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.vector import Vector
from random import randint


class PongGame(Widget):
ball = ObjectProperty(None)

def serve_ball(self): #review
self.ball.center = self.center
self.ball.velocity = Vector(4, 0).rotate(randint(0, 360))

def update(self, dt):
# dt means delta-time
# call ball.move and other stuff
self.ball.move()

# bounce off top and bottom
if (self.ball.y < 0) or (self.ball.top > self.height):
self.ball.velocity_y *= -1 #review
 
# bounce off left and right
if (self.ball.x < 0) or (self.ball.right > self.width):
self.ball.velocity_x *= -1


class PongBall(Widget):
# Validation for a NumericProperty will check that your value is a numeric type
velocity_x = NumericProperty(50)
velocity_y = NumericProperty(50)
velocity = ReferenceListProperty(velocity_x, velocity_y)

def move(self):
self.pos = Vector(*self.velocity) + self.pos



class PongApp(App):
def build(self):
game = PongGame()
Clock.schedule_interval(game.update, 1.0/60.0)
return game



if __name__ == '__main__':
PongApp().run()

 

test.kv

 

<PongBall>:
size: 50, 50
Ellipse:
pos:self.pos
size:self.size

<PongGame>:
ball:pong_ball
Rectangle:
pos: self.center_x - 0,5
size:10, self.height
 
Label:
font_size: 70
center_x: root.width / 4
top: root.top - 50
text: "0"
 
Label:
font_size: 70
center_x: root.width * 3 / 4
top: root.top - 50
text: "0"

PongBall:
id: pong_ball
center: self.parent.center

 

 結果このようになりました!

f:id:humuhimi:20190114231255g:plain

kivyアプリPong game

 

ここから、作れるのでよかったらドキュメントをみてくださいね!

kivy.org

 

では、いい1日を!

ありがとうございました!

Webに対しての攻撃手法とその対策について

f:id:humuhimi:20190113193833j:plain

web攻撃


 

どうもおはようございます

 

サイバー大学生のhumuです

 

今日は真面目にwebサイト上でよくある

サイバー攻撃について書いていこうと思います。

 

ありきたりですけど、よかったら見て見てくださいね!

 

 

攻撃手法の種類について

 

webアプリの入力データチェックの不備をついた攻撃として以下がある。

 

 

 

 

XSSとその対策

 

webアプリケーションの入力データを悪用したデータ攻撃の一つ

 

webサイトのプログラムの脆弱性を利用した攻撃である

 

特に、掲示板や情報検索サイト、登録情報確認画面などに対する攻撃手法

 

 

ユーザが入力したデータを元に、webアプリケーションが動的にHTMLを作成する仕組みになっているページにおいて、入力データのチェックに不備のある場合成立する。

 

 

www.htmq.com

 

つまり、悪意あるサイトを仲介させて、二つのサイトに跨って最終的にクライアント環境に不正なスクリプトを実行させることから名ずけられた

 

 

XSSの実行手順

 

1.悪意あるサイトにクッキー情報を盗まれる場合

 

time-space.kddi.com

 

例:

1.ユーザが悪意のあるwebサイトを閲覧

2.悪意のあるリンクをクリック

3.ウェブページを出力

4.そのサイトが自動的に悪意あるスクリプトをユーザに転送

5.ユーザのブラウザが悪意あるスクリプトを(クッキーを転送する)を実行

6.悪意のない(しかし、XSS脆弱性のある)サイトにスクリプトを転送

6.そのターゲットサイトがwebページを出力し、クッキーを発行

7.それをクライアントに送信

8.クライアントがスクリプトを実行して、クッキーを悪意のあるサイトに転送

それにより、クッキーが漏洩する

 

 

クッキー漏洩により想定される被害

 

1,Cookiesに個人情報が入っている場合:IDやパスワードが流出 

 

サイトへの勝手な登録。スパムメールの送信。

 

 

2,CookiesにセッションIDが入っている時

 

セッションハイジャック→ショッピングサイトで勝手に買い物されてしまう。

 

 

f:id:humuhimi:20190113212803p:plain

悪意のあるサイバー攻撃

悪意あるスクリプトとは

 

  • クッキーを盗む
  • データ改ざん
  • クライアントのディスクをフォーマット
  • バックドア作成
  • フィッシング。ユーザのID・パスワードを盗む
  • 悪意あるサイトへの誘導
  • ワンクリックサイトへの誘導
  • etc

  

XSS脆弱性の有無を確認する方法

 

 

サイトの入力画面で実行可能なコードを入力する。

プログラムに入力データチェックの不備があるとそのコードが実行されてしまう。

 

例:住所入力欄に以下のコードを入力:

<script>alert('hello')</script>

 

もし、プログラムに不備があると上記のコードが解釈・実行され、アラートがポップアップする。

 

XSS対策

 

サニタイジング(無害化,sanitizing)

 

入力データを無害化する。

その手法の一つにエスケープ処理がある

 

エスケープ処理とは、入力データに含まれる、不正の原因となるような記号を特殊文字を適切な文字列に変換すること

 

例:

入力データに「&」や「<」などのメタキャラクターが存在した時以下のように変換する。

「&」→「&amp」。「<」→「&lt」など

 

OSコマンドインジェクション

 

 

OSコマンドインジェクションとその対策

 

 

OSコマンドインジェクションとは

 

ユーザの入力データを元に、OSコマンドを呼び出して処理するwebページにおいて成立する

 

 

 

不正なコマンドで以下のようなことを実行する攻撃手法

  1. 任意ファイルの読み出し、変更・削除
  2. パスワードの不正取得

 

OSコマンドの読み出しは、言語によって用意されている関数を用意て実行される。

 

 

perlでの関数の例:

Perlのopen関数などではユーザが指定したファイルの操作に使用されるケースが多い。

パラメータの指定により、外部コマンドOSコマンドの呼び出しが可能。

 

 

これを実行されると任意のコマンドが実行可能になってしまう可能性がある。

 

 

OSコマンドインジェクション対策

 

  • OSコマンドの呼び出し可能な関数を極力避ける
  • 入力データに使用可能な文字種類や書式等のルールを明確にする。文字種を極力制限する
  • 上記のルールにしたがって入力データをチェックする
  • ルールに使わないデータをエラーとして扱う。 エスケープ処理は行わない。

 

 

SQLインジェクションとその対策

 

不正にSQL文を注入する攻撃手法

 

 

ウェブアプリの開発者が想定していないSQL文を実行することで、データベースシステムを不正に操作する攻撃手法である。

 

 

アプリケーションが入力値を適切にエスケープしないままSQLを展開することで発生する

 

 

例1

複数のSQL文を入力することによるデータの破壊や改ざん

 

例2

ストアドプロシージャを実行することによる情報の漏洩や改ざん

 

例3(ブラインドSQLインジェクション)

SELECTの条件式にデータベース内の情報を確認するようにサブクエリを含ませ、その抽出の有る無しによってい本来参照することのできないデータベース内の情報(テーブル名など)を知る方法。

 

e-words.jp

 

 

SQLインジェクションの対策

 

エスケープ処理をする。

 

・意図したデータ以外(数値など)を入力しないようにする。

 正規表現などを使用して、意図したデータ以外のデータが送信されたらDELETEを 実行させないようにする。

 

・DELETEコマンドを含むクエリを実行できないようにする。

・意図しないタグを実行させないようにする。

 

SQLインジェクション対策2

 

・入力されたタグを取り除く仕組みを設定する。

・入力されたタグなどの特殊文字を別の文字列などに変換するPHPの関数「htmlspecialchars(文字列)」などを使用する。

 

まとめ

 

XSS(クロスサイトスクリプティング)とその対策

 

悪意のあるサイトを仲介。二つのサイトにまたがってクライアント環境に不正なスクリプトを実行。

対策:サニタイジング

 

OSコマンドインジェクションとその対策:

不正にOSコマンドを呼び出して実行。

対策:OSコマンド呼び出し可能な関数を極力しようしない。

 

SQLインジェクション

不正にSQL文を注入させる攻撃手法。

対策:エスケープ処理。

 

 

 

最後まで、読んでくださってありがございます。

 

みんなwebサイトを使用する際は注意して、

楽しく使って行きましょう!

 

また明日!

 

 

 

 

 

香港でオススメの電化街(深水埗駅)

f:id:humuhimi:20190112200451p:plain

かっこかわいいPC

 

今日もいい天気ですね from 香港 !

どうも、ホームレス学生のhumuです。

 

今日は、深水埗駅あるオタク電化街を紹介したいと思います!

 

 

 

 

↓  ↓  ↓  ↓ 

 

 

 

 

 深水埗駅(Sham Shui Po)

f:id:humuhimi:20190112201737j:plain
Sham Shui Po Station



深水埗駅はMTR赤色ラインの中心部に位置していて、全体的に緑色が特徴的!

 

全体的に、香港内では、物価が安い場所になります。

 

その分、治安などはあまり良くなく盗品市場があったり若干スラムっぽい地域です(靴が片方だけ売られているとかもありました...笑)

 

 

また、色々な種類の電気製品が売買されているので、

電化街としても有名です。

 

後に説明するコンピュータ系市場はC2出口から行くことができます。

 

 

f:id:humuhimi:20190112203536j:plain

深水埗地上

 

 

格安SIMカード

 

海外に行けば、SIMカードが必要ですよね?

 

香港に来た時には、まず深水埗に来ましょう!

 

ここでは、アジア中の格安SIMカードが売られています。

 

僕も、香港に来てすぐ買いました!

 

f:id:humuhimi:20190112204519p:plain

格安SIMすげえ



基本的に、定価より安いです。

他にも、日本、韓国、中国のSIMカードなどもあり、日本のSIMカードを買って帰れば、携帯会社の通信費用に比べてだいぶ安く済むと思います。 

 

コンピュータ系市場

 

 

 

今日僕が紹介するのは

高登電脳というコンピューターマーケット!

 

 

f:id:humuhimi:20190112210621j:plain

高登電脳

 

  

階段を上がっていくと、早速イヤホンやケーブルや小さな電化製品が大量に値段札とともにぎっしり並んで、積まれているのが見られると思います。

 

 

 

f:id:humuhimi:20190112205620j:plain

大量の小型電化製品



 

奥に入っていくと、自作コンピュータ用にハードウェア部品がショーケースなどにあり、香港のギーク達は自作コンピュータを作るためにここに集まります。

 

 

f:id:humuhimi:20190112205635j:plain

大量のハードウェア電子基板



  

風冷式ファンを売ってる子会社も多く、

自分好みのファンを見つけるにはもってこいです!

 

 

f:id:humuhimi:20190113024121p:plain

店頭に置かれる様々なファン

 

 

 

f:id:humuhimi:20190112232601j:plain

キーボードはこんな感じ



 

特徴として、日本では一つの店の中に全ての商品があるので、綺麗に商品が店に収まっていますが、香港では一つの場所にいろんな子会社が集まって商品を販売しているのでこんな風に見せ付けるように商品を配置する形になってしまいます笑。

 

f:id:humuhimi:20190112233543j:plain
shop

 

 

f:id:humuhimi:20190112205552j:plain
めちゃイカした店



f:id:humuhimi:20190112233400j:plain

 

 

 また、日本は上品な雰囲気で電化製品を販売しているのに対し、香港ではなんというか厨二臭い雰囲気の店が多く男のロマンを掻き立てます笑。

 

※結構通路が狭く、人が多いときは混み合うので、コンピューターマーケットに行く時はなるべく平日の昼とかに行くのが無難です!

 

香港の技術書店

 

f:id:humuhimi:20190112234409j:plain

香港のIT技術書屋


 

この機械市場の中にはなんと書店もあって、

コンピュータ関係の本しかない本屋があります。

 

 

また、香港では、普通の書店にプログラミング系の本は置いていないので、

わざわざここに買いに来るみたいです。

 

f:id:humuhimi:20190113033234p:plain

香港の技術書

 

孫子の兵法」のようなpythonの本もありました...

本屋の中央部にはビックデータ、データサイエンス、AI関連の本が置かれており、ほぼほぼトレンドは日本と同じようです。

 

f:id:humuhimi:20190113033311p:plain

日本の本と香港の本の比較(オライリー  データ分析)


 

後、香港では「pythonによるデータ分析入門」 がなぜか「python資料分析」になってました笑

 

色もちょっと違いました笑

 

 

日本と同様、オライリーの本はやっぱり充実してました!

世界から愛されるオライリー

 

f:id:humuhimi:20190112234351j:image

 

 まとめ

 

 

 

深水埗ではこの高登電脳以外にもたくさんのコンピュータ マーケットがあり、結構見つけにくい場所にあったりするので探索してみるのもいいと思います。

 

 

また、食事やホテルも安く、変わり種のアクセサリーや謎の物体が売られていたり、隠れ家レストランや隠れ家ゲストハウスなど色々未知なものが多いので、時間がある方は回ってみてください!

 

 

f:id:humuhimi:20190113000741p:plain

 

 

ちなみに、深水埗で買った充電器は新品で激安でした。普通に使えるので、香港に来た時に必要な電化製品ばあれば寄ってみてください!

 

定価 192香港ドル

深水埗 169香港ドル

 

ここまで読んでくださってありがとうございました!

 

下にはリンクで深水埗についての観光情報を乗っけているので、よかったら見て行ってください。

 

観光情報

 

www.hongkongnavi.comを引用

 

 

 

 

 

 

 

 

 

 

 

香港のプログラマーにエンジニア職について聞いてみた

f:id:humuhimi:20190112012828j:image

 

どうも香港にて、エンジニアを目指してるホームレスhumuです。

 

今日は香港人のエンジニアの方と晩飯に行ってきました!

 

今日会ったエンジニアの方は、コンピュータ・サイエンス系の学部を卒業して、web系会社で2年ほど働き、現在は転職活動中の人でした。

 

急速に日本人が減少し、9000人を切りつつある世界の貿易ハブである香港でのエンジニア市場についていろいろ聞きましたのでここでちょっとアウトプットしようと思います!

 

香港でのエンジニア需要

 

香港でもやはりエンジニアの重要は高いのですが、競争率が鬼高いです。

物流関係の仕事や接客、営業などの仕事は比較的簡単に見つけられます。

特に日本人なら日本料理店とかラーメン屋で結構いい待遇で雇ってもらえたりします。

ですが、エンジニア系の仕事は要求が高い割に給料は高くないという厳しいところがあると感じました。

とりあえず、香港でバイトからでも始めようとお思いググってみた。↓↓↓

f:id:humuhimi:20190112043628p:image

 

これが求められるレベルが低い応募案件(テスター)でした。

日本とは違って、コンピュータ関係の大学が絶対条件に感じます。

 

応募の約60パーセントはバイトでも2年以上の実務経験が求められます。

未経験でもOk!←絶対ありません。

さらに時給は560円〜840円です。

最低賃金が480円と全体的に低く、家賃は最低8万ほどするので、あまり割には合わないです。

 

求人では、web系やアプリ開発系の多く案件が多く見受けられました。

でも香港のプログラマー曰く、1番ゲームエンジニアが仕事を見つけやすいみたいです。

香港のゲーム好きな金持ちが自分のゲーム会社を持つとかが多いのもゲーム系が人気な理由の一つらしいです。

 

ゲームエンジニア系にも言えることなのですが、web系やアプリ系は中国(特に深セン)に委託することが多いらしく、物価の高い香港でオフィスを借りてまで作るのはあまり割に合わないのでエンジニアの方々は仕事を見つけずらいのだそうです。

 

AI系では、分析系の仕事は結構募集してました。

統計分析で株価を予想する仕事の仕事が多く、さすが金融のハブという感じですね。

 

1番残念なのがIoT系エンジニアでinternet of thing と言ってもthing を扱うのでどうしても倉庫な場所を多く取るため、土地のない香港から深セン任せなのだそうです。

 

ちなみに勉強会では、特にブロックチェーン機械学習ディープラーニング系が人気でした。

 

日本と同様転職したい人が多く、今日あったエンジニアもその1人笑

 

僕の周りの日本人は深センに行きたがる人が多いのですが、香港の人はそうでもないみたいです。

深センより日本で働きたいらしく、やはり経験は深センの方が得られるけど日本の方がお金をいっぱいもらえるからいいのだそうです笑。

 

本人は元はweb系だが、機械学習興味があるらしく次はAI系の分野で仕事をしたいらしい。

そこからなぜか興味が似ていることから、

来週一緒にpythonで何か作る + 一緒にDjangoでwebサイト適当に作って表示するようにして行く!

 

ということになったので、それも今度またブログで報告して行こうと思います!

 

あっ、ちなみに今日はハンバーガー食いました笑

f:id:humuhimi:20190112052906j:image

 

読んで下さってありがとうございました!

 

良い一日をお過ごしください!