UWP模拟获取验证码

0x00.添加引用

using System.Threading.Tasks;
using System.Net.Http;

0x01.创建新Task

public static Task<HttpResponseMessage> VerCode(string Req)//Req为获取验证码的请求连接,可去需要的网站分析请求获取
{
    return Task.Run(() =>
    {
        HttpClient request = new HttpClient(HttpClientHandler);
        HttpResponseMessage response;
        {
            request.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0");
            request.DefaultRequestHeaders.Add("Accept", "*/*");
            request.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
            request.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
        }//模拟请求头
        try
        {
            response = request.GetAsync(Req).Result;//响应内容为MIME
        }
        catch
        {
            response = null;
        }
        return response;
    });
}

0x02.流形式读取

private async Task GetVerCodeAsync(string Req)//Req为获取验证码的请求连接,可去需要的网站分析请求获取
{
    HttpResponseMessage response = await Sign.VerCode(Req);
    byte[] streamByte = response.Content.ReadAsByteArrayAsync().Result;
    MemoryStream ms = new MemoryStream(streamByte);
    BitmapImage img = new BitmapImage();
    await img.SetSourceAsync(ms.AsRandomAccessStream());//img为Image控件
    VerCodeImg.Source = img;
}

0x03.点击刷新(因网站而异)

private async void VerCodeBtn_Click(object sender, RoutedEventArgs e)
{
    a = a + 1;
    string plus = "?test=" + a;
    string baseReq = "https://www.sonystyle.com.cn/mysony/campaign/api/captcha.do" + plus;
    await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
    {
        await GetVerCodeAsync(baseReq);
    });
}

0x04.相关

MIME 参考手册

UWP标题栏扩展

0x00.添加引用

在默认引用下添加

using Windows.ApplicationModel.Core

0x01.实现

public MainPage()
{
  this.InitiallizeComponent();
  var titlebar=CoreApplication.GetCurrentView().TitleBar;
  titlebar.ExtendViewIntoTitleBar=true;
  Window.Current.SetTitleBar(thingsuneed);//thingsuneed 为需要扩展至标题栏的控件的X:name
}

 

 

Fitbit Charge2 一月使用体验

上月3.15入了一个Fitbit Charge2,800大洋,各种测评已经很多了,总结一个月里的实际使用感受

图片来源于网络

续航

一次性充满电,所有传感器都打开,可以使用5天左右,主要影响续航的是手环的心率传感器和蓝牙

心率传感器选择的是自动,蓝牙没找到怎么关,默认也是一直打开的

每24小时大约掉电20%左右,没有发现电量越少掉电越快的情况

如果将手环取下来静止不动,心率传感器会自动关闭,下面两个绿色的就是心率传感器


屏幕&显示

手环用的是OLED点阵屏幕,所以像素点很明显,有种10年前电子表的感觉,成像质量和卡西欧计算器差不多。

屏幕并不是触摸屏,而是类似于“震动屏”,需要敲击手环的各种位置,除了敲击屏幕还可以敲击表带

屏幕不能调节亮度,阳光下可见度还是很好的,同时带来的问题就是夜间会晃瞎眼睛😱

具有抬腕显示功能,但是不是很灵敏,标准姿势是水平翻转手腕,其他姿势的灵敏度相对较低

屏幕较软,但是裸奔惯了,学校宿舍环境一个月已经出现了几条划痕

低像素的屏幕带来高续航,作为一款主打运动手环,这个显示质量和续航的平衡还是很令人满意的


表带

表带可以自行更换,暂时没有发现表带和表盘链接处有什么松动的迹象,卡扣式的设计还是很稳固

在某宝买了一个下图一样的表带,透气性还是蛮不错的

因为手环下方传感器位置是凸起的,手环只要不要扣的太紧,留出一个小指宽的空隙便可以保证舒适且不会到处滑动

因为没有使用原装的表带,所以暂时未出现很多人反应的表带鼓泡现象


传感器&精度

机器主要传感器为 MEMS 3轴加速度计、气压式高度计、PurePulse光学心率传感器

  • 3轴加速度计:主要负责测量空间加速度,能够全面准确反映物体的运动特性,提供手环的主要功能
  • 气压式高度计:提供手环高度的测量,如计算楼层数
  • PurePulse光学心率传感器:测量心率

因为没有专业设备也没有其他手环做对比测试,只发传送门

五款Fitbit 测评——选择最适合你的运动手环

仅从日常和微信步数对比来看,手环能统计到的步数通常都低于微信统计的步数

从上次爬山来看,微信统计到32000步手环只有30000步,估计是微信把在公车上晃来晃去也统计进去了

精度目前只测试了跑步距离的统计和楼层,测试时间为一周

每天早上跑步路线是1.2KM,手环会自动测量使用者的步长,开启跑步模式后,手环数据在1.18KM~1.22KM之间浮动

楼层统计也有误差,但基本很小,宿舍在5楼,一天上下楼8次总计40层,误差一般会在3~5层左右


软件&功能

Fitbit App在各大应用市场都可以下载到,此处就不做赘述

从登陆到设置手环过程,建议全程大概位置蓝牙服务,否则在设置手环时有可能无法获取手环型号

配对设备使用Sony Xperia Z5,手环的所有设置都只能在手机上完成,手环上只能进行简单的开关和切换操作

手环可以记录数据7天的分钟级精度数据,3天的 SmartTrack数据和30天的总数据,建议每天同步一次

手环可以提供电话短信提醒,但实际测试不是每次都有同步,经常收不到提示

可以自定义表盘,有7、8种表盘可选

SmartTrack:是指用户运动时,手环会自动识别用户的运动类型,如跑步、骑单车等,但是最低要求连续运动十分钟以上才能识别,只测试过单车和跑步,识别还是蛮准确的

具有震动闹铃功能

睡眠记录功能会在你睡时记录你的睡眠情况,午休也会被记录

如果App没有打开“保持同步”功能,每次重新配对同步时间会在半分钟左右

Fitbit Charge2可以通过手机GPS记录跑步路线地图(没测试过,一般都是室内跑步)

可以在Fitbit贴吧发布账号来添加Fitbit好友督促锻炼(反正我经常被嘲讽/(ㄒoㄒ)/~~)


操作逻辑

手环只有一个按钮,操作逻辑清晰简洁,分为三种操作逻辑

  1. 敲击手环
  2. 按钮短按
  3. 按钮长按

按钮短按:用于大类间切换,如:心率→跑步→秒表

敲击手环:用于大类下小类的切换,如:跑步→举重→跑步机→椭圆机

按钮长按:用于大、小类功能开关,如:在闹铃下长按为开启或关闭按钮;在跑步下长按为开始、结束跑步模式,长按结束时都会有震动提醒

总的来说操错逻辑很简单,没有很复杂的交互,如下图横向操作为短按,纵向操作为敲击


其他

手环千万不能下水,最多只能防日常飞溅的水,洗澡一定要去下来,千万别想着泡温泉还带着,早晚洗漱建议也取下来

Fitbit 账号:snowysong@live.com

欢迎添加好友~

为WordPress添加百度访客统计

0x00.在function.php中添加功能

//获取post_views
function get_post_views ($post_id)
{
 $count_key = 'views';
 $count = get_post_meta($post_id, $count_key, true);
 if ($count == '') 
  {
   delete_post_meta($post_id, $count_key);
   add_post_meta($post_id, $count_key, '0');
   $count = '0';
  }
 echo number_format_i18n($count);
}
//设置post_views
function set_post_views () 
{
 global $post;
 $post_id = $post -> ID;
 $count_key = 'views';
 $count = get_post_meta($post_id, $count_key, true);
 if (is_single() || is_page()) 
  {
   if ($count == '') {
   delete_post_meta($post_id, $count_key);
   add_post_meta($post_id, $count_key, '0');
  } else 
  {
   update_post_meta($post_id, $count_key, $count + 1);
  }
}
}
add_action('get_header', 'set_post_views');

0x01.echo

echo get_post_views(get_the_ID());

即可输出访问次数。

关于「栗子木凤凰芯」

最近身边好几个朋友好奇为什么我的blog用「栗子木凤凰芯」这个完全不符合我的“命名规则”的奇怪ID

想了想觉得有点哭笑不得,对啊,我为什么要起这个名字啊?

按照以往的习惯,我的ID都是什么include,async等等奇奇怪怪语法🙃

开始自我回忆模式……

最早

大约07年,那时搜索还用的是Yahoo,3721,发邮件用126网易邮,第一个社交账号还是MSN,注册了第一个博客,ID:phoenix,用的应该是和讯博客。

那会还是小学生😯,这个单词是小学英语课本单词表没有的,很清楚的记得翻了很久硬汉英汉词典,虽然不知道怎么读这个单词但就是觉得很有眼缘。

小学生嘛,也没什么好写的,偶尔会被迫参加什么奇奇怪怪的作文比赛,过去太久远也忘记了账户密码,现在关于这个博客什么都搜不到,也算是不了了之了。

接下来

时间到08,09年,开始接触QQ空间、百度贴吧和魔兽世界。

那会博客还叫部落格吧,因为这个“部落”格所以玩了第一个部落牛头人萨满,当时觉得牛头人抠屁股的动作很魔性、喜感、丑萌、可爱,为了一个破图腾棒子翻山越岭,还有什么金丝换血袍的任务,那会不怎么会用插件,喊话都是用别人写好的汉化宏“一键施放”,每一个任务文本都看得很认真,但还是很挑战我的文字理解水平。

偶尔开始发发空间动态,后来沉迷QQ农场,在古老的N73上扳动摇杆“一键偷菜”😑

注册了一个百度ID:岩湖,可以很确定肯定这个ID来源于WC3中一个山丘之王的姓名文本串。

再接下来

大约到11年左右,接触到一个名为Pottermore的网站,作为一个哈迷查着字典认真做完每一道题。

J.K. Rowling阿姨把我扔到狮院顺便给了一把「硬栗木,凤凰芯,13 ¼”英寸」的魔杖。

那时刚接触剑网3,便将「栗子木凤凰芯」作为角色ID使用(虽然后来删了😥)

一根栗木魔杖

最后

介绍一下魔杖😜My wand

没错,我是奥利凡德🧐

翻译施工中…..

Chestnut

这是一种非常稀奇、多面的木材,它的特性因魔杖核芯的不同而不同 ,从而表现出许多不同的颜色。由栗木制成魔杖吸引着那些有娴熟魔法生物驯服技巧以及有斐然草药学和飞行天赋的男女巫们。然而, 当栗木与龙心弦搭配时, 它或许会在那些草率得到珍宝并沉迷其中的人中找到最佳人选。与这一说法相反的是,最高巫师法庭的连续三任继任者都拥有栗木搭配独角兽的魔杖,因为这种组合对于那些有各种正义考量的人的来说是一种偏好。

Phoenix

凤凰羽毛是极其稀有的核芯类型。它可以承受最强的魔法,尽管比起独角兽和龙需要更长时间才能展现出它的特性。凤凰羽毛制成的魔杖具有很强的自主性,有时候甚至会按照自己的意愿主动施法,然而这是一种许多巫师都不喜欢的特质。这类魔杖在选择持有者时通常非常挑剔,同时难以被随心所欲得驯服,要获得它的忠诚更是难上加难,因为凤凰本身就是这个世界上最为独立且难以接近的生物。

13 ¼” in length

下面关于魔杖长度的笔记来自魔杖铸造师 加里克·奥利凡德先生:

大多数魔杖都在9~14英寸之间,虽然我也卖出过极短的魔杖(8英寸及以下)和非常长的魔杖(超过15英寸),这些情况都很罕见。在后一种情况中,一般是使用者的身体有特质才会要求过长的魔杖。然而,非常非常短的魔杖通常会选择那些性格有所缺陷的巫师而不是因为他们的身体矮小(许多小个子巫师被较长的魔杖选中)。

Unyielding flexibility

下面关于魔杖柔韧性的笔记来自魔杖铸造师 加里克·奥利凡德先生:

魔杖的柔性和刚性代表了魔杖在使用者发生变换时的适应程度和自愿程度,这个因素不应从魔杖的木制、核心、长度以及持有者的经历和魔法风格中单独分开来考虑,所有这些因素的结合使每一把魔杖都独一无二。

渣渣翻译结束🤪

(Lyrics)アイロニ

少し歩き疲れたんだ,

有些走累了啊,

少し歩き疲れたんだ,

有些走累了呢,

月並みな表現(ひょうげん)だけど,

雖然以那麼平凡的表現,

人生(じんせい)とかいう長い道を,

來形容人生漫長的道路,

少し休みたいんだ,

想稍稍休息下呢,

少し休みたいんだけど,

虽然想稍稍休息一下,

時間は刻一刻(こくいっこく)残酷と,

可是時間每時每刻都這樣殘酷,

私を 引っぱっていくんだ,

將我 緊拖著前行,

うまくいきそうなんだけど,

雖然看似順利地進行著,

うまくいかないことばかりで,

但其實全是不順利的事,

迂闊(うかつ)にも泣いてしまいそうになる,

因此一塌糊塗地哭起來,

情(なさ)けない本当にな,

真是丟人呢,

惨(みじ)めな気持なんか,

這樣悲慘的感受,

嫌というほど味わってきたし,

已經不想再次體驗到了,

とっくに悔しさなんてものは,

明明應該將悔恨之類的,

捨ててきたはずなのに,

早早丟棄掉,

絶望抱くほど 悪いわけじゃないけど,雖然也不是感到絕望般 那樣差勁,

欲しいものは いつも少し手には届かない,

但是想要的東西 卻永遠得不到手。

考完试出来推这首歌

四年的警校生活就快结束了

也许在旁人看起来很顺利就签掉工作很幸运吧

没人知道这背后究竟经历了什么,也没人知道迈出这一步的代价究竟是什么

改变从来不意味着好坏,但一定意味着不同

一首听起来很平淡又有点略丧的歌

开始看《乌合之众》

记录开始,不知道多久能看完,占坑准备日后写写读后感。

据说是一本充满偏见的书。

上一本看完的是《蒂凡尼的早餐》。

最近忙着毕业考试和论文答辩,每天忙的根本停不下来,很多想写的以后补上,FLAG已立,一定补上,再忙多看看书也是好的。

还有日剧《四重奏》也是之前看完,没时间写感想,一如既往的日式人物塑造,细腻且生动,剧情源于生活却高于生活,平和却不平淡。

博客貌似很多天没有更,也半个多月没写代码,作为新站更新频率低应该是很影响收录的T.T

收到了一位站长的友链还是蛮开心的,第一步迈出去总是好的。

没时间只是借口吧,估计博客也没几个人看(ˉ▽ ̄~)

不是大牛不是文青,权当记录真实好了。

满足藏在冰激凌里。

基于Ubuntu搭建WordPress

0x00.购买空间

腾讯云服务器

阿里云服务器

1核 1GB 1M 的50G空间的基础服务器完全可以承载小型个人博客的流量。

设置服务器管理员密码,并向服务器安装Unbuntu镜像,登陆。


0x01.安装Apache2

sudo apt-get install apache2 -y

安装完成后可以通过访问服务器地址查看是否出现Apache2 Ubuntu Default Page并显示It works.


0x02.安装PHP 7.0及相关组件

sudo apt-get install php7.0 -y
sudo apt-get install libapache2-mod-php7.0

0x03.安装MySQL服务及相关组件

sudo apt-get install mysql-server -y

期间会需要输入两次密码以设置密码。

sudo apt-get install php7.0-mysql

0x04.安装 phpmyadmin

a.安装 phpmyadmin,安装过程中,遇到lighthttpd/apache2时请选择 apache2 ,再输入root密码 和数据库密码。

sudo apt-get install phpmyadmin -y

b.建立 /var/www/html 下的软连接:

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

c.重启apache2和MySQL 服务(以后对apache2进行更改后也要重启以生效)

sudo service mysql restart
sudo systemctl restart apache2.service

0x05.安装Wordpress

wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.zip

下载完成后解压缩

sudo unzip wordpress-4.7.4-zh_CN.zip

0x06.为 wordpress 配置数据库

a.进入 mysql,输入MySQL密码:

mysql -u root -p

b.为 wordpress 创建一个叫 wordpress 的数据库

CREATE DATABASE wordpress;

c.数据库设置一个用户 wordpressuser,并设置密码:password123

CREATE USER wordpressuser;
SET PASSWORD FOR wordpressuser= PASSWORD("password123");

d.给用户数据库的访问权限并生效配置

GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser IDENTIFIED BY"password123";
FLUSH PRIVILEGES;

e.退出Mysql

exit;

0x07.配置Wordpress

a.把 wordpress 文件夹里的文件都复制到 /var/www/html/ 文件夹

sudo mv wordpress/* /var/www/html/

b.修改权限

sudo chmod -R 777 /var/www/html/

c.将apache指定到index.html

sudo mv /var/www/html/index.html /var/www/html/index~.html

d.重启apache

sudo systemctl restart apache2.service

0x08.测试访问

输入服务器地址访问。


0x09.购买域名并添加解析

以腾讯云举例

腾讯云域名选购

选购好域名后,登陆云服务器控制台,选择要添加解析的域名,点击添加解析→新手快速添加→网站解析→输入要云服务器IP→确定

Ubuntu下修改wordpress上传文件限制

0x00.编辑php.ini

编辑php.ini文件.(可能在 /etc/php.ini 或者 /etc/php.d/cgi/php.ini 或者 /usr/local/etc/php.ini)

我的php.ini在etc/php/7.0/apache2下

vi /etc/php/7.0/apache2/php.ini

0x01.修改max值

upload_max_filesize = 64M
memory_limit = 64M 
post_max_size = 64M

0x02.重启apache服务

sudo /etc/init.d/apache2 restart

 

UWP控件Navigationview

0x00.规范布局

微软通过秋季更新发布了 NavigationView 控件。在此之前,实现汉堡菜单多使用Nuget上发布的类库或使用Splitview自制,但无法保持风格的一致性。

MSDN给出的实例

<NavigationView SelectionChanged="SelectionChanged">
  <NavigationView.MenuItems>
    <NavigationViewItemHeader Content="Section A" />
    <NavigationViewItem Content="Item 01" />
    <NavigationViewItem Content="Item 02" />
  </NavigationView.MenuItems>
  <Frame x:Name="NavigationFrame" />
</NavigationView>

0x01.模式

控件有三种可能的模式:最小、紧凑和扩展,每种模式都是基于带有阈值的内置和可自定义视图自动选择的。


0x02.NavigationViewItem

NavigationViewItem为NavigationView.MenuItems中item项,包含Icon,Content,Tag等常用属性。

Icon:参阅Segoe MDL2 icons提供的图标。

IsSelected:NavigationViewItem是否被选中,选中的NavigationViewItem左侧会有指示方块。如果出现默认需要选中的NavigationViewItem没有指示方块并且已设置IsSelected=true

请为NavigationViewItem添加Loading事件即可正常显示。

private void NavigationViewItem_Loading(Windows.UI.Xaml.FrameworkElement sender, object args)
{
    ((NavigationViewItem)sender).IsSelected = true;
}

0x03.NavigationViewItemSeparator

用于分隔两个NavigationViewItem。


0x04.IsSettingsVisible

Pane底部的Setting按钮是否可见。


0x05.IsPaneOpen

Pane是否展开。


0x06.SelectionChanged事件

当NavigationView中选中的NavigationViewItem改变时触发,常配合Frame控件实现导航视图。

<NavigationView x:Name="NaviView" 
                SelectionChanged="NaviView_SelectionChanged">
    <NavigationView.MenuItems>
        <NavigationViewItem Icon="Home" Content="首页" Tag="Index"/>
        <NavigationViewItem Icon="BrowsePhotos" Content="搜索" Tag="Filter" />
    </NavigationView.MenuItems >

    <Frame x:Name="RootFrame">
      <Frame.ContentTransitions>
        <TransitionCollection>
          <NavigationThemeTransition/>
        </TransitionCollection>
      </Frame.ContentTransitions>
    </Frame >
</NavigationView >
private void NaviView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
        NavigationViewItem item = args.SelectedItem as NavigationViewItem;
        switch (item.Tag)
        {
            case "Index":
                RootFrame.Navigate(typeof(Pages.Index_Page));
            break;

            case "Filter":
                RootFrame.Navigate(typeof(Pages.Filter_Page));
            break;

            case "Setting": 
                RootFrame.Navigate(typeof(Pages.Setting_Page)); 
            break;
        }
}