mk-toolブログ

エンジニアと家のことをごちゃごちゃと書いてます

【Laravel】cssファイルやjsファイルを読み込む

jsファイルとcssファイルはプロジェクトに自動的に作成される「public」フォルダ配下に入れる。

publicフォルダ配下に自由にjsファイルやcssファイルを入れることになるが、
管理のしやすさのためにpublicフォルダの中に「js」フォルダと「css」フォルダを作成するのがベスト。

そしてpublicフォルダに格納したファイルの呼び出し方法は以下。
(public配下にjsディレクトリとcssディレクトリを作っています)

<!-- cssの呼び出し -->
<link href="css/test.css" rel="stylesheet" type="text/css">
<!-- jsファイルの呼び出し -->
<script type="text/javascript" src="js/test.js"></script>

Larvalではjsファイルやcssファイルの読み込む場所のデフォルトディレクトリが「public」になっている。
そのため、publicより下位のファイルパスを指定することで読み込むことができる。

【php】EOMを使用してエラー

php(Laravel)でヒアドキュメントを使用してHTMLを出力しようとした。

$htmlString = <<< EOM

// ここにいろいろhtmlを書く

EOM;

しかし、以下のようなエラーが発生した。

syntax error, unexpected end of file

エディタで

EOM;

にインデントが付いていることが原因だった。
なんだか気持ち悪いけど、「EOM;」だけはインデントなしで。。。

【セスペ】午前午後解答自分確認用

自分確認用で書いていますが、誰かの参考になれば。。。

 

午後

午後問題解答状況。コメントをいただければ解説を自分なりに書きます。

(全部書くのはめんどくさくなりました!)

◯:解説書きました、△:解くことは解きました、×:これから解きます

時期午後Ⅰ午後Ⅱ
問1問2問3問4問1問2
平成28春 × なし ×
平成25春 × × ×
平成24春 × ×

 

午前&午後の不安な単語(皆さんも確認してみてください)

単語説明
DNSSECDNSキャッシュポイズニングを防止するための技術。レコードに対してディジタル署名を付与する。

 

【機械学習】gensimのチュートリアルをやってみた(その2)

さて、その1の続きを書きます。

ディクショナリーへの登録を行います。
Pythonで辞書をforで作成する際「キーがー存在する場合はバリューを更新」「存在しない場合はキー:バリューを追加」したい場合は標準ライブラリのdefaultdictを使うのが良いそうです。
まずは初期化のおまじないです。

from collections import defaultdict
frequency = defaultdict(int)

現在の変数textsの中身は以下のようになっています。

[['human', 'machine', 'interface', 'lab', 'abc', 'computer', 'applications'],
 ['survey', 'user', 'opinion', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'management', 'system'],
 ['system', 'human', 'system', 'engineering', 'testing', 'eps'],
 ['relation', 'user', 'perceived', 'response', 'time', 'error', 'measurement'],
 ['generation', 'random', 'binary', 'unordered', 'trees'],
 ['intersection', 'graph', 'paths', 'trees'],
 ['graph', 'minors', 'iv', 'widths', 'trees', 'well', 'quasi', 'ordering'],
 ['graph', 'minors', 'survey']]

この中のそれぞれの文字の出現回数をカウントします。二次元配列なのでfor文を入れ子にします。

for text in texts:
     for token in text:
         frequency[token] += 1

この段階での配列frequencyの中身は以下のようになっています。
文字と出現回数が結びついていますね。

defaultdict(<class 'int'>, {'abc': 1, 'error': 1, 'iv': 1, 'widths': 1, 'testing': 1, 'survey': 2, 'eps': 2, 'opinion': 1, 'intersection': 1, 'time': 2, 'minors': 2, 'machine': 1, 'well': 1, 'interface': 2, 'measurement': 1, 'ordering': 1, 'management': 1, 'graph': 3, 'human': 2, 'user': 3, 'computer': 2, 'applications': 1, 'relation': 1, 'binary': 1, 'generation': 1, 'lab': 1, 'quasi': 1, 'trees': 3, 'unordered': 1, 'response': 2, 'paths': 1, 'engineering': 1, 'random': 1, 'system': 4, 'perceived': 1})

