Skip to content
Ider

沉淀我所学习,累积我所见闻,分享我所体验

Primary Navigation Menu
Menu
  • Home
  • About Ider
    • Who Ider?
    • Why Ider?
    • How Ider?
    • Where Ider?
    • What Ider?

Special Tricks(奇技妙招)

2016-10-04
04 October
On October 4, 2016
In Knowledge Base(心得笔库), Special Tricks(奇技妙招)

从Terminal截取Android设备的屏幕

做Android开发的时候,经常会需要截取设备的屏幕甚至录制设备屏幕,来让同事知道提交的代码实现的功能,或者让他们知道产品中出现来什么问题。截取Android设备的屏幕有很多方法,比如在Nexus系列同时按下“电源”和“音量调低”按钮来截取,也可以用第三方程序来完成。通过另一部手机来拍照录像也是可行的方案。但是这些方法还需要想办法将文件传输到电脑上,又要多一步麻烦的操作。

Mac电脑上也有一些应用程序可以截屏Android设备,但是我更喜欢用终端指令,令人开心的是Android自带的 adb 已经提供了截取屏幕和录制屏幕的指定:

[codesyntax lang=”bash” lines=”normal”]

$ adb shell screencap /sdcard/screen.png
$ adb shell screenrecord --verbose /sdcard/demo.mp4

[/codesyntax]

不过生成的文件依然保存在设备中,还需要用adb pull指定来转到电脑上

为了让整个过程更加的便捷,我将这些指令包裹在bash方法中,然后一个指令来完成截取和传输的工作。

截取Android设备当前屏幕并保存到执行指令的电脑目录上:

[codesyntax lang=”bash” lines=”normal”]

# capture screen of android device
andrdroidScreenCapture() {
    curTime=`date +%Y-%m-%d-%H-%M-%S`
    tmpeName="$curTime.png"
    [[ -n $1 ]] && fileName=$1 || fileName=$tmpeName
    devicePath="/sdcard/$tmpeName"
    adb shell screencap -p $devicePath
    adb pull $devicePath $fileName
    adb shell rm $devicePath
}

[/codesyntax]

录取Android设备屏幕活动,结束后将视频文件保存到执行指令的电脑目录上:

[codesyntax lang=”bash” lines=”normal”]

export ADB_SHELL_SCREENRECORD_ARGS='--verbose --bit-rate 2000000'
# record screen of android device
androidScreenRecord() {
    echo -e "\033[1m(press Ctrl-C to stop recording)\033[0m"
    curTime=`date +%Y-%m-%d-%H-%M-%S`
    tmpeName="$curTime.mp4"
    [[ -n $1 ]] && fileName=$1 || fileName=$tmpeName
    devicePath="/sdcard/$tmpeName"
    adb shell screenrecord $ADB_SHELL_SCREENRECORD_ARGS $devicePath
    sleep 1 # wait for video encoding finish
    adb pull $devicePath $fileName
    # Don't delete copy in device.
    # adb shell rm $devicePath
    open $fileName
}

[/codesyntax]

较短的指令别名,并通过提供的文件的扩展名来决定是截屏还是录制:

[codesyntax lang=”bash” lines=”normal”]

function asc() {
    if [[ -z $1 ]]; then
        echo "Please provide a filename."
        echo "Provideing .png extension for capturing the device screen, and providing .mp4 for recording the device screen."
        return
    fi

    if [[ $1 == *.png ]]; then
        andrdroidScreenCapture $1
    elif [[ $1 == *.mp4 ]]; then
        androidScreenRecord $1
    else
        echo "Filename with unknow extension, only .png and .mp4 are supported"
    fi
}

[/codesyntax]

完整脚本代码可以在Gist上找到,把它们加入到Mac电脑的~/.bash_profile中,连接上开启了“开发者模式”的Android设备就可以方便截图了。

http://blog.iderzheng.com/wp-content/uploads/2016/10/android-screen-capture-SD.mp4

 

References:
  1. Capture or record android screen, pull file to Mac when it’s completed
  2. ADB Shell Commands | Android Studio
  3. Android Debug Bridge | Android Studio
2016-03-31
31 March
On March 31, 2016
In Article Collection(聚宝收藏), IT Products(数码产品), Special Tricks(奇技妙招)

让Mac开口说话

《实用Mac的Dictionary应用程序》已经帮助我们翻译英文单词,提高了阅读的能力,但是“听”和“说”还是大问题。发音要是不标准,念出来给别人听可能还是得不到理解。Mac也想到了这个问题,所以自带了发音程序来,当然机器念出来的英语还是会有不流畅的感觉,有些发音也可能不到位。

在许多原生Mac应用程序中,都很好的集成了发音选项,只要选取想要电脑阅读的段落,然后选择“Start Speaking”就可以听到朗读开始了。
speech-on-page

在System Preference里也可以为Speech设置快捷键,这样无论在哪里选中文字都可以让电脑来阅读:
speech-shortcut
Read More →

2016-03-30
30 March
On March 30, 2016
In Front Interface(界面构想), IT Products(数码产品), Special Tricks(奇技妙招)

实用Mac的Dictionary应用程序

dictionary学习英文最需要的是一本字典来查看单词的意思。在电脑上虽然可以上网来搜单词,但是被网速约束总是会让人烦躁,让英文阅读变得不流畅,所以就更希望能够有电子字典可以直接使用。以前使用Window PC的时候有很多英汉汉英字典可以选用,但到了Mac电脑上就没有什么功能和界面都比较完善的应用。

其实Mac自带的Dictionary应用就已经非常强大:庞大词库,准确释义;离线查询,在线Wiki;屏幕选词,原生结合;清爽界面,稳定流畅。而且在最新的系统中,字典库还包含了牛津英汉和牛津汉英字典,就不用在网上到处找中英字典安装。
Read More →

2016-02-29
29 February
On February 29, 2016
In Article Collection(聚宝收藏), IT Products(数码产品), Knowledge Base(心得笔库), Special Tricks(奇技妙招)

关闭Mac的不同模式和方法

现在每个公司都为会员工配备工作电脑,但是对电脑的使用也会有诸多的限制和保护,以免公司的重要资料被泄露。其中最基础的一条就是电脑必须要有登录密码,并且当人离开电脑的时候必须要锁定电脑(Lock Screen)防止被别人获取到电脑上的内容。本文就来分享一些快速让电脑进入屏幕锁定状态的技巧和操作。

首先来分一下“关闭”的几个等级,它们从高到低的等级如下:

  • 关闭电脑(Shut down):这个功能只在系统或者软件更新,或者死机时才会用到,其它时候电脑基本不关闭。
  • 登出用户(Log out):公司电脑大多只用一个账户,除了少数应用需要登出后重新登录才能初始化好。
  • 进入睡眠(Sleep):这个功能基本是取代关机功能,大多数情况是因为电脑在一定时间没有操作自动进入了该状态。
  • 关闭屏幕(Display off):只是屏幕没有显示,电脑还在运行,启动屏保也可以算是其中一种。

之后我们主要也是针对最后两种等级来讨论。

让Mac笔记本电脑进入睡眠方式最直接的方法自然是合上电脑。而其他关闭状态则可以从Mac的苹果菜单栏( Menu)下选择相应的选项。
menu

当按住Option键时选项中的…会消失,此时点中选项系统不会弹出确认框,直接执行选定的操作。
Read More →

2016-02-23
23 February
On February 23, 2016
In Design Patterns(设计模式), Knowledge Base(心得笔库), Language Tips(语言初试), Special Tricks(奇技妙招)

Java的final关键字

在《Java关键字分类解析》里介绍了所有Java关键字和保留字的基本用途,到《Java修饰符及其作用对象》又介绍了所有Java修饰符的应用。通过修饰符的表格看到final是唯一一个可以在类(Class)、方法Method、变量(Variable)上都能应用的,但前文也提到final在这些作用对象上的效果是不太一样的,本文就详细展开介绍一下final的具体效果。

final class

当一个类被定义成final class,表示该类的不能被其他类继承,即不能用在extends之后。否则在编译期间就会得到错误。
[codesyntax lang=”java” lines=”normal”]

package com.iderzheng.finalkeyword;

public final class FinalClass {
}

// Error: cannot inherit from final
class PackageClass extends FinalClass {
}

[/codesyntax]
Java支持把class定义成final,似乎违背了面向对象编程的基本原则,但在另一方面,封闭的类也保证了该类的所有方法都是固定不变的,不会有子类的覆盖方法需要去动态加载。这给编译器做优化时提供了更多的可能,最好的例子是String,它就是final类,Java编译器就可以把字符串常量(那些包含在双引号中的内容)直接变成String对象,同时对运算符+的操作直接优化成新的常量,因为final修饰保证了不会有子类对拼接操作返回不同的值。

对于所有不同的类定义—顶层类(全局或包可见)、嵌套类(内部类或静态嵌套类)都可以用final来修饰。但是一般来说final多用来修饰在被定义成全局(public)的类上,因为对于非全局类,访问修饰符已经将他们限制了它们的也可见性,想要继承这些类已经很困难,就不用再加一层final限制。

另外要提到的是匿名类(Anonymous Class)虽然说同样不能被继承,但它们并没有被编译器限制成final。
[codesyntax lang=”java” lines=”normal”]

import java.lang.reflect.Modifier;

public class Main {

    public static void main(String[] args) {
        Runnable anonymous = new Runnable() {
            @Override
            public void run() {
            }
        };

        System.out.println(Modifier.isFinal(anonymous.getClass().getModifiers()));
    }
}

// Output:
// false

[/codesyntax]
Read More →

2014-05-23
23 May
On May 23, 2014
In Knowledge Base(心得笔库), Language Tips(语言初试), Mobile Development(移动开发), Special Tricks(奇技妙招)

使用adb shell dumpsys检测Android的Activity任务栈

谈起Android程序开发,就需要了解其四个主要的部件:Activity、Service、ContentProvider、 BroadcastReceiver。而其中Activity是唯一直接控制程序界面呈现,直面用户操作的部件(当然BrowadCastReceiver也能通过桌面控件(App Widgets)来呈现有限的操作界面)。Android对于Activity有严格的生命周期控制,以限制开发者在适当的回调函数里的放上合适的代码。对于多个Activity的转换,Android也有非常好的管理和流畅的切换,对此Android还引入了任务栈(Task Stack)的概念,这个概念对于Android设备上得返回按键有极其重要的联系。

(大部分文档都将其表述为Tasks and Back Stack,但从官方文档的描述来看,Android的相对于Activity讲到的Task都视为一个存放Activities的Stack,所以将其称为Task Stack也不为过。)

在AndroidManifest中申明所要用到的Activity时可以设置不同的launchMode来得到不同的Activity“启动”效果。在使用startActivity开启新的Activity时,传入的Intent也可以设置不同的Flag来达到不同的效果。另一方面,在Activity启动时它可能又开启了另一个Activity,或者调用了finish()函数终结了Activity。

这使得Activity栈变得无法掌握,有时候按下返回按钮或者点击关闭当前Activity的操作,都不知道Android系统会把程序带到那个Activity,不确定这是否是最后一个Activity以致退出了整个程序。亦或者一些按钮和操作循环产生Activity而造成内存膨胀。对于这些问题,如果能够在调试期间知道当前任务栈的情况,就能很方便的观察和发现问题存在的原因,进而选择正确的launchMode,设置恰当Intent的Flag来使程序达到预期的效果。

Read More →

2013-12-26
26 December
On December 26, 2013
In Algorithm Analysis(算法分析), Data Structures(数据结构), Knowledge Base(心得笔库), Language Tips(语言初试), Special Tricks(奇技妙招)

bash中使用printf实现进制转换

最近工作中常涉及到编码转换的问题,比如发送URL的时候需要进行urlencode,上传内容的时候要对MD5进行BASE64的转换。当debug的只能看到8或者16进制的编码而想不到实际的字符是什么,就让人非常烦躁,所以总想有个什么快速的方式能帮助自己进行编码转换 。

最快的方式,应该就像小时候被乘法口诀表一样把他们的对应关系一一记住,但是可能年龄大了记住了东西,外加现在越来越依赖技术带来的便利所以总是不能也不愿意记这些进制关系,一碰到这些问题就Google搜索一下。但这显然这是很 浪费时间的。

如果是用Linux或者Mac系统,用Terminal的话就能带来很多的帮助,比如man ascii就会显出中ASCII在8、10和16进制下所有编码值了。这样子看到一个8或16进制的数,也能很快的找到对应的字符是什么了。不过这还是不过快,毕竟人眼查这样一张有序的表并不会进行二分查找。而且我们希望是能够在O(1)时间复杂度就能得到结果方法。

本文就总结怎么用printf的格式化在Bash环境中实现进制的转换,如果有那个比较好用或常用的,就可以添加到profile中在启动时载入使用。
Read More →

2013-12-02
02 December
On December 2, 2013
In Article Collection(聚宝收藏), Front Interface(界面构想), Special Tricks(奇技妙招)

CSS3实现关闭按钮

作为一名程序员,可以说有着较强的逻辑思维来编写程序代码,但是在界面设计上却常常因欠缺艺术思维而缺乏美观。在于前段开发的时候往往会碰到这样的窘境:能够用JavaScript实现功能、用CSS做好布局,但是在配色方面却显得无从下手。想要做Photoshop做一些效果图,却又不熟悉软件的使用,网上寻找到素材不是不能完全满足要求,就是有版权需要付费。作为一个公司可以聘请专业的美工人员来帮助完成这些需求,但是作为个人就只能自己想办法了。

