So Tired !_! 逆水行舟, 不进则退!

28Feb/18

一步步教你创建自己的数字货币(代币)进行ICO

Posted by Nick Xu

本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程.

写在前面

本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么

代币Token

如果不那么追求精确的定义,代币就是数字货币,比特币、以太币就是一个代币。 利用以太坊的智能合约可以轻松编写出属于自己的代币,代币可以代表任何可以交易的东西,如:积分、财产、证书等等。 因此不管是出于商业,还是学习很多人想创建一个自己的代币,先贴一个图看看创建的代币是什么样子。

今天我们就来详细讲一讲怎样创建一个这样的代币。

ERC20 Token

也许你经常看到ERC20和代币一同出现, ERC20是以太坊定义的一个代币标准。 要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。 其接口如下:

contract ERC20Interface {

    string public constant name = "Token Name";
    string public constant symbol = "SYM";
    uint8 public constant decimals = 18;  // 18 is the most common number of decimal places

    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

简单说明一下: name : 代币名称 symbol: 代币符号 decimals: 代币小数点位数,代币的最小单位, 18表示我们可以拥有 .0000000000000000001单位个代币。 totalSupply() : 发行代币总量。 balanceOf(): 查看对应账号的代币余额。 transfer(): 实现代币交易,用于给用户发送代币(从我们的账户里)。 transferFrom(): 实现代币用户之间的交易。 allowance(): 控制代币的交易,如可交易账号及资产。 approve(): 允许用户可花费的代币数。

编写代币合约代码

代币合约代码:

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract TokenERC20 {
    string public name;
    string public symbol;
    uint8 public decimals = 18;  // 18 是建议的默认值
    uint256 public totalSupply;

    mapping (address => uint256) public balanceOf;  // 
    mapping (address => mapping (address => uint256)) public allowance;

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Burn(address indexed from, uint256 value);


    function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);
        balanceOf[msg.sender] = totalSupply;
        name = tokenName;
        symbol = tokenSymbol;
    }


    function _transfer(address _from, address _to, uint _value) internal {
        require(_to != 0x0);
        require(balanceOf[_from] >= _value);
        require(balanceOf[_to] + _value > balanceOf[_to]);
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);
        balanceOf[msg.sender] -= _value;
        totalSupply -= _value;
        Burn(msg.sender, _value);
        return true;
    }

    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);
        require(_value <= allowance[_from][msg.sender]);
        balanceOf[_from] -= _value;
        allowance[_from][msg.sender] -= _value;
        totalSupply -= _value;
        Burn(_from, _value);
        return true;
    }
}

代码的详细解读,请订阅我的小专栏

部署

在开发测试智能合约时,MetaMaskRemix Solidity IDE是两个非常好用的工具,今天就用他们来完成部署。

  1. 安装和配置MetaMask请参考开发、部署第一个去中心化应用,不同的上本文选择了以太坊的测试网络Ropsten,如果你没有余额请点击购买buy,进入的网站可以送一些测试以太币给你,配置好之后,界面应该如下:

  2. 浏览器打开Remix Solidity IDE,复制以上源码粘贴上,在右侧选项参考如图的设置:

    注意Environment和Account和MetaMask保持一致,然后选择合约TokenERC20,填入你想要的发行量,名称及代号,就可以创建合约了。 这时MetaMask会弹出一个交易确认框,点SUBMIT。待合约部署交易确认之后,复制合约地址。

  3. 打开Metamask界面,切换到TOKENS,点添加合约,出现如下对话框:

    填入刚刚复制的地址,点ADD,这时你就可以看到你创建的代币了,如图:

哈哈,你已经完成了代币的创建和部署(正式网络和测试网络部署方法一样),可以在Etherscan查询到我们刚刚部署的代币。可以用它进行ICO了,从此走上人生巅峰(玩笑话,不鼓励大家发行无意义的代币)。

代币交易

由于MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天我用网页钱包来讲解代币交易。

  1. 进入网页钱包地址, 第一次进入有一些安全提示需要用户确认。
  2. 进入之后,按照下图进行设置:

  3. 连接上之后,如图

    需要添加代币,填入代币合约地址。

  4. 进行代币转账交易

    在接下来的交易确认也,点击确认即可。

  5. 交易完成后,可以看到MetaMask中代币余额减少了,如图:

代币交易是不是很简单,只要明白了交易流程,使用其他的钱包也是一样的道理。

如果你在创建代币的过程中遇到问题,我的**知识星球**可为大家解答问题。

参考文档

深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

作者:Tiny熊
链接:https://juejin.im/post/5a65d25351882573485a13e3
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Filed under: 其它 Comments Off
26Dec/17

Window 下安装 Memcached

Posted by Nick Xu

官网上并未提供 Memcached 的Window平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可:

在 1.4.5 版本以前 memcached 可以作为一个服务安装,而在 1.4.5 及之后的版本删除了该功能。因此我们以下介绍两个不同版本 1.4.4 及 1.4.5的不同安装方法:


memcached <1.4.5 版本安装

1、解压下载的安装包到指定目录。

2、在 1.4.5 版本以前 memcached 可以作为一个服务安装,使用管理员权限运行以下命令:

c:\memcached\memcached.exe -d install

注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

3、然后我们可以使用以下命令来启动和关闭 memcached 服务:

c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop

4、如果要修改 memcached 的配置项, 可以在命令行中执行 regedit.exe 命令打开注册表并找到 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached" 来进行修改。

如果要提供 memcached 使用的缓存配置 可以修改 ImagePath 为:

"c:\memcached\memcached.exe" -d runservice -m 512

-m 512 意思是设置 memcached 最大的缓存配置为512M。

此外我们还可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。

5、如果我们需要卸载 memcached ,可以使用以下命令:

c:\memcached\memcached.exe -d uninstall

memcached >= 1.4.5 版本安装

1、解压下载的安装包到指定目录。

2、在 memcached1.4.5 版本之后,memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。

我们使用管理员身份执行以下命令将 memcached 添加来任务计划表中:

schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"

注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。

注意:-m 512 意思是设置 memcached 最大的缓存配置为512M。

注意:我们可以通过使用 "c:\memcached\memcached.exe -h" 命令查看更多的参数配置。

3、如果需要删除 memcached 的任务计划可以执行以下命令:

schtasks /delete /tn memcached
31Aug/17

峰值QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式

Posted by Nick Xu

QPS:
每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力。
QPS = req/sec = 请求数/秒
QPS统计方式 [一般使用 http_load 进行统计]
QPS = 总请求数 / ( 进程总数 * 请求时间 )
QPS: 单个进程每秒请求服务器的成功次数
峰值QPS:
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
PV:
访问量即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次
单台服务器每天PV计算
公式1:每天总PV = QPS * 3600 * 6
公式2:每天总PV = QPS * 3600 * 8
UV:
独立访客即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次
服务器数量:
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
机器:ceil( 每天总PV / 单台服务器每天总PV )
并发数:
并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量
吐吞量:
吞吐量是指系统在单位时间内处理请求的数量
响应时间(RT):
响应时间是指系统对请求作出响应的时间

例子:
每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3

Tagged as: Comments Off
16Mar/17

Prusa i3 自動調平—改用 BLTouch 探針接觸感應式

Posted by Nick Xu

转自:http://www.kenming.idv.tw/prusa-i3-auto-bed-leveling_using-bltouch

我的 Prusa i3 第一個版本的自動調平,是使用電容電感近接開關,優點是便宜也容易安裝;缺點是只能探測金屬材質。可參考:Prusa i3 自動調平設定—硬體與電路部分

我的熱床是 MK3 鋁材質,原來使用上其實是可以配合。但 MK3 相當不平,即使採用了自動調平偵測還是有限,尤其是列印大面積的列印件時,兩側常無法黏住。

徵詢 Reprap.Taipei FB 社團的諸多高手所綜合的建議,在 MK3 熱床上再鋪上一片 3mm 以上的玻璃,會平坦很多。所以我從對岸淘了兩片從秦皇島店家購買的兩片鋼化高硼矽磨砂耐熱玻璃,據說可以黏住 PLA 材質的列印,而不需要塗上膠水或貼上美紋紙。

加上玻璃後,連帶電容電感近接開關就無法使用,因為無法偵測非金屬材質。我曾在玻璃後邊貼上鋁箔膠帶測試時還能偵測到,但打印幾次卻發現很不穩定,總有某些點會突然失靈,太過不穩定。

爬文作了一堆功課,發現到有種探針式的接觸感測近接開關,就沒有非金屬就無法感測的問題了。其中這一款 — BLTouch,我看從 Youtube 視頻上看到許多先進玩家的使用分享,效果挺不錯的樣子。

不過原廠價格可不便宜,且從 Amazon 還要多擔負一筆航空運費,並不划算。還是仍從對岸淘寶買的這支號稱是復刻版本的 TLTouch (BLTouch 克隆版),含順豐快遞到家共 RMB 159 (約台幣七百多元),還可以接受。

先瞧下我錄製下來的視頻,關於 BLTouch 在執行歸零與自動底床調平 (G28/G29)時的情形。

Prusa i3 with auto bed leveling using TLTouch (BLTouch Clone)

2:01 / 2:38

<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=QHDz6-kx5aE" target="_blank">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已停用)。</div></div>

雖然是復刻版,但包裝與內附的零件與原廠是一樣的 (還附了一張原廠的原文說明紙),還裝在一個透明盒收納。

其實這些零件多是小螺絲與杜邦延長端子之類的,反正就是要自行再拉延長線接到 Ramps 1.4 的 5V servo 腳位,以及限位開關腳位的。

要如何設計一個 BLTouch 的 Holder 並盡量靠近到熱端 (Hotend)處,這類 3D繪圖設計問題,對我永遠都是挑戰。花了有大半天時間,趁此次改使用 Fusion 360 3D 繪圖,因為 123D Design 據說不再釋出新版本 (且實在不太好用)。

哇喔! 原來比較專業性質的 3D繪圖功能是這麼強大啊,早應該要轉用這套免費提供給教師/學生,以及年收入10萬美金以下的商業人士 (真是佛心來著)。大約花個半天時間熟悉下使用介面就可以上手了;然後設計了三次版本演進的 BLTouch Holder。

打印了幾次樣本,總算確定了高度與接合距離,印出來的模樣。

這是套進去後的樣子。因為螺絲鎖住的高度剛好差點頂住 X軸鋁合金安裝座 (Mount),所以我還用電烙鐵頂住螺絲讓其陷進熱熔後的列印座內,下一個版本應該要把螺絲的高度給考慮進來的,目前這樣先能用就好。

設計這 Holder 比較大的挑戰就是 BLTouch 的高度相對於噴嘴高度的問題,主要就是當探針伸出來 (pull)時要比噴嘴高,但縮回去 (push)時要比噴嘴低,原廠建議探針出口處距離噴嘴高度約 8mm 距離左右。

嗯嗯,Holder 確實可以套用後,再來就是連接線路,然後開始 Marlin 設定。

上文有提到要用杜邦延長端子連接延長線,主要就是限位開關2條 (白-觸發訊號/黑-接地),servo 電源輸入腳位3條 (橘-觸發訊號/紅-+5V/棕-接地),說明紙都有提的,顏色確實接正確連到 Ramps 1.4 主板上即可。

大概就是注意下,servo 電源輸入腳位要能供應 +5V 的電壓,就在位於 servo 前面的腳位上要用 Jumper 短路前兩根腳,這在 Ramps 1.4 的規格都有提的。

線路接完後再來就是 marlin 的設定。本來以為很簡單,結果耗費整整一天的時間 try-error,原來竟然是這克隆版與原版的電位剛好相反,限位開關的訊號觸發 (inverting)要設為 true,且不能直接開啟 1.1.0 RC8 內有個預設的 #define BLTouch,因為並不相容。

為何要與原版的相反?這反而克隆版廠商的好意,為了修正原廠因為觸發訊號時只有 5ms 脈衝,這太小很容易就會被板子上的電容給當成雜訊過濾掉,所以就反過來讓其設計為反相訊號。原廠與克隆版廠商都準備下一個版本改為 10ms 脈衝訊號,對岸我買的那家,技術客服還特別因為覺得讓我花太多時間,所以承諾下一個版本免費送給我,哈,真是不錯,當然屆時幫他們簡單開箱介紹下。

這裡就把主要與 BLTouch 相關的 marlin 設定給列出來參考 (configuration.h),其它有關自動調平與前述使用電容電感式的設定是一樣的。

#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.

#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.

#define Z_ENDSTOP_SERVO_NR 0

#define Z_SERVO_ANGLES {10,90} // Z Servo Deploy and Stow angles

#define PROBE_DOUBLE_TOUCH

#define NUM_SERVOS 1

好啦,寫入 EPROM、Z軸高度校正等,都是與前一篇設定文一樣的方式,就是要注意下噴嘴當接近Z軸零點時,已收起來的探針不要碰觸到表面,若有就是要回頭調整 BLTouch 的高度。

