文章7
标签6
分类7
在个人博客里添加评论系统 Gitalk

在个人博客里添加评论系统 Gitalk


前提是 搭建了博客,使用的主题是 jekyll-theme-H2O 这个主题。其余的可以借鉴,但不一定完全适用。

Gitalk 是一个评论系统,在个人博客里添加了之后就可以很简便的进行评论和回复了。


首先要注册一下 GitHub Application,

https://github.com/settings/applications/new

注册完就会有 Client ID 和 Client Secret

在 comments 那添加

gitalk: true
  gitalk_clientID: 'Client ID'
  gitalk_Secret: 'Client Secret'
  gitalk_repo: '用户名.github.io'
  gitalk_owner: '用户名'
  gitalk_admin: '用户名'
  distractionFreeMode: true

是在 comments 下面那添加,不要搞错地方。


文件的位置在 _layouts\post.html

3.0 在 <html> 这个标签下添加

<html> 这个标签下加上这两行

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css">
<script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>

就像这样

<script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>

如图所示,位置不要搞错

3.2 在 % if site.comments.disqus % 后面添加

{% if site.comments.gitalk %}
    
  {% endif %}

如图所示

关于 post.html 这部分的修改可以看一下我的修改

保存修改,再提交。


进入博客,点击设置

进去后勾选一下 issues 就搞定了。

再去看一下你博客里面的文章,如果说出现了评论框,那就是成功了。


参考了这篇文章才实现的:https://tea9.github.io/2018/06/24/gitali_config.html

文章作者写的说明:http://note.youdao.com/publicshare/?id=6ea132ba501b49b2928125a694cc9ad9#/

使用的主题是:jekyll-theme-H2O

Flex布局语法

Flex布局语法

网页布局(layout)是 CSS 的一个重点应用。

布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。

2009 年,W3C 提出了一种新的方案—-Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

Flex 布局将成为未来布局的首选方案。本文介绍 Flex 布局的语法。

以下内容主要参考了下面两篇文章:A Complete Guide to FlexboxA Visual Guide to CSS3 Flexbox Properties

一、Flex 布局是什么?

Flex 是 Flexible Box 的缩写,意为” 弹性布局”,用来为盒状模型提供最大的灵活性。

任何一个容器都可以指定为 Flex 布局。

.box{
  display: flex;
}

行内元素也可以使用 Flex 布局。

.box{
  display: inline-flex;
}

Webkit 内核的浏览器,必须加上 - webkit 前缀。

.box{
  display: -webkit-flex; /* Safari */
  display: flex;
}

注意,设为 Flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效。

二、基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称” 容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称” 项目”。

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end;交叉轴的开始位置叫做 cross start,结束位置叫做 cross end。

项目默认沿主轴排列。单个项目占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size。

三、容器的属性

以下 6 个属性设置在容器上。

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

3.1 flex-direction 属性

flex-direction 属性决定主轴的方向(即项目的排列方向)。

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}

它可能有 4 个值。

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

3.2 flex-wrap 属性

默认情况下,项目都排在一条线(又称” 轴线”)上。flex-wrap 属性定义,如果一条轴线排不下,如何换行。

.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}

它可能取三个值。

(1)nowrap(默认):不换行。

(2)wrap:换行,第一行在上方。

(3)wrap-reverse:换行,第一行在下方。

3.3 flex-flow

flex-flow 属性是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap。

.box {
  flex-flow: <flex-direction> <flex-wrap>;
}

3.4 justify-content 属性

justify-content 属性定义了项目在主轴上的对齐方式。

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}

它可能取 5 个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。

  • flex-start(默认值):左对齐
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

3.5 align-items 属性

align-items 属性定义项目在交叉轴上如何对齐。

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}

它可能取 5 个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为 auto,将占满整个容器的高度。

3.6 align-content 属性

align-content 属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

该属性可能取 6 个值。

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

四、项目的属性

以下 6 个属性设置在项目上。

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

4.1 order 属性

order 属性定义项目的排列顺序。数值越小,排列越靠前,默认为 0。

.item {
  order: <integer>;
}

4.2 flex-grow 属性

flex-grow 属性定义项目的放大比例,默认为 0,即如果存在剩余空间,也不放大。

.item {
  flex-grow: <number>; /* default 0 */
}

如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间(如果有的话)。如果一个项目的 flex-grow 属性为 2,其他项目都为 1,则前者占据的剩余空间将比其他项多一倍。

4.3 flex-shrink 属性

flex-shrink 属性定义了项目的缩小比例,默认为 1,即如果空间不足,该项目将缩小。

.item {
  flex-shrink: <number>; /* default 1 */
}

如果所有项目的 flex-shrink 属性都为 1,当空间不足时,都将等比例缩小。如果一个项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小。

负值对该属性无效。

4.4 flex-basis 属性

flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为 auto,即项目的本来大小。

.item {
  flex-basis: <length> | auto; /* default auto */
}

它可以设为跟 width 或 height 属性一样的值(比如 350px),则项目将占据固定空间。

4.5 flex 属性

flex 属性是 flex-grow, flex-shrink 和 flex-basis 的简写,默认值为 0 1 auto。后两个属性可选。

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。

建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

4.6 align-self 属性

align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch。

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

该属性可能取 6 个值,除了 auto,其他都与 align-items 属性完全一致。

在liunx上安装出错 没有 npm

在liunx上安装出错 没有 npm

我在 Windows 上安装了 Ubuntu Bash。我已经拥有 nodejs 并 npm 在我的 Windows 机器上了 C:\Program Files\nodejs。在 Windows 的 bash shell 中,我正在运行一个使用 npm install 命令的脚本。该脚本给出以下错误

: not foundram Files/nodejs/npm: 3: /mnt/c/Program Files/nodejs/npm:
not foundram Files/nodejs/npm: 5: /mnt/c/Program Files/nodejs/npm:
/mnt/c/Program Files/nodejs/npm: 6: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting “in”)
NPM - 安装

解决方法

“您也可以使用 Windows PowerShell 安装 node 和 npm,因此如果您这样做,它将无法正常运行您的子系统。这意味着您必须安装两次(Powershell 和 Subsystem)或者您决定做一件事。”

如果前面的文字,没有帮助你,这是如何解决问题:
删除当前的安装

sudo apt-get --purge remove node
("sudo apt autoremove node" if console is asking for)
sudo apt-get --purge remove nodejs

以正确的方式安装节点

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt install note

然后安装构建工具,以便稍后为 npm 安装附加组件

sudo apt-get install -y build-essential

关于版本过低,修改下 setup_X.0 去修改
现在你可以输入

npm -v
node -v
Same thing: nodejs -v
检查 npm 是否安装正确。它应该是。

这是一个可以帮助您的链接。
https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions

注意:如果在完成此操作后显示相同的错误,请重新启动 bash。

补一点杂粮

sudo apt-get install build-essential patch ruby-dev libmysqlclient-dev
sudo apt-get install ruby-mysql2 git ruby rails
sudo apt-get install vim
git clone http://10.206.142.24/dengt7/zxy.git
cd zxy
bundle install
sudo gem pristine –all
进入到项目目录之后 rails server
打开浏览器输 127.0.0.1:3000
看到冒烟测试页面则成功

可能还有问题

Termux高级终端安装使用配置教程

Termux高级终端安装使用配置教程

Termux 高级终端安装使用配置教程, 这篇文章拖了有小半年. 因为网上相关的文章相对来说还是比较少的, 恰好今天又刷了机, 所以就特意来总结一下, 希望本文可以帮助到其他的小伙伴. 发挥 Android 平台更大的 DIY 空间.

Termux是一个Android下一个高级的终端模拟器, 开源且不需要root, 支持apt管理软件包,十分方便安装软件包, 完美支持Python,PHP,Ruby,Go,Nodejs,MySQL等。随着智能设备的普及和性能的不断提升,如今的手机、平板等的硬件标准已达到了初级桌面计算机的硬件标准, 用心去打造完全可以把手机变成一个强大的工具.

Google Play 下载的版本比酷安要新, 有能力建议下载 Google PLay 版本的.

长按屏幕

显示菜单项(包括复制、粘贴、更多),此时屏幕出现可选择的复制光标

长按屏幕
├── COPY:复制
├── PASTE:更多
├── More:更多
   ├── Select URL: 选择网址
   └── Share transcipt: 分享命令脚本
   └── Reset: 重置
   └── Kill process: 杀掉当前终端会话进程
   └── Style: 风格配色
   └── Help: 帮助文档

从左向右滑动

显示隐藏式导航栏,可以新建、切换、重命名会话 session 和调用弹出输入法

显示扩展功能按键

扩展功能键是什么? 就是 PC 端常用的按键如: ESC 键,CTR 键,TAB 键, 但是手机上难以操作的一些按键.

效果图

方法一

从左向右滑动, 显示隐藏式导航栏, 长按左下角的KEYBOARD.

方法二

使用Termux快捷键:音量++Q

Ctrl键是终端用户常用的按键 - 但大多数触摸键盘都没有这个按键。为此,Termux 使用音量减小按钮来模拟Ctrl键。
例如,在触摸键盘上按音量减小+ L发送与在硬件键盘上按Ctrl + L相同的输入。

  • Ctrl+A -> 将光标移动到行首
  • Ctrl+C -> 中止当前进程
  • Ctrl+D -> 注销终端会话
  • Ctrl+E -> 将光标移动到行尾
  • Ctrl+K -> 从光标删除到行尾
  • Ctrl+L -> 清除终端
  • Ctrl+Z -> 挂起(发送 SIGTSTP 到)当前进程

音量加键也可以作为产生特定输入的特殊键.

  • 音量加+E -> Esc 键
  • 音量加+T -> Tab 键
  • 音量加+1 -> F1(和音量增加 + 2→F2 等)
  • 音量加+0 -> F10
  • 音量加+B -> Alt + B,使用 readline 时返回一个单词
  • 音量加+F -> Alt + F,使用 readline 时转发一个单词
  • 音量加+X -> Alt+X
  • 音量加+W -> 向上箭头键
  • 音量加+A -> 向左箭头键
  • 音量加+S -> 向下箭头键
  • 音量加+D -> 向右箭头键
  • 音量加+L -> | (管道字符)
  • 音量加+H -> 〜(波浪号字符)
  • 音量加+U -> _ (下划线字符)
  • 音量加+P -> 上一页
  • 音量加+N -> 下一页
  • 音量加+. -> Ctrl + \(SIGQUIT)
  • 音量加+V -> 显示音量控制
  • 音量加+Q -> 显示额外的按键视图

Termux除了支持apt命令外, 还在此基础上封装了pkg命令,pkg命令向下兼容apt命令.apt命令大家应该都比较熟悉了, 这里直接简单的介绍下pkg命令:

Bash

pkg search <query>              搜索包
pkg install <package>           安装包
pkg uninstall <package>         卸载包
pkg reinstall <package>         重新安装包
pkg update                      更新源
pkg upgrade                     升级软件包
pkg list-all                    列出可供安装的所有包
pkg list-installed              列出已经安装的包
pkg shoe <package>              显示某个包的详细信息
pkg files <package>             显示某个包的相关文件夹路径

Bash

~ > echo $HOME
/data/data/com.termux/files/home

 ~ > echo $PREFIX
/data/data/com.termux/files/usr

 ~ > echo $TMPPREFIX
/data/data/com.termux/files/usr/tmp/zsh

长期使用 Linux 的朋友可能会发现,这个 HOME 路径看上去可能不太一样, 为了方便,Termux 提供了一个特殊的环境变量:PREFIX

更换Termux清华大学源, 加快软件包下载速度.

设置默认编辑器

编辑源文件

将原来的https://termux.net官方源替换为http://mirrors.tuna.tsinghua.edu.cn/termux

Bash

export EDITOR=vi

直接编辑源文件

上面是官方推荐的方法, 其实还有更简单的方法, 类似于 Linux 下直接去编辑源文件:

Bash

apt edit-sources

如果清华源 出一些问题的话,大家可以尝试先用着官方源:

Bash

# The termux repository mirror from TUNA:
deb https://mirrors.tuna.tsinghua.edu.cn/termux stable main保存并退出

Bash

vi  $PREFIX/etc/apt/sources.list

终端配色

主要使用了zsh来替代bash作为默认shell. 使用一键安装脚本来安装, 一步到位, 顺便启动了外置存储, 可以直接访问 SD 卡下的目录.

执行下面这个命令确保已经安装好了 curl

Bash

# The main termux repository:
deb https://termux.org/packages/ stable main

Android6.0 以上会弹框确认是否授权,

允许

授权后

Termux

可以方便的访问 SD 卡文件.

脚本允许后先后有如下两个选项:

pkg update
pkg install vim curl wget git unzip unrar

分别选择背景色字体
想要继续更改挑选配色的话, 继续运行脚本来再次筛选:

Bash

sh -c "$(curl -fsSL https://github.com/Cabbagec/termux-ohmyzsh/raw/master/install.sh)"

exit重启sessions会话生效配置

访问外置存储优化

执行过上面的zsh一键配置脚本后, 并且授予文件访问权限的话, 会在家目录生成storage目录,并且生成若干目录,软连接都指向外置存储卡的相应目录

创建 QQ 文件夹软连接

手机上一般经常使用手机 QQ 来接收文件, 这里为了方便文件传输, 直接在storage目录下创建软链接.
QQ

Bash

Enter a number, leave blank to not to change: 14
Enter a number, leave blank to not to change: 6

TIM

Bash

$ ~/termux-ohmyzsh/install.sh

最后效果图如下:

这样可以直接在

home

目录下去访问 QQ 文件夹, 非常方便文件的传输, 大大提升了工作效率.

http://mirrors.tuna.tsinghua.edu.cn/termux

oh my zsh 主题配色

编辑.zshrc配置文件

第一行可以看到, 默认的主题是agnoster主题:

.oh-my-zsh/themes

目录下放着

oh-my-zsh

所有的主题配置文件.

下面是国光认为还不错的几款主题

agnoster

robbyrussell

jaischeema

re5et

junkfood

cloud

random

当然如果你是个变态的话, 可以尝试random主题, 每打开一个会话配色主题都是随机的.

修改启动问候语

默认的启动问候语如下:

这个对于初学者有一定的帮助在前期, 随着对

Termux

的熟悉, 这个默认的问候语就会显得比较臃肿.

编辑问候语文件直接修改问候语:

修改完的效果如下:

这样启动新的会话的时候看上去就会简洁很多.

手机没有 root

利用proot工具来模拟某些需要 root 的环境

然后终端下面输入:

即可模拟root环境
在这个proot环境下面, 相当于是进入了home目录, 可以很方便地进行一些配置.

在管理员身份下,输入

exit

可回到普通用户身份。

手机已经 root

安装tsu, 这是一个su的 termux 版本, 用来在 termux 上替代su:

然后终端下面输入:

即可切换root用户, 这个时候会弹出root授权提示, 给予其root权限, 效果图如下:

在管理员身份下,输入

exit

可回到普通用户身份。

因为termux可以很好的支持Python, 所以几乎所有用Python编写的安全工具都是可以完美的运行使用的. 总的来说可玩性还是比较高的.

Metasploit

安装Metasploit

Termux 官方提供的自动话脚本安装方法如下:

ln -s /data/data/com.termux/files/home/storage/shared/tencent/QQfile_recv QQ

注 在 x86 平台下自动化安装失败,想在 x86 平台下安装的参考 官方的文档 手动去安装.  

这个过程平均耗时大约 3 分钟左右(使用国内的清华源的情况下).  

配置 msf 数据库缓存

意外发现数据库居然都配置好了,启动msfconsole会自动连接数据库了.  

接下来重建数据库缓存

这个时候立刻去搜索发现缓存依然没有建立,只能使用慢速搜索,这里其实是这个缓存建立需要时间,只要稍微等待一下就可以了.

