![]() |
![]() |
![]() |
![]() |
![]() |
||
Home | First | Prev | Next | Last |
bookname = " SMALL MIRACLES " print(bookname.center(32, "="))とすると、
======== SMALL MIRACLES ========と、書名が中央に配置され、"=" が両側に均等につきました。今までのように手作業でやる必要がなくなりました。
contents = { "In 1919 ":1, "She Wanted To Live Out ":7, "All His Life ":31, "One Hot Summer Day ":71, "We Live In a Rural Town ":121 }これを
for key in contents: value = contents[key] print(title + str(value))とすれば、
In 1919 1 She Wanted To Live Out 7 All His Life 31 One Hot Summer Day 71 We Live In a Rural Town 121となり、読みやすくはありません。けれども、
for key in contents: print(key.ljust(28, ".") + str(value).rjust(4, " "))とすると、
In 1919 .................... 1 She Wanted To Live Out ..... 7 All His Life ............... 31 One Hot Summer Day ......... 71 We Live In a Rural Town .... 121となって、ページ数もきれいに桁揃えができました。
OMG Ubuntu https://www.omgubuntu.co.uk/次では、Linux 全般のニュースが手に入ります。
linuxiac https://linuxiac.com/こちらは、Raspi の情報です。2025年2月の第150号までは The MagPi という名前でしたが、3月の第151号から名前がかわりました。雑誌の PDF は無料でダウンロードできますが、サイズがおおきく、ダウンロードには時間がかかりました。私の場合は、ウェブ記事だけで情報は十分です。
Raspberry Pi Official Magazine https://magazine.raspberrypi.com/
$ wget https://repo.protonvpn.com/debian/dists/stable/main/binary-all/protonvpn-stable-release_1.0.8_all.debこのファイルを dpkg -i コマンドでインストールしました。
$ sudo dpkg -i ./protonvpn-stable-release_1.0.8_all.deb && sudo apt updateそれから
$ sudo apt install proton-vpn pproton-vpn-gtk-appを実行すれば、他の必要なパッケージもインストールしてくれました。念のため、アンインストールのコマンドも控えておきました。
$ sudo apt autoremove proton-vpn-gnome-desktop && sudo apt purge protonvpn-stable-release
$ flatpak install flathub it.mijorus.gearlever
[Desktop Entry] Encoding=UTF-8 Name=MuseScore Comment=MuseScore Studio # AppImageのファイルパス Exec=/home/penguin/AppImage/MuseScore-Studio-4.5.0.250721848-x86_64.AppImage Icon=application-x-musescore StartupWMClass=MuseScore Type=Application Categories= Path= Terminal=false StartupNotify=false
files = glob.glob("./Pictures/*.png")とすれば、png ファイルだけの一覧を得ることができます。次のようにすれば、ソートされた一覧を得ることができます。
files = sorted(glob.glob("./Pictures/*.png"))
files = os.listdir("./Pictures/")os.listdir() の引数にディレクトリー名を与えれば、そのディレクトリーのファイルをサブディレクトリーも含めすべてにリストを取り込みます。引数を与えなければ、実行したディレクトリーのリストを取り込みます。
files = os.listdir("./Pictures/") for file in file: if ".png" in file: print(file))
basename = os.path.basename(path)とすれば簡単に得られます。os.path にはベースネーム以外に、ディレクトリー名やファイル名の本体と拡張子名も取り出す機能もあります。
dirname = os.path.dirname(path) root, ext = os.path.splitext(basename)
// 外部コマンドの設定 cmd := exec.Command("mediainfo", "--Full", inpfile) // 結果の取得 var stdout bytes.Buffer cmd.Stdout = &stdout // コマンドの実行とエラー処理 err := cmd.Run() if err != nil { log.Fatal(err) } // バイトデータを文字列に変換 text := stdout.String()
Duration : 4404323 Duration : 1 h 13 min Duration : 1 h 13 min 24 s 323 ms Duration : 1 h 13 min Duration : 01:13:24.323 Duration : 01:13:24.323
// 文字列を一行ごとに処理 lines := strings.Split(text, "\n") var value string for _, line := range lines { if strings.Contains(line, "Duration") { // 値を取り出す parts := strings.Split(line, ": ") value = parts[1] } } return value
value = value[:8]として最初の8文字だけを取り出しました。これは「時:分:秒」に並んでいますので、ソートして、 再生時間順に表示するプログラムを書きました。
lines := strings.Split(text, "\n") var value string for _, line := range lines { if strings.Contains(line, "Duration") { parts := strings.Split(line, ": ") value = parts[1] break } } ms, _ := strconv.Atoi(value) return ms返り値はミリ秒ですので、
h := 0 s := ms / 1000 m := s / 60 s = s % 60 if m > 59 { h = m / 60 m = m % 60 } hms := fmt.Sprintf("%02d:%02d:%02d", h, m, s)などとして、「時:分:秒」の文字列を得ることができます。
# メディアファイル以外のファイルを開こうとした場合 try: out = subprocess.check_output(["ffprobe", "-v", "quiet", "-show_format", "-print_format", "json", input_file]) except: return 0 # メディアファイルの再生時間を整数で返す ffprobe_data = json.loads(out) duration = float(ffprobe_data["format"]["duration"]) return int(duration)ffprobe の場合、メディアファイル以外を開こうとするとエラーになり、プログラムが中断するので、try と except を使ってエラーを回避しました。
$ sudo apt install papirus-icon-themeでインストールしたものはバージョン 20240201-1 で、1年前のものです。最近、バージョン 20250201 がリリースされたので、インストーしました。
$ cat /etc/os-releaseで確認しましたら
NAME="Linux Mint" VERSION="22.1 (Xia)"となっていました。
lines := []string { "11月12日", "1月19日", "3月4日", "8月19日", "7月4日", "10月1日", "1月2日" }これを月日順に並べ替えるのに
slices.Sort(lines)としただけでは、次の結果になります。
10月1日 11月12日 1月19日 1月2日 3月4日 7月4日 8月19日
slices.SortFunc(lines, func(a, b string) int { re := regexp.MustCompile(`([\d]+)月([\d]+)日`) group := re.FindStringSubmatch(a) x, _ := strconv.Atoi(group[1]) y, _ := strconv.Atoi(group[2]) z1 := fmt.Sprintf("%02d%2d", x, y) group = re.FindStringSubmatch(b) x, _ = strconv.Atoi(group[1]) y, _ = strconv.Atoi(group[2]) z2 := fmt.Sprintf("%02d%2d", x, y) return strings.Compare(z1, z2) })上のコードは cmp をインポートした上で、
group := re.FindStringSubmatch(a) x, _ := strconv.Atoi(group[1]) y, _ := strconv.Atoi(group[2]) z1 := x * 100 + y group = re.FindStringSubmatch(b) x, _ = strconv.Atoi(group[1]) y, _ = strconv.Atoi(group[2]) z2 := x * 100 + y return cmp.Compare(z1, z2)として、整数同士の比較を使うこともできました。slices.SortFunc の引数に文字配列と、それを操作する function を渡すと、function で指定したようにソートを行ってくれます。並べ替え用のインデックス文字列などをもとのデータにつけて操作する必要がないのがとても便利です。結果は次の通りです。
1月2日 1月19日 3月4日 7月4日 8月19日 10月1日 11月12日
slices.Reverse(lines)だけで、簡単にできました。
newlist := slices.Sort(list)は使えません。私は次のようにしていました。
package main import ("fmt"; "slices") func main() { lines := []string {"Ted", "Jim", "Rob", "Bob", "Alice", "Liz", "Kate"} newlist := mySort(list) for _, newline := range newlist { fmt.Println(newline) } } func mySort(input []string) []string { slices.Sort(input) return input }けれどもこれは、slices.Clone を使えば、
slices.Sort(list) newlist = slices.Clone(list)と、簡単に書くことができます。
tmplist = slices.Clone(list) slices.Sort(tmplist) slices.Compact(tmplist) var uniq []string for _, item := range tmplist { if len(item) > 0 { uniq = append(uniq, item) } }とすると、もとのリストに影響を与えないで、繰り返しを除いたリストを作成できした。
keys := make(map[string]bool) var uniq []string for _, item := range list { if _, item := keys[entry]; !value { keys[item] = true uniq = append(uniq, item) } }ソートのアルゴリズムなど、深堀りしていくと面白いかもしれませんが、まずは、基本的なものを使いこなせてからと思っています。
![]() |
![]() |
![]() |
![]() |
![]() |
||
Home | First | Prev | Next | Last |