2018年12月17日星期一

2018年11月13日星期二

ssh agent的一点理解

之前一直使用一套publickey(xychen.pub)和private key(xychen),今天遇到了点问题。

很多时候 ssh-add .ssh/xychen 会报错:Could not open a connection to your authentication agent.

所以我会执行 eval `ssh-agent` 启动一个ssh agent,然后再ssh-add。但今天在服务器上执行该eval命令时候报错:mkdtemp: private socket dir: Read-only file system。所以ssh key没有添加成功。后来发现原因是系统磁盘有问题,无法写/tmp目录导致失败。

用ssh-keygen生成了一套key,默认是保存为 .ssh/id_rsa 和 .ssh/id_rsa.pub,将id_rsa.pub加入git的ssh配置后,也完全不需要 ssh-add 添加ssh key,就可以clone代码。或者把你自己之前的public和private key文件改成id_rsa.pub和id_rsa即可。

所以我删掉了刚才ssh-keygen生成的id_rsa两个文件,将xychen重命名为了id_rsa文件,xychen.pub是已经添加到git的ssh配置的。最后发现将.ssh/xychen重命名为了.ssh/id_rsa之后,也不需要ssh-add,就可以clone了。

结论:猜测ssh认证的时候会读取ssh agent被ssh-add进来的ssh key,也会读取.ssh/id_rsa这个private key,先后顺序就不知道了,总之两个都有用。

2018年11月7日星期三

mac安装pyenv报zlib的错

参考https://github.com/pyenv/pyenv/issues/25

ERROR: The Python zlib extension was not compiled. Missing the zlib?

设置CFLAGS:
CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 2.7

2018年10月31日星期三

ubuntu非root权限非chsh更改默认shell

参考https://blog.csdn.net/silent56_th/article/details/81367774

默认shell为sh,希望改为bash,修改~/.profile文件,增加两行如下:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
# modified for changing default shell to bash
else
    export SHELL=/bin/bash
    exec /bin/bash -l
fi

2018年10月17日星期三

mac彻底删除软件

以CleanMyMac为例,mdfind -name CleanMyMacX,然后删除所有列出的文件

mac上通过homebrew安装redis

brew install redis

开机启动redis命令
$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents

使用配置文件启动redis server
$ redis-server /usr/local/etc/redis.conf

停止redis server的自启动
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

卸载redis和它的文件
$ brew uninstall redis
$ rm ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

mac中配置clion增加内存

运行clion时报内存溢出错误。

vim /Applications/CLion.app/Contents/bin/clion.vmoptions,增加内存配置。

2018年7月20日星期五

DeepPavlov 使用问题记录

python setup.py develop 安装,必须使用 python 3.6 版本,3.7 版本也不行。

安装好后,直接运行 python -m deeppavlov interact deeppavlov/configs/go_bot/gobot_dstc2.json -d 会有问题,有依赖的库还没有安装,比如 tensorflow, fasttext 等。所以必须先 python -m deeppavlov install gobot_dstc2 才行。

相关的库不要自己安装,因为版本不一样会出错。比如我自己安装了 fasttext 0.8.2 和 0.8.3 这两个版本都试过,代码里面 import fastText 都会报错,手动改成了 import fasttext 之后还是会报 Exception: fastText: Cannot load /Users/chenxiaoyu/code/nlp/DeepPavlov/download/embeddings/wiki.en.bin due to C++ extension failed to allocate the memory。刚开始我以为是因为内存不够,释放出了10多G的内存还是没解决,最后发现还是因为 fasttext 版本的原因导致的。

刚开始一定要设置一下 DP_CACHE_DIR 环境变量,用来保存下载的文件,否则每次运行都要重新下载,尤其是 wiki.en.bin 文件特别大。

2018年7月19日星期四

homebrew 安装不同版本的 python

安装
brew update
brew install pyenv

配置
在 .zshrc 或 .bash_profile 文件最后写入:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if which pyenv > /dev/null;
  then eval "$(pyenv init -)";
fi

