ProfileGridプラグインの有効化

◼️ProfileGridプラグインインストール後、プラグインを有効化すると、以下に列挙した固定ページが作成されます。Wordpressの固定ページで確認できますよ。

これら固定ページにはショートコードが記載されていて、タイトルに合致した画面が表示されるようになります。これらをWordPress のメニューに割り当てて、ユーザーが使えるようにします。

◆作成される固定ページ
・login:ログイン画面の表示
・Register:会員(WordPressユーザー)のアカウント情報表示
・Profile:会員(WordPressユーザー)のプロファイル情報表示
・forget password :パスワードリセット要求画面


私は使用しませんが、以下のようなページもあります。
・All Group:すべてのグループ表示
・Default User Group:ユーザーが所属するグループの表示
・Search :ユーザー検索画面等々。

ProfileGridプラグインの簡単な説明

◼️ProfileGrid は、メンバーシップ(=会員制)サイトを構築するためのWordPressプラグインです。
メンバー間のメッセージ通信、メンバーによるブログ投稿、グループ内メンバーへの連絡、メンバーアカウントやプロファイルのカスタマイズがグループごとに定義できます。
メンバーは複数のグループに所属することも可能です。グループ定義を無料会員向け、有料会員向けグループとしても定義できます。
支払いにはPayPalを導入できます。

私は、会員制サイトを作る上で、会員のプロファイルを自由に定義したいのでこのプラグインを検討してます。
無料で出来る範囲が他の有名プラグインより多い印象です。

ProfileGrid による会員制サイト構築の検討

会員制サイトを構築するために、まずはローカルLAN環境で、ProfileGrid – User Profiles, Groups and Communitiesプラグインをいじり倒して、プラグインで使われている単語や振る舞いを理解中です。このプラグインは無料で出来る事が、他のプラグインに比べて多い印象です。 
・グループにより、会員レベルが定義出来きます。(一般会員、ゴールド会員等)
・会員のプロファイル項目が簡単に追加・削除でき、項目の並び順も簡単に出来ます。(自由にカスタマイズ可能)
・拡張プラグイン(無料)でカレンダーから企画したイベントを会員に展開できるようです。(これから試します)
・PayPalが使えそうです。
現在、会員制サイト立ち上げのための設定をまとめ中です。後日展開できると良いです。

Git, GitHub, TortoiseGitのSSH接続設定

TortoiseGitからGitHub にSSH接続する設定を展開します。以下”SSH鍵”と記載していますが、「SSH接続するための暗号化鍵」の事です。Windows 7でも確認済みです。尚、ソフトウェア版数は、現在(2019/2/6)の最新版を使用します。

・Git for Windows 2.20.1
・TortoiseGit 2.7.0 +言語パッケージ

◆ 0.準備

GitHub アカウントは登録済みであること。
Git for Windows 、TortoiseGit は、インストール済みであること。

インストール方法は、別途記載します。

◆ 1.Git Bashのコンソールからssh-keygenコマンドでSSH 鍵を生成しますが、その前に gitコマンドでconfig設定しておきましょう。

$ git config –global user.name “YourName”
$ git config –global user.email YourEmail@hoge.com $ ssh-keygen -t rsa -b 4096

コマンドを実行すると、SSH鍵をcreateするファイル名やパスフレーズが問われます。何も入力せず[Enter]キーを押します。
パスフレーズは10文字以上入力すると強固な鍵が作成できるのですが、TortoiseGit での利用が思うように出来なかったりするので、私は利用面を優先します。しかし、セキュリティ面も大事ですので4096ビットで鍵生成します。因みにデフォルトは2048ビットです。
パスフレーズを入力すると、PuTTYgenでTortoiseGit に設定するid_rsa.ppkが作成出来ません。(id_rsaの秘密鍵の読み込みに失敗します)

・id_rsa:RSA秘密鍵
・id_rsa.pub:RSA公開鍵。GitHubにはこちらの公開鍵を設定します。

秘密鍵と公開鍵ができたので、GitHub で受け入れられるか確認しましょう。

◆ 2.PuTTYgen で先に生成したSSH鍵をid_rsa.ppkファイルに変換します。

id_rsa.ppkファイルはTortoiseGit に設定して、GitHub とSSH接続するための鍵ファイルです。

PuTTYgenを起動して、[File]-[Load private key]メニューでid_rsa秘密鍵ファイルを読み込みます。読み込みがSuccess なら、[Save private key]ボタンを押して、ファイル名 id_rsa.ppkで保存します。

PuTTYgen 画面に表示されているPublic keyテキスト内をコピーして、
GitHubの[settings] – [Personal setting] -[SSH and GPG keys]のSSH keysにペーストして、GitHubでも公開鍵が受け入れるかをチェックしましょう。

以上でTortoiseGit からGitHub にSSH 接続できます。

巷のサイトではソフトバージョンが古くて思うように行かなかったゼ。

STM32CubeMX

年末年始休暇を利用して、STM32F103C8でI2CデバイスのMCP23017をPB6,PB7(I2C1 SCL,SDA)に接続した回路をブレッドボードに実装してみた。
そして、STM32CubeMX(CubeF1)にて初期化部分のコードを生成したところバグがあることが分かった。
開発環境の各バージョンは次の通りである。
・STM32FCubeMX Ver5.0.0
・STM32CubeF1 Ver1.7.0
・IAR社 EWARM 7.50.3

STM32CubeMXで自動生成された下記コードでは、I2C SCLにクロックが出力されない事が分かった。

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hi2c->Instance==I2C1)
  {
  /* USER CODE BEGIN I2C1_MspInit 0 */

  /* USER CODE END I2C1_MspInit 0 */

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**I2C1 GPIO Configuration    
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */   ★★I2CペリフェラルへのクロックEnableは、
    __HAL_RCC_I2C1_CLK_ENABLE();    ★★HAL_GPIO_Init()より前に行わないとI2Cが正常に動作しない
  /* USER CODE BEGIN I2C1_MspInit 1 */

  /* USER CODE END I2C1_MspInit 1 */
  }

}

私は、GPIOBのクロックの直後に移動した。

__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_I2C1_CLK_ENABLE();

ちなみに、MCP23017のdevice addressは0x20であるが、I2C APIのパラメータに渡すときは、左にシフトして(0x40)渡すことが、API仕様に書いてあります。

#include "stm32f1xx.h"

/** i2cスレーブアドレス */
#define SLAVE_ADDR  0x40
/** i2cデバイスハンドル */
I2C_HandleTypeDef   MCP23017_handle;

void MCP23017_init(void)
{
    uint8_t rw_buff[2];

    /* Initialize for I2C */
    MCP23017_handle.Instance = I2C1;
    MCP23017_handle.Init.ClockSpeed = 100000;
    MCP23017_handle.Init.DutyCycle = I2C_DUTYCYCLE_2;
    MCP23017_handle.Init.OwnAddress1 = 0;
    MCP23017_handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    MCP23017_handle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    MCP23017_handle.Init.OwnAddress2 = 0;
    MCP23017_handle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    MCP23017_handle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if( HAL_I2C_Init( &MCP23017_handle ) != HAL_OK )
    {
        Error_Handler();
    }

    /** I2Cデバイスからの読み出し(デバッグ用) */
    rw_buff[0] = 0x05;
    if( HAL_I2C_Master_Receive( &MCP23017_handle, SLAVE_ADDR, rw_buff, 1, HAL_MAX_DELAY ) != HAL_OK ){
//  if( HAL_I2C_Master_Transmit( &MCP23017_handle, SLAVE_ADDR, rw_buff, 1, HAL_MAX_DELAY ) != HAL_OK ){
//  if( HAL_I2C_Master_Transmit_IT( &MCP23017_handle, SLAVE_ADDR, rw_buff, 1 ) != HAL_OK ){
        Error_Handler();
    }
}

STM32 内蔵Flashメモリ データ保存 Fault

STM32のようなワンチップマイコンの内蔵Flashメモリにデータを書き込む際は、注意する事があります。
Flashメモリは、一般的にpage, block, deviceという単位ブロックで表現されてます。
Flash消去(Erase), 書き込み(Program)の実行中は、同じblockの読み出し(Read)が出来ません。FAULTします。
出来ることなら消去と書き込み中は、割り込み禁止にするのが良いのですが、システム的にそうする事で他のタスクに影響が出るため、割り込み禁止しない場合、動作する可能性のプログラム(関数や割り込みハンドラ)にram_function属性を付けて、RAM動作するように配置する必要があります。
逆の表現すると、データ通信中に希にデータを取りこぼす事象の場合、割り込み禁止状態が影響している場合がよくあります。どちらも見つけにくいbugです。
設計フェーズで懸念していると見つけやすいですよ。

Android ビジネスカレンダー2 導入

Androidアプリのビジネスカレンダー2(Business Calendar 2)をインストールしてみた。
祝日設定が分かり辛かった事と仕事用カレンダー追加が分かり辛かったので操作手順をメモしておきます。
ビジネスカレンダーアプリインストール後に月表示(左画面)、祝祭日と仕事カレンダを追加した月表示(右画面)に成ります。

インストール直後 予定入力後

Googleカレンダは使ってないので、ノー・スケジュールですwww
STEP1:まず、左上のハンバーガ(メニュー)をタッチしてメニューを表示する。そして[設定]メニューではなく、[カレンダーとタスクリスト]をタッチします。※ここにあるのが分からなかった。

STEP2:[祝祭日を追加する]をタッチして、[日本]を選択する。
日本祝祭日がリストと右下に追加されます。これで月予定に表示されます。

ついでに右下に[仕事]用のカレンダーも追加してみよう。カレンダー追加するだけでは、表示されないんだよね。。。
これも予想外なのでメモしておきます。
STEP1:まずは、ローカルカレンダーを追加する。

STEP2:タスクも関連付けするために[タスクリスト]も追加する。

STEP3:最後に[グループ]を追加すると、[仕事]カレンダが追加される。

月カレンダに”Webネタ収集”を期間で[Job]予定を入力して、”Web公開”を[Jon]タスクリストで入力してみた。

練馬 ラーメン

(2018/12/12更新) 以前深夜の練馬ラーメンは、「ひむろ」でした。
最近は、新しい店が深夜帯でも営業しいて、嬉しい限りです。
ひむろは以前からお世話に成ってますが、最近は早朝、「黒田」でご馳走に成ってます。
しょぱみかが少なく好みです。替え玉ありの東京風にアレンジした九州とんこつラーメンとの事です。
場所は、千川通りの練馬駅交差点、銀行の右脇の道を入り右手に黒田のラーメン屋があります。

STM32F103C8T6 マイコン

STM32F103C8T6 が載った基板を購入したので、まずはST社からSTM32CubeF1をダウンロードして開発環境を整えてみます。
流用できるプロジェクトファイルは、STM32F103RB-Nucleoでイケます。main関数は基板固有コードばかりなので空関数にしますが、
使用するソースファイルやヘッダファイル、コンパイルオプションは、まずは同じでOKです。後から精査しましょう。

STM32CubeF1内のDrivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.hに使用するマイコン名を#defineするように記載されていますが、私はコンパイルオプション(-Dプリプロセッサ定義)でSTM32F103xBを指定します。(何故なら敢えてオリジナルファイルを変更しなくても対応可能な方法だから、ソースの変更管理しなくて済みます。
私の統合開発環境(IDE)は、IAR社のEWARMを使用しているから、iarフォルダ下にプロジェクトファイルがあります。このプロジェクトファイルをEWARMで開けば、必要なソースファイルが分かりますが、ココにも載せておきます。本サイトのSTM32F303K8でも取り上げています。

---STM32Cube_F1 フォルダ構成---
STM32Cube_FW_F1_V1.6.0
+Drivers
 +CMSIS
 |+Device
 ||+ST
 || +STM32F1xx
 ||  +Include   :includeパスにセットするフォルダ
 ||  +Source
 ||   +Templates   :以下(2)にコピーされている
 ||    +iar
 |+Include
 +STM32F1xx_HAL_Driver
  +Inc           :includeパスにセットするフォルダ
  +Src           :以下(1)参照
+Projects
 +STM32F103RB-Nucleo
  +Templates_LL
   +EWARM       :IAR用ファイルのフォルダ
   +Inc         :includeパスにセットするフォルダ
   +Src         :以下(3)参照
+Middlewares
 +Third_Party
  +FreeRTOS      :リアルタイムOS


---(1)Drivers\STM32F1xx_HAL_Driver\Src---
stm32f1xx_hal_XXXX.c  :HALドライバ
stm32f1xx_ll_XXXX.c   :LLドライバ

---(2)Projects\STM32F103RB-Nucleo\Templates_LL\EWARM---
startup_stm32f103xb.s  :ベクタテーブル、リセットハンドラ
stm32f103xb_flash.icf  :IARリンカの設定ファイル

---(3)Projects\STM32F103RB-Nucleo\Templates_LL\Src---
main.c
stm32f1xx_it.c     :割り込みハンドラ(無くても良い。各ハンドラはweakでstartup_stm32f103xb.sに定義済み)
system_stm32f1xx.c :boot初期処理

外部クロックHSE(8MHz)を用いて動作させるために必要なファイル一覧を以下に記載します。
ちなみにCMSISのLLドライバを使用しました。

---STM32Cube_F1 外部クロックで動作させるために必要なファイル一覧---
main.c
startup_stm32f103xb.s
system_stm32f1xx.c
(stm32_assert.h)
stm32f103x8.icf
stm32f1xx_ll_gpio.c
stm32f1xx_ll_rcc.c

STM32マイコンは、Power ONで内部クロックHSI(8MHz)により動作します。従って、ベクタテーブルのリセットハンドラさえあればmain()迄実行され、main(){while(1);}だけの空転関数でも動作します。
しかし、次のmain()ではFreeRTOSを盛り込み、外部クロックHSE(8MHz)を用いて動作するように設定した実装例も載せておきます。省電力のため動作クロックはSYSCLK 48MHz、HCLK 24MHzに落としてます。

---main.c---
#include "stm32f1xx_ll_rcc.h"
#include "stm32f1xx_ll_system.h"
#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_bus.h"
#include "FreeRTOS.h"	//FreeRTOS用
#include "task.h"	//FreeRTOS用

void SystemClock_Config(void);
void createOsResource(void);	//FreeRTOS用

/* テストピン(LED1)定義 */
#define LED1_GPIO		GPIOC
#define LED1_PIN		LL_GPIO_PIN_13

/**
 * @brief   Main program
 * @param   None
 * @retval  None
 */
int main(void)
{
	/* setup system clocks */
	SystemClock_Config();

	/* テストピン(LED1)をEnable */
	LL_APB2_GRP1_EnableClock( LL_APB2_GRP1_PERIPH_GPIOC );
#if 0	// LL_GPIO_Init()にBUGあり
	{
	LL_GPIO_InitTypeDef  pin_cfg;
		/* ポートCをEnableにする */
		LL_GPIO_DeInit(LED1_GPIO);

		/* テストピン(LED1)をセットアップする */
		pin_cfg.Pin		= LED1_PIN;
		pin_cfg.Mode		= LL_GPIO_MODE_OUTPUT;
		pin_cfg.Speed		= LL_GPIO_SPEED_FREQ_LOW;
		pin_cfg.OutputType	= LL_GPIO_OUTPUT_PUSHPULL;
		pin_cfg.Pull		= LL_GPIO_PULL_UP;
		LL_GPIO_Init(LED1_GPIO, &pin_cfg);
	}
#else
	/* Pin Mode configuration */
	LL_GPIO_SetPinMode( LED1_GPIO, LED1_PIN, LL_GPIO_MODE_OUTPUT );
	/* Pull-up Pull down resistor configuration*/
	LL_GPIO_SetPinPull( LED1_GPIO, LED1_PIN, LL_GPIO_PULL_UP );
	/* Speed mode configuration */
	LL_GPIO_SetPinSpeed( LED1_GPIO, LED1_PIN, LL_GPIO_SPEED_FREQ_LOW );
	/* Output mode configuration*/
	LL_GPIO_SetPinOutputType( LED1_GPIO, LED1_PIN, LL_GPIO_OUTPUT_PUSHPULL );
#endif

	/* OSリソース生成 */
	createOsResource();	//FreeRTOS用

	/* Start the scheduler */
	vTaskStartScheduler();	//FreeRTOS用

	while(1);
}

/**
 * @brief   System Clock Configuration
 *          The system Clock is configured as follow : 
 *             System Clock source            = PLL (HSE)
 *             SYSCLK(Hz)                     = 48000000
 *             HCLK(Hz)                       = 24000000
 *             AHB Prescaler                  = 2
 *             APB1 Prescaler                 = 1
 *             APB2 Prescaler                 = 1
 *             HSE Frequency(Hz)              = 8000000
 *             PLL_MUL                        = 6
 *             Flash Latency(WS)              = 1
 * @param   None
 * @retval  None
 */
void SystemClock_Config(void)
{
#if 1
//	LL_APB2_GRP1_EnableClock( LL_APB2_GRP1_PERIPH_GPIOD );
//	LL_RCC_EnableIT_HSERDY(); 
	LL_RCC_HSE_EnableCSS(); 
	/* Enable HSE oscillator */
//	LL_RCC_HSE_EnableBypass();
	LL_RCC_HSE_Enable();
	while( LL_RCC_HSE_IsReady() != 1 );
#endif
	/* Set FLASH latency */
	LL_FLASH_SetLatency( LL_FLASH_LATENCY_2 );

	/* Set PLLSRC & PLLMUL */
#if 1
	LL_RCC_PLL_ConfigDomain_SYS( LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_6 );
#else
	LL_RCC_PLL_ConfigDomain_SYS( LL_RCC_PLLSOURCE_HSI_DIV_2, LL_RCC_PLL_MUL_12 );
#endif
	LL_RCC_PLL_Enable();
	while( LL_RCC_PLL_IsReady() != 1 );

	/* Set AHB prescaler */
	LL_RCC_SetAHBPrescaler( LL_RCC_SYSCLK_DIV_2 );
	/* Select SYSCLK by PLLCLK */
	LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_PLL );
	while( LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL );

	/* Set APB1 & APB2 prescaler */
	LL_RCC_SetAPB1Prescaler( LL_RCC_APB1_DIV_1 );
	LL_RCC_SetAPB2Prescaler( LL_RCC_APB2_DIV_1 );

	/* Set SYSTICK to 10ms */
	SysTick_Config( 48000000 / 100 );

	/* Set CMSIS variable */
	SystemCoreClock = 48000000;
}

/**
  * @brief  TICKフック of FreeRTOS
  * @param  None
  * @retval None
  */
#define TICK_HOOKCNT  20		//= 200ms=20 * os tick=10ms
int16_t   iHookCnt = TICK_HOOKCNT;
void vApplicationTickHook( void )
{
	if(--iHookCnt <= 0){
		iHookCnt = TICK_HOOKCNT;
		/* テストピン(LED1)にトグル出力 */
		LL_GPIO_TogglePin(LED1_GPIO, LED1_PIN);
	}
}

/**
  * @brief  空タスク
  * @param  None
  * @retval None
  */
void XXXXTask( void * pvParameters )
{
	for( ;; );
}

/**
  * @brief  create FreeRTOS resorce.
  *         タスクやメッセージキューを生成する
  * @param  None
  * @retval None
  */
#define	XXXXTask_STACK_SIZE		configMINIMAL_STACK_SIZE
void createOsResource(void)
{
	static uint8_t ucParameterToPass;
	TaskHandle_t xHandle = NULL;

	// Create the task, storing the handle.
	xTaskCreate( XXXXTask, "TSKNAME", XXXXTask_STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
	configASSERT( xHandle );
}

FreeRTOSを盛り込むにあたり、startup_stm32f103xb.sの実装例も載せておきます。

        PUBWEAK SVC_Handler
	EXTERN  vPortSVCHandler		;☆追加
        SECTION .text:CODE:REORDER:NOROOT(1)
SVC_Handler
        B vPortSVCHandler		;☆変更

        PUBWEAK DebugMon_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
DebugMon_Handler
        B DebugMon_Handler

        PUBWEAK PendSV_Handler
	EXTERN  xPortPendSVHandler	;☆追加
        SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
        B xPortPendSVHandler		;☆変更

        PUBWEAK SysTick_Handler
	EXTERN  xPortSysTickHandler	;☆追加
        SECTION .text:CODE:REORDER:NOROOT(1)
SysTick_Handler
        B xPortSysTickHandler		;☆変更

IAR社のEWARM

[ブログ]
EWARMのバージョンが8.11.1になっていたので使用させてもらったところ、アイコンが新しくなっり64bitOS対応版がありました。

少し使用した感想ですが、ビルドオプションが増えてたので、STのサンプルプロジェクトをダウンロードしようとしたのですがエラーが出てできななった(現在2017/8/15はダウンロード可能)。
デバッグ時のレジスタ窓から各コントローラのレジスタ一覧が無くなってて機能ダウン。レジスタ定義を入手すれば表示されそうだけど手間なので、旧バージョンv7.50でデバッグした(笑)