apt-get锁

提示:

1
2
E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?

解决方法:

1
2
3
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

来自https://askubuntu.com/questions/15433/unable-to-lock-the-administration-directory-var-lib-dpkg-is-another-process

公众号推荐

推荐一波自己的公众号:五道口的程序狐

里面有一个聊天机器人,抚慰你的心灵

mp

如有需要,联系contact@fhao.top

url转码

来自 http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

也就是在说%xx这种转码方式

网址路径

utf-8

查询字符串

操作系统默认编码

Get生成的

由网页编码决定。百度GB2312,google utf-8

ajax调用

IE:默认编码;Firefox:utf-8

js中编码函数

escape()转为unicode不是utf-8
对应转码为unescape()
escape&encode
上图中的`\u00a9’就是一个unicode字符

下面几个均为utf-8:
encodeURI():不对单引号; / ? : @ & = + $ , #这些符号编码
decodeURI():上面不编码的也不解码
encodeURIComponent():不对单引号编码
encodeURI&encodeURIComponent

Unicode&utf-8

unicode&utf-8
utf-8是unicode一个实现方式

如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

MySQL

写在前面

下列内容摘录自 http://www.runoob.com/mysql/ (菜鸟教程)
其实就是把里面讲的东西搬过来了,非常感谢菜鸟教程的整理
现在就是在php里面使用,把所有可能用到的代码(放在注释里面)放在了github上面:https://github.com/fengh16/Web-Learning/tree/master/sqlLearing

可视化工具

https://dev.mysql.com/downloads/file/?id=474210

数据库的连接

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$dbhost = $_ENV['MYSQL_HOST'] . ":" . $_ENV['MYSQL_PORT']; // mysql服务器主机地址
$dbuser = $_ENV['MYSQL_USERNAME']; // mysql用户名
$dbpass = $_ENV['MYSQL_PASSWORD']; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysqli_error());
}
echo '数据库连接成功!';
mysqli_close($conn);
?>

以下添加的内容均放在mysqli_close($conn);之前

数据库创建

1
2
3
4
5
6
7
$sql = 'CREATE DATABASE ARTICLES';
$retval = mysqli_query($conn,$sql);
if(! $retval )
{
die('创建数据库失败: ' . mysqli_error($conn));
}
echo "数据库 ARTICLES 创建成功\n";

数据库删除

1
2
3
4
5
6
7
$sql = 'DROP DATABASE ARTICLES';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('删除数据库失败: ' . mysqli_error($conn));
}
echo "数据库 ARTICLES 删除成功<br />";

选择数据库&设置编码

1
2
3
4
// 选择数据库进行操作,下面的$_ENV['MYSQL_DBNAME']是数据库名
mysqli_select_db($conn, $_ENV['MYSQL_DBNAME']);
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");

创建数据表

1
2
3
4
5
6
7
8
9
10
11
12
$sql = "CREATE TABLE testtable_tbl( ".
"testtable_id INT NOT NULL AUTO_INCREMENT, ".
"testtable_title VARCHAR(100) NOT NULL, ".
"testtable_author VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( testtable_id ))ENGINE=InnoDB DEFAULT CHARSET=utf8; ";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表创建失败: ' . mysqli_error($conn));
}
echo "数据表创建成功<br />";

删除数据表

1
2
3
4
5
6
7
$sql = "DROP TABLE testtable_tbl";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表删除失败: ' . mysqli_error($conn));
}
echo "数据表删除成功<br />";

添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
$testtable_title = '学习';
$testtable_author = 'FH';
$submission_date = '2016-03-06';
$sql = "INSERT INTO testtable_tbl ".
"(testtable_title, testtable_author, submission_date) ".
"VALUES ".
"('$testtable_title','$testtable_author','$submission_date')";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法插入数据: ' . mysqli_error($conn));
}
echo "数据插入成功<br />";

数据查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
$sql = 'SELECT testtable_id, testtable_title, 
testtable_author, submission_date
FROM testtable_tbl';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>mysqli_fetch_array 测试<h2>';
echo '<table border="1"><tr><td>ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>';
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC))
{
echo "<tr><td> {$row['testtable_id']}</td> ".
"<td>{$row['testtable_title']} </td> ".
"<td>{$row['testtable_author']} </td> ".
"<td>{$row['submission_date']} </td> ".
"</tr>";
}
echo '</table>';

$sql = 'SELECT testtable_id, testtable_title,
testtable_author, submission_date
FROM testtable_tbl';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>mysqli_fetch_assoc 测试<h2>';
echo '<table border="1"><tr><td>ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>';
while($row = mysqli_fetch_assoc($retval))
{
echo "<tr><td> {$row['testtable_id']}</td> ".
"<td>{$row['testtable_title']} </td> ".
"<td>{$row['testtable_author']} </td> ".
"<td>{$row['submission_date']} </td> ".
"</tr>";
}
echo '</table>';

// 使用常量 MYSQLI_NUM 作为 PHP mysqli_fetch_array() 函数的第二个参数,返回数字数组
$sql = 'SELECT testtable_id, testtable_title,
testtable_author, submission_date
FROM testtable_tbl';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>mysqli_fetch_array 测试<h2>';
echo '<table border="1"><tr><td>ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>';
while($row = mysqli_fetch_array($retval, MYSQLI_NUM))
{
echo "<tr><td> {$row[0]}</td> ".
"<td>{$row[1]} </td> ".
"<td>{$row[2]} </td> ".
"<td>{$row[3]} </td> ".
"</tr>";
}
echo '</table>';

// 释放内存
mysqli_free_result($retval);

// SELECT field1, field2,...fieldN FROM table_name1, table_name2...
// [WHERE condition1 [AND [OR]] condition2.....
// 条件可以使用=、<> !=、<、>、<=、>=

数据更新

1
2
3
4
5
6
7
8
9
$sql = 'UPDATE testtable_tbl
SET testtable_title="学习吗"
WHERE testtable_id=2';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法更新数据: ' . mysqli_error($conn));
}
echo '数据更新成功!';

数据删除

1
2
3
4
5
6
7
8
$sql = 'DELETE FROM testtable_tbl
WHERE testtable_id=1';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法删除数据: ' . mysqli_error($conn));
}
echo '数据删除成功!';

like语句

1
2
// WHERE testtable_author LIKE "%COM"
// 里面的%是任意字符串

UNION指令

1
2
3
4
5
// SELECT country FROM Websites
// UNION
// SELECT country FROM apps
// ORDER BY country;
// UNION ALL不会去重

排序

1
2
// ORDER BY field1, [field2...] [ASC [DESC]]
// 排序,分别是升序或者倒序

分组

1
2
3
4
5
6
// GROUP BY column_name
// 按照column_name分组
// WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
// 示例:SELECT name, COUNT(*) FROM employee_tbl GROUP BY name
// 示例:SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP
// 上面那个示例会显示总数信息

JOIN

1
2
3
4
5
6
7
8
// INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。INNER可以省略
// LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
// RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
// 用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取testtable_tbl表中所有testtable_author字段在tcount_tbl表对应的testtable_count字段值
// SELECT a.testtable_id, a.testtable_author, b.testtable_count FROM testtable_tbl a INNER JOIN tcount_tbl b ON a.testtable_author = b.testtable_author;
// 相当于:
// SELECT a.testtable_id, a.testtable_author, b.testtable_count FROM testtable_tbl a, tcount_tbl b WHERE a.testtable_author = b.testtable_author;
// LEFT JOIN 会将所有a表中有的东西都列出来,b.testtable_count可能出现NULL

NULL

1
2
3
4
5
// NULL值:如果NULL和别的比较都会出现false,包括NULL=NULL为false
// 所以提供了运算符:
// IS NULL: 当列的值是 NULL,此运算符返回 true。
// IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
// <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

正则

1
2
3
4
5
6
7
8
9
10
11
12
13
// SELECT name FROM person_tbl WHERE name REGEXP 'mar';
// 也就是条件判断里面可以写
// 正则说明:
// ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
// $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
// . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
// [...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
// [^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
// p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
// * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
// + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
// {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
// {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

事务

1
2
3
4
5
6
7
8
9
10
11
12
13
// 事务:满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
// 事务代码示例:
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn); // 开始事务定义
if(!mysqli_query($conn, "insert into testtable_transaction_test (id) values(8)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚
}
if(!mysqli_query($conn, "insert into testtable_transaction_test (id) values(9)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚
}
mysqli_commit($conn); //执行事务

ALTER

1
2
3
4
5
6
7
8
9
10
11
12
// ALTER:修改表的名称或者字段
// SHOW COLUMNS FROM testalter_tbl 可以显示所有字段
// ALTER TABLE testalter_tbl DROP i 可以直接删除表testalter_tbl中的i字段
// ALTER TABLE testalter_tbl ADD i INT 可以添加i字段(int)
// 上面的东西的最后可以添加FIRST或者AFTER c代表新加字段的位置
// ALTER TABLE testalter_tbl MODIFY c CHAR(10) 可以直接修改字段
// 如果使用CHANGE则如下:
// ALTER TABLE testalter_tbl CHANGE i j INT 就是把i换为j(INT)
// ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100 也就是设置默认值不是NULL,是100
// ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000 设置默认值
// ALTER TABLE testalter_tbl ALTER i DROP DEFAULT 删除默认值
// 重命名:ALTER TABLE testalter_tbl RENAME TO alter_tbl

其余部分还没看,看到了http://www.runoob.com/mysql/mysql-index.html

php&一些闲谈

动机

因为有一个php托管网站coding.net,所以……现在入坑(曾经?)世界上最好的语言php。

曾经也因为某个网站提供的免费服务而学了asp&access……贫穷使我博学

毕竟还是大网页比较靠谱,省的自己搞什么高防啊买流量什么的啊。相比较服务器的价格,这样一个可以自定义域名而且可以直接免备案(这个是重点,而且小程序可以访问)的服务很棒啊,而且黄金/钻石会员也不是……特别贵(和某些云服务器比)

因为之前了解js……了解asp……实在不行直接用vue或者react也可以用呗……所以也并没什么特别多需要学的……所以这就是我的一个吐槽&记录一下注意点的地方

所以对于我来说……这个php动态网页最重要的也就是它可以免备案了呗……小程序要求网页必须备案也是醉醉的……

php和MySQL配合的部分见https://www.jianshu.com/p/19e175398a5c ,可能它会对别人有点用?(但是可以直接去看菜鸟教程,写的挺好的)

这里的php也是从菜鸟教程那里学的,感谢这个网站http://www.runoob.com/php

正文

  1. 字符串连接使用 . (一个英文句号)
  2. 变量前面带$
  3. 写在里面(废话
  4. echo可以加括号也可以不加,可以直接带一堆参数,逗号隔开
  5. elseif连着写

IE条件注释

来自https://www.jianshu.com/p/11d94c446fa3

可使用如下代码检测当前IE浏览器的版本(注意:在非IE浏览器中是看不到效果的)

1
2
3
4
5
6
7
8
9
10
11
12
<!––[if IE]>
<h1>您正在使用IE浏览器</h1> <!––[if IE 5]>
<h2>版本 5</h2> <![endif]––>
<!––[if IE 5.0]>
<h2>版本 5.0</h2> <![endif]––>
<!––[if IE 5.5]>
<h2>版本 5.5</h2> <![endif]––>
<!––[if IE 6]>
<h2>版本 6</h2> <![endif]––>
<!––[if IE 7]>
<h2>版本 7</h2> <![endif]––>
<![endif]––>

lte:就是Less than or equal to的简写,也就是小于或等于的意思。 lt :就是Less than的简写,也就是小于的意思。 gte:就是Greater than or equal to的简写,也就是大于或等于的意思。 gt :就是Greater than的简写,也就是大于的意思。 ! : 就是不等于的意思,跟javascript里的不等于判断符相同。

网页代码与编辑器

代码高亮

来自https://weiya.me/item/65.html

使用插件Prism.js,到以下地址下载:http://prismjs.com/index.html

做了一些示例,并且下载了我感觉自己可能用到的语言,放在了https://github.com/fengh16/Web-Learning/tree/master/HTMLEditor

先很简单说明一下怎么使用(见index.html,可以直接访问http://www.fhao.top/coding/):

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<head>
<title>Test for an web editor.</title>
<link href="prism.css" rel="stylesheet" />
</head>
<body>
<script src="prism.js"></script>
<pre><code class="language-css">p { color: red }</code></pre>
<pre><code class="language-c++ line-numbers">int main()
{
return 0;
}</code></pre>
</body>

也就是说,东西要放在<pre><code class="language-XXX">XXX</code></pre>里面显示,如果需要加上行号就在codeclass里面加上line-numbers

CKEditor 5

引用方法:<script src="https://cdn.ckeditor.com/ckeditor5/1.0.0-beta.1/classic/ckeditor.js"></script>

官方教程见https://docs.ckeditor.com/ckeditor5/latest/builds/guides/quick-start.html#inline-editor

自己尝试了一下,如下的CKEditor.html(可以访问http://www.fhao.top/coding/CKEditor.html):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Test for an web editor.</title>
</head>
<body>
<script src="https://cdn.ckeditor.com/ckeditor5/1.0.0-beta.1/inline/ckeditor.js"></script>
<h1>Inline editor</h1>
<div id="editor">
<p>This is some sample content.</p>
</div>
<script>
InlineEditor
.create( document.querySelector( '#editor' ) )
.catch( error => {
console.error( error );
} );
</script>
<script src="https://cdn.ckeditor.com/ckeditor5/1.0.0-beta.1/classic/ckeditor.js"></script>
<h1>Classic editor</h1>
<div id="claeditor">
<p>This is some sample content.</p>
</div>
<script>
ClassicEditor
.create( document.querySelector( '#claeditor' ) )
.catch( error => {
console.error( error );
} );
</script>
</body>

也就是要调用对应Editor的create方法,将对应的selector作为参数,如:
ClassicEditor.create( document.querySelector( '#claeditor' ) )

打字机效果的实现

在许多网站上看到过打字机效果,比如typora官网(https://typora.io/)和微信小程序大赛官网(https://developers.weixin.qq.com/competition/index),感觉还不错。感觉实现还比较简单,但自己太懒了……就直接在网上找了几个现成的2333

现在找了几个网上的打字机效果。简单来说,就是直接使用js来把文字逐个显示出来,同时加一个光标(指示的竖线)。

找到的几个放在了https://github.com/fengh16/Web-Learning/tree/master/typeMechine。分别来自 https://blog.csdn.net/sinat_33312523/article/details/72628958https://blog.csdn.net/qq_32623363/article/details/77429463

缓存的最远将来算法-贪心

// 来自算法设计一书94页开始。

算法描述

已知缓存的大小以及访问元素的顺序,每次需要放入新的并且缓存已经满的情况(即缺失)下从缓存中去除下一个相同元素在最远的将来被访问到的元素。

证明

要证明算法的最优,需要说明不存在以下情况:其他方法回收在某一步的元素比上述算法在相同步骤回收的元素更远。但是可以证明,如果这种情况发生,会有别的位置的元素比这个算法更近,总的效果不会更好。

定义简化的调度为:只有在需要某个元素的时候才把这个元素放入缓存中。可以说明每一个非简化的调度都有对应的简化的调度(把放入元素的时机推后到该元素被使用即可)并且不会使得总的缺失次数变多。并且简化调度放入的项数就是缺失次数(不包含刚开始缓存没有满的时候放入的)

  • 证明最远将来规则的最优性(即对于任意序列,由最远将来规则产生的调度 $S_{FF}$ 可以由 最小缺失次数的调度 $S’$ 转化过来并且不增加缺失次数。
    1. 首先证明:对于$j$,如果$S$和$S_{FF}$前$j$次回收相同,则存在另一个简化调度$S’$使得$S’$和$S_{FF}$在$j+1$次回收相同并且不比$S$产生更多的缺失:
      • 在第$j+1$次回收的时候回收了不同的元素,假设$S$回收了$f$而$S_{FF}$和$S‘$回收了$e$,故必须让$S’$试图尽快回到和$S$相同的状态同时不产生不必要的缺失。
      • 从第$j+2$次开始,就让$S’$和$S$的回收策略相同,直到:
        1. 如果某个位置,$S$回收了$e$,则直接让$S’$回收$f$即可。之后就和$S$一样了。
        2. 如果某个位置有$f$的需求(只会首先有$f$的需求而不会有$e$的需求,因为$e$是最远的),则$S$会扔掉某个元素并且放入$f$。在这种情况下,只需要将$S’$中对应的元素也扔掉,放入$e$即可。(之后可以改变放入$e$的位置以简化)之后就和$S$一样了。如果对应的元素就是$e$,就说明$S’$更好……(这种情况应该不会发生的),所以$S’$不会比$S$差。

既然已经说明,上述算法产生的序列有对应的缺失相同的最优序列,所以他就是最优的……证毕。

实际情况

实际上不可能直接这样直到要访问的,所以就考察已经访问过的,扔掉上一次访问最早的元素。(相当于把上述过程的序列倒过来)

xv6

在ubuntu中使用。

环境

VirtualBox,Ubuntu16.04LTS(切记32位!

关于虚拟机

安装增强功能。开启共享粘贴板的主机到虚拟机。

换源

换阿里云或tuna就行,阿里云换源教程见https://www.jianshu.com/p/1dffba8c89e4

共享文件夹权限问题

sudo usermod -a -G vboxsf 你的用户名 即可(来自http://www.jb51.net/os/Ubuntu/343237.html)

下载

git clone https://github.com/mit-pdos/xv6-public

qemu

直接安装:

sudo apt-get install qemu

手动安装

(如果你想作死,就作吧
安装过程见https://en.wikibooks.org/wiki/QEMU/Linux

之前下载好所需工具(直接apt-get install+对应名称安装)

  • git
  • zlib1g-dev(没有安装会在./configure的时候提示:zlib check failed
  • libglib2.0-dev(没有的话会提示glib-2.22 gthread-2.0 is required to compile QEMU
  • libpixman-1-dev(没有的话提示ERROR: pixman >= 0.21.8 not present.

主要操作(直接在termimal里面输入即可)

1
2
3
4
5
6
7
mkdir qemu
git clone git://git.qemu-project.org/qemu.git
cd qemu
./configure
./configure --disable-git-update
make
sudo make install

不保证上述过程成功,不成功的话……还是劝你直接apt-get install

运行

sudo make 之后 make qemu

运行不了?

公众号推荐

推荐一波自己的公众号:五道口的程序狐

里面有一个聊天机器人,抚慰你的心灵

mp