你还在玩游戏?人家已经在做将军了

对于我们这些生长于正常和平环境的人们而言,十几岁的年纪应该正是求学的大好时光,国内普通的青少年在这个年纪基本不是在读初中就是在熬高中,上战场对他们来说简直是天方夜谭。但是国外就不一样了,尤其是在一些战火纷飞的中东和非洲地区,使用未成年的少年兵进行作战,对冲突各方而言基本都是司空见惯的事情。近日,也门战场上就出现了一名与众不同的少年军人,看他的年龄应该是只有15岁左右,但是军装上的军衔显示他已经是一名正儿八经的也门陆军少将了,不过这名将军来前线并不是来参与战斗的,而是来检查是否有少年兵参战的。

6

 

图中带红色贝雷帽的就是娃娃少将

图中这名带着红色贝雷帽的少将名叫穆罕默德·萨利赫·本·贾拉尔,是也门儿童政府的国防部长,这个儿童政府是个很有趣的组织,看有关资料的介绍,这个组织似乎和联合国儿童保护机构有关系,它在也门主要是和官方机构合作,从事保护儿童的一些事物。这次这名年轻的将军来马里布省前线主要是看望这里的士兵,并检查前线作战的部队是否有使用少年兵的情况。根据联合国近几年的调查,也门战场实际是存在着很严重的招募和使用儿童作战的情况的,不管是胡赛武装,还是亲哈迪的正规军都存在着这一现象。

 

真正的少将

造成这一现象的原因是多方面的,不过最主要原因还是在于这个国家教育资源的缺乏,由于连年战争,也门国内的教育体系遭受到了重大破坏,教师和学校缺乏,适龄儿童没有学上,再加上长年的战争和冲突导致百业凋敝,大量的失学儿童也没有事可干,这就给各派武装招募少年和儿童提供了条件。在2016年之前,也门政府军是公开招募有大量的未成年士兵的,其中还包括精锐的共和国卫队,但是在联合国多年强烈的呼吁下,也门政府在2014年做出了承诺,政府军将不再使用和招募任何未成年作战人员,这项承诺得到了联合国儿童保护机构的核查和监督。

 

不过虽然政府军方面做出了承诺,但是胡赛武装方面仍然没有太大的动静,据有关资料显示,胡赛武装共有约2到3万名作战人员,但是其中有约三分之一是未成年人,这个在胡赛武装经常公布的作战影像资料中也可以看到,里面有大量的非常年轻的作战人员。据悉胡赛方面招募的少年作战人员每天可以得到5美元左右的报酬,战死的家里可以得到约80到100美元的抚恤金,这个在我们常人看来真是生命太过“廉价”,但对于生活水平不高且长年处于于战火中的家庭来说也是一笔可观的收入,这也是胡赛能够招募到大量少年作战人员的原因之一。另外,胡赛方面为了激发这些少年的作战热情,在招募他们之后还会进行再教育,除了中东地区常见的经书教育之外,还会教授他们也门历史和周边等国对也门的压迫等内容。

 

从长远来看,虽然也门政府和联合国的相关机构已经对也门战场上的少年兵问题采取了大量的措施,也成立了不少机构,但是要完全杜绝该地的少年兵问题仍然是非常困难的,关键就在于该地区的冲突和战争完全就没有停止过。而进行战争是需要大量的人力和物力的,青少年在体力、学习能力和受控力等方面要比一些成年人好很多,因此他们也就自然而然的会成为各种军阀武装的重点招募对象,所以只要也门的战争和冲突不停止,那么少年兵就会一直出现。

【工具】查询网站有没有用流量宝刷过百度关键词排名

流量宝是一款可以刷百度关键字流量的工具,经过一段时间观察对流量宝刷关键字的技术手段有一定的了解并开发出本款工具。

本程序只能查询流量宝,用于有没有哪个站长使用流量宝刷百度关键字,并列出成功刷过的关键字。
如果是通过正常方式得出的关键字是不会列出的,如果是用流量宝刷的关键字百分百列出关键字。

Updates.php给自己的主题添加在线更新功能

前言

使用过 WordPress 的都知道 WordPress 默认主题都有在线更新的功能,但是我们一般使用的主题却木有,在对欲思主题的二次开发的时候,博猪就用到了一个自动更新的功能,在这里和大家说说吧

程序简介

theme-update-check 是国外的牛人开发的一个终于 WordPress 主题更新的 PHP 类,类似于我们熟悉的缩略图裁图工具 timthumb.php,我们可以很方便的将他集成到我们的主题里面,实现主题的自动更新服务。

文件说明

首先在文末下载文件包,解压出来是三个文件,updates.php 和 info.json。
首先打开 info.json,你会发现是类似下面的代码

{
	"version" : "2.0",
	"details_url" : "http://git.oschina.net/yunluo/yusi",
	"download_url" : "http://git.oschina.net/yunluo/yusi/repository/archive?ref=master"
}

当然,这个是我自己主题的文件,应该都能看懂吧。
主要就三个参数
第一个是版本号
第二个是主题发布页
第三个是主题下载直链,就是输入这个链接,浏览器自动下载主题的那种。

再看一下 updates.php 文件,其他你不需要看,你只需要把主题名字(别名)和 info.json 文件的路径填写进去就好了,其他就不用管了。
然后在主题的 functions.php 写入下面代码

//主题自动更新服务
require 'updates.php';
$example_update_checker = new ThemeUpdateChecker(
    'yusi',
    'info.json 文件路径'//此路径可以开发者自己定义,保证 info.json 文件能够公开访问以及不能被除开发者之外的人修改即可
);

文件部署

首先将 updates.php 文件放在主题根目录,然后将 info.json 放在主题开发者自己的网站根目录里面,当然,其实并不一定是根目录,放在哪里,然后 updates.php 文件里面的路径就是这个,info.json 文件必须保证能够公开访问,然后 over 了!

推送更新

程序是将主题的开发者留下的 meta 文件和主题样式 style..css 里面的版本号进行比对,如果主题开发者的 info.json 文件里面的版本号比使用者的主题文件 style.css 里面的版本号大,那么就会在 WordPress 后台的更新工具进行更新提醒,和正常的 WordPress 更新,插件更新完全一样,如果你选择更新,就自动从主题直链在线安装主题。

注意事项

在使用中,博主发现了一些小问题,在这里也顺便说一下。
最重要的是保证一致性。保证自动更新里面的主题名字和你使用的主题名字一样,比如我目前使用的主题名字叫 yusi,对,这里说的是主题文件夹名字,而不是其他中文名字,需要保持一致的地方有 info.json,functions.php 中的初始化函数代码,updates.php 文件这四个地方,另外下载链接所下载的主题包文件名字也必须是一样的。
另外有很多朋友和博猪一样喜欢使用 github,gitcafe,oschina,coding 等等使用 GIT 版本控制系统的代码托管网站,如果采用这里提供的直链下载的话,你的项目名字也必须和主题名字一样,比如我之前的项目名字叫 yusi-theme,结果自动更新之后主题文件夹多了一个名字叫 yusi-theme 的主题文件夹。好吧,明白怎么回事了吧!

后语

使用这种自动更新功能可以给主题使用者更新鲜的体验以及免去了多次下载的麻烦,自动检查更新的功能最好弄一个开关,让用户选择是否启用,因为主题更新会全部覆盖主题文件,如果使用者在主题里面自己添加了什么代码,最后都可能被覆盖掉,所以,主题开发者尽量给主题多留一些框框,尽量让使用者在主题设置里面设置,而不是直接在主题里面。

源代码

<?php
/**
 * Theme Update Checker Library 1.2
 * http://w-shadow.com/
 *
 * Copyright 2012 Janis Elsts
 * Licensed under the GNU GPL license.
 * http://www.gnu.org/licenses/gpl.html
 */
 
if ( !class_exists('ThemeUpdateChecker') ):
 
class ThemeUpdateChecker {
	public $theme = 'Git-master';              //待检查更新的主题名
	public $metadataUrl = 'https://coding.net/u/googlo/p/File/git/raw/master/info.json';  //元数据文件的路径
	public $enableAutomaticChecking = true; //是否启用自动更新
	protected $optionName = '';      //更新时候的文字信息
	protected $automaticCheckDone = false;
	protected static $filterPrefix = 'tuc_request_update_';
 
	public function __construct($theme, $metadataUrl, $enableAutomaticChecking = true){
		$this->metadataUrl = $metadataUrl;
		$this->enableAutomaticChecking = $enableAutomaticChecking;
		$this->theme = $theme;
		$this->optionName = 'external_theme_updates-'.$this->theme;
		$this->installHooks();
	}
 
	public function installHooks(){
 
		if ( $this->enableAutomaticChecking ){
			add_filter('pre_set_site_transient_update_themes', array($this, 'onTransientUpdate'));
		}
 
		//Insert our update info into the update list maintained by WP.
		add_filter('site_transient_update_themes', array($this,'injectUpdate'));
 
		//Delete our update info when WP deletes its own.
		//This usually happens when a theme is installed, removed or upgraded.
		add_action('delete_site_transient_update_themes', array($this, 'deleteStoredData'));
	}
 
	public function requestUpdate($queryArgs = array()){
		//Query args to append to the URL. Themes can add their own by using a filter callback (see addQueryArgFilter()).
		$queryArgs['installed_version'] = $this->getInstalledVersion();
		$queryArgs = apply_filters(self::$filterPrefix.'query_args-'.$this->theme, $queryArgs);
 
		//Various options for the wp_remote_get() call. Themes can filter these, too.
		$options = array(
			'timeout' => 20, //seconds
		);
		$options = apply_filters(self::$filterPrefix.'options-'.$this->theme, $options);
 
		$url = $this->metadataUrl;
		if ( !empty($queryArgs) ){
			$url = add_query_arg($queryArgs, $url);
		}
 
		//Send the request.
		$result = wp_remote_get($url, $options);
 
		//Try to parse the response
		$themeUpdate = null;
		$code = wp_remote_retrieve_response_code($result);
		$body = wp_remote_retrieve_body($result);
		if ( ($code == 200) && !empty($body) ){
			$themeUpdate = ThemeUpdate::fromJson($body);
			//The update should be newer than the currently installed version.
			if ( ($themeUpdate != null) && version_compare($themeUpdate->version, $this->getInstalledVersion(), '<=') ){
				$themeUpdate = null;
			}
		}
 
		$themeUpdate = apply_filters(self::$filterPrefix.'result-'.$this->theme, $themeUpdate, $result);
		return $themeUpdate;
	}
 
	public function getInstalledVersion(){
		if ( function_exists('wp_get_theme') ) {
			$theme = wp_get_theme($this->theme);
			return $theme->get('Version');
		}
 
		foreach(get_themes() as $theme){
			if ( $theme['Stylesheet'] === $this->theme ){
				return $theme['Version'];
			}
		}
		return '';
	}
 
	public function checkForUpdates(){
		$state = get_option($this->optionName);
		if ( empty($state) ){
			$state = new StdClass;
			$state->lastCheck = 0;
			$state->checkedVersion = '';
			$state->update = null;
		}
 
		$state->lastCheck = time();
		$state->checkedVersion = $this->getInstalledVersion();
		update_option($this->optionName, $state); //Save before checking in case something goes wrong
 
		$state->update = $this->requestUpdate();
		update_option($this->optionName, $state);
	}
 
	public function onTransientUpdate($value){
		if ( !$this->automaticCheckDone ){
			$this->checkForUpdates();
			$this->automaticCheckDone = true;
		}
		return $value;
	}
 
	public function injectUpdate($updates){
		$state = get_option($this->optionName);
 
		//Is there an update to insert?
		if ( !empty($state) && isset($state->update) && !empty($state->update) ){
			$updates->response[$this->theme] = $state->update->toWpFormat();
		}
 
		return $updates;
	}
 
	public function deleteStoredData(){
		delete_option($this->optionName);
	}
 
	public function addQueryArgFilter($callback){
		add_filter(self::$filterPrefix.'query_args-'.$this->theme, $callback);
	}
 
	public function addHttpRequestArgFilter($callback){
		add_filter(self::$filterPrefix.'options-'.$this->theme, $callback);
	}
 
	public function addResultFilter($callback){
		add_filter(self::$filterPrefix.'result-'.$this->theme, $callback, 10, 2);
	}
}
 
endif;
 
if ( !class_exists('ThemeUpdate') ):
 
class ThemeUpdate {
	public $version;      //Version number.
	public $details_url;  //The URL where the user can learn more about this version.
	public $download_url; //The download URL for this version of the theme. Optional.
 
	public static function fromJson($json){
		$apiResponse = json_decode($json);
		if ( empty($apiResponse) || !is_object($apiResponse) ){
			return null;
		}
 
		//Very, very basic validation.
		$valid = isset($apiResponse->version) && !empty($apiResponse->version) && isset($apiResponse->details_url) && !empty($apiResponse->details_url);
		if ( !$valid ){
			return null;
		}
 
		$update = new self();
		foreach(get_object_vars($apiResponse) as $key => $value){
			$update->$key = $value;
		}
 
		return $update;
	}
 
	public function toWpFormat(){
		$update = array(
			'new_version' => $this->version,
			'url' => $this->details_url,
		);
 
		if ( !empty($this->download_url) ){
			$update['package'] = $this->download_url;
		}
 
		return $update;
	}
}
 
endif;

htaccess技巧汇总记录

自定义 RSS 链接

  1. # 自定义 RSS 链接
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine on
  4. RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
  5. RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
  6. RewriteRule ^feed/?([_09az-]+)?/?$ http://feeds2.feedburner.com/catswhocode [R=302,NC,L]
  7. </IfModule>

去除 WordPress 分类链接中的“/category/

  1. RewriteRule ^category/(.+)$ http://www.yourblog.com/$1 [R=301,L]

开启浏览器端缓存

  1. FileETag MTime Size
  2. <ifmodule mod_expires.c>
  3. <filesmatch “\.(jpg|gif|png|ico|css|js)$”>
  4. ExpiresActive on
  5. ExpiresDefault “access plus 1 year”
  6. </filesmatch>
  7. </ifmodule>

拦截机器人垃圾评论

  1. RewriteEngine On
  2. RewriteCond %{REQUEST_METHOD} POST
  3. RewriteCond %{REQUEST_URI} .wpcommentspost\.php*
  4. RewriteCond %{HTTP_REFERER} !.*yourblog.com.* [OR]
  5. RewriteCond %{HTTP_USER_AGENT} ^$
  6. RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

开启维护模式

  1. RewriteEngine on
  2. RewriteCond %{REQUEST_URI} !/maintenance.html$
  3. RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123
  4. RewriteRule $ /maintenance.html [R=302,L]

图片防盗链

(替换 mysite 为自己的网址和/images/notlink.jpg 为自己定制的防盗链声明图片)

  1. RewriteEngine On
  2. #Replace ?mysite\.com/ with your blog url
  3. RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
  4. RewriteCond %{HTTP_REFERER} !^$
  5. #Replace /images/nohotlink.jpg with your “don’t hotlink” image url
  6. RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

阻止指定 ip 访问

  1. <Limit GET POST>
  2. order allow,deny
  3. deny from 200.49.176.139
  4. allow from all
  5. </Limit>

带 www 跳转不带 www 的

  1. <IfModule mod_rewrite.c>
  2. RewriteCond %{HTTPS} !=on
  3. RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  4. RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
  5. </IfModule>

不带 www 跳转带 www

  1. <IfModule mod_rewrite.c>
  2. RewriteCond %{HTTPS} !=on
  3. RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
  4. RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
  5. </IfModule>

禁止展开目录

  1. # 禁止展开网站目录
  2. Options All Indexes

强制 https 浏览

  1. <IfModule mod_rewrite.c>
  2. RewriteEngine On
  3. RewriteCond %{HTTPS} !=on
  4. RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
  5. </IfModule>

USB快捷方式病毒隐藏所有文件恢复方法

