Saturday 29 September 2018

譚艷---光明

socket.io


reference:
https://www.youtube.com/watch?v=FvArk8-qgCk&list=PL4cUxeGkcC9i4V-_ZVwLmOusj8YAUhj_9&index=5
https://www.youtube.com/watch?v=tHbCkikFfDE&t=1909s
https://codeburst.io/isomorphic-web-app-react-js-express-socket-io-e2f03a469cd3
https://blog.cloudboost.io/creating-a-chat-web-app-using-express-js-react-js-socket-io-1b01100a8ea5

broadcast to single client
https://socket.io/docs/rooms-and-namespaces/
https://stackoverflow.com/questions/11484418/socket-io-broadcast-to-certain-users

Deploying Node.js and Socket.io App to Heroku
http://robdodson.me/deploying-your-first-node-dot-js-and-socket-dot-io-app-to-heroku/
https://devcenter.heroku.com/articles/node-websockets

Connecting to a specific Server Ip with Socket.io
https://stackoverflow.com/questions/22915149/connecting-to-a-specific-server-ip-with-socket-io

Get static IP address for Heroku app
https://serverfault.com/questions/871875/get-static-ip-address-for-heroku-app/871878
https://devcenter.heroku.com/articles/fixie

WebSockets vs REST
https://www.pubnub.com/blog/2015-01-05-websockets-vs-rest-api-understanding-the-difference/

start server and client simultaneously from 1 command window
https://stackoverflow.com/questions/30950032/how-can-i-run-multiple-npm-scripts-in-parallel

Use a package called concurrently.
npm i concurrently --save-dev
Then setup your npm run dev task as so:
"dev": "concurrently --kill-others \"npm run start-watch\" \"npm run wp-server\""

react social media login

project linkhttps://chuanshuoge1-socialmedialogin.herokuapp.com/

facebook & google login button

logged in, got access token

to log out, clear website data

add google+ api -> add authorized origins

facebook developer -> add domain



package.json

{
  "name": "react-facebook-login",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.5.2",
    "react-dom": "^16.5.2",
    "react-facebook-login": "^4.1.0",
    "react-google-login": "^3.2.1",
    "react-scripts": "1.1.5"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

-----------------------------------------------

app.js

import React, { Component } from 'react';
import './App.css';

import Facebook from './components/facebook';
import Google from './components/google';

class App extends Component {

  render() {
    return (
      <div>     
        <Facebook/><br/>
        <Google/><br/>
        To log out, clear webbroweser saved website data
      </div>
    );
  }
}

export default App;

---------------------------------------------

google.js

import React, {Component} from 'react'
import { GoogleLogin} from 'react-google-login';

export default class Google extends Component{
    state={
        isLoggedIn: false,
        userID:'',
        name:'',
        email:'',
        picture:'',
        accessToken:''
    }

  

    handle_loginSuccess = (res) =>{

        this.setState({
            isLoggedIn:true,
            userID: res.profileObj.googleId,
            name: res.profileObj.name,
            email:res.profileObj.email,
            picture:res.profileObj.imageUrl,
            accessToken: res.accessToken
        })
    }

    handle_loginFail=(res)=>{
        console.log(res);
    }
       
      render(){
        let googleContent;

        if(!this.state.isLoggedIn){

            googleContent=(<GoogleLogin
                clientId="777285939272-s9bsmvkvve3jidsho0qspb928r6avdq5.apps.googleusercontent.com"
                buttonText="Login with Google"
                onSuccess={this.handle_loginSuccess}
                onFailure={this.handle_loginFail}
            />)}else{

            googleContent=(<div>

                <div style={{
                    width:'400px',
                    margin:'auto',
                    background:'#f4f4f4',
                    overflow: 'scroll'
                }}>

                    <img src={this.state.picture} alt={this.state.name}/>
                    <h2>Welcome {this.state.name}</h2>
                    <p>Email: {this.state.email}</p> 
                    Access Token: {this.state.accessToken}
                </div>
            </div>);
            }
        
        return(
            <div>{googleContent}</div>
        )
      }
}

---------------------------------------

facebook.js

import React, {Component} from 'react'
import FacebookLogin from 'react-facebook-login';

export default class Facebook extends Component{
    state={
        isLoggedIn: false,
        userID:'',
        name:'',
        email:'',
        picture:'',
        accessToken:''
    }

    componentClicked=()=>console.log('clicked');

    responseFacebook=res=>{

        this.setState({
            isLoggedIn:true,
            userID: res.userID,
            name: res.name,
            email:res.email,
            picture:res.picture.data.url,
            accessToken:res.accessToken
        })
    }

    render(){
        let fbContent;

        if(this.state.isLoggedIn){
            fbContent= (
                <div style={{
                    width:'400px',
                    margin:'auto',
                    background:'#f4f4f4',
                    overflow: 'scroll'
                }}>

                    <img src={this.state.picture} alt={this.state.name}/>
                    <h2>Welcome {this.state.name}</h2>
                    <p>Email: {this.state.email}</p>
                    Access Token: {this.state.accessToken}
                </div>
            );
        }else{
            fbContent=(<FacebookLogin
                appId="290235811581073"
                autoLoad={false}
                fields="name,email,picture"
                onClick={this.componentClicked}
                callback={this.responseFacebook} />)
        }

        return(
            <div>
                {fbContent}
            </div>
        )
    }
}

----------------------------------------------

.env

HTTPS=true

------------------------------------------------
reference:

Tuesday 25 September 2018

早上最適合聽的輕音樂 放鬆解壓

aluminium and plastic material

Plastic melting point (Celsius)

ABS 105
HDPE 120
Noryl 100
PC 147
PEI 219
PMMA 160
POM 175
PTFE(TEFLON) 326
PVC 100
UHMW 130
ULTEM 217

Ultem


Ultem is a family of PEI products manufactured by SABIC as a result of acquiring the General Electric Plastics Division in 2007, developed by Joseph G. Wirth in the early 1980s. Ultem resins are used in medical and chemical instrumentation due to their heat resistance, solvent resistance and flame resistance. Ultem 1000 (standard, unfilled polyetherimide) has a high dielectric strength, inherent flame resistance, and extremely low smoke generation. Ultem has high mechanical properties and performs in continuous use to 340 °F (170 °C) and is easily machined and fabricated with excellent strength and rigidity.[4] Ultem 1000 has typical thermal conductivity of 0.22 W/m·K (but some sources give 0.122 W/m·K). It has "Questionable usage on alkaline solutions."[5]

Aluminum tensile yield strength (MPa)

2024 (324)
5052 (193)
6061 (276)
6063 (160)

react facebook login

facebook developer get app id


reference:
https://www.youtube.com/watch?v=ea9KyE78qKI
https://developers.facebook.com/apps

https://github.com/keppelen/react-facebook-login/issues/54

Saturday 22 September 2018

PayPal SDK + node express + heroku

project linkhttps://chuanshuoge2-paypal-node.herokuapp.com/

get testing buyer and store account from paypal developer, by logging in real paypal account

in app&credentials get store client ID and secret, paste in app.js

store web page, buyer purchase 555.55

redirect buyer to login page, enter buyer sandbox paypal, continue

buyer's password can be changed in https://developer.paypal.com/developer/accounts/, account detail

transaction success , receipt sent

transaction cancelled

buyers account, 555.55 is charged

store account, 555.55 in

--app.js
--package.json
--views
  --index.ejs
--public
  --sale.png
--.gitignore

------------------------------------------

package.json

{
  "name": "paypal",
  "version": "1.0.0",
  "description": "paypal app",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ejs": "^2.6.1",
    "express": "^4.16.3",
    "paypal-rest-sdk": "^1.8.1"
  }
}

----------------------------------------

app.js

const express = require('express');
const paypal = require('paypal-rest-sdk');
const path = require('path');
const bodyParser = require('body-parser');
const exphbs = require('ejs');

paypal.configure({
    'mode': 'sandbox',
    'client_id': 'Aa0fwwAFGqliwRTrBgHaEPZ2Ry3lqcynylfgNU0KuHO4W6vDJ-_hiF44-k4_6FTlT9iLBkuDqJ8Gse4P',
    'client_secret': 'EEYSP5SgoxnZ5rlZag4gleJP4FuITpp5wGfv0GotpcPWkgaM9pXPfzIWiNhguIAaKTEwwPNx4-U_1bDF'
})

