OmniAICreator/Qiita-1.07M huggingface dataset:
c++ファイルの受け取り、読み込み[ifstream,getline]

# 概要
C++でのファイルの受け取り、読み込みについて

久々にかくとわからなかったので、メモ

#　コード
入力として、以下のファイルを受け取る

```test.tsv
1   3   5   7
2   4   6   8
```

ファイルの読み込みには、ifstreamを、行単位での読み込みにはgetlineを使う、（getlineはEOF（ファイルの終了)が出ると、０を返してくれるらしく、whileの条件式に書くだけで、自動で全行の読み込みができるみたいです。

```file_read.cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char *argv[] ) {
  ifstream ifs(argv[1]);// 第一引数のファイルを受け取り
  // 行数を表示して出力する
  int line_num = 1;
  string line;
    while (getline(ifs,line)){
    cout << line_num << ":" << line << endl;
    line_num += 1;
  }
}
```

実行結果

```
$ ./a.out test.tsv 
1:1   3   5   7
2:2   4   6   8
```
Rails deviseの準備

#はじめに

Railsのdeviseの使い方を、何回かに分けてまとめます。
今回はdeviseの準備についてです。
最終的に、デフォルトのサインアップ画面とサインイン画面にアクセスできるようにします。

#deviseの準備

##gemのインストール

**bundlerを事前にインストールしています。**

GemFileに次の記述を追加します。

```:GemFile
gem 'devise'
```

ターミナルにて、次のコマンドを実行してgemをインストールします。

```
bundle install
```

##deviseの設定ファイル

###deviseの設定ファイル生成
ターミナルにて、次のコマンドを実行してdeviseの設定ファイルを生成します。

```
rails g devise:install
```

###deviseの設定ファイル編集

設定ファイルのインストール後、ターミナルに次の文章が表示されます。

```
Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views
```

表示された文章の1〜4までの設定を行います。

####1.デフォルトのURLを設定

環境ファイルにデフォルトのURLを設定します。

```ruby:config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```

####2.デフォルトのURLに対するルートを定義

1で設定したデフォルトのURLに対するアクションを定義します。
先にコントローラとビューを作成しておきます。
ターミナルにて、次のコマンドを実行します。

```
rails g controller Products index
```

デフォルトのURLに対するルートを定義します。

```ruby:config/routes.rb
root 'products#index'
get 'products/index'
```

####3.フラッシュメッセージの設定

フラッシュメッセージとは、ログイン成功時などに表示されるメッセージです。
「app/views/layouts/application.html.erb」内にフラッシュメッセージを設定します。
bodyタグの中に、指定されたpタグを2つ記述します。

```erb:app/views/layouts/application.html.erb
<body>
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>

  <%= yield %>
</body>
```

####4.deviseのカスタマイズ用のビューを生成

カスタマイズ用のビューを生成します。
デフォルトのビューを使用する場合、この作業は不要です。
ターミナルにて、次のコマンドを実行します。

```
rails g devise:views
```

###モデルの生成

ログイン時に使用するモデルを生成します。
今回はUserというモデル名で生成します。
ターミナルにて、次のコマンドを実行します。

```
rails g devise User
rake db:migrate
```

実行すると、routes.rbに「devise_for :users」が追加されます。

```ruby:config/routes.rb
devise_for :users
root 'products#index'
get 'products/index'
```
###サインアップ画面、サインイン画面にアクセス

deviseの準備が正しくできているか確認します。

####サインアップ画面

http://localhost:3000/users/sign_up

<img width="293" alt="sign_up_000.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471978/7ca8d5be-3cfd-7fbd-3fe7-e07575d376c1.png">

####サインイン画面

http://localhost:3000/users/sign_in

<img width="206" alt="sign_in_000.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471978/8ec13ec1-4f61-3e22-7aef-cd177cce2c34.png">

サインアップ画面とサインイン画面が表示されたら、deviseの準備は完了となります。

#おわりに

「rails g devise モデル名」を実行した後、routes.rbに「devise_for :モデル名」が追加されていなかったり、
「rails g devise:install」を実行したらターミナルが固まったりと色々ありました。

次はdeviseのカスタマイズをまとめようと思います。
python strip(),rstrip() の違い[memo]

ちょっと迷ったので備忘録

先頭と末尾から指定文字を削除するのがstr.strip()
末尾だけから削除するのがstr.rstrip()

参考：[python reference strip 日本語版](https://docs.python.org/ja/3/library/stdtypes.html?highlight=strip#str.strip)

>str.strip([chars])
文字列の先頭および末尾部分を除去したコピーを返します。引数 chars は除去される文字集合を指定する文字列です。 chars が省略されるか None の場合、空白文字が除去されます。 chars 文字列は接頭語でも接尾語でもなく、そこに含まれる文字の組み合わせ全てがはぎ取られます:


>str.rstrip([chars])
文字列の末尾部分を除去したコピーを返します。引数 chars は除去される文字集合を指定する文字列です。 chars が省略されるか None の場合、空白文字が除去されます。 chars 文字列は接尾語ではなく、そこに含まれる文字の組み合わせ全てがはぎ取られます:
配列メソッドの使い方色々

Rails歴の長い先輩方は配列メソッドの使い方がうまいなと日々思うので、基本的な使い方だけまとめてみました。


## ①&:(メソッドをブロックとして渡す)

```ruby
# ex. 整数→文字列に変換

numbers = [1, 2, 3, 4, 5, 6]
numbers.map(&:to_s)

> ["1", "2", "3", "4", "5", "6"]
```
→`enumメソッド`やRails`の組み込みメソッド`でよく使います！


## ②ブロックの利用(ワンライナー)

```ruby
numbers = [1, 2, 3, 4, 5, 6]
numbers.map { |n| n.to_s }

> ["1", "2", "3", "4", "5", "6"]
```

## ③ブロックの利用(do~end)

```ruby
numbers = [1, 2, 3, 4, 5, 6]
numbers.map do |n|
  n.to_s
end

> ["1", "2", "3", "4", "5", "6"]
```

## 使い分け

僕は以下のように使い分けていました。

| |                  |          用途      |
|:---------:|:----------------:|:-----------------:|
| A  | ①(&:)           |       メソッド一つで処理がすむ        |
| B  | ②({})           |    ①では対応できないが、ワンライナーでいけるくらいの長さ、または続けて配列処理したい場合    |
| C  | ③(do~end)       |   処理が複雑   |   


いくつか例にとってパターン分けしてみます！

## (例1) 複数回にわけて、メソッド処理したい

```ruby
numbers = [1, 2, 3, 4, 5, 6]
numbers.map(&:to_s).select { |n| n == '2' } 

> ["2"]
```
Bパターンですね！

## (例2) ワンライナーではすまない複雑な処理

```ruby
numbers = [1, 2, 3, 4, 5, 6]
even_num = [2, 4, 6]

numbers.each do |n|
  if even_num.include?(n)
    p '偶数'
  else
    p '奇数'
　end
end

> '奇数'
> '偶数'
> '奇数'
> '偶数'
> '奇数'
> '偶数'
```
Cパターンですね！

## ワンライナーではすまない & 追加で配列加工したい

```ruby
today = Date.today
two_months_later = today.next_month.next_month

mondays = (today..two_months_later).map { |date|
  if date.monday?
    "#{I18n.l(date)}の月曜日です"
  end
}.compact

> ["2019/08/19の月曜日です", "2019/08/26の月曜日です", "2019/09/02の月曜日です", "2019/09/09の月曜日です", "2019/09/16の月曜日です", "2019/09/23の月曜日です", "2019/09/30の月曜日です", "2019/10/07の月曜日です", "2019/10/14の月曜日です"]

```
Bパターンですね！(ワンライナーでかけそうでごめんなさい)
[Python3]配列の配列をソートする


## 環境
Python3.4で実行した。（3.7とかでも変わらないはず）

## 二つのやり方

二つのやり方がある。Operatorモジュールの方が高速。

### lambdaを使う

```python
A = [[2, 'a'], [1, 'c'], [3, 'b']]

A.sort(key=lambda x: x[0])
print(A)
# [[1, 'c'], [2, 'a'], [3, 'b']]

A.sort(key=lambda x: x[1])
print(A)
# [[2, 'a'], [3, 'b'], [1, 'c']]
```

https://docs.python.org/ja/3/howto/sorting.html#key-functions

### Operatorモジュールを使う

```python

from operator import itemgetter

A = [[2, 'a'], [1, 'c'], [3, 'b']]

A.sort(key=itemgetter(0))
print(A)
# [[1, 'c'], [2, 'a'], [3, 'b']]

A.sort(key=itemgetter(1))
print(A)
# [[2, 'a'], [3, 'b'], [1, 'c']]
```

https://docs.python.org/ja/3/howto/sorting.html#operator-module-functions

## 昇順、降順を組み合わせたソート

一つ目の要素を降順にソートする。一つ目の要素の値が同じ場合は、二つ目の要素を昇順にソートする。

```python
from operator import itemgetter

A = [[2, 'd'], [2, 'a'], [1, 'c'], [3, 'b']]
A.sort(key=itemgetter(1))
A.sort(key=itemgetter(0), reverse=True)
print(A)

# 実行結果：
# [[3, 'b'], [2, 'a'], [2, 'd'], [1, 'c']]
```
https://docs.python.org/ja/3/howto/sorting.html#sort-stability-and-complex-sorts

## メモ

破壊的にソートさせたくない場合は、`sorted`を使う。

```python
sorted(A, key=lambda x: x[0])
```

逆順で並べる。

```python
A = [[2, 'a'], [1, 'c'], [3, 'b']]
A.sort(key=lambda x: x[0], reverse=True)
print(A)
# [[3, 'b'], [2, 'a'], [1, 'c']]
```
[UE4] エディタのアイコンを小さくする

エディタ画面のアイコンが大きすぎると感じたら、下記のいずれかの方法で小さくできます。
![2019-08-18_120325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f5341e51-0f0e-535c-4ac9-b4bccc511d92.jpeg)

１．ツールバーのアイコンのみ小さくする
　　編集>エディタの環境設定から
　　Use Small Toolbar Icons をチェックします。
![2019-08-18_120527.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c13f99ad-5c97-783a-6e3c-c9996632833c.jpeg)

![2019-08-18_120601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2bfc8b60-95db-79fa-7065-3bc9c93cda9d.jpeg)

２．全体のアイコンを小さくする
　　ウインドウ>デベロッパーツール>ウィジェットリフレクタ
　　から適用スケールを選択し、値を小さくします

![2019-08-18_120942.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1f52f1df-8555-ffb5-60ef-0cdeaf2d1cb4.jpeg)

![2019-08-18_121252.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f793f3bf-95e7-8b26-bc12-141441fe2a16.jpeg)
UbuntuStudio Tips: ZFS をネットワーク越しにcloneするときssh使えっていうけどさ 

# はじめに

みなさん、ZFS使ってますか？

「そんなカッタルイもんつかってられるかいな、これからはbtrfsやろ」

そう思っていた時期が、僕にもありました、っていうかそのとおりだとは思います。

ただ、諸般の事情でzfs-fuseでファイルサーバを既に立てちゃってた場合、「あー今のHDDももう４年つかったし、そろそろ新しいサーバに移し替えたいナー」という、運用上なんともしがたい作業があるわけです！



ローカルでディスクつないでcloneすればいいんですが、たとえばraidzでHDD3本使ってたりすると、移行元と先でトータル6台もHDDをつながないといけないので、やっぱネットワーク越しにcloneするのが無難と思われます（あと、移行元のマシンは大分古いので、あんまり触りたくないですしね.....）。

で、このネットワーク越しのclone時に、Ubuntu(Studio)の場合はひと工夫必要が必要だったので、そのときの備忘録です



# 何が問題か

Oracleのマニュアル見ると「そんなん簡単でっせ、ssh使いなはれ」、と書いてあります。

https://docs.oracle.com/cd/E19253-01/819-6260/gbinw/index.html
より

```
host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana
```

えええええええええええ!!!!!、正気ですか!？(ケンドーコバヤシ風に)
問題だらけじゃないッスか!!

- デフォルトではrootにsshは許可されてない
- っていうか設定か変更すればできるけど、rootにssh許可とかセキュリティ上したくないし、そもそもsshdの設定変更して移行終わったら元に戻すのなんか嫌
- ubuntuだとrootはアカウントとして無効になってる(あくまでもロールとして提供)
- 一般ユーザでログオンしてからsudoする方法もあるけど、/etc/sudoers.dにわざわざコンフィグ書きたくない

うーん、色々設定できればできそうなんですけど、セキュリティホールになりそうだし、移行のためだけにわざわざ設定変えたくないッス

こまりました。


# ncとかいう神コマンド

そこで登場するのがtcpのパイプを作ってくれるnc(network cat)コマンドです。
必要に応じてapt install netcat でインストールしときます。
（もしかしたらデフォルトで入ってるかも）

まず最初に移行先でtcpをlistenするサーバを立ち上げます。
-Fは送られてきたデータで上書きです。初回だけつけます

```
nc -l 0 13000 | zfs recv -v -F pool/backup
```

これでポートtcp/13000に投げ込まれたストリームがzfs recvにリダイレクトされます。

そしてこんどは移行元から移行先サーバに対してストリームを投げ込みます

```
zfs send pool-old/backup@snap-20140101 | nc <移行先サーバのIP> 13000
```

コピーが完了するとサーバ側のzfs recvが完了してプロンプトが帰ってきます。
次のスナップショットを送るときはサーバ側は-Fは不要、クライアントは-iつきで差分を投げます

(2019/08/18追記)
なんか「cannot receive incremental stream: destination XXXXXXX has been modified since most recent snapshot」ってエラーで怒られることがある(たぶんatimeの都合)ので、サーバ側は２回目以降も-Fつけたほうがよさそう


サーバ側

```
nc -l 0 13000 | zfs recv -v  pool/backup
```

クライアント側

```
zfs send -i pool-old/backup@snap-20140101 pool-old/backup@snap-20140201 | nc <移行先サーバのIP> 13000
```



# おわりに

しっかし、zfsの書き込み遅いっすね。

SATA HDDx3 のraidz につくられたファイルシステム500GBぐらい移行してみたら、スループットとして5〜10MB/secぐらいしか出てない......結局全部クローンするのに20hぐらいかかりました....orz.
(わざわざ1Gbpsのハブ買ったのに!!)

リモートから入って作業しててうっかりコネクション切れちゃうと最初からやりなおしなので、作業するときはscreenコマンド必須と思います。


昔SSDで組んだZFSのアプライアンスとか出してたメーカーがありましたが、SSDだとマトモな速度(せめて30〜100MB/secぐらい出てほしいナー)で動くんですかねぇ

まぁ最近はSSDも安くなっってきたので、そのうちZFS+SSDに挑戦してみたいですねー。
HTTPプロキシでのヘッダ制御

HTTPプロキシを実装する際に、リクエスト・レスポンスヘッダをどのように扱うべきかを調査した。

#### 接続制御（Hop-by-hop）ヘッダ

接続制御ヘッダとしては、ConnectionヘッダとConnectionヘッダフィールドに列挙されるヘッダに加えて、RFC2612では単独でHop-by-hopヘッダと定義されていた以下のヘッダも考慮する必要がある。

* Keep-Alive、Proxy-Authenticate、Proxy-Authorization、TE、Trailers、Transfer-Encoding、Upgrade

接続制御ヘッダについて、プロキシではクライアントから受け取った設定値に基づいて接続処理を行い、HTTPリクエストを転送する際はプロキシ・転送先間の設定値に書き換えて送信する必要がある。

##### 参考

[13.5.1 End-to-end and Hop-by-hop Headers - RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1)

* 以下をHop-by-hopヘッダ（単一のトランスポート層の接続にのみ意味を持つヘッダ）とする。
  * Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、TE、Trailers、Transfer-Encoding、Upgrade
  * その他はEnd-to-endヘッダ（最終的な宛先に転送されるヘッダ）となる。
* その他のHop-by-hopヘッダを利用する場合はConnectionヘッダに列挙しなければならない。

[6.1 Connection - RFC 7230](https://tools.ietf.org/html/rfc7230#section-6.1)

* Connectionヘッダ以外のヘッダを接続制御に利用する（Hop-by-hopヘッダ）場合は、送信者はヘッダ名をConnectionヘッダフィールドに列挙しなければならない。
* （RFC 2616に記述されていたHop-by-hopヘッダ一覧の記載がなくなり、Connectionヘッダ以外はConnectionヘッダフィールドでの列挙が必須となった。）

#### プロキシヘッダ

プロキシはHTTPリクエストを転送する際に、Viaヘッダに自分の情報を追記（ヘッダが存在しない場合は作成して）する必要がある。

転送情報を格納する任意のヘッダとしてForwardedがRFC 7239で定義されているが、多くのプロキシ実装ではこの代替として、X-Forwarded-For、X-Forwarded-Host、X-Forwarded-Protoが使われている。

##### 参考

* [5.7.1 Via - RFC 7230](https://tools.ietf.org/html/rfc7230#section-5.7.1)
  * プロキシは転送する各メッセージに適切なViaヘッダフィールドを設定しなければならない。
  * 各転送者はViaヘッダフィールドに各自の情報をカンマ区切りで追加する。
  * 1つの転送者の情報には受信プロトコルと受信者が含まれる。
  * 例）Via: 1.0 fred, 1.1 p.example.net
* [4 Forwarded HTTP Header Field - RFC 7239](https://tools.ietf.org/html/rfc7239#section-4)
  * Forwardedは任意のリクエストヘッダフィールドであり、プロキシで失われる情報を格納する。
  * （ヘッダフィールドに格納する情報の種類についてはRFCでは定義されていない。）
  * 各転送者はForwardedヘッダフィールドに各自の情報をカンマ区切りで追加する。
  * 例）Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
* [HTTPヘッダー プロキシ - MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers#Proxies)

#### キャッシュ制御ヘッダ

プロキシでHTTPレスポンスのキャッシュを保持する場合は、以下のキャッシュ制御ヘッダを処理する必要がある。

- Age、Cache-Control、Clear-Site-Data ([Draft](https://w3c.github.io/webappsec-clear-site-data/))、Expires、Pragma、Warning

##### 参考

* [RFC 7234 HTTP/1.1 Caching](https://tools.ietf.org/html/rfc7234) 
* [HTTPヘッダー キャッシュ - MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers#Caching)

#### 未知のヘッダ・その他注意事項

プロキシは未知のヘッダについて、Connectionヘッダフィールドに列挙されていない（End-to-endヘッダ）限りは転送する必要がある。

また、ヘッダフィールドに複数の値が設定されている場合は、その順番を保持する必要がある。

##### 参考

[3.2.1 Field Extensibility - RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2.1)

* プロキシは未知のヘッダについて、Connectionヘッダフィールドに列挙されている、もしくはブロック（変換）するように設定されていない限り、そのヘッダを転送しなければならない。

[3.2.2 Field Order - RFC7230](https://tools.ietf.org/html/rfc7230#section-3.2.2)

* プロキシはヘッダフィールドに複数の値が設定されている場合、その順番を変更して転送してはならない。

#### その他の参考資料

* [Do HTTP proxy servers modify request packets? - Stack Overflow](https://stackoverflow.com/questions/10369679/do-http-proxy-servers-modify-request-packets)
[VSCode] bin/bash など、元のターミナルで使用できる keyboard shortcut を復活させる

# 発端

VSCodeで`Ctrl+E`を使ったら、わけわからんパレットが開いた（ｲﾗｯ☆彡
linuxのbashだと、カーソルがプロンプトの末尾に移動するのだが、、、
許すまじ....(`Ⅲ´#)

どうやら、VSCodeの機能のために`Ctrl+E`が使用されていて、もともとの`Ctrl+E`の動作が上書きされて消えてしまっている模様。

# やったこと

以下の記事を参考に、VSCodeによって上書きされる前の元の keyboard shortcut を復活させた。

- Visual Studio Codeで簡単にショートカットキーを変更する方法  
https://qiita.com/kinchiki/items/dabb5c890d9c57907503

## 手順概要

1. `shift+cmd+p` でコマンドパレットを開く  
windowsの人は `shift+ctrl+p` ね
2. コマンドパレットに `openkey`と打つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/fdb5799e-5aa6-85fb-44a7-30658d2b5cfb.png)
※表示される順番は人によって違うと思います。
3. `Preferences: Open Keyboard Shortcuts`を選択  
この時点で、現在有効な keyboard shortcut の一覧が表示される
4. `Type to search in keybindings`と書かれた欄（検索フォーム）に、使いたいshortcutを入力  
たとえば、`Ctrl+E`などと入力すると、そのshortcutで実行される処理が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/0e18a1de-4976-ae70-5a4b-22ea4903a1c9.png)
5. ~~くそみたいな~~気に入らないshortcutをダブルクリック  
shortcut変更フォームが現れる
6. 新しいshortcutを入力してあげる  
今回は、`Ctrl+E`の動作を消し去りたかったので、`Ctrl+Alt+E`に変更した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/0457a853-df08-6ac3-5c2d-8f6b16704941.png)  
※同じshortcutが他の処理で使用されていないかは見ておこう（shortcutが被ったらどうなるかはわかりません...）
7. Enterキー押下  
これで書き換わる

# 結果

VSCodeのterminalで`Ctrl+E`を使ってみたところ、プロンプトの末尾にカーソルが移動するようになった！(((o(*ﾟ▽ﾟ*)o)))

やはり、VSCodeが使用しているshortcutによって本来のshortcutが無効になっていたようだ。
もし、普段使っているshortcutがVSCodeで使えなくて苛立ちを感じていたら一度試していただきたい！！！^^
初めてのAtCorder

昨日、初めてAtCorderのコンテストに挑戦してみた。
pythonも初心者だし、まずはABC！と思ってたのに、初陣はAGCだった。おかげでA問題しか手をつけられず、ACも出せずじまい…。

全部WAなわけではないので、多分改良すれば通りそう。
解説みたいな漸化式とか動的計画法とか考えずにごり押ししてみたから、未来の自分が手直ししてACさせてくれることを信じてこの記事を書いてる。


考え方は、
　文字列sを関数bunkatu内でリスト化
　s[i]番目がs[i+1]と等しいかどうか。
　　等しくないときは、ansリストにs[i]を追加
　　等しいときは、s[i]とs[i+1]を結合してansリストに追加
　　　s末尾だとうまくいかないからそのときはans末尾とs[-1]を結合
　最後にlen(ans)を表示

```python3:AGC037A.py
def bunkatu(s):
    s = list(s)
    res = int(len(s))
    ans = list(s[0])
    for i in range(1,res ):
        if(s[i] != "A"):
            if(ans[-1] != s[i]):
                ans.append(s[i])
                s[i] = "A"
            else:
                if(s[i]==s[-1]):
                    ans[-1] += s[i]
                else:
                    ans.append(s[i]+s[i+1])
                    s[i+1] = "A"
        else:
            continue
    return len(ans)

s = input()

print(bunkatu(s))
```

たぶんどっかで何かが抜けてるんだろうなあ。
Goのインターフェース型がnilになるのは(nil型, 0x0)という(型, 値)ペアのときだけ

# まとめ

* 内部的にGoのインターフェースは(型, 値)という2つのペアを持つ。
* インターフェース型がnilになるのは(nil型, 0x0)という(型, 値)ペアのときだけ。

[GoのFAQ](http://golang.jp/go_faq#nil_error)にて言及されています。

> nilとerror型のnilとがイコールにならないのは?
> 内部的にインタフェースは「型」と「値」の2要素から成ります。この「値」は実際の任意な値であり、インタフェースの「動的な値」と呼ばれます。「型」はその値の型です。仮に、あるインタフェース値がint型の3であるとき(int, 3)と表すとします。
> インタフェースの値がnilとなるのは、内部の値と型がともにセットされていないとき(nil, nil)だけです。詳しく述べれば、nilインタフェースは常にnil型を保持しています。ポインタ型である*intをインタフェース内に格納したとき、ポインタの値に関わらず内部の型は*int(*int, ?)になります。ポインタの値がnilであっても、このインタフェース値はnilにはなりません。

# [検証コード](https://play.golang.org/p/kN_fNSUZcLS)

```go
package main

func main() {
	var x *int32 = nil
	var y *int64 = nil

	// xとnilの比較は値同士なので一致
	println(x == nil) // true

	// xとyはそれぞれ(*int32, nil), (*int64, nil)
	// のペアのインターフェース型へキャストされる。
	xx := interface{}(x)
	yy := interface{}(y)
	println(interface{}(x)) // (0x94b60,0x0)
	println(interface{}(y)) // (0x94ba0,0x0)
	// ペアの中身が違うのでxxとyyの比較は不一致
	println(xx == yy) // false
	// xx,yyは(nil, nil)ペアではないのでnilとの比較は不一致
	println(xx == nil) // false

	// 【ちなみに】 nilはnil値を持てる型へキャストできる
	// nilはnil値の型*int32へキャスト可
	println((*int32)(nil)) // 0x0 (<- nil)
	// 型int32はnil値を持てないのでキャスト不可
	// e := (int32)(nil) // コンパイルエラー
}
```

```terminal:出力
true
(0x94b60,0x0)
(0x94ba0,0x0)
false
false
0x0
```

# 参考

* https://qiita.com/umisama/items/e215d49138e949d7f805
文字コード周辺情報をまとめてみた

機種依存文字チェックを行う必要があり、その際に文字コードはなんのためにあるのか
どんな仕組みで文字が表示されるか明確にわかっていなかったので、概念理解のために調べたことをまとめてみました。

# 文字コードとは？

文字を表示するために必要なコード。
文字は、PC上ではビット列で管理されていて、これを文字コード(表)を用いて文字に変換することで表示しています。

この文字変換コードを隣のコードと合わせて読み込み誤認識したり、文字変換表にないビット列を読み込むと、「文字化け」になります。  

# 符号化文字集合と符号化方式

文字コードは「文字符号化方式」を使って、ビット列をPCが読み取れるデータ列に変換します。

## 符号化文字集合

>符号化文字集合 (coded character set) ，符号 (code) 文字集合を定め，かつ，その集合内の文字と ビット組合せとを 1 対 1 に関係付ける，あいまいでない規則の集合

日本語の符号化文字集合として重要なものを表にまとめました。

|文字コード|概要|ビット桁数|収録文字数|規定文字|
|:--|:--|:--|:--|:--|
|ASCII|ラテン文字を中心とした文字コード|7ビット単位1バイト|128文字|英数字と一部の記号|
|JIS X 0201|JISにおける最も古い文字コード|7ビット及び8ビット単位1バイト|192文字(制御文字：32文字)？|ラテン文字と片仮名|
|JIS X 0208(Shift-JIS)|日本語基本文字コード規格|7ビット単位2バイト|6,355字|基本文字コード 第1水準（2,965字）・第2水準（3,390字）|
|JIS X 0213|JIS X 0208の拡張規格|7ビット単位2バイト|10,050字|JIS X 0208へ第3水準（1,259字）・第4水準（2,436字）を追加した拡張規格|
|Unicode|全世界の文字の収録を目的とした文字コード|8ビット単位の1〜4バイト|？|日本語文字はほとんどをカバーしているが、一部含まれていない例外文字もある|

日本語の漢字の表示は、JIS X 0201 → JIS X 0208 → Unicodeと 符号化文字集合を作ることで
改善されてきた経緯があります。  

ただ、現在もメール送付は、ISO-2022JP(JIS X 0208)の漢字を使う方法が主流です。  
また、JIS X 0208に含まない第3・第4水準の漢字をメールに使うと文字化けする可能性があります。  

## 文字符号化方式

>文字符号化方式（もじふごうかほうしき、英: character encoding scheme、CES）とは、符号化文字集合で文>字に対応付けた非負整数値を、実際にコンピュータが利用できるデータ列（通常、バイト列）に変換する符号化方式。

一般的な文字コードは、この符号化方式にあたります。

```
Shift_JIS
EUC-JP(Unix系OS)
UTF-8
UTF-16
```

UTF-＊は、Unicodeを実装。  
Shift_JISやEUC-JPは、JIS X 02**を実装し、文字コードとして定義しています。  

### Shift_JISの別名称

Shift_JISの名称として他に、CP932、Windows-31J、MS932というものが存在しています。  
ベンダーの独自拡張を統合した文字コードとして、名前がつけられており、システム開発時に
文字コードを指定する際に、別名称で指定する場合があります。

詳細は以下の表に記載しました。

|文字コード|説明|
|:--|:--|
|Shift_JIS(CP932)|1982年に作成されて日本語を表示できる文字コード|
|CP932|Shift_JISをマイクロソフトが独自拡張して、管理番号CP932とした文字コード|
|Windows-31J(MS932)|IBM,NECが独自拡張したCP932を統合してWindows3.1日本語版発売時に作成した文字コード|
|MS932|IBM,NECが独自拡張した文字が統合されたShift-JISで、CP932と区別するためにつけられたWindows-31Jの別名称|

# 機種依存文字

機種(OS)毎で、表示できたりできなかったりする文字です。
Windowsでは表示できるけど、Mac OSXでは表示できなかったりします。

Shift_JISでは、文字集合 JIS X 0208以降にIBMやNECなどによって独自拡張されたエリアの文字は機種依存文字となっている場合が多いです。

ただ、Unicodeの文字集合で実装された文字コード(UTF-8など)では、
Windowsなどで機種依存文字であっても、UTF-8は別機種でも異なるコードを指定することがないため、表示可能となっています。
未収録の文字に関しては、もちろん文字化けしてしまいますが。。

## Shift_JISにおける機種依存文字

Shift_JISにおける以下のエリアは、誤認識して文字化けしたり、独自拡張された文字が存在しているエリアです。
この文字が使われていないかチェックすることでShit_JISにおける文字化けの多くを回避することができます。

|禁止区域名|Shift_JISコード|説明|
|:--|:--|:--|
|半角カナ文字エリア|00A0～00FF|使用厳禁、ASCII コードと重複するエリア|
|特殊文字エリア|8540～889E|機種依存文字の主なエリア|
|縦文字エリア|EB40～EFFC|第２水準漢字の後部（MacOS では縦書用文字、Windows では特殊な外字）|
|外字エリア|F040～|JIS外字エリア|

### 外字と内字

文字コード規格やフォントに収録されている文字を「内字」と呼びます。
それ以外の収録されていない文字は「外字」と呼ばれます。

Shift_JISにおいて外字エリアが存在しているが、このエリアは規格外の領域のため、機種依存文字が割り当てられている場合が多いです。  

# 文字コードとフォント

もう一つ気になるのが、文字コードとフォントの関係。
どちらもデータ列から文字に変換する変換表という意味で共通しています。

ただ、以下のようにそもそも用途が異なり、種類数が全然違います。

```
文字コード：ビット列を文字として表示する。数種類しかない
フォント：ビット列を文字の形やデザインを考慮した文字として表示する。日本語でも数千以上存在する
```

# 文字化け

ここまで見てきた情報をまとめると、文字化けしないためには、以下を満たす必要があります。  

- 送信元、先で同じ文字コードを扱っている
- 機種依存文字ではない
- 使用フォントの中に該当文字が実装されている

繰り返しになりますが、同じ文字コードでも機種依存文字は、機種(OS)毎にコードが異なるため、認識できない、もしくは別の文字が表示されてしまう場合があります。  

## フォント・フォールバック

ただフォント未実装に関する文字化けは、意識する必要はなくなってきています。

Windows、Mac OS Xなどの最新OSでは、
フォントに実装されていなくても、他のフォントに表示を代替させる仕組みを実装しています。

ただし、異なるフォントが使われ、思わぬ表示結果になることもあるため、その点は注意が必要です。
Unityでよくみる MonoBehavior とは？

Unity を使い始めたら知らない単語に出くわします！
それが <font color="DeepPink">MonoBehavior !</font> 

<font color="DeepPink">MonoBehavior </font> てまじなんなんだ？？ってずっと思ってました。そこで今回は、<font color="DeepPink">MonoBehavior </font>  について調べてみました。

#Unity公式マニュアルの説明


>* MonoBehaviour is the base class from which every Unity script derives. （MonoBehaviourは、すべての Unity のスクリプトが由来する基礎的なクラスです。）

>* When you use C#, you must explicitly derive from MonoBehaviour.（C#を利用する場合、MonoBehaviourから明確に派生させなければならない。）

なんかようわからんけど、Unity使うときには絶対使う基礎的なクラスなんだって！
だから勝手に削除したりしたら動かなくなるよ。

#Behavior
そもそもなんですが、普通の [Behavior] (https://docs.unity3d.com/ja/2018.2/ScriptReference/Behaviour.html) もあるんです。
Unity が用意してくれている Behavior 。

ってことは、<font color="DeepPink">MonoBehavior </font> っていうのは、<font color="DeepPink">Mono</font> の　Behavior　だよね。

次に <font color="DeepPink">Mono</font>  について調べてみた。

#Monoとは？
[Mono](https://www.mono-project.com/download/preview/) は、Microsoft の提供する .NET Framework のオープンソフトウェアです。
なるほど、C#の生みの親の Microsoft が用意してくれているソフトウェアなんですね。

Monoの公式ホームページから引用してみましょう。
>Mono is a software platform designed to allow developers to easily create cross platform applications part of the .NET Foundation.（Monoは、開発者が.NET Foundationの一部であるクロスプラットフォームアプリケーションを簡単に作成できるように設計されたソフトウェアプラットフォームです。）


#MonoBehaviour を継承すると、何がいいの？
Unityでスクリプトを作成したら、以下のようなスクリプトがすでに記述された状態ででてきます。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ABC : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

```

もっと切り分けてみてみよう。ほいっ！

```C#
public class ABC : MonoBehaviour {

}
```

「ABC という class は、MonoBehaviour クラスを継承します。」という意味です。

もっと切り分けてみましょう。ほいっ！


```C#
 : MonoBehaviour 
```

ポイントはここです！「:〇〇」で「〇〇を継承します！」
継承って何だという感じですが、
そのクラスの持っている機能をまるごと使わせてもらうってことだよ。

#おわり
いかがでしたでしょうか。

みなさんの MonoBeaviour に対する理解が深まったらいいねしてくださるとうれしいです。
rbenvでrubyのバージョンを変更する手順

#以下手順でrubyのバージョンを切り替えられる

###①ruby一覧確認
`$ rbenv install --list`

###②指定のrubyインストール
`$ rbenv install 2.2.0`

###③インストールできたか確認
`$ rbenv versions`

###④インストールしただけなので、インストールしたバージョンに切り替える
`$ rbenv global 2.2.0`

###⑤また確認し米印ついてれば指定できている。
`$ rbenv version`


###その他補足
#####localは、プロジェクトで使用するrubyのバージョンを指定
`$ rbenv local 2.2.2`
→プロジェクトで使用するrubyのバージョンを指定する。

#####globalはシステム全体で使用するデフォルトのrubyバージョンを指定するもの。

参考
https://qiita.com/makoto_kw/items/cc73b628c9ef039f6e6f#globallocalshell
https://qiita.com/hujuu/items/3d600f2b2384c145ad12
【Python】オブジェクト指向プログラミング基礎vol.5～クラスメソッド・スタティックメソッド～

Pythonはすべてがオブジェクトであるので、**関数の引数として関数を渡すこともできる**

```python
def diagonal():
    return "ななめ"

def straight(line):
    return line

def draw_line(func):
    def wrapper(*args, **kwargs):
        return "線は" + func(*args, **kwargs)
    return wrapper


draw_diagonal = draw_line(diagonal)
draw_straight = draw_line(straight)
print(draw_diagonal())
print(draw_straight("まっすぐ"))
```

実行結果

```
線はななめ
線はまっすぐ
```

- draw_line関数には関数のオブジェクトが引数として渡されている
- draw_line関数の戻り値は、draw_line関数内で定義されたwrapper関数
- wrapper関数の中の処理では、引数（func）として受け取って関数を呼び出している
-  \*\*argsと\*\*kwargsはそれぞれ、任意の数の引数・任意の数のキーワード引数という意味
- 引数として受け取った関数の戻り値に「線は」という文字を追加している

このように関数を引数とする関数を定義することで、**すでにある関数に機能を追加することができる**。

このような関数をデコレ―タという。

デコレ―タは、「**@デコレ―タ名**」と、修飾する関数の上に書くことでも利用できる。

```
@機能追加の関数（デコレ―タ）
def 機能追加したい関数():
    処理
```

```python
def draw_line(func):
    def wrapper(*args, **kwargs):
        return "線は" + func(*args, **kwargs)
    return wrapper

@draw_line
def diagonal():
    return "ななめ"
@draw_line
def straight(line):
    return line

print(diagonal())
print(straight("まっすぐ"))
```

実行結果

```
線はななめ
線はまっすぐ
```

デコレ―タは上のように自分で定義できるほかにも、Pythonにあらかじめ用意されているものや、モジュールとして提供されているものがある。

## クラスから使える関数

クラス変数があるように、**クラス関数**もある。

よく使う関数群をまとめたクラスを定義するときに活用される。

```python
class Calculation:
    @classmethod
    def class_bmi(cls, weight, height):
        assert cls.__name__ == Calculation.__name__
        return weight / height ** 2
    
    @staticmethod
    def static_bmi(weight, height):
        return weight / height ** 2
    
print(Calculation.class_bmi(60, 1.70))
print(Calculation.static_bmi_bmi(60, 1.70))
```

実行結果

```
20.761245674740486
20.761245674740486
```

インスタンスメソッドとの区別をつけるため、関数の頭に`@classmethod`か`@staticmethod`をつけることになっている。

- `@classmethod`: クラスメソッド
- `@staticmethod`: スタティックメソッド

インスタンスを作る必要がないので、どちらも`クラス名.関数名`で呼び出す。

### クラスメソッドとスタティックメソッドの違い

クラスメソッドはメソッドのselfと同じで、第一引数に自動的に自身のクラスが格納される。スタティックメソッドの場合は、その代入はない。

- クラスの情報が必要な場合は、`@classmethod`を使う。
- 派生クラスでオーバーライドする場合も、`@classmethod`を使う。
- クラスの情報が不要で、派生クラスでオーバーライドしない場合は、`@staticmethod`を使う。



## クラスメソッドの`cls`とは

クラスメソッドの`cls`は、クラスそのものである。

`assert cls.__name__ == Calculation.__name__`では、名前が同じことを確認している。

`Calculation.__name__`はクラス名(`Calculation`)になる。
Jetson NanoのVNCServer設定

# 個人メモ
Jetson nano のVNCServerの初期設定に少々躓いたので，メモする．
@iwatake2222　さんの記事が非常に参考になった．
https://qiita.com/iwatake2222/items/a3bd8d0527dec431ef0f

# 問題
一通り初期設定は済み，クライアント側からJetson NanoにVNC接続することは出来た．
しかし，Jetson Nanoに接続しているHDMIケーブルを外して接続を試みたところ，解像度が低くなり，クライアント側の画面に収まらなくなるという症状が確認された．

# 解決策
フレームバッファが確保されないためのようだ．
https://devtalk.nvidia.com/default/topic/995621/jetson-tx1/jetson-tx1-desktop-sharing-resolution-problem-without-real-monitor/
/etc/X11/xorg.conf　ファイルの末尾に以下のように記述するとよい．

```
Section "Monitor"
   Identifier "DSI-0"
   Option    "Ignore"
EndSection

Section "Screen"
   Identifier    "Default Screen"
   Monitor        "Configured Monitor"
   Device        "Default Device"
   SubSection "Display"
       Depth    24
       Virtual 1280 800
   EndSubSection
EndSection
```
# 参考

https://qiita.com/iwatake2222/items/a3bd8d0527dec431ef0f

https://devtalk.nvidia.com/default/topic/995621/jetson-tx1/jetson-tx1-desktop-sharing-resolution-problem-without-real-monitor/
2019-08-18 STM32F769 Discovery Kit > FreeRTOS + UDP > 一パケットしか処理されない > 解決のめどが立たない

```txt:動作環境
Ubuntu 18.04 LTS
(STM32CubeMX v5.2.1)
STM32CubeIDE v1.0.1
LwIP: v2.0.3
Firmware: STM32Cube FW_F7 V1.15.0
基板: STM32F769 Discovery Kit
(Ethernet PHY:  LAN8742A-CZ-TR from MICROCHIP @ UM2033 Rev 6 p19 6.11 Ethernet)
```

### 概要

- FreeRTOS + LwIPを使用
- UDP echo serverを実装しようとしている
- 成功しない


### 状況

- pingは通る
- UDPの受信は一回だけ成功し、二回目から無応答になる
    - pingは通る

### 情報

以下にEthernet通信に関するFirmwareの安定性の議論がされている。
H7についてであるが、過去のバージョンのFirmwareであれば安定していた、とのこと。

- [Need help to run Ethernet communication correctly with STM32H7 nucleo?](https://community.st.com/s/question/0D50X0000A4nCOmSQM/need-help-to-run-ethernet-communication-correctly-with-stm32h7-nucleo)

以下にもUDP通信の不安定についてのやりとりがある。

- [STM32H743 Nucleo - Ethernet stops working](https://community.st.com/s/question/0D50X00009ZExEkSAL/stm32h743-nucleo-ethernet-stops-working)

自分の症状がFirmwareに起因するか不明であるが、解決のめどが立たない。

こちらで取得可能なFW_F7はV1.14.0とV1.15.0。 STM32CubeIDEを使う場合はV1.15.0固定になりそう。
STM32CubeIDEを使わない場合はV1.14.0を使用できるかもしれないが、それは将来の作業効率を落とす。
V1.14.0だと安定する、という情報もない。
サブシェルやパイプラインの途中で失敗した場合に直ちにエラーコードを返すようにする

## はじめに

CI などのマネージドサービス上でシェルスクリプトを動かしている場合、スクリプトの実行に失敗したにもかかわらず、表示上は Success となっているような不具合に遭遇することがあります。

原因を調査してみると、 **外部コマンドの失敗時に、シェルスクリプトがエラーコードを返していない** ことが原因だったりします。

要はシェルスクリプトのエラーハンドリングが適切にされていないことが原因なのですが、かといって、毎回コマンド実行の末尾に ` .. command .. || exit 1` を書くのは面倒ですし、コードの可読性が低下してしまいます。

**シェルスクリプト中の外部コマンドの実行に失敗したときに、呼び出し側のスクリプトの処理を中断し、エラーコードを返す** ことができると楽ですよね。

`set` コマンドを使って bash にこのような振る舞いをさせることができます。

## サンプルスクリプト

例があるほうがわかりやすいと思いますので、以下のようなスクリプトを使って説明します。

task.sh

```bash
#!/bin/bash

./hello.sh

echo success!

exit 0
```

hello.sh

```bash
#!/bin/bash

echo "hello!"

exit 1 # 明示的に「失敗」を表すエラーコードを返す
```

### サンプルスクリプトの実行結果

task.sh を実行した結果は、以下のように「成功」となります。

```
bash-5.0$ ./task.sh
hello!
success!
bash-5.0$ echo $?
0
```

## 外部コマンドの処理失敗時にエラーコードを返す

論理演算子 `||` を使って、 **コマンドの実行が失敗した場合にエラーコードを返す** ことができます。

* `.. command .. || exit 1`

### シェルスクリプト

task.sh

```bash
#!/bin/bash

./hello.sh || exit 1

# ..後続の処理はそのまま..
```

### 実行結果

```console
bash-5.0$ ./task.sh
hello!
bash-5.0$ echo $?
1
```

## bash のデフォルトの振る舞いを変更する

毎回コマンド実行の末尾に ` .. command .. || exit 1` を書く方法でもやりたいことは実現できますが、書き漏らしてしまう可能性があります。また、コードの可読性が低下してしまいます。

**シェルスクリプト中の外部コマンドの実行に失敗したときに、呼び出し側のスクリプトの処理を中断し、エラーコードを返す** ことができると楽ですよね。

`set` コマンドを使って bash にこのような振る舞いをさせることができます。

## 外部コマンドの失敗時に即座にエラーコードを返す

`set -e` というコマンドを実行すると、**外部コマンドの実行に失敗に、直ちにエラーコードを返す** ことができます。

* -e: スクリプト中で失敗した場合にただちにエラーコードを返す

```bash
set -e
```

より詳細な説明は参考資料[1]を参照してください。

### シェルスクリプト

task.sh

```bash
#!/bin/bash

set -e

# .. 後続の処理はそのまま ..
```

hello.sh はそのまま。

### 実行結果

実行結果は「失敗」になります。
また、 hello.sh の処理に失敗した後、後続の処理（`echo success!`）が実行されていないのもわかります。

```console
bash-5.0$ ./task.sh
hello!
bash-5.0$ echo $?
1
```

## パイプラインの途中で処理に失敗した場合の対応

`set -e` を指定することで、外部コマンドの失敗時のエラーハンドリングをサボることができました。

ところが、外部コマンドの結果をパイプラインで処理させている場合は想定どおりの振る舞いをしないことがわかります。

### シェルスクリプト

hello.sh の実行結果を `grep` してみます。

task.sh

```bash
#!/bin/bash

set -e

./hello.sh | grep hello

# .. 後続の処理はそのまま ..
```

### 実行結果

task.sh の実行結果は意に反して「成功」となります。

```console
bash-5.0$ ./task.sh
hello!
success!
bash-5.0$ echo $?
0
```

## パイプの途中で処理に失敗した場合も適切に処理する

パイプの途中で失敗した場合にも、 「失敗」と判断させたいです。
これも `set` を使ってでできます。

* -o pipefail: パイプラインの途中で失敗した場合、パイプライン全体のコマンドの結果を失敗したコマンドのエラーコードにする

```bash
-o pipefail
```

### シェルスクリプト

task.sh

```bash
#!/bin/bash

set -e
set -o pipefail

./hello.sh | grep hello

echo success!

exit 0
```

### 実行結果

パイプラインの途中で失敗した場合も、「失敗」と判定されるようになりました。

```console
bash-5.0$ ./task.sh
hello!
bash-5.0$ echo $?
1
```

## 参考: shebang で指定する

shebang や bash の起動オプションで指定しても同じことができます。

task.sh

```bash
#!/bin/bash -e -o pipefail
# .. 後続の処理はそのまま ..
```

```console
bash-5.0$ ./task.sh
hello!
bash-5.0$ echo $?
1
```

## まとめ

* bash のパラメータを指定することで **外部コマンドの実行やパイプラインの途中で失敗した場合に即座にエラーコードを返す** ことができる
 
```
set -e
set -o pipefail
```

CI などのマネージドサービスでシェルスクリプトを実行させる場合に、知っておくと便利な Tips です。

## 参考資料

1. [Bash Reference Manual - 4.3.1 The Set Builtin](https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html)
2. [stack overflow - How to exit if a command failed?](https://stackoverflow.com/questions/3822621/how-to-exit-if-a-command-failed)
Go言語でバックスラッ シュの次の文字は小文字化しない

# やりたいこと
文字列中の **バックスラッシュの次の文字** 以外を小文字にします。
**バックスラッシュ次の文字** は小文字は小文字のまま、大文字は大文字のままにします。
要はバックスラッシュをエスケープシーケンスと見立てて、バックスラッシュの次の文字以外に対して`ToLower()`を適用する関数を作りたいのです。



# やり方1: runeのインデックスを取得
[Goのruneを理解するためのUnicode知識](https://qiita.com/seihmd/items/4a878e7fa340d7963fee)を参考にバックスラッシュが入るruneのインデックスを取得し、そのインデックス以外に`unicode.ToLower(r)`をすることで **バックスラッシュの次の文字** 以外の小文字化に成功しました。

```go
package main

import (
	"strings"
	"unicode"
)

func runeIndex(s string, r rune) int {
	bi := strings.IndexRune(s, r)
	return len([]rune(s[0:bi]))
}

// ToLowerExcept : ToLower string Except specific rune
func ToLowerExcept(s string, r rune) (string, int) {
	bspos := runeIndex(s, r) + 1 // Next position of `r`
	runes := []rune(s)
	for i, r := range runes {
		if i != bspos { // to LOWER except next position of `r`
			runes[i] = unicode.ToLower(r)
		}
	}
	return string(runes), bspos
}
```

しかしながら、このやり方ではsにバックスラッシュが複数入る場合、最初の **バックスラッシュの次の文字** にしか対応しておらず、2つ目以降の **バックスラッシュの次の文字**　は小文字化されません。


# やり方2: バックスラッシュで分割する
最初はやり方1で作った`ToLowerExcept()`を使って再帰的に処理しようかと思ったのですが、頭が煮詰まってしまったので断念しました。

プログラミングで煮詰まったときは一度寝ることが最速に解にたどり着く方法です。一度眠ってから起き抜けに思いついた方法として、 **バックスラッシュで区切り、最初の一文字以外を小文字化** する方法をひらめきました。

`strings.Split(s, "\\")`でバックスラッシュで区切り、返された`[]string`の最初の文字以外をToLowerしていく関数がこちら。

```go
package main

import (
	"strings"
	"unicode"
)

// ToLowerExceptFirst : To lower except first of runes
func ToLowerExceptFirst(s string) string {
	runes := []rune(s)
	for i, r := range runes { // to LOWER except first position
		if i != 0 {
			runes[i] = unicode.ToLower(r)
		}
	}
	return string(runes)
}

// ToLowerExceptAll : ToLower string Except specific rune for whole words
func ToLowerExceptAll(s string, r rune) string {
	st := strings.Split(s, "\\")
	for i, si := range st {
		st[i] = ToLowerExceptFirst(si)
	}
	return strings.Join(st, "\\")
}
```

余談ですが、`ToLowerExcept()`関数をすべてのバックスラッシュに適用するからstringsパッケージやregexpパッケージの命名法に習って`ToLowerExceptAll()`という名前にしましたが、**All** の **Except** ってなんでしょうね。

*「すべて以外」とは...(哲学)*


テストがこちら。

```go
package main

import "testing"

func TestRuneIndex(t *testing.T) {
	s := "あtTの5\\UW"
	actual := RuneIndex(s, '\\')
	expect := 5
	if expect != actual {
		t.Fatalf("got: %v want: %v", actual, expect)
	}
}

func TestToLowerExcept(t *testing.T) {
	s := "あtTの5\\UW"
	actual := ToLowerExcept(s, '\\')
	expect := "あttの5\\Uw"
	if expect != actual {
		t.Fatalf("got: %v want: %v", actual, expect)
	}
}

func TestToLowerExceptFirst(t *testing.T) {
	s := "SあtT5\\Uほw\\dHo\\T"
	actual := ToLowerExceptFirst(s)
	expect := "Sあtt5\\uほw\\dho\\t"
	if expect != actual {
		t.Fatalf("got: %v want: %v", actual, expect)
	}
}

func TestToLowerExceptAll(t *testing.T) {
	s := "\\SあtT5\\Uほw\\dHo\\T"
	actual := ToLowerExceptAll(s, '\\')
	expect := "\\Sあtt5\\Uほw\\dho\\T"
	if expect != actual {
		t.Fatalf("got: %v want: %v", actual, expect)
	}
}
```

手元での動作確認用go playgroundがこちら。
[The Go Playground](http://play.golang.org/p/QcXaH_BxJAI)
データベース　用語①

データベース用語
1...Datebase
2...table
3...Row
4...column

これらを纏めてSQL(Structured Quary Language

webサービスを作る際、一つのアプリにデータベースを一つ作っていく。２のtableの中に3のRow(レコード),4のcolumn(フィールド)を複数扱っていく

図の説明だと
DetaBase
 *table
    *レコード(テーブルの列)
    *フィールド(テーブルの行)
php-master-changes 2019-08-17

今日は arginfo の PHP スタブへの移行、 intl の修正、ZPP エラー時の不要なエラー通知の削除、double free の修正、typo の修正があった！

# 2019-08-17
## kauanslr: Creating stub for ext bz2
- https://github.com/php/php-src/commit/eec89ec066b7d01df32884ccd976139316304b0c
- ext/bz2 で、arginfo を PHP スタブへ移行

## sgolemon: Revert "Move to non deprecated API on suitable ICU versions"
- https://github.com/php/php-src/commit/9b9814fa774eb9e4b8c51721324e708e2b1aa30e
- [7.3~]
- ext/intl で、[昨年に行われた修正](https://github.com/php/php-src/commit/13a2f2d041999dca0066542f2a552798fab9a13d) のリバート
- よう分からんがなんかうまく動かんかったらしい

## cmb69: Don't explicitly set return value on ZPP failure
- https://github.com/php/php-src/commit/1f49b1df507787833cef12b63c2fcd022453c19e
- ext/enchant で、ZPP エラー時 8.0 では例外を投げるため不要となった RETURN_FALSE を削除

## cmb69: Don't explicitly set return value on ZPP failure
- https://github.com/php/php-src/commit/2d1f371871ef5afee6b2d683c760b25c8b147c66
- ext/bz2 で、ZPP エラー時 8.0 では例外を投げるため不要となった RETURN_FALSE を削除

## sgolemon: Suppress deprecation warning on IDNA2003 ICU methods
- https://github.com/php/php-src/commit/725f439778a6397267fbb4e88059d704cccbc7f3
- [7.2~]
- ext/intl で、IDNA2003 の ICU メソッド利用による警告の抑制

## Girgias: Remove useless error check for bin2hex()
- https://github.com/php/php-src/commit/2505edb40d951d8dc312346fba9dfa965997b250
- bin2hex の不要な RETURN_FALSE を削除

## nikic: Fixed bug [#77922](https://bugs.php.net/bug.php?id=77922)
- https://github.com/php/php-src/commit/be7e819068985859f92e4af21e49b4f647dd0467
- [7.3~]
- シャットダウン処理で、継承先がある場合に private プロパティの doccomment の情報が二重解放される問題の修正

## kawanet: Fix typo: environement [ci skip]
- https://github.com/php/php-src/commit/7602169d7c0ec17390f399c96edb4a4155379913
- sapi/fpm で、www.conf.in の typo を修正

## cmb69: Don't explicitly set return value on ZPP failure in ext/calendar
- https://github.com/php/php-src/commit/f50c4607231860384223f8ddb59b07deeab200f7
- ext/calendar で、ZPP エラー時 8.0 では例外を投げるため不要となった RETURN_FALSE を削除
Jetson nanoでyolov3,yolov3-tinyを動かすメモ

####kerasのインストール
```
sudo apt install libatlas-base-dev gfortran
sudo pip3 install scipy
sudo pip3 keras
```
####keras-yolo3リポジトリ
```
git clone https://github.com/qqwweee/keras-yolo3
```
####weights
YOLOv3

```
wget https://pjreddie.com/media/files/yolov3.weights
```
YOLOv3-tiny

```
wget https://pjreddie.com/media/files/yolov3-tiny.weights
```
####weightsのコンバート
YOLOv3

```
python3 convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
```
YOLOv3-tiny

```
python3 convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/yolo-tiny.h5
```

####カメラ入力部分の修正※Raspberry Pi Camera Moduleの場合
```yolo.py
def detect_video(yolo, video_path, output_path=""):
    import cv2
    GST_STR = 'nvarguscamerasrc \
    ! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \
    ! nvvidconv ! video/x-raw, width=(int)416, height=(int)416, format=(string)BGRx \
    ! videoconvert \
    ! appsink'
    WINDOW_NAME = 'Camera Test'
    vid = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)
#    if video_path.isdigit():
#        video_path = int(video_path)
#    vid = cv2.VideoCapture(video_path)
    if not vid.isOpened():
```
※USBカメラの場合はvid = cv2.VideoCapture(0)

###parser文字列の修正（３ヶ所）
```yolo_video.py
#    '--model', type=str,
    '--model_path', type=str,

#    '--anchors', type=str,
    '--anchors_path', type=str,

#    '--classes', type=str,
    '--classes_path', type=str,
```
####実行　※GUI環境
YOLOv3 FPS=1　※重くてvideo出力がハングアップ状態になることがある

```
python3 yolo_video.py
```
YOLOv3-tiny FPS=4

```
python3 yolo_video.py --model_path model_data/yolo-tiny.h5 --anchors_path model_data/tiny_yolo_anchors.txt
```

####その他
「importerror: The _imagingft C module is no installed」の対処

```
sudo apt-get install libfreetype6
sudo apt-get install libfreetype6-dev
sudo pip3 uninstall Pillow
sudo pip3 install Pillow
```
Node.jsで同期的にCSV生成を行う(Sync API)

## node-csvを使って、同期的にCSV生成を行う(Sync API)

調べてみたところ、意外とCSV生成に関する同期的な処理の情報が見つからないように思えたので、備忘録として残しておきます。
(`Callback API`や`Stream API`を使ったやり方については見つかりました)

ちなみに`Callback API`も`Stream API`も、今回書く`Sync API`を使った方法も、下記の公式ドキュメントを見れば一発で見つかるので、そもそも下記のリンクを見れば解決できます。

[CSV Stringify API](https://csv.js.org/stringify/api/#sync-api)

ここでは、せっかく調べたので同期処理(Sync API)を用いた場合のcsv生成サンプルを書いておこうと思います。


## node-csvを使う

使用するライブラリは[node-csv(github)](https://github.com/adaltas/node-csv)を使います。

公式サイトは[こちら(CSV for Node.js)](https://csv.js.org/)

インストールは下記のコマンドで行います。

```bash
yarn add csv
# or 
npm install csv
```

ただ、こちらはパッケージが `csv-generate` , `csv-parse` , `stream-transform` , `csv-stringify` に分かれているので、node-csvの機能をフルに使うとかでない限りは個別にインストールすることでも要件は満たせます。

CSV生成には `csv-stringify` を使うので、今回の場合インストールは下記のコマンドとなります。

```bash
yarn add csv-stringify
# or 
npm install csv-stringify
```

ここらへんの説明については、ググると結構ヒットする気がしているので、割愛します。


## csv-stringifyを使ってCSV生成を行う

`Sync API`を使う場合、`require("csv-stringify/lib/sync")`という形で読み込む必要があります。

サンプルコードです。

```node.js
const fs = require("fs");
const stringify = require("csv-stringify/lib/sync");

const data = [
  {
    id: 1,
    name: "hoge",
    age: 17
  },
  {
    id: 2,
    name: "fuga",
    age: 21
  },
  {
    id: 3,
    name: "piyo",
    age: 13
  }
];

const csvData = stringify(data, { header: true });
fs.writeFileSync("./sample.csv", csvData);
```

上のコードを実行すると、下記のような`CSV`ファイルがカレントディレクトリに生成されます。


```csv
id,name,age
1,hoge,17
2,fuga,21
3,piyo,13
```

`Object`の項目名がそのままカラム名として処理されているのがわかるかと思います。

## CSVのカラム名の生成ルールについて

ちなみに`csv-stringify`の動作的にカラム名は、`配列の１つ目のObjectの項目名を見て、カラム名を生成`しているようです。
そのため、下記のようにコードを変更(一つ目のObjectに項目を追加)すると、

```diff
diff --git a/main.js b/main.js
index 83568af..b8318c9 100644
--- a/main.js
+++ b/main.js
@@ -6,7 +6,8 @@ const stringify = require("csv-stringify/lib/sync");
     {
       id: 1,
       name: "hoge",
-      age: 17
+      age: 17,
+      country: "Japan"
     },
     {
       id: 2,
```

CSVにも`country`というカラム名が追加されます。
２つ目と３つ目のobjectにはそのような項目は存在しないため、空になっています。

```csv
id,name,age,country
1,hoge,17,Japan
2,fuga,21,
3,piyo,13,
```


次に２つ目のObjectだけに同じように`country`を追加してみます。
(１つ目、３つ目のObjectには追加しません)

```diff
diff --git a/main.js b/main.js
index 83568af..380cafe 100644
--- a/main.js
+++ b/main.js
@@ -11,7 +11,8 @@ const stringify = require("csv-stringify/lib/sync");
     {
       id: 2,
       name: "fuga",
-      age: 21
+      age: 21,
+      country: "Japan"
     },
     {
       id: 3,
```

この場合、生成されるCSVファイルは下記のようになり、`country`というカラムが認識されていないことが動作からわかるかと思います。

```csv
id,name,age
1,hoge,17
2,fuga,21
3,piyo,13
```


## CSV生成時のオプションについて


ちなみに今回は`stringify(data, { header: true })`という形で`{header: true}`のオプションを指定しているので、カラム名がついていますが、ここを省くと、下記のように省くことも可能です。

```csv
1,hoge,17
2,fuga,21
3,piyo,13
```

option周りについてはこちらを参照すればOKかと思います。

[CSV Stringify options](https://csv.js.org/stringify/options/)
petalinux-configでエラーが出た時の対処法

#こんなエラー
```
ERROR: Failed to generate meta-plnx-generated layer
ERROR: Failed to config project.
ERROR: Get hw description Failed!.
```

#環境
- Petalinux 2019.1
- Ubuntu 18.04

#対処法
- Pythonのバージョンを確認する。
    - いつのまにか`python`ってやったらPython3が動くようになってた、かなしい
Virtualboxのovaをexportするscriptを作った(For windows)

# 前書き

職場のノートパソコン上にVMを立ててOSS入れてナレッジを蓄積しているんだけど、
週末は空調を切られるため、室内は蒸し風呂状態。
破損を恐れて週末にバックアップとシャットダウンを手動でしていました。

このバックアップ、2時間程度かかるので稼働的にも地味につらい。
というわけで、Powershell書いてタスクスケジューラに突っ込んで自動化しました。

# 成果物

Github
https://github.com/atsuyuuki/Virtualbox-ova-export-script-for-windows/releases/tag/v1.0

# 使い方

1. 上記Githubからpowershellをダウンロード
2. 展開して`virtualbox_ova_export_script.ps1`をpowershellで実行
3. ExportしたいVMのUUIDを確認して控える
4. `virtualbox_ova_export_script.ps1 <UUID> <Export_Directory_Path>`を引数に渡して実行する
Export_Directory_Pathはディレクトリを指定してください。
指定したディレクトリに<VMName>_<Date>.ovaという名前で生成されます。
5. 完了すれば終わり。

タスクスケジューラに登録する場合は、上記引数をつけて登録してあげればOK。
登録の仕方はぐぐってください。
気が向いたら記載します。

# あとがき

人生初、Githubで公開しました。
何か至らないところがあったらご指摘ください。
PythonでSiriからZaimに記録する諸々を作った

#こんな感じで動く

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SiriからZaimに記録するのを作った時のやつ <a href="https://t.co/GQxEpQMgt1">pic.twitter.com/GQxEpQMgt1</a></p>&mdash; Hiro (@hiro2do) <a href="https://twitter.com/hiro2do/status/1162795432788946951?ref_src=twsrc%5Etfw">August 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
すげー便利です

#ダウンロード
- [本体](https://github.com/nakano57/Siri_zaim)
    - 本体はPCにcloneして、ログインだけ先に済ませておくと楽です 
- [呼び出し用ショートカット](https://www.icloud.com/shortcuts/77908965824e4b7391ab6c807d86697a)

#環境
- Pythonista 3.3
    - stash導入済み
    - 3.3はまだbeta
    - 3.2だと動きませんでしたOpen betaに参加してみてください
- 普通のiPhone
    - iOS 13.1でも動きました

#とりあえず必要なものを入れる
ログインのために使うものたち、PCでやるならそっちで実行

```
pip install requests requests_oauthlib beautifulsoup4
```
最低限必要なものたち、ログインをPCでやるならPythonistaのStashで絶対入れる

```
pip install requests requests_oauthlib
```
もう入ってるよって言われるかも知れない。
普通にpipするとsite-packages2に入っちゃうので、site-packagesに移動させる。

#Zaimのアプリケーションを作る
[Zaim Developer Center](https://dev.zaim.net/users/login)から自分用のアプリを作ります。
<img width="1075" alt="スクリーンショット 2019-08-18 3.43.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/2fa8def7-d63b-be2a-575a-2bf155030fb9.png">

こんな感じでね。
consumer keyとconsumer secretをメモっておきましょう。

#ログイン
PCでも作業出来ます。
ひとまずダウンロードしてきた[本体](https://github.com/nakano57/Siri_zaim)にある`keys_example.py`を`keys.py`にリネームします。
さっきゲットしてきた__consumer_key__と__consumer_secret__を入力しちゃいます。
`auth.py`を実行すると__access_token, access_token_secret, auth_verifier__の3つが表示されるのでこれらを`keys.py`にそのまま貼り付けましょう。

`keys.py`に問題なく少なくとも以下の5つが記載されていればこの作業は終わりです。

- consumer_key
- consumer_secret
- access_token
- access_token_secret
- oauth_verifier

user_idとpasswordはもう消しても問題ないです。

#ショートカットの設定
最終的に必要なのは`keys.py`と`zaim.py`です。この二つをiPhoneに転送します。
Pythonistaの__This iPhone__の中に__zaim__という名前のフォルダを作りその中にさっきのファイルを両方入れます。
[呼び出し用ショートカット](https://www.icloud.com/shortcuts/e5605b550ecf4c81a59d12ce4e380f29)をダウンロードしてあとは実行するなりSiriショートカットに入れるなりすれば動き出すと思います。

#その他色々
- 記録のカテゴリはその他になってます
    - 変えたい場合は__get_categories()__と__get_genres()__を雑に実行してidを取得してください
    
- This iPhoneじゃなくてiCloudにファイルを置くと突然動かなくなったりするんでやめた方がいいと思います。
- 本当はPythonista 3.3でSiriに対応してるんだけど現在英語だけなので一旦ショートカットを挟むようになった
- 私は今iOS13でちょっといじったのでもしかしたらiOS12で動かないかも知れない。動かなかったらごめんなさい

#トラブルシューティング
PythonスクリプトはiCloudに置いとくとなんかの拍子にどっか行くことが多々あるので本体にコピーしておきましょう。

#ありがとう
[のらくらいふ。第1回 PythonでZaim API～Zaimとの連携～](https://norakulife.com/zaim-api-with-python-01/)

- 本当にありがとうございます
Anaconda仮想環境でTensorFlowを構築する上の注意（バージョン違い　、GPU sync failedエラー）

#GPUパソコンでTensorFlowをインストールすると時にハマった件
　今回GPU付きPCにTensorFlowをインストールしようとしました。
　環境はWin10です。その時に失敗した２点を明確にしておきます。


###TensorFlowとCUDAのバージョン
　二つの表をご覧ください。最新バージョンと対応CUDAが異なっています。当然英語版の方が最新です。
一つは日本語版、一つは英語版です。
 どちらもhttps://www.tensorflow.org/install/source_windows
の下の方に書いてあります。日本語版も英語版もURLが同じなので注意が必要です。
Language を英語に切り替えましょう
![sc190817-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296147/94889948-552d-85c7-6eab-788cdf854803.png)
![sc190817-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296147/fea45920-1f13-5710-f32a-b118f54c2c50.png)

###Anaconda仮想環境でのTensorFlowのインストール
conda install tensorflow-gpuでインストールすると下記のエラーがでます。


```python
GPU sync failed
```
原因はcondaでインストールしたためです。pipでインストールしましょう。

https://fight-tsk.blogspot.com/2016/11/anacondatensorflowgpu.html
このサイトで情報を得ました。

ここから引用します。
>Only the CPU version of TensorFlow is available at the moment and can be installed in the conda environment for Python 2 or Python 3.

>Pyhon2/3 conda環境内でインストールされたTensorFlowは現時点ではCPUのみが有効です。

残念ながらtensorflowの公式ページで上記の文面を発見することはできませんでした。
ZTE MONO-01KでAndroid8.0へアップデートを行うと無限再起動する問題

#ことの始まり
DOCOMOからMO-01KのAndroid8.0へソフトウェアアップデートが配布され、アップデート行ったらアップデートに失敗し無限再起動に陥った。
##無限再起動状態に！
再起動を何度も繰り返すとAndroidがリカバリーモードに遷移する。以下がその画面である。
![F363CBA0-8054-4FF9-9A8C-642092BD7588.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269354/7fb9efaa-565c-b8c7-7596-25eabd3b20d6.jpeg)
ここでは
`Try again`
`Factory data reset`
の２つの選択肢がある。
特に大事なデータが入っていなければFactory data resetを選んでも良いが、大事なデータを保存する必要があればTry againを選択して復旧作業に入ろう。
＊選択、決定はリカバリーモードの画面5行目に書いてある通り音量UP/DOWN、電源ボタンで行う
#データの復旧作業
DOCOMO(またはZTE)からOSのイメージが手に入れられればSDカードからアップデートをかけデータそのまま復活させる事が可能だが、残念なことに公式ではイメージを配布していない。
そこで何とかしてスマホを一時的に復活させ、大切なデータをバックアップしたいと思う。
## 無限再起動を止め、起動状態を維持する
そもそも何故無限再起動が起こっているのか。
詳しいことはシステムログを確認していなかったため判断出来ないが、アップデートに失敗したNICあたりが死んだのだと思う。
そこで、本体が再起動に入る前に機内モードに入れてみた。そうしたら一度の再起動後、無限再起動が起こることは無くなった。
再起動される数秒間の間に頑張って機内モードに入れよう。
### ネットに繋がらないからLINEのバックアップができないではないか！
そうです。残念ですが・・・
大事な写真などはPCにつなぐなり、SDカードなどにバックアップを取ろう。
#工場出荷状態に戻す
バックアップできなかったデータに供養をあげ、リカバリーモードから工場出荷状態に戻しましょう。
音量UPボタンと電源ボタンの同時長押しでリカバリーモードに入り、`Factory data reset`で工場出荷状態に戻すことが出来る。
#感想
あまり情報が出回っている機種ではないため、手探りの状態になってしまった。本当はもっと良い復旧方法があるかもしれないので、この記事は参考程度にしていただければと思う。
ServiceNow開発メモ（社内教育）

**ServiceNow教育（株ピカソフト社内教育）**

1、ユーザ登録
https://developer.servicenow.com/app.do

2、instance申請（開発用）
MANAGER > Instance > default( New York )を選択
↓Instance例
https://devXXXXX.service-now.com/
↓Longin例
https://dev64220.service-now.com/nav_to.do

3、事前の勉強資料
https://developer.servicenow.com/app.do#!/training/landing?v=madrid
or
https://developer.servicenow.com/app.do
LEARN > Training

4、事前に以下の6章を勉強
1.Developer Site Walkthrough (1 modules)
2.Build My First Application (2 modules)
3.Build the NeedIt Application (1 modules)
4.Scripting in ServiceNow (3 modules)
5.Automating Application Logic 
6.Flow Designer (2 modules)
7.Service Portal (2 modules)

５、以下のpluginをinstallする
※Navigate to System Definition > Plugins
I18N: Japanese Translations （※注意：約2時間以上かかりそう）

６、ITSM Plugin Active
System Definition > Plugins > NameSearch:Customer Service > Click Activate/Upgrade
System Definition > Plugins > NameSearch:Customer Service Portal > Click Activate/Upgrade

**Salesforce VS ServiceNow**

■Salesforce
Sales Cloud
Service Cloud
Marketing Cloud
Chatter
Analytics Cloud
Salesforce1 app development

■ServiceNow products
ITSM, ITOM, ITBM, HRSD, SAM, CSM, GRC , ITIL etc

■SFリリース年3回
SP19

■SNリリース年2回
11.Kingston(Q1 2018)
12.London(Q3 2018)
13.Madrid(Q1 2019)
14.New York(Q3 2019)
15.Orlando(Q1 2020)
16.Paris(Q3 2020)

■SFのテストカバレッジ（Apex Test Code 75% coverage）
※ServiceNowには無い

■SFのガバナ制限
※ServiceNowは制限無し

■Salesforce標準項目とカスタマイズ項目を分けて表示されている
※ServiceNowではでききない

■変更セット
salesforce Change Set
ServiceNow UpdateSet

■SF組織ID（18桁）
※ServiceNowのsys_id（32桁）

■SF後ろに__Cは付く項目はカスタム項目
※ServiceNowでは先頭U_を自動付け

■代理ログイン
SF代理不可を設定可能（代理後、戻るのがlogout必要）
SN代理不可機能がない（代理後、戻るのがlogout不要）
Visualforceとは

Visualforce とは?
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_intro_what_is_it.htm

Visualforce の基礎 | Salesforce Trailhead
https://trailhead.salesforce.com/ja/content/learn/modules/visualforce_fundamentals

Visualforce の使用開始 単元 | Salesforce Trailhead
https://trailhead.salesforce.com/ja/content/learn/modules/visualforce_fundamentals/visualforce_intro

====================

Visualforceとは
https://www.slideshare.net/akihiroiwaya/visualforce-57904909

Visualforceを使ってみよう
https://www.slideshare.net/DeveloperForceJapan/visualforce

メモ
VisualForce（略：VF）
VFマークアップとは、Visualforceタグ、CSS、JavaScript、HTMLなど
VF開発4つの方法、設定画面、開発モード、開発者コンソール、Force.com IDE
Visualforce とは

Visualforce とは?
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_intro_what_is_it.htm

Visualforce の基礎 | Salesforce Trailhead
https://trailhead.salesforce.com/ja/content/learn/modules/visualforce_fundamentals

Visualforce の使用開始 単元 | Salesforce Trailhead
https://trailhead.salesforce.com/ja/content/learn/modules/visualforce_fundamentals/visualforce_intro

====================

Visualforceとは
https://www.slideshare.net/akihiroiwaya/visualforce-57904909

Visualforceを使ってみよう
https://www.slideshare.net/DeveloperForceJapan/visualforce