2018年7月2日星期一

链表翻转

#include <iostream>
using namespace std;

/*
链表翻转。给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,
若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。
*/

struct LinkList
{
int data;
LinkList* next;
LinkList(int i=0){data=i; next=NULL;}
};

void print_list(LinkList* head){
LinkList* p = head;
while(p){
cout<<p->data<<' ';
p = p->next;
}
cout<<endl;
}

LinkList* reverse(LinkList* head, int k){
    if(head == NULL)
    {
        return NULL;
    }
    int i = k;
    LinkList* end = head;
    int length = 1;
    while(--i)
    {
        if(end->next==NULL){
            k = length;
            break;
        }
        else{
            end = end->next;
            length += 1;
        }
    }
    i = k;
    LinkList* save = end->next;
    LinkList* p1 = head;
    LinkList* p2 = head->next;
    while(--i)
    {
        LinkList* temp = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = temp;
    }
    head->next = reverse(save, k);
    return end;
}

int main(){
LinkList* n1 = new LinkList(1);
LinkList* p = n1;
for(int i=2; i<12; i++)
{
LinkList* temp = new LinkList(i);
p->next = temp;
p = p->next;
}
print_list(n1);
    LinkList* a = reverse(n1, 4);
    print_list(a);

}

2018年6月4日星期一

fasttext初学习

第一步:理解
https://www.leiphone.com/news/201608/y8rhWEglraduqcOC.html

第二步:官方文档
  fasttext库有两个主要的用例:词表征学习(应该是向量表征)和文本分类。

1.词表征学习(word representation learning)
为了获取词向量,

./fasttext skipgram -input data.txt -output model

data.txt是utf-8编码的文件,生成model.bin和model.vec. model.vec是词向量表征,model.bin是包括模型的参数信息和所有的超参数。二进制文件稍后可用于计算词向量或重新开始优化

1.2.为词外特征获取单词向量

2018年6月3日星期日

类变量、实例变量、局部变量和全局变量

1.类变量
定义:类变量被所有的类实例共享,通常都定义在类声明下面,他被所有的类实例共享

所在位置:类中,函数声明外

什么时候加载:在文件导入到其他文件时加载

如何在函数中调用:在类函数中必须使用ClassName.class_variable = ***来赋值,否则,你创建的只是一个实例变量,举例如下:

class Test(object):
    class_variable = 1
    def func(self):
        Test.class_variable = 2 (正确)
        class_variable = 2(错误,这是一个实例变量)

存在时间:一个到该脚本结束?

python官网的链接:https://www.python-course.eu/python3_class_and_instance_attributes.php

2.实例变量

所在位置:class内,self修饰

3.局部变量:在函数的class内,(不加self)
定义:在一个函数中,一个变量第一次出现,并在=的前面,那么他是一个实例变量

4.全局变量:在模块内,函数和类外面

2018年5月22日星期二

maven下载加速

在home目录下,修改setting.py脚本如下:

<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>

2018年4月16日星期一

Templates

模板是rsyslog的一个关键特性。 它们允许指定用户可能需要的任何格式。 它们也用于生成动态文件名。 rsyslog中的每个输出都使用模板 - 这适用于文件,用户消息等。 数据库编写者期望它的模板是一个适当的SQL语句 - 所以这也是高度可定制的。 您可能会问,如果没有指定任何模板,所有这些工作如何进行。 好问题 ;)。 但答案很简单。 模板与硬编码到rsyslogd中的stock syslogd格式兼容。 所以如果没有指定模板,我们使用这些硬编码模板之一。 在rsconf.c中搜索“template_”,你会发现硬编码的。

模板由template()语句指定。 它们也可以通过$ template legacy语句指定。
注意:模板的关键元素是rsyslog属性。 请参阅rsyslog属性参考以获取可用列表。

rsyslog Properties

rsyslog中的数据项称为“属性”。 他们可以有不同的起源源于。 每当你想访问数据项时,你都需要访问相应的属性以获取其起源。
属性被用于:
  • templates(模版)
  • conditional statements(条件)
属性名称不区分大小写的

Message Properties

这些由rsyslog解析器从原始消息中提取。 所有消息属性都以字母开头。
以下消息属性存在:
msg(消息的信息部分)
rawmsg(原始消息。 对于调试应该是有用的,并且如果消息应该完全没有改变地被转发。 请注意,EscapecontrolCharactersOnReceive是默认启用的,因此它可能与套接字中收到的不同。)
rawmsg-after-pri()
hostname(消息来源的主机名)
source(hostname的别名)
fromhost(接收到消息的系统主机名(在中继链中,这是紧挨着我们的系统,不一定是原始发送者)。 这是一个DNS解析的名称,除非不可能或DNS解析已被禁用。)
programname(BSD syslogd定义的tag的“静态”部分。 例如,当TAG是“named[12345]”时,程序名是“named”。)
  • end of tag
  • nonprintable character
  • ‘:’
  • ‘[‘
  • ‘/’
上面的定义来自FreeBSD的syslogd资源。

请注意,有些应用程序在标签的静态部分包含斜杠,例如“app/ foo[1234]”。 在这种情况下,程序名是“app”。 如果他们像“/ app / foo [1234]”那样存储绝对路径名,则程序名将变为空(“”)。 如果您需要将斜线实际存储为程序名的一部分,则可以使用全局选项
(parser.permitSlashInProgramName=”on”)
以允许这一点。 然后,“/ app / foo [1234]”的syslogtag将导致程序名为“/ app / foo”。 注意:此选项从rsyslogd版本8.25.0开始可用。

更多参考这里:https://www.rsyslog.com/doc/v8-stable/configuration/properties.html

Filter conditions

Filter Conditions

rsyslog 提供四种不同的“Filter conditions”
 1. 传统的基于severity 和 facility的Selectors
 2. 基于property的过滤器
 3. 基于表达的过滤器
 4. BSD格式块(不向上兼容)

Selectors(选择器)
选择器是传统的过滤syslog的方式。选择器是过滤系统日志消息的传统方式。 它们一直保存在rsyslog中,它们保存syslog原始的格式,因为众所周知的,高效的,并且也需要与stock syslogd配置文件兼容。如果你只需要根据priority和facility进行过滤,你应该选择这种方式,因为用它可以写最少的代码。在v7版本之前,selector行比advanced格式更具效率,但是现在不在存在这种问题。

selector字段由两个部分组成,facility和priority,他们用'.'号分隔。在syslog(3)中有他们的描述。
facility的取值可以有auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, syslog, user, uucp and local0 through local7.它用来特指产生消息的子系统。
priority的取值可以有debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg, panic (same as emerg). 它定义了消息的重要程度。
在selector格式中,如果指定了消息等级,会返回该等级及以上的消息等级。除此之外,‘*’表示所有的facility类型或者所有的priority类型。‘none’表示不传递这个facility的信息。你也可以用‘,’指定相同等级的多个facility。

多个selector之间可以用‘;’分隔。selector字段中的每一个selector都有覆盖前面的能力,使用这一特性可以有效的排除你不想要的设备消息。你也可以用‘=’指定某个优先级。也可用‘!’忽略某个优先级。


Property-Based Filters

基于属性的过滤器对于rsyslogd是唯一的。 它们允许过滤任何属性,如HOSTNAME,syslogtag和msg。 rsyslog属性文档中可以找到所有当前支持的属性列表。 使用此过滤器,可以使用指定的比较操作,针对指定的值检查每个属性。

基于属性的过滤器必须以列1中的冒号开头。这告诉rsyslogd它是新的过滤器类型。 冒号后面必须跟着属性名称,逗号,要执行的比较操作的名称,另一个逗号以及要比较的值。 这个值必须被引用。 逗号之间可以有空格和制表符。 属性名称和比较操作区分大小写,因此“msg”起作用,而“MSG”是无效的属性名称。 简言之,语法如下:

:属性,[!]比较操作,“值”(:property, [!]compare-operation, "value"

Compare-Operations

比较操作支持下列内容:
contains :检查是不是包含属性,只支持精准匹配。
isequal:检查值是否相等
startswith:  检查信息的开头是不是某属性值(:msg, startswith, "val"
regex: 将值与属性进行比较
ereregex: 将该属性与提供的POSIX ERE正则表达式进行比较。
您可以立即在比较操作前使用bang-character(!),否则此操作的结果将被取消。 例如,如果msg包含“This is an informative message”,则下面的示例不匹配:
:msg, contains, "error"
但是下面是成功的:
:msg, !contains, "error"
如果您想要进行一些通用处理但排除某些特定事件,则使用否定可能很有用。 您可以结合使用丢弃操作。 如下:
*.* /var/log/allmsgs-including-informational.log
:msg, contains, "informational"  ~
*.* /var/log/allmsgs-but-informational.log
不要忽视第2行的代字符! 在本示例中,所有消息都写入文件allmsgs-including-informational.log。 然后,包含字符串“信息”的所有消息都将被丢弃。 这意味着“丢弃线”(我们示例中的编号2)下方的配置文件行将不会应用于此消息。 然后,所有其余的行也将写入文件allmsgs-but-informational.log。

Value Part

值是一个带引号的字符串。 它支持一些转义序列:

“ - 引号字符(例如”带有“引号”的字符串“)
\ - 反斜线字符(例如“C:\ tmp”)

转义序列总是以反斜杠开始。 未来可能会添加其他转义序列。 反斜线字符必须转义。 然后,上面列出的任何其他序列都是无效的,并可能导致不可预知的结果。

可能“msg”是基于property的过滤器最突出的用例。 这是实际的消息文本。 如果您想根据某些消息内容(例如特定代码的存在)进行过滤,则可以通过以下方式轻松完成此操作:
:msg, contains, "ID-4711"
当消息包含字符串“ID-4711”时,此过滤器将匹配。 请注意,比较是区分大小写的,所以如果消息中包含“id-4711”,它将不匹配。
:msg, regex, "fatal .* error"
此过滤器使用POSIX正则表达式。 当字符串包含“fatal”和“error”之间的任何内容时(’fatal net error”和“fatal lib error”,但不包含“fatal error”)。

Expression-Based Filters

基于表达的过滤器允许过滤任意复杂的表达式,他可以包含boolean, 数学符号和其他的string操作,expression过滤器将演变为完整的配置脚本语言。不幸的是,他们的语法在这个过程中会稍微改变。 所以如果你现在使用它们,你需要准备好一段时间后更改你的配置文件。
基于expression的过滤器在新行的第1列中用关键字“if”表示。 他们有这样的格式:、
if expr then action-part-of-selector-line
如果“和”那么“是可能存在的固定关键字。 “expr”是一个(可能相当复杂的)表达式。 所以表达文件的细节。 “action-part-of-selector-line”是一个动作,就像你所知道的那样(例如写入该文件的“/ var / log / logfile”)。

Expressions

该语言支持任意复杂的表达式。 所有常用的操作员都受支持 操作的优先顺序如下(列表中较低的操作在列表中较高,例如在添加之前完成乘法。
  • expressions in parenthesis(括号中的表达式)
  • not, unary minus(not, 一元减号)
  • *, /, % (modulus, as in C)
  • +, -, & (string concatenation)
  • ==, !=, <>, <, >, <=, >=, contains (strings!), startswith (strings!)
  • and
  • or
例如,“not a == b”可能不会返回你想要的。 脚本处理器将首先评估“not a”,然后将结果布尔值与b的值进行比较。 你可能打算做的是“不(a == b)”。 如果你只是想测试不等,我们强烈建议使用“!=”或“<>”。 两者都完全一样,并提供,以便您可以选择最喜欢的任何一个。 所以a和b的查询应该被测试为“a <>b”。 “not”运算符应该保留给实际需要形成复杂布尔表达式的情况。 在这些情况下,强烈建议使用括号。

BSD-style Blocks

v7以上不再支持,推荐不要使用

Examples

*.* /var/log/file1 # the traditional way
if $msg contains 'error' then /var/log/errlog # the expression-based way
现在,如果您想检查facility和severity,则需要指定数值。 这些可以在RFC 5424中找到。如果你不喜欢这样,你当然也可以使用文本属性 - 只要确保使用正确的。 随着表达支持的增强,这将会改变。 例如,如果要过滤具有设备local0的消息,请以“DEVNAME”开头,并在消息内容中包含“error1”或“error0”,您可以使用以下过滤器:
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and ($msg contains 'error1' or $msg contains 'error0') then /var/log/somelog
请注意,以上所有内容必须在一行中! 如果你想存储除了那些包含“error1”或“error0”的消息,你只需要添加一个“not”:
if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and not ($msg contains 'error1' or $msg contains 'error0') then /var/log/somelog
如果您希望进行不区分大小写的比较,请使用“contains_i”而不是“contains”和“startswith_i”而不是“startswith”。 请注意,基于表达式的过滤器目前不支持正则表达式。 当函数支持被添加到表达式引擎时,这些将被添加(原因是正则表达式将是一个单独的可加载模块,在它可以被实现之前需要更多的前提条件)。

2018年4月13日星期五

rsyslog Control Structures

http://blog.51cto.com/linuxme/950051


Control Structures

RainerScript中的控制结构和C,java,javascript等程序中都非常相似。
if
if ($msg contains "important") then {
   if ( $.foo != "" ) then set $.foo = $.bar & $.baz;
   action(type="omfile" file="/var/log/important.log" template="outfmt")
}
if/else-if/else
if ($msg contains "important") then {
   set $.foo = $.bar & $.baz;
   action(type="omfile" file="/var/log/important.log" template="outfmt")
} else if ($msg startswith "slow-query:") then {
   action(type="omfile" file="/var/log/slow_log.log" template="outfmt")
} else {
   set $.foo = $.quux;
   action(type="omfile" file="/var/log/general.log" template="outfmt")
}
foreach
Foreach可以迭代数组和对象。 与数组迭代(有序)相反,对象迭代以任意顺序访问键值(无序)。
对于下面的foreach调用:
foreach ($.i in $.collection) do {
   ...
}
foreach ($.quux in $!foo) do {
   action(type="omfile" file="./rsyslog.out.log" template="quux")
   foreach ($.corge in $.quux!bar) do {
      reset $.grault = $.corge;
      action(type="omfile" file="./rsyslog.out.log" template="grault")
      if ($.garply != "") then
          set $.garply = $.garply & ", ";
      reset $.garply = $.garply & $.grault!baz;
   }
}
call

continue

Filter Conditions



2018年4月11日星期三

日志相关rsyslog

非常详细
https://www.mtyun.com/library/how-to-config-rsyslog


Basic Structure
本节描述rsyslog配置基本上如何工作。 将rsyslog想象成一个大型日志记录和事件处理工具集。 它可以被认为是一个基本处理的框架,它以数据流的形式传输,并在消息流上是高度可定制的。 在配置期间,通过定义和自定义rsyslog对象完成此定制。

Quick Overview Of Message Flow and Objects
信息在输入模块的帮助下进入rsyslog,接着他们会被送入一个规则集,当规则被匹配时,消息被传送到对应的action,其可能是某个具体的文件也有可能是某个远程主机。

Processing Principles
1. 输入模块提交信息到规则集
    1.1 如果规则集没有明确指定,使用默认规则集
2. 在默认情况下,只有一个规则集
3. 可以添加用户定义的规则集
4. 每个规则集包含一个或多个规则
    4.1 允许0条规则的规则集,但他显然是没有意义的
5. 一条规则包含一个过滤器和一个action列表
6. 过滤器 提供yes/no的决策
7. 如果一个过滤器被匹配,相应的action会被执行。如果没有,则什么都不会发生
8. 规则将按照给定规则集中的第一个到最后一个规则的顺序进行评估。 没有来自不相关规则集的规则会被执行。
9. 无论过滤器是否匹配,所有规则总是得到充分评估(所以我们不停止第一场比赛)。 如果消息处理应停止,则必须明确执行“丢弃”操作(由代字符或停止命令表示)。 如果丢弃被执行,则消息处理立即停止,而不评估任何进一步的规则
10. 一个action列表包含一个或多个action
11. 要在列表中有多个动作,必须将和号字符放在过滤器的位置,并且这必须紧跟前一个动作
12-以下:不要使用legacy方式写配置文件

Configuration File
rsyslog默认从rsyslog.conf文件读取配置,这个文件可以包含到其他文件的链接

不同路径的配置文件可以通过-f <file>  rsyslogd命令行可以指定。

Statement Types
syslog 支持三种不同类型的配置表述:
1. sysklogd  这是一种旧格式,对于基础的使用非常有用,某些格式不再兼容,因为他与新特征不兼容。这些在兼容性文档中有提到。

2. legacy rsyslog 不建议使用

3. rainerScript 这是一种新的格式,他是一种更好更精确的格式,可以用于更复杂的情况。与传统格式相同,他也不区分大小写。

rsyslog.conf文件由语句组成。 对于旧格式(sysklogd&legacy rsyslog),行确实很重要。 对于新风格(RainerScript),行间距不相关。 最重要的是,这意味着采用新风格的动作,并且所有其他对象可以按照用户的需要进行分割。

Recommended use of Statement Types

一般建议使用RainerScript类型的语句,因为它们提供简洁易读的控制流以及无疑哪些参数处于活动状态。 它们对包含文件也没有副作用,这可能是传统rsyslog语句的主要障碍。
对于非常简单的事情,仍然建议使用sysklogd语句类型,特别是如果完整配置包含这样简单的事情。 经典示例通过优先级写入文件(或转发)。 在sysklogd中,这看起来像:
mail.info /var/log/mail.log
mail.err @server.example.net
这种简单性很难被打败,仍然在课程中教授,很多人都知道这种语法。 即使在新编写的配置文件中使用这些构造也是完全正确的。

根据经验,RainerScript配置语句应该在以下情况下使用:
1. 需要配置参数(例如,旧式语句(legacy)的动作...类型)
2. 需要更详细的流程控制(例如,当多个动作必须在相同条件下嵌套时)

Comments
有两种类型的注释:
1. # 
2. /* content*/

Processing Order
指令从rsyslog.conf的顶部处理到底部。 订单很重要。 例如,如果您停止处理消息,显然停止语句之后的所有语句都不会被评估。

Flow Control Statements

流程控制如下:
1. Control Strictures
2. Filter Conditions

Data Manipulation Statements
数据操作由set, unset 和 reset 实现, 详细请看这里

Inputs
每个输入需要一个输入模块,它实现输入的载入和监听。完整的定义看rsyslog modules ,一旦被加载,输入就通过input()定义。

Outputs
输出也被叫做actions,少量的actions是预先加载的(如输出文件writer),其他的必须像inputs一样加载。

Rulesets and Rules
规则集和规则构成了rsyslog处理的基础。 简而言之,规则是rsyslog如何处理特定消息的一种方式。 通常,在规则前面有一种过滤器(if语句)。 规则的复杂嵌套是可能的,就像在编程语言中一样。

规则集是规则的容器。 一个规则集可以包含许多规则。 在编程语言的比喻中,人们可能会认为规则集就像是一个程序。 规则集可以“绑定”(分配)到特定的输入。 在类推中,这意味着当一个消息通过该输入进入时,绑定到它的“程序”(规则集)将被执行(但不是任何其他的!)。



程序的上线(也就是部署)

编译好的代码(经常是二进制文件)到线上的服务器
需要使用supervisorctl
配置文件/etc/supervisord.conf ,在里面配置你需要上线的服务,
然后在supervisord.conf指定的目录下配置项目上线指定的配置,即可上线

这时候想要吧进程删除,他会自动重启

2018年3月28日星期三

tmux 常用快捷键

1.ctrl+a " 横向分屏
2.ctrl+a % 竖直分屏

2.调整窗口尺寸
PREFIX : resize-pane -D          当前窗格向下扩大 1 格
PREFIX : resize-pane -U          当前窗格向上扩大 1 格
PREFIX : resize-pane -L          当前窗格向左扩大 1 格
PREFIX : resize-pane -R          当前窗格向右扩大 1 格
PREFIX : resize-pane -D 20       当前窗格向下扩大 20 格
PREFIX : resize-pane -t 2 -L 20  编号为 2 的窗格向左扩大 20 格
3. 创建新窗口
ctrl+a c
4. 窗口切换
 ctrl+a n 

详细看这里 : https://gist.github.com/ryerh/14b7c24dfd623ef8edc7

检查文件是否存在

http://www.pfinn.net/python-check-if-file-exists.html

问题积累

1.提问文件是否存在
 eg.
how to check if a file exists in hdfs

2. python [{}],在这样的结构中根据dict中某个值来排序
It may look cleaner using a key instead a cmp:
newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 
or as J.F.Sebastian and others suggested,
from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 
For completeness (as pointed out in comments by fitzgeraldsteele), add reverse=True to sort descending
newlist = sorted(l, key=itemgetter('name'), reverse=True)

 待续

2018年3月18日星期日

mongo eve 学习

  Quickstart
A Minimal Application
首先,跑起来一个小程序,在跑eve程序之前,你需要首先确定mongo服务端开启,请参考这里
创建文件:run.py 和 setting.py
在run.py写入下列代码:
—————————————————————————
from eve import Eve
app = Eve()
if __name__ == '__main__':
    app.run()
—————————————————————————
在setting.py写入下列代码
—————————————————————————
DOMAIN = {'people': {}}
—————————————————————————
运行python run.py;
打开另外一个终端,curl -i http://127.0.0.1:5000 或者 curl -i http://127.0.0.1:5000/people
由于我们的setting.py并没有提供people数据库的任何细节,甚至这个数据库有可能根本不存在,故我们暂时还查不出数据库中的内容。

Database Interlude

如果你想实实在在的连接到数据库,你需要在setting.py写入如下内容:
—————————————————————————
MONGO_HOST = 'localhost'
MONGO_POST = 27017
# 如果你的数据库不需要验证,可以忽略下面两步
MONGO_USERNAME = '<your username>'
MONGO_PASSWORD = '<your password>'

MONGO_DBNAME = 'apitest'
————————————————————————

      

选型总结

1. github 仓库
2. last commit
3. commit amounts
4. search numbers

2018年3月16日星期五

mongo

1.在操作之前你需要知道的一些事情

 database 数据库
 collection 数据库表/集合
 document 数据记录行/文档
 field 数据字段/域
 index 索引
 primary key 主键,mongodb自动将_id字段设置为主键

2.mongo的一些常用语法

 创建数据库 : use Dataset_name
 删除数据库 : db.dropDatabase()
 创建集合 : db.createCollection(name, options)
 查看已有集合 : show collections
 删除集合 : db.collection.drop()
 插入文档 : db.collection.insert(document)
 查看已插入的文档 : db.collection.find()
 查看格式化的文档 : db.collection.find().pretty()
 更新已经存在的文档: db.collection.update()
 删除文档: db.collection.remove()
 查询语句: db.collection.find()


3.如何开启mongo rest (简单的web服务端)
sudo service mongod stop 
sudo mongod --dbpath /data/db --rest

注意,如果/data/下没有db,你需要自己创建,否则会出错
删除/tmp/mongodb-27017.sock
如果还出错: ps -ef |grep mongo ,killmongo占用的全部进程 


4.使用mongo rest 返回结果为 
{
  "offset" : 0,
  "rows": [

  ],

  "total_rows" : 0 ,
  "query" : {} ,
  "millis" : 0
}
 
 https://stackoverflow.com/questions/28770609/mongodb-rest-api-returns-no-results

推荐了: http://restheart.org/



本文基于 Ubuntu 16.04, MongoDB3.4.9 环境完成。

安装

连接
mongo -u user -p passwd --host 127.0.0.1 --port 27017 admin

在 /etc/mongod.conf 中修改 bindIp: 0.0.0.0,允许远程连接mongo。

用户管理
1. MongoDB是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
2. 切换到admin数据库,添加的账号才是管理员账号。
3. 用户只能在用户所在数据库登录,包括管理员账号。
4. 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。

添加管理员账号:
use admin
db.createUser(
  {
    user: "admin",
    pwd: "passwd",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

开启权限认证:
sudo vim /etc/mongod.conf
添加以下配置:
security:
 authorization: enabled
然后 sudo service mongod restart 重启mongo,再启动mongo时如果没有用户名密码则无法查看db。
认证:
use admin
db.auth("admin", "passwd")
认证完成后可以正常访问db。

添加普通用户:
use test
db.createUser(
  {
    user: "test",
    pwd: "test",
    roles: [ { role: "readWrite", db: "test" } ]
  }
)

删除用户:db.dropUser()(删除当前db下的user),db.system.users.remove({user:"xxx"})这种方式已经在2.6及以后的版本中被禁止了。
查看当前用户:db.runCommand({connectionStatus : 1})
查看用户:show users(只显示当前db下的user)或者db.system.users.find()(只有在admin db下才有用,显示所有user,因为创建的用户信息保存在了admin库)
修改密码:db.changeUserPassword("user", "passwd")
用户授权:db.grantRolesToUser(
   "accountUser01",
   [
     { role: "read", db: "records" }
   ]
)
取消用户授权:db.revokeRolesFromUser(
   "accountUser01",
   [
     { role: "readWrite", db: "accounts" }
   ]
)


1. 内建的角色
2. 数据库用户角色:read、readWrite;
3. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
4. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
5. 备份恢复角色:backup、restore;
6. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
7. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
8. 内部角色:__system

角色说明:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限


基本命令
创建数据库:use DATABASE_NAME

查看所有数据库:show dbs
查看当前数据库下所有表:show collections

> db
显示当前数据库

插入文档:
db.COLLECTION_NAME.insert({xxx})

更新:
db.COLLECTION_NAME.update(...)

覆盖:
db.COLLECTION_NAME.save(...)

查询:
db.COLLECTION_NAME.find(query, projection)
db.COLLECTION_NAME.findOne()
db.COLLECTION_NAME.find().pretty()    // readable json
projection 指定字段返回:_id 默认会返回,如果不需要,设置为0,其他字段设置为1的会返回。例如:find({}, {"xx": 1, "_id": 0}  // 只显示 xx 字段

查询条数:
db.COLLECTION_NAME.find().count()

操作符:
$gt $lt $gte $lte
$type

limit 和 skip:
db.COLLECTION_NAME.find().limit(1).skip(2)    // 从第三个开始,显示一个

排序:
db.COLLECTION_NAME.find().sort({KEY:1})    // 1升序,-1降序

删除数据库:
db.dropDatabase()    // 删除当前数据库

删除collection:
db.COLLECTION_NAME.drop()    // 不仅删除集合的文档,也会删除集合本身,同时也会删除在集合上创建的索引。
db.COLLECTION_NAME.remove(query, justOne, writeConcern)    // 将集合中的文档删除,但不删除集合本身,也不删除集合的索引。

索引:
db.COLLECTION_NAME.ensureIndex({KEY:1})

聚合:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

主键:
db.COLLECTION_NAME.createIndex( { 'lastname': 1, 'firstname': 1 }, { unique: true } )



2017.09.04


2018年3月12日星期一

我要学习的东西列表

[http]
requests

[编译相关]
1. bazel

[web框架相关]
1. flask
2. eve(用于mongo数据库的外部服务)

[算法相关]
1. lda原理   -----> Mallet
2. 对话系统实时论文监控
3. 推荐系统算法学习

[线上部署相关]
1. docker
2. bazel docker部分
2. abtest

[分布式相关]
1. spark
2. spark streaming
3. dataframe
4. hdfs

[语言相关]
1. python
2. java
3. lua

[实习论文相关]
1. 开题报告

[数据处理和流处理]
1. data frame
2. kfaka
3.redis

[数据库相关]
1.mongo
2. mongoengine (python代码中对mongo数据库的访问,为什么不要pymongo)
3. hbase
4. mysql

[日志相关]
1.rsyslog

[单元测试相关]
1.unittest mock


我已经学了的
[已完成]
1.python 的基础学习和打牢
2. 开通报告的编写

[正在进行中]
1.tensorflow的学习

[尚待继续]
1.requests

我的专业英文单词记录

1. distribution 发行版
example: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial
2. Customizable 可定制
          Customizable resource endpoints

docker

我的问题:
1.docker是什么?
2.docker的基本原理是什么?
3.docker的基础语句有哪些?
4.bazel 中的docker如何用?
5.既然bazel的编译步骤已经编译出了二进制文件,同样也将程序依赖的环境也包含了进去,那为什么还要docker?
也就是docker既然能把本机的环境全部复制到服务器上,那为什么还需要bazel编译应用程序为二进制文件?

1.Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器

Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上


我学习到的常用命令:
1. docker run -i -t ubuntu:15.10 /bin/bash 进入一个 ubuntu15.10系统的容器
  运行exit命令或者使用CTRL+D来退出容器
2. docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"    命令创建一个以进程方式运行的容器
3.  docker ps 查看容器
4.  docker logs 2b1b7a428627 查看容器里运行代码的打印日志
5.  docker stop 2b1b7a428627 退出容器



附录(相关学习资料):
[初学者资料]
初步理解        https://www.zhihu.com/question/28300645
进一步理解     http://blog.csdn.net/zjin_hua/article/details/52041757
学习               http://www.runoob.com/docker/docker-hello-world.html 

我看到的一个比较全面,易于理解的资料:

https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md




2018年3月6日星期二

2018年3月5日星期一

gensim 主题模型

1. gensim的评估指标有哪些
gensim 评估指标 https://www.kdnuggets.com/2016/07/americas-next-topic-model.html


来源于:http://blog.csdn.net/pipisorry/article/details/42460023

topic coherence| perplexity

lda 每次训练需要这么久,那有没有比lda更好的主题模型呢?

leetcode 17

17.   Letter Combinations of a Phone Number Medium Given a string containing digits from   2-9   inclusive, return all possible l...