自由學習的風

幽夢影 張潮 少年讀書,如隙中窺月;中年讀書,如庭中望月;老年讀書,如臺上玩月。皆以閱歷之淺深,為所得之淺深耳。

文字編輯器 - 複製游標目前行

2017年11月1日 星期三

notepad++

  • Ctrl + D
sublime text:
  • Ctrl + Shift + D
vs code:
  • Alt + Shift + D

[PyQt5] 學習筆記 QML好強大

2017年10月16日 星期一

Qt5 的發展,未來應該會以 QML(QtQuick) 為主,QWidget應該還會存在,不過,我想應該就只有維設而已了;試了一下,果然很強大,值得用
參考:

[PyQt5] 學習筆記02 線上教材:零基礎學 qt4 編程

雖然是 Qt4,但是很多觀念是一樣的。
線上書籍:零基礎學 qt4 編程

[PyQt5] 學習筆記01 PyQt5 開發環境建置

這篇文章介紹得很不錯,有興趣開發 PyQt5 的夥伴可以看看!
參考:Python3 PyQt5 pycharm 環境搭建


[Python] 打包成執行檔程式

這幾天幫學長做 Linux 上的 GUI 介面,由於主程式是 python,所以找了一些資料,目前還是以 GTK 和 QT 為主流。

做了之後,就順便測試一下幾年前用過的打包程式,cz_freeze, py2exe, pyinstaller,在 Windows 10 x64 + Python 3.6.2 (x64) 的平台上,cz_freeze 和 pyinstaller 都可以,但是 py2exe 在 3.6.2 似乎無法編譯成功。

另外,pyinstaller 的操作完勝另外 2 支程式,方便簡單直接。推薦!! 不過,cz_freeze 可以直接把程式包成安裝檔,直接雙擊 2 下就可以安裝,唯一的缺點是沒有在桌面建立捷徑,美中不足。

[Python] 如何套用 xrc 檔案

參考:UsingXmlResources

感想: xrc 只有單獨介面,所以若要取值或 binding 動作的話,就得自己再寫code處理,雖然已經方便許多,但是似乎還是有些煩瑣。

檔案:main.py, frame.py, gui.xrc
main.py
import wx
import wx.xrc as xrc
GUI_FILENAME       = "gui.xrc"
GUI_MAINFRAME_NAME = "MainFrame"
class MyApp(wx.App):
    def OnInit(self):
        # Load all controls:
        self._do_layout()
        return True
    def _do_layout(self):
        self.res = xrc.XmlResource( GUI_FILENAME )
        self.frame = self.res.LoadFrame( None, GUI_MAINFRAME_NAME )
        self.SetTopWindow(self.frame)
        self.frame.Show(1)
if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()
frame.py
import wx
import wx.xrc as xrc
class MainFrame(wx.Frame):
    def __init__(self):
        pre = wx.PreFrame()
        # the Create step is done by XRC.
        self.PostCreate(pre)
        self.Bind(wx.EVT_WINDOW_CREATE, self.OnCreate)
    def OnCreate(self, event):
        self.Unbind(wx.EVT_WINDOW_CREATE)
        wx.CallAfter(self._PostInit)
        event.Skip()
        return True
    def _PostInit(self):
        # Do all init here
        self.Fit()
        self.SetAutoLayout(True)
        self.btnExit = xrc.XRCCTRL(self, 'btnExit')
        self.Bind(wx.EVT_BUTTON, self.OnBtnExit, self.btnExit)
        # Set properties:
        self.btnExit.SetLabel('Exit')
    def OnBtnExit(self, evt=None):
        self.Close()
gui.xrc
<?xml version="1.0" encoding="UTF-8"?>
<resource version="2.3.0.1">
  <object class="wxFrame" name="demoframe" subclass="form.MainFrame">
    <centered>1</centered>
    <style>wxDEFAULT_FRAME_STYLE</style>
    <title>Testing wx XRC mechanism</title>
    <object class="wxBoxSizer">
      <orient>wxHORIZONTAL</orient>
      <object class="sizeritem">
        <object class="wxPanel">
          <object class="wxBoxSizer">
            <orient>wxHORIZONTAL</orient>
            <object class="sizeritem">
              <object class="wxButton" name="btnExit">
                <label></label>
                <default>1</default>
              </object>
              <flag>wxALL|wxALIGN_CENTRE_VERTICAL|wxALIGN_CENTRE_HORIZONTAL</flag>
              <border>20</border>
            </object>
          </object>
        </object>
        <flag>wxALL|wxEXPAND</flag>
      </object>
    </object>
  </object>
</resource>

PyQt5 學習筆記00

2017年10月14日 星期六

幾年前練習用來做 Linux GUI 介面,這次剛好學長有需要,就再回頭來試試,努力了一下,還好有先做出原型,順便把選單、下拉選單的連結順便加進去。

有些東西還沒完善,有些東西則記錄下來,以免下次又要再重找一次。

Interface Prototype:



Nginx 跑 CodeIgniter 的設定

2017年10月7日 星期六

Reference: https://codeigniter.org.tw/userguide3/general/urls.html

location / {
  try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
  fastcgi_pass unix:/var/run/php5-fpm.sock;
  fastcgi_index index.php;
  fastcgi_split_path_info ^(.+\.php)(.*)$;
  include fastcgi_params;
  fastcgi_param HTTPS off;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

[programming] OpenId 函式庫 CN_match 錯誤

2017年10月6日 星期五

新北 openid 的 php 範例中,openid.php 這支library裡在 #280, #293, #309 這三行中,判斷 ssl 的 CN_match 這個設定已不再使用(deprecated)。
apache2 目前似乎仍可正常使用,不過,放在 nginx 的話,會噴錯誤,將 'CN_match' 自行改成 'peer_name' 可正常執行(共 3 處)。


利用 edu2016 (ubuntu) 快速檢查 DNS 服務是否開啟 recursive query

2017年9月26日 星期二

最近學校和中心都快被 DNS 大量查詢攻擊煩得受不了,各位夥伴也可以自己來查一下校內是否有些未控管的 DNS Server 被當成肉雞去攻擊網路。

首先,若你有 edu2016 或 ntpcU 的新北教育作業系統,就可以直接利用 apt-get 來安裝 nmap  這支工具來幫忙快速檢查校內所有的 ip。步驟如下:

  1.  sudo apt-get update && sudo apt-get install nmap
  2.  sudo nmap  -sU 53 --script=dns-recursion  <target>
(藍色部分自行換成  校內的 ip,如:  sudo nmap -sU 53 --script=dns-recursion 10.231.1.1/24  )

若未關閉遞迴查詢(recursion query),畫面為:










※在自己校內掃自己的 DNS 看到 recursion 有時是因為允許校內的 IP 做 recursion 查詢。

[轉][CodeIgniter] 利用 hook 來處理全部的輸出

2017年9月17日 星期日

參考 http://lzzpnk.blogspot.tw/2012/06/codeigniter-hook-alt.html

1. 在 ./application/config/config.php
 $config['enable_hooks'] = TRUE;


2. ./application/config/hooks.php 設定執行的程式
$hook['display_override'][] = array(
        'class'    => '',
        'function' => 'images_auto_set_alt',
        'filename' => 'output.php',
        'filepath' => 'hooks',
        'params'   => array( 'output_display' => TRUE )
    );​ 
3. ./application/hook/output.php
/**
     * 將輸出的 圖片(<img>) 進行處理;自動配置 alt 屬性。
     *
     * @param array   $setting=array() 設定
     *                $setting['output_display'] => 是否直接輸出給瀏覽器。FALSE代表不直接輸出,僅回存至buffer。
     * @return NULL                    不會回傳東西。
     */
    function images_auto_set_alt( $setting=array() ) {
        $CI =& get_instance();
        $CI->load->library( 'simple_html_dom' ); // require_once APPPATH . 'libraries/simple_html_dom.php';
        $buffer = $CI->output->get_output();
        $DOM = str_get_html( $buffer );
        foreach ( $DOM->find( 'img' ) as $key => $img ) {
            if ( empty( $img->alt ) && ! strpos( $img->alt, $CI->config->item( 'site_name' ) ) ) {
                $img->alt = $CI->config->item( 'site_name' );
            }
            else {
                $img->alt .= ' - ' . $CI->config->item( 'site_name' );
            }
        }
        $CI->output->set_output( $DOM->save() );
        if ( $setting['output_display'] ) {
            $CI->output->_display();
        }
    } 

[mysql] 升級到 MySQL 5.7 時,突然無法新增資料

2017年9月11日 星期一

mysql 若有從 5.x 升級到 5.7 的夥伴注意一下,date, datetime 在 5.7 的版本預設是不允許空白或 '0000-00-00" 、"0000-00-00 00:00:00" 的內容,所以若要新增時會發生錯誤!

可以在 my.cnf 把 sql_mode 修改如下:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" 

或是臨時解決方式:
在每一次新增時,先執行這段指令,也可以避開這個錯誤!
SET sql-mod='';

[系統] 是 Windows 太保守?還是 Linux 太前衛?

2017年9月4日 星期一

不曉得從什麼時候開始, Windows 7(10) 更新時常常會出現失敗,而更新失敗又會導致不斷重新開機更新,得循環 2、3次才會進入 Windows 桌面,好一陣子還被同事埋怨,怎麼拿這麼舊的機器給她,開機都得等個二、三十分鐘,我了個去~~~這鍋背得…好冤啊!

Windows 只認得兩種檔案系統:FAT(32)和NTFS,別的一概不管,在系統碟裡若有分割區是在這兩種之外,用來當做資料碟的話,倒沒什麼關係,頂多就是資料讀不到,但是若是用來安裝系統……呵!呵!呵!那就麻煩了!

這幾年通常都是裝雙系統在電腦裡(是真的雙系統喔!Windows 和 Linux,而不是  Windows XP, Windows 7, Windows 10 的雙系統),因為 Windows 認不得其其它眾多的檔案系統,所以都是將 Linux 最後安裝並使用預設的 Grub2 開機管理員,這樣可以選擇 Linux 開機,還是 Windows 開機。

很不幸,問題來了,不曉得從什麼時候開始,Windows 更新會重新開機,然後再繼續更新,若不是由 Windows 的預設開機管理員(bcd)的話,更新會失敗,然後…再重新開機,再更新失敗…重開…失敗…這個過程會導致開機過程會拖延20~30分鐘。

是 Windows 只想守住眼前的3分1畝地?還是該怪 Linux 太過前衛到想把所有的檔案系統都統包呢?我也不知!不過,我知道若想繼續使用 Windows,這種情況會導出最後唯一的結果,就是把系統硬碟裡不是 FAT 和  NTFS  的分割區刪掉,So, Windows always win...

[CodeIgniter] 將 Session 資料存入資料庫

2017年9月2日 星期六

Reference: http://superlevin.ifengyuan.tw/codeigniter3-0%E5%B0%87session%E5%AF%AB%E5%85%A5db/

CREATE TABLE IF NOT EXISTS `ci_sessions` (        `id` varchar(40) NOT NULL,        `ip_address` varchar(45) NOT NULL,        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,        `data` blob NOT NULL,        PRIMARY KEY (id),        KEY `ci_sessions_timestamp` (`timestamp`));


設定 application/config/config.php
$config['sess_driver'] = 'database';$config['sess_save_path'] = 'ci_sessions';









[CodeIgniter] 讀取 2 個資料庫

Reference: stack overflow https://stackoverflow.com/questions/8268853/codeigniter-multiple-database-connections#

同時連線2個資料庫

Database 1:
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
Database 2:
$db['otherdb']['hostname'] = "localhost";
$db['otherdb']['username'] = "root";
$db['otherdb']['password'] = "";
$db['otherdb']['database'] = "other_database_name";
$db['otherdb']['dbdriver'] = "mysql";
$db['otherdb']['dbprefix'] = "";
$db['otherdb']['pconnect'] = TRUE;
$db['otherdb']['db_debug'] = FALSE;
$db['otherdb']['cache_on'] = FALSE;
$db['otherdb']['cachedir'] = "";
$db['otherdb']['char_set'] = "utf8";
$db['otherdb']['dbcollat'] = "utf8_general_ci";
$db['otherdb']['swap_pre'] = "";
$db['otherdb']['autoinit'] = TRUE;
$db['otherdb']['stricton'] = FALSE;

Use it:
function my_model_method()
{
  $otherdb = $this->load->database('otherdb', TRUE); // the TRUE paramater tells CI that you'd like to return the database object.

  $query = $otherdb->select('first_name, last_name')->get('person');
  var_dump($query);
}