IT業界のすみっこ暮らし

ふと気がついたときの記録

ASP.NET MVCのルートURLにドットを含む文字列を使う

stackoverflow.com

Web.config

system.webServerの中のhandlersに以下のように記載する。

  <system.webServer>
    <handlers>
      <add name="ApiURIs-ISAPI-Integrated-4.0"
         path="/MyURL/*"
         verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

    <handlers>
      <add name="ApiURIs-ISAPI-Integrated-4.0"
         path="/Home/GenerateImage/*"
         verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

f:id:papamau:20170222183410p:plain

SQL学習サイト SQL ZOO

SQL ZOO

SQLZOO

DBで直接実行しながら学習できるサイト f:id:papamau:20170222131502p:plain

DBは「MySQL」と「SQL Server」の2種類が選択可能

f:id:papamau:20170222131635p:plain

学習画面

f:id:papamau:20170222131718p:plain

クイズ画面

f:id:papamau:20170222132007p:plain

該当メニューの進み具合がメニューの横の黒いバーに表示される

(会員登録なし、ブラウザの情報を保存)

f:id:papamau:20170222132256p:plain

まとめ

wikiに登録されているテーブルの値と実際SQL実行時の結果と若干異なる場合もあるけど、実際にDBを構築せずに学習できるのは便利だと思った。

広告を非表示にする

Entity Framework:最新の日付のレコードを抽出

DBサンプル

tb1

Id DetailId LastUpdatedAt
1 101 2017-02-01 01:00:00
2 101 2017-02-01 10:00:00
3 101 2017-02-02 01:00:00
4 102 2017-02-01 01:00:00
5 102 2017-02-02 01:00:00

tb2

DetailId Name
101 Name1
102 Name2

例1

tb1から同じDetailIdを持つ複数のレコードの中で、一番最新の日付のものを抽出する

var list = (from t in db.tb1
           group t by t.DetailId into g
           select g.OrderByDescending(e => e.LastUpdatedAt).FirstOrDefault() into p
           select new 
           {
               Id = p.Id,
               DetailId = p.DetailId,
               LastUpdatedAt = p.LastUpdatedAt
           }).ToList();

例2

tb1から同じDetailIdを持つ複数のレコードの中で、一番最新の日付のもの、且つステータスが10であるもので、tb2と紐付いてるNameも抽出する

var list = (from t in db.tb1
            group t by t.OrderDetailId into g
            select g.OrderByDescending(e => e.LastUpdatedAt).FirstOrDefault() into p
            join tt in db.tb2 on p.DetailId equals tt.DetailId
            where 
                p.Status == 10
           select new 
           {
               Id = p.Id,
               DetailId = p.DetailId,
               Name = tt.Name,
               LastUpdatedAt = p.LastUpdatedAt
           }).ToList();

参考サイト

stackoverflow.com

stackoverflow.com

EntityFrameworkでMySQL接続

qursaan-howto.blogspot.jp

1、必須条件

mysql-installer-community-5.7.3.0-m13.msi」をインストールするか 「mysql-visualstudio-plugin-1.1.1.msi」と「mysql-connector-net-6.8.3.msi」をインストールする。

ダウンロードミラー http://mirror.cogentco.com/pub/mysql/MySQLInstaller/

2、Entity Framework

「App.config」や「Web.config」にあるentityFrameworkのデフォルトタグを削除する。

<entityFramework>   
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">  
<parameters> 
<parameter value="v11.0" />  
</parameters>  
</defaultConnectionFactory>  
 <providers>  
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />  
</providers>  
</entityFramework>

下記のentityFrameworkタグを追加する。

<entityFramework>  
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" /> 
<providers>  
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />     
</providers>  
</entityFramework>

3、References(参照)追加

MySql.Data.dll
MySql.Data.Entity.EF6.dll
MySql.Web.dll

4、プロジェクトをリビルド

5、ADO.NET Entity Data Modelの追加手順を行う

まとめ1

1, Reinstall MySQL Tools with the latest stable MySQL connector for windows.
2, Add this 3 files as reference in Visual Studio.
3, MySql.Data.dll
4, MySql.Data.Entity.EF6.dll
5, MySql.Web.dll
6, Modify following Web.config from

まとめ2

holidayprogramming.hatenablog.com

mysql-visualstudio-plugin-1.1.1.msiのインストー
mysql-connector-net-6.8.3.msiのインストー
NuGetパッケージの管理で以下をインストー
・EntityFramework (6.1.1)
Mysql.Data (6.9.3)
Mysql.Data.Entities (6.8.3.0)
Mysql.Web (6.9.3)
手順3までの操作で Web.config (あるいはスタンドアロンAPなら App.config) が修正されます。
connectionStringタグを若干修正します。

※ダウンロード先
http://forums.mysql.com/read.php?174,601041,601041 http://dev.mysql.com/downloads/connector/net/6.8.html


以上

20170216ブクマ

commte.net

404エラーページをデザインする時に取り入れたい洗練されたエフェクトとギャラリー集 | コムテブログ

furien.jp

miwao.hatenablog.com

guildworks.doorkeeper.jp

www.slideshare.net

www.slideshare.net

広告を非表示にする

クレジットカード番号から発行者検索機能実装

クレジットカード番号について

クレジットカード番号 - ISAF 286th TFS

クレジットカード番号には法則があり、先頭6桁でカードの種類を識別、分類することができる。
先頭の6桁を銀行識別番号(Bank Identification Number、略称:BIN)ないしは発行者識別番号(Issuer Identification Number、略称:IIN)と呼び、この先頭6桁でカード発行会社(イシュア、issuer)が判るようになっている。


…らしい。

無料でクレジット番号から発行者を識別できる情報を提供してるサイト

binlist.net - Free BIN/IIN Lookup Web Service

下記のページから「archived/iin-user-contributions.csv」ファイルをダウンロードする。 github.com

DB構築

CREATE TABLE `mt_credit_card_iin`( 
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `iin` CHAR(6) NOT NULL,
    `card_brand` VARCHAR(64) NOT NULL,
    `card_sub_brand` VARCHAR(64),
    `card_type` VARCHAR(64) NOT NULL,
    `card_category` VARCHAR(64),
    `country_code` VARCHAR(128) NOT NULL,
    `bank_name` VARCHAR(128),
    `bank_url` VARCHAR(200),
    `bank_phone` VARCHAR(128),
    `bank_city` VARCHAR(64),
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  

エンコードなどが原因で、MySQL上のINFILEコマンド実行時に最初の1行しか読み込めない場合、一度ファイルをエクセルで開いてからCSV形式で「名前を付けて保存」をすると直る。

mysql>  LOAD DATA LOCAL INFILE 'C:\\util\\binlist-data-master\\binlist-data-master\\credit_card_iin.csv'  
    -> INTO TABLE mt_credit_card_iin 
    -> FIELDS TERMINATED BY ','  
    -> LINES TERMINATED BY '\r\n'    
    -> (iin,card_brand,card_sub_brand,card_type,card_category,country_code,bank_name,bank_url,bank_phone,bank_city); 

django rest frameworkでの実装例

クレジットカードの先頭の6桁の番号から発行者の情報を返す

Python

class CreditCardIinViewSet(viewsets.ViewSet):
    queryset = mt_credit_card_iin.objects.all()
    def list(self, request):
        iin_val = request.query_params.get('iin')
        if iin_val is not None and iin_val.isdigit() is True and 6 == len(iin_val) :
            if 0 is not mt_credit_card_iin.objects.filter(iin=iin_val).count():
                iin_infos = mt_credit_card_iin.objects.filter(iin=iin_val)[:1]
            elif 0 is not mt_credit_card_iin.objects.filter(iin__startswith=iin_val[:4]).count():
                iin_infos = mt_credit_card_iin.objects.filter(iin__startswith=iin_val[:4])[:1]
            else:
                return Response({'message': 'No results for {0}. Make sure you enter a valid BIN/IIN number.'.format(iin_val)}, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({'message': 'No results for {0}. Make sure you enter a valid BIN/IIN number.'.format(iin_val)}, status=status.HTTP_400_BAD_REQUEST)
        serializer = CreditCardIinSerializer(iin_infos, many=True)
        serializer.data[0]['iin'] = iin_val
        return Response(serializer.data)

IPアドレス所在地検索機能の実装

一番最初にIPに紐付く地域情報DBを調べる

「ip address location database」でググるといくつかのサイトが確認できる。

www.ip2location.com

lite.ip2location.com

db-ip.com


調べた結果

調べてみると、IPから国~市情報までは無料提供もあるけど、細かい情報は大体有料な場合が多い。でも、機能の実装ならIP2Locationで提供しているLITE11で十分なのでこれをダウンロードしてみる。

lite.ip2location.com

IP2LocationはダウンロードページからDB構築手順も案内していて、色んな開発ケースに対してチュートリアルも提供しているので便利。

f:id:papamau:20170209174303p:plain

www.ip2location.com


IP2LocationでIPアドレス検索用DB構築

IPv4

CREATE TABLE `mt_ip2location_db11`(    
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `ip_from` INT(10) UNSIGNED,
    `ip_to` INT(10) UNSIGNED,
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    `region_name` VARCHAR(128),
    `city_name` VARCHAR(128),
    `latitude` DOUBLE,
    `longitude` DOUBLE,
    `zip_code` VARCHAR(30),
    `time_zone` VARCHAR(8),
    PRIMARY KEY (`id`),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  

IPv6

CREATE TABLE `mt_ip2location_db11_ipv6`(   
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `ip_from` DECIMAL(39,0) UNSIGNED NULL DEFAULT NULL,
    `ip_to` DECIMAL(39,0) UNSIGNED NOT NULL,
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    `region_name` VARCHAR(128),
    `city_name` VARCHAR(128),
    `latitude` DOUBLE,
    `longitude` DOUBLE,
    `zip_code` VARCHAR(30),
    `time_zone` VARCHAR(8),
    PRIMARY KEY (`id`),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  

IPv4

mysql>  LOAD DATA LOCAL INFILE 'C:\\util\\ip-address\\IP2LOCATION-LITE-DB11.CSV\\IP2LOCATION-LITE-DB11.CSV'   
    -> INTO TABLE mt_ip2location_db11    
    -> FIELDS TERMINATED BY ','  
    -> ENCLOSED BY '"'   
    -> LINES TERMINATED BY '\r\n'    
    -> (ip_from,ip_to,country_code,country_name,region_name,city_name,latitude,longitude,zip_code,time_zone);    
Query OK, 4044940 rows affected (56.48 sec) 
Records: 4044940  Deleted: 0  Skipped: 0  Warnings: 0

IPv6

mysql>  LOAD DATA LOCAL INFILE 'C:\\util\\ip-address\\IP2LOCATION-LITE-DB11.IPV6.CSV\\IP2LOCATION-LITE-DB11.IPV6.CSV' 
    -> INTO TABLE mt_ip2location_db11_ipv6   
    -> FIELDS TERMINATED BY ','  
    -> ENCLOSED BY '"'   
    -> LINES TERMINATED BY '\r\n'    
    -> (ip_from,ip_to,country_code,country_name,region_name,city_name,latitude,longitude,zip_code,time_zone);    
Query OK, 4366556 rows affected, 3 warnings (1 min 9.98 sec)    
Records: 4366556  Deleted: 0  Skipped: 0  Warnings: 3   

DBが準備できれば後はSELECTするだけなのでここまで。
※DBからIPv6の値を元に検索する方法が現在チュートリアルには存在してない、且つPythonのライブラリが存在するため、Pythonで開発する場合はライブラリを利用して実装することをお勧めする。

django rest frameworkでの実装例

IP情報からIPv4IPv6か判別し、地域情報を返す
(IPv6はDB格納、IPv6はライブラリ(BIN)をプロジェクト内に格納)

Python

class Ip2locationViewSet(viewsets.ViewSet):
    queryset = mt_ip2location_db11.objects.all()
    def list(self, request):
        ip_val = request.query_params.get('ip')
        if ip_val is not None:
            try:
                ipnet = ipaddress.ip_network(ip_val)
                if ipnet.version == 4:
                    ipv4_val = int(ipaddress.IPv4Address(ip_val))
                    ip_infos = mt_ip2location_db11.objects.filter(ip_to__gte=ipv4_val).order_by('ip_to')[:1]
                elif ipnet.version == 6:
                    IP2LocObj = IP2Location.IP2Location();
                    IP2LocObj.open(os.path.join("data","IP2LOCATION-LITE-DB11.IPV6.BIN"));
                    ip_infos = IP2LocObj.get_all(ip_val);
                    ipv6_result = OrderedDict()
                    ipv6_result['country_code'] = ip_infos.country_short
                    ipv6_result['country_long'] = ip_infos.country_long
                    ipv6_result['region_name'] = ip_infos.region
                    ipv6_result['city_name'] = ip_infos.city
                    ipv6_result['latitude'] = str(ip_infos.latitude)
                    ipv6_result['longitude'] = str(ip_infos.longitude)
                    ipv6_result['zip_code'] = ip_infos.zipcode
                    ipv6_result['time_zone'] = ip_infos.timezone
                    ipv6_result['ip'] = ip_val
                    return Response([ipv6_result])
                else:
                    ip_infos = mt_ip2location_db11.objects.all()[:1]
                    return Response(ip_infos, status=status.HTTP_404_NOT_FOUND)
            except ValueError:
                return Response({'message': 'IP形式が正しくありません。', 'ip': ip_val}, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({'message': 'IPアドレスの情報がありません。', 'ip': ip_val}, status=status.HTTP_400_BAD_REQUEST)
        serializer = Ip2locationSerializer(ip_infos, many=True)
        serializer.data[0]['ip'] = ip_val
        return Response(serializer.data)


その他、参考サイト

IP2Locationの開発向けのページ

www.ip2location.com

ip2location-python

pypi.python.org

Bootstrap:Material AdminのIEスクロールバー非表示問題

Material design

Introduction - Material design - Material design guidelines

Material Admin

最新のBootstrap3をベースにしたGoogle Material Designから触発された強力で軽量な完全レスポンシブで高解像度に対応した管理テンプレート


要はこれを使えばそれっぽいマテリアルデザインのサイトが表現できるということだが…

なぜかIEでスクロールバーが表示されない…

どこのcssが邪魔してるのか分からないため、範囲を絞りつつ犯人探しをして、原因発見。 これはもしかしてレスポンシブ対応を考慮して最初から水平スクロールは全部NGにしてたのかな?

修正前

html {
  overflow-x: hidden\0/;
  -ms-overflow-style:none; // noneからautoに変更
}

修正後

html {
  overflow-x: hidden; //意図があるのかも知れないけど、気になったのでhiddenに修正
  -ms-overflow-style:auto;
}

おそらく直接邪魔してたのは「-ms-overflow-style」だったと推測する。
html単位でスクロールスタイルが「none」になっていたからその後、overflow-xでスクロール設定をいくら追加してもIEだけは非表示になってたと思われる。


解決後に見つかった海外で同じ問題にハマった人の例

my.oschina.net


参考サイト
http://xn–lcki7of.jp/762/xn--xnlcki7of-r89d.jp

wordpress:botによるアクセスで発生するエラー

[08-Dec-201x 07:42:12 Asia/Tokyo] PHP Fatal error:  Call to undefined function get_header() in /export/user/8/zjp_568108/live_2a7a69/var/wordpress/wp-content/themes/theme-name/index.php on line 14

ある日wordpressのログに上記のようなエラーログがあったので調べてみた。

cro.ma

どうやらbotによるアクセスで発生するエラーらしい。 対策はrobots.txtに以下のようにテーマフォルダーを覗かないように制御することでOK

robots.txt

User-agent: *
Disallow: /wp-content/themes/

setコマンド

SET - 環境変数の設定と表示 [FPCU]DOS/V&Windowsコマンド・プロンプト・リファレンス

現在されている環境変数と内容の確認用

広告を非表示にする