今天在机房上课时候发现了个新型的USB病毒,会隐藏U盘下所有文件,只留下一个快捷方式。虽然双击可以进入U盘,不过嬴冰可以 100% 肯定后台还隐藏着某个进程在偷偷做什么事情。网上貌似还没有出现专杀工具,今天就来一把手杀!不过话说回来,很久没见过USB病毒了。之前一次大规模USB病毒爆发还是在上中学的时候,利用 autorun.inf ,只要双击U盘就会自动运行U盘上的病毒来达到传染目的。

一、恢复USB隐藏文件

大家都知道文件有属性,不过一般人都知道只读属性,可以在文件属性中更改。不过还有其他种类,比如说系统属性、隐藏属性、归档属性等等。这款USB快捷方式病毒其实就是利用的这些属性从而使所有文件隐藏的。恢复方法也很简单,只要移除所有属性即可。

查看了一下快捷方式 C:\Windows\system32\cmd.exe /c start rundll32  \ccccffffcccccfcccccffffcfcccfffcfccc.ccccffffcccccfcccccffffcfcccfffcfccc,KxUrRiGnqfZqDcIs

很明显,这不是一个正常的快捷方式。

1. WIN+R 打开运行窗口运行cmd
2. cd e:\ (e替换成你的U盘盘符)
3. attrib -s -r -h *.* /s /d
4. 然后你就应该可以看到隐藏的文件了。

Forece 遇到的病毒是将所有文件放入了一个没有名字的文件夹中,只要移动出来就好了,不过里边还是有几个文件需要删除的。

需要删除的文件列表:

eeeaceeeaceeeaceeeac.eeeaceeeaceeeaceeeac
IndexerVolumeGuid
autorun.inf
还有那个快捷方式也需要一并删除

至此,USB设备上的病毒就清除完毕了。

二、查杀电脑上的USB快捷方式病毒

虽然USB恢复了,但是只要重新插入USB,你的USB就会被重新感染,所以我们还需要清除电脑上的病毒源。只要这个病毒源头不死,那么就会陷入一个死循环。

那么病毒储存的地方也就那么几个地方,只要挨个排查就可以了。

msconfig
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
C:\Users\CC_User\AppData\Local\Temp
C:\Users\CC_User\AppData\Roaming
C:\Users\CC_User\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

基本上就这么几个地方

下边说下 Forece 的查看结果,

首先 Msconfig 中在起始程序中发现了一个奇怪的进程K,然后找到K运行的地址是 C:\Users\CC_User\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,然后经过排查,发现K只是一个快捷方式,这个快捷方式指向的是C:\Users\CC_User\AppData\Roaming中的一个可执行文件,那么基本就可以确认这个病毒的位置了。

然后在通过注册表中查看 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run ,发现有一个 powershell 被激活了,要知道powershell可是拥有管理员权限啊,几乎可以干任何事了。所以这个也需要删除。不过删除之前稍微撇了一眼,发现这个 Powershell 还指向了另外一个注册表地址,那么同理,杀之。地址是
HKEY_CURRENT_USER\SOFTWARE\Classes\随机字母 。

基本上经过这么几个步骤,病毒就被查杀了,重启电脑,然后重新插入U盘再测试一下。完美!

在网上查资料的时候,只有英文网站有这个病毒的记录,貌似中国还没被大规模感染。所以国内的小伙伴的还是安全的,写下来以防万一。如果大家中了病毒,可以照葫芦画瓢。

PS:
网上的教程基本上和我这个病毒类似,估计变种很多,所以感染的地方可能也不一样。不过大部分都一样。比如在 嬴冰列举的下边几个 reference 当中,就有利用 wscript 制作VBS来达到同样目的的病毒。

reference:

How to Remove Shortcut Virus from USB Flash Drive and Computer


http://vintaytime.com/remove-shortcut-virus/
https://www.quora.com/How-can-I-remove-a-shortcut-virus-permanently-from-my-laptop-without-any-software
http://www.wikihow.com/Remove-Shortcut-Virus-on-Windows
https://www.techchore.com/flashdrive-shortcut-virus-and-two-2-methods-to-get-rid-of-it/

介绍7款硬盘克隆工具

随着 SSD 硬盘的价格不断降低,越来越多的人选择购买一块固态硬盘。但是又不想放弃之前的系统,所以最近找克隆软件比较多。以下是 嬴冰试用过的几款克隆软件。

1. Acronis True Image
基本上是我用过速度最快的克隆工具,虽然是收费的,不过西数貌似提供免费OEM版本的 True Image

2. EaseUS Disk Copy / EaseUS Todo Backup
最近比较流行的一款软件,功能也是很多。

3. Paragon Drive Copy 15 / Paragon Backup & Recovery
很强大的工具,除了克隆,还有各种其他功能。

4. Clonezilla
以 Linux 为基础的克隆软件。

5. Macrium
Macrium 之前介绍过这款软件了,除了备份还原,它还可以用来做系统恢复盘。

6. AOMEI Backupper
国内貌似叫做傲梅,用过,还可以。

7. Ghost
老牌克隆工具了,自从WIN8后就基本上也没用过了,但是最近发现之前的老系统盘还是Ghost的,只能留作纪念吧。(个人不建议使用Ghost,土豪随意)

如何在 NGINX 添加自定义 404 500 页面

原来用惯了 Apache 里边的 .htacess 文件,感觉 rewrite 挺容易的,结果搬家后换了 Nginx 发现好多 Rewrite 不好用了。原来 .htacess 对 Nginx 不好使。必须要去手动更改设置文件来实现文件的 Rewrite 规则。因为最近老出 500 错误,我还得顺道把自定义的 500、404 之类的错误页面给弄出来,不然就会被各大搜索引擎降权。因为搜索引擎检查到你的服务器经常宕机,各个页面无法索引的话,就会降权。那么如果你添加一个 404 或者 500 页面,那么他们就会认为你给了用户一个很好的体验,而不会遭到惩罚。今天嬴冰 来教大家如何在 Nginx 里配置404、500的错误页面。

默认参数设置文件路径 /usr/local/nginx/conf/nginx.conf

1. 更改 nginx.conf 在 http 定义区域加入: fastcgi_intercept_errors on;
必须要添加:fastcgi_intercept_errors on; 如果这个选项没有设置,即使创建了404.html和配置了 error_page 也没有效果。这个开关是在 http 区域的,不是在 server 区域的,记得不要搞混,。

2. 在 server 区域添加错误页面指向
error_page 404 /404.html;
error_page 500 /500.html;

3. 将你自己制作好的404、500页面上传到网站目录即可,需要对应第2步中的路径。

当然,你想加 502、503 也可以,照猫画虎就可以了。

WORDPRESS 无法上传文件的解决办法

还是 WordPress 搬家的问题,因为搬家到 VPS 后,各种小问题不断,这次的问题是 WordPress 无法上传文件。上传图片或附件的时候,会出现 “无法将上传的文件移动至 /home/wwwroot/wp-content/uploads/xxxx” 的错误。在网上看了各种解决办法,很多都说是改文件夹权限。什么 755 或者 777 之类的,但是 嬴冰 更改完属性后还是无法上传文件。最后终于找到问题了,是文件夹所属用户的问题。

 

通过 FTP 工具可以看出,uploads 文件夹所属用户名还是 root root 。但是 Web 用户是无法拿到 root 用户权限的。将文件夹属性更改为 www www 就可以了。

更改属性命令

1
chown -R www:www /文件夹名称

基本上直接把 wordpress 所在的文件夹全都更换用户所属及组群即可。

互联网狙击步枪:瞄准镜不但自动瞄准还能直播,狙中目标一键发朋友圈

追踪点公司的X系列PGF自动瞄准狙击步枪,一种网络时代的狙击步枪,被称为狙击步枪的革命。

研制PGF狙击步枪的本意是“自动瞄准”,也就是傻瓜式狙击,尽量把狙击这个高技术含量的活儿变得容易一些。现在培养一个能远距离爆头的精英狙击手可以说是天价,而且从大头兵开始大概得训练两三年才算完全养成。如果研制一支能够自行瞄准的狙击步枪,那么普通人经过两三个月训练,也可以用这支枪执行远距离狙击任务,那肯定是很好了。

追踪点公司扛把子约翰•麦克哈尔(John McHale)就一直想要实现上面这个梦想。当时间进入21世纪,计算机,自动化程序和网络技术发展到现在,傻瓜式狙击步枪终于到了成功的时候。

PGF就是英语Precision Guided Firearm是缩写,意思其实就是我们经常说的自动瞄准系统。

PGF步枪的基础就是一支传统的旋转后拉枪击的狙击步枪,从表面上看不出有什么特别的。但其实这支狙击步枪是经过了特殊改装的,加装了一些时髦的玩意。

近看PGF的网络追踪瞄准镜,看起来挺臃肿的,不过好在重量不算太大

最重要的一个改进,是安装了一个网络追踪瞄准镜(Networked Tracking Scope)。

这是基于光学、激光和电子计算于一身的电子瞄准镜。射手从网络追踪瞄准镜看到的不止是目标区域的放大镜像,而是一个屏幕显示的多重镜像。屏幕上会显示距离、风速、电量、倾斜角度等数据,并且射手可以通过网络追踪瞄准镜顶部的选择按钮进行调节焦距、放大、风偏的调节。

并且这款网络追踪瞄准镜居然还内置的Wifi上网系统,可以通过无线联网与副手的PDA或者IPAD等无线终端进行联机。副手就可以通过屏幕看到射手所看到的一切,并且对显示的内容进行录像。这个功能十分的新颖,因为狙击手当请求可以射击的时候。战场指挥官可以通过网络终端看到狙击手所看到的内容,这样就能更好的指挥狙击手十分对目标进行打击。还可以通过内置的USB接口与普通的PC电脑相连接。

嗯,所以,如果你用PGF步枪作战的话,大概是这样的:

瞄准目标,这时候耳机传来教官声音:“你们风速是不是测错了?瞄准点再往左偏移一点。对,这样就对了”

然后“砰”的一声,打中目标。还没反应过来,副射手就把狙击镜里的画面上传了……然后你踹了副射手一脚,因为他上传朋友圈的时候忘记抹掉你俩所在的坐标了……好吧,赶紧转移阵地,一会儿迫击炮弹该来了。

除了网络追踪瞄准镜,这个PGF步枪还有自动标记按钮。

射手如果需要对远距离目标进行狙击,可以采用任何姿势进行瞄准。当网络追踪瞄准镜中显示目标后,射手就需要“标记”目标。射手只需要把网络追踪瞄准镜中心的黑点对准目标位置,这时射手要按下扳机弧圈前方的红色按钮。这样黑点就会变成红点,屏幕中就会出现蓝色X型的十字标记。这时候网络追踪瞄准镜发射的激光进行是测距,并且会自动使用网格计算方法对移动的目标进行追踪。在同一时刻网络追踪瞄准镜还会对周围的压力和温度进行测试,并且计算出弹道。所以这其实就是傻瓜式的狙击,经过简单训练的人就可以拿拿它打远距离目标。

除此之外,还有PGF步枪自动调节扳机,因为狙击手要根据每个人的动作习惯调节扳机,以前这是很繁琐的工作,需要分解拆开步枪来调整,现在就简单了,这意味着一支狙击步枪可以很快就更换射手让另外一个人用。

枪管校验系统,高精度狙击步枪要不断校验枪管,来修正精度,这个在以前可能几天就要调整一次,每次都要调整很久。现在可以按一下就完成设置了。

追踪点公司总共向市场推出了三款不同的X系列PGF自动瞄准狙击步枪,满足军用、警用与民用的不同需求。这三款分别是.338英寸(8.58毫米)口径拉普阿弹、7.62毫米温彻斯特弹/609毫米枪管、7.62毫米温彻斯特弹/556毫米枪管。狙击步枪的核心部件做工十分精细,所有三个型号都是重枪管,枪管前方配备一室的枪口制退器,在护木下方安装了哈里斯公司的哈里斯两脚架,枪托上设有一个可以升降调节的贴腮板。

这样的狙击步枪大概要多少钱呢?硬件+软件app包括在内,PGF步枪全套的售价在17000至20000美元之间。

现在的最新动态是美国陆军对PGF有兴趣,而且想把网络追踪瞄准镜安装到M16/M4步枪上。