男女平等主義が反社会的な理由 メモ

f:id:surume_Reflection:20171219214317j:plain

少子化や格差や差別の全貌

中流層女性が男社会(高収入,子持ち)を維持
長時間労働化、独身男女から搾取する子持ちや福祉
・底辺男性の増加により少子化から経済悪化
これが全て下方婚しない女性が中層化したのが原因という自論

突然男女の給与が同じになると、低収入男性と高収入女性が余るようになる。
おっちょうどいいじゃないか!と思うだろうが女性は下方婚をしない
実は収入の問題では無い、女性は頼りになる男を欲していて
男と違いおっぱいが大きいとか家庭的だからとして養わない

wotopi.jp

女性による男社会の維持

男社会はでは子供が生みにくく男女とも薄給だと言われ
女性はセクハラやパワハラの対象だと言われるが
社会の上位男は基本的に子持ち,モテ男,既婚者,高収入のどれかである

女性はそういった男性を支持し子供を持ちたがるし
金は力や権力の象徴で子供も産めない低収入と関わらない
上位男性はセクハラをしないのは誤りだ電通のセクハラ同様普通にする

こうして男性間に格差が出来て来る
それによって少子化が加速し教育格差や無敵の人による犯罪が増加する
ルワンダ出生率は6だしシンガポールでは経済的に豊かなのに少子化傾向

実は男社会は女性だけで壊すしか無い
先ほど言った通り男社会を占めるのは上位男性である事子持ち既婚者であり
女性に恵まれない男性も男社会壊すのに協力するはずが無い

女性専用車

女性専用車両に対する批判に関しては完全に女も悪い
広告料割高で完全に痴漢と冤罪を防げないと言う無意味さ
満員の際に男性がそちらには乗れないと言う実害もある

ただの女性優遇であり男性の協力で成り立っている
男女とも男女別車両化を進める事はあっても
女性専用車を無くしたり男性専用車を批判するのは悪意がある




後はこちらで展開 twitter.com

iOSでのVPN接続をちょっと調べてみる

http://www.infraexpert.com/study/dot1xz01.html

EAP方式のEAP-TLSなどでは相互に証明書が提出され信頼チェーンを確立する
※EAPの信頼のある証明書が必要

VPN関連の用語解説

  • IEEE802.1X(EAP-TLS) :有線LANや無線LANにおけるユーザ認証の規格
    • サプリカント :IEEE802.1Xにおけるクライアント(PCには標準搭載)
      • 無線ではEAPOLパケットで送信
    • 認証装置 :サプリカントと認証サーバの仲介役となるネットワーク機器
      • 結果に応じてアクセス制御をする
      • EEE802.1X対応のLANスイッチまたは無線LANアクセスポイント
      • 無線/有線でRadiusパケットを送信
    • 認証サーバ :ユーザ認証を行うサーバ
  • Radiusによる認証 :
    • 構成

資料系

iOSでFirebaseのGoogle認証登録を実装

f:id:surume_Reflection:20170520175010p:plain

記事

※注意※
17/05/20にFirebase4.0.0がリリースされていますが
過去バージョン指定をしないと動作しません



記事を書いている人間は、現段階でiOSアプリ開発の経験は2週間ほどで
基本Firebaseのガイド通りに実装しているだけなので 参考にはならないです
環境や注意点は書いてますが、メモレベルの記述なのであしからず..

環境:

開発環境-バージョン

xcode 8.3.2
cocoapod 1.2.1
Apple Swift 3.1
動作確認 (iOS 10.3)

SDK-バージョン

Firebase 3.17.0
GoogleSignIn 4.0.2

下準備:

xcodeのインストール (省略)
Firebaseにアカウント登録 (省略)
プロジェクトの作成
  1. iOSSingleViewApplicationを選択
    f:id:surume_Reflection:20170520160404p:plain

  2. アプリ名を入力後NEXTを押すと自動で生成されます。
    f:id:surume_Reflection:20170520160821p:plain

  3. Firebase側のAuthenticationのログイン方法から有効化
    f:id:surume_Reflection:20170520205539p:plain


1. ライブラリと初期設定:

cocoapodのインストー

$ gem install cocoapods
$ pod init # 管理ファイルを生成
$ vi Podfile # SDKの追記

※Podfileへの追記内容 f:id:surume_Reflection:20170520161028p:plain

  pod 'Firebase', '3.17.0'
  pod 'Firebase/Core'
  pod 'Firebase/Auth'
  pod 'GoogleSignIn', '4.0.2'

Firebaseにアプリを追加

  1. FirebaseのダッシュボードHOMEから概要のiOSを選択
  2. iOSバンドルIDに上記のBandleIdentfierの欄の内容をコピーペースト
    f:id:surume_Reflection:20170520162334p:plain ※BandleIdentfierはツリーの青いアプリ名ファイル選択してGeneralタブにあります。
  3. 設定ファイルのダウンロード設置
    f:id:surume_Reflection:20170520163419p:plain

