确定
取消
×
仅自己可见
qwer
小尾巴🍓🍓🍓

+1

(0) (0)
MySQL保存emoji表情之Linux设置数据库编码为utf8mb4
576

一、问题背景:MySQL数据库编码为utf8时,保存emoji表情失败,异常信息:java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘content’ at row 1查看数据库字符集信息,如下mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | utf8mb4 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | utf8 || character_set_system | utf8 || character_sets_dir | /opt/mysql/share/charsets/ || collation_connection | utf8_general_ci || collation_database | utf8mb4_unicode_ci || collation_server | utf8_general_ci |+--------------------------+----------------------------+11 rows in set查找资料,了解到collation_connection 、collation_database 、collation_server是什么没关系。但必须保证系统变量 描述character_set_client (客户端来源数据使用的字符集)character_set_connection (连接层字符集)character_set_database (当前选中数据库的默认字符集)character_set_results (查询结果字符集)character_set_server (默认的内部操作字符集)这几个变量必须是utf8mb4。二、解决问题步骤:1、Linux环境, 通过编辑my.cnf文件,设置MySQL数据库字符集,centos6.5 安装MySQL 5.7.21 ,没有找到my.cnf文件。关于,MySQL读取配置参数顺序,如下描述:On Unix, Linux and Mac OS X, MySQL programs read startup options from the following files, in the specified order (top items are used first).File Name Purpose/etc/my.cnf Global options/etc/mysql/my.cnf Global optionsSYSCONFDIR/my.cnf Global options$MYSQL_HOME/my.cnf Server-specific optionsdefaults-extra-file The file specified with --defaults-extra-file=path, if any~/.my.cnf User-specific options即/etc/my.cnf  ——> /etc/mysql/my.cnf——>/usr/local/mysql/etc/my.cnf2、将Windows环境安装的MySQL配置文件my-default.ini,copy至Linux服务器/usr/local/mysql/etc/目录下,重命名为my.cnf,添加如下基础配置信息:[client]default-character-set = utf8mb4[mysql]default-character-set = utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'完整文件如下:文件下载地址3、重启MySQL数据库输入以下命名重启MySQL数据库,service mysqld restartLinux进入MySQL命令行模式:mysql -uroot -p查看修改后结果:mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';+--------------------------+----------------------------------+| Variable_name | Value |+--------------------------+----------------------------------+| character_set_client | utf8mb4 || character_set_connection | utf8mb4 || character_set_database | utf8mb4 || character_set_filesystem | binary || character_set_results | utf8mb4 || character_set_server | utf8mb4 || character_set_system | utf8 || character_sets_dir | /usr/local/mysql/share/charsets/ || collation_connection | utf8mb4_unicode_ci || collation_database | utf8mb4_unicode_ci || collation_server | utf8mb4_unicode_ci |+--------------------------+----------------------------------+11 rows in set (0.31 sec)至此,数据库字符集修改成功。

参考:https://blog.csdn.net/hurtheart517/article/details/81118263

PS:

我们从另一个角度来看问题,其实我们在存的时候过滤掉表情即可,就不用担心以后各种取各种兼容各种显示了。

<!-- https://mvnrepository.com/artifact/com.vdurmont/emoji-java --><dependency><groupId>com.vdurmont</groupId><artifactId>emoji-java</artifactId><version>4.0.0</version></dependency>

这个包里,有这个方法