国光以前这里做过测试,缓存建立的平均时间是 3 分钟左右.

然后就可以实现msf秒搜索的效果了,无需等待,感觉比电脑上还要快呐  

解决 metasploit 启动后无法连接数据库

使用自动化脚本安装好Metasploit后使用db_status发现数据库是处于连接状态的, 然后在使用db_rebuild_cache重新建立缓存, 等待大约 3 分钟后, 便可以使用快速搜索了, 没毛病~ 但是
在一段日子过后, 可能会出现以下情况:

Bash

ln -s /data/data/com.termux/files/home/storage/shared/tencent/TIMfile_recv TIM

报这个错误是因为postgresql数据库没有启动造成的. 解决方法就是启动数据库:

本方法只针对 termux 上使用自动化脚本安装 msf

Bash

$ vim .zshrc

启动数据库后重新进入msfconsole会发现启动没有报错了,db_status查看下数据库连接, 也正常了:

Nmap

端口扫描必备工具

hydra

Hydra 是著名的黑客组织 THC 的一款开源暴力破解工具这是一个验证性质的工具,主要目的是:展示安全研究人员从远程获取一个系统认证权限。

sslscan

SSLscan 主要探测基于 ssl 的服务,如 https。SSLscan 是一款探测目标服务器所支持的 SSL 加密算法工具。
SSlscan 的代码托管在 Github

whatportis

whatportis 是一款可以通过服务查询默认端口,或者是通过端口查询默认服务的工具,简单易用。在渗透测试过程中,如果需要查询某个端口绑定什么服务器,或者某个应用绑定的默认端口,可以使用 whatportis 查询。

SQLmap

SQLmap 是一款用来检测与利用 SQL 注入漏洞的免费开源工具 官方项目地址

直接git clone源码

ZSH_THEME="random"

sqlmap 支持 pip 安装了, 所以建议直接 pip install sqlmap 来进行安装, 然后终端下直接 sqlmap 就可以了, 十分方便.

RouterSploit

RouteSploit 框架是一款开源的路由器等嵌入式设备漏洞检测及利用框架。

Bash

vim $PREFIX/etc/motd

Slowloris

低带宽的 DoS 工具

pkg install proot

RED_HAWK

一款采用 PHP 语言开发的多合一型渗透测试工具,它可以帮助我们完成信息采集、SQL 漏洞扫描和资源爬取等任务。

Bash

termux-chroot

Cupp

Cupp 是一款用 Python 语言写成的可交互性的字典生成脚本。尤其适合社会工程学,当你收集到目标的具体信息后,你就可以通过这个工具来智能化生成关于目标的字典。

pkg install tsu

Hash-Buster

Hash Buster 是一个用 python 编写的在线破解 Hash 的脚本,官方说 5 秒内破解, 速度实际测试还不错哦~

tsu

D-TECT

D-TECT 是一个用 Python 编写的先进的渗透测试工具,

  • wordpress 用户名枚举
  • 敏感文件检测
  • 子域名爆破
  • 端口扫描
  • Wordperss 扫描
  • XSS 扫描
  • SQL 注入扫描等
cd ~
pkg install wget
wget https://Auxilus.github.io/metasploit.sh
bash metasploit.sh

WPSeku

WPSeku 是一个用 Python 写的简单的 WordPress 漏洞扫描器,它可以被用来扫描本地以及远程安装的 WordPress 来找出安全问题。被评为 2017 年最受欢迎的十大开源黑客工具.

Bash

msf > db_rebuild_cache

XSStrike

XSStrike 是一种先进的 XSS 检测工具。它具有强大的模糊测试引擎.

Bash

msfconsole
[-] Failed to connect to the database: could not connect to server: Connection refused
        Is the server running on host "127.0.0.1" and accepting
        TCP/IP connections on port 5432?

小结

因为 Termux 完美的支持PythonPerl等语言, 所以有太多优秀的信息安全工具值得大家去发现了, 这里我就不一一列举了.

安装 python2.7

安装完成后, 使用python2命令启动python 2.7.14环境.

安装 python3

安装完成后, 使用python命令启动python 3.6.5环境.

升级 pip 版本

Bash

pg_ctl -D $PREFIX/var/lib/postgresql start

这两条命令分别升级了pip2pip3到最新版.
pip 版本查看

ipython

ipython 是一个 python 的交互式 shell,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数。学习 ipython 将会让我们以一种更高的效率来使用 python。
先安装clang, 否则直接使用pip安装ipython会失败报错.

pkg install nmap

然后分别使用ipythonipython2进入py2py3控制台:

编辑器

终端下有vim神器, 并且官方也已经封装了vim-python, 对vim进行了 Python 相关的优化.

Bash

pkg install hydra

解决 termux 下的 vim 汉字乱码

在家目录下, 新建.vimrc文件

添加内容如下:

pkg install sslscan

然后source下变量:

效果图

安装 nodejs

安装比较方便, 但是在安装的时候报错了

pip2 install whatportis

查了下是这边版本的问题

官方的解决方法如下

disable concurrency in case of libuv/libuv#1459

解决 npm 安装报错

Bash

git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python2 sqlmap.py

我这里修改 length 的是4, 这个好像和 CPU 有关, 总之这里的 length 得指定一个数字.

然后在重新安装下

npm install hexo-cli -g

成功.

MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

安装 mariadb

安装基本数据

启动 mariadb 服务

启动完成后, 这个会话就一直存活, 类似与 debug 调试一样, 只有新建会话才可以操作.

关于隐藏会话可以使用

nohup

命令和

tmux

命令, 这里我建议使用

tmux

命令

新建 termux 会话

由于 mariadb 安装的时候没有设置密码, 当前的mariadb密码为.

直接进入mariadb数据库. 输入exit退出数据库.

修改密码

输入一下命令, 进行密码相关的安全设置:

Bash

pip2 install requests
git clone https://github.com/reverse-shell/routersploit
cd routersploit
python2 rsf.py

输入当前输入密码
因为是密码, 这里默认 回车

Bash

git clone https://github.com/gkbrk/slowloris.git
cd slowloris
chmod +x slowloris.py

设置新密码
这里设置新的 root 密码

Bash

pkg install php
git clone https://github.com/Tuhinshubhra/RED_HAWK.git
cd RED_HAWK
php rhawk.php

其他设置
下面根据个人偏好来进行设置, 没有绝对的要求

Bash

git clone https://github.com/Mebus/cupp.git
cd cupp
python2 cupp.py

使用密码登录数据库

Mysql

git clone https://github.com/UltimateHackers/Hash-Buster.git
cd Hash-Buster
python2 hash.py

Tmux 是一个优秀的终端复用软件,类似 GNU Screen,但来自于 OpenBSD,采用 BSD 授权。一旦你熟悉了 tmux 后, 它就像一个加速器一样加速你的工作效率。

安装 tmux

新建 mysql 会话

上面介绍的mysqld后会一直卡在那里, 强迫症表示接受不了,重启手机, 现在尝试使用tmux来管理会话.

可以看到最下面的提示, 表明现在是在mysql的会话下面操作

启动 mysqld 并断开会话

启动 mysqld

让会话后台运行
使用快捷键组合Ctrl+b + d,三次按键就可以断开当前会话。

使用 mysql

现在那个mysqld会话被放在后台运行了, 整个界面看上去很简介, 使用

可以优雅的使用数据库了.
效果图

关于

tmux

更多进阶的用法这里不在过多介绍了.

termux封装的 php 版本是php 7.2.5

安装 PHP

查看下版本

PHP5.4之后 PHP 内置了一个 Web 服务器, 来在termux下尝试下 PHP Web Server 的简单使.

编写测试文件

在家目录下建一个www文件夹:mkdir www
www文件夹下新建一个index.php文件, 其内容为

启动 WebServer

git clone https://github.com/shawarkhanethicalhacker/D-TECT.git
cd D-TECT
python2 d-tect.py

浏览器访问效果如下:

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性.

安装 nginx 包

切换 root 用户

