Showing posts with label power shell. Show all posts
Showing posts with label power shell. Show all posts

Friday, June 28, 2013

Re-syncs subtitle dengan windows power shell

Pada kesempatan kali ini saya akan memberikan sedikit tips yang ada hubungannya dengan pengalaman saya semalam dalam menonton film. Kebetulan film tersebut saya download di youtube. Dan masalahnya adalah subtitle yang tersedia pada film tersebut adalah subtitle untuk 2 CD sementara filmnya 1 CD. Jadinya kacau.
Yang pertama saya pikirkan adalah bagaimana agar kedua substitlenya di merge aja. Maksudnya disamping dialognya digeser nomornya juga dirubah. Tapi masalahnya adalah kita g tau benar, berapa jeda antara habisnya substitle yang pertama dengan masuknya subtitle kedua. Jadi biar amannya mendingan file dipisah aja. Sisanya (kalo masih g sinkron) tinggal di shift-shift aja dengan tool bawaan dari media player. Sebenarnya yang saya maksud pada tutorial ini sedikit berbagi aja fungsi dari windows power shell (tentunya bagi yang belum tahu).



Berikut adalah listing dari program yang saya buat!

$ref_file = get-content ./1.srt
$cari = [regex] "^[1-9][0-9]{0,3}\b\s*$"; 
$cari1 = [regex] "-->"; 
$temp = ""; 
$i= 0;

foreach($item in $ref_file){
 if($item -match $cari){$i = [int]$item; }
 if($item -match $cari1){$temp = $item ; }
}
$temp = $temp.split("-->")[3].replace("\s+", "").split("[:,\,]");

$i++;

# geser sedikit dalam microsecond
$temp[3] = 200; 

( get-content ./2.srt) | 
foreach-object{
 $sambung = "";
 if($_ -match $cari1){
  $hasil = $_ -split $cari1 ; 
  $first = $hasil[0].split("[:,\,]"); 
  $second = $hasil[1].split("[:,\,]"); 
  
  $first[3] = [int]$first[3] + $temp[3]; 
  if([int] $first[3] -gt 1000){
   $first[2] = [int]$first[2] + 1; 
   $first[3] = [int]$first[3] - 1000; 
  }
  $first[2] = [int] $first[2] + $temp[2]; 
  if([int] $first[2] -gt 60){
   $first[1] = [int]$first[1] + 1; 
   $first[2] = [int]$first[2] - 60; 
  }
  $first[1] = [int] $first[1] + $temp[1]; 
  if([int] $first[1] -gt 60){
   $first[0] = [int]$first[0] + 1; 
   $first[1] = [int]$first[1] - 60; 
  }
  $first[0] = [int] $first[0] + $temp[0]; 
   
  $second[3] = [int] $second[3] + $temp[3]; 
  if([int] $second[3] -gt 1000){
   $second[2] = [int]$second[2] + 1; 
   $second[3] = [int]$second[3] - 1000; 
  }
  $second[2] = [int] $second[2] + $temp[2]; 
  if([int] $second[2] -gt 60){
   $second[1] = [int]$second[1] + 1; 
   $second[2] = [int]$second[2] - 60; 
  }
  $second[1] = [int] $second[1] + $temp[1]; 
  if([int] $second[1] -gt 60){
   $second[0] = [int]$second[0] + 1; 
   $second[1] = [int]$second[1] - 60; 
  }
  $second[0] = [int] $second[0] + $temp[0]; 
  
  $sambung = $first[0]+":"+$first[1]+":"+$first[2]+","+$first[3]+" --> "+$second[0]+":"+$second[1]+":"+$second[2]+","+$second[3];
 }
 # sebenarnya nomornya mau dirubah juga tapi g jadi
 # $_ -replace "^.*-->.*$" , $sambung -replace $cari , $i  ;
 $_ -replace "^.*-->.*$" , $sambung ;  
 # if($_ -match $cari){
  # $i++; 
 # }
} |
set-content  ./2_baru.srt; 

untuk file lengkapnya bisa anda liat di link berikut: https://github.com/gunungloli666/substitle

Thursday, June 6, 2013

Belajar Windows power shell

Pada kesempatan kali ini saya akan memberikan sedikit pencerahan kepada pembaca yang kebetulan mungkin punya pengalaman yang sama dengan saya. Apalagi jika pembaca adalah seorang pengguna windows yang setia, maka tutorial ini akan sangat berguna bagi anda. Mungkin kalo anda seorang maniak linux, maka tutorial ini adalah hal yang basi, jadi ini bukan ditujukan untuk anda. Bisa jadi dari tutorial inilah anda bisa menjadi seorang windows administrator yang disegani, yang mengelola super-komputer super komputer terkemuka di dunia. Intinya semua langkah besar di mulai dari langkah pertama.

Pasti ada yang bingung apa itu power shell? Sebenarnya power shell itu turunannya CMD. Kalo di linux kan ada bash, shed, awk, python dan lain-lain, jadi budayanya memang budaya shell scripting, tapi kan di windows budayanya budaya GUI alias main mouse-mouse-an, jadi sebagian pembaca, kecuali yang berlatar belakang IT pasti g tau apa itu shell-scripting. Yang jelas shell itu gunanya dahsyat luar biasa. Saya bingung mau ceritain gimana, yang jelas anda cobalah, pasti anda akan ketagihan. Kalo anda pernah menggunakan CMD, itu adalah shell. Kebetulan saya juga agak bingung membedakan antara shell, command-line, dan terminal[1]. Defenisi presisinya itu gimana, abstraksi fungsinya gimana. Yang jelas saya bukan ahli IT, saya hanya bisa meng-impress anda sekedarnya aja. Kalo anda tertarik lebih jauh, silakan googling di internet.

Sebenarnya saya ini lagi ada masalah merunning program, kebetulan programnya udah satu jam running-running dan g selesai-selesai running, makanya saya jadi bingung, what's going on. Apa yang terjadi sebenarnya. Padahal seharusnya, berdasarkan user manual itu mestinya selesai dalam 5 menit. Anda bisa lihat gambar berikut:



Jadinya saya bingung. Akhirnya saya memutuskan kenapa ada perintah tersebut. Di file manakah perintah tersebut berada.Kebetulan file-nya ada puluhan dan saya malas periksa satu-satu. Jadi sebagai amal jariah, saya akan perkenalkan kepada pembaca apa itu power shell. Nah untuk memulai power shell, anda harus klik start pada kiri bawah windows seven (saya g tau windows 8, yang jelas ini berlaku untuk windows 7---feeling saya power shell juga ada di windows 8):



Setelah anda buka akan muncul jendela berikut:



Kemudian ganti directory tempat script anda ditempakan. Ingat ya, windows power shell itu berekstensi .ps1, jadi scriptnya anda kasi nama makan.ps1, minum.ps1 pada saat menyimpannya (kan kalo microsoft word penamaannya adalah makan.docx, minum.docx, kemudian tulis aja scriptnya pake notepad atau editor lain persis seperti anda nulis MATLAB (kalo saya pake notepad++)). Liat gambar berikut bagaimana pindah directory/folder. Saya yakin kalo anda biasa pake CMD untuk menghapus virus atau merubah atribut file, pasti anda akan sudah terbiasa dengan hal-hal seperti ini.



Kemudian untuk merunning file ketik pada terminal power shell: .\nama_script_anda.ps1 :



Adapun isi script tersebut bisa anda lihat di listing berikut:
# untuk mencari perintah tertentu pada isi suatu file program
# dan mencari tahu pada baris mana perintah tersebut berada
$a = dir ;# directory saat ini

# string yang akan dicari, dalam hal ini perintah tertentu pada fortran
$my_regex = [regex] "In+\spoute_2D" 

# iterasi untuk seluruh isi directory saat ini
foreach($item in $a ){
 # baca isi dari file masing-masing file
 $content = get-content $item; 
 # iterasi terhadap baris dalam file
 $i = 0 ; # untuk menentukan pada baris mana perintah tersebut berada
 foreach($line in $content){
  $hasilcari = $my_regex.matches($line) ; 
  $hasilcari = $hasilcari[0];
  # jika ditemukan setidaknya satu kali saja perintah tersebut
  if($hasilcari.success){
   $i++ 
   write-host "dapat di file $item,  pada baris $i,  pada perintah: $line"
  }
 }
}
Dan hasil eksekusinya bisa dilihat pada gambar berikut:



Bayangkan bro, kalo ada 100 file, gimana anda mau periksa satu-satu, boring dan lama bangat bro. Sementara dengan script ini sekali running langsung ketahuan di mana tulangnya. Sebenarnya bisa juga anda membuat analogi perintah di atas pada bahasa lain, misalnya java atau MATLAB atau VB.net, tapi masalahnya repot ngimport-ngimport library dan lain segala macam. Anda mesti menginstall java atau .net framework atau bahkan MATLAB---ditambah lagi running nya berat. Sementara ini sudah tersedia built in di windows 7. Apalagi power shell itu bisanya bukan cuma memanipulasi string aja, dia juga bisa banyak hal, misalnya mengakses Active-X atau COM objek (silakan browsing di google apa maksud istilah ini). Anda benar-benas bisa jadi seorang admisnitrator komputer yang layak pakai kalo sudah benar-benar jago

Saya yakin semua isi listing di atas bisa anda ketahui dengan mudah, kecuali mungkin sedikit regular expression yang anda bisa liat di [2]. Kemudian soal power shell, ada buku bagus yang bisa anda download [3].

Referensi:
1. http://en.wikipedia.org/wiki/Windows_shell
2. http://www.regular-expressions.info/characters.html
3. http://en.bookfi.org/book/609394