text:
import ReactDOM from 'react-dom'
import React, { Component } from 'react';
import { Link } from 'react-router-dom'
import { TabContent, TabPane, Nav, NavItem, NavLink, Modal, ModalHeader, ModalBody, ModalFooter, Button, Progress } from 'reactstrap';
import { BootstrapTable, TableHeaderColumn } from 'react-bootstrap-table';
import classnames from 'classnames';
import urls from '../configs/serverConfigurations';
import Map from './Geolocaliser/Map';
const statut = {
  1 : "Maintenance",
  2 : "Disponible",
  3 : "Hors service",
  4 : "A récupérer"
}
const month_select = [
  {id:"01",nom:"Janvier"},
  {id:"02",nom:"Février"},
  {id:"03",nom:"Mars"},
  {id:"04",nom:"Avril"},
  {id:"05",nom:"Mai"},
  {id:"06",nom:"Juin"},
  {id:"07",nom:"Juillet"},
  {id:"08",nom:"Août"},
  {id:"09",nom:"Septembre"},
  {id:"10",nom:"Octobre"},
  {id:"11",nom:"Novembre"},
  {id:"12",nom:"Décembre"}];
const month_day_select = [31,28,31,30,31,30,31,31,30,31,30,31];
const month_day_list = ['01','02','03','04','05','06','07','08','09',10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];
const urlStatuts = urls.statuts;
const urlScooters = urls.scooters;
const urlBoitiersAssocier = urls.boitiers_associer;
const urlContratsAssocier = urls.contrats_associer;
const urlScootersAssocier = urls.scooters_associer;
export default class GestionDesScooters extends Component {
  constructor(props) {
    super(props);
    this.state = {
      activeTab: '1',
      isInsertScooterModal : false,
      isInsertScooterSuccess : true,
      isModifierScooterModal : false,
      isModifierScooterSuccess : true,
      isAssocierContratModal : false,
      isAssocierContratSuccess : true,
      isAssocierBoitierModal : false,
      isAssocierBoitierSucess : true,
      isInfoCompletModal : false,
      isScooterContratModal : false,
      isAttribuerScooter : false,
      contratModalType : 1,
      boitierModalType : 1,
      scooterConcerne : {},
      scootersData : [],
      statutsData : [],
      boitiersAssocier : [],
      contratsAssocier : [],
      scootersAssocier : [],
      rapport_mois: "2017-08",
      rapport_jour : 1,
      rapport_url : 'report?deviceId=1'
    }
    this.handleSelectRapportMois = this.handleSelectRapportMois.bind(this);
    this.handleSelectRapportJour = this.handleSelectRapportJour.bind(this);
    this.toggle = this.toggle.bind(this);
    this.toggleInsertScooterModal = this.toggleInsertScooterModal.bind(this);
    this.toggleAssocierContratModal = this.toggleAssocierContratModal.bind(this);
    this.toggleAssocierBoitierModal = this.toggleAssocierBoitierModal.bind(this);
    this.toggleInfoCompletModal = this.toggleInfoCompletModal.bind(this);
    this.toggleAttribuerScooter = this.toggleAttribuerScooter.bind(this);
    this.toggleModifierScooterModal = this.toggleModifierScooterModal.bind(this);
    this.toggleScooterContratModal = this.toggleScooterContratModal.bind(this);
    this.scooterStatutFormatter = this.scooterStatutFormatter.bind(this);
    this.scootersInsertButton = this.scootersInsertButton.bind(this);
    this.scootersGestionFormatter = this.scootersGestionFormatter.bind(this);
    this.scootersBoitierFormatter = this.scootersBoitierFormatter.bind(this);
    this.scootersContratFormatter = this.scootersContratFormatter.bind(this);
    this.addScooterData = this.addScooterData.bind(this);
    this.associerBoiter = this.associerBoiter.bind(this);
    this.associerContrat = this.associerContrat.bind(this);
    this.modifierScooterData = this.modifierScooterData.bind(this);
  }
  componentDidMount(){
    this.getData();
  }
  getData(){
    var promises = [fetch(urlStatuts).then((response) => response.json()),
      fetch(urlScooters).then((response) => response.json()),
      fetch("http://vps92599.ovh.net:8082/api/positions",{credentials: 'include',headers: {'Accept': 'application/json'}}).then(y => y.json()),
      fetch("http://vps92599.ovh.net:8082/api/devices",{credentials: 'include',headers: {'Accept': 'application/json'}}).then(y => y.json())
    ];
    Promise.all(promises)
    .then(results => {
      let deviceData = results[3];
      let positionData = results[2];
      let scooters = results[1];
      let statuts = results[0];
      let scooterList = []
      scooters.map((instance)=>{
        deviceData.map((deviceInstance)=>{
          instance["id_scooter"]===deviceInstance["id"]?scooterList.push(instance):null
        })
      })
      scooterList.map((instance)=>{
        positionData.map((positionInstance)=>{
          instance["id_scooter"]===positionInstance["deviceId"]?instance["nb_kms"]=(positionInstance["attributes"]["totalDistance"]/1000).toFixed(2):null
        })
      })
      this.setState({
        scootersData : scooterList,
        statutsData : statuts
      })
    })
    .catch(err=>{console.log(err);});

  }
  getAssocierBoitierData(){
    fetch(urlBoitiersAssocier)
    .then((response) => response.json())
    .then((responseJson)=>{
      this.setState({
        boitiersAssocier : responseJson
      });
    })
    .catch((error) => {
      console.error(error);
    });
  }
  getAssocierScooterData(){
    fetch(urlScootersAssocier)
    .then((response) => response.json())
    .then((responseJson)=>{
      this.setState({
        scootersAssocier : responseJson
      });
    })
    .catch((error) => {
      console.error(error);
    });
  }
  getAssocierContratData(){
    fetch(urlContratsAssocier)
    .then((response) => response.json())
    .then((responseJson)=>{
      this.setState({
        contratsAssocier : responseJson
      });
    })
    .catch((error) => {
      console.error(error);
    });
  }
  addScooterData(){
    const queryMethod = "POST";
    let data = {};
    data["num_cruisrent"] = document.getElementById("num_cruisrent").value?document.getElementById("num_cruisrent").value:null;
    data["marque"] = document.getElementById("marque").value;
    data["modele"] = document.getElementById("modele").value;
    data["immat"] = document.getElementById("immat").value;
    data["date_immat"] = document.getElementById("date_immat").value?document.getElementById("date_immat").value:null;
    data["type_usage"] = document.getElementById("type_usage").value;
    data["composants"] = document.getElementById("composants").value;
    data["num_chassis"] = document.getElementById("num_chassis").value?document.getElementById("num_chassis").value:null;
    data["nb_kms"] = document.getElementById("nb_kms").value?document.getElementById("nb_kms").value:null;
    data["controle_qualite"] = document.getElementById("controle_qualite").value;
    data["num_contratassurance"] = document.getElementById("num_contratassurance").value;
    data["assureur"] = document.getElementById("assureur").value;
    data["debut_assurance"] = document.getElementById("debut_assurance").value?document.getElementById("debut_assurance").value:null;
    data["duree_assurance"] = document.getElementById("duree_assurance").value;
    data["statut"] = document.getElementById("statut").value?document.getElementById("statut").value:null;
    fetch(urlScooters,{
      method: queryMethod,
      body: JSON.stringify(data),
      headers: new Headers({
    		'Content-Type': 'application/json'
    	})
    })
    .then(
      (response)=>{
        if(response.status!==200){
          console.log("error");
          this.setState({
            isInsertScooterSuccess : false
          })
        }else {
          fetch(urlScooters)
          .then((response) => response.json())
          .then((responseJson)=>{
            this.setState({
              scootersData : responseJson,
              isInsertScooterModal : !this.state.isInsertScooterModal
            })
          })
          .catch((error) => {
            console.error(error);
          });
        }
      }
    )
    .catch((error) => {
      console.error(error);
    });
  }
  modifierScooterData(){
    const queryMethod = "PUT";
    let data = {};
    data["id_scooter"] = this.state.scooterConcerne["id_scooter"];
    data["num_cruisrent"] = document.getElementById("num_cruisrent").value?document.getElementById("num_cruisrent").value:null;
    data["marque"] = document.getElementById("marque").value;
    data["modele"] = document.getElementById("modele").value;
    data["immat"] = document.getElementById("immat").value;
    data["date_immat"] = document.getElementById("date_immat").value?document.getElementById("date_immat").value:null;
    data["type_usage"] = document.getElementById("type_usage").value;
    data["composants"] = document.getElementById("composants").value;
    data["num_chassis"] = document.getElementById("num_chassis").value?document.getElementById("num_chassis").value:null;
    data["nb_kms"] = document.getElementById("nb_kms").value?document.getElementById("nb_kms").value:null;
    data["controle_qualite"] = document.getElementById("controle_qualite").value;
    data["num_contratassurance"] = document.getElementById("num_contratassurance").value;
    data["assureur"] = document.getElementById("assureur").value;
    data["debut_assurance"] = document.getElementById("debut_assurance").value?document.getElementById("debut_assurance").value:null;
    data["duree_assurance"] = document.getElementById("duree_assurance").value;
    data["statut"] = document.getElementById("statut").value?document.getElementById("statut").value:null;
    fetch(urlScooters,{
      method: queryMethod,
      body: JSON.stringify(data),
      headers: new Headers({
    		'Content-Type': 'application/json'
    	})
    })
    .then(
      (response)=>{
        if(response.status!==200){
          console.log("error");
          this.setState({
            isModifierScooterSuccess : false
          })
        }else {
          fetch(urlScooters)
          .then((response) => response.json())
          .then((responseJson)=>{
            this.setState({
              scootersData : responseJson,
              isModifierScooterModal : !this.state.isModifierScooterModal
            })
          })
          .catch((error) => {
            console.error(error);
          });
        }
      }
    )
    .catch((error) => {
      console.error(error);
    });
  }
  associerBoiter(){
    const queryMethod = "PUT";
    const url = urlScooters + '/boitier';
    let data = {};
    data['id_scooter'] = this.state.scooterConcerne['id_scooter'];
    data['id_boitier'] = document.getElementById('id_boitier').value;
    data['boitierModalType'] = this.state.boitierModalType;
    fetch(url,{
      method: queryMethod,
      body: JSON.stringify(data),
      headers: new Headers({
    		'Content-Type': 'application/json'
    	})
    })
    .then(
      (response)=>{
        if(response.status!==200){
          console.log("error");
          this.setState({
            isAssocierBoitierSucess : false
          })
        }else {
          fetch(urlScooters)
          .then((response) => response.json())
          .then((responseJson)=>{
            this.setState({
              scootersData : responseJson,
              isAssocierBoitierModal : !this.state.isAssocierBoitierModal
            })
          })
          .catch((error) => {
            console.error(error);
          });
        }
      }
    )
    .catch((error) => {
      console.error(error);
    });
  }
  associerContrat(){
    const queryMethod = "PUT";
    const url = urlScooters + '/contrat';
    let data = {};
    data['id_scooter'] = this.state.scooterConcerne['id_scooter'];
    data['id_contrat'] = document.getElementById('id_contrat').value;
    data['contratModalType'] = this.state.contratModalType;
    data['isAttribuerScooter'] = this.state.isAttribuerScooter;
    data['id_scooter_new'] = this.state.isAttribuerScooter?document.getElementById('id_scooter_new').value:null;
    data['statut'] = this.state.contratModalType===1?null:document.getElementById('statut').value;
    fetch(url,{
      method: queryMethod,
      body: JSON.stringify(data),
      headers: new Headers({
    		'Content-Type': 'application/json'
    	})
    })
    .then(
      (response)=>{
        if(response.status!==200){
          console.log("error");
          this.setState({
            isAssocierContratSuccess : false
          })
        }else {
          fetch(urlScooters)
          .then((response) => response.json())
          .then((responseJson)=>{
            this.setState({
              scootersData : responseJson,
              isAssocierContratModal : !this.state.isAssocierContratModal
            })
          })
          .catch((error) => {
            console.error(error);
          });
        }
      }
    )
    .catch((error) => {
      console.error(error);
    });
  }
  handleSelectRapportMois(mois){
    let year = parseInt(mois.split('-')[0]);
    let mois_index = parseInt(mois.split('-')[1]);
    let jourFin = year%4===0&&mois_index===2?29:month_day_select[mois_index-1];
    let date1 = new Date(mois+'-'+document.getElementById('rapport_jour').value);
    let date2 = new Date(mois+'-'+jourFin+'T21:59:59.999Z');
    let id = this.state.scooterConcerne['id_scooter'];
    let nom_scooter = this.state.scooterConcerne['num_cruisrent'];
    let dateFrom = date1.toISOString();
    let dateTo = date2.toISOString();
    let rapport_url ='report?deviceId='+id+'&from='+dateFrom+'&to='+dateTo+'&nom_scooter='+nom_scooter;
    this.setState({
      rapport_mois : mois,
      rapport_url : rapport_url
    })
  }
  handleSelectRapportJour(jour){
    let year = parseInt(this.state.rapport_mois.split('-')[0]);
    let mois_index = parseInt(this.state.rapport_mois.split('-')[1]);
    let jourFin = year%4===0&&mois_index===2?29:month_day_select[mois_index-1];
    let date1 = new Date(this.state.rapport_mois+'-'+jour);
    let date2 = new Date(this.state.rapport_mois+'-'+jourFin+'T21:59:59.999Z');
    let id = this.state.scooterConcerne['id_scooter'];
    let nom_scooter = this.state.scooterConcerne['num_cruisrent'];
    let dateFrom = date1.toISOString();
    let dateTo = date2.toISOString();
    let rapport_url ='report?deviceId='+id+'&from='+dateFrom+'&to='+dateTo+'&nom_scooter='+nom_scooter;
    this.setState({
      rapport_jour : jour,
      rapport_url : rapport_url
    })
  }
  toggle(tab) {
    if (this.state.activeTab !== tab) {
      this.setState({
        activeTab: tab
      });
    }
  }
  toggleInsertScooterModal(){
    this.setState({
      isInsertScooterModal : !this.state.isInsertScooterModal,
      isInsertScooterSuccess : true
    });
  }
  toggleAssocierContratModal(data,type){
    console.log("toggleAssocierContratModal data",data,"type",type);
    if(type===1){
      this.getAssocierContratData();
    }
    this.setState({
      isAssocierContratModal : !this.state.isAssocierContratModal,
      scooterConcerne : data,
      contratModalType : type,
      isAssocierContratSuccess : true,
      isAttribuerScooter : false
    });
  }
  toggleAssocierBoitierModal(data,type){
    console.log("toggleAssocierBoitierModal data",data,"type",type);
    if(type===1){
      this.getAssocierBoitierData();
    }
    this.setState({
      isAssocierBoitierModal : !this.state.isAssocierBoitierModal,
      scooterConcerne : data,
      isAssocierBoitierSucess : true,
      boitierModalType : type
    });
  }
  toggleModifierScooterModal(data){
    console.log("modifier data",data);
    this.setState({
      isModifierScooterModal : !this.state.isModifierScooterModal,
      scooterConcerne : data,
      isModifierScooterSuccess : true
    });
  }
  toggleInfoCompletModal(data){
    if (!this.state.isInfoCompletModal) {
      let mois_index = new Date().getMonth();
      let year = new Date().getFullYear();
      let jourFin = year%4===0&&mois_index===2?29:month_day_select[mois_index-1];
      let date1 = new Date(year+'-'+month_select[mois_index]['id']);
      let date2 = new Date(year+'-'+month_select[mois_index]['id']+'-'+jourFin+'T21:59:59.999Z');
      let id = data['id_scooter'];
      let nom_scooter = data['num_cruisrent'];
      let dateFrom = date1.toISOString();
      let dateTo = date2.toISOString();
      let rapport_url ='report?deviceId='+id+'&from='+dateFrom+'&to='+dateTo+'&nom_scooter='+nom_scooter;
      this.setState({
        isInfoCompletModal : !this.state.isInfoCompletModal,
        scooterConcerne : data,
        rapport_url : rapport_url
      });
    }else {
      this.setState({
        isInfoCompletModal : !this.state.isInfoCompletModal,
        scooterConcerne : data
      });
    }

    /*
    console.log("toggleInfoCompletModal data",data);
    */
  }
  toggleScooterContratModal(data){
    console.log("ScooterContrat data",data);
    this.setState({
      isScooterContratModal : !this.state.isScooterContratModal,
      scooterConcerne : data
    });
  }
  toggleAttribuerScooter(){
    console.log("AttribuerScooter");
    this.getAssocierScooterData();
    this.setState({
      isAttribuerScooter : !this.state.isAttribuerScooter
    });
  }
  actifFormatter(cell,row){
    if(cell){
      return <button type="button" className="btn btn-success btn-sm col">Oui</button>
    }else {
      return <button type="button" className="btn btn-danger btn-sm col">Non</button>
    }
  }
  scootersGestionFormatter(cell,row){
    /*return (

        <button type="button" className="btn btn-success btn-sm col-sm-4" onClick={()=>this.toggleModifierScooterModal(row)}>Modifier</button>
        <button type="button" className="btn btn-primary btn-sm col-sm-4" onClick={()=>this.toggleInfoCompletModal(row)}>Rapport</button>
        <button type="button" className="btn btn-info btn-sm col-sm-4" onClick={()=>this.toggleScooterContratModal(row)}>Voir Contrat</button>

    );*/
    return (

        <button type="button" className="btn btn-primary btn-sm col-sm-4" onClick={()=>this.toggleInfoCompletModal(row)}>Rapport</button>

    );
  }
  scooterStatutFormatter(cell,row){
    return (

        <button type="button" className={classnames("btn btn-sm col-sm-12",{ "btn-info" : cell===1,"btn-success" : cell===2,"btn-danger" : cell===3, "btn-warning" : cell===4})}>
        {
          this.state.statutsData.map((instance)=>{
            if(instance['id_statut']===cell) return instance['lib_statut'];
          })
        }
        </button>

    );
  }
  scootersBoitierFormatter(cell,row){
    if(!cell){
      return (
        <button type="button" className="btn btn-success btn-sm col" onClick={()=>this.toggleAssocierBoitierModal(row,1)}>Associer</button>
      );
    }else {
      return (
        <button type="button" className="btn btn-danger btn-sm col" onClick={()=>this.toggleAssocierBoitierModal(row,2)}>Dissocier {cell}</button>
      );
    }

  }
  scootersContratFormatter(cell,row){
    if(!cell){
      return (
        <button type="button" className="btn btn-success btn-sm col" onClick={()=>this.toggleAssocierContratModal(row,1)}>Associer</button>
      );
    }else {
      return (
        <button type="button" className="btn btn-danger btn-sm col" onClick={()=>this.toggleAssocierContratModal(row,2)}>Dissocier {cell}</button>
      );
    }
  }
  dateFormatter(cell){
    return cell?new Date(cell).toLocaleDateString():'';
  }
  scootersInsertButton = () => {
    return (

        <button type="button" className="btn btn-primary btn-md" onClick = {this.toggleInsertScooterModal}>Ajouter un Nouveau Scooter</button>
        <Modal className='modal-lg modal-info' isOpen={this.state.isInsertScooterModal} toggle={this.toggleInsertScooterModal}>
          <ModalHeader toggle={this.toggleInsertScooterModal}>Ajouter un Nouveau Scooter</ModalHeader>
          <ModalBody>

                  Numéro CRUIS RENT
                  <input type="text" className="form-control" id="num_cruisrent" placeholder="Numéro CRUIS RENT"/>

                  Numéro d'immatriculation
                  <input type="text" className="form-control" id="immat" placeholder="Numéro d'immatriculation"/>

                  Marque
                  <input type="text" className="form-control" id="marque" placeholder="Marque"/>

                  Modèle
                  <input type="text" className="form-control" id="modele" placeholder="Modèle"/>

                Date d'immatriculation
                <input type="date" className="form-control" id="date_immat" placeholder="Date d'immatriculation"/>

                Détail des Composants consommables
                <input type="text" className="form-control" id="composants" placeholder="Detail des composants"/>

                  Type d'usage
                  <input type="text" className="form-control" id="type_usage" placeholder="Type d'usage"/>

                  Statut
                  <select className="form-control" id="statut" placeholder="Statut">
                  {
                    this.state.statutsData.map((instance,index)=>{
                      return <option value={instance['id_statut']}>{instance['lib_statut']}</option>
                    })
                  }
                  </select>

                  Numéro de châssis
                  <input type="text" className="form-control" id="num_chassis" placeholder="Numéro de châssis"/>

                  Nombre de Kilomètres
                  <input type="text" className="form-control" id="nb_kms" placeholder="Nombre de Kilomètres"/>

                Contrôle qualité
                <input type="text" className="form-control" id="controle_qualite" placeholder="Contrôle qualité"/>

                  Assureur
                  <input type="text" className="form-control" id="assureur" placeholder="Assureur"/>

                  Numéro de contrat d'assurance
                  <input type="text" className="form-control" id="num_contratassurance" placeholder="Numéro de contrat d'assurance"/>

                  Date de début d'assurance
                  <input type="date" className="form-control" id="debut_assurance" placeholder="Date de début d'assurance"/>

                  Durée de l'assurance
                  <input type="text" className="form-control" id="duree_assurance" placeholder="Durée de l'assurance"/>

            {!this.state.isInsertScooterSuccess?Error :null}
          </ModalBody>
          <ModalFooter>
            <button type="button" className="btn btn-sm btn-success" onClick={this.addScooterData}>Submit</button>
            <button type="button" className="btn btn-sm btn-secondary" onClick={this.toggleInsertScooterModal}>Cancel</button>
          </ModalFooter>
        </Modal>

    );
  }

  createCustomToolBar = props => {
    /**
   *  This function only pass one argument, is props object which has following properties
   *
   *  {
   *    components: {  // here are all the components
   *      exportCSVBtn,  // export CSV button JSX
   *      insertBtn,  // insert button JSX
   *      deleteBtn,  // delete button JSX
   *      showSelectedOnlyBtn,  // show selected button JSX
   *      searchPanel,  // search panel JSX
   *      btnGroup,  // button groups JSX
   *      searchField,  // search field JSX
   *      clearBtn  // clear search field JSX
   *    },
   *    event: {  // here are all the related event you may use it
   *      openInsertModal,   // call it to open insert modal
   *      closeInsertModal,  // call it to close insert modal
   *      dropRow,   // call it to drop row
   *      showOnlyToogle,   // call it to toogle show only selections
   *      exportCSV,   // call it to export CSV file
   *      search  // call it with search text to search table
   *    }
   *  }
   *
   **/
    return (

            { props.components.btnGroup }

            { props.components.searchPanel }

    );
  }
  createCustomClearButton = (onClick) => {
    return (
      <button className='btn btn-warning' onClick={ onClick }>Clean</button>
    );
  }
  renderSizePerPageDropDown = props => {
    return (

        {
          [ 5, 10, 15 ].map((n, idx) => {
            const isActive = (n === props.currSizePerPage) ? 'active' : null;
            return (
              <button key={ idx } type='button' className={ `btn btn-info ${isActive}` } onClick={ () => props.changeSizePerPage(n) }>{ n }</button>
            );
          })
        }

    );
  }
  render(){
    let cur = this;
    const optionsScooters = {
      insertBtn: this.scootersInsertButton,
      toolBar: this.createCustomToolBar,
      clearSearch: true,
      clearSearchBtn : this.createCustomClearButton,
      sizePerPageDropDown: this.renderSizePerPageDropDown,
      sizePerPage: 5
    }
    return(

              <NavItem>
                <NavLink
                  className={classnames({ active: this.state.activeTab === '1' })}
                  onClick={() => { this.toggle('1'); }}>
                  Scooters
                </NavLink>
              </NavItem>
              <NavItem>
                <NavLink
                  className={classnames({ active: this.state.activeTab === '2' })}
                  onClick={() => { this.toggle('2'); }}>
                  Géolocaliser
                </NavLink>
              </NavItem>

            <TabContent activeTab={this.state.activeTab}>
              <TabPane tabId="1">

                     Gestion des Scooters

                    <BootstrapTable
                      options = {optionsScooters}
                      data={ this.state.scootersData }
                      headerStyle = { { "backgroundColor" : "#63c2de" } }
                      insertRow = {false}
                      search
                      pagination>

                      <TableHeaderColumn
                        dataField="id_scooter"
                        isKey
                        dataSort
                        hidden>
                        ID
                      </TableHeaderColumn>
                      <TableHeaderColumn
                        dataField="num_cruisrent"
                        dataSort>
                        Numéro CruisRent
                      </TableHeaderColumn>
                      <TableHeaderColumn
                        dataField="immat"
                        dataSort>
                        N° Immat
                      </TableHeaderColumn>
                      <TableHeaderColumn
                        dataField="date_immat"
                        dataSortdate
                        dataFormat={ this.dateFormatter }>
                        Date Immat
                      </TableHeaderColumn>
                      <TableHeaderColumn
                        dataField="statut"
                        dataSort
                        dataFormat={ this.scooterStatutFormatter }>
                        Statut
                      </TableHeaderColumn>
                      <TableHeaderColumn
                        dataField="nb_kms"
                        dataSort>
                        Nombre KM
                      </TableHeaderColumn>
                      <TableHeaderColumn
                        dataField=""
                        dataFormat={ this.scootersGestionFormatter }
                        tdStyle = {{"textAlign" : "center"}}
                        width = "25%">
                        Gestion
                      </TableHeaderColumn>
                    </BootstrapTable>

              </TabPane>
              <TabPane tabId="2">
                {this.state.activeTab==='2'?<Map/>:null}
              </TabPane>
            </TabContent>

          {
            this.state.isAssocierBoitierModal?
            <Modal className='modal-lg modal-info' isOpen={this.state.isAssocierBoitierModal} toggle={this.toggleAssocierBoitierModal}>
              <ModalHeader toggle={this.toggleAssocierBoitierModal}>{this.state.boitierModalType===1?"Associer un Boitier Communiquant":"Dissocier un Boitier Communiquant"}</ModalHeader>
              <ModalBody>

                    Scooter ID
                    <input type="text" className="form-control" id="id_scooter" placeholder="Scooter ID" defaultValue = {this.state.scooterConcerne["id_scooter"]} disabled/>

                    Boitier ID
                    {
                      this.state.boitierModalType===1?
                      <select className="form-control" id="id_boitier" placeholder="id_boitier" key="id_boitier">
                      {
                        this.state.boitiersAssocier.length>0?this.state.boitiersAssocier.map((instance,index)=>{
                          return <option  key={index+instance['id_boitier']} value={instance['id_boitier']}>{'ID: '+instance['id_boitier']+'\tIMEI: '+instance['imei']}</option>
                        }):<option key="non_disponible">Non Boitier Disponible</option>
                      }
                      </select>:
                      <input type="text" className="form-control"  key="id_boitier" id="id_boitier" placeholder="Boitier ID" defaultValue = {this.state.scooterConcerne["id_boitier"]} disabled/>
                    }

                {!this.state.isAssocierBoitierSucess?Error :null}
              </ModalBody>
              <ModalFooter>
                <button type="button" className="btn btn-sm btn-success" onClick={this.associerBoiter}>Submit</button>
                <button type="button" className="btn btn-sm btn-secondary" onClick={this.toggleAssocierBoitierModal}>Cancel</button>
              </ModalFooter>
            </Modal>
            :null
          }
          {
            this.state.isAssocierContratModal?
            <Modal className='modal-lg modal-info' isOpen={this.state.isAssocierContratModal} toggle={this.toggleAssocierContratModal}>
              <ModalHeader toggle={this.toggleAssocierContratModal}>{this.state.contratModalType===1?"Associer un Contrat":"Dissocier un Contrat"}</ModalHeader>
              <ModalBody>

                    Scooter ID
                    <input type="text" className="form-control" id="id_scooter" placeholder="Scooter ID" defaultValue = {this.state.scooterConcerne["id_scooter"]} disabled/>

                    Contrat ID
                    {
                      this.state.contratModalType===1?
                      <select className="form-control" id="id_contrat" placeholder="id_contrat" key="id_contrat">
                      {
                        this.state.contratsAssocier.length>0?this.state.contratsAssocier.map((instance,index)=>{
                          return <option  key={index+instance['id_contrat']} value={instance['id_contrat']}>{instance['id_contrat']+'\t'+instance['societe']}</option>
                        }):<option key="non_disponible">Non Contrat Disponible</option>
                      }
                      </select>:
                      <input type="text" className="form-control"  key="id_contrat" id="id_contrat" placeholder="Contrat ID" defaultValue = {this.state.scooterConcerne["id_contrat"]} disabled/>
                    }

                  {
                    this.state.contratModalType!==1?

                        Statut
                        <select className="form-control" id="statut" placeholder="Statut">
                        {
                          this.state.statutsData.map((instance,index)=>{
                            return <option value={instance['id_statut']}>{instance['lib_statut']}</option>
                          })
                        }
                        </select>

                        Attribuer l'autre Scooter?

                          <input type="checkbox" className="switch-input" onClick={this.toggleAttribuerScooter} />

                        {
                          this.state.isAttribuerScooter?

                            Nouveau Scooter ID
                            <select className="form-control" id="id_scooter_new" placeholder="Nouveau Scooter ID">
                            {
                              this.state.scootersAssocier.map((instance,index)=>{
                                return <option value={instance['id_scooter']}>{instance['id_scooter']}</option>
                              })
                            }
                            </select>

:null
                        }

:null
                  }

                {!this.state.isAssocierContratSuccess?Error :null}
              </ModalBody>
              <ModalFooter>
                <button type="button" className="btn btn-sm btn-success" onClick={this.associerContrat}>Submit</button>
                <button type="button" className="btn btn-sm btn-secondary" onClick={this.toggleAssocierContratModal}>Cancel</button>
              </ModalFooter>
            </Modal>:null
          }
          {

            this.state.isInfoCompletModal?
            <Modal className='modal-lg modal-info' isOpen={this.state.isInfoCompletModal} toggle={this.toggleInfoCompletModal}>
              <ModalHeader toggle={this.toggleInfoCompletModal}>Rapport Mensuelle</ModalHeader>
              <ModalBody>

                    N° CruisrRent
                    <input disabled type="text" className="form-control" id="num_cruisrent" placeholder="Scooter" defaultValue = {this.state.scooterConcerne["num_cruisrent"]}/>

                    Selectionner le mois
                    <input type="month" className="form-control" id="rapport_mois2" placeholder="Rapport Mois" defaultValue = {new Date().toISOString().slice(0,7)} onChange={(e)=>this.handleSelectRapportMois(e.target.value)}/>

                    Selectionner le Jour Début
                    <select className="form-control" id="rapport_jour" placeholder="Rapport Jour Début" onChange={(e)=>this.handleSelectRapportJour(e.target.value)}>
                      {
                        month_day_list.map((instance,index)=>{
                          if (parseInt(instance)<=month_day_select[parseInt(this.state.rapport_mois.split('-')[1])-1]) {
                            return <option value={instance}>{instance}</option>
                          }
                        })
                      }
                    </select>

              </ModalBody>
              <ModalFooter>
                <Link target="_blank" to={this.state.rapport_url}  className="text-white"><button type="button" className="btn btn-info btn-sm">Afficher</button></Link>
                <button type="button" className="btn btn-sm btn-secondary" onClick={this.toggleInfoCompletModal}>Fermer</button>
              </ModalFooter>
            </Modal>:null
          }
          {
            this.state.isScooterContratModal?
            <Modal className='modal-lg modal-info' isOpen={this.state.isScooterContratModal} toggle={this.toggleScooterContratModal}>
              <ModalHeader toggle={this.toggleScooterContratModal}>{this.state.contratModalType===1?"Associer un Contrat":"Dissocier un Contrat"}</ModalHeader>
              <ModalBody>

                  lien

              </ModalBody>
              <ModalFooter>
                <button type="button" className="btn btn-sm btn-primary" onClick={this.toggleScooterContratModal}>Close</button>
              </ModalFooter>
            </Modal>:null
          }
          {
            this.state.isModifierScooterModal?

              <Modal className='modal-lg modal-info' isOpen={this.state.isModifierScooterModal} toggle={this.toggleModifierScooterModal}>
                <ModalHeader toggle={this.toggleModifierScooterModal}>Ajouter un Nouveau Scooter</ModalHeader>
                <ModalBody>

                        Numéro CRUIS RENT
                        <input type="text" className="form-control" id="num_cruisrent" placeholder="Numéro CRUIS RENT" defaultValue = {this.state.scooterConcerne['num_cruisrent']}/>

                        Numéro d'immatriculation
                        <input type="text" className="form-control" id="immat" placeholder="Numéro d'immatriculation" defaultValue = {this.state.scooterConcerne['immat']}/>

                        Marque
                        <input type="text" className="form-control" id="marque" placeholder="Marque" defaultValue = {this.state.scooterConcerne['marque']}/>

                        Modèle
                        <input type="text" className="form-control" id="modele" placeholder="Modèle" defaultValue = {this.state.scooterConcerne['marque']}/>

                      Date d'immatriculation
                      <input type="date" className="form-control" id="date_immat" placeholder="Date d'immatriculation" defaultValue = {this.state.scooterConcerne['date_immat']}/>

                      Détail des Composants consommables
                      <input type="text" className="form-control" id="composants" placeholder="Detail des composants" defaultValue = {this.state.scooterConcerne['composants']}/>

                        Type d'usage
                        <input type="text" className="form-control" id="type_usage" placeholder="Type d'usage" defaultValue = {this.state.scooterConcerne['type_usage']}/>

                        Statut
                        <select className="form-control" id="statut" placeholder="Statut" defaultValue = {this.state.scooterConcerne['statut']}>
                        {
                          this.state.statutsData.map((instance,index)=>{
                            return <option value={instance['id_statut']}>{instance['lib_statut']}</option>
                          })
                        }
                        </select>

                        Numéro de châssis
                        <input type="text" className="form-control" id="num_chassis" placeholder="Numéro de châssis" defaultValue = {this.state.scooterConcerne['num_chassis']}/>

                        Nombre de Kilomètres
                        <input type="text" className="form-control" id="nb_kms" placeholder="Nombre de Kilomètres" defaultValue = {this.state.scooterConcerne['nb_kms']}/>

                      Contrôle qualité
                      <input type="text" className="form-control" id="controle_qualite" placeholder="Contrôle qualité" defaultValue = {this.state.scooterConcerne['controle_qualite']}/>

                        Assureur
                        <input type="text" className="form-control" id="assureur" placeholder="Assureur" defaultValue = {this.state.scooterConcerne['assureur']}/>

                        Numéro de contrat d'assurance
                        <input type="text" className="form-control" id="num_contratassurance" placeholder="Numéro de contrat d'assurance" defaultValue = {this.state.scooterConcerne['num_contratassurance']}/>

                        Date de début d'assurance
                        <input type="date" className="form-control" id="debut_assurance" placeholder="Date de début d'assurance" defaultValue = {this.state.scooterConcerne['debut_assurance']}/>

                        Durée de l'assurance
                        <input type="text" className="form-control" id="duree_assurance" placeholder="Durée de l'assurance" defaultValue = {this.state.scooterConcerne['duree_assurance']}/>

                  {!this.state.isModifierScooterSuccess?Error :null}
                </ModalBody>
                <ModalFooter>
                  <button type="button" className="btn btn-sm btn-success" onClick={this.modifierScooterData}>Submit</button>
                  <button type="button" className="btn btn-sm btn-secondary" onClick={this.toggleModifierScooterModal}>Cancel</button>
                </ModalFooter>
                </Modal>:null
          }

    );
  }
}


