vimを終了させる方法

November 8,2017 12:03 AM
Category:[Linux]
Tag:[]
Permalink

vimを終了させる方法についてまとめました。

注:いずれも実行前にESCを押下し、コマンドモードに切り替えてください

:q

終了。内容が変更されている場合は「E37: 最後の変更が保存されていません (! を追加で変更を破棄)」というメッセージが表示されます。これは「:quit」の短縮形です。

:q!

変更した内容を保存せず終了。これは「:quit!」の短縮形です。

:wq

書き込み&終了

:wq!

強制書き込み&終了(ファイルに書き込み権限がなくても強制書き込み)

:x

書き込み&終了(「:wq」と同様)

:exit

書き込み&終了(「:wq」と同様)

:qa

すべて終了。内容が変更されている場合は「E162: バッファ "..." の変更は保存されていません」というメッセージが表示されます。これは「:quitall」の短縮形です。

ZZ

書き込み&終了(ファイルに書き込み権限がなくても強制書き込み)

ZQ

終了(内容が変更されている場合でも強制終了)

Comments [0] | Trackbacks [0]

Wix新製品「Wix Code」について(その1:概要)

November 2,2017 12:03 AM
Category:[Wix]
Tag:[Wix]
Permalink

Wix新製品「Wix Code」について紹介致します。

1.はじめに

以前、「Wixブログの作り方」という記事を書きましたが、無料ホームページサービスのWix.comより、開発者向けの新プロダクト「Wix Code」がローンチされました。

Wix Code
Wix Code

「Wix Code」を使用することで、サーバレスでデータベースやデータベースコレクションの設定、コンテンツリッチWebサイトの作成、カスタムフォームの追加によるWebサイトを簡単に構築することができます。

すべての操作は、Wix Editorのビジュアルコンポーネントからアクセスできます。

ということで、数回に分けてWix新製品「Wix Code」について紹介したいと思います。

Wix Codeでできることは大きく次の5つの機能に分けられます。

  • データベース
  • ダイナミックページ
  • ユーザー入力
  • カスタムインタラクション
  • WixコードAPI

以下、それぞれの機能について簡単に説明します。

2.データベース

サイトに表示するコンテンツをデータベースで管理することができます。データ量の制限はありません。

データベース

データベースを利用するには「コレクション」を作成します。

作成したコレクションに任意の型のカラム(フィールド)を追加することができます。

作成したデータベースに各レコードを保存することができます。

サイト上でどのようにデータベースを使用するかを選択し、ユーザによって追加・編集・表示の権限を制御することもできます。

サイトのコンテンツをデータベースに保存することで、サイトのデザインと別に管理することが可能になります。

ユーザは、ルック・アンド・フィールに影響を与えることなく、データベース内のすべてのテキストとイメージを追加および編集することができます。

3.ダイナミックページ

データベースに保存したデータから、それぞれがカスタムURLと固有のコンテンツを持つページを動的に作成することができます。

ダイナミックページ

データベースのコンテンツを更新することで動的ページに反映されます。

また動的ページはカテゴリ別に整理することができ、項目のグループを表示することができます。

ダイナミックページでは、アイテム(=データベースの1レコード)単位に表示する「ダイナミックアイテムページ」とカテゴリ別に分けられた「ダイナミックカテゴリページ」、そしてダイナミックアイテムページへのリンクを表示するための「インデックスページ」を作成することができます。

4.ユーザー入力

入力フォームを作成することで、ユーザーはサイトからフォーム経由でデータベースの入力が可能になります。

ユーザー入力

フォームは、ページに各要素をドラッグ&ドロップすることで簡単に作成することができます。

フォームで送信されたデータは自動的にデータベースに保存されます。

5.カスタムインタラクション

ページ要素にJavaScriptコードを追加して、ページの動作をカスタマイズすることができます。

カスタムインタラクション

たとえば、ボタンをクリックすることによる要素の表示・非表示や要素の折りたたみ、マウスポイントによるふきだしや画像のハイライト表示など、ユーザー操作によるインタラクションを作成します。

