OmniAICreator/Qiita-1.07M huggingface dataset:
ABC05CとD問題

問題はhttp://abc005.contest.atcoder.jp/
#C問題

##解答の方針
たこやき（A)、お客さん（B)ともに、最後列から参照する。
AとBの時間の差が許容時間（T)以下の時,AとBともに次のものを参照する。
許容時間以上の時、Aのみを参照する。
先に、Bの最後まで見たとき、Yesを返し、Aを最後まで見たときはNoを返す。

##コード
```python:abc05c.py
T = int(input())
N = int(input())
A = list(map(int,input().split()))
M = int(input())
B = list(map(int,input().split()))

def dfs(i,j):
    global T
　　###先にAがなくなったらno,Bがなくなったらyes###
    if j == -1:
        return 'yes'
    if i == -1:
        return 'no'

    if B[j]-A[i] <= T and 0 <= B[j]-A[i]:
        return dfs(i-1,j-1)    
    else:
        return dfs(i-1,j)

res = dfs(N-1,M-1)
print(res)

```

#D問題
##解答の方針
すごくわからなかったので解説を見た
だいたい3つの処理に分けられる。

1.右下から始まる長方形の面積をN*N行列にいれる,
  Nから0までを参照するので、
  i*jの長方形を求めるときは、D[i][j] +　[i+1][j]の長方形 + [i][j+1]の長方形 + [i+1][j+1]の長方形を計算することで、計算量がN*Nですむ
  dp[i][j]にi*jの面積をいれる

2.1からN*Nまでのそれぞれの面積でたこ焼きの値が最大のものを探す。
  0からNまで参照する
　i*jの長方形を参照し、(i<=k<=N),(j<=l<=N)までの、長方形k*jと長方形i*lまでを引き、長方形k*lを足してやることで、右下から始まらない長方形でのおいしさを求め、
　(i-k)*(j-l)にて、長方形の面積の計算を行い、面積ごとのおいしさの最大値を格納する
  
3.面積ごとのおいしさの最大値をまとめた配列を、その面積以下のなかでおいしさの最大値をまとめた配列に更新する。

##コード
```python:abc05d.py
N = int(input())
D = []
for i in range(N):
    D.append(list(map(int,input().split())))
Q = int(input())
P = []
for i in range(Q):
    P.append(int(input()))

dp = [[0 for i in range(N+1)] for i in range(N+1)]  #N+1*N+1とることでdp[N][N]を求めやすくする

###右下から始まる長方形の面積を求める###
for i in range(N)[::-1]:
    for j in range(N)[::-1]:
        dp[i][j] = dp[i + 1][j] + dp[i][j + 1] - dp[i + 1][j + 1] + D[i][j]#Nから0まで下りていくので,i+1はひとつ前のものを参照している。

res = [0 for i in range(N**2 + 1)]

###最大値の探索###
for i in range(N):
    for j in range(N):
        for k in range(i+1,N+1):#iの値より右にある座標を参照
            for l in range(j+1,N+1):#jより下の座標を参照
                s = (k-i)*(l-j)
                res[s] = max(res[s],dp[i][j] - dp[k][j] - dp[i][l] + dp[k][l])

###最大値の更新###
for i in range(1,len(res)):
    res[i] = max(res[i-1],res[i])

for i in P:
    print(res[i])
```
docker-machine で作ったEC2上のホストにスワップを作成


この記事はだめらしいです
未検証ですが
https://dev.classmethod.jp/cloud/aws/al2-swapfile-fallocate-ng/


以下残骸

```
$ docker-machine ssh hoge
```

## ログイン後下記のコマンド

```
$ sudo systemctl enable rc-local
$ sudo vi /etc/rc.local
```

## 起動時に毎回swap をマウント

