google-code-prettify

2019年9月20日 星期五

安裝 Windows 10 與 CentOS 雙系統

本文主要描述在已經安裝好 Windows 10 的 PC 上,安裝 CentOS 在開機時有開機選單可以選。

我非專職系統工程師,
或有更適當的做法我不知道,
本文是我處理的過程記錄。
到 CentOS 官網下載 ISO 檔,
將 ISO 做成可開機 USB 隨身碟,
因為公司資安管控並無法從公司 PC 寫入資料到隨身碟,
所以一開始使用 unetbootin 這套軟體在我的 Mac Book Pro 製作,
但是做好的開機隨身碟雖然可以進入了 CentOS 安裝起始導引畫面,
卻出現無法找到安裝軟體的檔案問題而無法安裝,
回家使用Windows PC 改用 Win32 Disk Imager 重新製作開機隨身碟才可正常安裝。

剛開機進入 BIOS 的 Boot Menu,
選擇使用 「UEFI {你的隨身碟識別名稱}」這一項,
進入隨身碟開機來安裝,
安裝過程遇到 dracut-initqueue timeout 的問題,
原因是安裝軟體的檔案 /isolinux/isolinux.cfg 裡面有設定LABEL的名稱(我看到有四個)和隨身碟實際的LABEL名稱不同,
所以導致安裝程序找不到所需的東西而無法進行。

上網找到了兩個解法:

  1. 修改 isolinux.cfg 裡 LABEL 的名稱為隨身碟實際名稱或修改隨身碟LABEL名稱為 isolinux.cfg 裡的名稱。=>結果,isolinux.cfg 裡的名稱太長而無法用來修改隨身碟名稱。或採用修改isolinux.cfg的方式,遇到公司 PC 無法寫入資料到隨身碟。 
  2. 當進入dracut:/# 時,查詢隨身碟的設備資訊

 
dracut:/# cd /dev
dracut:/# ls  
列出設備訊息後,找 sdb[數字] 的那一個就是隨身碟, 然後重開機
 
dracut:/# reboot 
在install頁面按 e 鍵, 進入一個畫面,畫面上有一段文字
 
vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 check quiet
直接移動滑鼠游標將 hd:LABEL=CentOS\x207\x20x86_64 改為 hd:/dev/sdb[你的隨身碟數字],例如改為:
 
vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb1 check quiet
然後,按 Ctrl+x 繼續,就可以正常進行了。
安裝完,移除隨身碟重開機後,
會出現 CentOS...(有兩個)和 Windows Boot Manager 三個選項這樣的開機選單,
選擇 CentOS 就可以進入剛裝好的 CentOS 作業系統環境,
而選擇 Windows Boot Manager 進入後卻遇到需要「BitLocker 修復金鑰」的狀況,
跟 IT 要金鑰打進去後,進行修復完成就正常進入原本的 Windows 10 裡面了。

2019年9月17日 星期二

Oracle VirtualBox 啟動 Linux OS 安裝程序卡住無法進行


安裝Linux OS時,
ISO檔載入後,安裝起始畫面沒多久就卡住了,
如下面是卡住的 Ubuntu 安裝起始畫面:


確認過BIOS的 Virtualization Technology 設定已經有啟用,
再試過調整CPU數量、記憶體數量、視訊記憶體數量、啟動或停用PAE/NX、VT-x/AMD-v、3D Acceleration、改變USB Controller設定,
也安裝了 Oracle VM VirtualBox Extension Pack,
都無法修正這個問題,

花時間耐心看VBox.log,
發現幾個可能造成問題的訊息,
其中一個訊息:「HMR3Init: Attempting fall back to NEM: VT-x is not available」很怪,
因為已經確認過 BIOS 的 Virtualization Technology 設定已經有啟用
在上網搜尋資料發現是因為 Windows 10 的系統更新修改了系統參數設定所造成,
依照下列步驟解決:

  • 使用系統管理員開啟命令提示字元
  • 輸入下列指令,檢視輸出的結果中,hypervisorlaunchtype是否被設定為 Auto
bcdedit
  • 繼續在命令提示字元中輸入下列指令將 hypervisorlaunchtype 設為 off
bcdedit /set hypervisorlaunchtype off
  • 重新啟動電腦,解決問題

參考文章:
https://blog.csdn.net/imilano/article/details/83038682

這個設定好之後,發現原本可正常運作的 Docker 反而出現問題無法運作。
因為這個設定把 Hyper-V 功能關閉,
而 Docker 的運作需要它。

目前在網路上找不到 VirtualBox 與 Docker/Hyper-V 同時並行的作法,
許多都是採用建立不同的開機程序,
在開機時選擇有啟用或不啟用 Hyper-V 的開機程序。

後來知道 Windows 10 內建的 Hyper-V 就可以建立虛擬機安裝不同作業系統,
過幾天我再來試試,可行就捨棄 VirtualBox !


2016年9月2日 星期五

程式碼品質掃描:Jenkins + PMD plug-in + Maven設定

Jenkins + PMD plug-in做程式碼品質掃描,
以搭配Maven為例子:

Maven pom.xml設定加入以下的plug-in:

<project>
.....
.....
.....
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <version>3.6</version>
        <configuration>
          <linkXref>true</linkXref>
          <sourceEncoding>utf-8</sourceEncoding>
          <minimumTokens>100</minimumTokens>
          <targetJdk>1.5</targetJdk>
          <excludes>
            <exclude>**/*Bean.java</exclude>
            <exclude>**/generated/*.java</exclude>
          </excludes>
          <excludeRoots>
            <excludeRoot>target/generated-sources/stubs</excludeRoot>
          </excludeRoots>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</project>


Jenkins設定:
1.安裝PMD plug-in
2. 該專案(作業/Job)以「Maven 專案」型態建置,在「建置」的「Goal及選項」設定值為「 package package pmd:pmd」,若是同時也要執行FindBugs plug-in可設定成「package pmd:pmd findbugs:check」
3.「建置設定」勾選「發佈 PMD 分析結果」




建置後看結果:



列出紅色為高優先警告,黃色為一般警告


一路點選到問題程式之後,會列出問題處的行號和問題原因與建議處理方法:

程式碼品質掃描:Jenkins + FindBugs plug-in + Maven設定

使用Jenkins + FindBugs plug-in做程式碼品質掃描,
以搭配Maven為例子:


Maven pom.xml設定加入以下的plug-in

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>findbugs-maven-plugin</artifactId>
   <version>3.0.1</version>
   <executions>
       <execution>
           <goals>
               <goal>check</goal>
           </goals>
       </execution>
   </executions>
   <configuration>
       <effort>Max</effort><!--值可以是Min、Default或是Max-->
       <xmlOutput>true</xmlOutput>
       <failOnError>false</failOnError>
   </configuration>
</plugin>


Jenkins設定:
1.安裝FindBugs plug-in
2. 該專案(作業/Job)以「Maven 專案」型態建置,在「建置」的「Goal及選項」設定值為「 package findbugs:check」
3.「建置設定」勾選「發佈FindBugs分析結果」




建置後看結果:




列出紅色為高優先警告,黃色為一般警告



一路點選到問題程式之後,會列出問題處的行號和問題原因與建議處理方法:

2015年1月26日 星期一

Digital Photo Professional 發生 EXC_BAD_ACCESS (SIGBUS)

在OS X上使用Canon Digital Photo Professional 一直發生Crash,
一直以來發生下面這樣的「EXC_BAD_ACCESS (SIGBUS)」的Exception,
=====

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (SIGBUS)
Exception Codes:       KERN_PROTECTION_FAILURE at 0x00000000fefff000

VM Regions Near 0xfefff000:
    Stack                  00000000bf7c3000-00000000bffc3000 [ 8192K] rw-/rwx SM=COW
--> VM_ALLOCATE            00000000fefff000-00000000ff000000 [    4K] rw-/rwx SM=COW
    Submap                 00000000ffff0000-00000000ffff1000 [    4K] r--/r-- SM=PRV  process-only VM submap

=====

一直找不到解法,
發Mail給美國Canon support,
幾次回覆提供的處理方式都無法解決問題。
後來試著幾種方式移除Canon相關軟體重裝,
還是無法解決。
但在無意間卻發現長長的Exception log有了不一樣的地方,
Crashed Thread不一樣了!

=====

Crashed Thread:        13  Dispatch queue: TFSVolumeInfo::GetSyncGCDQueue 0

Exception Type:        EXC_BAD_ACCESS (SIGBUS)
Exception Codes:       KERN_PROTECTION_FAILURE at 0x00000000fefff000

VM Regions Near 0xfefff000:
    Stack                  00000000bf723000-00000000bff23000 [ 8192K] rw-/rwx SM=COW
--> VM_ALLOCATE            00000000fefff000-00000000ff000000 [    4K] rw-/rwx SM=COW
    Submap                 00000000ffff0000-00000000ffff1000 [    4K] r--/r-- SM=PRV  process-only VM submap

======

用了這個Keyword去搜尋找到了一個處理方式,
移除下面兩個檔案:
/Library/Contextual Menu Items/SCFinderPlugin.plugin
/Library/Receipts/SCPlugin.pkg    

並且登出或是重開機,
問題就解決了!

移除的那兩個檔案是一個Subversion client軟體的檔案。
來源討論可以看這裡





2015年1月23日 星期五

簡易限制同時多執行緒數量Simple Limited Concurrent Multi-thread

因為工作常需要處理較大數量的資料,
使用單執行緒耗時較久,
所以就想寫一個多執行緒的程序來做,
但不能無限制的往Server丟,
Server恐怕也會吃不消,
所以必須控制同時多執行緒執行的數量。
另外,也為了要考量到原本已寫好的Service必須可以直接使用,
套用多執行緒後不用改Code,
保持需要時,原本只有主執行緒運算的狀況下仍可進行,
所以就利用時間寫了以下這樣一個簡易可以指定同時間多執行緒數量的程式,
並且這個控制同時執行緒數量的框架架構可以在後來其他新的程式工作直接套用即可,
不需再寫產生多執行緒、控制Concurrent Multi-thread的程式。
 

public interface BatchService {
 public Collection<!----> retrieveSource() throws Exception;
 public void doJob( Object obj ) throws Exception;
}


 
public interface Job extends Runnable {
 public void setData(Object obj);
 public void setService(BatchService service);
}

 
public class JobImpl implements Job {

 //private static Logger log = Logger.getLogger(JobImpl.class);
 
 private Object data;
 private BatchService service;
 
 @Override
 public void run() {
  Thread.currentThread().setName(Thread.currentThread().getId()+"");
  if (data == null || service == null) return;
  
  try {
   service.doJob(data);
   this.setData(null);
   this.setService(null);
   
   
  } catch (Exception e) {
   e.printStackTrace();
   //System.out.println(e.getMessage());
   //log.error(e.getMessage());
   
  }finally{
   BatchInit.infoJobFinishCount(this);
  }
 }

 @Override
 public void setData(Object obj) {
  data = obj;
  
 }

 @Override
 public void setService(BatchService service) {
  this.service = service;
 }

}

 

public class BatchInit {
 //private static Logger log = LogManager.getLogger("BatchInit");
 public static Stack<job> jobStack;

 private static int JobFinishCount = 0;

 
 public void batchJob(BatchService batchService, Stack<job> jobs) throws Exception{
  List<!----> source = (List<!---->)batchService.retrieveSource() ;
  int JobAmount = source.size();
  jobStack = jobs;
  int JobNow = 0;
  //log.info("JobAmount::"+JobAmount);
  
  while(true){
   if (JobAmount==JobFinishCount){
    //System.out.println("做完了::"+JobFinishCount);
    //log.info("做完了::"+JobFinishCount);
    break;
   }
   Job job = null;
   try{
    job = jobStack.pop();
    
   }catch(java.util.EmptyStackException ex){
  
   }catch(Exception ex){
    ex.printStackTrace();
    //log.error(ex.getMessage());
   }
   
   //log.debug("#######job ::"+job);
   if (job != null && JobNow < JobAmount ){
    loga(JobFinishCount, "");
    Object obj = source.get(JobNow);
    ++JobNow;
    job.setData(obj);
    job.setService(batchService);
    Thread t = new Thread(job, job.toString());
    t.start();
    
   }
   
  }
  
 }

 public synchronized static void infoJobFinishCount( Job job){
  ++JobFinishCount;
  jobStack.push(job);
  
 }
 
 private void loga(int i, String message){
  if (i % 500 == 0){
   System.out.println("--doing :" +i+", "+message);
   //log.info("--doing :" +i+", "+message);

  }
 }
}


上面的程式是控制同一時間執行緒的最大數量,之後不用在改(除非有Bug,或為了提升效率),
以後新的需要多執行緒進行的程式可以直接引用。
而下面的兩隻程式必須要寫,
一個是實作每一個Batch Job Service的實際工作必須implements BatchService這個interface,
另一個則是啟動程式和同一時間處理Job數量(執行緒數量)設定
 

public class MyBatchJobService implements BatchService {

 @Override
 public Collection<!----> retrieveSource() throws Exception {
  //TODO write your code
  ArrayList<String> source = new ArrayList<String>();
  source.add("Hello ");
  source.add("Ryan! ");
  source.add("How ");
  source.add("are ");
  source.add("you? ");
  
  for(int i = 0 ; i < 10 ; i++){
   source.add(""+i);
  }
  return source;
 }

 @Override
 public void doJob(Object obj) throws Exception {
  //TODO write your code 
  String data = (String) obj;
  System.out.println("ThreadId:"+ Thread.currentThread().getId() +"::"+data);
 }

}


執行BatchStart啟動程式。
 
public class BatchStart {

 private static BatchInit batchInit = new BatchInit();
 
 public static void main(String[] args) throws Exception {
  BatchService service = new MyBatchJobService();
  batchJob(service, 2);
  
 }

 private static void batchJob(BatchService service, int amountThread)
   throws Exception {
  Stack jobs = new Stack();
  
  for(int i =0; i < amountThread; i++){  //TODO Setting the amount of concurrent thread
   jobs.push(new JobImpl());
   
  }
  
  batchInit.batchJob(service, jobs);
 }
}

開放原始碼下載:GitHub

2015年1月17日 星期六

Maven設定Proxy

到一個新環境,拿到一個新Project source,
 一打開Project冒出下面這樣的錯誤:
ArtifactDescriptorException: Failed to read artifact descriptor for ......
Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-resources-plugin:jar:2.6

接著看到pom.xml冒出一堆錯誤...,
有可能是所處的網路環境會經過Proxy Server,
所以可以試著給Maven設定Proxy可以解決這樣的問題。

編寫一個settings.xml格式如下:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
 http://maven.apache.org/xsd/settings-1.0.0.xsd">
 <localRepository/>
 <interactiveMode/>
 <usePluginRegistry/>
 <offline/>
 <pluginGroups/>
 <servers/>
 <mirrors/>
 <proxies>
  <proxy>
   <id>myproxy</id>
   <active>true</active>
   <protocol>http</protocol>
   <host>your proxy server address</host>
   <port>your proxy server port</port>
   <username>your proxy account</username>
   <password>your proxy password</password>
   <nonProxyHosts>localhost,127.0.0.1</nonProxyHosts>
  </proxy>
 </proxies>
 <profiles/>
 <activeProfiles/>
</settings>

以Eclipse來說,到以下的選單:
Window > Preferences > Maven > User Settings
在這個畫面指定上面的settings.xml