尝试下能不能解析默认的index.html主页
这个文件在termux上的默认位置为/data/data/com.termux/files/usr/share/nginx/html/index.html
切换 root 用户

默认的普通权限无法启动 nginx, 需要模拟root权限才可以

没有这个命令的话, 手动安装pkg install proot

进入模拟的 root 环境

启动 nginx

在模拟的 root 环境下启动nginx

termuxnginx默认的端口是8080
查看下8080端口是否在运行

Bash

git clone https://github.com/m4ll0k/WPSeku.git
cd WPSeku
pip3 install -r requirements.txt
python3 wpseku.py

然后手机本地直接访问:

http://127.0.0.1:8080

查看下

nginx

是否正常启动.

效果图

这样一个默认的

nginx

服务就起来了, 但是意义不大, 得配置一下可以解析

php

才会有更大的意义.

停止 nginx 服务

这里是直接杀掉占用端口的进程, 具体端口以实际情况为准.

重启 nginx 服务

nginx解析PHP这里单独拿出一级标题来叙述, 成功解析的话, 下面安装wordpress等 cms 就会轻松很多.
nginx 本身不能处理 PHP,它只是个 web 服务器,当接收到 php 请求后发给 php 解释器处理, nginx 一般是把请求发 fastcgi 管理进程处理, PHP-FPM 是一个 PHP FastCGI 管理器, 所以这里得先安装php-fpm.

这里默已经安装了 nginx 和 php, 没有安装的话, 使用pkg install php nginx来进行安装, 参考上面部分进行配置

安装并配置 php-fpm

安装 php-fpm

配置 php-fpm
进入proot环境, 然后编辑配置文件www.conf(先进 proot 可以更方便操作编写相关配置文件)

Bash

git clone https://github.com/UltimateHackers/XSStrike.git
cd XSStrike
pip2 install -r requirements.txt
python2 xsstrike

定位搜索listen找到

pkg install python2

将其改为

配置 nginx

proot环境下, 然后编辑配置文件nginx.conf

pkg install python

下面给出已经配置好的模板文件, 直接编辑替换整个文件即可:

Bash

python2 -m pip install --upgrade pip
python -m pip install --upgrade pip

里面的网站默认路径就是nginx默认的网站根目录:

Bash

pkg install clang
pip install ipython
pip3.6 install ipython

要修改网站默认路径的话, 只需要修改这两处即可.

建立 php 测试文件

/usr/share/nginx/html目录下新建一个phpinfo.php文件, 其内容是:<?php phpinfo();?>

went

启动 php-fpm 和 nginx

proot环境下面分别启动php-fpmnginx, 这里的nginx不在proot环境下启动后会出一些问题, 感兴趣的可以自己去研究看看.

浏览器访问测试

浏览器访问http://127.0.0.1:8080/phpinfo.php 查询php文件是否解析了.

这里只是用wordpress做个典型安利来讲解, 类似地可以安装Discuz,DeDecms等国内主流的 PHP 应用程序.

方法一 使用 PHP 内置的 Web Server

确保安装并配置了phpmariadb, 没有安装好的话, 参考本文中具体细节部分来进行安装.
新建数据库

*** 这里是 mysql 的密码

Sql

pkg install vim-python

下载解压 wordpress

Bash

vim .vimrc

启动 PHP Web Server
到解压后的wordpress目录下, 执行

Bash

set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set enc=utf8
set fencs=utf8,gbk,gb2312,gb18030

然后浏览器访问127.0.0.1:8080开始进行wordperss的安装.
效果图

方法二 nginx+PHP+Mariadb

上面使用的方法一是直接使用 PHP 自带的PHP Web Server来运行的, 看上去不够严谨~, 所以这里用nginx来部署wordpress. 确保安装了PHP,php-fpm,mariadb, 没有安装的话, 参考本文中具体细节部分来进行安装和配置.
新建数据wordpress 下载参考上面的方法一, 这里主要介绍使用nginx去解析wordpress源文件.
当前解压后wordpress的绝对路径是:

Bash

source .vimrc

编辑 nginx.conf

Bash

pkg install nodejs

修改为如下几处:

Cannot read property 'length' of undefined

启动 php-fpm 和 nginx

proot

环境下面分别启动

php-fpm

nginx

, 这里的

nginx

不在

proot

环境下启动后会出一些问题, 感兴趣的可以自己去研究看看.

安装 wordpress
浏览器访问:http://127.0.0.1:8080/wp-admin/setup-config.php进行安装.
效果图

同理安装其他博客也就轻而易举了, 可玩性大大增加~

安装 hexo

部署 hexo 博客环境

然后建立一个目录, 然后到这个目录下初始化 hexo 环境

vim $PREFIX/lib/node_modules/npm/node_modules/worker-farm/lib/farm.js

然后就跑起来一个最基本的 hexo 博客

关于 hexo 博客的详细教程, 建议搭建去参考 hexo 官方文档, 我这里重点在于 termux 其他的不作过多的叙述.

效果图

有时候要操作电脑, 这个时候有了termux, 躺在床上就可以操作电脑了, 岂不是美滋滋~~ 安装openssh

然后就可以直接 ssh 连接你的电脑了

前提是电脑安装了 ssh 服务

Bash

pkg install mariadb

手机连接操作电脑效果图:

emmm 这个需求比较鸡肋, 但是写文字嘛就得写全了~

安装 openssh

同样也需要openssh才可以

启动 sshd

安装完成后,sshd服务默认没有启动, 所以得手动启动下:

因为手机上面低的端口有安全限制, 所以这里的openssh默认的sshd默认的服务是8022端口上的.
ssh的用户名用whoami命令看下.

可以看到

sshd

启动后, 端口才可以看到.

PC 端生成公钥

ssh登录是 key 公钥模式登录, 首先在 PC 端生成秘钥:

Bash

mysql_install_db

执行完成后,会在家目录下创建 3 个文件
id_rsa, id_rsa.pub , known_hosts

拷贝公钥到手机

然后把公钥id_rsa.pub拷贝到手机的data\data\com.termux\files\home\.ssh文件夹中.

将公钥拷贝到验证文件中

Termux下操作

Bash

mysqld

PC 端连接手机 termux

Bash

mysql

效果图

pc 端连接手机 termux 真心鸡肋呀~(忍不住自己吐槽下自己)

Aria2 是一个轻量级多协议和多源命令行下载实用工具。它支持 HTTP / HTTPS, FTP, SFTP, bt 和 Metalink。通过内置 Aria2 可以操作 json - rpc 和 xml - rpc。配置好的话还可以高速下载百度云文件.

安装 aria2

本地启动服务

Bash

mysql_secure_installation

这个rpc服务默认监听的是6800端口, 启动后方便下面的 Web 界面连接操作.

webui-aria2

这是个 Aria2 的热门项目, 把 Aria2 封装在了 Web 平台, 操作起来更加简单便捷。

Enter current password for root (enter for none):

需要 node 来运行, 没有安装的 话使用pkg install nodejs来安装

使用效果图 , 速度蛮快的 , 有兴趣的可以研究如何利用aria2来下载百度云文件, 等你们来探索.

官方项目地址

安装 caddy

官方: 到目前为止,在 Android 上运行 Caddy 有两种方式:Termuxadb, 所以那就顺便折腾一下看看吧:

Bash

Set root password? [Y/n] y
New password:
Re-enter new password:

这一步可能执行要3番钟左右, 耐心等待一下即可.

编写配置文件

内容如下:

Bash

Remove anonymous users? [Y/n] Y                #是否移除匿名用户
Disallow root login remotely? [Y/n] n          #是否不允许root远程登录
Remove test database and access to it? [Y/n] n #是否移除test数据库
Reload privilege tables now? [Y/n] y           #是否重新加载表的权限

这里的8080端口号可以随意指定, 因为手机权限比较低, 所以一般设置1024以上的端口.

注意8080{之间有一个空格

注意/ / sdcard 两个斜杠之间也有一个空格

启动 caddy

效果

浏览器访问:http://127.0.0.1:8080即可, 局域网内的用户访问手机 ip 地址即可.

默认账号和密码为admin,admin.

可以在设置界面里面 设置简体中文, 可以修改更新默认密码.

可以直接查看文件, 也支持Linux命令搜索.

Termux:API,用于访问手机硬件, 实现更多的可玩性, 可以实现如下等功能:

  • 访问电池信息
  • 获取相机设备信息
  • 获取本机设备信息
  • 获取设置剪贴板信息
  • 获取通讯录信息
  • 获取设置手机短信
  • 拨打号码
  • 振动设备

安装 Termux-api

Termux-api Google Play 下载地址

补充一下链接如何在电脑上下载 Google play 上的应用?

安装 Termux-api 软件包

安装完Termux-apiAPP 后,Termux里面必须安装对应的包后才可以实现操作手机底层.

Bash

$ mysql -uroot -p
Enter password: ***apache2

下面只列举一些可能会用到的, 想要获取更多关于Termux-api的话, 那就去参考官方文档.

获取电池信息

Bash

pkg install tmux

可以看到电池的 - 健康状况 - 电量百分比 - 温度情况等

Bash

tmux new -s mysql

获取相机信息

获取与设置剪贴板

查看当前剪贴板内容

设置新的剪贴板内容

mysqld

效果演示

获取通讯录列表

查看短信内容列表

发送短信

支持同时发送多个号码, 实现群发的效果, 官方介绍如下:

mysql -uroot -p

发送测试

Bash

pkg install php

拨打电话

Bash

<?php phpinfo();?>

拨打电话给10001中国电信, 查看下话费有没有欠费~?

php -S 127.0.0.1:8080 -t www/

WiFi 相关

获取当前 WiFi 连接信息

Bash

pkg install nginx

获取最近一次 WiFi 扫描信息

小结

直接操作调动系统底层的话, 可以通过编程来实现自动定时短信发送, 语音播报等 DIY 空间无线

一些无聊有趣的版块, 如果你是一个正经讲究人, 可以跳过这个板块以节约你的阅读时间.

nyancat 彩虹猫

彩虹貓(英语:Nyan Cat)是在 2011 年 4 月上传在 Youtube 的视频,并且迅速爆红于网络,並在 2011 年 YouTube 浏览量最高的视频中排名第五.

Bash

termux-chroot

什么鬼完全 Get 不到国外人的趣味点

终端二维码

Linux 命令行下的二维码, 主要核心是这个网址:http://qrenco.de/

Bash

nginx

如果你不嫌无聊的话还可以扫描这个二维码, 然后就打开我的博客了.

终端地图

一个基于nodejs编写的命令行下的地图.

netstat -an |grep 8080

进入终端地图

操作方法

  • 方向键 移动
  • az键 放大缩小
  • q键 退出

终端下的地图! 讲究人~ 如果你足够无聊的话, 还可以尝试能不能在这个地图上找到自己所在的位置.

安装 Linux

甚至还可以在Termux里面在安装其他的Linux发行版.

由于本文篇幅已经过长了, 这里不在叙述了, 感兴趣, 能折腾的自己去找一些资料. 下面列出目前网友们用Termux可以成功安装的发行版:

  • Ubuntu
  • Arch
  • Fedora
  • Kali Nethunter

Ubuntu

Fedora

内网穿透

使用ngrok或者frp可以将Termux上面搭建的网站映射到外网上去,手机建站也不是不可能了.

Python Jupyter Notebook

Jupyter notebook(又称 IPython notebook),支持运行超过 40 种编程语言。Python 的一个强大的模块, 成功安装的话可以实现比caddy的效果, 支持web下的终端操作, 支持代码高亮运行. 由于这里需要安装大量文件, 加上用户需求比较少, 这一块感兴趣的话可以自己去探索.

下载工具

  • you-get

是一款命令行工具,用来下载网页中的视频、音频、图片,支持众多网站,包含 41 家国内主流视频、音乐网站,如 网易云音乐、AB
站、百度贴吧、斗鱼、熊猫、爱奇艺、凤凰视频、酷狗音乐、乐视、荔枝 FM、秒拍、腾讯视频、优酷土豆、央视网、芒果 TV
等等,只需一个命令就能直接下载视频、音频以及图片回来,并且可以自动合并视频。而对于有弹幕的网站,比如 B 站,还可以将弹幕下载回来

  • BaiduPCS-Go

仿 Linux shell 文件处理命令的百度网盘命令行客户端.

项目地址

可以完美在Termux上运行.

相对来说 国外的 Termux DIY 的氛围比国内好很多, Youtube 上的视频都有很高的播放量:

当然国内也有这么一批执着于Termux的玩家, 只是相对来说还比较小众, 写这篇文章只想让更多的人认识到Termux的生产力, 使用Termux来做一些很 cool 的事情. 期待有更多Termux的优秀文章出现~

使用Android进行开发的尝试

使用Android进行开发的尝试

使用 Android 手机查看和修改 Excel 文件、PowerPoint 文件并连接幻灯机进行演示等办公方式想必大家已经有所了解。今天介绍一下怎样使用 Android 进行软件开发。

Termux

使用 Android 进行软件开发最重要的工具是命令行终端。Termux 就是其中功能最丰富、生态最好的命令行终端。

Termux 可以通过 F-Droid 直接下载 apk 文件进行安装,或从 Google Play Store 下载。

Termux 附带包管理器,能够下载常见的 Linux 命令行工具,如 openssh, wget, curl, git, clang, ninja 等。

pkg install openssh wget curl git clang ninja

Hacker’s Keyboard

有了命令行,就能输入命令了,但是好像输入法没有上下左右键、没有 Ctrl 键,输入命令很不方便。这个时候可以安装 Hacker’s Keyboard 输入法。这个输入法包含 PC 键盘上的所有按键。

如果大家使用的手机正好是和笔者的 BlackBerry Key² 一样拥有实体键盘,可以通过修改~/.termux/termux.properties 文件,在 Termux 中增加缺少的符号。详细参考这里

extra-keys = [ \
['~','`','$','%','^','&','=','|','BACKSLASH'], \
['ESC','<','>', '{', '}','HOME','UP','END','PGUP'], \
['TAB','CTRL','ALT', '[', ']','LEFT','DOWN','RIGHT','PGDN']]

OpenSSH

OpenSSH 是 Termux 中必装软件,安装之后可以启动 SSH 服务器,并通过 SSH 客户端如 PuTTY 远程控制手机,并能通过 SCP 客户端如 WinSCP 访问手机上的 Termux 内部数据和 SD 卡目录。还能从手机远程连接其他开启 SSH 服务器的设备。

安装之后,运行 sshd 即可。登录需要在~/.ssh/authorized_keys 中和通常的 Linux 一样配置公钥。

Termux 可以通过 Termux:Widget 来将一些用户自定义的命令行操作变成 Android Widget 放在桌面上方便点击执行。sshd 应该是必备的条目。

micro

Termux 中自带的文本编辑器为 vi。如果你对 vim 和 emacs 不熟悉,micro 是一个优良的命令行文本编辑器。安装方法如下:

pkg install micro

使用方法非常简单,手指点击即可将光标移动到指定位置,Ctrl+S 保存,Ctrl+Q 退出,Alt+G 显示常用命令,Ctrl+G 显示帮助。

需要注意的是,默认模式下是不会软换行的。另外就是输入’”([等字符会自动输入配对的符号。建议修改这些配置。修改地址为~/.config/micro/settings.json,可以修改下列对应行的内容:

"autoclose": false,
"softwrap": true,

此外,在 SSH 连接时 micro 默认无法复制粘贴,因为光标被 micro 占用。此时可以按住 Shift 键再进行复制粘贴,如在 PuTTY 中按住 Shift 键鼠标选择复制,按住 Shift 键鼠标右键粘贴。

nnn

nnn 是 Termux 上的命令行文件管理器,可用于进行快速文件夹跳转。

安装方式

pkg install nnn

常见的操作包括上下箭头切换光标,左箭头进入上级文件夹,右箭头或回车进入当前光标所在文件夹或打开文件,Q 退出,Ctrl+G 退出并进入到当前文件夹。注意 Ctrl+G 的功能需要配置。需要在~/.bash_profile 中加入如下函数:

n()
{
    export NNN_TMPFILE=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd

    nnn "$@"

    if [ -f $NNN_TMPFILE ]; then
            . $NNN_TMPFILE
            rm -f $NNN_TMPFILE > /dev/null
            pwd >&2
    fi
}

Termux:API

Termux:API 可以实现一些 Android 功能的自动化,但其中最重要的功能是在 PC 和 Android 设备之间进行剪贴板的同步。

安装方式:先下载 apk 安装之后再在 Termux 中运行

pkg install termux-api

通过 SSH 执行下面的命令可以在终端显示 Android 剪贴板的内容

termux-clipboard-get

通过 SSH 执行下面的命令可以将指定内容设置到 Android 剪贴板上

termux-clipboard-set <内容>

clang

clang 的使用方式和正常一样。Termux 不支持 gcc,一般都使用 clang 进行编译。需要注意的是 Termux 中的系统 libc++ 库不支持静态库,只支持动态库,标准 C 库为 Bionic。虽然使用跨平台编译器和 musl libc 也能编译出能够在 Termux 上运行的程序,但是存在一些问题。Termux 不支持 glibc。

安装方式

pkg install clang llvm lld

Mono

mono 没有包支持。但是有社区版本,如笔者编译的 termux-mono 以及一些在 PRoot 运行的 Arch Linux 和 Ubuntu 中运行的版本。以下为 termux-mono 最新版本,不需要 PRoot 即可直接运行。

Android App 开发

虽然 Termux 中没有 JDK, Android SDK 和 Android NDK,但是仍然可以进行 Android App 开发。其中 JDK 可以使用 ecj 代替,Android SDK 可以使用独立的 dx, aapt 和 apksigner 代替,Android NDK 可以使用 clang 代替。使用这些软件通过调用命令行就能生成. so 文件, .dex 文件和. apk 文件。

安装方式

pkg install ecj dx aapt apksigner

需要注意的是,Android SDK API 28 引入的 d8 现在还不支持,所以编译 Java 8 和之后版本的代码会比较困难。

Wcode

Termux 内部查看和编辑代码不方便;Termux 中的文件无法被外部的 App 所查看和编辑;SDCard 模拟分区通常是 FAT32 格式的不支持执行权限,代码放在其中非常不方便。

于是有人想到通过在 Termux 中运行一个服务器,然后在外部连接服务器进行文件编辑的方法。为了实现类似于 Visual Studio Code 的编辑体验,他直接使用了 Visual Studio Code 的 Monaco Editor,在 Termux 中通过 nodejs 运行一个 HTTP 服务器,并在浏览器中进行访问。他的代码在这里。但是效果比较差,只适合在平板上运行。

后面又有人又做了一个类似的程序,就是 Wcode

安装方式

pkg install nodejs
npm install -g wcode

笔者对 Wcode 进行了一些修改,修正了一些 bug,并使其在手机上能更好地运行。

快捷输入

很多常用命令很长,输入不变,可以通过 bash alias 来进行简记。

打开~/.bash_profile,即可增加 alias 指令。笔者的 alias 指令如下:

alias cg=termux-clipboard-get
alias cs=termux-clipboard-set
alias m=micro
alias i='ifconfig | grep '\''inet '\'' | sed '\''s/ *inet//g'\'' | cut -d'\'' '\'' -f2'
alias p='ping www.bing.com'
alias w=wcode

其中 i 为显示当前 IP 地址。

之后退出 Termux 再进入,即可通过简短命令来运行程序了。

七大经典排序算法

七大经典排序算法

常见排序算法可以分为两大类:
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

算法复杂度

1. 冒泡排序 (BubbleSort)

冒泡排序是一种简单的排序算法,是一种减治算法的应用, 通过重复走过要排序的数组,每一次比较两个相邻元素的大小,如果后一个元素比前一个元素小就交换过来,最终完成排序,这种算法的命名也是由最小的元素总是会慢慢从最后 “浮” 到前面来而得名 (每次从无序区间取一个数去无序区间遍历)

步骤:

  • 从第一组两个相邻元素开始比较,依次往后交换
  • 每经过一次排序较大的元素就会被放到后面,直到最大的元素被放到最后,那么下一次排序的时候也就不用用它(最后一个数)和它相邻的前面的数进行比较了,最后的元素就成了 “稳定元素”
  • 重复以上步骤,每一次排序完成,最后的 “稳定元素” 都会增加一个,直到没有可以交换的元素,那么排序就完成了

** 动态图演示:**

** 代码展示**

package com;

import java.util.Arrays;

/**
 * package:com
 * Description:bubbleSort
 * @date:2019/4/27
 * @Author:weiwei
 **/
public class bubbleSort {
    /**
     * 双层循环遍历数组
     * 第一层循环表示循环次数,一次循环解决一个数的问题,一共需要array.length次
     *       更优化的方式是array.length-1次(最后一个数不需要比较)
     * 第二层比较相邻两个数的大小,共需要array.length-2-i次(i是循环到哪个数,2是最后一个数不用比较
     *       下标从 0 开始,所以是减二
     * @param array
     * @return
     */
    private static int[] bubbleSort(int [] array){
        for(int i = 0;i<array.length;i++){
            for(int j = 0;j <= array.length -2-i;j++){

                if(array[j] > array[j+1]){
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
        return array;
    }
    public static void main(String[] args) {
        int[] array = {9,2,4,7,5,8,1,3,6};
        System.out.println(Arrays.toString(bubbleSort(array)));

    }
}

2. 选择排序 (SelectionSort)

选择排序是一种简单直观的排序算法, 是减治算法的应用, 对数据不敏感, 原理是:

首先在未排序序列中找到最小元素, 存放到排列序列的起始位置, 然后在剩余未排序元素中继续寻找最小元素, 然后放到已经排好序序列的末尾, 以此类推, 直到所有元素均排序完毕

步骤:

  • 把要排序的序列分为有序序列和无序序列
  • 遍历序列, 每一次从无序序列找到最小元素, 定义为 minIndex=i, 放到无序序列最前面,
  • 直到无序区间内没有元素, 也就是所有元素都排好序

动图演示:

代码展示:

package Sort;

import java.util.Arrays;

/**
 * Author:weiwei
 * description:
 * Creat:2019/5/2
 **/
public class SelectSort {

    private static int[] SelectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int min = i;
            for (int j = i+1; j < array.length; j++) {
                if (array[j] < array[min]) {
                    min = j;
                }
            }
            int t = array[min];
            array[min] = array[i];
            array[i] = t;

        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = {8,3,7,1,4,6,2,9,5};
        System.out.println(Arrays.toString(SelectSort(array)));
    }
}

3. 插入排序 (Insertion Sort)

插入排序是一种简单直观的排序算法, 是减治算法的应用, 原理是: 通过构建有序数列, 对于未排序数据, 在已排序序列中, 从后往前扫描, 找到对应位置并插入 (每次从无序区间取一个数到有序区间去遍历, 找到插入的位置)

步骤:

  • 从第一个元素开始, 认为第一个元素已经被排序
  • 取出下一个元素, 在已排好序的序列中从后往前扫描
  • 如果该元素 (已排好序) 大于新元素, 将该元素移到下一位置
  • 重复步骤 3, 直到找到已排好序的元素小于或者等于新元素的位置
  • 将新元素插入到该位置后
  • 重复步骤 2-5

动图演示:

代码展示:

package Sort;

import java.util.Arrays;

/**
 * Author:weiwei
 * description:
 * Creat:2019/5/3
 **/
public class insertSort {

    /**遍历查找
     *先查找
     *再搬
     * @param array
     */
    private static void insertSort1(int[] array){
        for(int i =0;i<array.length;i++){
            //有序[0,i)
            //无序[i,array.length)
            //1.在有序区间遍历查找,从后往前查找
            int j;
            for(j=i-1;j >= 0 &&array[i] < array[j];j--){
            }
            //j+1就是要插入的位置
            //插入数据,从后往前搬数据
            int pos = j+1;
            int key = array[i];
            for( int k = i;k>pos;k--){
                array[k] = array[k-1];
            }
            array[pos] = key;
        }
    }

    /**遍历查找
     * 边查找边搬
     * @param array
     */
    private static int[] insertSort2(int[] array){
        int len = array.length;
        int preIndex,current;
        for(int i = 0;i<len;i++){
            preIndex = i-1;
            current = array[i];

            while(preIndex >= 0 && array[preIndex] > current ){
                array[preIndex+1] = array[preIndex];
                preIndex--;
            }
            array[preIndex+1] = current;
        }
        return array;
    }

    /**
     * 二分查找(重点)
     * @param array
     */
    private static void insertSort3(int[] array){
        for(int i = 0;i<array.length;i++){
            int key = array[i];
            //[0,i)
            int left = 0;
            int right = i;

            while(left < right){
                int mid = left + (left - right)/2;
                if(key == array[mid]){
                    left = mid + 1;
                }else if(key < array[mid]){
                    right = mid;
                }else{
                    left = mid +1;
                }
            }
            int pos = left;
            for (int k = i;k>pos;k--){
                array[k] = array[k-1];
            }
            array[pos] = key;
        }
    }

    public static void main(String[] args) {
        int[] array = {9,2,7,4,5,3,1,8,6,5};
        insertSort1(array);
        System.out.println(Arrays.toString(array));
    }
}

4. 希尔排序(shell sort)

希尔排序是第一个突破 O(n^2) 的排序算法,是简单插入排序的改进法, 它与插入排序不同之处在于,它会提前做一个预排序, 给序列分组预排序, 也叫做分组插排, 分的组越多越接近有序

动图演示:

                ![](https://img-blog.csdnimg.cn/2019041519563662.gif)

代码展示:

package Sort;

import java.util.Arrays;

/**
 * Author:weiwei
 * description:希尔排序
 * Creat:2019/5/3
 **/
public class insertSortWithGap {

    private static void insertSortWithGap(int[] array, int gap) {
        for (int i = 0; i < array.length; i++) {
            int key = array[i];
            int j = i - gap;
            for (; j >= 0 && key < array[j]; j = j - gap) {
                array[j + gap] = array[j];
            }
            array[j + gap] = key;
        }
    }

    /**
     * 时间复杂度:
     * 最好情况:O(n)
     * 最坏情况:O(n^2)   比插排最坏情况的概率变小了
     * 平均情况:O(n^1.2 - 1.3)
     * 空间复杂度:O(1)
     * 稳定性:不稳定
     *
     * @param array
     */
    private static int[] shellSort(int[] array) {
        int gap = array.length;
        while (true) {
            //gap = gap /2;
            gap = (gap / 3) + 1;

            insertSortWithGap(array, gap);

            if (gap == 1) {
                break;
            }
        }
        return array;
    }

    public static void main(String[] args) {
        int [] array = {9,3,1,4,7,2,8,6,5};
        System.out.println(Arrays.toString(shellSort(array)));
    }
}

5. 归并排序(Merge sort)

归并排序是建立在一种建立在归并算法上一种有效的排序方法,该方法是采用分治算法的一个典型的应用,对数据不敏感, 将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列间有序,算法复杂度为 (nlogn)

算法描述:

  1. 把长度为 n 的序列分为两个长度为 n/2 的子序列

  2. 对这两个子序列分别归并排序

  3. 将两个排序好的子序列合并成一个最终的有序序列

动图演示:

代码展示:

package Sort;

import java.util.Arrays;

/**
 * Author:weiwei
 * description:归并排序(递归方式)
 * Creat:2019/4/27
 **/
public class MergeSort {
    private static void merge(int[] array,int low,int mid,int high,int[] extra){
        int i = low;  //遍历[low,mid]
        int j = mid;  //遍历[mid,high]
        int x = 0;    //遍历extra

        while(i < mid && j < high){
             if(array[i] <= array[j]){
                 extra[x++] = array[i++];
             }else{
                 extra[x++] = array[j++];
             }
        }
        while(i < mid){
            extra[x++] = array[i++];
        }
        while(j < high){
            extra[x++] = array[j++];
        }
        for(int k = low;k < high;k++){
            array[k] = extra[k - low];
        }
    }
    private static void mergeSortInner(int[] array,int low,int high,int[] extra){
        if (low == high - 1){
            return;
        }
        if(low >= high){
            return;
        }

        //平均切分
        int mid = low + (high - low)/2;
        //[low,mid)+[mid,high)
        //2.分治算法处理两个小区间
        mergeSortInner(array,low,mid,extra);
        mergeSortInner(array,mid,high,extra);

        //左右两个小区间已经有序了
        merge(array,low,mid,high,extra);
    }

    private static void mergeSort(int[] array) {
        int[] extra = new int [array.length];//设定长度,避免造成空间浪费
        mergeSortInner(array,0,array.length,extra);
    }

    //非递归方式
    private static void mergeNoR(int[] array){
        int[] extra = new int [array.length];
        for(int i = 1;i<array.length;i *= 2){
            for(int j =0;j<array.length;j +=2 * i){
                int low = j;
                int mid = low + i;
                if( mid >= array.length){
                    continue;
                }
                int high = mid + i;
                if(high > array.length){
                    high = array.length;
                }
                merge(array,low,mid,high,extra);
            }
        }
    }

    public static void main(String[] args) {
        int[] array1 = {9,3,1,5,4,2,7,6,8};
        int[] array2 = {8,3,1,2,5,3,7,6,2};
        mergeSort(array1);
        mergeNoR(array2);
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
}

6. 快速排序 (Quick Sort)

快速排序的基本思想:

    在要排序的序列中选择一个基准值 (通常选择最右边的值为基准值), 然后遍历整个序列, 每个数都和基准值进行比较, 并且发生一定的交换, 遍历结束后使得比基准值小的数(包括等于) 都在基准值的左边, 比基准值大的数 (包括等于) 都在基准值的右边, 然后采用分治算法的思想, 分别对两个小的区间进行同样的方式处理, 直到区间的 size=0 或者 = 1, 就说明序列已经有序了, 快速排序完成

算法描述:

快速排序使用分治算法来把一个序列分为两个子序列, 具体算法描述如下:

  1. 从序列中选择最右边的数作为基准, 称为 “基准值”(pivot);

  2. 遍历排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一 边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

     ![](https://img-blog.csdnimg.cn/2019050416332747.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIyNDUzOQ==,size_16,color_FFFFFF,t_70)  
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

快速排序的步骤:

  1. 选择基准值 (选择基准值有三个方法)
  • 选择最边上作为基准值 (左右都可以)
  • 随机法 (random.nextInt())
  • 三数取中法 [对于第二三中方法, 确定基准值后, 将基准值交换到最边上]
  1. 分割 (partition 操作), 比基准值 <= 在基准值左边, 比基准值 >= 在基准值右边, partition 操作也有三种方法:
  • Hover 法 (左右遍历)
  • 挖坑法 (左右遍历)
  • 前后下标法 (前后遍历)
  1. 用分治法处理左右两个小区间, 直到区间的 size == 1(已经有序) 或者 size == 0, 则停止排序 动态图展示:

代码展示:

快速排序

package Sort;

import java.util.Arrays;

/**
 * Author:weiwei
 * description:快速排序
 * Creat:2019/4/27
 **/
public class QuickSort {

    private static void swap(int[] array,int i,int j){
        int t = array[i];
        array[i] = array[j];
        array[j] = t;
    }

    private static int  partition1(int[] array,int left,int right){
        int begin = left;
        int end = right;
        int pivot = array[right];
        while(begin < end){
            while( begin < end && array[begin] <= pivot){
                begin++;  //当前数比基准值小,就往后遍历,遇到比基准值大的数才停下来
            }
            while(begin < end && array[end] >= pivot){
                end--;    //当前数比基准值大,就往前遍历,遇到比基准值小的数才停下来
            }
            swap(array,begin,end); //否则,遍历无法继续,交换所指向的值,再继续遍历
        }
        swap(array,begin,right);  //遍历到最后begin == end,将right的值与begin的值交换
        return begin;             //此时,序列中基准值左边所有的值就比基准值小,右边的数就比基准值大

    }
private static void quickSortInner(int[] array,int left,int right){
        if(left > right){
            //size == 1 已经有序
            return;
        }
        if(left == right){
            //size == 0
            return;
        }
        int originIndex = medianofthree(array,left,right);
        swap(array,originIndex,right);

        //要排序的区间是array[left,right]
        //1.找基准值 array[right]
        //2.遍历整个区间,把区间的为三部分
        int pivotIndex = partition1(array,left,right);
        //3.分治算法
        //用相同的方式处理两个小区间,直到size == 1 | size == 0
        //比基准值小的区间[left,pivotIndex-1]
        quickSortInner(array,left,pivotIndex-1);
        //比基准值大的区间[pivotIndex+1,right]
        quickSortInner(array,pivotIndex+1,right);
    }
    private static void  quickSort(int[] array){
        quickSortInner(array,0,array.length -1);
    }

    public static void main(String[] args) {
        int[] array = {9,3,1,5,4,2,7,6,8};
        quickSort(array);
        System.out.println(Arrays.toString(array));
    }
}

用 Hover 方法进行 partition 操作

//Hover法做partition操作
    private static int  partition1(int[] array,int left,int right){
        int begin = left;
        int end = right;
        int pivot = array[right];
        while(begin < end){
            while( begin < end && array[begin] <= pivot){
                begin++;  //当前数比基准值小,就往后遍历,遇到比基准值大的数才停下来
            }
            while(begin < end && array[end] >= pivot){
                end--;    //当前数比基准值大,就往前遍历,遇到比基准值小的数才停下来
            }
            swap(array,begin,end); //否则,遍历无法继续,交换所指向的值,再继续遍历
        }
        swap(array,begin,right);  //遍历到最后begin == end,将right的值与begin的值交换
        return begin;             //此时,序列中基准值左边所有的值就比基准值小,右边的数就比基准值大

    }

用挖坑法做 partition 操作

//用挖坑法做partition操作
    private static int partition2(int[] array,int left,int right){
        int begin = left;
        int end = right;
        int pivot = array[right];
        while(begin < end){
            while(begin < end && array[begin] <= pivot){
                begin++;   //当前数比基准值小,就往后遍历,遇到比基准值大的数才停下来
            }
            array[begin] = array[end];  //否则,将end的值赋给begin
            while(begin < end && array[begin] <= pivot){
                end--;    //当前数比基准值大,就往前遍历,遇到比基准值小的数才停下来
            }
            array[end] = array[begin]; //否则,将begin的值赋给end
        }
        array[begin] = pivot;  //最终begin == end时,将pivot的值赋给begin
        return begin;
    }

用前后遍历的方法 partition 操作

//前后下标法做partition操作
    private static int parttiton3(int[] array,int left,int right){
        int d = left;
        for(int i = left;i<right;i++){
            if(array[i] < array[right]){
                swap(array,d,i);
                d++;
            }
        }
        swap(array,d,right);
        return d;
    }

选择基准的方法: 三数取中法

//三数取中
    private static int medianofthree(int[] array,int left,int right) {
        int mid = left + (right - left) / 2;
        if (array[left] > array[right]) {
            if (array[left] < array[mid]) {
                return left;
            } else if (array[mid] > array[right]) {
                return mid;
            } else {
                return right;
            }
        } else {
            if (array[right] < array[mid]) {
                return right;
            } else if (array[mid] > array[left]) {
                return mid;
            } else {
                return left;
            }
        }
    }

7. 堆排序 (Heap Sort)

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。是减治算法的应用, 对数据不敏感, 堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

算法描述

 1. 将初始待排序关键字序列构建成大堆,此堆为初始的无序区;  
 2. 选择最大的元素 (堆顶元素) 放到无序序列最后面,此时得到新的无序区和新的有序区, 每次在无序序列中选择最大的的元素放到无序序列最后面,  
 3. 直到最后叶子结点, 不再向下调整, 堆排序完成  

动态图演示:

                                  ![](https://img-blog.csdnimg.cn/20190421095934922.gif)

代码展示:

package com.bittech;

/**
 * Author:weiwei
 * description:堆排序
 * Creat:2019/4/27
 **/
public class heapSort {

    private static void heapify(int[] array,int size,int index){
        //判断index是不是叶子结点
        while(2*index+1 < size){
            //找到最大孩子的下标
            int max = 2 * index + 1;
            if(max + 1 <size && array[max+1] > array[max]){
                max = 2 * index + 2;
            }

            //3.判断最大得孩子和根的值
            if(array[index] < array[max]){
                swap(array,index,max);

                index = max;
            }else{
                //根的值比较大,不需要交换,可以直接退出了
                break;
            }
        }
    }
    private static void createHeap(int[] array){
        //[从最后一个非叶子节点的下标,根]  向下调整
        //[(array.length-2)/2,0]
        for(int i = (array.length-2/2);i>=0;i--){
            heapify(array,array.length,i);
        }
    }
    private static void swap(int[] array,int i,int j){
        int t =array[i];
        array[i] = array[j];
        array[j] = t;

    }
    private static void heapSort(int[] array){
        //建堆  大堆
        createHeap(array);

        //减治处理
        for(int i =0;i<array.length;i++){
            //有序[length - i,length]
            //无序[0,length - i - 1]
            //最大的数在[0],最大的数应该放到的下标是
            //[length-i-1]
            swap(array,0,array.length -1-i);
            //处理[0]无序剩余部分满足堆的性质
            //无序[0,length-i-2]
            //有序[length-i-1,length]
            //size剩余无序部分的长度
            heapify(array,array.length-1-i,0);
        }
    }

    public static void main(String[] args) {
        int[] array = { 9, 5, 2, 7, 3, 6, 8, 8, 4, 9, 3, 1, 2 };
        heapSort(array);
        for (int item: array) {
            System.out.print(item + " ");
        }
        System.out.println();
    }
}
Sematic Web & Knowledge Graph

Sematic Web & Knowledge Graph

Sematic Web & Knowledge Graph

By Prof. Christophe Roche; KETRC, LCU; 14th Nov. ,2019

Table of Contents

  • Society of Information & Knowledge Graph
  • Building KG
    • Resource Description Framework
    • Definitions
    • Vocabularies
  • Querying KG
    • SPARQL
  • Exercises

Def of…

IoT:

Digital devices & objects that connect automatically without human-human interaction.

KG:

Knowledge in a machine readable form

RDF Resource Description Framework 资源描述框架

什么是什么

RDFS 资源描述框架定义集

Differences between RDF & RDFS

RDF - Properties - 属性

RDFS - Domain & range - 领域和范围

FOAF Friend of a friend

​ a machine-readable ontology describing persons, their activities and their relations to other people and objects. Anyone can use FOAF to describe themself. FOAF allows groups of people to describe social networks without the need for a centralised database.

SKOS 简单知识组织系统 Simple Knowledge Organization System

URL Universal Resources Location

URI Universal Resources Identifier 统一资源标识符

URN Universal Res. Name

IRI Internationalized …

字典 - 本体 - 术语

EDM :Entity Data Model 实体数据模型

前加问号代表一个变量

Example: looking for representations of Mozart in France National Lib

  • Looking for resources which are humans

  • ?x is-a Person

Query Patterns

ontoterminology - Ontology and Terminology

References

PREFIX foaf: http://xmlns.com/foaf/0.1/
PREFIX owl: http://www.w3.org/2002/07/owl#
PREFIX rdfs: http://www.w3.org/2000/01/rdf-schema#
PREFIX owl: http://www.w3.org/2002/07/owl#
PREFIX bibo: http://purl.org/ontology/bibo/
PREFIX dc: http://purl.org/dc/elements/1.1/
PREFIX dcterms: http://purl.org/dc/terms/