zoukankan      html  css  js  c++  java
  • 用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai

    Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

    新增直接运行py文件的补充:请在py前面加上:#!/usr/bin/env python3 然后再执行 sudo chmod +x ./task.py 下次运行直接 ./task.py

    平时经常用定时提醒来提高工作效率,到了Linux。。。。蒙圈了,以前C#写的不能跨平台啊,于是就有了这篇文章~(有些人喜欢用番茄工作法,这个算是个福利了)

    跳转到Python:https://www.cnblogs.com/dotnetcrazy/p/9111200.html#python

    先NetCore吧:(old code:me

    核心代码:Process.Start("notify-send", "友情提醒 10分钟过去了");

    原理说明:调用了ubuntu的notify-send的弹窗提醒,自己控制循环和定时

    补充知识:RuntimeInformation.IsOSPlatform(OSPlatform.xxx) 这个来判断是什么系统,OSPlatform是一个结构体

    定时提醒:Thread.Sleep(new TimeSpan(0, 10, 0));

    代码比较简单就不详说了,主要讲讲环境部署+发布

    using System;
    using System.Threading;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    //Old: https://github.com/dunitian/DNTLive/blob/master/Software/LoTTimer/Program.cs
    namespace netcore
    {
        class Program
        {
            static void Main(string[] args)
            {
                while (true)
                {
                    try
                    {
                        Console.WriteLine(DateTime.Now.ToString());
                        Thread.Sleep(new TimeSpan(0, 10, 0));
                        MyBeep();
                    }
                    catch
                    {
                        //异常还不结束?
                        break;
                    }
                }
            }
            private static void MyBeep()
            {
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                {
                    Console.WriteLine("当前系统为Linux");
                    Process.Start("notify-send", "友情提醒 10分钟过去了");
                    //用shell启动指定程序+命令
                    //Process.Start(new ProcessStartInfo("notify-send", "友情提醒 10分钟过去了") { RedirectStandardOutput = true });
                }
                else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    Console.WriteLine("当前系统为Windows");
                    // frequency:提示音的频率,介于 37 到 32767 赫兹之间。// duration:提示音的持续时间,以毫秒为单位。
                    Console.Beep(500, 1500);
                }
                else
                {
                    Console.WriteLine("精力有限,暂不支持");
                }
            }
        }
    }

    来走一个流程:(基本上跟官网走一遍,我贴几个链接和图)

    我以前写的文章:https://www.cnblogs.com/dunitian/p/6745562.html#netcore2.1

    官方文档(多看看官方文档):https://www.microsoft.com/net/download/linux-package-manager/ubuntu18-04/sdk-current

    2.创建一个netcore的console应用:dotnet new console

    3.安装VSCode(直接下载安装deb包即可):http://www.cnblogs.com/dunitian/p/6661644.html

    4.安装VSCode的C#扩展

    5.打开刚才那个文件夹,F5试运行一下,新版的貌似不用自己配置运行路径什么的了

    6.刚才代码贴了,coding一下。调试运行什么的和win下没什么大区别

    7.1发布吧,讲一下官方推荐的发布方式(适合开发人员),到项目目录下,Ctrl+ALT+T调出终端==》 dotnet publish –c release

    参考:https://docs.microsoft.com/zh-cn/dotnet/core/deploying/deploy-with-cli

    这种轻量级方式发布,把这两个文件弄出去就ok了

    运行效果:dotnet xxx.dll,如果你改了程序名字,对应配置名字也记得改哦~

    7.2发布第二种方式【很多人不是开发人员也不想装runtime】(指定应用程序运行时(自宿主应用),这种方式将会把指定平台的Core CLR打包进去):

    发布前先做一件事情,添加你需要支持的哪些系统,我这边win10和Ubuntu18就好了(别忘了)

    在<PropertyGroup>标签里面添加<RuntimeIdentifiers>win10-x64;ubuntu.18.04-x64;</RuntimeIdentifiers>

     

    系统命名以及系统支持参考:(貌似Android也是支持的)

    https://docs.microsoft.com/zh-cn/dotnet/core/rid-catalog
    https://github.com/dotnet/corefx/blob/master/pkg/Microsoft.NETCore.Platforms/runtime.json

    修复依赖+发布指定系统的runtime:dotnet publish -c Release -r ubuntu.18.04-x64

    其实netcore2.x系列不用再输入restore了,它会自动执行restore

    自托管的包挺大的

     

    发现自动生成了个netcore无后缀文件,而且是可执行文件【为基础薄弱的同志普及下:1.看颜色 2.ll 查看有没有执行权限】,直接运行就OK了

    来试着发布一个win10的:dotnet publish -c Release -r win10-x64

    拖到win10来测试~ok,可以跨平台(其他平台一样,发布的时候换下操作系统即可)

     

    这次轮到Python了

     其实核心代码都差不多,几句话解决

    import os
    import time
    
    while True:
        print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
        time.sleep(600)
        os.system("notify-send 友情提醒 10分钟过去了")

    运行(其实你可以自己把他设置为可执行程序【chmod +x ./task.py】,这样在终端中直接./task.py就运行了)

    新增补充:记得py文件前面加上:#!/usr/bin/env python3 

    Shell:(有些人在微信公众号问我,shell怎么获取时间,我这边改了下shell代码)【其实shell方便之处在于直接执行系统命令,系统获取时间:date,那shell加一行即可】

    while :
    do
     date
     sleep 600
      echo -e 'a'
     notify-send 友情提醒 已经过了10分钟了
    done

    知识点补充:

    直接输入python进入交互模式,相当于启动了Python解释器,但是等待你一行一行地输入源代码,每输入一行就执行一行。

    直接运行.py文件相当于启动了Python解释器,然后一次性把.py文件的源代码给执行了,你是没有机会以交互的方式输入源代码的。

    附录(Python加强版

    V0.2.1 add 音乐断点续播、修复锁屏偶尔出现的屏幕旋转bug

    #!/usr/bin/env python3
    
    import os
    import time
    from multiprocessing.dummy import Pool
    
    
    def move_screen():
        """旋转屏幕来提示"""
        os.system("xrandr -o left")  # 左旋转90度
        # 下面两行应该不用加,防止锁屏时出现Bug,就加上了
        time.sleep(2)
        os.system("xrandr -o normal")  # 恢复正常
    
    
    # 大概多少秒(n的整数倍较好)PS:def reset(n)
    global_how_time = 240
    global_time = 0  # 开始播放时间(全局临时变量)
    
    
    def play_music():
        """播放音乐来提醒"""
        global global_time, global_how_time
        # os.system("mpv ~/音乐/莫问明天.mp3")
        if global_time > global_how_time:
            global_time = 0  # 防止超出时间
        os.system(f"mpv ~/音乐/莫问明天.mp3 --start={global_time}")
    
    
    def reset(n=1):
        """友情提醒"""
        os.system("xrandr -o normal")  # 恢复正常
        time.sleep(n)
        global global_time
        global_time += n  # 继续播放
        os.system("pkill mpv")  # 关闭音乐
        print("等待下一次拥抱...")
    
    
    if __name__ == "__main__":
        pool = Pool()
        while True:
            print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
            time.sleep(1200)  # 20 分钟
            os.system("notify-send 逆天友情提醒 20分钟过去了")
            pool.apply_async(play_music)
            pool.apply_async(move_screen)
            reset(30)  # 休息30s
    

    V0.2.0 add 音乐播放、更明显的提示

    eg:屏幕旋转,注意恢复命令:xrandr -o normal

    #!/usr/bin/env python3
    
    import os
    import time
    from multiprocessing.dummy import Pool
    
    
    def move_screen():
        """旋转屏幕来提示"""
        os.system("xrandr -o left")  # 左旋转90度
        # time.sleep(2)
        # os.system("xrandr -o normal")  # 恢复正常
    
    
    def play_music():
        """播放音乐来提醒"""
        os.system("mpv ~/音乐/莫问明天.mp3")
    
    
    def reset(n=1):
        """友情提醒"""
        os.system("xrandr -o normal")  # 恢复正常
        time.sleep(n)
        os.system("pkill mpv")  # 关闭音乐
        print("等待下一次拥抱...")
    
    
    if __name__ == "__main__":
        pool = Pool()
        while True:
            print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
            os.system("notify-send 逆天友情提醒 10分钟过去了")
            pool.apply_async(play_music)
            pool.apply_async(move_screen)
            reset(10)
            time.sleep(600)
    

    我稍微说下Linux日常使用的体验,可以略过这段:(这段放最后吧,不然认为我是打广告的就不太好了o((>ω< ))o)

    以前开发环境都是Win10或者Win系列,后来Net跨平台了,慢慢的开发专用笔记本也换成了Ubuntu,关于Linux基础和环境等就不说了,可以看我以前写的文章(https://www.cnblogs.com/dunitian/p/4822808.html#linux

    Linux基本上还用的惯,之前开发工具突然间从VS变成了JetBrains Rider (Netcore的Console程序在linux下有时候有些莫名错误,所以才搭上了Rider)和 VSCode,陡然间稍有不适,用了几天就熟悉了。所以开发相关的Linux基本上和Win差不多

    关键是日常比较蛋疼,贴个常用deb安装包,https://pan.baidu.com/s/1kVI8eft 这个就不细说了可以参考我以前在Ubuntu16.04上发的文章(http://www.cnblogs.com/dunitian/p/6670560.html),截图自带的勉强能用Alt+PrtScr,用不惯可以用国产deepin-screenshot或者用hotshots也行。播放器可以自己安装一下:sudo apt-get  install  smplayer

    其他的其实也没啥了,文档有WPS,音乐有网易云,输入法有搜狗,词典可以选择有道,浏览器反正谷歌嘛。暂时不需要Linux版的录屏软件(有好的可以推荐哦~)【记得我前面讲dock的时候提过一款(http://www.cnblogs.com/dunitian/p/6681832.html)】

    回头可能考虑再开发一个水印工具,以前开发的用惯了:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP

     好久没写文章了,写个文章好慢。。。

  • 相关阅读:
    2017的结束2018的开始
    .NET Core使用swagger进行API接口文档管理
    数据库可扩展设计方案
    容量估算--随时更新
    分库分表设计基础
    利用bucardo搭建PostgreSQL数据库双活
    通过pgAgent实现PostgreSQL上的自动作业
    MySQL主主配置
    Oracle统计信息不准(谓词越界)造成的性能问题
    获取Oracle中SQL语句的执行计划
  • 原文地址:https://www.cnblogs.com/dotnetcrazy/p/9111200.html
Copyright © 2011-2022 走看看