const app = express();

app.set('view engine', 'ejs');

//Body parser Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

//Set static Folder
app.use(express.static(path.join(__dirname, './public')));

app.get('/', (req, res) => res.render('index'));

app.post('/pay', (req, res) => {

    // Build PayPal payment request
    const payReq = JSON.stringify({
        intent: 'sale',
        payer: {
            payment_method: 'paypal'
        },
        redirect_urls: {
            return_url: req.headers.origin + '/success',
            cancel_url: req.headers.origin + '/cancel'
        },
        transactions: [{
            amount: {
                total: req.body.price.toString(),
                currency: 'CAD'
            },
            description: 'one time charge'
        }]
    });

    console.log('payment ' + req.body.price.toString()+' request created')

    //create payment
    paypal.payment.create(payReq, function (error, payment) {
        let links = {};

        if (error) {
            console.error(JSON.stringify(error));
            res.send(JSON.stringify(error));
        } else {
     
            //sample approval_url href:
            //'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-6BG01810KP0350828',

            payment.links.forEach(function (linkObj) {
                links[linkObj.rel] = {
                    href: linkObj.href,
                    method: linkObj.method
                };
            })

            console.log('payment approval url: ' + links['approval_url'].href);

            if (links.hasOwnProperty('approval_url')) {
                // Redirect the customer to links['approval_url'].href
                res.redirect(links['approval_url'].href);
            } else {
                console.error('no redirect URI present');
                res.send('no redirect URI present');
            }
        }
    });
});

app.get('/success', (req, res) => {
    const paymentId = req.query.paymentId;
    const payerId = { payer_id: req.query.PayerID };
   
    //execute payment
    paypal.payment.execute(paymentId, payerId, function (error, payment) {
        if (error) {
            console.error(JSON.stringify(error));
        } else {
            if (payment.state == 'approved') {
                console.log('payment completed successfully');
                console.log(payment);
                res.send('payment success <br/>' + JSON.stringify(payment).split(',').join('<br/>'));
            } else {
                console.log('payment not successful');
            }
        }
    });
});

app.get('/cancel', (req, res) => res.send('cancelled'));

//server entry port for heroku and localhost
const port = process.env.PORT || 3000;

app.listen(port, () => console.log('server started'));

-----------------------------------------------

index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width-device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"/>
    <title>stripe transactions</title>
</head>
<body>
    <div class="row">
<div class="col-md-12 text-center">
<img src="/sale.png" alt="sale" class="img-fluid" /><br/><br/>

<form action="/pay" method="post">
Price: $<input type="number" id="price" placeholder='123.45' step=".01"
                   onchange='priceChange()'/><br /><br />

<input type="hidden" id="priceSent" name="price" value="123.45" />

<button type="submit" class="btn-primary btn-block">Purchase</button><br />
</form>
</div>

</div>

<script>
function priceChange() {
document.getElementById("priceSent").value = document.getElementById("price").value;
        }

</script>
</body>
</html>
  
----------------------------------

reference:
https://www.youtube.com/watch?v=7k03jobKGXM
https://developer.paypal.com/docs/api/quickstart/#how-to-use-this-guide
https://developer.paypal.com/developer/accounts/
https://www.sandbox.paypal.com

https://stackoverflow.com/questions/21520244/how-to-simply-send-a-request-parameter-with-jquery-form-submit
https://stackoverflow.com/questions/18679690/heroku-nodejs-app-with-r10-h10-and-h20-errors
https://stackoverflow.com/questions/20705602/how-can-i-check-in-which-url-my-node-js-server-is-running

Friday 21 September 2018

agile BI

Create in MS word: 3-5 pages


  • describe how and Agile project methodology can be applied to business intelligence projects
  • provide 3 resons this could be a useful approach?
  • provide 2 challenges with this approach?
  • define a product backlog.

Agile method helps BI realize value fast, adapt to ever changing business requirement, and increases the customer satisfaction rate. Agile emphasize on interactive communication between customers, business analyst, developers, and other project members during all phases of project.

