青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

專職C++

不能停止的腳步

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用鏈接

留言簿(28)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

#

酷派 全魔王 8298-M02用于測試的手機,需要root,試了7兔,kingroot,百度root,root精靈,最后在完美root這個工具root成功了。
這手機,還不錯,算是性價比非常高的手機了,在京東618的時候,以389入手。由于活動的原因,今天才收到。

看到很多人也在求root,在這里發一貼,希望對root的人有幫忙了。不過,這手機,真的不錯,超值了。可以確定比某米4A強!質量也比它的好。我去酷派官網看了一下,原價是1299的,哈。

另:完美root好像已經停止進展了~~~


補充:這個手機,居然還送一年樂視會員!太強了

posted @ 2017-06-26 16:03 冬瓜 閱讀(817) | 評論 (0)編輯 收藏

對于vscode,已經更新到1.13了,更新的好快啊。有的時候,需要在Linux下面工作,所以我選擇了centos 7.x

廢話一下ubuntu,最新17.04,我試裝過不少版本(虛擬機下),最后就一個字卡。所以,每次都果斷放棄了。反過來說,centos 桌面,雖然很多東西不是很新,但是在虛擬機下,它一點都不卡。centos 7.x的GUI也非常不錯。

對于怎么安裝vscode,參考官方的https://code.visualstudio.com/docs/setup/linux 有詳細的說明。

對于centos則如下:

 

[javascript] view plain copy
 print?
  1. sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc  
  2. sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'  

然后用yum命令安裝

 

 

[javascript] view plain copy
 print?
  1. yum check-update  
  2. sudo yum install code  

完成后,就可以用vscode了

 

后面附兩張centos 7.x的UI




0
posted @ 2017-06-20 09:43 冬瓜 閱讀(2705) | 評論 (0)編輯 收藏

centos 安裝nodejs主要有兩種方式,一種是源碼,第二種是二進制安裝。 
Linux系統一般來說,不追求新,而是追求穩定。centos 下的軟件往往不是最新的,卻是相對比較穩定的。我想這也是我們很多人選擇centos的原因。(最重要的一點,是用習慣了centos或rhel)

現在Node.js已經8.1.2的,發展很快。如果用源碼編譯至少需要gcc 4.8.x或clang 3.xx,對于centos 6.x(默認是gcc 4.4.x)是一個麻煩的事,如果你僅是使用nodejs,nodejs編譯時間又比較長,所以我這里還是傾向于二進制安裝。

本身centos的yum默認是不帶的node的安裝包的,所以需要第三方方法。 
大家可以看這個網站,https://github.com/nodesource/distributions

上面提供了ubuntu,debian,linux Mint,還有centos(rhel)等安裝方法。 
我這里,使用安裝 nodejs 8.x 
所以內容如下

#要求在root下執行 curl -sL https://rpm.nodesource.com/setup_8.x | bash - yum install -y nodejs
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

很簡單,我在centos 6.x下就完成了node.js 8.1.2的安裝。

posted @ 2017-06-20 09:43 冬瓜 閱讀(811) | 評論 (0)編輯 收藏

版權聲明:本文為zdhsoft博主原創文章,未經博主允許不得轉載。

因為裝了Android studio 2.3 所以就默認安裝了android sdk和NDK,用的NDK的版本是r10d x64。在安裝RAD Studio的時候,就沒有選擇安裝android的sdk和NDK,然后,用C++Builder創建MultDevice工程 ,編譯為android目標就報如下錯:


問是是arm-Linux-androideabi-ld.exe執行報錯,而Delphi的版本,則沒有問題!

然后找到RAD Studio的安裝包,發現它有一個android-ndk.7zip的文件,然后用7z工具打開,發現里面是一個NDK r9c的版本,然后我就它提出出來,放到一個目錄,如:d:\ndk\r9c,然后配置RAD studio





配置完成后,就可以編譯android了,接上手機,就可以在真機上跑了

初步試用通過,感覺還是一個半成品的樣子!C++Builder代碼提示還是卡,有點改善的樣子。

posted @ 2017-06-01 21:20 冬瓜 閱讀(1184) | 評論 (0)編輯 收藏

版權聲明:本文為zdhsoft博主原創文章,未經博主允許不得轉載。

