シェルスクリプトで「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
この方法で問題なく動作した。
ライカiiifを買ったときのお話
いつかは欲しいなと思ってたら唐突に買ってしまった。不思議。
とりあえずフィルム1本撮り終わった記念にいろいろ書いてみる。
先週の水曜日のこと、朝起きてバイトに向かう。
バイト中にどこかお出かけしたいなって気分になった。
ショルダーバッグに買ったばかりのgx7と財布とiPhoneを放り込み駅に向かい、そのまま名古屋へ向かった。予め帰りのμチケットを買ったのに、タッチの差で乗り損ねて少し悲しい気持ちになったのは少し後のおはなし。
とりあえず金山で降り、大須へ向かってみる。
gx7 + sigma 30/2.8 dn
前来た時と同じように大須観音付近をぶらぶらした後にコメ兵へ。
ほしい pic.twitter.com/PN5ltBm7sN
— つるすけ (@trsk_1st) 2016年11月23日
買えもしないカメラをぶらぶら眺めた後に、大須商店街のトップカメラへ。
Canon IVsbが1万切ってて最高に購入の機運が高まったが、触らせてもらった時シャッター幕がちょっと不安だったのと、L39マウントレンズが取扱無かったのが幸いして欲望に打ち勝った。褒めて欲しい。
店員さんとひとしきりフィルム写真についてお話しした後、トップカメラ名古屋本店に向うことに。
名古屋パルコ付近のレモン社が少し気になって立ち寄ってみた。
結構キレイめのライカiiifが2万ちょいで売ってた。
触らせてもらった感じシャッター幕も綺麗だし、ちゃんと動いてる。
ファインダーも若干曇りが有るとは言え普通に2重像も見えるしなかなか良さげ。
かいまs pic.twitter.com/nX82FMt6Es
— つるすけ (@trsk_1st) 2016年11月23日
気がついたら買ってた。不思議。
レンズはかなり抑えてCANON 50mm F1.8 IIを購入。
ソ連系レンズを買う勇気も、ライカレンズを買えるだけも財力はなかった。
そのままトップカメラを眺めレンズを見て物欲を高め、フジの業務用フィルムを買っておうちへ
裏でやってた作業ひと段落したしはじめてのフォルム装填する pic.twitter.com/m25l4KkdF5
— つるすけ (@trsk_1st) 2016年11月23日
はいった pic.twitter.com/DUvVVigmd5
— つるすけ (@trsk_1st) 2016年11月23日
フィルム巻くと上の全部のダイヤルが同時に回るのすっごい新鮮
— つるすけ (@trsk_1st) 2016年11月23日
[https://twitter.com/trsk_1st/status/801404319366942720:embed#セット完了っ https://t.co/xp9CoKTn3G
シャッターを一回切るのにデジタルの何倍も時間はかかる。
慣れれば露出は感覚、ノーファインダー目測で写真が撮れるらしい。ムリでは。
街スナしたり林道持ってたりで24枚撮りきって、昨日現像をお願いしてきた。
ちゃんと撮れてると嬉しいなって。
Summicron 50mm F2.0 L が欲しい
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
メモ
- カウンターとして変数を利用する時に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; }
実行結果
メモ
- 点の描画はGL_POINTじゃなくてGL_POINTS
- 描きたい図形毎に、色指定、サイズ指定、glBegin(描画したい図形)、具体的な描画内容、glEnd()の流れ
- display関数の最後にglFlush()関数で発行したOpenGLコマンドを実行
windowsで書かれたopenGLプログラムをxcodeで走らせるときの覚え書き
個人的なメモ用
#include <glut.h> #include <math.h> //省略 int main(int argc, char* argv[]){ //省略 _sleep(20); //20ms毎に処理 }
#include <GLUT/GLUT.h> //変更 #include <unistd.h> //追加 #include <math.h> //省略 int main(int argc, char* argv[]){ //省略 usleep(20000); //変更 // 20ms == 20000μs }