2018年11月17日土曜日

SNS的なアプリをつくりたい。

メモ
・サーバー側はMBaaS(Mobile Backend as a Service)というのを利用するのがよさそう。
 parseというのがよさそう。
https://qiita.com/kazu0620/items/20ea8cd1c3a2e3bb5574
・parseについて
https://dev.classmethod.jp/cloud/parse-introduction-1/

2018年8月4日土曜日

DeepLearning メモ

・単層パーセプトロン
\[ y = \begin{cases} 0 & (w_1x_1+w_2x_2 \leqq \theta) \\ 1 & (w_1x_1+w_2x_2 > \theta) \end{cases} \]
x1とx2がin
yがout
\[ b = -\theta \] と置き換えると、最初の式が、こうなる。 \[ y = \begin{cases} 0 & (b + w_1x_1+w_2x_2 \leqq 0) \\ 1 & (b + w_1x_1+w_2x_2 > 0) \end{cases} \] さらに \[ x = b + w_1x_1+w_2x_2 \\ y = h(x) \] と置くと、 \[ h(x) = \begin{cases} 0 & (x \leqq 0) \\ 1 & (x > 0) \end{cases} \]
分類問題と回帰問題
分類問題 → 何かを分類する 犬か猫か → 恒等関数
回帰問題 → 予測する → ソフトマトリックス関数
MNINST
・28*28ピクセルの画像がいっぱい入っているデータのセット。

・訓練用の画像が6000枚, テスト用の画像が10000枚入っている。
・以下の関数で画像を読み出すことができる
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
・x_trainとt_trainは訓練用の画像(の配列)と、正解を表す数字(の配列)が入っていて、
・x_testとt_testはテスト用の画像(の配列)と、正解を表す数字(の配列)が入っている。
・例えばt_trainの0番目の要素(t_train[0])は、5が入っている。
・また、x_trainの0番目の要素(x_train[0])は、次のような数値がはいっている。
28*28=784この要素を持つ配列になっており、各要素には256階調の数値が入っている。

4.1.1データ駆動のあたりで出てくる用語の整理
・SIFT : Scale-Invariant Feature Transform → よくわからないけど、特徴点を出す手法の一つみたい。
参考URL http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html

・SURF : Speeded-Up Robust Features → SIFTの高速化バージョン
参考URL http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_feature2d/py_surf_intro/py_surf_intro.html

・HOG : Histograms of Oriented Gradients → よくわからないけど、特徴点を出す手法の一つみたい。
参考URL https://qiita.com/mikaji/items/3e3f85e93d894b4645f7

・SVM : サポートベクターマシン → 分類するときに使われる手法
参考URL http://www.sist.ac.jp/~kanakubo/research/neuro/supportvectormachine.html

・KNN : k近傍法  → 分類するときに使われる手法(多数決できめる)
参考URL https://qiita.com/yshi12/items/26771139672d40a0be32

2018年7月29日日曜日

Python 勉強したこと(自分用のメモ)

・配列のスライシング aaa[1:5]とか、aaa[1:]とか、aaa[:3]とか配列のサブセットを取り出すことができる。
・クラスがある。
・クラスのメソッドの第一引数にselfを入れる。
・numpyという配列をパワーアップしたライブラリがある。(配列の要素ごとの四則演算ができる。)
・numpy = ナンパイと読むらしい。
・行列にスカラをかけることをブロードキャストと呼ぶ。
・numpyの行列の掛け算は、数学の行列の掛け算と違う?
・1行n列の行列や、n行1列の行列は、どっちも[1, 2, 3...]でよさそうだが、ちゃんと[]を多くつけたほうがわかりやすい
1x2行列 [[1, 2]]
2X1行列 [[1], [2]]
最大
・整数型は最大がない。
 2の64乗とかしても大丈夫。C#だとulongの上限を超える。
 
・浮動小数点型は最大がある。
 

2018年5月2日水曜日

C# Parallel 入門

Parallelって何?
プログラムを並列化するための仕組みとなります。
既存のプログラムの 「for文」を「Parallel.for」に置き換えるような形で導入できるので、
比較的簡単に導入が可能です。

排他制御は必要か?
結論としては必要です。

Microsoftの「データの並列化 (タスク並列ライブラリ)」には、「基本のループでは、ロックを取得する必要はありません。」とあり、不要なのかな?とも思ったのですが、
詳細な資料「Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4」 では排他制御が行われているので、やっぱり必要という結論となりました。

どうやって実装するか?
「Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4」P68~P70がとても参考になります。

そちらには、π(パイ)の計算を参考にして、シングルで計算する方法 → 並列化した方法( よくない方法 ) → 並列化した方法( よい方法 )の順番でサンプルが記載されてます。