N久沒有碰C++Builder,雖然他給了一個注冊碼,基本版的,但是一想我XE6,XE7的時候,那個版本,對于我128G的C盤都覺得不夠,反正裝完就少了幾十個G,C盤提示一下就變紅了有沒有。今天想看看,于是下載了一個10.2版本,

下載地址:http://altd.embarcadero.com/download/radstudio/10.2/delphicbuilder10_2.iso

安裝的時候,需要.net 3.5,我只能說,從C++Builder 6以后,就摔不開.net

然后就順利安裝完成。給我最大的驚喜是安裝的臨時文件都清理了,只需要11G就OK了!以前要是要30G以上,少于40G剩余空間,則會安裝不了。

先用delphi創建一個mult device 應用,就隨便選了一個,如下圖:


然后就直接編譯運行,在Android運行OK

當一切都順利的時候,我接著用C++Builder創建一個同樣的工程

然后就報這樣的錯:


所有的C++Builder的android應用 ,都是同樣的錯誤,對于iOSLinux,由于空間有限,就沒有選擇安裝。

對于win32程序,則暫時OK!

posted @ 2017-06-01 21:19 冬瓜 閱讀(1092) | 評論 (0)編輯 收藏

使用appium輸入中文,發現好慢!至少5秒以上,如果在這樣的情況下做測試,這就好悲劇了。 
從appium(1.6.3)代碼上來看,沒有什么問題,直接是通過boostrap的setText的方法。說是就下載了appium-bootstrap的代碼看,從這里開發找到的代碼,都是java的代碼,找到 io.appium.android.bootstrap.handler.SetText 
在new Clear().execute(command);時間長達5秒(打日志發現),不管文本框有沒有內容,都會執行
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 * You may obtain a copy of the License at
 *
 *     
http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 
*/

package io.appium.android.bootstrap.handler;

import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import io.appium.android.bootstrap.*;
import io.appium.android.bootstrap.exceptions.ElementNotFoundException;
import io.appium.android.bootstrap.handler.Find;
import org.json.JSONException;

import java.util.Hashtable;

/**
 * This handler is used to set text in elements that support it.
 *
 
*/
public class SetText extends CommandHandler {

  /*
   * @param command The {@link AndroidCommand} used for this handler.
   *
   * @return {@link AndroidCommandResult}
   *
   * @throws JSONException
   *
   * @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.
   * bootstrap.AndroidCommand)
   
*/
  @Override
  public AndroidCommandResult execute(final AndroidCommand command)
      throws JSONException {
    AndroidElement el = null;
    if (command.isElementCommand()) {
      el = command.getElement();
      Logger.debug("Using element passed in: " + el.getId());
    } else {
      try {
        AndroidElementsHash  elements = AndroidElementsHash.getInstance();
        el = elements.getElement(new UiSelector().focused(true), "");
        Logger.debug("Using currently-focused element: " + el.getId());
      } catch (ElementNotFoundException e) {
        Logger.debug("Error retrieving focused element: " + e);
        return getErrorResult("Unable to set text without a focused element.");
      }
    }
    try {
      final Hashtable<String, Object> params = command.params();
      boolean replace = Boolean.parseBoolean(params.get("replace").toString());
      String text = params.get("text").toString();
      boolean pressEnter = false;
      if (text.endsWith("\\n")) {
        pressEnter = true;
        text = text.replace("\\n", "");
        Logger.debug("Will press enter after setting text");
      }
      boolean unicodeKeyboard = false;
      if (params.get("unicodeKeyboard") != null) {
        unicodeKeyboard = Boolean.parseBoolean(params.get("unicodeKeyboard").toString());
      }
      String currText = el.getText();
      new Clear().execute(command); //不管有沒有,這里都會執行
      if (!el.getText().isEmpty()) {
        // clear could have failed, or we could have a hint in the field
        
// we'll assume it is the latter
        Logger.debug("Text not cleared. Assuming remainder is hint text.");
        currText = "";
      }
      if (!replace) {
        text = currText + text;
      }
      final boolean result = el.setText(text, unicodeKeyboard);
      if (!result) {
        return getErrorResult("el.setText() failed!");
      }
      if (pressEnter) {
        final UiDevice d = UiDevice.getInstance();
        d.pressEnter();
      }
      return getSuccessResult(result);
    } catch (final UiObjectNotFoundException e) {
      return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,
          e.getMessage());
    } catch (final Exception e) { // handle NullPointerException
      return getErrorResult("Unknown error");
    }
  }
}
然后,我們再看Clear的代碼

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 * You may obtain a copy of the License at
 *
 *     
