分類
Linux 程序

Django簡易搭建上傳文件

這裡使用Django+Gunicorn+Nginx的方式簡單運行一個小型webserver,實現一個簡單的上傳文件到服務器的功能(並不生成下載鏈接)。

啟動虛擬環境,安裝django和gunicorn:

pip install Django==2.0
pip install gunicorn
#進入要放置代碼的目錄並新建項目
django-admin startproject mysite
##或者在當前目錄建立項目
#django-admin startproject mysite .
cd mysite
#新建app
python manage.py startapp polls

先建立一個表格:

#polls/forms.py
from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(label='密碼',max_length=20,widget=forms.PasswordInput)
    file = forms.FileField(label='文件',)

修改view:

#polls/views.py
import os
import subprocess
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UploadFileForm

#handle file example with file
def handle_uploaded_file(f):
    with open('/file/should/be/saved/here/target.odt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

#another handle file example with filename
def handle_uploaded_file2(filename):
    msg=''
    try:
        targetZipFilePath = os.path.join(settings.BASE_DIR, filename)
        cmd1=subprocess.check_call(["unzip", "-o", targetZipFilePath, "-d", "/home/fred/workspace/"])
        if cmd1==0 :
            cmd2=subprocess.check_call(["cp", "-Rf", "/home/fred/workspace/dist", "/home/fred/"])
            if cmd2==0 :
                msg="deployed successfully"
            else:
                msg="error 2"
        else:
            msg="error 1"
    except:
        msg = 'error 0'
    return msg

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid() and request.POST['title']=='Secret':
#            handle_uploaded_file(request.FILES['file'])
#            return HttpResponse("上傳成功")
            myfile = request.FILES['file']
            fs = FileSystemStorage()
            filename = fs.save(myfile.name, myfile)
            uploaded_file_url = fs.url(filename)
            print(uploaded_file_url)
            res = handle_uploaded_file2(uploaded_file_url)
            return HttpResponse(res)
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})

新建一個表格的模板:

#polls/templates/upload.html
<form enctype="multipart/form-data" action="/polls/upload/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="上傳" />
</form>

新建一個url路由表:

#polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('upload/', views.upload_file, name='upload_file'),
]

修改項目路由:

#mysite/urls.py
from django.contrib import admin
from django.urls import include,path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

修改項目設置:

#mysite/settings.py
INSTALLED_APPS = [    
    'polls.apps.PollsConfig',
#    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
#    'django.contrib.messages',
#    'django.contrib.staticfiles',
]
LANGUAGE_CODE = 'zh-Hant'
TIME_ZONE = 'Asia/Taipei'

然後在項目目錄(最上層)運行gunicorn就可以訪問了:

gunicorn mysite.wsgi --bind 127.0.0.1:3040

nginx中增加如下server即可在外網訪問了(鏈接應該是http://YourPublicIP:8081/polls/upload/):

server {
        listen 8081;
        server_name 127.0.0.1;
        charset utf-8;
        keepalive_timeout 60s;
        #access_log logs/django2a.access.log combined if=$loggable;
        
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
    
            if (!-f $request_filename) {
                proxy_pass http://127.0.0.1:3040;
                break;
            }
    }
}

CentOS6+Django2+MySql

yum install MySQL-python
pip install mysqlclient
#如果import MySQLdb提示無libmysqlclient.so.18
#則建立軟連接如下
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
分類
讀書

《民主的細節》——劉瑜

今天我們還是能看到不少制衡「失靈」的地方。比如很多人認爲 2003 年國會批准伊戰以及後來的批准大額戰爭撥款,就是立法機構對布什政府失去制衡意識的表現。又比如由於相關利益集團的強大力量,美國的軍費開支匪夷所思地龐大。比如,一項分析表明,美國政府每年用於能源研發的費用,僅僅相當於軍費一天半的開支,但沒有足夠的體制制衡力量去糾正這種荒唐。巨額農業補貼,在巴以衝突上的「拉偏架」……都可以說是民主制度失靈的表現。雖然這些失靈值得批評,但因此把民主制度說得一文不值卻是一種「智力上的懶惰」。承認民主既給美國社會帶來很多切實的進步和改善,同時也承認它還是有無力解決的問題,才是一種實事求是的態度。承認杯子不是滿的,同時也承認半滿的杯子總比全空的杯子要好,也許不能帶來激進主義的快感,卻是一種智識上的誠實。

民衆積極參與政治生活和實踐公共責任,不僅僅能增加一個制衡的維度,從而使政治決策更加理性,而且是一個增強社會凝聚力的過程:正是在一次次的「參與儀式」中,公民一次次地肯定自己在這個政治社區裡的成員身份,從而增加對社會的認同感。若是讓認爲「人是天生的政治動物」的亞里士多德來看,公民的參政責任甚至不僅僅是爲了完善政治或者社會,而是爲了完善個人自身一一公共生活中對善、對真、對理性的追求,是個體自省和提升的必經之路。2007 年夏天《時代》雜誌曾經發表一篇文章「MeGeneration」,指出中國當代的年輕人大多注重個體生活,對公共事務漠不關心,此文曾經在網上引起一陣討論,有些年輕人忿忿地指出:「我就是不關心政治怎麼了!」我不想說這種在中國普遍存在的論調是「不道德的」,但我想說,它是「不自然的」。一家人在一起吃飯,媽媽買菜,爸爸洗菜,姐姐做飯,哥哥洗碗,妹妹掃地,但有一個弟弟卻說:「我就是不關心做飯怎麼了!」一件事情明明與每個人都有關係,但卻非要說它跟自己沒有任何關係。我只能說,在今天的中國,有太多的制度和文化障礙遮蔽了公共生活的自然狀態。

……某個神奇的憲法文本,不如說它是一個個公民具體的思維和行爲習慣。當警察對某些恐怖分子嫌疑人,或者政治異議分子,或者新聞記者,或者異教人士,或者普通刑事犯,或者他國戰俘刑訊逼供時,你是決定轉過頭去說「我就是不關心政治怎麼了」,還是決定走上街頭或者給你們當地的政治家寫信表達自己深切的不滿呢?所謂民主的祕密,就藏在你作出選擇的那一剎那。

集權機制度的擁護者比較常見的一個論點是:權力集中可以提高效率,「集中力量辦大事」,沒有那麼多嘰嘰喳喳的辯論和不同團體之間的牽制。這個觀點不無道理,最直觀的例子莫過於中國大躍進期間的「大煉鋼鐵」,短短几個月,上億人給動員起來轟轟烈烈地煉鋼。那個「效率」,令人瞠目結舌。

然而,長遠來看,集權制度真的促進效率嗎?「高效」的煉鋼運動生產出無數廢銅爛鐵導致資源的低效利用。「高效」的人民公社化動帶來的是 20 年低效的農業生產。如果我們把非理性決策所帶來的人力財力和資源浪費、機會成本、民衆和政府之間的信任損失計算進來,集權制度還真的是最有效率的制度嗎?當然並不是所的當權者都是非理性的,也並不是所有的民衆都是理性的,但是,民主的意義恰恰在於:通過不同團體間的觀念碰撞,使理性有更多機會發出聲音。

最近廈門 PX 化工項目引發抗議,神華集團煤變油項目將要停工這兩個新聞,都再次說明了決策的「高效」未必是社會的福社。不民主、不理性的「高效」決策,不過是通過把問題置後或者外部化來掩蓋其社會成本而已,而社會成本在那裡,「遲早都是要還的」。廈門政府未經與民衆充分討論就引進了環境風險較高的 PX 項目,導致廈門人風起雲湧的抗議,致使廈門政府不得不同意緩建該項目;而神華集團的煤變油項目,在投了 100 多億之後,政府突然「頓悟」該項目耗水量太大,使許多人不禁感到奇怪,鄂爾多斯地區又不是今年才開始缺水,爲什麼在 100 多億硬砸進去之後才想到這個問題?

其實,公民參與決策過程並不見得會降低「效率」。它可能會降低「政策制定」的效率,但是它往往會因爲切合民意而提高「政策執行」的效率,而且它可以通過提高決策的合理性來提高資源利用的效率。一個聰明的政府,應當歡迎民意。

中國由於各級人民代表大會並非常設機構,主要政府決策落在行政部門,所以聽證會主要也應由行政部門召開。目前政府的決策越來越重視公衆參與,許多政府部門開始在公共決策中加入聽證程序,但是它還不夠普及,而且許多聽證會形式重於實質。某些地方聽證會拒絕記者採訪、發言代表的產生方式不透明、其聯繫方式也不能公開等等,甚至有些地方聽證還要「彩排」。顯然,這種神祕主義和形式主義的作風與聽證會的基本精神背道而馳。據說民主的實施需要民衆具有「民主素質」,我不知道有什麼比公開透明理性的參與本身更能訓練民衆的「民主素質」正如我不能想象除子跳到水裡學習游泳,還有什麼別的學會游泳的方式。

相比自由,民主則可能是一個更可疑的事物。如此可疑,以至談論它的壞處已經變得比談論它的好處更容易,至少談論它的環處比談論它的好處更容易獲得智力上的滿足。比如,我們常常聽民主可能引起「多數暴政」,民主的動員機制可能導至社會動盪和分裂,它還可能因爲再分配衝動而影響經濟效率…那麼,讓我們重複一遍丘吉爾的那句名言:民主是最差的一種政治制度,除子所有那些其他被實驗過的政治制度之外。好吧,再重複一遍:民主是最差的一種政治制度,除了所有那些其它被實驗過的政治制度之處。我希望這本書給讀者傳達的就是這樣一個信息,民主一一即使是美國的民主也有種種問題,它鼓勵政治的利益集團化,它培育民粹主義的話語,在經濟衰退時它顯露反自由的面目,但作爲政治制衡的一種方式,它在降低當權者的專斷性、促進社會公正和福利、塑造人的公共責任和意識方面仍然有不可替代的作用。更重要的是,美國政治的特色從來不是民主的最大化,而恰恰是民主與自由、平民主義和精英主義之間的博弈。從這個意義上來說,民主之於政治,就像是鹽之於烹飪,太多並不好,但少了也不行。

從這個角度來說,這本書也許可以給讀者提供一些啓迪,也許只是提供一個反面教材而已。我當然希望它能改變一些人對民主自由的看法,但更重要的是,我希望它能激起一些人把政治作爲柴米油鹽、衣食住行來觀察的興趣。我想比一個人的政治立場更重要的,是他抵達一個立場的方式。

2009 上海三聯書店 ISBN 978-7-5426-2958-6/D.141

分類
RIP

211003

警方昨日(2021-10-01)拘捕一名 70 歲男子,今日落案起訴他殘酷對待動物罪。 警方表示,漁護署職員 9 月 30 日在土瓜灣一個公園外工作時,見到一名男子用石頭擲向野鴿群,再拾起其中一隻躺在地上的野鴿,他被職員喝止後拋下野鴿並逃走,該隻野鴿後被證實死亡。警方調查後拘捕一名 70 歲男子,相信他與案件有關,他亦涉嫌 9 月 27 日在同一地點用石頭擲向野鴿。 九龍城警區刑事調查督察陳言彰表示,正調查被捕男子的犯案動機,初步調查顯示他無精神病紀錄,又說在這名男子家中檢獲相信屬於他犯案時身穿的衣服。

来源:RTHK:70 歲男子以石頭擲向野鴿致死 涉虐畜被捕

分類
其它

英文單詞 compliance

compliance

[kəmˈplaɪəns] noun

[U] ~ (with sth) action in accordance with a request or command; obedience 服從; 聽從; 遵從; 順從: Compliance (with the rules) is expected of all members. 要求全體人員都遵守(制度). In compliance with your wishes (ie As you have requested) we have cut off the Internet. 遵照你的要求我們已經切斷了互聯網.

(usu derog 通常作貶義) tendency to agree (too readily) to do what others want 百依百順; 承顏候色

分類
RIP

210929

馬鞍山恆安邨恆山樓一名老翁,懷疑被鄰居斬傷,送院後不治,警方列作謀殺案處理,拘捕一名 35 歲男子,懷疑他與案有關。 案發(2021-09-27)下午 1 時許,警方接報指,一名年約 80 多歲老翁被斬傷,他的其中兩隻手指被斬甩,送往威爾斯醫院深切治療部搶救,其後不治。

来源:RTHK:35 歲漢被捕 懷疑與恆安邨老翁被斬傷案有關


佐敦文苑街一名年約 2 歲男童,(2021-09-27)早上懷疑從高處墮下,送院搶救,延至晚上不治;男童的 36 歲母親,涉嫌疏忽照顧被捕。 今早 10 時許,一名非華裔男童被發現倒臥在文苑街 16 號對開。警方說,經初步調查,相信男童在上址一個單位意外墮下,案件交由油尖警區重案組第一隊跟進。

来源:RTHK:佐敦從高處墮下男童延至晚上不治 母親涉疏忽照顧被捕


日前執勤期間墮海失蹤的水警高級督察林婉儀,遺體今早(2021-09-27)被發現於大澳二澳海面飄浮,警方接報到場撈起遺體,現已送往大欖水警基地。據了解,其家屬已到場了解。警務處處長蕭澤頤亦抵達水警基地。 警方早上近 8 時,收到有艇戶報警指在二澳海面發現有人在海面浮沉。 事發星期六(2021-09-25)早上 8 時許,一艘水警巡邏艇執勤期間在沙洲對開海面翻側,船上 4 名警員墮海,其中 3 人獲救送院,林婉儀失蹤。水警、消防、飛行服務隊昨日繼續在發生意外的龍鼓洲一帶搜索。

来源:RTHK:墮海失蹤水警高級督察林婉儀遺體送往大欖水警基地


屯門龍鼓洲附近海面,昨晚(2021-09-22) 10 時許,有一艘木船與快艇相撞,木船上兩名男子連同船上的貨物墮海,水警救起兩人,其中一名年約 60 歲男子昏迷,送院後不治,另一名 54 歲男子留院治理。 警方初步調查後相信,兩人乘坐木船從內地進入香港水域,54 歲傷者涉嫌危害他人海上安全及非法入境被捕,案件交由水警總區重案組跟進。

来源:RTHK:龍鼓洲附近海面意外一人墮海不治 一人涉非法入境被捕


一名女童在帝琴灣一個泳池懷疑溺斃,她的父親被捕。 警方昨日(2021-09-22)傍晚接獲泳客報案,指該名 7 歲女童懷疑在泳池遇溺,其後泳客將她救起。警員到場後,女童昏迷送院後證實不治。 經初步調查,警方相信女童在游泳期間遇溺,死因有待驗屍後確定。案件暫列為對所看管兒童或少年人虐待或忽略,女童的 38 歲父親被捕。

来源:RTHK: 帝琴灣泳池有女童疑溺斃 父親涉對兒童虐待或忽略被捕


一名 60 至 80 歲的行山人士在香港仔水塘道失足,跌落一個約兩呎(0.6m)深的坑洞,暫時未獲救。 警方昨日(2021-08-31)中午接獲事主報警,警方、消防、飛行服務隊及民安隊人員到場搜救,但到晚上仍未找到他所在的位置, 行動已暫停, 今早會恢復搜救。

来源:RTHK: 行山人士報稱在香港仔水塘道墮坑 搜救今早恢復

分類
方法

通過 ICS 文件給日曆增加農曆

很長一段時間以來,我一直受沒有農曆可用的困擾。安卓原生的日曆不支持農曆,谷歌日曆也是到了安卓 8 才開始有農曆,等我用到安卓 8 的時候我已經開始去谷歌化了。轉用開源日曆應用(Etar)後也沒有發現很好的辦法來解決農曆的問題,主要是曆法這東西真的很複雜。終於在最近找到了一個方案,通過 ICS 文件把計算好的農曆導入日曆就可以了。我這裏提供了從 2017 年 01 月 01 日到 2049 年 12 月 31 日的農曆和節氣與公曆對應關係的 ICS 文件,只要選擇需要的年份導入日曆即可。 這些 ICS 文件是基於 infinet 開發的 lunar-calendar 項目生成的,其原始日期數據來自於香港天文台的公曆與農曆日期對照表。我在使用的時候將節氣和生肖做了繁體中文的轉換,並且刪減了一些不展示在日曆中的文本以減小文件大小。我修改後的腳本也可以在上面的分享文件夾中找到。

順便說下我這邊具體是怎麼導入的:我一直在用 Disroot 提供的 Nextcloud 實例,其中有日曆的功能,而我之前就已經在安卓上通過 DAVx⁵ 來同步日曆和聯繫人了。所以我是在電腦上通過瀏覽器來操作的,理論上在手機上也是類似的。日曆網頁的左側點「新日曆」選擇「新日曆」輸入名稱就創建好了新日曆了,如「農曆」。然後點擊左下角的「設定及匯入」-「匯入日曆」,選擇 ICS 文件然後選擇要匯入的日曆即「農曆」。最後耐心等待一番,因爲我通過網絡請求看到農曆竟然是一條一天這樣傳的,我的文件都是三年三年的,所以要耐心等它傳完,傳完後點擊一下「農曆」左側的開關就可以看到農曆了。手機上同步前先從菜單中「刷新日曆列表」就會出現「農曆」,再來同步就可以在日曆裏看到農曆和節氣了。

當然你也可以通過 Calendar Import-Export 將 ICS 文件導入本地日曆。

本文更新於 2023/03/06。

分類
软件

使用 Send Reduced 來減小圖片大小

Send Reduced 雖然只有區區 52 KB,但是卻有兩個非常好用的功能——壓縮照片和清理 Exif 數據。現在安卓手機照片越來越大,動輒一張照片就八九 MB,但是選擇 85% 的壓縮比壓縮後,圖片大小就只剩下六百多KB,肉眼也沒有可見的畫質損失,很適合發送給聯繫人和社交媒體。

不過也有一個小小缺陷,就是壓縮後的最大尺寸是個選項列表,最大的選擇是 2560,如果你一定要選擇大於此尺寸的圖片,就不能用它不行了。