2026年6月6日 星期六
2025年9月19日 星期五
AI在我有生之年可能還是輔助!?(天下雜誌文章節錄)
根本不會取代你!為什麼AI的成效被誇大了?
今年七月,美國智庫模型評估與威脅研究(METR)以經驗豐富的軟體工程師為研究對象,請他們分別在有AI/沒有AI的協助下執行寫程式任務。
這是一項至今為止對AI在現實世界中表現,最為嚴格的測試。結果是,工程師們在使用AI的情況下,完成任務的速度比不使用AI時慢了20% 。
METR的研究發現,雖然人工智慧系統已經學會執行一系列任務,但它們難以在現實環境中,以「一致性」和「準確性」完成這些任務。
它們可能會犯一些小錯誤,讓工程師還是要花大量時間檢查、重做——通常比他們自己寫程式碼所需的時間還要長。
研究發現,那些試圖融入AI的公司,幾乎沒有看到太多利潤成長,而那些研究AI取代就業跡象的經濟學家,也大多一無所獲。
麥肯錫三月的一份報告也發現,71%的公司報告正在使用生成式人工智慧,但其中超過80%的公司表示,這項技術對獲利沒有「確切的影響」。
所以,AI是夢幻泡影嗎?
AI也不完全是泡沫騙局。研究AI領域的史丹佛大學經濟學家布林約爾松(Erik Brynjolfsson)指出,每項新科技都會經歷「生產力J曲線」,前期讓企業很難應用,導致生產力下降,但最終企業學會整合技術之後,生產力就會飆升。
AI從現在的窒礙難行狀態到飆升,還要多久?
Anthropic的執行長阿莫迪(Dario Amodei)預測的樂觀答案是2027年,或者「不會太久」,AI就會「在幾乎所有領域都超越人類」。
不過,就像90年代所有名稱中帶有「.com」的公司都輕鬆獲得投資,沒多久投資人發現只是在燒錢。儘管最終真的有少數幾家網路公司成為人類歷史上最賺錢的企業,仍沒有阻止大量投資人血本無歸。
更糟的是,現在人們對AI的投資,遠大於當年的網路革命。這讓一些專家擔憂,如果在J曲線的高峰到來之前市場熱情就大幅冷卻,可能引發金融危機。
至少好消息是,不會失業?
在最近的一項研究中,經濟學家發現,受AI影響最少的工作者(如健身教練)的失業率,其實是受AI影響最大的工作者(如程式設計師)的三倍。
但這不代表員工就不用擔心因AI而起的裁員風險。因為如今的勞動現場,存在一種奇怪的狀態:即使AI還沒辦法提高生產力,它的炒作效應,已讓企業不斷祭出相應措施。
20世紀80年代,電腦、電子郵件和線上日曆等工具,讓知識型員工能夠自行處理通訊和安排會議。許多公司因而決定裁撤秘書崗位,結果卻使得高技能員工必須花費大量時間處理這些庶務,使工作效率大幅降低。
如今,AI很可能成為這個世紀的電子郵件,企業主期待用它來高效替代人力,最終適得其反。
而作為員工,即使明白AI沒能幫上忙或反而幫倒忙,最好還是盡量讓它融入日常工作與績效表之中。
(資料來源:Atlantic, MIT, METR, McKinsey)
原編譯:田孟心 圖片來源Shutterstock
2025年1月12日 星期日
Fedora 33 crontab install & setup
安裝(在roo權限下):
dnf install cronie cronie-anacron
啟動 cron指令:
systemctl start crond.service
觀察 cron狀態指令:
systemctl status crond.service
設定開機啟動 cron指令:
systemctl enable crond.service
官方安裝文件網址:
https://docs.fedoraproject.org/en-US/fedora/f40/system-administrators-guide/monitoring-and-automation/Automating_System_Tasks/
2024年12月7日 星期六
JSP 的error頁面控制
jsp在處理error有以下三種
1.使用<% scriptlet %> 加上傳統try catch自行控制
2.使用jstl的<c:catch>標籤自行控制
3.使用jsp的errorPage設定交給別的頁面處理(又分兩種形式)
a.單一網頁控制errorPage
錯誤發起頁面必須有<%@page errorPage="接收error頁面.jsp" %>設定
範例如下:(檔名為badPage.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page errorPage="errorPage.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
About to be bad....
<% int x=5/0; %>
</body>
</html>
接收error頁面.jsp範例必須有<%@page isErrorPage="true" %>設定
isErrorPage="true"代表可接收前網頁送來exception物件
範例如下:(檔名為errorPage.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
=_=..................show errorPage<br>
Exception is a ${pageContext.exception}
</body>
</html>
b.針對全域或特定類型網頁在web.xml做設定
宣告全體適用錯誤處理頁面
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/errorPage.jsp</location>
</error-page>
宣告特定例外錯誤處理頁面
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/ArithmeticError.jsp</location>
</error-page>
宣告HTTTP ERROR CODE用錯誤處理頁面
<error-page>
<error-code>404</error-code>
<location>/notFoundPage.jsp</location>
</error-page>
2024年3月1日 星期五
JAVA 11 認證考試(1Z0-819) 目標
複習考試主題
多選擇性答案考題(Google翻譯)
https://education.oracle.com/zh_TW/java-se-11-developer/pexam_1Z0-819
使用 Java 資料類型
使用基元和包裝類,包括運算子、括號、類型提升和轉換
使用 String 和 StringBuilder 類別處理文本
使用局部變數類型推斷,包括作為 lambda 參數
控製程序流程
建立和使用循環、if/else 和 switch 語句
Java 物件導向方法
宣告和實例化 Java 物件(包括巢狀類別物件),並解釋物件的生命週期(包括建立、透過重新分配取消參考和垃圾收集)
定義和使用欄位和方法,包括實例、靜態和重載方法
使用實例和靜態初始化語句和建構函數初始化物件及其成員
了解變數範圍、套用封裝並使物件不可變
建立和使用子類別和超類,包括抽象類
利用多態性與轉換來呼叫方法,區分物件類型與引用型別
創建和使用接口,識別功能接口,並利用私有、靜態和預設方法
建立和使用枚舉
例外處理
使用 try/catch/finally 子句、try-with-resource 和 multi-catch 語句處理異常
建立和使用自訂異常
使用數組和集合
使用泛型,包括通配符
使用 Java 數組和 List、Set、Map 和 Deque 集合,包括便捷方法
使用 Comparator 和 Comparable 介面對集合和陣列進行排序
使用串流和 Lambda 表達式
使用 lambda 表達式實現函數式接口,包括 java.util.function 套件中的接口
使用 Java Streams 過濾、轉換和處理數據
執行分解和縮減,包括對順序流和平行流進行分組和分區
Java平台模組系統
部署和執行模組化應用程序,包括自動模組
聲明、使用和公開模組,包括服務的使用
並發性
使用 Runnable 和 Callable 建立工作線程,並使用 ExecutorService 和 java.util.concurrent API 管理並發
使用不同的鎖定機制和 java.util.concurrent API 開發線程安全程式碼
Java I/O API
使用 I/O 流讀寫入控制台和檔案數據
在 Java 物件上實現序列化和反序列化技術
使用 java.nio.file API 處理檔案系統對象
Java SE 應用程式中的安全編碼
開發程式碼以減輕安全威脅(例如拒絕服務、程式碼注入、輸入驗證)並確保資料完整性
保護資源存取(包括檔案系統)、管理策略和執行特權程式碼
使用 JDBC 的資料庫應用程式
連線並執行資料庫SQL操作,使用JDBC API處理查詢結果
本土化
使用區域設定、資源包和 Java API 來解析和格式化訊息、日期和數字來實現本地化
註解
建立、套用和處理註釋
2023年10月4日 星期三
解決 window OS 中java 原始碼,中文預設是Big5編碼,改utf-8亂碼問題
當javac 編譯 .java當時會使用OS預設的locale編碼,在台灣預設Big5也就是MS950,
但你如果把這檔案執行在非Big5如utf-8則會出現亂碼,
即使你把.java編碼一開始存成utf-8也無法改變這狀況,甚至javac會出現以下錯誤:
unmappable character for encoding MS950
想解決這問題,請以下列步驟實行:
/*1.存檔字元集一開始就改utf-8,再打中文字,不然會亂碼
2.存檔檔名為"TestChUTF8.java"
3.javac 編譯請加上編譯參數 "-encoding UTF-8" 完整指令如下:
javac -encoding UTF-8 TestChUTF8.java
4.執行時請加上執行參數 "-Dfile.encoding=UTF-8" 完整指令如下:
java -Dfile.encoding=UTF-8 TestChUTF8
實驗結果:執行參數 "-Dfile.encoding=UTF-8" 可以不加,也可正常顯示
*/
public class TestChUTF8{
public static void main(String[] args){
System.out.println("哈哈中文^_^");
}
}
2023年8月13日 星期日
SHA-1 指紋產生
指令如下:
android studio 開發工具於安裝時會幫你自動產生一個 debug版本用sha-1指紋
故以下指令列出的是debug版本用sha-1指紋(如你沒有自行產生sha-1的話)
keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
重新產生SHA-1指令:
keytool -genkey -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
2023年5月29日 星期一
Android — Gralde Plugin 4.0.0的功能 buildFeatures
2023/05時試驗android時,產生了BuildConfig,binding物件找不到的錯誤,經查詢資料及實作,可用以下方式克服(如:cannot resolve symbol 'BuildConfig')
方式一:在build.gradle(Module:app)檔案加入以下選項:
android {
//.....
buildFeatures {
viewBinding true //建立View Binding物件取代findViewById()
buildConfig true //建立BuildConfig須加這設定
// dataBinding true //過期了目前併入viewBinding
aidl true //為AIDL檔案,產生Binder class
renderScript true //決定是否支援renderScript
resValues true //決定注入客製變數是否進入R.java
shaders true //決定支援 shade AOT compilation
}
}
即使做了以上檔案修改,project設定不一定會自動生效:你最好做以下動作:1.build.gradle----->Sync Now2,選取android studio開發工具: File----->Invalide Caches----->勾選"clear Files","clear VCS"及"Delete embedded browser" 最後按下"Invalidate and Restart" 按鈕3.再選取android studio開發工具:
Build------>clean Project 4.最後再選取android studio開發工具:
Build------>rebuild Project
方式二:在gradle.properties檔案加入以下選項: (這是用在你不止一個模組時的起始設定)android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true參考的官方網址(目前): https://developer.android.com/studio/releases/gradle-plugin?hl=zh-tw#buildFeatures
2023年5月6日 星期六
android adb 使用規則:(version:2023/05/05)
android adb 使用規則:
adb devices或 adb devices -l作用列出所有正在執行的虛擬機
但早期如你要連虛擬機是執行以下文法:
adb connect 虛擬機名:5555
範例:
adb connect emulator-5555:5555
往往你用genymotion,bluestack等android模擬器都這樣做
目前如你要使用 android studio開發工具附帶的模擬器連線需使用
localhost
指令如下:
adb connect localhost:5555
adb connect 127.0.0.1:5555
google官方虛擬機有兩個版本:
google play及google api版
但google play版沒開放root權限
要操作虛擬機須進入 虛擬機shell command mode
指令如下:
adb -s 127.0.0.1:5555 shell
但以上指令有時並不是以root權限執行,
如要以root 權限執行(有時可執行)
adb -s 127.0.0.1:5555 shell root
linux 不確定目錄在哪可下pwd指令:
ls list列出目前目錄的全部
早期 adb一旦連線就只需針對特定機器動作
但目前adb指令即使只有一台模擬器也需使用 -s 參數指定模擬器,規則如下:
adb -s 模擬器名:port
window 目錄用 "\",有磁碟概念
unix-like 目錄用 "/",沒有磁碟概念
目前adb指令新增了root 參數,可讓adb操作重新啟動在root權限下
範例如下:adb -s 127.0.0.1;5555 root
adb -s 模擬器名:port pull <要取檔案或目錄> [<放到哪個路徑>]: 拉檔案或目錄出來
範例:
adb -s 127.0.0.1:5555 pull /data/data/com.example.sharepreferences/shared_prefs/PREF_LOGIN.xml e:\kotlin
要取檔案或目錄 /data/data/com.example.sharepreferences/shared_prefs/PREF_LOGIN.xml
放到哪個路徑 e:\kotlin
adb -s 模擬器名:port push <檔案或目錄> <推到哪個路徑>: 推檔案或目錄進去
adb install <apk>: 安裝 apk,當已經安裝過舊版本的程式時,可以使用 -r 去覆蓋。
2023/05/05紀錄 database inspect改版放在 app inspecte功能下,如何進入選 android studio 的view功能再選Tool window下就有app inspect
sqlite3 執行在 adb 連線狀態下,因權限限制必須abd先限特定模擬主機,再於 android linux terminal mode下
執行下列文法:
sqlite3 /目錄/目標.db
範例:
sqlite3 /data/data/com.example.app/databases/rssitems.db
參照官網:https://developer.android.com/studio/command-line/adb?hl=zh-tw
2023年4月21日 星期五
sevlet的filter繼承版本及使用規則
繼承版本
早期是繼承 interface的 javax.servlet.Filter
servlet 4.0規格
是建議繼承 abstract class的javax.servlet.http.HttpFilter
兩種Filter基本建立規則一樣
(2023/04/21 Eclipse 在自動建servlet 4.0的filter時,有點小錯,
會同時繼承 javax.servlet.Filter,javax.servlet.http.HttpFilter
實際繼承一個就可)
使用規則
使用web.xml紀錄filter,依照filter定義在web.xml順序執行filter chain
使用annation則依照filter class的class name編碼順序執行
如AFilter.class,BFilter.class,CFilter.class順序執行
(2023/04/21 web.xml及annotation同時存在,竟然執行兩次,web.xml先執行
在執行annotaion設定的Filter,但不知是bug,還是規範如此)
Filter 每一個是各自獨立,故Filter chain必須做到無相依
例思考問題:壓縮Filter及浮水印Filter有先後必須完成順序
但Filter各自獨立,也沒有一定執行規則順序?
Servlet 2.4規格定義了<dispatcher>標籤
<filter>
<display-name>AFilter</display-name>
<filter-name>AFilter</filter-name>
<filter-class>com.lccnet.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/*</url-pattern><!-- url-pattern 與 單一servlet-name二選一 -->
<dispatcher>REQUEST</dispatcher><!-- 沒dispatcher預設 REQUEST -->
<dispatcher>INCLUDE</dispatcher><!-- dispatcher只能最多四個 -->
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
2021年11月23日 星期二
Python set 集合運算
x = {"apple", "banana", "cherry"}
y = {"google", "sun", "apple"}
#交集
#z = x.intersection(y)
z=x&y
print(z)
#差集
#z2 = x.difference(y)
z2=x-y
print(z2)
#對稱差
#z3 = x.symmetric_difference(y)
z3=x^y
print(z3)
#聯集
#z4=x.union(y)
z4=x|y
print(z4)
2021年5月11日 星期二
Lg4j2 for JAVA動態網頁基礎使用(無maven)
每個Level有對應的intLevel整數值,數值越小等級越高,數值越大等級越低。
| Level | intValue | 用途 |
|---|---|---|
OFF | 0 | 不輸出任何日誌 |
FETAL | 100 | 造成應用程式停止的日誌 |
ERROR | 200 | 造成應用程式錯誤的日誌 |
WARN | 300 | 可能導致錯誤的日誌 |
INFO | 400 | 一般資訊的日誌 |
DEBUG | 500 | 除錯資訊的日誌 |
TRACE | 600 | 更細的除錯資訊,通常用來追蹤程式流程的日誌 |
ALL | Integer.MAX_VALUE | 輸出所有日誌 |
Logger輸出的等級大於等於Logger設定的等級時才會輸出訊息。
高---------------------------------------低
FETAL > ERROR > WARN > INFO > DEBUG > TRACE
要使用Log4j2需四個項目:(tomcat須為含7以上)
一.下載 apache Log4j2
https://logging.apache.org/log4j/2.x/download.html
二.設定使用log4j-api-2.xxx.jar及log4j-core-2.xxx.ja進classpath
如在Eclipse IDE中須將上述的兩個jar放入
(a).webapps--> builderPath-->Libraries-->classpath
可消除編輯程式碼的錯誤
(b).DynamicWebProject下的WEB-INF/lib目錄
可消除執行程式碼的錯誤
三.建立Log4j2的參數檔,檔名為log4j2開頭,副檔名及格式可為".properties","xml',"json"
以下是log4j2.xml範例
==================================================================
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
==================================================================
Log4j2的參數檔,放置位置有src,classpath及WEB-INF三個地方,JSP DynamicWebProject
我建議 WEB-INF/classes目錄
四.Log4j2的servlet及jsp範例程式如下:
==================================================================
package com.lccnet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
* Servlet implementation class Servlet1
*/
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet1() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
Logger log = LogManager.getLogger(this.getClass());
log.info("Show INFO message");
log.warn("Show WARN message");
log.error("Show ERROR message");
log.fatal("Show FATAL message");
/*
* 高---------------------------------------低
* FETAL > ERROR > WARN > INFO > DEBUG > TRACE
* */
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
==================================================================
==================================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="org.apache.logging.log4j.Logger,org.apache.logging.log4j.LogManager"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello World!
<%
Logger log = LogManager.getLogger(this.getClass());
log.info("Show INFO message");
log.warn("Show WARN message");
log.error("Show ERROR message");
log.fatal("Show FATAL message");
%>
</body>
</html>
==================================================================
2021年4月13日 星期二
Jsp init-param web.xml
<servlet>
<servlet-name></srvlet-name>
<jsp-file></jsp>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</servlet>
<%!
public void jspInit(){}
public void jspDestory(){}
%>
| Servlet | JSP | |
| Application | getServletContext().setAttribute(key,value); | application.setAttribute(key,value); |
| Resquest | request.setAttribute(key,value); | request.setAttribute(key,value); |
| Session | request.getSession().setAttribute(key,value); | session.setAttribute(key,value); |
| Page | NONE | pageContext.setAttribute(key,value); |
pageContextˋ這jsp隱含變數有一特殊功能可指定存取任何範圍的attribute
pageContext.setAttribute(key,value); -->page範圍
pageContext.setAttribute(key,value,PageContext.SESSION_SCOPE); -->session範圍
如不確定是哪一範圍可用
pageContext.findAttribute(key)尋找
isErrorPage
errorPage
<web-app>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
</web-app>
${application.sno} <!-- Expreesion Language use -->
