Ubuntu」カテゴリーアーカイブ

fvwm3のインストール

「FVWM version 3 — the successor to fvwm2」が公開されているが、現在UbuntuにはFvwm3のパッケージは存在しない。https://packages.ubuntu.com/

待っていても、パッケージでは提供されないのだろうか。と言う訳でコンパイルしインストールを行う。

https://github.com/fvwmorg/fvwm3/blob/master/dev-docs/INSTALL.md ここを参考に、Core dependenciesとOptional dependenciesをインストールしておく。
librsvg-devがなくてlibrsvg2-devがあったので、これをインストールしてみた。大丈夫?

#!/bin/bash
while read line
do
echo -e "\e[32;1m$line\e[m"
sudo apt install $line -y
done << EOF
libevent-dev
libx11-dev
libxrandr-dev
libxrender-dev
libxt-dev
asciidoctor
libfontconfig-dev
libfreetype6-dev
libfribidi-dev
libncurses5-dev
libpng-dev
libreadline-dev
librsvg2-dev
libsm-dev
libxcursor-dev
libxext-dev
libxft-dev
libxi-dev
libxpm-dev
sharutils
EOF

準備ができたらgitからダウロード

git clone https://github.com/fvwmorg/fvwm3.git

あとはInstalling From Gitの手順で

./autogen.sh
./configure --enable-mandoc 
make

configureでWith Golang support? noになったが、まぁいいか。

じゃないわ! FvwmPrompt — a new module written in golang: ./configure --enable-golang needed at compile time だとさ。
で、以下のconfigureでyesになった。

./configure --enable-mandoc --enable-golang

つまりこういう事である。

/autogen.sh && ./configure --enable-mandoc --enable-golang && make -j4

さらに改良。Makefileに、CPPFLAGS = -march=amdfam10 追加。k10なのよ。
でmake clean && make -j4

sudo make install

インストールできたら、 .xinitrcのfvwm2の部分をfvwm3に書き換えて。startxする。
何が変わったのかはここを読むといい。https://github.com/fvwmorg/fvwm3/releases

fvwm3では、Strokeコマンドがなくなった。libstroke support has been removed.だと。
あまり使わないので、まぁ影響はないけど。キーとマウスクリックで対応できるでしょうから。Strokeは設定ファイルからコメントアウト。あとEdgeResistance 30 30でエラー、引数は1つのみが正解。何か2つ目の引数って効果あるの?ってずっと思ってた。EdgeResistance 30が正しいと、-vオプションのエラーログで分かった。

logを取るには.xinitrcで起動時に fvwm3 -v と -vのオプションを付けると、$HOME/.fvwm/fvwm3-output.log が作られる。起動中では pkill -USR2 fvwm3 ができる。

Fvwm3のモジュールは以下のとおり

FvwmAnimate
FvwmAuto
FvwmBacker
FvwmButtons
FvwmCommandS
FvwmConsole
FvwmConsoleC
FvwmEvent
FvwmForm
FvwmIconMan
FvwmIdent
FvwmMFL
FvwmPager
FvwmPerl
FvwmRearrange
FvwmScript
FvwmTalk

fvwm2.6.8のモジュールは以下の通り。○は存続、×は消滅したもの。

FvwmAnimate ○
FvwmAuto ○
FvwmBacker ○
FvwmBanner ×
FvwmButtons ○
FvwmCascade ×
FvwmCommandS ○
FvwmConsole ○
FvwmConsoleC ○
FvwmConsoleC.pl ×
FvwmCpp ×
FvwmEvent(FvwmAudio) ○
FvwmForm ○
FvwmIconMan ○
FvwmIdent ○
FvwmM4 ×
FvwmPager ○
FvwmPerl ○
FvwmProxy ×
FvwmRearrange ○
FvwmScript ○
FvwmTalk ○
FvwmTile ×

fvwm2.6.8はfvwm2.6の最終安定版ですね。
こちらでも絶版があるわけですが。FvwmTaskBarが無くなったのが大きかったかな。

  - Some fvwm modules have been removed:
      - FvwmDragWell   (no replacement)
      - FvwmGTK        (no replacement)
      - FvwmSave       (no replacement)
      - FvwmSaveDesk   (no replacement)
      - FvwmScroll     (no replacement)
      - FvwmTabs       (no replacement, never worked anyway)
      - FvwmTaskBar    (use FvwmButtons)
      - FvwmTheme      (in core of fvwm as colorsets)
      - FvwmWharf      (use FvwmButtons)
      - FvwmWinList    (use WindowList command)
      - FvwmWindowMenu (use WindowList command)
      - FvwmIconBox    (use the IconBox style instead)

GTK+でファイルを選ぶ、gtk_file_chooser_dialog_new

GUIでファイルを探す処理に、GTK+を利用してみよう。

プログラムでファイルを選ぶ場合、あらかじめシェルかファイラーを用い、ファイル名を正確に代入する必要になる。選んだファイル名を返す、単純なGUIのプログラムがあれば汎用できるので、便利である。今回は、GTK+というツールボックスを使用して、GUIでファイルを探すプログラムの制作を行ってみよう。
設定として、簡単で単純なプログラム。汎用性が高いこと。カスタマイズ可能。GTK+の学習を目的とする。

filechooser.c

#include <gtk/gtk.h>
 
int main(int argc, char *argv[]){
    GtkWidget *dialog;
    gtk_init(&argc, &argv);
    
    GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
    gint res;
    
    dialog = gtk_file_chooser_dialog_new ("Open File",
                                          NULL,
                                          action, 
                                          ("Cancelする"),
                                          GTK_RESPONSE_CANCEL,
                                          ("Openする"),
                                          GTK_RESPONSE_ACCEPT,
                                          NULL);
    
    res = gtk_dialog_run (GTK_DIALOG (dialog));
    if (res == GTK_RESPONSE_ACCEPT)
    {
        char *filename;
        GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
        filename = gtk_file_chooser_get_filename (chooser);
        g_print("%s\n",filename);
        //open_file (filename);
        g_free (filename);
    }
         gtk_widget_destroy (dialog);
    
    return 0;       
    
}

コンパイルは以下で。

gcc filechooser.c -o filechooser `pkg-config --cflags --libs gtk+-3.0`

エラーが出る

Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

gtk_dialog_run (GTK_DIALOG (dialog)); このエラーはで生じてる。
gtk_file_chooser_dialog_new の二番目の引数、NULLだと生じるのか?
そのようだった。main関数から、呼び出すと消えた。

#include <gtk/gtk.h>
 
int file_selection_dialog(GtkWidget *window ,gchar *str){
    GtkWidget *dialog;

    GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
    gint res;;
    
    dialog = gtk_file_chooser_dialog_new ("Open File",
                                     GTK_WINDOW (window), 
                                      //NULL,
                                      action,
                                      ("Cancel"),
                                      GTK_RESPONSE_CANCEL,
                                      ("Open"),
                                      GTK_RESPONSE_ACCEPT,
                                      NULL);
    GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
    gtk_file_chooser_set_current_folder (chooser,str);
    res = gtk_dialog_run (GTK_DIALOG (dialog));
    if (res == GTK_RESPONSE_ACCEPT)
    {
        char *filename;
        filename = gtk_file_chooser_get_filename (chooser);
        g_print("%s\n",filename);
        g_free (filename);
  }
  gtk_widget_destroy (dialog);
}

 int main(int argc, char** argv){
    GtkWidget *window;
    gtk_init(&argc,&argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "destroy",G_CALLBACK(gtk_main_quit), NULL);
    file_selection_dialog(window, argv[1]);
    return 0;
}

main関数とは、別に関数を作り、mainから呼び出すと、GtkDialog mapped without a transient parentのエラーは消えた。mainの中でgtk_file_chooser_dialog_newウィジェットを実行してもエラーがでない方法がありそうだが。組み合わせをいじってみて、mainの中でも動くようになった。改めてみると、単純な表現であるが、初心者が戸惑うツボが垣間見れる。

