【Delphi7】讀取 UTF-8 文字檔

Delphi 預設讀取 ASCII 文字檔,若要讀取 UTF-8 格式的文字檔,則需要轉換。

Form1 上放一個 buttonmemo,然後在 button onclick event 寫入以下程式碼:


procedure TForm1.Button1Click(Sender: TObject);
var
    myfile: TextFile;
    s: string;
begin
    memo1.clear;

    AssignFile(myfile, 'd:\temp\list.csv');
    Reset(myfile);

    while not EOF(myfile) do
    begin
        ReadLn(myfile,s);
        s := UTF8ToAnsi(s);
        memo1.Lines.Add(s);
    end;

    CloseFile(myfile);
end;

【Oracle】撈出例假日的語法

函式說明
 
TO_DATE(string1 [, format_mask] [, nls_language]):將字串轉成日期型態
第 1 個參數是 轉換的字串 的值
第 2 個參數是您的欄位, 字串的 年, 月, 日 的排列
TO_DATE(enter_date,'YYYYMMDD')



TO_CHAR(value [, format_mask] [, nls_language] ):將日期型態轉成字串
第 1 個參數是 要轉換的日期型態 的值
第 2 個參數是 要轉換的 格式, 其中 'D' 是指一週的第幾天
星期日是 1, 星期一是 2, 星期六是 7
 



 
SELECT  DISTINCT enter_date, TO_CHAR(TO_DATE(enter_date,'YYYYMMDD'),'D') dayofweek FROM table
    WHERE enter_date BETWEEN '20180101' AND '20181231'
        AND TO_CHAR(TO_DATE(enter_date,'YYYYMMDD'),'D') IN (1,7)
    ORDER BY enter_date
 

【Android Studio】將 Java 程式碼轉換成 Kotlin 碼

參考資料 ----
Convert existing Java code to Kotlin code


打開要轉換成 KotlinJava 程式檔
功能表 Code
Convert Java File to Kotlin File

Android Studio 就會自動將 Java 程式碼轉換成 Kotlin 程式碼了



可以藉由這種方式,觀摹並對照 Kotlin 風格的程式寫法

【Android Studio】Kotlin 設定 AdMob 廣告



Kotlin 是目前 Google 力推的開發 Android APP 的語言,語法比 Java 更簡潔


* 建立一個新專案


* 輸入專案名稱 Test,選擇專案放置目錄為 D:\test\kotlin\Test,注意 include Kotlin support 要打勾


* 指定最低相容裝置,在本例為 JellyBean4.1(API16)


* 選擇 Activity 樣本


* 設定 Activity 的名字,在本例為 MainActivity,並且不打算相容舊版,所以 Backwards Compatibility(AppCompat) 的打勾取消


* 開啟 strings.xml,加入 AdMob測試帳號
 
<resources>
    <string name="app_name">Test</string>

    <!--  adMob app id 測試  -->
    <string name="admob_app_id">ca-app-pub-3940256099942544~3347511713</string>
    <!-- 橫幅 測試 -->
    <string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string>
    <!-- 插頁 測試 -->
    <string name="interstitial_ad_unit_id">ca-app-pub-3940256099942544/8691691433</string>
    <!-- 影片 測試 -->
    <string name="video_ad_id">ca-app-pub-3940256099942544/5224354917</string>
</resources> 



* 切換成 Project 模式,打開 app 層級的 build.gradle,加入 play-services-ads

 
dependencies {
    ...
    ...

    // AdMob
    implementation 'com.google.android.gms:play-services-ads:17.1.2'
}
 


* 開啟 AndroidManifest.xml
 
<application
    ...
    ... />

    <!-- AdMob -->
    <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="@string/admob_app_id"/>
 




* 開啟 activity_main.xml,置換成下述內容,注意第 6 行

xmlns:ads="http://schemas.android.com/apk/res-auto"
 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".QbankMainActivity">

    <com.google.android.gms.ads.AdView
            android:id="@+id/adView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            ads:adSize="SMART_BANNER"
            ads:adUnitId="@string/banner_ad_unit_id" />


</RelativeLayout>
 


開啟 MainActivity.kt
 
package com.example.test

import android.app.Activity
import android.os.Bundle
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.MobileAds
import kotlinx.android.synthetic.main.activity_main.*    // 注意這一行

class MainActivity : Activity() 
{

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_qbank_main)

        // AdMob 初始化
        MobileAds.initialize(this, getString(R.string.admob_app_id));

        // 橫幅廣告
        // 透過第 8 列的 import, 直接參照到 adView, 而不用再 findViewById
        adView.loadAd(AdRequest.Builder().build())
    }
 



【AdMob】設定 Applovin 中介服務