During project initialization phase, meeting with customers and understanding their requirement and expectation is essential for defining the project. Having a clear picture of deliverables will facilitate cost and profit analysis, risk and feasibility assessment.

Client information is also critical for setting up bidding strategies. For one-time customer, strategies tend to maximize short term gain, whereas for customer with future opportunities, strategies pivot to develop long term relationship. Companies can submit competitive bid to increase the chance of winning contract. Securing contracts will potentially change the course of the company and contribute to the companies’ future growth and success.

During project analysis and development phase, it is important to keep clients updated. Frequent meetings with client to inform them with project progress will keep business on track. If the milestones have been reached smoothly, clients can check and give feedback. If unexpected delay happens, explaining the adverse situation and cause to client will help work out a new schedule with client.

Client may also come up with new requirement as the projects runs. A new agreement may be reached on both sides. Designs can be revised to accommodate the new criteria. Lots of large projects can be broken down to smaller projects and is completed by finishing smaller projects in sequence. Agile is suitable for these type of projects.

Agile promotes shorter development cycles and faster delivery. Smaller project with scope scaled down is easier to manage, which accelerate processes of submitting temporary design, receiving feedback, and revision. Constant flow of information between development team and clients help all sides maintain on same pace. Therefore waste on unnecessary design and extra work is reduced and development efficiency is increased. Changes can be adapted in timely manner to better fit clients’ need.

At project deploy and operation phase, there might be minor system failure, bugs need to be fixed. Customer experience with the system may also show where the improvement could be made.
Agile will help business meet challenges from different industries. By updating and maintaining system regularly, and live testing the system on the market, systems have fewer flaws and become more user-friendly and competitive. Customers can also be trained to master system features, operations so that they better take advantage the system.

Implement agile mouthed can be challenging if clients have conflicted requirements for projects. When communication with different personal from clients, the objectives may vary and priorities deviate. This will confuse the development team, and may lead development in opposite directions.


Agile could also be challenging if development team is used to traditional systems. Switching from working with a well scheduled plan, design, and implementation process to an ever changing, customer oriented approach may be difficult to adapt.


Product backlog is an ordered list, with desired functionalities in product. It is usually short and can be completed in one development cycle.

reference:
https://project-management.com/10-key-principles-of-agile-software-development/
https://linchpinseo.com/the-agile-method/

Monday 17 September 2018

Stripe api + node express + heroku credit card transaction


left sales form, right response from Stripe account

 set price, click purchase, form open enter test visa #

transaction, card, customer info processed by Stripe account

set #, click history, top few transactions are displayed

app is published to heroku, Stripe account keys are stored privately in config

In Stripe account, all transactions are logged

look into transaction detail

project folder

--config
  --keys.js
  --keys_dev.js
  --keys_prod.js

--public
  --img
    --marketplace.png
    --sale.png

--views
  --layouts
    --main.handlebars
  --index.handlebars

--.gitignore
--app.js
--package.json

----------------------------------------------

package.json

{
  "name": "node-stripe",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.3",
    "express": "^4.16.3",
    "express-handlebars": "^3.0.0",
    "stripe": "^6.10.0"
  }
}

-----------------------------------

app.js

const express = require('express');
const keys = require('./config/keys')
const stripe = require('stripe')(keys.stripeSecretKey);
const bodyParser = require('body-parser');
const exphbs = require('express-handlebars');
const path = require('path');

const app = express();

//Handlebars Middleware
app.engine('handlebars', exphbs({ defaultLayout: 'main' }));
app.set('view engine', 'handlebars');

//Body parser Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

//Set static Folder
app.use(express.static(path.join(__dirname, './public')));

//Index Route
app.get('/', (req, res) => {
    res.render('index', { stripePublishableKey: keys.stripePublishableKey }); 
})

//Charge Route
app.post('/charge', (req, res) => {
    console.log(req.body);

    //create/update customer
    stripe.customers.create({
        email: req.body.token.email,
        source: req.body.token.id
    })
        //create charge
        .then(customer => stripe.charges.create(
            {
                amount: req.body.price*100,
                description: 'one step charge',
                currency: 'cad',
                customer: customer.id,
                metadata: { order_id: req.body.orderId },
            }
        ))
        .then(charge => res.send('Transaction successful'))
        .catch(err => res.send(err.message))
});

