[Java] 在Java中執行Apple Script (How to run apple script in Java?)

這兩行 Apple script

set volSettings to get volume settings
set volume output volume ((output volume of volSettings) + 7)

是讓 Mac 的系統音量提高一格

同理,要讓它降一格就改成 -7 就行了

 

ps. Mac 的系統音量是 16 格 而 apple script 的音量值大小是以百分比來看 所以就用 100/16 = 6.25 每一格,取整數為 7

這支 Demo 是在 java 中執行上述的兩行 Apple script

 

完整 Code:

class AppleScriptTesting{
	public static void main(String[] args){
		Runtime runtime = Runtime.getRuntime();
		String applescriptCommand =  "set volSettings to get volume settings\n" + 
                             "set volume output volume ((output volume of volSettings) + 7)\n";
		String[] script = { "osascript", "-e", applescriptCommand };

		try{
			Process process = runtime.exec(script);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 

參考:

Java AppleScript: How to run a multi-line Applescript command from a Java program: https://alvinalexander.com/blog/post/java/how-run-multi-multiple-line-applescript-java-program

[Java] 把 Java 的選單列改到 Mac 的選單列上(Put JMenuBar to Native Mac OS X menubar)

使用前:

使用後:

 


一開始我是找到這篇:

https://alvinalexander.com/apple/mac/java-mac-native-look/Putting_JMenuBar_on_Mac_men.shtml

把下面這行加入到程式碼裡:

System.setProperty("apple.laf.useScreenMenuBar", "true");

發現無效!

 

然後又看到別篇有人說要在main function的很早就要放 System.setProperty 這行了

我把它移到 main 的最上面了,還是不行!

 

 

後來是這篇成功了:

https://stackoverflow.com/questions/1654531/jmenubar-at-the-top-in-macosx

原來是我加入 JMenuBar 和原來的不一樣

要使用 setJMenuBar 的方式來加入選單列才可以用

System.setProperty("apple.laf.useScreenMenuBar", "true");

放到 Mac OS X的原生選單列上

 

我原來加入選單列的方式是:

Container contentPage = getContentPane();
contentPage.add(menubar, BorderLayout.NORTH);

 

 

[Mac] 設定全域快速鍵來開啟Youtube (Global shortcut to launch Youtube)

有時候就是很懶,不想開瀏覽器然後再點我的最愛,才能連到youtube

就算在 Mac 上已經有神器 Alfred,只要用快速鍵(我的快速鍵是option+空白鍵)開 Alfred

然後用自訂的 keyword 來啟動 app store 都抓得到的 youtube app

不過還是很懶(扭~~)

 

我會想要設定快速鍵來啟動 Youtube App,是因為我想要在背景聽 youtube 的音樂

不想要他放在我的 safari 的分頁裡,也不想讓他放在我桌面的任何地方

所以就可以 cmd+shift+’,換完別首歌後,再 cmd+h 讓他隱藏

 

反正就是懶人專用,讓 Automator 來幫我們做事吧

分成兩個部分

  1. 在 Automator 制訂服務
  2. 用 System Preference 讓 服務 綁定自訂的快速鍵(前提是這個快速鍵不衝突其他功能的快速鍵)

 


  1. Automator 服務

到這裡就可以存檔了!

 

2. 替剛剛做好的服務,綁定一個快速鍵

開啟”系統偏好設定”(System Preference),切換到”鍵盤”裡面的”快速鍵”中的”服務”

找到”一般”裡面,你剛剛做好的服務所取的名字,替他加入一個快速鍵

然後不用關機就直接成立囉,可以直接用用看,如果沒反應

那可能是你設定的快速鍵有衝突到別的功能,換換別的快速鍵試試看吧

 

ps. 同理可以設定多個快速鍵,來快速啟動某些非常常用的 App 哦

[Eclipse] 讓你的Eclipse也有自動提示程式碼的功能

我是先接觸 Android Studio 開發一些簡單的 App

後來想把 Java 底子打穩

才轉用 Eclipse 練習 Java 專案開發的

 

但是在剛轉換兩個 IDE 時,最讓我適應不良的地方就是

Eclipse 沒有像是 Android Studio 有自動提示程式碼的功能拉!!

像我這種還是練習中的新手,對各種 library、class 都還很不熟

一沒有提示就很難進行開發

 

所以就來記錄一下,怎麼樣讓 Eclipse 也有自動提示的功能

主要是參考這篇文章:電腦茶包|讓你的Eclipse更好用

不需要額外加裝套件,不過會需要多用一些電腦資源

也就是會有一點Lag

 

不過!!!為了自動提示,這點不方便不算什麼!!

也就是讓他判斷到這些字元,就觸發自動提示的功能

 

[Mac] run a system notification in Java

Java 程式端可以呼叫終端機來執行 apple script

靠的是 runtime.exec(args); 這行,來執行 args 的參數們

 

而實際執行的指令是

osascript -e 'display notification "Take a break" with title "Time up!!!" sound name ""'
//可直接在終端機執行

 

我是放在 timer 倒數完結後(timeOut Override method),引發一個系統通知:

Runtime runtime = Runtime.getRuntime();
String[] args = { "osascript", "-e", "display notification \"Take a break\" with title \"Time's Up!!!\" sound name \"\"" };

try
{
    Process process = runtime.exec(args);
}
catch (IOException ioError)
{
    ioError.printStackTrace();
}

references:

https://alvinalexander.com/blog/post/java/how-run-execute-applescript-java-mac

https://apple.stackexchange.com/questions/57412/how-can-i-trigger-a-notification-center-notification-from-an-applescript-or-shel

[Mac App] A simple Menu Bar App in Java

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;

public class MenuBarIconTest {
    public static void main(String[] args) throws MalformedURLException {
        TrayIcon trayIcon = null;
         if (SystemTray.isSupported()) {
             // get the SystemTray instance
             SystemTray tray = SystemTray.getSystemTray();
             // load an image
             Image image = Toolkit.getDefaultToolkit().getImage(new URL("http://cdn1.iconfinder.com/data/icons/Hypic_Icon_Pack_by_shlyapnikova/16/forum_16.png"));
             // create a action listener to listen for default action executed on the tray icon
             ActionListener listener = new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                     System.out.println("action");
                     // execute default action of the application
                     // ...
                 }
             };
             // create a popup menu
             PopupMenu popup = new PopupMenu();
             // create menu item for the default action
             MenuItem defaultItem = new MenuItem("Do the action");
             defaultItem.addActionListener(listener);
             popup.add(defaultItem);
             /// ... add other items
             // construct a TrayIcon
             trayIcon = new TrayIcon(image, "Tray Demo", popup);
             // set the TrayIcon properties
             trayIcon.addActionListener(listener);
             // ...
             // add the tray image
             try {
                 tray.add(trayIcon);
             } catch (AWTException e) {
                 System.err.println(e);
             }
             // ...
         } else {
             // disable tray option in your application or
             // perform other actions
             //...
         }
         // ...
         // some time later
         // the application state has changed - update the image
         if (trayIcon != null) {
             //trayIcon.setImage(updatedImage);
         }

    }
}

 

reference:

https://stackoverflow.com/questions/13481504/creating-an-nsstatusitem-menubar-app-in-java

[Mac App] 以Java檔從零打造Mac App

