Python(4) Install MySQL by Homebrew

MySQL をインストール

ローカルの環境(Mac)に MySQL をインストール

ChenLab-MacBookAir-3:~ chen$ brew install mysql
==> Installing dependencies for mysql: openssl
==> Installing mysql dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2o_2.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.2o_2.high_sierra.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
/usr/local/etc/openssl/certs

and run
/usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local,
because Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries.

If you need to have this software first in your PATH run:
echo ‘export PATH=”/usr/local/opt/openssl/bin:$PATH”‘ >> ~/.bash_profile

For compilers to find this software you may need to set:
LDFLAGS: -L/usr/local/opt/openssl/lib
CPPFLAGS: -I/usr/local/opt/openssl/include

==> Summary
🍺 /usr/local/Cellar/openssl/1.0.2o_2: 1,792 files, 12.3MB
==> Installing mysql
==> Downloading https://homebrew.bintray.com/bottles/mysql-8.0.11.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring mysql-8.0.11.high_sierra.bottle.tar.gz
==> /usr/local/Cellar/mysql/8.0.11/bin/mysqld –initialize-insecure –user=chen –basedir=/usr/local/Cell
==> Caveats
We’ve installed your MySQL database without a root password. To secure it run:
mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
mysql -uroot

To have launchd start mysql now and restart at login:
brew services start mysql
Or, if you don’t want/need a background service you can just run:
mysql.server start
==> Summary
🍺 /usr/local/Cellar/mysql/8.0.11: 254 files, 232.6MB
ChenLab-MacBookAir-3:~ chen$

インストールが終わったら、内容を見てみる

ChenLab-MacBookAir-3:~ chen$ brew info mysql
mysql: stable 8.0.11 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/8.0/en/
Conflicts with:
mariadb (because mysql, mariadb, and percona install the same binaries.)
mariadb-connector-c (because both install plugins)
mysql-cluster (because mysql, mariadb, and percona install the same binaries.)
mysql-connector-c (because both install MySQL client libraries)
percona-server (because mysql, mariadb, and percona install the same binaries.)
/usr/local/Cellar/mysql/8.0.11 (254 files, 232.6MB) *
Poured from bottle on 2018-06-25 at 13:33:16
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/mysql.rb
==> Dependencies
Build: cmake ✘
Required: openssl ✔
==> Requirements
Required: macOS >= 10.10 ✔
==> Options
–with-debug
Build with debug support
–with-embedded
Build the embedded server
–with-local-infile
Build with local infile loading support
–with-memcached
Build with InnoDB Memcached plugin
–with-test
Build with unit tests
==> Caveats
We’ve installed your MySQL database without a root password. To secure it run:
mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
mysql -uroot

To have launchd start mysql now and restart at login:
brew services start mysql
Or, if you don’t want/need a background service you can just run:
mysql.server start
ChenLab-MacBookAir-3:~ chen$

MySQL動作確認

MySQLを起動して動作確認する。付いてにテスト用のデータベースを用意しておく。

ChenLab-MacBookAir-3:~ chen$ mysql.server start
Starting MySQL
.. SUCCESS!
ChenLab-MacBookAir-3:~ chen$ $ mysql -uroot
-bash: $: command not found
ChenLab-MacBookAir-3:~ chen$ mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11 Homebrew

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> CREATE DATABASE mysqltest DEFAULT CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE USER hoge@localhost IDENTIFIED BY ‘password’;
Query OK, 0 rows affected (0.10 sec)

mysql> GRANT ALL ON mysqltest.* TO hoge@localhost;
Query OK, 0 rows affected (0.01 sec)

mysql> \q
Bye
ChenLab-MacBookAir-3:~ chen$

MySQLに接続するパッケージ

Python3でMySQLに接続する方法についてですが、mysqlclinetを使う方法がオススメらしい。さっそくpipでインストールしましょう。

pip install mysqlclient

しかしインストールがエラーで終わらなかった。違う方法で挑戦。

ChenLab-MacBookAir-3:work-Python chen$ pip install mysql-connector-python-rf
Collecting mysql-connector-python-rf
Downloading https://files.pythonhosted.org/packages/21/79/2ff01ab7aa08db3a16b70b990c579c1024c6b2a734263cc7513a758867de/mysql-connector-python-rf-2.2.2.tar.gz (11.9MB)
100% |████████████████████████████████| 11.9MB 777kB/s
Building wheels for collected packages: mysql-connector-python-rf
Running setup.py bdist_wheel for mysql-connector-python-rf … done
Stored in directory: /Users/chen/Library/Caches/pip/wheels/87/58/fb/d95c84fad7e1bebfed324c13e107ebb08e1997c9226532859a
Successfully built mysql-connector-python-rf
Installing collected packages: mysql-connector-python-rf
Successfully installed mysql-connector-python-rf-2.2.2
ChenLab-MacBookAir-3:work-Python chen$

ChenLab-MacBookAir-3:work-Python chen$ pip list
Package Version
————————- ——-
mysql-connector-python-rf 2.2.2
nose 1.3.7
numpy 1.14.3
pip 10.0.1
setuptools 39.1.0
TBB 0.1
wheel 0.31.0
ChenLab-MacBookAir-3:work-Python chen$

PythonからMySQLに接続

Pythonのプログラムは、上記で作成したデーターベースに「booklist」というテーブルを作成し、そこにPythonという本のデーターを追加するという内容だ。

# -*- coding: utf-8 -*-
#import MySQLdb
#
#conn = MySQLdb.connect(db='mysqltest',user='hoge',passwd='password',charset='utf8mb4')
import mysql.connector

conn = mysql.connector.connect(user='root', password='', host='localhost', database='mysqltest')
c = conn.cursor()
#tableが既にある場合は一回削除します
c.execute('DROP TABLE IF EXISTS booklist')
#tableを作成します
c.execute('''
    CREATE TABLE booklist(
      id integer,
      name text,
      kakaku integer
    )
''')
#tableにデータを入れます
c.execute('INSERT INTO booklist VALUES(%s,%s,%s)',(1,'Python',2400))
conn.commit()
c.execute('SELECT * FROM booklist')
for row in c.fetchall():
    print(row)
conn.close()

出力も短い一行だけ。

ChenLab-MacBookAir-3:work-Python chen$ python mysql-test.py
(1, u’Python’, 2400)

 

参考

Mac へ MySQL を Homebrew でインストールする手順

Python(3) OpenCV Face Detection

Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識)

静止画の特徴検出

静止画: 画像ファイルを読み込んで顔検出と瞳検出

Macにhomebrewでopencv3をインストールした場合、

/usr/local/opt/opencv/share/OpenCV/haarcascades/
に学習済のHaar-like特徴を用いた分類器のデータ(xmlファイル)がある。

以下のようにいくつかの種類のデータが用意されている。

  • 正面の顔検出用: haarcascade_frontalface_default.xml
  • 瞳検出用: haarcascade_eye.xml
  • 笑顔検出用: haarcascade_smile.xml

cv2.CascadeClassifier()でパスを指定してxmlファイルを読み込む。

サンプル画像の用意

上の写真をダウンロードして保存し、必要なフォルダを作成して、写真を移動してください。

$ mkdir data
$ mkdir data/src
$ mkdir data/dst
$ cp ~/Downloads/Lenna_test_image.png data/src/lena_square.png

検出領域の枠を描画

そしてViでサンプルコードを作成

$ vi test2.py 

サンプルコード(test2.py)

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'\
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'\
                   'OpenCV/haarcascades/haarcascade_eye.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

cv2.imwrite('data/dst/opencv_face_detect_rectangle.jpg', src)

 

処理結果

$ python2 test2.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 256
drwxr-xr-x 3 chen staff 96 6 20 00:48 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_face_detect_rectangle.jpg が作成されたことが確認した。

検出領域にモザイク処理

検出した領域にモザイクをかけたりすることもできる。

Viでサンプルコードを作成

$ vi test3.py 

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'\
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'\
                   'OpenCV/haarcascades/haarcascade_eye.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

