Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

2013年12月

  • コマンドラインで > を使うと、標準出力をファイルにリダイレクトできる
  • 2> を使うと、標準エラーをリダイレクトできる
  • printf()は、fprintf(stdout)のショートカットである
  • fprintf(stderr)で標準エラーを出力できる
  • 通常、1つのプロセスが持てるデータストリームの数は256個まで
  • コマンドライン引数は、文字列ポインタの配列としてmain()に渡される
/**
* ピザの注文を処理するプログラム
*/

#include <stdio.h>
#include <unistd.h> // POSIXライブラリ(getopt()を使うために読み込み)

int main(int argc, char *argv[]) // argcには引数の個数、argvには引数が入っている
{
    char *delivery = "";
    int thick = 0;
    int count = 0;
    char ch;

    // getopt()の第3引数で、オプションの名前を指定する。
    // getopt()の第3引数で、オプション名の後ろに:をつけると、オプション名の後ろに引数が続くことを示す
    while ((ch = getopt(argc, argv, "d:t")) != EOF) { // dオプション(引数有り)とtオプション(引数無し)が有効
        switch (ch) {
            case 'd':
                delivery = optarg; // optargはオプションの引数
                break;
            case 't':
                thick = 1;
                break;
            default:
                fprintf(stderr, "Unknown option: '%s'\n", optarg);
                return 1;
        }
        // optindにはコマンドラインから読み込んだ文字列数が格納される
        argc -= optind;
        argv += optind;

        if (thick)
            puts("Thick crust.");

        if (delivery[0])
            printf("To be delivered %s.\n", delivery);

        puts("Ingredients:");

        for (count = 0; count < argc; count++)
            puts(argv[count]);
    }

    return 0;
}

感想

標準入力・標準出力・標準エラーや、リダイレクト、パイプ、小さなツールの組み合わせ等、CプログラムというよりはUnix(の、主にコマンドライン)入門という趣の章だった。

そもそもCはUnixのために作られた言語なので、内容的には妥当だと思う。ただ、Windows環境の人は違和感を感じる章かも。

また、本章で題材とした「CSVからJSONへの変換」のような仕事を行う「小さなツール」は、Cよりも、スクリプト言語で書いたほうが簡単。例えばRubyなら、CSVからJSONへの変換は、以下の3行で書ける(CSVデータの取り扱いは面倒なので、自前で実装するのではなく、言語やライブラリの力を借りるべき)。

require 'csv'
require 'json'

CSV.parse(data).to_json
出典:http://stackoverflow.com/questions/5357711/csv-to-json-ruby-script

2014年3月17日追記

本記事の課金方式に関する説明は、現在のドットインストールには当てはまりません(「登録日〜月末」ではなく、「登録日から1ヶ月」に変更されています)。

最新情報はドットインストールのヘルプページをご覧ください。




ドットインストールといえば、Web開発者の間ではおなじみの「3分動画でマスターする初心者向けプログラミング学習サイト」です。各種言語やツールの入門レベルの内容を分かりやすい動画で解説することに定評があります。

そんなドットインストールですが、最近、有料会員向けのプレミアムサービスが導入されました。これに伴い、以前は会員限定機能だった「ソースコードの閲覧」が、プレミアムサービス利用者限定の機能になりました。他に、文字起こし・デモの確認・ソースコード検索もプレミアム限定機能ですが、「ソースコードの閲覧」が最も重要な機能でしょう。

ソースコードを閲覧できなくても、動画の画面上にソースコードは表示されるので、レッスンを受けることは無料会員でもできます。ただ、画面を見ながら一言一句正確な文字を打ち込むのは結構大変なので、本格的に利用するならプレミアムサービスを利用したほうが効率的です。


では、ドットインストールのプレミアムサービスは、どのような課金内容なのでしょう?

ドットインストールのプレミアムサービスは、プレミアムサービスの説明ページでは、「月額880円」と表示されています。しかし、具体的な課金方式については説明がありません。

プレミアムサービスの課金フローを普通に辿ると、以下のようになります。

(1) プレミアムサービスページで「プレミアムサービスに登録する」 をクリックdotinstall1

(2) プレミアムサービスにアップグレードページでクレジットカード番号を入力し、「購入を実行」をクリック
dotinstall2

この2ステップだけで登録が完了すると思われます(実際には登録してないので、「購入を実行」後の遷移は不明)。この間、課金方式の説明は一切ありません。「月額課金」とはいうものの、「月ごとに課金 or 30日毎に課金」なのか、初月の料金の扱い(日割りの有無)や、プレミアムサービスの停止方法等、色々と疑問はあります。

さすがに何も情報を出していないのはありえないと思って色々見てみたら、(見つけにくいけど)ありました。
dotinstall3

このプレミアム会員利用規約を読むと、課金方式について必要なことはひと通り書いています。要所を引用すると、
利用料金は、登録日にかかわらず、登録日が属する月より発生いたします。登録日と同月に登録を解約された場合は1ヶ月分の利用料金が発生するものとします。
本サービスの提供期間は、プレミアム会員への登録日より、その登録日が属する月の月末までとなります。
本サービスは、プレミアム会員が有料登録を解約されない限り、月初に自動更新されるものとし、プレミアム会員はこれに同意するものとします。
登録の解約日が月の途中であっても、日割りによる利用料の割引は行われず、解約日が属する月分の利用料が発生します。
特に重要なのは、「初めて登録した月のサービス利用期間は、登録日から月末まで。利用料の日割りはされない」ということでしょう。月末に登録したら、ほとんど利用できなくても、1ヶ月分の請求がされるということです。

