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 )のでそのあたりを疑ってみましょう。

2015年11月5日木曜日

learnyounodeを解いてみる(3問目)

learnyounode [MY FIRST I/O!]

同期処理 をするファイルシステムの関数を使ってファイルの改行文字(\n)の数を出力するアプリを書いてください。 cat file | wc -l と同じようなアプリです。 アプリの1つ目のコマンドライン引数は、そのファイルへのパスです。テスト用のファイルを作る必要はありません。


3問目はファイルを読み込んでそのファイル内に書かれている文字列の行を表示するというアプリです。ファイル読み込みは各プログラミング言語でも必須の機能なのですが、Nodeの親と言えるJavaScriptにはその特殊な立場やセキュリティの問題からファイルを扱う機能がありませんでした。
ですからビルトインオブジェクトにもFileオブジェクトはありません。
ただしAjaxなどでサーバからファイルを取得する限定的な扱いは存在しましたし、HTML5から制限のある中でローカルファイルを扱えるFileクラスも定義されました。
JavaScriptがそのようなことなのでNodeでどうファイルを扱うか困ってしまいそうですが、幸いNodeでファイルを読み込むにはfsというモジュールを使用することで扱えます。fsはFile Systemの略だそうです。

File System

問題で気をつけることは同期処理が指定されていることです。Nodeでは非同期が売りなので同期処理の方が使用頻度は少ないでしょうが、振る舞いとしては同期処理のほうが簡単なので問題として出されたのでしょう。
ファイルを同期処理で読み込むにはreadFileSyncプロパティを使用します。

fs.readFileSync

それを踏まえてファイルを読み込んで見ましょう。

readFile.js

var fs = require('fs');

var filename = "読み込むファイル"
var data = fs.readFileSync(filename, 'utf8');
console.log(data);


これでファイルの内容が読み込めました。
後は改行('\n')を数えるだけです。ヒントには得られたバッファを文字列に変えてから改行文字をsplitメソッドで区切れば改行ごとに分割された文の配列になるのでその要素数を数えれば改行を数えたことと同じになると解説してくれています。ただし最期の改行で句切られた空要素も入るのでそれは-1することに注意します。

コマンドライン引数からファイルを読み込んでと書いてあるので前回のprocess.argv[2]でファイル名を引き取るようにします。

以上を合わせて

filelines.js

var fs = require('fs');
var filename = process.argv[2];

var data = fs.readFileSync(filename, 'utf8');
var lines = data.toString().split('\n').length - 1;
console.log(lines);


$ learnyounode verify filelines.js 

以上で合格です。

2015年11月4日水曜日

learnyounodeを解いてみる(2問目)

learnyounode [BABY STEP]

問題: 以上の整数をコマンドライン引数として受け取り、それらを足し合わせた値をコンソール(stdout)に出力するコマンドラインアプリを書いてください。


さて、この問題にはコマンドライン引数が必要ということなので、まずはNodeでコマンドライン引数を取る方法を調べます。 ヒントにはNodeでコマンドライン引数を取るにはprocessオブジェクトのargvプロパティを使用すると書いてあります。
  process.argv

processはグローバルオブジェクトなのでモジュールを呼ぶことなしに使えます。

process.argvから取れる引数は配列であり1つ目の引数は"node"で、2つ目の引数は"実行ファイルのパス"で3つ目から入力した引数となっています。

まずこのコードでどのように引数が取れるか試してみましょう。

argv.js

console.log(process.argv)

$ node argv.js 1 2 3
[ 'node',
  '.../node/test/argv.js',
  '1',
  '2',
  '3' ]



コマンドライン引数はスペースごとに一つの要素としてすべて文字列の配列で取られていることが分かります。
従って第三引数から取って、数値に変換することが理解できれば簡単です。

sum.js

var len = process.argv.length;
var sum = 0;
for(var i = 2; i < len; i++) {
    sum += Number(process.argv[i]);
}
console.log(sum);

$ learnyounode verify sum.js


✓ 回答内容は想定回答とマッチしました

# おめでとう!

「ベイビーステップ」に対するあなたの回答は合格です!

正式な回答が出てきますがヒント通りに書いたのでほぼ同じでしたね。

2015年11月3日火曜日

learnyounodeでNode.jsを段階的に学ぶ

learnyounodeとは?

learnyounodeとは、NodeSchoolが提供するnodeモジュールのworkshoperによって作られる対話形式のチュートリアルです。
コンソールさえあれば簡単に学ぶことが出来るのでお手軽です。

元は英語ですが有志たちにより多言語化されており日本語にも対応しているので言語選択により日本語で学ぶことが出来ます。

learnyounodeの難易度としては、JavaScriptの基本はおさえており、Node.jsも入門から基本操作や幾つかのモジュールを触ったことがあれば解けるのではないでしょうか?
問題はNodeの基本といえる機能を一通り出してくれるので全問解ければNodeの概要は理解できたと言えるかもしれません。Nodeの理解や力試しにはもってこいです。

インストール

$ npm install -g learnyounode




言語選択がない場合はlearnyounode-jpをインストールしてください。

$ npm install -g learnyounode-jp

インストールできたらlearnyounodeコマンドで起ち上げます。

$ learnyounode

そこで言語選択をするか -l ja オプション追加で日本語に変換できます。
問題が出されたらその条件のアプリを作成し verify コマンドで正解かどうか検証します。



$ learnyounode verify [作成したファイル]

で正解すると[完了済み]が付きます。

他にもチュートリアルが幾つか用意されています。

NodeSchool



learnyounodeを解いてみる(2問目)
learnyounodeを解いてみる(3問目)
learnyounodeを解いてみる(4問目)
learnyounodeを解いてみる(5問目)
learnyounodeを解いてみる(6問目)
learnyounodeを解いてみる(7問目)
learnyounodeを解いてみる(8問目)

2015年10月5日月曜日

STLのcountを使う(C++)

STLのcount

STLのalgorithmライブラリに含まれるcountはIteratableなオブジェクトに現れる要素の個数を数えるだけのアルゴリズムです。

定義は
template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type
    count (InputIterator first, InputIterator last, const T& val)
{
  typename iterator_traits<InputIterator>::difference_type ret = 0;
  while (first!=last) {
    if (*first == val) ++ret;
    ++first;
  }
  return ret;
}
となっています。 簡単なアルゴリズムですが要素を数える必要がある場合は使っても良いかもしれません。

使用例:
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>

using namespace std;
/* rand() による乱数をカウントする */
void randomTest(const size_t size, const size_t max) {

  vector<int> vec;
  srand((unsigned int)time(NULL));

  for(int i = 0; i < size; i++) {
    vec.push_back(rand() % max);
  }

  for(int i = 0; i < max; i++) {
    const int cnt = count(vec.begin(), vec.end(), i);
    cout << i << "は" << cnt << "個あります" << endl;
  }

}

int main() {

  size_t size = 10000;
  size_t max = 10;

  randomTest(size, max);

  return 0;
}

結果:

0は1021個あります
1は979個あります
2は1016個あります
3は974個あります
4は1013個あります
5は965個あります
6は1025個あります
7は1005個あります
8は1004個あります
9は998個あります

2015年9月26日土曜日

文字列から改行文字を消す(C言語)

文字列の改行を消す

Cで入力文字列を扱っているとfgetsなど改行まで入り込む場合があります。それを消すための簡単なコード。

例:
#include <stdio .h>
#include <string .h>

#define LEN 32

/* 最期に入る改行を取り除く関数 */
void lntrim(char *str) {
  char *p;
  p = strchr(str, '\n');
  if(p != NULL) {
    *p = '\0';
  }
}


int main() {

  char str[LEN];

  puts("[trim]");

  printf("Please input string > ");
  fgets(str, sizeof(str), stdin);

/* trim 前*/
  printf("[%s]\n", str);

  lntrim(str);
/* trim 後 */
  printf("[%s]\n", str);

  return 0;

}
文字列からstrchr関数で文字のある場所を探しだし改行('\n')を('\0')終端に変えています。

strchr関数を使わない場合はループでマッチさせて同じように書き換えます。


/* strchr を使わない改行削除 */
void lntrim(char *str) {
  int i = 0;
  while(1) {
    if(str[i] == '\n') {
      str[i] = '\0';
      break;
    }
    i++;
  }
}


2015年9月12日土曜日

Sassのエラー

SassのError: Inconsistent indentation:


Sassコマンドでcss変換をかけたら「Error: Inconsistent indentation: 1 tab was used for indentation, but the rest of the document was indented using 4 spaces.」というエラーが出ました。一見、タブ関連の間違いかと思いますが、拡張子の間違いでした。Scss形式で書いた場合の拡張子は.scssです。

style.css → style.scss

こういう細かい間違いは気をつけなくてはならないですね。





NBAの1試合平均チームスタッツ (2025-26レギュラーシーズン)

前回 の元となったデータ、チーム毎の各スタッツ平均です。   team games w l win% PTS AST BLK STL ...