2017年12月26日火曜日

Telerik ListBoxにデータを流し込む方法 ASP.NET MVC5の場合

Telerik ListBoxにデータを流し込む方法 ASP.NET MVC5の場合

Day.cshtml
   @(Html.Kendo().ListBox()
                    .Name("optional")
                    .Toolbar(toolbar => {
                        toolbar.Position(Kendo.Mvc.UI.Fluent.ListBoxToolbarPosition.Right);
                        toolbar.Tools(tools => tools
                        .TransferTo()
                        .TransferFrom()
                        .TransferAllTo()
                        .TransferAllFrom()
                        .Remove()
                        );
                    })
                    .ConnectWith("selected")
                )

                @(Html.Kendo().ListBox()
                    .Name("selected")
                    .Selectable(ListBoxSelectable.Multiple)
                    .BindTo(ViewBag.SelectUsers)
                )

DayController.cs
 //
                    List<SelectListItem> selectusers = new List<SelectListItem>();
                    var item = new SelectListItem();

                    item.Text = "担当者";
                    item.Value = "0101";

                    selectusers.Add(item);

                    ViewBag.SelectUsers = selectusers;

2017年12月25日月曜日

PHP mb_send_mail でのメール送信で日本語が化ける

PHP mb_send_mail でのメー^ル送信で日本語が化ける

PHPのソースがsjisなら
 mb_internal_encoding("SJIS");

上記の設定を追加する。

2017年12月21日木曜日

Centos7 Oracle11.2 起動起動の設定

Centos7 Oracle11.2 起動起動の設定

元ネタ
CentOS7にOracle11gをインストールする


自動起動の設定
/etc/oratabの編集


oratabでdbstartとdbshutスクリプトによる起動と停止の対象にするかどうかを指定します。vim /etc/oratab



#orcl:/home/oracle/app/oracle/product/11.2.0/dbhome_1:N orcl:/home/oracle/app/oracle/product/11.2.0/dbhome_1:Y




起動スクリプト作成
#! /bin/sh export PATH=/home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/:${PATH} export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1 export NLS_LANG=Japanese_Japan.UTF8 export ORACLE_SID=orcl ${ORACLE_HOME}/bin/lsnrctl start ${ORACLE_HOME}/bin/dbstart ${ORACLE_HOME}




停止スクリプト作成
#! /bin/sh export PATH=/home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/:${PATH} export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1 export NLS_LANG=Japanese_Japan.UTF8 export ORACLE_SID=orcl ${ORACLE_HOME}/bin/lsnrctl stop ${ORACLE_HOME}/bin/dbshut ${ORACLE_HOME}




systemdの設定
[Unit] Description=oracle After=network.target
[Service] Type=forking #EnvironmentFile=/etc/sysconfig/oracle ExecStart=/home/oracle/bin/startOracle.sh ExecStop=/home/oracle/bin/stopOracle.sh User=oracle [Install] WantedBy=multi-user.target

systemdの登録
systemctl enable oracle.service

2017年12月19日火曜日

久々にOrcaleチューニング
設定方法忘れたので、他からメモを拝借
DBAの知識ないから、DBの設定ぶっ壊して、1から入れなおしかなーなんて思える状態から脱却できたので、メモっておこう!

SGAの現在のメモリ割当を確認。
sqlplus / as sysdba
show parameter sga_;
NAME TYPE VALUE
------------- ------------ -------
sga_max_size big integer 2G
sga_target big integer 2G
ここで、以下のように容量変更を実行するのはダメ。
sqlplus / as sysdba
alter system set sga_max_size = 4G scope=spfile;
alter system set sga_target = 4G scope=spfile;
なぜなら、メモリの物理的な割当を超過したSGAを設定すると、壊れる
以下を実行し、memory_max_target、memory_targetがそれにあたる。
メモリ割当容量を変更する場合には、この物理的な割当容量を確認する手順は必須だ。
sqlplus / as sysdba
show parameter memory_;
NAME TYPE VALUE
------------------------- ------------ --------
hi_shared_memory_address integer 0
memory_max_target big integer 3G
memory_target big integer 3G
shared_memory_address integer 0

MEMORY_MAX_TAEGETMEMORY_TARGETの説明によると、MEMORY_TARGETがOracleが利用するメモリ割当量で、その範囲内でSGAやPGAを設定する。
つまり、いきなりSGAのメモリ割当量を変更し、MEMORY_TARGET割当量≦SGA割当量となると、設定としてはNGだ。
よって、まず変更すべきはSGAではなくMEMORY_TARGETだ。
また、SGAに4GBを割り当てたいなら、MEMORY_TARGETは4GBより大きくなければならない
それぞれの項目の説明はSGA_MAX_SIZESGA_TARGETを参照してほしい。
sqlplus / as sysdba
alter system set memory_max_target = 5G scope=spfile;
alter system set memory_target = 5G scope=spfile;
そのあとにSGAを変更する。
sqlplus / as sysdba
alter system set sga_max_size = 4G scope=spfile;
alter system set sga_target = 4G scope=spfile;
んでインスタンス再起動
sqlplus / as sysdba
shutdown immediate
startup
これで、Oracleで利用する物理メモリ容量の増加と、SGA容量の増加を行える。

で、これから俺がやらかした状態と、解消手順。
壊した経緯
1.もともと物理的に1.6GBくらいしか割り当ててない。
2.物理割当を確認せずにSGAを4GBに変更。
3.インスタンスの再起動ができなくなる。
再起動すると、こんなメッセージが。
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 4294967296 cannot be set to more than MEMORY_TARGET 1690304512.
SGA_MAX_SIZEがMEMORY_TARGETを超えてんぞコラってことみたい。
こうなると、もうインスタンスへの接続もできないので、以下の手順を踏まないと直せない。
1.spfileからpfileを生成する。
/ as sysdba
create pfile from spfile;

  %ORACLE_HOME%\database\INIT<SID>.ORAが作成されます。
  %ORACLE_HOME%は、11gのデフォルトなら「D:\app\Administrator\product\11.2.0\dbhome_1」とかで、
  INIT<SID>.ORAは、インスタンス名が「HOGE」なら「INIThoge.ORA」ってファイルがある。
2.INIT<SID>.ORAをテキストエディタで編集する。
  以下では、MEMORY_TARGETを5GB、SGAを4GBに設定してみる。
<SID>.__sga_target=4294967296
*.memory_target=5368709120
*.sga_max_size=4294967296
*.sga_target=4294967296

3.INIT<SID>.ORAを利用してインスタンスを起動する。
  注意する点は、指定するのはファイル名だけではなくてフルパスで指定する。
sqlplus / as sysdba
startup pfile="D:\app\Administrator\product\11.2.0\dbhome_1\database\INIT<SID>.ORA"

4.起動できたら、pfileの設定をspfileに書き戻す。
  注意する点は、指定するのはファイル名だけでいい。
/ as sysdba
create spfile='SPFILE<SID>.ORA' from pfile='INIT<SID>.ORA';

5.んでいつも通りのインスタンスの再起動をしてみて、起動すればOK。
sqlplus / as sysdba
shutdown immediate
startup

2017年12月15日金曜日

ASP.NET MVC でKENDO UI GridViewから 行選択時の値を取得する

 @(Html.Kendo().Grid<Works.Models.BBSViewModel>()
        .Name("BBSGrid")
        .Columns(columns => {
            columns.Bound(p => p.ID).Title("ID").Width(40);
            columns.Bound(p => p.AttachFile).HeaderTemplate("<i class='fa fa-paperclip fa-lg'></i>").Width(20);
            columns.Bound(p => p.PublishedDate).Width(100).Format("{0:yyyy/MM/dd HH:mm}").Title("掲載日時");
            columns.Bound(p => p.Title).Title("件名");
            columns.Bound(p => p.SectionName).Width(90).Title("掲載部門");
            columns.Bound(p => p.EmployeeName).Width(70).Title("掲載者");
        })
        .HtmlAttributes(new { style = "height: 500px;" })
        .Scrollable()
        .Selectable(selectable => selectable
            .Mode(GridSelectionMode.Single)
            .Type(GridSelectionType.Row))
        .Events(events => events
            .Change("onChange")
         )
        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(20)
            .Read(read => read.Action("BBS_Read", "BBS"))
        )
    )
</div>

<script type="text/javascript">

    function onChange(args) {
/*
        var selected = $.map(this.select(), function (item) {
            return $(item).text() + "|";
        });

        alert(selected);
*/
        var goods = this.select();
        goodsID = this.dataItem(goods).ID;

        alert(goodsID);
    }
</script>

Dapperでレコードインサート後にidentifyの値を取得する方法

string sql = @"
INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff);
SELECT CAST(SCOPE_IDENTITY() as int)";

var id = connection.Query<int>(sql, new { Stuff = mystuff}).Single();
InsertのSQLを発行後、SELECTでSCOPE_IDENTITY()を発行して
Identityの値を取得する。

1回のSQL内に二つのSQLを入れてやればOK

この発行は無かったからとても良いコーディングだと思います。

レコード追加後、Identityの値でフォルダを作成して、その中に添付ファイルを
保存するロジックが楽になりました。


2017年12月13日水曜日

ASP.NET MVCでJavascriptで使うUrlを動的に変更したい

ASP.NET MVCでJavascriptで使うurlを動的に変更したい


/Home/Index

/

この場合、Javascriptから画像を表示する場合
.././Images

./Images 別々に記述しないと画像にたどり着けない

Razarの場合は、 @Url.Content("~/Images") でOK

元ネタ http://www.processinginfinity.com/weblog/2014/07/17/Get-App-Base-URL-in-Script

index.cshtml
  <!DOCTYPE html>
  <html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <base href='@Url.Content("~/")'>
    <title>@ViewBag.Title - My ASP.NET Application</title>
    <!-- ... -->
  </head>
  <body>
      ...
app.js
(function () {
  'use strict';

  var baseUrl = $('base').attr('href');
  var appBaseUrl = baseUrl + 'scripts/myApp/';

  angular.module('myApp', ['ngRoute'])
    .config(['$routeProvider', function ($routeProvider) {
      $routeProvider.
        when('/list', {
            templateUrl: appBaseUrl + 'partials/list.html',
            controller: 'ListController'
        }).
        when('/details', {
            templateUrl: appBaseUrl + 'partials/details.html',
            controller: 'DetailsController'
        }).
        otherwise({
            redirectTo: '/list'
        });
    }]);
  })();

2017年12月9日土曜日

bootstrap admin template

Visual Studio 2017のギャラリーに AdminLTEのテンプレートがある。
これでMVCのテンプレートProjectを作ってくれる。

でも、自分が選択したのは SB Admin2でした。

SB Admin2をgithubよりDownload後
MVC Projectに SB Admin2のdist内のcssとjsをbundleに追加

vendorにある、metisMenuも同様

font-awesomeはnugetからインストールすればOkでした。

metisMenuもnugetからインストール出来ました。


2017年12月2日土曜日

MS-SQL / SQL Server / fnReplaceZenkakuToHankaku 全角の文字列を半角に変換する方法

CREATE FUNCTION [dbo].[fnReplaceZenkakuToHankaku]
(
@StrVal nvarchar(100)
)
RETURNS nvarchar(100)
BEGIN

DECLARE @Result nvarchar(100)
DECLARE @TempStr nchar(1)
DECLARE @i int
DECLARE @UniCode int
SET @Result = ''
SET @i = 1
WHILE (@i <= LEN(@StrVal))
BEGIN
SET @UniCode = UNICODE(SUBSTRING(@StrVal,@i,1))
IF (@UniCode = 12288) --空欄の場合。
SET @TempStr = N''
ELSE IF ((@UniCode >= 65280) AND (@UniCode <= 65519)) --全角の場合。
SET @TempStr = NCHAR(@UniCode-65248) 
ELSE 
SET @TempStr = SUBSTRING(@StrVal,@i,1)
SET @Result = @Result + @TempStr
SET @i = @i + 1
END
RETURN @Result
END
 

2017年11月22日水曜日

ASP.NET MVC CRUD With Dapper (Micro ORM)