http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 
*/

package io.appium.android.bootstrap.handler;

import android.graphics.Rect;
import android.os.SystemClock;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import io.appium.android.bootstrap.AndroidCommand;
import io.appium.android.bootstrap.AndroidCommandResult;
import io.appium.android.bootstrap.AndroidElement;
import io.appium.android.bootstrap.CommandHandler;
import io.appium.android.bootstrap.Logger;
import io.appium.android.bootstrap.WDStatus;
import io.appium.uiautomator.core.InteractionController;
import io.appium.uiautomator.core.UiAutomatorBridge;
import org.json.JSONException;

import java.lang.reflect.InvocationTargetException;

/**
 * This handler is used to clear elements in the Android UI.
 *
 * Based on the element Id, clear that element.
 *
 * UiAutomator method clearText is flaky hence overriding it with custom implementation.
 
*/
public class Clear extends CommandHandler {

  /*
   * Trying to select entire text with correctLongClick and increasing time intervals.
   * Checking if element still has text in them and and if true falling back on UiAutomator clearText
   *
   * @param command The {@link AndroidCommand}
   *
   * @return {@link AndroidCommandResult}
   *
   * @throws JSONException
   *
   * @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.
   * bootstrap.AndroidCommand)
   
*/
  @Override
  public AndroidCommandResult execute(final AndroidCommand command)
          throws JSONException {
    if (command.isElementCommand()) {
      try {
        final AndroidElement el = command.getElement();

        // first, try to do native clearing
        Logger.debug("Attempting to clear using UiObject.clearText().");
        el.clearText();  //無條件都會執行這塊。然后再分析clearText
        if (el.getText().isEmpty()) {
          return getSuccessResult(true);
        }

        // see if there is hint text
        if (hasHintText(el)) {
          Logger.debug("Text remains after clearing, "
              + "but it appears to be hint text.");
          return getSuccessResult(true);
        }

        // next try to select everything and delete
        Logger.debug("Clearing text not successful. Attempting to clear " +
                "by selecting all and deleting.");
        if (selectAndDelete(el)) {
          return getSuccessResult(true);
        }

        // see if there is hint text
        if (hasHintText(el)) {
          Logger.debug("Text remains after clearing, "
              + "but it appears to be hint text.");
          return getSuccessResult(true);
        }

        // finally try to send delete keys
        Logger.debug("Clearing text not successful. Attempting to clear " +
                "by sending delete keys.");
        if (sendDeleteKeys(el)) {
          return getSuccessResult(true);
        }

        if (!el.getText().isEmpty()) {
          // either there was a failure, or there is hint text
          if (hasHintText(el)) {
            Logger.debug("Text remains after clearing, " +
                    "but it appears to be hint text.");
            return getSuccessResult(true);
          } else if (!el.getText().isEmpty()) {
            Logger.debug("Exhausted all means to clear text but '" +
                    el.getText() + "' remains.");
            return getErrorResult("Clear text not successful.");
          }
        }
        return getSuccessResult(true);
      } catch (final UiObjectNotFoundException e) {
        return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,
            e.getMessage());
      } catch (final Exception e) { // handle NullPointerException
        return getErrorResult("Unknown error clearing text");
      }
    }
    return getErrorResult("Unknown error");
  }

  private boolean selectAndDelete(AndroidElement el)
      throws UiObjectNotFoundException, IllegalAccessException,
        InvocationTargetException, NoSuchMethodException {
    Rect rect = el.getVisibleBounds();
    // Trying to select entire text.
    TouchLongClick.correctLongClick(rect.left + 20, rect.centerY(), 2000);
    UiObject selectAll = new UiObject(new UiSelector().descriptionContains("Select all"));
    if (selectAll.waitForExists(2000)) {
      selectAll.click();
    }
    // wait for the selection
    SystemClock.sleep(500);
    // delete it
    UiAutomatorBridge.getInstance().getInteractionController().sendKey(KeyEvent.KEYCODE_DEL, 0);

    return el.getText().isEmpty();
  }

  private boolean sendDeleteKeys(AndroidElement el)
      throws UiObjectNotFoundException, IllegalAccessException,
        InvocationTargetException, NoSuchMethodException {
    String tempTextHolder = "";

    // Preventing infinite while loop.
    while (!el.getText().isEmpty() && !tempTextHolder.equalsIgnoreCase(el.getText())) {
      // Trying send delete keys after clicking in text box.
      el.click();
      // Sending delete keys asynchronously, both forward and backward
      for (int key : new int[] { KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_FORWARD_DEL }) {
        tempTextHolder = el.getText();
        final int length = tempTextHolder.length();
        final long eventTime = SystemClock.uptimeMillis();
        KeyEvent deleteEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN,
                key, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0,
                InputDevice.SOURCE_KEYBOARD);
        for (int count = 0; count < length; count++) {
          UiAutomatorBridge.getInstance().injectInputEvent(deleteEvent, false);
        }
      }
    }

    return el.getText().isEmpty();
  }

  private boolean hasHintText(AndroidElement el)
      throws UiObjectNotFoundException, IllegalAccessException,
        InvocationTargetException, NoSuchMethodException {
    // to test if the remaining text is hint text, try sending a single
    
// delete key and testing if there is any change.
    
// ignore the off-chance that the delete silently fails and we get a false
    
// positive.
    String currText = el.getText();

    try {
      if (!el.getBoolAttribute("focused")) {
        Logger.debug("Could not check for hint text because the element is not focused!");
        return false;
      }
    } catch (final Exception e) {
      Logger.debug("Could not check for hint text: " + e.getMessage());
      return false;
    }

    InteractionController interactionController = UiAutomatorBridge.getInstance().getInteractionController();
    interactionController.sendKey(KeyEvent.KEYCODE_DEL, 0);
    interactionController.sendKey(KeyEvent.KEYCODE_FORWARD_DEL, 0);

    return currText.equals(el.getText());
  }
}
再看看AndroidElement.clearText是什么樣的
  public void clearText() throws UiObjectNotFoundException {
    el.clearTextField();
  }
這個都就是com.android.uiautomator.core.UiObject.clearTextField 
于是找再找到uiautomator的代碼再來分析(這個代碼需要下載andriod sdk,在對應android版本的目錄下,會有源碼,也有uiautomator的源代碼),我這里的路徑是: 
Android\sdk\sources\android-19\com\android\uiautomator\core 
在UiObject.java找到clearTextField實現
/**
     * Clears the existing text contents in an editable field.
     *
     * The {
@link UiSelector} of this object must reference a UI element that is editable.
     *
     * When you call this method, the method first sets focus at the start edge of the field.
     * The method then simulates a long-press to select the existing text, and deletes the
     * selected text.
     *
     * If a "Select-All" option is displayed, the method will automatically attempt to use it
     * to ensure full text selection.
     *
     * Note that it is possible that not all the text in the field is selected; for example,
     * if the text contains separators such as spaces, slashes, at symbol etc.
     * Also, not all editable fields support the long-press functionality.
     *
     * 
@throws UiObjectNotFoundException
     * 
@since API Level 16
     
*/
    public void clearTextField() throws UiObjectNotFoundException {
        Tracer.trace();
        // long click left + center
        AccessibilityNodeInfo node = findAccessibilityNodeInfo(mConfig.getWaitForSelectorTimeout());
        if(node == null) {
            throw new UiObjectNotFoundException(getSelector().toString());
        }
        Rect rect = getVisibleBounds(node);
        getInteractionController().longTapNoSync(rect.left + 20, rect.centerY()); //長按
        
// check if the edit menu is open
        UiObject selectAll = new UiObject(new UiSelector().descriptionContains("Select all"));
        if(selectAll.waitForExists(50))
            selectAll.click();
        // wait for the selection
        SystemClock.sleep(250); //這里等250ms
        
// delete it
        getInteractionController().sendKey(KeyEvent.KEYCODE_DEL, 0);
    }
相信大家,可以找到慢的原因了。這里做一次長按,然再再做全選,然后再sleep(250),還有一個selectAll.waitForExists(50), 這些都是耗費時間的。
再找一下UiObject.java中setText的實現

    public boolean setText(String text) throws UiObjectNotFoundException {
        Tracer.trace(text);
        clearTextField();
        return getInteractionController().sendText(text);
    }
發現這里又調用了一次clearTextField,這樣算來,設一次文本,都會清理兩次文本,于是,這時間就長了。 
優化:只需要將io.appium.android.bootstrap.handler.SetText中的new Clear().execute(command)去掉就可以了。

posted @ 2017-05-27 17:35 冬瓜 閱讀(1896) | 評論 (0)編輯 收藏

node進步很快,一年前,我用的還是node 4.x LTS,現在都 node 6.x LTS了,而node 7.x也在開發中,node 8.x已經也展開了。 
node 6.x已經到了node 6.10.2了,則7.x也到了7.9.0了 
對比后,這里把發現的差異列一下

n次方運算符 **

例如

let a = 2 ** 3; console.log(a); //顯示為8 
let b = 3; b **= 4; console.log(b); //顯示為81
let c = Function("return 5**2");
console.log(c()); //顯示為25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 6.10.2 需要–harmony 標志
  • 7.9.0 支持

Object.values和Object.entries

6.10.2支持Object.keys,但是不支持 values和entries

let a = { a: 100, b: '2423423', c: 'jjj' }; 
let k = Object.keys(a);
let v = Object.values(a);
let e = Object.entries(a);
console.log(k); //顯示為:[ 'a', 'b', 'c' ]
console.log(v); //顯示為:[ 100, '2423423', 'jjj' ]
console.log(e); //顯示為:[ [ 'a', 100 ], [ 'b', '2423423' ], [ 'c', 'jjj' ] ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

這個功能在很多地方,都很用了,可以不需要lodash了

  • 6.10.2 需要–harmony 標志
  • 7.9.0 支持

String的padStart和padEnd

在顯示時間的時候,我們需要對齊顯示 如2017-04-26 23:01:01這樣顯示比較整齊,如果顯示為2017-4-26 23:1:1就不好看了,之前都是我們自己寫pad函數,但是node支持這個功能了

console.log('1'.padStart(2,'00')); //顯示為 '01' 
console.log('2'.padEnd(2,'00')); //顯示為 '20'
console.log('1234'.padStart(10)); //顯示為 ' 1234'
console.log('1234'.padEnd(10)); //顯示為 '1234 '
console.log('abc'.padEnd(10,'0123456789')); //顯示為 'abc0123456'
console.log('abc'.padStart(10,'0123456789'));//顯示為 '0123456abc' //其它的使用辦法,大家就自己研究了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 6.10.2 需要–harmony 標志
  • 7.9.0 需要–harmony 標志

async和await

這個是es2017最重要的特性了,有了它,寫異步程序就方便多了

//一個延時指定時間的函數 
async function aaa_sleep(time) {
return new Promise(function (resolve) {
setTimeout(() => {
resolve();
console.log("finish", new Date());
}, time);
});
}
async function m() {
console.log(new Date());
await aaa_sleep(2000);
console.log(new Date());
}
m(); //注意:await一定要在async函數中出現,不然會報錯
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

等LTS版本出來了,就可以放棄babel來編譯了,可惜import引入模塊的方式,一直沒有被放到標準

  • 6.10.2 不支持
  • 7.9.0 支持
posted @ 2017-04-27 00:18 冬瓜 閱讀(1176) | 評論 (0)編輯 收藏

基于vscode的node的ES2015(ES6)運行環境搭建

用了vscode也有一段時間了,在輕量級的開發環境,它的功能是最強的。跨平臺,不依賴Java, .net等,UI也很現代,運行速度也相對比較快,占用內存少,平板電腦的win10都可以輕松開發。

環境說明:

  • node.js 6.9.x
  • vscode 1.11.2
  • 操作系統 win10 (win7之后的系統,安裝方法應該都一樣)
  • 編譯插件:babel

第一步:安裝node

www.nodejs.org 下載安裝包 6.x,默認安裝 注意:在生產環境,建議使用LTS,比較穩定,bug相對比較少。 
下載后,一路默認安裝就可以了

第二步:安裝vscode

vscode我就不介紹了,去https://code.visualstudio.com/下載對應的安裝包就可以了,寫這個文章的版本是1.11.2 
下載后,一路默認安裝就可以了 
(如果是國產軟件,千萬不要一路默認安裝,如百****du,會給你默認安裝一個全家桶,占領你的啟動,瞬間讓你的電腦卡成翔)

第三步:安裝全局的babel

在命令提示符下,輸入下面命令:

npm install babel-cli babel-eslint -g
  • 1
  • 1

完成后,可以輸入

