ARTS

2018-12-17 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Longest Common Prefix

Solution

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    var prefix = strs[0];

    var strIndex = 0;
    var res;
    while(strIndex < strs.length) {
        res = strs[strIndex].match('^' + prefix);
        if (!res) {
            prefix = prefix.slice(0, -1);
        } else {
            strIndex++;
        }
    }
    return (res && res[0]) || '';
};

var arr = ["flower","flow","flight"];
console.log(arr, longestCommonPrefix(arr), 'fl');
arr = ["dog","racecar","car"];
console.log(arr, longestCommonPrefix(arr), '');
arr = ["flower","flow","flight"];
console.log(arr, longestCommonPrefix(arr), 'fl');
arr = ["flower"];
console.log(arr, longestCommonPrefix(arr), 'flower');

Review

Data Classes https://kotlinlang.org/docs/reference/data-classes.html#data-classes

定义 data class

data class User(val name: String, val age: Int)

意味着

public class User {

    private final String name;
    private final Int age;

    public User(String name, Int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Int getAge() {
        return age;
    }

    @Override
    public boolean equals(Object other) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }

    @Override
    public String toString() {
        ...
    }

}

Tip

UGC / PGC

UGC(User-generated Content,用户生产内容) PGC(Professionally-generated Content,专业生产内容)

Share

未完待续。。。

hackathon 有感而发

2018-12-10 00:00:00 +0000

短短 2 天 hackathon 就结束了。没有得奖,聊以为重在参与。

感觉强压或疲劳的状态下就容易影响判断。遇到一个小 bug,'float32' is not JSON serializable,结果我这边花了好多时间都解决不了。。。而中国东西其实很简单的只要把 numpy float32 的那个数字改为 float 或者改为 string 就好啦。

心得体会:

  1. 不能高估自己
  2. 可能很简单的问题,临场就是想不出来
  3. 要有充足的睡眠

未完待续。。。

ARTS

2018-12-10 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Container With Most Water

Solution