ratio = 0.05

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        # cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
        eye = face[ey: ey + eh, ex: ex + ew]
        small = cv2.resize(eye, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
        face[ey: ey + eh, ex: ex + ew] = cv2.resize(small, (ew, eh), interpolation=cv2.INTER_NEAREST)

cv2.imwrite('data/dst/opencv_eye_detect_mosaic.jpg', src)

処理結果

$ python2 test3.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 512
drwxr-xr-x 4 chen staff 128 6 25 01:45 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 108333 6 25 01:51 opencv_eye_detect_mosaic.jpg
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_eye_detect_mosaic.jpg が作成されたことが確認した。

参考

Python(2) OpenCV Read image

画像ファイルを読み込み

おなじみのlenaさんの画像を使う

PythonのOpenCVで画像ファイルを読み込みはcv2.imreadを使う。

実行するコードと画像が別の場所にあるとして、
一度image_pathに画像のディレクトリのパスを指定します。
ここでは、”/Users/chen/Downloads/”とする。

動作確認環境は以下の通り
– Python 3.6
– OpenCV 3.2

何はともあれ画像出力

read_and_show.py
import cv2

#画像読み取り
image_path = "lenaさんの画像を格納してるディレクトリのパス" #例えば "/Users/chen/Downloads/"
image = cv2.imread(image_path+"lena.jpg")  #画像読み取り imread(filename)

#画像表示
cv2.imshow("image",image) #画像出力 imshow(window_name, matrix)
cv2.waitKey()             #キー入力待ち waitKey(delay=0)
cv2.destroyAllWindows()   #ウィンドウを消す destroyAllWindows()

無事表示ができました。

問題は、キーを押してもプログラムは終了されない、そのプロセスを殺して、やっと終了できた。

参考:

  • https://note.nkmk.me/python-opencv-imread-imwrite/

Python(1) Install OpenCV by Homebrew

Python, OpenCVの導入

ChenLab-Mac-Urania:~ chen$ python -V
Python 2.7.10
ChenLab-Mac-Urania:~ chen$ brew -v
Homebrew 1.5.10

もしHomebrew導入されてない場合は、下記のコマンドで導入

/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

続いて、opencvの導入

ChenLab-Mac-Urania:~ chen$ brew install opencv
Updating Homebrew…

沢山のメッセージが流れ、終わったらしい。

インストールしたものを確認。

ChenLab-Mac-Urania:~ chen$ which python3
/usr/local/bin/python3
ChenLab-Mac-Urania:~ chen$ which python2
/usr/local/bin/python2
ChenLab-Mac-Urania:~ chen$ python3 -V
Python 3.6.5
ChenLab-Mac-Urania:~ chen$ python2 -V
Python 2.7.15
ChenLab-Mac-Urania:~ chen$

C言語認定試験(2級出題範囲)

参考(2級出題範囲)

出題内容
定数 浮動小数点定数 指数形式を許す
浮動小数点接尾語はf、l、F、Lのいずれか
整数定数 整数接尾語として長語接尾語(l、L)を含む
文字定数 拡張表記は8進拡張表記、16進拡張表記を含む
文字列リテラル 拡張表記は8進拡張表記、16進拡張表記を含む
列挙定数
演算子 ビット演算子、条件演算子、代入演算子、キャスト演算子、ポインタ/アドレス演算子、構造体演算子、sizeof演算子
宣言指定子 void、short、long、float、double、構造体共用体指定子(struct、union)、列挙型指定子(enum)、型修飾子(const)、typedef
変数 上記型指定子の単純変数、配列
外部定義
プリプロセッサ機能 ファイルの包含
ライブラリ関数
数学関数<math.h>
double cos(double x); double sin(double x);
double tan(double x); double exp(double x);
double log(double x); double log10(double x);
double pow(double x, double y);
double sqrt(double x); double ceil(double x);
double fabs(double x); double floor(double x);
入出力関数<stdio.h>
NULL、EOF、FILE、stderr、stdin、stdout、
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);
int fscanf(FILE *stream, const char *format, …);
int fprintf(FILE *stream, const char *format, …);
int sscanf(const char *s, const char *stream, …);
int sprintf(char *s, const char *stream, …);
int fgetc(FILE *stream, …); int fputc(int c, FILE *stream);
char *fgets(char *s,int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int getc(FILE *stream, …); int putc(int c, FILE *stream);
char *gets(char *s);int puts(const char *s);
int ungetc(int c, FILE *stream);
一般ユーティリティ関数<stdlib.h>
NULL  double atof(const char *nptr);
int atoi(const char *nptr);
long int atol(const char *nptr);
int rand(void);  void srand(unsigned int seed);
int abs(int i);  long int labs(long int j);
文字列操作関数<string.h>
NULL  size_t
char *strcpy(char *sl,const char *s2);
char *strncpy(char *sl,const char *s2, size_t n);
char *strcat(char *sl,const char *s2);
char *strncat(char *sl,const char *s2, size_t n);
int strcmp(const char *sl,const char *s2);
int strncmp(const char *sl,const char *s2, size_t n);
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
char *strstr(const char *sl, const char *s2);
size_t strlen(const char *s);
その他
  • main関数の引数、整数型以外の関数
  • 自己参照構造体
  • 変数の記憶クラスと通用範囲(auto、static、register、extern)

※3級出題範囲含む

注)各級とも日本工業規格 (JIS) X3010 で出題・解答する。

C言語認定試験(3級出題範囲)

C言語プログラミング能力認定試験
(C-Language Programming Skills Qualification Test)

http://www.sikaku.gr.jp/js/cp/

C言語認定試験とは

C言語を駆使した応用プログラムの作成能力を認定

C言語は、記述の自由度が高く、使用可能なプラットホームが多いなど、使用できる場面が多いことから、現在最も広く普及しているプログラミング言語です。このC言語のプログラミング能力の測定を目的に、1992年より開始されたのがサーティファイ 情報処理能力認定委員会が主催する「C言語プログラミング能力認定試験」です。
保有スキルのレベルに合わせた3段階の認定基準を設けることにより、これから新たにプログラミングの学習を始める方から、現在プログラマやシステム・エンジニアとして既に活躍されている高度IT技術者の方まで、幅広い皆様から受験いただいています。

初学者から、ビジネスシーンで活躍できるプログラマまで、幅広いスキルを測定

「C言語プログラミング能力認定試験」は、これからプログラミングを学び始める方を対象とした「3級」から、プログラマやシステム・エンジニアとして活躍されている方の保有スキルを客観的にアピールできる「1級」まで、幅広いスキルを測定しています。
特に「1級」では、実際にPCを使用して、プログラムの仕様変更やこれに伴うプログラミング作成(コーディング・コンパイル・デバッグ)を行う、極めて実践的な資格・検定試験として、IT業界でも高く評価されています。

基本情報技術者試験の午後の試験対策としても有効

「C言語プログラミング能力認定試験」の「2級」及び「3級」は、経済産業省認定「基本情報技術者試験」の「午後問題」の出題形式も意識して作成しています。そのため、「基本情報技術者試験」の学習と連動した活用も多く見られます。保有スキルのレベルに応じた級位取得を目標としていただくことで、C言語のプログラミング能力を高めるだけではなく、「基本情報技術者試験」の合格にもつなげていくことができます。

C言語認定試験について

試験名

C言語プログラミング能力認定試験
(C-Language Programming Skills Qualification Test)

試験目的

C言語を駆使して応用プログラム(言語処理系、ユーティリティなど)を作成する能力を認定します。

認定基準

一級 C言語を駆使し、応用プログラム(言語処理系、ユーティリティなど)が作成できる能力を有する。また使用しているOSについて理解をしている。
二級 小規模のプログラム(500行程度)が適切に(理路整然、簡潔、正しく、速く)書ける。また各種基本アルゴリズムを理解している。
三級 C言語の概念を理解し、簡単なプログラムが書ける。

 

参考(3級出題範囲)

出題内容
定数 整数定数 10進定数、8進定数、16進定数
整数接尾語は符号無し接尾語(u、U)のみ
文字定数 ワイド文字定数(L’c文字の列’)を除く
拡張表記は単純拡張表記のみ
文字列リテラル ワイド文字列リテラル(L”s文字の列”)を除く
拡張表記は単純拡張表記のみ
演算子 算術演算子、インクリメント演算子、デクリメント演算子、(算術の)代入演算子、関係演算子、等値演算子、論理関係演算子、括弧演算子、コンマ演算子
型指定子 char、int、unsigned、signed
変数
  • 上記型指定子の単純変数、配列
  • 初期化の構文
