OmniAICreator/Qiita-1.07M huggingface dataset:
【小ネタ】Swift で Objective-C 側用の API を指定する仕方

例えば Swift でこの様なものを定義したとします：

```swift:SomeClass.swift
class SomeClass: NSObject {
    
    var id: String?
    
    func updateID(from dictionary: [String: String]) {
        // self.id = ...
    }
    
}
```

これらは Swift で呼び出す場合は `someClass.id` や `someClass.updateID(from: someDictionary)` で呼び出せるので何も困ることはないです。

ところが Obj-C がまだ混在しているプロジェクトの場合、これらはそのまま Obj-C で呼び出すと：

```objc:SomeSource.m
someClass.id;
[someClass updateIDFrom: someDictionary];
```

になります。

まあビルドするぶんには何も問題ないが、ちょっとした細かい問題点があります：
1. Obj-C では `id` は `AnyObject` のようなもので、Xcode では `.id` は予約語のシンタックスハイライトになっているだけでなく、cmd 押しながらプロパティークリックしても定義とかに飛べないので気持ち悪い
2. Obj-C の API Design Guideline としては引数ラベルで引数名を入れるのが筋です

なので、気持ちとしては Obj-C で呼び出す時は下記のように呼び出したいかもしれない：

```objc:SomeSource.m
someClass.ID;
[someClass updateIDFromDictionary: someDictionary];
```

これはどうすればいいのかというと、@kishikawakatsumi 先生に教えられて、`@objc([ALT_NAME])` のアトリビュートが付けられるそうです
<img width="817" alt="スクリーンショット 2017-11-22 17.46.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/63998/af40199b-e8d1-922f-acf4-fbe4b0ccb74d.png">

というわけで、Swift で下記のように定義してみます：

```swift:SomeClass.swift
class SomeClass: NSObject {
    
    @objc(ID) var id: String?
    
    @objc(updateIDFromDictionary:) func updateID(from dictionary: [String: String]) {
        // self.id = ...
    }
    
}
```

これで、無事 Obj-C で下記のように呼び出せます：

```objc:SomeSource.m
someClass.ID;
[someClass updateIDFromDictionary: someDictionary];
```

それでは、まだ Obj-C 時代の負債と戦いながら Swift 化進めてる皆さん、一緒に楽しく（）頑張りましょうｽﾞｲ₍₍(ง˘ω˘)ว⁾⁾ｽﾞｲ
詳細ガイドVultrクラウドホスティングのWordPressウェブサイトをホストする

WordPressは、ウェブサイトを作成するために最もよく使用されるコンテンツ管理システムです。 WordPressをCMSとして選択する場合は、適切なホスティングを見つけることから始めなければなりません。これは必須の第一歩です。あなたがウェブホストを見つけると、をインストールし、設定を調整し、あなたのウェブサイトの内容を編集することができます。