babel --version
  • 1
  • 1

可以顯示babel的版本號

第四步:用npm init創建工程

如果已創建,則跳過 
在控制臺下,建好工程目錄,如:d:\work\firstnode 
然后進入該目錄

d: cd d:\work\firstnode ppm init
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

完成node的工程創建 
為了便于管理,我們將源代碼目錄放在lib目錄下面,或src目錄,在這里我用的是lib目錄 
編譯后可以運行的目錄放在build目錄下面 
這樣就會有兩個目錄

d:\work\firstnode\lib d:\work\firstnode\build
  • 1
  • 2
  • 1
  • 2

第五步:安裝編譯插件

在控制臺下,目錄為d:\work\firstnode安裝插件,輸入: 
npm install –save-dev babel-preset-eslatest-node6 
第六步:編寫.babelrc

//---------------------------------------------------------- 
{
"presets": ["eslatest-node6"],
"plugins": [ ]
}
//---------------------------------------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第七步:用vscode編寫代碼

在控制臺并在d:\work\firstnode下面,輸入code .就可以打開當前工程 
或者先啟動vscode后,選擇打開文件夾,選擇這個目錄也可以。 
在vscode的左邊的資源管理器,新建一個index.js放到lib目錄下面

//-------------index.js-------------------------------------- 
console.log("hello world");
//---------------------------------------------------------------
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

然后在控制臺下輸入命令

babel lib -d build\lib
  • 1
  • 1

就可以看到在build\lib目錄面,多了一個index.js

第八步:配置運行

用vscode選擇調試,調試顯示的是沒有配置,然后進行配置,就會進入vscode配置lanuch.json編輯

{     
// Use IntelliSense to learn about possible Node.js debug attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "啟動程序",
"program": "${workspaceRoot}\\bulid\\lib\\index.js"
},
{
"type": "node",
"request": "attach",
"name": "附加到端口",
"address": "localhost",
"port": 5858
}
]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

將program改為${workspaceRoot}\bulid\lib\index.js就可以了,然后按F5就可以運行了。 
為了方便調試,修改package.json中的script,增加如下內容

"scripts": {
"build": "babel lib -d build/lib -s inline",
"babelWatch":"babel lib/**/*.js -d build -w -s inline",
"releaseBuild":"babel lib -d release/lib --no-comments --compact true --minified"
},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

然后在控制臺下,輸入npm run build就會執行babel lib -d build/lib -s inline 
這樣,就完成了node的vscode環境操作

第九步:最后

  • 除了配置了build,還配置了babelWatch,這樣就可以處于監視狀態,只要lib目錄下一有文件保存,就可以實時編譯到build目錄下面。-s inline則是生成sourceMap,這樣,用vscode斷點調試的時候,就可以正常的代碼位置。
  • 另外:這個使用的插件是babel-preset-eslatest-node6,這個插件的作用是將ES2015或更ES2017的js代碼編譯成node 6.x支持的js代碼,而不是ES5,node 6.x已經支持99%的ES2015了,這樣編譯后的代碼變化不大。
posted @ 2017-04-21 09:42 冬瓜 閱讀(1974) | 評論 (0)編輯 收藏

概述

vscode是一個不錯的開源IDE,可以完全替代sublime,又是跨平臺,使用起來還比較方便.使用一段時間后,我覺得有些插件,值得推薦一下.我這里的開發環境是win10下vscode+Node.js 
在vscode的主UI的左邊工具欄的最下邊,就是插件管理了,如下圖 
這里寫圖片描述

beautify

這是一個代碼美化插件,一定要有

ESLint

這是一個代碼檢查的插件,一定要有,很不錯.下面是我的配置使用.eslintrc

module.exports = {
"env": {
"commonjs": true,
"es6": true,
"node": true
},
parser: "babel-eslint",
"parserOptions": {
"sourceType": "module",
},
"extends": "eslint:recommended",
"rules": {
"no-console": 0,
"semi": [2, "always"],
"no-this-before-super": 2,
"no-var": 2,
"no-cond-assign": 2, //禁止在條件表達式中使用賦值語句
"no-dupe-args": 2, //函數參數禁止重名
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-extra-semi": 0,
"no-constant-condition": 0,
"no-ex-assign": 2,
"no-func-assign": 2,
"no-extra-semi": 2,
"no-irregular-whitespace": 2,
"no-negated-in-lhs": 2,
"no-obj-calls": 2,
"no-unreachable": 2,
"use-isnan": 2,
"default-case": 2,
"no-invalid-this": 2,
"consistent-return": 0,
"valid-jsdoc": 2,
"block-scoped-var": 0,
"complexity": [2, 20],
"require-yield": 0,
"no-mixed-spaces-and-tabs": 2, //注釋格式要求JSDoc格式
"require-jsdoc": [2, {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": false,
"ClassDeclaration": false
}
}],
"linebreak-style": 0
}
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

