Centos 6.5 Postfix+Dovecotでvirtual mailboxアカウント追加

vmailboxファイルの編集

/etc/postfix/vmailboxにアカウントを追加

test@sample.com sample.com/test/Maildir/

vmailboxファイルの更新

sudo postmap /etc/postfix/vmailbox 

コマンドを実行し更新処理をします。

SMTPAuthのパスワード設定

saslpasswd2 -u sample.com -c test

ハッシュ化されたパスワード文字列はdovecot pwコマンドで作成

dovecot pw -s CRAM-MD5

passwdファイルの編集

sudo nano /etc/dovecot/passwdを編集します。
test@sample.com:{CRAM-MD5}************************

以上

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

Zaif web オーダーツール

Zaifさんへの注文はオフィシャル画面で通らないときがあり、果たして画面がフリーズとなり、売買タイミングが失ってしまう。なので注文が板に載せるまで注文リクエストを繰り返すできるようなツールを作成した。

主な機能

1)資産、価格情報を取得する。
2)買い注文・売り注文を出す。
3)投げた注文の状況を確認する。
4)投げた注文を取り消す。

環境

python3.6 or above、Flask、zaif-client

実装手順

$git clone https://github.com/soarbear/zaif-order-tool.git
$cd zaif_order_tool
$sudo pip3 install flask
$sudo pip3 install zaif-client
$python3 app.py

→ブラウザを立ち上げて http://localhost:5000/ にアクセスしてみる。

免責事項

このツールのご利用は自己責任でお願いします。

ソースコード

ソースコードはgithubに公開済み→github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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
0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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

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

ShoppingController.phpの修正

/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を以上のように修正する必要ある。

以上

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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

決定木の再帰

# 葉っぱの数を取得する
def getNumLeafs(myTree):
    numLeafs = 0
    firstStr = myTree.keys()[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]) is dict:
            numLeafs += getNumLeafs(secondDict[key])
        else:
            numLeafs += 1
    return numLeafs

# 木の深さを取得する
def getTreeDepth(myTree):
    maxDepth = 0
    firstStr = myTree.keys()[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]) is dict:
            thisDepth = 1 + getTreeDepth(secondDict[key])
        else:
            thisDepth = 1
        if thisDepth > maxDepth:
            maxDepth = thisDepth
    return maxDepth

以上

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア