日本脱出系ホームレスのマルチリンガルな日々

フルリモート引きこもりが外国語からプログラミング言語を使った海外生活を垂れ流す

ブログ再開宣言ですうううっ

 

どうもふむひみですっ⭐

 

会社辞めてから約3ヶ月が経ったけど、その間全くブログを書いてなかった汗💦

twiiterにリンク貼ってたのにね。。。

 

でも心入れ替えました

というか考えを変えましたっ😀 

 

もう2020年になるし、ブログオワコンだろって言われるかもしれません!

それでも今日から出来るだけ毎日書いて行こうと思いますっ

読者になってくれる方居ればよろしくお願いします🙇‍♂️

 

僕のことを知らない人も多いので、こっちで軽く自己紹介してますっ

よければ御確認ください🌞

 

humuhimi.hatenablog.com

 

 

明日には運営している

サイバー大学グローバル交流部に関して書こうと思います

 

よかったら見てくださいね!

 

またこれから他の人に共有したいと思う記事が有ったら、

シェアをよろしくお願いします🙇‍♂️

 

 

 

 

 

 

 

 

 

 

 

双極性障害により会社をクビになったが、日本脱出しようと思う件

f:id:humuhimi:20190914202337j:plain

日本脱出

 

自己紹介

 

 中学時代から野外放浪(ホームレス)と引きこもりを

繰り返す双極性障害

↓ 

関西の大学に入学し大学2年生の時に休学、

香港と中国で英語・中国語を使って3ヶ月の営業インターン

双極性障害が悪化し大学を中退(サイバー大学に転入)

ニートで1年間PHPで独学で国際交流サイトや掲示板を作成

上京を決断して東京に進出しWeb系に就職したもの

双極性障害で退社 

↓ 

             今ココ(絶望) *9月時点

最近の出来事 (9月時点)

 

 

今年はデータサイエンティストを目指しながら、会社でWEB開発とスクレイピングの案件をさせてもらっていました。

でも、僕自身が双極による体調不良により、休みが増えた結果会社に居ずらくなってしまい自主退社。。。乙

 

 

(一応、デパケンというの薬を飲んでましたし、結構長期で治療をしてもう大丈夫だと思って自信を持って就職したのですがやはり無理でした。)

  

前の会社の人にはわざわざ特待生で雇ってもらったのに、こういう形で退職することになり本当に申し訳ないことをしたなと思ってます。

 

それと同時に双極性障害がある自分は

普通に働くことはできないと悟ってしまいました。

 

 

自分では結構普通に合わせようと努力したつもりでしたが、薬を飲んでも自分の人格が別のものになってしまった感覚や意識しても帰ることの出来ないミスや不注意などがあったからです。

 

 

 

僕はもう日本を脱出して

海外で自分らしく生きて行こうって決めました

 

 

これからの人生 (9月時点)

自分らしく生きるって何するねんって話ですけど、とりあえず自分ができることをするのみです

 

情報発信、ARアプリ開発、web開発、AI開発、通訳、客引き、翻訳、グラフィティアートなんでもいいです

 

自分が1ミリでもできること全てに手を出して

「自分のアイデアを形にしていくこと」に努めます

 

 

 

双極性障害ADHDニートの三拍子が揃った僕ですがなんとかこの世の中で下克上してみせますよ!

 

 

ブログで収益化とかそこまで期待してないです

  

 

 

自分という人間がこの世の中でコンテンツになってそれをみんなが楽しんでくれたらいいです。

そして多くの人と繋がり、 人生楽しく生きていけたらいいです。

 

滞在予定

10月にベトナム

11月に広州経由で深圳メーカーフェアに参加予定

11月に新幹線で香港 

12月に深圳

 

偶然同じ国にいるなら

無料で英語・中国語のレンタル通訳マンをします(笑)

 

よければ連絡ください笑

 

*本来12月は台湾にいく予定だったのですが、深センには欲しいものが全てあったので台湾旅行をキャンセルして深セン生活を送ることにします!!

 

 発信情報一覧

 

今後、発信していくであろう情報一覧です。

  • 日本脱出して生活していく情報
  • ホームレス・ニートとして生きていく方法
  • 元ホームレスとしてホームレス社会をもっと良くしたい
  • 双極性障害ADHDに関して
  • プログラミング系
  • 英語・中国語や海外に関する情報
  • 海外のストリートアートやグラフィティアート
  • 俺的風刺画アレンジ

 

 

 

 

そういえば、今日はクリスマス・イブですね🎅

みなさんいい1日をお送りください🦌✨✨✨✨

 


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

twitterでも僕の日常を投稿しますので、気になる人はtwitterフォローよろしく

 

 

 

 

 

 

 

 

 

 

 

 

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

 

どうもお久しぶり! ホームレスの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サイトを使用する際は注意して、

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

 

また明日!