読者です 読者をやめる 読者になる 読者になる

おふとんガレージ

技術的なことの忘備録とか

シェルスクリプトで「Shell script arrays Syntax error: “(” unexpected」が出た時のお話

にゃーん🐾

hoge.sh

#!/bin/sh

array=("foo" "bar")
#略

上記の様なシェルスクリプトを実行した際、以下のエラーが出てきた。

Shell script arrays Syntax error: “(” unexpected

google先生に尋ねたところ、bashを指定して実行するようとのこと。
Shell script arrays Syntax error: “(” unexpected | Sany's Linux and Open Source Blog

$ bash hoge.sh

この方法で問題なく動作した。

原因とか

/bin/shを見てみた所、dashに関連付けられてるっぽいのでbashに修正

$ sudo dpkg-reconfigure bash

画面に従いdashをデフォルトにしないように設定

これでbashをわざわざ指定しなくても配列が普通に使えるようになりました。
解決までにかかった時間を思い出したら悲しい気持ちになりました まる

ライカiiifを買ったときのお話

カメラ 雑記

https://www.instagram.com/p/BNJPBB5l5oO/
おむかえしました #leica #leicaiiif

いつかは欲しいなと思ってたら唐突に買ってしまった。不思議。
とりあえずフィルム1本撮り終わった記念にいろいろ書いてみる。

先週の水曜日のこと、朝起きてバイトに向かう。
バイト中にどこかお出かけしたいなって気分になった。

ショルダーバッグに買ったばかりのgx7と財布とiPhoneを放り込み駅に向かい、そのまま名古屋へ向かった。予め帰りのμチケットを買ったのに、タッチの差で乗り損ねて少し悲しい気持ちになったのは少し後のおはなし。

とりあえず金山で降り、大須へ向かってみる。


https://www.instagram.com/p/BNI4NZhlN8N/
きた

f:id:zurvlk:20161130150216j:plain
gx7 + sigma 30/2.8 dn


前来た時と同じように大須観音付近をぶらぶらした後にコメ兵へ。

買えもしないカメラをぶらぶら眺めた後に、大須商店街のトップカメラへ。

Canon IVsbが1万切ってて最高に購入の機運が高まったが、触らせてもらった時シャッター幕がちょっと不安だったのと、L39マウントレンズが取扱無かったのが幸いして欲望に打ち勝った。褒めて欲しい。

店員さんとひとしきりフィルム写真についてお話しした後、トップカメラ名古屋本店に向うことに。

名古屋パルコ付近のレモン社が少し気になって立ち寄ってみた。

結構キレイめのライカiiifが2万ちょいで売ってた。
触らせてもらった感じシャッター幕も綺麗だし、ちゃんと動いてる。
ファインダーも若干曇りが有るとは言え普通に2重像も見えるしなかなか良さげ。


気がついたら買ってた。不思議。
レンズはかなり抑えてCANON 50mm F1.8 IIを購入。

ソ連系レンズを買う勇気も、ライカレンズを買えるだけも財力はなかった。

そのままトップカメラを眺めレンズを見て物欲を高め、フジの業務用フィルムを買っておうちへ




[https://twitter.com/trsk_1st/status/801404319366942720:embed#セット完了っ https://t.co/xp9CoKTn3G

シャッターを一回切るのにデジタルの何倍も時間はかかる。
慣れれば露出は感覚、ノーファインダー目測で写真が撮れるらしい。ムリでは。

街スナしたり林道持ってたりで24枚撮りきって、昨日現像をお願いしてきた。

ちゃんと撮れてると嬉しいなって。

https://www.instagram.com/p/BNQ2TVzFl7w/
旅するLeica #leicaiiif #leica

Summicron 50mm F2.0 L が欲しい

javaとオブジェクト指向をなんとかしようとした。

忘備録

オブジェクト指向について色々教えてもらう機会があったのでその内容について自分なりに解釈してまとめてみる。

オブジェクト指向の利点

  • 変更が多く咥えられるプログラムの設計において有効
    • オブジェクトとメソッドの呼び出しの集合として構成される。
    • 受け渡しの部分さえ定義すれば、それぞれのメソッドの中で何を実行しているのか考えなくてもいい。(カプセル化

結果として複数人での開発にも非常に威力を発揮する。

ポリフォーリズムとか継承とかそのへんはいまいち理解できてないから割と早急になんとかしたいとこ。

続きを読む

OpenGL入門 3日目

忘備録

前回までの作業内容

  • ウィンドウ、初期盤面生成
  • クリック箇所の座標読み込み、盤上の座標への変換

今回の作業内容

  • 石を置けるかの判定実装
  • 石を置いた後の反転実装
続きを読む

OpenGL入門 2日目

忘備録

前回までの作業内容

  • ウィンドウを表示する
  • 初期状態の盤面生成

今回の作業内容

  • クリックされた座標を読み込む

次回以降の目標

  • オセロのルールに従った石が置けるかどうかの判定
  • 石を置いた後に周囲の石を反転させる。
  • 石が置けない場合、ゲームの終了を判定する。

othello.cpp(10/19時点)

#include <iostream>
#include <GLUT/GLUT.h>

#define BOARD_SIZE 8
#define NONE 0
#define BLACK 1
#define WHITE 2

using namespace std;
int screenWidth = 800, screenHeight = 800, turn = 0;
char board[BOARD_SIZE][BOARD_SIZE];

void showStone(){
    //盤面に配置された石の描画
    glPointSize(60);
    for(int i = 0; i < BOARD_SIZE; i++){
        for(int j = 0; j < BOARD_SIZE; j++){
            if(board[i][j] == BLACK){
                //黒石の描画
                glColor3d(0, 0, 0);
                glBegin(GL_POINTS);
                glVertex2i(120 + 80 * i, 120 + 80 * j);
                glEnd();
            }else if(board[i][j] == WHITE){
                //白石の描画
                glColor3d(1, 1, 1);
                glBegin(GL_POINTS);
                glVertex2i(120 + 80 * i, 120 + 80 * j);
                glEnd();
            }
        }
    }
}


void mouse(int button, int state, int x, int y){
    int i = 0, j = 0;
    cout << "turn : " << turn << endl;
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        //ウィンドウ内をクリックしたときの処理
        cout << "(x, y) == (" << x << "," << y << ")" << endl;
        
   //クリックした箇所が盤上でない時→処理終了
        if(x < 80 || x > 720) return;
        if(y < 80 || y > 720) return;
        
        //クリックされた座標(x, y)から盤上の座標(i, j)への変換
        while(x > 80){
            x -= 80;
            i++;
        }
        
        while(y > 80){
            y -= 80;
            j++;
            
        }
        
        cout << i << " " << j << endl;
  
   //クリックされた箇所に新規に石を配置する
   //奇数ターンであれば黒、偶数ターンであれば白
        if(turn % 2 == 1){
            board[i - 1][j - 1] = WHITE;
            cout << "WHITE" << endl;
        }else{
            board[i - 1][j - 1] = BLACK;
            cout << "BLACK" << endl;
        }
        
        turn++;

   //描画実行
        showStone();
        glFlush();
    }
    
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    //盤面のマス目作成
    glColor3d(0.0, 0.0, 0.0);
    glLineWidth(3);
    glBegin(GL_LINES);
    
    for(int i = 0; i <= BOARD_SIZE; i++){
        glVertex2i(80 + 80 * i, 720);
        glVertex2i(80 + 80 * i, 80);
        
        glVertex2i(80, 80 + 80 * i);
        glVertex2i(720, 80 + 80 * i);
    }
    glEnd();
    
    //盤面上の4点の描画
    glColor3d(0.0, 0.0, 0.0);
    glPointSize(10);
    glBegin(GL_POINTS);
        glVertex2i(240, 240);
        glVertex2i(240, 560);
        glVertex2i(560, 240);
        glVertex2i(560, 560);
    glEnd();
    
    showStone();
    glFlush(); //描画実行
    
    
}

void initialize(){
    //初期盤面生成
    glClearColor(0, 0.5, 0, 1); //背景色設定
    
    //以下石の初期配置
    for(int i; i < BOARD_SIZE * BOARD_SIZE; i++)
        board[i / BOARD_SIZE][i % BOARD_SIZE] = NONE;
    
    board[BOARD_SIZE / 2 - 1][BOARD_SIZE / 2] = BLACK;
    board[BOARD_SIZE / 2][BOARD_SIZE / 2 - 1] = BLACK;
    
    board[BOARD_SIZE / 2][BOARD_SIZE / 2] = WHITE;
    board[BOARD_SIZE / 2 - 1][BOARD_SIZE / 2 - 1] = WHITE;
}

int main(int argc, char* argv[]) {
    
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(screenWidth, screenHeight);
    
    glutCreateWindow("Othello");
    gluOrtho2D(0, 800, 800, 0); //座標系指定
    initialize();

	glutMouseFunc(mouse);
    glutDisplayFunc(display);
    glutMainLoop();
    
    return 0;
}

実行結果

turn : 0
(x, y) == (523,435)
6 5
BLACK
turn : 1
turn : 1
(x, y) == (531,503)
6 6
WHITE
turn : 2
turn : 2
(x, y) == (468,521)
5 6
BLACK
turn : 3

f:id:zurvlk:20161019215017p:plainf:id:zurvlk:20161019215028p:plainf:id:zurvlk:20161019215038p:plainf:id:zurvlk:20161019215044p:plain

メモ

  • カウンターとして変数を利用する時に0で初期化することを忘れないようにする。
  • 敵AIを除けば石が置けるかどうかの判定が山場っぽい。がんばる。

OpenGL入門 1日目

忘備録

だいたい個人用作業メモ

当面の目標

今回までの作業内容

  • ウィンドウを表示する
  • 初期状態のオセロの盤面の生成、配置


othello.cpp(10/18時点)

#include <iostream>
#include <GLUT/GLUT.h>

#define BOARD_SIZE 8
#define NONE 0
#define BLACK 1
#define WHITE 2

using namespace std;
int screenWidth = 800, screenHeight = 800;
char board[BOARD_SIZE][BOARD_SIZE];


void showStone(){
    //盤面に配置された石の描画
    glPointSize(60);
    for(int i = 0; i < BOARD_SIZE; i++){
        for(int j = 0; j < BOARD_SIZE; j++){
            if(board[i][j] == BLACK){
                //黒石の描画
                glColor3d(0, 0, 0);
                glBegin(GL_POINTS);
                glVertex2i(120 + 80 * i, 120 + 80 * j);
                glEnd();
            }else if(board[i][j] == WHITE){
                //白石の描画
                glColor3d(1, 1, 1);
                glBegin(GL_POINTS);
                glVertex2i(120 + 80 * i, 120 + 80 * j);
                glEnd();
            }
        }
    }
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    //盤面のマス目作成
    glColor3d(0.0, 0.0, 0.0);
    glLineWidth(3);
    glBegin(GL_LINES);
    
    for(int i = 0; i <= BOARD_SIZE; i++){
        glVertex2i(80 + 80 * i, 720);
        glVertex2i(80 + 80 * i, 80);
        
        glVertex2i(80, 80 + 80 * i);
        glVertex2i(720, 80 + 80 * i);
    }
    glEnd();
    
    //盤面上の4点の描画
    glColor3d(0.0, 0.0, 0.0);
    glPointSize(10);
    glBegin(GL_POINTS);
        glVertex2i(240, 240);
        glVertex2i(240, 560);
        glVertex2i(560, 240);
        glVertex2i(560, 560);
    glEnd();
    
    showStone();
    glFlush();  //描画実行
}

void initialize(){
    //初期盤面生成
    glClearColor(0, 0.5, 0, 1); //背景色設定
    
    //以下石の初期配置
    for(int i; i < BOARD_SIZE * BOARD_SIZE; i++)
        board[i / BOARD_SIZE][i % BOARD_SIZE] = NONE;
    
    board[BOARD_SIZE / 2 - 1][BOARD_SIZE / 2] = BLACK;
    board[BOARD_SIZE / 2][BOARD_SIZE / 2 - 1] = BLACK;
    
    board[BOARD_SIZE / 2][BOARD_SIZE / 2] = WHITE;
    board[BOARD_SIZE / 2 - 1][BOARD_SIZE / 2 - 1] = WHITE;
}

int main(int argc, char* argv[]) {
    
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(screenWidth, screenHeight);
    
    glutCreateWindow("Othello");
    gluOrtho2D(0, 800, 800, 0); //座標系指定
    initialize();
    
    glutDisplayFunc(display);
    glutMainLoop();
    
    return 0;
}

実行結果

f:id:zurvlk:20161018224753p:plain

メモ

  • 点の描画はGL_POINTじゃなくてGL_POINTS
  • 描きたい図形毎に、色指定、サイズ指定、glBegin(描画したい図形)、具体的な描画内容、glEnd()の流れ
  • display関数の最後にglFlush()関数で発行したOpenGLコマンドを実行

windowsで書かれたopenGLプログラムをxcodeで走らせるときの覚え書き

忘備録

個人的なメモ用

Windows (Visual Studio)

#include <glut.h> 
#include <math.h>
//省略
int main(int argc, char* argv[]){
    //省略
    _sleep(20); //20ms毎に処理
}

Xcode

#include <GLUT/GLUT.h> //変更
#include <unistd.h> //追加
#include <math.h>
//省略
int main(int argc, char* argv[]){
    //省略
    usleep(20000); //変更
    // 20ms == 20000μs
}

その他

  • brewでインストールしたライブラリを用いる場合
    • TERGET-Build Settings-Search Paths-Header Search Paths
      • /usr/local/includeを追加
  • OpenGLを使えるようにする
    • TERGET-Build Phases-Link Binary With Libraries