OmniAICreator/Qiita-1.07M huggingface dataset:
Github > Travis CI > gh-pages へデプロイ （書き込み中）




## TravisCI 

https://github.com/marketplace/travis-ci

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/33353606-1e5e-9227-166a-556098fefe3a.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/020decee-26a3-5f00-78de-806dd8b88d86.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2ec6ecda-9332-c595-77ee-f6d42fc0c85b.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/ca4a68b7-87a3-cce9-3f22-c58583db80eb.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/5d7b4324-1d72-2716-5068-e95f0d242f65.png)



## Personal access tokens
[Personal Access Tokens](https://github.com/settings/tokens)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/4644ceb5-b1fb-ce6f-b7c7-eab2894306cf.png)



「Environment Variables」で、取得した Token を登録します。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/97ce8232-f2a4-b301-97b3-ff3cef6781bd.png)




## build


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/651f5717-4438-1f2a-a6f5-7e4bacf0aac5.png)


errorになりました。

```

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! redux-saga-axios-template@0.1.0 build: `react-scripts build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the redux-saga-axios-template@0.1.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.


```

以下のようなWarningが出てるとCIが失敗するようです。
```
./src/redux/sagas/index.js
  Line 1:  'take' is defined but never used     no-unused-vars
  Line 1:  'fork' is defined but never used     no-unused-vars
  Line 1:  'delay' is defined but never used    no-unused-vars
  Line 2:  'history' is defined but never used  no-unused-vars
```

こんな感じで成功しました
```

yarn run v1.3.2
(node:5273) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
$ react-scripts build
Creating an optimized production build...
Compiled successfully.
File sizes after gzip:
The project was built assuming it is hosted at /redux-saga-axios-template/.
You can control this with the homepage field in your package.json.
The build folder is ready to be deployed.
To publish it at https://sugasaki.github.io/redux-saga-axios-template/, run:
  yarn run deploy
Find out more about deployment here:
  http://bit.ly/CRA-deploy
Done in 23.05s.
The command "yarn run build" exited with 0.

Installing deploy dependencies
Logged in as @sugasaki (sugasaki)
Deploying application
Done. Your build exited with 0.
```


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/7ca80001-b6d5-64ee-ab5e-b885eccee37f.png)
【自己学習用】mysql 外部ファイル読み込み

#はじめに
学習用のメモ
##外部ファイル
```sample.sql
create database sample;
grant all on sample.* to sample_user@localhost identified by 'xxxxxxxx';
```

###読み込ませ方①

```
$ mysql -u root < sample.sql
```

###読み込ませ方②
rootユーザーで接続し

```
$ mysql -u root
```
`source`コマンドで読み込み

```
mysql> source ./sample.sql
```

##確認
sampleデータベースとsample_userというユーザーが作成されている。

```
$ mysql -u sample_user -p sample
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.7.22 Homebrew



mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sample             |
+--------------------+
2 rows in set (0.00 sec)
```
Amazon Linux に monit を導入して簡単にログ監視を行う。



Amazon Linux に monit を導入するにあたり、若干はまりポイントがあったのでメモ
メールサーバ環境が SMTP 認証/STARTTLS/port 587の場合、monit のバージョン問題が発生した。

該当する修正は下記。
Fixed: Issue #549: Mailserver on port 587 didn't work with STARTTLS.

changelog
https://mmonit.com/monit/changes/
より


## 環境前提

* Amazon Linux: AMI 2018.03
* メールサーバ： microsoft exchange サーバ / office365サーバ

## インストール

デフォルトの Amazon Linux では monit のバージョンが古い(5.2.5)ため、
EPEL を導入して monit (5.25.1) を導入する。

```
# yum install epel-release
```

続いて monit のインストール

```
# yum install monit --enablerepo=rpel --disablerepo=amzn-main
```


## 初期設定

設定ファイル： /etc/monitrc

```
# vi /etc/monitrc
```

メールサーバ設定として、下記を登録する。tlsv1 では動作しなかったため、tlsv11で実施。


```
set mailserver smtp.office365.com port 587 username "someone@nci.co.jp" password "xxxxxxxx" using tlsv11
```

メール本文の設定。

```
set mail-format {
  from:    Monit <someone@nci.co.jp>
  subject: monit alert --  $EVENT $SERVICE
  message: $EVENT Service $SERVICE
                Date:        $DATE
                Action:      $ACTION
                Host:        $HOST
                Description: $DESCRIPTION

           Your faithful employee,
}
```
フォーマットはサンプルをそのままコピー
office365.com の場合メール送信時に　fromアドレスもチェックされる（ログインユーザと違うと送信不可）ので、
smtpログインユーザと同じアドレスを設定する。(<someone@nci.co.jp>の部分)
送信者名 Monit 部分は自由につけて良い。

続いて送信先を設定

```
set alert someone@nci.co.jp                   # receive all alerts
```

## ログファイル監視設定

設定ファイル：任意

試しにapache log を設定した。

```
# vi /etc/monit.d/apache_error_log.conf
```

```
check file apache_error_log with path /var/log/httpd/error_log
    if match "shutting" then alert
```

# 送信テスト

monit サービスを起動する。

```
# service monit start
```

正しく動作すれば、/var/log/monit にログが書き込まれる。

```
[JST Dec 11 21:12:35] info     : Monit daemon with pid [6711] stopped
[JST Dec 11 21:12:35] info     : 'localhost.localdomain' Monit 5.25.1 stopped
[JST Dec 11 21:12:36] info     : Starting Monit 5.25.1 daemon with http interface at [localhost]:2812
[JST Dec 11 21:12:36] info     : 'localhost.localdomain' Monit 5.25.1 started
```


# 参考URL

http://y-yagi.tumblr.com/post/94064255725/monit%E3%81%A7%E8%A1%8C%E3%81%86%E3%83%AD%E3%82%B0%E7%9B%A3%E8%A6%96

https://qiita.com/tmknom/items/5204b2920bfab01a1289
デザイナーとデザインについて話す時

こんにちは。初めて投稿します、小林玲衣奈です。[だいず](https://twitter.com/daizudesuyo2525?lang=ja)というあだ名で親しまれて(?)います。
この記事は[OthloTech](https://www.othlo.tech/)さんのAdvent Calendarの12日目の記事です。

「デザインについての話し合い」について調べたりしたことを元に私の理解を簡単にメモみたいな感じでまとめました。
##経緯
最近デザインレビューをする回数が多くなり、何を話せばいいのかわからないなあと思うことが多くなってきたことがきっかけです。
デザインについての話し合いはデザイナー同士でもあるし、デザイナーじゃない人とも話をすることがあります。本を読んだりしていたら、デザイナーに限らず話し合いをするならどんな人でも必要なこととかが見えてきました。なのでデザイナーでない方にも読んでいただけると思います。

##用語を詳しく理解してみる
デザインレビューでフィードバックを獲るとか言いますが、そもそもこのカタカナは何なのか？そもそもデザインの目的って何か？といったところをまとめておきたいと思います。
#####デザインの目的
デザインの目的は「問題の解決」と「ユーザーにとっての使いやすさ」です。デザイナーはこれらを考えてデザインをします。
#####デザインレビュー
デザインの過程で行われる行為。ここでフィードバックが求められます。
#####フィードバック
リアクション。ここから人がデザインに対してどう感じているのかがわかります。しかし、この反応自体は重要ではありません。
##理想的なレビュー
レビューとは分析方法です。つまりここでは、デザインの目的である「問題の解決」が行われているかどうかと、レビューからフィードバックを獲ることが重要です。そのために、「なぜフィードバックを頼んで、それを受けるのか？」という所と、デザインの目的をお互いにわかっている必要があります。
つまり、ここではそれでいいのかどうかを考えることがゴールとなり、このレビューの場で解決方法自体を導き出すのはゴールではないことがわかります。現在デザインで解決しきれていない部分を見つけ出すことが重要で、解決方法自体を見つけ出すことはデザイナーの仕事です。
フィードバックする人はデザインが目的達成できているかどうかについて気づくお助けをするべきで、フィードバックを受ける側はもらった意見を元にさらにデザインを強化する意欲があるべきです。

理想的な流れとしては
今回解決したい問題は何なのか？→問題を解決するデザインはどの部分なのか→そのデザインは効果的かどうか？→どうして効果的であるのかor効果的でないのか？
といった感じでしょうか。

ここでこのようなレビューが行われるためにレビューをする人と受ける人のポイントをまとめてみました。

##フィードバックをする人
単なる好き嫌いでフィードバックをしないということです。これは、デザインの目的は問題解決なので、好き嫌いは重要なポイントではないためです。自分がデザインに対して思ったことや感想が相手に伝わるように理由をしっかり伝えなくてはいけません。いきなり目的の達成かどうかはわかりませんので、理由をつけて話すことで答えが見えてくると考えます。また、理由をつけて、その理由が解ればデザイナーはそれを元に新たに解決方法を考えることができます。
しかし、理由をつけるためにはデザイナーがどうしてそのようなデザインにしたのかを知る必要があります。ここで質問が必要不可欠になります。
##フィードバックを受ける人
ここではデザイナーです。フィードバックを聞く人にとってまず大事なのが、この意見はデザインに対しての意見であって自分の評価には関係がないということをよく理解する必要があります。する方にもこの辺りは理解の必要がある時もあると思いますが、レビューはあくまでもデザインにであってその人の人間性を評価するものではないということです。そして、理想的なレビューでも紹介しましたが、レビューの場では良し悪しを決める場ではないということも必要です。レビューとはコミュニケーションですから、相手の反応に理解を示そうとすること、聞かれた質問にちゃんと答えることが大切になってきます。
##まとめ
デザインレビューはデザインが目的を達成しているかどうかを見る場であり解決方法自体は必要でないということが一番重要で、お互いが意識することが大切ということです。デザインレビューで話さなきゃ！といった考えを持っていたけれども意外と「どうして〜？」や「なぜ〜？」ということを聞くことが大切なのだと思いました。この考えを学んだ後にレビューに望んだのですが、まだまだ難しいところもあったのでまずは対面でのレビューから実践に移していけるようになればいいのかなと思いました。そのための質問に必要なスキルや方法についても今回で得た理解をまとめる必要があると感じてはいます。
##参考にした本たち
このブログは私の理解の整理のようなものなのでもっと正しく理解したい人は是非読んでみてください。当たり前だけどやっぱりわかりやすいです。オライリーの方はフィードバックを受ける方のメモの仕方までこまかーーーーく書いてあります。
[みんなで始めるデザイン批評](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%89%B9%E8%A9%95%E2%80%95%E7%9B%AE%E7%9A%84%E9%81%94%E6%88%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B3%E3%83%A9%E3%83%9C%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89-%E3%82%A2%E3%83%BC%E3%83%AD%E3%83%B3%E3%83%BB%E3%82%A4%E3%83%AA%E3%82%B6%E3%83%AA%E3%83%BC/dp/4802510209)
[デザインの伝え方](https://www.amazon.co.jp/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E4%BC%9D%E3%81%88%E6%96%B9-Tom-Greever/dp/4873117798/ref=sr_1_1?s=books&ie=UTF8&qid=1544372810&sr=1-1&keywords=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E4%BC%9D%E3%81%88%E6%96%B9)
inline関数とtrace-cmd/systemtap

trace-cmdやsystemtapは、動作中のカーネルの分析などに大変便利なものですが、inline関数に弱いのが欠点です。Cの関数の入り口に細工をするので当然です。コンパイラはinlineキーワードがついていようといまいと、static関数をどんどんインライン化してしまいます。trace-cmdのfunctionプラグインの結果を眺めながら、なんでこの関数が呼ばれないのだろうと悩んでいたら、コンパイラが俺の知らないところでインライン化していた、というのもよくあることです。

どうしてもinline関数を調べたい場合は、インライン化を抑止するオプションをつけてカーネルを再コンパイルします。たとえば、pte_dirty()を調べたい場合は、

```
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -118,7 +118,7 @@ extern pmdval_t early_pmd_flags;
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_dirty(pte_t pte)
+static noinline __maybe_unused int pte_dirty(pte_t pte)
 {
        return pte_flags(pte) & _PAGE_DIRTY;
 }