Walk wisely to please the King. "A servant who deals wisely has the king's favor, but his wrath falls on one who acts shamefully" (Prov 14:35).
Watch your words around the King. "Righteous lips are the delight of a king, and he loves him who speaks what is right" (Prov 16:13).
Tread carefully around the King. "A king's wrath is a messenger of death, and a wise man will appease it" (Prov 16:14).
Be genuinely godly since the King knows your heart. "He who loves purity of heart, and whose speech is gracious, will have the king as his friend" (Prov 22:11).
Be loyal to the king. "My son, fear the Lord and the king, and do not join with those who do otherwise, for disaster will arise suddenly from them, and who knows the ruin that will come from them both?" (Prov 24:21–22).
Let the King praise you in His own good time. "Do not put yourself forward in the king's presence or stand in the place of the great, for it is better to be told, "Come up here," than to be put lower in the presence of a noble" (Prov 25:6–7).
Whether or not our wisdom lets us stand before kings today, may we live to please the King both now and to hear "well done" when we stand before His throne.
We have a lot to learn from David. Thanks for sharing.


text:
Skyler Hall weighs grams of marijuana at BotanaCare 21+ in Northglenn on Dec. 31. (Craig F. Walker, The Denver Post)
Colorado lawmakers don't want to burn through pot tax revenue
Published: Feb 26, 2014, 1:41 pm • Updated: Mar 11, 2014, 7:08 am
By John Ingold, The Denver Post
Handed a budget proposal that predicts sky-high marijuana tax revenue, Colorado lawmakers say they will move cautiously in deciding how much to spend.
Last week, Gov. John Hickenlooper's budget office predicted medical and recreational marijuana sales would net Colorado nearly $134 million in tax and fee revenue in the fiscal year beginning this summer. But Rep. Crisanta Duran, the chairwoman of the legislature's Joint Budget Committee, said lawmakers aren't convinced on Hickenlooper's numbers and want to wait for a different forecast next month before estimating how much money they will have to spend.
"We really need some additional details, and we will give it a thorough review," said Duran, a Denver Democrat. "My overall concern with these totals is that it's pretty early in the process, and we don't know if this will be a long-term revenue source for the state."
Another JBC member, Sen. Kent Lambert, echoed Duran's caution, saying he would prefer to see figures for how much the state actually collected in marijuana taxes in January — the first month for recreational sales. Those figures are also expected mid-March.
"We don't know," said Lambert, R-Colorado Springs. "We need a lot more data before we could have a real estimate of what that sustained revenue will be."
Budget committee members are deep into planning next year's spending plan, and Lambert said that makes it especially difficult to evaluate and incorporate new marijuana tax projections on the fly.
"This is a moving target," he said.
But Hickenlooper's proposal doesn't call for the marijuana money to be put to general purpose. Instead, it directs all the available money — minus what is constitutionally required to go to school construction — into projects to counter the possible negative impacts of marijuana legalization. He has proposed putting $85 million over the next 18 months into youth marijuana-use prevention and into substance abuse treatment.
Duran said she supports that idea.
"I think the substance abuse dollars will be great to have an increase there," she said.
Those priorities have led to sharply divided opinions elsewhere. Mason Tvert, one of the leaders of the marijuana legalization campaign in Colorado, blasted the proposal as funding "marijuana propaganda."
Diane Carlson, a spokeswoman for Smart Colorado, a group concerned about the effects of legalization, praised the governor's proposal for addressing major issues in "a meaningful way."
One county, Pueblo, has so far reported marijuana tax figures for January, when the county says the taxes brought in nearly $56,000. More numbers are expected next month, when Denver and state officials both will report January figures and the legislature's economists give their own projection of what marijuana taxes will bring in for the state in the next fiscal year.
John Ingold: 303-954-1068, jingold@denverpost.com or twitter.com/john_ingold
This story was first published on DenverPost.com
Topics: Colorado taxes

redpajama_set_name: RedPajamaCommonCrawl


As Prince William's dream-like wedding approaches, he and his brother Prince Harry made fans' dreams come true, greeting the mob camped outside their father's estate.
"We came upon Clarence House and all of a sudden the gates opened and both princes came walking out to say hello to the crowd," said Emily Houdeshell, who believed that the princes were having their last dinner with their father Prince Charles and his wife Camilla before the big day tomorrow. "They were just so relaxed and so congenial and gracious."
We're told that the admiring crowd, fitted out in costumes, sleeping bags and tents, erupted at the appearance of William and Harry.
"They were very appreciative that there was so many people out here to cheer -- Harry especially -- to cheer his brother on," said another onlooker. "And then when Will came around, he was saying... 'Keep your coats on. It's going to be very cold tonight.'"
The royals seem to be the only ones not particularly affected by the excitement. Harry displayed his sense of humor telling fans that he hopes not to "fluff" his lines during the ceremony.


Oakland is one the most popular tourist destination in California, with a huge number of places to visit and explore. As it is the center of entertainment and attraction, it attracts a large number of visitors every year.
Oakland is one the most popular tourist destination in California, with a huge number of places to visit and explore. As it is the center of entertainment and attraction, it attracts a large number of visitors every year. When you travel to this wonderful cosmopolitan city make sure you find a perfect place to rest your head after a long day. Fortunately, there are many amazing accommodation options to consider.
One of the most stylish and comfortable hotels, Best Western Plus Bayside Hotel is located near San Francisco at the waterfront, conveniently close to the airport. Each room features a patio or balcony with a striking view of Oakland's waterway. This is among the few hotels in Oakland having free internet, free hot breakfast, free shuttle and a great number of amenities to make your stay a wonderful experience.
This new hotel offers a view of Embarcadero Cove and is one of the most relaxing and comfortable accommodations in Oakland. This three stories high building consists of comfortable guestrooms and suites. It is minutes away from popular antique shops, city center attractions and dining options. Guests can relax at the Bayside Lobby Lounge, work at the fitness center or swim in the outdoor pool. Book Now!
With its beautiful setting overlooking the marina, Homewood Suites will make you forget you are in the city. It features traditional rooms, suites and extra space by the studio. The bright lobby with floor to ceiling windows is a highlight of the place along with an outdoor pool and fitness center. Monday to Thursday, you can enjoy free beer, wine and light dinner in the evening.
Marriot City Center features refreshing rooms with a contemporary décor along with large flat-panel TVs, Spa quality rain showers and high-speed Wi-Fi. There is also a full-service restaurant, gigantic event space, concierge and business center. Being close to Central Oakland, it is minutes away from all the popular tourist spots. This hotel is popular for hosting beautiful weddings and receptions.
The iconic Hilton Oakland Airport is the best place to unwind. It offers more space and amenities than before, including luxury suites with wet bars and dining. Boasting a 12-acre resort-like setting, it features an outdoor pool, fitness center, Sports Bar and Grill, indoor and outdoor meeting space, and an onsite restaurant.
This unique boutique hotel offers first class hospitality with a wide range of amenities including plush bedding, swimming pool, in-room flat screen TVs along with all the latest technologies. With its extraordinary climate and close access to exciting attractions, it offers a refreshing getaway. Book Now!
This hotel is equipped with all the modern amenities needed by visitors in Oakland City including complimentary shuttle service, free breakfast, luxury bed linens, free breakfast and updated oversized suites perfect for leisure and business travelers alike. Located close to the San Francisco area you can experience the best of the West Coast and popular attractions at your ease. Book Now!
Being the first choice for pet-friendly hotels, Quality Inn will surprise you with its numerous facilities and perks. You can enjoy the all year round outdoor pool, unwind in the Jacuzzi and enjoy free coffee, and out-of-the-world deluxe hot breakfast with a wide range of choices. A well-equipped business center is also available to schedule meetings.
With plenty of local attractions nearby, this hotel is the best place to book on a trip with friends, family and colleagues. In-house restaurants such as Biryani Kabab and Sheba Dining have amazing food to offer. The hotel also features a meeting space, full breakfast buffet and fitness center. Book Now!
Located a mile away from the Oakland International Airport, the Econo Lodge Inn & Suites has amenities which include an outdoor pool and daily continental breakfast. Some of the local sites nearby include Oakland Zoo, Pier 39 and Lake Merritt. All rooms are furnished with warm colors, beautifully carpeted floors and a work desk to make your stay as convenient as possible.
Make your trip memorable by booking one of Top 10 hotels in Oakland that ensure the highest standard of service and a wonderful experience.


