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

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





2015年8月17日月曜日

JavaScriptの配列


JavaScriptの配列

JavaScriptにも他のプログラミング言語の同様に配列を装備しています。 ただし、JavaScriptの配列はCやJavaの様に最初に長さや型が決定される配列では無く、その柔軟さはむしろリストに近いでしょう
実態は配列Objectであり、pushやイテレーターなど様々なプロパティや機能が用意されています。

配列の宣言

JavaScriptの配列の宣言方法は主に2つあります。 配列リテラルを使う方法と、Arrayコンストラクタで生成する方法です。 以下はどちらも同じ配列になります。
//配列リテラル記法
var nums = [10, 20, 30];
document.writeln(nums); //10,20,30

//Arrayコンストラクタ
var nums = new Array(10, 20, 30);
document.writeln(nums); //10,20,30
配列コンストラクタで生成する方法は引数が一つだと、配列の長さになり複数の配列だと配列要素そのものになります。
// 10,20,30の3つの要素を持つ配列
var nums = new Array(10, 20, 30);
document.writeln(nums); //10,20,30

// 10つの空要素を持つ配列
var nums = new Array(10);
document.writeln(nums); // ,,,,,,,,,
この様にArrayコンストラクタは引数が一つか複数かによって生成される配列が変わり紛らわしいので通常は配列リテラルが使われます。 Arrayコンストラクタが有効な場面は配列の長さを先に決めることが出来る点です。
//要素は決定していなが100の長さの配列を確保しています。
var nums = new Array(100);
長さは自然数でなければならないので以下はErrorです
var nums = new Array(0.1); //少数を使用しているSyntexError
var nums = new Array(-1); //マイナスの整数SyntexError
宣言時に変数側にブラケットを書くことは出来ません。このあたりはCなどと違います。
// 10の要素を確保しようとするがSyntaxError
var arr[10] = new Array();
また、いきなりブラケット演算子を使用して配列にすることもできません。 配列変数は最初に配列であると宣言しなければいきなり要素にアクセスできません。
var nums[4] = 5; //SyntaxError いきなり要素に代入している

var nums = []; //まず宣言
var nums[4] = 5; // 前に配列宣言されていれば何番目に入れようとも可能

配列の要素

JavaScriptの配列は柔軟なので、要素数や型を気にせず入れることが出来ます。
var arr = [10, "str", true, function(arg) {}, null, undefined, {}];
console.log(arr); //[10, "str", true, function, null, undefined, Object]
ただし、何も考えずに入れても扱いにくいだけですので、通常はJSONの様に決まったフォーマットなどで有効な使い方でしょう。

配列要素のアクセス

配列要素へのアクセスには、ブラケット演算子[]の0から数えた要素の番号を添え字として指定します。 これはCやJavaなど他の言語と変わりないので特に違和感ないでしょう。
var nums = [10, 20, 30];
document.writeln(nums[1]); // 20が表示される
また配列にはlengthという特殊なプロパティがセットされ全体の長さを取得できます。 これも他の言語と同じような仕組みなので違和感無く使えるでしょう。それによりfor文で全要素にアクセスできます。
var nums = [10, 20, 30];

document.writeln("length = " + nums.length); 
for(var i = 0; i < nums.length; i++) {
    document.writeln(nums[i]);
}
結果:
length = 3
10
20
30

配列とオブジェクト

JavaScriptの配列の実態はArrayオブジェクトです。ですからオブジェクトとしてプロパティを持ちメソッドを使用できます。
var arr = ["one", "two", "three"];

document.writeln(arr.toString()); //文字列として表示
document.writeln(arr); //内部でtoStringメソッドが呼び出される
document.writeln("length = " + arr.length); //lengthプロパティで個数を出力
document.writeln(typeof arr);
結果:
one,two,three
one,two,three
length = 3
object

配列を出力させると自動的にtoStringメソッドが使用され、文字列として表示されます。 typeofでタイプを調べるとobjectが表示されるように実態はオブジェクトです。
lengthプロパティは特殊なプロパティで配列の個数を出力し配列の要素を追加すれば自動的に増えます。
arr.push("four"); //pushプロパティによる追加
document.writeln(arr);
document.writeln("length = " + arr.length);

arr[4] = "five";
document.writeln(arr);
document.writeln("length = " + arr.length);
結果:
one,two,three,four
length = 4
one,two,three,four,five
length = 5

以上は直感的にも理解できるでしょう。 では飛び値の要素を追加したりlength値自体に代入するとどうなるでしょうか?
arr[9] = "ten";
document.writeln(arr);
document.writeln("length = " + arr.length);
document.writeln(arr[5]);

arr.length = 3;
document.writeln(arr);
document.writeln("length = " + arr.length);
結果:
one,two,three,four,five,,,,,ten
length = 10
undefined
one,two,three
length = 3

このように飛び値までの要素はundefinedで埋められ配列の長さは与えられた数まで伸びます。 そしてlength自体に代入するとその長さまでの配列になります。lengthプロパティは単に配列と紐付けられた変数に過ぎないということが分かります。

2015年8月7日金曜日

コマンドプロンプトからC/C++の64ビット用実行ファイルを作る

WindowsのC/C++開発環境

普段Linuxで開発を行なっている方も場合よってはWindowsでC/C++を試す機会があるかもしれません。
そんな中、Visual Studioの様なIDEを一々起ち上げるのは面倒です。Visual Studioにはclコマンドがありちょこっと試したい場合などに重宝します。

clコマンドはデフォルトでは32bitなので64bitで起ち上げてみます。

環境:
OS: Windows8.1(64bit)
IDE: Visual Studio Community 2015

まずVisual Studioはインストールしておいてください。
Visual Studio Communityはフルで24GBくらいあり個人が使うには恐ろしいほど膨大です。

clコマンド使用するには通常「開発者用コマンドプロンプト」というのをクリックします。
このショートカットはWindows8環境で以下の場所にあります。

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\開発者コマンド プロンプト for VS2015

普通に起ち上げると32bit環境で"C:\VBインストール先\Microsoft Visual Studio 14.0\"が作業フォルダになります。
これを64bit環境でコンパイルしたい場合は、ここに書いてあるとおりvcvarsall.batにamd64という引数をつけて起動させます。

方法: 64 ビットの Visual C++ ツールセットをコマンド ラインから有効にする
https://msdn.microsoft.com/ja-jp/library/x4d2c09s(v=VS.120).aspx

vcvarsall.batの位置は、"C:\VBインストール先\Microsoft Visual Studio 14.0\VC" にあり、コマンドプロンプトから叩けばいいだけです。

ただそこから作業場所を移動させるのが面倒くさいので、バッチファイルに書いてしまいましょう。
notepadを開き


@echo off
rem バッチファイルのある場所に移動
cd /d %~dp0
rem 64bitで起動させる
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64


と書きます。
そしてそのファイルを「cl64.bat」とでも名前をつけて保存します。
このバッチファイルを作業フォルダにおいておけばそれを叩くだけでその場所をカレントフォルダにした64bit C/C++簡易コンパイラの出来上がりです。

テストソース:
[C]
64test.c

#include <stdio.h>

int main() {


 int *pint;
 int len;

 len = sizeof(pint);
 printf("size = %d\n", len);

 return 0;

}


実行:
> cl 64test.c
> 64test
size: 8


[C++]
64test.cpp

#include <iostream>

int main(void) {

 int *pnum;
 int len;

 len = sizeof(pnum);
 std::cout << "size: " << len << std::endl;

 return 0;

}

実行:
> cl /EHsc 64test.cpp
> 64test
size: 8



間違いなく実行されてsize: 8という結果がでたら64bit用の実行ファイルが出来ています。
通常の開発者コマンドプロンプトは32bit用なのでsize: 4という結果になります。

Windows で簡易的に64bit用のC/C++の実行してみたいときに便利です。

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

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