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ブログはじめました!

Markdownでかっこをエスケープする

バックスラッシュ[]を使って特殊記号をエスケープできる。

誤:[Resolve\-DnsName](https://technet.microsoft.com/ja-jp/library/jj590781(v=wps.630).aspx)
正:[Resolve\-DnsName](https://technet.microsoft.com/ja-jp/library/jj590781\(v=wps.630\).aspx)

誤の場合は「~(v=wps.630).aspx)」の一つ目の閉じかっこでリンクが切れてしまう。