みつろぐ

やれることはやってみる

Monodevelopでソースコードの折りたたみ機能を使う

先日Unity5.3がリリースされbuild-inのMlnodevelopでも日本語の入力が可能になりました。

最近はずっと設定してそのままだったXamarinを利用していたので、どこにソースコードの折りたたみ機能があったっけと困ったのでメモ。

Preference > Text Editor > Code Folding > Enable code folding のチェックをON
f:id:Mitu217:20151212175523p:plain

f:id:Mitu217:20151212175547p:plain


これでソースコードの折りたたみが有効になります。

#regionsに関する設定もここからできるのね。

コメント付きゆゆ式アイコンを作れるツールを作ってる話

この記事は ゆゆ式 Advent Calendar 2015 - Adventar 12日目の記事です。

 

漫画&アニメの各種ネタの検証やイラスト投稿が多いこのゆゆ式AdventCalendarですが、初日以来のプログラム系です。可愛いイラストとか描けなくて申し訳ない気持ちです。

 

ゆゆ式BD-Boxはゆゆ式Blu-rayで楽しめるということはもちろんのこと、同梱されている設定資料集や台本の破壊力が高い。自分は鼻血を出しながら2日かけてじっくり読みこんでしまいました。それらの紹介については2日目の記事を御覧ください。

shunozo.hatenablog.com

 

また私事ですが、現在絶賛卒業研究中ということで辛い辛いと言いながら過ごす日々を送っております。しかし、作業の傍らでゆゆ式を流しておくことでなんと作業効率が120%になるらしいのです!!(※効能には個人差があります)

研究真っ盛りな大学生にはぜひおすすめな一品です!!

ゆゆ式 Blu-ray BOX

ゆゆ式 Blu-ray BOX

 

 

ふぅ…

さてここから本題になりますが、まずは成果物を置いておきます。

 

ゆゆ式アイコンツール

f:id:Mitu217:20151211230059p:plain

どんなやつ?

  • ゆずこ/縁/唯から好きなキャラを選んで画像を作れる。
  • 好きなコメントを打てる。
  • 画像として保存したりTwitterで共有したりできる。(Twitterで認証が必要) 

なんで作った?

  • ブルーレイ届いたしアカウントのアイコン変えるか…
  • どうせなら鑑賞しながら考えよう…
  • (鑑賞中)この表情めっちゃ好き…
  • (半分ぐらい作ったところで)あ、これコメント入れられるようにしたら最高…

だいたいこんな流れ(つまりテンションと勢い)

実装について

  • 画像のベースはIllustratorでパスをポチポチして作成。
  • キャラクターの表情は完全に私の好み。
  • アプリ自体はSinatraで作成、初めてレスポンシブなwebページ作った。
  • Twitter認証はOmniAuthでやってます。楽ちん
  • 画像生成部分はRMagickを使って実装。描画元の画像を指定してコメントの内容と位置さえ指定すればOK。これも楽ちん。

感想

  • ゆずこ/縁/唯の三人しか実装できてないのは大変申し訳無い。絶対追加する。
  • 個人的に表情とか自由に変えたいので目とか眉とかパーツごとに指定できるようにする予定。
  • その他、欲しい機能面白そうな希望はTwitterやらで教えてくれると助かります。
  • 面白いネタ考えて盛り上げてくれ!! 

 

おまけ1

今回作った者のコア部分を流用して、自分のTwitterアカウントのアイコンが自動的に変わるようにもできます。

 

f:id:Mitu217:20151211235106p:plain

これが

f:id:Mitu217:20151211235134p:plain

これで

f:id:Mitu217:20151211235148p:plain

こうなります

 

おまけ2

今までDVD版しか持っていなかったことからBlu-rayを手に入れた喜びから、時空の歪みを発生させてラズパイでゆゆ式が無限に再生される装置を作りました。時空の歪みの影響で画像は載せられませんが、モニタの電源をつけたらゆゆ式が流れている喜びは半端ではありません。

元ネタは 作る: アマガミSSテレビ - The Great Underground Home Page

 

 

 

東京Node学園祭2015に参加してきました

11月7日(日)に渋谷マークシティで行われた「東京Node学園祭2015」に参加してきました。

実は開催前日まで参加人数の枠が埋まっていた関係で自宅待機の予定だったのですが、枠が空いたので非常にラッキーという感じでした。
ただ登録しようとしたら日付跨いでてショックを受けたり、運営の神対応があったりして前日の夜は情緒不安定でした。



普段Unityとかのゲーム系の勉強会に参加することが多くて、今回のインフラ寄りというか言語寄り?なイベントには初参加だったので、Electronとかドキュメント作成ツールはてなブログのリニューアルの話とかを終始Node.js(Javascript)すげなぁという小並感たっぷりなことを考えながら、楽しく参加することができました。

最後に行われた懇親会も美味しい物が出たり、突発LT大会が開かれたりして最高って感じでした。

Pebble timeをプレオーダーで購入しました

一部で話題になった(私の周りだけ?)Pebble timeをプレオーダーで購入しました。
これから購入したいと考えている人のために、注文してから到着までのざっとした流れを書いておきますね。


7/9 プレオーダー注文

f:id:Mitu217:20150727221317p:plain

7/17 発送通知

f:id:Mitu217:20150727221511p:plain

7/21 追跡情報が表示されるようになる

f:id:Mitu217:20150727221139p:plain

7/25 到着

f:id:Mitu217:20150725110321j:plain



日数的には発送されてから8日ですね。
特別急いでなければDHLを使わなくても十分な早さっぽいです。

ただ、これからSteelの発送とかも始まりそうなので状況は変わり
そうな気もします。

ちなみにですがDHLを選択しなかったのは、注文ミスです。注文が確定してから気付きました。結果的に全く問題ありませんでしたが…



設定まわりに関しては執筆時点(2015/7/27)での最新FW3.2が不具合だらけですごいことになっているので、別記事にまとめようと思います。

【Unity】マウス/タッチ入力情報を管理しやすくしてみる

久々にUnityでスマートフォンゲームを作成する機会をもらったので、再勉強の意味も兼ねてタッチやマウスでの入力情報を管理する方法について検討してみました。


Unityではマウス入力やタッチ入力は比較的簡単に取れるのですが、それぞれが独立しているのため管理が面倒だなと感じたのが事の発端です。

どこまでを今回作成するものの管理対象にするかで非常に悩みましたが、実現すべき要件は次のような形で落ち着きました。

  • シングルタップのみサポートする
  • タッチ/クリックした画面上の座標が取得できること
  • サポートするアクションとしてはタッチ・ドラッグ・フリック
  • ロングタップなどのために経過時間を取得できるようにする

4.6以降の新UIなども考慮しようとも考えましたが既にEventSystemという自由度がまぁまぁ高いシステムが出来上がっているようですので、今回はゲームロジックに直結する部分のみをサポート範囲としました。tips.hecomi.com


実際に作成したものはこちらから参照できます。

作成するにあたって以下のサイトをめちゃくちゃ参考にさせていただきました。kikikiroku.session.jp

GestureInfo

まずは取得可能な情報のクラスについてです。
要件にあった情報に加えて、これは使用する場面があるのでは?という情報も追加しています。
タッチの場合、触れている指ごとにIDが指定されているのでそれも取得できるようにしました。タッチIDを取得できるようにすることでUIとの干渉が考えられる場面に対応できるようになります。

using UnityEngine;

public class GestureInfo 
{
	/// <summary>
	/// ジェスチャー座標
	/// </summary>
	public Vector3 ScreenPosition {
		get;
		set;
	}
	
	/// <summary>
	/// 前フレームからの移動距離
	/// </summary>
	public Vector3 DeltaPosition {
		get;
		set;
	}
	
	/// <summary>
	/// 前フレームからの経過時間
	/// </summary>
	public double DeltaTime {
		get;
		set;
	}
	
	/// <summary>
	/// ドラッグ距離
	/// </summary>
	/// <value> トレース有効時は特定期間中のドラッグ距離 </value>
	public Vector3 DragDistance {
		get;
		set;
	}
	
	/// <summary>
    /// 管理しているタッチ
    /// </summary>
    public int TouchId {
        get;
        set;
    }
	
	/// <summary>
	/// ジェスチャーステータス
	/// </summary>
	public bool IsDown {
		get;
		set;
	}
	public bool IsUp {
		get;
		set;
	}
	public bool IsDrag {
		get;
		set;
	}
}

InputGesture

次にタッチアクションが発生した際に呼ばれるイベント郡をまとめたインターフェイスです。
ゲームロジックを管理するクラスにこれを継承させて使用することを想定しています。実際にジェスチャーを有効にするには後述するシングルトンなマネージャークラスにクラス情報を登録する必要があります。