その順番でコードを書いてみたのがこちらになります。
π(パイ)を求める計算式は今回の本題ではないので、計算を行って最後に結果を足し合わせているところに着目してください。
足し合わせている部分は排他が必要な部分となります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestParallel
{
    class Program
    {
        //-------------------------------
        //ここはテストコードを呼び出しているだけなので重要でないです。
        //-------------------------------
        static void Main(string[] args)
        {

            // 時間測定用
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            // 本体
            double pi = SerialPi();
            Console.WriteLine("--- シリアル ---");
            Console.WriteLine("答え:" + pi.ToString("R"));

            //時間測定用
            sw.Stop();
            Console.WriteLine("時間:"+ sw.Elapsed);
            sw.Restart();

            // 本体
            double npi = NaiveParallelPi();
            Console.WriteLine("--- パラレル( よくない ) ---");
            Console.WriteLine("答え:" + npi.ToString("R"));


            //時間測定用
            sw.Stop();
            Console.WriteLine("時間:" + sw.Elapsed);
            sw.Restart();

            // 本体
            double ppi = ParallelPi();
            Console.WriteLine("--- パラレル( よい )---");
            Console.WriteLine("答え:" + ppi.ToString("R"));


            //時間測定用
            sw.Stop();
            Console.WriteLine("時間:" + sw.Elapsed);

            // getchar
            Console.ReadKey();
        }

        const long NUM_STEPS = 500000000;

        //-------------------------------
        //シリアルで計算  (単純なfor文)
        //-------------------------------
        static double SerialPi()
        {
            double sum = 0.0;
            double step = 1.0 / (double)NUM_STEPS;
            for (long i = 0; i < NUM_STEPS; i++)
            {
                double x = (i + 0.5) * step;
                double partial = 4.0 / (1.0 + x * x);
                sum += partial;
            }
            return step * sum;
        }

        //-------------------------------
        //パラレルで計算  (よくない)
        //-------------------------------
        static double NaiveParallelPi()
        {
            double sum = 0.0;
            double step = 1.0 / (double)NUM_STEPS;
            object obj = new object();
            Parallel.For(0, NUM_STEPS, i =>
            {
                double x = (i + 0.5) * step;
                double partial = 4.0 / (1.0 + x * x);
                lock (obj) sum += partial;
            });
            return step * sum;
        }
        //-------------------------------
        //パラレルで計算  (よい)
        //-------------------------------
        static double ParallelPi()
        {
            double sum = 0.0;
            double step = 1.0 / (double)NUM_STEPS;
            object obj = new object();
            Parallel.For(0, 
                NUM_STEPS,
                () => 0.0,
                (i, state, partial) =>
                {
                    double x = (i + 0.5) * step;
                    return partial + 4.0 / (1.0 + x * x);
                },
                partial => { lock (obj) sum += partial; });
            return step * sum;
        }

    }
}

実行結果はこちらになります。
πの計算結果と、それぞれの実行時間を出力してます。

「パラレル(よくない)」は、単純にfor文をParallel.for文に置き換えて、排他制御が必要な部分にlockをかけた場合なのですが、 シリアルで計算したときよりも遅くなっていることがわかります。

排他制御が必要な計算を並列化する場合は、「パラレルで計算(よい)」の方法で実装する必要があることが分かりました。

ただ、ラムダ式が苦手な自分としては、一見なにがなんだかよくわかりませんでした。(今もよくわかってません...)
ですが、Parallel.For文のオーバーロードされたメソッドの一つであることはわかりました。
https://msdn.microsoft.com/ja-jp/library/dd782936(v=vs.110).aspx
なんとなく理解したことは、for分の毎回実施する操作を「body」に記載し、足し合わせるとかの排他する部分を「localFinally」に記載すればよいということなのかな?
p.s.
MSの資料には、さらによい方法が紹介されてます。
「ParallelPartitionerPi()」という関数ですが、
こちらはまだ理解できていないので、端折りました。

2018年1月18日木曜日

cpu 脆弱性 メモ

脆弱性の名前
Spectre
Meltdown
見つかった時期
2018/1/3
※発表された時期で、見つけたのは2017年。
見つけた人
Google の “Project ZERO”
原因となるCPUの機能
(1)投棄実行・・・メモリからレジスタに読み込むまでにCPUの待ち時間ができるので、その間に先を見越して計算させる機能
(2)アウトオブオーダー・・・CPUの待ち時間中に、整合性が合う範囲で順番を変えて命令を実行する機能
詳細は参考サイト参照してください。
脆弱性の仕組み
難しい... 下記サイトを参照してください。
対策したセキュリティパッチ(Windows)
Windows 10 バージョン 1709(KB4056892)
Windows 10 バージョン 1703(KB4056891)
Windows 10 バージョン 1607, Windows Server 2016(KB4056890)
Windows 8.1, Windows Server 2012 R2(KB4056898)
Windows 7、Windows Server 2008 R2(KB4056897)
対策したセキュリティパッチ(mac)
10.13.2
Meltdown(素の10.13.2で対応)
Spectre(macOS High Sierra 10.13.2 追加アップデートで対応)
パッチ適用後の性能について
intel
https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Blog-Benchmark-Table.pdf
MS
https://cloudblogs.microsoft.com/microsoftsecure/2018/01/09/understanding-the-performance-impact-of-spectre-and-meltdown-mitigations-on-windows-systems/
Apple
https://support.apple.com/ja-jp/HT208394

CPUの脆弱性対策パッチでSSDのランダムアクセスが大幅減速?影響をチェックしてみた
https://akiba-pc.watch.impress.co.jp/docs/sp/1101498.html
共通脆弱性識別子CVE
Meltdown : CVE-2017-5754
Spectre : CVE-2017-5753、 CVE-2017-5715
参考にしたサイト
CPUの脆弱性[Spectre], [Meltdown] は具体的にどのような仕組みで攻撃する?影響範囲は?
http://milestone-of-se.nesuke.com/nw-advanced/nw-security/meltdown-spectre/
Google Project Zero のページ
https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html
“投機的実行”機能を備えるCPUに脆弱性、Windows向けのセキュリティパッチが緊急公開
https://forest.watch.impress.co.jp/docs/news/1099690.html
Apple セキュリティアップデート
https://support.apple.com/ja-jp/HT201222