JavaScript (ES6) code snippets

從node 6.x后,就支持JavaScript ES6很多語法了, 6.9.x開始,已經支持99%的ES6了,所以這個插件很必要. 
不能理解,node 6.x為什么不支持import

Numbered Bookmarks

一個書簽工具,還是很有必要的,但是感覺功能還比較弱

tortoise-svn

SVN的集成插件,雖然都用Git了,但svn還是很不錯的

VSCode Great Icons

這個是非常必要的,這個為每個文件類型增加了一個圖標,例得項目的目錄樹很直觀,這個一定要用.

最后

上述是我常用的插件,還有很多新插件,還不清楚,等大家一起發現,有好的,都推薦一下.

posted @ 2017-04-17 12:01 冬瓜 閱讀(7272) | 評論 (0)編輯 收藏

在很多聊天中,會有許多表情,這些表情都是類似”[微笑]”的這種,然后寫了一個正則表達式,保留在這里,便于以后使用中.這里的提取支持提取中文.在Node.js 6.10.2下運行通過.
 1 let testStr = "now [里斯本] [test002] [ddddd] [adfasd][3234]";   
 2 
 3 function getFaceTag(message) {
 4     let re = /\[([\u4e00-\u9fa5\w]+)\]/g;    
 5     let r = {fulltag:[],tags:[]};
 6     let m;
 7     while(m = re.exec(message)) {
 8         r.fulltag.push(m[0]);
 9         r.tags.push(m[1]);
10     }
11     return r;
12 }
13 
14 let k = getFaceTag(testStr);
15 console.log(k);
posted @ 2017-04-17 11:41 冬瓜 閱讀(1051) | 評論 (0)編輯 收藏

