2022-10-03

【Android】Android13(API33) 起, APP 新增廣告 ID

參考資料 ----

因應 Google 愈來愈保護用戶隱私,自 Android 13(API33) 起,凡是 新建立的 或 要更新版本 的 APP 都要加入 廣告 ID

AndroidManifest.xml
 
<?xml version="1.0" encoding="utf-8"?>
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tw.whalin.plate">
    
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

    <application
        ...
        ...
 

若將 app 的 target(目標系統)版本定在 Android13AndroidManifest.xml 卻沒有加入廣告 ID 的授權宣告,即使在開發測試時期 app 用的是 AdMob 的測試帳號, app 執行時也不會顯示廣告。

要注意的是:現在 android app Google Play Store 的更新是採用 .aab,所以一旦上傳更新到 Android13 的版本就回不去了,沒法再降回 Android12,要想辦法符合 Google 的要求。

2022-08-24

【Python3】FTP_TLS -- 加密連線客戶端應用

注意:Python2.7.18(含) 之後才支援加密連線。
 
 
import sys
from ftplib import FTP_TLS
import ssl


sFTPhost = '主機網址/IP'
sFTPuser = '帳號'
sFTPpwd = '密碼'


# 加密連線
ftps = FTP_TLS(sFTPhost)
# ftps.set_debuglevel(2)  # To show logs
ftps.ssl_version = ssl.PROTOCOL_TLSv1_2    # 調整為您自己的加密協定
ftps.set_pasv(True)
ftps.encoding = 'utf-8'    # 預設是 latin-1 字元, 版本 3.9 之後預設才是 utf-8
ftps.login(sFTPuser, sFTPpwd)

ftps.cwd("/dir1/dir11") # 切換在 server 的目錄
lstFTPfile = ftps.nlst()  # 列出所有檔案
for sFTPfile in lstFTPfile:
    if ('.jpg' in sFTPfile):
        print('sFTPfile = ' + sFTPfile)

        localfile = open(sFTPfile,'wb')   # 本地端要儲存的檔案
        ftps.retrbinary('RETR ' + sFTPfile, localfile.write) # 下載檔案
        localfile.close()


        # 上傳檔案
        localfile = open(sFTPfile,'rb')
        ftps.cwd("/dir1/dir12") # 切換在 server 的目錄
        ftps.storbinary('STOR '+sFTPfile, localfile)

        break
ftps.quit
 


【Python2】FTP 客戶端應用

不確定是不是版本限制,Python2.7 無法加密連線。
 
 
#!/usr/bin/python
#-*- coding:utf-8 -*-

import sys

# FTP
from ftplib import FTP

sFTPhost = '主機網址/IP'
sFTPuser = '帳號'
sFTPpwd = '密碼'


ftp = FTP(sFTPhost, sFTPuser, sFTPpwd)
# ftp = FTP_TLS(sFTPhost, sFTPuser, sFTPpwd)
ftp.cwd("/dir1/dir11") # 切換在 server 的目錄
lstFTPfile = ftp.nlst()  # 列出所有檔案
for sFTPfile in lstFTPfile:
    print 'sFTPfile = ' + sFTPfile
    localfile = open(sFTPfile,'wb')   # 本地端要儲存的檔案
    ftp.retrbinary('RETR ' + sFTPfile, localfile.write) # 下載檔案
    localfile.close()


    # 上傳檔案
    localfile = open(sFTPfile,'rb')
    ftp.cwd("/dir1/dir12") # 切換在 server 的目錄
    ftp.storbinary('STOR '+sFTPfile, localfile)

    break

ftp.quit
 


2022-08-23

【Python】requests 的應用

參考資料 ----

Requests 是一個 Python HTTP 庫,但不是內建,所以要另外安裝
 
#!/usr/bin/python
#-*- coding:utf-8 -*-

import requests

# 最 陽春/基本 的語法
# res = requests.get('https://網址,一定要 https')
# print("res = "+res.text)    # 顯示 server 傳來的字串內容
# 如果網站用的是像 Let's Encrypt 的免費認證
# 造成傳來的字串內容為 An appropriate representation of the requested resource could not be found on this server. This error was generated by Mod_Security. 的錯誤訊息
# 可加下列的 headers
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0', }
res = requests.get('https://網址,一定要 https', headers=headers)


param = {'參數名1':參數值1, '參數名2':參數值2}
res = requests.get('https://網址,一定要 https', param, headers=headers)    # 網址後帶參數 → https://網址?參數名1=參數值1&參數名2=參數值2



# print(res.json())    # 因為字串內容是 json, 所以這指令可顯示 json 內容

lstDataset = res.json()    # 將 json 內容存入 list
for row in lstDataset:
    print("prod no = "+row['prodno']+", prod name = "+row['prodname'])
 




2022-08-22

【Python】微軟的 文字轉換語音(Text To Speach, TTS)

參考資料 ----

申請 "微軟語音服務" 請參考最下方的筆記

系統需求:
Python 3.7~3.10
 
# 目前(2022.08.22) 尚不支援 Ubuntu22
# Ubuntu20 / Linuxmint20 必須安裝這些套件
[user]$ sudo  apt  install  python3-pip  build-essential  libssl-dev  libasound2 wget

[user]$ pip  install  azure-cognitiveservices-speech
 

tts.py
 
import azure.cognitiveservices.speech as speechsdk

speech_config = speechsdk.SpeechConfig(subscription="您申請的金鑰", region="eastasia")    # eastasia 是我在微軟申請服務選取的區域,請置換為您申請的區域
# audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)    # 即時由喇叭播放
audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=False, filename="king.mp3")    # 存成 mp3

# The language of the voice that speaks.
speech_config.speech_synthesis_voice_name='zh-TW-Yating'    // 語音角色: 雅婷

speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)

# Get text from the console and synthesize to the default speaker.
text = "有一位國王,他擁有一座美麗的花園,花園裡有一棵結著金蘋果的樹。國王派人每天清點樹上的蘋果有幾顆。"

speech_synthesis_result = speech_synthesizer.speak_text_async(text).get()

if speech_synthesis_result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
    print("Speech synthesized for text [{}]".format(text))
elif speech_synthesis_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_synthesis_result.cancellation_details
    print("Speech synthesis canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        if cancellation_details.error_details:
            print("Error details: {}".format(cancellation_details.error_details))
            print("Did you set the speech resource key and region values?")
           

 


相關筆記 ----

2022-08-19

【.NET】CentOS 7 安裝 .NET SDK

參考資料 ----

CentOS7 可安裝 .NET6, 可設定以 yum 安裝 .NET SDK
 
[root]#  rpm  -Uvh  https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

[root]#  yum  install  dotnet-sdk-6.0

# 若這台電腦不是要做開發 .NET 程式,則只要安裝 .NET Runtime 執行時期套件
[root]#  yum  install  dotnet-runtime-6.0
 



2022-08-18

【CSS】表格內畫斜線

參考資料 ----

老人家對 CSS 不熟,也聽說時下表格的主流做法也是以 CSS 設計,但工作需要,只能急就章,日後再優化吧...
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
/* 左上右下斜線 */
.slashTL2BR {
  background: linear-gradient(to top right, #fff calc(50% - 1px), black , #fff calc(50% + 1px) )
}

/* 左下右上斜線 */
.slashBL2TR {
  background: linear-gradient(to bottom right, #fff calc(50% - 1px), black , #fff calc(50% + 1px) )
}
</style>
</head>
<body>
    <table border="1">
        <tr>
            <td class="slashTL2BR">
                <table border='0' width='100%'>
                    <tr><td align="right">    左上右下</td></tr> <!-- 以全形空白加大單一格子寬度 -->
                    <tr><td>表格內斜線</td></tr>
                </table>
            </td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td rowspan='2' class="slashBL2TR">
                <table border='0' width='100%'>
                    <tr><td>左下右上</td></tr>
<tr><td align="right">表格內斜線</td></tr> </table> </td> </tr> <tr> </tr> </table> </body> </html>  



2022-08-15

【Delphi】資料庫連線設定釋疑

如果程式的 ADOConnection 連線是去抓電腦的 "系統管理工具" 的連線設定,則 ODBC 連線是抓執行程式的電腦的連線設定。

例如:
程式放在A電腦, user 從B電腦透過網路去執行A電腦上的程式,因為執行程式的是B電腦,所以程式會去抓B電腦的 "系統管理工具" 的 ODBC 連線的設定。

此時,
若B電腦沒有設定 ODBC 連線,程式就會報錯。
若B電腦的 ODBC 連線是連 測試區 的資料庫,所撈的資料就會是測試區的資料。

2022-08-01

【Python】格式化數字顯示

 
iFmt = 1234567890.123456

# , 表示要有千位符號
# .4f 表示 要顯示 4 位小數
print(format(iFmt,",.4f"))    # 顯示 1,234,567,890.1235 (小數點部份也會四捨五入)