インターネット上にある断片化された情報を切り取って、リブログする。 主にソフトウェア、Ubuntu関連、CPUなど気になったニュース、また、日々の面白い出来事やニュースもリブログします。
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つを見て判断します。
画像判断基準にするものは、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次元のデータ配列にした後、データ同士がどれくらい一致しているかを判定するプログラムです。
いわゆるパターンマッチング手法といっていいと思われます。
画像処理で用いる場合はデータを分割して各要素の偏差値を求め、
その偏差値のデータ列を下記プログラムに入れるとデータがどれくらい一致しているか計算できるようになります。
非線形データを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)を作ってみた
ネット上で様々なステートマシンを見てきてシンプルだったり、高機能だったり色々あったけど、
実装は拡張メソッドで書き記す。
・Class名=State名
でも俺流はこうだ!っていうのがあったので、今回記事にしました。
考え方は、ステートマシンクラスを生成するときにコンテキストクラスを渡しておいて、イベント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を使う【環境設定編】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キーバインドとかもここでインストールできる。
まずインストールしたら適当なプロジェクトを作り、
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キーバインドとかもここでインストールできる。
フォント周りの設定はどうも怪しく、思ったような設定にならないけど全体的に見やすくあるので英語環境でも使えるような気がしてきた。
ラベル:
Android 環境構築
2015年12月10日木曜日
[RPi]SQLiteをWEBブラウザ上で編集したい
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
ラベル:
debian,
Raspberry_Pi
[RPi]ネットワークのIP更新を行う
固定IPアドレスを更新したい時がある。
毎回再起動するのも時間かかるので、特定のLANアダプタだけ更新する方法があったのでメモ。
$ sudo /sbin/ifdown eth0
$ sudo /sbin/ifup eth0
毎回再起動するのも時間かかるので、特定のLANアダプタだけ更新する方法があったのでメモ。
$ sudo /sbin/ifdown eth0
$ sudo /sbin/ifup eth0
ラベル:
debian,
Raspberry_Pi
2015年12月9日水曜日
Systemdを使ってDDNS更新する
自宅のRaspberryPiを自鯖にしていて、
DDNSをieServerで取って自動更新しようと思ったのでメモ。
OSはRaspbian(debian) jessieを使っているので、CronではなくSystemdで定周期タイマーをセットします。
Step.1 更新用スクリプトをダウンロード
/usr/local/ddnsフォルダにスクリプトファイルを格納する。
Step3. スクリプトを使ってIP更新ができてるかチェック
Updatedになっているか確認する。
Abortedになっている場合は設定がうまくいっていない。
Step4. systemdを使って定周期タイマーをセット
フォルダを作成して移動
$ sudo mkdir ~/.config/systemd/
$ sudo mkdir ~/.config/systemd/user
$ cd ~/.config/systemd/user
スクリプトを作成する
$ vim ddns-update.service
注意:/usr/local/ddns/フォルダに「current_ip」ファイルがある場合は削除しておくこと。
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
ラベル:
debian,
Raspberry_Pi
2015年11月24日火曜日
[C#]WindowsFormアプリで多言語化
・フォーム画面にプロパティ内にあるLanguageを(規定値)から「英語」に切り替える
ソリューションエクスプローラーのフォーム内に[Form1.en.resx]というのが増える。
各国語別にどういった文字になっているかを確認するにはresxをダブルクリックする。
・フォーム以外の文字も切り替える方法
プロジェクト内PropertiesにあるResources.resxをソリューションエクスプローラー内でコピペする。
複製されたファイルをResources.en.resx などにリネームしてPropertiesフォルダ内に移動する。
・動作確認
using System.Threading;
using System.Globalization;
Program.csのMain関数の最初に
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en", false);
を入れると言語が変わる。
ソリューションエクスプローラーのフォーム内に[Form1.en.resx]というのが増える。
各国語別にどういった文字になっているかを確認するにはresxをダブルクリックする。
・フォーム以外の文字も切り替える方法
プロジェクト内PropertiesにあるResources.resxをソリューションエクスプローラー内でコピペする。
複製されたファイルをResources.en.resx などにリネームしてPropertiesフォルダ内に移動する。
・動作確認
using System.Threading;
using System.Globalization;
Program.csのMain関数の最初に
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en", false);
を入れると言語が変わる。
ラベル:
C# Tips
2015年11月23日月曜日
[RaspberryPi] 外付けHDD Linux LVMをマウントする
RaspbianイメージだとLinux LVMが入っていないのでインストールする作業から始まる。
Step1.Linux LVMをインストールする
sudo apt-get install lvm2 -y
Step2.外付けHDDをアクティベートする
sudo vgscan
これでボリューム名を調べて
sudo vgchange -a y LVMボリューム名
Step3.マウントする
sudo mount /dev/mapper/LVMグループ名 /mnt/hdd1
注意:マウントするディレクトリはあらかじめ作っておくこと。
Step1.Linux LVMをインストールする
sudo apt-get install lvm2 -y
Step2.外付けHDDをアクティベートする
sudo vgscan
これでボリューム名を調べて
sudo vgchange -a y LVMボリューム名
Step3.マウントする
sudo mount /dev/mapper/LVMグループ名 /mnt/hdd1
注意:マウントするディレクトリはあらかじめ作っておくこと。
ラベル:
Raspberry_Pi
2015年10月16日金曜日
Win10上でVMWareを動かすのにHyper-Vを無効にする
Win10上でVMWareを動かすには、Hyper-Vを無効にするといいとか。
Hyper-V無効化
bcdedit /set hypervisorlaunchtype off
Hyper-V有効化
bcdedit /set hypervisorlaunchtype auto
これを管理者権限で実行して再起動すればいい。
ラベル:
vmware
2015年10月15日木曜日
Raspberry Pi WheezyからJessieにアップグレードする方法
https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=121880
パッケージリストの更新
==============================
1. sudo vim /etc/apt/sources.list
“wheezy” to “jessie” に変更する。
deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
2. sudo /etc/apt/sources.list.d/raspi.list
“wheezy” to “jessie” に変更して、最後にuiを入れる。
deb http://archive.raspberrypi.org/debian jessie main ui
3. mkdir /home/pi/.config/autostart
4. sudo apt-get update
5. sudo apt-get -y dist-upgrade
新パッケージの追加
==============
sudo apt-get install rc-gui libreoffice libreoffice-gtk alacarte bluej greenfoot claws-mail
GUI周りの修正
=======
cp –ax /usr/share/themes/PiX ~/.themes
sudo rm /etc/xdg/autostart/clipit-startup.desktop
sudo rm /etc/xdg/autostart/wicd-tray.desktop
sudo rm –rf /var/lib/menu-xdg
sudo raspi-config nonint do_boot_behaviour_new B4
sudo rm /usr/share/applications/obconf.desktop
ラベル:
Raspberry_Pi
登録:
投稿 (Atom)