參考資料 ----
Integrating AppLovin with Mediation



Android SDKAPI 等級需在 API14(ICS4.0.3, 含) 以上

APP 層級的 build.gradle
 
...
...

dependencies {
    ...
    ...

    implementation 'com.applovin:applovin-sdk:9.1.0'
    implementation 'com.google.ads.mediation:applovin:8.1.4.0'
}
 


AndroidManifest.xml
 
...
...
<application
    ...
    ...

    <!-- AppLovin -->
    <meta-data android:name="applovin.sdk.key"
                  android:value="Hos78dCUoIz06RoEMyKlTxOzMFUO3A6??????????XO2zAHK6b4aWSTui1HmBO68LZDxE??????????-5gTc85"  />

        ...
        ...
 


MainActivity.java
 
import com.applovin.sdk.AppLovinSdk;

...
...

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_itnote_main);

        // AppLovin 初始化
        AppLovinSdk.initializeSdk(this);
        ...
        ...
 
啟動您的 APP,等候約 20 ~ 30 分鐘後,登入 AppLovin,在 AppLovindashboard ,輸入 APP 完整的 package 名稱, 應該就可以搜尋到。



切換到 Account,複製 SDK Key




此時,可以移除 MainActivity.javaonCreate

AppLovinSdk.initializeSdk(this);



* 登入 AdMob,設定中介服務



點選 AppLovin,輸入 Report Key




回到 AppLovindashboard
→ 點擊 Monetize
Manage Apps
→ 切換為 Test Mode, 等候約 30 分鐘後生效;若沒切換為 Test Mode,則約 2 小時後生效





懶得等了,直接打包更新 Google Play,之後三不五時瞄一下橫幅廣告,就會發現有不同的橫幅出現


AdMob 的橫幅,右上角有個 「X」的圖示




AppLovin 的橫幅,廣告資訊的圖示只有 1 個


點擊 i 圖示 後,就可以看到這是 AppLovin 的廣告


不過,廣告收入似乎也分散了,原以為所有中介廣告費統一由 AdMob 發放,看來好像是各發各的,廣告計算又是每日歸零。

例如:
本來只有 AdMob 時,一天可以有一美元,廣告流量分散到 2 家後,大部份廣告來源仍是 AdMob,只有極小量來自 AppLovin,而 AppLovin 的量又達不到最低的 0.01 美元門檻,所以當日在 AppLovin 的廣告等於是白播放 & 白點擊 的了。

所以用戶少的 APP,啟用中介服務似乎不是很划算,這個有待觀察。

【jQuery】radio button group 的操作

JQuery

 
<script>
    $(function()
    {   // 當 radio 被選取時, 文字變成 藍色
        $('input:radio[name=buy_type]').click(function() 
                                            {
                                                $('.rgpBuytype').css('color', 'black');     // 所有的 radio 文字回復成 黑色
                                               
                                                // 選取的 radio 文字變 藍色
                                                // 先取得被選取的 radio button 的 value
                                                // 將 value 轉換成 div 的 id
                                                $('#'+$(this).val()).css('color', 'blue');
                                            });
    });
</script>

...
...
 




HTML

所有同一組的 radio buttonname 需相同
外面包一個 div,並且宣告其 class,可以對所有同組的 radio button 的屬性做同時且一致的變化,在本例中,就是讓所有 radio button 的文字變成黑色
 
<div class="rgpBuytype" id="ans1" ><input type="radio" name="buy_type" value="ans1" />答案一</div>
<div class="rgpBuytype" id="ans2" ><input type="radio" name="buy_type" value="ans2" />答案二</div>
<div class="rgpBuytype" id="ans3" ><input type="radio" name="buy_type" value="ans3" />答案三</div>
 


取得被選取的 radio button 的值的方法
 
var buy_type = $('input:radio[name=buy_type]:checked').val();
 

【VisualStudioCode】設定功能表語言為中文

Ctrl + Shift + P 螢幕中央上方會顯示一個小輸入欄



輸入 display 後按 ENTER 鍵

VS Code 會打開一個 locale.json 檔,輸入如下內容
{
    // 定義 VS Code 的顯示語言。
    // 如需支援的語言清單,請參閱 https://go.microsoft.com/fwlink/?LinkId=761051。
 
    "locale":"zh-tw" // 在重新啟動 VS Code 前,變更不會生效。
}
重新啟動 VS Code 就生效了。

【Python】CentOS7 安裝 Python3

參考資料 ----
How to install Python 3 on CentOS 7
軟件選集(SCL)軟件庫
How can I make a Red Hat Software Collection persist after a reboot/logout?


想在 CentOS7 使用 Python3 是有點小麻煩的。