ということで、ドットインストールのプレミアムサービスを使うなら、利用開始は月末ではなく、月の初めにするのが良いでしょう。



ところで、Webサービスの利用規約って、責任逃れのオンパレードなので、読むとサービスへのロイヤリティが低下しますよね。ドットインストールプレミアムサービスの利用規約でも、何じゃそりゃって記述があります。

「本規約に変更があった場合は、本サイト上にて表示された時点より効力を生じるものとします。またその時点より、プレミアム会員は変更された規約に同意したものとみなされます。」(変更があっても通知無し???)

「当社はプレミアム会員の事前の承諾を得ることなく、本サービスの利用料金を変更する場合があります。プレミアム会員は変更に同意しない場合、本サービスを解約するものとし、解約せずに継続利用した場合、変更に同意したものとみなします。」(事前通知無しで料金上がるの???)


ちなみに、常日頃サービスの品質が高いと感じているさくらインターネットの約款を見ると、以下のようになっています。

「当社は、本基本約款またはサービス別約款を変更する場合は、変更する7日前までに利用者に通知します。」(基本約款第4条第2項)

「第4条第2項 に従って利用者に通知することにより、契約期間内でも、利用料金を変更することができるものとします。」(基本約款第11条第4項)

こちらは、いちユーザーとして見ても理不尽に感じることのない規約になっています。


年末からドットインストールのプレミアムサービス利用しようか検討してたのですが、月末だと損なのと、規約を読んだらやる気が無くなったので、プレミアムサービスの利用は一旦見合わせます。。。

  • string.hヘッダファイルには、便利な文字列関数が含まれている。
  • strstr(a,b)は、文字列aの中の文字列bのアドレスを返す。
  • strcpy()は、ある文字列を別の文字列にコピーする。
  • strcmp()は2つの文字列を比較する。
  • strcat()は2つの文字列を連結する。
  • strchar()は、文字列内の文字の位置を見つける。
  • strlen()は、文字列の長さを求める。
/* 入力文字列を反転して表示するプログラム */

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

void print_reverse(char *s)
{
    size_t len = strlen(s);
    char *t = s + len - 1;
    while (t >= s) {
        printf("%c", *t);
        t = t - 1;
    }
}

int main()
{
    char str[100];
    printf("反転する文字列を入力して下さい(100文字以内):");
    fgets(str, sizeof(str), stdin);
    print_reverse(str);
    return 0;
}

ファイルテスト演算子(読み・書き・実行・存在):

#!/usr/bin/env perl
use v5.12;
use warnings;

# コマンドラインに指定されたファイル名のリストを受け取って、それぞれについて、
# 読み出し可能か、書き込み可能か、実行可能か、又は存在しないか、を表示するプログラム

foreach (@ARGV) {
    say "file: $_";
    if (-r) { # ファイルが読み込み可能か
        say "readable";
    } else {
        say "not readable";
    }

    # 同じファイルに対する2回め以降のファイルテストでは、
    # 「_」を使うと1回めに取得した結果を再利用するので、パフォーマンスが良くなる
    if (-w _) { # ファイルが書き込み可能か
        say "writable";
    } else {
        say "not writable";
    }
    if (-x _) { # ファイルが実行可能か
        say "executable";
    } else {
        say "not executable"
    }
    if (-e _) { # ファイルが存在するか
        say "exists";
    } else {
        say "not exists";
    }
    print "\n";
}

最終更新日時:

#!/usr/bin/env perl
use v5.12;
use warnings;

# コマンドラインに指定されたファイル名のリストを受け取って、
# そのうち最も古いファイルの名前とその古さを日数単位で表示するプログラム

die "No file names supplied!\n" unless @ARGV;
my $oldest_name = shift @ARGV;
my $oldest_age = -M $oldest_name; # -M でファイルの最終更新日を取得

foreach (@ARGV) {
    my $age = -M;
    ($oldest_name, $oldest_age) = ($_, $age)
        if $age > $oldest_age;
}

printf "The oldest file was %s, and it was %.1f days old.\n", $oldest_name, $oldest_age;

ファイルテスト演算子を重ねて使う(Perl v5.10以上):

#!/usr/bin/env perl
use v5.12;
use warnings;

say "Looking for my files that are readable and writable";
die "No files specified!\n" unless @ARGV;

foreach my $file ( @ARGV ) { # -o:所有している
    say "$file is readable and writable" if -o -r -w $file;
}

元ネタ:プラグインを使わずにMarkdownでWordPressのブログを更新する(実践編)

今まで、Markdownでブログを書くときは、Mouでひと通り書く→HTMLファイルとして出力→出力したHTMLファイルのbody部分をコピペ という工程でやってました。

今日初めて知ったんですが、MouにはHTMLファイルを出力せずともHTML変換を行う機能があります。
「Cmd + Option + C」です。

Markdownの編集画面で、「Cmd + Option + C」を押すと、現在編集中のMarkdownをHTMLに変換した結果のうち、body内部の部分だけがクリップボードにコピーされます。

例えば、Markdownが下記のような状態だと、
# hoge

fuga
クリップボードには以下の文字列がコピーされます。
<h1>hoge</h1>

<p>fuga</p>
ファイル出力の工程を省けるようになると、だいぶ楽になりますね。

このページのトップヘ