設定正確後重新啟動 Marlin,此時 BLTouch 會自我測試伸縮探針,並顯示紅色燈號 (如果是閃爍的紅色燈號那代表有問題)。

新裝上磨砂玻璃,準備不塗上膠水與貼上美紋紙,只有底床加熱 (PLA 約為60度左右)。順便瞧下帶顏色的馬尾夾,從大創百貨買回來的,比起純黑色好看太多了。

執行 G28 歸零 (Homing)/G29 自動探測各點距離,然後開始打印從 thingiverse 下載底床調平校正模型,打印出來成果相當令人滿意。

試著打印小貓咪吊飾模型,直接就是打印在玻璃上,沒有塗上膠水與黏貼美紋紙,第一層仍可以牢靠黏著。

當晚我就給它整夜打印 68%縮小原比例的穿山甲,整整要花上快9個小時,但效果真的相當好,關節都不會黏住,自動調平校正後第一層平坦時就會顯現這樣的威力。

結論這 BLTouch 的克隆版在自動調平功能上頗為滿意,無怪乎國外的許多玩家對其還蠻

推薦的。

不過這物件真有些貴,其實這可以 DIY,只要有光學限位開關或霍爾感應器,加上小磁鐵

與彈簧、探針(用鐵釘或螺絲就可),成本並不高,但當然不容易能像 BLTouch 這般小巧

精緻。

Crash Probe with optical switch

<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=hqBF5s-aBCQ" target="_blank">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已停用)。</div></div>

原理比想像的簡單,如果使用現成的光學限位開關 (機械限位應該也可以),就只是想辦法在歸零的時候讓原來黏在磁鐵的探針 (可以用釘子或迴紋針就可)落下比噴嘴還低的位置。(影片是利用穿過小彈簧的水平桿觸及左側X軸)

然後在 G28/G29 歸零/自動偵測後,噴嘴會降到Z軸0點位置,此時探針會往下壓而被頂上來,自然就會磁鐵黏回去而比噴嘴位置高了。

Thingiverse 的模型檔與基本說明:http://www.thingiverse.com/thing:1714315

當然也可以直接使用霍爾傳感器 (Hall sensor)直接取代光學限位開關,實作上會更簡單。即使不弄成自動調平偵測,當成Z軸限位開關也很不錯的方式。

15Nov/16

KVM虚拟机Linux系统增加硬盘

Posted by Nick Xu

Linux虚拟机在使用过程中,硬盘空间不够使用。由于前期没有做LVM,所以只能手动添加新的硬盘。

给虚拟机添加硬盘有两种方法:

1、通过virsh attach-disk命令添加一块硬盘到系统中,即时生效,但系统重启后新硬盘会消失。

2、通过修改虚拟机配置文件进行添加,永久生效。

现在我来一一介绍方法一和方法二。

方法一、通过virsh attach-disk命令添加硬盘

首先看看在未添加新硬盘系统的分区情况。

fdisk –l

df –h

clip_image001

从上图我们可以看到目前系统中只有一块硬盘vda,而且被分成3个分区,其中vda1为系统启动分区。

下面开始添加硬盘:

先使用 qemu-img添加一块新的硬盘

qemu-img create -f raw /vhost/testdisk.img 20G

clip_image002

现在开始使用virsh attach-disk命令把新硬盘添加到虚拟机上。

virsh attach-disk ilanni01 /vhost/testdisk.img vdb

clip_image003

该命令的意思是把/vhost/testdisk.img硬盘添加到虚拟机ilanni01中,并且该硬盘在虚拟机系统中显示的硬盘名称为vdb。

现在在系统中查看是否已经挂载该硬盘,使用fdisk命令,如下图:

clip_image004

以上操作是在虚拟机运行是,进行操作的。

现在我们把虚拟机关闭然后,再添加看看。

virsh destroy ilanni01

virsh list –all

clip_image005

再次使用virsh attach-disk添加新的硬盘vdc,如下命令:

virsh attach-disk ilanni01 /vhost/test1.img vdc

clip_image006

通过上图我们可以发现,通过virsh attach-disk添加硬盘时,只能是虚拟机运行时才能添加,而且是即时生效的。

现在我们重新启动虚拟机看看,如下图:

fdisk –l

clip_image007

通过上图,我们可以看到通过virsh attach-disk命令添加的硬盘在重启系统后,添加的新硬盘失效。

那么现在我们来看第二种方法通过修改配置文件来添加新硬盘。

要通过修改配置文件来添加硬盘,我们首先要关闭虚拟机,否则无法正常添加。

关闭虚拟机,然后使用virsh edit命令修改虚拟机的主配置文件。

虚拟机的所有配置文件都存放在/etc/libvirt/qemu,如下图:

clip_image008

编辑虚拟机配置文件,如下图:

clip_image009

配置文件中,我们找到有关硬盘的代码:

<disk type=’file’ device=’disk’>

<driver name=’qemu’ type=’qcow2′ cache=’none’/>

<source file=’/vhost/ilanni01.img’/>

<target dev=’vda’ bus=’virtio’/>

<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x04′ function=’0x0’/>

</disk>

现在我们在</disk>这之后,添加如下的代码

<disk type=’file’ device=’disk’>

<driver name=’qemu’ type=’qcow2′ cache=’none’/>

<source file=’/vhost/testdisk.img’/>

<target dev=’vdb’ bus=’virtio’/>

</disk>

注意其中type表示硬盘的格式

file表示硬盘所在的路径

dev表示硬盘在系统中显示的硬盘名称

bus表示硬盘的接线类型,如果是windows系统一般是ide。

clip_image010

clip_image011

添加完毕后,我们来启动虚拟机看看实际的效果。

clip_image012

clip_image013

可以看到硬盘已经被添加进来了。

第一种方法和第二种方法的区别,以上两种方法都能添加硬盘。

但是如果是使用第一种方法添加的硬盘,使用virsh edit ilanni01编辑时,是无法看到第一种方法添加的硬盘的,同时在系统重启添加的硬盘会消失。也就是说使用第一种方法添加的硬盘是在ilanni01.xml这个配置文件中看不到的。

除此之外,如果是卸载硬盘,通过第一种方法添加的一定要在虚拟机运行时卸载。否则会报错,但是还会把该磁盘卸载掉。而且在此之前对硬盘的操作、分区,等都还存在。

卸载硬盘我们可以使用virsh detach-disk命令,如下图:

virsh detach-disk ilanni01 –target vdb

clip_image014

使用virsh detach-disk ilanni01 –target vdb 也可以卸载通过virsh edit ilanni01添加的硬盘。但是此时配置文件ilanni01.xml中还是有此信息的。使用 virsh attach-disk ilanni01 /vhost/testdisk.img vdb命令可以再增加,系统重启后还是存在的。

综上所述,在我们添加硬盘时,建议还是使用第二种方法。

Tagged as: Comments Off
6Jun/16

mini osd 手动接isp引脚刷bootloader

Posted by Nick Xu

发现mini osd很容易出问题, 第一次刷了对应f3飞控的osd后用了几次就没有osd信息了, 只有图像, 后来又刷了一次, 结果还是用几次后又没了, 而且这次还无法用USB2TTL线刷系统, 听说只能用ISP线来刷单片机, 结果发现这MINI OSD根本没有接上ISP的引脚, 又不知道哪个才是ISP引脚, 找了N久, 在即将要放弃时, 终于找到了ISP引脚图(其实最重要的只是这张图, 其它都是次要)

 

MINI OSD ISP 引脚标注图, 触点很小, 接线时小心, 别短路了.

BOOTLOADER FLASH

下图是我的接线, 这是已经刷完BOOTLOADER后测试刷OSD系统了

IMG20160603223727

然后就是刷BOOTLOADER了, 当然你得先有ISP刷写器,我是USBasp刷写器, 装progisp1.72, 懒得打字了, 直接看图吧, 从论坛上找过来的

522F9946-4E0F-4922-991D-28FA57CDB229

第四步, 固件位置在 arduino-1.0.1\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex ,根据自己的arduino安装目录找吧

刷完BOOTLOADER就回到 arduino 刷OSD系统吧.

貌似手动刷了BOOTLOADER后变稳定了, 不会出现用几次就无法显示osd信息的情况, 估计是出厂时预刷有问题或者是出厂BOOTLOADER有问题. 还有一种可能是我的USB2TTL前两次刷的时候是跳线到3.3v而不是5v, 虽然接线还是接到5v的位置, 不过目前已无法考究具体是哪个原因导致的了.

 

 

Filed under: 其它, 单片机 Comments Off
16Oct/15

RACADM Command Line Reference Guide for iDRAC7

Posted by Nick Xu

dell-poweredge-drac7-1.50.50-command-line.pdf

