Blog
Blog copied to clipboard
# Go交叉编译 标签(空格分隔): Go --- 更新了一版Frp,因为升级不兼容旧版本的缘故,对之前的Frps的Dockerfile进行了升级。主要变动是把之前Bundle的Frps修改为Build时编译。 因为Frp是用Go写的,顺便了解了一下Go的包管理。去中心化很有意思。 作者提供了Dockerfile,改起来很快。 因为原版的Dockerfile直接使用Golang镜像作为Base,最终生成的镜像比较大。Go的跨平台做的很方便,按照之前Frps的用法,只需要下载好对应平台的可执行文件就好了,不像Java还要要求JRE。那么使用Golang镜像作为Base,提供的Go编译环境实际上已经没有用了。 之前看到过分阶段构建的概念,发现Docker也实现了。就用分阶段构建的方式修改了一下Dockerfile。 坑在Alpine默认没有带`make`和`bash`。又想偷懒,直接用`golang:1.10`作为base编译了,然后发现在Alpine作为Base的Production镜像上无法启动。 原因是 > 采用了不同libc实现的debian系和alpine系存在不兼容的情况(golang:1.10基于debian) 解决方案有两种 1. 使用Alpine编译,在编译前先`apk --add make bash`,由于是分阶段构建,这部份的Clean操作就忽略掉了先。 2. 还是使用golang:1.10编译,需要使用静态构建。就是把之前用到动态链接库的地方直接静态编译进可执行文件中去。`CGO_ENABLED=0`标志使用静态构建。 方法2的优点是可以使用更新的Base镜像,比如scratch。 中途还补充了一下[Dockerfile: ENTRYPOINT和CMD的区别](https://zhuanlan.zhihu.com/p/30555962)的概念。 # Href - multi-stage-image-build-in-docker https://tonybai.com/2017/11/11/multi-stage-image-build-in-docker/...
# ELK概念 标签(空格分隔): 后端 --- Lucene是什么 Lucene是Apache软件基金会下的开源、免费、纯Java语言的全文检索工具包。 使用 > Lucene 的查询逻辑 AND 当两个查询条件都满足时,才认为匹配。例如Tom AND Jerry表示文档中都有Tom和Jerry时才返回。 OR 两个查询条件只要有一个满足,就认为匹配。例如Tom OR Jerry表示文档中含有Tom或者Jerry或者同时存在时才返回。 NOT 表示排除某个查询条件。例如Tom NOT Jerry表示文档中含有Tom并且没有Jerry时才返回。 通配符 ? * Lucene支持简单的通配符查询,例如?匹配单个字符,*匹配零个或多个字符。 ElasticSearch ElasticSearch是一个基于Lucene的搜索服务器。 Logstash...
# 智能指针 标签(空格分隔): Android C++ --- 内存管理方式 对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制。 https://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html 有了malloc/free为什么还要new/delete > malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。 如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。 https://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 智能指针实现利用的机制 > 对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命周期即将结束时,智能指针通过析构函数释放其管理的堆内存 Template in C++ 提取代码中公共的部分,把对应的类型提取为参数,编译时生成对应代码。如果非要粗暴的以Java的视角去看的话,写法看起来像是泛型。 --- > 轻量级指针的实现类为sp,它同时也是强指针的实现类。 为什么要这么说啊?给我一种 `sp implements...
# Kotlin Extensions 标签(空格分隔): Kotlin --- Kotlin有一个大量使用的语法糖,叫`Extensions` Google甚至在Github搞了一个开源的Lib https://github.com/android/android-ktx 这个功能实现的效果很神奇,看起来像是可以给一个类增加一个这个类没有实现的方法。 比如 ```Kotlin fun Solution.test () { println("test") } class Solution { } fun main(args: Array) { val solution = Solution()...
# ScrollView和键盘 标签(空格分隔): Android --- ScrollView在键盘弹出的时候会压缩子View的高度。而一旦把Activity设为全屏,就不会出现这个问题了。 顺便记录一下`windowSoftInputMode`的默认处理方式: --- > 备注:如果我们不设置"adjust..."的属性,对于没有滚动控件的布局来说,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式。 https://www.jianshu.com/p/e59a0b49cdc1?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation --- > 全屏模式 全屏模式不允许对界面进行Resize,因此一旦在style中设置了 `true` 则在AndroidManifest.xml中设置 `android:windowSoftInputMode="adjustResize"` 将无效 同理,在layout中增加ScorllView也无法解决问题。 http://fish119.site/2016/12/01/Android%E5%B0%8F%E6%8A%80%E5%B7%A7-Part-II/
# Intent.FLAG_ACTIVITY_NEW_TASK 标签(空格分隔): Android --- 遇到一个奇怪的现象。 设置了Flag启动一个已经在ActivityStack里的Activity。 ``` intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); ``` 调用过后发现启动的Activity居然被Destroy后重新创建了。 之前一直以为只要这么写,就肯定会调用之前Activity的`onNewIntent`,起到SingleTask的效果。 官方文档是这么解释的: https://developer.android.com/guide/components/activities/tasks-and-back-stack.html > FLAG_ACTIVITY_CLEAR_TOP If the activity being started is already running in the current task,...
# FragmentActivity requestCode 偏移 标签(空格分隔): Android --- ``` /** * Called by Fragment.startIntentSenderForResult() to implement its behavior. */ public void startIntentSenderFromFragment(Fragment fragment, IntentSender intent, int requestCode, @Nullable Intent fillInIntent, int...
# Android Library Project和 ButterKnife 8.2.+ 标签(空格分隔): Android ButterKnife --- 幸运,2016.7.10 发布的ButterKnife8.2.0 支持了Library Project(Android Studio 中的Module)中使用ButterKnife。解决了燃眉之急。 使用方法参考: 1. https://github.com/JakeWharton/butterknife 2. http://www.cnblogs.com/pedro-neer/p/5689566.html 刚接触的时候有些懵,各种编译错误。 刚开始使用的还是ButterKnife 7.0.1 升级了最新的Android Studio顺便发现ADT 14以上对于Library Project生成的R文件的id不再是final的了([参考](http://tools.android.com/recent/switchstatementconversion))。所以这种工程里面的switch-case不再支持`R.id.*`。解决了switch-case的错误以后,依然有许多地方报错,`@Bind(R.id.***)`报错,必须为常量表达式。没见过呀。之前一直都是这么用的。 查了半天资料,发现原来还是由于上面的原因导致报这个错。 搜索到一个ButterKnife的Fork库支持Library...
# NDK 开发静态注册 标签(空格分隔): Android NDK --- 粗暴的野路子上车NDK,可能需要之前简单的玩过Linux上的make这些东西才能大概跟上,否则,就当走马观花看看有哪些步骤是相对旧版可以省略的吧。 大概玩了一下NDK的东西,首先配置环境就不说了,Google官方的资料足够。 网上现在查到的资料好多比较旧,许多用Eclipse的,还有一部分用Android Studio,但是版本比较旧。 我这里使用的是Android Studio 3.0 Beta2. 刚开始玩的话建议直接新建一个空的Project,观察一下 build.gradle文件里面有什么不同,然后看看Project结构和平常Android项目有什么不同。 发现现在搞NDK的东西比之前容易好多了。也不需要`javah`去生成头文件,直接在Java文件写`public native void test ();` 然后ALT+Enter,Android Studio就直接可以静态注册关联C方法和Java方法了。 这里的重点是简单使用静态注册的方法来关联Java方法和C方法的时候,已经没有必要再搞什么Terminal运行javah或者自己设置External Tools 调用javah生成关联方法所使用的头文件了。 当然 static load...
# ProGuard outputs 标签(空格分隔): Proguard --- ProGuard outputs the following files after it runs: dump.txt Describes the internal structure of all the class files in the .apk file mapping.txt Lists...