ASP.NET MVC CRUD With Dapper (Micro ORM)


  1. @model IEnumerable<DapperMvc.Models.Friend>  
  2.   
  3. @{  
  4.     ViewBag.Title = "Index";  
  5. }  
  6.   
  7. <h2>Index</h2>  
  8.   
  9. <p>  
  10.     @Html.ActionLink("Create New""Create")  
  11. </p>  
  12. <table class="table">  
  13.     <tr>  
  14.         <th>  
  15.             @Html.DisplayNameFor(model => model.FriendName)  
  16.         </th>  
  17.         <th>  
  18.             @Html.DisplayNameFor(model => model.City)  
  19.         </th>  
  20.         <th>  
  21.             @Html.DisplayNameFor(model => model.PhoneNumber)  
  22.         </th>  
  23.         <th></th>  
  24.     </tr>  
  25.   
  26. @foreach (var item in Model) {  
  27.     <tr>  
  28.         <td>  
  29.             @Html.DisplayFor(modelItem => item.FriendName)  
  30.         </td>  
  31.         <td>  
  32.             @Html.DisplayFor(modelItem => item.City)  
  33.         </td>  
  34.         <td>  
  35.             @Html.DisplayFor(modelItem => item.PhoneNumber)  
  36.         </td>  
  37.         <td>  
  38.             @Html.ActionLink("Edit""Edit"new { id=item.FriendID }) |  
  39.             @Html.ActionLink("Details""Details"new { id=item.FriendID }) |  
  40.             @Html.ActionLink("Delete""Delete"new { id=item.FriendID })  
  41.         </td>  
  42.     </tr>  
  43. }  
  44.   
  45. </table>  
元ネタ http://www.c-sharpcorner.com/article/asp-net-mvc-crud-with-dapper-micro-orm/

dbMAGIC MS-SQLのIDENTITY項目のDBタイプ

INTEGER IDENTITY


2017年11月15日水曜日

WebBrowserコントロールのレンダリングモードをデフォルトのIE7から最新IEモードに変更する

WebBrowserコントロールのレンダリングモードをデフォルトのIE7から最新IEモードに変更する



WebBrowserControlの初期値はIE7のレンダリングだった。
最新のレンダリングにするには、レジストリを変更する。

実行するexeがどのレンダリングを使用するか?を設定することで変更出来る。

2017年10月20日金曜日

CentOS /ets/fstab


/etc/fstabを修正して、root をコメントアウトして
ファイルチェック後、mountしようとしたらmount出来ない。
 

# mount -o remount,rw /
 
上記コマンドで再度mount後、/etc/fstabを編集する 
 

2017年10月16日月曜日

OCI8 INSTALL方法

Oracle Instantclientをrpm でinstall
rpm -Uvh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
rpm -Uvh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm

pear-php をyum でinstall
php-develをyumでinstall

pecl install oci-2.0.12

次にPath指定だが、以下の値を入力

instantclient,/usr/lib/oracle/11.2/client64/lib
                                      ^^^^  ココはversionによって違う

問題はOSが64bitなので、clientモジュールを64bit指定しないといけない。
でないとmakeでfaildedになる。


2017年10月12日木曜日

CentsOS + Oracle 11.2.0.4 patch 実行時エラーの対処方法

yum install binutils -y
yum install compat-libstdc++-33 -y
yum install compat-libstdc++-33.i686 -y
yum install gcc -y
yum install gcc-c++ -y
yum install glibc -y
yum install glibc.i686 -y
yum install glibc-devel -y
yum install glibc-devel.i686 -y
yum install ksh -y
yum install libgcc -y
yum install libgcc.i686 -y
yum install libstdc++ -y
yum install libstdc++.i686 -y
yum install libstdc++-devel -y
yum install libstdc++-devel.i686 -y
yum install libaio -y
yum install libaio.i686 -y
yum install libaio-devel -y
yum install libaio-devel.i686 -y
yum install libXext -y
yum install libXext.i686 -y
yum install libXtst -y
yum install libXtst.i686 -y
yum install libX11 -y
yum install libX11.i686 -y
yum install libXau -y
yum install libXau.i686 -y
yum install libxcb -y
yum install libxcb.i686 -y
yum install libXi -y
yum install libXi.i686 -y
yum install make -y
yum install sysstat -y
yum install unixODBC -y
yum install unixODBC-devel -y
yum install zlib-devel -y
yum install elfutils-libelf-devel -y
 
i686のライブラリが無いとインストール時にコンパイルエラーになる。 

PHP動作しない

PHPが動作しない
PHPライブラリが足りなかった。

PHP-mbstring  文字変換
PHP-gd      画像処理

2017年10月7日土曜日

CentOS7 + Oracle11g + PHP ハマりまくり

CentOS7 + Oracle11g + PHP ハマりまくりました。

1.CentOS7にOracle11gをインストールする。
参考資料  http://dbaora.com/install-oracle-11g-release-2-11-2-on-centos-linux-7/



2.Oracle11gとPHPを接続する為 OCI8のインストール
#yum install php-pear でinstall

#yum install php-devel が必要なので、インストールする



実行したのは、 pecl install oci8-1.4.10

今回の組み合わせは
OS CentOS7 64bit
Oracle11g 11.2.0.4
PHP 5.4.???  なので、OCI8も1.4.10をインストール




3.モジュールを読み込むため、/etc/php.iniの最後に追加
extension=oci8.so
 
httpdの再起動
systemctl restart httpd 
 
php -m でociモジュールが読み込んでいるか?確認できる。 
 
 
 
4./etc/sysconfig/httpd にapache環境変数に設定を追加
 
ORACLE_HOME=/ora01/app/oracle/product/11.2.0/db_1
ORACLE_SID=ORA11G
ORACLE_HOSTNAME=testhostname 
LD_LIBRARY_PATH=/ora01/app/oracle/product/11.2.0/db_1/lib
TNS_ADMIN= /ora01/app/oracle/product/11.2.0/db_1/network/admin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/ora01/app/oracle/product/11.2.0/db_1/bin 
NLS_LANG=Japanese_Japan.JA16SJISTILDE 
 
※この時の注意点は、.bash_profileに追加した exportは無し
LD_LIBRAY_PATHが無いと ORA-12154 
TNS_ADMINが無いと ORA-12154
NLS_LANGが無いと文字化け 
PATHが未設定だと、PHPが動作しない 
 

設定変更後
systemctl restart httpd でapache再起動

 

phpinfoでenvinromentでORACLE_HOMEは表示されていればOK

Linuxしたことないから、ここまで2日掛かった  ...Orz

2017年9月25日月曜日

MYSQL カーソルのネスト

DELIMITER //
CREATE PROCEDURE test1()
BEGIN
  DECLARE not_found INT DEFAULT 0;
  DECLARE v_deptno INT;
  DECLARE v_dname VARCHAR(14);
  DECLARE cur1 CURSOR FOR SELECT deptno FROM emp ORDER BY empno;
  DECLARE cur2 CURSOR FOR SELECT dname FROM dept WHERE deptno = v_deptno;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;
 
  OPEN cur1;
  loop1: LOOP
    FETCH cur1 INTO v_deptno;
    IF not_found THEN
      CLOSE cur1;
      LEAVE loop1;
    END IF;
   
    OPEN cur2;
    loop2: LOOP
      FETCH cur2 INTO v_dname;
      IF not_found THEN
        SET not_found = 0; ← フラグを戻す
        CLOSE cur2;
        LEAVE loop2;
      END IF;
      INSERT INTO work (dname) VALUES (v_dname);
    END LOOP;
  END LOOP;
END
//
DELIMITER ;

2017年9月15日金曜日

ASP.NET MVCのエラーをログファイルに出力する

ASP.NET MVCのエラーをログファイルに出力する。

HandleErrorAttribute.OnException

Controller内で起きた例外を処理する集約例外ハンドラを実装します。
Ajaxリクエストの場合はデフォルトの例外処理は何もせず、
ステータスコードを500、応答本文を例外情報を含んだJSONにして、
$.ajax().fail()で例外処理をしやすくしておきます。

using System;
using System.IO;
using System.Net;
using System.Web;
using System.Web.Mvc;

using System.Web.Optimization;
using System.Web.Routing;
using System.Text;


namespace Jobs {
    public class GlobalHandleErrorAttribute : HandleErrorAttribute {
        public override void OnException(ExceptionContext filterContext) {
            if (filterContext == null) {
                throw new ArgumentNullException("filterContext");
            }

            // ルート・パラメータを取得
            var route = filterContext.RouteData;
          
            // 例外発生時は常にログを取っておく
            StreamWriter objSw = new StreamWriter(HttpContext.Current.Server.MapPath("~/WebApp_Err.log"), true, Encoding.GetEncoding("utf-8"));

            StringBuilder objBld = new StringBuilder();

            objBld.Append(DateTime.Now.ToString());
            objBld.Append("\t");
            objBld.Append(filterContext.HttpContext.Request.RawUrl);
            objBld.Append("\t");
            objBld.Append(route.Values["controller"].ToString());
            objBld.Append("\t");
            objBld.Append(route.Values["action"].ToString());
            objBld.Append("\t");
            objBld.Append(filterContext.Exception.StackTrace);

            objSw.WriteLine(objBld.ToString());
            objSw.Close();

            //LogUtil.LogControllerError(filterContext);

            if (filterContext.HttpContext.Request.IsAjaxRequest()) {
                /// Application_Errorは呼ばれない
                HandleAjaxRequestException(filterContext);
            }
            else {
                /// custom errorが有効でなければ
                /// base.OnException()でExceptionHandledがtrueにならないので
                /// Application_Errorも呼ばれる
                base.OnException(filterContext);
            }
        }

        private void HandleAjaxRequestException(ExceptionContext filterContext) {
            if (filterContext.ExceptionHandled) {
                return;
            }

            filterContext.Result = new JsonResult
            {
                Data = new {
                    Message = filterContext.ToString(),
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                }
            };

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
    }
}


FilterConfig.csのRegisterGlobalFilters()を編集します。
もともとあるfilters.Add(new HandleErrorAttribute());をコメントアウトして、
代わりにGlobalHandleErrorAttributeを登録します。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //filters.Add(new HandleErrorAttribute());
    filters.Add(new GlobalHandleErrorAttribute());
} 
 

Application_Error

Controller外で起きた例外を補足するにはApplication_Error()を定義します。
これはGlobal.asax.csを修正する

using System.IO;
using System.Text;

void Application_Error(object sender, EventArgs e) {
            StreamWriter objSw = new StreamWriter(Server.MapPath("~/WebApp_Err.log"), true, Encoding.GetEncoding("utf-8"));
            Exception objErr = Server.GetLastError();
            StringBuilder objBld = new StringBuilder();
            objBld.Append(DateTime.Now.ToString());
            objBld.Append("\t");
            objBld.Append(objErr.Source);
            objBld.Append("\t");
            objBld.Append(objErr.Message);
            objBld.Append("\t");
            objBld.Append(objErr.TargetSite.ToString());
            objSw.WriteLine(objBld.ToString());
            objSw.Close();
        }

元ネタ http://qiita.com/mocha/items/6928870b2d02d4c1ac37

文字変数のゼロ埋め

文字変数 = string.PadLeft(2, '0');  //右側ゼロ埋め


結果
1 -> 01

月及び日のゼロ埋めで使用

2017年9月14日木曜日

GetFilesで複数の拡張子を取得する方法

GetFilesで複数の拡張子を取得する方法

// C#だけど.
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;

Regex regex = new Regex(@".*\.txt|.*\.log");
IEnumerable<string> p = from file in Directory.GetFiles(@"c:\windows\") where regex.IsMatch(file) select file;
foreach (string matched in p) {
    Console.WriteLine(matched);
}

2017年9月5日火曜日

yaml_dbでエラー

yaml_dbをgemでinstallして rake db:data:dump を実行すると

rake aborted don't know how to build task と表示される。

解決方法
1. install yaml_db
   gem install yaml_db

2. rails アプリのgemfileを編集 
   gem "yaml_db" を追加

3. rakeコマンドでdumpを行う
   rake db:data:dump



2017年9月1日金曜日

excel ゼロ埋め数字

"=text(7100346,""0000000"")"

go-global サーバサイドソリューション(SBS) 仮想アプリケーション

go-global サーバサイドソリューション(SBS) 仮想アプリケーション

https://www.graphon.com/
http://www.mitsuiwa.co.jp/solutions/goglobal/faq3.html
https://www.opensquare.co.jp/seminar/document/46/1_Go-Global.pdf


同時接続 20で250万
これって、remote Appsの5ユーザー10万の方が安いと思うぞ

白地図ぬりぬり

https://n.freemap.jp/

・登録:不要
・料金:無料
・日本語対応:対応

【使い勝手】
日本地図を都道府県や、市区町村別に色分けして地図を作ることができるツールです。
パワポで資料作ったりしてると、この地域のイイ感じの地図が欲しいんだよな〜ということがあるんですが、画像検索をしても見つからなかったりするので、このツールで地域ごとに色分けしたりして地図を作ってます。

f:id:uraweb:20160828191144p:plain
上記は大阪人の僕から見た、大阪の地域別危険度です。
※白←安全  危険→赤

ご旅行の参考にでも。


看板(Kanban) & scrum勉強中

redmineのpluginで backlogsを使用して看板が使えると最近知った。

redmineの実行環境をポータブルにしたいので、rubyの実行環境をjrubyにしていたが
rumix2でポータブル環境を構築出来そうです。

usb memoryで現在、redmine + backlogsの環境を構築中です。


  ※openshiftがver2の上にredmineを構築していたが ver2廃止されるので  

usbなら、どこでも redmineが使える。

openshift ver3のdockerを使って、redmineを構築する方が簡単ぽいのですが

dockerも勉強中、dockerのアプリケーションを仮想化する発送は面白いです。

アプリの仮想をUPすれば良いので、運用は楽になりそう。

C# 全角から半角へ変換

 C# 全角から半角へ変換

元ネタ http://www.atmarkit.co.jp/fdotnet/dotnettips/1051anhankaku/anhankaku.html


using System.Text.RegularExpressions;
using Microsoft.VisualBasic;

    static string abc123ToHankaku(string s) {

            Regex re = new Regex("[0-9A-Za-z:- ]+");
            string output = re.Replace(s, myReplacer);

            return output;
        }

       static string myReplacer(Match m) {
            return Strings.StrConv(m.Value, VbStrConv.Narrow, 0);
        }



2017年8月28日月曜日

C# RIght関数

       static string Right(this string stTarget, int iLength) {
            if (iLength <= stTarget.Length) {
                return stTarget.Substring(stTarget.Length - iLength);
            }

            return stTarget;
        }

2017年8月17日木曜日

Excel to CSV C#で作成


NPOIでExcel2003形式に対応
第1パラメータでExcelファイルを指定
第2パラメータでCSV出力ファオルを指定
第3パラメータでヘッダ行として行読み飛ばし

Excelが日付を数値で格納しているので、スタイルから日付を判別する。
日付だけしか扱わないお約束で、日付スタイルは yyyy/MM/dd にしている。

※日付表示は国によって違うので要注意です。




        static void Main(string[] args) {

            //入力ファイル確認
            try {
                if (!File.Exists(args[0])) {
                    return;
                }
            }
            catch {
                return;
            }

            //Shift JISで書き込む
            //書き込むファイルが既に存在している場合は、上書きする
            using (StreamWriter sw = new StreamWriter(
                    args[1],
                    false,
                    System.Text.Encoding.GetEncoding("shift_jis"))) {

                // (WorkbookFactory.Create()を使ってinterfaceで受け取れば、xls, xlsxの両方に対応できます)
                IWorkbook workbook = WorkbookFactory.Create(args[0]);
                ISheet worksheet = workbook.GetSheetAt(0);

                int lastRow = worksheet.LastRowNum;
                string vLine = "";
                int vY = 0;

                try { vY = Convert.ToInt32(args[2]); } catch { vY = 0; }

                for (int y = vY; y <= lastRow; y++) {
                    IRow row = worksheet.GetRow(y);

                    int maxCell = row.LastCellNum;

                    for (int x = 0; x < maxCell; x++) {

                        if (x == 0) {
                            if (row.Cells[x] != null) {

                                // 数値型
                                if (row.Cells[x].CellType == CellType.Numeric) {

                                    // 日付型として値を取得
                                    if (DateUtil.IsCellDateFormatted(row.Cells[x])) {

                                        vLine = row.Cells[x].DateCellValue.ToString("yyyy/MM/dd");
                                    }
                                    else {
                                        vLine = row.Cells[x].NumericCellValue.ToString();
                                    }
                                }

                                vLine = row.Cells[x].ToString();
                            }
                        }
                        else {
                            if (row.Cells[x] == null) {
                                vLine = vLine.Trim() + ", ";
                            }
                            else {

                                // 数値型
                                if (row.Cells[x].CellType == CellType.Numeric) {

                                    // 日付型として値を取得
                                    if (DateUtil.IsCellDateFormatted(row.Cells[x])) {
                                        vLine = vLine.Trim() + "," + row.Cells[x].DateCellValue.ToString("yyyy/MM/dd");
                                    }
                                    else {
                                        vLine = vLine.Trim() + "," + row.Cells[x].NumericCellValue.ToString();
                                    }
                                }
                                else {
                                    vLine = vLine.Trim() + "," + row.Cells[x].ToString();
                                }
                            }
                        }
                    }

                    //ICell cell = row?.GetCell(0);

                    //Excelの内容を書き込む
                    sw.WriteLine(vLine);
                }
            }
        }