技术小黑屋

URL中的 # 原来是这个意思

URL 是我们进行网络活动中很重要的概念,一个URL中可以包含域名,路径和参数等,

一个典型的 URL

1
https://www.example.com/fruits.html?from=google#apple

如何自定义一个 Gradle 任务

很多的项目是基于 gradle 构建,而且依托 gradle 的强大能力,我们可以实现更多的功能。比如像今天这样,我们会介绍如何创建一个自定义的 gradle 任务。

修改文件

  • (Android 项目)app 模块下的 build.gradle 为例

修复WebView资源未找到导致的崩溃问题

近期 应用新增了很多的崩溃,分析特征,发现崩溃集中在5.0-5.1.1系统上,崩溃的日志如下

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
51
52
53
54
55
56
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
at android.content.res.Resources.getText(Resources.java:318)
at android.content.res.VivoResources.getText(VivoResources.java:123)
at android.content.res.Resources.getString(Resources.java:404)
at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:694)
at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:618)
at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:631)
at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:780)
at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:619)
at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:556)
at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:312)
at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:96)
at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:264)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:123)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:110)
at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:107)
at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:261)
at android.webkit.WebView.<init>(WebView.java:554)
at android.webkit.WebView.<init>(WebView.java:489)
at android.webkit.WebView.<init>(WebView.java:472)
at android.webkit.WebView.<init>(WebView.java:459)
at com.tencent.smtt.sdk.WebView$a.<init>(WebView.java:2968)
at com.tencent.smtt.sdk.WebView.<init>(WebView.java:567)
at com.tencent.smtt.sdk.WebView.<init>(WebView.java:329)
at com.tencent.smtt.sdk.WebView.<init>(WebView.java:323)
at com.tencent.smtt.sdk.WebView.<init>(WebView.java:318)
at com.tencent.smtt.sdk.WebView.<init>(WebView.java:313)
at com.xxxx.webview.X5WebView.<init>(X5WebView.java:36)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1245)
at android.app.Activity.performStart(Activity.java:6099)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2367)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2466)
at android.app.ActivityThread.access$900(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1369)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5418)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

终端下双重过滤筛选内容

很多时候,我们需要对文件内容进行查找,查找出包含某段字符串的文件,比如这样

我们使用这个命令可以查找包含Ruby字符的全部文件和行数。

1
2
3
4
5
6
7
8
source git:(master) grep  -E "Ruby" --exclude-dir={.git,lib,.gradle,.idea,build,captures}   . -R --color=always -n
./_posts/2014-09-08-learn-sqlite-in-a-very-fast-way.markdown:9:最近用Ruby写了一个七牛的demo参赛作品,使用了sqlite3,用到很多操作,利用假期的时间,简单做一个快速掌握SQLite命令的小入门。
./_posts/2013-09-07-issues-about-installing-octopress.markdown:6:categories: Github OctoPress Ruby RVM
./_posts/2016-04-10-jit-friendly-checker-for-android.markdown:117:###为什么用Ruby
./_posts/2016-04-10-jit-friendly-checker-for-android.markdown:118:  * 答:有了idea时很纠结,因为不确定用什么语言实现,尤其是在Python和ruby之间,为此问了不少同学,最后“一意孤行”决定用Ruby了,不喜欢Python的强制对齐,超级喜欢Ruby的字符串模板。Ruby很简单,很人性化,相信你会喜欢的。
./_posts/2014-09-22-weekly-script-add-prefix-to-mutiple-files-in-ruby.markdown:6:categories: Ruby, 效率, 每周1脚本
./_posts/2014-08-21-file-code-sinppets-in-ruby.markdown:3:title: "Ruby常用文件操作"
./_posts/2014-08-21-file-code-sinppets-in-ruby.markdown:6:categories: Ruby

十个超级实用的git命令

git无疑已经成为了大家代码版本控制最多的工具了,这其中有不少人是使用终端来进行操作git。这里列出一些超级实用的git脚本,希望可以对大家开发有所帮助。

建议大家讲下面的脚本内容,都保存成脚本,然后设置执行权限,将所在目录加入环境变量,这样使用起来更加方便。

用好 Require,check,assert,写好 Kotlin 代码

在编码的时候,我们需要做很多的检测判断,比如某个变量是否为null,某个成员属性是否为true,执行某个操作结果是否成功。比如像下面的这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var isDiskMounted = true

fun createNewFile(file: File?): Boolean {
    return if (isDiskMounted) {
        if (file != null) {
            file.createNewFile()
            if (file.exists()) {
                true
            } else {
                println("Create file($file) failed")
                false
            }
        } else {
            println("File($file) is null")
            false
        }
    } else {
        println("Disk is not mounted")
        false
    }
}

修复Gradle因代理设置导致的超时问题

之前在项目中增加了一个项目依赖,可是配置的时候,怎么也无法下载下来。中终端执行gradle得到的错误日志如下

1
2
3
4

org.gradle.internal.resource.transport.http.HttpRequestException: Could not HEAD 'https://jcenter.bintray.com/com/google/code/findbugs/jsr305/2.0.1/jsr305-2.0.1-sources.jar'.
at org.gradle.internal.resource.transport.http.HttpClientHelper.performRequest(HttpClientHelper.java:96)
at org.gradle.internal.resource.transport.http.HttpClientHelper.performRawHead(HttpClientHelper.java:72)

未合并分支不怕丢,一个脚本快速搞定

我们使用 git 作为 版本控制工具,极大的提高了效率,但是随着业务的增多和自身对于提交内容原子性的要求,往往会产生很多的分支,这就难免有时候,在发版的时候,某些分支被遗忘提交,造成功能丢失等问题。

因而如果保证分支多而且不忘记合并,是一个我们需要解决的问题。

  • 单纯靠人为挨个去看,肯定是不行的
  • 如果有程序化处理就靠谱多了

INSTALL PARSE FAILED UNEXPECTED EXCEPTION 问题

顺手整理一个之前记录未文字输出的老问题,使用adb install爆出的问题

1
2
3
adb install -r -d "2.8.5-475.apk"
adb: failed to install 2.8.5-475.apk: Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION:
Failed to parse /data/app/vmdl981460948.tmp/base.apk: AndroidManifest.xml]

树莓派 Gitlab问题整理

E: Unable to locate package gitlab-ce

  • 不要使用sudo curl -sS https://packages.gitlab.com/install/repositories/gitlab/raspberry-pi2/script.deb.sh | sudo bash
  • 替换使用这个sudo curl -sS https://packages.gitlab.com/install/repositories/gitlab/raspberry-pi2/script.deb.sh | sudo os=raspbian dist=jessie bash
  • 然后执行sudo apt install gitlab-ce

一些关于微信分享的建议规范

实话讲,微信的文档真的是差强人意,除了让人难以忍受的代码使用截图展示外,其中关于一些分享的规范也不好找。

还好借助Google,找到了一些规范,涉及缩略图和文字个数等。

Nuc 设置断电后自动开机

步骤

  • 开机 看到启动界面后(多次)按 F2 进入BIOS
  • 进入Power Tab 向下滑动Secondary Power Settings区域
  • 找到 After Power Failure 选择Power On
  • 按 F10 保存并退出即可。
Visit Comet Browser