基本制御文 break、continue、do、for、if、return、switch、while
プリプロセッサ機能 #define、#include
ライブラリ関数
入出力関数<stdio.h>
EOF  NULL
int printf(const char *format, …);
int scanf(const char *format, …);
int getchar(void);  int putchar(int c);
文字操作関数<ctype.h>
int isalnum(int c);  int isalpha(int c);
int iscntrl(int c);  int isdigit(int c);
int isgraph(int c);  int islower(int c);
int isprint(int c);  int ispunct(int c);
int isspace(int c);  int isupper(int c);
int isxdigit(int c);  int tolower(int c);
int toupper(int c);
その他 Cの歴史と特徴

 

現在使用するC言語教科書には、文字操作関数<ctype.h>の内容について不足するので、

下記のサイトを参考にしてください。

  • http://www.c-tipsref.com/reference/ctype.html
  • http://www.bohyoh.com/CandCPP/C/Library/ctype_h.html

 

a C HTTP Client

C#やJavaでは簡単にhttp Clientプログラムができる。C言語ではソケットを作成するところから必要です。またWindowsとLinux両方対応するように書いたのでプログラムが長くなる。

(bcc32で動作確認済み)

プログラムは、最初にsocketを生成してWebサーバに接続し、テキスト形式でHTTPリクエストメッセージを作成してWebサーバに送信する。
HTTPリクエストメッセージは、複数行から成り立つ一連のデータ列。ここでいう1行とは、終端にCR(キャリッジリターン、16進の0x0d)とLF(ラインフィード、16進の0x0a)を持つデータの単位を示す。ほぼ、通常のテキスト・データの1行と等しくなる。メッセージ・ヘッダとメッセージボディ部に分かれ、両者は空行(単独のCR+LF)で分割される。

httpを理解するには、telnetで手入力でHTTPをしゃべってみるがいい方法。
https://www.softel.co.jp/blogs/tech/archives/263

まずプログラムをリストする:

#include <stdio.h> /* printf, sprintf */
#include <stdlib.h> /* exit, atoi, malloc, free */
// #include <unistd.h> /* read, write, close */
#include <string.h> /* memcpy, memset */
#ifdef __linux__
    #include <sys/socket.h> /* socket, connect */
    #include <netdb.h> /* struct hostent, gethostbyname */
    #include <netinet/in.h> /* struct sockaddr_in, struct sockaddr */
#elif _WIN32
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <windows.h>
    #pragma comment(lib,"ws2_32.lib") //Winsock Library

#else

#endif

struct hostent *server;
struct sockaddr_in serv_addr;
int bytes, sent, received;
char response[4096];
int portno;
char *host;
char *path;

void error(const char *msg) { perror(msg); exit(0); }


#ifdef _WIN32

win_send_http(char *message){
  WSADATA wsa;
  SOCKET s;

  printf("\nInitialising Winsock...");
  if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
  {
      printf("Failed. Error Code : %d",WSAGetLastError());
      return 1;
  }

  printf("Initialised.\n");

  //Create a socket
  if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  {
      printf("Could not create socket : %d" , WSAGetLastError());
  }

  printf("Socket created.\n");

  server = gethostbyname(host);
  memset(&serv_addr,0,sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(portno);
  memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
  //Connect to remote server
  if (connect(s , (struct sockaddr *)&serv_addr , sizeof(serv_addr)) < 0)
  {
      printf("connect failed with error code : %d" , WSAGetLastError());
      return 1;
  }

  puts("Connected");
  if( send(s , message , strlen(message) , 0) < 0)
  {
      printf("Send failed with error code : %d" , WSAGetLastError());
      return 1;
  }
  puts("Data Send\n");

  //Receive a reply from the server
  if((received = recv(s , response , 2000 , 0)) == SOCKET_ERROR)
  {
      printf("recv failed with error code : %d" , WSAGetLastError());
  }

  puts("Reply received\n");

  //Add a NULL terminating character to make it a proper string before printing
  response[received] = '\0';
  puts(response);

  closesocket(s);
  WSACleanup();

  return 0;   // everything OK
}

#endif
#ifdef __linux__

linx_send_http(message) {
  int sockfd;
  int total;

  total = strlen(message);
  /* lookup the ip address */

  server = gethostbyname(host);
  if (server == NULL) error("ERROR, no such host");
      /* create the socket */
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd < 0) error("ERROR opening socket");
      /* fill in the structure */
      memset(&serv_addr,0,sizeof(serv_addr));
      serv_addr.sin_family = AF_INET;
      serv_addr.sin_port = htons(portno);
      memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
              /* connect the socket */
      if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
          error("ERROR connecting");
              /* send the request */

  sent = 0;
  do {
      bytes = write(sockfd,message+sent,total-sent);
      if (bytes < 0)
          error("ERROR writing message to socket");
      if (bytes == 0)
          break;
      sent+=bytes;
  } while (sent < total);
  /* receive the response */
  memset(response, 0, sizeof(response));
  total = sizeof(response)-1;
  received = 0;
  printf("Response: \n");
  do {
     printf("%s", response);
     memset(response, 0, sizeof(response));
     bytes = recv(sockfd, response, 1024, 0);
      if (bytes < 0)
         printf("ERROR reading response from socket");
     if (bytes == 0)
         break;
     received+=bytes;
  } while (1);

  if (received == total)
      error("ERROR storing complete response from socket");

  /* close the socket */
  close(sockfd);

  return 0;   // everything OK
}