/**
 * https://leetcode.com/problems/container-with-most-water/
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    if (height <= 1) return 0;
    var res = 0;
    var currentHeight;
    var index1 = 0;
    var index2 = height.length - 1;
    var distance = index2 - index1;
    while(true) {
        if (index1 >= height.length) {
            break;
        }
        if (index2 <= index1) {
            break;
        }

        distance = index2 - index1;

        if (height[index1] < height[index2]) {
            currentHeight = height[index1];
            index1++;
        } else {
            currentHeight = height[index2]
            index2--;
        }
        var tmpRes = currentHeight * distance;
        if (res < tmpRes) {
            res = tmpRes;
        }
    }
    // algorithm 2
    // for (var index1 = 0; index1 < height.length; index1++) {
    //     for (var index2 = height.length; index2 > index1; index2--) {
    //         if (height[index1] < height[index2]) {
    //             currentHeight = height[index1];
    //         } else {
    //             currentHeight = height[index2]
    //         }
    //         distance = index2 - index1;
    //         var tmpRes = currentHeight * distance;
    //         if (res < tmpRes) {
    //             res = tmpRes;
    //         }
    //     }
    // }
    return res;
};

var arr;
arr = [1,8,6,2,5,4,8,3,7];
console.log('maxArea', maxArea(arr), 49);
arr = []
console.log('maxArea', maxArea(arr));
arr = [1];
console.log('maxArea', maxArea(arr), 0);

arr = [1,8,6,2,5,4,8,3,7, 8];
console.log('maxArea', maxArea(arr), 64);
arr = [2,3,4,5,18,17,6]
console.log('maxArea', maxArea(arr), 17);

Review

5.4. Numeric Types — int, float, long, complex https://docs.python.org/2/library/stdtypes.html#typesnumeric

数字类型

这则文档介绍了 Python 中的数字类型:整数、浮点数、长整型和复数。

Python 标准的 float 就是 C 的 double 类型。基本的加减乘除都是有的,取整,取绝对值变更数字类型也不在话下。

Tip

Python3 解析 Json 直接就是 json.dumps,但是如果遇到数字是 float32 的情况的时候,Python 不会自己去动态转类型,会报错 'float32' is not JSON serializable。这个时候可以解决的方式有,str(float32Number) 或者 float(float32Number) 等。

Share

Hackathon 有感而发

https://lincolnge.github.io/programming/2018/12/10/hackathon.html

tensorflow

2018-12-03 00:00:00 +0000

Install TensorFlow

配置指南:

# Python3
$ brew install python
# 在 profile 中添加 Python3 环境变量
$ cat ~/.bash_profile
export PATH="/usr/local/opt/python/libexec/bin:$PATH”

$ pip install six bumpy

$ pip install tensorflow

注意事项:

pip install tensorflow 出错

$ pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.8.0-py3-none-any.whl
# 装 1.8 的版本使用 TensorFlow 最新代码编译出错,这时应该装最新版的 TensorFlow。
$ pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.12.0-py3-none-any.whl

https://github.com/tensorflow/tensorflow/issues/20444

ARTS

2018-12-02 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Regular Expression Matching

Solution

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function(s, p) {
    var matchRes =  s.match(p);
    return (matchRes && matchRes[0]) === s;
};

最近几周一直想着 TensorFlow 和大数据只能说草草写了算法。我理解这个题目是希望实现一个正则匹配,而不是简单实用内置的正则。

Review

Image Recognition https://www.tensorflow.org/tutorials/images/image_recognition

图像识别

TensorFlow 的图像识别指在使用 Inception-v3 的理论去识别人类不费吹灰之力的图像识别。

Tip

JS 的 Decorator 可以继续套 Decorator,此时新的 Decorator 修饰的是它里面的 Decorator 函数。

Share

TensorFlow 环境搭建

https://lincolnge.github.io/programming/2018/12/03/tensorflow.html

ARTS

2018-11-26 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description ZigZag Conversion

Solution

/**
 * https://leetcode.com/problems/zigzag-conversion/
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    if (numRows == 1) return s;

    // let rows = new Array(numRows);
    var rows = [];
    for (var i = 0; i < numRows; i++) {
        rows[i] = [];
    }

    var curRow = 0;
    var goingDown = false;
    for (var i = 0; i < s.length; i++) {
        // if (!rows[curRow]) rows[curRow] = [];
        rows[curRow].push(s[i]);
        if (curRow === 0 || curRow === numRows - 1) goingDown = !goingDown;
        curRow += goingDown ? 1 : -1;
    }

    var result = '';
    for (var i = 0; i < rows.length; i++) {
        for (var j = 0; j < rows[i].length; j++) {
            result += rows[i][j];
        }
        // result += rows[i].join(''); // 原生的 for 循环更快。
        // result = result.concat(rows[i]); // concat 更慢。。。
    }
    return result;
};


console.log(convert('PAYPALISHIRING', 3), 'PAHNAPLSIIGYIR', convert('PAYPALISHIRING', 3) === 'PAHNAPLSIIGYIR');
console.log(convert('PAYPALISHIRING', 4), 'PINALSIGYAHRPI', convert('PAYPALISHIRING', 4) === 'PINALSIGYAHRPI');
console.log(convert('Apalindromeisaword,phrase,number,orothersequenceofunitsthatcanbereadthesamewayineitherdirection,withgeneralallowancesforadjustmentstopunctuationandworddividers.', 2)
    ===
    "Aaidoeswr,haenme,rtesqecouishtabrateaeaietedrcinwtgnrlloacsoajsmnsoucutoadodiiesplnrmiaodprs,ubroohreunefnttacneedhsmwynihrieto,iheeaalwnefrdutettpntainnwrdvdr."
)

// convert('PAYPALISHIRING', 3);

Review

Exploring EcmaScript Decorators https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841

探索 JS 装饰器

装饰器就是接收一个函数并返回具有附加功能的函数。装饰器为调用高阶函数提供了一种非常简单的语法。

Tip

bee’s knees

出類拔萃的人或事物

https://www.businessweekly.com.tw/article.aspx?id=18435&type=Blog

Share

未完待续…

关于安全的日常操作

2018-11-19 00:00:00 +0000

安全对于我们平时工作中是一件很重要的事情。

因此在日常中我们应该尽可能做好并且规避一些不安全的操作。

密码使用密码管理器

比如说使用 1Password、keychain 这些密码工作。iOS 的 keychain 在 iOS 12 的时候也可以在 App 上直接调取 keychain 中的账号密码,非常方便。keychain 本身就可以生成随机密码。

ssh 使用不同的秘钥

比如公司的 Git 仓库与 GitHub 分别使用不同的 ssh 秘钥

╰─$ ls ~/.ssh
config       id_rsa.github      id_rsa.example

其中 config 为秘钥的配置项,ssh 到不同的服务器时可自动切换为不同的秘钥。

╰─$ cat config
Host *
    ControlPersist yes
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p

Host *.example.com
    IdentityFile ~/.ssh/id_rsa.example
    User xxxx@example.com

Host *github.com
    IdentityFile ~/.ssh/id_rsa.github
    User xxxx@qq.com

引用:

ARTS

2018-11-18 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Palindrome Number

Solution

/**
 * https://leetcode.com/problems/palindrome-number/
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    if (x < 0) {
        return false;
    }
    var array = String(x).split('');
    var length = array.length;
    var left = null;
    var right = null;
    for (left = 0, right = length - 1; left < right; left += 1, right -= 1) {
        if (array[left] !== array[right]) {
            return false;
        }
    }
    return true;
};




// var isPalindrome = function(x) {
//     if (x % 10 === 0 && x !== 0) return false;
//     if (x < 0) {
//         return false;
//     }
//     var newNumber = Number(String(x).split('').reverse().join(''));
//     if (x === newNumber) {
//         return true;
//     }
//     return false;
// };

console.log(isPalindrome(121), true);
console.log(isPalindrome(123), false);
console.log(isPalindrome(-121), false);
console.log(isPalindrome(10), false);
console.log(isPalindrome(0), true);


Review

How to Build Amazing Development Teams https://medium.com/s/story/building-amazing-development-teams-ebeca87eb124

如何组建一支优秀的团队

一支优秀的技术团队足以胜任企业中在技术中面临的挑战与困难。 建立一支优秀的团队是相互的,管理者需要给 team 里面每个成员以成长空间,团队成员也能尽己所能而成长。雇佣愿意学习的开发。训练、动机、责任心、人是一个优秀团队凝聚的核心。同理,如果我们想要进一个优秀的团队,也应该让自己在这几个方面有所建树。

Tip

vue 的 store 如果太大将会影响页面的性能。 这个时候可以这么去处理。

  • 减少 store 的大小。
  • JSON数据规范化(normalize)。

https://juejin.im/post/5b960fcae51d450e9d645c5f

Share

关于安全的一些日常操作

https://lincolnge.github.io/science/2018/11/19/security.html

ARTS

2018-11-11 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description https://leetcode.com/problems/string-to-integer-atoi/

Implement atoi which converts a string to an integer.

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned.

Note:

Only the space character ' ' is considered as whitespace character.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31,  2^31 − 1]. If the numerical value is out of the range of representable values, INT_MAX (2^31 − 1) or INT_MIN (−2^31) is returned.
Example 1:

Input: "42"
Output: 42
Example 2:

Input: "   -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
             Then take as many numerical digits as possible, which gets 42.
Example 3:

Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.
Example 4:

Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical
             digit or a +/- sign. Therefore no valid conversion could be performed.
Example 5:

Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer.
             Thefore INT_MIN (−2^31) is returned.

Solution

/**
 * @param {string} str
 * @return {number}
 * https://leetcode.com/problems/string-to-integer-atoi/
 */
