CentOS7でデフォルトログインをCUIにする

CentOS7などのsystemを利用するOSでデフォルトログイン方法をCUIに変えるにはディスプレイマネージャを無効にすればよい。

環境

[root@localhost updates]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 

状態の確認

サービスの有効化を確認(2通り)

[root@localhost updates]# systemctl list-unit-files | grep gdm.service
gdm.service                                   enabled 
[root@localhost updates]# systemctl is-enabled gdm.service
enabled

サービスの起動状態を含めて確認

[root@localhost updates]# systemctl status gdm.service
● gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-05-06 10:26:23 JST; 2h 32min ago
  Process: 1013 ExecStartPost=/bin/bash -c TERM=linux /usr/bin/clear > /dev/tty1 (code=exited, status=0/SUCCESS)
 Main PID: 934 (gdm)
   CGroup: /system.slice/gdm.service
           ├─ 934 /usr/sbin/gdm
           └─1042 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /r...

May 06 10:26:23 localhost.localdomain systemd[1]: Starting GNOME Display Manager...
May 06 10:26:23 localhost.localdomain systemd[1]: Started GNOME Display Manager.
May 06 10:27:40 localhost.localdomain gdm[934]: Child process -2639 was already dead.

デフォルトのGDM(GNOME Display Manager)が有効になっている。

設定変更

サービスの無効化

[root@localhost updates]# systemctl disable gdm.service
Removed symlink /etc/systemd/system/display-manager.service.

サービスが無効なことを確認(2通り)

[root@localhost updates]# systemctl list-unit-files | grep gdm.service
gdm.service                                   disabled
[root@localhost updates]# systemctl is-enabled gdm.service
disabled

サービスの起動状態も含めて確認

[root@localhost updates]# systemctl status gdm.service
● gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
 Main PID: 934
   CGroup: /system.slice/gdm.service
           ├─ 934 /usr/sbin/gdm
           └─1042 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /r...

May 06 10:26:23 localhost.localdomain systemd[1]: Starting GNOME Display Manager...
May 06 10:26:23 localhost.localdomain systemd[1]: Started GNOME Display Manager.
May 06 10:27:40 localhost.localdomain gdm[934]: Child process -2639 was already dead.

GDMが無効化された。 なおこの時点では起動しているGDMGUIが停止するわけではない(GUI表示のまま)。

再起動(reboot)するとCUIログインに切り替わる

その他

なお、rebootコマンドはLinux以外のUnixだと危険なコマンドらしい。

Linuxについては、Man page of SHUTDOWNにあるように、rebootはshutdown -r -q nowのエイリアスです(シェルのエイリアスというわけではなく、内部でshutdown -r -q nowを呼び出しているだけと言うこと)。shutdownと同じくinitシステムを6に切り替えるため、サービスを順番に落とし(最新のLinuxではsystemdやupstartが採用される場合が多いですが、同じように順番にサービスを落とします)、再起動を行います。サービスが依存関係に基づいた安全な順序でおとされ、各終了処理も実行されますので、shotdownを使う場合と同じく、安全に再起動が可能です。

しかし、LinuxではないUNIXでは違います。次の二つを見てください。

FreeBSD 11.0 | On-line Manual of “reboot

Solaris 11.2 | reboot - マニュアルページセク ション 1M: システム管理コマンド  

FreeBSDSolarisでは、shutdownへのエイリアスででも呼び出す物でもありません。これらのrebootでは、initシステムの切り替えが発生せず、全てのプロセスに対して終了シグナルを送るだけです。サービスの終了順序は守られませんし、initスクリプトに記載された終了時の処理も行われません。そのため、サービスによってはテンポラリファイルやPIDファイルが残ったり、エラーが記録されたり、最後の情報が書き込まれなかったり等の不具合が起きる可能性があります

出典:Linux - shutdownコマンドとrebootコマンドの違いについて(56240)|teratail

CentOSでyum update時に”Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast”というメッセージが出たときは素直に「yum makecache fast」しましょう

長いので結論だけ先に書くと

  1. CentOSyum update時に”Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast”というメッセージが出ることがある

  2. これはyumのキャッシュデータ*1が古くなって失敗している。

  3. yum claen allしろというサイトもあるが、エラーメッセージの通り、素直にyum makecache fastしましょう

本論

案件が変わってちょっと自宅で自習したくなり、昔に作ったCentOSVMをアップデートしようとしたら以下のメッセージが出た

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

ググってみるとyumのキャッシュの問題らしく、キャッシュをyum claen allしてクリアすればよいらしい。

で、実際にyum claen allしてからyum updateすると無事にアップデートはできた。

が、しかし、メッセージをよく読むとyum makecache fastしろって書いてある*2。 そこでちょっとmanを読んでみる(長いので読み飛ばしてもOK)。

yum(8)                                                                  yum(8)

NAME
       yum - Yellowdog Updater Modified
(中略)
       clean  Is  used  to clean up various things which accumulate in the yum
              cache directory over time.  More complete details can  be  found
              in the Clean Options section below.

       makecache
              Is  used  to  download  and make usable all the metadata for the
              currently enabled yum repos. If the argument "fast"  is  passed,
              then  we just try to make sure the repos. are current (much like
              "yum clean expire-cache").

(中略)

CLEAN OPTIONS
       The following are the ways which you can invoke yum in clean mode. Note
       that "all files" in the commands below means "all  files  in  currently
       enabled  repositories".   If  you  want to also clean any (temporarily)
       disabled repositories you need to use --enablerepo='*' option.

       yum clean expire-cache
              Eliminate the local data  saying  when  the  metadata  and  mir‐
              rorlists  were  downloaded  for  each  repo. This means yum will
              revalidate the cache for each repo. next time it is  used.  How‐
              ever  if  the  cache  is  still  valid,  nothing significant was
              deleted.

       yum clean packages
              Eliminate any cached packages from the system.  Note that  pack‐
              ages are not automatically deleted after they are downloaded.

       yum clean headers
              Eliminate  all  of  the  header files, which old versions of yum
              used for dependency resolution.

       yum clean metadata
              Eliminate all of the files  which  yum  uses  to  determine  the
              remote  availability  of  packages. Using this option will force
              yum to download all the metadata the next time it is run.

       yum clean dbcache
              Eliminate the sqlite cache used for faster access  to  metadata.
              Using this option will force yum to download the sqlite metadata
              the next time it is run, or  recreate  the  sqlite  metadata  if
              using an older repo.

       yum clean rpmdb
              Eliminate any cached data from the local rpmdb.

       yum clean plugins
              Tell any enabled plugins to eliminate their cached data.

       yum clean all
              Does all of the above.

とても雑にまとめると以下の表のとおり。 yum clean allは余計なキャッシュデータも消してしまっているので、yum makecache fastを使ってキャッシュを更新する方が好ましいのだと思う。

# コマンド 説明
1 yum clean all 現在利用可能なレポジトリの
すべてのキャッシュを削除する*3
2 yum makecache fast 現在利用可能なレポジトリを確認して
キャッシュの一部を更新する*4

その他

manを読んでyumの正式名称を初めて知った Yellowdog Updater Modified - Wikipedia

*1:デフォルトは/var/cache/yum/$basearch/$releasever /。/etc/yum.confのcachedirで設定する

*2:気づくのが遅い

*3:利用不可能なレポジトリも削除する場合は–enablerepo=‘*'オプションをつける

*4:yum clean expire-cache相当ということはメタデータとミラーリスト?

Powershellの正規表現で桁数固定の文字列にマッチさせたいとき

とても基本的なことなのだが、ちょっとはまってしまったのでメモ。

Powershell正規表現で桁数固定の文字列にマッチさせたいとき、ちゃんと数値の前後の文字列もパターンに含めないと意図しない文字列にもマッチしてしまう

例えば、「test.NNN」(Nは0-9の数字)というパターンにマッチさせたいとき、

PS D:\> #これでいいかなーと思いきや
PS D:\> "test.005" -match "test.\d{3}"
True
PS D:\> #これもマッチしてしまう
PS D:\> "test.0005" -match "test.\d{3}"
True
PS D:\> "test.005.txt" -match "test.\d{3}"
True

防止するためには桁数指定をするときには必ず前後の文字列もパターンに加えるようにする

PS D:\> #不要なものをマッチさせないためには終端を示すメタキャラクタ($)を追加する
PS D:\> "test.0005" -match "test.\d{3}$"
False
PS D:\> "test.005.txt" -match "test.\d{3}$"
False
PS D:\> "test.005" -match "test.\d{3}$"
True

しょうもないんだけど小一時間ぐらい悩んでしまった。 ちゃんと睡眠をとった上で作業しよう。

Powershellで指定した行数でファイルを分割する

例えばカレントディレクトリのtest.txtを3行ごとにtest[N].txtに分割するときは以下のように書く(は任意の0以上の整数)

$i=0; cat .\test.txt -ReadCount 3 | % { $_ > test$i.txt;$i++ }

cat(=Get-Content)のReadCountオプションで3行ずつパイプラインに渡してファイルに出力している


なお、上記のようにすっきりかけるようになるまでには以下のような変遷を経てる

一番最初

良く分からないのでファイルをエディタで開いたときの行番号表示から、ファイル数を別途計算し、その上でマジックナンバーを多用しつつGet-Contentの行数指定で愚直に切り出す。

0..3 | %{ (cat .\test.txt)[($_ * 3)..($_ * 3 +2)] > test$_.txt}

行数ぐらいPowershellで計算できるだろと思い至り、$lines行づつ分けたときのファイル数をまず出してからGet-Contentを使って毎度指定行を読み込んでファイル出力してる

$lines = 3
$maxCount=[Math]::Ceiling($(cat .\test.txt | measure).count / $lines) - 1 
0..$maxCount | %{ (cat .\test.txt)[($_ * $lines)..($_ *$lines +2)] > test$_.txt}

ReadCountオプションは便利ですね。

PowershellでWunderListのAPIを触ってみる(新刊.netのRSS Feedを利用して本をWunderListに登録する)

環境

Invoke-RestMethod と ConvertTo-Json が必要なのでPowershell v3.0以降で動くはず