僅列出標題
共17頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            香蕉久久夜色精品国产| 一区二区成人精品| 男男成人高潮片免费网站| 欧美在线视频免费播放| 久久精品视频免费播放| 久久黄金**| 久久精品久久综合| 免费观看成人www动漫视频| 欧美成人激情在线| 欧美另类极品videosbest最新版本| 欧美成人自拍视频| 国产精品久久久久一区二区三区共| 国产偷国产偷精品高清尤物| 亚洲国产成人tv| 亚洲影院在线观看| 麻豆精品一区二区av白丝在线| 亚洲国产小视频在线观看| 亚洲精品一区二区三区99| 亚洲一区视频在线观看视频| 久久久久国内| 欧美视频精品在线| 尤物网精品视频| 一区二区三区免费看| 另类激情亚洲| 亚洲一区二区三区涩| 久久综合导航| 国产精品一区二区久久久久| 91久久国产精品91久久性色| 校园激情久久| 久久在线播放| 亚洲国产成人久久综合| 亚洲精品你懂的| 国产视频亚洲精品| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩视频中文| 中文无字幕一区二区三区| 午夜国产精品影院在线观看 | 亚洲免费人成在线视频观看| 午夜精品久久久久久久久久久久 | 亚洲综合国产激情另类一区| 亚洲欧美乱综合| 久久久久久高潮国产精品视| 欧美精品不卡| 国产日韩在线一区| 亚洲人成网站777色婷婷| 久久精品日产第一区二区| 亚洲免费福利视频| 欧美好吊妞视频| 在线观看免费视频综合| 欧美一区二区三区免费观看 | 亚洲一二三区在线观看| 欧美日韩国产在线一区| 欧美三级黄美女| 99天天综合性| 欧美精品一区二区三区在线播放| 在线观看欧美日韩国产| 久久久人成影片一区二区三区观看 | 国产美女精品一区二区三区| 亚洲一区二区三区免费观看| 日韩视频在线观看免费| 欧美日韩国产成人在线| 亚洲毛片av在线| 亚洲精品久久| 欧美日韩伊人| 亚洲欧美综合v| 亚洲欧美综合v| 国内综合精品午夜久久资源| 久久精品五月| 久久午夜电影| 亚洲伦理精品| 最近中文字幕mv在线一区二区三区四区| 久久人人爽人人爽爽久久| 亚洲大胆av| 亚洲日本激情| 国产精品日本一区二区| 欧美在线国产精品| 久久精品国产99国产精品| 国产真实乱偷精品视频免| 欧美成人免费网| 亚洲成人原创| 亚洲第一偷拍| 国产精品久久久久久久一区探花| 西瓜成人精品人成网站| 西瓜成人精品人成网站| 激情成人在线视频| 亚洲国产高清视频| 国产精品二区三区四区| 久久精品国内一区二区三区| 久久亚洲不卡| 亚洲一区观看| 午夜视频久久久久久| 亚洲国产日韩在线| 亚洲一区一卡| 日韩亚洲精品电影| 欧美一级淫片aaaaaaa视频| 91久久精品国产| 亚洲一卡久久| 亚洲毛片av| 久久久久这里只有精品| 夜夜精品视频| 久久精品亚洲一区二区三区浴池 | 欧美日韩一区二区免费视频| 先锋影院在线亚洲| 欧美精品一区二区三区久久久竹菊| 性做久久久久久久免费看| 久久综合久久综合九色| 午夜精品久久久久99热蜜桃导演| 老牛影视一区二区三区| 午夜一级久久| 欧美精品导航| 欧美96在线丨欧| 国产色视频一区| 正在播放欧美视频| 夜夜爽av福利精品导航| 美女视频黄a大片欧美| 久久久国产一区二区三区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 国产精品亚洲美女av网站| 欧美激情视频一区二区三区不卡| 国产欧美日韩综合| 一本久道久久综合中文字幕| 91久久在线播放| 老牛嫩草一区二区三区日本| 久久久国产亚洲精品| 国产精品卡一卡二卡三| 亚洲精品少妇30p| 亚洲精品久久视频| 欧美a级片网站| 欧美黄色精品| 亚洲国产精品视频一区| 久久九九久精品国产免费直播| 欧美亚洲免费高清在线观看| 国产精品99一区| 亚洲视频一区在线观看| 亚洲欧美一区二区视频| 国产精品久久久免费| 亚洲男女毛片无遮挡| 欧美一区二区三区电影在线观看| 国产美女精品视频| 久久黄色影院| 在线播放不卡| 久久天天狠狠| 欧美刺激午夜性久久久久久久| 精品动漫3d一区二区三区| 久久久久久网站| 欧美成在线视频| 99在线精品视频| 国产精品国产三级国产专播精品人 | 欧美一区二区三区免费视频| 欧美一区午夜精品| 国产欧美午夜| 久久只精品国产| 亚洲狠狠丁香婷婷综合久久久| 亚洲三级影院| 国产精品乱子久久久久| 欧美一区二区三区啪啪| 欧美96在线丨欧| 亚洲天堂成人在线视频| 国产欧美欧美| 久久久亚洲影院你懂的| 亚洲精品国产精品国产自| 亚洲一二三区在线观看| 国产人成精品一区二区三| 久久亚洲视频| 一级成人国产| 玖玖玖国产精品| 一区二区冒白浆视频| 国产欧美午夜| 欧美黄在线观看| 午夜精品电影| 91久久精品美女高潮| 欧美一级黄色网| 亚洲免费观看在线观看| 国产日韩精品一区二区浪潮av| 美女视频黄免费的久久| 亚洲欧美日韩在线高清直播| 91久久精品国产91久久| 久久久久久久性| 亚洲欧美偷拍卡通变态| 日韩视频免费在线观看| 国产无遮挡一区二区三区毛片日本| 欧美国产精品日韩| 性做久久久久久| 99精品国产福利在线观看免费| 久久露脸国产精品| 亚洲午夜激情免费视频| 在线播放中文一区| 国产精品美女久久久浪潮软件| 乱码第一页成人| 欧美资源在线观看| 亚洲无线一线二线三线区别av| 欧美黑人多人双交| 久久国产手机看片| 亚洲一区视频在线观看视频| 亚洲人成绝费网站色www| 激情综合自拍| 国产揄拍国内精品对白| 国产精品久久久久久久久久妞妞| 欧美国产日本在线| 久热精品在线视频|