RedHat 的套件政策是:主版本週期定為 10 年,主版本釋出後,所包含的套件都會維持主版本不變;例如:CentOS7 內含的 Python 版本是 2.7,在這 10 年間,Python 的版本就會是 2.7.x 的更新。

Python 因為太好用,所以許多套件將 Python 綁在一起,如果想要移除 Python2,會因為套件的相依性而連帶移除了其他原本不想或不能移除的套件!例如:重要的套件管理 yum

但是,10 年是會有滄海滄田的變化的,雖然 RedHat / CentOS 的主要對象是企業,企業重視系統的穩定使用,同時也希望在下一個主版本釋出前,可以對新工具 / 新功能進行 開發 / 測試 / 研究 / 實驗。

RedHat 聽到了企業的聲音,推出了 Software Collections(SCL)SCL 包含了新的套件可供安裝,其中 Python3 的版本,目前更新到 3.6


[root]# vi  /etc/yum.repos.d/CentOS-Base.repo
→ 找到 [extras]
將 enabled 值改成 1
:x 存檔離開


[root]# yum  install  centos-release-scl


偷懶,安裝所有以 rh-python36 字首的套件  :-P

[root]# yum  install  rh-python36*


此時 Python2Python3並存 CentOS7 內的,這時若查詢系統預設執行的 Python 版本

[root]# python  --version

會回應顯示 python 2.7.5



若要以 Python3 執行,則要先下指令:

[root]# scl  enable  rh-python36  bash

再查詢一次

[root]# python  --version

這次就會回應 python 3.6.3

但因為 SCL  原意就是讓我們可以同時使用 Python2Python3,所以當您 登出 或 重新開機,預設要執行的 Python 版本又會回到 2.7


若要每一次登入,預設執行的 Python 版本都是 Python3,方法如下(不過 RedHat 也說這是解套方法,他們還沒想出正解):


建立 rh-python36.sh

[root]# vi /etc/profile.d/rh-python36.sh
 
#!/bin/bash
source  scl_source  enable  rh-python36
 
:x 存檔離開

登出系統,再重新登入

[root]# python  --version
系統就會回應

python 3.6.3



方法二:

Python3 會安裝在下述的路徑

/opt/rh/rh-python36/root/bin/python

在您撰寫的 python 程式的第一行指定要執行的 Python 直譯器

例如,您的程式名為 test.py
 
#!/opt/rh/rh-python36/root/bin/python
import sys
import platform

print(platform.python_version())
 

然後,變更 test.py 的屬性為可執行

[root]# chmod  a+x  test.py

這樣,您的程式會變成可執行檔

執行方式為:切換到 test.py 所在的目錄下,直接執行 test.py

[root]# ./test.py

【Android】AdMob 的測試帳號

參考資料 ----
Sample ad units for Android
Test Ads for iOS


Android
Ad format Sample ad unit ID
Banner ca-app-pub-3940256099942544/6300978111
Interstitial ca-app-pub-3940256099942544/1033173712
Interstitial Video ca-app-pub-3940256099942544/8691691433
Rewarded Video ca-app-pub-3940256099942544/5224354917
Native Advanced ca-app-pub-3940256099942544/2247696110
Native Advanced Video ca-app-pub-3940256099942544/1044960115


iOS
Ad format Sample ad unit ID
Banner ca-app-pub-3940256099942544/2934735716
Interstitial ca-app-pub-3940256099942544/4411468910
Interstitial Video ca-app-pub-3940256099942544/5135589807
Rewarded Video ca-app-pub-3940256099942544/1712485313
Native Advanced ca-app-pub-3940256099942544/3986624511
Native Advanced Video ca-app-pub-3940256099942544/2521693316

【Android Studio】All com.android.support libraries must use the exact same version specification 的解決方法


在我的 app 層級build.gradle
 
...
...

dependencies {
    implementation 'com.android.support:support-v4:27.1.1'

    ...
    ...
}

出現錯誤訊息
 
All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 27.1.1, 26.1.0. Examples include com.android.support:recyclerview-v7:27.1.1 and com.android.support:customtabs:26.1.0 less... (Ctrl+F1)

There are some combinations of libraries, or tools and libraries, that are incompatible, or can lead to bugs. One such incompatibility is compiling with a version of the Android support libraries that is not the latest version (or in particular, a version lower than your targetSdkVersion).
 

關鍵在於
com.android.support:customtabs:26.1.0

com.android.support:support-v4:27.1.1
版本不同

所以再加入 customtabs 並指定版本為 27.1.1 即可,如下:
 
...
...

dependencies {
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:customtabs:27.1.1'

    ...
    ...
}