下記のスクリプトの移植版
[Amazon EC2(Linux)のswap領域ベストプラクティス](http://dev.classmethod.jp/cloud/ec2linux-swapbestpractice/)


``` 
#!/bin/bash
SWAPFILENAME=/swap.img
MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
 
if [ $MEMSIZE -lt 2097152 ]; then
  let SIZE=$MEMSIZE*2
elif [ $MEMSIZE -lt 8388608 ]; then
  let SIZE=$MEMSIZE
elif [ $MEMSIZE -lt 67108864 ]; then
  let SIZE=$MEMSIZE/2
else
  let SIZE=4194304
fi
 
fallocate -l ${SIZE}k $SWAPFILENAME && chmod 600 $SWAPFILENAME && mkswap $SWAPFILENAME && swapon $SWAPFILENAME
```

## 最後reboot して終わり

```
$ sudo reboot
```
最強の設計ツールであるPlantUMLをMac/Winでパッケージマネージャーでインストールする方法

[PlantUML](http://plantuml.com/)、UMLを書いて設計するには最高のツールですね。

ただ一つ気に食わないのは、公式のサイトのインストール方法が、Javaをインストールし、jarファイルをダウンロードして使うやり方になっていることです。

実はこのPlantUML、jarをダウンロードしなくても、Macなら[Homebrew](https://brew.sh/index_ja.html)で、Windowsなら[Chocolatey](https://chocolatey.org/)というパッケージマネージャーでインストール可能です。

そっちのほうがパスも通してくれたりして、アップデートやアンインストールも圧倒的に楽です。

Mac の場合は、 Homebrew を利用して

```
brew install graphviz
brew install plantuml
```

以上で問題ありません。

Windows の場合は、 Chocolatey を利用して、管理者権限で起動したコマンドプロンプトより

```
choco install graphviz
choco install plantuml
```

でインストールできます。これで完了。あとは、

```
@startuml
Alice -> Bob: test
@enduml 
```

`alice-bob-sequence.wsd` というファイルを用意して、コンソールまたはコマンドプロンプトで、

```
plantuml alice-bob-sequence.wsd
```

と実行すれば、 `alice-bob-sequence.png` が同じフォルダ内に保存されます。
このようにして利用することが可能です。

というかこれを公式に書いて欲しい...。

なお、最近はAtomやVSCode、IntelliJでのPlantUMLの拡張が出ていて書きながらプレビューが見れて非常に便利な世の中になりました。昔はプレビュー用vimでコマンド作ったりしていました。

健忘録的にまとめておきました。みなさん良いソフトウェア設計ライフを！
Cognos Analytics 11.0.7 - OpenID ConnectとSAML2.0への対応

#概要
Cognos Analytics 11.0.7の新機能として、OpenIDとSAMLへの対応があります。

以下の英語の記事に記載がありますが、以降に記事を読んで理解した内容を記載します。

**Administration – OpenID Connect is available in #Cognos Analytics 11.0.7**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/administration-openid-connect-is-available-in-cognos-analytics-11-0-7/

#内容

Cognos Analytics 11.0.7では、以下の7種のOpenID ConnectのIdentity Provider(IDP)をサポートするようになりました。
・Active Directory Federation Service
・Azure AD
・Google
・IBMiD
・Okta
・Ping
・SalesForce

Cognos Analyticsは、オンプレで動作していても、クラウドで動作していても、OpenIDでの認証が可能です。

Cognos AnalyticsでOpenIDを使用するためには、Cognos Configurationのネームスペースの追加時に、以下のようにType(Group)で「OpenID Connect」を指定し、TypeでOpenIDのIPDを指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/3cad6408-357a-18ee-5a5a-8a7eee05c1c3.png)

OpenIDのIPDとの接続のために、「Namespace ID」、「Discovery Endpoint」、「Client Identifer」、「OpenID Connect client secret」、「Return URL」を指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/5e76018d-3780-63fd-eb69-02a9a545dc08.png)

Return URLは、OpenIDでの認証後の戻り先、つまりCognos AnalyticsのURLを指定します。

Gatewayを立てていればGatewayのURL、立ててなければDispatcherのURLを指定します。

ロードバランサーの配下にCognos Analyticsがある環境の場合、ロードバランサーのDNSを指定する必要があります。

最後に、OIDC root Certificate AuthorityをCognos AnalyticsのKeystoreにインポートしてセットアップは完了です。

OpenIDのIPDがSSOや二要素認証をサポートしている場合、Cognos Analyticsでもそれぞれのメリットが享受できます。

もし、IDPがOpenIDをサポートしていないが、SAML2をサポートしている場合、先のネームスペースのセットアップ手順で、IBMidタイプを指定して、IBMidチームにSAML2のIDPの接続先を指定しておくことで、Cognos Analytics認証時にIBMidの認証画面が呼び出され、メールアドレスを入力すると自社のSAML2のIDPの認証画面にリダイレクトされ、SAML2 IDPで認証が行える、という使い方ができるようです。

なかなか難しい話ですね。
実際にどこかの環境でやってみたら、またフィードバックします。

#追加情報
Cognos Analytics 11.0.10で、IDPにOKTAを使用し、Active Directoryと連携させる場合の具体的な設定内容の記事が公開されています。
実際に構築される方は、是非ご一読頂けると良いと思います。
**Administration: How to setup #Cognos Analytics OpenID Authentication Proxy federating with Active Directory and LDAP over AD**
https://community.ibm.com/community/user/businessanalytics/blogs/antonio-marziano/2018/06/04/administration-how-to-setup-cognos-analytics-openid-authentication-proxy-federating-with-active-directory-and-ldap-over-ad
Make Your Teeth Shine like Diamond

You love ice-cream but your teeth won’t let you enjoy it? Are you afraid of the humiliation that yellow teeth may bring? If that’s your case, know your teeth better and causes related to such tooth problem and take proper preventive measure to avoid such problem. Whitening of teeth, veneers, invisalign and short term braces all come under cosmetic dental procedures, and <b><a href="http://www.deering-dental.com/our-treatments/cosmetic/">cosmetic dentist Miami</a></b> can help you with it.<br>

In today’s world sipping 5-6 coffee cups, smoking packs of cigarettes, excessive chocolate consumption etc. is quite common. But the consumption of such stuff is not good for your teeth. In fact, this may make your teeth look yellowish or may leave stain on your teeth. The artificial sweetener in candies, soda or other such eatables can erode the enamel on your teeth which is essential to keep your teeth white and shiny.<br>

In children, tooth problem is quite common. You can’t stop children from eating candies, chocolate bars, and ice-cream. You know how severe tooth pain can be and with children you may have to deal with such emergencies. For such cases emergencies you should contact <a href="http://www.deering-dental.com/schedule-an-appointment/"><b>emergency dentist Miami Florida</b></a>. You can immediately rush to them to get fast relief in such situations.<br>

Apart from children, with growing age you too have to deal with many dental problems that like bleeding gums, pain related to wisdom teeth or gradual increase in yellowness of the teeth. Everyone is scared about dentist whether it’s an infant or an elder. They avoid going to dentist and can bear pain till the day they can bear it. Tooth problem can be extremely painful; no one would ever like to experience it in their life.<br>

But Deering Dental strives to make your dental treatment pain-free and quick. The way they administer treatment you will forget the fear of dentist from your mind. Their staff members are very cordial; as you enter the clinic you will get an overwhelming experience. They provide special care for your child. <a href="http://www.deering-dental.com/our-team/doctor-bio/"><b>Dr Pinto</b></a> with her experienced team of dental care specialists has helped many individuals in recovering from severe dental conditions. <br>

With such a friendly staff and special care provided; taking your children to the dentist won’t be a mission anymore. If you don’t have medical insurance they can save up to 20% on your dental care and with their membership plan you may also get free dental checkups time to time.<br>

To book an appointment, visit <a href="http://www.deering-dental.com/"><b>Deering-dental.com</b></a>. <br>
[Objective-C] メモリ管理とは何か「インスタンスの解放」

#メモリ管理って一体なんのことだ
Objective-Cをやっています。メモリ管理とは一体何のことでしょうか……
勉強しながら、まとめてみます。


以前にRubyのクラスとインスタンスで書きましたが、インスタンスってそもそも何なのでしょうか？
あれは配列やDBに格納する処理を特にしなかった場合、いつのまにかどこかに行っています。
使い終わった後、いったい何が起きているんでしょうか？ railsをやっていた頃はさっぱり分かりませんでした。

#インスタンスはメモリに保存されているらしい
インスタンスはメモリに保存されています。macbookだと8GBぐらいあるアレですね。
8GBあるといっても最近のプログラムは複雑化していますし、マルチタスクでいろんなプログラムを実行しているわけですから、あくまでも8GBという限られた領域しかありません。

もし使用済みのインスタンスがメモリ上に残っていた場合、メモリを圧迫することになります。これをメモリリークと呼ぶそうです。
ですからメモリをその都度、解放する必要があるんですね。

Objective-CではARC(Automatic Reference Counting)という機能があり、これがメモリ管理をある程度やってくれています。

#保持カウンタ
各インスタンスには保持カウンタという数値があり、生成したときには「１」が設定されています。
これはNSObjectクラスのretainCountというプロパティを参照することで、確認できます。

試しに昨日書いたDogクラスの練習コードにぶちこんでみます。

###コード
```
#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
@private
    int height;
    int weight;
}
@property int height, weight;
@end

@implementation Dog
@synthesize height, weight;
+(void)nakigoe
{
    NSLog(@"犬の鳴き声は一般的に「ワンワンです」");
}
@end

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Dog *dog_A = [[Dog alloc] init];
        
        NSLog(@"値は「%ld」ですね！", [dog_A retainCount]);
        
        [dog_A setHeight:100];
        [dog_A setWeight:500];
        
        NSLog(@"犬Aの高さは地面から%d、体重は%dです。",
              [dog_A height], [dog_A weight]);
        [Dog nakigoe];
    }
    return 0;
}
```

###実行結果
```
2017-09-22 19:47:49.398696+0900 Objective-C--2[66271:22500460] 値は「1」ですね！
2017-09-22 19:47:49.400036+0900 Objective-C--2[66271:22500460] 犬Aの高さは地面から100、体重は500です。
2017-09-22 19:47:49.400072+0900 Objective-C--2[66271:22500460] 犬の鳴き声は一般的に「ワンワンです」
Program ended with exit code: 0
```

確かに「１」が返ってきてますね！

#保持カウンタの増減
ARCをオフに設定している時には、以下のような操作でインスタンスを解放するそうです。

NSObjectのメソッドを使います。
retainメソッド +1
releaseメソッド　-1
この操作によって保持カウンタが「０」になった時、インスタンス（メモリ）が解放されるということですね！

次の処理に必要なインスタンスを解放してしまうようなことがあっても、コンパイル自体は通ってしまいますが、プログラムがエラーしてしまいます。
メモリ管理は正確に行わなければなりません。

#autoreleasepool
Objective-Cではプログラムを`@autoreleasepool{}`のブロック内に書くことになっていますが、実はこれはブロックの終了時に各インスタンスに`release`命令を送っているんですね。
`@autoreleasepool`は必要に応じてネストさせて記述することもできます。

#以上です！

ざっくりですが、とりあえずインスタンスのことが前よりわかった気がします！
もうちょっと奥がいろいろありますので、今後またまとめたいと思います！
ありがとうございました！
STM32 を Arduino 開発環境で使う場合のシリアルポートの調査 （STM32duino + STM32F103C8 : Blue Pill)

# BluePillのシリアルポート