```

という感じです。noinlineでインライン化を抑止します。\_\_maybe_unusedは、gccでは\_\_attribute\_\_((\_\_unused\_\_))と展開され、「定義されたのに使われていない」という警告を止めます ([gccの文書] (https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute)を参照)。
annotateコマンド実行後、'Couldn't open --exclude'というメッセージが表示され、modelファイルに何も出力されない

# 実行環境
- Ruby 2.5.0
- Rails 5.1.6
- annotate 2.7.4


以下のコマンドを実行すると、'Couldn't open --exclude'というメッセージが表示されました。

```Terminal
$ annotate --exclude tests,fixtures,factories,serializers
Couldn't open --exclude
```
テーブル情報が出力されているはずですが、modelファイルには何も出力されていません。
よくannotateのreadmeを見てみると、以下の行を発見。

>(If you used the Gemfile install, prefix the below commands with bundle exec.)

なので、annotateの前にbundle execをつけて実行。

```Terminal
$ bundle exec annotate --exclude tests,fixtures,factories,serializers
Annotated (2): app/models/user.rb, app/models/post.rb
```
期待通り各modelファイルにテーブル情報が出力されました。

### 参考
https://github.com/ctran/annotate_models
記号の名称について

#はじめに

記号の名称をまとめようと思ったは技術者同士の会話の際に

名称を使わないと意思疎通が難しくなると思い、まとめてみて

知識の定着を図ろうと思いました。

##記号の名称


|記号|名称|補足|
|:--|:--|:--|
|~|チルダ||
|｜|パイプ||
|!|エクスクラメーションマーク|論理否定|
|^|ハット、キャレット|どちらの読み方でも可|
|&|アンパーサント||
|<<>>|ギュメ|UMLで使われる|
|<>|アングルブラケット||
|$|ダラー||
|"|ダブルクォーテーション||
|'|シングルクォーテーション||
|`|バッククォート||

##　さいごに
普段から口に出して覚えていくしかないかな〜と思います。

ひとまずここまで！！！（まだ大事の記号の抜けがありそう汗）
1ヶ月でAWS 認定ソリューションアーキテクト – アソシエイト(SAA)合格のためにやった４つのこと

12/08にAWS 認定ソリューションアーキテクト アソシエイト試験に合格しました。

11/15に試験を受けようと勉強を始めたので4週間弱ですね。

そのためにやったことです。

## 勉強開始前

AWSについてはEC2とRDSくらいしか使ったことがなく、勉強を始めるまではAutoScaling？ELB？CloudFlont何それ？って感じ。

## １つ目

「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」を買って読みました。

http://amzn.asia/d/5sXJ8Zb

各章の最後に確認テストがありますが、実際の問題とは形式が異なる点は注意が必要です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/ea4fef67-6dfd-5fa2-ef02-6fd6a3628ea8.png)

## ２つ目

模擬試験を受験しました。

2000円かかりますが、絶対に受けたほうが良いです。

試験問題が本番と同形式で出題されます。

また対策本に出てこなかった機能がいくつか登場するのでメモっておきます。

## 3つ目

BlackBeltでSlideshareを読み漁りました。

https://aws.amazon.com/jp/aws-jp-introduction/

オンデマンドセミナーであれば資料に書かれていないことも補足してくれるため勉強になるのですが、あまりにも時間がかかるためほとんど視聴はしませんでした。

対策本に出てきた機能、模擬試験に出てきた機能は一通り確認しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/0b1776df-14f7-025c-883e-a3352686a138.png)


## ４つ目

AWS Well-Architected Trainingを受講

https://www.aws.training/learningobject/curriculum?id=12033

オンラインで受けられるトレーニングです。

## 試験予約

ネット上で予約をするのですが、地方暮らしの方は早い段階で確認したほうが良いです。

私の場合、地元の岡山に会場は無く、神戸まで出る必要がありました。

この交通費は当初の想定には無い出費でした。。。

## 試験当日

キオスク端末と呼ばれる端末で受験をするのですが、これが思ったより面倒でした。

端末へのログイン〜本人確認に10分以上かかったり、停電(?)で途中端末が再起動したり。。。

テスト端末にカメラが付いているのですが「テスト中はマスクを外してください」、「両手は机の上に見えるようにしてください」などチャットで注意されました。

試験は130分65問なので時間にかなり余裕があります。

試験終了ボタンを押すと、アンケート入力があり、その後すぐに結果が表示されました。