アプリにREVERSED_CLIENT_IDを設定

  • 先ほど入れたGoogleService-info.plistREVERSED_CLIENT_IDをコピー f:id:surume_Reflection:20170520171658p:plain


  • プロジェクトのinfoURL Typeを追加し、URL Schemesにペースト f:id:surume_Reflection:20170520173140p:plain

2. 実装

インポートの記述

  1. AppDelegate.swiftViewController.swiftに下記を記述
import Firebase
import GoogleSignIn
  1. AppDelegate.swiftに初期化処理を記述 アプリ起動時のapplication:didFinishLaunchingWithOptions:内に記述します。
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch.
        FIRApp.configure()
        return true
    }

注意:
importでエラーが出ている場合はFramework Search Pathsがマッチしていない場合があります。
「CocoaPodsを使用しているプロジェクトでは、「.xcodeproj」のファイルから開くとビルドできません。」

コードの追記

AppDelegate.swift

import UIKit
import Firebase
import GoogleSignIn

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate, GIDSignInUIDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch.
        FIRApp.configure()
        
        GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
        GIDSignIn.sharedInstance().delegate = self
        
        return true
    }
    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
        -> Bool {
            return GIDSignIn.sharedInstance().handle(url,
                                                        sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                        annotation: [:])
    }
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                    sourceApplication: sourceApplication,
                                                    annotation: annotation)
    }
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
        if error != nil {
            return
        }
        
        guard let authentication = user.authentication else { return }
        let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                          accessToken: authentication.accessToken)
        FIRAuth.auth()?.signIn(with: credential) { (user, error) in
            if error != nil {
                return
            }
        }
    }
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user:GIDGoogleUser!, withError error: Error!) {
        print("ログイン認証成功");
    }

    func applicationWillResignActive(_ application: UIApplication) {}
    func applicationDidEnterBackground(_ application: UIApplication) {}
    func applicationWillEnterForeground(_ application: UIApplication) {}
    func applicationDidBecomeActive(_ application: UIApplication) {}
    func applicationWillTerminate(_ application: UIApplication) {}
}

ViewController.swift

import UIKit
import Firebase
import GoogleSignIn

class ViewController: UIViewController, GIDSignInDelegate, GIDSignInUIDelegate {

    override func viewDidLoad() {
        super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib.
        
        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().signIn()
    }
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {}
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user:GIDGoogleUser!, withError error: Error!) {}

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

NodeJSのWebSocketで入力内容の送受信

コマンド

$ npm init
$ npm i websocket
$ node server.js #サーバー動かす

コード

server.js
var http = require('http');
var WSServer = require('websocket').server;
var url = require('url');
var clientHtml = require('fs').readFileSync('test.html');

var plainHttpServer = http.createServer(function(req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html'});
    res.end(clientHtml);
}).listen(8888);

var webSocketServer = new WSServer({httpServer: plainHttpServer});
var accept = ['localhost', '127.0.0.1'];

webSocketServer.on('request', function (req) {
    req.origin = req.origin || '*';
    if (accept.indexOf(url.parse(req.origin).hostname) === -1) {
        req.reject();
        console.log(req.origin + ' access not allowed.');
        return;
    }

    var connection = req.accept(null, req.origin);
    console.log((new Date()) + ' Connection accepted.');

    connection.on('message', function(message) {
            //if(msg.utf8Data === 'Hello'){}
            console.log('Received Message: ' + message.utf8Data);
            connection.sendUTF("<Echo>"+message.utf8Data);
            //websocket.send('sended from WebSocket Server');
    });

    connection.on('close', function (code,desc) {
        console.log('connection released! :' + code + ' - ' + desc);
    });
});
test.html
<html>
<head>
   <title>タイトル</title>
   <meta charset="utf-8">
</head>
<body>

<script>
var ws = new WebSocket("ws://localhost:8888");
ws.onmessage = function(e) {
   console.log("OnMessage:"+e.data);
};
ws.onclose = function (e) {
   console.log(e.code+"/"+e.type);
};

//1秒ごとに入力内容を送る
function sendData(){
   ws.send( document.getElementById('message').value );
}
setInterval(sendData, 1000);
</script>

<input id="message" type="text" value="フロント送信データ" />
<button onClick="sendData()">送信</button>

</body>
</html>

pureなnodejsでhtml表示とmysql接続

サーバー接続

一緒に見たいのでメモレベル削除予定 ※test.htmlを同階層に設置

const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;

var server = http.createServer();
server.on('request', doRequest);

// ファイルモジュールを読み込む
var fs = require('fs');

// リクエストの処理
function doRequest(req, res) {
    
    // ファイルを読み込んだら、コールバック関数を実行する。
    fs.readFile('./test.html', 'utf-8' , doReard );
    
    // コンテンツを表示する。
    function doReard(err, data) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(data);
        res.end();
    }
    
}

MySQL接続と操作

他のサイトを参考にswitchで切り替えれるようにしただけ…
node init.js create_database #node_mysql_testデータベース作成
node init.js create_table #userテーブル作成
node init.js create_date ユーザー名 #ユーザー追加

