20210611のLinuxに関する記事は8件です。

[Linux]sedコマンドとawkコマンドについて

はじめに sedコマンドとawkコマンドについて学んだのでまとめてみました sedコマンド sedとは「Stream Editor」から来ています。そう、エディタのことです。ただし、sedコマンドでは非対話的エディタのため、編集し出力をしても元のファイルに変更は加えないという特徴があります。 terminal % sed オプション <スクリプト> <対象ファイル> おそらくこれだけではわからないと思います。使用例としては以下です。 terminal % sed 1,5d sample.txt % sed 's/aaa/bbb/g' sample.txt うん、もっとわからなくなったはずです笑 とりあえず、sedコマンドは多くのことができるコマンドですが主なコマンド(d:削除、p:行を表示、s:行の置換)を紹介していきます。 行の削除 sedコマンドでは、アドレスで指定した行のみ作用(削除)します。 例えば、以下のようなファイルがあったとします。 sample.txt Beer BeerBeer BeerBeerBeer Beeeeeeeeeeeeeeer! それでは行を削除してみます。 terminal % sed 1d sample.txt BeerBeer BeerBeerBeer Beeeeeeeeeeeeeeer! 1行目のBeerが削除されていることがわかります。 行は範囲指定できます。 terminal % sed 1,3d sample.txt Beeeeeeeeeeeeeeer! ちなみにアドレスを指定せずにコマンドを打てば全削除になりますし、アドレスに$を使用すると最終行までを意味することができます。$を使うときは、シェルに解釈させないために''で囲みましょう! terminal % sed d sample % sed '3,$d' sample.txt Beer BeerBeer 上記では行番号で削除するものを決めていましたが、正規表現でもOKです。 以下の場合は、先頭がBから始まる行を指定しています。 terminal % sed /^B/d sample.txt 行を表示する 今回はシンプルで削除した際にdとしていたところをpとするだけです。 terminal % sed 1p samole.txt Beer Beer BeerBeer BeerBeer BeerBeerBeer BeerBeerBeer Beeeeeeeeeeeeeeer! Beeeeeeeeeeeeeeer! あれ、、、2重になっている、、、 これはできれば各自調べて欲しいのですが、、「パターンスペース」の出力も同時に行われているためです。 これではみづらいので、-nオプションを使えばパターンスペースの出力をなくすことができます! terminal % sed -n 1p sample.txt Beer 行の置換 置換ではsコマンドを使用します terminal % sed 's/置換する文字列/置換後の文字列/フラグ' ファイル名 フラグは省略可能です。 ただし、省略した場合は、見つかった文字列の最初しか置換しないので、フラグのところにgとつけてあげます。すると、見つかった文字列は全て置換します。 なお、置換が発生したときのみ出力するpフラグを使うと便利です terminal % sed 's/beer/wine/gp' sample.txt ちなみに、拡張表現を使ってグループ化、参照をうまく使えば、以下のようにすることも可能 ()でグループ化したものは\1や\2といった形で参照できます。 sample.txt My wine My beer terminal % sed 's/My \(.*\)/--\1--/' sample.txt --wine-- --beer-- awkコマンド awkコマンドはsedよりも高性能にテキストの抽出や加工をします。 書き方は以下のとおりです。 terminal % awk パターン {アクション} ファイル名 当然これだけではわかるまい!と言うわけで解説。 awkではパターンにマッチした場合のみアクションを行います。もちろん、パターンは省略可能でその場合は、全データが対象になります。 具体例を見ていきます。例えば、以下の場合であれば第1フィールドがsで始まるレコードを行番号付きで表示します。 terminal % awk '$1 ~ /^s/ {print NR,$0}' test.txt $1,,,,,$9は、レコードの並びを分割した際の各フィールドを示し、$0はレコード丸々を示します。また$NSはいわゆる最後のフィールドを指し、$(NS-1)とすることも可能です。 パターンの指定方法としては以下です。 terminal % awk `$9 ~ /^cp/` {print $5,$8} この場合は、第9フィールドの先頭がcpで始まっているレコードに対して、第5、8フィールドを表示させるコマンドになります。 より実践的な例としては、csvファイルで平均を考えるときは以下のようにする。 terminal % aws -F, `{sum+= $NF} END {print "Average:",sum/NR}` score.csv ここで-F,はフィールド区切りの文字を指定するためのオプションであり、ENDはそれよりも前のアクションが終わってから次のアクションをさせるものです。 つまり、フィールド区切りのレコードに対して、最後のフィールドの合計値を求めた後に、平均を表示してます。ちなみに、NRはこれまで読み込んだレコード数が代入された組み込み変数です。 おわりに 以上、sedとawkについてまとめました。 便利なコマンド?だと思われるので、是非使い慣れたいものです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

