The Donkey(驴) and the Statue(雕像)

A donkey(驴) was pulling a cart(马车) with a religious(宗教的) statue(雕像) in it, and all the people bowed(鞠躬) in deep respect as the status(雕像) passed them.

The donkey(驴), who thought that they were showing their respect for him, became very proud and refused to take another step.

But the driver just hit him with his stick and said, “Stupid donkey(驴)! It is not you they respect, but the statue(雕像) you’re carrying.”

MORAL: Only fools(傻瓜) try to take the credit(赞扬) which others deserve(应得).

wordpress 文章中代码高亮显示(可视化插件)

文章原地址:https://blog.csdn.net/u014227785/article/details/80162509

1、安装插件 Pure highlightjs

下载地址:链接: https://pan.baidu.com/s/1bpD0reB 密码: 9tau
或:[download id=”3″]

2、进入 WordPress 后台管理页面,上传插件,上传刚才下载的 ZIP 文件,然后安装。或者解压安装包,上传到插件目录,/wp-content/plugins/。

3、启用插件 安装完毕后,在已经安装的插件里启用 “Pure Highlightjs”

4、选用主题

5、在写文章时,将程序代码插入代码输入框 即可。

6、效果图如下:

自定义Drawable,实现“原创”文本Table效果

1.自定义Drawable,绘制“原创”文本字符串

public class LabelDrawable extends Drawable {
    private String tag;
    private Paint paint;
    private String labelText;
    private float textSize;
    private float labelWidth;
    private float labelHeight;
    private float leftPadding;
    private float rightPadding;
    private float labelLeftRightPadding;
    private float labelTopBottomPadding;
    private float borderWidth;
    private float round;

    private float strokeWidth;

    public LabelDrawable(String tag, String labelText, float textSize) {
        this.tag = tag;
        this.labelText = labelText;
        this.textSize = textSize;
        this.paint = new Paint();
        this.paint.setColor(0xffff6f00);
        this.paint.setAntiAlias(true);

        this.paint.setTextSize(textSize);
        this.labelWidth = this.paint.measureText(labelText);
        this.labelHeight = this.paint.descent() - this.paint.ascent();

        this.strokeWidth = this.paint.getStrokeWidth();
    }

    public void setLeftPadding(float leftPadding) {
        this.leftPadding = leftPadding;
    }

    public void setRightPadding(float rightPadding) {
        this.rightPadding = rightPadding;
    }

    public void setLabelLeftRightPadding(float labelLeftRightPadding) {
        this.labelLeftRightPadding = labelLeftRightPadding;
    }

    public void setLabelTopBottomPadding(float labelTopBottomPadding) {
        this.labelTopBottomPadding = labelTopBottomPadding;
    }

    public void setBorderWidth(float borderWidth) {
        this.borderWidth = borderWidth;
    }

    public void setRound(float round) {
        this.round = round;
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        Rect bounds = getBounds();
        Log.w("zzh", tag + " bounds:" + bounds);

        Paint.FontMetrics fontMetrics = this.paint.getFontMetrics();

        float x = bounds.left + leftPadding + borderWidth + labelLeftRightPadding;
        float y = bounds.top + borderWidth + labelTopBottomPadding + Math.abs(fontMetrics.ascent);// - fontMetrics.descent;
        Log.w("zzh", tag + " x:" + x + " y:" + y);

        paint.setTextSize(textSize);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(this.strokeWidth);
        canvas.drawText(labelText, x, y, paint);

        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(borderWidth);

        RectF borderRect = new RectF();
        borderRect.left     = bounds.left + leftPadding;
        borderRect.top      = bounds.top + labelTopBottomPadding;
        borderRect.right    = bounds.right - rightPadding;
        borderRect.bottom   = bounds.bottom - labelTopBottomPadding;

        canvas.drawRoundRect(borderRect, round, round, paint);

        Log.w("zzh", tag + " bounds:" + borderRect);
    }

    @Override
    public void setAlpha(int alpha) {
        this.paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {

    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    // 固有的大小
    @Override
    public int getIntrinsicHeight() {
        return (int) (borderWidth + labelTopBottomPadding + labelHeight + labelTopBottomPadding + borderWidth);
    }

    @Override
    public int getIntrinsicWidth() {
        return (int) (leftPadding + borderWidth + labelLeftRightPadding
                + labelWidth +
                labelLeftRightPadding + borderWidth + rightPadding);
    }
}

2、调整Drawable和文本的对齐

public class CenterAlignImageSpan extends ImageSpan {

    public CenterAlignImageSpan(Drawable drawable) {
        super(drawable);
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,
                     @NonNull Paint paint) {
        Drawable b = getDrawable();
        Paint.FontMetricsInt fm = paint.getFontMetricsInt();
        int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;//计算y方向的位移
        canvas.save();
        canvas.translate(x, transY);//绘制图片位移一段距离
        b.draw(canvas);
        canvas.restore();
    }
}

3、写个帮助类,协调各类

public class LabelTextViewHelper{
    private TextView textView;
    private final float textSize;
    private final float leftPadding;
    private final float rightPadding;
    private final float borderWidth;
    private final float round;
    private final float labelLeftRightPadding;
    private final float labelTopBottomPadding;

    public LabelTextViewHelper(@NonNull TextView textView) {
        this.textView = textView;

        DisplayMetrics displayMetrics = textView.getResources().getDisplayMetrics();

        textSize        = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 13, displayMetrics);
        leftPadding     = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, displayMetrics);
        rightPadding    = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, displayMetrics);
        borderWidth     = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, displayMetrics);
        round           = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, displayMetrics);
        labelLeftRightPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 6, displayMetrics);
        labelTopBottomPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, displayMetrics);
    }

    public void setLabelAndText(@NonNull String label, @NonNull String text){
        SpannableString sp = new SpannableString(label + text);

        //获取一张图片
        LabelDrawable drawable = new LabelDrawable("TextView", label, textSize);
        drawable.setLeftPadding(leftPadding);
        drawable.setRightPadding(rightPadding);
        drawable.setLabelLeftRightPadding(labelLeftRightPadding);
        drawable.setLabelTopBottomPadding(labelTopBottomPadding);
        drawable.setBorderWidth(borderWidth);
        drawable.setRound(round);
        drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());

        //居中对齐imageSpan
        ImageSpan imageSpan = new CenterAlignImageSpan(drawable);
        sp.setSpan(imageSpan, 0, label.length(), ImageSpan.ALIGN_BASELINE);

        textView.setText(sp);
    }
}

4、实际使用

String labelText = "原创";

TextView textView = findViewById(R.id.main_txt);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
LabelTextViewHelper helper = new LabelTextViewHelper(textView);
helper.setLabelAndText(labelText, "10个高效的有氧减肥动作,快速瘦成一道闪电");

 

阿里云-云服务器问题总结

1、阿里云自带远程连接

在云服务器实例详情界面,点击“远程连接”,跳转到连接终端界面

第一次进入连接终端界面会显示连接密码,需要手动记录下来

使用连接密码连接服务器,连接后,首次登陆是需要输入用户名和密码

如果之前没有使用过密码情况下,需在实例详情界面,重置root密码,重置完密码后要重启服务器

在远程终端界面,第一次进入时,输入root和重置的密码

2、本地终端连接

使用ssh root@[ip]命令,连接服务器,并输入密码,密码和上面一样处理(重置和重启等操作)

不要忘了ssh root@[ip]命令中的root或其他用户

阿里云Linux主机搭建VPN服务器(Linux+ShadowSocks)

文章原地址:https://blog.csdn.net/wobushinix/article/details/79084144

环境:CentOS7.3 64位
1.确认Python已安装,如果未安装,参考2
python –version

2.安装Python
yum install python-setuptools && easy_install pip

3.安装shadowsocks
pip install shadowsocks

4.创建shadowsocks.json配置文件
vim /etc/shadowsocks.json

配置文件内容如下
{
"server":"0.0.0.0",
"server_port":443,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"lzzx123",
"timeout":300,
"method":"aes-256-cfb",
"fast_open":false,
"workers": 1
}

配置文件说明:
server:服务器 IP地址 (这里填0.0.0.0,而不是服务器的外网ip)
server_port:服务器监听的端口,建议443,避免被查封(同时注意登陆阿里云配置安全组规则,添加入方向的443端口,包括tcp,udp两个协议类型)
password:设置密码,自定义

如果需要配置多个账户,配置参考如下:
{
"server":"0.0.0.0",
"port_password":{
"端口号1":"密码1",
"端口号2":"密码2",
"端口号3":"密码3",
"端口号4":"密码4"
},
"timeout":300,
"method":"aes-256-cfb"
}

注:端口号放行要登陆阿里云,配置安全组策略,包括tcp,udp协议。

5.启动shadowsocks
ssserver -c /etc/shadowsocks.json -d start

注:通过netstat -lnp查看对应端口有没有在监听,如图

如果要关闭shadowsocks,命令如下
ssserver -d stop

6.测试
Android手机可安装软件shadowsocks测试
链接: https://pan.baidu.com/s/1bppWO4B 密码: w56j
或:[download id=”2″]

安装后,简单配置服务器ip,远程端口,密码即可,完成后点击右上方的悬浮纸飞机应用。

三方登录几个概念的理解

1)外部标识
用来使用用户身份的标志,可以是用户名,手机号,邮箱等,每一个外部标识一定和一个内部标识相关联用以确定一个用户。
需要注意的是,外部标识可能改变,例如小明12年用的是手机号A,17年用的是手机号B,在APP内更改了登录的手机号,就完成了外部标识的改变。
所以,外部标识的作用有两个
1. 让用户通过自己熟知且占有的外部标识来登录产品
2. 可以通过校验外部标识来实现找回或转移数据资产(用户注册帐号后使用产品过程中产生的所有数据,例如在微信,数据资产是你的好友,历史聊天记录,所发的朋友圈;而在游戏中是你的游戏角色,拥有的装备,好友等)

2)内部标识
即产品中用于标识用户唯一性的标志,例如user_id,必须有,不可更改且唯一,用户一般接触不到内部标识。
当一个内部标识建立后,用户所有的数据资产都会绑定到这个内部标识上。

3)user_id
一个常用的内部标识,类似你的18位身份证ID

4)app_id
用于区别不同APP的ID,具有唯一性。

5)open_id
第三方平台为了用户信息的安全,一般不会直接将用户的内部标识给到其他产品,而是选择了给一个外部标识,这个open_id就是微信给各个APP用以区分微信用户身份的外部标识
需要注意的是,即使是同一个用户,微信给不同的APP的open_id也是不同的,这会导致一个问题。
例如我有两款产品,一款美团,一款美团外卖。
对微信而言,这是两个app_id,所以当用户授权美团使用微信信息后,微信给的是open_id_1,用户再来到美团外卖公众号,这时候还要再授权一次,微信给的是open_id_2。
但实际上在美团的帐号体系中,这都是同一个用户,却绑定了两个open_id,可能导致用户注册了两个帐号,数据不会互通,这显然是有问题的。
如何解决?往下看

6)union_id
为了解决上面的问题,union_id诞生了。
不同的产品的可以使用同一个union_id来确认用户的身份。
对于使用同一套用户数据的不同产品,可以向微信申请union_id,当A产品获得了用户授权后,拿到该用户的union_id,这时候再使用B产品再进行授权后,发现这是同一个union_id,直接登录之前的帐户,避免了同个微信用户注册了两个帐号数据不同步的问题。

7)access_token
可以理解为通行证,有了这个通行证,就能获取到第三方平台指定用户的有限信息。