2015年12月27日日曜日

Windowsでパッケージ管理ソフトを使う

Windowsでapt-getがあればなーってずっと思ってたらあったようなのでメモしておく。




コマンドプロンプトを開き、下記コマンドをコピペ&実行する。

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin


アプリをインストールするときは

cinst vim
chocolatey install vim


インストール済みの一覧を見るときは

chocolatey list


まとめてインストールするときは
cinst packages.config


packages.configの書き方は



     id="GoogleChrome" />
     id="Firefox" />
     id="Gpg4win" />
     id="ctags" />
     id="curl" />
     id="git" />
     id="hg" />
     id="dropbox" />
     id="mingw" />
     id="mingw-get" />
     id="nodejs" />
     id="python" />
     id="python3" />
     id="ruby" />
     id="Everything" />
     id="Apple_iCloud_Control_Panel" />
     id="winmerge" />
     id="Desktops" />
     id="imagemagick" />


どんなパッケージがあるのか見たいときは公式ページへ
https://chocolatey.org/



参考URL
http://qiita.com/himinato/items/11f4dc9a23afebbc242c

[RPi]AndroidSDKをインストールする

以前、1からビルドする方法を紹介しました。
今回はもっと楽にビルド済みのandroid-sdk-linuxを利用してセットアップを行います。

SDKをダウンロードする
https://developer.android.com/intl/ja/sdk/index.html#Other

上記URLの中からLinux版のを探してwgetする。

$ cd
$ wget http://dl.google.com/android/android-sdk_r24.3.4-linux.tgz



格納ディレクトリを作成&android-sdk-linuxを格納する
$ mkdir /opt/java/
$ tar zxf android-sdk-linux.tgz
$ sudo mv android-sdk-linux /opt/java/


swt.jarの元をインストールしてショートカット作成

1     sudo apt-get install libswt-gtk-3-java libswt-cairo-gtk-3-jni
2     cd /opt/java/android-sdk-linux/tools/lib
3     mkdir arm
4     cd arm
5     ln -s /usr/lib/java/swt-gtk-3.8.2.jar swt.jar
PATH設定
$ vim ~/.profile

最後の行に追記する
---
export PATH=/opt/java/android-sdk-linux/tools:$PATH
export PATH=/opt/java/android-sdk-linux/platform-tools:$PATH
export ANDROID_HOME=/opt/java/android-sdk-linux
---

アップデート実行
/opt/java/android-sdk-linux/tools/android --no-ui


これでSDKのインストールは完了です。


参考URL
http://www.timelesssky.com/blog/develop-app-on-android-with-android-sdk

2015年12月24日木曜日

[RPi]デバッガ環境構築でADBをインストールする。

Jessieならapt-getするだけ。

$ sudo apt-get install android-tools-*
$ adb devices
List of devices attached
352417011681215 device

2015年12月23日水曜日

Cordova 使うコマンドメモ

◆インストール編
-----------------------------------
Step1.nodejsのインストール
 https://nodejs.org/en/
インストーラー実行


Step2.powershell起動

 npm install -g cordova



◆環境チェック編~Hello world(Device is ready)まで
------------------------------------
プロジェクト生成
cordova create hello

プラットフォーム追加
cordova platform add android

対応プラットフォーム確認
cordova platform ls

ビルド
cordova build

開発モードになっているAndroid端末がUSB接続されているか確認
adb devices

実機で動作確認
cordova run android


◆Hello world
--------------------------------------

プラグインインストール
cordova plugin add org.apache.cordova.geolocation

プラグインの削除
cordova plugin rm org.apache.cordova.geolocation



最初のイベント発火する順番
DOMContentLoaded→Load→DeviceReady

document.addEventListener('DOMContentLoaded', function () {
  console.log('DOMContentLoadedイベントが発火しました');
}, false);

document.addEventListener('load', function () {
  console.log('loadイベントが発火しました');
}, false);

document.addEventListener('deviceready', function () {
  console.log('devicereadyイベントが発火しました');
}, false);

2015年12月22日火曜日

Android Wifi経由でADB接続する

一度PCとUSB接続して コマンドライン上で adb tcpip 5555 スマホ画面WifiアイコンをタップするとIPアドレスが出てくるので adb connect 192.168.5.106:5555 と入力する。 接続状態を確認するには adb devices

[C#][パターンマッチング]画像データをクラスタリングして一番共通点を含むデータを選別する

クラスタリングしてその中で最も共通した要素を含む画像を1つだけ選ぶアルゴリズムです。

画像判断基準にするものは、4分木した画像の平均と偏差2つを見て判断します。


 public class ClusterCollection : List<ClusterModel>
 {
  public int Id { get; set; }
  /// <summary>
  /// モデル化
  /// </summary>
  /// <returns></returns>
  public ClusterModel ToModel()
  {
   if (1 < Count)
   {
    return new ClusterModel(ToArray());
   }
   else
   {
    return this[0];
   }
  }

  public ClusterCollection(int id)
  {
   Id = id;
  }
 }
 public class ClusterGroup
 {
  public List<ClusterCollection> Groups { get; } = new List<ClusterCollection>();

  /// <summary>
  /// クラスタ初期状態を作成
  /// </summary>
  /// <param ="collection"></param>
  public ClusterGroup(ClusterModel[] models)
  {
   var id = 1;
   foreach (var model in models)
   {
    Groups.Add(new ClusterCollection(id++) { model });
   }
  }

  /// <summary>
  /// クラスタリング作成
  /// </summary>
  public void Clustering()
  {
   //リンク作成
   var _links = new ClusterLinkCollection();
   foreach (var model1 in Groups)
   {
    var __links = new ClusterLinkCollection(Groups, model1);
    var model = __links.GetAnswer();
    _links.Add(model);
   }

   var distances = _links.Select(_ => _.Distance).ToArray();
   var dlen = distances.Length;
   var dmax = distances.Max();
   var dave = distances.Average();
   var dthr = (dmax + dave) / 2.0;
   var links = new ClusterLinkCollection();
   links.AddRange(_links.Where(_ => dave <= _.Distance).ToArray());

   //合体
   foreach (var link in links)
   {
    var numlist = Groups.Select(_ => _.Id).ToList();
    if (!numlist.Contains(link.Index1.Id)) continue;
    if (!numlist.Contains(link.Index2.Id)) continue;
    link.Index1.AddRange(link.Index2);
    Groups.Remove(link.Index2);
   }
  }

  /// <summary>
  /// 一番最もらしいグループを抽出
  /// </summary>
  /// <returns></returns>
  public ClusterCollection GetMostPopulure()
  {
   var max = Groups.Select(_ => _.Count).Max();
   var collection = Groups.Where(_ => _.Count == max).First();
   return collection;
  }
 }
 /// <summary>
 /// クラスタコレクション
 /// </summary>
 public class ClusterLinkCollection : List<ClusterLinkModel>
 {
  public ClusterLinkCollection()
  {
  }

  public ClusterLinkCollection(List<ClusterCollection> collection, ClusterCollection model)
  {
   foreach (var _model in collection)
   {
    Add(new ClusterLinkModel(_model, model));
   }
  }

  /// <summary>
  /// 一番正解率の高いリンクを返す
  /// </summary>
  /// <returns></returns>
  public ClusterLinkModel GetAnswer()
  {
   var max = this.Select(_ => _.Distance).Max();
   return this.Where(_ => _.Distance == max).First();
  }

  /// <summary>
  /// コレクションのカウント数を数える
  /// </summary>
  /// <param name="collection"></param>
  /// <returns></returns>
  public int GetCount(ClusterCollection collection)
  {
   var count = this.Where(_ => _.Index1 == collection || _.Index2 == collection).Count();
   return count;
  }

  /// <summary>
  /// 関連データ一覧を取得する
  /// </summary>
  /// <param name="collection"></param>
  /// <returns></returns>
  public List<ClusterCollection> ContainData(ClusterCollection collection)
  {
   var result = new List<ClusterCollection>();

   foreach (var link in this)
   {
    if (link.Index1 == collection)
    {
     if (!result.Contains(link.Index2))
     {
      result.Add(link.Index2);
     }
    }
    else if (link.Index2 == collection)
    {
     if (!result.Contains(link.Index1))
     {
      result.Add(link.Index1);
     }
    }
   }

   return result;
  }
 }
 /// <summary>
 /// クラスタモデル
 /// </summary>
 public class ClusterLinkModel
 {
  public ClusterCollection Index1 { get; }
  public ClusterCollection Index2 { get; }
  public double Distance { get; }

  /// <summary>
  /// コンストラクタ処理
  /// </summary>
  /// <param name="model1"></param>
  /// <param name="model2"></param>
  public ClusterLinkModel(ClusterCollection model1, ClusterCollection model2)
  {
   Index1 = model1;
   Index2 = model2;

   var m1 = model1.ToModel();
   var m2 = model2.ToModel();

   Distance = (model1 == model2) ? 0.0 : m1.Matching(m2);
  }
 }
 /// <summary>
 /// モデルクラス
 /// パターンデータで一致率を返す
 /// </summary>
 public class ClusterModel
 {
  public double[] Data { get; }
  public double[] Patterns { get; }
  public int Count => Patterns.Length;
  const int split_count = 8;

  public int KeisokuX { get; }
  public LRGB Color { get; set; }
  public int Touka { get; set; }
  public bool Empty { get; set; }
  public bool Stable { get; set; }
  public int Saturation { get; set; }
  public Bitmap ImageIn => Data.DrawImage();

  /// <summary>
  /// コンストラクタ処理
  /// </summary>
  /// <param name="x"></param>
  /// <param name="data"></param>
  /// <param name="bmp"></param>
  /// <param name="model"></param>
  public ClusterModel(int x, double[] data, Bitmap bmp, AnalyzeModel model)
  {
   KeisokuX = model.AnalyzeArea.X + x;
   Data = data.Gaussian();
   var ave = Data.Average();
   var dat1 = Data.Where(_ => ave < _).ToList();
   dat1.Sort();
   var len = dat1.Count;
   dat1.RemoveRange(0, (int)(len * 0.5));

   Data.Normalize();

   //パターン作成
   var alen = data.Length;
   var spt = (alen / split_count);
   Patterns = new double[split_count * 2];
   for (var idx = 0; idx < split_count; idx++)
   {
    Patterns[idx * 2 + 0] = data.ToList().GetRange(idx * spt, spt).ToArray().Average();
    Patterns[idx * 2 + 1] = data.ToList().GetRange(idx * spt, spt).ToArray().Sigma();
   }

   //解析
   Analyze(KeisokuX, bmp, model);
  }

  /// <summary>
  /// 解析処理
  /// </summary>
  /// <param name="bmp"></param>
  /// <param name="model"></param>
  void Analyze(int ix, Bitmap bmp, AnalyzeModel model)
  {
   var len = Data.Length;
   var gain = model.Gain;
   var sum = 0.0;
   var weight = len * gain;
   var r = 0;
   var g = 0;
   var b = 0;
   var cnt = 0;
   var iy = model.AnalyzeArea.Y;
   var min = 99999999.0;
   var max = 0.0;
   var old = Data[0];
   var bibun = Data.Bibun();
   var henbibun = bibun.Bibun();
   var ave = Data.Average();

   var wcount = 0.0;
   var dcount = 0.0;

   for (var idx = 2; idx < len - 2; idx++)
   {
    var dat = Data[idx];
    var col = bmp.GetPixel(ix, iy);

    //赤色判定個所をカウント
    if (ave <= dat)
    {
     //山の部分はRGB色
     r += col.R;
     g += col.G;
     b += col.B;
     cnt++;
     wcount += dat;
    }
    else
    {
     dcount += dat;
    }

    //黒→白へ変化している値をカウント(透過度)
    var tmp = Math.Abs(dat - old);
    sum += tmp * weight;

    //彩度の計算
    double _min = Math.Min(col.R, Math.Min(col.G, col.B));
    double _max = Math.Max(col.R, Math.Max(col.G, col.B));
    var _val = (0 == _max) ? 1 : ((_max - _min) / _max);
    min = Math.Min(min, _val);
    max = Math.Max(max, _val);

    old = dat;
    weight -= gain;
    iy++;
   }
   r /= cnt;
   g /= cnt;
   b /= cnt;
   Color = new LRGB(r, g, b);                                                  //RGB値
   Touka = (int)(sum * 10);                                                    //透過度
   Saturation = (0.0 == max) ? 0 : (int)((1 - ((max - min) / (min + max))) * 100);     //彩度
   Stable = Data[0] > Data[len - 1];                                   //上が明るくて下が暗い
   Empty = (model.Threshold0 >= Saturation);                                   //チューブ有無
  }

  /// <summary>
  /// コンストラクタ処理
  /// </summary>
  /// <param name="models"></param>
  /// <param name="split_count"></param>
  public ClusterModel(ClusterModel[] models)
  {
   Data = models.Select(_ => _.Data).ToArray().Synthesis();
   var len = Data.Length;
   var spt = (len / split_count);
   Patterns = new double[split_count * 2];
   for (var idx = 0; idx < split_count; idx++)
   {
    Patterns[idx * 2 + 0] = Data.ToList().GetRange(idx * spt, spt).ToArray().Average();
    Patterns[idx * 2 + 1] = Data.ToList().GetRange(idx * spt, spt).ToArray().Sigma();
   }
  }

  /// <summary>
  /// コサイン類似度
  /// </summary>
  /// <param name="model"></param>
  /// <returns></returns>
  public double Matching(ClusterModel model)
  {
   var sum = 0.0;
   var v1 = 0.0;
   var v2 = 0.0;
   for (var stage = 0; stage < Count; stage++)
   {
    var val1 = Patterns[stage];
    var val2 = model.Patterns[stage];
    sum += val1 * val2;
    v1 += Math.Pow(val1, 2);
    v2 += Math.Pow(val2, 2);
   }

   var result = sum / Math.Sqrt(v1 * v2);

   return result;
  }
 }

2015年12月21日月曜日

[C#]パターンマッチングの実装

ネット上であまり見かけないので投稿。

非線形データを1次元のデータ配列にした後、データ同士がどれくらい一致しているかを判定するプログラムです。
いわゆるパターンマッチング手法といっていいと思われます。
画像処理で用いる場合はデータを分割して各要素の偏差値を求め、
その偏差値のデータ列を下記プログラムに入れるとデータがどれくらい一致しているか計算できるようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
 class Program
 {
  static void Main(string[] args)
  {
   var collection = new Collection()
   {
    new Model(new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, 4),
    new Model(new double[] { 2, 2, 4, 4, 5, 6, 7, 8, 9, 11, 11, 12, 13, 14, 15, 10 }, 4),
    new Model(new double[] { 1, 12, 3, 14, 5, 26, 57, 18, 9, 40, 11, 22, 13, 14, 15, 11 }, 4),
    new Model(new double[] { 4, 12, 3, 4, 35, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, 4),
    new Model(new double[] { 5, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 13, 11 }, 4),
    new Model(new double[] { 2, 33, 3, 45, 5, 16, 7, 8, 19, 10, 11, 125, 13, 14, 15, 16 }, 4),
   };

   var ret = collection.Filter(2);

   var testData = new Model(new double[] { 1, 12, 3, 4, 25, 6, 7, 8, 49, 10, 11, 12, 43, 14, 15, 16 }, 4);

   Console.WriteLine("Matching={0}", collection.Matching(testData));

   Console.ReadKey();

  }
 }


 public class Collection : List<Model>
 {
  public Collection Filter(double sigma)
  {
   var result = new Collection();
   var length = this[0].Patterns.Length;
   var list = new List<Model>();
   list.AddRange(this);

   for (var stage = 0; stage < length; stage++)
   {
    var data = list.Select(_ => _.Patterns[stage]).ToArray();
    var ave = data.Average();
    var sig = data.Sigma() * sigma;
    list = list.Where(_ => sig >= Math.Abs(_.Patterns[stage] - ave)).ToList();
   }

   result.AddRange(list);
   return result;
  }

  public double Matching(Model model)
  {
   return this.Select(_ => _.Matching(model)).ToArray().Max();
  }
 }


 public class Model
 {
  public double[] Data { get; }
  public double[] Patterns { get; }
  public int Count => Patterns.Length;

  /// <summary>
  /// 
  /// </summary>
  /// <param name="data"></param>
  public Model(double[] data, int split_count)
  {
   Data = data;
   var len = data.Length;
   var spt = (len / split_count);
   Patterns = new double[split_count];
   for (var idx = 0; idx < split_count; idx++)
   {
    Patterns[idx] = data.ToList().GetRange(idx * spt, spt).ToArray().Sigma();
   }
  }

  /// <summary>
  /// コサイン類似度
  /// </summary>
  /// <param name="model"></param>
  /// <returns></returns>
  public double Matching(Model model)
  {
   var sum = 0.0;
   var v1 = 0.0;
   var v2 = 0.0;
   for (var stage = 0; stage < Count; stage++)
   {
    var val1 = Patterns[stage];
    var val2 = model.Patterns[stage];
    sum += val1 * val2;
    v1 += Math.Pow(val1, 2);
    v2 += Math.Pow(val2, 2);
   }
   v1 = Math.Sqrt(v1);
   v2 = Math.Sqrt(v2);


   var result = sum / (v1 * v2);

   return result;
  }
 }

 public static class DoubleExtensions
 {
  public static double Sigma(this double[] self)
  {
   var len = self.Length;
   var ave = self.Average();
   var bun = 0.0;
   foreach (var dat in self)
   {
    bun += Math.Pow(dat - ave, 2);
   }
   bun = bun / len;
   return Math.Sqrt(bun);
  }
 }
}

[C#]有限ステートマシン(finite state machine)を作ってみた

ネット上で様々なステートマシンを見てきてシンプルだったり、高機能だったり色々あったけど、
でも俺流はこうだ!っていうのがあったので、今回記事にしました。


考え方は、ステートマシンクラスを生成するときにコンテキストクラスを渡しておいて、イベントFireするというもの。


実装は拡張メソッドで書き記す。

 ・Class名=State名
 ・Method名=Event名、ChangeStateAttribute属性を用いて状態遷移を記述する。
 

となるように記述する。


下がステートマシンクラスの本体。


 public class ChangeStateAttribute : Attribute
 {
  public object DoingState { get; } = null;
  public object SuccessState { get; } = null;
  public object FailedState { get; } = null;

  public ChangeStateAttribute(object success, object failed)
  {
   SuccessState = success;
   FailedState = failed;
  }

  public ChangeStateAttribute(object before, object success, object failed)
  {
   DoingState = before;
   SuccessState = success;
   FailedState = failed;
  }
 }

 public class StateMachine<STATE, EVENT>
 {
  public STATE State { get; private set; }
  public object targetObject { get; }
  Dictionary<STATE, Dictionary<EVENT, MethodInfo>> states { get; } = new Dictionary<STATE, Dictionary<EVENT, MethodInfo>>();

  public StateMachine(object targetObject, STATE InitState)
  {
   State = InitState;
   this.targetObject = targetObject;
   var type = targetObject.GetType();
   var asm = type.Assembly;
   var types = asm.GetTypes();
   var enums = Enum.GetValues(typeof(STATE));
   var events = Enum.GetValues(typeof(EVENT));

   foreach (STATE state in enums)
   {
    var sname = state.ToString();
    var stype = types.Where(_ => _.Name == sname).First();
    var edic = new Dictionary<EVENT, MethodInfo>();

    foreach (EVENT evt in events)
    {
     var ename = evt.ToString();
     var methodInfo = stype.GetMethod(ename);
     if (null != methodInfo)
     {
      edic[evt] = methodInfo;
     }
    }
    states[state] = edic;
   }
  }

  /// <summary>
  /// 実行
  /// </summary>
  /// <param name="trigger"></param>
  /// <param name="parameters"></param>
  public bool Fire(EVENT trigger, params object[] parameters)
  {
   var minfo = states[State][trigger];
   var before = minfo.GetCustomAttribute<ChangeStateBeforeAttribute>();
   var after = minfo.GetCustomAttribute<ChangeStateAfterAttribute>();
   var prms = parameters.ToList();
   prms.Insert(0, targetObject);
   var old = State;

   if (null != before) State = (STATE)before.State;
   if ((bool)minfo.Invoke(null, prms.ToArray()))
   {
    if (null != after) State = (STATE)after.State;
    return true;
   }
   else
   {
    State = old;
    return false;
   }
  }
  public Task<bool> FireASync(EVENT trigger, params object[] parameters)
  {
   return Task.Run(() => Fire(trigger, parameters));
  }
 }



次に実装サンプルで通信プログラムを実装してみる。


Step1. enum型でStateとEventを定義する。

 public enum CommState
 {
  NotConnected,
  Connecting,
  Idle,
  Busy,
  Disconnecting,
  Error,
 }

 public enum CommEvent
 {
  Connect,
  Disconnect,
  Request,
  Notify,
  ReadLine,
 }

Step2. Stateクラス、Eventメソッドを実装する。

 public static class NotConnected
 {
  [ChangeState(CommState.Idle, CommState.Error)]
  public static bool Connect(this CommPort self)
  {
   self.Open();
   return true;
  }
 }

 public static class Connecting
 {
 }

 public static class Disconnecting
 {
 }

 public static class Idle
 {
  [ChangeState(CommState.Busy, CommState.Idle, CommState.Error)]
  public static bool Request(this CommPort self, string message)
  {
   self.Write(message);
   Console.WriteLine("R:{0}", self.Read());
   return true;
  }

  [ChangeState(CommState.Busy, CommState.Idle, CommState.Error)]
  public static bool Notify(this CommPort self, string message)
  {
   self.Write(message);
   return true;
  }

  [ChangeState(CommState.Busy, CommState.Idle, CommState.Error)]
  public static bool ReadLine(this CommPort self)
  {
   Console.WriteLine("R:{0}", self.Read());
   return true;
  }

  [ChangeState(CommState.Disconnecting, CommState.NotConnected, CommState.Error)]
  public static bool Disconnect(this CommPort self)
  {
   self.Close();
   return true;
  }
 }

 public static class Busy
 {
 }

 public static class Error
 {
  [ChangeState(CommState.Idle, CommState.Error)]
  public static bool Connect(this CommPort self)
  {
   self.Open();
   return true;
  }
 }

Step3. ステートマシンを生成する。

  static void Main(string[] args)
  {
   var port = new CommPort();
   var fsm = new StateMachine<CommState, CommEvent>(port, CommState.NotConnected);

   fsm.Fire(CommEvent.Connect);
   fsm.Fire(CommEvent.Request, "HELLO");
   fsm.Fire(CommEvent.Notify, "HELLO");
   fsm.Fire(CommEvent.ReadLine);
   fsm.Fire(CommEvent.Disconnect);

   Console.ReadKey();
  }
 //CommAPI
 public class CommPort
 {
  public void Open() { Console.WriteLine("Open"); }
  public void Close() { Console.WriteLine("Close"); }
  public void Write(string message) { Console.WriteLine("Send:{0}", message); }
  public string Read() { Console.WriteLine("Read"); return "World"; }
 }



もうちょっとシンプルな例題だとすっきり書けたかなあ。



2015年12月12日土曜日

Android Studioを使う【画面レイアウトをいじる】

プログラム開発するにはまず画面レイアウトをいじるやり方を紹介。




まずは左上にある今ボックスで「Android」が選択されているところを「Project Files」選択。

そこから
app->app->src->main->res->layout->****.xml をクリックすると
右側にスマホ画面が出てきてレイアウトが表示される。

うまく表示されない場合は、しばらく待ってみたり、リビルトしてみたり、右上のバージョンを変えてみると出てくるようになる。


GUI部品を置いたりしたい場合は、中央下にある「Design」タブをクリックする。


次は画面にボタンを置いてイベント作るところまで進める。

Android Studioを使う【環境設定編】Windows版

新しい開発環境に慣れるには、やはり自分好みにカスタマイズしてみるのが良いので、設定方法を書き綴る。


まずインストールしたら適当なプロジェクトを作り、

 File->Settings を選ぶ。


・メニュー背景色を黒色にする
 Appearance&Behavior→Appearance→Theme:Darcula

・テキストエディタの背景を黒色にする
 Editor→Colors&Fonts:Wombat(Import settingsで外部ファイルjarを読みこませることで他のカラーテーマが設定できる)

・メニューフォントを変える
 Appearance&Behavior→Appearance→Override default fonts by(not recomended)

・テキストエディタのフォントを変える
 Editor→Colors&Fonts→Font


・ショートカットキーをVisualStudio風?にする
 Appearance&Behavior→Keymap:VisualStudio

・Pluginを入れる
 Vimキーバインドとかもここでインストールできる。



フォント周りの設定はどうも怪しく、思ったような設定にならないけど全体的に見やすくあるので英語環境でも使えるような気がしてきた。

2015年12月10日木曜日

[RPi]SQLiteをWEBブラウザ上で編集したい


SQLiteManager
 http://sourceforge.net/projects/sqlitemanager/

これをインストールすればよい。

文字化けする場合は「./lang/japanese.inc.php」ファイルの10行目当たりにある文字コードを、
【変更前】$charset = 'euc-jp';
$langSuffix = 'ja-euc';
【変更後】$charset = 'utf-8';
$langSuffix = 'ja-utf-8';


参考URL:
 http://taitan916.info/blog/?p=1907

[RPi]ネットワークのIP更新を行う

固定IPアドレスを更新したい時がある。

毎回再起動するのも時間かかるので、特定のLANアダプタだけ更新する方法があったのでメモ。


$ sudo /sbin/ifdown eth0

$ sudo /sbin/ifup eth0


2015年12月9日水曜日

Systemdを使ってDDNS更新する

自宅のRaspberryPiを自鯖にしていて、
DDNSをieServerで取って自動更新しようと思ったのでメモ。

OSはRaspbian(debian) jessieを使っているので、CronではなくSystemdで定周期タイマーをセットします。


Step.1 更新用スクリプトをダウンロード

 /usr/local/ddnsフォルダにスクリプトファイルを格納する。

$ sudo mkdir /usr/local/ddns
$ sudo chmod 777 /usr/local/ddns
$ cd /usr/local/ddns
$ wget http://ieserver.net/ddns-update.txt
$ mv ddns-update.txt ddns-update.pl


Step2. スクリプトの設定をする

 ファイルを開き、以下を編集する。
 $ vim ddns-update.pl
$CURRENT_IP_FILE = "/usr/local/ddns/current_ip";
$LOG_FILE        = "/usr/local/ddns/ip_update.log";
$ACCOUNR   = "account_name";
$DOMAIN      = "dip.jp";
$PASSWORD = "password";


Step3. スクリプトを使ってIP更新ができてるかチェック

実行
$ ./ddns-update.pl
確認
$ vim ip_update.log
 Wed Dec  9 15:56:06 2015 account_name.dip.jp Updated 0.0.0.0 to 123.123.123.123

Updatedになっているか確認する。
Abortedになっている場合は設定がうまくいっていない。


Step4. systemdを使って定周期タイマーをセット

フォルダを作成して移動
$ sudo mkdir ~/.config/systemd/
$ sudo mkdir ~/.config/systemd/user
$ cd ~/.config/systemd/user

スクリプトを作成する
$ vim ddns-update.service

-----------------------------------------
[Unit]
Description=update to ieServer DDNS
[Service]
Type=simple
ExecStart=/usr/local/ddns/ddns-update.pl
[Install]
WantedBy=default.target
-----------------------------------------

$ vim ddns-update.timer
-----------------------------------------
[Unit]
Description = update to ieServer DDNS weekly
[Timer]
OnBootSec=1min
OnUnitActiveSec=weekly
Unit=ddns-update.service
[Install]
WantedBy=timers.target
-----------------------------------------


Step5. systemd更新&タイマー実行

systemd更新
$ systemctl --user daemon-reload
$ systemctl --user start ddns-update.timer

ちゃんとタイマーがセットされてるか確認
$ systemctl --user list-unit-files --type service --all
$ systemctl --user list-timers


目的のスクリプトが実行されたか確認
$ vim /usr/local/ddns/ip_update.log

注意:/usr/local/ddns/フォルダに「current_ip」ファイルがある場合は削除しておくこと。


Androider