#endif

int main(int argc,char *argv[])
{
    int i;
    char message[4096];
    portno = atoi(argv[2])>0?atoi(argv[2]):80;
    host = strlen(argv[1])>0?argv[1]:"localhost";
    path = strlen(argv[4])>0?argv[4]:"/";

    if (argc < 5) { puts("Parameters: <host> <port> <method> <path> [<data> [<headers>]]"); exit(0); }

    /* How big is the message? */
    if(!strcmp(argv[3],"GET"))
    {
      if(argc>5)
          sprintf(message,"%s %s%s%s HTTP/1.0\r\nHost: %s\r\n",
              strlen(argv[3])>0?argv[3]:"GET",               /* method         */
              path,                                          /* path           */
              strlen(argv[5])>0?"?":"",                      /* ?              */
              strlen(argv[5])>0?argv[5]:"",host);            /* query string   */
      else
          sprintf(message,"%s %s HTTP/1.0\r\nHost: %s\r\n",
              strlen(argv[3])>0?argv[3]:"GET",               /* method         */
              path,host);                                    /* path           */
      for(i=6;i<argc;i++)                                    /* headers        */
          {strcat(message,argv[i]);strcat(message,"\r\n");}
      strcat(message,"\r\n");                                /* blank line     */
    }
    else
    {
        sprintf(message,"%s %s HTTP/1.0\r\nHost: %s\r\n",
            strlen(argv[3])>0?argv[3]:"POST",                  /* method         */
            path,host);                                        /* path           */
        for(i=6;i<argc;i++)                                    /* headers        */
            {strcat(message,argv[i]);strcat(message,"\r\n");}
        if(argc>5) {
          sprintf(message+strlen(message),"Content-Length: %d\r\n",(int)strlen(argv[5]));
          sprintf(message+strlen(message),"Content-Type: application/x-www-form-urlencoded\r\n");
        }

        strcat(message,"\r\n");                                /* blank line     */
        if(argc>5)
            strcat(message,argv[5]);                           /* body           */

              sprintf(message,"%s %s HTTP/1.0\r\nHost: %s\r\n",
                  strlen(argv[3])>0?argv[3]:"POST",                  /* method         */
                  path,host);                                        /* path           */
              for(i=6;i<argc;i++)                                    /* headers        */
                  {strcat(message,argv[i]);strcat(message,"\r\n");}
              if(argc>5) {
                sprintf(message+strlen(message),"Content-Length: %d\r\n",(int)strlen(argv[5]));
                sprintf(message+strlen(message),"Content-Type: application/x-www-form-urlencoded\r\n");
              }

              strcat(message,"\r\n");                                /* blank line     */
              if(argc>5)
                  strcat(message,argv[5]);                           /* body           */
    }

    printf("Processed\n");
    /* What are we going to send? */
    printf("Request:\n%s\n",message);

    #ifdef _WIN32

    win_send_http(message);

    #endif
    #ifdef __linux__

    linx_send_http(message);

    #endif

    return 0;
}

 

 

 

このプログラムを利用して、例のTinyWebDBを読み書きしてみる。

まずPostで、データを書き込む