  1. 打包寫好的 Java 程式,製作成 Jar 檔
  2. 將 Jar 檔打包成可以在 Mac 點兩下就執行的 Mac App

 

將編譯好的Class 打包成Jar

除了class檔們之外,還要製作一個純文字檔: manifest.mf (副檔名也可以是txt)

裡面內容為:(主要是要指定我們的起始MainClass是哪一個檔案)

Main-Class: HelloWorld



// 注意: 1. Main-Class寫完後,要往下空兩行
//       2. Main-Class的冒號後面記得要加一個空白

(假設我們的起始class檔為 HelloWorld.class的話,完成MainClass設定後,存檔為 manifest.mf)

 

再來打開終端機,輸入

$ jar cvfm MyJar.jar manifest.mf HelloWorld.class HelloWorld$1.class
// cvfm 的順序,會影響到後面接的參數順序

如果有很多個 class 檔也可以寫成
$ jar cvfm MyJar.jar manifest.mf *.class

就成功打包成為 MyJar.jar 檔

 

將 Jar 打包成 Mac App

可以利用現成的程式來打包: jar2app

從名字就可以推斷出,就是要將 jar 轉為 app 檔

這支程式是以終端機指令來進行包裝

 

安裝方式:

$ git clone https://github.com/Jorl17/jar2app
$ cd jar2app
$ chmod +x install.sh uninstall.sh
$ sudo ./install.sh

 

安裝完後,

將終端機目錄切換到 Jar 檔的所在目錄

$ jar2app MyJar.jar -i icon.icns

( icns 檔為 Mac App 的 icon 樣子,需事先準備好)

隨即就產生 MyJar.app 的 Mac App 囉

 

 

[Java] 找因數、判斷質數

import java.util.*;


public class PrimeFactorJudger{
	public static void main(String[] args){

		//從執行時的輸入字串找出所有因數、判斷是否質數
		for(String inputString:args){
			if(isNumeric(inputString)){
				int inputNumber = Integer.parseInt(inputString);
				printAllFactor(inputNumber);
				isPrime(inputNumber);
			}else{
				System.out.println(inputString + " is not Numeric");
			}
		}

		//找出100以內的質數
		/*
		for(int i=1; i<=100; i++){
			isPrime(i);
		}
		*/

	}

	public static void isPrime(int inputNumber){
		try{
			Queue<Integer> factors = findFactors(inputNumber);
			//factors = findFactors(inputNumber);
			if(factors.size() == 2){
				System.out.println(inputNumber+ " is Prime");
			}else{
				System.out.println(inputNumber+ " is not Prime");
			}
		}catch(Exception e){
			System.out.println("Exception!");
		}
	}


	public static void printAllFactor(int inputNumber){

		System.out.print(inputNumber+ "的因數有: ");
		System.out.println(findFactors(inputNumber));
	}

	public static Queue findFactors(int inputNumber){
		Queue<Integer> factors = new LinkedList<>();
		for(int i=1; i<=inputNumber; i++){
			if(inputNumber%i == 0){
				factors.add(i);
			}
		}
		return factors;
	}

	public static boolean isNumeric(String str){
		return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
	}

}

 

如何執行:

javac PrimeFactorJudger.java
java PrimeFactorJudger 參數們
e.g.
java PrimeFactorJudger 13 100 20 39 abc

Java編譯器的參數怎麼下

假設我們想要把程式java檔和編譯過的class檔分開在不同資料夾下

project資料夾底下放著 src 和 classes 兩個資料夾

src: 放java檔(原始碼),目前裡面有兩個檔案:Main.java, Console.java

classes: 放class檔(編譯後),目前裡面為空

 

開啟terminal,將目錄切換到project資料夾,輸入

javac -verbose -sourcepath src -d classes src/Main.java

-verbose:可以看到編譯的過程

-sourcepath:之後接的參數src,就是我們存放java檔的資料夾

-d:之後接的參數classes,就是我們想要放編譯後的class檔的資料夾(可以把d想成destination或directory)

最後接的參數就是我們想要編譯的檔案,放在src資料夾底下的Main.java檔

 

也可以再多下一個參數

-cp/ -classpath:之後接的參數,在這個情況是classes資料夾,也就是如果整個專案中,在classes裡,有些檔案沒有更改,就不會重新再編譯一次

如何移除/編輯wordpress頁尾的版權? How to remove/edit the copyright footer of wordpress?

如何移除/編輯wordpress頁尾的版權?

Powered by WordPress 和 Theme: 字眼?

 

 

這一點很根據每個主題的不同要找不同的檔案來改

在這裡我舉Spacious為例:

主要程式碼放在footer.php裡

而實際function放在inc/functions.php裡

 

所以footer.php其實不用去動

只要找到inc/functions.php裡面和copyright字眼有關的add_action

改成自己想要的字即可

 

add_action( 'spacious_footer_copyright', 'spacious_footer_copyright', 10 );
/**
 * function to show the footer info, copyright information
 */
if ( ! function_exists( 'spacious_footer_copyright' ) ) :
function spacious_footer_copyright() {
    $site_link = '<a href="' . esc_url( home_url( '/' ) ) . '" title="' . esc_attr( get_bloginfo( 'name', 'display' ) ) . '" ><span>' . get_bloginfo( 'name', 'display' ) . '</span></a>';

    $wp_link = '<a href="'.esc_url( 'https://wordpress.org' ).'" target="_blank" title="' . esc_attr__( 'WordPress', 'spacious' ) . '"><span>' . __( 'WordPress', 'spacious' ) . '</span></a>';

    $tg_link =  '<a href="'.esc_url( 'https://themegrill.com/themes/spacious' ).'" target="_blank" title="'.esc_attr__( 'ThemeGrill', 'spacious' ).'" rel="designer"><span>'.__( 'ThemeGrill', 'spacious') .'</span></a>';

    /*$default_footer_value = sprintf( __( 'Copyright &copy; %1$s %2$s.', 'spacious' ), date( 'Y' ), $site_link ).' '.sprintf( __( 'Powered by %s.', 'spacious' ), $wp_link ).' '.sprintf( __( 'Theme: %1$s by %2$s.', 'spacious' ), 'Spacious', $tg_link );*/

    $default_footer_value = sprintf( __( 'Copyright &copy; %1$s %2$s.', 'spacious' ), date( 'Y' ), $site_link );

    $spacious_footer_copyright = '<div class="copyright">'.$default_footer_value.'</div>';
    echo $spacious_footer_copyright;
}
endif;

在此我把原本的 $default_footer_value 給comment掉

另外再創一個 $default_footer_value = sprintf( __( ‘Copyright &copy; %1$s %2$s.’, ‘spacious’ ), date( ‘Y’ ), $site_link );  => 那就是自己的名字加日期