Shell: 管理相片和视频的脚本

作者:Ajian 发布时间:June 20, 2012 分类:Shell

  有时需要修改大量的相片或者视频,就会写点小脚本进行批量的处理,没有太整理,像有批量下载,批量修改后缀,视频格式转换。今天处理的时候用了这两个脚本,不注意的时候放在目录里面都快找不到了。

脚本一:

相片的后缀修改,像我的松下LX5保存的相片为大写的JPG,可是很多网站上传都不知道大写的,我就郁闷,多匹配一个大写的会需要多少代码。只好自己修改了。将后缀的大写转换为小写

#!/bin/sh
#basename changesuffix.sh
##change the file suffix [A-Z] to [a-z]
dir=$1

for a in `find $dir -type f -name "*.*"`
do
 suffixname=`echo $a | awk -F. '{print $NF}'`
echo $suffixname
 fsuffixname=`echo $suffixname | tr "[A-Z]" "[a-z]"`
echo $fsuffixname
 holdname=`echo $a | awk -F. '{print $1}'`
echo $holdname
if [ $suffixname != $fsuffixname ];then
echo "change the $a"
mv $a $holdname.$fsuffixname
fi
done

脚本二:

我在You(你明白的)tube上下载了大量的MP4,想放到MP3里面听听,而且传输也要小很多,默认的MP4很高清体积很大。弄个批量转换的相当不错。

#!/bin/bash
srcDir=/root/Videos/Music
desDir=/root/MP3

cd $srcDir
for file in *.mp4 
do 
    filename=`echo "$file" | awk -F'.mp4' '{print $1}'`
    if [ ! -e  $desDir/"$filename".mp3 ];then
        ffmpeg -i "$file" -f mp3 -ab 192000 -vn $desDir/"$filename".mp3
    fi
done

脚本都是应需求很快写的,很简单没有格式没有扩展,还有些现在找不到了,哈哈,哪天看到了再说。

Golang: 注意Channel的特性

作者:Ajian 发布时间:June 12, 2012 分类:Golang

  之前用channel练习的时候遇到一个问题,看似好像代码合理,而且编译也不会有问题,但忘记了一个重要的channel特性。

正确的代码:

package main
import "fmt"

func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}

func sum(x,y int,c chan int){
    c <- x + y
}

func main(){
    foo()
    c := make (chan int);
    go sum(24,18,c)
    fmt.Println(<-c);
}

编译输出//defer的作用应该知道吧

Hello

World

42

如果我把代码改成:
package main
import "fmt"

func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}

//func sum(x,y int,c chan int){
//    c <- x + y
//}

func main(){
    foo()
//    c := make (chan int);
//    go sum(24,18,c)
//    fmt.Println(<-c);
    c := make (chan int)
    d := 2
    c <- d+3 
    fmt.Println(<-c)
}

或者修改为

package main
import "fmt"

func foo(){
    defer fmt.Println("World")
    fmt.Println("Hello")
}

func sum(x,y int,c chan int){
    c <- x + y
}

func main(){
    foo()
    c := make (chan int);
    sum(24,18,c)
    fmt.Println(<-c);
}

修改的第一个是直接没有使用sum函数,赋值给管道之后直接打印出来,第二个修改是只是去掉了go,编译都可以通过,但是执行出来是

Hello
World
throw: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
        /root/Dropbox/code/go/channel.go:16 +0x5e

goroutine 2 [syscall]:
created by runtime.main
        /tmp/bindist046461602/go/src/pkg/runtime/proc.c:221

这是为什么呢,看似合理的程序,是忽略了Channel是阻塞的,如果没有使用go Channel就一直在阻塞的状态,执行就死循环了。这个特性也在很多场合带来了方便。

Golang: Simple HTTP Server

作者:Ajian 发布时间:June 12, 2012 分类:Golang

   最近还在学习Go语言,当然得多练习,尤其对于我这样的一个半路出家的人来说,对很多的专业术语和编程思想都不够,最近要学习的知识点和事情(随便记录下),实现文件持久化gob,进程锁的概念,channel的灵活使用,http proxy ,如何写自己的配置文件token,如何来检查go程序的性能瓶颈pprof 等,慢慢来也得快快学。

今天实验了下http server , 参考了Andrew Gerrand 的goto程序 https://github.com/nf

 

package main
import(
    "fmt"
    "net/http"
    "io/ioutil"
    "log"
    "time"
)

func Handler( w http.ResponseWriter,r *http.Request ){
    path := r.URL.Path[1:]   
    if path == "favicon.ico"  {
        http.NotFound(w, r)
        return
    }
    if path == ""{
        path = "index.html"
    }
    contents,err:= ioutil.ReadFile( path )
    if err !=nil{
        fmt.Fprintf( w,"404" )
        return
    }
    fmt.Fprintf( w,"%s\n",contents )
}

func Add( w http.ResponseWriter,r *http.Request ){
    name := r.FormValue("name")
    age := r.FormValue("age")
    if name == "" || age == "" {
        fmt.Fprint(w, AddForm)
        return
    }
    fmt.Fprintf(w, "Save : Your name is  %s , You age is %s",name,age)
}

func main(){
    http.HandleFunc( "/",Handler)
    http.HandleFunc( "/add",Add)
    s := &http.Server{  
        Addr:           ":8080",
        ReadTimeout:    30 * time.Second,
        WriteTimeout:   30 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }
    log.Fatal(s.ListenAndServe())
}

const AddForm = `
<html><body>
<form method="POST" action="/add">
Name: <input type="text" name="name">
Age: <input type="text" name="age">
<input type="submit" value="Add">
</form>
</body></html>
`