1. Inform us of your social account like Instagram, Facebook, Twitter, and Youtube.
2. We will review your account, and will contact you if you're qualified enough.
3. We will offer you a free wig to do a trial design. And you can also custom the hair color, curl pattern, and hair length.
4. Offering us at least 3 photos of the wig you or your model wearing it.
6. Share the link on your social media account or send the link to your followers and clients to begin shopping.
7. 10% of the total sales will be your commission fee.


text:
Elizabeth Liu
Self-Driving Vehicles: Legal Considerations and the Future
On February 14, 2016, a driverless vehicle owned by Google was involved in the first noted at-fault crash on a public road in Mountain View, California. The accident occurred when one of Google's self-driving vehicles (a modified Lexus SUV) rear-ended a bus. The incident was low-speed and was widely reported as being "minor" in nature; no injuries resulted.
Autonomous vehicles (also called driverless, self-driving, or robotic cars) are quickly becoming a reality and have the potential to have far-reaching consequences that go beyond the simple act of getting from Point A to Point B. At a lecture on the future of driving held at the UBC Alumni Centre on March 2, 2016, speaker Brad Templeton raised a number of interesting issues about the far-reaching and myriad effects that driverless cars will have on our daily lives. Mr. Templeton is an entrepreneur, software architect, and online civil rights advocate who more recently worked as an advisor on Google's driverless car program for two years. He is a leading voice on the topic of autonomous vehicles.
In May 2015, Google released a report saying that it was test-driving its autonomous vehicles about 10,000 miles (16,000 kilometers) per week on public streets. In September 2015, the municipality of Milton Keynes in Great Britain allowed driverless cars onto its roads, and there are plans to introduce autonomous vehicles into traffic in Greenwich, near London, in the very near future. Volvo ambitiously announced that it hopes to have 100 self-driving vehicles on the roads near its headquarters in Sweden by 2017. Meanwhile, cities around the world are clamouring to attract driverless car companies in the hopes of becoming the next Detroit or Stuttgart.
Most of the major automobile manufacturers in Germany, Japan, Korea, and the United States have all thrown their hat into the driverless car ring, and several have announced plans to roll out robotic vehicles in the early 2020s. On the other end of the spectrum, traditional giants of the tech industry are also making great strides in the area of self-driving automobiles, and according to Mr. Templeton, are outperforming their competitors in the automotive sector. The clear frontrunner by all accounts is Google, whose vehicles have self-driven over 1 million miles (over 1.6 million kilometers); the company is currently test-driving cars on public roads in California, Texas, and Washington State.
According to Mr. Templeton, the most important part of the self-driving car will be its software rather than the physical automobile itself. Developers are working on technology that will ensure that robotic vehicles are safer than those operated by humans. Currently, autonomous vehicles rely on "LiDAR", a technology combining laser light and radar (hence the name) to survey the road upon which the robotic car is driving; lidar and the vehicle's software work together to drive in the safest possible way.
The changes that the public will see with the wide-spread introduction of driverless vehicles will be similar to the radical shift that took place when the automobile was first unveiled at the end of the 19th century. As quickly as the car eclipsed the horse and carriage as the preferred mode of transportation, Mr. Templeton suggests that the driverless car will soon overshadow the "old-fashioned" automobile. Aside from changing how we view the mere act of driving, Mr. Templeton also suggests that driverless vehicles will affect us in less obvious parts of our lives. Here are some examples of the wide-reaching effects Mr. Templeton says we can expect self-driving vehicles:
Accessibility: driverless vehicles will make transportation accessible to those who traditionally are not able to drive vehicles on their own. The first member of the public to "drive" a Google vehicle was a blind man, as shown in this video.
Safety: driverless vehicles would potentially reduce (or ideally, eliminate) the number of collisions caused by impaired drivers. Autonomous vehicles will continue to build off of already-existing safety equipment (for example, self-braking vehicles) found in new vehicles currently being sold in the marketplace.
Energy and reduced environmental footprint: the potential for driverless vehicles to rely on alternative energy sources is significant, reducing our reliance on oil. Self-driving vehicles are currently being designed to be extremely efficient, and as a result, will a less deleterious effect on the environment.
Reduced traffic congestion: "smart" driverless vehicles will eventually be able to monitor traffic patterns in traditionally congested areas. Even more, parts of the urban core could be modified to maximize the efficient flow of vehicles by turning two-way streets into one-way streets depending on the needs of any particular time of day (in other words, think of a futuristic equivalent of the counter-flow lane). Self-driving vehicles that are designed for one or two people would also have the potential to increase the actual number of people on the road by squeezing a higher number of smaller-sized vehicles onto existing roadways, thereby further reducing traffic congestion.
On-demand ride services and reduced vehicle ownership: Mr. Templeton strongly believes that on-demand ride services (popularized by companies like Uber and Lyft; this service is, notably, currently unavailable in British Columbia) will become even more mainstream with self-driving vehicles, thereby reducing the desire of many individuals to own their own vehicles. In Mr. Templeton's view, using a self-driving vehicle service will become the norm as people stop buying vehicles based on what they need for their lifestyle and open up to the idea of accessing the variety offered by a fleet of ride-share vehicles based on what they may need for a particular day.
Parking: building off of the increased reliance on on-demand ride services, Mr. Templeton suggests that the need for parking lots will decrease significantly because people will no longer need to worry about parking their own vehicles. A reduced need for parking spaces opens up options for shared green space or more land for housing, and urban development and planning is changed as a result.
Increased productivity: if people no longer need to drive, Mr. Templeton suggests that many self-driving "commuter" cars may feature desks or productivity stations for riders to work, thereby increasing productivity and output.
Delivery of consumer goods: robotic cars could introduce a new era of home delivery of all forms of consumer goods. Amazon has famously tested its airborne drones, but ground-based delivery robots are also being tested by other companies.
The first Google driverless car accident raises some interesting legal questions, including:
Who will bear liability for accidents?
Will our traditional views on fault and apportionment of liability need to be revisited if there is no human tortfeasor?
Can the principles of negligence be properly extended to AI?
Will automobile insurers continue to pay for compensation to injured parties or will the burden fall upon manufacturers and/or software developers?
Will motor vehicle accident litigation involve more product liability issues?
What happens in instances where inclement or dangerous weather (for example a snow storm or black ice) is a contributing factor to an accident? Will coverage be affected?
Will impaired driving statistics fall?
Will incidents of car theft decrease?
How will liability be determined between the various companies whose components, products, and/or programs go into the making of a single driverless vehicle?
If automobile insurers remain a major player in the realm of motor vehicle personal injury cases, how will policyholders be affected?
What constitutes as "operating a motor vehicle"?
Will minors or children be able to "drive" autonomous vehicles unsupervised?
Will impaired individuals be permitted to "operate" a driverless car?
What are the legal implications if a self-driving vehicle's software is hacked and an accident results?
protected?
What medical conditions would preclude an individual from driving a motor vehicle?
Most importantly, will driverless vehicles actually be safer?
While we won't know how the law will respond to most of these questions for some time, a few answers have started to take shape. For example, the president of Volvo promised that his company would accept full liability for accidents involving Volvo vehicles while in autonomous mode. The U.S. National Highway Transportation Safety Administration stated that Google's AI would be considered a "driver" when operating its driverless vehicles. Although the driverless vehicle technology continues to be developed and refined, Mr. Templeton says that the features built into the driverless vehicles' software will unequivocally result in fewer accidents, especially fatal ones. This, he says, will have an enormous effect on the insurance industry, as premiums will decrease as the number of accidents shrinks.
How these developments will shape the law in Canada is currently unknown, but it is clear that the areas of torts, insurance, criminal law, and product liability all stand to see substantial changes in the coming decades. For the time being, though, Mr. Templeton believes that people will likely remain driving "the old-fashioned way" for several more years, even decades. Nevertheless, while the real effect autonomous vehicles will have on the everyday lives of ordinary people remains to be seen, the future is clearly not as far away as many originally thought.
Mr. Templeton's lecture "The Future of Self-driving Cars" is available as a podcast through the UBC Alumni website.
#cars #vehicle #selfdriving #autonomous #robotic #driverless #technology #future #motorvehicleaccidents #law #torts #productliability #criminallaw #Google #BradTempleton #UBCAlumni
ATE insurance
BCCA
British Columbia Supreme Court
britishcolumbia
Case Planning Conference
Certificate of Pending Litigation
charges against property
civil jury trial
conduct of proceeding
COVID-19 layoff
creditor remedies
Cyprès
disputeresolution
duty of honest contractual performance
electronic engine
elements of negligence law
Employment Standards Act
Mackoff Mohamed
1801-808 Nelson Street
Vancouver, BC V6Z 2H2
info@mackoff.ca
© 2021 Mackoff Mohamed
Vancouver Boutique Law Firm


