systemctlするとFailed to get D-Bus connection: Operation not permittedがでる

dockerコンテナ内でsystemctl status httpdしたところ以下のエラーが発生した

[root]# systemctl status httpd
Failed to get D-Bus connection: Operation not permitted


そこでいくつかググッてみました。

DockerでCentOS7起動時にsystemctlが動かないとき

Failed to get D-Bus connection: Operation not permitted

どの記事にも共通するのはdocker run時に--privilegedをつける、最後の引数に/sbin/initをつける、ということ。

そこで、コンテナ起動時にオプションをつけますが、なんどやっても解決せず。。

sudo docker run -d --privileged -u $UID --rm --name t1 --hostname t1 centos-test:t1 /sbin/init


試行錯誤してみた結果、原因は-u $UIDとユーザ指定して起動していたためでした。 コンテナ起動時は指定したuserでloginし、su -でrootにloginし直して、systemctlしていましたが、これがよくなかったようです。

-u $UIDを外して、コンテナに最初からrootでloginしsystemctlしたところエラーはなくなりました。

sudo docker run -d --privileged --rm --name t1 --hostname t1 centos-test:t1 /sbin/init

carrierwaveで画像(リサイズ)と動画のアップロードを両立させる

Railsチュートリアルのサンプルアプリの拡張機能として、動画アップロードにも対応してみる


チュートリアルをまだ一周していないので寄り道になっていますが。。

まずはアップロード時のformの修正。file_fieldのacceptにvideoを追加します。

app/views/shared/_micropost_form.html.erb