var myAtoi = function(str) {
    var result = parseInt(str, 10);
    if (isNaN(result)) {
        return 0;
    }
    if (result >= Math.pow(2, 31)) {
        return Math.pow(2, 31) - 1;
    } else if (result < -Math.pow(2, 31)) {
        return -Math.pow(2, 31);
    }
    return result;
};

console.log(myAtoi('42'), 42);
console.log(myAtoi('+-42'), 0);
console.log(myAtoi('     -42'), -42);
console.log(myAtoi('4193 with words'), 4193);
console.log(myAtoi('words and 987'), 0);
console.log(myAtoi('-91283472332'), -2147483648);

/**
 * https://segmentfault.com/a/1190000010571914
 * JavaScript 实现 parseInt()
 */

Review

Comparing Flow with TypeScript https://medium.com/the-web-tub/comparing-flow-with-typescript-6a8ff7fd4cbb

这篇文章指在比较 Flow 与 Typescript 的异同。

Flow 和 Typescript 皆是使 JavaScript 可以以静态类型的方式去书写,即可使用静态类型语音的优势。但是 Flow 比 Typescript 更简单,开箱即用、对库/框架/编译器更好的兼容性、它有能力保持 JS 的纯粹。只在项目开头添加 // @flow 即可。

Tip

JS: Array.reverse() vs. for and while loops https://jsperf.com/js-array-reverse-vs-while-loop/66