5Jun/15

windows at 定时任务

Posted by Nick Xu

at 命令的参数:
At计划在指定时间和日期在计算机上运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 列出已计划的命令。
at [[\\ComputerName] hours:minutes [/interactive] [{/every:date[,...]|/next:date[,...]}] command]
参数
\\computername
指定远程计算机。如果省略该参数,则 at 计划本地计算机上的命令和程序。
ID
指定指派给已计划命令的识别码。
/delete
取消已计划的命令。如果省略了 ID,则计算机中所有已计划的命令将被取消。
/yes
删除已计划的事件时,对来自系统的所有询问都回答“是”。
hours:minutes
指定命令运行的时间。该时间用 24 小时制(即从 00:00 [午夜] 到 23:59)的 小时: 分钟格式表示。
terative
对于在运行 command 时登录的用户,允许 command 与该用户的桌面进行交互。
/every:
在每个星期或月的指定日期(例如,每个星期四,或每月的第三天)运行 command 命令。
date
指定运行命令的日期。可以指定一周的某日或多日(即,键入 M、T、W、Th、F、S、Su)或一个月中的某日或多日(即,键入从 1 到31 之间的数字)。用逗号分隔多个日期项。如果省略了 date,则 at 使用该月的当前日。
/next:
在下一个指定日期(比如,下一个星期四)到来时运行 command。
command
指定要运行的 Windows 命令、程序(.exe 或 .com 文件)或批处理程序(.bat 或 .cmd 文件)。当命令需要路径作为参数时,请使用绝对路径,也就是从驱动器号开始的整个路径。如果命令在远程计算机上,请指定服务器和共享名的通用命名协定 (UNC) 符号,而不是远程驱动器号。
/?
在命令提示符显示帮助.

 

每天8点关机,这个用的是星期,可以少输点,at 8:00 /every:m,t,w,th,f,s,su shutdown -s

Tagged as: , Comments Off
5Nov/13

在windows上以php-fpm的形式部署nginx服务器

Posted by Nick Xu

In case anyone still needs this info. This is how I setup php-fpm for use with nginx on windows:

Download the .zip file from http://windows.php.net/download/. The .zip file should be VC9 which has the FastCGI file (php-cgi.exe). Don't download VC6, and don't download the .msi file because it requires that you have IIS setup already in order to install php-fpm. The zip file contains the php-cgi.exe which is what you need for php-fpm. I downloaded a slightly older version, php-5.3.10-Win32-VC9-x86.zip, from here http://windows.php.net/downloads/releases/archives/ because I wanted to match the version running on my production server.

Unzip the file, e.g. unzip into C:\php-5.3.10-Win32-VC9-x86

Edit the php.ini file as needed. What I did:

# nginx security setting
cgi.fix_pathinfo=0

extension_dir = "C:\php-5.3.10-Win32-VC9-x86\ext"
enable the following modules by uncommenting them:

extension=php_curl.dll
extension=php_mbstring.dll
extension=php_mysqli.dll
Create a .bat file somewhere, e.g. start-php-fcgi.bat in nginx directory or in the php directory:

@ECHO OFF
ECHO Starting PHP FastCGI...
set PATH=C:\php-5.3.10-Win32-VC9-x86;%PATH%
C:\php-5.3.10-Win32-VC9-x86\php-cgi.exe -b 127.0.0.1:9123 -c C:\php-5.3.10-Win32-VC9-x86\php.ini
Double click the .bat file to start php-fpm. A window will popup and stay open while its running. Its kind of annoying, but just haven't looked into setting it up as service yet.

In the php section of nginx.conf I reference the 127.0.0.1:9123:

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9123;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

14Feb/13

Eclipse和单片机开发环境Keil的集成编译工具KeilMake源码

Posted by Nick Xu

Eclipse和单片机开发环境Keil的集成编译工具KeilMake

通过KeilMake可以在Eclipse上进行单片机开发且编译

这个东东是为了通用而到网上抄一些需要用到的代码做出来的东东,估计很多代码是可以换成一两句话可以解决问题的. 最近经常有人找我问这个工具的问题,但是我已经不搞单片机好多年,所以把源码放出来,让有心人来维护吧:)

代码已经更新到github上,有需要的请自行下载和修改吧,为了能造福更多人群,希望改进后的代码能继续更新到github上,让更多人一起学习和研究

https://github.com/qdog2012/keilmake

site
site