幸好随着HTML5和CSS3标准化的一步步推进,各个浏览器对这些标准更加全面的支持和实现,许多以前靠依靠图片才能实现的效果,现在都可以通过CSS3的属性来实现。比如:让按钮看起来有立体感的阴影效果和渐变效果,以前只能放置背景图来实现,现在则可以用box-shadow和gradient来设置;以前想设计圆角边框,也得使用图片做背景,现在用border-radius就搞定了还能四个角区别设置。

在本文中将分享用CSS3设计出来的样式来呈现出关闭按钮的样子,这样以后想设计简单的对话框,就不需要求美工来帮忙画按钮的图片了。先来看看样式:

[codesyntax lang=”css” lines=”normal”]

/* basic style */
.close {
    /* still bad on picking color */
    background: orange;
    color: red;
    /* make a round button */
    border-radius: 12px;
    /* center text */
    line-height: 20px;
    text-align: center;
    height: 20px;
    width: 20px;
    font-size: 18px;
    padding: 1px;
}
/* use cross as close button */
.close::before {
    content: "\2716";
}
/* place the button on top-right */
.close {
    top: -10px;
    right: -10px;
    position: absolute;
}

[/codesyntax]Read More →

2013-04-23
23 April
On April 23, 2013
In Algorithm Analysis(算法分析), Data Structures(数据结构), Mathematical Theory(数学理论), Special Tricks(奇技妙招)

寻找比特位

人类有十个手指,所以我们的算数都是10 进制的,而计算机的世界里,所有事物都只由0和1呈现出来,所以数字也只能用2进制表示。因为2进制的表示方式,在计算机里对于数字的运算,除了现实中常用的“加减乘除”,更多了“与非或”这些位运算。

在进行数学运算的过程中,我们经常会总结出一些技巧方法,而这些方法其实跟进制有很大的关系。比如小学老师就告诉我们:检查一个整数能否被3整除,只要派定各个数位上的数字加起来是否能被3;判定一个整数是否能被5整除,只要看最后一位是不是0或5。而这些规律却不能适用到2进制表示的数字上。

不过利用2进制的特殊性,我们也能从位运算上找到很多的技巧。比如一个常见的面试问题:

有一组数包含了1到100的整数,且每个整数只出现一次且随机出现于数组中,现在有一个数被从中删除,请找出被删除的数。

Read More →

2012-12-08
08 December
On December 8, 2012
In Knowledge Base(心得笔库), Language Tips(语言初试), Special Tricks(奇技妙招)

JavaScript字符串操作的偏方怪法

字符串和数组在程序编写过程中是十分常用的类型,因此程序语言都会将String和Array作为基本类型,并提供许多字符串和数组的方法来简化对字符串的操作。JavaScript里面也提供了String类型和Array类型,并且有很多基本的String方法和Array方法来方便地对字符串进行合并、查找、替换、截取等处理。

JavaScript作为一个脚本语言,又提供了一种动态解析运行的机制,而这特性,又让使得在String操作的时候出现一些结合使用Array的有趣方法。这些方法可能有些偏门有点奇怪,但有时在效率、可读性、复用性上表现得却更好。
Read More →

Facebook
Twitter
LinkedIn
RSS
ZhiHu

Recent Posts

  • 三年居家工作感受
  • Pixel Watch智能手表和Pixel 5, 6 Pro 及 7 Pro手机
  • 我拥有过的无线耳机
  • 毕业工作一个月,我差点被开除
  • 我拥有过的移动硬盘
  • ProtoBuf 2.0 method count optimization for android development
  • 面过100场行为面试后

Categories

  • Algorithm Analysis(算法分析)
  • Article Collection(聚宝收藏)
  • Data Structures(数据结构)
  • Design Patterns(设计模式)
  • English Posts(英文写作)
  • Front Interface(界面构想)
  • IT Products(数码产品)
  • Knowledge Base(心得笔库)
  • Language Tips(语言初试)
  • Mathematical Theory(数学理论)
  • Mobile Development(移动开发)
  • Programming Life(程序人生)
  • Reading Notes(阅而后知)
  • Software Engineering(软件工程)
  • Special Tricks(奇技妙招)
  • Tangential Speech(漫话杂谈)

Tags

Aero Android API Bash Binary Search Bitwise Operation Book C/C++ Career Chrome Conference CSS Debug Device DOM Extension Framework Game Gradle Hearthstone HTML Initialization Intellij Interview iOS Java JavaScript jQuery Keyword Language Issues Mac Microsoft Mobile Modifier Objective-C PHP Principle Reference Regular Expression Static String Tools Tutorial UI XML

Blogroll

  • Ahmed's Blog
  • Gert Lombard's Blog
  • Gordon Luk
  • Jack & Allison
  • 开发部落

Archives

Designed using Chromatic. Powered by WordPress.