ccxt非同期アクセス時間についての検証

zaifさんから1 tickerと4 tickersの取得を例に検証してみる

# -*- coding: utf-8 -*-
import asyncio, os, sys
from time import time

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root + '/python')
sys.path.append('/usr/local/lib/python3.6/site-packages/ccxt')
import ccxt.async_support as ccxt

PAIRS = ['BTC/JPY', 'BCH/JPY', 'XEM/JPY', 'MONA/JPY']

async def test(exchange, pair):
    print(await exchange.fetch_ticker(pair))
    if pair == 'MONA/JPY': await exchange.close()

def main():
    zaif = ccxt.zaif({
        'apiKey': "",
        'secret': "",
        'verbose': True,
    })
    start_time = time()
    asyncio.get_event_loop().run_until_complete(test(zaif, 'BTC/JPY'))
    mid_time = time()
    [asyncio.get_event_loop().run_until_complete(test(zaif, pair)) for pair in PAIRS]
    print(f"[info]downloaded time of 1 pair :{mid_time-start_time}s")
    print(f"[info]downloaded time of 4 pairs:{time()-mid_time}s")

if __name__ == '__main__':
    main()

検証結果

4tickersと1tickerの時間はあまり変わってないので、非同期の動きが検証できたと思われる

[info]downloaded time of 1 pair :0.13094758987426758s
[info]downloaded time of 4 pairs:0.13180255889892578s

検証環境

ubuntu 14.04
python 3.6.3
cctx 1.16.11

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

EC-CUBE3.0.10 同じ商品まとめて購入割引機能追加

同じ商品まとめて購入割引機能

/src/Eccube/Controller/ShoppingController.phpのindex confirm関数の// form作成の上に下記追加

        // 同じ商品5個まとめて購入、5%割引
        $discount = 0;
        foreach ($cartService->getCart()->getCartItems() as $CartItem) {
            if ($CartItem['quantity'] > 4) {
                $discount = $discount + (int)($CartItem['quantity'] * $CartItem['price'] * 0.05);
            }
        }
        if ($discount > 0) {
            $total = $Order->getTotalPrice() - $discount;
            $Order->setDiscount($discount);
            $Order->setTotal($total);
        }

        // form作成
        $builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order);

カード決済の場合、Plugin直下のカードControllerを以上のように修正する必要あり

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

Python3再帰動作検証~決定木まで

Pythonバージョン確認

C:\recurse>py -V
Python 3.6.5

再帰動作検証その1

自然数1~5の足し算

# file_name: recurse.py
def recurse_add(n):
    if n==1:
        return 1
    return n + recurse_add(n - 1)
if __name__ == '__main__':
    recurse_add(5)

Stackの様子を見てみよう、下から上の順にPush、逆のほうからPop(LIFO)

recurse_add(1)
2+recurse_add(1)
3+recurse_add(2)
4+recurse_add(3)
5+recurse_add(4)

再帰動作検証その2

フォルダーc:/recurse/直下のサブフォルダー、ファイル名を階層で表示

Pythonコード

# file_name: recurse.py
import os
FOLDER = "c:/recurse/"
def main():
    counter_recurse = 0 # 再帰counter初期化
    print_files(FOLDER, counter_recurse) # folderとsub_folerのfilesをプリントする
def print_files(folder, counter_recurse): # 再帰関数の入り口
    for f in os.listdir(folder):
        full_name = folder + f # PATHつきfile名 または folder名
        if os.path.isdir(full_name): # folderの場合
            # folder名プリント
            print(" " * 5 * counter_recurse + f + ", counter_recurse =" , counter_recurse)
            counter_recurse = counter_recurse + 1 # folder名プリント
            print_files(full_name + "/", counter_recurse) # 再帰、スタックにプッシュ、LIFOでポップ
            counter_recurse = 0 # 再帰counterリセット、再帰毎終了時に実行
        elif os.path.isfile(full_name): # fileの場合
            print(" " * 5 * counter_recurse + f) # file名プリント
if __name__ == '__main__':
    main()

確認

C:\recurse>py recurse.py
file_in_recurse.txt
folder1, counter_recurse = 0
     folder2, counter_recurse = 1
          folder3, counter_recurse = 2
               folder4, counter_recurse = 3
                    file_in_folder4.txt
folder5, counter_recurse = 0
     folder6, counter_recurse = 1
          folder7, counter_recurse = 2
               file_in_folder7.txt
recurse.py

決定木の再帰

coming soon
以上

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

16m、薄型、ROS対応レーザスキャナ YDLIDAR G4

YDLIDAR_G4
YDLIDAR_G4

SLAM LIDAR-YDLIDAR G4の主なスペックは以下のとおり

・寸法 72mm(直径) x 41mm(厚さ)
・検出方法 360度回転式・三角法
・検出距離 max 16m
・サンプリング周波数 max 9kHz
・回転周波数 max 12Hz
・環境光 2kLux
・ROS対応

YDLIDAR G4 vs RPLIDAR A2M8 主なスペック比較

仕様 YDLIDAR G4 RPLIDAR A2M8
メカニズム 360度モータ回転式 360度モータ回転式
計測法 三角法 三角法
ROS対応
寸法 Φ72mm x H42mm Φ76mm x H41mm
本体重さ 214g 200g
最大起動電流 550mA 1500mA
定格電圧電流 5V450mA 5V500mA
検知距離 0.1~16m 0.15~12m
回転周波数 5Hz~12Hz 5Hz~15Hz
レンジ周波数 4kHz~9kHz 2kHz~8kHz
距離分解能 <0.5mm(0.10~2.0m)、距離の1%以下(2.0m~16m)   0.5mm(0.10~1.5m)、距離の1%以下(1.5m~12m)  
角度分解能 0.3度(回転周波数7Hz) 0.45~1.35度
規模応用例   あり、EAI Robot あり、Slamtec Robot

・詳細&商品リンク YDLIDAR G4 | ロボット翔-電子部品ストア

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

Laravel 5.1(5) MongoDB多重Eloquent Relationship実践

準備:テスト用コレクション情報

まず、テスト用のコレクション(例)を用意します。

概要

・Collection種別は、上位から病院コレクション(hospitals)→診療科別コレクション(categories)→病気コレクション(diseases)
・Relatonship種別は、1:Mタイプ、親collectionの場合hasMany、子コレクションの場合belongsToに指定する
・Relatonship紐づけは、_id、category_id、disease_idに指定する、他デフォルト利用の場合もある

コレクションの構造と内容

$hospitals = App\Hospital::all()
=> Illuminate\Database\Eloquent\Collection {#977
     all: [
       App\Hospital{#999
         _id: MongoDB\BSON\ObjectId {#976
           +"oid": "5a7d0901f1a5e421d37a12e2",
         },
         name: "hospi",
         created_at: "2018-01-16 02:01:03",
         updated_at: MongoDB\BSON\UTCDateTime {#975
           +"milliseconds": "1518231495000",
         },
       },
    ],
   }
$categories = App\Category::all()
=> Illuminate\Database\Eloquent\Collection {#977
     all: [
       App\Category {#999
         _id: MongoDB\BSON\ObjectId {#976
           +"oid": "5a7d0901f1a5e421d37daac2",
         },
         hospital_id: "5a7d0901f1a5e421d37a12e2",
         name: "Nerve",
         created_at: "2018-01-16 02:01:03",
         updated_at: MongoDB\BSON\UTCDateTime {#975
           +"milliseconds": "1518231495000",
         },
       },
    ],
   }
$diseases = App\Disease::all()
=> Illuminate\Database\Eloquent\Collection {#977
     all: [
       App\Disease{#999
         _id: MongoDB\BSON\ObjectId {#976
           +"oid": "5a7d0901f1a5e421d37d090d0",
         },
         category_id: "5a7d0901f1a5e421d37daac2",
         name: "Cerebral Bleeding",
         created_at: "2018-01-16 02:01:03",
         updated_at: MongoDB\BSON\UTCDateTime {#975
           +"milliseconds": "1518231495000",
         },
       },
    ],
   }

