<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://galiful.github.io/</id>
    <title>Galiful</title>
    <updated>2020-02-28T06:48:29.061Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://galiful.github.io/"/>
    <link rel="self" href="https://galiful.github.io//atom.xml"/>
    <subtitle>Keep Alive</subtitle>
    <logo>https://galiful.github.io//images/avatar.png</logo>
    <icon>https://galiful.github.io//favicon.ico</icon>
    <rights>All rights reserved 2020, Galiful</rights>
    <entry>
        <title type="html"><![CDATA[Activity的Flags]]></title>
        <id>https://galiful.github.io//post/Mpemb9MW9</id>
        <link href="https://galiful.github.io//post/Mpemb9MW9">
        </link>
        <updated>2020-02-28T05:57:01.000Z</updated>
        <content type="html"><![CDATA[<p>Activity的FlagsActivity的Flags有很多，这里主要分析一些比较常用的标记位。标记位的作用很多，有的标记位可以设定Activity的启动模式，比如FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP等；还有的标记位可以影响Activity的运行状态，比如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS等。下面主要介绍几个比较常用的标记位，剩下的标记位读者可以查看官方文档去了解，大部分情况下，我们不需要为Activity指定标记位，因此，对于标记位理解即可。在使用标记位的时候，要注意有些标记位是系统内部使用的，应用程序不需要去手动设置这些标记位以防出现问题。</p>
<h3 id="flag_activity_new_task">FLAG_ACTIVITY_NEW_TASK</h3>
<p>这个标记位的作用是为Activity指定“singleTask”启动模式，其效果和在XML中指定该启动模式相同。</p>
<h3 id="flag_activity_single_top">FLAG_ACTIVITY_SINGLE_TOP</h3>
<p>这个标记位的作用是为Activity指定“singleTop”启动模式，其效果和在XML中指定该启动模式相同。</p>
<h3 id="flag_activity_clear_top">FLAG_ACTIVITY_CLEAR_TOP</h3>
<p>具有此标记位的Activity，当它启动时，在同一个任务栈中所有位于它上面的Activity都要出栈。这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用，在这种情况下，被启动Activity的实例如果已经存在，那么系统就会调用它的onNewIntent。如果被启动的Activity采用standard模式启动，那么它连同它之上的Activity都要出栈，系统会创建新的Activity实例并放入栈顶。通过1.2.1节中的分析可以知道，singleTask启动模式默认就具有此标记的效果。</p>
<h3 id="flag_activity_exclude_from_recents">FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS</h3>
<p>具有这个标记的Activity不会出现在历史Activity的列表中，当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性android:excludeFromRecents=&quot;true&quot;。<br>
--《Android开发艺术探索》<br>
<img src="https://galiful.github.io//post-images/1582869828475.png" alt=""></p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Python 爬虫初识]]></title>
        <id>https://galiful.github.io//post/tLhBfgKei</id>
        <link href="https://galiful.github.io//post/tLhBfgKei">
        </link>
        <updated>2019-11-05T01:37:49.000Z</updated>
        <content type="html"><![CDATA[<!-- more -->
<p>一、什么是爬虫<br>
爬虫：一段自动抓取互联网信息的程序，从互联网上抓取对于我们有价值的信息。</p>
<p>二、Python爬虫架构<br>
Python 爬虫架构主要由五个部分组成，分别是调度器、URL管理器、网页下载器、网页解析器、应用程序（爬取的有价值数据）。</p>
<p>·调度器：相当于一台电脑的CPU，主要负责调度URL管理器、下载器、解析器之间的协调工作。<br>
URL管理器：包括待爬取的URL地址和已爬取的URL地址，防止重复抓取URL和循环抓取URL，实现URL管理器主要用三种方式，通过内存、数据库、缓存数据库来实现。<br>
·网页下载器：通过传入一个URL地址来下载网页，将网页转换成一个字符串，网页下载器有urllib2（Python官方基础模块）包括需要登录、代理、和cookie，requests(第三方包)<br>
·网页解析器：将一个网页字符串进行解析，可以按照我们的要求来提取出我们有用的信息，也可以根据DOM树的解析方式来解析。网页解析器有正则表达式（直观，将网页转成字符串通过模糊匹配的方式来提取有价值的信息，当文档比较复杂的时候，该方法提取数据的时候就会非常的困难）、html.parser（Python自带的）、beautifulsoup（第三方插件，可以使用Python自带的html.parser进行解析，也可以使用lxml进行解析，相对于其他几种来说要强大一些）、lxml（第三方插件，可以解析 xml 和 HTML），html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。<br>
·应用程序：就是从网页中提取的有用数据组成的一个应用。<br>
<img src="https://www.runoob.com/wp-content/uploads/2018/07/20170427113109368.png" alt=""></p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Python 学习记录]]></title>
        <id>https://galiful.github.io//post/e5G5EDjzZ</id>
        <link href="https://galiful.github.io//post/e5G5EDjzZ">
        </link>
        <updated>2019-10-15T08:49:56.000Z</updated>
        <content type="html"><![CDATA[<p><a href="https://github.com/Galiful/Pydemo/blob/master/Pydemo.py">Python 学习记录</a></p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[android 线程池使用]]></title>
        <id>https://galiful.github.io//post/OyXc45CxE</id>
        <link href="https://galiful.github.io//post/OyXc45CxE">
        </link>
        <updated>2019-10-15T01:56:45.000Z</updated>
        <content type="html"><![CDATA[<p>https://www.jianshu.com/p/646e3f2f53d1</p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[QT 无边框窗口-拖动移动]]></title>
        <id>https://galiful.github.io//post/qt-wu-bian-kuang-chuang-kou-tuo-dong-yi-dong</id>
        <link href="https://galiful.github.io//post/qt-wu-bian-kuang-chuang-kou-tuo-dong-yi-dong">
        </link>
        <updated>2019-08-30T04:09:37.000Z</updated>
        <content type="html"><![CDATA[<pre><code>//去掉标题栏，无边框窗口，区别是第一个可以鼠标缩放窗口，但上方有一个白条故未采用
	//setWindowFlags(Qt::CustomizeWindowHint);
	setWindowFlags(Qt::FramelessWindowHint);
</code></pre>
<pre><code>void Qwebengine::mousePressEvent(QMouseEvent* event)
{
	if (event-&gt;button() == Qt::LeftButton)
	{
		mMousePressed = true;
		mRelativeSrcPos = event-&gt;globalPos() - pos();
	}
}

void Qwebengine::mouseReleaseEvent(QMouseEvent* event)
{
	mMousePressed = false;
}

void Qwebengine::mouseMoveEvent(QMouseEvent* event)
{
	if (mMousePressed)
	{
		//当前位置减去相对的原点位置得到的是移动距离
		move(event-&gt;globalPos() - mRelativeSrcPos);
	}
}

</code></pre>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[QWebEngine之与webkit]]></title>
        <id>https://galiful.github.io//post/qwebengine-zhi-yu-webkit</id>
        <link href="https://galiful.github.io//post/qwebengine-zhi-yu-webkit">
        </link>
        <updated>2019-08-28T00:04:02.000Z</updated>
        <content type="html"><![CDATA[<p>自从Qt5.6后引入了QWebEngine，摒弃了原先的QWebkit，这是一款基于chrome浏览器内核引擎，Qt webenginewidgets模块中提供了QWebEngineView这个视图控件来很方便的加载和显示网页，仅需如下几行：</p>
<pre><code>QWebEngineView* webview = new QWebEngineView;
webview-&gt;load(QUrl(&quot;https://www.baidu.com/&quot;));
webview-&gt;show();
</code></pre>
<p>与webkit主要区别：<br>
<img src="https://galiful.github.io//post-images/1566950985824.png" alt=""><br>
在我的项目里：webkit不能执行网页里js脚本（也可能是脚本不兼容）~而webengine确可以。</p>
<p>webengine尽管功能更强，但用到QtWebEngineProcess.exe 占用内存更大</p>
<pre><code>QWebEngineProfile* engineProfile = ui.webEngineView-&gt;page()-&gt;profile();
	engineProfile-&gt;clearHttpCache(); //删除缓存
	QWebEngineCookieStore* cookie = ui.webEngineView-&gt;page()-&gt;profile()-&gt;cookieStore();
	cookie-&gt;deleteAllCookies();//删除cookie 
</code></pre>
<p>刷新时执行此操作，明显看到内存降低然后随网页打开再回升的一个过程，证明可用~</p>
<pre><code>将QtWebEngineProcess.exe与主进程合二为一。
qputenv(&quot;QTWEBENGINE_CHROMIUM_FLAGS&quot;, &quot;--single-process&quot;);
</code></pre>
<p>QWebEngineView的一些设置方法：</p>
<pre><code>ui.webEngineView-&gt;settings()-&gt;setAttribute(QWebEngineSettings::ShowScrollBars, false);//隐藏滚动条
</code></pre>
<p><a href="https://doc.qt.io/qt-5/qwebenginesettings.html">https://doc.qt.io/qt-5/qwebenginesettings.html</a></p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[一个基于qt的桌面应用开发经历]]></title>
        <id>https://galiful.github.io//post/yi-ge-ji-yu-qt-de-zhuo-mian-ying-yong</id>
        <link href="https://galiful.github.io//post/yi-ge-ji-yu-qt-de-zhuo-mian-ying-yong">
        </link>
        <updated>2019-08-26T05:20:18.000Z</updated>
        <content type="html"><![CDATA[<p>这一个月没有更新日志和git。。。<br>
因为在忙一个桌面应用，因为之前都没有怎么接触过，环境和代码都是一点点摸索，自是也没有传git。<br>
项目需求是显示画面，和服务器传来的数据，做界面显示，功能很简单<br>
摄像头用的网络摄像头，对，萤石<br>
界面显示用qt，没啥动画也不会，<br>
中间画面本来用的是萤石demo，后来基本完成了，项目要求画面换协议，于是用的是webengine显示网页的形式，<br>
项目目前有近2个月时间了，基本完成，后面可能还有改，因为项目对画面延迟要求很高~</p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[App内异常捕获并上传]]></title>
        <id>https://galiful.github.io//post/app-nei-yi-chang-bu-huo</id>
        <link href="https://galiful.github.io//post/app-nei-yi-chang-bu-huo">
        </link>
        <updated>2019-06-17T00:44:10.000Z</updated>
        <content type="html"><![CDATA[<ol>
<li>实现Thread.UncaughtExceptionHandler接口</li>
<li>腾讯Bugly等第三方</li>
</ol>
<pre><code>CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this);
</code></pre>
<pre><code>public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private static final String TAG = &quot;CrashHandler&quot;;
    private static final boolean DEBUG = true;
    //文件路径
    private static final String PATH = Environment.getExternalStorageDirectory().getPath() +File.separator+ &quot;crash&quot;;
    private static final String FILE_NAME = &quot;crash&quot;;
    private static final String FILE_NAME_SUFEIX = &quot;.trace&quot;;
    private static Thread.UncaughtExceptionHandler mDefaultCrashHandler;
    private static CrashHandler mCrashHandler = new CrashHandler();
    private Context mContext;

    private CrashHandler() {
    }

    public static CrashHandler getInstance() {
        return mCrashHandler;
    }

    public void init(Context context) {
        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
        mContext = context.getApplicationContext();
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            //将文件写入sd卡
            writeToSDcard(ex);
            //写入后在这里可以进行上传操作
        } catch (IOException e) {
            e.printStackTrace();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        ex.printStackTrace();
        //如果系统提供了默认异常处理就交给系统进行处理，否则自己进行处理。
        if (mDefaultCrashHandler != null) {
            mDefaultCrashHandler.uncaughtException(thread, ex);
        } else {
            //Process.killProcess(Process.myPid());
        }
    }

    //将异常写入文件
    private void writeToSDcard(Throwable ex) throws IOException, PackageManager.NameNotFoundException {
        //如果没有SD卡，直接返回
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            return;
        }
        File filedir = new File(PATH);
        if (!filedir.exists()) {
            filedir.mkdirs();
        }
        long currenttime = System.currentTimeMillis();
        String time = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss&quot;).format(new Date(currenttime));

        File exfile = new File(PATH +File.separator+FILE_NAME+time + FILE_NAME_SUFEIX);
        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(exfile)));
        Log.e(&quot;错误日志文件路径&quot;,&quot;&quot;+exfile.getAbsolutePath());
        pw.println(time);
        PackageManager pm = mContext.getPackageManager();
        PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
        //当前版本号
        pw.println(&quot;App Version:&quot; + pi.versionName + &quot;_&quot; + pi.versionCode);
        //当前系统
        pw.println(&quot;OS version:&quot; + Build.VERSION.RELEASE + &quot;_&quot; + Build.VERSION.SDK_INT);
        //制造商
        pw.println(&quot;Vendor:&quot; + Build.MANUFACTURER);
        //手机型号
        pw.println(&quot;Model:&quot; + Build.MODEL);
        //CPU架构
        pw.println(&quot;CPU ABI:&quot; + Build.CPU_ABI);

        ex.printStackTrace(pw);
        pw.close();

    }
}
</code></pre>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[人生苦短，我有Python]]></title>
        <id>https://galiful.github.io//post/ren-sheng-ku-duan-wo-you-python</id>
        <link href="https://galiful.github.io//post/ren-sheng-ku-duan-wo-you-python">
        </link>
        <updated>2019-06-15T05:31:04.000Z</updated>
        <content type="html"><![CDATA[<h2 id="20196">2019.6</h2>
<p>Python 是一种解释型语言： 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。</p>
<p>Python 是交互式语言： 这意味着，您可以在一个 Python 提示符 &gt;&gt;&gt; 后直接执行代码。</p>
<p>Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。</p>
<p>Python 是初学者的语言：Python 对初级程序员而言，是一种伟大的语言，它支持广泛的应用程序开发，从简单的文字处理到 WWW 浏览器再到游戏。<br>
<em>总之，优雅~</em></p>
<p>优点</p>
<ul>
<li>简单 -- Python 是一种代表简单主义思想的语言。阅读一个良好的 Python 程序就感觉像是在读英语一样，尽管这个英语的要求非常严格！Python 的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。</li>
<li>易学 -- 就如同你即将看到的一样，Python 极其容易上手。前面已经提到了，Python 有极其简单的语法。</li>
<li>免费、开源 -- Python 是 FLOSS（自由/开放源码软件）之一。简单地说，你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS 是基于一个团体分享知识的概念。这是为什么 Python 如此优秀的原因之一——它是由一群希望看到一个更加优秀的 Python 的人创造并经常改进着的。</li>
<li>高层语言 -- 当你用 Python 语言编写程序的时候，你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。</li>
<li>可移植性 -- 由于它的开源本质，Python 已经被移植在许多平台上（经过改动使它能够工作在不同平台上）。如果你小心地避免使用依赖于系统的特性，那么你的所有 Python 程序无需修改就可以在下述任何平台上面运行。这些平台包括 Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE 甚至还有 PocketPC、Symbian 以及 Google 基于 Linux 开发的 Android 平台！</li>
<li>解释性 -- 这一点需要一些解释。一个用编译性语言比如 C 或 C++ 写的程序可以从源文件（即 C 或 C++ 语言）转换到一个你的计算机使用的语言（二进制代码，即0和1）。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候，连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而 Python 语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部，Python 解释器把源代码转换成称为字节码的中间形式，然后再把它翻译成计算机使用的机器语言并运行。事实上，由于你不再需要担心如何编译程序，如何确保连接转载正确的库等等，所有这一切使得使用 Python 更加简单。由于你只需要把你的 Python 程序拷贝到另外一台计算机上，它就可以工作了，这也使得你的 Python 程序更加易于移植。</li>
<li>面向对象 -- Python 既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中，程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中，程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如 C++ 和 Java 相比，Python 以一种非常强大又简单的方式实现面向对象编程。</li>
<li>可扩展性 -- 如果你需要你的一段关键代码运行得更快或者希望某些算法不公开，你可以把你的部分程序用 C 或 C++ 编写，然后在你的 Python 程序中使用它们。</li>
<li>丰富的库 -- Python 标准库确实很庞大。它可以帮助你处理各种工作，包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV 文件、密码系统、GUI（图形用户界面）、Tk 和其他与系统有关的操作。记住，只要安装了 Python，所有这些功能都是可用的。这被称作 Python 的“功能齐全”理念。除了标准库以外，还有许多其他高质量的库，如 wxPython、Twisted 和 Python 图像库等等。</li>
<li>规范的代码 -- Python 采用强制缩进的方式使得代码具有极佳的可读性。</li>
</ul>
<p>缺点</p>
<ul>
<li>运行速度，有速度要求的话，用 C++ 改写关键部分吧。</li>
<li>国内市场较小（国内以 Python 来做主要开发的，目前只有一些 web2.0 公司）。但时间推移，目前很多国内软件公司，尤其是游戏公司，也开始规模使用他。</li>
<li>中文资料匮乏（好的 Python 中文资料屈指可数，现在应该变多了）。托社区的福，有几本优秀的教材已经被翻译了，但入门级教材多，高级内容还是只能看英语版。</li>
<li>构架选择太多（没有像 C# 这样的官方 .net 构架，也没有像 ruby 由于历史较短，构架开发的相对集中。Ruby on Rails 构架开发中小型web程序天下无敌）。不过这也从另一个侧面说明，python比较优秀，吸引的人才多，项目也多。</li>
</ul>
<p>目前python广泛应用于机器学习，数据分析，服务端建设~以上缺点较老旧</p>
]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Handler类中发送消息-post()和postDelay()方法]]></title>
        <id>https://galiful.github.io//post/handler-lei-zhong-fa-song-xiao-xi-posthe-postdelayfang-fa</id>
        <link href="https://galiful.github.io//post/handler-lei-zhong-fa-song-xiao-xi-posthe-postdelayfang-fa">
        </link>
        <updated>2019-06-10T09:49:27.000Z</updated>
        <content type="html"><![CDATA[<p><img src="https://img-blog.csdn.net/20180326181513374?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTEwMTE3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><br>
<img src="https://img-blog.csdn.net/20180326181526567?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTEwMTE3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><br>
首先，post和postDelay都是Handler的方法，用以在子线程中发送Runnable对象的方法；</p>
<p>其次，Android中post()方法可以直接在非UI线程中更新UI，不同与Handelr的Send类方法，需要进行切换；</p>
<p>最后，两个方法在实现UI线程事件的时间上有所区别，postDelayed()方法用以延期执行，post则是立即执行。<br>
// 三种切回主线程更新UI的方法<br>
```<br>
imageView.post(new Runnable() {<br>
@Override<br>
public void run() {<br>
imageView.setImageBitmap(bitmap1); // 素描图<br>
}<br>
});</p>
<pre><code>            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    orignView.setImageBitmap(bitmap2); // 素描图
                }
            });

            handler.post(new Runnable() {
                @Override
                public void run() {
                    threeView.setImageBitmap(bitmap3); // 素描图
                }
            });
</code></pre>
<pre><code>  
send方法：  

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {      //判断标志位
            case 1:
                /**
                 获取数据，更新UI
                */
                break;
        }
    }
};
   
 
public class WorkThread extends Thread {
 
    @Override
    public void run() {
        super.run();
       /**
         耗时操作
        */
  
        //从全局池中返回一个message实例，避免多次创建message（如new Message）
        Message msg =Message.obtain();  
        msg.obj = data;
        msg.what=1;   //标志消息的标志
        handler.sendMessage(msg);
    } 
}




</code></pre>
]]></content>
    </entry>
</feed>