我们可以从这篇文章获知 JS 的数组颠倒使用 for 循环的 swap half、XOR swap half 效率最高。

Share

css 的 white-space

换行符 空格和 Tab 文本超出容器宽度 -
nomal 忽略 折叠 换行
nowrap 忽略 折叠 不换行
pre 换行 保持原样 不换行
pre-wrap 换行 保持原样 换行
pre-line 换行 折叠 换行

相关文档:

ARTS

2018-11-04 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123
Output: 321
Example 2:

Input: -123
Output: -321
Example 3:

Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31,  2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

Solution

/**
 * https://leetcode.com/problems/reverse-integer/
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    var result = Math.abs(x);
    symbol = 1;
    var infinityNum = Math.pow(2, 31);
    console.log('infinityNum', infinityNum);
    if (x < 0) {
        symbol = -1;
    }
    var resultValue = Number(String(result).split('').reverse().join('')) * symbol;
    if (resultValue > infinityNum - 1 || resultValue < -infinityNum) {
        resultValue = 0;
    }
    return resultValue;
};


// console.assert(reverse(123), 321);
// console.assert(reverse(-123), -321);
// console.assert(reverse(120), 21);

// console.log(reverse(123), 321);
// console.log(reverse(-123), -321);
// console.log(reverse(120), 21);
// console.log(1534236469, reverse(1534236469));

Review

How to set up a TypeScript project https://medium.freecodecamp.org/how-to-set-up-a-typescript-project-67b427114884

这篇文章指导我们如何搭建一个 React TS 的项目。指导我们选择 ES 的某个版本的原因,诸如浏览器版本、浏览器内核、JS 大小等。之后的安装步骤可直接查看文章。

Tip

TypeScript ESLint Parser https://github.com/eslint/typescript-eslint-parser

typescript-eslint-parser 是一个 Eslint 的解析器,利用 TypeScript ESTree 允许ESLint使用Iint TypeScript源代码。

Share

Eslint vs Tslint

优缺点对比

  1. Eslint 可以继承项目原本的配置项。
  2. Tslint 需要重新配置。
  3. Tslint 对 vue 并不友好。
  4. Eslint 可能无法校验 Tslint 的部分逻辑。

typescript-eslint-parser 是通过编译 TS 到一个 Eslint 可识别的代码,然后再运行 Eslint 规则。所以一些 TS 特有的规则 (type/interface 等)全部无法校验,这种代码校验对于 TS 项目来说是不完整的。typescript-eslint-parser 对一部分 ESLint 规则支持性不好

相关文档: