笔记

29
Nov

ElasticSearch 配置Logstash导入mysql数据库

网上教程不少,但是大多对新手不太友好,细节也不太好,这里针对ElasticSearch小白。

以ElasticSearch 5.6.12 和 LogStash 5.6.13为例。这两个的安装从略。
尽量保证两者版本不要相差太多。考虑到LogStash只作为管道,版本不需要一致。

先到LogStash目录下安装JDBC插件

cd /opt/logstash
bin/plugin install logstash-input-jdbc

如果是windows下,请自行在可执行文件后加上.bat

安装完之后开始导入,这个导入过程我们编写一个conf文件实现,这里以logstash.conf为例,为了方便可以直接在logstash/bin下创建一个logstash.conf

input {
  jdbc { 
    # "your-database" 是数据库名    
    jdbc_connection_string => "jdbc:mysql://localhost:3306/your-database"  
    #mysql数据库用户名密码
    jdbc_user => "root" 
    jdbc_password => "********"
    #schedule 可选,如果有schedule则会自动同步,这里意思是每一分钟同步一次,没有就只同步一次。具体的见官方文档
    #schedule => "* * * * *"
    #这里需要使用一个mysql连接库,文末有下载地址,自行下载后随便放一个地方,这里只是举例
    jdbc_driver_library => "/usr/local/logstash/mysql-connector-java-6.0.5.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    #查询,这里只需要select一下即可,比如从your-schema数据表
    statement => "SELECT * FROM `your-schema`"
    }
  }
output {
  stdout { codec => json_lines }
  elasticsearch {
  "hosts" => "localhost:9200"
  #your-index是事件要被写进的索引 如果没有索引就新建一个
  "index" => "your-index"
  #your-type-name 只是数据集的分类,自定义,同类数据尽量使用同一个type
  "document_type" => "your-type-name"
  #可选,这里的意思是绑定原mysql表的id列作为主键,可以避免重复
  "document_id" => "%{id}"
  }
}

然后执行

cd /opt/logstash/bin
./logstash -f logstash.conf

可以看到一排输出,然后数据就注入成功了。

顺带一提,如果小白注入完数据发现有unassigned数据,或者说集群健康度不够,是因为现在的节点分片不够存储数据集的1份备份(默认一份)。只需要执行诸如

curl -XPUT 'localhost:9200/your-index/_settings' -d '{"number_of_replicas": 0}'

将备份数降低即可。

一个可用的Maven的mysql-connector-java-6.0.5.jar

24
Nov

lnmp配置laravel/thinkphp时出现no input file specified的常见问题

lnmp的域名绑定命令即使到最新的1.5版都是一套不太成熟的做法。
我们每次执行诸如lnmp vhost add时,都会在目录下生成一个类似这样的.user.ini文件

open_basedir=/home/wwwroot/your-project/:/tmp/:/proc/

.user.ini的作用是覆写php.ini中的部分参数,在这里来说,open_basedir在php.ini中可能有一个全局值,而在这个目录下有一个局部的值会覆盖全局值。

而open_basedir则是造成nginx/php-fpm 报错的罪魁祸首,这么说可能不恰当,因为.user.ini的本意是好的,其机理是限制php访问目录,举例来说,你在这个目录下配置的php文件只能操作/home/wwwroot/your-project/下的文件。

而这样就导致了我们在使用诸如laravel/ThinkPHP框架时的问题。比如我们在home/wwwroot下建立了名为your-project的laravel项目,但是lnmp绑定vhost时,按常理是要绑定到/public目录下的。因为/public下是整个网站的入口,这样一来就产生问题了:.user.ini中会生成/home/wwwroot/your-project/public/:/tmp/:/proc/这样的参数,然而这个项目的php是必须要有要调用/public外文件的权限的!这个问题的产生往往会让人难以排查,因为不管是浏览器输出,亦或是nginx和php-fpm的log都不会给出任何错误信息,一个隐藏在/public下的.user.ini文件很难让新手发觉出问题。

解决方案:

.user.ini被安全锁定了,先使用

