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_type
がimage/*
、動画であれば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ボタンを押したところ‥
なぜか失敗してる!!!
原因としては、picture_uploaderで画像のリサイズしてる処理が、動画に対しても適用したときに失敗するようです。
というわけで、画像のリサイズしている処理をコメントアウトして再度、動画のアップを試みました。
app/uploaders/picture_uploader.rb
# process resize_to_limit: [400, 400]
画像のリサイズ処理をコメントアウトして再度動画を登録
動画の登録は成功!!
しかしリサイズされないため、画像を登録するとこんな感じになってしまいます。。
動画のアップロードと画像のリサイズアップロードを両立させるには?
色々ググっても全然わからず途方にくれましたが、readmeを読んでなんとかわかりました。
picture_uploader
でcontent_type
がimage/
の時だけ、リサイズ処理を行うように修正します。
これによって今までと同じ格納場所に、ファイル名の先頭に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 %>
・・・無事、動画も画像(リサイズ)も登録できました
githubでcommitしても芝が増えない
githubのContributionsを眺めていた時にふと気づいた
あれ?なんか芝が少ないような・・
gthubを使って2ヶ月以上経ちますが、ようやく芝生の異変に気づきました。
特に最近2,3週ほどは全く芝が生えていない・・
2ヶ月以上経つのにまだrailsチュートリアルの9章までしか進んでいない体たらくではあるが、それにしてもcommitはもっとやってるはずだ!!
というわけで調べてみると、以下の2点がポイントのようです。
①コミットしたファイルがdefaultブランチであること
②localマシンとgithubに登録しているメールアドレスが一致していること
そこでまず、リポジトリの設定を確認すると・・
masterがDefaulBranchに設定されています。
ちなみにrailsチュートリアルは1章毎にBranchを切って章の終わりの時にmasterにmergeしているため、1章にかなり時間をかけてしまうとその間はずっと芝が更新されません。
なので『change defaut Branch』ボタンを押して、defaulブランチを9章の『advanced-login』branchに変更してみました。
無事に『advanced-login』branchがdefaultになりました。 さあ、これで芝が生えまくっているはずなので確認してみると・・
ん??なぜか芝生の見た目は変わらず!!
さらにtestでcmmitしてみたがそれでも芝は何も変わらず。
これはさすがに異常事態なので困ってしまい、、念の為メールアドレスを確認してみることに。
まずはgithub側
settingsのEmailsのタブです。
localマシン側
git config user.email
でメールアドレスを確認したが一致している。。
どうしようかと途方にくれたが・・
よく見ると
gmail
のところがgmain
になっていた。。
つまり今までlocalマシンからのコミットは全て反映されていなかったようです。
その割にそこそこ芝が生えていたのは、初期の頃はcloud9環境からもcommitを行っており、そちらは正しくメールアドレスの設定が行われていたためだったようです。
以下のようにメールアドレスを登録し直し。
git config --global user.email メールアドレス
testのcommitを行い再度確認
やっと芝が生えました!
rails consoleでsaveした日時がCTUで表示されてしまう
railsチュートリアルは相変わらず進まず
ようやく6章を確認中。
相変わらず進みが遅いです。。
railsチュートリアルの『6.1.3 ユーザーオブジェクトを作成する』はrails consle
でデータモデルの更新を確認するチュートリアルです。
そこでこんな疑問が発生して止まっていました。(結局いまだよくわからず)
>> 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: 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
です。
ただ、私はname
とemail
とシンボルを入れ忘れてしまいました。
そしてrails s
した結果が以下。
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
シンボルをつけて
rails s
してみた。
するとエラーにならないでトップ画面は表示された!なぜnameの箇所はエラーにならないのか?
その後、画面上からNew Userを選択して、nameとemailのテキストボックスに値を入力後、Create Userボタンを押すと以下の画面が出て結局エラーにはなりました。
name
とemail
どちらもただの変数名だと思うのですが、なぜ挙動が違うんでしょう。
いまだによくわからず。。
一応、githubのRepositoryは以下です。
git clone -b question1 git://github.com/ken992/toy_app/
ubuntuの拡張ターミナルソフトウェアTerminatorで作業ログを自動保存する
Terminatorとは?
ubuntuの拡張ターミナルソフトウェアで以下の画像のように画面を簡単に分割して作業できます。ターミナルで複数画面を同時に表示できるため大変便利です。(インストール方法、操作方法はググると大量に情報が出てくるので省略)
作業ログの自動保存を試みる
いろいろとググッてみて解ったこと
- ログの出力にはscriptコマンドを使う
- OS起動時に自動で保存したい場合は
~/.profile
に設定する
今回は分割した画面毎にログを出力したいので~/.bashrc
にこんな感じで設定してみました。
script ~/log/term/`whoami`_`date '+%Y%m%d%H%M%S'`
PCを再起動して確認しようと期待したところ・・
デスクトップ画面が表示されない!!
こんな状態になってしまいプチパニック状態!
またまた調べて、こちらの方が似た事象だったので参考にして復旧しました。 m12i.hatenablog.com
- Ctrl+Alt+F1キー入力⇒コンソール画面に遷移。
- 「login:_」という表示されるのでログインユーザ名を入力しEnter(パスワードを聞かれたら適宜入力しEnter)。
DISPLAY=:0.0 gnome-terminal
と入力しEnter。- Alt+F7キーを押下⇒デスクトップ画面に復帰し端末ウィンドウが表示される。
/.bashrc
を前回の状態に戻して保存する。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
LINUXを インストール
windowsのボリュームを縮小して、ubuntu16.04をインストールする。
DVDドライブがついていないので、USBに起動ディスクを入れてインストールした。
↑あたりが参考になりました。
その後にruby、rails、githubなどなどをインストールして、『Ruby on Rails チュートリアル』を開始!!