C:\Users\chen\Documents\C\http-client>http-client-3 tinydb.work 80 POST /api/storeavalue/ “tag=presentationtimer&value=Just a TEST from C3”

Process 2
Allocating...
Processed
Request:
POST /api/storeavalue/ HTTP/1.0
Host: tinydb.work
Content-Length: 47
Content-Type: application/x-www-form-urlencoded

tag=presentationtimer&value=Just a TEST from C3

Initialising Winsock...Initialised.
Socket created.
Connected
Data Send

Reply received

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Dec 2017 06:56:12 GMT
Content-Type: application/json
Content-Length: 52
Connection: close
X-Powered-By: PHP/5.6.31
Vary: Cookie
Set-Cookie: wfvt_2029330401=5a2f7d8c36e15; expires=Tue, 12-Dec-2017 07:26:12 GMT; Max-Age=1800; path=/; httponly
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate

["STORED","presentationtimer","Just a TEST from C3"]

 

次は、Getで、書き込んだデータを取得

C:\Users\chen\Documents\C\http-client>http-client-3 tinydb.work 80 POST /api/getvalue/ “tag=presentationtimer”

Process 2
Allocating...
Processed
Request:
POST /api/getvalue/ HTTP/1.0
Host: tinydb.work
Content-Length: 21
Content-Type: application/x-www-form-urlencoded

tag=presentationtimer

Initialising Winsock...Initialised.
Socket created.
Connected
Data Send

Reply received

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Dec 2017 06:57:10 GMT
Content-Type: application/json
Content-Length: 51
Connection: close
X-Powered-By: PHP/5.6.31
Vary: Cookie
Set-Cookie: wfvt_2029330401=5a2f7dc61d61c; expires=Tue, 12-Dec-2017 07:27:10 GMT; Max-Age=1800; path=/; httponly
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate

["VALUE","presentationtimer","Just a TEST from C3"]

 

Dump file

DUMP で出力された内容を ダンプリスト と呼ぶ

ダンプリスト左端はアドレス(ファイル先頭からの位置)

ダンプリスト中央にある16進数(バイト)が列挙されてる部分がマシン語プログラム(バイトコード)を表している。

ダンプリスト右端は、バイトコードをキャラクタコードで表現したときの内容。ただしバイトで表現可能な数値はキャラクタコードの範疇を超えることがあるため、そのような場合はピリオドで表現される。

dump.c

#include <stdio.h>
int main(int argc, char* argv[])
{
    FILE *fp;
    unsigned char buf[16];   /* 読み込みバッファ */
    unsigned long addr = 0;  /* 先頭からのアドレス */
    int readnum, i;

    if(argc <= 1) {
        printf("usage:dump filename\n");
        return 1;
    }
    if(!(fp = fopen(argv[1], "rb"))) {
        printf("file open error.\n");
        return 1;
    }
    while(1) {
        printf("%08x ", addr);
        readnum = fread(buf, 1, 16, fp);
        /* パイナリデータの表示 */
        for(i = 0; i < readnum; i++) {
            if( i == 8)
                 printf("   ");
            printf("%02x ", buf[i]);
        }
        for(i =readnum; i < 16; i++) {
            if(i == 8)
                printf("   ");
            printf("   ");
        }
        printf("   ");
        for(i = 0; i < readnum; i++)
            printf("%c", (32 <= buf[i] && buf[i] <= 126) ? buf[i] : '.');
        printf("\n");
        addr += 16;
        if(feof(fp))
            break;
    }
    fclose(fp);
    return 0;
}

 

 

[Borland C]Error on JP programming

Hello World例

正しいhello.c。カーソルは位置を注意してください。Pは5:5の位置にある。

image

コンパイルと実行する様子

典型的なエラー

初めてCのプログラミングは なかなかうまく行かないかも知れない。
ここではHello World プログラムの典型的な間違い例をいくつか紹介する。

半角引用符「”」ではなく全角引用符「”」に

右の引用符は全角引用符「”」になっている

image

全角スペースが用いられ

全角スペースが用いられている、これはなかなか探しにくい。

カーソルは位置を注意してください。Pは5:3の位置にある。

(半角のスペースなら、Pは5:5の位置にある。)

image

セミコロン「;」の付け忘れ

セミコロン「;」の付け忘れである。

image

Skip to toolbar