mysql> create database <database_name> character set UTF8 collate utf8_general_ci;
或
mysql> create database <database_name> character set utf8mb4 collate utf8mb4_unicode_ci;
mysql> drop database <db_name>;
mysql> show databases;
mysql> show tables;
[root@linux ~]# mysqldump -h localhost -p [数据库名] -u[用户名] >[_bak-文件名.sql]
[root@linux ~]# Password: *** 输入密码
[root@linux ~]# >
导出所有数据库
mysqldump -u root -p --all-databases > alldb.sql
mysql -u[用户名] -p[密码]
mysql -u root -p < alldb.sql
进入MySQL,指定数据库,然后使用Source导入,当然其他命令也可以实现,如:mysql,mysqldump
mysql>use [数据库]
mysql>source [导入数据文件].sql
sudo apt-get install unzip
unzip file.zip -d 'destination_folder'
如:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
如:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
删除文件夹:删除/var/log/httpd/access目录以及其下所有文件、文件夹
rm -rf /var/log/httpd/access
删除文件:强制删除/var/log/httpd/access.log这个文件
rm -f /var/log/httpd/access.log
编辑文件 .htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=permanent,L]
sudo apachectl -S
注意看是否有错误返回,如有则先fixed后再启动Apache服务。 (参考: apple.stackexchange.com/questions/255421/macos-sierra-localhost-stops-working-when-virtual-host-is-enabled)
sudo /usr/sbin/apachectl start
sudo /usr/sbin/apachectl stop
sudo /usr/sbin/apachectl restart
建立vhost,首选创建或修改etc/apache2/sites-available下的文件如: domain1.com,然后 执行以下命令让配置文件生效 。
sudo a2ensite domain1.com
重启Apache
sudo service apache2 restart
]]>经常会遇到读取到缓存的脏数据导致线上故障。很多情况下都会产生脏数据,例如数据库数据变更,下游service数据结构变化等。这时在开发时需要考虑全面,如果不够确定可以请核心开发人员帮忙代码review。下面是预防此类问题的常用策略:
启动专门的后台线程,负责更新缓存,其它线程只做读取操作。这样无论并发量多大,一个application instance最多只有一个线程会回源,避免了缓存突然失效时瞬间出现大量回源请求。对于有多个application instances的应用,例如mapi目前有400个application instances,最大仍有可能有400个回源请求,这种情况可以加入随机offset,避免所有application instacnes在同一时间回源。示例代码如下:
private class ApiKeyUpdater implements Runnable {
private final Logger logger = LoggerFactory.getLogger(ApiKeyUpdater.class);
private Random rand = new Random();
@Override
public void run() {
while (true) {
try {
if (stopped) {
logger.info("Termination signal received, exit...");
break;
}
long sleepTime = UPDATE_INTERVAL + rand.nextInt(UPDATE_OFFSET);
Thread.sleep(sleepTime);
refreshApiKeyMap();
}
catch (InterruptedException e) {
logger.info("Interruption signal received, exit...");
break;
}
catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
}
当然后台线程带来的一个问题是,如果很多地方都有类似的配置需求,不可能所有地方都启动一个后台线程。对于这种情况,最好引入统一的配置中心实现。
Pros
Cons
Pros
Cons
Pros
Cons
Pro
Cons
Markdown 和 Textile 都是如今轻量级标记文本风潮下的产物,基本设计思路差异不大。
= Markdown 的优点 =
Markdown 的主要优点是有大量的第三方编辑器支持。首先 GitHub 的在线文档编辑器就能很好地支持它,而 Mac App Store 或 Windows Marketplace 上搜索 Markdown editor 也是一抓一大把。很多编辑器都支持所见即所得编辑,非常方便。相比之下支持 Textile 的编辑器数量就很少。但 Markdown 在做复杂的内容编辑时能力有限,要求编写者最好具备一定的 HTML 基础,比如插入表格。对不熟悉 HTML 的朋友来说,这种操作未免麻烦了些。
——但需要注意的是,这不算是 Markdown 的问题,而是设计者有意为之的。本来 Markdown 的设计目的是为了「简化」而非「替代」HTML。
= Textile 的优点 =
Textile 的优势是不需要过多的 HTML 基础(当然如果确实需要,用户也可以用)。比如表格,它提供了 [Table] 标志而不是要求直接上 HTML 段落;又比如 == 号可用来阻止解释器解释,而不是像 Markdown 那样需要直接用
< div >
。Textile 的另一个好处是它提供了一些复杂字符的内建支持,比如: (r) == ® , (tm) == ™ , (c) == © ,放在 Markdown 里就麻烦一些。第三个好处,也是我很喜欢 Textile 的一点:它提供的标记更容易阅读。比如标题标记,Textile 用 .h1 .h2,级别一目了然,和 Markdown 用「#」和「##」的标识相比,可读性更好。
另外,来自英文网站的对比参考如下:( 原文链接 )
Items | Textile | Markdown |
---|---|---|
Bold text | *Bold* | **Bold** |
Italic text | _Italic_ | *Italic* |
Underline text | +Underline+ | Not available |
Inline code | @inline code@ | `inline code` |
Pre-formatted text | < pre > … < pre > |
~~~ … ~~~ |
Syntax highlighting | < pre >< code class=“ruby” > … < /code >< /pre > |
~~~ ruby … ~~~ |
Bullet list | * Item 1 * Item 2 |
* Item 1 * Item 2 |
Numbered list | # Item 1 # Item 2 |
1. Item 1 2. Item 2 |
Headings | h1. Heading 1 h2. Heading 2 … h6. Heading 6 |
# Heading 1 ## Heading 2 … ###### Heading 6 |
Links | "Anchor":http://link | [Anchor](http://link) |
Images | !image_url(Title)! | ![Title](image_url) |
Tables | |_.Table|_.Heading| |Cell |Cell | |
|Table|Heading| |-----|-------| |Cell |Cell | |
综上,我们没必要在如何选择上太过纠结,工具的使用需要按应用场景,甚至个人喜好去决定。找到一款适合的高效的工具就行,所以流行的也不一定是最好的,更不一定是适合自己的。
]]>mysql
连接符与指针变更为 mysqli
; mysqli_insert_id($contacts)
需要带参数if (d!="CA" && d!="US" || d=="CN")
contact_image = '".$picture."',
$tid = mysqli_insert_id($contacts);
,插入指针须带上连接符作为参数的原因。mysqli_select_db($contacts,$database_contacts);
这个是错误的 $cid = mysqli_insert_id();
,应该写完整@$cid = mysqli_insert_id($contacts);@
$contacts->query("SET NAMES 'UTF8'");
错误信息:@Cannot read property ‘queueData’ of undefined@ , 搜索一下发现是因为flash被禁用的问题引起,参考: stackoverflow
为此有必要更新无Flash组件,查看官网发现果真已经支持了,HTML5 才是王道。但是,HTML5版本是收费的,于是继续研究发现已经有人自己改写了大部分API,直接下载使用即可。参考文章: 免费的HTML5版uploadify
The Uploadify™ flash version has been deprecated. Below you’ll find a video demo of the HTML5 UploadFive™ implementation.
通讯录项目Fork源 www.simplecustomer.com
]]>开发者帐号的申请前往 developer.twitter.com/en/account/get-started 按步骤申请即可。
关于帐号的创建步骤,可以参考: Simplest PHP example for retrieving user_timeline with Twitter API version 1.1
1、创建开发者帐号,进入 https://developer.twitter.com/
2、创建APP应用,进入 https://apps.twitter.com/
应用创建后,可以生成并查看Token值,并设置Callbak URL等信息。
因为涉及第三方调用,后来发现自己的VPS服务器还不支持 curl
扩展。于是,按以下方法安装,分别执行:
1、First Install CURL by typing
sudo apt-get install curl
2、Then Restart Apache by typingsudo service apache2 restart
3、Then Install PHP5 CURL by typingsudo apt-get install php5-curl
4、Then Restart Apache by typingsudo service apache2 restart
后来通过 phpinfo.php
查看发现依然没有 curl
扩展被启用,继续捣腾发现,默认安装的 curl 扩展被放置在 /usr/lib/php5/20121212
而实际环境调用的扩展是在 /usr/lib/php/20131226
下(因为之前手动升级至php5环境)。
补充, phpinfo.php
文件内容如下:
<?php phpinfo(); ?>
继续研究发现,原来 curl
扩展的安装要精确到具体的版本号,于是通过以下方式:
PHP 7.2:
sudo apt-get install php7.2-curl
PHP 7.1:sudo apt-get install php7.1-curl
PHP 7.0:sudo apt-get install php7.0-curl
PHP 5.6:sudo apt-get install php5.6-curl
PHP 5.5:sudo apt-get install php5.5-curl
参考:How to install php-curl in Ubuntu 16.04
因为自己服务器环境使用的是 php 5.6 版本,所以通过以下命令即可完成安装:
sudo apt-get install php5.6-curl
安装后,需要重启服务器:
sudo /etc/init.d/apache2 restart
此时可以验证 curl
扩展已经配置成功。
总结一下:
针对curl扩展的安装需要精确到具体的版本,比如:php5.6-curl
,而不是php5-curl
。
关于Twitter API的调用,参考文章: PHP: GETTING LATEST TWEETS AND DISPLAYING THEM IN HTML
<?php
// Require J7mbo's TwitterAPIExchange library (used to retrive the tweets)
require_once('vendor/j7mbo/twitter-api-php/TwitterAPIExchange.php');
// Require our TwitterTextFormatter library
require_once('TwitterTextFormatter.php');
// Use the class TwitterTextFormatter
use Netgloo\TwitterTextFormatter;
// Set here your twitter application tokens
$settings = array(
'consumer_key' => 'CONSUMER_KEY',
'consumer_secret' => 'CONSUMER_SECRET',
// These two can be left empty since we'll only read from the Twitter's
// timeline
'oauth_access_token' => '',
'oauth_access_token_secret' => '',
);
// Set here the Twitter account from where getting latest tweets
$screen_name = 'SCREEN-NAME';
// Get timeline using TwitterAPIExchange
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$getfield = "?screen_name={$screen_name}";
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
$user_timeline = $twitter
->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
$user_timeline = json_decode($user_timeline);
// Print each tweet using TwitterTextFormatter to get the HTML text
echo "<ul>";
foreach ($user_timeline as $user_tweet) {
echo "<li>";
echo TwitterTextFormatter::format_text($user_tweet) . "<br/>";
// Print also the tweet's image if is set
if (isset($user_tweet->entities->media)) {
$media_url = $user_tweet->entities->media[0]->media_url;
echo "<img src='{$media_url}' width='150px' />";
}
echo "</li>";
}
echo "</ul>";
?>
以上,需要依赖两个文件:
TwitterAPIExchange.php
TwitterTextFormatter.php
// Set here your twitter application tokens
$settings = array(
'consumer_key' => 'CONSUMER_KEY',
'consumer_secret' => 'CONSUMER_SECRET'
// These two can be left empty since we'll only read from the Twitter's
// timeline
'oauth_access_token' => '',
'oauth_access_token_secret' => '',
);
以上只需要设置开发者帐号中生成的 consumer_key
及 consumer_secret
即可, 而 oauth_access_token
、 oauth_access_token_secret
不需要配置。
最后浏览 https://sheshui.me/twitter/ 已经成功读取到最新的 Tweet 信息。
1、由于Twitter及API URL地址都处于墙外,所以实现的前提是自己的Server部署在海外,否则此法不通。
2、原作者提供的脚本没有打印推文时间,可以通过 foreach
中加上:
echo '<span>'.date( 'Y-m-d H:i:s', strtotime($user_tweet->created_at)).'</span>'
—— THE END 2018.9.28 GZ
]]>utf8mb4
Changed: Default charset is now
utf8mb4
: supports a wider range of characters, includingemoji
.
来源:Textpattern CMS 4.6.0 released: it’s big
此博客系统是自己通过早期的版本逐步升级至现在的 4.7.0 版,所以数据库字符集格式还是停留在之前的 utf-8
, 最近转发 璟宝的Moment 内容至博客文章时,发现Emoji表情无法支持,保存文章时直接被过滤。
于是,自己开始寻找原因,首先是Google搜索关键词: Textpattern+Emoji ,发现并没有太多结果,但从结果中发现跟数据库的字符集有关。
其次,根据搜索结果方案在本地测试环境实验:修改数据库及表字符集为 utf8mb4_unicode_ci
,命令如下:
alter table database_name convert to character set utf8mb4 collate utf8mb4_unicode_ci;
然后把 Textpattern 的 config.php
中的 $txpcfg['dbcharset'] = 'utf8';
修改为 $txpcfg['dbcharset'] = 'utf8mb4';
最后文章发布带有 Emoji 表情图标的文章,发现浏览后可以正常显示,实验成功!
已经知道文章需要支持Emoji 的原因后,我准备为生产坏镜升级。开始之前, 必须要备份数据库,以防万一!
登录生产,通过 mysqldump
命令完成数据库备份。
[root@linux ~]# mysqldump -h localhost -p [数据库名] -u[用户名] >[_bak-文件名.sql]
[root@linux ~]# Password: *** 输入密码
[root@linux ~]# >
通过终端工具登录MySQL mysql -u[用户名] -p[密码]
,选择数据库 mysql> use database_name
1、升级数据库
# Run this once on each schema you have (Replace database_name with your schema name)
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
2. 升级数据表
# Run this once for each table you have (replace table_name with the table name)
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3、升级数据字段
# Run this for each column (replace table name, column_name, the column type, maximum length, etc.)
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4、修改配置文件
数据库及表字符集转换升级后,一定要记得修改应用程序的配置文件,通常是处理与数据库连接的 config.php
,比如:Textpattern中,需将 config.php
文件内容 $txpcfg['dbcharset'] = 'utf8';
修改为 $txpcfg['dbcharset'] = 'utf8mb4';
数据库及表升级后,使用 MySQL命令查看所有字段的字符集。
mysql> show full columns from table_name;
返回的结果可以看到该表下的所有字段以及字符集等信息,确认已经转成 utf8mb4_unicode_ci
即可。
然后进入博客系统后台,发表带有 Emoji 表情内容,观察是否发布成功,可以正常保存则验证通过,此时浏览文章能正常看到Emoji表情,升级工作完成。(Emoji 表情文章: 贝比成长记:5岁能讲故事的孩子,学习成绩不会差 )
有关utf8mb4 与 utf8的区别,可以搜索: utf8mb4 vs utf8
, 核心就是utf8mb4可以支持4个字节,而utf8是三个,所以当遇到 Emoji 这种宽字节时就产生错误: Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
utf-8
, 最近转发 璟宝的Moment 内容至博客文章时,发现Emoji表情无法支持,保存文章时直接被过滤。]]>偶然间通过很多独立博客的友链去搜寻一些比较精致的博客作品,因为毕竟诸如网易博客这种平台型的产品也下线了,或多或少都会滋生一些新的独立博客,然而好品质的博客不常有,但 Inwao World 算是一类较好品质的作品。更值得幸会的是这位博主也是一名“巍迷”,于是大家有了共同的话题。
通过JS随机获取文本并在页面展示,这个实现不麻烦,至于如何通过API的方式输出,只能Google一下,于是进入 Ctrl+C
与 Ctrl+V
模式。
<?php
//定义内容文件路径
$path = dirname(__FILE__);
$file = file($path."/yiyan.txt");
//以每一行的方式随机读取
$arr = mt_rand( 0, count( $file ) - 1 );
$content = trim($file[$arr]);
//编码判断,用于输出相应的响应头部编码
if (isset($_GET['charset']) && !emptyempty($_GET['charset'])) {
$charset = $_GET['charset'];
if (strcasecmp($charset,"gbk") == 0 ) {
$content = mb_convert_encoding($content,'gbk', 'utf-8');
}
} else {
$charset = 'utf-8';
}
header("Content-Type: text/html; charset=$charset");
//格式化判断,输出js或纯文本
if ($_GET['format'] === 'js') {
echo "function hitokoto(){document.write('" . $content ."');}";
} else {
echo $content;
}
// 以上来源参考: https://laod.cn/design/page/hitokoto-yiyan.html
以下开始在页面通过JS进行调用并展示。
<script type="text/javascript" src="https://www. yourdomain.com/yiyan/?format=js&charset=utf-8"></script>
<div id="yiyan"><script>hitokoto()</script></div>
/* via: https://laod.cn/design/page/hitokoto-yiyan.html*/
到此为止,页面每次刷新就可以获取新的文本内容。 yiyan.txt
文件格式参考:
此刻谁在群山云海之巅,自在的心畅游天外之天。 ——「此时此刻」
是谁在风中奔跑,自由穿行梦想,向着幸福的远方。 ——「风行」
静静看着开始到结束,就像是经历一场生命洗礼。 ——「出离」
世界宛如一场梦,我不能在这里轮回不已。 ——「出离」
没有什么能够阻挡,你对自由的向往。 ——「蓝莲花」
此刻我在远方思念你,桃花已不觉开满了西山。 ——「世外桃源」
为了取得更好的展示效果,且不需要刷新页面的前提下可滚动更新页面显示。可更换以上 Script
部分的脚本如下:
(function() {
var server = 'https://www. yourdomain.com/yiyan/?format=js';
var target = document.getElementById('hitokoto');
var fadeDur = 1;
var waitDur = 10;
var errorMsg = '加载出现了问题!';
/* -- 配置部分结束 -- */
var first = true;
var present = '';
target.style.opacity = 0;
target.style.transition = 'opacity ' + fadeDur + 's';
function loadData() {
var connect = new XMLHttpRequest();
connect.open('GET', server, true);
connect.onload = function() {
if (connect.status >= 200 && connect.status < 400) {
present = connect.responseText;
if (first) {
first = false;
target.textContent = present;
fadeIn();
} else {
fadeOut();
}
} else {
target.style.opacity = 1;
target.textContent = errorMsg;
setTimeout(loadData, (fadeDur + waitDur) * 1000);
}
}
connect.onerror = function() {
target.textContent = errorMsg;
setTimeout(loadData, (fadeDur + waitDur) * 1000);
}
connect.send();
}
function fadeOut() {
target.style.opacity = 0;
setTimeout(function() {
target.textContent = present;
fadeIn();
}, fadeDur * 1000);
}
function fadeIn() {
target.style.opacity = 1;
setTimeout(loadData, (fadeDur + waitDur) * 1000);
}
loadData();
})();
// 来源参考:https://www.tcdw.net/post/hitokoto-auto/
对应的 HTML
显示对象需修改如下:
<span id="hitokoto"></span>
以上就是关于在页面显示一言1,当然也可以是Mission、格言等等的最简单操作。而关于一言 hitokoto1 在 Github
也还有很多相关项目可以参考学习。比如:
当然,通过Google还可以发现有更复杂的解决方案,具体还要看自己的实际应用场景,对于类似这种博客上仅需要提升下文艺小清晰的页面氛围,我觉得本文所提供的就足够用了。
1 一言网(Hitokoto.cn)创立于2016年,隶属于萌创Team,目前网站主要提供一句话服务。
动漫也好、小说也好、网络也好,不论在哪里,我们总会看到有那么一两个句子能穿透你的心。我们把这些句子汇聚起来,形成一言网络,以传递更多的感动。如果可以,我们希望我们没有停止服务的那一天。
简单来说,一言指的就是一句话,可以是动漫中的台词,也可以是网络上的各种小段子。
或是感动,或是开心,有或是单纯的回忆。来到这里,留下你所喜欢的那一句句话,与大家分享,这就是一言存在的目的。
via: hitokoto.us
— THE END.
]]>此文为内部分享文章。作者: Harry 2017年3月
目前我们从各渠道收集到了唯品会用户在下单后,对商品的一些评论。但这些评论数量较多,质量参差不齐,不经过筛选直接放出容易将大量差评暴露给用户,影响转化率。同时分品类的评论对商品本身质量以及用户对唯品会的满意程度也是一个侧面的反应,故希望能够用机器处理的方法,对用户评论进行分类筛选和排序,同时可以实时动态的统计各类评论的分布。
NLP是世界性难题。目前市面上处理NLP问题的方法五花八门,但大多数针对某个特定的领域比较有效,缺乏一个通用的方法。总结下来大致分为三类:
受alphaGO影响,信念是:面对复杂问题必须采用分而治之的思想,企图通过一个模型,一种模式,一个规则,一个第三方包来解决NLP问题是行不通的。需要的是模型,规则,策略的有机结合。
21号写给Jeru的信中提到了大致的方法
Hi Jeru,
针对需求,我建议分2步走:
1、分解出强烈正向(正向因素多次出现),正向(正向因素出现,且无负向因素),中性(正负因素都出现或都不出现),负向(负向因素出现),强烈负向(负向因素频发出现) 5个部分,排序也按照这个来。
2、在每个档次中细分打分排序。做到第一步的时候就已经可以很好的满足下面的要求了,同时第二步每个分类中还可以精确化打分,又为之后的提高留足了空间。
今天我和伟丰拉出了80w条真实评论数据,已经做了分词和热词分析,同时做了多种划分方式分而治之提高准确度,目前看到:
好评多出现在短评,长评中。(极品好评出现在长评中)
恶评多出现在中评,长评中。(极品恶评出现在长评中)
中评多出现在短评,中长度评价中。技术上我会把功能做到一个library中,之后无论是做batch还是做service都很方便。
Thanks,
Harry
实际操作过程中,第一步形成热词库极为关键,张伟丰通过使用word2vec 用一批种子热词扫描全部评论抓到了一批同义词和近义词,形成了一个规模很小的词库。
利用这个小词库,我们开始对1个字评论,2个字评论,3个字评论,4个字评论,5个字评论逐步迭代,将评论分类,对于错误分类的评论和未能识别分类的评论进行热词追踪,继续丰富热词库。
整个词库的积累过程是极为乏味和劳累的,每天都要处理数万条评论,经常会有眼花,头晕和想吐的感觉,但是我和伟丰有良好的毅力和职业素养,每次坚持不住的时候都会想到Jeru把这么重要的任务交给了上海创新团队,一定要不辱使命的完成,我们顶住了,我们并没有吐。
由于汉语语法的复杂性,各种句式交织在一起极难处理,很多词组短句差一个字,情感就完全变了。很水 – 很水润,比较干 – 比较干爽,好小啊 – 好小巧啊, 气的我 – 帅气的我。。。经过研究,解决这类问题最有效的方法就是“分级贪婪匹配”,于是词库也被分为多个优先级,分批次进行匹配。
伴随着词库的丰富,很多分词规则和优先匹配规则都慢慢的建立起来了,下一步就要来看模型和组合策略了。
对于模型:基于我对模型的理解,单模型解决这么复杂的问题肯定是行不通的,每个规模一定的模型,容量是有限的,应该只关注一部分问题。其中一种想法就是模型也会被拆分为2字处理模型,3~5字处理模型 etc,终极目标是让模型具有短句处理能力,再用策略把模型对每个短句的分析结果结合起来进行应用。
对于策略:基于实践的策略!由于模型的分类能力远不能达到Jeru提出的99%标准,那分类的任务主要由匹配规则承担,匹配结果,在用策略进行筛选,系统可以配置偏严的,偏宽松的等不同的策略。
总结下来整个NLP解决的方法就是:热词的积累,分级贪婪匹配规则的建立,策略的选取,策略分群结果中利用模型的再排序,整体结果的策略融合与输出。
1、否定词的处理:评论中出现了大量的否定词,例如:不,不是,不上,没有,不够,别 etc,如果有效的处理这些否定词对最终结果有着至关重要的影响!实际操作中我们尝试了2种方法:(实际使用中2种方法效果都不错,经实验,b方法效果更优)
2、比较句式:唯品会比京东服务好,淘宝比唯品会便宜。。这样的句子处理起来难度相当大,实践中摸索了很长时间,最终确定的方案是:
3、错别字:错别字很普遍,当时想到了2种方法,第一种比较简单就是把常用错别字也收到热词库里比如说显瘦,显廋 etc。 还有一种是做普通分析前,做一次汉字到拼音的转换,再形成一套拼音的热词库,很多错别字读音都相同,那就跟原词没多大区别了。实际操作起来第二种方法耗时太长,最后采用了第一种方法,第二种方法可以在今后合适的时机启用。
整个评论NLP处理逻辑可以打成一个library,容量很小,执行速度极快(每10条评论处理,耗时小于1ms),且支持批量处理(每batch 1000条),基于此事实,评论处理加入NLP可采用如下两种架构。
1、离线架构:评论系统负责人,update评论系统表增加“评论分类”和“分数”两个字段,首先使用NLP API对评论表中评论进行批量更新分数和分类。然后采取增量更新的方式,对新增评论使用NLP API进行分类和打分。对于未打分评论按medium和50分进行处理。最后实时comments api接口利用分数及其他因素(例如时间戳 etc)对评论进行排序并输出结果。
2、实时架构:Comments API 直接接入NLP API,在实时执行阶段,对每接口拉出评论进行现场打分和排序,再输出结果。
系统架构采用现在架构不变即可。
<dependency>
<groupId>com.vips.mobile</groupId>
<artifactId>vips-infra-nlp-core</artifactId>
<version>1.0.5</version>
</dependency>
Integrate with nlp CPEngine
// init NLP CPEngine
CPEngine cpe = new CPEngine();
cpe.warmUp();
// construct variable map
CommentsCategory singleResult = cpe.categoryAnalysis(single); // for single comment processing
List<CommentsCategory> result = cpe.batchCategoryAnalysis(list); // for batch comments processing
// 根据不同品类,给出评论得分 for 口碑项目
CommentsCategory singleResult = cpe.categoryAnalysis(single,catId); // for single comment processing
List<CommentsCategory> result = cpe.batchCategoryAnalysis(list,catId); // for batch comments processing
// tear down
cpe.tearDown();
1、不要轻易升级你的系统,做小白鼠的代价很大
这个在我升级 EI Captain 时就有切身体会,Outlook经常假死、Axure Pro 7.0 无法运行( 下载新版解决 )、甚至连之前配置的Apache 环境也被覆盖了,虽然有备份,但httpd-vhost.conf 文件被更新导致我无法运行本地网站测试,只能重新去检查httpd.conf, httpd-vhost.conf 两个文件的配置
2019年10月份,升级至当时最新的版本10.15后发现 mySQL Server 不能通过System Preferences 进行启动,搜索发现可以通过命令完成:(via: discussions.apple.com/thread/8604414 )
Start MySQL
sudo /usr/local/mysql/support-files/mysql.server start
Stop MySQL
sudo /usr/local/mysql/support-files/mysql.server stop
Restart MySQL
sudo /usr/local/mysql/support-files/mysql.server restart
原因分析: 新系统对 TLS 服务器证书添加了限制:TLS 服务器证书的有效期必须为 825 天或更短。更多 support.apple.com/zh-cn/HT210176
解决方案: 重新签发证书,配置有效期符合要求即可。如无法修改签名证书,也可以采用下面的方式,本地调整即可。
方案思路: 移除证书,重新添加并配置证书未始终信任
解决步骤:
1、打开「钥匙串访问 – 搜索自签名证书」并移除;
2、打开「Safari – 偏好设置 – 隐私 – 管理网站数据 – 全部移除」。
3、重新用 Safari 打开自签名证书的站点,会提示「证书不安全」,可选择「查看证书」 | 「继续访问」,选择「继续访问」并信任证书
4、打开「钥匙串访问 – 搜索自签名证书」,并配置自签名证书的全局配置为「始终信任」
5、打开 Chrome 验证。 Ref: https://support.apple.com/en-in/HT210650
via: segmentfault.com
参考: macOS 10.15 Catalina Apache Setup: Multiple PHP Versions
MacOS 10.15 Catalina 系统实际已经预装了Apache环境,如果系统从Mojave升级过来,可能沿用之前的配置环境,如果web服务重启后发现系统自动在运行预装的Apache进程;
如果要使用系统预装的Apache服务,可以参考 How to install Apache, MySQL, PHP on macOS Catalina 10.15
如果要全新自定义安装Apache服务,则参考 macOS 10.15 Catalina Apache Setup: Multiple PHP Versions
自定义安装配置文件目录 如下:
/usr/local/etc/httpd/httpd.conf
服务启动 如下:
$ sudo apachectl -k restart
$ brew services restart httpd
总结并汇总以前遇到的问题,不间断更新…
在Mac OSX下被忽略 .htaccess 导致网站运行500错误,显示.htaccess等隐藏文件的方法如下:
Step 1、设定隐藏文件为可见
defaults write com.apple.finder AppleShowAllFiles TRUE
Step 2、杀掉所有Finder进程,同时Finder会自动重启
killall Finder
via: www.cnblogs.com/kristain/articles/3320506.html
Step 1:检查httpd.conf文件配置
LoadModule alias_module libexec/apache2/mod_alias.so #开启自定义URL支持
LoadModule rewrite_module libexec/apache2/mod_rewrite.so #开启URL重写支持
LoadModule php5_module libexec/apache2/libphp5.so #开启PHP的支持
<IfModule dir_module>
DirectoryIndex index.html index.php #增加对PHP文件的支持
</IfModule>
Step 2:检查PHP.ini文件配置问题
路径:/etc/php.ini
问题:date(): It is not safe to rely on the system’s timezone settings
方案:查找date.timezone 去掉前面的分号修改成为:
date.timezone =PRC #或修改为 date.timezone = Asia/Hong_Kong
Charles 是Mac下常用的抓包测试工具,当升级 EI Captain后,打开Charles发现需要Java环境。提示:跳转链接至: support.apple.com/kb/DL1572?locale=en_US
还好,下载安装后即可解决Charles打开环境问题。
截止2019.5,最新的Chrome 自带 Google Translator 插件工具,支持页面Tooltips显示翻译,无需再用此复杂的配置。
实现步骤如下:
1、打开Automator 应用并创建一个新服务;Open an Automator and create a new Service.
2、设置方法:The top section set in this way:
-- Automator Service for passing selected text (after selection the service from context menu) to google translate (works in Google Chrome)
on run {input, parameters}
set output to "http://translate.google.com/translate_t?sl=auto&tl=zh-CN&text=" & urldecode(input as string)
return output
end run
on urldecode(x)
set cmd to "'require \"cgi\"; puts CGI.escape(STDIN.read.chomp)'"
do shell script "echo " & quoted form of x & " | ruby -e " & cmd
end urldecode
参考:
安装包下载: chinamac.com/download/mac7059.html 百度网盘下载 (提取码:5l9l)
安装前建议: 完全卸载旧版
个人不建议使用盗版,也算是不得已而为之,原因是:穷!
破解方法:前提需要保证你已经安装Xcode,然后在命令终端运行压缩包里的MSO15.112Patch.exec文件,运行后可以在终端看到替换Office 签名的信息,如果全部替换成功会显示:ALL DONE!Enjoy!
苹果自带的Dictionary异常强大,前提是需要给它添加一些词典包。
词典包地址:点击前往下载
下载的包格式为 .tar.bz2 ,无需解压。
词典转换工具地址:DictUnifier
下载后解压,双击打开即可,无需安装。
打开DictUnifier后,将下载的词典包拖入其中,即可自动安装。词典安装时间比较长,要耐心等待。安装完成后,打开词典(Dictionary),找到偏好设置,把刚才安装的词典勾选一下即可使用。
via: www.yurendu.com/read/mac-extend-dictionary-word-library.html
Axure RP 8.1.0.3355 KEY (序列号)
授权人: University of Science and Technology of China (CLASSROOM)
授权密钥:DTXRAnPn1P65Rt0xB4eTQ+4bF5IUF0gu0X9XBEUhM4QxY0DRFJxYEmgh4nyh7Rt
2019年10月,Mac系统更新为 10.15(macOS Catalina)后,Axure 8.1版本无法打开,于是只能升级为9.0,序列号如下:
License: macenjoy.co
Key: wXGD3sk+3LXkB9xfSBIXcGTJBkB02rkeFSOtN24B3sd12q2/KT1qiQ0tAr1dLFAJ
Charles是OSX系统下的一款测试抓包工具。
1、下载Charles
2、配置Charles HTTP 代理 (路径:设置>Proxy Setting 选择Tab Proxies)
配置端口号:8888,并勾选Enable transparent HTTP proxying
3、配置iPhone手机网络,设置HTTP代理
服务器:电脑IP
端口号:8888
4、配置iPhone 网络问题
问题描述:iOS7的http代理(http proxy)配置不生效问题
解决方法:将些wifi忽略, 重新连接, 再配置代理。
众所周知,Shadowsocks 是个好工具,下载 github.com/shadowsocks/shadowsocks-iOS/releases
提示“There was a problem signing in”,让你稍后再上,这种问题有时候可能是网络提供商的问题,如果你换了两个Wifi热点还不行,试着按以下方法解决:
1.首先确保你能够登录Google网站,如Google Drive, Gmail等都可以应用,如果这步不行,请先解决网络问题。
2.关闭和卸载所有防火墙。
3.如登录还有问题,请下载 Chrome Connectivity Diagnostics 插件(https://chrome.google.com/webstore/detail/chrome-connectivity-diagn/eemlkeanncmjljgehlbplemhmdmalhdc?utm_source=chrome-app-launcher-search),检查是否网络服务或端口被阻
4.如果确实网络端口问题,我这里的问题是443端口问题,分析后实际是Socks代理造成的问题,所以需要改换代理形势,将所有Socks代理改成http代理即可。
具体以Shadowssocks为例:
a) 先改系统网络设置:系统偏好-网络-高级-代理-选择网页代理和安全网页代理
b)打开Shadowssocks,复制Http代理地址和端口
c)将Shadowssocks参数,加入系统代理参数
Ref:blog.csdn.net/clayluo/article/details/60467056
迅雷这种东东在沦陷区活的很好,有自己的特定协议,所以要下载Youtube、Twitter 之类的视频还是要另寻方法。
Mydowndown.com ,是一个土生土长台湾人开发的工具,也支持油管、推特、Vimeo、Instagram等多个平台的片源下载。工具设计巧妙的地方是提供了浏览器的快捷脚本工具【MMD下载按钮】,当你需要下载当前页面的视频时,点击此按钮即可解析下载。
Downloadtwittervideo.com ,下载推特视频,用的较多的就是这个网站,拷贝原推地址粘贴后即可下载,支持格式包括MP3、MP4、MP4(HD)。
Qdownloader.net 是一个web在线下载视频工具,支持from YouTube, Instagram, Facebook, Twitter, and many other websites. 当需要转1080 HD的时候才会用到;
]]>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
23:00:20:83:de:02:95:f1:e3:34:be:57:3f:cf:2c:e7.
Please contact your system administrator.
Add correct host key in /home/usrname/.ssh/known_hosts to get rid of this message.
Offending key in /home/usrname/.ssh/known_hosts:8
RSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.
网上很多的解决方案是:
vi ~/.ssh/known_hosts
删除与想要连接的主机相关的行;或者直接删除known_hosts这个文件。 当然这个方案也是可行的,但并非解决问题的根本办法,因为继续使用,今后还会出现这样的情况,还得再删除。
下面简单讲一下这个问题的原理和比较长久的解决方案。
用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。
SSH对主机的 public_key
的检查等级是根据StrictHostKeyChecking变量来配置的。默认情况下, StrictHostKeyChecking=ask
。简单所下它的三种配置值:
1. StrictHostKeyChecking=no
#最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
2. StrictHostKeyChecking=ask
#默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
3. StrictHostKeyChecking=yes
#最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。
对于我来说,在内网的进行的一些测试,为了方便,选择最低的安全级别。在.ssh/config(或者/etc/ssh/ssh_config)中配置:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
注:这里为了简便,将knownhostfile设为/dev/null,就不保存在known_hosts中了
]]>