disk savvy,Windows 硬盘空间分析工具
2017-04-23 software windows 1 mins 1 图 101 字
Disk Savvy 是一个直接的硬盘空间分析工具,分析多个目录的磁盘,网络共享或NAS存储设备的使用情况。如图:
下载链接:http://pan.baidu.com/s/1jIPxiXg 密码:ofiq
Disk Savvy 是一个直接的硬盘空间分析工具,分析多个目录的磁盘,网络共享或NAS存储设备的使用情况。如图:
下载链接:http://pan.baidu.com/s/1jIPxiXg 密码:ofiq
又遇到了系统磁盘满的问题了。记录一下事后解决的流程。
首先进入自己认为可能出现问题的目录,使用du命令查看该目录下文件的大小(包括文件夹):
du --max-depth=1 -ah 2> /dev/null | sort -hr | head
查出问题源后,显然就是删除 rm 了。
如果这个文件是没有进程访问的,rm 之后是会立刻释放空间的,df -h
就可以看到了。如果有进程访问该文件,那事实上系统还是认为自己没有空间。解决的办法就是 kill 掉这个进程。
所以先查看哪个进程在访问这个文件:
lsof |grep file
显示如下:
oracle 12639 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc (deleted)
kill掉进程即可:
kill -9 12639
话又说回来,这个只是事后不久,解决问题最好的办法是是事先预警,将问题扼杀在摇篮里。
这是一个用于生成图片验证码的 Laravel 插件。Github 地址: https://github.com/mewebstudio/captcha 这个项目基于 Intervention Image
使用 Composer 安装,修改文件 composer.json
如下,然后 composer update mews/captcha
{
"require": {
"laravel/framework": "5.0.*",
"mews/captcha": "~2.0"
},
"minimum-stability": "dev"
}
或者直接
composer require mews/captcha
Windows 需要在 php.ini 中打开 php_gd2.dll
扩展。
在 provider 中注册插件:
config/app.php
'providers' => [
// ...
Mews\Captcha\CaptchaServiceProvider::class,
]
'aliases' => [
// ...
'Captcha' => Mews\Captcha\Facades\Captcha::class,
]
生成配置文件:
$ php artisan vendor:publish
然后会在config目录下生成配置文件 captcha.php
return [
'characters' => '2346789abcdefghjmnpqrtuxyzABCDEFGHJMNPQRTUXYZ',
'default' => [
'length' => 5,
'width' => 120,
'height' => 36,
'quality' => 90,
],
'flat' => [
'length' => 6,
'width' => 160,
'height' => 46,
'quality' => 90,
'lines' => 6,
'bgImage' => false,
'bgColor' => '#ecf2f4',
'fontColors'=> ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f', '#f57c00', '#795548'],
'contrast' => -5,
],
'mini' => [
'length' => 3,
'width' => 60,
'height' => 32,
],
'inverse' => [
'length' => 5,
'width' => 120,
'height' => 36,
'quality' => 90,
'sensitive' => true,
'angle' => 12,
'sharpen' => 10,
'blur' => 2,
'invert' => true,
'contrast' => -5,
]
];
安装完成!
// [your site path]/Http/routes.php
Route::any('captcha-test', function()
{
if (Request::getMethod() == 'POST')
{
$rules = ['captcha' => 'required|captcha'];
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
echo '<p style="color: #ff0000;">Incorrect!</p>';
}
else
{
echo '<p style="color: #00ff30;">Matched :)</p>';
}
}
$form = '<form method="post" action="captcha-test">';
$form .= '<input type="hidden" name="_token" value="' . csrf_token() . '">';
$form .= '<p>' . captcha_img() . '</p>';
$form .= '<p><input type="text" name="captcha"></p>';
$form .= '<p><button type="submit" name="check">Check</button></p>';
$form .= '</form>';
return $form;
});
captcha();
Captcha::create();
captcha_src();
Captcha::src();
captcha_img();
Captcha::img();
captcha_img('flat');
Captcha::img('inverse');
扩展包使用了自定义验证规则方式扩展了验证规则,我们只要在对应的 Controller 添加以下的规则即可:
$this->validate($request, [
'captcha' => 'required|captcha'
]);
BBR 已经出来将近半年了。 它解决问题的出发点在于:
关于 BBR 加速原理的细节,可以参考知乎这篇文章,讲的很详细。《Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?》
这篇文章我记录一下开启过程。事先提个醒,在生产环境中不轻易升级内核。就我实践的结果,这次升级把我的Docker搞坏了,服务无法启动。
在 Kernel.Ubuntu.com找到版本号文件夹,amd64 的 linux-image 中含有 generic 这个 deb 包的。以我Debian 64位的系统,于是安装过程如下:
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10/linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb
dpkg -i dpkg -i linux-image-4.10.0-041000-generic_4.10.0-041000.201702191831_amd64.deb
安装完成后重启。
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
如果以下命令输出有bbr,那么已经成功开启BBR.
sysctl net.ipv4.tcp_available_congestion_control
如果以下命令输出有tcp-bbr,那么BBR正在运行.
lsmod | grep bbr
执行完以下命令,重启后即可.
sed -i '/net\.core\.default_qdisc=fq/d' /etc/sysctl.conf
sed -i '/net\.ipv4\.tcp_congestion_control=bbr/d' /etc/sysctl.conf
sysctl -p
如果是租用的云服务器,要注意确认系统内核是否被改过,有无影响。例如如果是linode的服务器,要注意将启动配置修改成使用grub2内核模式启动。
这篇文章转载自文末的三篇引用。
Jekyll 是一个基于 Ruby 的静态网站生成器,而 gem
是 Ruby 的包管理器。bundle
是一个用于管理项目 gem 依赖关系的工具,它通过 Gemfile
和 Gemfile.lock
文件来跟踪和安装依赖项。
简单来说,gem
是 Ruby 的全局包管理器,而 bundle
是用于管理项目级别的依赖关系的工具。
在使用 Jekyll 时,通常建议使用 bundle
来管理项目的 gem 依赖,以确保每个项目都有一致的 gem 环境。这样可以防止不同项目之间的 gem 版本冲突,确保项目能够正确运行。
首先,你得有 Ruby。对于 Mac 用户,可以使用 Homebrew 安装。
brew install ruby
然后:
$ gem install jekyll
Jekyll 3.3.0 之后开始采用 Bundler 方式运行。安装时,需要同时安装 Bundler:
$ gem install jekyll bundler
所以所有命令可能也需要使用 Bundler:
$ bundle exec jekyll serve
jekyll new
创建新站点$ jekyll new my-jekyll-site
也可以:
$ mkdir my-jekyll-site
$ cd my-jekyll-site
$ jekyll new .
jekyll serve
在本地运行站点以下三种使用方式是等价的:
$ jekyll serve
$ jekyll server
$ jekyll s
通过 http://localhost:4000
进行访问。
jekyll build
生成站点以下两种使用方式是等价的:
$ jekyll build
$ jekyll b
通过 --destination
指定目标路径:
$ jekyll build --destination=/path/to/site
jekyll new-theme
创建主题$ jekyll new-theme my-theme
修改 Gemfile之后重新install
bundle install
一个基本的 Jekyll 站点目录结构:
.
├── _config.yml
├── _data
| └── members.yml
├── _drafts
| ├── begin-with-the-crazy-ideas.md
| └── on-simplicity-in-technology.md
├── _includes
| ├── footer.html
| └── header.html
├── _layouts
| ├── default.html
| └── post.html
├── _posts
| ├── 2007-10-29-why-every-programmer-should-play-nethack.md
| └── 2009-04-26-barcamp-boston-4-roundup.md
├── _sass
| ├── _base.scss
| └── _layout.scss
├── _site
├── .jekyll-metadata
└── index.html # 也可以是 index.md
include
进行引用。{{ content }}
用于表示被继承者的内容。2016-12-01-my-article.md
。.gitignore
中。_config.yml
是整个站点的整体配置,以下是所有配置项和默认值:
# Where things are
source: .
destination: ./_site
plugins_dir: _plugins
layouts_dir: _layouts
data_dir: _data
includes_dir: _includes
collections:
posts:
output: true
# Handling Reading
safe: false
include: [".htaccess"]
exclude: ["node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"]
keep_files: [".git", ".svn"]
encoding: "utf-8"
markdown_ext: "markdown,mkdown,mkdn,mkd,md"
# Filtering Content
show_drafts: null
limit_posts: 0
future: false
unpublished: false
# Plugins
whitelist: []
gems: []
# Conversion
markdown: kramdown
highlighter: rouge
lsi: false
excerpt_separator: "\n\n"
incremental: false
# Serving
detach: false
port: 4000
host: 127.0.0.1
baseurl: "" # does not include hostname
show_dir_listing: false
# Outputting
permalink: date
paginate_path: /page:num
timezone: null
quiet: false
verbose: false
defaults: []
liquid:
error_mode: warn
# Markdown Processors
rdiscount:
extensions: []
redcarpet:
extensions: []
kramdown:
auto_ids: true
footnote_nr: 1
entity_output: as_char
toc_levels: 1..6
smart_quotes: lsquo,rsquo,ldquo,rdquo
input: GFM
hard_wrap: false
footnote_nr: 1
Jekyll 整个站点的配置是站点根目录下的 _config.yml
文件,而 _layout
, _posts
等目录下的文件中也可以有自己的变量。文件头部的 yaml
配置被称作 Front Matter。
可以使用 defaults
设置一个路径下 Front Matter 默认值。
defaults:
- scope:
path: ""
type: weekly
values:
layout: weekly
title: 技术周刊
exclude
用于忽略文件或文件夹,其中 _config.yml
和以.
开头的文件或文件夹都会被自动忽略。后续版本,node_modules
等文件夹也被隐式忽略了(参考 _config.yml 章节)。
exclude:
- Gemfile
- Gemfile.lock
- README.md
- LICENSE
Jekyll 没有内置分页功能,而是提供了一个分页插件 jekyll-paginate
。jekyll-paginate
仅在特定的默认条件下生效,如果你对网站结构有自己的一套,jekyll-paginate
可能是无法满足需求的。
限制如下:
index.html
permalink
如果想继续使用,请详细阅读 http://jekyllrb.com/docs/pagination/。这是一个复杂的问题!
Jekyll 提供了文章摘要摘取功能,通过 post.excerpt
就可以获得摘要内容。
我们也可以设置摘取摘要的分隔符:
excerpt_separator: <!--more-->
由于是静态站点,我们没发内建评论系统,因此需要引入一些纯前端就可以使用的评论系统。国外推荐:disqus,国内推荐:duoshuo。
可以认为,不在 _post
目录下的页面都是 Page 而不是 Post,其它方面区别不大。
并不是每个页面都是独立“页面”和以日期为顺序的“博文”,因此 Jekyll 引入了 Collection。Collection 可以根据路径定义一类具有相同属性的页面集合。Collection 也可以通过 Front Matter 设定默认值。
Data 相当于动态页面中的数据库,Jekyll Data 支持 yaml
, json
, CSV
三种格式,可以通过 site.data
直接访问。
例如:
团队成员有 Fa, Li, Zhang 三人,于是我们在默认路径 _data
创建一个数据文件 member.yml
:
- name: Fa
- name: Li
- name: Zhang
在页面中显示团队成员列表:
{% for member in site.data.member %}
<ul>
<li>{{ member.name }}</li>
</ul>
{% endfor %}
Liquid 是一个开源模版语言,由电商公司 Shopify 实现,用 Ruby 编写。Shopify 自己使用 Liquid 来构建自己电商网站模板生态。
详细文档请参考 https://shopify.github.io/liquid/。
Jekyll 实用 Liquid 作为模版引擎,构建页面。
<title>
{{ page.title }}
</title>
其中,Jekyll 预设了 site
, layout
, page
, content
四个全局变量。
Liquid 的逻辑判断跟 Ruby 完全一致。
if
, else if
, else
在 Liquid 中的对应是 if
, elsif
, else
。同时,Liquid 也可以使用 Ruby 特有的 unless
。switch
, case
在 Liquid 中的对应是 case
, when
。为了简单,只以 if
为例:
{% if page.disable_syntax_highlight != true %}
<link rel="stylesheet" href="{{ site.assets }}/css/zenburn.css">
{% endif %}
在 Liquid 中可以通过 for
in
语法遍历数组,并且支持一般语言循环中的 continue
和 break
。
除此之外,还可以使用 offset
和 limit
控制遍历范围,通过 reversed
进行倒序。
{% for post in site.posts reversed %}
<a href="{{ post.permalink }}">{{ post.title }}</a>
{% endfor %}
详见 https://shopify.github.io/liquid/tags/iteration/
使用 assign
进行赋值:
{% assign my_variable = false %}
使用 capture
进行捕捉赋值:
{% capture my_variable %}
I am being captured.
{% endcapture %}
Liquid Filters 是一种针对 Liquid 中变量的过滤器,语法是:
{{ var | filter: "param" }}
除去 Liquid 自身丰富的过滤器之外,Jekyll 还额外扩展了一些实用的:
cgi_escape
url_escape
xml_escape
markdownify
scssify
sassify
jsonify
where
where_exp
group_by
sort
详见 http://jekyllrb.com/docs/templates/#filters
在全局根结点site中有 site.tags.TAG 和 site.categories.category.CATEGORY 变量,可以列出所有拥有TAG标签或者CATEGORY的文章的列表(这里的变量只能写英文)。 另外site.[CONFIGURATION_DATA]使得所有在_config.yml中的数据都能够通过site变量调用。
和平常的解释性语言很像
{ % for post in site.posts % }
<a href="{ { post.url } }">{ { post.title } }</a>
{ % endfor % }
注意逻辑“与或”分别是and
,or
{ % if user % }
Hello
{ % endif % }
# Same as above
{ % if user != null % }
Hello
{ % endif % }
{ % if user.name == 'tobi' % }
Hello tobi
{ % elsif user.name == 'bob' % }
Hello bob
{ % endif % }
{ % if user.name == 'tobi' or user.name == 'bob' % }
Hello tobi or bob
{ % endif % }
{ % if user.name == 'bob' and user.age > 45 % }
Hello old bob
{ % endif % }
{ % if user.name != 'tobi' % }
Hello non-tobi
{ % endif % }
# Same as above
{ % unless user.name == 'tobi' % }
Hello non-tobi
{ % endunless % }
# Check for the size of an array
{ % if user.payments == empty % }
you never paid !
{ % endif % }
{ % if user.payments.size > 0 % }
you paid !
{ % endif % }
{ % if user.age > 18 % }
Login here
{ % else % }
Sorry, you are too young
{ % endif % }
# array = 1,2,3
{ % if array contains 2 % }
array includes 2
{ % endif % }
# string = 'hello world'
{ % if string contains 'hello' % }
string includes 'hello'
{ % endif % }
{ % for post in site.posts % }
{ { post.url } } { { post.title } }
{ { post.excerpt | remove: 'test' } }
{ % endfor % }
remove 可以删除变量中的指定内容
{ { post.url | remove: 'http' } }
{ { post.excerpt | strip_html } }
{ % highlight ruby linenos % }
\# some ruby code
{ % endhighlight % }
{ { array | size } }
{ % assign index = 1 % }
# Select all the objects in an array where the key has the given value.
{ { site.members | where:"graduation_year","2014" } }
{ { site.pages | sort: 'title', 'last' } }
{ { site.data.projects | jsonify } }
{ { page.tags | array_to_sentence_string } }
{ { page.content | number_of_words } }
{ % for post in site.posts limit:20 % }
Jekyll 支持使用插件进行扩展,插件的类型分为:Generators、Converters、Commands、Hooks、Liquid Tag、Liquid Filter 等。
如果希望开发插件,请参考 http://jekyllrb.com/docs/plugins/
基于 Gem 的方式
对于已经发布到 RubyGems 的插件,推荐使用这种方式。只需要在 _config.yml
中 gems
字段加入相应插件名称即可。
基于本地文件
对于没有发布的插件,可以在 _plugins
文件夹中直接引入 *.rb
Ruby 源文件。
Jekyll “必备”的插件,因为这是 Jekyll 程序的依赖,只是因为程序结构设计被剥离成了插件。它在本地预览时,提供文件变更的自动更新,让我们每次刷新都能自动看到最新的内容。
Jekyll Watch 是自动开启的:
$ jekyll serve --watch
安装了 Jekyll Compose 后,Jekyll 会额外提供一些命令,便于发布管理博文。
创建草稿:
$ jekyll draft
创建新博客:
$ jekyll post
创建新博客:
$ jekyll page
发布草稿:
$ jekyll publish
撤销发布:
$ jekyll unpublish
Jekyll Admin 是一个 CMS 风格的图形化后台管理插件,可以在本地给用户提供服务。
Jekyll SEO Tag 帮你生成一大堆 Meta 标签。
你可以通过 Jemoji 在 Jekyll 生成的网站中,加入自己 Emoji 表情。
Emoji 语法采用 GitHub 的语法风格。
Jekyll Mentions 允许你在文章中直接“@” GitHub 或其它网站用户。
你可以通过 Jekyll Feed 在 Jekyll 生成的网站中,生成 RSS 源。
Jekyll Import 支持从一些国外的主流站点导入博文,如 Blogger, WordPress 和 Tumblr 等,同样也支持 RSS 和 CSV 等数据格式导入。
Jekyll Archives 用于生成带标签和分类的『存档』页面。
Jekyll Redirect From 提供页面跳转功能,比较简单,也可以自行通过 JavaScript 实现。
创建一个名为 your-github-username.github.io
的 Repo,your-github-username
是你的用户名。
只需在 Repo 中设置 GitHub Pages 的 Source,就可以开启 GitHub Pages,支持 master
, gh-pages
, master
中 /docs
文件夹三种 Source。
由于安全性等原因的考虑,在 GitHub Pages 平台上只能使用白名单中的 7 个 Jekyll 插件。它们分别是:Jekyll Sitemap, Jekyll SEO Tag, github-metadata, Jekyll Feed, Jekyll Redirect From, Jemoji 和 Jekyll Mentions。
详见 https://help.github.com/articles/adding-jekyll-plugins-to-a-github-pages-site/。
从 2016 年 5 月 1 日起,GitHub Pages 只支持 kramdown 作为 Markdown 引擎。
详见 https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0。
.nojekyll
文件可以跳过 Jekyll 解析GitHub Pages 支持 Jekyll 或者原始文件。最初 GitHub Pages 只支持 Jekyll,后来 GitHub 允许在 Repo 根目录下添加 .nojekyll
跳过解析。
详见 https://github.com/blog/572-bypassing-jekyll-on-github-pages。
在 Source 的根路径下,创建 CNAME
写入域名,然后把 DNS 解析到 GitHub Pages 的 IP:192.30.252.153
和192.30.252.154
。
详见 https://help.github.com/articles/using-a-custom-domain-with-github-pages/
任何一个项目的 Repo,都可以开启这个项目的 GitHub Pages。开启方式同个人主页。
如项目:crispgm/gsm,设置完成后,就可以通过 https://crispgm.github.io/gsm/ 进行访问。
site.github
获得 Repo 的信息由上面所说的 github-metadata 提供服务,通过 GitHub API 获取 Repo 的信息。当然,在本地环境下,也可以通过手动安装 github-metadata 来使用。
GitHub 的付费用户建立的私有项目 Private Repo,也可以开启 GitHub Pages。
gh-pages
分支作为源的情况下关闭有些奇怪的设定,真想关闭直接删除掉,在 Source 选择 None 就好。
在 laravel Eloquent ORM 中我们经常用到 with 这一方法来关联表。普通的使用场景也很简单,例如
class Talent{
public function account()
{
return $this->belongsTo('App\Models\Account', 'account_uuid');
}
}
使用 Talent::with(‘account’) 就可以获取到关联数据。如果希望左联查询,可以在行内使用如下语句实现:
$yesterdayCreateTalent = Talent::with(['account' => function ($q) {
$q->yesterday();
}])->get();
也可以拆分方法进行使用。
// Talent
public function test()
{
return $this->belongsTo('App\Models\Account', 'account_uuid')->yesterday();
// or
// return $this->account()->yesterday();
}