MongoDB備忘録(Mac, NodeJS)

前提及び本体のインストール手順

1:MacOSのバージョンを最新に更新 2:xcodeのCommand Line Developer Toolsをインストール

xcode-select --install

3:必要なディレクトリ作成

sudo mkdir /usr/local/Frameworks

4:mongodbのインストール

brew install mongodb

5:格納先を作成

$ ls /usr/local/etc/mongod.conf #設定ファイル確認
/usr/local/etc/mongod.conf

$ sudo mkdir /var/lib/mongodb #格納先作成
$ sudo touch /var/log/mongodb.log #出力ログ作成

実行テストコード

各種実行ファイル作成

$ mkdir ~/Project/Test/MongoTest
$ cd ~/Project/Test/MongoTest
$ npm init
$ npm install mongodb
$ vi index.js
$ node index.js #実行

index.js

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const HOST_NAME = 'mongodb://127.0.0.1:27017';
const OPTION = {useNewUrlParser: true, useUnifiedTopology: true};
const DB_NAME = 'test_database';
const COLLECTION_NAME = 'test_collection';

const main = async () => {
  const client = await MongoClient.connect(HOST_NAME, OPTION);
  if(!client) return 'connection failed';

  const db = await client.db(DB_NAME);
  if(!db) return 'db connection failed';

  const collection = db.collection(COLLECTION_NAME)
  if(!collection){
    return 'collection not found!';
  }else{
    await collection.insertOne({ foo: "bar" });
  }

  client.close();
};
main();

etc

DBクライアント

Robo 3T
https://robomongo.org/

各種メソッド(左メニュー)

w3schools
Node.js MongoDB Create Database

プログラマ筋トレ備忘録

デスクワークの肩こり解消・筋トレ・ダイエット

食事制限の問題

食事制限で体重は減るが、筋肉も減り代謝が落ちてリバウンドする。
しかも代謝が落ち前より筋肉を付けて痩せる事が難しくなる。

空腹の時間を作らない

空腹の時間に食べると血糖値が上がり、インスリンが脂肪に回してしまう。
なので血糖値を上げない為に、一食の量を減らし間食を増やす事が大事。

低カロリー高タンパクの罠

難しい事に低カロリー高タンパクを続けると、体が省エネモードに入る。
そうすると代謝が落ち、痩せにくく筋肉が作られなくなる。

ダンベル何キロ持てる?より

概要

筋トレグッツ

組み合わせによって、最大22kgバーベルにもなる。
転がらないので、プッシュアップバーとしても活用可能

ストレッチ

対象 ストレッチ 要素
首周り(板状筋・頭板状筋) 外部リンク -
首周り(胸鎖乳突筋) 外部リンク -

筋トレ

対象 レーニン 要素
僧帽筋 バーベルシュラッグ バーベル
背中周り ※記載予定 -
ハムストリング ハーフスクワット +バーベル

※ハムストリング とは大腿二頭筋・半膜様筋・半腱様筋の総称

備考欄

筋肉の付き方の差

短時間のキツイトレーニングは、筋肉を鍛え肥大する
長時間のゆるいトレーニングは、肥大せず筋肉の持久力を鍛えられる

首回りの筋肉

首回りの筋肉は複雑で、誤って鍛えると結果的に神経や血管を圧迫する。
ベターな僧帽筋・胸鎖乳突筋あたりを鍛えるのがベスト
https://plaza.rakuten.co.jp/555yj/diary/201710100000/

からかい上手の高木さん からかいシュミレーション

f:id:surume_Reflection:20180331123556p:plain

※押すと以下にネタバレが表示されます。

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();