//transaction history route
app.post('/history', (req, res) => {
    console.log(req.body);

    stripe.balance.listTransactions({ limit: req.body.num }, function (err, transactions) {
        // asynchronously called
        if (!err) {
            console.log(transactions);
            res.send(transactions.data);
        } else {
            console.log('error');
        }
    });
});

const port = process.env.PORT || 5000;

app.listen(port, () => {
    console.log('server started on port ', port);
});

----------------------------------

index.handlebars

<section>
    <div class="row">

        <div class="col-md-6 text-center">
            <img src="/img/sale.png" alt="sale" class="img-fluid" />

            <form>
                Price: $<input type="number" id="price" placeholder="123.45"
                               onchange=priceChange()><br /><br />

                <script src="https://checkout.stripe.com/checkout.js"></script>
                <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

                <button id="customButton" class="btn-primary btn-block">Purchase</button><br />

                Show # of transactions: <input type="number" id="transactionNum" placeholder="3"
                                               onchange=transactionNumChange()><br /><br />
                <button id="historyButton" class="btn-success btn-block">Transaction Histories</button><br />

                <script>

                    var handler = StripeCheckout.configure({
                        key: '{{stripePublishableKey}}',
                        image: '/img/marketplace.png',
                        locale: 'auto',
                        token: function (token) {
                            //when form is submitted, form will wait for token to be generated before close

                            document.getElementById('transactionId').innerHTML = token.id.slice(4);
                            document.getElementById('transactionTime').innerHTML = new Date(token.created * 1000).toUTCString();
                            document.getElementById('cardId').innerHTML = token.card.id.slice(5);
                            document.getElementById('clientIP').innerHTML = token.client_ip;

                            //generate order ID
                            orderId = parseInt(Math.random() * 10000);

                            //send to server
                            axios.post('/charge', { token: token, price: price, orderId: orderId })
                                .then(function (response) {
                                    document.getElementById('serverRes').innerHTML = 'Purchase request sent. ' + response.data;
                                    console.log(response);
                                })
                                .catch(function (error) {
                                    document.getElementById('serverRes').innerHTML = error.statusText;
                                    console.log(error);
                                });
                        }
                    });

                    //purchase button click event
                    document.getElementById('customButton').addEventListener('click', async function (e) {
                        // Open Checkout with further options:
                        await handler.open({
                            name: 'Purchase',
                            description: 'Credit card',
                            currency: 'cad',
                            amount: price * 100,
                        });
                        e.preventDefault();
                    });

                    //history button click event
                    document.getElementById('historyButton').addEventListener('click', function (e) {

                        //send to server
                        axios.post('/history', { num: transactionNum })
                            .then( function (response) {
                                var serverText = document.getElementById('serverRes');
                                serverText.innerHTML = '<br/>';                             

                                for (var i = 0; i < response.data.length; i++) {
                                    var time = new Date(response.data[i].created * 1000).toUTCString();

                                    serverText.innerHTML = serverText.innerHTML
                                        + 'ID: '+ response.data[i].id + '<br/>'
                                        + 'Time: ' + time + '<br/>'
                                        + 'Amount: ' + response.data[i].amount/100 + '<br/>'
                                        + 'Fee: ' + response.data[i].fee / 100 + '<br/>'
                                        + 'Net: ' + response.data[i].net / 100 + '<br/><br/>'
                                }

                             
                                console.log(response);
                            })
                            .catch(function (error) {
                                document.getElementById('serverRes').innerHTML = error.statusText;
                                console.log(error);
                            });

                        e.preventDefault();
                    });

                    // Close Checkout on page navigation:
                    window.addEventListener('popstate', function () {
                        handler.close();
                    });
                </script>
            </form>
        </div>

        <div class="col-md-6">
            use card # 4242 4242 4242 4242 M/Y 12/34 CYC 111 to test<br />

            <span class="text-warning">server response:</span>  <span id="serverRes"></span><br />

            <span class="text-info">transactionId:</span> <span id="transactionId"></span><br />
            <span class="text-info">transactionTime:</span> <span id="transactionTime"></span><br />
            <span class="text-info">cardId:</span> <span id="cardId"></span><br />
            <span class="text-info">clientIP:</span> <span id="clientIP"></span><br />
        </div>
    </div>