Model構築

以下ソースにコメント割愛とします。

Hospital Model

class Hospital extends Eloquent
{
    protected $collection = 'hospitals';
    protected $connection = 'mongodb';
    protected $fillable = ['name' , 'description'];
    public function categories() 
    {
        return $this->hasMany('App\Category', 'hospital_id', '_id');
    }
}

Category Model

class Category extends Eloquent
{
    protected $collection = 'categories';
    protected $connection = 'mongodb';
    protected $fillable = ['hospital_id' , 'name' , 'description'];
    public function hospital() 
    {
        return $this->belongsTo('App\Hospital','hospital_id', '_id');
    }
    public function diseases() 
    {
        return $this->hasMany('App\Disease','category_id', '_id');
    }
}

Disease Model

class Diease extends Eloquent
{
    protected $collection = 'diseases';
    protected $connection = 'mongodb';
    protected $fillable = ['categoy_id' , 'name' , 'description'];
    public function category() 
    {
        return $this->belongsTo('App\Category','category_id', '_id');
    }
}

Collection作成

hospitals Collection

class CreateHospitalsCollection extends Migration
{
    public function up()
    {
        Schema::create('hospitals', function (Blueprint $collection) {
            $collection->string('name');
            $collection->string('description');
            $collection->timestamps();

         });
    }
    public function down()
    {
        Schema::drop('hospitals');
    }

categories Collection

class CreateCategoriesCollection extends Migration
{
    public function up()
    {
        Schema::create('categories', function (Blueprint $collection) {
            $collection->string('hospital_id');
            $collection->string('name');
            $collection->string('description');
            $collection->timestamps();
            $collection->foreign('hospital_id')
                       ->references('_id')
                       ->on('hospitals')
                       ->onDelete('cascade');
         });
    }
    public function down()
    {
        Schema::drop('categories');
    }

diseases Collection

class CreateDiseasesCollection extends Migration
{
    public function up()
    {
        Schema::create('diseases', function (Blueprint $collection) {
            $collection->string('category_id');
            $collection->string('name');
            $collection->string('description');
            $collection->timestamps();
            $collection->foreign('category_id')
                       ->references('_id')
                       ->on('categories')
                       ->onDelete('cascade');
         });
    }
    public function down()
    {
        Schema::drop('diseases');
    }

・DBに反映する。

composer dump-autoload
php artisan migrate:refresh --seed

Relationship検証

上位→下位の順にて参照また下位→上位の順にて参照

$ php artisan tinker

hospital→categories

>>>$hospitals = App\Hospital::all()
>>>$hospitals= hospitals->first()
>>>$category= $hospital->categories->first()

category->hospital

>>>$categories = App\Category::all()
>>>$category = $categories->first()
>>>$hospital = $category->hospital

category->disease

>>>$categories = App\Category::all()
>>>$category = $categories->first()
>>>$diseases = $category->diseases

disease->category

>>>$diseases = App\Disease::all()
>>>$disease = $diseases->first()
>>>$category = $disease->category

hospital→diseases

>>>$hospitals = App\Hospital::all()
>>>$hospital  = hospitals->first()
>>>$diseases = $hospital->categories->first()->diseases

disease->hospital

>>>$diseases = App\Disease::all()
>>>$disease = $diseases->first()
>>>$hospital= $disease->category->hospital

$hospital、$category、$diseaseがうまく表示されたら、紐付けができたことが検証済み。
Null、Errorが表示された場合、どこかで入力ミスあるか確認する。

上位から紐づけまた下位から紐づけして保存

>>>$hospital->categorys()->save($category)
>>>$category->diseases()->save($disease)

>>>$category->hospital()->associate($hospital)
>>>$disease->category()->associate($category)

以上。

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい