さもしのブログ

Ruby界隈のことを書いていきます

VM + CentOS6の環境変数をいじっていて、ゲストOSにログインできなくなったときの治し方

pathや環境変数まわりをいじっていると、コマンドが実行できなくなり、ログインも出来なくなってあせったので、同じような症状の方のためにメモを残しておきます。

経緯

windows上のvirtual boxでcentosを動かし、tensorflowのチュートリアルをやろうと思っていました。

すでにanacondaでpythonはインストール済みで、あとはtensorflowをインストールするだけ♪のはずでした、、、

しかし、「pyenvとanacondaのactivate衝突問題」というものがあるらしく、私もこの問題に引っかかってしまいました。

その中の解決法の一つに、「pathへanacondaのインストールpathを書き込む」という方法がありました。

その時のコマンド(実行しないでください)

$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
source ~/.bash_profile

を実行してみると・・・

症状

なぜかlsコマンドが出来なくなってる(コマンドが見つかりませんと出る)!

そこで、またいろいろ解決法を探していると、一旦ログアウトすれば大丈夫というのを見つけました。

これまでも、centosの調子が悪かったら、ログアウトかシャットダウンをすると治っていたので、今回もそんな感じだろうと思っていました。

しかし今回は、ログインも出来なくなってしまいました。ログイン画面は表示されるが、パスワードを入れてログインすると、またログイン画面に戻ってくる。

鈴木奈々風に)「すごく焦った。すごく焦った。」

たまたまプロジェクトがリリース前で、やることが無く少なかったので、助かりましたが。

治し方

いろいろ調べて、こうしてブログもかける様になりました。以下解決法です。

  1. まず、ログイン画面のところで、Ctrl + Alt + F2(環境によってはF1?) を押します。すると、コマンドラインが表示されてログイン出きるようになるので、ログインします。
  2. コマンドライン$PATHと入力して、環境変数を確認します。私の場合は、ここがおかしくなっていました。
  3. 次のコマンドで環境変数を設定し直します。するとls等のコマンドが使えるようになるはずです。 export PATH="$PATH:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"

  4. 次のコマンドで ~/.bashrc, ~/.bash_profile を削除します。 rm ~/.bashrc ~/.bash_profile

  5. centosを再起動してログイン画面からログインします。

参考

以下のブログに助けられました。ありがとうございます。

Linuxの環境変数PATHをいじっていて、lsを実行するとcommand not foundになってしまった。 - farundorLog

http://pocketstudio.jp/linux/?%A5%D1%A5%B9%28PATH%29%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9

以上。

追記

シェルの変更 2017/4/12

上記の手順後シェルが/bin/bashになっていました。現在のシェル確認コマンドはecho $SHELLです。

以前のシェルtcshだと、[railsdev@os名:カレントディレクトリ]となっていて分かりやすかったので、デフォルトで使うシェルをtcshへ戻す手順を書いておきます。

  1. シェルの一時的な変更はそのままシェルの名前(tcsh)をコマンドみたいに入力するだけです。 戻るときは exitで元のシェルに戻ります。
  2. デフォルトシェルに設定するにはchshコマンドを使います。
bash-4.1$ chsh
railsdev のシェルを変更します。
パスワード:
新しいシェル [/bin/bash]: /bin/tcsh
シェルを変更しました。

.bashrc, .bash_profileの復元 2017/4/13

スナップショットを取っていなければ0から書いていくことになります。基本的な内容は以下の通りだと思います。

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functionsse
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

export PATH=$PATH:$HOME/.local/bin:$HOME/bin

シェルがcsh系だとexportコマンドが使えないようなので、bashコマンドでシェルをbashにしておきます。

source .bashrc

で内容を読み込みます

昨年度の振り返り。経験したこと、勉強したこと

今年度で、社会人3年目に突入しました。

ここで一度、昨年度に勉強したことや、業務で体験したことを振り返ってみたいとおもいます。

【目次】

言語、フレームワーク

RubyRails

2016年の1月から本格的に業務でRuby on Rails開発が始まりました。

研修でも少しコードを書いたのですが、これが趣味以外で行う初めてのコーディングになります。

Rubyはほとんど初心者で、以下の書籍で勉強しました。

メタプログラミングRuby

メタプログラミングRuby

メタプログラミングRubyRubyに慣れてきたころ(2017年の1月中頃ぐらい)から読み始めました。とても楽しく読めました。メタプログラミングを知らなかったら、Rubyの本当の楽しさを知らないまま、機械学習pythonにもっと時間を費やしていたと思います。

Railsは以下の書籍とドットインストールで勉強しました。

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

初めてのwebアプリケーション開発ということもあって、まずgetとかpostって何?から始まりました。

勉強し始めのころは、通勤時間を使って、ドットインストールの動画を3周ぐらい見てRailsの文法になれていきました。

その後、Rails本のscaffoldの章を読み込んで、一覧、登録、更新、の基本的な処理の流れを理解しました。

jQuery

jQueryもほとんど初心者で、開発が始まってからは、他のメンバのコードを真似して書いていました。2017年1月からプロジェクトが代わり、しっかりjQueryを書く機会がありました。

jQueryのコードが多く、複雑になるにつれて、検索したコードや真似したコードを貼っているだけでは、実装やバグ修正に時間がかかり、目に見えて生産性が悪くなってきました。

そこで、業務の合間や休憩時間にW3Scoolsというサイトで勉強しました。

W3Scoolsは本当に分かりやすい。jQueryだけでなく、cssも勉強しました。英語のサイトなのですが、英語の勉強も兼ねて頑張って読みました。少しは慣れたかな~

python

2017年1月、最近話題になってる機械学習勉強したいなー、先にpythonを勉強した方がいいのかなーと思っていた時に以下の本を見つけました。

機械学習pythonが同時に勉強できて、オライリーのカレンダーも付いてくる、というのが決め手だったと思います。

内容も本当に面白いと思いました。2章のパーセプトロンの話は、最初機械学習と関係があるのかなと懐疑的でしたが、後に続くニューラルネットワークの章を読むときに理解を助けてくれました。

普段Rubyを使っていると、pythonでは引数がないメソッドも丸括弧を書かないといけないとか、endがないとか、最初は抵抗もありましたが、ベクトルの演算が直感的にかけていいなーと思いました。

endを書かないのも、慣れるとマークダウンみたいでいいですね。pythonの練習で書いたコードを元に、qiitaにpythonの記事を書いてみました。qiita初投稿です。

概念・思想・設計

機械学習

pythonのところでも書きましたが、ニューラルネットワークディープラーニングを勉強しました。

「畳み込み」のところはまだちゃんと理解できていないですが、ニューラルネットワークについてはよく理解できました。1周目は本を読んだだけですが、2周目からは実際にコードを書いて読み進めたいと思います。

まだ全然厳密に理解できていないですが、ニューラルネットワークディープラーニングを勉強して感じたことを書きたいと思います。

  • ニューラルネットワークアルゴリズムは、学習フェーズを通して、そのアルゴリズム独自の観点で物事を判断する。そういう意味で機械学習
    • 例えば、数字(0~9)を画像から判断する問題を考えるとする。私は私の基準でこれは1だとかこれは7だとか判断する。
    • ニューラルネットでは、画像データと回答(その画像がどの数字を表しているのか)を元に、独自の判断基準を形成していく。
    • 形成の仕方は、逆誤差伝搬方だと、間違った画像と回答の組に合わせて自分の判断基準を更新していく。人間のテスト勉強と似ている
  • 学習データが大量に必要なので、IOT・ビッグデータと相性が良さそう
  • これからもっと深く勉強していくには、数学が必要になってくる。楽しい

テスト駆動開発(TDD)

2017年1月からプロジェクトが変わり、テスト駆動開発を行う様になりました。プロジェクトのルールとしてTDDでやろう、というのはなく、勝手に始めてみました。

始めてみた理由は、テストがある程度かけるようになったことと、実装後にテストを書くと、画面上では動いているのにテストは落ちるというストレスがあったためです。

実際に行ってみると、ストレス無く開発を行う以上にいろいろとメリットがありました。以下にTDDをして感じたメリットをいくつか挙げてみます。

  • 実装を始める前に、これからこういうプログラムを書くんだ!と、自分の中で整理ができる。
  • プログラムの細かな仕様を決めてから書き始められるため、あとで、こういうバグにも対応しなくちゃという小さな後戻りが無くなる。
  • 実装中、どこでバグが起きているのかが、テストを実行してみると早く良くわかる。サーバ再起動とかしなくていい。

TDDはやってよかったと思うし、これからもTDDをしようと思います。

でも、たまにテストより前に実装をしてしまうときが。。。

その他・検定試験

文章の書き方

社会人2年目になって、後輩が入ってきたことや、ブログやqiitaへの投稿を始めてみて、分かりやすい文章を心掛ける様になりました。あと、同じチームの先輩の日本語が分かりにくすぎて、自分はちゃんと理解できる文章を書こうと思ったことも理由の一つです。

以下のようなことを気にしながら文章をかいています。

  • 「~だが、」や「~ので、」等はできるだけ使わず、文章は「。」で区切って書く様にする
  • 「~の~の」のように同じ助詞は繰り返し使わない
  • 自分の感想意外では、「~と思う」などの曖昧な表現を使わない。

統計検定

統計検定2級に合格すると、会社から報奨金がもらえるということを知り、受験しました。あ、合格しました。

風の噂で、報奨金の額が下がるということを聞き、2016年の最終試験日12月24日に池袋のコンピュータ学校で受験しました。

多分思い立ってから受験まで1ヶ月無かったと思いますが、お金のために、子供が寝てから遅いときで2時ぐらいまで勉強していました。

受験、勉強をしてみて思うことは、「演習大事」ということ。学生のころは教科書の章末に付いている演習問題を解くのが嫌いで、飛ばしていました。ですが、演習問題を解くと、自分が別っていないところがよくわかるし、なにより理解が早くなります。一通りの演習を短期間でやるには以下の本がとてもよかったです。

新確率統計問題集

新確率統計問題集

この本を一通りやって、特に苦手なところと、はじめにやって忘れてそうなところだけ、もう一度練習し、あとは公式の問題集を解きました。

日本統計学会公式認定 統計検定 2級 公式問題集[2013〜2015年]

日本統計学会公式認定 統計検定 2級 公式問題集[2013〜2015年]

ただ、本番の試験では上記の本だけでは一回も出てこなかった用語があり、まったく解けなかったので、少し前の問題集も使うことをおすすめします。

日本統計学会公式認定 統計検定 2級 公式問題集[2011〜2013年]

日本統計学会公式認定 統計検定 2級 公式問題集[2011〜2013年]

簿記3級

2017年から参加したプロジェクトでは、会社のICT資産を扱うため、会計用語をちらほら見かける様になりました。用語を少し調べるだけで業務上は充分だったのですが、ちゃんと会計を勉強しようと思い、簿記3級を受けてみることにしました。

ちなみに試験は2017年6月11日なので、このエントリーを書いているときはまだ受験申し込みすらしていません。

簿記の勉強は以下の書籍でやっています。

3級商業簿記〔平成29年度版〕 (【検定簿記講義】)

3級商業簿記〔平成29年度版〕 (【検定簿記講義】)

丁寧にやさしく説明されている教科書ですが、勉強し始めのころはとても難しく感じました。

攻略法とまでは行かないですが、これを中心に勉強したらいいんじゃないかと思うところを書いておきます。

  • 「資産」、「負債」、「資本」、「収益」、「費用」がそれぞれ増減したときに、仕訳のどちら側に書くのか
  • 各勘定が上記5つのいずれに分類されるのか
  • 決算手続き
  • 仕訳からの転記手順
  • 財務諸表の読み方

最後に、会計の勉強を始める前に、読んでよかったなと思った書籍を紹介します。

女騎士、経理になる。 (1) (バーズコミックス)

女騎士、経理になる。 (1) (バーズコミックス)

女騎士が簿記の知識を使って世界を変えるという風変わりな漫画です。勇者と税務官?との駆け引きも必見です。

今のところ4巻まで出ています。「くっ、殺せ」が面白い。次巻が待ち遠しいです。

本当にやさしかったです。物語になっているのでサクサク読める。物語自体も面白いです。そして、衝撃のラスト?!

git初心者のための、安全できれいなgit push

私がいつも行っているgit pullからgit push までの手順をまとめたいと思います。 対象のソースコードruby on railsでminitestを使っている想定ですが、途中実行するテストコマンド以外は他の言語、フレームワークでも同様の手順で大丈夫です。

  1. git pull

  2. git branch ○○

    • 作業ブランチを切る
  3. git checkout ○○

    • 作業ブランチへ移動する
  4. 作業 + テスト + コミット

    • 編集作業をして、rake testでテストの実行をし、テストが通ることを確認する。
    • git add .
    • git commit
  5. git checkout master

    • 作業中に変更されたソースを取り込むために、一旦masterへ移動
  6. git pull

    • 最新のmasterを取得
  7. git checkout ○○

    • 作業ブランチへ移動
  8. git rebase master

    • rebaseして自分の変更が先頭になるようにする
    • masterへ移動してからgit pullしてもいいけど、マージコミットが残るとあまり綺麗じゃないので先にrebaseをしておく
  9. git checkout master

    • masterへ移動
  10. git merge ○○

    • 作業ブランチをmasterへマージする
    • 先にrebaseしているので何事もなくマージできるはず
  11. rake test

    • push前の最終確認
    • jenkins等のCIツールを使っている場合は、CIツールのテストでこけないように最終確認をしておく
  12. git push origin master

    • リモートへpushする
    • このときリモートのmasterが既に更新されていたら、git reset –hard HEAD~でmergeを取り消し、手順6へ戻る

かなり面倒くさいですが、gitを使い始めの時はイレギュラーなことが起こるとパニックになり時間もかかってしまうので、なるだけ安全に行うのが最速の方法です。

メタプログラミングで遊んでみた(1)

メタプログラミング

メタプログラミングRuby

メタプログラミングRuby

を読んで遊んでみたくなった。 また同じタイトルで書くことがあるかわからないけど、とりあえず(1)を付けてみた。

eachに名前を付けてみる

例えば以下のようなコード

array = [1, 2, 3, 4, 5]
array.each do |n|
  p n * 2
end

処理の中身を見ればeachの中で何をやっているか分かるけど、もっと複雑になると分かりにくい。 そこで、method_missingを使えば、「~をするeachですよ」という書き方が出来そうだったのでやってみた。

class Array
  def method_missing(name, &block)
    if !block.nil? && name =~ /^each_/
      each{|i| block.call(i)}
    else
      super
    end
  end
end

のようにmethod_missingメソッドを改造すると、以下の用に使える

array = [1, 2, 3, 4, 5]
array.each_multiple_for_3 do |n|
  p n * 3
end

=>
3
6
9
12
15

eachを実装してみる

blockについても詳しく書いてあったので、練習ついでにeachメソッドを自力で実装してみた。 yieldを使っていないのは、明示的に引数であるということが書いてある方が好みだから。

class Array
  def each(index: 0, &block)
    p "in each method"
    return if index == self.size
    block.call(self[index])
    each(index: index.next, &block)
  end
end


array = [1, 2, 3]
array.each do |i|
  p i
end

=>
"in each method"
1
"in each method"
2
"in each method"
3
"in each method"

Hello World!

やっぱり最初はhello world!ですよね。

はじめまして

はじめまして、「さもし」と申します。 東京在住のwebエンジニアを目指す社会人です。 これから主にRuby, Ruby on Rails(+webの技術)に関する技術ブログを書いていこうと思います。

技術ブログを始めるきっかけ

きっかけは転職活動でした。 社会人2年目、プログラミング経験が1年程度なのですが、あわよくばテレワークで働きたいと思い、 転職サイトWantedly経由でいくつかのベンチャー企業へ応募しました。 書類選考はなく、お話を聞くことから始めたのですが、まず1社目の面談で技術的に答えられないことが多く、 2社目の会社からは面談後採用を見送る連絡をもらいました。 このとき自分のスキル、経験の無さを痛感し、まずは「プログラミング経験のある人」から「エンジニア」になることを決めました。

お時間をとっていただいた面談担当の方には感謝しています。 面談で聞かれたことは、今自分が知っていなければならないことなんだと思いました。

そのために、書籍やブログから知識を得ることはもちろん、アウトプットをもっとしていかなければと思い、技術ブログが多いHatenaBlogを始めました。

このブログで書くこと

  • 日々新たに発見したことや驚いたことを書いていきます。
  • たまにプライベートな内容をはさみます。
  • 新しく勉強したこと、読んだ本を紹介していきます。