查看可安装的版本
pyenv install --list

安装python版本
pyenv install 3.6.3

查看当前已安装的python版本
pyenv versions

设置python版本
# 对所有的Shell全局有效,会把版本号写入到~/.pyenv/version文件中
pyenv global 3.6.3
也可以写成 pyenv global system 3.6.3

# 只对当前目录有效,会在当前目录创建.python-version文件
pyenv local 3.6.3

# 只在当前会话有效,等同于设置PYENV_VERSION环境变量
pyenv shell 3.6.3

优先级:PYENV_VERSION > local > global

$ pyenv rehash  # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

重置版本设置
只有 pyenv shell 和 pyenv local 命令有--unset参数
pyenv shell --unset
pyenv local --unset

虚拟环境
个人觉得virtualenv就够了, 用不到pyenv-virtualenv

pyenv-virtualenv 安装
brew update
brew install pyenv-virtualenv

pyenv-virtualenv 配置
在 .zshrc 或 .bash_profile 文件最后写入:
# pyenv-virtualenv
if which pyenv-virtualenv-init > /dev/null;
  then eval "$(pyenv virtualenv-init -)";
fi

创建虚拟环境
$ pyenv virtualenv 2.7.10 env-2.7.10
若不指定python 版本,会默认使用当前环境python版本。环境的真实目录位于 ~/.pyenv/versions 下

列出当前虚拟环境
pyenv virtualenvs
pyenv activate env-name  # 激活虚拟环境
pyenv deactivate #退出虚拟环境,回到系统环境

删除虚拟环境
pyenv uninstall my-virtual-env
rm -rf ~/.pyenv/versions/env-name  # 或者删除其真实目录

问题解决
mac安装有可能会出现 zipimport.ZipImportError: can't decompress data; zlib not available 的问题,解决方法:CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 3.x.x

参考:http://einverne.github.io/post/2017/04/pyenv.html
https://github.com/eteplus/blog/issues/4

2018年6月14日星期四

缓存穿透、缓存击穿、缓存雪崩解决方案

https://blog.csdn.net/zeb_perfect/article/details/54135506
https://www.cnblogs.com/rjzheng/p/8908073.html

其中有提到布隆过滤器(bloom filter),可以利用 bloom filter 过滤掉绝大多数数据库中不存在的 key,避免数据库被大流量访问不存在的 key。

sqlalchemy 设置 mysql 表的默认字符集

在类中设置 __table_args__ 即可,见下面的代码示例:

from sqlalchemy import Column, Integer, String
class User(BaseModel):
__tablename__='users'
__table_args__={
"mysql_engine":"InnoDB",   # 表的引擎
"mysql_charset":"utf8mb4"   # 表的编码格式
}
id=Column("id",Integer,primary_key=True,autoincrement=True)
name=Column("name",String(50),nullable=False)
age=Column("age",Integer,default=0)

2018年6月8日星期五

root用户解压的注意问题

压缩包中会保留被压缩文件的用户id和组id,如果非root用户解压的话,解压出来的文件权限是当前的解压用户。但如果是root用户解压的话,默认会保留压缩时候文件的用户id和组id,所以解压出来的文件很有可能就不是root权限了。

2018年5月28日星期一

intellij import bazel 项目报错

intellij 加载 bazel 项目刚开始就报错:cannot run program bazel error=2

解决:在 settings 中的 other settings -> bazel settings 将 bazel binary location 改为 /usr/local/bin/bazel 即可。

2018年5月23日星期三

设置maven镜像源

由于国内网络原因,官方maven镜像源经常无法访问,全局设置maven镜像源:

vim ~/.m2/settings.xml:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
      <mirrors>
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>       
        </mirror>
      </mirrors>
</settings>

将maven源修改为阿里云的镜像源。

2018年4月28日星期六

migration-tooling项目的问题

国内的https://repo1.maven.org/maven2/连不上了,导致我们使用的https://github.com/bazelbuild/migration-tooling项目都无法运行。