<span class="picture">
  <%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png,video/*' %>
</span>


次に、PictureUploaderのextension_whitelistにも、動画の拡張子であるmp4を追加します。

app/uploaders/picture_uploader.rb

def extension_whitelist
  %w(jpg jpeg gif png mp4)
end


これで動画ファイルをアップロードすると、public/uploads/micropost/picture/(:micropost_id)にmp4ファイルが格納されるはずです。 あとはMicropost Feedにも動画が表示されるように修正を行います。 画像であればmicropost.picture.file.content_typeimage/*、動画であればvideo/*になるので、include?で判定します

app/views/microposts/_micropost.html.erb

<%= micropost.content %>
<% if micropost.picture? %>
  <% if micropost.picture.file.content_type.include?('image/') %>
    <%= image_tag micropost.picture.url %>
  <% else %>
    <%= video_tag micropost.picture.url, width: "30%", height: "30%", 
                  controls: true, autobuffer: true %>
  <% end %>
<% end %>



さて、これで動画を選択して、Postボタンを押したところ‥



なぜか失敗してる!!!

f:id:ken992:20180703235851p:plain


原因としては、picture_uploaderで画像のリサイズしてる処理が、動画に対しても適用したときに失敗するようです。
というわけで、画像のリサイズしている処理をコメントアウトして再度、動画のアップを試みました。

app/uploaders/picture_uploader.rb

# process resize_to_limit: [400, 400]


画像のリサイズ処理をコメントアウトして再度動画を登録

f:id:ken992:20180704001343p:plain

 動画の登録は成功!!

f:id:ken992:20180704001424p:plain


しかしリサイズされないため、画像を登録するとこんな感じになってしまいます。。

f:id:ken992:20180704002320p:plain



動画のアップロードと画像のリサイズアップロードを両立させるには?

色々ググっても全然わからず途方にくれましたが、readmeを読んでなんとかわかりました。

picture_uploadercontent_typeimage/の時だけ、リサイズ処理を行うように修正します。
これによって今までと同じ格納場所に、ファイル名の先頭にthumb_が付与されたファイルも保存されます。

app/uploaders/picture_uploader.rb

version :thumb, if: :is_thumb?

version :thumb do
  process resize_to_limit: [400, 400]
end

private
  def is_thumb? picture
    picture.content_type.include?("image/")
  end


あとはMicropost Feedの修正です。image_tagで指定するURLを micropost.picture.url(:thumb)に修正します。

app/views/microposts/_micropost.html.erb

<%= micropost.content %>
<% if micropost.picture? %>
  <% if micropost.picture.file.content_type.include?('image/') %>
    <%= image_tag micropost.picture.url(:thumb) %>
  <% else %>
    <%= video_tag micropost.picture.url, width: "30%", height: "30%", 
                  controls: true, autobuffer: true %>
  <% end %>
<% end %>


・・・無事、動画も画像(リサイズ)も登録できました

f:id:ken992:20180704005046p:plain

githubでcommitしても芝が増えない

githubのContributionsを眺めていた時にふと気づいた

あれ?なんか芝が少ないような・・

f:id:ken992:20171014125116p:plain

gthubを使って2ヶ月以上経ちますが、ようやく芝生の異変に気づきました。
特に最近2,3週ほどは全く芝が生えていない・・

2ヶ月以上経つのにまだrailsチュートリアルの9章までしか進んでいない体たらくではあるが、それにしてもcommitはもっとやってるはずだ!!


というわけで調べてみると、以下の2点がポイントのようです。
①コミットしたファイルがdefaultブランチであること
②localマシンとgithubに登録しているメールアドレスが一致していること


そこでまず、リポジトリの設定を確認すると・・
masterがDefaulBranchに設定されています。

f:id:ken992:20171014143659p:plain

ちなみにrailsチュートリアルは1章毎にBranchを切って章の終わりの時にmasterにmergeしているため、1章にかなり時間をかけてしまうとその間はずっと芝が更新されません。
なので『change defaut Branch』ボタンを押して、defaulブランチを9章の『advanced-login』branchに変更してみました。

f:id:ken992:20171014145218p:plain

無事に『advanced-login』branchがdefaultになりました。 f:id:ken992:20171014145448p:plain さあ、これで芝が生えまくっているはずなので確認してみると・・

ん??なぜか芝生の見た目は変わらず!!

さらにtestでcmmitしてみたがそれでも芝は何も変わらず。
これはさすがに異常事態なので困ってしまい、、念の為メールアドレスを確認してみることに。

まずはgithub
settingsのEmailsのタブです。 f:id:ken992:20171014150448p:plain

localマシン側
git config user.emailでメールアドレスを確認したが一致している。。 f:id:ken992:20171014130529p:plain

どうしようかと途方にくれたが・・

よく見ると

f:id:ken992:20171014152103j:plain

gmailのところがgmainになっていた。。
つまり今までlocalマシンからのコミットは全て反映されていなかったようです。

その割にそこそこ芝が生えていたのは、初期の頃はcloud9環境からもcommitを行っており、そちらは正しくメールアドレスの設定が行われていたためだったようです。

以下のようにメールアドレスを登録し直し。

git config --global user.email メールアドレス

testのcommitを行い再度確認

f:id:ken992:20171014152938p:plain

やっと芝が生えました!

rails consoleでsaveした日時がCTUで表示されてしまう

railsチュートリアルは相変わらず進まず

ようやく6章を確認中。
相変わらず進みが遅いです。。

railsチュートリアルの『6.1.3 ユーザーオブジェクトを作成する』はrails consleでデータモデルの更新を確認するチュートリアルです。
そこでこんな疑問が発生して止まっていました。(結局いまだよくわからず)

まず、現在の時刻の確認(タイムゾーンJST)

>> Time.zone.now
=> Tue, 12 Sep 2017 00:02:13 JST +09:00


User.newして

>> user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
=> #<User id: nil, name: "Michael Hartl", email: "mhartl@example.com", created_at: nil, updated_at: nil>


DBにuser.saveで保存(この時のcreated_atはJSTの時刻で登録されている)

> user.save
   (0.4ms)  SAVEPOINT active_record_1
  SQL (1.7ms)  INSERT INTO "users" ("name", "email", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["name", "Michael Hartl"], ["email", "mhartl@example.com"], ["created_at", "2017-09-12 00:05:13.647787"], ["updated_at", "2017-09-12 00:05:13.647787"]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true


しかし、userでレコードを確認するとCTUの日時になっている。(なぜ??)

>> user
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com", created_at: "2017-09-11 15:05:13", updated_at: "2017-09-11 15:05:13">


ちなみにrails cnsole時に–sandboxオプションを外して登録し、rails dbから直接sqllite3を確認したところ、JSTの日時で登録されていました。

rails consoleでレコードを確認するときだけCTUの時刻で表示されているらしい。なぜなのかいまだに謎。

railsチュートリアル

railsチュートリアルの進み具合

railsチュートリアルを初めて一ヶ月近く経ちますが、まだ5章の途中という芳しくない進捗状況。。
gitの使い方だったり、vimの使い方だったり、テンプレートファイルが気になったり、dotfile管理が面白くてはまったり、なぜかラズベリーパイが気になったり、、とrailaと無関係な所が色々気になって脱線しまくっていました。


railsチュートリアルでいまだ解決していない謎

かと言ってrailsチュートリアルそのものが順調だったかというとそんなことはなく、、 細かいどうでもいい所が気になり調べてしまって時間を費やしていました。勉強を進めていけばそのうち自然に解決するだろうと放置中でしたが、一つご紹介。

第2章 Toyアプリケーションの演習 2.3.3 ユーザーはたくさんマイクロポストを持っている 演習3

演習3
リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemail>が存在していることを検証してみてください (図 2.17)。

リスト 2.17はこちら

リスト 2.17: Userモデルに存在性のバリデーションを追加する
app/models/user.rb
 class User < ApplicationRecord
  has_many :microposts
  validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
  validates FILL_IN, presence: true    # 「FILL_IN」をコードに置き換えてください
end

FILL_INの答えはそれぞれ:name:emailです。
ただ、私はnameemailとシンボルを入れ忘れてしまいました。
そしてrails sした結果が以下。

f:id:ken992:20170826165740p:plain

3行目のvalidates name , presence: trueは通過して
4行目のvalidates email , presence: trueの箇所で
undefined local variable or method `email' for #<Class:0x005557fccf7a70>となっている。
なぜnameの箇所は通過してemailの箇所でエラーになるのか?

そこで3行目はnameのまま、4行目は:emailシンボルをつけて f:id:ken992:20170826171733p:plain

rails sしてみた。

f:id:ken992:20170826170532p:plain

するとエラーにならないでトップ画面は表示された!なぜnameの箇所はエラーにならないのか?

その後、画面上からNew Userを選択して、nameとemailのテキストボックスに値を入力後、Create Userボタンを押すと以下の画面が出て結局エラーにはなりました。

f:id:ken992:20170826171229p:plain

nameemailどちらもただの変数名だと思うのですが、なぜ挙動が違うんでしょう。 いまだによくわからず。。

一応、githubのRepositoryは以下です。
git clone -b question1 git://github.com/ken992/toy_app/

ubuntuの拡張ターミナルソフトウェアTerminatorで作業ログを自動保存する

Terminatorとは?

ubuntuの拡張ターミナルソフトウェアで以下の画像のように画面を簡単に分割して作業できます。ターミナルで複数画面を同時に表示できるため大変便利です。(インストール方法、操作方法はググると大量に情報が出てくるので省略)

f:id:ken992:20170826131123p:plain

作業ログの自動保存を試みる

いろいろとググッてみて解ったこと

  • ログの出力にはscriptコマンドを使う
  • OS起動時に自動で保存したい場合は~/.profileに設定する

今回は分割した画面毎にログを出力したいので~/.bashrcにこんな感じで設定してみました。

script  ~/log/term/`whoami`_`date '+%Y%m%d%H%M%S'`

PCを再起動して確認しようと期待したところ・・

デスクトップ画面が表示されない!!

こんな状態になってしまいプチパニック状態!

  • ランチャーも画面上部のツールバーが表示されない
  • GUI操作によるアプリケーション起動ができない
  • デスクトップの壁紙は表示されている

またまた調べて、こちらの方が似た事象だったので参考にして復旧しました。 m12i.hatenablog.com

  1. Ctrl+Alt+F1キー入力⇒コンソール画面に遷移。
  2. 「login:_」という表示されるのでログインユーザ名を入力しEnter(パスワードを聞かれたら適宜入力しEnter)。
  3. DISPLAY=:0.0 gnome-terminalと入力しEnter。
  4. Alt+F7キーを押下⇒デスクトップ画面に復帰し端末ウィンドウが表示される。
  5. /.bashrcを前回の状態に戻して保存する。
  6. sudo shutdown -r nowと入力してEnter⇒OSが再起動する。

原因は無限ループ

ここが参考になりました。 d.hatena.ne.jp

デスクトップ画面表示がおかしかった原因は無限ループらしい

scriptコマンドが起動するシェルも、さらにscriptコマンドを実行し、無限ループになってしまう

ついでにこのブログのscriptの設定をそのままパクって確認してみるもなぜかうまく行かず。。 しょうがないので、これを参考にして自分で作ってようやく解決しました。 ~/.bashrcに以下を追記すると分割画面毎にログを自動保存します。

#ログの自動採取
_LOGDIR="$HOME/log/term/"
_SCRIPT="script"
P_PROC=`ps aux | grep $PPID | grep $_SCRIPT |awk '{ print $11 }'`
if [ "$P_PROC" != "$_SCRIPT" ]; then
  script  `echo $_LOGDIR``whoami`_`date '+%Y%m%d%H%M%S'`_`echo $RANDOM|rev|cut-c 1-3|rev`.log
fi

まずノートPCを買う

webサービスを作りたい・・!

と思いたったので、とりあえずrailsというものをやってみることにした。

まずは常に作業できるように軽くて薄くて安いノートパソコンを探す。

 

中古でNECのUltraLite タイプVG <2013年5月発表>を購入。

発売当時は30万を超えていたっぽいので超お得だったかも。

値段:23,000円

外形寸法: 313(W)×209(D)×14.9(H)mm
質量(バッテリ含む): 約890g

jpn.nec.com

 

LINUXを インストール

windowsのボリュームを縮小して、ubuntu16.04をインストールする。

DVDドライブがついていないので、USBに起動ディスクを入れてインストールした。  

kledgeb.blogspot.jp

qiita.com

↑あたりが参考になりました。

その後にrubyrailsgithubなどなどをインストールして、『Ruby on Rails チュートリアル』を開始!!