#include <gtk/gtk.h>
 
int main(int argc, char *argv[]){
    
    GtkWidget *dialog;
    GtkWidget *window;
    
    gtk_init(&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
    gint res;
    
    dialog = gtk_file_chooser_dialog_new ("Open File",
                                          GTK_WINDOW (window),
                                          GTK_FILE_CHOOSER_ACTION_OPEN,
                                          ("Cancelする"),
                                          GTK_RESPONSE_CANCEL,
                                          ("Openする"),
                                          GTK_RESPONSE_ACCEPT,
                                          NULL);
 
    GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
    if (argv[1])
        gtk_file_chooser_set_current_folder (chooser,argv[1]);

    res = gtk_dialog_run (GTK_DIALOG (dialog));
    if (res == GTK_RESPONSE_ACCEPT)
    {
        char *filename;
        filename = gtk_file_chooser_get_filename (chooser);
        g_print("%s\n",filename);
        g_free (filename);
    }
    
    return 0;   
    
}

実行すると、引数のディレクトリーを指定できるので、そのところで開く。
ファイルを選ぶと、標準出力にファイル名を出すようしにした。

シェルスクリプトから呼び出すと、応用できる範囲は広い。

set filePath [exec /home/user/gtk/filechooser /home/user/Archives/Photos/Image]

このように、tclでfilePathにファイル名を代入することができる。Tkで使ってた、tk_getOpenFile をこちらに変えたのである。Tkではプレビューがないので画像ファイルは、呼び出して表示と手間がかかっていた。この方法だとプレビューと言うか、アイコンが見えるのあるが……。小さい。まったく小さい。大きさ変えられないし。もっと大きなアイコン表示ができる?プレビューが同じ窓でできない?

You can add a custom preview widget to a file chooser and then get notification about when the preview needs to be updated. To install a preview widget, use Gtk.FileChooser.set_preview_widget(). Then, connect to the Gtk.FileChooser ::update-preview signal to get notified when you need to update the contents of the preview.

gtk_file_chooser_set_preview_widget()を使ってみた。

#include <gtk/gtk.h>
 
static void
update_preview_cb (GtkFileChooser *file_chooser, gpointer data)
{
  GtkWidget *preview;
  char *filename;
  GdkPixbuf *pixbuf;
  gboolean have_preview;

  preview = GTK_WIDGET (data);
  if (filename = gtk_file_chooser_get_preview_filename (file_chooser))
  {
  pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 256, 256, NULL);
  have_preview = (pixbuf != NULL);
  g_free (filename);

  gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf);
  if (pixbuf)
    g_object_unref (pixbuf);

  gtk_file_chooser_set_preview_widget_active (file_chooser, have_preview);
}
}
 
 
 int main(int argc, char *argv[])
 {
    
    GtkWidget *dialog;
    GtkWidget *window;
    GtkWidget *preview;
    
    gtk_init(&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
    dialog = gtk_file_chooser_dialog_new ("Open File",
                                          GTK_WINDOW (window),
                                          GTK_FILE_CHOOSER_ACTION_OPEN,
                                          ("Cancelする"),
                                          GTK_RESPONSE_CANCEL,
                                          ("Openする"),
                                          GTK_RESPONSE_ACCEPT,
                                          NULL);
    preview = gtk_image_new ();
    GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
    gtk_file_chooser_set_preview_widget (chooser, preview);
    g_signal_connect (chooser, "update-preview",
		    G_CALLBACK (update_preview_cb), preview);

    if (argv[1])
        gtk_file_chooser_set_current_folder (chooser,argv[1]);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
    {
        char *filename;

        filename = gtk_file_chooser_get_filename (chooser);
        g_print("%s\n",filename);
        g_free (filename);
    }
     gtk_widget_destroy (dialog);
     
    return 0;   
    
}

これだと画像を選択すれば、右にプレビューが表示されるので便利だ。

https://developer.gnome.org/gtk3/stable/GtkFileChooserDialog.html#gtk-file-chooser-dialog-new
https://developer.gnome.org/gtk3/stable/GtkFileChooser.html
https://lazka.github.io/pgi-docs/Gtk-3.0/interfaces/FileChooser.html

追加
Couldn’t connect to accessibility bus: Failed to connect to socket /tmp/dbus
が出現するのを消すには、

export NO_AT_BRIDGE=1

を実行しておく、bashrcに記載しておく。fvwmのメニューの中で実行して、エラーが出るので、wish中に

set ::env(NO_AT_BRIDGE) 1

を追加するとエラーが出なくなった。dbusのバグのようだが。

 

fvwmに、fvwm-menu-desktop を使用し XDG Menusをメニュー追加

fvwmのメニューはカスタマイズが簡単にできるが、自動的に生成されるメニューはDebianメニューを使っていたが、
もっと便利なXDG Menusがあったのでこれを使えるように設定した。
StartFunctionsに以下を追加 

+ I Test (!f $[FVWM_USERDIR]/.XDGMenu) XDGRegen
+ I Read $[FVWM_USERDIR]/.XDGMenu

.XDGMenuファイルがないと、XDGRegenを実行し、そのファイルを読み込む。
XDGRegenは、以下で設定する。

DestroyFunc XDGRegen
AddToFunc XDGRegen
+ I PipeRead 'fvwm-menu-desktop --regen-cmd XDGRegen > \
    $[FVWM_USERDIR]/.XDGMenu; echo "Nop"'
+ I Read $[FVWM_USERDIR]/.XDGMenu

https://www.mankier.com/1/fvwm-menu-desktop

raid1 片方消えていた

16.10を使用してたが、raid1の片方が消えていた。active raid1からデバイス名が消えていた。

$sudo mdadm --manage /dev/md1 --add /dev/sdd5

新たに追加で、追加できたが。なんでだろ。

後日また、消えた。sdd5が
再度addした。
大丈夫か Linux ubuntu16-10-64 4.8.0-37-generic #39-Ubuntu SMP Thu Jan 26 02:27:07 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu 16.10にしたら、ハイバネートできなくなった

http://askubuntu.com/questions/839147/hibernation-with-ubuntu-16-10-fails
これか?

richblのやり方だと起動時にカーネルパニックおこしたわ
crysmanのやり方は、わしの16.04のハイバネートとほぼ同じだが、画面が暗くなって反応しなくなった。
したがって、16.10はわしの環境だと、できないということなのかぁ。

/etc/initramfs-tools/conf.d/resume に RESUME=UUID=91ccfcbe-de30-457e-9998-953ea78588c6 に変更
/etc/default/grubの

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0 quiet splash resume=UUID=91ccfcbe-de30-457e-9998-953ea78588c6"

変更してみた
sudo update-initramfs -u
sudo update-grub
これでもだめだ

https://help.ubuntu.com/community/PowerManagement/Hibernate
これか?

Platform is the default and recommended mode of hibernation. Unfortunately, the “platform” mode of hibernation does not work on some systems with a broken BIOS. In such cases the “shutdown” mode of hibernation might work.

http://askubuntu.com/questions/768136/how-can-i-hibernate-on-ubuntu-16-04
ここにも書いてあるが

結果;うまく動かない

これは?

$sudo apt-get install hibernate
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  uswsusp
提案パッケージ:
  915resolution
以下のパッケージが新たにインストールされます:
  hibernate uswsusp

これもだめ

https://ubuntuforums.org/showthread.php?t=2306178
これは?
http://d.hatena.ne.jp/kakurasan/20080421/p1
これは?
だめだな
Edit /etc/systemd/logind.conf to set HandleLidSwitch=hibernate (optional: permits hibernate to start on lid close)
やってみたどうだ?だめだった。HandleLidSwitchは、ラップトップとかで、そのキーが押された時の動作のようだ。
環境によってカーネルが動作できてない。
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1566302
結論 カーネル次第

inxi -GCS

これが原因か

http://askubuntu.com/questions/76488/system-wont-boot-unless-i-type-exit-at-initramfs-prompt

Boot Degraded RAID
Modify /etc/initramfs-tools/conf.d/mdadm
BOOT_DEGRADED=true
Update initram
sudo update-initramfs -u
Reboot

これか?
だめだった

http://opensuse.opensuse.narkive.com/IOLnQHP2/configuring-a-working-suspend-to-disk-method

これか?

→関連
関連投稿;Ubuntu16.04のサスペンド、ハイバネート

結末として。17.04 zestyに夢を託して、いじってみたが、やはりハイバネート失敗。
LTSに戻すしか方法はなさそうだ。

ちょっと待った!
17.04で遂にハイバネートできそう!
何度もテストをしていたが。ヒントを掴んだ気がする。

grubが関係してたのだ!
grub-installをした、システムでない、他のパーティションのシステムから起動させた、17.04でハイバネートができるようになった。しかし、grub-installを行ったシステムでは、ハイバネートできない。
これ大きなヒントになりそうですね。もう少し探ってみるか。

	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos7'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos7 --hint-efi=hd1,msdos7 --hint-baremetal=ahci1,msdos7  14949105-0ead-4826-aab5-155b9042af46
	else
	  search --no-floppy --fs-uuid --set=root 14949105-0ead-4826-aab5-155b9042af46
	fi
	echo	'Linux 4.10.0-19-generic をロード中...'
        linux	/boot/vmlinuz-4.10.0-19-generic root=UUID=14949105-0ead-4826-aab5-155b9042af46 ro  resume=UUID=47ef2af5-e4cd-4f23-9f64-1466b3540905
	echo	'初期 RAM ディスクをロード中...'
	initrd	/boot/initrd.img-4.10.0-19-generic

grub起動時ここの1行から5行目まで削除してコントロールXで起動して、ハイバネートして。再起動時にも同様に行うと、ハイバネート起動に成功することができた。
ただ、毎回、削除するのも面倒だし。消して保存を考えないとならない。

という訳で、設定を保存するためには、どこをいじろうかな。
/etc/grub.d/10_linux にload_video,gfxmodeがあるんで、ここを編集した。
でも、ハイバネートからの起動に失敗することあるんだよね。

 diff /etc/grub.d/10_linux ./10_linux.org 
145,155c145,158
< #  if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
< #      echo "	load_video" | sed "s/^/$submenu_indentation/"
< #  else
< #      if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
< #	  echo "	load_video" | sed "s/^/$submenu_indentation/"
< #      fi
< #  fi
< #  if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
< #     ([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
< #      echo "	gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
< #  fi
---
>   if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
>       echo "	load_video" | sed "s/^/$submenu_indentation/"
>   else
>       if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
> 	  echo "	load_video" | sed "s/^/$submenu_indentation/"
>       fi
>   fi
>   if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
>      ([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
>       echo "	gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
>   fi
> 
>   echo "	insmod gzio" | sed "s/^/$submenu_indentation/"
>   echo "	if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/"
157,159d159
< #  echo "	insmod gzio" | sed "s/^/$submenu_indentation/"
< #  echo "	if [ x\$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi" | sed "s/^/$submenu_indentation/"
< #

ハイバネートからの復帰に失敗することがあり、何とかならないものかと。
amdgpuが自分の環境だと、失敗の原因のようだ。
/etc/modprobe.d/blacklist.conf

#blacklist radeon
blacklist amdgpu

でblacklistにしとく。radeonだけkmsでロードされるようにする。
GRUBでradeon.modeset=1 radeon.dpm=0と記述することにより、ハイバネートが成功するようになった。

/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=47ef2af5-e4cd-4f23-9f64-1466b3540905 radeon.modeset=1 radeon.dpm=0 "

/etc/grub.d/10_linux はオリジナルのものにしたが問題なくハイバネートと復帰ができた。

これで、継続してハイバネートできればよいが。

その後、一日数回ハイバネートしてるが、8日は無事に復帰できている。 

$uptime
 22:38:46 up 8 days, 14:14,  2 users,  load average: 0.89, 0.50, 0.49

つづく