chattr -i .user.ini

将其解锁,然后vim编辑去掉/public,再chattr +i .user.ini加锁。
当然你也可以直接解锁后删掉,这样损失了一定安全性,对于小项目或者本地项目倒没什么意义了。

21
Oct

CMake编译Opencv时遇到的bug解决方案 windres.exe: unknown option -- W ... ; 'sprintf_instead_use_StringCbPrintfA_ was not declared in this scope ..

执行mingw32-make后

28%左右遇到这种错误:
... windres.exe: unknown option -- W ...

解决方案:
在cmake中 取消勾选 ENABLE_PRECOMPILED_HEADERS


32%左右遇到这种错误 :
'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ...

解决方案:
在..\opencv\sources\modules\videoio\src\cap_dshow.cpp
在#include "DShow.h"这一行前加上#define NO_DSHOW_STRSAFE

20
Sep

Matlab App Designer UIFigure中利用dojo/js/Container/缩放/改图标等技巧

本文部分内容翻译于:Undocumented Matlab

Matlab AppDesigner是R2016a之后推出的新界面设计工具,较GUIDE的GUI 界面更美化,组建更丰富,具有自动化编程等特性。

但是表面上看AppDesigner并没有暴露很多组件诸如Javaframe

GUIDE的figure(gcf)是基于Java的Jframe组件,而Appdesigner的app.UIFigure是基于html的webview,本质上运行了一个CEF(Chromium嵌入式框架 Chromium Embedded Framework version 3.2272 on Chromium 41 in R2016a)。使用的JS DOJO 套件,可以想象Matlab与js/webapp接轨的趋势了。。

因此,如果像GUIDE一样或者其他教学一样视图获取

get(app.UIFigure,'javaframe')

会得到一个空数组,而且是特意留下的,Matlab一直有抛弃javaframe的想法,还发布过调查,现在看来还是不敢完全抛弃。

不说更多,下面就揭示一些其他组件结构吧。

阅读全文»

18
Jul

polyfill,shim,shiv之间有什么区别

什么是polyfill和shim

搜索了一下:在JavaScript的世界里,有两个词经常被提到,shim和polyfill.它们指的都是什么,又有什么区别?一个shim是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现;一个polyfill就是一个用在浏览器API上的shim.我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill.然后新旧浏览器就都可以使用这个API了。

理解

一个shim就是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现。
比如ES5-shim, github地址:http://github.com/es-shims/es5-shim/

这几天看了一下shiv,它的作用是使得不支持HTML5标签的浏览器诸如ie6-8, 支持html5标签。这也是我在看html语义化规范的时候看到的,觉得很有必要做一下。目前使用IE8的用户还是占据一部分比例的,所以为了兼容ie8,同时能使用像header、section、nav、footer这些语义化标签,我们可以采用shiv库来实现。
著名的HTML5兼容库html5shiv,Github地址:https://github.com/aFarkas/html5shiv

关于polyfill,据说来自于Polyfilla,Polyfilla是一个英国产品,在美国称之为Spackling Paste(译者注:刮墙的,在中国称为腻子),把旧的浏览器想象成为一面有了裂缝的墙,这些polyfill会帮助我们把这面墙的裂缝抹平。

其实一个polyfill的意思就是,比如开发者想要一个格式化时间的函数,然后现有的api都没有,于是作者自创一个stringDate的方法,那么这个方法就成为一个polyfill。

问题

注意在实现polyfill的时候,最好不要在一些原生对象的原型上添加方法,比如:

if (!Array.prototype.find) {
        Array.prototype.find = function (predicate) {
            if (this === null)
                throw new TypeError('Array.prototype.find called on null or undefined');
            if (typeof predicate !== 'function')
                throw new TypeError('predicate must be a function');
            var list = Object(this);
            var length = list.length >>> 0;
            var thisArg = arguments[1];
            var value;
            for (var i = 0; i < length; i++) {
                value = list[i];
                if (predicate.call(thisArg, value, i, list))
                    return value;
            }
        }
    }