http://wiki.stm32duino.com/images/a/ae/Bluepillpinout.gif
![Bluepillpinout.gif](https://qiita-image-store.s3.amazonaws.com/0/139524/d8d6549d-0430-58d9-f280-f19f47c0a20f.gif)

この図によると、

| PIN NAME | USART |
|---|---|
|PA9| TX1|
|PA10| RX1|
|PB6| TX1|
|PB7| RX1|
|PA2| TX2|
|PA3| RX2|
|PB10| TX3|
|PB11| RX3|


はて？

TX1とRX1が2つありますね。

そういえば、Arduino開発環境（STM32duino）上ではUSBポートが仮想シリアルポートになっていてシリアルモニターなども使えるようになっていますね。ソフトウェアシリアルとの兼ね合いも含め、そこらへんどうなるのか調べてみました。

# STM32duinoでのSerialオブジェクト

こんな感じのプログラムで調べてみました。

```

void setup(){
  Serial.begin(19200);
  while (!Serial.isConnected()) delay(100);
  Serial.println("Serial port");
}

...

```

これがどこに出力されるかは、 Upload Method によって異なりました。


|Upload Method|Serialオブジェクトの出力先|Upload接続先(Blue Pill上の物理ポート)|Upload接続に使用したハードウェア|Linux上のデバイス|
|---|---|---|---|---|
|STM32duino bootloader|Blue Pill 上のmicroUSBコネクタ|Blue Pill 上のmicroUSBコネクタ|Micro USB ケーブル |/dev/ttyACM0 (Maple Mini)|
|Serial|PA9 TX1 PA10 RX1|PA9 TX1 PA10 RX1|秋月電子「FT232RQ USBシリアル変換キットシリアルアダプタ」|||
|STLink|Blue Pill 上のmicroUSBコネクタ|SWD（シリアルワイヤデバッグ）ポート|ST-LINK/V2(の多分パチモン)||


# Serial1,Serial2,Serial3

ハードウェアシリアルポートが沢山ありますが、それはどこにつながっているか？

USBブートローダーから書いた場合およびST-Linkで書いた場合

|PinName|Signal|Serial Object|
|---|---|---|
|PA9 |TX1 | Serial1|
|PA10 |RX1 | Serial1|
|PB6 |TX1 ||
|PB7 |RX1 ||
|PA2 |TX2  |Serial2|
|PA3 |RX2 | Serial2|
|PB10| TX3  |Serial3|
|PB11 |RX3| Serial3|

TX1とRX1にUSBシリアルをつなげて書いた場合

|PinName|Signal|Serial Object|
|---|---|---|
|PA9 |TX1  |Serial|
|PA10| RX1 |Serial|
|PB6 |TX1 ||
|PB7 |RX1 ||
|PA2 |TX2 | Serial1|
|PA3 |RX2 |Serial1|
|PB10 |TX3 | Serial2|
|PB11 |RX3 |Serial2|

うーむ、USBによる仮想シリアルポートが使えるときはそれがSerialオブジェクトに、そうでなければUSART1がSerialオブジェクトになり、それぞれで番号がずれるみたいですね。

ちなみにTX1とRX1にUSBシリアルをつなげて書いた場合、Serial3を指定するとエラーとなりました。



# STM32F103チップのシリアルポート

ところで、上の図のPB6,PB7にあるTX1、RX1とは何でしょう？

データシートを見てみました。
http://www.st.com/content/st_com/ja/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103c8.html

これによると、STM32F103CxのUSARTは3つある。

|PIN名|USART |Default/Remap|
|---|---|---|
|PA9| USART1_TX| Default |
|PA10 |USART1_RX |Default|
|PB6 |USART1_TX |Remap|
|PB7 |USART1_RX |Remap|
|PA2 |USART2_TX |Remap|
|PA3 |USART2_RX |Remap|
|PA10 |USART3_TX |Remap|
|PA11 |USART3_RX |Remap|

ということで、ソフトウェアの指定によってUSART1はPA9/PA10からPB6/PB7にリマップできるそうです。
まだ調べてませんが、Arduino開発環境でもそういった設定ができるのかも知れませんね。

# STM32duino の仮想シリアルポート

AVRを使ったArduino開発環境では、割と仮想シリアルポートが自由に使えるのでSTM32duinoでも使えるのかと思ってましたが

```

#include <SoftwareSerial.h>
```

とするとエラーが出ました。

http://www.stm32duino.com/viewtopic.php?f=13&t=6
こういった議論や開発もされているようですが、少なくとも STM32duino の本家である

https://github.com/rogerclarkmelbourne/Arduino_STM32

ではソフトウェアシリアルは使えないようです。
Paperclipでファイル保存時にダイジェスト値も保存する

同じ画像をなるべく重複して保存しないように、ファイルのダイジェスト値を計算してDBに保持しておこうと思って、少しハマったのでメモ。

最初こう書いていたが、これだとうまくいかない。

```ruby
class ProfileImage < ActiveRecord::Base
  has_attached_file :image, styles: {}
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/

  before_save :set_digest

  private

  def set_digest
    self.digest = Digest::SHA512.file(image.path)
  end
end
```

既に保存されている``ProfileImage``に対して``ProfileImage.all.each(&:save)``する分にはこれでよいが、新規保存時はidが未確定なので``image.path``が定まらず``Digest::SHA512.file(image.path)``でファイルが開けず落ちてしまう。保存前のtempfileのパスが欲しい。
Paperclipのドキュメントに記述が無かったのでソースに当たってみると、``Paperclip::Attachment#staged_path``というそれっぽいものが見つかった。
https://github.com/thoughtbot/paperclip/blob/7edb35a2a9a80c9598dfde235c7e593c023fc914/lib/paperclip/attachment.rb#L176-L180

``profile_image.image.staged_path``で所望のファイルパスを得られたので、下記のように書き換えてようやくやりたかったことができた。

```ruby
  def set_digest
    self.digest = Digest::SHA512.file(image.staged_path || image.path)
  end
```

あとこれだと``ProfileImage``が更新される度にファイルアクセスが発生してしまうので、同じく``Paperclip::Attachment``に生えている``#staged?``を使えば画像更新時のみにダイジェストをセットするようにできそうだ。
RubyでOneSignalのdevice編集（タグ登録）する

[公式のAPIドキュメント](https://documentation.onesignal.com/reference#edit-device)にRuby実装がなかったので書いてみました。

```ruby
params = {"app_id" => "180b4b7c-7099-4fc4-9ac8-530f9e4f989d",
          "tags" => {"credit_card_user" => "1"}}
player_id = "cdedcece-985c-4abb-9652-bb26a21f78a"

uri = URI.parse("https://onesignal.com/api/v1/players/#{player_id}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Put.new(uri.path, 'Content-Type' => 'application/json;charset=utf-8')
request.body = params.as_json.to_json
response = http.request(request)
puts response.body
```

ただ、公式ドキュメントでは以下のような警告がされているので、APIを利用する場合は注意が必要です。

```
このREST API呼び出しを使用する代わりに、Mobile / Web SDKメソッドを使用することをお勧めします。
このREST API呼び出しで値を変更すると、SDKとの同期に関する問題が発生する可能性があります。
```
[Unity] ShaderForgeで極座標的な中心から描画される処理を実装する

#概要
忘備録です。

言葉では表現しにくいので下の画像を

![test_texture.png](https://qiita-image-store.s3.amazonaws.com/0/36154/5fbe7b46-f645-ecc9-f450-c8a6804d14dd.png)

下のように表示する処理を実装する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/15119402-b483-73bc-c328-2a4a63a3d0ab.png)

スクリーンスペースではなくUV値を用いているので、長方形なら正円にならず楕円になる。

#実装内容

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/bcfd0089-0cf4-e941-2318-39106b4bb621.png)

テクスチャのUV値を変換してテクスチャにかませることで処理している。
ESXi6.0 復旧手順コマンド

### ESXi復旧手順コマンド

バックアップ完了後、バックアップフォルダ確認する
drwxr-xr-x    1 root     root         980 Sep 13 20:34 .
drwxr-xr-x    1 root     root         980 Sep 13 19:51 ..
-rw-------    1 root     root       51.6G Sep 13 20:34 test-000001-s001.vmdk
-rw-------    1 root     root         539 Sep 13 20:34 test-000001.vmdk
-rw-------    1 root     root        8.5K Sep 13 19:51 test.nvram
-rw-r--r--    1 root     root         439 Aug 29 07:10 test.vmsd
-rwxr-xr-x    1 root     root        2.7K Sep 13 19:51 test.vmx

ファイル変換 ※変換後の名前は後で変更するが、とりあえず「_2」と今回は入れる
vmkfstools -i /vmfs/volumes/backupNFS/101/latest/test-000001.vmdk -d thin /vmfs/volumes/datastore1/test/test_2-000001.vmdk

変換後、test_2-000001.vmdkをviで開きファイル名を元に戻す
RW 419430400 VMFS "test_2-000001-flat.vmdk"
↓
RW 419430400 VMFS "test-000001-flat.vmdk"

---------------------------------------------------------------------

\# Disk DescriptorFile
version=1
encoding="UTF-8"
CID=042d2331
parentCID=ffffffff
isNativeSnapshot="no"
createType="vmfs"

\# Extent description
RW 419430400 VMFS "test_2-000001-flat.vmdk"

\# The Disk Data Base
\#DDB

ddb.adapterType = "lsilogic"
ddb.deletable = "true"
ddb.geometry.cylinders = "26108"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.longContentID = "41f1dd881401e5f8ff24212c042d2331"
ddb.thinProvisioned = "1"
ddb.uuid = "60 00 C2 91 be 12 73 40-c2 1a 06 ff 11 9d b2 68"
ddb.virtualHWVersion = "11"

---------------------------------------------------------------------

編集後、ファイル名も変更する
test_2-000001.vmdk
↓
test-000001.vmdk
上記が完了後、esxi上でインベントリの追加を実施する
Spring Boot 認証付きプロキシ環境で mvnwコマンドが失敗する

Spring Boot を認証付きプロキシの環境で使用する時 mvnwコマンドが失敗する問題について。

Spring Bootでプロジェクトを作ると ディレクトリ直下にmvnwコマンドが配置されています。
mvnwコマンド は mvnコマンドをラッピングしています。
mvnwコマンドは最初にmavenのバイナリファイルをダウロードします。

```
Downloading https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip

Exception in thread "main" java.net.UnknownHostException: repo1.maven.org
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
```

しかしJDK1.8u111以上で認証付きプロキシ環境だとダウンロードできずに失敗します。

理由はプロキシの設定をしていない
かつ JDK1.8u111以上だと 認証プロキシがデフォルトで無効化されてた為。
http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html
jdk.http.auth.tunneling.disabledSchemesを指定する必要があります。


mvnwコマンドが参照するjvm.configファイルに下記のような内容を記載します。
プロジェクトHOME/.mvn/jvm.configの内容

```
-Dhttp.proxyHost=proxy.hoge.co.jp
-Dhttp.proxyPort=8080
-Dhttp.proxyUser=uer001
-Dhttp.proxyPassword=hogepass
-Dhttps.proxyHost=proxy.hoge.co.jp
-Dhttps.proxyPort=8080
-Dhttps.proxyUser=uer001
-Dhttps.proxyPassword=hogepass
-Djdk.http.auth.tunneling.disabledSchemes=
```
PlantUMLの.wsdという拡張子は何の略なのか

[WebSequenceDiagrams](https://www.websequencediagrams.com/) なるサービスがあって、こちらがPlantUMLの元なのかどうかは不明だが、同じ記法なのでWSDという事らしい。

PlantUML形式のファイルの拡張子としては他に .puml .pu などが使われている様だ。憶えやすいので、こちらの方が良いのではないかという気がする。
fish shell で history を複数端末間で共有

fish 便利なんだけど複数端末感で history 共有できなくて、それだけで zsh に戻ろうかと思ってたけど、調べたら大体できた。

```fish
function history-merge --on-event fish_preexec
  history --save
  history --merge
end
```

`--on-event fish_preexec` でコマンド実行前に処理を挟めるので、そこで history を save して他のを merge してるだけ。

これだけだと peco での検索時に一回何か実行しないと反映されないので

```fish
function peco_sync_select_history
  history-merge
  peco_select_history $argv
end

function fish_user_key_bindings
  bind \cr 'peco_sync_select_history (commandline -b)'
end
```

みたいな感じで反映されるようにした。
だいたい満足なんだけど、もっといい方法あったら教えてもらいたいです！
macOS への Postgres のインストール

## インストール

```
$ brew install postgresql
```

## 起動

```
$ brew services start postgresql
Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

## (おまけ) サービスとして使えるもののリスト

```
$ brew services list            
Name       Status  User            Plist
memcached  started oh /Users/oh/Library/LaunchAgents/homebrew.mxcl.memcached.plist
mysql      started oh /Users/oh/Library/LaunchAgents/homebrew.mxcl.mysql.plist
nginx      stopped                 
postgresql started oh /Users/oh/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
redis      started oh /Users/oh/Library/LaunchAgents/homebrew.mxcl.redis.plist
```

## Postgres のデータベース一覧

```
$ psql -U $USER -l
                                         List of databases
   Name    |      Owner      | Encoding | Collate | Ctype |            Access privileges            
-----------+-----------------+----------+---------+-------+-----------------------------------------
 postgres  | oh              | UTF8     | C       | UTF-8 | 
 template0 | oh              | UTF8     | C       | UTF-8 | =c/"oh"                   +
           |                 |          |         |       | "oh"=CTc/"oh"
 template1 | oh              | UTF8     | C       | UTF-8 | =c/"oh"                   +
           |                 |          |         |       | "oh"=CTc/"oh"
(3 rows)
```

`postgres` というデータベースが `Owner=oh` で作成されている。

### データベースへの接続

デフォルトの `postgres` データベースに、`owner (= "oh")` として接続する:

```
psql -U $USER postgres
```

## データベースの作成

`mydb` という名前のデータベースの作成:

```
$ createdb mydb
```

## ユーザーの作成

(`brew` でインストールすると、`$USER` がスーパーユーザーとして自動的に登録される: 他の手段でインストールする場合は `postgres` をスーパーユーザーにすることが多い)

`myuser` の作成:

```
$  createuser myuser 
```

### ユーザーが作成されたことの確認

```
$ psql -q -c 'select * from pg_user' postgres
     usename     | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
-----------------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 oh              |       10 | t           | t        | t       | t            | ******** |          | 
 myuser          |    16384 | f           | f        | f       | f            | ******** |          | 
(2 rows)
```

### postgres の REPL からのユーザーおよびデータベースの作成

```
$ psql -U $USER postgres
psql (9.6.5)
Type "help" for help.

postgres=# CREATE ROLE mrs LOGIN
postgres-#   UNENCRYPTED PASSWORD 'mrs'
postgres-#   NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
CREATE ROLE

postgres=# CREATE DATABASE mrs
postgres-#   WITH OWNER = mrs
postgres-#     ENCODING = 'UTF8'
postgres-#     TABLESPACE = pg_default
postgres-#     LC_COLLATE = 'C'
postgres-#     LC_CTYPE = 'C'
postgres-#     TEMPLATE = 'template0'
postgres-#     CONNECTION LIMIT = -1;
CREATE DATABASE
```

なお、ここで作成している `mrs` ユーザーと `mrs` データベース (ついでに `mrs` というパスワード) は、「[Spring徹底入門](http://www.shoeisha.co.jp/book/detail/9784798142470)」の第14章で必要とされているデータベースの設定。
Vimでペースト時コメントアウトを無効化

メモ

```
" auto comment off
augroup auto_comment_off
    autocmd!
    autocmd BufEnter * setlocal formatoptions-=r
    autocmd BufEnter * setlocal formatoptions-=o
augroup END
```

上記を`.vimrc`に記述すれば自動コメントアウトが無効化される
Flutterで画像にRipple Effectをかける

以前の記事 [Flutter 背景色ありで Ripple Effect を効かせる](https://qiita.com/najeira/items/db6edb1c8d8f75042b98) にも書きましたが、Ripple Effect の手前に不透明な Widget があると、その効果が見えません。

さて、不透明である画像を表示する Image クラスに対して Ripple Effect をかけるには、Stack を使って、Image の手前に透過な Material を置きます。

```dart
new Stack(
  children: <Widget>[
    new Image.network(imageUrl),
    new Material(
      type: MaterialType.transparency,
      child: new InkWell(onTap: onPressed),
    ),
  ],
),
```
unisonでローカルとサーバをお手軽に同期する

# はじめに
ローカルとサーバのディレクトリを同期する必要があったので、今回unisonを使ってみました。
予想以上にunisonのバージョンを揃えたりと面倒だったのでインストール手順を残しておきます。
基本的に上からコピペすれば動くと思います。

# ローカル

```
unisonのインストール
$ brew install unison
```


```
# プロジェクトを作成
/Users/user.name/.unison/project.prf
```

下記参考に諸々書き換える(IPはhostでいける)
これがどこのサーバと同期するか、何を同期するかの設定ファイルとなります。

```
# リモートのディレクトリ
root = ssh://project.com//var/www/project
# ローカルのディレクトリ
root = /Users/user.name/Desktop/project


ignore = Path vendor
ignore = Name {tmp,log}
auto = true
times = true
prefer = newer
```

# サーバ

結構長い
コケるけど無視

```
curl -kL https://raw.github.com/hcarty/ocamlbrew/master/ocamlbrew-install | bash
```
インストールが終わるとocamlbrewというディレクトリが出来ます。

## .bashrcに下記をコピペ（ocamlbrewのバージョンは合わせてください）

```shell:.bashrc
__ocaml_path__="$HOME/ocamlbrew/ocaml-4.03.0" # ~/ocamlbrewをlsしてみて適切なバージョン番号に置き換えてください
PATH="$__ocaml_path__/bin:$PATH"
export OPAMROOT="$__ocaml_path__/.opam"
source "$OPAMROOT/opam-init/init.bash" > /dev/null 2> /dev/null || true
```

パスを通す

```
source ~/.bashrc
```

インストール

ここも少し長い

```
opam switch 4.03.0
```

## インストール
```
opam install oasis utop Batteries ocamlscript
sudo yum install ocaml ocaml-camlp4-devel ctags ctags-etags
```

# ファイルをダウンロード＆移す
サーバにインストールするために、パッケージをダウンロードします。
ローカルとサーバのunisonのバージョンを合わせる必要があるので、ローカルにインストールしたバージョンをダウンロード
してください。

サイト  http://www.seas.upenn.edu/~bcpierce/unison//download/releases/

## macで解答

## 解凍したファイルをサーバにアップロード
```
scp -r /Users/shoichi/Downloads/src project.com:/home/webmaster
```

## アップロードしたファイルに移動してビルド

```
make
```

```
# ビルドが終わったらこのコマンドをインストールしたら叩く
sudo cp -v unison /usr/bin/
```

これでセットアップが完了しました。
あとはローカルに戻って下記を実行して、同期していきましょう。

## 実行
```
unison project -repeat watch
```

以上です。








#参考
http://qiita.com/yuya_presto/items/f35f556770196f964810
https://plus.google.com/103080563170453474101/posts/ZMBytWVkhTn
https://www.digitalocean.com/community/questions/install-unison-in-centos-7
crowi オリジナルのテキストフォーマットを作成する

### crowiは、デフォルトの入力形式はテキストベースです。入力フォーマットを入れたいと思います。

以下のファイルを開く
/var/apps/crowi/lib/views/_form.html

--------------------------------------------------------------------------------
[root@localhost ~]# cat /var/apps/crowi/lib/views/_form.html.20170921
{% if req.form.errors %}
<div class="alert alert-danger">
  <ul>
  {% for error in req.form.errors %}
    <li>{{ error }}</li>
  {% endfor %}

  </ul>
</div>
{% endif %}
<div id="form-box" class="row">
  <form action="/_/edit" id="page-form" method="post" class="col-md-6 {% if isUp                                                                                                                                                             loadable() %}uploadable{% endif %} page-form">
    <textarea name="pageForm[body]" class="form-control" id="form-body">{% if pa                                                                                                                                                             geForm.body %}{{ pageForm.body }}{% elseif not page.revision.body %}# {{ path|pa                                                                                                                                                             th2name }}{% else %}{{ page.revision.body }}{% endif %}</textarea>

--------------------------------------------------------------------------------

上記のファイル下記に変更する
--------------------------------------------------------------------------------

[root@localhost ~]# cat /var/apps/crowi/lib/views/_form.html
{% if req.form.errors %}
<div class="alert alert-danger">
  <ul>
  {% for error in req.form.errors %}
    <li>{{ error }}</li>
  {% endfor %}

  </ul>
</div>
{% endif %}
<div id="form-box" class="row">
  <form action="/_/edit" id="page-form" method="post" class="col-md-6 {% if isUploadable() %}uploadable{% endif %} page-form">
    <textarea name="pageForm[body]" class="form-control" id="form-body">{% if pageForm.body %}{{ pageForm.body }}{% elseif not page.revision.body %}# {{ path|path2name }}

\# 使用オーダ

\|開始時刻|終了時刻|オーダ番号|備考|
| --- | --- | --- | --- |
|08:30|17:15|7002|北演支援|
|17:15|19:00|その他|業務報告等|

\# 関連FAQ

* 搬送の規約番号に「0」と入力しても機能するのか。　　←その日登録するつもりor登録した FAQのタイトル
* 野外ルータの障害ランプの見分け方はありますか？

{% else %}{{ page.revision.body }}{% endif %}

 </textarea>


--------------------------------------------------------------------------------------------------------------
★{{ path|path2name }} →作成の時の名称が入るため、この後に記載する


## 変更後、作成ボタンをクリックすると以下のようなフォーマットが記入された状態となる
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/162959/19b025ae-508e-19dd-dd48-de84e6f7b2a0.jpeg)
Vue.jsのdataで定義したObject propertyの監視 watch

## dataでオブジェクトを定義した場合

```js
export default {
  name:'some-component',
  props: {},
  data: {
    userInputData: {
      name: '',
      description: '',
    }
  },
}
```

## 個別propertyを以下の方法でwatch出来る

```js
export default {
  name:'some-component',
  // ... 上記と同じ
  watch: {
    ['userInputData.name'](newName, oldName) {
      // some proccess
    }
  }
}

```
TypeScriptを徐々に導入する


TypeScriptは部分的に導入することが出来ないと思ってFlowtypeを導入したが、出来るぞ！という指摘を頂いたので、調べた。

## `--allowjs`オプション

tscの実行時に`--allowjs`を付けるだけだった。tsconfig.jsonの場合、`compilerOptions.allowJs`に`true`を設定すればよい。

検証用のディレクトリを作って、typescriptをインストールする。

```console
$ mkdir allow-options
$ cd allow-options

$ echo "{}" > package.json
$ yarn add -D typescript
```

`tsconfig.json`を書く。（TypeScriptにあまり詳しくないので自信は無い）`compilerOptions.allowJs`を`true`にする。

```json:tsconfig.json
{
  "compilerOptions": {
    "allowJs": true,
    "sourceMap": true,
    "strictNullChecks": true,
    "noImplicitAny": true,
    "module": "es6",
    "target": "es5",
    "outDir": "./lib/"
  },
  "include": [
    "./src/"
  ]
}
```

`src/a.ts`と`src/b.js`を書く。TypeScriptからJavaScriptの関数を読み込む。


```ts:src/a.ts
import b from './b';

export default function a(arg1: number, arg2: number): number {
  return b(arg1) + b(arg2);
}
```

```js:src/b.js
export default function b(num) {
  return num * 2;
}
```

`tsc`を実行する。普通にコンパイルが通る！`lib/`以下に`a.js`, `b.js`とソースマップが出力される。

```console
$ tsc
# => 何も出ない

# a.js, b.jsが出力されている
$ ls lib
./        ../       a.js      a.js.map  b.js      b.js.map
```

`--allowjs false`を付けて`tsc`を実行する。（もちろん、`tsconfig.json`の`allowJs`を書き換えてもOK）実行するとエラーが表示され、`lib/`以下を見ると、`a.js`だけがある。


```console
# クリアする
$ rm -r lib

# 実行。エラーが出る
$ tsc --allowjs false
src/a.ts(1,15): error TS6143: Module './b' was resolved to '/xxxx/xxxx/xxxx/allowjs-option/src/b.js', but '--allowJs' is not set.

# lib/a.jsは出力されている
$ ls lib
./        ../       a.js      a.js.map
```

`src/a.ts`を下記のように書き換える。

```ts:src/a.ts
import b from './b';

export default function a(arg1: number, arg2: number): number {
  return b(arg1, arg2) + b(arg1, arg2);
}
```

`tsc`を実行するとエラーが出る。引数の数はちゃんと見ているみたいですね。

```console
$ tsc
src/a.ts(4,10): error TS2554: Expected 0-1 arguments, but got 2.
src/a.ts(4,26): error TS2554: Expected 0-1 arguments, but got 2.
```

## 追記: `--checkJs`オプション

コメント欄で@cotttpanさんに「--checkJsオプションを使うとJSDocの型を見てくれるぞ！」と教えていただいたので、試してみた。

[Type Checking JavaScript Files · Microsoft/TypeScript Wiki](https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files)

`src/b.js`にJSDocのコメントで関数の引数と返り値の型を記述する。

```js:src/b.js
/**
 * @param {number} num
 * @return number
 */
export default function b(num) {
  return num * 2;
}
```

`src/a.ts`を下記のように書き換え、`number`で受け取った引数を文字列に変換してb関数に渡す（ちょっと無理やりですが）

```ts:src/a.ts
import b from './b';

export default function a(arg1: number, arg2: number): number {
  return b(arg1 + "") + b(arg2 + "");
}
```

`tsc`に`--checkjs`オプションを追加して、実行する。`tsconfig.json`で指定する場合は、`compilerOptions.checkJs`をtrueにする。

```console
$ tsc --checkjs
src/a.ts(4,12): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
src/a.ts(4,27): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'
```

ちゃんと型をチェックしてくれていますね！[ドキュメント](https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files)を見ると関数の引数・返り値以外にもJSDocで型注釈できるようで、よさそう。

@cotttpan さん、ありがとうございました。

## おわり

普通に出来ました。`--allowJs`オプションはTypeScript 1.8からの機能で、`--checkJs`オプションは2.3からの機能のようです。
github-flowのような体制で、既にpush済みのブランチでコメントミスってしまった時

git rebase -i

を使ってコミット履歴いじっちゃいましょうって話です。

コミットコメントのミスってありますよね？
~~コミットコメントにルールを設けていない環境のため~~ガンガンコミットしちゃっているのですが、この間こんなミスをしました。

PHPのプロジェクトでimgタグの発行ライブラリを整理していたため、コメントに

`git commit -m "画像ライブラリの整理"`

と書こうとしたところ

`git commit -m "画像ライブラリの生理"`

と打っていて間違いに気づかずそのままpush。

数分後、プルリクを送ってようやくミスに気づきました。

女性もいるプロジェクトですので流石にまずいです。笑えません。


今回使用しているブランチは私しか触らないため、git push -f も使えます。

まずは、git commit --amend を試みます。

`git commit --amend`

を用いて~~生理~~を整理に書き換えます

さぁpushだ！！！

・・・あれ・・・？rejectされるぞ。当然です。

ここでrebaseの出番です。

```
git rebase -i HEAD~2
```

と打つと下記のような表示になりました。

```
pick 8145f1c 画像libararyの整理
pick d90db4a 画像libararyの生理

# Rebase ed7420a..71a6940 onto ed7420a
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
```

上のコミットを残したいので、下のコミットのpickをfixupに書き換え、:wqで保存し、脱出します。

そして、`git push -f origin picture`のように打てばpush完了です！
Swift3 で touch, mkdir, ls

# 概要

Swift のファイル操作まわりを自分用にメモ

* touch: ファイル作成
* mkdir: ディレクトリ作成
* ls: ディレクトリ配下のファイル名を取得

# コード

```swift

let documentUrl =  FileManager.default.urls(
    for: .documentDirectory, in: .userDomainMask).first!

// "touch"

let touchPath = documentUrl.appendingPathComponent("file.txt")
let text = "（ここにテキストファイルの内容を書く）"
do {
    try text.write(
        to: touchPath,
        atomically: false,
        encoding: String.Encoding.utf8 )
    
} catch let error as NSError {
    print(error.localizedDescription);
}

// "mkdir"

let mkdirPath = documentUrl.appendingPathComponent("MyFolder")
do {
    try FileManager.default.createDirectory(
        atPath: mkdirPath.path,
        withIntermediateDirectories: false,
        attributes: nil)
    
} catch let error as NSError {
    print(error.localizedDescription);
}


// "ls"

do {
    let directoryContents =
        try FileManager.default.contentsOfDirectory(atPath: documentUrl.path)
    
    print(directoryContents)
    
} catch let error as NSError {
    print(error.localizedDescription)
}
```

注: `mkdir`, `ls` の `atPath` は`.absoluteString`で取得される文字列(`"file:///..."`)だと「The file “...” doesn’t exist.」というエラーになります。`.path`を使ってください。


# 参考リンク
* [Qiita: Swiftでファイルの読み込みと保存](http://qiita.com/itoru257/items/6d31ba75cbc0f4c645f7)
* [stackoverflow: How to create directory using Swift code (NSFileManager)](https://stackoverflow.com/questions/26931355/how-to-create-directory-using-swift-code-nsfilemanager)
* [stackoverflow: Getting list of files in documents folder](https://stackoverflow.com/questions/27721418/getting-list-of-files-in-documents-folder)

* [Apple: createDirectory(atPath:withIntermediateDirectories:attributes:)](
https://developer.apple.com/documentation/foundation/filemanager/1407884-createdirectory)
* [Apple: contentsOfDirectory(atPath:)](https://developer.apple.com/documentation/foundation/filemanager/1414584-contentsofdirectory)
dockerとdocker-composeのインストール(Linux編)

# なぜの記事を書こうと思ったのか
最近VMにdockerとdocker-composeをインストールする機会が多いので，Linuxにおける簡単なインストール手順をまとめました

# インストール方法
読むのが面倒な方は，以下のコマンドを実行してください
ユーザをdockerグループに追加するのですが，その情報をOSに反映するため，最後は再起動を行なってください．

```
curl https://get.docker.com | sh
sudo usermod -aG docker $USER
sudo systemctl start docker
sudo systemctl enable docker
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

これらのコマンドについて簡単に説明します．

## dockerのインストール
dockerがインストールのシェルスクリプトを用意しているので，それを実行します．

```
curl https://get.docker.com | sh
```

デフォルトだと，sudoなしではdockerを実行できません．
ユーザをdockerグループに追加すると，sudoなしでdockerコマンドを実行できるので追加します．

```
sudo usermod -aG docker $USER
```

その後，ユーザ情報を更新するために再起動します．

```
sudo reboot
```

dockerを起動し，常時起動するようにします 

```
sudo systemctl start docker
sudo systemctl enable docker
```

dockerが正常にインストールできたか確認します

```
docker --version
```
以下のように表示されればインストールされています(これは私の環境の数字です)

```
Docker version 17.06.2-ce, build cec0b72
```

## docker-composeのインストール

↓でdocker-composeの最新のバージョンを確認しましょう(メモしてください)
https://github.com/docker/compose/releases
下のコマンドの *1.16.1* の部分は先程確認したバージョンに書き換えてください

```
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```

docker-composeコマンドを実行できるように，実行権限を与えます

```
sudo chmod +x /usr/local/bin/docker-compose
```
正常にインストールされたか確認します

```
docker-compose --version
```
以下のように表示されればdocker-composeがインストールされています(これは私の環境です)

```
docker-compose version 1.16.1, build c7bdf9e
```
kotlinでテキストファイルの読み込み、書き出し

##前提

```txt:test.txt
1 2 3 4 5
```

このファイルへの読み込み書き出し

###読み込み
####Scannerでの読み込み

```kotlin
try{
    val file = File("パス")
    val scan = Scanner(file)
    var i = scan.nextLine()
    i = scan.next()
}catch (e: FileNotFoundException){
    println(e)
}
```

####FileReaderでの読み込み

```kotlin
try{
    val file = File("パス")
    val filereader = FileReader(file)
    var rd: Int = filereader.read()
    while (rd != -1) {
        print(rd.toChar())
        rd = filereader.read()
    }
}catch (e: FileNotFoundException){
    println(e)
}
```

###書き出し

```kotlin
    val fil = FileWriter("パス")
    val pw = PrintWriter(BufferedWriter(fil))
    pw.println("3")
    pw.println("5")
    pw.println("7")
    pw.close()
```

###出力後
```test.txt
3
5
7
```

自分用のメモに
ReactNativeで素敵なリストを作ってみたい

# こんなのできたら嬉しいのですが・・・

[![2017-09-22 19_58_36.gif](https://qiita-image-store.s3.amazonaws.com/0/2276/942ba554-483b-22c4-a5f5-b7cfb297c093.gif)](https://github.com/gameboyVito/react-native-ultimate-listview/blob/master/Demo/ios.gif)[![2017-09-22 19_56_48.gif](https://qiita-image-store.s3.amazonaws.com/0/2276/cc94f98c-6655-3098-9293-f44fa8e5ecd9.gif)](https://github.com/gameboyVito/react-native-ultimate-listview/blob/master/Demo/android.gif)

---

# できるか・・・

[react-native-ultimate-listview](https://github.com/gameboyVito/react-native-ultimate-listview)

[Usage](https://github.com/gameboyVito/react-native-ultimate-listview/wiki/Usage)だけでなく、[Example](https://github.com/gameboyVito/react-native-ultimate-listview/tree/master/Example)まで用意されている！！
これならド素人の自分でもできるかも・・・

---

# まずはプロジェクトを・・・

[この記事](https://qiita.com/courage-liberty/items/2e1b72b0acb15ad78e1e)で書いたCRNAでプロジェクトを作成。

---

# Exampleをコピー

できたプロジェクトに[Example](https://github.com/gameboyVito/react-native-ultimate-listview/tree/master/Example)配下を全コピ。
必要なものだけインストール！！
（まだnpm使ってます・・・）

```
npm install --save native-base
npm install --save react-native-ultimate-listview
```

---

# 早速スタート

おやっ・・・？
エラーが出ました。

```
itemContainer/flatListItem.js
../../img/default-portrait.png
```
がないよ的な・・・
あっExampleだけしか持って来ていませんでした。。

[img](https://github.com/gameboyVito/react-native-ultimate-listview/tree/master/Example/img)をコピーしてパスを `../img` に修正。

---

# リラン

おっと。
できてしまいました。

---

# 最後に

ここまで色々書いて揃えてくれていると
こんな僕でも簡単にできました。

あとはコードを紐解いて自分のアプリに入れ込んでいきます＾＾
いいものを見つけられてよかったです☆彡
配列の全ての要素の最大公約数を求める (Java 8, Python, PHP)

ちょっと調べた事をメモ。

まずはPython。`itertools.reduce()`と`math.gcd()`を使って実質的にワンライナーで書けました。

```py
import functools
import math

values = [290021904, 927964716, 826824516, 817140688]
gcd = functools.reduce(math.gcd, values)
print(gcd)
```

Java 8ではStream APIを使って実装してみます。どうしても冗長に見えてしまいますが、やっていることは同じです。

```java
import java.math.BigInteger;
import java.util.stream.IntStream;

class GCD {
    public static void main(String args[]) {
        int gcd = IntStream.of(290021904, 927964716, 826824516, 817140688)
            .mapToObj(BigInteger::valueOf) // 型変換
            .reduce(BigInteger::gcd) // Python版のreduce(math.gcd)とほぼ同じですね
            .orElse(BigInteger.ZERO) // ↑はOptional<BigInteger>を返すので
            .intValue();

        System.out.println(gcd); // 92
    }
}
```

ちなみにPythonの`math.gcd()`もJavaの`BigInteger#gcd()`も内部ではユークリッドの互除法を使っており自前で2つの整数の最大公約数を求めるような実装をする必要はありません。

#### 2017-09-25 更新

コメントいただいたより簡潔な表記に改めました。また、結果も誤っていたので修正しました。

#### 2017-09-25 追記

PHP版も書いてみました。PHPではGMP拡張の`gmp_gcd`関数がありますが、今回は自前でユークリッドの互除法を使った関数を実装。リストを`reduce`するやり方だと文法やシグネチャの違いぐらいしか差が出ませんね。

```php
<?php
function gcd($a, $b) {
    return ($a % $b) ? gcd($b, $a % $b) : $b;
}
$values = [290021904, 927964716, 826824516, 817140688];
$gcd = array_reduce($values, 'gcd');
var_dump($gcd); // int(92)
```
SIerからみたIT技術トレンドをまとめてみた

政府は経済白書とかで「経済をけん引するIT技術は2017年はIoTとビッグデータとAIだ!」みたいなことをいっているのだけど、実際にシステム作っている現場の流行としてどーなの？と日本国内の情報システムのここ数年の技術動向を別の情報元から調べようとしたらなんかこうしっくりくるのが無い。ガートナーのハイプサイクルばっかり出てくる。

しかたないので、日本国内の大手SIerであるところのNTTデータの「[イマ旬!](https://inforium.nttdata.com/trend_keyword/)」を参考に、トレンドキーワードを AI と IoT とその他ぐらいのキーワードに分類してざっくりまとめてみた。

![tech-trends.png](https://qiita-image-store.s3.amazonaws.com/0/185984/a2e5a647-a96d-ce6a-5a79-ae38e1b9e788.png)

参考：NTTデータ イマ旬! https://inforium.nttdata.com/trend_keyword/

頻出するキーワードは大きめに、面積比とキーワード出現頻度は比例させてあります。背景色明るい色は年に5回以上、暗い色は3～4回、ロングテールに真実宿っている気がしたんだけどまとめきれんかったので無念ながら1～2回だけのキーワードは除外しています。
2017年は、まだ終わっていないので8月までのキーワードを2倍でカウントしており、なおかつ1回しか出ていないキーワードからも適当にピックアップして小さくまとめて書いてあります。途中経過からの予測としてご参考程度に。

つーことで、まあ確かにAIとIoTは伸びてますね。クラウドやDevOpsは成熟して落ち着いてきたってところなのかな。自分が働いてきた感触からもあっている気がする。セキュリティはこれから脅威が深刻化してくるので伸びるのかも、はたして。

まとめてみてわかったけど、どのキーワードをどこの分野に分類するのかって、結局記事の文脈読まないとわからないし(読んだし)、それでもなおまとめる人のさじ加減だよなあ。
というわけで、ぼくはこう分類したよ、ぐらいの資料です。
みんなもみんなの観点でまとめてみてね。

# つくりかた

イマ旬のサイトからキーワードをpython で丁寧にスクレイピング。
サイトは新旧レイアウト違いがあるのでそれぞれにがんばる。

```py
#!/usr/bin/env python
# coding: utf-8
from lxml import html
import requests

page = requests.get('http://www.nttdata.com/jp/ja/insights/trend_keyword/')
tree = html.fromstring(page.content)

item = tree.xpath('//div[@class="bass-text-A01"]/p/text()[preceding-sibling::br]')
date = tree.xpath('//p[@class="pubdate"]/time/text()')
item.pop(0)
for i in range(len(item)):
    _, keywordstext = item[i].strip().split(' ', 1)
    keywords = keywordstext.encode('utf-8').split(u'、'.encode('utf-8'))
    print ','.join(keywords) , "\t" , date[i][0:4].encode('utf-8')
```

```py
#!/usr/bin/env python
# coding: utf-8
from lxml import html
import requests

page = requests.get('https://inforium.nttdata.com/trend_keyword/')
tree = html.fromstring(page.content)

item = tree.xpath('//div[@class="block-trend-data"]/ul')
date = tree.xpath('//div[@class="block-trend-data"]/div[@class="block-trend-date"]/text()')
for i in range(len(item)):
    tmp = ','.join(map(lambda x: x.strip(), item[i].xpath('./li/a/text()')))
    print tmp.encode('utf-8') , "\t" , date[i][0:4]
```

んで、その結果を集計。

```py
#!/usr/bin/env python
# coding: utf-8
import sys
import re
from collections import Counter

counter = Counter()

for line in sys.stdin:
    line = line.strip()
    key, year = line.split('\t')
    keywords = key.split(',')
    for keyword in keywords:
        counter[year + '\t' + keyword.strip()] += 1

for word, count in counter.most_common():
    print word, '\t', count
```

```shell-session
$ cat out1.txt out2.txt | ./summary_by_keyword.py
2016    予見力  14
2016    IoT     9
2014    ビッグデータ    9
2016    人工知能        8
2013    DevOps  8
```

あとは、パワーポイントでがんばれば完成です。
ほどよく分類しながら見やすくまとめてくれる可視化ツールなんてなかった。
cakephp2でモデルのデータを更新する

公式にもreadを使った方法がちゃんと載ってないのでメモ
パスワード暗号化してると思うのでちゃんとそれも指定が必要

```php
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
//中略
$passwordHasher = new SimplePasswordHasher();
//モデルのデータを何かしらかのフィールドで指定する
$this->User->read("id",$this->Auth->user("id"));
//変更したいフィールドを指定
$this->User->set("password",$passwordHasher->hash("password"));
//そして保存
$this->User->save();
```
Ubuntu 16.04 への re:dash 導入メモ

Ubuntu 16.04 に re:dash をインストールするまで。
Ubuntu は vagrant で起動。


# Docker インストール

まず Docker インストール。Docker なしでのインストール方法は不明。

```bash
$ sudo apt-get install apt-transport-https ca-certificates

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list

$ sudo apt-get update

$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
```

# re:dash インストール
```bash

$ git clone https://github.com/getredash/redash.git

$ cd redash/setup/ubuntu/

$ sudo sh bootstrap.sh

```

# re:dash の Web コンソールに接続

クライアントから HTTP 標準ボート（80）で re:dash に接続できる。


# Data Source に踏み台を経由した DBMS を指定

## SSH トンネリング
re:dash ホスト上から SSH トンネリング接続する。

```bash:書き方
$ ssh -NL [re:dash ホストの空きポート番号]:[DBMS のホスト]:[DBMS のポート番号] 踏み台ホスト
```

以下のケースの設定例。

- 踏み台: fumidai-host.com
- 踏み台 SSH アカウント: foo
- DBMS ホスト: dbms-mysql-host.com (MySQL サーバー)

```bash
$ ssh -NL 13306:dbms-mysql-host.com:3306 foo@fumidai-host.com
```

re:dash ホスト上で上記のようなトンネリング設定をして、Data Source には以下のように指定する。

- Host: 127.0.0.1
- Port: 13306
- User: MySQL サーバーのユーザー
- Password: MySQL サーバーのパスワード

## autossh による接続維持

トンネリング切断に対応するためには、autossh を使うとよい。

```bash
$ autossh -M 0 -f -NL 13306:dbms-mysql-host.com:3306 foo@fumidai-host.com
```
SSH 秘密鍵にパスフレーズが設定されている場合、ssh-agent でキーを登録しておく必要がある。


# Data Source に Treasure Data を指定

Settings > Data Sources > 

「Type」が2つあるが、以下のように指定する。

- 上側には「TreasureData」を指定
- 下側には「hive」または「presto」を指定
GCPインスタンスにMackerelを設定する

サーバ監視ツールは世の中に色々あるけど国産（はてな作）ということもありMackerelが人気ですね。
ドキュメントもわかりやすいしサポートも親切だし、インフラエンジニアじゃなくても簡単に扱えるとあってこれは久々にヒットだなーと思います。
一昔前はNagios,Zabbixが主流だったかと（Amebaでも使ってたし）、今だとDataDogが対抗馬なんですかね？どっちも無料では5サーバまでOKでログも1日しか保存しないというところですがお好みの方を選択するといいのかなと。
ちなみに課金したときの金額はMackerelの方が安めです。

ということで、当方がGCPのサーバインスタンスにインストールしたときの手順等をまとめておきます。
ちなみにうまくいくとMackerelの画面がこんな風にわかりやすい感じになります。
![flic360make dev001 · ls flic360make (1).png](https://qiita-image-store.s3.amazonaws.com/0/1593/df608e27-c0a3-49e5-fe9d-44318d391860.png)


### ミッション
- WebサーバとDBサーバの死活監視を行う
- 何か発生都度Slackに投稿する

### Mackerelにサインアップ
`https://mackerel.io/` からサインアップしてダッシュボードを開く

#### MySQLサーバのホストIP、user、パスワードを取得

### Mackerelエージェントのインストール
api keyはMackerelのDashboardのoverviewの詳細から取得可能。
当該サーバにsshでログインしてsudo権限で以下をコールする。

```
curl -fsSL https://mackerel.io/file/script/setup-all-yum.sh | MACKEREL_APIKEY='(api key)' sh
```

### Mackerelプラグインのインストール
以下は当該サーバにログインしてsudo権限で実行する。

#### yumのアップデート
これしていないとMackerelプラグイン入れる時に見つかんなくてエラーになることがあるので必須です。

```shell-session
sudo yum clean all
sudo yum update
```
#### yumでプラグインインストール
```shell-session
sudo yum install mackerel-check-plugins
```
### mackerel-agent.confの設定

/etc/mackerel-agent/mackerel-agent.conf を以下のように設定。
api keyはMackerelのDashboardのoverviewの詳細から取得可能。
ちなみにconfはエージェントを上げ直ししないと読み込まないので注意すること（起動と停止は以下から）。

```
apikey = "(api key)"

[plugin.checks.check_httpd]
command = "check-procs --pattern httpd"
[plugin.checks.mysql_connection]
command = "check-mysql connection --host=(db server ip) --port=3306 --user=(user) --password=(db password) --warning=250 -- critical=280"
```

### mackerel-agentの起動と停止
サーバにログインしてsudo権限で以下を実行

#### 起動

```
sudo /etc/init.d/mackerel-agent start
```

#### 停止

```
sudo /etc/init.d/mackerel-agent stop
```

#### 再起動

```
sudo /etc/init.d/mackerel-agent restart
```

### Slack設定
SlackのManage appsからIncoming Webhookを選択。以下情報を取得。
投稿したいチャネルも設定すること。

![Incoming WebHooks   Slack App Directory.png](https://qiita-image-store.s3.amazonaws.com/0/1593/c39294e3-5040-d624-4b04-4dc6ce31e26c.png)

チャンネルページのSlackフォーム（ https://mackerel.io/my/channels?new=slack ）から上記のwebhookのURLを設定。

![20151222160934.png](https://qiita-image-store.s3.amazonaws.com/0/1593/72f8cb77-18e6-7a83-9a8b-8a25c1deb59b.png)

以上です。
Mackerelのエージェントとプラグインで色々設定できそうです。

ちなみにMackerelは有償版にすると外形監視といってURLの監視とかもできるみたいだから課金してもいいかもです。ではでは。