Lyの日常

主が楽しくプログラムをカキカキするブログ

俺的Linuxコマンドまとめ

自分で使うけどコマンドが長すぎて覚えられないコマンドをまとめておく

環境

OS BunsenLabs Linux
PC ThinkPad X240

マウスの速度変更

xinput --list --short

を実行してSynaptics TouchPadのidを調べる

xinput --set-prop <id> "Device Accel Constant Deceleration" <val>

を実行
id は上で調べたid番号
val がマウスの速度になる
数値がでかいほど遅くなる

音量調節

amixer sset Master <val>%

val は0~100を指定

画面のキャプチャ(gif)

byzanzをインストールするとgitキャプチャができる

byzanz-record --duration=<val0> --x=<val1> --y=<val2> --width=<val3> --height=<val4> <file>

val0 コマンドを実行してから何秒間録画するか
val1 録画するウィンドウの始点X
val2 録画するウィンドウの始点Y
val3 録画するウィンドウの横幅
val4 録画するウィンドウの縦幅
file 出力するファイル名 test.gif など

同ディレクトリのバッチを順に実行するバッチを書いた件について

会社でデザイナーの使うツールとして
「バッチを自動で実行するバッチ」を書いたので
ちょっと記事にします、ω、

前知識

コメントの書き方

@rem から始まる行はコメントです!

実行コマンドの非表示
デフォルトだと実行するコマンド自体も出力されてしまうので
コマンドは出力しないようにする

@echo off

バッチの呼び出し

call <path_to.bat>

自分自身の名前を取得

echo %0

条件分岐

簡単にif

@rem run01.bat
@echo off
if 1 == 1 (
  echo "1 is 1"
)
"1 is 1"

変数

簡単にローカルな変数を
アクセスには%%でくくる

@rem run01.bat
@echo off
set HOGE = 256
echo %HOGE%
256

繰り返し

今回はforを使用する

for %%一文字の変数 in (要素) do (処理)

for %%i in (1, 2, 3) do (
  echo %%i
)
1 2 3

ディレクトリにあるbatを実行

実際のものとは違いますがだいたいこんな感じです

@echo off

for %%i in (*.bat) do (
  if %0 NEQ %%i (
    call %%i
  )
)

ディレクトリにあるbatの検索

for %%i in (*.bat) do ()

NEQ(!=)を使い自分自身を実行しないようにする

if %0 NEQ %%i ()

最後に

条件分岐とかつかってバッチを書いたのは初めてでしたが
C/C++やってれば大抵の言語は似たようなものなので
時間はかからなかったです
forの変数が%%から始まりなおかつ名前は一文字という謎制約とか
古い技術の片鱗を味わった気がするぜ。ω。

openFrameworksはいいぞ

この記事は東ゲ部 Advent Calendar 2016 - Adventarの13日目です。

openFrameworksって?

openFrameworks(以後oF)とは
"「創造的なコーディング」のためのC++オープンソースツールキット"

C++でコード書いてマルチプラットフォームに対応したゲームが作れる!
って思ってくれればおkです

最近はUnityとかUE4とかのエンジンが勢力を伸ばしてきているので
コードだけでゲームを作るライブラリが元気ないのですが
なかなか楽しいライブラリなので紹介したいと思います。ω。

Example

f:id:akira206:20161213173450p:plain
f:id:akira206:20161213181231p:plain
f:id:akira206:20161213181250p:plain

Addon

oFはプロジェクトを自動生成してくれる
projectGeneratorというものがあり
項目で好きなアドオンをプロジェクトに追加することができます
f:id:akira206:20161213181708p:plain

このアドオンというものは誰でも作成することができ
作ったアドオンをoFに「こんなの作ったよー」って教えてあげると
「ホームページに登録したよ! ありがと!」
って返信が来るほど活発にアドオンが増えています。

この前ゲームパッド用のライブラリが無かったので
自分で作って公式に投げて見たところ、見事公式に登録されました 。ω。うれちい!f:id:akira206:20161213182713p:plain

Code

簡単なコードで描画ができるところをお見せしましょう、ω、

基本的なヘッダーです
f:id:akira206:20161213184036p:plain

cppです
f:id:akira206:20161213184235p:plain

実行結果です
f:id:akira206:20161213184255p:plain

