tail -f

tail -f でエラーログを見てみた

なんで tail -f を使ったのか?

PHP の勉強中に local 環境で PHP が実行できず、HTTP ERROR 500 を吐きまくっていたから。

HTTP ERROR 500 でググったら、PHP がうまく動かずにいるという記述があったので、

tail -f

MAMP 内の php_error.log のエラーログを見ることでどのようなエラーなのかを確認できる

f:id:crown_666:20180729012438p:plain

HTTP ERROR 500

tail -f とは?

tail -f : エラーログをリアルタイムで追うことができる。

・tail -> 対象のファイルの末尾10行を表示することができる。

・-f -> ファイルが更新されても常に追い続けてくれる。

結果・まとめ

該当箇所のディレクトリに移動し、以下のコマンドを実行。

tail -f php_error.log

以下のような結果を得ることができた。

hiratatakuyas-MacBook-Pro:logs takuyahirata$ tail -f php_error.log
[28-Jul-2018 18:09:55 Europe/Berlin] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 40
[28-Jul-2018 18:11:05 Europe/Berlin] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 40
[29-Jul-2018 01:13:06 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 40
[29-Jul-2018 01:13:52 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 45
[29-Jul-2018 01:13:55 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 45
[29-Jul-2018 01:14:04 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 45
[29-Jul-2018 01:14:51 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 45
[29-Jul-2018 01:15:51 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 45
[29-Jul-2018 01:16:57 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 43
[29-Jul-2018 01:20:10 Asia/Tokyo] PHP Parse error:  syntax error, unexpected '}' in /Applications/MAMP/htdocs/php10/lesson14/request1.php on line 43

ただの syntax error だったみたい。該当箇所のミスを書き換えていけば動くはず。

f:id:crown_666:20180729014039p:plain

動いた。サーバーサイドに問題があるのかと思ったりしていたけど、以外にタイポだった。

こんな感じの時に tail -f 使うんだ〜と学んだ。教えてもらうのも大切だけど、しっかり記憶に残るのは、何もプレッシャーに感じない環境で自由に開発/勉強している際に問題が発生した際に、教えてもらったことがあるものに出くわすとすんなり入ってくる。経験が大事だなーと感じた。習うより慣れろとはまさにこのことだ。

追記

またもエラーが出ていたので、調査した。MAMPで学習を進めているので、エラーログを見るためには、MAMPディレクトリに行く必要がある。

hiratatakuyas-MacBook-Pro:logs takuyahirata$ tail -f php_error.log
[01-Aug-2018 23:10:37 Asia/Tokyo] PHP Warning:  require_once(../Encode.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:10:37 Asia/Tokyo] PHP Fatal error:  require_once(): Failed opening required '../Encode.php' (include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php') in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:12:58 Asia/Tokyo] PHP Warning:  require_once(../Encode.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:12:58 Asia/Tokyo] PHP Fatal error:  require_once(): Failed opening required '../Encode.php' (include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php') in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:13:03 Asia/Tokyo] PHP Warning:  require_once(../Encode.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:13:03 Asia/Tokyo] PHP Fatal error:  require_once(): Failed opening required '../Encode.php' (include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php') in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:21:19 Asia/Tokyo] PHP Warning:  require_once(../Encode.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:21:19 Asia/Tokyo] PHP Fatal error:  require_once(): Failed opening required '../Encode.php' (include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php') in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:24:08 Asia/Tokyo] PHP Warning:  require_once(../Encode.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2
[01-Aug-2018 23:24:08 Asia/Tokyo] PHP Fatal error:  require_once(): Failed opening required '../Encode.php' (include_path='.:/Applications/MAMP/bin/php/php7.2.1/lib/php') in /Applications/MAMP/htdocs/php10/lesson15/request2.php on line 2

今回は、単純にEncode.phpというファイルの参照先がおかしかっただけだった。同じ階層にいるのにも関わらず一個前に戻っていたのでエラーが出ていた模様。

ブログを調べながら作ってみる。

Githubに新規リポジトリを作成する

1.GitHubで新しいリポジトリを作成

  • Repository name:必須。リポジトリ名を入力
  • Description:任意。リポジトリの説明を入力
  • Public/Private:公開したくない場合はPrivate(有償契約の場合)
  • Initialize this repository with a README:READMEを作成するか否か。後から作れるため未チェック。
  • Add .gitignore:git で無視するファイルを指定するファイル。後から作れるためNone
  • Add a license:ライセンス設定。後から作れるためNone

2.既存のローカルリポジトリをGitリポジトリに変換する

cd [GitHubで管理したいローカルのリポジトリ]
git init

3.ローカルリポジトリのファイルをインデックスに追加、コミットする

git add .
git commit -m "[コミットのコメント]"

4.GitHubのリモートリポジトリ情報を追加する

git remote add origin [リモートリポジトリ情報]

5.ローカルリポジトリをリモートリポジトリへ反映させる

git push origin master

*ここまでの工程が終わればGitHubに開発用リポジトリが作成出来る。

作業過程

f:id:crown_666:20180702223045p:plain

こちらが作成したリポジトリ(学習をしながらブログを作っていこうと思う)

コードに変更がある場合にローカル環境で変化が確認できるようにする

手は動かしているが、全くわからないのでわかったら更新する。わかる人はコメント下さい。

生じた問題・今後の課題

1.Editorでコードを編集してGitコマンドで編集内容をGitHubに反映させようと思うが、エラーが出る。こちらに関しても調査を進める。

fatal: /Users/takuyahirata/PhpstormProjects/blog/basic/Vagrantfile: '/Users/takuyahirata/PhpstormProjects/blog/basic/Vagrantfile' is outside repository

2.Vagrantでコード変更を画面で即時確認できるようにしたい。

何の為にブログを書くのか。

学びの方法を変える

初心者エンジニアだから

成長にスピード感を感じたい。焦らず確実に知識を付けたい。

成長の過程を綴り、貯蓄する。ブログの価値を100%引き出し宝物にする。

このブログを通して、やってみようの数を増やしたい。

という想いからブログの再定義を行った。変更点は以下の通り。

何を変えるのか?

  • 技術ブログは日本語表記にする
  • 英語記事で必要な時に翻訳して綴る
  • 時々、PythonでのAI/Data-Science
  • 実際にサービスを作る工程を投稿する
  • サービス工程に関わらずその為に必要な知識も投稿する
  • サービスを構築するために必要な知識を構築過程で詰め込む

 

オブジェクト指向とは

ソフトウェア開発はコードの追加と変更を繰り返し開発が進み、ソフトウェアが使われ始めると想定外の使われ方に対応し、追加と変更の要求に応える為に変更作業が続く。オブジェクト指向はこの変更を楽で安全にする為の実践的な考え方であり工夫である。

変更が大変なプログラムの特徴

  • どこに何が書いてあるのかわからない
  • 同じ修正があちこちで必要

-> 修正に関して経験があった。使用頻度+変更の可能性があるものを一箇所でまとめて管理するように仕様を変更した。あれもオブジェクト指向の一つだったのだと腹落ちした。

  • 変更の副作用が怖くて変更できない / 思わぬ副作用が起きた

->これについての対策を週明けからするのであろうと思っている。(キャンペーン時のモーダル表示でバグが出るという事例があるので解決する。)

この問題の改善に取り組む為には?
  • データの扱い方の工夫
  • 場合分けの書き方の工夫
  • プログラムの分割の仕方の工夫
  • 名前の付け方の工夫

具体的な方法がわかったところで、もう少し詳細に詰めて行こうと思う。

関連するデータとロジックは同じクラスに書く

データとロジック(データ操作)を、1つのクラスにまとめることを重視する。

  • データを操作するロジックは、そのデータをインスタンス変数に持つクラスに一緒にする(データクラスと機能クラスに分けない)

データとロジックを別クラスに分けると、データを操作するロジックが、あちこちに重複しやすくなる

  • オブジェクトを生成するときは、必ず操作対象のデータをコンストラクタの引数として渡す

データを引数で渡すことを繰り返すと、そのデータを使った判断/加工/計算のロジックが、どこに書いてあるのか、見つけ出すのに苦労する

  • オブジェクトに、getXxxx()の形式で内部のインスタンス変数を要求しない
  • オブジェクト内部のインスタンス変数を、外から変更しない(setterメソッドを使わない)

オブジェクトのインスタンス変数を書き換える操作は(状態が変わるので)、プログラムの動作が不安定になりやすい

 

基本のデータ型を使うロジックを用途ごとのクラスにまとめる

データとロジックを同じクラスにまとめる方法としては、プログラミング言語に用意されている汎用的なデータ型を使って、用途を限定した「独自のクラス」を作ることである。基本的なデータ型とそのメソッドは、色々な用途に使えるように汎用的に設計されている。しかし、このようなデータ型と汎用的な操作をそのまま使うと、次のような問題が起きがちである。

  • 業務的に正しくないデータが混入しても動いてしまう
  • プログラムのどこを見ても同じような記述が並ぶ(基本データ型だらけ)
  • 汎用的な操作が、どのような意図なのか、判断しにくい

 

聞いたことあるけど、理解できていない語録

  • 引数

->プログラムにおいて、その外部と値をやりとりするための特別な変数、あるいはその変数の値のことである。Ex:ご飯->食べる->う○こ(*左フローの"ご飯"のこと)

Data Science

Start learning data science.

  • Necessary to download Anaconda first.
  • Execute jupyter notebook in teminal.
  • Select Python3 in jupyter notebook.

*Refered from other site.

 

How to visualize data

  • Necessary to code %matplotlib inline at the first line.
  • All necessary process has been done. Now you can keep codeing like whatever you want to code.

 

What is logistic regression model?

It's much easier to understand what logistic regression model is with thinking about a classifier of a spam e-mail. Basically, a spam e-mail filter classify which is a spam or not. There would be some experiences like an e-mail should be classified as a spam got to through the filter. On the other hands,an email should be classified it's not a spam got to classify as a spam. So we need to take steps to predict with deep learning. Classifying it's not a spam when program thinks the prediction is weak. This is one of methods to reduce the bad possibility such as classifying an e-mail as a spam. For doing this,we need to measure how reliable the prediction is.

 

Review of perceptron.

*Refered from other site.

Frankly to say,perceptron is a binary classifier which predicts which kind of data points with classifying f(x) is plus or minus.

Generating visualized data.

>|python|
%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib.pyplot  as plt
from scipy import optimize

plt.style.use('ggplot')

def make_data(N, draw_plot=True, is_confused=False, confuse_bin=50):
    '''N個のデータセットを生成する関数
    データをわざと複雑にするための機能 is_confusedを実装する
    '''
    np.random.seed(1) # シードを固定して、乱数が毎回同じ出力になるようにする

    feature = np.random.randn(N, 2)
    df = pd.DataFrame(feature, columns=['x', 'y'])

    # 2値分類の付与:人為的な分離線の上下どちらに居るかで機械的に判定
    df['c'] = df.apply(lambda row : 1 if (5*row.x + 3*row.y - 1)>0 else 0,  axis=1)

    # 撹乱:データを少し複雑にするための操作
    if is_confused:
        def get_model_confused(data):
            c = 1 if (data.name % confuse_bin) == 0 else data.c 
            return c

        df['c'] = df.apply(get_model_confused, axis=1)

    # 可視化:どんな感じのデータになったか可視化するモジュール
    # c = df.c つまり2値の0と1で色を分けて表示するようにしてある
    if draw_plot:
        plt.scatter(x=df.x, y=df.y, c=df.c, alpha=0.6)
        plt.xlim([df.x.min() -0.1, df.x.max() +0.1])
        plt.ylim([df.y.min() -0.1, df.y.max() +0.1])

    return df

df = make_data(1000)
df.head(5)
||<

f:id:crown_666:20180603175921p:plain

 

List

<Code>

# Practice Project4

grid=[['.', '.', '.', '.', '.', '.'],
    ['.', 'O', 'O', '.', '.', '.'],
         ['O', 'O', 'O', 'O', '.', '.'],
         ['O', 'O', 'O', 'O', 'O', '.'],
         ['.', 'O', 'O', 'O', 'O', 'O'],
         ['O', 'O', 'O', 'O', 'O', '.'],
         ['O', 'O', 'O', 'O', '.', '.'],
         ['.', 'O', 'O', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']

for x in range(len(grid)):

  for y in range(len(grid)):
    try:
      if y == len(grid)-1:
        print(grid[y][x])

      else:
        print(grid[y][x], end=' ')
    except IndexError:
      break

 

<Result>

.  .  O O . O  O  .  .
. O O O O O O O .
. O O O O O O O .
.  .  O O O O O  .  .
.  .  .  O O O  .  .  .
.  .   .  .  O  .  .  .  .

 

<Comment>

このListがどのような動きをするのかということは、結果からわかったので理解することが出来たが、このプログラム自体がなぜこのような結果をもたらすのかが理解できていない。2重for文の動きは簡単なコードを書いて確認することが出来た。

 

grid = [['.', '.', '.', '.', '.', '.'],
           ['.', 'O', 'O', '.', '.', '.'],
           ['O', 'O', 'O', 'O', '.', '.'],
           ['O', 'O', 'O', 'O', 'O', '.'],
           ['.', 'O', 'O', 'O', 'O', 'O'],
           ['O', 'O', 'O', 'O', 'O', '.'],
           ['O', 'O', 'O', 'O', '.', '.'],
           ['.', 'O', 'O', '.', '.', '.'],
           ['.', '.', '.', '.', '.', '.']]


for x in range(len(grid)):
  for y in range(len(grid)):
    print(x)
  break

print("----------"*5)

for x in range(len(grid)):
  for y in range(len(grid)):
    print(y)
  break

print("----------"*5)

for x in range(len(grid)):
  for y in range(len(grid)):
    print(grid[y][x])
  break

0
0
0
0
0
0
0
0
0
--------------------------------------------------
0
1
2
3
4
5
6
7
8
--------------------------------------------------
.
.
O
O
.
O
O
.
.
--------------------------------------------------

ただ、なぜこうなるという部分が理解できていないので、疑問を解消したい。

 

Automate the boring stuff/Practice Projects

この年で、初めてギックリ腰ならぬギックリ背中を経験し、勉強したくても出来ず、寝れない数日を過ごした。ストレートネックが原因で体を壊したらしい。もうあんな思いは嫌なので、トレーニングはもちろん普段パソコンを使用しているときや、スマホを触るときの姿勢にも気を使いたい。

 

<Code>

# Practice Projects

# Define collatz which has a parameter named number
def collatz(number):

if number%2==0:
return number//2
elif number%2!=0:
return 3*number+1

print("Enter number:")

 

# try~exception statement

try:
number=int(input())

 

# Parmanent repeat

while True:
if collatz(number)!=1:
number=collatz(number)
print(number)
else:
print("Success!")
break

except ValueError:
print("Type an integer, please.")

 

<Result of the execution>

*When I typed 3,this program ran like...

Enter number:
3
10
5
16
8
4
2
Success!

 

*When I typed string,this program ran like...

Enter number:
A
Type an integer, please.

 

このプログラムについては自分なりに理解が出来たが、全くプログラミングに関して知識がない人に教えることが出来るまで深い理解度にはまだ達していないのでこれからも試行錯誤を続けつつ複数のことを熟していきたい。

 

今度こそフローチャート

f:id:crown_666:20171012000421p:plain

name=""

while not name!="":
print("Enter your name:")
name=input()

print("How many guests will you have?")
numOfGuests=int(input())

if numOfGuests:
print("Be sure to have enough room for all your guests.")

print("Done")

 

この問題の答えがあるわけではないが、実際にこのプログラムのフローチャートはどのようになっているのか、フローチャートを見て理解しプログラムをつくることは可能なのか、を個人で検証するためにプログラムを参照し、フローチャートを作成した。

 

作成時に迷ったのは、while not name!="":の部分をどこに描けばよいのかということ、通常であれば、プログラム通りに描いていくのが筋であると考えていることが原因であると思う。