お知らせ

  • ブログ

システムおじさんのひとり言(Vol.4)

noimage

システムおじさんのひとり言(Vol.4)

今が旬のKTです。 さて、今回は「わがまま汎用機(後編)」です。 汎用機のサポートが大変なのは 端末1台追加も再起動、プログラムのインストールも再起動と再起動だらけです。 途中で失敗すると退避しているデータを再度戻して同じことを繰り返します。 お分かりでしょうか、平日にはできませんしスケジュールも考えておかないと 休みを使って結局もとに戻すことになってしまいます。 <実際にありましたが、虚しい出来事です> まだ、戻せればいいのですが戻せない状態での トラブルが発生したときはホントに大変です。 私と先輩でディスク交換に行ったときの話です。 そもそも、なぜディスク交換をするのかと言うと 自社製品が高く安い他社製品を使うことになったためです。 移行方法は限られ、一旦全ディスクをつなぎ データを新ディスクに移行し、現行ディスクをはずす。 簡単なようですが、ここに大きな落とし穴が待ってました。 当初作業は順調に進んで、現行ディスクを外しました。 さあ、システムを起動。 OS上がってきました。 これであとは動作確認のみ。 あれっ、コンソールの文字がいつものように流せません??? 止まっています。 えっ、なぜ??? 理由は、お客様のJOB制御が独特でシステムのファイルを使用しており システムを入れ替えた結果、初期では作成されないファイルがありますよとエラーを出していました。 こうなると、どうしようもなくなりました。 本体とディスクが幽体離脱した状態です。 どうくっつける。 現行に戻す。いやっ、もう現行ディスクはトラックの中。 テープから戻す。あっ、元に戻しても新ディスクを認識できない。 かなり困ってましたが、先輩が 「コンソールからJOBを投入すれば何とかなるのでは」 ということでJCLをノートに作成し 一字一句間違いなしに入力することになりました。 間違えた。初めから。 また間違えた。 結局、10回程度間違えて何とかJOBを投入できました。 私一人であれば、多分大事になっていたのではないかと思います。 先輩も半ば諦めでやってみただけで勝算はなかったようです。 ほんとうまく言ってよかったです。 多分、JOB投入がうまく行っていなければ もしかしたら、元に戻らないことも考えられゾッとしました。 損失がいくらだったのか??? こんな汎用機と十数年付き合ってきましたが 時代の流れもあり、お別れの時を迎えました。 ということで、次回は汎用機3部作の最終回「さよなら汎用機」でお会いしましょう。

  • ブログ

「Visual Studio Code」を使い始めました

noimage

「Visual Studio Code」を使い始めました

おはこんばんちは。たはらです。 今日は和歌山に行っていましたが、街のあちこちに金木犀の花が咲いていました。 金木犀の香りがしてくると秋の訪れを感じますね。 みなさん、エディタは何を使っていますか? 私は今までは秀丸一筋だったのですが、PHPやJavaScriptを使うことが増えてきたので、せっかくなのでWebアプリに強そうなエディタを使ってみようと思い、最近よく見かけるようになってきたMicrosoftの「Visual Studio Code」を使ってみることにしました。 いいなと思ったところ ・クロスプラットフォーム WindowsとMacで同じエディタが使える ・多くの言語に対応 ・VisualStudioという名前が付くけど軽い ・コード補完がいい感じ ・なんかカッコいい イマイチ思ったところ ・まだ英語版しかない ・設定が少し分かりにくい(好み?) jsonベースの設定ファイル 特に、コード補完がVisualStudioばりに効くので楽チンです。 まだ全然使いこなせてませんが、これからどんどん使い込んでいきたいなと思わせる雰囲気のあるエディタだと思いました。 # Microsoftさんもクロスプラットフォームやオープンソース等、昔と変わってきましたね。 最後に今日ランチで食べたローストビーフ丼(肉ダブル)。 美味しかったですが、ローストビーフが多過ぎて食べるのがしんどかったです。。

  • パソコン関連

FreetelのSIMをiPad mini 4で開通してみました

noimage

FreetelのSIMをiPad mini 4で開通してみました

Freetelはdocomoの携帯回線を提供するMVNO企業です。 Freetel for iPhoneプランというサービスを10月9日から提供するということで、興味が湧き、SIMフリー版のiPad mini4で利用することにしました。 大手キャリアと違い二年縛りなどの契約がなく、やめたいと思えばすぐに解約することができ、使わなければ月299円ということで、気楽に始めることができました。 iPhoneプランはApp Storeへの通信費用が免除されるということで、特定のアドレスに向けた通信が利用料からマイナスされるということなのかと思います。 あまり屋外でアプリをダウンロードすることはないとは思いますが、月額としては変わりないのでこれを試してみます。 SIMは公式サイトから通販するか、取り扱い店舗でも購入することができます。近くの家電店が取扱店でしたので、3,000円で購入します。for iPhone向けのパッケージもあるようですが、既存のものでもプラン変更はWebサイトから可能です。 (※サービス変更は翌月からになるようです) パッケージの中にはdocomoと書かれたnano SIMカードがあり、電話番号と製造番号が書かれているので、これをFreetelのWebサイトからクレジットカード情報などを登録してアクティブ化します。 登録したメールアドレスに「FREETEL SIMサービス開始のご案内」というメールが来れば通信が開始されます。 iPad mini4はiOS9なので、パッケージ内に書かれたAPN設定では利用できず、 https://www.freetel.jp/sim/apn_Setting/#iphone 上記ページの手順でプロファイルの設定が必要です。 これでiPad miniがdocomoの電波を掴むようになり、Wi-Fiのアクセスポイントへの接続や、iPhoneなどからテザリングを受けなくても屋外で利用することができるようになりました。 FreetelのSIMを利用するにはSIMフリー版のiPhone、iPadを利用するか、docomoが販売しているものであることが条件になります。

  • パソコン関連

広告ネットワーク

noimage

広告ネットワーク

インターネットブラウザで様々なWEBサイトを見ていると必ず目にするものは、WEB広告です。 WEB広告は、新聞の広告など大きなメディアではなく、例えば個人のブログなどを見ていても目にするものです。 また新聞紙面の一等地が一番広告料金が高く、効果があるというものでもなくなってきています。 誰もが1日一度は必ず目にするサイト、例えばポータルサイトなどでも多種多様となってきているからです。 かつては、このサイトのこの部分にバナー広告を出すスポンサーを募集、という形を取っていた時代はありましたが、現在様相は一変しています。 ネット上の広告代理店は、WEBサイトや、アプリ内広告など様々な広告の組み合わせを行い、もっとも最適な広告を個人向けに出すための技術を発展させています。 GoogleやYahoo!などは、その人の検索履歴や、サイト訪問などの個人の履歴を保持していて、それに合わせた個人向けの広告を行っています。 あるいはショッピングサイトの楽天なども、個人の商品閲覧履歴を見て、自社で持っている広告ネットワークを利用して、再度ショッピングサイトを訪問するような動線を作ります。 これら情報の蓄積が広告ネットワークを形作っています。どのようにしてユーザーの情報を広く集め、最適な広告を出せるかという部分がネット広告代理店の生命線となります。 GoogleやYahoo!も個人名、住所、年齢、性別、勤務先などの情報を入力しないと検索できないなど露骨すぎる個人情報収集はユーザー離れを起こしてしまうので、様々な工夫やビッグデータの活用で広告ターゲットを作っています。 チェックインなどができる位置情報アプリなども、ユーザーの行動範囲や、好きな店舗の傾向などを集め、有益な広告を出すためのデータ収集ができます。 Facebookの広告が今の所、個人情報と広告のむすびつきでは最も優位に立っているかもしれません。 Facebookは出身校や、居住地、勤務先、役職、家族構成、チェックイン情報などを持っていますので、それに準じた広告ネットワークを築くことに成功しています。 それら個人情報が悪用されるということについては、あまり神経質にならなくても良いのではと考えます。 世界中、毎日数千万人からの複雑に関係性を持たされたデータを処理するために巨大なデータセンターを保有しているので、そこから個々人の情報を抜き出すことは困難なことですし、コストに見合わないことだと思われるからです。

  • ブログ

応用情報技術者試験の勉強法

noimage

応用情報技術者試験の勉強法

実は私、10/18に実施される応用情報技術者試験を受けることになっておりまして、 絶賛勉強中の日々を送っております…   という訳で今回のブログですが、 自分が行っている応用情報技術者試験の勉強法について書こうかな、と思います。       まずは、「応用情報技術者 午前 一問一答問題集」というiOSアプリを購入しました。 (Android版は無いようです... ただ、別の問題集アプリはあるようです) 午前の問題が一問一答形式で収録されていて、解説もあります。 ランダムな順序で出題してくれる機能もあるので、何度も使えます。   正直、結構お高めなお値段ですが、通勤中やスキマ時間に気軽に勉強出来るので、 購入してよかったなと思います。 ネット接続がなくても使えるのが、地味に嬉しいところです。       あとは、「応用情報技術者試験ドットコム」がかなり使えるサイトです!   応用情報技術者試験の概要や説明に、 午前の過去問をランダムに出題してくれるページがあったりと、 かなりいいサイトだと思います!   過去問のデータがダウンロードできるので、私はそれを印刷して実際に解いて、 対策しています!       今のところ、午前は合格点に到達出来ている感じなのですが、 午後はかなり微妙です…汗   なかなか午後の問題を解説してくれているサイトなどがないので、 この前、追加で問題集を1冊買いました。   「応用情報技術者 パーフェクトラーニング過去問題集」という問題集なのですが、 午前だけでなく、午後の解答の解説まで書かれていて、 その解答になる理由もよく分かるので、午後問題対策になりそうだなと思います。     試験当日までしっかりと対策して、合格できるように頑張ります!

  • 超科学戦隊オレ一人

【Android】OpenGLでテクスチャ表示したかっただけなんや

noimage

【Android】OpenGLでテクスチャ表示したかっただけなんや

まいど。ゴミ社員のKです。 ぐえっへっへへ(o´・∀・)y~ やめてー。 ガベージコレクトせんといてー。 要らん子やけどここに居たいんやー。 k = null; System.gc(); ぎゃぁああああああ! ■どうしても避けて通りたかった3Dプログラミング。 ”ワイのゲームはファミコン風ドット絵やから3Dなんか要らんズー” ”3Dってあれやろ、ハリウッドの。そんなんワイのゲームに要らんズー” ”つか、3Dってダサくね?HAHAHAHA・・・” ・・・なぞというカッチョわりぃ言い訳をして、3Dの勉強から逃げてきましたが、 このたび、3Dプログラミング(OpenGL ES)に手を染める運びとなりました。 逃げてた理由=それは難しいからです。 (行列演算・・・?うっ頭が・・・) やろうと思った理由は簡単です。 オレのAndroidゲーム、もっとたくさんのキャラをもっと速く動かしたい。そんだけ。 そのためには、ゲームフレーム中の描画処理のコストを下げる… というか、強力な描画機構を使うのがよかろうと。 なお、Androidアプリの描画の仕組みは、 View、SurfaceView、GLSurfaceViewと3種類あり、 左ほど作るのが簡単だけど遅くて、右ほど難しいけどパワフルで高速化が見込めるぜ…と、よく聞く。 一番右のGLSurfaceViewというやつがOpenGL ESで3Dプログラミングできるやつです。 ちなみに、前回紹介した2Dゲーム「忍者盛り」は、真ん中のやつ(SurfaceView)で実装しています。 今回の話は、これをGLSurfaceView(つまりOpenGL ES)に置き換えたらどうなんねんハゲコラ!泣かしたろか!というコスモが起源です。 ワンポイントアドバイス(ゝω・) ”忍者盛り”をGoogle検索すると、勝手に”忍者めし”に変換してくれるぞ!それチガウンヤケドナ…(2015年10月現在) ■板ポリゴンにテクスチャを表示 さて、3Dをどのように2Dゲームに転用するかというと、 それは当然、厚みをもたない四角い板(板ポリゴン)に、画像を貼りつけて表示するのがセオリーだろうと。 ははーん。板に絵をぶちまけるだけでヨゴザンスね?ニヤニヤ? ということで、”オレは板ポリに絵(テクスチャ)貼っちゃる、それは簡単だ”と思いました。 ところが!これがもう・・・それはそれは苦難の道でしたとさ・・・。 例えるならば、固形の吐しゃ物を、老廃物と一緒に自由自在に体内からいつでも放出できる感じです。 これを嘔吐コントロール(Auto Control)と言います。 まず、何から手を付けていいかわからんのです! 正直な話、ネットに転がってるサンプルを見ても、何をしているのかいっこもワカラン。 頂点配列?深度テスト?ビューポート? フーム、ワカリマセンネ(o´・∀・)シゲシゲ?ワカリマセンヨ。 「ええから、ポリ公にオレの絵貼っつける方法、はよ。」 まぁ、やっぱり自分はゴミカスやったということです。 その事実を認めたくないがために、ただひたすらにやりました。 ■―かくして1週間。 板ポリ助に貼った絵を簡単に操る仕組みを作ったドン!キター! 以下のコードのMySpriteというクラスがそれです。 こいつに絵を(リソースIDを)与えて、draw●●メソッドを呼べば、移動・反転・拡大・回転!自由に描画できるドン。 MyRendererのonDrawFrameメソッドを見れば、簡単に描画できることが分かると思います。 「忍者盛り」もスプライト単位でクラス化していたので、簡単に置き換えができるドン。 天才やー。ワイ、ゴミカスやとおもたら天才やったんやー。 うん知ってた(´・∀・`)マァナ。オレってこう見えてけっこうナイスな男子なんよね。実際。 罪深いオレでまったく申し訳ないと思っているね。ここだけの話。マジで。 というわけでサモハンinチャンプル(サンプル) ↓MainActivity.java [java collapse="true"]</pre> package com.syscube.openglsample; import android.app.Activity; import android.os.Bundle; /** * アクティビティ * * @author イケメンのオレ * */ public class MainActivity extends Activity { /** * 生成 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // GLSurfaceViewを設定します setContentView(new MyGLView(this)); } } <pre>[/java] ↓MyGLView.java [java collapse="true"]</pre> package com.syscube.openglsample; import android.app.Activity; import android.opengl.GLSurfaceView; /** * GLSurfaceView * * @author ワイ * * これを使うとOpenGL(ES)で3Dプログラミング結果を描画できます * */ public class MyGLView extends GLSurfaceView { /** * コンストラクタ */ public MyGLView(Activity activity) { super(activity); this.getHolder().addCallback(this); // レンダラ―をセット this.setRenderer(new MyRenderer(activity.getApplicationContext())); } } <pre>[/java] ↓MyRenderer.java [java collapse="true"]</pre> package com.syscube.openglsample; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.opengl.GLSurfaceView.Renderer; /** * レンダラ― * * @author 拙者 * * このクラスがアプリケーションの実質の描画担当者になります。 * 何もしなくても勝手にonDrawFrameメソッドが呼ばれます。 * 描画したいものをonDrawFrameメソッドに指定すればよいです。 */ public class MyRenderer implements Renderer { /** * アプリケーションの幅(pixel) */ private static final int APP_SIZE_W = 480; /** * アプリケーションの高さ(pixel) */ private static final int APP_SIZE_H = 800; /** * アプリケーションコンテキスト */ private final Context context; /** * 板ポリで実現したスプライト(キャラクター) */ private MySprite ninja = new MySprite(); /** * コンストラクタ * @param context:アプリケーションコンテキスト */ public MyRenderer(Context context) { this.context = context; } /** * 生成(初期化) */ @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 画面のクリア時の色の指定 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 黒 //gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 白 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ちょっぴり高速化対策(効果の程は知らないがたぶんそれなりに) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ディザ使いません(デフォルトでOFFになってると思うけど念のため) gl.glDisable(GL10.GL_DITHER); // ポリゴンの面に陰影をつけません gl.glShadeModel(GL10.GL_FLAT); // ポリゴンの輪郭がジャギジャギしてもかまいません gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_FASTEST); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // スプライト用のビットマップ(キャラクター画像)をロードします //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ this.ninja.load(gl, this.context.getResources(), R.drawable.ninja); } /** * 向き変更 * このメソッド内でアプリケーションの描画スクリーンを設定する */ @Override public void onSurfaceChanged(GL10 gl, int w, int h) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ビューポート(表示領域)の指定 // // 【引数の説明】 // 開始X座標, 開始Y座標, 幅, 高 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glViewport(0, 0, w, h); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // プロジェクターに投影するような感じにする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // プロジェクションモードに設定 gl.glMatrixMode(GL10.GL_PROJECTION); // スクリーン座標を初期化 gl.glLoadIdentity(); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ビューポート内の座標系を左上(0, 0)に設定 // こうしないと左下が(0, 0)になってややこしくなる // // 【引数の説明】 // 左X, 右X, 下Y, 上Y, 手前Z, 奥Z // 2Dゲームなので手前Zと奥Zは気にしなくてよい //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glOrthof(0.0f, APP_SIZE_W, APP_SIZE_H, 0.0f, -1.0f, 1.0f); } /** * 描画 * これは毎フレーム勝手に呼び出されます(メインループに相当する) */ @Override public void onDrawFrame(GL10 gl) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // キャラクターをお好きなように描画します //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // x=0, y=0の座標に普通に描画 this.ninja.draw(gl, 0, 0); // x=0, y=64の座標にデブッチョ(横幅2倍)に描画 this.ninja.drawEx(gl, 0, 64, 2, 1); // x=64, y=64の座標に左右反転に描画 this.ninja.drawTurnLR(gl, 64, 128); // x=200, y=200の座標に40度傾けて描画 this.ninja.drawRota(gl, 200, 200, 40); } } <pre>[/java] ↓MySprite.java [java collapse="true"]</pre> package com.syscube.openglsample; import javax.microedition.khronos.opengles.GL10; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLUtils; import android.util.Log; /** * スプライトクラス * * @author 忍者マン * * ビットマップ(つまり画像)を、矩形の板ポリゴンにテクスチャとして貼りつけるクラスです。 * loadメソッドを呼んで初期化しておけば、いつでもdraw●●メソッドで自由に描画できます。 * ビットマップは、タテヨコが必ず2の2乗の正方形でなければいけません。 * */ public class MySprite { /** * テクスチャID */ private Integer textureID = null; /** * 板ポリゴン(矩形) */ private MyPorigon porigon = null; /** * リソースのビットマップをロードしてテクスチャ登録します * * @param gl:GL10 * @param res:コンテキストリソース * @param id:ビットマップのリソースID * @return true:成功 */ public boolean load(GL10 gl, Resources res, int id) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ビットマップをメモリにロード //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Bitmap bitmap = BitmapFactory.decodeResource(res, id); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ビットマップのイレギュラーチェック //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ロード正常チェック if(bitmap == null) { Log.e("Error!", "ビットマップロードに失敗ですドン!"); } // サイズが2の2乗の正方形かどうかチェック if(this.isNumberPowerOfTwo(bitmap.getWidth()) == false || this.isNumberPowerOfTwo(bitmap.getHeight()) == false) { Log.e("Error!", "ビットマップが2の2乗の正方形じゃないですドン!"); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 板ポリゴンを生成 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ this.porigon = new MyPorigon(bitmap.getWidth(), bitmap.getHeight()); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ビットマップをテクスチャとして登録 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ this.registTexture(gl, bitmap); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ビットマップをメモリから破棄 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 上でテクスチャ登録してるのでもう要らない if(bitmap != null) { bitmap.recycle(); bitmap = null; } // いまのうちにガベージコレクト System.gc(); return true; } /** * 数値が2の乗数かどうかを返します * @param n:数値 * @return true:2の乗数 */ private boolean isNumberPowerOfTwo(int n) { return (n & (n - 1)) == 0; } /** * ビットマップをテクスチャとして登録します * @param gl:GL10 * @param bitmap:ビットマップ */ private void registTexture(GL10 gl, Bitmap bitmap) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 使用可能なテクスチャ識別番号を取得 // テクスチャ識別番号はOpenGLが管理しているので // プログラマはOpenGLに問合わせて空き番号をもらいます // glGenTexturesが問合せメソッド //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ int[] textures = new int[1]; gl.glGenTextures(1, textures, 0); // テクスチャ管理番号の保存 this.textureID = textures[0]; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャ識別番号とビットマップの紐付 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // まず今回のテクスチャ管理番号をバインドする gl.glBindTexture(GL10.GL_TEXTURE_2D, this.textureID); // そのバインドした状態でビットマップを与えることで紐づく GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャを拡大・縮小する方法の指定 // // 【引数の説明】 // GL_TEXTURE_2D(固定), 拡大時の指定 or 縮小時の指定, 伸縮方法 // // 拡大時の指定 or 縮小時の指定は、 // GL_TEXTURE_MAG_FILTERで拡大時の指定 // GL_TEXTURE_MIN_FILTERで縮小時の指定 // // 伸縮方法は、 // GL_NEARESTは軽いけど見た目が荒くなる // GL_LINEARは重いけど見た目が滑らかになる //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャの繰り返し方法の指定 // // 【引数の説明】 // GL_TEXTURE_2D(固定), X方向の指定 or Y方向の指定, 繰り返し方法 // // X方向の指定 or Y方向の指定は、 // GL_TEXTURE_WRAP_S:X方向の指定 // GL_TEXTURE_WRAP_T:Y方向の指定 // // 繰り返し方法は、 // GL_REPEAT:繰り返しする // GL_CLAMP:繰り返ししない(OpenGL ESでは使えないみたい) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); } /** * 描画します * @param gl:GL10 * @param posX:X座標 * @param posY:Y座標 */ public void draw(GL10 gl, float posX, float posY) { // マトリックスを設定 this.porigon.setMatrix(gl, posX, posY, 1.0f, 1.0f, 0.0f, false, false); // テクスチャを描画 this.porigon.draw(gl, this.textureID); } /** * 左右反転描画します * @param gl:GL10 * @param posX:X座標 * @param posY:Y座標 */ public void drawTurnLR(GL10 gl, float posX, float posY) { // マトリックスを設定 this.porigon.setMatrix(gl, posX, posY, 1.0f, 1.0f, 0.0f, true, false); // テクスチャを描画 this.porigon.draw(gl, this.textureID); } /** * 上下反転描画します * @param gl:GL10 * @param posX:X座標 * @param posY:Y座標 */ public void drawTurnTB(GL10 gl, float posX, float posY) { // マトリックスを設定 this.porigon.setMatrix(gl, posX, posY, 1.0f, 1.0f, 0.0f, false, true); // テクスチャを描画 this.porigon.draw(gl, this.textureID); } /** * 拡大縮小描画します * @param gl:GL10 * @param posX:X座標 * @param posY:Y座標 * @param exRateX:X方向拡大縮小率(1.0で等倍) * @param exRateY:Y方向拡大縮小率(1.0で等倍) */ public void drawEx(GL10 gl, float posX, float posY, float exRateX, float exRateY) { // マトリックスを設定 this.porigon.setMatrix(gl, posX, posY, exRateX, exRateY, 0.0f, false, false); // テクスチャを描画 this.porigon.draw(gl, this.textureID); } /** * 回転描画します * @param gl:GL10 * @param posX:X座標 * @param posY:Y座標 * @param degree:角度(0~360) */ public void drawRota(GL10 gl, float posX, float posY, float degree) { // マトリックスを設定 this.porigon.setMatrix(gl, posX, posY, 1.0f, 1.0f, degree, false, false); // テクスチャを描画 this.porigon.draw(gl, this.textureID); } } <pre>[/java] ↓MyPorigon.java [java collapse="true"]</pre> package com.syscube.openglsample; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.opengles.GL10; /** * (矩形)板ポリゴン * * @author オレがガンダムだ * */ public class MyPorigon { /** * マトリックスのクラス * マトリックスと名付けてますが、単に、座標とか諸々をまとめた構造体みたいなものです */ private class Graph2DMatrix { /** * X座標 */ public float posX = 0.0f; /** * Y座標 */ public float posY = 0.0f; /** * 拡大・縮小率X(1.0で等倍) */ public float exRateX = 1.0f; /** * 拡大・縮小率Y(1.0で等倍) */ public float exRateY = 1.0f; /** * 角度 */ public float degree = 0.0f; /** * 設定します * @param sizeW:画像1コマ分のサイズ(幅)px * @param sizeH:画像1コマ分のサイズ(高)px * @param posX:X座標(左) * @param posY:Y座標(上) * @param exRateX:拡大・縮小率X * @param exRateY:拡大・縮小率Y * @param degree:角度 * @param isLRReverse:trueで左右反転 * @param isTBReverse:trueで上下反転 */ public void set(int sizeW, int sizeH, float posX, float posY, float exRateX, float exRateY, float degree, boolean isLRReverse, boolean isTBReverse) { this.posX = posX; this.posY = posY; this.exRateX = exRateX; this.exRateY = exRateY; this.degree = degree; // 左右反転するときのみ if(isLRReverse) { // 拡大・縮小率を負にすると反転する this.exRateX *= -1.0f; // 左右反転に伴ってサイズ(幅)の分だけ移動させる(そうしないと左に寄ってしまう) this.posX += sizeW; } // 上下反転するときのみ if(isTBReverse) { // 拡大・縮小率を負にすると反転する this.exRateY *= -1.0f; // 左右反転に伴ってサイズ(高)の分だけ移動させる(そうしないと上に寄ってしまう) this.posY += sizeH; } } } /** * マトリックスのインスタンス */ private Graph2DMatrix matrix = new Graph2DMatrix(); /** * UV配列オブジェクト(U:ヨコ、V:タテとする左上原点の画像切り出し範囲。画像全体をサイズW=1.0f、サイズH=1.0fとして表現される) */ private FloatBuffer uvArray = null; /** * 頂点配列オブジェクト */ private FloatBuffer vertexArray = null; /** * サイズ(幅) */ private final int sizeW; /** * サイズ(高) */ private final int sizeH; /** * 半分のサイズ(幅) */ private final int halfSizeW; /** * 半分のサイズ(高) */ private final int halfSizeH; /** * コンストラクタ * @param sizeW:テクスチャの幅(pixel) * @param sizeH:テクスチャの高さ(pixel) */ public MyPorigon(int sizeW, int sizeH) { this.sizeW = sizeW; this.sizeH = sizeH; // 半分のサイズを設定 this.halfSizeW = this.sizeW / 2; this.halfSizeH = this.sizeH / 2; // UV配列オブジェクトを生成する this.uvArray = this.createUVArray(); // 頂点配列オブジェクトを生成 this.vertexArray = this.createVertexArray(); } /** * マトリックスを設定します * @param gl:GL10 * @param posX:X座標 * @param posY:Y座標 * @param exRateX:X方向拡大縮小率(1.0で等倍) * @param exRateY:Y方向拡大縮小率(1.0で等倍) * @param degree:角度(0~360) * @param isLRReverse:左右反転するかどうか * @param isTBReverse:上下反転するかどうか */ public void setMatrix(GL10 gl, float posX, float posY, float exRateX, float exRateY, float degree, boolean isLRReverse, boolean isTBReverse) { this.matrix.set(this.sizeW, this.sizeH, posX, posY, exRateX, exRateY, degree, isLRReverse, isTBReverse); } /** * 描画します * @param gl:GL10 * @param textureID:テクスチャID(nullでテクスチャ無し) */ public void draw(GL10 gl, Integer textureID) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 頂点配列を有効にする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ブレンドを有効にする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 色と透明度の指定 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // まっ白 gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // 最後の引数を0.0f~1.0fの範囲で透明度を表せます if(textureID != null) { //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャ、テクスチャ座標配列を有効にする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャ画像の指定 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャの指定 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID); // 0番テクスチャを有効化(この板ポリゴンにテクスチャを重ねて貼る場合に0~Nで指定するが今回は0しかない) gl.glActiveTexture(GL10.GL_TEXTURE0); // 0はデフォルトで有効のためこの行はコメントアウトしてもかまわない //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // UV配列オブジェクトの指定(テクスチャのどの部分を切出して描画するか) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, this.uvArray); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 頂点配列オブジェクトの指定 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertexArray); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // マトリックスの有効化 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // マトリックス有効化 gl.glPushMatrix(); // まず移動(実際は最後に移動が適用される) gl.glTranslatef(this.matrix.posX, this.matrix.posY, 0.0f); // 次に回転 if(this.matrix.degree > 0 || this.matrix.degree < 0) { // 画像中心点で回転させるために移動が必要 gl.glTranslatef(this.halfSizeW * this.matrix.exRateX, this.halfSizeH * this.matrix.exRateY, 0.0f); // 回転させる gl.glRotatef(this.matrix.degree, 0.0f, 0.0f, 1.0f); // 移動を元に戻す gl.glTranslatef(-this.halfSizeW * this.matrix.exRateX, -this.halfSizeH * this.matrix.exRateY, 0.0f); } // 最後に拡大・縮小 gl.glScalef(this.matrix.exRateX, this.matrix.exRateY, 1.0f); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 描画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // マトリックスの無効化 // これをしないと全ての描画オブジェクトに影響してしまいます //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // マトリックス無効化 gl.glPopMatrix(); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 頂点配列、テクスチャ座標配列を無効にする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // テクスチャ、テクスチャ座標配列を無効にする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glDisable(GL10.GL_TEXTURE_2D); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ブレンドを無効にする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gl.glDisable(GL10.GL_BLEND); } /** * UV配列オブジェクトを生成します * @return UV配列オブジェクト */ private FloatBuffer createUVArray() { // float配列で定義 float[] uv = { 0.0f, 0.0f, // 左上 0.0f, 1.0f, // 左下 1.0f, 0.0f, // 右上 1.0f, 1.0f, // 右下 }; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 画像全体を幅1.0、高さ1.0として扱われる // 切出し範囲のWidth/Heightを0.0~1.0の間で指定することができる // 今回は画像切り出しなしなので、1.0までを(全体を)指定をする //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // FloatBufferに変換して返す return this.getFloatBufferFromFloatArray(uv); } /** * 頂点配列オブジェクトを生成します */ private FloatBuffer createVertexArray() { float left = 0.0f; float top = 0.0f; float right = left + this.sizeW; float bottom = top + this.sizeH; //頂点バッファの生成 float[] vertexs = { // x, y, z left, top, 0.0f, // 頂点0 left, bottom, 0.0f, // 頂点1 right, top, 0.0f, // 頂点2 right, bottom, 0.0f, // 頂点3 }; // FloatBufferに変換して返す return this.getFloatBufferFromFloatArray(vertexs); } /** * float配列をFloatBufferに変換します * @param fa:float配列 * @return 変換後のFloatBuffer */ public FloatBuffer getFloatBufferFromFloatArray(float[] fa) { // このやり方はAndroidDocで紹介されているため通例(と思われる) FloatBuffer fb = ByteBuffer.allocateDirect(fa.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); fb.put(fa).position(0); return fb; } }[/java] なげぇよ。なげーんだよ! しかし、それがAndroid!OpenGL ES! 実行結果は↓こんなん。好きな位置に、好きな大きさで、好きな角度で絵を表示できてます。 ちなみに使った画像は↓これ。忍者盛りの赤丸くん(64px*64px) resフォルダ直下に、drawable-nodpiというフォルダを作って、そこに入れるのですよ。 そういえば、このサンプルは、頂点配列を毎フレームGPUに転送しているよ。 なので、もっと高速化したい場合は頂点バッファで、あらかじめGPUに転送しておくとよいかもよ。 床井先生のサイトがかなり参考になった。OpenGLについては全部ここに書かれとる。 和歌山大学・床井先生のサイト(ゼミのサイトっぽい) ちなみに、ちょっとだけ、自分のゲームを板ポリに置き換えてみたのですが、その良さはまだいっこもわかりません。 むしろ、なんか遅くなってる気がす・・・ゲフン! たぶん、こういうゲームだとOpenGLの恩恵をそれほど受けられないのか、ワイのプログラムがゴミ過ぎるかのいずれかだろうと思います。 まとめると、ゴミ野郎はゴミ野郎らしく、毎日4時間睡眠で頑張れってことです。 ニキビが出来てもかまわねぇオレカッケェ(深刻)。

  • パソコン関連

パスワード管理をしよう!

noimage

パスワード管理をしよう!

大阪支社のとよです。 夏の暑さもどこへやら、すっかり秋めいてきましたね。 さて、今回はとくに前振りもなく「パスワード管理」のソフト紹介です。 ネット通販やウェブ上のサービスがどんどん増えていく昨今、 困るのが各サイトのユーザーIDとパスワードの管理。 セキュリティのためには、サイト毎に異なるIDとパスワードを登録するのが望ましい―― でも、それをいちいち管理するのは、地味に大変で面倒です。 と、いうことでご紹介するのがパスワード管理ソフト『KeePass Password Safe』です。 『KeePass Password Safe』とは? 海外製のパスワード管理フリーソフトです。 このソフトが優れているのは、安全管理もさることながら、 登録しているパスワードを、ささっとクリップボードにコピーできたり、 ログイン画面上で自動入力したりと、かなり使い勝手がいいところ。 と、言葉で説明してもいまいち伝わらないので、 早速、導入してみましょう! 『KeePass Password Safe』のダウンロード ということで、てきぱきダウンロードしてみたいと思います。 ダウンロードページからセットアップ実行ファイル「KeePass 2.XX Setup.exe」をクリックします。 次に、日本語化ファイルを同じページからダウンロードします。 「Translation 2.x」配下の「KeePass-2.XX-Japanese.zip」をクリックします。 (バージョンは実行ファイルを同じものを選択) 以下の2つのファイルがダウンロードされますので、 さくさくっと実行ファイルをクリックします。 『KeePass Password Safe』のインストール 実行するとインストーラが立ち上がります。 基本的にデフォルト設定のままでOKなので、 「Next」ボタンを連打!連打! で、うまくインストールされると、下記のような画面が出てきます。 デフォルトでは「起動する」にチェックがついているのですが、 起動の前に日本語化を行いたいので、ここはチェックを外して「Finish」ボタンをクリック。 『KeePass Password Safe』の日本語化 先ほどダウンロードした日本語化ファイルを開き、中にある 「Japanese.lngx」をKeePassをインストールしたフォルダにコピーします。 (デフォルトでは『C:\Program Files\KeePass Password Safe 2』) 実行ファイルをクリックすると、画面が立ち上がります。 が、日本語化ファイルをコピーしただけでは、日本語は反映されず、英語表示のままです。 下記の「Change Language...」をクリックして言語選択画面を表示させます。 「Japanese」を選択して画面を閉じると、自動的に再起動します。 (このへんで、マウスで文字を書くのを断念。。。) 再起動後、KeePassに日本語が反映されます。 『KeePass Password Safe』の設定 再起動後、さっそく設定を行っていきます。 まず、下記の赤枠の「新規」をクリックします。 複合マスターキー作成画面が表示されます。 これは何かというと、パスワード管理データベースにアクセスするための パスワードを登録しましょう、という画面です。 とりあえず、適当にパスワードを登録しておきましょう。 ちなみに、キーファイルを指定することも可能です。 これは特定のファイルをパスワード代わりに設定するというもの。 (キーファイルを更新すると、パスワード管理データベースにアクセスできなく なってしまうので、注意が必要です。。。) 次に、パスワード管理データベースの各種設定画面が表示されます。 特にこだわりがなければ、何も弄らずに「OK」ボタンをクリックします。 これで基本の設定は終了です。 次に、パスワード管理を行ってみましょう。 パスワードの登録&管理 基本の設定が終わると、下記のような画面が表示されます。 赤枠の鍵アイコンをクリックし、エントリー追加画面を表示させます。 こんな画面が出てきますので、ようやくパスワードを登録します。(ここまでがえらい長かった。。) 必要な項目を入力して「OK」をクリックすると、登録されます。 無事に登録が終わると、下記のように登録したエントリが表示されます。 ここで、「ユーザー名」をダブルクリックすると、 クリップボードに「ユーザー名」がコピーされます。 同様に「パスワード」をダブルクリックすると、 クリップボードに「パスワード」がコピーされます。 なお、クリップボードにコピーされた内容は、12秒後に爆発消去されます。 このほか、ブラウザでログインページを表示させている状況で、 右クリックから「自動入力の実行」を選択すると、ユーザー名とパスワードが 自動入力されます。 また、ログインページのユーザー名欄にフォーカスを当てた状況で 「Alt」+「左Ctrl」+「A」を同時押しすると、 ページ内容から、自動でユーザー名とパスワードを判別して自動入力してくれます。 今回はブラウザでの使用を解説しましたが、 iTunesなどの各種ツールでも自動入力が可能です。 海外でも大人気!というこのパスワード管理ソフト。 僕も早速、導入してみようと思うのですが、 まずは、ユーザーIDとパスワードを書いたテキストファイルが どこにあるか、PC内を探してみる必要があるようです。。

  • ブログ

GITADORA Tri-Boost GuitarFreaks 赤グラになりました

noimage

GITADORA Tri-Boost GuitarFreaks 赤グラになりました

たまには趣味のお話を。 9月の大型連休中にゲーセンに足しげく通い、赤グラ達成いたしました。 初代XGの時代は紫だったような気がします。 いつだったか赤を目指して頑張って、達成した時はめっちょうれしかったですが、 今回はなんだかあっさり達成したような気がします。 これ何かわかります? …伸びしろですね! 銅はまだまだ遠いですが、目標にしたいと思います。

  • ブログ

テストエクスプローラーにasyncメソッドが出てこない…

noimage

テストエクスプローラーにasyncメソッドが出てこない…

そういや、いつの間にか無償版でも単体テストプロジェクトって作成できるようになったんですね。 (Visual Studio 2013 Expressからかな?) 以前はProfessionalからしか使えなかったと記憶しておりますが。 ですが、流石に無償版なので、カバレッジ測定はできません。 こういう単体テスト用ツール使うときはカバレッジ測定が主な目的だと思っているので、無償版では使いもんにならんとは思っております。 あとは大体は画面作って動かして確認するから使ってこなかったのですが… ちょっとHttpのライブラリ的なことを作っていまして、後で画面から呼び出して確認しますが、単体テストプロジェクトつーのを使ってみようと思い立ったのです。 .Net Framwork 4.5からHttpClientが使いやすくなってawait/asyncで非同期処理が簡単になって。 いいことづくめだなーと思っていたのですが- [cpp] [TestClass] public class HttpUtilityTest { [TestMethod] public async void GetTest001() { string ret = await HttpUtility.Get("https://www.sys-cube.co.jp"); } } [/cpp] この「GetTest001」がテストエクスプローラーに現れない! すべてを実行を押しても、リビルドしても、Visual Studio 2015 RCを再起動しても! 困ったときはGoogle先生に聞く- どうやら戻り値をTaskにすればよいらしい? [cpp] [TestClass] public class HttpUtilityTest { [TestMethod] public async Task GetTest001() { string ret = await HttpUtility.Get("https://www.sys-cube.co.jp"); } } [/cpp] リビルドすると- キタ━━━━(゚∀゚)━━━━!! テストエクスプローラーに「GetTest001」が現れました! いやあ、なんという罠… お仕事で使う以外では単体テストプロジェクトはもういいかなって思いました。(小並感 (async voidがおかしいって話はおいといてください。)

  • 社長ブログ

駆け引きする相手を間違えるなよ。

noimage

駆け引きする相手を間違えるなよ。

こんにちは、田中弘です。 人の心を読むのが得意だと自負する方を時々お見かけしますが、そう言うあなたも実は読まれているかもしれませんね。 数年前、飛び込み営業をした会社の扉のすぐ近くに、年配のおじさんが座っていました。 僕は「システム会社ですが、システム買って下さい!」っていつものように声をかけました。 大体、辛辣な言葉で追い出されることが多かったのですが、まぁ座りなって声をかけて頂き、隣に座らせて頂きました。 その際に、システムの話ではなく、世間話をさせて頂く機会を頂き、僕の生い立ちを話して、おじさんもちょっぴり心を許してくれました。 そのおじさんは、実は40年以上会社経営する社長様だったんですね。 それを機会に、時々、ランチを一緒にして頂く仲になり、その度に、商売の事、お金の事、恋愛の事、人生の事を沢山教えて頂きました。 僕も夢中になって色々と質問するし、真摯に正直に答えてくれて大変、その方の事を好きになりました。 それからそのような関係から1年が経った頃でしょうか、うちの会社の資金繰りが厳しい時期に直面しました。 色々教えて頂いているのに、馬鹿ですよね。 全く、学ばずどんぶり勘定なんです。 そこで思いついたのは、そのおじさんの会社に相場より高いシステムを導入して頂こうと思ったのです。 僕と言う人間を気に入って貰って、ランチにも誘って貰って、甘えていたんですね。 いつものようにランチに行って、帰りの車の中で、その話をしようとした瞬間、 「駆け引きする相手を間違えるなよ」って。 凄く驚いて鳥肌が立ちました。 僕の気持ちを既に読んでいたのでしょうね。 もちろん、その後、こってり説教して頂き、無事、相場より高いシステムを導入して頂きました。 僕が資金繰りで困っていることも、甘えて買ってもらおうとしたことも、何もかも全てお見通しの上で、助ける意味も込めて、結果的には導入もして頂けたのだと思います。 自分より年配の経営者に駆け引きするなんて無謀すぎますね。 百戦錬磨の経営者は全てお見通しです。 昨日もランチご馳走になりました。 それでは、また会いましょう! 株式会社システムキューブもよろしく!

1 42 43 44 45 46 74