四角形、円形、三角形
円柱、板、線、ベクトル矢印、法線
その他諸々よく使うような図形などはデフォルトで用意されています

webカメラ使ったり、キネクト使ったりリープモーション使ったり
とにかくいろいろなことがoFで遊べるので
ぜひ試してください!

俺でもわかるClojure入門 part2

前回(俺でもわかるClojure入門 part1 - Lyの日常)
NightCodeを使用して
足し算、引き算をやってみました
今回は条件分岐を書いていきます

NightCodeでプロジェクト作成

前回使った下の部分
f:id:akira206:20160930033627p:plain
簡単なコードを試すのには便利なんですが
改行とか考えると不便なので
プロジェクトを作ってみましょう

Start -> Console App
f:id:akira206:20161005125938p:plain

名前は適当にclojuretestにしました^q^
f:id:akira206:20161005130236p:plain

InstaREPL

コードを書きながら実行結果が知りたい時が多々あります
NightCodeではREPLが使用できるので実際に使ってみましょう
REPL(Read-Eval-Print-Loop) まぁやってみればわかるですよ。ω。
InstaREPLってところポチッと押してくださいな

足し算引き算を書いてみた例
f:id:akira206:20161005131414p:plain
こりゃたまげた!!
コードを書いたそばから実行結果が丸見えじゃないですかやだぁ!

という感じのものです。

if true false

条件によって別の処理を実行したい!
って時に条件分岐を使いますですゾ

まぁやってみましょう!

; ifの書き方
; (if boolean-form
;     then-form
;     optional-else-form)
; (if (条件) (条件がtrue(真)の時の処理) (それ以外の処理))

(if true 1 2) ;-> 1
(if false 1 2) ;-> 2

複雑な条件

実際のコードでは条件の部分に直接true falseは書きません、ω、
うん、セブンのシューロールケーキ美味しい^q^

; (= a b)
; a b が同じものか判定する

(= 1 0) ;-> false
(= 2 2) ;-> true
; (or a b c...)
; a b c.. どれかがtrueであればtrue

(or false false) ;-> false
(or false false false true) ;-> true

(or (= 0 1) (= "a" "b")) ;-> false
; (and a b c...)
; a b c...全てがtrueの場合true

(and true false) ;-> false
(and true true true) ;-> true

こんなん書いてみた

(if (= "Me" "Genius")
  (println "I'm Genius!")
  (println "No way!"))

;-> No way!

; printlnは文字列出力関数です
; REPLではnilと出ますが
; Run で実行すれば下のコンソールに出力が出ると思います
; nilについてはまた今度

おっつ

条件分岐たのちい
実はもっとたくさんの条件用の関数があり
もちろん自分で作ることもできます

次回は定義についてやろうかな
ではでは、ω、

俺でもわかるClojure入門 part1

こんちくわ
最近Clojureにはまっているので
Clojureについて記事を書こうと思うよ!

Clojure #とは

簡単に言うと
"Lispに似ている"
"関数型言語である"
ですね。
難しいことは考えるな!
書けばわかる!!

開発環境を整える

まずはIEDですが
LightTable http://lighttable.com/
NightCode https://sekao.net/nightcode/
この二つになるのかな?
今回は個人的に便利だと感じたNightCodeを使用していきます

前置記法を使用する

今までC++を書いてきた僕にとって
一番衝撃的だったのが
記法です
C++中置記法
Clojureでは前置記法を使用します
ニャンじゃそりゃ?
まぁ見てくださいよ奥さん

// C++での足し算
1 + 2;
3 + 5;
; Clojureでの足し算
(+ 1 2)
(+ 3 5)

本当にこれで動くのかって??
それじゃぁNightCodeで実際に試してみましょう!

簡単なコードを書いてみる

NightCodeでは簡単なコードをすぐに実行できる機能があるぞ!
ここで実行できるわけです
f:id:akira206:20160930033627p:plain

とりあえず足し算でもしてみましょう

user=> (+ 1 2)
3
user=> (+ 3 5)
8

ね?簡単でしょう?

続いて引き算

user=> (- 8 3)
5
user=> (- 1 5)
-4

複数の計算を一行で!

C++だとこんな感じ

std::cout << 1 + (5 - 3) + 2;
// 5

Clojureだとこんな感じに書きます

(+ 1 (- 5 3) 2)
;-> 5

今日はここまで!

実は僕もそんなにClojure理解してないので
詳しく書けないんですが
勉強しながら理解したところを少しずつ記事にしたいと思います

最後に

Clojureのブームはもう去ってるようで(?)
日本語の記事を探しても2013年止まりだったり・・・
でもまぁ、書いてて面白いし
C++と違った言語を触ることで気づけることも多々ありますしおすし
グラフィック面もQuilと言うライブラリを使用すれば表現できるので
できればClojureでゲームを作りたいと思ってます、ω、
それではまた会う日まで
アディオス!

俺でもわかるPicojsonの使い方

f:id:akira206:20160626201512p:plain

PicojsonはJson形式を解析するライブラリです

Jsonとは

軽量のデータ交換フォーマットです。
人間にとって読み書きが容易で、
マシンにとっても簡単にパースや生成を行なえる形式です。
--www.json.org/json-ja.html

ゲームの内部データを読み込む際に
テキスト形式だと解析が困難ですが
Json形式であればライブラリを使用して楽に読み込むことができます

PicojsonをGithubから取ってくる

Kazuhoさんに感謝
github.com

Picojsonはヘッダーオンリーなので
picojson.hだけで機能します

json形式のデータを用意する

# data.json
{
  "Player": {
    "Name": "Yanai"
  }
}

Picojsonを使ってデータを取得

#include <iostream> // std::cout
#include <fstream>  // std::ifstream
#include <cassert>  // std::assert

#include "picojson.h"


int main() {
  // ファイルを読み込むための変数
  std::ifstream fs;
  
  // ファイルを読み込む
  fs.open("data.json", std::ios::binary);
  
  // 読み込みチェック
  // fs変数にデータがなければエラー
  assert(fs);

  // Picojsonへ読み込む
  picojson::value val;
  fs >> val;
  
  // fs変数はもう使わないので閉鎖
  fs.close();
  
  // Playerの名前を取得
  std::string name = val.get<picojson::object>()
                      ["Player"].get<picojson::object>()
                      ["NAME"].get<std::string>();
}

picojson::objectはmapで生成されているので
[]でKeyを指定してそれに対になっている値を取得します

\\* 注意点
Picojsonではdouble型での数値の取得しか対応していません

コードからjson形式のデータを生成する方法

picojson::object obj;

// データの追加
obj.emplace(std::make_pair("Name", "Yanai"));

// 文字列にするためにvalueを使用
picojson::value val(obj);

// return std::string
val.serialize();

std::cout << val.serialize(); // {"Name": "Yanai"}

Unityで光のにじみ出るヤツをやってみた

f:id:akira206:20160520145143p:plain
って呟いたら
f:id:akira206:20160520145304p:plain
って教えてもらって
f:id:akira206:20160520145332p:plain
ってな感じにできちゃったので
簡単に方法を載せておきます、ω、

Effectsをインポート

[Assets]->[Import Package]->[Effects]
f:id:akira206:20160520145618p:plain

BloomをMain Cameraに追加

[Main Camera]を選択して[Add Component]をクリック
Bloomで検索して[Bloom]をクリック
f:id:akira206:20160520150105p:plain

Cubeを生成して確認

今回は分かりやすくするために
後ろに黒い壁を生成してます
f:id:akira206:20160520151011p:plain

物体ごとに強弱をつける

スタンダードシェーダーのEmissionで物体別に設定できるようにします
Emissionの値を1より大きな値にするとHDRという意味不明なものになって
周りの空間に作用するようになります
デフォルトではHDRが有効になっていないので
カメラの設定をいじります

Main Cameraの設定をいじる

[Rendering Path]を[Deferred]に、
[HDR]にチェックを入れます
f:id:akira206:20160520160603p:plain

standardシェーダーをいじる

物体にマテリアルを設定して
Emissionをいじります
今回は2に設定しました
f:id:akira206:20160520161321p:plain

物体を2つ置いて確認

マテリアルを設定したのがです
違いが出ていると思います
f:id:akira206:20160520161432p:plain

テクスチャを貼ってみる

ここからはオプションです
[Albedo]と[Emission]に同じテクスチャを設定すると
こんなこともできます、ω、
f:id:akira206:20160520161857p:plain

紹介してもらったサイト

zabaglione.info