開発環境自動化②

経緯 mac,linux(arch,ubuntu,debian),windows(wsl)で同じ環境作るのめんどくさすぎ問題。が発端 詳しくは以下の"開発環境めんどくさすぎる問題"を読んでください。 https://qiita.com/aki-f/items/494cefe0e98cc74249fa  問題 今までのやり方だとすべてのパソコンでhaskellやrustがインストールされてしまう。 そして環境変数化へ 以下のファイルを作った。 config.json { "languages": { "haskell": { "enable" : true }, "rust": { "enable" : true }, "ruby": { "enable": true, "version": "3.0.1", "modules": [ "solargraph" ] }, "nodejs": { "enable": true, "version": "14.17.0", "modules": [] }, "jvm": { "enable": true, "version": "11.0.10", "modules": ["gradle"] } } } これを環境変数にするには enviroment.sh export RUBY_FLAG=$(cat ~/dotfiles/config.json | jq .languages.ruby.enable) export RUBY_VER=$(cat ~/dotfiles/config.json | jq -r .languages.ruby.version) export RUBY_MODULES=$(cat ~/dotfiles/config.json | jq -r .languages.ruby.modules\[\] | tr '\n' ' ' ) export NODE_FLAG=$(cat ~/dotfiles/config.json | jq .languages.nodejs.enable) export NODE_VER=$(cat ~/dotfiles/config.json | jq -r .languages.nodejs.version) export NODE_MODULES=$(cat ~/dotfiles/config.json | jq -r .languages.nodejs.modules\[\] | tr '\n' ' ') export JVM_FLAG=$(cat ~/dotfiles/config.json | jq .languages.jvm.enable) export JVM_VER=$(cat ~/dotfiles/config.json | jq -r .languages.jvm.version) export JVM_MODULES=$(cat ~/dotfiles/config.json | jq -r .languages.jvm.modules\[\] | tr '\n' ' ') export RUST_FLAG=$(cat ~/dotfiles/config.json | jq -r .languages.rust.enable) export HASKELL_FLAG=$(cat ~/dotfiles/config.json | jq -r .languages.haskell.enable) source enviroment.sh 例えばjavaだとこうなる install/jvm.sh if [ $JVM_FLAG ]; then curl -s "https://get.sdkman.io" | bash source ~/.sdkman/bin/sdkman-init.sh if [ "$(uname)" == 'Darwin' ]; then if [ "$(uname -m)" == 'arm64' ]; then sdk install java $JVM_VER-zulu else sdk install java $JVM_VER.9-ms fi else sdk install java $JVM_VER-ms fi sdk install $JVM_MODULES fi $JVM_FLAGがfalseならインストールしないし、各種アーキテクチャによってパッケージを変えるが、すべて同じバージョン。 現状はruby,nodejs,jvm,rust,haskellに対応してる。  最後に これからはconfig.jsonをパソコンごとに変更するだけで環境を作れます。 やっぱりdotfile用にフレームワーク作りたい。 もっとクールなやり方あったら教えて下さい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dokuwikiにプラグインを入れたら,真っ白なページが表示される