text:
The Assamese Language
Oct 18, 2015 · 2 min
Besides being spoken India, Assamese can also be heard in Bhutan and Bangladesh.
Both the Assamese and Nepali languages have a common history in-as-much-as they derive from the Indic or Indo-Aryan languages. Just to clarify, these are the languages generally spoken in India. The following languages can also be associated with this group - Nepali, Hindi, Marathi, Bengali and Bahari.
While it's true that Hindi is the official language of India, there are a lot of different languages spoken by many, many people that are also recognized as official languages of other states, such as Bengali, Assamese, Kashmiri, Gujarati, Punjabi, Urdu, Sindhi, Telugu, Marathi, Tamil, Malayalam and Kannada. Assamese is also spoken in Bangladesh and Bhutan.
Some Characteristics of the Assamese Language –
Assamese is written with an alphabet derived from the Gupta script; which is a syllabic system of writing used from the 4th century right through to the 10th century BC. It's quite similar to the alphabets of both Bengali and Mithilakshar.
Assamese is written from left to right – top to bottom.
Number and gender are not marked, grammatically speaking.
In Assamese, adding /n/ before the verb creates the negative.
Some of the Dialects –
Generally, Assamese translation is divided into western and eastern dialects; however, other divisions have been discovered, including the following -
A central group in the districts of Morigaon, Sonitpur, and Nagaon;
An eastern group around the Sibsagar district;
The Kamrupi group in the districts of Nalbari, Kamrup, Barpeta, Darrang, Kokrajhar y Bongaigaon; parts of the districts of Kokrajhar y Bongaigoan, and the Goalpariya group in the districts of Dhubri y Goalpara.
The more we learn about India the more we begin to realize that it's such a rich and diverse country. And it's precisely for this reason, and showing respect for all the many languages spoken, that translators must be particularly careful when working with these languages. Translators and other linguistic professionals must be natives of the target language.
Image courtesy newzulu.com


to amplify what people in developing countries can do to improve their lives and eradicate poverty. Again, the task is Herculean, with the World Bank reporting that, despite a reduction in the proportion of people living in poverty in the developing world over the past 20 years from 40% to 20%, more than a billion people still struggle to survive on a dollar a day.
Successful ICT4D projects include eSagu, an IT-based personalized agricultural extension system that started in 2004 as a research project by the International Institute of Information Technology (IIIT) in Hyderabad, India and is funded by Media Lab Asia, a nonprofit organization that carries out collaborative research in developing relevant and sustainable technologies, and culturally appropriate solutions, which will improve daily life.
In India, farming is the backbone of the economy, with two-thirds of the population living in rural areas and depending on agriculture for their income. However, the farming community faces numerous problems, including a lack of timely expert advice to help farmers be more productive and competitive.
eSagu lab, usually in a city, supported by an agricultural information system. A small computer center, with a coordinator who is an educated and experienced farmer, covers a group of five or six villages. Every day, the coordinator visits farms to collect information and take photographs. A CD is then prepared and sent by parcel service—broadband is prohibitively expensive—to the main lab, where the experts analyze each farm's crop situation and prepare farm-specific advice. This is downloaded to the village eSagu center via a dial-up connection and the coordinator delivers the experts' advice to each farmer.
By closing the gap between agricultural research and practice, eSagu helps farmers improve efficiency and use pesticides and fertilizers effectively. An evaluation study showed that eSagu farms accumulated benefits worth about $89 per acre.
it started, suggests that the scalability of the system and its ability to be developed using existing infrastructure mean it could be expanded across rural India and replicated elsewhere.
"eSagu has been very successful. This year we will look at how it can be commercialized and improved further, still for the benefit of rural farmers," Reddy says.
At the Indian Institute of Technology (IIT) in Madras, professor Ashok Jhunjhunwala of the Department of Electrical Engineering, leads Tenet, a telecommunications and computer networking group that aims to bring not only telephony and Internet services to rural India, but also social improvement such as better education, agricultural development, and job creation. Jhunjhunwala also chairs a rural technology and business incubator with a mission to design, pilot, and nurture business ventures and a vision to facilitate inclusive technology and business development in rural areas.
Richard Manning Karp was recently awarded the Kyoto Award in the category of Advanced Technology for his contributions to the theory of computational complexity, which he first developed in the early 1970s by establishing the theory of NP-completeness.
had an enormous influence on the principles behind the analysis and design of algorithms used in numerous scientific disciplines.
Karp's NP-completeness theory increased the efficiency of problem solving by providing a standard method of measuring the computational complexity of combinatorial problems.
algorithms that now support the field of computer science.
Karp is the recipient of the 1985 ACM A.M. Turing Award, the National Medal of Science, and the Benjamin Franklin Medal in Computer and Cognitive Science, among other awards. He will be presented with the Kyoto Award and a $460,000 prize from the Inamori Foundation at an awards ceremony in Kyoto, Japan, in November.


text:
September 2, 2013 Featured Posts, Reviews 2 Comments
Sid Meier's Ace Patrol
Developer: Firaxis
Publisher: 2K Games
Author: Boggit
Sid Meier's Ace Patrol is a game about aerial combat on the Western Front during the First World War. As my prayers so far for a re-release of an updated, and revamped version of Achtung Spitfire, Over the Reich, and Flight Commander 2 have so far gone unanswered, I picked this one up as it seemed somewhat reminiscent of them.
The Interface is intuitive and easy to learn. The game also features a "Baron-o-pedia" for extra information.
For a game about the First World War, it is a surprisingly very "PC" game for the PC. You can't die, and you can't kill your opponents. Following the suspension of historical accuracy is that half your pilots are women, you can play the US in 1916, and you don't seem to have any limits on ammunition. Your opponent pilots seem to acquire combat victories at a surprising rate, even after you shoot them down several times, so that by the late war they often have more kills than your own aces – weird! That's about the worst of it. It's definitely NOT a "Grognard game", but in my opinion it's fun, and light relief – a good "Beer and Pretzels" game. As to gaming challenge, it offers five levels of difficulty from "Rookie" to "Legend", which gives victory point multipliers for successful missions.
The game map is clear and informative. Note the different manoeuvre options, cloud, and "Archie" cover (red hexsides). The front line is clearly evident, and can determine the fate of shot down aircrew.
Starting in 1916 you manage an alleged squadron of four aircraft! I know – more of a flight than a squadron – over four campaigns, namely the Somme, Arras, Cambrai, and the Marne, for a total of 24 missions. You can play either as American, British, French, or German. Starting planes are time appropriate, for example the British get the DH2, and the Germans the Fokker E.111. The planes are nicely drawn and coloured, and despite the slightly cartoonish appearance of it all, the graphics mesh together well, and the overall effect is quite pretty.
Combat is resolved with 3-d animations. Here my SE5 lets rip at a Fokker D.VII
Over time you get improved planes, experimental buffs for your aircraft, and as your pilots rack up kills their manoeuvre options improve, so you can over time perform split-S's, power dives, Immelmann turns, sideslips and the like.
Each turn during a campaign you can usually "choose" one of three missions. These can be high risk (read "suicide", but they aren't – because you can't die), defensive, or offensive. Typical missions involve defending or protecting balloons, recon planes or bombers, and strafing, fighter sweeps etc. I've mentioned the lack of death in the game – if you get shot down, you are either captured, or wounded depending on which side of the trench lines you are on. The game effect is to deprive the player of the pleasure of the importuned characters company for a few turns until either they escape/are released, or make a recovery. Serious aircraft damage operates the same way with the character spending time repairing their "old kite"- not that replacement aircraft, or ground crews existed for that purpose…. Other nice features include flak zones, and clouds where you can hide – it goes the other way too for your opponent. At first glance, multiplayer by PBEM, or Internet don't seem to be supported – but two player hot-seat battles are.
Combat occurs when you are in range, and in an appropriate aspect to an enemy. Several factors determine damage.
Other nice features of the game include clear, attractive graphics, character progression and skills, 3-D animations of combat, and the manoeuvre options available. It is a very engaging game, and is a lot of fun. It is not a serious wargame, but if you can overcome that, it's refreshingly different. Turned based WW1 air wargames are rare, and whilst I like Sid Meier's Ace Patrol, it made me wish all the more that a developer would take things a few stages further and re-make air war games like Achtung Spitfire, Over the Reich, and Flight Commander 2, but with the attractiveness of Sid Meier's Ace Patrol.
The Grumpy Grog says "This is a power dive to some light hearted fun."
Aerial Combat, Boggit, RTS, Tactical, WWI
2 Responses to Sid Meier's Ace Patrol
Krol says:
It seems like every review mentions the historical inaccuracy of starting the US campaign in 1916, except well, American pilots fought in 1916 under France with the Lafayette Escadrille, a mostly All American volunteer squadron.
Boggit says:
Very true. It's a fair comment.
However, the Lafayette Escadrille were under French command until early 1918, and were formally part of the French Air Service. In essence, an aerial Foreign Legion, and with a French commander too. American volunteers flew in other French squadrons as well.
As the United States did not join the conflict until 1917, and the American volunteers flew under the command, direction, and most importantly as an integral part of the French Forces in 1916, it seems appropriate for reviewers to comment that the 1916 American campaign is ahistorical.
Conversely, and whilst at short notice I can find no evidence for volunteer American pilots flying for the German Air Service, I wouldn't be at all surprised if some did. An interesting speculation though…?
Boggit 🙂


What happens if three friends and great musicians join a stage to share their love for improvisation and electronic space, jazz grooves. Nobody knows. But you can find out at the next Dizzy Jazz Session. They will perform some of their pieces and standards, but what will happen is in the open. Looking forward!
Dizzy Jazz Session: the band plays one set. After the break there is a jam session. Free entrance and feel welcome to bring your instrument.


text:
Home Games, Review Halo 4: Revisited
Halo 4: Revisited
Games, Review
343 brings Halo back
We talked about (and argued, but it's been lost to the archives) Halo 4 on the podcast but have yet to commit anything to digital ink, as it were. This is because Halo 4 felt like it deserved a bit more than a gut reaction to gameplay and graphics. This deserved some inspection into story and polish. 343 Industries did not have it easy here, they were following in the footsteps of a highly vaunted developer in Bungie. The company that along with Epic lifted the XBox up into new heights. 343 had to come in and not just keep a series fresh, but make make it their own without pissing off legions of fans. Did they accomplish this task? You'll have to read on.
If you are a longtime friend of the site than you are well aware of the battles Ash and myself have had over "ground aliens" vs "space aliens". Halo, and maybe rightfully so, always felt a bit cartoony and based in some sort of limbo fiction that didn't ever sit well with Ash, while Gears of War felt slow and just a wash of the color grey for me. Both series have arguably left these tropes behind with Gears 3 and Halo Reach, but Halo 4 could have fallen right back in step with Halo 3 and told a listless, muddled story about space religion and huge intergalactic wars. The material was there and ready to be consumed. Instead they went a different direction. The story ended up being personal and introspective. One of the internal battle Chief has over his own makeup, along with his relationship to Cortana, the AI prodding you along the path. Deeper threads of friendship and personal discovery are told. Granted this is while you shoot at aliens, but at the very least this story was something you could follow.
Am I saying that playing Halo 4 was akin to reading a Cormac McCarthy book? No, but it also doesn't read like a 14 year old boys Ender's Game Fan Fic either. The cut scenes that 343 put together were some of the most gorgeous (yes not in engine, but did you care?) and well directed in a game in recent 360 history. Chief had gravitas and personality now. He was someone who had something, and more importantly, someone to fight for. When the game's action took a break and you got to look at gorgeous out door scenery or a dramatic scene between you and the military command, it wasn't done just for effect, it furthered one of the more interesting Halo stories told. I may be biased here as a Halo fan, but other than Reach, I don't know that I've ever cared about Chief, or even Cortana. Not more than in the way that they were entertaining. Cortana wasn't my friend, she was the voice telling me to run from button to button while mowing down grunts. Chief didn't have emotion, he was a faceless any man who just happened to be 8 foot tall and a killing machine. Now he was a guy who had a past, one that he wasn't so sure about anymore. He had a friend that he would do anything for, and that is something I can understand.
This is not to say that you are just pondering your existence and that there isn't a bad guy. It isn't quite of the weight of Saren or the Illusive Man, but the Didact is palpable and the final fights where you face him are punishing. The ending (no spoilers) leaves just enough open to start guessing at the future of the series. While this may not be the strongest villain in gaming history, it is definitely a solid start for 343. I was never super enthused by the antagonists in 3. The campaign always felt confusing to me with a lot of circling around to talk about the Prophet of Truth and then the Arbiter would pop up for a second. It just felt crowded when it came to characters and villains. This time around we have a single goal, unified around the Didact and his forerunner army.
As for gameplay, Halo always felt floaty. Not in the way you could leap ridiculous heights or anything of that sort, but in the detached from your body sort of way. First person games tend to fall into this trap. Dishonored felt glidey at times and Halo always felt like a floating gun. 343 managed to give first person weight. Plus, let's just take a moment to talk about the guns. These were bar none the best guns to ever appear in a Halo game. From the first moment I fired them they sounded amazing, felt amazing, and seemed to have impact. This wasn't a gun that just made a gun sound and did some sort of damage, but the variety and power to them was unique down to each one. The Marine weapons were powerful, loud and heavy. The Covenant were light weight and quick, while the Forerunner weapons added an entirely new dimension with seemingly endless ammo at times. Yes, they each have a sniper rifle or an automatic, but there was enough differentiation that I know I preferred to have a battle rifle and the suppressor.
I gushed over the graphics in the podcast and will do a little more here, but their was not one moment in this game where the view wasn't astonishing for a 6 year old system. Light effects, atmosphere and the details in the characters were fantastic. Everything felt alive and moving. I know Halo has a style to it, but damn if 343 didn't pretty it up. The forest didn't feel bland or flat, but alive and terrifying. I knew those damn dogs were going to pop out at any moment, or would be hiding up in a tree. There was no scooby doo effect of something looking different so I'd interact with it. Everything was there and blended into part of the scenery. While it was definitely "on rails" like all Halo games, the atmosphere ended up making me feel less restricted even though I was on a predefined path.
Last up is multiplayer. Scott, Ash, Derek and myself sat down for a few rounds of Spartan ops and while it usually is pretty hard to screw up cooperative multiplayer, they managed to step it up a notch. Voice acting by Jennifer Hale sounded great and having a little story to go along with your on screen battle helps. We were all laughing and having fun with the excessive amounts of weapons and a difficulty that felt ratcheted up for the amount of players we had in game. There is more depth to be explored here, but on first glance, Spartan Ops will keep me coming back.
Over all this game felt polished and like one hell of a shot across the bow. If you had any doubt, much like myself, that these guys would deliver, let those feelings be vanquished because they nailed it. Is Halo 4 the best game ever? No, but it is one of the best Halo's ever, and that is saying a lot. Would it have made it into my top 10(ish) on the podcast had I finished it before then? Yes, I think it might have. It would have been extremely close. The only thing that would keep it out is that it isn't a surprise because it is a Halo title. It IS a surprise because it's 343, but that was one of the best surprises I've had all year. Here's to many more where this came from, I'm now officially looking forward to Halo 5.
343 IndustriesBungiecortanaHalohalo 4land aliensMaster Chiefspace aliensxbox 360
Battlefield 3: first game play trailer.
Battlefield 3 boasts a brand new Frostbite 2 engine,along with mo-cap and modeling stolen from EA sports. That means it looks INSANE.
Help Us Interrogate Bioware Scribe Patrick Weekes!
We appreciate games with great writing and are happy to have author Patrick Weekes on episode 75 of the Rated NA Podcast. Mr. Weekes will be joining us tomorrow from the wilds of Canada to discuss his brand new novel "The Palace Job", which is available now on Amazon.com. If you have any questions for Mr. Weekes about Mass Effect, Bioware, writing, or The Palace Job, please ask here or send us a message on Twitter @NerdAppropriate.
Minion Master Unleashes Innovative Strategy Today!
If your a fan of strategy, tabletop, miniatures, or card games, have we got a game for you. Lucky for you, it's available now!
PoVGamingtv December 30, 2012 at 12:45 am
@NerdAppropriate ugh i still need to play this…
Ash January 1, 2013 at 1:46 pm
I was pretty shocked by how much I enjoyed Halo 4. Has any other studio in history made a sequel vastly superior to the original?
FTL – Faster than Light is your new sci-fi strategy addiction
I See the Future: Five Amazing Things That Will Happen in 2013


The Gap of Dunloe is a wild place, located in the heart of County Kerry in the South West of Ireland. It is a region rugged mountains and wild coastlines lake-valleys and ancient woodlands, islands and fertile plains.
It is a place where the power of nature is evident everywhere and overlaying this natural history is a one of the richest stories of human history in the world.
From Gleann Fia Country House, daily trips are arranged through the Gap of Dunloe, by way of walking, cycling or jaunting car, returning using lake boats through the 3 lakes of Killarney from Lord Brandon's Cottage to Ross Castle.


red ruby pendant sterling silver classic square created red ruby pendant bi jewelry.
ebelskiver pan i was able to buy a nonstick pan.
plunger measuring cup 2 cup adjustable measuring cup dispenser.
suddenlink el dorado ar r woodland.
bronze bathroom sink faucet bronze bathroom faucet swan shape oil rubbed bronze bathroom tub faucet with interior decor minimalist.
in wall safe best wall safes.
best price on snow blowers pro two stage snow blower.
door trims door trims mouldings door trim styles interior door trim moulding best accessories home interior door casing door trims.
grey king quilt quilt cover set range grey shop.


Blockchain Address 101: What Are Addresses on Blockchains?
Blockchain Address 101. Blockchain Addresses are an important concept in cryptocurrencies and blockchains. In our guide, we explain. What addresses are, how they are created and what the differences between different kind of addresses on different blockchains are.
In the early days of Bitcoin, it was possible to send payments to an IP-address like 104.25.248.32 (which is blockgeeks.com). This was planned to be a convenient method to use Bitcoins without dealing with unhandy public keys and addresses. However, after the Bitcoin developers realized that this way of sending coins could be subject to serious man- in-the-middle-attacks, the option was disabled and did never come back.
This anecdote of Bitcoin's early days seems to have mostly historic values. But it demonstrates what an address is: It is not something special or something set in stone. It is just a placeholder to accept and send blockchain transactions. Like an IBAN or SWIFT address.
The address itself doesn't matter, nor does its format. The only thing matters are that the address serves its purpose – to enable payments to an entity which has a unique information. Usually, a private key, to exclusively access the funds. The address is nothing but a secure identifier.
However, while SWIFT or IBAN numbers are assigned by central authorities like banks, blockchain addresses exist. Every blockchain address possible already existed, long before a wallet found it. The reason is that blockchain addresses are the result of a mathematical operation.
A standard P2PKH address has something like 34 signs and starts with a 1. P2PKH is the abbreviation of "Pay To Public Key Hash." This means that you Pay to a hash of a public key. For beginners, this might sound intimidating complex, so let's wait through the process of building such an address to learn what it is.
Every wallet software you use can easily create a P2PKH address, or, to be more precise: find as many of it as you want. It is no rocket science, but a combination of several non-exceptional cryptographic operations.
First, your wallet collects entropy and uses it to generate an ECDSA private key. ECDSA is the cryptographic algorithm in the core of Bitcoin addresses. It is an asymmetric signature algorithm, which means that you can sign messages with the PRIVATE key and verify the signature with the PUBLIC key. With ECDSA you can give the world easily the information to prove that you – and only you – are the author of a message by signing it. It's very similar to physically signing a letter.
So, after creating the private key with entropy, the wallet derives the public key from it. It does so by picking some random coordinates on a certain elliptic curve and doing some calculations. Details are not important. What matters ist, which this public key is all you need to send and collect payments. In the early days, the public key was used to receive funds.
But very soon the concept was extended. The public key is not only very long and unhandy – around 65 characters – but can also be subject to typing errors. Further, exposing it can also set you on risks if ECDSA is ever broken, for example by quantum computing. This is why the Bitcoin developers created a method to derive an address from the public key.
The software hashes the public key with SHA 256 and the result with RIPEMD-160. Then it adds the bytes 00 as a prefix in the beginning of the resulting string – this is the reason why P2PKH addresses start with a "1" – and four checksum-bytes at the end. The four checksum bytes are generated by hashing the result twice with SHA 256 and taking the first four bytes. Then your wallet converts the result into a base58 string. And voilá: we have the Bitcoin address we know and we love.
You don't need to understand the cryptographic details. What's important is that the address represents a public key in a better readable way and adds a checksum which prevents that you fall victim to a typing error. Whenever you paste an address in your Bitcoin wallet, it checks the prefix and calculates the checksum. If it doesn't match, it rejects the address. This makes it impossible to send funds to a wrong address due to a typing error.
If you have the private key for an address, only you can sign a transaction with cryptocurrency token assigned to this address – while everybody who knows your address can verify the validity of your signature. This simple process – signing a transaction, verifying the signature – is more or less everything a cryptocurrency transaction does.
But Bitcoin has more advanced addresses: the so-called P2SH addresses. This abbreviation stands for "Pay to Script Hash". It means that you don't pay to the hash of a public key, but to the hash of a script. To sign a transaction you don't have to provide the signature matching a certain public key, but a script matching a certain hash. This kind of addresses enable more flexible methods to verify yourself, for example, those that are used in multisig-addresses, in which two parties provide information which sums up to the needed script. These addresses use the prefix 05, which is the reason why they start with a "3".
However, it needs another guide to completely describe the magic of P2SH addresses. Here we focus on addresses itself and leave Bitcoin to have a look, how other cryptocurrencies create addresses.
A lot of cryptocurrencies use nearly the same address format as Bitcoin. For example, Litecoin, Dash, and Dogecoin deploy the same cryptographic procedures to generate an address: ECDSA, SHA 256 and RIPEMD 160.
The only difference is the prefix of the RIPEMD-160 hash. While Bitcoin's prefix 00 results in addresses starting with a "1", Altcoins like Dash, Litecoin or Dogecoin use other prefixes so that the addresses start with "L" (Litecoin), "X" (Dash) or "D" (Dogecoin).
As these coins use the same cryptographic algorithm, you can use the same private and public keys to save coins in all these cryptocurrencies. Partly you can even store them on the same addresses. For example, Litecoin and Bitcoin use the same prefix for P2SH addresses – 05 – so that it is possible to store both Bitcoin as Litecoin at the same address.
Other cryptocurrencies, however, use other schemes to generate the address. For example, Monero is based on the Cryptonote algorithm. This algorithm deploys another cryptographic signature algorithm to generate the public key, EdDSA. Cryptonote currencies have so-called ring signatures, which provide more privacy, as you can't determine which key a transaction was signed. For this reason, Cryptonote addresses must contain two public keys, a view, and a spend key.
This variety of addresses demonstrates, again, that addresses are just a mean to accept a payment which is assigned to a certain public key. For this base function, it does not matter what you do with the public key, what cryptographic algorithm you apply to convert it to an address, and how the address looks.
The building procedure of an address, however, can have an important implication on security, privacy, and usability. Without the checksum integration, Bitcoin address could be mistyped, and without the integration of the view key in the address, Monero would be not as private as it is. A look at Ethereum's addresses further establishes this insight.
Like many things in cryptocurrency, the topic of addresses starts to get really intriguing when it comes to Ethereum. Many people who started with Bitcoin and then trying Ethereum are puzzled with the address format, which is a long, hexadecimal string starting with 0x, for example, "0x0eb81892540747ec60f1389ec734a2c0e5f9f735".
Technically, Ethereum's address generation is similar to Bitcoin's, but does not take the whole way. You start with a private key and use ECDSA to generate a 64-byte public key. Like we know from Bitcoin. Then you hash this key with Keccak-256. The result is a 32-byte string. The first 12 of these bytes are dropped, the remaining 20 bytes are a 40 character address, to which usually the prefix 0x is added. That's it. Other than Bitcoin or Cryptonote, Ethereum does not transform the address to base58, so it is in hexadecimal (0-F).
Another difference between Ethereum and other cryptocurrencies is that Ethereum addresses have no checksum. Any hexadecimal 40 character string can be an Ethereum address, which is the reason why Ethereum developers heavily dissuade users to manually type such an address, as a single typing error can result in the loss of funds.
Compared with the addresses of other cryptocurrencies, Ethereum addresses seem to be unfinished, gross and recklessly dangerous for the user. For a cryptocurrency which has the second largest market value and is promoted as the most innovative cryptocurrency at all, this seems to be surprisingly low level.
The initial reason for this was that, when Ethereum's first version, Frontier, was released, nobody really cared. What we today use as addresses were never intended to be permanently used as such. From the beginning, Ethereum developers aim to build a smart contract based name register, with which payments can be easily sent to names or domains and so on. In the long term, with Ethereum, cryptocurrency can close the circle and come back to the easy to use payment Satoshi intended when implementing Pay to IP.
However, as Jeff Coleman points out, there is another, a maybe more important reason that Ethereum does not use crafted addresses like Bitcoin: The developers think it can be done better. Remember, an address is just a cryptographic method to represent the needed information to assign funds to a private key. This can be done with contracts that assign this information to names, but this can also be done with more sophisticated address formats than Bitcoin uses.
Like Bitcoin addresses, it uses base58 characters and includes a checksum.
"But that's not all, folks! For one thing, the ICAP is a fully valid International Bank Account Number (or IBAN)," Coleman explains, "That means that existing bank software can understand it and interact with it." IBAN is the international identifier of client accounts in the banking industry. It consists of 32 case insensitive alphanumeric characters, containing a country code, a checksum, the bank number as well as the account number. ICAP uses an XE as a country identifier and string of 16 to 30 alphanumerical characters which includes information like account, asset, checksum or institution.
Colemen goes on: "For another, the ICAP doesn't have to use hexadecimal addresses. Instead, once we all do switch over to using name reg contracts it can just use your actual human readable string to end up with something like "XE81ETHXREGJEFFCOLEMAN", which still matches bank formats but might be possible actually to remember!". In the long run, Ethereum addresses could become memorable and compatible with the existing banking system.
The support for ICAP addresses is currently growing. The usual clients already enable the generation of ICAP addresses, but still, use the legacy address as a standard. To make this more secure, Vitalik Buterin developed a little improvement to add checksums in the form of capitalization. With EIP55 generated addresses, upper cases serve as a checksum. So if an address has at least one capital letter, it will be invalid, if you make a typing error.
The cryptocurrency STEEM already implemented a system similar to what Ethereum aims to achieve. In STEEM your username is your wallet address.
STEEM is a cryptocurrency based on the BitShares concept. It is interlinked with the social platform Steemit, where users can "mine" Steem-coins by collecting upvotes for posts. This "subjective proof of work" is a clever combination of Proof of Stake and Proof of Work. The system as a whole is relatively complex, as it contains "delegates", which are elected to do the proof, and three forms of token, STEEM, STEEM power and STEEM Dollar; also it is hard to assess if STEEM is as decentralized as Bitcoin and Ethereum, as large parts of it are based on the privately hosted platform Steemit, which is the main client of Steem. There seem to be no other wallets available.
However, the address concept is intriguing. In a more centralized way, STEEM implemented what Ethereum aims to build with smart contract name registrars: The users gets a private key, which he can use to sign his transaction, like with any other cryptocurrency. Addresses, however, are no cryptographic derivation of the private key, but just the usernames on Steemit. Probably these usernames are connected to the public key in a public database on Steemit, so that, at least, it is possible for every user to validate a transaction. But still, the most important part of the validation – the connection between public key and address – is not based on math, but on trust to the platform Steemit.
The username based address scheme of STEEM is interesting because it provides an ideal usability. But its centralized and trusted nature makes it inadequate for most blockchain use cases, which aim to decentralize verification and substitute trust with math. At least, the system lacks transparency.
A smart contract based name registrar, like Ethereum, aims to build on top of its blockchain, however, could combine the best of both worlds: the decentralized, trustless nature of Bitcoin – and the ease of use of STEEMs name based addresses.


text:
News Archives for Apr, 2010
Portable Pocket Projector Sales Set to Surge - 05/01/2010
Marketing Tools: Automate Your Follow Up - 04/30/2010
Color Printers: The Epson B-510DN Review - 04/30/2010
Digital Signage for Small Business - 04/29/2010
Easy Remote Access with PogoPlug - 04/29/2010
Build and Manage a Small Business Website with Intuit - 04/28/2010
Small Business Software: Survey Forms in Word 2007 - 04/28/2010
Free Windows 7 Compatibility Tool for SMBs - 04/27/2010
Microsoft SMB Specialists See 2010 Spending Rise - 04/27/2010
Web Tools: Blogging as a Marketing Strategy - 04/26/2010
The Toshiba Tecra A11 Notebook Computer Review - 04/26/2010
Marketing for Small Business: Create a Referral System - 04/23/2010
What SMBs Don't Know About Security Can Hurt You - 04/23/2010
Zmanda's Data Backup: Enterprise Quality, SMB Prices - 04/22/2010
Customer Databases as Marketing Tools - 04/21/2010
Marketing Strategies for Entrepreneurs, Hulu Style - 04/20/2010
Web Marketing: Google Courts SMBs With 'Places' - 04/20/2010
Microsoft Launches 'Fix It Center' for SMBs - 04/19/2010
Ringio Brings the Enterprise Call Center to the SMB - 04/19/2010
Review: HP Compaq 6005 Pro Desktop Computer - 04/19/2010
Marketing Tips: Email Management Strategies - 04/16/2010
Cisco Switches Up Entry-Level SMB Networking - 04/16/2010
KineticD Merges Cloud Storage, Remote Access for SMBs - 04/15/2010
Lenovo ThinkPad Edge Notebook PC Review - 04/14/2010
Online Advertisers Resume Paying Big Bucks - 04/14/2010
Endpoint Security: How to Protect Data on a Laptop - 04/13/2010
Twitter Makes a Move to Marketing - 04/13/2010
Small Business SEO: How to Use Google Analytics - 04/12/2010
Top 50 Mobile Apps for iPad - 04/12/2010
Internet Marketing Tools: Organic vs Pay Per Click - 04/09/2010
Faster, Safer Web Browsing with Third Party DNS - 04/09/2010
What's an App Store, and Why Should You Care? - 04/08/2010
Small Business Software: 7 Tips for Excel Charts - 04/08/2010
Unified Communications Tie Phone Line to Bottom Line - 04/07/2010
35 iPhone Apps to Boost Productivity - 04/07/2010
Why SMBs Should Consider Server Virtualization - 04/06/2010
The iPad Arrives: Mobile Toy or Mobile Tool? - 04/06/2010
Marketing Tips: Embed Ads in Video - 04/05/2010
A Portable Projector: HP Notebook Projection Companion - 04/05/2010
Small Business Marketing Tips: Managing Contacts - 04/02/2010
When Windows Breaks, Call Ubuntu Linux - 04/02/2010
Top 10 Free Small Business SEO Tools - 04/01/2010
Wireless Networking for a Small Business at Home - 04/01/2010


Pre-qualify for FHA mortgage financing (888)951-2929.
Apply for a Grant Now at (888)951-2929.
Pre-Qualify now for Home Possible® at (888)951-2929.
Pre-Qualify for a USDA Home Loan (888)951-2929.
Local VA Mortgage Brokers (888)951-2929.
Mortgage Brokers are ready to assist you with Non-Prime Home loans (888)951-2929.
Get your Home Renovation Questions answered now (888)951-2929.
Our Licensed Mortgage Brokers are ready to assist you at (888)951-2929.
Find out how much cash is available now (888)951-2929.
Find out if you qualify for a Cash Out Refinance (888)951-2929.
Start your Rate and Term Refinance now (888)951-2929.
Find out if you Qualify for HARP (888)951-2929.
Get a low rate fixed mortgage quote now (888)951-2929.
Mortgage Brokers are ready to assist you now (888)951-2929.
Apply now for FHA Streamline Refinancing (888)951-2929.
VA Mortgage Brokers are standing by to see if one of these options is right for you. (888)951-2929.
Start your VA IRRRL now (888)951-2929.