在IE下面有个bug,就是在使用 for in 这种循环的时候,ie下会遍历输出原型链上的方法,比如:

var a = [1,2];
for(var i in a){
    console.log(i);
}
//output
1
2
find

这就会导致bug。
查了一下can1use:

As the specification includes many JavaScript features, un-numbered partial support varies widely and is shown in detail on the ECMAScript 5 compatibilty tables by Kangax.
Does not support parseInt() ignoring leading zeros.
Does not support Strict mode
IE8 has virtually no ES5 support, but does support Object.defineProperty, Object.getOwnPropertyDescriptor, JSON parsing & Property access on strings
也就是说,在IE8下面支持Object.defineProperty这个方法,这个方法是直接给一个对象添加一个属性, 关键是可以控制是否能在for…in循环中遍历出来或在Object.keys中列举出来。如下:

Object.defineProperty(obj, prop, descriptor)将属性添加到对象,或修改现有属性的特性。
参数:
obj:目标对象
prop:需要定义的属性或方法的名字。
descriptor:目标属性所拥有的特性。
可供定义的特性列表:
value:属性的值
writable:如果为false,属性的值就不能被重写。
get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
set:一旦目标属性被赋值,就会调回此方法。
configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化。
enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。

 try{
        var a = {};
        Object.defineProperty(a,"bloger",{get:function(){return "司徒正美",value:"这是不可改变的默认值" ,writable: false}});
        alert(a.bloger)
      }catch(e){
        alert("你的游览器不支持Object.defineProperty ")
      }

所以我们可以通过这个方式修改Array.prototype,简单的实现方式:

Object.defineProperty(Array.prototype,"findT",{value:function(){return 1;}});

参考es5-shim中有一个自定义的defineProperties方法,

var defineProperties = (function (has) {
  // Define configurable, writable, and non-enumerable props
  // if they don't exist.
  var defineProperty;
  if (supportsDescriptors) {
      defineProperty = function (object, name, method, forceAssign) {
          if (!forceAssign && (name in object)) { return; }
          $Object.defineProperty(object, name, {
              configurable: true,
              enumerable: false,
              writable: true,
              value: method
          });
      };
  } else {
      defineProperty = function (object, name, method, forceAssign) {
          if (!forceAssign && (name in object)) { return; }
          object[name] = method;
      };
  }
  return function defineProperties(object, map, forceAssign) {
      for (var name in map) {
          if (has.call(map, name)) {
            defineProperty(object, name, map[name], forceAssign);
          }
      }
  };
}(ObjectPrototype.hasOwnProperty));

其实Object也是有defineProperties函数的,只是ie8不支持。

Object.defineProperties 函数 (JavaScript)
将一个或多个属性添加到对象,并/或修改现有属性的特性。

Object.defineProperties(obj, {
    newDataProperty: {
        value: 101,
        writable: true,
        enumerable: true,
        configurable: true
    },
    newAccessorProperty: {
        set: function (x) {
            document.write("in property set accessor" + newLine);
            this.newaccpropvalue = x;
        },
        get: function () {
            document.write("in property get accessor" + newLine);
            return this.newaccpropvalue;
        },
        enumerable: true,
        configurable: true
    }
});

谢谢!

转自:http://www.haomou.net/2016/10/22/2016_polyfill_shim/

20
Jun

解决AfterEffect启动界面崩溃 并弹出dynamiclinkmanager.exe报错的问题

在adobe官网,google上看了很多方案,大致列举下

1、最简单的 卸了并重装AE,不过这个似乎不能解决问题
2、下载quicktime
3、c:/用户/用户名/appdata/roaming/adobe 目录设为可读写
4、从好友电脑上拷贝一个dynamiclinkmanager.exe到你电脑覆盖 (位置AE/support files/32)
5、启动AE启动界面时,按住ctrl+shift+alt 会弹出是否要清除预置 点清除

我就是做了5才好的

24
May

Git Config中receive.denyCurrentBranch做了什么?

官网的解答