あなたの宿泊施設を選ぶには？ WordPressサイト（共有サーバー、専用、VPS、または専門のWordPressホスティング）には多数のソリューションとホスティングオファーがあります。あなたがその専門家ではないときに失われるのは簡単です。より具体的には、Vultrクラウドサーバに [WordPress hosting on Vultr](https://www.cloudways.com/blog/wordpress-on-vultr-cloud) ホスティングを紹介することから始めます。

Vultrが近年市場に参入して以来、[WordPress on cloud ](https://www.cloudways.com/en/wordpress-cloud-hosting.php)のクラウ​​ドホスティングが増加しています。 Vultrのホスティングでは、クラウドサーバーへの完全なアクセス権があり、必要に応じて設定し、必要なテーマやプラグインをインストールし、サイトのトラフィックが増加した場合には非常に柔軟に負荷をかけることができます。

しかし、VultrでのWordPressのホスティングは、Cloudwaysのような管理されたクラウドホスティングソリューションを利用しない場合には重要です。それは基本的に "あなたがモデルに行くときに支払う"という意味です。つまり、あなたが消費するリソースの価格を支払うだけで済むようになります。さらに、Vultrサーバーのワンクリックによる起動を提供し、また、すべてのテクニカルおよびサーバー側の問題を処理します
人工知能について調べたことに書いてみたメモ

#始めて投稿する実験用のページ
じっけん

パーセプトロン
![パーセプトロン.png](https://qiita-image-store.s3.amazonaws.com/0/215704/cf464d39-ef38-4ae9-d5c7-d36389ebe3b0.png)
Objective-C 年月日時分からNSDateを初期化

テストデータ作成時によく使いそうなので残しておく

```objc:Objective-C
- (NSDate*)createDate:(int)year :(int)month :(int)day :(int)hour :(int)min
{
    NSDateComponents *com = [[NSDateComponents alloc] init];
    [com setYear:year];
    [com setMonth:month];
    [com setDay:day];
    [com setHour:hour];
    [com setMinute:min];
    NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    return [calender dateFromComponents:com];
}
```

呼び出し元

```objc:Objective-C
NSDate *date = [self createDate:2017 :4 :1 :12 :15];
NSLog(@"%@", date);
```

ログ

```objc:Log
Sat Apr  1 12:15:00 2017
```

端末の設定で、
使用言語を「日本語」→「English(U.S.)」に変更しても、
同じ結果が出力されたので問題はなさそう。
【メモ】middleman4xのlivereload

ブラウザにアドオンを追加する。
僕がFirefox Quantum に追加したのは
LiveReload 2.1.0 by Todd Wolfson

https://github.com/twolfson/livereload-extensions
![スクリーンショット 2017-11-22 17.25.20.png](https://qiita-image-store.s3.amazonaws.com/0/126335/625ae977-36f8-bf86-d5be-43461120f153.png)



```javascript:gulpfile.js
var gulp = require('gulp');
var webserver  = require('gulp-webserver');
gulp.task('liveReload', function(){
  gulp.src('source')
    .pipe(webserver({
      livereload: true
  }));
});
gulp.task('default', ['liveReload']);
```

あとはターミナルでgulpを起動させるだけ。

ただmiddleman3xのlivereloadと比べるとめちゃくちゃ遅いｗ
海外出身のエンジニアに海外の良さそうな学習教材を聞いた

# 概要

英語でプログラミング学べば、英語とプログラミング同時に学べるのではと思って知り合いのトリリンガルなエンジニアに聞いて教えてもらった海外教材まとめます。本人にも許可もらったよー

# まとめ

## フロントエンド中心
フロントエンジニアになるため必要な知識を色々まとめている
https://frontendmasters.gitbooks.io/front-end-handbook-2017/
:label:ネットワーク/環境構築/デザイン/DevOps/HTML・CSS

定番中の定番w3school
https://www.w3schools.com/
:label:HTML・CSS/AngularJS/jQuery/フロント中心

オープンソースベースのプログラミング無料学習サービス
ブラウザ内で完結した教材なので、とっかかりやすさ半端ない印象
https://www.freecodecamp.org/
:label:HTML・CSS/React.js/jQuery/DB/Github/環境構築

## サーバーサイド中心 

グーグルさんが学生向けに作ったガイド
https://techdevguide.withgoogle.com/

IBMのcognitive class, ビッグデータ関連の無料コースがある、無料だけど内容しっかりしている
https://cognitiveclass.ai/

英語版のQiitaな感じ、C#と.NETのリソースがすごく豊富らしい
https://www.codeproject.com/

# 以上です

他に何か知ってれば、コメントでみなさん教えてくださいお願いします
健康診断に例えるデッドロックのアルゴリズム

デッドロックが起きる原理を健康診断に例えてみます。

健康診断をするにあたり、二つのタスクが存在します。
採血とＸ線を受けることで健康診断が完了します。

#①占有順序が同じパターン#
A君とB君は採血を受けてからＸ線を受けることになっています。

A君が先に採血を始めたとして、
採血室を占有しているので、B君は待機しています。

|    採血室    |    Ｘ線室   |
|:-----------:|:-----------:|
|      **A**  |   　        |

**B** ←待機中
　　
　　

さて、A君は採血を終えました。
次はA君はX線室へ移ります。

そこで採血室が空いたのでB君の待機状態が解けて
B君は採血室へと移りました。

|    採血室    |    Ｘ線室   |
|:-----------:|:-----------:|
|           　|   **A**     |
**B** ←解放！

|    採血室    |    Ｘ線室   |
|:-----------:|:-----------:|
|    **B**　　|   **A**     |

　　
　　

次にA君のＸ線検査が時間がかかってしまい
B君の方が先に採血が終わったとしても
いつかはA君のＸ線検査は終わるので
B君の待機状態は解けて
結果、無事にお互い健康診断を終えることができます。

|    採血室           |    Ｘ線室   |
|:------------------:|:-----------:|
|    **B** ←待機中　　|   **A**     |

|    採血室           |    Ｘ線室   |
|:------------------:|:-----------:|
|    **B** ←解放！  　|             |


|    採血室     |    Ｘ線室   |
|:-------------:|:----------:|
|    　　　　　　|    **B**   |

　　
これは採血室にB君が先に入っていたとしても
同様のことが言えますね。

#②占有順序が異なるパターン#
さて、今度はA君とB君が採血とＸ線検査を
受ける順番が決まっていません。

A君は先に採血を始めましたが
B君は先にＸ線検査を始めました。

|    採血室    |    Ｘ線室   |
|:-----------:|:-----------:|
|      **A**  |  **B**      |

　　
　　

A君は採血を終えたので隣のＸ線室へ入ろうとします。
しかし、どうやら中には誰かが入っているようなので
中の人が出てくるまで待機を始めます。


|    採血室           |    Ｘ線室   |
|:------------------:|:-----------:|
|    **A** ←待機中　　|   **B**     |

　　
　　


B君もＸ線室内ではX線検査を終えました。
しかしB君も採血室に入ろうとするも
誰かが入っている為、待機を始めます。


|    採血室           |    Ｘ線室           |
|:------------------:|:-------------------:|
|    **A** ←待機中　　|   **B** ←待機中     |

　　
　　

この状態ではお互いがいつまで待ち続けても
どちらの部屋も空くことはありません。
**これがデッドロックです。**

　　
こうして二人はいつまでも健康診断を終えることが
出来なくなってしまいました。
めでたしめでたし。（？）
JP1/AJSの情報をslackのhubotから参照したい話

# はじめに

JP1/AJSを利用してバッチの管理をしてますが、サーバがWindowsで不便なのでslackでジョブの情報を参照したりできたら便利？と思って作ってみました。

# WindowsサーバにApache＋PHPをインストール

普通にXAMPPでインストールして、Apache起動

# ジョブ情報を返すAPIを作る

ジョブの情報を他のLinuxサーバから取得できればなんでもできるので、
先ほどのapache上にAPIを作りました。

```php:ajsprint.php
if(isset($_GET['format']) && $_GET['format']!="") {
    $param = $_GET['format'];
} else {
    $param = 'JN,cm,sc,pm,Ed,ud,fd';
}

$format_list = explode(",", $param);

$tmp = array();
foreach ($format_list as $key => $val) {
    // ajsprintコマンドのフォーマットは半角英字のみ
    if(! preg_match("/[A-z][A-z]/", $val)) {
            die("parameter error");
    }
    $tmp[] = "%".$val;
}
$format = implode("|", $tmp);

// ajsprintコマンドを実行する
$ret = `ajsprint -F AJSROOT1 -f "{$format}" -R  (ジョブのルートの名前)`;

$list = explode("\n", $ret);
$json_array = array();
foreach ( $list as $key => $val ) {
    $tmp = explode("|", $val);
    if(count($tmp) !== count($format_list)){
        continue;
    }
    $row = array();
    for($i = 0; $i < count($format_list) ; $i++) {
        // WindowsサーバなのでSJISからUTF8に文字コードを変換
        $row[$format_list[$i]] = mb_convert_encoding($tmp[$i], "UTF-8", "SJIS");
    }
    $json_array[] = $row;
}
echo json_encode($json_array);
```

実行してみる

```json:
[
  {
    "JN": "/テスト/テストジョブネット/テストジョブ",
    "cm": "",
    "sc": "",
    "pm": "",
    "Ed": "2017/04/14 18:02:20",
    "ud": "2017/04/14 18:02:20",
    "fd": ""
  }
]
```
# ajsprintのフォーマット指示子

詳しくはこの辺に書いてあります。
http://itdoc.hitachi.co.jp/manuals/3020/30203K2543/AJSO0064.HTM#ID00130

よく使いそうなのを抜粋。

| フォーマット指示子    |出力情報|
|:-----------------|:-----------------|
|%JN| ジョブネットワーク要素の完全名|
|%cm| コメント|
|%sc| スクリプトファイル名|
|%pm| パラメーター|
|%Ed| 作成日時|
|%ud| 最終更新日時|
|%fd| 終了遅延（分）|
|%TY| ジョブネットワーク要素の種別|
|%rg| 保存世代数|
|%ms| スケジューリング方式 skip：スケジュールスキップ方式 multi：多重スケジュール方式|
|%mp| 多重起動属性 yes：許可する no：許可しない。|
|%rh| 実行ホスト名|
|%jd| 終了判定 normal：常に正常 abnorm：常に異常 code：終了コード exist：ファイルが作成されている場合，正常 modify：ファイルが更新されている場合，正常|
|%wt| 警告終了しきい値 |
|%Th| 異常終了しきい値|
|%FC| 監視条件 c：ファイルの作成を監視する。|
|%FF| 監視対象ファイル名|
|%Ud| 配下ユニットを含めた最終更新日時|

# hubotから参照する

ここまでできればhubot経由でcurlしたり、データをDBに一時的に入れといて参照するだけ
GitLab10×LDAP Integration on CentOS7

#概要

社内のGitlabが古いので最新のGitLabEnterpriseEditionを検証しました
LDAP連携で手こずったところがあるので共有します

GitLabは現時点最新のVer10
LDAPはAWS Directory Service の SimpleAD
OSはCentOS7

#インストール
一応インストール方法載せておきます
OSの設定などは省きます

```
# sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ee
```


#コンフィグ
動いた例をそのまま記載。設定不要な箇所はあるはずなのでそこは注意して下さい。

```
# vim /etc/gitlab/gitlab.rb
 
gitlab_rails['ldap_enabled'] = true　※有効にする
###! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-EOS
  main:
    label: 'LDAP'　　※デフォルト
    host: 10.0.0.209　※SimpleADでいうとDNSアドレスの値です
    port: 389　　※デフォルト
    uid: 'sAMAccountName'　　※デフォルト
    bind_dn: 'CN=Administrator,CN=Users,DC=hoge,DC=fuga,DC=net'　※AD接続ユーザdistinguishedName。とりあえずAD上のAdministoratorにした
    password: 'passsword_hoge' ※AD上のAdministoratorのパスワード
    encryption: 'plain' # "start_tls" or "simple_tls" or "plain"　※デフォルト
    verify_certificates: true　※デフォルト
    ca_file: ''　※デフォルト
    ssl_version: ''　※デフォルト
    active_directory: true　※有効にする
    allow_username_or_email_login: true　※デフォルト
    block_auto_created_users: false　※デフォルト
    base: 'DC=hoge,DC=fuga,DC=net'　※ユーザ検索ルート。不要らしいが一応設定した
    user_filter: ''　※デフォルト
#    attributes:
#      username: ['uid', 'userid', 'sAMAccountName']
#      email:    ['mail', 'email', 'userPrincipalName']
#      name:       'cn'
#      first_name: 'givenName'
##      last_name:  'sn'
    ## EE only
    group_base: ''　※デフォルト
    admin_group: ''　※デフォルト
    sync_ssh_keys: false　※デフォルト


#   secondary: # 'secondary' is the GitLab 'provider ID' of second LDAP server
#     label: 'LDAP'
#     host: '_your_ldap_server'
#     port: 389
#     uid: 'sAMAccountName'
#     bind_dn: '_the_full_dn_of_the_user_you_will_bind_with'
#     password: '_the_password_of_the_bind_user'
#     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
#     verify_certificates: true
#     ca_file: ''
#     ssl_version: ''
#     active_directory: true
#     allow_username_or_email_login: false
#     block_auto_created_users: false
#     base: ''
#     user_filter: ''
#     attributes:
#       username: ['uid', 'userid', 'sAMAccountName']
#       email:    ['mail', 'email', 'userPrincipalName']
#       name:       'cn'
#       first_name: 'givenName'
#       last_name:  'sn'
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
EOS
```

#設定を有効

```
# gitlab-ctl reconfigure
```

###注意
ここが躓いたところ。いくら

```
# gitlab-ctl restart
```
を実行したところで有効にならなかった。やはり公式のマニュアルを確認するのが一番ですね~

公式マニュアルLDAP連携
https://docs.gitlab.com/omnibus/settings/ldap.html#setting-up-ldap-sign-in

###成功した場合のログイン画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/53408217-f2a2-c042-ef89-6b34d40c0193.png)
VMware仮想Linuxマシンとのクリップボード共有ができなくなった場合の対処

WindowsホストとUbuntu16.04仮想マシンとの間でのクリップボード共有が、ある日突然使えなくなったので対処方法を調べた。

コンソールで以下のコマンドを入力することで問題が解決された。

```bash
vmware-user
```

ただオプションが --help も何もないので、詳細が不明……vmware-toolsのなんかだとは思うのだけど……
Apple Mach-O Linker (ld) Error の詳細

# Apple Mach-O Linker (ld) Error の詳細
Xcodeを使っていて以下のリンカーに関するエラーが出たとき、
`Apple Mach-O Linker (ld) Error`
`Linker command failed with exit code 1 (use -v to see invocation)`
<img width="250" alt="Screen Shot 2017-11-22 at 16.31.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/141797/703c53ea-7b78-18ac-2fd7-4649c3635991.png">

もっと詳しい情報を見るにはReport Navigatorを開く。
<img width="247" alt="Screen Shot 2017-11-22 at 16.19.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/141797/a3e48e06-4d2d-5fcb-c297-5e8bcd6747c2.png">

確認したい時刻のBuildを選択すると右に詳細が出てくるので、
<img width="227" alt="Screen Shot 2017-11-22 at 16.38.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/141797/76c7d2e9-bf45-f50b-c753-21231f93515e.png">

さらに確認したいエラー部分の横棒が並んでるマークを押すと、詳しいエラー内容がみれる。
<img width="79" alt="Screen Shot 2017-11-22 at 16.20.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/141797/4d644a9e-4e36-010c-2fea-768508b04063.png">

# 例) duplicate symbols for architecture x86_64
「duplicate symbols for architecture x86_64」だった場合の解決例。
<img width="647" alt="Screen Shot 2017-11-22 at 16.20.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/141797/aea18597-adc6-ecb5-d4b3-3d008f942f21.png">

これの原因は様々だが、一例としては、ヘッダーファイルにグローバルな関数を書いている場合がある。
例えば

```c++:hello.h
void hello(string s){
  std::cout << s << std::endl;
}
```
と書いている場合、上のコードを.cpp内に移行することで解決する。
.h内でもその関数を使っている場合、

```c++:hello.h
void hello(string s);
```

```c++:hello.cpp
void hello(string s){
  std::cout << s << std::endl;
}
```
とすれば良い。
Rails(unicorn)稼働サーバーの監視

Railsをunicornで稼働しているサーバーのメトリクス取得に、[mackerel-plugin-unicorn](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-unicorn)が役立つので紹介します。

# 取得できるメトリクス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8057/dd31756c-679d-af23-adc3-a9b8a6fca5f5.png)

* Unicorn Memory
* Unicorn Workers

のメトリクスが取れるようになります。

# Unicorn Workers
Unicorn Workersの方では、Idle Workers, Busy Workersの数が見えます。
このメトリクスが見れることを知って、Rails(Unicorn)を稼働させているサーバー全部にこのプラグインを入れました。

以前にRailsアプリケーションでWorkerが全てbusyの状態だったことでアプリケーションのパフォーマンスが落ちてしまったことがあります。Workerが全てbusyになるとworker待ちになっているリクエストで処理が重くなっているように見えるけど、本当に問題が起きているのはWorkerを占有している別の処理なので、原因が掴めず問題が長引いてしまった経験があります。

* Aの処理が重いと問い合わせがくる
* ログ見ると確かに重い
* 手元で動かすと再現しない
* 困る

という感じです。
開発環境で動かして調査するだけじゃ分からないタイプの障害ですね。

# 設定
プラグインのreadmeに書いてある通りですが

```ini
[plugin.metrics.unicorn]
command = "/usr/bin/mackerel-plugin-unicorn -pidfile=/home/app/rails/service/current/tmp/pids/unicorn.pid"
```

という感じで取れるようになります。

## 一つのサーバーで複数のRailsアプリケーションが稼働している場合
mackerel-plugin-unicornは、-metric-key-prefixに対応しているので一つのサーバーで複数のUnicornが起動している場合でも大丈夫です。

```ini
[plugin.metrics.unicorn_hoge]
command = "/usr/bin/mackerel-plugin-unicorn -pidfile=/home/app/rails/service1/current/tmp/pids/unicorn.pid -metric-key-prefix=hoge"

[plugin.metrics.unicorn_fuga]
command = "/usr/bin/mackerel-plugin-unicorn -pidfile=/home/app/rails/service2/current/tmp/pids/unicorn.pid -metric-key-prefix=fuga"
```

というふうにしてあげると、それぞれのメトリクスが別のグラフにとられるようになります。

実際にうちで取得しているのが以下のグラフです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8057/3afa2136-c8c0-868e-314c-21f75b36596e.png)
一つのホストに複数のUnicornの情報が表示されるようになります。
Unity C# BigIntegerメモ

```
int costTapItemLvCoefficient
int exponentiatio
```
```
// NG
returnBigInt =　new BigInteger( ( ((costTapItemLvCoefficient * exponentiation) * bonusCoefficient)  ).ToString(), 10);
```
結果：-1121583104

```
            
// NG
returnBigInt = (costTapItemLvCoefficient * exponentiation) * 131072;
```
結果：-1121583104

```
// OK 
returnBigInt = costTapItemLvCoefficient * exponentiation;
returnBigInt = returnBigInt * 131072;
```
結果：3173384192

### C# int 上限

int	-2,147,483,648 ～ 2,147,483,647
※参考：https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/integral-types-table


### 追記

```
BigInteger returnBigInt =　new BigInteger("0",10);
int costTapItemLvCoefficient = 41152264;
int exponentiation = 205;


returnBigInt = costTapItemLvCoefficient * exponentiation;

// NG これも上限超えのマイナスになった。。
Debug.Log("returnBigInt " + returnBigInt.ToString());

```


```
BigInteger returnBigInt =　new BigInteger("0",10);
int costTapItemLvCoefficient = 41152264;
int exponentiation = 205;

returnBigInt = costTapItemLvCoefficient;
returnBigInt = returnBigInt * exponentiation;

// OK 挙動がよくわからない。。
Debug.Log("returnBigInt " + returnBigInt.ToString());

```


### 試した環境

MacOS Siera

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/5ca3712a-a723-63e6-1345-54fd1d38a5be.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/cb541078-e668-eeb7-b34f-f82531370bdf.png)
グループ ポリシーを使った Windows Update for Business の構成


[チュートリアル: グループ ポリシーを使った Windows Update for Business の構成]
(https://docs.microsoft.com/ja-jp/windows/deployment/update/waas-wufb-group-policy)
**注意：Windows Server 2008 R2 は「Windows 10 バージョン 1511 での Windows Update for Business の構成」のみ対応です。**

テンプレートのインストール方法
[Windows 10 Creators Update 用の管理用テンプレートが公開されました](https://kogelog.com/2017/04/13/20170413-01/)

テンプレートの適用方法
[Windows 10でグループポリシー設定を利用するには]
(http://www.atmarkit.co.jp/ait/articles/1601/20/news022.html)

参考：Trustedinstaller権限について
[「TrustedInstaller」は「Administrator」より偉い奴](
http://piyopiyocs.blog115.fc2.com/blog-entry-838.html)

テンプレート適用後にポリシー管理エディターを開いてエラーが発生した場合
[Windows でのポリシーの編集時に "'Microsoft.Policies.Sensors.WindowsLocationProvider' は既に定義されています" というエラーが発生する]
(https://support.microsoft.com/ja-jp/help/3077013/microsoft-policies-sensors-windowslocationprovider-is-already-defined)

参考：その他のテンプレートバージョンについて（Windows10 1511, 1607, 1703）
[Windows 10 を新しいバージョンにアップグレードするための機能更新プログラムの延期について]
(https://blogs.technet.microsoft.com/jpwsus/2017/09/06/dfr-upg/)

参考：そのほかのグループポリシー管理方法について
[管理職となったえろす師匠が Windows 10 を考慮したグループポリシー管理を実施するための方法](https://blog.engineer-memo.com/2015/08/09/%E7%AE%A1%E7%90%86%E8%81%B7%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%88%E3%82%8D%E3%81%99%E5%B8%AB%E5%8C%A0%E3%81%8C-windows-10-%E3%82%92%E8%80%83%E6%85%AE%E3%81%97%E3%81%9F%E3%82%B0%E3%83%AB/)

適用されたグループポリシーの確認
[グループポリシーの適用順序とトラブル対策](http://ascii.jp/elem/000/000/519/519542/index-2.html)

グループポリシーの結果ウィザードで”rpcサーバーを利用できません”というエラーが発生した場合のファイヤーウォール設定方法
[グループ ポリシーのファイアウォール ポート要件の構成](https://msdn.microsoft.com/ja-jp/library/jj572986(v=ws.11).aspx)
Project Euler Q26 【逆数の循環節 その1】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
単位分数とは分子が1の分数である. 分母が2から10の単位分数を10進数で表記すると次のようになる.

```math 
\frac{1}{2} = 0.5\\
\frac{1}{3} = 0.(3)\\
\frac{1}{4} = 0.25\\
\frac{1}{5} = 0.2\\
\frac{1}{6} = 0.1(6)\\
\frac{1}{7} = 0.(142857)\\
\frac{1}{8} = 0.125\\
\frac{1}{9} = 0.(1)\\
\frac{1}{10} = 0.1
```

$0.1(6)は 0.166666...$ という数字であり, 1桁の循環節を持つ. $1/7$ の循環節は6桁ある.

$d < 1000$ なる $1/d$ の中で小数部の循環節が最も長くなるような d を求めよ.

## アプローチ

1.まずフェルマーの小定理を用います。
習った気がするけどさすがにもう覚えてない。。

#### フェルマーの小定理

```math
p が素数，a が任意の自然数のとき\\
a^p≡a\;mod\;p\\
特に，a が p と互いに素な自然数のとき\\
a^{p−1}≡1\;mod\;p
```
a=10,pを2,5以外の任意の素数とする。
(pが2,5の場合は1以外の共通の約数を持つ為、aと互いに素にならない。)

すると、$p-1$が循環節の桁数となる。

2.循環小数になる数はリストアップできたが、まだ不十分である為
真の循環節の桁数を算出する。
例えば$1/13 = 0.(076923)$であるが、この循環節の桁数は$13-1=12$ではない。

## 解答

```bash
seq 3 999 |
grep -v "^5$" |
factor |
awk -M 'NF==2{printf $2" ";for(i=1;i<=999;i++){v=(10^i)%$2;if(v==1){printf i" ";break}};print ""}' |
sort -k2,2n |
tail -1 |
awk '$0=$1'
983
```

そうだ、俺mod苦手だった。。

※2018/01/22修正
最後の出力を答えだけにした

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/026.html

## 参考にさせて頂いたサイト様
http://www004.upp.so-net.ne.jp/s_honma/mathbun/mathbun36.htm
[フェルマーの小定理の証明と例題 _ 高校数学の美しい物語](https://mathtrain.jp/fermat_petit)
BitZenyのMinerをMac OS Xでビルドして採掘する

# はじめに
先日はUbuntuでビルドする記事を書きましたが，Macでビルドするのに情報が少なく苦労したので共有します．

# 環境
+ MacBook Pro (Retina, 13-inch, Late 2013)
+ macOS Sierra 10.12.6
+ Xcode Command Line Tools, homebrewはインストール済

# 依存関係のインストール
```
$ brew install curl jansson openssl automake autoconf
```
brewでインストールするだけではopensslのパスが通らないので，opensslのパスを通します．

```
$ echo 'export PATH=/usr/local/opt/openssl/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
```
opensslのパスが変わっていることを確認します．

```
$ which openssl
/usr/local/opt/openssl/bin/openssl
```

pthreadsをインストールします．

```
$ brew tap homebrew/php
$ brew install php56-pthreads
```

# ビルド
リポジトリをクローンします．

```
$ git clone https://github.com/bitzeny/cpuminer.git
$ cd cpuminer
```

READMEの通りにコンパイルしようとすると，autoconfとlibcurl関連でエラーが出るので，少し手を加えます．

```
$ mkdir m4
$ cp /usr/local/opt/curl/share/aclocal/libcurl.m4 m4
$ echo ACLOCAL_AMFLAGS = -I m4 >> Makefile.am
$ sed -i -e "s/INCLUDES/AM_CPPFLAGS/g" Makefile.am
$ sed -i -e "s/aclocal/aclocal -I m4/g" autogen.sh
```

これでコンパイルできるようになると思います．

```
$ ./autogen.sh
$ ./nomacro.pl
$ ./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer"
$ make
```

私の環境ではこの手順で`minerd`を生成することができました．

[参考]
https://qiita.com/asymme/items/7c6aa8d9b59dd560b701
https://www.anintegratedworld.com/to-build-from-source-binary-or-tarball/

## 追伸（12/7）
[@satoshigarage](https://twitter.com/satoshigarage)様，紹介ありがとうございます．
ブログを拝読して気になった点を修正しました．これでMakefile.amにダブルクォーテーションが残る問題及びINCLUDESで警告が出る問題は解決できると思います．

本記事に記載しているのはビルドの方法のみですので，マイニング初心者の方はSatoshi様のブログ（https://satoshisgarage.tech/?p=6484 ）を参考にされることをお勧めします．

参考になればおひねりを頂けると嬉しいです．
ZNY: ZsZ7JiiWB2RTZQtnieXHJJsSgFVwQdHheS
Moved From NoSQL MongoDB to PostgresSQL

Shippable was founded almost 5 years ago. What started as simple CI for Docker has evolved into a full-blown DevOps automation platform that supports a plethora of tools and languages, popular third party tools, and very soon, multiple Operating systems. Today we deploy 50+ micro services, along with the core API and UI. We have also grown considerably in terms of employees and we have a mix of folks who have built massive web scale apps and also who are relative new to enterprise grade applications.
 
A couple of years ago, we moved our code base to a monorepo, which helped us scale tremendously in terms of code reuse and overall speed of development. We are extremely proud of our ability to run a resilient service that has 99.99% availability with zero downtime upgrades.
 
From the beginning of this journey, I made a decision to go all in on Javascript as our default coding language.The most important reason for this was that I wanted to hire full stack developers who could work on every aspect of the product, so we chose Angular.js for UI, Node.js for API and schema-less JSON database aka NOSQL MongoDB. We made all technology decisions based on this one philosophy (another blog coming about what i learned and why i am no longer a fan of full stack developers) and it worked beautifully...for a while.

Read the full article [here](http://blog.shippable.com/why-we-moved-from-nosql-mongodb-to-postgressql)
Androidのアプリ内課金をする際にハマったポイント

## 概要
アプリ内課金の実装をするにあたり Google Play Console でデベロッパー登録や apk のアップロードが必要だったりしてそれなりにてこずったので今後のために記録します。

## ハマったポイント
- リリースビルドした apk をアップロードする
- Google Play Billing Library のインストール

色々と細かいところでハマっていたのですが、大きなポイントは上記2点です。

## リリースビルドした apk をアップロードする
### 署名付き apk の作成
apk を Google Play Console へアップロードするには署名付きの apk を作成する必要があります。apk は Android Studio のメニューから `Build > Generate Signed APK...` とすれば作成できます。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/185323/6aaaba4a-f643-430e-ffbe-30b1c9f9aff7.png "01.png")

![02.png](https://qiita-image-store.s3.amazonaws.com/0/185323/e0fce0ce-da4f-cb09-1654-3244251f5f3c.png "02.png")

![03.png](https://qiita-image-store.s3.amazonaws.com/0/185323/3c7acf16-f193-e04c-11e2-b64c237a183f.png "03.png")

ここでOKすると一旦2つめの画面に戻ります。Nextを押して次に進みます。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/185323/61ff4f78-090e-2af1-30f9-3aefd31dbe56.png "04.png")


`Signature Version` を2箇所チェックします。これで署名付き apk が作成できました。

## Google Play Billing Library のインストール
まずは公式ドキュメントをみてみます。

> 自身のデベロッパー アカウントに表示されているアプリの [In-app Products] のページを開くと、アプリの商品リストにアクセスできます。 Google ペイメントの販売者アカウントがあり、アプリのマニフェストに com.android.vending.BILLING パーミッションが含まれている場合にのみ [In-app Products] ページへのリンクが表示されます。
[アプリ内課金の管理 | Android Developers](https://developer.android.com/google/play/billing/billing_admin.html?hl=ja#billing-list-setup)

パーミッションを追加する必要があるようです。

> 1. まず Google Play Billing Library を自身の Android プロジェクトにダウンロードします。  
> a. [Tools] > [Android] > [SDK Manager] の順に選択します。  
b. [Appearance & Behavior] > [System Settings] > [Android SDK] の中の [SDK Tools] タブをクリックして、[Google Play BillingLibrary] を選択し、ダウンロードします。

> [AIDL ファイルをプロジェクトに追加する | Android Developers](https://developer.android.com/google/play/billing/billing_integrate.html?hl=ja#billing-add-aidl)

ドキュメントと同じ手順で確認してみます。

![スクリーンショット 2017-11-22 16.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/185323/14c49664-17a9-0e0b-c4df-4bc36bdc2ce9.png "スクリーンショット 2017-11-22 16.10.44.png")

見当たりません。`com.android.vending.BILLING` について調べてみると Google Developers blog にありました。

> Play Billing Library は Maven レポジトリで公開されており、アプリの build.gradle ファイルに次の依存関係を追加するだけで、プロジェクトに Play Billing Library を追加できます。
[Google Developers Japan: Google Play Billing Library 1.0 をリリース](https://developers-jp.googleblog.com/2017/10/google-play-billing-library-10.html)

```gradle:app/build.gradle
dependencies {
    ...
    compile 'com.android.billingclient:billing:1.0'
}
```

> Play Billing Library 1.0 を追加すると、APK には自動的に com.android.vending.BILLING パーミッションが追加されます。つまり、アプリのモジュールのマニフェストに手動でパーミッションを追加する必要はありません。

ということでした。これで Google Play Console のアプリ内サービスから課金アイテムを登録できるようになりました。

## 参考
- [Google Developers Japan: Google Play Billing Library 1.0 をリリース](https://developers-jp.googleblog.com/2017/10/google-play-billing-library-10.html)
- [Android Studio 2.3ではAPK作成時にSignature Versionsを選ぶ必要がある - Qiita](https://qiita.com/ntsk/items/ce655a804654dac33d73)
Firebase Messagingを始めよう

色々躓いたので、メモ。
※Apple Developer ~への登録やgoogleアカウントの登録は終わっていることが前提

# 何がしたいか
iOSアプリでFirebaseを利用してPUSH通知を受信できるようにしたい

# どうしたか
- 基本的には[この記事](https://qiita.com/ysk_1031/items/e0fce5ec0c31c0ede0d6)に従った。この記事を早く見つけていればもっと早く。。。悔やむ。
- ただし、初級者には所どころ理解が追い付かない箇所があったので、その部分を書く

## APNs証明書の登録
記事では、[公式](https://firebase.google.com/docs/cloud-messaging/ios/certs?hl=ja)を示してくれた。
私は今回、iOSアプリの配布にtestFlightを利用したため、プロビジョニングファイルは使わなかった。
なので、Firebaseには、APNs認証キーの登録だけを行うだけで良かった。アプリIDは登録時に必要だったので作成が必須。
（プロビジョニングファイルを登録していないと、PUSH通知送信の際、FCMトークンを指定しての送信ができない。プロビジョニングファイルに端末のトークンが入っていて、それを利用してPUSH通知を送信するためだと思う。なので、最後のところでも書くがテストはユーザーセグメントで行った）

2017/11/27追記
APNs認証書をFirebaseに登録する方法が分からないという意見があったので、記載しておく。
1. Firebase Consoleへ移動する
2. 画面左側のメニューの「Project Overview」の横に表示されている歯車をクリックする。表示されるサブメニューから「プロジェクトの設定」をクリックする。
3. ページ遷移後、画面上部のタブの「Cloud Messaging」をクリックする。
4. iOSアプリの設定からAPNs認証書の設定ができます。

## PUSH通知のパーミッション取得
ここからがコードだったのだが、PUSH通知について知っておかないと、理解が追い付かない。
なので、[こちらの記事](https://qiita.com/mshrwtnb/items/3135e931eedc97479bb5)を参照してください。
User Notification Centerについて詳しく記載されていて、理解が進みました。

## Firebase設定やデバイストークン取得
ここもパーミッション取得の時の記事を参考にすると分かりやすい。
ただし、以下の箇所は基本的に従った記事が分かりやすかった。

``` swift
extension AppDelegate : UNUserNotificationCenterDelegate
```

これをコーディングしていないと、フォアグラウンド（アプリを画面に表示した状態）でPUSH通知を受信できない（正確には画面に通知が表示されない）ので注意が必要。

## プッシュ通知の送信
APNs証明書の登録でプロビジョニングファイルをfirebaseに登録した人は「3.FCMトークンを指定」で送信可能（？）。
TestFlightでテスト用に配布しているときは、1.ユーザーセグメントを利用すると良いのではないかと思います。

# 終わりに
どちらの記事もとても参考になりました。
swiftマスター・職人とは言わずとも、「swiftも使えるよー」くらいは言えるように早くなりたい。
AWS DMS のテーブルごとのレプリケーション状況を把握する

AWS の Web コンソールからも Replication Task ごとの進捗状況は確認できますが、ここではコマンドラインから確認する方法について書きます。

DMS の API として DescribeTableStatistics というものが提供されています。
http://docs.aws.amazon.com/ja_jp/dms/latest/APIReference/API_DescribeTableStatistics.html

aws-cli の `aws dms describe-table-statistics` だと以下のような形で呼び出せます。

```
SYNOPSIS
            describe-table-statistics
          --replication-task-arn <value>
          [--max-records <value>]
          [--marker <value>]
          [--cli-input-json <value>]
          [--generate-cli-skeleton <value>]
```

こちらを実行することで、任意の Replication Task のテーブルマイグレーション状況を API から取得することができます。

aws-cli のコマンドラインから取得する場合は、あらかじめ Replication Task の ARN を取得し、そちらを指定する必要があります。


## peco , jq と組み合わせる
これだけだとあっさりしすぎているので、普段使用しているコマンドラインの例として、peco と jq を組み合わせて 1-liner でインタラクティブに情報を取得する方法を例として記載します。
peco は percol でも置き換え可。

```
$ aws dms describe-table-statistics --replication-task-arn $(aws dms describe-replication-tasks | jq -r '.ReplicationTasks[].ReplicationTaskArn' | peco)
 
 
{
    "ReplicationTaskArn": "arn:aws:dms:........,
    "Marker": "........",
    "TableStatistics": [
        {
            "Inserts": 0,
            "LastUpdateTime": 1511333172.812,
            "FullLoadErrorRows": 0,
            "FullLoadCondtnlChkFailedRows": 0,
            "Ddls": 0,
            "TableName": "sada",
            "Updates": 0,
            "FullLoadRows": 5034633,
            "TableState": "Table completed",
            "SchemaName": "sada",
            "Deletes": 0
        },
        {
            "Inserts": 0,
            "LastUpdateTime": 1511333172.812,
            "FullLoadErrorRows": 0,
            "FullLoadCondtnlChkFailedRows": 0,
            "Ddls": 0,
            "TableName": "masashi",
            "Updates": 0,
            "FullLoadRows": 4794,
            "TableState": "Table completed",
            "SchemaName": "sada",
            "Deletes": 0
        },
(snip.)
  ]
}
```

こうしてあげると、複数の ReplicationTask がある場合そちらが peco 上で表示され検索可能になります。
ARN 名だけだとわかりづらいから他の情報も peco 上に出したいなど、カスタマイズはご自由に。

## json2csv と組み合わせる
表形式で表示した方がデータの特性上見やすいという話もあるので、JSON の情報を CSV に変換する [json2csv](https://github.com/jehiah/json2csv) を使用してみます。

```
$ aws dms describe-table-statistics --replication-task-arn $(aws dms describe-replication-tasks | jq -r '.ReplicationTasks[].ReplicationTaskArn' | peco) | jq '.TableStatistics' | json2csv
 
 
"Inserts","LastUpdateTime","FullLoadErrorRows","FullLoadCondtnlChkFailedRows","Ddls","TableName","Updates","FullLoadRows","TableState","SchemaName","Deletes"
0,1511333082.816,0,0,0,"sada",0,5034633,"Table completed","sada",0
0,1511333082.816,0,0,0,"masashi",0,4794,"Table completed","sada",0
(snip.)
```

これらの情報を定期的に取得して、Datadog などにデータを流し込んだり、S3 上にファイルを設置して Athena などで検索したり、という感じで可視化を行うこともできると思います。
gitignoreの除外ファイルの記述に手間取った話

# はじめに
例えばこういったディレクトリ構成があるとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165355/b9b38b49-a78f-c5ea-5f2e-74762bdbb360.png)

ここで、a配下は基本的に無視したい。
でも、e.txtだけは差分監視するようにしたい。
そんな設定にしようとしたところ、詰まったので備忘録的に残しておきます。

# gitignore（初期）

```text:.gitignore
/a
...
...
```

# gitignore（正解）

```text:.gitignore
/a/*
!/a/b
/a/b/*
!/a/b/c
/a/b/c/*
!/a/b/c/d
/a/b/c/d/*
!/a/b/c/d/e.txt
```

このように、各階層ごとに無視してほしいディレクトリと無視してほしくないディレクトリを交互に記述していく必要がある模様。

# gitignore（失敗例）
こういう書き方ができると思っていた時期が私にもありました。

```text:.gitignore
/a/*
!/a/b/c/d/e.txt
```

```text:.gitignore
/a
!/a/b/c/d/e.txt
```

# 所感
本当にいちいちこういう面倒くさい書き方しないといけないのかなぁ。
Laravel mix事始め

# Laravel mix is 何

---

## webpackのラッパー🙌

---

## 前の名前はLaravel Elixier

---

## jsやsassなどのアセットを簡単にいい感じにコンパイルしてくれるビルドツール

---

## webpack、Vue.js、sass等がすぐ使える🦆

---

## インストール・使い方🌏

---

- Laravel 5.4以上をcomposer create-projectでインストールすると一緒に入ってくる
- コンフィグは `node_modules/laravel-mix/setup/webpack.config.js` に書いてある
- 他のビルドツールみたいにコマンドを打てば特定ファイルをコンパイルしてくれる

---
たくさん起動コマンドある…

```package.json
"scripts": {
  "dev": "npm run development",
  "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
  "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
  "watch-poll": "npm run watch -- --watch-poll",
  "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js -host=0.0.0.0 --https --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
  "prod": "npm run production",
  "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
}
```

---

## dev | development
- 対象ファイルを全てコンパイルしてくれる
- minifyされない

```shell-session
$ npm run {dev|development}
```

---

## watch | watch-poll
- 対象ファイルを監視し変更があれば変更のあったファイルをコンパイル
- docker上で実行する場合は `watch-poll` でポーリングしないと変更が反映されない

```shell-session
$ npm run watch # on mac
$ npm run watch-poll # on docker
```

---

## hot
- HMR(Hot Module Replacement)を実行できる
- サーバが立ち上がりそのサーバのメモリ上に保存された内容がサーブされる。コンパイル済みのファイルは生成されない

```shell-session
$ npm run hot
```

---

## prod | production
- 対象ファイルを全てコンパイル
- minifyされる

```shell-session
$ npm run {prod|production}
```

---

# 対象ファイルを増やしたいとか変更したいとか
`webpack.mix.js` に書きましょう。ファイル形式によってヘルパーメソッド違うので詳細はドキュメント確認のこと

```webpack.mix.js
let mix = require('laravel-mix');

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');
```

---

# ES2015とか使えんの？

jsメソッドで下記がデフォルトで使える

- ES2015 syntax.
- Modules
- Compilation of `.vue` files.
- Minification for production environments.

---

# autoprefixerとかしてくれんの？

してくれる

```app.scss
$brand-primary: #3097D1;
.test {
    color: $brand-primary;
    font-size: 20px;
    user-select: none;
}
```

```app.css
.test {
  color: #3097D1;
  font-size: 20px;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}
```

---

# ブラウザキャッシュの対策できんの？

できる。 `.version()` と `mix()` 使えばOK

```js
mix.js('resources/assets/sass/app.scss', 'public/css')
   .version();
```

```html
<link rel="stylesheet" href="{{ mix('/css/app.css') }}">
```

---

こうすれば本番だけ有効にもできる

```js
mix.js('resources/assets/js/app.js', 'public/js');

if (mix.inProduction()) {
    mix.version();
}
```

---

# デプロイするときコンパイル済みのファイルS3にあげたいんだけど？

僕の手元ではまだできませんすみません😢

---

あとは

- `.env`で`MIX_`というプレフィックスつけた変数用意すれば環境変数使える
- js、css共に複数ファイルを結合できる
- cssで `url()` メソッドを使うとディレクトリ内の相対パスで画像ファイルの指定ができpublic配下に出力も可能

詳しくはドキュメント見て欲しいです🏄

---

# 便利そうですね😀
Windows10で、ローカルアカウントのログインはできているけれどもパスワードを忘れてしまった場合にパスワードをリセットする

普段は自動ログインの設定をしているのでパスワードを意識していないにもかかわらず、突然必要になってさあ大変！というときの対処法です。
今回は以下の状況を想定しています。
1) ログイン自体はできている。
2) そのログインアカウントは管理者権限である。
3) パスワードはリセットされるので復元はされず、作り直しで良い。

ざっくり言うと、別の管理者権限のあるアカウントを作成し、そこから既存のアカウントのパスワードの作り直し（書き換え）となります。

※ログイン自体ができない場合は、次の記事が参考になるでしょう。
[Windowsでログインパスワードを忘れたときに無理やり書き換える方法](https://qiita.com/32b0c58/items/c87d2220cad906b5fd88 "Windowsでログインパスワードを忘れたときに無理やり書き換える方法")
[パスワードを忘れたWindows OSにログオン（サインイン）する](http://www.atmarkit.co.jp/ait/articles/1312/06/news055.html)

以下のようにします。
1.コントロールパネルからユーザーアカウントを開きます。
（現在のアカウントは"Kurimaron"です。）
ローカルアカウントの権限がAdministratorになっていることを確かめて、「別のアカウントの管理」をクリック。
![rapture_20171122140015.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/fc8685c2-dbc1-38e5-0202-20db6bfb0dd0.jpeg)
2.「PC設定で新しいユーザーを追加」
![rapture_20171122142303.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/2143c51d-edbf-339f-e192-7749d8ae6294.jpeg)
3.「その他のユーザーをこのPCに追加」
![rapture_20171122102550.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/80870ece-88ec-1a7c-5375-778709de976c.jpeg)
4.ローカルアカウントを作成したいので、「このユーザーのサインイン情報がありません」をクリック。（「次へ」などは無視します。）

![rapture_20171122102611.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/76b127e4-1d0b-68ae-7139-64b9217b0b7c.jpeg)
5.「Microsoftアカウントを持たないユーザーを追加する」をクリック。（その他の項目は無視します。「次へ」もクリックしません。）
![rapture_20171122102624.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/acee3ad4-706a-9390-f2b6-a50da3b03c64.jpeg)
6.新しいアカウントを作成します。ここでは"NewUserName"を作成します。
![rapture_20171122102726.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/be713525-744c-d218-9067-0ff227b1ead7.jpeg)
７.新しいアカウントが作成されたので、クリックします。
![rapture_20171122102740.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/8b2ddfea-a2af-a2b6-cc7d-796936591a3e.jpeg)
8.「アカウントの種類の変更」のボタンが表示されるのでクリックします。
![rapture_20171122102750.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/3b819625-aee9-6979-503b-a16bea3b328e.jpeg)
9.「標準ユーザー」となっています。![rapture_20171122102801.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/475cb579-7db4-3618-6d3a-b5597d1f99d7.jpeg)
10.「管理者」に変えて「OK」![rapture_20171122102811.jpg](https://qiita-image-store.s3.amazonaws.com/0/65525/a76786ff-2b10-a4ae-9022-943678a297fe.jpeg)
11.これで管理者権限の新しいアカウントが作成されたので、ユーザーの切り替えで"NewUserName"にログインします。
あとは、1.の画面と同様の画面で、「別のアカウントの管理」で"Kurimaron"を指定し、パスワードの再設定を行います。
substr関数

## 0文字目から1文字切り出す
\# echo "123456" | awk '{print substr($0,0,1)}'
1
 
## 3文字目から2文字切り出す
\# echo "123456" | awk '{print substr($0,3,2)}'
34
 
## 2文字目から文字列の最後まで切り出す
\# echo "123456" | awk '{print substr($0,2,length($0))}'
23456
WIP: JavaScriptの関数 書き方メモ

# 関数について
## JavaScript
### 通常の関数
```js
function kono (){
  console.log('hageee');
}

kono();
```

### 有名関数
```js
var chigaudaro = function kono (){
  console.log('hageee');
};
```

### 無名関数
```js
var kono = function (){
  console.log('hageee');
};
```

### 即時関数
```js
(function kono(){
  console.log('hageee');
})();
```

## jQuery  
```js
$(function(){
  console.log('hageee');
});
```
```js
jQuery(function(){
  console.log('hageee');
});
```
`$` =  `jQuery`
Carrierwaveで、DBのカラムに入っている情報を直接参照する

ちょっとした情報の変更時に、URLなどではなくて、実際にカラムに入っている文字列を参照したいことがあったので、調べた。文書にたどり着けなかったので、 `methods`で全部列挙してそれっぽいのを叩いてみたらわかったのでメモっておく。

例えば `Test#image_url` があった場合には `Test#img_url_identifier`と、 `identifier`の接尾辞を付けると取れるらしい。本当は何か情報あるんだろうけれど、真似する人は再度お調べください。
Hash を継承したクラスで .[] からインスタンスを生成しても initialize は呼ばれなかった

```rb
class C < Hash
  def initialize(*)
    raise
  end
end

C[x: 1]                         # => {:x=>1}
```

何かおかしいと思ったら initialize は呼ばれていませんでした。
では、どこにひっかければいいかと言うと `[]` メソッドでよさそうです。

```rb
class C < Hash
  def self.[](*args)
    super(*args).tap do |o|
      o.instance_eval do
        @foo = "OK"
      end
    end
  end
end

C[x: 1].instance_variable_get("@foo") # => "OK"
```

うまくいきました。
Zabbix3.4からのJMXDiscovery

# Zabbix3.4からのJMXDiscovery

Zabbix3.4になりJMXによるLow Level Discovery(以下LDD)がサポートされました。
[参考](https://www.zabbix.com/documentation/3.4/manual/introduction/whatsnew340#jmx_low-level_discovery)

「Zabbix3.4からの」と書いていますがZabbix3.2以前にJMXDiscoveryを利用していたがZabbix3.4の機能追加タイミングで取得方法を合わせようとしている人向けです

## 概要

Zabbix3.2以前でのJMXを用いたLDDではJMXDiscovery.jarを利用してLDDを再現していましたが、
Zabbix3.4にて標準でJMXからDiscoveryが生成できるようになりました。
機能的には、ほぼ取り込んだ動きです。
https://www.zabbix.org/wiki/Docs/howto/jmx_discovery
ページではjmx_discoveryの利用方法が記載されています。

## 目的、前提

Zabbix3.2以前からJMXDiscoveryを利用していて3.4の標準に対応したい
zabbix-java-gatewayはインストール済みでjmx取得が可能である

## 問題点、解決策
先に問題点

JMXDiscovery.jarで利用する際はコマンドラインから打ち込んで取得できるjson情報が確認できましたが、
Zabbixに内包されzabbix_get等コマンドから利用できない点です。

仕方がないのでアイテムを一つ追加し

```
・JMXエージェント
jmx.discovery[beans, <pattern>]

インターフェイス：任意のJMXインターフェイス<hostname[:port]>
ユーザー名：<optional username>
パスワード：<optional password>
データ型：テキスト
```
を利用しjsonデータのマッピング確認を取ることをおすすめします。

## 方法

Zabbix3.2以前でjmx_discoveryを利用しているものとして
ディスカバリルールの編集を行います。

```
・外部チェック
jmx_discovery[<pattern>,<hostname[:port]>,<optional username>,<optional password>]
```

ここを[Zabbix3.4風](https://www.zabbix.com/documentation/3.4/manual/discovery/low_level_discovery/jmx)に書き換えると

```
・JMXエージェント
jmx.discovery[beans, <pattern>]

インターフェイス：任意のJMXインターフェイス<hostname[:port]>
ユーザー名：<optional username>
パスワード：<optional password>
```

とすることができます。


----

またプロトタイプでディスカバリーマクロを利用している部分が

```
{#PROPHOGEHOGE}
```
から

```
{#JMXHOGEHOGE}
```
に変わります。

## ヒント

説明中には書き換えと記載していますが
実際そのまま書き換えにて動かすことができるため
これまで取得していたヒストリもそのまま継続することができます。

## その他
jmxの情報は
jconsoleまたはOracle Java Mission Controlで取得しましょう。
Node.jsのデバッグ方法の話


後輩に書いてくださいよ。的に言われたので、書いてみます。Node.jsは0.4くらいからやってました。

僕個人の方法なので、こんな方法もあるんだなぁという感じで見てもらいたいです。

# 基本はconsoleでデバッグ

## 普段使い

```js
// console.logは引数を複数取れます。
var num = 1
console.log('aaaaaaaaaaaa 11', num)
num = 2
console.log('aaaaaaaaaaaa 22', num)

// こんな感じで出ます。
$ node hoge.js
aaaaaaaaaaaa 11 1
aaaaaaaaaaaa 22 2

```

別のソースだとaaaの部分がbbbになったりします。同じソースの近い場所でやる場合、番号振ってどれが出ているか？わかりやすくしたりします。利点は、

- 入力が簡単
- grep検索した時に一意で見つけられる
- consoleに出てくる文字列も見やすい

注意点としては、console.logは同期的に実行されるためデカイオブジェクトのパースとかのデバッグコードが残ってしまうとイベントループを止めてしまうことになります。そのため、eslintなどの静的チェッカーで警告などを出してプロダクトコードに残らないように対策しておいたほうが良いです。

## json整形

jsonとかを見やすくしたい場合は、標準実装のJSON.stringifyを使います。

```js
// 通常のstringify
$ node -e 'console.log(JSON.stringify({aaa:111, bbb:222, ccc:333}))'
{"aaa":111,"bbb":222,"ccc":333}

// 整形ありのstringify
node -e 'console.log(JSON.stringify({aaa:111, bbb:222, ccc:333}, null, "    "))'
{
    "aaa": 111,
    "bbb": 222,
    "ccc": 333
}
```

## console.traceでスタックトレースを強制的に出す

```js
node -e 'console.trace(111)'
Trace: 111
    at [eval]:1:9
    at ContextifyScript.Script.runInThisContext (vm.js:44:33)
    at Object.runInThisContext (vm.js:116:38)
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:624:30)
    at evalScript (bootstrap_node.js:480:27)
    at startup (bootstrap_node.js:177:9)
    at bootstrap_node.js:626:3
```
コードを追うのが面倒な時とか、よくわからんときは、怪しい場所にスパッと書いてみたりします。（いつも同じ手順でデバッグしてもつまらなくなりますしね。）

## console.time

```js
console.time('hoge')
// 何かしらの処理
console.timeEnd('hoge')
```

時間を測ることができます。hogeの部分はラベルなので合わせないと駄目です。

## consoleデバッグまとめ
TDDだと全部書いてから実行みたいにはやらないので、この程度あれば９割超えのデバッグが出来ます。

# リフレクション多用コードなど、どうしてもデバッガー使いたい場合

Node.jsでデバッガを使うときは、Node.jsに標準で同梱されているものを使っています。（node-inspectorとかは使ってません）

詳しい使い方はAPIドキュメントを参考にしてほしいです。
https://nodejs.org/docs/latest/api/debugger.html

## コマンド

```js
node inspect aaa.js
// or
node debug aaa.js
```

最近は、V8 Inspector使うようになったからか、実行の書き方が、`node inspect aaa.js`になったっぽいです。昔は、`node debug aaa.js` だったので、時代の変化を感じますね。（Node.js８系では、どちらでも実行できます。）

## 実行時の出力

```js
node inspect aaa.js
< Debugger listening on ws://127.0.0.1:9229/3aa60b74-6389-46c4-8c0c-ebbab1c9aa24
< For help see https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in aaa.js:1
> 1 (function (exports, require, module, __filename, __dirname) { var num = 1
  2 console.log('aaaaaaaaaaaa 11', num)
  3 num = 2
debug> c
< aaaaaaaaaaaa 11 1
< aaaaaaaaaaaa 22 2
< Waiting for the debugger to disconnect...
debug>
```

初回は、一番最初の行で止まるように出来ています。`c` で次のブレークポイントまで行けます。実行中にブレークポイントを設定することも出来ますが、割りと面倒なので、ソースコードの中に、`debugger` と書いてブレークポイントを貼っています。（`debugger`という記述が、プロダクトコードに残っても影響は無いですが、かっこわるいので、eslintなどで警告を出して、消し忘れないようにしたいです。）

実行中にreplモードに入れば、変数の値を書き換えたり出来るので使いやすいです。また、ブラウザやIDEが無くてもデバッガを起動できるため、サーバーでデバッグしたい場合や、デーモン起動以外でデバッグしたい場合とか、テスト実行時などにはかなり良いと思います。

## Mochaでデバッグ

```js
mocha inspect aaa.js
// or
mocha debug aaa.js
```

## 終わらせるときはkillをしてから

デバッグを終了したい場合は、`Ctrl + C` でも終わらせられますが、なんかプロセスが残っちゃうことが初期の頃はあったので、終わらせるときは`kill`と打ち込んで止めてから`Ctrl + C`するようにしています。

# まとめ

結構前からデバッグはこんな感じでやっています。Node.jsのAPIを見てみると他にもGCログの出し方とか、色々とお役立ち関数の発見があるので、ズラーッと見てみることをおすすめします。
Javaでdata URI (base64) を作る方法

Javaでファイルから**data URI**を生成する方法のメモです

# data URIとは

**data URI**とはメディアデータなどをbase64エンコードしたもので、以下のようなやつです

```
data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28y・・・・==
```

HTMLでは、

```
<image src="data:image/png;base64,AAAAIGZ0eXBpc29tAAAC・・・">

<video src="data:video/mp4;base64,AAAAIGZ0eXBpc29tAAAC・・・">
```

のようにsrc指定することが可能です。

## 1.ファイルの種類をあらわす MIMEタイプ　を調べる

ファイルのMIMEタイプを調べる。

```java
File file = new File("movie.mp4");

String contentType = Files.probeContentType(file.toPath());
```

## 2.ファイルの中身をbyte[]配列にすべて読み込む

```java
byte[] data = Files.readAllBytes(file.toPath());
```


## 3.byte[]配列をbase64にエンコードする

- Java7のアプローチ
 
```java
 String base64str = DatatypeConverter.printBase64Binary(data);
```

- Java8のアプローチ

```java
 String base64str = Base64.getEncoder().encodeToString(data);
```


## 4.data URI書式にする

以下の書式にする

```
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
```

```java
StringBuilder sb = new StringBuilder();
sb.append("data:");
sb.append(contentType);
sb.append(";base64,");
sb.append(base64str);
```


## ソースコード全文

```java:ToDataURI.java
package org.example;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import javax.xml.bind.DatatypeConverter;

public class ToDataURI {

	public static void main(String[] args) throws IOException {

		// 変換元のファイル
		File file = new File("movie.mp4");

		// ファイルのコンテンツタイプをしらべる
		String contentType = Files.probeContentType(file.toPath());

		// ファイル内容をbyte[]に読み込む
		byte[] data = Files.readAllBytes(file.toPath());

		// byte[]をbase64文字列に変換する(java7)
		String base64str = DatatypeConverter.printBase64Binary(data);

		// byte[]をbase64文字列に変換する(java8)
		// String base64str = Base64.getEncoder().encodeToString(data);

		// data URIを作る
		StringBuilder sb = new StringBuilder();
		sb.append("data:");
		sb.append(contentType);
		sb.append(";base64,");
		sb.append(base64str);

		// 結果を表示
		System.out.println(sb.toString());

	}
}

```

## 実行すると、data URIできあがり

```
data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wN・・・以下略
```
typekit でインストールされたフォントファイルの実体の保存先(macos)

# この文章について

Adobe Creative Cloud の フォント管理ツール typekit で cloudから同期されたフォントファイルの実体がどこに保存されているのかどうかを調べました。

# 確認した環境

- macos Sierra (10.12.6)
- Adobe Creative Cloud (4.3.0.256)

# 保存先

windows版をご使用の方の情報などから「livetype」のフォルダ名の階層に保存されているとのことで探してみたところ下記の場所に保存されているようでした。

```bash
~/Library/Application\ Support/Adobe/CoreSync/plugins/livetype
```

上記ディレクトリの中に下記の名前でフォルダが保存されています。

|フォルダ名|保存されているもの|
|---|---|
|.c|*entitlements.xml* の中に同期されたフォントの一覧が保存されています|
|.e|Type1フォント？(頭文字がピリオド始まり)|
|.r|Open Type フォント(頭文字がピリオド始まり)|

※ .e、.rのフォルダ内のフォントファイルの数字は「entitlements.xml」　内の<font>エントリのIDに対応しています。

調査内容は以上です。
文字を画像化してslackに投稿

slackを使っていると、文字を強調したくなることがあります。
絵文字や画像を使ったりしますが
もっとインパクトをもたせたい、チャンネルを開いた瞬間に目に入るようにしたいと思ったので
文字列を画像化するhubotスクリプト作成してみました。

# ImageMagicとfontのインストール

- まずはImageMagicとfontのインストール
(CentOS/AmazonLinuxの場合です、他は適度に設定ファイルの場所を読みかえてください)

```
# yum install ImageMagick ipa-gothic-fonts
```
- ImageMagicのLABEL読み取りを許可
 -  /etc/ImageMagick/policy.xml の LABELの権限をreadに変更

```
  <policy domain="coder" rights="read" pattern="LABEL" />
```


# サイズとフォントを指定して画像生成

```
# convert -pointsize $SIZE -font /usr/share/fonts/ipa-gothic/ipag.ttf "ここに画像化したい文字" /tmp/str_img.png
```

# hubot スクリプト化

- 最初は黒だけだったけど、色をランダムで変えた方が楽しいので適当にランダムで色変更と文字サイズを1-5くらい追加してhubot化

```
# Description:
#   str_img
#   hubot str_img string [size 1-5]
#

spcolor = [
  'magenta',
  'orange',
  'LimeGreen',
  'blue',
  'purple',
  'OrangeRed',
  'SkyBlue',
  'LightBlue',
  'Turquoise',
  'gold'
]


exec = require('child_process').exec
fs = require('fs')  

module.exports = (robot) ->

  robot.respond /str_img (.*)/i, (msg) ->
    sizeMatch = msg.match[1].match /\s([1-5])$/
    color = spcolor[Math.floor(Math.random() * spcolor.length)]

    if sizeMatch?
      str = msg.match[1].slice(0, -2)
      size = sizeMatch[1] * 50
    else
      str = msg.match[1]
      size = 50

    exec "convert -pointsize #{size} -font /usr/share/fonts/ipa-gothic/ipag.ttf label:#{str} /tmp/str_img.png"
    filename = '/tmp/str_img.png'
    channel = msg.message.room
    stats = fs.statSync(filename)

    if stats.size <= 100000
      exec "curl -F file=@#{filename} -F channels=#{channel} -F token=#{process.env.HUBOT_SLACK_TOKEN} https://slack.com/api/files.upload", (err, stdout, stderr) ->
        console.log(stdout)
        console.log(stderr)
    else
      msg.send "画像サイズが100Kbyteを超過してます、文字数を少なくするかサイズ指定を下げてください"
```

# 使い方

- slack上で hubot str_img テスト
 - 文字を大きくする場合は hubot str_img テスト 2
 - 画像サイズは1から5の間で指定、画像が大きすぎるとslackに投稿失敗します
 - 画像uploadの制限が1Mybteかと思ったら100Kbyteだった、上げることができるかもしれないけど100Kbyteで十分かなとも思う

# こんなかんじ

- やっぱりフォントをゴニョゴニョフォントの出し分けもして、結果完成！(フォントゴニョゴニョは割愛)

![qiita_str_img.PNG](https://qiita-image-store.s3.amazonaws.com/0/143362/56855b5b-143d-bf46-a295-b2bbce799d9c.png)
C++ Builder > link: リモートマシンでデバッグする > XE4の場合

```txt:動作環境
C++ Builder XE4
```

### 関連

[c++ builder > Windows 8.1 English だけ abnormal program terminationが起きる > static const TDateTime kDt = StrToDateTime(L"2000/1/1 00:00:01"); はだめ > 代替案: static const TDateTime kDt = VarToDateTime("2000/1/1 00:00:01"); / リモートデバッグ](https://qiita.com/7of9/items/ab67f7c03459f294aaf8)

## リモートデバッグ

山本隆さんのブログ
[C++Builder XEでリモートマシンでデバッグする](https://www.gesource.jp/weblog/?p=4889)

情報感謝です。

上記をXE4で実行するには以下のファイルをコピーする。

```
bccide.dll
bordbk180.dll
bordbk180N.dll
comp32x.dll
dcc32180.dll
rmtdbg180.exe
```

デバッグ対象のPC上で実行するバッチファイルを用意する。
このファイルは上記のファイルと同じ場所に置く (例: `c:\remotedebug`)。

```z_autorun.bat
C:\Windows\System32\regsvr32.exe bordbk180.dll
C:\Windows\System32\regsvr32.exe bordbk180n.dll

rmtdbg180.exe -listen
```

上記のバッチファイルを対象PC上でダブルクリック実行するとコマンドプロンプトが２つ開いた状態になり、リモート接続が可能になる。
（プログラムをビルドしなおした場合などコマンドプロンプトを終了して、再度バッチファイルをダブルクリックするとよい）。

あとは山本隆さんのブログの手順に従い接続をします。
(「リモートマシンに接続する」の項参照）

### 不具合

rmtdbg180.exeが起動したままになり、z_autorun.bat実行時にコマンドプロンプトが閉じてしまう場合がある。

こういう場合はタスクマネージャからrmtdbg180.exeを終了させてからz_autorun.batを再実行するといい。

### いざデバッグ

上記の設定を行い、いざデバッグしようとしたらエラーが出なくなっていた。

先週の金曜日の18:30頃に最後にやった作業を思い出し、そのあたりをいじったらエラーが出るようになった。
再現条件を見つけたかもしれない。

あとは詳細な情報をリモートデバッグを使って調査する。

### リモートマシンデバッグで再現しないバグ

> Access violation at address XXXX in module 'プログラム名.exe' 読み取り of address XXXXXXXX.

上記のエラーが出るバグについては、リモートマシンデバッグでは再現していない。

.exeファイルを対象PCで実行すると再現する。

メモリの使い方が変わってしまうのだろうか。
Project Euler Q25 【1000桁のフィボナッチ数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
フィボナッチ数列は以下の漸化式で定義される:
$F_n = F_n-1 + F_n-2$, ただし $F_1 = 1$, $F_2 = 1$.

最初の12項は以下である.

$F_1 = 1$
$F_2 = 1$
$F_3 = 2$
$F_4 = 3$
$F_5 = 5$
$F_6 = 8$
$F_7 = 13$
$F_8 = 21$
$F_9 = 34$
$F_{10} = 55$
$F_{11} = 89$
$F_{12} = 144$

12番目の項, $F_{12}$が3桁になる最初の項である.

1000桁になる最初の項の番号を答えよ.

## 解答

```bash
awk -M 'BEGIN{f[-1]=1;for(i=1;i<=9999;i++){f[i]=f[i-1]+f[i-2];print f[i]}}' |
awk 'length==1000{print NR}' |
head -1
4782

```

`-M`オプション最強！

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/025.html