linux 休止状態の動作を確認したい

この記事を書いた動機 (Nov 14 あたりの出来事) 最近、HP Proliant ML 150 (9 Gen) の消費電力削減の目的で、休止状態を利用できるようにしようとした過程で、それが正しく機能しているのか調べたくなった。そこで、ただメモリをたくさん指定した量だけ消費するプログラムを作成し、とりあえず動くところまで作ったので、ここに置いておこうというわけである。どこまで意味があるのかは不明。 ちなみに、一応メモリ割り当てに失敗したとき用に、再度メモリ割り当てを試みる機能や、メモリ割り当てに完全に失敗したときにプログラムを終了するなど、セーフティも実装しているが、結局使うことはなかったので正しく動く保証はない。 使い方 プログラムのコンパイル gcc useram.c -o useram プログラムの利用 # 10 GB のメモリを埋めるときの例 useram 10 Too many ram will be allocated by your request. denied operation. と出てくる時 プログラム内の定数 margin の大きさが大きすぎる可能性があるので、適宜調整する。 後は単純に、実装されているメモリサイズより大きなサイズを指定してしまっているので、小さい値で再度プログラムを実行してみる。 プログラム本体 #include <stdio.h> #include <stdlib.h> #include <sys/sysinfo.h> // unit GB #define margin 10 #define retry 3 // Get the amount of entire installed RAM. // No args are required. // return: amount of entire installed RAM int checkRAM(){ unsigned int amount = 0; // GB struct sysinfo info; sysinfo(&info); // convert unit byte to Giga byte (10^9) amount = info.totalram / 1000 / 1000 / 1000; return amount; } // allocate RAM (amount GB) // args:(Unit -> GB) // amount: allocation size unsigned int // maxAmount: entire system RAM amount unsigned int // return: // pointer: pointer to allocated area void* // If all ram allocation attempts are failed, return NULL. void* allocateRAM(unsigned int amount, unsigned int maxAmount){ // find specified allocation size is exceed entire system RAM amount or not. if(amount >= maxAmount - margin){ printf("Too many ram will be allocated by your request. denied operation.\n"); return 0; } // allocate ram but still the allocated area is not utilized. unsigned long allocateSize = (long)sizeof(char) * (long)amount * (long)1000 * (long)1000 * (long)1000; void* pointer = (void*)malloc(allocateSize); // retry ram allcation if it is failed. if(pointer == NULL){ printf("ram allocation is failed. retry %d times\n",retry); int counter = 0; while(pointer == NULL && counter < retry){ printf("retry %d\n",counter); void* pointer = (void*)malloc(allocateSize); counter++; } } // If all ram allocation attempts are failed, return NULL. if(pointer == NULL){ printf("allocation failed!\n"); return NULL; } printf("allocation OK\n"); return pointer; } // amount unit GB void useRAM(void* pointer,unsigned int amount){ // 4 mean size of int unsigned long loopAmount = (long)amount * (long)1000 * (long)1000 * (long)1000 / (long) 4; int* arr = (int*)pointer; // For each loop, fill up the allocated area with random value by 4 byte(size of int) for(unsigned long i = 0; i < loopAmount; i++){ arr[i] = (int)rand(); } printf("Loop amount %lu\n",loopAmount); printf("RAM area is filled up. The process is finished.\n"); return; } int main(int argc,char **argv){ // find entire system ram unsigned int ramAmount = checkRAM(); // If The allocation size is not specified, exit this program. if(argc <= 1){ printf(" The size of ram amount that will be filled up is not specified. (GB)\n"); return -1; } unsigned int amount = atoi(argv[1]); // find correct value is entered or not if(amount != 0){ printf("%d GB\n",amount); }else{ printf("You may enter string or 0 as args. Stop.\n"); return -1; } printf("System info: \n %d GB RAM is installed\n",ramAmount); // ram allocation and filling up process void* pointer = allocateRAM(amount,ramAmount); useRAM(pointer,amount); // If ram allocation is failed, exit this program if(pointer == NULL) { printf("went worng\n"); return -1; } // wait until get user input. // The filled up RAM area will not be free while there is no user input for 'q' key. char input = 'a'; while(input != 'q') scanf("%c",&input); free(pointer); return 0; } 参考にしたサイト How to determine memory size via C code - Stack Overflow https://stackoverflow.com/questions/45259131/how-to-determine-memory-size-via-c-code (2024年12月12日)

December 12, 2024

yt-dlpコマンドで、年齢制限を何とかするの追記

前回の記事 yt-dlpコマンドで、年齢制限を何とかする なんで追記を書くことにしたの? 最近、cookieを直接 yt-dlp コマンドに渡すのは、なんか cookie が機能しなくなったりしてメンテする必要があったりと、めんどっちいなとなった。何とかブラウザから cookie 読み込んでくれないかなと試したところ成功した。そこで、投げやりにしてた部分を今更ながら書いてみようとそういうわけである。 あと、単純に google analytics をこのブログに導入してみて、一番 yt-dlpコマンドで、年齢制限を何とかする に訪問者 (Bot説ある) がいそうだという点も気にしてたりする。本当は、アンダーマイニング効果とかあるし、あまり他人目線でやると、本来のこのブログの意味が崩壊するので、なるべく避けたいものであるが、、、(実は、google analyticsとかは使わないほうがいい説があるが、しばらく様子見としてみる。) 分かったこと 必要なパッケージがある 以下のように調べてみると、 python-secretstorage というパッケージが必要そうなことが分かる。 pacman -Si yt-dlp # -Si オプション: パッケージに関する情報について調べる。必須ではないがインストールが推奨されるパッケージの情報も出てくる。 リポジトリ : extra 名前 : yt-dlp バージョン : 2024.12.06-1 ... python-secretstorage: For -cookies-from-browser to access the GNOME keyring while decrypting cookies of Chromium-based browsers ... うまくいかないブラウザ chromium 系のブラウザでは、cookieの復号がうまくいかず、以下のように失敗するので、諦めて firefox を使うことにした。ちなみに、私は brave とかそのほかのブラウザでは特に試していないので、chrome とか firefox 以外のブラウザにおいての具体的な挙動はまだわかっていない。 “cannot decrypt v11 cookies: no key found " と言われ、cookieの取得に失敗する。 ...

December 11, 2024

https通信をプライベートネットワークで使いたい

この記事を作った動機 私はプライベートネットワークにおいて、自分のためだけのサービスをhttpプロトコル経由で利用できるようにしているが、拡張機能とかの作成にあたり、httpsじゃないと不都合が生じるようになったことがきっかけで、https化に苦労することになり、もう嫌だということでこの記事を書くことになった。 例えばyoutube上で動作する拡張機能が、自分だけのためのサービスが動いているhttpサーバをバックエンドとして使うことを考えると、http通信とhttps通信が一つのWebページを表示するために混在してしまうために、ブラウザ側で通信がブロックされたリ、騒がしいエラーが出てきてしまい、非常に不快な思いをすることになる。 前提としていること 参考程度に前提条件とかも書いておく。 httpdを使っている。 opensslパッケージがインストール済み すでにhttpdを使っていて、ブラウザでなんか表示できる状態にある。 あくまで個人用など、閉じられた環境において、https通信を実現したいと考えている。 このブログの様な、大っぴらに公開されているWebサイトには使えない手法であることを理解している。 https通信の実現方法 証明書を作る HTTPsを実現するために、mkcertコマンドを使って証明書を作成するが、どんな証明書が必要が一応自分の理解の範囲であり、間違っているかもしれないが、簡易的に書いておく。必要そうな証明書は以下のとおりである。 サーバ自体を証明する証明書 各httpサーバとかのためにサービスごとに個別に用意される証明書 この中で、サーバと通信するパソコンがインストールしているべき証明書は、「サーバ自体を証明する証明書」の証明書の公開鍵であり、「各httpサーバとかのためにサービスごとに個別に用意される証明書」の公開鍵ではない。 mkcert コマンドのインストールを行う 私は arch linux を使っているので、以下のようにパッケージマネージャを利用した。 yay -S mkcert # たぶんリポジトリの分類がExtraにあるので、pacmanでもインストールできる # pacman -S mkcert mkcertの初期化を行う サーバ自体を証明する証明書の作成を行う。 mkcert -install # 証明書が保存された場所を調べるためには以下のコマンドでできる。基本的にmkcert -installを実行したユーザのホームディレクトリのどこかにある。 # mkcert -CAROOT # /home/username/.local/username/mkcert # 自分の環境だとこのような出力が得られる。 httpサーバ用の証明書を作る 次に以下のようにして、httpサーバが動いているドメイン名やIPアドレスを引数として、サービス用に証明書を作成する。この証明書は今回の場合であれば、httpdサーバの443番ポートを経由して、通信しているブラウザ等に送られることになる。 # コマンドを実行したファイル内で証明書の公開鍵と秘密鍵ができてしまうため、一応作業用のフォルダを作っている。 mkdir ./sslLocal/ cd ./sslLocal # 各httpサーバとかのためにサービスごとに個別に用意される証明書を作成 mkcert mydomain.name ipAddr # ドメイン名やIPアドレスなど複数指定できるらしいが、自分はとりあえずドメイン名だけにしてた。 # あっ、mydomain.nameやipAddrとかは適宜読み替えてください httpdが使う証明書を配置 私は以下の様にして、httpサーバ用の証明書を配置した。 # 証明書を作成したディレクトリへ移動 cd ~/sslLocal/* # ファイル内容を確認し、証明書の公開鍵と秘密鍵があることを確認する。 ls -rw-------⠀username⠀1708⠀Nov 4 02:06:02⠀⠀mydomain.name-key.pem -rw-r--r--⠀username⠀1452⠀Nov 4 02:06:02⠀⠀mydomain.name.pem # httpdのconfigがあるところに、証明書を置いておく場所も作る。 sudo mkdir /etc/httpd/conf/ssl # 署名書を作成したフォルダまで移動する。 cp ~/sslLocal/* /etc/httpd/conf/ssl/ httpdの設定 ssl通信に必要なモジュールを読み込む。 ...

November 4, 2024

yt-dlpコマンドで、年齢制限を何とかする

この記事を書いた動機 特に、2015年以降の買収済みのyoutube(というかgoogle)はどうも営利企業としての側面をあらわにしているのか、広告ブロックされる理由を考えて対応するより先に、広告ブロックを悪者にして追い出したり、利用者に対して一方的な方針転換やサービスの実装をしているようである。 その波が、動画をダウンロードするこのコマンドにも来ているようで、なんか年齢制限でダウンロードできないというあまりに不便な挙動をしていることに気づいた。何とかしようと考えるわけだが、なかなか面倒だったし、思い出せる自信もないので、結構いい加減だけど、記録を残すことにした。 環境について 私は普段、windows を使っておらず、linux環境しか使ってないです。なのでこの記事は、windows ユーザにとってはずれているところがあったりと、微妙なところがあるかもしれません。 制限を突破する方法 yt-dlpコマンドのプラグインを使う。 yt-dlpコマンドの以下のオプションを使う。 yt-dlp [urlとか] --cookies [クッキーのテキストファイルのパス] ※ これは自分のGoogleアカウントでyoutubeにログインすると、そのログイン状態を保持するための情報がcookieに入っていることを利用していると思われる。そのログイン情報が悪用される可能性があるかは未知数。。。なので、なるべくサブのアカウントなどの利用を推奨する。 今とにかく動いた方法 なんか最初にやったことから書いたらグダグダになったので、いったんとにかく動作確認ができた方法から記録してみる。 youtubeからcookieを抽出 youtubeにログインし、cookieを抽出可能な拡張機能をインストールして、抽出する。私は、Get cookies.txt LOCALLYという拡張機能を利用した。どうも、yt-dlpは、Netscapeとかいう古のブラウザのcookie形式でしか受け付けないらしく、javascriptでdocument.cookieとかやって得られる情報そのままではだめらしいので、楽な方に流れたという感じ。 yt-dlpでcookieのテキストファイルを指定し、実際に動画をダウンロード yt-dlp [urlとか] --cookies [クッキーのテキストファイルのパス] とにかく、これで一時的に動かすことができたが、セッションが有効期限切れになったりすると、たぶんまた作業をやり直す必要があり面倒である。 cookieのテキストファイルって何? Netscape形式の場合、以下に示すようなものであるよう。 # Netscape HTTP Cookie File # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. .youtube.com TRUE / TRUE 1741146319 LOGIN_INFO 何かのデータ .youtube.com TRUE / FALSE 1763243188 SID 何かのデータ .youtube.com TRUE / TRUE 1763243188 __Secure-1PSID 何かのデータ .youtube.com TRUE / TRUE 1763243188 __Secure-3PSID 何かのデータ .youtube.com TRUE / FALSE 1763243188 HSID 何かのデータ .youtube.com TRUE / TRUE 1763243188 SSID 何かのデータ .youtube.com TRUE / FALSE 1763243188 APISID 何かのデータ .youtube.com TRUE / TRUE 1763243188 SAPISID 何かのデータ .youtube.com TRUE / TRUE 1763243188 __Secure-1PAPISID 何かのデータ .youtube.com TRUE / TRUE 1763243188 __Secure-3PAPISID 何かのデータ .youtube.com TRUE / TRUE 1764701056 PREF 何かのデータ .youtube.com TRUE / TRUE 1761676825 __Secure-1PSIDTS 何かのデータ .youtube.com TRUE / TRUE 1761676825 __Secure-3PSIDTS 何かのデータ .youtube.com TRUE / FALSE 1761677056 SIDCC 何かのデータ .youtube.com TRUE / TRUE 1761677056 __Secure-1PSIDCC 何かのデータ .youtube.com TRUE / TRUE 1761677056 __Secure-3PSIDCC 何かのデータ .youtube.com TRUE / TRUE 1745681252 VISITOR_PRIVACY_METADATA 何かのデータ .youtube.com TRUE / TRUE 1745681252 VISITOR_INFO1_LIVE 何かのデータ .youtube.com TRUE / TRUE 0 YSC 何かのデータ 以降の内容 これ以降の内容は、単に記録として適当にグダグダ書いてあるので、詳しいことを知りたい人以外には、あまり有用ではない可能性があるということだけはここに書いておく。 ...

October 29, 2024

gnomeの設定のメモ ⚙

この記事を書いた動機 ただの自分用のよく使う設定集としてのメモ。基本的にgnome標準で付いてくると思われるgsettingsコマンドを使う。 環境 細かいことは書かないけど一応 gnome wayland Xwayland no X11 4kなどの高解像度ディスプレイ gnome の有効化(一応) gnomeのディスプレイマネージャーを単にsystemdのサービスとして起動時に立ち上がってくれるように有効にするだけ。Windowsで言ったら、logonui.exeかみたいなやつに近い気がする。 systemctl enable gdm トラックパッドの設定 物理ボタンではなく、タップしている領域で右クリックか判定しているトラックパッド用の設定。 gsettings set org.gnome.desktop.peripherals.touchpad click-method 'areas' ウィンドウのボタン 最大化、ウィンドウモードとかのボタンなどのWindowsでは標準の機能がデフォルトで無効になっているので、有効にする。 gsettings set org.gnome.desktop.wm.preferences button-layout ":minimize,maximize,close" スケーリングの設定 スケーリングとか、gnomeの実験的な機能として現在(2024年10月27日)組み込まれている機能を有効化する。よくバグる。 # 125% とかもっと細かいスケーリングを有効にできる。ある程度は実用できる段階に体感では感じるが、Xwaylandのアプリが思いっきりぼけてしまう。 gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']" # Xwayland で動くアプリがぼけないようにする、欲張り設定。中途半端な125%とかの設定と併用すると、変にウィンドウが特定の領域でしか反応しなくなるなど、バグが多い。 gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer','xwayland-native-scaling']" ちなみに、Xwaylandの「xwayland-native-scaling」などは、以下のサイト(githubのmutterのリポジトリ)で設定値の存在を確認できる。 https://github.com/GNOME/mutter/blob/main/data/org.gnome.mutter.gschema.xml.in 例えば、こんな感じで書いてある。何か気になるのがあったら、仮想マシンかなんかで使う前に試してみるといいかもしれない。 <schemalist> <flags id="org.gnome.mutter.MetaExperimentalFeature"> <value nick="scale-monitor-framebuffer" value="1"/> <value nick="kms-modifiers" value="2"/> <value nick="autoclose-xwayland" value="4"/> <value nick="variable-refresh-rate" value="8"/> <value nick="xwayland-native-scaling" value="16"/> </flags> カーソルの大きさ サイズの取得 gsettings get org.gnome.desktop.interface cursor-size サイズの変更 gsettings set org.gnome.desktop.interface cursor-size 12 設定のリセット gsettings list-schemas | xargs -n 1 gsettings reset-recursively fcitx5 日本語環境についても、いちいち調べるのはめんどくさいので、今日(2024/11/14)追記してみることにした。 ...

October 27, 2024

hello world

 このページは、文字どうり hello world 的に作ったテストページです。記事が投稿できるか確かめるために作られました。 適当にコードを書いてみる main.c #include <stdio.h> // なんとなくブログ更新テスト用に適当に書いただけで、この関数自体が動くかは試してない void showAllArg(int argc,char **argv){ for(int i = 0; i < argc; i++){ printf("%s\n",argv[i]); } } int main(int argc,char **argv){ printf("hello world!\n"); return 0; } コンパイルする gcc main.c -o main ./main # 実行 three.js のテスト ...

April 17, 2024