receive.denyCurrentBranch If set to true or "refuse", git-receive-pack
will deny a ref update to the currently checked out branch of a
non-bare repository. Such a push is potentially dangerous because it
brings the HEAD out of sync with the index and working tree. If set to
"warn", print a warning of such a push to stderr, but allow the push
to proceed. If set to false or "ignore", allow such pushes with no
message. Defaults to "refuse".

Another option is "updateInstead" which will update the working tree
if pushing into the current branch. This option is intended for
synchronizing working directories when one side is not easily
accessible via interactive ssh (e.g. a live web site, hence the
requirement that the working directory be clean). This mode also comes
in handy when developing inside a VM to test and fix code on different
Operating Systems.

这个config是决定 当你Push到一个非bare的远程库的正处于切换状态下分支时的行为。

设置为true或refuse时,会拒绝你的push并且发出几行警告消息
设置为warn时,会接受你的push并且发出几行警告消息
设置为false或ignore时会接受你的push且不发出警告

后两种虽然接受了push,但并没有直接反映在工作目录(working tree)上,你需要输入

git reset --hard

或者切换到其他分支再切换回来,才能刷新文件

设置为updateInstead时,会接受push并直接更新工作目录
但如果工作目录相对HEAD指针有更新,则会拒绝push
注意只有git 版本2.5以后才添加updateInstead. 请升级后再使用

09
May

解决腾讯云Centos VPS 远程连接mysql数据库的一些问题

mysql默认只支持本地(local)连接,想要开启远程连接,也就是能从远程以mysql -h的方式连接,需要进行一些设定

1、修改mysql的远程端口限制。找到etc/my.cnf
找到如下行,并修改成这样

#skip-networking
bind-address=0.0.0.0

如果没有bind-address 就手动添加。
然后重启mysql

service mysql restart

2、输入

netstat -an|grep 3306 

确保3306端口处在监听状态,如果没有可能是mysql服务有问题,需要重装

3、在本地或其他服务器尝试

telnet *.*.*.*(vps的ip) 3306

如果能连接成功,跳到第6步

4、确保firewalld(centos自带防火墙)没有限制3306端口,或者说已关闭

5、确保iptables没有限制mysql远程连接端口 输入

iptables -L -n  --line-number

如果里面有一行是什么DROP tcp -- ... tcp dpt:mysql 记住行号,并输入命令

iptables -D INDEX 行号

来删除

6、在本地或其他服务器运行

mysql -h *.*.*.*(vps的ip) -u root(mysql用户名) -p

并输入密码 如果成功接入 远程连接的配置也就成功了!

03
Apr

Visualstudio 2017 安装时出现"由于发生一个或多个包故障,工作负荷/组件不完整"等问题

日志文件一般是这样
由于发生一个或多个包故障,产品未能安装列出的工作负荷和组件。

工作负荷不完整
xxxxx
组件不完整
xxxxx

18
Mar

【更新】最近玩的一些游戏的开发引擎统计

因为最近在构思游戏,但没有想好用哪个引擎,所以整理了一下最近我玩的游戏(大部分为独立游戏)用的引擎。仅供参考

炉石传说 - Unity
崩坏3rd - Unity
影之诗[Shadowverse] - Unity
Madness Project Nexus 2 - Unity
星球探险家[Planet Explorer] - Unity
奥日与黑暗森林 - Unity
Unturned - Unity

Terraria - Microsoft XNA
星露谷物语[Stardew Valley] - Microsoft XNA
Secrets of Grindea - Microsoft XNA

点击英雄[Clicker Heroes] - Adobe Flash(AIR)
RustyLake:Roots - Adobe Flash

Undertale - Game Maker Studio

饥荒 - C++核心引擎/Lua脚本(游戏主体内容)
以撒的结合:胎衣[The binding of issac:Afterbirth] - C++/Lua脚本
冒险岛2 - 目测是C++/Lua
Starbound - C++ (UI疑似Qt)
铁锤守卫[Hammerwatch] - C#/OpenGL
监狱建筑师 - C++/OpenGL

CSGO - Source
Garry's Mod - Source