const mysql = require('mysql');
const db_name = 'node_mysql_test';
const table_name = 'user';

var client = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : ''
});

// 各種DB操作
console.log(process.argv);
switch(process.argv[2]){
    case "create_database":
        client.query('CREATE DATABASE '+ db_name, function(err) {
          if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) {
            throw err;
          }
        });
    break;
    case "create_table":
        client.query('USE '+ db_name);
        client.query(
            'CREATE TABLE '+ table_name+
            '(id INT(10) AUTO_INCREMENT,'+
            'name VARCHAR(100),'+
            'PRIMARY KEY (id))'
        ,function(err){
            console.log(err);
        });
    break;
    case "create_data":
        client.query('USE '+ db_name);
        client.query(
            'INSERT INTO '+ table_name+
            ' SET name = ?',
            process.argv[3], function(err, info) { console.log(err); });
    break;
    default:
        console.log("該当引数なし:"+process.argv[2]);
}


client.end();

10分でwebプログラミング初心者

f:id:surume_Reflection:20170417010823p:plain

プログラミングの難しい点は環境作りにある

初心者が最初につまづくであろう物がプログラミング環境の準備だ
バージョンがOSが前提ライブラリがモジュールが…

人間が紙に命令や手続きを書いて実行するのをプログラムと呼ぶのであれば
純粋なプログラミングに本来環境は必要ないと言える プログラム - Wikipedia



PCブラウザで見ているのであれば環境も必要ない

ブラウザのURL欄に以下を記述する事で実行できる
簡単だからぜひ手書きで実行してみてほしい

javascript:alert(“HelloWorld!!”);

javascript:までを手書きで書いて、実行部分のalert("HelloWorld!!");を書く
JavaScript疑似プロトコルと呼ばれる物でブックマークレットなどを作れる。


サンプル:こんにちわ世界

www.lifehacker.jp

※ブックマークのURL欄に記入



開発者ツール!!

F12を押してコンソール欄に
alert("HelloWorld!!");を入力Enter

開発者ツールって名前、プログラミングしてる感がありますねw
なんとここでプログラム言語のJavaScriptが使えます。
ブックマークレットjavascript:を抜かせばここから実行可能です。
f:id:surume_Reflection:20170417002745p:plain
ブラウザ時計表示サンプル:

(function(){function displayClock(){var nowDate = new Date();var h = nowDate.getHours();var m = nowDate.getMinutes();var s = nowDate.getSeconds();var textDate = right('0'+h,2)+':'+right('0'+m,2)+':'+right('0'+s,2);document.getElementById('divzumeclock').innerHTML = textDate;};function right(str,n){return str.split('').reverse().slice(0,n).reverse().join('');};window.scroll(0,0);if(document.getElementById('divzumeclock')){document.getElementById('divzumeclock').style.display = 'block';document.getElementById('divzumeclose').style.display = 'block';return;}var clk = document.createElement('div');if(document.all){var width = document.body.clientWidth;}else{var width = '100%';}clk.style.width = width;clk.style.height = '100%';clk.setAttribute('id','divzumeclock');document.body.insertBefore(clk,document.body.firstChild);clk.style.fontSize = '120px';clk.style.padding = '100px 0px 0px 0px';clk.style.textAlign = 'center';clk.style.opacity = 0.8;clk.style.filter = 'alpha(opacity=80)';clk.style.zIndex = 998;clk.style.backgroundColor = 'white';clk.style.position = 'absolute';clk.style.left = 0;clk.style.top = 0;var cls = document.createElement('div');if(document.all){cls.innerHTML = '<a href=\'\'>X</a>';}else{cls.innerHTML = '<a href=\'\'>X</a> ';}if(cls.attachEvent){cls.attachEvent('onclick',function(){document.getElementById('divzumeclose').style.display='none';document.getElementById('divzumeclock').style.display='none';return false;});}else{cls.addEventListener('click',function(event){document.getElementById('divzumeclose').style.display='none';document.getElementById('divzumeclock').style.display='none';event.preventDefault();},false);}cls.style.width = width;cls.style.height = '50px';cls.setAttribute('id','divzumeclose');document.body.insertBefore(cls,document.body.firstChild);cls.style.fontSize = '30px';cls.style.textAlign = 'right';cls.style.zIndex = 999;cls.style.position = 'absolute';cls.style.left = 0;cls.style.top = 0;setInterval(displayClock,250);})();



実際に開発していく

プログラミングは基本、複雑な物を除けば分岐繰り返しのみです


情報爆発が広告界で問題になってそうですが
こういった学習サイトが多く点在しています。
ドットインストールがシンプルでおすすめです。

www.sejuku.net

cod:iwの時間を操る装置!?

#どこかで見た事あると思ったら…

CODIWのコーリングカードの中に手に変な装置をつけているカードが


f:id:surume_Reflection:20170408125431j:plain



シンギュラリティー

f:id:surume_Reflection:20170408125610j:plain

www.youtube.com



プロトタイプ

f:id:surume_Reflection:20170408125733j:plain

www.youtube.com