JavaScriptが分からなくても設定することができます。

6.WixコードAPI

Wix Code APIを使用すれば、サイトの機能を制御することができ、ページ要素・サイトのデータベースコンテンツ・外部サービスと対話することができます。

WixコードAPI

例えば下記のものを操作することが可能です。

  • サイトのコンポーネント
  • サイトのデータベースコレクション
  • データセットを通じてサイトのデータベースコレクション
  • サードパーティのリソース取得

サードパーティのリソース取得でAPIキーを公開できないなど、セキュリティ上問題がある場合は、バックエンドWebモジュールからサービスを呼び出すことができます。

以上です。

次回はデータベースコレクションの作成について具体的な手順を紹介する予定です。

Comments [0] | Trackbacks [0]

LinuxとC/C++によるソケット通信サンプル

October 31,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++, Linux]
Permalink

C/C++によるソケット通信サンプルを紹介します。

1.はじめに

Linux上で動作する、C++のソケット通信サンプルを作ってみました。

使い方は、サーバ・クライアントそれぞれのプログラムをビルドし、2つのターミナルを使ってサーバ→クライアントの順で起動すると、クライアントからサーバに簡単な文字列を送信し、サーバからクライアントにその文字をそのまま返送し、それぞれのターミナルに実行状況を表示します。

2.サーバプログラム(server.cpp)

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
 
int main() {
    int sockfd;
    int client_sockfd;
    struct sockaddr_in addr;
 
    socklen_t len = sizeof( struct sockaddr_in );
    struct sockaddr_in from_addr;
 
    char buf[1024];
 
    // 受信バッファ初期化
    memset( buf, 0, sizeof( buf ) );
 
    // ソケット生成
    if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
        perror( "socket" );
    }
 
    // 待ち受け用IP・ポート番号設定
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 1234 );
    addr.sin_addr.s_addr = INADDR_ANY;
 
    // バインド
    if( bind( sockfd, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 ) {
        perror( "bind" );
    }
 
    // 受信待ち
    if( listen( sockfd, SOMAXCONN ) < 0 ) {
        perror( "listen" );
    }
 
    // クライアントからのコネクト要求待ち
    if( ( client_sockfd = accept( sockfd, (struct sockaddr *)&from_addr, &len ) ) < 0 ) {
        perror( "accept" );
    }
 
    // 受信
    int rsize;
    while( 1 ) {
        rsize = recv( client_sockfd, buf, sizeof( buf ), 0 );
 
        if ( rsize == 0 ) {
            break;
        } else if ( rsize == -1 ) {
            perror( "recv" );
        } else {
            printf( "receive:%s\n", buf );
            sleep( 1 );
 
            // 応答
            printf( "send:%s\n", buf );
            write( client_sockfd, buf, rsize );
        }
    }
 
    // ソケットクローズ
    close( client_sockfd );
    close( sockfd );
 
    return 0;
}

3.クライアントプログラム(client.cpp)

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main() {
    int sockfd;
    struct sockaddr_in addr;
 
    // ソケット生成
    if( (sockfd = socket( AF_INET, SOCK_STREAM, 0) ) < 0 ) {
        perror( "socket" );
    }
 
    // 送信先アドレス・ポート番号設定
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 1234 );
    addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
 
    // サーバ接続
    connect( sockfd, (struct sockaddr *)&addr, sizeof( struct sockaddr_in ) );
 
    // データ送信
    char send_str[10];
    char receive_str[10];
    for ( int i = 0; i < 10; i++ ){
        sprintf( send_str, "%d", i );
        printf( "send:%d\n", i );
        if( send( sockfd, send_str, 10, 0 ) < 0 ) {
            perror( "send" );
        } else {
            recv( sockfd, receive_str, 10, 0 );
            printf( "receive:%s\n", receive_str );
        }
        sleep( 1 );
    }
 
    // ソケットクローズ
    close( sockfd );
 
    return 0;
}

4.プログラムのビルド

% g++ -o server server.cpp
% g++ -o client client.cpp

5.プログラムの実行

% ./server
% ./client
Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages