OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoでユーザー登録機能を作る

# はじめに
前回の[Djangoでログイン・ログアウト機能を作る](https://qiita.com/gami24/items/8093e3d3d04f656f6d16)に続いて、djangoでユーザー登録機能を作る方法を書きます。
# ユーザー登録機能を実装する
以下の手順で行います。

+ ユーザー登録ページのurlを設定する
+ viewの設定をする
+ ユーザー登録ページを作成する

## ユーザー登録ページのurlを設定する
urls.pyのurlpatternsに以下のようなpathを追加する。

```py
urlpatterns = [
  ・・・
  path('signup/', views.signup, name='signup'), 
]
```

## viewの設定をする
views.pyに以下を追加する。
ユーザー登録後、認証、ログインするようにしている。

```py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import authenticate, login

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST) # 入力された値からUserインスタンスを作成
        if form.is_valid():
            new_user = form.save() # ユーザーインスタンスを保存
            input_username = form.cleaned_data['username']
            input_password = form.cleaned_data['password1']
            # フォームの入力値で認証できればユーザーオブジェクト、できなければNoneを返す 
            new_user = authenticate(username=input_username, password=input_pa 
            # 認証成功時のみ、ユーザーをログインさせる
            if new_user is not None:
                login(request, new_user)
                return redirect('app:users_detail', pk=new_user.pk)
    else:
        form = UserCreationForm()
    return render(request, 'app/signup.html', {'form': form})
```

## ユーザー登録のページを作成する
signup.htmlを作成します。ここでは、base.htmlを拡張しています。

```py
{% extends 'app/base.html' %}

{% block content %} 

<h2>ユーザー登録</h2>

<form method="post" action="{% url 'app:signup' %}">{% csrf_token %} 
    <label>ユーザー名</label>
    {{ form.username }}
    {{ form.username.errors }}
    <br>
    <label>パスワード</label>
    {{ form.password1 }}
    {{ form.password1.errors }}
    <br>
    <label>パスワード(確認)</label>
    {{ form.password2 }}
    {{ form.password2.errors }}
    <br>
    <input type="submit" value="登録する">
</form>

<p><a href="{% url 'app:login' %}">ログインはこちら</a></p> 

{% endblock %}
```
Railsのenum値を設定するだけで、自動でI18n.translate対応用のメソッドが使えるようにする

## はじめに
自分でチョロっと作ったプロジェクトで、I18nの翻訳のキーを毎回書くのが面倒だったので、このような形も一つのやり方かもしれないのでメモっておいた。もっと良いやり方があれば知りたい。
例えばdecoratorとかに書くのもよいが、全てのenumに対して翻訳のキーが必要とすると、それをいちいち書くのもめんどくさい。

## 環境
- ruby 2.6.3
- Rails 5.2.3

## localesを設定する
※実際にこのルールである必要はないが、サンプルでI18nを使っている

```yml
ja:
  models:
    items:
      enums:
        status:
          draft: 下書き
          publish: 公開中
          sellout: 売切れ
```

## enum翻訳用のメソッドを拡張モジュールに置く
※先程のルールに合わせ、keyを指定する

```rb
module Extensions
  def enum_translated(enums, option = {})
    enum enums.merge(option)
    define_method("#{enums.keys.first}_t") do
      # localeの仕様に合わせれば良い
      I18n.t("models.#{self.model_name.plural}.enums.#{enums.keys.first}.#{self.send(enums.keys.first)}")
    end
  end
end
```

## モデルに通常 `enum` と書くところを `enum_translated` で設置

```rb
class Item < ApplicationRecord
  extend Extensions

  enum_translated status: { draft: 0, publish: 1, sellout: 2 }, _prefix: true
end
```

## 使うとき

`カラム名_t` で翻訳される

```rb
item = Item.new(status: :publish)
item.status # publish
item.status_t # 公開中

# prefixなども動く
Item.status_draft # status == :draft のレコードを取得
```
AWS EC2上でRailsアプリをDeployした時に、「Mysql2 Access denied for user 'root'@'localhost' (using password: NO)」とエラーが起きてしまう

# 問題
```database.yml
production:
  <<: *default
  adapter: mysql2
  encoding: utf8
  pool: 5
  database: RailsTutorial_on_EC2_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```
database.ymlのパスワードに環境変数を埋め込んでいて、~/.bash_profileにその環境変数を記述しており、rails console上でENV['DATABASE_PASSWORD']で正しく表示されることを確認したにもかかわらず、
```
Access denied for user 'root'@'localhost' (using password: NO)
```
とエラーが起きてしまう。

# 解決
```:/etc/environment
export DATABASE_PASSWORD='（パスワード）'
```
/etc/environment に環境変数を記述したら読み込まれるようになった。
私がWindowsからMacに乗り換えた時に、真っ先に覚えたキーボードショートカット

私は、2019年4月まで、仕事での開発環境はWindows PCでした。
2000年から社会人になったので、ほぼ20年。

その後、業務上プロジェクトの都合でMacに環境を乗り換えることになり
「Windowsでいう○○はMacではどうやるの？」みたいな躓きがあったので
その中でも特に、今でも頻繁に使っているものを記載します。

（前提として、Win/Macとも キーボードは日本語配列を使っています）

## 画面ロック

業務現場だと、特にプライバシーマーク取得企業だと、離席時の画面ロックは必須かと思います。
Windowsだと `Winキー + L` （LockのLと覚える）
Macでは `⌘ + Ctrl + Q`
※ Ctrl押しそこねて `⌘ + Q` を入力すると、カレントのアプリが終了してしまうので注意。

## Google日本語入力で、かな入力中に半角英数で確定する時

「MacデフォルトのIME使えよ」という声が聞こえてきそうですが
長らくWindowsでGoogle日本語入力を使っていたので
Macでもこちらのほうが個人的には使いやすいのです。
かつ、自宅ではWindowsも使うので、Min/Mac共通で使えるGoogle日本語入力はありがたい。

で、かな入力中に、半角英数で入力を確定したい時。
Windows では `Ctrl + T`
Macでは `Ctrl + :`
この方法がしばらくわからず、日本語英語交じりの文章をMacで打つ時しばらく苦労していました。

## スクリーンショット

業務では、「この画面」というのをスクショとって共有することが多いので。

Windowsでは、`PrintScreen`（全画面）または `Alt + PrintScreen` （アクティブウインドウ）
Macでは `⌘ + Shift + 5`
Macのスクショは、標準機能で範囲指定して保存できるのいいですね。Windowsにも欲しい。

（2019.08.18追記）
コメントいただきました。
Windowsでは `Win + Shift + S` で範囲指定してスクリーンショットが取れます。

## バックスラッシュの入力

エンジニアしていると、バックスラッシュ記号入力することありますよね。
自分はPHPer なので、Namespaceの区切りとして使います。

Windowsでは、キーボードで `\` マークが刻印されているキー
（日本語配列だと、`^`の右隣り、または`/`の右隣り）
どちらでもバックスラッシュ（利用フォントによっては表示上は `￥` ）になりますが
Macでは バックスラッシュ `\` と Yen記号 `￥` が区別されてて、これに気づかず結構ハマりました…

Macでバックスラッシュ入力は `Optionキー` を押しながら、Windowsでいう `￥` を入力するキーを押す。
LeetCode / Linked List Cycle

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/17/103553)からの転載）

Kaggle繋がりでTwitterでばったりフォローした人がばったり旧知の囲碁友だった件。
ちょうど今日の問題のLinked Listのようにぐるりと回って再会しました（無理矢理

[https://leetcode.com/problems/linked-list-cycle/]

Given a linked list, determine if it has a cycle in it.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the second node.
<img width="310" alt="スクリーンショット 2019-08-17 10.24.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/23f4e5de-ba51-5a98-bda5-5c406b2d7b49.png">
Example 2:
Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the first node.
<img width="148" alt="スクリーンショット 2019-08-17 10.24.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/22b9dcf0-2461-d811-100b-ad3e8e5d5c23.png">
Example 3:
Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
<img width="65" alt="スクリーンショット 2019-08-17 10.24.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/5440467f-8b97-c29d-7b59-b31dfd274dac.png">

連結リストというデータ構造がお題です。
与えられた連結リストに循環構造が含まれているか（＝循環リスト）、判定する問題です。

#### 解答・解説

##### 解法1
はじめて連結リストというデータ構造を見た人が既存の知識で対応しようと思うと、以下のようになると思います。

```python
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def hasCycle(self, head):
        nodesSeen = set()
        while head is not None:
            if head in nodesSeen:
                return True
            else:
                nodesSeen.add(head)
            head = head.next
        return False
```

各要素をsetにどんどん入れていって、既にsetに入っている要素に再度出会ったら循環しているということなのでTrueを返し、そのようなことが起きずこれ以上要素がないところまでloopが回ったらFalseを返せば良いです。

##### 解法2
解法1では空間計算量は$O(n)$になりますが、これを定数時間で行う方法が以下のコードです。

slowとfirstという２つのポインタを用意します。slowは1要素ずつ、firstは2要素ずつ進むポインタで、slowの1つ先にfirstを置いてスタートさせます。
すると、もし循環リストであれば、slowがリストの終端まで進む間に、firstは必ずどこかでslowに出会います。

なぜなら、slowがリストの終端まで進むnステップの間にfirstは2n進むことになりますが、firstが追いつかなければいけないslowとの距離は、最大で下図の場合で2n-1なので、1要素ずつ距離を詰めるfirstはnステップの間に必ずslowに追いつけることになります。
![図1_190817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/482ac6e1-5bdd-3c35-88d6-512f99089b6b.png)

```python
class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head or not head.next:
            return False
        slow = head
        fast = head.next
        i = 0
        while slow is not fast:
            if not fast or not fast.next:
                return False
            slow = slow.next
            fast = fast.next.next
        return True
```
携帯電話(SH-RM02)を新品に換えるのに困ったこと

携帯電話(SH-RM02@sharp)

#1. バックアップの取り方がわからない。

ネットで検索して操作をしていたら、途中で有料メニューでないと全部がバックアップできないと出てきた。　辞めた。

#2. マニュアルがない

ネットでSH-RM02で検索したら出てきた。
https://k-tai.sharp.co.jp/support/other/shrm02/manual/index.html

#2 SDカードの取り外し方がわからない。

SDカードを押したら、取り出せるようになるような記憶が蘇ってきた。
押した。
取り出せた。

#3 micro simカードの取り出し方がわからない。

マニュアルでは簡単に取り出せるように書いてある。

爪で、白いものを何度かひっかけようとしたら取れた。

#4 micro simカードの差し込み方がわからない

取り出した時、ケースとカードがばらばらになって机の上に落ちた。
どういう状態で入っていたかわからなくなった。

マニュアルを読んで、切り掛けの位置で、micro sim カードが治るようになる方向がわかった。

差し込み口が、SDカードとmicro simカードでどっちがどっちかわからなくなった。

マニュアルを読んで、携帯の裏表と、どちらに口があるかの図をみながらやってみた。

micro simカードのケースの向きが違うと、蓋がしまらないことがわかった。
蓋が閉まる方向で差し込まないといけないことがわかった。
やってみてわかった。

micro simカードがうまく挿さったら、SDカードは容易に入った。


# アプリの入れ方がわからない。

google 

#OSの更新

OSのダウンロードが中断していた。
Wi-Fiの設定をしてから続行した

#Lineの登録

年齢確認で
NTT docomoをご契約の方
Lineモバイルをご契約の方

がでてきてdアカウントを聞いてくる。
楽天で契約しており、dアカウントを作った記憶がない。

idをお忘れの方が出てくる。

ドコモの回線をご契約あれているお客様
ドコモの回線をご契約されていないお客様

メールでIDを確かめる。

IDを入れたら、次のMSGが出た。

>本サービスはドコモの回線をお持ちの方向けのサービスです。
お客様のdアカウントはドコモの携帯電話の登録がなわれていないため、本サービスをご利用いただけません。

よく見たら「あとで」という選択肢があった。

なんだ、最初から言ってよ。


# 文書履歴(document history)
ver. 0.01 初稿 20190828
ver. 0.04 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
【Go言語】パスワード入力モード中断時にターミナルで入力文字が非表示になってしまう問題の解決

# 何がしたかったのか

以下のように、のぞき見に耐性をつけるために、入力中のパスワードを非表示にすることがある。

```bash
$ ./command #何らかのコマンド
Enter password:             # P@ssw0rd を入力
Your password is 'P@ssw0rd'
```

これをGo言語で実装したい。
ということで、調べてみると意外とすぐに見つかる。
おそらくすぐに出てくるのは、以下のコード。

```go
package main

import (
	"fmt"
	"syscall"

	"golang.org/x/crypto/ssh/terminal"
)

func main() {
	fmt.Print("Enter password: ")
	pwd, err := terminal.ReadPassword(syscall.Stdin) // ここ一行で実装可能
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println()
	fmt.Println(string(pwd))
}
```

すごくシンプルで簡単だが、一つ罠がある。

パスワード入力画面で `Ctrl + C`などで中断した際に、その後の **ターミナル上での入力がすべて非表示状態になってしまう** 。

```bash
$ ./command # 何らかのコマンド
Enter password:    # 入力途中で Ctrl+C
^Csignal: interrupt
$ # 何を打っても表示されない
```

なのでこれを解決しよう。

# 解決策

解決方法としては、Ctrl+Cのシグナルをキャプチャして、シグナルを受信した場合、ターミナルの非表示状態を解除すればよい。
実装すると以下のコードになる。

```go
package main

import (
	"os"
	"os/signal"
	"syscall"

	"golang.org/x/crypto/ssh/terminal"
)

func ReadPassword() ([]byte, error) {
    // Ctrl+Cのシグナルをキャプチャする
	signalChan := make(chan os.Signal)
	signal.Notify(signalChan, os.Interrupt)
	defer signal.Stop(signalChan)

    // 現在のターミナルの状態をコピーしておく
	currentState, err := terminal.GetState(int(syscall.Stdin))
	if err != nil {
		return nil, err
	}

	go func() {
		<-signalChan
        // Ctrl+Cを受信後、ターミナルの状態を先ほどのコピーを用いて元に戻す
		terminal.Restore(int(syscall.Stdin), currentStates)
		os.Exit(1)
	}()

	return terminal.ReadPassword(syscall.Stdin)
}
```

たったこれだけ。考えると単純だが、最初詰まった時は困った。

# 参考

- [terminal - GoDoc](https://godoc.org/golang.org/x/crypto/ssh/terminal)
- [Watch for signals in terminal · GitHub](https://gist.github.com/montanaflynn/5ae3eeae7212b0ba232f46e88f1ab67f)
GitLabでSSHを22番ポート以外で運用している時のリポジトリパスの指定方法

GitLabのリポジトリをSSH経由でcloneする際などに指定するパスの書き方。

SSHのデフォルトポート22番で運用している場合は

```
git@gitlab.example.com:＜Guroup名＞/＜Project(リポジトリ)名＞.git
```

と指定する。
（ユーザ名、ドメイン名は適宜それぞれの環境にあわせて読み替えてください）

一方、現場によっては、セキュリティ施策の都合で
SSHをデフォルト以外のポートで運用していることもあるかと思う。
その場合は以下のように指定する。

```
ssh://git@gitlab.example.com:＜ポート番号＞/＜Guroup名＞/＜Project(リポジトリ)名＞.git
```

先頭に `ssh://` をつけるのと、
ポート番号の後ろの区切りがコロン `:` ではなく、
スラッシュ `/` になるところがポイント。
HTMLでのボタンの作り方を紹介します！

こんにちは、未来電子テクノロジーでインターンをしている山本拓磨と申します。
時の流れというのは早いもので、プログラミングを学び始めてから、3ヶ月が過ぎようとしています。
今回は、HTMLで学んだコードから一つ厳選して紹介していこうと思います。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。


☐ボタンの作り方！

まず、btn wrapperのようにクラスを指定します。
そしてその中に、aタグを作ります。
また、ボタンを押せるようにするためには、<a href=# をつけてから、クラスを指定する必要があるので覚えておきましょう。
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429658/61716397-24af-f714-1ddf-df69b7854f07.png)

例えば上記のようになります。


☐注意点
aタグですが、インライン要素に含まれるため、widthやheightを設定できません。
また、marginやpaddingも左右のみにしか設定できません。
したがって、displayプロパティを使うことでインライン要素をインラインブロック要素に変更する必要があります。
Stanford CoreNLPの使用時に発生するエラーの解決策【ExceptionPexpect:java / OSError・EOF】

# はじめに
英語の文章を構文解析したかったので、Stanford CoreNLPを使用することに。
導入時に2つのエラーが発生して苦労したのでメモ。

# 環境
Ubuntu 18.04.2
Anaconda 3 5.3.1
Python 3.7
Jupyter Notebook

# ダウンロード
まずは以下のコマンドでStanford CoreNLPをダウンロードし、Pythonで使用できるようにしました（[参考記事](https://qiita.com/yubessy/items/1869ac2c66f4e76cd6c5)）。

```
$ curl -L -O http://nlp.stanford.edu/software/stanford-corenlp-full-2013-06-20.zip
$ unzip ./stanford-corenlp-full-2013-06-20.zip -d /usr/local/lib/
$ pip install corenlp-python
```

# 発生したエラーと解決策
## その1
ダウンロードが終わりさっそく使ってみようと以下のようなコードを実行。

```python
import pprint
import json
import corenlp

corenlp_dir = "/usr/local/lib/stanford-corenlp-full-2013-06-20/"
parser = corenlp.StanfordCoreNLP(corenlp_path=corenlp_dir)

result_json = json.loads(parser.parse("This is test."))
pprint.pprint(result_json)
```

すると、以下のエラーが発生。

```
ExceptionPexpect: The command was not found or was not executable: java.
```

Javaが実行できていないというエラーですね。
Stanford CoreNLPを動かすためには、Javaが必要らしいです。UbuntuにJavaを入れることで解決しました（[UbuntuにJavaをインストールする方法](https://www.sejuku.net/blog/85358)）。

## その2
Javaをインストールし、使えるようになったはず...と思っていたら、また新しいエラーが発生。実行したコードは**その１**に記述したものと同じです。

```
OSError Traceback (most recent call last)
OSError: [Errno 5] Input/output error

EOF Traceback (most recent call last)
EOF: End Of File (EOF). Exception style platform.
```

[こちらの記事](https://qiita.com/yubessy/items/1869ac2c66f4e76cd6c5)にあるように、`user.properties`ファイルを作成したら動くようになりました。`user.properties`ファイルは機能を制限したい場合のみ作成すれば良いと思っていたのですが、どうやら必須のようですね。気が付くまでかなり時間がかかった...

Stanford CoreNLPは英文用のパッケージなので、日本語の文献は少ないですね。また何かあれば記そうと思います。

以上
【まとめ】Docker初心者が参考にした記事まとめ

# はじめに
Docker初心者が参考にしたリンクをまとめました。

# Dockerってなに？
ここを参考にしました。
[Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)


# 参考にしたリンク集

* Dockerコンテナの構築まで
[【Linux入門】DockerでUbuntu18.04を構築する方法](https://www.sejuku.net/blog/82240)

* Dockerfileの書き方
[Dockerfileを書いてみる](https://qiita.com/nl0_blu/items/1de829288db2670276e8)

* Dockerコマンドの一覧
[docker container / image コマンド新旧比較](https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266)

* ホストとコンテナ間のファイルのコピー
[Docker のホストとコンテナ間でファイルをやり取りする](https://blog.amedama.jp/entry/2018/01/30/221546)

* 構築済みコンテナ内で作業した結果をイメージ化したいとき
[Dockerの作業済みコンテナからイメージを作って移植を楽にする](https://qiita.com/tubone/items/a3bad04abf4c700cae3d)
php-master-changes 2019-08-16

今日は AppVeyor の設定修正、gen_stub.php の可変引数サポート追加、arginfo を PHP スタブに移行する修正があった！

# 2019-08-16
## Stricted: appveyor: exclude some documentation paths
- https://github.com/php/php-src/commit/0b6d869d7cc85bb7c1a0ac624a932b8ebe85dd8a
- [7.4~]
- AppVeyor の設定で、ドキュメントのコミットはスキップする設定の追加

## nikic: Support typed variadic args in gen_stubs
- https://github.com/php/php-src/commit/37a8408e83057c13cc14b29018f698f4244d151e
- gen_stub.php で、可変引数のサポートを追加

## iNem0o: Add ftok arginfo stubs
- https://github.com/php/php-src/commit/f1eca42825eca314f8d3f6991d7cb3f3b634d4a8
- [ftok()](https://www.php.net/manual/ja/function.ftok.php) の arginfo を PHP スタブに移行

## iNem0o: Add lcg arginfo stubs
- https://github.com/php/php-src/commit/f795bdfd30673de29908103abb0439a4af36988e
- [lcg_value()](https://www.php.net/manual/en/function.lcg-value.php) の arginfo を PHP スタブに移行
Git CLIでマージ数、コミット数などの統計情報を取る

## 特定期間内の master ブランチへのマージ数

例えば、過去1週間分の集計をしたい場合

`master` ブランチをcheckoutしたwork directoryで以下を実行

```
git log --after="`date -d '-1 week' '+%Y-%m-%d 00:00:00'`" --before="`date -d today '+%Y-%m-%d 00:00:00'`" --oneline --merges | grep "into 'master'" | wc -l
```

## 特定期間内のcommit数

```
git log --after="`date -d '-1 week' '+%Y-%m-%d 00:00:00'`" --before="`date -d today '+%Y-%m-%d 00:00:00'`" --oneline --no-merges | wc -l
```

## 特定期間内にcommitされたファイル数

```
git log --after="`date -d '-1 week' '+%Y-%m-%d 00:00:00'`" --before="`date -d today '+%Y-%m-%d 00:00:00'`" --numstat --no-merges --pretty=format:"" | sed '/^$/d' | wc -l
```

## 特定期間内にcommitされたファイルの additions と deletions それぞれの合計

```
git log --after="`date -d '-1 week' '+%Y-%m-%d 00:00:00'`" --before="`date -d today '+%Y-%m-%d 00:00:00'`" --numstat --no-merges --pretty=format:"" | sed '/^$/d' | awk '{plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'
```

出力例

```
+29663, -32369
```

最後の awk処理は以下を参考にした。
http://koyamay.hatenablog.com/entry/2014/10/06/022654
Dcoder という Android アプリでスマホ上でプログラミング・実行確認をする

## はじめに

最近 [atcoder](https://atcoder.jp) の過去問を練習し始めました。練習をする中で、手元に PC がないときや移動中のスキマ時間に、頭に浮かんだ簡単なコードを実行したいなと思うときがあると思います。

そんなときに、スマホでプログラムを実行できるアプリはないかと探していたところ、Android アプリに [Dcoder](https://dcoder.tech) というアプリがあり、それが良さそうだったので紹介します。

## Dcoder とは

[Dcoder](https://dcoder.tech) とは、モバイル端末用のプログラミング言語の実行環境(IDE)です。アプリ上のエディタでプログラミングができ、書いたプログラムをクラウド上のコンパイラでコンパイルし、実行した結果を確認できます。

利用イメージは [Dcoder の公式サイト](https://dcoder.tech) を見てもらえるとわかりやすいと思います。

サポートしている言語は30以上とのこと。[アプリのダウンロードページ](https://play.google.com/store/apps/details?id=com.paprbit.dcoder)に利用可能なプログラミング言語（主要なプログラミング言語はコンパイラも）が紹介されていました。以下、引用します。

```
1. C : learn C programming, a powerful general-purpose language.
2. C++ : GCC compiler 6.3
3. Java : best Java Programming ide, JDK 8
4. Python : learn Python 2.7 and Python 3.
5. C# : Mono Compiler 4
6. Php : Php Interpreter 7.0
7. Objective-C : GCC compiler
8. Ruby : Ruby version 1.9
9. Lua : Lua Interpreter 5.2
10. JS/NodeJS : Node.js engine 6.5
11. Go : Go Lang 1.6
12. VB.Net
13. F#
14. Common Lisp
15. R
16. Scala
17. Perl
18. Pascal
19. Swift
20. Tcl
21, Prolog
22. Assembely
23. Haskell
24. Clojure
25. Kotlin
26. Groovy
27. Scheme
28. Rust
29. Bf
30. Html
31. Css
```

## 所感

以下、軽く使ってみた所感を書きます。

* 付属されているエディタにはシンタックスハイライトやカッコの補完機能もあり、スニペット実装程度であれば十分使える
* プログラム実行時に標準入力もさせることができるので、atcoder の過去問を練習することもできそう
* クラウド上にコンパイラを用意していることもあり、オフラインでは実行できない(実装はできる)
* 機密情報を含んだプログラムをクラウド上のコンパイラに実行させるのは避けたほうが良さそう

## 終わりに

これでわざわざ PC を準備しなくても、簡単なコードを試せるようになりました。これから使い込んでいこうと思います。
【Rails】「config」の使い方

「config」gemを使用し、SMTPサーバー等の情報を定数で呼び出せるように設定します。
設定することで、Gitにアップロードする時、パスワード等のSMTPサーバーの情報が漏洩することを防ぎます。

# 前提
Railsをインストールしていること。
※インストール手順は下記
【Dockerでrailsローカル開発環境構築 - Qiita】
https://qiita.com/jung_issei/items/7999512f63863a5bddb5

# 手順

「config」をGemfileに追加

```Gemfile:Gemfile
gem 'config'
```


「config」インストールコマンド実行

```terminal
$ bundle install
$ bundle exec rails g config:install
```

ウェブサイト・SMTPサーバー情報を記述

```yml:config/settings.local.yml
web:
  host: 'example.com'#サイトのドメイン名
  protocol: 'https'#httpの場合はhttp

mail:
  bcc: 'admin@example.com' ##受信できるメールアドレス

smtp:
  address: 'smtp.example.com'#SMTPサーバーのホスト名
  port: 587#SMTPサーバーのポート番号
  domain: 'example.com'#メールアドレスのドメイン名
  user_name: 'admin@example.com'#メールアドレス
  password: 'a123456'#パスワード
```

**再起動後**、下記のように、上記で設定した情報の呼び出しが可能になります。

```ruby
Settings.web[:host]

Settings.smtp[:address]
Settings.smtp[:port]
Settings.smtp[:domain]
Settings.smtp[:user_name]
Settings.smtp[:password]
```

# 後続作業

[【devise】メール認証のサインアップ・イン・アウト機能](https://qiita.com/jung_issei/items/a3bb837cfdedda7b5d85)
メール認証で、サイトに新規会員登録機能や、ログイン・ログアウト機能を搭載する設定です。
PHPのunserialize関数に脆弱性を生む可能性あり。配列をテキスト化しその逆を行うクラスを作成し対応しました。

#unserialize関数に脆弱性を生む可能性あり。その対策を検討する。
配列をシリアル化する方法として、serialize関数、復元するのにunserialize関数を使っていた方多いのではないでしょうか？
しかし、__unserialize関数には脆弱性を生む可能性があり、使用は避けるべき__であることが知られています。

参考）徳丸浩の日記
[PHPのunserialize関数に外部由来の値を処理させると脆弱性の原因になる](https://blog.tokumaru.org/2015/07/phpunserialize.html)

徳丸先生によると、下記の関数を使い、シリアライズ化するべきであると主張されてます。

- json_encode/json_decodeを使用する方法
- implode/explodeを使用する方法

__json_encode/json_decodeを使用する方法__ですが、"が含まれている場合などには勝手にエスケープされ、json_decodeで__元に戻せなくなるのでこの方法は却下__しました。
そこで、この記事では__配列化するモジュールを作成__することで対応する方法を紹介します。


#シリアライズクラス（sクラス）
このクラスは__多次元配列や連想配列、またその組み合わせにも対応__しております。

```
class s{
    public static $talkens=array("ooo--keyvalue%s--ooo","\nooo--line%s--ooo\n");
    public static function en($v,$i=0){
        if(!$v)return '';
        if(!is_array($v))return $v;
        $talkens= array(sprintf(self::$talkens[0],$i),sprintf(self::$talkens[1],$i));
        $ret    = array();
        foreach($v as $k => $tmp){
            if(is_array($tmp)){
                $tmp = self::en($tmp,($i+1));
            }
            $ret[]=implode($talkens[0],array($k,$tmp));
        }
        return implode($talkens[1],$ret);
    }
    public static function de($v,$i=0){
        if(!$v)return '';
        $talkens     = array(sprintf(self::$talkens[0],$i    ),sprintf(self::$talkens[1],$i    ));
        $talkens_next= array(sprintf(self::$talkens[0],($i+1)),sprintf(self::$talkens[1],($i+1)));
        $ret         = array();
        $tmp         = explode($talkens[1],$v);
        if($tmp){
            foreach($tmp as $tmp_){
                $ar = explode($talkens[0],$tmp_);
                $val= $ar[1];
                if(strpos($val,$talkens_next[0]) !== false){
                    $val = self::de($val,($i+1));
                }
                $ret[$ar[0]]=$val;
            }
        }
        return $ret;
    }
}
```
#クライアントコード
```
$v=array(
    '9'=>array('福岡'),
    array(33=>'大阪','宮崎'),
    't'=>array('東京','神奈川')
);
var_dump($v);
$v = s::en($v);
var_dump($v);
$v = s::de($v);
var_dump($v);
```
上記コードを実行すると下記になります。
#####シリアライズ前
```
array(3) {
  [9]=>
  array(1) {
    [0]=>
    string(6) "福岡"
  }
  [10]=>
  array(2) {
    [33]=>
    string(6) "大阪"
    [34]=>
    string(8) "宮崎"
  }
  ["t"]=>
  array(2) {
    [0]=>
    string(6) "東京"
    [1]=>
    string(9) "神奈川"
  }
}
```
#####シリアライズ後
```
string(266) "9ooo--keyvalue0--ooo0ooo--keyvalue1--ooo福岡
ooo--line0--ooo
10ooo--keyvalue0--ooo33ooo--keyvalue1--ooo大阪
ooo--line1--ooo
34ooo--keyvalue1--ooo宮崎
ooo--line0--ooo
tooo--keyvalue0--ooo0ooo--keyvalue1--ooo東京
ooo--line1--ooo
1ooo--keyvalue1--ooo神奈川"
```
#####復元後
```
array(3) {
  [9]=>
  array(1) {
    [0]=>
    string(6) "福岡"
  }
  [10]=>
  array(2) {
    [33]=>
    string(6) "大阪"
    [34]=>
    string(8) "宮崎"
  }
  ["t"]=>
  array(2) {
    [0]=>
    string(6) "東京"
    [1]=>
    string(9) "神奈川"
  }
}
```

[オフィスアンツ](https://www.officeants.com/)
ShellScript if文 まとめ

# 目的

- ShellScript(bash)のif文の書き方を知る。

# if文のパターン
1. パターン①  
条件式が真の場合のみ指定された処理を行い、真以外の時は何もしない。
1. パターン②  
条件式が真の時にelseの前に書いた処理を行い、真以外の時はelseの後ろの処理を行う。
1. パターン③  
条件と分岐を増やしたい時。

# パターン①

- 変数number_1と変数number_2に格納された値が一致しているかを判定する処理を記載する。
- 一致していた場合「二つの変数の値は一致しています。」とコンソールに出力する。
- 一致していなかった場合何も出力しない
- 使用している変数は全てすでに定義され、値が格納されているものとする。

``` shellscript
# if文での比較処理
if [[ ${number_1} -eq ${number_2} ]]; then
  echo "二つの変数の値は一致しています。"
fi
```

# パターン②

- 変数number_1と変数number_2に格納された値が一致しているかを判定する処理を記載する。
- 一致していた場合「二つの変数の値は一致しています。」とコンソールに出力する。
- 一致していなかった場合「二つの変数の値は一致していません。」とコンソールに出力する。 
- 使用している変数は全てすでに定義され、値が格納されているものとする。

``` shellscript
# if文での比較処理
if [[ ${number_1} -eq ${number_2} ]]; then
  echo "二つの変数の値は一致しています。"
else
  echo "二つの変数の値は一致していません。"
fi
```

# パターン③

  - 複雑なif文の処理を記載する。
  - 少し複雑なため、具体的な処理ではなく言葉を交えて説明する。
  - 先に処理を記載する。

``` shellscript
if [[ 条件式1 ]]; then
  処理1
elif [[ 条件式2 ]]; then
  処理2
else
  処理3
fi
```

- 上記の処理の解説を行う
1. 条件式1が真の時、処理1を実施する。
1. 条件式1が偽で、条件式2が真の時、処理2を実施する。
1. それ以外の時、処理3を実施する。

※elifを増やしていけば、事実上無限に分岐を増やすことができる。
CentOS-7 に tiled をインストール

snapd を利用してインストールする。

```
$ sudo yum install epel-release
$ sudo yum install snapd
$ sudo systemctl enable --now snapd.socket
$ sudo ln -snf /var/lib/snapd/snap /snap
```

ここで一度システムからログアウトするか、別のシェルを起動してインストールを続行する。

```
$ sudo snap install tiled
```

起動する。

```
$ tiled
```

日本語環境だと、日本語が文字化けする
![tiled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206475/c0dded9a-31c8-dd98-c87c-74bbbb452596.png)
ので、言語を英語にする。
![tiled-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206475/20829f11-735c-eff5-5e02-e0c9349a085d.png)
から、ここ
![tiled-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206475/16c2f9ba-3ef1-9953-97c9-9359491e2853.png)
を設定する。
![tiled-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206475/977d1d46-a76b-99e8-9044-4d943ed1421d.png)
ESP8266書込みエラー

### エラー発生
ESP8266で以下のような回路を作製しました。すべてのGPIOにLEDがつながっています。

![8266LEDNG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/b86c5354-e736-132c-a04d-082c25c59e3d.jpeg)

SW1 ON でリセット時
- FLASH Boot IO0 HIGH, IO15 LOW
- FLASH Burn IO0 LOW, IO15 LOW

の条件がありますので、SW2 とIO15 のpull downが付いています。

### 書込みエラー

Arduino IDEからプログラムの書込みを行おうとすると以下エラーになってしまいます。

```
2.6
esptool.py v2.6
Serial port COM7
Connecting........_____....._____....._____....._____....._____....._____.....____Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2/tools/upload.py", line 25, in <module>
    esptool.main(fakeargs)
  File "C:/Users/username/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py", line 2653, in main
    esp.connect(args.before)
  File "C:/Users/username/AppData/Local/Arduino15/packages/esp8266/hardware/esp8266/2.5.2/tools/esptool\esptool.py", line 468, in connect
    raise FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error))
esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header
_
シリアルポート「_
」が選択されていますが、そのポートは存在しないか、ボードが接続されていません。
```
### 解決方法
[ESP8266 Hardware User Guide](http://akizukidenshi.com/download/ds/espressifsystems/0B-ESP8266__Hardware_User_Guide__EN_v1.1.pdf)のp.34にFLASH Burn の書き込む手順が書かれています。

```
By default the Flash is empty. Therefore, the following procedures should be followed when you
burn the programs into the Flash:
• Before burning, set the module to work under UART Download mode;
• Pull IO15 and IO0 to low-voltage level, leave IO2 dangled;
```

ポイントは、<b>leave IO2 dangled</b>、すなわちIO2をオープンにしておかないといけないのです。その結果、IO2にスイッチSW3 を入れることで書き込めるようになりました。書込み時はSW3=OFF です。通常のFLash Boot の時はSW3=ON です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/6432d90d-a9e2-78e4-e43e-8ca5c147ca83.png)

ただし、IO2はSW3pull upしています。SW3=ONの時、pull upが無いと起動がされない場合があります。

```
After burning the programs into Flash, pull down IO15 to low-voltage level, keep IO2 dangled,
and pull up IO0 to high-voltage level. The module is then shifted from UART Download mode to
the Flash Boot mode;
```

とありますので、IO2 をBoot してからつなぐことでも動作します。しかし、リセット後で、IO2を自動的につなぐのが難しそうなので、pull up でごまかしてしまいました。
プログラミングの本に書かれてないこと

どうやって習得するか。塾やスクール出身の人だと、きちっとしたコードが打てると関心します。私のようなベタ打ちでしかもコピペ多用するような素人とはレベルが違うわけです。

現在コピーペースト、ツール使用でもHTMLは使えるわけです。つまり、プログラミングの言語そのものよりも、それによって何を作り出すかが問われています。

<a href="https://proengineer.internous.co.jp/" >スクールの例</a>

私は独学でしたので、単純なコードを使って制作するタイプです。スクリプトを使わずに、初歩的なHTMLだけでもサイトは作れるわけです。むしろSEOといった難物の前では、シンプルでわかりやすいWEBサイトが求められる傾向もあります。

スクールでは専門家を育成することを目的としています。私は別な目的でプログラミングをしている。その違いがプログラマーと一般の人との決定的な違いとなるわけです。
VSCodeでC++のデバッグ時に標準入力を受け付ける方法

MacのVSCodeでC++を初めて、デバッグの設定を行い実行できるようになったものの、標準入力がどこから入力していいのか分からず調査したのでメモ。

## 解決法

`launch.json`内にある`externalConsole`オプションを`true`にすることで、標準入力を受け付けるコンソール画面(標準ではMaxの場合ターミナルアプリ)が起動し、そこから標準入力を入力することができるようになる。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true, // ここをtrueに変更する
            "MIMode": "lldb",
            "preLaunchTask": "build before debug"
        }
    ]
}
```

## 参考

- https://github.com/Microsoft/vscode-cpptools/issues/449
ls コマンドのよく使うオプションまとめ

CentOS 7 で確認。ls のバージョンは GNU coreutils 8.22。

### 不可視項目も含めて表示
```
ls -A
```
`-a` では `.` と `..` も表示される。

### 長い形式で表示
```
ls -l
```
サイズの単位をわかりやすくするには `-h` をつける。

### SELinux のコンテキストも含めて表示
```
ls -Z
```

### 1 行に 1 つずつ表示
```
ls -1
```

### ディレクトリの中を再帰的に表示
```
ls -R
```

### 数字を自然な順序で並べ替え
```
ls -v
```

### 更新日時順で並べ替え
```
ls -t
```
お問い合わせフォームCSS

お問い合わせフォームを作成したので、メモ書きとして残しておこうと思います。

今回は、以下のようなフォームを作成しました。
![screencapture-oosodaoo-github-io-onoda-rina-help-html-2019-08-17-07_07_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454254/83f420ac-77c4-e907-a344-6139aa35bd26.png)

#ソースコード
実装は以下のようなコードで行いました。

##html

```html
<div class="help_wrap">
 <div class="confirm_help">
   <div class="help_font">
     <h2>CONTACT</h2>
     <h3>お仕事のご依頼、その他お問い合わせを受け付けております<br>お気軽にお問い合わせください</h3>             
   </div>
   <div class="helpbox">
      <a href="help.html" class="help" >お問い合わせフォームへ</a>
   </div>
 </div>
</div>

```

##css

```css
.help_wrap{
    position: absolute;
    width: 100%;
    height: 349px;
    left: 0px;
    top: 3337px;
    text-align: center;
    background: #6AC5CE;
}

.confirm_help{
    padding-top:60px;
}
.help_font{
    color:#ffffff;
    font-family: Roboto;
    font-style: normal;
    line-height: 21px;
}

.help_font h2{
    font-weight: 900;
    font-size: 30px;
    line-height: 35px;
    
    color:#ffffff;
}

.help_font h3{
    font-weight: normal;
    font-size: 18px;
    line-height: 35px; 
    
    color:#ffffff;
}

.help{
    font-family: Roboto;
    font-style: normal;
    font-weight: 900;
    font-size: 18px;
    line-height: 21px;
    text-decoration: none;
    margin: 5px;
    padding: 10px 100px;
    background: #FFFFFF;
    
    color: #6AC5CE;

}

.help:hover{
    background: #FF8989;
    color: #ffffff;
}

.fotter{
    position: absolute;
    height: 301px;
    top: 3685px;
    width:100%;
    padding-top: 39x;
    padding-bottom: 39px;
    font-family: Roboto;
    font-style: normal;
    color: #135161;
    display: inline-block;
}


```
Google FormのUIを自作する際に回答控えのメール自動返信を実装するのはむずかしい

## はじめに
メモ書き的な要素がかなり強いです.つらいので記録に残します.

## Google Formを利用して楽にお問合せフォームを作りたい  
こちらをご確認いただきたい.
[Googleフォームを自在にカスタマイズする](https://qiita.com/sota6412/items/fa077cbf820faca30598)

この時HTTPリクエストには
FormDataとして
entry.(フォームを識別する番号): 入力値
というクエリが入っている.

## 控えのメールを送りたいが困った
Google Formでは入力したメールアドレスに控えを送る設定ができる.しかしこれを有効にすると,作成したフォームが動かなくなった.
ステータスコードが400でなにか不備があるようである.
調べてみたがForm Dataには以下の内容が必要のようだ.

```
emailAddress: example@example.com
entry.207103****: ちぇちぇ坊
entry.116507****: ほげほげ
entry.120646****: ふがふが
entry.202610****: ほがふげ
emailReceipt: true
g-recaptcha-response: 03AOLTBLRlGQIKQM7M481ZOkjJZGJjMYPlVQCVPCgtGz...(400文字くらいの英数列)
```
この`g-recapthcha-response`はRecaptcha認証を通過した際に生成されるもので,これを取得し,FormDataとともに送信できれば控えメールを送ることができる.  
これを取得できない限りリクエストが通ることはない.そして取得する手段がわからなかった.


ちなみに以下の内容はリクエストに含まなくても良い

```
fvv: 1
draftResponse: [null,null,"90993149820********"]
pageHistory: 0
fbzx: 90993149820********
```

## どうしたらええんや
いっそ以下のような手段を使うと良いでしょう.
[Google Form で送信した後に自動で返信メールを送る](https://qiita.com/naoiwata/items/e9f04fe91d035c8af0e4)
スプレッドシートに登録された際,そこに書かれたメールアドレスにメール送信する.

いいやり方が見つかれば書き足します.
Google Form使うこと自体がそもそもの過ちか...?
terminating with uncaught exception of type NSExceptionで@IBOutletは繋いでるのにミスってて詰まった[Swift]

`terminating with uncaught exception of type NSException`
このエラー、いろんな原因があるらしいですが、初歩的なパターンだと
**@IBOutlet繋いでなかった**
**@IBOutletそもそもちゃんと繋げてたけどつなぎ直したら何故か治った**
というのも多かったですが、僕の場合は

#### 繋いでたけど、その後に変数名変えてたから
でした。
Storyboard側のUIは最初に繋いだ変数名と紐づけようとするので
**変数名変えたらちゃんとつなぎ直しましょう**
【JS】moment.jsでナノ秒を日付に整形する

ナノ秒（nanosecond）をフォーマットするには1000を掛ければ問題ない。

```Javascript
var nanosecond = "1565980455";

console.log(moment(nanosecond*1000).format()); //2019-08-17T03:34:15+09:00

console.log(moment(nanosecond*1000).format('YYYY/MM/DD')); //2019/08/17
```
Windows 未割当領域を使って、Cドライブの拡張

# はじめに

Windowsの未割当領域を使って、Cドライブを拡張する手順を書きます。たまにやる作業ですが、いつも実施する手順を忘れているので、備忘録として記録します。



# 手順

まずはじめに、拡張前の状態を確認します。255GBのCドライブが見えています。

![1565976884914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/39ae236c-7332-6ab7-72ec-507f2f433f5b.png)



コントロールパネルで、「パーティション」という文字列で検索し、「ハードディスク パーティションの作成とフォーマット」を選択します

<img width="596" alt="1565976743852.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/e1b9cce4-4db8-7275-6395-5d18580ceec2.png">



未割当領域が、44GBが見えています。

![1565976831247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/5b752ae1-968a-9ca2-bc67-7bd206ad7982.png)



Cドライブ右クリックして、ボリュームの拡張を選択します。

![1565976952763.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/d1bd163a-6ac3-d25e-7886-09827d1da27a.png)



次へ

![1565976970329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/86858400-cbd7-c4ee-877c-934dcb4c1756.png)



未割当領域の 44GB から、どれくらいの容量を Cドライブへ割り当てるかを指定します。Default ですべての容量を割り当てる値が入力されているので、このまま次へを押します。

![1565977181342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/76959517-df01-4b89-89de-39b7e8328f42.png)



完了

![1565977242358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/bd975bc5-4768-777d-55a3-34dec60afa59.png)



拡張完了

![1565977271913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/81c8ba28-0fdf-55cd-f006-0b0469c69060.png)



Cドライブが増えていることが確認できます。

![1565977291708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/7dd0d3e3-71de-c2e2-03ac-acb4eaf2f9b6.png)
WindowsのFor文でコマンドの結果値が固定されてしまう

バッチファイル界の魔境と呼ばれているらしい「遅延環境変数」に惑わされたおはなし。

語源→[バッチファイル界の魔境『遅延環境変数』に挑む（おまけもあるよ）](https://qiita.com/sawa_tsuka/items/c7c477cacf8c97792e17)

# %hoge% じゃなくて !hoge! を使え
結論からいうとfor文内のコマンドが実行されるタイミングは、実行の瞬間ではなくてfor文が開始されるタイミングらしい。
そのためfor文内でコマンドの結果を変化させたい（最新の値を表示したい）場合はつぎのように遅延環境変数を使って、コーディングする必要がある。

```:delayedexpansion.bat
@echo off
setlocal enabledelayedexpansion

for /L %%i in (1,1,10) do (
　　echo %%i
    echo !time!
    timeout 5
)
```

ポイントは2点
 
 - 冒頭に`setlocal enabledelayedexpansion`を宣言
 - コマンドを`%%`じゃなくて、`!!`で囲む


# コマンドの値が変化しない？

はじめに以下のコードを実行したところ、timeコマンドの値が一切変化しない事象に遭遇した

```:normal.bat
@echo off

for /L %%i in (1,1,10) do (
    echo %%i
    echo %time%
    timeout 5
)
```

Windowsのバッチファイルを書いたことはなかったので書きっぷりがイケてないのかなと思い、for文をばらしてfor文内のコードを10個コピペしたら普通に動いたので、コードは想定通りに動きそう（少なくともfor文を使わなければ）

となるとfor文が原因っぽいけど、思い当たる節がない。

しかたないので、Google大先生にお伺いしたところ、答えとなりそうな記事を発見

[batファイルでfor文内に変数を利用する場合の罠](https://blog.natade.net/2018/10/06/windows-bat-%E9%81%85%E5%BB%B6%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0-for-if/)

> さらに調査を続けると、
> 結論としては、遅延環境変数が問題であることが分かりました。
> 
> どうやら、Windowsのバッチファイルで、
> 括弧（）をつかったブロック文を作った場合、
> 括弧に入った瞬間に内部の環境変数が展開されるようです。

記事は変数のことのようだが内容的にコマンドも同じことが適用されそう。
ということで、最初のコードに書き換えたところ無事動いた。
【プログラミング学習】 言語別ロジック比較 part.1("Hello World")

某プログラミング学習サイトでいろんな言語を並行して学習し始めたので、学習内容のアウトプットとして、各言語で同じ出力を得ようとした時に、それぞれどんなコードになって、どう違ってくるのかをまとめていこうと思います。

## 1."Hello World."
変数`message`に格納された"Hello World."を表示

### Ruby

```ruby:helloworld.rb
message = "Hello World."
puts message
```

```console
$ ruby helloworld.rb
Hello World.
```

### Python3

```python:helloworld.py
message = "Hello World."
print(message)
```

```console
$ python helloworld.py
Hello World.
```

### Swift

```swift:helloworld.swift
var message = "Hello World."
print(message)
```

```
(playground)
Hello World.
```


### Java
```java:helloworld.java
public class helloworld {
	public static void main(String[] args){
		 System.out.println("Hello World.");
	}
}
```

```console
(eclipse console)
Hello World.
```


### C＃
```c#:helloworld.cs

using System;
public class Hello{
    public static void Main(){
        Console.WriteLine("Hello World.");
    }
}
```
(コンパイルしてexeファイルはできてる前提
 手元の実行環境では'mono'を使って実行)

```terminal
$ mono helloworld.exe
Hello World.
```

## 参考記事等
macでのC#の実行環境準備について
<a href="https://qiita.com/matsuda_sinsuke/items/76068f4c396887459803">MacでC#のコードをコンパイルして実行する</a>


macでのjava開発・実行環境準備について
<a href="https://www.sejuku.net/blog/12578">【Mac編】Javaの開発環境を簡単に一括インストールする方法</a>
awsにqcow2形式のイメージファイルをアップロード


AWS以外のクラウドサービスで作成した仮想サーバのイメージをAWSで使用する場合、変換処理が必要になる。

今回は仮想サーバのイメージファイル(qcow2 : キューコウツー)をAWSに対応しているファイル形式(raw : ラウ)に変換する手順を記載する。

---

# QEMU-IMG : qcow2形式ファイルをrawに変換するツール

QEMU-IMGというツールで変換をすることができる。

* [QEMU-IMG](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/5/html/virtualization/sect-virtualization-tips_and_tricks-using_qemu_img)

Windowsの場合は下記から、インストールする。

* [qemu-img for Windows
](https://cloudbase.it/qemu-img-windows/)

---

# 変換手順

* [Import qcow2 images into AWS
 ](ttps://www.wavether.com/2016/11/import-qcow2-images-into-aws)

---

# 変換したイメージをAWSのオブジェクトストレージにアップロード

* regisonとバケットのURLの確認
東京リージョン : ap-northeast-1

```
https://bucket.s3-ap-northeast-1.amazonaws.com
https://バケット名-s3-ap-northeast-1.amazonaws.com
```

* ロールの設定

```
aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
```
* ファイルのアップロード

```
aws s3 cp server.raw s3://バケット名


* スナップショットのアップロード
aws ec2 import-snapshot --description "sever image" --disk-container file://container.json

* 各タスクの進捗状況確認
aws ec2 describe-import-snapshot-tasks

* 個別タスクの進捗状況確認
aws ec2 describe-import-snapshot-tasks --import-task-ids タスクID

* タスクのキャンセル
aws ec2 cancel-import-task --import-task-id タスクID


aws ec2 get-console-output --instance-id インスタンスID

```

---

# メモ

## 仮想化タイプ

### PV (paravirtual, 準仮想化) 
起動方法は2種類提供ある。

内1つはAKIを使う方法。
EC2 側であらかじめAWS上に用意された kernel (AKI) と initrd (ARI) を利用して起動し、 
最後にルートデバイスとしてユーザが選択したボリュームをマウント。

ルートデバイスの /boot に kernel が含まれていようと、利用される kernel は AKI のものになる。

### HVM (Hardware-assited VM)
ルートデバイスにあるブートローダから、デバイス内に含まれる kernel を起動。 
つまり、ブート領域 (GPT or MBR) とブートローダ (grub など) が必要

http://kanny.hateblo.jp/entry/2014/01/19/182759

### デバイスファイル名
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/device_naming.html
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html?icmpid=docs_ec2_console

### LVMのマウント
https://qiita.com/tukiyo3/items/bf8164c6bc703c894598

---

# 参考

* http://takumicloud.jp/blog/2016/04/15/vm-import-export

* https://qiita.com/koni/items/1d116726282b1c443a40

* https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-s3
ubuntu1804desktopで自動アップデートを無効化する

VirtualboxとかでもubuntuのDesktop版を利用する人は、やったほうがいいと思います。


左上のアクティビティをクリックし「ソフトウェア」とか「software」と検索する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/f14aa8b0-7251-de61-8ad0-832838aa49b7.png)

ソフトウェアのアップデートがでる。（ダンボールみたいなアイコンのやつを実行する。）

![Screenshot from 2019-08-17 01-43-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/16b93905-ab1e-290d-b365-5bb08e308413.png)

画面のようにアップデートタブで、アップデートの自動確認を「なし」にしてあげる。


これだけです。
アップデートしたいときはコンソール（ターミナル）で
`apt update`
`apt upgrade`
してやればいいです。
GUIだと進捗がわかりにくいので、こっちのほうがやりやすいですね。


他のメニューもダウンロードさせたりしないように、
「表示する」というふうにしておけば勝手にアップデートプロセスが走らないです。

しばらくOSを起動しないと、勝手にアップデートプロセスが走り出して、勝手にCPU食いつぶすからやったほうがいいです。
しかもシングルコア。。。
こういうOSはCLIが良いんだから、。


ServerだとGUIもないし、自動アップデートも標準でOFFになってるみたいなので、悩みませんが、普段遣いしてるとうっとおしいですね。
Laravel-Mixのphp run watchが上手くファイルを監視してくれない時の対処法

#環境
MacOS
Laravel-Mix:4.0.7

#起こっている問題
Laravel-Mixの

```bash
$ php run dev
```

を使用してLaravelプロジェクト内のファイルの変更を監視します。
__Vue.js__や__Sass__などのコンパイルが変換なファイルをに変更があれば自動的にコンパイルできるコマンドですが、なぜかファイルに変更があっても動いてくれなかった。

#解決方法
一度「control」+「c」でファイルの監視を止めて、問題が起こってるプロジェクトのディレクトリ内で

```bash
$ npm run watch-poll
```

をターミナル上で実行します。

これでファイルの変更があればコンパイルしてくれるようになりました。
OTTO: mblock3簡易サンプル ～障害物回避～

# mblock3 ottodiy 簡易サンプル

前提：mblock3 メニューの"編集"-"Arduinoモード"を選択、メニュー言語＝日本語

## 0. 使用するブロック

#### 1. "ロボット"ライブラリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/5aad38be-9c04-8ef4-57d7-07d43c8a87cd.png)

#### 2. "制御"ライブラリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/be6db4e2-fe26-f300-163a-f6637d2b040a.png)

#### 3. "データ・その他"ライブラリ
(下図では"dist"という変数名を指定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/0959f0d2-d18d-6b2f-f9cb-759497998c41.png)


## 1. 変数の作成

"データ・その他"ライブラリを選択、"変数を作る"をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/51777d5a-4c10-ab89-4730-1f57c48f7666.png)

変数名を入力し、OKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/96693fb2-0e89-1c9b-dcd8-527accf2763b.png)


## 2.  距離検出ループ処理の作成

スクリプトタブの"ロボット"ライブラリから"Otto Program"ブロックを、"制御"ライブラリから"ずっと"ブロックを配置する。

そして、"データ・その他"ライブラリから"～を0にする"ブロックを"ずっと"ブロックの間に配置する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/5a40b604-171d-846d-d0f3-18eda4a9572d.png)

## 3. 超音波センサ値を2で作成した変数に代入

"ロボット”ライブラリの"Get Distance"ブロックを下図のように
「distを0にする」の0部分にドラッグ＆ドロップする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/fdeb720b-31e6-6873-482a-34f578c6e806.png)

## 4. 距離の判定

"制御"ライブラリの"もし～なら～でなければ"ブロックを下図のように配置する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/e93eb95c-61ac-70ce-4cdd-6ee16cc90425.png)

"演算"ライブラリから"＜”ブロックを下図のようにコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/2aaf1094-0a84-5dcd-f431-d44d7ca3d87c.png)

"データ・その他"ライブラリから2で作成した変数を"<"の左辺にコピーし、右辺に距離のしきい値(単位：cm）を指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/a30df3a4-fa63-5b84-45a1-60e861a3fbff.png)

## 5. 障害物判定時の行動を指定

"制御"ライブラリから"～回繰り返す"ブロックをコピーし、その間に"ロボット"ライブラリの"move"ブロックを配置
（下図では、normalスピードで３回後に下がり、６回左旋回をする）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/b20660d1-bf7d-1a4f-127f-05dff09c8260.png)

## 6. 障害物のないときの行動を指定

"でなければ"の部分に、"move"ブロック（fastスピードでの前進）を指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/64463ccd-ee7d-f9f2-1f0b-7b0b94d697d1.png)

以上

Arduinoに書き込んで動作確認ください
ESXiで仮想マシンのスリープ状態を強制的に解除する方法

スリープ状態の仮想マシンを起動しようとしたら「仮想ディスクがない」とかいわれて起動できなくなった。

```
エラー
VMware ESX は仮想ディスク「/vmfs/volumes/12345678-90abcdef-ghij-123456789012/exampleVM01/exampleVM01_1.vmdk」を検出できません。パスが有効であることを確認し、もう一度やり直してください。
Lookup[file] のファイル システム固有の実装が失敗しました
Lookup[file] のファイル システム固有の実装が失敗しました
Lookup[file] のファイル システム固有の実装が失敗しました
Lookup[file] のファイル システム固有の実装が失敗しました
Lookup[file] のファイル システム固有の実装が失敗しました
システムで指定されたファイルを見つかりません
ディスク「/vmfs/volumes/12345678-90abcdef-ghij-123456789012/exampleVM01/exampleVM01_1.vmdk」、またはこのディスクが依存しているスナップショット ディスクの 1 つを開くことができません。
モジュール「Disk」のパワーオンに失敗しました。
仮想マシンの起動に失敗しました。
```

マジかよ...と思いつつもデータドライブだったので、仮想マシン設定から該当のディスク設定を削除してとりあえず起動しようとしたら、そもそも削除ボタンがない...Why?

![alt](https://qiita-image.cloudremix.net/ESXi-Power-On-Failed.jpg)

## スリープ状態を無理やり削除してディスクをけす

いろいろ調べた結果、スリープ状態の仮想マシン設定をいじくるのは無理らしいので強制的にスリープ状態を解除することに。

方法としては以下のとおり。

 1. 仮想マシンのファイルが格納されているフォルダにある`.VMSSファイル`と`.LCKファイル`をけす
 1. .vmxファイルの`checkpoint.vmState`の値を初期化（`''`）する（仮想マシンオプション > 詳細 > 構成パラメータから編集可能）

詳しい方法→[Workstation での仮想マシンのパワーオンに次のエラーで失敗する： VMWare Workstation のリカバリ不能なエラー: (vmx) (2032746)](https://kb.vmware.com/s/article/2032746?lang=ja)

ちなみに仮想ディスクが消えたのは物理ディスク障害が原因だった...
AWS education ポップアップブロック解除方法

AWSにて学習を行う際ポップアップブロックに掛かり開かなかったため

mac_ポップアップブロック許可 で検索をかける
1.safari→環境設定→webサイト
2.一般項目内のポップアップブロックを許可
と出てくるも項目内にポップアップアイコンが出て来ず。。

正解は
1.safari→環境設定→セキュリティ
2.ポップアップウィンドウを開かない チェックボックスを外す
でした。

以後AWSでの学習をup予定
Windowsの予約語をフォルダ名に使用するとGitでCloneに失敗する

## 事象

GitでCloneした際に、下記のエラーメッセージが表示されて、cloneに失敗する事象が発生。

```
# Git Error

fatal: cannot create directory at 'test/src/com1': 
Invalid argument
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'
```
---

# 原因

GitでCloneした際に、Windowsの予約語に使用されている「com1」というフォルダが含まれていたため、cloneした際に、フォルダとして認識されなかったことが原因の模様。

http://www.all.undo.jp/asr/1st/document/01_03.html

# 対策

com1 → com_1にフォルダ名を変更

また、ファイルパスの文字数が260文字以上でも、cloneに失敗するケースもある模様。
https://kaizentech.hatenablog.com/entry/2018/04/27/104909
history コマンドおさらい

# 問題

以下のコマンドを実行すると、hello.scm には何が入力されているでしょうか？

```bash
$ ls
$ echo "(print "Hello World!!")" > hello.scm
```

# 答え

```bash
cat hello.scm
> (print Hello Worldls)
```

ls が付いて来た...。

# 解説

`!!` は直前に実行したコマンドを実行するコマンドだからです。

### history コマンド概要

```bash
$ history # コマンド履歴表示
$ history 5 # 5件分のコマンド履歴表示
$ !! # 直前のコマンド実行
$ !5 # 履歴番号 5 のコマンド実行
$ !a # 直前で実行した a で始まるコマンドを実行
```

# おまけ

エスケープが必要だったというすごく初歩的な話でした。

```bash
$ echo "(print \"Hello World\!\!\")" > hello.scm
```
VSCodeのVeturでeslintのフォーマットをする

# veturのformat設定

Veturのformat設定では、eslintが選べません。
そして他のプラグイン等をつかってもveturのformat設定が最後に実行されるためかeslintの設定どおりにフォーマットできません。

![Screenshot from 2019-08-17 00-18-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202814/e7397fb2-47af-62a6-a567-c58447a7fca5.png)

ちなみにこれが私のeslintrc.jsonの一部です。ruleにお好みのルールをたくさん書いています。
とくにhtmlのフォーマッタがprettierやprettyhtmlだと,vueのhtml部分が崩れるのでeslintしたいです。

``` js
{
  "env": {
    "es6": true,
    "node": true
  },
  "parser": "vue-eslint-parser",
  "parserOptions": {
    "parser": "@typescript-eslint/parser"
  },
  "extends": [
    "plugin:@typescript-eslint/recommended",
    "plugin:vue/recommended"
  ],
  "rules": {
    ...
  }
}
```

# settings.jsonでeslintと書く

設定画面ではeslintが選べないのですが、setting.jsonでeslintと書くとeslintでフォーマットできます。
VSCodeがwarning表示しますがちゃんと動きます。なぜ設定画面から選べないのか不思議です。
強引ですがこれで動きます。これでvueのhtml部分のフォーマットもばっちりです。

``` json
{
  "vetur.format.defaultFormatter.css": "none",
  "vetur.format.defaultFormatter.html": "eslint",
  "vetur.format.defaultFormatter.js": "eslint",
  "vetur.format.defaultFormatter.less": "none",
  "vetur.format.defaultFormatter.postcss": "none",
  "vetur.format.defaultFormatter.stylus": "none",
  "vetur.format.defaultFormatter.ts": "eslint"
}
```
「main.go:3:8: cannot find package」エラー から学ぶGoパッケージの作り方

#はじめに
Go言語でパッケージを作ろうとした時に、一度は遭遇するであろう`cannot find package`エラー。
僕自身も同じエラーに遭遇し、最初は？？でした。
この経験から学んだパッケージの作り方（ファイル、ディレクトリの配置、パッケージ名など）を簡単にまとめます。

#エラーの原因とソリューション
ファイルを分割した際にこのエラーに出くわす可能性がある。それは、別ファイルに切り出したパッケージの配置場所に問題があることが多々。その場合、分割したファイルは、`main.go`ファイルと同列に配置してはならず、**パッケージ名と同じ名前のディレクトリを作成し、その下に分割したファイルを配置する**とエラーを解消できる。

文面だとわかりにくい点もあるかと思うから、実際に簡単なソースコードを準備して確認しよう。

#プログラムの準備

最初に、`go-test`フォルダを作り、その配下に`main.go`ファイルを準備する。

```
❯ pwd
/Users/takuyanin/go/src

❯ mkdir go-test

❯ cd go-test

❯ touch main.go
```

そして、簡単にコーディングをし、

```main.go
package main

import "fmt"

func main() {
	hoge()
	fuga()
}

func hoge() {
	fmt.Println("Hello hoge!")
}

func fuga() {
	fmt.Println("Hello fuga!")
}
```

実行してみる。

```
❯ go run main.go
Hello hoge!
Hello fuga!
```
このように、main.goファイルに全てのソースコードを書いている場合は問題はないだろう。

次に、問題の、ファイルを分割する場合を見てみる。

#ファイルを分割する
ファイルをそれぞれ同列に配置。

```
❯ tree
/Users/takuyanin/go/src/go-test
|--hogefuga.go
|--main.go
```

プログラムは関数を別パッケージに切り出す。

```main.go
package main

import "./hogefuga"

func main()  {
	hogefuga.Hoge()
	hogefuga.Fuga()
}
```

```hogefuga.go
package hogefuga

import "fmt"

func Hoge() {
	fmt.Println("Hello hoge!")
}

func Fuga() {
	fmt.Println("Hello fuga!")
}
```

そして、実行すると、例のエラーに遭遇。

```
❯ go run main.go
main.go:3:8: cannot find package "./hogefuga" in:
	/Users/takuyanin/go/src/go-test/hogefuga
```

#解決
パッケージ名と同名のディレクトリを準備し、その下に分離したパッケージを移動する。

```
❯ mkdir hogefuga

❯ ls
hogefuga/    hogefuga.go main.go

❯ mv hogefuga.go hogefuga/

❯ ls
hogefuga/ main.go
```
要は、配置が下記のようになっていればOK。

```
❯ tree
/Users/takuyanin/go/src/go-test
|--hogefuga
|  |--hogefuga.go
|--main.go
```
実行すると、期待通りに動く。

```
❯ go run main.go
Hello hoge!
Hello fuga!
```

#Goのパッケージの作り方
上で見たように、分離した`パッケージ名 = ディレクトリ名`となっていることが必要。

##王道の作り方
`ディレクトリ名 = ファイル名 = パッケージ名`。

```
❯ tree
/Users/takuyanin/go/src/go-test
|--hogefuga
|  |--hogefuga.go
|--main.go
```


しかし、**ファイル名は同名でなくても良い**ことに注意。

例えば、**hogefuga.goのファイル名をpiyo.goに変更しても同様の結果が得られる**。

```
❯ tree
/Users/takuyanin/go/src/go-test
|--hogefuga
|  |--piyo.go
|--main.go

❯ go run main.go
Hello hoge!
Hello fuga!
```

##分割するファイルを増やす
また、次のように分離するファイルが増えたとしても問題ない。

```
❯ tree
/Users/takuyanin/go/src/go-test
|--hogefuga
|  |--fuga.go
|  |--hoge.go
|--main.go
```

ソースコードは下記のような感じ。
`main.go`は変更なし。

```main.go
 package main

import "./hogefuga"

func main() {
	hogefuga.Hoge()
	hogefuga.Fuga()
}
```

```hoge.go
package hogefuga

import "fmt"

func Hoge()  {
	fmt.Print("Hello hoge\n")
}
```

```fuga.go
package hogefuga

import "fmt"

func Fuga() {
		fmt.Print("Hello fuga\n")
}
```
これでわかるように、同名のパッケージ名を複数回使うことができる。

#おわりに
他の言語にはない仕様であるため、Goでプログラムを組む際、同じようなに躓く人は割といるのではないかと思い記事にまとめてみました。再度まとめると、

・ディレクトリを準備し、`パッケージ名 = ディレクトリ名`とし、構成に留意する

これで、Go言語で、簡単なプロジェクトなら作れるようになると思います。おわり。
C++のsprintfの使い方: printf を文字列に代入できる!

##はじめに
printf で出力する文字列を変数に代入したいことって良くありますよね!!
ここではsprintf を用いてprintfで出力する文字列を変数に代入します


##本題
イメージとして下記のようなことがしたいとします

```
string s = printf("%06d%06d", tmp1, tmp2);
```
これを下記のように書き換えることによって printf での出力を代入することができます.

```
sprintf(s, "%06d%06d", tmp1, tmp2);
```

もう少し細かく説明していきます.
sprintf は第一引数のchar 型です．

string ではなく char の配列を準備します
(注意: 文字列の最後は '\0' が入るため予定しているサイズより1個大きいサイズを準備してください)
ここまできたら, あとはもう簡単です.
sprintf((char型配列), (いつものprintfの書き方)) で
文字列を代入することができます.
下記はサンプルプログラムです.

```c++:exsample.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    char s[13]; 
    int tmp1=123, tmp2=45;
    sprintf(s, "%06d%06d", tmp1, tmp2);
    cout << s << endl;
}
```
```exsample_output.txt
000123000045
```

もちろん多次元配列でも代入できます.

```c++:exsample2.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    char s[3][13];
    int tmp1=0, tmp2=0;
    for(int i=0; i<3; i++){
    	tmp1+=2;
    	tmp2+=3;
    	sprintf(s[i], "%06d%06d", tmp1, tmp2);
    }
    for(int i=0; i<3; i++){
    	cout << s[i] <<endl;
    }
}
```

```exsample2_output.txt
000002000003
000004000006
000006000009
```