Rails log过滤

由于采用了active storage log的东西太多,收集一些log 过滤方法

1, 过滤http请求参数

initializers/filter_parameter_logging.rb

Rails.application.config.filter_parameters += [
    :password,
    # Filter ActiveStorage blob keys so that the logs aren't full of as much stuff.
    :encoded_key,
    :signed_blob_id,
    :variation_key
]

或者在environments/ 的环境配置文件里设置

2, 针对controller过滤
由于我采用了lograge ,这里针对lograge说明

config/initializers/lograge.rb

  Rails.application.configure do
      config.lograge.enabled = true
      config.lograge.base_controller_class = 'ActionController::Base'
      config.lograge.ignore_actions = [
          'ActiveStorage::DiskController#show',
          'ActiveStorage::RepresentationsController#show',
          'ActiveStorage::BlobsController#show'
      ]
  end

3, overwrite LogSubscriber

前面两种针对了http params和controller过滤,但是ActiveStorage::LogSubscriber
在debug信息里面还有ActiveStorage::Variant的log信息,判断Variant文件是否存在,需不需要生成。
由于我上传的文件名都是经过hash的一大串字符,实在干扰查看log,这里重写过滤了。

Read More

如何避免社交网络禁止外国号码使用外国手机号码注册

最近,经常出现页面阻止和社交网络帐户注册到外国号码的情况。让我们看看如何避免这种情况。

首先,最受欢迎的网站可以通过 IP地址读取您的位置。您所在国家/地区与注册号码国家的分歧可能会导致网站更加怀疑并进一步阻止。在这种情况下,解决方案可能是使用 VPN 和 PROXY,这样就不会与您的位置编号发生冲突。当然,付费 VPN 和 PROXY 会更有效率,但如果您没有能力或欲购买它们,那么您可以使用免费版本的选项。

其次,所有浏览器都存储用于存储设置的 cookie。因此,这些文件可以被一个站点读取,该站点将了解您之前从另一个区域访问过此站点,这也会对使用外来号码产生不利影响。因此,建议使用干净的浏览器进行注册(在浏览器设置中,清除 cookie)或在浏览器中进行隐身模式。它也可能适合浏览器 Top。

第三, 在注册期间使用正确的名称。正确的名称表示名称的拼写语言及其语法正确性。例如,要将页面注册到中文编号,最好使用中文名称。由于我们大多数人不知道它,您可以使用生成名称的服务。

第四,填写页面上的联系信息。最好立即放置一个头像并填写一些信息,以最大限度地提高自己的怀疑。也不建议立即从页面进行活动操作,例如,主动发布消息,进入大量组,垃圾邮件。有时在注册账户后,有必要给“在床上休息”留出时间 - 连续几天不进入。

这就是全部,我们希望这个小清单可以帮助您避免阻止您创建的页面!

Read More

text classification performance in NLP with deep learning

摘自:https://github.com/brightmart/text_classification

Performance

(mulit-label label prediction task,ask to prediction top5, 3 million training data,full score:0.5)

Model fastText TextCNN TextRNN RCNN HierAtteNet Seq2seqAttn EntityNet DynamicMemory Transformer
Score 0.362 0.405 0.358 0.395 0.398 0.322 0.400 0.392 0.322
Training 10m 2h 10h 2h 2h 3h 3h 5h 7h
————————————————————————————————–

Bert model achieves 0.368 after first 9 epoch from validation set.

Ensemble of TextCNN,EntityNet,DynamicMemory: 0.411

Ensemble EntityNet,DynamicMemory: 0.403

Read More

文本相似度计算方法进行实验与比较

转自:https://github.com/cjymz886/sentence-similarity

sentence-similarity

对四种句子/文本相似度计算方法进行实验与比较;

四种方法为:cosine,cosine+idf,bm25,jaccard;

本实验仍然利用之前抓取的医疗语料库;

1 环境

python3

gensim

jieba

scipy

numpy

2 算法原理

image

image

image

image

3 运行步骤

setp1:先利用word2vec对./data/file_corpus进行词向量训练(python train_word2vec.py),生成voc.txt词向量文件

setp2:对训练出来的词,计算其在语料库中idf词(python compute_idf.py),生成idf.txt文件

setp3:统计语料库中存在的句子(python get_sentence.py),生成file_sentece.txt文件;考虑计算量问题,本实验只取了出现频率最高的前10000个句子

setp4:运行python test.py,可对设定好的5个句子,按照不同的算法得出最相似的结果

备注说明:./data/medfw.txt文件是我上个项目find-Chinese-medcial-words在同样语料库找出的词文件,本次作为用户词库参与jieba分词;similarity.py文件为四种算法实现的程序,可以调用,不同的环境下只需重新训练词向量和词的idf矩阵;./data/test_result.txt文件是本实验测试结果。

Read More

中文分词器分词效果评估对比

转自:https://github.com/ysc/cws_evaluation

使用说明:

如何建立开发环境?

如果是使用Netbeans、IDEA,则直接打开项目
如果是使用Eclipse、MyEclipse,则要执行导入操作
推荐使用IDEA

评估采用的测试文本位于data目录下,253 3709行,共2837 4490个字符

test-test.txt为未分词的文件,一行一个句子或短语,格式如下:

   迈向充满希望的新世纪
   一九九八年新年讲话
   附图片1张
   中共中央总书记
   国家主席江泽民
   一九九七年十二月三十一日
   12月31日
   总书记
   国家主席江泽民发表1998年新年讲话
   新华社记者兰红光摄

standard-text.txt为人工分好词的文件,用于判断参与评估的分词器的分词结果是否正确,词和词之间以空格分隔,格式如下:

   迈向 充满 希望 的 新 世纪
   一九九八年 新年 讲话
   附 图片 1 张
   中共中央 总书记
   国家 主席 江泽民
   一九九七年 十二月 三十一日
   12月 31日
   总书记
   国家 主席 江泽民 发表 1998年 新年 讲话
   新华社 记者 兰红光 摄

speed-test-text.txt用于纯粹的速度对比

Read More

中文分词算法的实现,包括最大向前匹配、最大向后匹配,最大双向匹配,ngram,HMM,及其性能对比

转自:https://github.com/liuhuanyong/WordSegment

1、MaxMatch:
dict.txt: 分词用词典位置
max_forward_cut:正向最大匹配分词
max_backward_cut:逆向最大匹配分词
max_biward_cut:双向最大匹配分词
result:
输入:我们在野生动物园玩
输出:
forward_cutlist: [‘我们’, ‘在野’, ‘生动’, ‘物’, ‘园’, ‘玩’]
backward_cutlist: [‘我们’, ‘在’, ‘野生’, ‘动物园’, ‘玩’]
biward_seglit: [‘我们’, ‘在’, ‘野生’, ‘动物园’, ‘玩’]

2、HMM:
hmm_train.py:基于人民日报语料29W句子,训练初始状态概率,发射概率,转移概率
data:训练语料,放在 ./data/train.txt
model: 保存训练的概率模型,训练完成后可直接调用
trans_path = ‘./model/prob_trans.model’
emit_path = ‘./model/prob_emit.model’
start_path = ‘./model/prob_start.model’

hmm_cut.py:基于训练得到的model,结合viterbi算法进行分词
输入:我们在野生动物园玩
输出:[‘我们’, ‘在’, ‘野’, ‘生动’, ‘物园’, ‘玩’]

3、N-gram
train_ngram.py:基于人民日报语料29W句子,训练词语出现概率,2-gram条件概率
data: 训练语料,放在 ./data/train.txt
model: 保存概率模型,训练完成后可直接调用
word_path = ‘./model/word_dict.model’ (词语出现概率)
trans_path = ‘./model/trans_dict.model’(2-gram条件概率)
max_ngram.py: 最大化概率2-gram分词算法
biward_ngram.py: 基于ngram的前向后向最大匹配算法

4、算法比较
1、评测语料:微软评测语料,共3985个句子
2、性能比较

Algorithm Precision Recall F1-score Cost-Time
HMM 0.65 0.75 0.70 4.87
MaxForward 0.76 0.87 0.81 244.14
MaxBackward 0.76 0.87 0.81 280.61
MaxBiWard 0.76 0.87 0.81 443.23
MaxProbNgram 0.76 0.87 0.81 8.99
MaxBiwardNgram 0.74 0.86 0.80 3.96

Read More

严格编码 - HTML 第一篇

DOCTYPE

时过境迁,我们已无需在复制粘贴冗长的DOCTYPE代码,我们可以直接使用HTML5的文档类型<!DOCTYPE html>而无需担心兼容性问题,但在此之前的版本XHTML标准仍有参考意义。

  1. XHTML 元素必须被正确地嵌套。
  2. XHTML 元素必须被关闭。
  3. 标签名必须用小写字母。
  4. XHTML 文档必须拥有根元素。

在此我针对以上几点补充说明:

  1. 其实无论哪种版本对于开发者而言都应该做到正确的嵌套元素。为了节省篇幅我将使用ZenCode语法作示例。
    正确的嵌套如下:

    html>head+body
    ul>li>a

  2. 此时所说的元素必须被关闭包括成对标签如<p></p>或者单独标签<hr/><br/>,单独标签在HTML5文档类型中不应被关闭。

  3. 实际上浏览器会无视html的大小写,但我们也没必要多按住 Shift 或者 Capslock

  4. 即使你没有写DOCTYPE、html、body 浏览器也会在外面包裹上,但为什么不写html元素呢?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta charset="UTF-8" /> 如何选择?

你可以放心的使用<meta charset="UTF-8" />在所有的浏览器。参见:Obsolete practices to avoid 另外需要强调meta charset设置请放置在<head>之后使之成为第一个meta声明,依照W3C规范

“ META declarations should appear as early as possible in the HEAD element”。

X-UA-Compatible

建议如此设置<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />,IE=edge告诉IE使用最新的引擎渲染网页,chrome=1则可以激活Chrome Frame(使安装了Chrome Frame的IE浏览器和某些极速浏览器使用WebKit 引擎处理网页,另外也支持IE所没有的HTML5等其他open web技术。)。

Read More

从WordPress迁移到hexo

从WordPress迁移到hexo,为什么呢?因为我发现自己业余项目购置的两台阿里云主机,可申请的发票面额超过了1万,上面一共运行了两个网站一个Wordpress,都是基于兴趣而创建的,然而在长期的充值下,花费已经超出了预期,首先考虑把博客迁移出去,因为作为日志来说显得过于笨重,需要维护PHP,MySQL虽说上面有几个自定义的Page还有一个PHP在线小工具,但就这样吧,谁会记得呢?后面再考虑关闭一个目前只有演示作用的网址,直接减少一台云主机的费用。

下面记录迁移过程:

hexo init mine-blog

npm install hexo-migrator-wordpress --save

hexo migrate wordpress suntory.wordpress.2018-08-15.xml 

hexo server

hexo migrate wordpress 没有处理文章中的图片,我把生成的source目录删除了,寻找别的方法,这里作下记录。

尝试启动server时报错:

Package hexo-renderer-sass is not installed.

安装依赖:

npm i hexo-renderer-sass --save

安装过程中报错

fatal error: 'sass/context.h' file not found

Read More

gulp + browser-sync + django 实现livereload开发

Prerequisites

nodejs ruby

node package dev Dependencies

    "devDependencies": {
        "bower": "^1.8.0",
        "browser-sync": "^2.18.8",
        "gulp": "^3.9.1",
        "gulp-copy": "^1.0.0",
        "gulp-cssmin": "^0.1.7",
        "gulp-group-files": "^2.0.0",
        "gulp-ignore": "^2.0.2",
        "gulp-rename": "^1.2.2",
        "gulp-ruby-sass": "^2.1.1",
        "gulp-sourcemaps": "^2.6.0",
        "gulp-uglify": "^2.1.2",
        "iniparser": "^1.0.5",
        "main-bower-files": "^2.13.1",
        "ncp": "^2.0.0",
        "pdf.js": "bung87/pdf.js#master"
      }

pdf.js 只为演示build项目依赖包,下面说明gulpfile.js

    var gulp = require('gulp');
    // var sass = require('gulp-sass');
    var sass = require('gulp-ruby-sass');
    var group = require('gulp-group-files');

    var bower = require('main-bower-files');
    var sourcemaps = require('gulp-sourcemaps');
    var browserSync = require('browser-sync').create();
    var fs = require('fs');

此处注释gulp-sass而采用gulp-ruby-sass是因为gulp-sass依赖node-sass而node-sass依赖node-gyp,鉴于我有很多次node-gyp安装失败的经历而且本身sass最初的compiler就是ruby实现的我就采用了更为稳妥的做法。 precompile sass files

    var sassFiles = {
        "style" : {
            src: "./static/scss/style.scss",
            dest: "./build/css"
        }
    };

    gulp.task('sass:compile',function (){
        return group(sassFiles,function (key,fileset){
        //  group(sassFiles,function (key,fileset){
            // return gulp.src(fileset.src)
            //     .pipe(sass().on('error', sass.logError))
            console.log(fileset.src)
                return sass(fileset.src)
                .pipe(sourcemaps.init())
                .pipe(sourcemaps.write('maps', {
                    includeContent: true,
                    sourceRoot: 'source'
                }))
                .on('error', sass.logError)
                .pipe(gulp.dest(fileset.dest)).pipe(browserSync.stream());
        })();
    });

pipe到browserSync.stream()是实现precompile后浏览器自动刷新的关键,下面不再赘述。 copy前端ui框架的字体到build目录

    gulp.task('copy',function (){
        var dest = './build/fonts';
        if (!fs.existsSync(dest)) {
        var sassFiles = {
        "fonts" : {
                src: ['bower_components/foundation-icons/foundation_icons_general/fonts/*' ],
                dest: "./build/fonts"
            }
        };
        return group(sassFiles,function (key,fileset){
            return gulp.src(fileset.src)
                .pipe(gulp.dest(fileset.dest)).pipe(browserSync.stream());
        })();
        }
    });

Read More

面向前端开发人员的rails教程

目录结构及模版语法及其他文档

rails目录结构: https://ruby-china.org/topics/2432

rails 模板语法 :https://ihower.tw/rails4/actionview.html 可能需要VPN访问

Rails 布局和视图渲染 :http://guides.ruby-china.org/layouts_and_rendering.html

scss 语法: http://sass.bootcss.com/

jquery ujs: https://github.com/rails/jquery-ujs

git:https://git-scm.com/book/zh/v2

布局及模版继承

app/views/layouts/sample_layout.html.erb

一个通常的布局文件会包含以下block.

Read More