CentOS7でChromeを使用していたらある日突然Webページが開けないケースが発生しました。
エラー内容
ERROR:child_process_launcher.cc(445)] Failed to launch child process
ERROR:zygote_host_impl_linux.cc(374)] Did not receive ping from zygote child
ERROR:zygote_linux.cc(573)] Zygote could not fork: process_type renderer numfds 5 child_pid -1
どうやらSELinuxポリシーの変更によるものの様です。
SELinuxポリシーが更新されていなかったら更新することで治ります。
$ sudo yum update selinux-policy selinux-policy-devel selinux-policy-sandbox
2015年12月6日日曜日
2015年12月4日金曜日
learnyounodeを解いてみる(8問目)
learnyounode [ HTTP COLLECT]
1つ目のコマンドライン引数は URL 文字列です。 そのURL文字列を使ってHTTP のデーターをロード (※)するアプリを書いてください。 サーバから全て(最初のイベントだけではなく)のデータを集め、次の2行をコンソールに出力して下さい。 1行目は文字数です。2行目はサーバから受け取った全てのデータを文字列で出力してください。
こちらも出題内容が解りづらいかもしれませんが、バッファから得られるデータを纏めて文字数とその文字列を出力するだけです。 先回のものを少し変えるだけで出来そうですね。
response.on("data")で得られるデータはバッファなのでそれを繋ぎます。
あとはresponse.on("end")でlengthを使い文字数を出力し、文字列そのものを出力してやればいいだけです。
httpcollect.js
var http = require('http');
var url = process.argv[2];
http.get(url, function(res) {
var out = "";
res.setEncoding('utf8');
res.on('data', function(chunk) {
out += chunk;
});
res.on('end', function() {
console.log(out.length);
console.log(out);
});
res.on('error', function(err) {
console.error("Error: " + err.message);
});
});
さて、正解はこれでいいのですが、問題のヒントにblかconcat-streamパッケージを使ってくださいとあります。これら外部パッケージを使うこともNodeの魅力です。これを使って解いてみましょう。
これらはサードパーティ製なので使用するにはnpmでインストールする必要があります。
$ npm install bl
blパッケージはBufferListの略でバッファをリストで加工できる様にしたパッケージでバッファを利用しやすくしています。
主な使い方は以下で説明されてます。
bl特に利便性が高いのはコールバックを引数に持つのでpipeで繋げられることです。
ヒントにもあるのでその使用法で書きましょう。
response.pipe(bl(function(err, data) { }));
blのサイトには
// `data` is a complete Buffer object containing the full data と書いてあります。
つまりデータにはすべてのバッファを含めた状態で渡されるとあるので上と同じ処理をして完成です。気をつけることはbufferはバイナリのままなのでtoString()で文字列に変更することでしょうか?
blcollect.js
var http = require('http');
var bl = require('bl');
var url = process.argv[2];
http.get(url, function(res) {
res.pipe(bl(function(err, data) {
if(err) return console.error(err);
console.log(data.length);
console.log(data.toString());
}));
});
# おめでとう!
「HTTP 集める」に対するあなたの回答は合格です!
これが正式な回答です(もしあなたの回答と比較してみたいならどうぞ):
───────────────────────────────────────────
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)
}))
})
以上です。
2015年11月24日火曜日
learnyounodeを解いてみる(7問目)
learnyounode [ HTTP CLIENT]
1つ目の引数として指定された URL に、 HTTP で GET を送信する (※)アプリを書いてください。 そのリクエストに対するレスポンスを"data"イベントで受け取り、受け取った全ての文字列を1つずつ改行で区切ってコンソールに書き出してください。
問題は少し説明が分かりにくいですが、ヒントを読むとhttpモジュールのgetを使ってurlから内容をそのまま読めば良いようです。ほぼヒントに書かれている通り書けば良いので問題はないでしょう。
http.get(options, [callback])
httpモジュールはNode入門書では大抵出てくるので何をしているかは理解できるでしょう。
使い方は http.get(url, callback) でいつもの通りコールバックを使用しますが、そのコールバック関数は function callback (response) { /* ... */ } と第一引数がエラーではありません。
response.on()で得られたデータを'data' でエラーを 'error' を取得します。
気をつけるのは得られたデータにresponse.setEncoding()でエンコーディングを適用することです。
まとめると以下のようになります。
get.js
var http = require('http');
var url = process.argv[2];
http.get(url, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log(chunk);
}).on('error', function(err) {
console.error("Error: " + err.message);
});
});
# おめでとう!
「HTTP クライアント」に対するあなたの回答は合格です!
これが正式な回答です(もしあなたの回答と比較してみたいならどうぞ):
──────────────────────────────────
var http = require('http')
http.get(process.argv[2], function (response) {
response.setEncoding('utf8')
response.on('data', console.log)
response.on('error', console.error)
})
2015年11月21日土曜日
learnyounodeを解いてみる(6問目)
learnyounode [MAKE IT MODULAR]
指定したディレクトリから、拡張子でフィルタしたファイルのリストを出力するプログラムを書いてください。 コマンドライン引数の1つ目はディレクトリ名、2つ目は拡張子です。 フィルタリングしたファイル名を1行ずつコンソールに出力してください。非同期 I/O を使ってください。
module ファイルに処理の大部分を書いてください。module には、3つの引数を取る関数を一つだけ定義してください。 その関数の引数は ディレクトリ名・ファイル拡張子・コールバック関数、という順序です。
次は意外に難問です。learnyounode一の難問と言っていいかもしれません。
問題としては先回のものをそのままモジュールにするだけですが、モジュールにするにはNodeのモジュール化とコールバック関数の使い方にある程度慣れなければなりません。
今までrequire関数で呼び出しのみ使っていたモジュールを自作するのです。
モジュール化自体はいたって簡単です。
exportsにプロパティやメソッドを代入すればいいだけです。
calc.js
exports.add = function(n1, n2) {
return n1 + n2;
};
そして使用する側はファイル名を指定して呼び出します。
main.js
var calc = require('./calc');
console.log(calc.add(1, 2));
$ node main.js 3
簡単です。ファイル名は拡張子あり'./calc.js'でも無し'./calc'でも行けますがローカルモジュールの場合は先頭にパス'./'が必要です。
ただし、上の書き方だとオブジェクトを代入するとエラーが出ます。Nodeでオブジェクトを代入するにはmodule.exportsを使います。module.exportsは上位互換だと思ってください。なのでNodeでモジュール化するならmodule.exportsを使っておけばいいです。
Modules
先ほどのモジュールをオブジェクトで代入するとこうなります。
calc.js
module.exports = {
add: function(n1, n2) {
return n1 + n2;
}
};
こちらを使っても同じ結果になるはずです。JavaScriptのオブジェクトを知っていればそれほど問題ないでしょう。
以下のようにすればメソッドをどんどん追加できます。
calc.js
module.exports = {
add: function(n1, n2) {
return n1 + n2;
},
sub: function(n1, n2) {
return n1 - n2;
},
mul: function(n1, n2) {
return n1 * n2;
},
div: function(n1, n2) {
return n1 / n2;
}
};
main.js
var calc = require('./calc');
console.log(calc.add(5, 3));
console.log(calc.sub(5, 3));
console.log(calc.mul(5, 3));
console.log(calc.div(5, 3));
$ node main.js 8 2 15 1.6666666666666667
今回の問題にはいろいろ制約があります。
作成する module には、以下の4つの制約があります。
- 正しい引数を取る関数を定義してください。
- エラー、もしくはデータを引数に取るコールバック関数を一度だけ呼び出してください。
- 2つ目の制約以外には何も変えないでください(グローバル変数や標準出力など)。
- 発生する可能性のあるエラーは全てコールバック関数に渡してください。
関数の引数がディレクトリ名・ファイル拡張子・コールバック関数という指定なので先回作ったものをそのまま引数3つの関数でラップしてみます。
findfile.js
var fs = require('fs');
var path = require('path');
var dir = process.argv[2];
var ext = process.argv[3];
/*
ディレクトリ名・ファイル拡張子・コールバック関数の3つの引数を定義する。
とりあえずコールバックは定義のみ
*/
var find = function(dir, ext, callback) {
//先回作った部分
fs.readdir(dir, function(err, list) {
if(err) throw err;
for(var i in list) {
if(path.extname(list[i]) == '.' + ext) {
console.log(list[i]);
}
}
});
}
//作った関数の実行
find(dir, ext, function() {});
$ node findfile.js . txt test.txt words.txt
ちゃんと動作しますね。これを出力でなくリストの返り値として変更してみます。問題は得られたリストをどうやって返すかですがここでコールバック関数を使用します。与えられたコールバック関数の引数に渡せば呼び出し先で結果が得られます。
findfile.js
var fs = require('fs');
var path = require('path');
var dir = process.argv[2];
var ext = process.argv[3];
/*
ディレクトリ名・ファイル拡張子・コールバック関数の3つの引数を定義する。
*/
var find = function(dir, ext, callback) {
fs.readdir(dir, function(err, list) {
var files = [];
if(err) throw err;
for(var i in list) {
if(path.extname(list[i]) == '.' + ext) {
files.push(list[i]);
}
}
//ここで得られた結果を引数として渡す。
callback(null, files);
});
}
//コールバック関数から取り出します。
find(dir, ext, function(err, list) {
console.log(list);
});
これを実行すれば配列ですが先ほどと同じ結果が得られるはずです。
ここまで来れば簡単ですね。あとはエラー内容を指定どおりに処理して、モジュール化し使う側で得られた結果をイテレートするだけです。
findfile.js
var fs = require('fs');
var path = require('path');
module.exports = function(dir, ext, callback) {
fs.readdir(dir, function(err, list) {
var files = [];
if(err) return callback(err);
for(var i in list) {
if(path.extname(list[i]) == '.' + ext) {
files.push(list[i]);
}
}
callback(null, files);
});
}
usefindfile.js
var findfile = require('./findfile');
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);
});
});
$ learnyounode verify usefindfile.js
・・・・
# おめでとう!
「モジュラーにしましょう」に対するあなたの回答は合格です!
これが正式な回答です(もしあなたの回答と比較してみたいならどうぞ):
───────────────────────────────────────────
solution.js:
var filterFn = require('./solution_filter.js')
var dir = process.argv[2]
var filterStr = process.argv[3]
filterFn(dir, filterStr, function (err, list) {
if (err)
return console.error('There was an error:', err)
list.forEach(function (file) {
console.log(file)
})
})
───────────────────────────────────────────
solution_filter.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
})
callback(null, list)
})
}
2015年11月20日金曜日
learnyounodeを解いてみる(5問目)
learnyounode [ FILTERED LS]
拡張子によってフィルタしたファイルリストをコンソールに出力するアプリを書いてください。
5問目は、指定した拡張子のファイルを列挙するアプリです。シェルコマンドで言えば「find -name ".拡張子"」の様な結果になるということですね。
1つめの引数にフォルダのパスを入れ、2つめの引数に拡張子を指定します。2つめの拡張子は拡張子名のみ、("."抜き)で指定とあります。
とりあえず、ファイルの列挙から始めましょう。
fs.readdir
readdir.js
var fs = require("fs");
var dir = ".";
fs.readdir(dir, function(err, list) {
if(err) throw err;
for(var i in list) {
console.log(list[i]);
}
});
if (err) throw err; もエラーをthrowさせるNodeのイディオムなので無くても正常であれば動作します。
forは得られた配列を展開しているだけなので、イテレータ「files.forEach(function (file) { }」でもいけます。
得られたファイルリストから拡張子を抜き出すには、文字列操作を使っても構いませんがヒントに拡張子を抜き出すNodeのpathモジュールを使うと役に立つと書いてあるのでpathモジュールのextname関数を使用します。extname関数は引数にファイルを入れると拡張子だけ抜き出してくれます。それを判定に使えばいけますね。
path.extname
気をつけることは引数には拡張子名だけ指定してextnameで抜き出せる拡張子が"."付きだということです。なので"."を足してから比較します。
あとは引数と得るのは先回使ったprocess.argv[N]なので組み合わせて完了です。
extname.js
extname.js
var fs = require("fs");
var path = require("path");
var dir = process.argv[2];
var ext = process.argv[3];
fs.readdir(dir, function(err, list) {
if(err) throw err;
for(var i in list) {
if(path.extname(list[i]) == '.' + ext) {
console.log(list[i]);
}
}
});
$ learnyounode verify extname.js
...................
# おめでとう!
「LSのフィルター」に対するあなたの回答は合格です!
これが正式な回答です(もしあなたの回答と比較してみたいならどうぞ):
─────────────────────────────────────────
var fs = require('fs')
var path = require('path')
fs.readdir(process.argv[2], function (err, list) {
list.forEach(function (file) {
if (path.extname(file) === '.' + process.argv[3])
console.log(file)
})
})
2015年11月9日月曜日
learnyounodeを解いてみる(4問目)
learnyounode [MY FIRST ASYNC I/O! ]
非同期処理 をするファイルシステムのメソッドを使ってファイルの改行数を出力するアプリを書いてください。 cat file | wc -l と同じようなアプリです。 アプリの1つ目のコマンドライン引数は、そのファイルへのパスです。
4問目は3問目をただ非同期にしただけです。ヒントにある様にNodoでは非同期の文化が前提です。
なぜならNode.jsノンブロッキングなI/Oを実装することで様々な優位性を引き出しているからです。Node自体の解説は置いておくとしてNodeでノンブロッキングな書き方を実装するにはコールバック関数によって行われます。JavaScriptをある程度書いたことのある人ならご存知でしょう。
同期型のコード
var data = $.post(fname); //上の処理が終わるまで実行されない console.log(data)
非同期型のコード
$.post(fname, function(data) {
console.log(data)
});
//上の処理が終わらなくても実行される
console.log("OK")
つまり、3問目の処理をコールバック関数に納めれば良いだけです。filelinesAsync.js
var fs = require('fs');
var filename = process.argv[2];
fs.readFile(filename, function(err, data) {
var lines = data.toString().split('\n').length - 1;
console.log(lines);
});
$ learnyounode verify filelinesAsync.js # おめでとう! 「初めての非同期I/O!」に対するあなたの回答は合格です!
2015年11月8日日曜日
PythonでCGIスクリプトページが表示されない時
CGIスクリプトでスクリプトが実行されない時
PythonスクリプトでCGIスクリプトをサーバーから実行させようと思ってWebページを開こうと思っても表示されない時があります。
様々なケースが考えられますが、単純なミスの場合もあります。
サーバーを起動させているシェルのエラーを見ながら何がいけないのか疑ってみましょう。
表示されない場合(エラーに何も出ないケース)
パスは合っているのにWebページに何も表示されない場合。シェルにも異常が出てない場合はContent-Typeに全角文字が混ざっていたりスペル違いがあったりそのあたりを疑ってみましょう。
表示されない場合(エラーに「FileNotFoundError: [Errno 2] No such file or directory: 」が出るケース)
同じくWebページが表示されずシェルに「FileNotFoundError: [Errno 2] No such file or directory: 」のエラーが出る場合。スクリプトの先頭行シェバング行のパスが合っていない可能性が高いです。
通常のスクリプトは実行出来てもCGIサーバ-から実行する場合、相対パスからだと辿れないためそのエラーが発生します。絶対パスに書き換えてみてください。
現在のPythonのパスは「$ which python」で現在のPythonの実行パスを表示させ。出てきたパスをコピーして「ls -la 」で表示させるとリンクされている絶対パスを取り出せるのでそれをコピーしてシェバング行を書き換えてから実行してみてください。ただしローカル環境の絶対パスそのままだと移植性に乏しいので #!/usr/bin/env python3 を使用するかリンクを貼っておいた方が後々楽でしょう。
その他のエラー
スクリプト自体のパスが違っていたり、スペルミスでスクリプトファイルが存在してなかった場合にはシェルに「code 404, message No such CGI script」エラーが出てWebページに「Error response Error code: 404」が表示されます。
後は、スクリプトのパーミッションが(755)などに許可されていなかったり他から移動させたファイルなどやSELinuxのコンテキストが違っていたりしていたりする(code 403, message CGI script is not executable )のでそのあたりを疑ってみましょう。
登録:
投稿 (Atom)
NBAの1試合平均チームスタッツ (2025-26レギュラーシーズン)
前回 の元となったデータ、チーム毎の各スタッツ平均です。 team games w l win% PTS AST BLK STL ...
-
文字列の改行を消す Cで入力文字列を扱っているとfgetsなど改行まで入り込む場合があります。それを消すための簡単なコード。 例: #include <stdio .h> #include <string .h> #define LEN 32...
-
mintを使っていて、一定時間経つと画面がロックされるのでプライベートで使っている人は設定を変えたい場合もあるかと思います。 そこでメニューからスクリーンセーバーを立ち上げと思ったらスクリーンセーバーの設定が無い。 mint18でxfceで環境を構築していますが、どうやら...
-
NBAデータ取得 NBAデータを分析する場合には、まず最初にデータ取得が必要です。 Kaggleなどのデータサイトから検索してもいいし、データサイトからスクレイピングしてる方もいると思います。 そしてPythonのライブラリからもNBAデータを提供してるものがあるので、それを使っ...