Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all 21155 articles
Browse latest View live

2019年7月7日からほぼ毎日投稿している話 ~300投稿目の振り返り~

$
0
0

目的

  • 300投稿目のため、記事投稿のメリットや考え方などをまとめてみる

記事投稿のメリット

  • 考えの言語化が非常に簡単にできるようになった。
  • 記事としてまとめることにより第三者にみられることを意識して自分の知識を再構築できた。
  • 継続していることが第三者に伝わりやすいため、継続して何かを実施できる人という証明になった。
  • 自分なりの記事のまとめ方が固まってきたことにより素早く記事が書けるようになった。
  • 技術的な内容を時間のある時にまとめることにより、採用フロー内の技術課題がスムーズに実施できた。
  • 記事数が増えるにつれContributionの頻度が上がった。
  • 環境構築などを実施する際に記事を書きながら環境構築を行うため他端末での環境構築時に同じ環境がすぐに作れるようになった。
  • 技術同人誌を書く際の文章力をアップさせる練習になった。

記事を書く時に筆者が考えていること

  • 記事を書く際は時間がかかってしまっても、その記事を元に同じトラブルを後の自分が回避できるなら書く時間に少しウエイトを置く。
  • どんなにニッチな記事でも一定のニーズがある。
  • 世界に一人くらいは自分と同じ問題を抱えている人がいるはずなのでとりあえず記事を投稿しておく。
  • 記事に対する世間からの反応はそんなにすぐにこない。よっぽどバズる記事を書かないかぎり。
  • 記事にコメントやアクションがつくと嬉しいので他の人の投稿にも積極的にコメントやアクションをつける。
  • 詳しくなくて良い、とにかく今ある知識を自分の中だけではなく、みなさんの見れるところに置いておくことが大切である。
  • ニッチな内容ならいつもよりちょっと詳しく記載をしてみる。

これからどうするのか

  • 2020年7月7日まで毎日投稿は実施する。
  • それ以降は完全に投稿を止めるのではなく、一歩踏み込んだ投稿内容を増やして行こうとおもう。
  • 自分と同じ境遇のみなさんに記事投稿をお勧めする。
  • まだまだプログラミング初心者なので、今の自分にしか無い価値観で今の自分にしか書けない記事を書いて行こうとおもう。

🔰WinActor 7.x ライブラリ一覧

$
0
0

2020年1月末に新しく公開されたWinActor 7では、ライブラリもアップデートされたようだよ😁😍👌
さっそく、ライブラリの一覧と変更点をまとめてみたよ😘✨

6.xのライブラリ一覧はこちらをみてね
5.xのライブラリ一覧はこちらをみてね

Ver.7 新機能

互換性についての注釈

新機能紹介ページ内の記載から引用:

WinActor Ver.7.0は、WinActor Ver.5およびVer.6で作成したシナリオファイル(拡張子がums5またはums6)を実行することが可能です。
ただし、WinActorノート、Cloud Library、Ver.6.3の新機能を含むシナリオファイルを実行することはできません。(Ver.7.1にて対応予定)
WinActor Ver.5またはVer.6 のシナリオファイルを読み込んだ後に WinActor Ver.7.0で保存すると、保存したファイルの拡張子は ums7 となり、WinActor Ver.5およびWinActor Ver.6では読み込むことはできませんのでご注意ください。

WinActor ノートのライブラリは7.0.1では実装されていないようだよ😰😰

インストール済みライブラリ一覧

前バージョンから削除。
新規に追加。

インストール済みライブラリ

  • 01_WinActor制御
    • 01_WinActorウィンドウ
      • WinActorウィンドウを元に戻す
      • WinActorウィンドウを最小化
    • 02_シナリオ制御
      • WinActor終了
      • シナリオGoto
      • シナリオGoto変数値クリア
      • シナリオGoto変数値ダンプ
      • シナリオGoto変数値引き継ぎ
      • シナリオ停止
    • 03_スロー実行の設定
      • スロー実行の設定
    • 04_ループ関連
      • ループの最初で分岐
      • ループの最後で分岐
    • 05_誤操作防止設定
      • 誤操作防止(OFF)
      • 誤操作防止(ON)
    • 06_シナリオ情報
      • シナリオファイル名取得
      • データ一覧ファイル名取得
    • 07_デバッグ
      • SPVエラー情報収集
      • デバッグ:ウィンドウ状態
      • デバッグ:ウィンドウ状態保存
      • デバッグ:ウィンドウ識別
      • デバッグ:ウィンドウ識別保存
      • デバッグ:変数値保存
    • 08_実行ログ
      • ログメッセージ出力
      • ログ出力(ファイル指定)
  • 02_エラー処理
    • エラー
    • エラー処理の例(音を鳴らす)
    • エラー情報クリア
    • エラー情報収集
    • データ一覧未使用時エラー
    • 例外を発生させる
  • 03_変数
    • 変数の現在値を取得
    • 01_csvファイル読み込み
      • csvファイル→変数値
    • 02_辞書と配列
      • 辞書操作(ダンプ)
      • 辞書操作(初期化)
      • 辞書操作(情報取得)
      • 辞書操作(情報更新)
      • 1次元配列操作(ダンプ)
      • 1次元配列操作(初期化)
      • 1次元配列操作(情報取得)
      • 1次元配列操作(情報挿入)
      • 1次元配列操作(情報更新)
      • 1次元配列操作(指定インデックスの情報初期化)
      • 2次元配列操作(ダンプ)
      • 2次元配列操作(初期化)
      • 2次元配列操作(情報取得)
      • 2次元配列操作(情報更新)
      • 2次元配列操作(指定インデックスの情報初期化)
    • 03_暗号化復号
      • 復号
      • 暗号化
  • 04_自動記録アクション
    • エミュレーション
    • クリック(IE)
    • クリック(WIN32)
    • タブ選択(WIN32)
    • チェック状態取得(IE)
    • チェック状態取得(WIN32)
    • リスト一括取得(IE)
    • リスト一括取得(WIN32)
    • リスト取得(IE)
    • リスト取得(WIN32)
    • リスト選択(IE)
    • リスト選択(WIN32)
    • 文字列取得(IE)
    • 文字列取得(WIN32)
    • 文字列設定(IE)
    • 文字列設定(WIN32)
    • 有効無効状態取得(IE)
    • 有効無効状態取得(WIN32)
    • 表の値取得(IE)
  • 05_計算
    • カウントダウン
    • 剰余演算
    • 税込金額計算
    • 通貨型四則演算
  • 06_文字列比較
    • 前方一致比較
    • 後方一致比較
    • 数値大小比較(Dbl精度)
    • 文字列比較
    • 部分一致比較
  • 07_文字列操作
    • 01_変換・整形
      • トリミング
      • 不要な0を除去(整数)
      • 大文字化/小文字化
      • 小書き文字変換
      • 括弧書きの内側を取り出す
      • 改行コード追加
      • 文字列置換
    • 02_切り出し・分割
      • 文字列を前後に分割
      • 文字列を3つに分割
      • 文字列分割
      • 文字列切り出し(先頭何文字分)
      • 文字列切り出し(後方何文字分)
      • 文字列切り出し(途中文字)
      • 文字列削除
    • 03_連結
      • 文字列の連結(2つ)
      • 文字列の連結(3つ)
      • 文字列の連結(4つ)
      • 文字列の連結(5つ)
    • 04_数値に関する変換
      • 10進数をN進数に変換
      • 16進数を10進数に変換
      • 数値の書式変換
  • 08_日付関連
    • n時間後の時刻計算
    • 日付分割
    • 日付取得(yyyymmdd)
    • 日付取得(書式指定)
    • 日付取得(西暦年のみ/月のみ/日のみ)
    • 日付差計算
    • 日付書式変換
    • 日付計算(n年後/n月後/n日後)
    • 曜日判定
  • 09_待機
    • 指定時間待機(変数指定可)
  • 10_ダイアログ
    • Yes・No待機ボックス(Java)
    • Yes・No待機ボックス(Java詳細)
    • Yes・No待機ボックス(VB)
    • オリジナルインプットボックス(詳細)
    • オリジナルインプットボックス
    • オリジナル待機ボックス
    • パスワードインプットボックス
    • ファイル選択ボックス(Java)
    • フォルダ選択ボックス(Java)
    • フォルダ選択ボックス(Win)
    • 待機ボックス(タイムアウト付き)
    • 待機ボックス(位置指定可)
  • 11_ウィンドウ関連
    • ウィンドウの表示変更
    • ウィンドウを閉じる
    • ウィンドウハンドル取得
    • ウィンドウ前面化
    • ウィンドウ識別クリア
    • 保存、終了(CTRL+S,ALT+F4)
    • 画面サイズ、位置取得
    • 画面サイズ、位置設定
  • 12_マウス関連
    • マウスドラッグ(画像マッチング箇所へ)
    • マウスドラッグ
    • マウスドラッグ2
    • マウスホイール操作
    • マウス中クリック
    • マウス位置取得
    • マウス位置取得2
    • マウス右クリック
    • マウス左クリック
    • マウス移動(画像マッチング箇所)
    • マウス移動
    • マウス移動2
  • 13_ファイル関連
    • 01_テキストファイル操作
      • テキストファイルの中身をコピー
      • テキストファイル書込
      • テキストファイル行数取得
      • テキストファイル読込
      • テキストファイル追記
      • ログ記録
    • 02_ファイル操作
      • Explorerでファイル開く
      • コマンド実行
      • コマンド実行結果をファイル保存
      • デスクトップにあるファイルを開く
      • ファイルと関連づいているアプリ起動
      • ファイルコピー
      • ファイル削除
      • ファイル存在有無チェック
      • ファイル移動
      • 読み取り属性チェック
      • Zip関連
        • Zip圧縮(パスワード付き)
        • Zip圧縮
        • Zip解凍(パスワード付き)
        • Zip解凍
        • ファイルエンコーディング指定
    • 03_フォルダ操作
      • フォルダ作成
    • 04_ファイル一覧
      • ファイルリスト作成
      • ファイルリスト作成(拡張子指定)
      • ファイル一覧(ファイル名)取得
      • ファイル一覧(ファイル数)取得
      • ファイル検索
      • フォルダリスト作成
      • 先頭ファイルの取得
    • 05_ファイル名
      • シナリオフォルダのファイルパス
      • デスクトップフォルダのファイルパス
      • デスクトップフォルダ取得
      • フォルダパスとファイル名の連結
      • マイドキュメントフォルダのファイルパス
      • マイドキュメントフォルダ取得
  • 14_入力欄操作
    • エミュレーションで文字送信
    • テキスト入力グループ
    • テキスト入力欄に貼り付け
    • テキスト入力欄に貼り付け(追記)
    • テキスト入力欄をコピー
    • テキスト入力欄を空にする
    • テキスト読取りグループ
    • テキスト転記グループ
    • 名前を付けて保存画面ファイル名入力
    • 次の入力欄へ
  • 15_画像マッチング関連
    • 画像マッチング(ファイル指定)
    • 画像マッチング箇所の取得
  • 16_画面キャプチャ色判定
    • 画面キャプチャ(アクティブなウィンドウ)
    • 画面キャプチャ(デスクトップ)
    • 画面キャプチャ(指定画面)
    • 直前画像マッチング箇所の色判定
    • 色判定
  • 17_IE関連
    • HTTPファイルダウンロード
    • IE操作(URL指定)
    • IE操作(位置・サイズ変更)
    • IE操作(指定CLASS内のリンク先を取得)
    • IE操作(指定URLのIEをClose)
    • IE操作(表の値取得)
    • IE操作(読込完了待ち)
    • IE操作(読込完了待ち_タイムアウト付き)
    • URLを指定してIE起動
    • リンクの文字列取得
    • 01_IEデバッグ
      • IE操作(Debug class名指定 情報出力)
      • IE操作(Debug Class情報)
      • IE操作(Debug Href情報)
      • IE操作(Debug ID情報)
      • IE操作(Debug id指定 情報出力)
      • IE操作(Debug Name情報)
      • IE操作(Debug name指定 情報出力)
      • IE操作(Debug Value情報)
      • IE操作(Debug タグ名指定 情報出力)
      • IE操作(Debug 表示検索)
      • IE操作(Debug全タグ情報簡易版)
      • IE操作(Debug全タグ情報詳細版)
    • 02_クリック
      • IE操作(イメージマップをクリック)
      • IE操作(指定タグの指定テキストをクリック)
      • IE操作(指定テキストをクリック)
      • IE操作(指定リンクをクリック)
      • IE操作(表内のコントロールをクリック1)
      • IE操作(表内のコントロールをクリック2)
    • 03_テキスト取得
      • IE操作(指定CLASS内のテキストを取得)
      • IE操作(指定ID内のテキストを取得)
      • IE操作(指定タグの指定ID内のテキストを取得)
  • 18_Excel関連
    • Excel操作(データ一覧連携)
    • Excel操作(マクロ実行)
    • Excel操作(マッチング)
    • Excel操作(値、書式設定)
    • Excel操作(値の取得)
    • Excel操作(値の取得2)
    • Excel操作(値の設定)
    • Excel操作(値の設定2)
    • Excel操作(検索一致)
    • 01_ファイル操作
      • Excelファイル名取得
      • Excel使用中チェック
      • Excel操作(CSV形式で保存)
      • Excel操作(上書き保存)
      • Excel操作(保存なしで閉じる)
      • Excel操作(全て閉じる)
      • Excel操作(名前を付けて保存)
      • Excel操作(新規作成)
      • Excel開く(前面化)
      • Excel開く(書き込みパスワード付き)
      • Excel開く(読み取りパスワード付き)
      • Excel開く(読み取り&書き込みパスワード付き)
    • 02_シート操作
      • Excel操作(yyyy.mm.ddのシート数取得)
      • Excel操作(シートコピー)
      • Excel操作(シート名取得)
      • Excel操作(シート数取得)
      • Excel操作(シート追加)
      • Excel操作(シート選択)
      • Excel操作(別Bookのシートコピー)
    • 03_行列操作
      • Excel操作(列コピー)
      • Excel操作(列ペースト)
      • Excel操作(列削除)
      • Excel操作(列挿入)
      • Excel操作(列移動)
      • Excel操作(列複製)
      • Excel操作(最終行取得 その1)
      • Excel操作(最終行取得 その2)
      • Excel操作(最終行取得 その3)
      • Excel操作(最終行取得 その4)
      • Excel操作(行の読み取り)
      • Excel操作(行コピー)
      • Excel操作(行ペースト)
      • Excel操作(行列変換ペースト)
      • Excel操作(行削除)
      • Excel操作(行挿入)
      • Excel操作(行移動)
      • Excel操作(行複製)
    • 04_セル操作
      • Excel操作(HyperLinkをクリック)
      • Excel操作(アクティブセルから指定位置の値取得)
    • 05_数式
      • Excel操作(数式の取得)
      • Excel操作(数式の設定)
    • 06_文字色&背景色
      • Excel操作(文字色を付ける(セル指定))
      • Excel操作(文字色を付ける(範囲指定))
      • Excel操作(背景色を付ける(セル指定))
      • Excel操作(背景色を付ける(範囲指定))
      • Excel操作(背景色クリア(セル指定))
      • Excel操作(背景色クリア(範囲指定))
    • 07_コピー&ペースト
      • Excel操作(カーソル位置へペースト)
      • Excel操作(カーソル位置へ値のみペースト)
      • Excel操作(ペースト)
      • Excel操作(値のみペースト)
      • Excel操作(書式を含めたコピー)
    • 08_範囲
      • Excel操作(範囲コピー)
      • Excel操作(範囲値削除)
      • Excel操作(範囲検索)
      • Excel操作(範囲選択)
    • 09_セル位置
      • A1形式→R1C1形式 その1
      • A1形式→R1C1形式 その2
      • A1形式 次の行へ
      • R1C1形式→A1形式 その1
      • R1C1形式→A1形式 その2
      • R1C1形式 列移動(上書き)
      • R1C1形式 列移動(複製)
      • R1C1形式 次の列へ
      • R1C1形式 次の行へ
      • R1C1形式 行列移動(上書き)
      • R1C1形式 行列移動(複製)
      • R1C1形式 行移動(上書き)
      • R1C1形式 行移動(複製)
    • 10_フィルタ操作
      • Excel操作(フィルタ条件設定)
      • Excel操作(フィルタ複数条件設定)
      • Excel操作(フィルタ解除)
      • Excel操作(フィルタ設定)
    • 11_カーソル操作
      • Excel操作(カーソル位置の読み取り)
      • Excel操作(カーソル移動)
    • 12_書式
      • Excelの書式設定
  • 19_Word関連
    • Word操作(ブックマークの前へ挿入)
    • Word操作(ブックマークの後ろへ挿入)
    • Word操作(上書き保存)
    • Word操作(名前を付けて保存)
    • Word操作(検索)
    • Word操作(表の内容修正)
    • Word操作(表の内容修正2)
    • Word操作(閉じる)
    • Word操作(開く)
  • 20_メール関連
    • メール送信
    • 01_Outlook操作
      • Outlook メールと添付ファイルを保存
      • Outlook メール送信
      • Outlook メール送信(メーラ起動、停止含む)
      • Outlook メール送信(添付ファイル付)
      • Outlook メール送信(添付ファイル付)(メーラ起動、停止含む)
      • Outlook 予定の検索
      • Outlook 受領メールを全員に返信(送信前)
      • Outlook 新しい予定の登録
      • Outlook 条件を指定して対象メール件数取得
      • Outlook 条件を指定して対象メール保存
      • Outlookメーラ終了
      • Outlookメーラ起動
      • Outlookメーラ起動確認
    • 02_ThunderBird操作
      • ThunderBirdメール送信
    • 03_WinActorメール管理
      • メールフォルダ同期
      • メール処理済み削除
      • メール削除
      • メール受信
      • メール受信設定
      • メール受信設定インポート
      • メール情報コピー
      • メール情報取得
      • メール状態変更
      • メール選択
      • 添付ファイル名取得
  • 21_PowerPoint関連
    • PowerPoint操作(テキスト挿入)
  • 22_OS関連
    • HDD情報収集
    • イベントログ登録(エラー)
    • コンピュータ名取得
    • ネットワーク情報収集
    • マシン情報収集
  • 23_ブラウザ関連
    • ウィンドウクローズ
    • ウィンドウタイトル取得
    • ウィンドウハンドル取得
    • ウィンドウ数取得
    • クリック
    • ダイアログクリック
    • チェック状態取得
    • ドライバのパス取得
    • ファイル選択
    • フレーム選択
    • ブラウザクローズ
    • ブラウザ全クローズ
    • ブラウザ再起動
    • ブラウザ起動
    • ブラウザ起動(ドライバ指定・プロキシ設定)
    • ブラウザ起動(ドライバ指定)
    • ブラウザ起動(プロキシ設定)
    • ページ表示
    • マルチリスト全選択解除
    • マルチリスト選択
    • マルチリスト選択解除
    • リスト一括取得
    • リスト選択
    • リスト選択取得
    • 任意のウィンドウへ移動
    • 値の取得
    • 値の設定
    • 有効無効状態取得
    • 次のウィンドウへ移動
    • 表の値取得
  • 24_Java関連
    • クリック
    • タブ選択
    • チェックボックス・オフ
    • チェックボックス・オン
    • チェック状態取得
    • マルチリスト全選択解除
    • マルチリスト選択
    • マルチリスト選択解除
    • リスト一括取得
    • リスト選択
    • リスト選択取得
    • 値の取得
    • 値の設定
    • 有効無効状態取得
    • 表の値取得
  • 25_WinActorノート1
  • 98_構造データ関連
    • 01_JSON
      • JSONファイル 配列サイズ
      • JSONファイル 配列読み取り
      • JSON変数 ファイル保存
      • JSON変数 新規オブジェクト
      • JSON変数 新規配列
      • JSON変数 要素追加
      • JSON変数 読み取り
      • JSON変数 配列サイズ
      • JSON変数 配列要素追加
      • JSON変数 配列読み取り
      • JSON形式書き込み
      • JSON形式読み取り
  • 99_外部サービス連携
    • 01_OAuth関連
      • RESTful API実行
      • アクセストークンの取り消し
      • アクセストークンの取得
    • 02_HTTP関連
      • HTTP
    • 03_Syslog関連
      • syslog送信

  1. WinActorノートは7.0.1ライブラリから削除されています。 

Kotlin入門:インターフェース

$
0
0

インターフェース

構文:

interfacename{ definition }

name:インターフェース名
definition:インターフェースの定義

インターフェースには以下の制限があります。
・コンストラクターを持てない
・抽象プロパティかカスタムアクセサーを持つこと
・アクセサーからバッキングフィールドへのアクセスはできない
・アクセス修飾子はpublicのみ利用可能

入力例:

interfacePerson{funsayHello()}classMagickPearon():Person{overridefunsayHello(){println("Hello")}}funmain(){valmp=MagickPearon()mp.sayHello()}

インターフェースを実装するときは継承と同じように
後方に「:インターフェース名」で表します。
継承とインターフェースの実装を同時に行うこともできます。

実行結果は以下の通りです。

Hello

インターフェースでのプロパティ

入力例:

interfacePerson{vargreeting:StringfunsayHello()}openclassMagickPearon():Person{overridevargreeting:String="Hello World"overridefunsayHello(){println(greeting)}}funmain(){valmp=MagickPearon()mp.sayHello()}

インターフェース内でもプロパティの設定は可能です。
この場合、実装先では必ずプロパティを実装しなければいけません。
また、プロパティの実装時にはoverrideキーワードを付与している点に注意してください。

実行結果は以下の通りです。

HelloWorld

【PHP+MySQL】改良恐竜登録ツール(PHP7.2.4+MySQL版)

$
0
0

1.MySQL+PHPにおける恐竜登録ツール

画面例:開始画面(一定数以上、登録するとハイブリッドか非ハイブリッドを選べる)

start_dino_mysql.jpg

画面例:非ハイブリッド登録画面

select_dino_mysql1.jpg

画面例:ハイブリッド登録画面

SQLite3版との相違点は、生成元タイプを確定すると、そのタイプに属した恐竜名を指定することができる。
前回は生成元タイプ指定画面+生成元恐竜指定画面が別画面だった。

select_dino_mysql2.jpg

なおCSSは適用していない。

2.コード

共通関数

common_dino2.php
<?phpfunctionNewPdo($dbname){$dsn='mysql:dbname='.$dbname.';host=localhost:3308;charset=utf8mb4';$user='root';$password='root123';$dbh=newPDO($dsn,$user,$password);return$dbh;}functionCheckdino($db0,$qry0,$val1,$type1){$flg=0;$result3=$db0->prepare($qry0);//パラメータをセット$result3->bindparam(1,$val1);$result3->bindparam(2,$type1);$result3->execute();//検索結果を配列に格納する$select_data=$result3->fetch();return$select_data;}//クエリ実行して得られる全データ(パラメータ)functionget_SelectTypeData($db0,$query0,$val1){$result_a=$db0->prepare($query0);$result_a->bindparam(1,$val1);$result_a->execute();return$result_a;}//クエリ実行して得られる全データfunctionget_AllData($db0,$query0){$result_a=$db0->prepare($query0);$result_a->execute();return$result_a;}//$str1:検索対象文字列,$str_mark:探したい文字: 戻り値、探したい文字より前にある文字列functionget_BeforeMarkString($str1,$str_mark){$idx0=strpos($str1,$str_mark);$retstr=substr($str1,0,$idx0);return$retstr;}//$str1:検索対象文字列,$str_mark:探したい文字、探したい文字より後にある文字列functionget_AfterMarkString($str1,$str_mark){$idx0=strpos($str1,$str_mark);$retstr=substr($str1,$idx0+1);return$retstr;}?>

開始画面

start_dino2_mysql.php
<!DOCTYPE html><htmllang="ja"><metacharset="utf-8"><title>恐竜登録にようこそ</title><h1>開始</h1><?phprequire'common_dino2.php';$select_all="select count(*) from tbl_dino";$dbname="db_dino";$dbh=NewPdo($dbname);$ret0=0;$result_a=get_AllData($dbh,$select_all);//$count$count=$result_a->fetchColumn();$ret0=$count;?><?phpif($ret0>3){?><formaction="select_dinotype3_mysql.php"method="post">カテゴリー:
  <selectname="l_category"><option>ハイブリッド</option><option>非ハイブリッド</option></select><br><inputtype="submit"value="開始"name="btn2"></form><?php}else{?><formaction="single_dino2_mysql.php"method="post"><inputtype="text"name="dname">カテゴリー:
  <selectname="dtype0"><option>normal</option><option>rare</option><option>epic</option></select><inputtype="submit"value="確定"name="btn2"></form><?php}?></html>

恐竜タイプ選択画面

select_dinotype3_mysql.php
<!DOCTYPE html><htmllang="ja"><metacharset="utf-8"><title>恐竜タイプ選択1</title><body><?php$HNtype0=isset($_POST['l_category'])?htmlspecialchars($_POST['l_category']):null;;if(strcmp($HNtype0,"非ハイブリッド")==0){echo"<h1>非ハイブリッド選択</h1>";?><formaction="single_dino2_mysql.php"method="post"><inputtype="text"name="dname">カテゴリー:
  <selectname="dtype0"><option>normal</option><option>rare</option><option>epic</option></select><inputtype="submit"value="確定"name="btn2"></form><?php}else{echo"<h1>ハイブリッド選択</h1>";require"common_dino2.php";$dbname="db_dino";$dbh=NewPdo($dbname);$query_type0="SELECT DISTINCT type0 from tbl_dino";?><formaction="select_dinotype3_mysql.php"method="post">生成元タイプ1:
  <?php$result_a=get_AllData($dbh,$query_type0);$result_b=get_AllData($dbh,$query_type0);$stype1=isset($_POST['dtype01'])?htmlspecialchars($_POST['dtype01']):null;$stype2=isset($_POST['dtype02'])?htmlspecialchars($_POST['dtype02']):null;?><selectname="dtype01"style="width: 100px"><?phpwhile($select_data=$result_a->fetch(PDO::FETCH_ASSOC)){//$stype1が$select_data['type0']と等しい場合if($stype1==$select_data['type0']){echo"<option selected>".$select_data['type0']."</option>";//$stype1が$select_data['type0']と等しくない場合}else{echo"<option>".$select_data['type0']."</option>";}}?></select><br>生成元タイプ2:
  <selectname="dtype02"style="width: 100px"><?phpwhile($select_data2=$result_b->fetch(PDO::FETCH_ASSOC)){//$stype2が$select_data2['type0']と等しい場合if($stype2==$select_data2['type0']){echo"<option selected>".$select_data2['type0']."</option>";//$stype2が$select_data2['type0']と等しくない場合}else{echo"<option>".$select_data2['type0']."</option>";}}?></select><br><inputtype="submit"value="タイプ確定"></form><?php$dbname="db_dino";$dbh=NewPdo($dbname);$query_select_type0="SELECT dname0 from tbl_dino where type0 = ?";$result1=get_SelectTypeData($dbh,$query_select_type0,$stype1);$result2=get_SelectTypeData($dbh,$query_select_type0,$stype2);?><formaction="hibrid_dino2_mysql.php"method="post">生成元恐竜1:
  <selectname="dname1"style="width: 280px"><?phpwhile($select_data=$result1->fetch(PDO::FETCH_ASSOC)){echo"<option>".$select_data['dname0']."</option>";}?></select><br>生成元恐竜2:
  <selectname="dname2"style="width: 280px"><?phpwhile($select_data2=$result2->fetch(PDO::FETCH_ASSOC)){echo"<option>".$select_data2['dname0']."</option>";}?></select><br>恐竜名:
  <inputtype="text"name="hdname0">製造カテゴリー:
  <selectname="hdtype0"><option>rare</option><option>epic</option><option>regend</option><option>unique</option></select><br><inputtype="hidden"name="btn2"value="<?=$HNtype0.":".$stype1.",".$stype2?>"><inputtype="submit"value="確定"></form><?php}?><br><formaction="start_dino2_mysql.php"method="post"><inputtype="submit"value="戻る"name="btn3"></form></body></html>

非ハイブリッド登録結果

single_dino2_mysql.php
<!DOCTYPE html><htmllang="ja"><metacharset="utf-8"><title>非ハイブリッド恐竜</title><h1>非ハイブリッド恐竜登録結果</h1><?phprequire'common_dino2.php';$dbname="db_dino";$dbh=NewPdo($dbname);$dtype1=isset($_POST['dtype0'])?htmlspecialchars($_POST['dtype0']):null;$dname1=isset($_POST['dname'])?htmlspecialchars($_POST['dname']):null;$query_ins1="INSERT INTO tbl_dino(dname0,type0,n_src1,n_src2) VALUES(?,?,?,?)";$select_all="select count(*) from tbl_dino";$result_a=get_AllData($dbh,$select_all);//登録件数$count=$result_a->fetchColumn();$total_dino=$count;//echo $dname1.":".$dtype1;$query_select1="SELECT * FROM tbl_dino WHERE dname0 = ? AND type0 = ?";//検索文字列、置換文字列,検索対象文字列の順番$dname2=trim(str_replace(" "," ",$dname1));if(isset($dname1)&&empty($dname2)==false){//すでに登録済みの恐竜か否かチェックする$select_data=Checkdino($dbh,$query_select1,trim($dname2),$dtype1);if($select_data){echo"登録済みです";}else{$result1=$dbh->prepare($query_ins1);//パラメータをセット$result1->bindparam(1,$dname2);$result1->bindparam(2,$dtype1);//合成なしの場合、合成元恐竜がいないため$num0=0;$result1->bindparam(3,$num0);$result1->bindparam(4,$num0);$result1->execute();echotrim($dname2).":".$dtype1."の登録が完了しました";}}else{echo"値が不正です";}?><formaction="select_dinotype3_mysql.php"method="post"><inputtype="hidden"name="l_category"value="非ハイブリッド"><inputtype="submit"value="戻る"><br><br></form></html>

ハイブリッド登録結果

hibrid_dino2_mysql.php
<!DOCTYPE html><htmllang="ja"><metacharset="utf-8"><title>ハイブリッド恐竜登録結果</title><h1>ハイブリッド恐竜登録結果</h1><?phprequire'common_dino2.php';$dbname="db_dino";$dbh=NewPdo($dbname);$HNsrctype_str=isset($_POST['btn2'])?htmlspecialchars($_POST['btn2']):null;//生成恐竜と生成タイプ$hdname1=isset($_POST['hdname0'])?htmlspecialchars($_POST['hdname0']):null;$hdtype1=isset($_POST['hdtype0'])?htmlspecialchars($_POST['hdtype0']):null;//生成元1と生成元2$src_dname1=isset($_POST['dname1'])?htmlspecialchars($_POST['dname1']):null;$src_dname2=isset($_POST['dname2'])?htmlspecialchars($_POST['dname2']):null;$query_ins2="INSERT INTO tbl_dino(dname0,type0,n_src1,type1,n_src2,type2) VALUES(?,?,?,?,?,?)";if(isset($HNsrctype_str)&&empty($HNsrctype_str)==false){$HNtype0=get_BeforeMarkString($HNsrctype_str,":");$src_type=get_AfterMarkString($HNsrctype_str,":");$stype1=get_BeforeMarkString($src_type,",");$stype2=get_AfterMarkString($src_type,",");}//登録件数$select_all="select count(*) from tbl_dino";$result_a=get_AllData($dbh,$select_all);//登録件数$count=$result_a->fetchColumn();$total_dino=$count;$query_select1="SELECT * FROM tbl_dino WHERE dname0 = ? and type0 = ?";//全角の空白を半角スペースに変換 $hdname2=trim(str_replace(" "," ",$hdname1));if(isset($hdname1)&&empty($hdname2)==false){if(strcmp($src_dname1,$src_dname2)==0&&strcmp($stype1,$stype2)==0){echo"生成元1と生成元2は違う種類を選んでください。";}else{//すでに登録済みの恐竜か否かチェックする$select_data0=Checkdino($dbh,$query_select1,trim($hdname2),$hdtype1);if($select_data0){echo"登録済みです";}else{$select_data1=Checkdino($dbh,$query_select1,$src_dname1,$stype1);//生成元1の恐竜番号を取得$num_src1=$select_data1['id'];$select_data2=Checkdino($dbh,$query_select1,$src_dname2,$stype2);//生成元2の恐竜番号を取得$num_src2=$select_data2['id'];//登録クエリ        $result1=$dbh->prepare($query_ins2);//パラメータをセット$result1->bindparam(1,$hdname2);$result1->bindparam(2,$hdtype1);$result1->bindparam(3,$num_src1);$result1->bindparam(4,$stype1);$result1->bindparam(5,$num_src2);$result1->bindparam(6,$stype2);$result1->execute();echo$hdname2.":".$hdtype1."を登録しました";}}}else{echo"名前が不正です";}?><formaction="select_dinotype3_mysql.php"method="post"><inputtype="hidden"name="l_category"value="<?=$HNtype0?>"><inputtype="submit"value="戻る"></form><br><formaction="start_dino2_mysql.php"method="post"><inputtype="hidden"name="btn1"value="<?=$total_dino?>"><inputtype="submit"value="開始画面に戻る"></html>

3.今後の目標

やりたいことを挙げてみた。
業務で関わらないプログラミング言語にトライするには、
興味のある素材があることが一番。
(todoや掲示板、日記も魅力的だと思うけどコピペマンで終わりそう)

  • 恐竜といえば、画像!!!画像登録プログラム。
  • 恐竜登録ページング
  • 恐竜登録CRD
  • 別のプログラミング言語での恐竜登録 --->ここは結構気になっている。

【rails】読みやすいコードの書き方【初心者向け】

$
0
0

はじめに

読みやすいコードを書くことでコードレビューの効率が上がりますし、後々の変更もしやすくなります。
逆に読みにくいコードは読む時間がかかりますし、バグも混入しやすくなり、原因特定に時間がかかってしまいます。
上記のような理由で、業務の効率を高めるために、可読性の高いコードを書くことは非常に重要です。

参考文献

リーダブルコード要約とリーダブルコード要約の活用方法
https://qiita.com/AKB428/items/20e81ccc8d9998b5535d

脱初心者の第一歩!「これは!?」と思わせるイケてるコードの書き方【初心者向け】
https://note.com/cohki0305/n/n061d6fca4b01

読みやすいコードの書き方

1.変数に分かりやすい名前をつける

基本的に英語で命名し、ぱっと見ただけで分かりやすい名前をつけます。

#悪い例str="suzuki"#何が入っているか分からないtime=10#単位がないので分かりづらい
#良い例name="suzuki"#何が入っているかイメージ出来るtime_sec=10#単位があって分かりやすい

英語が思いつかない場合はcodicで調べましょう!
https://codic.jp/engine

2.列を揃える

#悪い例get'/login',to: 'sessions#new'get'/auth/:provider/callback',to: 'sessions#twitter'post'/login',to: 'sessions#create'post'/logout',to: 'sessions#destroy'

上記のままだと、ごちゃっとして見づらいです。
以下のように修正します。

#良い例get'/login',to: 'sessions#new'get'/auth/:provider/callback',to: 'sessions#twitter'post'/login',to: 'sessions#create'post'/logout',to: 'sessions#destroy'

こうすれば見やすいですし、分かりやすくなります。
過剰にやりすぎると手間になるので、やりすぎはよくありませんが
出来る範囲で揃えるようにしましょう。

3.適切なコメントを書く

#不適切なコメント -コードを見てすぐに分かること
 -関数名がおかしいなどの修正可能なものを補うコメント
#適切なコメント -コメンタリーを入れる(こういう背景でこうなったみたいな理由を説明する)
 -欠陥にコメントをつける(TODOやFIXMEを仕様)

4.マジックナンバーは使わない

マジックナンバーとは、プログラムに突然出てくる謎の数字のことです。書いた本人しか分からない魔法の数字です。

#悪い例apple_price=110ifapple_price<100puts"買う"elseputs"買わない"end

急に100という数字が出てきました。
何を基準にしている数字なのか分からないので
名前をつけましょう!

#良い例my_pocket_money=100apple_price=110ifapple_price<100puts"買う"elseputs"買わない"end

「所持金が足りないので、買えない」ということが理解できます。

5.同じコードを繰り返さない

DRY(Don't repeat yourself)を守り、むやみにコードをコピペしたりしないようにしましょう
量が増えることで、読む時間がかかり、修正にも時間がかかってしまいます。
コピペしたときは、まとめれるか考えましょう
以下、参考文献です。

参考文献:DRY原則をもう一度 -コンカレント・エンジニアリング-

6.if文のネストを浅くする

#悪い例ifuser.name=="suzuki"ifuser.age==20ifuser.maleputs"知り合いです"endendend

ネストが深すぎると読みにくくなってしまいます。
多くても2重までにしましょう。

#良い例returnunlessuser.name=="suzuki"&&user.age==20ifuser.maleputs"知り合いです"end

以上のようにすると、ネストを浅くすることが出来ます。

終わりに

少しでも読みやすいコードを書けるように、日々意識することが大切だと思うので、可読性の高いコードが書けるように日々精進していきます。

JavaとPythonの基礎文法比較

$
0
0

  

はじめに

JavaとPythonの基礎文法を比較してみました。
Javaの文法が汚かったり、違う部分があればご指摘いただけるとありがたいです!

目次

1.出力
2.変数
3.文字列と数値の結合
4.if文
5.for文
6.while文
7.forとwhileでbreak, continue
8.list
9.辞書

1.出力

python
print('123')print(123)>>>123>>>123
java
publicclassMain{publicstaticvoidmain(String[]args){System.out.println("123");System.out.println(123);}}>>>123>>>123

2.変数

python
mystr='hello'myint=123print(mystr)print(myint)>>>hello>>>123
java
publicclassMain{publicstaticvoidmain(String[]args){Stringmystr="hello";intmyint=123;System.out.println(mystr);System.out.println(myint);}}>>>hello>>>123

3.文字列と数値の結合

python
myint=123print('数字は'+str(myint))>>>数字は123
java
publicclassMain{publicstaticvoidmain(String[]args){intmyint=123;System.out.println("数字は"+myint);}}>>>数字は123

4.if文

python
myint=10ifmyint==10:print('myintは10です')>>>myint10です
java
publicclassMain{publicstaticvoidmain(String[]args){intmyint=10;if(myint==10){System.out.println("myintは10です");}}}>>>myint10です

5.for文

python
forcharin'Hello':print(char)>>>H>>>e>>>l>>>l>>>o
java
//splitと拡張for文publicclassMain{publicstaticvoidmain(String[]args){Stringmystr="hello";String[]strArray=mystr.split("");for(Strings:strArray){System.out.println(s);}}}//charAtとfor文publicclassMain{publicstaticvoidmain(String[]args){Stringmystr="hello";for(inti=0;i<mystr.length();i++){System.out.println(mystr.charAt(i));}}}>>>h>>>e>>>l>>>l>>>o

・指定回数だけループ

python
foriinrange(3):print(i)>>>0>>>1>>>2
java
publicclassMain{publicstaticvoidmain(String[]args){for(inti=0;i<3;i++){System.out.println(i);}}}>>>0>>>1>>>2

・リスト、配列のループ処理

python
list=['item1','item2','item3']foriteminlist:print(item)>>>item1>>>item2>>>item3
java
publicclassMain{publicstaticvoidmain(String[]args){String[]list={"item1","item2","item3"};for(inti=0;i<list.length;i++){System.out.println(list[i]);}}}>>>item1>>>item2>>>item3

6.While文

python
val=0whileval<4:val+=1print(val)print('valは'+str(val))>>>1>>>2>>>3>>>4>>>val4
java
publicclassMain{publicstaticvoidmain(String[]args){intval=0;while(val<4){val++;System.out.println(val);}System.out.println("valは"+val);}}>>>1>>>2>>>3>>>4>>>val4

7.forとwhileでbreak, continue

・for文でbreak

python
list=[1,2,3,4,5]foriinlist:ifi==3:breakprint(i)>>>1>>>2>>>breakで繰り返し処理終了
java
publicclassMain{publicstaticvoidmain(String[]args){int[]list={1,2,3,4,5};for(inti=1;i<list.length;i++){if(i==3){break;}System.out.println(i);}}}>>>1>>>2>>>breakで繰り返し処理終了

・while文でbreak

python
val=1whileval<10:ifval==3:breakprint(val)val+=1>>>1>>>2>>>breakで繰り返し処理終了
java
publicclassMain{publicstaticvoidmain(String[]args){intval=1;while(val<10){if(val==3){break;}System.out.println(val);val++;}}}>>>1>>>2>>>breakで繰り返し処理終了

・for文でcontinue

python
# for文でcontinue
list=[1,2,3,4,5]foriinlist:ifi==2:continueprint(i)>>>1>>>3>>>4>>>5
java
publicclassMain{publicstaticvoidmain(String[]args){int[]list={1,2,3,4,5};for(inti=1;i<list.length+1;i++){if(i==2){continue;}System.out.println(i);}}}>>>1>>>3>>>4>>>5

・while文でcontinue

python
val=0whileval<5:val+=1ifval==2:continueprint(val)>>>1>>>3>>>4>>>5
java
publicclassMain{publicstaticvoidmain(String[]args){intval=1;while(val<6){if(val==2){val++;continue;}System.out.println(val);val++;}}}>>>1>>>3>>>4>>>5

8.list

pythonではリストが配列の役割を担っています。

python
list=['a','b','c']print(list)>>>['a','b','c']

Javaではリストの中身を全部一気に取得できないので、forを使って一つずつ呼び出す必要があります。

java
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){List<String>list=newArrayList<String>(Arrays.asList("a","b","c"));for(inti=0;i<list.size();i++){System.out.println(list.get(i));}}}>>>a>>>b>>>c

・リスト内の要素の参照

python
list=['a','b','c']#先頭の要素
print(list[0])#2番目の要素
print(list[2])>>>a>>>c
java
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){List<String>list=newArrayList<String>(Arrays.asList("a","b","c"));//先頭の要素System.out.println(list.get(0));//2番目の要素System.out.println(list.get(2));}}>>>a>>>c

・リストへの値の追加

python
list=['a','b','c']#末尾に追加
list.append('d')#指定位置に追加
list.insert(2,'d')print(list)>>>['a','b','d','c','d']
java
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){List<String>list=newArrayList<String>(Arrays.asList("a","b","c"));//末尾に追加list.add("d");//指定位置に追加list.add(2,"d");}}>>>{"a","b","d","c","d"}

・リストからの値の削除

python
list=['a','b','c']#末尾の要素を削除
list.pop()#指定位置の要素を削除
list.pop(1)print(list)>>>['a']
java
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){List<String>list=newArrayList<String>(Arrays.asList("a","b","c"));//指定位置の要素を削除list.remove(0);}}>>>{"b","c"}

・リストの値の更新

python
list=['a','b','c']list[1]='x'print(list)>>>['a','x','c']
java
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){List<String>list=newArrayList<String>(Arrays.asList("a","b","c"));list.set(1,"x");}}>>>{"a","x","c"}

9.辞書、Map

python
dict={'apple':1,'orange':2,'banana':3}print(dict['apple'])>>>1
java
importjava.util.LinkedHashMap;publicclassMain{publicstaticvoidmain(String[]args){LinkedHashMap<String,Integer>map=newLinkedHashMap<>();map.put("apple",1);map.put("orange",2);map.put("banana",3);System.out.println(map);System.out.println(map.get("apple"));}}>>>{apple=1,orange=2,banana=3}>>>1

順序を保持して入れたかったので今回はLinkedHashMapを使いました。

Mapの種類と特徴
LinkedHashMap:
キーを格納した順に保持。
TreeMap:
キーの昇順に保持。
HashMap:
順序を保持しない。

・辞書、Mapの値の更新

python
dict={'apple':1,'orange':2,'banana':3}dict['apple']=5print(dict)>>>{'apple':5,'orange':2,'banana':3}
java
importjava.util.LinkedHashMap;publicclassMain{publicstaticvoidmain(String[]args){LinkedHashMap<String,Integer>map=newLinkedHashMap<>();map.put("apple",1);map.put("orange",2);map.put("banana",3);map.put("apple",5);System.out.println(map);}}>>>{apple=5,orange=2,banana=3}

・辞書、Mapの値の削除

python
dict={'apple':1,'orange':2,'banana':3}deldict['apple']print(dict)>>>{'orange':2,'banana':3}
java
importjava.util.LinkedHashMap;publicclassMain{publicstaticvoidmain(String[]args){LinkedHashMap<String,Integer>map=newLinkedHashMap<>();map.put("apple",1);map.put("orange",2);map.put("banana",3);map.remove("apple");System.out.println(map);}}>>>{orange=2,banana=3}

・キーの存在確認

python
dict={'apple':1,'orange':2,'banana':3}if'apple'indict:print('存在します')else:print('存在しません')>>>存在します
java
importjava.util.LinkedHashMap;publicclassMain{publicstaticvoidmain(String[]args){LinkedHashMap<String,Integer>map=newLinkedHashMap<>();map.put("apple",1);map.put("orange",2);map.put("banana",3);if(map.containsKey("apple")){System.out.println("存在します");}else{System.out.println("存在しません");}}}>>>存在します

  

jQuery メモ

$
0
0

※ jQueryについて勉強したことをまとめたノートみたいなものです😎

HTMLにjQueryを読み込ませる。

//<body>の自分で作成したjsファイルよりも前にjQueryのjsファイルの読み込みを指定する。

 <body>
    <script src="jquery-3.4.1.min.js"></script>
    <script scr="ファイル名.js"></script>
</body>

基本的な書き方

全部書いたコード↓

$(document).ready(function(){
    // ここに実行させたい処理を記述していく。
});

省略可能なコードを削ったもの↓ こちらでOK👌

$(funcution(){
     // ここに実行させたい処理を記述していく。
});

セレクタとメソッド

jQueryの基本の構文は「セレクタ」「メソッド」で成り立っている。

$(funcution(){
     $(.text).css("color","#ff7c89");
});
  • セレクタ = メソッドを実行する要素要素を取得する際「$()」で取得。 複数の要素を指定したい場合は「,(カンマ)」で区切る。
  • メソッド = 処理内容.css()」はjQueryオブジェクトのメソッド。
  • jQueryのセレクタ指定に使用できる記号
記号意味
>ul > liul要素の直下のli要素
,ul,liul要素とli要素
+ul + liul要素に隣接したli要素
半角スペースul liul要素の子要素以下のli要素
  • 要素を指定するメソッド
header1header2header3
メソッド意味
parent()$(li).parent()li要素の親要素
children()$(li).children()li要素の子要素
next()$(li).next()li要素の次の要素
prev()$(li).prev()li要素の前の要素
siblings()$(li).siblings()li要素の同列の兄弟要素

製薬企業研究者がJavaScriptの基本的な文法についてざっくりまとめてみた

$
0
0

はじめに

ここでは、JavaScriptの基本的な文法をざっくりとまとめてみます。

変数とデータ型

変数は、var 変数名 = 値で宣言します。letconstを使うこともできます。
各行の最後には、セミコロン;を書くようにします(セミコロンがなくても動作しますが、書いた方が良いです)。
//以降は、その行の最後までコメントと認識され、プログラムの実行範囲から除外されます。
複数行にわたってコメントアウトしたい場合は、/* */を用います。

variable.js
varstr='文字列';// 文字列console.log(str);varnum=12345;// 数値console.log(num);varisBool=true;// 真偽値console.log(isBool);vararr=['Python','R','JavaScript','PHP'];// 配列console.log(arr);varobj={'Python':'AI','R':'statistics','JavaScript':'web','PHP':'WordPress'};// オブジェクトconsole.log(obj);

なお、オブジェクトの値を出力するときには、console.log(オブジェクト)を用います。

制御文

条件分岐

if文

if文は、if (条件) {処理}と記述します。
さらに場合分けするときは、elseelse ifを使います。

if.js
varnum=3;if(num==1){console.log('1');}elseif(num==2){console.log('2');}elseif(num==3){console.log('3')}else{console.log('1でも2でも3でもない')}

switch文

if文で場合分けが多くなる場合は、switch文を使うと簡単に書けます。
switch (変数) {case 値: 処理; ・・・}と記述します。

switch.js
varnum=3;switch(num){case1:console.log('1');break;case2:console.log('2');break;case3:console.log('3');break;default:console.log('1でも2でも3でもない');break;}

なお、breakを書かないと、条件にあった場合でも後続のcaseの処理が走ってしまうので注意が必要です。

反復処理

for文

一定回数だけ繰り返し処理を実行する(繰り返し回数があらかじめ分かっている)ときは、for文を用います。
for文は、for (var 変数名 = 初期値; 変数 < 最大値 + 1; )と記述します。

for_1.js
for(vari=1;i<5;i++){console.log(i);}

また、for (var 変数名 in 配列) {処理}と書くこともできます。

for_2.js
vararr=['Python','R','JavaScript','PHP'];for(varkeyinarr){console.log(key);// キーを出力console.log(arr[key]);// 値を出力}

さらに、配列の代わりにオブジェクトを対象とする場合は、以下のようになります。

for_3.js
varobj={'Python':'AI','R':'statistics','JavaScript':'web','PHP':'WordPress'};for(varkeyinobj){console.log(key);// キーを出力console.log(obj[key]);// 値を出力}

while文

ある条件を満たす間だけ処理を繰り返す場合は、while文を用います。
while (条件) {処理}と記述します。

while_1.js
varnum=1;while(num<5){console.log(num);num++;}

以下のように、do whileを使うと、必ず1回は処理が実行されます。

while_2.js
varnum=1;do{console.log(num);num++;}while(num<1);

関数

関数は、function 関数名(引数){処理}とすることで作成できます。

function_1.js
functioncopyNumber(num){returnnum;}console.log(copyNumber(123));

以下のように書くこともできます。

function_2.js
varmyFunc=functioncopyNumber(num){returnnum;};console.log(myFunc(123));

オブジェクト

オブジェクトは、var オブジェクト名 = {キー: 値, ・・・}とすることで作成できます。

object_1.js
varhuman={name:'Yukiya',age:31,introduceMyself:function(){return'I am '+human.name+' and '+human.age+' years old. ';}};console.log(human.introduceMyself());

以下のように書くこともできます。

object_2.js
varhuman={};human.name='Yukiya';human.age=31;human.introduceMyself=function(){return'I am '+human.name+' and '+human.age+' years old. ';}console.log(human.introduceMyself());

new演算子を用いることで、新しいインスタンスを作成できます。

object_3.js
varhuman=function(name,age){this.name=name;this.age=age;this.introduceMyself=function(){return'I am '+this.name+' and '+this.age+' years old. ';}};varhuman1=newhuman('Yukiya',31);console.log(human1.introduceMyself());

JavaScriptを記述する場所

JavaScriptは、.jsが拡張子の外部ファイルを作成するか、HTMLファイルに<script>タグを作って記述するかのどちらかで利用することが多いです。
上では、外部ファイルとしてJavaScriptファイルを作成することを前提に解説してきました。
外部ファイルをHTMLに読み込むには、以下のようにします。

head.html
<!DOCTYPE html><html><head><script type="text/javascript"src="sample.js"></script></head><body></body></html>

HTMLファイル中に直接記述する場合は以下のようになります。

javascript.html
<!DOCTYPE html><html><head><metacharset="utf-8"><title>サンプルページ</title><linkrel="stylesheet"href="style.css"></head><body><script>console.log("JavaScript")</script></body></html>

まとめ

ここでは、JavaScriptの基本的な文法について解説しました。
Webページのソースコードを見るときに役立ちます。


【超初心者向け】ターミナル操作 違う階層へのファイルの移動

$
0
0

ダウンロードしたファイルを
別のディレクトリorファイルへ移動させたい時!!
ターミナルでやろうとして失敗した経験から。

【移動させたいファイルの場所】
Users/ユーザー名/Downloads/ダウンロードしたファイル/移動させたいファイル!!

【移動先のファイルの場所】
Users/ユーザー名/workspace(ここに移したい!!)

まずは

$cd ディレクトリ名

で、移動させたいファイルのいる階層までいく。

今回ならば、[ダウンロードしたファイル]のところまで。
〜〜確認方法〜〜〜〜〜〜
$ pwd
と入力すると、
$Users/ユーザー名/Downloads/ダウンロードしたファイル
と表示されていればOKです。
〜〜〜〜〜〜〜〜〜〜〜〜

そこで,以下のように入力してください。

$mv 移動させたいファイル ../../workspace

これでOKです。

違う階層のファイルへ移動させるには
【../】が必要になります。

階層を一つ上がるごとに【../】が一つ必要です。
今回の場合ですと
階層を2つ上がるので【../】を2つ付けています。
〜〜〜〜〜〜〜〜
移動させたいファイル

ダウンロードしたファイル 

Downloads
(ここと同じ階層にworkspace=移動先のファイルがある!!)
〜〜〜〜〜〜〜〜

Python3|競プロ(AtCoder)実践録

$
0
0

はじめに

普段はC#でAtCoder取り組んでいるのですが(と言ってもコンテスト参加はまだ2回だけ)、
最近Python始めてみたので文法理解と実践経験を積むために、とりあえずABCのA問題からひたすら解いていきます。現在はA問題だけですが、B問題やC問題も解き次第、ゆるっと随時更新かけていこうと思います〜
ほぼ自分用メモではありますが、一応初心者向けということにしているので、解説等ほしい場合はコメントお願いいたします。

(追記(2020/3/1): B問題も解き始めました。解答次第順次まとめていきます。)

解答録

A問題

とりあえずABC140-AからABC156-Aまで解答(AC)済みです。各解答に要した時間は平均40sから90sほど(体感)。ABC151-Aだけ解法探すのに1~2分使ったかも。

AtCoder過去問集はこちら

ABC140-A
print(int(input())**3)
ABC141-A
s=str(input())i=0list=["Sunny","Cloudy","Rainy","Sunny"]foriteminlist:if(s==itemandi<3):print(list[i+1])i+=1
ABC142-A
n=int(input())i=1list=[]while(i<=n):if(i%2==1):list.append(i)i+=1print(len(list)/n)# # # # # # # 他の人のAC済み解答↓。こういうのに即座に気付きたいですねー
# N = int(input())
# if N % 2 == 0:
#     print(0.5)
# else:
#     print((N + 1) / 2 / N)
ABC143-A
a,b=map(int,input().split())n=a-b*2if(n<0):print("0")else:print(a-b*2)
ABC144-A
a,b=map(int,input().split())if(a>9orb>9):print("-1")else:print(a*b)
ABC145-A
print(int(input())**2)
ABC146-A
n=str(input())list=["SUN","MON","TUE","WED","THU","FRI","SAT"]x=7foriteminlist:if(n==item):print(x)x-=1
ABC147-A
a,b,c=map(int,input().split())if(a+b+c<22):print("win")else:print("bust")
ABC148-A
a=int(input())b=int(input())n=6-a-bprint(n)
ABC149-A
s,t=map(str,input().split())print(t+s)
ABC150-A
k,x=map(int,input().split())if(500*k<x):print("No")else:print("Yes")
ABC151-A
c=str(input())X=ord(c)+1print(chr(X))# # # # # # # # # 見辛いけど一行の方が綺麗。
# print(chr(ord(str(input())) + 1))
ABC152-A
n,m=map(int,input().split())if(m==n):print("Yes")else:print("No")
ABC153-A
h,a=map(int,input().split())i=0while(h>0):h-=ai+=1print(i)
ABC154-A
s,t=map(str,input().split())a,b=map(int,input().split())u=str(input())if(u==s):print((a-1),b)else:print(a,(b-1))
ABC155-A
a,b,c=map(int,input().split())if(a==b==cora!=b!=c!=a):print("No")else:print("Yes")
ABC156-A
n,r=map(int,input().split())if(n>=10):x=relse:x=100*(10-n)+rprint(x)

B問題

B問題からは直感で書いたコードでAC取った後に、他の解答者の答案見ながらより簡潔に、便利な記述がないか調べながら取り組んでいきます。コメントアウトの上でコード内に併記しておきます。

ABC154-B
s=str(input())print("x"*len(s))# # より簡潔に
# print('x'*len(input()))
ABC155-B
n=int(input())a=list(map(int,input().split()))num=0count=0foriteminli:if(item%2==0):num+=1if(item%3==0oritem%5==0):count+=1if(num==count):print("APPROVED")else:print("DENIED")# # こっちの方が綺麗
# n = int(input())
# a = list(map(int, input().split()))
# def ans():
#     for i in range(n):
#         if a[i] % 2 == 0 and (a[i] % 3 != 0 and a[i] % 5 != 0):
#             print('DENIED')
#             return
#     print('APPROVED')
# ans()
ABC156-B
a,b=map(int,input().split())defBase_10_to_n(X,n):if(int(X/n)):returnBase_10_to_n(int(X/n),n)+str(X%n)returnstr(X%n)a=Base_10_to_n(a,b)print(len(a))# (参考)http://iatlex.com/python/base_change
# # aの除算可能な回数を計測することでも桁数はわかるよ
# a, b = map(int, input().split())
# c = 0
# while a > 0:
#     a //= b
#     c += 1
# print(c)

感想

インタプリタ言語、お手軽で本当に楽!これまでは好き好んでC#でAtCoderに取り組んでいましたが、他の言語にも手出して見るものですね。A問題ひたすら処理していくと入出力の処理はかなり慣れるので、この調子でサクサクB問題も解いていこうと思いますー。

ついったフォローしてね。(・ω・。)
@NadjaHarold

Mac laravel環境構築時にエラーが出た話

$
0
0

目的

  • 環境構築のlaravelインストール時にでたとあるエラーの解決方法をまとめる

エラー概要

  • 下記の手順を参考に環境構築を進めていた。
  • laravelインストール時に下記のエラーが発生した。

    $composer global require laravel/installer
    Changed current directory to /Users/shun/.composer
    Using version ^3.0 for laravel/installer
    ./composer.json has been created
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - laravel/installer v3.0.1 requires ext-zip * ->the requested PHP extension zip is missing from your system.
        - laravel/installer v3.0.0 requires ext-zip * ->the requested PHP extension zip is missing from your system.
        - Installation request for laravel/installer ^3.0 ->satisfiable by laravel/installer[v3.0.0, v3.0.1].
    
    Installation failed, deleting ./composer.json.
    
  • エラー内容の和訳を下記に記載する。

    現在のディレクトリを/Users/shun/.composerに変更しました
    laravel / installerにバージョン^ 3.0を使用する
    ./composer.jsonが作成されました
    コンポーザリポジトリにパッケージ情報をロードする
    依存関係の更新(require-devを含む)
    要件をインストール可能なパッケージのセットに解決できませんでした。
    
       問題1
         -laravel / installer v3.0.1にはext-zipが必要です*->要求されたPHP拡張zipがシステムにありません。
         -laravel / installer v3.0.0にはext-zipが必要です*->要求されたPHP拡張zipがシステムにありません。
         -laravel / installer ^ 3.0のインストール要求-> laravel / installer [v3.0.0、v3.0.1]で満足できる。
    
    インストールが失敗し、。/ composer.jsonが削除されました。
    

原因

  • HomebrewでPHPがインストールできていないことがわかった。
  • エラー分から「ext-zip」と言うものが足りないことがわかった。

解決方法

  1. HomebrewでのPHPのインストール

    1. 下記コマンドを実行してPHP7.4をインストールする。

      • 下記コマンドでエラーが出た方はこちら
      $brew install php@7.4
      
    2. 再度問題のコマンドを実行する。

      $composer global require laravel/installer
      
    3. 問題なく実行できた。下記に参考のために$ composer global require laravel/installer実行時の出力を記載する。

      Changed current directory to /Users/shun/.composer
      Using version ^3.0 for laravel/installer
      ./composer.json has been created
      Loading composer repositories with package information
      Updating dependencies (including require-dev)
      Package operations: 14 installs, 0 updates, 0 removals
        - Installing symfony/process (v5.0.4): Downloading (100%)         
        - Installing symfony/polyfill-ctype (v1.14.0): Downloading (100%)         
        - Installing symfony/filesystem (v5.0.4): Downloading (100%)         
        - Installing psr/container (1.0.0): Downloading (100%)         
        - Installing symfony/service-contracts (v2.0.1): Downloading (100%)         
        - Installing symfony/polyfill-php73 (v1.14.0): Downloading (100%)         
        - Installing symfony/polyfill-mbstring (v1.14.0): Downloading (100%)         
        - Installing symfony/console (v5.0.4): Downloading (100%)         
        - Installing ralouphie/getallheaders (3.0.3): Downloading (100%)         
        - Installing psr/http-message (1.0.1): Downloading (100%)         
        - Installing guzzlehttp/psr7 (1.6.1): Downloading (100%)         
        - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)         
        - Installing guzzlehttp/guzzle (6.5.2): Downloading (100%)         
        - Installing laravel/installer (v3.0.1): Downloading (100%)         
      symfony/service-contracts suggests installing symfony/service-implementation
      symfony/console suggests installing symfony/event-dispatcher
      symfony/console suggests installing symfony/lock
      symfony/console suggests installing psr/log (For using the console logger)
      guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses)
      guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
      Writing lock file
      Generating autoload files
      

Kotlin入門:型変換

$
0
0

型変換

型同士が継承・実装の関係にある場合には、相互に型変換が可能です。
入力例:

openclassPerson(){}classMagickPerson():Person(){funsayHello(){println("Hello")}}funmain(){valmp:Person=MagickPerson()println(mpisPerson)println(mpisMagickPerson)if(mpisMagickPerson){mp.sayHello()}}

上記のコードが実行可能なのはMagickPersonPersonの派生クラスだからです。
派生クラスのインスタンスは基底クラスのインスタンスとして使用できます。

したがって、派生クラスから基底クラスへの型変換は暗黙的に実施できます。

しかし、基底クラスから派生クラスへの必ずしも可能ではありません。
派生クラスが独自のメンバーを追加している可能性があるからです。

①では型を判定しています。このブロックの配下②であれば
暗黙的にその型として振る舞うことができる点に注意です。

実行結果は以下の通りです。

truetrueHello

明示的なキャストをしたい場合

as演算子を使用します。
ただし、asによるキャストは失敗する可能性があります。

openclassPerson(){}classMagickPerson():Person(){}classStudent():Person(){}funmain(){valperson:Person=MagickPerson()valmp1:MagickPerson=personasMagickPersonvalstudent:Person=Student()valmp2:MagickPerson=studentasMagickPerson}

①でエラーが発生します。
変数studentPerson型ですが、実体はStudent型です。
したがって、MagickPerson型に変換することができません。

【2020年度版】Struts2の入門系記事まとめ

$
0
0

はじめに

業務系プロジェクトでは未だに現役で動いていることもあるStruts2さん。
2020年のこのご時世にまさか自分が触ることになろうとは…。

まったく触ったことがないのでHelloWorldをやってみた。
割と最近まとめてくれている優しい方がいたので触る分には困らなかった。
参考になった記事を紹介する。

自分のスペック

  • Java経験が4年くらい
  • Webシステム開発は1年くらい
    (SpringBootは分かる。新人の頃にSpringMVCも使っていたがよくわからない)
  • ぶっちゃけサーブレットとJSPはあんまり分からない

APIの開発はできるけど、テンプレートを使うやり方がよく分かってない。

環境情報

  • Windos10
  • Eclipse : 2019-12(Pleiades All in One)
  • XAMPP : XAMPP for Windows 7.3.11
  • Java : 1.8.0_221
  • Struts : 2.5.22(最新)

参考記事集

  • 【超初心者向け】Struts2超入門 - 2018年版 - Qiita
    これ見れば終わり。
    全部書いてくれている。2018年度版らしい。
    違っていたのはバージョンくらいかな?
    とりあえずこれ読んで触ってみれば、会社に行っても話が通じないレベルは脱せられそう。
    記事ではallを使っているが、自分が構築したときは最小構成(min)のStrutsで起動できた。

  • Apache Strutsプロジェクトへようこそ
    Strutsの公式ページ。
    ドキュメントやチュートリアルがある(チュートリアルやってないけど)。
    もちろんダウンロードもできる。

  • Struts2 を手動でwarファイルにしてデプロイするには - Qiita
    eclipseでは実行できるけど、他の環境へのデプロイは分からないプログラマにならないために。
    プロジェクト構成が違ったのか、記事のjarコマンドだけだとclassesがデプロイできなかった。
    ただ構成ツリーをサンプルで記載してくれているので合わせたらできた。

おわりに

SpringBootの方が簡単に作れるので、メインフレームワークとして使う気は今のところないがなんとなく触りは理解できた。
レガシーで情報がないことを覚悟していたが、概要をまとめてくれている記事があって本当に助かった。
なので自分も現在の最新状態で作れることを記事として残しておくことにした。
有用なリンクが他にあればぜひコメント等で教えていただけると幸いです。

Angularで使っているrxJsのOperatorを簡単にまとめてみた

$
0
0

現在使用しているrxJsのOperatorを簡潔にまとめていきます。

随時、加筆修正します。

現在、利用中のversionは以下です。

p.json
"@angular/core":"^8.2.9""rxjs":"^6.5.1"

forkJoin

概要

複数のObservableから値を受けとった後で処理を走らせたいときに使います。

詳細

  1. subscribeされる 
    OBSERVER -> FORK JOIN
  2. ObservableAとBから値が流れてくる
    A -> [0-a, 1-a, 2-a] -> FORK JOIN
    B -> [0-b, 1-b, 2-b] -> FORK JOIN
  3. AとBそれぞれがCompleteされて値がそろう
    FORKJOIN : [0-a, 1-a, 2-a], [0-b, 1-b, 2-b]
  4. そろった値がまとめてobserverに送られる
forkJoin.ts
forkJoin([this.requestService.getPersons(),this.requestService.getParams()]).subscribe(result=>{constpersonList:Array<Person>=result[0];constparams:AppParams=result[1];this.setUp(personList,params);})

上記のようなコードを描くとsubscribeされた後で this.requestService.getPersons()this.requestService.getParams()からforkJoinが値を受け取り続け、どちらもcompleteされて初めて setUpのメソッドが呼び出されます。

flatMap

概要

あるObservableのレスポンスをもとに別のObservableで値を取得したい時に使います。
ネストをせずに済むので可読性を向上できます。

詳細

flatMap.ts
this.queryParams.pipe(flatMap(param=>{this.serviceId=param.sid;this.appId=param.appId;returnforkJoin([this.getLayout(this.serviceId),this.getText(this.serviceId,this.appId)]);})).pipe(flatMap(res=>{this.layout=res[0];this.text=res[1];returnthis.appId?this.service.get(this.appId):null})).subscribe(val=>{...})

上記を日本語の手順で説明すると

  1. Paramが届いたら flatMap(param => {
  2. layoutとtextを取得する return forkJoin(this.getLayout(this.serviceId), this.getText(this.serviceId, this.appId));
  3. layoutとtextが取得できたら flatMap(res => {
  4. サービスで情報を取りに行くthis.appId ? this.service.get(this.appId) : null

となります。

ちなみにsubscribe()のなかでsubscribe()を呼ぶのはrxJsのアンチパターンなので絶対にしないようにしましょう。

There's no "harm", but this is considered an antipattern in rxjs. And if the three calls are independent this is unnecessarily slow.

Is it good way to call subscribe inside subscribe?より引用

補足

forkJoinのような生成系operatorと違って、flatMapのように流れてきたものに手を加えるoperatorは

hosoku.ts
observable.pipe(operator(引数)).subscribe(x=>...

このようにpipeの中にoperatorを入れて使用します。

備忘録:Cisco機器のIOSのバックアップ方法

$
0
0

Cisco機器のIOSをバックアップする(いわゆる吸い出し)

概要

IOSが壊れてしまったときや、GNS3でのエミュレートに使用するためIOSのバックアップをとっておこうと思いました。(壊れることあるのか・・・?と思うけど、噂では"あるらしい")
まだまだ初心者なので一つ一つ備忘録として残していきます。誰かの役にも立てると良いな。

今回の使用機材

  • PC・・・私の場合はWindows環境です。IPアドレスは"192.168.1.50"にしております。
  • TFTPサーバーソフトウェア・・・使いやすいものを選んでください。使える状態にしておきます。今回はSolarWinds TFTP Serverを使わせていただきました。
  • Cisco Catalyst 3750X-48T-L・・・どこの誤家庭にもあるCisco製品の一つ。長いのでスイッチと呼びます。
  • RTX1200・・・割とどこの誤家庭にもあるYAMAHAルーター。なくても良いですが、私はDHCP配布で楽をするためにいつも使っているLAN環境下で行いました。
  • LANケーブル(Copper,UTP,CAT.5e~)・・・PCとルーター、ルーターとスイッチを繋ぐために使用します。

やり方

調べると"適当にTFTPサーバー立ててコピーすればいいよ"と書いてあって、試してみたら"本当にそのとおりだった"
スイッチのFlashからTFTP先にIOSをコピーするイメージです。

PCでTFTPサーバーを起動します。(ファイアウォールなど気をつける)
image.png

ロールオーバーケーブルを接続しCisco機器を起動して、CLIにアクセスする。
image.png

Configを削除したため、"Would you like to enter the initial configuration dialog? [yes/no]:"と訊かれるが、"no"とする。
image.png
ユーザーモードから特権モードに変更し、グローバルコンフィギュレーションモードに変更

Would you like to enter the initial configuration dialog? [yes/no]:no
Switch>ena
Switch#conf t

まっさらな状態なので、インターフェースコンフィギュレーションモードに入り、デフォルトVLAN(VLAN1)にIPアドレスを入力します。ここでは簡単にするために既にあるルーターからDHCPにてIPアドレス情報を取得します。また、インターフェースを有効化し、グローバルコンフィギュレーションモードに戻ります。このデフォルトVLANに設定したIPアドレスで通信を行います。

Switch(config)#int vlan1
Switch(config-if)#ip add
Switch(config-if)#ip address dhcp
Switch(config-if)#no shutdown
Switch(config-if)#end
Switch#

ルーターから伸ばしたLANケーブルを繋ぎます。

*Mar  1 00:17:27.569: %LINK-3-UPDOWN: Interface GigabitEthernet1/0/48, changed state to up
*Mar  1 00:17:28.575: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet1/0/48, changed state to up
*Mar  1 00:17:55.604: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to up
*Mar  1 00:18:03.791: %DHCP-6-ADDRESS_ASSIGN: Interface Vlan1 assigned DHCP address 192.168.1.15, mask 255.255.255.0, hostname

物理インターフェースも理論インターフェースも無事UPしたログが表示されました。DHCPで"192.168.1.15"を取得したようです。
念の為show interface vlan1をします。

Switch#show interfaces vlan 1
Vlan1 is up, line protocol is up
  Hardware is EtherSVI, address is 6073.5c6f.e3c0 (bia 6073.5c6f.e3c0)
  Internet address is 192.168.1.15/24
  MTU 1500 bytes, BW 1000000 Kbit/sec, DLY 10 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive not supported
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input 00:00:00, output 00:00:01, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     201 packets input, 14644 bytes, 0 no buffer
     Received 0 broadcasts (0 IP multicasts)
     0 runts, 0 giants, 0 throttles
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     43 packets output, 3571 bytes, 0 underruns
     0 output errors, 2 interface resets
     0 unknown protocol drops
     0 output buffer failures, 0 output buffers swapped out
Switch#

問題ないようです。
続いて、IOSのコピーをします。
copyコマンドでflashにあるIOSをtftpにコピーします。
コマンドが長いので実際には"Switch#$versalk9-mz.150-1.SE3/c3750e-universalk9-mz.150-1.SE3.bin tftp:"と省略されます。
Address or name of remote host []?と訊かれたらPCのIPアドレス"192.168.1.50"を入力します。
Destination filename [c3750e-universalk9-mz.150-1.SE3.bin]?と訊かれるのですが、特にファイル名を変える必要がなければそのままEnterを押します。

Switch#copy flash:c3750e-universalk9-mz.150-1.SE3/c3750e-universalk9-mz.150-1.SE3.bin tftp:
Address or name of remote host []? 192.168.1.50
Destination filename [c3750e-universalk9-mz.150-1.SE3.bin]?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
18591722 bytes copied in 72.133 secs (257742 bytes/sec)
Switch#

TFTPサーバー側でも開始と完了のログが残っており、実際のディレクトリにも保存されていました。
image.png
これでバックアップは完了です。おつかれさまでした。

ルーター無しで直接スイッチとPCを繋げる場合は、それぞれ通信できるようIPアドレスの設定が必要です。
例えばVLAN1に対して192.168.1.12を割り当てる場合、

Switch(config-if)#ip address DHCP

としていたところを

Switch(config-if)#ip address 192.168.1.12 255.255.255.0

と入力します。

(理解不足)IOSについて

今回吸い出したIOSは"c3750e-universalk9-mz.150-1.SE3.bin"
調べてみると、バージョンは15.0(1)SE3です。
命名規則から、トレイン=15.0SE、スロットル15.0(1)SE、リビルド=3となるようです。
IOS名からリリースノートを確認すると、
image.png
らしいです。
Release Notes for Catalyst 3750-X, 3750-E, 3560-X, and 3560-E Switches, Cisco IOS Release 15.0(1)SE and Later

要するに"暗号化使えて割と何でもそつなくできるIOSですよ"ってことなのかな・・・。
もうちょっと勉強しよ・・・。


GitHubにて初回git addができない現象

$
0
0

はじめに

ローカルリポジトリからリモートリポジトリへ初回pushしようとした際に起きたエラーについて備忘録として書きとめようと思います。

現象

ローカルリポジトリにて、
git init後にgit addを実行すると以下のエラー文が表示されました。

$ git add *
fatal: Unable to create '/vagrant/xxxxxx/.git/index.lock': File exists.

index.lockファイルが存在しているからエラーが出ているようです。
git statusで一応addできているか確認しましたが、addできておりません。

原因

やはりindex.lockファイルがあるからみたいでした。

git/index.lockとは
同じgitのリポジトリ内で同時に複数の処理を行わないための排他制御を行うもの。
つまり,index.lockが存在するということは,裏で他のgit操作が行われている。

今回git addを実行中に画面がフリーズしたので強制再起動した経緯があり、その後から急にaddができなくなりました。
それが複数処理と見なされたという事みたいです。

対処法

index.lockファイルを削除する。
削除しても問題無いようでしたので削除することにしました!!

$ rm .git/index.lock

無事git add成功しましたー:angel:

製薬企業研究者がPHPの基本的な文法についてざっくりまとめてみた

$
0
0

はじめに

ここでは、PHPの基本的な文法をざっくりとまとめてみます。

基本的な記述方法

PHPは.phpという拡張子のファイルに記述します。
HTMLのソースコードの中で<?phpから始まる部分がPHPのコード部分になります。
PHPでは文末にセミコロン;が必要になります。
コメントを書くときは、//を使います。
また、複数行に渡るコメントは/* */を使って書くことができます。
オブジェクトの値を出力するときは、echoを使います。

変数とデータ型

変数は、$変数名 = 値;として宣言します。

variable.php
<?php$str='文字列';// 文字列echo$str;$num=123;// 数値echo$num;$isBoolean=true;// 真偽値echo$isBoolean;$arr=array('Python','R','JavaScript','PHP');// 配列echo$arr;$dict=array('Python'=>'AI','R'=>'statistics','JavaScript'=>'web','PHP'=>'WordPress');// 連想配列echo$dict;?>

制御文

条件分岐

if文

if文は、if (条件) {処理}と記述します。
さらに場合分けするときは、elseelse ifを使います。

if.php
<?phpnum=3;if($num==1){echo'1';}elseif($num==2){echo'2';}elseif($num==3){echo'3';}else{echo'1でも2でも3でもない';}?>

switch文

if文で場合分けが多くなる場合は、switch文を使うと簡単に書けます。
switch文は、switch (変数) {case 値: 処理; ・・・}と記述します。

switch.php
<?php$num=3;switch($num){case1:echo'1';break;case2:echo'2';break;case3:echo'3';break;default:echo'1でも2でも3でもない';break;}?>

なお、breakを書かないと、条件に合った場合でも後続のcaseの処理が走ってしまうので注意が必要です。

反復処理

for文

一定回数だけ繰り返し処理を実行する(繰り返し回数があらかじめ分かっている)ときは、for文を用います。
for文は、for ($変数名 = 初期値; $変数 <= 最大値; $変数の値の更新)と記述します。

for.php
<?phpfor($i=1;$i<=5;$i++){echo$i;}?>

ここで、$i++となっているのは、$i = $i + 1すなわち反復処理を繰り返すごとに変数$iを1ずつ大きくしていくことを示しています。これは、$i += 1とも書けますが、変数の値を1ずつ更新していく場合は、この書き方はあまりせず、$i++または$i--と書きます。変数の更新幅が1以外の場合は、$i += 2のように書きます。

また、foreach ($配列 as $変数名) {処理}とすると、配列の要素を一つずつ取り出すことができます。

foreach.php
<?php$arr=array('Python','R','JavaScript','PHP');foreach($arras$lang){echo$lang;}?>

while文

ある条件を満たす間だけ処理を繰り返す場合は、while文を用います。
while文は、while (条件) {処理}と記述します。

while.php
<?php$i=1;while($i<5){echo$i;$i++;// 変数の値の更新}?>

関数

関数は、function 関数名(引数){処理}とすることで作成できます。

function.php
<?phpfunctioncopyNumber($num){return$num;}echocopyNumber(123);?>

クラス

クラスは、class クラス名 {プロパティ、メソッドなどの内容}とすることで作成できます。
newを使うことで、新しいインスタンスを生成できます。

class.php
<?phpclassHuman{public$name;public$age;publicfunctionintroduceMyself(){return'I am '+$this->name+' and '+$this->age+' years old. ';}}$yukiya=newHuman();$yukiya->name='Yukiya';$yukiya->age=31;echo$yukiya->name;echo$yukiya->age;echo$yukiya->introduceMyself();?>

まとめ

ここでは、PHPの基本的な文法について解説しました。
ウェブページのソースコードを見るときに役立ちます。

お絵かきで Python を学ぶ(タートルグラフィックス)

$
0
0

タートルグラフィックスとは

教育用プログラミング言語の「LOGO」を元に画面上の亀をプログラミングで操作して図として描画するといったものです。
1960 年代に開発され、プログラムの結果を視覚ですぐに確認できることから、子供向けのプログラミング学習に用いられることもあります。

環境

  • PyCharm
  • Python3

タートルグラフィックスに触れる(対話型シェル)

まずは対話型シェルを用いて簡単にタートルグラフィックスに触れてみようと思います。

PyCharm のターミナル画面を開いて、Pythonと入力します。

$ Python

これで対話型シェルになったので、turtleを import します。

>>> import turtle

つぎにturtle.forward(100)と入力します。

>>> turtle.forward(100)

すると以下のようにグラフィックが立ち上がります。

image.png

これは矢印が前に 100 回進んだということを表しています。

矢印の向きを下に向けたい場合にはturtle.right(90)として 右に 90 度曲げます。

>>> turtle.right(90)

image.png

この状態で再度turtle.forward(100)入力すると下に進みます。

>>> turtle.forward(100)

image.png

先頭の矢印の形が味気ないと感じる場合にはshape.()で変更できます。
今回は亀に変更させてみたいと思います。

>>> turtle.shape('turtle')

image.png

color()でこの亀の色を変更させることも可能です。

>>> turtle.color('red')

image.png

この亀を隠したい場合にはhideturtle()を使用します。

>>> turtle.hideturtle()

image.png

隠した亀を再び表示させたい場合にはshowturtle()と入力します。

>>> turtle.showturtle()

image.png

直線以外にも円を描くこともできます。

>>> turtle.circle(100)

image.png

今、赤い線で描かれていますがこの線の色を変更させたい場合には
pencolor()を使用します。

同時に角度を少し変更させて進ませてみます。

>>> turtle.pencolor('blue')
>>> turtle.right(45)
>>> turtle.forward(100)

image.png

後ろに進むことも可能であり、backward()を使用します。

>>> turtle.backward(200)

image.png

一番最初の位置に戻りたい場合にはhome()を使用します。

>>> turtle.home()

image.png

すべてクリアにしたい場合にはclear()を使用します。

>>> turtle.clear()

image.png

終了させるときには最後にdone()と入力します。

>>> turtle.done()

ファイルを作成して実行させる

上記ではターミナルから対話型シェルで実行させたが、ここからは
適当な名前の Python ファイルを作成してファイルから実行させてみます。

ファイル上に以下の前進させるだけの簡単な処理を記述して実行させてみます。

importturtleturtle.forward(100)

すると一瞬だけ表示されてすぐに消えてしまうことが確認できると思います。
ずっと表示するには最後の行にすべての処理が完了しましたと表す、done()
記述してあげます。

importturtleturtle.forward(100)turtle.done()

image.png

これでしっかりと表示されることが確認できると思います。

四角形

Python の for ループ使用して四角形を出力させてみます。
考え方としてはturtle.forward(100)の前進を 4 回繰り返し、
一度前進が完了したら 90 度に曲がる処理を加えるといったものである。

importturtleturtle.color('red','yellow')turtle.begin_fill()for_inrange(4):turtle.forward(100)turtle.right(90)turtle.end_fill()turtle.done()

ファイル形式では処理の内容をturtle.begin_fill()turtle.end_fill()
括ってあげます。

実行してあげると線が赤で中が黄色の四角形が表示されます。

image.png

星形

星形のプログラムですが、四角形のプログラムと構成がほとんど一緒になります。
変更箇所としては前進する回数が 5 回になるのと角度が360 / 5 * 2になります。

importturtleturtle.color('red','yellow')turtle.begin_fill()for_inrange(5):turtle.forward(100)turtle.right(360/5*2)turtle.end_fill()turtle.done()

image.png

星を三回作成させ、一度進むたびに前進する距離を少しずつ増やしてみる。

importturtleturtle.color('red','yellow')turtle.begin_fill()foriinrange(5*3):turtle.forward(100+i*10)turtle.right(360/5*2)turtle.end_fill()turtle.done()

すると以下のように綺麗な図形ができる。
このようにループの処理を色々としてあげると違った形になり楽しむことができる。

image.png

三角形

三角形も同様に三回前進して、一度前進したあとに角度を変えるといった処理になります。

importturtleturtle.color('red','yellow')turtle.begin_fill()foriinrange(3):turtle.forward(100)turtle.left(360/3)turtle.end_fill()turtle.done()

実行してみると三角形が表示されます。

image.png

星形でも行ったように一度前進したあとの角度を少しずらしてあげるとどうなるか見てみます。

importturtleturtle.begin_fill()foriinrange(200):turtle.forward(200)turtle.left(360/3+10)turtle.end_fill()turtle.done()

このように星型の時と同様に綺麗な図形になります。

image.png

おわり

ざっくりでしたが以上が扱い方の説明になります。

このタートルグラフィックスを使用することで自分のプログラミングが
簡単に可視化できるため子供はもちろん大人も楽しんでプログラミングを学習することができると思います。

最後に以下のような木を作成することも可能です。

importturtleastfoo=t.Turtle()foo.left(90)foo.speed(10)defdraw(l):if(l<10):returnelse:foo.forward(l)foo.left(30)draw(3*l/4)foo.right(60)draw(3*l/4)foo.left(30)foo.backward(l)draw(100)

image.png

chartkickに計算したデータを渡す

$
0
0

chartkickに計算したデータを渡す

参考にした記事
https://qiita.com/withelmo/items/1eb02f784eea414fc723
グラフを作ってくれるgem chartkickに同じハッシュ形式のデータ同士を計算して渡したかった。
ハッシュに対してmergeを使うことで解決しました。

こんな感じのデータと

@group_month_income_sum=current_user.accounts.where(income_check: true).group_by_month(:date).sum(:income)@group_month_income_sum=>{Wed,01Jan2020=>2917931,Sat,01Feb2020=>996911,Sun,01Mar2020=>1078732,Wed,01Apr2020=>891573,Fri,01May2020=>345790,Mon,01Jun2020=>979213,Wed,01Jul2020=>62281,Sat,01Aug2020=>1660182,Tue,01Sep2020=>155942,Thu,01Oct2020=>64652,Sun,01Nov2020=>926668,Tue,01Dec2020=>895074}

こんな感じのデータ(keyは同じだけどvalueの中の数字が違う)を計算してchartkickに渡したかった。

@group_month_spend_sum=current_user.accounts.where(spend_check: true).group_by_month(:date).sum(:spend)@group_month_spend_sum=>{Wed,01Jan2020=>323982,Sat,01Feb2020=>685464,Sun,01Mar2020=>47592,Wed,01Apr2020=>1693776,Fri,01May2020=>465287,Mon,01Jun2020=>1445360,Wed,01Jul2020=>1288774,Sat,01Aug2020=>1804126,Tue,01Sep2020=>1200592,Thu,01Oct2020=>1660155,Sun,01Nov2020=>727937,Tue,01Dec2020=>287939}

mergeメソッドをつかって解決しました。

@group_month_total=@group_month_income_sum.merge(@group_month_spend_sum){|k,v1,v2|v1-v2}@group_month_total=>{Wed,01Jan2020=>2593949,Sat,01Feb2020=>311447,Sun,01Mar2020=>1031140,Wed,01Apr2020=>-802203,Fri,01May2020=>-119497,Mon,01Jun2020=>-466147,Wed,01Jul2020=>-1226493,Sat,01Aug2020=>-143944,Tue,01Sep2020=>-1044650,Thu,01Oct2020=>-1595503,Sun,01Nov2020=>198731,Tue,01Dec2020=>607135}

chartkickのコード

<%=line_chart[{name: "収入",data: @group_month_income_sum,curve: false},{name: "支出",data: @group_month_spend_sum,curve: false},{name: "収支",data: @group_month_total,curve: false}],colors: ["blue","red","green"],thousands: ",",messages: {empty: "データが登録されていません"}%>

実際のグラフ

グラフ.png

にじさんじで学ぶPythonプログラミング入門【カルロスピノ氏リスペクト】

$
0
0

こんにちは。タケシです。
インフラエンジニアとして働きながら、スキルの幅を広げるためにプログラミングを学んでいます。

Progateなどの教材で学習するだけでは興味がそそられず、いかにもお勉強って感じでやる気が出なかったのですが、初学者でも楽しく無料でプログラミングが学べそうな動画を先日見つけました。

IMAGE ALT TEXT HERE
ホロライブで学ぶPython入門~15分でYoutubeの情報取得までやる編~

この動画では投稿主のカルロスピノ氏が、プログラミング初心者向けにPythonでYoutubeの動画情報取得をする方法を解説しています。

ブラウザ(Chrome)でPythonのコードを実行するので面倒な環境構築も不要ですし、お金もかかりません。

この記事ではカルロスピノ氏の動画を見た視聴者(私)が、動画内で紹介されている内容を実行した結果を交えつつPythonを使ってできることを紹介していきます。

この記事はこのような人向けに書いています。
・プログラミングをこれから学びたい初心者
・Pythonを学びたいけど既存の教材はとっつきにくい人
・Pythonを学びたいけどスクールに通うお金がない人
・Youtubeで情報収集するアプリを開発したい人

この記事を読むとできるようになること
・Pythonのコードを無料で実行できる環境が用意できる
・Pythonの簡単なプログラミングができるようになる
・推しのYoutuber/VTuberの情報収集ができるようになる

ブラウザ(Chrome)でPythonプログラムを実行するための環境構築

詳しい手順はカルロスピノ氏の動画内で解説されていますが、補足も兼ねてこの記事でも手順を紹介していきます。

Google Colaboratoryにアクセスする

Googleがクラウド上でPythonのプログラムを実行できる環境を無料で提供しています。
それがGoogle Colaboratoryです。以下のURLからアクセスしましょう。

https://colab.research.google.com/notebooks/welcome.ipynb

Python_環境構築_1.PNG

Google Colaboratoryにアクセスするとこのような画面が表示されるので左上の「ファイル」タブをクリックします。

Python_環境構築_2.PNG.png

「ノートブックを新規作成」をクリックしましょう。

※カルロスピノ氏の動画では、ノートブックの新規作成をする項目が「Python3の新しいノートブック」「Python2の新しいノートブック」になっていましたが、私がGoogle Colaboratoryにアクセスしたときには項目が「ノートブックを新規作成」に変わっていました。

Python_環境構築_3.PNG

ノートブックが新規作成されると、コードが実行できる箱(セル)が表示されます。
箱(セル)内にコードを書いたのち、左端の●ボタンをクリックすると実行されます。

※セルは「+コード」タブをクリックすると追加可能。

必要な外部ライブラリの用意

カルロスピノ氏の当該動画内では、Youtubeの動画情報収集を手軽に行えるRDFを使用しています。

そのRDFで動画情報を取得する上でfeedparserという外部ライブラリを使用しているので、そのインストールとインポートを事前に行っておきましょう。

feedparserのインストール

新しいセルでpip install feedparserと入力し、実行するとGoogle Colaboratoryの環境にfeedparserがインストールされます。

Collecting feedparser
  Downloading https://files.pythonhosted.org/packages/91/d8/7d37fec71ff7c9dbcdd80d2b48bcdd86d6af502156fc93846fb0102cb2c4/feedparser-5.2.1.tar.bz2 (192kB)
     |████████████████████████████████| 194kB 2.8MB/s 
Building wheels for collected packages: feedparser
  Building wheel for feedparser (setup.py) ... done
  Created wheel for feedparser: filename=feedparser-5.2.1-cp36-none-any.whl size=44940 sha256=e16ce8a47aa3d1c3dd0fe4b042ecf27cdc731a2f20e05d2885cd6de37f4a268f
  Stored in directory: /root/.cache/pip/wheels/8c/69/b7/f52763c41c5471df57703a0ef718a32a5e81ee35dcf6d4f97f
Successfully built feedparser
Installing collected packages: feedparser
Successfully installed feedparser-5.2.1

このような実行結果が表示されていれば成功です。

feedparserのインポート

続いて新しいセルでimport feedparserと入力し実行しましょう。

何も表示されなければ成功です。

Python_環境構築_6.PNG

これで任意のYoutubeチャンネルで公開されている動画の情報が収集できます。

RDFで収集できる情報

RDFで収集できる情報の一覧は、以下のコードを実行することで確認することができます。

チャンネルIDの部分は任意のYoutuber/VTuberのチャンネルIDに置き換えてください。

rdf_url = "https://www.youtube.com/feeds/videos.xml?channel_id=チャンネルID"
document = feedparser.parse(rdf_url)
for entry in document.entries:
  print(entry)

ちなみに、RDFによって私がいくつかのYoutubeチャンネルで情報収集した結果、以下のことがわかりました。

  • 情報収集できるのは最新の動画15件分程度
  • 公開後に非公開とした動画の情報は収集不可
  • 動画の評価、コメント、スパチャの金額、同時接続数等は収集できない

Youtube RDFでにじさんじライバーの動画情報収集をしてみよう

カルロスピノ氏がほぼ日刊ホロライブというチャンネルでホロライブの切り抜き動画をUPされていますので、私はにじさんじライバーの動画情報を収集してみます。

Pythonで書いたプログラムによる基本的な情報収集方法は、カルロスピノ氏が動画内で解説されているので、ここではカルロスピノ氏のプログラムにアレンジを加えるやり方を紹介しましょう。

各ライバーのArk配信のタイトル・再生数を収集

にじさんじライバーの配信(アーカイブ)の中でも、任意のゲームタイトルの実況のみを表示する方法を紹介します。

ここでは例としてArkというゲームの実況をしていた配信(アーカイブ)のタイトル・再生数を表示してみます。

rdf_url = "https://www.youtube.com/feeds/videos.xml?channel_id=チャンネルID"
document = feedparser.parse(rdf_url)
for entry in document.entries:
  if "ARK" in entry["title"] or "Ark" in entry["title"] or "アーク" in entry["title"]:
    print(entry["title"]+" 再生数:"+entry["media_statistics"]["views"])
print(entry["author"])

上記のコード内のチャンネルIDの部分を、任意のライバーのチャンネルIDに変更してください。

チャンネルIDは、各ライバーのチャンネルにアクセスしたときに表示されるURLの末尾になります。

なお、ゲームタイトルは各ライバーによって表記ゆれがある(ARK,Ark,アークなど)ので、orで表記ゆれに対応しています。

本間ひまわり氏のチャンネルURL
https://www.youtube.com/channel/UC0g1AE0DOjBYnLhkgoRWN1w

一例ですが、本間ひまわり氏のチャンネルIDはUC0g1AE0DOjBYnLhkgoRWN1wになります。

#8【ARK】🐻捕獲よ~ん🐻【本間ひまわり/にじさんじ】 再生数:82420
#7【ARK】🐓おそらのおうさまテイムする🐓【本間ひまわり/叶/にじさんじ】 再生数:111207
#6【ARK】海中生物捕獲大作戦~モサほし~【本間ひまわり】 再生数:100238
#5【ARK】どうくつたんけん!!!【本間ひまわり】 再生数:111546
#4【ARK】筋肉痛バキバキザウルス【本間ひまわり】 再生数:156699
#3【ARK】38万人おめでとう!38の何かしちゃうよ~ん^^【本間ひまわり】 再生数:185975
本間ひまわり - Himawari Honma -

このようにARKの配信(アーカイブ)のタイトル・再生数が表示できます。

夜王国のスプラ配信のタイトル・再生数を収集

先ほどのコードではライバー1人1人の配信(アーカイブ)情報しか収集できません。

そこで、ライバーのユニット単位で特定の配信に関する情報収集をしたいときのコードを紹介します。

例として、夜王国それぞれのスプラトゥーン配信のタイトル・再生数を収集してみましょう。

night_kingdom = ["UC6wvdADTJ88OfIbJYIpAaDA", "UCuvk5PilcvDECU7dDZhQiEw", "UC1QgXt46-GEvtNjEC1paHnw"]
for channel_id in night_kingdom:
  rdf_url = "https://www.youtube.com/feeds/videos.xml?channel_id=" + channel_id
  document = feedparser.parse(rdf_url)
  for entry in document.entries:
    if "スプラ" in entry["title"]:
      print(entry["title"]+" 再生数:"+entry["media_statistics"]["views"])
  print(entry["author"]+"\n")

night_kingdomという配列に要素として不破氏、白雪氏、グウェル氏のチャンネルIDが入っています。

【スプラトゥーン2】ありがとうございました【にじさんじ】 再生数:64893
【#にじさんじスプラ杯】スプラが大好きです。今度は嘘じゃないっす【にじさんじ】 再生数:101978
【スプラトゥーン2】最後の練習...見てるか谷沢...【にじさんじ】 再生数:56815
【スプラトゥーン2】イカ杯メンツで前夜祭だあああああああああ【にじさんじ】 再生数:49194
【スプラトゥーン2】何故だが涙がこぼれる...今日は最後の練習だ【にじさんじ】 再生数:117751
【スプラトゥーン2】深夜1時!?いいから練習だぁ!!!!!!【にじさんじ】 再生数:56281
【スプラトゥーン2】夜王国で戦争!?いいから脳死だぁ!!!!!!【にじさんじ】 再生数:52810
【スプラトゥーン2】大会までもう時間ないってマジ??【にじさんじ】 再生数:64277
【スプラトゥーン2】俺の回線なんか重いよ【にじさんじ】 再生数:54743
【スプラトゥーン2】プラべでイカ杯の全ステ全ルールで遊ぶぞ!!【にじさんじ】 再生数:52664
【スプラトゥーン2】エスコート??俺が姫になるんだよ!!!!!【にじさんじ】 再生数:71476
【スプラトゥーン2】後輩ちゃんと地獄のリグマが始まります【にじさんじ】 再生数:64756
【スプラトゥーン2】ぜっっっっったいに脳死しないガチマッチ【にじさんじ】 再生数:55901
不破 湊 / Fuwa Minato【にじさんじ】

【#にじさんじスプラ杯】大会本番!!意外に強いらCチーム【白雪 巴/にじさんじ】 再生数:22140
【スプラトゥーン2】試合目前!!白雪ボム強化意識【白雪 巴/にじさんじ】 再生数:12360
【スプラトゥーン2】意外に強いらしいチームCの本番前日練習【白雪 巴/にじさんじ】 再生数:9868
【スプラトゥーン2】夜王国で銃撃訓練【白雪 巴/にじさんじ】 再生数:13229
【スプラトゥーン2】深夜の͡͡コソ練。ランク20いくまで耐久【白雪 巴/にじさんじ】 再生数:21462
【スプラトゥーン2】お姉さんとイカプレイしない?【白雪 巴/にじさんじ】 再生数:13949
白雪 巴/Shirayuki Tomoe【にじさんじ】

【Splatoon2】  #にじさんじスプラ杯 本戦【黛灰/夜見れな/フミ/グウェル・オス・ガール】 再生数:14572
【Splatoon2】ガチ練習試合 GチームとIチーム  #にじさんじスプラ杯【黛灰/夜見れな/フミ/グウェル・オス・ガール/イブラヒム/フレン・E・ルスタリオ/鷹宮リオン/天宮こころ】 再生数:17937
【Splatoon 2】夜王国スプラ【不破湊/白雪巴/グウェル・オス・ガール/にじさんじ】 再生数:16813
【Splatoon 2】#にじさんじスプラ杯 Gチーム練習会【フミ/黛灰/夜見れな/グウェル・オス・ガール/にじさんじ】 再生数:71870
グウェル・オス・ガール / Gwelu Os Gar 【にじさんじ】

コードを実行した結果、夜王国のチャンネルでそれぞれ行われたスプラトゥーン配信のタイトル・再生数が収集できました。

グウェル氏のアーカイブのサムネイルを収集しダウンロード

カルロスピノ氏の動画内では、アーカイブのサムネイルを一括保存する方法が紹介されています。

そこで解説されているコードに対するコメントで

for文でインデックスを取りたいならenumerate関数を使うといいですよ。

とありましたので、enumerate関数を使った一括保存のコードを書いてみました。

※下記コードを実行する前にimport requestsを実行する必要があります。

for index, entry in enumerate(document.entries):
  url = entry["media_thumbnail"][0]["url"]
  response = requests.get(url)
  image = response.content

  file_name = "Gwelu"+str(index)+".jpg"

  with open(file_name, "wb") as image_file:
    image_file.write(image)

Python_検索結果_グウェルサムネ_DL.PNG

グウェル氏の直近のアーカイブ15件分のサムネイルをクラウド上に保存できました。

Pythonでできるようになること

Google Colaboratory + RDFでは出来ることも限られていますが、Pythonでのプログラミングによってカルロス氏作成のopipi.netで公開されているグラフやTwitter Botの作成ができるようになるとのこと。

今後、Youtube APIの使い方講座なども動画として投稿されるそうなので、気になった方はチャンネル登録しておくといいでしょう。

Viewing all 21155 articles
Browse latest View live