String string = EmojiParser.removeAllEmojis(param);
(0) (1)
怎么都可爱
weed
2
此人很懒,什么也没写...
(0) (1)
手动qs
(function () {  var qs = {    parse: parse,    stringify: stringify  }  var reg = /(\w+)(\=)?([^=&]+)?/  var regReplace = new RegExp(reg, 'g')  function parse (search, mergeSameKey) {    search = search.replace(/^\?/, '') // ignore start with `?`        var params = {}        search.replace(      regReplace, // ignore empty key, ignore empty key with `=`      function (text) {        var matched = text.match(reg) // [fulltext, key, `=`, value]        var key = matched[1]        var value = matched[3] || '' // maybe undefined        if (mergeSameKey && params[key]) {          if (params[key] instanceof Array) {            params[key].push(value)          } else {            params[key] = [params[key]].concat(value)          }        } else {          params[key] = value        }      }    )    return params  }  function stringify (params) {    var search = []    for (var key in params) {      var item = [key, params[key]]      search.push(item.join('='))    }    return search.join('&')  }  // test case  var s1 = 'a=1&b=2'  var res1 = parse(s1)  console.assert(res1.a === '1', '`a` should be equal 1')  console.assert(stringify(res1) === s1, '`stringify` for restore')  var s2 = '?a=1&b=2&a=3'  var res2 = parse(s2, true)  console.assert(res2.a instanceof Array, 'merge same key')  console.assert(typeof res2.b === 'string', 'unmerge key will be string')  console.assert(stringify(res2) === 'a=1,3&b=2', 'stringify array value')  // test case end  // load module  if (typeof module === 'object' && typeof module.exports === 'object') {    module.exports = qs  } else if (typeof window === 'object') {    window.qs = qs  } else {    return qs  }})()

(0) (0)
linux下后台启动springboot项目
576

我们知道启动springboot的项目有三种方式:

  • 运行主方法启动
  • 使用命令 mvn spring-boot:run”在命令行启动该应用
  • 运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。

我们在开发的时候,通常会使用前两种,而在部署的时候往往会使用第三种。但是,我们在使用java -jar来运行的时候,并非后台运行。

下面我们来说说服务器上如何后台启动springboot项目。

该方法主要通过使用nohup命令来实现,该命令的详细介绍如下:

nohup 命令

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ][ & ]

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 &到命令的尾部。

示例:

nohup java -jar xxx.jar &

这样执行后,nohup会把执行结果中的日志输出到当前文件夹下面的nohup.out文件中,通常情况下我们使用以上命令即可。 我们也可以手动指定一个参数来规定日志文件的输出地点,如: 

nohup java -jar xxx.jar > catalina.out  2>&1 &
(0) (0)
【算法】服务治理---限流(令牌桶算法)
576
1

1、最近在写一个分布式服务的框架,对于分布式服务的框架来说,除了远程调用,还要进行服务的治理

当进行促销的时候,所有的资源都用来完成重要的业务,就比如双11的时候,主要的业务就是让用户查询商品,以及购买支付,

此时,金币查询、积分查询等业务就是次要的,因此要对这些服务进行服务的降级,典型的服务降级算法是采用令牌桶算法,

因此在写框架的时候去研究了一下令牌桶算法

 

2、在实施QOS策略时,可以将用户的数据限制在特定的带宽,当用户的流量超过额定带宽时,超过的带宽将采取其它方式来处理。

要衡量流量是否超过额定的带宽,网络设备并不是采用单纯的数字加减法来决定的,也就是说,比如带宽为100K,而用户发来

的流量为110K,网络设备并不是靠110K减去100K等于10K,就认为用户超过流量10K。网络设备衡量流量是否超过额定带宽,

需要使用令牌桶算法来计算。下面详细介绍令牌桶算法机制:

    当网络设备衡量流量是否超过额定带宽时,需要查看令牌桶,而令牌桶中会放置一定数量的令牌,一个令牌允许接口发送

(0) (0)
【转载】How to create a dark theme without breaking things: learning with the Yandex Mail team
576
10

My name is Vladimir, and I develop mobile front-end for Yandex Mail. Our apps have had a dark theme for a while, but it was incomplete: only the interface and plain emails were dark. Messages with custom formatting remained light and stood out against the dark interface, hurting our users’ eyes at night.

Today I'll tell you how we fixed this problem. You will learn about two simple techniques that didn't work for us and the method that finally did the trick — adaptive page recoloring. I'll also share some ideas about adapting images to a dark theme. To be fair, darkening pages with custom CSS is a rather peculiar task, but I believe some of you may find our experience helpful.

Simple methods

Before settling on our magic color-bending technique, we tried out two really basic options: applying either additional dark styling or a CSS filter to elements. Neither option worked for us, but they might be more suitable in other cases (simple is cool, right?).

Overriding styles

(0) (0)
啦啦啦啦啦 我崽
weed
1

  

(0) (1)
test pic
576
1

qwerqwer

(0) (0)
test linux
576

qwer

(0) (0)
《我要夏天》
1

别怕晒的黑
看起来很健康
泳池旁的妹
笑起来很阳光
对你Say个Hey
出水芙蓉加甩头
你是哪位
管他天多黑
反正还有月光
(0) (0)
今天是大厨
weed
此人很懒,什么也没写...
(0) (1)
基于iframe的CFS(Cross Frame Script)和Clickjacking(点击劫持)攻击
576

攻击原理:    CFS攻击(Cross Frame Script(跨框架脚本)攻击)是利用浏览器允许框架(frame)跨站包含其它页面的漏洞,在主框架的代码中加入scirpt,监视、盗取用户输入。    Clickjacking(点击劫持) 则是是一种视觉欺骗手段,在web端就是iframe嵌套一个透明不可见的页面,让用户在不知情的情况下,点击攻击者想要欺骗用户点击的位置。    CFS 和 Clickjacking其实都是基于网页iframe产生的攻击。当没有预防的时候,攻击者可以利用iframe的方式包含你的网页,采用欺骗的方式,引导用户过来点击,利用监听盗取用户输入信息或者是利用样式控制或者骗取用户点击某个特定的区域,而达到获取劫持的目的。防止被 FRAME 加载你的网站页面1. meta 标签:很多时候没有效果,无视<meta http-equiv="Windows-Target" contect="_top"> 2. js 判断顶层窗口跳转,可轻易破解,意义不大function locationTop(){ if (top.location != self.location) { top.location = self.location; return false; } return true;}locationTop();破解:// 顶层窗口中放入代码var location = document.location;// 或者 var location = ""; 【像淘宝前端页面用的js:if (top.location != self.location){        top.location = self.location;    }】3. header 控制,绝大部分浏览器支持网站Sitemap的一些规则 使用 X-Frame-Options 有三个可选的值:DENY:浏览器拒绝当前页面加载任何Frame页面SAMEORIGIN:frame页面的地址只能为同源域名下的页面ALLOW-FROM:允许frame加载的页面地址PHP代码:header('X-Frame-Options:Deny');Nginx配置:add_header X-Frame-Options SAMEORIGINApache配置:Header always append X-Frame-Options SAMEORIGIN具体参见:https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options?redirectlocale=en-US&redirectslug=The_X-FRAME-OPTIONS_response_header注明:如果是针对 安全扫描 appscan 或者CFCA认证 用的webinspect 这些工具的话扫出来的 Cross_Frame SCRIPT之类的high级别的安全问题,用第三条解决是可以过扫描的。如果不是过工具扫描,上述三中方案都是可行的。在java中加入header deny方法如下(spring mvc,其他框架大同小异)  @RequestMapping("/login")    public String login(HttpServletRequest request,HttpServletResponse response) {        HttpSession session = request.getSession();         session.invalidate();        response.addHeader("x-frame-options","DENY");        return "login";    }之所以扫描工具不认前端js跳出frame也是有道理的,毕竟破前端js难度不大

https://blog.csdn.net/zp522123428/article/details/42295031  

(0) (0)
【Java】运算符优先级口诀:单目算术位关系,逻辑三目后赋值。
576
运算符优先级口诀:单目算术位关系,逻辑三目后赋值。
单目:++、--
算术:+、-、*、/、%
位:位移运算符:<<、>>、>>>
关系:<、>、<=、>=、==
========================
逻辑:&&、||、!、&、|、^
三目:三目运算符(又称为三元运算符)A>B? x:y
后:凑字数用的。。
赋值:=
(0) (0)
Websocket原理
576
5

一、websocket与http

WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)

首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解

有交集,但是并不是全部。

另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=

再简单来说,层级不一样。

二、Websocket是什么样的协议,具体有什么优点

首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。

(0) (0)
1 / 14
Bio:{{user.bio== undefined?'(→_→)Nothing':user.bio}}
发帖
个人中心
消息
{{noticeNum}}
登出