</section>
<script>
    var price = 123.45;
    var orderId = 1234;
    var transactionNum = 3;

    function priceChange() {
        price = parseFloat(document.getElementById("price").value).toFixed(2);
    }

    function transactionNumChange() {
        transactionNum = parseInt(document.getElementById("transactionNum").value)
    }

</script>

--------------------------------------

main.handlebars

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width-device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">
    <title>stripe transactions</title>
</head>
<body>
    <nav class="navbar navbar-expand-md navbar-dark bg-dark">
        <div class="container">
            <a href="/" class="navbar-brand">
                <h3 class="d-inline align-middle">Stripe</h3>
            </a>
        </div>
    </nav>
    <div class="container">
        {{{body}}}
    </div>
</body>
</html>

----------------------------------------------

keys.js

if (process.env.NODE_ENV === 'production') {
    module.exports = require('./keys_prod');
} else {
    module.exports = require('./keys_dev');
}

------------------------------------

keys_prod.js


module.exports = {
    stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY,
    stripeSecretKey: process.env.STRIPE_SECRET_KEY
}
------------------------------------

.gitignore

node_modules
key_dev.js
--------------------------------

reference:
http://chuanshuoge2.blogspot.com/2018/09/stripe-api.html

Thursday 13 September 2018

memo to your organization

write a memo of intent in support of introducing a business intelligence initiative into your organization.

the memo should address:


  1. how BI could augment the strategic objectives of the organization
  2. what opportunities BI will provide
  3. What challenges BI will face in being adopted (and how you plan to overcome them)
  4. what methodologies will you use to manage the introduction of BI into the organization (project methodology, etc)
  5. an other support or information you think would help your BI initiative become adopted.


You may use a real or fictitious company - please state assumptions as needed.

BI Benefits Agricultural Industry


People works in agricultural industry are looking for ways to make more profit. BI will empower them to reach this goal. BI helps enhance crop yield, increase agricultural efficiencies, and optimize produce market value. BI also helps lower financial cost, reduce natural and artificial risks, and decrease wastes.

BI takes advantage of historic data and modern technologies. Which creates relative accurate models of the crop yield from analysis on environment. Data from sensors in the farmland provide real time information of the crop growth, allowing farmers to activate equipment at precise agricultural stage. Predictive analysis based on real time market and historical price help farmers bring product on market when values are high.

BI gathers resources from government; private sectors… Which offer farmers funding and financing aid for purchasing and leasing, technology and equipment upgrade… Weather forecast and news alert farmers with adverse weather condition, update farmers with changing trade patterns. Farms can take precaution, plan ahead, and move away from risk.

BI facilities comprehensive planning, strategic decision making to minimize waste of time and money, and maximize agricultural process efficiency and return. BI creates opportunities for companies gaining competitiveness, expanding future growth possibilities.

Agile approach is good for implementing BI solutions. The objective is to speed up the data delivery to users, prioritize design to meet requirement, adding value to business with strategies.

The biggest challenge for BI is data acquisition. Accurate, real time, and historic data is required for analysis. Technology plays a key role in tackling this problem. Sensors in the field transmit real time data to control centers. Remote sensing techniques such as drone survey, satellite photo send images to geographic information system, historic stats are open on internet to view.  



reference:
https://go.christiansteven.com/bi-blog/how-to-rock-the-agricultural-industry-with-business-intelligence
http://analytics-magazine.org/agriculture-analytics-google-farm/
http://www.codec.ie/company/news-and-events/business-intelligence-agriculture/
https://farmgrants.ca/?gclid=CjwKCAjwuO3cBRAyEiwAzOxKsm2xrABVpiIFq4f1eulX1sZCV4882QykMfGxLD5MBNHtJgRSSZmNuhoChX4QAvD_BwE
https://www.geospatialworld.net/article/remote-sensing-techniques-for-agriculture-suvey/
https://www.theta.co.nz/solutions/analytics/business-intelligence-and-data-warehouse-methodologies/

Thursday 6 September 2018

business analytics for BI resource


administrator
P@ssw0rd

https://eacademy.ict.sait.ca/
khanacademy.org
https://mva.microsoft.com/

datafluency: empowering your organization with effective data communication
https://max.book118.com/html/2018/0128/150891265.shtm

http://www.juiceanalytics.com
https://data.calgary.ca
https://open.canada.ca/data/en/dataset?organization=statcan

what does business analysis mean to you?


business analysis works with database, create models for business operations, generate reports for analyzing project profitability, feasibility... to help cooperation understand business requirements and making strategic decisions.

why is business analysis important with in a project?

business analysis plays important role in term of defining business requirements, understanding organization capabilities, managing schedules, cost and resources for projects, provide solutions and changes, and optimize sales and business outcome.

list the to 5+ challenges faced by a BA?

tight budget for huge project.
picky client who is never happy no matter how many changes have been made.
lack of project information. (schedules, budgets, process documentation...)
conflicting opinions for project design and approach.
changing project requirement during project


what is the BA's role in a project?

clarifying and outlining project requirement, identify business needs.
strategic planning project approaches,.
data analysis, research, design, and modify process, systems for project,
provide solutions for challenges.

3D printed house

房子可以打印了!
售价8000万的别墅3D打印只要100多万
一套房子1天时间就能完成
让炒房者无路可走!

某综艺节目前段时间
邀请了4位设计师
有一位设计师
用3D打印技术造房子的理念
令大家大开眼界
他就是“3D打印建筑第一人”马义和


马义和在节目中介绍
光是研发这台
立体打印机就用了16年时间
但打印机研发出来后
它就能取代人力,自行工作
把机器放在那,只要用几个小时或几天
就能打造出你想要的房子类型


就好比给蛋糕裱花一样
一层层往上叠就好了


只不过做蛋糕用的是奶油
3D打印房子用的是
建筑专用的油墨


一层层叠加
形成一块树米高的建筑构件

然后再用钢筋水泥
进行二次“打印”灌注,连成一体
建造一层约200平方米的房子
打印材料一天,
再5个工人花三天就可以完成


苏州工业园区有一栋
面积达1100平方米的别墅
创造了全球首个带内装
外装一体化3D打印的纪录



房子的墙体看上去跟用水泥建造出来的一样,呈现出年轮蛋糕般的螺纹结构,用手指敲敲墙体,听到空空的声音。虽然手感粗糙,但每层之间密不透风,看上去浑然一体。

还有全球首栋3D高层居住楼

盈创全球最高3D打印建筑--“6层楼居住房”

还有这么整整两栋中式庭院,也是打印出来的!


里里外外,不单是房子
部的一些简单家具
如浴缸、台面等都能打印


房子要打地基吗?

设计师答:
一两层的房子是可以不打地基的
如果100层这样的高楼
只要打30或50米的桩就行了

这个房子没有钢筋
能抗多少级地震?

设计师答:
3D打印出来的房子
强度比钢筋还多20多倍呢
完全可以放心抗震


成本多少钱呢?

听到答案的我惊呆了
一套1100㎡的别墅
3D打印的造价只要100多万
想想在一线城市,这价格简直太诱惑

而且它还非常环保!
所用的油墨原料都是从
建筑和工业垃圾里回收来的

要是房子住久了腻了
就用专门的机器把它“吃掉”
然后再用“吃进去”的材料
打印一套新的出来
循环利用材料不浪费~

不止这套苏州庭院
马义和的团队已经打印出了不少房子
比如全球首个3D打印办公室落户迪拜


一张图纸、一个按钮
加上现场组装时间
这座“未来办公室”的整个工程
仅耗时19天

世界首个3D打印别墅


凤凰卫视办公大楼


西安3D打印别墅

3个小时完成了别墅的搭建
只要摆上家具就能拎包入住
能够抗9级地震

看着很不错的样子
想要吗?
不过……你得现有块地!