Karonl's Note
Inquisitive about everything
Docker Quickstart Terminal 失效问题
Docker

最新 2016-7-9

推荐安装 Docker for Mac 非 toolbox 原生版本

简单介绍:


Docker 是一款非常方便的虚拟化工具,与传统的虚拟化工具区别在于虚拟的层次,显然 Docker 是属于操作系统层面的。即同一个内核,利用类似命名空间的方法来虚拟出多个轻量级互不可见的运行环境沙箱。

Docker 的一个重要特性是自身复制和高兼容性,两个方法可以让 Docker 镜像在远端服务器迅速复制出一个和本地一致的运行环境。

  1. 使用 Dockerfile,只需把安装本地环境的过程记录到 Dockerfile 文件 并将之上传到服务器构建。
  2. 把整个本地环境 commit 成镜像,并且 docker push 到服务器的 Docker registry。很好,这很 git push

失效问题:


Docker 在 Linux 上通过命令行直接操作系统来进行应用环境虚拟化;在 macOX 和 Windows 上的原理是以虚拟机为运行核心,通过ssh让命令行可以和虚拟机进行交互来完成。

启动 docker 有两种模式:
安装完成后的启动图标 命令行/界面客户端

问题就出在当命令行工具 如:iterm2 升级后,点击 Docker Quickstart Terminal 图标并没有启动 macOX 的 default 虚拟机,只打开普通的终端。

在没有连接上虚拟机情况下,大部分 docker 命令会返回:

1
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

失效原因:


更新命令行工具会导致快捷启动失效,docker状态正常,但不会启动 deamon 服务端

1
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

基本上所有和服务端有交互的功能都不能用,在 macOS 下, docker 采用虚拟机模式来实现兼容,没有和 linux 那么原生,简单来讲就是 Docker Quickstart Terminal 不能触发启动虚拟机。

解决方法:


Docker Quickstart Terminal 本身是启动自身 app 包中的一个 start.sh 脚本文件,我用的是 item2 如果更新就会导致无法启动这个脚本。

解决方法有三:

  1. 重新安装 Docker Quickstart Terminal 会修复这种默认打开模式
  2. 使用 alias 运行 app 包里的脚本文件
    1
    alias dockerup="sh /Applications/Docker/Docker\ Quickstart\ Terminal.app/Contents/Resources/Scripts/start.sh"

添加完之后无需点击 Docker Quickstart Terminal 或其他客户端来启动 docker 服务端,当出现 Is the docker daemon running on this host?,直接使用 dockerup 命令行来启动。

  1. 替换 app 包中的启动脚本,修复为兼容 iTrem2
    1
    https://gist.github.com/gnachman/f61614d0335e185787b0/ea7a3f7b248390efa886557f6917e12a6c9c0cd6

注:先复制原文件出来,使用 open -a “Script Editor” 来打开 applescript 文件,修改后保存到桌面,再重新替换进去,需授权。包内内容无法直接修改。

室内地图控件 InDoorSurfaceView
Android SurfaceView

为何开发 InDoorView?

说说这个想法的由来,之前的一个 case ,大概是开发一个可以室内选工位的 app ,点击某个座位付费就是你账号名下的。这我们很容易想到是操作整齐得像表格的座位。可事实有点不一样,因为每个区域都是不同大小并且位置不一,而我们手上的材料只有一张标识有区域的 jpg 地图。

一开始我使用游戏引擎来做,结果可想而知,为了个简单功能引入整个库非常不明智。所以我开始着手开发一个可以精巧的操作图里不规则区域的库。

应用场景:


该控件可让室内图片上的区域拥有点击事件,可用于开发电影院选座、商场购物地图、展位摊位在线预定、办公场地租赁工位等需要操作不规则区域的功能。

示例图:

点击区域将显示出店铺信息

原理:


把读取地图底图 bitmap 和使用 Paint 的钢笔路径集合一同绘制到一个 canvas 上保存,并通过继承 SurfaceView 把 canvas 绘制到双缓画布中,通过 canvas.drawBitmap 实现缩放和移动,重写 view 点击事件结合 Region 判断点击坐标位于哪个区域内,再通过接口反馈事件。

采用把所有图案内容事先缓存到 canvas 的方法,使用非 UI 线程进行绘制,可实现每秒 60 次左右的界面绘制,实现流畅的移动和缩放操作;在没交互情况下,暂停绘制及刷新以节约计算资源。

特性:


  1. 性能较强,绘制达到 60 帧上下
  2. 支持缩放以及拖动
  3. 直接使用原生 SurfaceView ,无需导入庞大的引擎库

Github:


https://github.com/karonl/InDoorSurfaceView (thanks for your star✨)

Demo:


直接使用 Android Studio 导入工程即可运行

如何导入 InDoorView 库:


  1. clone 到本地
  2. 复制 InDoorView 文件夹到目标项目的根目录 (InDoorView 使用的是 apply plugin: ‘com.android.library’)
  3. 在 settings.gradle 文件中 include ‘:InDoorView’
  4. 在主模块(一般是 app 文件夹)中的 build.gradle 中添加依赖
1
2
3
dependencies {
compile project(':InDoorView')
}
  1. 点击 Sync 进行构建
  2. 根目录的 src 是 demo ,可做参考
    注:直接导入工程是 demo ,可直接运行测试

如何使用:


初始化 在 xml 文件中使用进行声明

1
2
3
4
<com.karonl.instance.InDoorView
android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="match_parent" />

在对应的 activity 中进行引用,并通过设置适配器,把底图和区域 list 填入,并 refreshData();

1
2
3
4
5
6
InDoorSurfaceView view = (InDoorSurfaceView)findViewById(R.id.surface);
DataAdapter adapter = new DataAdapter();
view.setAdapter(adapter);//初始化
adapter.setBmp(bmp);//设置图片(底图)
adapter.setList(list);//设置数组(图上的可点区域)
adapter.refreshData();

上面代码的 list 的具体设置看这里:

(输入钢笔路径相对于图片左上角的节点坐标)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//每个图案的节点坐标集合
private List<PointF> getList(){
float density = getResources().getDisplayMetrics().density;
List<PointF> pointList = new ArrayList<>();
pointList.add(new PointF(99.1f * density,673.1f * density));
pointList.add(new PointF(222.1f * density,670.1f * density));
pointList.add(new PointF(227.1f * density,327.1f * density));
pointList.add(new PointF(94.1f * density,321.1f * density));
pointList.add(new PointF(100.1f * density,674.1f * density));
return pointList;
}

//区域列表
private void getUnitList(){
PathUnit unit = new PathUnit(getList());//把节点换成一个 PathUnit 元素
unit.setName("John Market");//设置元素的名字
unitList.add(unit);//添加到区域列表
}

注:从资源读取的图片对应的坐标要乘上 desity ,网络加载的图片则不用

接口说明:


通过该接口可以返回点击到的区域的 PathUnit 元素,可通过此来获取区域名字等信息

1
2
3
4
5
6
view.setOnClickMapListener(new InDoorSurfaceView.onClickMapListener() {
@Override
public void onClick(PathUnit region) {
//读取 pathunit
}
}

该接口是 fps 帧率

1
2
3
4
5
6
view.onFramesListener(new InDoorSurfaceView.FramesListener() {
@Override
public void onRefresh(float number) {
//帧率
}
}

环境:


compileSdkVersion 24
buildToolsVersion “24.0.0”
minSdkVersion 16
gradle plugin:gradle:2.1.2

另外:


如果你有项目使用了该库也可以告知我,我将把你的 app 作为示例
如果你有建议或者想法,也欢迎告知我,这将让开源代码变得更好
如果程序有 bug 和改善方法,感谢提 Issues ,有劳指教!

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment