OmniAICreator/Qiita-1.07M huggingface dataset:
【Bluehost】Wordpressの管理画面だけにBasic認証がかからない！

#事象
- Wordpressの管理画面にBasic認証がかからない
- 管理画面だけでなく、全体に認証がかかってしまう
- レイアウトが崩れてしまう
- 管理画面を表示しようとすると、Topページに飛ばされる


#原因
- Rewiteのルールで、wp-login.phpにBasic認証をかける設定が無視されていた  
⇒wp-login.phpのファイルのみBasic認証をかける予定が、そこに行くまでにURLが書き換えられてしまっていた。。。


#解決策
###①.htaccessの修正（ドキュメントルート配下）
下記のように修正しました。

```
●変更前
# BEGIN WordPress

AddHandler application/x-httpd-php5s .php

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/pdf "access plus 1 month"
    ExpiresByType text/javascript "access plus 1 month"
    ExpiresByType text/html "access plus 2 hours"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresDefault "access plus 6 hours"
</IfModule>
Header set X-Endurance-Cache-Level "2"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /~tajimato/wordpress/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /~home/wordpress/index.php [L]
</IfModule>

# END WordPress

<Files wp-login.php>
AuthType Basic
AuthUserFile /home/test/public_html/wordpress/.htpasswd
AuthGroupFile /dev/null
AuthName "User and Password"
Require valid-user
</Files>

# END WordPress


●変更後
==================================================================================
# BEGIN WordPress

AddHandler application/x-httpd-php5s .php

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/pdf "access plus 1 month"
    ExpiresByType text/javascript "access plus 1 month"
    ExpiresByType text/html "access plus 2 hours"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresDefault "access plus 6 hours"
</IfModule>
Header set X-Endurance-Cache-Level "2"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /~tajimato/wordpress/
RewriteRule ^index\.php$ - [L]
#RewriteCond %{REQUEST_FILENAME} !-f　★コメントアウト
#RewriteCond %{REQUEST_FILENAME} !-d　★コメントアウト
#RewriteRule . /~home/wordpress/index.php [L]　★コメントアウト
</IfModule>

# END WordPress

<Files wp-login.php>
AuthType Basic
AuthUserFile /home/test/public_html/wordpress/.htpasswd
AuthGroupFile /dev/null
AuthName "User and Password"
Require valid-user
</Files>

# END WordPress
```

###②wp-adminディレクトリに.htaccessを作成
Wordpressの管理機能が集約されたディレクトリwp-adminディレクトリに、.htaccessを作成

```
<Files admin-ajax.php>
Satisfy Any
Order allow,deny
Allow from all
</Files>
```

[こちらも参考](https://qiita.com/takahashi-kazuki/items/beeeff3145b35cc4b476)
【Bluehost】WordpressのTopページを表示すると、ファイルがダウンロードされる問題

#事象
- Wordpressをインストールした後に、公開されたWebページを表示するとファイルがダウンロードされる。。。  
⇒フロント側と管理画面側どちらも同様の現象が発生。。。。


#原因
①.htaccessのAddHandlerの記載が、cPanelで設定されたものと異なっていた。
②何かしらのモジュール設定が不足


#解決策
①.htaccessのAddHandlerの記載をcPanelと合わせる。
②Bluehostのサポートチャットに問い合わせて、状況を説明し確認・対応してもらう


#手順
###①AddHandlerの確認方法
1.Bluhostにログイン

2.AddHandlerを確認する
　⇒[Addvanced]⇒[Apacheハンドラー] 
今回は下記のような感じでしたので、cPanelのほうに合わせました。
※PHPのバージョンが5系だったのに、7系のAddHandlerが入っていました。

```
●.htaccessに記載されていたもの
AddHandler application/x-httpd-ea-php70 .php

●cPanel上で設定されていたもの
AddHandler application/x-httpd-php5s .php
```


###②Live Chatによる問い合わせ
1.Bluehostにログイン

2.Live Chatを開く

3.状況を説明し、対応してもらう
⇒**今回は恐らくhttpd.confの設定を変更してくれたことで、正常に動作するようになりました。**
　Bluehostはhttpd.confの設定をいじれないので、サポートに依頼して作業してもらいます。



Bluehostで何か詰まった際は、すぐに問い合わせしてもいいかもしれませんね。
特にhttpd.confのような設定ファイルが怪しいと思った時点で、聞いちゃいましょう。
Xamarinで作成したiOSアプリが実機デバッグ起動できなくなった場合の対処方法


# はじめに
Xamarin.Formsを使用してiOSアプリを作成していましたが、いつの間にか、ビルドしたアプリを起動できなくなりました。
対処方法を残しておきます。

# 環境
## PC等
* Windows 10
* Visual Studio 2017 Community

## 機材
* iPhone7 (iOS11)

# 現象
## アプリ起動
次の状態となります。

* 以前にビルドしてiPhoneにインストールしてあるアプリ：起動する
* 今回ビルドしてiPhoneにインストールしたはずのアプリ：起動しない

起動しないのは、Visual Studioでビルド＆実行したアプリとなります。

その後、iPhoneを操作してアプリを選択すると起動できますが、Visual Studioで行ったコード修正は反映されていません。(要するに元のままです)

## ログ
>'AppName.iOS' を 'iPhone7' で起動しています...
>アプリが終了しました。
>起動に失敗しました。アプリ 'AppName.iOS' を 'iPhone7' で起動できませんでした。エラー: error MT1006: Could not install the application '/Users/xxxx/Library/Caches/Xamarin/mtbs/builds/AppName.iOS/7a4bb2a9fcc59f234974d86c2df4f945/bin/iPhone/Debug/device-builds/iphone9.1-11.0.3/AppName.iOS.app' on the device 'iPhone7': AMDeviceSecureInstallApplicationBundle returned: 0xe80000be (kAMDMismatchedApplicationIdentifierEntitlementError).
。詳細はログを確認してください。
>アプリが終了しました。

ポイントとなる記述は、

> エラー: error MT1006
> kAMDMismatchedApplicationIdentifierEntitlementError

あたりでしょうか。


# 対処方法
簡単です。iPhoneにインストールされているアプリを削除すればOKです。

アプリ内のデータが消えるのは諦めましょう。（諦めました……）

# 参考
* https://forums.xamarin.com/discussion/50976/can-run-in-simulator-but-cant-deploy-app-to-device-in-ios-9
* https://forums.xamarin.com/discussion/89558/cannot-build-after-having-updated-to-xamarin-cycle-9
三次方程式の実数解と虚数解の割合

```math
ax^3 + bx^2 + cx + d = 0
```
の実係数a,b,c,dを乱数(-2,147,483,648 ～ 2,147,483,647)で発生させ
実数解と虚数解の割合を計算しました。

10,000,000回計算した結果
実数解:2179554(21.79554%)
虚数解:7820446(78.20446%)
三重解:0(0%)

なぜ、この割合なのかを数学的に証明できたらと思っています。

以下にソースコードの一部を掲載します。

```csharp
private void abcd_r_3()
        {
            double a;
            double b;
            double c;
            double d;
            double dd;

            byte[] bs = new byte[4];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            int m = 0; //重解 multiple root
            int r = 0;
            int i = 0;

            double total = 10000000;

            for (int x = 0; x < total; x++)
            {
                do
                {
                    rng.GetBytes(bs);
                    //Int32に変換する
                    a = BitConverter.ToInt32(bs, 0);
                    //a = -1;
                } while (a == 0);

                rng.GetBytes(bs);
                //Int32に変換する
                b = BitConverter.ToInt32(bs, 0);

                rng.GetBytes(bs);
                //Int32に変換する
                c = BitConverter.ToInt32(bs, 0);

                rng.GetBytes(bs);
                //Int32に変換する
                d = BitConverter.ToInt32(bs, 0);

                dd = -4 * a * c * c * c - 27 * a * a * d * d + b * b * c * c + 18 * a * b * c * d - 4 * b * b * b * d;

                if (dd == 0)
                {
                    m++;
                }
                else if (dd > 0)
                {
                    r++;
                }
                else
                {
                    i++;
                }
            }


            double m_p = m * 100 / total;
            double r_p = r * 100 / total;
            double i_p = i * 100 / total;

            Invoke(new dldl(delegate
            {
                textBox1.AppendText("実数解:" + r.ToString() + "(" + r_p.ToString() + "%)" +
                                    "虚数解:" + i.ToString() + "(" + i_p.ToString() + "%)" +
                                    "三重解:" + m.ToString() + "(" + m_p.ToString() + "%)" + Environment.NewLine);
                button3.Enabled = true;
            }));
        }
```
Vue.jsをローカルでシンプルに触ってみる


vueでデータのバインディングを
モダンな開発環境を入れないでサッと使ってみたいと思ったところ
公式ではJSFiddle使うと楽だよって言われたけども
ローカルで利用したかったので確認。

vueの読み込みについてはCDNから行う形で
`index.html`と`test.js`の2ファイルでバインディング出来ている事だけ確認する。

なお、ビューモデルは対象のidが読み込まれた後で読まないと
id見つけられなくてエラー吐くので(最初についheadに書いて吐いた)
bodyの最後に読み込んでいる。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>vue test</title>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <form>
            <input type="text" v-model="message">
            <p>Message is {{ message }}</p>
        </form>
    </div>
    <!-- ViewModelはid設定した要素より後ろで読み込む -->
    <script type="text/javascript" src="test.js"></script>
</body>
</html>
```

```js:test.js
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue!'
    }
})
```

これでindex.htmlをブラウザで開くと
`message`がバインディングされていることが確認できた。

参考
[はじめに — Vue.js](https://jp.vuejs.org/v2/guide/index.html)
[はじめてのVue.js - 単一ファイルコンポーネントを作れる環境構築編 (npm + gulp + browserify + babel + vueify)](https://qiita.com/ayasuda/items/92221229e8f8c65c6f7c)
21歳の女子大生でもできる！deep learningを5分で体験

#さっそくdeep learning　が動いている様子を見てみましょう（python)

bitcoin の株価予測のデータを使用　以下URLを使用（https://www.kaggle.com/daiearth22/rnn-for-predicting-closing-price-using-ker-426088 ）

Fork Notebookからデータを自分のアカウントに移動

プログラムの実行（読み込みが遅い場合は早送り）

#deep learning が動いていることがわかりますね！
history = model.fit_generator(train_gen,
                              steps_per_epoch=100,
                              epochs=20,
                              validation_data=val_gen,
                              validation_steps=val_steps)

epochsとsteps_per_epochの数値をいろいろと変えて自分の好きなように動かしてみましょう！


![image.png](https://qiita-image-store.s3.amazonaws.com/0/183256/588763ae-45bd-fbb0-40b8-2309717c9089.png)

#グラフを見てみると予測データとあまり変化はありません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183256/f0e0b013-63e5-d2b3-801c-53dd60fedafe.png)
簡単にターミナルをある程度使えるように改良

Macデフォルトのターミナルを手っ取り早くいい感じに改良する。
重視するのは基本的に速度。

# 本文

## Iceberg + Consolas

[Icebregの公式サイト](http://cocopon.me/app/vim-iceberg/)の後半にあるDownloadのリンクからダウンロード。
普通にリンクをクリックするとXMLファイルが表示されるので右クリック -> リンク先を別名で保存を選択した。

フォントはGoogleの[RobotoMono](https://github.com/google/fonts/tree/master/apache/robotomono)を採用。
Tinは細すぎて日本語との格差が気持ち悪いのでLight一択。
フォントのページの右上部のDownloadボタンをクリックしてダウンロード。

## fish

デフォルトのままでも強力なのでZSHと違ってめくるめくプラグイン探しの旅が始まらないのが主張。
[fish公式サイト](https://fishshell.com/)に書いてあるように、Homebrewを使って一撃

```bash
$ brew install fish
```

## fisherman + Pure

fish用のパッケージ管理ソフト
[GitHubのプロジェクトページ](https://github.com/fisherman/fisherman)
日本語Wikiのリンクもあり、非常に使いやすく便利。

また[ZSHのPureテーマ](sindresorhus/pure)がかわいいのでfishでも使いたいと思って探していたら、
fish版の[Pure.fish](https://github.com/brandonweiss/pure.fish)を発見。

fishermanはGitHubのリポジトリからでもインストールが出来るので、下記コマンドで一撃

```bash
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher

$ fisher install brandonweiss/pure.fish
```

# おまけ

## FAQ

A: iTerm2でよくね？
Q: iTerm2はVimのレンダリングが遅くてカクカクになって辛い。
　　なおiTerm2はホットキーで呼び出せる機能が便利なのでこれはこれで使う。

A: 他のターミナルの選択肢は？
Q: 調べた中では日本語入力可能なターミナルエミュレータが少ない。
　　候補はターミナルかiTerm2くらいだった。

## 参考記事

- [お前らのターミナルはダサい](https://qiita.com/kinchiki/items/57e9391128d07819c321)
- [MacでもConsolasを使用したい！！](https://qiita.com/ozw_sei/items/8cd7f96f056a7efc65cf)
- [初心者がShellを知りFish〜Fishermanを導入するまで](https://qiita.com/nutsinshell/items/5f111184b50f7081c92f)
- [Webフロントエンドエンジニアが選ぶプログラミング用フォント10選](https://blog.nakanishy.com/programming-fonts.html)
LaravelでAPP_URLをちゃんと設定しないとHTTPテストが失敗する

# 発生した事象
Laravelのバージョンを5.1から5.4にアップデートしたら、HTTPテストが通らなくなってしまった。
## テストコード
```php
public function testAPI()
{
    $this->json('get', '/api/xxxx', [], [])
        ->assertStatus(200);
}
```
## テスト結果

```
1) Tests\APITest::testAPI
Expected status code 200 but received 404.
Failed asserting that false is true.
```

# 原因
.env で APP_URL を以下のように設定していたのが原因だったようだ。

```
APP_URL=localhost
```

# 対応
.env の APP_URL は http scheme も含めないといけない

```
APP_URL=http://localhost
```
javascriptで今年の残り日時(カウントダウン)の表示

# javascriptで今年の残り日時(カウントダウン)の表示を行なう
javascriptのお勉強に今年の残り日時(カウントダウン)を作ったときのメモ

# 実装コード

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>カウントダウン</title>
</head>
<body>
  <h1 id="days" style="text-align:center;"></h1>
  <script>
  function time () {
    const now = new Date()
    // 来年の1月1日
    const firstDay = new Date(now.getFullYear() + 1, 0, 1)
    // 秒数差
    const diff = (firstDay.getTime() - now.getTime()) / 1000
    // 日時の計算と端数切り捨て
    const daysLeft = Math.floor(diff / (24 * 60 * 60))
    const hoursLeft = (Math.floor(diff / (60 * 60))) % 24
    let minitesLeft = (Math.floor(diff / 60)) % 60
    let secondsLeft = Math.floor(diff) % 60
    // 二桁表示
    minitesLeft = ('0' + minitesLeft).slice(-2)
    secondsLeft = ('0' + secondsLeft).slice(-2)
    // 出力
    document.getElementById('days').innerHTML = ('今年の残り時間は' + daysLeft + '日' + hoursLeft + '時間' + minitesLeft + '分' + secondsLeft + '秒です')
  }
  time()
  setInterval('time()', 500)
  </script>
</body>
</html>
```
こんな感じになる。
![dateCount.gif](https://qiita-image-store.s3.amazonaws.com/0/163837/b93d566d-5d9e-0ee6-4e31-515504580046.gif)
# メモ
```js
setInterval('time()',500);
```

1秒ごとの表示だと二桁表示の処理のせいか、たまに１秒スキップされてしまうので、0.5秒ごとの表示にしている。
UIAlertController生成を他クラスに切り分ける　PART2

前回、UIAlertControllerの生成を別クラスに切り分けてみたが、汎用性がなく、クラスに切り分ける意味がなくなってしまっていたので、改めて書いてみる。
今回はデリゲートと合わせて使ってみました。

##Alertを生成するクラスの用意
任意のテキスト情報を受け取りControllerの代わりにUIAlertControllerを作ります。
その際に、アラートアクションとしてデリゲートメソッドをセットしています。

```Objective-c:AlertHelper.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AlertHelperDelegate <NSObject>
- (void)reload;
@end

@interface AlertHelper : NSObject
@property (nonatomic, weak) id<AlertHelperDelegate> delegate;
- (UIAlertController *)createAlertController:(NSString *)title
                                     messege:(NSString *)messege;
@end
```

```Objective-c:AlertHelper.m
#import "AlertHelper.h"

@interface AlertHelper ()

@end

@implementation AlertHelper

- (UIAlertController *)createAlertController:(NSString *)title
                                     messege:(NSString *)messege {
    
    UIAlertController *aleartController = [UIAlertController alertControllerWithTitle:title
                                                                              message:messege
                                                                       preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"キャンセル"
                                                     style:UIAlertActionStyleCancel
                                                   handler:^(UIAlertAction *action) {

                                                       NSLog(@"キャンセルしました。");

                                                   }];
    
    UIAlertAction *save = [UIAlertAction actionWithTitle:@"保存"
                                                   style:UIAlertActionStyleDefault
                                                 handler:^(UIAlertAction *action) {

                                                     NSLog(@"保存しました。");

                                                     // デリゲートメソッドを呼ぶ
                                                     [self.delegate reload];

                                                 }];
    
    [aleartController addAction:cancel];
    [aleartController addAction:save];
    
    return aleartController;
}

@end
```

##Controllerクラスでの受け取りと実行
ボタンアクションをトリガーにアラートを受け取り、表示します。
デリゲートメソッドを使うので、そちらの用意も行います。

```Objective-c:ViewController.m
#import "ViewController.h"
#import "AlertHelper.h"

@interface ViewController () <AlertHelperDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
}

// デリゲートメソッド
- (void)reload {

    NSLog(@"保存ボタン押下後、このメソッドが走ります。");

}

- (IBAction)outputAleart:(id)sender {
    
    AlertHelper *aleartHelper = [AlertHelper new];

    aleartHelper.delegate = self;
    
    UIAlertController *aleartController = [aleartHelper createAlertController:@"タイトル" messege:@"メッセージ"];
    
    [self presentViewController:aleartController animated:true completion:nil];
}

@end

```

##まとめ
前回の記事でやった方法よりは汎用性があるかなと思います。
デリゲートと合わせて使うことで、コントローラーから切り出しても不自由なく使えるかなと思います。
連想配列実装第二弾～ハッシュテーブル編～

# 今回のアルゴリズム
今回は、ハッシュテーブルを試したいと思います。

#ソースコード
## ソースコード
```cpp:main.cpp
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
#include <openssl/md5.h>

template<class T>
class Hash_Table{	
	
public:

struct myuint24_t{
	unsigned long v : 24;	
};

long n;
MD5_CTX md5_data;

T* data;

unsigned long Get_hash(std::string data){
	myuint24_t v;
	
if(MD5_Init(&md5_data)!=1){
		exit(-1);
	};
	unsigned char md[MD5_DIGEST_LENGTH];
	MD5_Update(&md5_data, data.c_str(), strlen(data.c_str()));
	MD5_Final(md, &md5_data);
	
	v.v=(*(unsigned long*)(md));
	return (unsigned long)(v.v);
}

Hash_Table(){

	n=pow(2,24);

	data=new T[n];
	
	if(data==NULL)exit(-1);
	
};


T& operator [](std::string n) {
	 return data[Get_hash(n)]; 
}

~Hash_Table(){
	delete[] data;
}
	
};
```
## 解説
まず、2の24乗個の配列を定義しています。
添え字で文字列を入れた時に、その文字列のmd5の下位24bitの部分を取得してそのハッシュ値で配列にアクセスしています。
ライブラリはopenSSLを使っています。

# 使い方
```cpp:main.cpp
//main.cppの続き

int main(){

Hash_Table<long> a;

a["key"]=100L;

std::cout<<a["key"]<<std::endl;//100

};

```


# その他
衝突処理は実装していません。
バックグラウンドを有効にして録音

XCode初心者でちょっと迷ったので備忘録。

#バックグラウンド
[AudioSessionProgrammingGuide](https://developer.apple.com/jp/documentation/AudioSessionProgrammingGuide.pdf) に
`UIBackgroundModes`フラグを立てるとか書かれている。
XCode上ではこういった感じ。

アプリケーションの設定でCapabilitiesのBackgroundを有効にして、`Audio, AirPlay, and Picture in Picture`をチェックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69798/5f17642f-0ce3-d1d2-2626-3b2f4c1dab05.png)


すると`info.plist`にこれ↓が追加される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69798/1481bea7-4136-0d3b-f67e-8d06fba5506a.png)

あとは普通に録音開始

```swift:
do{
    try session.setCategory(AVAudioSessionCategoryRecord)
    let recorder = AVAudioRecorder(....)
    recorder.record()
} catch {
    例外処理
}
```

ロックしててもバックグラウンドで録音。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69798/00223cc0-2a29-b795-c23f-9fc5ad85cbb9.png)

#割り込み
ただし、Siriや電話などの割り込みで録音は停止する。
割り込み通知を受け取って一時停止処理などをしなければいけない。割り込み処理用のhandlerがdeprecatedになっていて、NotificationCenterにObserverとして登録して通知を受け取るようにするらしい。

[Responding to Interruptions](https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/HandlingAudioInterruptions/HandlingAudioInterruptions.html)
ここに書いてあるサンプルコードをとりあえずswift4で怒られないコードにしてみた。

```swift:
NotificationCenter.default.addObserver(self,
    selector: #selector(handleInterruption),
    name: .AVAudioSessionInterruption,
    object: AVAudioSession.sharedInstance()


@objc func handleInterruption(_ notification: Notification) {
    guard let userInfo = notification.userInfo,
          let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
          let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
              return
    }
    if type == .began {
        // 割り込み開始。保存やUI更新など適切なアクションを取る。
    }
    else if type == .ended {
        guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else {
            return
        }
        let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
        if options.contains(.shouldResume) {
            // 割り込み終了。録音再開？
        }
    }
}
```
OracleからSQLServerへのデータ移行tips

#あらまし

現在、OracleからSqlServerへの移行案件をしている。
が、何分古すぎるシステムであること、OracleとSqlServerで一部データ型に互換性がないことから
テーブル定義の精査も含めて割と原始的な手順で移行することになった。
で、その上でのTipsの個人用メモ。

##データの取得
###テーブルの型
型が違う。いろんなところで微妙に違う。
~~varchar2とnvarcharとか~~(10/27削除)、dateTimeとdateとtimeとか。

(10/27追記ここから)
varchar2とnvarchar2は同じようなものだけどここで対比するものではなかった。
varchar2は「varchar」or「nvarchar」に置き換えられる。
n付はUnicode、nなしは非Unicodeな模様。
このn付はchar、text型にも言える。
どれを選べばいいかというと後述のセクション「文字化け」参照。

|ORACLE|SQLServer|
|:-:|:-:|
|char|char / nchar|
|varchar2|varchar / nvarchar|
|number|numeric / decimal※|
|date|datetime|
|(以降確認次第追加予定)||

※decimalとnumericは同一。

(10/27追記ここまで)

手法としてはSI Object Browserのメニュー[スクリプト出力]を実施し、
出てきたファイルを機械的に置き換える。
定義がそもそも妥当かはすべて、データ移行後に手を付けるためここではノータッチ。
PK、FK、Indexなんかはここで付属してもいい。

###ビュー、ストアド、シーケンス、トリガー等
基本的にテーブルと同じ。
が、たぶんいろいろとコンパイル通らないのでそれは都度やるしか。

### 文字化け(10/27追記)
2バイト文字を挿入。盛大に化けた。(SQL Server Expressにて)
オチとしてはInsert文の文字列の文字コードとDB側の文字コードの不一致の模様。
というわけでDBカラムの型がnVarcharのフィールドに入れるSQLにはプリフィックスで
「N」をつけることで回避。
本家SQLServerなら文字コードの設定で回避できるかも。

###データ
こっちも[スクリプト出力]を実施してできたものを機械的に置き換える。
日付型を入れるための文字列→日付返還なんかは正規表現による置換を実施。
サクラエディタなんかでは変数を扱えるのでCtrl+Rで呼び出した置換用ダイアログで以下のように入力。

`置換前：to_date\(('\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}'), 'yyyy/MM/dd hh24:mi:ss'\)`
`置換後：$1`

これで
`to_date\(('2001/04/12 12/04/31'), 'yyyy/MM/dd hh24:mi:ss'\)`
とかいうのは
`'2001/04/12 12/04/31'`
になるのでそのままさっくり入ってくれる。

同じ要領でSysdateとかあったらそういうのを適宜対応したメソッドに置き換えていく。

###

#データの登録
##SQLCMD
OracleにとってのSQLPLUS。

###接続記述
**Windows認証**
` >sqlcmd -E -S [ホスト] -d [データベース名称]`

**SQLServer認証**
` >sqlcmd -U <user> -P [パスワード]　-S [ホスト] -d [データベース名称]`

とりあえずローカルで開発してるのでWindows認証でサクッと。
→つながらねぇ。

というわけで、実際につながった例のコマンドがこちら。

` >sqlcmd -E -S localhost\SQLExpress -d testServer1`

\SQLExpressが何で必要なんや、と思ったら
どうもインスタンス名まで指定しないとだめらしい。そりゃそうか。

###SQL実行
普通にCreate table文なりSelect文を打ってチェック。
レスポンスが来ない。何故だ。

これはもう固定書式で必ず終了時に` >go`がいる模様。
セミコロンでは終わってくれない。
なのでSelect文も以下のように書く必要がある。

` >Select * from tblTest;`
` >go`

これで"tblTest"から全レコードを取得できる。

ちなみに大量のInsert文発行時などは、複数分を投げた後に最後に` >go`するとまとめて走ってくれる。
便利かは知らない。

###ファイルの読み込み
上記で大量発生した
` >:r [ファイルパス] ` 
絶対、相対ともに可能。例のごとく` >go` が必要。
ファイルの中に記述してれば実行してくれる。バッチで一括処理を考えるならあんまりおすすめしない。

##で
これらを組み合わせたバッチを作れば、中身のファイルがしっかりしてればバッチ一個で
ちゃんとデータがOracleからSQLServerへ流れてくれる。
んじゃないかな。
[jQuery]指定エリア間ドラッグアンドドロップで画像を移動

# 指定エリア間ドラッグアンドドロップで画像を移動

## 仕様

- jqueryとjquery-uiでドラッグ・アンド・ドロップをする
- 画像サンプルはplacehold.jpを利用
- 画像を掴み、移動可能な場所は黄色くなる
- 移動できない場合は元のエリアに戻る


## ソース

### HTML

```HTML:test_6.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="test_6.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script type="text/javascript" src="test_6.js"></script>
<title>test_6 指定エリア間ドラッグアンドドロップで画像を移動</title>
</head>
<body>
<div class="droparea">複数おける
<img class="dragItem" src="https://placehold.jp/ffc0c0/000000/100x100.png?text=1">
<img class="dragItem" src="https://placehold.jp/c0ffc0/000000/200x150.png?text=2">
</div>
<div class="droparea dropone">ひとつだけ
<img class="dragItem" src="https://placehold.jp/c0c0ff/000000/50x200.png?text=3">
</div>
<div class="droparea dropone">ひとつだけ
</div>
</body>
</html>

```

### CSS

```css:test_6.css
.droparea{
  border:solid 1px #000000;
  float:left;
  width:30%;
  height:200px;
}
.imgover{
  background-Color:yellow;
}
```

### javascript
 
```javascript:test_6.js
function modDroparea(){
  $('.droparea').each(function(){
    var me=$(this);
    me.droppable({
      "disabled":me.find('.dragItem').length>0 && me.hasClass("dropone"),
    });
  });
}
$(function(){
  $('.dragItem').draggable({
    "revert":'invalid',
    "zIndex":'1000',
  });
  modDroparea();
  $('.droparea').droppable({
    "hoverClass":'imgover',
      "accept": '.dragItem',
    "drop": function(e, ui){
      ui.draggable.prependTo(this).css({top:'0',left:'0'});
      modDroparea();
    },
  });
});
```
Unityでキャラクターアイコンをきれいに並べる方法

よくゲーム画面で見る。自分の持っているユニット情報を一覧で見ることができる画面。今回Unityの勉強をしていた時に簡単に実装できたので解説します。完成すると下の動物アイコンみたいに並べることが出来きます。

![スクリーンショット 2017-10-18 16.26.53.png](https://qiita-image-store.s3.amazonaws.com/0/187011/d51af0e6-92d8-4a21-1404-d1d07f71fcbf.png)

#Hierarchy
まずはHierarchyで並べたい場所にCreate→UI→Panelでパネルオブジェクトを配置します。その子要素となるように各アイコンになるイメージオブジェクトをCreate→UI→Imageで追加していきます。

![スクリーンショット 2017-10-18 16.38.45.png](https://qiita-image-store.s3.amazonaws.com/0/187011/f6843c7f-0e48-7c13-5ec1-66ec3d1ff2c1.png)

この画像だとUnitTileがパネルオブジェクト、Image(Clone)がイメージオブジェクトになっています。
#Inspector
各オブジェクトのコンポーネントをInspectorで設定していきます。

まずパネルオブジェクトから追加していきます。Add Componentを押して検索バーにGrid Layout Groupを入力して追加します。

![スクリーンショット 2017-10-18 16.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/187011/cfe96b91-f943-3e95-9eb5-60844ca44b11.png)

色々項目がありますが簡単に上から説明していきます。

・Padding
数値を入れて左右上下にに並べる位置を調整します。
・Cell Size
並べるイメージオブジェクトのサイズを設定します。あとで説明しますがこれがビルドする際にネックになります。
・Spacing
並べるイメージオブジェクトの間隔を設定します。
・Start Corner
どこの角から並べ始めるか設定します。
・Start Axis
縦横どっちに並べるか設定します。
・Child Alignment
子要素（イメージオブジェクト）をどこに揃えるか設定します。
・Constraint, Constraint Count
何個目まで同じ段落にするか設定します。

次にイメージオブジェクトのほうを設定します。
![スクリーンショット 2017-10-18 17.06.36.png](https://qiita-image-store.s3.amazonaws.com/0/187011/234486ea-fecc-036e-d082-7613e6a66f44.png)
Souce Imageで画像を貼ってお終いです。

：：：

これで完成なのですが・・・
スマホなどにビルドするときに問題があります。


#Build
![スクリーンショット 2017-10-18 17.18.43.png](https://qiita-image-store.s3.amazonaws.com/0/187011/006e364c-d51a-f47f-7a30-1245e76be59a.png)

小さい・・・どうしてこんなに小さくなってしまったのか・・・・

イメージオブジェクトの情報を見ると以下のようになっています。
![スクリーンショット 2017-10-18 17.23.19.png](https://qiita-image-store.s3.amazonaws.com/0/187011/f1e79b67-8800-a82a-99bb-90f30ee50e56.png)

前の状態だとこうなっています。
![スクリーンショット 2017-10-18 17.24.20.png](https://qiita-image-store.s3.amazonaws.com/0/187011/752c6506-6c15-d54c-81b1-6d386d0733d5.png)

Scaleが明らかに小さくなってしまっています。親要素の設定で画面によって拡大縮小されるようにしたのですが反映されていません。実はこれ、先程設定したCell Sizeによる影響です。

Cell Sizeの設定は縦横90になっていました。おそらくこの数値はピクセルで取っていて親要素に影響されない仕様になっているのではないかと思います。なので、ビルドするスマホの解像度が高ければ高いほどアイコンが小さくなってしまうことになります。

######解決策
Cell Sizeを動的に変更させるのは難しいのでScaleのほうをスクリプトで固定します。

```
ImageObject.transform.localScale = new Vector3(0.8f,0.8f,0.8f);
```

これでアイコンの大きさが親要素に追従できるようになりました。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3138373031312f64353161663065362d393264382d346132312d313430342d6431643037663731666362662e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/187011/1e4530a7-6763-a36a-97ef-38079ade3761.png)
UbuntuでDB内のデータも含めMySQLを削除する方法

mysql-server-coreおよびmysql-client-coreのバージョンは自分の環境に合わせて適宜変更してください。

```
sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.X mysql-client-core-5.X
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt-get autoremove
sudo apt-get autoclean
```
python の関数を AWS Lambda で使用する

次の　python の関数を、aws の Lambda にアップロードします。

```py3:evening_function.py
# -*- coding: utf-8 -*-
#
#	evening_function.py
#
#					Nov/03/2017
#
# --------------------------------------------------------------------
import sys
import json
 
# --------------------------------------------------------------------
def evening_handler(event, context):
	sys.stderr.write("*** evening_handler *** start ***\n")
	print("Received event: " + json.dumps(event, indent=2))
	print("name = " + event['name'])
	print("AAA value1 = " + event['key1'])
	print("BBB value2 = " + event['key2'])
	print("CCC value3 = " + event['key3'])
	sys.stderr.write("*** evening_handler *** end ***\n")
#
	return event['name']  # Echo back the first key value
	#raise Exception('Something went wrong')
# --------------------------------------------------------------------
```

1) zip で、固めます。

```bash
zip -r evening.zip evening_function.py
```

2) aws にアップロードします。
　morning_exec_role というロールが作られているとします。　ロールの作り方は、
[aws cli でラムダを使う](https://qiita.com/ekzemplaro/items/7dc187885dffe0be6341)

```bash:function_create.sh
aws lambda create-function \
	--function-name evening_function \
	--runtime python3.9 \
	--role arn:aws:iam::123456789012:role/morning_exec_role \
	--handler evening_function.evening_handler \
	--zip-file fileb://evening.zip \
	--region ap-northeast-1
```

3) CLIからイベントを発火

```bash:cli_exec.sh
aws lambda invoke --invocation-type Event \
	--function-name evening_function \
	--region ap-northeast-1 \
	--payload  '{"name": "夏目漱石","key1":" こんにちは", "key2":"おはよう", "key3":"さようなら"}' \
	outputfile.txt
```

4) CloudWatchLogsにログが出力されているか確認
 
>CloudWatch -> ログ -> ロググループ

Node.js のサンプルはこちら
[aws cli で Lambda を使う](https://qiita.com/ekzemplaro/items/7dc187885dffe0be6341)
cURLでHTTPコンテンツを部分的にダウンロードする

# 経緯

巨大なファイルの形式チェックをするために、先頭から一定のバイト数だけダウンロードして確認したくなった。

# cURLで部分ダウンロードする

cURLのオプションに以下があるのでそれを活用して部分ダウンロードできます。

```
 -r, --range RANGE   Retrieve only the bytes within a range
```

例:先頭バイト(0バイト目)から255バイト目までをダウンロードする

```
$ curl -r 0-255 "http://yourhost.com/huge_content.html"
```

こちらの形式は当然ながらRangeヘッダーに対応しているWebサーバー/コンテンツのみ有効です。
たとえばPHPなどで記述されているWebページの場合など、Rangeヘッダーを正しく送信しても206レスポンスを返さないケースもありますので注意が必要です。

## Rangeヘッダーと応答レスポンスのサンプル

```
$ curl -v -r 0-100 "http://yourhost.com/huge_contet.html"

* 送信したヘッダ *
> GET /huge_content.html HTTP/1.1
> Range: bytes=0-100
> User-Agent: curl/7.35.0
> Host: yourhost.com
> Accept: */*
>

* 受信したヘッダ *
< HTTP/1.1 206 Partial Content
< Date: Wed, 18 Oct 2017 09:35:45 GMT
< Server: Apache
< Last-Modified: Tue, 17 Oct 2017 12:28:30 GMT
< Accept-Ranges: bytes
< Content-Length: 101
< Content-Range: bytes 0-100/1234567890
< Connection: close
< Content-Type: text/html
```
[Laravel5.4] Proxy環境下でSSL強制


5年ほどROM専だったけど気が向いたので投稿。
最近業務でLaravel使うこと多くなってきた。

# 前提

* Laravel 5.4
* PHP7.1
* AWS + CloudFront(CDN)
* Port443空いてる Port80閉じてる

# 解決したいこと

まーあるあるネタ

* 普通にLaravel使ってると、リダイレクト時やblade でリンク生成時、
    最終的に`UrlGenerator`でURL生成してることがほとんど
* `UrlGenerator`はアクセス元のスキームやホストからフルURLを生成する
* Proxy環境下ではクライアントからのアクセスはHTTPSでも、エンドポイントから見るとHTTPなこと多し
* よって`UrlGenerator`がクライアント側がHTTPSでもhttpなURLを生成しちゃう


# 解決方法

ミドルウェアでリクエストを確認して、HTTPSなアクセスだったらスキーマを書き換える

### ミドルウェア作成

```php:app/Http/Middleware/SecureAccess.php
<?php
namespace App\Http\Middleware;

use \Symfony\Component\HttpFoundation\Request;

class SecureAccess
{
    public function handle($request, \Closure $next, $guard = null)
    {
        $is_secure =  $request->server('HTTPS') === 'on'
            || $request->server('HTTPS') === '1'
            || $request->server('SSL') === 'on'
            || $request->server('HTTP_X_FORWARDED_PROTO') === 'https'
            || $request->server('HTTP_CLOUDFRONT_FORWARDED_PROTO') === 'https'
        ;   // ※後述1

        if (! $is_secure) {
            return $next($request);
        }

        \URL::forceScheme('https'); // ※後述2

        Request::setTrustedProxies([
            '0.0.0.0/0'
        ]); // ※後述3

        return $next($request);
    }
}
```

1.  大抵のProxy環境下では`HTTP_X_FORWARDED_PROTO`でいけるはずだけど、  
    CloudFront経由時は更に`HTTP_CLOUDFRONT_FORWARDED_PROTO`を見ないとダメだった。  
    HTTPSかどうかの判定は他にもあるかも。
2.  `UrlGenerator::forceScheme()` のエイリアス。これで`UrlGenerator`が返すURLが(ほぼ)httpsになる。
3.  上記2の例外の対処で一部のURLを生成する関数は、  
    forceScheme関係なくSymfonyのRequestオブジェクトからURLを生成している。  
    そやつは `$_SERVER['REMOTE_ADDR']`とここでセットしたIPを判定しマッチしてればhttps、  
    そうでなければ`$_SERVER['HTTPS']`のみを見てスキーマを返している。  
    （正しくIP指定しないと**ローカル開発時の直HTTPSアクセスでProxy経由**と判定されちゃうよ☆）

### ミドルウェアの登録

あとは普通にミドルウェア登録。

```php:app/Http/Kernel.php
<?php
namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middleware = [
        /* ～～ その他ミドルウェア ～～ */
        \App\Http\Middleware\SecureAccess::class,
        /* ～～ その他ミドルウェア ～～ */
    ];
}
```

# 所感

* forceScheme  強制スキーマ（強制とは言ってない）
* SymfonyのRequestクラスはホストは`X_ORIGINAL_URL`やら`X_REWRITE_URL`etc...見て大分がんばってるのに、  
    スキーマだけはこういう判定方法にしてるのはなんか理由あるんかな？
chainerrl の DQN gym のサンプルの処理をまとめてみた

# 私は記憶力が弱い

複雑なプログラムを読み解こうとすると、10分後には「あれ？どうなってたっけ？」と忘れてしまう。最初に全体像を把握してからブレイクダウンする方針をとることにしている。

強化学習のアルゴリズムを調べる必要があったので、chainerrl のサンプルをおってみた。想定通り頭に入りにくかったので、（ちょっとあやしい）クラス図にまとめることにした。

# Deep Q Network

他にも解説があるのでサクッとまとめる。CNN + Q学習というのは以前からあったらしい。DQN ではいくつかの工夫がなされた。

- 似通った特徴量をもたせると効率的な学習にならない： 
    - 脳の海馬を参考に CNN 特徴量をストックしておき、ランダムサンプリングすることで Q 学習の学習データを相関が少ないものにした
- 理論的な漸化式にしたがってステップごとにQを更新すると、Qが安定しない
    - Q を一定時間固定した
- その他、いくつかのパラメータチューニング（すみません、雑で）


# 実行環境

chainerrl を git clone した。

理解するためにはデバッグしながらクラスを追いかけるのがやりやすい。PyCharm でブレークポイントを入れながら、デバッグモードで実行した。エディター上で変数のクラス型が表示されるので便利。

GPU を使わなかったので、Run -> Edit Configuration の Script Parameters にて
`--gpu -1` を設定した。

PyCharm で仮想環境を作成した。requiremetns.txt にしたがって作成。

またパスが通るように chainerrl と examples 配下の ale、gym を右クリック -> Mark Directory as -> Source Root を指定した。

# （なんちゃってな）クラス図

対象は train_dqn_gym.py。

可視化するにあたって下記のように表記した。

- いくつかの抽象化がされているため、処理に直接かかわる重要なクラスのみを青で着色
    - クラスの関係や構造については、抽象化と集約で関係を表示
- 処理フローの骨格について緑で着色
    - 処理フローについては矢印で表示
- 大まかな処理のカタマリについてコメントで補足

まとめてみたらこんな感じになった。

![train_dqn_gym.py.png](https://qiita-image-store.s3.amazonaws.com/0/73790/a6358f59-72de-1e1f-2647-8903c9c1387c.png)

# 処理の概要

## OpenAI の gym 環境の準備

chainerrl をインストールすると gym がインストールされる。

引数をしていしないと PendulumEnv という振り子の環境が指定される。`envs.classical_control` パッケージの `PendulumEnv` クラスが使われる。

また、実験の時間を指定するため、`gym.wrappers.time_limit` パッケージの `TimeLimit` クラスが使われる。 

## エージェントの準備

DQN エージェントの設定をおこなう。

もとの論文では CNN + Q 学習 + Experience Replay だったが、CNN + Q 学習をシンプルに `FCQuadraticStateQFunction` にまとめている。このクラスで 画像の特徴ベクトルとアクションのマトリクスで行動の価値(Q値)を計算する。

最適化だけすると探索ができなくなるので、`LinearDecayEpsilonGreedy` で探索する。ε-greedy 法というマルチアーム・バンデットアルゴリズムの一種である。

ReplayBuffer も保持しておき、適切なタイミングで更新する。

## 実験の実行

`experiments.train_agent`パッケージの関数から実験が実行される。

gym 環境の更新と DQN の学習が繰り返し行われる。

# その他

`train_dqn_gym.py`と同じディレクトリに`dqn_out`というディレクトリが作成される。ログやモデルのファイルが出力されるので参考にしてください。
Polymer でモックをデザインする

> 参考 : [Polymer でモックをつくる](https://qiita.com/KoheiShingaiHQ/items/7a79cd0d277c94cd7c27)

`Polymer + React = Polyreact`

**Polyreact** 上にレイアウトをデザインします。

## 1. Webプロトタイプのレイアウト構成原則
> 原則 : 一覧 → 詳細

`原則` よりシンプルになると、Webのメリットが薄くなります。
`原則` より複雑になると、プロトタイプの域を超えてしまいます。

> 再帰 : 一覧 → 詳細(一覧) → (詳細)

しかし、`原則` の再帰は OK です。

## 2. 一覧のデザイン
ベーシックなプロフィールページを作成してみましょう。
以下のように、一覧画面を **Polymer** でデザインしてみました。

### 2-1. content-element
![image-content-element](https://c1.staticflickr.com/5/4460/23892126788_74fbfd568b_b.jpg)
![codepen-content-element](https://c1.staticflickr.com/5/4509/37744975031_29d0562376_h.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/pWxOpV) - Chrome のみ対応

#### 2-1-1. contents-full-element
![codepen-contents-full-element](https://c1.staticflickr.com/5/4483/37696755476_f2736b8f2c_k.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/VMEGBv) - Chrome のみ対応

#### 2-1-2. contents-half-element
![codepen-contents-half-element](https://c1.staticflickr.com/5/4443/37035980404_5902b9dcc3_k.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/BwqOEm) - Chrome のみ対応

### 2-2. content-label-element
![image-content-label-element](https://c1.staticflickr.com/5/4507/37074537773_84da560c5d_b.jpg)
![codepen-content-label-element](https://c1.staticflickr.com/5/4513/37745315331_cd098bb39b_k.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/RLqwVq) - Chrome のみ対応

#### 2-2-1. contents-square-element
![codepen-contents-square-element](https://c1.staticflickr.com/5/4502/37487369990_28b903c3f1_k.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/aLQbmy) - Chrome のみ対応

### 2-3. content-timeline
![codepen-content-timeline](https://c1.staticflickr.com/5/4499/37036185184_929d2f8c82_k.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/YrRzvd) - Chrome のみ対応

## 3. 詳細のデザイン
プロトタイプの段階で、詳細画面のデザインは手間が掛かります。
コンテンツを **Markdown** で管理し、そのまま表示しましょう。

### 3-1. content-github
![codepen-content-github](https://c1.staticflickr.com/5/4505/23892795258_304f79f52c_k.jpg)
→ [CodePen で見る](https://codepen.io/KoheiShingaiHQ/pen/RLqwvm) - Chrome のみ対応

## 4. 組み合わせる
**Polyreact** 上で、ルーティングを適切に実装すると、
**Polymer** によるデザイン案を、Web アプリケーションとして実演出来ます。

### 4-1. GitHub
[修正内容](https://github.com/KoheiShingaiHQ/react-with-polymer-layout/commit/a6680856806e52b968678f439fb6198b2106459b)

### 4-2. スクリーンショット
#### 4-2-1. Featured ページ : /
![root-screen-shot](https://c1.staticflickr.com/5/4504/37059647914_0af138d79c_h.jpg)

#### 4-2-2. About ページ : /about
![about-screen-shot](https://c1.staticflickr.com/5/4479/37720301086_331f241e0a_h.jpg)

#### 4-2-3. Article ページ : /article
![article-screen-shot](https://c1.staticflickr.com/5/4499/37720301126_c8f9e3ed67_k.jpg)
Cmder(ConEmu)からUbuntuのシェルを開く(Windows 10 Fall Creators UpdateからのストアのUbuntu)

Windows 10 Fall Creators Updateを適用すると、Bash on Ubuntu on WindowsだけではなくUbuntuを起動できるようになります。
以前までは、
`C:\Windows\System32\bash.exe ~ -cur_console:p`
で、Cmder内でbashを起動できましたが、Ubuntuの場合少々異なります。
MicrosoftストアからUbuntuをダウンロードし起動すると、タスクマネージャからはwsl.exeとubuntu.exeが立ち上がります。
ubuntu.exeを直接実行するとエラーが出るため、wsl.exeからUbuntuが起動できないか試みます。
Ubuntuを立ち上げたwsl.exeをよーく見ると、引数に何やらGUIDと~が渡されていることに気づきます。
レジストリから、このGUIDを検索すると以下がヒットします。
`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\`
ここを参照すると、以前までの環境と新しいUbuntuの環境のエントリが登録されています。
以前までの環境は私の場合`{12345678-1234-5678-0123-456789abcdef}`でした。
そしてUbuntuの新環境は、`{256f0c43-57e1-4acf-b9c4-e1516b4b226b}`になります。
新環境のGUIDと~をwsl.exeのオプションに加えて起動すると、新しい環境のUbuntuが起動します。
多分"~"のチルダはどこのディレクトリでシェルを起動するか設定するオプションだと思います。
そのため、Cmderには、私の環境では
`C:\Windows\System32\wsl.exe {256f0c43-57e1-4acf-b9c4-e1516b4b226b} ~ -cur_console:p`
を追加すると、ストアのUbuntuをCmderから起動することが可能になります。
GUIDは人によって異なる可能性があるのでレジストリを参照してください。
タイの服喪仕様サイトのgrayscale設定を自分の環境でだけリセットするbookmarklet

来週、国民の父ことプミポン前国王の火葬があるため、タイ国内のWebサイトはこぞって服喪仕様にデザイン変更されています。派手な色使いをやめて、ほぼ白黒のWebサイトに。

これ、もちろんサイトのパーツを全て書き換えたわけではなく、css3にある「filter」プロパティで設定できる「grayscale」をいじって実現しています。一部これで白黒にならないところとかブラウザもあるらしいので、派手すぎるヘッダなんかは直接いじっているときもあるらしいのですが、まあcss3ができるまで国王お元気でよかったですねとしか言えない便利なcss hackです。

とはいうものの、これで白黒化されたサイトはやっぱり微妙に見にくいのです。国民の父とか書きましたが私は現在タイ国外におりますので情報は元の色で見たい。昨年プミポン国王(当時)が逝去されたときも同じようなことがありましたが、今回は完全な白黒ではなくうすーく色がついております。これに対応するためのjavascript bookmarkletを以下に公開します。

```javascript
javascript:
  var el = document.querySelectorAll('*');
  Object.keys(el).forEach(function(i) {
    var s = window.getComputedStyle(el[i], null).getPropertyValue("filter");
    if (s.indexOf('grayscale')>=0) {el[i].style.filter = 'grayscale(0)'; }
  });
```
これを適当なブックマークを編集してコピペしていただくか[^1]、
[カラー化](javascript: var el = document.querySelectorAll('*'); Object.keys(el).forEach(function(i) { var s = window.getComputedStyle(el[i], null).getPropertyValue("filter"); if (s.indexOf('grayscale')>=0) {el[i].style.filter = 'grayscale(0)'; } })
このリンクを適当にブックマークバーとかにD&Dすれば使えるはずです[^2]。

いちおう、PC上のchromeとiPhone上のsafariで動作確認しています。

蛇足ながら何をしているのか補足しますと、まずquerySelectorAllで文書内全ての要素を手に入れまして、その全ての要素1つずつについて、getComputedStyleでレンダリング後のcssの状態を調べております。実際にはfilter要素の指定はベンダープレフィックス込みで行われることが多いので、css3だけで検索してもうまくいかないことがあるようです。[^3]
で、filter要素の中身はStringで返ってきます。本当はgrayscaleの数字だけいじりたかったのですがこの数字だけをStringのParse以外で手に入れる方法を見つけられませんでした。今回は「自分の環境でだけ」という割り切りがありますので、indexOfでfilter要素の中身を調べて、grayscaleって文字が入っていたら強制的に白黒表示解除しています。強制的つうのがミソで、もし他のフィルターがかかってたらそれも解除されるかもしれませんが正直filter要素がどこまで使われているのかわからないのであんまり気にしていません。あとfilter要素そのものを空文字列にしてもgrayscale変化しなかった[^4]ので他のfilter要素には影響ないような気がします。
懸念点がなくはなくて、cssのプロパティはcase insensitive(大文字小文字を区別しない)なので、もしかしたらブラウザによってはプロパティが全て大文字で返ってくるかもしれません。[^5] その場合はここを大文字小文字関係なく調べるように変えたらいいと思います。

なお、このbookmarkletの作成にあたっては、<a href="https://iwb.jp/thailand-grayscale-color-revert/">タイ国王死去で黒白表示になっているサイトをカラーに戻す方法</a>を参考にしました。感謝します。

[^1]: ブックマークにコピペする前に、改行は削除したほうがいいかもしれません
[^2]: でも、私の環境ではうまくD&Dできませんでした。いちおう残してはおきます
[^3]: と、断言できるほど調べてはいません
[^4]: chrome 61.0.3163.100で確認しました。
[^5]: そんなブラウザ今はたぶんないと思うのですが、今後はわかりません
Windows > 共有フォルダへのアクセス > .administator と .USERNAME

```txt:動作環境
Windows 7 Pro (32bit)
```

共有フォルダへのアクセスに関して以下のユーザ名ならアクセスできる状況があると聞いた。

- .administrator
- .USERNAME
    - USERNAME: 登録ユーザ

関連しそうな情報として以下を見つけた。
[How to fix “the trust relationship between this workstation and the primary domain failed”](https://itsupportconsulting.com/how-to-fix-the-trust-relationship-between-this-workstation-and-the-primary-domain-failed/)

> If you’ve restored or “rolled back” a PC running Windows 7, Windows 8, or Vista then you may have run into this error message  “the trust relationship between this workstation and the primary domain failed”.

> In order to fix this the first thing you need to do is login with a local account as opposed to a domain account.  The reason for this is simple, the server no longer trusts you so you can’t authenticate any domain users.

「ドット + アカウント名」指定がローカルアカウントでのログインということらしい。

通常の運用では使わない方法とは思う。

アカウント関連の情報は見つけにくい。

### 関連

[Windowsログイン > administrator | ドメイン\ユーザ名 | ユーザ名@ドメイン | .\ (PC名の自動選択)](https://qiita.com/7of9/items/ef6c6dc3b464a913adb3)
Ansibleでssh-agentが働いてない時は

※CentOS 7.x → CentOS 7.x のsshを想定しています。

SSHエージェント転送を有効にして、手元の秘密鍵をログイン先でも使いたい場合がある。

具体的にはWebアプリケーションの展開先のサーバにsshでつないで、githubやvisualsutio.comのようなprivateなgitリポジトリからソースコードをcloneしたい時など。

もっというと、僕の場合はこれをAnsibleのplaybookで実行してアプリケーションをデプロイしたいとき。

今回その秘密鍵の転送がうまくいかなかったので、確認方法と解決策を記載する。

確認方法：
```
$ ssh-add -l
```
上記コマンドで、手元の秘密鍵のリストが表示できるか。
sshエージェントが働かない時は、上記のコマンドを打っても以下の様なエラーになる。

```
$ ssh-add -l
Could not open a connection to your authentication agent.
```

この状態の場合、以下のコマンドでエージェントを起動する。[参考](http://tech.clickyourstyle.com/articles/105)

```
$ ssh-add -l
Could not open a connection to your authentication agent.
$ eval "$(ssh-agent)"
Agent pid 52616
```

その状態でssh-addで秘密鍵をエージェントに追加し、

```
$ ssh-add -l
Could not open a connection to your authentication agent.
$ eval "$(ssh-agent)"
Agent pid 52616
$ ssh-add
Identity added: /home/***/.ssh/id_rsa (/home/***/.ssh/id_rsa)
$ ssh-add -l
2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /home/***/.ssh/id_rsa (RSA)
```

-A オプションをつけてsshすると接続先でも利用できるようになる。

```
$ ssh-add -l
Could not open a connection to your authentication agent.
$ eval "$(ssh-agent)"
Agent pid 52616
$ ssh-add
Identity added: /home/***/.ssh/id_rsa (/home/***/.ssh/id_rsa)
$ ssh-add -l
2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx /home/***/.ssh/id_rsa (RSA)
$ ssh -A user@yyy.yyy.yyy.yyy
Last login: Wed Oct 18 07:51:13 2017 from xxx.xxx.xxx.xxx
[user@server~]$ ssh-add -l
2048 fb:53:c1:75:1b:4d:53:d0:54:c0:1f:43:10:a5:51:c0 /home/***/.ssh/id_rsa (RSA) # 同じ秘密鍵を参照できた
```

※sshにログインするたびに上記コマンドが必要なので、~/.bashrcに書いておくとよさそう。

Ansibleでプライベートリポジトリからcloneするplaybookを実行するときは、まず、カレントディレクトリに以下のファイルを保存する。

```ansible.cfg
[ssh_connection]
ssh_args = -o ForwardAgent=yes
```

その後、Ansibleの実行前にSSHエージェントを起動して実行する。

```
$ eval "$(ssh-agent)"
Agent pid 52616
$ ansible-playbook -i hosts play.yml # （gitをインストールしてcloneするplaybook）
```

これでも動かない時は、本記事の範囲外だがgit cloneのtaskでbecome:noになってるか、リポジトリがAnsibleホストのknown_hostsに登録されているかどうかも要確認。

参考文献：
ssh-addに失敗する場合の対処:Could not open a connection to your authentication agent.:Technical tips:Media hub 
http://tech.clickyourstyle.com/articles/105
Connect to your Git repos with SSH | Microsoft Docs 
https://docs.microsoft.com/ja-jp/vsts/git/use-ssh-keys-to-authenticate
Ansible で git clone させる by @seizans on @Qiita https://qiita.com/seizans/items/f5f052aec1592c47767f
Swift4でJSONをパースする


文字列を、JSONオブジェクト(配列とディクショナリの組み合わせ)に変換します。

```swift
import Foundation

let str = """
    [{"name":"John","age":37},{"name":"Tim"}]
    """

struct ParseError: Error {}
func parse(json: String) throws {
    guard let data = json.data(using: .utf8) else {
         throw ParseError()
     }
    let json = try JSONSerialization.jsonObject(with: data)
    guard let rows = json as? [[String:Any]] else {
        throw ParseError()
    }
    for row in rows {
        let name = row["name"] ?? ""
        let age = row["age"] ?? 0
        print("\(name) is \(age)")
    }
}

do {
    try parse(json: str)
} catch {
    print("error")
}
```

参考: https://developer.apple.com/swift/blog/?id=37
Powershell で時刻同期無効

## 手順
1. Powershell を管理者権限で起動する
2. 以下のコマンドを実行

```
PS > Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters -Name Type -Value NoSync
```

## 説明
レジストリを書き換えています。

お疲れ様でした。
PHPをソースからインストールした環境に後からモジュールを追加する方法

Linux系サーバ上でWebのシステムをPHPを使って構築する場合
Webサーバ(Apacheなど) + PHP + DB(MySQLなど)という
環境で作るのが一般的だと思います。

その際、PHPモジュールをインストールするには
[yum](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230999/)、[rpm](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230875/?ST=oss)、[apt-get](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230709/") のようなパッケージインストールの
コマンドを使用して行う方法とソースファイルから自前でコンパイルして
インストールを行うという２つの方法があります。

どちらでインストールしても、基本的には差異はないのですが
共にメリットとデメリットがあります。

| 方法 | メリット | デメリット |
|:------------|:-----------------------------------|:-------------------|
| コマンド使用 | インストールが容易<br>環境に依存する  | カスタマイズが大変   |
| 手動        | カスタマイズが用意<br>環境に依存しない | インストールが難しい | 

このうち、カスタマイズ性ですが、コマンドで行った場合は
PHPパッケージ内の拡張モジュールも含め、全てのものが対象となり
不要なものまでインストールされてしまいます。

手動で行った場合は、PHPモジュールのコンパイル時に
必要なオプションを指定することができるため
**<font color="Red">必要最低限のものだけ</font>**インストールすることができます。
　参考：[指定可能なオプション(一部)](http://php.net/manual/ja/configure.about.php)

しかし　必要最低限のものだけ　であるために
後から機能を追加/変更するとなった場合には
その機能をPHPに新たに組み込む必要がでてきます。
　※DBをMySQL⇒PostgressSQLに変えたい
　　SSH(https://～)対応したいなどなど

新たに追加するには、再コンパイルを行い
拡張モジュールを追加したPHPモジュールを
作り直さなければなりません。

PHPを作り直すことになるため、機能追加により
モジュールがうまく生成できない又は壊れてしまう
というリスクが発生します。

そういった再コンパイルをせずにPHP機能追加を
行うのに便利なのが[phpize](http://www.weblio.jp/content/phpize)というコマンドです。

これは**<font color="Red">PHPを再コンパイルすることなく</font>**
拡張モジュールだけを作成できるコマンドです。

なので
　1. phpizeで拡張
　2. PHPの設定ファイル変更
　3. Webサーバ再起動で設定反映
をするだけで機能追加を行うことができます。

## やり方
PHPにcurl.soという拡張モジュール追加を例として説明します。
注)パスはそれぞれの環境に読み替えてください

1. PHPソースファイルにある extension フォルダの
   配下にある curl フォルダに移動

    ```console
    $ cd /usr/local/src/php/extension/curl
    ```
2. phpize コマンドを実行し、configureファイルを作成

    ```console
    $ phpize
    ```
3. configureを実行し、Makeファイルを作成

    ```console
    $ ./configure --with-curl
    ```
4. Makeを実行し、モジュール作成

    ```console
    $ make
    ```
5. 作成したモジュールをインストール

    ```console
    $ make install
    ```

    これで curl.so が作成完了です。
    作成後のファイルの場所はphp-configコマンドの
    extension_dirの設定箇所に依存します。

    ```console
    $ /usr/local/php/lib/extensions/no-debug-non-zts-20100525
    ```
    php-configの内容を変更していなければ
    上記のようなパスに設置されます。
    ※ extensions以下のフォルダ名は環境により変わります
<br>
6. 作成したモジュールを読み込むため、php.iniを編集
   php.ini ファイル内の Dynamic Extenshions のあたりに

    ```ini:php.ini
    ;;;;;;;;;;;;;;;;;;;;;;
    ; Dynamic Extensions :
    ;;;;;;;;;;;;;;;;;;;;;;
    　・
    　・
    ;extension=php_xsl.dll

    extension=curl.so　★
    　・
    　・
    ```
    ★の行を追加します。
<br>
7. Webサーバ(Apache)を再起動

    ```console
    $ service httpd restart
    ```
    又は

    ```console
    $ apachectrl restart
    ```
    ※環境により、apache2ctrlの場合もあります

    又は

    ```console
    $ /etc/rc.d/init.d/httpd restart
    ```
    ※Apache を自前でインストールした場合はこのような方法になるかと思います。
      　ただし、OS/Apacheのバージョンによっては上記コマンドが使えない場合があります。

## まとめ
手動でPHPをインストールした後、機能追加を行う際
phpize コマンドを使用することで再作成のリスクを負うことなく
PHPの拡張を行うことができます。

PHPでWebシステムを作る人は知っておくと便利なコマンドの１つかもしれません。
RailsでRakeタスクをcontrollerから呼び出す時の覚書

RailsでRakeタスクをcontrollerから呼び出す時の覚書

```rb:メドッドに以下を追加
require 'rake'
Rails.application.load_tasks
Rake::Task['タスク名'].execute

# clearをしないと次のリクエスト時にload_tasksでタスクが再度読み込まれ、execute内で２回実行されてしまう。
# さらにリクエストがあると３、４とどんどん増えるていく罠
Rake::Task['タスク名'].clear
```

clearしておかないと多重実行されるという罠にハマるので覚書で記述します。
 意外と忘れて久しぶりに罠にまた引っかかるという・・・

なんでtaskをcontrollerから実行されているのというと
task作ったが非エンジニアから画面から実行したいとか、わざわざエンジニアがコンソール叩くのめんどくさくなったので


注)
この方法は、その場しのぎですので
本来はクラスに切り出して、taskでもcontrollerからでも両方から呼べるようにするべきです。
いつも忘れるMacのDNSキャッシュを削除するやつ

詳細は[OS X で DNS キャッシュをリセットする](https://support.apple.com/ja-jp/HT202516)を参照。

## OS X Yosemite 以降
`sudo killall -HUP mDNSResponder`

ヨセミテ以前とかいつのOSだよ感あるがいつも忘れる。
`alias`で解決するにもしょっちゅう行うわけじゃないので結局忘れるという根本問題をどうにかしたい。
C++ Builder XE4, 10.2 Tokyo > TMemo > Error: nilをTMemoStringsに代入することはできません。

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9d9d0878-d99d-55d9-78cc-5de2b7a82bd2.png)

発生条件は以下のような処理だった。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TStringList *list = NULL;

	Memo1->Lines->Assign(list);
}
//---------------------------------------------------------------------------
```

本来はlistにポインタの値が割当てられるように実装していたが、プロジェクトの構成を見直した時に一旦NULLを入れるようにした。
その時点でエラーが出た。

Assignなどの割当て処理は本来try, catchできちんと処理して、おかしな実装の場合は開発者向けメッセージとして表示するようにした方がいい。