研究室のPCをDokuwikiとして稼働させています. 一応忘れないためにインストール手順も書いておきます. 参考程度にしてください. インストール まずは,sources.listを適切に設定し,アップデート・アップグレードを行います. $ apt-get update $ apt-get upgrade -y 以下のリンクにDokuwikiの立て方が掲載されています. 上記リンク内の # Let’s EncryptSSLでDokuWikiを保護する # より下はやってません. なぜかというと,ローカルネットワーク内部に設置するためです. 後は,install.phpに行き,適切に設定すると,ページができる. 手順通り行うと,Dokuwikiは立ち上がるはずです. データ保存先を変更したら躓いた PCのストレージが大きいPCもありますが,私の場合は外付けHDDに保存する計画です. Dokuwikiのページ上で右上の管理>サイト設定>データ保存用のディレクトリ という部分を変更します. 一応絶対パスで書いておくといいと思います. すると 先程まで開けていたDokuwikiが開けない. 開けなくなった理由は以下のような感じだと理解している. ファイル保存場所として指定したディレクトリには,atticやcache,index.その他諸々がディレクトリとして存在していなければ,Wikiページが開けない仕組みになっている. # find / -name data で検索し,自分は以下のディレクトリにあった. /var/www/html/dokuwiki/data このdataディレクトリをサイト上で指定したディレクトリにコピーすると,開ける. これで,主観的にみて容量が大きいHDDに保存することができるようになりました. いよいよ本題のプラグインインストール LaTeXのプラグインをインストールすると真っ白いページしか表示されない. Dokuwiki日本語版のFAQページは以下. ここでエラーログの場所を知る. $ vi /var/log/apache2/error.log [Wed Apr 14 15:39:58.237882 2021] [php7:error] [pid 17137] [client 172.16.0.4:34588] PHP Fatal error: Declaration of syntax_plugin_pageindex::render($mode, &$renderer, $data) must be compatible with dokuwiki\\Extension\\SyntaxPlugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/dokuwiki/lib/plugins/pageindex/syntax.php on line 99, 上のerror.logからエラーを吐いているプログラムを突き止める. エラーログの一番下が1番新しいエラーです. # vi /var/www/html/dokuwiki/lib/plugins/latex/latexinc.php 自分の場合は17行目 不正解 class syntax_plugin_latex_common extends DokuWiki_Syntax_Plugin { 正解 abstract class syntax_plugin_latex_common extends DokuWiki_Syntax_Plugin { 補足 $ vi /var/log/apache2/error.log [Wed Apr 14 15:39:58.237882 2021] [php7:error] [pid 17137] [client 172.16.0.4:34588] PHP Fatal error: Declaration of syntax_plugin_pageindex::render($mode, &$renderer, $data) must be compatible with dokuwiki\\Extension\\SyntaxPlugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/dokuwiki/lib/plugins/pageindex/syntax.php on line 99, こんな感じのエラーを吐いていると思う. 私はPHPに触れたことはない. 今回はPHPのエラーだが,内容は大雑把にこんな感じ. ($mode, &$renderer, $data) #自分の編集しているPHPプログラム must be ($format, Doku_Renderer $renderer, $data) というエラー内容です. 上の段の内容がプログラムに書いてあるけど 正しくは下の段のプログラムだよね?直してね? という内容です. 今回はPHPのエラーでしたが,CやPythonでも同じようなエラーは吐かれるので,応用して解決してください. 最後に Dokuwikiが真っ白のページしか表示されない場合の解決の流れは以下のとおりとなる. 1.error.logの場所を特定 2.error.logの内容を読み,phpの引数や関数のタイプ,名前を確認 3.ブラウザ上でDokuwikiのページをリロード 4.それでも表示されなければ,1に戻りlogを参照し修正する. Dokuwikiのバージョンとかもあるそうですが,私はそこまで詳しくないです. 詳しい方は教えてください. おまけ .pyファイルや.shファイルがアップロードできない場合の対処法 Dokuwikiではアップロードできる拡張子を指定するファイルが存在する. vi /var/www/html/dokuwiki/conf/mime.conf mimeってのが何なのかイマイチ理解できてませんが,拡張子をグローバル単位のようなもので記載したものだと理解しています. 間違ってたら教えてください. mimeのファイルタイプわからないよ.ぴえん.ぴえん. って方は以下のリンクで調べることができます. 調べるのだるいから,ノリで書けば大丈夫だろ!って考えてるそこのあなた. ちゃんと調べたほうがいいですよ.これはDokuwiki公式サイトに記載の有るサイトです. 以下の記載は正解の記載. py text/x-python sh application/x-shellscript 実はpythonでも調べることができます(後で間違ってることが発覚) #!/usr/bin/python3 import mimetypes print(mimetypes.guess_type('検索ファイルを入力')) # ('text/x-sh', None) #.shファイル # ('text/x-python', None) #.pyファイル 結果が違うのがわかると思います. リンク先で調べたほうが正しかったです.(私の環境では.) 駄文で申し訳ないですが,これはメモ的な立ち位置の記事です. 参考にしてもらって構いませんが,間違ってる可能性もあります.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux基礎学習まとめ⑥ プロセスとは

概要 Linuxにおいて、実行中のアプリケーションを管理するプロセスについてメモしておく。 実行環境 macOS BigSur 11.4 CentOS7 (macOS上でLinux環境を構築する方法はこちらを参考にしました) プロセスとは? Linuxでは、実行中のプログラム(アプリケーション)を管理する単位をプロセスと呼ぶ。 各プロセスは、優先度順(Nice値)や、時間ごとにCPUを使用するラウンドロビン方式、FIFO(First In First Out)方式などで、実行順序がスケジューリングされる。 ジョブ シェルが管理するプログラムの単位をジョブという。 何かの作業中に後ろで動かすバックグラウンドジョブ、対のフォアグランドジョブ 例) $ sleep 3600& (バックグランドで実行したい場合、'&'をつける。'sleep'はn秒スリープするプロセス) $ sleep 3601& $ sleep 3602& $ jobs (実行中のジョブを確認するためのコマンド?) [1] Running sleep 3600 & [2]- Running sleep 3601 & [3]+ Running sleep 3602 & $ %1 (フォアグランドジョブにするジョブを指定、'%..'の使い方は様々) sleep 3600 ^Z ('Ctrl + z'でフォアグランドジョブをサスペンド(停止)) $ %- ('-'のついたジョブをフォアグランドジョブにする) $ %% ('+'のついたジョブをフォアグランドジョブにする) $ fg (+のついたものから順に実行していく?) シグナル プロセスにシグナルというイベントを送信して、プロセスを制御する。 よく使うのは、Ctrl + Cのプロセスを 終了させるシグナル。 kill -lコマンドで、シグナル一覧を表示できる。 例) $ cat loop.sh while true do sleep 3600 done :w (書き込み) ^Z (プロセスをサスペンド) $ chmod 755 loop.sh $ ./loop.sh ^C (割り込みシグナルを送信し、プロセスを終了する) プロセス間通信 複数のプロセスがコミュニケーションを取りながら同期したり、動作を変更して達成することがある。これをプロセス間通信という。 詳しい動作は後々勉強することになると思われるため、ここではキーワードのみ書いておく。 System V IPC(Inter Process Communication) 共有メモリ (shared memory) セマフォ (semaphore) メッセージキュー (message queue) ソケット パイプ シグナル プロセスに関係するコマンド集 ・ps プロセスに付与されている一意のID(プロセスID)、自身のプロセスIDは$$で取得可能。 現在実行中のプロセスのスナップショットを表示する。 PPIDを見れば親プロセスがわかる。 ・trap 送信されたシグナルごとの処理を返す。 このコマンドを受け取った際には、プロセスが終了しないので、Ctrl + zやkill [option]コマンドなどで終了させる必要がある。 例) trap echo "...Ctrl + C is pressed." 2 ・stty -a シグナルとキーの割り当てを返してくれる。 これは、慣れるまではめちゃめちゃお世話になりそうな予感。 終わりに 参考文献を最初から読んでいくと今回はネットワークについてまとめるべきである。 しかし、未だに理解できているとは言い難い。 今後Ruby on Railsを勉強しアプリケーションを作る予定であるため、その際に改めて記事にしたいと思う。 参考文献 この記事は以下の情報を参考にして執筆しました。 - Linux標準教科書(ver.3.0.2)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AzureでRHEL8のVMをアップグレードする方法

AzureでRHEL8のVMをデプロイし、アップデートしても最新リリースバージョンになりません。 $ head -2 /etc/os-release NAME="Red Hat Enterprise Linux" VERSION="8.1 (Ootpa)" $ sudo yum update --quiet -y $ head -2 /etc/os-release NAME="Red Hat Enterprise Linux" VERSION="8.1 (Ootpa)" アップグレードしてもリリース8.1のままで、そのバージョンの更新があるパッケージのみがアップグレードされます。 イメージがバージョンロックされているかどうかを確認します。 $ cat /etc/yum/vars/releasever 8.1 上記の場合、リリース8.1でロックされています。 リリース8.4などの別のリリースにアップグレードしたい場合は、以下の手順を参考ください。 バージョンロックをリリース8.4に変更し、すべてのパッケージを更新します。 echo 8.4 | sudo tee /etc/yum/vars/releasever sudo yum update -y その後、VMを再起動します。 sudo reboot 再起動後にリリースを確認します。 $ head -2 /etc/os-release NAME="Red Hat Enterprise Linux" VERSION="8.4 (Ootpa)" リリース8.4にアップグレードされています。 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

QNAP QM2-2P-244Aが認識されなかったので調べてみた

仕事用に使っているQNAP上でVMを動かすことが多くなり、高速化のためSSDを追加することにしました。 残念ながらドライブベイには空きがないので、PCIeスロットに装着する純正オプションであるQM2カードを購入。 SSDを取り付けていざカードを取り付けるもうまく認識されなかったのでいろいろと調べてみたメモ。 結局のところ、QM2カード自体に不具合があったのですが… 環境 QNAP TS-253D (QTS 4.5.3) SATA HDD 4TB x 2本 QNAP QM2-2P-244A (←今回購入して問題のあった物) TEAM MP33 SSD TM8FP6001T (1TB NVMe SSD)1 先に結論 QM2の初期不良が原因 QM2カードにモデル名やシリアル番号が書き込まれていなかった。 シェルからhal_appコマンドで情報を設定することで正しく認識されるようになった。 TEAMのSSDは互換性リストに載っていないが、問題なく使用できた。 解析編 上記の構成でQNAPにQM2を取り付けましたが、認識されません。 QTSで「ストレージ&スナップショット」を開いてもHDDしか表示されず追加したSSDは出てきません。 しばらくうなった後で、 SSHで接続してデバイスとして認識されているか確認してみようと思い立ちました。 とりあえずlspciでカードが認識されているか見てみます。 [~] # lspci -k (略) 03:00.0 Class 0108: 126f:2263 nvme (ry なんと、SSDは認識されていました。 ちなみにQM2はMicrosemi(IDT)のPCIe スイッチとして認識されているようです。 SSDが見つかったのでnvmeコマンドをたたいてみます。 その前にデバイスノードを確認。 [~] # ls /dev/nvme* /dev/nvme0 /dev/nvme0n1 ありますね。 [~] # nvme list Node SN Model Namespace Usage Format FW Rev ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 1xxxxxxxxxxxxx9 TEAM TM8FP6001T 1 1.02 TB / 1.02 TB 512 B + 0 B S1218A3 ありますね… このあとSSDにパーティションを作成して既存の共有フォルダ(/share配下)にマウントしてみたところ普通に読み書きもできました。2 というわけで、なんとなくQM2もSSDも機能はしていそうですが、 QTS上でQM2が論理的に認識されていないということのようです。 ここでQNAPのサポートに下記のような内容でチケットを上げました。 QM2を買ったんだけど、認識してくれない。 でもシェルから確認するとちゃんとSSD自体は認識しているし読み書きもできそう QM2自体が壊れているのか調べる方法はないか? 下記のような投稿もあり(全く同じ現象に見える)QM2自体の不良を疑いました。 https://forum.qnap.com/viewtopic.php?t=159071&p=777056 また、この時に資料としてQNAPの「ヘルプデスク」アプリから出力したログを添付しました。 https://www.qnap.com/en/how-to/knowledge-base/article/how-to-download-diagnostic-logs-from-the-helpdesk-app-in-qts 解決編 その後約1週間、サポートの方とやり取りをしましたが、あまり芳しくありません。 あきらめかけたところで、上記のログファイルを思い出し眺めてみることにしました。 ログファイルはzipファイルになっていて、かなりの数のログファイルが含まれていますが、 主要なログが1つのHTMLファイルにまとめられておりブラウザで一覧表示できます。 このHTMLを開いて"QM2"でページ検索してみました。 QM2は認識され、ドライバも読み込まれていることが分かりました。 [kernel log] qm2_i2c_init : Find 111d:8061. SDA 11 SCL 7 [lsmod log] qm2_i2c 16384 2 I2Cで制御しているようです。 さらに検索すると、hal_appというQNAPのハードウエアを制御するコマンドの結果が見つかりました。 以下はQNAP本体のデバイスを列挙するコマンドの結果のようです。 [hal_app --se_enum] ======================================================================================================== enc_id enc_parent_sys_id enc_sys_id wwn vendor model status protocol disk_no fan_no cpu_fan_no temp_no gpio_no 0 root root QNAP TS-253D 0 0 2 1 0 0 0 2 0 ======================================================================================================== ======================================================================================================== enc_id enc_parent_sys_id enc_sys_id wwn vendor model status protocol disk_no fan_no cpu_fan_no temp_no gpio_no 32 root root_boot QNAP BOOT 0 -1 1 0 0 0 0 0 0 ======================================================================================================== ======================================================================================================== enc_id enc_parent_sys_id enc_sys_id wwn vendor model status protocol disk_no fan_no cpu_fan_no temp_no gpio_no 33 root root_usb QNAP USB 0 2 7 0 0 0 0 0 0 ======================================================================================================== ======================================================================================================== enc_id enc_parent_sys_id enc_sys_id wwn vendor model status protocol disk_no fan_no cpu_fan_no temp_no gpio_no 34 root qm2_1_-1.32 0 9 0 0 0 0 0 0 0 ======================================================================================================== 一番下にqm2_1_-1.32というIDのものがありますが、よく見るとベンダーやモデル名が表示されていません。 qm2_1_-1.32でググってみるとQNAPのフォーラムの投稿がヒットします。 https://forum.qnap.com/viewtopic.php?t=153367&p=778822 SATA接続のQM2-2S-220Aに関する投稿ですが、似たような症状だなぁと思い読み進めていきます。 結果として、最後の投稿が今回の問題の解決策になりました。 投稿内容は今回のケースと同じように認識されないことをサポートデスクとやり取りしたところDeveloper向けのマニュアルが送られてきたというものでした。 投稿主とは環境等が少し違うのですが、読み解くと、おそらくQM2カードにモデル名やシリアル番号が書き込まれていない状態であることが原因のようです。(つまり不良品ということ?) たしかにQTSでの認識にhal_app経由で取得したモデル名やシリアル番号をもとに処理していると考えればこれまでの挙動(=Linux上ではカーネルドライバは読み込まれているのでちゃんと動く)も納得がいきます。 というわけで、フォーラムの投稿内容に従ってモデル名とシリアル番号を設定してみます。 SSHで接続してadminでログイン後下記の手順を行う [~] # hal_app --se_sys_scan ENCLOSURE_SCAN ********************************* enc_sys_id[0] = root enc_sys_id[1] = root_boot enc_sys_id[2] = root_usb enc_sys_id[3] = qm2_1_-1.32 ENCLOSURE_SCAN END***************************** "-1” はモデル名が設定されていないことを意味している フォーラムでは QM2-2S-220Aだったのでモデル名として"QM2-2S"を設定しているが、 今回はQM2-2P-244Aなので"QM2-2P"で設定してみる [~] # hal_app --se_sys_set_nickname enc_sys_id=qm2_1_-1.32,value=QM2-2P さらに、QM2カードに張り付けられたシールに書かれたシリアル番号を設定する hal_app --se_sys_set_board_sn enc_sys_id=qm2_1_-1.32,value=Q2xxxxxxxx 再度scanを行うと… [~] # hal_app --se_sys_scan ENCLOSURE_SCAN ********************************* enc_sys_id[0] = root enc_sys_id[1] = root_boot enc_sys_id[2] = root_usb enc_sys_id[3] = qm2_1_1.32 ENCLOSURE_SCAN END****************************** "-1"だった部分が"1"になりました 下記のコマンドでモデル名とシリアル番号が設定されていることを確認します [~] # hal_app --se_sys_get_nickname enc_sys_id=qm2_1_1.32 enc_sys_id = qm2_1_1.32, get nickname = QM2-2P [~] # hal_app --se_sys_get_board_sn enc_sys_id=qm2_1_1.32 enc_sys_id = qm2_1_1.32, ret = 0,HW SN = Q2xxxxxxxx なんかいけそうな感じがするのでQNAPを再起動します。 再起動には時間がかかるのでじっと観察します。 すると、これまで点灯はしていましたが、点滅することのなかったQM2カードのアクセスランプLEDが点滅するではありませんか。 起動完了後、期待を胸にブラウザからQTSにログインすると無事認識されていました! やりました。 まとめ 長くなりましたが、以上が顛末です。 結局のところQM2の不具合(初期不良)だったようです。 SSD自体も互換性リストにないものですが、その後特に問題なく動作しています。 先のフォーラムにもあるように、ハズレ品があるのかもしれません。 実はこのカードはAmazon.com(USのサイト)で購入したものでした。 なので、初期不良として処理するのも面倒だったので自己解決を目指したわけですが、 そういう意味では高くても国内代理店から買う方がよいのかもしれません。(そこは各自のスタンスだと思います) ちなみにAmazon USだと89USDくらいで買えました。日本で買うと安くても倍くらいします。 それからQNAPのサポートは最初の応答まで2日ほど、その後は1日に1~2回のやり取りでした。 ただ、今回はSSDがサポート対象外だったこともあり、「よくわかりませんねぇ」って感じの対応でした。 QM2単体(SSDを装着しない状態)でQM2が正常に動作しているか確認する方法を聞いてみましたが期待するような回答は得らませんでした。 正常に認識されると下記の画像のように[コントロールパネル]-[システムステータス]-[ハードウエア情報]にQM2の情報が表示されます SSDはQNAPの互換性リストには掲載されていませんでしたが私の環境では使用できました。 ↩ 通常、サードパーティ製のPCIe-NVMeアダプタを使った場合ファイルストレージとしては使用できませんが、これを応用すればQM2以外のアダプタ(Amazonで1000円未満で買える)を使ってもファイル保存用に使えちゃいますね。動作保証されないしOSの更新時にfstabとかも書き換えられてしまうかもしれませんが…。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Linux]VirtualBoxの仮想マシンにCentOS 7を実装する時に発生する不具合

環境 ホストOS ・macOS Catalina 10.15.7 ゲストOS ・CentOS 7 https://www.centos.org/ 仮想化ソフトウェア ・VirtualBox 6.1.14 https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html 1.インストールエラー 起動の度にCentOSのインストールを求められる不具合です。 本来ならば最初の設定の時だけに出てくるはずなのですが、これが起動の度に出現します 対策 Cancelで進んでもInstall選択画面が出てきてしまい明らかに宜しくない挙動なので解決していきます このエラーへの対応はVirtualBoxマネージャーの[設定]>[システム]で上記の画面に遷移し [起動順序]のハードディスクを光学よりも上に配置する事で解決します 起動の時点でディスクを読み込む設定になってしまっているため、そこからOS情報が得られないため発生するエラーだと思われます 2.予期しない終了 もう一つは起動時にエラー文が表示され、[再度開く]を選択するとさらにエラー文が表示される不具合です 上記の画面が出てきて 再度開くを選ぶとさらにエラー文が表示され、仮想マシンが全く起動できない 対策 このエラーはVirtualBoxマネージャー>[設定]>[オーディオ]で 上記の画面に遷移し[オーディオを有効化]をオフにして起動するとエラーを回避する事ができます 参考記事 インストール不具合 https://qiita.com/tochisuke221/items/0ff216d9eb9ab7783129 起動不具合 https://forums.virtualbox.org/viewtopic.php?f=8&t=99762
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Linux]grepコマンドと正規表現

はじめに "新しいLinuxの教科書"にてLinuxの勉強をしています!! せっかくなので、こちらにアウトプットしながら勉強を進めていきます! grepコマンド grepコマンドはファイル名から検索パターンに一致する行を出力する。 terminal % grep [オプション] <検索パターン> <ファイル名> オプションには以下のようなものがある。 オプション 意味 -n 行番号付きで表示する -i 大文字小文字の区別なく検索する -v 指定した検索パターンを含まない行を検索する 基本正規表現 正規表現とは、条件に合致する文字列集合を表現するための記法。 ^,*(ワイルドカード) ^は行の先頭を意味する。*は任意の文字列を示す。なお、正規表現を使用の際は、基本的には''で囲んで指定する。 terminal % grep '^test-*' score.txt test-subject test-score test-averagescore .(ドット) .(ドット)は任意の一文字にマッチする。 terminal % grep 't.st' example.txt test.japanese test.math また、これを組み合わせると、以下のような検索の仕方も可能となる % grep 't..t' example.txt test toet taat ちなみに、.orgを検索パターンに置いた場合は、borgもヒットするし、~.orgもヒットする。つまり、単純なドットとしてもカウントされて、検索結果が表示される。それではうっとおしいため、単純に、「.org」という文字列のみ検索したい場合は、直前に\を置いて、エスケープさせてやります。 terminal % grep '\.org' example.txt []で特定文字の指定 []を使用すると特定の文字が使用できる % grep 't[ef]st' example.txt test tfst [^]を使用する場合は、[]に含まれない一文字がマッチします terminal % grep 'mail[^13]' example.txt mail13以外がヒット ^,$で位置を示す ^は行頭を示し、$は行末を示す。 terminal % grep '^net' example.txt netapp.cpm netshop.txt terminal % grep 'net$' example.txt qiita.net trend.net 繰り返しの* 繰り返しの*は、直前の文字が0回以上存在するときマッチする。 grep % grep 'B[ea]*r' drink.net Br Beeeeer Baaaaar Beaeear 拡張正規表現 -Eオプションを使用すると、拡張正規表現として解釈されます。 + +は*に似てますが、直前の文字が0文字の場合は許容しません。つまり、直前の文字が1回以上繰り返される場合に使います。 ? ?は直前の文字が0回または1回の繰り返しのとき、マッチします。 terminal % grep -E 'Wine ?Wine' drink.txt WineWine Wine Wine {m,n}で繰り返しを指定 {m,n}は、m回以上n回以下の繰り返しを意味します。 terminal % grep -E 'Be{1,2}r' example.txt Ber Beer BeerBeer BerBeerBer こんな使い方もあります。 (Beerをもつ文字列のみ欲しいとき) terminal % grep -E 'Be{2}r' drink.txt Beer BeerBeer ちなみに、{4,}とすると4回以上の繰り返しにマッチします。 ()で正規表現をグループ化 Wineとう単語の繰り返し文字列を探したいとき、以下のようにします。 terminal % grep -E '(Wine){2,}' drink.txt WineWine WineWineWine |でOR表現 どちらかに当てはまらせるときはこんな感じです terminal % grep -E 'My (Wine|Vodka){2,}' drink.txt My Wine My Vodka おわりに 正規表現について感簡単にまとめてみました。 もっと応用部分についても学習しないといけませんね!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む