![internet_kanki_man1.png](https://qiita-image-store.s3.amazonaws.com/0/214653/5c6b2f98-926f-f2d1-f3c6-079606a6986f.png)
GitLab.comでのGroup運用と外部サービス(Unity Cloud Build)連携

[GitLab Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gitlab) -  12日目の記事です。

# はじめに
クラウドサービスのGitLab.comをBronze Planで契約して使っています。開発チームの仕事はUnityアプリの制作だったりするので、masterへのマージ毎に、やはりクラウドサービスのUnity Teams AdvancedのCloud Buildでビルドしてたりします。

運用もうまくいって安心しきっていた2018年9月上旬のある日、UnityのCloud Buildが延々と失敗し始め、正常化へ向けた試行錯誤の道のりが始まるのでした。


# ビルド環境の構成
・GitLab.com [Bronze Plan]でソースを管理
・LFSは、GitLab.comサービス提供のものを使っています
・Unity Teams AdvancedのCloud BuildでUnityアプリをビルド
　→　GitLab.com のmasterブランチを監視して自動ビルドしています


#気を付けること
では、結論から。

* **Unity Cloud BuildのGitLab.com参照設定は、gitではなくhttpsで行いましょう**

* **GitLab.comのユーザ割り当ては、所属Groupによる継承に頼らずprojectに直接ユーザを割り当てましょう**

以上です

#気を付けないと何が起こるか

### × Unity Cloud BuildからGitLab.comのリポジトリを取得するのにgitプロトコルを使っていると
* こんなエラーに悩まされました

```
「Error downloading object: xxx.png : batch request: ssh_exchange_identification: Connection closed by remote host: exit status 255」
```
　→cloneは成功するのですが、checkoutで失敗します。LFSサーバからファイルをある程度の本数ダウンロードしてきて安心していると、途中で「Connection closed by remote host」されます。
　→LFSを使わないのならば問題ないと思いますが、LFS使いますよねUnityのリソースとかに。
　→gitではなくhttpsを使えば問題ないよ。とのこと(GitLab.comのサポート担当)
　→それまで問題なく動作していたcheckoutが失敗し始めた原因は、実は調査中断したままです。(GitLab.comがGCPへ移行した影響だと思いましたよその時は・・・)

### × GitLab.comにはGroupという機能があり、開発メンバーはこのGroupに所属させますよね？　そうすれば、Group内に置いたproject毎にいちいちメンバーアサインしなくて済みますし

* Groupを介して間接的にprojectへのアクセス権限を与えると、Unity Cloud Buildの参照先一覧に、そのprojectが出てこなくて詰みます

```
Unity Cloud Buildの設定で、
GitLab authentication の機能を使い、Group Repositories を HTTPS で指定しようとする。
　1) Navigate to the Cloud Build Config Page of your Project
　2) Click on Edit Source Control
　3) Select your repository <---- ここでRepositoryの一覧が表示されるが、目的のRepositoryが表示されない
```
　→いやいや普通にアクセス権のあるユーザなら参照先一覧に出るし。とのこと(Unityのサポート担当)
　→httpsで参照しようとすると一覧に出てこないのですが、実はこの状態でもgitプロトコルで直接参照設定するとcloneは可能です。
　→でも、gitプロトコルではLFSからのダウンロードで上記エラーが出るのでダメですね。

　→GitLab.com のproject設定において、projectへユーザを"直接"割り付けることで、さっくりと Unity Cloud Buildの参照先一覧に表示されます。これにて一件落着となります。

　      例： URL が h ttps://gitlab.com/{Group}/{Repository}.git の場合、
　　   　　ユーザを{Repository}に割り付けると、参照先一覧に表示される。

　→この件、GitLab.com側の問題か、Unity Cloud Build側の問題かの原因調査は放置中です

### × GitLab.comの有償プランは、基本的にGroup内に所属するメンバー数で支払額が決まります。なので、運用中はGroupの参加ユーザを固定にしておきます

![aaaa.png](https://qiita-image-store.s3.amazonaws.com/0/6824/4c6321a3-80ca-9037-efd2-cdbc5d3962d7.png)

*  Groupへのユーザ追加がdisableになるのは良いのですが、この設定を行うとprojectへのユーザ割り当てのメニューが出てこなくなって、軽めに詰みます

　　→先のエラー時、projectへユーザを割り当ててみたらどうなるか試したかったのですが、メニューが見つからなくて、しばらく悩みました。
　　→一時的にチェックボックスを外して追加しましょう。



～～
お世話になったGitLabコミュニティの方々、Unityサポートの方、GitLabサポートの方、重ねて感謝いたします。こんなメモが誰かの役に立ったりすることがあったりなかったりしますように。

**それでは良いGitLabライフを。**
AVPlayerで動画を再生する時の小ネタ

備忘録を兼ねた，タイトル通りの小ネタです．

### 動画再生用のレイヤーとビューのサイズを揃える
`layerClass`をオーバーライドし，`AVPlayerLayer`を返すようにする．
あわせて，`layer`自体も変更しておくと取得が楽．

```swift
import UIKit
import AVFoundation

class VideoContainerView: UIView {
    override class var layerClass: AnyClass {
        return AVPlayerLayer.self
    }

    override var layer: AVPlayerLayer {
        return super.layer as! AVPlayerLayer
    }

    func set(player: AVPlayer) {
        self.layer.player = player
    }
}
```

### 他アプリで再生中の音声への割り込みを禁止する
`AVAudioSession`のCategoryを変更する

```swift
do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
} catch let e {
    // Error handling
}
```
【自己学習用】mysql ユーザー設定

#はじめに
学習用のメモです
##ユーザーの作成

`mysql -u root`コマンドにてrootユーザで接続。
以下のコマンドを実行。

```
mysql> create user dbuser01@localhost identified by 'xxxxxxxx';
```
- ユーザー名：dbuser01
- パスワード設定(pass:xxxxxxxx)：identified by 'xxxxxxxx' 
- @localhostはローカルホストから接続するという意味



##権限の譲渡

```
mysql> grant all on mydb01.* to dbuser01@localhost;
```
これでmydb01のテーブルに関する全ての権限を`dbuser01`に与える。

##作成したユーザーで接続する
`quit;`などでrootユーザーから脱し、先ほど作成した`dbuser01`で接続する。

```
$ mysql -u dbuser01 -p mydb01
```
- `mysql -u ユーザー名 -p　データベース名`
- -u オプションでは MySQL に接続するユーザー名を指定
- -p オプションはパスワードを送信する場合に指定

ユーザー名とデータベースを確認

```
mysql> select user();
+--------------------+
| user()             |
+--------------------+
| dbuser01@localhost |
+--------------------+
1 row in set (0.00 sec)
```

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb01             |
+--------------------+
2 rows in set (0.01 sec)
```

##テーブルとユーザーの削除
削除はrootユーザーから。
`mysql -u root`コマンドでrootユーザーで接続。

データベースを削除

```
drop database mydb01;
```

ユーザーを削除

```
drop user dbuser01@localhost;
```

ユーザーを削除するとそのユーザーから接続できない（当たり前だが）

```
$ mysql -u dbuser01 -p mydb01
Enter password: 
ERROR 1045 (28000): Access denied for user 'dbuser01'@'localhost' (using password: YES)
```
Android/iOSアプリを Azure Pipelines から DeployGate に配信する

[Azure Pipelines](https://azure.microsoft.com/ja-jp/services/devops/pipelines/) でビルドした Android や iOS アプリを [DeployGate](https://deploygate.com/?locale=ja) に配信します。

DeployGate はモバイルアプリをテスターやβ版ユーザーに配布するサービスです。
Microsoft 系のサービスだと App Center にアプリ配布機能があるのですが、DeployGate は日本のサービスで（クライアントアプリ含め）UI が日本語である点と、一つのアプリをグループごとに配信管理(会社のお偉いさんた達には Stable を、同僚グループには最新版を、とか)できるのが気に入っています。

## DeployGate のユーザー名と APIキーの取得

1つ目は、DeployGate でユーザーを作ったときのユーザー名を得ておきます。
2つ目は https://deploygate.com/settings にアクセスして「API key」に表示されてる値を得ます。

## Azule Pipelines にタスクを追加

DeployGate 用のタスクは残念ながら無いので、Bash Script でやります。

### Android の場合

Android の場合は、Bash のタスクを「Signing and aligning APK file(s)」の下に追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8227/9c3766b0-72c6-9259-30e6-fa01eaeff8f5.png)

スクリプトは次のように記述します。

```bash
curl \
  -F "token=＜DeployGateAPIキー＞" \
  -F "file=@$(build.binariesdirectory)\$(BuildConfiguration)\＜APKファイル名＞" \
  -F "message=＜デプロイ時のメッセージ＞" \
  https://deploygate.com/api/users/＜DeployGateユーザー名＞/apps
```

* ＜DeployGateAPIキー＞ - 先に取得しておいた DeployGate の APIキー
* ＜DeployGateユーザー名＞ - 先に取得しておいた DeployGate の ユーザー名
* ＜APKファイル名＞ - ビルド・サインされた APK ファイル（com.mycompany.awesomeapp-Signed.apk など）
* ＜デプロイ時のメッセージ＞ - DeployGate へのこの配信に付与するメッセージ(最新のgitコミットログを代入できるとよいんだけど…)

＜APKファイル名＞ は、初見では分からないと思うので、一度ビルドして Artifact に保存されたファイル一覧を確認するとよいと思います。くれぐれも「サイン済み」の「-Signed」が付いた apk ファイルを指定してください。

### iOS の場合

iOS の場合は、Bash のタスクを「Copy Files to: $(build.artifactstagingdirectory)」の下に追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8227/5ba3beaf-dc36-4891-fdbf-9f52a0d1d938.png)

スクリプトは Android とほぼ同じように、次のように記述します。

```bash
curl \
  -F "token=＜DeployGateAPIキー＞" \
  -F "file=@$(build.artifactstagingdirectory)/＜ipaファイルへのパス＞" \
  -F "message=＜デプロイ時のメッセージ＞" \
  https://deploygate.com/api/users/＜DeployGateユーザー名＞/apps
```

* ＜DeployGateAPIキー＞ - Android 側と同じ
* ＜DeployGateユーザー名＞ - Android 側と同じ
* ＜ipaファイルへのパス＞ - ビルドされた ipa ファイルへのパス（xxx/bin/iPhone/Release/AwesomeApp.ipa など）
* ＜デプロイ時のメッセージ＞ - Android 側と同じ

＜ipaファイルへのパス＞ も、一度ビルドして Artifact を見るのがよいと思います。

## まとめ

Azure Pipelines を使う人は DeployGate にあまり馴染みがないと感じるので紹介してみました。
これは Pipelines の Builds じゃなくて Releases の方でやるべきかな？わからん。

signed-apk や ipa ファイルへのパスを示す環境変数があったら便利なんすけどねー、どやんすー。
新人エンジニアに実践して欲しいこと

# はじめに

おっさんエンジニアが新人エンジニアだったころにおっさんエンジニアに言われて実践してきたことを書きます。（ここではコーディング以外で言われたことを記載します。）

# どんな作業でも工数見積もりをする。

**「これどのくらいでできる？」**
エンジニアやってると必ず聞かれるキーワードですよね。
特に新人エンジニアの頃は不明点も多いし、どこが難所かも想像つかないし（全部が難所にみえる）なんて答えていいかわかりませんよね。

私が新人エンジニア時代もそうだったのですが、そこで聞かされた話です。

最初から作業見積もりが正確にできる人なんていないので経験していくしかない。
ただし、毎回提示されている工数見積もりを見るだけでなく、自分自身でどのくらいかかりそうかを計算するクセをつけること。作業が完了したときに自分自身の工数見積もりとどのくらい差があったかを振り返ること。その繰り返しをしていけば工数見積もりの精度はかならず良くなるよ。

# ただしい用語を使う。

ドキュメントやメールを書く時に様々なサービス名や製品名を記載することが多々あると思います。
そんな固有名詞にはかならず正式な呼び方があります。
ドキュメントを起こす時はきちんと調べて正式な呼び方を使いましょう。
会社やプロジェクトで統一された記載をする際の基準としてきちんと正式な名称で統一されていると気持ちいいですね。
また正式名称を調べるついでに出てくる記事などを見ることで、そのものの造詣を深めることができます。

× wifi Wifi WiFi
◯ Wi-Fi

× iPadAir2
◯ iPad Air 2

× xcode XCode 
◯ Xcode

# 文書の書き方を統一する。

用語とちょっと似てますが文書についてもある程度統一していこうと言われました。ただし正直これはそこまで実践できていませんでした。

この話をされた時に基準として示されたのがマイクロソフトランゲージポータルです。
https://www.microsoft.com/ja-jp/language
(蛇足ですけど、ここでスタイルガイド落としてみたら今ってもうpdfで落ちてくるんですね。昔はマイクロソフトのドキュメントってxpsだったような。曖昧ですが、、）

- 全角文字と半角文字 (記号を含む) の間にはスペースを入れます。
- 全角文字どうし (記号を含む) の間にはスペースは入れません。

この辺りは割と有名なんではないでしょうか。
マイクロソフトは各言語への翻訳等ありますので翻訳のしやすさ等意識したものだとは思いますが、統一したフォーマットという点で参考にするのもいいかと思います。
この記事を書くにあたり色々と調べていたら2008年のカタカナ表記ルール変更の記事とかでてきて懐かしいです。。
https://japan.cnet.com/article/20377831/

# 公式のリファレンスは必ず目を通す。

Qiitaの記事やstackoverflowの質問など、コーディングに関する疑問を調べる際によく利用すると思います。もちろんこういった記事を参考にして開発は進めていくのですが、これらの内容を100%信じ切ってしまってはいけないということです。本当の正解は公式リファレンスですよという認識を持っておくことと、リファレンスをきちんと読むクセをつけたほうが良いです。
公式>>>書籍>>>>>>Web　
くらいの信頼度でいた方が良いよって当時言われてました。１０年以上前ですし今はもう少し違うかもしれません。
（逆引き大全とかなつかしいですね！）

# 終わりに

いかがでしたでしょうか!
人に歴史あり、プログラミングに歴史あり。
先人達の格言（叱言？？）がみなさんの一助になれば幸いです！
それでは**Enjoy Hacking!!**
smartparens-bindings の変更

Smartparens で提供されているキーバインドは少し合わないので一部変更する。
また `(setq sp-navigate-interactive-always-progress-point 1)` を有効にする方が自分の感覚に合う。

※ C-M-f は sp-next-sexp の方が良いと思うのだがどうだろうか？

 command                         | paraedit    | smartparens     | Custom | comments                |
|---------------------------------|-------------|-----------------|--------|-------------------------|
| sp-forward-sexp                 | C-M-f       | C-M-f           |        |                         |
| sp-backward-sexp                | C-M-b       | C-M-b           |        |                         |
| sp-up-sexp                      | C-M-n       | C-M-e           | C-M-u  | means forward up        |
| sp-backward-up-sexp             | C-M-u       | C-M-u           | C-M-p  |                         |
| sp-down-sexp                    | C-M-d       | C-M-d           |        | means forward down      |
| sp-backward-down-sexp           | C-M-p       | C-M-a           | C-M-n  |                         |
| sp-beginning-of-sexp            |             | C-S-d           | C-S-a  | "C-S-b" is better?      |
| sp-end-of-sexp                  |             | C-S-a           | C-S-e  |                         |
| sp-beginning-of-next-sexp       |             | none            | C-S-n  |                         |
| sp-beginning-of-previous-sexp   |             | none            | C-S-p  |                         |
| sp-forward-symbol               |             | M-S-f           |        |                         |
| sp-backward-symbol              |             | M-S-b           |        |                         |
| sp-next-sexp                    |             | C-M-n           | M-S-n  |                         |
| sp-previous-sexp                |             | C-M-p           | M-S-p  |                         |
| sp-forward-slurp-sexp           | C-)         |                 | C-)    |                         |
| sp-backward-slurp-sexp          | C-(         |                 | C-(    |                         |


# 実際の設定

```elisp
 (with-eval-after-load 'smartparens
    (setq sp-navigate-interactive-always-progress-point 1)
    (sp-use-smartparens-bindings)
    (bind-keys :map smartparens-mode-map
               ("C-M-u" . sp-up-sexp)
               ("C-M-p" . sp-backward-up-sexp)
               ("C-M-n" . sp-backward-down-sexp)
               ("C-S-a" . sp-beginning-of-sexp)
               ("C-S-e" . sp-end-of-sexp)
               ("C-S-n" . sp-beginning-of-next-sexp)
               ("C-S-p" . sp-beginning-of-previous-sexp)
               ("M-N"   . sp-next-sexp)
               ("M-P"   . sp-previous-sexp)
               ("M-C" . sp-wrap-round)
               ("C-)" . sp-forward-slurp-sexp)
               ("C-}" . sp-forward-barf-sexp)
               ("C-(" . sp-backward-slurp-sexp)))

```
Python 秒単位の定義値をN分やN時間で書きたいとき

# 課題

秒単位の定義値をN分やN時間で書きたいとき

```python
XXX_SECONDS = 12 * 60 * 60  # 12 hours
YYY_SECONDS = 1 * 60  # 1 minute
ZZZ_SECONDS = (1 * 60 * 60) + (30 * 60)  # 1 hour 30 minutes
```

みたいに書いていたけど、値を書き換えるときにミスしそうな予感があった。

# 解決方法

timedelta.total_seconds()を使って書くと、ちょっと直感的になった。好みの問題かもですが。
(timedelta.total_seconds()が使えるのはpython3.2以上)

```python
from datetime import timedelta

XXX_SECONDS = int(timedelta(hours=12).total_seconds())
YYY_SECONDS = int(timedelta(minutes=1).total_seconds())
ZZZ_SECONDS = int(timedelta(hours=1, minutes=30).total_seconds())
```

## 補足

timedelta.total_seconds()ではなく
timedelta.secondsを使うと「両端値を含む 0 から 86399 の間」なので
24時間以上の値で目的の通り動かない


```python
timedelta(hours=24).seconds # 0 NG

int(timedelta(hours=24).total_seconds()) # 86400 OK
```

# 参考
https://docs.python.jp/3/library/datetime.html?highlight=timedelta#datetime.timedelta
Oracle Cloud と IBM Cloud のオブジェクトストレージを比較してみた

この記事は [Oracle Cloud Advent Calendar 2018](https://adventar.org/calendars/3077) の12/12の記事として書かれています

縁あって、OracleCloudを触る機会があったので、
普段良く運用しているIBMCloud環境と比較をしてみました。

OracleCloudの日本リージョンはまだないので、USリージョンで比較しています。
(IBMCloudは日本リージョンがあるので、参考値として載せてあります。)

文字ばかりで分かりにくいと思いますので、後日画像も追加します。

比較をするにあたり以下の記事を参照させて頂きました。

OracleCloud側参考URL
https://cloudii.atomitech.jp/entry/2018/09/11/180402
https://cloudii.atomitech.jp/entry/2018/07/27/161534

IBM Cloud Object Stoage側参考URL
https://qiita.com/schiyoda/items/c1fe7438e50087ff97ef

### OracleCloud の事前準備
01. https://cloud.oracle.com/ja_JP/cloud-infrastructure からサインインする。
02. インスタンスの作成をクリックする。
03. computをクリックする。
04. 左上のメニューより Object Storage → Object Storage を選択する。
05. Create Bucketをクリックする。
06. BUCKET NAMEを記入して、Create Bucketをクリックする。
07. 作成した Bucket名をクリックして、Namespaceをメモする。
08. 左上のメニューより Identity → Users を選択する。
09. ユーザ名をクリックする。
10. Resources の Customer Secret Keysをクリックする。
11. Generate Secret Keyをクリックする。
12. NAMEを記入し、Generate Secret Keyをクリックする。
13. KEYが表示されるので、メモ帳等にコピーする。(後から確認できないので必ず実施する)
14. Access Key: show をクリックすると表示される。

### IBM Cloud Object Storage の事前準備
01. https://console.bluemix.net/ からログインする。
02. カタログ→ストレージ→オブジェクトストレージを選択する。
03. Standardを選択して作成ボタンをクリック
04. Create a bucketをクリックする。
05. 任意のバケット名を入力する。
06. 作成したバケットの右側メニューからバケットの構成を選択する。
07. エンドポイントのパブリック側をメモする。
08. 右側のサービス資格情報をクリックして、新規資格情報ボタンをクリックする。
09. インラインの構成パラメーターの追加に {"HMAC":true} を入力して、追加ボタンをクリックする。
10. 資格情報の表示をクリックすると展開され、以下の項目の値をメモする。
 - "access_key_id":
 - "secret_access_key":

### s3cmd 設定内容(.s3cfg)
#### OracleCloud側設定内容
[default]
access_key = Customer Secret Keysを確認し記載する。
host_base = &lt;Namespace&gt;.compat.objectstorage.&lt;リージョン名&gt;.oraclecloud.com
host_bucket =
secret_key = Customer Secret Keysをクリックした際に表示された内容を記載する。
signature_v2 = False

#### IBMCloud側設定内容
[default]
access_key = 資格情報を確認する。
host_base = バケット構成からエンドポイントを確認する。
host_bucket =
secret_key = 資格情報を確認する。
signature_v2 = False

### 測定方法
Linuxのホストにs3cmdを導入してtimeコマンドを用いて計測しました。
`time s3cmd -c .s3cfg put --multipart-chunk-size-mb=100 CentOS-7-x86_64-DVD-1804.iso s3://バケット名`

### 測定結果
4.3GBのISOファイルのアップロード時間を1回計測
![test-result.PNG](https://qiita-image-store.s3.amazonaws.com/0/77190/f15b5301-7582-781c-1e10-84e06cfbfa79.png)
Androidアプリ開発をチームで行う前に決めておいたほうが良いこと

# はじめに

本記事は [Android 初心者 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/android-beginner) 12 日目の記事です。

Android初心者ということで、開発をチームで行う前に決めておいたほうが良いことについて紹介します。

「開発を行う前に決めておいたほうが良いこと」としていますが、
正直決めておくと導入がスムーズかもね程度の内容です。

また、「開発を行う前に決めたから開発中は絶対に変えない」ではなく、
仕様や開発フロー、実装方法などの状況に合わせて、
柔軟に変えれる体制づくりが一番重要だと思うので、そういった点は注意しておいてください。
(ウォーターフォールかアジャイルかという話もあると思いますが…)

では、紹介していきます。

# アーキテクチャ・設計パターン

まず、一番重要な事前に決めるべき点は、アーキテクチャ・設計パターンについてです。

なぜアーキテクチャが重要かというと、**コードの保守性を高める**ためです。

人気のあるアプリにするためには、リリースをしたら終わりではなく、
ユーザーからのフィードバックや分析結果などをアプリに反映して、
より良いものにしていくことが重要です。

人気のあるスマホアプリでも、1ヶ月に1度程度の頻度で継続的な改善のためのリリースを行っています。

このような頻度でアプリを開発、保守していくためには、コードの機能拡張性、保守性の高さが必要です。

アーキテクチャに則ったアプリ開発を行うことで、
適度な機能分割と、依存性の排除がされ、コードの保守性が高くなる場合があります。
(必ずしもアーキテクチャを採用するだけでコードの保守性が高まるわけではないです。
可読性の高いコードを書くことは常に意識しましょう。)

## Androidアプリ開発のアーキテクチャ

Androidアプリでは、MVPやMVVMなど様々なパターンが用いられています。
それらの特性を比較し、どのアーキテクチャを使って開発をするかを決めて行きます。

アーキテクチャについては、開発を進めていくほど、
途中での変更が難しくなる(修正の影響範囲が大きくなる)ので、
開発チームのメンバーと十分に検討して使用するアーキテクチャを選びましょう。

Androidアプリのアーキテクチャについては、PEAKSさんから出版されている[『Android アプリ設計パターン入門』](https://peaks.cc/89D5610D/architecture_patterns)が大変参考になるので、気になる方は買って読んでみてください。

# AndroidOSのバージョンはどこまでサポートするのか

AndroidOSは現在、Android9(API28)までリリースされています。
そこで、最新版のサポートはするとしても、どこまで古いOSバージョンを対応するのかという問題が出てきます。

もちろん、古いものをサポートすればするほど、作業量や考慮しなければいけないことは多くなります。

世界版ですが、各OSバージョンのシェア率は以下のようになっています。
<img width="867" alt="スクリーンショット 2018-12-11 20.17.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/275913/7c3b3d65-e6d5-ef2d-4ff7-8a7dccead2c2.png">

https://developer.android.com/about/dashboards/?hl=ja

日本版で考える場合は、新しいOSバージョンがもう少し多いと思います。
これらのデータをもとに、どこまでサポートするかを決めると良いでしょう。

幅広いOSをサポートすると、バージョンごとに処理を分ける必要がでてくる場合があります。
そのため、途中で対応バージョンを変更すると、そういった対応漏れが無いかを確認しなければいけないため、あらかじめ対応バージョンを確定させておくと楽でしょう。

# 使用する言語

Androidは、KotlinとJavaでの開発が公式でサポートされています。

今からAndroidアプリ開発を行うのであれば、
ほぼ間違いなくKotlinで開発を行ったほうが良いと思います。

ですが、Javaを使用している期間が長かったり、
Kotlinを知っている人がチームにいない場合は、
Javaの使用を検討したほうが良いと思います。

JavaなどのNullを許容する許容しないを宣言しない言語しか扱ったことのない人が、
いきなりそういった言語で開発を行うと、とりあえずNullを許容する変数で宣言してしまい、
せっかくのNull安全の仕組みが全く意味のない状態になってしまうことがあります。

なので、チームにKotlinを知っている人がいない場合は、
まずはチーム全体でKotlinについて勉強するか、Javaで開発を行うのが良いでしょう。

あまりオススメできないのは、KotlinとJavaが混在する状態で開発を進めることです。

JavaからKotlinに値を渡す際などに、
Kotlinでは、渡された値がプラットフォーム型と呼ばれる変数になってしまったり、
JavaでNullableアノテーションを追加するなど、
混在することが原因でやらなければいけないことが増えてしまうので、
どちらかの言語に統一することが望ましいです。

# 命名規則

基本的な命名規則は、特別な用語を用いる時以外は、英語で省略しないのが基本だと思います。

ですが、チーム内で特別な用語や英語に訳しにくい日本語を用いる場合は、あらかじめどのように訳すかを決めておかなければ、各々で訳してしまい、同じものを示しているのに、別々の用語になってしまう可能性があります。

あとから決めた命名に変更する場合は、それまでにどのような命名をされているかを把握して検索しなければいけないため、修正がかなり大変です。

そういった事態を避けるために、開発中にどのように訳すかわからなくなってしまった場合は、チーム内で相談して統一するようにしましょう。


# まとめ

基本的に決めておいた方がいいことは、まだなにかある気がしますが、特に思いつかなかったので、これだけにしておきます。
新規アプリを開発する際に少しでもお役に立てば。
常駐エンジニアに捧げる「らくらくスーツ風スタイル」入門

# スーツ嫌い

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/ccaabfc5-ef2f-bde9-956b-0df6e56a2a55.png" width="379" height="400"/>


こんにちは！40代のおっさんエンジニアです。私はスーツが嫌いです。窮屈だし、蒸れるし、そもそも堅苦しくてなんかイヤです。お客様と打ち合わせするならともかく、PCに向かって作業する時は、自由な服装の方が断然良いですよね。みなさん、そう思いません？

さてそんな私、ここ10年ぐらいは私服勤務OKの会社で、自由な服装でお仕事していました。が、今年、スーツ指定の現場に常駐することになってしまいました。ぬぐぐ、ピンチじゃ。

この記事は、スーツ嫌いの私がそれっぽい格好を保ちながら楽に過ごせる、言わば **らくらくスーツ風スタイル** を求めたカイゼンの記録です。読んで下さった方に少しでもお役に立つとうれしいです。なお、記事中、高級なアイテムは全く登場しませんが、それは筆者の財力によるものなのでご了承ください。また、私も未だカイゼンできていない部分があるので、アドバイス頂けると幸いです。


# らくらくスーツ風スタイル

それでは完成形から。左が普通のスーツ、右が「らくらくスーツ風スタイル」です。遜色ないでしょ^^！

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/becc3e6a-c3e7-795b-da2e-dc053d86cc87.png" width="600" height="494" />

# 構成されるパーツ

次は構成されるパーツです。私のおすすめ順に紹介していきます。

## パンツ

**ユニクロ　EZYアンクルパンツ（ウルトラストレッチ）**

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/72945b5b-f1da-cdf1-e77a-c433b64a9b6b.png" width="400" height="400" />

https://www.uniqlo.com/jp/store/goods/408990/

「らくらく」スーツ風スタイルは、これが無くては始まりませんでした。パット見スーツのパンツに見えますが、実はジャージのような生地でできていて、めっちゃ履き心地楽です。何よりスーツっぽく見せておいて、実はジャージ着て仕事してるんだぜ！という背徳感がたまりません。色はネイビーがスーツっぽくておすすめです。

## 靴

**ソールまで黒いスニーカー**

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/f62df690-7561-28e5-c180-2e15863c0130.png" width="400" height="400" />

写真はナイキのメッシュ生地のスニーカーです。ソールまで黒いというのがポイントで、ソールが白いと途端に残念な感じになります。横のメーカーのロゴも目立たないのが良いでしょう。革靴みたいに蒸れず、生地が伸びるので指を自由に動かせます。

## ベルト

**ダイソーの布ベルト**

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/ad12e9d0-51cb-e44e-6833-3182556827ef.png" width="400" height="400" />

私ぐらいの年代になると、座った時にお腹の肉にベルトが食い込んで痛い現象がかなりの割合で発生します。ベルトはなるべく柔らかい生地のものを選びましょう。おすすめはダイソーで売っている布のベルトです。もちろん100円。注意点として、ハトメの部分が銀色で、そのままだと安っぽく見えます。黒いマジックで高級感を出しましょう。こんな感じ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/09b7cd83-265a-fcd0-a235-0028c43bda01.png" width="600" height="300" />

## ネクタイ

**薄手・シルクまたはシルク混紡**

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/15b9b1c1-ec7d-9a15-5716-1067db90f98a.png" width="400" height="400" />

薄手というのがポイントです。芯が入っていないものが良いですね。結び目が大きいと、お昼寝でうつ伏せになった時に頸動脈が圧迫され、違った意味で眠ってしまいます。なおネクタイは結んだまま締めたり緩めたりを繰り返すので、結び方は形が崩れず結び目が小さいセミウィンザーノットがおすすめです。

https://shop.e-shirt.jp/dressing/howto_tie.php

## 靴下

**ドンキの先だけ綿の靴下**

エンジニアは座り仕事が多いので、靴下はある程度締めつけ感があるものを選ぶと、むくみが少なく疲労感を軽減できます。ただし汗を吸収する素材でないと加齢臭が気になるところです。私はドンキで先だけ綿の靴下を見つけ気に入って履いています。色は黒で肌が見えない長さのものがおすすめ、というかマストです。白だったり、ショートなソックスを選ぶと、途端にジャージとスニーカーを履いてる人に見えるから不思議なものです。神は細部に宿るといいますからね。

## ジャケット

**ユニクロ ドライストレッチジャケット（廃番？）**

<img src="https://qiita-image-store.s3.amazonaws.com/0/125752/7c0469c2-f7d2-ca33-dd2d-266cdf1141e0.png" width="400" height="400" />

季節商品なのか分かりませんが、2018/12/8現在、検索しても出てきませんでした。ユニクロにはジャージ素材の「コンフォートジャケット」もあり、いずれ試してみたいところです。パリッとしてて伸縮性があり、軽いのが良い点です。

## インナー

**ユニクロ エアリズム（Vネック・ベージュ)**

https://www.uniqlo.com/jp/store/goods/414286-32

締めつけ感が無く、軽くて良いです。ベージュのインナーはシャツから透けて見えないと言われますが、やっぱりそうだと思います。あと、洗濯しても一晩で余裕で乾くので、出張の際に荷物を減らせます。

# 最後に

肝心のワイシャツが、未だカイゼン半ばです。どこかで伸び伸び素材で見た目ちゃんとしているワイシャツ無いですかねー。

最後までお読み頂きありがとうございます。素敵な常駐ライフをお過ごしください。

現場からは以上です。
StringBuilderクラスについて

# はじめに

StringBuilderクラスで文字列連結する方法を把握していなかったため

知識を定着させるために今回まとめてみました。

## 説明
まずStringクラスは**Immutable**(不変)なクラスです。

そのため＋演算子で文字列連結するたびにメモリ上の領域が

広がってStringインスタンスが大きくなる訳ではありません。

仕組みとしては文字列を追加したり、変更するたびに

新しいStringクラスを生成されています。

つまり内部で何度もインスタンス化をしているので

JVMに負荷がかかり処理が遅くなります。

***「＋」を用いた文字列連結は、メモリを無駄に消費している。***

この問題を解決し、文字列連結を滞りなく行えるクラスが

<strong>StringBuilderクラス</strong>や<strong>StringBufferクラス</strong>です。

これらのクラスは**mutable**（可変）なクラスです。

append()メソッドによる文字連結は「＋」による文字列連結に

比べて非常に効率がいい処理が可能となります。

今回は<strong>StringBuilder</strong>についてまとめます。

## サンプルコード

流れとしては下記のようになります。

1. append()メソッドの実引数に値を入れて呼び出し、
バッファに文字列を追加していく。

2. 最後にtoString()メソッドを呼び出して
完成した文字列を取り出す。

>余談：バッファには緩衝という意味がある。
>　　　あと記憶領域という意味合いも持つ。　
>

サンプルコード

```Main.java
public class Main {

	public static void main(String[] args) {

		/*
		 * StringBuilderクラスをインスタンス化
		 * デフォルトで16文字分の容量（バッファ）を持つ。
		 */
		StringBuilder sb = new StringBuilder();

		//① append()メソッドを呼び、バッファに文字列を追加する
		
		sb.append("白ご飯,");

		sb.append("味噌汁,");

		sb.append("卵焼き,");

		sb.append("納豆");

		//② toString()呼び出し、文字列を取り出す。
		String morning = sb.toString();

		System.out.println(morning);
	}

}

```

出力結果

```Main.java
白ご飯,味噌汁,卵焼き,納豆
```

###メソッドチェーン

またappend()メソッドは戻り値が特殊です。

```APIドキュメント参照.java
//メソッド宣言
public StringBuilder append(String str)

```
・戻り値の解説：このオブジェクトへの参照

バッファに文字列を追加するためだけなら戻り値はvoidでも

構わないと思いますが、あえて「自分自身」を戻り値として

返すのは次のような呼び方を可能にするためです。

```Sample.java
StringBuilder sb = new StringBuilder();
sb.append("白ご飯,").append("ラーメン,").append("餃子");
```

このようにして自身への参照を返すメソッドを連続して

呼び出す方法を***メソッドチェーン***と言います。


##さいごに
今まで文字列連結は＋演算子で行ってきたので

少し戸惑いました（ズブの素人丸出し。。。笑）。

でもこのクラスを使うことで処理が格段に上がるのなら

1日でも早く使いこなせるようになりたいと思ってます！！

本当に「習うより慣れろ！」ですね笑

##参考

[Java入門　実践編](https://www.amazon.co.jp/dp/4844336770/ref=asc_df_48443367702547157/?tag=jpgo-22&creative=9303&creativeASIN=4844336770&linkCode=df0&hvadid=295686767484&hvpos=1o1&hvnetw=g&hvrand=10870490634135320322&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1028852&hvtargid=pla-524383774470&th=1&psc=1)

※上記の書籍を購入時は書籍の後ろのページで第○刷なのか確認する。
最新版を購入するようにしてください！
PHPで再帰呼び出し関数を使ってみる

# はじめに

なかなか使用しない（私だけ？）PHPでの再帰呼び出し関数を作ってみました。

# サンプルソースの概要

数字を英語表記に変更するプログラムです。
英語表記は1〜19までは固有ルールですが、20以降であれば汎用的な流れで処理することが可能です。
この特性を使って、再帰呼び出しで実現してみます。
※今回は100の位までを想定しています。

# サンプルソース

```php:hosomitakeshi.php
<?php
// メイン関数呼び出し
yasunorihayashi($argv[1]);

// 再帰呼び出しをするメイン関数
function yasunorihayashi(int $value) 
{
    if (floor($value / 100) >= 1) {
        echo sprintf('%s hundred ', yasunorihayashi(floor($value / 100)));
        yasunorihayashi($value % 100);
    } elseif (floor($value / 10) >= 2) {
        changeX0($value);
        echo ' ';
        yasunorihayashi($value % 10);
    } elseif (floor($value / 10) == 1) {
        change1X($value);
    } else {
        changeX($value);
    }
    return;
}

// teen
function change1X(int $value)
{
    switch ($value % 10) {
        case 1:
            echo 'eleven';
            break;
        case 2:
            echo 'twelve';
            break;
        case 3:
            echo 'thirteen';
            break;
        case 4:
            echo 'fourteen';
            break;
        case 5:
            echo 'fifteen';
            break; 
        case 6:
            echo 'sixteen';
            break;
        case 7:
            echo 'seventeen';
            break;
        case 8:
            echo 'eighteen';
            break;
        case 9:
            echo 'nineteen';
            break;
        default:
            echo 'abeshi';
            exit();
    }
    return;
}

// 10の位
function changeX0(int $value)
{
    switch (floor($value / 10)) {
        case 2:
            echo 'twen';
            break;
        case 3:
            echo 'thir';
            break;
        case 4:
            echo 'for';
            break;
        case 5:
            echo 'fif';
            break; 
        case 6:
            echo 'six';
            break;
        case 7:
            echo 'seven';
            break;
        case 8:
            echo 'eigh';
            break;
        case 9:
            echo 'nine';
            break;
        default:
            echo 'abeshi';
            exit();
    }
    echo 'ty';
    return;
}

// 1の位
function changeX(int $value)
{
    switch ($value) {
        case 0:
            break;
        case 1:
            echo 'one';
            break;
        case 2:
            echo 'two';
            break;
        case 3:
            echo 'three';
            break;
        case 4:
            echo 'four';
            break;
        case 5:
            echo 'five';
            break; 
        case 6:
            echo 'six';
            break;
        case 7:
            echo 'seven';
            break;
        case 8:
            echo 'eight';
            break;
        case 9:
            echo 'nine';
            break;
        default:
            echo 'abeshi';
            exit();
    }
    return;
}
```

# 実行例

```bash:実行例
$ php ./hosomitakeshi.php 24
twenty four
$ php ./hosomitakeshi.php 57
fifty seven
$ php ./hosomitakeshi.php 146
one hundred forty six 
$ php ./hosomitakeshi.php 457
four hundred fifty seven
$ php ./hosomitakeshi.php 0
$
```

応用すれば、1000以上の数値も対応することが可能です。
※0は考慮されていなかったり、色々改善点はあります…
右クリックでファイル名に日付のサフィックスをつける

[前回](https://qiita.com/aakasaka/items/ae07781d7bea447492a7)に引き続き、間違った方向に頑張るような話ですが。

ドキュメント管理もすべてgit等のVCSか、google driveのような版数管理可能なファイルシステムを使いたいご時勢ではありますが、実務では「とりあえずファイル名に日付つけとけ」的なシチュエーションが多々あります。

これをWindowsのエクスプローラー上で、右クリックメニューからできるようにしてみます。

## 動作イメージ

`foo.txt` に対し、右クリック＞「ファイル名に日付を付与」
⇒ `foo_20181212.txt` に！

## スクリプト

付与する日付としてファイルの最終更新日を利用する場合、Windows OS上での最終更新日の値を取得できる言語が楽だと思います。
ここではC#でやります。
更新日ではなく、単純に現在の日付を付与するとかでもいいかもしれません。

コンソールアプリケーションとして作成し、実行時の引数としてファイルパスを受け取ります。

受け取ったファイルパスのそれぞれに対し、 `Path.GetFullPath` でフルパスを取得してから、以下のような感じで変更後のファイルパスを生成します

```cs
// baseFile: 変更前のファイルパス
private static string createNewFilePath(string baseFile)
{
    // 最終更新日を取得
    var fileDate = File.GetLastWriteTime(baseFile);
    var dateStr = fileDate.ToString("yyyyMMdd");

    // ファイル名、拡張子、ディレクトリ名に分割
    var baseFileName = Path.GetFileNameWithoutExtension(baseFile);
    var ext = Path.GetExtension(baseFile);
    var dir = Path.GetDirectoryName(baseFile);

    // foo_yyyyMMdd.txt
    var newPathNoSuffix = Path.Combine(dir, string.Format("{0}_{1}{2}", baseFileName, dateStr, ext));

    if (!File.Exists(newPathNoSuffix)) return newPathNoSuffix;

    // 既に同名のファイルがある場合は、追番をつける
    var suffix = 1;
    while (suffix <= 99999) //一応適当な上限
    {
        // foo_yyyyMMdd_n.txt
        var path = Path.Combine(dir, string.Format("{0}_{1}_{2}{3}", baseFileName, dateStr, suffix, ext));
        if (!File.Exists(path)) return path;

        suffix++;
    }

    return null;
}
```

ソース全体は[こちら](https://github.com/aakasaka/FileDater)にあります。

ビルドして exeを作ったら、適当な場所に置いておきます。

## 右クリックメニューに追加

Winキー＋R で「ファイル名を指定して実行」を開き、 `regedit` と入れて レジストリ エディターを起動します。

HKEY_CLASSES_ROOT > * > shell の下に `filedater` というキーを追加し、その「値のデータ」に、右クリックメニューに表示する名前をつけます（「ファイル名に日付を付与」とか）。

この `filedater` の下にさらに `command` というキーを追加、「値のデータ」に、以下のように exeへのパスを入力します。

```
"C:\Path\To\FileDater.exe" "%1"
```

`%1` は、右クリックされたファイルのパスを引数として渡すことを意味します。

より詳しくは[こちら](https://uxmilk.jp/45337)などを参考にしてください。

## あとがき

※ この記事は個人の見解であり、所属する組織を代表するものではありません。
SketchとXD、結局どっちが良いの問題


# はじめに
１年ぶりです、デザイナーのshio312です。これは平成最期の☆Classi Advent Calendar 2018 12日目の記事です。

今回はUIデザイン2大ツールSketchとXDとで、意外に多い**「結局どう違ってどっちが良いの」「デザイナーじゃないけど触りたい」**と思われている方のために、2018年末の最新バージョンで比較してみました。


**Sketch**
https://www.sketchapp.com/

**XD**
Adobe Experience Design
https://www.adobe.com/jp/products/xd.html?sdid=19SCDRPN&mv=search&s_kwcid=AL!3085!3!314993583283!e!!g!!xd&ef_id=WXakMQAAAH2itgQF:20181207111834:s


## 比較1_純粋な導入コスト
- Sketch=年99ドル
- XD=無料（ただしAdobeアカウントの作成が必要）

Sketchは単体で見ると高くはないですが、チーム導入となると結構な額になります。
その点XDは無料。現状有料化するアナウンスはされていません。


## 比較2_UI
### Sketch
<img width="1496" alt="スクリーンショット 2018-12-07 21.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/132799/ffe7c4cd-4f0e-0da6-4401-674f4baf735e.png">
XcodeのUIと似ていて、iOSエンジニアが触るには優しい構成のはず。
ショートカットが充実していたり「知っていたら使える要素」が結構あり、<font color="Red">「使えば使うほど手に馴染む」道具</font>の感じ。

### XD
<img width="1355" alt="スクリーンショット 2018-12-07 21.57.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/132799/1246a7f2-3df6-fdbd-6aaa-f73b0f3cb867.png">
ぱっと見機能数が少ないように見えますが、クリックするとUIが変化したり、特定の操作だけがフォーカスされるなど、わりと直感的な操作が可能になっていて、<font color="Red">デザイナー以外のプロジェクトメンバーが触るのにも向いています。</font>


## 比較3_機能
### Sketch
##### 画面作成コスト削減に命をかけている
XDに比べて多少重かったSketchが秋のバージョンアップで改善され、よりサクサクに。
ライブラリのテキストスタイルに直接アクセスできるようなったりと、画面作成の速さ・便利さに磨きがかかりました。
外部プラグインの数もXDに比べて圧倒的な数です。
##### デザインバージョン管理・共有ツール[「Abstract」](https://www.goabstract.com/)に対応している
Sketchデータのバージョン管理とデザイン共有に特化したツール。
実は弊社ではSketchと組み合わせてAbstract使用していて、非デザイナーのメンバーをゲストとして招待し、レビュー依頼を行うフローを導入しています。
##### <font color="Red">Googleの「Gallery」がアツいぞ</font>
Google提供のデザインコラボレーションツール[「Gallery」](http://...)がリリースされ、Sketchとの連携が可能になりました。
<img width="1194" alt="CECF7AAB-D862-4AC7-90B8-1ED3E48F33B8.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/132799/19b1af04-b19b-8c5d-82a6-478d072deb0b.jpeg">

デザイン共有、レビュー、バージョン管理が無料で提供されています。
Galleryを使うと、Sketchの少しまだ未熟なプロトタイプ機能を我慢さえすれば、デザイン、プロトタイピングから実装指示、バージョン管理までが可能になります。

### XD
#### 機能が揃ってきた
去年まではSketch優勢と言われていた部分（外部ファイル連携）やレスポンシブ機能が補完され、Sketchとの差が無くなってきています。
#### 自動アニメーションというキラーツール
さらに、[自動アニメーション](https://helpx.adobe.com/jp/xd/help/create-prototypes-using-auto-animate.html)という機能が実装され、マテリアルデザインを意識したアニメーションや、インタラクティブな遷移の表現がXD完結で可能になりました。
<font color="Red">デザイナーの「なんかこういう感じでニューッて出したい」という無茶振りに対応しやすくなりました。</font>
外部プラグインがユーザー自身で開発できるようになり、今後増えていく見込み。すでにSketchプラグインの有名どころの一部はXDに対応されています。
#### <font color="Red">デザイナー（作業者）以外がUI 開発にコミットできる</font>
無料かつWindowsにも対応していて、かつ直感的なUIを持つXDのみで設計・プロトタイピング・実装指示が可能になったことで、企画からデザインまでが一貫して行えるようになりました。多数の企業がXDを利用したワークフローを導入しています。
参考）[無料で使えるAdobe XDの社内導入を後押しする活用事例5選](https://ics.media/entry/18004)


余談ですが今年のAdobeMAXJapanでは、来年の展開として「バージョン管理」「共同管理」「アニメーションのコード吐き出し」などの機能追加を宣言しており、来年あたりに、純粋な機能面でSketchを超える可能性が出てきています。



## 結論
**Sketch**
デザイナーが、UIを品質良く・早く作ることに最適で、サードパーティを使うことで可能性が広がる
**XD**
直感的なUIを持ち、事業を横断するプロジェクト、ブランディング含めた総合開発に最適


SketchとXD、2018年末の段階では**<font color="Red">「どちらが優れているのか？」ではなく、「どちらが自分たちの課題解決に向いているか」</font>**で判断すべき時期になったと言えます。


まずは、どちらのツールも一度使ってみてください。
両者ともたくさんの機能が備わっており、使い方と目的次第で皆さんのプロジェクトを圧倒的に効率よく回す事ができるツールのはずです。
ODBC ManagerとDBI::ODBC

故あってMac OS X 10.11.6で環境構築中。

# 問題

ODBC Managerは、/Library/ODBC/にodbc.iniやodbcinst.iniを生成する。

brewでインストールしたunixodbcは、/usr/local/Cellar/unixodbc/2.3.x/etc/にodbc.iniやodbcinst.iniが存在することを期待するようだ。

```
$ odbcinst -j
unixODBC 2.3.x
DRIVERS............: /usr/local/Cellar/unixodbc/2.3.x/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/Cellar/unixodbc/2.3.x/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/Cellar/unixodbc/2.3.x/etc/ODBCDataSources
USER DATA SOURCES..: /Users/foo/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
```
この状態でDBI.connectしようとすると、[unixODBC][Driver Manager]Data source name not found, and no default driver specified)と怒られる

# 解決方法

ODBC Managerが生成したiniにシンボリックリンクを張る

```
$ rm /usr/local/Cellar/unixodbc/2.3.x/etc/odbc.ini
$ ln -s /Library/ODBC/odbc.ini /usr/local/Cellar/unixodbc/2.3.x/etc
$ rm /usr/local/Cellar/unixodbc/2.3.x/etc/odbcinst.ini 
$ ln -s /Library/ODBC/odbcinst.ini /usr/local/Cellar/unixodbc/2.3.x/etc
```

rdbi-driver-odbcがbuildできないのは、何故だろうなー
Ada言語を習得する日記一覧

#はじめに
これは、[2018年12月09日]から、私がAda言語を習得する記録を日記として残したものです。

#環境 その1
下の記事で使用する環境です。

 - OS : Ubuntu 18.04
 - コンパイラ : gcc 7.3.0 GNAT 7.3.0
 - リンカ : GNATLINK 7.3.0

#環境 その2
 - OS : Windows10
 - IDE : GNAT Community 2018
 - [GNAT Community 2018 導入方法](https://qiita.com/C_Assembly/items/d138469bffcacc75b793)

# HPや資料
 - [AdaCore HP](https://www.adacore.com/)

#日記一覧
  - [1日目 Hello World](https://qiita.com/C_Assembly/items/221c934a2250ca35aa04)
  - [2日目 変数(Integer型)](https://qiita.com/C_Assembly/items/8ba24ba62a768d3551db)
  - [3日目 構造体](https://qiita.com/C_Assembly/items/989dc8597bd3d8712dc6)
  - [4日目 配列](https://qiita.com/C_Assembly/items/c78e5956624aa903e85f)
  - [5日目 何もしないプログラム](https://qiita.com/C_Assembly/items/901999688674cd02bd60)
  - [6日目 if文](https://qiita.com/C_Assembly/items/eeae4016dc68dde99cef)
  - [7日目 switch case文](https://qiita.com/C_Assembly/items/346532b7b2edc72f6e59)
  - [8日目 for文](https://qiita.com/C_Assembly/items/47d60650132b9657e635)
  - [9日目 FizzBuzz](https://qiita.com/C_Assembly/items/cf7137fb20c369561f76)
  - [10日目 定数宣言](https://qiita.com/drafts/465de1224acd755e8d94/edit)
  - [11日目 while文](https://qiita.com/C_Assembly/items/dd2fd8ee45e641b2d8ff)
  - [11.5日目 最強のIDE見つけた](https://qiita.com/C_Assembly/items/d138469bffcacc75b793)
  - [12日目 キーボード入力と整数の足し算](https://qiita.com/C_Assembly/items/022c480d96f52b1d1587)
  - [13日目 関数](https://qiita.com/C_Assembly/items/d55fcdd1b6a3a6d9b0ff)
  - [14日目 ファイル分割](https://qiita.com/C_Assembly/items/37c0fd12d5be14e122c1)
  - [15日目 クラスっぽいもの (package)](https://qiita.com/C_Assembly/items/80e72f5590ceee668023)
  - [16日目 キャスト](https://qiita.com/C_Assembly/items/aad6903a64f9f152d7c4)
シェルソートの計算量の紹介

## はじめに
ソートは最もよく使われるアルゴリズムのうちの一つで、様々なソートアルゴリズムが知られています。
クイックソートやマージソートは有名です。それらのアルゴリズムに比べると少し知名度が低いですが、シェルソートというアルゴリズムがあります。
シェルソートの計算量は複雑ですが、いくつか紹介したいと思います。

## 挿入ソート
シェルソートを考える前に挿入ソートについて触れておきます。
挿入ソートは、「ソート済みの部分を順番に見て挿入すべき場所を見つけて挿入する」というシンプルなアルゴリズムで、計算量は$O(n^2)$です 。
クイックソートやマージソートは平均計算量が$O(nlogn)$であることを考えると非常に低速です。しかし、挿入ソートには「だいたいソートされていれば高速にソートできる」という性質があります。
正確に言うと「N＋反転しているペア（i < j and a[i] > a[j] ）の個数」が挿入ソートの計算量です。ソートされている状態に近いならば、反転しているペアの数も少なく高速にソートできるのです。

## シェルソート
シェルソートは挿入ソートを部分列に対して何回か行うアルゴリズムです。

1. 間隔hをえらび、間隔がhである部分列h個に数列を分割する。例えばhが3ならば、$(a_0,a_3,...),(a_1,a_4,...),(a_2,a_5,...)$となる。
1. それぞれに対して挿入ソートを行う
2. hが1ならソートされている
2. hを小さくして1に戻る

挿入ソートは要素が大きく動くと多くの要素のcopyが発生して計算量がかかります。要素を大きく動かすことでそのボトルネックが解消され挿入ソートと比べて高速にソートできます（そんな気がする）。
そこそこ高速なソートアルゴリズムの中ではアルゴリズムを実行するために必要なメモリ数が非常に少なく、メモリがシビアな組み込み系などでは使われているという噂です。

## 計算量

以上で述べたシェルソートの計算量は一体どれほどなのでしょうか。実はこれは非常に難しい問題です。シェルソートの計算量は間隔をどのように取るかに依存しています。最悪計算量が解析されている間隔列は数多くあり、有名なものは英語版Wikipedia https://en.wikipedia.org/wiki/Shellsort にまとめられています。平均計算量が解析されているものはほとんどなく大部分が未解決問題です。また平均計算量が$O(n\log n)$となるような間隔列が存在するかどうかも未解決問題です
いくつか上げてみると

$ \frac{N}{2} , \frac{N}{4}, \frac{N}{8},..$
これは最悪計算量$O(n^2)$, 平均計算量は$O(n^{1.5})$,でshellが最初に提案した論文で用いられていたものです。

$ \frac{3^k-1}{2}$
最悪計算量$O(n^{1.5})$,これはknuthの本で紹介されているもので平均計算量は未解決ですが$O(n^{1.25})$と予想されています

素因数が2,3しかないような数全体
最悪計算量$O(n\log^2n)$, 現状最悪計算量がもっとも良い間隔列のうち一つです。

## 最悪計算量の評価の証明
最悪計算量が$O(n\log^2n)$ であることを証明します。
p-ordered というのを `a[i] < a[i+p] `が常に成り立っているものとします。
シェルソートの間隔hのステップのあとはh-orderedです。
シェルソートの一回のステップのことをh-sortと呼ぶことにします。
間隔hで取った部分列のことをh-chainと呼ぶことにします

#### x-ordered な数列をy-sortしてもx-ordered
a[i]<a[i+x]であったとする。xがyの倍数ならば自明。そうでないとする。
y-sortすると、a[i]はa[i+ny]として書ける要素(y-chainとなる)と交換される可能性があり、
a[i+x]はa[i+x+ny]として書ける要素と交換される可能性がある。
a[i]が属するy-chainをA, a[i+x]が属するy-chainをBとする。
a[i+x]がBの中でt番目に小さいとする。すると、Bの中にa[i+x]以下の要素がt個存在し、それに対応するAの要素を考えると、Aの中にa[i+x]より小さい要素がt個存在する。
よってAの中でt番目に小さい要素はa[i+x]よりも小さい。
よってAとBをどちらもソートしても、x-orderedという性質は保たれる。

#### 2-orderedで3-orderedな数列を挿入ソートするとO(n)
任意の2より大きな数は$2n+3m$と書けるため、任意の2以上の数pに対してp-orderedになっている。
よって、任意の要素について、反転している要素として考えられるのは隣り合った２つの要素のみ。
よって反転しているペアの数は$O(n)$である。
よって挿入ソートの計算量は$O(n)$

このことより、2p-orderedかつ3p-orderedな数列をp-sortするときの計算量は$O(n)$である。

素因数が2と3のみのN以下の数は$O(\log^2n)$個である。
素因数が2と3のみの数を間隔列としてシェルソートを行うと、p-sortするときはもうすでに2p-sortと3p-sortされた後であり、2p-orderedかつ3p-orderedされた数列となっている。
よって一回のステップが$O(n)$でおわり全体で$O(n\log^2n)$である。
以上より示された

## 終わりに
ソートアルゴリズムは基本的な話かと思いきや、ソートアルゴリズムは最近でもトップカンファレンスに時折論文が投稿されるホットで未開拓の分野です。
みなさんもぜひシェルソートの平均計算量を解析してみてください。