解决方法:
在migration-tooling项目根目录的WORKSPACE文件最前面添加:
maven_server(
    name = "default",
    url = "http://maven.aliyun.com/nexus/content/groups/public/",
)

全局搜索项目中的MAVEN_CENTRAL_URL,将https://repo1.maven.org/maven2/替换为http://maven.aliyun.com/nexus/content/groups/public/

然后就可以正常运行bazel run //generate_workspace -- --xxx 了。

2018年4月25日星期三

spark history server 配置

参考 Spark入门 - History Server配置使用:http://callmesurprise.github.io/2016/11/13/Spark%E5%85%A5%E9%97%A8%20-%20history%20server/

同时需要把 spark.history.fs.cleaner.enabled 设置为 true,默认每天清理一次,最多保留七天的日志。参考:http://wxmimperio.tk/2016/01/22/Spark-JobHistory-Monitoring/

其他可以参考官方文档。

linux中查看glibc版本

centos:
rpm -qa | grep glibc
rpm -qi glibc 进一步查看

ubuntu:
ls -l /lib/i386-linux-gnu/libc.so.6 或 ls -l /lib/x86_64-linux-gnu/libc.so.6
apt-cache show libc6 进一步查看

2018年4月24日星期二

supervisor stop时同时杀掉子进程

在supervisor配置中设置 stopsignal = INT,stop时候子进程也会被杀掉,否则子进程不会被杀掉而变成僵尸进程。如果配置城 stopsignal = KILL,还需要配置 stopasgroup = true; killasgroup = true。

还没具体弄明白 stopsignal,以后有时间研究。

2018年4月10日星期二

xgboost学习

一篇翻译的还不错的博文:http://d0evi1.com/xgboost/ (xgboost code insight)

xgboost调参:https://xgboost.readthedocs.io/en/latest/how_to/param_tuning.html

以后有时间更新一下自己的总结。

2018年3月22日星期四

docker run之后无法ctrl-c结束

docker run xxx 之后,ctrl-c不起作用。

解决:docker run -t xxx,增加-t参数。

这样ctrl-c之后docker container不会stop

2018年3月21日星期三

配置docker镜像源

参考https://www.jianshu.com/p/84b6fe281b4d

直接在docker pull命令加上镜像地址,临时从该镜像下载相应的docker image
docker pull registry.docker-cn.com/myname/myrepo:mytag

在docker配置文件中(例如/etc/docker/daemon.json)设置默认的镜像地址
{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}

生效配置并重启docker:
systemctl daemon-reload
service docker restart

可选的中国地区docker镜像地址有:
官方镜像:https://registry.docker-cn.com
七牛云镜像:https://reg-mirror.qiniu.com

rules_docker的使用

以python举例。

先写好py_image规则,写法和py_binary几乎一样,需要多加一个main参数指定启动main的文件,通过py_image规则无法指定repo和tag。

如果打包到本地需要自己指定repo和tag的话,只能使用container_bundle,container_bundle中的images参数的key为指定的repo和tag名称,value为对应的py_image或者其他image规则。

container_push用于将镜像推到docker仓库,有两种方式可以指定tag(https://github.com/bazelbuild/rules_docker#varying-image-names)。一种是使用$(tag)变量,然后bazel run --define tag=xxx来指定不同的tag;另一种是使用stamp=True,参考bazel的workspace_status使用:https://docs.bazel.build/versions/master/user-manual.html#workspace_status

2018年3月13日星期二

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

参考https://segmentfault.com/q/1010000011807350?sort=created

在/etc/environment中增加:
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

一次IT事故的记录

linux系统下用户目录用户自己是必须拥有读、写、可执行权限的,在不知道的情况下用root修改了所有用户目录的权限,去掉了执行权限,导致所有用户都无法登录了。

2018年3月6日星期二

linux中nc命令

参考:10 个例子教你学会 ncat (nc) 命令

nc -l port_number,在指定端口监听入站连接。
nc -l -k port_number,-k 参数保证客户端断开之后服务器仍然保持监听而不退出。

2018年3月5日星期一

docker中--expose、-p参数

EXPOSE或--expose:声明运行时容器提供服务的端口,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

-p ip:hostPort:containerPort 参数可以指定宿主机的ip和端口到容器的端口映射。

docker容器内连接宿主机

参考:https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

docker run 增加 --net=host 参数,docker容器中使用127.0.0.1或者0.0.0.0地址就指向了宿主机。--net 参数值默认是 brige。

如果设置--net=host,那么-p port:port则不生效。

获取docker container ip地址

参考https://mozillazg.com/2016/01/docker-get-containers-ip-address.html

docker inspect --format '{{.NetworkSettings.IPAddress}}' CONTAINER_ID

2018年3月1日星期四

docker清理命令

参考https://www.fengzifz.com/2017/03/27/clean-docker/

删除所有停止运行的容器
docker rm -v $(docker ps -a -q -f status=exited) 或者 docker container prune

删除所有<none>的镜像
docker rmi $(docker images -q -f dangling=true)

删除所有没用的volume
docker volume rm $(docker volume ls -qf dangling=true) 或者 docker volume prune

docker system prune,清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像

docker save和docker export的区别

参考:https://jingsam.github.io/2017/08/26/docker-save-and-docker-export.html

1. docker save保存的是镜像(image),docker export保存的是容器(container);
2. docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
3. docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

2018年2月28日星期三

kafka connect test.sink.txt并没有更新

参考https://stackoverflow.com/questions/35049287/kafka-connect-test-sink-txt-is-not-getting-updated-after-running-connectors-an

执行bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties,发现test.sink.txt并没有更新。

因为之前手动删了test.sink.txt文件,offset没有重置,所以读不出内容。将/tmp/connect.offsets删除即可。

kafka bootstrap servers配置

A list of host/port pairs to use for establishing the initial connection to the Kafka cluster. The client will make use of all servers irrespective of which servers are specified here for bootstrapping—this list only impacts the initial hosts used to discover the full set of servers. This list should be in the form host1:port1,host2:port2,.... Since these servers are just used for the initial connection to discover the full cluster membership (which may change dynamically), this list need not contain the full set of servers (you may want more than one, though, in case a server is down).

一组host和port用于初始化连接. 不管这里配置了多少台server, 都只是用作发现整个集群全部server信息. 这个配置不需要包含集群所有的机器信息. 但是最好多于一个, 以防服务器挂掉.

如果只配置了一个的话,这个server挂掉了kafka集群就无法工作。

具体点说,如果producer.properties中的bootstrap.servers都挂掉,producer无法工作;如果consumer.properties中的bootstrap.servers都挂掉,consumer无法工作。

kafka启动不断刷屏

bin/kafka-server-start.sh config/server.properties 启动kafka时被下面两行日志刷频:
  INFO Creating /controller (is it secure? false) (kafka.utils.ZKCheckedEphemeral)
  INFO Result of znode creation is: OK (kafka.utils.ZKCheckedEphemeral)

把zookeeper的dataDir:/tmp/zookeeper文件夹删掉重启了zookeeper和kafka之后就正常了。

2018年2月26日星期一

彻底删除kafka的topic

参考https://stackoverflow.com/questions/33537950/how-to-delete-a-topic-in-apache-kafka/33538299

1. 停掉 kafka
2. 删除 kafka 配置中 /tmp/kafka-logs 中 topic 的目录
3. bin/zookeeper-shell.sh localhost:2181
4. ls /brokers/topics
5. rmr /brokers/topics/yourtopic
6. 重启 kafka

2018年2月23日星期五

intellij开发javascript设置

在设置中的Language & Frameworks中JavaScript设置Javascript language version。

设置node.js library:Language & Frameworks中Node.js and NPM,设置enable Node.js Core library。
参考https://intellij-support.jetbrains.com/hc/en-us/community/posts/206324989-Unresolved-function-or-method-require-at-line-1

2018年1月29日星期一

spark中ALS算法的评测

看了下ALS的源码,如果设置了implicitPrefs,fit的过程优化的是原论文中 c_ui * (p_ui - x_u * y) ^ 2 + 正则项,计算出了 userFactor 和 itemFactor,也就是式中的x和y。recommend_for_all 或者 transform 来计算 prediction 时计算了 x*y 的预测值,所以预测的范围是0到1之间的regression。

所以如果设置了隐式反馈的参数为True,评测的时候就不能用rmse指标来判断了。

2018年1月25日星期四

python单元测试中使用mock

部分内容转自:https://blog.laisky.com/p/unittest-mock/

Mock
MagicMock是Mock的扩展,允许使用magic methods,参考:https://docs.python.org/3/library/unittest.mock.html#magic-methods
PropertyMock可以mock属性值。

return_value:直接指定mock的返回值
side_effect:可以重写函数
spec:
spec 的适用条件稍微复杂一点,当我们使用 mock 实例的时候,没法指定该实例有哪些方法和属性是可以调用的, mock 会自动的对调用的每一个方法或属性创建返回一个 mock 实例。
但是如果我们希望只对指定的属性或方法使用 mock,就需要 spec 来满足这一需求。
先来看看不使用 spec 的情况:
mock = MagicMock()

dir(mock)
# ['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', reset_mock', 'return_value', 'side_effect']

# 然后我们调用三个不存在的属性
mock.q
mock.w
mock.e

# 再来看看
# 注意 mock 自动创建增加了 q, w, e 方法
dir(mock)
# ['assert_any_call', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'e', 'method_calls', 'mock_add_spec', 'mock_calls', 'q', 'reset_mock', 'return_value', 'side_effect', 'w']
我们可以使用 spec 来显示的指定那些方法和属性是可 mock 的。
spec 是一个自定义类,在类里定义可以 mock 的方法和属性:
class SpecClass:

    attr1 = None
    attr2 = None


mock = MagicMock(spec=SpecClass)

print(mock.attr1)
# <MagicMock name='mock.attr1' id='4589618064'>

# 尝试调用未指定的属性时就会抛出 AttributeError
mock.attr3
# Traceback (most recent call last):
#           File "", line 1, in
#           File "/Users/laisky/.pyenv/versions/3.4.1/lib/python3.4/unittest/mock.py", line 568, in __getattr__
#             raise AttributeError("Mock object has no attribute %r" % name)
#         AttributeError: Mock object has no attribute 'attr3'
顺带一提 spec_set,和 spec 不同的一点在于 spec_set 传入的是一个实例而不是对象:
mock = MagicMock(spec=SpecClass)

# 等效于
mock = MagicMock(spec_set=SpecClass())
如果你只是简单希望只能调用显式 mock 过的方法和属性,又懒得去重复写一遍 spec,可以直接指定 spec=True。

Patch
patch 用来将指定(target)的实例替换为 mock 实例,主要用法有三种:
作为 decorator 修饰函数或类
作为 context 上下文管理器
作为 patch object,通过 start 和 stop 来管理 mock

1. @patch 装饰器
2. with patch() 作为上下文
3. patch.start()、patch.stop() 手动开启和关闭

2018年1月18日星期四

pyspark将dataframe中的none转为空数组

from pyspark.sql.functions import *
from pyspark.sql.types import *

df = spark.createDataFrame([{'a': None, 'b': 2}, {'a': [2,3], 'b': 4}])
empty_array = udf(lambda :[], ArrayType(LongType()))

# solution 1
df.withColumn('a', coalesce(col('a'), empty_array())).show()

# solution 2
df.withColumn('a', when(isnull('a'), empty_array()).otherwise(df.a)).show()

2018年1月11日星期四

关于L1和L2正则


L1 正则可以产生稀疏性,即让模型部分特征的系数为 0。这样做有几个好处:首先可以让模型简单,防止过拟合;还能选择有效特征,提高性能。

L2 正则通过构造一个所有参数都比较小的模型,防止过拟合。但 L2 正则不具有稀疏性。



图片来源:https://ask.julyedu.com/question/6996