CodeIgniterのLogが出力できない
CodeIgniterのLog
Vagrant + CentOS7にCodeIgniterを入れて環境構築を行なった。
CodeIgniterのlogの設定はapplication/config/config.php
で行う。
log_path
ログの出力先。
デフォルトはapplication/logs
に20XX-XX-XX.php
のようなログが出力される。
$config['log_path'] = '';
log_threshold
どのログを出力させるか設定を行う。
| 0 = Disables logging, Error logging TURNED OFF | 1 = Error Messages (including PHP errors) | 2 = Debug Messages | 3 = Informational Messages | 4 = All Messages $config['log_threshold'] = [1,2];
ログの埋め込み
log_message('debug', 'テスト');
原因
logsフォルダは存在するが、ログファイルが生成されない。
調べてみると、vagrantの共有フォルダで
apacheの書き込み権限がないのが原因だったみたい。
$ ls -al 該当フォルダのパス
で確認するとオーナーとグループがvagrantだったので
Vagrantfileで設定を変更
解決法:Vagrantfileで権限を変更
config.vm.synced_folder "./data", "/var/www/html/", mount_options: ['dmode=777','fmode=755']
参考リンク
vagrant共有フォルダのパーミッションでハマった話 | Buddying Blog
【vagrant】共有フォルダのパーミッションで悩んだ話【chmodできない】 - すこしふしぎ.
vagrant上、共有ファイルのパーミッションを変更する - Qiita
CodeIgniterのURLからindex.phpを削除する
.htaccess追加
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
RewriteEngine:Apacheのモジュールであるmod_rewriteを利用するときに使う宣言文
RewriteEngine onでmod_rewrite(URL書き換えエンジン)を有効にする。
【mod_rewrite】 RewriteEngineとは? – mod rewrite
注意
デフォルトで、application/.htaccessに設置されていたが
applicationと同じ階層に移動させる。
httpd.conf
仮想環境上でApachの設定を変更する。
vi /etc/httpd/conf/httpd.conf
.htaccessの設定を有効にする
AllowOverride None ↓ AllowOverride All
[Apache] Options と AllowOverRide の設定値を改めて整理してみる | バシャログ。
mod_rewriteのコメントアウトを解除
#LoadModule rewrite_module modules/mod_rewrite.so ↓ LoadModule rewrite_module modules/mod_rewrite.so
CodeIgniterのconfig.php
$config['index_page'] = 'index.php'; ↓ $config['index_page'] = '';
apache再起動
systemctl reload httpd
参考URL
Node.js学習まとめ
Node.jsとは
- サーバーサイドのJavaScript
- ノンブロッキングI/O(大量のアクセスに強い)
- イベントループ
- シングルスレッド
- ChromeのV8エンジンを取り出して強化したJavaScriptの「実行環境」(速い)
ノンブロッキングI/O
ファイルやネットワークの入出力(I/O)を行う際、処理をブロックしない。
I/Oの処理を待たずに次の処理を始めるため、大量のデータ処理などが可能。
- ブロックのないイベントループ
- ノンブロッキングを強制する
- Google の V8エンジンにより実現
例えば、ハードディスクの入出力のスピードは、CPUやメモリーから見ると非常に遅い。書き込み完了を待っているのは非常に時間の無駄なので、ハードディスクに書き込む命令を出して、書き込めたかの結果を待たず次の処理をどんどん進めてしまうので非常に処理を早くすすめられる。書き込めた場合にコールバックが呼ばれる。
イベントドリブン
イベントドリブンとは、 コンピュータプログラムの開発および実行方式の一つで、 利用者や外部の別のプログラムなどが引き起こす出来事に 対応する形で処理を記述あるいは実行する方式。 (wikipediaより)
シングルスレッド
- ひとつのスレッドでイベントを管理
JavaScriptはシングルスレッドだとようやく知ったのでメモ - コンパイラかく語りき
C10K問題 (クライアント1万台接続問題)
- 大規模なI/Oが発生する処理の需要が高まった
- Apachなどは1HTTPリクエストに1プロセス(ポート数の32767が限界)
- マルチスレッドはメモリの消費が激しい
Node.js入門
Node.js を5分で大雑把に理解する - Qiita
https://www.slideshare.net/SatoshiTakami/intoroduction-nodejs
内部実装から読み解くNode.js(v11.0.0) Eventloop - Qiita
npm
「npm」とは「Node Package Manager」の略で、Node.jsのパッケージを管理するツール。
カレントディレクトリにインストール
$ npm install hoge
グローバルインストール
$ npm root -g hoge
npmのグローバルインストールとローカルインストール - Qiita
セットアップ
インストール
nodebrewによるNode.jsのインストールからセットアップまで - Qiita
バージョン変更
// 確認 $node --version v11.14.0 // インストール $ nodebrew install v12.2.0 // インストール済みのリスト表示 $ nodebrew list v10.15.3 v11.14.0 v12.2.0 current: v11.14.0 // 使用するバージョンを変更 $ nodebrew use v12.2.0 // 確認 $ node --version v12.2.0
【Mac】nodebrewのインストールとコマンドなど使い方まとめ - TASK NOTES
NodeSchool
learnyounode 1問目
console.log("HELLO WORLD")
learnyounode 2問目
コマンドライン引数
process には argv という配列のプロパティがあり、
その配列の中にはコマンドライン引数が入っている。
console.log(process.argv)
をnode program.js test
で実行すると
argvの1つ目にnode、2つ目にアプリファイルのパス、
それ以降にコマンドライン引数が入っているのが分かる。
[ '/Users/username/.nodebrew/node/v12.2.0/bin/node', '/Users/username/Projects/learnyounode/02_baby_step.js', 'test' ]
Number()
process.argvの要素は全てstringであるため、
「+」を前につけるか、Number()で変換する
result += +process.argv[i] result += Number(process.argv[i])
解答
var result = 0 for (var i = 2; i < process.argv.length; i++) result += Number(process.argv[i]) console.log(result)
learnyounode 3問目
fsモジュール
ファイルシステムにアクセスするためには、
Nodeのコアライブラリのfsモジュールが必要。
var fs = require('fs')
readFileSync
同期処理(ブロッキング)をする関数は、名前の後ろにSyncがついている。
fs.readFileSync('path')
でファイルを読み込むと、Bufferオブジェクトが返ってくる。
そのため、toString()
で変換する必要がある。
解答
// fsモジュールを使う var fs = require('fs') // コマンド引数の配列の中の3番目を読み取り var contents = fs.readFileSync(process.argv[2]) var lines = contents .toString() //バッファーを文字列に変換 .split('\n') // 改行コードで分割 .length - 1 // 最終行を除外 console.log(lines)
learnyounode 4問目
readFile()
非同期でファイルを読み込む。
返り値を受け取るのではなく、
2つ目の引数であるコールバック関数を使って値を受け取る。
callback関数
function callback (err, data) { /* ... */ }
エラーが発生しなければerrはnullとなり、
2つ目の引数には Bufferオブジェクトが入る。
readFile(file, 'utf8', function (err, contents)
ァイルパスとコールバック引数の間に "utf8"を入れると、
Bufferのかわりに Stringが返る。
解答
var fs = require('fs') var file = process.argv[2] // fileの読み込みが終わったらfunctionを実行 fs.readFile(file, function (err, contents) { if (err) { return console.log(err) } var lines = contents.toString().split('\n').length - 1 console.log(lines) })
learnyounode 5問目
readdir()
1つ目の引数はディレクトリへのパス。
2つ目の引数はコールバック関数で、
listはファイル名のStringが格納されたArray。
function callback (err, list) { /* ... */ }
path.extname関数
パスから拡張子部分を取得する。
var path = require('path') var ext = path.extname('xxx');
解答
var fs = require('fs') var path = require('path') var folder = process.argv[2] var ext = process.argv[3] || "" fs.readdir(folder, function (err, list) { if (err) { return console.error(err) } list.forEach(function (file) { if (path.extname(file) === '.' + ext) console.log(file) }) })
learnyounode 6問目
module化
module.exportsで、モジュール化させる関数を「1つだけ」定義する。
呼び出し側で、var module_hoge = require('./module.js')
と定義すると、module_hoge()として使用できるようになる。
解答
make_it_modular.js
var findfile = require('./module.js') var dir = process.argv[2] var ext = process.argv[3] findfile(dir, ext, function (err, list) { if (err) throw err list.forEach(function (file) { console.log(file) }) })
moduler.js
var fs = require('fs') var path = require('path') // 関数を一つだけ定義する module.exports = function (dir, filterStr, callback) { fs.readdir(dir, function (err, list) { if (err) return callback(err) list = list.filter(function (file) { return path.extname(file) === '.' + filterStr }) // エラー引数にnull callback(null, list) }) }
learnyounode 7問目
解答
var http = require('http') var url = process.argv[2] request = http.get(url, function (res) { res.setEncoding('utf8') res.on('data', console.log) res.on('err', console.log) }) request.on('error', function (err) { console.error(err) })
公式の解答
var http = require('http') http.get(process.argv[2], function (response) { response.setEncoding('utf8') response.on('data', console.log) response.on('error', console.error) }).on('error', console.error)
learnyounode 8問目
1つ目のコマンドライン引数は URL 文字列。
そのURL文字列を使ってHTTPのデータをロードする。
サーバから全て(最初のイベントだけではなく)のデータを集め、
次の2行をコンソールに出力する。
1行目は文字数、2行目はサーバから受け取った全てのデータを文字列。
解答
var http = require('http') var url = process.argv[2] request = http.get(url, function (res) { var result = '' res.setEncoding('utf8') res.on('data', function (data) { result += data }) // 出力 endイベント res.on('end', function () { console.log(result.length) console.log(result) }) res.on('error', console.error) }) request.on('error', function (err) { console.error(err) })
公式の解答
var http = require('http') var bl = require('bl') http.get(process.argv[2], function (response) { response.pipe(bl(function (err, data) { if (err) { return console.error(err) } data = data.toString() console.log(data.length) console.log(data) })) })
learnyounode 9問目
解答
var http = require('http') // 入力された配列の3,4,5行めを読み込む var links = [2, 3, 4] var buffer = [] // 即時関数 引数indexに0を入れて実行 (function render(index) { http.get(process.argv[links[index]], function (response) { response.setEncoding('utf8') response.on('data', function (data) { if (buffer[index] === undefined) { buffer[index] = '' } buffer[index] += data }) response.on('end', function () { var newIndex = index + 1 if (links[newIndex] !== undefined) { // links配列の中身が終わるまで繰り返し render(newIndex) } else { // 3つとも終わった時 return renderOutput() } }); response.on('error', console.error) }).on('error', console.error) })(0); //self-calling function function renderOutput() { buffer.forEach(function (elem) { console.log(elem) }) }
公式の解答
var http = require('http') var bl = require('bl') var results = [] var count = 0 function printResults () { for (var i = 0; i < 3; i++) { console.log(results[i]) } } function httpGet (index) { http.get(process.argv[2 + index], function (response) { response.pipe(bl(function (err, data) { if (err) { return console.error(err) } results[index] = data.toString() count++ if (count === 3) { printResults() } })) }) } for (var i = 0; i < 3; i++) { httpGet(i) }
learnyounode 10問目
// インストール // npm install dateformat var net = require('net') var dateformat = require('dateformat'); var port = process.argv[2] var server = net.createServer(function(socket) { // socket handling logic var now = new Date(); socket.end(dateformat(now, 'yyyy-mm-dd HH:MM') + "\n") }) server.listen(port)
解答
var net = require('net') function zeroFill (i) { return (i < 10 ? '0' : '') + i } function now () { var d = new Date() return d.getFullYear() + '-' + zeroFill(d.getMonth() + 1) + '-' + zeroFill(d.getDate()) + ' ' + zeroFill(d.getHours()) + ':' + zeroFill(d.getMinutes()) } var server = net.createServer(function (socket) { socket.end(now() + '\n') }) server.listen(Number(process.argv[2]))
Promise
- 同期処理が終わった後に非同期処理(イベントループ)
- 同期処理を書きすぎない、イベントループを止めるな
Nodeのバージョンが変わらない
事象
v11.3.0だったのでv12.2.0をインストール
$ nodebrew list v11.3.0 $ nodebrew install v12.2.0 Fetching: https://nodejs.org/dist/v12.2.0/node-v12.2.0-darwin-x64.tar.gz ######################################################################## 100.0% Installed successfully
使用するバージョンを変更
$ nodebrew use v12.2.0 use v12.2.0 $ nodebrew list v11.3.0 v12.2.0 current: v12.2.0
確認
$ node --version v10.14.1
変わっとらんやないか(;ω;)
Homebrewでインストールしていたのでアンインストール
$ brew uninstall node Error: Refusing to uninstall /usr/local/Cellar/node/11.10.1 because it is required by yarn, which is currently installed. You can override this and force removal with: brew uninstall --ignore-dependencies node
紐づいているが強制的にアンインストール
$ brew uninstall --ignore-dependencies node Uninstalling /usr/local/Cellar/node/11.10.1... (4,417 files, 50MB) $ node --version v10.14.1
やっぱり変わらない(;ω;)
解決法
nodebrewごと決して再度インストール
nodeをアンインストール
HomebrewでインストールしたNodeをアンインストール
$ brew uninstall node
usr/local/bin/nodeで発見して削除
$ which node usr/local/bin/node $ rm -r usr/local/bin/node
再度インストール
nodebrewのインストール
$ brew install nodebrew $ which nodebrew /usr/local/bin/nodebrew
setup
$ nodebrew setup Fetching nodebrew... Installed nodebrew in $HOME/.nodebrew ======================================== Export a path to nodebrew: export PATH=$HOME/.nodebrew/current/bin:$PATH ========================================
Node.jsインストール
既にNode.jsがインストールされていないか確認
$ which node $ node -v -bash: node: command not found
インストールして、使用するバージョンを指定
$ nodebrew install v12.2.0 $ nodebrew list v12.2.0 current: none $ nodebrew use v12.2.0 use v12.2.0
しかしnodeのバージョンが表示されない
$ node -v -bash: node: command not found
パスを通して更新
$ echo "export PATH=$HOME/.nodebrew/current/bin:$PATH" >> ~/.bash_profile $ source ~/.bash_profile $ which nodebrew /Users/username/.nodebrew/current/bin/nodebrew
やっとバージョン変更できた!
$ node -v v12.2.0
参考にしたサイト
ありがとうございます
Nodebrewでnode.jsバージョンを切り替えできなかった時の備忘録 - Qiita
nodebrewでNode.jsをインストールする。 - Qiita