この中で出現回数が1回だけのものは除く処理を行います。

texts = [[token for token in text if frequency[token] > 1] for text in texts]

これで変数textsの中身が以下のようになりました。

[['human', 'interface', 'computer'],
 ['survey', 'user', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'system'],
 ['system', 'human', 'system', 'eps'],
 ['user', 'response', 'time'],
 ['trees'],
 ['graph', 'trees'],
 ['graph', 'minors', 'trees'],
 ['graph', 'minors', 'survey']]

そして、gensimの特徴語ディクショナリーを作成します。

dictionary = corpora.Dictionary(texts)
dictionary.save('/tmp/deerwester.dict')  # ディクショナリーを保存します
print(dictionary.token2id)

出力される値が以下のように配列textsのキーに対してidが割り振られています。

{'human': 1, 'user': 5, 'computer': 2, 'survey': 4, 'eps': 8, 'time': 7, 'system': 6, 'response': 3, 'interface': 0, 'minors': 11, 'trees': 9, 'graph': 10}

これらの配列をgensimのBug of Wordsで各文の特徴語をカウントして特徴ベクトルを作ります。
先ほど作成した特徴語ディクショナリーにdoc2bowメソッドにより、文の単語に一致するidと出現頻度をタプルで返してくれます。
これにより、類似したcorpusを検索することで、それっぽい言葉を取り出せるものと思う。

corpus = [dictionary.doc2bow(text) for text in texts]
corpora.MmCorpus.serialize('/tmp/deerwester.mm', corpus) #後で使えるように保存(corpusは膨大になってしまうため)
print(corpus)

出力結果は以下のようになります。

[[(0, 1), (1, 1), (2, 1)], [(2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)], [(0, 1), (5, 1), (6, 1), (8, 1)], [(1, 1), (6, 2), (8, 1)], [(3, 1), (5, 1), (7, 1)], [(9, 1)], [(9, 1), (10, 1)], [(9, 1), (10, 1), (11, 1)], [(4, 1), (10, 1), (11, 1)]]

よし、これで基本的な動かし方は分かったぞ。。。

【機械学習】gensimのチュートリアルをやってみた(その1)

gensimのチュートリアルをやってみました。
pythonがあまりわからないので、わからない関数があったらそこも触れながら。

チュートリアルは以下です。
radimrehurek.com

このうちの「Corpora and Vector Spaces」をやってみます。

まず、9つの文を配列として用意しています。

from gensim import corpora
documents = ["Human machine interface for lab abc computer applications",
              "A survey of user opinion of computer system response time",
              "The EPS user interface management system",
              "System and human system engineering testing of EPS",
              "Relation of user perceived response time to error measurement",
              "The generation of random binary unordered trees",
              "The intersection graph of paths in trees",
              "Graph minors IV Widths of trees and well quasi ordering",
              "Graph minors A survey"]

次に、先ほど用意した文の中で頻繁に出てくる冠詞や前置詞(あってる?)等を除くために
除く用のリストを作成します。

stoplist = set('for a of the and to in'.split())

pythonのset関数がよくわからないので調べました。

#実行コマンド
spam1 = set('monty python')
spam2 = set('monty python'.split())
spam3 = set(['monty','python',])

spam1
spam2
spam3
#実行結果
{' ', 'h', 'm', 'n', 'o', 'p', 't', 'y'} #setはランダムでしかも文字列の重複がないように格納されるのですね
{'monty', 'python'} #split()で半角空白で文字列を区切り配列としてセット
{'monty', 'python'} #これでも良さそうです

用意した文を配列として格納します(stoplistに登録した文字は除きます)。

texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents]

この書き方は、、、わからん!調べました。
これは「リスト内包表記」というらしいのですが、forの書き方を省略できるみたいです。
例えば、

data = [1, 2, 3, 4, 5]
newData = []
for d in data:
  newData.append(d * 2) #配列dataの中身を2倍にする

という書き方は、

data = [1, 2, 3, 4, 5]
newData = [d * 2 for d in data]

という書き方に置き換えられます。配列へのappendがかなりすっきりかけますね!

さらに、

data = [1, 2, 3, 4, 5]
newData = []
for d in data:
    if d % 2 == 0:
        newData.append(d * 2)

という書き方は

data = [1, 2, 3, 4, 5]
newData = [d * 2 for d in data if d % 2 == 0]

という書き方に置き換えられます。すごい!

お世話になったサイト
www.yoheim.net
openbook4.me


長くなるのでここで一度きります。続きは以下です。
【機械学習】gensimのチュートリアルをやってみた(その2) - gamushiroS’s diary

【セスペ】平成28年度春期午後1問2解説

難易度:易

 

概要

ネットワークセキュリティに関する問題。

わからない単語が多い場合は避けるのが吉。単語がわかる場合はすぐに解答が出る問題。

 

設問1

「迷惑メールの送信に悪用される」と来た時点で早押し問題で「第三者中継」と答えたくなりますが、一応解説をします。エンベロープの宛先メールアドレスのドメイン名がU社のドメイン以外のものを拒否、とあります。外部からの通常のメールは必ずU社ドメインに対して送信されます。仮にU社ドメインでない場合は、外部メールサーバはメールを中継し、宛先メールアドレスに対してメールを中継します。

答えは「a. オープンリレー(第三者中継)」

 

SPFの設定値に関しては、図2に例がある。ドメイン名とIPアドレスが書かれているが、IPアドレスをもとに名前解決を行い、SPFに設定したドメイン名と一致するかを確認する。そのため、メールの送信元のIPからドメイン名を割り出し、送信元のドメイン名と一致するかを確認することができる。

そのため、答えは「b. 送信(元)ドメイン

 

設問2

オープンリゾルバに関して以下のような記事を見つけました。

DoS攻撃を行おうとする攻撃者は、 DNSパケットの送信元IPアドレスを攻撃対象のIPアドレスに偽装し、 DNSパケットをオープンリゾルバとなっているDNSサーバなどへ送ります。 そのDNSパケットを受け取ったオープンリゾルバは、 名前解決を行い回答を送信しようとしますが、 実際にDNSパケットを送信した攻撃者ではなく、 DNSパケットに設定されている偽装されたIPアドレス宛、 すなわち攻撃対象宛に送信してしまいます。 

攻撃者は送信元IPアドレスを攻撃対象に偽装し、大量の名前解決を行うことでDoS攻撃を行います。この際、DNSの名前解決の返答によりDoS攻撃を成立させるため、攻撃をDNSリフレクションと呼びます。

答えは「DNSリフレクション」です。

インターネット用語1分解説~オープンリゾルバとは~ - JPNIC

 

設問3

(1)

DNSキャッシュポイズニングでは、キャッシュDNSサーバが権威DNSサーバへの問い合わせを行い、権威DNSサーバから名前解決の結果を受け取る前に偽パケットの注入を行います。この際、キャッシュサーバのポートはランダムにすることでキャッシュサーバへのキャッシュを防止することができます。

(ちなみに権威サーバでは53番ポートを使用)

そのため、答えは「送信元ポート番号」

 

(2)

図4で取引先のMXレコードを書き換えたため、取引先へのメールが攻撃者に届いてしまうようになります。

そのため、答えは「外部メールサーバ」と「取引先宛てのメールを,攻撃者が用意したメールサーバに転送して しまう」です。

 

(3)

これは、、、サービス問題。

12ページに「フィルタリングしようと設定してみたが、パス名を含めたURL全体を設定できず、ホスト単位のフィルタリングだけが設定できる仕様」と書いていますね。CONNECTメソッドをよく知らなくても解けます。

答えは「パス名を送信しないという仕様」です。

 

設問4

インターネットから複合機用メールアドレスからメールが来るわけはありません。これはブラックリストで防ぐ必要があります。送信元なので、ブラックリスト1かブラックリスト3が該当します。メールヘッダの送信元アドレスかエンベロープの送信元アドレスかで分かれていますが、通常のメールの送信元はメールヘッダの送信元の事を指します。エンベロープ内のメールアドレスはメールの中継元を指すので異なります。そのため、ブラックリスト3で防ぎます。

 

答えは「ブラックリスト3」と「scanner@u-sha.co.jpを登録する」です。