【置顶】囚生CYのPOST(NEW VERSION)

2020.12.15

START or END? You start from the end of mine.

本文停更。四方之广,唯三分地中可寻自在。

JAVA百度AI接口调用示例(植物识别)

1. HTTP请求服务类:主要用于发起请求与响应处理:

package com.sufe.service;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * http 工具类
 */
public class HttpUtil {

    public static String post(String requestUrl, String accessToken, String params)
            throws Exception {
        String contentType = "application/x-www-form-urlencoded";
        return HttpUtil.post(requestUrl, accessToken, contentType, params);
    }

    public static String post(String requestUrl, String accessToken, String contentType, String params)
            throws Exception {
        String encoding = "UTF-8";
        if (requestUrl.contains("nlp")) {
            encoding = "GBK";
        }
        return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
    }

    public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
            throws Exception {
        String url = requestUrl + "?access_token=" + accessToken;
        return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
    }

    public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
            throws Exception {
        URL url = new URL(generalUrl);
        // 打开和URL之间的连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        // 设置通用的请求属性
        connection.setRequestProperty("Content-Type", contentType);
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoInput(true);

        // 得到请求的输出流对象
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.write(params.getBytes(encoding));
        out.flush();
        out.close();

        // 建立实际的连接
        connection.connect();
        // 获取所有响应头字段
        Map<String, List<String>> headers = connection.getHeaderFields();
        // 遍历所有的响应头字段
        for (String key : headers.keySet()) {
            System.err.println(key + "--->" + headers.get(key));
        }
        // 定义 BufferedReader输入流来读取URL的响应
        BufferedReader in = null;
        in = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), encoding));
        String result = "";
        String getLine;
        while ((getLine = in.readLine()) != null) {
            result += getLine;
        }
        in.close();
        System.err.println("result:" + result);
        return result;
    }
}

 2. FileUtil:文件工具类,用于读取图片文件

package com.sufe.service;

import java.io.*;

/**
 * 文件读取工具类
 */
public class FileUtil {

    /**
     * 读取文件内容,作为字符串返回
     */
    public static String readFileAsString(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException(filePath);
        } 

        if (file.length() > 1024 * 1024 * 1024) {
            throw new IOException("File is too large");
        } 

        StringBuilder sb = new StringBuilder((int) (file.length()));
        // 创建字节输入流  
        FileInputStream fis = new FileInputStream(filePath);  
        // 创建一个长度为10240的Buffer
        byte[] bbuf = new byte[10240];  
        // 用于保存实际读取的字节数  
        int hasRead = 0;  
        while ( (hasRead = fis.read(bbuf)) > 0 ) {  
            sb.append(new String(bbuf, 0, hasRead));  
        }  
        fis.close();  
        return sb.toString();
    }

    /**
     * 根据文件路径读取byte[] 数组
     */
    public static byte[] readFileByBytes(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException(filePath);
        } else {
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
            BufferedInputStream in = null;

            try {
                in = new BufferedInputStream(new FileInputStream(file));
                short bufSize = 1024;
                byte[] buffer = new byte[bufSize];
                int len1;
                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
                    bos.write(buffer, 0, len1);
                }

                byte[] var7 = bos.toByteArray();
                return var7;
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException var14) {
                    var14.printStackTrace();
                }

                bos.close();
            }
        }
    }
}

 3. Base64Util:base6编码类,用于图片编码

package com.sufe.service;

/**
 * Base64 工具类
 */
public class Base64Util {
    private static final char last2byte = (char) Integer.parseInt("00000011", 2);
    private static final char last4byte = (char) Integer.parseInt("00001111", 2);
    private static final char last6byte = (char) Integer.parseInt("00111111", 2);
    private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
    private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
    private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
    private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};

    public Base64Util() {
    }

    public static String encode(byte[] from) {
        StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
        int num = 0;
        char currentByte = 0;

        int i;
        for (i = 0; i < from.length; ++i) {
            for (num %= 8; num < 8; num += 6) {
                switch (num) {
                    case 0:
                        currentByte = (char) (from[i] & lead6byte);
                        currentByte = (char) (currentByte >>> 2);
                    case 1:
                    case 3:
                    case 5:
                    default:
                        break;
                    case 2:
                        currentByte = (char) (from[i] & last6byte);
                        break;
                    case 4:
                        currentByte = (char) (from[i] & last4byte);
                        currentByte = (char) (currentByte << 2);
                        if (i + 1 < from.length) {
                            currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
                        }
                        break;
                    case 6:
                        currentByte = (char) (from[i] & last2byte);
                        currentByte = (char) (currentByte << 4);
                        if (i + 1 < from.length) {
                            currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
                        }
                }

                to.append(encodeTable[currentByte]);
            }
        }

        if (to.length() % 4 != 0) {
            for (i = 4 - to.length() % 4; i > 0; --i) {
                to.append("=");
            }
        }

        return to.toString();
    }
}

 4. 获取认证TOKEN的服务:

package com.sufe.service;

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * 获取token类
 */
public class AuthService {

    /**
     * 获取权限token
     * @return 返回示例:
     * {
     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
     * "expires_in": 2592000
     * }
     */
    public static String getAuth() {
        // 官网获取的 API Key 更新为你注册的
        String clientId = "";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "";
        return getAuth(clientId, clientSecret);
    }

    /**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
     * @param ak - 百度云官网获取的 API Key
     * @param sk - 百度云官网获取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) {
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = new JSONObject();
            jsonObject = JSONObject.parseObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }

}

5. 调取API的类

package com.sufe.service;

import com.sufe.service.Base64Util;
import com.sufe.service.FileUtil;
import com.sufe.service.HttpUtil;

import java.net.URLEncoder;

/**
* 植物识别
*/
public class OCRService {

    /**
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */
    public static String plant(String filePath, String accessToken) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant";
        try {
            // 本地文件路径
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}


2020.12.14

用于监测系统接口连接情况的脚本。

使用netstat -ano 可以查看详细的接口连接情况:

【置顶】囚生CYのPOST(NEW VERSION)

os.system无法返回cmd命令的输出结果,我们可以通过使用os.popen("netstat -ano").read()来获取cmd命令的输出结果;

事实上os.popen并非专门用于返回cmd命令的返回结果。与普通的open类似,popen带有参数mode='r',默认是只读,可以改为'w'即表示开辟一个管道文件进行指令输入,允许写入指令后运行。

合理使用grep管道符可以获取需要监测的端口连接情况,因为netstat -ano返回的信息是非常多的,如果频繁记录会产生非常大的日志文件。

每个ESTABLISHED的端口必然会对应一个进程PID,如果需要切断端口连接,可以直接taskkill /pid <pid值>,pid值在netstat -ano输出的最后一列。

一般重点监测22与21端口的连接情况,分别对应sftp与ftp,开启ftp或sftp服务前必须制定严格的防火墙入栈规则,否则目前的网络环境不设防的主机很容易遭到攻击。

参考脚本如下:

# -*- coding: UTF-8 -*-

import os
import time

INTERVAL = 60

states = ['"ESTABLISHED"', '"CLOSE_WAIT"']								 # 需要记录的states
cmd1 = 'netstat -ano | find {}'.format									 # 列出当前所有连接情况
cmd2 = 'taskkill /pid {}'.format										 # 杀死进程(by pid)
cmd3 = 'tasklist /fi "pid eq {}"'.format								 # 查询指定pid的task详细信息

logname = 'log/established.log'
logheader = '{}\t{}\t{}\t{}\t{}\t{}\n'.format('protocol', 'localhost', 'remotehost', 'state', 'pid', 'timestamp')

try:																	 # 判断log文件是否存在
	with open(logname, "r") as f:
		pass

except:																	 # 不存在则新建一个log文件
	with open(logname, "w") as f:
		f.write(logheader)


def is_valid(protocol, localhost, remotehost, state, pid):				 # 根据连接情况判断该连接是否合法
	""" NOT IMPLEMENTED
	目前不知道怎么写逻辑, 所以默认都是合理的, 需要通过观察规律才能发现非法侵入;
	目前感觉应该ESTABLISHED里的remotehost端口不是443的可能是比较少见的,
	另外localhost的21和22端口正常情况下应该是不会被占用的, 否则肯定是出问题了;
	"""
	
	return True															 # 返回值为True

while True:

	for state in states:
		reslist = os.popen(cmd1(state)).read().splitlines()
		timestamp = int(time.time())
		for res in reslist:												 # 遍历每个连接行记录
			splits = res.split()							
			if len(splits)==5:											 # 只考虑有五个元素的行记录
				protocol, localhost, remotehost, state, pid = splits
				if is_valid(*splits):									 # 判断是否合法: 目前默认都合法
					pass
				else:													 # 不合法就杀死进程
					print("杀死进程: {}".format(pid))
					print("  - 进程相关信息: \n")
					print("#"*64)
					print(os.popen(cmd1(pid)).read())
					print("#"*64)
					os.system(cmd2(pid))
				with open(logname, "a") as f:							 # 记录
					f.write('{}\t{}\t{}\t{}\t{}\t{}\n'.format(protocol, localhost, remotehost, state, pid, timestamp))
	time.sleep(INTERVAL)

PS:

右膝这次伤得有点厉害,可能很长时间跑不了了。


2020.12.13

完蛋,右膝肿了,照例又给老妈臭骂了一通。

晚上霾还是有点重,但是准备好了是要上场的。

状态其实特别好,5km用时不到23'30'',且体力明显充沛,但是感觉右大腿隐隐作痛快要抽筋了;

以为是右腿压得太厉害,于是刻意把重心压到左边,但还是疼。

15圈结束感觉右膝盖开始抽筋,不得已只好停下,发现膝盖红肿,楼梯都走不动了。

最后是28'15''跑了15圈,一点力竭感都没有,本来极有可能把10km刷新到46分半以内的,太遗憾了。

搞了个护膝,可惜不知道几天才能恢复得过来。总之冬天千万别光着膝盖跑,真的是太伤了。

最近一个月不是在受伤,就是跑在即将受伤的路上,从右腿到左脚到右脚再到右膝,OMG。


2020.12.12

右膝确实伤了,一方面可能穿短裤跑没有护膝给冻坏了,另一方面连续3天的高强度速耐给整废了,休息一天,右脚也开始出现两个小泡,还好不是血泡。最近霾太重,晚上又跑了一次上下六楼加两个30米过道共计10次,耗时16'44'',平均1次上下楼加过道来回刚刚好100秒,爬楼太累了。

太冷了,之前一直都只在短袖外面套了一件卫衣,今天实在是顶不住了,不知道接下来还能否短袖短裤上场跑了。。。早八晚十,学点东西,困。

某人给我刷到10000访问量咋还在刷呢?我在后台是可以看到最频繁访问的几个IP地址的,是谁我大致能猜得到,有空可以帮我刷刷其他几篇还没到10000的,还有您这个刷法太慢了,建议参考一下https://caoyang.blog.csdn.net/article/details/110791414最后一节内容,我看着都嫌累。

PS:

S换了个头像,我翻列表时没找到以为自己终于是被删了..

列一点note,充实一下内容;

torch.Tensor 与 torch.tensor

  1. 实例对比:
  • Example1: 接收整型参数;
    print(torch.Tensor(5))
    print(torch.tensor(5))
    
    • 输出结果: 前者生成以参数值为维度的随机向量(随机值非常小), 后者生成一个tensor标量;
    tensor([1.0561e-38, 1.0653e-38, 1.0469e-38, 9.5510e-39, 8.7245e-39])
    tensor(5)
    
  • Example2: 接收列表型或元组型参数;
    print(torch.Tensor([1, 2, 3, 4, 5]))
    print(torch.tensor([1, 2, 3, 4, 5]))
    print(torch.Tensor((3, 4)))
    print(torch.tensor((3, 4)))
    
    • 输出结果: 两者输出结果基本类似, 前者会默认将数值类型从整型转为浮点型, 后者则会保持输入时的数值类型(整型), 且列表和元组本质上没有区别;
    tensor([1., 2., 3., 4., 5.])
    tensor([1, 2, 3, 4, 5])
    tensor([3., 4.])
    tensor([3, 4])
    
  • Example3: 接收多个整型参数;
    print(torch.Tensor(3, 4))
    #print(torch.tensor(3, 4))
    
    • 输出结果: 前者生成以多个整型参数为shape的随机张量(随机值非常小), 后者会报错, 因为后者只支持接收一个参数;
    tensor([[9.9184e-39, 9.0000e-39, 1.0561e-38, 1.0653e-38],
        [4.1327e-39, 8.9082e-39, 9.8265e-39, 9.4592e-39],
        [1.0561e-38, 1.0653e-38, 1.0469e-38, 9.5510e-39]])
    Traceback (most recent call last):
    ...
    TypeError: tensor() takes 1 positional argument but 2 were given
    
  • Example4: 接收numpy.ndarray类型的参数;
    print(torch.Tensor(numpy.array([[1, 2, 3], [4, 5, 6]])))
    print(torch.tensor(numpy.array([[1., 2., 3.], [4., 5., 6.]])))
    print(torch.tensor(numpy.array([[1, 2, 3], [4, 5, 6]])))    
    
    • 输出结果: 两者都将numpy.ndarray数组转为torch.Tensor, 前者默认转为浮点型数值, 后者保持原有数据类型;
    tensor([[1., 2., 3.],
            [4., 5., 6.]])
    tensor([[1., 2., 3.],
            [4., 5., 6.]], dtype=torch.float64)
    tensor([[1, 2, 3],
            [4, 5, 6]], dtype=torch.int32)
    
  • Example5: 接收torch.Size类型的参数:
    print(torch.Tensor(torch.Tensor([[1, 2, 3], [4, 5, 6]]).shape))
    print(torch.tensor(torch.Tensor([[1, 2, 3], [4, 5, 6]]).shape))
    
    • 输出结果: 前者会生成以torch.Size类型参数为形状的零张量, 后者则会将参数直接转为torch.Tensor;
    tensor([[0., 0., 0.],
            [0., 0., 0.]])
    tensor([2, 3])
    

 

 


2020.12.11

今天分享个考到的知识点:

双花(double spend)又称为双重支付,是比特币中一个重要的安全问题,虚拟货币高飞币(Goofycoin)中必然存在这种隐患,所以没有能够称为交易货币,由他改进的财奴币通过全量记账,防止了这种双花的现象。比特币中处理双花一般是通过共识链,总之被越多的人共识,则双重支付的概率就越低,新开出的短链追上长链的概率就越低。其实我感觉从计算上确实区块链是安全的,如果当真量子计算革新了算力,几乎生活中的一切都是漏洞,任何人都无所遁形,无法置身事外了,本质上计算机概念中的安全就是“概率极低”,但是无论概率多么小,总是有可能被突破的。。。

-----------我是快乐的分割线------------

欲速则不达。

连续两天满状态发挥,顺应规律今天应该好好休整,跑个10圈或者5圈间歇两组,但是总觉得应该乘势而起,顺势破了10km,遂好好地午睡,养了一波状态。

晚上翘了第三节课出来,信心满满要跑10km。发现霾有点重,不太适合跑,但是已经翘了也只能硬着头皮上了。前五圈被人撞了两次,硬撑着4'40''以内的速度,感觉呼吸已经不是很畅。

第7圈右膝骤疼,勉强缓了一下,不敢再提速;13圈半右膝又发作,这次确定是抽筋,猛得一顿,当时就想中途退出了,虽然很不甘,然而已经疲累不堪,呼吸,腿,体能都乱了,只得竭力冲刺掉第15圈,最终4'38''的配速跑了6.03km,将将28分钟。

罢了,休整一天,明天重振旗鼓,卷土重来。

PS:

很好奇,本以为只有yy知道我的blog地址,现在怎么搞得是个人都知道我在写blog了。

有趣的是最近一周有个好事者在给我这篇blog刷访问量,我是无所谓,但是这也太诡异了。

删了也觉得可惜,今年结束本篇封存,得新开个僻静的地方圈(hua)地(di)自(wei)萌(lao)了。


2020.12.10

菜得真实,一到考试就拉胯。

梅开二度,晚上跑出6km个人最好成绩26'38'',平均配速4'25'',难以置信地持平了之前五圈间歇跑的配速。在昨天刚破27'39''的情况下,连续两日刷新记录。

这次是真的觉得短时间跑不过了,受昨天影响,起手4'39'',10圈结束均速4'32'',体力保持得还行。

5km用时22'30'',最后1000米跑进4'08'',力竭崩溃,停下后已经喘不过气,但是很舒爽。

下一个目标是4'10''的配速过10圈。我觉得自己的能力可能就算是全速,也难以跑进4'00''/km,菜鸟真的是有上限的...

PS:

昨天上场就看到一圈挂着着“考试诚信,拒绝作弊”,“帮别人锻炼,合适吗?”心想这横幅咋拉到田径场上来了;

本以为是这几年常见的本科生间代人刷锻的“黑色产业链”,然后今天就看到有体测替考被取消学位的新闻。

恍然大悟,现在大学是00后的天下了,新一代人还是会玩哪。


2020.12.09

破而后立!左右脚伤都未完全愈合的情况下,大破15圈6km的记录!26'53''(平均配速4'28'',之前10圈的最好成绩17'55''均速只有4'29'',可能占了无风的天时),刷新了自以为是短时间内不可能打破的6km记录(27'39'')。

起步200米均速4'48''/km,一圈后提到4'45'',5圈结束9'27'',配速已经提到了4'40''以内。

第七圈出现了一个关键人物!一位兄弟开始跟住我,我本来也没有在意,以前也经常有人会跟住我,不过大都两圈不到就没影了,结果这位兄弟一直跟到我直到11圈结束,此时平均配速已经提到了4'34'',然而我感觉十分轻松。

12圈开始时我转头,激动地大声问,

——“兄弟,几圈了?”

——“12圈了”

——“这么巧,我也12圈了。今天多亏你跟着我,我跑得比之前快多了!”

他似乎会错意了,以为影响了我的节奏,说:“我也是觉得跟着你会跑得比较快,我拉开点吧。”

然后他就没影了,这时候另一个兄弟似乎听到了我们地对话,开始跟我竞速,短短两圈我们相互超了对方三四次。14圈结束我的平均配速已经过了4'30''。

如果不是那种幼稚的意气,把速度稳在4'35'',我觉得至少能坚持到20圈,甚至极有可能大破10km的记录,到46'00''内也说不定。

但是浪了,今天的状态就是神挡杀神,谁敢超我,肯定把场子找回来。于是最后一圈全力冲刺,将6km跑进27分钟,关键是脚一点都没疼,血赚!

PS:

大好天气,拼命的好季节。

要是能有个水平差不多,或者稍高一点的人跟着我一起跑,可能真的会提升地很快,今天我确实是感觉到有人跟着跑完全不一样了。


2020.12.08

这下好了,左脚快消泡了,右脚又开始犯病了。今天才发现昨晚跑步穿的鞋右脚鞋垫磨穿了个洞,我说怎么感觉像是有沙石进去了,右脚底疼得不行,好在没弄出血泡,只是擦伤。查了一下其他几双都只是轻微磨损。

熬掉最后一个月,回家换装备,计划路跑,现在这个水平极限能环镇跑两圈(以前在家都是散步一圈,六七公里差不多一个小时),寒假争取破20km,之后有机会报个半马试试水。

今日休整,随性慢跑,两个脚都不敢用力。最近忙里偷闲在写一个很有趣的东西,估计会拖很长时间,灵感源于上次看了一局半个橙子军争牌堆(带木马)四血界孙权单挑四血主公新王异的视频,我之前听说四血标孙权单挑四血新王异是五五开的对局。本以为界权优势会特别大,但是发现界权仍然非常被动。但是王异出+1和藤甲之后橙子说王异仍然不够赢,王异出雌雄剑后橙子表示界孙权仍然有小优势,直到王异挂出木马后橙子说界权已经不行了。其实我感觉王异只要出+1和雌雄就已经是大优了,都不在乎到底是不是满血;单出木马应该就可以吊打界权,所以很想把这个单挑设计出来,然后跑个强化学习看看王异到底在什么状态下能优界权,其实还是个挺有趣的事情的,因为这个单挑只是界权来说是非常困难的,看看人工智能是否能做到“会玩的界孙权”。(原对局是最后界权靠续爆顺拆,铁索火攻藤甲险胜,非常艰难,王异出木马后桃子特别多,界权操作难度太大了)

PS:

马哲把手写断。运气不好,似乎没有碰到认识的人,罢了。


2020.12.07

贱骨头,不跑到10公里誓不罢休,48'18'',重回10km,比最好的两次47'00''以内的成绩差了不少,大约是十一月中旬的水平。

跑得比较慢(4'49''配速),其实是全程不敢提速,到最后都没敢冲刺(昨天疼怕了),全程都压着左脚的内侧跑(外侧有血泡),跑得很别扭(我真的想改顺时针跑了,但是大家都是逆时针,唉),特别累,跑完感觉左腿有点伤。

估摸着全盛状态10km可以跑进46分半,但可能还需要一段时间休整,血泡已经快要恢复了,明天可能会停一次,这周全是考试,不一定能抽空这么拼了。

昨天那个徐奕真的给我很大触动,督促自己还是不能懈怠;忽然想到也许雷佳乐会遇到他,也许这就是所谓人以群分吧~

有时候碰到比自己年纪大的大佬,还是有那种意气,五年十年,哪怕一两年,也未必达不到你的境地;但是碰到同龄人,借口无从生,自叹鸿毛不如,菜就是菜。

年轻气盛,什么都不愿落后于人;现在年纪大了,能走的路越来越少,时不我待了。总觉得自己很不认命,老天已经把路放在我面前,摁着我的脖子让我走,但是我依然想要看看别处的风景,也许注定终会败在这个点上了。


2020.12.06

托大了,今天做了充分的准备,计划跑10km。本来20圈结束37'55''已经是破了之前10km最好的分段成绩,结果贪得无厌21圈开始提速,到第22圈跑了50米突然左脚底剧痛,感觉是血泡出现褶皱压疼了,赶紧停到一边,踉跄地回寝看了一下,还好没有大问题,但是被老妈臭骂了一通,很烦。。。

最后是39'40''跑了8450米,配速4'44'';前20圈都小心翼翼,主要是高步频低步幅,压在4'45''的配速以内,没有敢跑得太快。21圈时觉得只剩5圈,再这么跑下去肯定进不了47'00'',而且感觉有能力刷新之前46'42''的成绩,唉,感觉明天都不一定能跑了,太贪心了。

向巨佬(CSDN@徐奕,https://blog.csdn.net/xyisv)学习,跟同龄人的差距还是很大的,切不可坐井观天。


2020.12.05

DGL库的学习基本今天可以完结,到时候把笔记发出来。我感觉这不是一个User Guide,这是一篇论文,还是一篇至少百页的超长论文,学一遍必然是有所得的。

血泡未消,但是晚上实在忍不住了,左脚套了两双袜子强行上场跑,结果发现自己完全找不到节奏了,起步半圈配速4'22'',却全然不知,然后就不停地减速,减到4'40''保持了一阵子,5圈呼吸节奏就有点乱了,最后强行提速超掉了一个一直在我身前身后晃悠的兄弟,10圈4公里,18'30'',比最好的成绩17'55''差了不少,但是基本持平了第二好的成绩18'25'',作为恢复后的第一跑,勉强还说得过去。

可能还是节奏问题,体力应该不至于下降太多,今天午睡自然醒,加上几天不跑,腿也是状态完满,按理是一切都是极好的,明天再看吧,争取尽快回到10km的水平。


2020.12.04

昨天感觉还好,试了次10次上下六楼+两个15米过道,17分钟,然后发现脚底血泡褪色,有明显可见的流动淤血;但是今早还是变成了纯血红色,还是听了老妈的建议,早上去校医院把血泡戳破放血,现在是彻底变成废物了。

晚上出门骑了35分钟,遇红灯就右拐,遇绿灯就直行,保持了一个相对均匀的速度,没有计程,估摸着十公里左右,主要还是让腿保住感觉,下次上场必然是状态非常完满的,这么多天没有跑,肯定是要跑一次大的,要是体能掉了就实在是太扫兴了。不过似乎有很长时间不出校门了,好像开学后就出去吃了一次杨国福,国庆回来就没出过门了,出去一次也不错。

准备更新dgl的学习笔记,Re-Net我已经跑通GPU,但是即便是用项目里最小的数据集YOGA也会显存溢出,那已经是一个只有1000多实体的极小知识图谱,4G显存竟然还是溢出,这就实在是没有办法了。准备学一手dgl就算过了,代码逻辑基本理通,但是baselines里面还有不少模型,不想看了... 感觉也是一些比较老的了,不值得花时间一个个看明白了。

统计居然还能把期中试卷发回来,我们基本全军覆没,考了个77还是我们软工十人最高的,统计那边好多80多,还有九十以上的,太离谱了。但是今晚的课李卫明讲的是交叉K折验证的估计和精确性分析,我觉得统计这块应该是可以与NLP相结合的,未必是模型上的融合,比如用贝叶斯或者像SMT(统计机器翻译)这种方法,我觉得是否可以用理论对模型的性能进行评估?至少我看了一些paper下来很少有学者会做这方面的工作,不论是国内还是国外的NLP工作者,更多的是在考虑怎么设计出一个新颖的层,而很少去论证模型的性能,仅仅依靠一些多次实验取平均指标的方法来评估模型,这是否太局限,或者说过于flat?能否将统计理论应用到模型评估中,我似乎也不知道具体该怎么做,但是今晚关于交叉验证,包括AIC, BIC Cp准则取惩罚项系数的方法(像我们取惩罚项系数很多时候就直接当成超参数来调参了,调参很盲目,是否能用统计方法来论证参数应该取在什么范围内比较好?)。总之这块paper总是有意回避复杂的数学论证,可能对于我们来说好的结果比好的过程更重要,只要结果变好了,不管过程怎么样你都是对的;而论证过程严密,数据集上得不出好的结果也是没用。太悲哀了


2020.12.03

DGL库的不同cuda版本可能并不兼容,这个问题太大了,Re-Net是用dgl-cu100来写的,我用非cuda的dgl和dgl-cu92都搞不了,这年头总不能在PC机上装几个CUDA版本,太吃磁盘空间了。

新本的显卡是1650 ti,目前CUDA更新到11.1版本,tensorflow更新到2.4.0,不同版本的tensorflow还有不同的最低cuda版本要求,tensorflow到2.x.x之后至少是要cuda10.0了,估摸着2.4.0起码是CUDA11以上,差不多就是要最新版本的CUDA,所以老本960M的显卡最多装到CUDA9.2就只能用到tensorflow-gpu1.9.0封顶,dgl也只能用dgl-cu92(dgl目前最新到dgl-cu102),后面的版本想都不用想了。。总之CUDA这边真的越来越麻烦了,每个库都要上CUDA,对CUDA还有不同版本的要求(现在看来反而是torch最好,没那么多要求,啥cuda都能用),不同CUDA还要配不同的CUDNN,这年头NVIDIA就不能搞个统一兼容的版本出来么???

现在准备在新本上装CUDA,但是之前老本装CUDA的惨痛经历让我迟迟不敢动手,还是先做备份,但是新本又是固态硬盘,真是舍不得频繁恢复备份来进行硬盘大清洗,

PS:

脚掌的泡已经变成纯正的血红色了,拍了个照给妈妈看了一下,警告我别再跑了,要是真的破皮感染就完蛋了。

现在走路都有点跛,可能考虑找条路况比较好的环线去练练自行车了,万一以后真有机会搞铁人三项,反正脚确实是废了。

11.24~12.01共8天,雨天59分内跑了2次12km,47分内跑了2次10km,18分内跑了1次4km,其余三天5圈间歇两组,跑步确实是容易上瘾,但是一旦废了是真的痛苦,这次脚上的泡就是一次12km和一次10km鞋子进石子不愿意停下来,硬忍着强行跑完,以后真的要引以为戒了。


2020.12.02

颓唐,为了彻底杀死自己的游戏欲望,我联系了客服帮我注销掉自己的账号,是真的吐了,坐在四教第一排都扼杀不了,每周总有一天,突然想玩,就停不下来了。

晚上试了一下,长裤长袖慢跑了差不多5圈左脚掌就开始痛了,有种火辣的磨砂感,只能退场。休整两天,周五或者周六再来,必须得让这块泡完全复原掉才能跑了。


2020.12.01

DGL库的API:https://docs.dgl.ai/tutorials/basics/2_basics.html#sphx-glr-download-tutorials-basics-2-basics-py

学习知识图谱必学DGL,很厉害的一个库,Re-Net中用到,暂时先不抽身学DGL,大致知道里面的一些方法,之后抽空一定把API完整过一遍。

这是我看到现在,API写得最好的一个库了,强烈推荐学习,DGL的开发组有心了;

PS:

最近四五天午觉都睡不着,明明也早起了。也许有点被身边的事情刺激到了罢。彼时一年矣,彼时乱我心,很烦。

25圈,46'42'',再次刷新10公里的最好成绩(但其实前天47'03''的成绩,APP计程是10.10km,今天计程是10.02km,算下来其实前天还要快一点点,但是都是同样跑了25圈,都按照10km计了);

然而彻底把脚跑废了,接下来可能要好好休息几天了。

隔一天就跑一次10公里以上的量,以前真的不敢想象,一个月前我隔10天才能恢复出跑一次10km的状态,现在隔一天跑一次。

15圈结束觉得左脚又进了石子,磨得脚生疼,正好三急去了趟厕所,发现不是进了石子,而是脚底磨出一块泡,几乎接近鸡蛋大小,跑完回寝看了一下已经泛血色了。

前15圈保持了4'45''的配速,上完厕所回来节奏彻底乱了,以为状态很好至少能再顶15圈,结果5圈后发现就不太行了,于是直接选择全程提速刚了10圈,最后平均下来差不多4'40''的配速,勉强还行,其实中间一分钟上厕所没有恢复太多,反而乱了节奏,刚回场起步就特别疲劳了,这也是为什么我之前从来不会选择中途停下来休息的原因,除非是计划5圈间歇跑,否则所有的里程,不管是10圈,20圈还是30圈都是一口气跑完。一旦中途停下来休息,很可能就再也起不来了,即便硬撑着再起,节奏一变意志就找不到感觉,一下子就崩塌了。间歇比耐力跑难太多了。

回头过了个秤,75kg整,终于回到正常值了。。。


2020.11.30

ss脱单了,yy约莫也脱单了,以后碰到能说点话的人的机会就越来越少了。事物都是运动发展的,似乎只有我总是静止不动。

晚上听了经院的孙燕副院长做的关于论文的讲座,确实论文是要积累,硕博的硕士阶段不需要写毕业论文,很可能一上博士就会很不适应,所以这两年是非常关键的,有机会得找个可以合作的tutor把相关工作先开展起来,毕竟王英林手下有五六个博士,肯定是不能一一照应得来的,更不用说我们几个硕士了。

RE2RNN告一段落,基本算是搞明白了,接下来就是去做Re-Net的工作,今天又很零散地做了很多事情,python代码好写,但是难读,因为没有变量类型的标注,Python3.7之后开放了函数参数类型和返回值类型标注的接口,但是并没有强制地限制,否则就是大动了python底层地逻辑了,真希望写代码地能不辞辛劳把函数参数地变量类型和返回值标注上去,否则真的读得很累。

晚上跑速耐,第一个5圈8'49'' 第二个4圈7'04'' 第三个1圈1'38'' 中间分别间隔了90秒,状态不算很好。前两天连续跑出一段时间内很难打破的记录,今天太冷,也没午睡,确实萎靡了。

PS:

某人都硕士了,参加讲座还用本科的学号,不知道的还以为是延毕了。。


2020.11.29

感觉这两天杀疯了,25圈47'03'',平均配速4'42'',把之前十公里的最好成绩提高了1'17'',是有史以来进步最多的一次。

目前4 6 8 10 12km的成绩更新为17'55'' 27'39'' 38'01'' 47'03'' 58'49''

前10圈19'00''整,我知道起快了,但是还是决定先坚持10圈再做调整;

10圈后满脑子想着怎么平滑地减速而不影响节奏,结果硬是减不下来,20圈结束38'01'',其实这个成绩已经破了之前20圈的最好成绩了;

非常有幸21~22圈有个兄弟在我前面领跑,速度尚可,我跟了两圈后感觉状态特别好,在22圈结束时开始提速,把他给超了;

22圈半(9公里)结束42'45'',已经做不到三步一吸,三步一呼的呼吸频率了,明显不足以支撑到30圈;

最后一公里彻底放飞自我,4'18'',终点前200米的冲刺是今年冲的最舒畅,第一次体验了完全力竭的感觉;看到47'03''的成绩表示极其满意。

无论什么事情,只要坚持就一定会有所提升的,虽然现在这个环境并不给年轻人充足的时间来坚持一项与本业无关的事业,想要胜出只能不停地学习,不断地寻找资源,卷掉其他人;但是我希望十年,二十年后,乃至风烛残年时,能够看到自己曾经几十年如一日地坚持跑步,坚持写日记,哪怕为此只能做个凡人流于荒野,也便是足矣。


2020.11.28

10圈速耐,17'55'',刷新之前的最好成绩18'25''整整半分钟,首次将4'30''的配速坚持到10圈,可喜可贺。

其实一开始感觉肯定坚持不了,结果回头看每个1000米都是越来越快的,最后一个1000米刚好碰到两个大佬外道超了我,我硬是跟上第二个人,要不然3000米结束我可能就要打退堂鼓了,现在的水平还是菜得很,很难坚持住4'30''的配速。

不过今天跑完倒是没有头疼,感觉状态应该是不错的,跑了两天速耐,明天准备回到长跑,希望能有好的状态。

PS:

往服务器上部署了一下springboot的后端,springboot的部署对我们这种菜鸟实在是太友好了。

做了点torch的工作,感觉还是值得分享的,准备写篇博客记录一下。

【置顶】囚生CYのPOST(NEW VERSION)

 


2020.11.27

PART1

准备更一个torch和torchvision的blog,之前有把torch的中文文档过了一遍,用notepad记了一遍要点,写了几千行的,但是发现P用不大,一段时间不用啥也记不起来了。

然后最近认真学了一段时间torch发现torch好像确实比tensorflow好用一些,反正tensorflow里面那些上面定义变量名,变量域,session还有上面summary之类鬼扯的东西我到现在都倒腾不来,我到现在都不太明白tensorflow里面那种树状变量定义到底该怎么用。

PART2

今天巨TM离谱,下午两点我去拿快递把校园卡弄丢了,来回找了两遍找不到,心想明天周末又办不了,没卡连寝室门都开不了,花点钱赶紧办了拉倒,于是三点就去办了个新卡,结果新卡24小时才能刷开宿舍楼大门和寝室门,我上下五楼跑了n遍终于成功进了寝室;

然后lh取快递回来告诉我他也把校园卡弄丢了,更加离谱的是yjz和ywt周末刚好都不在学校,所以两个难兄难弟进不了宿舍楼,开不了寝室门,洗不了澡,接不了热水;实验室也刷不开,已经沦落到无家可归的地步了。。。

PS:

晚上雨停,顶着寒意,短裤短袖上场简单跑了10圈。前五圈练速度,8'45'',比之前最好的成绩快7秒,但是跑得特别痛苦,四圈就不行了,硬撑着跑完五圈头疼得不得了,可能是天冷,血液流速加快导致头部血管扩张就开始疼了。

歇了两三分钟后,打了个电话边跑了5圈,没有计时,权且休整,周末状态好的话可能考虑搞一个大动作,比如15km,或者跑一次4'45''配速的耐力极限,反正现在看来速度比耐力要难练得多。

早上起来的时候腿特别疼,应该时昨天冲刺导致的,但是晚上又没什么感觉了,至少跑完腿也没啥感觉。

有幸看到两个大佬在跑,速度很快,目测在4'45''以内,都是短裤短袖,我进场前就在跑了,我退场后五分钟外还在跑,起码跑了半小时以上了,水平在我之上,4'45''的配速我最多坚持40分钟。要是下次能看到我就跟着跑一次了,有个大佬带着跑肯定是能进步很快的,单独跑很容易就意志不足,速度就掉下来了。

Fight!


2020.11.26

xhp介绍了go语言,感觉跟java没啥区别啊。。。计算机为什么有这么多乱七八糟的语言,这让我们这些菜鸟怎么才能赶上时代的步伐???

PS:

雨,30圈,12km,58'49'',最后1km配速4'31'',相比前天跑完状态良好,且取得了1000米以上的提速冲刺能力,12个1000米分段配速如下,前面跑慢了导致最后冲刺也没快太多。其实最后如果不冲刺我很可能也不会选择跑更多了,有时候就是这样,宁可快点结束,也不愿意再跑更久了,关键是意志已经撑不了那么久了,虽然这次体能肯定是支持30圈后接着跑的。

可能雨天确实有状态加成吧,今天跑完状态良好,一两分钟就恢复了。

【置顶】囚生CYのPOST(NEW VERSION)【置顶】囚生CYのPOST(NEW VERSION)


 


2020.11.25

如果设置了自增主键,则mybatis的xml映射文件中的插入sql语句执行完后,对应的javabean变量会自动填充自己的主键对应的成员变量值,而无需再插入时设置好主键插入,这还挺不错的,省事,搞了半天以为一定要用selectKey给插入函数返回个变量才行,真是上当了,有些blog真是误导人。

PS:

雨太大了,下得没完没了,回寝上下楼+两个过道跑了11个来回,20分钟多几十秒,差不多还行,主要下雨走廊地滑,楼内也不是很好跑,下楼基本上是再慢慢走,基本上相当于是间歇跑了个十圈。

非常意外,本以为今天腿会酸痛,结果上下楼跑了20分钟一点感觉也没有,难道破腿已经习惯了昨天那种量了吗。。

近一个月各里程最好成绩:

12公里58'50'',配速4'54''(累计跑了1次);

10公里48'20'',配速4'50''(累计跑了4次);

8公里38'03'',配速4'45''(8公里有一个月没破了,因为要么状态根本上不到20圈,要么上了20圈就能更多,不再愿意20圈停下来了);

6公里27'39'',配速4'36''(6公里可能很长时间破不了了,配速持平了4公里的最好成绩);

4公里18'25'',配速4'36''(4公里主要是用来练速耐);

接下来两个目标就是挑战15公里,以及坚持4'30''配速跑到10圈以上了。


2020.11.24

跑步一年来最疯狂的一天,自我感觉状态极佳,在雨夜强行启动人生第一次1小时场地跑,最终以58'50''的成绩完成30圈,结束时浑身冻僵,四肢麻木,好在神智清醒,还能找到了回家的路,赶紧冲了个热水澡,可别感冒了。

天气确实影响状态,在4个1000米的节点忘了计时,下面分别记录了1000米,3000米,4000米,7000米,8000米,9000米,10000米,12000米时的成绩,平均配速4'54''17,最后两圈配速4'50'',个人感觉在天时不利,穿的裤子也不太行的情况下能跑出这个成绩已经让我非常地满意了。

Fight,距离半马又近了一步。

【置顶】囚生CYのPOST(NEW VERSION)

 


2020.11.23

更大的雨,操场提前闭场,选择路跑10分钟2km,总之路跑和场地跑是两种运动,前者难度远远大于后者。

我发现实验室确实能提高不少效率,晚上不到三小时硬是复习了昨天一天密码学的量,又可以快乐搞java了~

早上最后一节课,终于再也不用同上一节课了,时间线在此交错,从此渐行渐远。

眼不见,心不烦,也挺好。


2020.11.22

风雨夜,15圈半小时整,状态和腿脚已经完全复原了,可惜顶着风雨实在太难。

B站看到一个上海大学的兄弟今年跑连云港的大铁(游泳3.8公里,自行车180公里,跑步42.195公里),总用时12小时2分钟,20~30岁年龄组第5,男子组35名,我被震惊了,这还是人类的体质么。

下决心毕业前有机会一定要跑一次马拉松,至少也得去跑一次半马,否则实在是太遗憾了。

分享关于angular的使用小结:

> AngularJS 通过 ng-directives 扩展了 HTML。
> ng-app 指令定义一个 AngularJS 应用程序。
> ng-model 指令把元素值(比如输入域的值)绑定到应用程序。
> ng-bind 指令把应用程序数据绑定到 HTML 视图。
> HTML5 允许扩展的(自制的)属性,以 data- 开头。
AngularJS 属性以 ng- 开头,但是您可以使用 data-ng- 来让网页对 HTML5 有效。

## 实例1: ng-app ng-model ng-bind
> 当网页加载完毕,AngularJS 自动开启。
> ng-app 指令告诉 AngularJS,<div> 元素是 AngularJS 应用程序 的"所有者"。
> ng-model 指令把输入域的值绑定到应用程序变量 name。
> ng-bind 指令把应用程序变量 name 绑定到某个段落的 innerHTML。
 

<div ng-app="">
  <p>名字 : <input type="text" ng-model="name"></p>
  <h1>Hello {{name}}</h1>
  <p ng-bind="name"></p>
</div>

2020.11.21

10圈19'25'',状态很好,但是腿吃不消了,而且雨天确实难跑。

分享一下之前的(有“场外观测者”,很无奈只能加一些内容)

1. 安装Vue并创建Vue项目

vue.js提供了一个官方命令行工具, 可用于快速搭建大型单页应用

  1. 全局安装: cnpm install --global vue-cli
  2. 创建应用: vue init webpack my-project
  • 输出结果以及选项:
# 这里需要进行一些配置,默认回车即可
This will install Vue 2.x version of the template.
For Vue 1.x use: vue init webpack#1.0 my-project

? Project name my-project
? Project description A Vue.js project
? Author runoob <test@runoob.com>
? Vue build standalone
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Setup unit tests with Karma + Mocha? Yes
? Setup e2e tests with Nightwatch? Yes

   vue-cli · Generated "my-project".

   To get started:
   
     cd my-project
     npm install
     npm run dev
   
   Documentation can be found at https://vuejs-templates.github.io/webpack
  1. 进入项目, 安装并运行
  • cd my-project
  • cnpm install
  • cnpm run dev
  • 输出结果:
 DONE  Compiled successfully in 4388ms
> Listening at http://localhost:8080

2. Vue项目目录结构

  1. build: 项目构建(webpack)相关代码的存储目录
  2. config: 配置目录, 包括端口号等, 初学使用默认值即可
  3. node_modules: npm加载的项目依赖模块
  4. src: 项目开发目录, 基本上要做的事情都在该目录中, 其中包含了几个目录及文件
  • assets: 放置一些图片, 如logo等
  • components: 目录里面放了一个组件文件, 可以不用
  • App.vue: 项目入口文件, 我们也可以直接将组件写这里, 而不是用components目录
  • main.js: 项目的核心文件
  1. static: 静态资源目录, 如图片, 字体等
  2. test: 初始测试目录, 可删除
  3. .xxxx文件: 这些是一些配置文件, 包括语法配置, git配置等
  4. index.html: 首页入口文件, 你可以添加一些meta信息或统计代码
  5. package.json: 项目配置文件
  6. README.md: 项目的说明文档

3. Vue起步

每个 Vue 应用都需要通过实例化 Vue 来实现。语法格式如下:

var vm = new Vue({
  // 选项
})

示例


<div id="vue_det">
    <h1>site : {{site}}</h1>
    <h1>url : {{url}}</h1>
    <h1>{{details()}}</h1>
</div>
<script type="text/javascript">
    var vm = new Vue({
        el: '#vue_det',
        data: {
            site: "菜鸟教程",
            url: "www.runoob.com",
            alexa: "10000"
        },
        methods: {
            details: function() {
                return  this.site + " - 学的不仅是技术,更是梦想!";
            }
        }
    })
</script>

可以看到在 Vue 构造器中有一个el 参数,它是 DOM 元素中的 id。在上面实例中 id 为 vue_det,在 div 元素中:
当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。当这些属性的值发生改变时,html 视图将也会产生相应的变化。

<body>
    <div id="vue_det">
        <h1>site : {{site}}</h1>
        <h1>url : {{url}}</h1>
        <h1>Alexa : {{alexa}}</h1>
    </div>
    <script type="text/javascript">
    // 我们的数据对象
    var data = { site: "菜鸟教程", url: "www.runoob.com", alexa: 10000}
    var vm = new Vue({
        el: '#vue_det',
        data: data
    })
    // 它们引用相同的对象!
    document.write(vm.site === data.site) // true
	document.write("<br>")
    // 设置属性也会影响到原始数据
    vm.site = "Runoob"
    document.write(data.site + "<br>") // Runoob

    // ……反之亦然
    data.alexa = 1234
    document.write(vm.alexa) // 1234
    </script>
</body>

除了数据属性,Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。例如:


<div id="vue_det">
    <h1>site : {{site}}</h1>
    <h1>url : {{url}}</h1>
    <h1>Alexa : {{alexa}}</h1>
</div>
<script type="text/javascript">
// 我们的数据对象
var data = { site: "菜鸟教程", url: "www.runoob.com", alexa: 10000}
var vm = new Vue({
    el: '#vue_det',
    data: data
})
 
document.write(vm.$data === data) // true
document.write("<br>") 
document.write(vm.$el === document.getElementById('vue_det')) // true
</script>

2020.11.20

对不起,我今天就把flag回收了,10公里48'20'',再次刷新破6天前48'44''的记录,平均配速整整4'50'',巨大突破。分段配速如下(Lap1 是2000米计时,第一个1000米忘记按表计时了)

上一篇:杨亦涛老师在杨老师课堂分享c++ 九九乘法表,倒计时,成语接龙等源码


下一篇:过河卒(递推和递归)