public interface InputGesture{
	/// <summary>
	/// ジェスチャーの処理優先度
	/// </summary>
	/// <value> 0が優先度高、数値が大きくなるにつれて優先度低 </value>
	int Order {
		get;
	}
	
	/// <summary>
	/// ジェスチャーを処理する必要があるのかを判定
	/// </summary>
	bool IsGestureProcess(GestureInfo info);
	
	/// <summary>
	/// ジェスチャー開始時に呼ばれる
	/// </summary>
	void OnGestureDown(GestureInfo info);
	
	/// <summary>
	/// ジェスチャー終了時に呼ばれる
	/// </summary>
	void OnGestureUp(GestureInfo info);
	
	/// <summary>
	/// ドラッグジェスチャー中に呼ばれる
	/// </summary>
	void OnGestureDrag(GestureInfo info);
	
	/// <summary>
	/// フリックジェスチャー時に呼ばれる
	/// </summary>
	void OnGestureFlick(GestureInfo info);
}

InputGestureManager

最後にタッチ情報を管理するシングルトンなマネージャークラスです。
タッチ/クリックの情報はこのクラスで処理をおこない、既に登録されているInputGestureを継承したクラスの対してイベントを発行していく形になっています。
ドラッグ距離・ドラッグ経過時間については、単純に開始地点と終了地点から計算する方法とトレース(フレーム毎のタッチ座標をキューに保存)した情報をもとに計算する方法の2つを用意しました。トレースを用いた場合、直近n秒のドラッグ情報が取得可能なためロジックによっては使用場面があるのではないかと思います。

using UnityEngine;
using System.Collections.Generic;

public class InputGestureManager : SingletonMonoBehaviour<InputGestureManager> 
{
    /// <summary>
    /// 登録済みのジェスチャー配列
    /// </summary>
    
    private List<InputGesture> gestures = new List<InputGesture>();

    /// <summary>
    /// ジェスチャー情報
    /// </summary>
    private GestureInfo gestureInfo = new GestureInfo ();

    /// <summary>
    /// ジェスチャー中のトレースを有効にするかどうか
    /// </summary>
    public bool IsTrace = true;

    /// <summary>
    /// トレース中の位置情報
    /// </summary>
    private Queue<Vector3> tracePositionQueue = new Queue<Vector3> ();

    /// <summary>
    /// トレース中の時間情報
    /// </summary>
    private Queue<float> traceTimeQueue = new Queue<float> ();

    /// <summary>
    /// トレースデータ保持数
    /// </summary>
    public int TraceQueryCount = 20;

    /// <summary>
    /// 登録済みのジェスチャー配列
    /// </summary>
    public List<InputGesture> Gestures {
        get { return gestures; }
        set { gestures = value; }
    }

    /// <summary>
    /// 現在処理中のジェスチャー情報
    /// </summary>
    private InputGesture processingGesture {
        get;
        set;
    }

    /// <summary>
    /// ジェスチャーの追加
    /// </summary>
    public void RegisterGesture( InputGesture gesture ) {
        var index = this.gestures.FindIndex (g => g.Order > gesture.Order);
        if (index < 0) {
            index = this.gestures.Count;
        }
        this.gestures.Insert (index, gesture);
    }

    /// <summary>
    /// ジェスチャーの解除を行います
    /// </summary>
    public void UnregisterGesture( InputGesture gesture ) {
        this.gestures.Remove (gesture);
    }
  
    void Start() {
        if (!IsTrace) {
            this.TraceQueryCount = 2;
        }
    }
  
    void Update () {
        this.gestureInfo.IsDown = false;
        this.gestureInfo.IsUp = false;
        this.gestureInfo.IsDrag = false;

        // 入力チェック
        var isInput = IsTouchPlatform() ? InputForTouch( ref this.gestureInfo ) : InputForMouse( ref this.gestureInfo );
        if (!isInput) {
            // 入力なし
            return;
        }

        // 入力処理
        if (this.gestureInfo.IsDown) {
            DoDown (this.gestureInfo);
        }
        if (this.gestureInfo.IsDrag) {
            DoDrag (this.gestureInfo);
        }
        if (this.gestureInfo.IsUp) {
            DoUp (this.gestureInfo);
        }
    }

    /// <summary>
    /// タッチパネル向けのプラットフォームかどうか取得します
    /// </summary>
    /// <returns>スマートフォン/タブレットの場合にtrueを返します</returns>
    bool IsTouchPlatform() {
        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) {
          return true;
        }
        return false;
    }

    /// <summary>
    /// タッチされたタッチ情報を取得します
    /// </summary>
    /// <returns>タッチ情報を返します。何もタッチされていなければnullを返します</returns>
    Touch? GetTouch() {
        if (Input.touchCount <= 0) {
            return null;
        }
        // 前回と同じタッチを追跡します
        for (int n=0; n<Input.touchCount; n++) {
            if( gestureInfo.TouchId == Input.touches[n].fingerId ) {
                return Input.touches[n];
            }
        }
        // 新規タッチ(タッチ開始時のみ)
        if (Input.touches[0].phase == TouchPhase.Began) {
            gestureInfo.TouchId = Input.touches[0].fingerId;
            return Input.touches[0];
        }
    
        return null;
    }

    /// <summary>
    /// タッチ入力情報をGestureInfoへ変換します
    /// </summary>
    /// <returns>入力情報があればtrueを返します</returns>
    bool InputForTouch( ref GestureInfo info ) {
        Touch? touch = GetTouch ();
        if (!touch.HasValue) {
            return false;
        }
    
        info.ScreenPosition = touch.GetValueOrDefault().position;
        info.DeltaPosition = touch.GetValueOrDefault().deltaPosition;
        switch (touch.GetValueOrDefault().phase) {
            case TouchPhase.Began:
                info.IsDown = true;
                break;
            case TouchPhase.Moved:
            case TouchPhase.Stationary:
                info.IsDrag = true;
                break;
            case TouchPhase.Ended:
            case TouchPhase.Canceled:
                info.IsUp = true;
                gestureInfo.TouchId = -1;
                break;
        }
        return true;
    }

    /// <summary>
    /// マウス入力情報をGestureInfoへ変換します
    /// </summary>
    /// <returns>入力情報があればtrueを返します</returns>
    bool InputForMouse( ref GestureInfo info ) {
        if (Input.GetMouseButtonDown(0)) {
            info.IsDown = true;
            info.DeltaPosition = new Vector3();
            info.ScreenPosition = Input.mousePosition;
        }
        if (Input.GetMouseButtonUp(0)) {
            info.IsUp = true;
            info.DeltaPosition = Input.mousePosition - info.ScreenPosition;
            info.ScreenPosition = Input.mousePosition;
        }
        if( Input.GetMouseButton(0)) {
            info.IsDrag = true;
            info.DeltaPosition = Input.mousePosition - info.ScreenPosition;
            info.ScreenPosition = Input.mousePosition;
        }
        return true;
    }

    /// <summary>
    /// ジェスチャー開始処理を行います
    /// </summary>
    void DoDown (GestureInfo info) {
        this.processingGesture = gestures.Find (ges => ges.IsGestureProcess (info));
        if (this.processingGesture == null) {
            return;
        }

        ClearTracePosition ();

        info.DeltaTime = 0;
        info.DragDistance = new Vector3 ();
        this.processingGesture.OnGestureDown (info);
    }

    /// <summary>
    /// ドラッグジェスチャー処理を行います
    /// </summary>
    void DoDrag (GestureInfo info) {
        if (this.processingGesture == null) {
            return;
        }

        AddTracePosition (info.ScreenPosition);
        info.DeltaTime = IsTrace ? GetTraceDeltaTime() : info.DeltaTime + Time.deltaTime;
        info.DragDistance = IsTrace ? GetTraceVector ( 0, 0 ) : info.DragDistance + GetTraceVector( 0, 0 );
    
        this.processingGesture.OnGestureDrag (info);
    }

    /// <summary>
    /// ジェスチャー終了処理を行います
    /// </summary>
    void DoUp (GestureInfo info) {
        if (this.processingGesture == null) {
            return;
        }
    
        info.DeltaTime = IsTrace ? GetTraceDeltaTime() : info.DeltaTime + Time.deltaTime;
        info.DragDistance = IsTrace ? GetTraceVector ( 0, 0 ) : info.DragDistance + GetTraceVector( 0, 0 );
        this.processingGesture.OnGestureUp (info);

        // フリックジェスチャー判定
        var v1 = GetTraceVector ( 0, 0 );
        var v2 = GetTraceVector ( this.tracePositionQueue.Count - 5, 0 );
        var dot = Vector3.Dot( v1.normalized, v2.normalized );
        if (dot > 0.9) {
            this.processingGesture.OnGestureFlick (info);
        }

        this.processingGesture = null;
    }

    /// <summary>
    /// トレース情報をクリアします
    /// </summary>
    void ClearTracePosition() {
        this.tracePositionQueue.Clear ();
        this.traceTimeQueue.Clear ();
    }

    /// <summary>
    /// ドラッグジェスチャー中の入力位置を追加します
    /// </summary>
    void AddTracePosition (Vector3 trace_position) {
        this.tracePositionQueue.Enqueue (trace_position);
        this.traceTimeQueue.Enqueue (Time.deltaTime);
    
        if (this.tracePositionQueue.Count > TraceQueryCount) {
            this.tracePositionQueue.Dequeue();
            this.traceTimeQueue.Dequeue();
        }
    }

    /// <summary>
    /// トレース経過時間を取得します
    /// </summary>
    float GetTraceDeltaTime() {
        float delta = 0;
        var times = this.traceTimeQueue.ToArray ();
        foreach (var t in times) {
            delta += t;
        }
  
        return delta;
    }

    /// <summary>
    /// トレースデータからベクトルを取得します
    /// </summary>
    Vector3 GetTraceVector ( int start_index_ofs, int end_index_ofs ) {
        var positions = this.tracePositionQueue.ToArray ();
        var sindex = start_index_ofs;
        var eindex = positions.Length - 1 - end_index_ofs;
        if (sindex < 0) {
            sindex = 0;
        }
        if (eindex < 0) {
            eindex = positions.Length - 1;
        }
        if (sindex >= positions.Length) {
            sindex = positions.Length - 1;
        }
        if (eindex >= positions.Length) {
            eindex = positions.Length - 1;
        }
        if (sindex > eindex) {
            var temp = sindex;
            sindex = eindex;
            eindex = temp;
        }
        return positions[eindex] - positions[sindex];
    }
  
    /// <summary>
    /// デバッグ表示のOn/Off
    /// </summary>
    public bool showDebug = false;
  
    /// <summary>
    /// デバッグ表示
    /// </summary>
    void OnGUI() {
        if (showDebug) {
            var info = this.gestureInfo;
            int x = 0;
            int y = 0;
            GUI.Label( new Rect(x,y,300,20), "ScreenPosition = " + info.ScreenPosition.ToString() );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "DeltaPosition = " + info.DeltaPosition.ToString() );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "IsDown = " + info.IsDown.ToString() );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "IsDrag = " + info.IsDrag.ToString() );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "IsUp = " + info.IsUp.ToString() );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "DeltaTime = " + info.DeltaTime.ToString() );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "DragDistance = " + info.DragDistance.ToString()  );
            y += 20;
            GUI.Label( new Rect(x,y,300,20), "processingGesture = " + (this.processingGesture == null ? "null" : "live")  );      
        }
    }
}

サンプル

実際にゲームロジックを作る際のサンプルを作成しました。画面をタップ/クリック時にcolliderコンポーネントが付与されたオブジェクトがあればそのオブジェクトの名前をログに出力してくれます。
使い方としては、インターフェイスInputGestureを継承してジェスチャーを有効にすれば使えるので非常に簡単だと思います。
サンプルコード中にも書いてありますが、UIと重なった時の処理はEventSystem.current.IsPointOverGameObject()を使って条件分岐してやればいいです。
ちなみに引数なしはマウス用、引数ありはタッチ用です。

using UnityEngine;
using UnityEngine.EventSystems;

public class ExampleGesture : MonoBehaviour, InputGesture {
	private Camera mainCamera;

	void Awake () {
		EnableGesture();
		mainCamera = Camera.main;
	}
	void OnDestroy () {
		DisableGesture();
	}
	
	public void EnableGesture () {
		InputGestureManager.Instance.RegisterGesture(this);			
	}
	public void DisableGesture () {
		InputGestureManager.Instance.UnregisterGesture(this);		
	}
	
	public int Order {
		get { return 0; }
	}
	
	public 	bool IsGestureProcess(GestureInfo info) {
		return true;
	}
	
	public void OnGestureDown(GestureInfo info) {
	    /// for 3D ///
	    RaycastHit hit3D;
	    Ray ray = mainCamera.ScreenPointToRay(info.ScreenPosition);
    	    if (Physics.Raycast(ray,out hit3D)) {
     	        Debug.Log(hit3D.collider.transform.name);
    	    }	

	    /// for 2D ///
	    Vector3 pos = Camera.main.ScreenToWorldPoint(info.ScreenPosition);
	    Collider2D hit2D = Physics2D.OverlapPoint(pos);
	    if (hit2D) {
		Debug.Log(hit2D.transform.name);
	    }
		
	    // オブジェクトの前のUIを考慮する場合は以下のような条件分岐を使用 ///
	    if (EventSystem.current.IsPointerOverGameObject() || EventSystem.current.IsPointerOverGameObject(info.TouchId)) {
				
	    }
	}
	
	public void OnGestureUp(GestureInfo info) {

	}
	
	public void OnGestureDrag(GestureInfo info) {

	}
	
	public void OnGestureFlick(GestureInfo info) {
	
	}
}

Windows8でISE Design Suite(ver14.7)をセットアップ

大学の研究室でFPGAを触る関係で開発環境を整えました。

その際に躓いたポイントがいくつかあったので共有します。

 

■ ISEのダウンロード

こちらにアクセスして、以下の画像を参考にダウンロードを進めてください。(要サインアップ&サインイン)

f:id:Mitu217:20150411124455p:plain

■ ISEインストール

ダウンロードしたtarファイルを解凍後、setupファイルが生成されるのでそちらを実行し、デフォルト設定のまま手順に沿ってインストールを進める。

インストールの途中でMATLABの設定?か何かを聞かれるが無視してOKを押す。

 

インストール終了後、Xilinx License Configuration Managerというのが立ち上がると思うが、何か操作をしようとするとWindows8環境では「動作が停止しました」と表示されると思う。

これはISEがWindows8に対応していないために起きる動作だという、同様の理由でISEなども立ち上がりはするが操作をするとソフトが落ちる

参考: Guide: Getting Xilinx ISE to work with Windows 8 64-bit - Page 1

 

win8で動作するように設定変更

前にあげたページを参考にすれば特に問題なく動くようになるはず。

一応手順を日本語化しておくと次のようになる。

 

ISE Design Suite 用

  1. 次のディレクトリをファイルマネージャーで開く C:\Xilinx\14.7\ISE_DS\ISE\lib\nt64
  2. 検索機能などを用いて "libPortability.dll" を見つけ "libPortability.dll.orig" とリネーム
  3. 同じディレクトリ中にある "libPortabilityNOSH.dll" のコピーを生成(コピーアンドペーストとかで)し "libPortability.dll" とリネーム
  4. "libPortabilityNOSH.dll" を今度は C:\Xilinx\14.7\ISE_DS\common\lib\nt64 のディレクトリへコピーする
  5. C:\Xilinx\14.7\ISE_DS\common\lib\nt64 のディレクトリにある "libPortability.dll" を "libPortability.dll.orig" とリネーム
  6. コピーした"libPortabilityNOSH.dll" を "libPortability.dll" とリネーム

PlanAhead用

  1. 次のディレクトリを開く C:\Xilinx\14.7\ISE_DS\PlanAhead\bin
  2. "rdiArgs.bat" を "rdiArgs.bat.orig" とリネーム
  3. こちらから "win8planaheadfix.zip" をダウンロード

  4. "win8planaheadfix.zip" を解凍

  5. 解凍して出てきた "rdiArgs.bat" を C:\Xilinx\14.7\ISE_DS\PlanAhead\bin へコピー

 

以上でWindows8環境でISEが正常に動作するようになるはず

【リンクまとめ】Android Studio開発環境構築メモ

これまで脱eclipseに失敗してきた人ですが、versionも1.0になったのでそろそろ真面目に環境を作った時に参考にしたサイトをまとめました。

 


Genymotion + Android Studio on Mac - Qiita

- 主な内容 -

GenyMotionの登録、インストール方法

AndroidStudio向けプラグイン導入方法

 


Android StudioにおけるAndroidSDKやJDKのパス設定 - Qiita

- 主な内容 -

SDKのパス変更

 


Android Studioのカラーテーマ変更! | iDEA CLOUD/dev

- 主な内容 -

Monokaiのカラースキーマ導入

 


[Android Studio] 快適にコーディングできるように設定をカスタマイズしてみた | Developers.IO

- 主な内容 -

テーマの変更

ログ出力時のカラー編集

エディタのカラー編集

エディタ設定の変更

定型文(Live Template)の導入

 


IntelliJのエディタにSublimeText風のmini-mapを表示するプラグイン - Qiita

普通にpreferences > plugins で「CodeGlance」で検索したら出てきたのでインストールして再起動