前準備

Authorization | Wunderlist Developerに従って以下のことをしておく

  1. WunderListへのアプリケーションの登録
  2. Web Server Application Integrationに従って、アカウントの認証設定のうえ、codeを入手しておく

実際にやってみる

今回は新刊.netrssフィードを利用して、ほしい本(とその著者)をWunderListのInboxに投入する。 ConfigとBookList Feedには環境に応じた値を入れること。

# Config
$conf=@{client_id = "CLIENT ID"; client_secret = "SECRET"; code = "CODE"}
$list_id=ID # Inbox id (integer) 

# Object to convert to json for create task api
$task=@{list_id = $list_id ; title = "";}

# BookList Feed
$source = "http://sinkan.net/?action_rss=true&uid=12345&mode=schedule&key=hogehoge";

# Get access token
$headers = @{"X-Access-Token"=""; "X-Client-ID"=$conf.client_id; "Content-Type"="application/json" }
$body = $conf | ConvertTo-Json
$headers.'X-Access-Token' = $(Invoke-RestMethod -Method Post -Uri "https://www.wunderlist.com/oauth/access_token" -Body $body -Headers $headers).access_token

#Get NewBookList and Create tasks into Inbox
Invoke-RestMethod $source | % { 
    $task.title = $($_.title.'#cdata-section' +  "/" + $_.creator.'#cdata-section') ; $task } | % {
      ConvertTo-Json $_ } | % {
        $body=[System.Text.Encoding]::UTF8.GetBytes($_); $_ } | % { 
          Invoke-RestMethod -method POST -Uri "a.wunderlist.com/api/v1/tasks" -Headers $headers -Body $body } 

メモ

  • 自分ひとりで使うなら、登録時のアプリのURLやリダイレクトURLはテキトーで良い。
  • リクエストのヘッダの仕様などはAuthorization | Wunderlist Developer参照
  • Invoke-RestMethodさえ使えればあまり難しくはない、かと思いきや日本語の書名が文字化けしてとても苦労した。結局、せっかくだからおれはこのInvoke-RestMethodをつかうぜ | たっぷす庵を参考にさせてもらって、JSONごとByte配列にしてリクエストに突っ込んだがもっとうまい方法はあると思う。
  • JSONをByteにするところで、パイプの入力オブジェクトを出力しているのは、後続のパイプでもともとの入力だった$taskの数だけ後続の処理をするため。これをしないとByte配列の要素数分、後続のパイプの処理が実行されてしまう。
  • 上記のコードはAPIを呼び出す部分と、API用のパラメータを作る部分に関数なりで分割した方がきれいなのだと思うが、かき捨てのコードなのでそこまでしてはいない
  • はじめて認証付きのAPIを触ったのだが、意外と簡単だった。
  • パイプを多用したので、ErrorActionをうまく使ってtry-catchなりtrapしてやらないとエラーが拾えなさそう。
  • list_idは以下のようなAPIで取得できる
Invoke-RestMethod -method GET -uri "a.wunderlist.com/api/v1/lists" -Headers $headers

Windowsでオープン拡張辞書を利用して改行を含む文字列を辞書登録する

WindowsIMEに複数行の文字列を登録したい場合は、オープン拡張辞書を作成する。 Microsoftから配布されているオープン拡張辞書を作成するためのエクセルファイルを利用して作成できる。 ただし、一部制限事項はあるので注意が必要。

ダウンロードとインストール

  1. Download Microsoft Office IME 2010 オープン拡張辞書作成用 Excel テンプレート from Official Microsoft Download Centerからテンプレートをダウンロードする
  2. ダウンロードしたファイル内のsetup.exeを実行し必要なツールをインストールする

使い方

  1. ダウンロードしたファイル内のIME Open Extended Dictionary Builder.xltxを開く
  2. 画面右の作業タブで入力中によみを自動入力のチェックをはずす
  3. 内容を記入する([変換後の文字列]にALT+ENTERで改行入力できる)
  4. 画面右の作業タブで辞書の作成ボタンを押す

注意点

  1. [変換後の文字列]には字数制限があるようで、長い言葉は登録できなかった
  2. [変換後の文字列]内の改行はCRとなるので、メモ帳では反映されない
  3. Windows10ではOfficeIMEを導入できないので、辞書生成前のエラーチェックができない(実際に辞書を作ってから取り込んでみるしかない)
  4. こちらによると[変換後の文字列]に;(セミコロン) を2回使用することはできないようだ

その他

ユーザー提供のオープン拡張辞書:TechNetフォーラム内にあるユーザーが作成したオープン拡張辞書公開のためのページ

Download Microsoft Office IME 2010 オープン拡張辞書作成用 Excel テンプレート from Official Microsoft Download Center:Microsoftダウンロードセンターで公開されているオープン拡張辞書を作成するためのExcelテンプレート

Microsoft Office IME 2010 オープン拡張辞書 | Microsoft Office IME 2010 | Microsoft Office 2010:Microsoftによるオープン拡張辞書の概要

辞書登録で複数行(改行)の入力をしたい! - gooブログはじめました!